@inflexa-ai/harness 0.45.0 → 0.46.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (802) hide show
  1. package/README.md +6 -3
  2. package/dist/agents/conversation-agent.d.ts +19 -3
  3. package/dist/agents/conversation-agent.js +49 -30
  4. package/dist/agents/report-session-agent.d.ts +15 -15
  5. package/dist/agents/report-session-agent.js +23 -15
  6. package/dist/agents/sandbox/index.d.ts +1 -1
  7. package/dist/agents/sandbox/index.js +1 -1
  8. package/dist/agents/sandbox/shared.d.ts +35 -16
  9. package/dist/agents/sandbox/shared.js +63 -24
  10. package/dist/agents/sandbox/translational-safety-agent.js +26 -0
  11. package/dist/agents/sandbox/types.d.ts +26 -3
  12. package/dist/agents/sandbox/validate-skills.d.ts +2 -2
  13. package/dist/agents/sandbox/validate-skills.js +3 -1
  14. package/dist/agents/sandbox-catalog.d.ts +16 -2
  15. package/dist/agents/sandbox-catalog.js +22 -3
  16. package/dist/agents/system-prompt.d.ts +2 -2
  17. package/dist/app/approve-plan.d.ts +5 -2
  18. package/dist/app/approve-plan.js +1 -1
  19. package/dist/app/chat-turn-workflow.d.ts +114 -0
  20. package/dist/app/chat-turn-workflow.js +307 -0
  21. package/dist/app/chat-turn.d.ts +85 -57
  22. package/dist/app/chat-turn.js +125 -99
  23. package/dist/app/data-profile-orientation.js +10 -8
  24. package/dist/app/data-profile-view.d.ts +4 -4
  25. package/dist/app/data-profile-view.js +9 -8
  26. package/dist/app/in-process-turn.d.ts +42 -0
  27. package/dist/app/in-process-turn.js +139 -0
  28. package/dist/app/message-assembly.d.ts +10 -4
  29. package/dist/app/message-assembly.js +13 -8
  30. package/dist/app/report-session-runtime.d.ts +4 -4
  31. package/dist/app/report-session-runtime.js +36 -21
  32. package/dist/app/spawn-report-session.d.ts +33 -28
  33. package/dist/app/spawn-report-session.js +25 -40
  34. package/dist/app/synthesize-run.d.ts +22 -16
  35. package/dist/app/synthesize-run.js +41 -35
  36. package/dist/app/work.d.ts +96 -0
  37. package/dist/app/work.js +147 -0
  38. package/dist/auth/local-auth-context.d.ts +1 -3
  39. package/dist/auth/local-auth-context.js +1 -3
  40. package/dist/auth/local-run-authorizer.d.ts +1 -1
  41. package/dist/auth/local-run-authorizer.js +5 -3
  42. package/dist/auth/types.d.ts +26 -26
  43. package/dist/billing/cached-resolver.d.ts +4 -4
  44. package/dist/billing/run-charge.d.ts +5 -8
  45. package/dist/billing/run-charge.js +2 -2
  46. package/dist/billing/usage-recorder.d.ts +9 -9
  47. package/dist/citations/aggregate.js +1 -1
  48. package/dist/citations/clients/arxiv.d.ts +2 -2
  49. package/dist/citations/clients/arxiv.js +12 -4
  50. package/dist/citations/clients/common.js +4 -2
  51. package/dist/citations/clients/crossref.d.ts +2 -2
  52. package/dist/citations/clients/crossref.js +37 -37
  53. package/dist/citations/clients/doi-registry.js +15 -16
  54. package/dist/citations/clients/pubmed.d.ts +2 -2
  55. package/dist/citations/clients/pubmed.js +20 -13
  56. package/dist/citations/clients/semantic-scholar.d.ts +2 -2
  57. package/dist/citations/clients/semantic-scholar.js +9 -9
  58. package/dist/citations/compare.js +2 -2
  59. package/dist/citations/match.d.ts +2 -2
  60. package/dist/citations/match.js +12 -7
  61. package/dist/citations/normalize.js +35 -26
  62. package/dist/citations/plan.js +6 -2
  63. package/dist/citations/resolve.d.ts +6 -6
  64. package/dist/citations/resolve.js +34 -25
  65. package/dist/citations/types.d.ts +77 -77
  66. package/dist/config/environment-stores.d.ts +10 -8
  67. package/dist/config/resource-limits.js +1 -3
  68. package/dist/contracts/analogy-report.d.ts +7 -7
  69. package/dist/contracts/analogy-report.js +2 -2
  70. package/dist/contracts/chat-events.d.ts +46 -22
  71. package/dist/contracts/chat-events.js +1 -1
  72. package/dist/contracts/chat-frame.d.ts +15 -5
  73. package/dist/contracts/chat-frame.js +67 -40
  74. package/dist/contracts/chat-parts.d.ts +130 -67
  75. package/dist/contracts/chat-parts.js +1 -0
  76. package/dist/contracts/content-url.js +16 -2
  77. package/dist/contracts/data-profile.d.ts +38 -38
  78. package/dist/contracts/index.d.ts +3 -3
  79. package/dist/contracts/index.js +1 -1
  80. package/dist/contracts/message.d.ts +6 -6
  81. package/dist/contracts/organ-system.d.ts +11 -11
  82. package/dist/contracts/part-registry.d.ts +5 -4
  83. package/dist/contracts/part-registry.js +5 -0
  84. package/dist/contracts/profile-vocabulary.d.ts +11 -10
  85. package/dist/contracts/profile-vocabulary.js +10 -3
  86. package/dist/contracts/report-blocks.d.ts +329 -329
  87. package/dist/contracts/report-reference.d.ts +105 -81
  88. package/dist/contracts/report-reference.js +30 -13
  89. package/dist/contracts/schemas/chat-events.d.ts +45 -6
  90. package/dist/contracts/schemas/chat-events.js +16 -0
  91. package/dist/contracts/schemas/chat-parts.d.ts +214 -102
  92. package/dist/contracts/schemas/chat-parts.js +50 -7
  93. package/dist/contracts/schemas/index.d.ts +1 -1
  94. package/dist/contracts/schemas/index.js +1 -1
  95. package/dist/contracts/severity.d.ts +1 -1
  96. package/dist/contracts/structure-source.d.ts +3 -3
  97. package/dist/contracts/structure-source.js +6 -2
  98. package/dist/contracts/subagent-activity.d.ts +2 -2
  99. package/dist/contracts/subagent-activity.js +5 -3
  100. package/dist/contracts/usage.d.ts +2 -2
  101. package/dist/data/safety-panel-schema.d.ts +25 -25
  102. package/dist/data/safety-panel-schema.js +13 -4
  103. package/dist/execution/artifact-metadata.d.ts +23 -15
  104. package/dist/execution/artifact-metadata.js +33 -10
  105. package/dist/execution/artifact-record.d.ts +2 -2
  106. package/dist/execution/artifact-registration.d.ts +5 -5
  107. package/dist/execution/artifact-registry.d.ts +8 -8
  108. package/dist/execution/dbos-run-launcher.d.ts +24 -4
  109. package/dist/execution/dbos-run-launcher.js +58 -4
  110. package/dist/execution/dbos-workflow-purger.d.ts +7 -6
  111. package/dist/execution/dbos-workflow-purger.js +29 -21
  112. package/dist/execution/input-signature.d.ts +2 -2
  113. package/dist/execution/post-step-pipeline.d.ts +9 -9
  114. package/dist/execution/post-step-pipeline.js +1 -1
  115. package/dist/execution/post-step.js +2 -2
  116. package/dist/execution/reconcile-manifest.d.ts +4 -4
  117. package/dist/execution/reconcile-manifest.js +3 -2
  118. package/dist/execution/run-authorizer.d.ts +46 -37
  119. package/dist/execution/run-authorizer.js +8 -8
  120. package/dist/execution/run-canceler.d.ts +39 -17
  121. package/dist/execution/run-canceler.js +137 -28
  122. package/dist/execution/run-end-record.d.ts +29 -0
  123. package/dist/execution/run-end-record.js +27 -0
  124. package/dist/execution/run-event-parts.d.ts +0 -8
  125. package/dist/execution/run-event-parts.js +29 -24
  126. package/dist/execution/run-event-stream.d.ts +8 -8
  127. package/dist/execution/run-event-stream.js +3 -4
  128. package/dist/execution/run-launcher.d.ts +4 -4
  129. package/dist/execution/run-synthesis.d.ts +49 -48
  130. package/dist/execution/run-synthesis.js +96 -255
  131. package/dist/execution/staged-input.d.ts +2 -2
  132. package/dist/execution/step-summary.d.ts +6 -6
  133. package/dist/execution/step-summary.js +4 -8
  134. package/dist/execution/topo-sort.js +4 -3
  135. package/dist/execution/workflow-purger.d.ts +2 -2
  136. package/dist/index.d.ts +25 -24
  137. package/dist/index.js +36 -37
  138. package/dist/input-sanitization.js +9 -2
  139. package/dist/input-scan/clustering.d.ts +6 -6
  140. package/dist/input-scan/clustering.js +11 -5
  141. package/dist/input-scan/companions.js +3 -2
  142. package/dist/input-scan/detect-sets.d.ts +2 -2
  143. package/dist/input-scan/detect-sets.js +25 -21
  144. package/dist/input-scan/enrich.d.ts +6 -6
  145. package/dist/input-scan/enrich.js +29 -12
  146. package/dist/input-scan/formats.d.ts +2 -2
  147. package/dist/input-scan/formats.js +8 -2
  148. package/dist/input-scan/markers.d.ts +2 -2
  149. package/dist/input-scan/markers.js +14 -5
  150. package/dist/input-scan/menu.d.ts +10 -10
  151. package/dist/input-scan/menu.js +0 -0
  152. package/dist/input-scan/quarantine.d.ts +2 -2
  153. package/dist/input-scan/quarantine.js +23 -18
  154. package/dist/input-scan/readout-budget.d.ts +2 -2
  155. package/dist/input-scan/readout-budget.js +1 -1
  156. package/dist/input-scan/readout.d.ts +2 -2
  157. package/dist/input-scan/readout.js +47 -34
  158. package/dist/input-scan/scan.d.ts +2 -2
  159. package/dist/input-scan/scan.js +7 -5
  160. package/dist/input-scan/set-types.d.ts +28 -28
  161. package/dist/input-scan/shapes.d.ts +4 -4
  162. package/dist/input-scan/shapes.js +0 -0
  163. package/dist/input-scan/templates.d.ts +10 -10
  164. package/dist/input-scan/templates.js +30 -22
  165. package/dist/input-scan/tokens.d.ts +6 -4
  166. package/dist/input-scan/tokens.js +100 -38
  167. package/dist/input-scan/types.d.ts +22 -22
  168. package/dist/lib/async-utils.d.ts +3 -7
  169. package/dist/lib/async-utils.js +5 -9
  170. package/dist/lib/cache.js +1 -1
  171. package/dist/lib/chrome.d.ts +46 -6
  172. package/dist/lib/console-logger.js +2 -2
  173. package/dist/lib/db-result.d.ts +22 -6
  174. package/dist/lib/db-result.js +9 -13
  175. package/dist/lib/eyes.d.ts +4 -4
  176. package/dist/lib/eyes.js +1 -1
  177. package/dist/lib/fs-helpers.js +18 -6
  178. package/dist/lib/fs-result.d.ts +1 -0
  179. package/dist/lib/fs-result.js +5 -6
  180. package/dist/lib/hooks.d.ts +23 -7
  181. package/dist/lib/hooks.js +17 -3
  182. package/dist/lib/host-concurrency.js +3 -2
  183. package/dist/lib/logger.d.ts +2 -2
  184. package/dist/lib/logger.js +2 -1
  185. package/dist/lib/metrics.d.ts +1 -1
  186. package/dist/lib/null-proto.d.ts +6 -0
  187. package/dist/lib/null-proto.js +17 -0
  188. package/dist/lib/otel-spans.d.ts +1 -1
  189. package/dist/lib/otel-spans.js +9 -5
  190. package/dist/lib/otel.d.ts +4 -2
  191. package/dist/lib/otel.js +10 -2
  192. package/dist/lib/page-capture.d.ts +8 -8
  193. package/dist/lib/page-capture.js +9 -4
  194. package/dist/lib/parse-json.d.ts +5 -0
  195. package/dist/lib/parse-json.js +12 -0
  196. package/dist/lib/present.d.ts +12 -0
  197. package/dist/lib/present.js +39 -0
  198. package/dist/lib/rate-limit.d.ts +4 -4
  199. package/dist/lib/rate-limit.js +12 -13
  200. package/dist/lib/regulatory-corpus/fetch-fda-guidance.d.ts +4 -4
  201. package/dist/lib/regulatory-corpus/fetch-fda-guidance.js +4 -10
  202. package/dist/lib/regulatory-corpus/fetch-ich.d.ts +4 -4
  203. package/dist/lib/regulatory-corpus/fetch-ich.js +18 -14
  204. package/dist/lib/regulatory-corpus/normalize-whitespace.d.ts +6 -0
  205. package/dist/lib/regulatory-corpus/normalize-whitespace.js +41 -0
  206. package/dist/lib/regulatory-corpus.d.ts +10 -10
  207. package/dist/lib/regulatory-corpus.js +3 -1
  208. package/dist/lib/result.d.ts +10 -11
  209. package/dist/lib/result.js +15 -13
  210. package/dist/lib/storage.d.ts +2 -2
  211. package/dist/lib/test/async-iterable.d.ts +9 -0
  212. package/dist/lib/test/async-iterable.js +28 -0
  213. package/dist/lib/test/request-url.d.ts +5 -0
  214. package/dist/lib/test/request-url.js +7 -0
  215. package/dist/lib/test/result-assert.d.ts +12 -0
  216. package/dist/lib/test/result-assert.js +17 -0
  217. package/dist/lib/test/text-shapes.d.ts +24 -0
  218. package/dist/lib/test/text-shapes.js +63 -0
  219. package/dist/lib/text.d.ts +22 -0
  220. package/dist/lib/text.js +68 -0
  221. package/dist/lib/thrown.d.ts +18 -0
  222. package/dist/lib/thrown.js +30 -0
  223. package/dist/lib/unknown-array.d.ts +6 -0
  224. package/dist/lib/unknown-array.js +8 -0
  225. package/dist/lib/unknown-containers.d.ts +14 -0
  226. package/dist/lib/unknown-containers.js +17 -0
  227. package/dist/lib/unknown-text.d.ts +8 -0
  228. package/dist/lib/unknown-text.js +28 -0
  229. package/dist/lib/zod-issue-shape.d.ts +1 -1
  230. package/dist/lib/zod-issue-shape.js +31 -31
  231. package/dist/lib/zod-issues.d.ts +3 -3
  232. package/dist/lib/zod-issues.js +30 -17
  233. package/dist/literature/sources/arxiv.d.ts +6 -6
  234. package/dist/literature/sources/arxiv.js +92 -35
  235. package/dist/literature/sources/http.d.ts +2 -2
  236. package/dist/literature/sources/http.js +16 -15
  237. package/dist/literature/sources/pubmed.d.ts +16 -16
  238. package/dist/literature/sources/pubmed.js +96 -61
  239. package/dist/literature/sources/semantic-scholar.d.ts +8 -8
  240. package/dist/literature/sources/semantic-scholar.js +22 -13
  241. package/dist/loop/accounting.d.ts +63 -0
  242. package/dist/loop/accounting.js +141 -0
  243. package/dist/loop/call-policy.d.ts +73 -0
  244. package/dist/loop/call-policy.js +109 -0
  245. package/dist/loop/chat-stream.d.ts +62 -0
  246. package/dist/loop/chat-stream.js +237 -0
  247. package/dist/loop/compaction.d.ts +14 -9
  248. package/dist/loop/compaction.js +17 -0
  249. package/dist/loop/metrics.d.ts +12 -15
  250. package/dist/loop/metrics.js +14 -26
  251. package/dist/loop/run-loop.d.ts +233 -0
  252. package/dist/loop/run-loop.js +770 -0
  253. package/dist/loop/sub-agent.d.ts +61 -0
  254. package/dist/loop/sub-agent.js +161 -0
  255. package/dist/loop/tool-adapter.d.ts +98 -0
  256. package/dist/loop/tool-adapter.js +364 -0
  257. package/dist/loop/tool-detail.d.ts +1 -1
  258. package/dist/loop/tool-detail.js +6 -5
  259. package/dist/loop/tool-outcome.d.ts +1 -1
  260. package/dist/loop/tool-output.d.ts +4 -4
  261. package/dist/loop/tool-output.js +2 -2
  262. package/dist/loop/turn-credentials.d.ts +34 -0
  263. package/dist/loop/turn-credentials.js +73 -0
  264. package/dist/loop/types.d.ts +34 -37
  265. package/dist/loop/types.js +2 -7
  266. package/dist/memory/ai-sdk-message-storage.d.ts +5 -5
  267. package/dist/memory/ai-sdk-message-storage.js +13 -11
  268. package/dist/memory/card-builders.d.ts +14 -14
  269. package/dist/memory/card-builders.js +19 -15
  270. package/dist/memory/conversation-display-recorder.d.ts +22 -6
  271. package/dist/memory/conversation-display-recorder.js +64 -20
  272. package/dist/memory/conversation-display-replay.js +3 -2
  273. package/dist/memory/conversation-display-storage.d.ts +15 -7
  274. package/dist/memory/conversation-display-storage.js +141 -36
  275. package/dist/memory/conversation-view.d.ts +4 -4
  276. package/dist/memory/conversation-view.js +5 -4
  277. package/dist/memory/count-tokens.js +10 -8
  278. package/dist/memory/derive-thread-title.d.ts +0 -13
  279. package/dist/memory/derive-thread-title.js +2 -1
  280. package/dist/memory/message-backfill.d.ts +12 -5
  281. package/dist/memory/message-backfill.js +5 -3
  282. package/dist/memory/thread-history.d.ts +66 -24
  283. package/dist/memory/thread-history.js +212 -79
  284. package/dist/memory/thread-store.d.ts +26 -17
  285. package/dist/memory/thread-store.js +15 -9
  286. package/dist/memory/tool-call-integrity.d.ts +2 -2
  287. package/dist/memory/tool-call-integrity.js +4 -3
  288. package/dist/memory/working-memory.d.ts +16 -12
  289. package/dist/memory/working-memory.js +72 -61
  290. package/dist/prompts/briefing.d.ts +63 -9
  291. package/dist/prompts/briefing.js +130 -3
  292. package/dist/prompts/planner.js +13 -2
  293. package/dist/prompts/synthesis-agent.d.ts +1 -1
  294. package/dist/prompts/synthesis-agent.js +6 -14
  295. package/dist/provenance/collector.d.ts +6 -6
  296. package/dist/provenance/collector.js +15 -8
  297. package/dist/provenance/exec-frame.d.ts +2 -2
  298. package/dist/provenance/exec-frame.js +6 -1
  299. package/dist/provenance/seam.d.ts +24 -19
  300. package/dist/provenance/seam.js +7 -5
  301. package/dist/provenance/types.d.ts +6 -6
  302. package/dist/providers/ai-sdk.d.ts +113 -62
  303. package/dist/providers/ai-sdk.js +303 -458
  304. package/dist/providers/embedding.d.ts +2 -2
  305. package/dist/providers/embedding.js +1 -1
  306. package/dist/providers/errors.d.ts +22 -2
  307. package/dist/providers/errors.js +98 -50
  308. package/dist/providers/prompt-cache.d.ts +8 -8
  309. package/dist/providers/prompt-cache.js +13 -11
  310. package/dist/providers/reasoning.d.ts +2 -2
  311. package/dist/providers/reasoning.js +2 -2
  312. package/dist/providers/types.d.ts +59 -92
  313. package/dist/reference-data/catalog.d.ts +2 -15
  314. package/dist/reference-data/catalog.js +166 -10
  315. package/dist/reference-data/receipt.d.ts +2 -2
  316. package/dist/report-model/assert-rules.js +1 -1
  317. package/dist/report-model/authoring-grammar.d.ts +209 -231
  318. package/dist/report-model/block-walk.d.ts +10 -10
  319. package/dist/report-model/block-walk.js +2 -0
  320. package/dist/report-model/draft-finish.d.ts +8 -8
  321. package/dist/report-model/draft-finish.js +1 -1
  322. package/dist/report-model/draft-hash.js +8 -7
  323. package/dist/report-model/draft-operations.d.ts +22 -10
  324. package/dist/report-model/draft-operations.js +48 -30
  325. package/dist/report-model/draft-read.d.ts +19 -7
  326. package/dist/report-model/draft-read.js +16 -6
  327. package/dist/report-model/draft.d.ts +844 -2
  328. package/dist/report-model/draft.js +3 -1
  329. package/dist/report-model/fixture-resolver.js +39 -16
  330. package/dist/report-model/pin-snapshot.d.ts +2 -2
  331. package/dist/report-model/pin-snapshot.js +15 -15
  332. package/dist/report-model/production-resolver.d.ts +18 -18
  333. package/dist/report-model/production-resolver.js +50 -42
  334. package/dist/report-model/reference-resolver.d.ts +26 -10
  335. package/dist/report-model/reference-resolver.js +68 -5
  336. package/dist/report-model/reference-stamp.js +30 -38
  337. package/dist/report-model/structural-validation.js +12 -4
  338. package/dist/report-model/validate.d.ts +7 -7
  339. package/dist/report-model/validate.js +6 -6
  340. package/dist/report-render/assets.d.ts +2 -2
  341. package/dist/report-render/assets.js +27 -3
  342. package/dist/report-render/chart-export.d.ts +10 -2
  343. package/dist/report-render/chart-export.js +37 -11
  344. package/dist/report-render/chart-presets.d.ts +8 -8
  345. package/dist/report-render/chart-presets.js +3 -3
  346. package/dist/report-render/chart-renderers.d.ts +23 -16
  347. package/dist/report-render/chart-renderers.js +74 -53
  348. package/dist/report-render/chart-toolbox.d.ts +2 -2
  349. package/dist/report-render/chart-toolbox.js +7 -6
  350. package/dist/report-render/chart.d.ts +15 -16
  351. package/dist/report-render/chart.js +369 -252
  352. package/dist/report-render/design.d.ts +36 -297
  353. package/dist/report-render/design.js +0 -12
  354. package/dist/report-render/figures/common.d.ts +12 -12
  355. package/dist/report-render/figures/common.js +42 -31
  356. package/dist/report-render/figures/dendrogram.d.ts +3 -3
  357. package/dist/report-render/figures/dendrogram.js +10 -10
  358. package/dist/report-render/figures/dense.js +15 -8
  359. package/dist/report-render/figures/dotplot.js +46 -33
  360. package/dist/report-render/figures/embedding.js +52 -43
  361. package/dist/report-render/figures/equal-units.d.ts +10 -10
  362. package/dist/report-render/figures/equal-units.js +27 -27
  363. package/dist/report-render/figures/forest.js +9 -7
  364. package/dist/report-render/figures/gsea.js +21 -11
  365. package/dist/report-render/figures/heatmap.js +13 -9
  366. package/dist/report-render/figures/index.d.ts +10 -10
  367. package/dist/report-render/figures/index.js +4 -2
  368. package/dist/report-render/figures/km.js +10 -9
  369. package/dist/report-render/figures/label-room.d.ts +12 -12
  370. package/dist/report-render/figures/label-room.js +7 -2
  371. package/dist/report-render/figures/locuszoom.d.ts +2 -2
  372. package/dist/report-render/figures/locuszoom.js +59 -31
  373. package/dist/report-render/figures/lollipop.js +3 -2
  374. package/dist/report-render/figures/ma.js +8 -4
  375. package/dist/report-render/figures/manhattan.d.ts +1 -2
  376. package/dist/report-render/figures/manhattan.js +52 -34
  377. package/dist/report-render/figures/oncoprint.js +4 -5
  378. package/dist/report-render/figures/pca.js +25 -11
  379. package/dist/report-render/figures/qq.js +20 -9
  380. package/dist/report-render/figures/roc.js +1 -1
  381. package/dist/report-render/figures/sankey.d.ts +2 -2
  382. package/dist/report-render/figures/sankey.js +11 -10
  383. package/dist/report-render/figures/upset.d.ts +6 -6
  384. package/dist/report-render/figures/upset.js +7 -4
  385. package/dist/report-render/figures/volcano.js +12 -10
  386. package/dist/report-render/hybrid-svg.d.ts +4 -4
  387. package/dist/report-render/hybrid-svg.js +7 -5
  388. package/dist/report-render/number-format.d.ts +4 -4
  389. package/dist/report-render/number-format.js +62 -27
  390. package/dist/report-render/page.js +2 -1
  391. package/dist/report-render/provenance-data.d.ts +2 -2
  392. package/dist/report-render/references.d.ts +4 -4
  393. package/dist/report-render/render.d.ts +2 -2
  394. package/dist/report-render/render.js +10 -11
  395. package/dist/report-render/script-json.js +1 -1
  396. package/dist/report-render/table-data.d.ts +6 -6
  397. package/dist/report-render/test/options.d.ts +49 -0
  398. package/dist/report-render/test/options.js +143 -0
  399. package/dist/report-render/test/page-function.d.ts +19 -0
  400. package/dist/report-render/test/page-function.js +33 -0
  401. package/dist/report-render/types.d.ts +10 -10
  402. package/dist/report-render/value-bridge.d.ts +4 -4
  403. package/dist/report-render/value-bridge.js +27 -14
  404. package/dist/report-render/views/chart-view.d.ts +2 -2
  405. package/dist/report-render/views/chart-view.js +2 -2
  406. package/dist/report-render/views/lineage.d.ts +6 -6
  407. package/dist/report-render/views/lineage.js +2 -0
  408. package/dist/report-render/views/page-view.d.ts +2 -2
  409. package/dist/report-render/views/page-view.js +1 -0
  410. package/dist/report-render/views/prose.js +25 -8
  411. package/dist/report-render/views/references-view.js +12 -1
  412. package/dist/report-render/views/values.js +1 -1
  413. package/dist/runtime/assemble.d.ts +53 -26
  414. package/dist/runtime/assemble.js +103 -56
  415. package/dist/runtime/boot.d.ts +8 -7
  416. package/dist/runtime/boot.js +1 -1
  417. package/dist/runtime/connection-budget.d.ts +6 -6
  418. package/dist/runtime/connection-budget.js +1 -1
  419. package/dist/runtime/dbos.d.ts +29 -19
  420. package/dist/runtime/dbos.js +35 -20
  421. package/dist/runtime/result-serialization.js +18 -5
  422. package/dist/runtime/shutdown.d.ts +2 -2
  423. package/dist/sandbox/client.d.ts +7 -3
  424. package/dist/sandbox/cpu-files.d.ts +2 -2
  425. package/dist/sandbox/cpu-files.js +21 -4
  426. package/dist/sandbox/create-sandbox.d.ts +7 -8
  427. package/dist/sandbox/create-sandbox.js +6 -12
  428. package/dist/sandbox/docker-client.d.ts +48 -3
  429. package/dist/sandbox/docker-client.js +10 -6
  430. package/dist/sandbox/estimate-data-profile-resources.js +2 -7
  431. package/dist/sandbox/exec-outcome.d.ts +2 -2
  432. package/dist/sandbox/exec-outcome.js +1 -1
  433. package/dist/sandbox/exec.d.ts +10 -6
  434. package/dist/sandbox/exec.js +27 -12
  435. package/dist/sandbox/execution-id.js +14 -6
  436. package/dist/sandbox/farm.d.ts +2 -2
  437. package/dist/sandbox/farm.js +22 -27
  438. package/dist/sandbox/identity.d.ts +7 -0
  439. package/dist/sandbox/identity.js +14 -3
  440. package/dist/sandbox/image-packages.d.ts +26 -4
  441. package/dist/sandbox/image-packages.js +29 -27
  442. package/dist/sandbox/k8s-client.d.ts +35 -8
  443. package/dist/sandbox/k8s-client.js +6 -5
  444. package/dist/sandbox/labels.js +1 -0
  445. package/dist/sandbox/liveness.js +3 -1
  446. package/dist/sandbox/mount-plan.d.ts +10 -10
  447. package/dist/sandbox/mount-plan.js +13 -14
  448. package/dist/sandbox/notification-sweep.d.ts +4 -4
  449. package/dist/sandbox/notification-sweep.js +4 -7
  450. package/dist/sandbox/package-identity.d.ts +6 -13
  451. package/dist/sandbox/package-identity.js +46 -28
  452. package/dist/sandbox/reaper.d.ts +10 -10
  453. package/dist/sandbox/reaper.js +4 -6
  454. package/dist/sandbox/sandbox-error.d.ts +2 -9
  455. package/dist/sandbox/sandbox-error.js +21 -8
  456. package/dist/sandbox/sandbox-step-translate.d.ts +8 -5
  457. package/dist/sandbox/sandbox-step-translate.js +22 -8
  458. package/dist/sandbox/step-sandbox.d.ts +47 -0
  459. package/dist/sandbox/step-sandbox.js +53 -0
  460. package/dist/sandbox/types.d.ts +18 -19
  461. package/dist/sandbox/types.js +1 -1
  462. package/dist/schemas/artifact-manifest.d.ts +4 -4
  463. package/dist/schemas/data-profile-schemas.d.ts +351 -306
  464. package/dist/schemas/file-metadata.js +2 -4
  465. package/dist/schemas/plan-schemas.d.ts +79 -25
  466. package/dist/schemas/plan-schemas.js +1 -1
  467. package/dist/schemas/run-synthesis.d.ts +95 -26
  468. package/dist/schemas/run-synthesis.js +3 -1
  469. package/dist/schemas/validate-plan.d.ts +4 -4
  470. package/dist/schemas/validate-plan.js +17 -5
  471. package/dist/schemas/workflow-state.d.ts +127 -14
  472. package/dist/schemas/workflow-state.js +56 -2
  473. package/dist/state/active-turns.d.ts +36 -0
  474. package/dist/state/active-turns.js +67 -0
  475. package/dist/state/analyses-metrics.d.ts +8 -8
  476. package/dist/state/analyses-metrics.js +4 -4
  477. package/dist/state/analyses.d.ts +0 -14
  478. package/dist/state/analyses.js +0 -32
  479. package/dist/state/artifacts.d.ts +47 -18
  480. package/dist/state/artifacts.js +48 -7
  481. package/dist/state/data-profile.d.ts +2 -2
  482. package/dist/state/db.d.ts +12 -2
  483. package/dist/state/db.js +5 -0
  484. package/dist/state/edit-intents.d.ts +4 -0
  485. package/dist/state/edit-intents.js +71 -0
  486. package/dist/state/index.d.ts +5 -5
  487. package/dist/state/index.js +3 -3
  488. package/dist/state/init.d.ts +2 -1
  489. package/dist/state/init.js +5 -2
  490. package/dist/state/migrations/20260927120000_baseline.js +3 -1
  491. package/dist/state/migrations/20261026120000_add_the_edit_intents.d.ts +7 -0
  492. package/dist/state/migrations/20261026120000_add_the_edit_intents.js +21 -0
  493. package/dist/state/migrations/20261027120000_record_the_applied_memory_edits.d.ts +7 -0
  494. package/dist/state/migrations/20261027120000_record_the_applied_memory_edits.js +16 -0
  495. package/dist/state/migrations/20261027120100_store_the_authoring_results.d.ts +8 -0
  496. package/dist/state/migrations/20261027120100_store_the_authoring_results.js +20 -0
  497. package/dist/state/migrations/20261027120200_key_the_groups_of_a_turn.d.ts +7 -0
  498. package/dist/state/migrations/20261027120200_key_the_groups_of_a_turn.js +12 -0
  499. package/dist/state/migrations/20261027120300_mark_the_active_turn_of_a_thread.d.ts +7 -0
  500. package/dist/state/migrations/20261027120300_mark_the_active_turn_of_a_thread.js +11 -0
  501. package/dist/state/migrations/20261028120000_record_the_paused_work.d.ts +7 -0
  502. package/dist/state/migrations/20261028120000_record_the_paused_work.js +25 -0
  503. package/dist/state/migrations/20261028120100_end_the_suspended_runs.d.ts +8 -0
  504. package/dist/state/migrations/20261028120100_end_the_suspended_runs.js +13 -0
  505. package/dist/state/migrations/20261029120000_reference_the_run_mandate.d.ts +7 -0
  506. package/dist/state/migrations/20261029120000_reference_the_run_mandate.js +23 -0
  507. package/dist/state/migrations/20261029120100_record_the_run_session_of_a_pause.d.ts +7 -0
  508. package/dist/state/migrations/20261029120100_record_the_run_session_of_a_pause.js +11 -0
  509. package/dist/state/migrations/index.js +18 -0
  510. package/dist/state/paused-work.d.ts +52 -0
  511. package/dist/state/paused-work.js +105 -0
  512. package/dist/state/plans.d.ts +27 -8
  513. package/dist/state/plans.js +14 -11
  514. package/dist/state/purge-analysis.d.ts +6 -6
  515. package/dist/state/purge-analysis.js +10 -2
  516. package/dist/state/report-session-state.d.ts +43 -18
  517. package/dist/state/report-session-state.js +43 -4
  518. package/dist/state/report-versions.d.ts +16 -11
  519. package/dist/state/report-versions.js +5 -3
  520. package/dist/state/runs.d.ts +70 -25
  521. package/dist/state/runs.js +127 -64
  522. package/dist/state/schema.d.ts +18 -21
  523. package/dist/state/schema.js +4 -5
  524. package/dist/state/snapshot-parse.d.ts +2 -2
  525. package/dist/state/snapshot-parse.js +14 -8
  526. package/dist/state/step-executions.d.ts +29 -8
  527. package/dist/state/step-executions.js +28 -4
  528. package/dist/state/tool-outputs.d.ts +2 -2
  529. package/dist/state/tool-outputs.js +2 -1
  530. package/dist/state/vector-store.d.ts +16 -16
  531. package/dist/state/vector-store.js +11 -7
  532. package/dist/tasks/data-profile-absorb.d.ts +3 -3
  533. package/dist/tasks/data-profile-absorb.js +21 -16
  534. package/dist/tasks/data-profile-activity.d.ts +5 -5
  535. package/dist/tasks/data-profile-activity.js +5 -5
  536. package/dist/tasks/data-profile-index.d.ts +4 -4
  537. package/dist/tasks/data-profile-index.js +32 -17
  538. package/dist/tasks/data-profile-resolve.d.ts +8 -8
  539. package/dist/tasks/data-profile-resolve.js +88 -62
  540. package/dist/tasks/data-profile.d.ts +40 -31
  541. package/dist/tasks/data-profile.js +138 -95
  542. package/dist/tasks/extract-values.d.ts +26 -79
  543. package/dist/tasks/extract-values.js +48 -108
  544. package/dist/tasks/refresh-regulatory-corpus.d.ts +4 -20
  545. package/dist/tasks/refresh-regulatory-corpus.js +12 -8
  546. package/dist/tasks/regulatory-corpus-boot-refresh.d.ts +2 -2
  547. package/dist/tasks/regulatory-corpus-boot-refresh.js +12 -10
  548. package/dist/testing.d.ts +60 -0
  549. package/dist/testing.js +96 -0
  550. package/dist/tools/ad-hoc-router.d.ts +11 -9
  551. package/dist/tools/ad-hoc-router.js +80 -51
  552. package/dist/tools/analysis-invocation.d.ts +7 -0
  553. package/dist/tools/analysis-invocation.js +29 -5
  554. package/dist/tools/approval/contract.d.ts +8 -52
  555. package/dist/tools/approval/contract.js +7 -36
  556. package/dist/tools/approval/gateway.d.ts +27 -28
  557. package/dist/tools/approval/gateway.js +33 -130
  558. package/dist/tools/approval/queries.d.ts +6 -11
  559. package/dist/tools/approval/queries.js +43 -29
  560. package/dist/tools/approval/uuidv7.js +2 -2
  561. package/dist/tools/bio/chembl.d.ts +3 -3
  562. package/dist/tools/bio/chembl.js +10 -0
  563. package/dist/tools/bio/comptox.d.ts +25 -8
  564. package/dist/tools/bio/comptox.js +4 -2
  565. package/dist/tools/bio/drug-gene-interactions.d.ts +27 -17
  566. package/dist/tools/bio/drug-gene-interactions.js +11 -8
  567. package/dist/tools/bio/gene-disease-evidence.d.ts +61 -15
  568. package/dist/tools/bio/gene-disease-evidence.js +10 -6
  569. package/dist/tools/bio/gene-preclinical-profile.d.ts +11 -11
  570. package/dist/tools/bio/keys.d.ts +2 -2
  571. package/dist/tools/bio/keys.js +3 -3
  572. package/dist/tools/bio/lookup-annotation.d.ts +5 -5
  573. package/dist/tools/bio/lookup-annotation.js +3 -0
  574. package/dist/tools/bio/opentargets.d.ts +1 -1
  575. package/dist/tools/bio/opentargets.js +6 -0
  576. package/dist/tools/bio/pubchem.d.ts +2 -2
  577. package/dist/tools/bio/pubchem.js +6 -0
  578. package/dist/tools/bio/pubmed.d.ts +26 -16
  579. package/dist/tools/bio/pubmed.js +9 -3
  580. package/dist/tools/bio/search-clinical-trials.d.ts +4 -4
  581. package/dist/tools/bio/search-clinical-trials.js +5 -1
  582. package/dist/tools/bio/search-faers.d.ts +2 -2
  583. package/dist/tools/bio/search-faers.js +1 -1
  584. package/dist/tools/bio/search-gene.d.ts +2 -2
  585. package/dist/tools/bio/search-gene.js +1 -0
  586. package/dist/tools/bio/search-geo-datasets.d.ts +4 -4
  587. package/dist/tools/bio/search-geo-datasets.js +5 -5
  588. package/dist/tools/bio/search-interactions.d.ts +1 -1
  589. package/dist/tools/bio/search-patents.d.ts +28 -22
  590. package/dist/tools/bio/search-patents.js +20 -17
  591. package/dist/tools/bio/search-protein.d.ts +2 -2
  592. package/dist/tools/bio/search-protein.js +1 -1
  593. package/dist/tools/bio/search-regulatory-approvals.d.ts +64 -18
  594. package/dist/tools/bio/search-regulatory-approvals.js +21 -16
  595. package/dist/tools/bio/target-safety.d.ts +8 -8
  596. package/dist/tools/bio/target-safety.js +11 -6
  597. package/dist/tools/capability-data.d.ts +40 -0
  598. package/dist/tools/capability-data.js +74 -0
  599. package/dist/tools/define-tool.d.ts +55 -46
  600. package/dist/tools/define-tool.js +39 -27
  601. package/dist/tools/display/normalize-echart-spec.d.ts +2 -2
  602. package/dist/tools/display/normalize-echart-spec.js +51 -27
  603. package/dist/tools/display/show-user.d.ts +2 -2
  604. package/dist/tools/display/show-user.js +1 -1
  605. package/dist/tools/execute-analysis.d.ts +54 -17
  606. package/dist/tools/execute-analysis.js +193 -62
  607. package/dist/tools/knowledge/check.d.ts +182 -0
  608. package/dist/tools/knowledge/check.js +94 -0
  609. package/dist/tools/knowledge/client.d.ts +351 -0
  610. package/dist/tools/knowledge/client.js +319 -0
  611. package/dist/tools/knowledge/environment.d.ts +78 -0
  612. package/dist/tools/knowledge/environment.js +116 -0
  613. package/dist/tools/knowledge/index.d.ts +49 -0
  614. package/dist/tools/knowledge/index.js +70 -0
  615. package/dist/tools/knowledge/local-slots.d.ts +62 -0
  616. package/dist/tools/knowledge/local-slots.js +184 -0
  617. package/dist/tools/knowledge/pin.d.ts +14 -0
  618. package/dist/tools/knowledge/pin.js +17 -0
  619. package/dist/tools/knowledge/recommend.d.ts +67 -0
  620. package/dist/tools/knowledge/recommend.js +106 -0
  621. package/dist/tools/knowledge/situation.d.ts +143 -0
  622. package/dist/tools/knowledge/situation.js +157 -0
  623. package/dist/tools/knowledge/skeleton.d.ts +69 -0
  624. package/dist/tools/knowledge/skeleton.js +201 -0
  625. package/dist/tools/knowledge/template.d.ts +139 -0
  626. package/dist/tools/knowledge/template.js +273 -0
  627. package/dist/tools/lib/alphafold-client.js +2 -1
  628. package/dist/tools/lib/amass-client.d.ts +28 -28
  629. package/dist/tools/lib/amass-client.js +20 -10
  630. package/dist/tools/lib/api-utils.d.ts +13 -3
  631. package/dist/tools/lib/api-utils.js +17 -3
  632. package/dist/tools/lib/bgee-client.d.ts +6 -6
  633. package/dist/tools/lib/bgee-client.js +16 -10
  634. package/dist/tools/lib/cbioportal-client.d.ts +4 -4
  635. package/dist/tools/lib/cbioportal-client.js +9 -8
  636. package/dist/tools/lib/chembl-client.d.ts +14 -14
  637. package/dist/tools/lib/chembl-client.js +11 -4
  638. package/dist/tools/lib/clinical-benchmarks-client.d.ts +4 -4
  639. package/dist/tools/lib/clinical-benchmarks-client.js +4 -7
  640. package/dist/tools/lib/clinical-trials-client.d.ts +18 -18
  641. package/dist/tools/lib/clinical-trials-client.js +10 -10
  642. package/dist/tools/lib/clinvar-client.d.ts +2 -2
  643. package/dist/tools/lib/clinvar-client.js +6 -6
  644. package/dist/tools/lib/ctx-ops.d.ts +23 -23
  645. package/dist/tools/lib/ctx-ops.js +13 -10
  646. package/dist/tools/lib/dgidb-client.d.ts +6 -6
  647. package/dist/tools/lib/dgidb-client.js +10 -12
  648. package/dist/tools/lib/disgenet-client.d.ts +4 -4
  649. package/dist/tools/lib/ema-client.d.ts +2 -2
  650. package/dist/tools/lib/ensembl-client.d.ts +4 -4
  651. package/dist/tools/lib/ensembl-client.js +5 -4
  652. package/dist/tools/lib/gwas-catalog-client.d.ts +4 -4
  653. package/dist/tools/lib/gwas-catalog-client.js +17 -17
  654. package/dist/tools/lib/html-text.d.ts +6 -0
  655. package/dist/tools/lib/html-text.js +9 -0
  656. package/dist/tools/lib/identifier-resolver.d.ts +4 -4
  657. package/dist/tools/lib/identifier-resolver.js +7 -3
  658. package/dist/tools/lib/impc-client.d.ts +8 -8
  659. package/dist/tools/lib/impc-client.js +46 -35
  660. package/dist/tools/lib/iuphar-client.d.ts +2 -2
  661. package/dist/tools/lib/iuphar-client.js +7 -16
  662. package/dist/tools/lib/monarch-client.d.ts +4 -4
  663. package/dist/tools/lib/openfda-client.d.ts +22 -22
  664. package/dist/tools/lib/openfda-client.js +23 -22
  665. package/dist/tools/lib/opentargets-client.d.ts +12 -12
  666. package/dist/tools/lib/pathway-client.d.ts +4 -4
  667. package/dist/tools/lib/pathway-client.js +15 -19
  668. package/dist/tools/lib/pharmgkb-client.d.ts +2 -2
  669. package/dist/tools/lib/pharmgkb-client.js +1 -1
  670. package/dist/tools/lib/protein-family-modality.d.ts +2 -2
  671. package/dist/tools/lib/protein-family-modality.js +0 -2
  672. package/dist/tools/lib/protein-family-normalize.js +7 -0
  673. package/dist/tools/lib/pubchem-client.d.ts +2 -2
  674. package/dist/tools/lib/pubchem-client.js +1 -0
  675. package/dist/tools/lib/pubchem-ops.d.ts +4 -4
  676. package/dist/tools/lib/pubchem-ops.js +8 -0
  677. package/dist/tools/lib/pubmed-client.d.ts +9 -9
  678. package/dist/tools/lib/pubmed-client.js +1 -1
  679. package/dist/tools/lib/string-client.d.ts +6 -6
  680. package/dist/tools/lib/uniprot-client.d.ts +8 -8
  681. package/dist/tools/lib/uniprot-client.js +5 -1
  682. package/dist/tools/memory/update-working-memory.d.ts +16 -13
  683. package/dist/tools/memory/update-working-memory.js +21 -3
  684. package/dist/tools/read-tool-output.js +8 -2
  685. package/dist/tools/registry.d.ts +2 -2
  686. package/dist/tools/report-authoring/authoring-tools.d.ts +54 -23
  687. package/dist/tools/report-authoring/authoring-tools.js +128 -62
  688. package/dist/tools/report-session/derive-table.d.ts +19 -59
  689. package/dist/tools/report-session/derive-table.js +120 -122
  690. package/dist/tools/report-session/examine-page.d.ts +6 -6
  691. package/dist/tools/report-session/examine-page.js +14 -12
  692. package/dist/tools/report-session/list-artifacts.d.ts +6 -6
  693. package/dist/tools/report-session/list-artifacts.js +5 -5
  694. package/dist/tools/report-session/page-faults.d.ts +6 -6
  695. package/dist/tools/report-session/page-faults.js +3 -1
  696. package/dist/tools/report-session/preview-report.d.ts +4 -3
  697. package/dist/tools/report-session/preview-report.js +26 -7
  698. package/dist/tools/report-session/record-version.d.ts +9 -4
  699. package/dist/tools/report-session/record-version.js +16 -9
  700. package/dist/tools/report-session/session-page-publisher.d.ts +6 -6
  701. package/dist/tools/research/generate-analogy-report.d.ts +14 -7
  702. package/dist/tools/research/generate-analogy-report.js +80 -76
  703. package/dist/tools/research/generate-plan.d.ts +39 -16
  704. package/dist/tools/research/generate-plan.js +565 -338
  705. package/dist/tools/research/guarded-address.d.ts +20 -0
  706. package/dist/tools/research/guarded-address.js +149 -0
  707. package/dist/tools/research/inspect-data-profile.d.ts +27 -20
  708. package/dist/tools/research/inspect-data-profile.js +26 -25
  709. package/dist/tools/research/inspect-run.d.ts +54 -27
  710. package/dist/tools/research/inspect-run.js +50 -40
  711. package/dist/tools/research/literature-reviewer.d.ts +8 -7
  712. package/dist/tools/research/literature-reviewer.js +29 -28
  713. package/dist/tools/research/search-arxiv.d.ts +1 -1
  714. package/dist/tools/research/search-arxiv.js +1 -1
  715. package/dist/tools/research/search-github-repos.d.ts +10 -7
  716. package/dist/tools/research/search-github-repos.js +25 -22
  717. package/dist/tools/research/search-semantic-scholar.js +1 -1
  718. package/dist/tools/research/searxng-engine.d.ts +40 -0
  719. package/dist/tools/research/searxng-engine.js +122 -0
  720. package/dist/tools/research/web-fetch.d.ts +127 -0
  721. package/dist/tools/research/web-fetch.js +618 -0
  722. package/dist/tools/research/web-search.d.ts +84 -0
  723. package/dist/tools/research/web-search.js +117 -0
  724. package/dist/tools/sandbox/link-packages.d.ts +11 -7
  725. package/dist/tools/sandbox/link-packages.js +11 -8
  726. package/dist/tools/sandbox/list-available-packages.d.ts +24 -12
  727. package/dist/tools/sandbox/list-available-packages.js +43 -29
  728. package/dist/tools/sandbox/list-available-refs.d.ts +38 -14
  729. package/dist/tools/sandbox/list-available-refs.js +119 -37
  730. package/dist/tools/sandbox/report-blocker.d.ts +30 -37
  731. package/dist/tools/sandbox/report-blocker.js +22 -68
  732. package/dist/tools/sandbox/skills.d.ts +16 -12
  733. package/dist/tools/sandbox/skills.js +16 -12
  734. package/dist/tools/sandbox/submit-file-metadata.d.ts +12 -9
  735. package/dist/tools/sandbox/submit-file-metadata.js +18 -21
  736. package/dist/tools/start-report-session.d.ts +13 -5
  737. package/dist/tools/start-report-session.js +35 -8
  738. package/dist/tools/terminal-text.d.ts +14 -0
  739. package/dist/tools/terminal-text.js +51 -0
  740. package/dist/tools/workspace/decision-record.d.ts +81 -0
  741. package/dist/tools/workspace/decision-record.js +127 -0
  742. package/dist/tools/workspace/edit-file.d.ts +59 -18
  743. package/dist/tools/workspace/edit-file.js +98 -15
  744. package/dist/tools/workspace/execute-command.d.ts +31 -12
  745. package/dist/tools/workspace/execute-command.js +37 -8
  746. package/dist/tools/workspace/file-stat.d.ts +6 -3
  747. package/dist/tools/workspace/grep.d.ts +10 -7
  748. package/dist/tools/workspace/grep.js +9 -3
  749. package/dist/tools/workspace/index.d.ts +1 -0
  750. package/dist/tools/workspace/index.js +1 -0
  751. package/dist/tools/workspace/list-files.d.ts +6 -3
  752. package/dist/tools/workspace/mutator.d.ts +28 -15
  753. package/dist/tools/workspace/mutator.js +107 -53
  754. package/dist/tools/workspace/read-file.d.ts +8 -5
  755. package/dist/tools/workspace/result-bounds.d.ts +5 -5
  756. package/dist/tools/workspace/result-bounds.js +4 -2
  757. package/dist/tools/workspace/run-exec.d.ts +2 -2
  758. package/dist/tools/workspace/run-exec.js +3 -3
  759. package/dist/tools/workspace/scan-inputs.d.ts +8 -5
  760. package/dist/tools/workspace/scan-inputs.js +17 -5
  761. package/dist/tools/workspace/show-file.d.ts +1 -1
  762. package/dist/tools/workspace/show-file.js +2 -1
  763. package/dist/tools/workspace/show-plan.d.ts +8 -5
  764. package/dist/tools/workspace/show-plan.js +9 -8
  765. package/dist/tools/workspace/workspace-search.d.ts +41 -13
  766. package/dist/tools/workspace/workspace-search.js +27 -14
  767. package/dist/tools/workspace/write-file.d.ts +9 -7
  768. package/dist/workflows/execute-analysis-scheduler.d.ts +9 -9
  769. package/dist/workflows/execute-analysis-scheduler.js +6 -3
  770. package/dist/workflows/execute-analysis.d.ts +100 -76
  771. package/dist/workflows/execute-analysis.js +380 -247
  772. package/dist/workflows/pause.d.ts +71 -0
  773. package/dist/workflows/pause.js +173 -0
  774. package/dist/workflows/sandbox-step.d.ts +50 -61
  775. package/dist/workflows/sandbox-step.js +99 -106
  776. package/dist/workflows/test/sql-writes.d.ts +21 -0
  777. package/dist/workflows/test/sql-writes.js +36 -0
  778. package/dist/workspace/filesystem.d.ts +6 -6
  779. package/dist/workspace/filesystem.js +10 -8
  780. package/dist/workspace/paths.d.ts +1 -1
  781. package/dist/workspace/paths.js +15 -4
  782. package/dist/workspace/search-config.d.ts +2 -2
  783. package/dist/workspace/search-config.js +1 -1
  784. package/package.json +25 -22
  785. package/dist/loop/continue-agent.d.ts +0 -40
  786. package/dist/loop/continue-agent.js +0 -38
  787. package/dist/loop/genai-spans.d.ts +0 -47
  788. package/dist/loop/genai-spans.js +0 -134
  789. package/dist/loop/run-agent.d.ts +0 -236
  790. package/dist/loop/run-agent.js +0 -1110
  791. package/dist/loop/run-step.d.ts +0 -29
  792. package/dist/loop/run-step.js +0 -34
  793. package/dist/loop/run-to-terminal.d.ts +0 -66
  794. package/dist/loop/run-to-terminal.js +0 -90
  795. package/dist/loop/tool-mask.d.ts +0 -23
  796. package/dist/loop/tool-mask.js +0 -46
  797. package/dist/providers/streaming-chat.d.ts +0 -32
  798. package/dist/providers/streaming-chat.js +0 -91
  799. package/dist/tasks/derive-table-exec.d.ts +0 -54
  800. package/dist/tasks/derive-table-exec.js +0 -86
  801. package/dist/workflows/suspension.d.ts +0 -32
  802. package/dist/workflows/suspension.js +0 -38
