Commit Graph
9203 Commits
Author SHA1 Message Date
_Kerman d4fa26023d fix(agent-loop): open turns before pre-step 2026-08-04 13:49:35 +08:00
Hypatia May b0f33f13f4 docs(sandbox): cross-link Landlock snapshot rule 2026-08-04 13:49:34 +08:00
Hypatia May f91aedd074 refactor(sandbox): defer native protocol exports (round 3) 2026-08-04 13:37:33 +08:00
Turtle bc26a366dd test(acp-snapshot): cover the waitForEventAfterTurnEnd step
Success and timeout paths plus the before-newSession guard, restoring
per-file 100% on harness.ts.
2026-08-04 13:25:39 +08:00
Turtle 5fc420c5c0 test(acp-snapshot): wait for the durable goal pause before disposal
The goal scenario asserted a paused revision-2 goal, but the pause is
appended only after cancellation reaches idle — after turn/end. Under
parallel snapshot files the subprocess could dispose before the pause
record persisted, folding the log to an active revision-1 goal.

Add a waitForEventAfterTurnEnd input step (the turn-end/title waiters'
shape, parameterized by event type) and use it in the goal scenario to
hold the subprocess open until the goal-state record lands.
2026-08-04 13:25:39 +08:00
Turtle ecdcc218b6 perf(test): run replay snapshot files in parallel
The snapshot config serialized all 13 files for every mode, but the
fixture-writing rationale only holds for record (real API quota per
scenario) and refresh (write-back harvests volatile values from
fixtures on disk). Replay — the keyless default and the CI mode — is
read-only with a unique temp dir per scenario subprocess, and the
suite factory already runs replay scenarios concurrently in-file.

Narrow the serialization to non-replay modes: pnpm test:snapshot drops
from ~49s to ~33s wall; record/refresh stay fully serial.
2026-08-04 13:25:28 +08:00
Turtle 10bb9cbf4a cleanup: remove TUI package and legacy dsh entrypoints 2026-08-04 13:20:28 +08:00
Chinesezjc 3a060c5688 Merge pull request #1175 from deepseek-harness/fix/web-sources-scroll
fix(client-web): scroll the web_search source card instead of collapsing
2026-08-04 13:20:16 +08:00
Chinesezjc c67c89911e Merge origin/fix/web-sources-scroll 2026-08-04 13:13:41 +08:00
Chinesezjc 6601738e32 Merge origin/master into fix/web-sources-scroll 2026-08-04 13:11:40 +08:00
_Kerman 0ac95437b4 refactor(agent): address inbox mutations by message id 2026-08-04 13:10:22 +08:00
Turtle 7248b5ec8f Merge pull request #1376 from deepseek-harness/codex/node26-zstd-compat
fix(jsonl): recover truncated zstd frames on Node 26
2026-08-04 12:43:29 +08:00
Hypatia May 319376ef1c fix(sandbox): preserve valueless spawn failures (round 2) 2026-08-04 12:16:21 +08:00
_Kerman a90a1645aa fix(jsonl): tolerate truncated Zstd frames on Node 26 2026-08-04 12:06:01 +08:00
_Kerman 384c87899c test(session): cover legacy migration paths 2026-08-04 12:05:53 +08:00
Hypatia May e36d040d0a fix(sandbox): spawn confined argv directly (round 1) 2026-08-04 12:04:48 +08:00
Turtle ec4e130e31 fix(jsonl): recover truncated zstd frames on node 26 2026-08-04 11:58:38 +08:00
Chinesezjc fffd1ca18e Merge branch 'master' into fix/web-sources-scroll 2026-08-04 11:41:15 +08:00
_Kerman 2a9ebfcac2 fix(session): load pre-react-loop persisted sessions 2026-08-04 11:25:31 +08:00
Yichen Jiang b52b9422d4 Merge branch 'master' into worktree/custom-deepseek-models 2026-08-04 11:13:45 +08:00
fz f0e5a39d19 Merge remote-tracking branch 'origin/master' into codex/fix-headless-sigint 2026-08-04 11:07:36 +08:00
_Kerman 98947afece chore(docs): trim translation sidecar churn 2026-08-04 11:04:03 +08:00
fz 8ea88a589b test(cli): cover shutdown timer invariants 2026-08-04 11:03:52 +08:00
_Kerman eaa497d735 Merge remote-tracking branch 'origin/master' into xtr/react-loop-simplification
# Conflicts:
#	.agents/notes/implemented/architecture/2026-07-19-package-owned-invariant-service.i18n.yaml
#	examples/acp-agent/tests/snapshots/fs-glob-sampling/session.jsonl
#	packages/ui/tui/README.i18n.yaml
#	packages/ui/tui/src/components/dialogs.ts
#	packages/ui/tui/tests/tui.spec.ts
2026-08-04 10:52:45 +08:00
Turtle 804b724202 Merge pull request #1359 from deepseek-harness/perf/tui-long-session-render
perf(tui): incremental step timing and card render caches for long sessions
2026-08-04 10:06:21 +08:00
Hypatia May 2eedb54849 fix(examples): declare sandbox fixture dependency 2026-08-04 09:37:50 +08:00
Hypatia May 71aafeb858 Merge origin/master into fix/landlock-runner-failure-classification 2026-08-04 09:14:13 +08:00
Turtle 5329bef04d perf(tui): incremental step timing and card render caches for long sessions
Resuming a long session (196k events, 2.2k steps, 1.8k tool cards) took
~12s to render and ~800ms to echo one keystroke:

