@inflexa-ai/harness 0.45.1 → 0.46.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (789) hide show
  1. package/README.md +6 -3
  2. package/dist/agents/conversation-agent.d.ts +9 -3
  3. package/dist/agents/conversation-agent.js +34 -33
  4. package/dist/agents/report-session-agent.d.ts +15 -15
  5. package/dist/agents/report-session-agent.js +23 -15
  6. package/dist/agents/sandbox/index.d.ts +1 -1
  7. package/dist/agents/sandbox/index.js +1 -1
  8. package/dist/agents/sandbox/shared.d.ts +12 -14
  9. package/dist/agents/sandbox/shared.js +18 -12
  10. package/dist/agents/sandbox/types.d.ts +4 -4
  11. package/dist/agents/sandbox/validate-skills.d.ts +2 -2
  12. package/dist/agents/sandbox/validate-skills.js +3 -1
  13. package/dist/agents/sandbox-catalog.d.ts +2 -2
  14. package/dist/agents/sandbox-catalog.js +3 -3
  15. package/dist/agents/system-prompt.d.ts +2 -2
  16. package/dist/app/chat-turn-workflow.d.ts +114 -0
  17. package/dist/app/chat-turn-workflow.js +307 -0
  18. package/dist/app/chat-turn.d.ts +85 -57
  19. package/dist/app/chat-turn.js +123 -100
  20. package/dist/app/data-profile-orientation.js +10 -8
  21. package/dist/app/data-profile-view.d.ts +4 -4
  22. package/dist/app/data-profile-view.js +9 -8
  23. package/dist/app/in-process-turn.d.ts +42 -0
  24. package/dist/app/in-process-turn.js +139 -0
  25. package/dist/app/message-assembly.d.ts +10 -4
  26. package/dist/app/message-assembly.js +13 -8
  27. package/dist/app/report-session-runtime.d.ts +4 -4
  28. package/dist/app/report-session-runtime.js +36 -21
  29. package/dist/app/spawn-report-session.d.ts +33 -28
  30. package/dist/app/spawn-report-session.js +25 -40
  31. package/dist/app/synthesize-run.d.ts +22 -16
  32. package/dist/app/synthesize-run.js +41 -35
  33. package/dist/app/work.d.ts +96 -0
  34. package/dist/app/work.js +147 -0
  35. package/dist/auth/local-auth-context.d.ts +1 -3
  36. package/dist/auth/local-auth-context.js +1 -3
  37. package/dist/auth/local-run-authorizer.d.ts +1 -1
  38. package/dist/auth/local-run-authorizer.js +5 -3
  39. package/dist/auth/types.d.ts +26 -26
  40. package/dist/billing/cached-resolver.d.ts +4 -4
  41. package/dist/billing/run-charge.d.ts +5 -8
  42. package/dist/billing/run-charge.js +2 -2
  43. package/dist/billing/usage-recorder.d.ts +9 -9
  44. package/dist/citations/aggregate.js +1 -1
  45. package/dist/citations/clients/arxiv.d.ts +2 -2
  46. package/dist/citations/clients/arxiv.js +12 -4
  47. package/dist/citations/clients/common.js +4 -2
  48. package/dist/citations/clients/crossref.d.ts +2 -2
  49. package/dist/citations/clients/crossref.js +37 -37
  50. package/dist/citations/clients/doi-registry.js +15 -16
  51. package/dist/citations/clients/pubmed.d.ts +2 -2
  52. package/dist/citations/clients/pubmed.js +20 -13
  53. package/dist/citations/clients/semantic-scholar.d.ts +2 -2
  54. package/dist/citations/clients/semantic-scholar.js +9 -9
  55. package/dist/citations/compare.js +2 -2
  56. package/dist/citations/match.d.ts +2 -2
  57. package/dist/citations/match.js +12 -7
  58. package/dist/citations/normalize.js +35 -26
  59. package/dist/citations/plan.js +6 -2
  60. package/dist/citations/resolve.d.ts +6 -6
  61. package/dist/citations/resolve.js +34 -25
  62. package/dist/citations/types.d.ts +77 -77
  63. package/dist/config/environment-stores.d.ts +6 -6
  64. package/dist/config/resource-limits.js +1 -3
  65. package/dist/contracts/analogy-report.d.ts +7 -7
  66. package/dist/contracts/analogy-report.js +2 -2
  67. package/dist/contracts/chat-events.d.ts +38 -24
  68. package/dist/contracts/chat-frame.d.ts +15 -5
  69. package/dist/contracts/chat-frame.js +64 -41
  70. package/dist/contracts/chat-parts.d.ts +130 -67
  71. package/dist/contracts/chat-parts.js +1 -0
  72. package/dist/contracts/content-url.js +16 -2
  73. package/dist/contracts/data-profile.d.ts +38 -38
  74. package/dist/contracts/index.d.ts +2 -2
  75. package/dist/contracts/index.js +1 -1
  76. package/dist/contracts/message.d.ts +6 -6
  77. package/dist/contracts/organ-system.d.ts +11 -11
  78. package/dist/contracts/part-registry.d.ts +5 -4
  79. package/dist/contracts/part-registry.js +5 -0
  80. package/dist/contracts/profile-vocabulary.d.ts +11 -10
  81. package/dist/contracts/profile-vocabulary.js +10 -3
  82. package/dist/contracts/report-blocks.d.ts +329 -329
  83. package/dist/contracts/report-reference.d.ts +105 -81
  84. package/dist/contracts/report-reference.js +30 -13
  85. package/dist/contracts/schemas/chat-events.d.ts +30 -16
  86. package/dist/contracts/schemas/chat-events.js +15 -6
  87. package/dist/contracts/schemas/chat-parts.d.ts +175 -102
  88. package/dist/contracts/schemas/chat-parts.js +33 -7
  89. package/dist/contracts/severity.d.ts +1 -1
  90. package/dist/contracts/structure-source.d.ts +3 -3
  91. package/dist/contracts/structure-source.js +6 -2
  92. package/dist/contracts/subagent-activity.d.ts +2 -2
  93. package/dist/contracts/subagent-activity.js +5 -3
  94. package/dist/contracts/usage.d.ts +2 -2
  95. package/dist/data/safety-panel-schema.d.ts +25 -25
  96. package/dist/data/safety-panel-schema.js +13 -4
  97. package/dist/execution/artifact-metadata.d.ts +23 -15
  98. package/dist/execution/artifact-metadata.js +33 -10
  99. package/dist/execution/artifact-record.d.ts +2 -2
  100. package/dist/execution/artifact-registration.d.ts +5 -5
  101. package/dist/execution/artifact-registry.d.ts +8 -8
  102. package/dist/execution/dbos-run-launcher.d.ts +24 -4
  103. package/dist/execution/dbos-run-launcher.js +58 -4
  104. package/dist/execution/dbos-workflow-purger.d.ts +5 -6
  105. package/dist/execution/dbos-workflow-purger.js +8 -7
  106. package/dist/execution/input-signature.d.ts +2 -2
  107. package/dist/execution/post-step-pipeline.d.ts +9 -9
  108. package/dist/execution/post-step-pipeline.js +1 -1
  109. package/dist/execution/post-step.js +2 -2
  110. package/dist/execution/reconcile-manifest.d.ts +4 -4
  111. package/dist/execution/reconcile-manifest.js +3 -2
  112. package/dist/execution/run-authorizer.d.ts +46 -37
  113. package/dist/execution/run-authorizer.js +8 -8
  114. package/dist/execution/run-canceler.d.ts +7 -7
  115. package/dist/execution/run-canceler.js +14 -7
  116. package/dist/execution/run-end-record.d.ts +2 -3
  117. package/dist/execution/run-event-parts.d.ts +0 -8
  118. package/dist/execution/run-event-parts.js +29 -24
  119. package/dist/execution/run-event-stream.d.ts +8 -8
  120. package/dist/execution/run-event-stream.js +3 -4
  121. package/dist/execution/run-launcher.d.ts +4 -4
  122. package/dist/execution/run-synthesis.d.ts +49 -48
  123. package/dist/execution/run-synthesis.js +96 -255
  124. package/dist/execution/staged-input.d.ts +2 -2
  125. package/dist/execution/step-summary.d.ts +6 -6
  126. package/dist/execution/step-summary.js +4 -8
  127. package/dist/execution/topo-sort.js +4 -3
  128. package/dist/execution/workflow-purger.d.ts +2 -2
  129. package/dist/index.d.ts +17 -20
  130. package/dist/index.js +25 -36
  131. package/dist/input-sanitization.js +9 -2
  132. package/dist/input-scan/clustering.d.ts +6 -6
  133. package/dist/input-scan/clustering.js +11 -5
  134. package/dist/input-scan/companions.js +3 -2
  135. package/dist/input-scan/detect-sets.d.ts +2 -2
  136. package/dist/input-scan/detect-sets.js +25 -21
  137. package/dist/input-scan/enrich.d.ts +6 -6
  138. package/dist/input-scan/enrich.js +29 -12
  139. package/dist/input-scan/formats.d.ts +2 -2
  140. package/dist/input-scan/formats.js +8 -2
  141. package/dist/input-scan/markers.d.ts +2 -2
  142. package/dist/input-scan/markers.js +14 -5
  143. package/dist/input-scan/menu.d.ts +10 -10
  144. package/dist/input-scan/menu.js +0 -0
  145. package/dist/input-scan/quarantine.d.ts +2 -2
  146. package/dist/input-scan/quarantine.js +23 -18
  147. package/dist/input-scan/readout-budget.d.ts +2 -2
  148. package/dist/input-scan/readout-budget.js +1 -1
  149. package/dist/input-scan/readout.d.ts +2 -2
  150. package/dist/input-scan/readout.js +47 -34
  151. package/dist/input-scan/scan.d.ts +2 -2
  152. package/dist/input-scan/scan.js +7 -5
  153. package/dist/input-scan/set-types.d.ts +28 -28
  154. package/dist/input-scan/shapes.d.ts +4 -4
  155. package/dist/input-scan/shapes.js +0 -0
  156. package/dist/input-scan/templates.d.ts +10 -10
  157. package/dist/input-scan/templates.js +30 -22
  158. package/dist/input-scan/tokens.d.ts +6 -4
  159. package/dist/input-scan/tokens.js +100 -38
  160. package/dist/input-scan/types.d.ts +22 -22
  161. package/dist/lib/async-utils.d.ts +3 -7
  162. package/dist/lib/async-utils.js +5 -9
  163. package/dist/lib/cache.js +1 -1
  164. package/dist/lib/chrome.d.ts +46 -6
  165. package/dist/lib/console-logger.js +2 -2
  166. package/dist/lib/db-result.d.ts +22 -6
  167. package/dist/lib/db-result.js +9 -13
  168. package/dist/lib/eyes.d.ts +4 -4
  169. package/dist/lib/eyes.js +1 -1
  170. package/dist/lib/fs-helpers.js +18 -6
  171. package/dist/lib/fs-result.d.ts +1 -0
  172. package/dist/lib/fs-result.js +5 -6
  173. package/dist/lib/hooks.d.ts +23 -7
  174. package/dist/lib/hooks.js +17 -3
  175. package/dist/lib/host-concurrency.js +3 -2
  176. package/dist/lib/logger.d.ts +2 -2
  177. package/dist/lib/logger.js +2 -1
  178. package/dist/lib/metrics.d.ts +1 -1
  179. package/dist/lib/null-proto.d.ts +6 -0
  180. package/dist/lib/null-proto.js +17 -0
  181. package/dist/lib/otel-spans.d.ts +1 -1
  182. package/dist/lib/otel-spans.js +9 -5
  183. package/dist/lib/otel.d.ts +4 -2
  184. package/dist/lib/otel.js +10 -2
  185. package/dist/lib/page-capture.d.ts +8 -8
  186. package/dist/lib/page-capture.js +9 -4
  187. package/dist/lib/parse-json.d.ts +5 -0
  188. package/dist/lib/parse-json.js +12 -0
  189. package/dist/lib/present.d.ts +12 -0
  190. package/dist/lib/present.js +39 -0
  191. package/dist/lib/rate-limit.d.ts +4 -4
  192. package/dist/lib/rate-limit.js +12 -13
  193. package/dist/lib/regulatory-corpus/fetch-fda-guidance.d.ts +4 -4
  194. package/dist/lib/regulatory-corpus/fetch-fda-guidance.js +4 -10
  195. package/dist/lib/regulatory-corpus/fetch-ich.d.ts +4 -4
  196. package/dist/lib/regulatory-corpus/fetch-ich.js +18 -14
  197. package/dist/lib/regulatory-corpus/normalize-whitespace.d.ts +6 -0
  198. package/dist/lib/regulatory-corpus/normalize-whitespace.js +41 -0
  199. package/dist/lib/regulatory-corpus.d.ts +10 -10
  200. package/dist/lib/regulatory-corpus.js +3 -1
  201. package/dist/lib/result.d.ts +10 -11
  202. package/dist/lib/result.js +15 -13
  203. package/dist/lib/storage.d.ts +2 -2
  204. package/dist/lib/test/async-iterable.d.ts +9 -0
  205. package/dist/lib/test/async-iterable.js +28 -0
  206. package/dist/lib/test/request-url.d.ts +5 -0
  207. package/dist/lib/test/request-url.js +7 -0
  208. package/dist/lib/test/result-assert.d.ts +12 -0
  209. package/dist/lib/test/result-assert.js +17 -0
  210. package/dist/lib/test/text-shapes.d.ts +24 -0
  211. package/dist/lib/test/text-shapes.js +63 -0
  212. package/dist/lib/text.d.ts +22 -0
  213. package/dist/lib/text.js +68 -0
  214. package/dist/lib/thrown.d.ts +18 -0
  215. package/dist/lib/thrown.js +30 -0
  216. package/dist/lib/unknown-array.d.ts +6 -0
  217. package/dist/lib/unknown-array.js +8 -0
  218. package/dist/lib/unknown-containers.d.ts +14 -0
  219. package/dist/lib/unknown-containers.js +17 -0
  220. package/dist/lib/unknown-text.d.ts +8 -0
  221. package/dist/lib/unknown-text.js +28 -0
  222. package/dist/lib/zod-issue-shape.d.ts +1 -1
  223. package/dist/lib/zod-issue-shape.js +31 -31
  224. package/dist/lib/zod-issues.d.ts +3 -3
  225. package/dist/lib/zod-issues.js +30 -17
  226. package/dist/literature/sources/arxiv.d.ts +6 -6
  227. package/dist/literature/sources/arxiv.js +92 -35
  228. package/dist/literature/sources/http.d.ts +2 -2
  229. package/dist/literature/sources/http.js +16 -15
  230. package/dist/literature/sources/pubmed.d.ts +16 -16
  231. package/dist/literature/sources/pubmed.js +96 -61
  232. package/dist/literature/sources/semantic-scholar.d.ts +8 -8
  233. package/dist/literature/sources/semantic-scholar.js +22 -13
  234. package/dist/loop/accounting.d.ts +63 -0
  235. package/dist/loop/accounting.js +141 -0
  236. package/dist/loop/call-policy.d.ts +73 -0
  237. package/dist/loop/call-policy.js +109 -0
  238. package/dist/loop/chat-stream.d.ts +62 -0
  239. package/dist/loop/chat-stream.js +237 -0
  240. package/dist/loop/compaction.d.ts +9 -9
  241. package/dist/loop/compaction.js +1 -1
  242. package/dist/loop/metrics.d.ts +12 -15
  243. package/dist/loop/metrics.js +14 -26
  244. package/dist/loop/run-loop.d.ts +233 -0
  245. package/dist/loop/run-loop.js +770 -0
  246. package/dist/loop/sub-agent.d.ts +61 -0
  247. package/dist/loop/sub-agent.js +161 -0
  248. package/dist/loop/tool-adapter.d.ts +98 -0
  249. package/dist/loop/tool-adapter.js +364 -0
  250. package/dist/loop/tool-detail.d.ts +1 -1
  251. package/dist/loop/tool-detail.js +6 -5
  252. package/dist/loop/tool-outcome.d.ts +1 -1
  253. package/dist/loop/tool-output.d.ts +4 -4
  254. package/dist/loop/tool-output.js +2 -2
  255. package/dist/loop/turn-credentials.d.ts +34 -0
  256. package/dist/loop/turn-credentials.js +73 -0
  257. package/dist/loop/types.d.ts +29 -38
  258. package/dist/loop/types.js +2 -7
  259. package/dist/memory/ai-sdk-message-storage.d.ts +5 -5
  260. package/dist/memory/ai-sdk-message-storage.js +13 -11
  261. package/dist/memory/card-builders.d.ts +14 -14
  262. package/dist/memory/card-builders.js +19 -15
  263. package/dist/memory/conversation-display-recorder.d.ts +22 -4
  264. package/dist/memory/conversation-display-recorder.js +43 -24
  265. package/dist/memory/conversation-display-replay.js +3 -2
  266. package/dist/memory/conversation-display-storage.d.ts +15 -7
  267. package/dist/memory/conversation-display-storage.js +141 -36
  268. package/dist/memory/conversation-view.d.ts +4 -4
  269. package/dist/memory/conversation-view.js +5 -4
  270. package/dist/memory/count-tokens.js +10 -8
  271. package/dist/memory/derive-thread-title.d.ts +0 -13
  272. package/dist/memory/derive-thread-title.js +2 -1
  273. package/dist/memory/message-backfill.d.ts +12 -5
  274. package/dist/memory/message-backfill.js +5 -3
  275. package/dist/memory/thread-history.d.ts +36 -21
  276. package/dist/memory/thread-history.js +78 -54
  277. package/dist/memory/thread-store.d.ts +26 -17
  278. package/dist/memory/thread-store.js +15 -9
  279. package/dist/memory/tool-call-integrity.d.ts +2 -2
  280. package/dist/memory/tool-call-integrity.js +4 -3
  281. package/dist/memory/working-memory.d.ts +16 -12
  282. package/dist/memory/working-memory.js +72 -61
  283. package/dist/prompts/briefing.d.ts +12 -12
  284. package/dist/prompts/briefing.js +1 -1
  285. package/dist/prompts/synthesis-agent.d.ts +1 -1
  286. package/dist/prompts/synthesis-agent.js +6 -14
  287. package/dist/provenance/collector.d.ts +6 -6
  288. package/dist/provenance/collector.js +15 -8
  289. package/dist/provenance/exec-frame.d.ts +2 -2
  290. package/dist/provenance/exec-frame.js +6 -1
  291. package/dist/provenance/seam.d.ts +1 -4
  292. package/dist/provenance/types.d.ts +6 -6
  293. package/dist/providers/ai-sdk.d.ts +113 -62
  294. package/dist/providers/ai-sdk.js +283 -518
  295. package/dist/providers/embedding.d.ts +2 -2
  296. package/dist/providers/embedding.js +1 -1
  297. package/dist/providers/errors.d.ts +22 -2
  298. package/dist/providers/errors.js +98 -50
  299. package/dist/providers/prompt-cache.d.ts +8 -8
  300. package/dist/providers/prompt-cache.js +13 -11
  301. package/dist/providers/reasoning.d.ts +2 -2
  302. package/dist/providers/reasoning.js +2 -2
  303. package/dist/providers/types.d.ts +55 -94
  304. package/dist/reference-data/catalog.d.ts +2 -15
  305. package/dist/reference-data/catalog.js +25 -8
  306. package/dist/reference-data/receipt.d.ts +2 -2
  307. package/dist/report-model/assert-rules.js +1 -1
  308. package/dist/report-model/authoring-grammar.d.ts +211 -233
  309. package/dist/report-model/block-walk.d.ts +10 -10
  310. package/dist/report-model/block-walk.js +2 -0
  311. package/dist/report-model/draft-finish.d.ts +8 -8
  312. package/dist/report-model/draft-finish.js +1 -1
  313. package/dist/report-model/draft-hash.js +8 -7
  314. package/dist/report-model/draft-operations.d.ts +22 -10
  315. package/dist/report-model/draft-operations.js +48 -30
  316. package/dist/report-model/draft-read.d.ts +19 -7
  317. package/dist/report-model/draft-read.js +16 -6
  318. package/dist/report-model/draft.d.ts +844 -2
  319. package/dist/report-model/draft.js +3 -1
  320. package/dist/report-model/fixture-resolver.js +39 -16
  321. package/dist/report-model/pin-snapshot.d.ts +2 -2
  322. package/dist/report-model/pin-snapshot.js +15 -15
  323. package/dist/report-model/production-resolver.d.ts +18 -18
  324. package/dist/report-model/production-resolver.js +50 -42
  325. package/dist/report-model/reference-resolver.d.ts +26 -10
  326. package/dist/report-model/reference-resolver.js +68 -5
  327. package/dist/report-model/reference-stamp.js +30 -38
  328. package/dist/report-model/structural-validation.js +12 -4
  329. package/dist/report-model/validate.d.ts +7 -7
  330. package/dist/report-model/validate.js +6 -6
  331. package/dist/report-render/assets.d.ts +2 -2
  332. package/dist/report-render/assets.js +27 -3
  333. package/dist/report-render/chart-export.d.ts +10 -2
  334. package/dist/report-render/chart-export.js +37 -11
  335. package/dist/report-render/chart-presets.d.ts +8 -8
  336. package/dist/report-render/chart-presets.js +3 -3
  337. package/dist/report-render/chart-renderers.d.ts +23 -16
  338. package/dist/report-render/chart-renderers.js +74 -53
  339. package/dist/report-render/chart-toolbox.d.ts +2 -2
  340. package/dist/report-render/chart-toolbox.js +7 -6
  341. package/dist/report-render/chart.d.ts +15 -16
  342. package/dist/report-render/chart.js +369 -252
  343. package/dist/report-render/design.d.ts +36 -297
  344. package/dist/report-render/design.js +0 -12
  345. package/dist/report-render/figures/common.d.ts +12 -12
  346. package/dist/report-render/figures/common.js +42 -31
  347. package/dist/report-render/figures/dendrogram.d.ts +3 -3
  348. package/dist/report-render/figures/dendrogram.js +10 -10
  349. package/dist/report-render/figures/dense.js +15 -8
  350. package/dist/report-render/figures/dotplot.js +46 -33
  351. package/dist/report-render/figures/embedding.js +52 -43
  352. package/dist/report-render/figures/equal-units.d.ts +10 -10
  353. package/dist/report-render/figures/equal-units.js +27 -27
  354. package/dist/report-render/figures/forest.js +9 -7
  355. package/dist/report-render/figures/gsea.js +21 -11
  356. package/dist/report-render/figures/heatmap.js +13 -9
  357. package/dist/report-render/figures/index.d.ts +10 -10
  358. package/dist/report-render/figures/index.js +4 -2
  359. package/dist/report-render/figures/km.js +10 -9
  360. package/dist/report-render/figures/label-room.d.ts +12 -12
  361. package/dist/report-render/figures/label-room.js +7 -2
  362. package/dist/report-render/figures/locuszoom.d.ts +2 -2
  363. package/dist/report-render/figures/locuszoom.js +59 -31
  364. package/dist/report-render/figures/lollipop.js +3 -2
  365. package/dist/report-render/figures/ma.js +8 -4
  366. package/dist/report-render/figures/manhattan.d.ts +1 -2
  367. package/dist/report-render/figures/manhattan.js +52 -34
  368. package/dist/report-render/figures/oncoprint.js +4 -5
  369. package/dist/report-render/figures/pca.js +25 -11
  370. package/dist/report-render/figures/qq.js +20 -9
  371. package/dist/report-render/figures/roc.js +1 -1
  372. package/dist/report-render/figures/sankey.d.ts +2 -2
  373. package/dist/report-render/figures/sankey.js +11 -10
  374. package/dist/report-render/figures/upset.d.ts +6 -6
  375. package/dist/report-render/figures/upset.js +7 -4
  376. package/dist/report-render/figures/volcano.js +12 -10
  377. package/dist/report-render/hybrid-svg.d.ts +4 -4
  378. package/dist/report-render/hybrid-svg.js +7 -5
  379. package/dist/report-render/number-format.d.ts +4 -4
  380. package/dist/report-render/number-format.js +62 -27
  381. package/dist/report-render/page.js +2 -1
  382. package/dist/report-render/provenance-data.d.ts +2 -2
  383. package/dist/report-render/references.d.ts +4 -4
  384. package/dist/report-render/render.d.ts +2 -2
  385. package/dist/report-render/render.js +10 -11
  386. package/dist/report-render/script-json.js +1 -1
  387. package/dist/report-render/table-data.d.ts +6 -6
  388. package/dist/report-render/test/options.d.ts +49 -0
  389. package/dist/report-render/test/options.js +143 -0
  390. package/dist/report-render/test/page-function.d.ts +19 -0
  391. package/dist/report-render/test/page-function.js +33 -0
  392. package/dist/report-render/types.d.ts +10 -10
  393. package/dist/report-render/value-bridge.d.ts +4 -4
  394. package/dist/report-render/value-bridge.js +27 -14
  395. package/dist/report-render/views/chart-view.d.ts +2 -2
  396. package/dist/report-render/views/chart-view.js +2 -2
  397. package/dist/report-render/views/lineage.d.ts +6 -6
  398. package/dist/report-render/views/lineage.js +2 -0
  399. package/dist/report-render/views/page-view.d.ts +2 -2
  400. package/dist/report-render/views/page-view.js +1 -0
  401. package/dist/report-render/views/prose.js +25 -8
  402. package/dist/report-render/views/references-view.js +12 -1
  403. package/dist/report-render/views/values.js +1 -1
  404. package/dist/runtime/assemble.d.ts +53 -26
  405. package/dist/runtime/assemble.js +103 -56
  406. package/dist/runtime/boot.d.ts +8 -7
  407. package/dist/runtime/boot.js +1 -1
  408. package/dist/runtime/connection-budget.d.ts +6 -6
  409. package/dist/runtime/connection-budget.js +1 -1
  410. package/dist/runtime/dbos.d.ts +29 -19
  411. package/dist/runtime/dbos.js +35 -20
  412. package/dist/runtime/result-serialization.js +18 -5
  413. package/dist/runtime/shutdown.d.ts +2 -2
  414. package/dist/sandbox/client.d.ts +7 -3
  415. package/dist/sandbox/cpu-files.d.ts +2 -2
  416. package/dist/sandbox/cpu-files.js +21 -4
  417. package/dist/sandbox/create-sandbox.d.ts +7 -8
  418. package/dist/sandbox/create-sandbox.js +6 -12
  419. package/dist/sandbox/docker-client.d.ts +48 -3
  420. package/dist/sandbox/docker-client.js +10 -6
  421. package/dist/sandbox/estimate-data-profile-resources.js +2 -7
  422. package/dist/sandbox/exec-outcome.d.ts +2 -2
  423. package/dist/sandbox/exec-outcome.js +1 -1
  424. package/dist/sandbox/exec.d.ts +10 -6
  425. package/dist/sandbox/exec.js +27 -12
  426. package/dist/sandbox/execution-id.js +14 -6
  427. package/dist/sandbox/farm.d.ts +2 -2
  428. package/dist/sandbox/farm.js +22 -27
  429. package/dist/sandbox/identity.d.ts +7 -0
  430. package/dist/sandbox/identity.js +14 -3
  431. package/dist/sandbox/image-packages.js +15 -27
  432. package/dist/sandbox/k8s-client.d.ts +35 -8
  433. package/dist/sandbox/k8s-client.js +6 -5
  434. package/dist/sandbox/labels.js +1 -0
  435. package/dist/sandbox/liveness.js +3 -1
  436. package/dist/sandbox/mount-plan.d.ts +10 -10
  437. package/dist/sandbox/mount-plan.js +13 -14
  438. package/dist/sandbox/notification-sweep.d.ts +4 -4
  439. package/dist/sandbox/notification-sweep.js +4 -7
  440. package/dist/sandbox/package-identity.d.ts +6 -13
  441. package/dist/sandbox/package-identity.js +46 -28
  442. package/dist/sandbox/reaper.d.ts +10 -10
  443. package/dist/sandbox/reaper.js +4 -6
  444. package/dist/sandbox/sandbox-error.d.ts +2 -9
  445. package/dist/sandbox/sandbox-error.js +21 -8
  446. package/dist/sandbox/sandbox-step-translate.d.ts +8 -5
  447. package/dist/sandbox/sandbox-step-translate.js +22 -8
  448. package/dist/sandbox/step-sandbox.d.ts +47 -0
  449. package/dist/sandbox/step-sandbox.js +53 -0
  450. package/dist/sandbox/types.d.ts +18 -19
  451. package/dist/sandbox/types.js +1 -1
  452. package/dist/schemas/artifact-manifest.d.ts +4 -4
  453. package/dist/schemas/data-profile-schemas.d.ts +343 -298
  454. package/dist/schemas/file-metadata.js +2 -4
  455. package/dist/schemas/plan-schemas.d.ts +31 -31
  456. package/dist/schemas/run-synthesis.d.ts +95 -26
  457. package/dist/schemas/run-synthesis.js +3 -1
  458. package/dist/schemas/validate-plan.d.ts +4 -4
  459. package/dist/schemas/validate-plan.js +17 -5
  460. package/dist/schemas/workflow-state.d.ts +19 -19
  461. package/dist/schemas/workflow-state.js +2 -2
  462. package/dist/state/active-turns.d.ts +36 -0
  463. package/dist/state/active-turns.js +67 -0
  464. package/dist/state/analyses-metrics.d.ts +8 -8
  465. package/dist/state/analyses-metrics.js +4 -4
  466. package/dist/state/analyses.d.ts +0 -14
  467. package/dist/state/analyses.js +0 -32
  468. package/dist/state/artifacts.d.ts +32 -19
  469. package/dist/state/artifacts.js +28 -5
  470. package/dist/state/data-profile.d.ts +2 -2
  471. package/dist/state/db.d.ts +12 -2
  472. package/dist/state/db.js +5 -0
  473. package/dist/state/edit-intents.d.ts +4 -0
  474. package/dist/state/edit-intents.js +71 -0
  475. package/dist/state/index.d.ts +4 -4
  476. package/dist/state/index.js +2 -2
  477. package/dist/state/init.d.ts +2 -1
  478. package/dist/state/init.js +5 -2
  479. package/dist/state/migrations/20260927120000_baseline.js +3 -1
  480. package/dist/state/migrations/20261026120000_add_the_edit_intents.d.ts +7 -0
  481. package/dist/state/migrations/20261026120000_add_the_edit_intents.js +21 -0
  482. package/dist/state/migrations/20261027120000_record_the_applied_memory_edits.d.ts +7 -0
  483. package/dist/state/migrations/20261027120000_record_the_applied_memory_edits.js +16 -0
  484. package/dist/state/migrations/20261027120100_store_the_authoring_results.d.ts +8 -0
  485. package/dist/state/migrations/20261027120100_store_the_authoring_results.js +20 -0
  486. package/dist/state/migrations/20261027120200_key_the_groups_of_a_turn.d.ts +7 -0
  487. package/dist/state/migrations/20261027120200_key_the_groups_of_a_turn.js +12 -0
  488. package/dist/state/migrations/20261027120300_mark_the_active_turn_of_a_thread.d.ts +7 -0
  489. package/dist/state/migrations/20261027120300_mark_the_active_turn_of_a_thread.js +11 -0
  490. package/dist/state/migrations/20261028120000_record_the_paused_work.d.ts +7 -0
  491. package/dist/state/migrations/20261028120000_record_the_paused_work.js +25 -0
  492. package/dist/state/migrations/20261028120100_end_the_suspended_runs.d.ts +8 -0
  493. package/dist/state/migrations/20261028120100_end_the_suspended_runs.js +13 -0
  494. package/dist/state/migrations/20261029120000_reference_the_run_mandate.d.ts +7 -0
  495. package/dist/state/migrations/20261029120000_reference_the_run_mandate.js +23 -0
  496. package/dist/state/migrations/20261029120100_record_the_run_session_of_a_pause.d.ts +7 -0
  497. package/dist/state/migrations/20261029120100_record_the_run_session_of_a_pause.js +11 -0
  498. package/dist/state/migrations/index.js +18 -0
  499. package/dist/state/paused-work.d.ts +52 -0
  500. package/dist/state/paused-work.js +105 -0
  501. package/dist/state/plans.d.ts +27 -8
  502. package/dist/state/plans.js +14 -11
  503. package/dist/state/purge-analysis.d.ts +6 -6
  504. package/dist/state/purge-analysis.js +10 -2
  505. package/dist/state/report-session-state.d.ts +43 -18
  506. package/dist/state/report-session-state.js +43 -4
  507. package/dist/state/report-versions.d.ts +16 -11
  508. package/dist/state/report-versions.js +5 -3
  509. package/dist/state/runs.d.ts +30 -19
  510. package/dist/state/runs.js +43 -51
  511. package/dist/state/schema.d.ts +18 -21
  512. package/dist/state/schema.js +4 -5
  513. package/dist/state/snapshot-parse.d.ts +2 -2
  514. package/dist/state/snapshot-parse.js +14 -8
  515. package/dist/state/step-executions.d.ts +20 -8
  516. package/dist/state/step-executions.js +6 -4
  517. package/dist/state/tool-outputs.d.ts +2 -2
  518. package/dist/state/tool-outputs.js +2 -1
  519. package/dist/state/vector-store.d.ts +16 -16
  520. package/dist/state/vector-store.js +11 -7
  521. package/dist/tasks/data-profile-absorb.d.ts +3 -3
  522. package/dist/tasks/data-profile-absorb.js +21 -16
  523. package/dist/tasks/data-profile-activity.d.ts +5 -5
  524. package/dist/tasks/data-profile-activity.js +5 -5
  525. package/dist/tasks/data-profile-index.d.ts +4 -4
  526. package/dist/tasks/data-profile-index.js +32 -17
  527. package/dist/tasks/data-profile-resolve.d.ts +8 -8
  528. package/dist/tasks/data-profile-resolve.js +88 -62
  529. package/dist/tasks/data-profile.d.ts +40 -31
  530. package/dist/tasks/data-profile.js +138 -95
  531. package/dist/tasks/extract-values.d.ts +26 -79
  532. package/dist/tasks/extract-values.js +48 -108
  533. package/dist/tasks/refresh-regulatory-corpus.d.ts +4 -20
  534. package/dist/tasks/refresh-regulatory-corpus.js +12 -8
  535. package/dist/tasks/regulatory-corpus-boot-refresh.d.ts +2 -2
  536. package/dist/tasks/regulatory-corpus-boot-refresh.js +12 -10
  537. package/dist/testing.d.ts +60 -0
  538. package/dist/testing.js +96 -0
  539. package/dist/tools/ad-hoc-router.d.ts +9 -9
  540. package/dist/tools/ad-hoc-router.js +65 -52
  541. package/dist/tools/analysis-invocation.d.ts +7 -0
  542. package/dist/tools/analysis-invocation.js +29 -5
  543. package/dist/tools/approval/contract.d.ts +8 -52
  544. package/dist/tools/approval/contract.js +7 -36
  545. package/dist/tools/approval/gateway.d.ts +27 -28
  546. package/dist/tools/approval/gateway.js +33 -130
  547. package/dist/tools/approval/queries.d.ts +6 -11
  548. package/dist/tools/approval/queries.js +43 -29
  549. package/dist/tools/approval/uuidv7.js +2 -2
  550. package/dist/tools/bio/chembl.d.ts +3 -3
  551. package/dist/tools/bio/chembl.js +10 -0
  552. package/dist/tools/bio/comptox.d.ts +25 -8
  553. package/dist/tools/bio/comptox.js +4 -2
  554. package/dist/tools/bio/drug-gene-interactions.d.ts +27 -17
  555. package/dist/tools/bio/drug-gene-interactions.js +11 -8
  556. package/dist/tools/bio/gene-disease-evidence.d.ts +61 -15
  557. package/dist/tools/bio/gene-disease-evidence.js +10 -6
  558. package/dist/tools/bio/gene-preclinical-profile.d.ts +11 -11
  559. package/dist/tools/bio/keys.d.ts +2 -2
  560. package/dist/tools/bio/keys.js +3 -3
  561. package/dist/tools/bio/lookup-annotation.d.ts +5 -5
  562. package/dist/tools/bio/lookup-annotation.js +3 -0
  563. package/dist/tools/bio/opentargets.d.ts +1 -1
  564. package/dist/tools/bio/opentargets.js +6 -0
  565. package/dist/tools/bio/pubchem.d.ts +2 -2
  566. package/dist/tools/bio/pubchem.js +6 -0
  567. package/dist/tools/bio/pubmed.d.ts +26 -16
  568. package/dist/tools/bio/pubmed.js +9 -3
  569. package/dist/tools/bio/search-clinical-trials.d.ts +4 -4
  570. package/dist/tools/bio/search-clinical-trials.js +5 -1
  571. package/dist/tools/bio/search-faers.d.ts +2 -2
  572. package/dist/tools/bio/search-faers.js +1 -1
  573. package/dist/tools/bio/search-gene.d.ts +2 -2
  574. package/dist/tools/bio/search-gene.js +1 -0
  575. package/dist/tools/bio/search-geo-datasets.d.ts +4 -4
  576. package/dist/tools/bio/search-geo-datasets.js +5 -5
  577. package/dist/tools/bio/search-interactions.d.ts +1 -1
  578. package/dist/tools/bio/search-patents.d.ts +28 -22
  579. package/dist/tools/bio/search-patents.js +20 -17
  580. package/dist/tools/bio/search-protein.d.ts +2 -2
  581. package/dist/tools/bio/search-protein.js +1 -1
  582. package/dist/tools/bio/search-regulatory-approvals.d.ts +64 -18
  583. package/dist/tools/bio/search-regulatory-approvals.js +21 -16
  584. package/dist/tools/bio/target-safety.d.ts +8 -8
  585. package/dist/tools/bio/target-safety.js +11 -6
  586. package/dist/tools/capability-data.d.ts +9 -5
  587. package/dist/tools/capability-data.js +2 -1
  588. package/dist/tools/define-tool.d.ts +55 -46
  589. package/dist/tools/define-tool.js +39 -27
  590. package/dist/tools/display/normalize-echart-spec.d.ts +2 -2
  591. package/dist/tools/display/normalize-echart-spec.js +51 -27
  592. package/dist/tools/display/show-user.d.ts +2 -2
  593. package/dist/tools/display/show-user.js +1 -1
  594. package/dist/tools/execute-analysis.d.ts +19 -10
  595. package/dist/tools/execute-analysis.js +83 -62
  596. package/dist/tools/knowledge/check.d.ts +166 -44
  597. package/dist/tools/knowledge/check.js +5 -3
  598. package/dist/tools/knowledge/client.d.ts +31 -62
  599. package/dist/tools/knowledge/client.js +44 -27
  600. package/dist/tools/knowledge/environment.d.ts +6 -6
  601. package/dist/tools/knowledge/environment.js +18 -7
  602. package/dist/tools/knowledge/index.d.ts +2 -2
  603. package/dist/tools/knowledge/index.js +9 -9
  604. package/dist/tools/knowledge/local-slots.d.ts +4 -4
  605. package/dist/tools/knowledge/local-slots.js +11 -4
  606. package/dist/tools/knowledge/pin.d.ts +2 -2
  607. package/dist/tools/knowledge/recommend.d.ts +20 -45
  608. package/dist/tools/knowledge/recommend.js +27 -19
  609. package/dist/tools/knowledge/situation.d.ts +40 -40
  610. package/dist/tools/knowledge/situation.js +2 -9
  611. package/dist/tools/knowledge/skeleton.d.ts +4 -4
  612. package/dist/tools/knowledge/skeleton.js +10 -11
  613. package/dist/tools/knowledge/template.d.ts +20 -18
  614. package/dist/tools/knowledge/template.js +38 -32
  615. package/dist/tools/lib/alphafold-client.js +2 -1
  616. package/dist/tools/lib/amass-client.d.ts +28 -28
  617. package/dist/tools/lib/amass-client.js +20 -10
  618. package/dist/tools/lib/api-utils.d.ts +13 -3
  619. package/dist/tools/lib/api-utils.js +17 -3
  620. package/dist/tools/lib/bgee-client.d.ts +6 -6
  621. package/dist/tools/lib/bgee-client.js +16 -10
  622. package/dist/tools/lib/cbioportal-client.d.ts +4 -4
  623. package/dist/tools/lib/cbioportal-client.js +9 -8
  624. package/dist/tools/lib/chembl-client.d.ts +14 -14
  625. package/dist/tools/lib/chembl-client.js +11 -4
  626. package/dist/tools/lib/clinical-benchmarks-client.d.ts +4 -4
  627. package/dist/tools/lib/clinical-benchmarks-client.js +4 -7
  628. package/dist/tools/lib/clinical-trials-client.d.ts +18 -18
  629. package/dist/tools/lib/clinical-trials-client.js +10 -10
  630. package/dist/tools/lib/clinvar-client.d.ts +2 -2
  631. package/dist/tools/lib/clinvar-client.js +6 -6
  632. package/dist/tools/lib/ctx-ops.d.ts +23 -23
  633. package/dist/tools/lib/ctx-ops.js +13 -10
  634. package/dist/tools/lib/dgidb-client.d.ts +6 -6
  635. package/dist/tools/lib/dgidb-client.js +10 -12
  636. package/dist/tools/lib/disgenet-client.d.ts +4 -4
  637. package/dist/tools/lib/ema-client.d.ts +2 -2
  638. package/dist/tools/lib/ensembl-client.d.ts +4 -4
  639. package/dist/tools/lib/ensembl-client.js +5 -4
  640. package/dist/tools/lib/gwas-catalog-client.d.ts +4 -4
  641. package/dist/tools/lib/gwas-catalog-client.js +17 -17
  642. package/dist/tools/lib/html-text.d.ts +6 -0
  643. package/dist/tools/lib/html-text.js +9 -0
  644. package/dist/tools/lib/identifier-resolver.d.ts +4 -4
  645. package/dist/tools/lib/identifier-resolver.js +7 -3
  646. package/dist/tools/lib/impc-client.d.ts +8 -8
  647. package/dist/tools/lib/impc-client.js +46 -35
  648. package/dist/tools/lib/iuphar-client.d.ts +2 -2
  649. package/dist/tools/lib/iuphar-client.js +7 -16
  650. package/dist/tools/lib/monarch-client.d.ts +4 -4
  651. package/dist/tools/lib/openfda-client.d.ts +22 -22
  652. package/dist/tools/lib/openfda-client.js +23 -22
  653. package/dist/tools/lib/opentargets-client.d.ts +12 -12
  654. package/dist/tools/lib/pathway-client.d.ts +4 -4
  655. package/dist/tools/lib/pathway-client.js +15 -19
  656. package/dist/tools/lib/pharmgkb-client.d.ts +2 -2
  657. package/dist/tools/lib/pharmgkb-client.js +1 -1
  658. package/dist/tools/lib/protein-family-modality.d.ts +2 -2
  659. package/dist/tools/lib/protein-family-modality.js +0 -2
  660. package/dist/tools/lib/protein-family-normalize.js +7 -0
  661. package/dist/tools/lib/pubchem-client.d.ts +2 -2
  662. package/dist/tools/lib/pubchem-client.js +1 -0
  663. package/dist/tools/lib/pubchem-ops.d.ts +4 -4
  664. package/dist/tools/lib/pubchem-ops.js +8 -0
  665. package/dist/tools/lib/pubmed-client.d.ts +9 -9
  666. package/dist/tools/lib/pubmed-client.js +1 -1
  667. package/dist/tools/lib/string-client.d.ts +6 -6
  668. package/dist/tools/lib/uniprot-client.d.ts +8 -8
  669. package/dist/tools/lib/uniprot-client.js +5 -1
  670. package/dist/tools/memory/update-working-memory.d.ts +16 -13
  671. package/dist/tools/memory/update-working-memory.js +21 -3
  672. package/dist/tools/read-tool-output.js +8 -2
  673. package/dist/tools/registry.d.ts +2 -2
  674. package/dist/tools/report-authoring/authoring-tools.d.ts +54 -23
  675. package/dist/tools/report-authoring/authoring-tools.js +128 -62
  676. package/dist/tools/report-session/derive-table.d.ts +19 -59
  677. package/dist/tools/report-session/derive-table.js +120 -122
  678. package/dist/tools/report-session/examine-page.d.ts +6 -6
  679. package/dist/tools/report-session/examine-page.js +14 -12
  680. package/dist/tools/report-session/list-artifacts.d.ts +6 -6
  681. package/dist/tools/report-session/list-artifacts.js +5 -5
  682. package/dist/tools/report-session/page-faults.d.ts +6 -6
  683. package/dist/tools/report-session/page-faults.js +3 -1
  684. package/dist/tools/report-session/preview-report.d.ts +4 -3
  685. package/dist/tools/report-session/preview-report.js +26 -7
  686. package/dist/tools/report-session/record-version.d.ts +9 -4
  687. package/dist/tools/report-session/record-version.js +16 -9
  688. package/dist/tools/report-session/session-page-publisher.d.ts +6 -6
  689. package/dist/tools/research/generate-analogy-report.d.ts +14 -7
  690. package/dist/tools/research/generate-analogy-report.js +80 -76
  691. package/dist/tools/research/generate-plan.d.ts +16 -16
  692. package/dist/tools/research/generate-plan.js +410 -374
  693. package/dist/tools/research/guarded-address.js +3 -2
  694. package/dist/tools/research/inspect-data-profile.d.ts +27 -20
  695. package/dist/tools/research/inspect-data-profile.js +26 -25
  696. package/dist/tools/research/inspect-run.d.ts +54 -27
  697. package/dist/tools/research/inspect-run.js +50 -40
  698. package/dist/tools/research/literature-reviewer.d.ts +8 -7
  699. package/dist/tools/research/literature-reviewer.js +29 -28
  700. package/dist/tools/research/search-arxiv.d.ts +1 -1
  701. package/dist/tools/research/search-arxiv.js +1 -1
  702. package/dist/tools/research/search-github-repos.d.ts +10 -7
  703. package/dist/tools/research/search-github-repos.js +25 -22
  704. package/dist/tools/research/search-semantic-scholar.js +1 -1
  705. package/dist/tools/research/searxng-engine.d.ts +2 -2
  706. package/dist/tools/research/searxng-engine.js +6 -4
  707. package/dist/tools/research/web-fetch.d.ts +24 -21
  708. package/dist/tools/research/web-fetch.js +65 -74
  709. package/dist/tools/research/web-search.d.ts +26 -17
  710. package/dist/tools/research/web-search.js +26 -21
  711. package/dist/tools/sandbox/link-packages.d.ts +11 -7
  712. package/dist/tools/sandbox/link-packages.js +11 -8
  713. package/dist/tools/sandbox/list-available-packages.d.ts +17 -8
  714. package/dist/tools/sandbox/list-available-packages.js +31 -25
  715. package/dist/tools/sandbox/list-available-refs.d.ts +17 -14
  716. package/dist/tools/sandbox/list-available-refs.js +61 -36
  717. package/dist/tools/sandbox/report-blocker.d.ts +30 -37
  718. package/dist/tools/sandbox/report-blocker.js +23 -73
  719. package/dist/tools/sandbox/skills.d.ts +16 -12
  720. package/dist/tools/sandbox/skills.js +16 -12
  721. package/dist/tools/sandbox/submit-file-metadata.d.ts +12 -9
  722. package/dist/tools/sandbox/submit-file-metadata.js +18 -21
  723. package/dist/tools/start-report-session.d.ts +13 -5
  724. package/dist/tools/start-report-session.js +35 -8
  725. package/dist/tools/terminal-text.d.ts +5 -2
  726. package/dist/tools/terminal-text.js +35 -3
  727. package/dist/tools/workspace/decision-record.d.ts +4 -4
  728. package/dist/tools/workspace/decision-record.js +23 -13
  729. package/dist/tools/workspace/edit-file.d.ts +59 -20
  730. package/dist/tools/workspace/edit-file.js +81 -16
  731. package/dist/tools/workspace/execute-command.d.ts +15 -13
  732. package/dist/tools/workspace/execute-command.js +11 -9
  733. package/dist/tools/workspace/file-stat.d.ts +6 -3
  734. package/dist/tools/workspace/grep.d.ts +10 -7
  735. package/dist/tools/workspace/grep.js +9 -3
  736. package/dist/tools/workspace/list-files.d.ts +6 -3
  737. package/dist/tools/workspace/mutator.d.ts +28 -15
  738. package/dist/tools/workspace/mutator.js +107 -53
  739. package/dist/tools/workspace/read-file.d.ts +8 -5
  740. package/dist/tools/workspace/result-bounds.d.ts +5 -5
  741. package/dist/tools/workspace/result-bounds.js +4 -2
  742. package/dist/tools/workspace/run-exec.d.ts +2 -2
  743. package/dist/tools/workspace/run-exec.js +3 -3
  744. package/dist/tools/workspace/scan-inputs.d.ts +8 -5
  745. package/dist/tools/workspace/scan-inputs.js +17 -5
  746. package/dist/tools/workspace/show-file.d.ts +1 -1
  747. package/dist/tools/workspace/show-file.js +2 -1
  748. package/dist/tools/workspace/show-plan.d.ts +8 -5
  749. package/dist/tools/workspace/show-plan.js +9 -8
  750. package/dist/tools/workspace/workspace-search.d.ts +41 -13
  751. package/dist/tools/workspace/workspace-search.js +27 -14
  752. package/dist/tools/workspace/write-file.d.ts +9 -7
  753. package/dist/workflows/execute-analysis-scheduler.d.ts +9 -9
  754. package/dist/workflows/execute-analysis-scheduler.js +6 -3
  755. package/dist/workflows/execute-analysis.d.ts +46 -62
  756. package/dist/workflows/execute-analysis.js +137 -219
  757. package/dist/workflows/pause.d.ts +71 -0
  758. package/dist/workflows/pause.js +173 -0
  759. package/dist/workflows/sandbox-step.d.ts +38 -61
  760. package/dist/workflows/sandbox-step.js +99 -106
  761. package/dist/workflows/test/sql-writes.d.ts +21 -0
  762. package/dist/workflows/test/sql-writes.js +36 -0
  763. package/dist/workspace/filesystem.d.ts +6 -6
  764. package/dist/workspace/filesystem.js +10 -8
  765. package/dist/workspace/paths.d.ts +1 -1
  766. package/dist/workspace/paths.js +15 -4
  767. package/dist/workspace/search-config.d.ts +2 -2
  768. package/dist/workspace/search-config.js +1 -1
  769. package/package.json +21 -22
  770. package/dist/loop/call-guard.d.ts +0 -50
  771. package/dist/loop/call-guard.js +0 -90
  772. package/dist/loop/continue-agent.d.ts +0 -40
  773. package/dist/loop/continue-agent.js +0 -38
  774. package/dist/loop/genai-spans.d.ts +0 -47
  775. package/dist/loop/genai-spans.js +0 -134
  776. package/dist/loop/run-agent.d.ts +0 -245
  777. package/dist/loop/run-agent.js +0 -1124
  778. package/dist/loop/run-step.d.ts +0 -29
  779. package/dist/loop/run-step.js +0 -34
  780. package/dist/loop/run-to-terminal.d.ts +0 -66
  781. package/dist/loop/run-to-terminal.js +0 -93
  782. package/dist/loop/tool-mask.d.ts +0 -23
  783. package/dist/loop/tool-mask.js +0 -46
  784. package/dist/providers/streaming-chat.d.ts +0 -32
  785. package/dist/providers/streaming-chat.js +0 -91
  786. package/dist/tasks/derive-table-exec.d.ts +0 -54
  787. package/dist/tasks/derive-table-exec.js +0 -86
  788. package/dist/workflows/suspension.d.ts +0 -32
  789. package/dist/workflows/suspension.js +0 -38
