@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
@@ -1,26 +1,20 @@
1
1
  /**
2
- * The extraction workflow on the profile rails, and the `ExtractionArm` realization over it.
2
+ * The extraction pass on the profile rails, and the `ExtractionArm` realization over it.
3
3
  *
4
4
  * The report resolver falls through to this arm for an over-cap file or a host parse fault. The arm runs one
5
5
  * fixed extraction script in an ephemeral sandbox, and it gives back the rows that the script read. No agent
6
6
  * loop runs anywhere in this path. A file whose extension names no tabular format never arrives here,
7
7
  * because the host decides the format and it refuses the file before the fall-through.
8
8
  *
9
- * The shape matches the data profile (`src/tasks/data-profile.ts`). The authorization mints at the async
10
- * edge (`triggerExtractValues`) and rides in the workflow input. The body never mints, and it revokes the
11
- * authorization on every terminal path. The container is ephemeral, and it goes away with the work, thus no
12
- * standing machine exists.
9
+ * The pass runs inside the step of the tool call that resolves the report (`sandbox/step-sandbox.ts`), under
10
+ * the auth of that call, and it mints no mandate. One call can run more than one pass, thus the exec of each
11
+ * pass takes the key of the step and a hash of its requests. The container is ephemeral, and it goes away
12
+ * with the work, thus no standing machine exists.
13
13
  */
14
- import { DBOS } from "@dbos-inc/dbos-sdk";
15
- import { err, ok } from "neverthrow";
16
- import { randomUUID } from "node:crypto";
17
- import { forStep } from "../auth/types.js";
14
+ import { createHash } from "node:crypto";
18
15
  import { createNoopLogger } from "../lib/console-logger.js";
19
- import { deliverNotice, passGate } from "../lib/hooks.js";
20
- import { generateExecutionId } from "../sandbox/execution-id.js";
21
- import { mintSandboxIdentity } from "../sandbox/identity.js";
22
- import { keepSuspendingRefusal } from "../sandbox/sandbox-error.js";
23
- import { suspensionOfRefusal, suspensionOfSpawnRefusal } from "../workflows/suspension.js";
16
+ import { safeParseJsonAs } from "../lib/parse-json.js";
17
+ import { passSpawnSession, withStepSandbox } from "../sandbox/step-sandbox.js";
24
18
  import { EXTRACTION_INPUT_ENV, EXTRACTION_SCRIPT, ExtractValuesResultSchema } from "./extract-values-script.js";
25
19
  /** The synthetic run id and step id of the extraction pass. Both are constants shared by every analysis. */
26
20
  const EXTRACT_VALUES_RUN_LITERAL = "extract-values";
@@ -35,8 +29,6 @@ const EXTRACTION_DEADLINE_MS = 300_000;
35
29
  * carries no file size. A later change can size it from the batch.
36
30
  */
37
31
  const EXTRACTION_RESOURCES = { cpu: 2, memoryGb: 8 };
38
- /** The exec progress callback. The extraction pass reports no live activity, thus the callback drops each event. */
39
- const noopEmit = () => { };
40
32
  /**
41
33
  * Build the sandbox exec for one extraction pass. The command runs the fixed script through `python3 -c`.
42
34
  * The working directory is the analysis mount, thus a relative request path reads the correct file. The
@@ -51,20 +43,29 @@ const noopEmit = () => { };
51
43
  * The function is pure, thus a test asserts the command shape without a sandbox.
52
44
  */
53
45
  export function buildExtractionExec(analysisId, requests) {
54
- const scriptRequests = requests.map((request) => ({ path: request.path, format: request.format, hash: request.hash }));
55
46
  return {
56
47
  command: ["python3", "-c", EXTRACTION_SCRIPT],
57
48
  cwd: `/${analysisId}`,
58
- env: { [EXTRACTION_INPUT_ENV]: JSON.stringify(scriptRequests) },
49
+ env: { [EXTRACTION_INPUT_ENV]: JSON.stringify(scriptRequests(requests)) },
59
50
  timeoutSeconds: Math.floor(EXTRACTION_DEADLINE_MS / 1000),
60
51
  };
61
52
  }
53
+ function scriptRequests(requests) {
54
+ return requests.map((request) => ({ path: request.path, format: request.format, hash: request.hash }));
55
+ }
56
+ /** The key of one pass inside its step: the same requests give the same exec, and other requests a new one. */
57
+ function requestKey(requests) {
58
+ return createHash("sha256")
59
+ .update(JSON.stringify(scriptRequests(requests)), "utf8")
60
+ .digest("hex")
61
+ .slice(0, 16);
62
+ }
62
63
  /**
63
64
  * Parse the script output from the exec result. A synthetic failure, a timeout, and a non-zero exit each
64
65
  * throw, because each means the script did not emit its map. A stdout that is not the map shape throws too.
65
66
  *
66
- * The function is pure, thus a test asserts the parse without a sandbox. The throw crosses the workflow
67
- * boundary, and the arm turns it into a rejected promise.
67
+ * The function is pure, thus a test asserts the parse without a sandbox. The arm turns the throw into a
68
+ * rejected promise.
68
69
  */
