@inflexa-ai/harness 0.45.1 → 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 (789) hide show
  1. package/README.md +6 -3
  2. package/dist/agents/conversation-agent.d.ts +9 -3
  3. package/dist/agents/conversation-agent.js +34 -33
  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 +12 -14
  9. package/dist/agents/sandbox/shared.js +18 -12
  10. package/dist/agents/sandbox/types.d.ts +4 -4
  11. package/dist/agents/sandbox/validate-skills.d.ts +2 -2
  12. package/dist/agents/sandbox/validate-skills.js +3 -1
  13. package/dist/agents/sandbox-catalog.d.ts +2 -2
  14. package/dist/agents/sandbox-catalog.js +3 -3
  15. package/dist/agents/system-prompt.d.ts +2 -2
  16. package/dist/app/chat-turn-workflow.d.ts +114 -0
  17. package/dist/app/chat-turn-workflow.js +307 -0
  18. package/dist/app/chat-turn.d.ts +85 -57
  19. package/dist/app/chat-turn.js +123 -100
  20. package/dist/app/data-profile-orientation.js +10 -8
  21. package/dist/app/data-profile-view.d.ts +4 -4
  22. package/dist/app/data-profile-view.js +9 -8
  23. package/dist/app/in-process-turn.d.ts +42 -0
  24. package/dist/app/in-process-turn.js +139 -0
  25. package/dist/app/message-assembly.d.ts +10 -4
  26. package/dist/app/message-assembly.js +13 -8
  27. package/dist/app/report-session-runtime.d.ts +4 -4
  28. package/dist/app/report-session-runtime.js +36 -21
  29. package/dist/app/spawn-report-session.d.ts +33 -28
  30. package/dist/app/spawn-report-session.js +25 -40
  31. package/dist/app/synthesize-run.d.ts +22 -16
  32. package/dist/app/synthesize-run.js +41 -35
  33. package/dist/app/work.d.ts +96 -0
  34. package/dist/app/work.js +147 -0
  35. package/dist/auth/local-auth-context.d.ts +1 -3
  36. package/dist/auth/local-auth-context.js +1 -3
  37. package/dist/auth/local-run-authorizer.d.ts +1 -1
  38. package/dist/auth/local-run-authorizer.js +5 -3
  39. package/dist/auth/types.d.ts +26 -26
  40. package/dist/billing/cached-resolver.d.ts +4 -4
  41. package/dist/billing/run-charge.d.ts +5 -8
  42. package/dist/billing/run-charge.js +2 -2
  43. package/dist/billing/usage-recorder.d.ts +9 -9
  44. package/dist/citations/aggregate.js +1 -1
  45. package/dist/citations/clients/arxiv.d.ts +2 -2
  46. package/dist/citations/clients/arxiv.js +12 -4
  47. package/dist/citations/clients/common.js +4 -2
  48. package/dist/citations/clients/crossref.d.ts +2 -2
  49. package/dist/citations/clients/crossref.js +37 -37
  50. package/dist/citations/clients/doi-registry.js +15 -16
  51. package/dist/citations/clients/pubmed.d.ts +2 -2
  52. package/dist/citations/clients/pubmed.js +20 -13
  53. package/dist/citations/clients/semantic-scholar.d.ts +2 -2
  54. package/dist/citations/clients/semantic-scholar.js +9 -9
  55. package/dist/citations/compare.js +2 -2
  56. package/dist/citations/match.d.ts +2 -2
  57. package/dist/citations/match.js +12 -7
  58. package/dist/citations/normalize.js +35 -26
  59. package/dist/citations/plan.js +6 -2
  60. package/dist/citations/resolve.d.ts +6 -6
  61. package/dist/citations/resolve.js +34 -25
  62. package/dist/citations/types.d.ts +77 -77
  63. package/dist/config/environment-stores.d.ts +6 -6
  64. package/dist/config/resource-limits.js +1 -3
  65. package/dist/contracts/analogy-report.d.ts +7 -7
  66. package/dist/contracts/analogy-report.js +2 -2
  67. package/dist/contracts/chat-events.d.ts +38 -24
  68. package/dist/contracts/chat-frame.d.ts +15 -5
  69. package/dist/contracts/chat-frame.js +64 -41
  70. package/dist/contracts/chat-parts.d.ts +130 -67
  71. package/dist/contracts/chat-parts.js +1 -0
  72. package/dist/contracts/content-url.js +16 -2
  73. package/dist/contracts/data-profile.d.ts +38 -38
  74. package/dist/contracts/index.d.ts +2 -2
  75. package/dist/contracts/index.js +1 -1
  76. package/dist/contracts/message.d.ts +6 -6
  77. package/dist/contracts/organ-system.d.ts +11 -11
  78. package/dist/contracts/part-registry.d.ts +5 -4
  79. package/dist/contracts/part-registry.js +5 -0
  80. package/dist/contracts/profile-vocabulary.d.ts +11 -10
  81. package/dist/contracts/profile-vocabulary.js +10 -3
  82. package/dist/contracts/report-blocks.d.ts +329 -329
  83. package/dist/contracts/report-reference.d.ts +105 -81
  84. package/dist/contracts/report-reference.js +30 -13
  85. package/dist/contracts/schemas/chat-events.d.ts +30 -16
  86. package/dist/contracts/schemas/chat-events.js +15 -6
  87. package/dist/contracts/schemas/chat-parts.d.ts +175 -102
  88. package/dist/contracts/schemas/chat-parts.js +33 -7
  89. package/dist/contracts/severity.d.ts +1 -1
  90. package/dist/contracts/structure-source.d.ts +3 -3
  91. package/dist/contracts/structure-source.js +6 -2
  92. package/dist/contracts/subagent-activity.d.ts +2 -2
  93. package/dist/contracts/subagent-activity.js +5 -3
  94. package/dist/contracts/usage.d.ts +2 -2
  95. package/dist/data/safety-panel-schema.d.ts +25 -25
  96. package/dist/data/safety-panel-schema.js +13 -4
  97. package/dist/execution/artifact-metadata.d.ts +23 -15
  98. package/dist/execution/artifact-metadata.js +33 -10
  99. package/dist/execution/artifact-record.d.ts +2 -2
  100. package/dist/execution/artifact-registration.d.ts +5 -5
  101. package/dist/execution/artifact-registry.d.ts +8 -8
  102. package/dist/execution/dbos-run-launcher.d.ts +24 -4
  103. package/dist/execution/dbos-run-launcher.js +58 -4
  104. package/dist/execution/dbos-workflow-purger.d.ts +5 -6
  105. package/dist/execution/dbos-workflow-purger.js +8 -7
  106. package/dist/execution/input-signature.d.ts +2 -2
  107. package/dist/execution/post-step-pipeline.d.ts +9 -9
  108. package/dist/execution/post-step-pipeline.js +1 -1
  109. package/dist/execution/post-step.js +2 -2
  110. package/dist/execution/reconcile-manifest.d.ts +4 -4
  111. package/dist/execution/reconcile-manifest.js +3 -2
  112. package/dist/execution/run-authorizer.d.ts +46 -37
  113. package/dist/execution/run-authorizer.js +8 -8
  114. package/dist/execution/run-canceler.d.ts +7 -7
  115. package/dist/execution/run-canceler.js +14 -7
  116. package/dist/execution/run-end-record.d.ts +2 -3
  117. package/dist/execution/run-event-parts.d.ts +0 -8
  118. package/dist/execution/run-event-parts.js +29 -24
  119. package/dist/execution/run-event-stream.d.ts +8 -8
  120. package/dist/execution/run-event-stream.js +3 -4
  121. package/dist/execution/run-launcher.d.ts +4 -4
  122. package/dist/execution/run-synthesis.d.ts +49 -48
  123. package/dist/execution/run-synthesis.js +96 -255
  124. package/dist/execution/staged-input.d.ts +2 -2
  125. package/dist/execution/step-summary.d.ts +6 -6
  126. package/dist/execution/step-summary.js +4 -8
  127. package/dist/execution/topo-sort.js +4 -3
  128. package/dist/execution/workflow-purger.d.ts +2 -2
  129. package/dist/index.d.ts +17 -20
  130. package/dist/index.js +25 -36
  131. package/dist/input-sanitization.js +9 -2
  132. package/dist/input-scan/clustering.d.ts +6 -6
  133. package/dist/input-scan/clustering.js +11 -5
  134. package/dist/input-scan/companions.js +3 -2
  135. package/dist/input-scan/detect-sets.d.ts +2 -2
  136. package/dist/input-scan/detect-sets.js +25 -21
  137. package/dist/input-scan/enrich.d.ts +6 -6
  138. package/dist/input-scan/enrich.js +29 -12
  139. package/dist/input-scan/formats.d.ts +2 -2
  140. package/dist/input-scan/formats.js +8 -2
  141. package/dist/input-scan/markers.d.ts +2 -2
  142. package/dist/input-scan/markers.js +14 -5
  143. package/dist/input-scan/menu.d.ts +10 -10
  144. package/dist/input-scan/menu.js +0 -0
  145. package/dist/input-scan/quarantine.d.ts +2 -2
  146. package/dist/input-scan/quarantine.js +23 -18
  147. package/dist/input-scan/readout-budget.d.ts +2 -2
  148. package/dist/input-scan/readout-budget.js +1 -1
  149. package/dist/input-scan/readout.d.ts +2 -2
  150. package/dist/input-scan/readout.js +47 -34
  151. package/dist/input-scan/scan.d.ts +2 -2
  152. package/dist/input-scan/scan.js +7 -5
  153. package/dist/input-scan/set-types.d.ts +28 -28
  154. package/dist/input-scan/shapes.d.ts +4 -4
  155. package/dist/input-scan/shapes.js +0 -0
  156. package/dist/input-scan/templates.d.ts +10 -10
  157. package/dist/input-scan/templates.js +30 -22
  158. package/dist/input-scan/tokens.d.ts +6 -4
  159. package/dist/input-scan/tokens.js +100 -38
  160. package/dist/input-scan/types.d.ts +22 -22
  161. package/dist/lib/async-utils.d.ts +3 -7
  162. package/dist/lib/async-utils.js +5 -9
  163. package/dist/lib/cache.js +1 -1
  164. package/dist/lib/chrome.d.ts +46 -6
  165. package/dist/lib/console-logger.js +2 -2
  166. package/dist/lib/db-result.d.ts +22 -6
  167. package/dist/lib/db-result.js +9 -13
  168. package/dist/lib/eyes.d.ts +4 -4
  169. package/dist/lib/eyes.js +1 -1
  170. package/dist/lib/fs-helpers.js +18 -6
  171. package/dist/lib/fs-result.d.ts +1 -0
  172. package/dist/lib/fs-result.js +5 -6
  173. package/dist/lib/hooks.d.ts +23 -7
  174. package/dist/lib/hooks.js +17 -3
  175. package/dist/lib/host-concurrency.js +3 -2
  176. package/dist/lib/logger.d.ts +2 -2
  177. package/dist/lib/logger.js +2 -1
  178. package/dist/lib/metrics.d.ts +1 -1
  179. package/dist/lib/null-proto.d.ts +6 -0
  180. package/dist/lib/null-proto.js +17 -0
  181. package/dist/lib/otel-spans.d.ts +1 -1
  182. package/dist/lib/otel-spans.js +9 -5
  183. package/dist/lib/otel.d.ts +4 -2
  184. package/dist/lib/otel.js +10 -2
  185. package/dist/lib/page-capture.d.ts +8 -8
  186. package/dist/lib/page-capture.js +9 -4
  187. package/dist/lib/parse-json.d.ts +5 -0
  188. package/dist/lib/parse-json.js +12 -0
  189. package/dist/lib/present.d.ts +12 -0
  190. package/dist/lib/present.js +39 -0
  191. package/dist/lib/rate-limit.d.ts +4 -4
  192. package/dist/lib/rate-limit.js +12 -13
  193. package/dist/lib/regulatory-corpus/fetch-fda-guidance.d.ts +4 -4
  194. package/dist/lib/regulatory-corpus/fetch-fda-guidance.js +4 -10
  195. package/dist/lib/regulatory-corpus/fetch-ich.d.ts +4 -4
  196. package/dist/lib/regulatory-corpus/fetch-ich.js +18 -14
  197. package/dist/lib/regulatory-corpus/normalize-whitespace.d.ts +6 -0
  198. package/dist/lib/regulatory-corpus/normalize-whitespace.js +41 -0
  199. package/dist/lib/regulatory-corpus.d.ts +10 -10
  200. package/dist/lib/regulatory-corpus.js +3 -1
  201. package/dist/lib/result.d.ts +10 -11
  202. package/dist/lib/result.js +15 -13
  203. package/dist/lib/storage.d.ts +2 -2
  204. package/dist/lib/test/async-iterable.d.ts +9 -0
  205. package/dist/lib/test/async-iterable.js +28 -0
  206. package/dist/lib/test/request-url.d.ts +5 -0
  207. package/dist/lib/test/request-url.js +7 -0
  208. package/dist/lib/test/result-assert.d.ts +12 -0
  209. package/dist/lib/test/result-assert.js +17 -0
  210. package/dist/lib/test/text-shapes.d.ts +24 -0
  211. package/dist/lib/test/text-shapes.js +63 -0
  212. package/dist/lib/text.d.ts +22 -0
  213. package/dist/lib/text.js +68 -0
  214. package/dist/lib/thrown.d.ts +18 -0
  215. package/dist/lib/thrown.js +30 -0
  216. package/dist/lib/unknown-array.d.ts +6 -0
  217. package/dist/lib/unknown-array.js +8 -0
  218. package/dist/lib/unknown-containers.d.ts +14 -0
  219. package/dist/lib/unknown-containers.js +17 -0
  220. package/dist/lib/unknown-text.d.ts +8 -0
  221. package/dist/lib/unknown-text.js +28 -0
  222. package/dist/lib/zod-issue-shape.d.ts +1 -1
  223. package/dist/lib/zod-issue-shape.js +31 -31
  224. package/dist/lib/zod-issues.d.ts +3 -3
  225. package/dist/lib/zod-issues.js +30 -17
  226. package/dist/literature/sources/arxiv.d.ts +6 -6
  227. package/dist/literature/sources/arxiv.js +92 -35
  228. package/dist/literature/sources/http.d.ts +2 -2
  229. package/dist/literature/sources/http.js +16 -15
  230. package/dist/literature/sources/pubmed.d.ts +16 -16
  231. package/dist/literature/sources/pubmed.js +96 -61
  232. package/dist/literature/sources/semantic-scholar.d.ts +8 -8
  233. package/dist/literature/sources/semantic-scholar.js +22 -13
  234. package/dist/loop/accounting.d.ts +63 -0
  235. package/dist/loop/accounting.js +141 -0
  236. package/dist/loop/call-policy.d.ts +73 -0
  237. package/dist/loop/call-policy.js +109 -0
  238. package/dist/loop/chat-stream.d.ts +62 -0
  239. package/dist/loop/chat-stream.js +237 -0
  240. package/dist/loop/compaction.d.ts +9 -9
  241. package/dist/loop/compaction.js +1 -1
  242. package/dist/loop/metrics.d.ts +12 -15
  243. package/dist/loop/metrics.js +14 -26
  244. package/dist/loop/run-loop.d.ts +233 -0
  245. package/dist/loop/run-loop.js +770 -0
  246. package/dist/loop/sub-agent.d.ts +61 -0
  247. package/dist/loop/sub-agent.js +161 -0
  248. package/dist/loop/tool-adapter.d.ts +98 -0
  249. package/dist/loop/tool-adapter.js +364 -0
  250. package/dist/loop/tool-detail.d.ts +1 -1
  251. package/dist/loop/tool-detail.js +6 -5
  252. package/dist/loop/tool-outcome.d.ts +1 -1
  253. package/dist/loop/tool-output.d.ts +4 -4
  254. package/dist/loop/tool-output.js +2 -2
  255. package/dist/loop/turn-credentials.d.ts +34 -0
  256. package/dist/loop/turn-credentials.js +73 -0
  257. package/dist/loop/types.d.ts +29 -38
  258. package/dist/loop/types.js +2 -7
  259. package/dist/memory/ai-sdk-message-storage.d.ts +5 -5
  260. package/dist/memory/ai-sdk-message-storage.js +13 -11
  261. package/dist/memory/card-builders.d.ts +14 -14
  262. package/dist/memory/card-builders.js +19 -15
  263. package/dist/memory/conversation-display-recorder.d.ts +22 -4
  264. package/dist/memory/conversation-display-recorder.js +43 -24
  265. package/dist/memory/conversation-display-replay.js +3 -2
  266. package/dist/memory/conversation-display-storage.d.ts +15 -7
  267. package/dist/memory/conversation-display-storage.js +141 -36
  268. package/dist/memory/conversation-view.d.ts +4 -4
  269. package/dist/memory/conversation-view.js +5 -4
  270. package/dist/memory/count-tokens.js +10 -8
  271. package/dist/memory/derive-thread-title.d.ts +0 -13
  272. package/dist/memory/derive-thread-title.js +2 -1
  273. package/dist/memory/message-backfill.d.ts +12 -5
  274. package/dist/memory/message-backfill.js +5 -3
  275. package/dist/memory/thread-history.d.ts +36 -21
  276. package/dist/memory/thread-history.js +78 -54
  277. package/dist/memory/thread-store.d.ts +26 -17
  278. package/dist/memory/thread-store.js +15 -9
  279. package/dist/memory/tool-call-integrity.d.ts +2 -2
  280. package/dist/memory/tool-call-integrity.js +4 -3
  281. package/dist/memory/working-memory.d.ts +16 -12
  282. package/dist/memory/working-memory.js +72 -61
  283. package/dist/prompts/briefing.d.ts +12 -12
  284. package/dist/prompts/briefing.js +1 -1
  285. package/dist/prompts/synthesis-agent.d.ts +1 -1
  286. package/dist/prompts/synthesis-agent.js +6 -14
  287. package/dist/provenance/collector.d.ts +6 -6
  288. package/dist/provenance/collector.js +15 -8
  289. package/dist/provenance/exec-frame.d.ts +2 -2
  290. package/dist/provenance/exec-frame.js +6 -1
  291. package/dist/provenance/seam.d.ts +1 -4
  292. package/dist/provenance/types.d.ts +6 -6
  293. package/dist/providers/ai-sdk.d.ts +113 -62
  294. package/dist/providers/ai-sdk.js +283 -518
  295. package/dist/providers/embedding.d.ts +2 -2
  296. package/dist/providers/embedding.js +1 -1
  297. package/dist/providers/errors.d.ts +22 -2
  298. package/dist/providers/errors.js +98 -50
  299. package/dist/providers/prompt-cache.d.ts +8 -8
  300. package/dist/providers/prompt-cache.js +13 -11
  301. package/dist/providers/reasoning.d.ts +2 -2
  302. package/dist/providers/reasoning.js +2 -2
  303. package/dist/providers/types.d.ts +55 -94
  304. package/dist/reference-data/catalog.d.ts +2 -15
  305. package/dist/reference-data/catalog.js +25 -8
  306. package/dist/reference-data/receipt.d.ts +2 -2
  307. package/dist/report-model/assert-rules.js +1 -1
  308. package/dist/report-model/authoring-grammar.d.ts +211 -233
  309. package/dist/report-model/block-walk.d.ts +10 -10
  310. package/dist/report-model/block-walk.js +2 -0
  311. package/dist/report-model/draft-finish.d.ts +8 -8
  312. package/dist/report-model/draft-finish.js +1 -1
  313. package/dist/report-model/draft-hash.js +8 -7
  314. package/dist/report-model/draft-operations.d.ts +22 -10
  315. package/dist/report-model/draft-operations.js +48 -30
  316. package/dist/report-model/draft-read.d.ts +19 -7
  317. package/dist/report-model/draft-read.js +16 -6
  318. package/dist/report-model/draft.d.ts +844 -2
  319. package/dist/report-model/draft.js +3 -1
  320. package/dist/report-model/fixture-resolver.js +39 -16
  321. package/dist/report-model/pin-snapshot.d.ts +2 -2
  322. package/dist/report-model/pin-snapshot.js +15 -15
  323. package/dist/report-model/production-resolver.d.ts +18 -18
  324. package/dist/report-model/production-resolver.js +50 -42
  325. package/dist/report-model/reference-resolver.d.ts +26 -10
  326. package/dist/report-model/reference-resolver.js +68 -5
  327. package/dist/report-model/reference-stamp.js +30 -38
  328. package/dist/report-model/structural-validation.js +12 -4
  329. package/dist/report-model/validate.d.ts +7 -7
  330. package/dist/report-model/validate.js +6 -6
  331. package/dist/report-render/assets.d.ts +2 -2
  332. package/dist/report-render/assets.js +27 -3
  333. package/dist/report-render/chart-export.d.ts +10 -2
  334. package/dist/report-render/chart-export.js +37 -11
  335. package/dist/report-render/chart-presets.d.ts +8 -8
  336. package/dist/report-render/chart-presets.js +3 -3
  337. package/dist/report-render/chart-renderers.d.ts +23 -16
  338. package/dist/report-render/chart-renderers.js +74 -53
  339. package/dist/report-render/chart-toolbox.d.ts +2 -2
  340. package/dist/report-render/chart-toolbox.js +7 -6
  341. package/dist/report-render/chart.d.ts +15 -16
  342. package/dist/report-render/chart.js +369 -252
  343. package/dist/report-render/design.d.ts +36 -297
  344. package/dist/report-render/design.js +0 -12
  345. package/dist/report-render/figures/common.d.ts +12 -12
  346. package/dist/report-render/figures/common.js +42 -31
  347. package/dist/report-render/figures/dendrogram.d.ts +3 -3
  348. package/dist/report-render/figures/dendrogram.js +10 -10
  349. package/dist/report-render/figures/dense.js +15 -8
  350. package/dist/report-render/figures/dotplot.js +46 -33
  351. package/dist/report-render/figures/embedding.js +52 -43
  352. package/dist/report-render/figures/equal-units.d.ts +10 -10
  353. package/dist/report-render/figures/equal-units.js +27 -27
  354. package/dist/report-render/figures/forest.js +9 -7
  355. package/dist/report-render/figures/gsea.js +21 -11
  356. package/dist/report-render/figures/heatmap.js +13 -9
  357. package/dist/report-render/figures/index.d.ts +10 -10
  358. package/dist/report-render/figures/index.js +4 -2
  359. package/dist/report-render/figures/km.js +10 -9
  360. package/dist/report-render/figures/label-room.d.ts +12 -12
  361. package/dist/report-render/figures/label-room.js +7 -2
  362. package/dist/report-render/figures/locuszoom.d.ts +2 -2
  363. package/dist/report-render/figures/locuszoom.js +59 -31
  364. package/dist/report-render/figures/lollipop.js +3 -2
  365. package/dist/report-render/figures/ma.js +8 -4
  366. package/dist/report-render/figures/manhattan.d.ts +1 -2
  367. package/dist/report-render/figures/manhattan.js +52 -34
  368. package/dist/report-render/figures/oncoprint.js +4 -5
  369. package/dist/report-render/figures/pca.js +25 -11
  370. package/dist/report-render/figures/qq.js +20 -9
  371. package/dist/report-render/figures/roc.js +1 -1
  372. package/dist/report-render/figures/sankey.d.ts +2 -2
  373. package/dist/report-render/figures/sankey.js +11 -10
  374. package/dist/report-render/figures/upset.d.ts +6 -6
  375. package/dist/report-render/figures/upset.js +7 -4
  376. package/dist/report-render/figures/volcano.js +12 -10
  377. package/dist/report-render/hybrid-svg.d.ts +4 -4
  378. package/dist/report-render/hybrid-svg.js +7 -5
  379. package/dist/report-render/number-format.d.ts +4 -4
  380. package/dist/report-render/number-format.js +62 -27
  381. package/dist/report-render/page.js +2 -1
  382. package/dist/report-render/provenance-data.d.ts +2 -2
  383. package/dist/report-render/references.d.ts +4 -4
  384. package/dist/report-render/render.d.ts +2 -2
  385. package/dist/report-render/render.js +10 -11
  386. package/dist/report-render/script-json.js +1 -1
  387. package/dist/report-render/table-data.d.ts +6 -6
  388. package/dist/report-render/test/options.d.ts +49 -0
  389. package/dist/report-render/test/options.js +143 -0
  390. package/dist/report-render/test/page-function.d.ts +19 -0
  391. package/dist/report-render/test/page-function.js +33 -0
  392. package/dist/report-render/types.d.ts +10 -10
  393. package/dist/report-render/value-bridge.d.ts +4 -4
  394. package/dist/report-render/value-bridge.js +27 -14
  395. package/dist/report-render/views/chart-view.d.ts +2 -2
  396. package/dist/report-render/views/chart-view.js +2 -2
  397. package/dist/report-render/views/lineage.d.ts +6 -6
  398. package/dist/report-render/views/lineage.js +2 -0
  399. package/dist/report-render/views/page-view.d.ts +2 -2
  400. package/dist/report-render/views/page-view.js +1 -0
  401. package/dist/report-render/views/prose.js +25 -8
  402. package/dist/report-render/views/references-view.js +12 -1
  403. package/dist/report-render/views/values.js +1 -1
  404. package/dist/runtime/assemble.d.ts +53 -26
  405. package/dist/runtime/assemble.js +103 -56
  406. package/dist/runtime/boot.d.ts +8 -7
  407. package/dist/runtime/boot.js +1 -1
  408. package/dist/runtime/connection-budget.d.ts +6 -6
  409. package/dist/runtime/connection-budget.js +1 -1
  410. package/dist/runtime/dbos.d.ts +29 -19
  411. package/dist/runtime/dbos.js +35 -20
  412. package/dist/runtime/result-serialization.js +18 -5
  413. package/dist/runtime/shutdown.d.ts +2 -2
  414. package/dist/sandbox/client.d.ts +7 -3
  415. package/dist/sandbox/cpu-files.d.ts +2 -2
  416. package/dist/sandbox/cpu-files.js +21 -4
  417. package/dist/sandbox/create-sandbox.d.ts +7 -8
  418. package/dist/sandbox/create-sandbox.js +6 -12
  419. package/dist/sandbox/docker-client.d.ts +48 -3
  420. package/dist/sandbox/docker-client.js +10 -6
  421. package/dist/sandbox/estimate-data-profile-resources.js +2 -7
  422. package/dist/sandbox/exec-outcome.d.ts +2 -2
  423. package/dist/sandbox/exec-outcome.js +1 -1
  424. package/dist/sandbox/exec.d.ts +10 -6
  425. package/dist/sandbox/exec.js +27 -12
  426. package/dist/sandbox/execution-id.js +14 -6
  427. package/dist/sandbox/farm.d.ts +2 -2
  428. package/dist/sandbox/farm.js +22 -27
  429. package/dist/sandbox/identity.d.ts +7 -0
  430. package/dist/sandbox/identity.js +14 -3
  431. package/dist/sandbox/image-packages.js +15 -27
  432. package/dist/sandbox/k8s-client.d.ts +35 -8
  433. package/dist/sandbox/k8s-client.js +6 -5
  434. package/dist/sandbox/labels.js +1 -0
  435. package/dist/sandbox/liveness.js +3 -1
  436. package/dist/sandbox/mount-plan.d.ts +10 -10
  437. package/dist/sandbox/mount-plan.js +13 -14
  438. package/dist/sandbox/notification-sweep.d.ts +4 -4
  439. package/dist/sandbox/notification-sweep.js +4 -7
  440. package/dist/sandbox/package-identity.d.ts +6 -13
  441. package/dist/sandbox/package-identity.js +46 -28
  442. package/dist/sandbox/reaper.d.ts +10 -10
  443. package/dist/sandbox/reaper.js +4 -6
  444. package/dist/sandbox/sandbox-error.d.ts +2 -9
  445. package/dist/sandbox/sandbox-error.js +21 -8
  446. package/dist/sandbox/sandbox-step-translate.d.ts +8 -5
  447. package/dist/sandbox/sandbox-step-translate.js +22 -8
  448. package/dist/sandbox/step-sandbox.d.ts +47 -0
  449. package/dist/sandbox/step-sandbox.js +53 -0
  450. package/dist/sandbox/types.d.ts +18 -19
  451. package/dist/sandbox/types.js +1 -1
  452. package/dist/schemas/artifact-manifest.d.ts +4 -4
  453. package/dist/schemas/data-profile-schemas.d.ts +343 -298
  454. package/dist/schemas/file-metadata.js +2 -4
  455. package/dist/schemas/plan-schemas.d.ts +31 -31
  456. package/dist/schemas/run-synthesis.d.ts +95 -26
  457. package/dist/schemas/run-synthesis.js +3 -1
  458. package/dist/schemas/validate-plan.d.ts +4 -4
  459. package/dist/schemas/validate-plan.js +17 -5
  460. package/dist/schemas/workflow-state.d.ts +19 -19
  461. package/dist/schemas/workflow-state.js +2 -2
  462. package/dist/state/active-turns.d.ts +36 -0
  463. package/dist/state/active-turns.js +67 -0
  464. package/dist/state/analyses-metrics.d.ts +8 -8
  465. package/dist/state/analyses-metrics.js +4 -4
  466. package/dist/state/analyses.d.ts +0 -14
  467. package/dist/state/analyses.js +0 -32
  468. package/dist/state/artifacts.d.ts +32 -19
  469. package/dist/state/artifacts.js +28 -5
  470. package/dist/state/data-profile.d.ts +2 -2
  471. package/dist/state/db.d.ts +12 -2
  472. package/dist/state/db.js +5 -0
  473. package/dist/state/edit-intents.d.ts +4 -0
  474. package/dist/state/edit-intents.js +71 -0
  475. package/dist/state/index.d.ts +4 -4
  476. package/dist/state/index.js +2 -2
  477. package/dist/state/init.d.ts +2 -1
  478. package/dist/state/init.js +5 -2
  479. package/dist/state/migrations/20260927120000_baseline.js +3 -1
  480. package/dist/state/migrations/20261026120000_add_the_edit_intents.d.ts +7 -0
  481. package/dist/state/migrations/20261026120000_add_the_edit_intents.js +21 -0
  482. package/dist/state/migrations/20261027120000_record_the_applied_memory_edits.d.ts +7 -0
  483. package/dist/state/migrations/20261027120000_record_the_applied_memory_edits.js +16 -0
  484. package/dist/state/migrations/20261027120100_store_the_authoring_results.d.ts +8 -0
  485. package/dist/state/migrations/20261027120100_store_the_authoring_results.js +20 -0
  486. package/dist/state/migrations/20261027120200_key_the_groups_of_a_turn.d.ts +7 -0
  487. package/dist/state/migrations/20261027120200_key_the_groups_of_a_turn.js +12 -0
  488. package/dist/state/migrations/20261027120300_mark_the_active_turn_of_a_thread.d.ts +7 -0
  489. package/dist/state/migrations/20261027120300_mark_the_active_turn_of_a_thread.js +11 -0
  490. package/dist/state/migrations/20261028120000_record_the_paused_work.d.ts +7 -0
  491. package/dist/state/migrations/20261028120000_record_the_paused_work.js +25 -0
  492. package/dist/state/migrations/20261028120100_end_the_suspended_runs.d.ts +8 -0
  493. package/dist/state/migrations/20261028120100_end_the_suspended_runs.js +13 -0
  494. package/dist/state/migrations/20261029120000_reference_the_run_mandate.d.ts +7 -0
  495. package/dist/state/migrations/20261029120000_reference_the_run_mandate.js +23 -0
  496. package/dist/state/migrations/20261029120100_record_the_run_session_of_a_pause.d.ts +7 -0
  497. package/dist/state/migrations/20261029120100_record_the_run_session_of_a_pause.js +11 -0
  498. package/dist/state/migrations/index.js +18 -0
  499. package/dist/state/paused-work.d.ts +52 -0
  500. package/dist/state/paused-work.js +105 -0
  501. package/dist/state/plans.d.ts +27 -8
  502. package/dist/state/plans.js +14 -11
  503. package/dist/state/purge-analysis.d.ts +6 -6
  504. package/dist/state/purge-analysis.js +10 -2
  505. package/dist/state/report-session-state.d.ts +43 -18
  506. package/dist/state/report-session-state.js +43 -4
  507. package/dist/state/report-versions.d.ts +16 -11
  508. package/dist/state/report-versions.js +5 -3
  509. package/dist/state/runs.d.ts +30 -19
  510. package/dist/state/runs.js +43 -51
  511. package/dist/state/schema.d.ts +18 -21
  512. package/dist/state/schema.js +4 -5
  513. package/dist/state/snapshot-parse.d.ts +2 -2
  514. package/dist/state/snapshot-parse.js +14 -8
  515. package/dist/state/step-executions.d.ts +20 -8
  516. package/dist/state/step-executions.js +6 -4
  517. package/dist/state/tool-outputs.d.ts +2 -2
  518. package/dist/state/tool-outputs.js +2 -1
  519. package/dist/state/vector-store.d.ts +16 -16
  520. package/dist/state/vector-store.js +11 -7
  521. package/dist/tasks/data-profile-absorb.d.ts +3 -3
  522. package/dist/tasks/data-profile-absorb.js +21 -16
  523. package/dist/tasks/data-profile-activity.d.ts +5 -5
  524. package/dist/tasks/data-profile-activity.js +5 -5
  525. package/dist/tasks/data-profile-index.d.ts +4 -4
  526. package/dist/tasks/data-profile-index.js +32 -17
  527. package/dist/tasks/data-profile-resolve.d.ts +8 -8
  528. package/dist/tasks/data-profile-resolve.js +88 -62
  529. package/dist/tasks/data-profile.d.ts +40 -31
  530. package/dist/tasks/data-profile.js +138 -95
  531. package/dist/tasks/extract-values.d.ts +26 -79
  532. package/dist/tasks/extract-values.js +48 -108
  533. package/dist/tasks/refresh-regulatory-corpus.d.ts +4 -20
  534. package/dist/tasks/refresh-regulatory-corpus.js +12 -8
  535. package/dist/tasks/regulatory-corpus-boot-refresh.d.ts +2 -2
  536. package/dist/tasks/regulatory-corpus-boot-refresh.js +12 -10
  537. package/dist/testing.d.ts +60 -0
  538. package/dist/testing.js +96 -0
  539. package/dist/tools/ad-hoc-router.d.ts +9 -9
  540. package/dist/tools/ad-hoc-router.js +65 -52
  541. package/dist/tools/analysis-invocation.d.ts +7 -0
  542. package/dist/tools/analysis-invocation.js +29 -5
  543. package/dist/tools/approval/contract.d.ts +8 -52
  544. package/dist/tools/approval/contract.js +7 -36
  545. package/dist/tools/approval/gateway.d.ts +27 -28
  546. package/dist/tools/approval/gateway.js +33 -130
  547. package/dist/tools/approval/queries.d.ts +6 -11
  548. package/dist/tools/approval/queries.js +43 -29
  549. package/dist/tools/approval/uuidv7.js +2 -2
  550. package/dist/tools/bio/chembl.d.ts +3 -3
  551. package/dist/tools/bio/chembl.js +10 -0
  552. package/dist/tools/bio/comptox.d.ts +25 -8
  553. package/dist/tools/bio/comptox.js +4 -2
  554. package/dist/tools/bio/drug-gene-interactions.d.ts +27 -17
  555. package/dist/tools/bio/drug-gene-interactions.js +11 -8
  556. package/dist/tools/bio/gene-disease-evidence.d.ts +61 -15
  557. package/dist/tools/bio/gene-disease-evidence.js +10 -6
  558. package/dist/tools/bio/gene-preclinical-profile.d.ts +11 -11
  559. package/dist/tools/bio/keys.d.ts +2 -2
  560. package/dist/tools/bio/keys.js +3 -3
  561. package/dist/tools/bio/lookup-annotation.d.ts +5 -5
  562. package/dist/tools/bio/lookup-annotation.js +3 -0
  563. package/dist/tools/bio/opentargets.d.ts +1 -1
  564. package/dist/tools/bio/opentargets.js +6 -0
  565. package/dist/tools/bio/pubchem.d.ts +2 -2
  566. package/dist/tools/bio/pubchem.js +6 -0
  567. package/dist/tools/bio/pubmed.d.ts +26 -16
  568. package/dist/tools/bio/pubmed.js +9 -3
  569. package/dist/tools/bio/search-clinical-trials.d.ts +4 -4
  570. package/dist/tools/bio/search-clinical-trials.js +5 -1
  571. package/dist/tools/bio/search-faers.d.ts +2 -2
  572. package/dist/tools/bio/search-faers.js +1 -1
  573. package/dist/tools/bio/search-gene.d.ts +2 -2
  574. package/dist/tools/bio/search-gene.js +1 -0
  575. package/dist/tools/bio/search-geo-datasets.d.ts +4 -4
  576. package/dist/tools/bio/search-geo-datasets.js +5 -5
  577. package/dist/tools/bio/search-interactions.d.ts +1 -1
  578. package/dist/tools/bio/search-patents.d.ts +28 -22
  579. package/dist/tools/bio/search-patents.js +20 -17
  580. package/dist/tools/bio/search-protein.d.ts +2 -2
  581. package/dist/tools/bio/search-protein.js +1 -1
  582. package/dist/tools/bio/search-regulatory-approvals.d.ts +64 -18
  583. package/dist/tools/bio/search-regulatory-approvals.js +21 -16
  584. package/dist/tools/bio/target-safety.d.ts +8 -8
  585. package/dist/tools/bio/target-safety.js +11 -6
  586. package/dist/tools/capability-data.d.ts +9 -5
  587. package/dist/tools/capability-data.js +2 -1
  588. package/dist/tools/define-tool.d.ts +55 -46
  589. package/dist/tools/define-tool.js +39 -27
  590. package/dist/tools/display/normalize-echart-spec.d.ts +2 -2
  591. package/dist/tools/display/normalize-echart-spec.js +51 -27
  592. package/dist/tools/display/show-user.d.ts +2 -2
  593. package/dist/tools/display/show-user.js +1 -1
  594. package/dist/tools/execute-analysis.d.ts +19 -10
  595. package/dist/tools/execute-analysis.js +83 -62
  596. package/dist/tools/knowledge/check.d.ts +166 -44
  597. package/dist/tools/knowledge/check.js +5 -3
  598. package/dist/tools/knowledge/client.d.ts +31 -62
  599. package/dist/tools/knowledge/client.js +44 -27
  600. package/dist/tools/knowledge/environment.d.ts +6 -6
  601. package/dist/tools/knowledge/environment.js +18 -7
  602. package/dist/tools/knowledge/index.d.ts +2 -2
  603. package/dist/tools/knowledge/index.js +9 -9
  604. package/dist/tools/knowledge/local-slots.d.ts +4 -4
  605. package/dist/tools/knowledge/local-slots.js +11 -4
  606. package/dist/tools/knowledge/pin.d.ts +2 -2
  607. package/dist/tools/knowledge/recommend.d.ts +20 -45
  608. package/dist/tools/knowledge/recommend.js +27 -19
  609. package/dist/tools/knowledge/situation.d.ts +40 -40
  610. package/dist/tools/knowledge/situation.js +2 -9
  611. package/dist/tools/knowledge/skeleton.d.ts +4 -4
  612. package/dist/tools/knowledge/skeleton.js +10 -11
  613. package/dist/tools/knowledge/template.d.ts +20 -18
  614. package/dist/tools/knowledge/template.js +38 -32
  615. package/dist/tools/lib/alphafold-client.js +2 -1
  616. package/dist/tools/lib/amass-client.d.ts +28 -28
  617. package/dist/tools/lib/amass-client.js +20 -10
  618. package/dist/tools/lib/api-utils.d.ts +13 -3
  619. package/dist/tools/lib/api-utils.js +17 -3
  620. package/dist/tools/lib/bgee-client.d.ts +6 -6
  621. package/dist/tools/lib/bgee-client.js +16 -10
  622. package/dist/tools/lib/cbioportal-client.d.ts +4 -4
  623. package/dist/tools/lib/cbioportal-client.js +9 -8
  624. package/dist/tools/lib/chembl-client.d.ts +14 -14
  625. package/dist/tools/lib/chembl-client.js +11 -4
  626. package/dist/tools/lib/clinical-benchmarks-client.d.ts +4 -4
  627. package/dist/tools/lib/clinical-benchmarks-client.js +4 -7
  628. package/dist/tools/lib/clinical-trials-client.d.ts +18 -18
  629. package/dist/tools/lib/clinical-trials-client.js +10 -10
  630. package/dist/tools/lib/clinvar-client.d.ts +2 -2
  631. package/dist/tools/lib/clinvar-client.js +6 -6
  632. package/dist/tools/lib/ctx-ops.d.ts +23 -23
  633. package/dist/tools/lib/ctx-ops.js +13 -10
  634. package/dist/tools/lib/dgidb-client.d.ts +6 -6
  635. package/dist/tools/lib/dgidb-client.js +10 -12
  636. package/dist/tools/lib/disgenet-client.d.ts +4 -4
  637. package/dist/tools/lib/ema-client.d.ts +2 -2
  638. package/dist/tools/lib/ensembl-client.d.ts +4 -4
  639. package/dist/tools/lib/ensembl-client.js +5 -4
  640. package/dist/tools/lib/gwas-catalog-client.d.ts +4 -4
  641. package/dist/tools/lib/gwas-catalog-client.js +17 -17
  642. package/dist/tools/lib/html-text.d.ts +6 -0
  643. package/dist/tools/lib/html-text.js +9 -0
  644. package/dist/tools/lib/identifier-resolver.d.ts +4 -4
  645. package/dist/tools/lib/identifier-resolver.js +7 -3
  646. package/dist/tools/lib/impc-client.d.ts +8 -8
  647. package/dist/tools/lib/impc-client.js +46 -35
  648. package/dist/tools/lib/iuphar-client.d.ts +2 -2
  649. package/dist/tools/lib/iuphar-client.js +7 -16
  650. package/dist/tools/lib/monarch-client.d.ts +4 -4
  651. package/dist/tools/lib/openfda-client.d.ts +22 -22
  652. package/dist/tools/lib/openfda-client.js +23 -22
  653. package/dist/tools/lib/opentargets-client.d.ts +12 -12
  654. package/dist/tools/lib/pathway-client.d.ts +4 -4
  655. package/dist/tools/lib/pathway-client.js +15 -19
  656. package/dist/tools/lib/pharmgkb-client.d.ts +2 -2
  657. package/dist/tools/lib/pharmgkb-client.js +1 -1
  658. package/dist/tools/lib/protein-family-modality.d.ts +2 -2
  659. package/dist/tools/lib/protein-family-modality.js +0 -2
  660. package/dist/tools/lib/protein-family-normalize.js +7 -0
  661. package/dist/tools/lib/pubchem-client.d.ts +2 -2
  662. package/dist/tools/lib/pubchem-client.js +1 -0
  663. package/dist/tools/lib/pubchem-ops.d.ts +4 -4
  664. package/dist/tools/lib/pubchem-ops.js +8 -0
  665. package/dist/tools/lib/pubmed-client.d.ts +9 -9
  666. package/dist/tools/lib/pubmed-client.js +1 -1
  667. package/dist/tools/lib/string-client.d.ts +6 -6
  668. package/dist/tools/lib/uniprot-client.d.ts +8 -8
  669. package/dist/tools/lib/uniprot-client.js +5 -1
  670. package/dist/tools/memory/update-working-memory.d.ts +16 -13
  671. package/dist/tools/memory/update-working-memory.js +21 -3
  672. package/dist/tools/read-tool-output.js +8 -2
  673. package/dist/tools/registry.d.ts +2 -2
  674. package/dist/tools/report-authoring/authoring-tools.d.ts +54 -23
  675. package/dist/tools/report-authoring/authoring-tools.js +128 -62
  676. package/dist/tools/report-session/derive-table.d.ts +19 -59
  677. package/dist/tools/report-session/derive-table.js +120 -122
  678. package/dist/tools/report-session/examine-page.d.ts +6 -6
  679. package/dist/tools/report-session/examine-page.js +14 -12
  680. package/dist/tools/report-session/list-artifacts.d.ts +6 -6
  681. package/dist/tools/report-session/list-artifacts.js +5 -5
  682. package/dist/tools/report-session/page-faults.d.ts +6 -6
  683. package/dist/tools/report-session/page-faults.js +3 -1
  684. package/dist/tools/report-session/preview-report.d.ts +4 -3
  685. package/dist/tools/report-session/preview-report.js +26 -7
  686. package/dist/tools/report-session/record-version.d.ts +9 -4
  687. package/dist/tools/report-session/record-version.js +16 -9
  688. package/dist/tools/report-session/session-page-publisher.d.ts +6 -6
  689. package/dist/tools/research/generate-analogy-report.d.ts +14 -7
  690. package/dist/tools/research/generate-analogy-report.js +80 -76
  691. package/dist/tools/research/generate-plan.d.ts +16 -16
  692. package/dist/tools/research/generate-plan.js +410 -374
  693. package/dist/tools/research/guarded-address.js +3 -2
  694. package/dist/tools/research/inspect-data-profile.d.ts +27 -20
  695. package/dist/tools/research/inspect-data-profile.js +26 -25
  696. package/dist/tools/research/inspect-run.d.ts +54 -27
  697. package/dist/tools/research/inspect-run.js +50 -40
  698. package/dist/tools/research/literature-reviewer.d.ts +8 -7
  699. package/dist/tools/research/literature-reviewer.js +29 -28
  700. package/dist/tools/research/search-arxiv.d.ts +1 -1
  701. package/dist/tools/research/search-arxiv.js +1 -1
  702. package/dist/tools/research/search-github-repos.d.ts +10 -7
  703. package/dist/tools/research/search-github-repos.js +25 -22
  704. package/dist/tools/research/search-semantic-scholar.js +1 -1
  705. package/dist/tools/research/searxng-engine.d.ts +2 -2
  706. package/dist/tools/research/searxng-engine.js +6 -4
  707. package/dist/tools/research/web-fetch.d.ts +24 -21
  708. package/dist/tools/research/web-fetch.js +65 -74
  709. package/dist/tools/research/web-search.d.ts +26 -17
  710. package/dist/tools/research/web-search.js +26 -21
  711. package/dist/tools/sandbox/link-packages.d.ts +11 -7
  712. package/dist/tools/sandbox/link-packages.js +11 -8
  713. package/dist/tools/sandbox/list-available-packages.d.ts +17 -8
  714. package/dist/tools/sandbox/list-available-packages.js +31 -25
  715. package/dist/tools/sandbox/list-available-refs.d.ts +17 -14
  716. package/dist/tools/sandbox/list-available-refs.js +61 -36
  717. package/dist/tools/sandbox/report-blocker.d.ts +30 -37
  718. package/dist/tools/sandbox/report-blocker.js +23 -73
  719. package/dist/tools/sandbox/skills.d.ts +16 -12
  720. package/dist/tools/sandbox/skills.js +16 -12
  721. package/dist/tools/sandbox/submit-file-metadata.d.ts +12 -9
  722. package/dist/tools/sandbox/submit-file-metadata.js +18 -21
  723. package/dist/tools/start-report-session.d.ts +13 -5
  724. package/dist/tools/start-report-session.js +35 -8
  725. package/dist/tools/terminal-text.d.ts +5 -2
  726. package/dist/tools/terminal-text.js +35 -3
  727. package/dist/tools/workspace/decision-record.d.ts +4 -4
  728. package/dist/tools/workspace/decision-record.js +23 -13
  729. package/dist/tools/workspace/edit-file.d.ts +59 -20
  730. package/dist/tools/workspace/edit-file.js +81 -16
  731. package/dist/tools/workspace/execute-command.d.ts +15 -13
  732. package/dist/tools/workspace/execute-command.js +11 -9
  733. package/dist/tools/workspace/file-stat.d.ts +6 -3
  734. package/dist/tools/workspace/grep.d.ts +10 -7
  735. package/dist/tools/workspace/grep.js +9 -3
  736. package/dist/tools/workspace/list-files.d.ts +6 -3
  737. package/dist/tools/workspace/mutator.d.ts +28 -15
  738. package/dist/tools/workspace/mutator.js +107 -53
  739. package/dist/tools/workspace/read-file.d.ts +8 -5
  740. package/dist/tools/workspace/result-bounds.d.ts +5 -5
  741. package/dist/tools/workspace/result-bounds.js +4 -2
  742. package/dist/tools/workspace/run-exec.d.ts +2 -2
  743. package/dist/tools/workspace/run-exec.js +3 -3
  744. package/dist/tools/workspace/scan-inputs.d.ts +8 -5
  745. package/dist/tools/workspace/scan-inputs.js +17 -5
  746. package/dist/tools/workspace/show-file.d.ts +1 -1
  747. package/dist/tools/workspace/show-file.js +2 -1
  748. package/dist/tools/workspace/show-plan.d.ts +8 -5
  749. package/dist/tools/workspace/show-plan.js +9 -8
  750. package/dist/tools/workspace/workspace-search.d.ts +41 -13
  751. package/dist/tools/workspace/workspace-search.js +27 -14
  752. package/dist/tools/workspace/write-file.d.ts +9 -7
  753. package/dist/workflows/execute-analysis-scheduler.d.ts +9 -9
  754. package/dist/workflows/execute-analysis-scheduler.js +6 -3
  755. package/dist/workflows/execute-analysis.d.ts +46 -62
  756. package/dist/workflows/execute-analysis.js +137 -219
  757. package/dist/workflows/pause.d.ts +71 -0
  758. package/dist/workflows/pause.js +173 -0
  759. package/dist/workflows/sandbox-step.d.ts +38 -61
  760. package/dist/workflows/sandbox-step.js +99 -106
  761. package/dist/workflows/test/sql-writes.d.ts +21 -0
  762. package/dist/workflows/test/sql-writes.js +36 -0
  763. package/dist/workspace/filesystem.d.ts +6 -6
  764. package/dist/workspace/filesystem.js +10 -8
  765. package/dist/workspace/paths.d.ts +1 -1
  766. package/dist/workspace/paths.js +15 -4
  767. package/dist/workspace/search-config.d.ts +2 -2
  768. package/dist/workspace/search-config.js +1 -1
  769. package/package.json +21 -22
  770. package/dist/loop/call-guard.d.ts +0 -50
  771. package/dist/loop/call-guard.js +0 -90
  772. package/dist/loop/continue-agent.d.ts +0 -40
  773. package/dist/loop/continue-agent.js +0 -38
  774. package/dist/loop/genai-spans.d.ts +0 -47
  775. package/dist/loop/genai-spans.js +0 -134
  776. package/dist/loop/run-agent.d.ts +0 -245
  777. package/dist/loop/run-agent.js +0 -1124
  778. package/dist/loop/run-step.d.ts +0 -29
  779. package/dist/loop/run-step.js +0 -34
  780. package/dist/loop/run-to-terminal.d.ts +0 -66
  781. package/dist/loop/run-to-terminal.js +0 -93
  782. package/dist/loop/tool-mask.d.ts +0 -23
  783. package/dist/loop/tool-mask.js +0 -46
  784. package/dist/providers/streaming-chat.d.ts +0 -32
  785. package/dist/providers/streaming-chat.js +0 -91
  786. package/dist/tasks/derive-table-exec.d.ts +0 -54
  787. package/dist/tasks/derive-table-exec.js +0 -86
  788. package/dist/workflows/suspension.d.ts +0 -32
  789. package/dist/workflows/suspension.js +0 -38
