Commit Graph
10109 Commits
Author SHA1 Message Date
can1357 aaac4e414f Merge PR #2950: feat(coding-agent): add copy affordance to completed /btw answers (@wolfiesch)
Adds 'c copy' to the completed /btw panel footer (alongside b branch / Esc
dismiss), copying the sanitized visible answer to the clipboard. The copy
shortcut is guarded by canCopyBtw + main-editor focus + empty editor.
2026-06-20 23:56:24 +02:00
can1357 44f238d2f9 chore: lockfile 2026-06-20 23:47:53 +02:00
can1357 330a37e289 test(coding-agent): fixed type error in event controller tests
- Added missing settings property to the InteractiveModeContext mock in event controller tests.
2026-06-20 23:43:38 +02:00
can1357 9fc7ab9fe0 chore: update changelogs 2026-06-20 23:43:16 +02:00
roboompandcan1357 75b21611f7 fix(mcp): sanitized startup server names
Sanitized MCP server names before status formatting so configured keys cannot leak home paths, tabs, newlines, or oversized text into the TUI.

Fixes #3150
2026-06-20 23:43:16 +02:00
Can BölükandGitHub 6723c1baf6 Merge pull request #2926 from lyc-aon/feat/robomp-lifecycle-cards
Replace Robomp status tables with lifecycle cards
2026-06-20 23:43:06 +02:00
Can BölükandGitHub 2577d30cf1 Merge pull request #2925 from lyc-aon/feat/collab-web-theme-refresh
Align collab-web shell with stats theme tokens
2026-06-20 23:41:49 +02:00
Can BölükandGitHub 835ad2d9db Merge branch 'main' into feat/collab-web-theme-refresh 2026-06-20 23:41:37 +02:00
can1357 63655a5b71 Merge PR #3050: feat: show live slash command status in autocomplete (@wolfiesch)
Shows live per-command status (plan/goal/loop/model/advisor/collab/jobs/
context/...) in the slash-command autocomplete.

