Commit Graph
7277 Commits
Author SHA1 Message Date
can1357 126f4e8dcf feat(coding-agent): replaced /copy subcommands with picker tree
- Added a fullscreen /copy tree of recent assistant messages with nested code blocks and a live preview pane.
- Removed the /copy last|code|all|cmd subcommands in favor of tree selection.
- Extracted copy-target assembly into a testable util.
2026-06-06 15:15:54 +02:00
can1357 6d99f2e740 feat(model-selector): disabled models below current context size
- Dimmed models whose context window is smaller than current usage.
- Skipped disabled entries during navigation and selection.
- Showed context-limit suffix and warning for unselectable models.
2026-06-06 15:10:14 +02:00
can1357 4b36eb2da4 feat(tui): added deferred bottom-row repaint for unknown viewports
- Repainted only the active-grid tail row relative to the tracked hardware cursor so a scrolled reader's history stays intact.
- Let bottom-anchored spinner/status chrome advance while the real scrollback mutation stays deferred.
- Deferred completely instead of repainting when there is no direct input or eager streaming.
2026-06-06 15:06:06 +02:00
can1357 c281f817ac fix(tui): repainted unobservable viewport instead of deferring
- Treated an unknown viewport position as at-bottom so zero-byte frames no longer froze the spinner/footer.
- Repainted for liveness while keeping native scrollback dirty; known-scrolled readers stay deferred.
- Dropped the redundant deferredMutation branch in the append path.
2026-06-06 15:00:33 +02:00
can1357 8b077cde58 perf(coding-agent): memoized native syntax highlighting
- Cached (lang, code) highlight output via LRU, invalidated on theme change.
- Stopped re-tokenizing unchanged code through Rust FFI every render frame.
- Prevented TUI freeze from animated tool blocks overrunning the frame budget.
2026-06-06 15:00:33 +02:00
can1357 f4730a0530 fix(coding-agent): capped streaming eval call preview to max lines
- Stopped expanding the volatile tool block so a >100-line code arg no longer overflows the viewport.
- Kept streaming and resolved render shapes consistent at codeMaxLines.
2026-06-06 14:43:35 +02:00
can1357 0068918f42 fix(ai): dropped scope:global from CC system cache control
- Removed global scope field rejected by third-party Anthropic proxies.
- prompt-caching-scope only works against canonical api.anthropic.com.
2026-06-06 14:41:03 +02:00
can1357 b9b9830b2e fix(claude-trace): skipped background haiku warmup in trace capture
- Detected Claude Code's small-fast-model classification call by model name.
- Dropped it from the proxy so capture lands on the real user prompt.
2026-06-06 14:35:56 +02:00
can1357 d6b40bf4f2 fix(tui): preserved bottom anchor on ED3-risk autocomplete shrink
- Padded direct-input shrink frames to clear stale popup rows without re-exposing committed scrollback.
- Repainted live viewport when offscreen edits shift rows above the viewport top.
- Prevented diff-append from duplicating the prefix at the scrollback seam on transient UI growth.
- Added scroll-buffer assertions to the autocomplete viewport test.
2026-06-06 14:35:03 +02:00
can1357 2d0f62eb69 refactor(coding-agent): replaced list count indicators with ScrollView
- Wrapped selector and overlay list windows in ScrollView for proportional right-edge scrollbars.
- Dropped numeric position/count footers in favor of the scrollbar.
- Simplified SelectList status line to search hints only.
- Added ED3-risk autocomplete repaint test for POSIX terminals.
2026-06-06 14:20:41 +02:00
can1357 dafc6e9e50 docs(tui): documented core renderer invariants and failure modes
- Added tui-core-renderer.md covering yank/corruption/flash/width faults.
- Linked the new doc from runtime internals and the tui.ts header.
- Refreshed runtime-internals to match current boot and render-intent flow.
2026-06-06 14:13:26 +02:00
can1357 36b6f0e9b5 fix(tui): allowed direct-input frames to repaint ED3-risk viewport
- Permitted autocomplete/IME frames to repaint the live viewport in place.
- Prevented stale autocomplete rows from lingering until next checkpoint.
- Kept full deferral when neither direct input nor eager streaming is active.
2026-06-06 14:10:50 +02:00
can1357 76ca917bfd fix(coding-agent-eval): suspended idle timeout during delegated bridge calls
- Added timeout pause/resume control ops and helper to suspend idle timers during bridge work.
- Fixed TimeoutError on long delegated agent()/llm() calls by pausing timeout while silent.
- Updated IdleTimeout with reference-counted pauses, ignored checks while paused, and resumed fresh.
- Replaced heartbeat keepalives with timeout-control events in bridge paths and status routing.
2026-06-06 14:02:04 +02:00
Can BölükandGitHub 58918be827 Merge pull request #1969 from enieuwy/add-tui-scroll-view
Add ScrollView component
2026-06-06 13:51:03 +02:00
Can BölükandGitHub afd33ece97 Merge branch 'main' into add-tui-scroll-view 2026-06-06 13:50:52 +02:00
can1357 4c5b1eb41d test(coding-agent): raised async job manager singleton test timeouts
- Raised the timeout on four `sdk-async-job-manager-singleton` session tests to 60000ms to reduce flakes in parallel runs.
- Adjusted the asynchronous singleton cases to avoid timeout races between long session startup and teardown.
- Recorded the timeout stabilization in the package changelog entry.
2026-06-06 13:48:06 +02:00
Can BölükandGitHub cc1a13aab2 Merge pull request #1929 from metaphorics/fix/retry-model-fallback-toggle
fix(coding-agent): allow retry without model fallback
2026-06-06 13:47:39 +02:00
Can BölükandGitHub 7cc7282034 Merge branch 'main' into fix/retry-model-fallback-toggle 2026-06-06 13:47:25 +02:00
Can BölükandGitHub 305e748fe4 Merge pull request #1988 from QianYan-Art/fix/ttsr-enabled-1767
fix(coding-agent): honor ttsr.enabled: false in TtsrManager
2026-06-06 13:45:39 +02:00
Can BölükandGitHub e8f1cbb7d3 Merge branch 'main' into fix/ttsr-enabled-1767 2026-06-06 13:45:30 +02:00
can1357 84325d4536 chore: reformat 2026-06-06 13:39:50 +02:00
can1357 0a6caab81b Merge remote-tracking branch 'origin/farm/a9bf4256/edit-tool-allow-spaces-in-path' 2026-06-06 13:39:33 +02:00
can1357 52c1f62028 Merge remote-tracking branch 'origin/farm/75ea0bb0/fix-review-render-yield-non-array' 2026-06-06 13:38:59 +02:00
can1357 f7974e0f23 Merge remote-tracking branch 'origin/farm/f646bd45/fix-windows-ctrl-enter-followup' 2026-06-06 13:38:52 +02:00
can1357 195ccef969 Merge remote-tracking branch 'origin/farm/5e8523ec/bug-ci-cd-slash-autocomplete-viewport-te' 2026-06-06 13:38:46 +02:00
can1357 604cf9fae6 Merge remote-tracking branch 'origin/farm/fd5abf01/support-rust-analyzer' 2026-06-06 13:38:37 +02:00
can1357 28ee7f8872 Merge remote-tracking branch 'origin/farm/e838b822/tui-tmux-scrollback-rendering' 2026-06-06 13:38:32 +02:00
can1357 577b72b5a1 Merge remote-tracking branch 'origin/farm/7fc89500/resume-input-invisible' 2026-06-06 13:38:18 +02:00
can1357 050b5e9378 Merge remote-tracking branch 'origin/farm/801c5304/fix-llamacpp-parallel-tool-args' 2026-06-06 13:38:10 +02:00
can1357 68bca20f91 Merge remote-tracking branch 'origin/farm/3b6df793/fix-chat-render-lag' 2026-06-06 13:37:54 +02:00
can1357 a275459be6 Merge remote-tracking branch 'origin/farm/4014d045/fix-python-eval-windows-numpy-import-hang' 2026-06-06 13:37:32 +02:00
roboomp 1ffa6dc6fb fix(coding-agent): guarded task renderer against non-array yield slot
renderAgentResult and the live-progress sibling cast
extractedToolData?.yield to Array<{ data }> and called ?.map without
checking the actual runtime shape. Optional chaining only short-circuits
on null/undefined, so any stray non-array value (a single yield object
landing in the slot) made .map undefined and threw
TypeError: completeData?.map is not a function — taking down every
`review` task render.

