Commit Graph
6 Commits
Author SHA1 Message Date
Yichen Jiang d6bebc5783 feat(shell): converge on execute() and promote timed-out commands to jobs
The executor seam collapses run()/start() (and the planned begin()) into one
resolve() + execute(): the handle IS the live process, and the foreground
result, the background cursor, and the deadline's promotion offer are
projections over the same spawn. ShellExecSpec.onExpiry ('kill' default /
'offer' / 'none') replaces the implicit method split; one stdout budget applies
everywhere, the 'start ignores timeoutMs' wart dies, and sync spawn throws are
contained into the same settled-killed handle as async rejections (result()
rejects with the original error, identity preserved for the sandbox
classification).

The promotion offer settles exactly once and never rejects — offer at an
'offer' deadline while running, undefined when the process settles first — so
'await execution.promotion' alone distinguishes the outcomes. An offer must be
answered synchronously; an unanswered one auto-declines back to the
kill-on-timeout behavior. accept() ends the deadline and detaches the caller's
abort signal; decline() kills and classifies timedOut.

tool-bash and tool-pwsh promote on timeout by default (promoteOnTimeout: true,
inert without run_in_background or a job registry): at the offer the running
handle registers as a job with the same hooks as run_in_background, mirrors
into ctx.activities (the web task list streams it, stop control included), and
the call returns { kind: 'promoted', jobId, timeoutMs, output } carrying the
output so far — the job cursor continues exactly after it. Any promotion
failure declines and falls back to the plain timeout kill. Descriptions and
the timeoutMs schema text advertise the semantics only when they hold;
recorded-session and web snapshot fixtures re-recorded with them.

Also repairs the four CI failures from the human-kill push: ui-activity's
missing dsh-session peer declaration (static + windows observational), the
observe owner-arm/outer-catch and killJob-stub coverage gaps, tool-workflow's
owned-run arm, and the timing-dependent projection-cache interval flush test
(now poll-based for coarse Windows timers).

Peer evidence and rejected alternatives (Codex's session model, a third seam
method, a second threshold knob) in the Agent Note
2026-08-26-shell-execute-timeout-promotion.
2026-08-26 16:11:01 +08:00
Yichen Jiang 4a79310339 feat(activity): optional live-output observation seam with a web viewer
Add the activity capability seam: ctx.activities is a pure observation
plane where long-running work (background bash/pwsh, workflow runs) opens a
handle, appends transient output into a byte-offset ring buffer, and settles
exactly once. Nothing model-visible changes: reads are non-consuming and
lossy-by-design (absolute UTF-8 offsets survive eviction and report gaps),
correlation carries {callId, jobId}, and visibility is owner-fenced like jobs.

The seam is strictly optional. Producers tap it through ctx.get('activities')
and contain every observation failure, so an unregistered or broken registry
never affects the underlying job (proven by broken-registry tests).

Ship the full path in one change:
- @deepseek-ai/dsh-activity: Service Definition, pumpActivityOutput pull
  substrate, invariant companion; dsh-activity-local: ring-buffer provider
  with retention config and owner cleanup.
- shell: ShellProcess.observed exposes non-consuming stdout/stderr readers;
  tool-bash/tool-pwsh mirror background jobs into activities.
- tool-workflow: phase/log/agent lines mirrored as a workflow activity.
- api-activity-controller: Typert Remote control (roster baseline+buckets)
  and observe (opened/output/status frames, coalesced and byte-capped)
  streams plus the client feed service with reference-counted observation.
- ui-activity: session-header action rendering live output through
  TerminalBlock, which now shows output while a command is still running.

