mirror of
https://github.com/deepseek-ai/deepseek-harness
synced 2026-08-15 21:04:50 +00:00
Implements the RFC 010 MVP: a new `@deepseek-ai/dsh-acp` package bridges the harness agent to the Agent Client Protocol (JSON-RPC 2.0 over newline-delimited stdio), so Zed and other ACP editors can drive the coding agent — streaming render, tool-call display, and resumable sessions via `session/load`. - packages/acp: AgentSideConnection wiring; initialize/newSession/loadSession/ prompt/cancel; a total TurnEndReason→StopReason codec; settle-once with a fallback chain (agent/turn-end → logged turn/end → idle); single-session guard; cwd-must-equal-launch-dir validation; load replays from the persisted event log (assistant/chunk→agent_message_chunk, tool/call/result→tool_call*). - agent: add Agent.whenIdle() quiescence signal to the interface; LoopAgent implements it (resolves on the first running→idle/disposed transition). The bridge awaits it on disposal so teardown reaches quiescence, not just abort. - examples: extract the shared provider/tool core into examples/base.yml; coding-agent nest-includes it; new examples/acp-agent serves the agent over ACP with JSONL persistence and no stdout logger (stdout is the protocol). - Permission gate deferred (TODO(rfc010-permission-gate)): tools run with the executor's full authority; only the Agent→sessionId ownership seam is laid down. Cancel is best-effort for a not-yet-started queued turn (TODO(rfc010-cancel-prestep)). RFC 010 stays `proposed`. - Docs: package README + Zed snippet; client-driver cookbook section; root and packages layout/commands; RFC 010 implementation-status note. 48 bridge tests + whenIdle coverage; 100% per-file coverage; e2e boots the example as a subprocess and verifies a written file on disk (key-gated, with a no-key stdout-purity check).
57 lines
2.0 KiB
YAML
57 lines
2.0 KiB
YAML
# Shared provider/tool core for the example agents, loaded via a nested
|
|
# @cordisjs/plugin-include from each example's cordis.yml. Contains everything
|
|
# the model and tools need; each example adds its own infra (logger/timer/hmr),
|
|
# its agent-loop config (the examples disagree — see below), and its UI plugin.
|
|
#
|
|
# Deliberately EXCLUDES:
|
|
# - the console logger: it writes to stdout, which the acp-agent reserves for
|
|
# the JSON-RPC protocol (see packages/acp). Each example loads logging itself.
|
|
# - agent-loop: AgentLoop pre-creates its configured `agents` in its
|
|
# constructor, and the examples disagree — coding-agent needs a pre-created
|
|
# `main` (its stdio-chat calls ctx.agents.get('main')), while acp-agent must
|
|
# pre-create NONE (ACP session/new creates agents on demand). So each example
|
|
# declares agent-loop with its own `agents` list.
|
|
#
|
|
# Plugin entries here use package names (resolved from node_modules), so they
|
|
# are insensitive to the baseUrl reset that plugin-include performs per file.
|
|
# Requires DEEPSEEK_API_KEY (and optionally DEEPSEEK_BASE_URL) in the env.
|
|
|
|
- id: llm
|
|
name: '@deepseek-ai/dsh-llm'
|
|
|
|
- id: sessions
|
|
name: '@deepseek-ai/dsh-session'
|
|
|
|
- id: system-prompt
|
|
name: '@deepseek-ai/dsh-system-prompt'
|
|
|
|
- id: tools
|
|
name: '@deepseek-ai/dsh-tools'
|
|
|
|
- id: agents
|
|
name: '@deepseek-ai/dsh-agent'
|
|
|
|
# Dev-mode event-contract assertions + session-log freeze (off in prod).
|
|
- id: invariants
|
|
name: '@deepseek-ai/dsh-invariants'
|
|
|
|
# The DeepSeek adapter. Swap to '@deepseek-ai/dsh-llm-pi-ai' for the pi-ai-backed
|
|
# twin (same config shape; `reasoning: high` replaces thinking/reasoningEffort).
|
|
- id: llm-deepseek
|
|
name: '@deepseek-ai/dsh-llm-deepseek'
|
|
config:
|
|
apiKey: !!js process.env.DEEPSEEK_API_KEY
|
|
baseURL: !!js process.env.DEEPSEEK_BASE_URL
|
|
models:
|
|
- deepseek-v4-flash
|
|
- deepseek-v4-pro
|
|
|
|
# Bash execution: the local executor implementation + the tool schemas.
|
|
- id: bash
|
|
name: '@deepseek-ai/dsh-bash-local'
|
|
config:
|
|
timeoutMs: 60000
|
|
|
|
- id: tool-bash
|
|
name: '@deepseek-ai/dsh-tool-bash'
|