@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
@@ -5,11 +5,10 @@
5
5
  * The operation owns no table. It composes the reads and the writes that the
6
6
  * store, the thread history, and the working memory already give. `getThread`
7
7
  * finds the parent, and `latestSeq` gives the anchor. `listThreads` counts the
8
- * report children, and `createThread` writes the insert. `render` and
9
- * `appendTurn` make the seed, and `purgeThread` removes a child that holds no
10
- * seed. The two storage reads that this capability adds, `latestSeq` and
11
- * `countUserTurnsAfter`, live on the thread history, because that module owns
12
- * the `messages` table.
8
+ * report children, and `render` makes the seed. `createThread` writes the row
9
+ * and the seed in one transaction. The two storage reads that this capability
10
+ * adds, `latestSeq` and `countUserTurnsAfter`, live on the thread history,
11
+ * because that module owns the `messages` table.
13
12
  *
14
13
  * The reads and the insert take no lock and no transaction. A concurrent turn
15
14
  * can append between the anchor read and the insert, and a retract can cut the
@@ -18,8 +17,10 @@
18
17
  * past the parent's current end is a normal state a reader expects.
19
18
  *
20
19
  * A conversation thread id comes from the host UI. But the spawn is a harness
21
- * operation with no UI in front of it. Thus it mints a `randomUUID` and returns
22
- * the full row. A managed deployment gets the same behavior with no host code.
20
+ * operation with no UI in front of it. Thus the caller gives the child id, or
21
+ * the spawn mints a `randomUUID`, and the spawn returns the full row. A managed
22
+ * deployment gets the same behavior with no host code. A second spawn with the
23
+ * id of a child gives that child, and it writes nothing.
23
24
  *
24
25
  * The spawn also gates on the eyes of the composition. A report session records
25
26
  * a version only after a look at the rendered page, and only a browser can look.
@@ -32,9 +33,9 @@
32
33
  * The spawn seeds the context of the child at the anchor. It writes one message
33
34
  * that holds the brief and a copy of the working-memory render. The transcript
34
35
  * is append-only, thus the copy stays frozen at the anchor by construction, and
35
- * a later change to the working memory leaves it as it is. When the seed write
36
- * fails, the spawn purges the child, because a report thread with no context is
37
- * a dead end.
36
+ * a later change to the working memory leaves it as it is. The row and the seed
37
+ * commit in one transaction, because a report thread with no context is a dead
38
+ * end.
38
39
  *
39
40
  * The seed takes no redaction pass, and that is deliberate. The two parts are
40
41
  * agent-authored, the same trust tier as the working-memory render of a
