Commit Graph

4975 Commits

Author SHA1 Message Date
can1357 51ffdc20d8 fix(coding-agent/tools): merged ask tool answer rendering into the original question form
- Added a shared `renderAnswerOptions` helper that redrew answered options with markers, custom input, and cancellation state in-place.
- Set `mergeCallAndResult` to true so ask prompts now keep their question form visible while showing the final selection.
- Kept selection rendering consistent by preserving markers and option ordering while reusing the same layout for completed answers.
2026-06-04 01:34:13 +02:00
can1357 53aaced81f feat: enabled text-sizing and fixed OSC66 and DECCARA rendering behavior
- Added `textSizing` terminal capability and `tui.textSizing` setting for Kitty OSC66 scaling.
- Updated OSC66 range and visible-width handling to preserve grapheme slice behavior.
- Updated markdown rendering to apply heading text sizing only when enabled.
- Fixed DECCARA trailing-background fill tracking and DECRPM status 3/4 recognition.
2026-06-04 01:33:48 +02:00
can1357 ea105b4211 refactor(packages/coding-agent): reorganized notification flow and tests
- Updated completion and ask notifications to pass structured payloads.
- Updated completion and ask notifications to include explicit message metadata fields.
- Adjusted abort-guard and retry-capability tests for the new notification/options behavior.
2026-06-04 00:59:59 +02:00
can1357 48017b5f67 feat(packages/coding-agent): added terminal protocol debug diagnostics
- Added debug menu options for terminal state and protocol checks with new handlers.
- Added terminal diagnostics models and collectors to report geometry, protocol flags, and multiplexer data.
- Added protocol-probe utilities to encode RGB PNGs, generate sample content, and render test panels.
- Added support components for verbatim line rendering and OSC66-scaled text rows.
- Added tests validating image encoding, OSC66 output, and terminal state formatting.
2026-06-04 00:50:46 +02:00
can1357 33077363f9 feat(packages/tui): added kitty placeholder image and temp-file flow caps
- Added kitty-graphics module with Unicode placeholder and temp-file APIs.
- Refined terminal image handling to use rendered placeholder lines and detect placeholder output.
- Raised the max inline-image default from 3 to 8 in schema and image constants.
- Refined terminal capability flow for Kitty support, including screen-to-scrollback and text-sizing handling.
- Added integration tests for kitty placeholders, virtual placement, and temp-file rendering.
2026-06-04 00:50:46 +02:00
can1357 ead9e72602 feat(ai): classified account rate limits as quota exhaustion
- Added account rate-limit pattern matching for QUOTA_EXHAUSTED.
- Treated account rate limits as credential-rotatable usage limits.
2026-06-03 23:08:58 +02:00
can1357 b97ddeac94 feat(tui): added inline-image budget capping live graphics
- Added `ImageBudget` keeping only N recent images live, demoting older ones to text via a full redraw plus Kitty graphics purge.
- Changed Kitty images to transmit-once + placement, so repaints re-send only tiny placement sequences instead of base64.
- Added `tui.maxInlineImages` setting (default 3, 0 disables) wired through the coding-agent renderers.
2026-06-03 23:03:54 +02:00
can1357 8647ab6883 fix(fetch): repaired collapsed URL scheme from path normalization
- Restored `https:/` → `https://` before URL parsing and detection.
- Prevented path-normalized URLs from falling through to filesystem lookup.
2026-06-03 23:03:44 +02:00
can1357 13d116bf15 fix(hashline): treated empty replace hunks as deletes
- Updated the grammar to parse replace hunks with zero body lines.
- Changed empty replace execution to emit delete edits across the target range.
- Updated tests to verify empty replace syntax deletes lines while empty inserts still throw errors.
2026-06-03 22:53:19 +02:00
can1357 9a544b6ee0 feat(coding-agent): added radio markers for single-choice ask options
- Rendered single-choice questions with circular radio glyphs instead of checkboxes.
- Kept rectangular checkboxes for multi-select questions.
- Added radio.selected/unselected symbols to unicode, nerd-font, and ASCII presets.
2026-06-03 22:21:06 +02:00
can1357 5fbf4351d0 docs(coding-agent/prompts): updated screenshot docs to distinguish temporary and saved captures
- Rewrote the `tab.screenshot` documentation to explain transient screenshots auto-attach without requiring `save`.
- Added guidance that `save` should only be used when a full-resolution screenshot must be retained.
- Updated examples to show a pathless transient screenshot call and a separate persistent save variant.
2026-06-03 21:34:52 +02:00
can1357 a1a9176c19 fix(coding-agent/modes): collapsed hook option descriptions in compact overflow mode
- Updated hook option rendering to support description modes for full text, bounded rows, or hidden detail output.
- Adjusted compact-mode row budgeting so list height is based on labels, preventing a single description from consuming the visible budget.
- Added pre-wrapping with ellipsis truncation for selected option descriptions and updated overflow tests to validate the collapsed label-first behavior.
2026-06-03 21:34:07 +02:00
can1357 37f8d4109d test(tui): expanded TUI regression coverage for foreground-stream shrink handling
- Added an unreleased changelog note for foreground-tool shrink re-anchoring fix.
- Added a regression suite for ED3 foreground streaming with stable-row assertions.
- Extended the stress harness with ghostty mode and replaced the TTSR repro test with focused scenarios.
- Updated foreground-stream handling to preserve eagerEraseScrollbackRisk and use requestRender(false).
2026-06-03 21:16:33 +02:00
can1357 f967f9d789 chore: bump version to 15.8.3 2026-06-03 16:37:19 +02:00
can1357 2e14db49ca fix(coding-agent/utils): fixed jj workspace detection for non-default .jj/repo indirection
- Detection now recognized `.jj/repo` as workspace metadata whether it is a directory or a file.
- Repository resolution followed `.jj/repo` file indirection so non-default `jj workspace add` workspaces resolved their shared store path.
- Tests were added to confirm `jj.repo.is` and `jj.repo.resolve` handle file-backed `.jj/repo` workspaces correctly.
2026-06-03 16:37:03 +02:00
can1357 e1b2809154 feat(coding-agent): added plan read matching and compaction protection behavior
- Added shared `getReadToolPath` API to extract paired read `path` values for protection matchers.
- Added `createPlanReadMatcher` and session wiring so compaction prune/shake keeps active plan reads intact.
- Updated `todo-write` instructions to initialize every user-supplied plan item as an individual task.
- Added compaction tests validating plan reads are protected from prune and shake while regular reads are still removable.
2026-06-03 16:14:15 +02:00
can1357 139a995d84 chore: bump version to 15.8.2 2026-06-03 12:11:46 +02:00
can1357 ed5db7bf3a test(coding-agent): fixed hanging tests by using non-empty assistant content
- Empty `content: []` triggered the empty-stop guard, short-circuiting the agent_end handler before compaction checks ran.
- Replaced with a minimal text turn so auto-compaction queue resume tests complete under fake timers.
2026-06-03 10:48:48 +02:00
can1357 17b6de2fc7 test(ai): replaced curl-based LM Studio detection with model discovery
- Added async `discoverLmStudioModel()` to query the OpenAI and native LM Studio APIs, resolving the actual model id, name, and context window.
- Replaced hardcoded `execSync curl` availability check with API-driven discovery controlled by `PI_LOCAL_LLM` env var.
- Simplified compaction test spy to match on provider only, removing fragile context-marker filtering.
2026-06-03 10:17:43 +02:00
can1357 eda1a1056b feat(coding-agent): added matcherDigest hook for TTSR wire-format normalization
- Added optional `AgentTool.matcherDigest(args)` hook so tools can expose plain source text instead of wire-encoded arguments to TTSR rule matchers.
- Implemented `matcherDigest` on edit (all modes: hashline, patch, apply_patch, replace) and write tools, stripping patch prefixes and JSON escaping.
- Added `TtsrManager.checkSnapshot()` to replace the scoped buffer with a tool digest rather than appending raw deltas.
- Fixed TTSR conditions never matching streamed edit/write calls whose wire format obscured real content.
2026-06-03 10:05:24 +02:00
can1357 77f3c3ddf0 fix(tui): excluded win32 from ED3-risk scrollback erase checks
- Guarded eagerEraseScrollbackRisk with a win32 platform exclusion to avoid incorrect deferred mutations on Windows.
- Added early deferredMutation exit for unobservable ED3-risk shrinks outside foreground-tool streaming.
- Fixed viewport drift on direct-input shrinks by returning viewportRepaint when naturalViewportTop shifts.
- Removed unused #nativeViewportIsAtBottom helper.
2026-06-03 00:15:13 +02:00
can1357 6baa985672 feat(coding-agent): added ts-no-deprecated-leftovers builtin rule
- Warns against leaving `@deprecated` compatibility shims instead of finishing a refactor.
- Registered in the builtin rule index and covered by the defaults test.
2026-06-03 00:13:24 +02:00
can1357 bce01ce0db refactor(jj): restructured exports into namespaced repo and diff objects
- Grouped `isRepository`, `workspaceRoot`, and `clearWorkspaceRootCache` under a `repo` namespace (`repo.is`, `repo.root`, `repo.clearRootCache`).
- Promoted `diff` to a named export with a `changedFiles` sub-method via `Object.assign`.
- Added `ensureAvailable` check and `nameOnly` support to `diff`.
- Updated callers and tests to use the new API surface.
2026-06-03 00:13:05 +02:00
can1357 9b4a951919 refactor(jj): replaced subprocess-based workspace detection with fs walk
- Replaced `jj workspace root` subprocess call with a local `.jj/repo/store` directory traversal, eliminating process spawning overhead.
- Added LRU cache for resolved workspace roots to avoid redundant filesystem walks.
- Renamed internal `runCommand` helpers to `git`/`jj` for clarity.
- Replaced git subprocess setup in review test with mocked `git.status` and `git.diff` calls.
2026-06-03 00:10:23 +02:00
Can Bölük f936122e60 Merge branch 'main' into jj-support-in-review 2026-06-03 00:59:35 +03:00
Can Bölük 486090d72e Merge branch 'main' into fix/empty-stop-guard 2026-06-03 00:45:49 +03:00
Can Bölük c96d5111a1 Merge pull request #1724 from Kukkerem/feat/discoverable-builtin-names
feat(coding-agent): name discoverable built-in tools in search_tool_bm25 description
2026-06-03 00:43:25 +03:00
can1357 cd9fc55572 fix: aborted internal background jobs during shell cancellation
- Added Job::abort_internal_tasks to abort internal async tasks and drop their join handles.
- Updated shell cancellation paths to call this abort logic and handle mutable shell job lists before signaling remaining process groups.
- Added Rust and TypeScript tests that verify cancellation prevents background shell jobs from completing after abort.
2026-06-02 19:30:40 +02:00
zolszabo f878eb97c6 Merge remote-tracking branch 'origin/main' into feat/discoverable-builtin-names 2026-06-02 18:18:23 +02:00
can1357 ecc5a6d5d5 chore: bump version to 15.8.1 2026-06-02 18:15:17 +02:00
can1357 2debe7c924 Merge branch 'farm/1089210f/bug-unhandled-epipe-rejection-in-stdiotr' 2026-06-02 18:14:09 +02:00
can1357 46bbf70d49 Merge remote-tracking branch 'origin/farm/316bc3ee/fix-tui-image-paste' 2026-06-02 18:14:04 +02:00
zolszabo 55f0d97f0b feat(coding-agent): name discoverable built-in tools in search_tool_bm25 description
Surface the hidden discoverable built-in tool names (write, find, search, lsp, task, ...) in the search_tool_bm25 description when tools.discoveryMode is "all", so a model can form a targeted BM25 query by name instead of guessing or falling back to shell. mcp-only mode is unchanged (no built-ins advertised) and the total-tools count still includes them.
2026-06-02 17:55:28 +02:00
roboomp d28bee5db0 fix(providers): loaded special provider model cache
Loaded cached startup models for special built-in providers alongside standard provider descriptors so boot-time model resolution can see cached Google Antigravity, Gemini CLI, and OpenAI Codex discoveries before refresh.\n\nFixes #1721
2026-06-02 15:55:01 +00:00
roboomp 6598c69a2f fix(mcp-stdio): made close() unconditional in resource teardown
Per second review on #1711: when notify()'s write failed, #handleClose()
flipped #connected=false before the throw. connectToServer()'s catch
then called transport.close(), but close() early-returned because
#connected was already false — so #process.kill() and the readLoop
await never ran. A subprocess that closed its stdin without exiting
(parent EPIPE, transport dead, subprocess alive) would leak.