Adjustments on merge:
- Exclude the two .github/pr-assets/*.png screenshots.
- Resolve the autocomplete.ts conflict keeping main's skill-command empty-prefix
  boost alongside the new static-vs-display description split.
- Compute the live display description lazily — only once a command actually
  matches (name or alias) — instead of for every command on each keystroke, and
  guard the getter with a typeof check. getAutocompleteDescription reads live
  session state, so the eager call was O(commands) work per refresh.
2026-06-20 23:36:17 +02:00
can1357 a2f8c97e10 Merge remote-tracking branch 'origin/farm/96f37e17/mcp-connection-status' 2026-06-20 23:29:19 +02:00
can1357 73ab005aac fix(hashline): weigh missing-closer repair against the whole-patch delimiter balance
The dropped-closer repair fired per replacement group, so a `SWAP` that
deleted a structural closer kept it even when another hunk had already
removed the matching opener (a deliberate wrapper removal) — leaving a
stray `}` and corrupting valid multi-hunk edits.

Defer the repair to a second pass that sums each hunk's delimiter delta
per contiguous hunk (so backtick/block-comment state never bleeds across
non-adjacent hunks), suppresses it when the matching opener was deleted or
replaced just above the range, and consumes the residual per repair so a
genuine missing closer elsewhere in the patch still fires.

Fixes #3142
2026-06-20 23:28:28 +02:00
can1357 b91a15cbcf fix(coding-agent): ensured side-channel turns obfuscate secrets and tools
- Verified that side-channel turns maintain stable prompt cache parity with main turns.
- Applied secret and tool obfuscation to ephemeral assistant side-channel data to prevent leakage.
- Updated `Agent` and `AgentSession` test suites to validate consistency under native dialect environments.
2026-06-20 23:24:41 +02:00
roboomp 8b2012420f fix(mcp): sanitized startup failure status
Sanitized MCP failure text before it reaches the startup status formatter, including tabs, newlines, home paths, and long server output.

Fixes #3150
2026-06-20 21:23:27 +00:00
Can BölükandGitHub d82a042613 Merge pull request #3101 from DarkPhilosophy/fix/compaction-context-compression-aware
fix(compaction): floor context tokens by local estimate so payload compression can't suppress auto-compaction
2026-06-20 23:22:57 +02:00
can1357 64e44fd30f fix(coding-agent): preprompt / triggerContextTokens 2026-06-20 23:21:57 +02:00
DarkPhilosophyandcan1357 4d6597c4a9 test(compaction): cover the AgentSession floor wiring for deflated provider usage
Mirror of the provider-anchored handoff test: a ~20k-token stored conversation
whose provider usage was deflated to 1k (as a before_provider_request compressor
would) now triggers pre-prompt compaction, proving #estimateStoredContextTokens
floors the decision through the real call-site (not just the helper math).
2026-06-20 23:21:36 +02:00
DarkPhilosophyandcan1357 8c9ae9ef67 fix(compaction): exclude encrypted reasoning from the compaction floor
CI caught that flooring by the raw local estimate falsely triggers compaction on
thinking-heavy turns: estimateTokens counts the opaque thinkingSignature /
redactedThinking payloads (providers bill them on replay, #2275), but their local
byte size diverges wildly from what the provider actually charges — so a turn
with a large encrypted-reasoning blob but small provider usage would trip the
floor (broke agent-session-handoff 'provider-anchored usage' test).

estimateTokens now takes { excludeEncryptedReasoning } and the compaction floor
(#estimateStoredContextTokens) uses it: the floor counts only reliably-countable,
on-wire-compressible content (text, tool results, tool calls), while the provider
usage arm of compactionContextTokens still accounts for encrypted reasoning. This
keeps the encrypted-reasoning case provider-anchored while still flooring upward
when a before_provider_request hook compresses tool results.
2026-06-20 23:21:36 +02:00
DarkPhilosophyandcan1357 7e8450192c fix(compaction): floor context tokens by local estimate so payload compression can't suppress auto-compaction
A before_provider_request extension (a context-compression proxy like Headroom,
an obfuscator, or inline snapcompact) can shrink the outgoing request below the
real stored conversation. The provider then reports deflated prompt tokens, so
the auto-compaction threshold never fires and the stored history grows unbounded
until it overflows the context window and can no longer be compacted at all.

Add compactionContextTokens(provider, storedEstimate) = max(provider, estimate)
and apply it to both the pre-prompt and post-response compaction decisions,
flooring the provider-reported tokens by the agent's own estimate of the stored
conversation. Display and cost accounting still use exact provider usage; only
the compaction trigger takes the floor.
2026-06-20 23:21:36 +02:00
can1357 b5437c2cad feat(coding-agent): improved prompt caching for ephemeral side-channel requests
- Added `buildSideRequestContext` to the `Agent` class to generate prompt-cache-friendly provider contexts.
- Updated ephemeral side-channel turns to forward the full tool catalog to maintain prompt cache hit rates.
- Injected a `developer` role reminder into ephemeral turns to instruct the model to suppress tool calls.
- Implemented automatic post-processing to strip any tool calls from ephemeral turn responses.
- Exported message and dialect helper functions in `agent-loop.ts` to support context construction.
2026-06-20 23:19:10 +02:00
roboomp 655fed1e48 fix(mcp): updated startup connection status
Emitted MCP connection lifecycle events through the startup event bus so the TUI can replace the initial connecting banner with connected, pending, or failed server state.

Added manager and interactive-mode coverage for mixed success/failure MCP startup updates.

Fixes #3150
2026-06-20 21:14:41 +00:00
can1357 b88d97cd25 fix(coding-agent/session): prevented duplicate persistence of rewound tool results
- Added a set to track tool result IDs that have been rewound to ensure they are not re-appended to the session history.
- Updated message handling logic to conditionally skip persistence for tool results associated with active rewind operations.
2026-06-20 23:01:01 +02:00
can1357 81a4af6684 perf(coding-agent): deduplicated primary context messages in advisor history
- Implemented message deduplication in `AdvisorRuntime` to collapse verbatim re-injected primary context (plan rules/approved plans) between turns.
- Reduced token consumption by replacing identical primary context segments with a status marker.
- Updated history formatter to allow expansion of load-bearing context types specifically, while retaining one-line summaries for other custom messages.
2026-06-20 22:59:30 +02:00
can1357 60b043adb7 fix(coding-agent): fixed session history desynchronization during
- Fixed session history desynchronization during `rewind` by performing a full context rebuild after applying branch changes.
- Prevented `rewind` tool output and assistant side-channel data from polluting the prompt cache by flushing and sanitizing session state.
- Added explicit test coverage for context reconstruction and assistant message sanitization after rewind events.
2026-06-20 22:58:23 +02:00
can1357 66d9df6e1f ux(coding-agent): removed static pending icons from edit headers
- Remove the static "pending" hourglass icon from edit and write tool headers to reduce visual noise.
- Update multi-file status lines to use the active spinner icon directly instead of replacing a static icon, ensuring consistent liveness cues.
2026-06-20 22:46:12 +02:00
can1357 2cbac8889c docs(changelog): normalize [Unreleased] after #3135 2026-06-20 22:45:24 +02:00
Wolfgang Schoenbergerandcan1357 3cc601f28e fix(ai): retry transient Anthropic TLS errors 2026-06-20 22:45:24 +02:00
Can BölükandGitHub 47bb5172fe Merge pull request #3138 from KamijoToma/save-command-history
feat(coding-agent): save slash command text for /btw /tan /omfg /memory /rename /move to TUI history
2026-06-20 22:39:47 +02:00
can1357 34cac5dd55 docs(changelog): normalize [Unreleased] after #3087/#3022 2026-06-20 22:36:32 +02:00
can1357 321b51517a Merge PR #3022: refactor(coding-agent): use Promise.withResolvers in AsyncDrain (@oldschoola) 2026-06-20 22:36:13 +02:00
can1357 70d48a43c9 Merge PR #3087: fix(natives): gate unix-only test helpers and imports with #[cfg(unix)] (@oldschoola) 2026-06-20 22:35:58 +02:00
Can BölükandGitHub 18be1f6509 Merge pull request #3090 from oldschoola/fix/batch-test-ebusy-cleanup
fix(test): migrate fs.rmSync to removeSyncWithRetries in 5 more test files
2026-06-20 22:35:07 +02:00
Can BölükandGitHub c6126c75d9 Merge pull request #3083 from oldschoola/fix/pi-natives-clippy-dead-code
fix(natives): resolve pre-existing clippy dead-code warnings breaking CI
2026-06-20 22:33:51 +02:00
can1357 d8ec46eee5 fix(tiny): guard unsupportedReason access on const model-spec union (#3133 integration typecheck) 2026-06-20 22:25:29 +02:00
can1357 ad31ef212b docs(changelog): normalize [Unreleased] after PR integration 2026-06-20 22:23:36 +02:00
can1357 df581eee5f style: biome format inventory test slice (#3017 integration) 2026-06-20 22:23:18 +02:00
can1357 0f40ae3df0 test(coding-agent): drop obsolete inventory-layout assertion superseded by main's prompt reorder (#3017 integration) 2026-06-20 22:20:54 +02:00
can1357 c47b57a199 test(coding-agent): make inventoryFrom robust to prompt.md reorder
The prompt-inventory test sliced on the '# Inventory'/'ENV' markers from the
PR's merge-base prompt.md. On current main (chore: prompt reorder) the heading
is '# Tool Inventory' and the 'ENV' marker is gone, which is why the file was
deleted there. Accept either layout so the resurrected tests (incl. the SDK
'render provided tools' contract) pass after the cherry-pick.
2026-06-20 22:19:28 +02:00
can1357 9722505a2b Merge PR #3017: fix(coding-agent): handle todo paths and prompt inventory (@oldschoola)
# Conflicts:
#	packages/coding-agent/test/system-prompt-inventory.test.ts
2026-06-20 22:19:28 +02:00
can1357 ffc842ee7c fix(agent): reset promoted memory prompt on session fork
fork() reset mnemopi conversation tracking directly but skipped the shared new-transcript reset, so the folded/promoted first-turn memory stayed in #baseSystemPrompt. The next turn re-recalled and the change-detection saw no diff, taking the fallback promotion path and injecting the <memories> block twice into the forked session prompt. Route fork() through #resetMemoryContextForNewTranscript() like the other reset paths and add a regression test asserting the forked prompt contains recalled memory exactly once.
2026-06-20 22:16:58 +02:00
can1357 10ed2d4efa Merge PR #3113: fix(agent): preserve memory recall in append-only prompt cache (@roboomp) 2026-06-20 22:16:58 +02:00
can1357 1fadcdb8e3 Merge PR #3147: fix(agent): compact active goal yields (@roboomp) 2026-06-20 22:16:57 +02:00
can1357 afda2f1193 fix(coding-agent): move /omfg changelog entry to Unreleased
The PR placed the entry under the released [16.0.7] section with a
duplicate ### Fixed header, mutating released notes. Move it under
[Unreleased] per the repo changelog convention.
2026-06-20 22:16:57 +02:00
can1357 7bf8db9215 Merge PR #2946: fix(coding-agent): show omfg dismiss hint (@wolfiesch) 2026-06-20 22:16:57 +02:00
can1357 e3dd53affc Merge PR #2862: fix(tui): keep Alt+M role models selectable over context limit (@roboomp)
# Conflicts:
#	packages/coding-agent/test/model-selector-role-badge-thinking.test.ts
2026-06-20 22:14:28 +02:00
can1357 176d0a98a0 Merge PR #2995: fix(coding-agent): clarify temporary model picker (@riverpilot) 2026-06-20 22:13:07 +02:00
can1357 d3d88ce5c3 test(coding-agent): force startInAllScope in #3099 regression so it discriminates
The #3099 test omitted the startInAllScope flag, so it passed against the
buggy baseline too (empty folder defaults to folder scope regardless). Force
the removed flag via a cast to pin the real contract: even when a caller asks
for all-projects scope on an empty folder, the picker must stay folder-scoped.
Proven: passes on head src, fails on baseline src (renders '(all projects)').
2026-06-20 22:13:01 +02:00
can1357 31bb2144e7 Merge PR #3100: fix(coding-agent): keep /resume picker scoped to the current folder (@roboomp) 2026-06-20 22:13:01 +02:00
can1357 a76de2fea8 Merge PR #3089: fix(test): migrate fs.rmSync to removeSyncWithRetries for EBUSY-safe cleanup (@oldschoola) 2026-06-20 22:12:49 +02:00
can1357 61f3b54c86 Merge PR #3086: fix(test): use TempDir for Windows-safe cleanup in settings-manager tests (@oldschoola) 2026-06-20 22:12:49 +02:00
can1357 827edbec17 docs(changelog): correct legacy-compat entry placement and scope
Move the legacy pi-ai compat note from the released [16.0.5] section to
[Unreleased], and drop the inaccurate bare-`typebox` claim: bare
`typebox` specifier handling already exists on main (issue #2858,
TYPEBOX_SPECIFIER_FILTER / TYPEBOX_IMPORT_SPECIFIER_REGEX) and this PR's
diff does not touch it. The entry now scopes the change to the actual
delta: restored getModel/getModels aliases and StringEnum enum-object
support.
2026-06-20 22:12:49 +02:00