@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
@@ -3,24 +3,30 @@
3
3
  * hoc analyses. Both modes launch the ordinary executeAnalysis workflow.
4
4
  */
5
5
  import { randomUUID } from "node:crypto";
6
- import { err, ok, ResultAsync } from "neverthrow";
6
+ import { err, ok, okAsync, ResultAsync } from "neverthrow";
7
+ import { errorNameOf } from "../lib/thrown.js";
7
8
  import { z } from "zod";
9
+ import { capabilityDataRequirement } from "../agents/sandbox-catalog.js";
8
10
  import { SANDBOX_AGENT_META } from "../agents/sandbox/index.js";
9
11
  import { DEFAULT_SANDBOX_MAX_STEPS } from "../config/resource-limits.js";
10
12
  import { createNoopLogger } from "../lib/console-logger.js";
13
+ import { readInstalledDatasetIds } from "./sandbox/list-available-refs.js";
14
+ import { tryQuery, withTransaction } from "../lib/db-result.js";
11
15
  import { deliverNotice, passGate } from "../lib/hooks.js";
12
16
  import { unwrapOrThrow } from "../lib/result.js";
13
17
  import { buildRunCardData } from "../memory/card-builders.js";
14
18
  import { formatQuery, parseQuery } from "../sandbox/package-identity.js";
15
19
  import { AnalysisPlanSchema } from "../schemas/workflow-state.js";
16
20
  import { validatePlan } from "../schemas/validate-plan.js";
17
- import { RunDedupCollisionError, insertRun, loadPlan, queryActiveRun, reserveRunById, suspendAnalysis, updateRunStatus, upsertPlan } from "../state/index.js";
21
+ import { RunDedupCollisionError, insertRun, loadPlan, queryActiveRun, queryNewestPlanRun, queryRun, reserveRunById, updateRunStatus, upsertPlan, } from "../state/index.js";
18
22
  import { routeAdHocRequest } from "./ad-hoc-router.js";
19
- import { adHocPlanId, adHocRunId } from "./analysis-invocation.js";
23
+ import { adHocPlanId, adHocRunId, callRunId, durableCallKey } from "./analysis-invocation.js";
20
24
  import { defineTool } from "./define-tool.js";
21
25
  import { queryPackages, readInventorySections } from "./sandbox/list-available-packages.js";
22
26
  import { callExtendAnalysisFarm } from "./sandbox/link-packages.js";
23
- const planIdSchema = z.string().regex(/^pln-[a-f0-9]{8}$/, "planId must be a pln-<8hex> value");
27
+ import { PLAN_ID_RE } from "../contracts/schemas/chat-parts.js";
28
+ import { collapseWhitespace } from "../lib/text.js";
29
+ const planIdSchema = z.string().regex(PLAN_ID_RE, "planId must be a pln-<8hex> value");
24
30
  const inputSchema = z
