@earendil-works/pi-agent-core 0.85.0 → 0.86.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (198) hide show
  1. package/README.md +16 -6
  2. package/dist/agent-loop.d.ts.map +1 -1
  3. package/dist/agent-loop.js +64 -22
  4. package/dist/agent-loop.js.map +1 -1
  5. package/dist/agent.d.ts +5 -3
  6. package/dist/agent.d.ts.map +1 -1
  7. package/dist/agent.js +15 -6
  8. package/dist/agent.js.map +1 -1
  9. package/dist/harness/config.d.ts +1 -1
  10. package/dist/harness/config.d.ts.map +1 -1
  11. package/dist/harness/config.js +10 -2
  12. package/dist/harness/config.js.map +1 -1
  13. package/dist/harness/env/nodejs.d.ts +2 -1
  14. package/dist/harness/env/nodejs.d.ts.map +1 -1
  15. package/dist/harness/env/nodejs.js +98 -27
  16. package/dist/harness/env/nodejs.js.map +1 -1
  17. package/dist/harness/execution/tools.d.ts +1 -1
  18. package/dist/harness/execution/tools.d.ts.map +1 -1
  19. package/dist/harness/execution/tools.js +0 -2
  20. package/dist/harness/execution/tools.js.map +1 -1
  21. package/dist/harness/messages.d.ts.map +1 -1
  22. package/dist/harness/messages.js +1 -0
  23. package/dist/harness/messages.js.map +1 -1
  24. package/dist/harness/pico3/bash.d.ts +10 -0
  25. package/dist/harness/pico3/bash.d.ts.map +1 -0
  26. package/dist/harness/pico3/bash.js +25 -0
  27. package/dist/harness/pico3/bash.js.map +1 -0
  28. package/dist/harness/pico3/bounded.d.ts +21 -0
  29. package/dist/harness/pico3/bounded.d.ts.map +1 -0
  30. package/dist/harness/pico3/bounded.js +98 -0
  31. package/dist/harness/pico3/bounded.js.map +1 -0
  32. package/dist/harness/pico3/chord.d.ts +41 -0
  33. package/dist/harness/pico3/chord.d.ts.map +1 -0
  34. package/dist/harness/pico3/chord.js +130 -0
  35. package/dist/harness/pico3/chord.js.map +1 -0
  36. package/dist/harness/pico3/context.d.ts +16 -0
  37. package/dist/harness/pico3/context.d.ts.map +1 -0
  38. package/dist/harness/pico3/context.js +88 -0
  39. package/dist/harness/pico3/context.js.map +1 -0
  40. package/dist/harness/pico3/harness.d.ts +197 -0
  41. package/dist/harness/pico3/harness.d.ts.map +1 -0
  42. package/dist/harness/pico3/harness.js +654 -0
  43. package/dist/harness/pico3/harness.js.map +1 -0
  44. package/dist/harness/pico3/hooks.d.ts +10 -0
  45. package/dist/harness/pico3/hooks.d.ts.map +1 -0
  46. package/dist/harness/pico3/hooks.js +33 -0
  47. package/dist/harness/pico3/hooks.js.map +1 -0
  48. package/dist/harness/pico3/index.d.ts +19 -0
  49. package/dist/harness/pico3/index.d.ts.map +1 -0
  50. package/dist/harness/pico3/index.js +15 -0
  51. package/dist/harness/pico3/index.js.map +1 -0
  52. package/dist/harness/pico3/jsonl.d.ts +58 -0
  53. package/dist/harness/pico3/jsonl.d.ts.map +1 -0
  54. package/dist/harness/pico3/jsonl.js +325 -0
  55. package/dist/harness/pico3/jsonl.js.map +1 -0
  56. package/dist/harness/pico3/kinds/collapse.d.ts +49 -0
  57. package/dist/harness/pico3/kinds/collapse.d.ts.map +1 -0
  58. package/dist/harness/pico3/kinds/collapse.js +191 -0
  59. package/dist/harness/pico3/kinds/collapse.js.map +1 -0
  60. package/dist/harness/pico3/kinds/entries.d.ts +78 -0
  61. package/dist/harness/pico3/kinds/entries.d.ts.map +1 -0
  62. package/dist/harness/pico3/kinds/entries.js +13 -0
  63. package/dist/harness/pico3/kinds/entries.js.map +1 -0
  64. package/dist/harness/pico3/kinds/frames.d.ts +9 -0
  65. package/dist/harness/pico3/kinds/frames.d.ts.map +1 -0
  66. package/dist/harness/pico3/kinds/frames.js +75 -0
  67. package/dist/harness/pico3/kinds/frames.js.map +1 -0
  68. package/dist/harness/pico3/kinds/generation.d.ts +94 -0
  69. package/dist/harness/pico3/kinds/generation.d.ts.map +1 -0
  70. package/dist/harness/pico3/kinds/generation.js +504 -0
  71. package/dist/harness/pico3/kinds/generation.js.map +1 -0
  72. package/dist/harness/pico3/kinds/job.d.ts +44 -0
  73. package/dist/harness/pico3/kinds/job.d.ts.map +1 -0
  74. package/dist/harness/pico3/kinds/job.js +143 -0
  75. package/dist/harness/pico3/kinds/job.js.map +1 -0
  76. package/dist/harness/pico3/kinds/plugin.d.ts +15 -0
  77. package/dist/harness/pico3/kinds/plugin.d.ts.map +1 -0
  78. package/dist/harness/pico3/kinds/plugin.js +35 -0
  79. package/dist/harness/pico3/kinds/plugin.js.map +1 -0
  80. package/dist/harness/pico3/kinds/post-tools.d.ts +22 -0
  81. package/dist/harness/pico3/kinds/post-tools.d.ts.map +1 -0
  82. package/dist/harness/pico3/kinds/post-tools.js +145 -0
  83. package/dist/harness/pico3/kinds/post-tools.js.map +1 -0
  84. package/dist/harness/pico3/kinds/task-api.d.ts +3 -0
  85. package/dist/harness/pico3/kinds/task-api.d.ts.map +1 -0
  86. package/dist/harness/pico3/kinds/task-api.js +45 -0
  87. package/dist/harness/pico3/kinds/task-api.js.map +1 -0
  88. package/dist/harness/pico3/kinds/tool.d.ts +43 -0
  89. package/dist/harness/pico3/kinds/tool.d.ts.map +1 -0
  90. package/dist/harness/pico3/kinds/tool.js +373 -0
  91. package/dist/harness/pico3/kinds/tool.js.map +1 -0
  92. package/dist/harness/pico3/membrane.d.ts +23 -0
  93. package/dist/harness/pico3/membrane.d.ts.map +1 -0
  94. package/dist/harness/pico3/membrane.js +141 -0
  95. package/dist/harness/pico3/membrane.js.map +1 -0
  96. package/dist/harness/pico3/memory.d.ts +53 -0
  97. package/dist/harness/pico3/memory.d.ts.map +1 -0
  98. package/dist/harness/pico3/memory.js +264 -0
  99. package/dist/harness/pico3/memory.js.map +1 -0
  100. package/dist/harness/pico3/scheduler.d.ts +46 -0
  101. package/dist/harness/pico3/scheduler.d.ts.map +1 -0
  102. package/dist/harness/pico3/scheduler.js +438 -0
  103. package/dist/harness/pico3/scheduler.js.map +1 -0
  104. package/dist/harness/pico3/session.d.ts +263 -0
  105. package/dist/harness/pico3/session.d.ts.map +1 -0
  106. package/dist/harness/pico3/session.js +1347 -0
  107. package/dist/harness/pico3/session.js.map +1 -0
  108. package/dist/harness/pico3/system.d.ts +126 -0
  109. package/dist/harness/pico3/system.d.ts.map +1 -0
  110. package/dist/harness/pico3/system.js +244 -0
  111. package/dist/harness/pico3/system.js.map +1 -0
  112. package/dist/harness/pico3/types.d.ts +973 -0
  113. package/dist/harness/pico3/types.d.ts.map +1 -0
  114. package/dist/harness/pico3/types.js +96 -0
  115. package/dist/harness/pico3/types.js.map +1 -0
  116. package/dist/harness/pico3/view.d.ts +34 -0
  117. package/dist/harness/pico3/view.d.ts.map +1 -0
  118. package/dist/harness/pico3/view.js +417 -0
  119. package/dist/harness/pico3/view.js.map +1 -0
  120. package/dist/harness/runtime/drive/boundary.d.ts.map +1 -1
  121. package/dist/harness/runtime/drive/boundary.js +6 -3
  122. package/dist/harness/runtime/drive/boundary.js.map +1 -1
  123. package/dist/harness/runtime/drive/response.d.ts.map +1 -1
  124. package/dist/harness/runtime/drive/response.js +4 -4
  125. package/dist/harness/runtime/drive/response.js.map +1 -1
  126. package/dist/harness/runtime/drive/retry.d.ts +2 -2
  127. package/dist/harness/runtime/drive/retry.d.ts.map +1 -1
  128. package/dist/harness/runtime/drive/retry.js +3 -6
  129. package/dist/harness/runtime/drive/retry.js.map +1 -1
  130. package/dist/harness/runtime/drive/structural.d.ts.map +1 -1
  131. package/dist/harness/runtime/drive/structural.js +5 -5
  132. package/dist/harness/runtime/drive/structural.js.map +1 -1
  133. package/dist/harness/runtime/drive/tool-placement.d.ts.map +1 -1
  134. package/dist/harness/runtime/drive/tool-placement.js +2 -27
  135. package/dist/harness/runtime/drive/tool-placement.js.map +1 -1
  136. package/dist/harness/runtime/drive/tools.d.ts.map +1 -1
  137. package/dist/harness/runtime/drive/tools.js.map +1 -1
  138. package/dist/harness/session/fork-policy.d.ts +20 -12
  139. package/dist/harness/session/fork-policy.d.ts.map +1 -1
  140. package/dist/harness/session/fork-policy.js +45 -12
  141. package/dist/harness/session/fork-policy.js.map +1 -1
  142. package/dist/harness/session/fork.d.ts +0 -2
  143. package/dist/harness/session/fork.d.ts.map +1 -1
  144. package/dist/harness/session/fork.js +20 -68
  145. package/dist/harness/session/fork.js.map +1 -1
  146. package/dist/harness/session/in-memory-storage-state.d.ts +5 -5
  147. package/dist/harness/session/in-memory-storage-state.d.ts.map +1 -1
  148. package/dist/harness/session/in-memory-storage-state.js +99 -39
  149. package/dist/harness/session/in-memory-storage-state.js.map +1 -1
  150. package/dist/harness/session/index.d.ts +1 -1
  151. package/dist/harness/session/index.d.ts.map +1 -1
  152. package/dist/harness/session/index.js +1 -1
  153. package/dist/harness/session/index.js.map +1 -1
  154. package/dist/harness/session/jsonl/fork.d.ts +38 -0
  155. package/dist/harness/session/jsonl/fork.d.ts.map +1 -0
  156. package/dist/harness/session/jsonl/fork.js +264 -0
  157. package/dist/harness/session/jsonl/fork.js.map +1 -0
  158. package/dist/harness/session/jsonl/io.d.ts +14 -0
  159. package/dist/harness/session/jsonl/io.d.ts.map +1 -0
  160. package/dist/harness/session/jsonl/io.js +86 -0
  161. package/dist/harness/session/jsonl/io.js.map +1 -0
  162. package/dist/harness/session/jsonl/legacy-v3.d.ts +33 -8
  163. package/dist/harness/session/jsonl/legacy-v3.d.ts.map +1 -1
  164. package/dist/harness/session/jsonl/legacy-v3.js +285 -206
  165. package/dist/harness/session/jsonl/legacy-v3.js.map +1 -1
  166. package/dist/harness/session/jsonl/repo.d.ts +2 -1
  167. package/dist/harness/session/jsonl/repo.d.ts.map +1 -1
  168. package/dist/harness/session/jsonl/repo.js +36 -20
  169. package/dist/harness/session/jsonl/repo.js.map +1 -1
  170. package/dist/harness/session/jsonl/storage.d.ts +4 -5
  171. package/dist/harness/session/jsonl/storage.d.ts.map +1 -1
  172. package/dist/harness/session/jsonl/storage.js +39 -113
  173. package/dist/harness/session/jsonl/storage.js.map +1 -1
  174. package/dist/harness/session/memory.d.ts +3 -5
  175. package/dist/harness/session/memory.d.ts.map +1 -1
  176. package/dist/harness/session/memory.js +9 -14
  177. package/dist/harness/session/memory.js.map +1 -1
  178. package/dist/harness/session/testing/conformance/session-repo.d.ts +2 -0
  179. package/dist/harness/session/testing/conformance/session-repo.d.ts.map +1 -1
  180. package/dist/harness/session/testing/conformance/session-repo.js +220 -1
  181. package/dist/harness/session/testing/conformance/session-repo.js.map +1 -1
  182. package/dist/harness/session/testing/index.d.ts +1 -1
  183. package/dist/harness/session/testing/index.d.ts.map +1 -1
  184. package/dist/harness/session/testing/index.js +1 -1
  185. package/dist/harness/session/testing/index.js.map +1 -1
  186. package/dist/harness/session/types.d.ts +1 -0
  187. package/dist/harness/session/types.d.ts.map +1 -1
  188. package/dist/harness/session/types.js.map +1 -1
  189. package/dist/harness/types.d.ts +14 -0
  190. package/dist/harness/types.d.ts.map +1 -1
  191. package/dist/harness/types.js.map +1 -1
  192. package/dist/proxy.d.ts +2 -2
  193. package/dist/proxy.d.ts.map +1 -1
  194. package/dist/proxy.js.map +1 -1
  195. package/dist/types.d.ts +30 -14
  196. package/dist/types.d.ts.map +1 -1
  197. package/dist/types.js.map +1 -1
  198. package/package.json +10 -6
