@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
@@ -15,12 +15,17 @@
15
15
  *
16
16
  * The primitive admits a flat object input only. Thus a destination is four optional fields, and not a
17
17
  * nested union. A conflict between the flat fields refuses before the core runs.
18
+ *
19
+ * Inside a durable step, a mutation stores its result for the thread and the step, in the transaction of
20
+ * the document and under the lock of the row. A rerun of the step after the landing, before its
21
+ * checkpoint, gives the stored result. Thus a rerun of `add_block` does not refuse its own block id, and a
22
+ * rerun of `remove_block` does not refuse its own removed target.
18
23
  */
19
24
  import { type Result } from "neverthrow";
20
25
  import { z } from "zod";
21
26
  import type { Scope } from "../../auth/types.js";
22
27
  import type { Logger } from "../../lib/logger.js";
23
- import { type ProvenanceSeam } from "../../provenance/seam.js";
28
+ import { type ProvenanceSeam, type SessionProvenanceEvent } from "../../provenance/seam.js";
24
29
  import { type DraftRefusal } from "../../report-model/draft-operations.js";
25
30
  import { type OutlineEntry, type ReadableBlock } from "../../report-model/draft-read.js";
26
31
  import type { ReportWarning } from "../../report-model/block-walk.js";
@@ -81,11 +86,11 @@ export type ReadBlockInput = z.infer<typeof readBlockInput>;
81
86
  export type SetTitleInput = z.infer<typeof setTitleInput>;
82
87
  export type FinishDraftInput = z.infer<typeof finishDraftInput>;
83
88
  /** One container that an operation changed, and the child order inside it after the operation. */
84
- export interface ChangedContainer {
89
+ export type ChangedContainer = {
85
90
  /** The section that holds the children. It is absent when the container is the root. */
86
91
  parentId?: string;
87
92
  children: OutlineEntry[];
88
- }
93
+ };
89
94
  /**
90
95
  * The closed set of tool-layer refusal reasons.
91
96
  *
@@ -105,10 +110,10 @@ export type SessionRefusalReason = "no-thread-scope" | "absent-state" | "wrong-t
105
110
  * state, or a gateway that cannot give the state. It sits beside the core `DraftRefusal`, and it never
106
111
  * widens the closed reason set of the core.
107
112
  */
108
- export interface SessionRefusal {
113
+ export type SessionRefusal = {
109
114
  reason: SessionRefusalReason;
110
115
  detail: string;
111
- }
116
+ };
112
117
  /**
113
118
  * The result of a mutation tool. A refusal carries the typed reason, from the core or from the tool layer.
114
119
  *
@@ -120,13 +125,15 @@ export interface SessionRefusal {
120
125
  *
121
126
  * A move across two containers reports both. An operation that changes no child order reports none.
122
127
  */