69
70
  export function parseExtractionOutput(result) {
70
71
  if (result.syntheticFailure !== undefined) {
@@ -78,104 +79,42 @@ export function parseExtractionOutput(result) {
78
79
  }
79
80
  let parsed;
80
81
  try {
81
- parsed = JSON.parse(result.stdout);
82
+ parsed = safeParseJsonAs(result.stdout, ExtractValuesResultSchema);
82
83
  }
83
84
  catch {
84
85
  throw new Error("the extraction script did not emit valid JSON");
85
86
  }
86
- return ExtractValuesResultSchema.parse(parsed);
87
+ if (!parsed.success)
88
+ throw parsed.error;
89
+ return parsed.data;
87
90
  }
88
91
  /**
89
- * The body, extracted so a test drives it without a registered workflow. It creates the ephemeral
90
- * container, submits one exec, awaits the result durably, and gives the value map back. It revokes the run
91
- * authorization on every terminal path, and it tears the container down on both paths.
92
+ * Run one extraction pass: make the container, run the script on every request, and remove the container.
92
93
  *
93
- * A chat turn awaits this workflow, thus a suspension is the `err` of the result, and the workflow does not
94
- * cancel (workflow-suspension spec). The body does not mark the analysis: the caller reports the suspension.
94
+ * A suspending refusal of the spawn is the `err`, and the caller reports it. Each other fault throws.
95
95
  */
96
- export async function runExtractValuesBody(input, deps) {
97
- const logger = (deps.logger ?? createNoopLogger()).named("extract-values").with({ analysisId: input.analysisId });
98
- const { analysisId, runSession, requests, ownsMandate = true } = input; // oss-core-managed-ok
99
- const authorization = { runSession, ownsMandate }; // oss-core-managed-ok
100
- const revoke = (reason) => deliverNotice(logger, "RunAuthorizer.revoke", deps.runAuthorizer.revoke(authorization, reason));
96
+ export async function runExtraction(deps, caller, requests) {
97
+ const logger = (deps.logger ?? createNoopLogger()).named("extract-values").with({ analysisId: caller.analysisId });
101
98
  try {
102
- const executionId = generateExecutionId(EXTRACT_VALUES_AGENT_ID);
103
- const workflowId = DBOS.workflowID ?? `${EXTRACT_VALUES_RUN_LITERAL}:${executionId}`;
104
- // The container mounts the analysis tree read-only. The extraction pass only reads, thus it needs
105
- // no writable step mount.
106
- const spawned = keepSuspendingRefusal(await deps.sandboxClient.createSandbox(forStep(runSession, EXTRACT_VALUES_STEP_LITERAL), { childWorkflowId: workflowId, resources: EXTRACTION_RESOURCES, readOnly: true }, mintSandboxIdentity(EXTRACT_VALUES_RUN_LITERAL)));
107
- if (spawned.isErr()) {
108
- const suspension = suspensionOfSpawnRefusal(spawned.error);
109
- logger.warn("extraction suspended", { reason: suspension.reason });
110
- await revoke("extract-values-suspended");
111
- return err(suspension);
112
- }
113
- const sandbox = spawned.value;
114
- try {
115
- // A checkpointed clock, not `Date.now()`: a wall-clock deadline would grow on each recovery.
116
- const deadlineAbs = (await DBOS.now()) + EXTRACTION_DEADLINE_MS;
117
- const result = await deps.sandboxClient.exec(sandbox, buildExtractionExec(analysisId, requests), noopEmit, deadlineAbs);
118
- const map = parseExtractionOutput(result);
119
- await revoke("extract-values-completed");
120
- return ok(map);
121
- }
122
- finally {
123
- try {
124
- await deps.sandboxClient.teardown(sandbox);
125
- }
126
- catch (teardownErr) {
127
- logger.warn("teardown failed (non-fatal)", { executionId, ...logger.errorFields(teardownErr) });
128
- }
129
- }
130
- }
131
- catch (err) {
132
- logger.error("extraction failed", logger.errorFields(err));
133
- await revoke("extract-values-failed");
134
- throw err;
99
+ const ran = await withStepSandbox(deps.sandboxClient, {
100
+ session: passSpawnSession(caller, {
101
+ analysisId: caller.analysisId,
102
+ runId: EXTRACT_VALUES_RUN_LITERAL,
103
+ stepId: EXTRACT_VALUES_STEP_LITERAL,
104
+ agentId: EXTRACT_VALUES_AGENT_ID,
105
+ }),
106
+ // The pass only reads, thus the container mounts the analysis tree read-only.
107
+ spec: { resources: EXTRACTION_RESOURCES, readOnly: true },
108
+ execKey: requestKey(requests),
109
+ }, logger, async (exec) => parseExtractionOutput(await exec(buildExtractionExec(caller.analysisId, requests), EXTRACTION_DEADLINE_MS)));
110
+ if (ran.isErr())
111
+ logger.warn("the host refused the sandbox of the extraction", { reason: ran.error.reason });
112
+ return ran;
135
113
  }
136
- }
137
- /**
138
- * Register the extraction workflow with DBOS. It gives back the registered callable, thus a trigger
139
- * dispatches with `DBOS.startWorkflow`.
140
- */
141
- export function registerExtractValuesWorkflow(deps) {
142
- return DBOS.registerWorkflow((input) => runExtractValuesBody(input, deps), { name: "extract-values" });
143
- }
144
- /** The per-attempt workflow id. A fresh nonce keeps each pass under a distinct id. */
145
- export function extractValuesWorkflowId(analysisId, nonce) {
146
- return `extract-values:${analysisId}:${nonce}`;
147
- }
148
- /**
149
- * The async edge. It authorizes through the `RunAuthorizer`, starts the workflow, and awaits the outcome.
150
- * The body owns the revoke, thus the trigger holds no lifecycle. A workflow fault and a refused
151
- * authorization reject the returned promise. A suspension is the `err` of the result: of the workflow, or of
152
- * an authorization that the host refused with the suspend flag.
153
- */
154
- export async function triggerExtractValues(deps, params) {
155
- const { auth, analysisId, requests } = params;
156
- const authorized = await passGate("RunAuthorizer.authorize", deps.runAuthorizer.authorize({
157
- auth,
158
- scope: { kind: "analysis", analysisId },
159
- provenance: { agentId: EXTRACT_VALUES_AGENT_ID, callPath: [EXTRACT_VALUES_AGENT_ID] },
160
- frame: { runId: EXTRACT_VALUES_RUN_LITERAL, stepId: EXTRACT_VALUES_STEP_LITERAL },
161
- }));
162
- if (authorized.isErr()) {
163
- const suspension = suspensionOfRefusal(authorized.error);
164
- if (suspension !== undefined)
165
- return err(suspension);
166
- throw new Error(`the extraction was not authorized: ${authorized.error.reason}`);
114
+ catch (cause) {
115
+ logger.error("extraction failed", logger.errorFields(cause));
116
+ throw cause;
167
117
  }
168
- const { runSession, ownsMandate } = authorized.value; // oss-core-managed-ok
169
- const handle = (await DBOS.startWorkflow(deps.workflow, {
170
- workflowID: extractValuesWorkflowId(analysisId, randomUUID()),
171
- })({ analysisId, runSession, requests: [...requests], ownsMandate })); // oss-core-managed-ok
172
- return handle.getResult();
173
- }
174
- /**
175
- * Bind the trigger to one analysis and one auth context. The result runs one pass with every request in it.
176
- */
177
- export function bindExtractionTrigger(deps, binding) {
178
- return (requests) => triggerExtractValues(deps, { auth: binding.auth, analysisId: binding.analysisId, requests });
179
118
  }
180
119
  /**
181
120
  * Turn the raw script output into the arm result. A path with rows enters the map. A path with an error
@@ -195,7 +134,8 @@ export function extractionArtifactsFromResult(result) {
195
134
  /**
196
135
  * Make the extraction arm over a runner. One `extract` call makes one run with every request in it, and it
197
136
  * gives the value map. A run fault rejects the promise, and the resolver turns the rejection into a failed
198
- * reference. A suspension is the `err`, and the resolver reports its reason on each reference.
137
+ * reference. A refusal of the sandbox with the suspend flag is the `err`, and the resolver reports its reason on each
138
+ * reference.
199
139
  */
200
140
  export function createExtractionArm(run) {
201
141
  return {
@@ -12,11 +12,11 @@
12
12
  import type { Pool } from "pg";
13
13
  export type RegulatoryCorpusSource = "FDA-CDER" | "FDA-CBER" | "ICH";
14
14
  export declare const REGULATORY_CORPUS_SOURCES: RegulatoryCorpusSource[];
15
- export interface RefreshResult {
15
+ export type RefreshResult = {
16
16
  ok: number;
17
17
  fail: number;
18
- }
19
- export interface RefreshOptions {
18
+ };
19
+ export type RefreshOptions = {
20
20
  pool: Pool;
21
21
  sources?: RegulatoryCorpusSource[];
22
22
  /**
@@ -30,23 +30,7 @@ export interface RefreshOptions {
30
30
  embedder: (text: string) => Promise<number[]>;
31
31
  /** Logger used for per-doc progress. Defaults to `console`. */
32
32
  log?: Pick<Console, "log" | "error">;
33
- }
34
- /**
35
- * Build an embedder that talks directly to api.openai.com using the given
36
- * `apiKey`, bypassing the billing gateway.
37
- *
38
- * Returns `null` when `apiKey` is missing — callers MUST treat that as
39
- * "auto-refresh disabled" rather than falling back to the workspace
40
- * embedder (`workspace/search-config.ts`), which routes through the billing gateway
41
- * via `OPENAI_BASE_URL` and would generate unbilled calls outside an ALS
42
- * billing scope.
43
- *
44
- * The model id mirrors the workspace embedder default
45
- * (`text-embedding-3-small`, 1536 dim) so chunks remain comparable to the
46
- * default `cortex_regulatory_chunks.embedding` shape. Pass the existing
47
- * `OPENAI_API_KEY` (a real OpenAI key, NOT a billing-gateway virtual key — direct
48
- * calls to api.openai.com would 401 against a `sk-billing-*` value).
49
- */
33
+ };
50
34
  export declare function buildMaintenanceEmbedder(opts: {
51
35
  apiKey?: string;
52
36
  embeddingModel?: string;
@@ -9,10 +9,14 @@
9
9
  * - `scripts/index-regulatory-corpus.ts` — operator-run CLI
10
10
  * - `regulatory-corpus-boot-refresh.ts` — automatic 90-day-stale boot trigger
11
11
  */
12
+ import { errorMessageOf } from "../lib/thrown.js";
13
+ import { textOf } from "../lib/unknown-text.js";
12
14
  import { unwrapOrThrow } from "../lib/result.js";
15
+ import { presentAt } from "../lib/present.js";
13
16
  import { fetchFdaGuidanceListing, fetchAndExtractFdaDoc } from "../lib/regulatory-corpus/fetch-fda-guidance.js";
14
17
  import { fetchIchListing, fetchAndExtractIchDoc } from "../lib/regulatory-corpus/fetch-ich.js";
15
18
  import { chunkText, upsertChunks } from "../lib/regulatory-corpus.js";
19
+ import { z } from "zod";
16
20
  export const REGULATORY_CORPUS_SOURCES = ["FDA-CDER", "FDA-CBER", "ICH"];
17
21
  // A large guidance doc can chunk into 200-500+ pieces. Firing them all at
18
22
  // once trips embedding-API rate limits and silently truncates the upserted
@@ -34,6 +38,7 @@ const EMBED_CONCURRENCY = 20;
34
38
  * `OPENAI_API_KEY` (a real OpenAI key, NOT a billing-gateway virtual key — direct
35
39
  * calls to api.openai.com would 401 against a `sk-billing-*` value).
36
40
  */
41
+ const EmbeddingResponseSchema = z.object({ data: z.array(z.object({ embedding: z.array(z.number()) })) });
37
42
  export function buildMaintenanceEmbedder(opts) {
38
43
  const { apiKey } = opts;
39
44
  if (!apiKey)
@@ -56,9 +61,9 @@ export function buildMaintenanceEmbedder(opts) {
56
61
  const body = await res.text();
57
62
  throw new Error(`buildMaintenanceEmbedder: openai /embeddings ${res.status}: ${body}`);
58
63
  }
59
- const data = (await res.json());
60
- const embedding = data.data?.[0]?.embedding;
61
- if (!embedding)
64
+ const data = EmbeddingResponseSchema.parse(await res.json());
65
+ const embedding = data.data[0]?.embedding;
66
+ if (!embedding || embedding.length === 0)
62
67
  throw new Error("buildMaintenanceEmbedder: empty response");
63
68
  return embedding;
64
69
  };
@@ -79,10 +84,9 @@ async function listForSource(source) {
79
84
  return await fetchIchListing();
80
85
  }
81
86
  }
87
+ // Each source's listing carries only its own stub kind, thus the stub's own shape picks the fetcher.
82
88
  async function fetchOne(source, stub) {
83
- if (source === "ICH")
84
- return await fetchAndExtractIchDoc(stub);
85
- return await fetchAndExtractFdaDoc(stub);
89
+ return "center" in stub ? await fetchAndExtractFdaDoc(stub) : await fetchAndExtractIchDoc(stub);
86
90
  }
87
91
  async function indexSource(pool, source, embedder, log) {
88
92
  log.log(`\n=== ${source} ===`);
@@ -104,7 +108,7 @@ async function indexSource(pool, source, embedder, log) {
104
108
  const batchResults = await Promise.all(batch.map((c) => embedder(c.text)));
105
109
  embeddings.push(...batchResults);
106
110
  }
107
- const chunks = rawChunks.map((c, i) => ({ ...c, embedding: embeddings[i] }));
111
+ const chunks = rawChunks.map((c, i) => ({ ...c, embedding: presentAt(embeddings, i, "the embedding of the chunk") }));
108
112
  const row = {
109
113
  source,
110
114
  doc_id: doc.doc_id,
@@ -119,7 +123,7 @@ async function indexSource(pool, source, embedder, log) {
119
123
  }
120
124
  catch (err) {
121
125
  fail++;
122
- const msg = err instanceof Error ? err.message : String(err);
126
+ const msg = errorMessageOf(err) ?? textOf(err);
123
127
  log.error(` FAIL ${stub.doc_id}: ${msg}`);
124
128
  }
125
129
  }
@@ -17,7 +17,7 @@
17
17
  import type { Pool } from "pg";
18
18
  import { refreshRegulatoryCorpus, type RefreshOptions } from "./refresh-regulatory-corpus.js";
19
19
  export declare const REFRESH_INTERVAL_DAYS = 90;
20
- export interface BootRefreshDeps {
20
+ export type BootRefreshDeps = {
21
21
  /** Shared `pg.Pool`. */
22
22
  pool: Pool;
23
23
  /** Forwarded to `refreshRegulatoryCorpus()` when the refresh fires. */
@@ -39,7 +39,7 @@ export interface BootRefreshDeps {
39
39
  embeddingModel?: string;
40
40
  /** Direct OpenAI key for the maintenance embedder (NOT a billing-gateway VK). */
41
41
  openaiApiKey?: string;
42
- }
42
+ };
43
43
  /**
44
44
  * Check the corpus freshness and, if stale, kick off an asynchronous
45
45
  * refresh. Resolves quickly — does NOT wait for the refresh to finish.
@@ -14,16 +14,18 @@
14
14
  * but the cost of a redundant check is one round-trip; the actual scrape
15
15
  * is what we serialize.
16
16
  */
17
+ import { errorMessageOf } from "../lib/thrown.js";
17
18
  import { buildMaintenanceEmbedder, refreshRegulatoryCorpus } from "./refresh-regulatory-corpus.js";
18
19
  export const REFRESH_INTERVAL_DAYS = 90;
19
20
  const ADVISORY_LOCK_KEY = "cortex_regulatory_corpus_refresh";
20
21
  async function checkFreshness(pool, intervalDays) {
22
+ // EXTRACT gives numeric, which node-pg returns as a string, thus the float8 cast makes `age_days` a number.
21
23
  const { rows } = await pool.query(`SELECT MAX(indexed_at) AS last_indexed_at,
22
- EXTRACT(EPOCH FROM (NOW() - MAX(indexed_at))) / 86400 AS age_days
24
+ (EXTRACT(EPOCH FROM (NOW() - MAX(indexed_at))) / 86400)::float8 AS age_days
23
25
  FROM cortex_regulatory_chunks`);
24
26
  const row = rows[0];
25
27
  const lastIndexedAt = row?.last_indexed_at ?? null;
26
- const ageDays = row?.age_days != null ? Number(row.age_days) : null;
28
+ const ageDays = row?.age_days != null ? row.age_days : null;
27
29
  const stale = lastIndexedAt === null || (ageDays ?? Infinity) >= intervalDays;
28
30
  return { stale, lastIndexedAt, ageDays };
29
31
  }
@@ -71,11 +73,11 @@ export async function maybeKickOffRegulatoryCorpusRefresh(deps) {
71
73
  freshness = await checkFreshness(pool, intervalDays);
72
74
  }
73
75
  catch (err) {
74
- log.warn("[boot] Regulatory corpus freshness check failed; skipping auto-refresh:", err instanceof Error ? err.message : err);
76
+ log.warn("[boot] Regulatory corpus freshness check failed; skipping auto-refresh:", errorMessageOf(err) ?? err);
75
77
  return "error";
76
78
  }
77
79
  if (!freshness.stale) {
78
- log.log(`[boot] Regulatory corpus is fresh (age ${freshness.ageDays?.toFixed(1)}d < ${intervalDays}d); skipping refresh`);
80
+ log.log(`[boot] Regulatory corpus is fresh (age ${String(freshness.ageDays?.toFixed(1))}d < ${intervalDays}d); skipping refresh`);
79
81
  return "skipped-fresh";
80
82
  }
81
83
  // Corpus is stale — resolve the maintenance embedder. System-scoped
@@ -92,12 +94,12 @@ export async function maybeKickOffRegulatoryCorpusRefresh(deps) {
92
94
  });
93
95
  }
94
96
  catch (err) {
95
- log.warn("[boot] Could not load env for regulatory corpus refresh; skipping:", err instanceof Error ? err.message : err);
97
+ log.warn("[boot] Could not load env for regulatory corpus refresh; skipping:", errorMessageOf(err) ?? err);
96
98
  return "skipped-unconfigured";
97
99
  }
98
100
  }
99
101
  if (!embedder) {
100
- const ageStr = freshness.lastIndexedAt === null ? "empty" : `age ${freshness.ageDays?.toFixed(1)}d`;
102
+ const ageStr = freshness.lastIndexedAt === null ? "empty" : `age ${String(freshness.ageDays?.toFixed(1))}d`;
101
103
  log.warn(`[boot] Regulatory corpus is stale (${ageStr}) but ` +
102
104
  "REGULATORY_CORPUS_OPENAI_API_KEY is unset; skipping auto-refresh. " +
103
105
  "Set it (a real OpenAI key, NOT a billing-gateway virtual key — the " +
@@ -116,7 +118,7 @@ export async function maybeKickOffRegulatoryCorpusRefresh(deps) {
116
118
  }
117
119
  catch (err) {
118
120
  client.release();
119
- log.warn("[boot] Regulatory corpus advisory-lock attempt failed; skipping auto-refresh:", err instanceof Error ? err.message : err);
121
+ log.warn("[boot] Regulatory corpus advisory-lock attempt failed; skipping auto-refresh:", errorMessageOf(err) ?? err);
120
122
  return "error";
121
123
  }
122
124
  if (!acquired) {
@@ -124,21 +126,21 @@ export async function maybeKickOffRegulatoryCorpusRefresh(deps) {
124
126
  log.log("[boot] Regulatory corpus refresh already in progress on another replica; skipping");
125
127
  return "skipped-locked";
126
128
  }
127
- const ageStr = freshness.lastIndexedAt === null ? "empty" : `age ${freshness.ageDays?.toFixed(1)}d`;
129
+ const ageStr = freshness.lastIndexedAt === null ? "empty" : `age ${String(freshness.ageDays?.toFixed(1))}d`;
128
130
  log.log(`[boot] Regulatory corpus is stale (${ageStr}); starting async refresh in background`);
129
131
  // Detached promise — startup must not wait for this to finish.
130
132
  const dispatchEmbedder = embedder;
131
133
  void (async () => {
132
134
  try {
133
135
  const result = await refresh({
134
- ...(deps.refreshOptions ?? {}),
136
+ ...deps.refreshOptions,
135
137
  pool,
136
138
  embedder: dispatchEmbedder,
137
139
  });
138
140
  log.log(`[boot] Regulatory corpus refresh complete: ok=${result.ok} fail=${result.fail}`);
139
141
  }
140
142
  catch (err) {
141
- log.error("[boot] Regulatory corpus refresh threw:", err instanceof Error ? err.message : err);
143
+ log.error("[boot] Regulatory corpus refresh threw:", errorMessageOf(err) ?? err);
142
144
  }
143
145
  finally {
144
146
  await releaseLock(client);
@@ -0,0 +1,60 @@
1
+ /**
2
+ * The test kit of the harness: a scripted model for a test of an agent, a chat
3
+ * turn, or a tool that runs a sub-agent. It is a `ChatProvider` over the mock
4
+ * model of the AI SDK. Each request takes the next entry of the script, and the
5
+ * kit records each request that the model got. `inProcessChatTurns` gives the
6
+ * chat turns of a runtime with no DBOS engine, over the turn in process. An
7
+ * embedder imports it from `@inflexa-ai/harness/testing`.
8
+ */
9
+ import type { LanguageModelV4CallOptions, SharedV4ProviderMetadata } from "@ai-sdk/provider";
10
+ export { inProcessChatTurns } from "./app/in-process-turn.js";
11
+ import type { ChatProvider, ChatUsage, ProviderCapabilities } from "./providers/types.js";
12
+ export type ScriptedPart = {
13
+ readonly type: "text";
14
+ readonly text: string;
15
+ } | {
16
+ readonly type: "reasoning";
17
+ readonly text: string;
18
+ readonly signature?: string;
19
+ } | {
20
+ readonly type: "tool-call";
21
+ readonly toolCallId: string;
22
+ readonly toolName: string;
23
+ readonly input: unknown;
24
+ };
25
+ export type ScriptedReply = {
26
+ readonly content: readonly ScriptedPart[];
27
+ readonly finishReason: "stop" | "tool-calls" | "length" | "content-filter" | "other" | "error";
28
+ readonly rawFinishReason?: string;
29
+ readonly usage?: ChatUsage;
30
+ readonly providerMetadata?: SharedV4ProviderMetadata;
31
+ readonly responseId?: string;
32
+ readonly modelId?: string;
33
+ };
34
+ /** A request that fails: the model throws the value when it opens its stream. */
35
+ export type ScriptedFailure = {
36
+ readonly fail: unknown;
37
+ };
38
+ /** A reply that streams its first parts, and then fails with an error part. */
39
+ export type ScriptedBreak = {
40
+ readonly breakAfter: readonly ScriptedPart[];
41
+ readonly error: unknown;
42
+ };
43
+ export type ScriptEntry = ScriptedReply | ScriptedFailure | ScriptedBreak;
44
+ export type ScriptStep = ScriptEntry | ((call: LanguageModelV4CallOptions) => ScriptEntry | Promise<ScriptEntry>);
45
+ export type ScriptedModel = {
46
+ readonly provider: ChatProvider;
47
+ /** Each request that the model got, in order. */
48
+ readonly calls: LanguageModelV4CallOptions[];
49
+ };
50
+ export declare function text(value: string): ScriptedPart;
51
+ export declare function reasoning(value: string, signature?: string): ScriptedPart;
52
+ export declare function toolCall(toolCallId: string, toolName: string, input: unknown): ScriptedPart;
53
+ export declare function reply(content: readonly ScriptedPart[], finishReason?: ScriptedReply["finishReason"], usage?: ChatUsage): ScriptedReply;
54
+ /** The reply of a round of tool calls. */
55
+ export declare function callTools(...calls: readonly ScriptedPart[]): ScriptedReply;
56
+ /** Build a provider over a scripted model. A request past the end of the script fails the test that made it. */
57
+ export declare function scriptedModel(script: readonly ScriptStep[], options?: {
58
+ readonly capabilities?: Partial<ProviderCapabilities>;
59
+ readonly maxRetries?: number;
60
+ }): ScriptedModel;
@@ -0,0 +1,96 @@
1
+ /**
2
+ * The test kit of the harness: a scripted model for a test of an agent, a chat
3
+ * turn, or a tool that runs a sub-agent. It is a `ChatProvider` over the mock
4
+ * model of the AI SDK. Each request takes the next entry of the script, and the
5
+ * kit records each request that the model got. `inProcessChatTurns` gives the
6
+ * chat turns of a runtime with no DBOS engine, over the turn in process. An
7
+ * embedder imports it from `@inflexa-ai/harness/testing`.
8
+ */
9
+ import { convertArrayToReadableStream, MockLanguageModelV4 } from "ai/test";
10
+ import { createAiSdkProvider } from "./providers/ai-sdk.js";
11
+ export { inProcessChatTurns } from "./app/in-process-turn.js";
12
+ export function text(value) {
13
+ return { type: "text", text: value };
14
+ }
15
+ export function reasoning(value, signature) {
16
+ return signature === undefined ? { type: "reasoning", text: value } : { type: "reasoning", text: value, signature };
17
+ }
18
+ export function toolCall(toolCallId, toolName, input) {
19
+ return { type: "tool-call", toolCallId, toolName, input };
20
+ }
21
+ export function reply(content, finishReason = "stop", usage) {
22
+ return usage === undefined ? { content, finishReason } : { content, finishReason, usage };
23
+ }
24
+ /** The reply of a round of tool calls. */
25
+ export function callTools(...calls) {
26
+ return { content: calls, finishReason: "tool-calls" };
27
+ }
28
+ function v4Usage(usage) {
29
+ return {
30
+ inputTokens: { total: usage?.inputTokens, noCache: undefined, cacheRead: usage?.cacheReadInputTokens, cacheWrite: usage?.cacheCreationInputTokens },
31
+ outputTokens: { total: usage?.outputTokens, text: undefined, reasoning: usage?.reasoningTokens },
32
+ };
33
+ }
34
+ function contentParts(content) {
35
+ const parts = [];
36
+ for (const [index, part] of content.entries()) {
37
+ const id = `p${index}`;
38
+ switch (part.type) {
39
+ case "text":
40
+ parts.push({ type: "text-start", id }, { type: "text-delta", id, delta: part.text }, { type: "text-end", id });
41
+ break;
42
+ case "reasoning": {
43
+ const providerMetadata = part.signature === undefined ? undefined : { anthropic: { signature: part.signature } };
44
+ parts.push({ type: "reasoning-start", id }, { type: "reasoning-delta", id, delta: part.text }, { type: "reasoning-end", id, providerMetadata });
45
+ break;
46
+ }
47
+ case "tool-call":
48
+ parts.push({ type: "tool-call", toolCallId: part.toolCallId, toolName: part.toolName, input: JSON.stringify(part.input) });
49
+ break;
50
+ }
51
+ }
52
+ return parts;
53
+ }
54
+ function streamOf(entry, index) {
55
+ return [
56
+ { type: "stream-start", warnings: [] },
57
+ { type: "response-metadata", id: entry.responseId ?? `response-${index}`, modelId: entry.modelId ?? "scripted-model", timestamp: new Date(0) },
58
+ ...contentParts(entry.content),
59
+ {
60
+ type: "finish",
61
+ finishReason: { unified: entry.finishReason, raw: entry.rawFinishReason ?? entry.finishReason },
62
+ usage: v4Usage(entry.usage),
63
+ providerMetadata: entry.providerMetadata,
64
+ },
65
+ ];
66
+ }
67
+ /** Build a provider over a scripted model. A request past the end of the script fails the test that made it. */
68
+ export function scriptedModel(script, options = {}) {
69
+ const calls = [];
70
+ const model = new MockLanguageModelV4({
71
+ provider: "scripted",
72
+ modelId: "scripted-model",
73
+ doStream: async (call) => {
74
+ const index = calls.length;
75
+ calls.push(call);
76
+ const step = script[index];
77
+ if (step === undefined)
78
+ throw new Error(`the script has no reply ${index}`);
79
+ const entry = typeof step === "function" ? await step(call) : step;
80
+ if ("fail" in entry)
81
+ throw entry.fail;
82
+ if ("breakAfter" in entry) {
83
+ return {
84
+ stream: convertArrayToReadableStream([
85
+ { type: "stream-start", warnings: [] },
86
+ ...contentParts(entry.breakAfter),
87
+ { type: "error", error: entry.error },
88
+ ]),
89
+ };
90
+ }
91
+ return { stream: convertArrayToReadableStream(streamOf(entry, index)) };
92
+ },
93
+ });
94
+ const provider = createAiSdkProvider({ model, capabilities: options.capabilities, maxRetries: options.maxRetries ?? 0 });
95
+ return { provider, calls };
96
+ }
@@ -1,9 +1,9 @@
1
- import type { Pool } from "pg";
1
+ import type { Querier } from "../state/db.js";
2
2
  import { type AgentSession } from "../auth/types.js";
3
3
  import type { UsageRecorder } from "../billing/usage-recorder.js";
4
4
  import type { ResourcePolicy, ResourceSpec } from "../config/resource-limits.js";
5
5
  import type { Logger } from "../lib/logger.js";
6
- import { type AgentRunUsage } from "../loop/metrics.js";
6
+ import type { AgentRunUsage } from "../loop/metrics.js";
7
7
  import { type ChatProvider } from "../providers/types.js";
8
8
  import type { CheckedPackage } from "./sandbox/list-available-packages.js";
9
9
  export declare const AD_HOC_ROUTER_AGENT_ID = "adhoc-router";
@@ -16,11 +16,11 @@ export declare const AD_HOC_FALLBACK_AGENT_ID = "scientific-executor";
16
16
  * - `absent` — the bound resolution answered that the pool holds no such
17
17
  * package, and it offered no other spelling.
18
18
  */
19
- export interface DroppedPackage {
19
+ export type DroppedPackage = {
20
20
  readonly entry: string;
21
21
  readonly reason: "unparsable" | "absent";
22
- }
23
- export interface AdHocRoute {
22
+ };
23
+ export type AdHocRoute = {
24
24
  readonly agentId: string;
25
25
  readonly resources: ResourceSpec;
26
26
  readonly rationale: string;
@@ -31,11 +31,11 @@ export interface AdHocRoute {
31
31
  /** Every entry that the validation removed, with the reason for the caveat. */
32
32
  readonly droppedPackages: readonly DroppedPackage[];
33
33
  readonly fallbackClass?: "timeout" | "provider_error" | "malformed" | "no_match" | "invalid_agent" | "invalid_resources";
34
- }
35
- export interface AdHocRouterDeps {
34
+ };
35
+ export type AdHocRouterDeps = {
36
36
  readonly provider: ChatProvider;
37
37
  readonly model: string;
38
- readonly pool: Pool;
38
+ readonly pool: Querier;
39
39
  readonly resourcePolicy?: ResourcePolicy;
40
40
  readonly logger?: Logger;
41
41
  /**
@@ -54,7 +54,7 @@ export interface AdHocRouterDeps {
54
54
  readonly resolvePackages?: (names: readonly string[]) => Promise<readonly CheckedPackage[] | null>;
55
55
  /** Falls back to the no-op recorder when omitted. */
56
56
  readonly usageRecorder?: UsageRecorder;
57
- }
57
+ };
58
58
  export declare function defaultAdHocResources(policy?: ResourcePolicy): ResourceSpec;
59
59
  export declare function validAdHocResources(value: unknown, policy?: ResourcePolicy): ResourceSpec | null;
60
60
  export declare function routeAdHocRequest(deps: AdHocRouterDeps, input: {