@inflexa-ai/harness 0.45.0 → 0.46.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (802) hide show
  1. package/README.md +6 -3
  2. package/dist/agents/conversation-agent.d.ts +19 -3
  3. package/dist/agents/conversation-agent.js +49 -30
  4. package/dist/agents/report-session-agent.d.ts +15 -15
  5. package/dist/agents/report-session-agent.js +23 -15
  6. package/dist/agents/sandbox/index.d.ts +1 -1
  7. package/dist/agents/sandbox/index.js +1 -1
  8. package/dist/agents/sandbox/shared.d.ts +35 -16
  9. package/dist/agents/sandbox/shared.js +63 -24
  10. package/dist/agents/sandbox/translational-safety-agent.js +26 -0
  11. package/dist/agents/sandbox/types.d.ts +26 -3
  12. package/dist/agents/sandbox/validate-skills.d.ts +2 -2
  13. package/dist/agents/sandbox/validate-skills.js +3 -1
  14. package/dist/agents/sandbox-catalog.d.ts +16 -2
  15. package/dist/agents/sandbox-catalog.js +22 -3
  16. package/dist/agents/system-prompt.d.ts +2 -2
  17. package/dist/app/approve-plan.d.ts +5 -2
  18. package/dist/app/approve-plan.js +1 -1
  19. package/dist/app/chat-turn-workflow.d.ts +114 -0
  20. package/dist/app/chat-turn-workflow.js +307 -0
  21. package/dist/app/chat-turn.d.ts +85 -57
  22. package/dist/app/chat-turn.js +125 -99
  23. package/dist/app/data-profile-orientation.js +10 -8
  24. package/dist/app/data-profile-view.d.ts +4 -4
  25. package/dist/app/data-profile-view.js +9 -8
  26. package/dist/app/in-process-turn.d.ts +42 -0
  27. package/dist/app/in-process-turn.js +139 -0
  28. package/dist/app/message-assembly.d.ts +10 -4
  29. package/dist/app/message-assembly.js +13 -8
  30. package/dist/app/report-session-runtime.d.ts +4 -4
  31. package/dist/app/report-session-runtime.js +36 -21
  32. package/dist/app/spawn-report-session.d.ts +33 -28
  33. package/dist/app/spawn-report-session.js +25 -40
  34. package/dist/app/synthesize-run.d.ts +22 -16
  35. package/dist/app/synthesize-run.js +41 -35
  36. package/dist/app/work.d.ts +96 -0
  37. package/dist/app/work.js +147 -0
  38. package/dist/auth/local-auth-context.d.ts +1 -3
  39. package/dist/auth/local-auth-context.js +1 -3
  40. package/dist/auth/local-run-authorizer.d.ts +1 -1
  41. package/dist/auth/local-run-authorizer.js +5 -3
  42. package/dist/auth/types.d.ts +26 -26
  43. package/dist/billing/cached-resolver.d.ts +4 -4
  44. package/dist/billing/run-charge.d.ts +5 -8
  45. package/dist/billing/run-charge.js +2 -2
  46. package/dist/billing/usage-recorder.d.ts +9 -9
  47. package/dist/citations/aggregate.js +1 -1
  48. package/dist/citations/clients/arxiv.d.ts +2 -2
  49. package/dist/citations/clients/arxiv.js +12 -4
  50. package/dist/citations/clients/common.js +4 -2
  51. package/dist/citations/clients/crossref.d.ts +2 -2
  52. package/dist/citations/clients/crossref.js +37 -37
  53. package/dist/citations/clients/doi-registry.js +15 -16
  54. package/dist/citations/clients/pubmed.d.ts +2 -2
  55. package/dist/citations/clients/pubmed.js +20 -13
  56. package/dist/citations/clients/semantic-scholar.d.ts +2 -2
  57. package/dist/citations/clients/semantic-scholar.js +9 -9
  58. package/dist/citations/compare.js +2 -2
  59. package/dist/citations/match.d.ts +2 -2
  60. package/dist/citations/match.js +12 -7
  61. package/dist/citations/normalize.js +35 -26
  62. package/dist/citations/plan.js +6 -2
  63. package/dist/citations/resolve.d.ts +6 -6
  64. package/dist/citations/resolve.js +34 -25
  65. package/dist/citations/types.d.ts +77 -77
  66. package/dist/config/environment-stores.d.ts +10 -8
  67. package/dist/config/resource-limits.js +1 -3
  68. package/dist/contracts/analogy-report.d.ts +7 -7
  69. package/dist/contracts/analogy-report.js +2 -2
  70. package/dist/contracts/chat-events.d.ts +46 -22
  71. package/dist/contracts/chat-events.js +1 -1
  72. package/dist/contracts/chat-frame.d.ts +15 -5
  73. package/dist/contracts/chat-frame.js +67 -40
  74. package/dist/contracts/chat-parts.d.ts +130 -67
  75. package/dist/contracts/chat-parts.js +1 -0
  76. package/dist/contracts/content-url.js +16 -2
  77. package/dist/contracts/data-profile.d.ts +38 -38
  78. package/dist/contracts/index.d.ts +3 -3
  79. package/dist/contracts/index.js +1 -1
  80. package/dist/contracts/message.d.ts +6 -6
  81. package/dist/contracts/organ-system.d.ts +11 -11
  82. package/dist/contracts/part-registry.d.ts +5 -4
  83. package/dist/contracts/part-registry.js +5 -0
  84. package/dist/contracts/profile-vocabulary.d.ts +11 -10
  85. package/dist/contracts/profile-vocabulary.js +10 -3
  86. package/dist/contracts/report-blocks.d.ts +329 -329
  87. package/dist/contracts/report-reference.d.ts +105 -81
  88. package/dist/contracts/report-reference.js +30 -13
  89. package/dist/contracts/schemas/chat-events.d.ts +45 -6
  90. package/dist/contracts/schemas/chat-events.js +16 -0
  91. package/dist/contracts/schemas/chat-parts.d.ts +214 -102
  92. package/dist/contracts/schemas/chat-parts.js +50 -7
  93. package/dist/contracts/schemas/index.d.ts +1 -1
  94. package/dist/contracts/schemas/index.js +1 -1
  95. package/dist/contracts/severity.d.ts +1 -1
  96. package/dist/contracts/structure-source.d.ts +3 -3
  97. package/dist/contracts/structure-source.js +6 -2
  98. package/dist/contracts/subagent-activity.d.ts +2 -2
  99. package/dist/contracts/subagent-activity.js +5 -3
  100. package/dist/contracts/usage.d.ts +2 -2
  101. package/dist/data/safety-panel-schema.d.ts +25 -25
  102. package/dist/data/safety-panel-schema.js +13 -4
  103. package/dist/execution/artifact-metadata.d.ts +23 -15
  104. package/dist/execution/artifact-metadata.js +33 -10
  105. package/dist/execution/artifact-record.d.ts +2 -2
  106. package/dist/execution/artifact-registration.d.ts +5 -5
  107. package/dist/execution/artifact-registry.d.ts +8 -8
  108. package/dist/execution/dbos-run-launcher.d.ts +24 -4
  109. package/dist/execution/dbos-run-launcher.js +58 -4
  110. package/dist/execution/dbos-workflow-purger.d.ts +7 -6
  111. package/dist/execution/dbos-workflow-purger.js +29 -21
  112. package/dist/execution/input-signature.d.ts +2 -2
  113. package/dist/execution/post-step-pipeline.d.ts +9 -9
  114. package/dist/execution/post-step-pipeline.js +1 -1
  115. package/dist/execution/post-step.js +2 -2
  116. package/dist/execution/reconcile-manifest.d.ts +4 -4
  117. package/dist/execution/reconcile-manifest.js +3 -2
  118. package/dist/execution/run-authorizer.d.ts +46 -37
  119. package/dist/execution/run-authorizer.js +8 -8
  120. package/dist/execution/run-canceler.d.ts +39 -17
  121. package/dist/execution/run-canceler.js +137 -28
  122. package/dist/execution/run-end-record.d.ts +29 -0
  123. package/dist/execution/run-end-record.js +27 -0
  124. package/dist/execution/run-event-parts.d.ts +0 -8
  125. package/dist/execution/run-event-parts.js +29 -24
  126. package/dist/execution/run-event-stream.d.ts +8 -8
  127. package/dist/execution/run-event-stream.js +3 -4
  128. package/dist/execution/run-launcher.d.ts +4 -4
  129. package/dist/execution/run-synthesis.d.ts +49 -48
  130. package/dist/execution/run-synthesis.js +96 -255
  131. package/dist/execution/staged-input.d.ts +2 -2
  132. package/dist/execution/step-summary.d.ts +6 -6
  133. package/dist/execution/step-summary.js +4 -8
  134. package/dist/execution/topo-sort.js +4 -3
  135. package/dist/execution/workflow-purger.d.ts +2 -2
  136. package/dist/index.d.ts +25 -24
  137. package/dist/index.js +36 -37
  138. package/dist/input-sanitization.js +9 -2
  139. package/dist/input-scan/clustering.d.ts +6 -6
  140. package/dist/input-scan/clustering.js +11 -5
  141. package/dist/input-scan/companions.js +3 -2
  142. package/dist/input-scan/detect-sets.d.ts +2 -2
  143. package/dist/input-scan/detect-sets.js +25 -21
  144. package/dist/input-scan/enrich.d.ts +6 -6
  145. package/dist/input-scan/enrich.js +29 -12
  146. package/dist/input-scan/formats.d.ts +2 -2
  147. package/dist/input-scan/formats.js +8 -2
  148. package/dist/input-scan/markers.d.ts +2 -2
  149. package/dist/input-scan/markers.js +14 -5
  150. package/dist/input-scan/menu.d.ts +10 -10
  151. package/dist/input-scan/menu.js +0 -0
  152. package/dist/input-scan/quarantine.d.ts +2 -2
  153. package/dist/input-scan/quarantine.js +23 -18
  154. package/dist/input-scan/readout-budget.d.ts +2 -2
  155. package/dist/input-scan/readout-budget.js +1 -1
  156. package/dist/input-scan/readout.d.ts +2 -2
  157. package/dist/input-scan/readout.js +47 -34
  158. package/dist/input-scan/scan.d.ts +2 -2
  159. package/dist/input-scan/scan.js +7 -5
  160. package/dist/input-scan/set-types.d.ts +28 -28
  161. package/dist/input-scan/shapes.d.ts +4 -4
  162. package/dist/input-scan/shapes.js +0 -0
  163. package/dist/input-scan/templates.d.ts +10 -10
  164. package/dist/input-scan/templates.js +30 -22
  165. package/dist/input-scan/tokens.d.ts +6 -4
  166. package/dist/input-scan/tokens.js +100 -38
  167. package/dist/input-scan/types.d.ts +22 -22
  168. package/dist/lib/async-utils.d.ts +3 -7
  169. package/dist/lib/async-utils.js +5 -9
  170. package/dist/lib/cache.js +1 -1
  171. package/dist/lib/chrome.d.ts +46 -6
  172. package/dist/lib/console-logger.js +2 -2
  173. package/dist/lib/db-result.d.ts +22 -6
  174. package/dist/lib/db-result.js +9 -13
  175. package/dist/lib/eyes.d.ts +4 -4
  176. package/dist/lib/eyes.js +1 -1
  177. package/dist/lib/fs-helpers.js +18 -6
  178. package/dist/lib/fs-result.d.ts +1 -0
  179. package/dist/lib/fs-result.js +5 -6
  180. package/dist/lib/hooks.d.ts +23 -7
  181. package/dist/lib/hooks.js +17 -3
  182. package/dist/lib/host-concurrency.js +3 -2
  183. package/dist/lib/logger.d.ts +2 -2
  184. package/dist/lib/logger.js +2 -1
  185. package/dist/lib/metrics.d.ts +1 -1
  186. package/dist/lib/null-proto.d.ts +6 -0
  187. package/dist/lib/null-proto.js +17 -0
  188. package/dist/lib/otel-spans.d.ts +1 -1
  189. package/dist/lib/otel-spans.js +9 -5
  190. package/dist/lib/otel.d.ts +4 -2
  191. package/dist/lib/otel.js +10 -2
  192. package/dist/lib/page-capture.d.ts +8 -8
  193. package/dist/lib/page-capture.js +9 -4
  194. package/dist/lib/parse-json.d.ts +5 -0
  195. package/dist/lib/parse-json.js +12 -0
  196. package/dist/lib/present.d.ts +12 -0
  197. package/dist/lib/present.js +39 -0
  198. package/dist/lib/rate-limit.d.ts +4 -4
  199. package/dist/lib/rate-limit.js +12 -13
  200. package/dist/lib/regulatory-corpus/fetch-fda-guidance.d.ts +4 -4
  201. package/dist/lib/regulatory-corpus/fetch-fda-guidance.js +4 -10
  202. package/dist/lib/regulatory-corpus/fetch-ich.d.ts +4 -4
  203. package/dist/lib/regulatory-corpus/fetch-ich.js +18 -14
  204. package/dist/lib/regulatory-corpus/normalize-whitespace.d.ts +6 -0
  205. package/dist/lib/regulatory-corpus/normalize-whitespace.js +41 -0
  206. package/dist/lib/regulatory-corpus.d.ts +10 -10
  207. package/dist/lib/regulatory-corpus.js +3 -1
  208. package/dist/lib/result.d.ts +10 -11
  209. package/dist/lib/result.js +15 -13
  210. package/dist/lib/storage.d.ts +2 -2
  211. package/dist/lib/test/async-iterable.d.ts +9 -0
  212. package/dist/lib/test/async-iterable.js +28 -0
  213. package/dist/lib/test/request-url.d.ts +5 -0
  214. package/dist/lib/test/request-url.js +7 -0
  215. package/dist/lib/test/result-assert.d.ts +12 -0
  216. package/dist/lib/test/result-assert.js +17 -0
  217. package/dist/lib/test/text-shapes.d.ts +24 -0
  218. package/dist/lib/test/text-shapes.js +63 -0
  219. package/dist/lib/text.d.ts +22 -0
  220. package/dist/lib/text.js +68 -0
  221. package/dist/lib/thrown.d.ts +18 -0
  222. package/dist/lib/thrown.js +30 -0
  223. package/dist/lib/unknown-array.d.ts +6 -0
  224. package/dist/lib/unknown-array.js +8 -0
  225. package/dist/lib/unknown-containers.d.ts +14 -0
  226. package/dist/lib/unknown-containers.js +17 -0
  227. package/dist/lib/unknown-text.d.ts +8 -0
  228. package/dist/lib/unknown-text.js +28 -0
  229. package/dist/lib/zod-issue-shape.d.ts +1 -1
  230. package/dist/lib/zod-issue-shape.js +31 -31
  231. package/dist/lib/zod-issues.d.ts +3 -3
  232. package/dist/lib/zod-issues.js +30 -17
  233. package/dist/literature/sources/arxiv.d.ts +6 -6
  234. package/dist/literature/sources/arxiv.js +92 -35
  235. package/dist/literature/sources/http.d.ts +2 -2
  236. package/dist/literature/sources/http.js +16 -15
  237. package/dist/literature/sources/pubmed.d.ts +16 -16
  238. package/dist/literature/sources/pubmed.js +96 -61
  239. package/dist/literature/sources/semantic-scholar.d.ts +8 -8
  240. package/dist/literature/sources/semantic-scholar.js +22 -13
  241. package/dist/loop/accounting.d.ts +63 -0
  242. package/dist/loop/accounting.js +141 -0
  243. package/dist/loop/call-policy.d.ts +73 -0
  244. package/dist/loop/call-policy.js +109 -0
  245. package/dist/loop/chat-stream.d.ts +62 -0
  246. package/dist/loop/chat-stream.js +237 -0
  247. package/dist/loop/compaction.d.ts +14 -9
  248. package/dist/loop/compaction.js +17 -0
  249. package/dist/loop/metrics.d.ts +12 -15
  250. package/dist/loop/metrics.js +14 -26
  251. package/dist/loop/run-loop.d.ts +233 -0
  252. package/dist/loop/run-loop.js +770 -0
  253. package/dist/loop/sub-agent.d.ts +61 -0
  254. package/dist/loop/sub-agent.js +161 -0
  255. package/dist/loop/tool-adapter.d.ts +98 -0
  256. package/dist/loop/tool-adapter.js +364 -0
  257. package/dist/loop/tool-detail.d.ts +1 -1
  258. package/dist/loop/tool-detail.js +6 -5
  259. package/dist/loop/tool-outcome.d.ts +1 -1
  260. package/dist/loop/tool-output.d.ts +4 -4
  261. package/dist/loop/tool-output.js +2 -2
  262. package/dist/loop/turn-credentials.d.ts +34 -0
  263. package/dist/loop/turn-credentials.js +73 -0
  264. package/dist/loop/types.d.ts +34 -37
  265. package/dist/loop/types.js +2 -7
  266. package/dist/memory/ai-sdk-message-storage.d.ts +5 -5
  267. package/dist/memory/ai-sdk-message-storage.js +13 -11
  268. package/dist/memory/card-builders.d.ts +14 -14
  269. package/dist/memory/card-builders.js +19 -15
  270. package/dist/memory/conversation-display-recorder.d.ts +22 -6
  271. package/dist/memory/conversation-display-recorder.js +64 -20
  272. package/dist/memory/conversation-display-replay.js +3 -2
  273. package/dist/memory/conversation-display-storage.d.ts +15 -7
  274. package/dist/memory/conversation-display-storage.js +141 -36
  275. package/dist/memory/conversation-view.d.ts +4 -4
  276. package/dist/memory/conversation-view.js +5 -4
  277. package/dist/memory/count-tokens.js +10 -8
  278. package/dist/memory/derive-thread-title.d.ts +0 -13
  279. package/dist/memory/derive-thread-title.js +2 -1
  280. package/dist/memory/message-backfill.d.ts +12 -5
  281. package/dist/memory/message-backfill.js +5 -3
  282. package/dist/memory/thread-history.d.ts +66 -24
  283. package/dist/memory/thread-history.js +212 -79
  284. package/dist/memory/thread-store.d.ts +26 -17
  285. package/dist/memory/thread-store.js +15 -9
  286. package/dist/memory/tool-call-integrity.d.ts +2 -2
  287. package/dist/memory/tool-call-integrity.js +4 -3
  288. package/dist/memory/working-memory.d.ts +16 -12
  289. package/dist/memory/working-memory.js +72 -61
  290. package/dist/prompts/briefing.d.ts +63 -9
  291. package/dist/prompts/briefing.js +130 -3
  292. package/dist/prompts/planner.js +13 -2
  293. package/dist/prompts/synthesis-agent.d.ts +1 -1
  294. package/dist/prompts/synthesis-agent.js +6 -14
  295. package/dist/provenance/collector.d.ts +6 -6
  296. package/dist/provenance/collector.js +15 -8
  297. package/dist/provenance/exec-frame.d.ts +2 -2
  298. package/dist/provenance/exec-frame.js +6 -1
  299. package/dist/provenance/seam.d.ts +24 -19
  300. package/dist/provenance/seam.js +7 -5
  301. package/dist/provenance/types.d.ts +6 -6
  302. package/dist/providers/ai-sdk.d.ts +113 -62
  303. package/dist/providers/ai-sdk.js +303 -458
  304. package/dist/providers/embedding.d.ts +2 -2
  305. package/dist/providers/embedding.js +1 -1
  306. package/dist/providers/errors.d.ts +22 -2
  307. package/dist/providers/errors.js +98 -50
  308. package/dist/providers/prompt-cache.d.ts +8 -8
  309. package/dist/providers/prompt-cache.js +13 -11
  310. package/dist/providers/reasoning.d.ts +2 -2
  311. package/dist/providers/reasoning.js +2 -2
  312. package/dist/providers/types.d.ts +59 -92
  313. package/dist/reference-data/catalog.d.ts +2 -15
  314. package/dist/reference-data/catalog.js +166 -10
  315. package/dist/reference-data/receipt.d.ts +2 -2
  316. package/dist/report-model/assert-rules.js +1 -1
  317. package/dist/report-model/authoring-grammar.d.ts +209 -231
  318. package/dist/report-model/block-walk.d.ts +10 -10
  319. package/dist/report-model/block-walk.js +2 -0
  320. package/dist/report-model/draft-finish.d.ts +8 -8
  321. package/dist/report-model/draft-finish.js +1 -1
  322. package/dist/report-model/draft-hash.js +8 -7
  323. package/dist/report-model/draft-operations.d.ts +22 -10
  324. package/dist/report-model/draft-operations.js +48 -30
  325. package/dist/report-model/draft-read.d.ts +19 -7
  326. package/dist/report-model/draft-read.js +16 -6
  327. package/dist/report-model/draft.d.ts +844 -2
  328. package/dist/report-model/draft.js +3 -1
  329. package/dist/report-model/fixture-resolver.js +39 -16
  330. package/dist/report-model/pin-snapshot.d.ts +2 -2
  331. package/dist/report-model/pin-snapshot.js +15 -15
  332. package/dist/report-model/production-resolver.d.ts +18 -18
  333. package/dist/report-model/production-resolver.js +50 -42
  334. package/dist/report-model/reference-resolver.d.ts +26 -10
  335. package/dist/report-model/reference-resolver.js +68 -5
  336. package/dist/report-model/reference-stamp.js +30 -38
  337. package/dist/report-model/structural-validation.js +12 -4
  338. package/dist/report-model/validate.d.ts +7 -7
  339. package/dist/report-model/validate.js +6 -6
  340. package/dist/report-render/assets.d.ts +2 -2
  341. package/dist/report-render/assets.js +27 -3
  342. package/dist/report-render/chart-export.d.ts +10 -2
  343. package/dist/report-render/chart-export.js +37 -11
  344. package/dist/report-render/chart-presets.d.ts +8 -8
  345. package/dist/report-render/chart-presets.js +3 -3
  346. package/dist/report-render/chart-renderers.d.ts +23 -16
  347. package/dist/report-render/chart-renderers.js +74 -53
  348. package/dist/report-render/chart-toolbox.d.ts +2 -2
  349. package/dist/report-render/chart-toolbox.js +7 -6
  350. package/dist/report-render/chart.d.ts +15 -16
  351. package/dist/report-render/chart.js +369 -252
  352. package/dist/report-render/design.d.ts +36 -297
  353. package/dist/report-render/design.js +0 -12
  354. package/dist/report-render/figures/common.d.ts +12 -12
  355. package/dist/report-render/figures/common.js +42 -31
  356. package/dist/report-render/figures/dendrogram.d.ts +3 -3
  357. package/dist/report-render/figures/dendrogram.js +10 -10
  358. package/dist/report-render/figures/dense.js +15 -8
  359. package/dist/report-render/figures/dotplot.js +46 -33
  360. package/dist/report-render/figures/embedding.js +52 -43
  361. package/dist/report-render/figures/equal-units.d.ts +10 -10
  362. package/dist/report-render/figures/equal-units.js +27 -27
  363. package/dist/report-render/figures/forest.js +9 -7
  364. package/dist/report-render/figures/gsea.js +21 -11
  365. package/dist/report-render/figures/heatmap.js +13 -9
  366. package/dist/report-render/figures/index.d.ts +10 -10
  367. package/dist/report-render/figures/index.js +4 -2
  368. package/dist/report-render/figures/km.js +10 -9
  369. package/dist/report-render/figures/label-room.d.ts +12 -12
  370. package/dist/report-render/figures/label-room.js +7 -2
  371. package/dist/report-render/figures/locuszoom.d.ts +2 -2
  372. package/dist/report-render/figures/locuszoom.js +59 -31
  373. package/dist/report-render/figures/lollipop.js +3 -2
  374. package/dist/report-render/figures/ma.js +8 -4
  375. package/dist/report-render/figures/manhattan.d.ts +1 -2
  376. package/dist/report-render/figures/manhattan.js +52 -34
  377. package/dist/report-render/figures/oncoprint.js +4 -5
  378. package/dist/report-render/figures/pca.js +25 -11
  379. package/dist/report-render/figures/qq.js +20 -9
  380. package/dist/report-render/figures/roc.js +1 -1
  381. package/dist/report-render/figures/sankey.d.ts +2 -2
  382. package/dist/report-render/figures/sankey.js +11 -10
  383. package/dist/report-render/figures/upset.d.ts +6 -6
  384. package/dist/report-render/figures/upset.js +7 -4
  385. package/dist/report-render/figures/volcano.js +12 -10
  386. package/dist/report-render/hybrid-svg.d.ts +4 -4
  387. package/dist/report-render/hybrid-svg.js +7 -5
  388. package/dist/report-render/number-format.d.ts +4 -4
  389. package/dist/report-render/number-format.js +62 -27
  390. package/dist/report-render/page.js +2 -1
  391. package/dist/report-render/provenance-data.d.ts +2 -2
  392. package/dist/report-render/references.d.ts +4 -4
  393. package/dist/report-render/render.d.ts +2 -2
  394. package/dist/report-render/render.js +10 -11
  395. package/dist/report-render/script-json.js +1 -1
  396. package/dist/report-render/table-data.d.ts +6 -6
  397. package/dist/report-render/test/options.d.ts +49 -0
  398. package/dist/report-render/test/options.js +143 -0
  399. package/dist/report-render/test/page-function.d.ts +19 -0
  400. package/dist/report-render/test/page-function.js +33 -0
  401. package/dist/report-render/types.d.ts +10 -10
  402. package/dist/report-render/value-bridge.d.ts +4 -4
  403. package/dist/report-render/value-bridge.js +27 -14
  404. package/dist/report-render/views/chart-view.d.ts +2 -2
  405. package/dist/report-render/views/chart-view.js +2 -2
  406. package/dist/report-render/views/lineage.d.ts +6 -6
  407. package/dist/report-render/views/lineage.js +2 -0
  408. package/dist/report-render/views/page-view.d.ts +2 -2
  409. package/dist/report-render/views/page-view.js +1 -0
  410. package/dist/report-render/views/prose.js +25 -8
  411. package/dist/report-render/views/references-view.js +12 -1
  412. package/dist/report-render/views/values.js +1 -1
  413. package/dist/runtime/assemble.d.ts +53 -26
  414. package/dist/runtime/assemble.js +103 -56
  415. package/dist/runtime/boot.d.ts +8 -7
  416. package/dist/runtime/boot.js +1 -1
  417. package/dist/runtime/connection-budget.d.ts +6 -6
  418. package/dist/runtime/connection-budget.js +1 -1
  419. package/dist/runtime/dbos.d.ts +29 -19
  420. package/dist/runtime/dbos.js +35 -20
  421. package/dist/runtime/result-serialization.js +18 -5
  422. package/dist/runtime/shutdown.d.ts +2 -2
  423. package/dist/sandbox/client.d.ts +7 -3
  424. package/dist/sandbox/cpu-files.d.ts +2 -2
  425. package/dist/sandbox/cpu-files.js +21 -4
  426. package/dist/sandbox/create-sandbox.d.ts +7 -8
  427. package/dist/sandbox/create-sandbox.js +6 -12
  428. package/dist/sandbox/docker-client.d.ts +48 -3
  429. package/dist/sandbox/docker-client.js +10 -6
  430. package/dist/sandbox/estimate-data-profile-resources.js +2 -7
  431. package/dist/sandbox/exec-outcome.d.ts +2 -2
  432. package/dist/sandbox/exec-outcome.js +1 -1
  433. package/dist/sandbox/exec.d.ts +10 -6
  434. package/dist/sandbox/exec.js +27 -12
  435. package/dist/sandbox/execution-id.js +14 -6
  436. package/dist/sandbox/farm.d.ts +2 -2
  437. package/dist/sandbox/farm.js +22 -27
  438. package/dist/sandbox/identity.d.ts +7 -0
  439. package/dist/sandbox/identity.js +14 -3
  440. package/dist/sandbox/image-packages.d.ts +26 -4
  441. package/dist/sandbox/image-packages.js +29 -27
  442. package/dist/sandbox/k8s-client.d.ts +35 -8
  443. package/dist/sandbox/k8s-client.js +6 -5
  444. package/dist/sandbox/labels.js +1 -0
  445. package/dist/sandbox/liveness.js +3 -1
  446. package/dist/sandbox/mount-plan.d.ts +10 -10
  447. package/dist/sandbox/mount-plan.js +13 -14
  448. package/dist/sandbox/notification-sweep.d.ts +4 -4
  449. package/dist/sandbox/notification-sweep.js +4 -7
  450. package/dist/sandbox/package-identity.d.ts +6 -13
  451. package/dist/sandbox/package-identity.js +46 -28
  452. package/dist/sandbox/reaper.d.ts +10 -10
  453. package/dist/sandbox/reaper.js +4 -6
  454. package/dist/sandbox/sandbox-error.d.ts +2 -9
  455. package/dist/sandbox/sandbox-error.js +21 -8
  456. package/dist/sandbox/sandbox-step-translate.d.ts +8 -5
  457. package/dist/sandbox/sandbox-step-translate.js +22 -8
  458. package/dist/sandbox/step-sandbox.d.ts +47 -0
  459. package/dist/sandbox/step-sandbox.js +53 -0
  460. package/dist/sandbox/types.d.ts +18 -19
  461. package/dist/sandbox/types.js +1 -1
  462. package/dist/schemas/artifact-manifest.d.ts +4 -4
  463. package/dist/schemas/data-profile-schemas.d.ts +351 -306
  464. package/dist/schemas/file-metadata.js +2 -4
  465. package/dist/schemas/plan-schemas.d.ts +79 -25
  466. package/dist/schemas/plan-schemas.js +1 -1
  467. package/dist/schemas/run-synthesis.d.ts +95 -26
  468. package/dist/schemas/run-synthesis.js +3 -1
  469. package/dist/schemas/validate-plan.d.ts +4 -4
  470. package/dist/schemas/validate-plan.js +17 -5
  471. package/dist/schemas/workflow-state.d.ts +127 -14
  472. package/dist/schemas/workflow-state.js +56 -2
  473. package/dist/state/active-turns.d.ts +36 -0
  474. package/dist/state/active-turns.js +67 -0
  475. package/dist/state/analyses-metrics.d.ts +8 -8
  476. package/dist/state/analyses-metrics.js +4 -4
  477. package/dist/state/analyses.d.ts +0 -14
  478. package/dist/state/analyses.js +0 -32
  479. package/dist/state/artifacts.d.ts +47 -18
  480. package/dist/state/artifacts.js +48 -7
  481. package/dist/state/data-profile.d.ts +2 -2
  482. package/dist/state/db.d.ts +12 -2
  483. package/dist/state/db.js +5 -0
  484. package/dist/state/edit-intents.d.ts +4 -0
  485. package/dist/state/edit-intents.js +71 -0
  486. package/dist/state/index.d.ts +5 -5
  487. package/dist/state/index.js +3 -3
  488. package/dist/state/init.d.ts +2 -1
  489. package/dist/state/init.js +5 -2
  490. package/dist/state/migrations/20260927120000_baseline.js +3 -1
  491. package/dist/state/migrations/20261026120000_add_the_edit_intents.d.ts +7 -0
  492. package/dist/state/migrations/20261026120000_add_the_edit_intents.js +21 -0
  493. package/dist/state/migrations/20261027120000_record_the_applied_memory_edits.d.ts +7 -0
  494. package/dist/state/migrations/20261027120000_record_the_applied_memory_edits.js +16 -0
  495. package/dist/state/migrations/20261027120100_store_the_authoring_results.d.ts +8 -0
  496. package/dist/state/migrations/20261027120100_store_the_authoring_results.js +20 -0
  497. package/dist/state/migrations/20261027120200_key_the_groups_of_a_turn.d.ts +7 -0
  498. package/dist/state/migrations/20261027120200_key_the_groups_of_a_turn.js +12 -0
  499. package/dist/state/migrations/20261027120300_mark_the_active_turn_of_a_thread.d.ts +7 -0
  500. package/dist/state/migrations/20261027120300_mark_the_active_turn_of_a_thread.js +11 -0
  501. package/dist/state/migrations/20261028120000_record_the_paused_work.d.ts +7 -0
  502. package/dist/state/migrations/20261028120000_record_the_paused_work.js +25 -0
  503. package/dist/state/migrations/20261028120100_end_the_suspended_runs.d.ts +8 -0
  504. package/dist/state/migrations/20261028120100_end_the_suspended_runs.js +13 -0
  505. package/dist/state/migrations/20261029120000_reference_the_run_mandate.d.ts +7 -0
  506. package/dist/state/migrations/20261029120000_reference_the_run_mandate.js +23 -0
  507. package/dist/state/migrations/20261029120100_record_the_run_session_of_a_pause.d.ts +7 -0
  508. package/dist/state/migrations/20261029120100_record_the_run_session_of_a_pause.js +11 -0
  509. package/dist/state/migrations/index.js +18 -0
  510. package/dist/state/paused-work.d.ts +52 -0
  511. package/dist/state/paused-work.js +105 -0
  512. package/dist/state/plans.d.ts +27 -8
  513. package/dist/state/plans.js +14 -11
  514. package/dist/state/purge-analysis.d.ts +6 -6
  515. package/dist/state/purge-analysis.js +10 -2
  516. package/dist/state/report-session-state.d.ts +43 -18
  517. package/dist/state/report-session-state.js +43 -4
  518. package/dist/state/report-versions.d.ts +16 -11
  519. package/dist/state/report-versions.js +5 -3
  520. package/dist/state/runs.d.ts +70 -25
  521. package/dist/state/runs.js +127 -64
  522. package/dist/state/schema.d.ts +18 -21
  523. package/dist/state/schema.js +4 -5
  524. package/dist/state/snapshot-parse.d.ts +2 -2
  525. package/dist/state/snapshot-parse.js +14 -8
  526. package/dist/state/step-executions.d.ts +29 -8
  527. package/dist/state/step-executions.js +28 -4
  528. package/dist/state/tool-outputs.d.ts +2 -2
  529. package/dist/state/tool-outputs.js +2 -1
  530. package/dist/state/vector-store.d.ts +16 -16
  531. package/dist/state/vector-store.js +11 -7
  532. package/dist/tasks/data-profile-absorb.d.ts +3 -3
  533. package/dist/tasks/data-profile-absorb.js +21 -16
  534. package/dist/tasks/data-profile-activity.d.ts +5 -5
  535. package/dist/tasks/data-profile-activity.js +5 -5
  536. package/dist/tasks/data-profile-index.d.ts +4 -4
  537. package/dist/tasks/data-profile-index.js +32 -17
  538. package/dist/tasks/data-profile-resolve.d.ts +8 -8
  539. package/dist/tasks/data-profile-resolve.js +88 -62
  540. package/dist/tasks/data-profile.d.ts +40 -31
  541. package/dist/tasks/data-profile.js +138 -95
  542. package/dist/tasks/extract-values.d.ts +26 -79
  543. package/dist/tasks/extract-values.js +48 -108
  544. package/dist/tasks/refresh-regulatory-corpus.d.ts +4 -20
  545. package/dist/tasks/refresh-regulatory-corpus.js +12 -8
  546. package/dist/tasks/regulatory-corpus-boot-refresh.d.ts +2 -2
  547. package/dist/tasks/regulatory-corpus-boot-refresh.js +12 -10
  548. package/dist/testing.d.ts +60 -0
  549. package/dist/testing.js +96 -0
  550. package/dist/tools/ad-hoc-router.d.ts +11 -9
  551. package/dist/tools/ad-hoc-router.js +80 -51
  552. package/dist/tools/analysis-invocation.d.ts +7 -0
  553. package/dist/tools/analysis-invocation.js +29 -5
  554. package/dist/tools/approval/contract.d.ts +8 -52
  555. package/dist/tools/approval/contract.js +7 -36
  556. package/dist/tools/approval/gateway.d.ts +27 -28
  557. package/dist/tools/approval/gateway.js +33 -130
  558. package/dist/tools/approval/queries.d.ts +6 -11
  559. package/dist/tools/approval/queries.js +43 -29
  560. package/dist/tools/approval/uuidv7.js +2 -2
  561. package/dist/tools/bio/chembl.d.ts +3 -3
  562. package/dist/tools/bio/chembl.js +10 -0
  563. package/dist/tools/bio/comptox.d.ts +25 -8
  564. package/dist/tools/bio/comptox.js +4 -2
  565. package/dist/tools/bio/drug-gene-interactions.d.ts +27 -17
  566. package/dist/tools/bio/drug-gene-interactions.js +11 -8
  567. package/dist/tools/bio/gene-disease-evidence.d.ts +61 -15
  568. package/dist/tools/bio/gene-disease-evidence.js +10 -6
  569. package/dist/tools/bio/gene-preclinical-profile.d.ts +11 -11
  570. package/dist/tools/bio/keys.d.ts +2 -2
  571. package/dist/tools/bio/keys.js +3 -3
  572. package/dist/tools/bio/lookup-annotation.d.ts +5 -5
  573. package/dist/tools/bio/lookup-annotation.js +3 -0
  574. package/dist/tools/bio/opentargets.d.ts +1 -1
  575. package/dist/tools/bio/opentargets.js +6 -0
  576. package/dist/tools/bio/pubchem.d.ts +2 -2
  577. package/dist/tools/bio/pubchem.js +6 -0
  578. package/dist/tools/bio/pubmed.d.ts +26 -16
  579. package/dist/tools/bio/pubmed.js +9 -3
  580. package/dist/tools/bio/search-clinical-trials.d.ts +4 -4
  581. package/dist/tools/bio/search-clinical-trials.js +5 -1
  582. package/dist/tools/bio/search-faers.d.ts +2 -2
  583. package/dist/tools/bio/search-faers.js +1 -1
  584. package/dist/tools/bio/search-gene.d.ts +2 -2
  585. package/dist/tools/bio/search-gene.js +1 -0
  586. package/dist/tools/bio/search-geo-datasets.d.ts +4 -4
  587. package/dist/tools/bio/search-geo-datasets.js +5 -5
  588. package/dist/tools/bio/search-interactions.d.ts +1 -1
  589. package/dist/tools/bio/search-patents.d.ts +28 -22
  590. package/dist/tools/bio/search-patents.js +20 -17
  591. package/dist/tools/bio/search-protein.d.ts +2 -2
  592. package/dist/tools/bio/search-protein.js +1 -1
  593. package/dist/tools/bio/search-regulatory-approvals.d.ts +64 -18
  594. package/dist/tools/bio/search-regulatory-approvals.js +21 -16
  595. package/dist/tools/bio/target-safety.d.ts +8 -8
  596. package/dist/tools/bio/target-safety.js +11 -6
  597. package/dist/tools/capability-data.d.ts +40 -0
  598. package/dist/tools/capability-data.js +74 -0
  599. package/dist/tools/define-tool.d.ts +55 -46
  600. package/dist/tools/define-tool.js +39 -27
  601. package/dist/tools/display/normalize-echart-spec.d.ts +2 -2
  602. package/dist/tools/display/normalize-echart-spec.js +51 -27
  603. package/dist/tools/display/show-user.d.ts +2 -2
  604. package/dist/tools/display/show-user.js +1 -1
  605. package/dist/tools/execute-analysis.d.ts +54 -17
  606. package/dist/tools/execute-analysis.js +193 -62
  607. package/dist/tools/knowledge/check.d.ts +182 -0
  608. package/dist/tools/knowledge/check.js +94 -0
  609. package/dist/tools/knowledge/client.d.ts +351 -0
  610. package/dist/tools/knowledge/client.js +319 -0
  611. package/dist/tools/knowledge/environment.d.ts +78 -0
  612. package/dist/tools/knowledge/environment.js +116 -0
  613. package/dist/tools/knowledge/index.d.ts +49 -0
  614. package/dist/tools/knowledge/index.js +70 -0
  615. package/dist/tools/knowledge/local-slots.d.ts +62 -0
  616. package/dist/tools/knowledge/local-slots.js +184 -0
  617. package/dist/tools/knowledge/pin.d.ts +14 -0
  618. package/dist/tools/knowledge/pin.js +17 -0
  619. package/dist/tools/knowledge/recommend.d.ts +67 -0
  620. package/dist/tools/knowledge/recommend.js +106 -0
  621. package/dist/tools/knowledge/situation.d.ts +143 -0
  622. package/dist/tools/knowledge/situation.js +157 -0
  623. package/dist/tools/knowledge/skeleton.d.ts +69 -0
  624. package/dist/tools/knowledge/skeleton.js +201 -0
  625. package/dist/tools/knowledge/template.d.ts +139 -0
  626. package/dist/tools/knowledge/template.js +273 -0
  627. package/dist/tools/lib/alphafold-client.js +2 -1
  628. package/dist/tools/lib/amass-client.d.ts +28 -28
  629. package/dist/tools/lib/amass-client.js +20 -10
  630. package/dist/tools/lib/api-utils.d.ts +13 -3
  631. package/dist/tools/lib/api-utils.js +17 -3
  632. package/dist/tools/lib/bgee-client.d.ts +6 -6
  633. package/dist/tools/lib/bgee-client.js +16 -10
  634. package/dist/tools/lib/cbioportal-client.d.ts +4 -4
  635. package/dist/tools/lib/cbioportal-client.js +9 -8
  636. package/dist/tools/lib/chembl-client.d.ts +14 -14
  637. package/dist/tools/lib/chembl-client.js +11 -4
  638. package/dist/tools/lib/clinical-benchmarks-client.d.ts +4 -4
  639. package/dist/tools/lib/clinical-benchmarks-client.js +4 -7
  640. package/dist/tools/lib/clinical-trials-client.d.ts +18 -18
  641. package/dist/tools/lib/clinical-trials-client.js +10 -10
  642. package/dist/tools/lib/clinvar-client.d.ts +2 -2
  643. package/dist/tools/lib/clinvar-client.js +6 -6
  644. package/dist/tools/lib/ctx-ops.d.ts +23 -23
  645. package/dist/tools/lib/ctx-ops.js +13 -10
  646. package/dist/tools/lib/dgidb-client.d.ts +6 -6
  647. package/dist/tools/lib/dgidb-client.js +10 -12
  648. package/dist/tools/lib/disgenet-client.d.ts +4 -4
  649. package/dist/tools/lib/ema-client.d.ts +2 -2
  650. package/dist/tools/lib/ensembl-client.d.ts +4 -4
  651. package/dist/tools/lib/ensembl-client.js +5 -4
  652. package/dist/tools/lib/gwas-catalog-client.d.ts +4 -4
  653. package/dist/tools/lib/gwas-catalog-client.js +17 -17
  654. package/dist/tools/lib/html-text.d.ts +6 -0
  655. package/dist/tools/lib/html-text.js +9 -0
  656. package/dist/tools/lib/identifier-resolver.d.ts +4 -4
  657. package/dist/tools/lib/identifier-resolver.js +7 -3
  658. package/dist/tools/lib/impc-client.d.ts +8 -8
  659. package/dist/tools/lib/impc-client.js +46 -35
  660. package/dist/tools/lib/iuphar-client.d.ts +2 -2
  661. package/dist/tools/lib/iuphar-client.js +7 -16
  662. package/dist/tools/lib/monarch-client.d.ts +4 -4
  663. package/dist/tools/lib/openfda-client.d.ts +22 -22
  664. package/dist/tools/lib/openfda-client.js +23 -22
  665. package/dist/tools/lib/opentargets-client.d.ts +12 -12
  666. package/dist/tools/lib/pathway-client.d.ts +4 -4
  667. package/dist/tools/lib/pathway-client.js +15 -19
  668. package/dist/tools/lib/pharmgkb-client.d.ts +2 -2
  669. package/dist/tools/lib/pharmgkb-client.js +1 -1
  670. package/dist/tools/lib/protein-family-modality.d.ts +2 -2
  671. package/dist/tools/lib/protein-family-modality.js +0 -2
  672. package/dist/tools/lib/protein-family-normalize.js +7 -0
  673. package/dist/tools/lib/pubchem-client.d.ts +2 -2
  674. package/dist/tools/lib/pubchem-client.js +1 -0
  675. package/dist/tools/lib/pubchem-ops.d.ts +4 -4
  676. package/dist/tools/lib/pubchem-ops.js +8 -0
  677. package/dist/tools/lib/pubmed-client.d.ts +9 -9
  678. package/dist/tools/lib/pubmed-client.js +1 -1
  679. package/dist/tools/lib/string-client.d.ts +6 -6
  680. package/dist/tools/lib/uniprot-client.d.ts +8 -8
  681. package/dist/tools/lib/uniprot-client.js +5 -1
  682. package/dist/tools/memory/update-working-memory.d.ts +16 -13
  683. package/dist/tools/memory/update-working-memory.js +21 -3
  684. package/dist/tools/read-tool-output.js +8 -2
  685. package/dist/tools/registry.d.ts +2 -2
  686. package/dist/tools/report-authoring/authoring-tools.d.ts +54 -23
  687. package/dist/tools/report-authoring/authoring-tools.js +128 -62
  688. package/dist/tools/report-session/derive-table.d.ts +19 -59
  689. package/dist/tools/report-session/derive-table.js +120 -122
  690. package/dist/tools/report-session/examine-page.d.ts +6 -6
  691. package/dist/tools/report-session/examine-page.js +14 -12
  692. package/dist/tools/report-session/list-artifacts.d.ts +6 -6
  693. package/dist/tools/report-session/list-artifacts.js +5 -5
  694. package/dist/tools/report-session/page-faults.d.ts +6 -6
  695. package/dist/tools/report-session/page-faults.js +3 -1
  696. package/dist/tools/report-session/preview-report.d.ts +4 -3
  697. package/dist/tools/report-session/preview-report.js +26 -7
  698. package/dist/tools/report-session/record-version.d.ts +9 -4
  699. package/dist/tools/report-session/record-version.js +16 -9
  700. package/dist/tools/report-session/session-page-publisher.d.ts +6 -6
  701. package/dist/tools/research/generate-analogy-report.d.ts +14 -7
  702. package/dist/tools/research/generate-analogy-report.js +80 -76
  703. package/dist/tools/research/generate-plan.d.ts +39 -16
  704. package/dist/tools/research/generate-plan.js +565 -338
  705. package/dist/tools/research/guarded-address.d.ts +20 -0
  706. package/dist/tools/research/guarded-address.js +149 -0
  707. package/dist/tools/research/inspect-data-profile.d.ts +27 -20
  708. package/dist/tools/research/inspect-data-profile.js +26 -25
  709. package/dist/tools/research/inspect-run.d.ts +54 -27
  710. package/dist/tools/research/inspect-run.js +50 -40
  711. package/dist/tools/research/literature-reviewer.d.ts +8 -7
  712. package/dist/tools/research/literature-reviewer.js +29 -28
  713. package/dist/tools/research/search-arxiv.d.ts +1 -1
  714. package/dist/tools/research/search-arxiv.js +1 -1
  715. package/dist/tools/research/search-github-repos.d.ts +10 -7
  716. package/dist/tools/research/search-github-repos.js +25 -22
  717. package/dist/tools/research/search-semantic-scholar.js +1 -1
  718. package/dist/tools/research/searxng-engine.d.ts +40 -0
  719. package/dist/tools/research/searxng-engine.js +122 -0
  720. package/dist/tools/research/web-fetch.d.ts +127 -0
  721. package/dist/tools/research/web-fetch.js +618 -0
  722. package/dist/tools/research/web-search.d.ts +84 -0
  723. package/dist/tools/research/web-search.js +117 -0
  724. package/dist/tools/sandbox/link-packages.d.ts +11 -7
  725. package/dist/tools/sandbox/link-packages.js +11 -8
  726. package/dist/tools/sandbox/list-available-packages.d.ts +24 -12
  727. package/dist/tools/sandbox/list-available-packages.js +43 -29
  728. package/dist/tools/sandbox/list-available-refs.d.ts +38 -14
  729. package/dist/tools/sandbox/list-available-refs.js +119 -37
  730. package/dist/tools/sandbox/report-blocker.d.ts +30 -37
  731. package/dist/tools/sandbox/report-blocker.js +22 -68
  732. package/dist/tools/sandbox/skills.d.ts +16 -12
  733. package/dist/tools/sandbox/skills.js +16 -12
  734. package/dist/tools/sandbox/submit-file-metadata.d.ts +12 -9
  735. package/dist/tools/sandbox/submit-file-metadata.js +18 -21
  736. package/dist/tools/start-report-session.d.ts +13 -5
  737. package/dist/tools/start-report-session.js +35 -8
  738. package/dist/tools/terminal-text.d.ts +14 -0
  739. package/dist/tools/terminal-text.js +51 -0
  740. package/dist/tools/workspace/decision-record.d.ts +81 -0
  741. package/dist/tools/workspace/decision-record.js +127 -0
  742. package/dist/tools/workspace/edit-file.d.ts +59 -18
  743. package/dist/tools/workspace/edit-file.js +98 -15
  744. package/dist/tools/workspace/execute-command.d.ts +31 -12
  745. package/dist/tools/workspace/execute-command.js +37 -8
  746. package/dist/tools/workspace/file-stat.d.ts +6 -3
  747. package/dist/tools/workspace/grep.d.ts +10 -7
  748. package/dist/tools/workspace/grep.js +9 -3
  749. package/dist/tools/workspace/index.d.ts +1 -0
  750. package/dist/tools/workspace/index.js +1 -0
  751. package/dist/tools/workspace/list-files.d.ts +6 -3
  752. package/dist/tools/workspace/mutator.d.ts +28 -15
  753. package/dist/tools/workspace/mutator.js +107 -53
  754. package/dist/tools/workspace/read-file.d.ts +8 -5
  755. package/dist/tools/workspace/result-bounds.d.ts +5 -5
  756. package/dist/tools/workspace/result-bounds.js +4 -2
  757. package/dist/tools/workspace/run-exec.d.ts +2 -2
  758. package/dist/tools/workspace/run-exec.js +3 -3
  759. package/dist/tools/workspace/scan-inputs.d.ts +8 -5
  760. package/dist/tools/workspace/scan-inputs.js +17 -5
  761. package/dist/tools/workspace/show-file.d.ts +1 -1
  762. package/dist/tools/workspace/show-file.js +2 -1
  763. package/dist/tools/workspace/show-plan.d.ts +8 -5
  764. package/dist/tools/workspace/show-plan.js +9 -8
  765. package/dist/tools/workspace/workspace-search.d.ts +41 -13
  766. package/dist/tools/workspace/workspace-search.js +27 -14
  767. package/dist/tools/workspace/write-file.d.ts +9 -7
  768. package/dist/workflows/execute-analysis-scheduler.d.ts +9 -9
  769. package/dist/workflows/execute-analysis-scheduler.js +6 -3
  770. package/dist/workflows/execute-analysis.d.ts +100 -76
  771. package/dist/workflows/execute-analysis.js +380 -247
  772. package/dist/workflows/pause.d.ts +71 -0
  773. package/dist/workflows/pause.js +173 -0
  774. package/dist/workflows/sandbox-step.d.ts +50 -61
  775. package/dist/workflows/sandbox-step.js +99 -106
  776. package/dist/workflows/test/sql-writes.d.ts +21 -0
  777. package/dist/workflows/test/sql-writes.js +36 -0
  778. package/dist/workspace/filesystem.d.ts +6 -6
  779. package/dist/workspace/filesystem.js +10 -8
  780. package/dist/workspace/paths.d.ts +1 -1
  781. package/dist/workspace/paths.js +15 -4
  782. package/dist/workspace/search-config.d.ts +2 -2
  783. package/dist/workspace/search-config.js +1 -1
  784. package/package.json +25 -22
  785. package/dist/loop/continue-agent.d.ts +0 -40
  786. package/dist/loop/continue-agent.js +0 -38
  787. package/dist/loop/genai-spans.d.ts +0 -47
  788. package/dist/loop/genai-spans.js +0 -134
  789. package/dist/loop/run-agent.d.ts +0 -236
  790. package/dist/loop/run-agent.js +0 -1110
  791. package/dist/loop/run-step.d.ts +0 -29
  792. package/dist/loop/run-step.js +0 -34
  793. package/dist/loop/run-to-terminal.d.ts +0 -66
  794. package/dist/loop/run-to-terminal.js +0 -90
  795. package/dist/loop/tool-mask.d.ts +0 -23
  796. package/dist/loop/tool-mask.js +0 -46
  797. package/dist/providers/streaming-chat.d.ts +0 -32
  798. package/dist/providers/streaming-chat.js +0 -91
  799. package/dist/tasks/derive-table-exec.d.ts +0 -54
  800. package/dist/tasks/derive-table-exec.js +0 -86
  801. package/dist/workflows/suspension.d.ts +0 -32
  802. package/dist/workflows/suspension.js +0 -38