Both sites now route through a new normalizeYieldData helper (next to
normalizeReportFindings) that returns an array of yield records: it
preserves arrays unchanged, wraps a single object as a 1-element array
so the verdict still renders, and drops primitives. Added a regression
test exercising the result branch, the progress branch, the primitive
fall-through, and the canonical array shape — all of the failing-branch
ones reproduce the crash on the pre-fix renderer.

Fixes #1987
2026-06-06 11:16:44 +00:00
QianYan-Art 55c4efec4e fix(coding-agent): honor ttsr.enabled: false in TtsrManager
`TtsrManager` previously ignored the `ttsr.enabled: false` toggle:
- `addRule()` still registered rules, so `bucketRules` demoted them
  to the TTSR bucket and dropped the rulebook/alwaysApply fallback
- `hasRules()` still returned true, so `AgentSession` entered the
  TTSR matching path on every message_update
- `checkDelta` / `checkSnapshot` (via `#matchBuffer`) still matched
  patterns and could abort the stream and inject system reminders

Gate all three public-ish entry points on `#settings.enabled` so
disabling TTSR short-circuits the whole path. Condition rules fall
through to the rulebook bucket in `bucketRules` instead of being
silently swallowed.

Closes #1767
2026-06-06 04:05:04 -07:00
roboomp 09c8bf0f9a fix(keybindings): ignored stale Ctrl+Q config claims
The Ctrl+Q follow-up fallback should only be removed when a recognized
keybinding action claims that chord. Unknown or stale config entries are
ignored by the keybinding manager and should not suppress a working
follow-up default.

