Commit graph

266 commits

Author SHA1 Message Date
thomasmhr
68f1e30f06 Add Alt+Up/Down to reorder enabled models in scoped-models selector
- Add move() pure function for swapping adjacent items
- Handle Alt+Up/Down in handleInput to reorder enabled models
- Selection follows the moved item
- Update footer hint with new shortcut

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-13 01:10:20 +01:00
thomasmhr
15e18f61ab Refactor scoped-models-selector with pure functions for state
- Replace mutable items[].enabled with EnabledIds type (null | string[])
- Extract state operations as pure functions (toggle, enableAll, clearAll, move, getSortedIds)
- Simplify component to UI wiring only
- Prepare for Alt+Up/Down model reordering feature

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-13 01:10:20 +01:00
ninlds
ec2b7b5a00 Add fuzzy search to settings list 2026-01-12 18:10:33 +01:00
Mario Zechner
f8e5fe1ed0 Use globalThis for theme to share across module loaders
When running with tsx in dev mode, jiti loads extensions in a separate
module cache. This caused the theme to be undefined in jiti's copy of
theme.ts since initTheme() was only called on tsx's copy.

Using globalThis with Symbol.for() ensures all module instances share
the same theme, regardless of which loader created them.
2026-01-12 17:51:41 +01:00
Mario Zechner
a46c4aab4f Revert "Initialize theme with default value at module load time"
This reverts commit d18e44d378.
2026-01-12 17:29:56 +01:00
Mario Zechner
d18e44d378 Initialize theme with default value at module load time
Prevents undefined theme when extensions call ctx.ui.custom() in edge cases
where module resolution could cause the theme variable to be accessed before
initTheme() is called.
2026-01-12 17:27:59 +01:00
Mario Zechner
1367a76ee8 Change getAllTools() to return ToolInfo[] instead of string[]
Breaking change: pi.getAllTools() now returns Array<{ name, description }>
instead of string[]. Extensions needing just names can use .map(t => t.name).

Removes redundant getToolInfo() method added in original PR.