@@ -1 +1 @@
1
- {"version":3,"file":"tool-placement.js","sourceRoot":"","sources":["../../../../src/harness/runtime/drive/tool-placement.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AssistantMessage, ToolResultMessage } from \"@earendil-works/pi-ai\";\nimport type { AgentToolCall } from \"../../../types.ts\";\nimport type { HarnessEvent } from \"../../agent-harness.ts\";\nimport { insertEntry, insertUsage } from \"../../session/commit.ts\";\nimport { SessionInvariantError } from \"../../session/session.ts\";\nimport {\n\ttype CheckpointOperation,\n\ttype MessageEntry,\n\ttype NewEntry,\n\ttype OperationState,\n\toperationScopeOf,\n\ttype ToolBatch,\n\ttype ToolCall,\n\ttype ToolsOperation,\n\ttype UsageRow,\n\ttype Write,\n} from \"../../session/types.ts\";\nimport {\n\tbranchTip,\n\tdeleteValue,\n\tlaneConfig,\n\toperationToolArgsPrefix,\n\tpendingEntry,\n\tsetValue,\n} from \"../../session/values.ts\";\nimport type { Lane } from \"../lane.ts\";\nimport type { Drive } from \"../types.ts\";\n\nexport type ToolBatchSource = {\n\tassistant: AssistantMessage;\n\tcalls: Map<number, AgentToolCall>;\n};\n\nexport async function readToolBatchSource<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n\tdrive: Drive,\n\tbatch: ToolBatch,\n): Promise<ToolBatchSource> {\n\treturn lane.command<ToolBatchSource>(async (_state, reader) => {\n\t\tconst entry = (await reader.getEntries([batch.assistantEntryId], drive.context)).get(batch.assistantEntryId);\n\t\tif (entry?.type !== \"message\" || entry.message.role !== \"assistant\") {\n\t\t\tthrow new SessionInvariantError(\"Tool batch assistant entry is invalid\");\n\t\t}\n\t\tconst calls = new Map<number, AgentToolCall>();\n\t\tfor (const call of batch.calls) {\n\t\t\tconst block = entry.message.content[call.sourceIndex];\n\t\t\tif (block?.type !== \"toolCall\") {\n\t\t\t\tthrow new SessionInvariantError(\n\t\t\t\t\t`Tool call source index ${call.sourceIndex} does not name a tool-call block`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tcalls.set(call.sourceIndex, block);\n\t\t}\n\t\treturn { kind: \"return\", result: { assistant: entry.message, calls } };\n\t}, drive.context);\n}\n\ntype PlacementItem = {\n\tcall: Extract<ToolCall, { status: \"outcome_ready\" }>;\n\tmessage: ToolResultMessage<unknown>;\n};\n\ntype PlacementRead = {\n\titems: PlacementItem[];\n\tturnResults?: ToolResultMessage<unknown>[];\n};\n\nfunction isToolResultMessage(value: unknown): value is ToolResultMessage<unknown> {\n\treturn typeof value === \"object\" && value !== null && \"role\" in value && value.role === \"toolResult\";\n}\n\nexport function toolCallFor(sources: ToolBatchSource, call: ToolCall): AgentToolCall {\n\tconst source = sources.calls.get(call.sourceIndex);\n\tif (source === undefined) {\n\t\tthrow new SessionInvariantError(`Tool call source index ${call.sourceIndex} is invalid`);\n\t}\n\treturn source;\n}\n\nexport function withToolBatch(run: ToolsOperation, batch: ToolBatch): ToolsOperation {\n\treturn { ...operationScopeOf(run), at: \"tools\", batch };\n}\n\nasync function readPlacement<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n\tdrive: Drive,\n\tsources: ToolBatchSource,\n): Promise<PlacementRead | undefined> {\n\treturn lane.command<PlacementRead | undefined>(async (state, reader) => {\n\t\tconst operation = state.operation;\n\t\tif (operation?.state.at !== \"tools\") return { kind: \"return\", result: undefined };\n\t\tconst current = operation.state.batch;\n\t\tlet first = current.calls.findIndex((call) => call.status !== \"completed\");\n\t\tif (first === -1) return { kind: \"return\", result: undefined };\n\t\tconst ready: Array<Extract<ToolCall, { status: \"outcome_ready\" }>> = [];\n\t\twhile (first < current.calls.length) {\n\t\t\tconst call = current.calls[first]!;\n\t\t\tif (call.status !== \"outcome_ready\") break;\n\t\t\tready.push(call);\n\t\t\tfirst += 1;\n\t\t}\n\t\tif (ready.length === 0) return { kind: \"return\", result: undefined };\n\n\t\tconst items: PlacementItem[] = [];\n\t\tfor (const call of ready) {\n\t\t\tconst stored = await reader.getValue(pendingEntry(call.resultEntryId), drive.context);\n\t\t\tif (stored?.value.type !== \"message\" || !isToolResultMessage(stored.value.payload)) {\n\t\t\t\tthrow new SessionInvariantError(`Tool call ${call.resultEntryId} is missing its staged result`);\n\t\t\t}\n\t\t\tconst source = toolCallFor(sources, call);\n\t\t\tif (stored.value.payload.toolCallId !== source.id || stored.value.payload.toolName !== source.name) {\n\t\t\t\tthrow new SessionInvariantError(`Tool call ${call.resultEntryId} has a mismatched staged result`);\n\t\t\t}\n\t\t\titems.push({ call, message: stored.value.payload });\n\t\t}\n\n\t\tlet turnResults: ToolResultMessage<unknown>[] | undefined;\n\t\tif (first === current.calls.length) {\n\t\t\tconst placedIds = current.calls\n\t\t\t\t.filter((call) => call.status === \"completed\")\n\t\t\t\t.map((call) => call.resultEntryId);\n\t\t\tconst placed = await reader.getEntries(placedIds, drive.context);\n\t\t\tconst staged = new Map(items.map((item) => [item.call.resultEntryId, item.message]));\n\t\t\tturnResults = current.calls.map((call) => {\n\t\t\t\tconst message =\n\t\t\t\t\tstaged.get(call.resultEntryId) ??\n\t\t\t\t\t(() => {\n\t\t\t\t\t\tconst entry = placed.get(call.resultEntryId);\n\t\t\t\t\t\treturn entry?.type === \"message\" && isToolResultMessage(entry.message) ? entry.message : undefined;\n\t\t\t\t\t})();\n\t\t\t\tif (message === undefined) {\n\t\t\t\t\tthrow new SessionInvariantError(`Completed tool call ${call.resultEntryId} is missing its result entry`);\n\t\t\t\t}\n\t\t\t\treturn message;\n\t\t\t});\n\t\t}\n\t\treturn {\n\t\t\tkind: \"return\",\n\t\t\tresult: { items, ...(turnResults === undefined ? {} : { turnResults }) },\n\t\t};\n\t}, drive.context);\n}\n\nasync function commitPlacement<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n\tdrive: Drive,\n\tcapability: ToolsOperation,\n\tread: PlacementRead,\n): Promise<boolean> {\n\tconst usageIds = read.items.map((item) =>\n\t\titem.message.usage === undefined ? undefined : lane.session.idGenerator.next(),\n\t);\n\treturn lane.settleOperation<ToolsOperation, boolean>(\n\t\tcapability,\n\t\tasync (state, run, _meta, reader) => {\n\t\t\tconst current = run.batch;\n\t\t\tconst writes: Write[] = [];\n\t\t\tconst eventEntries: Array<{ entry: NewEntry<MessageEntry>; seqIndex: number }> = [];\n\t\t\tconst eventUsage: Array<{ row: Omit<UsageRow, \"seq\">; seqIndex: number }> = [];\n\t\t\tlet parentId = state.tipId;\n\t\t\tfor (const [index, item] of read.items.entries()) {\n\t\t\t\tconst entry: NewEntry<MessageEntry> = {\n\t\t\t\t\tid: item.call.resultEntryId,\n\t\t\t\t\tparentId,\n\t\t\t\t\ttype: \"message\",\n\t\t\t\t\tmessage: item.message,\n\t\t\t\t\t...(item.call.terminate ? { terminate: true } : {}),\n\t\t\t\t};\n\t\t\t\teventEntries.push({ entry, seqIndex: writes.length });\n\t\t\t\twrites.push(insertEntry(entry), deleteValue(pendingEntry(item.call.resultEntryId)));\n\t\t\t\tconst usageId = usageIds[index];\n\t\t\t\tif (usageId !== undefined && item.message.usage !== undefined) {\n\t\t\t\t\tconst row: Omit<UsageRow, \"seq\"> = {\n\t\t\t\t\t\tid: usageId,\n\t\t\t\t\t\tusage: item.message.usage,\n\t\t\t\t\t\tentryId: item.call.resultEntryId,\n\t\t\t\t\t\tadjustment: false,\n\t\t\t\t\t};\n\t\t\t\t\teventUsage.push({ row, seqIndex: writes.length });\n\t\t\t\t\twrites.push(insertUsage(row));\n\t\t\t\t}\n\t\t\t\tparentId = item.call.resultEntryId;\n\t\t\t}\n\n\t\t\tconst completedCalls = current.calls.map((call) => {\n\t\t\t\tconst item = read.items.find(\n\t\t\t\t\t(candidate) =>\n\t\t\t\t\t\tcandidate.call.sourceIndex === call.sourceIndex &&\n\t\t\t\t\t\tcandidate.call.resultEntryId === call.resultEntryId,\n\t\t\t\t);\n\t\t\t\treturn item === undefined\n\t\t\t\t\t? call\n\t\t\t\t\t: {\n\t\t\t\t\t\t\tstatus: \"completed\" as const,\n\t\t\t\t\t\t\tsourceIndex: call.sourceIndex,\n\t\t\t\t\t\t\tresultEntryId: call.resultEntryId,\n\t\t\t\t\t\t\tterminate: item.call.terminate,\n\t\t\t\t\t\t};\n\t\t\t});\n\t\t\tconst complete = completedCalls.every((call) => call.status === \"completed\");\n\t\t\tlet nextConfiguration = state.configuration;\n\t\t\tconst addedNames: string[] = [];\n\t\t\tfor (const item of read.items) {\n\t\t\t\tfor (const name of item.message.addedToolNames ?? []) {\n\t\t\t\t\tif (!nextConfiguration.activeToolNames.includes(name) && !addedNames.includes(name)) {\n\t\t\t\t\t\taddedNames.push(name);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (addedNames.length !== 0) {\n\t\t\t\tnextConfiguration = {\n\t\t\t\t\t...nextConfiguration,\n\t\t\t\t\tactiveToolNames: [...nextConfiguration.activeToolNames, ...addedNames],\n\t\t\t\t};\n\t\t\t\twrites.push(setValue(laneConfig(lane.name), nextConfiguration));\n\t\t\t}\n\t\t\twrites.push(setValue(branchTip(lane.name), parentId));\n\n\t\t\tlet nextRun: OperationState;\n\t\t\tif (complete) {\n\t\t\t\tconst allTerminate = completedCalls.every((call) => call.status === \"completed\" && call.terminate);\n\t\t\t\tconst checkpoint: CheckpointOperation = {\n\t\t\t\t\t...operationScopeOf(run),\n\t\t\t\t\tat: \"checkpoint\",\n\t\t\t\t\tcontinuation: allTerminate\n\t\t\t\t\t\t? { kind: \"may_finish\", includeFinalAssistant: false }\n\t\t\t\t\t\t: { kind: \"need_assistant\", overflowRecoveryUsed: false },\n\t\t\t\t\ttriggerEntryId: parentId!,\n\t\t\t\t};\n\t\t\t\tnextRun = checkpoint;\n\t\t\t\tconst args = await reader.scanValues(\n\t\t\t\t\toperationToolArgsPrefix(drive.operationId, capability.batch.turnId),\n\t\t\t\t\tdrive.context,\n\t\t\t\t);\n\t\t\t\twrites.push(...args.map(({ address }) => deleteValue(address)));\n\t\t\t} else {\n\t\t\t\tnextRun = withToolBatch(run, { ...current, calls: completedCalls });\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tkind: \"commit\",\n\t\t\t\twrites,\n\t\t\t\toperationState: nextRun,\n\t\t\t\tlane: { tipId: parentId, configuration: nextConfiguration },\n\t\t\t\tmaterialize: () => complete,\n\t\t\t\tevents: (commit) => {\n\t\t\t\t\tconst events: HarnessEvent[] = [];\n\t\t\t\t\tfor (const { entry, seqIndex } of eventEntries) {\n\t\t\t\t\t\tevents.push({\n\t\t\t\t\t\t\ttype: \"entry_added\",\n\t\t\t\t\t\t\tlane: lane.name,\n\t\t\t\t\t\t\tentry: { ...entry, seq: commit.seqs[seqIndex]!, timestamp: commit.timestamp },\n\t\t\t\t\t\t});\n\t\t\t\t\t\tconst usage = eventUsage.find((candidate) => candidate.row.entryId === entry.id);\n\t\t\t\t\t\tif (usage !== undefined) {\n\t\t\t\t\t\t\tevents.push({\n\t\t\t\t\t\t\t\ttype: \"usage\",\n\t\t\t\t\t\t\t\tlane: lane.name,\n\t\t\t\t\t\t\t\trow: { ...usage.row, seq: commit.seqs[usage.seqIndex]! },\n\t\t\t\t\t\t\t\ttotals: commit.stats.usage,\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\tif (addedNames.length !== 0) {\n\t\t\t\t\t\tevents.push({\n\t\t\t\t\t\t\ttype: \"config_update\",\n\t\t\t\t\t\t\tlane: lane.name,\n\t\t\t\t\t\t\tproperty: \"activeTools\",\n\t\t\t\t\t\t\tprevious: state.configuration.activeToolNames,\n\t\t\t\t\t\t\tvalue: nextConfiguration.activeToolNames,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\treturn events;\n\t\t\t\t},\n\t\t\t};\n\t\t},\n\t\tdrive.context,\n\t);\n}\n\nexport async function materializeReady<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n\tdrive: Drive,\n\tcapability: ToolsOperation,\n\tsources: ToolBatchSource,\n\trecovery: boolean,\n): Promise<void> {\n\tconst read = await readPlacement(lane, drive, sources);\n\tif (read === undefined) return;\n\tawait lane.emitBatch(\n\t\tread.items.flatMap(({ call, message }) => [\n\t\t\t{\n\t\t\t\ttype: \"message_start\" as const,\n\t\t\t\tlane: lane.name,\n\t\t\t\trunId: drive.operationId,\n\t\t\t\tmessage,\n\t\t\t\t...(recovery ? { recovery: true as const } : {}),\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: \"message_end\" as const,\n\t\t\t\tlane: lane.name,\n\t\t\t\trunId: drive.operationId,\n\t\t\t\tmessage,\n\t\t\t\tentryId: call.resultEntryId,\n\t\t\t\t...(recovery ? { recovery: true as const } : {}),\n\t\t\t},\n\t\t]),\n\t\tdrive.context,\n\t);\n\tconst complete = await commitPlacement(lane, drive, capability, read);\n\tif (complete && read.turnResults !== undefined) {\n\t\tawait lane.emitBatch(\n\t\t\t[\n\t\t\t\t{\n\t\t\t\t\ttype: \"turn_end\",\n\t\t\t\t\tlane: lane.name,\n\t\t\t\t\trunId: drive.operationId,\n\t\t\t\t\tturnId: capability.batch.turnId,\n\t\t\t\t\tmessage: sources.assistant,\n\t\t\t\t\ttoolResults: read.turnResults,\n\t\t\t\t\t...(recovery ? { recovery: true as const } : {}),\n\t\t\t\t},\n\t\t\t],\n\t\t\tdrive.context,\n\t\t);\n\t}\n}\n"]}
1
+ {"version":3,"file":"tool-placement.js","sourceRoot":"","sources":["../../../../src/harness/runtime/drive/tool-placement.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AssistantMessage, ToolResultMessage } from \"@earendil-works/pi-ai\";\nimport type { AgentToolCall } from \"../../../types.ts\";\nimport type { HarnessEvent } from \"../../agent-harness.ts\";\nimport { insertEntry, insertUsage } from \"../../session/commit.ts\";\nimport { SessionInvariantError } from \"../../session/session.ts\";\nimport {\n\ttype CheckpointOperation,\n\ttype MessageEntry,\n\ttype NewEntry,\n\ttype OperationState,\n\toperationScopeOf,\n\ttype ToolBatch,\n\ttype ToolCall,\n\ttype ToolsOperation,\n\ttype UsageRow,\n\ttype Write,\n} from \"../../session/types.ts\";\nimport { branchTip, deleteValue, operationToolArgsPrefix, pendingEntry, setValue } from \"../../session/values.ts\";\nimport type { Lane } from \"../lane.ts\";\nimport type { Drive } from \"../types.ts\";\n\nexport type ToolBatchSource = {\n\tassistant: AssistantMessage;\n\tcalls: Map<number, AgentToolCall>;\n};\n\nexport async function readToolBatchSource<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n\tdrive: Drive,\n\tbatch: ToolBatch,\n): Promise<ToolBatchSource> {\n\treturn lane.command<ToolBatchSource>(async (_state, reader) => {\n\t\tconst entry = (await reader.getEntries([batch.assistantEntryId], drive.context)).get(batch.assistantEntryId);\n\t\tif (entry?.type !== \"message\" || entry.message.role !== \"assistant\") {\n\t\t\tthrow new SessionInvariantError(\"Tool batch assistant entry is invalid\");\n\t\t}\n\t\tconst calls = new Map<number, AgentToolCall>();\n\t\tfor (const call of batch.calls) {\n\t\t\tconst block = entry.message.content[call.sourceIndex];\n\t\t\tif (block?.type !== \"toolCall\") {\n\t\t\t\tthrow new SessionInvariantError(\n\t\t\t\t\t`Tool call source index ${call.sourceIndex} does not name a tool-call block`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tcalls.set(call.sourceIndex, block);\n\t\t}\n\t\treturn { kind: \"return\", result: { assistant: entry.message, calls } };\n\t}, drive.context);\n}\n\ntype PlacementItem = {\n\tcall: Extract<ToolCall, { status: \"outcome_ready\" }>;\n\tmessage: ToolResultMessage;\n};\n\ntype PlacementRead = {\n\titems: PlacementItem[];\n\tturnResults?: ToolResultMessage[];\n};\n\nfunction isToolResultMessage(value: unknown): value is ToolResultMessage {\n\treturn typeof value === \"object\" && value !== null && \"role\" in value && value.role === \"toolResult\";\n}\n\nexport function toolCallFor(sources: ToolBatchSource, call: ToolCall): AgentToolCall {\n\tconst source = sources.calls.get(call.sourceIndex);\n\tif (source === undefined) {\n\t\tthrow new SessionInvariantError(`Tool call source index ${call.sourceIndex} is invalid`);\n\t}\n\treturn source;\n}\n\nexport function withToolBatch(run: ToolsOperation, batch: ToolBatch): ToolsOperation {\n\treturn { ...operationScopeOf(run), at: \"tools\", batch };\n}\n\nasync function readPlacement<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n\tdrive: Drive,\n\tsources: ToolBatchSource,\n): Promise<PlacementRead | undefined> {\n\treturn lane.command<PlacementRead | undefined>(async (state, reader) => {\n\t\tconst operation = state.operation;\n\t\tif (operation?.state.at !== \"tools\") return { kind: \"return\", result: undefined };\n\t\tconst current = operation.state.batch;\n\t\tlet first = current.calls.findIndex((call) => call.status !== \"completed\");\n\t\tif (first === -1) return { kind: \"return\", result: undefined };\n\t\tconst ready: Array<Extract<ToolCall, { status: \"outcome_ready\" }>> = [];\n\t\twhile (first < current.calls.length) {\n\t\t\tconst call = current.calls[first]!;\n\t\t\tif (call.status !== \"outcome_ready\") break;\n\t\t\tready.push(call);\n\t\t\tfirst += 1;\n\t\t}\n\t\tif (ready.length === 0) return { kind: \"return\", result: undefined };\n\n\t\tconst items: PlacementItem[] = [];\n\t\tfor (const call of ready) {\n\t\t\tconst stored = await reader.getValue(pendingEntry(call.resultEntryId), drive.context);\n\t\t\tif (stored?.value.type !== \"message\" || !isToolResultMessage(stored.value.payload)) {\n\t\t\t\tthrow new SessionInvariantError(`Tool call ${call.resultEntryId} is missing its staged result`);\n\t\t\t}\n\t\t\tconst source = toolCallFor(sources, call);\n\t\t\tif (stored.value.payload.toolCallId !== source.id || stored.value.payload.toolName !== source.name) {\n\t\t\t\tthrow new SessionInvariantError(`Tool call ${call.resultEntryId} has a mismatched staged result`);\n\t\t\t}\n\t\t\titems.push({ call, message: stored.value.payload });\n\t\t}\n\n\t\tlet turnResults: ToolResultMessage[] | undefined;\n\t\tif (first === current.calls.length) {\n\t\t\tconst placedIds = current.calls\n\t\t\t\t.filter((call) => call.status === \"completed\")\n\t\t\t\t.map((call) => call.resultEntryId);\n\t\t\tconst placed = await reader.getEntries(placedIds, drive.context);\n\t\t\tconst staged = new Map(items.map((item) => [item.call.resultEntryId, item.message]));\n\t\t\tturnResults = current.calls.map((call) => {\n\t\t\t\tconst message =\n\t\t\t\t\tstaged.get(call.resultEntryId) ??\n\t\t\t\t\t(() => {\n\t\t\t\t\t\tconst entry = placed.get(call.resultEntryId);\n\t\t\t\t\t\treturn entry?.type === \"message\" && isToolResultMessage(entry.message) ? entry.message : undefined;\n\t\t\t\t\t})();\n\t\t\t\tif (message === undefined) {\n\t\t\t\t\tthrow new SessionInvariantError(`Completed tool call ${call.resultEntryId} is missing its result entry`);\n\t\t\t\t}\n\t\t\t\treturn message;\n\t\t\t});\n\t\t}\n\t\treturn {\n\t\t\tkind: \"return\",\n\t\t\tresult: { items, ...(turnResults === undefined ? {} : { turnResults }) },\n\t\t};\n\t}, drive.context);\n}\n\nasync function commitPlacement<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n\tdrive: Drive,\n\tcapability: ToolsOperation,\n\tread: PlacementRead,\n): Promise<boolean> {\n\tconst usageIds = read.items.map((item) =>\n\t\titem.message.usage === undefined ? undefined : lane.session.idGenerator.next(),\n\t);\n\treturn lane.settleOperation<ToolsOperation, boolean>(\n\t\tcapability,\n\t\tasync (state, run, _meta, reader) => {\n\t\t\tconst current = run.batch;\n\t\t\tconst writes: Write[] = [];\n\t\t\tconst eventEntries: Array<{ entry: NewEntry<MessageEntry>; seqIndex: number }> = [];\n\t\t\tconst eventUsage: Array<{ row: Omit<UsageRow, \"seq\">; seqIndex: number }> = [];\n\t\t\tlet parentId = state.tipId;\n\t\t\tfor (const [index, item] of read.items.entries()) {\n\t\t\t\tconst entry: NewEntry<MessageEntry> = {\n\t\t\t\t\tid: item.call.resultEntryId,\n\t\t\t\t\tparentId,\n\t\t\t\t\ttype: \"message\",\n\t\t\t\t\tmessage: item.message,\n\t\t\t\t\t...(item.call.terminate ? { terminate: true } : {}),\n\t\t\t\t};\n\t\t\t\teventEntries.push({ entry, seqIndex: writes.length });\n\t\t\t\twrites.push(insertEntry(entry), deleteValue(pendingEntry(item.call.resultEntryId)));\n\t\t\t\tconst usageId = usageIds[index];\n\t\t\t\tif (usageId !== undefined && item.message.usage !== undefined) {\n\t\t\t\t\tconst row: Omit<UsageRow, \"seq\"> = {\n\t\t\t\t\t\tid: usageId,\n\t\t\t\t\t\tusage: item.message.usage,\n\t\t\t\t\t\tentryId: item.call.resultEntryId,\n\t\t\t\t\t\tadjustment: false,\n\t\t\t\t\t};\n\t\t\t\t\teventUsage.push({ row, seqIndex: writes.length });\n\t\t\t\t\twrites.push(insertUsage(row));\n\t\t\t\t}\n\t\t\t\tparentId = item.call.resultEntryId;\n\t\t\t}\n\n\t\t\tconst completedCalls = current.calls.map((call) => {\n\t\t\t\tconst item = read.items.find(\n\t\t\t\t\t(candidate) =>\n\t\t\t\t\t\tcandidate.call.sourceIndex === call.sourceIndex &&\n\t\t\t\t\t\tcandidate.call.resultEntryId === call.resultEntryId,\n\t\t\t\t);\n\t\t\t\treturn item === undefined\n\t\t\t\t\t? call\n\t\t\t\t\t: {\n\t\t\t\t\t\t\tstatus: \"completed\" as const,\n\t\t\t\t\t\t\tsourceIndex: call.sourceIndex,\n\t\t\t\t\t\t\tresultEntryId: call.resultEntryId,\n\t\t\t\t\t\t\tterminate: item.call.terminate,\n\t\t\t\t\t\t};\n\t\t\t});\n\t\t\tconst complete = completedCalls.every((call) => call.status === \"completed\");\n\t\t\twrites.push(setValue(branchTip(lane.name), parentId));\n\n\t\t\tlet nextRun: OperationState;\n\t\t\tif (complete) {\n\t\t\t\tconst allTerminate = completedCalls.every((call) => call.status === \"completed\" && call.terminate);\n\t\t\t\tconst checkpoint: CheckpointOperation = {\n\t\t\t\t\t...operationScopeOf(run),\n\t\t\t\t\tat: \"checkpoint\",\n\t\t\t\t\tcontinuation: allTerminate\n\t\t\t\t\t\t? { kind: \"may_finish\", includeFinalAssistant: false }\n\t\t\t\t\t\t: { kind: \"need_assistant\", overflowRecoveryUsed: false },\n\t\t\t\t\ttriggerEntryId: parentId!,\n\t\t\t\t};\n\t\t\t\tnextRun = checkpoint;\n\t\t\t\tconst args = await reader.scanValues(\n\t\t\t\t\toperationToolArgsPrefix(drive.operationId, capability.batch.turnId),\n\t\t\t\t\tdrive.context,\n\t\t\t\t);\n\t\t\t\twrites.push(...args.map(({ address }) => deleteValue(address)));\n\t\t\t} else {\n\t\t\t\tnextRun = withToolBatch(run, { ...current, calls: completedCalls });\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tkind: \"commit\",\n\t\t\t\twrites,\n\t\t\t\toperationState: nextRun,\n\t\t\t\tlane: { tipId: parentId, configuration: state.configuration },\n\t\t\t\tmaterialize: () => complete,\n\t\t\t\tevents: (commit) => {\n\t\t\t\t\tconst events: HarnessEvent[] = [];\n\t\t\t\t\tfor (const { entry, seqIndex } of eventEntries) {\n\t\t\t\t\t\tevents.push({\n\t\t\t\t\t\t\ttype: \"entry_added\",\n\t\t\t\t\t\t\tlane: lane.name,\n\t\t\t\t\t\t\tentry: { ...entry, seq: commit.seqs[seqIndex]!, timestamp: commit.timestamp },\n\t\t\t\t\t\t});\n\t\t\t\t\t\tconst usage = eventUsage.find((candidate) => candidate.row.entryId === entry.id);\n\t\t\t\t\t\tif (usage !== undefined) {\n\t\t\t\t\t\t\tevents.push({\n\t\t\t\t\t\t\t\ttype: \"usage\",\n\t\t\t\t\t\t\t\tlane: lane.name,\n\t\t\t\t\t\t\t\trow: { ...usage.row, seq: commit.seqs[usage.seqIndex]! },\n\t\t\t\t\t\t\t\ttotals: commit.stats.usage,\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\treturn events;\n\t\t\t\t},\n\t\t\t};\n\t\t},\n\t\tdrive.context,\n\t);\n}\n\nexport async function materializeReady<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n\tdrive: Drive,\n\tcapability: ToolsOperation,\n\tsources: ToolBatchSource,\n\trecovery: boolean,\n): Promise<void> {\n\tconst read = await readPlacement(lane, drive, sources);\n\tif (read === undefined) return;\n\tawait lane.emitBatch(\n\t\tread.items.flatMap(({ call, message }) => [\n\t\t\t{\n\t\t\t\ttype: \"message_start\" as const,\n\t\t\t\tlane: lane.name,\n\t\t\t\trunId: drive.operationId,\n\t\t\t\tmessage,\n\t\t\t\t...(recovery ? { recovery: true as const } : {}),\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: \"message_end\" as const,\n\t\t\t\tlane: lane.name,\n\t\t\t\trunId: drive.operationId,\n\t\t\t\tmessage,\n\t\t\t\tentryId: call.resultEntryId,\n\t\t\t\t...(recovery ? { recovery: true as const } : {}),\n\t\t\t},\n\t\t]),\n\t\tdrive.context,\n\t);\n\tconst complete = await commitPlacement(lane, drive, capability, read);\n\tif (complete && read.turnResults !== undefined) {\n\t\tawait lane.emitBatch(\n\t\t\t[\n\t\t\t\t{\n\t\t\t\t\ttype: \"turn_end\",\n\t\t\t\t\tlane: lane.name,\n\t\t\t\t\trunId: drive.operationId,\n\t\t\t\t\tturnId: capability.batch.turnId,\n\t\t\t\t\tmessage: sources.assistant,\n\t\t\t\t\ttoolResults: read.turnResults,\n\t\t\t\t\t...(recovery ? { recovery: true as const } : {}),\n\t\t\t\t},\n\t\t\t],\n\t\t\tdrive.context,\n\t\t);\n\t}\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../../../src/harness/runtime/drive/tools.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAkC,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAW7F,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAEvC,OAAO,KAAK,EAA2B,KAAK,EAAa,eAAe,EAAE,MAAM,aAAa,CAAC;AAknB9F,iFAAiF;AACjF,wBAAsB,QAAQ,CAAC,QAAQ,SAAS,MAAM,GAAG,SAAS,EACjE,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,EACpB,KAAK,EAAE,KAAK,EACZ,GAAG,EAAE,cAAc,GACjB,OAAO,CAAC,eAAe,CAAC,CAgC1B","sourcesContent":["import type { ToolResultMessage } from \"@earendil-works/pi-ai\";\nimport type { AgentToolCall, AgentToolResult } from \"../../../types.ts\";\nimport { AbortRequested } from \"../../execution/effect-gate.ts\";\nimport {\n\tapplyBeforeToolDecision,\n\ttype ClearedToolCall,\n\tcreateToolResultMessage,\n\ttype ExecutedToolCall,\n\texecuteToolCall,\n\ttype FinalizedToolCall,\n\tfinalizeToolCall,\n\tprepareToolCall,\n\ttoolResultFromMessage,\n} from \"../../execution/tools.ts\";\nimport { SessionInvariantError } from \"../../session/session.ts\";\nimport type { JsonValue, ToolBatch, ToolCall, ToolsOperation } from \"../../session/types.ts\";\nimport {\n\tdeleteValue,\n\toperationToolArgs,\n\toperationToolMemo,\n\toperationToolMemoPrefix,\n\tpendingEntry,\n\tpendingToolOutput,\n\tsetValue,\n} from \"../../session/values.ts\";\nimport type { AgentHarnessTool, AgentHarnessToolInvocation } from \"../../types.ts\";\nimport type { Lane } from \"../lane.ts\";\nimport { openToolProgress } from \"../progress.ts\";\nimport type { ContinueOperationResult, Drive, LaneState, ProcedureResult } from \"../types.ts\";\nimport {\n\tmaterializeReady,\n\treadToolBatchSource,\n\ttype ToolBatchSource,\n\ttoolCallFor,\n\twithToolBatch,\n} from \"./tool-placement.ts\";\n\ntype ToolCallTask = { completion: Promise<void> };\ntype ToolOutcome = { toolCall: AgentToolCall; message: ToolResultMessage<unknown>; terminate: boolean };\ntype PreparedToolInvocation<TContext extends object | undefined> =\n\t| { kind: \"ready\"; cleared: ClearedToolCall<TContext> }\n\t| { kind: \"outcome\"; outcome: ToolOutcome };\n\nconst INTERRUPTION_MARKER =\n\t\"[Tool execution was interrupted. The preceding output is the latest durable progress snapshot; newer live output may be missing, and the external outcome is unknown.]\";\n\nclass ToolInvocationEnded extends Error {\n\tconstructor() {\n\t\tsuper(\"Tool invocation no longer owns its durable effect\");\n\t\tthis.name = \"ToolInvocationEnded\";\n\t}\n}\n\nfunction currentBatch<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n): { run: ToolsOperation; batch: ToolBatch } | undefined {\n\tconst operation = lane.state.operation;\n\tif (operation?.state.at !== \"tools\") return undefined;\n\treturn { run: operation.state, batch: operation.state.batch };\n}\n\nfunction findCall(batch: ToolBatch, sourceIndex: number, resultEntryId: string): ToolCall | undefined {\n\treturn batch.calls.find((call) => call.sourceIndex === sourceIndex && call.resultEntryId === resultEntryId);\n}\n\nfunction replaceCall(batch: ToolBatch, replacement: ToolCall): ToolBatch {\n\treturn {\n\t\t...batch,\n\t\tcalls: batch.calls.map((call) =>\n\t\t\tcall.sourceIndex === replacement.sourceIndex && call.resultEntryId === replacement.resultEntryId\n\t\t\t\t? replacement\n\t\t\t\t: call,\n\t\t),\n\t};\n}\n\nfunction validateMemoName(name: string): void {\n\tif (name.length === 0) throw new TypeError(\"Tool invocation memo name must not be empty\");\n\tif (name.includes(\":\")) throw new TypeError(\"Tool invocation memo name must not contain ':'\");\n}\n\nfunction invocationCapability<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n\tdrive: Drive,\n\tbatch: ToolBatch,\n\tcall: Extract<ToolCall, { status: \"effect_pending\" }>,\n): { invocation: AgentHarnessToolInvocation; expire(): void } {\n\tlet active = true;\n\tconst ownsEffect = (state: LaneState): boolean => {\n\t\tconst operation = state.operation;\n\t\tif (operation?.state.at !== \"tools\") return false;\n\t\treturn findCall(operation.state.batch, call.sourceIndex, call.resultEntryId)?.status === \"effect_pending\";\n\t};\n\tconst ended = (): ToolInvocationEnded => new ToolInvocationEnded();\n\treturn {\n\t\tinvocation: {\n\t\t\tinvocationId: call.resultEntryId,\n\t\t\toperationId: drive.operationId,\n\t\t\tturnId: batch.turnId,\n\t\t\tgetMemo(name) {\n\t\t\t\tvalidateMemoName(name);\n\t\t\t\tif (!active) return Promise.reject(ended());\n\t\t\t\treturn lane.command<JsonValue | undefined>(async (state, reader) => {\n\t\t\t\t\tif (!ownsEffect(state)) return { kind: \"reject\", error: ended() };\n\t\t\t\t\tconst stored = await reader.getValue(\n\t\t\t\t\t\toperationToolMemo(drive.operationId, call.resultEntryId, name),\n\t\t\t\t\t\tdrive.context,\n\t\t\t\t\t);\n\t\t\t\t\treturn { kind: \"return\", result: stored?.value };\n\t\t\t\t}, drive.context);\n\t\t\t},\n\t\t\tsetMemo(name, value) {\n\t\t\t\tvalidateMemoName(name);\n\t\t\t\tif (!active) return Promise.reject(ended());\n\t\t\t\treturn lane.command<void>((state) => {\n\t\t\t\t\tif (!ownsEffect(state)) return { kind: \"reject\", error: ended() };\n\t\t\t\t\tconst address = operationToolMemo(drive.operationId, call.resultEntryId, name);\n\t\t\t\t\treturn {\n\t\t\t\t\t\tkind: \"commit\",\n\t\t\t\t\t\twrites: [value === undefined ? deleteValue(address) : setValue(address, value)],\n\t\t\t\t\t\tnext: state,\n\t\t\t\t\t\tmaterialize: () => undefined,\n\t\t\t\t\t};\n\t\t\t\t}, drive.context);\n\t\t\t},\n\t\t},\n\t\texpire() {\n\t\t\tactive = false;\n\t\t},\n\t};\n}\n\nfunction syntheticMessage(\n\ttoolCall: AgentToolCall,\n\tcontent: AgentToolResult<unknown>[\"content\"],\n\toptions: { details?: unknown; usage?: AgentToolResult<unknown>[\"usage\"] } = {},\n): ToolResultMessage<unknown> {\n\treturn {\n\t\trole: \"toolResult\",\n\t\ttoolCallId: toolCall.id,\n\t\ttoolName: toolCall.name,\n\t\tcontent,\n\t\t...(options.details === undefined ? {} : { details: options.details }),\n\t\t...(options.usage === undefined ? {} : { usage: options.usage }),\n\t\tisError: true,\n\t\ttimestamp: Date.now(),\n\t};\n}\n\nfunction abortedOutcome(toolCall: AgentToolCall): ToolOutcome {\n\treturn {\n\t\ttoolCall,\n\t\tmessage: syntheticMessage(toolCall, [{ type: \"text\", text: \"Tool execution was cancelled before completion.\" }]),\n\t\tterminate: false,\n\t};\n}\n\nfunction interruptedOutcome(toolCall: AgentToolCall, checkpoint: AgentToolResult<unknown> | undefined): ToolOutcome {\n\treturn {\n\t\ttoolCall,\n\t\tmessage: syntheticMessage(\n\t\t\ttoolCall,\n\t\t\t[...(checkpoint?.content ?? []), { type: \"text\", text: INTERRUPTION_MARKER }],\n\t\t\tcheckpoint === undefined ? {} : { details: checkpoint.details, usage: checkpoint.usage },\n\t\t),\n\t\tterminate: false,\n\t};\n}\n\nfunction truncatedOutcome(toolCall: AgentToolCall): ToolOutcome {\n\treturn {\n\t\ttoolCall,\n\t\tmessage: syntheticMessage(toolCall, [\n\t\t\t{\n\t\t\t\ttype: \"text\",\n\t\t\t\ttext: `Tool call ${JSON.stringify(toolCall.name)} was not executed because the assistant response hit the output token limit, so its arguments may be truncated. Re-issue the tool call with complete arguments.`,\n\t\t\t},\n\t\t]),\n\t\tterminate: false,\n\t};\n}\n\nfunction outcomeFromFinalizedCall(finalized: FinalizedToolCall): ToolOutcome {\n\treturn { toolCall: finalized.toolCall, message: createToolResultMessage(finalized), terminate: finalized.terminate };\n}\n\nasync function publishToolIntent<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n\tdrive: Drive,\n\trun: ToolsOperation,\n\tplanned: Extract<ToolCall, { status: \"planned\" }>,\n\ttoolCall: AgentToolCall,\n\targs: Record<string, JsonValue>,\n\treplay: \"never\" | \"safe\",\n\trecovery: boolean,\n): Promise<ContinueOperationResult<Extract<ToolCall, { status: \"effect_pending\" }>>> {\n\treturn lane.continueOperation(\n\t\trun,\n\t\t(_state, run) => {\n\t\t\tconst effectPending: Extract<ToolCall, { status: \"effect_pending\" }> = {\n\t\t\t\tstatus: \"effect_pending\",\n\t\t\t\tsourceIndex: planned.sourceIndex,\n\t\t\t\tresultEntryId: planned.resultEntryId,\n\t\t\t\treplay,\n\t\t\t};\n\t\t\treturn {\n\t\t\t\tkind: \"commit\",\n\t\t\t\twrites: [setValue(operationToolArgs(drive.operationId, run.batch.turnId, planned.sourceIndex), args)],\n\t\t\t\toperationState: withToolBatch(run, replaceCall(run.batch, effectPending)),\n\t\t\t\tmaterialize: () => effectPending,\n\t\t\t\tevents: () => [\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: \"tool_start\",\n\t\t\t\t\t\tlane: lane.name,\n\t\t\t\t\t\trunId: drive.operationId,\n\t\t\t\t\t\tturnId: run.batch.turnId,\n\t\t\t\t\t\ttoolCallId: toolCall.id,\n\t\t\t\t\t\ttoolName: toolCall.name,\n\t\t\t\t\t\targs,\n\t\t\t\t\t\t...(recovery ? { recovery: true as const } : {}),\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t};\n\t\t},\n\t\tdrive.context,\n\t);\n}\n\nasync function publishToolOutcome<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n\tdrive: Drive,\n\tcapability: ToolsOperation,\n\tcall: Extract<ToolCall, { status: \"planned\" | \"effect_pending\" }>,\n\tfinalized: ToolOutcome,\n\trecovery: boolean,\n): Promise<void> {\n\tawait lane.settleOperation(\n\t\tcapability,\n\t\tasync (_state, run, _meta, reader) => {\n\t\t\tconst { toolCall } = finalized;\n\t\t\tconst memos = await reader.scanValues(\n\t\t\t\toperationToolMemoPrefix(drive.operationId, call.resultEntryId),\n\t\t\t\tdrive.context,\n\t\t\t);\n\t\t\tconst durableTerminate = run.control.status === \"running\" && finalized.terminate;\n\t\t\tconst outcome: Extract<ToolCall, { status: \"outcome_ready\" }> = {\n\t\t\t\tstatus: \"outcome_ready\",\n\t\t\t\tsourceIndex: call.sourceIndex,\n\t\t\t\tresultEntryId: call.resultEntryId,\n\t\t\t\tterminate: durableTerminate,\n\t\t\t};\n\t\t\treturn {\n\t\t\t\tkind: \"commit\",\n\t\t\t\twrites: [\n\t\t\t\t\tsetValue(pendingEntry(call.resultEntryId), { type: \"message\", payload: finalized.message }),\n\t\t\t\t\tdeleteValue(pendingToolOutput(drive.operationId, call.resultEntryId)),\n\t\t\t\t\t...memos.map(({ address }) => deleteValue(address)),\n\t\t\t\t],\n\t\t\t\toperationState: withToolBatch(run, replaceCall(run.batch, outcome)),\n\t\t\t\tmaterialize: () => undefined,\n\t\t\t\tevents: () => [\n\t\t\t\t\t...(call.status === \"planned\"\n\t\t\t\t\t\t? [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\ttype: \"tool_start\" as const,\n\t\t\t\t\t\t\t\t\tlane: lane.name,\n\t\t\t\t\t\t\t\t\trunId: drive.operationId,\n\t\t\t\t\t\t\t\t\tturnId: run.batch.turnId,\n\t\t\t\t\t\t\t\t\ttoolCallId: toolCall.id,\n\t\t\t\t\t\t\t\t\ttoolName: toolCall.name,\n\t\t\t\t\t\t\t\t\targs: toolCall.arguments,\n\t\t\t\t\t\t\t\t\t...(recovery ? { recovery: true as const } : {}),\n\t\t\t\t\t\t\t\t},\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\t\ttype: \"tool_end\",\n\t\t\t\t\t\tlane: lane.name,\n\t\t\t\t\t\trunId: drive.operationId,\n\t\t\t\t\t\tturnId: run.batch.turnId,\n\t\t\t\t\t\ttoolCallId: toolCall.id,\n\t\t\t\t\t\ttoolName: toolCall.name,\n\t\t\t\t\t\tresult: toolResultFromMessage(finalized.message, durableTerminate),\n\t\t\t\t\t\tisError: finalized.message.isError,\n\t\t\t\t\t\tterminate: durableTerminate,\n\t\t\t\t\t\t...(recovery ? { recovery: true as const } : {}),\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t};\n\t\t},\n\t\tdrive.context,\n\t);\n}\n\nasync function clearReplayCheckpoint<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n\tdrive: Drive,\n\tbatch: ToolBatch,\n\tcall: Extract<ToolCall, { status: \"effect_pending\" }>,\n\ttoolCall: AgentToolCall,\n): Promise<Record<string, JsonValue>> {\n\treturn lane.command(async (state, reader) => {\n\t\tconst stored = await reader.getValue(\n\t\t\toperationToolArgs(drive.operationId, batch.turnId, call.sourceIndex),\n\t\t\tdrive.context,\n\t\t);\n\t\tif (stored === undefined) {\n\t\t\tthrow new SessionInvariantError(`Tool call ${call.resultEntryId} is missing persisted arguments`);\n\t\t}\n\t\treturn {\n\t\t\tkind: \"commit\",\n\t\t\twrites: [deleteValue(pendingToolOutput(drive.operationId, call.resultEntryId))],\n\t\t\tnext: state,\n\t\t\tmaterialize: () => stored.value,\n\t\t\tevents: () => [\n\t\t\t\t{\n\t\t\t\t\ttype: \"tool_start\",\n\t\t\t\t\tlane: lane.name,\n\t\t\t\t\trunId: drive.operationId,\n\t\t\t\t\tturnId: batch.turnId,\n\t\t\t\t\ttoolCallId: toolCall.id,\n\t\t\t\t\ttoolName: toolCall.name,\n\t\t\t\t\targs: stored.value,\n\t\t\t\t\trecovery: true,\n\t\t\t\t},\n\t\t\t],\n\t\t};\n\t}, drive.context);\n}\n\nfunction readCheckpoint<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n\tdrive: Drive,\n\tcall: Extract<ToolCall, { status: \"effect_pending\" }>,\n): Promise<AgentToolResult<unknown> | undefined> {\n\treturn lane.command(async (_state, reader) => {\n\t\tconst stored = await reader.getValue(pendingToolOutput(drive.operationId, call.resultEntryId), drive.context);\n\t\treturn { kind: \"return\", result: stored?.value };\n\t}, drive.context);\n}\n\nasync function resolveToolContext<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n\tdrive: Drive,\n): Promise<TContext> {\n\tconst source = lane.readConfig().toolContext;\n\treturn (typeof source === \"function\" ? await source(drive.context) : source) as TContext;\n}\n\nasync function performToolInvocation<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n\tdrive: Drive,\n\tbatch: ToolBatch,\n\tcall: Extract<ToolCall, { status: \"effect_pending\" }>,\n\tcleared: ClearedToolCall<TContext>,\n\ttoolContext: TContext,\n\trecovery: boolean,\n): Promise<ToolOutcome> {\n\tconst capability = invocationCapability(lane, drive, batch, call);\n\tconst progress = openToolProgress(lane, drive, batch.turnId, call.sourceIndex, call.resultEntryId);\n\tlet latestUpdateDelivery: Promise<void> = Promise.resolve();\n\tconst publishUpdate = (partial: AgentToolResult<unknown>): void => {\n\t\tlatestUpdateDelivery = lane.emitBatch(\n\t\t\t[\n\t\t\t\t{\n\t\t\t\t\ttype: \"tool_update\",\n\t\t\t\t\tlane: lane.name,\n\t\t\t\t\trunId: drive.operationId,\n\t\t\t\t\tturnId: batch.turnId,\n\t\t\t\t\ttoolCallId: cleared.toolCall.id,\n\t\t\t\t\ttoolName: cleared.toolCall.name,\n\t\t\t\t\tpartialResult: partial,\n\t\t\t\t\t...(recovery ? { recovery: true as const } : {}),\n\t\t\t\t},\n\t\t\t],\n\t\t\tdrive.context,\n\t\t);\n\t\tvoid latestUpdateDelivery.catch(() => {});\n\t};\n\n\tlet execution: Promise<ExecutedToolCall>;\n\ttry {\n\t\texecution = executeToolCall(\n\t\t\tcleared,\n\t\t\tdrive.gate,\n\t\t\t(partial, options) => {\n\t\t\t\tpublishUpdate(partial);\n\t\t\t\tif (options?.checkpoint === true) progress.write(partial);\n\t\t\t},\n\t\t\ttoolContext,\n\t\t\tcapability.invocation,\n\t\t\tdrive.context,\n\t\t);\n\t} catch (error) {\n\t\tcapability.expire();\n\t\tprogress.seal();\n\t\tawait progress.drain();\n\t\tif (!(error instanceof AbortRequested)) throw error;\n\t\tawait error.cancellation;\n\t\treturn recovery ? interruptedOutcome(cleared.toolCall, undefined) : abortedOutcome(cleared.toolCall);\n\t}\n\n\tconst executed = await execution.finally(() => {\n\t\tcapability.expire();\n\t\tprogress.seal();\n\t});\n\tawait latestUpdateDelivery;\n\tawait progress.drain();\n\n\tlet patch: Awaited<ReturnType<typeof lane.hooks.runToolWithGate<\"after_tool\">>>;\n\ttry {\n\t\tpatch = await lane.hooks.runToolWithGate(\n\t\t\t\"after_tool\",\n\t\t\t{\n\t\t\t\tlane: lane.name,\n\t\t\t\trunId: drive.operationId,\n\t\t\t\ttoolCallId: cleared.toolCall.id,\n\t\t\t\ttoolName: cleared.toolCall.name,\n\t\t\t\targs: cleared.args,\n\t\t\t\tcontent: executed.result.content,\n\t\t\t\t...(executed.result.details === undefined ? {} : { details: executed.result.details as JsonValue }),\n\t\t\t\tisError: executed.isError,\n\t\t\t\t...(executed.result.usage === undefined ? {} : { usage: executed.result.usage }),\n\t\t\t},\n\t\t\tdrive.gate,\n\t\t\tdrive.context,\n\t\t);\n\t} catch (error) {\n\t\tif (!(error instanceof AbortRequested)) throw error;\n\t\tpatch = undefined;\n\t}\n\tconst finalized = finalizeToolCall(cleared, executed, patch);\n\treturn { toolCall: finalized.toolCall, message: createToolResultMessage(finalized), terminate: finalized.terminate };\n}\n\nasync function prepareToolInvocation<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n\tdrive: Drive,\n\tsources: ToolBatchSource,\n\tcall: Extract<ToolCall, { status: \"planned\" }>,\n\ttools: AgentHarnessTool<TContext>[],\n): Promise<PreparedToolInvocation<TContext>> {\n\tconst toolCall = toolCallFor(sources, call);\n\tif (sources.assistant.stopReason === \"length\") {\n\t\treturn { kind: \"outcome\", outcome: truncatedOutcome(toolCall) };\n\t}\n\tconst prepared = prepareToolCall(toolCall, tools);\n\tif (\"kind\" in prepared) return { kind: \"outcome\", outcome: outcomeFromFinalizedCall(prepared) };\n\n\tlet decision: Awaited<ReturnType<typeof lane.hooks.runToolWithGate<\"before_tool\">>>;\n\ttry {\n\t\tdecision = await lane.hooks.runToolWithGate(\n\t\t\t\"before_tool\",\n\t\t\t{\n\t\t\t\tlane: lane.name,\n\t\t\t\trunId: drive.operationId,\n\t\t\t\ttoolCallId: toolCall.id,\n\t\t\t\ttoolName: toolCall.name,\n\t\t\t\targs: prepared.args,\n\t\t\t},\n\t\t\tdrive.gate,\n\t\t\tdrive.context,\n\t\t);\n\t} catch (error) {\n\t\tif (!(error instanceof AbortRequested)) throw error;\n\t\tawait error.cancellation;\n\t\treturn { kind: \"outcome\", outcome: abortedOutcome(toolCall) };\n\t}\n\tconst cleared = applyBeforeToolDecision(prepared, decision);\n\treturn \"kind\" in cleared\n\t\t? { kind: \"outcome\", outcome: outcomeFromFinalizedCall(cleared) }\n\t\t: { kind: \"ready\", cleared };\n}\n\nasync function startToolInvocation<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n\tdrive: Drive,\n\trun: ToolsOperation,\n\tsources: ToolBatchSource,\n\tcall: Extract<ToolCall, { status: \"planned\" }>,\n\ttools: AgentHarnessTool<TContext>[],\n\ttoolContext: TContext,\n\trecovery: boolean,\n): Promise<ToolCallTask> {\n\tconst prepared = await prepareToolInvocation(lane, drive, sources, call, tools);\n\tif (prepared.kind === \"outcome\") {\n\t\treturn { completion: publishToolOutcome(lane, drive, run, call, prepared.outcome, recovery) };\n\t}\n\tconst effectPending = await publishToolIntent(\n\t\tlane,\n\t\tdrive,\n\t\trun,\n\t\tcall,\n\t\tprepared.cleared.toolCall,\n\t\tprepared.cleared.args,\n\t\tprepared.cleared.tool.replay ?? \"never\",\n\t\trecovery,\n\t);\n\treturn {\n\t\tcompletion:\n\t\t\teffectPending.kind === \"cancel_requested\"\n\t\t\t\t? publishToolOutcome(lane, drive, run, call, abortedOutcome(prepared.cleared.toolCall), recovery)\n\t\t\t\t: performToolInvocation(\n\t\t\t\t\t\tlane,\n\t\t\t\t\t\tdrive,\n\t\t\t\t\t\trun.batch,\n\t\t\t\t\t\teffectPending.value,\n\t\t\t\t\t\tprepared.cleared,\n\t\t\t\t\t\ttoolContext,\n\t\t\t\t\t\trecovery,\n\t\t\t\t\t).then((outcome) => publishToolOutcome(lane, drive, run, effectPending.value, outcome, recovery)),\n\t};\n}\n\nasync function recoverToolInvocation<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n\tdrive: Drive,\n\trun: ToolsOperation,\n\tsources: ToolBatchSource,\n\tcall: Extract<ToolCall, { status: \"effect_pending\" }>,\n\ttoolsByName: Map<string, AgentHarnessTool<TContext>>,\n\ttoolContext: TContext,\n\tcancelled: boolean,\n): Promise<ToolCallTask> {\n\tconst toolCall = toolCallFor(sources, call);\n\tconst tool = toolsByName.get(toolCall.name);\n\tif (!cancelled && call.replay === \"safe\" && tool?.replay === \"safe\") {\n\t\tconst args = await clearReplayCheckpoint(lane, drive, run.batch, call, toolCall);\n\t\tconst cleared: ClearedToolCall<TContext> = { toolCall, tool, args };\n\t\treturn {\n\t\t\tcompletion: performToolInvocation(lane, drive, run.batch, call, cleared, toolContext, true).then((outcome) =>\n\t\t\t\tpublishToolOutcome(lane, drive, run, call, outcome, true),\n\t\t\t),\n\t\t};\n\t}\n\tconst checkpoint = await readCheckpoint(lane, drive, call);\n\treturn {\n\t\tcompletion: publishToolOutcome(lane, drive, run, call, interruptedOutcome(toolCall, checkpoint), true),\n\t};\n}\n\nasync function runSequential<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n\tdrive: Drive,\n\trun: ToolsOperation,\n\tsources: ToolBatchSource,\n\texecution:\n\t\t| {\n\t\t\t\ttools: AgentHarnessTool<TContext>[];\n\t\t\t\ttoolsByName: Map<string, AgentHarnessTool<TContext>>;\n\t\t\t\ttoolContext: TContext;\n\t\t }\n\t\t| undefined,\n\trecovery: boolean,\n): Promise<ProcedureResult> {\n\tconst { batch } = run;\n\tfor (let transition = 0; transition <= batch.calls.length * 2 + 1; transition += 1) {\n\t\tawait materializeReady(lane, drive, run, sources, recovery);\n\t\tconst current = currentBatch(lane);\n\t\tif (current === undefined) return { kind: \"continue\" };\n\t\tconst call = current.batch.calls.find((candidate) => candidate.status !== \"completed\");\n\t\tif (call === undefined) throw new SessionInvariantError(\"Tool batch remained open after every call completed\");\n\t\tif (call.status === \"outcome_ready\") throw new SessionInvariantError(\"Ready tool outcome was not materialized\");\n\n\t\tif (current.run.control.status === \"cancel_requested\") {\n\t\t\tconst toolCall = toolCallFor(sources, call);\n\t\t\tif (call.status === \"planned\") {\n\t\t\t\tawait publishToolOutcome(lane, drive, current.run, call, abortedOutcome(toolCall), recovery);\n\t\t\t} else {\n\t\t\t\tconst checkpoint = await readCheckpoint(lane, drive, call);\n\t\t\t\tawait publishToolOutcome(\n\t\t\t\t\tlane,\n\t\t\t\t\tdrive,\n\t\t\t\t\tcurrent.run,\n\t\t\t\t\tcall,\n\t\t\t\t\tinterruptedOutcome(toolCall, checkpoint),\n\t\t\t\t\trecovery,\n\t\t\t\t);\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (execution === undefined) throw new SessionInvariantError(\"Running tool batch is missing execution context\");\n\t\tconst started =\n\t\t\tcall.status === \"planned\"\n\t\t\t\t? await startToolInvocation(\n\t\t\t\t\t\tlane,\n\t\t\t\t\t\tdrive,\n\t\t\t\t\t\tcurrent.run,\n\t\t\t\t\t\tsources,\n\t\t\t\t\t\tcall,\n\t\t\t\t\t\texecution.tools,\n\t\t\t\t\t\texecution.toolContext,\n\t\t\t\t\t\trecovery,\n\t\t\t\t\t)\n\t\t\t\t: await recoverToolInvocation(\n\t\t\t\t\t\tlane,\n\t\t\t\t\t\tdrive,\n\t\t\t\t\t\tcurrent.run,\n\t\t\t\t\t\tsources,\n\t\t\t\t\t\tcall,\n\t\t\t\t\t\texecution.toolsByName,\n\t\t\t\t\t\texecution.toolContext,\n\t\t\t\t\t\tfalse,\n\t\t\t\t\t);\n\t\tawait started.completion;\n\t}\n\tthrow new SessionInvariantError(\"Sequential tool batch exceeded its bounded transition count\");\n}\n\nasync function runParallel<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n\tdrive: Drive,\n\trun: ToolsOperation,\n\tsources: ToolBatchSource,\n\ttools: AgentHarnessTool<TContext>[],\n\ttoolsByName: Map<string, AgentHarnessTool<TContext>>,\n\ttoolContext: TContext,\n\trecovery: boolean,\n): Promise<ProcedureResult> {\n\tconst { batch } = run;\n\tlet materialization = Promise.resolve();\n\tconst scheduleMaterialization = (): Promise<void> => {\n\t\tconst scheduled = materialization.then(() => materializeReady(lane, drive, run, sources, recovery));\n\t\tmaterialization = scheduled.catch(() => {});\n\t\treturn scheduled;\n\t};\n\tconst jobs: Promise<void>[] = [];\n\tfor (const call of batch.calls) {\n\t\tif (call.status === \"completed\" || call.status === \"outcome_ready\") continue;\n\t\tconst started =\n\t\t\tcall.status === \"planned\"\n\t\t\t\t? await startToolInvocation(lane, drive, run, sources, call, tools, toolContext, recovery)\n\t\t\t\t: await recoverToolInvocation(\n\t\t\t\t\t\tlane,\n\t\t\t\t\t\tdrive,\n\t\t\t\t\t\trun,\n\t\t\t\t\t\tsources,\n\t\t\t\t\t\tcall,\n\t\t\t\t\t\ttoolsByName,\n\t\t\t\t\t\ttoolContext,\n\t\t\t\t\t\tlane.state.operation!.state.control.status === \"cancel_requested\",\n\t\t\t\t\t);\n\t\tconst job = started.completion.then(async () => {\n\t\t\tawait scheduleMaterialization();\n\t\t});\n\t\tvoid job.catch(() => {});\n\t\tjobs.push(job);\n\t}\n\tawait Promise.all(jobs);\n\tawait scheduleMaterialization();\n\treturn { kind: \"continue\" };\n}\n\n/** Execute, recover, stage, and source-order one complete durable tool batch. */\nexport async function runTools<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n\tdrive: Drive,\n\trun: ToolsOperation,\n): Promise<ProcedureResult> {\n\tconst batch = run.batch;\n\tconst recovery = batch.calls.some((call) => call.status === \"effect_pending\" || call.status === \"outcome_ready\");\n\tif (recovery) {\n\t\tawait lane.emitBatch(\n\t\t\t[\n\t\t\t\t{\n\t\t\t\t\ttype: \"turn_start\",\n\t\t\t\t\tlane: lane.name,\n\t\t\t\t\trunId: drive.operationId,\n\t\t\t\t\tturnId: batch.turnId,\n\t\t\t\t\trecovery: true,\n\t\t\t\t},\n\t\t\t],\n\t\t\tdrive.context,\n\t\t);\n\t}\n\tconst sources = await readToolBatchSource(lane, drive, batch);\n\tawait materializeReady(lane, drive, run, sources, recovery);\n\tconst current = currentBatch(lane);\n\tif (current === undefined) return { kind: \"continue\" };\n\tif (current.run.control.status === \"cancel_requested\") {\n\t\treturn runSequential(lane, drive, current.run, sources, undefined, recovery);\n\t}\n\tconst config = lane.readConfig();\n\tconst active = new Set(batch.configuration.activeToolNames);\n\tconst tools = config.tools.filter((tool) => active.has(tool.name));\n\tconst toolsByName = new Map(tools.map((tool) => [tool.name, tool]));\n\tconst toolContext = await resolveToolContext(lane, drive);\n\treturn run.settings.toolExecution === \"sequential\"\n\t\t? runSequential(lane, drive, current.run, sources, { tools, toolsByName, toolContext }, recovery)\n\t\t: runParallel(lane, drive, current.run, sources, tools, toolsByName, toolContext, recovery);\n}\n"]}
1
+ {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../../../src/harness/runtime/drive/tools.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAkC,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAW7F,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAEvC,OAAO,KAAK,EAA2B,KAAK,EAAa,eAAe,EAAE,MAAM,aAAa,CAAC;AAknB9F,iFAAiF;AACjF,wBAAsB,QAAQ,CAAC,QAAQ,SAAS,MAAM,GAAG,SAAS,EACjE,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,EACpB,KAAK,EAAE,KAAK,EACZ,GAAG,EAAE,cAAc,GACjB,OAAO,CAAC,eAAe,CAAC,CAgC1B","sourcesContent":["import type { ToolResultMessage } from \"@earendil-works/pi-ai\";\nimport type { AgentToolCall, AgentToolResult } from \"../../../types.ts\";\nimport { AbortRequested } from \"../../execution/effect-gate.ts\";\nimport {\n\tapplyBeforeToolDecision,\n\ttype ClearedToolCall,\n\tcreateToolResultMessage,\n\ttype ExecutedToolCall,\n\texecuteToolCall,\n\ttype FinalizedToolCall,\n\tfinalizeToolCall,\n\tprepareToolCall,\n\ttoolResultFromMessage,\n} from \"../../execution/tools.ts\";\nimport { SessionInvariantError } from \"../../session/session.ts\";\nimport type { JsonValue, ToolBatch, ToolCall, ToolsOperation } from \"../../session/types.ts\";\nimport {\n\tdeleteValue,\n\toperationToolArgs,\n\toperationToolMemo,\n\toperationToolMemoPrefix,\n\tpendingEntry,\n\tpendingToolOutput,\n\tsetValue,\n} from \"../../session/values.ts\";\nimport type { AgentHarnessTool, AgentHarnessToolInvocation } from \"../../types.ts\";\nimport type { Lane } from \"../lane.ts\";\nimport { openToolProgress } from \"../progress.ts\";\nimport type { ContinueOperationResult, Drive, LaneState, ProcedureResult } from \"../types.ts\";\nimport {\n\tmaterializeReady,\n\treadToolBatchSource,\n\ttype ToolBatchSource,\n\ttoolCallFor,\n\twithToolBatch,\n} from \"./tool-placement.ts\";\n\ntype ToolCallTask = { completion: Promise<void> };\ntype ToolOutcome = { toolCall: AgentToolCall; message: ToolResultMessage; terminate: boolean };\ntype PreparedToolInvocation<TContext extends object | undefined> =\n\t| { kind: \"ready\"; cleared: ClearedToolCall<TContext> }\n\t| { kind: \"outcome\"; outcome: ToolOutcome };\n\nconst INTERRUPTION_MARKER =\n\t\"[Tool execution was interrupted. The preceding output is the latest durable progress snapshot; newer live output may be missing, and the external outcome is unknown.]\";\n\nclass ToolInvocationEnded extends Error {\n\tconstructor() {\n\t\tsuper(\"Tool invocation no longer owns its durable effect\");\n\t\tthis.name = \"ToolInvocationEnded\";\n\t}\n}\n\nfunction currentBatch<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n): { run: ToolsOperation; batch: ToolBatch } | undefined {\n\tconst operation = lane.state.operation;\n\tif (operation?.state.at !== \"tools\") return undefined;\n\treturn { run: operation.state, batch: operation.state.batch };\n}\n\nfunction findCall(batch: ToolBatch, sourceIndex: number, resultEntryId: string): ToolCall | undefined {\n\treturn batch.calls.find((call) => call.sourceIndex === sourceIndex && call.resultEntryId === resultEntryId);\n}\n\nfunction replaceCall(batch: ToolBatch, replacement: ToolCall): ToolBatch {\n\treturn {\n\t\t...batch,\n\t\tcalls: batch.calls.map((call) =>\n\t\t\tcall.sourceIndex === replacement.sourceIndex && call.resultEntryId === replacement.resultEntryId\n\t\t\t\t? replacement\n\t\t\t\t: call,\n\t\t),\n\t};\n}\n\nfunction validateMemoName(name: string): void {\n\tif (name.length === 0) throw new TypeError(\"Tool invocation memo name must not be empty\");\n\tif (name.includes(\":\")) throw new TypeError(\"Tool invocation memo name must not contain ':'\");\n}\n\nfunction invocationCapability<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n\tdrive: Drive,\n\tbatch: ToolBatch,\n\tcall: Extract<ToolCall, { status: \"effect_pending\" }>,\n): { invocation: AgentHarnessToolInvocation; expire(): void } {\n\tlet active = true;\n\tconst ownsEffect = (state: LaneState): boolean => {\n\t\tconst operation = state.operation;\n\t\tif (operation?.state.at !== \"tools\") return false;\n\t\treturn findCall(operation.state.batch, call.sourceIndex, call.resultEntryId)?.status === \"effect_pending\";\n\t};\n\tconst ended = (): ToolInvocationEnded => new ToolInvocationEnded();\n\treturn {\n\t\tinvocation: {\n\t\t\tinvocationId: call.resultEntryId,\n\t\t\toperationId: drive.operationId,\n\t\t\tturnId: batch.turnId,\n\t\t\tgetMemo(name) {\n\t\t\t\tvalidateMemoName(name);\n\t\t\t\tif (!active) return Promise.reject(ended());\n\t\t\t\treturn lane.command<JsonValue | undefined>(async (state, reader) => {\n\t\t\t\t\tif (!ownsEffect(state)) return { kind: \"reject\", error: ended() };\n\t\t\t\t\tconst stored = await reader.getValue(\n\t\t\t\t\t\toperationToolMemo(drive.operationId, call.resultEntryId, name),\n\t\t\t\t\t\tdrive.context,\n\t\t\t\t\t);\n\t\t\t\t\treturn { kind: \"return\", result: stored?.value };\n\t\t\t\t}, drive.context);\n\t\t\t},\n\t\t\tsetMemo(name, value) {\n\t\t\t\tvalidateMemoName(name);\n\t\t\t\tif (!active) return Promise.reject(ended());\n\t\t\t\treturn lane.command<void>((state) => {\n\t\t\t\t\tif (!ownsEffect(state)) return { kind: \"reject\", error: ended() };\n\t\t\t\t\tconst address = operationToolMemo(drive.operationId, call.resultEntryId, name);\n\t\t\t\t\treturn {\n\t\t\t\t\t\tkind: \"commit\",\n\t\t\t\t\t\twrites: [value === undefined ? deleteValue(address) : setValue(address, value)],\n\t\t\t\t\t\tnext: state,\n\t\t\t\t\t\tmaterialize: () => undefined,\n\t\t\t\t\t};\n\t\t\t\t}, drive.context);\n\t\t\t},\n\t\t},\n\t\texpire() {\n\t\t\tactive = false;\n\t\t},\n\t};\n}\n\nfunction syntheticMessage(\n\ttoolCall: AgentToolCall,\n\tcontent: AgentToolResult<unknown>[\"content\"],\n\toptions: { details?: unknown; usage?: AgentToolResult<unknown>[\"usage\"] } = {},\n): ToolResultMessage {\n\treturn {\n\t\trole: \"toolResult\",\n\t\ttoolCallId: toolCall.id,\n\t\ttoolName: toolCall.name,\n\t\tcontent,\n\t\t...(options.details === undefined ? {} : { details: options.details as JsonValue }),\n\t\t...(options.usage === undefined ? {} : { usage: options.usage }),\n\t\tisError: true,\n\t\ttimestamp: Date.now(),\n\t};\n}\n\nfunction abortedOutcome(toolCall: AgentToolCall): ToolOutcome {\n\treturn {\n\t\ttoolCall,\n\t\tmessage: syntheticMessage(toolCall, [{ type: \"text\", text: \"Tool execution was cancelled before completion.\" }]),\n\t\tterminate: false,\n\t};\n}\n\nfunction interruptedOutcome(toolCall: AgentToolCall, checkpoint: AgentToolResult<unknown> | undefined): ToolOutcome {\n\treturn {\n\t\ttoolCall,\n\t\tmessage: syntheticMessage(\n\t\t\ttoolCall,\n\t\t\t[...(checkpoint?.content ?? []), { type: \"text\", text: INTERRUPTION_MARKER }],\n\t\t\tcheckpoint === undefined ? {} : { details: checkpoint.details, usage: checkpoint.usage },\n\t\t),\n\t\tterminate: false,\n\t};\n}\n\nfunction truncatedOutcome(toolCall: AgentToolCall): ToolOutcome {\n\treturn {\n\t\ttoolCall,\n\t\tmessage: syntheticMessage(toolCall, [\n\t\t\t{\n\t\t\t\ttype: \"text\",\n\t\t\t\ttext: `Tool call ${JSON.stringify(toolCall.name)} was not executed because the assistant response hit the output token limit, so its arguments may be truncated. Re-issue the tool call with complete arguments.`,\n\t\t\t},\n\t\t]),\n\t\tterminate: false,\n\t};\n}\n\nfunction outcomeFromFinalizedCall(finalized: FinalizedToolCall): ToolOutcome {\n\treturn { toolCall: finalized.toolCall, message: createToolResultMessage(finalized), terminate: finalized.terminate };\n}\n\nasync function publishToolIntent<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n\tdrive: Drive,\n\trun: ToolsOperation,\n\tplanned: Extract<ToolCall, { status: \"planned\" }>,\n\ttoolCall: AgentToolCall,\n\targs: Record<string, JsonValue>,\n\treplay: \"never\" | \"safe\",\n\trecovery: boolean,\n): Promise<ContinueOperationResult<Extract<ToolCall, { status: \"effect_pending\" }>>> {\n\treturn lane.continueOperation(\n\t\trun,\n\t\t(_state, run) => {\n\t\t\tconst effectPending: Extract<ToolCall, { status: \"effect_pending\" }> = {\n\t\t\t\tstatus: \"effect_pending\",\n\t\t\t\tsourceIndex: planned.sourceIndex,\n\t\t\t\tresultEntryId: planned.resultEntryId,\n\t\t\t\treplay,\n\t\t\t};\n\t\t\treturn {\n\t\t\t\tkind: \"commit\",\n\t\t\t\twrites: [setValue(operationToolArgs(drive.operationId, run.batch.turnId, planned.sourceIndex), args)],\n\t\t\t\toperationState: withToolBatch(run, replaceCall(run.batch, effectPending)),\n\t\t\t\tmaterialize: () => effectPending,\n\t\t\t\tevents: () => [\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: \"tool_start\",\n\t\t\t\t\t\tlane: lane.name,\n\t\t\t\t\t\trunId: drive.operationId,\n\t\t\t\t\t\tturnId: run.batch.turnId,\n\t\t\t\t\t\ttoolCallId: toolCall.id,\n\t\t\t\t\t\ttoolName: toolCall.name,\n\t\t\t\t\t\targs,\n\t\t\t\t\t\t...(recovery ? { recovery: true as const } : {}),\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t};\n\t\t},\n\t\tdrive.context,\n\t);\n}\n\nasync function publishToolOutcome<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n\tdrive: Drive,\n\tcapability: ToolsOperation,\n\tcall: Extract<ToolCall, { status: \"planned\" | \"effect_pending\" }>,\n\tfinalized: ToolOutcome,\n\trecovery: boolean,\n): Promise<void> {\n\tawait lane.settleOperation(\n\t\tcapability,\n\t\tasync (_state, run, _meta, reader) => {\n\t\t\tconst { toolCall } = finalized;\n\t\t\tconst memos = await reader.scanValues(\n\t\t\t\toperationToolMemoPrefix(drive.operationId, call.resultEntryId),\n\t\t\t\tdrive.context,\n\t\t\t);\n\t\t\tconst durableTerminate = run.control.status === \"running\" && finalized.terminate;\n\t\t\tconst outcome: Extract<ToolCall, { status: \"outcome_ready\" }> = {\n\t\t\t\tstatus: \"outcome_ready\",\n\t\t\t\tsourceIndex: call.sourceIndex,\n\t\t\t\tresultEntryId: call.resultEntryId,\n\t\t\t\tterminate: durableTerminate,\n\t\t\t};\n\t\t\treturn {\n\t\t\t\tkind: \"commit\",\n\t\t\t\twrites: [\n\t\t\t\t\tsetValue(pendingEntry(call.resultEntryId), { type: \"message\", payload: finalized.message }),\n\t\t\t\t\tdeleteValue(pendingToolOutput(drive.operationId, call.resultEntryId)),\n\t\t\t\t\t...memos.map(({ address }) => deleteValue(address)),\n\t\t\t\t],\n\t\t\t\toperationState: withToolBatch(run, replaceCall(run.batch, outcome)),\n\t\t\t\tmaterialize: () => undefined,\n\t\t\t\tevents: () => [\n\t\t\t\t\t...(call.status === \"planned\"\n\t\t\t\t\t\t? [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\ttype: \"tool_start\" as const,\n\t\t\t\t\t\t\t\t\tlane: lane.name,\n\t\t\t\t\t\t\t\t\trunId: drive.operationId,\n\t\t\t\t\t\t\t\t\tturnId: run.batch.turnId,\n\t\t\t\t\t\t\t\t\ttoolCallId: toolCall.id,\n\t\t\t\t\t\t\t\t\ttoolName: toolCall.name,\n\t\t\t\t\t\t\t\t\targs: toolCall.arguments,\n\t\t\t\t\t\t\t\t\t...(recovery ? { recovery: true as const } : {}),\n\t\t\t\t\t\t\t\t},\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\t\ttype: \"tool_end\",\n\t\t\t\t\t\tlane: lane.name,\n\t\t\t\t\t\trunId: drive.operationId,\n\t\t\t\t\t\tturnId: run.batch.turnId,\n\t\t\t\t\t\ttoolCallId: toolCall.id,\n\t\t\t\t\t\ttoolName: toolCall.name,\n\t\t\t\t\t\tresult: toolResultFromMessage(finalized.message, durableTerminate),\n\t\t\t\t\t\tisError: finalized.message.isError,\n\t\t\t\t\t\tterminate: durableTerminate,\n\t\t\t\t\t\t...(recovery ? { recovery: true as const } : {}),\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t};\n\t\t},\n\t\tdrive.context,\n\t);\n}\n\nasync function clearReplayCheckpoint<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n\tdrive: Drive,\n\tbatch: ToolBatch,\n\tcall: Extract<ToolCall, { status: \"effect_pending\" }>,\n\ttoolCall: AgentToolCall,\n): Promise<Record<string, JsonValue>> {\n\treturn lane.command(async (state, reader) => {\n\t\tconst stored = await reader.getValue(\n\t\t\toperationToolArgs(drive.operationId, batch.turnId, call.sourceIndex),\n\t\t\tdrive.context,\n\t\t);\n\t\tif (stored === undefined) {\n\t\t\tthrow new SessionInvariantError(`Tool call ${call.resultEntryId} is missing persisted arguments`);\n\t\t}\n\t\treturn {\n\t\t\tkind: \"commit\",\n\t\t\twrites: [deleteValue(pendingToolOutput(drive.operationId, call.resultEntryId))],\n\t\t\tnext: state,\n\t\t\tmaterialize: () => stored.value,\n\t\t\tevents: () => [\n\t\t\t\t{\n\t\t\t\t\ttype: \"tool_start\",\n\t\t\t\t\tlane: lane.name,\n\t\t\t\t\trunId: drive.operationId,\n\t\t\t\t\tturnId: batch.turnId,\n\t\t\t\t\ttoolCallId: toolCall.id,\n\t\t\t\t\ttoolName: toolCall.name,\n\t\t\t\t\targs: stored.value,\n\t\t\t\t\trecovery: true,\n\t\t\t\t},\n\t\t\t],\n\t\t};\n\t}, drive.context);\n}\n\nfunction readCheckpoint<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n\tdrive: Drive,\n\tcall: Extract<ToolCall, { status: \"effect_pending\" }>,\n): Promise<AgentToolResult<unknown> | undefined> {\n\treturn lane.command(async (_state, reader) => {\n\t\tconst stored = await reader.getValue(pendingToolOutput(drive.operationId, call.resultEntryId), drive.context);\n\t\treturn { kind: \"return\", result: stored?.value };\n\t}, drive.context);\n}\n\nasync function resolveToolContext<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n\tdrive: Drive,\n): Promise<TContext> {\n\tconst source = lane.readConfig().toolContext;\n\treturn (typeof source === \"function\" ? await source(drive.context) : source) as TContext;\n}\n\nasync function performToolInvocation<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n\tdrive: Drive,\n\tbatch: ToolBatch,\n\tcall: Extract<ToolCall, { status: \"effect_pending\" }>,\n\tcleared: ClearedToolCall<TContext>,\n\ttoolContext: TContext,\n\trecovery: boolean,\n): Promise<ToolOutcome> {\n\tconst capability = invocationCapability(lane, drive, batch, call);\n\tconst progress = openToolProgress(lane, drive, batch.turnId, call.sourceIndex, call.resultEntryId);\n\tlet latestUpdateDelivery: Promise<void> = Promise.resolve();\n\tconst publishUpdate = (partial: AgentToolResult<unknown>): void => {\n\t\tlatestUpdateDelivery = lane.emitBatch(\n\t\t\t[\n\t\t\t\t{\n\t\t\t\t\ttype: \"tool_update\",\n\t\t\t\t\tlane: lane.name,\n\t\t\t\t\trunId: drive.operationId,\n\t\t\t\t\tturnId: batch.turnId,\n\t\t\t\t\ttoolCallId: cleared.toolCall.id,\n\t\t\t\t\ttoolName: cleared.toolCall.name,\n\t\t\t\t\tpartialResult: partial,\n\t\t\t\t\t...(recovery ? { recovery: true as const } : {}),\n\t\t\t\t},\n\t\t\t],\n\t\t\tdrive.context,\n\t\t);\n\t\tvoid latestUpdateDelivery.catch(() => {});\n\t};\n\n\tlet execution: Promise<ExecutedToolCall>;\n\ttry {\n\t\texecution = executeToolCall(\n\t\t\tcleared,\n\t\t\tdrive.gate,\n\t\t\t(partial, options) => {\n\t\t\t\tpublishUpdate(partial);\n\t\t\t\tif (options?.checkpoint === true) progress.write(partial);\n\t\t\t},\n\t\t\ttoolContext,\n\t\t\tcapability.invocation,\n\t\t\tdrive.context,\n\t\t);\n\t} catch (error) {\n\t\tcapability.expire();\n\t\tprogress.seal();\n\t\tawait progress.drain();\n\t\tif (!(error instanceof AbortRequested)) throw error;\n\t\tawait error.cancellation;\n\t\treturn recovery ? interruptedOutcome(cleared.toolCall, undefined) : abortedOutcome(cleared.toolCall);\n\t}\n\n\tconst executed = await execution.finally(() => {\n\t\tcapability.expire();\n\t\tprogress.seal();\n\t});\n\tawait latestUpdateDelivery;\n\tawait progress.drain();\n\n\tlet patch: Awaited<ReturnType<typeof lane.hooks.runToolWithGate<\"after_tool\">>>;\n\ttry {\n\t\tpatch = await lane.hooks.runToolWithGate(\n\t\t\t\"after_tool\",\n\t\t\t{\n\t\t\t\tlane: lane.name,\n\t\t\t\trunId: drive.operationId,\n\t\t\t\ttoolCallId: cleared.toolCall.id,\n\t\t\t\ttoolName: cleared.toolCall.name,\n\t\t\t\targs: cleared.args,\n\t\t\t\tcontent: executed.result.content,\n\t\t\t\t...(executed.result.details === undefined ? {} : { details: executed.result.details as JsonValue }),\n\t\t\t\tisError: executed.isError,\n\t\t\t\t...(executed.result.usage === undefined ? {} : { usage: executed.result.usage }),\n\t\t\t},\n\t\t\tdrive.gate,\n\t\t\tdrive.context,\n\t\t);\n\t} catch (error) {\n\t\tif (!(error instanceof AbortRequested)) throw error;\n\t\tpatch = undefined;\n\t}\n\tconst finalized = finalizeToolCall(cleared, executed, patch);\n\treturn { toolCall: finalized.toolCall, message: createToolResultMessage(finalized), terminate: finalized.terminate };\n}\n\nasync function prepareToolInvocation<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n\tdrive: Drive,\n\tsources: ToolBatchSource,\n\tcall: Extract<ToolCall, { status: \"planned\" }>,\n\ttools: AgentHarnessTool<TContext>[],\n): Promise<PreparedToolInvocation<TContext>> {\n\tconst toolCall = toolCallFor(sources, call);\n\tif (sources.assistant.stopReason === \"length\") {\n\t\treturn { kind: \"outcome\", outcome: truncatedOutcome(toolCall) };\n\t}\n\tconst prepared = prepareToolCall(toolCall, tools);\n\tif (\"kind\" in prepared) return { kind: \"outcome\", outcome: outcomeFromFinalizedCall(prepared) };\n\n\tlet decision: Awaited<ReturnType<typeof lane.hooks.runToolWithGate<\"before_tool\">>>;\n\ttry {\n\t\tdecision = await lane.hooks.runToolWithGate(\n\t\t\t\"before_tool\",\n\t\t\t{\n\t\t\t\tlane: lane.name,\n\t\t\t\trunId: drive.operationId,\n\t\t\t\ttoolCallId: toolCall.id,\n\t\t\t\ttoolName: toolCall.name,\n\t\t\t\targs: prepared.args,\n\t\t\t},\n\t\t\tdrive.gate,\n\t\t\tdrive.context,\n\t\t);\n\t} catch (error) {\n\t\tif (!(error instanceof AbortRequested)) throw error;\n\t\tawait error.cancellation;\n\t\treturn { kind: \"outcome\", outcome: abortedOutcome(toolCall) };\n\t}\n\tconst cleared = applyBeforeToolDecision(prepared, decision);\n\treturn \"kind\" in cleared\n\t\t? { kind: \"outcome\", outcome: outcomeFromFinalizedCall(cleared) }\n\t\t: { kind: \"ready\", cleared };\n}\n\nasync function startToolInvocation<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n\tdrive: Drive,\n\trun: ToolsOperation,\n\tsources: ToolBatchSource,\n\tcall: Extract<ToolCall, { status: \"planned\" }>,\n\ttools: AgentHarnessTool<TContext>[],\n\ttoolContext: TContext,\n\trecovery: boolean,\n): Promise<ToolCallTask> {\n\tconst prepared = await prepareToolInvocation(lane, drive, sources, call, tools);\n\tif (prepared.kind === \"outcome\") {\n\t\treturn { completion: publishToolOutcome(lane, drive, run, call, prepared.outcome, recovery) };\n\t}\n\tconst effectPending = await publishToolIntent(\n\t\tlane,\n\t\tdrive,\n\t\trun,\n\t\tcall,\n\t\tprepared.cleared.toolCall,\n\t\tprepared.cleared.args,\n\t\tprepared.cleared.tool.replay ?? \"never\",\n\t\trecovery,\n\t);\n\treturn {\n\t\tcompletion:\n\t\t\teffectPending.kind === \"cancel_requested\"\n\t\t\t\t? publishToolOutcome(lane, drive, run, call, abortedOutcome(prepared.cleared.toolCall), recovery)\n\t\t\t\t: performToolInvocation(\n\t\t\t\t\t\tlane,\n\t\t\t\t\t\tdrive,\n\t\t\t\t\t\trun.batch,\n\t\t\t\t\t\teffectPending.value,\n\t\t\t\t\t\tprepared.cleared,\n\t\t\t\t\t\ttoolContext,\n\t\t\t\t\t\trecovery,\n\t\t\t\t\t).then((outcome) => publishToolOutcome(lane, drive, run, effectPending.value, outcome, recovery)),\n\t};\n}\n\nasync function recoverToolInvocation<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n\tdrive: Drive,\n\trun: ToolsOperation,\n\tsources: ToolBatchSource,\n\tcall: Extract<ToolCall, { status: \"effect_pending\" }>,\n\ttoolsByName: Map<string, AgentHarnessTool<TContext>>,\n\ttoolContext: TContext,\n\tcancelled: boolean,\n): Promise<ToolCallTask> {\n\tconst toolCall = toolCallFor(sources, call);\n\tconst tool = toolsByName.get(toolCall.name);\n\tif (!cancelled && call.replay === \"safe\" && tool?.replay === \"safe\") {\n\t\tconst args = await clearReplayCheckpoint(lane, drive, run.batch, call, toolCall);\n\t\tconst cleared: ClearedToolCall<TContext> = { toolCall, tool, args };\n\t\treturn {\n\t\t\tcompletion: performToolInvocation(lane, drive, run.batch, call, cleared, toolContext, true).then((outcome) =>\n\t\t\t\tpublishToolOutcome(lane, drive, run, call, outcome, true),\n\t\t\t),\n\t\t};\n\t}\n\tconst checkpoint = await readCheckpoint(lane, drive, call);\n\treturn {\n\t\tcompletion: publishToolOutcome(lane, drive, run, call, interruptedOutcome(toolCall, checkpoint), true),\n\t};\n}\n\nasync function runSequential<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n\tdrive: Drive,\n\trun: ToolsOperation,\n\tsources: ToolBatchSource,\n\texecution:\n\t\t| {\n\t\t\t\ttools: AgentHarnessTool<TContext>[];\n\t\t\t\ttoolsByName: Map<string, AgentHarnessTool<TContext>>;\n\t\t\t\ttoolContext: TContext;\n\t\t }\n\t\t| undefined,\n\trecovery: boolean,\n): Promise<ProcedureResult> {\n\tconst { batch } = run;\n\tfor (let transition = 0; transition <= batch.calls.length * 2 + 1; transition += 1) {\n\t\tawait materializeReady(lane, drive, run, sources, recovery);\n\t\tconst current = currentBatch(lane);\n\t\tif (current === undefined) return { kind: \"continue\" };\n\t\tconst call = current.batch.calls.find((candidate) => candidate.status !== \"completed\");\n\t\tif (call === undefined) throw new SessionInvariantError(\"Tool batch remained open after every call completed\");\n\t\tif (call.status === \"outcome_ready\") throw new SessionInvariantError(\"Ready tool outcome was not materialized\");\n\n\t\tif (current.run.control.status === \"cancel_requested\") {\n\t\t\tconst toolCall = toolCallFor(sources, call);\n\t\t\tif (call.status === \"planned\") {\n\t\t\t\tawait publishToolOutcome(lane, drive, current.run, call, abortedOutcome(toolCall), recovery);\n\t\t\t} else {\n\t\t\t\tconst checkpoint = await readCheckpoint(lane, drive, call);\n\t\t\t\tawait publishToolOutcome(\n\t\t\t\t\tlane,\n\t\t\t\t\tdrive,\n\t\t\t\t\tcurrent.run,\n\t\t\t\t\tcall,\n\t\t\t\t\tinterruptedOutcome(toolCall, checkpoint),\n\t\t\t\t\trecovery,\n\t\t\t\t);\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (execution === undefined) throw new SessionInvariantError(\"Running tool batch is missing execution context\");\n\t\tconst started =\n\t\t\tcall.status === \"planned\"\n\t\t\t\t? await startToolInvocation(\n\t\t\t\t\t\tlane,\n\t\t\t\t\t\tdrive,\n\t\t\t\t\t\tcurrent.run,\n\t\t\t\t\t\tsources,\n\t\t\t\t\t\tcall,\n\t\t\t\t\t\texecution.tools,\n\t\t\t\t\t\texecution.toolContext,\n\t\t\t\t\t\trecovery,\n\t\t\t\t\t)\n\t\t\t\t: await recoverToolInvocation(\n\t\t\t\t\t\tlane,\n\t\t\t\t\t\tdrive,\n\t\t\t\t\t\tcurrent.run,\n\t\t\t\t\t\tsources,\n\t\t\t\t\t\tcall,\n\t\t\t\t\t\texecution.toolsByName,\n\t\t\t\t\t\texecution.toolContext,\n\t\t\t\t\t\tfalse,\n\t\t\t\t\t);\n\t\tawait started.completion;\n\t}\n\tthrow new SessionInvariantError(\"Sequential tool batch exceeded its bounded transition count\");\n}\n\nasync function runParallel<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n\tdrive: Drive,\n\trun: ToolsOperation,\n\tsources: ToolBatchSource,\n\ttools: AgentHarnessTool<TContext>[],\n\ttoolsByName: Map<string, AgentHarnessTool<TContext>>,\n\ttoolContext: TContext,\n\trecovery: boolean,\n): Promise<ProcedureResult> {\n\tconst { batch } = run;\n\tlet materialization = Promise.resolve();\n\tconst scheduleMaterialization = (): Promise<void> => {\n\t\tconst scheduled = materialization.then(() => materializeReady(lane, drive, run, sources, recovery));\n\t\tmaterialization = scheduled.catch(() => {});\n\t\treturn scheduled;\n\t};\n\tconst jobs: Promise<void>[] = [];\n\tfor (const call of batch.calls) {\n\t\tif (call.status === \"completed\" || call.status === \"outcome_ready\") continue;\n\t\tconst started =\n\t\t\tcall.status === \"planned\"\n\t\t\t\t? await startToolInvocation(lane, drive, run, sources, call, tools, toolContext, recovery)\n\t\t\t\t: await recoverToolInvocation(\n\t\t\t\t\t\tlane,\n\t\t\t\t\t\tdrive,\n\t\t\t\t\t\trun,\n\t\t\t\t\t\tsources,\n\t\t\t\t\t\tcall,\n\t\t\t\t\t\ttoolsByName,\n\t\t\t\t\t\ttoolContext,\n\t\t\t\t\t\tlane.state.operation!.state.control.status === \"cancel_requested\",\n\t\t\t\t\t);\n\t\tconst job = started.completion.then(async () => {\n\t\t\tawait scheduleMaterialization();\n\t\t});\n\t\tvoid job.catch(() => {});\n\t\tjobs.push(job);\n\t}\n\tawait Promise.all(jobs);\n\tawait scheduleMaterialization();\n\treturn { kind: \"continue\" };\n}\n\n/** Execute, recover, stage, and source-order one complete durable tool batch. */\nexport async function runTools<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n\tdrive: Drive,\n\trun: ToolsOperation,\n): Promise<ProcedureResult> {\n\tconst batch = run.batch;\n\tconst recovery = batch.calls.some((call) => call.status === \"effect_pending\" || call.status === \"outcome_ready\");\n\tif (recovery) {\n\t\tawait lane.emitBatch(\n\t\t\t[\n\t\t\t\t{\n\t\t\t\t\ttype: \"turn_start\",\n\t\t\t\t\tlane: lane.name,\n\t\t\t\t\trunId: drive.operationId,\n\t\t\t\t\tturnId: batch.turnId,\n\t\t\t\t\trecovery: true,\n\t\t\t\t},\n\t\t\t],\n\t\t\tdrive.context,\n\t\t);\n\t}\n\tconst sources = await readToolBatchSource(lane, drive, batch);\n\tawait materializeReady(lane, drive, run, sources, recovery);\n\tconst current = currentBatch(lane);\n\tif (current === undefined) return { kind: \"continue\" };\n\tif (current.run.control.status === \"cancel_requested\") {\n\t\treturn runSequential(lane, drive, current.run, sources, undefined, recovery);\n\t}\n\tconst config = lane.readConfig();\n\tconst active = new Set(batch.configuration.activeToolNames);\n\tconst tools = config.tools.filter((tool) => active.has(tool.name));\n\tconst toolsByName = new Map(tools.map((tool) => [tool.name, tool]));\n\tconst toolContext = await resolveToolContext(lane, drive);\n\treturn run.settings.toolExecution === \"sequential\"\n\t\t? runSequential(lane, drive, current.run, sources, { tools, toolsByName, toolContext }, recovery)\n\t\t: runParallel(lane, drive, current.run, sources, tools, toolsByName, toolContext, recovery);\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../../../src/harness/runtime/drive/tools.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ToolResultMessage } from \"@earendil-works/pi-ai\";\nimport type { AgentToolCall, AgentToolResult } from \"../../../types.ts\";\nimport { AbortRequested } from \"../../execution/effect-gate.ts\";\nimport {\n\tapplyBeforeToolDecision,\n\ttype ClearedToolCall,\n\tcreateToolResultMessage,\n\ttype ExecutedToolCall,\n\texecuteToolCall,\n\ttype FinalizedToolCall,\n\tfinalizeToolCall,\n\tprepareToolCall,\n\ttoolResultFromMessage,\n} from \"../../execution/tools.ts\";\nimport { SessionInvariantError } from \"../../session/session.ts\";\nimport type { JsonValue, ToolBatch, ToolCall, ToolsOperation } from \"../../session/types.ts\";\nimport {\n\tdeleteValue,\n\toperationToolArgs,\n\toperationToolMemo,\n\toperationToolMemoPrefix,\n\tpendingEntry,\n\tpendingToolOutput,\n\tsetValue,\n} from \"../../session/values.ts\";\nimport type { AgentHarnessTool, AgentHarnessToolInvocation } from \"../../types.ts\";\nimport type { Lane } from \"../lane.ts\";\nimport { openToolProgress } from \"../progress.ts\";\nimport type { ContinueOperationResult, Drive, LaneState, ProcedureResult } from \"../types.ts\";\nimport {\n\tmaterializeReady,\n\treadToolBatchSource,\n\ttype ToolBatchSource,\n\ttoolCallFor,\n\twithToolBatch,\n} from \"./tool-placement.ts\";\n\ntype ToolCallTask = { completion: Promise<void> };\ntype ToolOutcome = { toolCall: AgentToolCall; message: ToolResultMessage<unknown>; terminate: boolean };\ntype PreparedToolInvocation<TContext extends object | undefined> =\n\t| { kind: \"ready\"; cleared: ClearedToolCall<TContext> }\n\t| { kind: \"outcome\"; outcome: ToolOutcome };\n\nconst INTERRUPTION_MARKER =\n\t\"[Tool execution was interrupted. The preceding output is the latest durable progress snapshot; newer live output may be missing, and the external outcome is unknown.]\";\n\nclass ToolInvocationEnded extends Error {\n\tconstructor() {\n\t\tsuper(\"Tool invocation no longer owns its durable effect\");\n\t\tthis.name = \"ToolInvocationEnded\";\n\t}\n}\n\nfunction currentBatch<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n): { run: ToolsOperation; batch: ToolBatch } | undefined {\n\tconst operation = lane.state.operation;\n\tif (operation?.state.at !== \"tools\") return undefined;\n\treturn { run: operation.state, batch: operation.state.batch };\n}\n\nfunction findCall(batch: ToolBatch, sourceIndex: number, resultEntryId: string): ToolCall | undefined {\n\treturn batch.calls.find((call) => call.sourceIndex === sourceIndex && call.resultEntryId === resultEntryId);\n}\n\nfunction replaceCall(batch: ToolBatch, replacement: ToolCall): ToolBatch {\n\treturn {\n\t\t...batch,\n\t\tcalls: batch.calls.map((call) =>\n\t\t\tcall.sourceIndex === replacement.sourceIndex && call.resultEntryId === replacement.resultEntryId\n\t\t\t\t? replacement\n\t\t\t\t: call,\n\t\t),\n\t};\n}\n\nfunction validateMemoName(name: string): void {\n\tif (name.length === 0) throw new TypeError(\"Tool invocation memo name must not be empty\");\n\tif (name.includes(\":\")) throw new TypeError(\"Tool invocation memo name must not contain ':'\");\n}\n\nfunction invocationCapability<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n\tdrive: Drive,\n\tbatch: ToolBatch,\n\tcall: Extract<ToolCall, { status: \"effect_pending\" }>,\n): { invocation: AgentHarnessToolInvocation; expire(): void } {\n\tlet active = true;\n\tconst ownsEffect = (state: LaneState): boolean => {\n\t\tconst operation = state.operation;\n\t\tif (operation?.state.at !== \"tools\") return false;\n\t\treturn findCall(operation.state.batch, call.sourceIndex, call.resultEntryId)?.status === \"effect_pending\";\n\t};\n\tconst ended = (): ToolInvocationEnded => new ToolInvocationEnded();\n\treturn {\n\t\tinvocation: {\n\t\t\tinvocationId: call.resultEntryId,\n\t\t\toperationId: drive.operationId,\n\t\t\tturnId: batch.turnId,\n\t\t\tgetMemo(name) {\n\t\t\t\tvalidateMemoName(name);\n\t\t\t\tif (!active) return Promise.reject(ended());\n\t\t\t\treturn lane.command<JsonValue | undefined>(async (state, reader) => {\n\t\t\t\t\tif (!ownsEffect(state)) return { kind: \"reject\", error: ended() };\n\t\t\t\t\tconst stored = await reader.getValue(\n\t\t\t\t\t\toperationToolMemo(drive.operationId, call.resultEntryId, name),\n\t\t\t\t\t\tdrive.context,\n\t\t\t\t\t);\n\t\t\t\t\treturn { kind: \"return\", result: stored?.value };\n\t\t\t\t}, drive.context);\n\t\t\t},\n\t\t\tsetMemo(name, value) {\n\t\t\t\tvalidateMemoName(name);\n\t\t\t\tif (!active) return Promise.reject(ended());\n\t\t\t\treturn lane.command<void>((state) => {\n\t\t\t\t\tif (!ownsEffect(state)) return { kind: \"reject\", error: ended() };\n\t\t\t\t\tconst address = operationToolMemo(drive.operationId, call.resultEntryId, name);\n\t\t\t\t\treturn {\n\t\t\t\t\t\tkind: \"commit\",\n\t\t\t\t\t\twrites: [value === undefined ? deleteValue(address) : setValue(address, value)],\n\t\t\t\t\t\tnext: state,\n\t\t\t\t\t\tmaterialize: () => undefined,\n\t\t\t\t\t};\n\t\t\t\t}, drive.context);\n\t\t\t},\n\t\t},\n\t\texpire() {\n\t\t\tactive = false;\n\t\t},\n\t};\n}\n\nfunction syntheticMessage(\n\ttoolCall: AgentToolCall,\n\tcontent: AgentToolResult<unknown>[\"content\"],\n\toptions: { details?: unknown; usage?: AgentToolResult<unknown>[\"usage\"] } = {},\n): ToolResultMessage<unknown> {\n\treturn {\n\t\trole: \"toolResult\",\n\t\ttoolCallId: toolCall.id,\n\t\ttoolName: toolCall.name,\n\t\tcontent,\n\t\t...(options.details === undefined ? {} : { details: options.details }),\n\t\t...(options.usage === undefined ? {} : { usage: options.usage }),\n\t\tisError: true,\n\t\ttimestamp: Date.now(),\n\t};\n}\n\nfunction abortedOutcome(toolCall: AgentToolCall): ToolOutcome {\n\treturn {\n\t\ttoolCall,\n\t\tmessage: syntheticMessage(toolCall, [{ type: \"text\", text: \"Tool execution was cancelled before completion.\" }]),\n\t\tterminate: false,\n\t};\n}\n\nfunction interruptedOutcome(toolCall: AgentToolCall, checkpoint: AgentToolResult<unknown> | undefined): ToolOutcome {\n\treturn {\n\t\ttoolCall,\n\t\tmessage: syntheticMessage(\n\t\t\ttoolCall,\n\t\t\t[...(checkpoint?.content ?? []), { type: \"text\", text: INTERRUPTION_MARKER }],\n\t\t\tcheckpoint === undefined ? {} : { details: checkpoint.details, usage: checkpoint.usage },\n\t\t),\n\t\tterminate: false,\n\t};\n}\n\nfunction truncatedOutcome(toolCall: AgentToolCall): ToolOutcome {\n\treturn {\n\t\ttoolCall,\n\t\tmessage: syntheticMessage(toolCall, [\n\t\t\t{\n\t\t\t\ttype: \"text\",\n\t\t\t\ttext: `Tool call ${JSON.stringify(toolCall.name)} was not executed because the assistant response hit the output token limit, so its arguments may be truncated. Re-issue the tool call with complete arguments.`,\n\t\t\t},\n\t\t]),\n\t\tterminate: false,\n\t};\n}\n\nfunction outcomeFromFinalizedCall(finalized: FinalizedToolCall): ToolOutcome {\n\treturn { toolCall: finalized.toolCall, message: createToolResultMessage(finalized), terminate: finalized.terminate };\n}\n\nasync function publishToolIntent<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n\tdrive: Drive,\n\trun: ToolsOperation,\n\tplanned: Extract<ToolCall, { status: \"planned\" }>,\n\ttoolCall: AgentToolCall,\n\targs: Record<string, JsonValue>,\n\treplay: \"never\" | \"safe\",\n\trecovery: boolean,\n): Promise<ContinueOperationResult<Extract<ToolCall, { status: \"effect_pending\" }>>> {\n\treturn lane.continueOperation(\n\t\trun,\n\t\t(_state, run) => {\n\t\t\tconst effectPending: Extract<ToolCall, { status: \"effect_pending\" }> = {\n\t\t\t\tstatus: \"effect_pending\",\n\t\t\t\tsourceIndex: planned.sourceIndex,\n\t\t\t\tresultEntryId: planned.resultEntryId,\n\t\t\t\treplay,\n\t\t\t};\n\t\t\treturn {\n\t\t\t\tkind: \"commit\",\n\t\t\t\twrites: [setValue(operationToolArgs(drive.operationId, run.batch.turnId, planned.sourceIndex), args)],\n\t\t\t\toperationState: withToolBatch(run, replaceCall(run.batch, effectPending)),\n\t\t\t\tmaterialize: () => effectPending,\n\t\t\t\tevents: () => [\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: \"tool_start\",\n\t\t\t\t\t\tlane: lane.name,\n\t\t\t\t\t\trunId: drive.operationId,\n\t\t\t\t\t\tturnId: run.batch.turnId,\n\t\t\t\t\t\ttoolCallId: toolCall.id,\n\t\t\t\t\t\ttoolName: toolCall.name,\n\t\t\t\t\t\targs,\n\t\t\t\t\t\t...(recovery ? { recovery: true as const } : {}),\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t};\n\t\t},\n\t\tdrive.context,\n\t);\n}\n\nasync function publishToolOutcome<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n\tdrive: Drive,\n\tcapability: ToolsOperation,\n\tcall: Extract<ToolCall, { status: \"planned\" | \"effect_pending\" }>,\n\tfinalized: ToolOutcome,\n\trecovery: boolean,\n): Promise<void> {\n\tawait lane.settleOperation(\n\t\tcapability,\n\t\tasync (_state, run, _meta, reader) => {\n\t\t\tconst { toolCall } = finalized;\n\t\t\tconst memos = await reader.scanValues(\n\t\t\t\toperationToolMemoPrefix(drive.operationId, call.resultEntryId),\n\t\t\t\tdrive.context,\n\t\t\t);\n\t\t\tconst durableTerminate = run.control.status === \"running\" && finalized.terminate;\n\t\t\tconst outcome: Extract<ToolCall, { status: \"outcome_ready\" }> = {\n\t\t\t\tstatus: \"outcome_ready\",\n\t\t\t\tsourceIndex: call.sourceIndex,\n\t\t\t\tresultEntryId: call.resultEntryId,\n\t\t\t\tterminate: durableTerminate,\n\t\t\t};\n\t\t\treturn {\n\t\t\t\tkind: \"commit\",\n\t\t\t\twrites: [\n\t\t\t\t\tsetValue(pendingEntry(call.resultEntryId), { type: \"message\", payload: finalized.message }),\n\t\t\t\t\tdeleteValue(pendingToolOutput(drive.operationId, call.resultEntryId)),\n\t\t\t\t\t...memos.map(({ address }) => deleteValue(address)),\n\t\t\t\t],\n\t\t\t\toperationState: withToolBatch(run, replaceCall(run.batch, outcome)),\n\t\t\t\tmaterialize: () => undefined,\n\t\t\t\tevents: () => [\n\t\t\t\t\t...(call.status === \"planned\"\n\t\t\t\t\t\t? [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\ttype: \"tool_start\" as const,\n\t\t\t\t\t\t\t\t\tlane: lane.name,\n\t\t\t\t\t\t\t\t\trunId: drive.operationId,\n\t\t\t\t\t\t\t\t\tturnId: run.batch.turnId,\n\t\t\t\t\t\t\t\t\ttoolCallId: toolCall.id,\n\t\t\t\t\t\t\t\t\ttoolName: toolCall.name,\n\t\t\t\t\t\t\t\t\targs: toolCall.arguments,\n\t\t\t\t\t\t\t\t\t...(recovery ? { recovery: true as const } : {}),\n\t\t\t\t\t\t\t\t},\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\t\ttype: \"tool_end\",\n\t\t\t\t\t\tlane: lane.name,\n\t\t\t\t\t\trunId: drive.operationId,\n\t\t\t\t\t\tturnId: run.batch.turnId,\n\t\t\t\t\t\ttoolCallId: toolCall.id,\n\t\t\t\t\t\ttoolName: toolCall.name,\n\t\t\t\t\t\tresult: toolResultFromMessage(finalized.message, durableTerminate),\n\t\t\t\t\t\tisError: finalized.message.isError,\n\t\t\t\t\t\tterminate: durableTerminate,\n\t\t\t\t\t\t...(recovery ? { recovery: true as const } : {}),\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t};\n\t\t},\n\t\tdrive.context,\n\t);\n}\n\nasync function clearReplayCheckpoint<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n\tdrive: Drive,\n\tbatch: ToolBatch,\n\tcall: Extract<ToolCall, { status: \"effect_pending\" }>,\n\ttoolCall: AgentToolCall,\n): Promise<Record<string, JsonValue>> {\n\treturn lane.command(async (state, reader) => {\n\t\tconst stored = await reader.getValue(\n\t\t\toperationToolArgs(drive.operationId, batch.turnId, call.sourceIndex),\n\t\t\tdrive.context,\n\t\t);\n\t\tif (stored === undefined) {\n\t\t\tthrow new SessionInvariantError(`Tool call ${call.resultEntryId} is missing persisted arguments`);\n\t\t}\n\t\treturn {\n\t\t\tkind: \"commit\",\n\t\t\twrites: [deleteValue(pendingToolOutput(drive.operationId, call.resultEntryId))],\n\t\t\tnext: state,\n\t\t\tmaterialize: () => stored.value,\n\t\t\tevents: () => [\n\t\t\t\t{\n\t\t\t\t\ttype: \"tool_start\",\n\t\t\t\t\tlane: lane.name,\n\t\t\t\t\trunId: drive.operationId,\n\t\t\t\t\tturnId: batch.turnId,\n\t\t\t\t\ttoolCallId: toolCall.id,\n\t\t\t\t\ttoolName: toolCall.name,\n\t\t\t\t\targs: stored.value,\n\t\t\t\t\trecovery: true,\n\t\t\t\t},\n\t\t\t],\n\t\t};\n\t}, drive.context);\n}\n\nfunction readCheckpoint<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n\tdrive: Drive,\n\tcall: Extract<ToolCall, { status: \"effect_pending\" }>,\n): Promise<AgentToolResult<unknown> | undefined> {\n\treturn lane.command(async (_state, reader) => {\n\t\tconst stored = await reader.getValue(pendingToolOutput(drive.operationId, call.resultEntryId), drive.context);\n\t\treturn { kind: \"return\", result: stored?.value };\n\t}, drive.context);\n}\n\nasync function resolveToolContext<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n\tdrive: Drive,\n): Promise<TContext> {\n\tconst source = lane.readConfig().toolContext;\n\treturn (typeof source === \"function\" ? await source(drive.context) : source) as TContext;\n}\n\nasync function performToolInvocation<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n\tdrive: Drive,\n\tbatch: ToolBatch,\n\tcall: Extract<ToolCall, { status: \"effect_pending\" }>,\n\tcleared: ClearedToolCall<TContext>,\n\ttoolContext: TContext,\n\trecovery: boolean,\n): Promise<ToolOutcome> {\n\tconst capability = invocationCapability(lane, drive, batch, call);\n\tconst progress = openToolProgress(lane, drive, batch.turnId, call.sourceIndex, call.resultEntryId);\n\tlet latestUpdateDelivery: Promise<void> = Promise.resolve();\n\tconst publishUpdate = (partial: AgentToolResult<unknown>): void => {\n\t\tlatestUpdateDelivery = lane.emitBatch(\n\t\t\t[\n\t\t\t\t{\n\t\t\t\t\ttype: \"tool_update\",\n\t\t\t\t\tlane: lane.name,\n\t\t\t\t\trunId: drive.operationId,\n\t\t\t\t\tturnId: batch.turnId,\n\t\t\t\t\ttoolCallId: cleared.toolCall.id,\n\t\t\t\t\ttoolName: cleared.toolCall.name,\n\t\t\t\t\tpartialResult: partial,\n\t\t\t\t\t...(recovery ? { recovery: true as const } : {}),\n\t\t\t\t},\n\t\t\t],\n\t\t\tdrive.context,\n\t\t);\n\t\tvoid latestUpdateDelivery.catch(() => {});\n\t};\n\n\tlet execution: Promise<ExecutedToolCall>;\n\ttry {\n\t\texecution = executeToolCall(\n\t\t\tcleared,\n\t\t\tdrive.gate,\n\t\t\t(partial, options) => {\n\t\t\t\tpublishUpdate(partial);\n\t\t\t\tif (options?.checkpoint === true) progress.write(partial);\n\t\t\t},\n\t\t\ttoolContext,\n\t\t\tcapability.invocation,\n\t\t\tdrive.context,\n\t\t);\n\t} catch (error) {\n\t\tcapability.expire();\n\t\tprogress.seal();\n\t\tawait progress.drain();\n\t\tif (!(error instanceof AbortRequested)) throw error;\n\t\tawait error.cancellation;\n\t\treturn recovery ? interruptedOutcome(cleared.toolCall, undefined) : abortedOutcome(cleared.toolCall);\n\t}\n\n\tconst executed = await execution.finally(() => {\n\t\tcapability.expire();\n\t\tprogress.seal();\n\t});\n\tawait latestUpdateDelivery;\n\tawait progress.drain();\n\n\tlet patch: Awaited<ReturnType<typeof lane.hooks.runToolWithGate<\"after_tool\">>>;\n\ttry {\n\t\tpatch = await lane.hooks.runToolWithGate(\n\t\t\t\"after_tool\",\n\t\t\t{\n\t\t\t\tlane: lane.name,\n\t\t\t\trunId: drive.operationId,\n\t\t\t\ttoolCallId: cleared.toolCall.id,\n\t\t\t\ttoolName: cleared.toolCall.name,\n\t\t\t\targs: cleared.args,\n\t\t\t\tcontent: executed.result.content,\n\t\t\t\t...(executed.result.details === undefined ? {} : { details: executed.result.details as JsonValue }),\n\t\t\t\tisError: executed.isError,\n\t\t\t\t...(executed.result.usage === undefined ? {} : { usage: executed.result.usage }),\n\t\t\t},\n\t\t\tdrive.gate,\n\t\t\tdrive.context,\n\t\t);\n\t} catch (error) {\n\t\tif (!(error instanceof AbortRequested)) throw error;\n\t\tpatch = undefined;\n\t}\n\tconst finalized = finalizeToolCall(cleared, executed, patch);\n\treturn { toolCall: finalized.toolCall, message: createToolResultMessage(finalized), terminate: finalized.terminate };\n}\n\nasync function prepareToolInvocation<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n\tdrive: Drive,\n\tsources: ToolBatchSource,\n\tcall: Extract<ToolCall, { status: \"planned\" }>,\n\ttools: AgentHarnessTool<TContext>[],\n): Promise<PreparedToolInvocation<TContext>> {\n\tconst toolCall = toolCallFor(sources, call);\n\tif (sources.assistant.stopReason === \"length\") {\n\t\treturn { kind: \"outcome\", outcome: truncatedOutcome(toolCall) };\n\t}\n\tconst prepared = prepareToolCall(toolCall, tools);\n\tif (\"kind\" in prepared) return { kind: \"outcome\", outcome: outcomeFromFinalizedCall(prepared) };\n\n\tlet decision: Awaited<ReturnType<typeof lane.hooks.runToolWithGate<\"before_tool\">>>;\n\ttry {\n\t\tdecision = await lane.hooks.runToolWithGate(\n\t\t\t\"before_tool\",\n\t\t\t{\n\t\t\t\tlane: lane.name,\n\t\t\t\trunId: drive.operationId,\n\t\t\t\ttoolCallId: toolCall.id,\n\t\t\t\ttoolName: toolCall.name,\n\t\t\t\targs: prepared.args,\n\t\t\t},\n\t\t\tdrive.gate,\n\t\t\tdrive.context,\n\t\t);\n\t} catch (error) {\n\t\tif (!(error instanceof AbortRequested)) throw error;\n\t\tawait error.cancellation;\n\t\treturn { kind: \"outcome\", outcome: abortedOutcome(toolCall) };\n\t}\n\tconst cleared = applyBeforeToolDecision(prepared, decision);\n\treturn \"kind\" in cleared\n\t\t? { kind: \"outcome\", outcome: outcomeFromFinalizedCall(cleared) }\n\t\t: { kind: \"ready\", cleared };\n}\n\nasync function startToolInvocation<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n\tdrive: Drive,\n\trun: ToolsOperation,\n\tsources: ToolBatchSource,\n\tcall: Extract<ToolCall, { status: \"planned\" }>,\n\ttools: AgentHarnessTool<TContext>[],\n\ttoolContext: TContext,\n\trecovery: boolean,\n): Promise<ToolCallTask> {\n\tconst prepared = await prepareToolInvocation(lane, drive, sources, call, tools);\n\tif (prepared.kind === \"outcome\") {\n\t\treturn { completion: publishToolOutcome(lane, drive, run, call, prepared.outcome, recovery) };\n\t}\n\tconst effectPending = await publishToolIntent(\n\t\tlane,\n\t\tdrive,\n\t\trun,\n\t\tcall,\n\t\tprepared.cleared.toolCall,\n\t\tprepared.cleared.args,\n\t\tprepared.cleared.tool.replay ?? \"never\",\n\t\trecovery,\n\t);\n\treturn {\n\t\tcompletion:\n\t\t\teffectPending.kind === \"cancel_requested\"\n\t\t\t\t? publishToolOutcome(lane, drive, run, call, abortedOutcome(prepared.cleared.toolCall), recovery)\n\t\t\t\t: performToolInvocation(\n\t\t\t\t\t\tlane,\n\t\t\t\t\t\tdrive,\n\t\t\t\t\t\trun.batch,\n\t\t\t\t\t\teffectPending.value,\n\t\t\t\t\t\tprepared.cleared,\n\t\t\t\t\t\ttoolContext,\n\t\t\t\t\t\trecovery,\n\t\t\t\t\t).then((outcome) => publishToolOutcome(lane, drive, run, effectPending.value, outcome, recovery)),\n\t};\n}\n\nasync function recoverToolInvocation<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n\tdrive: Drive,\n\trun: ToolsOperation,\n\tsources: ToolBatchSource,\n\tcall: Extract<ToolCall, { status: \"effect_pending\" }>,\n\ttoolsByName: Map<string, AgentHarnessTool<TContext>>,\n\ttoolContext: TContext,\n\tcancelled: boolean,\n): Promise<ToolCallTask> {\n\tconst toolCall = toolCallFor(sources, call);\n\tconst tool = toolsByName.get(toolCall.name);\n\tif (!cancelled && call.replay === \"safe\" && tool?.replay === \"safe\") {\n\t\tconst args = await clearReplayCheckpoint(lane, drive, run.batch, call, toolCall);\n\t\tconst cleared: ClearedToolCall<TContext> = { toolCall, tool, args };\n\t\treturn {\n\t\t\tcompletion: performToolInvocation(lane, drive, run.batch, call, cleared, toolContext, true).then((outcome) =>\n\t\t\t\tpublishToolOutcome(lane, drive, run, call, outcome, true),\n\t\t\t),\n\t\t};\n\t}\n\tconst checkpoint = await readCheckpoint(lane, drive, call);\n\treturn {\n\t\tcompletion: publishToolOutcome(lane, drive, run, call, interruptedOutcome(toolCall, checkpoint), true),\n\t};\n}\n\nasync function runSequential<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n\tdrive: Drive,\n\trun: ToolsOperation,\n\tsources: ToolBatchSource,\n\texecution:\n\t\t| {\n\t\t\t\ttools: AgentHarnessTool<TContext>[];\n\t\t\t\ttoolsByName: Map<string, AgentHarnessTool<TContext>>;\n\t\t\t\ttoolContext: TContext;\n\t\t }\n\t\t| undefined,\n\trecovery: boolean,\n): Promise<ProcedureResult> {\n\tconst { batch } = run;\n\tfor (let transition = 0; transition <= batch.calls.length * 2 + 1; transition += 1) {\n\t\tawait materializeReady(lane, drive, run, sources, recovery);\n\t\tconst current = currentBatch(lane);\n\t\tif (current === undefined) return { kind: \"continue\" };\n\t\tconst call = current.batch.calls.find((candidate) => candidate.status !== \"completed\");\n\t\tif (call === undefined) throw new SessionInvariantError(\"Tool batch remained open after every call completed\");\n\t\tif (call.status === \"outcome_ready\") throw new SessionInvariantError(\"Ready tool outcome was not materialized\");\n\n\t\tif (current.run.control.status === \"cancel_requested\") {\n\t\t\tconst toolCall = toolCallFor(sources, call);\n\t\t\tif (call.status === \"planned\") {\n\t\t\t\tawait publishToolOutcome(lane, drive, current.run, call, abortedOutcome(toolCall), recovery);\n\t\t\t} else {\n\t\t\t\tconst checkpoint = await readCheckpoint(lane, drive, call);\n\t\t\t\tawait publishToolOutcome(\n\t\t\t\t\tlane,\n\t\t\t\t\tdrive,\n\t\t\t\t\tcurrent.run,\n\t\t\t\t\tcall,\n\t\t\t\t\tinterruptedOutcome(toolCall, checkpoint),\n\t\t\t\t\trecovery,\n\t\t\t\t);\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (execution === undefined) throw new SessionInvariantError(\"Running tool batch is missing execution context\");\n\t\tconst started =\n\t\t\tcall.status === \"planned\"\n\t\t\t\t? await startToolInvocation(\n\t\t\t\t\t\tlane,\n\t\t\t\t\t\tdrive,\n\t\t\t\t\t\tcurrent.run,\n\t\t\t\t\t\tsources,\n\t\t\t\t\t\tcall,\n\t\t\t\t\t\texecution.tools,\n\t\t\t\t\t\texecution.toolContext,\n\t\t\t\t\t\trecovery,\n\t\t\t\t\t)\n\t\t\t\t: await recoverToolInvocation(\n\t\t\t\t\t\tlane,\n\t\t\t\t\t\tdrive,\n\t\t\t\t\t\tcurrent.run,\n\t\t\t\t\t\tsources,\n\t\t\t\t\t\tcall,\n\t\t\t\t\t\texecution.toolsByName,\n\t\t\t\t\t\texecution.toolContext,\n\t\t\t\t\t\tfalse,\n\t\t\t\t\t);\n\t\tawait started.completion;\n\t}\n\tthrow new SessionInvariantError(\"Sequential tool batch exceeded its bounded transition count\");\n}\n\nasync function runParallel<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n\tdrive: Drive,\n\trun: ToolsOperation,\n\tsources: ToolBatchSource,\n\ttools: AgentHarnessTool<TContext>[],\n\ttoolsByName: Map<string, AgentHarnessTool<TContext>>,\n\ttoolContext: TContext,\n\trecovery: boolean,\n): Promise<ProcedureResult> {\n\tconst { batch } = run;\n\tlet materialization = Promise.resolve();\n\tconst scheduleMaterialization = (): Promise<void> => {\n\t\tconst scheduled = materialization.then(() => materializeReady(lane, drive, run, sources, recovery));\n\t\tmaterialization = scheduled.catch(() => {});\n\t\treturn scheduled;\n\t};\n\tconst jobs: Promise<void>[] = [];\n\tfor (const call of batch.calls) {\n\t\tif (call.status === \"completed\" || call.status === \"outcome_ready\") continue;\n\t\tconst started =\n\t\t\tcall.status === \"planned\"\n\t\t\t\t? await startToolInvocation(lane, drive, run, sources, call, tools, toolContext, recovery)\n\t\t\t\t: await recoverToolInvocation(\n\t\t\t\t\t\tlane,\n\t\t\t\t\t\tdrive,\n\t\t\t\t\t\trun,\n\t\t\t\t\t\tsources,\n\t\t\t\t\t\tcall,\n\t\t\t\t\t\ttoolsByName,\n\t\t\t\t\t\ttoolContext,\n\t\t\t\t\t\tlane.state.operation!.state.control.status === \"cancel_requested\",\n\t\t\t\t\t);\n\t\tconst job = started.completion.then(async () => {\n\t\t\tawait scheduleMaterialization();\n\t\t});\n\t\tvoid job.catch(() => {});\n\t\tjobs.push(job);\n\t}\n\tawait Promise.all(jobs);\n\tawait scheduleMaterialization();\n\treturn { kind: \"continue\" };\n}\n\n/** Execute, recover, stage, and source-order one complete durable tool batch. */\nexport async function runTools<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n\tdrive: Drive,\n\trun: ToolsOperation,\n): Promise<ProcedureResult> {\n\tconst batch = run.batch;\n\tconst recovery = batch.calls.some((call) => call.status === \"effect_pending\" || call.status === \"outcome_ready\");\n\tif (recovery) {\n\t\tawait lane.emitBatch(\n\t\t\t[\n\t\t\t\t{\n\t\t\t\t\ttype: \"turn_start\",\n\t\t\t\t\tlane: lane.name,\n\t\t\t\t\trunId: drive.operationId,\n\t\t\t\t\tturnId: batch.turnId,\n\t\t\t\t\trecovery: true,\n\t\t\t\t},\n\t\t\t],\n\t\t\tdrive.context,\n\t\t);\n\t}\n\tconst sources = await readToolBatchSource(lane, drive, batch);\n\tawait materializeReady(lane, drive, run, sources, recovery);\n\tconst current = currentBatch(lane);\n\tif (current === undefined) return { kind: \"continue\" };\n\tif (current.run.control.status === \"cancel_requested\") {\n\t\treturn runSequential(lane, drive, current.run, sources, undefined, recovery);\n\t}\n\tconst config = lane.readConfig();\n\tconst active = new Set(batch.configuration.activeToolNames);\n\tconst tools = config.tools.filter((tool) => active.has(tool.name));\n\tconst toolsByName = new Map(tools.map((tool) => [tool.name, tool]));\n\tconst toolContext = await resolveToolContext(lane, drive);\n\treturn run.settings.toolExecution === \"sequential\"\n\t\t? runSequential(lane, drive, current.run, sources, { tools, toolsByName, toolContext }, recovery)\n\t\t: runParallel(lane, drive, current.run, sources, tools, toolsByName, toolContext, recovery);\n}\n"]}
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../../../src/harness/runtime/drive/tools.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ToolResultMessage } from \"@earendil-works/pi-ai\";\nimport type { AgentToolCall, AgentToolResult } from \"../../../types.ts\";\nimport { AbortRequested } from \"../../execution/effect-gate.ts\";\nimport {\n\tapplyBeforeToolDecision,\n\ttype ClearedToolCall,\n\tcreateToolResultMessage,\n\ttype ExecutedToolCall,\n\texecuteToolCall,\n\ttype FinalizedToolCall,\n\tfinalizeToolCall,\n\tprepareToolCall,\n\ttoolResultFromMessage,\n} from \"../../execution/tools.ts\";\nimport { SessionInvariantError } from \"../../session/session.ts\";\nimport type { JsonValue, ToolBatch, ToolCall, ToolsOperation } from \"../../session/types.ts\";\nimport {\n\tdeleteValue,\n\toperationToolArgs,\n\toperationToolMemo,\n\toperationToolMemoPrefix,\n\tpendingEntry,\n\tpendingToolOutput,\n\tsetValue,\n} from \"../../session/values.ts\";\nimport type { AgentHarnessTool, AgentHarnessToolInvocation } from \"../../types.ts\";\nimport type { Lane } from \"../lane.ts\";\nimport { openToolProgress } from \"../progress.ts\";\nimport type { ContinueOperationResult, Drive, LaneState, ProcedureResult } from \"../types.ts\";\nimport {\n\tmaterializeReady,\n\treadToolBatchSource,\n\ttype ToolBatchSource,\n\ttoolCallFor,\n\twithToolBatch,\n} from \"./tool-placement.ts\";\n\ntype ToolCallTask = { completion: Promise<void> };\ntype ToolOutcome = { toolCall: AgentToolCall; message: ToolResultMessage; terminate: boolean };\ntype PreparedToolInvocation<TContext extends object | undefined> =\n\t| { kind: \"ready\"; cleared: ClearedToolCall<TContext> }\n\t| { kind: \"outcome\"; outcome: ToolOutcome };\n\nconst INTERRUPTION_MARKER =\n\t\"[Tool execution was interrupted. The preceding output is the latest durable progress snapshot; newer live output may be missing, and the external outcome is unknown.]\";\n\nclass ToolInvocationEnded extends Error {\n\tconstructor() {\n\t\tsuper(\"Tool invocation no longer owns its durable effect\");\n\t\tthis.name = \"ToolInvocationEnded\";\n\t}\n}\n\nfunction currentBatch<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n): { run: ToolsOperation; batch: ToolBatch } | undefined {\n\tconst operation = lane.state.operation;\n\tif (operation?.state.at !== \"tools\") return undefined;\n\treturn { run: operation.state, batch: operation.state.batch };\n}\n\nfunction findCall(batch: ToolBatch, sourceIndex: number, resultEntryId: string): ToolCall | undefined {\n\treturn batch.calls.find((call) => call.sourceIndex === sourceIndex && call.resultEntryId === resultEntryId);\n}\n\nfunction replaceCall(batch: ToolBatch, replacement: ToolCall): ToolBatch {\n\treturn {\n\t\t...batch,\n\t\tcalls: batch.calls.map((call) =>\n\t\t\tcall.sourceIndex === replacement.sourceIndex && call.resultEntryId === replacement.resultEntryId\n\t\t\t\t? replacement\n\t\t\t\t: call,\n\t\t),\n\t};\n}\n\nfunction validateMemoName(name: string): void {\n\tif (name.length === 0) throw new TypeError(\"Tool invocation memo name must not be empty\");\n\tif (name.includes(\":\")) throw new TypeError(\"Tool invocation memo name must not contain ':'\");\n}\n\nfunction invocationCapability<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n\tdrive: Drive,\n\tbatch: ToolBatch,\n\tcall: Extract<ToolCall, { status: \"effect_pending\" }>,\n): { invocation: AgentHarnessToolInvocation; expire(): void } {\n\tlet active = true;\n\tconst ownsEffect = (state: LaneState): boolean => {\n\t\tconst operation = state.operation;\n\t\tif (operation?.state.at !== \"tools\") return false;\n\t\treturn findCall(operation.state.batch, call.sourceIndex, call.resultEntryId)?.status === \"effect_pending\";\n\t};\n\tconst ended = (): ToolInvocationEnded => new ToolInvocationEnded();\n\treturn {\n\t\tinvocation: {\n\t\t\tinvocationId: call.resultEntryId,\n\t\t\toperationId: drive.operationId,\n\t\t\tturnId: batch.turnId,\n\t\t\tgetMemo(name) {\n\t\t\t\tvalidateMemoName(name);\n\t\t\t\tif (!active) return Promise.reject(ended());\n\t\t\t\treturn lane.command<JsonValue | undefined>(async (state, reader) => {\n\t\t\t\t\tif (!ownsEffect(state)) return { kind: \"reject\", error: ended() };\n\t\t\t\t\tconst stored = await reader.getValue(\n\t\t\t\t\t\toperationToolMemo(drive.operationId, call.resultEntryId, name),\n\t\t\t\t\t\tdrive.context,\n\t\t\t\t\t);\n\t\t\t\t\treturn { kind: \"return\", result: stored?.value };\n\t\t\t\t}, drive.context);\n\t\t\t},\n\t\t\tsetMemo(name, value) {\n\t\t\t\tvalidateMemoName(name);\n\t\t\t\tif (!active) return Promise.reject(ended());\n\t\t\t\treturn lane.command<void>((state) => {\n\t\t\t\t\tif (!ownsEffect(state)) return { kind: \"reject\", error: ended() };\n\t\t\t\t\tconst address = operationToolMemo(drive.operationId, call.resultEntryId, name);\n\t\t\t\t\treturn {\n\t\t\t\t\t\tkind: \"commit\",\n\t\t\t\t\t\twrites: [value === undefined ? deleteValue(address) : setValue(address, value)],\n\t\t\t\t\t\tnext: state,\n\t\t\t\t\t\tmaterialize: () => undefined,\n\t\t\t\t\t};\n\t\t\t\t}, drive.context);\n\t\t\t},\n\t\t},\n\t\texpire() {\n\t\t\tactive = false;\n\t\t},\n\t};\n}\n\nfunction syntheticMessage(\n\ttoolCall: AgentToolCall,\n\tcontent: AgentToolResult<unknown>[\"content\"],\n\toptions: { details?: unknown; usage?: AgentToolResult<unknown>[\"usage\"] } = {},\n): ToolResultMessage {\n\treturn {\n\t\trole: \"toolResult\",\n\t\ttoolCallId: toolCall.id,\n\t\ttoolName: toolCall.name,\n\t\tcontent,\n\t\t...(options.details === undefined ? {} : { details: options.details as JsonValue }),\n\t\t...(options.usage === undefined ? {} : { usage: options.usage }),\n\t\tisError: true,\n\t\ttimestamp: Date.now(),\n\t};\n}\n\nfunction abortedOutcome(toolCall: AgentToolCall): ToolOutcome {\n\treturn {\n\t\ttoolCall,\n\t\tmessage: syntheticMessage(toolCall, [{ type: \"text\", text: \"Tool execution was cancelled before completion.\" }]),\n\t\tterminate: false,\n\t};\n}\n\nfunction interruptedOutcome(toolCall: AgentToolCall, checkpoint: AgentToolResult<unknown> | undefined): ToolOutcome {\n\treturn {\n\t\ttoolCall,\n\t\tmessage: syntheticMessage(\n\t\t\ttoolCall,\n\t\t\t[...(checkpoint?.content ?? []), { type: \"text\", text: INTERRUPTION_MARKER }],\n\t\t\tcheckpoint === undefined ? {} : { details: checkpoint.details, usage: checkpoint.usage },\n\t\t),\n\t\tterminate: false,\n\t};\n}\n\nfunction truncatedOutcome(toolCall: AgentToolCall): ToolOutcome {\n\treturn {\n\t\ttoolCall,\n\t\tmessage: syntheticMessage(toolCall, [\n\t\t\t{\n\t\t\t\ttype: \"text\",\n\t\t\t\ttext: `Tool call ${JSON.stringify(toolCall.name)} was not executed because the assistant response hit the output token limit, so its arguments may be truncated. Re-issue the tool call with complete arguments.`,\n\t\t\t},\n\t\t]),\n\t\tterminate: false,\n\t};\n}\n\nfunction outcomeFromFinalizedCall(finalized: FinalizedToolCall): ToolOutcome {\n\treturn { toolCall: finalized.toolCall, message: createToolResultMessage(finalized), terminate: finalized.terminate };\n}\n\nasync function publishToolIntent<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n\tdrive: Drive,\n\trun: ToolsOperation,\n\tplanned: Extract<ToolCall, { status: \"planned\" }>,\n\ttoolCall: AgentToolCall,\n\targs: Record<string, JsonValue>,\n\treplay: \"never\" | \"safe\",\n\trecovery: boolean,\n): Promise<ContinueOperationResult<Extract<ToolCall, { status: \"effect_pending\" }>>> {\n\treturn lane.continueOperation(\n\t\trun,\n\t\t(_state, run) => {\n\t\t\tconst effectPending: Extract<ToolCall, { status: \"effect_pending\" }> = {\n\t\t\t\tstatus: \"effect_pending\",\n\t\t\t\tsourceIndex: planned.sourceIndex,\n\t\t\t\tresultEntryId: planned.resultEntryId,\n\t\t\t\treplay,\n\t\t\t};\n\t\t\treturn {\n\t\t\t\tkind: \"commit\",\n\t\t\t\twrites: [setValue(operationToolArgs(drive.operationId, run.batch.turnId, planned.sourceIndex), args)],\n\t\t\t\toperationState: withToolBatch(run, replaceCall(run.batch, effectPending)),\n\t\t\t\tmaterialize: () => effectPending,\n\t\t\t\tevents: () => [\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: \"tool_start\",\n\t\t\t\t\t\tlane: lane.name,\n\t\t\t\t\t\trunId: drive.operationId,\n\t\t\t\t\t\tturnId: run.batch.turnId,\n\t\t\t\t\t\ttoolCallId: toolCall.id,\n\t\t\t\t\t\ttoolName: toolCall.name,\n\t\t\t\t\t\targs,\n\t\t\t\t\t\t...(recovery ? { recovery: true as const } : {}),\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t};\n\t\t},\n\t\tdrive.context,\n\t);\n}\n\nasync function publishToolOutcome<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n\tdrive: Drive,\n\tcapability: ToolsOperation,\n\tcall: Extract<ToolCall, { status: \"planned\" | \"effect_pending\" }>,\n\tfinalized: ToolOutcome,\n\trecovery: boolean,\n): Promise<void> {\n\tawait lane.settleOperation(\n\t\tcapability,\n\t\tasync (_state, run, _meta, reader) => {\n\t\t\tconst { toolCall } = finalized;\n\t\t\tconst memos = await reader.scanValues(\n\t\t\t\toperationToolMemoPrefix(drive.operationId, call.resultEntryId),\n\t\t\t\tdrive.context,\n\t\t\t);\n\t\t\tconst durableTerminate = run.control.status === \"running\" && finalized.terminate;\n\t\t\tconst outcome: Extract<ToolCall, { status: \"outcome_ready\" }> = {\n\t\t\t\tstatus: \"outcome_ready\",\n\t\t\t\tsourceIndex: call.sourceIndex,\n\t\t\t\tresultEntryId: call.resultEntryId,\n\t\t\t\tterminate: durableTerminate,\n\t\t\t};\n\t\t\treturn {\n\t\t\t\tkind: \"commit\",\n\t\t\t\twrites: [\n\t\t\t\t\tsetValue(pendingEntry(call.resultEntryId), { type: \"message\", payload: finalized.message }),\n\t\t\t\t\tdeleteValue(pendingToolOutput(drive.operationId, call.resultEntryId)),\n\t\t\t\t\t...memos.map(({ address }) => deleteValue(address)),\n\t\t\t\t],\n\t\t\t\toperationState: withToolBatch(run, replaceCall(run.batch, outcome)),\n\t\t\t\tmaterialize: () => undefined,\n\t\t\t\tevents: () => [\n\t\t\t\t\t...(call.status === \"planned\"\n\t\t\t\t\t\t? [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\ttype: \"tool_start\" as const,\n\t\t\t\t\t\t\t\t\tlane: lane.name,\n\t\t\t\t\t\t\t\t\trunId: drive.operationId,\n\t\t\t\t\t\t\t\t\tturnId: run.batch.turnId,\n\t\t\t\t\t\t\t\t\ttoolCallId: toolCall.id,\n\t\t\t\t\t\t\t\t\ttoolName: toolCall.name,\n\t\t\t\t\t\t\t\t\targs: toolCall.arguments,\n\t\t\t\t\t\t\t\t\t...(recovery ? { recovery: true as const } : {}),\n\t\t\t\t\t\t\t\t},\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\t\ttype: \"tool_end\",\n\t\t\t\t\t\tlane: lane.name,\n\t\t\t\t\t\trunId: drive.operationId,\n\t\t\t\t\t\tturnId: run.batch.turnId,\n\t\t\t\t\t\ttoolCallId: toolCall.id,\n\t\t\t\t\t\ttoolName: toolCall.name,\n\t\t\t\t\t\tresult: toolResultFromMessage(finalized.message, durableTerminate),\n\t\t\t\t\t\tisError: finalized.message.isError,\n\t\t\t\t\t\tterminate: durableTerminate,\n\t\t\t\t\t\t...(recovery ? { recovery: true as const } : {}),\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t};\n\t\t},\n\t\tdrive.context,\n\t);\n}\n\nasync function clearReplayCheckpoint<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n\tdrive: Drive,\n\tbatch: ToolBatch,\n\tcall: Extract<ToolCall, { status: \"effect_pending\" }>,\n\ttoolCall: AgentToolCall,\n): Promise<Record<string, JsonValue>> {\n\treturn lane.command(async (state, reader) => {\n\t\tconst stored = await reader.getValue(\n\t\t\toperationToolArgs(drive.operationId, batch.turnId, call.sourceIndex),\n\t\t\tdrive.context,\n\t\t);\n\t\tif (stored === undefined) {\n\t\t\tthrow new SessionInvariantError(`Tool call ${call.resultEntryId} is missing persisted arguments`);\n\t\t}\n\t\treturn {\n\t\t\tkind: \"commit\",\n\t\t\twrites: [deleteValue(pendingToolOutput(drive.operationId, call.resultEntryId))],\n\t\t\tnext: state,\n\t\t\tmaterialize: () => stored.value,\n\t\t\tevents: () => [\n\t\t\t\t{\n\t\t\t\t\ttype: \"tool_start\",\n\t\t\t\t\tlane: lane.name,\n\t\t\t\t\trunId: drive.operationId,\n\t\t\t\t\tturnId: batch.turnId,\n\t\t\t\t\ttoolCallId: toolCall.id,\n\t\t\t\t\ttoolName: toolCall.name,\n\t\t\t\t\targs: stored.value,\n\t\t\t\t\trecovery: true,\n\t\t\t\t},\n\t\t\t],\n\t\t};\n\t}, drive.context);\n}\n\nfunction readCheckpoint<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n\tdrive: Drive,\n\tcall: Extract<ToolCall, { status: \"effect_pending\" }>,\n): Promise<AgentToolResult<unknown> | undefined> {\n\treturn lane.command(async (_state, reader) => {\n\t\tconst stored = await reader.getValue(pendingToolOutput(drive.operationId, call.resultEntryId), drive.context);\n\t\treturn { kind: \"return\", result: stored?.value };\n\t}, drive.context);\n}\n\nasync function resolveToolContext<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n\tdrive: Drive,\n): Promise<TContext> {\n\tconst source = lane.readConfig().toolContext;\n\treturn (typeof source === \"function\" ? await source(drive.context) : source) as TContext;\n}\n\nasync function performToolInvocation<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n\tdrive: Drive,\n\tbatch: ToolBatch,\n\tcall: Extract<ToolCall, { status: \"effect_pending\" }>,\n\tcleared: ClearedToolCall<TContext>,\n\ttoolContext: TContext,\n\trecovery: boolean,\n): Promise<ToolOutcome> {\n\tconst capability = invocationCapability(lane, drive, batch, call);\n\tconst progress = openToolProgress(lane, drive, batch.turnId, call.sourceIndex, call.resultEntryId);\n\tlet latestUpdateDelivery: Promise<void> = Promise.resolve();\n\tconst publishUpdate = (partial: AgentToolResult<unknown>): void => {\n\t\tlatestUpdateDelivery = lane.emitBatch(\n\t\t\t[\n\t\t\t\t{\n\t\t\t\t\ttype: \"tool_update\",\n\t\t\t\t\tlane: lane.name,\n\t\t\t\t\trunId: drive.operationId,\n\t\t\t\t\tturnId: batch.turnId,\n\t\t\t\t\ttoolCallId: cleared.toolCall.id,\n\t\t\t\t\ttoolName: cleared.toolCall.name,\n\t\t\t\t\tpartialResult: partial,\n\t\t\t\t\t...(recovery ? { recovery: true as const } : {}),\n\t\t\t\t},\n\t\t\t],\n\t\t\tdrive.context,\n\t\t);\n\t\tvoid latestUpdateDelivery.catch(() => {});\n\t};\n\n\tlet execution: Promise<ExecutedToolCall>;\n\ttry {\n\t\texecution = executeToolCall(\n\t\t\tcleared,\n\t\t\tdrive.gate,\n\t\t\t(partial, options) => {\n\t\t\t\tpublishUpdate(partial);\n\t\t\t\tif (options?.checkpoint === true) progress.write(partial);\n\t\t\t},\n\t\t\ttoolContext,\n\t\t\tcapability.invocation,\n\t\t\tdrive.context,\n\t\t);\n\t} catch (error) {\n\t\tcapability.expire();\n\t\tprogress.seal();\n\t\tawait progress.drain();\n\t\tif (!(error instanceof AbortRequested)) throw error;\n\t\tawait error.cancellation;\n\t\treturn recovery ? interruptedOutcome(cleared.toolCall, undefined) : abortedOutcome(cleared.toolCall);\n\t}\n\n\tconst executed = await execution.finally(() => {\n\t\tcapability.expire();\n\t\tprogress.seal();\n\t});\n\tawait latestUpdateDelivery;\n\tawait progress.drain();\n\n\tlet patch: Awaited<ReturnType<typeof lane.hooks.runToolWithGate<\"after_tool\">>>;\n\ttry {\n\t\tpatch = await lane.hooks.runToolWithGate(\n\t\t\t\"after_tool\",\n\t\t\t{\n\t\t\t\tlane: lane.name,\n\t\t\t\trunId: drive.operationId,\n\t\t\t\ttoolCallId: cleared.toolCall.id,\n\t\t\t\ttoolName: cleared.toolCall.name,\n\t\t\t\targs: cleared.args,\n\t\t\t\tcontent: executed.result.content,\n\t\t\t\t...(executed.result.details === undefined ? {} : { details: executed.result.details as JsonValue }),\n\t\t\t\tisError: executed.isError,\n\t\t\t\t...(executed.result.usage === undefined ? {} : { usage: executed.result.usage }),\n\t\t\t},\n\t\t\tdrive.gate,\n\t\t\tdrive.context,\n\t\t);\n\t} catch (error) {\n\t\tif (!(error instanceof AbortRequested)) throw error;\n\t\tpatch = undefined;\n\t}\n\tconst finalized = finalizeToolCall(cleared, executed, patch);\n\treturn { toolCall: finalized.toolCall, message: createToolResultMessage(finalized), terminate: finalized.terminate };\n}\n\nasync function prepareToolInvocation<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n\tdrive: Drive,\n\tsources: ToolBatchSource,\n\tcall: Extract<ToolCall, { status: \"planned\" }>,\n\ttools: AgentHarnessTool<TContext>[],\n): Promise<PreparedToolInvocation<TContext>> {\n\tconst toolCall = toolCallFor(sources, call);\n\tif (sources.assistant.stopReason === \"length\") {\n\t\treturn { kind: \"outcome\", outcome: truncatedOutcome(toolCall) };\n\t}\n\tconst prepared = prepareToolCall(toolCall, tools);\n\tif (\"kind\" in prepared) return { kind: \"outcome\", outcome: outcomeFromFinalizedCall(prepared) };\n\n\tlet decision: Awaited<ReturnType<typeof lane.hooks.runToolWithGate<\"before_tool\">>>;\n\ttry {\n\t\tdecision = await lane.hooks.runToolWithGate(\n\t\t\t\"before_tool\",\n\t\t\t{\n\t\t\t\tlane: lane.name,\n\t\t\t\trunId: drive.operationId,\n\t\t\t\ttoolCallId: toolCall.id,\n\t\t\t\ttoolName: toolCall.name,\n\t\t\t\targs: prepared.args,\n\t\t\t},\n\t\t\tdrive.gate,\n\t\t\tdrive.context,\n\t\t);\n\t} catch (error) {\n\t\tif (!(error instanceof AbortRequested)) throw error;\n\t\tawait error.cancellation;\n\t\treturn { kind: \"outcome\", outcome: abortedOutcome(toolCall) };\n\t}\n\tconst cleared = applyBeforeToolDecision(prepared, decision);\n\treturn \"kind\" in cleared\n\t\t? { kind: \"outcome\", outcome: outcomeFromFinalizedCall(cleared) }\n\t\t: { kind: \"ready\", cleared };\n}\n\nasync function startToolInvocation<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n\tdrive: Drive,\n\trun: ToolsOperation,\n\tsources: ToolBatchSource,\n\tcall: Extract<ToolCall, { status: \"planned\" }>,\n\ttools: AgentHarnessTool<TContext>[],\n\ttoolContext: TContext,\n\trecovery: boolean,\n): Promise<ToolCallTask> {\n\tconst prepared = await prepareToolInvocation(lane, drive, sources, call, tools);\n\tif (prepared.kind === \"outcome\") {\n\t\treturn { completion: publishToolOutcome(lane, drive, run, call, prepared.outcome, recovery) };\n\t}\n\tconst effectPending = await publishToolIntent(\n\t\tlane,\n\t\tdrive,\n\t\trun,\n\t\tcall,\n\t\tprepared.cleared.toolCall,\n\t\tprepared.cleared.args,\n\t\tprepared.cleared.tool.replay ?? \"never\",\n\t\trecovery,\n\t);\n\treturn {\n\t\tcompletion:\n\t\t\teffectPending.kind === \"cancel_requested\"\n\t\t\t\t? publishToolOutcome(lane, drive, run, call, abortedOutcome(prepared.cleared.toolCall), recovery)\n\t\t\t\t: performToolInvocation(\n\t\t\t\t\t\tlane,\n\t\t\t\t\t\tdrive,\n\t\t\t\t\t\trun.batch,\n\t\t\t\t\t\teffectPending.value,\n\t\t\t\t\t\tprepared.cleared,\n\t\t\t\t\t\ttoolContext,\n\t\t\t\t\t\trecovery,\n\t\t\t\t\t).then((outcome) => publishToolOutcome(lane, drive, run, effectPending.value, outcome, recovery)),\n\t};\n}\n\nasync function recoverToolInvocation<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n\tdrive: Drive,\n\trun: ToolsOperation,\n\tsources: ToolBatchSource,\n\tcall: Extract<ToolCall, { status: \"effect_pending\" }>,\n\ttoolsByName: Map<string, AgentHarnessTool<TContext>>,\n\ttoolContext: TContext,\n\tcancelled: boolean,\n): Promise<ToolCallTask> {\n\tconst toolCall = toolCallFor(sources, call);\n\tconst tool = toolsByName.get(toolCall.name);\n\tif (!cancelled && call.replay === \"safe\" && tool?.replay === \"safe\") {\n\t\tconst args = await clearReplayCheckpoint(lane, drive, run.batch, call, toolCall);\n\t\tconst cleared: ClearedToolCall<TContext> = { toolCall, tool, args };\n\t\treturn {\n\t\t\tcompletion: performToolInvocation(lane, drive, run.batch, call, cleared, toolContext, true).then((outcome) =>\n\t\t\t\tpublishToolOutcome(lane, drive, run, call, outcome, true),\n\t\t\t),\n\t\t};\n\t}\n\tconst checkpoint = await readCheckpoint(lane, drive, call);\n\treturn {\n\t\tcompletion: publishToolOutcome(lane, drive, run, call, interruptedOutcome(toolCall, checkpoint), true),\n\t};\n}\n\nasync function runSequential<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n\tdrive: Drive,\n\trun: ToolsOperation,\n\tsources: ToolBatchSource,\n\texecution:\n\t\t| {\n\t\t\t\ttools: AgentHarnessTool<TContext>[];\n\t\t\t\ttoolsByName: Map<string, AgentHarnessTool<TContext>>;\n\t\t\t\ttoolContext: TContext;\n\t\t }\n\t\t| undefined,\n\trecovery: boolean,\n): Promise<ProcedureResult> {\n\tconst { batch } = run;\n\tfor (let transition = 0; transition <= batch.calls.length * 2 + 1; transition += 1) {\n\t\tawait materializeReady(lane, drive, run, sources, recovery);\n\t\tconst current = currentBatch(lane);\n\t\tif (current === undefined) return { kind: \"continue\" };\n\t\tconst call = current.batch.calls.find((candidate) => candidate.status !== \"completed\");\n\t\tif (call === undefined) throw new SessionInvariantError(\"Tool batch remained open after every call completed\");\n\t\tif (call.status === \"outcome_ready\") throw new SessionInvariantError(\"Ready tool outcome was not materialized\");\n\n\t\tif (current.run.control.status === \"cancel_requested\") {\n\t\t\tconst toolCall = toolCallFor(sources, call);\n\t\t\tif (call.status === \"planned\") {\n\t\t\t\tawait publishToolOutcome(lane, drive, current.run, call, abortedOutcome(toolCall), recovery);\n\t\t\t} else {\n\t\t\t\tconst checkpoint = await readCheckpoint(lane, drive, call);\n\t\t\t\tawait publishToolOutcome(\n\t\t\t\t\tlane,\n\t\t\t\t\tdrive,\n\t\t\t\t\tcurrent.run,\n\t\t\t\t\tcall,\n\t\t\t\t\tinterruptedOutcome(toolCall, checkpoint),\n\t\t\t\t\trecovery,\n\t\t\t\t);\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (execution === undefined) throw new SessionInvariantError(\"Running tool batch is missing execution context\");\n\t\tconst started =\n\t\t\tcall.status === \"planned\"\n\t\t\t\t? await startToolInvocation(\n\t\t\t\t\t\tlane,\n\t\t\t\t\t\tdrive,\n\t\t\t\t\t\tcurrent.run,\n\t\t\t\t\t\tsources,\n\t\t\t\t\t\tcall,\n\t\t\t\t\t\texecution.tools,\n\t\t\t\t\t\texecution.toolContext,\n\t\t\t\t\t\trecovery,\n\t\t\t\t\t)\n\t\t\t\t: await recoverToolInvocation(\n\t\t\t\t\t\tlane,\n\t\t\t\t\t\tdrive,\n\t\t\t\t\t\tcurrent.run,\n\t\t\t\t\t\tsources,\n\t\t\t\t\t\tcall,\n\t\t\t\t\t\texecution.toolsByName,\n\t\t\t\t\t\texecution.toolContext,\n\t\t\t\t\t\tfalse,\n\t\t\t\t\t);\n\t\tawait started.completion;\n\t}\n\tthrow new SessionInvariantError(\"Sequential tool batch exceeded its bounded transition count\");\n}\n\nasync function runParallel<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n\tdrive: Drive,\n\trun: ToolsOperation,\n\tsources: ToolBatchSource,\n\ttools: AgentHarnessTool<TContext>[],\n\ttoolsByName: Map<string, AgentHarnessTool<TContext>>,\n\ttoolContext: TContext,\n\trecovery: boolean,\n): Promise<ProcedureResult> {\n\tconst { batch } = run;\n\tlet materialization = Promise.resolve();\n\tconst scheduleMaterialization = (): Promise<void> => {\n\t\tconst scheduled = materialization.then(() => materializeReady(lane, drive, run, sources, recovery));\n\t\tmaterialization = scheduled.catch(() => {});\n\t\treturn scheduled;\n\t};\n\tconst jobs: Promise<void>[] = [];\n\tfor (const call of batch.calls) {\n\t\tif (call.status === \"completed\" || call.status === \"outcome_ready\") continue;\n\t\tconst started =\n\t\t\tcall.status === \"planned\"\n\t\t\t\t? await startToolInvocation(lane, drive, run, sources, call, tools, toolContext, recovery)\n\t\t\t\t: await recoverToolInvocation(\n\t\t\t\t\t\tlane,\n\t\t\t\t\t\tdrive,\n\t\t\t\t\t\trun,\n\t\t\t\t\t\tsources,\n\t\t\t\t\t\tcall,\n\t\t\t\t\t\ttoolsByName,\n\t\t\t\t\t\ttoolContext,\n\t\t\t\t\t\tlane.state.operation!.state.control.status === \"cancel_requested\",\n\t\t\t\t\t);\n\t\tconst job = started.completion.then(async () => {\n\t\t\tawait scheduleMaterialization();\n\t\t});\n\t\tvoid job.catch(() => {});\n\t\tjobs.push(job);\n\t}\n\tawait Promise.all(jobs);\n\tawait scheduleMaterialization();\n\treturn { kind: \"continue\" };\n}\n\n/** Execute, recover, stage, and source-order one complete durable tool batch. */\nexport async function runTools<TContext extends object | undefined>(\n\tlane: Lane<TContext>,\n\tdrive: Drive,\n\trun: ToolsOperation,\n): Promise<ProcedureResult> {\n\tconst batch = run.batch;\n\tconst recovery = batch.calls.some((call) => call.status === \"effect_pending\" || call.status === \"outcome_ready\");\n\tif (recovery) {\n\t\tawait lane.emitBatch(\n\t\t\t[\n\t\t\t\t{\n\t\t\t\t\ttype: \"turn_start\",\n\t\t\t\t\tlane: lane.name,\n\t\t\t\t\trunId: drive.operationId,\n\t\t\t\t\tturnId: batch.turnId,\n\t\t\t\t\trecovery: true,\n\t\t\t\t},\n\t\t\t],\n\t\t\tdrive.context,\n\t\t);\n\t}\n\tconst sources = await readToolBatchSource(lane, drive, batch);\n\tawait materializeReady(lane, drive, run, sources, recovery);\n\tconst current = currentBatch(lane);\n\tif (current === undefined) return { kind: \"continue\" };\n\tif (current.run.control.status === \"cancel_requested\") {\n\t\treturn runSequential(lane, drive, current.run, sources, undefined, recovery);\n\t}\n\tconst config = lane.readConfig();\n\tconst active = new Set(batch.configuration.activeToolNames);\n\tconst tools = config.tools.filter((tool) => active.has(tool.name));\n\tconst toolsByName = new Map(tools.map((tool) => [tool.name, tool]));\n\tconst toolContext = await resolveToolContext(lane, drive);\n\treturn run.settings.toolExecution === \"sequential\"\n\t\t? runSequential(lane, drive, current.run, sources, { tools, toolsByName, toolContext }, recovery)\n\t\t: runParallel(lane, drive, current.run, sources, tools, toolsByName, toolContext, recovery);\n}\n"]}
@@ -1,13 +1,21 @@
1
- /**
2
- * Final action for current state at one address:
3
- * - copy: emit the current value in the destination;
4
- * - exclude: omit it from the destination;
5
- * - reconstruct: do not copy the row because lane handling emits a coherent replacement.
6
- */
7
- export type ForkDisposition = "copy" | "exclude" | "reconstruct";
8
- /** Decide the final fork action for one current scalar or list address. */
9
- export declare function classifyForkAddress(address: {
10
- readonly namespace: string;
11
- readonly key: string;
12
- }, scope: "branch" | "tree", isEntryCopied: (entryId: string) => boolean): ForkDisposition;
1
+ import type { CommittedListAppendWrite, CommittedValueSetWrite } from "./commit.ts";
2
+ import type { ForkOptions } from "./types.ts";
3
+ export type ForkCurrentStatePlan = {
4
+ scope: "branch";
5
+ branch: string;
6
+ destinationTip: string | null;
7
+ } | {
8
+ scope: "tree";
9
+ };
10
+ export declare function selectBranchFork(options: Extract<ForkOptions, {
11
+ scope: "branch";
12
+ }>, source: {
13
+ tip: string | null | undefined;
14
+ getParent: (entryId: string) => string | null | undefined;
15
+ selectEntry: (entryId: string) => void;
16
+ }): Extract<ForkCurrentStatePlan, {
17
+ scope: "branch";
18
+ }>;
19
+ /** Project one current scalar row or surviving list element into destination state. */
20
+ export declare function projectForkCurrentStateWrite(write: CommittedValueSetWrite | CommittedListAppendWrite, plan: ForkCurrentStatePlan, isEntryCopied: (entryId: string) => boolean): CommittedValueSetWrite | CommittedListAppendWrite | undefined;
13
21
  //# sourceMappingURL=fork-policy.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"fork-policy.d.ts","sourceRoot":"","sources":["../../../src/harness/session/fork-policy.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,SAAS,GAAG,aAAa,CAAC;AAEjE,2EAA2E;AAC3E,wBAAgB,mBAAmB,CAClC,OAAO,EAAE;IAAE,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;CAAE,EAC7D,KAAK,EAAE,QAAQ,GAAG,MAAM,EACxB,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,GACzC,eAAe,CAkBjB","sourcesContent":["/**\n * Final action for current state at one address:\n * - copy: emit the current value in the destination;\n * - exclude: omit it from the destination;\n * - reconstruct: do not copy the row because lane handling emits a coherent replacement.\n */\nexport type ForkDisposition = \"copy\" | \"exclude\" | \"reconstruct\";\n\n/** Decide the final fork action for one current scalar or list address. */\nexport function classifyForkAddress(\n\taddress: { readonly namespace: string; readonly key: string },\n\tscope: \"branch\" | \"tree\",\n\tisEntryCopied: (entryId: string) => boolean,\n): ForkDisposition {\n\tswitch (address.namespace) {\n\t\tcase \"pi.session.name\":\n\t\t\treturn \"copy\";\n\t\tcase \"pi.entry.label\":\n\t\t\treturn isEntryCopied(address.key) ? \"copy\" : \"exclude\";\n\t\tcase \"pi.branch.tip\":\n\t\tcase \"pi.lane.config\":\n\t\tcase \"pi.lane.state\":\n\t\t\treturn \"reconstruct\";\n\t\tcase \"pi.result\":\n\t\t\treturn \"exclude\";\n\t}\n\tif (address.namespace.startsWith(\"pi.op.\") || address.namespace.startsWith(\"pi.pending.\")) return \"exclude\";\n\tif (address.namespace === \"pi\" || address.namespace.startsWith(\"pi.\")) {\n\t\tthrow new Error(`Unknown reserved fork namespace: ${address.namespace}`);\n\t}\n\treturn scope === \"tree\" ? \"copy\" : \"exclude\";\n}\n"]}
