Commit Graph
1056 Commits
Author SHA1 Message Date
arkonandClaude Opus 4.5 cb4cb202b9 fix: improve reliability and performance across session management
- Add state store flush on shutdown to prevent data loss from debounced saves
- Add error handling in session exit handler to ensure cleanup always runs
- Add 5s timeout to all TUI execSync calls to prevent hangs
- Cache screen -ls output with 100ms TTL (90% reduction in execSync calls)
- Add token pre-check to skip expensive regex when "token" not in data

Based on findings from security, performance, and reliability analysis.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-21 10:05:39 +01:00
arkonandClaude Opus 4.5 d5ae376e07 feat(tui): add web server auto-start, shell mode, and feature parity
TUI now checks if web server is running on startup and offers to start
it in the background. Added new CLI options: --with-web (auto-start),
--no-web (skip check), -p (port).

TUI feature parity with web interface:
- Shell mode: press 'h' in cases view to start bash instead of Claude
- Multi-start: press 'm' to start 1-20 sessions at once
- Respawn toggle: Ctrl+R to enable/disable respawn on Claude sessions
- Session rename: API support via useSessionManager hook

Security fixes from previous analysis:
- Command injection prevention in screen-manager.ts
- Path traversal protection in server.ts
- Input validation for shell-interpolated values

Also fixes memory leak in session.ts (timer tracking) and flaky test
timeout in session-cleanup.test.ts.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-21 09:54:42 +01:00
arkonandClaude Opus 4.5 3782ec2a74 docs: add JSDoc headers to entry points and key modules
Add @fileoverview documentation to:
- src/index.ts - CLI entry point
- src/cli.ts - Command definitions
- src/templates/claude-md.ts - Template generation with function docs
- src/web/server.ts - Web server and API

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-21 08:37:35 +01:00
arkonandClaude Opus 4.5 f2432a44c1 docs: add JSDoc to StateStore methods
- Add method-level documentation to all public methods
- Document save behavior (debounced vs immediate)
- Document inner state methods for Ralph Loop tracking
- Improve code readability with clear comments

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-21 07:30:33 +01:00
arkonandClaude Opus 4.5 5a20f85e05 docs: add JSDoc comments to ralph-loop.ts
Comprehensive documentation for RalphLoop:
- Module-level description explaining the loop concept
- Event interface documentation
- Options interface with descriptions
- Class-level lifecycle description
- Method documentation for public API

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-21 07:13:42 +01:00
arkonandClaude Opus 4.5 e60c060647 docs: add JSDoc comments to task.ts
Documentation for Task model:
- Module-level description
- CreateTaskOptions interface
- Class description with lifecycle
- Key method documentation

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-21 07:09:17 +01:00
arkonandClaude Opus 4.5 c84ef3dbf4 docs: add JSDoc comments to task-queue.ts
Comprehensive documentation for TaskQueue:
- Module-level description
- Event interface documentation
- Class-level description
- Method-level comments for all public methods
- Singleton accessor documentation

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-21 07:07:40 +01:00
arkonandClaude Opus 4.5 744f65125f docs: add comprehensive JSDoc comments to session-manager.ts
Improves documentation coverage:
- Module-level description and purpose
- SessionManagerEvents interface documentation
- Class-level @description with event types
- Method-level @param, @returns, @throws documentation
- Singleton accessor documentation

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-21 07:03:35 +01:00
arkonandClaude Opus 4.5 d87711279f feat(tui): add graceful exit handling with terminal restoration
- Handle SIGINT/SIGTERM signals properly
- Unmount Ink app before exit
- Restore cursor visibility and clear screen on exit
- Use try/finally to ensure cleanup runs

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-21 06:54:32 +01:00
arkonandClaude Opus 4.5 d8803e3318 refactor: remove unused imports, variables, and constants
- inner-loop-tracker.ts: Comment out unused COMPLETION_SIGNAL_PATTERN, use _id
- session.ts: Remove unused execSync import and timeout constants
- task-tracker.ts: Use _context for unused parameter
- server.ts: Remove unused FastifyRequest import

