{"version":3,"file":"production-todo-provider-harness.test.d.ts","sourceRoot":"","sources":["../../src/core/production-todo-provider-harness.test.ts"],"names":[],"mappings":"","sourcesContent":["import { mkdirSync, mkdtempSync, rmSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { Model } from \"@apholdings/jensen-ai\";\nimport type { ChatCompletionChunk } from \"openai/resources/chat/completions.js\";\nimport { afterEach, describe, expect, it, vi } from \"vitest\";\nimport type { AgentSessionEvent } from \"./agent-session.js\";\nimport { AuthStorage } from \"./auth-storage.js\";\nimport type { ExtensionFactory } from \"./extensions/types.js\";\nimport { ModelRegistry } from \"./model-registry.js\";\nimport { DefaultResourceLoader } from \"./resource-loader.js\";\nimport { createAgentSession } from \"./sdk.js\";\nimport { SessionManager } from \"./session-manager.js\";\nimport { SettingsManager } from \"./settings-manager.js\";\n\ntype FixtureToolCall = {\n\tid: string;\n\tname: string;\n\targs: Record<string, unknown>;\n};\n\ntype FixtureReply = { type: \"tool\"; calls: FixtureToolCall[] } | { type: \"text\"; text: string };\n\ntype MockClientConfig = {\n\tapiKey: string;\n\tbaseURL: string;\n\tdangerouslyAllowBrowser: boolean;\n\tdefaultHeaders?: Record<string, string>;\n};\n\nconst mockState = vi.hoisted(() => ({\n\tpayloads: [] as Array<Record<string, unknown>>,\n\tserializedPayloads: [] as string[],\n\treplies: [] as FixtureReply[],\n\ttransportCount: 0,\n\tclientConfigs: [] as MockClientConfig[],\n}));\n\nvi.mock(\"openai\", () => {\n\tclass MockOpenAI {\n\t\tchat = {\n\t\t\tcompletions: {\n\t\t\t\tcreate: async (params: Record<string, unknown>) => {\n\t\t\t\t\tconst reply = mockState.replies[mockState.transportCount];\n\t\t\t\t\tif (!reply) {\n\t\t\t\t\t\tthrow new Error(`Missing fixture reply for transport ${mockState.transportCount + 1}`);\n\t\t\t\t\t}\n\t\t\t\t\tmockState.transportCount++;\n\t\t\t\t\tmockState.payloads.push(structuredClone(params));\n\t\t\t\t\tmockState.serializedPayloads.push(JSON.stringify(params));\n\n\t\t\t\t\tconst chunk =\n\t\t\t\t\t\treply.type === \"text\"\n\t\t\t\t\t\t\t? ({\n\t\t\t\t\t\t\t\t\tid: `fixture-response-${mockState.transportCount}`,\n\t\t\t\t\t\t\t\t\tchoices: [\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\tindex: 0,\n\t\t\t\t\t\t\t\t\t\t\tdelta: { role: \"assistant\", content: reply.text },\n\t\t\t\t\t\t\t\t\t\t\tfinish_reason: \"stop\",\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t} as unknown as ChatCompletionChunk)\n\t\t\t\t\t\t\t: ({\n\t\t\t\t\t\t\t\t\tid: `fixture-response-${mockState.transportCount}`,\n\t\t\t\t\t\t\t\t\tchoices: [\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\tindex: 0,\n\t\t\t\t\t\t\t\t\t\t\tdelta: {\n\t\t\t\t\t\t\t\t\t\t\t\trole: \"assistant\",\n\t\t\t\t\t\t\t\t\t\t\t\ttool_calls: reply.calls.map((call, index) => ({\n\t\t\t\t\t\t\t\t\t\t\t\t\tindex,\n\t\t\t\t\t\t\t\t\t\t\t\t\tid: call.id,\n\t\t\t\t\t\t\t\t\t\t\t\t\ttype: \"function\",\n\t\t\t\t\t\t\t\t\t\t\t\t\tfunction: {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tname: call.name,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\targuments: JSON.stringify(call.args),\n\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t})),\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\tfinish_reason: \"tool_calls\",\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t} as unknown as ChatCompletionChunk);\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\tasync *[Symbol.asyncIterator](): AsyncIterator<ChatCompletionChunk> {\n\t\t\t\t\t\t\tyield chunk;\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};\n\n\t\tconstructor(config: MockClientConfig) {\n\t\t\tmockState.clientConfigs.push(config);\n\t\t}\n\t}\n\n\treturn { default: MockOpenAI };\n});\n\ntype Route = {\n\tmodel: Model<\"openai-completions\">;\n\tlabel: string;\n};\n\ntype WireTool = {\n\ttype: string;\n\tfunction: { name: string };\n};\n\ntype WireMessage = {\n\trole: string;\n\ttool_calls?: Array<{ id: string; function: { name: string; arguments: string } }>;\n\ttool_call_id?: string;\n};\n\ntype Harness = {\n\tsession: Awaited<ReturnType<typeof createAgentSession>>[\"session\"];\n\tevents: AgentSessionEvent[];\n\trootDir: string;\n};\n\nconst deepSeekRoute: Route = {\n\tlabel: \"DeepSeek\",\n\tmodel: {\n\t\tid: \"deepseek/deepseek-v4-flash-0731\",\n\t\tname: \"DeepSeek V4 Flash 0731\",\n\t\tapi: \"openai-completions\",\n\t\tprovider: \"openrouter\",\n\t\tbaseUrl: \"https://openrouter.ai/api/v1\",\n\t\treasoning: false,\n\t\tinput: [\"text\"],\n\t\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },\n\t\tcontextWindow: 200_000,\n\t\tmaxTokens: 8_192,\n\t},\n};\n\nconst lunaRoute: Route = {\n\tlabel: \"Luna\",\n\tmodel: {\n\t\tid: \"openai/gpt-5.6-luna\",\n\t\tname: \"OpenAI GPT-5.6 Luna\",\n\t\tapi: \"openai-completions\",\n\t\tprovider: \"openrouter\",\n\t\tbaseUrl: \"https://openrouter.ai/api/v1\",\n\t\treasoning: false,\n\t\tinput: [\"text\"],\n\t\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },\n\t\tcontextWindow: 200_000,\n\t\tmaxTokens: 8_192,\n\t},\n};\n\nconst todoList = [\n\t{ id: \"task-a\", content: \"Inspect repair\", activeForm: \"Inspecting repair\", status: \"in_progress\" },\n\t{ id: \"task-b\", content: \"Prove harness\", activeForm: \"Proving harness\", status: \"pending\" },\n] as const;\n\nfunction resetMock(replies: FixtureReply[]): void {\n\tmockState.payloads = [];\n\tmockState.serializedPayloads = [];\n\tmockState.replies = replies;\n\tmockState.transportCount = 0;\n\tmockState.clientConfigs = [];\n}\n\nfunction createRouteModel(route: Route): Model<\"openai-completions\"> {\n\treturn { ...route.model };\n}\n\nasync function createHarness(route: Route, extensionFactory?: ExtensionFactory): Promise<Harness> {\n\tconst rootDir = mkdtempSync(join(\"/tmp\", \"jensen-production-harness-\"));\n\tconst cwd = join(rootDir, \"repo\");\n\tconst agentDir = join(rootDir, \"agent\");\n\tmkdirSync(cwd, { recursive: true });\n\tmkdirSync(agentDir, { recursive: true });\n\n\tconst authStorage = AuthStorage.create(join(agentDir, \"auth.json\"));\n\tconst modelRegistry = new ModelRegistry(authStorage);\n\tmodelRegistry.registerProvider(\"openrouter\", {\n\t\tapi: \"openai-completions\",\n\t\tapiKey: \"harness-openrouter-key\",\n\t\tbaseUrl: route.model.baseUrl,\n\t\tmodels: [\n\t\t\t{\n\t\t\t\tid: route.model.id,\n\t\t\t\tname: route.model.name,\n\t\t\t\tapi: route.model.api,\n\t\t\t\treasoning: route.model.reasoning,\n\t\t\t\tinput: route.model.input,\n\t\t\t\tcost: route.model.cost,\n\t\t\t\tcontextWindow: route.model.contextWindow,\n\t\t\t\tmaxTokens: route.model.maxTokens,\n\t\t\t},\n\t\t],\n\t});\n\n\tconst settingsManager = SettingsManager.inMemory({ retry: { enabled: false } });\n\tconst resourceLoader = new DefaultResourceLoader({\n\t\tcwd,\n\t\tagentDir,\n\t\tsettingsManager,\n\t\textensionFactories: extensionFactory ? [extensionFactory] : [],\n\t\tnoSkills: true,\n\t\tnoPromptTemplates: true,\n\t\tnoThemes: true,\n\t});\n\tawait resourceLoader.reload();\n\n\tconst result = await createAgentSession({\n\t\tcwd,\n\t\tagentDir,\n\t\tauthStorage,\n\t\tmodelRegistry,\n\t\tmodel: createRouteModel(route),\n\t\tthinkingLevel: \"off\",\n\t\tresourceLoader,\n\t\tsessionManager: SessionManager.inMemory(cwd),\n\t\tsettingsManager,\n\t});\n\tconst events: AgentSessionEvent[] = [];\n\tresult.session.subscribe((event) => events.push(event));\n\n\treturn { session: result.session, events, rootDir };\n}\n\nasync function runPrompt(harness: Harness, text: string): Promise<void> {\n\tlet timer: ReturnType<typeof setTimeout> | undefined;\n\ttry {\n\t\tawait Promise.race([\n\t\t\tharness.session.prompt(text),\n\t\t\tnew Promise<never>((_, reject) => {\n\t\t\t\ttimer = setTimeout(() => reject(new Error(`Harness timeout: ${text}`)), 5_000);\n\t\t\t}),\n\t\t]);\n\t} finally {\n\t\tif (timer) clearTimeout(timer);\n\t}\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> {\n\tif (!value || typeof value !== \"object\" || Array.isArray(value)) {\n\t\tthrow new Error(\"Expected object\");\n\t}\n\treturn value as Record<string, unknown>;\n}\n\nfunction wireMessages(payload: Record<string, unknown>): WireMessage[] {\n\tconst messages = payload.messages;\n\tif (!Array.isArray(messages)) throw new Error(\"Expected messages array\");\n\treturn messages.map((message) => {\n\t\tconst record = asRecord(message);\n\t\treturn {\n\t\t\trole: String(record.role),\n\t\t\ttool_calls: Array.isArray(record.tool_calls)\n\t\t\t\t? record.tool_calls.map((call) => {\n\t\t\t\t\t\tconst callRecord = asRecord(call);\n\t\t\t\t\t\tconst fn = asRecord(callRecord.function);\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tid: String(callRecord.id),\n\t\t\t\t\t\t\tfunction: { name: String(fn.name), arguments: String(fn.arguments) },\n\t\t\t\t\t\t};\n\t\t\t\t\t})\n\t\t\t\t: undefined,\n\t\t\ttool_call_id: record.tool_call_id === undefined ? undefined : String(record.tool_call_id),\n\t\t};\n\t});\n}\n\nfunction wireTools(payload: Record<string, unknown>): WireTool[] {\n\tif (!Array.isArray(payload.tools)) throw new Error(\"Expected tools array\");\n\treturn payload.tools.map((tool) => {\n\t\tconst record = asRecord(tool);\n\t\tconst fn = asRecord(record.function);\n\t\treturn { type: String(record.type), function: { name: String(fn.name) } };\n\t});\n}\n\nfunction toolResultDetails(event: AgentSessionEvent): Record<string, unknown> | undefined {\n\tconst details =\n\t\tevent.type === \"tool_execution_end\"\n\t\t\t? event.result.details\n\t\t\t: event.type === \"message_end\" && event.message.role === \"toolResult\"\n\t\t\t\t? event.message.details\n\t\t\t\t: undefined;\n\treturn details && typeof details === \"object\" ? (details as Record<string, unknown>) : undefined;\n}\n\nfunction assistantToolCalls(events: AgentSessionEvent[]): FixtureToolCall[] {\n\treturn events.flatMap((event) => {\n\t\tif (event.type !== \"message_end\" || event.message.role !== \"assistant\") return [];\n\t\treturn event.message.content.flatMap((content) =>\n\t\t\tcontent.type === \"toolCall\"\n\t\t\t\t? [{ id: content.id, name: content.name, args: content.arguments as Record<string, unknown> }]\n\t\t\t\t: [],\n\t\t);\n\t});\n}\n\nfunction assistantFinalMessages(events: AgentSessionEvent[]) {\n\treturn events.filter(\n\t\t(event) =>\n\t\t\tevent.type === \"message_end\" &&\n\t\t\tevent.message.role === \"assistant\" &&\n\t\t\tevent.message.stopReason === \"stop\" &&\n\t\t\tevent.message.content.some((content) => content.type === \"text\"),\n\t);\n}\n\nfunction assertSerializedPayloads(): void {\n\texpect(mockState.serializedPayloads).toHaveLength(mockState.payloads.length);\n\tfor (let index = 0; index < mockState.payloads.length; index++) {\n\t\texpect(JSON.parse(mockState.serializedPayloads[index])).toEqual(mockState.payloads[index]);\n\t}\n}\n\nfunction assertCanonicalTranscript(payload: Record<string, unknown>): void {\n\tconst messages = wireMessages(payload);\n\tconst calls = messages.flatMap((message) => message.tool_calls?.map((call) => call.id) ?? []);\n\tconst results = messages.flatMap((message) => (message.tool_call_id ? [message.tool_call_id] : []));\n\texpect(new Set(calls).size).toBe(calls.length);\n\texpect(new Set(results).size).toBe(results.length);\n\texpect(results).toEqual(calls.slice(0, results.length));\n\texpect(messages.filter((message) => message.role !== \"system\").map((message) => message.role)).toEqual([\n\t\t\"user\",\n\t\t\"user\",\n\t\t...Array.from({ length: results.length }, () => [\"assistant\", \"tool\"]).flat(),\n\t]);\n}\n\nfunction closeHarness(harness: Harness): void {\n\tharness.session.dispose();\n\trmSync(harness.rootDir, { recursive: true, force: true });\n}\n\nafterEach(() => {\n\tresetMock([]);\n});\n\ndescribe(\"production todo/provider harness\", () => {\n\tit.each([deepSeekRoute, lunaRoute])(\"runs bounded seven-request workflow for $label\", async (route) => {\n\t\tresetMock([\n\t\t\t{\n\t\t\t\ttype: \"tool\",\n\t\t\t\tcalls: [{ id: \"call-1\", name: \"todo_write\", args: { todos: [...todoList] } }],\n\t\t\t},\n\t\t\t{ type: \"tool\", calls: [{ id: \"call-2\", name: \"bash\", args: { command: \"printf shell-step-2\" } }] },\n\t\t\t{ type: \"tool\", calls: [{ id: \"call-3\", name: \"todo_read\", args: {} }] },\n\t\t\t{\n\t\t\t\ttype: \"tool\",\n\t\t\t\tcalls: [\n\t\t\t\t\t{\n\t\t\t\t\t\tid: \"call-4\",\n\t\t\t\t\t\tname: \"todo_update\",\n\t\t\t\t\t\targs: { updates: [{ id: \"task-a\", status: \"completed\" }], expectedRevision: 1 },\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t},\n\t\t\t{ type: \"tool\", calls: [{ id: \"call-5\", name: \"bash\", args: { command: \"printf shell-step-5\" } }] },\n\t\t\t{ type: \"tool\", calls: [{ id: \"call-6\", name: \"todo_read\", args: {} }] },\n\t\t\t{ type: \"text\", text: \"workflow complete\" },\n\t\t]);\n\t\tconst harness = await createHarness(route);\n\t\ttry {\n\t\t\texpect(harness.session.model).toMatchObject({\n\t\t\t\tid: route.model.id,\n\t\t\t\tprovider: \"openrouter\",\n\t\t\t\tapi: \"openai-completions\",\n\t\t\t});\n\t\t\tawait runPrompt(harness, `run ${route.label} workflow`);\n\n\t\t\texpect(mockState.transportCount).toBe(7);\n\t\t\texpect(mockState.payloads).toHaveLength(7);\n\t\t\texpect(mockState.clientConfigs).toHaveLength(7);\n\t\t\texpect(mockState.clientConfigs[0]).toMatchObject({ baseURL: route.model.baseUrl });\n\t\t\texpect(mockState.clientConfigs[0].apiKey).toBeTruthy();\n\t\t\tassertSerializedPayloads();\n\n\t\t\tconst firstTools = wireTools(mockState.payloads[0]);\n\t\t\tconst firstToolNames = firstTools.map((tool) => tool.function.name);\n\t\t\texpect(firstToolNames).toEqual([\n\t\t\t\t\"bash\",\n\t\t\t\t\"deep_research\",\n\t\t\t\t\"edit\",\n\t\t\t\t\"memory_write\",\n\t\t\t\t\"read\",\n\t\t\t\t\"retrieve_evidence\",\n\t\t\t\t\"todo_read\",\n\t\t\t\t\"todo_update\",\n\t\t\t\t\"todo_write\",\n\t\t\t\t\"web_fetch\",\n\t\t\t\t\"web_research_status\",\n\t\t\t\t\"web_search\",\n\t\t\t\t\"write\",\n\t\t\t]);\n\t\t\texpect(firstTools.filter((tool) => tool.type !== \"function\")).toEqual([]);\n\t\t\tconst toolsAfterWrite = firstTools.filter((tool) => tool.function.name !== \"todo_write\");\n\t\t\tfor (const payload of mockState.payloads.slice(1)) {\n\t\t\t\texpect(wireTools(payload)).toEqual(toolsAfterWrite);\n\t\t\t\texpect(wireTools(payload).some((tool) => tool.function.name === \"todo_write\")).toBe(false);\n\t\t\t\texpect(wireTools(payload).some((tool) => tool.function.name === \"todo_read\")).toBe(true);\n\t\t\t\texpect(wireTools(payload).some((tool) => tool.function.name === \"todo_update\")).toBe(true);\n\t\t\t}\n\n\t\t\tconst expectedCallIds = [\"call-1\", \"call-2\", \"call-3\", \"call-4\", \"call-5\", \"call-6\"];\n\t\t\tfor (const payload of mockState.payloads) assertCanonicalTranscript(payload);\n\t\t\tconst finalWireMessages = wireMessages(mockState.payloads[6]);\n\t\t\tconst finalCallIds = finalWireMessages.flatMap((message) => message.tool_calls?.map((call) => call.id) ?? []);\n\t\t\tconst finalResultIds = finalWireMessages.flatMap((message) =>\n\t\t\t\tmessage.tool_call_id ? [message.tool_call_id] : [],\n\t\t\t);\n\t\t\texpect(finalCallIds).toEqual(expectedCallIds);\n\t\t\texpect(finalResultIds).toEqual(expectedCallIds);\n\t\t\texpect(\n\t\t\t\tfinalWireMessages.filter((message) => message.role !== \"system\").map((message) => message.role),\n\t\t\t).toEqual([\n\t\t\t\t\"user\",\n\t\t\t\t\"user\",\n\t\t\t\t\"assistant\",\n\t\t\t\t\"tool\",\n\t\t\t\t\"assistant\",\n\t\t\t\t\"tool\",\n\t\t\t\t\"assistant\",\n\t\t\t\t\"tool\",\n\t\t\t\t\"assistant\",\n\t\t\t\t\"tool\",\n\t\t\t\t\"assistant\",\n\t\t\t\t\"tool\",\n\t\t\t\t\"assistant\",\n\t\t\t\t\"tool\",\n\t\t\t]);\n\n\t\t\tconst emittedCalls = assistantToolCalls(harness.events);\n\t\t\texpect(emittedCalls.filter((call) => call.name === \"todo_write\")).toHaveLength(1);\n\t\t\tconst toolEnds = harness.events.filter((event) => event.type === \"tool_execution_end\");\n\t\t\tconst todoWriteEnds = toolEnds.filter((event) => event.toolName === \"todo_write\");\n\t\t\texpect(\n\t\t\t\ttodoWriteEnds.filter((event) => !event.isError && toolResultDetails(event)?.changed === true),\n\t\t\t).toHaveLength(1);\n\t\t\texpect(harness.events.filter((event) => event.type === \"todo_update\")).toHaveLength(2);\n\t\t\texpect(\n\t\t\t\ttoolEnds.filter(\n\t\t\t\t\t(event) =>\n\t\t\t\t\t\tevent.toolName === \"todo_update\" && !event.isError && toolResultDetails(event)?.changed === true,\n\t\t\t\t),\n\t\t\t).toHaveLength(1);\n\n\t\t\tconst readResults = harness.events.filter(\n\t\t\t\t(event) =>\n\t\t\t\t\tevent.type === \"message_end\" &&\n\t\t\t\t\tevent.message.role === \"toolResult\" &&\n\t\t\t\t\tevent.message.toolName === \"todo_read\",\n\t\t\t);\n\t\t\texpect(readResults).toHaveLength(2);\n\t\t\texpect(toolResultDetails(readResults[0])?.revision as number).toBe(1);\n\t\t\texpect(toolResultDetails(readResults[1])?.revision as number).toBe(2);\n\t\t\tconst updateCall = emittedCalls.find((call) => call.name === \"todo_update\");\n\t\t\texpect(updateCall?.args).toEqual({\n\t\t\t\tupdates: [{ id: \"task-a\", status: \"completed\" }],\n\t\t\t\texpectedRevision: 1,\n\t\t\t});\n\t\t\texpect(harness.session.todoRevision).toBe(2);\n\t\t\texpect(assistantFinalMessages(harness.events)).toHaveLength(1);\n\t\t\texpect(mockState.transportCount).toBe(mockState.replies.length);\n\t\t} finally {\n\t\t\tcloseHarness(harness);\n\t\t}\n\t});\n\n\tit(\"rejects invalid post-hook payload before transport\", async () => {\n\t\tresetMock([{ type: \"text\", text: \"must not transport\" }]);\n\t\tlet hookInvocations = 0;\n\t\tconst extensionFactory: ExtensionFactory = (pi) => {\n\t\t\tpi.on(\"before_provider_request\", (event) => {\n\t\t\t\thookInvocations++;\n\t\t\t\tconst payload = asRecord(event.payload);\n\t\t\t\tconst messages = Array.isArray(payload.messages) ? payload.messages : [];\n\t\t\t\treturn {\n\t\t\t\t\t...payload,\n\t\t\t\t\tmessages: [...messages, { role: \"tool\", tool_call_id: \"orphan-hook-call\", content: \"orphan\" }],\n\t\t\t\t};\n\t\t\t});\n\t\t};\n\t\tconst harness = await createHarness(deepSeekRoute, extensionFactory);\n\t\ttry {\n\t\t\tawait runPrompt(harness, \"invalid hook payload\");\n\t\t\texpect(hookInvocations).toBe(1);\n\t\t\texpect(mockState.transportCount).toBe(0);\n\t\t\texpect(harness.events.filter((event) => event.type === \"auto_retry_start\")).toHaveLength(0);\n\t\t\texpect(harness.session.agent.state.error).toContain(\"INVALID_TOOL_TRANSCRIPT\");\n\t\t\texpect(\n\t\t\t\tharness.events.filter((event) => event.type === \"message_end\" && event.message.role === \"assistant\"),\n\t\t\t).toHaveLength(1);\n\t\t} finally {\n\t\t\tcloseHarness(harness);\n\t\t}\n\t});\n\n\tit(\"transports valid post-hook payload exactly once\", async () => {\n\t\tresetMock([{ type: \"text\", text: \"valid hook complete\" }]);\n\t\tlet hookInvocations = 0;\n\t\tlet hookPayload: Record<string, unknown> | undefined;\n\t\tlet hookSerializedPayload: string | undefined;\n\t\tconst extensionFactory: ExtensionFactory = (pi) => {\n\t\t\tpi.on(\"before_provider_request\", (event) => {\n\t\t\t\thookInvocations++;\n\t\t\t\tconst payload = asRecord(event.payload);\n\t\t\t\thookPayload = { ...payload, temperature: 0 };\n\t\t\t\thookSerializedPayload = JSON.stringify(hookPayload);\n\t\t\t\treturn hookPayload;\n\t\t\t});\n\t\t};\n\t\tconst harness = await createHarness(lunaRoute, extensionFactory);\n\t\ttry {\n\t\t\tawait runPrompt(harness, \"valid hook payload\");\n\t\t\texpect(hookInvocations).toBe(1);\n\t\t\texpect(mockState.transportCount).toBe(1);\n\t\t\texpect(mockState.serializedPayloads[0]).toBe(hookSerializedPayload);\n\t\t\texpect(mockState.payloads[0].temperature).toBe(0);\n\t\t\texpect(assistantFinalMessages(harness.events)).toHaveLength(1);\n\t\t} finally {\n\t\t\tcloseHarness(harness);\n\t\t}\n\t});\n\n\tit(\"degrades repeated todo_write without terminating and keeps next turn usable\", async () => {\n\t\tconst writeArgs = { todos: [...todoList] };\n\t\tresetMock([\n\t\t\t{ type: \"tool\", calls: [{ id: \"write-1\", name: \"todo_write\", args: writeArgs }] },\n\t\t\t{ type: \"tool\", calls: [{ id: \"write-2\", name: \"todo_write\", args: writeArgs }] },\n\t\t\t{ type: \"tool\", calls: [{ id: \"write-3\", name: \"todo_write\", args: writeArgs }] },\n\t\t\t{ type: \"text\", text: \"new turn works\" },\n\t\t\t{ type: \"text\", text: \"new turn works\" },\n\t\t]);\n\t\tconst harness = await createHarness(deepSeekRoute);\n\t\ttry {\n\t\t\tawait runPrompt(harness, \"repeat todo write\");\n\t\t\texpect(mockState.transportCount).toBe(4);\n\t\t\texpect(harness.session.agent.state.error).toBeUndefined();\n\t\t\texpect(\n\t\t\t\tharness.events.filter(\n\t\t\t\t\t(event) =>\n\t\t\t\t\t\tevent.type === \"message_end\" &&\n\t\t\t\t\t\tevent.message.role === \"toolResult\" &&\n\t\t\t\t\t\tevent.message.toolName === \"todo_write\",\n\t\t\t\t),\n\t\t\t).toHaveLength(3);\n\t\t\texpect(\n\t\t\t\tharness.events.filter(\n\t\t\t\t\t(event) =>\n\t\t\t\t\t\tevent.type === \"message_end\" &&\n\t\t\t\t\t\tevent.message.role === \"toolResult\" &&\n\t\t\t\t\t\ttoolResultDetails(event)?.todoWriteAlreadyApplied === true,\n\t\t\t\t),\n\t\t\t).toHaveLength(2);\n\t\t\texpect(harness.session.todoRevision).toBe(1);\n\t\t\tconst terminalTransportCount = mockState.transportCount;\n\n\t\t\tawait runPrompt(harness, \"recover after repeated write\");\n\t\t\texpect(mockState.transportCount).toBe(terminalTransportCount + 1);\n\t\t\texpect(assistantFinalMessages(harness.events)).toHaveLength(2);\n\t\t} finally {\n\t\t\tcloseHarness(harness);\n\t\t}\n\t});\n\n\tit(\"repeated stale todo_update auto-recovers; run is never terminated\", async () => {\n\t\tresetMock([\n\t\t\t{ type: \"tool\", calls: [{ id: \"seed-write\", name: \"todo_write\", args: { todos: [...todoList] } }] },\n\t\t\t{ type: \"text\", text: \"seeded\" },\n\t\t\t{ type: \"tool\", calls: [{ id: \"stale-read\", name: \"todo_read\", args: {} }] },\n\t\t\t{\n\t\t\t\ttype: \"tool\",\n\t\t\t\tcalls: [\n\t\t\t\t\t{\n\t\t\t\t\t\tid: \"stale-update-1\",\n\t\t\t\t\t\tname: \"todo_update\",\n\t\t\t\t\t\targs: { updates: [{ id: \"task-a\", status: \"completed\" }], expectedRevision: 0 },\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: \"tool\",\n\t\t\t\tcalls: [\n\t\t\t\t\t{\n\t\t\t\t\t\tid: \"stale-update-2\",\n\t\t\t\t\t\tname: \"todo_update\",\n\t\t\t\t\t\targs: { updates: [{ id: \"task-b\", status: \"in_progress\" }], expectedRevision: 0 },\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t},\n\t\t\t{ type: \"text\", text: \"two stale updates handled\" },\n\t\t]);\n\t\tconst harness = await createHarness(deepSeekRoute);\n\t\ttry {\n\t\t\tawait runPrompt(harness, \"seed todos\");\n\t\t\texpect(mockState.transportCount).toBe(2);\n\n\t\t\tawait runPrompt(harness, \"repeat stale update\");\n\t\t\t// Both stale updates consumed one read + two updates + a text.\n\t\t\texpect(mockState.transportCount).toBe(6);\n\n\t\t\t// No run termination and no model-required todo_read.\n\t\t\texpect(String(harness.session.agent.state.error ?? \"\")).not.toContain(\"REPEATED_TODO_UPDATE_LOOP\");\n\t\t\tconst readRequired = harness.events.filter(\n\t\t\t\t(event) =>\n\t\t\t\t\tevent.type === \"message_end\" &&\n\t\t\t\t\tevent.message.role === \"toolResult\" &&\n\t\t\t\t\ttoolResultDetails(event)?.errorCode === \"TODO_READ_REQUIRED\",\n\t\t\t);\n\t\t\texpect(readRequired).toHaveLength(0);\n\n\t\t\t// Both stale updates were recovered internally (non-error executions).\n\t\t\tconst updateEnds = harness.events.filter(\n\t\t\t\t(event) => event.type === \"tool_execution_end\" && event.toolName === \"todo_update\" && !event.isError,\n\t\t\t);\n\t\t\texpect(updateEnds.length).toBeGreaterThanOrEqual(2);\n\n\t\t\t// The durable store advanced for each applied update (write->1, two updates->3).\n\t\t\texpect(harness.session.todoRevision).toBe(3);\n\t\t} finally {\n\t\t\tcloseHarness(harness);\n\t\t}\n\t});\n\n\tit(\"atomically reserves todo_write under forced concurrent interleaving\", async () => {\n\t\tconst list2 = [\n\t\t\t...todoList,\n\t\t\t{ id: \"task-c\", content: \"Run checks\", activeForm: \"Running checks\", status: \"pending\" as const },\n\t\t];\n\t\tconst list3 = [\n\t\t\t...list2,\n\t\t\t{ id: \"task-d\", content: \"Report evidence\", activeForm: \"Reporting evidence\", status: \"pending\" as const },\n\t\t];\n\t\tconst list4 = [\n\t\t\t...list3,\n\t\t\t{ id: \"task-e\", content: \"Stop safely\", activeForm: \"Stopping safely\", status: \"pending\" as const },\n\t\t];\n\t\tresetMock([\n\t\t\t{\n\t\t\t\ttype: \"tool\",\n\t\t\t\tcalls: [\n\t\t\t\t\t{ id: \"race-1\", name: \"todo_write\", args: { todos: [...todoList] } },\n\t\t\t\t\t{ id: \"race-2\", name: \"todo_write\", args: { todos: [...todoList] } },\n\t\t\t\t],\n\t\t\t},\n\t\t\t{ type: \"text\", text: \"race complete\" },\n\t\t\t{\n\t\t\t\ttype: \"tool\",\n\t\t\t\tcalls: [\n\t\t\t\t\t{ id: \"failed-validation\", name: \"todo_write\", args: { todos: [] } },\n\t\t\t\t\t{ id: \"after-failed-validation\", name: \"todo_write\", args: { todos: list2 } },\n\t\t\t\t],\n\t\t\t},\n\t\t\t{ type: \"text\", text: \"validation release complete\" },\n\t\t\t{\n\t\t\t\ttype: \"tool\",\n\t\t\t\tcalls: [\n\t\t\t\t\t{ id: \"no-op\", name: \"todo_write\", args: { todos: list2 } },\n\t\t\t\t\t{ id: \"after-no-op\", name: \"todo_write\", args: { todos: list3 } },\n\t\t\t\t],\n\t\t\t},\n\t\t\t{ type: \"text\", text: \"no-op release complete\" },\n\t\t\t{ type: \"tool\", calls: [{ id: \"next-turn-write\", name: \"todo_write\", args: { todos: list4 } }] },\n\t\t\t{ type: \"text\", text: \"next turn write complete\" },\n\t\t]);\n\t\tconst harness = await createHarness(deepSeekRoute);\n\t\ttry {\n\t\t\tconst todoWriteTool = harness.session.agent.state.tools.find((tool) => tool.name === \"todo_write\");\n\t\t\tif (!todoWriteTool) throw new Error(\"todo_write tool missing\");\n\t\t\tlet phase: \"race\" | \"sequential\" = \"race\";\n\t\t\tlet barrierReady = 0;\n\t\t\tlet releaseBarrier: (() => void) | undefined;\n\t\t\tlet barrier = Promise.resolve();\n\t\t\tconst originalExecute = todoWriteTool.execute;\n\t\t\ttodoWriteTool.isConcurrencySafe = () => phase === \"race\";\n\t\t\ttodoWriteTool.execute = async (...args: Parameters<typeof originalExecute>) => {\n\t\t\t\tif (phase === \"race\") {\n\t\t\t\t\tbarrierReady++;\n\t\t\t\t\tif (barrierReady === 2) releaseBarrier?.();\n\t\t\t\t\tawait barrier;\n\t\t\t\t}\n\t\t\t\treturn originalExecute(...args);\n\t\t\t};\n\t\t\tbarrier = new Promise<void>((resolve) => {\n\t\t\t\treleaseBarrier = resolve;\n\t\t\t});\n\n\t\t\tawait runPrompt(harness, \"race todo writes\");\n\t\t\tphase = \"sequential\";\n\t\t\tawait runPrompt(harness, \"failed validation then write\");\n\t\t\tawait runPrompt(harness, \"no-op then write\");\n\t\t\tawait runPrompt(harness, \"write on new turn\");\n\t\t\texpect(mockState.transportCount).toBe(8);\n\t\t\texpect(harness.session.todoRevision).toBe(4);\n\t\t\tconst todoWriteEnds = harness.events.filter(\n\t\t\t\t(event): event is Extract<AgentSessionEvent, { type: \"tool_execution_end\" }> =>\n\t\t\t\t\tevent.type === \"tool_execution_end\" && event.toolName === \"todo_write\",\n\t\t\t);\n\t\t\texpect(\n\t\t\t\ttodoWriteEnds.filter((event) => !event.isError && toolResultDetails(event)?.changed === true),\n\t\t\t).toHaveLength(4);\n\t\t\texpect(\n\t\t\t\ttodoWriteEnds.filter((event) => toolResultDetails(event)?.todoWriteAlreadyApplied === true),\n\t\t\t).toHaveLength(1);\n\t\t\texpect(\n\t\t\t\ttodoWriteEnds.filter(\n\t\t\t\t\t(event) =>\n\t\t\t\t\t\ttoolResultDetails(event)?.changed === false &&\n\t\t\t\t\t\ttoolResultDetails(event)?.todoWriteAlreadyApplied !== true,\n\t\t\t\t),\n\t\t\t).toHaveLength(1);\n\t\t\texpect(\n\t\t\t\ttodoWriteEnds.filter(\n\t\t\t\t\t(event) =>\n\t\t\t\t\t\tevent.result.content[0]?.type === \"text\" &&\n\t\t\t\t\t\tevent.result.content[0].text.includes(\"Clearing all todos\"),\n\t\t\t\t),\n\t\t\t).toHaveLength(1);\n\t\t\texpect(harness.events.filter((event) => event.type === \"todo_update\")).toHaveLength(4);\n\t\t\texpect(assistantFinalMessages(harness.events)).toHaveLength(4);\n\t\t} finally {\n\t\t\tcloseHarness(harness);\n\t\t}\n\t});\n});\n"]}