@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
@@ -1,18 +1,32 @@
1
1
  /**
2
2
  * RunCanceler — the encapsulated external-cancel path for an `executeAnalysis` run.
3
3
  *
4
- * A cancelled DBOS workflow can never execute another step, so the body's own
5
- * terminal block (`collectAndComplete`) is unreachable on external cancel and
6
- * nothing converges: the run row stays `running` (blocking same-plan relaunch
7
- * through `queryActiveRun`'s active-status dedup), pending step rows never
8
- * sweep, the running charge never closes, and the run mandate is never
9
- * revoked. This module is the host-side counterpart: cancel the engine's
10
- * parent + children, then converge each ledger the workflow would have.
4
+ * A cancelled DBOS workflow can never start another step, so the body's own
5
+ * terminal block (`collectAndComplete`) can be unreachable once the cancel lands
6
+ * and nothing converges: the run row stays `running` (blocking same-plan relaunch
7
+ * through `queryActiveRun`'s active-status dedup) and pending step rows never
8
+ * sweep. A step that started before the cancel still runs to its end, and its
9
+ * run status write is conditional on a `running` row. This module is the
10
+ * host-side counterpart: cancel the engine's parent + children, then converge
11
+ * the ledgers the workflow would have.
12
+ *
13
+ * The writer that wins the conditional terminal write of the run row owns the
14
+ * run end: the run emit, the charge close, and the mandate revoke. This module
15
+ * does those acts only when its write changed the row. A refused write means
16
+ * the body won the row and owns them; a failed write leaves the row `running`,
17
+ * so a second cancel converges the run. The step rows settle on every path.
18
+ *
19
+ * One exception: after a failed status write the body does the run end and
20
+ * records it as a workflow event (`run-end-record.ts`), while the row stays
21
+ * `running`. This module reads that record before its terminal write. A present
22
+ * record makes the terminal write carry the recorded status and error, and no
23
+ * act of the run end follows. A failed read writes nothing, so a second cancel
24
+ * converges the run.
11
25
  *
12
26
  * The engine capability stays internal — the production default is the
13
27
  * purger's `DBOSClient`-backed child-cascading cancel, which needs no launched
14
28
  * engine (see `dbos-workflow-purger.ts` for why the static `DBOS` facade is
15
- * the wrong tool here). `cancelWorkflows` is an optional test seam over it.
29
+ * the wrong tool here). `cancelWorkflows` is an optional injected function over it.
16
30
  *
17
31
  * No stream writes: `DBOS.writeStream` writes only from inside the workflow
18
32
  * that owns the stream, so the run-event reader (`run-event-stream.ts`)
@@ -22,13 +36,14 @@ import type { Pool } from "pg";
22
36
  import type { AgentSession } from "../auth/types.js";
23
37
  import type { RunCharge } from "../billing/run-charge.js";
24
38
  import type { Logger } from "../lib/logger.js";
39
+ import type { ProvenanceSeam } from "../provenance/seam.js";
25
40
  import type { RunStatus } from "../state/schema.js";
26
41
  import type { RunAuthorizer } from "./run-authorizer.js";
27
42
  export declare class UnknownRunError extends Error {
28
43
  readonly runId: string;
29
44
  constructor(runId: string);
30
45
  }
31
- export interface CancelRunResult {
46
+ export type CancelRunResult = {
32
47
  readonly runId: string;
33
48
  /** The DBOS parent workflow id — equal to `runId` by the launch contract
34
49
  * (`execute_analysis` launches with `workflowId: runId`). */