@@ -5,10 +5,12 @@
5
5
  * table that a block can bind: a join, a pivot, or an aggregate. The agent writes the script, and the record
6
6
  * chains the derived table back to the evidence that made it.
7
7
  *
8
- * A session derivation is not an analysis run. It mints no run id, it registers no artifact, and it writes
8
+ * A session derivation is not an analysis run. It mints no run id, no mandate, and no artifact, and it writes
9
9
  * under the session directory alone. The rails are the rails of the value tier (`tasks/extract-values.ts`):
10
- * the injected exec runner, the identity mint, and the authorizer on every terminal path. The container is
11
- * ephemeral, and it goes away with the work.
10
+ * one ephemeral container inside the step of the call (`sandbox/step-sandbox.ts`), which goes away with the
11
+ * work. The container stays until the record lands, thus a rerun of the step before the record adopts the
12
+ * container and the exec record of the first attempt, and the script does not run again. A rerun after the
13
+ * record finds the record of its call, and it gives that table back.
12
14
  *
13
15
  * The container mounts the analysis tree read-only, and one write mount covers the `derived/` directory of
14
16
  * the session alone. The script writes its table into that mount directly, thus a large table makes no
@@ -25,21 +27,13 @@
25
27
  * The tool refuses an output name that the membership already holds. A record is immutable, and a second