@@ -17,26 +17,33 @@
17
17
  * triggers dedup via the ledger CAS (only one `tryStart/tryRerun/tryRetry`
18
18
  * UPDATE wins); each winning attempt starts a workflow under a per-attempt id.
19
19
  */
20
- import { DBOS, Error as DBOSErrors } from "@dbos-inc/dbos-sdk";
20
+ import { errorMessageOf } from "../lib/thrown.js";
21
+ import { textOf } from "../lib/unknown-text.js";
22
+ import { DBOS } from "@dbos-inc/dbos-sdk";
23
+ import { isWorkflowCancellation } from "../runtime/dbos.js";
21
24
  import { randomUUID } from "node:crypto";
22
25
  import { ResultAsync, err, ok } from "neverthrow";
23
26
  import { forStep, forSubAgent } from "../auth/types.js";
27
+ import { presentFirst } from "../lib/present.js";
28
+ import { collapseWhitespace } from "../lib/text.js";
24
29
  import { createDataProfilerAgent } from "../agents/sandbox/data-profiler.js";
25
- import { runToTerminal } from "../loop/run-to-terminal.js";
26
- import { durableStep } from "../loop/run-step.js";
30
+ import { runWithSalvage } from "../loop/run-loop.js";
31
+ import { recordedInputOf } from "../loop/tool-adapter.js";
27
32
  import { createNoopLogger } from "../lib/console-logger.js";