@@ -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
  }
@@ -21,9 +21,9 @@
21
21
  * `providers/request-headers.ts`).
22
22
  */
23
23
  /** Who the request is. Always complete. */
24
- export interface Identity {
24
+ export type Identity = {
25
25
  readonly user: string;
26
- }
26
+ };
27
27
  /**
28
28
  * What the request operates on. It owns its resource coordinates
29
29
  * (`scopeResource`) and the workload id (`scopeWorkloadId`) used for
@@ -43,27 +43,27 @@ declare const CRED_BRAND: unique symbol;
43
43
  * off it while still letting a concrete managed credential satisfy it
44
44
  * structurally.
45
45
  */
46
- export interface Credential {
46
+ export type Credential = {
47
47
  readonly [CRED_BRAND]?: never;
48
- }
48
+ };
49
49
  /**
50
50
  * The agent call chain at the point of a call. Read-only provenance —
51
51
  * events, logs, and OTel spans read it; control flow MUST NOT branch on it.
52
52
  */
53
- export interface Provenance {
53
+ export type Provenance = {
54
54
  readonly agentId: string;
55
55
  readonly callPath: readonly string[];
56
- }
56
+ };
57
57
  /** Present only inside a workflow run. */
58
- export interface RunFrame {
58
+ export type RunFrame = {
59
59
  readonly runId: string;
60
60
  readonly stepId?: string;
61
- }
61
+ };
62
62
  /** Canonical resource coordinates a `Scope` resolves to. */
