Commit Graph
9801 Commits
Author SHA1 Message Date
chan1103 44daed1fff fix(coding-agent/edit): sealed inverse video and preserved gutters in wrapped diff rows
Two wrap artifacts in the Edit result card, both in wrapEditRendererLine:

- A row that broke inside an intra-line diff highlight ended with inverse
  video still active (only the foreground was reset), so the frame's
  right-edge padding painted as a default-foreground block. Every wrapped
  diff row now closes inverse alongside the foreground reset; the next row
  re-opens its own state, so highlights spanning the break render the same.

- The gutter matcher required a marker at column 0 immediately followed by
  digits, a shape only produced when marker and number exactly fill the
  gutter. Left-padded gutters (" -42│", any line number narrower than the
  widest in the diff) and dedup-blanked gutters ("   +│" on the added row
  of a single-line replacement) fell back to generic wrapping, so their
  continuation rows escaped into the line-number column. │-separated gutters
  now accept padded and blank line numbers; ASCII "|" gutters still require
  the canonical marker+number shape emitted by the plain fallback, so body
  lines that merely start with "|", "   |", or "123|" keep wrapping
  generically.

Regression tests cover continuation-gutter containment, net-inverse-off at
every row end (with a precondition proving a highlight actually crossed a
break), phantom-gutter rejection for pipe- and digit-leading body lines, and
the plain-fallback canonical-row path.
2026-07-06 00:34:23 +09:00
can1357 3458b037ae chore: update tests 2026-07-05 16:53:07 +02:00
can1357 8519286ef7 feat(coding-agent): implemented watchdog and abort logic for lsp notifications
- Implemented a 2-second timeout for `workspace/didChangeWatchedFiles` notifications to prevent agent stalls during server congestion.
- Updated `runLspWritethrough` to gracefully reset notification state when the internal watchdog triggers but the primary operation remains active.
- Added explicit abort signal checks in `acp-bridge` to prevent initiation of file writes after tool cancellation.
- Refactored `notifyWorkspaceWatchedFiles` to use `AbortSignal.any` for unified signaling across timeout and caller-provided triggers.
2026-07-05 15:57:24 +02:00
can1357 da705d76e6 feat(coding-agent): unified resolution logic for deferred model patterns
- Enabled comma-separated string splitting within array-based model patterns.
- Expanded deferred model patterns before registration to align with immediate resolution behavior.
- Unified resolution logic to ensure deferred patterns support the same role aliases and chaining as the standard path.
2026-07-05 15:57:24 +02:00
roboomp 1e937cc756 fix(coding-agent): refreshed advisor on role model changes
Rebuilt active advisor runtimes when modelRoles.advisor changes so live sessions stop using stale advisor models.

Added regression coverage for advisor role updates reaching the live advisor without a manual /advisor restart.

Fixes #4612
2026-07-05 13:04:15 +00:00
roboomp c92cf0a905 fix(discovery): load Claude plugin skill paths that point at a SKILL.md directory
Claude plugin manifests may declare a `skills` path that resolves directly to a
directory whose `SKILL.md` IS the skill (e.g. `"skills": ["./"]` or a
subdirectory containing only `SKILL.md`). `scanSkillsFromDir` only scanned
`<dir>/<name>/SKILL.md` children, so the single-skill directory layout — the
common shape the Claude plugins reference documents for plugins shipping one
skill — silently dropped every array-form manifest entry that pointed at it.

Add an opt-in `includeSelf` flag to `ScanSkillsFromDirOptions`: when set,
`<dir>/SKILL.md` (if present) is loaded as a skill in addition to the existing
child scan. The Claude plugin skills loader opts in; every other provider
(agents, builtin, claude.ts, codex, github, omp-plugins, opencode) keeps the
strict child-scan semantic they rely on. Frontmatter `name` still wins over
the directory basename fallback.

Regression test: `skills: ["./single"]` where `./single/SKILL.md` is the only
skill file loads the skill under its frontmatter name.
2026-07-05 12:23:18 +00:00
roboomp c42d2b2907 fix(discovery): load file-form Claude plugin commands
Claude plugin manifests allow command path entries to name either directories
or flat `.md` command files. The array resolver was now preserving those file
paths, but `loadSlashCommands` still sent every resolved entry through
`loadFilesFromDir`, which only globs inside directories. A manifest such as
`{"commands":["./custom/deploy.md"]}` therefore replaced the default scan
and then loaded nothing.

Teach the command loader to stat each resolved entry: `.md` files are read as
single slash commands with the same plugin namespace and source metadata as
directory-loaded files; directories continue through `loadFilesFromDir`.
Missing entries keep the existing silent-empty behavior.

