@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
@@ -12,19 +12,23 @@
12
12
  */
13
13
  import { err, ok } from "neverthrow";
14
14
  import { SubmitFileMetadataInputSchema } from "../../schemas/file-metadata.js";
15
- import { defineTool } from "../define-tool.js";
15
+ import { defineTool, withToolCallRecord } from "../define-tool.js";
16
16
  export const SUBMIT_FILE_METADATA_TOOL_ID = "submit_file_metadata";
17
17
  export function createFileMetadataCell() {
18
18
  let knownPaths = null;
19
- const descriptions = new Map();
19
+ const described = new Set();
20
20
  return {
21
21
  get knownPaths() {
22
22
  return knownPaths;
23
23
  },
24
- descriptions,
24
+ described,
25
25
  expect(paths) {
26
26
  knownPaths = new Set(paths);
27
- descriptions.clear();
27
+ described.clear();
28
+ },
29
+ fold(paths) {
30
+ for (const path of paths)
31
+ described.add(path);
28
32
  },
29
33
  };
30
34
  }
@@ -40,28 +44,21 @@ export function createSubmitFileMetadataTool(cell) {
40
44
  "the unknownPaths and describe the remaining files.",
41
45
  inputSchema: SubmitFileMetadataInputSchema,
42
46
  describeCall: "none",
43
- execute: async (input) => {
47
+ execute: (input) => {
44
48
  const knownPaths = cell.knownPaths;
45
49
  if (knownPaths === null) {
46
- return err({
50
+ return Promise.resolve(err({
47
51
  error: "No list of files is known yet. The harness asks for the file metadata after the task, with the list of the files.",
48
52
  retryable: false,
49
- });
50
- }
51
- const unknownPaths = [];
52
- for (const entry of input.files) {
53
- if (!knownPaths.has(entry.path)) {
54
- unknownPaths.push(entry.path);
55
- continue;
56
- }
57
- cell.descriptions.set(entry.path, entry);
53
+ }));
58
54
  }
59
- const remaining = [...knownPaths].filter((path) => !cell.descriptions.has(path));
60
- return ok({
61
- accepted: unknownPaths.length === 0 && remaining.length === 0,
62
- unknownPaths,
63
- remaining,
64
- });
55
+ const unknownPaths = input.files.map((entry) => entry.path).filter((path) => !knownPaths.has(path));
56
+ const described = input.files.map((entry) => entry.path).filter((path) => knownPaths.has(path));
57
+ const covered = new Set([...cell.described, ...described]);
58
+ const remaining = [...knownPaths].filter((path) => !covered.has(path));
59
+ const outcome = { accepted: unknownPaths.length === 0 && remaining.length === 0, unknownPaths, remaining };
60
+ return Promise.resolve(ok(withToolCallRecord(outcome, { described })));
65
61
  },
62
+ foldCallRecord: (record) => cell.fold(record.described),
66
63
  });
67
64
  }
@@ -12,17 +12,23 @@
12
12
  * past the anchor of the newest report child, the tool starts nothing and it
13
13
  * names that child. The spawn runs last.
14
14
  *
15
+ * Inside a durable step, the child id is the UUIDv5 of the key of the step. A
16
+ * rerun of the call after the spawn, before the checkpoint of the step, finds
17
+ * that child. It skips the advice, and it gives the same session and the same
18
+ * part.
19
+ *
15
20
  * Each degraded condition is a typed outcome in the ok channel: a scope with no
16
21
  * thread id, a composition with no eyes, the advice, each refusal of the spawn,
17
22
  * and a store fault. The tool never throws for one of them.
18
23
  */
19
- import type { Pool } from "pg";
24
+ import type { Querier } from "../state/db.js";
20
25
  import { z } from "zod";
21
26
  import type { EnsureSessionStateResult } from "../app/report-session-runtime.js";
22
27
  import type { ChromeConfig } from "../lib/chrome.js";
