Commit Graph
6105 Commits
Author SHA1 Message Date
Chinesezjc beb191d87f fix(gui): admit todos in the history wire schema
sessionHistoryValueSchema declared only events/hasMore, so the fetch
carrier's Zod parse stripped the tail page's todos projection — the
in-process and fixture paths carried it while a real WebApiClient lost it.
The fetch-carrier spec pins the field through the wire round trip.
2026-07-24 22:56:12 +08:00
Chinesezjc 1687c2c15c fix(gui): tail history page carries the full-log todo projection
The client's todos projection derived only from the paged display window,
so reopening a session whose last todo/write preceded the tail page showed
an empty plan until the user paged back — session-level state cannot be
reconstructed from an arbitrary window. The host owns the full log, so the
tail history response now attaches todos (latest todo/write backscan, the
same posture as the view pairing); installWindow seeds it, window rebuilds
preserve it, and any in-window or live write keeps overwriting it. The
fixture mirrors the host; docs and both Agent Notes record the mechanism.
2026-07-24 22:56:12 +08:00
Chinesezjc 356be9710a docs(gui): record the window-scoped todos gap and the web consumer
runtime README documents ConversationSnapshot.todos and its window-scoped
limitation; the todo tool README and Agent Note name the web client among
the event consumers; the web display note records the cold-load gap and
fix directions (bilingual pair re-recorded).
2026-07-24 22:56:12 +08:00
Chinesezjc 3b1ad3ee6c test(gui): keyless assembled todo-display pass in the fixture smoke
Eight real bundles through the DI chain in ?fixture mode: plan strip
content, dedicated row summary + details linkage, collapse hint, zero page
errors — the CI-gated assembled-surface coverage for the todo display.
2026-07-24 22:56:12 +08:00
Chinesezjc f2a9c09429 fix(gui): fixture emits todo/write at the real tool boundary
The tool appends the snapshot mid-execution, between tool/call and
tool/result; the fixture spliced it after step/end with a post-turn
timestamp, so acceptance never exercised the production ordering. A spec
pins call → snapshot → result with monotonic times.
2026-07-24 22:56:12 +08:00
Chinesezjc 02abe3c821 fix(gui): todo-row guards valid-JSON invalid-shape args before dereferencing
null roots, non-object roots, and null array items (retained verbatim on a
rejected tool/call) now take the documented generic-summary fallback instead
of throwing into the row error boundary.
2026-07-24 22:56:12 +08:00
Chinesezjc 2d95a60ac9 fix(tool-todo): reject unknown item keys instead of silently dropping them
An item carrying keys beyond content/status (ids, children, priority) was
flattened to {content, status} on append, so the logged snapshot diverged
from what the model believed it wrote (model-visible must equal logged).
Reject loudly; the isError result lets the model self-correct.
2026-07-24 22:56:12 +08:00
Chinesezjc 0a3c7f2b39 docs(agents): web todo display Agent Note — side-effect channel + two surfaces 2026-07-24 22:56:12 +08:00
Chinesezjc de4f818c80 test(gui): todo display fixture sample + browser acceptance script
fx-alpha gains turn 63: a todo_write call/result pair plus the todo/write
snapshot event, feeding both the TodoRow toolview and the TodoPanel strip
in ?fixture mode. verify-todo-display.mjs drives chromium through panel
visibility, content, row summary, details linkage, collapse and dark.
2026-07-24 22:56:12 +08:00
Chinesezjc 63109dab66 feat(gui): todo display — TodoPanel plan strip + todo_write toolview row
TodoPanel pins above the composer (776px card axis), hidden while empty,
collapsible with the active item as the collapsed hint; status glyphs
mirror the TUI plan panel. todo_write rows render a plan-flavored summary
(counts + active item) via the toolview registry, generic fallback on
malformed args. Existing fake snapshots gain the required todos field.
2026-07-24 22:56:12 +08:00
Chinesezjc a0c269b0fb feat(gui): fold todo/write into ConversationSnapshot.todos
Session consumes the todo/write session event as a per-event side effect
(last write wins), rebuilds it on window replay/paging/resync, and exposes
snapshot.todos. TodoItem re-exported through the runtime surface.
2026-07-24 22:55:17 +08:00
Tianyi Cui d01474d1d0 Merge pull request #616 from deepseek-harness/worktree/acp-automation-review-fixes
fix(acp): review fixes for the automation-only reduction
2026-07-24 22:54:13 +08:00
_Kerman b36a82fc98 Merge branch 'master' into xtr/agent-loop-message-machine 2026-07-24 22:48:18 +08:00
Tianyi Cui 13345fdadc docs(i18n): re-record web e2e note pair after the scaffold rename
The rename commit edited both sides of the bilingual pair but missed the
re-record; the pairing gate compares blob hashes and went red.
2026-07-24 22:46:04 +08:00
_Kerman 992cf894af refactor(agent): unify sourced message delivery 2026-07-24 22:38:50 +08:00
Tianyi Cui 88f3933327 fix(docs): address Codex round-1 findings on the review-fix stack
- gen-doc-graphs still summarized the ACP demo as 'text-only'; say
  baseline-prompt and regenerate composition.md.
