Commit Graph

9015 Commits

Author SHA1 Message Date
can1357 71144825ec feat(coding-agent): extended compact command with submode support
- Added a `mode` property to `CompactOptions` to allow fine-grained control over compaction strategies.
- Implemented `soft`, `remote`, and `snapcompact` submode overrides for the `/compact` command.
- Integrated `parseCompactArgs` to enable robust subcommand routing and validation, including focus instruction rejection for specific modes.
- Established a `CompactMode` registry to manage compaction strategies and verify remote availability.
2026-06-19 02:55:21 +02:00
can1357 2e6e56711f fix: prevented shell command corruption in sequential chains
- Validated every stage of a pipeline against `simple_command_is_safe` instead of only the first stage to prevent improper segmentation of compound shell constructs.
- Guarded segment re-execution by verifying that each `Display`-reconstructed command parses back to the expected pipeline shape.
- Configured segmented-chain execution to fall back to an unsegmented, whole-command path whenever a reconstructed segment diverges from the original AST.
- Resolved a syntax error during command execution by preventing `Display` from stripping terminators from compound commands like `while` and `for` loops.
2026-06-19 02:39:44 +02:00
can1357 623ae8df35 chore: bump version to 16.0.10 2026-06-19 01:32:28 +02:00
can1357 8588aa5802 refactor(coding-agent/slash-commands): removed collab qrcode slash commands
- Removed qrcode and qrcode-view subcommands from the collab command.
- Updated showCollabLink to always trigger QR code display.
- Refactored internal verb logic to simplify session sharing flow.
2026-06-19 01:30:26 +02:00
can1357 a7fdd0b4ed chore: reformat 2026-06-19 01:22:20 +02:00
can1357 a0defa17ce refactor(collab): replace qrcode dependency with a self-contained QR encoder
Drop the runtime qrcode + @types/qrcode packages in favor of a zero-dependency
byte-mode QR encoder (versions 1-40, EC L/M/Q/H, auto version + mask selection)
with a half-block ANSI renderer. Cross-validated byte-for-byte against the qrcode
reference library and decoded end-to-end with jsQR. Adds encoder regression tests.
2026-06-19 01:21:21 +02:00
Bin Jin e91d2cc776 feat(collab): added QR links and split web UI URL support
- Added collab.webUrl and rendered browser links as web UI wrappers whose fragments carry relay links.
- Added one-shot /collab qrcode and /collab qrcode-view commands with terminal QR rendering.
- Updated coding-agent and collab-web parsers to prefer parseable wrapper fragments while preserving legacy links.
- Added regression tests and changelog entries for split-host collab links and QR commands.
2026-06-19 01:21:21 +02:00
can1357 f743ddc83d feat: replaced XML-style pi dialect with sigil-delimited format
- Migrated the `pi` AI dialect from legacy XML-style elements to a compact, token-frugal sigil-delimited format using `§` for calls, `""` for body fences, and `¤` for thinking.
- Implemented robust parsing for the new format, including support for incremental streaming of tool arguments and automatic escalation of body fences to prevent content collisions.
- Updated documentation, settings configurations, and test suites across the `ai` and `coding-agent` packages to ensure consistency with the new dialect rules.
- Standardized moderation category terminology in `stats` to improve clarity in reporting metrics.
2026-06-19 01:19:41 +02:00
can1357 eeb9128510 docs(changelog): move merged fix entries (#2775/#2573/#2729/#2791) to [Unreleased] 2026-06-19 01:00:57 +02:00
can1357 5168e6d6af Merge PR #2791: fix(tool): resolve pasted image attachments in inspect_image (@roboomp)
# Conflicts:
#	packages/coding-agent/src/tools/inspect-image.ts
2026-06-19 00:59:03 +02:00
can1357 3e91783da8 fix(coding-agent): treat openrouter :max suffix as thinking selector
getOpenRouterRouteSuffix() used strict parseThinkingLevel(), which never
recognizes the max->xhigh alias, so openrouter/<id>:max was consumed as an
OpenRouter route suffix and cloned into a literal <id>:max model id with the
reasoning level dropped. This hit every exact-selector funnel
(parseModelPattern -> resolveCliModel/--model, resolveModelRoleValue/modelRoles
+ model picker, SDK default role) for the dominant aggregator provider.

Exclude max via parseThinkingSuffix(.., MAX_THINKING_SUFFIX_OPTIONS) so the
pattern falls through to the existing max-aware selector split. Literal :max
ids stay safe (none exist under openrouter; nanogpt literals win via exact
lookup before this path). Adds an openrouter/<id>:max regression test.
2026-06-19 00:58:52 +02:00
can1357 5d72ce1237 Merge PR #2729: fix(coding-agent): accept max thinking alias (@roboomp)
# Conflicts:
#	packages/coding-agent/test/model-resolver.test.ts
#	packages/coding-agent/test/sdk-model-selection.test.ts
2026-06-19 00:58:52 +02:00
can1357 66a7a65da7 docs(tui): merge duplicate Fixed changelog header for HTML renderer entry 2026-06-19 00:57:45 +02:00
can1357 82a5b24ed7 fix(tui): drop HTML formatting whitespace between block list tags
Pretty-printed HTML lists (e.g. <ul>\n  <li>...) leaked source
indentation before bullets and inserted blank rows between items
because whitespace-only text between block-level tags was appended
literally. Skip insignificant formatting whitespace and pin it with
a regression test.
2026-06-19 00:57:45 +02:00
can1357 59cf966ffc Merge PR #2573: fix(tui): parse and format raw HTML tags in Markdown renderer (@usr-bin-roygbiv) 2026-06-19 00:57:45 +02:00
can1357 0b437b4df7 Merge PR #2775: fix(tui): reduce loader repaint flicker (@roboomp) 2026-06-19 00:57:45 +02:00
can1357 f5c3b34a41 Merge remote-tracking branch 'origin/farm/11c539c6/bedrock-inference-profile-model' 2026-06-19 00:14:48 +02:00
can1357 c5c0229da0 style: biome format #2839 dispose-disconnect test 2026-06-19 00:14:21 +02:00
can1357 51f54ad30a docs(changelog): consolidate changelog entries under [Unreleased]; add #2906/#2839 notes 2026-06-19 00:14:20 +02:00
roboomp 12f608e0f4 fix(providers): used neutral bedrock profile metadata
Stopped synthetic Bedrock inference profile ARN models from inheriting Claude Opus reasoning and context metadata.

Fixes #3004
2026-06-18 21:40:08 +00:00
can1357 6d5f548147 fix(mcp): bound owned-manager disconnect on dispose
The dispose() disconnect added by this PR awaited mcpManager.disconnectAll()
unbounded. An owned manager holding an HTTP/SSE server whose session-
termination DELETE hangs would block dispose for the full MCP request timeout
(30s default, unbounded when OMP_MCP_TIMEOUT_MS=0), stalling /exit and
print-mode shutdown on a broken remote endpoint.

Wrap the disconnect in withTimeout(..., 3_000) — mirroring the bounded
async-job teardown two lines above and the startup bound from issue #2100.
stdio close (the subprocess reap this PR targets) completes well within the
bound; a slow transport close is left to finish detached.

Adds a regression test driving the real MCPManager.disconnectAll() with a
stalled transport close.
2026-06-18 23:32:55 +02:00
can1357 e6228ebda0 fix(coding-agent): move #2909 changelog entry to [Unreleased]
The quoted-path fix entry was appended under the already-released [16.0.6] section (creating a duplicate ### Fixed heading); released sections are immutable per repo convention. Move it to [Unreleased] and normalize the bullet.
2026-06-18 23:32:54 +02:00
can1357 469e4626d0 Merge PR #2839: fix(mcp): disconnect owned MCP manager on AgentSession.dispose() (@jms830) 2026-06-18 23:32:54 +02:00
can1357 7c635de10a Merge PR #2914: fix(coding-agent): preserve queued steers/follow-ups during auto-compaction (@metaphorics) 2026-06-18 23:32:54 +02:00
can1357 1c051532d4 Merge PR #2809: fix(coding-agent/config): support comments in JSON config migration (@usr-bin-roygbiv) 2026-06-18 23:32:54 +02:00
can1357 4406559996 Merge PR #2909: fix(coding-agent): support quoted paths with spaces in file arguments and mentions (@pidevxplay) 2026-06-18 23:32:54 +02:00
can1357 7a819bba16 Merge PR #2906: fix(login): honor disabledProviders in /login provider list (@dipunj) 2026-06-18 23:32:53 +02:00
can1357 71de9a3eb2 Merge PR #2904: fix(stats): contain wide mobile-card tables on narrow desktops (@wolfiesch) 2026-06-18 23:32:53 +02:00
roboomp b67d07e829 fix(providers): preserved bedrock profile thinking suffixes
Handled Bedrock inference profile ARNs through the normal thinking selector parser so suffixes such as :off do not become part of the ARN.

Fixes #3004
2026-06-18 21:26:35 +00:00
roboomp 3a736ff7c1 fix(providers): accepted bedrock inference profile arns
Resolved Amazon Bedrock application inference profile ARNs through the provider-specific model resolver and routed Bedrock requests to the ARN region.

Fixes #3004
2026-06-18 21:06:01 +00:00
usr_bin_roygbiv 9c6979d98a fix(tui): parse and format raw HTML tags in Markdown renderer 2026-06-18 16:05:06 -05:00
usr_bin_roygbiv bc5f25af23 fix(coding-agent/config): support comments in JSON config migration 2026-06-18 16:05:06 -05:00
can1357 20f8c3776f chore: bump version to 16.0.9 2026-06-18 23:01:31 +02:00
can1357 828699ffdf test(catalog): drop evaluator-worktree note from copilot signing test 2026-06-18 23:01:11 +02:00
can1357 3006fe817b test(coding-agent): drop evaluator-worktree note from plan-reference test 2026-06-18 22:57:20 +02:00
can1357 0c69b35785 style: biome format integrated #2851/#1246/#2972 changes 2026-06-18 22:56:24 +02:00
can1357 5a7bd7752e test(auth-storage): cover sticky id-revalidation after credential removal across restart
Adds the missing regression for the credentialId-based invalidation (commit d9ae691): stick a session to an account at index>=1, remove a lower-index account so indices shift, restart, and assert the session re-resolves to the SAME account by id rather than the account now occupying the stale recorded index. Guards against the index-only resurrection the review flagged.
2026-06-18 22:54:29 +02:00
can1357 38a9e0e078 Merge PR #2972: fix(auth): persist session-sticky credentials in SQLite cache across restarts (@cagedbird043)
# Conflicts:
#	packages/ai/test/auth-storage-email-dedupe.test.ts
2026-06-18 22:54:29 +02:00
can1357 a1dbbb50c9 Merge PR #2986: fix(session): prevent goal mode pause during compaction/switch (@roboomp) 2026-06-18 22:53:39 +02:00
can1357 33b7805e18 test(coding-agent): hoist runPrintMode to a top-level import
AGENTS.md bans inline/dynamic imports; import runPrintMode once at the
top of the file instead of re-importing it in each test body.
2026-06-18 22:52:48 +02:00
can1357 6358d9874e docs(coding-agent): changelog entry for --print-thoughts flag 2026-06-18 22:52:48 +02:00
can1357 b25d7472e4 fix(coding-agent): surface thinking for --print-thoughts when hidden
Threading printThoughts only into runPrintMode is too late when
hideThinkingBlock is set (settings or --hide-thinking): the session is
built with hideThinkingSummary=true, so the provider omits reasoning
summaries and --print-thoughts prints nothing. Override hideThinkingBlock
to false for single-shot print mode before session creation, gated on
print mode; an explicit --hide-thinking still wins.
2026-06-18 22:52:48 +02:00
can1357 0b684f9929 Merge PR #2960: add print-mode thinking output flag (@roboomp) 2026-06-18 22:52:48 +02:00
can1357 8fb73c2ba2 Merge PR #2961: fix(tui): preserve plan approval actions when overlay is clamped (@roboomp) 2026-06-18 22:52:29 +02:00
can1357 dbf4b53163 fix(coding-agent): re-inject approved plan reference after compaction
After plan approval the executor delivers the plan-mode-reference exactly
once and sets `#planReferenceSent = true`. Both compaction paths — `compact()`
and `#runAutoCompaction()` — replace the conversation history that carried
that reference but never cleared the flag, so `#buildPlanReferenceMessage()`
short-circuited to null on every subsequent turn and the executor permanently
lost the plan it was working on (exactly the long-session failure reported).

Clear `#planReferenceSent` right after `replaceMessages()` in both paths so the
next turn re-reads the plan from disk and re-injects it. The reset is a no-op
for ordinary sessions: the default plan path (PLAN.md in session-local scratch)
has no file on disk, so `#buildPlanReferenceMessage()` still returns null there.

Adds a deterministic regression test (short-circuited compaction, mock stream)
that fails before this change and passes after, plus a guard proving normal
sessions get no spurious plan injection.

Fixes #1246
2026-06-18 22:52:29 +02:00
can1357 2af64d5634 fix(catalog): treat github-copilot anthropic proxy as a signing endpoint (#2851)
GitHub Copilot's `anthropic-messages` proxy (api.githubcopilot.com) forwards
to signature-enforcing Anthropic and returns full thinking signatures, but the
compat builder classified it as a non-signing reasoning endpoint via the
generic `reasoning && !official` default (`replayUnsignedThinking: true`).

When a checkpoint/branch-return turn is an abandoned tool-use turn (adaptive
Opus emits a tool call then ends on `stop`/`end_turn`), `transformMessages`
correctly strips its end_turn-bound, unreplayable signature. On a
`replayUnsignedThinking` endpoint the encoder then re-emitted that block as
`{ type: "thinking", signature: "" }`. An empty signature is rejected by the
signature-enforcing backend with `400 Invalid signature`, which corrupts the
session and re-trips on every full history re-send (e.g. after toggling MCP
servers).

Exclude github-copilot from `replayUnsignedThinking` so unsigned/stripped
thinking degrades to text exactly like the official Anthropic API — wire-valid
and lossless of the tool_use pairing. Z.AI / DeepSeek / other 3p reasoning
endpoints (#2005) and cross-model preservation (#2257/#2265) are unaffected.

Tests:
- packages/catalog/test/anthropic-copilot-signing-compat.test.ts: copilot
  (incl. enterprise copilot-api.* hosts) -> replayUnsignedThinking false;
  generic 3p reasoning -> true; official -> false. Fails before / passes after.
- packages/ai/test/anthropic-copilot-checkpoint-thinking-signature.test.ts:
  a signing copilot model never emits an empty-signature thinking block for a
  historical checkpoint turn (demotes to text, keeps tool_use), and still
  replays a clean signed historical thinking block natively.
2026-06-18 22:52:29 +02:00
can1357 b9f57fb5d6 feat(coding-agent/prompts): updated advisor system prompt and tool definition
- Refined the advisor's scope to prioritize concrete technical risks and user advocacy while discouraging process-related critiques.
- Explicitly barred the advisor from intervening on user intent, process questions, or issues already handled by developer tooling.
- Updated `advise` tool documentation to clarify its purpose in preventing wasteful or incorrect work.
2026-06-18 22:34:16 +02:00
Dipunj ca4c5463d9 fix(login): hide alias logins when their credential provider is disabled
A login entry can store credentials under a different provider id via
storeCredentialsAs (e.g. openai-codex-device => openai-codex). Filtering
only on provider.id left such alias logins visible after disabling the
underlying model provider. Surface storeCredentialsAs on OAuthProviderInfo
and hide a login entry when either its own id or its storeCredentialsAs
target is in disabledProviders.

Addresses Codex review on #2906.
2026-06-18 15:56:43 -04:00
can1357 ad0db360ba Merge PR #2902: fix(ai): degrade Copilot Responses image detail original to auto (@wolfiesch) 2026-06-18 21:53:06 +02:00
can1357 eb0c00c66b Merge PR #2929: fix(auth-storage): atomic legacy api_key cleanup within sqlite transaction during oauth login (@cagedbird043) 2026-06-18 21:53:05 +02:00