@earendil-works/pi-agent-core 0.87.1 → 0.99.1

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 (242) hide show
  1. package/README.md +4 -0
  2. package/dist/agent-loop.d.ts +27 -2
  3. package/dist/agent-loop.d.ts.map +1 -1
  4. package/dist/agent-loop.js +44 -15
  5. package/dist/agent-loop.js.map +1 -1
  6. package/dist/agent.d.ts +9 -0
  7. package/dist/agent.d.ts.map +1 -1
  8. package/dist/agent.js +3 -0
  9. package/dist/agent.js.map +1 -1
  10. package/dist/harness/agent-harness.d.ts.map +1 -1
  11. package/dist/harness/compaction/branch-summarization.d.ts.map +1 -1
  12. package/dist/harness/compaction/branch-summarization.js.map +1 -1
  13. package/dist/harness/compaction/compaction.d.ts.map +1 -1
  14. package/dist/harness/compaction/compaction.js.map +1 -1
  15. package/dist/harness/compaction/utils.d.ts.map +1 -1
  16. package/dist/harness/compaction/utils.js.map +1 -1
  17. package/dist/harness/config.d.ts.map +1 -1
  18. package/dist/harness/config.js.map +1 -1
  19. package/dist/harness/context.d.ts.map +1 -1
  20. package/dist/harness/context.js.map +1 -1
  21. package/dist/harness/env/nodejs.d.ts.map +1 -1
  22. package/dist/harness/env/nodejs.js.map +1 -1
  23. package/dist/harness/events.d.ts.map +1 -1
  24. package/dist/harness/events.js.map +1 -1
  25. package/dist/harness/execution/assistant.d.ts.map +1 -1
  26. package/dist/harness/execution/assistant.js.map +1 -1
  27. package/dist/harness/execution/effect-gate.d.ts.map +1 -1
  28. package/dist/harness/execution/effect-gate.js.map +1 -1
  29. package/dist/harness/execution/tools.d.ts.map +1 -1
  30. package/dist/harness/execution/tools.js.map +1 -1
  31. package/dist/harness/hooks.d.ts.map +1 -1
  32. package/dist/harness/hooks.js.map +1 -1
  33. package/dist/harness/messages.d.ts.map +1 -1
  34. package/dist/harness/messages.js.map +1 -1
  35. package/dist/harness/pico3/bash.d.ts.map +1 -1
  36. package/dist/harness/pico3/bash.js.map +1 -1
  37. package/dist/harness/pico3/bounded.d.ts.map +1 -1
  38. package/dist/harness/pico3/bounded.js.map +1 -1
  39. package/dist/harness/pico3/chord.d.ts.map +1 -1
  40. package/dist/harness/pico3/chord.js.map +1 -1
  41. package/dist/harness/pico3/context.d.ts.map +1 -1
  42. package/dist/harness/pico3/context.js.map +1 -1
  43. package/dist/harness/pico3/harness.d.ts +4 -3
  44. package/dist/harness/pico3/harness.d.ts.map +1 -1
  45. package/dist/harness/pico3/harness.js.map +1 -1
  46. package/dist/harness/pico3/hooks.d.ts +2 -2
  47. package/dist/harness/pico3/hooks.d.ts.map +1 -1
  48. package/dist/harness/pico3/hooks.js.map +1 -1
  49. package/dist/harness/pico3/index.d.ts.map +1 -1
  50. package/dist/harness/pico3/jsonl.d.ts.map +1 -1
  51. package/dist/harness/pico3/jsonl.js.map +1 -1
  52. package/dist/harness/pico3/kinds/collapse.d.ts.map +1 -1
  53. package/dist/harness/pico3/kinds/collapse.js.map +1 -1
  54. package/dist/harness/pico3/kinds/entries.d.ts.map +1 -1
  55. package/dist/harness/pico3/kinds/frames.d.ts.map +1 -1
  56. package/dist/harness/pico3/kinds/frames.js.map +1 -1
  57. package/dist/harness/pico3/kinds/generation.d.ts.map +1 -1
  58. package/dist/harness/pico3/kinds/generation.js.map +1 -1
  59. package/dist/harness/pico3/kinds/job.d.ts.map +1 -1
  60. package/dist/harness/pico3/kinds/job.js.map +1 -1
  61. package/dist/harness/pico3/kinds/plugin.d.ts.map +1 -1
  62. package/dist/harness/pico3/kinds/plugin.js.map +1 -1
  63. package/dist/harness/pico3/kinds/post-tools.d.ts.map +1 -1
  64. package/dist/harness/pico3/kinds/post-tools.js.map +1 -1
  65. package/dist/harness/pico3/kinds/task-api.d.ts.map +1 -1
  66. package/dist/harness/pico3/kinds/task-api.js.map +1 -1
  67. package/dist/harness/pico3/kinds/tool.d.ts.map +1 -1
  68. package/dist/harness/pico3/kinds/tool.js.map +1 -1
  69. package/dist/harness/pico3/legacy-tracker.d.ts +11 -0
  70. package/dist/harness/pico3/legacy-tracker.d.ts.map +1 -0
  71. package/dist/harness/pico3/legacy-tracker.js +41 -0
  72. package/dist/harness/pico3/legacy-tracker.js.map +1 -0
  73. package/dist/harness/pico3/membrane.d.ts.map +1 -1
  74. package/dist/harness/pico3/membrane.js.map +1 -1
  75. package/dist/harness/pico3/memory.d.ts +1 -1
  76. package/dist/harness/pico3/memory.d.ts.map +1 -1
  77. package/dist/harness/pico3/memory.js.map +1 -1
  78. package/dist/harness/pico3/scheduler.d.ts +3 -0
  79. package/dist/harness/pico3/scheduler.d.ts.map +1 -1
  80. package/dist/harness/pico3/scheduler.js.map +1 -1
  81. package/dist/harness/pico3/session.d.ts +3 -2
  82. package/dist/harness/pico3/session.d.ts.map +1 -1
  83. package/dist/harness/pico3/session.js +5 -4
  84. package/dist/harness/pico3/session.js.map +1 -1
  85. package/dist/harness/pico3/system.d.ts +1 -1
  86. package/dist/harness/pico3/system.d.ts.map +1 -1
  87. package/dist/harness/pico3/system.js.map +1 -1
  88. package/dist/harness/pico3/types.d.ts +1 -1
  89. package/dist/harness/pico3/types.d.ts.map +1 -1
  90. package/dist/harness/pico3/types.js.map +1 -1
  91. package/dist/harness/pico3/view.d.ts.map +1 -1
  92. package/dist/harness/pico3/view.js +6 -12
  93. package/dist/harness/pico3/view.js.map +1 -1
  94. package/dist/harness/prompt-templates.d.ts.map +1 -1
  95. package/dist/harness/prompt-templates.js.map +1 -1
  96. package/dist/harness/result.d.ts.map +1 -1
  97. package/dist/harness/result.js.map +1 -1
  98. package/dist/harness/runtime/drive/boundary.d.ts.map +1 -1
  99. package/dist/harness/runtime/drive/boundary.js.map +1 -1
  100. package/dist/harness/runtime/drive/checkpoint.d.ts.map +1 -1
  101. package/dist/harness/runtime/drive/checkpoint.js.map +1 -1
  102. package/dist/harness/runtime/drive/deferred.d.ts.map +1 -1
  103. package/dist/harness/runtime/drive/deferred.js.map +1 -1
  104. package/dist/harness/runtime/drive/generation.d.ts.map +1 -1
  105. package/dist/harness/runtime/drive/generation.js.map +1 -1
  106. package/dist/harness/runtime/drive/reconcile.d.ts.map +1 -1
  107. package/dist/harness/runtime/drive/reconcile.js.map +1 -1
  108. package/dist/harness/runtime/drive/recovery.d.ts.map +1 -1
  109. package/dist/harness/runtime/drive/recovery.js.map +1 -1
  110. package/dist/harness/runtime/drive/response.d.ts.map +1 -1
  111. package/dist/harness/runtime/drive/response.js.map +1 -1
  112. package/dist/harness/runtime/drive/retry.d.ts.map +1 -1
  113. package/dist/harness/runtime/drive/retry.js.map +1 -1
  114. package/dist/harness/runtime/drive/structural.d.ts.map +1 -1
  115. package/dist/harness/runtime/drive/structural.js.map +1 -1
  116. package/dist/harness/runtime/drive/terminal.d.ts.map +1 -1
  117. package/dist/harness/runtime/drive/terminal.js.map +1 -1
  118. package/dist/harness/runtime/drive/tool-placement.d.ts.map +1 -1
  119. package/dist/harness/runtime/drive/tool-placement.js.map +1 -1
  120. package/dist/harness/runtime/drive/tools.d.ts.map +1 -1
  121. package/dist/harness/runtime/drive/tools.js.map +1 -1
  122. package/dist/harness/runtime/drive.d.ts.map +1 -1
  123. package/dist/harness/runtime/drive.js.map +1 -1
  124. package/dist/harness/runtime/harness.d.ts.map +1 -1
  125. package/dist/harness/runtime/harness.js.map +1 -1
  126. package/dist/harness/runtime/index.d.ts.map +1 -1
  127. package/dist/harness/runtime/lane.d.ts +17 -0
  128. package/dist/harness/runtime/lane.d.ts.map +1 -1
  129. package/dist/harness/runtime/lane.js.map +1 -1
  130. package/dist/harness/runtime/progress.d.ts.map +1 -1
  131. package/dist/harness/runtime/progress.js.map +1 -1
  132. package/dist/harness/runtime/reducer.d.ts.map +1 -1
  133. package/dist/harness/runtime/reducer.js.map +1 -1
  134. package/dist/harness/runtime/restore.d.ts.map +1 -1
  135. package/dist/harness/runtime/restore.js.map +1 -1
  136. package/dist/harness/runtime/transcript.d.ts.map +1 -1
  137. package/dist/harness/runtime/transcript.js.map +1 -1
  138. package/dist/harness/runtime/types.d.ts.map +1 -1
  139. package/dist/harness/runtime/types.js.map +1 -1
  140. package/dist/harness/session/commit.d.ts.map +1 -1
  141. package/dist/harness/session/commit.js.map +1 -1
  142. package/dist/harness/session/context.d.ts.map +1 -1
  143. package/dist/harness/session/context.js.map +1 -1
  144. package/dist/harness/session/fork-policy.d.ts.map +1 -1
  145. package/dist/harness/session/fork-policy.js.map +1 -1
  146. package/dist/harness/session/fork.d.ts.map +1 -1
  147. package/dist/harness/session/fork.js.map +1 -1
  148. package/dist/harness/session/in-memory-storage-state.d.ts.map +1 -1
  149. package/dist/harness/session/in-memory-storage-state.js.map +1 -1
  150. package/dist/harness/session/index.d.ts.map +1 -1
  151. package/dist/harness/session/jsonl/codec.d.ts.map +1 -1
  152. package/dist/harness/session/jsonl/codec.js.map +1 -1
  153. package/dist/harness/session/jsonl/fork.d.ts.map +1 -1
  154. package/dist/harness/session/jsonl/fork.js.map +1 -1
  155. package/dist/harness/session/jsonl/index.d.ts.map +1 -1
  156. package/dist/harness/session/jsonl/io.d.ts.map +1 -1
  157. package/dist/harness/session/jsonl/io.js.map +1 -1
  158. package/dist/harness/session/jsonl/legacy-v3.d.ts +1 -0
  159. package/dist/harness/session/jsonl/legacy-v3.d.ts.map +1 -1
  160. package/dist/harness/session/jsonl/legacy-v3.js.map +1 -1
  161. package/dist/harness/session/jsonl/repo.d.ts.map +1 -1
  162. package/dist/harness/session/jsonl/repo.js.map +1 -1
  163. package/dist/harness/session/jsonl/storage.d.ts +1 -0
  164. package/dist/harness/session/jsonl/storage.d.ts.map +1 -1
  165. package/dist/harness/session/jsonl/storage.js.map +1 -1
  166. package/dist/harness/session/jsonl/types.d.ts.map +1 -1
  167. package/dist/harness/session/memory.d.ts.map +1 -1
  168. package/dist/harness/session/memory.js.map +1 -1
  169. package/dist/harness/session/mutation-line.d.ts.map +1 -1
  170. package/dist/harness/session/mutation-line.js.map +1 -1
  171. package/dist/harness/session/session.d.ts.map +1 -1
  172. package/dist/harness/session/session.js.map +1 -1
  173. package/dist/harness/session/testing/benchmark/datasets.d.ts.map +1 -1
  174. package/dist/harness/session/testing/benchmark/datasets.js.map +1 -1
  175. package/dist/harness/session/testing/benchmark/session-repo.d.ts.map +1 -1
  176. package/dist/harness/session/testing/benchmark/session-repo.js.map +1 -1
  177. package/dist/harness/session/testing/benchmark/storage.d.ts.map +1 -1
  178. package/dist/harness/session/testing/benchmark/storage.js.map +1 -1
  179. package/dist/harness/session/testing/conformance/session-repo.d.ts.map +1 -1
  180. package/dist/harness/session/testing/conformance/session-repo.js.map +1 -1
  181. package/dist/harness/session/testing/conformance/storage.d.ts.map +1 -1
  182. package/dist/harness/session/testing/conformance/storage.js.map +1 -1
  183. package/dist/harness/session/testing/gating-storage.d.ts.map +1 -1
  184. package/dist/harness/session/testing/gating-storage.js.map +1 -1
  185. package/dist/harness/session/testing/index.d.ts.map +1 -1
  186. package/dist/harness/session/testing/instrumented-storage.d.ts.map +1 -1
  187. package/dist/harness/session/testing/instrumented-storage.js.map +1 -1
  188. package/dist/harness/session/testing/storage-decorator.d.ts.map +1 -1
  189. package/dist/harness/session/testing/storage-decorator.js.map +1 -1
  190. package/dist/harness/session/testing/types.d.ts.map +1 -1
  191. package/dist/harness/session/types.d.ts.map +1 -1
  192. package/dist/harness/session/types.js.map +1 -1
  193. package/dist/harness/session/values.d.ts +2 -2
  194. package/dist/harness/session/values.d.ts.map +1 -1
  195. package/dist/harness/session/values.js.map +1 -1
  196. package/dist/harness/skills.d.ts.map +1 -1
  197. package/dist/harness/skills.js.map +1 -1
  198. package/dist/harness/system-prompt.d.ts.map +1 -1
  199. package/dist/harness/system-prompt.js.map +1 -1
  200. package/dist/harness/telemetry.d.ts.map +1 -1
  201. package/dist/harness/telemetry.js.map +1 -1
  202. package/dist/harness/tools/bash.d.ts.map +1 -1
  203. package/dist/harness/tools/bash.js.map +1 -1
  204. package/dist/harness/tools/edit-diff.d.ts.map +1 -1
  205. package/dist/harness/tools/edit-diff.js.map +1 -1
  206. package/dist/harness/tools/edit.d.ts.map +1 -1
  207. package/dist/harness/tools/edit.js.map +1 -1
  208. package/dist/harness/tools/file-mutation-queue.d.ts.map +1 -1
  209. package/dist/harness/tools/file-mutation-queue.js.map +1 -1
  210. package/dist/harness/tools/image.d.ts.map +1 -1
  211. package/dist/harness/tools/image.js.map +1 -1
  212. package/dist/harness/tools/index.d.ts.map +1 -1
  213. package/dist/harness/tools/path-utils.d.ts.map +1 -1
  214. package/dist/harness/tools/path-utils.js.map +1 -1
  215. package/dist/harness/tools/read.d.ts.map +1 -1
  216. package/dist/harness/tools/read.js.map +1 -1
  217. package/dist/harness/tools/tool-context.d.ts.map +1 -1
  218. package/dist/harness/tools/write.d.ts.map +1 -1
  219. package/dist/harness/tools/write.js.map +1 -1
  220. package/dist/harness/types.d.ts.map +1 -1
  221. package/dist/harness/types.js.map +1 -1
  222. package/dist/harness/utils/adaptive-publisher.d.ts.map +1 -1
  223. package/dist/harness/utils/adaptive-publisher.js.map +1 -1
  224. package/dist/harness/utils/output-capture.d.ts.map +1 -1
  225. package/dist/harness/utils/output-capture.js.map +1 -1
  226. package/dist/harness/utils/shell-output.d.ts.map +1 -1
  227. package/dist/harness/utils/shell-output.js.map +1 -1
  228. package/dist/harness/utils/truncate.d.ts.map +1 -1
  229. package/dist/harness/utils/truncate.js.map +1 -1
  230. package/dist/harness/utils/usage.d.ts.map +1 -1
  231. package/dist/harness/utils/usage.js.map +1 -1
  232. package/dist/index.d.ts.map +1 -1
  233. package/dist/node.d.ts.map +1 -1
  234. package/dist/proxy.d.ts.map +1 -1
  235. package/dist/proxy.js.map +1 -1
  236. package/dist/search/index.d.ts.map +1 -1
  237. package/dist/stream-fn.d.ts.map +1 -1
  238. package/dist/stream-fn.js.map +1 -1
  239. package/dist/types.d.ts +30 -2
  240. package/dist/types.d.ts.map +1 -1
  241. package/dist/types.js.map +1 -1
  242. package/package.json +9 -10