- The llm-catalog note claimed unit coverage for per-agent target
  isolation that no test pins directly; state the actual basis
  (agent-scoped listener installation) in both languages and re-record.
2026-07-24 22:36:06 +08:00
Tianyi Cui b97b1b4a3f Merge pull request #343 from deepseek-harness/docs/i18n-batch-core
docs(i18n): publish Chinese core documentation and Agent Notes
2026-07-24 22:28:46 +08:00
Tianyi Cui 90057b25f2 docs(acp): state both arms of the spec's version-negotiation rule 2026-07-24 22:19:10 +08:00
Tianyi Cui 6d3c25f494 refactor(web-e2e): rename harness -> scaffold; add interaction coverage
The shared test module was named harness.ts inside a repo whose product
IS a harness — hopelessly ambiguous. Renamed to scaffold.ts with
launchWebScaffold/WebScaffold; tsconfig plane-split entries, the seam
JSDoc/README mentions, and both Agent Note languages updated.

Both scenarios gain a Playwright interaction step over the settled
transcript (after the golden capture, so committed aria surfaces stay
untouched): replay-round-trip clicks the reasoning fold open/closed over
wire-delivered state; seeded-history expands a read tool row rebuilt from
the cold log and asserts the recorded result text appears (read rows are
expand-in-place — rowExpands routes the click to the inline fold, not the
details column). test:web 30 passed | 1 skipped.
2026-07-24 22:18:19 +08:00
Tianyi Cui 5569f3f8ac docs: repair rewritten rationale and stale claims from the ACP reduction
The automation-only rewrite edited many implemented Agent Notes; several
edits replaced still-live or historical rationale instead of reframing:

- llm-model-catalog: restore the prompt/request consistency section and
  selection-ownership alternatives — installAgentLlmTarget and the TUI
  /model selector still ship that design; only the ACP wire is gone.
- plan-specific-collaboration-state, acp-multi-session, todo-write,
  ask-user-question: link the superseding automation-only note instead
  of silently rewriting the original decision or motivation; drop a
  paragraph duplicating the Web-provider facts stated two paragraphs up.
- sandbox: stop claiming unit coverage for turn-enclosed config writes
  (that mechanism left with the bridge) and retitle the commit-boundary
  paragraph accordingly.
- Fix the missing blank line before '## Consequences' in the
  plugin-command-registration pair, the JSON-RPC/Web render-intent
  consumer misattribution (the second consumer is the host/client
  runtime), stale bash_output/bash_kill names, and 'optional goals' in
  architecture.md.
- examples/acp-agent/README.md: point at the package contract instead
  of restating it; packages/ui/permission and plan-mode READMEs record
  the consumer-less preset service and the exit_plan_mode coverage gap
  under Known Limitations.
- 2026-06-19-acp-snapshot-tests: the new note defers the corpus
  migration rather than committing to it; say so.

Re-record the touched bilingual pairs.
2026-07-24 22:12:23 +08:00
Tianyi Cui 74d14f68bb fix(acp): accept baseline resource links and release a failed prompt slot
ACP v1 requires every agent to accept text AND resource_link prompt
content; the automation rewrite dropped the resource_link half of that
baseline. Restore the old bracketed-reference flattening in the codec,
reject only beyond-baseline blocks, and update the package contract and
Agent Note.

