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).
29 lines
815 B
TypeScript
29 lines
815 B
TypeScript
import { execFileSync } from 'node:child_process'
|
|
import { resolve } from 'node:path'
|
|
|
|
// publint every publishable package (vendor/ is private upstream code and
|
|
// examples/ are not packages; both are out of scope).
|
|
const packages = [
|
|
'packages/llm',
|
|
'packages/session',
|
|
'packages/session-persistence',
|
|
'packages/session-persistence-jsonl',
|
|
'packages/session-persistence-sqlite',
|
|
'packages/system-prompt',
|
|
'packages/tools',
|
|
'packages/agent',
|
|
'packages/agent-loop',
|
|
'packages/bash',
|
|
'packages/llm-deepseek',
|
|
'packages/llm-pi-ai',
|
|
'packages/bash-local',
|
|
'packages/tool-bash',
|
|
'packages/invariants',
|
|
'packages/acp',
|
|
]
|
|
|
|
const root = resolve(import.meta.dirname, '..')
|
|
for (const path of packages) {
|
|
execFileSync('node_modules/.bin/publint', [path], { cwd: root, stdio: 'inherit' })
|
|
}
|