@@ -20,6 +20,9 @@
20
20
  * hashes — a thousand rows of sha256 would bury the signal.
21
21
  */
22
22
  import { ok } from "neverthrow";
23
+ import { presentGet } from "../../lib/present.js";
24
+ import { errorMessageOf } from "../../lib/thrown.js";
25
+ import { textOf } from "../../lib/unknown-text.js";
23
26
  import { z } from "zod";
24
27
  import { defineTool } from "../define-tool.js";
25
28
  import { identityAddress, identityKey, identityOf, parseQuery, resolveQuery, } from "../../sandbox/package-identity.js";
@@ -99,7 +102,7 @@ export function lockSections(lock) {
99
102
  .filter(([, packages]) => packages.length > 0)
100
103
  .map(([subtree, packages]) => {
101
104
  const track = trackOfLockSubtree(subtree);
102
- return { title: TRACK_TITLES[subtree] ?? subtree, packages, ...(track === undefined ? {} : { track }) };
105
+ return { title: TRACK_TITLES[subtree] ?? subtree, packages, track };
103
106
  });
104
107
  }
105
108
  /**
@@ -160,7 +163,7 @@ function foldSections(sections) {
160
163
  open.packages.push(pkg);
161
164
  }
162
165
  }
163
- return [...byTitle.values()].map(({ title, track, packages }) => ({ title, packages, ...(track === undefined ? {} : { track }) }));
166
+ return [...byTitle.values()].map(({ title, track, packages }) => ({ title, packages, track }));
164
167
  }
165
168
  /**
166
169
  * Default cap on a listing — high enough that the real store is never truncated.
@@ -196,7 +199,9 @@ const POOL_UNAVAILABLE_NOTE = "Package list not available — the package pool c
196
199
  */