Also release the per-session prompt slot when agent.send() throws
synchronously (an agent disposed outside the bridge would otherwise
wedge the session into permanent 'already in flight' rejections),
drop the tautological version-negotiation branch, prove the scenario
env layer reaches the snapshot subprocess, pin bridge-side fail-closed
permission errors, and correct two overpromising test names.
2026-07-24 22:11:49 +08:00
_Kerman 009d113e0e refactor(agent): trim obsolete loop surfaces 2026-07-24 21:58:07 +08:00
Turtle 1ffdacb2c4 fix(jsonl): handle filesystem path aliases 2026-07-24 21:50:11 +08:00
_Kerman 194b18a32f Merge remote-tracking branch 'origin/master' into xtr/agent-loop-message-machine
# Conflicts:
#	docs/cordis-catalog/services.md
2026-07-24 21:41:02 +08:00
Tianyi Cui 158c5e913a docs(i18n): refresh persistence docs after master merge 2026-07-24 21:27:22 +08:00
Hypatia May 224e00b2bd fix: quiesce cancelled session reconciliation 2026-07-24 21:27:07 +08:00
_Kerman d92ce62e57 refactor(agent-loop): return request failures from steps 2026-07-24 21:27:02 +08:00
Tianyi Cui d847b48479 Merge remote-tracking branch 'origin/master' into worktree/pr343-retarget-latest-master 2026-07-24 21:21:22 +08:00
Tianyi Cui 2584f029bc Merge remote-tracking branch 'origin/master' into worktree/pr343-retarget-latest-master
# Conflicts:
#	docs/cookbook/extension-cookbook.i18n.yaml
#	docs/cookbook/extension-cookbook.zh.md
2026-07-24 21:20:17 +08:00
_Kerman b73eb7663c refactor(agent-loop): simplify observable state machine 2026-07-24 21:18:48 +08:00
Turtle c14f488b00 fix(persistence): use normalized project directory names 2026-07-24 21:15:53 +08:00
Tianyi Cui 478d9c17b2 Merge pull request #582 from deepseek-harness/codex/sqlite-metadata-contracts
fix(sqlite): preserve session metadata contracts
2026-07-24 21:14:06 +08:00
Tianyi Cui 46dfd503e0 Merge origin/master into codex/sqlite-metadata-contracts 2026-07-24 21:07:23 +08:00
Tianyi Cui 8f97f95d7b docs(i18n): bilingual pair for the web e2e lane Agent Note
Chinese counterpart translated per the terminology table and the
2026-07-18 TUI note's register; switcher lines added on both sides; pair
recorded. doc-sync 24/24.
2026-07-24 21:06:54 +08:00
Hypatia May cbc6d81fc3 Merge remote-tracking branch 'origin/master' into session-query-tool
# Conflicts:
#	docs/architecture.i18n.yaml
2026-07-24 20:59:18 +08:00
Tianyi Cui 199f59dc5e Merge pull request #344 from deepseek-harness/docs/i18n-batch-cds-postmortem
docs(i18n): core-data-structures and postmortem batch — 22 bilingual pairs
2026-07-24 20:58:42 +08:00
Tianyi Cui 19117d68f1 Merge pull request #345 from deepseek-harness/docs/i18n-batch-rfc
docs(i18n): RFC tree batch — 146 bilingual pairs via the committed pipeline
2026-07-24 20:58:25 +08:00
Tianyi Cui aef844e2e6 Merge pull request #591 from deepseek-harness/fix/goal-completion-strict-fields
fix(goal): loosen restriction for toolcall arguments
2026-07-24 20:52:23 +08:00
Hypatia May ba6fc1cfa3 fix: harden session query authorization 2026-07-24 20:50:53 +08:00
Tianyi Cui 9e691d54c0 fix(goal): normalize strict-schema fillers 2026-07-24 20:45:23 +08:00
Tianyi Cui 145ba169f6 Merge commit 'refs/codex-unblock/20260724/pr591-base-current' into worktree/unblock-pr-591-ci-20260724 2026-07-24 20:32:02 +08:00
Tianyi Cui d08050ab69 chore(web-e2e): gate fixes — catalog, budgets, knip
Regenerate config-catalog for the llm-replay paceMs row; condense the
testing.md web-lane entry to pointer form and raise its ceiling 1020->1060
(the two-sentence tier entry for a genuinely new surface does not fit the
old ceiling after relocation-first trims); internalize two harness helpers
knip flagged (rawSessionLog/normalizeAria are module-internal).
2026-07-24 20:30:33 +08:00
Tianyi Cui 15eb71fd7f Merge pull request #575 from deepseek-harness/feat/send-unify
feat(agent): unify send(target × wakeup) and coalesce context/message into user/message
2026-07-24 20:19:53 +08:00
Hypatia May 04c8a17de5 fix: cancel exact session observations 2026-07-24 20:08:38 +08:00
Tianyi Cui 6a78b2cb2e Merge branch 'master' into feat/send-unify 2026-07-24 20:07:46 +08:00
_Kerman 6cb6d87ff3 Merge pull request #602 from deepseek-harness/xtr/rfc-context-injection-semantics
docs(agent): propose context injection semantics
2026-07-24 20:06:24 +08:00
Turtle ee5132c1e1 refactor(cli): dispatch web as a reserved token, drop parse machinery
Simplify the Commander adapter now that behavior can change: dispatch a leading
`web` token to its own parser instead of a subcommand of the root program, and
read opts()/processedArgs after parse() instead of action closures with a
mutable holder.