63
- export interface ResourceCoordinates {
63
+ export type ResourceCoordinates = {
64
64
  readonly resourceType: "analysis";
65
65
  readonly resourceId: string;
66
- }
66
+ };
67
67
  /** Derive the `{ resourceType, resourceId }` a scope resolves through: `{ "analysis", analysisId }`. */
68
68
  export declare function scopeResource(scope: Scope): ResourceCoordinates;
69
69
  /** The value stamped into the workload tag — the workload id for this scope. */
@@ -79,14 +79,14 @@ declare const AUTH_BRAND: unique symbol;
79
79
  * off it while still letting a managed `{ credential, orgId }` literal satisfy
80
80
  * it structurally.
81
81
  */
82
- export interface AuthContext {
82
+ export type AuthContext = {
83
83
  readonly [AUTH_BRAND]?: never;
84
- }
84
+ };
85
85
  /**
86
86
  * The session view the agent loop, the provider seam, and tools accept —
87
87
  * the union of what every layer below the HTTP door actually reads. The
88
- * session is a conduit: `runAgent` forwards it to the provider and into each
89
- * tool; tools forward it to `embed` and into nested `runAgent`s. The deepest
88
+ * session is a conduit: `runLoop` forwards it to the provider and into each
89
+ * tool; tools forward it to `embed` and into nested `runLoop`s. The deepest
90
90
  * consumer is the provider, which reads every field, so the conduit type is
91
91
  * "all fields, generalized to what's read" — `credential` widened to the
92
92
  * opaque `Credential` (nothing in the harness branches on the concrete shape),
@@ -96,7 +96,7 @@ export interface AuthContext {
96
96
  * `RunSession` (with RunFrame) are each structurally assignable, so the
97
97
  * same agent loop runs under a live request and inside a durable workflow.
98
98
  */