25
31
  .object({
26
32
  mode: z
@@ -64,7 +70,7 @@ export class PlanValidationError extends Error {
64
70
  }
65
71
  }
66
72
  function isDedupCollision(err) {
67
- return err instanceof RunDedupCollisionError || (err instanceof Error && err.name === "RunDedupCollisionError");
73
+ return err instanceof RunDedupCollisionError || errorNameOf(err) === "RunDedupCollisionError";
68
74
  }
69
75
  /**
70
76
  * A pool miss at the pre-launch link pass. The message names the missing
@@ -92,6 +98,66 @@ export class PlanPackagesMissingError extends Error {
92
98
  this.name = "PlanPackagesMissingError";
93
99
  }
94
100
  }
101
+ /**
102
+ * A declared dataset that the reference store does not hold, found at the pre-launch pass. The
103
+ * message names the datasets and no remedy command — the remedy belongs to the embedder, and its
104
+ * wrapper appends it.
105
+ */
106
+ export class PlanReferencesMissingError extends Error {
107
+ missing;
108
+ unavailable;
109
+ constructor(missing, unavailable) {
110
+ const parts = [
111
+ // The store-level reason FIRST, for the same reason the package error leads with it:
112
+ // with an unanswerable store, no per-dataset claim below it is trustworthy.
113
+ unavailable !== undefined
114
+ ? `the store cannot answer (${unavailable}) — this says nothing about the datasets themselves, so do not re-request them`
115
+ : null,
116
+ missing.length > 0 ? `the store does not hold: ${missing.join(", ")}` : null,
117
+ ].filter((part) => part !== null);
118
+ super(`The reference data of this plan is not installed — ${parts.join(" ")}`);
119
+ this.missing = missing;
120
+ this.unavailable = unavailable;
121
+ this.name = "PlanReferencesMissingError";
122
+ }
123
+ }
124
+ /**
125
+ * Resolve the reference data that the capabilities of a plan declare, before the run reserves
126
+ * anything. A step names its capability, the agent of the step holds the declaration, and the
127
+ * declaration names catalog ids. An absent dataset refuses the launch with the ids named.
128
+ *
129
+ * Nothing is read when no step declares a requirement: the common plan touches no store at all.
130
+ *
131
+ * @returns How many datasets reached the store. Zero says that nothing was checked — a plan that
132
+ * declares none, or a store the embedder bound nowhere — which a launch record must be able to tell
133
+ * from a checked launch.
134
+ */
135
+ async function resolvePlanReferences(refStorePath, plan) {
136
+ const declared = new Set();
137
+ for (const step of plan.steps) {
138
+ if (!step.agent || !step.capability)
139
+ continue;
140
+ for (const dataset of capabilityDataRequirement(step.agent, step.capability))
141
+ declared.add(dataset);
142
+ }
143
+ if (declared.size === 0)
144
+ return ok(0);
145
+ // An unbound store is an embedder that provisions reference data some other way, exactly as an
146
+ // unbound farm seam leaves the package pass at once. Reading the container path here instead
147
+ // would fail on every host and refuse every launch that declares a capability.
148
+ if (refStorePath === undefined)
149
+ return ok(0);
150
+ const installed = await readInstalledDatasetIds({ refStorePath });
151
+ if (installed === undefined) {
152
+ // The path is named, because the reason is a fault of the environment and the reader has to
153
+ // know WHICH store did not answer. A bare "could not be read" sends a caller round in circles.
154
+ return err({ type: "references_missing", missing: [], unavailable: `the reference store at ${refStorePath} could not be read` });
155
+ }
156
+ const missing = [...declared].filter((dataset) => !installed.has(dataset)).sort();
157
+ if (missing.length > 0)
158
+ return err({ type: "references_missing", missing });
159
+ return ok(declared.size);
160
+ }
95
161
  /**
96
162
  * Link the packages of the plan into the farm of the analysis, before the
97
163
  * run reserves anything. The linked set is the union of the queries of each
@@ -166,7 +232,7 @@ async function linkPlanPackages(extendAnalysisFarm, analysisId, planId, plan) {
166
232
  const collisions = outcomes
167
233
  .filter((o) => o.kind === "collision")
168
234
  .map((o) => `${o.spelling} — two store directories claim it, ${o.storeDirs[0]} and ${o.storeDirs[1]}` +
169
- `${o.detail === undefined ? "" : ` (${o.detail})`}` +
235
+ (o.detail === undefined ? "" : ` (${o.detail})`) +
170
236
  `; when the two directories are one spelling in two tracks, name the track in the plan, as ` +
171
237
  `${formatQuery({ spelling: o.spelling, track: "python" })} or ${formatQuery({ spelling: o.spelling, track: "r" })}`);
172
238
  if (missing.length > 0 || collisions.length > 0) {
@@ -202,14 +268,13 @@ function workflowInput(planId, plan, args) {
202
268
  planId,
203
269
  planSummary: planSummary(plan),
204
270
  threadId: args.threadId,
205
- steps: plan.steps.map((step) => ({ id: step.id, depends_on: step.depends_on ?? [] })),
271
+ steps: plan.steps.map((step) => ({ id: step.id, depends_on: step.depends_on })),
206
272
  planStepById: Object.fromEntries(plan.steps.map((step) => [step.id, step])),
207
273
  agentByStepId: Object.fromEntries(plan.steps.map((step) => [step.id, step.agent ?? "unknown"])),
208
274
  resourcesByStepId: args.resourcesByStepId,
209
- timeoutByStepId: Object.fromEntries(plan.steps.filter((step) => step.timeout !== undefined).map((step) => [step.id, step.timeout])),
275
+ timeoutByStepId: Object.fromEntries(plan.steps.flatMap((step) => (step.timeout === undefined ? [] : [[step.id, step.timeout]]))),
210
276
  budget: args.budget,
211
277
  runSession: args.runSession,
212
- ownsMandate: args.ownsMandate,
213
278
  synthesisEnabled: args.synthesisEnabled,
214
279
  };
215
280
  }
@@ -226,11 +291,11 @@ function parseStoredPlan(raw, planId) {
226
291
  function validateStoredPlan(raw, planId) {
227
292
  const parsed = parseStoredPlan(raw, planId);
228
293
  if (parsed.isErr())
229
- return throwLaunchRefusal(parsed.error);
294
+ return throwLaunchRefusal(parsed.error, planId);
230
295
  return parsed.value;
231
296
  }
232
297
  function adHocTitle(request) {
233
- const compact = request.trim().replace(/\s+/g, " ");
298
+ const compact = collapseWhitespace(request);
234
299
  return compact.length <= 80 ? compact : `${compact.slice(0, 77)}…`;
235
300
  }
236
301
  /** How a dropped entry reads to the step agent, in the terms of its own reason. */
@@ -286,6 +351,7 @@ export function buildAdHocPlan(request, route, createdAt = new Date().toISOStrin
286
351
  status: "pending",
287
352
  resources: route.resources,
288
353
  agent: route.agentId,
354
+ capability: route.capability,
289
355
  maxSteps: meta?.defaultMaxSteps ?? DEFAULT_SANDBOX_MAX_STEPS,
290
356
  },
291
357
  ],