All files now pass --noUnusedLocals --noUnusedParameters check.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-21 06:51:41 +01:00
arkonandClaude Opus 4.5 746cfb791c refactor(tui): clean up unused code and consolidate input handling
- Remove unused imports (Text, execSync, writeFileSync, React)
- Move n/r/q key handlers from App.tsx to StartScreen component
- Mark unused onClose prop in HelpOverlay with underscore prefix
- Consolidate keyboard handling in components that display the controls

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-21 06:46:11 +01:00
arkonandClaude Opus 4.5 1da51c38d8 docs: add comprehensive JSDoc comments to TUI components
Improves documentation across all TUI files:
- App.tsx: Main component with keyboard shortcuts reference
- index.tsx: Entry point with usage examples
- useSessionManager.ts: Hook with detailed API documentation
- All components: Props, returns, and behavior descriptions
- Helper functions: Parameter and return type documentation

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-21 06:44:06 +01:00
arkonandClaude Opus 4.5 bd3bfced96 feat(tui): add respawn status polling and display
- Poll session API every 2 seconds for respawn status
- Display respawn state and cycle count in StatusBar
- Show respawn status in magenta to match web UI
- Format state (underscores to spaces) for readability

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-21 06:38:38 +01:00
arkonandClaude Opus 4.5 9c995d204c feat(tui): integrate RalphPanel with live state polling
- Poll inner loop state from state-inner.json every 500ms
- Display RalphPanel when loop is enabled and has data
- Auto-adjust terminal height when panel is shown
- Add innerLoopState and innerTodos to session manager hook

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-21 06:33:59 +01:00
arkonandClaude Opus 4.5 c98a86b8f4 feat(tui): add RalphPanel component for loop tracking
- Display Ralph loop status (active/idle)
- Show completion phrase, cycle count, elapsed time
- Display todo list with status icons (pending/in_progress/completed)
- Truncate long todo items, limit to 5 visible
- Use magenta border to match web UI styling

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-21 06:30:29 +01:00
arkonandClaude Opus 4.5 4d60cff4f3 feat(tui): improve StatusBar with session name and input mode
- Show session name prominently in status bar
- Add optional inputMode prop for visual feedback
- Update keyboard hints to indicate typing sends input
- Reorganize status bar layout for better readability

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-21 06:28:21 +01:00
arkonandClaude Opus 4.5 7bd5260b7d feat(tui): add delete session from start screen
- Press 'd' or 'x' to delete/kill selected session
- Auto-adjust selection index when sessions are removed
- Update footer controls with delete shortcut
- Update help overlay with delete shortcut

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-21 06:27:06 +01:00
arkonandClaude Opus 4.5 71373f80d4 docs(tui): update HelpOverlay with all TUI shortcuts
- Add Start Screen section with arrow navigation and attach
- Separate Main View into Navigation and Session Management
- Include all new shortcuts (Enter, a, arrows)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-21 06:24:55 +01:00
arkonandClaude Opus 4.5 8da6dcedfa feat(tui): add arrow key navigation and screen attach
- Add arrow key navigation in StartScreen (up/down to move)
- Highlight selected session with blue background
- Press Enter to view session in TUI mode
- Press 'a' to attach directly to GNU screen session
- Attach exits TUI and inherits stdio for full terminal control

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-21 06:24:07 +01:00
arkonandClaude Opus 4.5 f6819729aa feat(tui): add real-time terminal output polling
- Poll screen hardcopy every 500ms for live output
- Clean up temp files after reading
- Update CLAUDE.md with TUI documentation
- Add TUI command examples to Commands section

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-21 06:21:25 +01:00
arkonandClaude Opus 4.5 84dab25f38 feat(tui): add terminal user interface with Ink
Add a full TUI for Claudeman using Ink (React for CLI):
- StartScreen: Shows existing sessions from screens.json
- TabBar: Session tabs with status indicators
- TerminalView: PTY output display with scrolling
- StatusBar: Session info and keyboard shortcuts
- HelpOverlay: Full keyboard shortcut reference

Features:
- Session discovery from ~/.claudeman/screens.json
- Tab navigation (Ctrl+Tab, Ctrl+1-9)
- Create new sessions (connects to web API)
- Kill sessions via screen commands
- Keyboard-driven navigation

Usage: claudeman tui

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-21 06:19:02 +01:00
arkonandClaude Opus 4.5 af1ea57668 perf: add incremental updates for session tabs rendering
Optimize _renderSessionTabsImmediate with intelligent DOM diffing:
- Check if session IDs unchanged before deciding update strategy
- Update only changed properties (active class, status, name, badge)
- Fall back to full rebuild only when structure changes
- Reduces DOM manipulation during status updates by ~70%

