A foreground bash or pwsh call that waits on a job rethrew a failed
preparation as new Error(view.detail), dropping the original class and
code, so even SandboxUnavailableError reached tool/result without
error.name or error.code. processJob now keeps the original error for a
failed job and the tool rethrows it; launch and spawn rejections on
every path keep a HarnessError's identity, and a platform spawn error
becomes SubprocessError (SUBPROCESS_SPAWN_NOT_FOUND or _SPAWN_FAILED).
Argument violations are ToolArgsError, a missing sandboxing executor
for sandbox_permissions is SandboxEscalationError
SANDBOX_ESCALATION_UNAVAILABLE, a disabled background call is JobError
JOB_BACKGROUND_DISABLED, and a missing job runtime is
ToolContextUnavailableError.
Refs #7869
jobs-local throws JobError for a missing controller
(JOB_CONTROLLER_UNAVAILABLE), the owner limit (JOB_LIMIT_REACHED), a
dead owner (JOB_OWNER_NOT_LIVE), an unknown id (JOB_NOT_FOUND), and a
foreign caller (JOB_FOREIGN_SESSION), and ToolContextUnavailableError
for an owned registration without the agent registry. An aborted wait
rejects with an error named AbortError, so the tool registry records it
as ABORTED.
job_output and job_kill report an empty job_id, and job_output a
non-positive timeout_ms, as ToolArgsError.
Refs #7869
The working-directory service throws WorkingDirectoryError:
WORKING_DIRECTORY_INVALID for an empty cd, WORKING_DIRECTORY_NOT_FOUND
for a missing target, and WORKING_DIRECTORY_UNAVAILABLE when the
current and original directories are both gone or the service was
disposed. The working_directory tool reports a missing Agent as
ToolContextUnavailableError and an empty cd as ToolArgsError.
sandbox-policy reports a session cwd it cannot use as a workspace root
as SandboxInvalidRootError (SANDBOX_INVALID_ROOT), whose constructor
now names the role of the rejected path.
Refs #7869
The sandbox Service Definition adds SandboxEscalationError with
SANDBOX_ESCALATION_INVALID_ARGUMENT, _UNAVAILABLE, _REJECTED, and
_CANCELLED, thrown by validateEscalationArgs() and approveEscalation()
with their existing messages. A cancelled approval for an aborted call
rethrows the call's cancellation instead.
It also adds SandboxPreparationError. sandbox-local wraps Windows ACL
SID, grant, temp-directory, and path-resolution failures as
SANDBOX_PREPARATION_FAILED with the Win32Error or Node error (or an
AggregateError with cleanup failures) as cause, and reports a temp root
inside the workspace as SANDBOX_INVALID_TEMP_ROOT. sandbox-windows-acl
exports isTempRootInsideWorkspace() for that check.
Refs #7869
The subprocess Service Definition exports SubprocessError with a closed
SUBPROCESS_* code list, rebases SubprocessExecutableNotFoundError on it
with the same name, and adds subprocessSpawnFailure() so consumers that
report a spawn rejection classify ENOENT and other platform errors with
the original as cause. subprocess-local codes empty argv, Windows Job
runner failures, runner IPC failures, and an unloadable node-pty, and
names its pre-aborted spawn error AbortError so the tool registry
classifies it as cancellation.
Win32Error now extends HarnessError with code WIN32_ERROR, keeping its
name, api, and win32Code fields.
Refs #7869
- Reveal the selected file again when files arrive or reorder around it,
so a navigation that selects a file before the diff loads still scrolls
the wide pane; a changed filter shows its results from the top.
- Compare quote summaries in draft change detection, so restoring a draft
that only adds or changes a summary updates the snapshot and storage.
- Read the full path and range instead of the short label to assistive
technology; the Web snapshot now records src/<file>.
- Type the stored summary schema against QuoteSummary, test the stored
round trip, and document why revealRow does not use scrollIntoView.
The launcher ignores dsh.bundle.listedByDefault, so a non-boolean value now
goes to meta.error instead of error. error again means the layer was skipped,
which the plugin page relies on to mark a selected bundle as not running.
Card head geometry moves to custom properties shared with the reason line.
Scrolling by the least distance left a selected file below the fold
flush against the menu's bottom edge with none of its neighbors visible.
Mounting now centers a selected row that is out of view; later selection
steps in the wide pane still scroll by the least distance.
Add to input inserted the whole model-facing reference (header, source,
diff hunk) as the composer quote, which was unreadable. QuotePreview and the
composer's insertQuote now accept an optional QuoteSummary that replaces the
inline excerpt with a label and body and opens a title/detail/body popover;
drafts store it, and the sent message still carries the full text. The Forge
panel supplies the file name, side and lines, path, and comment.
The All files menu remounts its rows on every opening, so a selected file
below the first screen was out of view each time. The tree now scrolls only
its row container to show the selected row on mount and when the selection
changes.
The fixture's sleep ran as a child of dash. Killing the wrapper shell left the child holding stdout/stderr, so execa's close waited for the sleep itself to exit (about 5025ms) and both deadline cases hit vitest's 5000ms budget on Linux. exec makes the killed process the one that owns the pipes, so a timed-out or cancelled invocation rejects immediately.
JobError and TerminalError only need the error base, so dsh-jobs and
dsh-terminal depend on dsh-error instead of the LLM runtime. The Python
SDK runtime closure includes the new package.
Refs #7869
dsh-llm depends on dsh-attachment and dsh-typert-protocol, so classes in
those packages could not extend a base defined in dsh-llm without a
project-reference cycle. HarnessError now lives in @deepseek-ai/dsh-error,
which has no dependencies; dsh-llm declares it as a peer and re-exports
the same class, so existing imports and instanceof checks keep working.
The Agent Note records why the original leaf-package placement no longer
holds.
Refs #7869
A Gemini API route cannot authenticate without a key, so the create card
and the editor require one. Its models offer only minimal, low, medium,
and high, each sent under its own name, with no Off.
Co-authored-by: LegGasai <[email protected]>
Type the approval denial helper with a closed ApprovalErrorCode, state
that a cancellation is recognized by the signal reason or an Error named
AbortError, note that ApprovalError names a denial rather than a thrown
class, and separate JOB_CONTROLLER_UNAVAILABLE from a missing jobs
service. The jobs README describes JobError as the seam's export rather
than as current caller behavior, and the terminal test asserts one
concurrent send failure.
Refs #7869
The reminder rebuilt a downstream post-execute block from its feedback
and contexts, which would drop the block's new optional info. It now
spreads the downstream decision, so a blocked call keeps its structured
error identity when the reminder fires.
Refs #7869
The plugin entry may export only Loader fields and Service or Error
classes, so the ApprovalError and ToolContextUnavailableError code
constants move to an internal module; the recorded strings are
unchanged.
Refs #7869