@@ -305,9 +371,9 @@ function adHocPackageResolver(deps, analysisId) {
305
371
  if (!deps.farmLockFile && !deps.imagePackagesFile && !deps.readPoolInventory)
306
372
  return undefined;
307
373
  const inventory = {
308
- ...(deps.farmLockFile === undefined ? {} : { farmLockFile: deps.farmLockFile }),
309
- ...(deps.imagePackagesFile === undefined ? {} : { imagePackagesFile: deps.imagePackagesFile }),
310
- ...(deps.readPoolInventory === undefined ? {} : { readPoolInventory: deps.readPoolInventory }),
374
+ farmLockFile: deps.farmLockFile,
375
+ imagePackagesFile: deps.imagePackagesFile,
376
+ readPoolInventory: deps.readPoolInventory,
311
377
  };
312
378
  return async (names) => {
313
379
  const read = await readInventorySections(inventory, analysisId);
@@ -330,14 +396,14 @@ async function persistedAdHocPlan(deps, args) {
330
396
  pool: deps.pool,
331
397
  resourcePolicy: deps.resourcePolicy,
332
398
  logger: deps.logger,
333
- ...(resolvePackages ? { resolvePackages } : {}),
334
- ...(deps.usageRecorder ? { usageRecorder: deps.usageRecorder } : {}),
399
+ resolvePackages,
400
+ usageRecorder: deps.usageRecorder,
335
401
  }, {
336
402
  analysisId: args.analysisId,
337
403
  request: args.request,
338
404
  session: args.ctx.session,
339
405
  signal: args.ctx.signal,
340
- ...(args.ctx.turnUsage ? { turnUsage: args.ctx.turnUsage } : {}),
406
+ turnUsage: args.ctx.turnUsage,
341
407
  invocationId: args.ctx.invocationId,
342
408
  });
343
409
  const candidate = buildAdHocPlan(args.request, route);
@@ -350,6 +416,10 @@ async function persistedAdHocPlan(deps, args) {
350
416
  /**
351
417
  * The half of a launch that the plan mode and the ad hoc mode share: the link pass, the reservation,
352
418
  * the authorization, and the workflow start. It gives each outcome as a `Result`.
419
+ *
420
+ * A launch of the run of this call always authorizes and starts, also when its row exists. A rerun of
421
+ * the call can come after the reservation and before the start, and the launcher starts one workflow for
422
+ * each run id. A rerun after the start mints a second mandate that no run uses.
353
423
  */
354
424
  async function launchReservedRun(deps, args) {
355
425
  const logger = (deps.logger ?? createNoopLogger()).named("execute-analysis-tool");
@@ -359,6 +429,12 @@ async function launchReservedRun(deps, args) {
359
429
  const resources = stepResources(planId, plan);
360
430
  if (resources.isErr())
361
431
  return err(resources.error);
432
+ // Reference data first: it is a read, so it costs nothing to learn before the farm link
433
+ // writes. Both passes come before the run reserves anything, thus a miss of either leaves no
434
+ // run row and no revoked authorization behind.
435
+ const references = await resolvePlanReferences(deps.refStorePath, plan);
436
+ if (references.isErr())
437
+ return err(references.error);
362
438
  // The link pass comes before the run reserves anything, thus a pool
363
439
  // miss leaves no run row and no revoked authorization behind.
364
440
  const linked = await linkPlanPackages(deps.extendAnalysisFarm, analysisId, planId, plan);
@@ -368,9 +444,10 @@ async function launchReservedRun(deps, args) {
368
444
  const reservation = await args.reserve({ analysisId, threadId });
369
445
  if (reservation.isErr())
370
446
  return err(reservation.error);
371
- if (!reservation.value.started)
447
+ // A different run holds the slot of the plan, or the view of the caller is stale: this call starts nothing.
448
+ if (reservation.value.runId !== args.runId)
372
449
  return reservation;
373
- const runId = reservation.value.runId;
450
+ const runId = args.runId;
374
451
  const authorized = await passGate("RunAuthorizer.authorize", deps.runAuthorizer.authorize({
375
452
  auth: session.auth,
376
453
  scope: session.scope,
@@ -378,25 +455,17 @@ async function launchReservedRun(deps, args) {
378
455
  frame: { runId },
379
456
  }));
380
457
  if (authorized.isErr()) {
381
- // The refusal ends the run before a workflow exists, thus the
382
- // reserved row must not stay `running`.
458
+ // The refusal ends the run before a workflow exists, thus the reserved row must not stay `running`. No work
459
+ // exists yet, thus a refusal with the suspend flag does not pause, and it marks no analysis.
383
460
  const { kind, reason } = authorized.error;
384
- if (kind === "suspended") {
385
- await updateRunStatus(deps.pool, runId, "suspended_insufficient_funds", reason).match(() => { }, () => { });
386
- const suspension = await suspendAnalysis(deps.pool, analysisId);
387
- if (suspension.isErr())
388
- return err({ type: "store_failed", cause: suspension.error });
389
- return err({ type: "suspended", reason });
390
- }
391
461
  await updateRunStatus(deps.pool, runId, "failed", reason).match(() => { }, () => { });
392
- return err({ type: "not_authorized", reason });
462
+ return err(kind === "suspended" ? { type: "suspended", reason } : { type: "not_authorized", reason });
393
463
  }
394
- const authorization = authorized.value;
464
+ const runSession = authorized.value;
395
465
  const wfInput = workflowInput(planId, plan, {
396
466
  analysisId,
397
467
  threadId,
398
- runSession: authorization.runSession,
399
- ownsMandate: authorization.ownsMandate,
468
+ runSession,
400
469
  budget: deps.resourcePolicy?.budget,
401
470
  synthesisEnabled: args.mode === "plan",
402
471
  resourcesByStepId: resources.value,
@@ -405,7 +474,7 @@ async function launchReservedRun(deps, args) {
405
474
  await deps.runLauncher.launch(deps.executeAnalysisWorkflow, { workflowId: runId }, wfInput);
406
475
  }
407
476
  catch (cause) {
408
- await deliverNotice(logger, "RunAuthorizer.revoke", deps.runAuthorizer.revoke(authorization, "workflow-start-failed"));
477
+ await deliverNotice(logger, "RunAuthorizer.revoke", deps.runAuthorizer.revoke(runSession, "workflow-start-failed"));
409
478
  // A failed write leaves the row `running` with no workflow. The boot repair (`reconcileOrphanedRuns`) fails it.
410
479
  await updateRunStatus(deps.pool, runId, "failed", "workflow start failed").match(() => { }, (error) => logger.warn("the failed status of a run whose start failed was not written", { runId, ...logger.errorFields(error) }));
411
480
  return err({ type: "launch_failed", cause });
@@ -413,26 +482,57 @@ async function launchReservedRun(deps, args) {
413
482
  logger.info("analysis launched", { analysisId, runId, planId, mode: args.mode, packageQueries });
414
483
  return ok({ runId, started: true });
415
484
  }
485
+ function staleViewOf(newest, seen) {
486
+ if (newest !== null)
487
+ return newest === seen ? null : { type: "newer", runId: newest };
488
+ return seen === null ? null : { type: "missing", runId: seen };
489
+ }
490
+ /** A stale view starts nothing: it gives the newest run with `started: false`, or `run_not_found` when the plan has no run. */
491
+ function refuseStaleView(view) {
492
+ return view.type === "newer" ? ok({ runId: view.runId, started: false }) : err({ type: "run_not_found", runId: view.runId });
493
+ }
494
+ function lockPlanLaunch(client, planId) {
495
+ return tryQuery("execute-analysis.lockPlanLaunch", () => client.query("SELECT pg_advisory_xact_lock(hashtext($1))", [`plan-launch:${planId}`])).map(() => undefined);
496
+ }
416
497
  /**
417
- * Reserve a fresh run for a plan. A concurrent launch of the same plan holds the active-plan slot,
418
- * and its run is the answer.
498
+ * Reserve the run `runId` for a plan under the lock of the plan, thus the reservations of one plan occur
499
+ * one after the other. A row of `runId` that exists is the reservation of a first attempt of the same
500
+ * call. A caller with a `newestRunId` reserves nothing when the newest run of the plan is a different run.
501
+ * The new row starts after the newest start, thus it is the newest run of the plan. A concurrent launch of
502
+ * the same plan can hold the active-plan slot, and its run is the answer.
419
503
  */
420
504
  async function reservePlanRun(deps, args) {
421
- const runId = randomUUID();
505
+ const { runId } = args;
422
506
  try {
423
- const inserted = await insertRun(deps.pool, {
424
- runId,
425
- analysisId: args.analysisId,
426
- threadId: args.threadId,
427
- workflowName: "executeAnalysis",
428
- planId: args.planId,
429
- });
430
- if (inserted.isErr())
431
- return err({ type: "store_failed", cause: inserted.error });
507
+ const reserved = await withTransaction(deps.pool, "execute-analysis.reservePlanRun", (client) => lockPlanLaunch(client, args.planId)
508
+ .andThen(() => queryRun(client, runId))
509
+ .andThen((own) => {
510
+ if (own !== null)
511
+ return okAsync({ type: "reserved" });
512
+ return queryNewestPlanRun(client, { analysisId: args.analysisId, planId: args.planId }).andThen((newest) => {
513
+ const stale = args.newestRunId === undefined ? null : staleViewOf(newest?.runId ?? null, args.newestRunId);
514
+ if (stale)
515
+ return okAsync({ type: "stale", view: stale });
516
+ const startedAt = newest === null ? undefined : new Date(Math.max(Date.now(), Date.parse(newest.startedAt) + 1)).toISOString();
517
+ return insertRun(client, {
518
+ runId,
519
+ analysisId: args.analysisId,
520
+ threadId: args.threadId,
521
+ workflowName: "executeAnalysis",
522
+ planId: args.planId,
523
+ startedAt,
524
+ }).map(() => ({ type: "reserved" }));
525
+ });
526
+ }));
527
+ if (reserved.isErr())
528
+ return err({ type: "store_failed", cause: reserved.error });
529
+ if (reserved.value.type === "stale")
530
+ return refuseStaleView(reserved.value.view);
432
531
  return ok({ runId, started: true });
433
532
  }
434
533
  catch (cause) {
435
- // `insertRun` rejects its promise on a collision of the active-plan index, and on nothing else.
534
+ // `insertRun` rejects its promise on a collision of the active-plan index, and on nothing else. The
535
+ // transaction is rolled back and released by now, so the read goes to the pool.
436
536
  if (!isDedupCollision(cause))
437
537
  return err({ type: "store_failed", cause });
438
538
  const active = await queryActiveRun(deps.pool, args.analysisId, args.planId);
@@ -467,8 +567,9 @@ async function reserveAdHocRun(deps, args) {
467
567
  }
468
568
  }
469
569
  async function launchStoredPlan(deps, input) {
470
- const { session, planId } = input;
570
+ const { session, planId, newestRunId } = input;
471
571
  const analysisId = session.scope.analysisId;
572
+ const runId = input.runId ?? randomUUID();
472
573
  const raw = await loadPlan(deps.pool, planId, { analysisId });
473
574
  if (raw.isErr())
474
575
  return err({ type: "store_failed", cause: raw.error });
@@ -477,23 +578,40 @@ async function launchStoredPlan(deps, input) {
477
578
  const plan = parseStoredPlan(raw.value, planId);
478
579
  if (plan.isErr())
479
580
  return err(plan.error);
581
+ if (newestRunId !== undefined) {
582
+ const newest = await queryNewestPlanRun(deps.pool, { analysisId, planId });
583
+ if (newest.isErr())
584
+ return err({ type: "store_failed", cause: newest.error });
585
+ const stale = staleViewOf(newest.value?.runId ?? null, newestRunId);
586
+ if (stale)
587
+ return refuseStaleView(stale);
588
+ }
480
589
  const active = await queryActiveRun(deps.pool, analysisId, planId);
481
590
  if (active.isErr())
482
591
  return err({ type: "store_failed", cause: active.error });
483
- if (active.value)
484
- return ok({ runId: active.value.runId, started: false });
592
+ if (active.value && active.value.runId !== runId) {
593
+ // A rerun of a call whose run ended keeps its run, also when a later launch holds the slot.
594
+ const own = await queryRun(deps.pool, runId);
595
+ if (own.isErr())
596
+ return err({ type: "store_failed", cause: own.error });
597
+ if (own.value === null)
598
+ return ok({ runId: active.value.runId, started: false });
599
+ }
485
600
  return launchReservedRun(deps, {
486
601
  session,
487
602
  planId,
488
603
  plan: plan.value,
489
604
  mode: "plan",
490
- reserve: (frame) => reservePlanRun(deps, { ...frame, planId }),
605
+ runId,
606
+ reserve: (frame) => reservePlanRun(deps, { ...frame, planId, runId, newestRunId }),
491
607
  });
492
608
  }
493
609
  /**
494
610
  * Start the run of a stored plan. It reads the plan under the analysis of the session, validates it,
495
- * links its packages, reserves a run, authorizes it, and starts the workflow. It gives the run id, or
496
- * the refusal, and it emits no chat part. `started` is false when a run of the plan was already active.
611
+ * compares the newest run of the plan with `newestRunId`, links its packages, reserves a run,
612
+ * authorizes it, and starts the workflow. It gives the run id, or the refusal, and it emits no chat
613
+ * part. `started` is false when this call started nothing: a run of the plan was already active, or the
614
+ * newest run of the plan is not the run that the caller saw. `runId` then names that run.
497
615
  *
498
616
  * This is an API boundary: a host calls it outside a tool body, thus no outcome above rejects the
499
617
  * promise.
@@ -502,14 +620,18 @@ export function launchPlanRun(deps, input) {
502
620
  return new ResultAsync(launchStoredPlan(deps, input));
503
621
  }
504
622
  /** Throw the error that the tool body threw before the launch gave a `Result`. */
505
- function throwLaunchRefusal(refusal) {
623
+ function throwLaunchRefusal(refusal, planId) {
506
624
  switch (refusal.type) {
625
+ case "run_not_found":
626
+ throw new Error(`Plan ${planId} has no run ${refusal.runId}`);
507
627
  case "plan_not_found":
508
628
  throw new PlanNotFoundError(refusal.planId);
509
629
  case "plan_invalid":
510
630
  throw refusal.malformed ? new PlanMalformedError(refusal.planId) : new PlanValidationError(refusal.planId, refusal.errors);
511
631
  case "packages_missing":
512
632
  throw new PlanPackagesMissingError(refusal.missing, refusal.collisions, refusal.unavailable);
633
+ case "references_missing":
634
+ throw new PlanReferencesMissingError(refusal.missing, refusal.unavailable);
513
635
  case "store_failed":
514
636
  return unwrapOrThrow(err(refusal.cause));
515
637
  case "launch_failed":
@@ -535,20 +657,28 @@ export function createExecuteAnalysisTool(deps) {
535
657
  // running is a different event from an ad hoc request being routed.
536
658
  describeCall: (input) => (input.mode === "plan" ? `plan ${input.planId ?? ""}` : `ad hoc: ${input.request ?? ""}`),
537
659
  execute: async (input, ctx) => {
538
- if (ctx.session.scope.kind !== "analysis")
539
- throw new Error("execute_analysis requires an analysis-scoped session");
540
- if (!ctx.session.auth)
541
- throw new Error("execute_analysis: session is missing its auth capability");
542
660
  const analysisId = ctx.session.scope.analysisId;
543
- const planId = input.mode === "plan" ? input.planId : adHocPlanId(analysisId, ctx.invocationId);
661
+ let planId;
662
+ if (input.mode === "plan") {
663
+ if (input.planId === undefined)
664
+ throw new Error("plan mode requires planId");
665
+ planId = input.planId;
666
+ }
667
+ else {
668
+ planId = adHocPlanId(analysisId, ctx.invocationId);
669
+ }
544
670
  const emitRunCard = async (runId) => {
545
671
  const card = await buildRunCardData(deps.pool, { planId, analysisId, runId }).unwrapOr(null);
546
672
  if (card)
547
673
  await ctx.emit({ type: "data-run-card", source: ctx.session.provenance, data: card });
548
674
  };
549
675
  const launch = async () => {
550
- if (input.mode === "plan")
551
- return launchPlanRun(deps, { session: ctx.session, planId });
676
+ if (input.mode === "plan") {
677
+ const callKey = durableCallKey(ctx.invocationId);
678
+ return launchPlanRun(deps, { session: ctx.session, planId, runId: callKey === undefined ? undefined : callRunId(callKey) });
679
+ }
680
+ if (input.request === undefined)
681
+ throw new Error("adhoc mode requires request");
552
682
  const plan = await persistedAdHocPlan(deps, { analysisId, request: input.request, ctx, planId });
553
683
  const runId = adHocRunId(analysisId, ctx.invocationId);
554
684
  return launchReservedRun(deps, {
@@ -556,6 +686,7 @@ export function createExecuteAnalysisTool(deps) {
556
686
  planId,
557
687
  plan,
558
688
  mode: "adhoc",
689
+ runId,
559
690
  reserve: (frame) => reserveAdHocRun(deps, { ...frame, planId, runId }),
560
691
  });
561
692
  };
@@ -563,10 +694,10 @@ export function createExecuteAnalysisTool(deps) {
563
694
  if (launched.isErr()) {
564
695
  const refusal = launched.error;
565
696
  if (refusal.type === "suspended")
566
- return err({ error: `The analysis is suspended: ${refusal.reason}`, retryable: false });
697
+ return err({ error: `The host refused the run: ${refusal.reason}`, retryable: false });
567
698
  if (refusal.type === "not_authorized")
568
699
  return err({ error: `The run was not authorized: ${refusal.reason}`, retryable: false });
569
- return throwLaunchRefusal(refusal);
700
+ return throwLaunchRefusal(refusal, planId);
570
701
  }
571
702
  await emitRunCard(launched.value.runId);
572
703
  return ok({ runId: launched.value.runId, status: "in_progress" });
@@ -0,0 +1,182 @@
1
+ /**
2
+ * `knowledge_check` — the drafted steps against the rules, once, before
3
+ * `submit_plan`. A violation names the rule and the permitted alternatives.
4
+ * The planner revises once. There is no loop: the host counts the calls of
5
+ * one plan generation, and past `CHECK_CALL_LIMIT` the tool answers with a
6
+ * typed refusal and never reaches the service. A small model that cannot
7
+ * satisfy a finding otherwise rephrases the step until the plan times out.
8
+ */
9
+ import { z } from "zod";
10
+ import { type Tool } from "../define-tool.js";
11
+ import type { CheckResponse, KnowledgeClient, KnowledgeRejected, KnowledgeSnapshotMismatch, KnowledgeUnavailable } from "./client.js";
12
+ import type { SnapshotPin } from "./pin.js";
13
+ export type KnowledgeCheckDeps = {
14
+ readonly client: KnowledgeClient;
15
+ /** The release the plan pinned on its first recommend answer. The check sends it, thus another release refuses the call. */
16
+ readonly pin?: SnapshotPin;
17
+ };
18
+ export type KnowledgeCheckOutput = CheckResponse | KnowledgeUnavailable | KnowledgeRejected | KnowledgeSnapshotMismatch;
19
+ /** The checks one plan generation may run. Two is a draft and one revision; the third is slack. */
20
+ export declare const CHECK_CALL_LIMIT = 3;
21
+ declare const KnowledgeCheckInputSchema: z.ZodObject<{
22
+ question: z.ZodEnum<{
23
+ clustering: "clustering";
24
+ coexpression: "coexpression";
25
+ deconvolution: "deconvolution";
26
+ differential_expression: "differential_expression";
27
+ enrichment: "enrichment";
28
+ full_plan: "full_plan";
29
+ qc: "qc";
30
+ signature_scoring: "signature_scoring";
31
+ survival: "survival";
32
+ tf_activity: "tf_activity";
33
+ }>;
34
+ modality: z.ZodLiteral<"bulk_rna_seq">;
35
+ data_state: z.ZodEnum<{
36
+ counts: "counts";
37
+ fastq: "fastq";
38
+ log_normalized: "log_normalized";
39
+ tpm_or_fpkm: "tpm_or_fpkm";
40
+ }>;
41
+ count_source: z.ZodOptional<z.ZodEnum<{
42
+ kallisto: "kallisto";
43
+ rsem: "rsem";
44
+ salmon: "salmon";
45
+ star_featurecounts: "star_featurecounts";
46
+ unknown: "unknown";
47
+ }>>;
48
+ import_state: z.ZodOptional<z.ZodEnum<{
49
+ corrected_counts: "corrected_counts";
50
+ estimated_counts_with_lengths: "estimated_counts_with_lengths";
51
+ integer_counts: "integer_counts";
52
+ quantifications: "quantifications";
53
+ unknown: "unknown";
54
+ }>>;
55
+ organism: z.ZodEnum<{
56
+ human: "human";
57
+ mouse: "mouse";
58
+ other: "other";
59
+ }>;
60
+ n_groups: z.ZodNumber;
61
+ n_per_group_min: z.ZodNumber;
62
+ n_per_group_max: z.ZodNumber;
63
+ n_samples: z.ZodOptional<z.ZodNumber>;
64
+ n_events: z.ZodOptional<z.ZodNumber>;
65
+ paired: z.ZodBoolean;
66
+ blocking_factor: z.ZodOptional<z.ZodNullable<z.ZodEnum<{
67
+ cell_line: "cell_line";
68
+ individual: "individual";
69
+ litter: "litter";
70
+ other: "other";
71
+ pair: "pair";
72
+ site: "site";
73
+ }>>>;
74
+ block_structure: z.ZodOptional<z.ZodEnum<{
75
+ crossed: "crossed";
76
+ nested: "nested";
77
+ }>>;
78
+ batch: z.ZodEnum<{
79
+ known_balanced: "known_balanced";
80
+ known_confounded: "known_confounded";
81
+ known_unbalanced: "known_unbalanced";
82
+ none: "none";
83
+ suspected: "suspected";
84
+ }>;
85
+ covariates: z.ZodOptional<z.ZodArray<z.ZodEnum<{
86
+ age: "age";
87
+ clinical: "clinical";
88
+ other: "other";
89
+ sex: "sex";
90
+ technical: "technical";
91
+ }>>>;
92
+ n_timepoints: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
93
+ continuous_predictor: z.ZodOptional<z.ZodNullable<z.ZodEnum<{
94
+ age: "age";
95
+ dose: "dose";
96
+ other: "other";
97
+ score: "score";
98
+ time: "time";
99
+ }>>>;
100
+ technical_replicates: z.ZodOptional<z.ZodBoolean>;
101
+ sample_exclusions: z.ZodOptional<z.ZodBoolean>;
102
+ feature_level: z.ZodOptional<z.ZodEnum<{
103
+ exon: "exon";
104
+ gene: "gene";
105
+ transcript: "transcript";
106
+ }>>;
107
+ library_type: z.ZodOptional<z.ZodEnum<{
108
+ polyA: "polyA";
109
+ three_prime: "three_prime";
110
+ total: "total";
111
+ unknown: "unknown";
112
+ }>>;
113
+ strandedness: z.ZodOptional<z.ZodEnum<{
114
+ declared_unverified: "declared_unverified";
115
+ unknown: "unknown";
116
+ verified: "verified";
117
+ }>>;
118
+ interaction: z.ZodOptional<z.ZodBoolean>;
119
+ classifier: z.ZodOptional<z.ZodBoolean>;
120
+ extra_analyses: z.ZodOptional<z.ZodArray<z.ZodEnum<{
121
+ annotation: "annotation";
122
+ clustering: "clustering";
123
+ coexpression: "coexpression";
124
+ deconvolution: "deconvolution";
125
+ pathway_activity: "pathway_activity";
126
+ signature_scoring: "signature_scoring";
127
+ survival: "survival";
128
+ tf_activity: "tf_activity";
129
+ transcript_level: "transcript_level";
130
+ variance_partition: "variance_partition";
131
+ }>>>;
132
+ preferred_language: z.ZodOptional<z.ZodEnum<{
133
+ R: "R";
134
+ python: "python";
135
+ }>>;
136
+ enrichment_input: z.ZodOptional<z.ZodEnum<{
137
+ gene_list: "gene_list";
138
+ ranked_list: "ranked_list";
139
+ sample_scores: "sample_scores";
140
+ }>>;
141
+ quality_flags: z.ZodOptional<z.ZodArray<z.ZodEnum<{
142
+ degraded_rna: "degraded_rna";
143
+ high_duplication: "high_duplication";
144
+ low_depth_sample: "low_depth_sample";
145
+ outlier_sample: "outlier_sample";
146
+ sample_identity_doubt: "sample_identity_doubt";
147
+ }>>>;
148
+ steps: z.ZodArray<z.ZodObject<{
149
+ step_type: z.ZodEnum<{
150
+ annotation: "annotation";
151
+ clustering: "clustering";
152
+ coexpression: "coexpression";
153
+ cohort_assembly: "cohort_assembly";
154
+ deconvolution: "deconvolution";
155
+ differential_expression: "differential_expression";
156
+ enrichment: "enrichment";
157
+ filter_low_counts: "filter_low_counts";
158
+ model_design: "model_design";
159
+ multiple_testing: "multiple_testing";
160
+ normalize: "normalize";
161
+ pathway_activity: "pathway_activity";
162
+ qc_sample_structure: "qc_sample_structure";
163
+ report: "report";
164
+ shrink_lfc: "shrink_lfc";
165
+ signature_scoring: "signature_scoring";
166
+ survival: "survival";
167
+ tf_activity: "tf_activity";
168
+ transcript_level: "transcript_level";
169
+ variance_partition: "variance_partition";
170
+ }>;
171
+ method: z.ZodString;
172
+ method_id: z.ZodOptional<z.ZodString>;
173
+ package: z.ZodOptional<z.ZodString>;
174
+ parameters: z.ZodOptional<z.ZodArray<z.ZodObject<{
175
+ name: z.ZodString;
176
+ value: z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean]>;
177
+ }, z.core.$strip>>>;
178
+ outcome: z.ZodOptional<z.ZodString>;
179
+ }, z.core.$strip>>;
180
+ }, z.core.$strip>;
181
+ export declare function createKnowledgeCheckTool(deps: KnowledgeCheckDeps): Tool<z.infer<typeof KnowledgeCheckInputSchema>, KnowledgeCheckOutput>;
182
+ export {};