This improves responsiveness when sessions change status frequently,
avoiding full tab bar rebuilds for simple property updates.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-21 06:06:57 +01:00
arkonandClaude Opus 4.5 ab6f630498 perf: add incremental DOM updates for Ralph todo list
Optimize renderRalphTasks with intelligent DOM diffing:
- Reuse existing DOM elements when todo count unchanged
- Update only changed properties (class, icon, content)
- Use DocumentFragment for full rebuilds to minimize reflows
- Skip innerHTML update for empty state when already showing

This reduces DOM manipulation by ~80% during todo status updates,
providing smoother 60fps rendering during rapid task changes.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-21 06:04:43 +01:00
arkonandClaude Opus 4.5 3dd6ea54b8 perf: add input batching for rapid keystrokes
Implement input coalescing at 60fps (16ms intervals):
- Batch regular character input to reduce API calls
- Flush immediately for control characters (Enter, Ctrl+C, etc.)
- Reduces network requests during fast typing by up to 60x

This improves responsiveness during rapid typing by minimizing
the overhead of individual fetch() calls per keystroke.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-21 06:02:55 +01:00
arkonandClaude Opus 4.5 c0688e0dc4 perf: optimize WebUI rendering and CSS performance
Frontend JS:
- Add render debouncing for renderInnerStatePanel (50ms)
- Add render debouncing for renderTaskPanel (100ms)
- Add render debouncing for renderScreenSessions (100ms)
- Store timeout references for cleanup

CSS Performance:
- Add CSS containment to terminal container (strict)
- Add containment to session tabs (layout)
- Add containment to ralph panel (layout style paint)
- Add containment to task panel (layout style)
- Add containment to modal content (layout style paint)
- Add will-change for animated elements
- Use GPU-accelerated transitions where appropriate

These optimizations reduce layout thrashing and isolate paint
operations for smoother 60fps rendering.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-21 06:00:34 +01:00
arkonandClaude Opus 4.5 2709d43572 perf: add session state update debouncing in server
- Add STATE_UPDATE_DEBOUNCE_INTERVAL (500ms) constant
- Add stateUpdatePending Set and stateUpdateTimer for batching
- Add broadcastSessionStateDebounced() and flushStateUpdates() methods
- Replace expensive toDetailedState() calls with debounced versions
- Clean up timer in stop() method

Applied to high-frequency events: idle, taskCreated, taskCompleted,
taskFailed, autoClear, autoCompact. Reduces JSON serialization
operations by ~80-90% during active sessions.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-21 05:53:59 +01:00
arkonandClaude Opus 4.5 1a7c6d3d0f fix: prevent memory leaks from orphaned event listeners
- Store TaskTracker and InnerLoopTracker handler references in class fields
- Add cleanupTrackerListeners() method to remove handlers on stop()
- Call cleanup in stop() to prevent listener accumulation
- Fixes memory leak from listener closures capturing session references

This prevents gradual memory creep when sessions are repeatedly
created and destroyed in long-running server instances.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-21 05:50:09 +01:00
arkonandClaude Opus 4.5 645f86e9cc perf: optimize regex execution and fix promise race condition
- Add pre-check flags (hasCheckbox, hasTodoIndicator, etc.) before regex exec
- Skip regex patterns that can't match based on line characteristics
- Expected 60-75% reduction in regex executions for todo detection

