test(acp-example): snapshot the session/new workspace-scope rejection
Master's "fix(acp): align prompt and workspace contracts" made session/new reject a non-empty additionalDirectories / mcpServers (widening the workspace scope is unimplemented). Add a `reject-extra-dirs` scenario + a `newSessionExpectError` input op that pins this editor-facing contract: the bridge answers with `-32602 Invalid params: additionalDirectories is not supported`. Keyless, deterministic, no model call. (session/load replay — the other new master behavior — needs a two-phase seed-then-load harness and is left for a focused follow-up.)
This commit is contained in:
@@ -37,6 +37,7 @@ interface Scenario {
|
|||||||
|
|
||||||
const SCENARIOS: Scenario[] = [
|
const SCENARIOS: Scenario[] = [
|
||||||
{ name: 'handshake', hasModelTurn: false, recorded: false },
|
{ name: 'handshake', hasModelTurn: false, recorded: false },
|
||||||
|
{ name: 'reject-extra-dirs', hasModelTurn: false, recorded: false },
|
||||||
{ name: 'text-turn', hasModelTurn: true, recorded: true },
|
{ name: 'text-turn', hasModelTurn: true, recorded: true },
|
||||||
{ name: 'tool-call-turn', hasModelTurn: true, recorded: true },
|
{ name: 'tool-call-turn', hasModelTurn: true, recorded: true },
|
||||||
{ name: 'workspace-edit', hasModelTurn: true, recorded: true },
|
{ name: 'workspace-edit', hasModelTurn: true, recorded: true },
|
||||||
|
|||||||
@@ -55,6 +55,7 @@ const repoTsconfig = fileURLToPath(new URL('../../../tsconfig.json', import.meta
|
|||||||
type InputStep =
|
type InputStep =
|
||||||
| { op: 'initialize'; terminalOutput?: boolean }
|
| { op: 'initialize'; terminalOutput?: boolean }
|
||||||
| { op: 'newSession' }
|
| { op: 'newSession' }
|
||||||
|
| { op: 'newSessionExpectError'; additionalDirectories?: string[] }
|
||||||
| { op: 'prompt'; text: string }
|
| { op: 'prompt'; text: string }
|
||||||
| { op: 'promptExpectError'; text: string }
|
| { op: 'promptExpectError'; text: string }
|
||||||
| { op: 'promptAndCancel'; text: string }
|
| { op: 'promptAndCancel'; text: string }
|
||||||
@@ -228,6 +229,21 @@ async function runStep(
|
|||||||
setSessionId(sessionId)
|
setSessionId(sessionId)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
case 'newSessionExpectError': {
|
||||||
|
// The bridge rejects a session/new that widens the workspace scope
|
||||||
|
// (non-empty additionalDirectories / mcpServers — unimplemented). The SDK
|
||||||
|
// surfaces that as a rejected RPC; swallow it so the run completes and the
|
||||||
|
// error frame is captured in the transcript.
|
||||||
|
await client.newSession({
|
||||||
|
cwd,
|
||||||
|
mcpServers: [],
|
||||||
|
...step.additionalDirectories !== undefined ? { additionalDirectories: step.additionalDirectories } : {},
|
||||||
|
}).then(
|
||||||
|
() => { throw new Error('snapshot-harness: expected session/new to be rejected but it succeeded') },
|
||||||
|
() => { /* expected: the bridge rejected the unsupported workspace scope */ },
|
||||||
|
)
|
||||||
|
return
|
||||||
|
}
|
||||||
case 'prompt': {
|
case 'prompt': {
|
||||||
const sessionId = getSessionId()
|
const sessionId = getSessionId()
|
||||||
if (sessionId === undefined) throw new Error('snapshot-harness: prompt before newSession')
|
if (sessionId === undefined) throw new Error('snapshot-harness: prompt before newSession')
|
||||||
|
|||||||
@@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"steps": [
|
||||||
|
{ "op": "initialize" },
|
||||||
|
{ "op": "newSessionExpectError", "additionalDirectories": ["/extra-dir"] }
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
{"type":"session","version":1,"id":"00000000-0000-0000-0000-000000000000","createdAt":0}
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
{"jsonrpc":"2.0","id":1,"result":{"protocolVersion":1,"agentInfo":{"name":"deepseek-harness-acp","version":"0.0.1"},"agentCapabilities":{"loadSession":true,"promptCapabilities":{"image":false,"audio":false,"embeddedContext":false}},"authMethods":[]}}
|
||||||
|
{"jsonrpc":"2.0","id":2,"error":{"code":-32602,"message":"Invalid params: additionalDirectories is not supported in this MVP"}}
|
||||||
Reference in New Issue
Block a user