99
- export interface AgentSession {
99
+ export type AgentSession = {
100
100
  readonly identity: Identity;
101
101
  readonly scope: Scope;
102
102
  readonly provenance: Provenance;
@@ -107,57 +107,57 @@ export interface AgentSession {
107
107
  * `getAuth`. The sole source of credential/org behind a session.
108
108
  */
109
109
  readonly auth: AuthContext;
110
- }
110
+ };
111
111
  /**
112
112
  * The live HTTP door. No `RunFrame` — `runId`/`stepId` are unrepresentable
113
113
  * until async work is authorized. SHALL NOT be JSON-serialized into durable
114
114
  * state.
115
115
  */
116
- export interface RequestSession {
116
+ export type RequestSession = {
117
117
  readonly identity: Identity;
118
118
  readonly scope: Scope;
119
119
  readonly provenance: Provenance;
120
120
  readonly auth: AuthContext;
121
- }
121
+ };
122
122
  /**
123
123
  * The durable, JSON-serializable bundle. Carries a `RunFrame`. Constructed
124
124
  * solely at the run-authorization seam.
125
125
  */
126
- export interface RunSession {
126
+ export type RunSession = {
127
127
  readonly identity: Identity;
128
128
  readonly scope: Scope;
129
129
  readonly provenance: Provenance;
130
130
  readonly runFrame: RunFrame;
131
131
  readonly auth: AuthContext;
132
- }
132
+ };
133
133
  /**
134
134
  * The session of a sandbox spawn. A sandbox takes its analysis id, its run id,
135
135
  * and its step id from this session.
136
136
  */
137
- export interface SpawnSession extends RunSession {
137
+ export type SpawnSession = RunSession & {
138
138
  readonly runFrame: RunFrame & {
139
139
  readonly stepId: string;
140
140
  };
141
- }
141
+ };
142
142
  /**
143
143
  * The minimal session view that a host hook reads. Both bundles satisfy it;
144
144
  * `runFrame` is present only on a `RunSession`, so a hook that gets a
145
145
  * `RequestSession` sees no run or step.
146
146
  */
147
- export interface HookSessionView {
147
+ export type HookSessionView = {
148
148
  readonly identity: Identity;
149
149
  readonly scope: Scope;
150
150
  readonly provenance: Provenance;
151
151
  readonly runFrame?: RunFrame;
152
- }
152
+ };
153
153
  /**
154
154
  * The session that the request headers hook gets: the hook view plus the
155
155
  * opaque `auth`, which a host realization downcasts to reach its credential.
156
156
  * `AgentSession` structurally satisfies it.
157
157
  */
158
- export interface ResolvableSession extends HookSessionView {
158
+ export type ResolvableSession = HookSessionView & {
159
159
  readonly auth: AuthContext;
160
- }
160
+ };
161
161
  /**
162
162
  * Derive a child session for a sub-agent call — provenance only. Sets the
163
163
  * child `agentId` and appends it to `callPath`, leaving identity, scope, and