Addresses code review on #1905.
2026-06-06 08:39:05 +00:00
roboomp b866cd8c71 test(tui): widened slash autocomplete settle slack past debounce jitter
The slash-autocomplete-viewport test's settle() slept only 120ms after
each keystroke — 20ms over Editor's 100ms autocomplete debounce. The
post-debounce flow is debounce timer + microtask + a 16ms throttled
render before the new (filtered) list lands, leaving ~4ms of headroom
once the debounce fires. macOS setTimeout jitter reliably consumed that
margin, so the stale unfiltered menu was still being painted at
getViewport() time and pushed the live editor row out of the 6-row
viewport, surfacing 'Expected to contain: "/m"' against the rendered
menu.

Sleep 250ms instead and document the budget so a future trim doesn't
quietly regress the slack.

Fixes #1979
2026-06-06 08:11:41 +00:00
roboomp 9c8a6d208f fix(lsp): handled workspace/workspaceFolders requests
Returned the current workspace folder list when a server queried workspace/workspaceFolders after initialization so advertising the capability no longer left late requests answered with -32601.
2026-06-06 06:38:27 +00:00
roboomp cdcf74bb07 fix(lsp): opened rust analyzer files before workspace wait
Ensured rust-analyzer textDocument/didOpen ran before workspace readiness polling so the server could discover the file's Cargo workspace, and skipped the readiness wait entirely for standalone .rs files outside any Cargo workspace ancestor.
2026-06-06 06:32:41 +00:00
roboomp 17089d1702 fix(lsp): retried rust analyzer status timeouts
Continued rust-analyzer workspace readiness polling across transient analyzerStatus request timeouts while preserving early exit for unsupported methods and server failures.
2026-06-06 06:23:00 +00:00
roboomp e3107fa7b4 fix(lsp): supported rust analyzer workspaces
Advertised workspace folder support during LSP initialization and waited for rust-analyzer to finish loading Cargo workspaces before opening project-indexed files.

Fixes #1976
2026-06-06 06:17:39 +00:00
roboomp 0a2b17e02b style: bun run fix 2026-06-06 05:50:23 +00:00
roboomp c7cb45105b fix(tui): commit tmux pane history during streaming via pinned emit
Inside tmux (and other multiplexers) a long streamed assistant reply
lost its scrolled-off head from pane history and the persistent chrome
got pushed in alongside it, producing 'repeating chunks and missing
sections' when the user scrolled back through tmux pane history.

