Commit Graph
10525 Commits
Author SHA1 Message Date
roboomp 04bfce62c6 fix(ai): disabled codex lite for image prompts
Codex Responses Lite only accepts text input, so GPT image prompts with input_image failed before reaching the full multimodal transport.

The request transformer and Codex headers now fall back to full Responses whenever a request body contains input_image, with regression coverage for the lite header.

Fixes #3421
2026-06-25 01:34:07 +00:00
can1357 8d60776a6f chore: bump version to 16.1.17 2026-06-24 21:11:31 +02:00
roboompandcan1357 8739a78d69 fix(ai): honored long cache retention for openrouter anthropic responses
Mapped cacheRetention="long" to cache_control.ttl="1h" on OpenRouter Anthropic Responses requests; guarded against overwriting a caller-supplied cache_control.\n\nRefs #3397
2026-06-24 21:08:46 +02:00
can1357 90c8f8251a Merge remote-tracking branch 'origin/farm/3d137ac8/openrouter-anthropic-reasoning-replay' 2026-06-24 21:07:21 +02:00
can1357 23838ba80b chore: update changelogs 2026-06-24 21:03:29 +02:00
can1357 9ad17a2b49 ux(coding-agent/modes): removed hotkeys tip from welcome component
- Removed the hotkeys tip from the welcome screen UI.
2026-06-24 21:01:55 +02:00
can1357 0eb21efa1a Merge remote-tracking branch 'origin/farm/7ef98714/snapcompact-copilot-vision-gate' 2026-06-24 21:00:37 +02:00
can1357 79193e8e78 Merge remote-tracking branch 'origin/farm/e725242d/fix-openrouter-anthropic-cache' 2026-06-24 21:00:23 +02:00
can1357 45ade3ef9d Merge remote-tracking branch 'origin/farm/d5c3021f/tmux-notification-bell-passthrough' 2026-06-24 21:00:19 +02:00
can1357 4c4fb21caa Merge remote-tracking branch 'origin/farm/cf20a2c7/clamp-ollama-cloud-max-output-tokens' 2026-06-24 21:00:03 +02:00
can1357 e59cfececf Merge remote-tracking branch 'origin/farm/f9a71625/anthropic-headers-override' 2026-06-24 20:59:59 +02:00
can1357 0f2737f16e Merge remote-tracking branch 'origin/farm/e322f828/eval-agent-yield-terminal' 2026-06-24 20:59:54 +02:00
roboomp ebdce456dc fix(providers): stripped openrouter anthropic reasoning replay
Fixes #3399
2026-06-24 18:57:33 +00:00
roboomp c4ce8a8b31 fix(ai): enabled openrouter anthropic responses caching
Added OpenRouter Anthropic Responses cache_control wiring and request-capture coverage.\n\nFixes #3397
2026-06-24 18:24:46 +00:00
roboomp d8d037e8ac style: bun run fix 2026-06-24 18:07:25 +00:00
roboomp 28e1caec69 fix(tui): deliver notifications under tmux via DCS passthrough + BEL fallback
When the inner-terminal env markers (KITTY_WINDOW_ID, GHOSTTY_RESOURCES_DIR,
WEZTERM_PANE, ITERM_SESSION_ID) leak into a tmux session, TERMINAL_ID
resolves to the inner terminal and notifyProtocol becomes OSC 9 / OSC 99.
sendNotification() wrote that raw OSC straight to stdout, but tmux does not
forward bare OSC 9/99 to the outer terminal and the bare sequence does not
flag tmux's own monitor-bell / monitor-activity — so a backgrounded omp pane
under the common tmux + kitty/ghostty/wezterm/iTerm2 stack had no signal at
all for completion or 'ask' blockage.

Under TMUX, OSC-protocol notifications are now wrapped in tmux's
\x1bPtmux;…\x1b\\ DCS passthrough envelope (so users with
allow-passthrough on still get the real desktop toast) and followed by a
\x07 BEL (so monitor-bell flags the window otherwise — the standard
'needs attention' workflow). The OSC 99 capability probe is wrapped the
same way so rich notifications keep working across tmux. Bell-protocol
paths are unchanged.