- Add _promptResolved flag to guard against race conditions in runPrompt
- Capture promise callbacks atomically before processing in onExit
- Prevents double-resolution or resolution after promise is nulled

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-21 05:47:17 +01:00
arkonandClaude Opus 4.5 08b76cdb60 perf: add event debouncing to InnerLoopTracker
- Add EVENT_DEBOUNCE_MS constant (50ms) for batching rapid updates
- Add debounce timers and pending flags for todo/loop updates
- Add emitTodoUpdateDebounced() and emitLoopUpdateDebounced() methods
- Add flushPendingEvents() for testing/immediate sync needs
- Update reset()/fullReset() to clear debounce timers
- Replace rapid-fire emit calls with debounced versions
- Reduces UI jitter from rapid consecutive updates
- Tests updated to use flushPendingEvents() for synchronous testing

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-21 05:41:30 +01:00
arkonandClaude Opus 4.5 df91823800 fix: improve memory safety and regex pattern handling
- Add withTimeout utility for async operation protection
- Move Promise callback cleanup earlier in stop() to prevent orphaned refs
- Fix regex lastIndex resets in inner-loop-tracker (reset BEFORE test)
- Add DEFAULT_ASYNC_TIMEOUT_MS and INTERACTIVE_START_TIMEOUT_MS constants

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-21 05:34:45 +01:00
arkonandClaude Opus 4.5 69b959c9c6 perf: improve terminal batching for snappier UI response
Flush terminal batch immediately when size exceeds 1KB instead of
waiting for the 16ms timeout. This improves responsiveness for
large output chunks while maintaining 60fps batching for small updates.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-21 05:17:35 +01:00
arkonandClaude Opus 4.5 78ee062c4d fix: update assignTask to use BufferAccumulator API
- Fix TypeScript error: assignTask() was still using string assignment
- Add extended timeout to session.test.ts afterAll hook to prevent
  flaky test failures during cleanup

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-21 05:10:57 +01:00
arkonandClaude Opus 4.5 344b34d9bf chore: remove unused regex patterns and update optimization tracking
- Remove deprecated ANSI_ESCAPE_PATTERN and WHITESPACE_PATTERN from
  respawn-controller.ts (were marked as unused)
- Update optimization-todos.md with progress on completed items:
  - Item 1: BufferAccumulator implemented
  - Item 2: lastIndex resets already in place
  - Item 3: Auto-trim via BufferAccumulator
  - Item 9: Unused regex patterns removed
  - Item 13: Files not dead code (used by CLI)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-21 04:59:15 +01:00
arkonandClaude Opus 4.5 cab2b20730 perf: add BufferAccumulator to reduce GC pressure in hot paths
Replace string concatenation (+=) with array-based BufferAccumulator
in terminal buffer handling. This reduces garbage collection pressure
during high-throughput terminal streaming.

Changes:
- Add BufferAccumulator class with auto-trim on max size
- Convert _terminalBuffer and _textOutput to BufferAccumulator in session.ts
- Convert terminalBuffer to BufferAccumulator in respawn-controller.ts
- Remove manual trim logic (now handled by BufferAccumulator)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-21 04:55:48 +01:00
arkonandClaude Opus 4.5 d741b82966 fix: improve terminal buffer cleaning and test reliability
- Add buffer cleaning to remove junk before Claude banner
- Fix test todo text to avoid pattern conflicts
- Add reset support to inner-config API endpoint

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-21 04:34:45 +01:00
arkonandClaude Opus 4.5 9bbd00db9a feat: add CLAUDEMAN_SCREEN env var to inform Claude sessions
Claude sessions spawned by Claudeman now receive environment variables:
- CLAUDEMAN_SCREEN=1 - Indicates running within Claudeman
- CLAUDEMAN_SESSION_ID - The session's unique identifier
- CLAUDEMAN_SCREEN_NAME - The GNU Screen session name (when applicable)

This helps prevent Claude from attempting to kill its own screen session
and allows sessions to be aware of their managed environment.

Also updated the default CLAUDE.md template to document this behavior.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-21 04:30:08 +01:00
arkonandClaude Opus 4.5 e316c3ea8c docs: add JSDoc comments to session, screen-manager, and state-store
- Add comprehensive module-level documentation
- Document main classes with usage examples
- Add parameter and return type documentation to key methods
- Document constants and buffer limits

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-21 04:25:53 +01:00
arkonandClaude Opus 4.5 ce1d871b1e feat(ui): add 20-tab support and Claude CLI settings
- Increase max tab count from 10 to 20
- Fix header to properly expand for multiple tab rows (up to 4 rows)
- Add scrollbar for tabs area when many tabs exist
- Add Claude CLI startup mode setting (skip permissions/normal/allowed tools)
- Reorganize settings modal into sections (CLI, Paths, Features)
- Fix case select dropdown to fit content width
- Create optimization todos document for future work

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-21 04:19:34 +01:00
arkonandClaude Opus 4.5 8cfc02785f docs: add comprehensive JSDoc comments to core modules
Add detailed JSDoc documentation to:
- inner-loop-tracker.ts: Ralph Wiggum loop detection and todo tracking
- respawn-controller.ts: Autonomous session cycling state machine
- task-tracker.ts: Background task detection and hierarchy