1
+ {"version":3,"file":"fork-policy.d.ts","sourceRoot":"","sources":["../../../src/harness/session/fork-policy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AACpF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,MAAM,MAAM,oBAAoB,GAC7B;IAAE,KAAK,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAClE;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAErB,wBAAgB,gBAAgB,CAC/B,OAAO,EAAE,OAAO,CAAC,WAAW,EAAE;IAAE,KAAK,EAAE,QAAQ,CAAA;CAAE,CAAC,EAClD,MAAM,EAAE;IACP,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAC/B,SAAS,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAC1D,WAAW,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACvC,GACC,OAAO,CAAC,oBAAoB,EAAE;IAAE,KAAK,EAAE,QAAQ,CAAA;CAAE,CAAC,CAsBpD;AAED,uFAAuF;AACvF,wBAAgB,4BAA4B,CAC3C,KAAK,EAAE,sBAAsB,GAAG,wBAAwB,EACxD,IAAI,EAAE,oBAAoB,EAC1B,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,GACzC,sBAAsB,GAAG,wBAAwB,GAAG,SAAS,CAuB/D","sourcesContent":["import type { CommittedListAppendWrite, CommittedValueSetWrite } from \"./commit.ts\";\nimport type { ForkOptions } from \"./types.ts\";\n\nexport type ForkCurrentStatePlan =\n\t| { scope: \"branch\"; branch: string; destinationTip: string | null }\n\t| { scope: \"tree\" };\n\nexport function selectBranchFork(\n\toptions: Extract<ForkOptions, { scope: \"branch\" }>,\n\tsource: {\n\t\ttip: string | null | undefined;\n\t\tgetParent: (entryId: string) => string | null | undefined;\n\t\tselectEntry: (entryId: string) => void;\n\t},\n): Extract<ForkCurrentStatePlan, { scope: \"branch\" }> {\n\tif (source.tip === undefined) throw new Error(`Unknown source branch: ${options.branch}`);\n\tconst requested = options.entryId ?? source.tip;\n\tlet found = requested === null;\n\tlet destinationTip: string | null = null;\n\tlet entryId = source.tip;\n\twhile (entryId !== null) {\n\t\tconst parentId = source.getParent(entryId);\n\t\tif (parentId === undefined) throw new Error(`Corrupt source branch: missing parent ${entryId}`);\n\t\tif (entryId === requested) {\n\t\t\tfound = true;\n\t\t\tdestinationTip = options.position === \"before\" ? parentId : entryId;\n\t\t\tif (options.position !== \"before\") source.selectEntry(entryId);\n\t\t} else if (found) {\n\t\t\tsource.selectEntry(entryId);\n\t\t}\n\t\tentryId = parentId;\n\t}\n\tif (!found) {\n\t\tthrow new Error(`Fork entry ${requested} is not on source branch ${JSON.stringify(options.branch)}`);\n\t}\n\treturn { scope: \"branch\", branch: options.branch, destinationTip };\n}\n\n/** Project one current scalar row or surviving list element into destination state. */\nexport function projectForkCurrentStateWrite(\n\twrite: CommittedValueSetWrite | CommittedListAppendWrite,\n\tplan: ForkCurrentStatePlan,\n\tisEntryCopied: (entryId: string) => boolean,\n): CommittedValueSetWrite | CommittedListAppendWrite | undefined {\n\tswitch (write.namespace) {\n\t\tcase \"pi.session.name\":\n\t\t\treturn write;\n\t\tcase \"pi.entry.label\":\n\t\t\treturn isEntryCopied(write.key) ? write : undefined;\n\t\tcase \"pi.branch.tip\":\n\t\t\tif (plan.scope === \"tree\") return write;\n\t\t\treturn write.key === plan.branch ? { ...write, value: plan.destinationTip } : undefined;\n\t\tcase \"pi.lane.config\":\n\t\t\treturn plan.scope === \"tree\" || write.key === plan.branch ? write : undefined;\n\t\tcase \"pi.lane.state\":\n\t\t\treturn plan.scope === \"tree\" || write.key === plan.branch\n\t\t\t\t? { ...write, value: { currentOperationId: null, lastOperationId: null, inbox: [] } }\n\t\t\t\t: undefined;\n\t\tcase \"pi.result\":\n\t\t\treturn undefined;\n\t}\n\tif (write.namespace.startsWith(\"pi.op.\") || write.namespace.startsWith(\"pi.pending.\")) return undefined;\n\tif (write.namespace === \"pi\" || write.namespace.startsWith(\"pi.\")) {\n\t\tthrow new Error(`Unknown reserved fork namespace: ${write.namespace}`);\n\t}\n\treturn plan.scope === \"tree\" ? write : undefined;\n}\n"]}
@@ -1,22 +1,55 @@
1
- /** Decide the final fork action for one current scalar or list address. */
2
- export function classifyForkAddress(address, scope, isEntryCopied) {
3
- switch (address.namespace) {
1
+ export function selectBranchFork(options, source) {
2
+ if (source.tip === undefined)
3
+ throw new Error(`Unknown source branch: ${options.branch}`);
4
+ const requested = options.entryId ?? source.tip;
5
+ let found = requested === null;
6
+ let destinationTip = null;
7
+ let entryId = source.tip;
8
+ while (entryId !== null) {
9
+ const parentId = source.getParent(entryId);
10
+ if (parentId === undefined)
11
+ throw new Error(`Corrupt source branch: missing parent ${entryId}`);
12
+ if (entryId === requested) {
13
+ found = true;
14
+ destinationTip = options.position === "before" ? parentId : entryId;
15
+ if (options.position !== "before")
16
+ source.selectEntry(entryId);
17
+ }
18
+ else if (found) {
19
+ source.selectEntry(entryId);
20
+ }
21
+ entryId = parentId;
22
+ }
23
+ if (!found) {
24
+ throw new Error(`Fork entry ${requested} is not on source branch ${JSON.stringify(options.branch)}`);
25
+ }
26
+ return { scope: "branch", branch: options.branch, destinationTip };
27
+ }
28
+ /** Project one current scalar row or surviving list element into destination state. */
29
+ export function projectForkCurrentStateWrite(write, plan, isEntryCopied) {
30
+ switch (write.namespace) {
4
31
  case "pi.session.name":
5
- return "copy";
32
+ return write;
6
33
  case "pi.entry.label":
7
- return isEntryCopied(address.key) ? "copy" : "exclude";
34
+ return isEntryCopied(write.key) ? write : undefined;
8
35
  case "pi.branch.tip":
36
+ if (plan.scope === "tree")
37
+ return write;
38
+ return write.key === plan.branch ? { ...write, value: plan.destinationTip } : undefined;
9
39
  case "pi.lane.config":
40
+ return plan.scope === "tree" || write.key === plan.branch ? write : undefined;
10
41
  case "pi.lane.state":
11
- return "reconstruct";
42
+ return plan.scope === "tree" || write.key === plan.branch
43
+ ? { ...write, value: { currentOperationId: null, lastOperationId: null, inbox: [] } }
44
+ : undefined;
12
45
  case "pi.result":
13
- return "exclude";
46
+ return undefined;
14
47
  }
15
- if (address.namespace.startsWith("pi.op.") || address.namespace.startsWith("pi.pending."))
16
- return "exclude";
17
- if (address.namespace === "pi" || address.namespace.startsWith("pi.")) {
18
- throw new Error(`Unknown reserved fork namespace: ${address.namespace}`);
48
+ if (write.namespace.startsWith("pi.op.") || write.namespace.startsWith("pi.pending."))
49
+ return undefined;
50
+ if (write.namespace === "pi" || write.namespace.startsWith("pi.")) {
51
+ throw new Error(`Unknown reserved fork namespace: ${write.namespace}`);
19
52
  }
20
- return scope === "tree" ? "copy" : "exclude";
53
+ return plan.scope === "tree" ? write : undefined;
21
54
  }
22
55
  //# sourceMappingURL=fork-policy.js.map