@inflexa-ai/harness 0.45.1 → 0.46.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (789) hide show
  1. package/README.md +6 -3
  2. package/dist/agents/conversation-agent.d.ts +9 -3
  3. package/dist/agents/conversation-agent.js +34 -33
  4. package/dist/agents/report-session-agent.d.ts +15 -15
  5. package/dist/agents/report-session-agent.js +23 -15
  6. package/dist/agents/sandbox/index.d.ts +1 -1
  7. package/dist/agents/sandbox/index.js +1 -1
  8. package/dist/agents/sandbox/shared.d.ts +12 -14
  9. package/dist/agents/sandbox/shared.js +18 -12
  10. package/dist/agents/sandbox/types.d.ts +4 -4
  11. package/dist/agents/sandbox/validate-skills.d.ts +2 -2
  12. package/dist/agents/sandbox/validate-skills.js +3 -1
  13. package/dist/agents/sandbox-catalog.d.ts +2 -2
  14. package/dist/agents/sandbox-catalog.js +3 -3
  15. package/dist/agents/system-prompt.d.ts +2 -2
  16. package/dist/app/chat-turn-workflow.d.ts +114 -0
  17. package/dist/app/chat-turn-workflow.js +307 -0
  18. package/dist/app/chat-turn.d.ts +85 -57
  19. package/dist/app/chat-turn.js +123 -100
  20. package/dist/app/data-profile-orientation.js +10 -8
  21. package/dist/app/data-profile-view.d.ts +4 -4
  22. package/dist/app/data-profile-view.js +9 -8
  23. package/dist/app/in-process-turn.d.ts +42 -0
  24. package/dist/app/in-process-turn.js +139 -0
  25. package/dist/app/message-assembly.d.ts +10 -4
  26. package/dist/app/message-assembly.js +13 -8
  27. package/dist/app/report-session-runtime.d.ts +4 -4
  28. package/dist/app/report-session-runtime.js +36 -21
  29. package/dist/app/spawn-report-session.d.ts +33 -28
  30. package/dist/app/spawn-report-session.js +25 -40
  31. package/dist/app/synthesize-run.d.ts +22 -16
  32. package/dist/app/synthesize-run.js +41 -35
  33. package/dist/app/work.d.ts +96 -0
  34. package/dist/app/work.js +147 -0
  35. package/dist/auth/local-auth-context.d.ts +1 -3
  36. package/dist/auth/local-auth-context.js +1 -3
  37. package/dist/auth/local-run-authorizer.d.ts +1 -1
  38. package/dist/auth/local-run-authorizer.js +5 -3
  39. package/dist/auth/types.d.ts +26 -26
  40. package/dist/billing/cached-resolver.d.ts +4 -4
  41. package/dist/billing/run-charge.d.ts +5 -8
  42. package/dist/billing/run-charge.js +2 -2
  43. package/dist/billing/usage-recorder.d.ts +9 -9
  44. package/dist/citations/aggregate.js +1 -1
  45. package/dist/citations/clients/arxiv.d.ts +2 -2
  46. package/dist/citations/clients/arxiv.js +12 -4
  47. package/dist/citations/clients/common.js +4 -2
  48. package/dist/citations/clients/crossref.d.ts +2 -2
  49. package/dist/citations/clients/crossref.js +37 -37
  50. package/dist/citations/clients/doi-registry.js +15 -16
  51. package/dist/citations/clients/pubmed.d.ts +2 -2
  52. package/dist/citations/clients/pubmed.js +20 -13
  53. package/dist/citations/clients/semantic-scholar.d.ts +2 -2
  54. package/dist/citations/clients/semantic-scholar.js +9 -9
  55. package/dist/citations/compare.js +2 -2
  56. package/dist/citations/match.d.ts +2 -2
  57. package/dist/citations/match.js +12 -7
  58. package/dist/citations/normalize.js +35 -26
  59. package/dist/citations/plan.js +6 -2
  60. package/dist/citations/resolve.d.ts +6 -6
  61. package/dist/citations/resolve.js +34 -25
  62. package/dist/citations/types.d.ts +77 -77
  63. package/dist/config/environment-stores.d.ts +6 -6
  64. package/dist/config/resource-limits.js +1 -3
  65. package/dist/contracts/analogy-report.d.ts +7 -7
  66. package/dist/contracts/analogy-report.js +2 -2
  67. package/dist/contracts/chat-events.d.ts +38 -24
  68. package/dist/contracts/chat-frame.d.ts +15 -5
  69. package/dist/contracts/chat-frame.js +64 -41
  70. package/dist/contracts/chat-parts.d.ts +130 -67
  71. package/dist/contracts/chat-parts.js +1 -0
  72. package/dist/contracts/content-url.js +16 -2
  73. package/dist/contracts/data-profile.d.ts +38 -38
  74. package/dist/contracts/index.d.ts +2 -2
  75. package/dist/contracts/index.js +1 -1
  76. package/dist/contracts/message.d.ts +6 -6
  77. package/dist/contracts/organ-system.d.ts +11 -11
  78. package/dist/contracts/part-registry.d.ts +5 -4
  79. package/dist/contracts/part-registry.js +5 -0
  80. package/dist/contracts/profile-vocabulary.d.ts +11 -10
  81. package/dist/contracts/profile-vocabulary.js +10 -3
  82. package/dist/contracts/report-blocks.d.ts +329 -329
  83. package/dist/contracts/report-reference.d.ts +105 -81
  84. package/dist/contracts/report-reference.js +30 -13
  85. package/dist/contracts/schemas/chat-events.d.ts +30 -16
  86. package/dist/contracts/schemas/chat-events.js +15 -6
  87. package/dist/contracts/schemas/chat-parts.d.ts +175 -102
  88. package/dist/contracts/schemas/chat-parts.js +33 -7
  89. package/dist/contracts/severity.d.ts +1 -1
  90. package/dist/contracts/structure-source.d.ts +3 -3
  91. package/dist/contracts/structure-source.js +6 -2
  92. package/dist/contracts/subagent-activity.d.ts +2 -2
  93. package/dist/contracts/subagent-activity.js +5 -3
  94. package/dist/contracts/usage.d.ts +2 -2
  95. package/dist/data/safety-panel-schema.d.ts +25 -25
  96. package/dist/data/safety-panel-schema.js +13 -4
  97. package/dist/execution/artifact-metadata.d.ts +23 -15
  98. package/dist/execution/artifact-metadata.js +33 -10
  99. package/dist/execution/artifact-record.d.ts +2 -2
  100. package/dist/execution/artifact-registration.d.ts +5 -5
  101. package/dist/execution/artifact-registry.d.ts +8 -8
  102. package/dist/execution/dbos-run-launcher.d.ts +24 -4
  103. package/dist/execution/dbos-run-launcher.js +58 -4
  104. package/dist/execution/dbos-workflow-purger.d.ts +5 -6
  105. package/dist/execution/dbos-workflow-purger.js +8 -7
  106. package/dist/execution/input-signature.d.ts +2 -2
  107. package/dist/execution/post-step-pipeline.d.ts +9 -9
  108. package/dist/execution/post-step-pipeline.js +1 -1
  109. package/dist/execution/post-step.js +2 -2
  110. package/dist/execution/reconcile-manifest.d.ts +4 -4
  111. package/dist/execution/reconcile-manifest.js +3 -2
  112. package/dist/execution/run-authorizer.d.ts +46 -37
  113. package/dist/execution/run-authorizer.js +8 -8
  114. package/dist/execution/run-canceler.d.ts +7 -7
  115. package/dist/execution/run-canceler.js +14 -7
  116. package/dist/execution/run-end-record.d.ts +2 -3
  117. package/dist/execution/run-event-parts.d.ts +0 -8
  118. package/dist/execution/run-event-parts.js +29 -24
  119. package/dist/execution/run-event-stream.d.ts +8 -8
  120. package/dist/execution/run-event-stream.js +3 -4
  121. package/dist/execution/run-launcher.d.ts +4 -4
  122. package/dist/execution/run-synthesis.d.ts +49 -48
  123. package/dist/execution/run-synthesis.js +96 -255
  124. package/dist/execution/staged-input.d.ts +2 -2
  125. package/dist/execution/step-summary.d.ts +6 -6
  126. package/dist/execution/step-summary.js +4 -8
  127. package/dist/execution/topo-sort.js +4 -3
  128. package/dist/execution/workflow-purger.d.ts +2 -2
  129. package/dist/index.d.ts +17 -20
  130. package/dist/index.js +25 -36
  131. package/dist/input-sanitization.js +9 -2
  132. package/dist/input-scan/clustering.d.ts +6 -6
  133. package/dist/input-scan/clustering.js +11 -5
  134. package/dist/input-scan/companions.js +3 -2
  135. package/dist/input-scan/detect-sets.d.ts +2 -2
  136. package/dist/input-scan/detect-sets.js +25 -21
  137. package/dist/input-scan/enrich.d.ts +6 -6
  138. package/dist/input-scan/enrich.js +29 -12
  139. package/dist/input-scan/formats.d.ts +2 -2
  140. package/dist/input-scan/formats.js +8 -2
  141. package/dist/input-scan/markers.d.ts +2 -2
  142. package/dist/input-scan/markers.js +14 -5
  143. package/dist/input-scan/menu.d.ts +10 -10
  144. package/dist/input-scan/menu.js +0 -0
  145. package/dist/input-scan/quarantine.d.ts +2 -2
  146. package/dist/input-scan/quarantine.js +23 -18
  147. package/dist/input-scan/readout-budget.d.ts +2 -2
  148. package/dist/input-scan/readout-budget.js +1 -1
  149. package/dist/input-scan/readout.d.ts +2 -2
  150. package/dist/input-scan/readout.js +47 -34
  151. package/dist/input-scan/scan.d.ts +2 -2
  152. package/dist/input-scan/scan.js +7 -5
  153. package/dist/input-scan/set-types.d.ts +28 -28
  154. package/dist/input-scan/shapes.d.ts +4 -4
  155. package/dist/input-scan/shapes.js +0 -0
  156. package/dist/input-scan/templates.d.ts +10 -10
  157. package/dist/input-scan/templates.js +30 -22
  158. package/dist/input-scan/tokens.d.ts +6 -4
  159. package/dist/input-scan/tokens.js +100 -38
  160. package/dist/input-scan/types.d.ts +22 -22
  161. package/dist/lib/async-utils.d.ts +3 -7
  162. package/dist/lib/async-utils.js +5 -9
  163. package/dist/lib/cache.js +1 -1
  164. package/dist/lib/chrome.d.ts +46 -6
  165. package/dist/lib/console-logger.js +2 -2
  166. package/dist/lib/db-result.d.ts +22 -6
  167. package/dist/lib/db-result.js +9 -13
  168. package/dist/lib/eyes.d.ts +4 -4
  169. package/dist/lib/eyes.js +1 -1
  170. package/dist/lib/fs-helpers.js +18 -6
  171. package/dist/lib/fs-result.d.ts +1 -0
  172. package/dist/lib/fs-result.js +5 -6
  173. package/dist/lib/hooks.d.ts +23 -7
  174. package/dist/lib/hooks.js +17 -3
  175. package/dist/lib/host-concurrency.js +3 -2
  176. package/dist/lib/logger.d.ts +2 -2
  177. package/dist/lib/logger.js +2 -1
  178. package/dist/lib/metrics.d.ts +1 -1
  179. package/dist/lib/null-proto.d.ts +6 -0
  180. package/dist/lib/null-proto.js +17 -0
  181. package/dist/lib/otel-spans.d.ts +1 -1
  182. package/dist/lib/otel-spans.js +9 -5
  183. package/dist/lib/otel.d.ts +4 -2
  184. package/dist/lib/otel.js +10 -2
  185. package/dist/lib/page-capture.d.ts +8 -8
  186. package/dist/lib/page-capture.js +9 -4
  187. package/dist/lib/parse-json.d.ts +5 -0
  188. package/dist/lib/parse-json.js +12 -0
  189. package/dist/lib/present.d.ts +12 -0
  190. package/dist/lib/present.js +39 -0
  191. package/dist/lib/rate-limit.d.ts +4 -4
  192. package/dist/lib/rate-limit.js +12 -13
  193. package/dist/lib/regulatory-corpus/fetch-fda-guidance.d.ts +4 -4
  194. package/dist/lib/regulatory-corpus/fetch-fda-guidance.js +4 -10
  195. package/dist/lib/regulatory-corpus/fetch-ich.d.ts +4 -4
  196. package/dist/lib/regulatory-corpus/fetch-ich.js +18 -14
  197. package/dist/lib/regulatory-corpus/normalize-whitespace.d.ts +6 -0
  198. package/dist/lib/regulatory-corpus/normalize-whitespace.js +41 -0
  199. package/dist/lib/regulatory-corpus.d.ts +10 -10
  200. package/dist/lib/regulatory-corpus.js +3 -1
  201. package/dist/lib/result.d.ts +10 -11
  202. package/dist/lib/result.js +15 -13
  203. package/dist/lib/storage.d.ts +2 -2
  204. package/dist/lib/test/async-iterable.d.ts +9 -0
  205. package/dist/lib/test/async-iterable.js +28 -0
  206. package/dist/lib/test/request-url.d.ts +5 -0
  207. package/dist/lib/test/request-url.js +7 -0
  208. package/dist/lib/test/result-assert.d.ts +12 -0
  209. package/dist/lib/test/result-assert.js +17 -0
  210. package/dist/lib/test/text-shapes.d.ts +24 -0
  211. package/dist/lib/test/text-shapes.js +63 -0
  212. package/dist/lib/text.d.ts +22 -0
  213. package/dist/lib/text.js +68 -0
  214. package/dist/lib/thrown.d.ts +18 -0
  215. package/dist/lib/thrown.js +30 -0
  216. package/dist/lib/unknown-array.d.ts +6 -0
  217. package/dist/lib/unknown-array.js +8 -0
  218. package/dist/lib/unknown-containers.d.ts +14 -0
  219. package/dist/lib/unknown-containers.js +17 -0
  220. package/dist/lib/unknown-text.d.ts +8 -0
  221. package/dist/lib/unknown-text.js +28 -0
  222. package/dist/lib/zod-issue-shape.d.ts +1 -1
  223. package/dist/lib/zod-issue-shape.js +31 -31
  224. package/dist/lib/zod-issues.d.ts +3 -3
  225. package/dist/lib/zod-issues.js +30 -17
  226. package/dist/literature/sources/arxiv.d.ts +6 -6
  227. package/dist/literature/sources/arxiv.js +92 -35
  228. package/dist/literature/sources/http.d.ts +2 -2
  229. package/dist/literature/sources/http.js +16 -15
  230. package/dist/literature/sources/pubmed.d.ts +16 -16
  231. package/dist/literature/sources/pubmed.js +96 -61
  232. package/dist/literature/sources/semantic-scholar.d.ts +8 -8
  233. package/dist/literature/sources/semantic-scholar.js +22 -13
  234. package/dist/loop/accounting.d.ts +63 -0
  235. package/dist/loop/accounting.js +141 -0
  236. package/dist/loop/call-policy.d.ts +73 -0
  237. package/dist/loop/call-policy.js +109 -0
  238. package/dist/loop/chat-stream.d.ts +62 -0
  239. package/dist/loop/chat-stream.js +237 -0
  240. package/dist/loop/compaction.d.ts +9 -9
  241. package/dist/loop/compaction.js +1 -1
  242. package/dist/loop/metrics.d.ts +12 -15
  243. package/dist/loop/metrics.js +14 -26
  244. package/dist/loop/run-loop.d.ts +233 -0
  245. package/dist/loop/run-loop.js +770 -0
  246. package/dist/loop/sub-agent.d.ts +61 -0
  247. package/dist/loop/sub-agent.js +161 -0
  248. package/dist/loop/tool-adapter.d.ts +98 -0
  249. package/dist/loop/tool-adapter.js +364 -0
  250. package/dist/loop/tool-detail.d.ts +1 -1
  251. package/dist/loop/tool-detail.js +6 -5
  252. package/dist/loop/tool-outcome.d.ts +1 -1
  253. package/dist/loop/tool-output.d.ts +4 -4
  254. package/dist/loop/tool-output.js +2 -2
  255. package/dist/loop/turn-credentials.d.ts +34 -0
  256. package/dist/loop/turn-credentials.js +73 -0
  257. package/dist/loop/types.d.ts +29 -38
  258. package/dist/loop/types.js +2 -7
  259. package/dist/memory/ai-sdk-message-storage.d.ts +5 -5
  260. package/dist/memory/ai-sdk-message-storage.js +13 -11
  261. package/dist/memory/card-builders.d.ts +14 -14
  262. package/dist/memory/card-builders.js +19 -15
  263. package/dist/memory/conversation-display-recorder.d.ts +22 -4
  264. package/dist/memory/conversation-display-recorder.js +43 -24
  265. package/dist/memory/conversation-display-replay.js +3 -2
  266. package/dist/memory/conversation-display-storage.d.ts +15 -7
  267. package/dist/memory/conversation-display-storage.js +141 -36
  268. package/dist/memory/conversation-view.d.ts +4 -4
  269. package/dist/memory/conversation-view.js +5 -4
  270. package/dist/memory/count-tokens.js +10 -8
  271. package/dist/memory/derive-thread-title.d.ts +0 -13
  272. package/dist/memory/derive-thread-title.js +2 -1
  273. package/dist/memory/message-backfill.d.ts +12 -5
  274. package/dist/memory/message-backfill.js +5 -3
  275. package/dist/memory/thread-history.d.ts +36 -21
  276. package/dist/memory/thread-history.js +78 -54
  277. package/dist/memory/thread-store.d.ts +26 -17
  278. package/dist/memory/thread-store.js +15 -9
  279. package/dist/memory/tool-call-integrity.d.ts +2 -2
  280. package/dist/memory/tool-call-integrity.js +4 -3
  281. package/dist/memory/working-memory.d.ts +16 -12
  282. package/dist/memory/working-memory.js +72 -61
  283. package/dist/prompts/briefing.d.ts +12 -12
  284. package/dist/prompts/briefing.js +1 -1
  285. package/dist/prompts/synthesis-agent.d.ts +1 -1
  286. package/dist/prompts/synthesis-agent.js +6 -14
  287. package/dist/provenance/collector.d.ts +6 -6
  288. package/dist/provenance/collector.js +15 -8
  289. package/dist/provenance/exec-frame.d.ts +2 -2
  290. package/dist/provenance/exec-frame.js +6 -1
  291. package/dist/provenance/seam.d.ts +1 -4
  292. package/dist/provenance/types.d.ts +6 -6
  293. package/dist/providers/ai-sdk.d.ts +113 -62
  294. package/dist/providers/ai-sdk.js +283 -518
  295. package/dist/providers/embedding.d.ts +2 -2
  296. package/dist/providers/embedding.js +1 -1
  297. package/dist/providers/errors.d.ts +22 -2
  298. package/dist/providers/errors.js +98 -50
  299. package/dist/providers/prompt-cache.d.ts +8 -8
  300. package/dist/providers/prompt-cache.js +13 -11
  301. package/dist/providers/reasoning.d.ts +2 -2
  302. package/dist/providers/reasoning.js +2 -2
  303. package/dist/providers/types.d.ts +55 -94
  304. package/dist/reference-data/catalog.d.ts +2 -15
  305. package/dist/reference-data/catalog.js +25 -8
  306. package/dist/reference-data/receipt.d.ts +2 -2
  307. package/dist/report-model/assert-rules.js +1 -1
  308. package/dist/report-model/authoring-grammar.d.ts +211 -233
  309. package/dist/report-model/block-walk.d.ts +10 -10
  310. package/dist/report-model/block-walk.js +2 -0
  311. package/dist/report-model/draft-finish.d.ts +8 -8
  312. package/dist/report-model/draft-finish.js +1 -1
  313. package/dist/report-model/draft-hash.js +8 -7
  314. package/dist/report-model/draft-operations.d.ts +22 -10
  315. package/dist/report-model/draft-operations.js +48 -30
  316. package/dist/report-model/draft-read.d.ts +19 -7
  317. package/dist/report-model/draft-read.js +16 -6
  318. package/dist/report-model/draft.d.ts +844 -2
  319. package/dist/report-model/draft.js +3 -1
  320. package/dist/report-model/fixture-resolver.js +39 -16
  321. package/dist/report-model/pin-snapshot.d.ts +2 -2
  322. package/dist/report-model/pin-snapshot.js +15 -15
  323. package/dist/report-model/production-resolver.d.ts +18 -18
  324. package/dist/report-model/production-resolver.js +50 -42
  325. package/dist/report-model/reference-resolver.d.ts +26 -10
  326. package/dist/report-model/reference-resolver.js +68 -5
  327. package/dist/report-model/reference-stamp.js +30 -38
  328. package/dist/report-model/structural-validation.js +12 -4
  329. package/dist/report-model/validate.d.ts +7 -7
  330. package/dist/report-model/validate.js +6 -6
  331. package/dist/report-render/assets.d.ts +2 -2
  332. package/dist/report-render/assets.js +27 -3
  333. package/dist/report-render/chart-export.d.ts +10 -2
  334. package/dist/report-render/chart-export.js +37 -11
  335. package/dist/report-render/chart-presets.d.ts +8 -8
  336. package/dist/report-render/chart-presets.js +3 -3
  337. package/dist/report-render/chart-renderers.d.ts +23 -16
  338. package/dist/report-render/chart-renderers.js +74 -53
  339. package/dist/report-render/chart-toolbox.d.ts +2 -2
  340. package/dist/report-render/chart-toolbox.js +7 -6
  341. package/dist/report-render/chart.d.ts +15 -16
  342. package/dist/report-render/chart.js +369 -252
  343. package/dist/report-render/design.d.ts +36 -297
  344. package/dist/report-render/design.js +0 -12
  345. package/dist/report-render/figures/common.d.ts +12 -12
  346. package/dist/report-render/figures/common.js +42 -31
  347. package/dist/report-render/figures/dendrogram.d.ts +3 -3
  348. package/dist/report-render/figures/dendrogram.js +10 -10
  349. package/dist/report-render/figures/dense.js +15 -8
  350. package/dist/report-render/figures/dotplot.js +46 -33
  351. package/dist/report-render/figures/embedding.js +52 -43
  352. package/dist/report-render/figures/equal-units.d.ts +10 -10
  353. package/dist/report-render/figures/equal-units.js +27 -27
  354. package/dist/report-render/figures/forest.js +9 -7
  355. package/dist/report-render/figures/gsea.js +21 -11
  356. package/dist/report-render/figures/heatmap.js +13 -9
  357. package/dist/report-render/figures/index.d.ts +10 -10
  358. package/dist/report-render/figures/index.js +4 -2
  359. package/dist/report-render/figures/km.js +10 -9
  360. package/dist/report-render/figures/label-room.d.ts +12 -12
  361. package/dist/report-render/figures/label-room.js +7 -2
  362. package/dist/report-render/figures/locuszoom.d.ts +2 -2
  363. package/dist/report-render/figures/locuszoom.js +59 -31
  364. package/dist/report-render/figures/lollipop.js +3 -2
  365. package/dist/report-render/figures/ma.js +8 -4
  366. package/dist/report-render/figures/manhattan.d.ts +1 -2
  367. package/dist/report-render/figures/manhattan.js +52 -34
  368. package/dist/report-render/figures/oncoprint.js +4 -5
  369. package/dist/report-render/figures/pca.js +25 -11
  370. package/dist/report-render/figures/qq.js +20 -9
  371. package/dist/report-render/figures/roc.js +1 -1
  372. package/dist/report-render/figures/sankey.d.ts +2 -2
  373. package/dist/report-render/figures/sankey.js +11 -10
  374. package/dist/report-render/figures/upset.d.ts +6 -6
  375. package/dist/report-render/figures/upset.js +7 -4
  376. package/dist/report-render/figures/volcano.js +12 -10
  377. package/dist/report-render/hybrid-svg.d.ts +4 -4
  378. package/dist/report-render/hybrid-svg.js +7 -5
  379. package/dist/report-render/number-format.d.ts +4 -4
  380. package/dist/report-render/number-format.js +62 -27
  381. package/dist/report-render/page.js +2 -1
  382. package/dist/report-render/provenance-data.d.ts +2 -2
  383. package/dist/report-render/references.d.ts +4 -4
  384. package/dist/report-render/render.d.ts +2 -2
  385. package/dist/report-render/render.js +10 -11
  386. package/dist/report-render/script-json.js +1 -1
  387. package/dist/report-render/table-data.d.ts +6 -6
  388. package/dist/report-render/test/options.d.ts +49 -0
  389. package/dist/report-render/test/options.js +143 -0
  390. package/dist/report-render/test/page-function.d.ts +19 -0
  391. package/dist/report-render/test/page-function.js +33 -0
  392. package/dist/report-render/types.d.ts +10 -10
  393. package/dist/report-render/value-bridge.d.ts +4 -4
  394. package/dist/report-render/value-bridge.js +27 -14
  395. package/dist/report-render/views/chart-view.d.ts +2 -2
  396. package/dist/report-render/views/chart-view.js +2 -2
  397. package/dist/report-render/views/lineage.d.ts +6 -6
  398. package/dist/report-render/views/lineage.js +2 -0
  399. package/dist/report-render/views/page-view.d.ts +2 -2
  400. package/dist/report-render/views/page-view.js +1 -0
  401. package/dist/report-render/views/prose.js +25 -8
  402. package/dist/report-render/views/references-view.js +12 -1
  403. package/dist/report-render/views/values.js +1 -1
  404. package/dist/runtime/assemble.d.ts +53 -26
  405. package/dist/runtime/assemble.js +103 -56
  406. package/dist/runtime/boot.d.ts +8 -7
  407. package/dist/runtime/boot.js +1 -1
  408. package/dist/runtime/connection-budget.d.ts +6 -6
  409. package/dist/runtime/connection-budget.js +1 -1
  410. package/dist/runtime/dbos.d.ts +29 -19
  411. package/dist/runtime/dbos.js +35 -20
  412. package/dist/runtime/result-serialization.js +18 -5
  413. package/dist/runtime/shutdown.d.ts +2 -2
  414. package/dist/sandbox/client.d.ts +7 -3
  415. package/dist/sandbox/cpu-files.d.ts +2 -2
  416. package/dist/sandbox/cpu-files.js +21 -4
  417. package/dist/sandbox/create-sandbox.d.ts +7 -8
  418. package/dist/sandbox/create-sandbox.js +6 -12
  419. package/dist/sandbox/docker-client.d.ts +48 -3
  420. package/dist/sandbox/docker-client.js +10 -6
  421. package/dist/sandbox/estimate-data-profile-resources.js +2 -7
  422. package/dist/sandbox/exec-outcome.d.ts +2 -2
  423. package/dist/sandbox/exec-outcome.js +1 -1
  424. package/dist/sandbox/exec.d.ts +10 -6
  425. package/dist/sandbox/exec.js +27 -12
  426. package/dist/sandbox/execution-id.js +14 -6
  427. package/dist/sandbox/farm.d.ts +2 -2
  428. package/dist/sandbox/farm.js +22 -27
  429. package/dist/sandbox/identity.d.ts +7 -0
  430. package/dist/sandbox/identity.js +14 -3
  431. package/dist/sandbox/image-packages.js +15 -27
  432. package/dist/sandbox/k8s-client.d.ts +35 -8
  433. package/dist/sandbox/k8s-client.js +6 -5
  434. package/dist/sandbox/labels.js +1 -0
  435. package/dist/sandbox/liveness.js +3 -1
  436. package/dist/sandbox/mount-plan.d.ts +10 -10
  437. package/dist/sandbox/mount-plan.js +13 -14
  438. package/dist/sandbox/notification-sweep.d.ts +4 -4
  439. package/dist/sandbox/notification-sweep.js +4 -7
  440. package/dist/sandbox/package-identity.d.ts +6 -13
  441. package/dist/sandbox/package-identity.js +46 -28
  442. package/dist/sandbox/reaper.d.ts +10 -10
  443. package/dist/sandbox/reaper.js +4 -6
  444. package/dist/sandbox/sandbox-error.d.ts +2 -9
  445. package/dist/sandbox/sandbox-error.js +21 -8
  446. package/dist/sandbox/sandbox-step-translate.d.ts +8 -5
  447. package/dist/sandbox/sandbox-step-translate.js +22 -8
  448. package/dist/sandbox/step-sandbox.d.ts +47 -0
  449. package/dist/sandbox/step-sandbox.js +53 -0
  450. package/dist/sandbox/types.d.ts +18 -19
  451. package/dist/sandbox/types.js +1 -1
  452. package/dist/schemas/artifact-manifest.d.ts +4 -4
  453. package/dist/schemas/data-profile-schemas.d.ts +343 -298
  454. package/dist/schemas/file-metadata.js +2 -4
  455. package/dist/schemas/plan-schemas.d.ts +31 -31
  456. package/dist/schemas/run-synthesis.d.ts +95 -26
  457. package/dist/schemas/run-synthesis.js +3 -1
  458. package/dist/schemas/validate-plan.d.ts +4 -4
  459. package/dist/schemas/validate-plan.js +17 -5
  460. package/dist/schemas/workflow-state.d.ts +19 -19
  461. package/dist/schemas/workflow-state.js +2 -2
  462. package/dist/state/active-turns.d.ts +36 -0
  463. package/dist/state/active-turns.js +67 -0
  464. package/dist/state/analyses-metrics.d.ts +8 -8
  465. package/dist/state/analyses-metrics.js +4 -4
  466. package/dist/state/analyses.d.ts +0 -14
  467. package/dist/state/analyses.js +0 -32
  468. package/dist/state/artifacts.d.ts +32 -19
  469. package/dist/state/artifacts.js +28 -5
  470. package/dist/state/data-profile.d.ts +2 -2
  471. package/dist/state/db.d.ts +12 -2
  472. package/dist/state/db.js +5 -0
  473. package/dist/state/edit-intents.d.ts +4 -0
  474. package/dist/state/edit-intents.js +71 -0
  475. package/dist/state/index.d.ts +4 -4
  476. package/dist/state/index.js +2 -2
  477. package/dist/state/init.d.ts +2 -1
  478. package/dist/state/init.js +5 -2
  479. package/dist/state/migrations/20260927120000_baseline.js +3 -1
  480. package/dist/state/migrations/20261026120000_add_the_edit_intents.d.ts +7 -0
  481. package/dist/state/migrations/20261026120000_add_the_edit_intents.js +21 -0
  482. package/dist/state/migrations/20261027120000_record_the_applied_memory_edits.d.ts +7 -0
  483. package/dist/state/migrations/20261027120000_record_the_applied_memory_edits.js +16 -0
  484. package/dist/state/migrations/20261027120100_store_the_authoring_results.d.ts +8 -0
  485. package/dist/state/migrations/20261027120100_store_the_authoring_results.js +20 -0
  486. package/dist/state/migrations/20261027120200_key_the_groups_of_a_turn.d.ts +7 -0
  487. package/dist/state/migrations/20261027120200_key_the_groups_of_a_turn.js +12 -0
  488. package/dist/state/migrations/20261027120300_mark_the_active_turn_of_a_thread.d.ts +7 -0
  489. package/dist/state/migrations/20261027120300_mark_the_active_turn_of_a_thread.js +11 -0
  490. package/dist/state/migrations/20261028120000_record_the_paused_work.d.ts +7 -0
  491. package/dist/state/migrations/20261028120000_record_the_paused_work.js +25 -0
  492. package/dist/state/migrations/20261028120100_end_the_suspended_runs.d.ts +8 -0
  493. package/dist/state/migrations/20261028120100_end_the_suspended_runs.js +13 -0
  494. package/dist/state/migrations/20261029120000_reference_the_run_mandate.d.ts +7 -0
  495. package/dist/state/migrations/20261029120000_reference_the_run_mandate.js +23 -0
  496. package/dist/state/migrations/20261029120100_record_the_run_session_of_a_pause.d.ts +7 -0
  497. package/dist/state/migrations/20261029120100_record_the_run_session_of_a_pause.js +11 -0
  498. package/dist/state/migrations/index.js +18 -0
  499. package/dist/state/paused-work.d.ts +52 -0
  500. package/dist/state/paused-work.js +105 -0
  501. package/dist/state/plans.d.ts +27 -8
  502. package/dist/state/plans.js +14 -11
  503. package/dist/state/purge-analysis.d.ts +6 -6
  504. package/dist/state/purge-analysis.js +10 -2
  505. package/dist/state/report-session-state.d.ts +43 -18
  506. package/dist/state/report-session-state.js +43 -4
  507. package/dist/state/report-versions.d.ts +16 -11
  508. package/dist/state/report-versions.js +5 -3
  509. package/dist/state/runs.d.ts +30 -19
  510. package/dist/state/runs.js +43 -51
  511. package/dist/state/schema.d.ts +18 -21
  512. package/dist/state/schema.js +4 -5
  513. package/dist/state/snapshot-parse.d.ts +2 -2
  514. package/dist/state/snapshot-parse.js +14 -8
  515. package/dist/state/step-executions.d.ts +20 -8
  516. package/dist/state/step-executions.js +6 -4
  517. package/dist/state/tool-outputs.d.ts +2 -2
  518. package/dist/state/tool-outputs.js +2 -1
  519. package/dist/state/vector-store.d.ts +16 -16
  520. package/dist/state/vector-store.js +11 -7
  521. package/dist/tasks/data-profile-absorb.d.ts +3 -3
  522. package/dist/tasks/data-profile-absorb.js +21 -16
  523. package/dist/tasks/data-profile-activity.d.ts +5 -5
  524. package/dist/tasks/data-profile-activity.js +5 -5
  525. package/dist/tasks/data-profile-index.d.ts +4 -4
  526. package/dist/tasks/data-profile-index.js +32 -17
  527. package/dist/tasks/data-profile-resolve.d.ts +8 -8
  528. package/dist/tasks/data-profile-resolve.js +88 -62
  529. package/dist/tasks/data-profile.d.ts +40 -31
  530. package/dist/tasks/data-profile.js +138 -95
  531. package/dist/tasks/extract-values.d.ts +26 -79
  532. package/dist/tasks/extract-values.js +48 -108
  533. package/dist/tasks/refresh-regulatory-corpus.d.ts +4 -20
  534. package/dist/tasks/refresh-regulatory-corpus.js +12 -8
  535. package/dist/tasks/regulatory-corpus-boot-refresh.d.ts +2 -2
  536. package/dist/tasks/regulatory-corpus-boot-refresh.js +12 -10
  537. package/dist/testing.d.ts +60 -0
  538. package/dist/testing.js +96 -0
  539. package/dist/tools/ad-hoc-router.d.ts +9 -9
  540. package/dist/tools/ad-hoc-router.js +65 -52
  541. package/dist/tools/analysis-invocation.d.ts +7 -0
  542. package/dist/tools/analysis-invocation.js +29 -5
  543. package/dist/tools/approval/contract.d.ts +8 -52
  544. package/dist/tools/approval/contract.js +7 -36
  545. package/dist/tools/approval/gateway.d.ts +27 -28
  546. package/dist/tools/approval/gateway.js +33 -130
  547. package/dist/tools/approval/queries.d.ts +6 -11
  548. package/dist/tools/approval/queries.js +43 -29
  549. package/dist/tools/approval/uuidv7.js +2 -2
  550. package/dist/tools/bio/chembl.d.ts +3 -3
  551. package/dist/tools/bio/chembl.js +10 -0
  552. package/dist/tools/bio/comptox.d.ts +25 -8
  553. package/dist/tools/bio/comptox.js +4 -2
  554. package/dist/tools/bio/drug-gene-interactions.d.ts +27 -17
  555. package/dist/tools/bio/drug-gene-interactions.js +11 -8
  556. package/dist/tools/bio/gene-disease-evidence.d.ts +61 -15
  557. package/dist/tools/bio/gene-disease-evidence.js +10 -6
  558. package/dist/tools/bio/gene-preclinical-profile.d.ts +11 -11
  559. package/dist/tools/bio/keys.d.ts +2 -2
  560. package/dist/tools/bio/keys.js +3 -3
  561. package/dist/tools/bio/lookup-annotation.d.ts +5 -5
  562. package/dist/tools/bio/lookup-annotation.js +3 -0
  563. package/dist/tools/bio/opentargets.d.ts +1 -1
  564. package/dist/tools/bio/opentargets.js +6 -0
  565. package/dist/tools/bio/pubchem.d.ts +2 -2
  566. package/dist/tools/bio/pubchem.js +6 -0
  567. package/dist/tools/bio/pubmed.d.ts +26 -16
  568. package/dist/tools/bio/pubmed.js +9 -3
  569. package/dist/tools/bio/search-clinical-trials.d.ts +4 -4
  570. package/dist/tools/bio/search-clinical-trials.js +5 -1
  571. package/dist/tools/bio/search-faers.d.ts +2 -2
  572. package/dist/tools/bio/search-faers.js +1 -1
  573. package/dist/tools/bio/search-gene.d.ts +2 -2
  574. package/dist/tools/bio/search-gene.js +1 -0
  575. package/dist/tools/bio/search-geo-datasets.d.ts +4 -4
  576. package/dist/tools/bio/search-geo-datasets.js +5 -5
  577. package/dist/tools/bio/search-interactions.d.ts +1 -1
  578. package/dist/tools/bio/search-patents.d.ts +28 -22
  579. package/dist/tools/bio/search-patents.js +20 -17
  580. package/dist/tools/bio/search-protein.d.ts +2 -2
  581. package/dist/tools/bio/search-protein.js +1 -1
  582. package/dist/tools/bio/search-regulatory-approvals.d.ts +64 -18
  583. package/dist/tools/bio/search-regulatory-approvals.js +21 -16
  584. package/dist/tools/bio/target-safety.d.ts +8 -8
  585. package/dist/tools/bio/target-safety.js +11 -6
  586. package/dist/tools/capability-data.d.ts +9 -5
  587. package/dist/tools/capability-data.js +2 -1
  588. package/dist/tools/define-tool.d.ts +55 -46
  589. package/dist/tools/define-tool.js +39 -27
  590. package/dist/tools/display/normalize-echart-spec.d.ts +2 -2
  591. package/dist/tools/display/normalize-echart-spec.js +51 -27
  592. package/dist/tools/display/show-user.d.ts +2 -2
  593. package/dist/tools/display/show-user.js +1 -1
  594. package/dist/tools/execute-analysis.d.ts +19 -10
  595. package/dist/tools/execute-analysis.js +83 -62
  596. package/dist/tools/knowledge/check.d.ts +166 -44
  597. package/dist/tools/knowledge/check.js +5 -3
  598. package/dist/tools/knowledge/client.d.ts +31 -62
  599. package/dist/tools/knowledge/client.js +44 -27
  600. package/dist/tools/knowledge/environment.d.ts +6 -6
  601. package/dist/tools/knowledge/environment.js +18 -7
  602. package/dist/tools/knowledge/index.d.ts +2 -2
  603. package/dist/tools/knowledge/index.js +9 -9
  604. package/dist/tools/knowledge/local-slots.d.ts +4 -4
  605. package/dist/tools/knowledge/local-slots.js +11 -4
  606. package/dist/tools/knowledge/pin.d.ts +2 -2
  607. package/dist/tools/knowledge/recommend.d.ts +20 -45
  608. package/dist/tools/knowledge/recommend.js +27 -19
  609. package/dist/tools/knowledge/situation.d.ts +40 -40
  610. package/dist/tools/knowledge/situation.js +2 -9
  611. package/dist/tools/knowledge/skeleton.d.ts +4 -4
  612. package/dist/tools/knowledge/skeleton.js +10 -11
  613. package/dist/tools/knowledge/template.d.ts +20 -18
  614. package/dist/tools/knowledge/template.js +38 -32
  615. package/dist/tools/lib/alphafold-client.js +2 -1
  616. package/dist/tools/lib/amass-client.d.ts +28 -28
  617. package/dist/tools/lib/amass-client.js +20 -10
  618. package/dist/tools/lib/api-utils.d.ts +13 -3
  619. package/dist/tools/lib/api-utils.js +17 -3
  620. package/dist/tools/lib/bgee-client.d.ts +6 -6
  621. package/dist/tools/lib/bgee-client.js +16 -10
  622. package/dist/tools/lib/cbioportal-client.d.ts +4 -4
  623. package/dist/tools/lib/cbioportal-client.js +9 -8
  624. package/dist/tools/lib/chembl-client.d.ts +14 -14
  625. package/dist/tools/lib/chembl-client.js +11 -4
  626. package/dist/tools/lib/clinical-benchmarks-client.d.ts +4 -4
  627. package/dist/tools/lib/clinical-benchmarks-client.js +4 -7
  628. package/dist/tools/lib/clinical-trials-client.d.ts +18 -18
  629. package/dist/tools/lib/clinical-trials-client.js +10 -10
  630. package/dist/tools/lib/clinvar-client.d.ts +2 -2
  631. package/dist/tools/lib/clinvar-client.js +6 -6
  632. package/dist/tools/lib/ctx-ops.d.ts +23 -23
  633. package/dist/tools/lib/ctx-ops.js +13 -10
  634. package/dist/tools/lib/dgidb-client.d.ts +6 -6
  635. package/dist/tools/lib/dgidb-client.js +10 -12
  636. package/dist/tools/lib/disgenet-client.d.ts +4 -4
  637. package/dist/tools/lib/ema-client.d.ts +2 -2
  638. package/dist/tools/lib/ensembl-client.d.ts +4 -4
  639. package/dist/tools/lib/ensembl-client.js +5 -4
  640. package/dist/tools/lib/gwas-catalog-client.d.ts +4 -4
  641. package/dist/tools/lib/gwas-catalog-client.js +17 -17
  642. package/dist/tools/lib/html-text.d.ts +6 -0
  643. package/dist/tools/lib/html-text.js +9 -0
  644. package/dist/tools/lib/identifier-resolver.d.ts +4 -4
  645. package/dist/tools/lib/identifier-resolver.js +7 -3
  646. package/dist/tools/lib/impc-client.d.ts +8 -8
  647. package/dist/tools/lib/impc-client.js +46 -35
  648. package/dist/tools/lib/iuphar-client.d.ts +2 -2
  649. package/dist/tools/lib/iuphar-client.js +7 -16
  650. package/dist/tools/lib/monarch-client.d.ts +4 -4
  651. package/dist/tools/lib/openfda-client.d.ts +22 -22
  652. package/dist/tools/lib/openfda-client.js +23 -22
  653. package/dist/tools/lib/opentargets-client.d.ts +12 -12
  654. package/dist/tools/lib/pathway-client.d.ts +4 -4
  655. package/dist/tools/lib/pathway-client.js +15 -19
  656. package/dist/tools/lib/pharmgkb-client.d.ts +2 -2
  657. package/dist/tools/lib/pharmgkb-client.js +1 -1
  658. package/dist/tools/lib/protein-family-modality.d.ts +2 -2
  659. package/dist/tools/lib/protein-family-modality.js +0 -2
  660. package/dist/tools/lib/protein-family-normalize.js +7 -0
  661. package/dist/tools/lib/pubchem-client.d.ts +2 -2
  662. package/dist/tools/lib/pubchem-client.js +1 -0
  663. package/dist/tools/lib/pubchem-ops.d.ts +4 -4
  664. package/dist/tools/lib/pubchem-ops.js +8 -0
  665. package/dist/tools/lib/pubmed-client.d.ts +9 -9
  666. package/dist/tools/lib/pubmed-client.js +1 -1
  667. package/dist/tools/lib/string-client.d.ts +6 -6
  668. package/dist/tools/lib/uniprot-client.d.ts +8 -8
  669. package/dist/tools/lib/uniprot-client.js +5 -1
  670. package/dist/tools/memory/update-working-memory.d.ts +16 -13
  671. package/dist/tools/memory/update-working-memory.js +21 -3
  672. package/dist/tools/read-tool-output.js +8 -2
  673. package/dist/tools/registry.d.ts +2 -2
  674. package/dist/tools/report-authoring/authoring-tools.d.ts +54 -23
  675. package/dist/tools/report-authoring/authoring-tools.js +128 -62
  676. package/dist/tools/report-session/derive-table.d.ts +19 -59
  677. package/dist/tools/report-session/derive-table.js +120 -122
  678. package/dist/tools/report-session/examine-page.d.ts +6 -6
  679. package/dist/tools/report-session/examine-page.js +14 -12
  680. package/dist/tools/report-session/list-artifacts.d.ts +6 -6
  681. package/dist/tools/report-session/list-artifacts.js +5 -5
  682. package/dist/tools/report-session/page-faults.d.ts +6 -6
  683. package/dist/tools/report-session/page-faults.js +3 -1
  684. package/dist/tools/report-session/preview-report.d.ts +4 -3
  685. package/dist/tools/report-session/preview-report.js +26 -7
  686. package/dist/tools/report-session/record-version.d.ts +9 -4
  687. package/dist/tools/report-session/record-version.js +16 -9
  688. package/dist/tools/report-session/session-page-publisher.d.ts +6 -6
  689. package/dist/tools/research/generate-analogy-report.d.ts +14 -7
  690. package/dist/tools/research/generate-analogy-report.js +80 -76
  691. package/dist/tools/research/generate-plan.d.ts +16 -16
  692. package/dist/tools/research/generate-plan.js +410 -374
  693. package/dist/tools/research/guarded-address.js +3 -2
  694. package/dist/tools/research/inspect-data-profile.d.ts +27 -20
  695. package/dist/tools/research/inspect-data-profile.js +26 -25
  696. package/dist/tools/research/inspect-run.d.ts +54 -27
  697. package/dist/tools/research/inspect-run.js +50 -40
  698. package/dist/tools/research/literature-reviewer.d.ts +8 -7
  699. package/dist/tools/research/literature-reviewer.js +29 -28
  700. package/dist/tools/research/search-arxiv.d.ts +1 -1
  701. package/dist/tools/research/search-arxiv.js +1 -1
  702. package/dist/tools/research/search-github-repos.d.ts +10 -7
  703. package/dist/tools/research/search-github-repos.js +25 -22
  704. package/dist/tools/research/search-semantic-scholar.js +1 -1
  705. package/dist/tools/research/searxng-engine.d.ts +2 -2
  706. package/dist/tools/research/searxng-engine.js +6 -4
  707. package/dist/tools/research/web-fetch.d.ts +24 -21
  708. package/dist/tools/research/web-fetch.js +65 -74
  709. package/dist/tools/research/web-search.d.ts +26 -17
  710. package/dist/tools/research/web-search.js +26 -21
  711. package/dist/tools/sandbox/link-packages.d.ts +11 -7
  712. package/dist/tools/sandbox/link-packages.js +11 -8
  713. package/dist/tools/sandbox/list-available-packages.d.ts +17 -8
  714. package/dist/tools/sandbox/list-available-packages.js +31 -25
  715. package/dist/tools/sandbox/list-available-refs.d.ts +17 -14
  716. package/dist/tools/sandbox/list-available-refs.js +61 -36
  717. package/dist/tools/sandbox/report-blocker.d.ts +30 -37
  718. package/dist/tools/sandbox/report-blocker.js +23 -73
  719. package/dist/tools/sandbox/skills.d.ts +16 -12
  720. package/dist/tools/sandbox/skills.js +16 -12
  721. package/dist/tools/sandbox/submit-file-metadata.d.ts +12 -9
  722. package/dist/tools/sandbox/submit-file-metadata.js +18 -21
  723. package/dist/tools/start-report-session.d.ts +13 -5
  724. package/dist/tools/start-report-session.js +35 -8
  725. package/dist/tools/terminal-text.d.ts +5 -2
  726. package/dist/tools/terminal-text.js +35 -3
  727. package/dist/tools/workspace/decision-record.d.ts +4 -4
  728. package/dist/tools/workspace/decision-record.js +23 -13
  729. package/dist/tools/workspace/edit-file.d.ts +59 -20
  730. package/dist/tools/workspace/edit-file.js +81 -16
  731. package/dist/tools/workspace/execute-command.d.ts +15 -13
  732. package/dist/tools/workspace/execute-command.js +11 -9
  733. package/dist/tools/workspace/file-stat.d.ts +6 -3
  734. package/dist/tools/workspace/grep.d.ts +10 -7
  735. package/dist/tools/workspace/grep.js +9 -3
  736. package/dist/tools/workspace/list-files.d.ts +6 -3
  737. package/dist/tools/workspace/mutator.d.ts +28 -15
  738. package/dist/tools/workspace/mutator.js +107 -53
  739. package/dist/tools/workspace/read-file.d.ts +8 -5
  740. package/dist/tools/workspace/result-bounds.d.ts +5 -5
  741. package/dist/tools/workspace/result-bounds.js +4 -2
  742. package/dist/tools/workspace/run-exec.d.ts +2 -2
  743. package/dist/tools/workspace/run-exec.js +3 -3
  744. package/dist/tools/workspace/scan-inputs.d.ts +8 -5
  745. package/dist/tools/workspace/scan-inputs.js +17 -5
  746. package/dist/tools/workspace/show-file.d.ts +1 -1
  747. package/dist/tools/workspace/show-file.js +2 -1
  748. package/dist/tools/workspace/show-plan.d.ts +8 -5
  749. package/dist/tools/workspace/show-plan.js +9 -8
  750. package/dist/tools/workspace/workspace-search.d.ts +41 -13
  751. package/dist/tools/workspace/workspace-search.js +27 -14
  752. package/dist/tools/workspace/write-file.d.ts +9 -7
  753. package/dist/workflows/execute-analysis-scheduler.d.ts +9 -9
  754. package/dist/workflows/execute-analysis-scheduler.js +6 -3
  755. package/dist/workflows/execute-analysis.d.ts +46 -62
  756. package/dist/workflows/execute-analysis.js +137 -219
  757. package/dist/workflows/pause.d.ts +71 -0
  758. package/dist/workflows/pause.js +173 -0
  759. package/dist/workflows/sandbox-step.d.ts +38 -61
  760. package/dist/workflows/sandbox-step.js +99 -106
  761. package/dist/workflows/test/sql-writes.d.ts +21 -0
  762. package/dist/workflows/test/sql-writes.js +36 -0
  763. package/dist/workspace/filesystem.d.ts +6 -6
  764. package/dist/workspace/filesystem.js +10 -8
  765. package/dist/workspace/paths.d.ts +1 -1
  766. package/dist/workspace/paths.js +15 -4
  767. package/dist/workspace/search-config.d.ts +2 -2
  768. package/dist/workspace/search-config.js +1 -1
  769. package/package.json +21 -22
  770. package/dist/loop/call-guard.d.ts +0 -50
  771. package/dist/loop/call-guard.js +0 -90
  772. package/dist/loop/continue-agent.d.ts +0 -40
  773. package/dist/loop/continue-agent.js +0 -38
  774. package/dist/loop/genai-spans.d.ts +0 -47
  775. package/dist/loop/genai-spans.js +0 -134
  776. package/dist/loop/run-agent.d.ts +0 -245
  777. package/dist/loop/run-agent.js +0 -1124
  778. package/dist/loop/run-step.d.ts +0 -29
  779. package/dist/loop/run-step.js +0 -34
  780. package/dist/loop/run-to-terminal.d.ts +0 -66
  781. package/dist/loop/run-to-terminal.js +0 -93
  782. package/dist/loop/tool-mask.d.ts +0 -23
  783. package/dist/loop/tool-mask.js +0 -46
  784. package/dist/providers/streaming-chat.d.ts +0 -32
  785. package/dist/providers/streaming-chat.js +0 -91
  786. package/dist/tasks/derive-table-exec.d.ts +0 -54
  787. package/dist/tasks/derive-table-exec.js +0 -86
  788. package/dist/workflows/suspension.d.ts +0 -32
  789. package/dist/workflows/suspension.js +0 -38