- Every step's timing footer called stepTimingAt, which replayed the whole
  event log per footer - O(steps x events) on the initial render.
- pi-tui re-renders every component each frame and relies on per-component
  line caches, but ToolCardComponent/ContextCardComponent built throwaway
  Text/Markdown instances inside render(width), re-wrapping every settled
  card's output on every keystroke.

Replace the per-footer replay with one shared StepTimingTracker per chat
mount (single O(events) cursor over the append-only log), and cache card
rows by width via CardLineCache, dropped by every state mutator and
invalidate().

Measured (tmux 200x50, 196k-event session): resume prompt-ready ~12s -> ~7.6s;
per-keystroke echo ~800ms median -> ~11ms.
2026-08-04 00:37:10 +08:00
Huanqi Cao 9abc0723dd Merge remote-tracking branch 'origin/master' into feat/pwsh-tool 2026-08-03 23:44:38 +08:00
Huanqi Cao b50120e090 docs: attribute the hasPwsh probe to the caller and name the bash dialect
Round-four nits: the acp-snapshot README said 'the suite's hasPwsh probe
follows the executor's own resolution' — hasPwsh is caller-supplied, and the
resolvePwshPath-following behavior belongs to the shipped acp-agent caller;
reword to 'the caller-supplied hasPwsh probe (the shipped acp-agent suite
follows the executor's own resolution...)' on both language sides. And the
tool-bash README loses its only explicit pairing sentence with the dialect
guard reverted, so state the contract plainly: 'The tool contract is
bash-dialect — mount a bash-parsing executor' (both languages, pairing
re-recorded).
2026-08-03 23:38:41 +08:00
Huanqi Cao b978c62a22 Merge pull request #1119 from deepseek-harness/feat/ripgrep-packaged-binary
feat(fs-search): spawn the packaged ripgrep binary through the subprocess seam
2026-08-03 23:31:29 +08:00
Huanqi Cao d11b828683 docs(acp-snapshot): document Scenario.pwshOnly and the hasPwsh probe
The host-variance paragraph documented posixOnly and pinsNativeWindowsStdout
but not the pwshOnly flag and SnapshotSuiteOptions.hasPwsh probe added with
the pwsh-tool-turn scenario; add the parallel sentence on both language
sides and re-record the pairing.
2026-08-03 23:16:59 +08:00
Huanqi Cao f14f826648 revert(bash): drop the executor dialect guard
The ShellDialect marker on BashExecutor and the load-time rejection in
tool-bash/tool-pwsh force every test and example fake executor to declare
a dialect for a guard with no in-repo or plausible deployment to catch
(shipped compositions always pair the tool with its matching executor),
and they break the example composition suites that stub ctx.bash without
a dialect (agent-spine-demo/cli-demo/acp-demo lost the bash tool).

Keep the non-dialect doc fixes that landed with the attempt: the tool-bash
README bashEnv contract trim with the stale example import removed, the
acp-snapshot suite.ts 'usable pwsh' JSDoc, and the pwsh.cordis.yml comment
indent. The parity note records the attempt and revert under Alternatives.
2026-08-03 23:16:53 +08:00
Huanqi Cao b43358e215 chore: drop another stray scratch file 2026-08-03 22:50:25 +08:00
Huanqi Cao 9ae358e087 chore: drop a stray scratch file 2026-08-03 22:48:49 +08:00
Huanqi Cao 3d1166fcdd feat(bash): shell tools reject a mismatched executor dialect at load
The seam gains ShellDialect ('bash' | 'powershell' - concrete shells, not
families: zsh or fish would be their own values, never 'bash'); bash-local
declares bash (bash-sandbox inherits), pwsh-local declares powershell, and
both tools throw at load when the mounted executor speaks another dialect -
previously tool-pwsh over bash-local handed PowerShell text to bash -c and
the deployment error surfaced as ordinary nonzero exits. Pinned by mismatch
tests on both tools; the parity note records the contract (both languages).

