@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
@@ -26,11 +26,17 @@
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
  */
37
+ import { createHash } from "node:crypto";
32
38
  import { constants } from "node:fs";
33
- import { lstat, mkdir, open, realpath } from "node:fs/promises";
39
+ import { lstat, mkdir, open, realpath, rename, unlink } from "node:fs/promises";
34
40
  import { basename, dirname, join as joinPath, relative as relativePath, resolve as resolvePath, sep } from "node:path";
35
41
  import { createNoopLogger } from "../../lib/console-logger.js";
36
42
  import { computeSha256 } from "../../lib/fs-helpers.js";
@@ -38,6 +44,13 @@ import { tryFs, tryFsWrite } from "../../lib/fs-result.js";
38
44
  import { unwrapOrThrow } from "../../lib/result.js";
39
45
  import { bindSessionEmit } from "../../provenance/seam.js";
40
46
  import { resolveForWrite } from "../../workspace/paths.js";
47
+ /**
48
+ * Agent-visible name of the tool driving a confined write. Rides the write args
49
+ * so a successful write is attributed to the invoking tool in provenance
50
+ * (`inflexa:tool` in the signed document) — the seam records the write without
51
+ * inspecting its caller.
52
+ */
53
+ export const MUTATE_TOOL_NAMES = ["write_file", "edit_file", "knowledge_template", "execute_command"];
41
54
  /**
42
55
  * Land `bytes` at `absolute`, hardened against a symlink re-aiming the write.
43
56
  * `absolute` is already lexically confined under `prefix` by the resolver;
@@ -53,14 +66,14 @@ import { resolveForWrite } from "../../workspace/paths.js";
53
66
  * the created directory and refuse when it lands outside the prefix — a
54
67
  * symlink raced into a missing segment between the ancestor check and the
55
68
  * recursive mkdir would re-aim the tail of the path.
56
- * 4. Refuse a symlinked final component (lstat), then open with
57
- * `O_NOFOLLOW` so a symlink raced in after the check still cannot be
58
- * followed.
69
+ * 4. Refuse a symlinked final component (lstat), then stage the bytes in a
70
+ * temporary file beside it and rename that file over it. The rename
71
+ * replaces a symlink raced in after the check, and never follows it.
59
72
  *
60
73
  * Refusals are data; a genuine I/O failure throws (the loop's dispatch catch
61
- * maps it to an error tool result).
74
+ * maps it to an error tool result). A throw removes the temporary file.
62
75
  */