@@ -1 +1 @@
1
- {"version":3,"file":"generation.js","sourceRoot":"","sources":["../../../../src/harness/pico3/kinds/generation.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Context } from \"@earendil-works/chord\";\nimport type {\n\tAssistantMessage,\n\tAssistantMessageEvent,\n\tAssistantMessageFrame,\n\tDeferredHandle,\n\tToolCall,\n} from \"@earendil-works/pi-ai\";\nimport { AssistantMessageFrameEncoder, isRetryableAssistantError } from \"@earendil-works/pi-ai\";\nimport { estimateContextTokens } from \"@earendil-works/pi-ai/utils/estimate\";\nimport { planManagedEntry, prepareDraft, type SystemInstructionsHooks, sameSnapshot, takeSnapshot } from \"../system.ts\";\nimport {\n\ttype Closure,\n\ttype Completion,\n\ttype CoreKind,\n\ttype CoreTx,\n\ttype HookInfo,\n\ttype HookResult,\n\ttype Id,\n\ttype ModelRef,\n\ttype RequestMessage,\n\ttype RetryPolicy,\n\ttype Runtime,\n\ttype Step,\n\ttype Stored,\n\ttype Task,\n\ttype ThinkingLevel,\n\ttoStored,\n} from \"../types.ts\";\nimport { chooseThrough } from \"./collapse.ts\";\nimport { applyFrame } from \"./frames.ts\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport type GenerationInput = { inputs: Id[] };\n/** Captured once at `prepared`; carried unchanged except `attempt`. */\ntype Prep = {\n\tcutoff: Id;\n\tsystem: Id | null;\n\tmodel: ModelRef;\n\tthinkingLevel: ThinkingLevel;\n\ttools: string[];\n\tretry: RetryPolicy;\n\tattempt: number;\n};\nexport type GenerationCheckpoint =\n\t| ({ phase: \"prepared\" } & Prep)\n\t| ({ phase: \"requesting\" } & Prep)\n\t| ({ phase: \"retrying\"; untilMs: number; lastError: string } & Prep)\n\t| ({ phase: \"deferred\"; handle: Stored<DeferredHandle>; pollAt: number } & Prep);\nexport type GenerationResult = { assistant: Id; tools: Id[]; postTools?: Id; successor?: Id };\nexport type GenerationFailure = {\n\treason: \"provider\" | \"overflow\" | \"retries_exhausted\" | \"no_model\";\n\tdetail: string;\n\tassistant?: Id;\n};\n\n/** Display-only assistant entries (provider error, aborted partial) carry the message here, never in `model`. */\nexport type DisplayAssistantData = { attempt: number; display: Stored<AssistantMessage>; reason: \"error\" | \"aborted\" };\n\n/** Hook points this kind calls. Register with `h.hooks(namespace, kinds.generation, { … })`. */\nexport interface GenerationHooks extends SystemInstructionsHooks {\n\t/** Before every request (also on retry and recovery). Chain. */\n\tbeforeRequest(\n\t\trequest: { messages: RequestMessage[] },\n\t\tinfo: HookInfo & { cutoff: Id },\n\t\tctx: Context,\n\t): HookResult<{ messages: RequestMessage[] }>;\n\t/** Every terminal provider message, before classification. Observer. */\n\tafterResponse(message: AssistantMessage, info: HookInfo & { attempt: number }, ctx: Context): void | Promise<void>;\n\t/** On a final answer with nothing queued. First `{ continue }` wins and starts a continuation. */\n\tonYield(answer: AssistantMessage, info: HookInfo, ctx: Context): HookResult<{ continue: string }>;\n}\n\n/** Configuration this kind reads, with defaults. `model` has none: absent → failed/no_model. */\nexport const generationConfig = {\n\trewindable: {\n\t\tmodel: undefined as ModelRef | undefined,\n\t\tthinkingLevel: \"off\" as ThinkingLevel,\n\t\tselectedTools: [] as string[],\n\t\tprofile: \"default\" as string,\n\t},\n\tsticky: { retry: { enabled: true, maxRetries: 3, baseDelayMs: 2000, maxAgentDelayMs: 60_000 } as RetryPolicy },\n} as const;\n\ntype G = Task<GenerationInput, GenerationCheckpoint>;\ntype Rt = Runtime<GenerationHooks, CoreTx>;\ntype S = Step<GenerationCheckpoint, GenerationResult, GenerationFailure, CoreTx>;\ntype Out = Closure<GenerationResult, GenerationFailure, CoreTx>;\n\nconst fail = (\n\treason: GenerationFailure[\"reason\"],\n\tdetail: string,\n\tassistant?: Id,\n): Completion<GenerationResult, GenerationFailure> => ({\n\tstatus: \"failed\",\n\tfailure: { reason, detail, ...(assistant === undefined ? {} : { assistant }) },\n});\n/** Every terminal generation failure settles its group and admits queued triggers at the final boundary. */\nconst failStep = (task: G, reason: GenerationFailure[\"reason\"], detail: string): S => ({\n\tdone: async (tx, current) => {\n\t\tconst head = await tx.newestEntry(current.conversationId, { withHead: true });\n\t\ttx.emit({ type: \"generation.failed\", taskId: current.id, reason, detail });\n\t\tawait settleFailedTurn(tx, current, task.input.inputs, detail, head?.id);\n\t\treturn fail(reason, detail);\n\t},\n});\n/** pi-ai drops system messages and aborted/error assistant messages before sending; estimate what is sent. */\nconst estimate = (messages: RequestMessage[]) =>\n\testimateContextTokens(\n\t\tmessages.filter(\n\t\t\t(m) =>\n\t\t\t\tm.role !== \"system\" &&\n\t\t\t\t!(m.role === \"assistant\" && (m.stopReason === \"aborted\" || m.stopReason === \"error\")),\n\t\t) as never,\n\t).tokens;\nconst emptyUsage = (): AssistantMessage[\"usage\"] => ({\n\tinput: 0,\n\toutput: 0,\n\tcacheRead: 0,\n\tcacheWrite: 0,\n\ttotalTokens: 0,\n\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n});\n\n// ---------------------------------------------------------------------------\n// The kind\n// ---------------------------------------------------------------------------\n\nexport const generation: CoreKind<\n\tGenerationInput,\n\tGenerationCheckpoint,\n\tGenerationResult,\n\tGenerationFailure,\n\t{ assistant?: Id },\n\tGenerationHooks,\n\ttypeof generationConfig\n> = {\n\tname: \"pi.generation\",\n\tturn: true,\n\tconfig: generationConfig,\n\tinflight: [\"requesting\"],\n\n\t// Step 1 (§12.5): snapshot S on the line; systemInstructions off the line; then in one\n\t// commit re-take S′, retry if it moved, else append the managed entry and checkpoint\n\t// `prepared` with the cutoff. Runs once per generation; never on recovery.\n\tasync initial(task, rt, ctx) {\n\t\tconst { snapshot, canonical, seed } = await rt.commit(\n\t\t\t(tx, current) => takeSnapshot(tx, current.conversationId, rt.registries.sections, rt.registries.tools),\n\t\t\tctx,\n\t\t);\n\t\tif (snapshot.settings.model === undefined) return failStep(task, \"no_model\", \"no model configured\");\n\t\tconst retry = (await rt.sticky(task.conversationId, ctx)).retry;\n\n\t\tconst warnings: string[] = [];\n\t\tconst { desired, tools } = await prepareDraft(\n\t\t\trt,\n\t\t\trt.registries.sections,\n\t\t\tcanonical,\n\t\t\tseed,\n\t\t\tsnapshot.settings,\n\t\t\t(message) => warnings.push(message),\n\t\t\tctx,\n\t\t);\n\t\tconst model = snapshot.settings.model as unknown as ModelRef;\n\t\tconst thinkingLevel = snapshot.settings.thinkingLevel as ThinkingLevel;\n\n\t\treturn {\n\t\t\tnext: async (tx, current) => {\n\t\t\t\tconst c = current.conversationId;\n\t\t\t\tconst again = await takeSnapshot(tx, c, rt.registries.sections, rt.registries.tools);\n\t\t\t\tif (!sameSnapshot(again.snapshot, snapshot)) return \"retry\";\n\t\t\t\tconst plan = await planManagedEntry(tx, c, snapshot, canonical, desired, tools, rt.now());\n\t\t\t\tfor (const message of warnings) tx.emit({ type: \"warning\", source: \"generation\", message });\n\t\t\t\tconst system = plan === undefined ? null : tx.appendEntry(c, { kind: \"pi.system\", ...plan });\n\t\t\t\tconst cutoff = system ?? (await tx.newestEntry(c))!.id;\n\t\t\t\ttx.sticky(c).turn = { tools: [] }; // a new generation starts a fresh turn view\n\t\t\t\treturn {\n\t\t\t\t\tphase: \"prepared\",\n\t\t\t\t\tcutoff,\n\t\t\t\t\tsystem,\n\t\t\t\t\tmodel,\n\t\t\t\t\tthinkingLevel,\n\t\t\t\t\ttools: tools.map((t) => t.name),\n\t\t\t\t\tretry,\n\t\t\t\t\tattempt: 0,\n\t\t\t\t};\n\t\t\t},\n\t\t};\n\t},\n\n\tphases: {\n\t\t// Step 2: derive the request from the cutoff (hooks rerun), overflow check, write the\n\t\t// in-flight checkpoint, call the provider. Reached fresh from `initial`/`retrying`,\n\t\t// and again on recovery of `prepared` (step 1 never reruns).\n\t\tasync prepared(task, rt, ctx) {\n\t\t\tconst cp = task.checkpoint;\n\t\t\tconst model = rt.models.resolve(cp.model);\n\t\t\tif (model === undefined)\n\t\t\t\treturn failStep(task, \"no_model\", `model ${cp.model.provider}/${cp.model.modelId} unavailable`);\n\t\t\tconst derived = await derive(task, cp, rt, ctx);\n\t\t\tif (estimate(derived.messages) > model.contextWindow - model.maxTokens) return overflow(task, rt);\n\t\t\tconst attempt = cp.attempt + 1;\n\t\t\tawait rt.commit((tx) => {\n\t\t\t\ttx.checkpoint({ ...cp, phase: \"requesting\", attempt });\n\t\t\t\ttx.emit({ type: \"generation.started\", taskId: task.id, attempt });\n\t\t\t}, ctx); // before the effect\n\t\t\tconst { terminal, deferred } = await stream(cp, model, derived.messages, rt, ctx);\n\t\t\tif (deferred !== undefined) {\n\t\t\t\tconst pollAt = rt.now() + (deferred.pollAfterMs ?? 5000);\n\t\t\t\treturn {\n\t\t\t\t\tnext: (tx) => {\n\t\t\t\t\t\ttx.emit({ type: \"generation.deferred\", taskId: task.id, pollAt });\n\t\t\t\t\t\treturn { ...cp, phase: \"deferred\", attempt, handle: toStored(deferred), pollAt };\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t}\n\t\t\treturn classify(task, { ...cp, attempt }, terminal!, rt, ctx);\n\t\t},\n\n\t\t// Only reached by the scheduler after a crash: the call may have happened and there\n\t\t// is no result lookup. Count it as a failed attempt and retry per policy.\n\t\tasync requesting(task, rt) {\n\t\t\tconst cp = task.checkpoint;\n\t\t\tconst decision = retryDecision(cp, null, rt.now());\n\t\t\tif (decision.kind === \"fail\") return failStep(task, decision.reason, \"interrupted\");\n\t\t\treturn {\n\t\t\t\tnext: (tx, current) => {\n\t\t\t\t\ttx.appendEntry(current.conversationId, {\n\t\t\t\t\t\tkind: \"pi.usage\",\n\t\t\t\t\t\tdata: { attempt: cp.attempt, error: \"interrupted\" },\n\t\t\t\t\t});\n\t\t\t\t\ttx.emit({\n\t\t\t\t\t\ttype: \"generation.retrying\",\n\t\t\t\t\t\ttaskId: current.id,\n\t\t\t\t\t\tattempt: cp.attempt,\n\t\t\t\t\t\tretryAt: decision.untilMs,\n\t\t\t\t\t\terror: \"interrupted\",\n\t\t\t\t\t});\n\t\t\t\t\treturn { ...cp, phase: \"retrying\", untilMs: decision.untilMs, lastError: \"interrupted\" };\n\t\t\t\t},\n\t\t\t};\n\t\t},\n\n\t\t// Durable backoff, then back to step 2. Resets the streaming view.\n\t\tasync retrying(task, rt, ctx) {\n\t\t\tconst cp = task.checkpoint;\n\t\t\tawait rt.sleep(cp.untilMs, ctx);\n\t\t\tconst { untilMs: _u, lastError: _e, ...prep } = cp;\n\t\t\treturn {\n\t\t\t\tnext: (tx, current) => {\n\t\t\t\t\ttx.sticky(current.conversationId).turn.message = undefined;\n\t\t\t\t\treturn { ...prep, phase: \"prepared\" };\n\t\t\t\t},\n\t\t\t};\n\t\t},\n\n\t\t// Provider-side async. Poll; not the retry backoff. Same after a crash: the handle is durable.\n\t\tasync deferred(task, rt, ctx) {\n\t\t\tconst cp = task.checkpoint;\n\t\t\tconst model = rt.models.resolve(cp.model);\n\t\t\tif (model === undefined) return failStep(task, \"no_model\", \"model disappeared\");\n\t\t\tawait rt.sleep(cp.pollAt, ctx);\n\t\t\tconst result = await rt.models.fetchDeferred(model, cp.handle, ctx);\n\t\t\tif (\"deferred\" in result && result.deferred !== undefined) {\n\t\t\t\tconst pollAt = rt.now() + (result.deferred.pollAfterMs ?? 5000);\n\t\t\t\treturn {\n\t\t\t\t\tnext: (tx) => {\n\t\t\t\t\t\ttx.emit({ type: \"generation.deferred\", taskId: task.id, pollAt });\n\t\t\t\t\t\treturn { ...cp, handle: toStored(result.deferred), pollAt };\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t}\n\t\t\tconst message = result as AssistantMessage;\n\t\t\tawait rt.commit((tx, current) => {\n\t\t\t\ttx.sticky(current.conversationId).turn.message = toStored(message);\n\t\t\t}, ctx);\n\t\t\tconst { handle: _handle, pollAt: _pollAt, ...prep } = cp;\n\t\t\treturn classify(task, prep, message, rt, ctx);\n\t\t},\n\t},\n\n\tasync abort(task, rt, ctx) {\n\t\tconst cp = task.checkpoint;\n\t\tif (cp?.phase === \"deferred\") {\n\t\t\tconst model = rt.models.resolve(cp.model);\n\t\t\tif (model) await rt.models.cancelDeferred(model, cp.handle as DeferredHandle, ctx).catch(() => {});\n\t\t}\n\t\treturn async (tx, current) => {\n\t\t\tconst partial = tx.sticky(current.conversationId).turn.message;\n\t\t\tlet assistant: Id | undefined;\n\t\t\t// Display-only: the partial goes in `data`, never in `model`, so it cannot enter a request.\n\t\t\tif (partial && partial.content.length > 0)\n\t\t\t\tassistant = tx.appendEntry(current.conversationId, {\n\t\t\t\t\tkind: \"pi.assistant\",\n\t\t\t\t\tdata: {\n\t\t\t\t\t\tattempt: cp?.attempt ?? 0,\n\t\t\t\t\t\tdisplay: { ...toStored(partial), stopReason: \"aborted\" },\n\t\t\t\t\t\treason: \"aborted\",\n\t\t\t\t\t} satisfies DisplayAssistantData,\n\t\t\t\t});\n\t\t\ttx.sticky(current.conversationId).turn = { tools: [] };\n\t\t\tawait tx.resolveInputs(task.input.inputs, { status: \"unanswered\", reason: \"aborted\" });\n\t\t\ttx.emit({ type: \"turn.ended\", inputs: task.input.inputs, status: \"unanswered\", reason: \"aborted\" });\n\t\t\treturn assistant === undefined ? {} : { assistant };\n\t\t};\n\t},\n};\n\n// ---------------------------------------------------------------------------\n// Request derivation and streaming\n// ---------------------------------------------------------------------------\n\nasync function derive(task: G, cp: Prep, rt: Rt, ctx: Context): Promise<{ messages: RequestMessage[] }> {\n\tconst { messages } = await rt.context(task.conversationId, cp.cutoff, ctx);\n\tlet request = { messages };\n\tawait rt.hooks.each(\n\t\tctx,\n\t\t(h, api) => h.beforeRequest?.(request, { ...api, cutoff: cp.cutoff }, ctx),\n\t\t(value) => {\n\t\t\tif (value !== undefined) request = value;\n\t\t},\n\t);\n\treturn request;\n}\n\n/** Stream, coalescing frames into the turn view. Flush on size or time. */\nasync function stream(\n\tcp: Prep,\n\tmodel: NonNullable<ReturnType<Rt[\"models\"][\"resolve\"]>>,\n\tmessages: RequestMessage[],\n\trt: Rt,\n\tctx: Context,\n): Promise<{ terminal?: AssistantMessage; deferred?: DeferredHandle }> {\n\tconst encoder = new AssistantMessageFrameEncoder();\n\tlet pending: AssistantMessageFrame[] = [];\n\tlet pendingBytes = 0;\n\tlet lastFlush = rt.now();\n\tlet terminal: AssistantMessage | undefined;\n\tlet deferred: DeferredHandle | undefined;\n\tlet flushedContent = false;\n\tconst flush = async () => {\n\t\tconst batch = pending;\n\t\tif (batch.length === 0) return;\n\t\tpending = [];\n\t\tpendingBytes = 0;\n\t\tlastFlush = rt.now();\n\t\tif (batch.some((frame) => \"delta\" in frame)) flushedContent = true;\n\t\tawait rt.commit((tx, current) => {\n\t\t\tconst turn = tx.sticky(current.conversationId).turn;\n\t\t\tfor (const f of batch) applyFrame(turn as { message?: AssistantMessage }, f);\n\t\t}, ctx);\n\t};\n\ttry {\n\t\tconst iterator = rt.models\n\t\t\t.stream(model, { messages, thinkingLevel: cp.thinkingLevel }, ctx)\n\t\t\t[Symbol.asyncIterator]();\n\t\tlet pull = iterator.next();\n\t\tfor (;;) {\n\t\t\tconst selected: { kind: \"event\"; result: IteratorResult<AssistantMessageEvent> } | { kind: \"flush\" } =\n\t\t\t\tpending.length === 0\n\t\t\t\t\t? { kind: \"event\", result: await pull }\n\t\t\t\t\t: await Promise.race([\n\t\t\t\t\t\t\tpull.then((result) => ({ kind: \"event\" as const, result })),\n\t\t\t\t\t\t\trt.sleep(lastFlush + 100, ctx).then(() => ({ kind: \"flush\" as const })),\n\t\t\t\t\t\t]);\n\t\t\tif (selected.kind === \"flush\") {\n\t\t\t\tawait flush();\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (selected.result.done) break;\n\t\t\tconst event = selected.result.value;\n\t\t\tif (event.type === \"done\") {\n\t\t\t\tencoder.encode(event);\n\t\t\t\tif (event.reason === \"deferred\" && event.message.deferred !== undefined) deferred = event.message.deferred;\n\t\t\t\telse terminal = event.message;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif (event.type === \"error\") {\n\t\t\t\tencoder.encode(event);\n\t\t\t\tterminal = event.error;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tconst frame = encoder.encode(event);\n\t\t\tpull = iterator.next();\n\t\t\tif (frame === undefined) continue;\n\t\t\tpending.push(frame);\n\t\t\tpendingBytes += \"delta\" in frame ? frame.delta.length : 64;\n\t\t\tif (pendingBytes >= 256 || (!flushedContent && \"delta\" in frame)) await flush();\n\t\t}\n\t} catch (error) {\n\t\tif (ctx.abortSignal?.aborted) throw error;\n\t\tterminal = {\n\t\t\trole: \"assistant\",\n\t\t\tcontent: [],\n\t\t\tapi: model.api,\n\t\t\tprovider: model.provider,\n\t\t\tmodel: model.id,\n\t\t\tusage: emptyUsage(),\n\t\t\tstopReason: \"error\",\n\t\t\terrorMessage: String(error),\n\t\t\ttimestamp: rt.now(),\n\t\t};\n\t}\n\tif (pending.length > 0) await flush();\n\tif (terminal === undefined && deferred === undefined) throw new Error(\"stream ended without a terminal message\");\n\treturn { terminal, deferred };\n}\n\n// ---------------------------------------------------------------------------\n// Steps 3–5: classify the terminal message.\n// ---------------------------------------------------------------------------\n\nasync function classify(task: G, cp: Prep, message: AssistantMessage, rt: Rt, ctx: Context): Promise<S> {\n\tawait rt.hooks.each(ctx, (h, api) => h.afterResponse?.(message, { ...api, attempt: cp.attempt }, ctx));\n\n\tif (message.stopReason === \"error\") {\n\t\tconst decision = retryDecision(cp, message, rt.now());\n\t\tif (decision.kind === \"retry\") {\n\t\t\treturn {\n\t\t\t\tnext: (tx, current) => {\n\t\t\t\t\ttx.appendEntry(current.conversationId, {\n\t\t\t\t\t\tkind: \"pi.usage\",\n\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\tattempt: cp.attempt,\n\t\t\t\t\t\t\tusage: toStored(message.usage),\n\t\t\t\t\t\t\terror: message.errorMessage ?? \"provider error\",\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t\ttx.emit({\n\t\t\t\t\t\ttype: \"generation.retrying\",\n\t\t\t\t\t\ttaskId: current.id,\n\t\t\t\t\t\tattempt: cp.attempt,\n\t\t\t\t\t\tretryAt: decision.untilMs,\n\t\t\t\t\t\terror: message.errorMessage ?? \"provider error\",\n\t\t\t\t\t});\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...cp,\n\t\t\t\t\t\tphase: \"retrying\",\n\t\t\t\t\t\tuntilMs: decision.untilMs,\n\t\t\t\t\t\tlastError: message.errorMessage ?? \"provider error\",\n\t\t\t\t\t};\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\t\treturn { done: terminalError(task, cp, message, decision.reason) };\n\t}\n\tif (message.stopReason === \"aborted\") return { done: terminalError(task, cp, message, \"provider\") };\n\n\tconst calls = message.content.filter((c): c is ToolCall => c.type === \"toolCall\");\n\tconst stored = toStored(message);\n\tif (calls.length > 0) {\n\t\treturn {\n\t\t\tdone: async (tx, current) => {\n\t\t\t\tconst c = current.conversationId;\n\t\t\t\tconst collapseThrough = await thresholdCollapseThrough(tx, c, message); // read BEFORE the append\n\t\t\t\tconst assistant = tx.appendEntry(c, {\n\t\t\t\t\tkind: \"pi.assistant\",\n\t\t\t\t\tmodel: [stored],\n\t\t\t\t\tdata: { attempt: cp.attempt },\n\t\t\t\t});\n\t\t\t\tconst turn = tx.sticky(c).turn;\n\t\t\t\tturn.message = undefined;\n\t\t\t\tturn.tools = calls.map((call) => ({\n\t\t\t\t\tcallId: call.id,\n\t\t\t\t\tname: call.name,\n\t\t\t\t\targs: toStored(call.arguments),\n\t\t\t\t\tstatus: \"pending\",\n\t\t\t\t}));\n\t\t\t\tconst tools = calls.map((call, index) =>\n\t\t\t\t\ttx.createTask({ kind: \"pi.tool\", input: { assistant, call: toStored(call), offered: cp.tools, index } }),\n\t\t\t\t);\n\t\t\t\tconst postTools = tx.createTask({\n\t\t\t\t\tkind: \"pi.post_tools\",\n\t\t\t\t\tafter: tools,\n\t\t\t\t\tinput: { inputs: task.input.inputs, assistant, tools },\n\t\t\t\t});\n\t\t\t\tif (collapseThrough !== undefined)\n\t\t\t\t\ttx.createTask({ kind: \"pi.collapse\", input: { reason: \"threshold\", through: collapseThrough } });\n\t\t\t\ttx.emit({ type: \"generation.completed\", taskId: current.id, entry: assistant, toolCalls: calls.length });\n\t\t\t\treturn { status: \"completed\", result: { assistant, tools, postTools } };\n\t\t\t},\n\t\t};\n\t}\n\n\tlet continueText: string | undefined;\n\tawait rt.hooks.each(\n\t\tctx,\n\t\t(h, api) => h.onYield?.(message, api, ctx),\n\t\t(value) => {\n\t\t\tif (value === undefined) return;\n\t\t\tcontinueText = value.continue;\n\t\t\treturn true;\n\t\t},\n\t);\n\treturn {\n\t\tdone: async (tx, current) => {\n\t\t\tconst c = current.conversationId;\n\t\t\tconst collapseThrough = await thresholdCollapseThrough(tx, c, message); // read BEFORE the append\n\t\t\tconst head = await tx.newestEntry(c, { withHead: true });\n\t\t\tconst assistant = tx.appendEntry(c, { kind: \"pi.assistant\", model: [stored], data: { attempt: cp.attempt } });\n\t\t\ttx.emit({ type: \"generation.completed\", taskId: current.id, entry: assistant, toolCalls: 0 });\n\t\t\ttx.sticky(c).turn = { tools: [] };\n\t\t\tif (collapseThrough !== undefined)\n\t\t\t\ttx.createTask({ kind: \"pi.collapse\", input: { reason: \"threshold\", through: collapseThrough } });\n\t\t\tconst { triggers, terminated } = await tx.boundary(c, \"final\", head?.id);\n\t\t\tif (continueText !== undefined && triggers.length === 0 && !terminated) {\n\t\t\t\ttx.appendEntry(c, {\n\t\t\t\t\tkind: \"pi.user\",\n\t\t\t\t\tmodel: [{ role: \"user\", content: continueText, timestamp: rt.now() }],\n\t\t\t\t\tdata: { continuation: true, from: assistant },\n\t\t\t\t});\n\t\t\t\tconst successor = tx.createTask({ kind: \"pi.generation\", input: { inputs: task.input.inputs } });\n\t\t\t\treturn { status: \"completed\", result: { assistant, tools: [], successor } };\n\t\t\t}\n\t\t\tawait tx.resolveInputs(task.input.inputs, { status: \"done\", answer: assistant });\n\t\t\ttx.emit({ type: \"turn.ended\", inputs: task.input.inputs, status: \"done\", answer: assistant });\n\t\t\tif (triggers.length > 0) {\n\t\t\t\tconst successor = tx.createTask({ kind: \"pi.generation\", input: { inputs: triggers } });\n\t\t\t\ttx.emit({ type: \"turn.started\", inputs: triggers });\n\t\t\t\treturn { status: \"completed\", result: { assistant, tools: [], successor } };\n\t\t\t}\n\t\t\treturn { status: \"completed\", result: { assistant, tools: [] } };\n\t\t},\n\t};\n}\n\n/** Provider error / aborted stop: a display-only assistant entry (no `model`), inputs unanswered. */\nfunction terminalError(task: G, cp: Prep, message: AssistantMessage, reason: \"provider\" | \"retries_exhausted\"): Out {\n\treturn async (tx, current) => {\n\t\tconst head = await tx.newestEntry(current.conversationId, { withHead: true });\n\t\tconst assistant = tx.appendEntry(current.conversationId, {\n\t\t\tkind: \"pi.assistant\",\n\t\t\tdata: {\n\t\t\t\tattempt: cp.attempt,\n\t\t\t\tdisplay: toStored(message),\n\t\t\t\treason: message.stopReason === \"aborted\" ? \"aborted\" : \"error\",\n\t\t\t} satisfies DisplayAssistantData,\n\t\t});\n\t\ttx.emit({\n\t\t\ttype: \"generation.failed\",\n\t\t\ttaskId: current.id,\n\t\t\treason,\n\t\t\tdetail: message.errorMessage ?? \"provider error\",\n\t\t\tentry: assistant,\n\t\t});\n\t\tawait settleFailedTurn(tx, current, task.input.inputs, message.errorMessage ?? \"provider error\", head?.id);\n\t\treturn fail(reason, message.errorMessage ?? \"provider error\", assistant);\n\t};\n}\n\nasync function settleFailedTurn(\n\ttx: CoreTx,\n\tcurrent: Task,\n\tinputs: readonly Id[],\n\tdetail: string,\n\theadBoundary: Id | undefined,\n): Promise<void> {\n\ttx.sticky(current.conversationId).turn = { tools: [] };\n\tawait tx.resolveInputs(inputs, { status: \"unanswered\", reason: \"failed\", detail });\n\ttx.emit({ type: \"turn.ended\", inputs: [...inputs], status: \"unanswered\", reason: \"failed\", detail });\n\tconst { triggers } = await tx.boundary(current.conversationId, \"final\", headBoundary);\n\tif (triggers.length > 0) {\n\t\ttx.createTask({ kind: \"pi.generation\", conversationId: current.conversationId, input: { inputs: triggers } });\n\t\ttx.emit({ type: \"turn.started\", inputs: triggers });\n\t}\n}\n\ntype RetryDecision = { kind: \"retry\"; untilMs: number } | { kind: \"fail\"; reason: \"provider\" | \"retries_exhausted\" };\nexport function retryDecision(\n\tcp: { retry: RetryPolicy; attempt: number },\n\tmessage: AssistantMessage | null,\n\tnow: number,\n): RetryDecision {\n\tif (message !== null && !isRetryableAssistantError(message)) return { kind: \"fail\", reason: \"provider\" };\n\tif (!cp.retry.enabled) return { kind: \"fail\", reason: \"provider\" };\n\tif (cp.attempt > cp.retry.maxRetries) return { kind: \"fail\", reason: \"retries_exhausted\" };\n\tconst delay = cp.retry.baseDelayMs * 2 ** Math.max(0, cp.attempt - 1);\n\tconst safeDelay = Number.isSafeInteger(delay) ? delay : Number.MAX_SAFE_INTEGER;\n\treturn { kind: \"retry\", untilMs: now + Math.min(safeDelay, cp.retry.maxAgentDelayMs ?? 60_000) };\n}\n\n// ---------------------------------------------------------------------------\n// Collapse triggers\n// ---------------------------------------------------------------------------\n\n/** Read-side of threshold collapse: computed before the assistant is appended, applied after. */\nasync function thresholdCollapseThrough(\n\ttx: CoreTx,\n\tconversationId: Id,\n\tmessage: AssistantMessage,\n): Promise<Id | undefined> {\n\tif ((await tx.tasks({ conversationId, kind: \"pi.collapse\", status: [\"pending\", \"running\"] })).length > 0)\n\t\treturn undefined;\n\tconst state = tx.rewindable(conversationId);\n\tif (state.threshold <= 0) return undefined;\n\tconst { entries, messages } = await tx.context(conversationId);\n\tconst used = Math.max(\n\t\t(message.usage?.input ?? 0) + (message.usage?.output ?? 0),\n\t\testimate([...messages, toStored(message)]),\n\t);\n\tif (used <= state.threshold) return undefined;\n\treturn chooseThrough(entries, state.keepRecent);\n}\n\nfunction overflow(task: G, rt: Rt): S {\n\treturn {\n\t\tdone: async (tx, current) => {\n\t\t\tconst c = current.conversationId;\n\t\t\tconst state = tx.rewindable(c);\n\t\t\tconst { entries, head } = await tx.context(c);\n\t\t\tconst through = chooseThrough(entries, state.keepRecent);\n\t\t\ttx.sticky(c).turn = { tools: [] };\n\t\t\tif (through === undefined) {\n\t\t\t\tawait tx.write(c, {\n\t\t\t\t\tkind: \"pi.notice\",\n\t\t\t\t\tmodel: [{ role: \"user\", content: \"Context too large; nothing to compact.\", timestamp: rt.now() }],\n\t\t\t\t});\n\t\t\t\ttx.emit({\n\t\t\t\t\ttype: \"generation.failed\",\n\t\t\t\t\ttaskId: current.id,\n\t\t\t\t\treason: \"overflow\",\n\t\t\t\t\tdetail: \"request exceeds context window and nothing is collapsible\",\n\t\t\t\t});\n\t\t\t\tawait settleFailedTurn(tx, current, task.input.inputs, \"overflow\", head?.id);\n\t\t\t\treturn fail(\"overflow\", \"request exceeds context window and nothing is collapsible\");\n\t\t\t}\n\t\t\tconst collapse = tx.createTask({ kind: \"pi.collapse\", input: { reason: \"overflow\", through } });\n\t\t\ttx.createTask({ kind: \"pi.generation\", after: [collapse], input: { inputs: task.input.inputs } });\n\t\t\ttx.emit({\n\t\t\t\ttype: \"generation.failed\",\n\t\t\t\ttaskId: current.id,\n\t\t\t\treason: \"overflow\",\n\t\t\t\tdetail: `collapsing through ${through}`,\n\t\t\t});\n\t\t\treturn fail(\"overflow\", `collapsing through ${through}`);\n\t\t},\n\t};\n}\n"]}
1
+ {"version":3,"file":"generation.js","sourceRoot":"","sources":["../../../../src/harness/pico3/kinds/generation.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Context } from \"@earendil-works/chord\";\nimport type {\n\tAssistantMessage,\n\tAssistantMessageEvent,\n\tAssistantMessageFrame,\n\tDeferredHandle,\n\tToolCall,\n} from \"@earendil-works/pi-ai\";\nimport { AssistantMessageFrameEncoder, isRetryableAssistantError } from \"@earendil-works/pi-ai\";\nimport { estimateContextTokens } from \"@earendil-works/pi-ai/utils/estimate\";\nimport { planManagedEntry, prepareDraft, type SystemInstructionsHooks, sameSnapshot, takeSnapshot } from \"../system.ts\";\nimport {\n\ttype Closure,\n\ttype Completion,\n\ttype CoreKind,\n\ttype CoreTx,\n\ttype HookInfo,\n\ttype HookResult,\n\ttype Id,\n\ttype ModelRef,\n\ttype RequestMessage,\n\ttype RetryPolicy,\n\ttype Runtime,\n\ttype Step,\n\ttype Stored,\n\ttype Task,\n\ttype ThinkingLevel,\n\ttoStored,\n} from \"../types.ts\";\nimport { chooseThrough } from \"./collapse.ts\";\nimport { applyFrame } from \"./frames.ts\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport type GenerationInput = { inputs: Id[] };\n/** Captured once at `prepared`; carried unchanged except `attempt`. */\ntype Prep = {\n\tcutoff: Id;\n\tsystem: Id | null;\n\tmodel: ModelRef;\n\tthinkingLevel: ThinkingLevel;\n\ttools: string[];\n\tretry: RetryPolicy;\n\tattempt: number;\n};\nexport type GenerationCheckpoint =\n\t| ({ phase: \"prepared\" } & Prep)\n\t| ({ phase: \"requesting\" } & Prep)\n\t| ({ phase: \"retrying\"; untilMs: number; lastError: string } & Prep)\n\t| ({ phase: \"deferred\"; handle: Stored<DeferredHandle>; pollAt: number } & Prep);\nexport type GenerationResult = { assistant: Id; tools: Id[]; postTools?: Id; successor?: Id };\nexport type GenerationFailure = {\n\treason: \"provider\" | \"overflow\" | \"retries_exhausted\" | \"no_model\";\n\tdetail: string;\n\tassistant?: Id;\n};\n\n/** Display-only assistant entries (provider error, aborted partial) carry the message here, never in `model`. */\nexport type DisplayAssistantData = { attempt: number; display: Stored<AssistantMessage>; reason: \"error\" | \"aborted\" };\n\n/** Hook points this kind calls. Register with `h.hooks(namespace, kinds.generation, { … })`. */\nexport interface GenerationHooks extends SystemInstructionsHooks {\n\t/** Before every request (also on retry and recovery). Chain. */\n\tbeforeRequest(\n\t\trequest: { messages: RequestMessage[] },\n\t\tinfo: HookInfo & { cutoff: Id },\n\t\tctx: Context,\n\t): HookResult<{ messages: RequestMessage[] }>;\n\t/** Every terminal provider message, before classification. Observer. */\n\tafterResponse(message: AssistantMessage, info: HookInfo & { attempt: number }, ctx: Context): void | Promise<void>;\n\t/** On a final answer with nothing queued. First `{ continue }` wins and starts a continuation. */\n\tonYield(answer: AssistantMessage, info: HookInfo, ctx: Context): HookResult<{ continue: string }>;\n}\n\n/** Configuration this kind reads, with defaults. `model` has none: absent → failed/no_model. */\nexport const generationConfig = {\n\trewindable: {\n\t\tmodel: undefined as ModelRef | undefined,\n\t\tthinkingLevel: \"off\" as ThinkingLevel,\n\t\tselectedTools: [] as string[],\n\t\tprofile: \"default\" as string,\n\t},\n\tsticky: { retry: { enabled: true, maxRetries: 3, baseDelayMs: 2000, maxAgentDelayMs: 60_000 } as RetryPolicy },\n} as const;\n\ntype G = Task<GenerationInput, GenerationCheckpoint>;\ntype Rt = Runtime<GenerationHooks, CoreTx>;\ntype S = Step<GenerationCheckpoint, GenerationResult, GenerationFailure, CoreTx>;\ntype Out = Closure<GenerationResult, GenerationFailure, CoreTx>;\n\nconst fail = (\n\treason: GenerationFailure[\"reason\"],\n\tdetail: string,\n\tassistant?: Id,\n): Completion<GenerationResult, GenerationFailure> => ({\n\tstatus: \"failed\",\n\tfailure: { reason, detail, ...(assistant === undefined ? {} : { assistant }) },\n});\n/** Every terminal generation failure settles its group and admits queued triggers at the final boundary. */\nconst failStep = (task: G, reason: GenerationFailure[\"reason\"], detail: string): S => ({\n\tdone: async (tx, current) => {\n\t\tconst head = await tx.newestEntry(current.conversationId, { withHead: true });\n\t\ttx.emit({ type: \"generation.failed\", taskId: current.id, reason, detail });\n\t\tawait settleFailedTurn(tx, current, task.input.inputs, detail, head?.id);\n\t\treturn fail(reason, detail);\n\t},\n});\n/** pi-ai drops system messages and aborted/error assistant messages before sending; estimate what is sent. */\nconst estimate = (messages: RequestMessage[]) =>\n\testimateContextTokens(\n\t\tmessages.filter(\n\t\t\t(m) =>\n\t\t\t\tm.role !== \"system\" &&\n\t\t\t\t!(m.role === \"assistant\" && (m.stopReason === \"aborted\" || m.stopReason === \"error\")),\n\t\t) as never,\n\t).tokens;\nconst emptyUsage = (): AssistantMessage[\"usage\"] => ({\n\tinput: 0,\n\toutput: 0,\n\tcacheRead: 0,\n\tcacheWrite: 0,\n\ttotalTokens: 0,\n\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n});\n\n// ---------------------------------------------------------------------------\n// The kind\n// ---------------------------------------------------------------------------\n\nexport const generation: CoreKind<\n\tGenerationInput,\n\tGenerationCheckpoint,\n\tGenerationResult,\n\tGenerationFailure,\n\t{ assistant?: Id },\n\tGenerationHooks,\n\ttypeof generationConfig\n> = {\n\tname: \"pi.generation\",\n\tturn: true,\n\tconfig: generationConfig,\n\tinflight: [\"requesting\"],\n\n\t// Step 1 (§12.5): snapshot S on the line; systemInstructions off the line; then in one\n\t// commit re-take S′, retry if it moved, else append the managed entry and checkpoint\n\t// `prepared` with the cutoff. Runs once per generation; never on recovery.\n\tasync initial(task, rt, ctx) {\n\t\tconst { snapshot, canonical, seed } = await rt.commit(\n\t\t\t(tx, current) => takeSnapshot(tx, current.conversationId, rt.registries.sections, rt.registries.tools),\n\t\t\tctx,\n\t\t);\n\t\tif (snapshot.settings.model === undefined) return failStep(task, \"no_model\", \"no model configured\");\n\t\tconst retry = (await rt.sticky(task.conversationId, ctx)).retry;\n\n\t\tconst warnings: string[] = [];\n\t\tconst { desired, tools } = await prepareDraft(\n\t\t\trt,\n\t\t\trt.registries.sections,\n\t\t\tcanonical,\n\t\t\tseed,\n\t\t\tsnapshot.settings,\n\t\t\t(message) => warnings.push(message),\n\t\t\tctx,\n\t\t);\n\t\tconst model = snapshot.settings.model as unknown as ModelRef;\n\t\tconst thinkingLevel = snapshot.settings.thinkingLevel as ThinkingLevel;\n\n\t\treturn {\n\t\t\tnext: async (tx, current) => {\n\t\t\t\tconst c = current.conversationId;\n\t\t\t\tconst again = await takeSnapshot(tx, c, rt.registries.sections, rt.registries.tools);\n\t\t\t\tif (!sameSnapshot(again.snapshot, snapshot)) return \"retry\";\n\t\t\t\tconst plan = await planManagedEntry(tx, c, snapshot, canonical, desired, tools, rt.now());\n\t\t\t\tfor (const message of warnings) tx.emit({ type: \"warning\", source: \"generation\", message });\n\t\t\t\tconst system = plan === undefined ? null : tx.appendEntry(c, { kind: \"pi.system\", ...plan });\n\t\t\t\tconst cutoff = system ?? (await tx.newestEntry(c))!.id;\n\t\t\t\ttx.sticky(c).turn = { tools: [] }; // a new generation starts a fresh turn view\n\t\t\t\treturn {\n\t\t\t\t\tphase: \"prepared\",\n\t\t\t\t\tcutoff,\n\t\t\t\t\tsystem,\n\t\t\t\t\tmodel,\n\t\t\t\t\tthinkingLevel,\n\t\t\t\t\ttools: tools.map((t) => t.name),\n\t\t\t\t\tretry,\n\t\t\t\t\tattempt: 0,\n\t\t\t\t};\n\t\t\t},\n\t\t};\n\t},\n\n\tphases: {\n\t\t// Step 2: derive the request from the cutoff (hooks rerun), overflow check, write the\n\t\t// in-flight checkpoint, call the provider. Reached fresh from `initial`/`retrying`,\n\t\t// and again on recovery of `prepared` (step 1 never reruns).\n\t\tasync prepared(task, rt, ctx) {\n\t\t\tconst cp = task.checkpoint;\n\t\t\tconst model = rt.models.resolve(cp.model);\n\t\t\tif (model === undefined)\n\t\t\t\treturn failStep(task, \"no_model\", `model ${cp.model.provider}/${cp.model.modelId} unavailable`);\n\t\t\tconst derived = await derive(task, cp, rt, ctx);\n\t\t\tif (estimate(derived.messages) > model.contextWindow - model.maxTokens) return overflow(task, rt);\n\t\t\tconst attempt = cp.attempt + 1;\n\t\t\tawait rt.commit((tx) => {\n\t\t\t\ttx.checkpoint({ ...cp, phase: \"requesting\", attempt });\n\t\t\t\ttx.emit({ type: \"generation.started\", taskId: task.id, attempt });\n\t\t\t}, ctx); // before the effect\n\t\t\tconst { terminal, deferred } = await stream(cp, model, derived.messages, rt, ctx);\n\t\t\tif (deferred !== undefined) {\n\t\t\t\tconst pollAt = rt.now() + (deferred.pollAfterMs ?? 5000);\n\t\t\t\treturn {\n\t\t\t\t\tnext: (tx) => {\n\t\t\t\t\t\ttx.emit({ type: \"generation.deferred\", taskId: task.id, pollAt });\n\t\t\t\t\t\treturn { ...cp, phase: \"deferred\", attempt, handle: toStored(deferred), pollAt };\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t}\n\t\t\treturn classify(task, { ...cp, attempt }, terminal!, rt, ctx);\n\t\t},\n\n\t\t// Only reached by the scheduler after a crash: the call may have happened and there\n\t\t// is no result lookup. Count it as a failed attempt and retry per policy.\n\t\tasync requesting(task, rt) {\n\t\t\tconst cp = task.checkpoint;\n\t\t\tconst decision = retryDecision(cp, null, rt.now());\n\t\t\tif (decision.kind === \"fail\") return failStep(task, decision.reason, \"interrupted\");\n\t\t\treturn {\n\t\t\t\tnext: (tx, current) => {\n\t\t\t\t\ttx.appendEntry(current.conversationId, {\n\t\t\t\t\t\tkind: \"pi.usage\",\n\t\t\t\t\t\tdata: { attempt: cp.attempt, error: \"interrupted\" },\n\t\t\t\t\t});\n\t\t\t\t\ttx.emit({\n\t\t\t\t\t\ttype: \"generation.retrying\",\n\t\t\t\t\t\ttaskId: current.id,\n\t\t\t\t\t\tattempt: cp.attempt,\n\t\t\t\t\t\tretryAt: decision.untilMs,\n\t\t\t\t\t\terror: \"interrupted\",\n\t\t\t\t\t});\n\t\t\t\t\treturn { ...cp, phase: \"retrying\", untilMs: decision.untilMs, lastError: \"interrupted\" };\n\t\t\t\t},\n\t\t\t};\n\t\t},\n\n\t\t// Durable backoff, then back to step 2. Resets the streaming view.\n\t\tasync retrying(task, rt, ctx) {\n\t\t\tconst cp = task.checkpoint;\n\t\t\tawait rt.sleep(cp.untilMs, ctx);\n\t\t\tconst { untilMs: _u, lastError: _e, ...prep } = cp;\n\t\t\treturn {\n\t\t\t\tnext: (tx, current) => {\n\t\t\t\t\ttx.sticky(current.conversationId).turn.message = undefined;\n\t\t\t\t\treturn { ...prep, phase: \"prepared\" };\n\t\t\t\t},\n\t\t\t};\n\t\t},\n\n\t\t// Provider-side async. Poll; not the retry backoff. Same after a crash: the handle is durable.\n\t\tasync deferred(task, rt, ctx) {\n\t\t\tconst cp = task.checkpoint;\n\t\t\tconst model = rt.models.resolve(cp.model);\n\t\t\tif (model === undefined) return failStep(task, \"no_model\", \"model disappeared\");\n\t\t\tawait rt.sleep(cp.pollAt, ctx);\n\t\t\tconst result = await rt.models.fetchDeferred(model, cp.handle, ctx);\n\t\t\tif (\"deferred\" in result && result.deferred !== undefined) {\n\t\t\t\tconst pollAt = rt.now() + (result.deferred.pollAfterMs ?? 5000);\n\t\t\t\treturn {\n\t\t\t\t\tnext: (tx) => {\n\t\t\t\t\t\ttx.emit({ type: \"generation.deferred\", taskId: task.id, pollAt });\n\t\t\t\t\t\treturn { ...cp, handle: toStored(result.deferred), pollAt };\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t}\n\t\t\tconst message = result as AssistantMessage;\n\t\t\tawait rt.commit((tx, current) => {\n\t\t\t\ttx.sticky(current.conversationId).turn.message = toStored(message);\n\t\t\t}, ctx);\n\t\t\tconst { handle: _handle, pollAt: _pollAt, ...prep } = cp;\n\t\t\treturn classify(task, prep, message, rt, ctx);\n\t\t},\n\t},\n\n\tasync abort(task, rt, ctx) {\n\t\tconst cp = task.checkpoint;\n\t\tif (cp?.phase === \"deferred\") {\n\t\t\tconst model = rt.models.resolve(cp.model);\n\t\t\tif (model) await rt.models.cancelDeferred(model, cp.handle as DeferredHandle, ctx).catch(() => {});\n\t\t}\n\t\treturn async (tx, current) => {\n\t\t\tconst partial = tx.sticky(current.conversationId).turn.message;\n\t\t\tlet assistant: Id | undefined;\n\t\t\t// Display-only: the partial goes in `data`, never in `model`, so it cannot enter a request.\n\t\t\tif (partial && partial.content.length > 0)\n\t\t\t\tassistant = tx.appendEntry(current.conversationId, {\n\t\t\t\t\tkind: \"pi.assistant\",\n\t\t\t\t\tdata: {\n\t\t\t\t\t\tattempt: cp?.attempt ?? 0,\n\t\t\t\t\t\tdisplay: { ...toStored(partial), stopReason: \"aborted\" },\n\t\t\t\t\t\treason: \"aborted\",\n\t\t\t\t\t} satisfies DisplayAssistantData,\n\t\t\t\t});\n\t\t\ttx.sticky(current.conversationId).turn = { tools: [] };\n\t\t\tawait tx.resolveInputs(task.input.inputs, { status: \"unanswered\", reason: \"aborted\" });\n\t\t\ttx.emit({ type: \"turn.ended\", inputs: task.input.inputs, status: \"unanswered\", reason: \"aborted\" });\n\t\t\treturn assistant === undefined ? {} : { assistant };\n\t\t};\n\t},\n};\n\n// ---------------------------------------------------------------------------\n// Request derivation and streaming\n// ---------------------------------------------------------------------------\n\nasync function derive(task: G, cp: Prep, rt: Rt, ctx: Context): Promise<{ messages: RequestMessage[] }> {\n\tconst { messages } = await rt.context(task.conversationId, cp.cutoff, ctx);\n\tlet request = { messages };\n\tawait rt.hooks.each(\n\t\tctx,\n\t\t(h, api) => h.beforeRequest?.(request, { ...api, cutoff: cp.cutoff }, ctx),\n\t\t(value) => {\n\t\t\tif (value !== undefined) request = value;\n\t\t},\n\t);\n\treturn request;\n}\n\n/** Stream, coalescing frames into the turn view. Flush on size or time. */\nasync function stream(\n\tcp: Prep,\n\tmodel: NonNullable<ReturnType<Rt[\"models\"][\"resolve\"]>>,\n\tmessages: RequestMessage[],\n\trt: Rt,\n\tctx: Context,\n): Promise<{ terminal?: AssistantMessage; deferred?: DeferredHandle }> {\n\tconst encoder = new AssistantMessageFrameEncoder();\n\tlet pending: AssistantMessageFrame[] = [];\n\tlet pendingBytes = 0;\n\tlet lastFlush = rt.now();\n\tlet terminal: AssistantMessage | undefined;\n\tlet deferred: DeferredHandle | undefined;\n\tlet flushedContent = false;\n\tconst flush = async () => {\n\t\tconst batch = pending;\n\t\tif (batch.length === 0) return;\n\t\tpending = [];\n\t\tpendingBytes = 0;\n\t\tlastFlush = rt.now();\n\t\tif (batch.some((frame) => \"delta\" in frame)) flushedContent = true;\n\t\tawait rt.commit((tx, current) => {\n\t\t\tconst turn = tx.sticky(current.conversationId).turn;\n\t\t\tfor (const f of batch) applyFrame(turn as { message?: AssistantMessage }, f);\n\t\t}, ctx);\n\t};\n\ttry {\n\t\tconst iterator = rt.models\n\t\t\t.stream(model, { messages, thinkingLevel: cp.thinkingLevel }, ctx)\n\t\t\t[Symbol.asyncIterator]();\n\t\tlet pull = iterator.next();\n\t\tfor (;;) {\n\t\t\tconst selected: { kind: \"event\"; result: IteratorResult<AssistantMessageEvent> } | { kind: \"flush\" } =\n\t\t\t\tpending.length === 0\n\t\t\t\t\t? { kind: \"event\", result: await pull }\n\t\t\t\t\t: await Promise.race([\n\t\t\t\t\t\t\tpull.then((result) => ({ kind: \"event\" as const, result })),\n\t\t\t\t\t\t\trt.sleep(lastFlush + 100, ctx).then(() => ({ kind: \"flush\" as const })),\n\t\t\t\t\t\t]);\n\t\t\tif (selected.kind === \"flush\") {\n\t\t\t\tawait flush();\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (selected.result.done) break;\n\t\t\tconst event = selected.result.value;\n\t\t\tif (event.type === \"done\") {\n\t\t\t\tencoder.encode(event);\n\t\t\t\tif (event.reason === \"deferred\" && event.message.deferred !== undefined) deferred = event.message.deferred;\n\t\t\t\telse terminal = event.message;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif (event.type === \"error\") {\n\t\t\t\tencoder.encode(event);\n\t\t\t\tterminal = event.error;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tconst frame = encoder.encode(event);\n\t\t\tpull = iterator.next();\n\t\t\tif (frame === undefined) continue;\n\t\t\tpending.push(frame);\n\t\t\tpendingBytes += \"delta\" in frame ? frame.delta.length : 64;\n\t\t\tif (pendingBytes >= 256 || (!flushedContent && \"delta\" in frame)) await flush();\n\t\t}\n\t} catch (error) {\n\t\tif (ctx.abortSignal?.aborted) throw error;\n\t\tterminal = {\n\t\t\trole: \"assistant\",\n\t\t\tcontent: [],\n\t\t\tapi: model.api,\n\t\t\tprovider: model.provider,\n\t\t\tmodel: model.id,\n\t\t\tusage: emptyUsage(),\n\t\t\tstopReason: \"error\",\n\t\t\terrorMessage: String(error),\n\t\t\ttimestamp: rt.now(),\n\t\t};\n\t}\n\tif (pending.length > 0) await flush();\n\tif (terminal === undefined && deferred === undefined) throw new Error(\"stream ended without a terminal message\");\n\treturn { terminal, deferred };\n}\n\n// ---------------------------------------------------------------------------\n// Steps 3–5: classify the terminal message.\n// ---------------------------------------------------------------------------\n\nasync function classify(task: G, cp: Prep, message: AssistantMessage, rt: Rt, ctx: Context): Promise<S> {\n\tawait rt.hooks.each(ctx, (h, api) => h.afterResponse?.(message, { ...api, attempt: cp.attempt }, ctx));\n\n\tif (message.stopReason === \"error\") {\n\t\tconst decision = retryDecision(cp, message, rt.now());\n\t\tif (decision.kind === \"retry\") {\n\t\t\treturn {\n\t\t\t\tnext: (tx, current) => {\n\t\t\t\t\ttx.appendEntry(current.conversationId, {\n\t\t\t\t\t\tkind: \"pi.usage\",\n\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\tattempt: cp.attempt,\n\t\t\t\t\t\t\tusage: toStored(message.usage),\n\t\t\t\t\t\t\terror: message.errorMessage ?? \"provider error\",\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t\ttx.emit({\n\t\t\t\t\t\ttype: \"generation.retrying\",\n\t\t\t\t\t\ttaskId: current.id,\n\t\t\t\t\t\tattempt: cp.attempt,\n\t\t\t\t\t\tretryAt: decision.untilMs,\n\t\t\t\t\t\terror: message.errorMessage ?? \"provider error\",\n\t\t\t\t\t});\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...cp,\n\t\t\t\t\t\tphase: \"retrying\",\n\t\t\t\t\t\tuntilMs: decision.untilMs,\n\t\t\t\t\t\tlastError: message.errorMessage ?? \"provider error\",\n\t\t\t\t\t};\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\t\treturn { done: terminalError(task, cp, message, decision.reason) };\n\t}\n\tif (message.stopReason === \"aborted\") return { done: terminalError(task, cp, message, \"provider\") };\n\n\tconst calls = message.content.filter((c): c is ToolCall => c.type === \"toolCall\");\n\tconst stored = toStored(message);\n\tif (calls.length > 0) {\n\t\treturn {\n\t\t\tdone: async (tx, current) => {\n\t\t\t\tconst c = current.conversationId;\n\t\t\t\tconst collapseThrough = await thresholdCollapseThrough(tx, c, message); // read BEFORE the append\n\t\t\t\tconst assistant = tx.appendEntry(c, {\n\t\t\t\t\tkind: \"pi.assistant\",\n\t\t\t\t\tmodel: [stored],\n\t\t\t\t\tdata: { attempt: cp.attempt },\n\t\t\t\t});\n\t\t\t\tconst turn = tx.sticky(c).turn;\n\t\t\t\tturn.message = undefined;\n\t\t\t\tturn.tools = calls.map((call) => ({\n\t\t\t\t\tcallId: call.id,\n\t\t\t\t\tname: call.name,\n\t\t\t\t\targs: toStored(call.arguments),\n\t\t\t\t\tstatus: \"pending\",\n\t\t\t\t}));\n\t\t\t\tconst tools = calls.map((call, index) =>\n\t\t\t\t\ttx.createTask({ kind: \"pi.tool\", input: { assistant, call: toStored(call), offered: cp.tools, index } }),\n\t\t\t\t);\n\t\t\t\tconst postTools = tx.createTask({\n\t\t\t\t\tkind: \"pi.post_tools\",\n\t\t\t\t\tafter: tools,\n\t\t\t\t\tinput: { inputs: task.input.inputs, assistant, tools },\n\t\t\t\t});\n\t\t\t\tif (collapseThrough !== undefined)\n\t\t\t\t\ttx.createTask({ kind: \"pi.collapse\", input: { reason: \"threshold\", through: collapseThrough } });\n\t\t\t\ttx.emit({ type: \"generation.completed\", taskId: current.id, entry: assistant, toolCalls: calls.length });\n\t\t\t\treturn { status: \"completed\", result: { assistant, tools, postTools } };\n\t\t\t},\n\t\t};\n\t}\n\n\tlet continueText: string | undefined;\n\tawait rt.hooks.each(\n\t\tctx,\n\t\t(h, api) => h.onYield?.(message, api, ctx),\n\t\t(value) => {\n\t\t\tif (value === undefined) return;\n\t\t\tcontinueText = value.continue;\n\t\t\treturn true;\n\t\t},\n\t);\n\treturn {\n\t\tdone: async (tx, current) => {\n\t\t\tconst c = current.conversationId;\n\t\t\tconst collapseThrough = await thresholdCollapseThrough(tx, c, message); // read BEFORE the append\n\t\t\tconst head = await tx.newestEntry(c, { withHead: true });\n\t\t\tconst assistant = tx.appendEntry(c, { kind: \"pi.assistant\", model: [stored], data: { attempt: cp.attempt } });\n\t\t\ttx.emit({ type: \"generation.completed\", taskId: current.id, entry: assistant, toolCalls: 0 });\n\t\t\ttx.sticky(c).turn = { tools: [] };\n\t\t\tif (collapseThrough !== undefined)\n\t\t\t\ttx.createTask({ kind: \"pi.collapse\", input: { reason: \"threshold\", through: collapseThrough } });\n\t\t\tconst { triggers, terminated } = await tx.boundary(c, \"final\", head?.id);\n\t\t\tif (continueText !== undefined && triggers.length === 0 && !terminated) {\n\t\t\t\ttx.appendEntry(c, {\n\t\t\t\t\tkind: \"pi.user\",\n\t\t\t\t\tmodel: [{ role: \"user\", content: continueText, timestamp: rt.now() }],\n\t\t\t\t\tdata: { continuation: true, from: assistant },\n\t\t\t\t});\n\t\t\t\tconst successor = tx.createTask({ kind: \"pi.generation\", input: { inputs: task.input.inputs } });\n\t\t\t\treturn { status: \"completed\", result: { assistant, tools: [], successor } };\n\t\t\t}\n\t\t\tawait tx.resolveInputs(task.input.inputs, { status: \"done\", answer: assistant });\n\t\t\ttx.emit({ type: \"turn.ended\", inputs: task.input.inputs, status: \"done\", answer: assistant });\n\t\t\tif (triggers.length > 0) {\n\t\t\t\tconst successor = tx.createTask({ kind: \"pi.generation\", input: { inputs: triggers } });\n\t\t\t\ttx.emit({ type: \"turn.started\", inputs: triggers });\n\t\t\t\treturn { status: \"completed\", result: { assistant, tools: [], successor } };\n\t\t\t}\n\t\t\treturn { status: \"completed\", result: { assistant, tools: [] } };\n\t\t},\n\t};\n}\n\n/** Provider error / aborted stop: a display-only assistant entry (no `model`), inputs unanswered. */\nfunction terminalError(task: G, cp: Prep, message: AssistantMessage, reason: \"provider\" | \"retries_exhausted\"): Out {\n\treturn async (tx, current) => {\n\t\tconst head = await tx.newestEntry(current.conversationId, { withHead: true });\n\t\tconst assistant = tx.appendEntry(current.conversationId, {\n\t\t\tkind: \"pi.assistant\",\n\t\t\tdata: {\n\t\t\t\tattempt: cp.attempt,\n\t\t\t\tdisplay: toStored(message),\n\t\t\t\treason: message.stopReason === \"aborted\" ? \"aborted\" : \"error\",\n\t\t\t} satisfies DisplayAssistantData,\n\t\t});\n\t\ttx.emit({\n\t\t\ttype: \"generation.failed\",\n\t\t\ttaskId: current.id,\n\t\t\treason,\n\t\t\tdetail: message.errorMessage ?? \"provider error\",\n\t\t\tentry: assistant,\n\t\t});\n\t\tawait settleFailedTurn(tx, current, task.input.inputs, message.errorMessage ?? \"provider error\", head?.id);\n\t\treturn fail(reason, message.errorMessage ?? \"provider error\", assistant);\n\t};\n}\n\nasync function settleFailedTurn(\n\ttx: CoreTx,\n\tcurrent: Task,\n\tinputs: readonly Id[],\n\tdetail: string,\n\theadBoundary: Id | undefined,\n): Promise<void> {\n\ttx.sticky(current.conversationId).turn = { tools: [] };\n\tawait tx.resolveInputs(inputs, { status: \"unanswered\", reason: \"failed\", detail });\n\ttx.emit({ type: \"turn.ended\", inputs: [...inputs], status: \"unanswered\", reason: \"failed\", detail });\n\tconst { triggers } = await tx.boundary(current.conversationId, \"final\", headBoundary);\n\tif (triggers.length > 0) {\n\t\ttx.createTask({ kind: \"pi.generation\", conversationId: current.conversationId, input: { inputs: triggers } });\n\t\ttx.emit({ type: \"turn.started\", inputs: triggers });\n\t}\n}\n\ntype RetryDecision = { kind: \"retry\"; untilMs: number } | { kind: \"fail\"; reason: \"provider\" | \"retries_exhausted\" };\nexport function retryDecision(\n\tcp: { retry: RetryPolicy; attempt: number },\n\tmessage: AssistantMessage | null,\n\tnow: number,\n): RetryDecision {\n\tif (message !== null && !isRetryableAssistantError(message)) return { kind: \"fail\", reason: \"provider\" };\n\tif (!cp.retry.enabled) return { kind: \"fail\", reason: \"provider\" };\n\tif (cp.attempt > cp.retry.maxRetries) return { kind: \"fail\", reason: \"retries_exhausted\" };\n\tconst delay = cp.retry.baseDelayMs * 2 ** Math.max(0, cp.attempt - 1);\n\tconst safeDelay = Number.isSafeInteger(delay) ? delay : Number.MAX_SAFE_INTEGER;\n\treturn { kind: \"retry\", untilMs: now + Math.min(safeDelay, cp.retry.maxAgentDelayMs ?? 60_000) };\n}\n\n// ---------------------------------------------------------------------------\n// Collapse triggers\n// ---------------------------------------------------------------------------\n\n/** Read-side of threshold collapse: computed before the assistant is appended, applied after. */\nasync function thresholdCollapseThrough(\n\ttx: CoreTx,\n\tconversationId: Id,\n\tmessage: AssistantMessage,\n): Promise<Id | undefined> {\n\tif ((await tx.tasks({ conversationId, kind: \"pi.collapse\", status: [\"pending\", \"running\"] })).length > 0)\n\t\treturn undefined;\n\tconst state = tx.rewindable(conversationId);\n\tif (state.threshold <= 0) return undefined;\n\tconst { entries, messages } = await tx.context(conversationId);\n\tconst used = Math.max(\n\t\t(message.usage?.input ?? 0) + (message.usage?.output ?? 0),\n\t\testimate([...messages, toStored(message)]),\n\t);\n\tif (used <= state.threshold) return undefined;\n\treturn chooseThrough(entries, state.keepRecent);\n}\n\nfunction overflow(task: G, rt: Rt): S {\n\treturn {\n\t\tdone: async (tx, current) => {\n\t\t\tconst c = current.conversationId;\n\t\t\tconst state = tx.rewindable(c);\n\t\t\tconst { entries, head } = await tx.context(c);\n\t\t\tconst through = chooseThrough(entries, state.keepRecent);\n\t\t\ttx.sticky(c).turn = { tools: [] };\n\t\t\tif (through === undefined) {\n\t\t\t\tawait tx.write(c, {\n\t\t\t\t\tkind: \"pi.notice\",\n\t\t\t\t\tmodel: [{ role: \"user\", content: \"Context too large; nothing to compact.\", timestamp: rt.now() }],\n\t\t\t\t});\n\t\t\t\ttx.emit({\n\t\t\t\t\ttype: \"generation.failed\",\n\t\t\t\t\ttaskId: current.id,\n\t\t\t\t\treason: \"overflow\",\n\t\t\t\t\tdetail: \"request exceeds context window and nothing is collapsible\",\n\t\t\t\t});\n\t\t\t\tawait settleFailedTurn(tx, current, task.input.inputs, \"overflow\", head?.id);\n\t\t\t\treturn fail(\"overflow\", \"request exceeds context window and nothing is collapsible\");\n\t\t\t}\n\t\t\tconst collapse = tx.createTask({ kind: \"pi.collapse\", input: { reason: \"overflow\", through } });\n\t\t\ttx.createTask({ kind: \"pi.generation\", after: [collapse], input: { inputs: task.input.inputs } });\n\t\t\ttx.emit({\n\t\t\t\ttype: \"generation.failed\",\n\t\t\t\ttaskId: current.id,\n\t\t\t\treason: \"overflow\",\n\t\t\t\tdetail: `collapsing through ${through}`,\n\t\t\t});\n\t\t\treturn fail(\"overflow\", `collapsing through ${through}`);\n\t\t},\n\t};\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"job.d.ts","sourceRoot":"","sources":["../../../../src/harness/pico3/kinds/job.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAc,IAAI,EAAE,UAAU,EAAE,WAAW,EAAsC,MAAM,aAAa,CAAC;AAEjH,MAAM,MAAM,QAAQ,GAAG;KAAG,CAAC,IAAI,MAAM,WAAW,GAAG,WAAW,CAAC,CAAC,CAAC;CAAE,GAAG;IACrE,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AACF,MAAM,MAAM,aAAa,GACtB;IAAE,KAAK,EAAE,SAAS,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GACzD;IAAE,KAAK,EAAE,UAAU,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GACtD;IAAE,KAAK,EAAE,SAAS,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC;AACzD,MAAM,MAAM,SAAS,GAAG;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AACF,MAAM,MAAM,SAAS,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAClG,MAAM,MAAM,UAAU,GAAG;IAAE,MAAM,EAAE,OAAO,GAAG,aAAa,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AA0D7E,eAAO,MAAM,GAAG;;sIAAyB,CAAC","sourcesContent":["import type { Context } from \"@earendil-works/chord\";\nimport type { Completion, Kind, KindConfig, ProcessSpec, ProcessStatus, Runtime, Step, Task } from \"../types.ts\";\n\nexport type JobInput = { [K in keyof ProcessSpec]: ProcessSpec[K] } & {\n\tnotify: boolean;\n\trerun: boolean;\n\tevery?: number;\n\tnotBefore?: number;\n};\nexport type JobCheckpoint =\n\t| { phase: \"waiting\"; untilMs: number; occurrence: number }\n\t| { phase: \"spawning\"; key: string; occurrence: number }\n\t| { phase: \"running\"; key: string; occurrence: number };\nexport type JobOutput = {\n\tstdout?: string;\n\tstderr?: string;\n\tdroppedStdout?: number;\n\tdroppedStderr?: number;\n\texitCode?: number;\n\toccurrence?: number;\n};\nexport type JobResult = { exitCode: number; occurrences: number; stdout: string; stderr: string };\nexport type JobFailure = { reason: \"spawn\" | \"interrupted\"; detail: string };\ntype JobTask = Task<JobInput, JobCheckpoint>;\ntype JobStep = Step<JobCheckpoint, JobResult, JobFailure>;\nconst failed = (reason: JobFailure[\"reason\"], detail: string): Completion<JobResult, JobFailure> => ({\n\tstatus: \"failed\",\n\tfailure: { reason, detail },\n});\nconst notice = (text: string, now: number) => ({\n\tkind: \"pi.notice\",\n\tmodel: [{ role: \"user\" as const, content: text, timestamp: now }],\n});\n\nconst jobKind: Kind<\n\tJobInput,\n\tJobCheckpoint,\n\tJobResult,\n\tJobFailure,\n\t{ killed: boolean },\n\tobject,\n\tKindConfig,\n\tJobOutput\n> = {\n\tname: \"pi.job\",\n\tslot: () => ({}),\n\tdescribe: (task) => ({\n\t\tstage: task.checkpoint?.phase ?? \"starting\",\n\t\t...(task.slot ?? {}),\n\t}),\n\tinflight: [\"spawning\", \"running\"],\n\tphases: {\n\t\tasync waiting(task, runtime, ctx) {\n\t\t\tawait runtime.sleep(task.checkpoint.untilMs, ctx);\n\t\t\treturn spawn(task, task.checkpoint.occurrence, runtime, ctx);\n\t\t},\n\t\tasync spawning(task, runtime, ctx) {\n\t\t\treturn reconcile(task, task.checkpoint, runtime, ctx);\n\t\t},\n\t\tasync running(task, runtime, ctx) {\n\t\t\treturn reconcile(task, task.checkpoint, runtime, ctx);\n\t\t},\n\t},\n\tasync initial(task, runtime, ctx) {\n\t\tif (runtime.processHost === undefined) return { done: () => failed(\"spawn\", \"no process host\") };\n\t\tconst now = runtime.now();\n\t\tconst untilMs = task.input.notBefore ?? now;\n\t\tif (untilMs > now) return { next: { phase: \"waiting\", untilMs, occurrence: 1 } };\n\t\treturn spawn(task, 1, runtime, ctx);\n\t},\n\tasync abort(task, runtime, ctx) {\n\t\tconst checkpoint = task.checkpoint;\n\t\tif (checkpoint === undefined || checkpoint.phase === \"waiting\" || runtime.processHost === undefined)\n\t\t\treturn async () => ({ killed: false });\n\t\tawait runtime.processHost.kill(checkpoint.key, \"SIGTERM\", ctx);\n\t\tawait runtime.sleep(runtime.now() + 5000, ctx);\n\t\tawait runtime.processHost.kill(checkpoint.key, \"SIGKILL\", ctx);\n\t\treturn async () => ({ killed: true });\n\t},\n};\nexport const job = Object.freeze(jobKind);\n\nasync function spawn(task: JobTask, occurrence: number, runtime: Runtime, ctx: Context): Promise<JobStep> {\n\tconst key = `${task.id}:${occurrence}`;\n\tawait runtime.commit((tx) => tx.checkpoint({ phase: \"spawning\", key, occurrence }), ctx);\n\ttry {\n\t\tawait runtime.processHost!.start(key, task.input, ctx);\n\t} catch (error) {\n\t\tif (ctx.abortSignal?.aborted) throw error;\n\t\treturn {\n\t\t\tdone: async (tx, current) => {\n\t\t\t\tif (task.input.notify)\n\t\t\t\t\tawait tx.write(\n\t\t\t\t\t\tcurrent.conversationId,\n\t\t\t\t\t\tnotice(`job ${task.id} failed to start: ${String(error)}`, runtime.now()),\n\t\t\t\t\t);\n\t\t\t\treturn failed(\"spawn\", String(error));\n\t\t\t},\n\t\t};\n\t}\n\tawait runtime.commit((tx) => tx.checkpoint({ phase: \"running\", key, occurrence }), ctx);\n\treturn poll(task, key, occurrence, runtime, ctx);\n}\n\nasync function reconcile(\n\ttask: JobTask,\n\tcheckpoint: Extract<JobCheckpoint, { phase: \"spawning\" | \"running\" }>,\n\truntime: Runtime,\n\tctx: Context,\n): Promise<JobStep> {\n\tif (runtime.processHost === undefined) return { done: () => failed(\"interrupted\", \"no process host after restart\") };\n\tlet status: ProcessStatus;\n\ttry {\n\t\tstatus = await runtime.processHost.status(checkpoint.key, ctx);\n\t} catch (error) {\n\t\treturn { done: () => failed(\"interrupted\", `host status failed: ${String(error)}`) };\n\t}\n\tif (status.status === \"unknown\") {\n\t\tif (!task.input.rerun) return { done: () => failed(\"interrupted\", \"process outcome unknown\") };\n\t\treturn spawn(task, checkpoint.occurrence, runtime, ctx);\n\t}\n\tif (checkpoint.phase === \"spawning\") {\n\t\tawait runtime.commit(\n\t\t\t(tx) => tx.checkpoint({ phase: \"running\", key: checkpoint.key, occurrence: checkpoint.occurrence }),\n\t\t\tctx,\n\t\t);\n\t}\n\treturn poll(task, checkpoint.key, checkpoint.occurrence, runtime, ctx);\n}\n\nasync function poll(task: JobTask, key: string, occurrence: number, runtime: Runtime, ctx: Context): Promise<JobStep> {\n\tfor (let attempt = 0; ; attempt++) {\n\t\tlet status: ProcessStatus;\n\t\ttry {\n\t\t\tstatus = await runtime.processHost!.status(key, ctx);\n\t\t} catch (error) {\n\t\t\treturn { done: () => failed(\"interrupted\", `host status failed: ${String(error)}`) };\n\t\t}\n\t\tif (status.status === \"unknown\") {\n\t\t\tif (!task.input.rerun) return { done: () => failed(\"interrupted\", \"process outcome unknown\") };\n\t\t\treturn spawn(task, occurrence, runtime, ctx);\n\t\t}\n\t\tconst snapshot = status;\n\t\tawait runtime.commit((tx, current) => {\n\t\t\tconst output = tx.slot({ id: current.id, kind: jobKind });\n\t\t\toutput.stdout = snapshot.stdout;\n\t\t\toutput.stderr = snapshot.stderr;\n\t\t\toutput.droppedStdout = snapshot.droppedStdout;\n\t\t\toutput.droppedStderr = snapshot.droppedStderr;\n\t\t\tif (snapshot.status === \"exited\") output.exitCode = snapshot.exitCode;\n\t\t}, ctx);\n\t\tif (snapshot.status === \"exited\") {\n\t\t\tconst { exitCode, stdout, stderr } = snapshot;\n\t\t\tif (task.input.every === undefined) {\n\t\t\t\treturn {\n\t\t\t\t\tdone: async (tx, current) => {\n\t\t\t\t\t\tif (task.input.notify)\n\t\t\t\t\t\t\tawait tx.write(\n\t\t\t\t\t\t\t\tcurrent.conversationId,\n\t\t\t\t\t\t\t\tnotice(`job ${task.id} exited with code ${exitCode}`, runtime.now()),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\treturn { status: \"completed\", result: { exitCode, occurrences: occurrence, stdout, stderr } };\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t}\n\t\t\tconst untilMs = runtime.now() + task.input.every;\n\t\t\treturn {\n\t\t\t\tnext: async (tx, current) => {\n\t\t\t\t\tif (task.input.notify)\n\t\t\t\t\t\tawait tx.write(\n\t\t\t\t\t\t\tcurrent.conversationId,\n\t\t\t\t\t\t\tnotice(`job ${task.id} occurrence ${occurrence} exited with code ${exitCode}`, runtime.now()),\n\t\t\t\t\t\t);\n\t\t\t\t\tconst output = tx.slot({ id: current.id, kind: jobKind });\n\t\t\t\t\toutput.stdout = \"\";\n\t\t\t\t\toutput.stderr = \"\";\n\t\t\t\t\toutput.droppedStdout = 0;\n\t\t\t\t\toutput.droppedStderr = 0;\n\t\t\t\t\tdelete output.exitCode;\n\t\t\t\t\toutput.occurrence = occurrence + 1;\n\t\t\t\t\treturn { phase: \"waiting\", untilMs, occurrence: occurrence + 1 };\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\t\tawait runtime.sleep(runtime.now() + Math.min(1000, 100 * 2 ** Math.min(attempt, 4)), ctx);\n\t}\n}\n"]}
1
+ {"version":3,"file":"job.d.ts","sourceRoot":"","sources":["../../../../src/harness/pico3/kinds/job.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAc,IAAI,EAAE,UAAU,EAAE,WAAW,EAAsC,MAAM,aAAa,CAAC;AAEjH,MAAM,MAAM,QAAQ,GAAG;KAAG,CAAC,IAAI,MAAM,WAAW,GAAG,WAAW,CAAC,CAAC,CAAC;CAAE,GAAG;IACrE,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AACF,MAAM,MAAM,aAAa,GACtB;IAAE,KAAK,EAAE,SAAS,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GACzD;IAAE,KAAK,EAAE,UAAU,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GACtD;IAAE,KAAK,EAAE,SAAS,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC;AACzD,MAAM,MAAM,SAAS,GAAG;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AACF,MAAM,MAAM,SAAS,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAClG,MAAM,MAAM,UAAU,GAAG;IAAE,MAAM,EAAE,OAAO,GAAG,aAAa,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AA0D7E,eAAO,MAAM,GAAG;YAzCL,OAAO;sIAyCuB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"job.js","sourceRoot":"","sources":["../../../../src/harness/pico3/kinds/job.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Context } from \"@earendil-works/chord\";\nimport type { Completion, Kind, KindConfig, ProcessSpec, ProcessStatus, Runtime, Step, Task } from \"../types.ts\";\n\nexport type JobInput = { [K in keyof ProcessSpec]: ProcessSpec[K] } & {\n\tnotify: boolean;\n\trerun: boolean;\n\tevery?: number;\n\tnotBefore?: number;\n};\nexport type JobCheckpoint =\n\t| { phase: \"waiting\"; untilMs: number; occurrence: number }\n\t| { phase: \"spawning\"; key: string; occurrence: number }\n\t| { phase: \"running\"; key: string; occurrence: number };\nexport type JobOutput = {\n\tstdout?: string;\n\tstderr?: string;\n\tdroppedStdout?: number;\n\tdroppedStderr?: number;\n\texitCode?: number;\n\toccurrence?: number;\n};\nexport type JobResult = { exitCode: number; occurrences: number; stdout: string; stderr: string };\nexport type JobFailure = { reason: \"spawn\" | \"interrupted\"; detail: string };\ntype JobTask = Task<JobInput, JobCheckpoint>;\ntype JobStep = Step<JobCheckpoint, JobResult, JobFailure>;\nconst failed = (reason: JobFailure[\"reason\"], detail: string): Completion<JobResult, JobFailure> => ({\n\tstatus: \"failed\",\n\tfailure: { reason, detail },\n});\nconst notice = (text: string, now: number) => ({\n\tkind: \"pi.notice\",\n\tmodel: [{ role: \"user\" as const, content: text, timestamp: now }],\n});\n\nconst jobKind: Kind<\n\tJobInput,\n\tJobCheckpoint,\n\tJobResult,\n\tJobFailure,\n\t{ killed: boolean },\n\tobject,\n\tKindConfig,\n\tJobOutput\n> = {\n\tname: \"pi.job\",\n\tslot: () => ({}),\n\tdescribe: (task) => ({\n\t\tstage: task.checkpoint?.phase ?? \"starting\",\n\t\t...(task.slot ?? {}),\n\t}),\n\tinflight: [\"spawning\", \"running\"],\n\tphases: {\n\t\tasync waiting(task, runtime, ctx) {\n\t\t\tawait runtime.sleep(task.checkpoint.untilMs, ctx);\n\t\t\treturn spawn(task, task.checkpoint.occurrence, runtime, ctx);\n\t\t},\n\t\tasync spawning(task, runtime, ctx) {\n\t\t\treturn reconcile(task, task.checkpoint, runtime, ctx);\n\t\t},\n\t\tasync running(task, runtime, ctx) {\n\t\t\treturn reconcile(task, task.checkpoint, runtime, ctx);\n\t\t},\n\t},\n\tasync initial(task, runtime, ctx) {\n\t\tif (runtime.processHost === undefined) return { done: () => failed(\"spawn\", \"no process host\") };\n\t\tconst now = runtime.now();\n\t\tconst untilMs = task.input.notBefore ?? now;\n\t\tif (untilMs > now) return { next: { phase: \"waiting\", untilMs, occurrence: 1 } };\n\t\treturn spawn(task, 1, runtime, ctx);\n\t},\n\tasync abort(task, runtime, ctx) {\n\t\tconst checkpoint = task.checkpoint;\n\t\tif (checkpoint === undefined || checkpoint.phase === \"waiting\" || runtime.processHost === undefined)\n\t\t\treturn async () => ({ killed: false });\n\t\tawait runtime.processHost.kill(checkpoint.key, \"SIGTERM\", ctx);\n\t\tawait runtime.sleep(runtime.now() + 5000, ctx);\n\t\tawait runtime.processHost.kill(checkpoint.key, \"SIGKILL\", ctx);\n\t\treturn async () => ({ killed: true });\n\t},\n};\nexport const job = Object.freeze(jobKind);\n\nasync function spawn(task: JobTask, occurrence: number, runtime: Runtime, ctx: Context): Promise<JobStep> {\n\tconst key = `${task.id}:${occurrence}`;\n\tawait runtime.commit((tx) => tx.checkpoint({ phase: \"spawning\", key, occurrence }), ctx);\n\ttry {\n\t\tawait runtime.processHost!.start(key, task.input, ctx);\n\t} catch (error) {\n\t\tif (ctx.abortSignal?.aborted) throw error;\n\t\treturn {\n\t\t\tdone: async (tx, current) => {\n\t\t\t\tif (task.input.notify)\n\t\t\t\t\tawait tx.write(\n\t\t\t\t\t\tcurrent.conversationId,\n\t\t\t\t\t\tnotice(`job ${task.id} failed to start: ${String(error)}`, runtime.now()),\n\t\t\t\t\t);\n\t\t\t\treturn failed(\"spawn\", String(error));\n\t\t\t},\n\t\t};\n\t}\n\tawait runtime.commit((tx) => tx.checkpoint({ phase: \"running\", key, occurrence }), ctx);\n\treturn poll(task, key, occurrence, runtime, ctx);\n}\n\nasync function reconcile(\n\ttask: JobTask,\n\tcheckpoint: Extract<JobCheckpoint, { phase: \"spawning\" | \"running\" }>,\n\truntime: Runtime,\n\tctx: Context,\n): Promise<JobStep> {\n\tif (runtime.processHost === undefined) return { done: () => failed(\"interrupted\", \"no process host after restart\") };\n\tlet status: ProcessStatus;\n\ttry {\n\t\tstatus = await runtime.processHost.status(checkpoint.key, ctx);\n\t} catch (error) {\n\t\treturn { done: () => failed(\"interrupted\", `host status failed: ${String(error)}`) };\n\t}\n\tif (status.status === \"unknown\") {\n\t\tif (!task.input.rerun) return { done: () => failed(\"interrupted\", \"process outcome unknown\") };\n\t\treturn spawn(task, checkpoint.occurrence, runtime, ctx);\n\t}\n\tif (checkpoint.phase === \"spawning\") {\n\t\tawait runtime.commit(\n\t\t\t(tx) => tx.checkpoint({ phase: \"running\", key: checkpoint.key, occurrence: checkpoint.occurrence }),\n\t\t\tctx,\n\t\t);\n\t}\n\treturn poll(task, checkpoint.key, checkpoint.occurrence, runtime, ctx);\n}\n\nasync function poll(task: JobTask, key: string, occurrence: number, runtime: Runtime, ctx: Context): Promise<JobStep> {\n\tfor (let attempt = 0; ; attempt++) {\n\t\tlet status: ProcessStatus;\n\t\ttry {\n\t\t\tstatus = await runtime.processHost!.status(key, ctx);\n\t\t} catch (error) {\n\t\t\treturn { done: () => failed(\"interrupted\", `host status failed: ${String(error)}`) };\n\t\t}\n\t\tif (status.status === \"unknown\") {\n\t\t\tif (!task.input.rerun) return { done: () => failed(\"interrupted\", \"process outcome unknown\") };\n\t\t\treturn spawn(task, occurrence, runtime, ctx);\n\t\t}\n\t\tconst snapshot = status;\n\t\tawait runtime.commit((tx, current) => {\n\t\t\tconst output = tx.slot({ id: current.id, kind: jobKind });\n\t\t\toutput.stdout = snapshot.stdout;\n\t\t\toutput.stderr = snapshot.stderr;\n\t\t\toutput.droppedStdout = snapshot.droppedStdout;\n\t\t\toutput.droppedStderr = snapshot.droppedStderr;\n\t\t\tif (snapshot.status === \"exited\") output.exitCode = snapshot.exitCode;\n\t\t}, ctx);\n\t\tif (snapshot.status === \"exited\") {\n\t\t\tconst { exitCode, stdout, stderr } = snapshot;\n\t\t\tif (task.input.every === undefined) {\n\t\t\t\treturn {\n\t\t\t\t\tdone: async (tx, current) => {\n\t\t\t\t\t\tif (task.input.notify)\n\t\t\t\t\t\t\tawait tx.write(\n\t\t\t\t\t\t\t\tcurrent.conversationId,\n\t\t\t\t\t\t\t\tnotice(`job ${task.id} exited with code ${exitCode}`, runtime.now()),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\treturn { status: \"completed\", result: { exitCode, occurrences: occurrence, stdout, stderr } };\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t}\n\t\t\tconst untilMs = runtime.now() + task.input.every;\n\t\t\treturn {\n\t\t\t\tnext: async (tx, current) => {\n\t\t\t\t\tif (task.input.notify)\n\t\t\t\t\t\tawait tx.write(\n\t\t\t\t\t\t\tcurrent.conversationId,\n\t\t\t\t\t\t\tnotice(`job ${task.id} occurrence ${occurrence} exited with code ${exitCode}`, runtime.now()),\n\t\t\t\t\t\t);\n\t\t\t\t\tconst output = tx.slot({ id: current.id, kind: jobKind });\n\t\t\t\t\toutput.stdout = \"\";\n\t\t\t\t\toutput.stderr = \"\";\n\t\t\t\t\toutput.droppedStdout = 0;\n\t\t\t\t\toutput.droppedStderr = 0;\n\t\t\t\t\tdelete output.exitCode;\n\t\t\t\t\toutput.occurrence = occurrence + 1;\n\t\t\t\t\treturn { phase: \"waiting\", untilMs, occurrence: occurrence + 1 };\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\t\tawait runtime.sleep(runtime.now() + Math.min(1000, 100 * 2 ** Math.min(attempt, 4)), ctx);\n\t}\n}\n"]}
1
+ {"version":3,"file":"job.js","sourceRoot":"","sources":["../../../../src/harness/pico3/kinds/job.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Context } from \"@earendil-works/chord\";\nimport type { Completion, Kind, KindConfig, ProcessSpec, ProcessStatus, Runtime, Step, Task } from \"../types.ts\";\n\nexport type JobInput = { [K in keyof ProcessSpec]: ProcessSpec[K] } & {\n\tnotify: boolean;\n\trerun: boolean;\n\tevery?: number;\n\tnotBefore?: number;\n};\nexport type JobCheckpoint =\n\t| { phase: \"waiting\"; untilMs: number; occurrence: number }\n\t| { phase: \"spawning\"; key: string; occurrence: number }\n\t| { phase: \"running\"; key: string; occurrence: number };\nexport type JobOutput = {\n\tstdout?: string;\n\tstderr?: string;\n\tdroppedStdout?: number;\n\tdroppedStderr?: number;\n\texitCode?: number;\n\toccurrence?: number;\n};\nexport type JobResult = { exitCode: number; occurrences: number; stdout: string; stderr: string };\nexport type JobFailure = { reason: \"spawn\" | \"interrupted\"; detail: string };\ntype JobTask = Task<JobInput, JobCheckpoint>;\ntype JobStep = Step<JobCheckpoint, JobResult, JobFailure>;\nconst failed = (reason: JobFailure[\"reason\"], detail: string): Completion<JobResult, JobFailure> => ({\n\tstatus: \"failed\",\n\tfailure: { reason, detail },\n});\nconst notice = (text: string, now: number) => ({\n\tkind: \"pi.notice\",\n\tmodel: [{ role: \"user\" as const, content: text, timestamp: now }],\n});\n\nconst jobKind: Kind<\n\tJobInput,\n\tJobCheckpoint,\n\tJobResult,\n\tJobFailure,\n\t{ killed: boolean },\n\tobject,\n\tKindConfig,\n\tJobOutput\n> = {\n\tname: \"pi.job\",\n\tslot: () => ({}),\n\tdescribe: (task) => ({\n\t\tstage: task.checkpoint?.phase ?? \"starting\",\n\t\t...(task.slot ?? {}),\n\t}),\n\tinflight: [\"spawning\", \"running\"],\n\tphases: {\n\t\tasync waiting(task, runtime, ctx) {\n\t\t\tawait runtime.sleep(task.checkpoint.untilMs, ctx);\n\t\t\treturn spawn(task, task.checkpoint.occurrence, runtime, ctx);\n\t\t},\n\t\tasync spawning(task, runtime, ctx) {\n\t\t\treturn reconcile(task, task.checkpoint, runtime, ctx);\n\t\t},\n\t\tasync running(task, runtime, ctx) {\n\t\t\treturn reconcile(task, task.checkpoint, runtime, ctx);\n\t\t},\n\t},\n\tasync initial(task, runtime, ctx) {\n\t\tif (runtime.processHost === undefined) return { done: () => failed(\"spawn\", \"no process host\") };\n\t\tconst now = runtime.now();\n\t\tconst untilMs = task.input.notBefore ?? now;\n\t\tif (untilMs > now) return { next: { phase: \"waiting\", untilMs, occurrence: 1 } };\n\t\treturn spawn(task, 1, runtime, ctx);\n\t},\n\tasync abort(task, runtime, ctx) {\n\t\tconst checkpoint = task.checkpoint;\n\t\tif (checkpoint === undefined || checkpoint.phase === \"waiting\" || runtime.processHost === undefined)\n\t\t\treturn async () => ({ killed: false });\n\t\tawait runtime.processHost.kill(checkpoint.key, \"SIGTERM\", ctx);\n\t\tawait runtime.sleep(runtime.now() + 5000, ctx);\n\t\tawait runtime.processHost.kill(checkpoint.key, \"SIGKILL\", ctx);\n\t\treturn async () => ({ killed: true });\n\t},\n};\nexport const job = Object.freeze(jobKind);\n\nasync function spawn(task: JobTask, occurrence: number, runtime: Runtime, ctx: Context): Promise<JobStep> {\n\tconst key = `${task.id}:${occurrence}`;\n\tawait runtime.commit((tx) => tx.checkpoint({ phase: \"spawning\", key, occurrence }), ctx);\n\ttry {\n\t\tawait runtime.processHost!.start(key, task.input, ctx);\n\t} catch (error) {\n\t\tif (ctx.abortSignal?.aborted) throw error;\n\t\treturn {\n\t\t\tdone: async (tx, current) => {\n\t\t\t\tif (task.input.notify)\n\t\t\t\t\tawait tx.write(\n\t\t\t\t\t\tcurrent.conversationId,\n\t\t\t\t\t\tnotice(`job ${task.id} failed to start: ${String(error)}`, runtime.now()),\n\t\t\t\t\t);\n\t\t\t\treturn failed(\"spawn\", String(error));\n\t\t\t},\n\t\t};\n\t}\n\tawait runtime.commit((tx) => tx.checkpoint({ phase: \"running\", key, occurrence }), ctx);\n\treturn poll(task, key, occurrence, runtime, ctx);\n}\n\nasync function reconcile(\n\ttask: JobTask,\n\tcheckpoint: Extract<JobCheckpoint, { phase: \"spawning\" | \"running\" }>,\n\truntime: Runtime,\n\tctx: Context,\n): Promise<JobStep> {\n\tif (runtime.processHost === undefined) return { done: () => failed(\"interrupted\", \"no process host after restart\") };\n\tlet status: ProcessStatus;\n\ttry {\n\t\tstatus = await runtime.processHost.status(checkpoint.key, ctx);\n\t} catch (error) {\n\t\treturn { done: () => failed(\"interrupted\", `host status failed: ${String(error)}`) };\n\t}\n\tif (status.status === \"unknown\") {\n\t\tif (!task.input.rerun) return { done: () => failed(\"interrupted\", \"process outcome unknown\") };\n\t\treturn spawn(task, checkpoint.occurrence, runtime, ctx);\n\t}\n\tif (checkpoint.phase === \"spawning\") {\n\t\tawait runtime.commit(\n\t\t\t(tx) => tx.checkpoint({ phase: \"running\", key: checkpoint.key, occurrence: checkpoint.occurrence }),\n\t\t\tctx,\n\t\t);\n\t}\n\treturn poll(task, checkpoint.key, checkpoint.occurrence, runtime, ctx);\n}\n\nasync function poll(task: JobTask, key: string, occurrence: number, runtime: Runtime, ctx: Context): Promise<JobStep> {\n\tfor (let attempt = 0; ; attempt++) {\n\t\tlet status: ProcessStatus;\n\t\ttry {\n\t\t\tstatus = await runtime.processHost!.status(key, ctx);\n\t\t} catch (error) {\n\t\t\treturn { done: () => failed(\"interrupted\", `host status failed: ${String(error)}`) };\n\t\t}\n\t\tif (status.status === \"unknown\") {\n\t\t\tif (!task.input.rerun) return { done: () => failed(\"interrupted\", \"process outcome unknown\") };\n\t\t\treturn spawn(task, occurrence, runtime, ctx);\n\t\t}\n\t\tconst snapshot = status;\n\t\tawait runtime.commit((tx, current) => {\n\t\t\tconst output = tx.slot({ id: current.id, kind: jobKind });\n\t\t\toutput.stdout = snapshot.stdout;\n\t\t\toutput.stderr = snapshot.stderr;\n\t\t\toutput.droppedStdout = snapshot.droppedStdout;\n\t\t\toutput.droppedStderr = snapshot.droppedStderr;\n\t\t\tif (snapshot.status === \"exited\") output.exitCode = snapshot.exitCode;\n\t\t}, ctx);\n\t\tif (snapshot.status === \"exited\") {\n\t\t\tconst { exitCode, stdout, stderr } = snapshot;\n\t\t\tif (task.input.every === undefined) {\n\t\t\t\treturn {\n\t\t\t\t\tdone: async (tx, current) => {\n\t\t\t\t\t\tif (task.input.notify)\n\t\t\t\t\t\t\tawait tx.write(\n\t\t\t\t\t\t\t\tcurrent.conversationId,\n\t\t\t\t\t\t\t\tnotice(`job ${task.id} exited with code ${exitCode}`, runtime.now()),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\treturn { status: \"completed\", result: { exitCode, occurrences: occurrence, stdout, stderr } };\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t}\n\t\t\tconst untilMs = runtime.now() + task.input.every;\n\t\t\treturn {\n\t\t\t\tnext: async (tx, current) => {\n\t\t\t\t\tif (task.input.notify)\n\t\t\t\t\t\tawait tx.write(\n\t\t\t\t\t\t\tcurrent.conversationId,\n\t\t\t\t\t\t\tnotice(`job ${task.id} occurrence ${occurrence} exited with code ${exitCode}`, runtime.now()),\n\t\t\t\t\t\t);\n\t\t\t\t\tconst output = tx.slot({ id: current.id, kind: jobKind });\n\t\t\t\t\toutput.stdout = \"\";\n\t\t\t\t\toutput.stderr = \"\";\n\t\t\t\t\toutput.droppedStdout = 0;\n\t\t\t\t\toutput.droppedStderr = 0;\n\t\t\t\t\tdelete output.exitCode;\n\t\t\t\t\toutput.occurrence = occurrence + 1;\n\t\t\t\t\treturn { phase: \"waiting\", untilMs, occurrence: occurrence + 1 };\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\t\tawait runtime.sleep(runtime.now() + Math.min(1000, 100 * 2 ** Math.min(attempt, 4)), ctx);\n\t}\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../../../src/harness/pico3/kinds/plugin.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,IAAI,EAAgD,MAAM,aAAa,CAAC;AAGtG,MAAM,MAAM,WAAW,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,SAAS,CAAA;CAAE,CAAC;AAChE,KAAK,gBAAgB,GAAG;IAAE,KAAK,EAAE,SAAS,CAAA;CAAE,CAAC;AAC7C,KAAK,aAAa,GAAG;IAAE,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAkB7E,eAAO,MAAM,MAAM,+RAA4B,CAAC","sourcesContent":["import type { Context } from \"@earendil-works/chord\";\nimport { type JsonValue, type Kind, type Runtime, type Step, type Task, toStored } from \"../types.ts\";\nimport { taskApi } from \"./task-api.ts\";\n\nexport type PluginInput = { handler: string; input: JsonValue };\ntype PluginCheckpoint = { phase: \"started\" };\ntype PluginFailure = { reason: \"missing_handler\" | \"threw\"; detail: string };\n\nconst pluginKind: Kind<PluginInput, PluginCheckpoint, JsonValue, PluginFailure, null> = {\n\tname: \"pi.plugin\",\n\tinflight: [\"started\"],\n\tphases: {\n\t\tasync started(task, runtime, ctx) {\n\t\t\treturn run(task, runtime, ctx);\n\t\t},\n\t},\n\tasync initial(task, runtime, ctx) {\n\t\tawait runtime.commit((tx) => tx.checkpoint({ phase: \"started\" }), ctx);\n\t\treturn run(task, runtime, ctx);\n\t},\n\tasync abort() {\n\t\treturn async () => null;\n\t},\n};\nexport const plugin = Object.freeze(pluginKind);\n\nasync function run(\n\ttask: Task<PluginInput, PluginCheckpoint>,\n\truntime: Runtime,\n\tctx: Context,\n): Promise<Step<PluginCheckpoint, JsonValue, PluginFailure>> {\n\tconst handler = runtime.plugins.get(task.input.handler);\n\tif (handler === undefined) {\n\t\treturn { done: () => ({ status: \"failed\", failure: { reason: \"missing_handler\", detail: task.input.handler } }) };\n\t}\n\ttry {\n\t\tconst result = toStored(await handler(task.input.input, taskApi(task, runtime), ctx));\n\t\treturn { done: () => ({ status: \"completed\", result }) };\n\t} catch (error) {\n\t\tif (ctx.abortSignal?.aborted) throw error;\n\t\treturn { done: () => ({ status: \"failed\", failure: { reason: \"threw\", detail: String(error) } }) };\n\t}\n}\n"]}
1
+ {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../../../src/harness/pico3/kinds/plugin.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,IAAI,EAAgD,MAAM,aAAa,CAAC;AAGtG,MAAM,MAAM,WAAW,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,SAAS,CAAA;CAAE,CAAC;AAChE,KAAK,gBAAgB,GAAG;IAAE,KAAK,EAAE,SAAS,CAAA;CAAE,CAAC;AAC7C,KAAK,aAAa,GAAG;IAAE,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAkB7E,eAAO,MAAM,MAAM,+RAA4B,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../../../src/harness/pico3/kinds/plugin.ts"],"names":[],"mappings":"AACA,OAAO,EAAiE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACtG,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAMxC,MAAM,UAAU,GAAwE;IACvF,IAAI,EAAE,WAAW;IACjB,QAAQ,EAAE,CAAC,SAAS,CAAC;IACrB,MAAM,EAAE;QACP,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE;YACjC,OAAO,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC;QAAA,CAC/B;KACD;IACD,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE;QACjC,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;QACvE,OAAO,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC;IAAA,CAC/B;IACD,KAAK,CAAC,KAAK,GAAG;QACb,OAAO,KAAK,IAAI,EAAE,CAAC,IAAI,CAAC;IAAA,CACxB;CACD,CAAC;AACF,MAAM,CAAC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;AAEhD,KAAK,UAAU,GAAG,CACjB,IAAyC,EACzC,OAAgB,EAChB,GAAY,EACgD;IAC5D,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACxD,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC3B,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC;IACnH,CAAC;IACD,IAAI,CAAC;QACJ,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;QACtF,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;IAC1D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,IAAI,GAAG,CAAC,WAAW,EAAE,OAAO;YAAE,MAAM,KAAK,CAAC;QAC1C,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;IACpG,CAAC;AAAA,CACD","sourcesContent":["import type { Context } from \"@earendil-works/chord\";\nimport { type JsonValue, type Kind, type Runtime, type Step, type Task, toStored } from \"../types.ts\";\nimport { taskApi } from \"./task-api.ts\";\n\nexport type PluginInput = { handler: string; input: JsonValue };\ntype PluginCheckpoint = { phase: \"started\" };\ntype PluginFailure = { reason: \"missing_handler\" | \"threw\"; detail: string };\n\nconst pluginKind: Kind<PluginInput, PluginCheckpoint, JsonValue, PluginFailure, null> = {\n\tname: \"pi.plugin\",\n\tinflight: [\"started\"],\n\tphases: {\n\t\tasync started(task, runtime, ctx) {\n\t\t\treturn run(task, runtime, ctx);\n\t\t},\n\t},\n\tasync initial(task, runtime, ctx) {\n\t\tawait runtime.commit((tx) => tx.checkpoint({ phase: \"started\" }), ctx);\n\t\treturn run(task, runtime, ctx);\n\t},\n\tasync abort() {\n\t\treturn async () => null;\n\t},\n};\nexport const plugin = Object.freeze(pluginKind);\n\nasync function run(\n\ttask: Task<PluginInput, PluginCheckpoint>,\n\truntime: Runtime,\n\tctx: Context,\n): Promise<Step<PluginCheckpoint, JsonValue, PluginFailure>> {\n\tconst handler = runtime.plugins.get(task.input.handler);\n\tif (handler === undefined) {\n\t\treturn { done: () => ({ status: \"failed\", failure: { reason: \"missing_handler\", detail: task.input.handler } }) };\n\t}\n\ttry {\n\t\tconst result = toStored(await handler(task.input.input, taskApi(task, runtime), ctx));\n\t\treturn { done: () => ({ status: \"completed\", result }) };\n\t} catch (error) {\n\t\tif (ctx.abortSignal?.aborted) throw error;\n\t\treturn { done: () => ({ status: \"failed\", failure: { reason: \"threw\", detail: String(error) } }) };\n\t}\n}\n"]}
1
+ {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../../../src/harness/pico3/kinds/plugin.ts"],"names":[],"mappings":"AACA,OAAO,EAAiE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACtG,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAMxC,MAAM,UAAU,GAAwE;IACvF,IAAI,EAAE,WAAW;IACjB,QAAQ,EAAE,CAAC,SAAS,CAAC;IACrB,MAAM,EAAE;QACP,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG;YAC/B,OAAO,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC;QAChC,CAAC;KACD;IACD,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG;QAC/B,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;QACvE,OAAO,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC;IAChC,CAAC;IACD,KAAK,CAAC,KAAK;QACV,OAAO,KAAK,IAAI,EAAE,CAAC,IAAI,CAAC;IACzB,CAAC;CACD,CAAC;AACF,MAAM,CAAC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;AAEhD,KAAK,UAAU,GAAG,CACjB,IAAyC,EACzC,OAAgB,EAChB,GAAY;IAEZ,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACxD,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC3B,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC;IACnH,CAAC;IACD,IAAI,CAAC;QACJ,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;QACtF,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;IAC1D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,IAAI,GAAG,CAAC,WAAW,EAAE,OAAO;YAAE,MAAM,KAAK,CAAC;QAC1C,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;IACpG,CAAC;AACF,CAAC","sourcesContent":["import type { Context } from \"@earendil-works/chord\";\nimport { type JsonValue, type Kind, type Runtime, type Step, type Task, toStored } from \"../types.ts\";\nimport { taskApi } from \"./task-api.ts\";\n\nexport type PluginInput = { handler: string; input: JsonValue };\ntype PluginCheckpoint = { phase: \"started\" };\ntype PluginFailure = { reason: \"missing_handler\" | \"threw\"; detail: string };\n\nconst pluginKind: Kind<PluginInput, PluginCheckpoint, JsonValue, PluginFailure, null> = {\n\tname: \"pi.plugin\",\n\tinflight: [\"started\"],\n\tphases: {\n\t\tasync started(task, runtime, ctx) {\n\t\t\treturn run(task, runtime, ctx);\n\t\t},\n\t},\n\tasync initial(task, runtime, ctx) {\n\t\tawait runtime.commit((tx) => tx.checkpoint({ phase: \"started\" }), ctx);\n\t\treturn run(task, runtime, ctx);\n\t},\n\tasync abort() {\n\t\treturn async () => null;\n\t},\n};\nexport const plugin = Object.freeze(pluginKind);\n\nasync function run(\n\ttask: Task<PluginInput, PluginCheckpoint>,\n\truntime: Runtime,\n\tctx: Context,\n): Promise<Step<PluginCheckpoint, JsonValue, PluginFailure>> {\n\tconst handler = runtime.plugins.get(task.input.handler);\n\tif (handler === undefined) {\n\t\treturn { done: () => ({ status: \"failed\", failure: { reason: \"missing_handler\", detail: task.input.handler } }) };\n\t}\n\ttry {\n\t\tconst result = toStored(await handler(task.input.input, taskApi(task, runtime), ctx));\n\t\treturn { done: () => ({ status: \"completed\", result }) };\n\t} catch (error) {\n\t\tif (ctx.abortSignal?.aborted) throw error;\n\t\treturn { done: () => ({ status: \"failed\", failure: { reason: \"threw\", detail: String(error) } }) };\n\t}\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"post-tools.d.ts","sourceRoot":"","sources":["../../../../src/harness/pico3/kinds/post-tools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAErD,OAAO,EAAE,KAAK,QAAQ,EAAE,KAAK,QAAQ,EAAE,KAAK,EAAE,EAAyB,MAAM,aAAa,CAAC;AAG3F,MAAM,MAAM,cAAc,GAAG;IAAE,MAAM,EAAE,EAAE,EAAE,CAAC;IAAC,SAAS,EAAE,EAAE,CAAC;IAAC,KAAK,EAAE,EAAE,EAAE,CAAA;CAAE,CAAC;AAC1E,MAAM,MAAM,eAAe,GAAG;IAAE,SAAS,CAAC,EAAE,EAAE,CAAC;IAAC,KAAK,CAAC,EAAE,WAAW,GAAG,SAAS,CAAA;CAAE,CAAC;AAClF,MAAM,WAAW,cAAc;IAC9B,UAAU,CAAC,SAAS,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,OAAO,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7F;AACD,eAAO,MAAM,eAAe;;;;;CAKlB,CAAC;AAEX,eAAO,MAAM,SAAS,EAAE,QAAQ,CAC/B,cAAc,EACd,KAAK,EACL,eAAe,EACf,KAAK,EACL,IAAI,EACJ,cAAc,EACd,OAAO,eAAe,CA4ItB,CAAC","sourcesContent":["import type { Context } from \"@earendil-works/chord\";\nimport type { AssistantMessage, ToolCall } from \"@earendil-works/pi-ai\";\nimport { type CoreKind, type HookInfo, type Id, type Stored, toStored } from \"../types.ts\";\nimport type { ToolTaskResult } from \"./tool.ts\";\n\nexport type PostToolsInput = { inputs: Id[]; assistant: Id; tools: Id[] };\nexport type PostToolsResult = { successor?: Id; ended?: \"terminate\" | \"handoff\" };\nexport interface PostToolsHooks {\n\tafterTools(assistant: Id, results: Id[], info: HookInfo, ctx: Context): void | Promise<void>;\n}\nexport const postToolsConfig = {\n\tsticky: {\n\t\tsteeringMode: \"one-at-a-time\" as \"all\" | \"one-at-a-time\",\n\t\tfollowUpMode: \"one-at-a-time\" as \"all\" | \"one-at-a-time\",\n\t},\n} as const;\n\nexport const postTools: CoreKind<\n\tPostToolsInput,\n\tnever,\n\tPostToolsResult,\n\tnever,\n\tnull,\n\tPostToolsHooks,\n\ttypeof postToolsConfig\n> = {\n\tname: \"pi.post_tools\",\n\tturn: true,\n\tconfig: postToolsConfig,\n\tphases: {},\n\n\tasync initial(task, rt, ctx) {\n\t\tconst rows = await rt.commit(async (tx) => {\n\t\t\tconst assistant = await tx.entry(task.input.assistant);\n\t\t\tconst calls = ((assistant?.model?.[0] as Stored<AssistantMessage> | undefined)?.content ?? []).filter(\n\t\t\t\t(content): content is Stored<ToolCall> => content.type === \"toolCall\",\n\t\t\t);\n\t\t\treturn Promise.all(\n\t\t\t\ttask.input.tools.map(async (id, index) => {\n\t\t\t\t\tconst toolTask = (await tx.task(id))!;\n\t\t\t\t\tconst call = calls[index]!;\n\t\t\t\t\tif (toolTask.outcome?.status === \"completed\") {\n\t\t\t\t\t\tconst result = toolTask.outcome.result as ToolTaskResult;\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tcall,\n\t\t\t\t\t\t\tentry: result.entry as Id | undefined,\n\t\t\t\t\t\t\tcontrol: result.control,\n\t\t\t\t\t\t\tmissing: undefined as \"orphaned\" | \"aborted\" | undefined,\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t\tif (toolTask.outcome?.status === \"aborted\") {\n\t\t\t\t\t\tconst aborted = toolTask.outcome.result as { entry?: Id };\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tcall,\n\t\t\t\t\t\t\tentry: aborted.entry,\n\t\t\t\t\t\t\tcontrol: undefined,\n\t\t\t\t\t\t\tmissing: aborted.entry === undefined ? (\"aborted\" as const) : undefined,\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t\treturn { call, entry: undefined, control: undefined, missing: \"orphaned\" as const };\n\t\t\t\t}),\n\t\t\t);\n\t\t}, ctx);\n\t\tconst results = rows.map((row) => row.entry).filter((entry): entry is Id => entry !== undefined);\n\t\tawait rt.hooks.each(ctx, (hook, api) => hook.afterTools?.(task.input.assistant, results, api, ctx));\n\n\t\treturn {\n\t\t\tdone: async (tx, current) => {\n\t\t\t\tconst conversationId = current.conversationId;\n\t\t\t\tconst head = await tx.newestEntry(conversationId, { withHead: true });\n\t\t\t\tconst state = tx.rewindable(conversationId);\n\t\t\t\tconst selectedTools = [...state.selectedTools];\n\t\t\t\tlet terminate = false;\n\t\t\t\tlet handoff: string | undefined;\n\t\t\t\tfor (const row of rows) {\n\t\t\t\t\tfor (const name of row.control?.addTools ?? [])\n\t\t\t\t\t\tif (!selectedTools.includes(name)) selectedTools.push(name);\n\t\t\t\t\tif (row.control?.terminate) terminate = true;\n\t\t\t\t\tif (row.control?.handoff !== undefined) handoff = row.control.handoff;\n\t\t\t\t}\n\t\t\t\tif (selectedTools.length !== state.selectedTools.length) {\n\t\t\t\t\tstate.selectedTools = selectedTools;\n\t\t\t\t\ttx.emit({ type: \"config.changed\", keys: [\"selectedTools\"] });\n\t\t\t\t}\n\t\t\t\tfor (const row of rows) {\n\t\t\t\t\tif (row.missing === undefined) continue;\n\t\t\t\t\ttx.appendEntry(conversationId, {\n\t\t\t\t\t\tkind: \"pi.tool_result\",\n\t\t\t\t\t\tmodel: [\n\t\t\t\t\t\t\ttoStored({\n\t\t\t\t\t\t\t\trole: \"toolResult\" as const,\n\t\t\t\t\t\t\t\ttoolCallId: row.call.id,\n\t\t\t\t\t\t\t\ttoolName: row.call.name,\n\t\t\t\t\t\t\t\tcontent: [{ type: \"text\" as const, text: `Tool result unavailable: task ${row.missing}.` }],\n\t\t\t\t\t\t\t\tisError: true,\n\t\t\t\t\t\t\t\ttimestamp: rt.now(),\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t],\n\t\t\t\t\t\tdata: { diagnostics: [{ severity: \"error\", message: row.missing, code: row.missing }] },\n\t\t\t\t\t});\n\t\t\t\t\ttx.emit({\n\t\t\t\t\t\ttype: \"warning\",\n\t\t\t\t\t\tsource: \"post_tools\",\n\t\t\t\t\t\tmessage: `synthesized ${row.missing} tool result for ${row.call.id}`,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tlet headBoundary = head?.id;\n\t\t\t\tif (handoff !== undefined) {\n\t\t\t\t\theadBoundary = tx.appendEntry(conversationId, {\n\t\t\t\t\t\tkind: \"pi.handoff\",\n\t\t\t\t\t\thead: \"self\",\n\t\t\t\t\t\tmodel: [{ role: \"user\", content: handoff, timestamp: rt.now() }],\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tif (handoff !== undefined || terminate) {\n\t\t\t\t\ttx.sticky(conversationId).turn = { tools: [] };\n\t\t\t\t\tawait tx.resolveInputs(task.input.inputs, { status: \"done\", answer: task.input.assistant });\n\t\t\t\t\ttx.emit({ type: \"turn.ended\", inputs: task.input.inputs, status: \"done\", answer: task.input.assistant });\n\t\t\t\t\tconst { triggers } = await tx.boundary(conversationId, \"final\", headBoundary);\n\t\t\t\t\tif (triggers.length > 0) tx.emit({ type: \"turn.started\", inputs: triggers });\n\t\t\t\t\tconst ended = handoff !== undefined ? \"handoff\" : \"terminate\";\n\t\t\t\t\treturn {\n\t\t\t\t\t\tstatus: \"completed\",\n\t\t\t\t\t\tresult:\n\t\t\t\t\t\t\ttriggers.length > 0\n\t\t\t\t\t\t\t\t? { ended, successor: tx.createTask({ kind: \"pi.generation\", input: { inputs: triggers } }) }\n\t\t\t\t\t\t\t\t: { ended },\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tconst { triggers, terminated } = await tx.boundary(conversationId, \"postTools\", headBoundary);\n\t\t\t\tif (terminated) {\n\t\t\t\t\ttx.sticky(conversationId).turn = { tools: [] };\n\t\t\t\t\tawait tx.resolveInputs(task.input.inputs, { status: \"unanswered\", reason: \"terminated\" });\n\t\t\t\t\ttx.emit({ type: \"turn.ended\", inputs: task.input.inputs, status: \"unanswered\", reason: \"terminated\" });\n\t\t\t\t\tif (triggers.length > 0) tx.emit({ type: \"turn.started\", inputs: triggers });\n\t\t\t\t\treturn {\n\t\t\t\t\t\tstatus: \"completed\",\n\t\t\t\t\t\tresult:\n\t\t\t\t\t\t\ttriggers.length > 0\n\t\t\t\t\t\t\t\t? { successor: tx.createTask({ kind: \"pi.generation\", input: { inputs: triggers } }) }\n\t\t\t\t\t\t\t\t: {},\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\tstatus: \"completed\",\n\t\t\t\t\tresult: {\n\t\t\t\t\t\tsuccessor: tx.createTask({\n\t\t\t\t\t\t\tkind: \"pi.generation\",\n\t\t\t\t\t\t\tinput: { inputs: [...task.input.inputs, ...triggers] },\n\t\t\t\t\t\t}),\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t},\n\t\t};\n\t},\n\n\tasync abort(task) {\n\t\treturn async (tx, current) => {\n\t\t\ttx.sticky(current.conversationId).turn = { tools: [] };\n\t\t\tawait tx.resolveInputs(task.input.inputs, { status: \"unanswered\", reason: \"aborted\" });\n\t\t\ttx.emit({ type: \"turn.ended\", inputs: task.input.inputs, status: \"unanswered\", reason: \"aborted\" });\n\t\t\treturn null;\n\t\t};\n\t},\n};\n"]}
1
+ {"version":3,"file":"post-tools.d.ts","sourceRoot":"","sources":["../../../../src/harness/pico3/kinds/post-tools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAErD,OAAO,EAAE,KAAK,QAAQ,EAAE,KAAK,QAAQ,EAAE,KAAK,EAAE,EAAyB,MAAM,aAAa,CAAC;AAG3F,MAAM,MAAM,cAAc,GAAG;IAAE,MAAM,EAAE,EAAE,EAAE,CAAC;IAAC,SAAS,EAAE,EAAE,CAAC;IAAC,KAAK,EAAE,EAAE,EAAE,CAAA;CAAE,CAAC;AAC1E,MAAM,MAAM,eAAe,GAAG;IAAE,SAAS,CAAC,EAAE,EAAE,CAAC;IAAC,KAAK,CAAC,EAAE,WAAW,GAAG,SAAS,CAAA;CAAE,CAAC;AAClF,MAAM,WAAW,cAAc;IAC9B,UAAU,CAAC,SAAS,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,OAAO,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7F;AACD,eAAO,MAAM,eAAe;aAC3B,MAAM;iBACL,YAAY,EAAqB,KAAK,GAAG,eAAe;iBACxD,YAAY,EAAqB,KAAK,GAAG,eAAe;;CAEhD,CAAC;AAEX,eAAO,MAAM,SAAS,EAAE,QAAQ,CAC/B,cAAc,EACd,KAAK,EACL,eAAe,EACf,KAAK,EACL,IAAI,EACJ,cAAc,EACd,OAAO,eAAe,CA4ItB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"post-tools.js","sourceRoot":"","sources":["../../../../src/harness/pico3/kinds/post-tools.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Context } from \"@earendil-works/chord\";\nimport type { AssistantMessage, ToolCall } from \"@earendil-works/pi-ai\";\nimport { type CoreKind, type HookInfo, type Id, type Stored, toStored } from \"../types.ts\";\nimport type { ToolTaskResult } from \"./tool.ts\";\n\nexport type PostToolsInput = { inputs: Id[]; assistant: Id; tools: Id[] };\nexport type PostToolsResult = { successor?: Id; ended?: \"terminate\" | \"handoff\" };\nexport interface PostToolsHooks {\n\tafterTools(assistant: Id, results: Id[], info: HookInfo, ctx: Context): void | Promise<void>;\n}\nexport const postToolsConfig = {\n\tsticky: {\n\t\tsteeringMode: \"one-at-a-time\" as \"all\" | \"one-at-a-time\",\n\t\tfollowUpMode: \"one-at-a-time\" as \"all\" | \"one-at-a-time\",\n\t},\n} as const;\n\nexport const postTools: CoreKind<\n\tPostToolsInput,\n\tnever,\n\tPostToolsResult,\n\tnever,\n\tnull,\n\tPostToolsHooks,\n\ttypeof postToolsConfig\n> = {\n\tname: \"pi.post_tools\",\n\tturn: true,\n\tconfig: postToolsConfig,\n\tphases: {},\n\n\tasync initial(task, rt, ctx) {\n\t\tconst rows = await rt.commit(async (tx) => {\n\t\t\tconst assistant = await tx.entry(task.input.assistant);\n\t\t\tconst calls = ((assistant?.model?.[0] as Stored<AssistantMessage> | undefined)?.content ?? []).filter(\n\t\t\t\t(content): content is Stored<ToolCall> => content.type === \"toolCall\",\n\t\t\t);\n\t\t\treturn Promise.all(\n\t\t\t\ttask.input.tools.map(async (id, index) => {\n\t\t\t\t\tconst toolTask = (await tx.task(id))!;\n\t\t\t\t\tconst call = calls[index]!;\n\t\t\t\t\tif (toolTask.outcome?.status === \"completed\") {\n\t\t\t\t\t\tconst result = toolTask.outcome.result as ToolTaskResult;\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tcall,\n\t\t\t\t\t\t\tentry: result.entry as Id | undefined,\n\t\t\t\t\t\t\tcontrol: result.control,\n\t\t\t\t\t\t\tmissing: undefined as \"orphaned\" | \"aborted\" | undefined,\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t\tif (toolTask.outcome?.status === \"aborted\") {\n\t\t\t\t\t\tconst aborted = toolTask.outcome.result as { entry?: Id };\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tcall,\n\t\t\t\t\t\t\tentry: aborted.entry,\n\t\t\t\t\t\t\tcontrol: undefined,\n\t\t\t\t\t\t\tmissing: aborted.entry === undefined ? (\"aborted\" as const) : undefined,\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t\treturn { call, entry: undefined, control: undefined, missing: \"orphaned\" as const };\n\t\t\t\t}),\n\t\t\t);\n\t\t}, ctx);\n\t\tconst results = rows.map((row) => row.entry).filter((entry): entry is Id => entry !== undefined);\n\t\tawait rt.hooks.each(ctx, (hook, api) => hook.afterTools?.(task.input.assistant, results, api, ctx));\n\n\t\treturn {\n\t\t\tdone: async (tx, current) => {\n\t\t\t\tconst conversationId = current.conversationId;\n\t\t\t\tconst head = await tx.newestEntry(conversationId, { withHead: true });\n\t\t\t\tconst state = tx.rewindable(conversationId);\n\t\t\t\tconst selectedTools = [...state.selectedTools];\n\t\t\t\tlet terminate = false;\n\t\t\t\tlet handoff: string | undefined;\n\t\t\t\tfor (const row of rows) {\n\t\t\t\t\tfor (const name of row.control?.addTools ?? [])\n\t\t\t\t\t\tif (!selectedTools.includes(name)) selectedTools.push(name);\n\t\t\t\t\tif (row.control?.terminate) terminate = true;\n\t\t\t\t\tif (row.control?.handoff !== undefined) handoff = row.control.handoff;\n\t\t\t\t}\n\t\t\t\tif (selectedTools.length !== state.selectedTools.length) {\n\t\t\t\t\tstate.selectedTools = selectedTools;\n\t\t\t\t\ttx.emit({ type: \"config.changed\", keys: [\"selectedTools\"] });\n\t\t\t\t}\n\t\t\t\tfor (const row of rows) {\n\t\t\t\t\tif (row.missing === undefined) continue;\n\t\t\t\t\ttx.appendEntry(conversationId, {\n\t\t\t\t\t\tkind: \"pi.tool_result\",\n\t\t\t\t\t\tmodel: [\n\t\t\t\t\t\t\ttoStored({\n\t\t\t\t\t\t\t\trole: \"toolResult\" as const,\n\t\t\t\t\t\t\t\ttoolCallId: row.call.id,\n\t\t\t\t\t\t\t\ttoolName: row.call.name,\n\t\t\t\t\t\t\t\tcontent: [{ type: \"text\" as const, text: `Tool result unavailable: task ${row.missing}.` }],\n\t\t\t\t\t\t\t\tisError: true,\n\t\t\t\t\t\t\t\ttimestamp: rt.now(),\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t],\n\t\t\t\t\t\tdata: { diagnostics: [{ severity: \"error\", message: row.missing, code: row.missing }] },\n\t\t\t\t\t});\n\t\t\t\t\ttx.emit({\n\t\t\t\t\t\ttype: \"warning\",\n\t\t\t\t\t\tsource: \"post_tools\",\n\t\t\t\t\t\tmessage: `synthesized ${row.missing} tool result for ${row.call.id}`,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tlet headBoundary = head?.id;\n\t\t\t\tif (handoff !== undefined) {\n\t\t\t\t\theadBoundary = tx.appendEntry(conversationId, {\n\t\t\t\t\t\tkind: \"pi.handoff\",\n\t\t\t\t\t\thead: \"self\",\n\t\t\t\t\t\tmodel: [{ role: \"user\", content: handoff, timestamp: rt.now() }],\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tif (handoff !== undefined || terminate) {\n\t\t\t\t\ttx.sticky(conversationId).turn = { tools: [] };\n\t\t\t\t\tawait tx.resolveInputs(task.input.inputs, { status: \"done\", answer: task.input.assistant });\n\t\t\t\t\ttx.emit({ type: \"turn.ended\", inputs: task.input.inputs, status: \"done\", answer: task.input.assistant });\n\t\t\t\t\tconst { triggers } = await tx.boundary(conversationId, \"final\", headBoundary);\n\t\t\t\t\tif (triggers.length > 0) tx.emit({ type: \"turn.started\", inputs: triggers });\n\t\t\t\t\tconst ended = handoff !== undefined ? \"handoff\" : \"terminate\";\n\t\t\t\t\treturn {\n\t\t\t\t\t\tstatus: \"completed\",\n\t\t\t\t\t\tresult:\n\t\t\t\t\t\t\ttriggers.length > 0\n\t\t\t\t\t\t\t\t? { ended, successor: tx.createTask({ kind: \"pi.generation\", input: { inputs: triggers } }) }\n\t\t\t\t\t\t\t\t: { ended },\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tconst { triggers, terminated } = await tx.boundary(conversationId, \"postTools\", headBoundary);\n\t\t\t\tif (terminated) {\n\t\t\t\t\ttx.sticky(conversationId).turn = { tools: [] };\n\t\t\t\t\tawait tx.resolveInputs(task.input.inputs, { status: \"unanswered\", reason: \"terminated\" });\n\t\t\t\t\ttx.emit({ type: \"turn.ended\", inputs: task.input.inputs, status: \"unanswered\", reason: \"terminated\" });\n\t\t\t\t\tif (triggers.length > 0) tx.emit({ type: \"turn.started\", inputs: triggers });\n\t\t\t\t\treturn {\n\t\t\t\t\t\tstatus: \"completed\",\n\t\t\t\t\t\tresult:\n\t\t\t\t\t\t\ttriggers.length > 0\n\t\t\t\t\t\t\t\t? { successor: tx.createTask({ kind: \"pi.generation\", input: { inputs: triggers } }) }\n\t\t\t\t\t\t\t\t: {},\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\tstatus: \"completed\",\n\t\t\t\t\tresult: {\n\t\t\t\t\t\tsuccessor: tx.createTask({\n\t\t\t\t\t\t\tkind: \"pi.generation\",\n\t\t\t\t\t\t\tinput: { inputs: [...task.input.inputs, ...triggers] },\n\t\t\t\t\t\t}),\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t},\n\t\t};\n\t},\n\n\tasync abort(task) {\n\t\treturn async (tx, current) => {\n\t\t\ttx.sticky(current.conversationId).turn = { tools: [] };\n\t\t\tawait tx.resolveInputs(task.input.inputs, { status: \"unanswered\", reason: \"aborted\" });\n\t\t\ttx.emit({ type: \"turn.ended\", inputs: task.input.inputs, status: \"unanswered\", reason: \"aborted\" });\n\t\t\treturn null;\n\t\t};\n\t},\n};\n"]}
1
+ {"version":3,"file":"post-tools.js","sourceRoot":"","sources":["../../../../src/harness/pico3/kinds/post-tools.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Context } from \"@earendil-works/chord\";\nimport type { AssistantMessage, ToolCall } from \"@earendil-works/pi-ai\";\nimport { type CoreKind, type HookInfo, type Id, type Stored, toStored } from \"../types.ts\";\nimport type { ToolTaskResult } from \"./tool.ts\";\n\nexport type PostToolsInput = { inputs: Id[]; assistant: Id; tools: Id[] };\nexport type PostToolsResult = { successor?: Id; ended?: \"terminate\" | \"handoff\" };\nexport interface PostToolsHooks {\n\tafterTools(assistant: Id, results: Id[], info: HookInfo, ctx: Context): void | Promise<void>;\n}\nexport const postToolsConfig = {\n\tsticky: {\n\t\tsteeringMode: \"one-at-a-time\" as \"all\" | \"one-at-a-time\",\n\t\tfollowUpMode: \"one-at-a-time\" as \"all\" | \"one-at-a-time\",\n\t},\n} as const;\n\nexport const postTools: CoreKind<\n\tPostToolsInput,\n\tnever,\n\tPostToolsResult,\n\tnever,\n\tnull,\n\tPostToolsHooks,\n\ttypeof postToolsConfig\n> = {\n\tname: \"pi.post_tools\",\n\tturn: true,\n\tconfig: postToolsConfig,\n\tphases: {},\n\n\tasync initial(task, rt, ctx) {\n\t\tconst rows = await rt.commit(async (tx) => {\n\t\t\tconst assistant = await tx.entry(task.input.assistant);\n\t\t\tconst calls = ((assistant?.model?.[0] as Stored<AssistantMessage> | undefined)?.content ?? []).filter(\n\t\t\t\t(content): content is Stored<ToolCall> => content.type === \"toolCall\",\n\t\t\t);\n\t\t\treturn Promise.all(\n\t\t\t\ttask.input.tools.map(async (id, index) => {\n\t\t\t\t\tconst toolTask = (await tx.task(id))!;\n\t\t\t\t\tconst call = calls[index]!;\n\t\t\t\t\tif (toolTask.outcome?.status === \"completed\") {\n\t\t\t\t\t\tconst result = toolTask.outcome.result as ToolTaskResult;\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tcall,\n\t\t\t\t\t\t\tentry: result.entry as Id | undefined,\n\t\t\t\t\t\t\tcontrol: result.control,\n\t\t\t\t\t\t\tmissing: undefined as \"orphaned\" | \"aborted\" | undefined,\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t\tif (toolTask.outcome?.status === \"aborted\") {\n\t\t\t\t\t\tconst aborted = toolTask.outcome.result as { entry?: Id };\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tcall,\n\t\t\t\t\t\t\tentry: aborted.entry,\n\t\t\t\t\t\t\tcontrol: undefined,\n\t\t\t\t\t\t\tmissing: aborted.entry === undefined ? (\"aborted\" as const) : undefined,\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t\treturn { call, entry: undefined, control: undefined, missing: \"orphaned\" as const };\n\t\t\t\t}),\n\t\t\t);\n\t\t}, ctx);\n\t\tconst results = rows.map((row) => row.entry).filter((entry): entry is Id => entry !== undefined);\n\t\tawait rt.hooks.each(ctx, (hook, api) => hook.afterTools?.(task.input.assistant, results, api, ctx));\n\n\t\treturn {\n\t\t\tdone: async (tx, current) => {\n\t\t\t\tconst conversationId = current.conversationId;\n\t\t\t\tconst head = await tx.newestEntry(conversationId, { withHead: true });\n\t\t\t\tconst state = tx.rewindable(conversationId);\n\t\t\t\tconst selectedTools = [...state.selectedTools];\n\t\t\t\tlet terminate = false;\n\t\t\t\tlet handoff: string | undefined;\n\t\t\t\tfor (const row of rows) {\n\t\t\t\t\tfor (const name of row.control?.addTools ?? [])\n\t\t\t\t\t\tif (!selectedTools.includes(name)) selectedTools.push(name);\n\t\t\t\t\tif (row.control?.terminate) terminate = true;\n\t\t\t\t\tif (row.control?.handoff !== undefined) handoff = row.control.handoff;\n\t\t\t\t}\n\t\t\t\tif (selectedTools.length !== state.selectedTools.length) {\n\t\t\t\t\tstate.selectedTools = selectedTools;\n\t\t\t\t\ttx.emit({ type: \"config.changed\", keys: [\"selectedTools\"] });\n\t\t\t\t}\n\t\t\t\tfor (const row of rows) {\n\t\t\t\t\tif (row.missing === undefined) continue;\n\t\t\t\t\ttx.appendEntry(conversationId, {\n\t\t\t\t\t\tkind: \"pi.tool_result\",\n\t\t\t\t\t\tmodel: [\n\t\t\t\t\t\t\ttoStored({\n\t\t\t\t\t\t\t\trole: \"toolResult\" as const,\n\t\t\t\t\t\t\t\ttoolCallId: row.call.id,\n\t\t\t\t\t\t\t\ttoolName: row.call.name,\n\t\t\t\t\t\t\t\tcontent: [{ type: \"text\" as const, text: `Tool result unavailable: task ${row.missing}.` }],\n\t\t\t\t\t\t\t\tisError: true,\n\t\t\t\t\t\t\t\ttimestamp: rt.now(),\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t],\n\t\t\t\t\t\tdata: { diagnostics: [{ severity: \"error\", message: row.missing, code: row.missing }] },\n\t\t\t\t\t});\n\t\t\t\t\ttx.emit({\n\t\t\t\t\t\ttype: \"warning\",\n\t\t\t\t\t\tsource: \"post_tools\",\n\t\t\t\t\t\tmessage: `synthesized ${row.missing} tool result for ${row.call.id}`,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tlet headBoundary = head?.id;\n\t\t\t\tif (handoff !== undefined) {\n\t\t\t\t\theadBoundary = tx.appendEntry(conversationId, {\n\t\t\t\t\t\tkind: \"pi.handoff\",\n\t\t\t\t\t\thead: \"self\",\n\t\t\t\t\t\tmodel: [{ role: \"user\", content: handoff, timestamp: rt.now() }],\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tif (handoff !== undefined || terminate) {\n\t\t\t\t\ttx.sticky(conversationId).turn = { tools: [] };\n\t\t\t\t\tawait tx.resolveInputs(task.input.inputs, { status: \"done\", answer: task.input.assistant });\n\t\t\t\t\ttx.emit({ type: \"turn.ended\", inputs: task.input.inputs, status: \"done\", answer: task.input.assistant });\n\t\t\t\t\tconst { triggers } = await tx.boundary(conversationId, \"final\", headBoundary);\n\t\t\t\t\tif (triggers.length > 0) tx.emit({ type: \"turn.started\", inputs: triggers });\n\t\t\t\t\tconst ended = handoff !== undefined ? \"handoff\" : \"terminate\";\n\t\t\t\t\treturn {\n\t\t\t\t\t\tstatus: \"completed\",\n\t\t\t\t\t\tresult:\n\t\t\t\t\t\t\ttriggers.length > 0\n\t\t\t\t\t\t\t\t? { ended, successor: tx.createTask({ kind: \"pi.generation\", input: { inputs: triggers } }) }\n\t\t\t\t\t\t\t\t: { ended },\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tconst { triggers, terminated } = await tx.boundary(conversationId, \"postTools\", headBoundary);\n\t\t\t\tif (terminated) {\n\t\t\t\t\ttx.sticky(conversationId).turn = { tools: [] };\n\t\t\t\t\tawait tx.resolveInputs(task.input.inputs, { status: \"unanswered\", reason: \"terminated\" });\n\t\t\t\t\ttx.emit({ type: \"turn.ended\", inputs: task.input.inputs, status: \"unanswered\", reason: \"terminated\" });\n\t\t\t\t\tif (triggers.length > 0) tx.emit({ type: \"turn.started\", inputs: triggers });\n\t\t\t\t\treturn {\n\t\t\t\t\t\tstatus: \"completed\",\n\t\t\t\t\t\tresult:\n\t\t\t\t\t\t\ttriggers.length > 0\n\t\t\t\t\t\t\t\t? { successor: tx.createTask({ kind: \"pi.generation\", input: { inputs: triggers } }) }\n\t\t\t\t\t\t\t\t: {},\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\tstatus: \"completed\",\n\t\t\t\t\tresult: {\n\t\t\t\t\t\tsuccessor: tx.createTask({\n\t\t\t\t\t\t\tkind: \"pi.generation\",\n\t\t\t\t\t\t\tinput: { inputs: [...task.input.inputs, ...triggers] },\n\t\t\t\t\t\t}),\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t},\n\t\t};\n\t},\n\n\tasync abort(task) {\n\t\treturn async (tx, current) => {\n\t\t\ttx.sticky(current.conversationId).turn = { tools: [] };\n\t\t\tawait tx.resolveInputs(task.input.inputs, { status: \"unanswered\", reason: \"aborted\" });\n\t\t\ttx.emit({ type: \"turn.ended\", inputs: task.input.inputs, status: \"unanswered\", reason: \"aborted\" });\n\t\t\treturn null;\n\t\t};\n\t},\n};\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"task-api.d.ts","sourceRoot":"","sources":["../../../../src/harness/pico3/kinds/task-api.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAA0B,OAAO,EAAE,IAAI,EAAW,OAAO,EAAE,MAAM,aAAa,CAAC;AAE3F,wBAAgB,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAgD7D","sourcesContent":["import type { Context } from \"@earendil-works/chord\";\nimport type { AnyKind, Id, JsonValue, Runtime, Task, TaskRef, ToolApi } from \"../types.ts\";\n\nexport function taskApi(task: Task, runtime: Runtime): ToolApi {\n\tconst isKind = (value: unknown): value is AnyKind =>\n\t\ttypeof value === \"object\" && value !== null && \"name\" in value && \"initial\" in value;\n\treturn {\n\t\ttaskId: task.id,\n\t\tconversationId: task.conversationId,\n\t\tcallId: \"\",\n\t\tstream: () => {\n\t\t\tthrow new Error(\"stream is only available to tools\");\n\t\t},\n\t\tprogress: () => {\n\t\t\tthrow new Error(\"progress is only available to tools\");\n\t\t},\n\t\tmemo: (() => Promise.reject(new Error(\"memo is only available to tools\"))) as ToolApi[\"memo\"],\n\t\tasync conversation(spec, ctx) {\n\t\t\tconst id = await runtime.createOwnedConversation(spec, ctx);\n\t\t\treturn {\n\t\t\t\tid,\n\t\t\t\tsend: async (input, childContext) => {\n\t\t\t\t\tconst inputId = await runtime.sendOwned(id, input, childContext);\n\t\t\t\t\treturn {\n\t\t\t\t\t\tid: inputId,\n\t\t\t\t\t\twait: (waitContext) => runtime.waitForInput(inputId, waitContext),\n\t\t\t\t\t\tresult: (resultContext) => runtime.commit((tx) => tx.input(inputId), resultContext),\n\t\t\t\t\t};\n\t\t\t\t},\n\t\t\t\tabort: (childContext) => runtime.abortConversation(id, childContext),\n\t\t\t};\n\t\t},\n\t\ttask: ((\n\t\t\tkind: AnyKind,\n\t\t\tinput: JsonValue,\n\t\t\topts: { background?: true; after?: Id[] },\n\t\t\tctx: Context,\n\t\t): Promise<TaskRef> => {\n\t\t\tif (!isKind(kind)) throw new Error(\"task(): pass a kind token\");\n\t\t\treturn runtime.commit((tx) => tx.createTask(kind, input as never, opts), ctx);\n\t\t}) as ToolApi[\"task\"],\n\t\tgetTask: async (ref, ctx) => (await runtime.commit((tx) => tx.task(ref.id), ctx)) as never,\n\t\twaitForTask: (ref, ctx) => runtime.waitForTask(ref.id, ctx) as never,\n\t\tslot: (ref, ctx) =>\n\t\t\truntime.commit(async (tx) => {\n\t\t\t\tconst storedTask = await tx.task(ref.id);\n\t\t\t\tif (storedTask === undefined) return undefined;\n\t\t\t\treturn (tx.snapshot({ doc: \"sticky\", conversationId: storedTask.conversationId }).tasks[ref.id] ??\n\t\t\t\t\tundefined) as never;\n\t\t\t}, ctx),\n\t};\n}\n"]}
1
+ {"version":3,"file":"task-api.d.ts","sourceRoot":"","sources":["../../../../src/harness/pico3/kinds/task-api.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAA0B,OAAO,EAAE,IAAI,EAAW,OAAO,EAAE,MAAM,aAAa,CAAC;AAE3F,wBAAgB,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAgD7D"}
@@ -1 +1 @@
1
- {"version":3,"file":"task-api.js","sourceRoot":"","sources":["../../../../src/harness/pico3/kinds/task-api.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Context } from \"@earendil-works/chord\";\nimport type { AnyKind, Id, JsonValue, Runtime, Task, TaskRef, ToolApi } from \"../types.ts\";\n\nexport function taskApi(task: Task, runtime: Runtime): ToolApi {\n\tconst isKind = (value: unknown): value is AnyKind =>\n\t\ttypeof value === \"object\" && value !== null && \"name\" in value && \"initial\" in value;\n\treturn {\n\t\ttaskId: task.id,\n\t\tconversationId: task.conversationId,\n\t\tcallId: \"\",\n\t\tstream: () => {\n\t\t\tthrow new Error(\"stream is only available to tools\");\n\t\t},\n\t\tprogress: () => {\n\t\t\tthrow new Error(\"progress is only available to tools\");\n\t\t},\n\t\tmemo: (() => Promise.reject(new Error(\"memo is only available to tools\"))) as ToolApi[\"memo\"],\n\t\tasync conversation(spec, ctx) {\n\t\t\tconst id = await runtime.createOwnedConversation(spec, ctx);\n\t\t\treturn {\n\t\t\t\tid,\n\t\t\t\tsend: async (input, childContext) => {\n\t\t\t\t\tconst inputId = await runtime.sendOwned(id, input, childContext);\n\t\t\t\t\treturn {\n\t\t\t\t\t\tid: inputId,\n\t\t\t\t\t\twait: (waitContext) => runtime.waitForInput(inputId, waitContext),\n\t\t\t\t\t\tresult: (resultContext) => runtime.commit((tx) => tx.input(inputId), resultContext),\n\t\t\t\t\t};\n\t\t\t\t},\n\t\t\t\tabort: (childContext) => runtime.abortConversation(id, childContext),\n\t\t\t};\n\t\t},\n\t\ttask: ((\n\t\t\tkind: AnyKind,\n\t\t\tinput: JsonValue,\n\t\t\topts: { background?: true; after?: Id[] },\n\t\t\tctx: Context,\n\t\t): Promise<TaskRef> => {\n\t\t\tif (!isKind(kind)) throw new Error(\"task(): pass a kind token\");\n\t\t\treturn runtime.commit((tx) => tx.createTask(kind, input as never, opts), ctx);\n\t\t}) as ToolApi[\"task\"],\n\t\tgetTask: async (ref, ctx) => (await runtime.commit((tx) => tx.task(ref.id), ctx)) as never,\n\t\twaitForTask: (ref, ctx) => runtime.waitForTask(ref.id, ctx) as never,\n\t\tslot: (ref, ctx) =>\n\t\t\truntime.commit(async (tx) => {\n\t\t\t\tconst storedTask = await tx.task(ref.id);\n\t\t\t\tif (storedTask === undefined) return undefined;\n\t\t\t\treturn (tx.snapshot({ doc: \"sticky\", conversationId: storedTask.conversationId }).tasks[ref.id] ??\n\t\t\t\t\tundefined) as never;\n\t\t\t}, ctx),\n\t};\n}\n"]}
1
+ {"version":3,"file":"task-api.js","sourceRoot":"","sources":["../../../../src/harness/pico3/kinds/task-api.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Context } from \"@earendil-works/chord\";\nimport type { AnyKind, Id, JsonValue, Runtime, Task, TaskRef, ToolApi } from \"../types.ts\";\n\nexport function taskApi(task: Task, runtime: Runtime): ToolApi {\n\tconst isKind = (value: unknown): value is AnyKind =>\n\t\ttypeof value === \"object\" && value !== null && \"name\" in value && \"initial\" in value;\n\treturn {\n\t\ttaskId: task.id,\n\t\tconversationId: task.conversationId,\n\t\tcallId: \"\",\n\t\tstream: () => {\n\t\t\tthrow new Error(\"stream is only available to tools\");\n\t\t},\n\t\tprogress: () => {\n\t\t\tthrow new Error(\"progress is only available to tools\");\n\t\t},\n\t\tmemo: (() => Promise.reject(new Error(\"memo is only available to tools\"))) as ToolApi[\"memo\"],\n\t\tasync conversation(spec, ctx) {\n\t\t\tconst id = await runtime.createOwnedConversation(spec, ctx);\n\t\t\treturn {\n\t\t\t\tid,\n\t\t\t\tsend: async (input, childContext) => {\n\t\t\t\t\tconst inputId = await runtime.sendOwned(id, input, childContext);\n\t\t\t\t\treturn {\n\t\t\t\t\t\tid: inputId,\n\t\t\t\t\t\twait: (waitContext) => runtime.waitForInput(inputId, waitContext),\n\t\t\t\t\t\tresult: (resultContext) => runtime.commit((tx) => tx.input(inputId), resultContext),\n\t\t\t\t\t};\n\t\t\t\t},\n\t\t\t\tabort: (childContext) => runtime.abortConversation(id, childContext),\n\t\t\t};\n\t\t},\n\t\ttask: ((\n\t\t\tkind: AnyKind,\n\t\t\tinput: JsonValue,\n\t\t\topts: { background?: true; after?: Id[] },\n\t\t\tctx: Context,\n\t\t): Promise<TaskRef> => {\n\t\t\tif (!isKind(kind)) throw new Error(\"task(): pass a kind token\");\n\t\t\treturn runtime.commit((tx) => tx.createTask(kind, input as never, opts), ctx);\n\t\t}) as ToolApi[\"task\"],\n\t\tgetTask: async (ref, ctx) => (await runtime.commit((tx) => tx.task(ref.id), ctx)) as never,\n\t\twaitForTask: (ref, ctx) => runtime.waitForTask(ref.id, ctx) as never,\n\t\tslot: (ref, ctx) =>\n\t\t\truntime.commit(async (tx) => {\n\t\t\t\tconst storedTask = await tx.task(ref.id);\n\t\t\t\tif (storedTask === undefined) return undefined;\n\t\t\t\treturn (tx.snapshot({ doc: \"sticky\", conversationId: storedTask.conversationId }).tasks[ref.id] ??\n\t\t\t\t\tundefined) as never;\n\t\t\t}, ctx),\n\t};\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"tool.d.ts","sourceRoot":"","sources":["../../../../src/harness/pico3/kinds/tool.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAItD,OAAO,EACN,KAAK,kBAAkB,EACvB,KAAK,aAAa,EAGlB,KAAK,QAAQ,EAEb,KAAK,QAAQ,EACb,KAAK,UAAU,EACf,KAAK,EAAE,EAIP,KAAK,IAAI,EACT,KAAK,MAAM,EAGX,KAAK,WAAW,EAChB,KAAK,UAAU,EAGf,MAAM,aAAa,CAAC;AAGrB,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;AAC9C,MAAM,MAAM,SAAS,GAAG;IACvB,SAAS,EAAE,EAAE,CAAC;IACd,IAAI,EAAE,cAAc,CAAC;IACrB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;CACd,CAAC;AACF,MAAM,MAAM,cAAc,GAAG;IAAE,KAAK,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,MAAM,GAAG,QAAQ,CAAC;IAAC,IAAI,EAAE,cAAc,CAAA;CAAE,CAAC;AACnG,MAAM,MAAM,cAAc,GAAG;IAAE,KAAK,EAAE,EAAE,CAAC;IAAC,OAAO,CAAC,EAAE,WAAW,CAAA;CAAE,CAAC;AAClE,4FAA0F;AAC1F,MAAM,WAAW,SAAS;IACzB,kGAAkG;IAClG,UAAU,CACT,IAAI,EAAE,cAAc,EACpB,GAAG,EAAE,aAAa,EAClB,GAAG,EAAE,OAAO,GACV,UAAU,CAAC;QAAE,IAAI,CAAC,EAAE,cAAc,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACzD,6DAA6D;IAC7D,SAAS,CACR,IAAI,EAAE,cAAc,EACpB,MAAM,EAAE,UAAU,EAClB,GAAG,EAAE,QAAQ,GAAG;QAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;KAAE,EAC3C,GAAG,EAAE,OAAO,GACV,UAAU,CAAC,UAAU,CAAC,CAAC;CAC1B;AAWD,oEAAoE;AACpE,wBAAgB,OAAO,CAAC,WAAW,EAAE,kBAAkB,EAAE,IAAI,EAAE,cAAc,GAAG,MAAM,GAAG,SAAS,CAGjG;AAID,eAAO,MAAM,IAAI,EAAE,QAAQ,CAAC,SAAS,EAAE,cAAc,EAAE,cAAc,EAAE,KAAK,EAAE;IAAE,KAAK,EAAE,EAAE,CAAA;CAAE,EAAE,SAAS,CA8GrG,CAAC;AAgEF,eAAO,MAAM,cAAc;;;;CAAkE,CAAC;AAwO9F,YAAY,EAAE,IAAI,EAAE,CAAC","sourcesContent":["import type { Context } from \"@earendil-works/chord\";\nimport type { ToolCall } from \"@earendil-works/pi-ai\";\nimport type { TSchema } from \"typebox\";\nimport { Errors } from \"typebox/value\";\nimport { Bounded } from \"../bounded.ts\";\nimport {\n\ttype AnyToolDeclaration,\n\ttype BeforeToolApi,\n\ttype Closure,\n\ttype Completion,\n\ttype CoreKind,\n\ttype CoreTx,\n\ttype HookInfo,\n\ttype HookResult,\n\ttype Id,\n\ttype JsonObject,\n\ttype JsonValue,\n\ttype Runtime,\n\ttype Step,\n\ttype Stored,\n\ttype Task,\n\ttype ToolApi,\n\ttype ToolControl,\n\ttype ToolResult,\n\ttype ToolSlot,\n\ttoStored,\n} from \"../types.ts\";\nimport { taskApi } from \"./task-api.ts\";\n\nexport type StoredToolCall = Stored<ToolCall>;\nexport type ToolInput = {\n\tassistant: Id;\n\tcall: StoredToolCall;\n\toffered: string[];\n\tindex: number; // position of the call in the assistant message; also this tool's slot in sticky.turn.tools\n};\nexport type ToolCheckpoint = { phase: \"started\"; replay: \"safe\" | \"unsafe\"; call: StoredToolCall };\nexport type ToolTaskResult = { entry: Id; control?: ToolControl };\n/** Hook points this kind calls. Register with `h.hooks(namespace, kinds.tool, { … })`. */\nexport interface ToolHooks {\n\t/** Before invocation, before `started`. Chain on `call`; `{ block }` stops it. A throw blocks. */\n\tbeforeTool(\n\t\tcall: StoredToolCall,\n\t\tapi: BeforeToolApi,\n\t\tctx: Context,\n\t): HookResult<{ call?: StoredToolCall; block?: string }>;\n\t/** After the tool returns; may replace the result. Chain. */\n\tafterTool(\n\t\tcall: StoredToolCall,\n\t\tresult: ToolResult,\n\t\tapi: HookInfo & { readonly callId: string },\n\t\tctx: Context,\n\t): HookResult<ToolResult>;\n}\n\ntype T = Task<ToolInput, ToolCheckpoint>;\ntype Rt = Runtime<ToolHooks, CoreTx>;\ntype Out = Closure<ToolTaskResult, never, CoreTx>;\n\nconst synthetic = (text: string, code: string): ToolResult => ({\n\tcontent: [{ type: \"text\", text }],\n\tisError: true,\n\tdiagnostics: [{ severity: \"error\", message: text, code }],\n});\n/** Validate arguments with the tool's real schema (TypeBox 1.x). */\nexport function invalid(declaration: AnyToolDeclaration, call: StoredToolCall): string | undefined {\n\tconst errors = [...Errors(declaration.parameters as TSchema, call.arguments)];\n\treturn errors.length === 0 ? undefined : errors.map((e) => `${e.instancePath || \"/\"}: ${e.message}`).join(\"; \");\n}\nconst sameIdentity = (a: StoredToolCall, b: StoredToolCall) =>\n\ta.id === b.id && a.name === b.name && a.namespace === b.namespace;\n\nexport const tool: CoreKind<ToolInput, ToolCheckpoint, ToolTaskResult, never, { entry: Id }, ToolHooks> = {\n\tname: \"pi.tool\",\n\tturn: true,\n\tinflight: [\"started\"],\n\n\t// Offered-set check, lookup, validate, beforeTool, validate again; then write `started`\n\t// (the in-flight checkpoint) and invoke. A crash before `started` reruns all of this.\n\tasync initial(task, rt, ctx) {\n\t\tconst call = task.input.call;\n\t\tif (!task.input.offered.includes(call.name))\n\t\t\treturn {\n\t\t\t\tdone: close(task, synthetic(`tool ${call.name} was not offered`, \"not_offered\"), undefined, rt.now()),\n\t\t\t};\n\t\tconst declaration = rt.tools.get(call.name);\n\t\tif (declaration === undefined)\n\t\t\treturn {\n\t\t\t\tdone: close(task, synthetic(`tool ${call.name} is not registered`, \"missing_tool\"), undefined, rt.now()),\n\t\t\t};\n\t\tconst bad = invalid(declaration, call);\n\t\tif (bad !== undefined)\n\t\t\treturn {\n\t\t\t\tdone: close(task, synthetic(`invalid arguments: ${bad}`, \"invalid_arguments\"), declaration, rt.now()),\n\t\t\t};\n\t\tconst hooked = await beforeTool(task, rt, call, ctx);\n\t\tif (\"block\" in hooked)\n\t\t\treturn { done: close(task, synthetic(`blocked: ${hooked.block}`, \"blocked\"), declaration, rt.now()) };\n\t\tif (!sameIdentity(call, hooked.call))\n\t\t\treturn { done: close(task, synthetic(\"blocked: call identity changed\", \"blocked\"), declaration, rt.now()) };\n\t\tconst badFinal = invalid(declaration, hooked.call);\n\t\tif (badFinal !== undefined)\n\t\t\treturn {\n\t\t\t\tdone: close(\n\t\t\t\t\ttask,\n\t\t\t\t\tsynthetic(`invalid arguments after hook: ${badFinal}`, \"invalid_arguments\"),\n\t\t\t\t\tdeclaration,\n\t\t\t\t\trt.now(),\n\t\t\t\t),\n\t\t\t};\n\t\tconst final = toStored(hooked.call);\n\t\tawait rt.commit((tx) => {\n\t\t\ttx.checkpoint({ phase: \"started\", replay: declaration.replay ?? \"unsafe\", call: final });\n\t\t\tconst slot = tx.toolSlot(task);\n\t\t\tslot.status = \"running\";\n\t\t\tdelete slot.waitingOn;\n\t\t\ttx.emit({ type: \"tool.started\", taskId: task.id, callId: final.id, name: final.name });\n\t\t}, ctx); // durable before the effect\n\t\treturn { done: await invoke(task, final, declaration, rt, ctx) };\n\t},\n\n\tphases: {\n\t\t// Only entered by the scheduler after reopen. The stored final call is the evidence; beforeTool never reruns.\n\t\tasync started(task, rt, ctx) {\n\t\t\tconst cp = task.checkpoint;\n\t\t\tconst declaration = rt.tools.get(cp.call.name);\n\t\t\tif (declaration === undefined)\n\t\t\t\treturn {\n\t\t\t\t\tdone: close(\n\t\t\t\t\t\ttask,\n\t\t\t\t\t\tsynthetic(`tool ${cp.call.name} unavailable after restart`, \"unavailable\"),\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\trt.now(),\n\t\t\t\t\t\tcp.call,\n\t\t\t\t\t),\n\t\t\t\t};\n\t\t\tif (cp.replay !== \"safe\" || (declaration.replay ?? \"unsafe\") !== \"safe\")\n\t\t\t\treturn {\n\t\t\t\t\tdone: close(\n\t\t\t\t\t\ttask,\n\t\t\t\t\t\tsynthetic(`tool ${cp.call.name} was interrupted`, \"interrupted\"),\n\t\t\t\t\t\tdeclaration,\n\t\t\t\t\t\trt.now(),\n\t\t\t\t\t\tcp.call,\n\t\t\t\t\t),\n\t\t\t\t};\n\t\t\tif (invalid(declaration, cp.call) !== undefined)\n\t\t\t\treturn {\n\t\t\t\t\tdone: close(\n\t\t\t\t\t\ttask,\n\t\t\t\t\t\tsynthetic(`tool ${cp.call.name} was interrupted; arguments no longer validate`, \"interrupted\"),\n\t\t\t\t\t\tdeclaration,\n\t\t\t\t\t\trt.now(),\n\t\t\t\t\t\tcp.call,\n\t\t\t\t\t),\n\t\t\t\t};\n\t\t\treturn { done: await invoke(task, cp.call, declaration, rt, ctx) };\n\t\t},\n\t},\n\n\tasync abort(task, rt, ctx) {\n\t\tfor (const conversationId of task.owns) {\n\t\t\tconst children = await rt.commit((tx) => tx.tasks({ conversationId, status: [\"pending\", \"running\"] }), ctx);\n\t\t\tfor (const child of children) if (!child.background) await rt.abortTask(child.id, ctx);\n\t\t}\n\t\treturn (tx, current) => {\n\t\t\tconst call = task.checkpoint?.call ?? task.input.call;\n\t\t\tconst entry = tx.appendEntry(current.conversationId, {\n\t\t\t\tkind: \"pi.tool_result\",\n\t\t\t\tmodel: [toMessage(call, synthetic(\"tool aborted\", \"aborted\"), rt.now())],\n\t\t\t\tdata: { diagnostics: [{ severity: \"error\", message: \"aborted\", code: \"aborted\" }] },\n\t\t\t});\n\t\t\tconst slot = tx.sticky(current.conversationId).turn.tools[task.input.index];\n\t\t\tif (slot !== undefined) {\n\t\t\t\tslot.status = \"aborted\";\n\t\t\t\tslot.entry = entry;\n\t\t\t\tdelete slot.waitingOn;\n\t\t\t}\n\t\t\ttx.emit({ type: \"tool.aborted\", taskId: current.id, callId: call.id, entry });\n\t\t\treturn { entry };\n\t\t};\n\t},\n};\n\n/** The one point where a throwing handler blocks rather than being skipped. */\nasync function beforeTool(\n\ttask: T,\n\trt: Rt,\n\tcall: StoredToolCall,\n\tctx: Context,\n): Promise<{ call: StoredToolCall } | { block: string }> {\n\tlet current = call;\n\tfor (const binding of rt.hooks.handlers()) {\n\t\tfunction memo<T extends JsonValue>(name: string, candidate: T, context: Context): Promise<T>;\n\t\tfunction memo<T extends JsonValue>(name: string, context: Context): Promise<T | undefined>;\n\t\tfunction memo<T extends JsonValue>(\n\t\t\tname: string,\n\t\t\tcandidateOrContext: T | Context,\n\t\t\tcontext?: Context,\n\t\t): Promise<T | undefined> {\n\t\t\tconst targetContext = context ?? (candidateOrContext as Context);\n\t\t\treturn rt.commit((tx) => {\n\t\t\t\ttx.plugins(binding.namespace);\n\t\t\t\tconst slot = tx.toolSlot(task);\n\t\t\t\tif (!Object.hasOwn(slot, \"memos\")) slot.memos = {};\n\t\t\t\tconst memos = slot.memos!;\n\t\t\t\tconst key = `hook:${binding.namespace.id}:${name}`;\n\t\t\t\tif (Object.hasOwn(memos, key)) return structuredClone(memos[key]) as T;\n\t\t\t\tif (context === undefined) return undefined;\n\t\t\t\tconst candidate = structuredClone(candidateOrContext as T);\n\t\t\t\tmemos[key] = candidate;\n\t\t\t\treturn candidate;\n\t\t\t}, targetContext);\n\t\t}\n\t\tconst api: BeforeToolApi = {\n\t\t\t...binding.api,\n\t\t\tcallId: call.id,\n\t\t\twaiting: (context) =>\n\t\t\t\trt.commit((tx, currentTask) => {\n\t\t\t\t\ttx.plugins(binding.namespace);\n\t\t\t\t\tconst slot = tx.toolSlot(currentTask as T);\n\t\t\t\t\tif (slot.waitingOn === binding.namespace.id) return;\n\t\t\t\t\tslot.waitingOn = binding.namespace.id;\n\t\t\t\t\ttx.emit({\n\t\t\t\t\t\ttype: \"tool.waiting\",\n\t\t\t\t\t\ttaskId: currentTask.id,\n\t\t\t\t\t\tcallId: call.id,\n\t\t\t\t\t\ton: binding.namespace.id,\n\t\t\t\t\t});\n\t\t\t\t}, context),\n\t\t\tmemo,\n\t\t\temit: (name, data, context) => rt.commit((tx) => tx.emit(binding.namespace, name, data), context),\n\t\t};\n\t\ttry {\n\t\t\tconst value = await binding.handlers.beforeTool?.(current, api, ctx);\n\t\t\tif (!value) continue;\n\t\t\tif (value.block !== undefined) return { block: value.block };\n\t\t\tif (value.call !== undefined) current = value.call;\n\t\t} catch (error) {\n\t\t\tif (ctx.abortSignal?.aborted) throw error;\n\t\t\treturn { block: `hook threw: ${String(error)}` };\n\t\t}\n\t}\n\treturn { call: current };\n}\n\nexport const DEFAULT_BOUNDS = { maxBytes: 64 * 1024, maxLines: 200, retain: \"head\" as const };\n\nasync function invoke(\n\ttask: T,\n\tcall: StoredToolCall,\n\tdeclaration: AnyToolDeclaration,\n\trt: Rt,\n\tctx: Context,\n): Promise<Out> {\n\t// The kernel owns the stream: one bounded buffer, one throttle, one flush path. Flush failures are not swallowed.\n\tconst b = { ...DEFAULT_BOUNDS, ...declaration.output };\n\tconst buffer = new Bounded(b.maxBytes, b.maxLines, b.retain);\n\tlet streamed = false;\n\tlet lastFlush = 0;\n\tlet flushing: Promise<void> = Promise.resolve();\n\tlet flushError: unknown;\n\tconst flush = () => {\n\t\tlastFlush = rt.now();\n\t\tconst text = buffer.text();\n\t\tflushing = flushing\n\t\t\t.then(() =>\n\t\t\t\trt.commit((tx) => {\n\t\t\t\t\ttx.toolSlot(task).output = text;\n\t\t\t\t}, ctx),\n\t\t\t)\n\t\t\t.catch((e) => {\n\t\t\t\tflushError ??= e;\n\t\t\t});\n\t};\n\tconst api = {\n\t\t...taskApi(task, rt),\n\t\t// Only the free fields; identity (callId/name/args/output) is protected.\n\t\tprogress: (update: (slot: Pick<ToolSlot, \"progress\" | \"details\" | \"continuedBy\">) => void, c: Context) =>\n\t\t\trt.commit((tx) => {\n\t\t\t\tconst slot = tx.toolSlot(task);\n\t\t\t\tconst free: Pick<ToolSlot, \"progress\" | \"details\" | \"continuedBy\"> = {\n\t\t\t\t\tprogress: slot.progress,\n\t\t\t\t\tdetails: slot.details,\n\t\t\t\t\tcontinuedBy: slot.continuedBy,\n\t\t\t\t};\n\t\t\t\tupdate(free);\n\t\t\t\tif (free.progress !== undefined) slot.progress = free.progress;\n\t\t\t\telse delete slot.progress;\n\t\t\t\tif (free.details !== undefined) slot.details = toStored(free.details);\n\t\t\t\telse delete slot.details;\n\t\t\t\tif (free.continuedBy !== undefined) slot.continuedBy = free.continuedBy;\n\t\t\t\telse delete slot.continuedBy;\n\t\t\t}, c),\n\t\tstream(chunk: string | Uint8Array) {\n\t\t\tstreamed = true;\n\t\t\tbuffer.push(typeof chunk === \"string\" ? new TextEncoder().encode(chunk) : chunk);\n\t\t\tif (rt.now() - lastFlush >= 100) flush();\n\t\t},\n\t};\n\tfunction memo<T extends JsonValue>(name: string, candidate: T, context: Context): Promise<T>;\n\tfunction memo<T extends JsonValue>(name: string, context: Context): Promise<T | undefined>;\n\tfunction memo<T extends JsonValue>(\n\t\tname: string,\n\t\tcandidateOrContext: T | Context,\n\t\tcontext?: Context,\n\t): Promise<T | undefined> {\n\t\tconst targetContext = context ?? (candidateOrContext as Context);\n\t\treturn rt.commit((tx) => {\n\t\t\tconst slot = tx.toolSlot(task);\n\t\t\tif (!Object.hasOwn(slot, \"memos\")) slot.memos = {};\n\t\t\tconst memos = slot.memos!;\n\t\t\tconst key = `tool:${name}`;\n\t\t\tif (Object.hasOwn(memos, key)) return structuredClone(memos[key]) as T;\n\t\t\tif (context === undefined) return undefined;\n\t\t\tconst candidate = structuredClone(candidateOrContext as T);\n\t\t\tmemos[key] = candidate;\n\t\t\treturn candidate;\n\t\t}, targetContext);\n\t}\n\tconst toolApi: typeof api & Pick<ToolApi, \"callId\" | \"memo\"> = { ...api, callId: call.id, memo };\n\tlet result: ToolResult;\n\ttry {\n\t\tresult = await declaration.execute(call.arguments as never, toolApi, ctx);\n\t} catch (error) {\n\t\tif (ctx.abortSignal?.aborted) throw error;\n\t\tresult = synthetic(`tool threw: ${String(error)}`, \"threw\");\n\t}\n\tif (streamed) {\n\t\tflush();\n\t\tawait flushing;\n\t\tif (flushError !== undefined) throw flushError; // a persistence failure is never hidden\n\t\tif (result.content === undefined)\n\t\t\tresult = {\n\t\t\t\t...result,\n\t\t\t\tcontent: [{ type: \"text\", text: buffer.text() }],\n\t\t\t\t...(buffer.dropped\n\t\t\t\t\t? {\n\t\t\t\t\t\t\tdiagnostics: [\n\t\t\t\t\t\t\t\t...(result.diagnostics ?? []),\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tseverity: \"warn\" as const,\n\t\t\t\t\t\t\t\t\tcode: \"truncated\",\n\t\t\t\t\t\t\t\t\tmessage: `${buffer.droppedBytes} bytes / ${buffer.droppedLines} lines dropped (${b.retain} ${b.maxBytes} retained)`,\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};\n\t}\n\tlet final = result;\n\tawait rt.hooks.each(\n\t\tctx,\n\t\t(h, api) => h.afterTool?.(call, final, { ...api, callId: call.id }, ctx),\n\t\t(value) => {\n\t\t\tif (value !== undefined) final = value;\n\t\t},\n\t);\n\treturn close(\n\t\ttask,\n\t\tfinal,\n\t\tdeclaration,\n\t\trt.now(),\n\t\tcall,\n\t\tstreamed ? { bytes: buffer.droppedBytes, lines: buffer.droppedLines } : undefined,\n\t);\n}\n\n/** Closure: bound the output, store the exact model message under the stored final call, rest as strict-JSON data. */\nfunction close(\n\ttask: T,\n\traw: ToolResult,\n\tdeclaration: AnyToolDeclaration | undefined,\n\tnow: number,\n\tcall: StoredToolCall = task.input.call,\n\tstreamTruncated?: { bytes: number; lines: number },\n): Out {\n\treturn (tx, current) => {\n\t\tconst bounded = bound({ ...raw, content: raw.content ?? [] }, declaration?.output);\n\t\tconst result = bounded.result;\n\t\tconst bytes = (bounded.truncated?.bytes ?? 0) + (streamTruncated?.bytes ?? 0);\n\t\tconst lines = (bounded.truncated?.lines ?? 0) + (streamTruncated?.lines ?? 0);\n\t\tconst truncated = bytes > 0 || lines > 0 ? { bytes, lines } : undefined;\n\t\tconst data: JsonObject = {};\n\t\tif (result.details !== undefined) data.details = toStored(result.details);\n\t\tif (result.diagnostics !== undefined) data.diagnostics = toStored(result.diagnostics);\n\t\tif (result.control !== undefined) data.control = toStored(result.control);\n\t\tif (truncated !== undefined) data.truncated = truncated;\n\t\tconst entry = tx.appendEntry(current.conversationId, {\n\t\t\tkind: \"pi.tool_result\",\n\t\t\tmodel: [toMessage(call, result, now)],\n\t\t\tdata,\n\t\t});\n\t\tconst slot = tx.toolSlot(task);\n\t\tslot.status = result.isError === true ? \"error\" : \"done\";\n\t\tslot.entry = entry;\n\t\tdelete slot.waitingOn;\n\t\ttx.emit({\n\t\t\ttype: \"tool.finished\",\n\t\t\ttaskId: current.id,\n\t\t\tcallId: call.id,\n\t\t\tentry,\n\t\t\tisError: result.isError === true,\n\t\t\t...(result.control === undefined ? {} : { control: result.control }),\n\t\t});\n\t\tif (truncated !== undefined)\n\t\t\ttx.emit({\n\t\t\t\ttype: \"warning\",\n\t\t\t\tsource: \"tool\",\n\t\t\t\tmessage: `tool output truncated: ${truncated.bytes} bytes / ${truncated.lines} lines dropped`,\n\t\t\t});\n\t\tconst completion: Completion<ToolTaskResult, never> = {\n\t\t\tstatus: \"completed\",\n\t\t\tresult: { entry, ...(result.control === undefined ? {} : { control: toStored(result.control) }) },\n\t\t};\n\t\treturn completion;\n\t};\n}\n\nfunction toMessage(call: StoredToolCall, result: ToolResult, now: number) {\n\treturn toStored({\n\t\trole: \"toolResult\" as const,\n\t\ttoolCallId: call.id,\n\t\ttoolName: call.name,\n\t\tcontent: result.content ?? [],\n\t\tisError: result.isError ?? false,\n\t\ttimestamp: now,\n\t});\n}\n\nfunction bound(\n\tresult: ToolResult,\n\tdeclared: AnyToolDeclaration[\"output\"],\n): { result: ToolResult; truncated?: { bytes: number; lines: number } } {\n\tconst bounds = { ...DEFAULT_BOUNDS, ...declared };\n\tconst blocks = result.content ?? [];\n\tlet text = blocks\n\t\t.filter((block) => block.type === \"text\")\n\t\t.map((block) => block.text)\n\t\t.join(\"\");\n\tlet droppedLines = 0;\n\tlet droppedBytes = 0;\n\tconst lines = text.split(\"\\n\");\n\tif (lines.length > bounds.maxLines) {\n\t\tdroppedLines = lines.length - bounds.maxLines;\n\t\ttext = (bounds.retain === \"head\" ? lines.slice(0, bounds.maxLines) : lines.slice(-bounds.maxLines)).join(\"\\n\");\n\t}\n\tconst bytes = new TextEncoder().encode(text);\n\tif (bytes.length > bounds.maxBytes) {\n\t\tdroppedBytes = bytes.length - bounds.maxBytes;\n\t\ttext = new TextDecoder().decode(\n\t\t\tbounds.retain === \"head\" ? bytes.subarray(0, bounds.maxBytes) : bytes.subarray(-bounds.maxBytes),\n\t\t);\n\t}\n\tif (droppedBytes === 0 && droppedLines === 0) return { result };\n\tlet textIndex = -1;\n\tfor (let index = 0; index < blocks.length; index++) {\n\t\tif (blocks[index]!.type !== \"text\") continue;\n\t\tif (bounds.retain === \"head\" && textIndex >= 0) continue;\n\t\ttextIndex = index;\n\t}\n\tconst content: NonNullable<ToolResult[\"content\"]> = [];\n\tfor (let index = 0; index < blocks.length; index++) {\n\t\tconst block = blocks[index]!;\n\t\tif (block.type !== \"text\") content.push(block);\n\t\telse if (index === textIndex) content.push({ ...block, text });\n\t}\n\tconst note = {\n\t\tseverity: \"warn\" as const,\n\t\tcode: \"truncated\",\n\t\tmessage: `output truncated: ${droppedLines} lines, ${droppedBytes} bytes dropped`,\n\t};\n\treturn {\n\t\tresult: { ...result, content, diagnostics: [...(result.diagnostics ?? []), note] },\n\t\ttruncated: { bytes: droppedBytes, lines: droppedLines },\n\t};\n}\n\nexport type { Step };\n"]}
1
+ {"version":3,"file":"tool.d.ts","sourceRoot":"","sources":["../../../../src/harness/pico3/kinds/tool.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAItD,OAAO,EACN,KAAK,kBAAkB,EACvB,KAAK,aAAa,EAGlB,KAAK,QAAQ,EAEb,KAAK,QAAQ,EACb,KAAK,UAAU,EACf,KAAK,EAAE,EAIP,KAAK,IAAI,EACT,KAAK,MAAM,EAGX,KAAK,WAAW,EAChB,KAAK,UAAU,EAGf,MAAM,aAAa,CAAC;AAGrB,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;AAC9C,MAAM,MAAM,SAAS,GAAG;IACvB,SAAS,EAAE,EAAE,CAAC;IACd,IAAI,EAAE,cAAc,CAAC;IACrB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;CACd,CAAC;AACF,MAAM,MAAM,cAAc,GAAG;IAAE,KAAK,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,MAAM,GAAG,QAAQ,CAAC;IAAC,IAAI,EAAE,cAAc,CAAA;CAAE,CAAC;AACnG,MAAM,MAAM,cAAc,GAAG;IAAE,KAAK,EAAE,EAAE,CAAC;IAAC,OAAO,CAAC,EAAE,WAAW,CAAA;CAAE,CAAC;AAClE,0FAA0F;AAC1F,MAAM,WAAW,SAAS;IACzB,kGAAkG;IAClG,UAAU,CACT,IAAI,EAAE,cAAc,EACpB,GAAG,EAAE,aAAa,EAClB,GAAG,EAAE,OAAO,GACV,UAAU,CAAC;QAAE,IAAI,CAAC,EAAE,cAAc,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACzD,6DAA6D;IAC7D,SAAS,CACR,IAAI,EAAE,cAAc,EACpB,MAAM,EAAE,UAAU,EAClB,GAAG,EAAE,QAAQ,GAAG;QAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;KAAE,EAC3C,GAAG,EAAE,OAAO,GACV,UAAU,CAAC,UAAU,CAAC,CAAC;CAC1B;AAWD,oEAAoE;AACpE,wBAAgB,OAAO,CAAC,WAAW,EAAE,kBAAkB,EAAE,IAAI,EAAE,cAAc,GAAG,MAAM,GAAG,SAAS,CAGjG;AAID,eAAO,MAAM,IAAI,EAAE,QAAQ,CAAC,SAAS,EAAE,cAAc,EAAE,cAAc,EAAE,KAAK,EAAE;IAAE,KAAK,EAAE,EAAE,CAAA;CAAE,EAAE,SAAS,CA8GrG,CAAC;AAgEF,eAAO,MAAM,cAAc;IAAK,QAAQ;IAAa,QAAQ;IAAO,MAAM,EAAE,MAAM;CAAW,CAAC;AAwO9F,YAAY,EAAE,IAAI,EAAE,CAAC"}