28
33
  import { deliverNotice, passGate } from "../lib/hooks.js";
29
34
  import { unwrapOrThrow } from "../lib/result.js";
30
35
  import { defineTool } from "../tools/define-tool.js";
31
36
  import { createDetailResolver } from "../tools/detail-resolver.js";
32
37
  import { renderWorkspace } from "../prompts/briefing.js";
33
- import { keepSuspendingRefusal } from "../sandbox/sandbox-error.js";
34
- import { cancelSelf, suspensionOfFailure, suspensionOfRefusal, suspensionOfSpawnRefusal } from "../workflows/suspension.js";
38
+ import { keepSuspendingRefusal, SandboxFailure } from "../sandbox/sandbox-error.js";
39
+ import { workPause } from "../workflows/pause.js";
40
+ import { clearPausesOfWork } from "../state/paused-work.js";
35
41
  import { toSandboxPath } from "../workspace/paths.js";
36
42
  import { estimateDataProfileResources } from "../sandbox/estimate-data-profile-resources.js";
37
43
  import { generateExecutionId } from "../sandbox/execution-id.js";
38
44
  import { mintSandboxIdentity } from "../sandbox/identity.js";
39
45
  import { createVectorStore } from "../state/vector-store.js";
46
+ import { z } from "zod";
40
47
  import { ProfileSubmissionSchema } from "../schemas/data-profile-schemas.js";