28
+ import { type Connectable } from "../lib/db-result.js";
23
29
  import type { AcquireEyes } from "../lib/eyes.js";
24
30
  import type { Logger } from "../lib/logger.js";
25
- import type { ThreadType } from "../memory/thread-store.js";
31
+ import { type ThreadType } from "../memory/thread-store.js";
26
32
  import { type Tool } from "./define-tool.js";
27
33
  import type { ProvenanceSeam } from "../provenance/seam.js";
28
34
  /**
@@ -85,8 +91,8 @@ export type StartReportSessionResult = {
85
91
  * a page. A composition that binds a capture seam straight to the spawn still
86
92
  * opens the gate of that spawn.
87
93
  */
88
- export interface StartReportSessionToolDeps {
89
- readonly pool: Pool;
94
+ export type StartReportSessionToolDeps = {
95
+ readonly pool: Querier & Connectable;
90
96
  readonly chrome: ChromeConfig;
91
97
  /**
92
98
  * The eyes seam of the composition. A bound seam gives a browser for one
@@ -107,7 +113,9 @@ export interface StartReportSessionToolDeps {
107
113
  */
108
114
  readonly provenance?: ProvenanceSeam;
109
115
  readonly logger?: Logger;
110
- }
116
+ /** The key of the durable step that runs the call, `undefined` outside one. Defaults to {@link durableStepKey}. */
117
+ readonly stepKey?: () => string | undefined;
118
+ };
111
119
  /**
112
120
  * Make the tool that starts a report session, over one Postgres pool and the
113
121
  * eyes of the composition.
@@ -12,6 +12,11 @@
12
12
  * past the anchor of the newest report child, the tool starts nothing and it
13
13
  * names that child. The spawn runs last.
14
14
  *
15
+ * Inside a durable step, the child id is the UUIDv5 of the key of the step. A
16
+ * rerun of the call after the spawn, before the checkpoint of the step, finds
17
+ * that child. It skips the advice, and it gives the same session and the same
18
+ * part.
19
+ *
15
20
  * Each degraded condition is a typed outcome in the ok channel: a scope with no
16
21
  * thread id, a composition with no eyes, the advice, each refusal of the spawn,
17
22
  * and a store fault. The tool never throws for one of them.
@@ -21,7 +26,9 @@ import { z } from "zod";
21
26
  import { compositionHasEyes, createReportSessionSpawn } from "../app/spawn-report-session.js";
22
27
  import { createNoopLogger } from "../lib/console-logger.js";
23
28
  import { describeDbError } from "../lib/db-result.js";
29
+ import { createThreadStore } from "../memory/thread-store.js";
24
30
  import { defineTool } from "./define-tool.js";
31
+ import { durableStepKey, stepUuid } from "./workspace/edit-file.js";
25
32
  /**
26
33
  * The character bound of each brief field. The whole brief lands in one durable
27
34
  * message row, thus the schema holds no unbounded string out of the store.
@@ -107,12 +114,14 @@ export function createStartReportSessionTool(deps) {
107
114
  const spawnDeps = {
108
115
  pool: deps.pool,
109
116
  chrome: deps.chrome,
110
- ...(deps.eyes ? { eyes: deps.eyes } : {}),
111
- ...(deps.anchorSession ? { anchorSession: deps.anchorSession } : {}),
112
- ...(deps.provenance ? { provenance: deps.provenance } : {}),
113
- ...(deps.logger ? { logger: deps.logger } : {}),
117
+ eyes: deps.eyes,
118
+ anchorSession: deps.anchorSession,
119
+ provenance: deps.provenance,
120
+ logger: deps.logger,
114
121
  };
115
122
  const spawn = createReportSessionSpawn(spawnDeps);
123
+ const threads = createThreadStore(deps.pool);
124
+ const stepKey = deps.stepKey ?? durableStepKey;
116
125
  // The gate reads the routes of the very spawn below, thus the two answers
117
126
  // come from one value. The routes are fixed at construction, thus the gate
118
127
  // reads one boolean and never a live probe of the sidecar.
@@ -132,7 +141,6 @@ export function createStartReportSessionTool(deps) {
132
141
  "`no_browser` means that this deployment has no browser for the report agent, thus no report session can start; tell the user. " +
133
142
  "`refused`, `parent_not_found`, `parent_not_a_conversation`, and `failed` mean that nothing started, and `detail` gives the reason where there is one.",
134
143
  inputSchema: startReportSessionInput,
135
- executionMode: "inline",
136
144
  describeCall: "none",
137
145
  execute: async (input, ctx) => {
138
146
  const brief = {
@@ -143,16 +151,35 @@ export function createStartReportSessionTool(deps) {
143
151
  openQuestions: input.openQuestions,
144
152
  };
145
153
  const { scope } = ctx.session;
146
- if (scope.kind !== "analysis" || scope.threadId === undefined || scope.threadId.length === 0) {
154
+ if (scope.threadId === undefined || scope.threadId.length === 0) {
147
155
  return ok({ outcome: "refused", detail: NO_THREAD_SCOPE_DETAIL });
148
156
  }
149
157
  const parentThreadId = scope.threadId;
158
+ // Inside a durable step the child id comes from the step, thus a rerun of
159
+ // the call finds the child of its first run. The advice would name that
160
+ // child as an existing session, thus a found child skips the advice, and
161
+ // the spawn gives the child back with no second write.
162
+ const key = stepKey();
163
+ const childThreadId = key === undefined ? undefined : stepUuid(key);
164
+ let rerun = false;
165
+ if (childThreadId !== undefined) {
166
+ const earlier = await threads.getThread(childThreadId);
167
+ if (earlier.isErr()) {
168
+ logger.warn("the child of an earlier run did not read", {
169
+ parentThreadId,
170
+ reason: earlier.error.type,
171
+ ...logger.errorFields(earlier.error.cause),
172
+ });
173
+ return ok(toOutcome(earlier.error));
174
+ }
175
+ rerun = earlier.value !== null;
176
+ }
150
177
  // The eyes gate has priority over the advice, and the advice costs two
151
178
  // reads. The spawn holds the same gate before each read of its own,
152
179
  // thus a blind composition reaches the `no_browser` refusal of the
153
180
  // spawn with no read and no write. As a result the tool copies no
154
181
  // detail line of the spawn.
155
- if (eyesAvailable) {
182
+ if (eyesAvailable && !rerun) {
156
183
  const delta = await spawn.reportSessionDelta(parentThreadId);
157
184
  if (delta.isErr()) {
158
185
  logger.warn("the report session delta did not read", {
@@ -172,7 +199,7 @@ export function createStartReportSessionTool(deps) {
172
199
  return ok({ outcome: "existing-session", threadId: newestChild.threadId, title: newestChild.title });
173
200
  }
174
201
  }
175
- const spawned = await spawn.spawnReportSession(parentThreadId, brief);
202
+ const spawned = await spawn.spawnReportSession(parentThreadId, brief, childThreadId);
176
203
  if (spawned.isOk()) {
177
204
  const child = spawned.value;
178
205
  // The part rides the started arm only. The existing-session arm
@@ -0,0 +1,14 @@
1
+ /**
2
+ * The text of a terminal call: a clarification question or a blocker reason.
3
+ *
4
+ * A terminal call whose text is a placeholder ends a run with nothing. A small
5
+ * model emits such a call when it drafts several calls at once and fills the
6
+ * text later, or never. The input schema of the tool names the fault, the call
7
+ * gets an error result, and the loop continues with the real work.
8
+ */
9
+ import { z } from "zod";
10
+ export declare const MIN_TERMINAL_TEXT = 4;
11
+ /** The reason a text cannot end a run, or undefined when it can. */
12
+ export declare function degenerateTerminalText(text: string): string | undefined;
13
+ /** The text of a terminal call. The schema refuses a placeholder, and the issue says what to do instead. */
14
+ export declare function terminalTextSchema(description: string): z.ZodString;
@@ -0,0 +1,51 @@
1
+ /**
2
+ * The text of a terminal call: a clarification question or a blocker reason.
3
+ *
4
+ * A terminal call whose text is a placeholder ends a run with nothing. A small
5
+ * model emits such a call when it drafts several calls at once and fills the
6
+ * text later, or never. The input schema of the tool names the fault, the call
7
+ * gets an error result, and the loop continues with the real work.
8
+ */
9
+ import { z } from "zod";
10
+ // oxlint-disable-next-line eslint-js/no-restricted-syntax -- the anchored placeholder words and their n/a spellings, at the start of the text; the alternation is the guard's own word list.
11
+ const PLACEHOLDER_TEXT = /^\s*(?:placeholder|todo|tbd|skip|n\/?a|none|null|test|x+|\.+|-+)\b/i;
12
+ export const MIN_TERMINAL_TEXT = 4;
13
+ /** The reason a text cannot end a run, or undefined when it can. */
14
+ export function degenerateTerminalText(text) {
15
+ const trimmed = text.trim();
16
+ if (trimmed.length < MIN_TERMINAL_TEXT)
17
+ return `The text has ${trimmed.length} characters, and a real question or reason has at least ${MIN_TERMINAL_TEXT}.`;
18
+ if (PLACEHOLDER_TEXT.test(trimmed) || holdsStandaloneWord(trimmed, "placeholder"))
19
+ return "The text is a placeholder.";
20
+ return undefined;
21
+ }
22
+ /** The text of a terminal call. The schema refuses a placeholder, and the issue says what to do instead. */
23
+ export function terminalTextSchema(description) {
24
+ return z
25
+ .string()
26
+ .min(1)
27
+ .check(z.superRefine((text, ctx) => {
28
+ const degenerate = degenerateTerminalText(text);
29
+ if (degenerate !== undefined)
30
+ ctx.addIssue({ code: "custom", message: `${degenerate} Give the real text, or continue the work.` });
31
+ }))
32
+ .describe(description);
33
+ }
34
+ /** Whether `word` occurs in `text` as a standalone word, case-insensitively. */
35
+ function holdsStandaloneWord(text, word) {
36
+ const lower = text.toLowerCase();
37
+ const needle = word.toLowerCase();
38
+ let at = lower.indexOf(needle);
39
+ while (at >= 0) {
40
+ const boundedBefore = at === 0 || !isWordChar(lower.charAt(at - 1));
41
+ const end = at + needle.length;
42
+ const boundedAfter = end >= lower.length || !isWordChar(lower.charAt(end));
43
+ if (boundedBefore && boundedAfter)
44
+ return true;
45
+ at = lower.indexOf(needle, at + 1);
46
+ }
47
+ return false;
48
+ }
49
+ function isWordChar(char) {
50
+ return (char >= "a" && char <= "z") || (char >= "A" && char <= "Z") || (char >= "0" && char <= "9") || char === "_";
51
+ }
@@ -0,0 +1,81 @@
1
+ /**
2
+ * The decision record of a rendered script, as the file tools keep it true
3
+ * after the render. `knowledge_template` writes the record beside the
4
+ * script with the digest of the bytes it wrote. A later change of the
5
+ * script through `edit_file` appends an entry to `unvetted_edits` with the
6
+ * digest after the change, and `execute_command` compares the script it is
7
+ * about to run with the last recorded digest, thus a change by any other
8
+ * path is recorded before the script runs. The record then connects the
9
+ * cited decision to the bytes that ran, and an empty `unvetted_edits` is a
10
+ * fact and not an assumption.
11
+ */
12
+ import type { AgentSession } from "../../auth/types.js";
13
+ import type { WorkspaceFilesystem } from "../../workspace/filesystem.js";
14
+ import type { MutateToolName, WorkspaceMutator, WriteRecord } from "./mutator.js";
15
+ /**
16
+ * The path of the decision record of one rendered script inside the step:
17
+ * `output/decision_record_<script stem>.json`. One record per render, thus a
18
+ * step that renders two scripts keeps both records.
19
+ */
20
+ export declare function decisionRecordPath(scriptFile: string): string;
21
+ /**
22
+ * The record path of a script path, or `undefined` when the path is not a
23
+ * script under `scripts/`. A relative `scripts/x.R` gives the relative
24
+ * record path, and an absolute `/<analysisId>/.../scripts/x.R` gives the
25
+ * absolute one, beside it in the same step.
26
+ */
27
+ export declare function decisionRecordPathFor(scriptPath: string): string | undefined;
28
+ export declare function scriptSha256(content: string | Uint8Array): string;
29
+ /** One change of a script after its render, as the record keeps it. */
30
+ export type UnvettedEdit = {
31
+ readonly path: string;
32
+ readonly note: string;
33
+ /** The digest of the script after the change. */
34
+ readonly sha256: string;
35
+ };
36
+ /** The digest the record expects of the script now: the last recorded change, else the bytes the render wrote. */
37
+ export declare function expectedScriptSha256(record: Readonly<Record<string, unknown>>): string | undefined;
38
+ export type NoteScriptChangeArgs = {
39
+ readonly filesystem: WorkspaceFilesystem;
40
+ readonly mutator: WorkspaceMutator;
41
+ readonly session: AgentSession;
42
+ /** Absolute host base for a relative path; the analysis root when absent. */
43
+ readonly workingDir?: string;
44
+ readonly invocationId: string;
45
+ /** The tool that made the change, for the provenance of the record write. */
46
+ readonly toolName: MutateToolName;
47
+ /** The script path as the tool received it, relative or absolute. */
48
+ readonly scriptPath: string;
49
+ readonly note: string;
50
+ /** The digest of the script after the change. */
51
+ readonly sha256: string;
52
+ };
53
+ /**
54
+ * The outcome of a change note. `noted` carries the record of the write,
55
+ * thus the calling tool carries it as its call record, and its fold hands it
56
+ * to `recordWrite`.
57
+ */
58
+ export type ScriptChangeNote = {
59
+ readonly status: "noted";
60
+ readonly write: WriteRecord;
61
+ } | {
62
+ readonly status: "no_record" | "refused";
63
+ };
64
+ /**
65
+ * Append a change to the record of a script. `no_record` when the path is
66
+ * not a script under `scripts/`, or when no record exists for it, which is
67
+ * the state of every script an agent wrote itself. `refused` when the
68
+ * mutator refused the write of the record, for example a record of another
69
+ * step, outside the writable prefix of this one.
70
+ */
71
+ export declare function noteScriptChange(args: NoteScriptChangeArgs): Promise<ScriptChangeNote>;
72
+ export type ReconcileScriptRecordArgs = Omit<NoteScriptChangeArgs, "note" | "sha256">;
73
+ /**
74
+ * Compare a script with the digest its record expects, before the script
75
+ * runs. A difference is a change that no tool of the host recorded, and it
76
+ * is noted with the digest of the bytes that are about to run. `unchanged`
77
+ * when the digests agree, `no_record` when the script has no record.
78
+ */
79
+ export declare function reconcileScriptRecord(args: ReconcileScriptRecordArgs): Promise<ScriptChangeNote | {
80
+ readonly status: "unchanged";
81
+ }>;
@@ -0,0 +1,127 @@
1
+ /**
2
+ * The decision record of a rendered script, as the file tools keep it true
3
+ * after the render. `knowledge_template` writes the record beside the
4
+ * script with the digest of the bytes it wrote. A later change of the
5
+ * script through `edit_file` appends an entry to `unvetted_edits` with the
6
+ * digest after the change, and `execute_command` compares the script it is
7
+ * about to run with the last recorded digest, thus a change by any other
8
+ * path is recorded before the script runs. The record then connects the
9
+ * cited decision to the bytes that ran, and an empty `unvetted_edits` is a
10
+ * fact and not an assumption.
11
+ */
12
+ import { createHash } from "node:crypto";
13
+ import { posix as posixPath } from "node:path";
14
+ import { z } from "zod";
15
+ import { unwrapOrThrow } from "../../lib/result.js";
16
+ import { safeParseJsonAs } from "../../lib/parse-json.js";
17
+ import { isUnknownArray } from "../../lib/unknown-array.js";
18
+ import { UnknownRecordSchema } from "../../lib/unknown-containers.js";
19
+ /**
20
+ * The path of the decision record of one rendered script inside the step:
21
+ * `output/decision_record_<script stem>.json`. One record per render, thus a
22
+ * step that renders two scripts keeps both records.
23
+ */
24
+ export function decisionRecordPath(scriptFile) {
25
+ const dot = scriptFile.lastIndexOf(".");
26
+ const suffix = scriptFile.slice(dot + 1);
27
+ const isSuffixAlnum = dot !== -1 &&
28
+ suffix.length > 0 &&
29
+ Array.from(suffix).every((char) => (char >= "a" && char <= "z") || (char >= "A" && char <= "Z") || (char >= "0" && char <= "9"));
30
+ const stem = isSuffixAlnum ? scriptFile.slice(0, dot) : scriptFile;
31
+ return `output/decision_record_${stem}.json`;
32
+ }
33
+ /**
34
+ * The record path of a script path, or `undefined` when the path is not a
35
+ * script under `scripts/`. A relative `scripts/x.R` gives the relative
36
+ * record path, and an absolute `/<analysisId>/.../scripts/x.R` gives the
37
+ * absolute one, beside it in the same step.
38
+ */
39
+ export function decisionRecordPathFor(scriptPath) {
40
+ const dir = posixPath.dirname(scriptPath);
41
+ if (posixPath.basename(dir) !== "scripts")
42
+ return undefined;
43
+ const record = decisionRecordPath(posixPath.basename(scriptPath));
44
+ return dir === "scripts" ? record : posixPath.join(posixPath.dirname(dir), record);
45
+ }
46
+ export function scriptSha256(content) {
47
+ return `sha256:${createHash("sha256").update(content).digest("hex")}`;
48
+ }
49
+ const LastEditRecordSchema = z.looseObject({ sha256: z.string() });
50
+ /** The digest the record expects of the script now: the last recorded change, else the bytes the render wrote. */
51
+ export function expectedScriptSha256(record) {
52
+ const edits = isUnknownArray(record.unvetted_edits) ? record.unvetted_edits : [];
53
+ const parsed = LastEditRecordSchema.safeParse(edits.at(-1));
54
+ if (parsed.success)
55
+ return parsed.data.sha256;
56
+ return typeof record.written_sha256 === "string" ? record.written_sha256 : undefined;
57
+ }
58
+ /**
59
+ * Append a change to the record of a script. `no_record` when the path is
60
+ * not a script under `scripts/`, or when no record exists for it, which is
61
+ * the state of every script an agent wrote itself. `refused` when the
62
+ * mutator refused the write of the record, for example a record of another
63
+ * step, outside the writable prefix of this one.
64
+ */
65
+ export async function noteScriptChange(args) {
66
+ const recordPath = decisionRecordPathFor(args.scriptPath);
67
+ if (!recordPath)
68
+ return { status: "no_record" };
69
+ const read = unwrapOrThrow(await args.filesystem.readFile({ session: args.session, path: recordPath, workingDir: args.workingDir }));
70
+ if (read.kind !== "ok")
71
+ return { status: "no_record" };
72
+ let record;
73
+ try {
74
+ const parsed = safeParseJsonAs(read.content.toString("utf8"), UnknownRecordSchema);
75
+ if (!parsed.success)
76
+ return { status: "no_record" };
77
+ record = parsed.data;
78
+ }
79
+ catch {
80
+ return { status: "no_record" };
81
+ }
82
+ const edits = isUnknownArray(record.unvetted_edits) ? record.unvetted_edits : [];
83
+ const entry = { path: args.scriptPath, note: args.note, sha256: args.sha256 };
84
+ const next = { ...record, unvetted_edits: [...edits, entry] };
85
+ const written = await args.mutator.writeFile({
86
+ path: recordPath,
87
+ content: `${JSON.stringify(next, null, 2)}\n`,
88
+ toolName: args.toolName,
89
+ invocationId: args.invocationId,
90
+ session: args.session,
91
+ });
92
+ return written.status === "ok" ? { status: "noted", write: written.record } : { status: "refused" };
93
+ }
94
+ /**
95
+ * Compare a script with the digest its record expects, before the script
96
+ * runs. A difference is a change that no tool of the host recorded, and it
97
+ * is noted with the digest of the bytes that are about to run. `unchanged`
98
+ * when the digests agree, `no_record` when the script has no record.
99
+ */
100
+ export async function reconcileScriptRecord(args) {
101
+ const recordPath = decisionRecordPathFor(args.scriptPath);
102
+ if (!recordPath)
103
+ return { status: "no_record" };
104
+ const base = args.workingDir !== undefined ? { workingDir: args.workingDir } : {};
105
+ const record = unwrapOrThrow(await args.filesystem.readFile({ session: args.session, path: recordPath, ...base }));
106
+ if (record.kind !== "ok")
107
+ return { status: "no_record" };
108
+ let expected;
109
+ try {
110
+ const parsed = safeParseJsonAs(record.content.toString("utf8"), UnknownRecordSchema);
111
+ if (!parsed.success)
112
+ return { status: "no_record" };
113
+ expected = expectedScriptSha256(parsed.data);
114
+ }
115
+ catch {
116
+ return { status: "no_record" };
117
+ }
118
+ if (expected === undefined)
119
+ return { status: "no_record" };
120
+ const script = unwrapOrThrow(await args.filesystem.readFile({ session: args.session, path: args.scriptPath, ...base }));
121
+ if (script.kind !== "ok")
122
+ return { status: "no_record" };
123
+ const actual = scriptSha256(script.content);
124
+ if (actual === expected)
125
+ return { status: "unchanged" };
126
+ return noteScriptChange({ ...args, note: "the script changed by a path no file tool recorded, before it ran", sha256: actual });
127
+ }
@@ -12,10 +12,31 @@
12
12
  * capture-group references, and exactly one of `replace_all=true` or
