@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
@@ -8,8 +8,10 @@ const MAX_FAULT_TEXT = 300;
8
8
  /** The most distinct entries of one list. */
9
9
  const MAX_FAULT_ENTRIES = 20;
10
10
  /** A data URI. A fault text quotes a URI in quotes or parentheses, thus those characters end the data. */
11
+ // oxlint-disable-next-line eslint-js/no-restricted-syntax -- the data-URI grammar of an inlined fault (media type, parameters, payload) with the quote and bracket characters that end it.
11
12
  const DATA_URI = /data:([a-z0-9.+-]+\/[a-z0-9.+-]+)?((?:;[^,;\s'"()<>]*)*),([^\s'"()<>]*)/gi;
12
13
  /** A base64 run of 100 characters or more. A content hash in hex is 64 characters, thus a hash stays. */
14
+ // oxlint-disable-next-line eslint-js/no-restricted-syntax -- the base64 charset run with its padding; the length floor keeps a 64-character hex hash outside the match.
13
15
  const BASE64_RUN = /[A-Za-z0-9+/]{100,}={0,2}/g;
14
16
  /** Shorten one fault text: the inline data becomes placeholders, and the text stops at the cap. */
15
17
  export function shortenFaultText(text) {
@@ -43,6 +45,6 @@ export function digestPageFaults(consoleErrors, failedRequests) {
43
45
  return {
44
46
  consoleErrors: errors.slice(0, MAX_FAULT_ENTRIES),
45
47
  failedRequests: requests.slice(0, MAX_FAULT_ENTRIES),
46
- ...(omittedErrors + omittedRequests > 0 ? { omittedFaults: { consoleErrors: omittedErrors, failedRequests: omittedRequests } } : {}),
48
+ omittedFaults: omittedErrors + omittedRequests > 0 ? { consoleErrors: omittedErrors, failedRequests: omittedRequests } : undefined,
47
49
  };
48
50
  }
@@ -39,7 +39,7 @@
39
39
  */
40
40
  import { z } from "zod";
41
41
  import { type ResolveWorkspaceRoot } from "../../workspace/paths.js";
42
- import type { AuthContext } from "../../auth/types.js";
42
+ import type { AuthContext, Identity } from "../../auth/types.js";
43
43
  import { type Logger } from "../../lib/logger.js";
44
44
  import type { ThreadStore } from "../../memory/thread-store.js";
45
45
  import { type ReportWarning } from "../../report-model/block-walk.js";
@@ -134,10 +134,11 @@ export type ResolvePageAsset = (specifier: string) => string;
134
134
  * lands, and attaches the URL beside the path. A refused mint rides the `rendered` arm as data, and it
135
135
  * never fails the render.
136
136
  */
137
- export interface PreviewReportToolDeps {
137
+ export type PreviewReportToolDeps = {
138
138
  readonly gateway: ReportSessionStateGateway;
139
139
  readonly makeResolver?: (scope: {
140
140
  analysisId: string;
141
+ identity: Identity;
141
142
  auth: AuthContext;
142
143
  }) => Promise<ReferenceResolver>;
143
144
  readonly resolveWorkspaceRoot: ResolveWorkspaceRoot;
@@ -152,7 +153,7 @@ export interface PreviewReportToolDeps {
152
153
  /** Names the report thread after the rendered document. Omitted, the thread keeps its title. */
153
154
  readonly threads?: Pick<ThreadStore, "setAutoTitle">;
154
155
  readonly logger?: Logger;
155
- }
156
+ };
156
157
  /**
157
158
  * Make the render-and-preview tool over the session-state gateway and the render seams.
158
159
  *
@@ -38,7 +38,6 @@
38
38
  * control-flow exception propagate.
39
39
  */
40
40
  import { err, ok } from "neverthrow";
41
- import { randomUUID } from "node:crypto";
42
41
  import { copyFile, mkdir, readdir, rm, writeFile } from "node:fs/promises";
43
42
  import { extname, join } from "node:path";
44
43
  import { relative as relativePosix } from "node:path/posix";
@@ -70,9 +69,26 @@ const previewReportInput = z.object({});
70
69
  * collide on the staged name.
71
70
  */
72
71
  function assetFileName(file) {
73
- const slug = file.hash.replace(/[^a-z0-9]+/gi, "-");
72
+ const slug = dashUnsafeRuns(file.hash);
74
73
  return slug + extname(file.path);
75
74
  }
75
+ /** Each run of characters outside the letters and digits becomes one dash. */
76
+ function dashUnsafeRuns(text) {
77
+ let out = "";
78
+ let inRun = false;
79
+ for (const char of text) {
80
+ const isNameChar = (char >= "a" && char <= "z") || (char >= "A" && char <= "Z") || (char >= "0" && char <= "9");
81
+ if (isNameChar) {
82
+ out += char;
83
+ inRun = false;
84
+ }
85
+ else if (!inRun) {
86
+ out += "-";
87
+ inRun = true;
88
+ }
89
+ }
90
+ return out;
91
+ }
76
92
  /** The relative source of a staged figure. The page directory is self-contained, thus the source is `assets/<name>`. */
77
93
  function figureSourcePolicy(file) {
78
94
  return `assets/${assetFileName(file)}`;
@@ -360,7 +376,6 @@ export function createPreviewReportTool(deps) {
360
376
  "The render marks the page that examine_page looks at next. " +
361
377
  "Use it to see the report, and to confirm that each reference resolves.",
362
378
  inputSchema: previewReportInput,
363
- executionMode: "inline",
364
379
  describeCall: "none",
365
380
  // The page path is the one fact of a preview that a watcher wants, and it exists only in the
366
381
  // result. Each other arm is a degraded condition whose kind already names it, thus the kind
@@ -387,7 +402,7 @@ export function createPreviewReportTool(deps) {
387
402
  // control-flow exception propagates and the unresolvable root does not.
388
403
  let resolver;
389
404
  try {
390
- resolver = await deps.makeResolver({ analysisId, auth: ctx.session.auth });
405
+ resolver = await deps.makeResolver({ analysisId, identity: ctx.session.identity, auth: ctx.session.auth });
391
406
  }
392
407
  catch (cause) {
393
408
  logger.warn("the workspace root did not resolve", { threadId, analysisId, ...defaultErrorFields(cause) });
@@ -464,16 +479,20 @@ export function createPreviewReportTool(deps) {
464
479
  }
465
480
  }
466
481
  // The part rides the rendered arm only. Each degraded arm shows no
467
- // fresh page, thus it emits nothing.
482
+ // fresh page, thus it emits nothing. The part id is the id of the call,
483
+ // thus a rerun of the call gives the same part again.
468
484
  await ctx.emit({
469
485
  type: "data-report-rendered",
470
- data: { id: randomUUID(), renderedAt: new Date().toISOString(), title: document.title },
486
+ data: { id: ctx.invocationId, renderedAt: new Date().toISOString(), title: document.title },
471
487
  });
472
488
  // The event rides the rendered arm alone, the same as the part above. The hash is the hash of
473
489
  // the draft that the page shows, thus a consumer ties the page to the document that made it.
474
490
  observe({ type: "preview", analysisId, threadId, pagePath: written.value, documentHash: renderedHash });
475
491
  const access = await mintAccess(deps.makeSessionPages, analysisId, threadId, ctx.session.auth, logger);
476
- return ok({ outcome: "rendered", pagePath: written.value, ...(access !== undefined ? { access } : {}), warnings: finished.warnings });
492
+ const renderedOk = { outcome: "rendered", pagePath: written.value, warnings: finished.warnings };
493
+ if (access !== undefined)
494
+ return ok({ ...renderedOk, access });
495
+ return ok(renderedOk);
477
496
  },
478
497
  });
479
498
  }
@@ -21,7 +21,9 @@
21
21
  * the thread row. A record on a thread that holds a version replaces that version whole, under the same
22
22
  * version id. Thus the loop is unbounded: the agent amends, looks again, and records again, and the stored
23
23
  * version equals the page that the last look accepted. A refused record leaves the stored version as it was.
24
- * The outcome of a pass carries the version id, and it names a replacement.
24
+ * The outcome of a pass carries the version id, and it names a replacement. Inside a durable step, the id
25
+ * of a new version is the UUIDv5 of the key of the step. Thus a rerun of the step gives the same version, and
26
+ * it does not read as a replacement.
25
27
  *
26
28
  * The prune runs after the version lands. It removes the output file of each derivation that the recorded
27
29
  * document does not reference, under the `derived/` directory of the session alone. The records stay
@@ -29,7 +31,7 @@
29
31
  * changes no outcome.
30
32
  */
31
33
  import { z } from "zod";
32
- import type { AuthContext } from "../../auth/types.js";
34
+ import type { AuthContext, Identity } from "../../auth/types.js";
33
35
  import type { Logger } from "../../lib/logger.js";
34
36
  import type { ThreadStore } from "../../memory/thread-store.js";
35
37
  import { type ReportWarning } from "../../report-model/block-walk.js";
@@ -97,19 +99,22 @@ export type RecordVersionResult = {
97
99
  * derived directory of the session under that root, thus the seam is mandatory: a composition that bound
98
100
  * none would record a version and leave every unused derivation on disk.
99
101
  */
100
- export interface RecordVersionToolDeps {
102
+ export type RecordVersionToolDeps = {
101
103
  readonly gateway: ReportSessionStateGateway;
102
104
  readonly store: ReportVersionStore;
103
105
  readonly threads: Pick<ThreadStore, "getThread">;
104
106
  readonly resolveWorkspaceRoot: ResolveWorkspaceRoot;
105
107
  readonly makeResolver?: (scope: {
106
108
  analysisId: string;
109
+ identity: Identity;
107
110
  auth: AuthContext;
108
111
  }) => Promise<ReferenceResolver>;
109
112
  /** The provenance seam; an unbound session emit emits nothing and the record runs the same. */
110
113
  readonly provenance?: ProvenanceSeam;
111
114
  readonly logger?: Logger;
112
- }
115
+ /** The key of the durable step that runs the call, `undefined` outside one. Defaults to {@link durableStepKey}. */
116
+ readonly stepKey?: () => string | undefined;
117
+ };
113
118
  /**
114
119
  * Make the record tool over the session-state gateway, the version store, the thread store, and the
115
120
  * resolver.
@@ -21,7 +21,9 @@
21
21
  * the thread row. A record on a thread that holds a version replaces that version whole, under the same
22
22
  * version id. Thus the loop is unbounded: the agent amends, looks again, and records again, and the stored
23
23
  * version equals the page that the last look accepted. A refused record leaves the stored version as it was.
24
- * The outcome of a pass carries the version id, and it names a replacement.
24
+ * The outcome of a pass carries the version id, and it names a replacement. Inside a durable step, the id
25
+ * of a new version is the UUIDv5 of the key of the step. Thus a rerun of the step gives the same version, and
26
+ * it does not read as a replacement.
25
27
  *
26
28
  * The prune runs after the version lands. It removes the output file of each derivation that the recorded
27
29
  * document does not reference, under the `derived/` directory of the session alone. The records stay
@@ -41,6 +43,7 @@ import { computeDraftHash } from "../../report-model/draft-hash.js";
41
43
  import { validateReport } from "../../report-model/validate.js";
42
44
  import { reportSessionDerivedDir, resolveWorkspacePath } from "../../workspace/paths.js";
43
45
  import { defineTool } from "../define-tool.js";
46
+ import { durableStepKey, stepUuid } from "../workspace/edit-file.js";
44
47
  import { openReportThread } from "../report-authoring/authoring-tools.js";
45
48
  import { bindSessionEmit } from "../../provenance/seam.js";
46
49
  /** The empty input. The tool records the current draft of the thread, thus it needs no field. */
@@ -124,6 +127,7 @@ async function pruneUnusedDerivations(args) {
124
127
  export function createRecordVersionTool(deps) {
125
128
  const logger = (deps.logger ?? createNoopLogger()).named("record-report-version");
126
129
  const observe = bindSessionEmit(deps.provenance, logger);
130
+ const stepKey = deps.stepKey ?? durableStepKey;
127
131
  return defineTool({
128
132
  id: "record_report_version",
129
133
  description: "Record the current draft as one report version. The tool runs the whole gate first: it finishes the draft, " +
@@ -134,7 +138,6 @@ export function createRecordVersionTool(deps) {
134
138
  "A thread holds one version, thus a later record replaces it whole. Amend the draft, look at the page again, and record again. " +
135
139
  "After the version lands, the tool removes the file of each derived table that no block of the recorded report binds.",
136
140
  inputSchema: recordVersionInput,
137
- executionMode: "inline",
138
141
  describeCall: "none",
139
142
  // The version id is the one durable product of the first record, thus the created arm names it. A
140
143
  // later record writes over that same id, thus the line names the update and never reads as a
@@ -174,7 +177,7 @@ export function createRecordVersionTool(deps) {
174
177
  // control-flow exception propagates and the unresolvable root does not.
175
178
  let resolver;
176
179
  try {
177
- resolver = await deps.makeResolver({ analysisId, auth: ctx.session.auth });
180
+ resolver = await deps.makeResolver({ analysisId, identity: ctx.session.identity, auth: ctx.session.auth });
178
181
  }
179
182
  catch (cause) {
180
183
  logger.warn("the workspace root did not resolve", { threadId, analysisId, ...logger.errorFields(cause) });
@@ -182,12 +185,14 @@ export function createRecordVersionTool(deps) {
182
185
  }
183
186
  const validation = await validateReport(finished.document, snapshot, resolver);
184
187
  if (!validation.valid) {
185
- return ok({
186
- outcome: "invalid",
187
- ...(validation.schemaIssues ? { schemaIssues: validation.schemaIssues } : {}),
188
- ...(validation.duplicateIds ? { duplicateIds: validation.duplicateIds } : {}),
189
- ...(validation.resolutionFailures ? { resolutionFailures: validation.resolutionFailures } : {}),
190
- });
188
+ const invalid = { outcome: "invalid" };
189
+ if (validation.schemaIssues)
190
+ invalid.schemaIssues = validation.schemaIssues;
191
+ if (validation.duplicateIds)
192
+ invalid.duplicateIds = validation.duplicateIds;
193
+ if (validation.resolutionFailures)
194
+ invalid.resolutionFailures = validation.resolutionFailures;
195
+ return ok(invalid);
191
196
  }
192
197
  const thread = await deps.threads.getThread(threadId);
193
198
  if (thread.isErr()) {
@@ -205,6 +210,8 @@ export function createRecordVersionTool(deps) {
205
210
  threadId,
206
211
  parentThreadId: thread.value.parentThreadId,
207
212
  parentSeq: thread.value.parentSeq,
213
+ // A rerun of the step gives the same id, thus the version that its first run made reads as created.
214
+ versionId: stepUuid(stepKey()),
208
215
  });
209
216
  if (recorded.isOk()) {
210
217
  // The version stands from here, thus the event states a version that a reader can open.
@@ -17,18 +17,18 @@
17
17
  import { type ResultAsync } from "neverthrow";
18
18
  import type { AuthContext } from "../../auth/types.js";
19
19
  /** The grant of one session page: the content-server base, the token, and its expiry. */
20
- export interface SessionPageGrant {
20
+ export type SessionPageGrant = {
21
21
  readonly baseUrl: string;
22
22
  readonly token: string;
23
23
  readonly expiresAt: string;
24
- }
24
+ };
25
25
  /** What a failed mint is allowed to carry. */
26
- export interface SessionPageMintFailure {
26
+ export type SessionPageMintFailure = {
27
27
  readonly status?: number;
28
28
  readonly error: {
29
29
  readonly message?: string;
30
30
  };
31
- }
31
+ };
32
32
  /**
33
33
  * Renders a failed mint as the line an agent reads back from the preview tool.
34
34
  *
@@ -38,7 +38,7 @@ export interface SessionPageMintFailure {
38
38
  * It lives beside the type because its whole job is to honour that type's optionality.
39
39
  */
40
40
  export declare function describeSessionPageMintFailure(failure: SessionPageMintFailure): string;
41
- export interface SessionPagePublisher {
41
+ export type SessionPagePublisher = {
42
42
  /**
43
43
  * Mint the access grant of one session page. The publisher binds the analysis, thus the mint takes
44
44
  * the thread id alone. `baseUrl` is the base URL of the content server, with no res path — the
@@ -46,7 +46,7 @@ export interface SessionPagePublisher {
46
46
  * contract and never in a realization.
47
47
  */
48
48
  mintSessionPageAccess(threadId: string): ResultAsync<SessionPageGrant, SessionPageMintFailure>;
49
- }
49
+ };
50
50
  /**
51
51
  * The per-call construction of the publisher. The factory binds one analysis and the auth of the tool
52
52
  * call, thus a realization mints under the credential of the caller and holds no ambient state.
@@ -2,18 +2,25 @@
2
2
  * generateAnalogyReport — cross-domain analogy report as a sub-agent tool.
3
3
  *
4
4
  * An inline harness `AgentDefinition` (mirroring `createLiteratureReviewerTool`)
5
- * driven by `runToTerminal`. The result reaches the wrapper through one of two
6
- * terminal tools because the output envelope is a union and `defineTool` takes
7
- * only a top-level object. A run with no outcome gets one salvage continuation,
8
- * then an `extraction-failed` envelope, so the frontend never renders raw prose.
5
+ * driven by `runWithSalvage`. The result reaches the wrapper through one of two
6
+ * submit tools because the output envelope is a union and `defineTool` takes
7
+ * only a top-level object. Neither tool ends the run: the wrapper selects the
8
+ * last accepted report from the recorded calls, else the first blocker. A run
9
+ * with no outcome gets one salvage request, then an `extraction-failed`
10
+ * envelope, so the frontend never renders raw prose.
9
11
  */
10
12
  import { z } from "zod";
13
+ import { type AnalogyReport } from "@inflexa-ai/harness/contracts/analogy-report.js";
11
14
  import type { Logger } from "../../lib/logger.js";
15
+ import { type LoopStep } from "../../loop/run-loop.js";
16
+ import type { SubAgentRegistrar } from "../../loop/sub-agent.js";
12
17
  import type { ToolOutputStore } from "../../loop/tool-output.js";
13
18
  import type { ChatProvider } from "../../providers/types.js";
14
19
  import type { UsageRecorder } from "../../billing/usage-recorder.js";
15
20
  import { type Tool } from "../define-tool.js";
16
21
  import { type BioToolKeys } from "../bio/keys.js";
22
+ /** The last report of a run that its call accepted. The input schema of the tool checked it. */
23
+ export declare function acceptedReportOf(steps: readonly LoopStep[]): AnalogyReport | undefined;
17
24
  export declare const generateAnalogyReportInputSchema: z.ZodObject<{
18
25
  problem: z.ZodString;
19
26
  context: z.ZodOptional<z.ZodString>;
@@ -29,7 +36,7 @@ export type GenerateAnalogyReportInput = z.infer<typeof generateAnalogyReportInp
29
36
  * Exported for unit testing.
30
37
  */
31
38
  export declare function buildResearchPrompt(input: GenerateAnalogyReportInput): string;
32
- export interface GenerateAnalogyReportDeps {
39
+ export type GenerateAnalogyReportDeps = {
33
40
  /** The LLM seam the child loop runs on. */
34
41
  readonly provider: ChatProvider;
35
42
  /** Model id — provenance / metric label; the provider owns the wire model. */
@@ -42,6 +49,6 @@ export interface GenerateAnalogyReportDeps {
42
49
  readonly toolOutputStore?: ToolOutputStore;
43
50
  /** Logging seam; omitted falls back to no-op. Logs the salvage warning and an accounting error of the reasoner loop. */
44
51
  readonly logger?: Logger;
45
- }
52
+ };
46
53
  /** Build the `generate_analogy_report` delegation tool bound to its provider. */
47
- export declare function createGenerateAnalogyReportTool(deps: GenerateAnalogyReportDeps): Tool;
54
+ export declare function createGenerateAnalogyReportTool(deps: GenerateAnalogyReportDeps, registerSubAgent: SubAgentRegistrar): Tool;
@@ -2,11 +2,15 @@
2
2
  * generateAnalogyReport — cross-domain analogy report as a sub-agent tool.
3
3
  *
4
4
  * An inline harness `AgentDefinition` (mirroring `createLiteratureReviewerTool`)
5
- * driven by `runToTerminal`. The result reaches the wrapper through one of two
6
- * terminal tools because the output envelope is a union and `defineTool` takes
7
- * only a top-level object. A run with no outcome gets one salvage continuation,
8
- * then an `extraction-failed` envelope, so the frontend never renders raw prose.
5
+ * driven by `runWithSalvage`. The result reaches the wrapper through one of two
6
+ * submit tools because the output envelope is a union and `defineTool` takes
7
+ * only a top-level object. Neither tool ends the run: the wrapper selects the
8
+ * last accepted report from the recorded calls, else the first blocker. A run
9
+ * with no outcome gets one salvage request, then an `extraction-failed`
10
+ * envelope, so the frontend never renders raw prose.
9
11
  */
12
+ import { errorMessageOf } from "../../lib/thrown.js";
13
+ import { textOf } from "../../lib/unknown-text.js";
10
14
  import { ok } from "neverthrow";
11
15
  import { z } from "zod";
12
16
  import { AnalogyReportSchema } from "@inflexa-ai/harness/contracts/analogy-report.js";
@@ -14,11 +18,11 @@ import { analogicalReasonerPrompt } from "../../prompts/analogical-reasoner.js";
14
18
  import { composeSystemPrompt } from "../../agents/system-prompt.js";
15
19
  import { forSubAgent } from "../../auth/types.js";
16
20
  import { createNoopLogger } from "../../lib/console-logger.js";
17
- import { passthroughStep } from "../../loop/run-step.js";
18
- import { runToTerminal } from "../../loop/run-to-terminal.js";
21
+ import { runWithSalvage } from "../../loop/run-loop.js";
22
+ import { recordedInputOf } from "../../loop/tool-adapter.js";
19
23
  import { defineTool } from "../define-tool.js";
20
24
  import { createReadToolOutputTool } from "../read-tool-output.js";
21
- import { createReportBlockerToolFor } from "../sandbox/report-blocker.js";
25
+ import { blockerOf, createReportBlockerToolFor, REPORT_BLOCKER_TOOL_ID } from "../sandbox/report-blocker.js";
22
26
  // Cross-domain search tools the analogical-reasoner uses.
23
27
  import { createSearchSemanticScholarTool } from "./search-semantic-scholar.js";
24
28
  import { searchArxivTool } from "./search-arxiv.js";
@@ -32,33 +36,34 @@ const RESEARCH_MAX_ITERATIONS = 40;
32
36
  const ANALOGY_SALVAGE_NUDGE = "You ended without a terminal outcome. Call submit_analogy_report with " +
33
37
  "your report now, or report_blocker if phase 1 cannot run. Do not reply " +
34
38
  "with prose.";
35
- function createSubmitAnalogyReportTool(cell) {
39
+ const SUBMIT_ANALOGY_REPORT_TOOL_ID = "submit_analogy_report";
40
+ function createSubmitAnalogyReportTool() {
36
41
  return defineTool({
37
- id: "submit_analogy_report",
38
- description: "Terminal. Submit the analogy report: the problem summary, objects, " +
42
+ id: SUBMIT_ANALOGY_REPORT_TOOL_ID,
43
+ description: "Submit the analogy report: the problem summary, objects, " +
39
44
  "relations, and key terms of phase 1, and each analogy with its " +
40
45
  "coverage and its cited solutions from phase 2. Call it one time with " +
41
46
  "the full report. If it rejects the report, correct the fields that it " +
42
- "names and call it again. An accepted call ends the run.",
47
+ "names and call it again. The last accepted report is the result.",
43
48
  inputSchema: AnalogyReportSchema,
44
49
  describeCall: "none",
45
- execute: async (report) => {
46
- // A report replaces a blocker, thus the report wins when one round records both.
47
- cell.outcome = { kind: "report", report };
48
- return ok({
49
- recorded: true,
50
- message: "Report recorded.",
51
- });
52
- },
50
+ execute: () => Promise.resolve(ok({ recorded: true, message: "Report recorded. Stop now." })),
53
51
  });
54
52
  }
55
- function createAnalogyBlockerTool(cell) {
53
+ /** The last report of a run that its call accepted. The input schema of the tool checked it. */
54
+ export function acceptedReportOf(steps) {
55
+ let accepted;
56
+ for (const step of steps) {
57
+ for (const call of step.calls) {
58
+ if (call.toolName !== SUBMIT_ANALOGY_REPORT_TOOL_ID || call.output?.outcome !== "ok")
59
+ continue;
60
+ accepted = recordedInputOf(AnalogyReportSchema, call.input) ?? accepted;
61
+ }
62
+ }
63
+ return accepted;
64
+ }
65
+ function createAnalogyBlockerTool() {
56
66
  return createReportBlockerToolFor({
57
- // A blocker never replaces a recorded outcome, thus it never replaces a report.
58
- record: (outcome) => {
59
- if (cell.outcome === null)
60
- cell.outcome = outcome;
61
- },
62
67
  blockedWhen: "Ends the analogy research with no report. Call it only when the " +
63
68
  "problem is empty or incoherent, thus phase 1 cannot extract its " +
64
69
  "objects and relations.",
@@ -119,17 +124,63 @@ export function buildResearchPrompt(input) {
119
124
  return lines.join("\n");
120
125
  }
121
126
  /** Build the `generate_analogy_report` delegation tool bound to its provider. */
122
- export function createGenerateAnalogyReportTool(deps) {
127
+ export function createGenerateAnalogyReportTool(deps, registerSubAgent) {
123
128
  const logger = (deps.logger ?? createNoopLogger()).named("generate-analogy-report");
124
129
  const ncbi = createNcbiTools(deps.bioKeys);
125
130
  const searchTools = [
126
- createSearchSemanticScholarTool({ ...(deps.bioKeys.semanticScholar === undefined ? {} : { apiKey: deps.bioKeys.semanticScholar }) }),
131
+ createSearchSemanticScholarTool({ apiKey: deps.bioKeys.semanticScholar }),
127
132
  searchArxivTool,
128
133
  createSearchGithubReposTool({ githubToken: deps.bioKeys.github }),
129
134
  ncbi.pubmed,
130
135
  ...(deps.toolOutputStore ? [createReadToolOutputTool(deps.toolOutputStore)] : []),
131
136
  ];
132
137
  const systemPrompt = composeSystemPrompt(analogicalReasonerPrompt);
138
+ const research = registerSubAgent(AGENT_ID, async ({ payload: input, ctx, loop }) => {
139
+ const childSession = forSubAgent(ctx.session, AGENT_ID);
140
+ // The order and the definitions of the tools stay fixed across calls so the cache-keyed prefix holds.
141
+ const submitReportTool = createSubmitAnalogyReportTool();
142
+ const blockerTool = createAnalogyBlockerTool();
143
+ const agent = {
144
+ id: AGENT_ID,
145
+ systemPrompt,
146
+ model: deps.model,
147
+ tools: [...searchTools, submitReportTool, blockerTool],
148
+ maxIterations: RESEARCH_MAX_ITERATIONS,
149
+ };
150
+ let steps;
151
+ try {
152
+ const run = await runWithSalvage(agent, [{ role: "user", content: buildResearchPrompt(input) }], childSession, {
153
+ ...loop,
154
+ provider: deps.provider,
155
+ logger,
156
+ usageRecorder: deps.usageRecorder,
157
+ toolOutputStore: deps.toolOutputStore,
158
+ }, {
159
+ tools: [SUBMIT_ANALOGY_REPORT_TOOL_ID, REPORT_BLOCKER_TOOL_ID],
160
+ nudge: ANALOGY_SALVAGE_NUDGE,
161
+ hasOutcome: (done) => acceptedReportOf(done) !== undefined || blockerOf(done) !== null,
162
+ });
163
+ steps = run.steps;
164
+ }
165
+ catch (err) {
166
+ const message = errorMessageOf(err) ?? textOf(err);
167
+ return {
168
+ schemaVersion: "1",
169
+ error: {
170
+ kind: "extraction-failed",
171
+ message: `Analogy research failed: ${message}`.slice(0, 240),
172
+ },
173
+ };
174
+ }
175
+ // A report wins over a blocker.
176
+ const report = acceptedReportOf(steps);
177
+ if (report !== undefined)
178
+ return report;
179
+ const blocker = blockerOf(steps);
180
+ if (blocker !== null)
181
+ return { schemaVersion: "1", error: { kind: "extraction-failed", message: blocker.reason } };
182
+ return buildExtractionFailedEnvelope();
183
+ });
133
184
  return defineTool({
134
185
  id: "generate_analogy_report",
135
186
  description: "Idea-generation engine. Extracts structural analogies for an open-ended " +
@@ -156,55 +207,8 @@ export function createGenerateAnalogyReportTool(deps) {
156
207
  "failure, thus surface the message and ask the user to narrow the problem.",
157
208
  inputSchema: generateAnalogyReportInputSchema,
158
209
  describeCall: "none",
159
- execute: async (input, ctx) => {
160
- const childSession = forSubAgent(ctx.session, AGENT_ID);
161
- // Each call builds fresh tool closures over its own cell. Their order and
162
- // definitions stay fixed across calls so the cache-keyed prefix holds.
163
- const cell = { outcome: null };
164
- const submitReportTool = createSubmitAnalogyReportTool(cell);
165
- const blockerTool = createAnalogyBlockerTool(cell);
166
- const agent = {
167
- id: AGENT_ID,
168
- systemPrompt,
169
- model: deps.model,
170
- tools: [...searchTools, submitReportTool, blockerTool],
171
- maxIterations: RESEARCH_MAX_ITERATIONS,
172
- };
173
- try {
174
- await runToTerminal(agent, [{ role: "user", content: buildResearchPrompt(input) }], childSession, {
175
- provider: deps.provider,
176
- signal: ctx.signal,
177
- emit: ctx.emit,
178
- runStep: passthroughStep,
179
- resolved: () => cell.outcome !== null,
180
- logger,
181
- usageRecorder: deps.usageRecorder,
182
- toolOutputStore: deps.toolOutputStore,
183
- // Fold the child's calls into the turn total the root loop reports.
184
- turnUsage: ctx.turnUsage,
185
- // Keeps the usage record keys of two parallel dispatches disjoint —
186
- // same frame, same call path, same loop-local step names.
187
- invocationId: ctx.invocationId,
188
- }, { tools: [submitReportTool, blockerTool], nudge: ANALOGY_SALVAGE_NUDGE });
189
- }
190
- catch (err) {
191
- const message = err instanceof Error ? err.message : String(err);
192
- return ok({
193
- schemaVersion: "1",
194
- error: {
195
- kind: "extraction-failed",
196
- message: `Analogy research failed: ${message}`.slice(0, 240),
197
- },
198
- });
199
- }
200
- const outcome = cell.outcome;
201
- if (outcome?.kind === "report")
202
- return ok(outcome.report);
203
- if (outcome?.kind === "blocker") {
204
- return ok({ schemaVersion: "1", error: { kind: "extraction-failed", message: outcome.reason } });
205
- }
206
- return ok(buildExtractionFailedEnvelope());
207
- },
210
+ startsWorkflow: true,
211
+ execute: async (input, ctx) => ok(await research(input, ctx)),
208
212
  });
209
213
  }
210
214
  /** The envelope of a run that recorded no outcome, also after its salvage. */
@@ -1,6 +1,6 @@
1
1
  /**
2
- * generatePlan — a loop-driving tool: a focused `runAgent` loop that builds
3
- * an analysis plan (a DAG of steps).
2
+ * generatePlan — a loop-driving tool: a focused agent loop that builds an
3
+ * analysis plan (a DAG of steps).
4
4
  *
5
5
  * The dataset's facts are NOT an input. They are read here, server-side, from
6
6
  * the analysis's persisted data profile — the one durable record of what the
@@ -10,20 +10,20 @@
10
10
  * caller-typed dataset summary would be a model re-transcribing a record the
11
11
  * database already holds, and it would lose fidelity at every hop.
12
12
  *
13
- * The tool drives an internal "planner" agent that communicates outcomes
14
- * EXCLUSIVELY via three terminal tool calls:
13
+ * The tool drives an internal "planner" agent that gives its outcome through
14
+ * three terminal tools. None of them ends the run, and none writes:
15
15
  *
16
- * - submit_plan(plan) → terminal success: re-validates + persists;
17
- * rejected candidates return structured issues
18
- * - request_clarification(…) → terminal: planner needs more context
19
- * - report_blocker(reason) → terminal: no viable plan
16
+ * - submit_plan(plan) → checks a candidate; gives back the accepted
17
+ * plan or structured issues
18
+ * - request_clarification(…) → the planner needs more context
19
+ * - report_blocker(reason) → no viable plan
20
20
  *
21
- * The planner is an `AgentDefinition` driven by `runAgent`; the pool and
22
- * resource id are an explicit `Pool` dependency and the request-scoped
23
- * `Session`. The planner prompt injects the agent catalog and exposes the
24
- * terminal-tool surface above.
21
+ * After the run, the tool selects the outcome from the recorded calls — the
22
+ * last accepted plan, else the last clarification, else the first blocker —
23
+ * and persists an accepted plan under an id that a rerun of the call gives again.
25
24
  */
26
25
  import type { Pool } from "pg";
26
+ import type { SubAgentRegistrar } from "../../loop/sub-agent.js";
27
27
  import type { ToolOutputStore } from "../../loop/tool-output.js";
28
28
  import { type ChatProvider } from "../../providers/types.js";
29
29
  import type { UsageRecorder } from "../../billing/usage-recorder.js";
@@ -33,7 +33,7 @@ import { type BioToolKeys } from "../bio/keys.js";
33
33
  import { type KnowledgeClient, type KnowledgeRecommendAnswer } from "../knowledge/index.js";
34
34
  import { type ResourcePolicy } from "../../config/resource-limits.js";
35
35
  import type { Logger } from "../../lib/logger.js";
36
- export interface GeneratePlanDeps extends EnvironmentStorePaths {
36
+ export type GeneratePlanDeps = EnvironmentStorePaths & {
37
37
  /**
38
38
  * The conversation-role backend the planner is pinned to. Keeping the
39
39
  * provider and its model label in one value prevents composition roots from
@@ -51,7 +51,7 @@ export interface GeneratePlanDeps extends EnvironmentStorePaths {
51
51
  * default guidance and validation skips the ceiling check.
52
52
  */
53
53
  readonly resourcePolicy?: ResourcePolicy;
54
- /** Diagnostic sink. Absent, the tool runs silently — see `RunAgentOptions.logger`. */
54
+ /** Diagnostic sink. Absent, the tool runs silently — see `LoopOptions.logger`. */
55
55
  readonly logger?: Logger;
56
56
  /** LLM usage-accounting seam for the planner loop; omitted falls back to the no-op recorder. */
57
57
  readonly usageRecorder?: UsageRecorder;
@@ -66,7 +66,7 @@ export interface GeneratePlanDeps extends EnvironmentStorePaths {
66
66
  * the open-source host.
67
67
  */
68
68
  readonly knowledge?: KnowledgeClient;
69
- }
69
+ };
70
70
  /**
71
71
  * The search tools of the planner — built one time, not per invocation.
72
72
  *
@@ -83,4 +83,4 @@ export declare function buildPlannerSearchTools(deps: GeneratePlanDeps, hooks?:
83
83
  readonly onRecommend?: (answer: KnowledgeRecommendAnswer) => void;
84
84
  }): Tool[];
85
85
  /** Build the `generate_plan` tool bound to its provider and pool. */
86
- export declare function createGeneratePlanTool(deps: GeneratePlanDeps): Tool;
86
+ export declare function createGeneratePlanTool(deps: GeneratePlanDeps, registerSubAgent: SubAgentRegistrar): Tool;