Docs: activity subsystem page, architecture row, regenerated catalogs, and
the Agent Note (2026-08-24-activity-observation-seam), all bilingual. A
keyless web e2e replays a real run_in_background stream to ARIA goldens.
2026-08-24 22:40:14 +08:00
Turtle 93a1b569ac Merge remote-tracking branch 'origin/master' into codex/remove-cordis-catalog-line-numbers
# Conflicts:
#	docs/subsystems/agent-team.i18n.yaml
#	docs/subsystems/approval.i18n.yaml
#	docs/subsystems/client-modules.i18n.yaml
#	docs/subsystems/client-modules.md
#	docs/subsystems/client-modules.zh.md
#	docs/subsystems/code-runtime.i18n.yaml
#	docs/subsystems/commands.i18n.yaml
#	docs/subsystems/commands.md
#	docs/subsystems/commands.zh.md
#	docs/subsystems/compaction.i18n.yaml
#	docs/subsystems/compaction.md
#	docs/subsystems/compaction.zh.md
#	docs/subsystems/core.i18n.yaml
#	docs/subsystems/core.md
#	docs/subsystems/core.zh.md
#	docs/subsystems/credentials.i18n.yaml
#	docs/subsystems/credentials.md
#	docs/subsystems/credentials.zh.md
#	docs/subsystems/feedback.i18n.yaml
#	docs/subsystems/filesystem.i18n.yaml
#	docs/subsystems/goal.i18n.yaml
#	docs/subsystems/http-server.md
#	docs/subsystems/http-server.zh.md
#	docs/subsystems/invariants.i18n.yaml
#	docs/subsystems/invariants.md
#	docs/subsystems/invariants.zh.md
#	docs/subsystems/jobs.i18n.yaml
#	docs/subsystems/llm-streaming.i18n.yaml
#	docs/subsystems/llm-streaming.md
#	docs/subsystems/llm-streaming.zh.md
#	docs/subsystems/permission-presets.md
#	docs/subsystems/permission-presets.zh.md
#	docs/subsystems/persistence.i18n.yaml
#	docs/subsystems/persistence.md
#	docs/subsystems/persistence.zh.md
#	docs/subsystems/plan.i18n.yaml
#	docs/subsystems/plan.md
#	docs/subsystems/plan.zh.md
#	docs/subsystems/sandbox.i18n.yaml
#	docs/subsystems/sandbox.md
#	docs/subsystems/sandbox.zh.md
#	docs/subsystems/schedule.i18n.yaml
#	docs/subsystems/session-projection.i18n.yaml
#	docs/subsystems/session-projection.md
#	docs/subsystems/session-projection.zh.md
#	docs/subsystems/session-query.i18n.yaml
#	docs/subsystems/session-reference.i18n.yaml
#	docs/subsystems/session-reference.md
#	docs/subsystems/session-reference.zh.md
#	docs/subsystems/session-telemetry.md
#	docs/subsystems/session-telemetry.zh.md
#	docs/subsystems/session-title.i18n.yaml
#	docs/subsystems/session.i18n.yaml
#	docs/subsystems/session.md
#	docs/subsystems/session.zh.md
#	docs/subsystems/settings.i18n.yaml
#	docs/subsystems/settings.md
#	docs/subsystems/settings.zh.md
#	docs/subsystems/shell.i18n.yaml
#	docs/subsystems/shell.md
#	docs/subsystems/shell.zh.md
#	docs/subsystems/skills.i18n.yaml
#	docs/subsystems/skills.md
#	docs/subsystems/skills.zh.md
#	docs/subsystems/spill.i18n.yaml
#	docs/subsystems/storage.i18n.yaml
#	docs/subsystems/subagent.i18n.yaml
#	docs/subsystems/subagent.md
#	docs/subsystems/subagent.zh.md
#	docs/subsystems/subprocess.i18n.yaml
#	docs/subsystems/system-prompt.i18n.yaml
#	docs/subsystems/system-prompt.md
#	docs/subsystems/system-prompt.zh.md
#	docs/subsystems/tasks.md
#	docs/subsystems/tasks.zh.md
#	docs/subsystems/terminal.md
#	docs/subsystems/terminal.zh.md
#	docs/subsystems/token-meter.i18n.yaml
#	docs/subsystems/tools.i18n.yaml
#	docs/subsystems/tools.md
#	docs/subsystems/tools.zh.md
#	docs/subsystems/typert.i18n.yaml
#	docs/subsystems/typert.md
#	docs/subsystems/typert.zh.md
#	docs/subsystems/user-interaction.i18n.yaml
#	docs/subsystems/user-questions.i18n.yaml
#	docs/subsystems/user-questions.md
#	docs/subsystems/user-questions.zh.md
#	docs/subsystems/web.i18n.yaml
#	docs/subsystems/workflow.i18n.yaml
#	docs/subsystems/workflow.md
#	docs/subsystems/workflow.zh.md
#	docs/subsystems/workspace.i18n.yaml
#	docs/subsystems/workspace.md
#	docs/subsystems/workspace.zh.md
#	packages/typert/generator/tests/cordis-catalog.spec.ts
2026-08-20 19:48:43 +08:00
pku-xht ad6516933b fix(i18n): close automated review findings 2026-08-18 21:02:50 +08:00
Turtle 1540e76598 docs: capitalize Service Provider across repository 2026-08-13 13:31:30 +08:00
Tianyi Cui a2d0f7f411 refactor: apply repository naming contract
Apply the accepted pre-release package, service, type, directory, and role renames as one repository-wide change.
2026-08-13 00:54:38 +08:00