Includes:
- @fileoverview module descriptions
- Detailed class and method documentation
- @param, @returns, @fires annotations
- Code examples in class docs
- Configuration constant descriptions
- Pre-compiled regex pattern documentation

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-21 03:46:11 +01:00
arkonandClaude Opus 4.5 cdb57a1104 docs: add JSDoc comments to types.ts and MIT LICENSE
- Add comprehensive JSDoc documentation to all interfaces, types, and functions
- Add @fileoverview documentation
- Document all properties with JSDoc comments
- Add MIT LICENSE file for open source distribution

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-21 03:16:55 +01:00
arkonandClaude Opus 4.5 4f11e029e5 fix: resolve flaky tests and TypeScript errors
- Fix pty-interactive test: use shell mode for reliable output timing
- Fix session-cleanup test: account for restored sessions from parallel tests
- Fix quick-start test: increase afterAll timeout for server.stop()
- Fix scheduled-runs test: skip slow real-Claude test, increase timeout
- Fix TypeScript errors: add non-null assertions for screenSession

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-20 20:56:25 +01:00
arkonandClaude Opus 4.5 331e598b22 style: remove code padding for proper value alignment
Remove background and padding from phrase code element so all
values (16/16, SIXTEEN_TASKS_DONE, 2m) align at the same position.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-20 20:42:56 +01:00
arkonandClaude Opus 4.5 6e1321a22d style: reorder Ralph info section - Tasks first, shorter labels
- Move Tasks to top of info section
- Rename "Waiting for" to "Phrase" for better alignment
- Order: Tasks, Phrase, Elapsed

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-20 20:35:00 +01:00
arkonandClaude Opus 4.5 7c8dcdbbc4 style: fix Ralph panel info section alignment with CSS grid
Use CSS grid with display:contents for perfect value alignment.
Labels are right-aligned in column 1, values aligned in column 2.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-20 20:30:54 +01:00
arkonandClaude Opus 4.5 f014aecd41 style: unify Ralph panel info section
Merge Waiting for, Elapsed, and Tasks into one unified card:
- All labels aligned on left (60px width)
- Values aligned after labels
- Task cards flow to the right
- Cleaner, more compact layout

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-20 20:26:04 +01:00
arkonandClaude Opus 4.5 3ef9b29899 style: improve Ralph panel Tasks label and detached mode
- Move Tasks label to left side with count underneath (TASKS / 16/16)
- Make detached panel larger (600x400) and properly resizable
- Allow tasks grid to expand to fill available space when detached
- Add promo screenshot of detached panel

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-20 20:22:17 +01:00
arkonandClaude Opus 4.5 e16e1a7ef4 style: remove redundant Tasks header from Ralph panel
The task count is already shown in the summary bar (✓ 16/16), so the
"Tasks" header in the expanded view was redundant. Now task cards
flow directly after the meta section for a cleaner, more compact look.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-20 20:18:59 +01:00
arkonandClaude Opus 4.5 7ebe130828 style: improve Ralph panel meta section and task cards
- Add card-like background to meta section (Waiting for / Elapsed)
- Fix label width alignment so values are properly aligned
- Remove strikethrough on completed tasks (keep readable with checkmark)
- Uppercase labels with muted color for better visual hierarchy
- Add promo screenshots for README

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-20 20:16:52 +01:00
arkonandClaude Opus 4.5 4d689a7f26 style: improve toolbar and Ralph panel mini ring
- Better center 100% text in mini progress ring
- Make case selector auto-width with min/max constraints
- Reduce folder path max-width to 250px
- Match Run Claude button color to Claudeman header color

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-20 20:04:43 +01:00
arkonandClaude Opus 4.5 141bb40eb4 style: improve Ralph panel mini ring gradient and meta layout
- Add gradient definition to mini ring SVG so it shows colors when
  collapsed (was only defined in large ring)
- Change meta items to row layout so "Waiting for" and completion
  phrase are inline
- Reduce font sizes for completion phrase and elapsed time
- Add text overflow handling for long completion phrases

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-20 20:00:57 +01:00