@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
@@ -7,10 +7,10 @@
7
7
  *
8
8
  * 1. `mark-running` — update `cortex_step_executions` to running.
9
9
  * 2. `createSandbox` — provision the sandbox; persist its handle.
10
- * 3. `runAgent` — the harness agent loop. Every LLM and tool
11
- * call inside is its own durableStep.
12
- * 4. `generateFileMetadata`— the file-metadata continuation of the step agent.
13
- * 5. `generateStepSummary` — the summary continuation of the step agent,
10
+ * 3. `runLoop` — the harness agent loop. Every model call and
11
+ * tool call inside is its own durable step.
12
+ * 4. `generateFileMetadata`— the file-metadata follow-up request of the step agent.
13
+ * 5. `generateStepSummary` — the summary follow-up request of the step agent,
14
14
  * producing `output/summary.md`.
15
15
  * 6. `reconcile + register`— write artifact manifest entries to cortex_artifacts.
16
16
  * 7. `syncArtifacts` — register provenance + upload missing file_ids
@@ -20,25 +20,24 @@
20
20
  * 10. `mark-terminal` — write the final status, emit `data-step-activity`
21
21
  * onto the parent's DBOS stream.
22
22
  *
23
- * The parent owns sibling lifecycle: the halt cascade of a suspension lives
24
- * on the parent (`executeAnalysis`). This child owns its own teardown and its
25
- * own suspension (workflow-suspension spec): a `suspend` error of the agent
26
- * loop, or a refusal with the suspend flag of the label gate or the register
27
- * gate. The child records the reason on its row, sends the typed suspension on
28
- * `CHILD_SUSPENDED_TOPIC`, and self-cancels to CANCELLED (resumable, not ERROR).
23
+ * The parent owns sibling lifecycle. This child owns its own teardown and its
24
+ * own pause (work-pause spec): a failed model request of the agent loop with a
25
+ * cause of a pause, or a refusal with the suspend flag of the label gate or the
26
+ * register gate. The child waits in place, and the run row stays `running`. The
27
+ * other steps go on, and each one pauses at its own failure.
29
28
  */
30
- import { DBOS, Error as DBOSErrors } from "@dbos-inc/dbos-sdk";
29
+ import { DBOS } from "@dbos-inc/dbos-sdk";
30
+ import { isWorkflowCancellation } from "../runtime/dbos.js";
31
31
  import { insertStepExecution, updateStepExecution } from "../state/index.js";
32
32
  import { recordStepCompleted } from "../lib/metrics.js";
33
33
  import { createNoopLogger } from "../lib/console-logger.js";
34
34
  import { deliverNotice } from "../lib/hooks.js";
35
35
  import { unwrapOrThrow } from "../lib/result.js";
36
- import { runAgent } from "../loop/run-agent.js";
37
- import { durableStep } from "../loop/run-step.js";
38
- import { maskExcept } from "../loop/tool-mask.js";
36
+ import { maskExcept } from "../loop/call-policy.js";
37
+ import { runLoop } from "../loop/run-loop.js";
39
38
  import { READ_TOOL_OUTPUT_TOOL_ID } from "../loop/tool-output.js";
40
39
  import { lastExecOutcome } from "../sandbox/exec-outcome.js";
41
- import { activityEmission, activityForTool, applyTreeDelta, isChatDataPart, sandboxTreeDelta, stepPartId } from "../sandbox/sandbox-step-translate.js";
40
+ import { activityEmission, activityForTool, applyTreeDelta, isChatDataPart, sandboxTreeDelta, stepPartId, toolActivityKey, } from "../sandbox/sandbox-step-translate.js";
42
41
  import { createDetailResolver } from "../tools/detail-resolver.js";
43
42
  import { forSubAgent } from "../auth/types.js";
44
43
  import { walkStepArtifacts } from "../execution/post-step.js";
@@ -46,9 +45,9 @@ import { collectStepOutputs, describeStepRegistrationFailure, generateStepFileMe
46
45
  import { mintSandboxIdentity } from "../sandbox/identity.js";
47
46
  import { keepSuspendingRefusal } from "../sandbox/sandbox-error.js";
48
47
  import { ProvenanceCollector } from "../provenance/collector.js";
49
- import { createBlockerHolder, recordedBlocker } from "../tools/sandbox/report-blocker.js";
48
+ import { blockerOf } from "../tools/sandbox/report-blocker.js";
50
49
  import { createFileMetadataCell, SUBMIT_FILE_METADATA_TOOL_ID } from "../tools/sandbox/submit-file-metadata.js";
51
- import { cancelSelf, suspensionOfFailure, suspensionOfRefusal, suspensionOfSpawnRefusal } from "./suspension.js";
50
+ import { pauseAtGate, workPause } from "./pause.js";
52
51
  /**
53
52
  * Fallback when the plan step omits `timeout`. Plans that need 3-hour runs
54
53
  * declare it explicitly.
@@ -60,14 +59,6 @@ export const DEFAULT_STEP_TIMEOUT_SECONDS = 3600;
60
59
  * never model output — the summarizer does not run on this path.
61
60
  */
62
61
  export const CAPPED_OUT_EMPTY_REASON = "The step hit its iteration cap with no output files persisted.";
63
- /**
64
- * DBOS message topic the child uses to tell the parent that it suspends. The
65
- * message goes BEFORE `DBOS.cancelWorkflow(self)`, thus the parent's recv
66
- * accumulator records the child before the child's terminal state lands.
67
- * Without it the parent observes only `DBOSWorkflowCancelledError` from
68
- * `getResult`, and it cannot tell a suspension from a cancel.
69
- */
70
- export const CHILD_SUSPENDED_TOPIC = "child-suspended";
71
62
  // ── Helpers ───────────────────────────────────────────────────────────
72
63
  const NO_STEP_FILE_METADATA = { entries: [], messages: [] };
73
64
  /** Normalizes a pre-`messages` checkpoint (a bare entries array) for replay. */
@@ -153,27 +144,33 @@ export async function runSandboxStepBody(input, deps) {
153
144
  childWorkflowId,
154
145
  }));