@@ -40,29 +55,36 @@ export interface CancelRunResult {
40
55
  * (the conditional write refuses to clobber it).
41
56
  */
42
57
  readonly finalStatus: RunStatus;
43
- /** What actually converged. `mandate` is vacuously true for a row with no
44
- * persisted jti — nothing to revoke, so hosts alert on any false flag. */
58
+ /** What actually converged. `charge` and `mandate` are vacuously true when
59
+ * there is nothing for this cancel to converge — a refused terminal write
60
+ * (the body owns them) and, for `mandate`, a row with no persisted mandate id — so
61
+ * hosts alert on any false flag. */
45
62
  readonly converged: {
46
63
  readonly steps: boolean;
47
64
  readonly charge: boolean;
48
65
  readonly mandate: boolean;
49
66
  };
50
- }
51
- export interface RunCancelerDeps {
67
+ };
68
+ export type RunCancelerDeps = {
52
69
  readonly pool: Pool;
53
70
  readonly runCharge: RunCharge;
54
71
  readonly runAuthorizer: RunAuthorizer;
55
72
  readonly logger?: Logger;
56
- /** Test seam over the engine cancel. Production default: the workflow
73
+ /** Receives the end of a run that this canceler cancels. An absent binding, or a binding with no run emit, emits nothing. */
74
+ readonly provenance?: ProvenanceSeam;
75
+ /** The engine cancel. Production default: the workflow
57
76
  * purger's `DBOSClient`-backed cancel, child-cascading and launch-free. */
58
77
  readonly cancelWorkflows?: (workflowIds: readonly string[]) => Promise<void>;
59
- }
60
- export interface RunCanceler {
78
+ /** The run end that the body recorded: `null` when it recorded none, a rejection when the read fails.
79
+ * The value is unchecked engine data. Production default: `DBOSClient.getEvent` with a zero timeout. */
80
+ readonly readRecordedRunEnd?: (runId: string) => Promise<unknown>;
81
+ };
82
+ export type RunCanceler = {
61
83
  /**
62
84
  * Cancel the run's workflows and converge its ledgers. Rejects when the
63
85
  * engine cancel itself fails (retry-safe: nothing converged) or the run is
64
86
  * unknown; convergence-phase failures resolve with their flag false.
65
87
  */
66
88
  cancel(runId: string, session: AgentSession): Promise<CancelRunResult>;
67
- }
89
+ };
68
90
  export declare function createRunCanceler(deps: RunCancelerDeps): RunCanceler;
@@ -1,18 +1,32 @@
1
1
  /**
2
2
  * RunCanceler — the encapsulated external-cancel path for an `executeAnalysis` run.
3
3
  *
4
- * A cancelled DBOS workflow can never execute another step, so the body's own
5
- * terminal block (`collectAndComplete`) is unreachable on external cancel and
6
- * nothing converges: the run row stays `running` (blocking same-plan relaunch
7
- * through `queryActiveRun`'s active-status dedup), pending step rows never
8
- * sweep, the running charge never closes, and the run mandate is never
9
- * revoked. This module is the host-side counterpart: cancel the engine's
10
- * parent + children, then converge each ledger the workflow would have.
4
+ * A cancelled DBOS workflow can never start another step, so the body's own
5
+ * terminal block (`collectAndComplete`) can be unreachable once the cancel lands
6
+ * and nothing converges: the run row stays `running` (blocking same-plan relaunch
7
+ * through `queryActiveRun`'s active-status dedup) and pending step rows never
8
+ * sweep. A step that started before the cancel still runs to its end, and its
9
+ * run status write is conditional on a `running` row. This module is the
10
+ * host-side counterpart: cancel the engine's parent + children, then converge
11
+ * the ledgers the workflow would have.
12
+ *
13
+ * The writer that wins the conditional terminal write of the run row owns the
14
+ * run end: the run emit, the charge close, and the mandate revoke. This module
15
+ * does those acts only when its write changed the row. A refused write means
16
+ * the body won the row and owns them; a failed write leaves the row `running`,
17
+ * so a second cancel converges the run. The step rows settle on every path.
18
+ *
19
+ * One exception: after a failed status write the body does the run end and
20
+ * records it as a workflow event (`run-end-record.ts`), while the row stays
21
+ * `running`. This module reads that record before its terminal write. A present
22
+ * record makes the terminal write carry the recorded status and error, and no
23
+ * act of the run end follows. A failed read writes nothing, so a second cancel
24
+ * converges the run.
11
25
  *
12
26
  * The engine capability stays internal — the production default is the
13
27
  * purger's `DBOSClient`-backed child-cascading cancel, which needs no launched
14
28
  * engine (see `dbos-workflow-purger.ts` for why the static `DBOS` facade is
15
- * the wrong tool here). `cancelWorkflows` is an optional test seam over it.
29
+ * the wrong tool here). `cancelWorkflows` is an optional injected function over it.
16
30
  *
17
31
  * No stream writes: `DBOS.writeStream` writes only from inside the workflow
18
32
  * that owns the stream, so the run-event reader (`run-event-stream.ts`)
@@ -22,9 +36,11 @@ import { createNoopLogger } from "../lib/console-logger.js";
22
36
  import { deliverNotice } from "../lib/hooks.js";
23
37
  import { elapsedSinceIso, recordRunCompleted, recordStepCompleted } from "../lib/metrics.js";
24
38
  import { unwrapOrThrow } from "../lib/result.js";
25
- import { markRunCanceledIfActive, queryRun } from "../state/runs.js";
26
- import { queryStepsByRun, sweepPendingStepExecutions } from "../state/step-executions.js";
27
- import { createDbosWorkflowPurger } from "./dbos-workflow-purger.js";
39
+ import { markRunCanceledIfActive, queryRun, updateRunStatus } from "../state/runs.js";
40
+ import { cancelRunningStepExecutions, queryStepsByRun, sweepPendingStepExecutions } from "../state/step-executions.js";
41
+ import { clearPausesOfWork } from "../state/paused-work.js";
42
+ import { createDbosWorkflowPurger, dbosClientFor } from "./dbos-workflow-purger.js";
43
+ import { parseRecordedRunEnd, RUN_END_EVENT_KEY } from "./run-end-record.js";
28
44
  /** The reason stamped on the run row and the revoke — the same literal
29
45
  * `collectAndComplete` records for a cancel it observes from inside. */