63
- async function landBytes(prefix, absolute, bytes) {
76
+ async function landBytes(prefix, absolute, bytes, stagingKey, beforeRename) {
64
77
  unwrapOrThrow(await tryFsWrite("mutator.mkdirPrefix", () => mkdir(prefix, { recursive: true }), { path: prefix }));
65
78
  const realPrefix = unwrapOrThrow(await tryFs("mutator.realpathPrefix", () => realpath(prefix), { path: prefix }));
66
79
  // Deepest existing ancestor of the target. The walk stops at the prefix,
@@ -85,8 +98,8 @@ async function landBytes(prefix, absolute, bytes) {
85
98
  // a symlink raced into a missing segment after the ancestor check would
86
99
  // re-aim the tail. The canonical path of the created directory exposes
87
100
  // it; a directory that vanished before the check is hostile too. The
88
- // open below uses the canonical path, so the write never traverses the
89
- // raced segment again.
101
+ // staging below uses the canonical path, so the write never traverses
102
+ // the raced segment again.
90
103
  const realTarget = unwrapOrThrow(await tryFs("mutator.realpathTarget", () => realpath(targetDir), { path: targetDir, onAbsent: () => null }));
91
104
  if (realTarget === null)
92
105
  return "symlink_denied";
@@ -98,24 +111,54 @@ async function landBytes(prefix, absolute, bytes) {
98
111
  const finalStat = unwrapOrThrow(await tryFs("mutator.lstatFinal", () => lstat(finalPath), { path: finalPath, onAbsent: () => null }));
99
112
  if (finalStat !== null && finalStat.isSymbolicLink())
100
113
  return "symlink_denied";
101
- // `O_NOFOLLOW` backstops the lstat refusal: a symlink raced in between the
102
- // two calls fails the open (`ELOOP`) instead of being followed.
103
- const handle = unwrapOrThrow(await tryFsWrite("mutator.open", () => open(finalPath, constants.O_WRONLY | constants.O_CREAT | constants.O_TRUNC | constants.O_NOFOLLOW), {
104
- path: finalPath,
105
- }));
114
+ const stagingPath = joinPath(landingDir, stagingNameFor(stagingKey, finalPath));
115
+ let landed = false;
106
116
  try {
107
- unwrapOrThrow(await tryFsWrite("mutator.writeBytes", () => handle.writeFile(bytes), { path: finalPath }));
117
+ await stageBytes(stagingPath, bytes, finalStat?.isFile() === true ? finalStat.mode : undefined);
118
+ if (beforeRename !== undefined)
119
+ await beforeRename();
120
+ unwrapOrThrow(await tryFsWrite("mutator.rename", () => rename(stagingPath, finalPath), { path: finalPath }));
121
+ landed = true;
108
122
  }
109
123
  finally {
110
- unwrapOrThrow(await tryFsWrite("mutator.close", () => handle.close(), { path: finalPath }));
124
+ if (!landed)
125
+ await tryFsWrite("mutator.removeStaging", () => unlink(stagingPath), { path: stagingPath }).unwrapOr(undefined);
111
126
  }
112
127
  return "ok";
113
128
  }
129
+ /**
130
+ * The name of the temporary file of one write. A rerun of the same call writes
131
+ * the same name, thus it replaces a file that a dead process left behind.
132
+ */
133
+ function stagingNameFor(stagingKey, finalPath) {
134
+ return `.${createHash("sha256").update(`${stagingKey}\0${finalPath}`).digest("hex").slice(0, 32)}.tmp`;
135
+ }
136
+ /**
137
+ * Write `bytes` to the temporary file. The file takes the permission bits of
138
+ * the file that it replaces, thus an edit keeps, for example, the execute bit
139
+ * of a script.
140
+ */
141
+ async function stageBytes(stagingPath, bytes, replacedMode) {
142
+ // `O_NOFOLLOW` refuses a symlink planted at the staging name (`ELOOP`).
143
+ const handle = unwrapOrThrow(await tryFsWrite("mutator.openStaging", () => open(stagingPath, constants.O_WRONLY | constants.O_CREAT | constants.O_TRUNC | constants.O_NOFOLLOW), {
144
+ path: stagingPath,
145
+ }));
146
+ try {
147
+ unwrapOrThrow(await tryFsWrite("mutator.writeBytes", () => handle.writeFile(bytes), { path: stagingPath }));
148
+ if (replacedMode !== undefined) {
149
+ unwrapOrThrow(await tryFsWrite("mutator.chmodStaging", () => handle.chmod(replacedMode & 0o7777), { path: stagingPath }));
150
+ }
151
+ }
152
+ finally {
153
+ unwrapOrThrow(await tryFsWrite("mutator.close", () => handle.close(), { path: stagingPath }));
154
+ }
155
+ }
114
156
  /**
115
157
  * The shared write gauntlet both realizations run: resolve + confine
116
158
  * (`resolveForWrite`), then the hardened landing. A refusal comes back as data;
117
159
  * an ok carries what the caller's provenance record needs — the
118
- * analysis-relative path and the exact bytes that landed.
160
+ * analysis-relative path and the exact bytes that landed. `beforeLand` gets
161
+ * the same ok while the bytes wait in the temporary file.
119
162
  */
120
163
  async function confinedWrite(args) {
121
164
  const scoped = resolveForWrite({
@@ -135,37 +178,44 @@ async function confinedWrite(args) {
135
178
  const agentPath = `/${args.analysisId}/${relative}`;
136
179
  const bytes = Buffer.from(args.content, "utf8");
137
180
  const prefix = resolvePath(args.workingDir);
138
- const landed = await landBytes(prefix, scoped.absolute, bytes);
181
+ const confined = { status: "ok", relative, agentPath, bytes };
182
+ const { beforeLand } = args;
183
+ const landed = await landBytes(prefix, scoped.absolute, bytes, args.invocationId, beforeLand === undefined ? undefined : () => beforeLand(confined));
139
184
  if (landed !== "ok")
140
185
  return { status: landed };
141
- return { status: "ok", relative, agentPath, bytes };
186
+ return confined;
142
187
  }
143
188
  export function createWorkspaceMutator(deps) {
144
189
  return {
145
- async writeFile({ path, content, toolName, invocationId }) {
190
+ async writeFile({ path, content, toolName, invocationId, beforeLand }) {
191
+ const landedWrite = (landed) => {
192
+ // `invocationId` is replay-stable: the model turn that minted the tool
193
+ // call is a durably cached step, so a re-execution replays the same id.
194
+ // That is what lets the bridge key a DETERMINISTIC call-activity
195
+ // identifier on it — a wall-clock stamp here would be re-minted per
196
+ // replay and must never reach an identifier or a formal PROV position.
197
+ const record = {
198
+ analysisId: deps.analysisId,
199
+ path: landed.relative,
200
+ hash: computeSha256(landed.bytes),
201
+ size: landed.bytes.length,
202
+ toolName,
203
+ invocationId,
204
+ };
205
+ return { status: "ok", path: landed.agentPath, bytesWritten: landed.bytes.length, record };
206
+ };
146
207
  const landed = await confinedWrite({
147
208
  workspaceRoot: deps.workspaceRoot,
148
209
  analysisId: deps.analysisId,
149
210
  workingDir: deps.workingDir,
150
211
  path,
151
212
  content,
213
+ invocationId,
214
+ beforeLand: beforeLand === undefined ? undefined : (staged) => beforeLand(landedWrite(staged)),
152
215
  });
153
216
  if (landed.status !== "ok")
154
217
  return { status: landed.status, path };
155
- // `invocationId` is replay-stable: the model turn that minted the tool
156
- // call is a durably cached step, so a re-execution replays the same id.
157
- // That is what lets the bridge key a DETERMINISTIC call-activity
158
- // identifier on it — a wall-clock stamp here would be re-minted per
159
- // replay and must never reach an identifier or a formal PROV position.
160
- const record = {
161
- analysisId: deps.analysisId,
162
- path: landed.relative,
163
- hash: computeSha256(landed.bytes),
164
- size: landed.bytes.length,
165
- toolName,
166
- invocationId,
167
- };
168
- return { status: "ok", path: landed.agentPath, bytesWritten: landed.bytes.length, record };
218
+ return landedWrite(landed);
169
219
  },
170
220
  recordWrite(record) {
171
221
  deps.lineageCollector?.recordFileToolWrite({
@@ -195,12 +245,21 @@ export function createSessionWorkspaceMutator(deps) {
195
245
  const logger = (deps.logger ?? createNoopLogger()).named("workspace-mutator");
196
246
  const observe = bindSessionEmit(deps.provenance, logger);
197
247
  return {
198
- async writeFile({ path, content, toolName, invocationId, session }) {
199
- // Only an analysis scope has a workspace tree; under any other
200
- // scope there is nothing in scope to write.
248
+ async writeFile({ path, content, toolName, invocationId, session, beforeLand }) {
201
249
  const scope = session.scope;
202
- if (scope.kind !== "analysis")
203
- return { status: "out_of_scope", path };
250
+ const landedWrite = (landed) => {
251
+ const record = {
252
+ analysisId: scope.analysisId,
253
+ path: landed.relative,
254
+ hash: computeSha256(landed.bytes),
255
+ size: landed.bytes.length,
256
+ toolName,
257
+ invocationId,
258
+ };
259
+ if (scope.threadId !== undefined)
260
+ record.threadId = scope.threadId;
261
+ return { status: "ok", path: landed.agentPath, bytesWritten: landed.bytes.length, record };
262
+ };
204
263
  // Rejects on an unknown analysis — the loop's dispatch catch maps
205
264
  // it to an error tool result, like any unexpected host failure.
206
265
  const workspaceRoot = await deps.resolveWorkspaceRoot(scope.analysisId);
@@ -210,31 +269,26 @@ export function createSessionWorkspaceMutator(deps) {
210
269
  workingDir: workspaceRoot,
211
270
  path,
212
271
  content,
272
+ invocationId,
273
+ beforeLand: beforeLand === undefined ? undefined : (staged) => beforeLand(landedWrite(staged)),
213
274
  });
214
275
  if (landed.status !== "ok")
215
276
  return { status: landed.status, path };
216
- const record = {
217
- analysisId: scope.analysisId,
218
- ...(scope.threadId !== undefined ? { threadId: scope.threadId } : {}),
219
- path: landed.relative,
220
- hash: computeSha256(landed.bytes),
221
- size: landed.bytes.length,
222
- toolName,
223
- invocationId,
224
- };
225
- return { status: "ok", path: landed.agentPath, bytesWritten: landed.bytes.length, record };
277
+ return landedWrite(landed);
226
278
  },
227
279
  recordWrite(record) {
228
- observe({
280
+ const event = {
229
281
  type: "write-file",
230
282
  analysisId: record.analysisId,
231
- ...(record.threadId !== undefined ? { threadId: record.threadId } : {}),
232
283
  path: record.path,
233
284
  hash: record.hash,
234
285
  size: record.size,
235
286
  tool: record.toolName,
236
287
  invocationId: record.invocationId,
237
- });
288
+ };
289
+ if (record.threadId !== undefined)
290
+ event.threadId = record.threadId;
291
+ observe(event);
238
292
  },
239
293
  };
240
294
  }
@@ -7,6 +7,8 @@
7
7
  * oversize read is `truncated`. Only unexpected I/O errors throw; the loop
8
8
  * wraps them as `is_error`.
9
9
  */
10
+ import { z } from "zod";
11
+ import { type Tool } from "../define-tool.js";
10
12
  import type { WorkspaceFilesystem } from "../../workspace/filesystem.js";
11
13
  type ReadFileOutput = {
12
14
  status: "invalid_input";
@@ -36,9 +38,10 @@ type ReadFileOutput = {
36
38
  mode: "head" | "tail" | "full";
37
39
  totalSize?: number;
38
40
  };
39
- export declare function createReadFileTool(fs: WorkspaceFilesystem, workingDir?: string): import("../define-tool.js").Tool<{
40
- path: string;
41
- headLines?: number | undefined;
42
- tailLines?: number | undefined;
43
- }, ReadFileOutput>;
41
+ declare const ReadFileInputSchema: z.ZodObject<{
42
+ path: z.ZodString;
43
+ headLines: z.ZodOptional<z.ZodNumber>;
44
+ tailLines: z.ZodOptional<z.ZodNumber>;
45
+ }, z.core.$strip>;
46
+ export declare function createReadFileTool(fs: WorkspaceFilesystem, workingDir?: string): Tool<z.infer<typeof ReadFileInputSchema>, ReadFileOutput>;
44
47
  export {};
@@ -17,13 +17,13 @@
17
17
  import type { ExecResult } from "../../sandbox/types.js";
18
18
  /** Per-stream cap: the maximum of a kept tool output, thus the host gets each stream that the store can keep. */
19
19
  export declare const EXEC_STREAM_BYTE_CAP: number;
20
- export interface BoundedStream {
20
+ export type BoundedStream = {
21
21
  readonly content: string;
22
22
  readonly truncated: boolean;
23
23
  readonly totalLength: number;
24
24
  readonly returnedBytes: number;
25
- }
26
- export interface BoundedExecResult {
25
+ };
26
+ export type BoundedExecResult = {
27
27
  readonly execId: string;
28
28
  readonly exitCode: number | null;
29
29
  readonly stdout: string;
@@ -34,10 +34,10 @@ export interface BoundedExecResult {
34
34
  readonly stderrTotalLength: number;
35
35
  readonly durationMs: number | null;
36
36
  readonly timedOut: boolean;
37
- readonly syntheticFailure?: {
37
+ syntheticFailure?: {
38
38
  readonly reason: string;
39
39
  };
40
- }
40
+ };
41
41
  /**
42
42
  * Bound an `ExecResult`'s streams while keeping its shape.
43
43
  *
@@ -94,7 +94,7 @@ export function capExecStreams(result, cap = EXEC_STREAM_BYTE_CAP) {
94
94
  export function boundExecResult(result, cap = EXEC_STREAM_BYTE_CAP) {
95
95
  const outStream = boundStream(result.stdout, cap);
96
96
  const errStream = boundStream(result.stderr, cap);
97
- return {
97
+ const bounded = {
98
98
  execId: result.execId,
99
99
  exitCode: result.exitCode,
100
100
  stdout: outStream.content,
@@ -105,6 +105,8 @@ export function boundExecResult(result, cap = EXEC_STREAM_BYTE_CAP) {
105
105
  stderrTotalLength: result.stderrTotalBytes ?? errStream.totalLength,
106
106
  durationMs: result.durationMs,
107
107
  timedOut: result.timedOut,
108
- ...(result.syntheticFailure ? { syntheticFailure: result.syntheticFailure } : {}),
109
108
  };
109
+ if (result.syntheticFailure)
110
+ bounded.syntheticFailure = result.syntheticFailure;
111
+ return bounded;
110
112
  }
@@ -10,7 +10,7 @@
10
10
  import type { SandboxClient } from "../../sandbox/client.js";
11
11
  import type { ExecResult, SandboxRef } from "../../sandbox/types.js";
12
12
  import type { EmitFn } from "../define-tool.js";
13
- export interface RunExecArgs {
13
+ export type RunExecArgs = {
14
14
  readonly sandboxClient: SandboxClient;
15
15
  readonly sandbox: SandboxRef;
16
16
  readonly command: readonly string[];
@@ -19,5 +19,5 @@ export interface RunExecArgs {
19
19
  readonly timeoutSeconds?: number;
20
20
  readonly deadlineMs: number;
21
21
  readonly emit: EmitFn;
22
- }
22
+ };
23
23
  export declare function runSandboxExec(args: RunExecArgs): Promise<ExecResult>;
@@ -10,8 +10,8 @@
10
10
  export function runSandboxExec(args) {
11
11
  return args.sandboxClient.exec(args.sandbox, {
12
12
  command: args.command,
13
- ...(args.cwd === undefined ? {} : { cwd: args.cwd }),
14
- ...(args.env === undefined ? {} : { env: args.env }),
15
- ...(args.timeoutSeconds === undefined ? {} : { timeoutSeconds: args.timeoutSeconds }),
13
+ cwd: args.cwd,
14
+ env: args.env,
15
+ timeoutSeconds: args.timeoutSeconds,
16
16
  }, (event) => args.emit({ type: "data-sandbox-event", data: { event } }), args.deadlineMs);
17
17
  }
@@ -11,17 +11,19 @@
11
11
  * prefix-sufficient header readout run in-process over the workspace read seam; only a
12
12
  * footer-indexed container reaches into the sandbox (see `input-scan/enrich.ts`).
13
13
  */
14
+ import { z } from "zod";
14
15
  import type { SandboxClient } from "../../sandbox/client.js";
15
16
  import type { SandboxRef } from "../../sandbox/types.js";
16
17
  import type { WorkspaceFilesystem } from "../../workspace/filesystem.js";
17
- export interface ScanInputsDeps {
18
+ import { type Tool } from "../define-tool.js";
19
+ export type ScanInputsDeps = {
18
20
  readonly workspaceFs: WorkspaceFilesystem;
19
21
  readonly analysisId: string;
20
22
  /** Omit to skip the container readouts; the prefix readouts run regardless. */
21
23
  readonly sandboxClient?: SandboxClient;
22
24
  readonly sandbox?: SandboxRef;
23
25
  readonly deadlineMs: () => number;
24
- }
26
+ };
25
27
  type ScanInputsOutput = {
26
28
  readonly path: string;
27
29
  readonly fileCount: number;
@@ -29,7 +31,8 @@ type ScanInputsOutput = {
29
31
  /** The rendered manifest — bounded whatever the subtree's size. */
30
32
  readonly manifest: string;
31
33
  };
32
- export declare function createScanInputsTool(deps: ScanInputsDeps): import("../define-tool.js").Tool<{
33
- path: string;
34
- }, ScanInputsOutput>;
34
+ declare const ScanInputsInputSchema: z.ZodObject<{
35
+ path: z.ZodString;
36
+ }, z.core.$strip>;
37
+ export declare function createScanInputsTool(deps: ScanInputsDeps): Tool<z.infer<typeof ScanInputsInputSchema>, ScanInputsOutput>;
35
38
  export {};
@@ -15,7 +15,20 @@ import { ok } from "neverthrow";
15
15
  import { z } from "zod";
16
16
  import { enrichShapes } from "../../input-scan/enrich.js";
17
17
  import { renderInputScanManifest, scanInputTree } from "../../input-scan/scan.js";
18
+ /** The path without its leading and trailing slashes. */
19
+ function stripEdgeSlashes(value) {
20
+ let start = 0;
21
+ let end = value.length;
22
+ while (start < end && value.charAt(start) === "/")
23
+ start++;
24
+ while (end > start && value.charAt(end - 1) === "/")
25
+ end--;
26
+ return value.slice(start, end);
27
+ }
18
28
  import { defineTool } from "../define-tool.js";
29
+ const ScanInputsInputSchema = z.object({
30
+ path: z.string().min(1).describe("Directory to scan, relative to the analysis root (e.g. 'data/inputs' or 'data/inputs/vcf')."),
31
+ });
19
32
  export function createScanInputsTool(deps) {
20
33
  return defineTool({
21
34
  id: "scan_inputs",
@@ -29,22 +42,21 @@ export function createScanInputsTool(deps) {
29
42
  "Your briefing already carries a scan of the whole input tree; call this to look at a subtree more closely, " +
30
43
  "or to check a grouping you are unsure about. " +
31
44
  "It reports observations only: which files are one KIND of data, and what a varying position MEANS, are yours to decide.",
32
- inputSchema: z.object({
33
- path: z.string().min(1).describe("Directory to scan, relative to the analysis root (e.g. 'data/inputs' or 'data/inputs/vcf')."),
34
- }),
45
+ inputSchema: ScanInputsInputSchema,
35
46
  describeCall: ({ path }) => path,
36
47
  execute: async ({ path }, ctx) => {
37
48
  const scan = await scanInputTree({
38
49
  session: ctx.session,
39
50
  fs: deps.workspaceFs,
40
- root: path.replace(/^\/+/, "").replace(/\/+$/, ""),
51
+ root: stripEdgeSlashes(path),
41
52
  signal: ctx.signal,
42
53
  });
43
54
  const shapes = await enrichShapes({
44
55
  shapes: scan.manifest.shapes,
45
56
  session: ctx.session,
46
57
  fs: deps.workspaceFs,
47
- ...(deps.sandboxClient && deps.sandbox ? { sandboxClient: deps.sandboxClient, sandbox: deps.sandbox } : {}),
58
+ sandboxClient: deps.sandboxClient,
59
+ sandbox: deps.sandbox,
48
60
  mountRoot: `/${deps.analysisId}`,
49
61
  deadlineMs: deps.deadlineMs(),
50
62
  emit: ctx.emit,
@@ -21,11 +21,11 @@ type ShowFileOutput = {
21
21
  id: string;
22
22
  };
23
23
  export declare const showFileTool: import("../define-tool.js").Tool<{
24
+ title?: string | undefined;
24
25
  files: {
25
26
  path: string;
26
27
  caption?: string | undefined;
27
28
  }[];
28
- title?: string | undefined;
29
29
  }, ShowFileOutput>;
30
30
  /** Exposed for tests. */
31
31
  export declare const __testing: {
@@ -12,6 +12,7 @@
12
12
  * live emit and the reconstruct-on-read path produce byte-identical cards.
13
13
  */
14
14
  import { ok } from "neverthrow";
15
+ import { presentFirst } from "../../lib/present.js";
15
16
  import { z } from "zod";
16
17
  import { buildFileReferenceCardData, deriveRunId, fileGroupHash, MAX_FILES } from "../../memory/card-builders.js";
17
18
  import { defineTool } from "../define-tool.js";
@@ -42,7 +43,7 @@ export const showFileTool = defineTool({
42
43
  "(markdown image syntax pointing at a workspace file does NOT render — this tool is the only way to show one).",
43
44
  inputSchema: ShowFileInputSchema,
44
45
  // `.min(1)` on `files` makes index 0 total after the parse.
45
- describeCall: ({ files }) => (files.length === 1 ? files[0].path : `${files.length} files`),
46
+ describeCall: ({ files }) => (files.length === 1 ? presentFirst(files, "the shown file").path : `${files.length} files`),
46
47
  execute: async (input, ctx) => {
47
48
  const card = buildFileReferenceCardData(input);
48
49
  // A malformed/traversal path yields no card — an expected outcome the model can self-correct
@@ -8,7 +8,9 @@
8
8
  * Dependency-bearing: the database `Pool` is captured by the factory
9
9
  * (see the harness-durable-runtime spec). The analysis id is read from the request-scoped `Session`.
10
10
  */
11
- import type { Pool } from "pg";
11
+ import { z } from "zod";
12
+ import type { PlanRowQuerier } from "../../state/plans.js";
13
+ import { type Tool } from "../define-tool.js";
12
14
  type ShowPlanOutput = {
13
15
  shown: false;
14
16
  reason: "plan_not_found";
@@ -16,8 +18,9 @@ type ShowPlanOutput = {
16
18
  shown: true;
17
19
  id: string;
18
20
  };
19
- export declare function createShowPlanTool(pool: Pool): import("../define-tool.js").Tool<{
20
- planId: string;
21
- title?: string | undefined;
22
- }, ShowPlanOutput>;
21
+ declare const ShowPlanInputSchema: z.ZodObject<{
22
+ planId: z.ZodString;
23
+ title: z.ZodOptional<z.ZodString>;
24
+ }, z.core.$strip>;
25
+ export declare function createShowPlanTool(pool: PlanRowQuerier): Tool<z.infer<typeof ShowPlanInputSchema>, ShowPlanOutput>;
23
26
  export {};
@@ -13,8 +13,15 @@ import { z } from "zod";
13
13
  import { buildPlanCardData } from "../../memory/card-builders.js";
14
14
  import { scopeResource } from "../../auth/types.js";
15
15
  import { unwrapOrThrow } from "../../lib/result.js";
16
+ import { PLAN_ID_RE } from "../../contracts/schemas/chat-parts.js";
16
17
  import { defineTool } from "../define-tool.js";
17
- const PLAN_ID_REGEX = /^pln-[a-f0-9]{8}$/;
18
+ const ShowPlanInputSchema = z.object({
19
+ planId: z
20
+ .string()
21
+ .regex(PLAN_ID_RE, "planId must match pln-<8hex>")
22
+ .describe("Plan ID (`pln-<8hex>`) from `generate_plan` (newly created) or `inspect_run` (each run carries the planId it ran)"),
23
+ title: z.string().optional().describe("Optional card heading; defaults to the plan's own title"),
24
+ });
18
25
  export function createShowPlanTool(pool) {
19
26
  return defineTool({
20
27
  id: "show_plan",
@@ -25,13 +32,7 @@ export function createShowPlanTool(pool) {
25
32
  "NOT for a plan you are drafting in conversation (that is `generate_plan`), NOT for other synthesized content " +
26
33
  "(`show_user`), NOT for analysis files (`show_file`). Never re-type a plan's steps into a `show_user` markdown " +
27
34
  "card — that renders a second, divergent copy of the same plan.",
28
- inputSchema: z.object({
29
- planId: z
30
- .string()
31
- .regex(PLAN_ID_REGEX, "planId must match pln-<8hex>")
32
- .describe("Plan ID (`pln-<8hex>`) from `generate_plan` (newly created) or `inspect_run` (each run carries the planId it ran)"),
33
- title: z.string().optional().describe("Optional card heading; defaults to the plan's own title"),
34
- }),
35
+ inputSchema: ShowPlanInputSchema,
35
36
  describeCall: ({ planId }) => planId,
36
37
  execute: async ({ planId, title }, ctx) => {
37
38
  const resourceId = scopeResource(ctx.session.scope).resourceId;
@@ -10,8 +10,10 @@
10
10
  * rows by cosine similarity. "Nothing indexed yet" (the index table does not
11
11
  * exist) is an expected outcome — an empty result list, not an error.
12
12
  */
13
- import type { Pool } from "pg";
13
+ import type { QueryConfig } from "pg";
14
+ import { z } from "zod";
14
15
  import type { EmbeddingProvider } from "../../providers/types.js";
16
+ import { type Tool } from "../define-tool.js";
15
17
  /**
16
18
  * The workspace path a hit addresses, or `undefined` for a pattern entry. Resolved here,
17
19
  * once, across every index era — group/dimension/kind entries and previous-era entity
@@ -20,15 +22,41 @@ import type { EmbeddingProvider } from "../../providers/types.js";
20
22
  * segment. The consumer branches on presence, nothing else.
21
23
  */
22
24
  export declare function fileTargetOf(id: string, metadata: unknown): string | undefined;
23
- export declare function createWorkspaceSearchTool(pool: Pool, embedding: EmbeddingProvider): import("../define-tool.js").Tool<{
24
- query: string;
25
- limit: number;
26
- type?: "output" | "input" | "summary" | "synthesis" | "input-group" | "input-dimension" | "input-kind" | undefined;
27
- }, {
28
- results: {
29
- metadata: unknown;
30
- path?: string | undefined;
31
- id: string;
32
- score: number;
33
- }[];
34
- }>;
25
+ /** One search-hit row, as the pgvector SELECT returns it. */
26
+ type SearchHitRow = {
27
+ id: string;
28
+ score: number;
29
+ metadata: unknown;
30
+ };
31
+ /** One ranked entry the tool returns: the row plus the workspace path it addresses. */
32
+ type WorkspaceSearchHit = {
33
+ id: string;
34
+ score: number;
35
+ path: string | undefined;
36
+ metadata: unknown;
37
+ };
38
+ type WorkspaceSearchOutput = {
39
+ results: WorkspaceSearchHit[];
40
+ };
41
+ declare const WorkspaceSearchInputSchema: z.ZodObject<{
42
+ query: z.ZodString;
43
+ type: z.ZodOptional<z.ZodEnum<{
44
+ input: "input";
45
+ "input-dimension": "input-dimension";
46
+ "input-group": "input-group";
47
+ "input-kind": "input-kind";
48
+ output: "output";
49
+ summary: "summary";
50
+ synthesis: "synthesis";
51
+ }>>;
52
+ limit: z.ZodDefault<z.ZodNumber>;
53
+ }, z.core.$strip>;
54
+ /** What the workspace search reads of the pool: its one row-reading query. A real `Pool` satisfies it. */
55
+ export type WorkspaceSearchQuerier = {
56
+ query(queryTextOrConfig: string | QueryConfig, values?: unknown[]): Promise<{
57
+ rows: SearchHitRow[];
58
+ rowCount: number | null;
59
+ }>;
60
+ };
61
+ export declare function createWorkspaceSearchTool(pool: WorkspaceSearchQuerier, embedding: EmbeddingProvider): Tool<z.infer<typeof WorkspaceSearchInputSchema>, WorkspaceSearchOutput>;
62
+ export {};