13
13
  * `expected_matches` gates the write. Provenance hashes the post-edit
14
14
  * content — the mutator records it through the fold of this tool.
15
+ *
16
+ * Inside a durable step, the edit records its intent before the write lands:
17
+ * the hash of the file before, the hash after, and the result. A rerun of the
18
+ * step after the write, before its checkpoint, finds the file at the hash
19
+ * after and gives back the stored result, thus the edit never applies twice.
20
+ * The file at the hash before applies the edit again, and any other hash is a
21
+ * conflict.
15
22
  */
16
- import { type WithToolCallRecord } from "../define-tool.js";
23
+ import { type ResultAsync } from "neverthrow";
24
+ import { z } from "zod";
25
+ import { type Tool, type WithToolCallRecord } from "../define-tool.js";
26
+ import { type DomainError } from "../../lib/result.js";
17
27
  import type { WorkspaceFilesystem } from "../../workspace/filesystem.js";
18
28
  import type { WorkspaceMutator, WriteFileResult, WriteRecord } from "./mutator.js";
29
+ /** The `ok` outcome of an `edit_file` call. */
30
+ export type EditFileOk = {
31
+ readonly status: "ok";
32
+ readonly path: string;
33
+ readonly replacements: number;
34
+ readonly bytesWritten: number;
35
+ /** Regex mode only: 1-based line numbers where the matches started. */
36
+ lines?: readonly number[];
37
+ /** True when the file is a rendered script and its decision record now lists this edit. */
38
+ decision_record_noted?: true;
39
+ };
19
40
  /** Outcome of an `edit_file` call — expected outcomes are data variants, never throws. */