30
46
  const EXTERNAL_CANCEL_REASON = "external_cancel";
@@ -36,7 +52,7 @@ export class UnknownRunError extends Error {
36
52
  this.name = "UnknownRunError";
37
53
  }
38
54
  }
39
- const TERMINAL = new Set(["completed", "partial", "failed", "canceled", "suspended_insufficient_funds"]);
55
+ const TERMINAL = new Set(["completed", "partial", "failed", "canceled"]);
40
56
  export function createRunCanceler(deps) {
41
57
  const { pool, runCharge, runAuthorizer } = deps;
42
58
  const logger = (deps.logger ?? createNoopLogger()).named("run-canceler");
@@ -52,9 +68,22 @@ export function createRunCanceler(deps) {
52
68
  })();
53
69
  await engineCancel(workflowIds);
54
70
  };
71
+ const readRecordedRunEnd = deps.readRecordedRunEnd ??
72
+ (async (runId) => (await dbosClientFor(pool, logger)).getEvent(runId, RUN_END_EVENT_KEY, 0));
55
73
  /** Steps whose child started (a persisted child workflow id) and has not written its terminal row. */
56
74
  const incompleteSteps = async (runId) => unwrapOrThrow(await queryStepsByRun(pool, runId)).filter((step) => step.childWorkflowId !== null && step.completedAt === null);
57
75
  const childIds = (steps) => steps.flatMap((step) => (step.childWorkflowId !== null ? [step.childWorkflowId] : []));