26
28
  * derivation of one table takes a new name.
27
29
  *
28
- * A composition with no sandbox client and no run authorizer cannot derive at all. The tool reports that
29
- * condition one time, up front, the same discipline as the eyes. A per-attempt failure would instead read as
30
- * a transient fault, and it would invite a repeat of a call that can never pass.
31
- *
32
- * The container runs behind a seam, and never in the turn. An exec is a durable step of a workflow, and a
33
- * report turn is not a workflow. Thus the tool takes an injected runner, and a registered workflow owns the
34
- * container. The tool holds no sandbox client, and it imports no DBOS.
30
+ * A composition with no sandbox client cannot derive at all. The tool reports that condition one time, up
31
+ * front, the same discipline as the eyes. A per-attempt failure would instead read as a transient fault, and
32
+ * it would invite a repeat of a call that can never pass.
35
33
  */
36
- import { type Result } from "neverthrow";
37
34
  import { z } from "zod";
38
- import type { RunSession } from "../../auth/types.js";
39
- import type { Suspension } from "../../workflows/suspension.js";
40
- import type { RunAuthorizer } from "../../execution/run-authorizer.js";
41
35
  import { type Logger } from "../../lib/logger.js";
42
- import type { ResourceSpec } from "../../config/resource-limits.js";
36
+ import type { SandboxClient } from "../../sandbox/client.js";
43
37
  import type { ExecRequest, ExecResult } from "../../sandbox/types.js";
