Commit Graph

4530 Commits

Author SHA1 Message Date
Mario Zechner cb222bf99d feat(agent): export InMemorySessionStorage and JsonlSessionStorage
Export both session storage implementations from @earendil-works/pi-agent-core
so they can be imported and extended directly instead of via repo workaround.

closes #6435
2026-07-09 10:22:30 +02:00
David Brailovsky 86afffe01f fix fork menu allowing user to double select an entry (#6430)
in cases where forking a session was not immediate due to extensions
slowing down teardown, it's possible for the user to select the
message to fork more than once and then create multiple session forks.

in this fix we close the forking menu before starting the fork process
to not allow such behavior.

fixes #6321
2026-07-08 18:23:22 +02:00
Mario Zechner dd1c690f36 fix(agent): add session context entry projection 2026-07-08 14:59:16 +02:00
Armin Ronacher 312bc713bb feat(coding-agent): support provider arguments for login 2026-07-08 12:06:26 +02:00
David Brailovsky 62f45badae Fix native clipboard in bun release (#6418)
* copy native clipboard .node files to the clipboard package

under the bun binary packaging, require("@mariozechner/clipboard-linux-x64-gnu")
doesn't work so instead we rely on require("./clipboard.linux-x64-gnu.node")
for that we need to copy the .node files to the clipboard package dir

* fallback to xclip if native clipboard fails on x11
2026-07-08 11:20:24 +02:00
ArcadiaLin 7198e78f99 feat(agent): support custom metadata in jsonl session headers (#6417)
Allow callers to attach an opaque JSON object to the session header so
application context needed to rebuild a harness (for example an agent
profile reference) is readable from the first line alone, without
scanning session entries. The field is optional and ignored by readers
that do not use it; fork inherits the source metadata unless overridden.

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-07-08 11:18:43 +02:00
Vegard Stikbakke cc2db98002 fix(ai): refresh Xiaomi token plan model catalogs
Use the new provider-specific Xiaomi Token Plan catalogs from models.dev instead of cloning the API-billing Xiaomi catalog into every token-plan region. This removes API-billing-only models such as mimo-v2-omni from xiaomi-token-plan-{cn,ams,sgp}.
2026-07-08 10:17:48 +02:00
Armin Ronacher 351efc828b fix(agent): fail tool calls from length-truncated assistant messages (#6285)
* fix(ai,agent): stop salvaging malformed tool-call argument JSON

Finalized tool-call arguments must strict-parse (allowing only lossless
string-escape repair). When the streamed JSON is truncated or malformed,
the raw JSON is preserved on ToolCall.malformedArguments, arguments
become {}, and the agent loop refuses to execute the call with an error
tool result instead of running it with silently salvaged partial
arguments. Partial parsing is now only used for streaming previews.

* fix(agent): fail tool calls from length-truncated assistant messages

Reverts the malformed-arguments tracking approach in favor of handling
truncation in the agent loop: when an assistant message stops with
"length", all tool calls in it are potentially borked (streamed
arguments are salvage-parsed), so none are executed. Each gets an error
tool result telling the model to re-issue the call, and the loop
continues. No new fields on ToolCall and no provider changes.

fixes #6284
2026-07-07 14:30:31 +02:00
Affan Ali 8a2ce5a540 fix(tui): decrement paste counter on paste marker delete and terminal clear (#6397)
* fix(tui): decrement paste counter on paste marker delete

* fix(tui): fix case of markers after the removed one and ctrl+c

* fix(tui): formatting
2026-07-07 14:29:39 +02:00
Vegard Stikbakke 2b00dade7c Revert "fix(coding-agent): abort stuck context hooks"
This reverts commit 6757561546.
2026-07-07 07:14:27 +02:00
Mat 244f1deaf1 feat(coding-agent): add before_provider_headers extension hook (#6350)
* feat(coding-agent): add before_provider_headers extension hook

Extensions can already rewrite the request payload through before_provider_request, but there is no way to adjust the outgoing HTTP
headers of a provider call. This hook fills that gap for cases like request tracing, session correlation, or tenant routing.

Handlers mutate the headers map in place - a null value deletes a header - and the return value is ignored, so a handler cannot accidentally drop auth or attribution headers by
forgetting to spread.

* docs(coding-agent): document before_provider_headers extension hook

Add the before_provider_headers section and lifecycle-diagram entry to
extensions.md; drop the now-superseded proposal file.
2026-07-06 22:35:56 +02:00
Samwise Wang 279f53b098 fix(ai): use "(no tool output)" placeholder for empty tool results without images (#6290)
OpenAI Completions and Responses providers unconditionally replaced empty
tool result text with "(see attached image)", even when the result had no
image content. This caused the model to hallucinate image attachments for
commands that produce no output (e.g. curl -s with SSL errors, grep with
no matches, true/false).

Now matches the Google provider behavior: "(see attached image)" is only
used when images are actually present; empty results get "(no tool output)".

Co-authored-by: tzwm <tzwm@users.noreply.github.com>
Co-authored-by: Mario Zechner <badlogicgames@gmail.com>
2026-07-06 21:42:56 +02:00
Victor Araújo b3dff19a04 feat(coding-agent): add InlineExtension type for named inline extension factories (#6267)
* feat(coding-agent): add InlineExtension type for named inline extension factories

* test(coding-agent): update utilities and add regression test for InlineExtension
2026-07-06 20:59:37 +02:00
Armin Ronacher c8ada4e76e Improve project-local pi config (#6309)
* feat(coding-agent): improve config resource overrides

* fix(coding-agent): simplify config resource overrides
2026-07-06 20:50:30 +02:00
Armin Ronacher 8c0ccd14b3 fix(ai,agent,coding-agent): normalize null message content at ingestion boundaries (#6343)
The Message types require content to always be present, but untyped JS
extension tools, hand-built histories, and old or hand-edited session
files can violate that contract, crashing rendering, compaction, and
provider request conversion with 'content is not iterable'.

Normalize null/missing content to an empty array at the ingestion
boundaries instead of guarding every consumer:

- transformMessages (choke point before every provider request)
- createToolResultMessage in the agent loop
- session entry loading (message and custom_message entries)
- extension custom messages (sendCustomMessage, before_agent_start)
- message_end extension replacements

fixes #6259, fixes #6276
2026-07-06 20:47:08 +02:00
Vegard Stikbakke 6efc09b7eb fix(coding-agent): clear label timestamp cache on new sessions
closes #6354
2026-07-06 15:31:32 +02:00
Armin Ronacher 2e4ad6a094 fix(ai): clamp OpenAI Responses max output token floor
closes #6265
2026-07-06 02:21:15 +02:00
Armin Ronacher 1dac099022 fix(agent): derive short session entry ids from the uuidv7 random tail (closes #6242)
The uuidv7 prefix is timestamp-derived and nearly constant between calls, so slicing the first 8 chars degenerated short ids to full-UUID fallbacks. Regression from 80c918c2 which replaced randomUUID with uuidv7.
2026-07-05 23:35:53 +02:00
Armin Ronacher 478301342b test: use quiet dot reporters and show output only for failing tests
Switch vitest packages (ai, agent, coding-agent) to the dot reporter
with silent: passed-only so passing tests stay quiet while failing
tests still print their console output and full diffs. Add the
github-actions reporter on CI for inline annotations. Switch the tui
node:test runner to the dot reporter as well.
2026-07-05 23:17:17 +02:00
Armin Ronacher 75ac0cb0e6 fix(coding-agent): stabilize auto-compaction threshold test 2026-07-05 23:14:10 +02:00
Armin Ronacher 604ac652d0 fix: CI 2026-07-05 22:45:18 +02:00
Armin Ronacher 035ea9c856 fix: remove redundant record guards 2026-07-05 18:55:09 +02:00
Vegard Stikbakke ee24a9ec54 feat(ai): refresh generated model catalogs
closes #6256
2026-07-04 06:27:58 +02:00
Armin Ronacher a1b336d73e fix(coding-agent): allow extra edit replacement fields 2026-07-04 01:52:17 +02:00
Vegard Stikbakke d53b567601 fix(ai): retry Cloudflare 524 timeouts
closes #6239
2026-07-03 23:03:35 +02:00
Vegard Stikbakke 8133c94db9 fix(ai): honor server-provided slow_down interval in device-code polling
GitHub's device flow documents slow_down as a rate limit: a poll that
arrives inside the throttle window is answered with slow_down instead of
the token, and the response's interval field reports the new required
minimum ("adds 5 seconds to the last interval"). A client that only
tracks its own +5s increment can stay behind the server's ratcheting
requirement when its timers fire early - common with WSL/VM clock drift
(microsoft/WSL#10006) - so every subsequent poll keeps hitting the rate
limit and login appears to hang forever even after the browser reports
the device as authorized.

Adopt the server-provided interval when a slow_down poll result carries
one, falling back to the RFC 8628 section 3.5 +5s increment otherwise.
GitHub Copilot passes the interval field through.

This restores part of the #1994 mitigations that were lost in the #4788
device-code refactor.

refs #6187
2026-07-03 22:26:12 +02:00
Vegard Stikbakke 23d1462611 fix(ai): rotate stale Codex websocket sessions
closes #6268
2026-07-03 15:30:41 +02:00
Vegard Stikbakke 83cbfc6521 fix(coding-agent): remove Vercel AI Gateway attribution 2026-07-03 15:14:01 +02:00
Raj 4a9c962b59 fix(coding-agent): add pnpm self-update prune hint (#6279)
Adds a pnpm-specific self-update recovery hint when pi update fails during self-update.
Fixes #6215.
2026-07-03 12:58:35 +02:00
Vegard Stikbakke 21cb3807e7 fix(ai): detect DS4 context overflow errors
closes #6262
2026-07-02 20:39:49 +02:00
Vegard Stikbakke 114bacf349 fix(ai): enable Bedrock prompt caching for Claude 5
closes #6235
2026-07-02 11:00:20 +02:00
Vegard Stikbakke ca09b2b1a8 fix(coding-agent): skip unauthenticated default model
closes #6231
2026-07-02 10:48:11 +02:00
Vegard Stikbakke 6757561546 fix(coding-agent): abort stuck context hooks
closes #6234
2026-07-02 10:02:32 +02:00
Vegard Stikbakke ec857fece5 fix(coding-agent): set executionMode: sequential on question example tool
The question extension tool blocks on ctx.ui.custom() but omitted
executionMode, so multiple question calls in one assistant turn ran
under the default parallel mode and raced on the editor slot. Only the
last question rendered; earlier calls hung pending forever.

Set executionMode: "sequential" so the agent loop serializes the
batch. Wrappers already propagate the field to the core.

closes #6189
2026-07-02 09:01:15 +02:00
Vegard Stikbakke e285e90fdb fix(ai): remove Copilot Sonnet 5 fallback in generate-models 2026-07-01 23:01:33 +02:00
Vegard Stikbakke f8bec25f34 fix(coding-agent): surface auth storage save failures
closes #6223
2026-07-01 21:24:26 +02:00
Vegard Stikbakke f58c115626 fix(coding-agent): serialize split-turn compaction summaries
closes #5536
2026-07-01 15:37:00 +02:00
Vegard Stikbakke e2ccdc8509 fix(ai): delay Copilot device-code token polling
closes #6187
2026-07-01 13:48:11 +02:00
Mario Zechner ba10b60b51 fix(coding-agent): add entry renderers for session entries 2026-07-01 11:30:26 +02:00
Vegard Stikbakke 8c9436407c fix(ai): remove stale model metadata fallbacks 2026-07-01 10:53:09 +02:00
Vegard Stikbakke 1da1cdb2fb chore(ai): regenerate models
Picked up upstream models.dev/OpenCode catalog drift while
regenerating for the Fireworks GLM 5.2 Fast fix: Cloudflare AI Gateway
and OpenCode gain Claude Sonnet 5; OpenCode gains Kimi K2.7 Code and
MiniMax-M3; MiniMax model name formatting normalized to MiniMax-Mx.x.
2026-07-01 10:35:38 +02:00
Vegard Stikbakke 844d175eaf fix(ai): align Fireworks GLM 5.2 Fast with GLM 5.2
Broaden the Fireworks GLM 5.2 special-case in generate-models.ts from
an exact id match to a glm-5p2 substring match, so the router variant
accounts/fireworks/routers/glm-5p2-fast also uses the OpenAI-compatible
endpoint and thinkingLevelMap instead of falling back to the default
Anthropic Messages config.

closes #6195
2026-07-01 10:34:46 +02:00
Vegard Stikbakke 040f0a5197 feat(coding-agent): expose model resolution helpers
closes #6201
2026-07-01 10:22:35 +02:00
Vegard Stikbakke 1d061b3f45 fix(ai): remove stale model metadata fallbacks 2026-07-01 10:03:26 +02:00
Vegard Stikbakke 4206376410 feat(ai): add Copilot Claude Sonnet 5
closes #6200
2026-07-01 09:57:04 +02:00
Vegard Stikbakke 85b7c24741 fix(coding-agent): reject non-positive bash timeouts 2026-07-01 09:03:00 +02:00
Vegard Stikbakke cbcf4e04c3 fix(coding-agent): reject oversized bash timeouts
closes #6181
2026-07-01 08:49:31 +02:00
Vegard Stikbakke 0ac3cfe09b feat(ai): use zstd compression for codex sse transport 2026-07-01 08:42:46 +02:00
Vegard Stikbakke a3cc169d97 fix(ai): avoid codex user-agent race
The Codex provider previously loaded node:os asynchronously during module evaluation. A fresh process that imports the provider and immediately starts an SSE request can build headers before that promise callback runs, so the first request reports User-Agent: pi (browser) in Node/Bun.

Reproduced against parent fd6659dd with a stubbed-fetch harness: 50/50 immediate first requests reported pi (browser) in both Node and Bun. The same harness on this fix reports the OS-specific user agent 50/50 in both runtimes.

Use process.getBuiltinModule("node:os") behind the existing Node/Bun runtime guard so OS metadata is available synchronously while still avoiding top-level runtime Node builtin imports that break browser/Vite builds.
2026-07-01 08:41:38 +02:00
Mario Zechner dd87c02cbf Add [Unreleased] section for next cycle 2026-06-30 22:29:44 +02:00