Features: conversation sidebar (Ctrl+L), message search with highlighting (Ctrl+K), scrollable history (PgUp/PgDn), keybinding system, thinking level cycling (Ctrl+T)
Gateway: token usage, model info, and thinking level events wired through chat gateway
Types: typed Socket.IO event maps in @mosaic/types/chat/events
Review fixes: wired initialModel/initialProvider through useSocket, added error handling on floating promises, added provider/modelId to ChatMessagePayload type
Complete TUI rewrite with componentized architecture:
- **Components**: TopBar (branded mosaic icon), BottomBar (git/token/model info), InputBar, MessageList, Sidebar, SearchBar
- **Hooks**: useSocket (typed Socket.IO), useConversations, useSearch, useViewport, useAppMode, useGitInfo
- **Features**: conversation sidebar (Ctrl+L), message search with highlighting (Ctrl+K), scrollable history (PgUp/PgDn), keybinding system, thinking level cycling (Ctrl+T)
- **Gateway**: token usage, model info, and thinking level events wired through chat gateway
- **Types**: typed Socket.IO event maps in @mosaic/types/chat/events
- **Review fixes**: wired initialModel/initialProvider through useSocket, added error handling on floating promises, added provider/modelId to ChatMessagePayload type
- Show '^0 v0 $0.000' instead of '—' when no token data yet
- Always show model slot ('awaiting model' as placeholder)
- Add minHeight={1} to prevent line collapse
- Show 'Mosaic Stack TUI' on left, gateway host on right
- Remove connection status from top bar (lives in footer)
- Remove model/conversation from top bar (lives in footer)
- ASCII art mosaic windmill: 4 colored tiles (blue, purple, teal, amber)
with pink center, matching the Mosaic Stack brand
- 3-line info block (Claude Code style):
Line 1: 'Mosaic Stack v0.0.0'
Line 2: model (context) · thinking · agent name
Line 3: ● host connection status
- Remove bordered box in favor of open layout with icon
- Use half-block chars (▐█ █▌) for outer tiles to reduce width
- Center pink tile fits snugly between the four corners
- Matches the mosaic windmill proportions from the web UI
Brand colors (blue, purple, teal, amber, pink) plus complementary
fills (indigo, sky, rose, green) arranged in a gradient flow:
blue indigo purple
sky pink rose
amber green teal
Add flexGrow={1} to the text column so it fills the full terminal
width. This ensures Ink clears the entire line when content changes
(e.g. 'awaiting model' → 'llama3.2 (8k)'), preventing leftover
characters from previous renders.
- Pass initialModel/initialProvider from CLI flags into useSocket hook
- Include provider/modelId in socket message emit (restores PR #144 functionality)
- Add provider/modelId optional fields to ChatMessagePayload type
- Add .catch() to floating promises in createConversation/deleteConversation
Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Complete TUI rewrite with componentized architecture:
- Show '^0 v0 $0.000' instead of '—' when no token data yet - Always show model slot ('awaiting model' as placeholder) - Add minHeight={1} to prevent line collapseAdd flexGrow={1} to the text column so it fills the full terminal width. This ensures Ink clears the entire line when content changes (e.g. 'awaiting model' → 'llama3.2 (8k)'), preventing leftover characters from previous renders.