@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,11 +12,25 @@
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";
33
+ import { noteScriptChange, scriptSha256 } from "./decision-record.js";
20
34
  const EditFileInputSchema = z.object({
21
35
  path: z
22
36
  .string()
@@ -51,6 +65,24 @@ const EditFileInputSchema = z.object({
51
65
  "mismatch the edit writes nothing and returns the actual count with " +
52
66
  "the matching line numbers."),
53
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
+ }
54
86
  function replaceString(content, oldString, newString, replaceAll) {
55
87
  if (!content.includes(oldString))
56
88
  return { kind: "not_found" };
@@ -91,10 +123,11 @@ function lineNumbersAt(content, offsets) {
91
123
  function replaceRegex(content, pattern, replacement, expected) {
92
124
  let compiled;
93
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.
94
127
  compiled = new RegExp(pattern, "gm");
95
128
  }
96
129
  catch (err) {
97
- return { kind: "invalid_pattern", error: err instanceof Error ? err.message : String(err) };
130
+ return { kind: "invalid_pattern", error: errorMessageOf(err) ?? textOf(err) };
98
131
  }
99
132
  const matches = [...content.matchAll(compiled)];
100
133
  if (matches.length === 0)
@@ -106,6 +139,7 @@ function replaceRegex(content, pattern, replacement, expected) {
106
139
  return { kind: "ok", content: content.replace(compiled, replacement), replacements: matches.length, lines };
107
140
  }
108
141
  export function createEditFileTool(deps) {
142
+ const stepKey = deps.stepKey ?? durableStepKey;
109
143
  return defineTool({
110
144
  id: "edit_file",
111
145
  description: "Edit a file in your working directory by replacing specific text. " +
@@ -120,9 +154,7 @@ export function createEditFileTool(deps) {
120
154
  inputSchema: EditFileInputSchema,
121
155
  // The path only. The replaced text is file content, not a description.
122
156
  describeCall: ({ path }) => path,
123
- execute: async ({ path, old_string, new_string, replace_all, regex, expected_matches }, ctx) => {
124
- const replaceAll = replace_all === true;
125
- const useRegex = regex === true;
157
+ execute: async ({ path, old_string, new_string, replace_all: replaceAll, regex: useRegex, expected_matches }, ctx) => {
126
158
  if (!useRegex && expected_matches !== undefined) {
127
159
  return ok({ status: "invalid_arguments", path, reason: "expected_matches requires regex=true." });
128
160
  }
@@ -136,12 +168,25 @@ export function createEditFileTool(deps) {
136
168
  const read = unwrapOrThrow(await deps.workspaceFilesystem.readFile({
137
169
  session: ctx.session,
138
170
  path,
139
- ...(deps.workingDir !== undefined ? { workingDir: deps.workingDir } : {}),
171
+ workingDir: deps.workingDir,
140
172
  }));
141
173
  if (read.kind === "not_found")
142
174
  return ok({ status: "file_not_found", path });
143
175
  if (read.kind === "out_of_scope")
144
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
+ }
145
190
  const content = read.content.toString("utf8");
146
191
  const replaced = useRegex
147
192
  ? replaceRegex(content, old_string, new_string, expected_matches)
@@ -163,24 +208,62 @@ export function createEditFileTool(deps) {
163
208
  lines: replaced.lines,
164
209
  });
165
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
+ });
166
228
  const write = await deps.mutator.writeFile({
167
229
  path,
168
230
  content: replaced.content,
169
231
  toolName: "edit_file",
170
232
  invocationId: ctx.invocationId,
171
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
+ },
172
238
  });
173
239
  if (write.status !== "ok")
174
240
  return ok(write);
175
- const lines = replaced.lines;
176
- return ok(withToolCallRecord({
177
- status: "ok",
178
- path: write.path,
179
- replacements: replaced.replacements,
180
- bytesWritten: write.bytesWritten,
181
- ...(lines === undefined ? {} : { lines }),
182
- }, write.record));
241
+ // A rendered script carries a decision record. The edit is a change the curator did not vet, and the
242
+ // record keeps it with the digest after the change, thus an empty `unvetted_edits` stays a fact.
243
+ const noted = await noteScriptChange({
244
+ filesystem: deps.workspaceFilesystem,
245
+ mutator: deps.mutator,
246
+ session: ctx.session,
247
+ workingDir: deps.workingDir,
248
+ invocationId: ctx.invocationId,
249
+ toolName: "edit_file",
250
+ scriptPath: path,
251
+ note: `edit_file: ${replaced.replacements} replacement(s)`,
252
+ sha256: scriptSha256(replaced.content),
253
+ });
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));
263
+ },
264
+ foldCallRecord: (records) => {
265
+ for (const record of records)
266
+ deps.mutator.recordWrite(record);
183
267
  },
184
- foldCallRecord: (record) => deps.mutator.recordWrite(record),
185
268
  });
186
269
  }
@@ -18,24 +18,41 @@
18
18
  * `sandbox-provenance-tracking`), and artifact registration reconciles them.