20
41
  export type EditFileResult = {
21
42
  readonly status: "file_not_found";
@@ -44,15 +65,34 @@ export type EditFileResult = {
44
65
  readonly lines: readonly number[];
45
66
  } | Exclude<WriteFileResult, {
46
67
  status: "ok";
47
- }> | WithToolCallRecord<{
48
- readonly status: "ok";
68
+ }> | WithToolCallRecord<EditFileOk, readonly WriteRecord[]>;
69
+ declare const EditFileInputSchema: z.ZodObject<{
70
+ path: z.ZodString;
71
+ old_string: z.ZodString;
72
+ new_string: z.ZodString;
73
+ replace_all: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
74
+ regex: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
75
+ expected_matches: z.ZodOptional<z.ZodNumber>;
76
+ }, z.core.$strip>;
77
+ /** The intent of one `edit_file` call inside a durable step. */
78
+ export type EditIntent = {
79
+ /** `${workflowId}:${stepId}` of the step that runs the call. */
80
+ readonly key: string;
81
+ readonly analysisId: string;
82
+ /** The `/{analysisId}/…` path of the edited file. */
49
83
  readonly path: string;
50
- readonly replacements: number;
51
- readonly bytesWritten: number;
52
- /** Regex mode only: 1-based line numbers where the matches started. */
53
- readonly lines?: readonly number[];
54
- }, WriteRecord>;
55
- export interface EditFileDeps {
84
+ readonly hashBefore: string;
85
+ readonly hashAfter: string;
86
+ readonly result: EditFileOk;
87
+ readonly callRecord: readonly WriteRecord[];
88
+ };
89
+ /** Keeps the intent of each `edit_file` call that runs inside a durable step. */
90
+ export type EditIntentStore = {
91
+ /** A second put of one key replaces the intent. */
92
+ put(intent: EditIntent): ResultAsync<void, DomainError>;
93
+ get(key: string): ResultAsync<EditIntent | null, DomainError>;
94
+ };
95
+ export type EditFileDeps = {
56
96
  readonly mutator: WorkspaceMutator;
57
97
  /** Read seam used to fetch current file content for search/replace. */
58
98
  readonly workspaceFilesystem: WorkspaceFilesystem;
@@ -62,12 +102,13 @@ export interface EditFileDeps {
62
102
  * root, matching the session-scoped mutator's write prefix.
63
103
  */
64
104
  readonly workingDir?: string;
65
- }
66
- export declare function createEditFileTool(deps: EditFileDeps): import("../define-tool.js").Tool<{
67
- path: string;
68
- old_string: string;
69
- new_string: string;
70
- replace_all: boolean;
71
- regex: boolean;
72
- expected_matches?: number | undefined;
73
- }, EditFileResult>;
105
+ readonly intents: EditIntentStore;
106
+ /** The key of the durable step that runs the call, `undefined` outside one. Defaults to {@link durableStepKey}. */
107
+ readonly stepKey?: () => string | undefined;
108
+ };
109
+ /** The key of the DBOS step that runs the call, or `undefined` outside a workflow, where nothing reruns. */
110
+ export declare function durableStepKey(): string | undefined;
111
+ /** An id that each run of one durable step gives again: the UUIDv5 of the step key. With no step key, nothing reruns, thus the id is random. */
112
+ export declare function stepUuid(stepKey: string | undefined): string;
113
+ export declare function createEditFileTool(deps: EditFileDeps): Tool<z.infer<typeof EditFileInputSchema>, EditFileResult>;
114
+ export {};