# Tasks: TUI Improvements

**Branch:** `feat/p7-tui-improvements`
**Worktree:** `/home/jwoltje/src/mosaic-mono-v1-worktrees/tui-improvements`
**PRD:** [PRD-TUI_Improvements.md](./PRD-TUI_Improvements.md)

---

## Wave 1 — Status Bar & Polish ✅

| ID       | Task                                                                                                  | Status  | Notes   |
| -------- | ----------------------------------------------------------------------------------------------------- | ------- | ------- |
| TUI-001  | Component architecture — split `app.tsx` into `TopBar`, `BottomBar`, `MessageList`, `InputBar`, hooks | ✅ done | 79ff308 |
| TUI-002  | Top status bar — branded mosaic icon, version, model, connection indicator                            | ✅ done | 6c2b01e |
| TUI-003  | Bottom status bar — cwd, git branch, token usage, session ID, gateway status                          | ✅ done | e8d7ab8 |
| TUI-004  | Message formatting — timestamps, role colors (❯ you / ◆ assistant), word wrap                         | ✅ done | 79ff308 |
| TUI-005  | Quiet disconnect — single indicator, auto-reconnect, no error flood                                   | ✅ done | 79ff308 |
| TUI-006  | Tool call display — inline spinner + tool name during execution, ✓/✗ on completion                    | ✅ done | 79ff308 |
| TUI-007  | Thinking/reasoning display — dimmed 💭 block for `agent:thinking` events                              | ✅ done | 79ff308 |
| TUI-007b | Wire token usage, model info, thinking levels end-to-end (gateway → types → TUI)                      | ✅ done | a061a64 |
| TUI-007c | Ctrl+T to cycle thinking levels via `set:thinking` socket event                                       | ✅ done | a061a64 |

## Wave 2 — Layout & Navigation ✅

| ID      | Task                                                      | Status  | Notes   |
| ------- | --------------------------------------------------------- | ------- | ------- |
| TUI-010 | Scrollable message history — viewport with PgUp/PgDn      | ✅ done | 4d4ad38 |
| TUI-008 | Conversation sidebar — list, create, switch conversations | ✅ done | 9ef578c |
| TUI-009 | Keybinding system — Ctrl+L, Ctrl+N, Ctrl+K, Escape        | ✅ done | 9f38f5a |
| TUI-011 | Message search — find in current conversation             | ✅ done | 8627827 |

## Wave 3 — Advanced Features

| ID      | Task                    | Status      | Notes |
| ------- | ----------------------- | ----------- | ----- |
| TUI-012 | Project/mission views   | not-started |       |
| TUI-013 | Agent status monitoring | not-started |       |
| TUI-014 | Settings/config screen  | not-started |       |
| TUI-015 | Multiple agent sessions | not-started |       |

---

## Handoff Notes

### File Structure

```
packages/cli/src/tui/
├── app.tsx                          ← Shell composing all components + global keybindings
├── components/
│   ├── top-bar.tsx                  ← Mosaic icon + version + model + connection
│   ├── bottom-bar.tsx               ← Keybinding hints + 3-line footer: gateway, cwd, tokens
│   ├── message-list.tsx             ← Messages, tool calls, thinking, streaming, search highlights
│   ├── input-bar.tsx                ← Bordered prompt with context-aware placeholder
│   ├── sidebar.tsx                  ← Conversation list with keyboard navigation
│   └── search-bar.tsx               ← Message search input with match count + navigation
└── hooks/
    ├── use-socket.ts                ← Typed Socket.IO + switchConversation/clearMessages
    ├── use-git-info.ts              ← Reads cwd + git branch at startup
    ├── use-viewport.ts              ← Scrollable viewport with auto-follow + PgUp/PgDn
    ├── use-app-mode.ts              ← Panel focus state machine (chat/sidebar/search)
    ├── use-conversations.ts         ← REST client for conversation CRUD
    └── use-search.ts                ← Message search with match cycling
```

### Cross-Package Changes

- **`packages/types/src/chat/events.ts`** — Added `SessionUsagePayload`, `SessionInfoPayload`, `SetThinkingPayload`, `session:info` event, `set:thinking` event
- **`apps/gateway/src/chat/chat.gateway.ts`** — Emits `session:info` on session creation, includes `usage` in `agent:end`, handles `set:thinking`

### Key Design Decisions

#### Wave 1

- Footer is 3 lines: (1) gateway status right-aligned, (2) cwd+branch left / session right, (3) tokens left / provider+model+thinking right
- Mosaic icon uses brand colors in windmill cross pattern with `GAP` const to prevent prettier collapsing spaces
- `flexGrow={1}` on header text column prevents re-render artifacts
- Token/model data comes from gateway via `agent:end` payload and `session:info` events
- Thinking level cycling via Ctrl+T sends `set:thinking` to gateway, which validates and responds with `session:info`

#### Wave 2

- `useViewport` calculates scroll offset from terminal rows; auto-follow snaps to bottom on new messages
- `useAppMode` state machine manages focus: only the active panel handles keyboard input via `useInput({ isActive })`
- Sidebar fetches conversations via REST (`GET /api/conversations`), not socket events
- `switchConversation` in `useSocket` clears all local state (messages, streaming, tool calls)
- Search uses `useMemo` for reactive match computation; viewport auto-scrolls to current match
- Keybinding hints shown in bottom bar: `^L sidebar · ^N new · ^K search · ^T thinking · PgUp/Dn scroll`

### How to Run

```bash
cd /home/jwoltje/src/mosaic-mono-v1-worktrees/tui-improvements
pnpm --filter @mosaicstack/cli exec tsx src/cli.ts tui
# or after build:
node packages/cli/dist/cli.js tui --gateway http://localhost:14242
```

### Quality Gates

```bash
pnpm --filter @mosaicstack/cli typecheck && pnpm --filter @mosaicstack/cli lint
pnpm --filter @mosaicstack/gateway typecheck && pnpm --filter @mosaicstack/gateway lint
pnpm --filter @mosaicstack/types typecheck
```