Fixes #647
2026-01-12 17:18:43 +01:00
Aliou Diallo
638fbc459b
feat(coding-agent): add page-up/down navigation to session selector (#662)
* feat(tui): add pageUp/pageDown key support and selectPageUp/selectPageDown actions

* feat(coding-agent): add page-up/down navigation to session selector
2026-01-12 17:01:46 +01:00
Mario Zechner
8f95a13e07 feat(coding-agent): add session naming via /name command and extension API
- Add SessionInfoEntry type for session metadata
- Add /name <name> command to set session display name
- Add pi.setSessionName() and pi.getSessionName() extension API
- Session selector shows name (in warning color) instead of first message when set
- Session name included in fuzzy search
- /session command displays name when set

closes #650
2026-01-12 16:56:39 +01:00
Aliou Diallo
4e6ae25505 fix(coding-agent): prevent session selector from closing immediately when current folder has no sessions
Remove auto-cancel in loadCurrentSessions() so users can press Tab to switch
to "all" scope. Add context-aware empty state messages.
2026-01-12 16:37:38 +01:00
Thomas Mustier
520e3b02f3 feat(coding-agent): tweak queued hint text 2026-01-12 16:36:46 +01:00
Mario Zechner
175a137d00 Fix missing spacer between assistant message and text editor
Initialize widgetContainer with default spacer during init() instead of
only when extension widgets change.

fixes #655
2026-01-12 14:26:22 +01:00
Mario Zechner
50cd054edb Rework /scoped-models command UX
- Renamed from /models to /scoped-models
- Changes are now session-only by default (Ctrl+S to persist to settings)
- Added search with fuzzy filtering
- Hotkeys: Enter toggle, Ctrl+A enable all, Ctrl+X clear all, Ctrl+P toggle provider
- Ctrl+C clears search (or exits if empty), Escape exits
- Enabled models shown at top of list
- No checkmarks when all models enabled (no scope)
- First toggle when unscoped clears all and selects that model
- Uses current session thinking level instead of settings default
- Reads from session state first (preserves session-only changes across /scoped-models invocations)

Builds on #626
2026-01-12 00:53:52 +01:00
Mario Zechner
c16e21331a Preserve tree selection when returning from summary selector or abort 2026-01-12 00:15:12 +01:00
Mario Zechner
a0311fd5b9 Return to summary selector when cancelling custom instructions editor 2026-01-12 00:12:36 +01:00
Armin Ronacher
62caf219a1 Hook up custom summarization on branch switch 2026-01-12 00:09:33 +01:00
Mario Zechner
9d49b4d4ed Merge branch 'tmp-2025-01-11' - resume scope toggle with async loading (#620) 2026-01-12 00:00:28 +01:00
Mario Zechner
302404684f feat(coding-agent): add resume scope toggle with async loading
- /resume and --resume now toggle between Current Folder and All sessions with Tab
- SessionManager.list() and listAll() are now async with optional progress callback
- Shows loading progress (e.g. Loading 5/42) while scanning sessions
- SessionInfo.cwd field shows session working directory in All view
- Lazy loading: All sessions only loaded when user presses Tab

closes #619

Co-authored-by: Thomas Mustier <mustierthomas@gmail.com>
2026-01-12 00:00:03 +01:00
Mario Zechner
df3f5f41c0 Rename /branch command to /fork
- RPC: branch -> fork, get_branch_messages -> get_fork_messages
- SDK: branch() -> fork(), getBranchMessages() -> getForkMessages()
- AgentSession: branch() -> fork(), getUserMessagesForBranching() -> getUserMessagesForForking()
- Extension events: session_before_branch -> session_before_fork, session_branch -> session_fork
- Settings: doubleEscapeAction 'branch' -> 'fork'

fixes #641
2026-01-11 23:12:31 +01:00
Thomas Mustier
e8d91f2bd4 feat(coding-agent): add resume scope toggle
refactor(coding-agent): refine session listing helpers
2026-01-11 20:51:20 +00:00
Carlos Gutierrez
49acd8e648 Add /models command for enabling/disabling Ctrl+P model cycling
- New /models command with toggle UI for each available model
- Changes persist to enabledModels in settings.json
- Updates take effect immediately for Ctrl+P cycling
2026-01-11 19:36:36 +01:00
Mario Zechner
5db7cc693b fix: Model selector fuzzy search matches id + provider
Restores original behavior from 3de8e075. Allows multi-token queries
like 'opus anthropic' to match Anthropic models.
2026-01-11 18:04:57 +01:00
Mario Zechner
3592f9b7c9 fix: Model selector fuzzy search matches provider + id
Allows queries like 'anthropic opus' to match Anthropic models.
Previously only matched against model ID, so 'anthropic' token failed.
2026-01-11 18:00:52 +01:00
Mario Zechner
9655907624 feat: Add skill slash commands and fuzzy matching for all commands
- Skills registered as /skill:name commands for quick access
- Toggle via /settings or skills.enableSkillCommands in settings.json
- Fuzzy matching for all slash command autocomplete (type /skbra for /skill:brave-search)
- Moved fuzzy module from coding-agent to tui package for reuse

Closes #630 by @Dwsy (reimplemented with fixes)
2026-01-11 17:56:11 +01:00
Nico Bailon
271b49da3c feat: add ctx.ui.setWorkingMessage() extension API
Allows extensions to customize the streaming loader message.
Pass undefined to restore default.
2026-01-10 21:11:44 -08:00
Mario Zechner
019ad0ec11 Fix /changelog adding 'What's New' to footer permanently
fixes #613
2026-01-11 02:23:04 +01:00
Mario Zechner
0d2731cf6b Remove built-in tool override warning, closes #615 2026-01-11 02:20:32 +01:00
Mario Zechner
2787638561 Remove built-in tool override warning, closes #615 2026-01-11 02:20:32 +01:00
Armin Ronacher
5cf0490383 Add support for /model autocomplete 2026-01-10 20:32:16 +01:00
Jian Zhang
7a8ea9020f fix(coding-agent): show '(ctrl+o to collapse)' hint for bash output when expanded 2026-01-10 18:50:54 +08:00
Mario Zechner
22b2a18952
Merge pull request #600 from nicobailon/feature/footer-data-provider
feat(coding-agent): add FooterDataProvider for git branch and extension statuses
2026-01-09 22:46:23 +01:00
Mario Zechner
e8eb4c254a feat: add search parameter and auto-select to /model command
- /model <search> pre-filters selector or auto-selects on exact match
- Support provider/model syntax for disambiguation (e.g., /model openai/gpt-4)
- Auto-select logic moved to InteractiveMode to avoid selector UI flicker

Closes #587
2026-01-09 22:39:26 +01:00
Mario Zechner
e2d14cdc23 Add spacing before aborted messages 2026-01-09 21:48:43 +01:00
Mario Zechner
62a423a218 Adjust widget spacing with empty state 2026-01-09 21:42:44 +01:00
Mario Zechner
b95cb7503e Add PR/issue widget metadata and spacing 2026-01-09 21:40:29 +01:00
Thomas Mustier
902d5d3d05
Add Alt+Up hotkey to restore queued messages (#604) 2026-01-09 20:31:51 +01:00
Nico Bailon
7b902612e9 feat(coding-agent): add FooterDataProvider for git branch and extension statuses
Expose data that extensions cannot otherwise access: git branch and
extension statuses from setStatus(). Token stats, model info, etc.
remain computable via ctx.sessionManager and ctx.model.
2026-01-09 07:39:30 -08:00
Mario Zechner
45a6c394ca Fix components not rebuilding content on theme change 2026-01-09 00:40:57 +01:00
Mario Zechner
37378fb346 Fix setTheme not triggering rerender, improve mac-system-theme example 2026-01-09 00:32:41 +01:00
Mario Zechner
2dfc13e455 chore: format 2026-01-08 23:41:58 +01:00
Mario Zechner
af2d8509e6 Fix --no-skills flag not preventing skills from loading
The --no-skills flag set options.skills = [] in main.ts, but the
interactive mode UI would rediscover skills anyway because it called
loadSkills() directly instead of using the already-loaded skills.

Changes:
- Add AgentSession.skills and AgentSession.skillWarnings properties
- discoverSkills() now returns { skills, warnings } instead of Skill[]
- Interactive mode uses session.skills instead of calling loadSkills()
- Update SDK docs and examples for new return type

Fixes #577
2026-01-08 23:41:54 +01:00
Mario Zechner
f9064c2f69 feat(tui): add overlay compositing for ctx.ui.custom() (#558)
Adds overlay rendering capability to the TUI, enabling floating modal
components that render on top of existing content without clearing the screen.

- Add showOverlay(), hideOverlay(), hasOverlay() methods to TUI
- Implement ANSI-aware line compositing via extractSegments()
- Support overlay stack (multiple overlays, later on top)
- Add { overlay: true } option to ctx.ui.custom()
- Add overlay-test.ts example extension

Also fixes pre-existing bug where bash tool output cached visual lines
at fixed terminal width, causing crashes on terminal resize.

Co-authored-by: Nico Bailon <nico.bailon@gmail.com>
2026-01-08 22:40:42 +01:00
Mario Zechner
121823c74d feat(coding-agent): add user_bash event and theme API extensions
- user_bash event for intercepting ! and !! commands (#528)
- Extensions can return { operations } or { result } to redirect/replace
- executeBashWithOperations() for custom BashOperations execution
- session.recordBashResult() for extensions handling bash themselves
- Theme API: getAllThemes(), getTheme(), setTheme() on ctx.ui
- mac-system-theme.ts example: sync with macOS dark/light mode
- Updated ssh.ts to use user_bash event
2026-01-08 21:50:56 +01:00
Mario Zechner
aa91864715 chore: add changelog for #571, init theme with watcher in interactive mode 2026-01-08 20:10:39 +01:00
Mario Zechner
bbf0d92e8c feat(coding-agent): use built-in renderers for tool overrides without custom renderers
When overriding a built-in tool (read, bash, edit, write, grep, find, ls)
without providing renderCall/renderResult, the built-in renderer is now
used automatically. This allows wrapping built-in tools for logging or
access control without reimplementing the UI (syntax highlighting, diffs, etc.).
2026-01-08 18:52:33 +01:00
Mario Zechner
7a2c19cdf0
Merge pull request #568 from tmustier/gemini-raw-stream
fix: restore ESC interrupt after auto-retry and correct retry abort messaging
2026-01-08 18:50:47 +01:00
ferologics
9073111cb0 fix(coding-agent): show release URL for bun binary updates
For bun binary installs, show 'Download from: <releases URL>' instead of 'npm install -g' since npm doesn't apply to standalone binaries.
2026-01-08 14:50:50 +01:00
Thomas Mustier
01f15fcbd2 fix: show retry attempt count when aborting during retry
When aborting a retry attempt, surface the retry-aware abort message
in the assistant output and tool results instead of a generic "Aborted".

- Set errorMessage for aborted streaming messages
- Render abort message without forcing a leading newline when no content
2026-01-08 12:36:46 +00:00
Thomas Mustier
a65da1c14b fix: ESC key not interrupting during Working... state
Three related fixes:

1. google-gemini-cli: Handle abort signal in stream reading loop
   - Add abort event listener to cancel reader immediately when signal fires
   - Fix AbortError detection in retry catch block (fetch throws AbortError,
     not our custom message)
   - Swallow reader.cancel() rejection to avoid unhandled promise

2. agent-session: Fix retry attempt counter showing 0 on cancel
   - abortRetry() was resetting _retryAttempt before the catch block could
     read it for the error message

3. interactive-mode: Restore main escape handler on agent_start
   - When auto-retry starts, onEscape is replaced with retry-specific handler
   - auto_retry_end (which restores it) fires on turn_end, after streaming begins
   - Now restore immediately on agent_start if retry handler is still active

Amended: suppress reader.cancel() rejection on abort.
2026-01-08 12:35:34 +00:00
Kao Félix
6845c4b85e
feat(coding-agent): make ctx.shutdown() available for extensions (#542) 2026-01-08 03:30:48 +01:00