Commit Graph
1603 Commits
Author SHA1 Message Date
Mario Zechner ea90a6783d fix(coding-agent): disable undici body/headers idle timeouts on global dispatcher
Long local-LLM SSE streams (e.g. vLLM buffering large tool calls) exceeded
undici's default 300s bodyTimeout and aborted with UND_ERR_BODY_TIMEOUT.
retry.provider.timeoutMs cannot lift this cap because it controls the
provider SDK's AbortController deadline, not undici's per-socket idle timer.

Pass { bodyTimeout: 0, headersTimeout: 0 } to EnvHttpProxyAgent. Provider
SDKs still enforce their own timeouts via retry.provider.timeoutMs.

closes #3715
2026-04-27 20:42:37 +02:00
Mario Zechner aefb0fedfe feat(coding-agent): add warnings.anthropicExtraUsage opt-out
closes #3808
2026-04-27 20:36:00 +02:00
Mario Zechner e4f847ff68 fix(coding-agent): close bash executor temp streams
closes #3786
2026-04-27 20:36:00 +02:00
marcbloechandGitHub 9dcde1e3fa add cognitive services implementation (#3799) 2026-04-27 18:38:03 +02:00
mdsjipandGitHub 5b8deef2f9 fix(coding-agent,ai): fallback to /proc/self/environ in Bun sandbox (#3801)
Bun compiled binaries have an empty process.env when running inside
sandbox environments (e.g. nono on Linux/macOS). This broke API key
detection and model discovery because all process.env.* lookups returned
undefined.

- Add restoreSandboxEnv() helper that reads /proc/self/environ when Bun
  is detected and process.env is empty, populating process.env before
  any other code runs (coding-agent/src/bun/cli.ts entry point)
- Add getProcEnv() fallback in env-api-keys.ts for direct @mariozechner/pi-ai
  consumers that may not go through the coding-agent entry point
- Add unit tests for restoreSandboxEnv
2026-04-27 18:36:53 +02:00
mdsjipandGitHub cbe421f877 fix(coding-agent): work around Bun empty process.env inside sandbox (#3807)
Bun bug oven-sh/bun#27802 causes process.env to be empty when running inside a Linux sandbox (Landlock/seccomp).
This breaks npm resolution because PATH is missing, crashing pi on startup with:

  Failed to run npm root -g: Executable not found in $PATH: "npm"

Add getSandboxEnv() to read /proc/self/environ as a fallback on Linux when process.env has zero keys.
Pass this env to all spawn calls in package-manager.ts.
Also fix runCommandSync error handling: check result.error in addition to result.status, and include result.error?.message in the error text so spawn failures (e.g. ENOENT) produce useful diagnostics instead of "null".

Fixes #3806
2026-04-27 18:34:20 +02:00
Aliou DialloandGitHub 10425abb87 fix(coding-agent): dedupe symlinked resources (#3818)
* fix(coding-agent): dedupe symlinked resources

Fixes #3767

* refactor(coding-agent): extract canonicalizePath util for symlink resolution
2026-04-27 18:33:10 +02:00
Mario Zechner c19e64a444 fix(coding-agent): refresh title after extension session rename
closes #3686
2026-04-25 17:20:26 +02:00
Mario Zechner a363b668ac fix(coding-agent): clear tree navigation compaction state
closes #3688
2026-04-25 17:03:09 +02:00
Armin RonacherandGitHub dcf2651631 feat(coding-agent): Add built-in update command (#3680) 2026-04-25 13:09:33 +02:00
Mario Zechner 6580dae400 feat(coding-agent): allow hiding working loader
closes #3674
2026-04-24 23:17:43 +02:00
Aliou DialloandGitHub 39a9784d2a fix(coding-agent): preserve models when re-registering provider with overrides only (#3651)
Previously, registerProvider() overwrote the stored config for a provider,
so a models registration followed by a baseUrl/headers-only override lost
the models. After refresh(), only the override-only config was replayed,
causing extension-provided models to disappear.

Added upsertRegisteredProvider() that merges defined fields into the
existing stored config instead of replacing it. Fields absent from the
incoming config are preserved from the stored config.

Also adds regression tests for dynamic provider override persistence
across refresh.
2026-04-24 20:15:35 +02:00
Armin Ronacher 39db145495 fix(coding-agent): show models.json auth in login selector 2026-04-24 17:28:40 +02:00
Mario Zechner 7bd9f6500d fix(coding-agent): avoid cmd.exe for git installs on windows closes #3642 2026-04-24 13:56:10 +02:00
Mario Zechner c06750410a fix(ai,coding-agent): expose provider timeout/retry controls closes #3627 2026-04-24 13:33:00 +02:00
Mario Zechner 1e33492525 fix(coding-agent): harden clipboard copy
closes #3639
2026-04-24 12:55:58 +02:00
Mario Zechner f2f03616ab fix(coding-agent): update provider auth guidance and defaults 2026-04-24 00:55:27 +02:00
Mario Zechner bffb760f4f fix(coding-agent): improve auth setup warnings 2026-04-24 00:55:27 +02:00
Armin Ronacher 27c05b7faa feat(ui): Lower /scoped-models height to same as /models 2026-04-24 00:53:11 +02:00
Armin Ronacher d4d3c2fd39 feat(login): More consistent styling 2026-04-24 00:30:31 +02:00
Armin Ronacher 40edf7ee06 fix: /model cancellation 2026-04-24 00:16:10 +02:00
Mario Zechner 6bb4a55524 fix(coding-agent): preserve final TUI frame on quit 2026-04-24 00:11:09 +02:00
Mario Zechner 86ba08a2e3 fix(coding-agent): preserve in-memory settings on reload
closes #3616
2026-04-23 23:47:49 +02:00
Mario Zechner 4cd4cfd98e fix(ai): support long cache retention compat
closes #3543
2026-04-23 23:43:34 +02:00
Mario Zechner 19f2478599 fix(coding-agent): show shortcut conflict diagnostics on startup
closes #3617
2026-04-23 23:31:52 +02:00
Mario Zechner ffa0f31239 fix(ai): support Anthropic eager tool streaming compat
closes #3575
2026-04-23 23:12:45 +02:00
Mario Zechner 8700ac1f0e fix(coding-agent): support custom npmCommand for git deps
closes #3604
2026-04-23 22:32:32 +02:00
Mario Zechner c091aa732f fix(coding-agent): space first user message after notices
closes #3613
2026-04-23 22:16:40 +02:00
Armin Ronacher 00cb947166 fix(ai): preserve env api key contract 2026-04-23 22:11:46 +02:00
Mario Zechner f0cf8a59d2 fix(coding-agent): handle stale extension contexts
fixes #3606
2026-04-23 22:07:13 +02:00
Armin Ronacher 0cb8ff3843 fix(ai): Restore original api contract for getEnvApiKey 2026-04-23 22:04:42 +02:00
Mario Zechner 2394f3a987 fix(coding-agent): retry Bedrock http2 no-response errors closes #3594 2026-04-23 21:36:51 +02:00
Mario Zechner 3fb2d11ce5 fix(coding-agent): honor no-tools in service sessions
fixes #3592
2026-04-23 21:36:16 +02:00
Mario Zechner e38647f376 fix(coding-agent): restore builtin-only tool disabling
closes #3592
2026-04-23 21:36:16 +02:00
Armin Ronacher e97051313d fix(coding-agent,ai): show env auth source in /login 2026-04-23 21:19:53 +02:00
Aliou DialloandGitHub 05e2e9d170 fix(coding-agent): strip trailing index.js|ts from extension labels in startup banner (#3596)
Strip `index.ts` and `index.js` from extension display paths in both
compact and expanded views of the startup banner. This makes the list more
readable by removing redundant filename noise.

Changes:
- Add `formatExtensionDisplayPath()` helper to centralize path formatting
- Update `getCompactExtensionLabels()` to strip index files from segments
- Update expanded view formatting to use the new helper
- Add comprehensive tests for both views

Fixes #3549
Fixes #3559
2026-04-23 21:03:26 +02:00
ff220fa41d fix(coding-agent): tear down extension UI before runner invalidation on shutdown (#3597)
Custom footers registered via ctx.ui.setFooter(...) whose render()
closure touched ctx would crash pi on /quit: runtimeHost.dispose()
invalidates the extension runner before the TUI stops rendering, so
any still-attached footer render tick hit assertActive() and threw.

Call resetExtensionUI() before runtimeHost.dispose() in the interactive
shutdown path, matching the rebindCurrentSession() pattern. This
disposes the custom footer (clearing its interval) and detaches it
from the TUI tree before the runner goes stale.

closes #3595

Co-authored-by: Mario Zechner <badlogicgames@gmail.com>
2026-04-23 21:02:15 +02:00
Mario Zechner 8cc046f86e fix(coding-agent): make terminal progress escape sequences configurable, disabled by default
Adds terminal.showTerminalProgress setting (default false) and wires it
to /settings. Guards all OSC 9;4 setProgress calls in interactive-mode.

closes #3588
2026-04-23 15:08:00 +02:00
Armin RonacherandGitHub 010e9acfe9 feat(coding-agent): add searchable auth provider login flow (#3572) 2026-04-23 13:42:09 +02:00
Julian LaNeveandGitHub de8c947556 fix(coding-agent): route remaining hardcoded pi branding through APP_NAME (#3583)
Swaps hardcoded "pi" / ".pi" / "π" for the existing APP_NAME and
CONFIG_DIR_NAME extension points at four sites the original APP_NAME
rollout missed:

- /quit slash-command description
- process.title (cli.ts and bun/cli.ts)
- project-local extensions dir in loader.ts

For the terminal title, adds an APP_TITLE export in config.ts that
keeps pi's "π" glyph when piConfig.name is unset and falls back to
APP_NAME otherwise. Presence of piConfig.name acts as the "has been
rebranded" signal, so pi's own package.json drops the redundant
"name": "pi" (the existing `|| "pi"` fallback in config.ts makes this
a no-op for APP_NAME).

No behavior change for pi itself: process.title, /quit description,
terminal title prefix, and project-local extensions dir all resolve
to the same values as before.

closes #3476
2026-04-23 12:27:00 +02:00
Mario Zechner f3a2c9d05e fix(coding-agent,mom): retry fs watchers on async errors closes #3564 2026-04-22 23:03:19 +02:00
Mario Zechner cc76e73c05 fix(coding-agent): persist custom working message across loader recreation
Replace transient pendingWorkingMessage with a persistent workingMessage
field on InteractiveMode, matching the workingIndicatorOptions pattern.
New loaders now use this.workingMessage || this.defaultWorkingMessage
instead of always falling back to the default.

Also add working-message-test.ts extension example.

closes #3566
2026-04-22 22:24:32 +02:00
Mario Zechner 3dacaa8ed9 fix(coding-agent,tui): drop typebox compiler shim and fix progress 2026-04-22 21:12:20 +02:00
35ff2689ee fix(typebox): migrate to v1 with extension compat (#3474)
* fix(typebox): migrate to v1 with extension compat

Replace AJV-based validation with TypeBox-native validation, keep legacy extension imports working (including @sinclair/typebox/compiler), and restore coercion for serialized/plain JSON schemas.

This change closes #3112.

* fix(typebox): use canonical imports and harden coercion

Switch first-party code to canonical typebox imports while retaining legacy extension aliases in the loader.

Remove obsolete runtime codegen guards, expand serialized JSON-schema coercion coverage, and update related tests and fixtures.

Fixes #3112.

---------

Co-authored-by: Mario Zechner <badlogicgames@gmail.com>
2026-04-22 19:59:33 +02:00
Mario Zechner 8234ebf9ee feat(coding-agent,tui): add stacked autocomplete providers closes #2983 2026-04-22 15:44:08 +02:00
Mario Zechner 4e919868f6 fix(coding-agent): chain system prompt in before_agent_start closes #3539 2026-04-22 14:58:17 +02:00
Mario Zechner b4f9b618d3 fix(coding-agent): allow headers-only model overrides closes #3538 2026-04-22 13:26:01 +02:00
Mario Zechner 1cc303d053 fix(coding-agent): add replacement-session callbacks closes #2860 2026-04-22 12:13:54 +02:00
Mario Zechner a900d25119 feat(tui,coding-agent): add OSC 9;4 terminal progress indicators
Emit OSC 9;4 progress start/end sequences during agent streaming and
compaction so terminals (iTerm2, WezTerm, Windows Terminal, Kitty, etc.)
show activity in their tab bar.

Made with love for @lucasmeijer
2026-04-22 11:55:52 +02:00
Samuel PainterandGitHub ee462dd70d fix(coding-agent): sanitize markdown links in exported session HTML (#3532)
marked v15 does not filter dangerous URL protocols. The default link
renderer passes href values through verbatim, so markdown like
`[click](javascript:alert(1))` renders as a clickable XSS link in
shared/exported session HTML.

Add custom link and image renderers that:
- Block javascript:, vbscript:, and data: protocol URLs
- Escape href/title/alt attributes via escapeHtml()

Also escape img.mimeType in session image rendering to prevent
attribute breakout from crafted session JSONL.

Fixes #3531
2026-04-22 10:53:03 +02:00