41
48
  import { computeInputSignature } from "../execution/input-signature.js";
42
49
  import { readHeaders } from "../input-scan/enrich.js";
@@ -47,7 +54,7 @@ import { scanInputTree } from "../input-scan/scan.js";
47
54
  import { PROFILE_INDEX_TYPES, buildProfileIndexEntries } from "./data-profile-index.js";
48
55
  import { absorbRecipe, renderAbsorbDelta } from "./data-profile-absorb.js";
49
56
  import { formatResolutionErrors, resolveProfileSubmission } from "./data-profile-resolve.js";
50
- import { completeDataProfile, completeEmptyDataProfile, failDataProfile, loadDataProfileStatus, loadSeedInputFileIds, recordDataProfileWorkflowId, suspendAnalysis, tryRerunDataProfile, tryStartDataProfile, upsertArtifacts, } from "../state/index.js";
57
+ import { completeDataProfile, completeEmptyDataProfile, failDataProfile, loadDataProfileStatus, loadSeedInputFileIds, recordDataProfileWorkflowId, tryRerunDataProfile, tryStartDataProfile, upsertArtifacts, } from "../state/index.js";
51
58
  import { elapsedSinceIso, recordRunCompleted } from "../lib/metrics.js";
52
59
  import { createProfileActivityEmitter } from "./data-profile-activity.js";
