- Add Copilot Usage section to right sidebar Activity Panel
- Display Premium Requests, Chat, and Completions quotas with color-coded progress bars
- Colors: Green (>40% remaining), Yellow (5-40%), Red (≤5%)
- Auto-refresh every 60 seconds when provider is GitHub Copilot
- Fetch immediately on session start (not after 60 seconds)
- Refresh after task completion (debounced to 2 seconds)
- Add usage refresh manager singleton for lifecycle management
- Update /usage command to use same color system
- Fix: Use COPILOT_DISPLAY_NAME for provider comparisons
- Fix: Resume link shows actual session ID instead of 'unknown'
Files added:
- src/constants/quota-colors.ts - Color thresholds and status helpers
- src/services/copilot/usage-refresh-manager.ts - Auto-refresh manager
- src/tui-solid/components/panels/copilot-usage.tsx - UI components
Files modified:
- src/services/chat-tui/usage.ts - Add colored progress bars
- src/tui-solid/app.tsx - Lifecycle hooks, fix resume link
- src/tui-solid/components/panels/activity-panel.tsx - Integrate usage section
- src/tui-solid/context/app.tsx - Add usage state and fetch logic
Add prominent CODETYPER logo using ASCII box-drawing characters at the
top of the exit summary for enhanced branding. This provides a polished,
professional appearance when exiting the CLI.
Key improvements:
- Add ASCII logo to session summary output
- Simplify exit flow to use global message storage in terminal.ts
- Remove duplicate exit message handling from ExitProvider
- Fix signal handlers to prevent duplicate exit messages
- Clean up debug logging from app.tsx
- Ensure exit message persists on terminal after process exit
The exit summary now displays comprehensive session statistics with:
- CODETYPER ASCII logo
- Total usage and Premium requests
- API time and total session time
- Code changes breakdown (+additions/-deletions)
- Per-model token usage
- Resume command with session ID
Works correctly on all exit paths (normal exit, SIGINT, SIGTERM, errors).
Add prominent CODETYPER logo using ASCII box-drawing characters at the
top of the exit summary for enhanced branding. This provides a polished,
professional appearance when exiting the CLI.
Key improvements:
- Add ASCII logo to session summary output
- Simplify exit flow to use global message storage in terminal.ts
- Remove duplicate exit message handling from ExitProvider
- Fix signal handlers to prevent duplicate exit messages
- Clean up debug logging from app.tsx
- Ensure exit message persists on terminal after process exit
The exit summary now displays comprehensive session statistics with:
- CODETYPER ASCII logo
- Total usage and Premium requests
- API time and total session time
- Code changes breakdown (+additions/-deletions)
- Per-model token usage
- Resume command with session ID
Works correctly on all exit paths (normal exit, SIGINT, SIGTERM, errors).
The exit message was appearing briefly then disappearing because:
1. The message wasn't pre-computed before exit
2. The timing of when the message was written wasn't synchronized
Changes (matching OpenCode's pattern):
- ExitProvider now has setExitMessage/getExitMessage functions
- ExitProvider.exit() is now async and awaits onExit callback
- Message is written AFTER renderer.destroy() and onExit, before process.exit()
- AppContent uses createEffect to set exit message reactively
- Message is pre-computed and ready when exit is called
This ensures the message is written synchronously after cleanup,
preventing it from being cleared by async operations or shell prompt.
The session summary wasn't appearing and 997;1n garbage was showing because:
1. The renderer was still running when we wrote the summary, overwriting it
2. The renderer continued sending DECRQM queries after exit
Changes:
- Move summary generation and display into ExitProvider
- Call renderer.destroy() BEFORE writing the summary
- ExitProvider now handles process.exit() after displaying summary
- Simplify tui() handleExit to just resolve the promise
- ExitProvider receives sessionId prop for summary generation
The session stats summary was being displayed momentarily then cleared.
This was caused by drainStdin() re-enabling raw mode AFTER we had already
exited the alternate screen and written the summary.
Changes:
- Remove drainStdin() from normal exit flow - it was interfering with terminal
- Drain pending DECRQM responses BEFORE exiting alternate screen, while still in raw mode
- Add newline after summary to ensure shell prompt appears correctly
- Keep drainStdin() available for signal handlers but don't use it in normal exit
When quitting the CLI, users now see a comprehensive session summary:
- Total API time spent and session duration
- Total code changes (+additions/-deletions)
- Per-model token usage breakdown (input/output/cached)
- Resume command with session ID
Implementation details:
- Extended SessionStats type with apiTimeSpent, apiCallStartTime, and modelUsage
- Added startApiCall(), stopApiCall(), and addTokensWithModel() tracking functions
- Created session-stats.ts utility with formatters and generateSessionSummary()
- Updated TUI exit handler to display formatted stats
- Added mouse tracking disable to drainStdin() for cleaner exit
- Added modifiedFiles to getState() for exit summary access
Wire up the activity_toggle keybind (Ctrl+O) to show/hide the activity
panel via new activityVisible store state. Fix terminal garbage text on
exit by draining stdin after renderer teardown to consume pending
DECRQM mode 997 responses before they echo in the shell.
- Add Pink Purple theme (hot pink/purple/magenta on dark plum background)
- Fix race condition where clearPastedImages() in input-area ran before
the async message handler could read the images, silently dropping them
- Allow @ file picker and / command menu to trigger at any cursor position,
not just when the input is empty
- Update CHANGELOG and README with new changes
Add cross-platform text clipboard operations (macOS, Linux, Windows)
with OSC 52 support for SSH/tmux environments. Wire up onMouseUp and
Ctrl+Y in the TUI to copy selected text to the system clipboard via
OpenTUI's renderer selection API.
- Render permission modal inline below log panel instead of floating CenteredModal overlay
- Hide input area when permission prompt is active
- Add dev:debug and dev:debug-brk scripts for Bun inspector debugging
- Add background color to header to prevent content bleeding through
- Add margin spacing between header and log panel
- Change permission modal border to top-only for cleaner inline appearance
The plan approval system now has enforcement at the tool execution level:
- After modifying more than 2 files, the agent MUST use plan_approval
- File-modifying tools (write, edit, delete, etc.) are blocked until
an approved plan exists
- Clear error message guides agent to create and submit a plan
This ensures agents can't bypass plan approval instructions.
The rollback system was failing because it looked for `file_path`
(snake_case) but the write/edit tools use `filePath` (camelCase).
Now checks both formats when extracting the file path for rollback tracking.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Adds plan approval workflow per GitHub issue #111:
- Register plan_approval tool in tools index
- Add plan approval handling in message handler
- Check for pending plans on each message
- Detect approval/rejection messages
- Handle plan approval flow
- Create plan approval modal TUI component
- Update system prompts to instruct agents to use plan_approval tool
- Balanced tier: Updated to require plan_approval for complex tasks
- Thorough tier: Updated with plan_approval workflow
Workflow:
1. Agent analyzes task complexity with plan_approval
2. Agent creates plan with steps, context, risks
3. Agent submits plan for user approval
4. User approves/rejects/provides feedback
5. Only after approval, agent proceeds with execution
Closes#111
Adds execution control system per GitHub issue #113:
- Ctrl+P: Toggle pause/resume during agent execution
- Ctrl+Z: Abort with rollback (undo file changes)
- Ctrl+Shift+S: Toggle step-by-step mode
- Enter: Advance one step when in step mode
New files:
- src/types/execution-control.ts: Type definitions
- src/services/execution-control.ts: Control implementation with rollback
- src/constants/execution-control.ts: Keyboard shortcuts and messages
Modified:
- agent-stream.ts: Integrated execution control into agent loop
- message-handler.ts: Added control functions and callbacks
- app.tsx: Added keyboard shortcut handlers
- help-content.ts: Added help topics for new shortcuts
Closes#113
- CHANGELOG.md: Add version sections for 0.2.x and 0.3.0, add known
issues and planned features linking to GitHub issues #111-#115
- CONTRIBUTING.md: Update prerequisites to Bun, fix file structure
to reflect tui-solid migration, update commands to use bun
- README.md: Add version badges, roadmap section with v0.4.0 plans,
known issues section, and recent changes summary
- Added a system prompt builder to create dynamic prompts based on different modes (ask, code review, composer, debug, implement, plan, refactor).
- Introduced prompt tiers (balanced, fast, thorough) to tailor responses based on user needs
- Integrated multiple AI providers (Anthropic, Copilot, Google, Ollama, OpenAI) for flexible backend support.
- Updated agent and multi-agent services to utilize the new prompt system.
- Fix space key not working in MCP add form by handling evt.name === "space"
- Add support for multi-character paste sequences via evt.sequence
- Add MCPServerDisplay type to types/tui.ts for UI display
- Add mcpServers reactive state to app store with setMcpServers,
addMcpServer, and updateMcpServerStatus actions
- Update session.tsx to use store's mcpServers instead of static props
- Update execute.tsx to update store when server is added/connected
- Remove duplicate MCPServer interfaces from app.tsx, session.tsx,
and mcp-select.tsx in favor of shared MCPServerDisplay type
Features:
- Add BRAIN_DISABLED feature flag to hide all Brain functionality
- When enabled, hides Brain banner, status indicator, menu, and commands
- Flag location: src/constants/brain.ts
Fixes:
- Fix Ollama 400 error by properly formatting tool_calls in messages
- Update OllamaMessage type to include tool_calls field
- Fix Brain menu keyboard not working (add missing modes to isMenuOpen)
UI Changes:
- Remove "^Tab toggle mode" hint from status bar
- Remove "ctrl+t to hide todos" hint from status bar
Files modified:
- src/constants/brain.ts (add BRAIN_DISABLED flag)
- src/types/ollama.ts (add tool_calls to OllamaMessage)
- src/providers/ollama/chat.ts (format tool_calls in messages)
- src/tui-solid/components/header.tsx (hide Brain UI when disabled)
- src/tui-solid/components/status-bar.tsx (remove hints)
- src/tui-solid/components/command-menu.tsx (filter brain command)
- src/tui-solid/components/input-area.tsx (fix isMenuOpen modes)
- src/tui-solid/routes/session.tsx (skip brain menu when disabled)
- src/services/brain.ts (early return when disabled)
- src/services/chat-tui/initialize.ts (skip brain init when disabled)