44
38
  import type { DerivationSource, ReportSessionStateStore } from "../../state/report-session-state.js";
45
39
  import { type ResolveWorkspaceRoot } from "../../workspace/paths.js";
@@ -112,41 +106,31 @@ export type DeriveTableResult = {
112
106
  * The construction deps of the derivation tool.
113
107
  *
114
108
  * `derivations` is the append side of the durable session state, thus the record lands beside the document
115
- * and the pin. `sandboxClient` and `runAuthorizer` are the two rails of the exec, and a composition that
116
- * binds neither leaves the session with no derivation at all. `resolveWorkspaceRoot` maps the analysis of
117
- * the call onto its workspace root, thus one singleton tool serves every analysis.
109
+ * and the pin. `sandboxClient` is the rail of the exec, and a composition that binds none leaves the session
110
+ * with no derivation at all. `resolveWorkspaceRoot` maps the analysis of the call onto its workspace root,
111
+ * thus one singleton tool serves every analysis.
118
112
  */
119
- export interface DeriveTableToolDeps {
113
+ export type DeriveTableToolDeps = {
120
114
  readonly gateway: ReportSessionStateGateway;
121
115
  readonly resolveWorkspaceRoot: ResolveWorkspaceRoot;
122
116
  readonly derivations: Pick<ReportSessionStateStore, "appendDerivation">;
123
- readonly runDerivation?: DeriveTableRunner;
124
- readonly runAuthorizer?: RunAuthorizer;
117
+ readonly sandboxClient?: SandboxClient;
125
118
  /** The provenance seam; an unbound session emit emits nothing and the derivation runs the same. */
126
119
  readonly provenance?: ProvenanceSeam;
127
120
  readonly logger?: Logger;
128
- }
129
- /** The synthetic run id and step id of one derivation. Both are constants, and neither names a run row. */
130
- export declare const DERIVE_RUN_LITERAL: "derive-table";
131
- export declare const DERIVE_STEP_LITERAL: "derive";
132
- /** The exec budget of one derivation. It matches the budget of the value tier. */
133
- export declare const DERIVATION_DEADLINE_MS = 300000;
134
- /**
135
- * The container size of one derivation. A join or a pivot loads each declared input into pandas at one
136
- * time, thus the container needs the headroom of the value tier.
137
- */
138
- export declare const DERIVATION_RESOURCES: ResourceSpec;
121
+ };
139
122
  /** The environment variable that carries the declared inputs into the container. */
140
123
  export declare const DERIVE_INPUT_ENV = "DERIVE_INPUTS";
141
124
  /** The environment variable that carries the container path of the output file into the container. */
142
125
  export declare const DERIVE_OUTPUT_ENV = "DERIVE_OUTPUT";
143
126
  /** One declared input, as the container reads it: the mounted path of the file, and its pinned hash. */
144
- export interface DerivationInputMount {
127
+ export type DerivationInputMount = {
145
128
  readonly path: string;
146
129
  readonly hash: string;
147
- }
130
+ };
148
131
  /**
149
- * Build the sandbox exec of one derivation. The command runs the script of the agent through `python3 -c`.
132
+ * Build the sandbox exec of one derivation. The command clears the output path, and then it runs the script
133
+ * of the agent through `python3 -c`.
150
134
  *
151
135
  * The working directory is the write mount, thus the script writes its table beside where it stands. Each
152
136
  * declared input rides as its mounted path, thus the script opens the file wherever it works from. The
@@ -170,30 +154,6 @@ export declare function buildDerivationExec(args: {
170
154
  * The function is pure, thus a test asserts the mapping without a sandbox.
171
155
  */
172
156
  export declare function describeExecFailure(result: ExecResult): string | undefined;
173
- /**
174
- * The exec of one derivation, as a registered workflow reads it.
175
- *
176
- * Each field is plain data, thus the value crosses the workflow boundary and it survives a replay. The
177
- * paths are container paths already: the host maps them one time, before the start.
178
- */
179
- export interface DeriveTableExecInput {
180
- readonly analysisId: string;
181
- readonly runSession: RunSession;
182
- readonly executionId: string;
183
- readonly script: string;
184
- readonly writableTail: string;
185
- readonly workingDir: string;
186
- readonly inputs: readonly DerivationInputMount[];
187
- readonly output: string;
188
- }
189
- /**
190
- * Run one derivation exec and give the terminal result back.
191
- *
192
- * The composition realizes it over a registered workflow, thus the container and its exec live inside a
193
- * workflow. A fault of the sandbox rejects the promise, and the tool turns that rejection into one short
194
- * detail.
195
- */
196
- export type DeriveTableRunner = (input: DeriveTableExecInput) => Promise<Result<ExecResult, Suspension>>;
197
157
  /**
198
158
  * Make the derivation tool over the session-state gateway, the derivation ledger, and the sandbox rails.
199
159
  *
@@ -5,10 +5,12 @@
5
5
  * table that a block can bind: a join, a pivot, or an aggregate. The agent writes the script, and the record
6
6
  * chains the derived table back to the evidence that made it.
7
7
  *
8
- * A session derivation is not an analysis run. It mints no run id, it registers no artifact, and it writes
8
+ * A session derivation is not an analysis run. It mints no run id, no mandate, and no artifact, and it writes
9
9
  * under the session directory alone. The rails are the rails of the value tier (`tasks/extract-values.ts`):
10
- * the injected exec runner, the identity mint, and the authorizer on every terminal path. The container is
11
- * ephemeral, and it goes away with the work.
10
+ * one ephemeral container inside the step of the call (`sandbox/step-sandbox.ts`), which goes away with the
11
+ * work. The container stays until the record lands, thus a rerun of the step before the record adopts the
12
+ * container and the exec record of the first attempt, and the script does not run again. A rerun after the
13
+ * record finds the record of its call, and it gives that table back.
12
14
  *
13
15
  * The container mounts the analysis tree read-only, and one write mount covers the `derived/` directory of
14
16
  * the session alone. The script writes its table into that mount directly, thus a large table makes no
@@ -25,24 +27,19 @@
25
27
  * The tool refuses an output name that the membership already holds. A record is immutable, and a second
26
28
  * derivation of one table takes a new name.
27
29
  *
28
- * A composition with no sandbox client and no run authorizer cannot derive at all. The tool reports that
29
- * condition one time, up front, the same discipline as the eyes. A per-attempt failure would instead read as
30
- * a transient fault, and it would invite a repeat of a call that can never pass.
31
- *
32
- * The container runs behind a seam, and never in the turn. An exec is a durable step of a workflow, and a
33
- * report turn is not a workflow. Thus the tool takes an injected runner, and a registered workflow owns the
34
- * container. The tool holds no sandbox client, and it imports no DBOS.
30
+ * A composition with no sandbox client cannot derive at all. The tool reports that condition one time, up
31
+ * front, the same discipline as the eyes. A per-attempt failure would instead read as a transient fault, and
32
+ * it would invite a repeat of a call that can never pass.
35
33
  */
36
34
  import { ok } from "neverthrow";
37
- import { unlink } from "node:fs/promises";
38
35
  import { join } from "node:path";
39
36
  import { z } from "zod";
40
37
  import { createNoopLogger } from "../../lib/console-logger.js";
41
- import { deliverNotice, passGate } from "../../lib/hooks.js";
42
38
  import { classifyWithinRoot, computeSha256, computeSha256File } from "../../lib/fs-helpers.js";
43
39
  import { defaultErrorFields } from "../../lib/logger.js";
44
40
  import { snapshotEntry } from "../../report-model/reference-resolver.js";
45
- import { generateExecutionId } from "../../sandbox/execution-id.js";
41
+ import { isWorkflowCancellation } from "../../runtime/dbos.js";
42
+ import { passSpawnSession, withStepSandbox } from "../../sandbox/step-sandbox.js";
46
43
  import { isSafeId, reportSessionDerivedDir, toSandboxPath } from "../../workspace/paths.js";
47
44
  import { defineTool } from "../define-tool.js";
48
45
  import { openReportThread } from "../report-authoring/authoring-tools.js";
@@ -55,17 +52,17 @@ const deriveTableInput = z.object({
55
52
  output: z.string().min(1),
56
53
  });
57
54
  /** The synthetic run id and step id of one derivation. Both are constants, and neither names a run row. */
58
- export const DERIVE_RUN_LITERAL = "derive-table";
59
- export const DERIVE_STEP_LITERAL = "derive";
55
+ const DERIVE_RUN_LITERAL = "derive-table";
56
+ const DERIVE_STEP_LITERAL = "derive";
60
57
  /** The provenance agent id. No agent loop runs in the container, thus this names the derivation pass. */
61
58
  const DERIVE_AGENT_ID = "table-deriver";
62
59
  /** The exec budget of one derivation. It matches the budget of the value tier. */
63
- export const DERIVATION_DEADLINE_MS = 300_000;
60
+ const DERIVATION_DEADLINE_MS = 300_000;
64
61
  /**
65
62
  * The container size of one derivation. A join or a pivot loads each declared input into pandas at one
66
63
  * time, thus the container needs the headroom of the value tier.
67
64
  */
68
- export const DERIVATION_RESOURCES = { cpu: 2, memoryGb: 8 };
65
+ const DERIVATION_RESOURCES = { cpu: 2, memoryGb: 8 };
69
66
  /** The cap of the script, in bytes. A reshaping script sits far under it, and the command line carries it. */
70
67
  const SCRIPT_CAP_BYTES = 64 * 1024;
71
68
  /** The cap of the declared inputs. One derivation reads the evidence of a few artifacts, and never a tree. */
@@ -74,12 +71,23 @@ const INPUT_CAP = 20;
74
71
  export const DERIVE_INPUT_ENV = "DERIVE_INPUTS";
75
72
  /** The environment variable that carries the container path of the output file into the container. */
76
73
  export const DERIVE_OUTPUT_ENV = "DERIVE_OUTPUT";
74
+ /**
75
+ * The shell of the exec: clear the output path, then run the script. The script rides as the first
76
+ * positional argument, thus `python3 -c` gets it byte for byte.
77
+ *
78
+ * The clearance belongs to the exec, and not to the host. A failed derivation can leave a file at the name
79
+ * that this one declares, and a script that writes nothing must not adopt those bytes as its table.
80
+ * sandbox-server runs one exec id one time, thus a rerun that attaches to the exec of an earlier attempt
81
+ * keeps the table of that exec. A clearance on the host would remove it.
82
+ */
83
+ const CLEAR_THEN_RUN = `rm -f -- "$${DERIVE_OUTPUT_ENV}" && exec python3 -c "$1"`;
77
84
  /** The cap of the failure detail that the tool copies out of the standard error of the script. */
78
85
  const STDERR_TAIL_CAP = 2_000;
79
86
  /** The line that the agent reads when the composition binds no sandbox rails. */
80
87
  const NO_SANDBOX_DETAIL = "the composition gives no sandbox, thus this session cannot derive a table";
81
88
  /**
82
- * Build the sandbox exec of one derivation. The command runs the script of the agent through `python3 -c`.
89
+ * Build the sandbox exec of one derivation. The command clears the output path, and then it runs the script
90
+ * of the agent through `python3 -c`.
83
91
  *
84
92
  * The working directory is the write mount, thus the script writes its table beside where it stands. Each
85
93
  * declared input rides as its mounted path, thus the script opens the file wherever it works from. The
@@ -89,7 +97,7 @@ const NO_SANDBOX_DETAIL = "the composition gives no sandbox, thus this session c
89
97
  */
90
98
  export function buildDerivationExec(args) {
91
99
  return {
92
- command: ["python3", "-c", args.script],
100
+ command: ["sh", "-c", CLEAR_THEN_RUN, "derive_table", args.script],
93
101
  cwd: args.workingDir,
94
102
  env: {
95
103
  [DERIVE_INPUT_ENV]: JSON.stringify(args.inputs.map((input) => ({ path: input.path, hash: input.hash }))),
@@ -130,7 +138,20 @@ export function describeExecFailure(result) {
130
138
  export function createDeriveTableTool(deps) {
131
139
  const logger = (deps.logger ?? createNoopLogger()).named("derive-table");
132
140
  const observe = bindSessionEmit(deps.provenance, logger);
133
- const { runDerivation, runAuthorizer } = deps;
141
+ const observeDerived = (analysisId, threadId, result) => {
142
+ if (result.outcome !== "derived")
143
+ return;
144
+ observe({
145
+ type: "run-derivation",
146
+ analysisId,
147
+ threadId,
148
+ outputPath: result.path,
149
+ outputHash: result.hash,
150
+ scriptHash: result.scriptHash,
151
+ sources: result.sources,
152
+ });
153
+ };
154
+ const { sandboxClient } = deps;
134
155
  return defineTool({
135
156
  id: "derive_table",
136
157
  description: "Derive one table from the pinned evidence with a Python script, and pin the result to this session. " +
@@ -149,15 +170,14 @@ export function createDeriveTableTool(deps) {
149
170
  "A failed script gives back exec-failed with the tail of its standard error. " +
150
171
  "The outcome unavailable means that this host cannot run a derivation, and a repeat gives the same outcome.",
151
172
  inputSchema: deriveTableInput,
152
- executionMode: "inline",
153
173
  describeCall: (input) => `derive ${input.output}`,
154
174
  // The derived path is the one durable product of the call, thus the derived arm names it. Each other
155
175
  // arm is a condition that refused, and the kind of the arm is what a watcher must read.
156
176
  describeResult: (_input, result) => (result.outcome === "derived" ? result.path : result.outcome),
157
177
  execute: async (input, ctx) => {
158
178
  // The check runs before every read, thus one clear signal replaces a failure for each attempt.
159
- // It also narrows the two rails below, thus the exec needs no assertion.
160
- if (runDerivation === undefined || runAuthorizer === undefined) {
179
+ // It also narrows the rail below, thus the exec needs no assertion.
180
+ if (sandboxClient === undefined) {
161
181
  logger.warn("the composition gives no sandbox, thus no derivation can run");
162
182
  return ok({ outcome: "unavailable", detail: NO_SANDBOX_DETAIL });
163
183
  }
@@ -165,7 +185,7 @@ export function createDeriveTableTool(deps) {
165
185
  if (opened.isErr()) {
166
186
  return ok({ outcome: "refused", refusal: opened.error });
167
187
  }
168
- const { threadId, analysisId, state } = opened.value;
188
+ const { threadId, analysisId, state, derivations } = opened.value;
169
189
  const bytes = Buffer.byteLength(input.script, "utf8");
170
190
  if (bytes > SCRIPT_CAP_BYTES) {
171
191
  return ok({
@@ -210,15 +230,6 @@ export function createDeriveTableTool(deps) {
210
230
  // compose from the session-directory builder, thus the layout has one owner.
211
231
  const writableTail = reportSessionDerivedDir(threadId);
212
232
  const outputPath = `${writableTail}/${input.output}`;
213
- // The served membership carries each derivation of the session, thus this one test refuses a
214
- // repeated name and a collision with a pinned artifact alike.
215
- if (snapshotEntry(state.snapshot, outputPath) !== undefined) {
216
- return ok({
217
- outcome: "repeated-name",
218
- outputPath,
219
- detail: `the evidence of this session already holds ${outputPath}, thus this derivation takes a new name`,
220
- });
221
- }
222
233
  let root;
223
234
  try {
224
235
  root = await deps.resolveWorkspaceRoot(analysisId);
@@ -227,59 +238,56 @@ export function createDeriveTableTool(deps) {
227
238
  logger.warn("the workspace root did not resolve", { threadId, analysisId, ...defaultErrorFields(cause) });
228
239
  return ok({ outcome: "unavailable", detail: "the workspace root did not resolve, thus the derived table has no place to land" });
229
240
  }
230
- const authorized = await passGate("RunAuthorizer.authorize", runAuthorizer.authorize({
231
- auth: ctx.session.auth,
232
- scope: { kind: "analysis", analysisId },
233
- provenance: { agentId: DERIVE_AGENT_ID, callPath: [DERIVE_AGENT_ID] },
234
- frame: { runId: DERIVE_RUN_LITERAL, stepId: DERIVE_STEP_LITERAL },
235
- }));
236
- if (authorized.isErr()) {
237
- const { kind, reason } = authorized.error;
238
- logger.error("the derivation was not authorized", { threadId, analysisId, reason, suspend: kind === "suspended" });
239
- if (kind === "suspended")
240
- return ok({ outcome: "suspended", reason, detail: `the analysis is suspended (${reason}), thus the derivation did not run` });
241
- return ok({ outcome: "unavailable", detail: `the derivation was not authorized: ${reason}` });
241
+ // A rerun of a call whose record landed gives that record back. The membership holds the output of
242
+ // the record by now, thus the name test below would refuse the call its own table.
243
+ const recorded = derivations.find((record) => record.toolCallId === ctx.invocationId);
244
+ if (recorded !== undefined) {
245
+ const replayed = {
246
+ outcome: "derived",
247
+ path: recorded.outputPath,
248
+ hash: recorded.outputHash,
249
+ scriptHash: recorded.scriptHash,
250
+ sources: [...recorded.sources],
251
+ columns: await readColumnsQuietly(outputPath, join(root, outputPath), logger),
252
+ };
253
+ // A crash between the record and the emit of the earlier run loses its event, thus the rerun
254
+ // emits again. A consumer can get the act two times, never zero times.
255
+ observeDerived(analysisId, threadId, replayed);
256
+ return ok(replayed);
242
257
  }
243
- const authorization = authorized.value;
244
- // The work sits inside the `try`, and the revoke sits in the `finally`. Thus the authorization
245
- // revokes on every terminal path, the thrown one included: a path builder refuses a hostile
246
- // stored path with a throw, and that throw must not leave an authorization standing.
247
- let result;
248
- try {
249
- result = await derive({
250
- runDerivation,
251
- derivations: deps.derivations,
252
- root,
253
- threadId,
254
- analysisId,
255
- runSession: authorization.runSession,
256
- script: input.script,
257
- sources,
258
- writableTail,
258
+ // The served membership carries each derivation of the session, thus this one test refuses a
259
+ // repeated name and a collision with a pinned artifact alike.
260
+ if (snapshotEntry(state.snapshot, outputPath) !== undefined) {
261
+ return ok({
262
+ outcome: "repeated-name",
259
263
  outputPath,
260
- outputName: input.output,
261
- logger,
264
+ detail: `the evidence of this session already holds ${outputPath}, thus this derivation takes a new name`,
262
265
  });
263
- // The record of the derivation lands before this point, thus the event states a table that
264
- // the session already holds as evidence. Each other arm derived nothing.
265
- if (result.outcome === "derived") {
266
- observe({
267
- type: "run-derivation",
268
- analysisId,
269
- threadId,
270
- outputPath: result.path,
271
- outputHash: result.hash,
272
- scriptHash: result.scriptHash,
273
- sources: result.sources,
274
- });
275
- }
276
- return ok(result);
277
- }
278
- finally {
279
- // The revoke is a notice: its failure changes no outcome of the call, thus it reaches the log
280
- // alone. An absent result means that the work threw, and a throw is a failed derivation.
281
- await deliverNotice(logger.with({ threadId, analysisId }), "RunAuthorizer.revoke", runAuthorizer.revoke(authorization, result?.outcome === "derived" ? "derive-table-completed" : "derive-table-failed"));
282
266
  }
267
+ const result = await derive({
268
+ sandboxClient,
269
+ session: passSpawnSession(ctx.session, {
270
+ analysisId,
271
+ runId: DERIVE_RUN_LITERAL,
272
+ stepId: DERIVE_STEP_LITERAL,
273
+ agentId: DERIVE_AGENT_ID,
274
+ }),
275
+ derivations: deps.derivations,
276
+ root,
277
+ threadId,
278
+ analysisId,
279
+ toolCallId: ctx.invocationId,
280
+ script: input.script,
281
+ sources,
282
+ writableTail,
283
+ outputPath,
284
+ outputName: input.output,
285
+ logger,
286
+ });
287
+ // The record of the derivation lands before this point, thus the event states a table that the
288
+ // session already holds as evidence. Each other arm derived nothing.
289
+ observeDerived(analysisId, threadId, result);
290
+ return ok(result);
283
291
  },
284
292
  });
285
293
  }
@@ -288,62 +296,51 @@ export function createDeriveTableTool(deps) {
288
296
  *
289
297
  * The order is the order of the evidence. The script writes into the write mount, the host classifies the
290
298
  * file, the hash comes off the disk, and the record lands last. Thus the recorded hash is the hash of the
291
- * file that a verifier reads.
299
+ * file that a verifier reads. The container goes away after the record.
292
300
  *
293
301
  * The classification is the guard of the read. A script can leave a symbolic link at the output name, and a
294
302
  * link that resolves outside the tree would otherwise carry a host file into the evidence of the session.
295
- *
296
- * The output path clears before the exec. The host owns the `derived/` directory, and a failed attempt can
297
- * leave a file at the name that this attempt declares. Without the clearance a script that writes nothing
298
- * would adopt those bytes as its own table, and the record would chain a script to a file that it never
299
- * wrote. A clearance fault refuses the derivation, because the same doubt stands.
300
303
  */
301
304
  async function derive(args) {
302
- const executionId = generateExecutionId(DERIVE_AGENT_ID);
303
305
  const absolute = join(args.root, args.outputPath);
304
306
  // The container sees the tree at its own mount point, thus each path that the script reads maps through
305
- // the one host-to-container mapper and never through a formula here.
306
- const workingDir = toSandboxPath(args.root, args.analysisId, join(args.root, args.writableTail));
307
- // `unlink` removes a symbolic link as the link, and never the file that it names. An absent path is the
308
- // normal condition, thus it is not a fault.
309
- try {
310
- await unlink(absolute);
311
- }
312
- catch (cause) {
313
- if (cause.code !== "ENOENT") {
314
- args.logger.error("the output path did not clear before the derivation", { threadId: args.threadId, ...defaultErrorFields(cause) });
315
- return { outcome: "exec-failed", detail: `${args.outputName} already holds a file that did not clear, thus this derivation takes a new name` };
316
- }
317
- }
318
- // The path mapper refuses a stored path that escapes the root, with a throw. It runs before the try,
319
- // thus that refusal stays a throw and it never reads as a fault of the container.
320
- const execInput = {
321
- analysisId: args.analysisId,
322
- runSession: args.runSession,
323
- executionId,
307
+ // the one host-to-container mapper and never through a formula here. The mapper refuses a stored path
308
+ // that escapes the root with a throw. It runs before the try, thus that refusal stays a throw and it never
309
+ // reads as a fault of the container.
310
+ const request = buildDerivationExec({
324
311
  script: args.script,
325
- writableTail: args.writableTail,
326
- workingDir,
312
+ workingDir: toSandboxPath(args.root, args.analysisId, join(args.root, args.writableTail)),
327
313
  inputs: args.sources.map((source) => ({ path: toSandboxPath(args.root, args.analysisId, join(args.root, source.path)), hash: source.hash })),
328
314
  output: toSandboxPath(args.root, args.analysisId, absolute),
329
- };
315
+ });
330
316
  let ran;
331
317
  try {
332
- ran = await args.runDerivation(execInput);
318
+ ran = await withStepSandbox(args.sandboxClient, { session: args.session, spec: { resources: DERIVATION_RESOURCES, writableTail: args.writableTail } }, args.logger, async (exec) => {
319
+ const failure = describeExecFailure(await exec(request, DERIVATION_DEADLINE_MS));
320
+ if (failure !== undefined) {
321
+ return { outcome: "exec-failed", detail: failure };
322
+ }
323
+ return recordDerivedTable({ ...args, absolute });
324
+ });
333
325
  }
334
326
  catch (cause) {
327
+ if (isWorkflowCancellation(cause))
328
+ throw cause;
335
329
  args.logger.error("the derivation exec did not complete", { threadId: args.threadId, ...defaultErrorFields(cause) });
336
330
  return { outcome: "exec-failed", detail: "the derivation exec did not complete" };
337
331
  }
338
332
  if (ran.isErr()) {
339
- return { outcome: "suspended", reason: ran.error.reason, detail: `the analysis is suspended (${ran.error.reason}), thus the derivation did not run` };
340
- }
341
- const executed = ran.value;
342
- const failure = describeExecFailure(executed);
343
- if (failure !== undefined) {
344
- return { outcome: "exec-failed", detail: failure };
333
+ return {
334
+ outcome: "suspended",
335
+ reason: ran.error.reason,
336
+ detail: `the host refused the sandbox (${ran.error.reason}), thus the derivation did not run`,
337
+ };
345
338
  }
346
- const verdict = await classifyWithinRoot(args.root, absolute).catch((cause) => {
339
+ return ran.value;
340
+ }
341
+ /** Classify, hash, and record the table that a green script wrote. */
342
+ async function recordDerivedTable(args) {
343
+ const verdict = await classifyWithinRoot(args.root, args.absolute).catch((cause) => {
347
344
  args.logger.error("the derived table did not classify", { threadId: args.threadId, ...defaultErrorFields(cause) });
348
345
  return "escaped";
349
346
  });
@@ -361,7 +358,7 @@ async function derive(args) {
361
358
  }
362
359
  let outputHash;
363
360
  try {
364
- outputHash = await computeSha256File(absolute);
361
+ outputHash = await computeSha256File(args.absolute);
365
362
  }
366
363
  catch (cause) {
367
364
  args.logger.error("the derived table did not hash", { threadId: args.threadId, ...defaultErrorFields(cause) });
@@ -373,6 +370,7 @@ async function derive(args) {
373
370
  sources: [...args.sources],
374
371
  scriptHash: computeSha256(Buffer.from(args.script, "utf8")),
375
372
  script: args.script,
373
+ toolCallId: args.toolCallId,
376
374
  };
377
375
  const appended = await args.derivations.appendDerivation(args.threadId, record);
378
376
  if (appended.isErr()) {
@@ -394,14 +392,14 @@ async function derive(args) {
394
392
  }
395
393
  // The columns describe the derived table the same way as the listing describes a pinned one. A file that
396
394
  // gives no header gives no columns, and absence is a normal condition here.
397
- const columns = await readColumnsQuietly(args.outputPath, absolute, args.logger);
395
+ const columns = await readColumnsQuietly(args.outputPath, args.absolute, args.logger);
398
396
  return {
399
397
  outcome: "derived",
400
398
  path: args.outputPath,
401
399
  hash: outputHash,
402
400
  scriptHash: record.scriptHash,
403
401
  sources: [...args.sources],
404
- ...(columns === undefined ? {} : { columns }),
402
+ columns,
405
403
  };
406
404
  }
407
405
  /**
@@ -56,12 +56,12 @@ import { type ChromeConfig } from "../../lib/chrome.js";
56
56
  import type { GateFailure } from "../../lib/hooks.js";
57
57
  import { type AcquireEyes } from "../../lib/eyes.js";
58
58
  import { type Logger } from "../../lib/logger.js";
59
- import { type CaptureCoverage, type CapturePage, type FailedRequest, type PageCapture } from "../../lib/page-capture.js";
59
+ import { type CaptureCoverage, type CapturePage } from "../../lib/page-capture.js";
60
60
  import { type ResolveWorkspaceRoot } from "../../workspace/paths.js";
61
61
  import { type Tool } from "../define-tool.js";
62
62
  import { type ReportSessionStateGateway, type SessionRefusal } from "../report-authoring/authoring-tools.js";
63
63
  import { type ConsoleErrorEntry, type FailedRequestEntry } from "./page-faults.js";
64
- export type { CaptureCoverage, CapturePage, FailedRequest, PageCapture };
64
+ export type { CaptureCoverage, CapturePage, FailedRequest, PageCapture } from "../../lib/page-capture.js";
65
65
  /**
66
66
  * The URL formation of one look. It maps the page of the thread onto the URL that the browser opens.
67
67
  * A composition whose browser cannot reach the workspace tree binds a resolver that names a served URL.
@@ -80,11 +80,11 @@ declare const examinePageInput: z.ZodObject<{
80
80
  }, z.core.$strip>;
81
81
  export type ExaminePageInput = z.infer<typeof examinePageInput>;
82
82
  /** The document range of one slice of a tiled look, in the order that the pictures ride. */
83
- export interface ExaminedTile {
83
+ export type ExaminedTile = {
84
84
  index: number;
85
85
  fromY: number;
86
86
  toY: number;
87
- }
87
+ };
88
88
  /**
89
89
  * The typed outcome of the eyes tool. Each arm is ok-channel data, thus the tool never throws for a
90
90
  * degraded condition. `examined` carries the coverage of the look, the digest of the console errors and the
@@ -137,7 +137,7 @@ export type ExaminePageResult = {
137
137
  * tree names a served URL instead. `capture` is optional and it replaces the whole transport, thus a test
138
138
  * injects a seam that reads no browser.
139
139
  */
140
- export interface ExaminePageToolDeps {
140
+ export type ExaminePageToolDeps = {
141
141
  readonly gateway: ReportSessionStateGateway;
142
142
  readonly resolveWorkspaceRoot: ResolveWorkspaceRoot;
143
143
  readonly chrome: ChromeConfig;
@@ -154,7 +154,7 @@ export interface ExaminePageToolDeps {
154
154
  readonly acquireMs?: number;
155
155
  readonly releaseMs?: number;
156
156
  };
157
- }
157
+ };
158
158
  /**
159
159
  * Make the eyes tool over the session-state gateway, the workspace-root seam, and the eyes of the composition.
160
160
  *