Fixes #3395
2026-06-24 18:07:14 +00:00
roboomp 0edb3d32b8 fix(ai/ollama): clamped num_predict at the 65536 Ollama Cloud cap
Ollama Cloud rejects any chat request whose options.num_predict exceeds
65536 with HTTP 400, but the existing safety relied on the load-time
omitMaxOutputTokens policy in model-registry.ts. Stale models.db rows
predating that policy (and custom modelOverrides re-enabling output
caps) carried maxTokens: 1048576 forward to the wire layer untouched,
so every request to deepseek-v4-pro / deepseek-v4-flash 400'd with:

  max_tokens (1048576) exceeds model's maximum output tokens (65536)
  for model deepseek-v4-pro

createChatBody now resolves num_predict through resolveNumPredict,
which clamps every ollama-cloud request at the documented cap before
serialization — independent of the cached spec, on top of the existing
omitMaxOutputTokens path. Self-hosted ollama traffic is unaffected.

Fixes #3392
2026-06-24 17:29:28 +00:00
roboomp d2e06fc9d0 fix(ai/anthropic): honored caller-supplied Authorization/X-Api-Key for custom proxies
`buildAnthropicHeaders` filtered `Authorization` and `X-Api-Key` out of
`model.headers` (and `ANTHROPIC_CUSTOM_HEADERS`) via `enforcedHeaderKeys`,
then re-attached the auto-built `Bearer <apiKey>` / `X-Api-Key: <apiKey>`,
so custom-proxy users could never override anthropic-messages auth — unlike
`openai-responses` (`headers.Authorization ??= Bearer apiKey`) and the
GitHub Copilot anthropic branch (`mergeHeaders(..., model.headers, ...)`).

Non-OAuth, non-Cloudflare branches now honor the caller's `Authorization` /
`X-Api-Key`; case-insensitive capture keeps the spread free of duplicate
keys. OAuth still forces `Authorization: Bearer <oauth-token>` (the OAuth
credential itself) and Cloudflare AI Gateway still owns
`cf-aig-authorization` — both drop + log caller overrides.

`buildAnthropicClientOptions` no longer requires the surviving
`Authorization` to start with `Bearer ` before suppressing the
client-level `X-Api-Key`; any custom Authorization on a non-official
endpoint suppresses it so the proxy gets a single credential.

Fixes #3391
2026-06-24 17:21:25 +00:00
roboomp 997b2b24ff fix(session): suppressed empty-stop retry after successful yield
Trailing empty assistant 'stop' arriving after a successful 'yield'
revived the already-yielded subagent. AgentSession.agent_end maintenance
compared #assistantEndedWithSuccessfulYield(msg) against the trailing
empty-stop message — not the yield-bearing one — so the empty-stop
recovery path appended a retry reminder and scheduled agent.continue().

Track a sticky #yieldTerminationPending flag set when the yield tool
finishes without error and cleared on the next #promptWithMessage. The
agent_end routing extends the existing successful-yield branch: when the
flag is set, or the current message ended with yield, short-circuit
empty-stop / unexpected-stop / compaction continuations for the rest of
the run, so a successful yield is terminal regardless of trailing stops.

