Commit graph

566 commits

Author SHA1 Message Date
Mario Zechner
b5be54b8ef fix(coding-agent): persist user message after fork
When hasAssistant guard returns early, set flushed=false so
the next persist (after assistant arrives) writes all entries
including the user message.
2026-02-04 13:35:45 +01:00
Mario Zechner
13ac63c3cd fix(coding-agent): fork writes to new session file, not parent (fixes #1242)
- Store previousSessionFile before creating branched session
- Update sessionFile after writing new branch file
- Pass parentSession when forking from first message
- Add --local to git config in tests to prevent repo escape
2026-02-04 13:22:43 +01:00
Mario Zechner
1fe73ad423 Revert "fix(coding-agent): handle npm on Windows with shell fallback fixes #1220"
This reverts commit 895b85636a.
2026-02-04 02:22:37 +01:00
Mario Zechner
895b85636a fix(coding-agent): handle npm on Windows with shell fallback fixes #1220 2026-02-04 02:21:06 +01:00
badlogic
ffb647cece fix(coding-agent): use shell execution for spawn on Windows
fixes #1220
2026-02-04 02:15:22 +01:00
Mario Zechner
e1e4e593c0 fix(coding-agent): persist thinking level defaults 2026-02-03 17:17:38 +01:00
Mario Zechner
8a7a761deb fix(coding-agent): resolve npm.cmd on Windows
closes #1220
2026-02-03 17:04:22 +01:00
Mario Zechner
2f5235b966 fix(coding-agent): support local install paths relative to settings files closes #1216 2026-02-03 12:58:34 +01:00
Mario Zechner
e54dff7efb fix(coding-agent): rename SlashCommandSource "template" to "prompt" for consistency
BREAKING CHANGE: RPC get_commands response and SlashCommandSource type
now use "prompt" instead of "template" to match the rest of the codebase.
2026-02-03 12:27:45 +01:00
warren
2613754c47 feat(coding-agent): add ExtensionAPI.getCommands() 2026-02-03 12:18:52 +01:00
Mario Zechner
7a9c668357
Merge pull request #1196 from haoqixu/fix-commands-conflict
fix(coding-agent): filter out commands conflict with builtins
2026-02-03 01:22:29 +01:00
Mario Zechner
6909f61884
Merge pull request #1199 from academo/academo/implement-set-expand-tool-api
feat: add setToolsExpanded and getToolsExpanded to ExtensionsUIContext
2026-02-03 01:16:04 +01:00
Mario Zechner
c9a20a3aa4 fix(coding-agent): normalize @ path prefixes closes #1206 2026-02-02 23:56:20 +01:00
Esteban Beltran
ca62c44775
feat: add setToolsExpanded and getToolsExpanded to ExtensionsUIContext 2026-02-02 19:25:00 +01:00
haoqixu
29e2997f41 fix(coding-agent): filter out commands conflict with builtins 2026-02-03 01:23:49 +08:00
Michael Renner
f7c03ef6a2
fix(coding-agent): handle scoped models after logout (#1194) 2026-02-02 18:05:15 +01:00
Juan Ibiapina
d0228412d6
feat(coding-agent): add switchSession to Extension API (#1191)
Allows extension commands to programmatically switch to a different session file via ctx.switchSession(sessionPath).

fixes #1187
2026-02-02 18:03:26 +01:00
Mario Zechner
0925fafe3b fix(tui): reduce unnecessary full redraws for better performance
- Remove height change detection (only width changes trigger full redraw)
- Change clearOnShrink default to false (use PI_CLEAR_ON_SHRINK=1 to enable)
- Fix viewport check to use previousLines.length instead of maxLinesRendered
  (prevents false positive redraws when appending lines after content shrunk)
- Add clearOnShrink setting to /settings in coding-agent
- Remove line truncation in custom message component (always show full content)
2026-02-02 08:10:08 +01:00
Mario Zechner
5d6a7d6c34 Better skill dir resolution, closes #1171 2026-02-02 00:33:51 +01:00
Mario Zechner
0a26db53ef fix(coding-agent): align ToolDefinition.execute signature with AgentTool
BREAKING CHANGE: ToolDefinition.execute parameter order changed from
(id, params, onUpdate, ctx, signal) to (id, params, signal, onUpdate, ctx).

This aligns with AgentTool.execute so wrapping built-in tools no longer
requires parameter reordering. Update extensions by swapping signal and
onUpdate parameters.
2026-02-02 00:29:47 +01:00
Mario Zechner
86b43c8eac feat(coding-agent): add bash spawn hook 2026-02-01 23:17:51 +01:00
Aliou Diallo
bc3fda518d fix(coding-agent): only update extension in scope it's in
update(source) unconditionally called updateSourceForScope for both
user and project scopes, creating a local install even when the source
was only registered globally. Unify into a single code path that
iterates settings per scope, filtering by identity when a source is
provided.
2026-02-01 22:43:11 +01:00
G
a8a0f4b9fb feat(coding-agent): type ToolCallEvent.input per tool
Matches ToolResultEvent pattern with typed inputs via discriminated union.

- Export *ToolInput types from tool schemas
- Add *ToolCallEvent interfaces for each built-in tool
- Add isToolCallEventType() guard with overloads for built-ins

Direct narrowing (event.toolName === "bash") doesn't work due to
CustomToolCallEvent.toolName: string overlapping with literals.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-01 19:13:52 +01:00
Mario Zechner
73839f876e feat(coding-agent): add named-only filter toggle to /resume picker (#1128)
Adds Ctrl+N toggle to filter sessions by named-only vs all in the /resume picker.

- Add NameFilter type and filtering logic to session-selector-search.ts
- Add toggleSessionNamedFilter app keybinding (default: ctrl+n)
- Show Name: All/Named state in header
- Empty state mentions toggle keybinding as escape hatch
- Export hasSessionName() to avoid duplication

Co-authored-by: warren <warren.winter@gmail.com>
2026-02-01 19:03:38 +01:00
Mario Zechner
3c687b427e fix(skills): add path resolution guidance to skills preamble
Models were resolving relative paths in skill files from cwd instead of
the skill directory. Added explicit instruction that relative paths are
resolved from the skill directory (parent of the location path).

Fixes #1136
2026-02-01 18:06:13 +01:00
Mario Zechner
c8b8f043a7 fix(coding-agent): make models.json model fields optional with defaults
Model definitions now only require 'id'. All other fields have sensible
defaults for local models (Ollama, LM Studio, etc.):
- name: defaults to id
- reasoning: defaults to false
- input: defaults to ["text"]
- cost: defaults to {input: 0, output: 0, cacheRead: 0, cacheWrite: 0}
- contextWindow: defaults to 128000
- maxTokens: defaults to 16384

Existing configs that specify all fields continue to work unchanged.

Fixes #1146
2026-02-01 17:49:19 +01:00
Mario Zechner
bd00d2fbca fix(coding-agent): pi update not updating packages without args
fixes #1151
2026-02-01 17:41:36 +01:00
Mario Zechner
3b8d0a8921 feat(coding-agent): add resources_discover hook 2026-02-01 02:20:35 +01:00
4h9fbZ
993c45a059 feat(coding-agent): add Qwen CLI OAuth provider 2026-02-01 01:51:55 +01:00
Mario Zechner
6e4508f129 feat(coding-agent): threaded sort mode and compact format for /resume (#1124)
Adds 'Threaded' as a new sort mode (now default) that displays sessions
in a tree structure based on parent-child relationships. Compact one-line
format with message count and age right-aligned for clean title alignment.

Closes #1108
2026-02-01 01:10:58 +01:00
Mario Zechner
030a61d88c feat: add maxDelayMs setting to cap server-requested retry delays
When a provider (e.g., Google Gemini CLI) requests a retry delay longer
than maxDelayMs (default: 60s), the request fails immediately with an
informative error instead of waiting silently for hours.

The error is then handled by agent-level auto-retry, which shows the
delay to the user and allows aborting with Escape.

- Add maxRetryDelayMs to StreamOptions (packages/ai)
- Add maxRetryDelayMs to AgentOptions (packages/agent)
- Add retry.maxDelayMs to settings (packages/coding-agent)
- Update _isRetryableError to match 'retry delay' errors

fixes #1123
2026-02-01 00:50:41 +01:00
Mario Zechner
7eae0a7d30 fix(coding-agent): make setThinkingLevel idempotent
switchSession() was appending spurious thinking_level_change entries
to session log on resume because setThinkingLevel() unconditionally
persisted. Now only persists if the level actually changes.

fixes #1118
2026-02-01 00:14:49 +01:00
Petr Baudis
42d54e0d1c feat(coding-agent): add threaded sort mode to /resume with tree display
Adds 'Threaded' as a new sort mode (now default) that displays sessions
in a tree structure based on parent-child relationships. The tree is
sorted by root session's modified date. Other sort modes (Recent, Fuzzy)
continue to show flat lists.

Sort mode cycles: Threaded -> Recent -> Fuzzy -> Threaded
2026-01-31 23:17:05 +01:00
Juan Ibiapina
6f2d066342 feat(coding-agent): add keybinding actions for /tree, /fork, and /new
Add newSession, tree, and fork as configurable keybinding actions.
All unbound by default. Users can configure in keybindings.json.

Closes #1088
2026-01-31 23:09:22 +01:00
Mario Zechner
ed80ab2129 fix(coding-agent): multi-file extensions in packages now discovered correctly
Package resolution now uses the same discovery logic as local extensions:
only index.ts (or manifest-declared entries) are loaded from subdirectories,
not helper modules.

fixes #1102
2026-01-31 01:07:33 +01:00
Mario Zechner
99281e5913 feat(coding-agent): add ctx.getSystemPrompt() to extension context
Adds a method to access the effective system prompt (after any per-turn
extension modifications) from the extension context.

Implementation:
- Add systemPrompt getter to AgentSession reading from agent.state.systemPrompt
- Wire getSystemPrompt through ExtensionContextActions to ExtensionRunner
- Add getSystemPrompt to interactive-mode's shortcut context
- Update docs with ctx.getSystemPrompt() section
- Add system-prompt-header.ts example
- Add example to docs reference table

Closes #1098
2026-01-30 17:44:25 +01:00
Ben Vargas
e045a9f142
feat(ai): add Vercel AI Gateway routing support (#1051)
* feat(ai): add Vercel AI Gateway routing support

Add vercelGatewayRouting to OpenAICompletionsCompat, parallel to
openRouterRouting. When a model targets ai-gateway.vercel.sh and has
vercelGatewayRouting configured, the openai-completions provider passes
providerOptions.gateway with only/order in the request body.

Changes:
- types.ts: VercelGatewayRouting interface + field on OpenAICompletionsCompat
- openai-completions.ts: buildParams passes providerOptions.gateway,
  detectCompat/getCompat include the new field
- model-registry.ts: VercelGatewayRoutingSchema for models.json validation
- test: updated Required<OpenAICompletionsCompat> in test fixture

* docs(coding-agent): add vercelGatewayRouting to custom models documentation
2026-01-30 01:44:51 +01:00
Daniel Nouri
e20583aac8
feat(coding-agent): add set_session_name RPC command (#1075)
- Add set_session_name command with empty name validation
- Expose sessionName in get_state response
- Add setSessionName() to AgentSession and RpcClient
- Document in docs/rpc.md
2026-01-30 01:41:58 +01:00
Mario Zechner
cb08758696 feat(coding-agent): add "none" option to doubleEscapeAction setting
Allows disabling double-escape behavior entirely for users who
accidentally trigger the tree/fork selector.

Fixes #973
2026-01-30 01:20:14 +01:00
Mario Zechner
098f396cf3 fix(coding-agent): respect .gitignore/.ignore/.fdignore when scanning package resources
fixes #1072
2026-01-30 01:02:56 +01:00
Mario Zechner
4edb506df8 fix(coding-agent): handle macOS filenames with curly quotes and NFD Unicode
Fixes #1078

- Add tryNFDVariant() to normalize paths to NFD form
- Add tryCurlyQuoteVariant() to convert straight quotes to curly quotes
- Try combined NFD + curly quote variant for French macOS screenshots
- Add comprehensive tests for path-utils
2026-01-29 22:58:22 +01:00
Mario Zechner
87ab5c5c3b feat(ai): add Kimi For Coding provider support
- Add kimi-coding provider using Anthropic Messages API
- API endpoint: https://api.kimi.com/coding/v1
- Environment variable: KIMI_API_KEY
- Models: kimi-k2-thinking (text), k2p5 (text + image)
- Add context overflow detection pattern for Kimi errors
- Add tests for all standard test suites
2026-01-29 04:12:28 +01:00
Mario Zechner
2ad4825653 fix: autocompleteMaxVisible setting not persisting
Missing markModified() call caused the setting to be lost on reload.
2026-01-29 03:20:28 +01:00
Colin Mason
b212314f45 feat: add autocompleteMaxVisible setting for configurable dropdown height 2026-01-29 03:16:52 +01:00
Nico Bailon
bac57f81be
fix: preserve external settings.json edits on reload (#1046)
Co-authored-by: Mario Zechner <badlogicgames@gmail.com>
2026-01-29 02:42:23 +01:00
Mario Zechner
c808de605a feat(ai): add Hugging Face provider support
- Add huggingface to KnownProvider type
- Add HF_TOKEN env var mapping
- Process huggingface models from models.dev (14 models)
- Use openai-completions API with compat settings
- Add tests for all provider test suites
- Update documentation

fixes #994
2026-01-29 02:40:14 +01:00
Mario Zechner
4f004adefa fix(coding-agent): reset retry counter after each successful LLM response
Previously, within a single tool-use turn, rate limit retries would
accumulate across separate LLM calls. For example, if each of 3 tool
calls hit a 429 and retried once, the counter would show '3/3' and fail
even though each individual retry succeeded.

Now the counter resets immediately when a successful (non-error)
assistant message arrives, so each LLM call gets a fresh set of retries.

Fixes #1019
2026-01-29 01:12:29 +01:00
Mario Zechner
a373dce747 fix(coding-agent): improve thinking defaults in footer 2026-01-29 00:33:45 +01:00
Mario Zechner
5ef79459dc Closes #1041, incorrect .md file name in warning messages. 2026-01-29 00:16:50 +01:00
Mario Zechner
d21cbde87f fix(coding-agent): empty array in package filter now disables all resources
fixes #1044
2026-01-29 00:12:42 +01:00