@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
@@ -1,18 +1,16 @@
1
1
  /**
2
- * Run synthesizer — a single-shot agent loop driven through `runAgent`:
2
+ * Run synthesizer — a single-shot agent loop driven through `runWithSalvage`:
3
3
  *
4
- * - `validate_synthesis` — non-terminal: dry-run schema + semantic validation
5
- * of a candidate in any shape. Never records.
6
- * - `submit_synthesis` — terminal: schema + semantic validation, captures
7
- * the outcome. Re-callable; a later valid submission
8
- * supersedes an earlier outcome (last-valid-wins).
9
- * - `report_blocker` — terminal: the run produced nothing synthesizable.
10
- * Only records when no outcome exists yet, so a
11
- * blocker can never clobber a real synthesis.
12
- * - `literature_reviewer` — research sub-agent exposed as a tool. The tool
13
- * re-uses `createLiteratureReviewerTool`; the
14
- * sub-agent loop's brief is the only context handed
15
- * across the boundary (forSubAgent semantics).
4
+ * - `submit_synthesis` — checks one synthesis against the schema and the
5
+ * semantic checks, and gives back the issues. It
6
+ * does not end the run. The last accepted
7
+ * submission is the synthesis.
8
+ * - `report_blocker` — the run produced nothing synthesizable. An
9
+ * accepted synthesis wins over a blocker.
10
+ * - `literature_reviewer` — research sub-agent exposed as a tool. The
11
+ * runtime registers it one time and gives it here;
12
+ * the sub-agent loop's brief is the only context
13
+ * handed across the boundary (forSubAgent semantics).
16
14
  *
17
15
  * Two deliverables on a happy path: `synthesis.json` written to the run dir
18
16
  * and a `data-run-synthesis` chat data part emitted via the `emit` callback
@@ -28,20 +26,18 @@ import { join } from "node:path";
28
26
  import { ok } from "neverthrow";
29
27
  import { z } from "zod";
30
28
  import { writeFileWithinRoot } from "../lib/fs-helpers.js";
29
+ import { isAllDigits } from "../lib/text.js";
31
30
  import { tryFs } from "../lib/fs-result.js";
32
- import { hintForZodIssue } from "../lib/zod-issues.js";
33
- import { BiologicalThemeSchema, KeyReferenceSchema, RunSynthesisSchema, SynthesizedFindingSchema, } from "../schemas/run-synthesis.js";
31
+ import { safeParseJsonAs } from "../lib/parse-json.js";
32
+ import { RunSynthesisSchema, SynthesisDraftSchema, } from "../schemas/run-synthesis.js";
34
33
  import { synthesisAgentPrompt } from "../prompts/synthesis-agent.js";
35
34
  import { composeSystemPrompt } from "../agents/system-prompt.js";
36
- import { flattenDataPart } from "../contracts/chat-frame.js";
37
35
  import { isSafeId, runDir } from "../workspace/paths.js";
38
- import { decodeObjectString } from "../lib/zod-issues.js";
39
- import { runToTerminal } from "../loop/run-to-terminal.js";
40
- import { passthroughStep } from "../loop/run-step.js";
36
+ import { runWithSalvage } from "../loop/run-loop.js";
37
+ import { recordedInputOf } from "../loop/tool-adapter.js";
41
38
  import { defineTool } from "../tools/define-tool.js";
42
39
  import { createReadToolOutputTool } from "../tools/read-tool-output.js";
43
- import { createReportBlockerToolFor } from "../tools/sandbox/report-blocker.js";
44
- import { createLiteratureReviewerTool } from "../tools/research/literature-reviewer.js";
40
+ import { blockerOf, createReportBlockerToolFor, REPORT_BLOCKER_TOOL_ID } from "../tools/sandbox/report-blocker.js";
45
41
  // ── Agent identity / budgets ────────────────────────────────────────
46
42
  /**
47
43
  * The synthesizer's agent identity — the `source.agentId` on its loop events
@@ -60,35 +56,15 @@ const SYNTHESIZER_MAX_ITERATIONS = 25;
60
56
  * model treats a stated call-count limit as a target to hit, not a maximum.
61
57
  */
62
58
  const LITERATURE_REVIEWER_BUDGET = 3;
59
+ const SubmitSynthesisOutputSchema = z.object({ accepted: z.boolean() });
60
+ const SUBMIT_SYNTHESIS_TOOL_ID = "submit_synthesis";
63
61
  // ── Validation ──────────────────────────────────────────────────────
