mirror of
https://github.com/deepseek-ai/deepseek-harness
synced 2026-08-15 21:04:50 +00:00
Plan mode's stage 2 (RFC 2026-07-07-plan-mode). The exit tool: one required plan argument (the durable log artifact), execute re-checks the folded mode, then conducts the review over the user-interaction seam — one single-select question (Approve / Keep planning) with free text open — so an approval appends mode/set back to default in-turn and every other outcome (keep-planning feedback verbatim, aborted, no provider) returns the corrective isError with the mode unchanged. presentCall is a generic card titled by the plan's first heading carrying the plan markdown; over ACP the review rides the ask_user elicitation flow, in the terminal the stdio prompt queue — no approval-seam dependency. The ACP bridge maps the picker 1:1 onto ctx.modes (opportunistic, a type-only peer edge): session/new + session/load advertise availableModes/currentModeId, session/set_mode validates through set() and echoes an optimistic current_mode_update (the pending mode IS the selection; the logged mode/set lands at the boundary and, matching, is not re-sent), and a session/event listener re-notifies on each logged flip that differs from the last sent — the tool-driven exit updates the picker. The feature matrix rows move from 'not modeled' to the picker-to-modes / knobs-to-config-options division, with the ACP v2 removal direction recorded as a mechanical-migration risk. The snapshot harness gains the setMode/setModeExpectError ops and a scripted elicitationAnswers FIFO (cancel on exhaustion; a stray choice string reaches the agent verbatim as a non-consenting custom answer, so a scenario bug fails safe). The suite factory's header-pin requirement now applies only to model-turn scenarios — a protocol-only suite has no header content to anchor. examples/plan-acp-agent is the live composition; its keyless modes-advertise scenario pins the wire surface (advertisement, both set_mode round-trips, unknown-id rejection). The recorded plan-mode approve/reject arc awaits a with-key recording session; its texts are pinned at the unit tier meanwhile. examples/AGENTS.md ceiling 653 → 680: the new example's required smoke row does not fit the old budget.
28 lines
1.3 KiB
YAML
28 lines
1.3 KiB
YAML
# Snapshot-test REPLAY overlay for the plan-mode composition: the SAME app
|
|
# tree as cordis.yml, derived from it by an include — the one difference is
|
|
# the model backend. A keyless replay run cannot boot the real adapter
|
|
# (llm-deepseek's apply() throws without DEEPSEEK_API_KEY), so the include
|
|
# patches the live tree at load time: the llm-deepseek entry is disabled by
|
|
# id, and the llm-replay entry (which serves a recorded session JSONL — no
|
|
# API key, no network) is inserted. Every other entry — the mode plugin, the
|
|
# filesystem stack, the app — IS the live tree.
|
|
#
|
|
# The dsh-acp-agent bin selects this file for DSH_SNAPSHOT=replay (the
|
|
# sibling-swap of whatever config path it was handed). The replay fixture
|
|
# path comes from $DSH_SNAPSHOT_FILE, set by the snapshot harness. stdout
|
|
# stays reserved for the ACP JSON-RPC protocol.
|
|
- id: base
|
|
name: '@cordisjs/plugin-include'
|
|
config:
|
|
path: ./cordis.yml
|
|
patches:
|
|
# The name is an assertion, not an override: the include skips the patch
|
|
# (warning) when the id points at a different plugin, so this can never
|
|
# disable the wrong entry.
|
|
- id: llm-deepseek
|
|
name: '@deepseek-ai/dsh-llm-deepseek'
|
|
disabled: true
|
|
- insert:
|
|
- id: llm-replay
|
|
name: '@deepseek-ai/dsh-llm-replay'
|