close() no longer guards on #connected for the resource phase. It still
calls #handleClose() once (idempotent — only if #connected is true), then
unconditionally walks the cleanup chain (kill process, null #process,
await + null #readLoop), each step individually guarded so repeat calls
remain no-ops. onClose still fires exactly once per transport lifetime.

Two new tests in StdioTransport.close: (1) close() called after the
read-loop has already EOF'd and torn down still completes cleanup
without throwing and without re-firing onClose; (2) repeated close()
calls fire onClose exactly once and leave #connected=false.
2026-06-02 12:35:35 +00:00
roboomp b870732258 fix(mcp-stdio): surfaced notify() write failures so handshake fails loudly
Per review on #1711: when the write inside notify() fails (FileSink EPIPE
on Windows during the initialize/notifications-initialized race), silently
closing the transport while still resolving the notify promise let
initializeConnection() return a 'connected' handle wrapping a dead
transport. The manager only wires its reconnect onClose handler after
connectToServer() resolves, so a swallowed handshake failure would
neither reconnect nor fail the connection — it would just leak.

notify() now still calls #handleClose() on write failure (so any wired
onClose runs) but additionally throws `Transport closed while sending
notification "<method>"`. The single in-tree notify caller is
initializeConnection() at client.ts:122; the rejection propagates into
connectToServer()'s catch (which closes the transport and rethrows) and
on into the manager's pending-connection error path. #sendResponse() is
unchanged — silent on failure, since a dead subprocess has no use for
the response.