64
- function zodIssuesToValidationIssues(error, input, rootPath = "synthesis") {
65
- return error.issues.map((i) => ({
66
- path: [rootPath, ...i.path.map((p) => String(p))].join("."),
67
- code: "schema",
68
- message: i.message,
69
- hint: hintForZodIssue(i, input),
70
- }));
71
- }
72
- const PMID_PATTERN = /^\d+$/;
73
62
  // ── Semantic checks ─────────────────────────────────────────────────
74
63
  //
75
- // Each check takes only the fields it reads, never the whole synthesis. That is
76
- // what lets a candidate which failed whole-payload schema validation still be
77
- // checked: whichever fields parsed on their own get their checks run, and only
78
- // the checks whose inputs are genuinely missing are deferred. `semanticCheck`
79
- // composes them for the schema-valid path — it is the one definition of "all
80
- // semantic checks, in report order".
81
- function checkRunId(runId, ctx) {
82
- if (runId === ctx.runId)
83
- return [];
84
- return [
85
- {
86
- path: "synthesis.runId",
87
- code: "semantic",
88
- message: `runId must be "${ctx.runId}"`,
89
- },
90
- ];
91
- }
64
+ // Each check takes only the fields it reads, never the whole synthesis.
65
+ // `semanticCheck` composes them — it is the one definition of "all semantic
66
+ // checks, in report order". The input schema of the tool checks the shape
67
+ // before them.
92
68
  function checkFindingStepIds(findings, ctx) {
93
69
  const issues = [];
94
70
  for (const [i, f] of findings.entries()) {
@@ -138,7 +114,7 @@ function checkFindingPmidFormat(findings) {
138
114
  const issues = [];
139
115
  for (const [fi, f] of findings.entries()) {
140
116
  for (const [ri, r] of f.references.entries()) {
141
- if (!PMID_PATTERN.test(r.pmid)) {
117
+ if (r.pmid.length === 0 || !isAllDigits(r.pmid)) {
142
118
  issues.push({
143
119
  path: `synthesis.findings[${fi}].references[${ri}].pmid`,
144
120
  code: "semantic",
@@ -152,7 +128,7 @@ function checkFindingPmidFormat(findings) {
152
128
  function checkKeyReferencePmidFormat(keyReferences) {
153
129
  const issues = [];
154
130
  for (const [i, r] of keyReferences.entries()) {
155
- if (!PMID_PATTERN.test(r.pmid)) {
131
+ if (r.pmid.length === 0 || !isAllDigits(r.pmid)) {
156
132
  issues.push({
157
133
  path: `synthesis.keyReferences[${i}].pmid`,
158
134
  code: "semantic",
@@ -164,7 +140,6 @@ function checkKeyReferencePmidFormat(keyReferences) {
164
140
  }
165
141
  function semanticCheck(synthesis, ctx) {
166
142
  return [
167
- ...checkRunId(synthesis.runId, ctx),
168
143
  ...checkFindingStepIds(synthesis.findings, ctx),
169
144
  ...checkThemeReferences(synthesis.themes, synthesis.findings),
170
145
  ...checkKeyReferencesCited(synthesis.keyReferences, synthesis.findings),
@@ -172,157 +147,42 @@ function semanticCheck(synthesis, ctx) {
172
147
  ...checkKeyReferencePmidFormat(synthesis.keyReferences),
173
148
  ];
174
149
  }
175
- function salvageInputs(candidate) {
176
- const record = typeof candidate === "object" && candidate !== null ? candidate : {};
177
- const runId = z.string().safeParse(record.runId);
178
- const findings = z.array(SynthesizedFindingSchema).safeParse(record.findings);
179
- const themes = z.array(BiologicalThemeSchema).safeParse(record.themes);
180
- const keyReferences = z.array(KeyReferenceSchema).safeParse(record.keyReferences);
181
- return {
182
- runId: runId.success ? runId.data : undefined,
183
- findings: findings.success ? findings.data : undefined,
184
- themes: themes.success ? themes.data : undefined,
185
- keyReferences: keyReferences.success ? keyReferences.data : undefined,
186
- };
187
- }
188
- /**
189
- * A short issue list must never read as "everything else is fine". When the
190
- * payload failed schema validation and some checks could not run, the deferred
191
- * ones are named back to the model as an issue of their own.
192
- */
193
- function deferredChecksNotice(deferred) {
194
- return {
195
- path: "synthesis",
196
- code: "semantic",
197
- message: `This issue list is INCOMPLETE: ${deferred.length} semantic check(s) could not run because the fields ` +
198
- `they read did not survive schema validation — ${deferred.join("; ")}.`,
199
- hint: "Fix the schema issues above and call validate_synthesis again; the deferred checks will run then and may report further problems.",
200
- };
201
- }
202
- /**
203
- * Semantic checks over a candidate that failed `RunSynthesisSchema`. Every check
204
- * whose own inputs parsed is run; the rest are reported as deferred.
205
- */
206
- function salvagedSemanticCheck(candidate, ctx) {
207
- const { runId, findings, themes, keyReferences } = salvageInputs(candidate);
208
- const issues = [];
209
- const deferred = [];
210
- if (runId !== undefined)
211
- issues.push(...checkRunId(runId, ctx));
212
- else
213
- deferred.push("runId matches the run");
214
- if (findings !== undefined)
215
- issues.push(...checkFindingStepIds(findings, ctx));
216
- else
217
- deferred.push("finding stepIds are present in the input summaries");
218
- if (themes !== undefined && findings !== undefined)
219
- issues.push(...checkThemeReferences(themes, findings));
220
- else
221
- deferred.push("theme references resolve to entries in findings[]");
222
- if (keyReferences !== undefined && findings !== undefined)
223
- issues.push(...checkKeyReferencesCited(keyReferences, findings));
224
- else
225
- deferred.push("keyReferences PMIDs are cited by some finding");
226
- if (findings !== undefined)
227
- issues.push(...checkFindingPmidFormat(findings));
228
- else
229
- deferred.push("finding reference PMIDs are numeric");
230
- if (keyReferences !== undefined)
231
- issues.push(...checkKeyReferencePmidFormat(keyReferences));
232
- else
233
- deferred.push("keyReferences PMIDs are numeric");
234
- if (deferred.length > 0)
235
- issues.push(deferredChecksNotice(deferred));
236
- return issues;
237
- }
238
- /**
239
- * Validate a candidate in one pass. A schema failure no longer hides the
240
- * semantic problems behind it: structure issues come first, then every semantic
241
- * check whose inputs survived, then an explicit note of what was deferred.
242
- */
243
- function fullyValidate(candidate, ctx) {
244
- const parsed = RunSynthesisSchema.safeParse(candidate);
245
- if (!parsed.success) {
246
- return {
247
- valid: false,
248
- issues: [...zodIssuesToValidationIssues(parsed.error, candidate), ...salvagedSemanticCheck(candidate, ctx)],
249
- };
250
- }
251
- const semanticIssues = semanticCheck(parsed.data, ctx);
252
- if (semanticIssues.length > 0) {
253
- return { valid: false, issues: semanticIssues };
254
- }
255
- return { valid: true, synthesis: parsed.data };
256
- }
257
150
  // ── Inner tools ─────────────────────────────────────────────────────
258
- function buildValidateTool(ctx) {
151
+ function buildSubmitTool(ctx) {
259
152
  return defineTool({
260
- id: "validate_synthesis",
261
- description: "Dry-run a candidate synthesis and get back everything that is wrong " +
262
- "with it. Takes the synthesis in ANY shape: a malformed, partial, or " +
263
- "wrong-typed candidate is REPORTED, not rejected. Returns " +
264
- "{valid, issues[]} covering both schema problems (missing / " +
265
- "wrong-typed fields) and the semantic checks a schema cannot express " +
266
- "(unknown stepId refs, theme→finding refs, keyReferences PMIDs not " +
267
- "cited by any finding, non-numeric PMIDs) in a SINGLE pass — a " +
268
- "schema problem does not hide the semantic problems behind it. If a " +
269
- "field is too malformed for a semantic check to read, that check is " +
270
- "reported as deferred rather than silently skipped. The authoritative " +
271
- "field-by-field synthesis schema is the arg schema of " +
272
- "submit_synthesis — this tool deliberately does not restate it. " +
273
- "Non-terminal: call as often as needed to iterate toward a clean " +
274
- "synthesis, then submit_synthesis. A candidate that arrives as a " +
275
- "JSON-encoded string is decoded before the checks run, so the " +
276
- "result describes the synthesis inside the string.",
277
- // Deliberately permissive: a structurally-invalid candidate must reach
278
- // `execute` so the model gets a structured {valid:false, issues} result —
279
- // including semantic issues — instead of a bare Zod rejection at the loop's
280
- // input boundary. `execute` re-parses against RunSynthesisSchema itself.
281
- // The permissive schema also means the loop's string repair never runs
282
- // here, so `execute` decodes a JSON-encoded string itself.
283
- inputSchema: z.object({
284
- synthesis: z.unknown().describe("The candidate synthesis, in any shape. Field-by-field schema: see submit_synthesis."),
285
- }),
153
+ id: SUBMIT_SYNTHESIS_TOOL_ID,
154
+ description: "Submit the synthesis. Checks the payload against the semantic checks " +
155
+ "the arg schema cannot express (stepId refs, theme→finding refs, " +
156
+ "keyReferences PMIDs cited, numeric PMIDs). On success returns " +
157
+ "{accepted: true} — STOP after this. On rejection returns " +
158
+ "{accepted: false, issues} — fix the specific fields at each issue " +
159
+ "path and call again, or switch to report_blocker if the synthesis " +
160
+ "cannot be made valid. The last accepted submission is the synthesis.",
161
+ inputSchema: z.object({ synthesis: SynthesisDraftSchema }),
286
162
  describeCall: "none",
287
- execute: async (input) => {
288
- const result = fullyValidate(decodeObjectString(input.synthesis), ctx);
289
- return ok(result.valid ? { valid: true, issues: [] } : { valid: false, issues: result.issues });
163
+ execute: (input) => {
164
+ const issues = semanticCheck(input.synthesis, ctx);
165
+ return Promise.resolve(ok(issues.length > 0 ? { accepted: false, issues } : { accepted: true }));
290
166
  },
291
167
  });
292
168
  }
293
- function buildSubmitTool(holder, ctx) {
294
- return defineTool({
295
- id: "submit_synthesis",
296
- description: "Submit the final synthesis. Re-validates the payload against the " +
297
- "semantic checks the arg schema cannot express (stepId refs, " +
298
- "theme→finding refs, keyReferences PMIDs cited, numeric PMIDs). On " +
299
- "success returns {accepted: true} — STOP after this. On rejection " +
300
- "returns {accepted: false, issues} — fix the specific fields at each " +
301
- "issue path and call again, or switch to report_blocker if the " +
302
- "synthesis cannot be made valid. A rejected submission leaves any " +
303
- "already-accepted synthesis untouched; a later accepted submission " +
304
- "supersedes an earlier one.",
305
- inputSchema: z.object({ synthesis: RunSynthesisSchema }),
306
- describeCall: "none",
307
- execute: async (input) => {
308
- const result = fullyValidate(input.synthesis, ctx);
309
- if (!result.valid) {
310
- // A rejection is not terminal — submission is last-valid-wins, so this
311
- // leaves any already-recorded outcome intact and the model may fix the
312
- // cited paths and submit again.
313
- return ok({ accepted: false, issues: result.issues });
314
- }
315
- holder.outcome = { kind: "submitted", synthesis: result.synthesis };
316
- return ok({ accepted: true });
317
- },
318
- });
169
+ /** The last accepted synthesis of a run, from the inputs of the calls of `submit_synthesis` that it accepted. */
170
+ export function acceptedSynthesisOf(steps) {
171
+ let accepted;
172
+ for (const step of steps) {
173
+ for (const call of step.calls) {
174
+ if (call.toolName !== SUBMIT_SYNTHESIS_TOOL_ID || call.output?.outcome !== "ok")
175
+ continue;
176
+ const outcome = SubmitSynthesisOutputSchema.safeParse(call.output.value);
177
+ const input = recordedInputOf(z.object({ synthesis: SynthesisDraftSchema }), call.input);
178
+ if (outcome.success && outcome.data.accepted && input !== undefined)
179
+ accepted = input.synthesis;
180
+ }
181
+ }
182
+ return accepted;
319
183
  }
320
- function buildBlockerTool(holder) {
184
+ function buildBlockerTool() {
321
185
  return createReportBlockerToolFor({
322
- record: (outcome) => {
323
- if (holder.outcome === null)
324
- holder.outcome = outcome;
325
- },
326
186
  blockedWhen: "Ends run synthesis with no synthesis written. Use it ONLY when the " +
327
187
  "run produced no synthesizable content — every step summary is empty, " +
328
188
  "or the summaries are contradictory to the point of incoherence. A run " +
@@ -333,46 +193,28 @@ function buildBlockerTool(holder) {
333
193
  }
334
194
  /**
335
195
  * Test-only — expose the inner-tool factory so unit tests can assert on
336
- * validation + outcome capture without driving the whole agent loop.
196
+ * the checks without driving the whole agent loop.
337
197
  */
338
198
  export function __buildInnerToolsForTest(args) {
339
- const holder = { outcome: null };
340
- const ctx = {
341
- knownStepIds: args.knownStepIds,
342
- runId: args.runId,
343
- };
344
- return {
345
- validate: buildValidateTool(ctx),
346
- submit: buildSubmitTool(holder, ctx),
347
- blocker: buildBlockerTool(holder),
348
- holder,
349
- };
199
+ const ctx = { knownStepIds: args.knownStepIds };
200
+ return { submit: buildSubmitTool(ctx), blocker: buildBlockerTool() };
350
201
  }
351
202
  /**
352
- * Drive the synthesizer agent loop to a terminal outcome — either a
353
- * validated synthesis (`submit_synthesis`) or a blocker (`report_blocker`).
354
- * Throws when neither terminal is reached (loop cap or external abort).
203
+ * Drive the synthesizer agent loop to an outcome — the last accepted
204
+ * synthesis (`submit_synthesis`), else a blocker (`report_blocker`).
205
+ * Throws when the run and its salvage end with neither (loop cap or external abort).
355
206
  */
356
207
  export async function generateRunSynthesis(input) {
357
208
  if (input.summaries.length === 0) {
358
209
  throw new Error("Run synthesis: no step summaries to synthesize");
359
210
  }
360
211
  const knownStepIds = new Set(input.summaries.map((s) => s.stepId));
361
- const holder = { outcome: null };
362
- const innerCtx = { knownStepIds, runId: input.runId };
363
- const reviewer = createLiteratureReviewerTool({
364
- provider: input.provider,
365
- model: input.model,
366
- bioKeys: input.bioKeys,
367
- citationResolver: input.citationResolver,
368
- usageRecorder: input.usageRecorder,
369
- ...(input.toolOutputStore ? { toolOutputStore: input.toolOutputStore } : {}),
370
- });
371
- const validateTool = buildValidateTool(innerCtx);
372
- const submitTool = buildSubmitTool(holder, innerCtx);
373
- const blockerTool = buildBlockerTool(holder);
212
+ const innerCtx = { knownStepIds };
213
+ const reviewer = input.literatureReviewer;
214
+ const submitTool = buildSubmitTool(innerCtx);
215
+ const blockerTool = buildBlockerTool();
374
216
  const readTools = input.toolOutputStore ? [createReadToolOutputTool(input.toolOutputStore)] : [];
375
- const tools = [validateTool, submitTool, blockerTool, reviewer, ...readTools];
217
+ const tools = [submitTool, blockerTool, reviewer, ...readTools];
376
218
  const agent = {
377
219
  id: SYNTHESIS_AGENT_ID,
378
220
  systemPrompt: composeSystemPrompt(synthesisAgentPrompt),
@@ -380,31 +222,32 @@ export async function generateRunSynthesis(input) {
380
222
  tools,
381
223
  maxIterations: SYNTHESIZER_MAX_ITERATIONS,
382
224
  };
383
- const prompt = buildSynthesizerPrompt(input.planNarrative, input.summaries, input.runId);
225
+ const prompt = buildSynthesizerPrompt(input.planNarrative, input.summaries);
384
226
  const signal = input.signal ?? new AbortController().signal;
385
227
  const emit = input.emit ?? (() => { });
386
- const loopDeps = {
228
+ const run = await runWithSalvage(agent, [{ role: "user", content: prompt }], input.session, {
387
229
  provider: input.provider,
388
230
  signal,
389
231
  emit,
390
- runStep: passthroughStep,
391
- resolved: () => holder.outcome !== null,
392
232
  usageRecorder: input.usageRecorder,
393
233
  toolOutputStore: input.toolOutputStore,
394
- toolBudget: { [reviewer.id]: LITERATURE_REVIEWER_BUDGET },
395
- };
396
- await runToTerminal(agent, [{ role: "user", content: prompt }], input.session, loopDeps, {
397
- tools: [submitTool, blockerTool],
398
- nudge: "You ended without calling a terminal tool. You MUST call " +
234
+ policy: { budget: { [reviewer.id]: LITERATURE_REVIEWER_BUDGET } },
235
+ pause: input.pause,
236
+ }, {
237
+ tools: [SUBMIT_SYNTHESIS_TOOL_ID, REPORT_BLOCKER_TOOL_ID],
238
+ nudge: "You ended without an accepted synthesis. You MUST call " +
399
239
  "submit_synthesis with the final synthesis now, or report_blocker " +
400
240
  "if the run produced nothing synthesizable. Do not reply with prose.",
241
+ hasOutcome: (steps) => acceptedSynthesisOf(steps) !== undefined || blockerOf(steps) !== null,
401
242
  });
402
- const outcome = holder.outcome;
403
- if (outcome?.kind === "submitted") {
404
- return { kind: "synthesis", synthesis: outcome.synthesis };
243
+ const accepted = acceptedSynthesisOf(run.steps);
244
+ if (accepted !== undefined) {
245
+ // The model never types the run id: the host stamps the id of its own run.
246
+ return { kind: "synthesis", synthesis: { runId: input.runId, ...accepted } };
405
247
  }
406
- if (outcome?.kind === "blocker") {
407
- return { kind: "skipped", reason: outcome.reason };
248
+ const blocker = blockerOf(run.steps);
249
+ if (blocker !== null) {
250
+ return { kind: "skipped", reason: blocker.reason };
408
251
  }
409
252
  if (signal.aborted) {
410
253
  throw new Error("Run synthesis was cancelled.");
@@ -503,20 +346,17 @@ export async function readRunSynthesis(args) {
503
346
  if (text === undefined) {
504
347
  return null;
505
348
  }
506
- let json;
349
+ let parsed;
507
350
  try {
508
- json = JSON.parse(text);
351
+ parsed = safeParseJsonAs(text, RunSynthesisSchema);
509
352
  }
510
353
  catch {
511
354
  return null;
512
355
  }
513
- const parsed = RunSynthesisSchema.safeParse(json);
514
356
  if (!parsed.success) {
515
357
  return null;
516
358
  }
517
- // The payload comes from a validated `RunSynthesis`, and the builder sets each field of the part contract.
518
- // The tests parse the result with `RunSynthesisPartSchema`.
519
- return flattenDataPart(buildRunSynthesisPart(args.runId, parsed.data));
359
+ return { type: "data-run-synthesis", ...runSynthesisPartFields(args.runId, parsed.data) };
520
360
  }
521
361
  // ── Embedding text ──────────────────────────────────────────────────
522
362
  export function formatSynthesisEmbeddingText(synthesis) {
@@ -545,9 +385,9 @@ export function formatSynthesisEmbeddingText(synthesis) {
545
385
  ].join("\n");
546
386
  }
547
387
  // ── Prompt builder ──────────────────────────────────────────────────
548
- function buildSynthesizerPrompt(planNarrative, summaries, runId) {
388
+ function buildSynthesizerPrompt(planNarrative, summaries) {
549
389
  const summaryBlock = summaries.map((s) => `### ${s.stepId} (${s.agentId})\n\n${s.markdown}`).join("\n\n---\n\n");
550
- return [`runId: "${runId}"`, "", "## Analytical Narrative", planNarrative, "", "## Step Summaries", summaryBlock].join("\n");
390
+ return ["## Analytical Narrative", planNarrative, "", "## Step Summaries", summaryBlock].join("\n");
551
391
  }
552
392
  // ── Chat data part builders ─────────────────────────────────────────
553
393
  /**
@@ -556,17 +396,18 @@ function buildSynthesizerPrompt(planNarrative, summaries, runId) {
556
396
  * `RunSynthesisPart` interface — keep them in lockstep.
557
397
  */
558
398
  export function buildRunSynthesisPart(runId, synthesis) {
399
+ return { type: "data-run-synthesis", data: runSynthesisPartFields(runId, synthesis) };
400
+ }
401
+ /** The flat fields of the `data-run-synthesis` part, shared by the stream part and the stored-record read. */
402
+ function runSynthesisPartFields(runId, synthesis) {
559
403
  return {
560
- type: "data-run-synthesis",
561
- data: {
562
- id: `synthesis-${runId}`,
563
- runId,
564
- overview: synthesis.overview,
565
- conclusions: synthesis.conclusions,
566
- findings: synthesis.findings,
567
- themes: synthesis.themes,
568
- limitations: synthesis.limitations,
569
- keyReferences: synthesis.keyReferences,
570
- },
404
+ id: `synthesis-${runId}`,
405
+ runId,
406
+ overview: synthesis.overview,
407
+ conclusions: synthesis.conclusions,
408
+ findings: synthesis.findings,
409
+ themes: synthesis.themes,
410
+ limitations: synthesis.limitations,
411
+ keyReferences: synthesis.keyReferences,
571
412
  };
572
413
  }
@@ -18,7 +18,7 @@
18
18
  * service derives from its object-store index and the CLI synthesizes from the
19
19
  * local path — the harness treats them as opaque labels.
20
20
  */
21
- export interface StagedInput {
21
+ export type StagedInput = {
22
22
  readonly fileId: string;
23
23
  readonly mountName: string;
24
24
  readonly key: string;
@@ -38,4 +38,4 @@ export interface StagedInput {
38
38
  readonly mtimeMs: number;
39
39
  /** Path relative to the data dir, e.g. "inputs/{mountName}/{key}". */
40
40
  readonly relativePath: string;
41
- }
41
+ };
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Per-step interpretive summary. Continues the step agent's conversation
3
- * (`continueAgent`) so the request reuses the cached prefix and keeps
3
+ * (`continueLoop`) so the request reuses the cached prefix and keeps
4
4
  * signed thinking blocks valid.
5
5
  *
6
6
  * Contract:
@@ -9,7 +9,7 @@
9
9
  * summary as its final assistant text.
10
10
  * - Returns `{ stepId, agentId, markdown }` on non-empty final text;
11
11
  * `undefined` on empty text, on a throw, or when the request cap is hit
12
- * before a final answer (a continuation runs no wrap-up). Non-fatal.
12
+ * before a final answer. Non-fatal.
13
13
  * - `Session` is taken explicitly (see the harness-durable-runtime spec).
14
14
  *
15
15
  * Honest empty: with no output artifacts the request directs the model to
@@ -24,11 +24,11 @@
24
24
  import type { AgentSession } from "../auth/types.js";
25
25
  import { type ToolOutputStore } from "../loop/tool-output.js";
26
26
  import type { AgentDefinition, LoopMessage } from "../loop/types.js";
27
- import type { AgentChat } from "../providers/types.js";
27
+ import type { ChatProvider } from "../providers/types.js";
28
28
  import { type StepSummary } from "../schemas/step-summary.js";
29
29
  import type { Logger } from "../lib/logger.js";
30
30
  import type { UsageRecorder } from "../billing/usage-recorder.js";
31
- export interface GenerateStepSummaryOptions {
31
+ export type GenerateStepSummaryOptions = {
32
32
  /** Operational logging seam; omitted falls back to no-op. */
33
33
  readonly logger?: Logger;
34
34
  /** LLM usage-accounting seam for the continuation; omitted falls back to the no-op recorder. */
@@ -36,7 +36,7 @@ export interface GenerateStepSummaryOptions {
36
36
  /** The store of the task, thus the loop of the continuation keeps its texts where the read tool of the agent reads them. */
37
37
  readonly toolOutputStore?: ToolOutputStore;
38
38
  /** The provider of the task, thus each request extends the prefix that the task cached. */
39
- readonly provider: AgentChat;
39
+ readonly provider: ChatProvider;
40
40
  readonly session: AgentSession;
41
41
  /** The step agent: the continuation sends its system prompt and its declared tools. */
42
42
  readonly agent: AgentDefinition;
@@ -47,6 +47,6 @@ export interface GenerateStepSummaryOptions {
47
47
  readonly agentId: string;
48
48
  readonly runId: string;
49
49
  readonly signal?: AbortSignal;
50
- }
50
+ };
51
51
  /** Returns `undefined` on non-fatal failure instead of throwing. */
52
52
  export declare function generateStepSummary(opts: GenerateStepSummaryOptions): Promise<StepSummary | undefined>;
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Per-step interpretive summary. Continues the step agent's conversation
3
- * (`continueAgent`) so the request reuses the cached prefix and keeps
3
+ * (`continueLoop`) so the request reuses the cached prefix and keeps
4
4
  * signed thinking blocks valid.
5
5
  *
6
6
  * Contract:
@@ -9,7 +9,7 @@
9
9
  * summary as its final assistant text.
10
10
  * - Returns `{ stepId, agentId, markdown }` on non-empty final text;
11
11
  * `undefined` on empty text, on a throw, or when the request cap is hit
12
- * before a final answer (a continuation runs no wrap-up). Non-fatal.
12
+ * before a final answer. Non-fatal.
13
13
  * - `Session` is taken explicitly (see the harness-durable-runtime spec).
14
14
  *
15
15
  * Honest empty: with no output artifacts the request directs the model to
@@ -21,9 +21,7 @@
21
21
  * step time the workflow body already holds the array — pass it in. The task
22
22
  * always closes its unanswered calls, so the transcript needs no repair.
23
23
  */
24
- import { continueAgent } from "../loop/continue-agent.js";
25
- import { finalText } from "../loop/run-agent.js";
26
- import { passthroughStep } from "../loop/run-step.js";
24
+ import { continueLoop, finalText } from "../loop/run-loop.js";
27
25
  import { READ_TOOL_OUTPUT_TOOL_ID } from "../loop/tool-output.js";
28
26
  import { stepSummaryPrompt } from "../prompts/execute-analysis/step-summary.js";
29
27
  import { StepSummarySchema } from "../schemas/step-summary.js";
@@ -49,17 +47,15 @@ export async function generateStepSummary(opts) {
49
47
  const logger = (opts.logger ?? createNoopLogger()).named("step-summary").with({ runId: opts.runId, stepId: opts.stepId, agentId: opts.agentId });
50
48
  let result;
51
49
  try {
52
- result = await continueAgent(opts.agent, opts.conversation, {
50
+ result = await continueLoop(opts.agent, opts.conversation, {
53
51
  text: summaryRequest(opts.artifactPaths),
54
52
  mask: { allow: SUMMARY_TOOLS },
55
53
  maxRequests: SUMMARY_MAX_REQUESTS,
56
- stepNamespace: "step-summary",
57
54
  accountingAgentId: SUMMARY_AGENT_ID,
58
55
  }, opts.session, {
59
56
  provider: opts.provider,
60
57
  signal: opts.signal ?? new AbortController().signal,
61
58
  emit: () => { },
62
- runStep: passthroughStep,
63
59
  usageRecorder: opts.usageRecorder,
64
60
  toolOutputStore: opts.toolOutputStore,
65
61
  });
@@ -4,6 +4,7 @@
4
4
  * Uses Kahn's algorithm to group steps into waves where steps within
5
5
  * a wave have no inter-dependencies and can run in parallel.
6
6
  */
7
+ import { presentGet } from "../lib/present.js";
7
8
  // ── Errors ─────────────────────────────────────────────────────────
8
9
  /** Thrown when the plan DAG contains a dependency cycle. */
9
10
  export class CycleError extends Error {
@@ -64,7 +65,7 @@ export function topoSortIntoWaves(steps) {
64
65
  for (const step of steps) {
65
66
  for (const dep of step.depends_on) {
66
67
  inDegree.set(step.id, (inDegree.get(step.id) ?? 0) + 1);
67
- dependents.get(dep).push(step.id);
68
+ presentGet(dependents, dep, "the dependents list of the dependency").push(step.id);
68
69
  }
69
70
  }
70
71
  // Process wave by wave: each wave consists of all nodes with in-degree 0
@@ -74,13 +75,13 @@ export function topoSortIntoWaves(steps) {
74
75
  let frontier = steps.filter((s) => inDegree.get(s.id) === 0).map((s) => s.id);
75
76
  while (frontier.length > 0) {
76
77
  // Current frontier forms a wave
77
- const wave = frontier.map((id) => stepById.get(id));
78
+ const wave = frontier.map((id) => presentGet(stepById, id, "the step of the frontier id"));
78
79
  waves.push(wave);
79
80
  remaining -= frontier.length;
80
81
  // Compute next frontier
81
82
  const nextFrontier = [];
82
83
  for (const id of frontier) {
83
- for (const dep of dependents.get(id)) {
84
+ for (const dep of presentGet(dependents, id, "the dependents list of the wave id")) {
84
85
  const newDeg = (inDegree.get(dep) ?? 1) - 1;
85
86
  inDegree.set(dep, newDeg);
86
87
  if (newDeg === 0) {
@@ -23,7 +23,7 @@
23
23
  */
24
24
  import type { ResultAsync } from "neverthrow";
25
25
  import type { DbError } from "../lib/db-result.js";
26
- export interface WorkflowPurger {
26
+ export type WorkflowPurger = {
27
27
  /** Workflow ids in a given id namespace (e.g. `dataprofile:{analysisId}:`). Empty when the ledger has no schema yet. */
28
28
  findByIdPrefix(prefix: string): ResultAsync<string[], DbError>;
29
29
  /** Cancel the given workflows so no executor keeps writing behind a purge. Unknown ids are ignored. */
@@ -35,4 +35,4 @@ export interface WorkflowPurger {
35
35
  * reports no count of its own.
36
36
  */
37
37
  deleteWorkflows(workflowIds: readonly string[], includeDescendants?: boolean): ResultAsync<number, DbError>;
38
- }
38
+ };