diff --git a/apps/server/src/provider/Layers/CopilotAdapter.test.ts b/apps/server/src/provider/Layers/CopilotAdapter.test.ts index a8c232b984e..f440485c786 100644 --- a/apps/server/src/provider/Layers/CopilotAdapter.test.ts +++ b/apps/server/src/provider/Layers/CopilotAdapter.test.ts @@ -21,6 +21,18 @@ it("preserves session-wide approvals", () => { }); }); +it("uses the Copilot SDK 1.x permission decision contract", () => { + NodeAssert.deepEqual(approvalDecisionToPermissionResult("accept"), { + kind: "approve-once", + }); + NodeAssert.deepEqual(approvalDecisionToPermissionResult("decline"), { + kind: "reject", + }); + NodeAssert.deepEqual(approvalDecisionToPermissionResult("cancel"), { + kind: "reject", + }); +}); + it("identifies assistant events emitted by subagents", () => { NodeAssert.equal( isSubagentAssistantEvent({ type: "assistant.message", agentId: "agent-1" } as never), diff --git a/apps/server/src/provider/Layers/CopilotAdapter.ts b/apps/server/src/provider/Layers/CopilotAdapter.ts index e5e4e2de7cf..12681c0c1b6 100644 --- a/apps/server/src/provider/Layers/CopilotAdapter.ts +++ b/apps/server/src/provider/Layers/CopilotAdapter.ts @@ -311,13 +311,13 @@ export function approvalDecisionToPermissionResult( ): PermissionRequestResult { switch (decision) { case "accept": - return { kind: "approved" }; + return { kind: "approve-once" }; case "acceptForSession": return { kind: "approve-for-session" }; case "decline": case "cancel": default: - return { kind: "denied-interactively-by-user" }; + return { kind: "reject" }; } } @@ -1092,7 +1092,7 @@ export const makeCopilotAdapter = Effect.fn("makeCopilotAdapter")(function* ( ) => { const onPermissionRequest = (request: PermissionRequest) => getRuntimeMode() === "full-access" - ? Promise.resolve({ kind: "approved" }) + ? Promise.resolve(approvalDecisionToPermissionResult("accept")) : new Promise((resolve) => { const requestId = `copilot-approval-${NodeCrypto.randomUUID()}`; const turnId = getCurrentTurnId(); @@ -1377,7 +1377,7 @@ export const makeCopilotAdapter = Effect.fn("makeCopilotAdapter")(function* ( }), ]); for (const pending of record.pendingApprovalResolvers.values()) { - pending.resolve({ kind: "denied-interactively-by-user" }); + pending.resolve(approvalDecisionToPermissionResult("cancel")); } record.pendingApprovalResolvers.clear(); for (const pending of record.pendingUserInputResolvers.values()) {