1import { describe, expect, it } from "@effect/vitest";
2import * as Schema from "effect/Schema";
3
4import {
5 OrchestratorMcpDelegateTaskInput,
6 OrchestratorMcpDelegateTaskResult,
7} from "./orchestratorMcp.ts";
8
9const decodeDelegateTaskInput = Schema.decodeUnknownSync(OrchestratorMcpDelegateTaskInput);
10const decodeDelegateTaskResult = Schema.decodeUnknownSync(OrchestratorMcpDelegateTaskResult);
11
12describe("orchestrator MCP contracts", () => {
13 it("decodes cross-provider delegated task requests and durable results", () => {
14 const request = decodeDelegateTaskInput({
15 task: "Inspect the workspace and report the result.",
16 target: {
17 providerInstanceId: "claudeAgent",
18 model: "claude-sonnet-4-6",
19 },
20 mode: "wait",
21 timeoutMs: 5_000,
22 clientRequestId: "delegate-1",
23 runtimeMode: "inherit",
24 interactionMode: "inherit",
25 });
26 const result = decodeDelegateTaskResult({
27 taskId: "node-task-1",
28 childThreadId: "thread-child-1",
29 childRunId: "run-child-1",
30 childNodeId: "node-task-1",
31 status: "completed",
32 workState: "result_available",
33 hasPendingChildRuns: false,
34 providerInstanceId: "claudeAgent",
35 model: "claude-sonnet-4-6",
36 summary: "Workspace inspected.",
37 resultContextTransferId: "context-transfer-result-1",
38 latestTerminalRunId: "run-child-1",
39 latestTerminalStatus: "completed",
40 latestTerminalSummary: "Workspace inspected.",
41 latestTerminalResultContextTransferId: "context-transfer-result-1",
42 hasPendingQuestion: false,
43 pendingApproval: null,
44 waitTimedOut: false,
45 });
46
47 expect(request.target?.providerInstanceId).toBe("claudeAgent");
48 expect(result.status).toBe("completed");
49 expect(result.summary).toBe("Workspace inspected.");
50 expect(result.pendingApproval).toBeNull();
51 const pendingApproval = {
52 requestId: "request-approval-1",
53 kind: "command",
54 runId: "run-child-1",
55 };
56 expect(
57 decodeDelegateTaskResult({
58 ...result,
59 pendingApproval: { ...pendingApproval, input: { command: "private command" } },
60 }).pendingApproval,
61 ).toEqual(pendingApproval);
62 expect(() =>
63 decodeDelegateTaskResult({
64 ...result,
65 pendingApproval: { ...pendingApproval, kind: "user_input" },
66 }),
67 ).toThrow();
68 });
69});