155
146
  }, { name: "mark-running" });
156
- // The sandbox, if one stands, stays up for the resume. The steps run only on
157
- // this path, and a replay takes the same path from the same checkpoints.
158
- const suspendStep = async (suspension) => {
159
- const durationMs = (await DBOS.now()) - startedAt;
160
- await DBOS.runStep(async () => {
161
- unwrapOrThrow(await updateStepExecution(deps.pool, input.runId, input.stepId, {
162
- status: "canceled",
163
- durationMs,
164
- error: suspension.reason,
165
- attempts: 1,
166
- lastErrorClass: suspension.reason,
167
- }));
168
- recordStepCompleted({ agentId: input.agentId, status: "canceled", durationMs });
169
- }, { name: "mark-suspended" });
170
- const message = { kind: "suspended", childWorkflowId, stepId: input.stepId, reason: suspension.reason };
171
- await DBOS.runStep(() => DBOS.send(input.parentWorkflowId, message, CHILD_SUSPENDED_TOPIC), { name: "notify-parent-suspended" });
172
- return cancelSelf("self-cancel-suspended");
147
+ // Each step part goes to the CHILD's own `"events"` stream. `DBOS.writeStream`
148
+ // writes only to the stream of its own workflow, so the SSE route reads the
149
+ // parent's stream plus every active child's, addressed by
150
+ // `cortex_step_executions.child_workflow_id`. A failed write is non-fatal.
151
+ const emitToParentStream = (part) => DBOS.writeStream("events", part);
152
+ const safeEmit = async (part) => {
153
+ try {
154
+ await emitToParentStream(part);
155
+ }
156
+ catch (err) {
157
+ logger.warn("emitToParentStream failed (non-fatal)", logger.errorFields(err));
158
+ }
173
159
  };
160
+ // The step waits in place, and the sandbox, if one stands, stays up for the resume.
161
+ const pause = workPause({
162
+ pool: deps.pool,
163
+ workId: input.runId,
164
+ workKind: "run",
165
+ analysisId: input.analysisId,
166
+ emit: safeEmit,
167
+ retryDelaysMs: deps.pauseRetryDelaysMs,
168
+ run: { session: input.runSession, authorizer: deps.runAuthorizer },
169
+ logger,
170
+ });
174
171
  // Stamp the sandbox agent's id into provenance so loop events carry
175
172
  // `source.agentId === input.agentId` (the parent's RunSession still reads
176
- // "conversation-agent"). `run-agent.ts` builds source from
173
+ // "conversation-agent"). `run-loop.ts` builds source from
177
174
  // `session.provenance.agentId`, and billing tags ride the same provenance.
178
175
  const session = forSubAgent(input.runSession, input.agentId);
179
176
  const writePrefix = await deps.resolveWritePrefix(input);
@@ -193,11 +190,15 @@ export async function runSandboxStepBody(input, deps) {
193
190
  extraEnv: input.extraEnv,
194
191
  resources: input.resources,
195
192
  };
196
- const spawned = await DBOS.runStep(async () => keepSuspendingRefusal(await deps.sandboxClient.createSandbox(session, sandboxSpec, identity)), {
193
+ const spawn = () => DBOS.runStep(async () => keepSuspendingRefusal(await deps.sandboxClient.createSandbox(session, sandboxSpec, identity)), {
197
194
  name: "sandbox.create",
198
195
  });
199
- if (spawned.isErr())
200
- return suspendStep(suspensionOfSpawnRefusal(spawned.error));
196
+ let spawned = await spawn();
197
+ // A refusal of the label gate with the suspend flag waits in a pause, and the spawn runs again after the resume.
198
+ while (spawned.isErr()) {
199
+ await pauseAtGate(pause, spawned.error.reason);
200
+ spawned = await spawn();
201
+ }
201
202
  const sandbox = spawned.value;
202
203
  // Recovery path: re-check `isAlive` on the persisted ref before continuing.
203
204
  // A classified-dead sandbox triggers a fresh `createSandbox` (task 4.6).
@@ -210,7 +211,7 @@ export async function runSandboxStepBody(input, deps) {
210
211
  throw new Error(`sandbox ${sandbox.sandboxId} ${cause} — caller must restart the step`);
211
212
  }
212
213
  }, { name: "sandbox.recheck-alive" });
213
- // (3) runAgent — the harness loop with durableStep.
214
+ // (3) runLoop — the harness loop, each call a durable step.
214
215
  // The step deadline is captured ONCE at step start from the checkpointed
215
216
  // clock so it reproduces on replay — a raw `Date.now()` here would grow the
216
217
  // deadline on each recovery (see the harness-durable-runtime spec). `deadlineMs` is a getter so
@@ -218,7 +219,6 @@ export async function runSandboxStepBody(input, deps) {
218
219
  // fresh `now + timeout` per call would make a step with N tool calls runnable
219
220
  // for up to N × `timeoutSeconds`.
220
221
  const stepDeadlineMs = (await DBOS.now()) + (input.timeoutSeconds ?? DEFAULT_STEP_TIMEOUT_SECONDS) * 1000;
221
- const blockerHolder = createBlockerHolder();
222
222
  const fileMetadata = createFileMetadataCell();
223
223
  const agent = await deps.buildAgent({
224
224
  input,
@@ -227,10 +227,10 @@ export async function runSandboxStepBody(input, deps) {
227
227
  stepWritePrefix: writePrefix,
228
228
  deadlineMs: () => stepDeadlineMs,
229
229
  lineageCollector,
230
- blockerHolder,
230
+ reportsBlocker: true,
231
231
  fileMetadata,
232
232
  citationResolver: deps.citationResolver,
233
- ...(deps.toolOutputStore ? { toolOutputStore: deps.toolOutputStore } : {}),
233
+ toolOutputStore: deps.toolOutputStore,
234
234
  });
235
235
  if (deps.toolOutputStore !== undefined && !agent.tools.some((tool) => tool.id === READ_TOOL_OUTPUT_TOOL_ID)) {
236
236
  logger.warn("the step agent declares no read_tool_output, thus its loops keep no text of a cut tool result");
@@ -245,37 +245,23 @@ export async function runSandboxStepBody(input, deps) {
245
245
  // `tool-finished`) and model-output deltas are wrapped under the
246
246
  // `data-loop-event` envelope so the SSE consumer can route them.
247
247
  //
248
- // Every emit is `await`ed in order (the loop awaits its own emits, and the
249
- // exec awaits its sandbox-event emits). A body-path `DBOS.writeStream` lands
248
+ // Every emit is `await`ed in order. A body-path `DBOS.writeStream` lands
250
249
  // at a deterministic function-ID on replay (see the harness-durable-runtime
251
250
  // spec) — no fire-and-forget tail racing the next real op for the counter.
252
- // A sandbox event arrives from inside the step of its tool call; a write from
253
- // a step takes no function-ID, and a recovered step writes its events again.
251
+ // The events of a tool call arrive from inside the step of the call; a write
252
+ // from a step takes no function-ID, and a recovered step writes its events again.
254
253
  // `safeEmit` swallows a stream-write failure: a dropped UI frame is
255
254
  // non-fatal and must not fail the step.
256
- // Pattern A (fan-in at route): write to the CHILD's own `"events"` stream.
257
- // `DBOS.writeStream` writes only to the stream of its own workflow, so the
258
- // SSE route reads the parent's stream plus every active child's, addressed
259
- // by `cortex_step_executions.child_workflow_id`.
260
- const emitToParentStream = (part) => DBOS.writeStream("events", part);
261
- const safeEmit = async (part) => {
262
- try {
263
- await emitToParentStream(part);
264
- }
265
- catch (err) {
266
- logger.warn("emitToParentStream failed (non-fatal)", logger.errorFields(err));
267
- }
268
- };
269
255
  // Schema-conformant step-activity emitter. `data-step-activity` has a stable id per (runId, stepId),
270
256
  // so the run-stream fold collapses every phase transition latest-wins. Each emission also leaves one
271
257
  // `data-activity-entry` that the fold keeps, thus a late subscriber gets each line with its time. The
272
258
  // two parts share one checkpointed clock read. `activitySeq` advances before the clock read and the
273
259
  // writes, and each write fails alone through `safeEmit`.
274
260
  let activitySeq = 0;
275
- const emitActivity = async (phase, activity) => {
276
- const seq = activitySeq++;
261
+ const emitActivity = async (phase, activity, toolUseId) => {
262
+ const key = toolUseId === undefined ? activitySeq++ : toolActivityKey(toolUseId);
277
263
  const at = new Date(await DBOS.now()).toISOString();
278
- const parts = activityEmission(input, seq, phase, activity, at);
264
+ const parts = activityEmission(input, key, phase, activity, at);
279
265
  await safeEmit(parts.activity);
280
266
  await safeEmit(parts.entry);
281
267
  };
@@ -287,7 +273,7 @@ export async function runSandboxStepBody(input, deps) {
287
273
  // stay free of internal paths/hashes/managed-root jargon. A DBOS cancellation is
288
274
  // control-flow, not a failure — re-raise it verbatim.
289
275
  const failStep = async (errorClass, err) => {
290
- if (err instanceof DBOSErrors.DBOSWorkflowCancelledError)
276
+ if (isWorkflowCancellation(err))
291
277
  throw err;
292
278
  await tryTeardown(logger, deps, sandbox);
293
279
  const durationMs = (await DBOS.now()) - startedAt;
@@ -302,7 +288,7 @@ export async function runSandboxStepBody(input, deps) {
302
288
  errorClass,
303
289
  durationMs,
304
290
  hitMaxSteps,
305
- ...(lastExec ? { lastExec } : {}),
291
+ lastExec,
306
292
  ...logger.errorFields(err),
307
293
  });
308
294
  const safe = userFacingStepFailure(errorClass);
@@ -359,7 +345,7 @@ export async function runSandboxStepBody(input, deps) {
359
345
  // envelope, and surface each tool call as live step activity.
360
346
  await safeEmit({ type: "data-loop-event", data: { stepId: input.stepId, event } });
361
347
  if (event.type === "tool-started") {
362
- await emitActivity("executing", activityForTool(event.name, event.input, resolveDetail));
348
+ await emitActivity("executing", activityForTool(event.name, event.input, resolveDetail), event.toolUseId);
363
349
  }
364
350
  };
365
351
  const initial = [{ role: "user", content: input.prompt }];
@@ -368,39 +354,38 @@ export async function runSandboxStepBody(input, deps) {
368
354
  // is enforced at DBOS checkpoint (step) boundaries, not cooperatively in-loop.
369
355
  const neverAbort = new AbortController().signal;
370
356
  let transcript;
357
+ let steps;
371
358
  let finishReason;
372
359
  // `false` until the loop reports otherwise: a loop that throws never reached its cap.
373
360
  let hitMaxSteps = false;
374
361
  let stepUsage;
375
362
  try {
376
- const agentResult = await runAgent(agent, initial, session, {
363
+ const agentResult = await runLoop(agent, initial, session, {
377
364
  provider: deps.provider,
378
365
  signal: neverAbort,
379
366
  emit,
380
- runStep: durableStep,
381
367
  usageRecorder: deps.usageRecorder,
382
368
  toolOutputStore: deps.toolOutputStore,
383
- formatStepName: {
384
- llm: (iteration) => `llm:${iteration}`,
385
- tool: (toolName, toolUseId) => `tool:${toolName}:${toolUseId}`,
369
+ // The agent declares the output tool of the file-metadata follow-up
370
+ // request from its first request, and the task must not use it.
371
+ policy: {
372
+ mask: maskExcept(agent.tools.map((tool) => tool.id), [SUBMIT_FILE_METADATA_TOOL_ID]),
386
373
  },
387
- // The agent declares the output tool of the file-metadata
388
- // continuation from its first request, and the task must not use it.
389
- toolMask: maskExcept(agent.tools, [SUBMIT_FILE_METADATA_TOOL_ID]),
390
- isFatalLoopError: (err) => err instanceof DBOSErrors.DBOSWorkflowCancelledError,
374
+ // A blocker ends the step: the agent declared that it cannot do the work.
375
+ stopWhen: (done) => blockerOf(done) !== null,
376
+ pause: pause.afterFailure,
391
377
  });
392
378
  transcript = agentResult.messages;
379
+ steps = agentResult.steps;
393
380
  finishReason = agentResult.finish.reason;
394
381
  hitMaxSteps = agentResult.finish.cappedOut;
395
382
  stepUsage = agentResult.finish.usage;
396
383
  }
397
384
  catch (err) {
398
- const suspension = suspensionOfFailure(err);
399
- if (suspension !== undefined)
400
- return suspendStep(suspension);
401
- // Non-resumable failure — tear down, mark failed (scrubbed), re-raise so
385
+ // A failure with a cause of a pause waited in the loop, thus this one fails the step: tear down, mark failed (scrubbed), re-raise so
402
386
  // the parent's `getResult` sees ERROR and the fail-fast cascade fires.
403
387
  // `failStep` always throws; the outer `throw` is for control-flow analysis.
388
+ // oxlint-disable-next-line typescript/only-throw-error -- `failStep` always throws inside; the outer `throw` only ends the code path, and a wrapper would erase the scrubbed cause the parent reads.
404
389
  throw await failStep("agent_loop", err);
405
390
  }
406
391
  // What the step's loop spent, emitted the moment the loop is done and before
@@ -428,11 +413,12 @@ export async function runSandboxStepBody(input, deps) {
428
413
  // Manifest walk, hoisted above the blocked branch so the capped-out
429
414
  // predicate can read it. The call is inline (not `DBOS.runStep`-wrapped),
430
415
  // so the hoist shifts no function id (see the harness-durable-runtime spec).
416
+ const noManifest = [];
431
417
  const manifest = await safeRunValue(logger, () => walkStepArtifacts({
432
418
  writePrefix,
433
419
  stepId: input.stepId,
434
420
  runId: input.runId,
435
- }), "post-step.walk", []);
421
+ }), "post-step.walk", noManifest);
436
422
  // Blocker (see the harness-sandbox-agents spec): the agent declared it cannot fulfil the step. A
437
423
  // blocked step has no deliverables — skip the artifact post-step pipeline,
438
424
  // mark `blocked` (carrying the reason), emit the blocked part, and return a
@@ -444,9 +430,8 @@ export async function runSandboxStepBody(input, deps) {
444
430
  // reason. A capped-out step WITH artifacts stays on the completed path,
445
431
  // because partial output is real output.
446
432
  //
447
- // A replay does not rerun `execute`, so the cell is empty then; the
448
- // transcript is the durable record and takes precedence over the cell.
449
- const blockerOutcome = recordedBlocker(transcript) ?? blockerHolder.outcome;
433
+ // The recorded calls give the blocker on the first run and on each replay alike.
434
+ const blockerOutcome = blockerOf(steps);
450
435
  const cappedOutEmpty = hitMaxSteps && manifest.length === 0;
451
436
  if (blockerOutcome || cappedOutEmpty) {
452
437
  const blockedReason = blockerOutcome?.reason ?? CAPPED_OUT_EMPTY_REASON;
@@ -479,7 +464,7 @@ export async function runSandboxStepBody(input, deps) {
479
464
  durationMs,
480
465
  finishReason,
481
466
  error: blockedReason,
482
- ...(stepUsage ? { usage: stepUsage } : {}),
467
+ usage: stepUsage,
483
468
  };
484
469
  }
485
470
  // (4-8) post-step — the body is the explicit composition: the manifest from
@@ -533,21 +518,29 @@ export async function runSandboxStepBody(input, deps) {
533
518
  runId: input.runId,
534
519
  stepId: input.stepId,
535
520
  }, session));
536
- let registered;
537
- try {
538
- registered = await reconcileAndRegisterStepArtifacts(deps, postCtx, manifest);
539
- }
540
- catch (attestationErr) {
541
- if (attestationErr instanceof DBOSErrors.DBOSWorkflowCancelledError)
542
- throw attestationErr;
521
+ const register = async () => {
522
+ let registration;
523
+ try {
524
+ registration = await reconcileAndRegisterStepArtifacts(deps, postCtx, manifest);
525
+ }
526
+ catch (attestationErr) {
527
+ if (isWorkflowCancellation(attestationErr))
528
+ throw attestationErr;
529
+ await syncStepArtifacts();
530
+ // oxlint-disable-next-line typescript/only-throw-error -- `failStep` always throws inside; the outer `throw` only ends the code path, and a wrapper would erase the scrubbed cause the parent reads.
531
+ throw await failStep("lineage_attestation", attestationErr);
532
+ }
543
533
  await syncStepArtifacts();
544
- throw await failStep("lineage_attestation", attestationErr);
534
+ return registration;
535
+ };
536
+ let registered = await register();
537
+ // A refusal of the register gate with the suspend flag waits in a pause, and the registration runs again after the resume.
538
+ while (registered.isErr() && registered.error.kind === "refused" && registered.error.refusal.kind === "suspended") {
539
+ await pauseAtGate(pause, registered.error.refusal.reason);
540
+ registered = await register();
545
541
  }
546
- await syncStepArtifacts();
547
542
  if (registered.isErr()) {
548
- const refused = registered.error.kind === "refused" ? suspensionOfRefusal(registered.error.refusal) : undefined;
549
- if (refused !== undefined)
550
- return suspendStep(refused);
543
+ // oxlint-disable-next-line typescript/only-throw-error -- `failStep` always throws inside; the outer `throw` only ends the code path.
551
544
  throw await failStep("lineage_attestation", new Error(describeStepRegistrationFailure(registered.error)));
552
545
  }
553
546
  const reconciledManifest = registered.value;
@@ -629,7 +622,7 @@ export async function runSandboxStepBody(input, deps) {
629
622
  durationMs,
630
623
  finishReason,
631
624
  error: null,
632
- ...(stepUsage ? { usage: stepUsage } : {}),
625
+ usage: stepUsage,
633
626
  };
634
627
  }
635
628
  /**
@@ -642,7 +635,7 @@ async function safeRun(logger, fn, label) {
642
635
  await fn();
643
636
  }
644
637
  catch (err) {
645
- if (err instanceof DBOSErrors.DBOSWorkflowCancelledError)
638
+ if (isWorkflowCancellation(err))
646
639
  throw err;
647
640
  // The stage rides as a namespace, not interpolated prose: `label` is what
648
641
  // says WHICH post-step stage degraded, and a reader must be able to filter
@@ -660,7 +653,7 @@ async function safeRunValue(logger, fn, label, fallback) {
660
653
  return await fn();
661
654
  }
662
655
  catch (err) {
663
- if (err instanceof DBOSErrors.DBOSWorkflowCancelledError)
656
+ if (isWorkflowCancellation(err))
664
657
  throw err;
665
658
  // The stage rides as a namespace, not interpolated prose: `label` is what
666
659
  // says WHICH post-step stage degraded, and a reader must be able to filter
@@ -0,0 +1,21 @@
1
+ /**
2
+ * The SQL write shapes that the workflow tests match on recorded queries. The
3
+ * templates of the body wrap their SQL across lines, so each shape carries the
4
+ * flexible whitespace of that wrapping. One matcher per write, named for the
5
+ * write it finds.
6
+ */
7
+ export declare const ANALYSIS_STATE_WRITE: RegExp;
8
+ export declare const PAUSE_RECORD_WRITE: RegExp;
9
+ export declare const PAUSE_CLEAR_WRITE: RegExp;
10
+ export declare const PAUSES_OF_WORK_CLEAR_WRITE: RegExp;
11
+ export declare const RUNS_STATUS_WRITE: RegExp;
12
+ export declare const RUNS_STATUS_WRITE_ANY_CASE: RegExp;
13
+ export declare const SYNTHESIS_STATUS_WRITE: RegExp;
14
+ export declare const STEP_SEED_INSERT: RegExp;
15
+ export declare const ON_CONFLICT_DO_NOTHING: RegExp;
16
+ export declare const ON_CONFLICT_DO_UPDATE: RegExp;
17
+ export declare const STEP_STATUS_WRITE_PARAM: RegExp;
18
+ export declare const SKIPPED_SWEEP_WRITE: RegExp;
19
+ export declare const RUN_STATUS_WRITE_PARAM: RegExp;
20
+ export declare const STEP_EXECUTIONS_UPDATE: RegExp;
21
+ export declare const RUNS_PARTS_WRITE: RegExp;
@@ -0,0 +1,36 @@
1
+ /**
2
+ * The SQL write shapes that the workflow tests match on recorded queries. The
3
+ * templates of the body wrap their SQL across lines, so each shape carries the
4
+ * flexible whitespace of that wrapping. One matcher per write, named for the
5
+ * write it finds.
6
+ */
7
+ // oxlint-disable-next-line eslint-js/no-restricted-syntax -- any write of the analysis row, across wrapped SQL lines
8
+ export const ANALYSIS_STATE_WRITE = /UPDATE\s+cortex_analysis_state/i;
9
+ // oxlint-disable-next-line eslint-js/no-restricted-syntax -- the row that a workflow writes before it waits in a pause, across wrapped SQL lines
10
+ export const PAUSE_RECORD_WRITE = /INSERT INTO cortex_paused_work/i;
11
+ // oxlint-disable-next-line eslint-js/no-restricted-syntax -- the delete of the row of one waiting workflow
12
+ export const PAUSE_CLEAR_WRITE = /DELETE FROM cortex_paused_work WHERE workflow_id = \$1/i;
13
+ // oxlint-disable-next-line eslint-js/no-restricted-syntax -- the delete of each row of a pause of one work
14
+ export const PAUSES_OF_WORK_CLEAR_WRITE = /DELETE FROM cortex_paused_work WHERE work_id = \$1/i;
15
+ // oxlint-disable-next-line eslint-js/no-restricted-syntax -- the run status write, across wrapped SQL lines
16
+ export const RUNS_STATUS_WRITE = /UPDATE cortex_runs\s+SET status/;
17
+ // oxlint-disable-next-line eslint-js/no-restricted-syntax -- the run status write in any letter case, across wrapped SQL lines
18
+ export const RUNS_STATUS_WRITE_ANY_CASE = /UPDATE\s+cortex_runs\s+SET\s+status/i;
19
+ // oxlint-disable-next-line eslint-js/no-restricted-syntax -- the synthesis status write on the run row, across wrapped SQL lines
20
+ export const SYNTHESIS_STATUS_WRITE = /UPDATE\s+cortex_runs\s+SET\s+synthesis_status/i;
21
+ // oxlint-disable-next-line eslint-js/no-restricted-syntax -- the seed insert of the step ledger, across wrapped SQL lines
22
+ export const STEP_SEED_INSERT = /INSERT INTO cortex_step_executions/i;
23
+ // oxlint-disable-next-line eslint-js/no-restricted-syntax -- the conflict arm of the seed insert, across wrapped SQL lines
24
+ export const ON_CONFLICT_DO_NOTHING = /DO NOTHING/i;
25
+ // oxlint-disable-next-line eslint-js/no-restricted-syntax -- the conflict arm of the mark-running upsert, across wrapped SQL lines
26
+ export const ON_CONFLICT_DO_UPDATE = /DO UPDATE/i;
27
+ // oxlint-disable-next-line eslint-js/no-restricted-syntax -- the parameterized terminal status write on the step ledger, across wrapped SQL lines
28
+ export const STEP_STATUS_WRITE_PARAM = /UPDATE cortex_step_executions\s+SET status = \$1/i;
29
+ // oxlint-disable-next-line eslint-js/no-restricted-syntax -- the terminal sweep of pending steps to skipped, across wrapped SQL lines
30
+ export const SKIPPED_SWEEP_WRITE = /UPDATE cortex_step_executions\s+SET status = 'skipped'/i;
31
+ // oxlint-disable-next-line eslint-js/no-restricted-syntax -- the parameterized run status write, across wrapped SQL lines
32
+ export const RUN_STATUS_WRITE_PARAM = /UPDATE cortex_runs\s+SET status = \$1/i;
33
+ // oxlint-disable-next-line eslint-js/no-restricted-syntax -- the step-ledger update that marks a canceled step, across wrapped SQL lines
34
+ export const STEP_EXECUTIONS_UPDATE = /UPDATE\s+cortex_step_executions/i;
35
+ // oxlint-disable-next-line eslint-js/no-restricted-syntax -- the parts write on the run row, across wrapped SQL lines
36
+ export const RUNS_PARTS_WRITE = /UPDATE\s+cortex_runs\s+SET\s+parts/i;
@@ -76,7 +76,7 @@ export type ReadBytesResult = {
76
76
  } | {
77
77
  readonly kind: "out_of_scope";
78
78
  };
79
- export interface WorkspaceFilesystem {
79
+ export type WorkspaceFilesystem = {
80
80
  /**
81
81
  * Read a workspace file. `headLines` / `tailLines` (mutually exclusive,
82
82
  * enforced by the caller) constrain the read to the first N / last N
@@ -123,22 +123,22 @@ export interface WorkspaceFilesystem {
123
123
  readonly path: string;
124
124
  readonly workingDir?: string;
125
125
  }): ResultAsync<StatResult, FsError>;
126
- }
126
+ };
127
127
  /**
128
128
  * Adapter for fetching files that aren't present locally. The managed
129
129
  * realization downloads via object-store presigned URLs; the OSS build omits
130
130
  * the fallback (files are local) and tests pass a fake.
131
131
  */
132
- export interface PresignedFallback {
132
+ export type PresignedFallback = {
133
133
  fetch(args: {
134
134
  readonly session: AgentSession;
135
135
  readonly relativePath: string;
136
136
  }): Promise<Buffer | null>;
137
- }
138
- export interface WorkspaceFilesystemDeps {
137
+ };
138
+ export type WorkspaceFilesystemDeps = {
139
139
  /** Embedder-supplied workspace-root resolution seam (see workspace/paths.ts). */
140
140
  readonly resolveWorkspaceRoot: ResolveWorkspaceRoot;
141
141
  /** Optional fallback for files not present locally. */
142
142
  readonly presignedFallback?: PresignedFallback;
143
- }
143
+ };
144
144
  export declare function createWorkspaceFilesystem(deps: WorkspaceFilesystemDeps): WorkspaceFilesystem;
@@ -34,7 +34,8 @@ import { createInterface } from "node:readline";
34
34
  import { join } from "node:path";
35
35
  import { ResultAsync, ok } from "neverthrow";
36
36
  import { scopeResource } from "../auth/types.js";
37
- import { tryFetch, tryFs } from "../lib/fs-result.js";
37
+ import { tryFetch, tryFs, errnoOf } from "../lib/fs-result.js";
38
+ import { splitLines } from "../lib/text.js";
38
39
  import { classifyWithinRoot } from "../lib/fs-helpers.js";
39
40
  import { resolveWorkspacePath } from "./paths.js";
40
41
  // ── Constructor ───────────────────────────────────────────────────────────
@@ -226,7 +227,8 @@ function collectEntries(dir, dirents) {
226
227
  * off-tree, re-opening the read-exfiltration hole for the length of the race
227
228
  * (CWE-367). `O_NOFOLLOW` makes the leaf open atomic — a symlinked final
228
229
  * component fails `ELOOP` in the same syscall that opens it, so there is no
229
- * check/use gap. `?? 0` keeps the mask valid on a platform that lacks the flag.
230
+ * check/use gap. On a platform that lacks the flag, the bitwise OR coerces the
231
+ * absent constant to 0 and the mask stays valid.
230
232
  *
231
233
  * This refuses EVERY leaf symlink, including an in-tree one the persistent check
232
234
  * would allow: pure Node cannot express "follow only if it stays in-tree" (that
@@ -236,7 +238,7 @@ function collectEntries(dir, dirents) {
236
238
  * exposes no `openat2`); the upstream realpath check still rejects the
237
239
  * persistent case of that.
238
240
  */
239
- const READ_NO_FOLLOW = fsConstants.O_RDONLY | (fsConstants.O_NOFOLLOW ?? 0);
241
+ const READ_NO_FOLLOW = fsConstants.O_RDONLY | fsConstants.O_NOFOLLOW;
240
242
  /**
241
243
  * Open a workspace file read-only without following a leaf symlink (see
242
244
  * {@link READ_NO_FOLLOW}). A symlinked final component surfaces as `out_of_scope`
@@ -251,7 +253,7 @@ function openReadNoFollow(absolute) {
251
253
  return { kind: "ok", fh: await fsOpen(absolute, READ_NO_FOLLOW) };
252
254
  }
253
255
  catch (cause) {
254
- if (cause.code === "ELOOP")
256
+ if (errnoOf(cause) === "ELOOP")
255
257
  return { kind: "out_of_scope" };
256
258
  throw cause;
257
259
  }
@@ -372,7 +374,7 @@ function readTailLines(absolute, totalSize, tailLines, maxBytes) {
372
374
  if (windowSize > 0) {
373
375
  await fh.read(buf, 0, windowSize, offset);
374
376
  }
375
- const allLines = buf.toString("utf8").split(/\r?\n/);
377
+ const allLines = splitLines(buf.toString("utf8"));
376
378
  // Drop the partial leading line if the window doesn't cover the file start.
377
379
  const candidateLines = offset > 0 ? allLines.slice(1) : allLines;
378
380
  const sliced = candidateLines.length > tailLines ? candidateLines.slice(-tailLines) : candidateLines;
@@ -391,7 +393,7 @@ function readTailLines(absolute, totalSize, tailLines, maxBytes) {
391
393
  }
392
394
  function sliceHeadLines(content, headLines, maxBytes) {
393
395
  const capped = maxBytes !== undefined && content.length > maxBytes ? content.subarray(0, maxBytes) : content;
394
- const lines = capped.toString("utf8").split(/\r?\n/);
396
+ const lines = splitLines(capped.toString("utf8"));
395
397
  const slice = lines.slice(0, headLines);
396
398
  const out = Buffer.from(slice.join("\n"));
397
399
  if (maxBytes !== undefined && content.length > maxBytes && slice.length < headLines) {
@@ -401,12 +403,12 @@ function sliceHeadLines(content, headLines, maxBytes) {
401
403
  }
402
404
  function sliceTailLines(content, tailLines, maxBytes) {
403
405
  if (maxBytes === undefined || content.length <= maxBytes) {
404
- const lines = content.toString("utf8").split(/\r?\n/);
406
+ const lines = splitLines(content.toString("utf8"));
405
407
  const slice = lines.length > tailLines ? lines.slice(-tailLines) : lines;
406
408
  return { kind: "ok", content: Buffer.from(slice.join("\n")), truncated: false };
407
409
  }
408
410
  const window = content.subarray(content.length - maxBytes);
409
- const lines = window.toString("utf8").split(/\r?\n/).slice(1);
411
+ const lines = splitLines(window.toString("utf8")).slice(1);
410
412
  const slice = lines.length > tailLines ? lines.slice(-tailLines) : lines;
411
413
  const out = Buffer.from(slice.join("\n"));
412
414
  if (slice.length < tailLines) {
@@ -204,7 +204,7 @@ export declare function reportSessionDir(threadId: string): string;
204
204
  */
205
205
  export declare function reportSessionDerivedDir(threadId: string): string;
206
206
  /**
207
- * True when `value` is a safe single path segment: the `SAFE_ID` charset (word
207
+ * True when `value` is a safe single path segment: the safe-id charset (word
208
208
  * chars, `.`, `-` — no slash, NUL, or shell-hostile char) AND not a pure-dot
209
209
  * segment (`.`/`..`), which the charset otherwise admits and which `resolve`/`join`
210
210
  * would treat as the current/parent directory and use to climb the tree. The one
@@ -179,7 +179,7 @@ export function toAnalysisRootPath(resourceId, path) {
179
179
  return joinAnalysisRoot(resourceId, normalizeTail(rooted));
180
180
  // A record holds no host path. Thus a leading slash is how a model writes the
181
181
  // same root-relative path, and the remainder is the tail.
182
- const tail = normalizeTail(trimmed.replace(/^\/+/, ""));
182
+ const tail = normalizeTail(stripLeadingSlashes(trimmed));
183
183
  if (tail === ".." || tail.startsWith("../"))
184
184
  return trimmed;
185
185
  return joinAnalysisRoot(resourceId, tail);
@@ -239,9 +239,15 @@ function stripAnalysisRoot(path, analysisId) {
239
239
  return null;
240
240
  return slashIdx === -1 ? "" : withoutLead.slice(slashIdx + 1);
241
241
  }
242
- const SAFE_ID = /^[\w.-]+$/;
242
+ /** The text without its leading slashes. */
243
+ function stripLeadingSlashes(value) {
244
+ let start = 0;
245
+ while (start < value.length && value.charAt(start) === "/")
246
+ start++;
247
+ return value.slice(start);
248
+ }
243
249
  /**
244
- * True when `value` is a safe single path segment: the `SAFE_ID` charset (word
250
+ * True when `value` is a safe single path segment: the safe-id charset (word
245
251
  * chars, `.`, `-` — no slash, NUL, or shell-hostile char) AND not a pure-dot
246
252
  * segment (`.`/`..`), which the charset otherwise admits and which `resolve`/`join`
247
253
  * would treat as the current/parent directory and use to climb the tree. The one
@@ -250,7 +256,12 @@ const SAFE_ID = /^[\w.-]+$/;
250
256
  * same at plan time and at mount time.
251
257
  */
252
258
  export function isSafeId(value) {
253
- return SAFE_ID.test(value) && value !== "." && value !== "..";
259
+ return isSafeIdCharset(value) && value !== "." && value !== "..";
260
+ }
261
+ function isSafeIdCharset(value) {
262
+ if (value.length === 0)
263
+ return false;
264
+ return Array.from(value).every((char) => (char >= "a" && char <= "z") || (char >= "A" && char <= "Z") || (char >= "0" && char <= "9") || char === "_" || char === "." || char === "-");
254
265
  }
255
266
  /**
256
267
  * Throwing form of {@link isSafeId} for the mount/host-path builders. Ids are
@@ -5,7 +5,7 @@
5
5
  * read-time workspaces (chat, workflow agents) so they share the
6
6
  * same persistent per-analysis pgvector index.
7
7
  */
8
- import type { Pool } from "pg";
8
+ import type { Querier } from "../state/db.js";
9
9
  /** Derive the vector index name for an analysis. */
10
10
  export declare function searchIndexName(resourceId: string): string;
11
11
  /**
@@ -20,4 +20,4 @@ export declare function searchIndexName(resourceId: string): string;
20
20
  * upsert. Per-analysis dimension tracking / re-embedding on a provider switch
21
21
  * is a deliberate non-feature for now.
22
22
  */
23
- export declare function ensureSearchIndex(pool: Pool, resourceId: string, dimensions: number): Promise<void>;
23
+ export declare function ensureSearchIndex(pool: Querier, resourceId: string, dimensions: number): Promise<void>;