This removes enablePositionalOptions(), the parent-option leak guard, both
action closures, and the --resume/--prompt argParser threading. Behavior
changes: `dsh -p x web` is a headless prompt (extra positional dropped),
`dsh web -p x` fails loud (web has no -p), and a repeated --resume is natural
last-wins. The two real fail-loud invariants stay as post-parse checks: an empty
--resume= id (agent-loop treats '' as no-resume) and an empty -p task.

Trims args.spec.ts to the routing/fail-loud/help behavior that matters; the
tui-agent keyless PTY smoke still covers bin.ts dispatch end to end. Net ~114
fewer lines across adapter and tests.
2026-07-24 20:01:38 +08:00
Tianyi Cui 2cd37e2765 docs(testing): web e2e lane docs + Agent Note to implemented
testing.md gains the web browser snapshot tier entry (divergent
DSH_SNAPSHOT=... test:web commands) and names apps/web/tests/snapshots/
as the web surface's snapshot home. The GUI testing note's tier map and
lane map gain the e2e scenarios (both languages, pair re-recorded) and
drop the stale verify-session-real references (those scripts left with
the missions/ tree). packages/client/AGENTS.md check ladder covers the
wire-carriage trigger and refresh/record commands. acp-snapshot README
stops claiming the whole package is ACP-specific — its normalizers are
transport-neutral with three consumers now. vitest.web.config.ts header
carries TODO(ci-browser) with the staged-reversal pointer.

The design-study Agent Note moves proposed/ -> implemented/ rewritten in
present tense: all review decisions recorded (llm:false seam over the
placeholder-key hack, providers-mode replay, whenIdle barrier stack,
single aria golden + anchors, TUI-style inline modes over a suite
factory, scrub-only header stance, CI deferral) with re-entry triggers
under Deferred.
2026-07-24 19:57:27 +08:00
Turtle 4e295221f3 refactor(persistence): group sessions in project directories 2026-07-24 19:52:47 +08:00
Tianyi Cui 46b9a91e55 test(web): keyless browser e2e lane — replayed round trip + seeded cold resume
apps/web/tests/harness.ts boots the real web assembly in-process
(startHost llm:false -> installLlmReplay providers-mode -> mountWebPlugins
-> startWebServer) under DSH_SNAPSHOT replay/record/refresh. Barrier
stack: in-process turn/end -> agent.whenIdle (covers the persistence
flush) -> browser settled-poll. Seeding goes through the real persistence
API (semantic-checkpoint precedent); record harvests fixtures from live
session memory and tokenizes {{sessionId}}/{{cwd}}; refresh is the sole
golden writer. Console tripwires fail scenarios on reconnect/gap-repair
self-healing; harness close asserts full replay-fixture consumption.

Scenarios, each with fixtures recorded against THIS assembly via a live
model run: replay-round-trip (real composer -> real bash echo -> settled
markdown + aria golden + world-state event asserts) and seeded-history
(cold sidebar list -> implicit resume on open -> history tool cards from
the log, zero model calls). apps/web/tests are host-plane programs:
excluded from the client-registered apps/web project, included in
tsconfig.host.json (one program cannot hold both Context merge sides).
2026-07-24 19:49:02 +08:00