The foreground-streaming cap-to-viewport branch added in 15.9.2 for
ED3-risk hosts that can checkpoint-rebuild later also activated inside
multiplexers, where checkpoint reconcile is a no-op
(`refreshNativeScrollbackIfDirty` short-circuits because `CSI 3 J`
cannot erase pane history). Every streaming frame clipped `lines` to
the visible tail and reset `#scrollbackHighWater` to 0, so any row that
scrolled above the viewport top was committed nowhere.

Meanwhile `#planLiveRegionPinnedRender` was explicitly disabled for
multiplexers, but its `#emitLiveRegionPinnedRepaint` is built from the
exact primitives tmux accepts (relative cursor moves, per-line
`CSI 2 K`, `\r\n` to scroll the sealed prefix past the viewport bottom)
and never emits `CSI 2 J`/`CSI 3 J`. Enable the pinned planner inside
multiplexers and exempt them from the cap so the sealed prefix of an
append-only live block commits to pane history incrementally while the
actively-mutating live tail stays in the viewport only.

Fixes #1974
2026-06-06 05:50:15 +00:00
roboomp 4a83507408 fix(tui): honored resume clear replay before initial paint
Fixes #1972
2026-06-06 05:00:03 +00:00
roboomp 699adfb386 fix(ai): preserved llama parallel tool args
Route identifierless Responses function_call_arguments.done events through open function calls in item order so local llama.cpp streams keep each parallel tool's final arguments.

Fixes #1970
2026-06-06 04:30:05 +00:00
enieuwy 888e63bb24 Add ScrollView component 2026-06-06 12:18:03 +08:00
roboomp ed1b26de52 fix(tui): guarded overlay rebuild against ed3-risk arrow input
Extended the dirty-scrollback ED3-risk focused-input suppression to the visible-overlay branch so overlay selectors (session observer, model picker, etc.) do not trigger CSI 3 J plus full transcript replay on each Up/Down keypress. Non-ED3-risk POSIX terminals still honor direct-input/IME/autocomplete unknown-viewport opt-ins.

Fixes #1962
2026-06-06 02:06:54 +00:00
roboomp 486ff78539 fix(tui): preserved safe scrollback opt-ins
Kept ED3-risk unknown-viewport focused input from replaying dirty scrollback while preserving explicit unknown-viewport rebuild opt-ins for non-ED3-risk POSIX terminals.

Fixes #1962
2026-06-06 02:02:38 +00:00
roboomp c1c54e2211 fix(tui): avoided dirty scrollback replay on arrow input
Prevented focused input frames on ED3-risk unknown-viewport terminals from using stale native scrollback dirtiness as permission to emit CSI 3 J and replay the whole transcript. Added an issue #1962 regression covering Up/Down selector movement after foreground streaming dirties scrollback.

Fixes #1962
2026-06-06 01:56:37 +00:00
roboomp 7fcdfd048f fix(hashline): rejected malformed snapshot tag suffixes
Aligned the runtime header parser with the formal grammar's no-`#`-in-filename rule: any `#` left in the path body after detecting the trailing `#XXXX` tag means the header is malformed (short `#1A2`, non-hex `#1A2G`, over-long `#1A2B5`, stale-tag copy-paste, line-suffixed tags), not a path with an embedded hash. Mirrored the same rule on the apply_patch recovery path.

Added strict and recovery regression coverage for the three malformed-tag shapes the reviewer named.
2026-06-06 01:43:50 +00:00
roboomp 7e42c281f8 fix(hashline): rejected line suffixes after snapshot tags
Rejected headers such as ¶src/file.ts#1A2B:42 as malformed headers instead of treating the whole tail as a hashless path and failing later in body parsing.

Added strict and apply_patch-recovery regression coverage for line-suffixed snapshot tags.
2026-06-06 01:38:02 +00:00
roboomp 52f86e9445 fix(hashline): rejected stale-tag junk after section header
Tightened the relaxed header parser so a 4-hex token sitting before whitespace + more content (e.g. `¶src/a.ts#1A2B copied from read`) still raises the focused "must be ¶PATH or ¶PATH#TAG" diagnostic instead of being silently re-interpreted as a hashless path.

Also stopped rejecting hashless paths whose last five characters look like #TAG with a non-hex digit, and mirrored the same anti-junk rule in the apply_patch recovery parser.
2026-06-06 01:38:01 +00:00