53
60
  import { ensureSearchIndex, searchIndexName } from "../workspace/search-config.js";
@@ -64,15 +71,45 @@ const DATA_PROFILE_AGENT_ID = "data-profiler";
64
71
  const DEFAULT_DEADLINE_MS = 1_200_000;
65
72
  /** Index entries embedded and upserted per round trip. */
66
73
  const INDEX_BATCH_SIZE = 256;
74
+ const SUBMIT_PROFILE_TOOL_ID = "submit_profile";
75
+ /** What one call of `submit_profile` tells the agent. */
76
+ const SubmitOutcomeSchema = z.discriminatedUnion("status", [
77
+ z.object({ status: z.literal("needs_repair"), detail: z.string() }),
78
+ z.object({
79
+ status: z.literal("accepted"),
80
+ groups: z.number(),
81
+ keptFiles: z.number(),
82
+ unclassifiedFiles: z.number(),
83
+ unresolvedOperations: z.number(),
84
+ }),
85
+ ]);
86
+ /** The submissions of a run, in call order, with the outcome that the tool gave each one. */
87
+ function profileSubmissions(steps) {
88
+ const submissions = [];
89
+ for (const step of steps) {
90
+ for (const call of step.calls) {
91
+ if (call.toolName !== SUBMIT_PROFILE_TOOL_ID || call.output?.outcome !== "ok")
92
+ continue;
93
+ const submission = recordedInputOf(ProfileSubmissionSchema, call.input);
94
+ const outcome = SubmitOutcomeSchema.safeParse(call.output.value);
95
+ if (submission === undefined || !outcome.success)
96
+ continue;
97
+ submissions.push({ submission, accepted: outcome.data.status === "accepted" });
98
+ }
99
+ }
100
+ return submissions;
101
+ }
67
102
  /**
68
- * Submissions the tool accepts: the first, plus one repair.
69
- *
70
- * The repair is a FULL resubmit — the agent replaces the whole operation list and nothing
71
- * is merged into the prior attempt. Past it the resolution stands as it resolved: an
72
- * operation that still does not resolve produces no group, and its members land in the
73
- * visible `unclassified` group rather than blocking a profile that gates planning.
103
+ * The submission that the profile records: the last accepted one, else the last one. A repair is a FULL
104
+ * resubmit — nothing merges into the prior attempt. The last submission of a run with no accepted one
105
+ * resolves as final: an operation that still does not resolve produces no group, and its members land in
106
+ * the visible `unclassified` group rather than blocking a profile that gates planning.
74
107
  */