197
200
  const LANGUAGE_MATCHERS = {
198
201
  // `CLI_TITLE` — the conda-installed bioinformatics executables.
202
+ // oxlint-disable-next-line eslint-js/no-restricted-syntax -- the section heading names the executables section or the standalone word CLI, matched in display text.
199
203
  cli: (t) => /system tools|\bcli\b/i.test(t),
204
+ // oxlint-disable-next-line eslint-js/no-restricted-syntax -- the heading opens with the word node, the display form of the section name.
200
205
  node: (t) => /^node\b/i.test(t),
201
206
  };
202
207
  /** Whether one section answers the `language` filter of a call. */
@@ -205,7 +210,7 @@ function matchesLanguage(section, language) {
205
210
  return true;
206
211
  if (language === "r" || language === "python")
207
212
  return section.track === language;
208
- return LANGUAGE_MATCHERS[language](section.title);
213
+ return presentGet(LANGUAGE_MATCHERS, language, `the heading matcher for ${language}`)(section.title);
209
214
  }
210
215
  /**
211
216
  * The identity names that the Python track and the R track both hold.
@@ -295,9 +300,9 @@ function presentEntry(requested, row) {
295
300
  present: true,
296
301
  name: row.entry.name,
297
302
  section: row.section,
298
- ...(row.entry.version === undefined ? {} : { version: row.entry.version }),
299
- ...(row.entry.storeDir === undefined ? {} : { storeDir: row.entry.storeDir }),
300
- ...(row.entry.hash === undefined ? {} : { hash: row.entry.hash }),
303
+ version: row.entry.version,
304
+ storeDir: row.entry.storeDir,
305
+ hash: row.entry.hash,
301
306
  };
302
307
  }
303
308
  /**
@@ -365,7 +370,7 @@ export function queryPackages(rawSections, { names, query, language, limit }) {
365
370
  if (hits.length > 0)
366
371
  return hits;
367
372
  const suggestion = resolution.kind === "unknown" ? resolution.suggestion : undefined;
368
- return [{ requested, present: false, ...(suggestion === undefined ? {} : { suggestion: suggestion.name }) }];
373
+ return [{ requested, present: false, suggestion: suggestion?.name }];
369
374
  });
370
375
  return { available: true, checked };
371
376
  }
@@ -379,7 +384,7 @@ export function queryPackages(rawSections, { names, query, language, limit }) {
379
384
  .map((s) => ({
380
385
  title: s.title,
381
386
  packages: needle ? s.packages.filter((p) => p.name.toLowerCase().includes(needle)) : s.packages,
382
- ...(s.track === undefined ? {} : { track: s.track }),
387
+ track: s.track,
383
388
  }))
384
389
  .filter((s) => s.packages.length > 0);
385
390
  const total = filtered.reduce((n, s) => n + s.packages.length, 0);
@@ -422,7 +427,7 @@ export async function readInventorySections(deps, analysisId) {
422
427
  if (deps.readPoolInventory) {
423
428
  const pool = await deps.readPoolInventory().catch((cause) => ({
424
429
  kind: "unavailable",
425
- reason: cause instanceof Error ? cause.message : String(cause),
430
+ reason: errorMessageOf(cause) ?? textOf(cause),
426
431
  }));
427
432
  if (pool.kind === "unavailable")
428
433
  return { kind: "unavailable", reason: pool.reason };
@@ -449,6 +454,22 @@ export async function readInventorySections(deps, analysisId) {
449
454
  * host-readable farm `inflexa.lock` otherwise (a sandbox agent). The image
450
455
  * record merges into either report.
451
456
  */