19
19
  * The frame of each exec rides the call record, and the fold feeds it to the
20
20
  * lineage collector of the step.
21
+ *
22
+ * A script the command names that carries a decision record is compared
23
+ * with the digest the record expects before it runs. A difference is a
24
+ * change that no file tool recorded, and the record gets it with the digest
25
+ * of the bytes that run, thus the record connects the cited decision to the
26
+ * code that ran.
21
27
  */
22
- import { type WithToolCallRecord } from "../define-tool.js";
28
+ import { z } from "zod";
29
+ import { type Tool, type WithToolCallRecord } from "../define-tool.js";
23
30
  import type { SandboxClient } from "../../sandbox/client.js";
24
31
  import type { ProvenanceFrame, SandboxRef } from "../../sandbox/types.js";
25
32
  import type { ProvenanceCollector } from "../../provenance/collector.js";
33
+ import type { WorkspaceMutator, WriteRecord } from "./mutator.js";
26
34
  import { type BoundedExecResult } from "./result-bounds.js";
35
+ import type { WorkspaceFilesystem } from "../../workspace/filesystem.js";
27
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>;
28
43
  /** What one exec leaves for the lineage collector of the step. */
29
- interface ExecCallRecord {
44
+ type ExecCallRecord = {
30
45
  readonly command: readonly string[];
31
46
  readonly exitCode: number | null;
32
47
  readonly durationMs: number | null;
33
- readonly provenance?: ProvenanceFrame;
34
- }
48
+ provenance?: ProvenanceFrame;
49
+ /** The decision-record writes of the script check before the exec, for the mutator. */
50
+ recordWrites?: readonly WriteRecord[];
51
+ };
35
52
  type ExecuteCommandResult = {
36
53
  readonly status: "ok";
37
54
  } & BoundedExecResult;
38
- export interface ExecuteCommandDeps {
55
+ export type ExecuteCommandDeps = {
39
56
  /** Operational logging seam; omitted falls back to no-op. */
40
57
  readonly logger?: Logger;
41
58
  readonly sandboxClient: SandboxClient;
@@ -58,11 +75,13 @@ export interface ExecuteCommandDeps {
58
75
  readonly lineageCollector?: ProvenanceCollector;
59
76
  /** Analysis resource mount root (`/{resourceId}`) — strips frame paths to relative. */
60
77
  readonly mountRoot?: string;
61
- }
62
- export declare function createExecuteCommandTool(deps: ExecuteCommandDeps): import("../define-tool.js").Tool<{
63
- command: string[];
64
- cwd?: string | undefined;
65
- env?: Record<string, string> | undefined;
66
- timeoutSeconds?: number | undefined;
67
- }, ExecuteCommandResult | WithToolCallRecord<ExecuteCommandResult, ExecCallRecord>>;
78
+ /**
79
+ * The workspace filesystem and the mutator of the step, for the record check of a
80
+ * script the command runs. Both absent (a read-only agent), no record is
81
+ * read or written.
82
+ */
83
+ readonly workspaceFilesystem?: WorkspaceFilesystem;
84
+ readonly mutator?: WorkspaceMutator;
85
+ };
86
+ export declare function createExecuteCommandTool(deps: ExecuteCommandDeps): Tool<z.infer<typeof ExecuteCommandInputSchema>, ExecuteCommandResult | WithToolCallRecord<ExecuteCommandResult, ExecCallRecord>>;
68
87
  export {};
@@ -18,12 +18,19 @@
18
18
  * `sandbox-provenance-tracking`), and artifact registration reconciles them.
19
19
  * The frame of each exec rides the call record, and the fold feeds it to the
20
20
  * lineage collector of the step.
21
+ *
22
+ * A script the command names that carries a decision record is compared
23
+ * with the digest the record expects before it runs. A difference is a
24
+ * change that no file tool recorded, and the record gets it with the digest
25
+ * of the bytes that run, thus the record connects the cited decision to the
26
+ * code that ran.
21
27
  */
22
28
  import { posix as posixPath } from "node:path";
23
29
  import { ok } from "neverthrow";
24
30
  import { z } from "zod";
25
31
  import { defineTool, withToolCallRecord } from "../define-tool.js";
26
32
  import { feedExecFrame } from "../../provenance/exec-frame.js";
33
+ import { reconcileScriptRecord } from "./decision-record.js";
27
34
  import { EXEC_STREAM_BYTE_CAP, boundExecResult } from "./result-bounds.js";
28
35
  import { runSandboxExec } from "./run-exec.js";
29
36
  import { createNoopLogger } from "../../lib/console-logger.js";
@@ -44,10 +51,10 @@ const ExecuteCommandInputSchema = z.object({
44
51
  timeoutSeconds: z.number().int().positive().optional().describe("Per-command timeout in seconds; capped by the step deadline."),
45
52
  });
46
53
  /** Extensions that mark an argv token as the thing being run, not a flag or a data path. */