@@ -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,17 +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
- /** True when the file is a rendered script and its decision record now lists this edit. */
55
- readonly decision_record_noted?: true;
56
- }, readonly WriteRecord[]>;
57
- 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 = {
58
96
  readonly mutator: WorkspaceMutator;
59
97
  /** Read seam used to fetch current file content for search/replace. */
60
98
  readonly workspaceFilesystem: WorkspaceFilesystem;
@@ -64,12 +102,13 @@ export interface EditFileDeps {
64
102
  * root, matching the session-scoped mutator's write prefix.
65
103
  */
66
104
  readonly workingDir?: string;
67
- }
68
- export declare function createEditFileTool(deps: EditFileDeps): import("../define-tool.js").Tool<{
69
- path: string;
70
- old_string: string;
71
- new_string: string;
72
- replace_all: boolean;
73
- regex: boolean;
74
- expected_matches?: number | undefined;
75
- }, 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 {};
@@ -12,11 +12,24 @@
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 { ok } from "neverthrow";
23
+ import { DBOS } from "@dbos-inc/dbos-sdk";
24
+ import { createHash, randomUUID } from "node:crypto";
25
+ import { errorMessageOf } from "../../lib/thrown.js";
26
+ import { textOf } from "../../lib/unknown-text.js";
27
+ import { err, ok } from "neverthrow";
17
28
  import { z } from "zod";
18
29
  import { defineTool, withToolCallRecord } from "../define-tool.js";
30
+ import { computeSha256 } from "../../lib/fs-helpers.js";
19
31
  import { unwrapOrThrow } from "../../lib/result.js";
32
+ import { stepExecId } from "../../sandbox/exec.js";
20
33
  import { noteScriptChange, scriptSha256 } from "./decision-record.js";
21
34
  const EditFileInputSchema = z.object({
22
35
  path: z
@@ -52,6 +65,24 @@ const EditFileInputSchema = z.object({
52
65
  "mismatch the edit writes nothing and returns the actual count with " +
53
66
  "the matching line numbers."),
54
67
  });
68
+ /** The key of the DBOS step that runs the call, or `undefined` outside a workflow, where nothing reruns. */
69
+ export function durableStepKey() {
70
+ return DBOS.isInStep() ? stepExecId() : undefined;
71
+ }
72
+ const STEP_UUID_NAMESPACE = "1208d858-ffdc-4f80-acec-32131dad545d";
73
+ /** 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. */
74
+ export function stepUuid(stepKey) {
75
+ if (stepKey === undefined)
76
+ return randomUUID();
77
+ const hash = createHash("sha1")
78
+ .update(Buffer.from(STEP_UUID_NAMESPACE.replaceAll("-", ""), "hex"))
79
+ .update(stepKey, "utf8")
80
+ .digest();
81
+ hash.writeUInt8((hash.readUInt8(6) & 0x0f) | 0x50, 6);
82
+ hash.writeUInt8((hash.readUInt8(8) & 0x3f) | 0x80, 8);
83
+ const hex = hash.subarray(0, 16).toString("hex");
84
+ return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;
85
+ }
55
86
  function replaceString(content, oldString, newString, replaceAll) {
56
87
  if (!content.includes(oldString))
57
88
  return { kind: "not_found" };
@@ -92,10 +123,11 @@ function lineNumbersAt(content, offsets) {
92
123
  function replaceRegex(content, pattern, replacement, expected) {
93
124
  let compiled;
94
125
  try {
126
+ // oxlint-disable-next-line eslint-js/no-restricted-syntax -- the caller-supplied match pattern is the tool's input; the dynamic form is the feature, and an invalid pattern is the handled error below.
95
127
  compiled = new RegExp(pattern, "gm");
96
128
  }
97
129
  catch (err) {
98
- return { kind: "invalid_pattern", error: err instanceof Error ? err.message : String(err) };
130
+ return { kind: "invalid_pattern", error: errorMessageOf(err) ?? textOf(err) };
99
131
  }
100
132
  const matches = [...content.matchAll(compiled)];
101
133
  if (matches.length === 0)
@@ -107,6 +139,7 @@ function replaceRegex(content, pattern, replacement, expected) {
107
139
  return { kind: "ok", content: content.replace(compiled, replacement), replacements: matches.length, lines };
108
140
  }
109
141
  export function createEditFileTool(deps) {
142
+ const stepKey = deps.stepKey ?? durableStepKey;
110
143
  return defineTool({
111
144
  id: "edit_file",
112
145
  description: "Edit a file in your working directory by replacing specific text. " +
@@ -121,9 +154,7 @@ export function createEditFileTool(deps) {
121
154
  inputSchema: EditFileInputSchema,
122
155
  // The path only. The replaced text is file content, not a description.
123
156
  describeCall: ({ path }) => path,
124
- execute: async ({ path, old_string, new_string, replace_all, regex, expected_matches }, ctx) => {
125
- const replaceAll = replace_all === true;
126
- const useRegex = regex === true;
157
+ execute: async ({ path, old_string, new_string, replace_all: replaceAll, regex: useRegex, expected_matches }, ctx) => {
127
158
  if (!useRegex && expected_matches !== undefined) {
128
159
  return ok({ status: "invalid_arguments", path, reason: "expected_matches requires regex=true." });
129
160
  }
@@ -137,12 +168,25 @@ export function createEditFileTool(deps) {
137
168
  const read = unwrapOrThrow(await deps.workspaceFilesystem.readFile({
138
169
  session: ctx.session,
139
170
  path,
140
- ...(deps.workingDir !== undefined ? { workingDir: deps.workingDir } : {}),
171
+ workingDir: deps.workingDir,
141
172
  }));
142
173
  if (read.kind === "not_found")
143
174
  return ok({ status: "file_not_found", path });
144
175
  if (read.kind === "out_of_scope")
145
176
  return ok({ status: "out_of_scope", path });
177
+ const currentHash = computeSha256(read.content);
178
+ const key = stepKey();
179
+ if (key !== undefined) {
180
+ const intent = unwrapOrThrow(await deps.intents.get(key));
181
+ if (intent !== null && currentHash === intent.hashAfter)
182
+ return ok(withToolCallRecord(intent.result, intent.callRecord));
183
+ if (intent !== null && currentHash !== intent.hashBefore) {
184
+ return err({
185
+ error: `The file ${path} changed after an earlier run of this edit, thus the edit was not applied. Read the file again before you edit it.`,
186
+ retryable: false,
187
+ });
188
+ }
189
+ }
146
190
  const content = read.content.toString("utf8");
147
191
  const replaced = useRegex
148
192
  ? replaceRegex(content, old_string, new_string, expected_matches)
@@ -164,12 +208,33 @@ export function createEditFileTool(deps) {
164
208
  lines: replaced.lines,
165
209
  });
166
210
  }
211
+ const lines = replaced.lines;
212
+ const resultOf = (landed) => ({
213
+ status: "ok",
214
+ path: landed.path,
215
+ replacements: replaced.replacements,
216
+ bytesWritten: landed.bytesWritten,
217
+ lines,
218
+ });
219
+ const intentOf = (stepKey, landed, result, callRecord) => ({
220
+ key: stepKey,
221
+ analysisId: ctx.session.scope.analysisId,
222
+ path: landed.path,
223
+ hashBefore: currentHash,
224
+ hashAfter: landed.record.hash,
225
+ result,
226
+ callRecord,
227
+ });
167
228
  const write = await deps.mutator.writeFile({
168
229
  path,
169
230
  content: replaced.content,
170
231
  toolName: "edit_file",
171
232
  invocationId: ctx.invocationId,
172
233
  session: ctx.session,
234
+ beforeLand: async (landed) => {
235
+ if (key !== undefined)
236
+ unwrapOrThrow(await deps.intents.put(intentOf(key, landed, resultOf(landed), [landed.record])));
237
+ },
173
238
  });
174
239
  if (write.status !== "ok")
175
240
  return ok(write);
@@ -179,22 +244,22 @@ export function createEditFileTool(deps) {
179
244
  filesystem: deps.workspaceFilesystem,
180
245
  mutator: deps.mutator,
181
246
  session: ctx.session,
182
- ...(deps.workingDir !== undefined ? { workingDir: deps.workingDir } : {}),
247
+ workingDir: deps.workingDir,
183
248
  invocationId: ctx.invocationId,
184
249
  toolName: "edit_file",
185
250
  scriptPath: path,
186
251
  note: `edit_file: ${replaced.replacements} replacement(s)`,
187
252
  sha256: scriptSha256(replaced.content),
188
253
  });
189
- const lines = replaced.lines;
190
- return ok(withToolCallRecord({
191
- status: "ok",
192
- path: write.path,
193
- replacements: replaced.replacements,
194
- bytesWritten: write.bytesWritten,
195
- ...(lines === undefined ? {} : { lines }),
196
- ...(noted.status === "noted" ? { decision_record_noted: true } : {}),
197
- }, noted.status === "noted" ? [write.record, noted.write] : [write.record]));
254
+ const result = resultOf(write);
255
+ if (noted.status !== "noted")
256
+ return ok(withToolCallRecord(result, [write.record]));
257
+ result.decision_record_noted = true;
258
+ const callRecord = [write.record, noted.write];
259
+ // The first put holds the edit already, thus a failed update costs a rerun only the note of the decision record.
260
+ if (key !== undefined)
261
+ await deps.intents.put(intentOf(key, write, result, callRecord)).unwrapOr(undefined);
262
+ return ok(withToolCallRecord(result, callRecord));
198
263
  },
199
264
  foldCallRecord: (records) => {
200
265
  for (const record of records)
@@ -25,7 +25,8 @@
25
25
  * of the bytes that run, thus the record connects the cited decision to the
26
26
  * code that ran.
27
27
  */
28
- import { type WithToolCallRecord } from "../define-tool.js";
28
+ import { z } from "zod";
29
+ import { type Tool, type WithToolCallRecord } from "../define-tool.js";
29
30
  import type { SandboxClient } from "../../sandbox/client.js";
30
31
  import type { ProvenanceFrame, SandboxRef } from "../../sandbox/types.js";
31
32
  import type { ProvenanceCollector } from "../../provenance/collector.js";
@@ -33,19 +34,25 @@ import type { WorkspaceMutator, WriteRecord } from "./mutator.js";
33
34
  import { type BoundedExecResult } from "./result-bounds.js";
34
35
  import type { WorkspaceFilesystem } from "../../workspace/filesystem.js";
35
36
  import type { Logger } from "../../lib/logger.js";
37
+ declare const ExecuteCommandInputSchema: z.ZodObject<{
38
+ command: z.ZodArray<z.ZodString>;
39
+ cwd: z.ZodOptional<z.ZodString>;
40
+ env: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
41
+ timeoutSeconds: z.ZodOptional<z.ZodNumber>;
42
+ }, z.core.$strip>;
36
43
  /** What one exec leaves for the lineage collector of the step. */
37
- interface ExecCallRecord {
44
+ type ExecCallRecord = {
38
45
  readonly command: readonly string[];
39
46
  readonly exitCode: number | null;
40
47
  readonly durationMs: number | null;
41
- readonly provenance?: ProvenanceFrame;
48
+ provenance?: ProvenanceFrame;
42
49
  /** The decision-record writes of the script check before the exec, for the mutator. */
43
- readonly recordWrites?: readonly WriteRecord[];
44
- }
50
+ recordWrites?: readonly WriteRecord[];
51
+ };
45
52
  type ExecuteCommandResult = {
46
53
  readonly status: "ok";
47
54
  } & BoundedExecResult;
48
- export interface ExecuteCommandDeps {
55
+ export type ExecuteCommandDeps = {
49
56
  /** Operational logging seam; omitted falls back to no-op. */
50
57
  readonly logger?: Logger;
51
58
  readonly sandboxClient: SandboxClient;
@@ -75,11 +82,6 @@ export interface ExecuteCommandDeps {
75
82
  */
76
83
  readonly workspaceFilesystem?: WorkspaceFilesystem;
77
84
  readonly mutator?: WorkspaceMutator;
78
- }
79
- export declare function createExecuteCommandTool(deps: ExecuteCommandDeps): import("../define-tool.js").Tool<{
80
- command: string[];
81
- cwd?: string | undefined;
82
- env?: Record<string, string> | undefined;
83
- timeoutSeconds?: number | undefined;
84
- }, ExecuteCommandResult | WithToolCallRecord<ExecuteCommandResult, ExecCallRecord>>;
85
+ };
86
+ export declare function createExecuteCommandTool(deps: ExecuteCommandDeps): Tool<z.infer<typeof ExecuteCommandInputSchema>, ExecuteCommandResult | WithToolCallRecord<ExecuteCommandResult, ExecCallRecord>>;
85
87
  export {};
@@ -51,10 +51,10 @@ const ExecuteCommandInputSchema = z.object({
51
51
  timeoutSeconds: z.number().int().positive().optional().describe("Per-command timeout in seconds; capped by the step deadline."),
52
52
  });
53
53
  /** Extensions that mark an argv token as the thing being run, not a flag or a data path. */
54
- const SCRIPT_EXTENSIONS = /\.(py|R|r|sh|js|ts|ipynb)$/;
54
+ const SCRIPT_EXTENSIONS = [".py", ".R", ".r", ".sh", ".js", ".ts", ".ipynb"];
55
55
  /** The first script-like token in an argv, or `undefined` when none looks like one. */
56
56
  function scriptToken(command) {
57
- return command.find((arg) => SCRIPT_EXTENSIONS.test(arg));
57
+ return command.find((arg) => SCRIPT_EXTENSIONS.some((extension) => arg.endsWith(extension)));
58
58
  }
59
59
  export function createExecuteCommandTool(deps) {
60
60
  const { sandboxClient, sandbox, deadlineMs, defaultCwd, lineageCollector, mountRoot } = deps;
@@ -97,7 +97,7 @@ export function createExecuteCommandTool(deps) {
97
97
  // command, which is a `/{analysisId}/...` path, thus the workspace filesystem resolves it the same way.
98
98
  const recordWrites = [];
99
99
  if (deps.workspaceFilesystem && deps.mutator) {
100
- for (const token of command.filter((arg) => SCRIPT_EXTENSIONS.test(arg))) {
100
+ for (const token of command.filter((arg) => SCRIPT_EXTENSIONS.some((extension) => arg.endsWith(extension)))) {
101
101
  const noted = await reconcileScriptRecord({
102
102
  filesystem: deps.workspaceFilesystem,
103
103
  mutator: deps.mutator,
@@ -115,8 +115,8 @@ export function createExecuteCommandTool(deps) {
115
115
  sandbox,
116
116
  command,
117
117
  cwd: effectiveCwd,
118
- ...(env === undefined ? {} : { env }),
119
- ...(timeoutSeconds === undefined ? {} : { timeoutSeconds }),
118
+ env,
119
+ timeoutSeconds,
120
120
  deadlineMs: deadlineMs(),
121
121
  emit: ctx.emit,
122
122
  });
@@ -127,9 +127,11 @@ export function createExecuteCommandTool(deps) {
127
127
  command,
128
128
  exitCode: result.exitCode,
129
129
  durationMs: result.durationMs,
130
- ...(result.provenance ? { provenance: result.provenance } : {}),
131
- ...(recordWrites.length > 0 ? { recordWrites } : {}),
132
130
  };
131
+ if (result.provenance)
132
+ record.provenance = result.provenance;
133
+ if (recordWrites.length > 0)
134
+ record.recordWrites = recordWrites;
133
135
  return ok(withToolCallRecord(bounded, record));
134
136
  },
135
137
  // Best-effort: a collector failure must never fail the exec.
@@ -145,8 +147,8 @@ export function createExecuteCommandTool(deps) {
145
147
  command: record.command,
146
148
  exitCode: record.exitCode,
147
149
  durationMs: record.durationMs,
148
- ...(deps.logger ? { logger: deps.logger } : {}),
149
- ...(record.provenance ? { provenance: record.provenance } : {}),
150
+ logger: deps.logger,
151
+ provenance: record.provenance,
150
152
  });
151
153
  }
152
154
  catch (err) {
@@ -5,6 +5,8 @@
5
5
  * and the optional working directory relative paths resolve against (see the harness-workspace-tools spec).
6
6
  * Expected outcomes are data variants — `not_found` / `out_of_scope`.
7
7
  */
8
+ import { z } from "zod";
9
+ import { type Tool } from "../define-tool.js";
8
10
  import type { WorkspaceFilesystem } from "../../workspace/filesystem.js";
9
11
  type FileStatOutput = {
10
12
  status: "ok";
@@ -18,7 +20,8 @@ type FileStatOutput = {
18
20
  status: "out_of_scope";
19
21
  path: string;
20
22
  };
21
- export declare function createFileStatTool(fs: WorkspaceFilesystem, workingDir?: string): import("../define-tool.js").Tool<{
22
- path: string;
23
- }, FileStatOutput>;
23
+ declare const FileStatInputSchema: z.ZodObject<{
24
+ path: z.ZodString;
25
+ }, z.core.$strip>;
26
+ export declare function createFileStatTool(fs: WorkspaceFilesystem, workingDir?: string): Tool<z.infer<typeof FileStatInputSchema>, FileStatOutput>;
24
27
  export {};
@@ -7,12 +7,19 @@
7
7
  * `truncated` with a marker; missing path → `not_found`; escape attempt →
8
8
  * `out_of_scope`. Only unexpected I/O failures throw.
9
9
  */
10
+ import { z } from "zod";
11
+ import { type Tool } from "../define-tool.js";
10
12
  import type { ListEntry, WorkspaceFilesystem } from "../../workspace/filesystem.js";
11
- interface Match {
13
+ declare const GrepInputSchema: z.ZodObject<{
14
+ pattern: z.ZodString;
15
+ path: z.ZodString;
16
+ ignoreCase: z.ZodOptional<z.ZodBoolean>;
17
+ }, z.core.$strip>;
18
+ type Match = {
12
19
  readonly file: string;
13
20
  readonly line: number;
14
21
  readonly preview: string;
15
- }
22
+ };
16
23
  type GrepOutput = {
17
24
  status: "invalid_pattern";
18
25
  pattern: string;
@@ -42,11 +49,7 @@ type GrepOutput = {
42
49
  pattern: string;
43
50
  matches: Match[];
44
51
  };
45
- export declare function createGrepTool(fs: WorkspaceFilesystem, workingDir?: string): import("../define-tool.js").Tool<{
46
- pattern: string;
47
- path: string;
48
- ignoreCase?: boolean | undefined;
49
- }, GrepOutput>;
52
+ export declare function createGrepTool(fs: WorkspaceFilesystem, workingDir?: string): Tool<z.infer<typeof GrepInputSchema>, GrepOutput>;
50
53
  /** Exposed for tests — the caps `grep` enforces. */
51
54
  export declare const GREP_LIMITS: {
52
55
  readonly DEFAULT_MAX_MATCHES: 50;
@@ -7,8 +7,12 @@
7
7
  * `truncated` with a marker; missing path → `not_found`; escape attempt →
8
8
  * `out_of_scope`. Only unexpected I/O failures throw.
9
9
  */
10
+ import { errorMessageOf } from "../../lib/thrown.js";
11
+ import { textOf } from "../../lib/unknown-text.js";
10
12
  import { posix as posixPath } from "node:path";
11
13
  import { ok } from "neverthrow";
14
+ import { presentAt } from "../../lib/present.js";
15
+ import { splitLines } from "../../lib/text.js";
12
16
  import { z } from "zod";
13
17
  import { defineTool } from "../define-tool.js";
14
18
  import { unwrapOrThrow } from "../../lib/result.js";
@@ -46,13 +50,14 @@ export function createGrepTool(fs, workingDir) {
46
50
  execute: async ({ pattern, path, ignoreCase }, ctx) => {
47
51
  let regex;
48
52
  try {
53
+ // oxlint-disable-next-line eslint-js/no-restricted-syntax -- the caller-supplied grep pattern is the tool's input; the dynamic form is the feature, and an invalid pattern is the handled error below.
49
54
  regex = new RegExp(pattern, ignoreCase === true ? "i" : "");
50
55
  }
51
56
  catch (err) {
52
57
  return ok({
53
58
  status: "invalid_pattern",
54
59
  pattern,
55
- error: err instanceof Error ? err.message : String(err),
60
+ error: errorMessageOf(err) ?? textOf(err),
56
61
  });
57
62
  }
58
63
  const statResult = unwrapOrThrow(await fs.stat({ session: ctx.session, path, workingDir }));
@@ -84,13 +89,13 @@ export function createGrepTool(fs, workingDir) {
84
89
  const text = buf.toString("utf8");
85
90
  if (read.kind === "truncated")
86
91
  truncated = true;
87
- const lines = text.split(/\r?\n/);
92
+ const lines = splitLines(text);
88
93
  for (let i = 0; i < lines.length; i++) {
89
94
  if (matches.length >= DEFAULT_MAX_MATCHES) {
90
95
  truncated = true;
91
96
  return;
92
97
  }
93
- const line = lines[i];
98
+ const line = presentAt(lines, i, "the scanned line");
94
99
  if (regex.test(line)) {
95
100
  matches.push({
96
101
  file: filePath,
@@ -133,6 +138,7 @@ export function createGrepTool(fs, workingDir) {
133
138
  if (matches.length === 0) {
134
139
  return ok({ status: "no_matches", path, pattern });
135
140
  }
141
+ // oxlint-disable-next-line no-unnecessary-condition -- tsgolint cannot see the walk/searchFile closures that set truncated; the check is live (it returns the truncated result).
136
142
  if (truncated) {
137
143
  return ok({
138
144
  status: "truncated",
@@ -6,6 +6,8 @@
6
6
  * Expected outcomes are data variants — a missing path is `not_found`, a path
7
7
  * escaping the analysis tree is `out_of_scope`.
8
8
  */
9
+ import { z } from "zod";
10
+ import { type Tool } from "../define-tool.js";
9
11
  import type { ListEntry, WorkspaceFilesystem } from "../../workspace/filesystem.js";
10
12
  type ListFilesOutput = {
11
13
  status: "ok";
@@ -18,7 +20,8 @@ type ListFilesOutput = {
18
20
  status: "out_of_scope";
19
21
  path: string;
20
22
  };
21
- export declare function createListFilesTool(fs: WorkspaceFilesystem, workingDir?: string): import("../define-tool.js").Tool<{
22
- path: string;
23
- }, ListFilesOutput>;
23
+ declare const ListFilesInputSchema: z.ZodObject<{
24
+ path: z.ZodString;
25
+ }, z.core.$strip>;
26
+ export declare function createListFilesTool(fs: WorkspaceFilesystem, workingDir?: string): Tool<z.infer<typeof ListFilesInputSchema>, ListFilesOutput>;
24
27
  export {};
@@ -26,8 +26,13 @@
26
26
  * The landing is hardened beyond the lexical resolver: missing parent
27
27
  * directories are created only inside the write prefix, the deepest existing
28
28
  * ancestor is realpath-checked against the realpath'd prefix (a symlinked
29
- * ancestor cannot re-aim the write), and the final open uses `O_NOFOLLOW`
30
- * (a symlinked final component is refused, never followed).
29
+ * ancestor cannot re-aim the write), and a symlinked final component is
30
+ * refused, never followed.
31
+ *
32
+ * The landing is atomic: the bytes go to a temporary file in the target's
33
+ * directory, and a rename puts that file over the target. A reader of the
34
+ * target sees the old file or the new file whole, never a part of one, and a
35
+ * process that dies mid-write leaves the target as it was.
31
36
  */
32
37
  import type { AgentSession } from "../../auth/types.js";
33
38
  import type { Logger } from "../../lib/logger.js";
@@ -54,24 +59,26 @@ export type WriteFileResult = {
54
59
  * exact bytes on disk, computed at the landing. Plain JSON, because the step
55
60
  * cache of the tool call holds it.
56
61
  */
57
- export interface WriteRecord {
62
+ export type WriteRecord = {
58
63
  readonly analysisId: string;
59
64
  /** The thread of a session write; absent under a run. */
60
- readonly threadId?: string;
65
+ threadId?: string;
61
66
  /** Analysis-root-relative, forward-slashed. */
62
67
  readonly path: string;
63
68
  readonly hash: string;
64
69
  readonly size: number;
65
70
  readonly toolName: MutateToolName;
66
71
  readonly invocationId: string;
67
- }
68
- /** `writeFile` gives back the result, and on success the record of the write for `recordWrite`. */
69
- export type WriteOutcome = {
72
+ };
73
+ /** A write that lands: the result, and the record of the write for `recordWrite`. */
74
+ export type LandedWrite = {
70
75
  readonly status: "ok";
71
76
  readonly path: string;
72
77
  readonly bytesWritten: number;
73
78
  readonly record: WriteRecord;
74
- } | Exclude<WriteFileResult, {
79
+ };
80
+ /** `writeFile` gives back the result, and on success the record of the write for `recordWrite`. */
81
+ export type WriteOutcome = LandedWrite | Exclude<WriteFileResult, {
75
82
  status: "ok";
76
83
  }>;
77
84
  /**
@@ -80,8 +87,9 @@ export type WriteOutcome = {
80
87
  * (`inflexa:tool` in the signed document) — the seam records the write without
81
88
  * inspecting its caller.
82
89
  */
83
- export type MutateToolName = "write_file" | "edit_file" | "knowledge_template" | "execute_command";
84
- export interface WorkspaceMutatorDeps {
90
+ export declare const MUTATE_TOOL_NAMES: readonly ["write_file", "edit_file", "knowledge_template", "execute_command"];
91
+ export type MutateToolName = (typeof MUTATE_TOOL_NAMES)[number];
92
+ export type WorkspaceMutatorDeps = {
85
93
  /** Absolute host root of this analysis's workspace tree — used by the resolver. */
86
94
  readonly workspaceRoot: string;
87
95
  readonly analysisId: string;
@@ -94,8 +102,8 @@ export interface WorkspaceMutatorDeps {
94
102
  * write itself proceeds unchanged.
95
103
  */
96
104
  readonly lineageCollector?: ProvenanceCollector;
97
- }
98
- export interface WorkspaceMutator {
105
+ };
106
+ export type WorkspaceMutator = {
99
107
  /**
100
108
  * Resolve `path` against the working directory (relative) or analysis root
101
109
  * (absolute `/{analysisId}/...`), confine the result to the working
@@ -109,6 +117,10 @@ export interface WorkspaceMutator {
109
117
  * and its provenance attribution from it.
110
118
  *
111
119
  * Records nothing: a successful write gives back its record for `recordWrite`.
120
+ *
121
+ * `beforeLand` runs when the new bytes wait in the temporary file and the
122
+ * target is still unchanged. It gets the outcome that the write gives back.
123
+ * A rejection lands nothing, and the write rejects with it.
112
124
  */
113
125
  writeFile(args: {
114
126
  readonly path: string;
@@ -116,16 +128,17 @@ export interface WorkspaceMutator {
116
128
  readonly toolName: MutateToolName;
117
129
  readonly invocationId: string;
118
130
  readonly session: AgentSession;
131
+ readonly beforeLand?: (write: LandedWrite) => Promise<void>;
119
132
  }): Promise<WriteOutcome>;
120
133
  /**
121
134
  * Record one landed write in provenance. A tool calls it from its call-record
122
135
  * fold, thus the record reaches process-local state on each replay too.
123
136
  */
124
137
  recordWrite(record: WriteRecord): void;
125
- }
138
+ };
126
139
  export declare function createWorkspaceMutator(deps: WorkspaceMutatorDeps): WorkspaceMutator;
127
140
  /** Construction deps of the session-scoped realization — see {@link createSessionWorkspaceMutator}. */
128
- export interface SessionWorkspaceMutatorDeps {
141
+ export type SessionWorkspaceMutatorDeps = {
129
142
  /** Workspace-root resolution seam — the write coordinates resolve per call from the session's analysis scope. */
130
143
  readonly resolveWorkspaceRoot: ResolveWorkspaceRoot;
131
144
  /**
@@ -137,7 +150,7 @@ export interface SessionWorkspaceMutatorDeps {
137
150
  */
138
151
  readonly provenance?: ProvenanceSeam;
139
152
  readonly logger?: Logger;
140
- }
153
+ };
141
154
  /**
142
155
  * The session-scoped `WorkspaceMutator` realization — the conversation agent's
143
156
  * write path. Where `createWorkspaceMutator` closes over fixed per-step