75
- const MAX_SUBMIT_ROUNDS = 2;
108
+ function selectedSubmission(steps) {
109
+ const submissions = profileSubmissions(steps);
110
+ const chosen = submissions.filter((entry) => entry.accepted).at(-1) ?? submissions.at(-1);
111
+ return chosen === undefined ? undefined : { ...chosen, count: submissions.length };
112
+ }
76
113
  /** Where the embedder stages this analysis's inputs (see the data-profile-init spec). */
77
114
  const STAGED_INPUT_ROOT = "data/inputs";
78
115
  /** Build the canonical artifact path for a staged input file. */
@@ -141,7 +178,7 @@ async function readSetHeaders(args) {
141
178
  });
142
179
  }
143
180
  catch (err) {
144
- if (err instanceof DBOSErrors.DBOSWorkflowCancelledError)
181
+ if (isWorkflowCancellation(err))
145
182
  throw err;
146
183
  logger.warn("input-scan header readout failed (non-fatal)", logger.errorFields(err));
147
184
  return new Map();
@@ -250,7 +287,7 @@ function logProfileMonitoring(logger, args) {
250
287
  }
251
288
  /**
252
289
  * Register the data-profile workflow with DBOS. Returns the registered
253
- * callable so `triggerDataProfile` can dispatch via `DBOS.startWorkflow`.
290
+ * callable so `triggerDataProfile` can dispatch it through the run launcher.
254
291
  */
255
292
  /**
256
293
  * Project the workflow deps onto the profiler agent bag. The farm-extension
@@ -266,11 +303,11 @@ export function profilerSandboxAgentDeps(deps, step) {
266
303
  embedding: deps.embedding,
267
304
  model: deps.model,
268
305
  skillsDir: deps.skillsDir,
269
- ...(deps.farmLockFile ? { farmLockFile: deps.farmLockFile } : {}),
270
- ...(deps.imagePackagesFile ? { imagePackagesFile: deps.imagePackagesFile } : {}),
271
- ...(deps.refStorePath ? { refStorePath: deps.refStorePath } : {}),
272
- ...(deps.extendAnalysisFarm ? { extendAnalysisFarm: deps.extendAnalysisFarm } : {}),
273
- ...(deps.toolOutputStore ? { toolOutputStore: deps.toolOutputStore } : {}),
306
+ farmLockFile: deps.farmLockFile,
307
+ imagePackagesFile: deps.imagePackagesFile,
308
+ refStorePath: deps.refStorePath,
309
+ extendAnalysisFarm: deps.extendAnalysisFarm,
310
+ toolOutputStore: deps.toolOutputStore,
274
311
  bioKeys: deps.bioKeys,
275
312
  step,
276
313
  };
@@ -285,26 +322,8 @@ export function registerDataProfileWorkflow(deps) {
285
322
  */
286
323
  export async function runDataProfileBody(input, deps) {
287
324
  const logger = (deps.logger ?? createNoopLogger()).named("data-profile").with({ analysisId: input.analysisId });
288
- // Ownership defaults to true for inputs persisted before the field existed
289
- // (a #247 workflow recovered across this deploy): those were always
290
- // Cortex-owned and must be revoked here.
291
- const { analysisId, runSession, ownsMandate = true, stagedInputs } = input; // oss-core-managed-ok
292
- const authorization = { runSession, ownsMandate }; // oss-core-managed-ok
293
- const revoke = (reason) => deliverNotice(logger, "RunAuthorizer.revoke", deps.runAuthorizer.revoke(authorization, reason));
294
- let selfCancelled = false;
295
- // A suspension fails the row with the reason of the host, because the profile
296
- // ledger has no suspended state and the retry path takes a `failed` row again.
297
- const suspendProfile = async (suspension) => {
298
- logger.warn("profile suspended", { reason: suspension.reason });
299
- await settleTerminalWrite(logger, analysisId, unwrapOrThrow(await failDataProfile(deps.pool, analysisId, suspension.reason)), "failed", deps.notifyDataProfileSettled);
300
- await revoke("data-profile-suspended");
301
- unwrapOrThrow(await suspendAnalysis(deps.pool, analysisId));
302
- await activity.failed(suspension.reason);
303
- if (DBOS.workflowID === undefined)
304
- return;
305
- selfCancelled = true;
306
- await cancelSelf("self-cancel-suspended");
307
- };
325
+ const { analysisId, runSession, stagedInputs } = input;
326
+ const revoke = (reason) => deliverNotice(logger, "RunAuthorizer.revoke", deps.runAuthorizer.revoke(runSession, reason));
308
327
  // The profile's activity channel. The write to the stream is bound here, while every phase and
309
328
  // phrase lives in the emitter — the phrases are the observable contract of
310
329
  // this capability, and a body that composed its own strings is a body they can drift from.
@@ -355,6 +374,17 @@ export async function runDataProfileBody(input, deps) {
355
374
  }))));
356
375
  const executionId = generateExecutionId(DATA_PROFILE_AGENT_ID);
357
376
  const workflowId = DBOS.workflowID ?? `${DATA_PROFILE_RUN_LITERAL}:${executionId}`;
377
+ // The profile waits in place, with its row `running`: the profile pauses, and it does not fail.
378
+ const pause = workPause({
379
+ pool: deps.pool,
380
+ workId: workflowId,
381
+ workKind: "profile",
382
+ analysisId,
383
+ emit: (part) => DBOS.writeStream("events", part),
384
+ retryDelaysMs: deps.pauseRetryDelaysMs,
385
+ run: { session: runSession, authorizer: deps.runAuthorizer },
386
+ logger,
387
+ });
358
388
  const childSession = forSubAgent(runSession, DATA_PROFILE_AGENT_ID);
359
389
  // A resolver rejection fails the workflow loudly (workspace-root-resolution
360
390
  // contract) — profiling an analysis whose root cannot be resolved is
