marked.parse runs on all messages each render. With long conversations
this makes typing sluggish. useMemo caches rendered HTML per message,
only recomputing when messages or cwd change.
Also deferred textarea resize to requestAnimationFrame.
- Add shell-block class with white bg, border, proper border-radius
- Fix info message bubble width and margin for acme theme
- Parse shell output correctly: first $ line is command, rest is output
- Style shell output with proper padding and text color
- Replace card layout with compact tree nodes
- Nest sub-agents by __ separator with collapsible chevrons
- Display cwd as dim badge in chat header
- Remove PromptBar auto-focus that interfered with rename
The greedy regex matched from the first { to the last } in the
entire message, swallowing output (especially diffs containing
braces) into the collapsed args section.
Split on first newline instead—the call is always a single line
(squashWhitespace in the backend ensures this). Also use trimEnd
instead of trim to preserve leading whitespace in output.
- Show full session IDs everywhere
- Double-click to rename sessions (sidebar + chat header)
- Parse :: info messages, render italic/faint
- Collapsible tool calls with disclosure triangle
- Pretty-print all tool JSON, show tool name/language detail
- Separate tool output from args
- Fix tool parsing for multi-line content with trailing output
- Fix vite proxy: /s -> /s/ to avoid intercepting /src/ requests
- Fix state detection: match 'thinking'/'calling' instead of 'running'
- Fetch chat as plain text instead of JSON
- Add kill button on session cards
- Make stop button more visible
- Parse and pretty-print tool call (-> ) lines
- Style tool calls with arrow, function name, and formatted JSON body
Dark teal theme, polling-based session management, markdown
rendering for assistant messages. Sidebar shows /s/ tree;
chat header shows /s/{id}/chat path. New session modal fetches
available backends from the httpgw.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>