Add a regression test covering a mixed array of a direct command file and a
command directory while proving default `commands/` remains replaced unless
listed explicitly.
2026-07-05 12:16:02 +00:00
roboomp f276d80fc4 fix(discovery): honour per-field Claude plugin path merge semantics
Review feedback on #4610: array-form skills was silently replacing the
default `skills/` scan when the manifest declared any explicit entries.
Per the Claude plugins reference "Path behavior rules"
(https://code.claude.com/docs/en/plugins-reference#path-behavior-rules):

- `skills` ADDS to the default `skills/` scan
- `commands` / `slash-commands` REPLACE the default `commands/` scan

`resolvePluginDir` now takes an explicit `includeFallback` flag. `loadSkills`
passes `true` (fallback + declared entries, deduped by resolved absolute
path so a manifest may still list `./skills` alongside extras without
double-load); `loadSlashCommands` passes `false` (replace semantic
preserved). Deduplication keeps the fallback first and declared entries
in manifest order.

Regression tests cover both semantics: skills-array merges with default
`skills/`; commands-array replaces default `commands/` so a stray
`commands/default.md` no longer loads once the manifest declares an
alternative — matching Claude's documented behavior.
2026-07-05 12:09:22 +00:00
roboomp d9ef874e2b fix(discovery): accept array-form Claude plugin manifest paths
The Claude plugin manifest allows `commands`, `slash-commands`, and `skills`
to be either a single string or an array of strings — documented under
https://code.claude.com/docs/en/plugins-reference#path-behavior-rules and
used by real marketplace plugins such as addyosmani/agent-skills whose
plugin.json declares `"commands": ["./.claude/commands", "./commands"]`.

`resolvePluginDir` in `packages/coding-agent/src/discovery/claude-plugins.ts`
typed those manifest fields as `string` only, so array-shaped values were
silently dropped: no items loaded, no warning surfaced. Slash commands
(`spec`, `plan`, `build`, `test`, `review`) never appeared in the picker.

Normalize `string | string[]` at the resolver, load every in-root entry,
and emit one out-of-plugin-root warning per bad entry so misconfigured
paths remain observable. Skills and slash-command loaders now fan out over
the resolved directory list and merge warnings from all sources.

Fixes #4609
2026-07-05 12:02:47 +00:00
can1357 b3c661f164 Merge PR #4272: perf(session): cache persisted-message keys, invalidate on branch change (@metaphorics) 2026-07-05 13:39:11 +02:00
can1357 e4f05ae182 Merge PR #4266: fix(config): cache failed !command resolutions, bound dynamic fetch timeout (@metaphorics) 2026-07-05 13:39:10 +02:00
can1357 f3e372e7bf fix(tui): preserve agent hub persisted gating 2026-07-05 13:39:10 +02:00
can1357 507e0fae4d Merge PR #4268: perf(tui): load persisted subagents asynchronously (@metaphorics) 2026-07-05 13:39:10 +02:00
can1357 1db9277346 Merge PR #4267: perf(tui): memoize copy-selector preview highlight across renders (@metaphorics) 2026-07-05 13:39:09 +02:00
can1357 64eab4e1c6 Merge PR #4273: fix(eval): surface unexpected JS eval worker exit via close listener (@metaphorics) 2026-07-05 13:39:09 +02:00
can1357 336e1529dc Merge PR #4271: fix(task): abort underlying MCP call when proxy tool timeout fires (@metaphorics) 2026-07-05 13:39:09 +02:00
can1357 c984dc554c Merge PR #4274: perf(export): skip TTSR delta buffering when no rule matches text/thinking (@metaphorics) 2026-07-05 13:39:09 +02:00
can1357 91db5eb661 Merge PR #4265: fix(bash): delete pre-created snapshot file on creation failure (@metaphorics) 2026-07-05 13:39:08 +02:00
can1357 00076fd9b3 test(coding-agent): covered docs.rs gunzip cap via extracted seam
- Extracted gunzipRustdocJson() with overridable maxOutputLength so the cap contract is testable with real gzip payloads instead of the banned mock.module().
2026-07-05 13:31:22 +02:00
can1357 59976e7d82 style: removed dead test helpers and formatted merged tests 2026-07-05 13:26:57 +02:00
metaphoricsandcan1357 a82bbd89d7 fix(tui): keep queued-message rows out of scrollback
Op: correct

Restores: spec: queued-message live rows must not be committed to native scrollback
2026-07-05 13:25:36 +02:00
can1357 734aed4c03 Merge PR #4382: fix(compaction): keep plan-mode guidance off the session_before_compact hook (@roboomp) 2026-07-05 13:25:28 +02:00
can1357 36c3e26fee Merge PR #4381: fix(coding-agent): queue approved plan behind turns flushed by compaction (@roboomp) 2026-07-05 13:25:27 +02:00
can1357 a8528540cf Merge PR #4383: perf(coding-agent/tui): scoped renders + shimmer band fast-path (@roboomp) 2026-07-05 13:25:27 +02:00
can1357 17a94d2d5f fix: preserve hidden image descriptions in advisor history 2026-07-05 13:25:27 +02:00
can1357 6949d9ac3e Merge PR #4334: fix: hide hidden custom session updates (@jeffscottward) 2026-07-05 13:25:27 +02:00
can1357 0e8171a153 Merge PR #4276: perf(cli): parallelize prompt file resolution at startup (@metaphorics) 2026-07-05 13:25:26 +02:00
can1357 a7665077bc Merge PR #4278: fix(web): cap docs.rs gunzip decompressed size at 256 MB (@metaphorics) 2026-07-05 13:25:26 +02:00
can1357 d1aca2a338 fix collab reconnect backpressure drain 2026-07-05 13:25:26 +02:00
can1357 0a89f038f8 Merge PR #4277: fix(collab): add WebSocket backpressure with ordered pending-send drain (@metaphorics) 2026-07-05 13:25:26 +02:00
can1357 600191b6f5 Merge PR #4356: fix(coding-agent): size title budget for backends that ignore disableReasoning (@roboomp) 2026-07-05 13:25:25 +02:00
can1357 7be558eda9 Merge PR #4342: fix(extension): refresh editor after extension paste (@roboomp) 2026-07-05 13:25:24 +02:00
can1357 eb3ded68ea Merge PR #4357: fix(session): harden runEphemeralTurn against dropped provider content on idle recap (@roboomp) 2026-07-05 13:25:24 +02:00
can1357 8ec34a7662 Merge PR #4349: fix(session): handle malformed custom messages (@roboomp) 2026-07-05 13:25:24 +02:00
can1357 6ab2f75a01 style: formatted merged sources and hardened isEmptyErrorTurn exhaustiveness 2026-07-05 13:13:36 +02:00
can1357 29340cf3cb Merge PR #4445: fix(mnemopi): let agents read stored memories in full (@roboomp)
# Conflicts:
#	packages/mnemopi/src/core/beam/recall.ts
2026-07-05 13:12:31 +02:00
can1357 caef81cf0b Merge PR #4409: docs(tool): document bash timeout clamp (@roboomp) 2026-07-05 13:10:27 +02:00
can1357 cf774b0d57 Merge PR #4400: fix(gemini): honor hidden summary requests (@cagedbird043) 2026-07-05 13:10:27 +02:00
can1357 2f67fb3728 Merge PR #4387: fix(fast): enable custom OpenAI-compatible providers (@roboomp) 2026-07-05 13:10:27 +02:00
can1357 d5d13c2cf2 fix(session): keep empty error turns out of rollback persistence 2026-07-05 13:10:26 +02:00
can1357 05fc11394e Merge PR #4457: fix(session): drop content-less provider-rejection turns from persisted history (@mattwilkinsonn) 2026-07-05 13:10:26 +02:00
can1357 535e8256b0 fix(lsp): avoid watched-file side effects 2026-07-05 13:10:26 +02:00
can1357 9a319b8a89 Merge PR #4462: fix(lsp): notify servers about harness file writes (@roboomp) 2026-07-05 13:10:26 +02:00
can1357 d29dfc869d Merge PR #4473: fix(session): guard legacy snapcompact frames on resume (@cexll) 2026-07-05 13:10:26 +02:00
can1357 caa0878c9b Merge PR #4423: fix(task): respect deferred task model role selectors (@roboomp) 2026-07-05 13:10:25 +02:00
can1357 af146b1118 Merge PR #4439: fix(task): preserve isolated commits on transfer failure (@roboomp) 2026-07-05 13:10:25 +02:00
can1357 a868a7d2d5 Merge PR #4471: fix(ai): separate Codex orchestration usage (@roboomp) 2026-07-05 13:03:08 +02:00
can1357 7f3832a263 Merge PR #4489: fix(snapcompact): select silver shape for CJK-heavy auto text (@roboomp) 2026-07-05 13:03:08 +02:00
can1357 c7cb3ab742 Merge PR #4494: docs(coding-agent): align workflowz recursion wording (@roboomp) 2026-07-05 13:03:08 +02:00
can1357 d1a29be3a8 Merge PR #4496: fix(models): accept list-valued model role entries (@roboomp) 2026-07-05 13:03:08 +02:00