{"version":3,"file":"delegated-work.test.d.ts","sourceRoot":"","sources":["../../src/core/delegated-work.test.ts"],"names":[],"mappings":"","sourcesContent":["import type { ToolResultMessage } from \"@apholdings/jensen-ai\";\nimport { describe, expect, it } from \"vitest\";\nimport {\n\tapplyDelegatedResult,\n\tbuildDelegatedWorkSummary,\n\textractDelegatedTasks,\n\tgetRecentDelegatedTasks,\n\tmergeDelegatedTask,\n\treconcileDelegatedResult,\n\tsyncDelegatedWork,\n} from \"./delegated-work.js\";\nimport type { ToolCallEvent } from \"./extensions/index.js\";\n\ndescribe(\"delegated-work\", () => {\n\t// =========================================================================\n\t// extractDelegatedTasks\n\t// =========================================================================\n\n\tdescribe(\"extractDelegatedTasks\", () => {\n\t\tit(\"returns empty array for non-subagent tool calls\", () => {\n\t\t\tconst event: ToolCallEvent = {\n\t\t\t\ttype: \"tool_call\",\n\t\t\t\ttoolCallId: \"call_1\",\n\t\t\t\ttoolName: \"bash\",\n\t\t\t\tinput: { command: \"echo hello\" },\n\t\t\t};\n\t\t\texpect(extractDelegatedTasks(event)).toEqual([]);\n\t\t});\n\n\t\tit(\"extracts single mode task with agent and task\", () => {\n\t\t\tconst event: ToolCallEvent = {\n\t\t\t\ttype: \"tool_call\",\n\t\t\t\ttoolCallId: \"call_1\",\n\t\t\t\ttoolName: \"subagent\",\n\t\t\t\tinput: {\n\t\t\t\t\tagent: \"worker\",\n\t\t\t\t\ttask: \"Fix the bug in auth module\",\n\t\t\t\t},\n\t\t\t};\n\t\t\tconst tasks = extractDelegatedTasks(event);\n\t\t\texpect(tasks).toEqual([\n\t\t\t\t{\n\t\t\t\t\ttoolCallId: \"call_1\",\n\t\t\t\t\tagent: \"worker\",\n\t\t\t\t\tagentSource: \"unknown\",\n\t\t\t\t\ttask: \"Fix the bug in auth module\",\n\t\t\t\t\tmode: \"single\",\n\t\t\t\t\tstatus: \"active\",\n\t\t\t\t\trawArgs: { agent: \"worker\", task: \"Fix the bug in auth module\" },\n\t\t\t\t\ttimestamp: expect.any(Number),\n\t\t\t\t},\n\t\t\t]);\n\t\t});\n\n\t\tit(\"extracts one child task per parallel request\", () => {\n\t\t\tconst event: ToolCallEvent = {\n\t\t\t\ttype: \"tool_call\",\n\t\t\t\ttoolCallId: \"call_2\",\n\t\t\t\ttoolName: \"subagent\",\n\t\t\t\tinput: {\n\t\t\t\t\ttasks: [\n\t\t\t\t\t\t{ agent: \"worker\", task: \"Task 1\" },\n\t\t\t\t\t\t{ agent: \"reviewer\", task: \"Task 2\" },\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t};\n\t\t\tconst tasks = extractDelegatedTasks(event);\n\t\t\texpect(tasks).toMatchObject([\n\t\t\t\t{\n\t\t\t\t\ttoolCallId: \"call_2\",\n\t\t\t\t\tchildIndex: 1,\n\t\t\t\t\tagent: \"worker\",\n\t\t\t\t\ttask: \"Task 1\",\n\t\t\t\t\tmode: \"parallel\",\n\t\t\t\t\tstatus: \"active\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\ttoolCallId: \"call_2\",\n\t\t\t\t\tchildIndex: 2,\n\t\t\t\t\tagent: \"reviewer\",\n\t\t\t\t\ttask: \"Task 2\",\n\t\t\t\t\tmode: \"parallel\",\n\t\t\t\t\tstatus: \"active\",\n\t\t\t\t},\n\t\t\t]);\n\t\t});\n\n\t\tit(\"extracts only the first active chain step at tool-call start\", () => {\n\t\t\tconst event: ToolCallEvent = {\n\t\t\t\ttype: \"tool_call\",\n\t\t\t\ttoolCallId: \"call_3\",\n\t\t\t\ttoolName: \"subagent\",\n\t\t\t\tinput: {\n\t\t\t\t\tchain: [\n\t\t\t\t\t\t{ agent: \"planner\", task: \"Plan the feature\" },\n\t\t\t\t\t\t{ agent: \"worker\", task: \"Implement it\" },\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t};\n\t\t\tconst tasks = extractDelegatedTasks(event);\n\t\t\texpect(tasks).toMatchObject([\n\t\t\t\t{\n\t\t\t\t\ttoolCallId: \"call_3\",\n\t\t\t\t\tagent: \"planner\",\n\t\t\t\t\ttask: \"Plan the feature\",\n\t\t\t\t\tmode: \"chain\",\n\t\t\t\t\tstatus: \"active\",\n\t\t\t\t\tstep: 1,\n\t\t\t\t},\n\t\t\t]);\n\t\t});\n\n\t\tit(\"returns empty array when agent is missing\", () => {\n\t\t\tconst event: ToolCallEvent = {\n\t\t\t\ttype: \"tool_call\",\n\t\t\t\ttoolCallId: \"call_4\",\n\t\t\t\ttoolName: \"subagent\",\n\t\t\t\tinput: { task: \"Some task without agent\" },\n\t\t\t};\n\t\t\texpect(extractDelegatedTasks(event)).toEqual([]);\n\t\t});\n\n\t\tit(\"returns empty array when task is missing\", () => {\n\t\t\tconst event: ToolCallEvent = {\n\t\t\t\ttype: \"tool_call\",\n\t\t\t\ttoolCallId: \"call_5\",\n\t\t\t\ttoolName: \"subagent\",\n\t\t\t\tinput: { agent: \"worker\" },\n\t\t\t};\n\t\t\texpect(extractDelegatedTasks(event)).toEqual([]);\n\t\t});\n\n\t\tit(\"returns empty array for empty input\", () => {\n\t\t\tconst event: ToolCallEvent = {\n\t\t\t\ttype: \"tool_call\",\n\t\t\t\ttoolCallId: \"call_6\",\n\t\t\t\ttoolName: \"subagent\",\n\t\t\t\tinput: {},\n\t\t\t};\n\t\t\texpect(extractDelegatedTasks(event)).toEqual([]);\n\t\t});\n\t});\n\n\t// =========================================================================\n\t// applyDelegatedResult\n\t// =========================================================================\n\n\tdescribe(\"applyDelegatedResult\", () => {\n\t\tit(\"returns undefined for non-subagent results\", () => {\n\t\t\tconst task = {\n\t\t\t\ttoolCallId: \"call_1\",\n\t\t\t\tagent: \"worker\",\n\t\t\t\tagentSource: \"unknown\" as const,\n\t\t\t\ttask: \"Test task\",\n\t\t\t\tmode: \"single\" as const,\n\t\t\t\tstatus: \"active\" as const,\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t};\n\t\t\tconst result: ToolResultMessage = {\n\t\t\t\trole: \"toolResult\",\n\t\t\t\ttoolCallId: \"call_1\",\n\t\t\t\ttoolName: \"bash\",\n\t\t\t\tcontent: [],\n\t\t\t\tisError: false,\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t};\n\t\t\texpect(applyDelegatedResult(task, result)).toBeUndefined();\n\t\t});\n\n\t\tit(\"returns task unchanged when result has no details yet (still running)\", () => {\n\t\t\tconst task = {\n\t\t\t\ttoolCallId: \"call_1\",\n\t\t\t\tagent: \"worker\",\n\t\t\t\tagentSource: \"unknown\" as const,\n\t\t\t\ttask: \"Test task\",\n\t\t\t\tmode: \"single\" as const,\n\t\t\t\tstatus: \"active\" as const,\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t};\n\t\t\tconst result: ToolResultMessage = {\n\t\t\t\trole: \"toolResult\",\n\t\t\t\ttoolCallId: \"call_1\",\n\t\t\t\ttoolName: \"subagent\",\n\t\t\t\tcontent: [{ type: \"text\", text: \"(running...)\" }],\n\t\t\t\tisError: false,\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t};\n\t\t\tconst updated = applyDelegatedResult(task, result);\n\t\t\texpect(updated?.status).toBe(\"active\");\n\t\t});\n\n\t\tit(\"marks task as completed with successful exit code\", () => {\n\t\t\tconst task = {\n\t\t\t\ttoolCallId: \"call_1\",\n\t\t\t\tagent: \"worker\",\n\t\t\t\tagentSource: \"unknown\" as const,\n\t\t\t\ttask: \"Test task\",\n\t\t\t\tmode: \"single\" as const,\n\t\t\t\tstatus: \"active\" as const,\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t};\n\t\t\tconst result: ToolResultMessage = {\n\t\t\t\trole: \"toolResult\",\n\t\t\t\ttoolCallId: \"call_1\",\n\t\t\t\ttoolName: \"subagent\",\n\t\t\t\tcontent: [{ type: \"text\", text: \"Done\" }],\n\t\t\t\tisError: false,\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t\tdetails: {\n\t\t\t\t\tmode: \"single\",\n\t\t\t\t\tagentScope: \"user\",\n\t\t\t\t\tprojectAgentsDir: null,\n\t\t\t\t\tdiscoveryErrors: [],\n\t\t\t\t\tresults: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tagent: \"worker\",\n\t\t\t\t\t\t\tagentSource: \"user\",\n\t\t\t\t\t\t\ttask: \"Test task\",\n\t\t\t\t\t\t\texitCode: 0,\n\t\t\t\t\t\t\tmessages: [{ role: \"assistant\", content: [{ type: \"text\", text: \"Completed successfully\" }] }],\n\t\t\t\t\t\t\tstderr: \"\",\n\t\t\t\t\t\t\tusage: {\n\t\t\t\t\t\t\t\tinput: 100,\n\t\t\t\t\t\t\t\toutput: 50,\n\t\t\t\t\t\t\t\tcacheRead: 0,\n\t\t\t\t\t\t\t\tcacheWrite: 0,\n\t\t\t\t\t\t\t\tcost: 0,\n\t\t\t\t\t\t\t\tcontextTokens: 150,\n\t\t\t\t\t\t\t\tturns: 1,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t};\n\t\t\tconst updated = applyDelegatedResult(task, result);\n\t\t\texpect(updated?.status).toBe(\"completed\");\n\t\t\texpect(updated?.agentSource).toBe(\"user\");\n\t\t\texpect(updated?.exitCode).toBe(0);\n\t\t\texpect(updated?.outputPreview).toBe(\"Completed successfully\");\n\t\t});\n\n\t\tit(\"marks task as error with non-zero exit code\", () => {\n\t\t\tconst task = {\n\t\t\t\ttoolCallId: \"call_1\",\n\t\t\t\tagent: \"worker\",\n\t\t\t\tagentSource: \"unknown\" as const,\n\t\t\t\ttask: \"Test task\",\n\t\t\t\tmode: \"single\" as const,\n\t\t\t\tstatus: \"active\" as const,\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t};\n\t\t\tconst result: ToolResultMessage = {\n\t\t\t\trole: \"toolResult\",\n\t\t\t\ttoolCallId: \"call_1\",\n\t\t\t\ttoolName: \"subagent\",\n\t\t\t\tcontent: [{ type: \"text\", text: \"Failed\" }],\n\t\t\t\tisError: false,\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t\tdetails: {\n\t\t\t\t\tmode: \"single\",\n\t\t\t\t\tagentScope: \"user\",\n\t\t\t\t\tprojectAgentsDir: null,\n\t\t\t\t\tdiscoveryErrors: [],\n\t\t\t\t\tresults: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tagent: \"worker\",\n\t\t\t\t\t\t\tagentSource: \"user\",\n\t\t\t\t\t\t\ttask: \"Test task\",\n\t\t\t\t\t\t\texitCode: 1,\n\t\t\t\t\t\t\tmessages: [],\n\t\t\t\t\t\t\tstderr: \"Command failed\",\n\t\t\t\t\t\t\tusage: {\n\t\t\t\t\t\t\t\tinput: 100,\n\t\t\t\t\t\t\t\toutput: 50,\n\t\t\t\t\t\t\t\tcacheRead: 0,\n\t\t\t\t\t\t\t\tcacheWrite: 0,\n\t\t\t\t\t\t\t\tcost: 0,\n\t\t\t\t\t\t\t\tcontextTokens: 150,\n\t\t\t\t\t\t\t\tturns: 1,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t};\n\t\t\tconst updated = applyDelegatedResult(task, result);\n\t\t\texpect(updated?.status).toBe(\"error\");\n\t\t\texpect(updated?.exitCode).toBe(1);\n\t\t\texpect(updated?.errorMessage).toBe(\"Command failed\");\n\t\t});\n\n\t\tit(\"marks task as error with failureStage set\", () => {\n\t\t\tconst task = {\n\t\t\t\ttoolCallId: \"call_1\",\n\t\t\t\tagent: \"worker\",\n\t\t\t\tagentSource: \"unknown\" as const,\n\t\t\t\ttask: \"Test task\",\n\t\t\t\tmode: \"single\" as const,\n\t\t\t\tstatus: \"active\" as const,\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t};\n\t\t\tconst result: ToolResultMessage = {\n\t\t\t\trole: \"toolResult\",\n\t\t\t\ttoolCallId: \"call_1\",\n\t\t\t\ttoolName: \"subagent\",\n\t\t\t\tcontent: [],\n\t\t\t\tisError: false,\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t\tdetails: {\n\t\t\t\t\tmode: \"single\",\n\t\t\t\t\tagentScope: \"user\",\n\t\t\t\t\tprojectAgentsDir: null,\n\t\t\t\t\tdiscoveryErrors: [],\n\t\t\t\t\tresults: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tagent: \"worker\",\n\t\t\t\t\t\t\tagentSource: \"user\",\n\t\t\t\t\t\t\ttask: \"Test task\",\n\t\t\t\t\t\t\texitCode: 0,\n\t\t\t\t\t\t\tmessages: [],\n\t\t\t\t\t\t\tstderr: \"\",\n\t\t\t\t\t\t\tusage: {\n\t\t\t\t\t\t\t\tinput: 100,\n\t\t\t\t\t\t\t\toutput: 50,\n\t\t\t\t\t\t\t\tcacheRead: 0,\n\t\t\t\t\t\t\t\tcacheWrite: 0,\n\t\t\t\t\t\t\t\tcost: 0,\n\t\t\t\t\t\t\t\tcontextTokens: 150,\n\t\t\t\t\t\t\t\tturns: 1,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tfailureStage: \"provider\",\n\t\t\t\t\t\t\tdiagnosticMessage: \"API rate limit exceeded\",\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t};\n\t\t\tconst updated = applyDelegatedResult(task, result);\n\t\t\texpect(updated?.status).toBe(\"error\");\n\t\t\texpect(updated?.errorMessage).toBe(\"API rate limit exceeded\");\n\t\t});\n\n\t\tit(\"marks task as blocked when child execution aborts with runtime evidence\", () => {\n\t\t\tconst task = {\n\t\t\t\ttoolCallId: \"call_blocked\",\n\t\t\t\tagent: \"worker\",\n\t\t\t\tagentSource: \"unknown\" as const,\n\t\t\t\ttask: \"Write to protected config\",\n\t\t\t\tmode: \"single\" as const,\n\t\t\t\tstatus: \"active\" as const,\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t};\n\t\t\tconst result: ToolResultMessage = {\n\t\t\t\trole: \"toolResult\",\n\t\t\t\ttoolCallId: \"call_blocked\",\n\t\t\t\ttoolName: \"subagent\",\n\t\t\t\tcontent: [{ type: \"text\", text: \"Blocked by approval policy\" }],\n\t\t\t\tisError: true,\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t\tdetails: {\n\t\t\t\t\tmode: \"single\",\n\t\t\t\t\tagentScope: \"user\",\n\t\t\t\t\tprojectAgentsDir: null,\n\t\t\t\t\tdiscoveryErrors: [],\n\t\t\t\t\tresults: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tagent: \"worker\",\n\t\t\t\t\t\t\tagentSource: \"user\",\n\t\t\t\t\t\t\ttask: \"Write to protected config\",\n\t\t\t\t\t\t\texitCode: 0,\n\t\t\t\t\t\t\tmessages: [],\n\t\t\t\t\t\t\tstderr: \"\",\n\t\t\t\t\t\t\tusage: {\n\t\t\t\t\t\t\t\tinput: 0,\n\t\t\t\t\t\t\t\toutput: 0,\n\t\t\t\t\t\t\t\tcacheRead: 0,\n\t\t\t\t\t\t\t\tcacheWrite: 0,\n\t\t\t\t\t\t\t\tcost: 0,\n\t\t\t\t\t\t\t\tcontextTokens: 0,\n\t\t\t\t\t\t\t\tturns: 1,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tstopReason: \"aborted\",\n\t\t\t\t\t\t\terrorMessage: \"Approval required before writing production config.\",\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t};\n\t\t\tconst updated = applyDelegatedResult(task, result);\n\t\t\texpect(updated).toMatchObject({\n\t\t\t\tstatus: \"blocked\",\n\t\t\t\terrorMessage: \"Approval required before writing production config.\",\n\t\t\t\texitCode: 0,\n\t\t\t});\n\t\t});\n\n\t\tit(\"keeps parallel siblings distinct when only one child has completed\", () => {\n\t\t\tconst completedChild = {\n\t\t\t\ttoolCallId: \"call_parallel\",\n\t\t\t\tchildIndex: 1,\n\t\t\t\tagent: \"worker\",\n\t\t\t\tagentSource: \"unknown\" as const,\n\t\t\t\ttask: \"Implement panel\",\n\t\t\t\tmode: \"parallel\" as const,\n\t\t\t\tstatus: \"active\" as const,\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t};\n\t\t\tconst runningChild = {\n\t\t\t\ttoolCallId: \"call_parallel\",\n\t\t\t\tchildIndex: 2,\n\t\t\t\tagent: \"reviewer\",\n\t\t\t\tagentSource: \"unknown\" as const,\n\t\t\t\ttask: \"Review panel\",\n\t\t\t\tmode: \"parallel\" as const,\n\t\t\t\tstatus: \"active\" as const,\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t};\n\t\t\tconst result: ToolResultMessage = {\n\t\t\t\trole: \"toolResult\",\n\t\t\t\ttoolCallId: \"call_parallel\",\n\t\t\t\ttoolName: \"subagent\",\n\t\t\t\tcontent: [{ type: \"text\", text: \"Parallel: 1/2 done, 1 running...\" }],\n\t\t\t\tisError: false,\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t\tdetails: {\n\t\t\t\t\tmode: \"parallel\",\n\t\t\t\t\tagentScope: \"user\",\n\t\t\t\t\tprojectAgentsDir: null,\n\t\t\t\t\tdiscoveryErrors: [],\n\t\t\t\t\tresults: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tagent: \"worker\",\n\t\t\t\t\t\t\tagentSource: \"user\",\n\t\t\t\t\t\t\ttask: \"Implement panel\",\n\t\t\t\t\t\t\texitCode: 0,\n\t\t\t\t\t\t\tmessages: [{ role: \"assistant\", content: [{ type: \"text\", text: \"Panel done\" }] }],\n\t\t\t\t\t\t\tstderr: \"\",\n\t\t\t\t\t\t\tusage: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, cost: 0, contextTokens: 0, turns: 1 },\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tagent: \"reviewer\",\n\t\t\t\t\t\t\tagentSource: \"unknown\",\n\t\t\t\t\t\t\ttask: \"Review panel\",\n\t\t\t\t\t\t\texitCode: -1,\n\t\t\t\t\t\t\tmessages: [],\n\t\t\t\t\t\t\tstderr: \"\",\n\t\t\t\t\t\t\tusage: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, cost: 0, contextTokens: 0, turns: 0 },\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t};\n\n\t\t\texpect(applyDelegatedResult(completedChild, result)).toMatchObject({\n\t\t\t\tstatus: \"completed\",\n\t\t\t\tagent: \"worker\",\n\t\t\t\tchildIndex: 1,\n\t\t\t\toutputPreview: \"Panel done\",\n\t\t\t});\n\t\t\texpect(applyDelegatedResult(runningChild, result)).toMatchObject({\n\t\t\t\tstatus: \"active\",\n\t\t\t\tagent: \"reviewer\",\n\t\t\t\tchildIndex: 2,\n\t\t\t\texitCode: -1,\n\t\t\t});\n\t\t});\n\t});\n\n\tdescribe(\"reconcileDelegatedResult\", () => {\n\t\tit(\"adds granular chain step entries from runtime results without inventing future steps\", () => {\n\t\t\tconst seedTask = {\n\t\t\t\ttoolCallId: \"chain_1\",\n\t\t\t\tagent: \"planner\",\n\t\t\t\tagentSource: \"unknown\" as const,\n\t\t\t\ttask: \"Plan the feature\",\n\t\t\t\tmode: \"chain\" as const,\n\t\t\t\tstatus: \"active\" as const,\n\t\t\t\tstep: 1,\n\t\t\t\trawArgs: {\n\t\t\t\t\tchain: [\n\t\t\t\t\t\t{ agent: \"planner\", task: \"Plan the feature\" },\n\t\t\t\t\t\t{ agent: \"worker\", task: \"Implement {previous}\" },\n\t\t\t\t\t\t{ agent: \"reviewer\", task: \"Review {previous}\" },\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t\ttimestamp: 100,\n\t\t\t};\n\t\t\tconst result: ToolResultMessage = {\n\t\t\t\trole: \"toolResult\",\n\t\t\t\ttoolCallId: \"chain_1\",\n\t\t\t\ttoolName: \"subagent\",\n\t\t\t\tcontent: [{ type: \"text\", text: \"Chain: step 1 done, step 2 running...\" }],\n\t\t\t\tisError: false,\n\t\t\t\ttimestamp: 200,\n\t\t\t\tdetails: {\n\t\t\t\t\tmode: \"chain\",\n\t\t\t\t\tagentScope: \"user\",\n\t\t\t\t\tprojectAgentsDir: null,\n\t\t\t\t\tdiscoveryErrors: [],\n\t\t\t\t\tresults: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tagent: \"planner\",\n\t\t\t\t\t\t\tagentSource: \"user\",\n\t\t\t\t\t\t\ttask: \"Plan the feature\",\n\t\t\t\t\t\t\texitCode: 0,\n\t\t\t\t\t\t\tstep: 1,\n\t\t\t\t\t\t\tmessages: [{ role: \"assistant\", content: [{ type: \"text\", text: \"Plan complete\" }] }],\n\t\t\t\t\t\t\tstderr: \"\",\n\t\t\t\t\t\t\tusage: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, cost: 0, contextTokens: 0, turns: 1 },\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tagent: \"worker\",\n\t\t\t\t\t\t\tagentSource: \"user\",\n\t\t\t\t\t\t\ttask: \"Implement Plan complete\",\n\t\t\t\t\t\t\texitCode: -1,\n\t\t\t\t\t\t\tstep: 2,\n\t\t\t\t\t\t\tmessages: [{ role: \"assistant\", content: [{ type: \"text\", text: \"Working on it\" }] }],\n\t\t\t\t\t\t\tstderr: \"\",\n\t\t\t\t\t\t\tusage: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, cost: 0, contextTokens: 0, turns: 1 },\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t};\n\n\t\t\tconst reconciled = reconcileDelegatedResult([seedTask], result);\n\t\t\texpect(reconciled).toHaveLength(2);\n\t\t\texpect(reconciled).toMatchObject([\n\t\t\t\t{\n\t\t\t\t\ttoolCallId: \"chain_1\",\n\t\t\t\t\tmode: \"chain\",\n\t\t\t\t\tstep: 1,\n\t\t\t\t\tagent: \"planner\",\n\t\t\t\t\tstatus: \"completed\",\n\t\t\t\t\toutputPreview: \"Plan complete\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\ttoolCallId: \"chain_1\",\n\t\t\t\t\tmode: \"chain\",\n\t\t\t\t\tstep: 2,\n\t\t\t\t\tagent: \"worker\",\n\t\t\t\t\tstatus: \"active\",\n\t\t\t\t\texitCode: -1,\n\t\t\t\t},\n\t\t\t]);\n\t\t\texpect(reconciled.some((task) => task.step === 3)).toBe(false);\n\t\t});\n\n\t\tit(\"marks still-active children as blocked when the parent tool ends with cancellation evidence\", () => {\n\t\t\tconst tasks = [\n\t\t\t\t{\n\t\t\t\t\ttoolCallId: \"parallel_approval\",\n\t\t\t\t\tchildIndex: 1,\n\t\t\t\t\tagent: \"worker\",\n\t\t\t\t\tagentSource: \"unknown\" as const,\n\t\t\t\t\ttask: \"Implement the change\",\n\t\t\t\t\tmode: \"parallel\" as const,\n\t\t\t\t\tstatus: \"active\" as const,\n\t\t\t\t\ttimestamp: 100,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\ttoolCallId: \"parallel_approval\",\n\t\t\t\t\tchildIndex: 2,\n\t\t\t\t\tagent: \"reviewer\",\n\t\t\t\t\tagentSource: \"unknown\" as const,\n\t\t\t\t\ttask: \"Review the change\",\n\t\t\t\t\tmode: \"parallel\" as const,\n\t\t\t\t\tstatus: \"active\" as const,\n\t\t\t\t\ttimestamp: 101,\n\t\t\t\t},\n\t\t\t];\n\t\t\tconst result: ToolResultMessage = {\n\t\t\t\trole: \"toolResult\",\n\t\t\t\ttoolCallId: \"parallel_approval\",\n\t\t\t\ttoolName: \"subagent\",\n\t\t\t\tcontent: [{ type: \"text\", text: \"Canceled: project-local agents not approved.\" }],\n\t\t\t\tisError: false,\n\t\t\t\ttimestamp: 200,\n\t\t\t\tdetails: {\n\t\t\t\t\tmode: \"parallel\",\n\t\t\t\t\tagentScope: \"both\",\n\t\t\t\t\tprojectAgentsDir: \"/tmp/project/.jensen/agents\",\n\t\t\t\t\tdiscoveryErrors: [],\n\t\t\t\t\tresults: [],\n\t\t\t\t},\n\t\t\t};\n\n\t\t\tconst reconciled = reconcileDelegatedResult(tasks, result);\n\t\t\texpect(reconciled).toMatchObject([\n\t\t\t\t{\n\t\t\t\t\tchildIndex: 1,\n\t\t\t\t\tstatus: \"blocked\",\n\t\t\t\t\terrorMessage: \"Canceled: project-local agents not approved.\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tchildIndex: 2,\n\t\t\t\t\tstatus: \"blocked\",\n\t\t\t\t\terrorMessage: \"Canceled: project-local agents not approved.\",\n\t\t\t\t},\n\t\t\t]);\n\t\t});\n\t});\n\n\t// =========================================================================\n\t// buildDelegatedWorkSummary\n\t// =========================================================================\n\n\tdescribe(\"buildDelegatedWorkSummary\", () => {\n\t\tit(\"returns empty summary for no tasks\", () => {\n\t\t\tconst summary = buildDelegatedWorkSummary([]);\n\t\t\texpect(summary.total).toBe(0);\n\t\t\texpect(summary.active).toEqual([]);\n\t\t\texpect(summary.completed).toEqual([]);\n\t\t\texpect(summary.failed).toEqual([]);\n\t\t\texpect(summary.isSessionState).toBe(true);\n\t\t});\n\n\t\tit(\"categorizes tasks by status\", () => {\n\t\t\tconst tasks = [\n\t\t\t\t{\n\t\t\t\t\ttoolCallId: \"1\",\n\t\t\t\t\tagent: \"w1\",\n\t\t\t\t\tagentSource: \"user\" as const,\n\t\t\t\t\ttask: \"t1\",\n\t\t\t\t\tmode: \"single\" as const,\n\t\t\t\t\tstatus: \"active\" as const,\n\t\t\t\t\ttimestamp: 1,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\ttoolCallId: \"2\",\n\t\t\t\t\tagent: \"w2\",\n\t\t\t\t\tagentSource: \"user\" as const,\n\t\t\t\t\ttask: \"t2\",\n\t\t\t\t\tmode: \"single\" as const,\n\t\t\t\t\tstatus: \"completed\" as const,\n\t\t\t\t\ttimestamp: 2,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\ttoolCallId: \"3\",\n\t\t\t\t\tagent: \"w3\",\n\t\t\t\t\tagentSource: \"user\" as const,\n\t\t\t\t\ttask: \"t3\",\n\t\t\t\t\tmode: \"single\" as const,\n\t\t\t\t\tstatus: \"error\" as const,\n\t\t\t\t\ttimestamp: 3,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\ttoolCallId: \"4\",\n\t\t\t\t\tagent: \"w4\",\n\t\t\t\t\tagentSource: \"user\" as const,\n\t\t\t\t\ttask: \"t4\",\n\t\t\t\t\tmode: \"single\" as const,\n\t\t\t\t\tstatus: \"blocked\" as const,\n\t\t\t\t\ttimestamp: 4,\n\t\t\t\t},\n\t\t\t];\n\t\t\tconst summary = buildDelegatedWorkSummary(tasks);\n\t\t\texpect(summary.total).toBe(4);\n\t\t\texpect(summary.active).toHaveLength(1);\n\t\t\texpect(summary.completed).toHaveLength(1);\n\t\t\texpect(summary.failed).toHaveLength(2); // error + blocked\n\t\t});\n\n\t\tit(\"includes honesty note about session state\", () => {\n\t\t\tconst summary = buildDelegatedWorkSummary([]);\n\t\t\texpect(summary.note).toContain(\"ephemeral\");\n\t\t\texpect(summary.note).toContain(\"not persisted\");\n\t\t});\n\t});\n\n\t// =========================================================================\n\t// getRecentDelegatedTasks\n\t// =========================================================================\n\n\tdescribe(\"getRecentDelegatedTasks\", () => {\n\t\tit(\"returns tasks sorted by timestamp descending\", () => {\n\t\t\tconst tasks = [\n\t\t\t\t{\n\t\t\t\t\ttoolCallId: \"1\",\n\t\t\t\t\tagent: \"a\",\n\t\t\t\t\tagentSource: \"user\" as const,\n\t\t\t\t\ttask: \"t\",\n\t\t\t\t\tmode: \"single\" as const,\n\t\t\t\t\tstatus: \"active\" as const,\n\t\t\t\t\ttimestamp: 100,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\ttoolCallId: \"2\",\n\t\t\t\t\tagent: \"a\",\n\t\t\t\t\tagentSource: \"user\" as const,\n\t\t\t\t\ttask: \"t\",\n\t\t\t\t\tmode: \"single\" as const,\n\t\t\t\t\tstatus: \"active\" as const,\n\t\t\t\t\ttimestamp: 300,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\ttoolCallId: \"3\",\n\t\t\t\t\tagent: \"a\",\n\t\t\t\t\tagentSource: \"user\" as const,\n\t\t\t\t\ttask: \"t\",\n\t\t\t\t\tmode: \"single\" as const,\n\t\t\t\t\tstatus: \"active\" as const,\n\t\t\t\t\ttimestamp: 200,\n\t\t\t\t},\n\t\t\t];\n\t\t\tconst recent = getRecentDelegatedTasks(tasks);\n\t\t\texpect(recent[0]?.toolCallId).toBe(\"2\");\n\t\t\texpect(recent[1]?.toolCallId).toBe(\"3\");\n\t\t\texpect(recent[2]?.toolCallId).toBe(\"1\");\n\t\t});\n\n\t\tit(\"filters by status when provided\", () => {\n\t\t\tconst tasks = [\n\t\t\t\t{\n\t\t\t\t\ttoolCallId: \"1\",\n\t\t\t\t\tagent: \"a\",\n\t\t\t\t\tagentSource: \"user\" as const,\n\t\t\t\t\ttask: \"t\",\n\t\t\t\t\tmode: \"single\" as const,\n\t\t\t\t\tstatus: \"active\" as const,\n\t\t\t\t\ttimestamp: 1,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\ttoolCallId: \"2\",\n\t\t\t\t\tagent: \"a\",\n\t\t\t\t\tagentSource: \"user\" as const,\n\t\t\t\t\ttask: \"t\",\n\t\t\t\t\tmode: \"single\" as const,\n\t\t\t\t\tstatus: \"completed\" as const,\n\t\t\t\t\ttimestamp: 2,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\ttoolCallId: \"3\",\n\t\t\t\t\tagent: \"a\",\n\t\t\t\t\tagentSource: \"user\" as const,\n\t\t\t\t\ttask: \"t\",\n\t\t\t\t\tmode: \"single\" as const,\n\t\t\t\t\tstatus: \"active\" as const,\n\t\t\t\t\ttimestamp: 3,\n\t\t\t\t},\n\t\t\t];\n\t\t\tconst active = getRecentDelegatedTasks(tasks, { status: \"active\" });\n\t\t\texpect(active).toHaveLength(2);\n\t\t\texpect(active.every((t) => t.status === \"active\")).toBe(true);\n\t\t});\n\n\t\tit(\"respects limit parameter\", () => {\n\t\t\tconst tasks = [\n\t\t\t\t{\n\t\t\t\t\ttoolCallId: \"1\",\n\t\t\t\t\tagent: \"a\",\n\t\t\t\t\tagentSource: \"user\" as const,\n\t\t\t\t\ttask: \"t\",\n\t\t\t\t\tmode: \"single\" as const,\n\t\t\t\t\tstatus: \"active\" as const,\n\t\t\t\t\ttimestamp: 100,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\ttoolCallId: \"2\",\n\t\t\t\t\tagent: \"a\",\n\t\t\t\t\tagentSource: \"user\" as const,\n\t\t\t\t\ttask: \"t\",\n\t\t\t\t\tmode: \"single\" as const,\n\t\t\t\t\tstatus: \"active\" as const,\n\t\t\t\t\ttimestamp: 200,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\ttoolCallId: \"3\",\n\t\t\t\t\tagent: \"a\",\n\t\t\t\t\tagentSource: \"user\" as const,\n\t\t\t\t\ttask: \"t\",\n\t\t\t\t\tmode: \"single\" as const,\n\t\t\t\t\tstatus: \"active\" as const,\n\t\t\t\t\ttimestamp: 300,\n\t\t\t\t},\n\t\t\t];\n\t\t\tconst recent = getRecentDelegatedTasks(tasks, { limit: 2 });\n\t\t\texpect(recent).toHaveLength(2);\n\t\t});\n\t});\n\n\t// =========================================================================\n\t// mergeDelegatedTask\n\t// =========================================================================\n\n\tdescribe(\"mergeDelegatedTask\", () => {\n\t\tit(\"adds new task to empty list\", () => {\n\t\t\tconst task = {\n\t\t\t\ttoolCallId: \"1\",\n\t\t\t\tagent: \"w\",\n\t\t\t\tagentSource: \"user\" as const,\n\t\t\t\ttask: \"t\",\n\t\t\t\tmode: \"single\" as const,\n\t\t\t\tstatus: \"active\" as const,\n\t\t\t\ttimestamp: 1,\n\t\t\t};\n\t\t\tconst merged = mergeDelegatedTask([], task);\n\t\t\texpect(merged).toHaveLength(1);\n\t\t\texpect(merged[0].toolCallId).toBe(\"1\");\n\t\t});\n\n\t\tit(\"replaces existing task with same logical identity\", () => {\n\t\t\tconst existing = {\n\t\t\t\ttoolCallId: \"1\",\n\t\t\t\tagent: \"w\",\n\t\t\t\tagentSource: \"user\" as const,\n\t\t\t\ttask: \"t\",\n\t\t\t\tmode: \"single\" as const,\n\t\t\t\tstatus: \"active\" as const,\n\t\t\t\ttimestamp: 1,\n\t\t\t};\n\t\t\tconst updated = { ...existing, status: \"completed\" as const };\n\t\t\tconst merged = mergeDelegatedTask([existing], updated);\n\t\t\texpect(merged).toHaveLength(1);\n\t\t\texpect(merged[0].status).toBe(\"completed\");\n\t\t});\n\n\t\tit(\"keeps parallel siblings with the same parent toolCallId separate\", () => {\n\t\t\tconst first = {\n\t\t\t\ttoolCallId: \"parallel_1\",\n\t\t\t\tchildIndex: 1,\n\t\t\t\tagent: \"worker\",\n\t\t\t\tagentSource: \"user\" as const,\n\t\t\t\ttask: \"task 1\",\n\t\t\t\tmode: \"parallel\" as const,\n\t\t\t\tstatus: \"active\" as const,\n\t\t\t\ttimestamp: 1,\n\t\t\t};\n\t\t\tconst second = {\n\t\t\t\ttoolCallId: \"parallel_1\",\n\t\t\t\tchildIndex: 2,\n\t\t\t\tagent: \"reviewer\",\n\t\t\t\tagentSource: \"user\" as const,\n\t\t\t\ttask: \"task 2\",\n\t\t\t\tmode: \"parallel\" as const,\n\t\t\t\tstatus: \"active\" as const,\n\t\t\t\ttimestamp: 2,\n\t\t\t};\n\t\t\tconst merged = mergeDelegatedTask(mergeDelegatedTask([], first), second);\n\t\t\texpect(merged).toHaveLength(2);\n\t\t\texpect(merged.map((task) => task.childIndex)).toEqual([1, 2]);\n\t\t});\n\t});\n\n\t// =========================================================================\n\t// syncDelegatedWork\n\t// =========================================================================\n\n\tdescribe(\"syncDelegatedWork\", () => {\n\t\tit(\"activates tasks from tool call events\", () => {\n\t\t\tconst events: ToolCallEvent[] = [\n\t\t\t\t{\n\t\t\t\t\ttype: \"tool_call\",\n\t\t\t\t\ttoolCallId: \"call_1\",\n\t\t\t\t\ttoolName: \"subagent\",\n\t\t\t\t\tinput: { agent: \"worker\", task: \"Fix bug\" },\n\t\t\t\t},\n\t\t\t];\n\t\t\tconst synced = syncDelegatedWork([], events, []);\n\t\t\texpect(synced).toHaveLength(1);\n\t\t\texpect(synced[0].status).toBe(\"active\");\n\t\t});\n\n\t\tit(\"expands parallel subagent calls into one runtime task per child\", () => {\n\t\t\tconst events: ToolCallEvent[] = [\n\t\t\t\t{\n\t\t\t\t\ttype: \"tool_call\",\n\t\t\t\t\ttoolCallId: \"parallel_call\",\n\t\t\t\t\ttoolName: \"subagent\",\n\t\t\t\t\tinput: {\n\t\t\t\t\t\ttasks: [\n\t\t\t\t\t\t\t{ agent: \"worker\", task: \"Implement panel\" },\n\t\t\t\t\t\t\t{ agent: \"reviewer\", task: \"Review panel\" },\n\t\t\t\t\t\t],\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t];\n\t\t\tconst synced = syncDelegatedWork([], events, []);\n\t\t\texpect(synced).toHaveLength(2);\n\t\t\texpect(synced.map((task) => task.childIndex)).toEqual([1, 2]);\n\t\t\texpect(synced.every((task) => task.status === \"active\")).toBe(true);\n\t\t});\n\n\t\tit(\"updates tasks with result data\", () => {\n\t\t\tconst task = {\n\t\t\t\ttoolCallId: \"call_1\",\n\t\t\t\tagent: \"w\",\n\t\t\t\tagentSource: \"user\" as const,\n\t\t\t\ttask: \"t\",\n\t\t\t\tmode: \"single\" as const,\n\t\t\t\tstatus: \"active\" as const,\n\t\t\t\ttimestamp: 1,\n\t\t\t};\n\t\t\tconst result: ToolResultMessage = {\n\t\t\t\trole: \"toolResult\",\n\t\t\t\ttoolCallId: \"call_1\",\n\t\t\t\ttoolName: \"subagent\",\n\t\t\t\tcontent: [],\n\t\t\t\tisError: false,\n\t\t\t\ttimestamp: 2,\n\t\t\t\tdetails: {\n\t\t\t\t\tmode: \"single\",\n\t\t\t\t\tagentScope: \"user\",\n\t\t\t\t\tprojectAgentsDir: null,\n\t\t\t\t\tdiscoveryErrors: [],\n\t\t\t\t\tresults: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tagent: \"w\",\n\t\t\t\t\t\t\tagentSource: \"user\",\n\t\t\t\t\t\t\ttask: \"t\",\n\t\t\t\t\t\t\texitCode: 0,\n\t\t\t\t\t\t\tmessages: [],\n\t\t\t\t\t\t\tstderr: \"\",\n\t\t\t\t\t\t\tusage: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, cost: 0, contextTokens: 0, turns: 0 },\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t};\n\t\t\tconst synced = syncDelegatedWork([task], [], [result]);\n\t\t\texpect(synced).toHaveLength(1);\n\t\t\texpect(synced[0].status).toBe(\"completed\");\n\t\t});\n\n\t\tit(\"ignores non-subagent tool calls and results\", () => {\n\t\t\tconst events: ToolCallEvent[] = [\n\t\t\t\t{\n\t\t\t\t\ttype: \"tool_call\",\n\t\t\t\t\ttoolCallId: \"call_bash\",\n\t\t\t\t\ttoolName: \"bash\",\n\t\t\t\t\tinput: { command: \"echo\" },\n\t\t\t\t},\n\t\t\t];\n\t\t\tconst result: ToolResultMessage = {\n\t\t\t\trole: \"toolResult\",\n\t\t\t\ttoolCallId: \"call_bash\",\n\t\t\t\ttoolName: \"bash\",\n\t\t\t\tcontent: [{ type: \"text\", text: \"echo\" }],\n\t\t\t\tisError: false,\n\t\t\t\ttimestamp: 1,\n\t\t\t};\n\t\t\tconst synced = syncDelegatedWork([], events, [result]);\n\t\t\texpect(synced).toHaveLength(0);\n\t\t});\n\t});\n});\n"]}