Fixes #3389
2026-06-24 17:08:49 +00:00
can1357 a4dbe6396c style: biome organize-imports on merged test files (#3193, #3312) 2026-06-24 19:03:32 +02:00
can1357 ff2280e6ee chore(changelog): normalize [Unreleased] after merge sweep (fix-changelogs --since baseline; dedup #3258) 2026-06-24 18:46:00 +02:00
can1357 7b619400fd Merge PR #1800: fix(tui): runtime Hangul Compatibility Jamo width override + Ghostty detection (@ZergRocks) 2026-06-24 18:43:01 +02:00
can1357 9b3c193dfd Merge PR #1681: fix(coding-agent): expose hashline edit path to extensions (@roboomp)
# Conflicts:
#	packages/coding-agent/test/extensions-runner.test.ts
2026-06-24 18:42:35 +02:00
roboomp 714051d795 fix(catalog,coding-agent): disable vision on non-personal copilot endpoints
GitHub Copilot's /models response advertises supports.vision = true for
Claude/GPT chat models on every host, but only the canonical personal
endpoint (https://api.githubcopilot.com) actually accepts image inputs;
the business (api.business.githubcopilot.com) and enterprise
(copilot-api.{domain}) hosts respond '400 vision is not supported'.
snapcompact then injected rasterized transcript frames after compaction
and permanently broke every business-Copilot session.

- Catalog discovery (githubCopilotModelManagerOptions.mapModel) now
  forces input=['text'] whenever the resolved baseUrl is not the
  canonical personal-Copilot host, so the upstream's vision flag is
  honoured only where it actually works.
- mergeDynamicModel honours the dynamic input value (instead of
  OR-upgrading with the bundled reference) when the merged baseUrl
  differs from the bundled one, so a bundled spec pinned to the
  personal host can no longer taint a business-resolved merge.
- snapcompact-inline's canSendImages helper short-circuits the
  rasterizer for any github-copilot model whose baseUrl is non-personal,
  catching stale cached specs that still advertise vision.
- Helper isPersonalGitHubCopilotBaseUrl exported from
  pi-catalog/wire/github-copilot so catalog and coding-agent share one
  canonical check.

Regression coverage in github-copilot-model-limits.test.ts (vision
endpoint policy + full merge) and snapcompact-inline.test.ts (#3387
business/enterprise case).

Fixes #3387
2026-06-24 16:27:14 +00:00
can1357 b1e31b7f7d docs(changelog): dropped unbacked resize-replay claim
This PR tails appended JSONL and collapses compacted history; it does not
touch the resize/SIGWINCH replay path, so the changelog should not claim it.
2026-06-24 18:26:20 +02:00
can1357 6988178f64 test(session-storage): used a top-level FileSessionStorage import
Replaced the inline await import() calls with a top-level import per the
repo's no-inline-imports rule.
2026-06-24 18:26:20 +02:00
can1357 9c56956631 fix(tui): kept recent turns visible when collapsing remote compactions
With collapseCompactedHistory the live display fell into the LLM compaction
branch, which skips the firstKeptEntryId..compaction turns whenever an OpenAI
remote-compaction replacementHistory payload is present. That payload feeds the
provider only and is not rendered, so a remotely-compacted session showed just
the summary plus post-compaction rows, hiding recent turns that were visible
before. Emit the kept SessionEntry rows in transcript mode regardless. Adds a
regression.
2026-06-24 18:26:20 +02:00
can1357 fa5024caa4 fix(tui): guarded transcript sentinel reads against mid-poll unlink
The append fast-path opened the session file for sentinel comparison and
recompute without a guard, so a file unlinked/rotated between #refresh's
statSync and the sentinel read threw out of the 250ms poll timer (no catch),
risking a TUI crash. Treat sentinel read/recompute failures as non-appendable
and fall back to the guarded full reload. Adds a fake-timer regression.
2026-06-24 18:26:20 +02:00
can1357 c04747c5ac Merge PR #3259: fix(tui): reduce large transcript stalls (@roboomp) 2026-06-24 18:26:19 +02:00
omp-evalandcan1357 78e469088d test(agent): decouple snapcompact skip test from provider-dependent LLM fallback
The "skips snapcompact entirely" case asserted .rejects.toThrow() on
session.compact(), but after the maxFrames<1 skip the manual /compact path
falls through to the LLM summarizer whose outcome is provider/network
dependent (resolves when a summary lands, rejects only without
credentials/network). In a sandbox it resolves and blows the 5s default
timeout. Tolerate either outcome and pin only the deterministic skip
contract (snapcompact.compact not invoked + the kept-history notice), with
a generous explicit timeout. Addresses chatgpt-codex P2 review on #3249.
2026-06-24 18:26:19 +02:00
can1357 3117a20ab9 Merge PR #3249: fix(agent): size snapcompact maxFrames by the live model window (@roboomp) 2026-06-24 18:26:19 +02:00
can1357 ef67f685ac Merge PR #3380: fix(coding-agent): clamp auto thinking to undefined for models without controllable effort (@roboomp) 2026-06-24 18:26:19 +02:00
can1357 0f072cbcc1 Merge PR #3315: fix(welcome): replace stale ? shortcut with /hotkeys in tips panel (@oldschoola) 2026-06-24 18:26:18 +02:00
can1357 a7a17e8dc1 Merge PR #3376: fix(tui): theme-aware welcome tip line for light-theme legibility (@roboomp) 2026-06-24 18:26:18 +02:00
can1357 ee57c07371 Merge PR #3377: fix(settings): prevent numeric config values from crashing settings UI (@roboomp) 2026-06-24 18:26:18 +02:00
can1357 b56a7524af Merge PR #3385: fix(coding-agent): restore TUI focus to live editor-slot owner when a fullscreen overlay closes (@roboomp) 2026-06-24 18:26:18 +02:00
can1357 8c76b45c3b Merge PR #3381: fix(coding-agent): honor app.message.followUp chord in ask prompt-style editor (@roboomp) 2026-06-24 18:26:18 +02:00
can1357 35ec85c034 test: cover central slash-command history recording + secret skip (#3148) 2026-06-24 18:26:17 +02:00
can1357 d88d9bd6d8 Merge PR #3352: fix: store slash commands in input history (@oldschoola) 2026-06-24 18:26:17 +02:00
can1357 d4d7fed0cc Merge PR #3384: fix(tui): attach pasted file paths as local refs (@roboomp) 2026-06-24 18:26:17 +02:00
can1357 345bdc32e1 test(usage): cover TUI aggregate provider-notes-once and per-limit dedup
renderUsageReports (command-controller) carried the #3268 dedup contract
with no regression test; the PR's added CLI test asserts the opposite
(per-limit CLI rendering shows the note twice). Export renderUsageReports
and add a real regression through it: two accounts sharing one window group
render a provider-wide UsageReport.note once and an identical per-limit note
once. Verified failing on the pre-fix flatMap form (0 and 2 occurrences) and
passing on head (1 and 1).
2026-06-24 18:26:17 +02:00
can1357 01ef63fbd0 Merge PR #3312: fix(usage): dedup provider-wide notes and add report-level notes field (@oldschoola) 2026-06-24 18:26:17 +02:00
can1357 b1e0ba41eb Merge PR #3289: fix(tui): include tiered Codex usage limits (@riverpilot) 2026-06-24 18:26:16 +02:00
can1357 7408ee75f2 Merge PR #3193: fix(catalog): restore Umans GLM-5.2 max reasoning (@roboomp)
# Conflicts:
#	packages/ai/test/anthropic-alignment.test.ts
#	packages/catalog/test/umans-provider.test.ts
2026-06-24 18:26:00 +02:00
omp-evalandcan1357 df44e55797 test(tui): add POSIX-catchable backslash @-path regression test
The PR's absolute-path tests pass identically on baseline and head on
POSIX CI (they use a /-prefixed outsideDir), so they do not protect the
Windows fix on Ubuntu. This adds a relative @..\\ backslash-prefix test
that fails on the pre-fix code (empty results on POSIX) and passes after
the backslash-normalization fix, giving CI real regression coverage.
2026-06-24 18:23:50 +02:00
can1357 a34f4fc129 Merge PR #3345: fix(tui): @-path autocomplete on Windows for paths outside cwd (@oldschoola) 2026-06-24 18:23:50 +02:00
can1357 d93616c61e chore: drop drive-by churn from #3344 (empty root file 0, coding-agent CHANGELOG blank line)
Reviewer flagged both as unrelated to the TUI OSC 11 fix. The blank-line addition reverts the PR branch's coding-agent CHANGELOG back to its merge-base blob (the package is otherwise untouched by this PR); the empty file `0` was accidental.
2026-06-24 18:23:49 +02:00
can1357 4d71beb0df Merge PR #3344: fix(tui): stop OSC 11 poll from wiping text selection (@oldschoola) 2026-06-24 18:23:49 +02:00
can1357 ca31872f29 test(cli): cover backslash runtime-path normalization in profile-alias POSIX fields 2026-06-24 18:23:49 +02:00
can1357 5d49862eaf Merge PR #3346: fix(cli): profile-alias installer produces correct paths for POSIX shells on Windows (@oldschoola) 2026-06-24 18:23:48 +02:00