Test coverage updated to document the surfaced-rejection contract and
also assert transport.connected flips to false.
2026-06-02 12:28:07 +00:00
roboomp 3dacaf263f fix(mcp-stdio): swallowed EPIPE from notify and sendResponse stdin writes
StdioTransport.notify() and #sendResponse() wrote to the subprocess's
stdin without try/catch, while the sibling request() already wrapped the
same write/flush. The #connected guard cannot close the race: connect()
sets it synchronously; #handleClose() only clears it from the read loop's
finally after EOF on stdout — strictly later than the parent's next
stdin write. When an MCP server exits between the initialize response and
the notifications/initialized notification, Bun's FileSink throws EPIPE
synchronously on Windows and the async notify wrapper surfaces it as an
unhandled rejection.

Route both call sites through a new writeFrame(stdin, frame) helper that
catches synchronous sink failures and returns a boolean. notify() now
tears the transport down via #handleClose() on failure so the reconnect
machinery engages; #sendResponse() stays silent because a dead subprocess
has no use for the response. The redundant inner try/catch around
#sendResponse in #handleServerRequest() is removed.

Fixes #1710
2026-06-02 12:22:23 +00:00
roboomp 56c47e8447 style: bun run fix 2026-06-02 11:15:22 +00:00
roboomp 5174ba0155 fix(tui): registered ctrl-v image paste on windows
Kept Ctrl+V as a default clipboard-image paste shortcut on Windows while preserving Alt+V as the Windows Terminal-safe fallback.