Also from the review round: the tool-bash README's managed-environment
section becomes a summary linking the owning dsh-bash-env contract (the
duplicated prose carried a stale owner in its example import), the
pwshOnly JSDoc drops the stale 'on PATH' phrasing, and the task-tools
contract comment in the two pwsh compositions is indented into its block.
2026-08-03 22:47:53 +08:00
fz 003d297442 Merge remote-tracking branch 'origin/master' into codex/fix-headless-sigint 2026-08-03 22:21:46 +08:00
Turtle 05a76c3d98 Merge pull request #1355 from deepseek-harness/codex/remove-invariants-shipped-config
cleanup(cli): omit invariants from shipped configs
2026-08-03 22:18:51 +08:00
Turtle 76d8a54d16 Merge pull request #1063 from deepseek-harness/perf/tui-resume-scan
perf(tui): open the /resume selector from one batch session projection
2026-08-03 22:17:59 +08:00
fz ef23b88ad4 fix(cli): bound telemetry shutdown on signals
Refs #1356
2026-08-03 22:08:47 +08:00
Turtle 414c310324 cleanup(cli): omit invariants from shipped configs 2026-08-03 22:04:53 +08:00
_Kerman d4794ed991 Merge branch 'master' into xtr/react-loop-simplification 2026-08-03 21:31:57 +08:00
Turtle fea88291c1 docs: regenerate module graph for tui projection deps 2026-08-03 21:29:29 +08:00
Turtle 25d8bfac31 Merge remote-tracking branch 'origin/master' into perf/tui-resume-scan
# Conflicts:
#	packages/ui/tui/README.i18n.yaml
2026-08-03 21:16:51 +08:00
Turtle 7a26214a81 feat(tui): resolve resume titles through the projection cache
session-title already registers a title projection unit; /resume now
reads it instead of scanning logs: live rows from the registry
snapshot, persisted rows from the durable checkpoint row
(cachedSnapshot, zero I/O), and only rows without a usable checkpoint
pay a coldSnapshot — checkpoint plus readFrom tail, written back so the
next scan is metadata-only. Cold reads are bounded by the new
resumeScanConcurrency config; compositions without the cache fall back
to the bounded readTitleSnapshots batch. The TUI overlay mounts the
projection registry, storage, and projection-cache rows over the same
storages root the web surface uses, so checkpoints serve both.
2026-08-03 21:13:52 +08:00
_Kerman 7454c1a5c2 fix(acp): report end_turn for non-client turn aborts
TurnEndReasonMap aborted endings no longer map to 'cancelled': the ACP
spec reserves StopReason::Cancelled for the client's own session/cancel
notification (plus disposal, both settled out of band). A turn aborted by
a hook or another agent owner is ordinary quiescence and now settles as
end_turn, matching the README/note contract. interrupted keeps
'cancelled' as the crash-orphan marker.
2026-08-03 21:07:23 +08:00
Huanqi Cao 90c9087a3e test(web): follow the structured abort message in the bash-abort-row scenario
master's new disclosure test pins the literal the abort backport retired;
the seeded cancel fixture now carries 'Error: tool call aborted', so the
test literals and the ARIA golden follow (replay-verified on Linux).
2026-08-03 20:57:26 +08:00
_Kerman 97148182ed chore(ci): regenerate cordis catalog after flush JSDoc change 2026-08-03 20:49:01 +08:00
_Kerman ab56e0df0a fix(agent-loop): park empty turn batches, keep max-tokens sticky, and settle headless at idle
- turn boundary now returns false for an empty admitted batch (claimed
  input removed before the wake) instead of opening a turn and spending a
  model call on nothing; the step boundary already had the symmetric guard.
- a max-token step stays sticky when steering or injected work continues
  the turn: a later completed step no longer downgrades the outcome,
  matching the TurnEndReasonMap contract.
- session/queue wire schema accepts the context placement (previously the
  zod union rejected injected-context snapshots wholesale and the client
  silently dropped the whole frame); schema tests cover all placements.
- headless runs settle at whole-agent idle instead of the first turn/end,
  honoring the one-shot idle-to-idle contract.
- flush JSDoc names the real callers (checkpoint policy, goal-session,
  teardown, self-flushing consumers); apiproxy zh README loses its stale
  duplicate history section; ACP note/README record the delivered error
  rejection and turnless-cancelled behaviors.
2026-08-03 20:36:26 +08:00
Huanqi Cao a228fe15a2 docs(graph): regenerate the module graph for the merged tree
The merge resolved the module-graph.md conflict by regenerating doc GRAPHS
(gen-doc-graphs) while this file belongs to gen-module-graph; verify-module-graph
is a static-lane gate outside doc-sync, so the staleness only surfaced on CI.
2026-08-03 20:31:43 +08:00