@@ -428,9 +458,16 @@ export async function runDataProfileBody(input, deps) {
428
458
  // from the agent loop would leave the longest wait of all unreported — the same defect the
429
459
  // run panel's activity readout was built to remove.
430
460
  await activity.sandboxInit();
431
- const spawned = keepSuspendingRefusal(await deps.sandboxClient.createSandbox(forStep(runSession, DATA_PROFILE_STEP_LITERAL), { childWorkflowId: workflowId, resources: estimateDataProfileResources(stagedInputs) }, mintSandboxIdentity(DATA_PROFILE_RUN_LITERAL)));
432
- if (spawned.isErr())
433
- return await suspendProfile(suspensionOfSpawnRefusal(spawned.error));
461
+ const spawn = async () => keepSuspendingRefusal(await deps.sandboxClient.createSandbox(forStep(runSession, DATA_PROFILE_STEP_LITERAL), { childWorkflowId: workflowId, resources: estimateDataProfileResources(stagedInputs) }, mintSandboxIdentity(DATA_PROFILE_RUN_LITERAL)));
462
+ let spawned = await spawn();
463
+ // A refusal of the label gate with the suspend flag waits in a pause, and the spawn runs again after the
464
+ // resume. A body that runs outside a workflow cannot wait, thus the refusal fails the profile there.
465
+ while (spawned.isErr()) {
466
+ const waited = await pause.forCause({ kind: "host", reason: spawned.error.reason }, 0);
467
+ if (waited === undefined)
468
+ throw new SandboxFailure(spawned.error);
469
+ spawned = await spawn();
470
+ }
434
471
  const sandbox = spawned.value;
435
472
  try {
436
473
  // Checkpointed clock, not `Date.now()`: one deadline bounds every exec of the
@@ -483,34 +520,26 @@ export async function runDataProfileBody(input, deps) {
483
520
  allowedWritePrefix: profileWritePrefix,
484
521
  deadlineMs: () => deadlineAbs,
485
522
  });
486
- let accepted = null;
487
- let rounds = 0;
488
523
  const submitProfileTool = defineTool({
489
- id: "submit_profile",
490
- description: "Submit the profiling results. Call this tool once after completing all profiling work — it resolves your " +
491
- "operations against the scan, computes every group's membership and counts, and records the profile. " +
492
- "A submission whose operations do not resolve, or that leaves kept files unclaimed, comes back once with " +
493
- "the errors; the repair is a FULL resubmit of the whole operation list.",
524
+ id: SUBMIT_PROFILE_TOOL_ID,
525
+ description: "Submit the profiling results. Call this tool after completing all profiling work — it resolves your " +
526
+ "operations against the scan, computes every group's membership and counts, and checks the profile. " +
527
+ "A submission whose operations do not resolve, or that leaves kept files unclaimed, comes back with " +
528
+ "the errors; the repair is a FULL resubmit of the whole operation list. The last accepted submission is the profile.",
494
529
  inputSchema: ProfileSubmissionSchema,
495
530
  describeCall: "none",
496
- execute: async (input) => {
497
- rounds++;
498
- // The last round resolves as final: nothing that follows can repair an
499
- // overlap, so a contested file sweeps rather than being awarded to whichever
500
- // operation the agent happened to write first.
501
- const finalRound = rounds >= MAX_SUBMIT_ROUNDS;
502
- const resolution = resolveProfileSubmission(input, detected, briefingMenu, { finalRound });
503
- if (!finalRound && (resolution.errors.length > 0 || resolution.unclaimed.length > 0)) {
504
- return ok({ status: "needs_repair", detail: formatResolutionErrors(resolution) });
531
+ execute: (input) => {
532
+ const resolution = resolveProfileSubmission(input, detected, briefingMenu, { finalRound: false });
533
+ if (resolution.errors.length > 0 || resolution.unclaimed.length > 0) {
534
+ return Promise.resolve(ok({ status: "needs_repair", detail: formatResolutionErrors(resolution) }));
505
535
  }
506
- accepted = { submission: input, resolution };
507
- return ok({
536
+ return Promise.resolve(ok({
508
537
  status: "accepted",
509
538
  groups: resolution.groups.length,
510
539
  keptFiles: resolution.partition.keptFiles,
511
540
  unclassifiedFiles: resolution.partition.unclassifiedFiles,
512
541
  unresolvedOperations: resolution.errors.length,
513
- });
542
+ }));
514
543
  },
515
544
  });
516
545
  const baseAgent = createDataProfilerAgent(sandboxAgentDeps);
@@ -523,37 +552,39 @@ export async function runDataProfileBody(input, deps) {
523
552
  // otherwise still read as `Starting sandbox` long after the container was up. The run
524
553
  // path's `Running ${agentId}` serves the same purpose at the same point.
525
554
  await activity.agentStarting();
526
- await runToTerminal(agentDef, [{ role: "user", content: prompt }], childSession, {
555
+ const run = await runWithSalvage(agentDef, [{ role: "user", content: prompt }], childSession, {
527
556
  provider: deps.provider,
528
557
  signal,
529
558
  // Every tool call the profiler makes becomes live activity. Only `tool-started`
530
559
  // is forwarded: the loop's other events (iteration boundaries, model deltas,
531
560
  // tool completions) describe machinery rather than work, and the panel this
532
561
  // feeds carries a single line whose value is that it always names what is
533
- // happening now. Awaited in body order, because `DBOS.writeStream` allocates a
534
- // function id and an unawaited write would race the next operation for the
535
- // counter and desynchronise the recorded sequence on replay.
562
+ // happening now. The events of a tool call arrive from inside its step.
536
563
  emit: async (event) => {
537
564
  if (event.type === "tool-started")
538
- await activity.forTool(event.name, event.input, resolveDetail);
565
+ await activity.forTool(event.toolUseId, event.name, event.input, resolveDetail);
539
566
  },
540
- runStep: durableStep,
541
- resolved: () => accepted !== null,
542
567
  invocationId: workflowId,
543
568
  usageRecorder: deps.usageRecorder,
544
569
  toolOutputStore: deps.toolOutputStore,
545
- isFatalLoopError: (err) => err instanceof DBOSErrors.DBOSWorkflowCancelledError,
570
+ pause: pause.afterFailure,
546
571
  }, {
547
- tools: [submitProfileTool],
548
- nudge: "You stopped without calling submit_profile, so no profile was " +
572
+ tools: [SUBMIT_PROFILE_TOOL_ID],
573
+ nudge: "You stopped without an accepted submit_profile, so no profile was " +
549
574
  "recorded. Call submit_profile now with your operations on the menu, " +
550
575
  "what each resulting group means, and the dimensions you saw with " +
551
576
  "their observations — base it on the scan and the work you already did.",
577
+ hasOutcome: (steps) => profileSubmissions(steps).some((entry) => entry.accepted),
552
578
  });
553
- if (!accepted) {
579
+ const selected = selectedSubmission(run.steps);
580
+ if (selected === undefined) {
554
581
  throw new Error("Data profiling failed: agent did not call submit_profile");
555
582
  }
556
- const { submission, resolution } = accepted;
583
+ const { submission } = selected;
584
+ // A submission that no call accepted resolves as final: nothing that follows can repair an
585
+ // overlap, so a contested file sweeps rather than being awarded to whichever operation the
586
+ // agent happened to write first. The resolution is pure, thus it gives the answer of the call.
587
+ const resolution = resolveProfileSubmission(submission, detected, briefingMenu, { finalRound: !selected.accepted });
557
588
  // 5. Index into vector store — one entry per group, one per dimension, one per annotated member.
558
589
  //
559
590
  // Reported as `indexing`, not `persisting`: the contract defines `persisting` as step
@@ -566,7 +597,7 @@ export async function runDataProfileBody(input, deps) {
566
597
  resolution,
567
598
  dimensions: resolution.dimensions,
568
599
  probes: resolution.probes,
569
- repairRounds: rounds - 1,
600
+ repairRounds: selected.count - 1,
570
601
  absorb: absorb.kind,
571
602
  });
572
603
  // 6. Complete — store the FULL profiler finding plus the input signature for
@@ -591,11 +622,12 @@ export async function runDataProfileBody(input, deps) {
591
622
  }
592
623
  }
593
624
  catch (err) {
594
- if (selfCancelled || err instanceof DBOSErrors.DBOSWorkflowCancelledError)
625
+ if (isWorkflowCancellation(err)) {
626
+ // `stopDataProfile` writes the row, but only the body holds the run session.
627
+ await revoke("data-profile-stopped");
595
628
  throw err;
596
- const suspension = suspensionOfFailure(err);
597
- if (suspension !== undefined)
598
- return await suspendProfile(suspension);
629
+ }
630
+ // A failure with a cause of a pause waited in the loop, thus this one fails the profile.
599
631
  logger.error("profile failed", logger.errorFields(err));
600
632
  const reason = profileFailureReason(err);
601
633
  await settleTerminalWrite(logger, analysisId, unwrapOrThrow(await failDataProfile(deps.pool, analysisId, reason)), "failed", deps.notifyDataProfileSettled);
@@ -646,9 +678,8 @@ export function describeDataProfileStartError(e) {
646
678
  }
647
679
  /**
648
680
  * Resolve the `RunSession` the workflow runs under. Whether the authorization
649
- * is freshly minted (Cortex-owned) or reused (caller-owned) is decided by the
650
- * `RunAuthorizer` seam from the opaque auth; this passes that auth straight
651
- * through and never inspects it.
681
+ * is freshly minted or reused is decided by the `RunAuthorizer` seam from the
682
+ * opaque auth; this passes that auth straight through and never inspects it.
652
683
  */
653
684
  export function authorizeDataProfile(deps, params) {
654
685
  const { auth, analysisId } = params;
@@ -681,15 +712,11 @@ export function dataProfileWorkflowId(analysisId, nonce) {
681
712
  * supplied the manifest in `params.stagedInputs`; this forwards it into the
682
713
  * workflow input. The handle result is not awaited.
683
714
  */
684
- async function startDataProfileWorkflow(deps, params, authorization) {
685
- const { runSession, ownsMandate } = authorization; // oss-core-managed-ok
715
+ async function startDataProfileWorkflow(deps, params, runSession) {
686
716
  const attemptNonce = randomUUID();
687
- await DBOS.startWorkflow(deps.workflow, {
688
- workflowID: dataProfileWorkflowId(params.analysisId, attemptNonce),
689
- })({
717
+ await deps.runLauncher.launch(deps.workflow, { workflowId: dataProfileWorkflowId(params.analysisId, attemptNonce) }, {
690
718
  analysisId: params.analysisId,
691
719
  runSession,
692
- ownsMandate, // oss-core-managed-ok
693
720
  stagedInputs: params.stagedInputs,
694
721
  });
695
722
  }
@@ -827,12 +854,8 @@ async function compensateStartFailure(deps, analysisId, phase, cause) {
827
854
  async function refuseClaimedProfile(deps, analysisId, phase, refusal) {
828
855
  const logger = (deps.logger ?? createNoopLogger()).named("data-profile").with({ analysisId });
829
856
  logger.error("the profile was not authorized", { phase, reason: refusal.reason, suspend: refusal.kind === "suspended" });
857
+ // No work exists yet, thus a refusal with the suspend flag fails the row the same as each other refusal.
830
858
  await failClaimedProfile(deps, analysisId, phase, refusal.reason);
831
- if (suspensionOfRefusal(refusal) === undefined)
832
- return;
833
- const marked = await suspendAnalysis(deps.pool, analysisId);
834
- if (marked.isErr())
835
- logger.error("the analysis was not marked as suspended", { phase, err: marked.error });
836
859
  }
837
860
  async function failClaimedProfile(deps, analysisId, phase, reason) {
838
861
  const logger = (deps.logger ?? createNoopLogger()).named("data-profile").with({ analysisId });
@@ -863,6 +886,26 @@ async function failClaimedProfile(deps, analysisId, phase, reason) {
863
886
  export function runDataProfile(deps, params) {
864
887
  return new ResultAsync(dispatchClaimedProfile(deps, params, "Retry"));
865
888
  }
889
+ /** The ledger error of a profile that a stop ended. A client shows it, and a retry can follow it. */
890
+ export const DATA_PROFILE_STOPPED = "Data profiling was stopped";
891
+ /**
892
+ * Stop the profile workflow of an analysis, and fail its row. The body passes a cancel through its failure path,
893
+ * thus the row, the rows of its pauses, and the settled notice converge here. The revoke of the mandate and the
894
+ * teardown of the sandbox stay in the body, which runs them on its way out. The `running` guard of the row write keeps a profile that settled first.
895
+ */
896
+ export async function stopDataProfile(deps, analysisId, workflowId) {
897
+ const logger = (deps.logger ?? createNoopLogger()).named("data-profile").with({ analysisId });
898
+ await DBOS.cancelWorkflow(workflowId);
899
+ const cleared = await clearPausesOfWork(deps.pool, workflowId);
900
+ if (cleared.isErr())
901
+ logger.warn("the pauses of a stopped profile did not clear", { op: cleared.error.op });
902
+ const failed = await failDataProfile(deps.pool, analysisId, DATA_PROFILE_STOPPED);
903
+ if (failed.isErr()) {
904
+ logger.error("the row of a stopped profile did not fail", { op: failed.error.op });
905
+ return;
906
+ }
907
+ await settleTerminalWrite(logger, analysisId, failed.value, "failed", deps.notifyDataProfileSettled);
908
+ }
866
909
  /**
867
910
  * Concise, UI-safe failure reason. `data_profile_error` is surfaced verbatim
868
911
  * to the frontend, so raw errors — K8s API response bodies, multi-line stack
@@ -871,7 +914,7 @@ export function runDataProfile(deps, params) {
871
914
  */
872
915
  const PROFILE_ERROR_MAX_LEN = 200;
873
916
  function profileFailureReason(err) {
874
- const raw = err instanceof Error ? err.message : String(err);
875
- const firstLine = raw.split("\n", 1)[0].replace(/\s+/g, " ").trim();
917
+ const raw = errorMessageOf(err) ?? textOf(err);
918
+ const firstLine = collapseWhitespace(presentFirst(raw.split("\n", 1), "the first line of the error"));
876
919
  return firstLine.length > PROFILE_ERROR_MAX_LEN ? firstLine.slice(0, PROFILE_ERROR_MAX_LEN - 1) + "…" : firstLine || "Data profiling failed";
877
920
  }
@@ -1,52 +1,36 @@
1
1
  /**
2
- * The extraction workflow on the profile rails, and the `ExtractionArm` realization over it.
2
+ * The extraction pass on the profile rails, and the `ExtractionArm` realization over it.
3
3
  *
4
4
  * The report resolver falls through to this arm for an over-cap file or a host parse fault. The arm runs one
5
5
  * fixed extraction script in an ephemeral sandbox, and it gives back the rows that the script read. No agent
6
6
  * loop runs anywhere in this path. A file whose extension names no tabular format never arrives here,
7
7
  * because the host decides the format and it refuses the file before the fall-through.
8
8
  *
9
- * The shape matches the data profile (`src/tasks/data-profile.ts`). The authorization mints at the async
10
- * edge (`triggerExtractValues`) and rides in the workflow input. The body never mints, and it revokes the
11
- * authorization on every terminal path. The container is ephemeral, and it goes away with the work, thus no
12
- * standing machine exists.
9
+ * The pass runs inside the step of the tool call that resolves the report (`sandbox/step-sandbox.ts`), under
10
+ * the auth of that call, and it mints no mandate. One call can run more than one pass, thus the exec of each
11
+ * pass takes the key of the step and a hash of its requests. The container is ephemeral, and it goes away
12
+ * with the work, thus no standing machine exists.
13
13
  */
14
- import { type Result } from "neverthrow";
15
- import { type AuthContext, type RunSession } from "../auth/types.js";
16
- import type { RunAuthorizer } from "../execution/run-authorizer.js";
14
+ import type { Result } from "neverthrow";
15
+ import type { AuthContext, Identity } from "../auth/types.js";
17
16
  import type { Logger } from "../lib/logger.js";
18
17
  import type { ExtractionArm, ExtractionArtifact, ExtractionRequest } from "../report-model/production-resolver.js";
19
18
  import type { SandboxClient } from "../sandbox/client.js";
20
- import { type Suspension } from "../workflows/suspension.js";
19
+ import type { SuspendingRefusal } from "../sandbox/sandbox-error.js";
21
20
  import type { ExecRequest, ExecResult } from "../sandbox/types.js";
22
21
  import { type ExtractValuesResult } from "./extract-values-script.js";
23
- export type { ExtractValuesResult } from "./extract-values-script.js";
24
- /**
25
- * The body's construction-time deps, closed over at registration. The extraction pass shares the profile's
26
- * sandbox and authorization rails, thus it draws the same three seams and nothing else.
27
- */
28
- export interface ExtractValuesDeps {
22
+ /** The construction deps of the pass. It shares the sandbox rail of the profile. */
23
+ export type ExtractionDeps = {
24
+ readonly sandboxClient: SandboxClient;
29
25
  /** Operational logging seam. An absent logger falls back to a no-op. */
30
26
  readonly logger?: Logger;
31
- readonly sandboxClient: SandboxClient;
32
- readonly runAuthorizer: RunAuthorizer;
33
- }
34
- /**
35
- * The workflow input. It is JSON-serializable, thus DBOS persists it as the workflow's input row. The
36
- * `RunSession` carries the run authorization. The body reads it and never mints.
37
- */
38
- export interface ExtractValuesWorkflowInput {
27
+ };
28
+ /** The caller of one pass: the analysis that it reads, and the identity and the auth of the tool call. */
29
+ export type ExtractionCaller = {
39
30
  readonly analysisId: string;
40
- readonly runSession: RunSession;
41
- /** The fall-through artifacts of one document pass. One submission covers every request. */
42
- readonly requests: readonly ExtractionRequest[];
43
- /**
44
- * True when this workflow owns the run-authorization lifecycle, thus the body revokes on every terminal
45
- * path. An input persisted before this field existed reads as absent, and the body defaults it to true,
46
- * which matches the prior owned behavior.
47
- */
48
- readonly ownsMandate?: boolean;
49
- }
31
+ readonly identity: Identity;
32
+ readonly auth: AuthContext;
33
+ };
50
34
  /**
51
35
  * Build the sandbox exec for one extraction pass. The command runs the fixed script through `python3 -c`.
52
36
  * The working directory is the analysis mount, thus a relative request path reads the correct file. The
@@ -65,56 +49,18 @@ export declare function buildExtractionExec(analysisId: string, requests: readon
65
49
  * Parse the script output from the exec result. A synthetic failure, a timeout, and a non-zero exit each
66
50
  * throw, because each means the script did not emit its map. A stdout that is not the map shape throws too.
67
51
  *
68
- * The function is pure, thus a test asserts the parse without a sandbox. The throw crosses the workflow
69
- * boundary, and the arm turns it into a rejected promise.
52
+ * The function is pure, thus a test asserts the parse without a sandbox. The arm turns the throw into a
53
+ * rejected promise.
70
54
  */
71
55
  export declare function parseExtractionOutput(result: ExecResult): ExtractValuesResult;
72
56
  /**
73
- * The body, extracted so a test drives it without a registered workflow. It creates the ephemeral
74
- * container, submits one exec, awaits the result durably, and gives the value map back. It revokes the run
75
- * authorization on every terminal path, and it tears the container down on both paths.
57
+ * Run one extraction pass: make the container, run the script on every request, and remove the container.
76
58
  *
77
- * A chat turn awaits this workflow, thus a suspension is the `err` of the result, and the workflow does not
78
- * cancel (workflow-suspension spec). The body does not mark the analysis: the caller reports the suspension.
59
+ * A suspending refusal of the spawn is the `err`, and the caller reports it. Each other fault throws.
79
60
  */
80
- export declare function runExtractValuesBody(input: ExtractValuesWorkflowInput, deps: ExtractValuesDeps): Promise<Result<ExtractValuesResult, Suspension>>;
81
- /**
82
- * Register the extraction workflow with DBOS. It gives back the registered callable, thus a trigger
83
- * dispatches with `DBOS.startWorkflow`.
84
- */
85
- export declare function registerExtractValuesWorkflow(deps: ExtractValuesDeps): (input: ExtractValuesWorkflowInput) => Promise<Result<ExtractValuesResult, Suspension>>;
86
- /** The per-attempt workflow id. A fresh nonce keeps each pass under a distinct id. */
87
- export declare function extractValuesWorkflowId(analysisId: string, nonce: string): string;
88
- /**
89
- * The route-side deps for the trigger: the run authorizer, and the registered workflow callable. The body's
90
- * construction-time deps are closed over at registration, thus the trigger never holds them.
91
- */
92
- export interface ExtractValuesTriggerDeps {
93
- readonly runAuthorizer: RunAuthorizer;
94
- readonly workflow: (input: ExtractValuesWorkflowInput) => Promise<Result<ExtractValuesResult, Suspension>>;
95
- }
96
- /** The identity and the requests for one extraction pass. */
97
- export interface ExtractValuesTriggerParams {
98
- readonly auth: AuthContext;
99
- readonly analysisId: string;
100
- readonly requests: readonly ExtractionRequest[];
101
- }
102
- /**
103
- * The async edge. It authorizes through the `RunAuthorizer`, starts the workflow, and awaits the outcome.
104
- * The body owns the revoke, thus the trigger holds no lifecycle. A workflow fault and a refused
105
- * authorization reject the returned promise. A suspension is the `err` of the result: of the workflow, or of
106
- * an authorization that the host refused with the suspend flag.
107
- */
108
- export declare function triggerExtractValues(deps: ExtractValuesTriggerDeps, params: ExtractValuesTriggerParams): Promise<Result<ExtractValuesResult, Suspension>>;
109
- /** Runs one extraction pass for the bound analysis, and gives the raw value map back, or the suspension. */
110
- export type ExtractionRunner = (requests: readonly ExtractionRequest[]) => Promise<Result<ExtractValuesResult, Suspension>>;
111
- /**
112
- * Bind the trigger to one analysis and one auth context. The result runs one pass with every request in it.
113
- */
114
- export declare function bindExtractionTrigger(deps: ExtractValuesTriggerDeps, binding: {
115
- readonly auth: AuthContext;
116
- readonly analysisId: string;
117
- }): ExtractionRunner;
61
+ export declare function runExtraction(deps: ExtractionDeps, caller: ExtractionCaller, requests: readonly ExtractionRequest[]): Promise<Result<ExtractValuesResult, SuspendingRefusal>>;
62
+ /** Runs one extraction pass for the bound analysis, and gives the raw value map back, or the refusal of its sandbox. */
63
+ export type ExtractionRunner = (requests: readonly ExtractionRequest[]) => Promise<Result<ExtractValuesResult, SuspendingRefusal>>;
118
64
  /**
119
65
  * Turn the raw script output into the arm result. A path with rows enters the map. A path with an error
120
66
  * drops out, thus the reference at that path reads as an unread artifact, which the seam contract expects.
@@ -125,6 +71,7 @@ export declare function extractionArtifactsFromResult(result: ExtractValuesResul
125
71
  /**
126
72
  * Make the extraction arm over a runner. One `extract` call makes one run with every request in it, and it
127
73
  * gives the value map. A run fault rejects the promise, and the resolver turns the rejection into a failed
128
- * reference. A suspension is the `err`, and the resolver reports its reason on each reference.
74
+ * reference. A refusal of the sandbox with the suspend flag is the `err`, and the resolver reports its reason on each
75
+ * reference.
129
76
  */
130
77
  export declare function createExtractionArm(run: ExtractionRunner): ExtractionArm;