- Return the early answer from scanCommand without awaiting a successful
outcome: the SSH provider rejects done when termination cancels a
launch it has not yet acknowledged, which turned a retained dirty
checkout into a failed cleanup.
- Test that a never-initialized submodule is removed and that Git
refuses a committed embedded repository, which inspection leaves to
Git by design.
- Record the git-status-only trade-off and its sparse-checkout rationale
in the worktree Agent Note, and align the README, upgrade guide,
maxOutputBytes description, and comments with what is streamed.
Refs #8151
Archive cleanup read whole Git listings into the 64 KiB maxOutputBytes
buffer, so every clean checkout in a repository with more than about a
thousand tracked files settled as failed.
- Drop the skip-worktree/assume-unchanged and gitlink listings; removal
follows what `git status` reports, as peer agent products do.
- Stream `git status` and stop at its first entry, and stream the
worktree listing, so neither is bounded by maxOutputBytes; restoring a
worktree shares the streamed lookup.
- Retain a checkout whose administrative directory holds submodule
repositories instead of letting Git refuse the removal.
Refs #8151
The forge subsystem page documents ctx.forge.readReview, its thread
types, and the panel's changeRequestReview cache; the package READMEs
describe the GitHub thread mapping, the overlay and thread list, and the
new panel Config fields. An upgrade guide covers the unsupported
ForgeFailure code. The Web e2e overlays scripted threads, opens them from
the thread list, and sends a quoted thread through a replayed turn.
Renderers such as errorChain and the activation report expand
AggregateError members but otherwise follow only cause, so a cause of
just the setup failure hid the cleanup failure that may leave
resources alive. The cause is now an AggregateError of both failures.
An upgrade guide records that the class extends TerminalError instead
of AggregateError.
INIT_REJECTED is documented as the code a consumer that drives a shell
uses when the shell rejects its setup input, and the persistent bash
tool README records it.
Refs #7869
The attachment store already classifies its rejections, so read_image
no longer translates them into ImageInputError codes. An AttachmentError
keeps its name and code; for codes with a known remedy the tool rethrows
it with a message naming the file and the next step, and the store
error as cause. Other store failures pass through unchanged.
ImageInputError keeps only the refusals the tool makes before storing
the image: IMAGE_UNSUPPORTED_MODEL and IMAGE_UNSUPPORTED_FORMAT. The
removed codes (IMAGE_TYPE_MISMATCH, IMAGE_INVALID, IMAGE_TOO_LARGE,
IMAGE_CONVERSION_FAILED, IMAGE_STORE_FAILED) were never released.
The GitHub provider now reads headRefOid and baseRefOid in one GraphQL query,
returns `stale` when the head moved, and reads the patch from
`compare/<baseRefOid>...<headSha>` instead of bracketing `gh pr diff` with two
head reads. Both ends are fixed commits. The compare read lives in the internal
`readComparison` helper so commit-range diffs can reuse it.
For every open and merged pull request measured, the compare patch is
byte-identical to `gh pr diff`. Unlike the pull request diff, it returns diffs
over 300 files, so such a pull request now shows its complete diff; only output
over `maxOutputBytes` or GitHub's HTTP 406 / `too_large` refusal is
`too-large`. The read passes `--allow-escape-sequences`, which gh 2.97 and
newer require to print patches whose files contain terminal escape sequences.
- read_image converts only AttachmentError rejections from saveImage;
any other value is a store defect or cancellation and propagates
unchanged instead of becoming IMAGE_STORE_FAILED.
- ImageInputError is no longer exported from the dsh-tool-fs entry, and
its JSDoc notes that two codes share AttachmentError spellings.
- str_replace_editor create maps a guarded-creation collision
(FS_NOT_OBSERVED after a concurrent create) to FS_ALREADY_EXISTS.
- The fs-local directory-swap test asserts FS_NOT_REGULAR_FILE exactly.
- The attachment upgrade guide lists the full AttachmentErrorCode set
instead of an ATTACHMENT_ prefix.
- dsh-error dependency entries sit in sorted position.
ForgeProvider.diff now takes the head commit it must describe. The GitHub
provider reads headRefOid before and after `gh pr diff` and returns the new
ForgeFailure code `stale` when either read names another commit, so the
forge panel never caches a patch under a head it does not describe. A stale
read polls the change request at once, and the changes view waits for the
next status before reading again.
Status polling pages reviewThreads up to the new `maxReviewThreads` setting
(default 1,000) instead of counting only the first 100, and sets
ChangeRequestSnapshot.threadsTruncated when the count is a lower bound.
AttachmentError now extends HarnessError from the dependency-free
dsh-error package, keeping its name and every ATTACHMENT_* and image
admission code, so tool results record its name and code and adapter
failures report the attachment code instead of UNKNOWN. An upgrade
guide records the persisted code change.
read_image classifies AttachmentError before the HarnessError
pass-through so its ImageInputError codes stay unchanged. HarnessError
imports this branch added in dsh-tool-fs and dsh-lsp-stdio now come
from dsh-error, which both packages declare.