Updated keybinding docs and regression coverage for the platform-specific default.

Fixes #1708
2026-06-02 11:15:09 +00:00
Patrik Sundberg 5f5c61465a Document JJ utility exports 2026-06-02 11:45:18 +01:00
can1357 ffbdc1056a test(coding-agent): removed CLI help load-order regression test from coding-agent
- Deleted `cli-help-load-order.test.ts` from `packages/coding-agent/test`.
2026-06-02 12:39:53 +02:00
can1357 a09b1de9f8 test(coding-agent): added timeout and teardown safety to streaming edit tests
- Defined a 20-second timeout constant for randomized streaming-edit patch tests and passed it to the success and failure cases.
- Restructured per-seed cleanup to await session disposal inside a nested finally block before closing auth storage.
- Preserved existing assertions for abort behavior while running each random chunk stream through the updated paths.
2026-06-02 12:37:12 +02:00
can1357 6c4421f3fc test(coding-agent): removed claude-trace CLI integration tests
- Deleted `packages/coding-agent/test/claude-trace-cli.test.ts`, removing tests for Claude trace CLI option parsing and message capture behavior.
2026-06-02 12:25:03 +02:00
Patrik Sundberg f5114a4ba9 Support JJ workspaces in review 2026-06-02 10:45:58 +01:00
can1357 e214b92240 chore: bump version to 15.8.0 2026-06-02 11:17:17 +02:00
can1357 f53efd75ca test(coding-agent/discovery): updated discovery plugin name expectations in tests
- Updated listClaudePluginRoots test assertions to expect unprefixed skill identifiers.
- Adjusted both manifest and outside-skill discovery expectations to match the updated naming.
- Ensured the tests now look for plain skill names instead of namespaced values.
2026-06-02 11:16:56 +02:00
can1357 fbed7d1787 fix: expanded tool argument parsing to accept delimiter-separated paths
- Expanded path parsing to split top-level comma, semicolon, and whitespace entries.
- Updated find/search and scope resolution to apply delimiter expansion before path-spec validation.
- Updated read tool fallback to try split path parts before raising missing-path errors.
- Coerced bare string arguments into singleton arrays for array-typed schemas.
2026-06-02 11:14:02 +02:00
can1357 7f3e17a3b6 feat(ai): added rate-limit header warming for Anthropic usage cache
- Added `parseClaudeRateLimitHeaders` to extract 5h/7d utilization from `anthropic-ratelimit-unified-*` response headers.
- Added `AuthStorage.ingestUsageHeaders` to warm the per-credential usage cache from headers, throttled to 60s per key.
- Merges header-derived limits onto the last full usage report, preserving per-tier data not present in headers.
- Wires ingestion into `AgentSession` on each Anthropic response to reduce direct OAuth `/usage` probes.
2026-06-02 10:50:54 +02:00
can1357 b2fa0ad0f9 Merge remote-tracking branch 'fork-jacobzyy/fix/marketplace-plugin-skills-loading' 2026-06-02 10:33:38 +02:00
can1357 f245c41929 chore: fix changelogs 2026-06-02 10:32:24 +02:00