76
+ const emitRunEvent = deps.provenance?.emitRunEvent;
77
+ const emitGuarded = (event, session) => {
78
+ if (emitRunEvent === undefined)
79
+ return;
80
+ try {
81
+ emitRunEvent(event, session);
82
+ }
83
+ catch (err) {
84
+ logger.error("the run emit of the provenance binding threw", { runId: event.runId, event: event.type, ...logger.errorFields(err) });
85
+ }
86
+ };
58
87
  return {
59
88
  async cancel(runId, session) {
60
89
  const row = unwrapOrThrow(await queryRun(pool, runId));
@@ -89,38 +118,118 @@ export function createRunCanceler(deps) {
89
118
  catch (err) {
90
119
  logger.error("late-child cancel sweep failed", { runId, ...logger.errorFields(err) });
91
120
  }
92
- // Convergence — each phase isolated so one failure skips nothing after it.
93
- let transitioned = false;
121
+ // The cancel ended each wait of a paused step, and no workflow of the run deletes its row again.
122
+ const cleared = await clearPausesOfWork(pool, runId);
123
+ if (cleared.isErr())
124
+ logger.error("the pauses of the run did not clear", { runId, op: cleared.error.op });
125
+ // The run end that the body recorded after a failed status write. A value
126
+ // that is not a recorded run end counts as a failed read.
127
+ let recorded = null;
128
+ let readFailed = false;
94
129
  try {
95
- transitioned = unwrapOrThrow(await markRunCanceledIfActive(pool, runId, EXTERNAL_CANCEL_REASON));
130
+ const value = await readRecordedRunEnd(runId);
131
+ if (value !== null && value !== undefined) {
132
+ recorded = parseRecordedRunEnd(value);
133
+ if (recorded === null) {
134
+ readFailed = true;
135
+ logger.error("the recorded run end has the wrong shape", { runId });
136
+ }
137
+ }
96
138
  }
97
139
  catch (err) {
98
- logger.error("markRunCanceledIfActive failed", { runId, ...logger.errorFields(err) });
140
+ readFailed = true;
141
+ logger.error("the read of the recorded run end failed", { runId, ...logger.errorFields(err) });
142
+ }
143
+ // Convergence — each phase isolated so one failure skips nothing after it.
144
+ // The terminal write has three outcomes: changed (this cancel won the row),
145
+ // refused (the body won it), failed (the row is unchanged). A failed read of
146
+ // the recorded run end is a failed write that never ran.
147
+ let writeOutcome = "failed";
148
+ if (!readFailed) {
149
+ try {
150
+ const changed = recorded === null
151
+ ? unwrapOrThrow(await markRunCanceledIfActive(pool, runId, EXTERNAL_CANCEL_REASON))
152
+ : unwrapOrThrow(await updateRunStatus(pool, runId, recorded.status, recorded.error));
153
+ writeOutcome = changed ? "changed" : "refused";
154
+ }
155
+ catch (err) {
156
+ logger.error("the terminal write of the run failed", { runId, ...logger.errorFields(err) });
157
+ }
158
+ }
159
+ const transitioned = writeOutcome === "changed";
160
+ // A terminal step of the workflow that started before the cancel can still
161
+ // write, but its write is conditional on a `running` row too. The first
162
+ // write wins, and the run-end acts ride behind the write that won: a
163
+ // refused write means the run settled on its own and its own terminal step
164
+ // does them. A cut child never reached its terminal row, so its step
165
+ // records here too. A recorded run end means the body did the acts, so
166
+ // only the run metric rides behind the repair write.
167
+ if (transitioned && recorded !== null) {
168
+ recordRunCompleted({ workflow: "analysis", status: recorded.status, durationMs: elapsedSinceIso(row.startedAt) });
99
169
  }
100
- // The workflow's own terminal step never runs after a cancel, so this
101
- // conditional write is the one terminal write of an external cancel, and
102
- // the outcome metrics ride behind it: a refused write means the run
103
- // settled on its own and its own terminal step recorded them. A cut
104
- // child never reached its terminal row, so its step records here too.
105
- if (transitioned) {
170
+ if (transitioned && recorded === null) {
106
171
  recordRunCompleted({ workflow: "analysis", status: "canceled", durationMs: elapsedSinceIso(row.startedAt) });
107
172
  for (const step of cutSteps ?? [])
108
173
  recordStepCompleted({ agentId: step.agentId, status: "canceled" });
174
+ // The end of the run rides the same condition. One wall-clock read stamps every event:
175
+ // the canceler is not a workflow, so no replay fires these emits again.
176
+ const atMs = Date.now();
177
+ for (const step of cutSteps ?? []) {
178
+ const durationMs = elapsedSinceIso(step.startedAt, atMs);
179
+ const event = {
180
+ type: "step_completed",
181
+ analysisId: row.analysisId,
182
+ runId,
183
+ stepId: step.stepId,
184
+ status: "canceled",
185
+ atMs,
186
+ };
187
+ if (durationMs !== undefined)
188
+ event.durationMs = durationMs;
189
+ emitGuarded(event, session);
190
+ }
191
+ emitGuarded({
192
+ type: "run_completed",
193
+ analysisId: row.analysisId,
194
+ runId,
195
+ status: "canceled",
196
+ atMs,
197
+ durationMs: Math.max(0, atMs - Date.parse(row.startedAt)),
198
+ }, session);
109
199
  }
110
- let steps = false;
200
+ let pendingSwept = false;
111
201
  try {
112
202
  unwrapOrThrow(await sweepPendingStepExecutions(pool, runId));
113
- steps = true;
203
+ pendingSwept = true;
114
204
  }
115
205
  catch (err) {
116
206
  logger.error("pending-step sweep failed", { runId, ...logger.errorFields(err) });
117
207
  }
118
- const charge = await deliverNotice(logger.with({ runId }), "RunCharge.close", runCharge.close({ analysisId: row.analysisId, runId, outcome: { kind: "canceled" }, session }));
119
- const mandate = row.mandateJti === null ||
120
- (await deliverNotice(logger.with({ runId, jti: row.mandateJti }), "RunAuthorizer.revokeByJti", runAuthorizer.revokeByJti({ jti: row.mandateJti, auth: session.auth }, EXTERNAL_CANCEL_REASON)));
208
+ let runningSettled = false;
209
+ try {
210
+ unwrapOrThrow(await cancelRunningStepExecutions(pool, runId, EXTERNAL_CANCEL_REASON));
211
+ runningSettled = true;
212
+ }
213
+ catch (err) {
214
+ logger.error("running-step settle failed", { runId, ...logger.errorFields(err) });
215
+ }
216
+ const steps = pendingSwept && runningSettled;
217
+ // Only the writer that won the row closes the charge and revokes. A refused
218
+ // write left both to the body; a failed write left the row `running`, so a
219
+ // second cancel converges the run. The flags of a refused write are true
220
+ // because there is nothing for this cancel to converge. With a recorded run
221
+ // end the body did both acts, and the flags are its results.
222
+ let charge = recorded !== null ? recorded.closed : writeOutcome === "refused";
223
+ let mandate = recorded !== null ? recorded.revoked : writeOutcome === "refused" || (writeOutcome === "failed" && row.mandateId === null);
224
+ if (transitioned && recorded === null) {
225
+ charge = await deliverNotice(logger.with({ runId }), "RunCharge.close", runCharge.close({ analysisId: row.analysisId, runId, outcome: { kind: "canceled" }, session }));
226
+ mandate =
227
+ row.mandateId === null ||
228
+ (await deliverNotice(logger.with({ runId, mandateId: row.mandateId }), "RunAuthorizer.revokeByMandateId", runAuthorizer.revokeByMandateId({ mandateId: row.mandateId, auth: session.auth }, EXTERNAL_CANCEL_REASON)));
229
+ }
121
230
  // No transition means the run reached a terminal state on its own (or the
122
231
  // write failed) — report the row as it stands rather than claiming `canceled`.
123
- let finalStatus = "canceled";
232
+ let finalStatus = recorded?.status ?? "canceled";
124
233
  if (!transitioned) {
125
234
  const reread = unwrapOrThrow(await queryRun(pool, runId));
126
235
  finalStatus = reread?.status ?? "canceled";
@@ -0,0 +1,29 @@
1
+ import { z } from "zod";
2
+ /**
3
+ * The workflow event under which the body of `executeAnalysis` records its run
4
+ * end after a failed status write. The run canceler reads it with
5
+ * `DBOSClient.getEvent`.
6
+ */
7
+ export declare const RUN_END_EVENT_KEY = "run-end";
8
+ /**
9
+ * The run end that the body did: the status and the error that its failed
10
+ * status write tried to write, and the results of the charge close and of the
11
+ * revoke.
12
+ */
13
+ export declare const RecordedRunEndSchema: z.ZodObject<{
14
+ status: z.ZodEnum<{
15
+ canceled: "canceled";
16
+ completed: "completed";
17
+ failed: "failed";
18
+ partial: "partial";
19
+ }>;
20
+ error: z.ZodNullable<z.ZodString>;
21
+ closed: z.ZodBoolean;
22
+ revoked: z.ZodBoolean;
23
+ }, z.core.$strip>;
24
+ export type RecordedRunEnd = z.infer<typeof RecordedRunEndSchema>;
25
+ /**
26
+ * The engine hands back deserialized data, thus a value of an event is unknown
27
+ * until this check. A value of the wrong shape gives `null`.
28
+ */
29
+ export declare function parseRecordedRunEnd(value: unknown): RecordedRunEnd | null;
@@ -0,0 +1,27 @@
1
+ import { z } from "zod";
2
+ import { RunStatus } from "../state/schema.js";
3
+ /**
4
+ * The workflow event under which the body of `executeAnalysis` records its run
5
+ * end after a failed status write. The run canceler reads it with
6
+ * `DBOSClient.getEvent`.
7
+ */
8
+ export const RUN_END_EVENT_KEY = "run-end";
9
+ /**
10
+ * The run end that the body did: the status and the error that its failed
11
+ * status write tried to write, and the results of the charge close and of the
12
+ * revoke.
13
+ */
14
+ export const RecordedRunEndSchema = z.object({
15
+ status: RunStatus.exclude(["running"]),
16
+ error: z.string().nullable(),
17
+ closed: z.boolean(),
18
+ revoked: z.boolean(),
19
+ });
20
+ /**
21
+ * The engine hands back deserialized data, thus a value of an event is unknown
22
+ * until this check. A value of the wrong shape gives `null`.
23
+ */
24
+ export function parseRecordedRunEnd(value) {
25
+ const parsed = RecordedRunEndSchema.safeParse(value);
26
+ return parsed.success ? parsed.data : null;
27
+ }
@@ -17,14 +17,6 @@ import type { ChatPart } from "../contracts/chat-parts.js";
17
17
  * contract is the `ChatPart` union, so anything the registry does not
18
18
  * classify is not deliverable — which also covers a part written by a producer
19
19
  * newer than the reader.
20
- *
21
- * The registry is keyed by the discriminant alone, so this validates `type` and
22
- * trusts the producer for the payload. The part schemas in `contracts/schemas/`
23
- * are for a consumer at the edge of the package, which parses what it receives.
24
- * Both ends of this stream are typed against the same union inside this package,
25
- * so the discriminant is the boundary that can drift (a producer that emits
26
- * something else entirely), and a part that fails its schema still reaches the
27
- * consumer for its own check.
28
20
  */
29
21
  export declare function parseRunEventPart(value: unknown): ChatPart | null;
30
22
  /**
@@ -7,8 +7,23 @@
7
7
  * They live apart from the reader, thus a test drives them directly instead of
8
8
  * through a subscription.
9
9
  */
10
+ import { setTimeout as sleep } from "node:timers/promises";
10
11
  import { reconcileKey } from "../contracts/chat-frame.js";
11
12
  import { PART_REGISTRY } from "../contracts/part-registry.js";
13
+ import { parseUnknownRecord } from "../lib/unknown-containers.js";
14
+ /**
15
+ * The registry is keyed by the discriminant alone, so this validates `type` and
16
+ * trusts the producer for the payload. The part schemas in `contracts/schemas/`
17
+ * are for a consumer at the edge of the package, which parses what it receives.
18
+ * Both ends of this stream are typed against the same union inside this package,
19
+ * so the discriminant is the boundary that can drift (a producer that emits
20
+ * something else entirely), and a part that fails its schema still reaches the
21
+ * consumer for its own check.
22
+ */
23
+ function isChatPartRecord(record) {
24
+ const { type } = record;
25
+ return typeof type === "string" && Object.hasOwn(PART_REGISTRY, type);
26
+ }
12
27
  /**
13
28
  * Narrow one raw stream value to a chat data part, or `null` when it is not one.
14
29
  *
@@ -18,24 +33,12 @@ import { PART_REGISTRY } from "../contracts/part-registry.js";
18
33
  * contract is the `ChatPart` union, so anything the registry does not
19
34
  * classify is not deliverable — which also covers a part written by a producer
20
35
  * newer than the reader.
21
- *
22
- * The registry is keyed by the discriminant alone, so this validates `type` and
23
- * trusts the producer for the payload. The part schemas in `contracts/schemas/`
24
- * are for a consumer at the edge of the package, which parses what it receives.
25
- * Both ends of this stream are typed against the same union inside this package,
26
- * so the discriminant is the boundary that can drift (a producer that emits
27
- * something else entirely), and a part that fails its schema still reaches the
28
- * consumer for its own check.
29
36
  */
30
37
  export function parseRunEventPart(value) {
31
- if (typeof value !== "object" || value === null)
32
- return null;
33
- const type = value.type;
34
- if (typeof type !== "string")
38
+ const record = parseUnknownRecord(value);
39
+ if (record === undefined || !isChatPartRecord(record))
35
40
  return null;
36
- if (!Object.hasOwn(PART_REGISTRY, type))
37
- return null;
38
- return value;
41
+ return record;
39
42
  }
40
43
  /**
41
44
  * Collapse a batch of parts so each reconciling id appears once, carrying its
@@ -78,10 +81,12 @@ export function foldRunEventParts(parts) {
78
81
  export async function pipeFoldedRunEvents(entries, emit, flushMs) {
79
82
  const latestByKey = new Map();
80
83
  const pendingKeys = new Set();
81
- let flushTimer = null;
84
+ // The gate of the one armed flush wait: present while a window is open, so a
85
+ // second entry in the window reuses it instead of arming a second flush.
86
+ let flushGate;
82
87
  let flushChain = Promise.resolve();
83
88
  const flushPending = async () => {
84
- flushTimer = null;
89
+ flushGate = undefined;
85
90
  const keys = [...pendingKeys];
86
91
  pendingKeys.clear();
87
92
  for (const key of keys) {
@@ -91,14 +96,15 @@ export async function pipeFoldedRunEvents(entries, emit, flushMs) {
91
96
  }
92
97
  };
93
98
  const scheduleFlush = () => {
94
- if (flushTimer !== null)
99
+ if (flushGate !== undefined)
95
100
  return;
96
- flushTimer = setTimeout(() => {
101
+ flushGate = new AbortController();
102
+ sleep(flushMs, undefined, { signal: flushGate.signal }).then(() => {
97
103
  // A timed flush has no caller to report to. A lasting emit failure
98
104
  // still reaches the caller, through the next direct emit or the
99
105
  // final flush.
100
106
  flushChain = flushChain.then(flushPending).catch(() => undefined);
101
- }, flushMs);
107
+ }, () => undefined);
102
108
  };
103
109
  try {
104
110
  for await (const entry of entries) {
@@ -114,10 +120,9 @@ export async function pipeFoldedRunEvents(entries, emit, flushMs) {
114
120
  }
115
121
  }
116
122
  finally {
117
- if (flushTimer !== null) {
118
- clearTimeout(flushTimer);
119
- flushTimer = null;
120
- }
123
+ // The abort ends the armed wait, whose rejection the second arm swallows,
124
+ // so the teardown does not wait out the window.
125
+ flushGate?.abort();
121
126
  await flushChain;
122
127
  if (pendingKeys.size > 0)
123
128
  await flushPending();
@@ -37,17 +37,17 @@ import { type DbError } from "../lib/db-result.js";
37
37
  import type { Logger } from "../lib/logger.js";
38
38
  import type { RunStatus } from "../state/schema.js";
39
39
  /** The part of a run row that the terminal part is made from. */
40
- export interface RunEventRunRead {
40
+ export type RunEventRunRead = {
41
41
  readonly status: RunStatus;
42
42
  readonly error: string | null;
43
- }
43
+ };
44
44
  /**
45
45
  * Construction-time dependencies. The pool is the application pool the run
46
46
  * ledger lives in; the logger is where every contained failure is reported, and
47
47
  * defaults to silence so an embedder that wired none sees nothing rather than
48
48
  * having console forced on it.
49
49
  */
50
- export interface RunEventStreamDeps {
50
+ export type RunEventStreamDeps = {
51
51
  readonly pool: Pool;
52
52
  readonly logger?: Logger;
53
53
  /** Reads the status and the error of the run row, `null` when no row exists. Defaults to `queryRun` on `pool`. */
@@ -59,7 +59,7 @@ export interface RunEventStreamDeps {
59
59
  readonly readWorkflowStatus?: (runId: string) => Promise<string | null>;
60
60
  /** The wait between two reads of the run row. Defaults to a timer. */
61
61
  readonly sleep?: (ms: number) => Promise<void>;
62
- }
62
+ };
63
63
  /**
64
64
  * Receives one part. May be async — the subscription awaits it, so a handler is
65
65
  * never invoked concurrently with itself and back-pressure is the caller's to
@@ -67,20 +67,20 @@ export interface RunEventStreamDeps {
67
67
  */
68
68
  export type RunEventPartHandler = (part: ChatPart) => void | Promise<void>;
69
69
  /** Call-time parameters of one subscription. */
70
- export interface RunEventSubscribeOptions {
70
+ export type RunEventSubscribeOptions = {
71
71
  /** The run to observe. Also the parent workflow's id. */
72
72
  readonly runId: string;
73
73
  /** Where each delivered part goes. */
74
74
  readonly onPart: RunEventPartHandler;
75
75
  /** Aborting stops delivery and settles the returned promise. */
76
76
  readonly signal: AbortSignal;
77
- }
77
+ };
78
78
  /**
79
79
  * The run-event read seam. One method, because a run-scoped subscription is the
80
80
  * whole capability: a general-purpose stream reader would leak the engine's model
81
81
  * back into the surface this exists to quarantine.
82
82
  */
83
- export interface RunEventStream {
83
+ export type RunEventStream = {
84
84
  /**
85
85
  * Deliver every part the run produces — parent and children alike — to
86
86
  * `onPart`, resolving when the run is terminal, every stream opened has
@@ -103,7 +103,7 @@ export interface RunEventStream {
103
103
  * `runId`/`stepId` and the reconciling fold is per id.
104
104
  */
105
105
  subscribe(options: RunEventSubscribeOptions): Promise<void>;
106
- }
106
+ };
107
107
  /**
108
108
  * Build the DBOS-backed realization of {@link RunEventStream}.
109
109
  *
@@ -43,10 +43,6 @@ function partOfRow(runId, row) {
43
43
  switch (row.status) {
44
44
  case "canceled":
45
45
  return canceledPart(runId);
46
- case "suspended_insufficient_funds":
47
- return row.error === null
48
- ? { type: "data-run-failed", runId, error: "Run suspended" }
49
- : { type: "data-run-failed", runId, error: row.error, reason: row.error };
50
46
  case "failed":
51
47
  return { type: "data-run-failed", runId, error: row.error ?? "Run failed" };
52
48
  case "completed":
@@ -138,6 +134,7 @@ export function createRunEventStream(deps) {
138
134
  while (pending.length > 0 && !signal.aborted) {
139
135
  const batch = pending.splice(0, pending.length);
140
136
  for (const part of foldRunEventParts(batch)) {
137
+ // oxlint-disable-next-line no-unnecessary-condition -- tsgolint cannot see the event wiring that aborts the signal; the re-check after each part is live (cancel stops delivery).
141
138
  if (signal.aborted)
142
139
  return;
143
140
  try {
@@ -228,6 +225,7 @@ export function createRunEventStream(deps) {
228
225
  if (signal.aborted)
229
226
  return;
230
227
  await discoverChildren();
228
+ // oxlint-disable-next-line no-unnecessary-condition -- tsgolint cannot see the event-wired abort or the parentRead .finally that sets parentDrained; both checks are live (discovery stops on cancel or a drained parent).
231
229
  if (signal.aborted || parentDrained)
232
230
  return;
233
231
  await Promise.race([sleep(CHILD_DISCOVERY_INTERVAL_MS), aborted, parentRead]);
@@ -289,6 +287,7 @@ export function createRunEventStream(deps) {
289
287
  await discovery;
290
288
  await parentRead;
291
289
  await Promise.all(childReads);
290
+ // oxlint-disable-next-line no-unnecessary-condition -- tsgolint cannot see the readWorkflowStream closure that sets sawTerminal or the event-wired abort; the fallback that mints the missing terminal part is live.
292
291
  if (!sawTerminal && !signal.aborted) {
293
292
  const terminal = await missingTerminalPart();
294
293
  if (terminal !== null)
@@ -10,11 +10,11 @@
10
10
  * reference, typed `(input) => Promise<result>`; the launcher only owns the
11
11
  * start/await/cancel mechanics around it.
12
12
  */
13
- export interface LaunchOptions {
13
+ export type LaunchOptions = {
14
14
  /** Caller-chosen durable workflow id (e.g. the runId). */
15
15
  readonly workflowId: string;
16
- }
17
- export interface RunLauncher {
16
+ };
17
+ export type RunLauncher = {
18
18
  /** Fire-and-forget: resolves once the run is durably started. */
19
19
  launch<I>(workflow: (input: I) => Promise<unknown>, opts: LaunchOptions, input: I): Promise<void>;
20
- }
20
+ };