47
- const SCRIPT_EXTENSIONS = /\.(py|R|r|sh|js|ts|ipynb)$/;
54
+ const SCRIPT_EXTENSIONS = [".py", ".R", ".r", ".sh", ".js", ".ts", ".ipynb"];
48
55
  /** The first script-like token in an argv, or `undefined` when none looks like one. */
49
56
  function scriptToken(command) {
50
- return command.find((arg) => SCRIPT_EXTENSIONS.test(arg));
57
+ return command.find((arg) => SCRIPT_EXTENSIONS.some((extension) => arg.endsWith(extension)));
51
58
  }
52
59
  export function createExecuteCommandTool(deps) {
53
60
  const { sandboxClient, sandbox, deadlineMs, defaultCwd, lineageCollector, mountRoot } = deps;
@@ -86,29 +93,51 @@ export function createExecuteCommandTool(deps) {
86
93
  describeCall: ({ command }) => scriptToken(command) ?? command.join(" "),
87
94
  execute: async ({ command, cwd, env, timeoutSeconds }, ctx) => {
88
95
  const effectiveCwd = cwd === undefined ? defaultCwd : cwd.startsWith("/") ? cwd : posixPath.join(defaultCwd, cwd);
96
+ // Each script the argv names, as the sandbox resolves it. A relative token resolves against the cwd of the
97
+ // command, which is a `/{analysisId}/...` path, thus the workspace filesystem resolves it the same way.
98
+ const recordWrites = [];
99
+ if (deps.workspaceFilesystem && deps.mutator) {
100
+ for (const token of command.filter((arg) => SCRIPT_EXTENSIONS.some((extension) => arg.endsWith(extension)))) {
101
+ const noted = await reconcileScriptRecord({
102
+ filesystem: deps.workspaceFilesystem,
103
+ mutator: deps.mutator,
104
+ session: ctx.session,
105
+ invocationId: ctx.invocationId,
106
+ toolName: "execute_command",
107
+ scriptPath: token.startsWith("/") ? token : posixPath.join(effectiveCwd, token),
108
+ });
109
+ if (noted.status === "noted")
110
+ recordWrites.push(noted.write);
111
+ }
112
+ }
89
113
  const result = await runSandboxExec({
90
114
  sandboxClient,
91
115
  sandbox,
92
116
  command,
93
117
  cwd: effectiveCwd,
94
- ...(env === undefined ? {} : { env }),
95
- ...(timeoutSeconds === undefined ? {} : { timeoutSeconds }),
118
+ env,
119
+ timeoutSeconds,
96
120
  deadlineMs: deadlineMs(),
97
121
  emit: ctx.emit,
98
122
  });
99
123
  const bounded = { status: "ok", ...boundExecResult(result) };
100
- if (!lineageCollector || !mountRoot)
124
+ if ((!lineageCollector || !mountRoot) && recordWrites.length === 0)
101
125
  return ok(bounded);
102
126
  const record = {
103
127
  command,
104
128
  exitCode: result.exitCode,
105
129
  durationMs: result.durationMs,
106
- ...(result.provenance ? { provenance: result.provenance } : {}),
107
130
  };
131
+ if (result.provenance)
132
+ record.provenance = result.provenance;
133
+ if (recordWrites.length > 0)
134
+ record.recordWrites = recordWrites;
108
135
  return ok(withToolCallRecord(bounded, record));
109
136
  },
110
137
  // Best-effort: a collector failure must never fail the exec.
111
138
  foldCallRecord: (record) => {
139
+ for (const write of record.recordWrites ?? [])
140
+ deps.mutator?.recordWrite(write);
112
141
  if (!lineageCollector || !mountRoot)
113
142
  return;
114
143
  try {
@@ -118,8 +147,8 @@ export function createExecuteCommandTool(deps) {
118
147
  command: record.command,
119
148
  exitCode: record.exitCode,
120
149
  durationMs: record.durationMs,
121
- ...(deps.logger ? { logger: deps.logger } : {}),
122
- ...(record.provenance ? { provenance: record.provenance } : {}),
150
+ logger: deps.logger,
151
+ provenance: record.provenance,
123
152
  });
124
153
  }
125
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",
@@ -21,5 +21,6 @@ export * from "./mutator.js";
21
21
  export * from "./execute-command.js";
22
22
  export * from "./write-file.js";
23
23
  export * from "./edit-file.js";
24
+ export * from "./decision-record.js";
24
25
  export { EXEC_STREAM_BYTE_CAP, boundExecResult } from "./result-bounds.js";
25
26
  export type { BoundedExecResult } from "./result-bounds.js";
@@ -23,4 +23,5 @@ export * from "./mutator.js";
23
23
  export * from "./execute-command.js";
24
24
  export * from "./write-file.js";
25
25
  export * from "./edit-file.js";
26
+ export * from "./decision-record.js";
26
27
  export { EXEC_STREAM_BYTE_CAP, boundExecResult } from "./result-bounds.js";
@@ -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";
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