457
+ const ListAvailablePackagesInputSchema = z.object({
458
+ names: z
459
+ .array(z.string())
460
+ .max(100)
461
+ .optional()
462
+ .describe("Check these packages for presence. Each entry is a query in the one grammar, `[python:|r:]<name>`. Returns one entry for each track that holds the name: present/absent + the language track it lives in. An absent name carries the spelling the pool holds, where there is one."),
463
+ query: z.string().optional().describe("Case-insensitive substring filter over package names."),
464
+ language: z.enum(["r", "python", "cli", "node"]).optional().describe("Restrict results to one language track."),
465
+ limit: z
466
+ .number()
467
+ .int()
468
+ .min(1)
469
+ .max(DEFAULT_LIMIT)
470
+ .optional()
471
+ .describe(`Cap the packages listed. Omit to get the whole set — the store fits well within the ${DEFAULT_LIMIT} ceiling. Ignored when \`names\` is given.`),
472
+ });
452
473
  export function createListAvailablePackagesTool(deps = {}) {
453
474
  const readPoolInventory = deps.readPoolInventory;
454
475
  // The scope decides the framing sentence: a sandbox agent reads what it can
@@ -473,22 +494,7 @@ export function createListAvailablePackagesTool(deps = {}) {
473
494
  "`language`: restrict to one track (r | python | cli | node). " +
474
495
  "`limit`: cap the packages listed; the response always carries the true `total` and a `hasMore` flag, so truncation is never silent. " +
475
496
  "Each entry renders as `name==version` where the source pins a version, and a `names` check also reports the store directory and the content hash where the source records them.",
476
- inputSchema: z.object({
477
- names: z
478
- .array(z.string())
479
- .max(100)
480
- .optional()
481
- .describe("Check these packages for presence. Each entry is a query in the one grammar, `[python:|r:]<name>`. Returns one entry for each track that holds the name: present/absent + the language track it lives in. An absent name carries the spelling the pool holds, where there is one."),
482
- query: z.string().optional().describe("Case-insensitive substring filter over package names."),
483
- language: z.enum(["r", "python", "cli", "node"]).optional().describe("Restrict results to one language track."),
484
- limit: z
485
- .number()
486
- .int()
487
- .min(1)
488
- .max(DEFAULT_LIMIT)
489
- .optional()
490
- .describe(`Cap the packages listed. Omit to get the whole set — the store fits well within the ${DEFAULT_LIMIT} ceiling. Ignored when \`names\` is given.`),
491
- }),
497
+ inputSchema: ListAvailablePackagesInputSchema,
492
498
  // `queryPackages` returns on `names` before it reads another field, thus
493
499
  // the presence check comes first. An empty array is not a presence check.
494
500
  // `names` are exact identifiers a caller checks for, thus they name the
@@ -27,9 +27,17 @@
27
27
  * only ever ENRICHES an entry — a file with no receipt and no catalog match is
28
28
  * still returned, because a user-provided store is as valid as a managed one.
29
29
  */
30
+ import { z } from "zod";
30
31
  import type { EnvironmentStorePaths } from "../../config/environment-stores.js";
32
+ import { type Tool } from "../define-tool.js";
33
+ declare const ListAvailableRefsInputSchema: z.ZodObject<{
34
+ path: z.ZodOptional<z.ZodString>;
35
+ category: z.ZodOptional<z.ZodString>;
36
+ query: z.ZodOptional<z.ZodString>;
37
+ limit: z.ZodOptional<z.ZodNumber>;
38
+ }, z.core.$strip>;
31
39
  export type ListAvailableRefsDeps = Pick<EnvironmentStorePaths, "refStorePath">;
32
- export interface ReferenceInventoryMetadata {
40
+ export type ReferenceInventoryMetadata = {
33
41
  readonly datasetId?: string;
34
42
  readonly version?: string;
35
43
  readonly title?: string;
@@ -45,11 +53,11 @@ export interface ReferenceInventoryMetadata {
45
53
  readonly contents?: string;
46
54
  readonly rows?: number;
47
55
  readonly endpoint?: string;
48
- }
49
- interface ReferenceInventoryEntryBase {
56
+ };
57
+ type ReferenceInventoryEntryBase = {
50
58
  readonly path: string;
51
59
  readonly metadata?: ReferenceInventoryMetadata;
52
- }
60
+ };
53
61
  /** A bounded, no-follow observation of the reference store. */
54
62
  export type ReferenceInventoryEntry = (ReferenceInventoryEntryBase & {
55
63
  readonly kind: "file";
@@ -69,7 +77,7 @@ export type ReferenceInventoryEntry = (ReferenceInventoryEntryBase & {
69
77
  * is explicit: `returned`/`total`/`hasMore` describe how much of the match set
70
78
  * this response carries, and `categories` is the drill-in index.
71
79
  */
72
- export interface ReferenceInventoryResult {
80
+ export type ReferenceInventoryResult = {
73
81
  readonly available: boolean;
74
82
  readonly state: RawScan["state"] | "out_of_scope";
75
83
  readonly path: string;
@@ -81,15 +89,15 @@ export interface ReferenceInventoryResult {
81
89
  readonly hasMore: boolean;
82
90
  readonly categories: readonly string[];
83
91
  readonly content: string;
84
- }
85
- interface RawScan {
92
+ };
93
+ type RawScan = {
86
94
  readonly state: "unavailable" | "empty" | "populated" | "not_found" | "not_a_directory" | "symlink";
87
95
  readonly entries: ReferenceInventoryEntry[];
88
96
  readonly scannedEntries: number;
89
97
  readonly truncated: boolean;
90
98
  readonly receipts?: unknown[];
91
99
  readonly legacyEntries?: unknown[];
92
- }
100
+ };
93
101
  /**
94
102
  * The dataset ids the install receipts of the store report, for a caller that must know whether a
95
103
  * declared dataset is present BEFORE a run starts.
@@ -112,10 +120,5 @@ export declare function readReferenceInventory(storeRoot: string): Promise<{
112
120
  readonly available: boolean;
113
121
  readonly entries: readonly ReferenceInventoryEntry[];
114
122
  }>;
115
- export declare function createListAvailableRefsTool(deps: ListAvailableRefsDeps): import("../define-tool.js").Tool<{
116
- path?: string | undefined;
117
- category?: string | undefined;
118
- query?: string | undefined;
119
- limit?: number | undefined;
120
- }, ReferenceInventoryResult>;
123
+ export declare function createListAvailableRefsTool(deps: ListAvailableRefsDeps): Tool<z.infer<typeof ListAvailableRefsInputSchema>, ReferenceInventoryResult>;
121
124
  export {};
@@ -32,6 +32,10 @@ import { join as hostJoin, posix as posixPath } from "node:path";
32
32
  import { ok } from "neverthrow";
33
33
  import { z } from "zod";
34
34
  import { capCodePoints, DETAIL_MAX_LENGTH, DETAIL_NEEDLE_MAX_LENGTH } from "../../loop/tool-detail.js";
35
+ import { errnoOf } from "../../lib/fs-result.js";
36
+ import { parseJsonAs } from "../../lib/parse-json.js";
37
+ import { isUnknownArray } from "../../lib/unknown-array.js";
38
+ import { parseUnknownRecord } from "../../lib/unknown-containers.js";
35
39
  import { REFERENCE_DATA_CATALOG } from "../../reference-data/catalog.js";
36
40
  import { parseReferenceInstallReceipt } from "../../reference-data/receipt.js";
37
41
  import { REFS_CONTAINER_PATH } from "../../sandbox/mount-plan.js";
@@ -158,6 +162,8 @@ async function summarizeDirectory(directory, scanned) {
158
162
  const stack = [directory];
159
163
  while (stack.length > 0 && scanned < MAX_SCANNED_ENTRIES) {
160
164
  const current = stack.pop();
165
+ if (current === undefined)
166
+ break;
161
167
  const { values, cut } = await cappedEntries(current, MAX_SCANNED_ENTRIES - scanned);
162
168
  truncated = truncated || cut;
163
169
  const childDirectories = [];
@@ -196,7 +202,7 @@ async function readReceipts(root) {
196
202
  // A shared try would abandon the loop and silently drop every receipt sorting
197
203
  // after the bad one, quietly stripping metadata from datasets that are fine.
198
204
  try {
199
- receipts.push(JSON.parse(await readFile(hostJoin(receiptsDirectory, entry.name), "utf-8")));
205
+ receipts.push(parseJsonAs(await readFile(hostJoin(receiptsDirectory, entry.name), "utf-8"), z.json()));
200
206
  totalBytes += entry.bytes;
201
207
  }
202
208
  catch {
@@ -234,7 +240,7 @@ export async function readInstalledDatasetIds(deps) {
234
240
  catch (error) {
235
241
  // An absent directory is a readable store with nothing installed. Any other failure is the
236
242
  // store declining to answer, which is a different fact and gets the honest `undefined`.
237
- if (error.code === "ENOENT")
243
+ if (errnoOf(error) === "ENOENT")
238
244
  return new Set();
239
245
  return undefined;
240
246
  }
@@ -243,7 +249,7 @@ export async function readInstalledDatasetIds(deps) {
243
249
  // Per-file, so one malformed receipt costs only its own dataset. A shared try would drop
244
250
  // every receipt after the bad one and read as a store that holds almost nothing.
245
251
  try {
246
- const receipt = parseReferenceInstallReceipt(JSON.parse(await readFile(hostJoin(receiptsDirectory, name), "utf-8")));
252
+ const receipt = parseReferenceInstallReceipt(parseJsonAs(await readFile(hostJoin(receiptsDirectory, name), "utf-8"), z.json()));
247
253
  if (receipt)
248
254
  ids.add(receipt.datasetId);
249
255
  }
@@ -262,21 +268,24 @@ async function readLegacyEntries(root) {
262
268
  const registryPath = hostJoin(root, "registry.json");
263
269
  if ((await lstat(registryPath)).size > MAX_REGISTRY_BYTES)
264
270
  return [];
265
- const registry = JSON.parse(await readFile(registryPath, "utf-8"));
266
- if (!registry || typeof registry !== "object")
271
+ const registry = parseJsonAs(await readFile(registryPath, "utf-8"), z.json());
272
+ const registryRecord = parseUnknownRecord(registry);
273
+ if (!registryRecord)
267
274
  return [];
268
- const byCategory = registry.files?.by_category;
269
- if (!byCategory || typeof byCategory !== "object")
275
+ const files = parseUnknownRecord(registryRecord.files);
276
+ const categories = parseUnknownRecord(files?.by_category);
277
+ if (!categories)
270
278
  return [];
271
- for (const category of Object.keys(byCategory).sort()) {
272
- const values = byCategory[category];
273
- if (!Array.isArray(values))
279
+ for (const category of Object.keys(categories).sort()) {
280
+ const values = categories[category];
281
+ if (!isUnknownArray(values))
274
282
  continue;
275
283
  for (const item of values) {
276
284
  if (legacyEntries.length >= MAX_LEGACY_ENTRIES)
277
285
  break;
278
- if (item && typeof item === "object" && typeof item.local_path === "string") {
279
- legacyEntries.push({ ...item, category });
286
+ const itemRecord = parseUnknownRecord(item);
287
+ if (itemRecord && typeof itemRecord.local_path === "string") {
288
+ legacyEntries.push({ ...itemRecord, category });
280
289
  }
281
290
  }
282
291
  }
@@ -301,6 +310,8 @@ async function collectFiles(directory, relative, budget) {
301
310
  const stack = [{ path: directory, relative }];
302
311
  while (stack.length > 0 && budget.scanned < MAX_SCANNED_ENTRIES) {
303
312
  const current = stack.pop();
313
+ if (current === undefined)
314
+ break;
304
315
  const { values, cut } = await cappedEntries(current.path, MAX_SCANNED_ENTRIES - budget.scanned);
305
316
  truncated = truncated || cut;
306
317
  for (const child of values) {
@@ -439,41 +450,55 @@ function enrichEntries(entries, raw) {
439
450
  // Per-artifact, not per-dataset: format and contents differ between files of the
440
451
  // same dataset (a Seurat object and its Annoy index are read nothing alike).
441
452
  const catalogArtifact = dataset?.artifacts.find((candidate) => candidate.path === artifact.path);
442
- metadata.set(`${REFS_ROOT}/managed/${receipt.datasetId}/${receipt.datasetVersion}/${artifact.path}`, {
453
+ const managedMetadata = {
443
454
  datasetId: receipt.datasetId,
444
455
  version: receipt.datasetVersion,
445
- ...(dataset
446
- ? {
447
- title: dataset.title,
448
- description: dataset.description,
449
- sourceUrl: dataset.sourceUrl,
450
- license: dataset.license.url ?? dataset.license.identifier,
451
- category: dataset.recommendation.group,
452
- ...(dataset.organism ? { organism: dataset.organism } : {}),
453
- }
454
- : {}),
455
- ...(catalogArtifact ? { format: catalogArtifact.format, contents: catalogArtifact.contents } : {}),
456
- });
456
+ };
457
+ if (dataset) {
458
+ managedMetadata.title = dataset.title;
459
+ managedMetadata.description = dataset.description;
460
+ managedMetadata.sourceUrl = dataset.sourceUrl;
461
+ managedMetadata.license = dataset.license.url ?? dataset.license.identifier;
462
+ managedMetadata.category = dataset.recommendation.group;
463
+ if (dataset.organism)
464
+ managedMetadata.organism = dataset.organism;
465
+ }
466
+ if (catalogArtifact) {
467
+ managedMetadata.format = catalogArtifact.format;
468
+ managedMetadata.contents = catalogArtifact.contents;
469
+ }
470
+ metadata.set(`${REFS_ROOT}/managed/${receipt.datasetId}/${receipt.datasetVersion}/${artifact.path}`, managedMetadata);
457
471
  }
458
472
  }
459
473
  for (const value of raw.legacyEntries ?? []) {
460
- if (!value || typeof value !== "object")
474
+ const item = parseUnknownRecord(value);
475
+ if (!item)
461
476
  continue;
462
- const item = value;
463
477
  const localPath = stringValue(item.local_path);
464
478
  if (!localPath)
465
479
  continue;
466
480
  const resolved = resolveRequestedPath(localPath);
467
481
  if (!resolved.ok)
468
482
  continue;
469
- const legacyMetadata = {
470
- ...(stringValue(item.dataset) ? { datasetId: stringValue(item.dataset) } : {}),
471
- ...(stringValue(item.category) ? { category: stringValue(item.category) } : {}),
472
- ...(stringValue(item.subtype) ? { subtype: stringValue(item.subtype) } : {}),
473
- ...(stringValue(item.organism) ? { organism: stringValue(item.organism) } : {}),
474
- ...(numberValue(item.rows) !== undefined ? { rows: numberValue(item.rows) } : {}),
475
- ...(stringValue(item.endpoint) ? { endpoint: stringValue(item.endpoint) } : {}),
476
- };
483
+ const datasetId = stringValue(item.dataset);
484
+ const category = stringValue(item.category);
485
+ const subtype = stringValue(item.subtype);
486
+ const organism = stringValue(item.organism);
487
+ const rows = numberValue(item.rows);
488
+ const endpoint = stringValue(item.endpoint);
489
+ const legacyMetadata = {};
490
+ if (datasetId)
491
+ legacyMetadata.datasetId = datasetId;
492
+ if (category)
493
+ legacyMetadata.category = category;
494
+ if (subtype)
495
+ legacyMetadata.subtype = subtype;
496
+ if (organism)
497
+ legacyMetadata.organism = organism;
498
+ if (rows !== undefined)
499
+ legacyMetadata.rows = rows;
500
+ if (endpoint)
501
+ legacyMetadata.endpoint = endpoint;
477
502
  metadata.set(resolved.path, { ...legacyMetadata, ...metadata.get(resolved.path) });
478
503
  }
479
504
  return entries.map((entry) => {
@@ -608,7 +633,7 @@ export function createListAvailableRefsTool(deps) {
608
633
  // The budget comes off the rendered filter, never off a count of its
609
634
  // parts, thus it cannot drift from the template above. One code point
610
635
  // pays for the joining space.
611
- return `${capCodePoints(named, DETAIL_MAX_LENGTH - [...filter].length - 1)} ${filter}`;
636
+ return `${capCodePoints(named, DETAIL_MAX_LENGTH - Array.from(filter).length - 1)} ${filter}`;
612
637
  },
613
638
  execute: async ({ path, category, query, limit }) => {
614
639
  // `category` is shorthand for a top-level path; an explicit `path` wins.
@@ -10,57 +10,50 @@
10
10
  * sandbox step agent, the planner (`tools/research/generate-plan.ts`), the
11
11
  * run synthesizer (`execution/run-synthesis.ts`) and the analogical reasoner
12
12
  * (`tools/research/generate-analogy-report.ts`) — and all four share one id,
13
- * one input schema and one terminal contract via `createReportBlockerToolFor`.
14
- * What differs per loop is only what a blocker *means* there, so each call site
15
- * injects its own `blockedWhen` prose and its own capture closure. The tool
16
- * records the reason and tells the agent to stop; the driving body reads the
17
- * outcome after the loop and decides the terminal status. The sandbox step body
18
- * runs in durable steps, so it reads the blocker back from the transcript
19
- * (`recordedBlocker`) on replay, not only from its cell.
13
+ * one input schema and one result via `createReportBlockerToolFor`. What
14
+ * differs per loop is only what a blocker *means* there, so each call site
15
+ * injects its own `blockedWhen` prose. The result of the call carries the
16
+ * reason, and the driving body selects the blocker from the recorded calls of
17
+ * the run (`blockerOf`). Thus a replay selects the same blocker.
20
18
  */
21
- import type { ModelMessage } from "ai";
19
+ import { z } from "zod";
20
+ import type { LoopStep } from "../../loop/run-loop.js";
22
21
  import { type Tool } from "../define-tool.js";
23
22
  export declare const REPORT_BLOCKER_TOOL_ID = "report_blocker";
24
- export interface BlockerOutcome {
23
+ export type BlockerOutcome = {
25
24
  readonly kind: "blocker";
26
25
  readonly reason: string;
27
- }
28
- /** Per-run mutable cell the sandbox-step body reads after the loop. */
29
- export interface BlockerHolder {
30
- outcome: BlockerOutcome | null;
31
- }
32
- export declare function createBlockerHolder(): BlockerHolder;
33
- export interface ReportBlockerDeps {
34
- /**
35
- * The calling loop's blocker-capture side effect — writes the outcome into
36
- * whatever cell that body reads after its loop. Invoked on every call; the
37
- * closure owns the first-call-wins guard, because only the call site knows
38
- * what else may already have terminated its loop.
39
- */
40
- readonly record: (outcome: BlockerOutcome) => void;
26
+ };
27
+ /** The one input every `report_blocker` takes, wherever it is offered. */
28
+ declare const ReportBlockerInputSchema: z.ZodObject<{
29
+ reason: z.ZodString;
30
+ }, z.core.$strip>;
31
+ /** The result of a call: the blocker that the call recorded. */
32
+ declare const BlockerResultSchema: z.ZodObject<{
33
+ kind: z.ZodLiteral<"blocker">;
34
+ reason: z.ZodString;
35
+ message: z.ZodString;
36
+ }, z.core.$strip>;
37
+ type BlockerResult = z.infer<typeof BlockerResultSchema>;
38
+ export type ReportBlockerDeps = {
41
39
  /**
42
40
  * What a blocker means in THIS loop: which loop the call ends and the
43
41
  * conditions that warrant it. Composed into the shared terminal contract,
44
42
  * so a description can never promise a loop this instance does not end.
45
43
  */
46
44
  readonly blockedWhen: string;
47
- }
45
+ };
48
46
  /**
49
47
  * Build the `report_blocker` tool for one loop. The id, the input schema and
50
48
  * the terminal contract ("pass a reason, then stop") are fixed here; the call
51
- * site supplies only the per-loop meaning and the capture closure.
52
- */
53
- export declare function createReportBlockerToolFor(deps: ReportBlockerDeps): Tool;
54
- /**
55
- * The blocker that a run recorded, read from its transcript: the reason of the
56
- * first `report_blocker` call, in call order, whose result is ok.
57
- *
58
- * A replay returns each tool step's cached result without re-running
59
- * `execute`, so the in-memory cell is empty on replay; the transcript is not.
49
+ * site supplies only the per-loop meaning.
60
50
  */
61
- export declare function recordedBlocker(messages: readonly ModelMessage[]): BlockerOutcome | null;
51
+ export declare function createReportBlockerToolFor(deps: ReportBlockerDeps): Tool<z.infer<typeof ReportBlockerInputSchema>, BlockerResult>;
52
+ /** The blocker that a run recorded: the reason of the first `report_blocker` call, in call order, whose result is ok. */
53
+ export declare function blockerOf(steps: readonly LoopStep[]): BlockerOutcome | null;
62
54
  /**
63
- * The sandbox step agent's `report_blocker`, bound to the step body's holder.
64
- * A blocker here ends the step with no deliverables and a blocked reason.
55
+ * The sandbox step agent's `report_blocker`. A blocker here ends the step with
56
+ * no deliverables and a blocked reason.
65
57
  */
66
- export declare function createReportBlockerTool(holder: BlockerHolder): Tool;
58
+ export declare function createReportBlockerTool(): Tool;
59
+ export {};
@@ -10,35 +10,27 @@
10
10
  * sandbox step agent, the planner (`tools/research/generate-plan.ts`), the
11
11
  * run synthesizer (`execution/run-synthesis.ts`) and the analogical reasoner
12
12
  * (`tools/research/generate-analogy-report.ts`) — and all four share one id,
13
- * one input schema and one terminal contract via `createReportBlockerToolFor`.
14
- * What differs per loop is only what a blocker *means* there, so each call site
15
- * injects its own `blockedWhen` prose and its own capture closure. The tool
16
- * records the reason and tells the agent to stop; the driving body reads the
17
- * outcome after the loop and decides the terminal status. The sandbox step body
18
- * runs in durable steps, so it reads the blocker back from the transcript
19
- * (`recordedBlocker`) on replay, not only from its cell.
13
+ * one input schema and one result via `createReportBlockerToolFor`. What
14
+ * differs per loop is only what a blocker *means* there, so each call site
15
+ * injects its own `blockedWhen` prose. The result of the call carries the
16
+ * reason, and the driving body selects the blocker from the recorded calls of
17
+ * the run (`blockerOf`). Thus a replay selects the same blocker.
20
18
  */
21
- import { err, ok } from "neverthrow";
19
+ import { ok } from "neverthrow";
22
20
  import { z } from "zod";
23
- import { repairToolInput } from "../../lib/zod-issues.js";
24
- import { toolOutcomeForOutputType } from "../../loop/tool-outcome.js";
25
- import { degenerateTerminalText } from "../terminal-text.js";
21
+ import { terminalTextSchema } from "../terminal-text.js";
26
22
  import { defineTool } from "../define-tool.js";
27
23
  export const REPORT_BLOCKER_TOOL_ID = "report_blocker";
28
- export function createBlockerHolder() {
29
- return { outcome: null };
30
- }
31
24
  /** The one input every `report_blocker` takes, wherever it is offered. */
32
25
  const ReportBlockerInputSchema = z.object({
33
- reason: z
34
- .string()
35
- .min(1)
36
- .describe("What blocks the work, stated as a fact: the missing or unreadable input, or the capability that is not available, and what you tried."),
26
+ reason: terminalTextSchema("What blocks the work, stated as a fact: the missing or unreadable input, or the capability that is not available, and what you tried."),
37
27
  });
28
+ /** The result of a call: the blocker that the call recorded. */
29
+ const BlockerResultSchema = z.object({ kind: z.literal("blocker"), reason: z.string(), message: z.string() });
38
30
  /**
39
31
  * Build the `report_blocker` tool for one loop. The id, the input schema and
40
32
  * the terminal contract ("pass a reason, then stop") are fixed here; the call
41
- * site supplies only the per-loop meaning and the capture closure.
33
+ * site supplies only the per-loop meaning.
42
34
  */
43
35
  export function createReportBlockerToolFor(deps) {
44
36
  return defineTool({
@@ -46,70 +38,28 @@ export function createReportBlockerToolFor(deps) {
46
38
  description: `Terminal. ${deps.blockedWhen} Pass a clear reason. Stop immediately after calling — take no further actions.`,
47
39
  inputSchema: ReportBlockerInputSchema,
48
40
  describeCall: "none",
49
- execute: async (input) => {
50
- const degenerate = degenerateTerminalText(input.reason);
51
- if (degenerate)
52
- return err({ error: `${degenerate} Give the real reason, or continue the work.`, retryable: true });
53
- deps.record({ kind: "blocker", reason: input.reason });
54
- return ok({
55
- recorded: true,
56
- message: "Blocker recorded. You are done — stop now and do not take further actions.",
57
- });
58
- },
41
+ execute: (input) => Promise.resolve(ok({ kind: "blocker", reason: input.reason, message: "Blocker recorded. You are done — stop now and do not take further actions." })),
59
42
  });
60
43
  }
61
- /**
62
- * The blocker that a run recorded, read from its transcript: the reason of the
63
- * first `report_blocker` call, in call order, whose result is ok.
64
- *
65
- * A replay returns each tool step's cached result without re-running
66
- * `execute`, so the in-memory cell is empty on replay; the transcript is not.
67
- */
68
- export function recordedBlocker(messages) {
69
- const recorded = new Set();
70
- for (const message of messages) {
71
- if (message.role !== "tool")
72
- continue;
73
- for (const part of message.content) {
74
- if (part.type === "tool-result" && part.toolName === REPORT_BLOCKER_TOOL_ID && toolOutcomeForOutputType(part.output.type) === "ok") {
75
- recorded.add(part.toolCallId);
76
- }
77
- }
78
- }
79
- for (const message of messages) {
80
- if (message.role !== "assistant" || typeof message.content === "string")
81
- continue;
82
- for (const part of message.content) {
83
- if (part.type !== "tool-call" || part.toolName !== REPORT_BLOCKER_TOOL_ID || !recorded.has(part.toolCallId))
44
+ /** The blocker that a run recorded: the reason of the first `report_blocker` call, in call order, whose result is ok. */
45
+ export function blockerOf(steps) {
46
+ for (const step of steps) {
47
+ for (const call of step.calls) {
48
+ if (call.toolName !== REPORT_BLOCKER_TOOL_ID || call.output?.outcome !== "ok")
84
49
  continue;
85
- const reason = blockerReason(part.input);
86
- if (reason !== undefined)
87
- return { kind: "blocker", reason };
50
+ const result = BlockerResultSchema.safeParse(call.output.value);
51
+ if (result.success)
52
+ return { kind: "blocker", reason: result.data.reason };
88
53
  }
89
54
  }
90
55
  return null;
91
56
  }
92
- /** The reason of a `report_blocker` input, validated as the dispatch validates it. */
93
- function blockerReason(input) {
94
- const parsed = ReportBlockerInputSchema.safeParse(input);
95
- if (parsed.success)
96
- return parsed.data.reason;
97
- const repaired = repairToolInput(input, parsed.error);
98
- if (repaired === undefined)
99
- return undefined;
100
- const reparsed = ReportBlockerInputSchema.safeParse(repaired);
101
- return reparsed.success ? reparsed.data.reason : undefined;
102
- }
103
57
  /**
104
- * The sandbox step agent's `report_blocker`, bound to the step body's holder.
105
- * A blocker here ends the step with no deliverables and a blocked reason.
58
+ * The sandbox step agent's `report_blocker`. A blocker here ends the step with
59
+ * no deliverables and a blocked reason.
106
60
  */
107
- export function createReportBlockerTool(holder) {
61
+ export function createReportBlockerTool() {
108
62
  return createReportBlockerToolFor({
109
- record: (outcome) => {
110
- if (holder.outcome === null)
111
- holder.outcome = outcome;
112
- },
113
63
  blockedWhen: "Ends this analysis step with no deliverables. Call it when you cannot " +
114
64
  "fulfil the step — required inputs are missing or unreadable, the " +
115
65
  "requested analysis is infeasible with the available data/packages, or " +