- Replace scrollIntoView with scrollTop=scrollHeight (fixes scroll jumping up
on WS updates due to content-visibility: auto miscalculating positions)
- Watch messages array reference instead of .length to catch intermediate
updates (tool calls resolving, content appended to existing messages)
- Add TransitionGroup for message list (outer) and assistant bubble content
(inner) with non-scoped CSS to ensure classes reach child components
- Override content-visibility during transitions to prevent skipped frames
- Replace permission mode text badge with Unicode symbols matching Claude Code
CLI: ⏵⏵ acceptEdits, ⏸ plan, ⚡ bypass, ⊘ dontAsk
- Remove lifecycle ribbon and agent status icon from bottom bar
- Use x-file-size header for knownByteSize instead of TextEncoder
- Only show hookHistory/lifecycleEvent when viewing the agent's current
live session, preventing notification leaking to historical sessions
- Reset notifications on SessionStart (like hookHistory already does)
- Remove mock/demo animation mode from SessionLifecycleStatus
- Delete dead useHooksApproval composable (never imported)
- Android voice assistant: RecognitionService, VoiceInteractionSession with startAssistantActivity, es-HN speech recognition
- Voice transcript sent to first alive terminal via WebSocket, opens FloatingTranscriptDebug on correct session
- PiP window: fix close button using getCurrentWebviewWindow(), add mini/restore toggle, remove alwaysOnTop
- Add webview-close and window-destroy permissions to capabilities
- Pixel art ocean scrollbar on /transcript-debug respecting scroll nav mode settings
- Widget improvements: terminal list service, input widget provider, updated layouts
Active terminal FAB shows a rotating conic-gradient border animation
(cyan/indigo) on all three locations: main FAB (T1), AgentBadge, and
mini FABs (T2-T5). Inactive FABs appear in grayscale with reduced
brightness, brightening slightly on hover.
Server now checks that transcript .jsonl files exist before creating
terminals, preventing dead sessions from --resume errors. Frontend
shows error banner in modal when resume fails. Fixed race condition
where init() would overwrite FAB terminal selection after page refresh
by guarding with pendingSwitchTarget flag.
Add refreshAgentState() to session-state store that fetches fresh state
(hookHistory, status, etc.) via GET /session-state/{agent} from the
terminal server. Called in switchToTerminal() to ensure the UI shows
accurate hook counts when changing between terminals.
- Add hooks/notify.ps1 as single hook handler for all events
- Refactor settings.local.json to use notify.ps1 instead of inline PS
- Add Notification hook, auto-detect agent from session_id/transcript
- Rename agent 'main' to 'claude' across server routes and terminal
- Add loading overlay and error state for terminal switching transitions
- Add transitionError ref to useTranscriptDebug composable
Server persists hookHistory[] per agent (cap 500, resets on SessionStart),
synced realtime via session-state-patch. Frontend computes event counts
by macro type and renders color-coded badges at the ribbon start.
Mock mode also accumulates badges during demo sequence.
- New SessionLifecycleStatus.vue: shows current hook lifecycle event
with color-coded dot, event name, and detail text. Auto-detects
mock vs real mode (falls back to demo cycle when no real data).
- Wrap lifecycle + UserInput + status-bar in .bottom-overlay container
to eliminate fragile hardcoded pixel offsets in FloatingTranscriptDebug.
- Remove old agent-status-indicator square dot from status bar.
- Add lastHookEvent/lastHookDetail to client AgentSessionState type.
- Simplify idle-mode CSS: single .bottom-overlay rule replaces three
separate show/hide rules for user-input, status-bar, lifecycle-ribbon.
- Add POST /create-terminal endpoint with MAX_TERMINALS=5 limit
- Server creates PTY, runs command, registers and broadcasts atomically
- Frontend startTerminal() calls server first, connects in reconnect mode
- Remove registerTerminalOnServer() — server handles registration
- Separate broadcast-only WS clients from PTY clients (no phantom "main" PTY)
- All broadcast functions use broadcastToAll() helper
- Fix resume existing flow to create terminal with --resume flag
- Remove auto-creation of terminal sessions from init/selectSession/switchAgent
- Clients only connect to existing alive terminals from server registry
- Remove localStorage persistence (agent/sessionId) — state derived from server
- Refine session-state types: new AgentStatus values, LastError interface
- UI improvements: AgentBadge, ChatContainer, UserInput, BashCard updates
- Simplify claude-hook routes, update session-state service
- Add "+" FAB in TerminalFabStack with create-session emit
- Expose handleCreateSession from FloatingTranscriptDebug
- Remove !showTranscriptDebug condition so FABs stay visible when panel is open
- Wire handleFabCreateSession in App.vue to open panel + show modal
- Add SessionStateManager (server/services/session-state.ts) as source
of truth for agent status, tools, approvals, and notifications
- Integrate into terminal server with state patches broadcast via WS
- Add /add-approval and /resolve-approval endpoints so approval
lifecycle is tracked centrally and broadcast to all clients
- Add permissionMode field to AgentSessionState
- Frontend store (session-state.ts) + WS service (session-state-ws.ts)
consume snapshots and patches from terminal server (4103)
- Rewrite useGlobalApproval to derive pending approvals from
centralized state — resolving on one client now clears all others
- Migrate useTranscriptDebug: processing, hookMeta, serverRegistry
now derived from session state store; remove 5s registry polling
- hooks-approval.ts notifies terminal server on add/resolve
Adds a Nav selector in settings to choose between pixel art scrollbar,
aquatic arrow buttons, or no scroll navigation. Jump % slider only
shows in buttons mode. Persisted in localStorage.
- NewSessionModal with tabs: new session (agent + optional initial prompt)
and resume existing (filterable by agent)
- Status bar: +new, Esc, Ctrl+M, terminal buttons; close with confirm
- sendRaw on EphemeralTerminal for raw control characters
- createNewSession accepts optional initialPrompt, auto-sent on ready
- Add TurnEndDivider component with pixel art ocean reef divider
- Parser merges stop_hook_summary + turn_duration into single turn_end
- Prismarine-inspired mosaic floor with SVG pattern and crystal highlights
- Animated duration badge with underwater glow effect
- Move transcript FAB to bottom-right, add elevated multi-layer shadow
- Add occasional bubble particles rising from FAB button
- Prevent long-touch selection on FAB (contextmenu + touch-callout)
- FAB stays fixed on mobile when terminal sheet opens
Remove FloatingTerminal (#1), AgentBar/FloatBubble (#2), and all related
components, composables, types, handlers, routes, and CSS. Clean up orphaned
references in ToolsDropdown, whisperSocket, and claude-hook comments.
Transcript-debug is now the sole chat/agent system.
Deleted: 15 files (~3500 lines)
Edited: 12 files (-717 lines net)
- Ctrl+1 through Ctrl+5 switch to open terminals by index
- Opens floating window automatically if closed
- AgentBadge shows active terminal state dot and index (2/3)
- Dropdown items display shortcut numbers for discoverability
Rely on dvh units for dynamic viewport sizing instead of manual
visualViewport keyboard detection. Removes jank-prone resize listener
and simplifies mobile sheet positioning.
Add titlebar button to collapse all conversation sections except the
last user message. Special user messages (interrupted, meta/continue)
are treated as section children rather than section leaders.
Replace fragile chunked WebM recording with stop/restart approach:
- Each segment is a complete, independently-decodable WebM file
- Eliminates audio corruption from concatenating partial WebM clusters
- Streaming partial transcription via periodic stop/restart every 3s
- Transcript text accumulated per segment on the client
- Proper lifecycle: onstop sends segment and restarts recorder
Replace one-shot HTTP POST sendPrompt with a persistent ephemeral
terminal per session. Terminal auto-starts on session select, stays
running in background when modal is closed, and gets killed on
session switch or page unload.
- Add sendInput() to useEphemeralTerminal (text + Enter as separate WS messages)
- useTranscriptDebug owns terminal lifecycle (create/dispose on select/switch)
- ResumeTerminalButton receives shared terminal prop, only toggles modal
- UserInput shows "Starting terminal..." when not ready
- Add "New Session" button that starts a fresh agent session
- beforeunload sends sendBeacon to kill terminal on page close
- Add ResumeTerminalButton component with floating terminal modal
(drag, resize, glass morphism, TerminalNavButtons bar)
- Add useEphemeralTerminal composable for temporary PTY sessions
that auto-run `<agent> --resume <sessionId>` and cleanup on close
- Add /kill-session POST endpoint to terminal server for ephemeral
session cleanup
- Integrate button in ChatContainer header (ID row) and status bar
- Pass selectedAgent to ChatContainer from TranscriptDebugPage
- Extract agent badge into AgentBadge component with dropdown (TODO placeholder)
- Realtime connection indicated by badge color (green=connected, indigo=disconnected)
- Remove Transcript label and chat bubble icon from titlebar
- Add force mobile mode button (bottom sheet panel on desktop)
- Size toggle persisted in localStorage and controls sheet height in mobile mode
- Replace full titlebar drag with thin 5px top edge grip
- Remove sheet-handle touch bar, size controlled via toggle button only
- Large mobile mode respects app header height
- Slide-up/down animation for mobile panel enter/exit
Add aquaticBackground/ module with OceanScene (unified gradient, light rays,
sea floor, corals, seaweed, decorations), plus independent overlay layers
(BubbleStream, FishSchool, JellyfishDrift, EventOverlay, EdgeFade). Includes
event scheduling engine with 4 frequency tiers (minutes/hours/days/months)
and 20 random events with localStorage persistence.
Add shared CodeBlock component with copy-to-clipboard button, terminal-matched
monospace font (Consolas), and proper line-height/letter-spacing. Refactor
EditCard, WriteCard, TaskCard, and ToolResultBlock to use CodeBlock. Fix
markdown code block alignment to match terminal rendering.
- Add pin/medium/large size mode button in titlebar with pixel art icons
- Dark overlay appears on hover for better text readability
- User-input stays visible when textarea has text (CSS :has selector)
- Animated size transitions between modes
- FAB button: night ocean pixel art with stars, moon, waves, seaweed, coral
- Send button: daytime ocean pixel art with sun, clouds, fish, sand
- Scrollbar hides with chrome using scrollbar-gutter: stable to prevent content shift
- Extract ocean pixel art into dedicated BackgroundPixelArt.vue with 5 animated layers
- Make titlebar, chat-header, and user-input position absolute overlays
- Add idle mode: chrome fades out on mouse leave, messages fill entire window
- Add fade-to-black edges on background for page blend
Replace galaxy background with animated underwater scene featuring water
depth gradient, pixel art sea floor (sand, seaweed, coral, starfish),
rising bubbles with water sway, and swimming pixel art fish. Also update
transcript-debug tool cards styling and add .claude-*/tasks/ to gitignore.
Floating chat window reusing ChatContainer with draggable/resizable
window, agent/session selector overlay, and pixel art decorations
(galaxy, minecraft dirt block, LED strip) on black transparent backdrop.
- Redesign all tool cards (Edit, Read, Bash, Grep, Glob, Write) to be
compact single-line headers with inline key info and toggle buttons
- Make cards and bubbles fully transparent with subtle color tints
- Remove borders, use only left accent bar per card type
- Color-code numbers: red for removals, green for additions/counts
- Simplify ToolResultBlock to render content directly without toggle
- Group consecutive assistant messages, showing header only on first
- Remove borders from assistant and user message bubbles
- Add PermissionRequest and Stop approval hooks to local Claude config
- Unify PermissionApproval into multi-mode card (permission, plan, question)
- Support allowAlways, deny-with-reason, and AskUserQuestion answering
- Add cross-process broadcast fallback (HTTP to sync server)
- Fix approval scripts to default to .claude/debug/ for local agent
Components are now .vue files in user-components/<folder>/ parsed at runtime.
Replaces 6 DB MCP tools with 2 (list_fs_components, load_fs_component).
Adds vue-parser, fs-components API, and file watcher for live reload.