@@ -169,34 +170,14 @@ export function createReportSessionSpawn(deps) {
169
170
  // An unbound member gives a call that does nothing, thus the spawn emits at
170
171
  // one site with no test of its own.
171
172
  const observe = bindSessionEmit(deps.provenance, log);
172
- /**
173
- * Write the one seed message of the child and give the child back. The
174
- * message rides as a record, not as user input: nobody typed it in the child
175
- * thread, and a record is displayed but it never opens a turn.
176
- */
177
- function seedChildContext(child, brief) {
178
- return workingMemory
179
- .render(child.analysisId)
180
- .andThen((memory) => history.appendTurn(child.threadId, conversationRecordTurn(composeSeed(brief, memory))))
181
- .map(() => child)
182
- .orElse((fault) =>
183
- // A report thread with no context is a dead end, thus the purge
184
- // removes the child. The seed fault is the cause, thus it returns
185
- // from each route. A failed purge leaves the child, and the caller
186
- // still reads why the seed stopped.
187
- store
188
- .purgeThread(child.threadId)
189
- .andThen(() => errAsync(fault))
190
- .orElse(() => errAsync(fault)));
191
- }
192
173
  /**
193
174
  * Pin the data snapshot of the child, through the injected anchor operation.
194
175
  * The spawn mints one moment, and the transcript anchor and this snapshot are
195
176
  * the two pins of that moment.
196
177
  *
197
- * The pin runs after the seed. A failed seed purges the child, and
178
+ * The pin runs after the row and the seed commit.
198
179
  * `cortex_report_session_state` carries no foreign key to the thread table,
199
- * thus a pin before a purged seed would leave an orphan row.
180
+ * thus a pin before a failed create would leave an orphan row.
200
181
  *
201
182
  * A failed pin keeps the child. The operation is idempotent, thus the first
202
183
  * session tool call pins again, and a purge on a transient store fault would
@@ -247,7 +228,7 @@ export function createReportSessionSpawn(deps) {
247
228
  return collectReportChildren(analysisId, parentThreadId, page + 1, all);
248
229
  });
249
230
  }
250
- function spawnReportSession(parentThreadId, brief) {
231
+ function spawnReportSession(parentThreadId, brief, childThreadId = randomUUID()) {
251
232
  // The gate runs before the parent read. A session with no route to a look
252
233
  // reaches the record gate and refuses there forever, thus the spawn is the
253
234
  // one honest place to say so.
@@ -274,18 +255,22 @@ export function createReportSessionSpawn(deps) {
274
255
  // The result is two titles a user renames, and no identifier collides.
275
256
  return store
276
257
  .listThreads({ analysisId: parent.analysisId, type: "report", parentThreadId })
277
- .andThen((children) => store
278
- .createThread({
279
- threadId: randomUUID(),
258
+ .andThen((children) =>
259
+ // The render follows the anchor read, thus the copy of the
260
+ // working memory is the state at the anchor.
261
+ workingMemory
262
+ .render(parent.analysisId)
263
+ .andThen((memory) => store.createThread({
264
+ threadId: childThreadId,
280
265
  analysisId: parent.analysisId,
281
266
  title: composeTitle(parent.title, children.total + 1),
282
267
  type: "report",
283
268
  parentThreadId,
284
269
  parentSeq: anchor,
285
- })
286
- // The seed follows the insert, thus the copy of the working
287
- // memory is the state at the anchor.
288
- .andThen((child) => seedChildContext(child, brief))
270
+ // The seed rides as a record, not as user input: nobody typed it in
271
+ // the child thread, and a record is displayed but it never opens a turn.
272
+ firstTurn: conversationRecordTurn(composeSeed(brief, memory)),
273
+ }))
289
274
  // The pin follows the seed. `pinSessionSnapshot` never
290
275
  // rejects, thus the safe bridge adds no error variant.
291
276
  .andThen((child) => ResultAsync.fromSafePromise(pinSessionSnapshot(child))));
@@ -14,23 +14,23 @@
14
14
  * honest non-fatal outcomes (no summaries, blocker) return empty findings after
15
15
  * a `skipped` phase.
16
16
  */
17
- import type { Pool } from "pg";
17
+ import type { Querier } from "../state/db.js";
18
18
  import type { SynthesisPhase } from "@inflexa-ai/harness/contracts/chat-parts.js";
19
19
  import type { RunSession } from "../auth/types.js";
20
+ import type { LoopOptions } from "../loop/run-loop.js";
20
21
  import type { ToolOutputStore } from "../loop/tool-output.js";
21
22
  import type { EmitFn } from "../loop/types.js";
22
23
  import type { ChatProvider, EmbeddingProvider } from "../providers/types.js";
23
- import type { BioToolKeys } from "../tools/bio/keys.js";
24
24
  import type { RunFinding } from "../workflows/execute-analysis.js";
25
25
  import type { ResolveWorkspaceRoot } from "../workspace/paths.js";
26
26
  import type { SynthesisStatus } from "../state/index.js";
27
27
  import type { Logger } from "../lib/logger.js";
28
28
  import type { UsageRecorder } from "../billing/usage-recorder.js";
29
- import type { CitationResolver } from "../citations/types.js";
30
- export interface SynthesizeRunDeps {
29
+ import type { Tool } from "../tools/define-tool.js";
30
+ export type SynthesizeRunDeps = {
31
31
  /** Operational logging seam; omitted falls back to no-op. */
32
32
  readonly logger?: Logger;
33
- readonly pool: Pool;
33
+ readonly pool: Querier;
34
34
  readonly provider: ChatProvider;
35
35
  /** Write-side embedder — its `dimensions` sizes the per-analysis index. */
36
36
  readonly embedding: EmbeddingProvider;
@@ -38,22 +38,20 @@ export interface SynthesizeRunDeps {
38
38
  readonly resolveWorkspaceRoot: ResolveWorkspaceRoot;
39
39
  /** Model id for the synthesizer agent loop. */
40
40
  readonly synthesisModel: string;
41
- /** API keys for the bio/chem tools the embedded literature reviewer uses. */
42
- readonly bioKeys: BioToolKeys;
43
- /** Shared resolver used by the embedded literature reviewer. */
44
- readonly citationResolver: CitationResolver;
41
+ /** The `literature_reviewer` tool of the synthesizer. */
42
+ readonly literatureReviewer: Tool;
45
43
  /** LLM usage-accounting seam for the synthesizer loop; omitted falls back to the no-op recorder. */
46
44
  readonly usageRecorder?: UsageRecorder;
47
45
  /** The store of the synthesizer and reviewer loops and of their read tools. */
48
46
  readonly toolOutputStore?: ToolOutputStore;
49
- }
47
+ };
50
48
  /** Optional fields for a progress update, mirroring the wire part. */
51
- export interface SynthesisProgressExtra {
49
+ export type SynthesisProgressExtra = {
52
50
  readonly delegationCount?: number;
53
51
  readonly reason?: string;
54
52
  readonly error?: string;
55
- }
56
- export interface SynthesizeRunParams {
53
+ };
54
+ export type SynthesizeRunParams = {
57
55
  readonly analysisId: string;
58
56
  readonly runId: string;
59
57
  readonly completedSteps: readonly string[];
@@ -62,10 +60,18 @@ export interface SynthesizeRunParams {
62
60
  readonly emit: EmitFn;
63
61
  /** Domain progress callback — the phases the run-completed UI renders. */
64
62
  readonly onProgress: (phase: SynthesisPhase, activity: string, extra?: SynthesisProgressExtra) => void | Promise<void>;
65
- }
66
- export interface SynthesizeRunResult {
63
+ /**
64
+ * Run a read or a write of the synthesis once: a step in the body of a workflow, a plain call in a process. The
65
+ * loop of the synthesizer runs outside it, thus each of its model calls is a step of its own, and each reviewer
66
+ * call starts a child workflow.
67
+ */
68
+ readonly durably: <T>(name: string, run: () => Promise<T>) => Promise<T>;
69
+ /** The pause of the run, for the loop of the synthesizer. Absent: a failed request fails the synthesis. */
70
+ readonly pause?: LoopOptions["pause"];
71
+ };
72
+ export type SynthesizeRunResult = {
67
73
  readonly findings: readonly RunFinding[];
68
74
  readonly synthesisStatus: Exclude<SynthesisStatus, "failed">;
69
75
  readonly synthesisReason: string | null;
70
- }
76
+ };
71
77
  export declare function synthesizeRun(deps: SynthesizeRunDeps, params: SynthesizeRunParams): Promise<SynthesizeRunResult>;
@@ -14,6 +14,9 @@
14
14
  * honest non-fatal outcomes (no summaries, blocker) return empty findings after
15
15
  * a `skipped` phase.
16
16
  */
17
+ import { errorMessageOf } from "../lib/thrown.js";
18
+ import { textOf } from "../lib/unknown-text.js";
19
+ import { z } from "zod";
17
20
  import { forSubAgent } from "../auth/types.js";
18
21
  import { buildRunSynthesisPart, formatSynthesisEmbeddingText, generateRunSynthesis, loadStepSummariesFromDisk, persistSynthesis, } from "../execution/run-synthesis.js";
19
22
  import { ensureSearchIndex, searchIndexName } from "../workspace/search-config.js";
@@ -22,15 +25,13 @@ import { loadPlan, queryRun } from "../state/index.js";
22
25
  import { unwrapOrThrow } from "../lib/result.js";
23
26
  import { createNoopLogger } from "../lib/console-logger.js";
24
27
  export async function synthesizeRun(deps, params) {
25
- const { pool, provider, embedding, resolveWorkspaceRoot, synthesisModel, bioKeys, citationResolver, usageRecorder } = deps;
26
- const { analysisId, runId, completedSteps, session, emit, onProgress } = params;
28
+ const { pool, provider, embedding, resolveWorkspaceRoot, synthesisModel, literatureReviewer, usageRecorder } = deps;
29
+ const { analysisId, runId, completedSteps, session, emit, onProgress, durably, pause } = params;
27
30
  await onProgress("starting", "Beginning literature-grounded synthesis");
28
31
  try {
29
- const workspaceRoot = await resolveWorkspaceRoot(analysisId);
30
- const summaries = await loadStepSummariesFromDisk({
31
- workspaceRoot,
32
- runId,
33
- completedSteps,
32
+ const { workspaceRoot, summaries } = await durably("synthesis.read-summaries", async () => {
33
+ const root = await resolveWorkspaceRoot(analysisId);
34
+ return { workspaceRoot: root, summaries: await loadStepSummariesFromDisk({ workspaceRoot: root, runId, completedSteps }) };
34
35
  });
35
36
  if (summaries.length === 0) {
36
37
  const logger = (deps.logger ?? createNoopLogger()).named("synthesize-run");
@@ -40,20 +41,20 @@ export async function synthesizeRun(deps, params) {
40
41
  });
41
42
  return { findings: [], synthesisStatus: "skipped_no_summaries", synthesisReason: "no-summaries" };
42
43
  }
43
- const planNarrative = await loadPlanNarrative(pool, runId, analysisId);
44
+ const planNarrative = await durably("synthesis.read-plan", () => loadPlanNarrative(pool, runId, analysisId));
44
45
  const synthesizerSession = forSubAgent(session, "run-synthesizer");
45
46
  const result = await generateRunSynthesis({
46
47
  provider,
47
48
  session: synthesizerSession,
48
49
  model: synthesisModel,
49
- bioKeys,
50
- citationResolver,
50
+ literatureReviewer,
51
51
  usageRecorder,
52
- ...(deps.toolOutputStore ? { toolOutputStore: deps.toolOutputStore } : {}),
52
+ toolOutputStore: deps.toolOutputStore,
53
53
  summaries,
54
54
  planNarrative,
55
55
  runId,
56
56
  emit,
57
+ pause,
57
58
  });
58
59
  if (result.kind === "skipped") {
59
60
  const logger = (deps.logger ?? createNoopLogger()).named("synthesize-run");
@@ -68,27 +69,29 @@ export async function synthesizeRun(deps, params) {
68
69
  }
69
70
  const synthesis = result.synthesis;
70
71
  await onProgress("indexing", "Indexing synthesis for search");
71
- try {
72
- await ensureSearchIndex(pool, analysisId, embedding.dimensions);
73
- const vectorStore = createVectorStore(pool);
74
- const indexName = searchIndexName(analysisId);
75
- const synthesisText = formatSynthesisEmbeddingText(synthesis);
76
- const [vector] = unwrapOrThrow(await embedding.embed([synthesisText], synthesizerSession));
77
- if (!vector)
78
- throw new Error("synthesize-run: empty embedding response");
79
- unwrapOrThrow(await vectorStore.upsert({
80
- indexName,
81
- vectors: [vector],
82
- metadata: [{ text: synthesisText, type: "synthesis", runId, path: `runs/${runId}/synthesis.json` }],
83
- ids: [`/${analysisId}/runs/${runId}/synthesis.json`],
84
- }));
85
- }
86
- catch (indexErr) {
87
- const logger = (deps.logger ?? createNoopLogger()).named("synthesize-run");
88
- logger.warn("vector indexing failed", { runId, ...logger.errorFields(indexErr) });
89
- }
72
+ await durably("synthesis.index", async () => {
73
+ try {
74
+ await ensureSearchIndex(pool, analysisId, embedding.dimensions);
75
+ const vectorStore = createVectorStore(pool);
76
+ const indexName = searchIndexName(analysisId);
77
+ const synthesisText = formatSynthesisEmbeddingText(synthesis);
78
+ const [vector] = unwrapOrThrow(await embedding.embed([synthesisText], synthesizerSession));
79
+ if (!vector)
80
+ throw new Error("synthesize-run: empty embedding response");
81
+ unwrapOrThrow(await vectorStore.upsert({
82
+ indexName,
83
+ vectors: [vector],
84
+ metadata: [{ text: synthesisText, type: "synthesis", runId, path: `runs/${runId}/synthesis.json` }],
85
+ ids: [`/${analysisId}/runs/${runId}/synthesis.json`],
86
+ }));
87
+ }
88
+ catch (indexErr) {
89
+ const logger = (deps.logger ?? createNoopLogger()).named("synthesize-run");
90
+ logger.warn("vector indexing failed", { runId, ...logger.errorFields(indexErr) });
91
+ }
92
+ });
90
93
  await onProgress("persisting", "Persisting synthesis");
91
- await persistSynthesis({ workspaceRoot, runId, synthesis });
94
+ await durably("synthesis.persist", () => persistSynthesis({ workspaceRoot, runId, synthesis }));
92
95
  await emit(buildRunSynthesisPart(runId, synthesis));
93
96
  await onProgress("complete", "Literature-grounded synthesis ready");
94
97
  return {
@@ -101,11 +104,11 @@ export async function synthesizeRun(deps, params) {
101
104
  };
102
105
  }
103
106
  catch (err) {
104
- const msg = err instanceof Error ? err.message : String(err);
107
+ const msg = errorMessageOf(err) ?? textOf(err);
105
108
  await onProgress("failed", "Synthesis could not be completed — step summaries are still available", { error: msg });
106
109
  // A genuine synthesis failure must fail the run loudly (D10): re-throw so
107
- // the synthesis step errors and the parent workflow goes to ERROR. The
108
- // honest non-fatal outcomes (no-summaries / blocker) early-return above.
110
+ // the parent workflow goes to ERROR. The honest non-fatal outcomes
111
+ // (no-summaries / blocker) early-return above.
109
112
  throw err;
110
113
  }
111
114
  }
@@ -115,5 +118,8 @@ async function loadPlanNarrative(pool, runId, analysisId) {
115
118
  if (!planId)
116
119
  return "";
117
120
  const plan = unwrapOrThrow(await loadPlan(pool, planId, { analysisId }));
118
- return plan?.analytical_narrative ?? "";
121
+ const parsed = PlanNarrativeSchema.nullable().catch(null).parse(plan);
122
+ return parsed?.analytical_narrative ?? "";
119
123
  }
124
+ /** The one field of the stored plan document this reader takes; every other field passes. */
125
+ const PlanNarrativeSchema = z.looseObject({ analytical_narrative: z.string().optional() });
@@ -0,0 +1,96 @@
1
+ /**
2
+ * The durable work of an analysis, as a host lists, stops, resumes, and holds it (work-pause spec).
3
+ *
4
+ * A work is a chat turn, a run, or a data profile. Each work that is active is in the list, and a work that waits
5
+ * in a pause carries each of its waiting workflows. One work can have more than one waiting workflow: a sub-agent
6
+ * of a turn and each step of a run wait in their own workflows. A stop ends a work in each state. A resume and a
7
+ * hold reach only a work that waits. Only a client resumes paused work.
8
+ */
9
+ import type { PauseCause, WorkKind } from "../contracts/chat-parts.js";
10
+ import type { RunAuthorizer } from "../execution/run-authorizer.js";
11
+ import type { RunCanceler } from "../execution/run-canceler.js";
12
+ import type { Logger } from "../lib/logger.js";
13
+ import type { Querier } from "../state/db.js";
14
+ import type { ChatTurnSession } from "./chat-turn.js";
15
+ /** One waiting workflow of a paused work. */
16
+ export type PausedWorkflow = {
17
+ readonly workflowId: string;
18
+ readonly state: "retrying" | "paused";
19
+ readonly cause: PauseCause;
20
+ /** The count of timer retries before this wait. */
21
+ readonly attempt: number;
22
+ /** ISO 8601. Present for the state `retrying` only. */
23
+ readonly retryAt?: string;
24
+ /** ISO 8601. */
25
+ readonly pausedAt: string;
26
+ };
27
+ /** One active work: a turn, a run, or a data profile. */
28
+ export type Work = {
29
+ /** The turn id, the run id, or the id of the profile workflow. */
30
+ readonly workId: string;
31
+ readonly kind: WorkKind;
32
+ readonly analysisId: string;
33
+ readonly threadId?: string;
34
+ /** Each waiting workflow of the work. Empty for a work that runs. */
35
+ readonly waiting: readonly PausedWorkflow[];
36
+ };
37
+ export type WorkStop = {
38
+ readonly kind: "stopped";
39
+ readonly work: Work;
40
+ } | {
41
+ readonly kind: "not_found";
42
+ };
43
+ export type WorkResume = {
44
+ readonly kind: "resumed";
45
+ readonly workflows: number;
46
+ } | {
47
+ readonly kind: "not_found";
48
+ }
49
+ /** The host refused to renew the run credential under the session, thus the work stays paused. */
50
+ | {
51
+ readonly kind: "refused";
52
+ readonly reason: string;
53
+ };
54
+ /** `workflows` is the count of waits in `retrying` that the hold reached. A wait in `paused` needs no hold. */
55
+ export type WorkHold = {
56
+ readonly kind: "held";
57
+ readonly workflows: number;
58
+ } | {
59
+ readonly kind: "not_found";
60
+ };
61
+ /** The durable work of a runtime, as a host uses it. */
62
+ export type WorkSurface = {
63
+ /**
64
+ * The active work of an analysis: each turn that holds a thread, each `running` run, and the profile that runs.
65
+ * A pause row whose workflow ended is not in it, and the list deletes that row.
66
+ */
67
+ list(analysisId: string): Promise<Work[]>;
68
+ /**
69
+ * Stop the work, in each state: a turn stops, a run cancels with its children, and a profile fails. Work of a
70
+ * different analysis than the session gives `not_found`.
71
+ */
72
+ stop(session: ChatTurnSession, workId: string): Promise<WorkStop>;
73
+ /**
74
+ * Resume the work: each of its waiting workflows sends its request again. A wait in `retrying` ends at once, thus
75
+ * the same call is "retry now". For a turn, the credential of the session goes to the turn first. For a run or a
76
+ * profile, the host renews the run credential under the session first, and a refusal sends nothing. Work of a
77
+ * different analysis than the session gives `not_found`.
78
+ */
79
+ resume(session: ChatTurnSession, workId: string): Promise<WorkResume>;
80
+ /**
81
+ * Hold the work: each of its waits in `retrying` moves to `paused`, and its timer stops. The work then waits for a
82
+ * resume. Work of a different analysis than the session gives `not_found`.
83
+ */
84
+ hold(session: ChatTurnSession, workId: string): Promise<WorkHold>;
85
+ };
86
+ export type WorkDeps = {
87
+ readonly pool: Querier;
88
+ readonly runAuthorizer: RunAuthorizer;
89
+ readonly logger?: Logger;
90
+ /** The stop of a chat turn. */
91
+ readonly stopTurn: (turnId: string) => Promise<void>;
92
+ readonly runCanceler: RunCanceler;
93
+ /** The stop of the profile workflow of an analysis. */
94
+ readonly stopProfile: (analysisId: string, workflowId: string) => Promise<void>;
95
+ };
96
+ export declare function createWork(deps: WorkDeps): WorkSurface;
@@ -0,0 +1,147 @@
1
+ /**
2
+ * The durable work of an analysis, as a host lists, stops, resumes, and holds it (work-pause spec).
3
+ *
4
+ * A work is a chat turn, a run, or a data profile. Each work that is active is in the list, and a work that waits
5
+ * in a pause carries each of its waiting workflows. One work can have more than one waiting workflow: a sub-agent
6
+ * of a turn and each step of a run wait in their own workflows. A stop ends a work in each state. A resume and a
7
+ * hold reach only a work that waits. Only a client resumes paused work.
8
+ */
9
+ import { DBOS } from "@dbos-inc/dbos-sdk";
10
+ import { createNoopLogger } from "../lib/console-logger.js";
11
+ import { passGate } from "../lib/hooks.js";
12
+ import { unwrapOrThrow } from "../lib/result.js";
13
+ import { turnCredentials } from "../loop/turn-credentials.js";
14
+ import { queryTurnsOfAnalysis } from "../state/active-turns.js";
15
+ import { loadDataProfileStatus } from "../state/data-profile.js";
16
+ import { clearPauses, queryPausesOfAnalysis, queryPausesOfWork } from "../state/paused-work.js";
17
+ import { queryActiveRunsByAnalysis } from "../state/runs.js";
18
+ import { HOLD_MESSAGE, RESUME_MESSAGE } from "../workflows/pause.js";
19
+ /** The workflow statuses that can still wait. */
20
+ const ACTIVE_STATUSES = new Set(["PENDING", "ENQUEUED"]);
21
+ /** The provenance of a run cancel that a stop of work makes. */
22
+ const WORK_STOP_PROVENANCE = { agentId: "work-stop", callPath: ["work-stop"] };
23
+ function workflowOf(record) {
24
+ return {
25
+ workflowId: record.workflowId,
26
+ state: record.state,
27
+ cause: record.cause,
28
+ attempt: record.attempt,
29
+ retryAt: record.retryAt,
30
+ pausedAt: record.pausedAt,
31
+ };
32
+ }
33
+ async function activeWorkflows(workflowIds) {
34
+ if (workflowIds.length === 0)
35
+ return new Set();
36
+ const statuses = await DBOS.listWorkflows({ workflowIDs: [...workflowIds], loadInput: false, loadOutput: false });
37
+ return new Set(statuses.filter((status) => ACTIVE_STATUSES.has(status.status)).map((status) => status.workflowID));
38
+ }
39
+ export function createWork(deps) {
40
+ const logger = (deps.logger ?? createNoopLogger()).named("harness.work");
41
+ async function list(analysisId) {
42
+ const [records, turns, runs, profile] = await Promise.all([
43
+ (async () => unwrapOrThrow(await queryPausesOfAnalysis(deps.pool, analysisId)))(),
44
+ (async () => unwrapOrThrow(await queryTurnsOfAnalysis(deps.pool, analysisId)))(),
45
+ (async () => unwrapOrThrow(await queryActiveRunsByAnalysis(deps.pool, analysisId)))(),
46
+ (async () => unwrapOrThrow(await loadDataProfileStatus(deps.pool, analysisId)))(),
47
+ ]);
48
+ const profileWorkflowId = profile?.status === "running" ? (profile.workflowId ?? undefined) : undefined;
49
+ const active = await activeWorkflows([
50
+ ...records.map((record) => record.workflowId),
51
+ ...turns.map((turn) => turn.turnId),
52
+ ...(profileWorkflowId === undefined ? [] : [profileWorkflowId]),
53
+ ]);
54
+ const ended = records.filter((record) => !active.has(record.workflowId)).map((record) => record.workflowId);
55
+ if (ended.length > 0) {
56
+ const cleared = await clearPauses(deps.pool, ended);
57
+ if (cleared.isErr())
58
+ logger.warn("the rows of ended pauses did not clear", { op: cleared.error.op, workflows: ended.length });
59
+ }
60
+ const waitingOf = new Map();
61
+ for (const record of records) {
62
+ if (!active.has(record.workflowId))
63
+ continue;
64
+ waitingOf.set(record.workId, [...(waitingOf.get(record.workId) ?? []), workflowOf(record)]);
65
+ }
66
+ const work = new Map();
67
+ const add = (workId, kind, threadId) => {
68
+ if (work.has(workId))
69
+ return;
70
+ work.set(workId, { workId, kind, analysisId, threadId, waiting: waitingOf.get(workId) ?? [] });
71
+ };
72
+ // A claim can outlive its turn, thus a turn is active while its workflow is. A `running` run is active while
73
+ // its row is, because the run canceler also converges a row whose workflow ended.
74
+ for (const turn of turns)
75
+ if (active.has(turn.turnId))
76
+ add(turn.turnId, "turn", turn.threadId);
77
+ for (const run of runs)
78
+ add(run.runId, "run", run.threadId ?? undefined);
79
+ if (profileWorkflowId !== undefined && active.has(profileWorkflowId))
80
+ add(profileWorkflowId, "profile", undefined);
81
+ for (const record of records)
82
+ if (active.has(record.workflowId))
83
+ add(record.workId, record.workKind, record.threadId);
84
+ return [...work.values()];
85
+ }
86
+ return {
87
+ list,
88
+ async stop(session, workId) {
89
+ const work = (await list(session.scope.analysisId)).find((candidate) => candidate.workId === workId);
90
+ if (work === undefined)
91
+ return { kind: "not_found" };
92
+ switch (work.kind) {
93
+ case "turn":
94
+ await deps.stopTurn(workId);
95
+ break;
96
+ case "run": {
97
+ const { outcome, converged } = await deps.runCanceler.cancel(workId, { ...session, provenance: WORK_STOP_PROVENANCE });
98
+ // A run that ended before the cancel converged nothing, and needs nothing.
99
+ if (outcome === "canceled" && !(converged.steps && converged.charge && converged.mandate)) {
100
+ logger.warn("the stop of a run did not converge", { workId, ...converged });
101
+ }
102
+ break;
103
+ }
104
+ case "profile":
105
+ await deps.stopProfile(work.analysisId, workId);
106
+ break;
107
+ default: {
108
+ const exhaustive = work.kind;
109
+ throw new Error(`unknown work kind: ${String(exhaustive)}`);
110
+ }
111
+ }
112
+ logger.info("work stopped", { workId, kind: work.kind });
113
+ return { kind: "stopped", work };
114
+ },
115
+ async resume(session, workId) {
116
+ const records = unwrapOrThrow(await queryPausesOfWork(deps.pool, session.scope.analysisId, workId));
117
+ if (records.length === 0)
118
+ return { kind: "not_found" };
119
+ // Each workflow of one work holds the same run credential, thus one renewal covers the work.
120
+ const runSession = records.find((record) => record.runSession !== undefined)?.runSession;
121
+ if (runSession !== undefined) {
122
+ const renewed = await passGate("RunAuthorizer.renew", deps.runAuthorizer.renew(runSession, session.auth));
123
+ if (renewed.isErr()) {
124
+ logger.warn("work resume refused", { workId, reason: renewed.error.reason });
125
+ return { kind: "refused", reason: renewed.error.reason };
126
+ }
127
+ }
128
+ if (records.some((record) => record.workKind === "turn"))
129
+ turnCredentials.put(workId, session.auth);
130
+ // One send for each waiting workflow of the work. The key of the send is the topic of its pause, thus a
131
+ // second resume of the same pause sends nothing new.
132
+ await Promise.all(records.map((record) => DBOS.send(record.workflowId, RESUME_MESSAGE, record.topic, record.topic)));
133
+ logger.info("work resumed", { workId, workflows: records.length });
134
+ return { kind: "resumed", workflows: records.length };
135
+ },
136
+ async hold(session, workId) {
137
+ const records = unwrapOrThrow(await queryPausesOfWork(deps.pool, session.scope.analysisId, workId));
138
+ if (records.length === 0)
139
+ return { kind: "not_found" };
140
+ const retrying = records.filter((record) => record.state === "retrying");
141
+ // The key of the send names the pause, thus a second hold of the same pause sends nothing new.
142
+ await Promise.all(retrying.map((record) => DBOS.send(record.workflowId, HOLD_MESSAGE, record.topic, `${record.topic}:hold`)));
143
+ logger.info("work held", { workId, workflows: retrying.length });
144
+ return { kind: "held", workflows: retrying.length };
145
+ },
146
+ };
147
+ }
@@ -12,8 +12,6 @@
12
12
  import type { AuthContext } from "./types.js";
13
13
  /**
14
14
  * Build the trivial opaque `auth` value an OSS session constructor stores.
15
- * Returned as `AuthContext` so callers stay credential-blind. The cast bridges
16
- * the empty literal to the phantom-branded interface; the brand is an optional
17
- * `never`, so no real field is fabricated.
15
+ * Returned as `AuthContext` so callers stay credential-blind.
18
16
  */
19
17
  export declare function makeLocalAuth(): AuthContext;
@@ -11,9 +11,7 @@
11
11
  */
12
12
  /**
13
13
  * Build the trivial opaque `auth` value an OSS session constructor stores.
14
- * Returned as `AuthContext` so callers stay credential-blind. The cast bridges
15
- * the empty literal to the phantom-branded interface; the brand is an optional
16
- * `never`, so no real field is fabricated.
14
+ * Returned as `AuthContext` so callers stay credential-blind.
17
15
  */
18
16
  export function makeLocalAuth() {
19
17
  return {};
@@ -3,7 +3,7 @@
3
3
  *
4
4
  * Issues a durable `RunSession` straight from the async-edge input: no remote
5
5
  * authorization, no credential read. It owns nothing revocable (it mints no
6
- * jti), so `revoke` and `revokeByJti` are no-ops. The opaque caller `auth` is
6
+ * reference), so `revoke`, `revokeByMandateId`, `suspend`, and `renew` are no-ops. The opaque caller `auth` is
7
7
  * forwarded untouched — local code never
8
8
  * inspects it (no `getAuth`).
9
9
  */
@@ -3,7 +3,7 @@
3
3
  *
4
4
  * Issues a durable `RunSession` straight from the async-edge input: no remote
5
5
  * authorization, no credential read. It owns nothing revocable (it mints no
6
- * jti), so `revoke` and `revokeByJti` are no-ops. The opaque caller `auth` is
6
+ * reference), so `revoke`, `revokeByMandateId`, `suspend`, and `renew` are no-ops. The opaque caller `auth` is
7
7
  * forwarded untouched — local code never
8
8
  * inspects it (no `getAuth`).
9
9
  */
@@ -18,9 +18,11 @@ export function createLocalRunAuthorizer() {
18
18
  runFrame: frame,
19
19
  auth,
20
20
  };
21
- return okAsync({ runSession, ownsMandate: false }); // oss-core-managed-ok
21
+ return okAsync(runSession);
22
22
  },
23
23
  revoke: () => okAsync(undefined),
24
- revokeByJti: () => okAsync(undefined),
24
+ revokeByMandateId: () => okAsync(undefined), // oss-core-managed-ok
25
+ suspend: () => okAsync(undefined),
26
+ renew: () => okAsync(undefined),
25
27
  };
26
28
  }