123
- export type MutationResult = {
124
- applied: true;
125
- changed: ChangedContainer[];
126
- } | {
128
+ export type MutationResult = LandedResult | {
127
129
  applied: false;
128
130
  refusal: DraftRefusal | SessionRefusal;
129
131
  };
132
+ /** The result of a mutation that landed its document. A durable step stores it, and a rerun of the step gives it again. */
133
+ export type LandedResult = {
134
+ applied: true;
135
+ changed: ChangedContainer[];
136
+ };
130
137
  /** The result of `read_outline`. A load that gives no state refuses instead of an outline. */
131
138
  export type OutlineResult = {
132
139
  outline: OutlineEntry[];
@@ -160,10 +167,10 @@ export type FinishToolResult = {
160
167
  refused: SessionRefusal;
161
168
  };
162
169
  /** The state of one report thread: the document under composition, and the frozen snapshot. */
163
- export interface ReportSessionState {
170
+ export type ReportSessionState = {
164
171
  readonly document: DraftDocument;
165
172
  readonly snapshot: ReportSnapshot;
166
- }
173
+ };
167
174
  /**
168
175
  * The concurrency token that a load hands out and a persist compares against. It is the prior document
169
176
  * that the load read, or `null` before the first document lands. The persist lands only when the row still
@@ -191,6 +198,8 @@ export type SessionStateLoad = {
191
198
  token: SessionStateToken;
192
199
  seenDocumentHash: string | null;
193
200
  derivations: readonly DerivationRecord[];
201
+ /** The stored result of the call that the load names, when an earlier run of that call landed. */
202
+ landed?: unknown;
194
203
  } | {
195
204
  outcome: "absent";
196
205
  } | {
@@ -200,15 +209,31 @@ export type SessionStateLoad = {
200
209
  outcome: "failed";
201
210
  detail: string;
202
211
  };
203
- /** The outcome of a gateway persist. `conflict` means that a concurrent turn landed first. */
212
+ /**
213
+ * The outcome of a gateway persist. `conflict` means that a concurrent turn landed first. `replayed` means
214
+ * that an earlier run of the call landed, and it carries the stored result of that run.
215
+ */
204
216
  export type SessionStatePersist = {
205
217
  outcome: "persisted";
206
218
  } | {
207
219
  outcome: "conflict";
220
+ } | {
221
+ outcome: "replayed";
222
+ landed: unknown;
208
223
  } | {
209
224
  outcome: "failed";
210
225
  detail: string;
211
226
  };
227
+ /**
228
+ * The authoring call of a persist: the key of its durable step, and the result that it gives when the document lands.
229
+ * The result carries the events of the act, thus a rerun that finds the result can emit them again.
230
+ */
231
+ export type LandingCall = {
232
+ readonly key: string;
233
+ readonly result: LandedResult & {
234
+ readonly events: readonly SessionProvenanceEvent[];
235
+ };
236
+ };
212
237
  /**
213
238
  * The outcome of a gateway stamp. `stamped` wrote the marker. `absent` means that no row holds the thread.
214
239
  * `failed` is a transient store fault that names its cause. Each arm is plain data, thus a stamp never
@@ -246,9 +271,11 @@ export type SeenStampResult = {
246
271
  * the gateway over the durable store. A load gives the state, a typed absence, or a typed failure. A
247
272
  * persist gives success, or a typed failure.
248
273
  */
249
- export interface ReportSessionStateGateway {
250
- load(threadId: string): Promise<SessionStateLoad>;
251
- persist(threadId: string, document: DraftDocument, expected: SessionStateToken): Promise<SessionStatePersist>;
274
+ export type ReportSessionStateGateway = {
275
+ /** `callKey` names the durable step of a mutation, and the found load then carries the stored result of an earlier run. */
276
+ load(threadId: string, callKey?: string): Promise<SessionStateLoad>;
277
+ /** A persist with a `call` stores the result of the call in the transaction of the document. */
278
+ persist(threadId: string, document: DraftDocument, expected: SessionStateToken, call?: LandingCall): Promise<SessionStatePersist>;
252
279
  /**
253
280
  * Stamp the hash of the rendered draft on the session state. The preview calls it when the page lands,
254
281
  * thus the runtime knows which draft the page shows.
@@ -260,12 +287,12 @@ export interface ReportSessionStateGateway {
260
287
  * rendered hash existed to copy, thus the eyes tell a real stamp from a missed one.
261
288
  */
262
289
  stampSeen(threadId: string): Promise<SeenStampResult>;
263
- }
290
+ };
264
291
  /**
265
292
  * The thread of a call, its analysis, the loaded state, the concurrency token that the persist compares
266
293
  * against, the seen-document hash of the look-before-record rule, and the derivations of the session.
267
294
  */
268
- export interface OpenedThread {
295
+ export type OpenedThread = {
269
296
  readonly threadId: string;
270
297
  readonly analysisId: string;
271
298
  readonly state: ReportSessionState;
@@ -274,7 +301,9 @@ export interface OpenedThread {
274
301
  readonly seenDocumentHash: string | null;
275
302
  /** The derivations of the session, in the order that the records landed. */
276
303
  readonly derivations: readonly DerivationRecord[];
277
- }
304
+ /** The stored result of an earlier run of the call that the open names. */
305
+ readonly landed?: unknown;
306
+ };
278
307
  /**
279
308
  * Resolve the report thread of a call, and load its state through the gateway.
280
309
  *
@@ -290,9 +319,9 @@ export interface OpenedThread {
290
319
  * The authoring tools and the preview tool share this one resolution, thus the two surfaces accept the
291
320
  * same thread id and map a load outcome onto a refusal the same way.
292
321
  */
293
- export declare function openReportThread(gateway: ReportSessionStateGateway, scope: Scope): Promise<Result<OpenedThread, SessionRefusal>>;
322
+ export declare function openReportThread(gateway: ReportSessionStateGateway, scope: Scope, callKey?: string): Promise<Result<OpenedThread, SessionRefusal>>;
294
323
  /** The eight authoring tools. */
295
- export interface ReportAuthoringTools {
324
+ export type ReportAuthoringTools = {
296
325
  readonly add_block: Tool<AddBlockInput, MutationResult>;
297
326
  readonly change_block: Tool<ChangeBlockInput, MutationResult>;
298
327
  readonly remove_block: Tool<RemoveBlockInput, MutationResult>;
@@ -301,17 +330,19 @@ export interface ReportAuthoringTools {
301
330
  readonly read_outline: Tool<ReadOutlineInput, OutlineResult>;
302
331
  readonly read_block: Tool<ReadBlockInput, ReadBlockResult>;
303
332
  readonly finish_draft: Tool<FinishDraftInput, FinishToolResult>;
304
- }
333
+ };
305
334
  /**
306
335
  * The optional deps of the authoring surface. The gateway is the one mandatory part, thus it stays a
307
336
  * parameter of its own and this bag holds what a composition can leave out.
308
337
  */
309
- export interface ReportAuthoringToolDeps {
338
+ export type ReportAuthoringToolDeps = {
310
339
  /** The provenance seam; an unbound session emit emits nothing and each tool acts the same. */
311
340
  readonly provenance?: ProvenanceSeam;
312
341
  /** Operational logging seam; omitted falls back to no-op. */
313
342
  readonly logger?: Logger;
314
- }
343
+ /** The key of the durable step that runs the call, `undefined` outside one. Defaults to {@link durableStepKey}. */
344
+ readonly stepKey?: () => string | undefined;
345
+ };
315
346
  /**
316
347
  * Make the eight authoring tools over a session-state gateway.
317
348
  *
@@ -15,12 +15,19 @@
15
15
  *
16
16
  * The primitive admits a flat object input only. Thus a destination is four optional fields, and not a
17
17
  * nested union. A conflict between the flat fields refuses before the core runs.
18
+ *
19
+ * Inside a durable step, a mutation stores its result for the thread and the step, in the transaction of
20
+ * the document and under the lock of the row. A rerun of the step after the landing, before its
21
+ * checkpoint, gives the stored result. Thus a rerun of `add_block` does not refuse its own block id, and a
22
+ * rerun of `remove_block` does not refuse its own removed target.
18
23
  */
19
24
  import { err, ok } from "neverthrow";
20
25
  import { basename } from "node:path";
21
26
  import { z } from "zod";
22
27
  import { createNoopLogger } from "../../lib/console-logger.js";
23
28
  import { capCodePoints, DETAIL_NEEDLE_MAX_LENGTH } from "../../loop/tool-detail.js";
29
+ import { parseJsonAs } from "../../lib/parse-json.js";
30
+ import { parseUnknownRecord } from "../../lib/unknown-containers.js";
24
31
  import { bindSessionEmit } from "../../provenance/seam.js";
25
32
  import { isSafeId } from "../../workspace/paths.js";
26
33
  import { addBlock, changeBlock, locate, moveBlock, removeBlock, setTitle, } from "../../report-model/draft-operations.js";
@@ -28,6 +35,7 @@ import { buildOutline, childOutline, readBlock } from "../../report-model/draft-
28
35
  import { finishDraft } from "../../report-model/draft-finish.js";
29
36
  import { AuthoringBlockSchema } from "../../report-model/authoring-grammar.js";
30
37
  import { defineTool } from "../define-tool.js";
38
+ import { durableStepKey } from "../workspace/edit-file.js";
31
39
  /**
32
40
  * The block payload.
33
41
  *
@@ -39,8 +47,8 @@ import { defineTool } from "../define-tool.js";
39
47
  * The grammar is the authoring one, thus no artifact reference of the published schema carries a hash. The
40
48
  * pinned snapshot owns that value, and the land path stamps it from the path.
41
49
  *
42
- * The `z.unknown()` member keeps the runtime parse permissive. Thus a malformed payload still reaches the
43
- * core, which parses it with the draft grammar and refuses `malformed-block` as typed data in the ok
50
+ * The `z.unknown()` member keeps the runtime parse permissive. Thus a malformed payload still reaches
51
+ * the core, which parses it with the draft grammar and refuses `malformed-block` as typed data in the ok
44
52
  * channel. A strict input schema would turn that designed refusal into a hard input-validation error from
45
53
  * the loop. A payload that carries a hash rides the same arm, and the stamp drops the value before the
46
54
  * parse.
@@ -98,6 +106,33 @@ const setTitleInput = z.object({
98
106
  title: z.string().min(1).describe("The title of the whole report."),
99
107
  });
100
108
  const finishDraftInput = z.object({});
109
+ /** Each kind of a draft block. The record type names each kind, thus a new kind fails the build here. */
110
+ const DRAFT_BLOCK_KINDS = {
111
+ section: true,
112
+ text: true,
113
+ claim: true,
114
+ metric: true,
115
+ table: true,
116
+ chart: true,
117
+ figure: true,
118
+ citation: true,
119
+ };
120
+ /** The events that a stored result carries. The harness wrote each one, thus a check of the event type is enough. */
121
+ const StoredEventsSchema = z.object({
122
+ events: z.array(z.custom((value) => z.object({ type: z.string() }).safeParse(value).success)),
123
+ });
124
+ const LandedResultSchema = z.object({
125
+ applied: z.literal(true),
126
+ changed: z.array(z.object({
127
+ parentId: z.string().optional(),
128
+ children: z.array(z.object({
129
+ id: z.string(),
130
+ kind: z.custom((value) => typeof value === "string" && Object.hasOwn(DRAFT_BLOCK_KINDS, value)),
131
+ depth: z.number(),
132
+ label: z.string(),
133
+ })),
134
+ })),
135
+ });
101
136
  /**
102
137
  * Resolve the report thread of a call, and load its state through the gateway.
103
138
  *
@@ -113,12 +148,12 @@ const finishDraftInput = z.object({});
113
148
  * The authoring tools and the preview tool share this one resolution, thus the two surfaces accept the
114
149
  * same thread id and map a load outcome onto a refusal the same way.
115
150
  */
116
- export async function openReportThread(gateway, scope) {
117
- if (scope.kind !== "analysis" || scope.threadId === undefined || !isSafeId(scope.threadId)) {
151
+ export async function openReportThread(gateway, scope, callKey) {
152
+ if (scope.threadId === undefined || !isSafeId(scope.threadId)) {
118
153
  return err({ reason: "no-thread-scope", detail: "the scope of the call names no usable report thread id" });
119
154
  }
120
155
  const { threadId, analysisId } = scope;
121
- const loaded = await gateway.load(threadId);
156
+ const loaded = await gateway.load(threadId, callKey);
122
157
  if (loaded.outcome === "absent") {
123
158
  return err({ reason: "absent-state", detail: `no report session exists for the thread ${threadId}, and this condition is permanent` });
124
159
  }
@@ -141,6 +176,7 @@ export async function openReportThread(gateway, scope) {
141
176
  token: loaded.token,
142
177
  seenDocumentHash: loaded.seenDocumentHash,
143
178
  derivations: loaded.derivations,
179
+ landed: loaded.landed,
144
180
  });
145
181
  }
146
182
  /** Read an absentable field. An explicit `null` and an omitted key both mean that the model gave no value. */
@@ -216,7 +252,7 @@ function decodeBlockPayload(block) {
216
252
  return block;
217
253
  }
218
254
  try {
219
- return JSON.parse(block);
255
+ return parseJsonAs(block, z.json());
220
256
  }
221
257
  catch {
222
258
  return block;
@@ -232,7 +268,7 @@ function readId(block) {
232
268
  }
233
269
  /** Read one field of an untyped payload, or `undefined` when the payload is not an object. */
234
270
  function fieldOf(value, field) {
235
- return value !== null && typeof value === "object" ? value[field] : undefined;
271
+ return parseUnknownRecord(value)?.[field];
236
272
  }
237
273
  function readStringField(block, field) {
238
274
  const value = fieldOf(block, field);
@@ -357,16 +393,6 @@ function containerIn(document, parentId) {
357
393
  const children = located !== undefined && located.block.kind === "section" ? located.block.blocks : [];
358
394
  return { parentId, children: childOutline(children, located?.path.length ?? 0) };
359
395
  }
360
- /**
361
- * Every tool of this surface runs inline.
362
- *
363
- * A tool loads the state of its thread, applies the pure operation, and persists the result in one body.
364
- * The reported outline must agree with the row that the body just wrote. A step-mode tool goes through
365
- * `DBOS.runStep`, which caches the result of a step and replays it without a fresh load. A replay could
366
- * then report an outline that the current row no longer holds. Inline mode reads and writes the row in one
367
- * lifetime, thus the outline never drifts from the state.
368
- */
369
- const AUTHORING_EXECUTION_MODE = "inline";
370
396
  /**
371
397
  * Make the eight authoring tools over a session-state gateway.
372
398
  *
@@ -379,6 +405,7 @@ const AUTHORING_EXECUTION_MODE = "inline";
379
405
  */
380
406
  export function createReportAuthoringTools(gateway, deps = {}) {
381
407
  const observe = bindSessionEmit(deps.provenance, (deps.logger ?? createNoopLogger()).named("report-authoring"));
408
+ const stepKey = deps.stepKey ?? durableStepKey;
382
409
  /**
383
410
  * Resolve the thread of the call, and load its state.
384
411
  *
@@ -387,6 +414,39 @@ export function createReportAuthoringTools(gateway, deps = {}) {
387
414
  * operation.
388
415
  */
389
416
  const openThread = (ctx) => openReportThread(gateway, ctx.session.scope);
417
+ const refuse = (refusal) => ({ applied: false, refusal });
418
+ /**
419
+ * The stored result of an earlier run of the call. The row holds what `land` stored, and a row that does not parse refuses.
420
+ *
421
+ * A crash between the persist and the emit of the earlier run loses its events, thus the rerun emits the stored
422
+ * events again. A consumer can get an act two times, never zero times. The parse of the result drops the events,
423
+ * thus the model reads the result alone.
424
+ */
425
+ const replayed = (landed) => {
426
+ const parsed = LandedResultSchema.safeParse(landed);
427
+ if (!parsed.success) {
428
+ return refuse({ reason: "state-unavailable", detail: "the stored result of an earlier run of this call does not parse" });
429
+ }
430
+ const stored = StoredEventsSchema.safeParse(landed);
431
+ for (const observed of stored.success ? stored.data.events : []) {
432
+ observe(observed);
433
+ }
434
+ return parsed.data;
435
+ };
436
+ /**
437
+ * Resolve the thread of a mutation, and load its state with the stored result of an earlier run of the
438
+ * call. A rerun of a landed call gives that result, and it never reaches the core, which would refuse
439
+ * the landing of its own earlier run.
440
+ */
441
+ const openMutation = async (ctx) => {
442
+ const callKey = stepKey();
443
+ const opened = await openReportThread(gateway, ctx.session.scope, callKey);
444
+ if (opened.isErr())
445
+ return { done: refuse(opened.error) };
446
+ if (opened.value.landed !== undefined)
447
+ return { done: replayed(opened.value.landed) };
448
+ return { opened: { ...opened.value, callKey } };
449
+ };
390
450
  /**
391
451
  * Persist a landing, and report the containers that the operation changed.
392
452
  *
@@ -396,7 +456,8 @@ export function createReportAuthoringTools(gateway, deps = {}) {
396
456
  * tool reports `applied: true` only after the row holds the new document.
397
457
  *
398
458
  * The persist is a compare-and-swap against the token that the load read. A concurrent turn that landed
399
- * first turns the persist into a conflict, and the tool refuses with `stale-state`.
459
+ * first turns the persist into a conflict, and the tool refuses with `stale-state`. Inside a durable
460
+ * step, the result lands in the transaction of the document, thus a rerun of the step gives it again.
400
461
  *
401
462
  * `events` gives the observations of the operation, and they emit after the persist landed. Thus one
402
463
  * site owns the rule, and a refusal, a conflict, and a persist fault each emit nothing. It reads the two
@@ -404,12 +465,18 @@ export function createReportAuthoringTools(gateway, deps = {}) {
404
465
  * added block sits in the second alone. A caller that cannot name the block of its own operation gives
405
466
  * no event.
406
467
  */
407
- const land = async (threadId, token, previous, result, holders, events) => {
468
+ const land = async (opened, result, holders, events) => {
408
469
  if (result.isErr()) {
409
470
  return { applied: false, refusal: result.error };
410
471
  }
472
+ const previous = opened.state.document;
411
473
  const next = result.value;
412
- const persisted = await gateway.persist(threadId, next, token);
474
+ // A move inside one container names the same holder two times.
475
+ const unique = [...new Set(holders(previous, next))];
476
+ const landed = { applied: true, changed: unique.map((parentId) => containerIn(next, parentId)) };
477
+ const observed = events(previous, next);
478
+ const call = opened.callKey === undefined ? undefined : { key: opened.callKey, result: { ...landed, events: observed } };
479
+ const persisted = await gateway.persist(opened.threadId, next, opened.token, call);
413
480
  if (persisted.outcome === "conflict") {
414
481
  return {
415
482
  applied: false,
@@ -419,14 +486,14 @@ export function createReportAuthoringTools(gateway, deps = {}) {
419
486
  if (persisted.outcome === "failed") {
420
487
  return { applied: false, refusal: { reason: "state-unavailable", detail: persisted.detail } };
421
488
  }
422
- for (const observed of events(previous, next)) {
423
- observe(observed);
489
+ if (persisted.outcome === "replayed") {
490
+ return replayed(persisted.landed);
424
491
  }
425
- // A move inside one container names the same holder two times.
426
- const unique = [...new Set(holders(previous, next))];
427
- return { applied: true, changed: unique.map((parentId) => containerIn(next, parentId)) };
492
+ for (const event of observed) {
493
+ observe(event);
494
+ }
495
+ return landed;
428
496
  };
429
- const refuse = (refusal) => ({ applied: false, refusal });
430
497
  const add_block = defineTool({
431
498
  id: "add_block",
432
499
  description: "Add one block to the draft. The block can be a section that carries its child blocks, thus one call can add a whole section with its atoms. " +
@@ -437,7 +504,6 @@ export function createReportAuthoringTools(gateway, deps = {}) {
437
504
  "The root admits a section only, and an atom needs a section as its parent. " +
438
505
  "A reference names the path of a pinned artifact, and the session stamps the hash from the pinned evidence.",
439
506
  inputSchema: addBlockInput,
440
- executionMode: AUTHORING_EXECUTION_MODE,
441
507
  describeCall: (input) => {
442
508
  const block = decodeBlockPayload(input.block);
443
509
  const kind = readKind(block);
@@ -448,18 +514,19 @@ export function createReportAuthoringTools(gateway, deps = {}) {
448
514
  return subject === undefined ? `add ${kind}` : `add ${kind} ${subject}`;
449
515
  },
450
516
  execute: async (input, ctx) => {
451
- const opened = await openThread(ctx);
452
- if (opened.isErr()) {
453
- return ok(refuse(opened.error));
517
+ const opening = await openMutation(ctx);
518
+ if ("done" in opening) {
519
+ return ok(opening.done);
454
520
  }
455
- const { threadId, analysisId, state, token } = opened.value;
521
+ const { opened } = opening;
522
+ const { threadId, analysisId, state } = opened;
456
523
  const destination = toDestination(input);
457
524
  if (destination.isErr()) {
458
525
  return ok(refuse(destination.error));
459
526
  }
460
527
  const block = decodeBlockPayload(input.block);
461
528
  const addedId = readId(block);
462
- return ok(await land(threadId, token, state.document, addBlock(state.document, { block, destination: destination.value }, state.snapshot), (_previous, next) => [addedId === undefined ? undefined : holderIdOf(next, addedId)],
529
+ return ok(await land(opened, addBlock(state.document, { block, destination: destination.value }, state.snapshot), (_previous, next) => [addedId === undefined ? undefined : holderIdOf(next, addedId)],
463
530
  // The grammar requires an id on the payload, thus a landed add always names one. A
464
531
  // payload with no id reaches the core, which refuses it, and no event is due.
465
532
  (_previous, next) => (addedId === undefined ? [] : addedActsOf({ analysisId, threadId }, next, addedId))));
@@ -471,19 +538,19 @@ export function createReportAuthoringTools(gateway, deps = {}) {
471
538
  "The change keeps the id of the target, thus the `id` of the payload does not matter. A kind change is permitted. " +
472
539
  "A reference names the path of a pinned artifact, and the session stamps the hash from the pinned evidence.",
473
540
  inputSchema: changeBlockInput,
474
- executionMode: AUTHORING_EXECUTION_MODE,
475
541
  describeCall: (input) => `change ${input.targetId}`,
476
542
  execute: async (input, ctx) => {
477
- const opened = await openThread(ctx);
478
- if (opened.isErr()) {
479
- return ok(refuse(opened.error));
543
+ const opening = await openMutation(ctx);
544
+ if ("done" in opening) {
545
+ return ok(opening.done);
480
546
  }
481
- const { threadId, analysisId, state, token } = opened.value;
547
+ const { opened } = opening;
548
+ const { threadId, analysisId, state } = opened;
482
549
  const operation = toChangeOperation(input);
483
550
  if (operation.isErr()) {
484
551
  return ok(refuse(operation.error));
485
552
  }
486
- return ok(await land(threadId, token, state.document, changeBlock(state.document, operation.value, state.snapshot), (_previous, next) => [holderIdOf(next, input.targetId)],
553
+ return ok(await land(opened, changeBlock(state.document, operation.value, state.snapshot), (_previous, next) => [holderIdOf(next, input.targetId)],
487
554
  // A change is permitted to change the kind, thus the event states the kind that the
488
555
  // document holds after the act.
489
556
  (_previous, next) => blockActOf("change-block", { analysisId, threadId }, next, input.targetId)));
@@ -493,15 +560,15 @@ export function createReportAuthoringTools(gateway, deps = {}) {
493
560
  id: "remove_block",
494
561
  description: "Remove one block by its id. A removed section takes its whole subtree with it, and the id is free for a later add.",
495
562
  inputSchema: removeBlockInput,
496
- executionMode: AUTHORING_EXECUTION_MODE,
497
563
  describeCall: (input) => `remove ${input.targetId}`,
498
564
  execute: async (input, ctx) => {
499
- const opened = await openThread(ctx);
500
- if (opened.isErr()) {
501
- return ok(refuse(opened.error));
565
+ const opening = await openMutation(ctx);
566
+ if ("done" in opening) {
567
+ return ok(opening.done);
502
568
  }
503
- const { threadId, analysisId, state, token } = opened.value;
504
- return ok(await land(threadId, token, state.document, removeBlock(state.document, { targetId: input.targetId }, state.snapshot), (previous) => [holderIdOf(previous, input.targetId)],
569
+ const { opened } = opening;
570
+ const { threadId, analysisId, state } = opened;
571
+ return ok(await land(opened, removeBlock(state.document, { targetId: input.targetId }, state.snapshot), (previous) => [holderIdOf(previous, input.targetId)],
505
572
  // The next document holds no removed block, thus the event states the kind that the
506
573
  // previous one carried.
507
574
  (previous) => blockActOf("remove-block", { analysisId, threadId }, previous, input.targetId)));
@@ -512,19 +579,19 @@ export function createReportAuthoringTools(gateway, deps = {}) {
512
579
  description: "Move one block by its id to a new destination. Name the destination with `parentId` and one of `place`, `before`, or `after`. " +
513
580
  "A section cannot move into its own subtree.",
514
581
  inputSchema: moveBlockInput,
515
- executionMode: AUTHORING_EXECUTION_MODE,
516
582
  describeCall: (input) => `move ${input.targetId}`,
517
583
  execute: async (input, ctx) => {
518
- const opened = await openThread(ctx);
519
- if (opened.isErr()) {
520
- return ok(refuse(opened.error));
584
+ const opening = await openMutation(ctx);
585
+ if ("done" in opening) {
586
+ return ok(opening.done);
521
587
  }
522
- const { threadId, analysisId, state, token } = opened.value;
588
+ const { opened } = opening;
589
+ const { threadId, analysisId, state } = opened;
523
590
  const destination = toDestination(input);
524
591
  if (destination.isErr()) {
525
592
  return ok(refuse(destination.error));
526
593
  }
527
- return ok(await land(threadId, token, state.document, moveBlock(state.document, { targetId: input.targetId, destination: destination.value }, state.snapshot), (previous, next) => [holderIdOf(previous, input.targetId), holderIdOf(next, input.targetId)], (_previous, next) => blockActOf("move-block", { analysisId, threadId }, next, input.targetId)));
594
+ return ok(await land(opened, moveBlock(state.document, { targetId: input.targetId, destination: destination.value }, state.snapshot), (previous, next) => [holderIdOf(previous, input.targetId), holderIdOf(next, input.targetId)], (_previous, next) => blockActOf("move-block", { analysisId, threadId }, next, input.targetId)));
528
595
  },
529
596
  });
530
597
  const set_title = defineTool({
@@ -532,16 +599,16 @@ export function createReportAuthoringTools(gateway, deps = {}) {
532
599
  description: "Set the title of the report document. A draft starts with no title, and a document needs one. " +
533
600
  "The title names the whole report, and it is not the title of a section.",
534
601
  inputSchema: setTitleInput,
535
- executionMode: AUTHORING_EXECUTION_MODE,
536
602
  describeCall: (input) => `title the report ${input.title}`,
537
603
  // The title sits on the document, thus no container changes its child order.
538
604
  execute: async (input, ctx) => {
539
- const opened = await openThread(ctx);
540
- if (opened.isErr()) {
541
- return ok(refuse(opened.error));
605
+ const opening = await openMutation(ctx);
606
+ if ("done" in opening) {
607
+ return ok(opening.done);
542
608
  }
543
- const { threadId, analysisId, state, token } = opened.value;
544
- return ok(await land(threadId, token, state.document, ok(setTitle(state.document, input.title)), () => [], () => [
609
+ const { opened } = opening;
610
+ const { threadId, analysisId, state } = opened;
611
+ return ok(await land(opened, ok(setTitle(state.document, input.title)), () => [], () => [
545
612
  {
546
613
  type: "set-title",
547
614
  analysisId,
@@ -557,7 +624,6 @@ export function createReportAuthoringTools(gateway, deps = {}) {
557
624
  "A label that ends with the character … is clipped. Use the outline as the primary view of the draft, " +
558
625
  "and read one block when the label is not enough.",
559
626
  inputSchema: readOutlineInput,
560
- executionMode: AUTHORING_EXECUTION_MODE,
561
627
  // The input carries no field, thus a hook can only restate the name of the tool.
562
628
  describeCall: "none",
563
629
  execute: async (_input, ctx) => {
@@ -574,16 +640,17 @@ export function createReportAuthoringTools(gateway, deps = {}) {
574
640
  "because the session owns the hash. A section gives its title and the id of each child, " +
575
641
  "because the outline already names every block under it. Use it when the outline label is not enough.",
576
642
  inputSchema: readBlockInput,
577
- executionMode: AUTHORING_EXECUTION_MODE,
578
643
  describeCall: (input) => `read ${input.targetId}`,
579
644
  execute: async (input, ctx) => {
580
645
  const opened = await openThread(ctx);
581
646
  if (opened.isErr()) {
582
647
  return ok({ refused: opened.error });
583
648
  }
584
- const block = readBlock(opened.value.state.document, input.targetId);
585
- const result = block !== undefined ? { found: true, block } : { found: false };
586
- return ok(result);
649
+ return readBlock(opened.value.state.document, input.targetId).match((block) => ok(block !== undefined ? { found: true, block } : { found: false }), (refused) => err({
650
+ error: `the stored block ${refused.id} does not match the authoring grammar, thus it cannot be read`,
651
+ retryable: false,
652
+ cause: refused.cause,
653
+ }));
587
654
  },
588
655
  });
589
656
  const finish_draft = defineTool({
@@ -593,7 +660,6 @@ export function createReportAuthoringTools(gateway, deps = {}) {
593
660
  "preview_report and record_report_version run the same check before they act, thus a finish directly before one of them does that check a second time. " +
594
661
  "Use it to make sure that the draft passes the whole document schema, the id rule, and the structural tier.",
595
662
  inputSchema: finishDraftInput,
596
- executionMode: AUTHORING_EXECUTION_MODE,
597
663
  // The input carries no field, thus a hook can only restate the name of the tool.
598
664
  describeCall: "none",
599
665
  execute: async (_input, ctx) => {