3 Commits (main)

Author SHA1 Message Date
I Luk Kim 577b4d749b feat: fix one-press send, add Codex parsed view
Send button:
- submitText() sends text without trailing "\n", then a discrete Enter
  key event after 100ms. cmux delivers send_text as a bracketed paste,
  so a trailing newline became a literal newline in the Claude/Codex
  input box instead of submitting — this required a second (empty)
  press to actually send. Now one press = the full type-then-Enter
  sequence. Fixes Codex always needing two presses and Claude 4+ line
  messages not sending / rendering mid-state.
- data-text shortcut keys now type then send Enter separately
- mousedown.preventDefault keeps soft keyboard up so first tap submits
- Remove IME composition Enter handler (textarea Enter = newline now)

Codex view:
- New codex-parser.js / codex-renderer.js for OpenAI Codex CLI surfaces
- /api/codex-surfaces endpoint; generalize surface-ref lookup into
  _getSurfaceRefsForProcess() (claude + codex)
- app.js updateCodexMode(), terminal.setCodexMode(), codex-mode body
  class (mutually exclusive with claude-mode)

Claude mode:
- Auto-load scrollback when content fits the viewport
- Trim claude-keyboard.js scaffolding; parser/renderer/CSS tweaks

Bump virtual-keyboard.js?v=9 cache-bust.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
3 months ago
I Luk Kim efb0be7896 feat: Claude mode UI improvements and stability enhancements
Claude mode view:
- Context-aware action row replaces all-keys row in Claude mode
  (mode pill, stop button, arrows; selection→option buttons; thinking→pulsing stop)
- Thinking block detection and pulse animation
- Response/text blocks preserve ANSI colors via ansiToHtml()
- Tool-use body collapsible for long outputs (>5 lines)
- Context usage progress bar in status bar (green/yellow/red)
- Mode pill group shows all 3 modes with active highlight + pop animation
- Selection options show focused state and keyboard shortcut hint
- Prompt turn boundaries with visual spacing

Stability:
- WebSocket heartbeat (app-level ping/pong, 15s timeout)
- WS max payload 1MB limit
- Auth rate-limit map periodic cleanup
- Socket connection timeout (10s)
- Terminal line buffer cap (10,000 lines)
- Password masking in console output

UX:
- Scrollback loading indicator
- Code/diff/tool-result copy buttons
- Collapsible tool results (>8 lines)
- Modifier key box-shadow transition

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
5 months ago
I Luk Kim 5b9780fafb feat: Claude mode UI, status indicators, IME fix, tunnel support
- Add Claude Code parsed view with block-based rendering (prompt, tool-use,
  tool-result, code, diff, table, selection options, status bar)
- Add session status dots in sidebar and top bar (idle=yellow, working=green
  with pulse animation) parsed from terminal title characters
- Differentiate active input prompt vs previous submitted prompts with
  distinct background colors
- Fix Korean IME composition issue (last character on next line on Enter)
- Fix CSP inline script violation by moving to external sw-unregister.js
- Add per-block DOM diffing to prevent layout shifts on re-render
- Strip box-drawing borders from tool-result blocks for stable layout
- Add ngrok tunnel support, replace qrcode with qrcode-terminal
- Add Claude-specific keyboard action bar with mode toggle and shortcuts

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
5 months ago