@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
@@ -32,6 +32,10 @@ import { join as hostJoin, posix as posixPath } from "node:path";
32
32
  import { ok } from "neverthrow";
33
33
  import { z } from "zod";
34
34
  import { capCodePoints, DETAIL_MAX_LENGTH, DETAIL_NEEDLE_MAX_LENGTH } from "../../loop/tool-detail.js";
35
+ import { errnoOf } from "../../lib/fs-result.js";
36
+ import { parseJsonAs } from "../../lib/parse-json.js";
37
+ import { isUnknownArray } from "../../lib/unknown-array.js";
38
+ import { parseUnknownRecord } from "../../lib/unknown-containers.js";
35
39
  import { REFERENCE_DATA_CATALOG } from "../../reference-data/catalog.js";
36
40
  import { parseReferenceInstallReceipt } from "../../reference-data/receipt.js";
37
41
  import { REFS_CONTAINER_PATH } from "../../sandbox/mount-plan.js";
@@ -158,6 +162,8 @@ async function summarizeDirectory(directory, scanned) {
158
162
  const stack = [directory];
159
163
  while (stack.length > 0 && scanned < MAX_SCANNED_ENTRIES) {
160
164
  const current = stack.pop();
165
+ if (current === undefined)
166
+ break;
161
167
  const { values, cut } = await cappedEntries(current, MAX_SCANNED_ENTRIES - scanned);
162
168
  truncated = truncated || cut;
163
169
  const childDirectories = [];
@@ -196,7 +202,7 @@ async function readReceipts(root) {
196
202
  // A shared try would abandon the loop and silently drop every receipt sorting
197
203
  // after the bad one, quietly stripping metadata from datasets that are fine.
198
204
  try {
199
- receipts.push(JSON.parse(await readFile(hostJoin(receiptsDirectory, entry.name), "utf-8")));
205
+ receipts.push(parseJsonAs(await readFile(hostJoin(receiptsDirectory, entry.name), "utf-8"), z.json()));
200
206
  totalBytes += entry.bytes;
201
207
  }
202
208
  catch {
@@ -205,6 +211,54 @@ async function readReceipts(root) {
205
211
  }
206
212
  return receipts;
207
213
  }
214
+ /**
215
+ * The dataset ids the install receipts of the store report, for a caller that must know whether a
216
+ * declared dataset is present BEFORE a run starts.
217
+ *
218
+ * `undefined` means the store itself could not be answered for: an unreadable root, a `.inflexa`
219
+ * that crosses a symlink, or a receipts directory that exists and cannot be listed. That is NOT an
220
+ * empty install, and a caller must never collapse the two — every dataset would read as absent, and
221
+ * a launch would be refused over data that is sitting in the store.
222
+ *
223
+ * An empty set is a real answer: the store is readable and it holds no receipt.
224
+ */
225
+ export async function readInstalledDatasetIds(deps) {
226
+ const storeRoot = deps.refStorePath ?? REFS_ROOT;
227
+ try {
228
+ await lstat(storeRoot);
229
+ }
230
+ catch {
231
+ return undefined;
232
+ }
233
+ if (await crossesSymlink(storeRoot, ".inflexa"))
234
+ return undefined;
235
+ const receiptsDirectory = hostJoin(storeRoot, ".inflexa", "receipts");
236
+ let names;
237
+ try {
238
+ names = (await readdir(receiptsDirectory)).slice(0, MAX_RECEIPT_FILES);
239
+ }
240
+ catch (error) {
241
+ // An absent directory is a readable store with nothing installed. Any other failure is the
242
+ // store declining to answer, which is a different fact and gets the honest `undefined`.
243
+ if (errnoOf(error) === "ENOENT")
244
+ return new Set();
245
+ return undefined;
246
+ }
247
+ const ids = new Set();
248
+ for (const name of names) {
249
+ // Per-file, so one malformed receipt costs only its own dataset. A shared try would drop
250
+ // every receipt after the bad one and read as a store that holds almost nothing.
251
+ try {
252
+ const receipt = parseReferenceInstallReceipt(parseJsonAs(await readFile(hostJoin(receiptsDirectory, name), "utf-8"), z.json()));
253
+ if (receipt)
254
+ ids.add(receipt.datasetId);
255
+ }
256
+ catch {
257
+ continue;
258
+ }
259
+ }
260
+ return ids;
261
+ }
208
262
  /** Labels from a `registry.json` an externally-provisioned store may carry. */
209
263
  async function readLegacyEntries(root) {
210
264
  const legacyEntries = [];
@@ -214,21 +268,24 @@ async function readLegacyEntries(root) {
214
268
  const registryPath = hostJoin(root, "registry.json");
215
269
  if ((await lstat(registryPath)).size > MAX_REGISTRY_BYTES)
216
270
  return [];
217
- const registry = JSON.parse(await readFile(registryPath, "utf-8"));
218
- if (!registry || typeof registry !== "object")
271
+ const registry = parseJsonAs(await readFile(registryPath, "utf-8"), z.json());
272
+ const registryRecord = parseUnknownRecord(registry);
273
+ if (!registryRecord)
219
274
  return [];
220
- const byCategory = registry.files?.by_category;
221
- if (!byCategory || typeof byCategory !== "object")
275
+ const files = parseUnknownRecord(registryRecord.files);
276
+ const categories = parseUnknownRecord(files?.by_category);
277
+ if (!categories)
222
278
  return [];
223
- for (const category of Object.keys(byCategory).sort()) {
224
- const values = byCategory[category];
225
- if (!Array.isArray(values))
279
+ for (const category of Object.keys(categories).sort()) {
280
+ const values = categories[category];
281
+ if (!isUnknownArray(values))
226
282
  continue;
227
283
  for (const item of values) {
228
284
  if (legacyEntries.length >= MAX_LEGACY_ENTRIES)
229
285
  break;
230
- if (item && typeof item === "object" && typeof item.local_path === "string") {
231
- legacyEntries.push({ ...item, category });
286
+ const itemRecord = parseUnknownRecord(item);
287
+ if (itemRecord && typeof itemRecord.local_path === "string") {
288
+ legacyEntries.push({ ...itemRecord, category });
232
289
  }
233
290
  }
234
291
  }
@@ -253,6 +310,8 @@ async function collectFiles(directory, relative, budget) {
253
310
  const stack = [{ path: directory, relative }];
254
311
  while (stack.length > 0 && budget.scanned < MAX_SCANNED_ENTRIES) {
255
312
  const current = stack.pop();
313
+ if (current === undefined)
314
+ break;
256
315
  const { values, cut } = await cappedEntries(current.path, MAX_SCANNED_ENTRIES - budget.scanned);
257
316
  truncated = truncated || cut;
258
317
  for (const child of values) {
@@ -391,41 +450,55 @@ function enrichEntries(entries, raw) {
391
450
  // Per-artifact, not per-dataset: format and contents differ between files of the
392
451
  // same dataset (a Seurat object and its Annoy index are read nothing alike).
393
452
  const catalogArtifact = dataset?.artifacts.find((candidate) => candidate.path === artifact.path);
394
- metadata.set(`${REFS_ROOT}/managed/${receipt.datasetId}/${receipt.datasetVersion}/${artifact.path}`, {
453
+ const managedMetadata = {
395
454
  datasetId: receipt.datasetId,
396
455
  version: receipt.datasetVersion,
397
- ...(dataset
398
- ? {
399
- title: dataset.title,
400
- description: dataset.description,
401
- sourceUrl: dataset.sourceUrl,
402
- license: dataset.license.url ?? dataset.license.identifier,
403
- category: dataset.recommendation.group,
404
- ...(dataset.organism ? { organism: dataset.organism } : {}),
405
- }
406
- : {}),
407
- ...(catalogArtifact ? { format: catalogArtifact.format, contents: catalogArtifact.contents } : {}),
408
- });
456
+ };
457
+ if (dataset) {
458
+ managedMetadata.title = dataset.title;
459
+ managedMetadata.description = dataset.description;
460
+ managedMetadata.sourceUrl = dataset.sourceUrl;
461
+ managedMetadata.license = dataset.license.url ?? dataset.license.identifier;
462
+ managedMetadata.category = dataset.recommendation.group;
463
+ if (dataset.organism)
464
+ managedMetadata.organism = dataset.organism;
465
+ }
466
+ if (catalogArtifact) {
467
+ managedMetadata.format = catalogArtifact.format;
468
+ managedMetadata.contents = catalogArtifact.contents;
469
+ }
470
+ metadata.set(`${REFS_ROOT}/managed/${receipt.datasetId}/${receipt.datasetVersion}/${artifact.path}`, managedMetadata);
409
471
  }
410
472
  }
411
473
  for (const value of raw.legacyEntries ?? []) {
412
- if (!value || typeof value !== "object")
474
+ const item = parseUnknownRecord(value);
475
+ if (!item)
413
476
  continue;
414
- const item = value;
415
477
  const localPath = stringValue(item.local_path);
416
478
  if (!localPath)
417
479
  continue;
418
480
  const resolved = resolveRequestedPath(localPath);
419
481
  if (!resolved.ok)
420
482
  continue;
421
- const legacyMetadata = {
422
- ...(stringValue(item.dataset) ? { datasetId: stringValue(item.dataset) } : {}),
423
- ...(stringValue(item.category) ? { category: stringValue(item.category) } : {}),
424
- ...(stringValue(item.subtype) ? { subtype: stringValue(item.subtype) } : {}),
425
- ...(stringValue(item.organism) ? { organism: stringValue(item.organism) } : {}),
426
- ...(numberValue(item.rows) !== undefined ? { rows: numberValue(item.rows) } : {}),
427
- ...(stringValue(item.endpoint) ? { endpoint: stringValue(item.endpoint) } : {}),
428
- };
483
+ const datasetId = stringValue(item.dataset);
484
+ const category = stringValue(item.category);
485
+ const subtype = stringValue(item.subtype);
486
+ const organism = stringValue(item.organism);
487
+ const rows = numberValue(item.rows);
488
+ const endpoint = stringValue(item.endpoint);
489
+ const legacyMetadata = {};
490
+ if (datasetId)
491
+ legacyMetadata.datasetId = datasetId;
492
+ if (category)
493
+ legacyMetadata.category = category;
494
+ if (subtype)
495
+ legacyMetadata.subtype = subtype;
496
+ if (organism)
497
+ legacyMetadata.organism = organism;
498
+ if (rows !== undefined)
499
+ legacyMetadata.rows = rows;
500
+ if (endpoint)
501
+ legacyMetadata.endpoint = endpoint;
429
502
  metadata.set(resolved.path, { ...legacyMetadata, ...metadata.get(resolved.path) });
430
503
  }
431
504
  return entries.map((entry) => {
@@ -465,8 +538,8 @@ function collectCategories(entries) {
465
538
  }
466
539
  function renderContent(path, scan, entries) {
467
540
  if (scan.state === "unavailable")
468
- return ("No reference store is provisioned. Nothing in the analysis environment can fetch reference data — the host stages it, " +
469
- "so a store provisioned through the host's own path will show up on a later call.");
541
+ return ("No reference store is provisioned for this session. Nothing in the analysis environment can fetch reference data, and a later call " +
542
+ "in this run gives the same answer. Plan with the data at hand, or ask for the reference by what it is.");
470
543
  if (scan.state === "not_found")
471
544
  return `Reference path does not exist: ${path}`;
472
545
  if (scan.state === "not_a_directory")
@@ -499,6 +572,15 @@ function renderContent(path, scan, entries) {
499
572
  return lines.join("\n");
500
573
  }
501
574
  /** Create reference discovery over the host-visible reference store. */
575
+ /**
576
+ * The whole enriched inventory of the store, for a host-side join: which
577
+ * collection a procedure names is present, and where. No envelope bound,
578
+ * because the caller keeps the join and drops the listing.
579
+ */
580
+ export async function readReferenceInventory(storeRoot) {
581
+ const raw = await scanStore(storeRoot, ".", true);
582
+ return { available: raw.state !== "unavailable", entries: enrichEntries(raw.entries, raw) };
583
+ }
502
584
  export function createListAvailableRefsTool(deps) {
503
585
  const storeRoot = deps.refStorePath ?? REFS_ROOT;
504
586
  return defineTool({
@@ -516,7 +598,7 @@ export function createListAvailableRefsTool(deps) {
516
598
  "pass a group label as `query`, because `category` inspects a top-level directory by name and a label that is not a directory reads as `not_found`; " +
517
599
  "`limit` caps the entries returned. The response carries `returned`, `total`, and `hasMore`, so truncation is never silent. " +
518
600
  "An empty result means the dataset is absent right now — not that it is unobtainable. Say so; never guess a path, and never silently substitute a different dataset. " +
519
- "The store is provisioned by the host and is NOT frozen: datasets can be added through the host's own provisioning path, and whatever is added shows up on a later call.",
601
+ "The store is provisioned by the host and is NOT frozen: datasets can be added through the host's own provisioning path between runs, and whatever is added shows up in a later run. Within one run the listing does not change, thus one call per question is enough.",
520
602
  inputSchema: ListAvailableRefsInputSchema,
521
603
  // `execute` resolves `path ?? category` for the subtree it inspects, and
522
604
  // it ignores `category` when `path` is present. `query` is an ADDITIVE
@@ -551,7 +633,7 @@ export function createListAvailableRefsTool(deps) {
551
633
  // The budget comes off the rendered filter, never off a count of its
552
634
  // parts, thus it cannot drift from the template above. One code point
553
635
  // pays for the joining space.
554
- return `${capCodePoints(named, DETAIL_MAX_LENGTH - [...filter].length - 1)} ${filter}`;
636
+ return `${capCodePoints(named, DETAIL_MAX_LENGTH - Array.from(filter).length - 1)} ${filter}`;
555
637
  },
556
638
  execute: async ({ path, category, query, limit }) => {
557
639
  // `category` is shorthand for a top-level path; an explicit `path` wins.
@@ -10,57 +10,50 @@
10
10
  * sandbox step agent, the planner (`tools/research/generate-plan.ts`), the
11
11
  * run synthesizer (`execution/run-synthesis.ts`) and the analogical reasoner
12
12
  * (`tools/research/generate-analogy-report.ts`) — and all four share one id,
13
- * one input schema and one terminal contract via `createReportBlockerToolFor`.
14
- * What differs per loop is only what a blocker *means* there, so each call site
15
- * injects its own `blockedWhen` prose and its own capture closure. The tool
16
- * records the reason and tells the agent to stop; the driving body reads the
17
- * outcome after the loop and decides the terminal status. The sandbox step body
18
- * runs in durable steps, so it reads the blocker back from the transcript
19
- * (`recordedBlocker`) on replay, not only from its cell.
13
+ * one input schema and one result via `createReportBlockerToolFor`. What
14
+ * differs per loop is only what a blocker *means* there, so each call site
15
+ * injects its own `blockedWhen` prose. The result of the call carries the
16
+ * reason, and the driving body selects the blocker from the recorded calls of
17
+ * the run (`blockerOf`). Thus a replay selects the same blocker.
20
18
  */
21
- import type { ModelMessage } from "ai";
19
+ import { z } from "zod";
20
+ import type { LoopStep } from "../../loop/run-loop.js";
22
21
  import { type Tool } from "../define-tool.js";
23
22
  export declare const REPORT_BLOCKER_TOOL_ID = "report_blocker";
24
- export interface BlockerOutcome {
23
+ export type BlockerOutcome = {
25
24
  readonly kind: "blocker";
26
25
  readonly reason: string;
27
- }
28
- /** Per-run mutable cell the sandbox-step body reads after the loop. */
29
- export interface BlockerHolder {
30
- outcome: BlockerOutcome | null;
31
- }
32
- export declare function createBlockerHolder(): BlockerHolder;
33
- export interface ReportBlockerDeps {
34
- /**
35
- * The calling loop's blocker-capture side effect — writes the outcome into
36
- * whatever cell that body reads after its loop. Invoked on every call; the
37
- * closure owns the first-call-wins guard, because only the call site knows
38
- * what else may already have terminated its loop.
39
- */
40
- readonly record: (outcome: BlockerOutcome) => void;
26
+ };
27
+ /** The one input every `report_blocker` takes, wherever it is offered. */
28
+ declare const ReportBlockerInputSchema: z.ZodObject<{
29
+ reason: z.ZodString;
30
+ }, z.core.$strip>;
31
+ /** The result of a call: the blocker that the call recorded. */
32
+ declare const BlockerResultSchema: z.ZodObject<{
33
+ kind: z.ZodLiteral<"blocker">;
34
+ reason: z.ZodString;
35
+ message: z.ZodString;
36
+ }, z.core.$strip>;
37
+ type BlockerResult = z.infer<typeof BlockerResultSchema>;
38
+ export type ReportBlockerDeps = {
41
39
  /**
42
40
  * What a blocker means in THIS loop: which loop the call ends and the
43
41
  * conditions that warrant it. Composed into the shared terminal contract,
44
42
  * so a description can never promise a loop this instance does not end.
45
43
  */
46
44
  readonly blockedWhen: string;
47
- }
45
+ };
48
46
  /**
49
47
  * Build the `report_blocker` tool for one loop. The id, the input schema and
50
48
  * the terminal contract ("pass a reason, then stop") are fixed here; the call
51
- * site supplies only the per-loop meaning and the capture closure.
52
- */
53
- export declare function createReportBlockerToolFor(deps: ReportBlockerDeps): Tool;
54
- /**
55
- * The blocker that a run recorded, read from its transcript: the reason of the
56
- * first `report_blocker` call, in call order, whose result is ok.
57
- *
58
- * A replay returns each tool step's cached result without re-running
59
- * `execute`, so the in-memory cell is empty on replay; the transcript is not.
49
+ * site supplies only the per-loop meaning.
60
50
  */
61
- export declare function recordedBlocker(messages: readonly ModelMessage[]): BlockerOutcome | null;
51
+ export declare function createReportBlockerToolFor(deps: ReportBlockerDeps): Tool<z.infer<typeof ReportBlockerInputSchema>, BlockerResult>;
52
+ /** The blocker that a run recorded: the reason of the first `report_blocker` call, in call order, whose result is ok. */
53
+ export declare function blockerOf(steps: readonly LoopStep[]): BlockerOutcome | null;
62
54
  /**
63
- * The sandbox step agent's `report_blocker`, bound to the step body's holder.
64
- * A blocker here ends the step with no deliverables and a blocked reason.
55
+ * The sandbox step agent's `report_blocker`. A blocker here ends the step with
56
+ * no deliverables and a blocked reason.
65
57
  */
66
- export declare function createReportBlockerTool(holder: BlockerHolder): Tool;
58
+ export declare function createReportBlockerTool(): Tool;
59
+ export {};
@@ -10,34 +10,27 @@
10
10
  * sandbox step agent, the planner (`tools/research/generate-plan.ts`), the
11
11
  * run synthesizer (`execution/run-synthesis.ts`) and the analogical reasoner
12
12
  * (`tools/research/generate-analogy-report.ts`) — and all four share one id,
13
- * one input schema and one terminal contract via `createReportBlockerToolFor`.
14
- * What differs per loop is only what a blocker *means* there, so each call site
15
- * injects its own `blockedWhen` prose and its own capture closure. The tool
16
- * records the reason and tells the agent to stop; the driving body reads the
17
- * outcome after the loop and decides the terminal status. The sandbox step body
18
- * runs in durable steps, so it reads the blocker back from the transcript
19
- * (`recordedBlocker`) on replay, not only from its cell.
13
+ * one input schema and one result via `createReportBlockerToolFor`. What
14
+ * differs per loop is only what a blocker *means* there, so each call site
15
+ * injects its own `blockedWhen` prose. The result of the call carries the
16
+ * reason, and the driving body selects the blocker from the recorded calls of
17
+ * the run (`blockerOf`). Thus a replay selects the same blocker.
20
18
  */
21
19
  import { ok } from "neverthrow";
22
20
  import { z } from "zod";
23
- import { repairToolInput } from "../../lib/zod-issues.js";
24
- import { toolOutcomeForOutputType } from "../../loop/tool-outcome.js";
21
+ import { terminalTextSchema } from "../terminal-text.js";
25
22
  import { defineTool } from "../define-tool.js";
26
23
  export const REPORT_BLOCKER_TOOL_ID = "report_blocker";
27
- export function createBlockerHolder() {
28
- return { outcome: null };
29
- }
30
24
  /** The one input every `report_blocker` takes, wherever it is offered. */
31
25
  const ReportBlockerInputSchema = z.object({
32
- reason: z
33
- .string()
34
- .min(1)
35
- .describe("What blocks the work, stated as a fact: the missing or unreadable input, or the capability that is not available, and what you tried."),
26
+ reason: terminalTextSchema("What blocks the work, stated as a fact: the missing or unreadable input, or the capability that is not available, and what you tried."),
36
27
  });
28
+ /** The result of a call: the blocker that the call recorded. */
29
+ const BlockerResultSchema = z.object({ kind: z.literal("blocker"), reason: z.string(), message: z.string() });
37
30
  /**
38
31
  * Build the `report_blocker` tool for one loop. The id, the input schema and
39
32
  * the terminal contract ("pass a reason, then stop") are fixed here; the call
40
- * site supplies only the per-loop meaning and the capture closure.
33
+ * site supplies only the per-loop meaning.
41
34
  */
42
35
  export function createReportBlockerToolFor(deps) {
43
36
  return defineTool({
@@ -45,67 +38,28 @@ export function createReportBlockerToolFor(deps) {
45
38
  description: `Terminal. ${deps.blockedWhen} Pass a clear reason. Stop immediately after calling — take no further actions.`,
46
39
  inputSchema: ReportBlockerInputSchema,
47
40
  describeCall: "none",
48
- execute: async (input) => {
49
- deps.record({ kind: "blocker", reason: input.reason });
50
- return ok({
51
- recorded: true,
52
- message: "Blocker recorded. You are done — stop now and do not take further actions.",
53
- });
54
- },
41
+ execute: (input) => Promise.resolve(ok({ kind: "blocker", reason: input.reason, message: "Blocker recorded. You are done — stop now and do not take further actions." })),
55
42
  });
56
43
  }
57
- /**
58
- * The blocker that a run recorded, read from its transcript: the reason of the
59
- * first `report_blocker` call, in call order, whose result is ok.
60
- *
61
- * A replay returns each tool step's cached result without re-running
62
- * `execute`, so the in-memory cell is empty on replay; the transcript is not.
63
- */
64
- export function recordedBlocker(messages) {
65
- const recorded = new Set();
66
- for (const message of messages) {
67
- if (message.role !== "tool")
68
- continue;
69
- for (const part of message.content) {
70
- if (part.type === "tool-result" && part.toolName === REPORT_BLOCKER_TOOL_ID && toolOutcomeForOutputType(part.output.type) === "ok") {
71
- recorded.add(part.toolCallId);
72
- }
73
- }
74
- }
75
- for (const message of messages) {
76
- if (message.role !== "assistant" || typeof message.content === "string")
77
- continue;
78
- for (const part of message.content) {
79
- if (part.type !== "tool-call" || part.toolName !== REPORT_BLOCKER_TOOL_ID || !recorded.has(part.toolCallId))
44
+ /** The blocker that a run recorded: the reason of the first `report_blocker` call, in call order, whose result is ok. */
45
+ export function blockerOf(steps) {
46
+ for (const step of steps) {
47
+ for (const call of step.calls) {
48
+ if (call.toolName !== REPORT_BLOCKER_TOOL_ID || call.output?.outcome !== "ok")
80
49
  continue;
81
- const reason = blockerReason(part.input);
82
- if (reason !== undefined)
83
- return { kind: "blocker", reason };
50
+ const result = BlockerResultSchema.safeParse(call.output.value);
51
+ if (result.success)
52
+ return { kind: "blocker", reason: result.data.reason };
84
53
  }
85
54
  }
86
55
  return null;
87
56
  }
88
- /** The reason of a `report_blocker` input, validated as the dispatch validates it. */
89
- function blockerReason(input) {
90
- const parsed = ReportBlockerInputSchema.safeParse(input);
91
- if (parsed.success)
92
- return parsed.data.reason;
93
- const repaired = repairToolInput(input, parsed.error);
94
- if (repaired === undefined)
95
- return undefined;
96
- const reparsed = ReportBlockerInputSchema.safeParse(repaired);
97
- return reparsed.success ? reparsed.data.reason : undefined;
98
- }
99
57
  /**
100
- * The sandbox step agent's `report_blocker`, bound to the step body's holder.
101
- * A blocker here ends the step with no deliverables and a blocked reason.
58
+ * The sandbox step agent's `report_blocker`. A blocker here ends the step with
59
+ * no deliverables and a blocked reason.
102
60
  */
103
- export function createReportBlockerTool(holder) {
61
+ export function createReportBlockerTool() {
104
62
  return createReportBlockerToolFor({
105
- record: (outcome) => {
106
- if (holder.outcome === null)
107
- holder.outcome = outcome;
108
- },
109
63
  blockedWhen: "Ends this analysis step with no deliverables. Call it when you cannot " +
110
64
  "fulfil the step — required inputs are missing or unreadable, the " +
111
65
  "requested analysis is infeasible with the available data/packages, or " +
@@ -13,19 +13,21 @@
13
13
  * reference. Expected outcomes are data variants — never throws on a missing
14
14
  * skill, an undeclared skill, or no matches.
15
15
  */
16
- export interface SkillToolsDeps {
16
+ import { z } from "zod";
17
+ import { type Tool } from "../define-tool.js";
18
+ export type SkillToolsDeps = {
17
19
  /** Absolute path to the skills tree (one subdirectory per skill). */
18
20
  readonly skillsDir: string;
19
21
  /** The agent's declared skills (`meta.skills`) — the access allowlist. */
20
22
  readonly skills: readonly string[];
21
- }
22
- interface SkillMatch {
23
+ };
24
+ type SkillMatch = {
23
25
  readonly skill: string;
24
26
  readonly path: string;
25
27
  readonly line: number;
26
28
  readonly snippet: string;
27
29
  readonly score: number;
28
- }
30
+ };
29
31
  type SkillSearchOutput = {
30
32
  status: "no_skills";
31
33
  } | {
@@ -59,14 +61,16 @@ type SkillReadOutput = {
59
61
  path: string;
60
62
  content: string;
61
63
  };
64
+ declare const SkillSearchInputSchema: z.ZodObject<{
65
+ query: z.ZodString;
66
+ topK: z.ZodOptional<z.ZodNumber>;
67
+ }, z.core.$strip>;
68
+ declare const SkillReadInputSchema: z.ZodObject<{
69
+ skill: z.ZodString;
70
+ path: z.ZodString;
71
+ }, z.core.$strip>;
62
72
  export declare function createSkillTools(deps: SkillToolsDeps): {
63
- skillSearch: import("../define-tool.js").Tool<{
64
- query: string;
65
- topK?: number | undefined;
66
- }, SkillSearchOutput>;
67
- skillRead: import("../define-tool.js").Tool<{
68
- skill: string;
69
- path: string;
70
- }, SkillReadOutput>;
73
+ skillSearch: Tool<z.infer<typeof SkillSearchInputSchema>, SkillSearchOutput>;
74
+ skillRead: Tool<z.infer<typeof SkillReadInputSchema>, SkillReadOutput>;
71
75
  };
72
76
  export {};
@@ -18,12 +18,14 @@ import { join, relative, resolve, sep } from "node:path";
18
18
  import { ok } from "neverthrow";
19
19
  import { z } from "zod";
20
20
  import { defineTool } from "../define-tool.js";
21
+ import { collapseWhitespace, splitLines } from "../../lib/text.js";
21
22
  /** Bounds — keep a search over a deep skill tree cheap and context-safe. */
22
23
  const MAX_FILE_BYTES = 512 * 1024;
23
24
  const MAX_SNIPPET = 240;
24
25
  const DEFAULT_TOP_K = 10;
25
26
  const MAX_TOP_K = 25;
26
- const TEXT_EXT = /\.(md|markdown|txt|py|r|R|json|ya?ml|csv|tsv)$/;
27
+ /** The file-name extensions a skill may carry text in. */
28
+ const TEXT_EXTENSIONS = [".md", ".markdown", ".txt", ".py", ".r", ".R", ".json", ".yaml", ".yml", ".csv", ".tsv"];
27
29
  async function collectTextFiles(dir, acc) {
28
30
  let entries;
29
31
  try {
@@ -37,11 +39,19 @@ async function collectTextFiles(dir, acc) {
37
39
  if (e.isDirectory()) {
38
40
  await collectTextFiles(full, acc);
39
41
  }
40
- else if (TEXT_EXT.test(e.name)) {
42
+ else if (TEXT_EXTENSIONS.some((extension) => e.name.endsWith(extension))) {
41
43
  acc.push(full);
42
44
  }
43
45
  }
44
46
  }
47
+ const SkillSearchInputSchema = z.object({
48
+ query: z.string().min(1).describe("Keywords to match (e.g. 'PyDESeq2 contrast syntax')."),
49
+ topK: z.number().int().min(1).max(MAX_TOP_K).optional().describe(`Max results to return. Defaults to ${DEFAULT_TOP_K}.`),
50
+ });
51
+ const SkillReadInputSchema = z.object({
52
+ skill: z.string().min(1).describe("Skill name (one of your declared skills)."),
53
+ path: z.string().min(1).describe("File path within the skill, e.g. 'SKILL.md' or 'references/pydeseq2-api.md'."),
54
+ });
45
55
  export function createSkillTools(deps) {
46
56
  const allowed = new Set(deps.skills);
47
57
  const skillSearch = defineTool({
@@ -52,16 +62,13 @@ export function createSkillTools(deps) {
52
62
  "case-insensitive substring. Returns one entry per matching skill file — its skill, its path, " +
53
63
  "and the first line that holds a query word — ranked by how many distinct query words the file " +
54
64
  "holds. Then `skill_read` the file. No matches returns a data variant.",
55
- inputSchema: z.object({
56
- query: z.string().min(1).describe("Keywords to match (e.g. 'PyDESeq2 contrast syntax')."),
57
- topK: z.number().int().min(1).max(MAX_TOP_K).optional().describe(`Max results to return. Defaults to ${DEFAULT_TOP_K}.`),
58
- }),
65
+ inputSchema: SkillSearchInputSchema,
59
66
  describeCall: "none",
60
67
  execute: async ({ query, topK }) => {
61
68
  if (allowed.size === 0) {
62
69
  return ok({ status: "no_skills" });
63
70
  }
64
- const tokens = query.toLowerCase().split(/\s+/).filter(Boolean);
71
+ const tokens = collapseWhitespace(query.toLowerCase()).split(" ").filter(Boolean);
65
72
  const matches = [];
66
73
  for (const skill of allowed) {
67
74
  const skillRoot = resolve(deps.skillsDir, skill);
@@ -82,7 +89,7 @@ export function createSkillTools(deps) {
82
89
  const distinct = tokens.filter((t) => lower.includes(t)).length;
83
90
  if (distinct === 0)
84
91
  continue;
85
- const lines = content.split(/\r?\n/);
92
+ const lines = splitLines(content);
86
93
  const hitIdx = lines.findIndex((l) => {
87
94
  const ll = l.toLowerCase();
88
95
  return tokens.some((t) => ll.includes(t));
@@ -113,10 +120,7 @@ export function createSkillTools(deps) {
113
120
  description: "Read a file from one of your skills (e.g. its SKILL.md or a reference " +
114
121
  "found via skill_search). Confined to your declared skills. Undeclared " +
115
122
  "skills and missing paths return a data variant.",
116
- inputSchema: z.object({
117
- skill: z.string().min(1).describe("Skill name (one of your declared skills)."),
118
- path: z.string().min(1).describe("File path within the skill, e.g. 'SKILL.md' or 'references/pydeseq2-api.md'."),
119
- }),
123
+ inputSchema: SkillReadInputSchema,
120
124
  describeCall: "none",
121
125
  execute: async ({ skill, path }) => {
122
126
  if (!allowed.has(skill)) {
@@ -10,21 +10,24 @@
10
10
  * index, so a dropped, reordered, or extra entry can never attach a
11
11
  * description to the wrong file.
12
12
  */
13
- import { type SubmittedFileDescription } from "../../schemas/file-metadata.js";
14
13
  import { type Tool } from "../define-tool.js";
15
14
  export declare const SUBMIT_FILE_METADATA_TOOL_ID = "submit_file_metadata";
16
15
  /**
17
- * The per-step cell of the file-metadata continuation. The step body makes it
18
- * beside the blocker cell, and the agent factory binds the output tool to it.
16
+ * The per-step cell of the file-metadata follow-up request. The step body makes
17
+ * it beside the step agent, and the agent factory binds the output tool to it.
18
+ * The descriptions themselves live in the inputs of the calls: the post-step
19
+ * code reads them from the recorded calls.
19
20
  */
20
- export interface FileMetadataCell {
21
- /** The paths that the continuation describes, or `null` before the first `expect`. */
21
+ export type FileMetadataCell = {
22
+ /** The paths that the follow-up request describes, or `null` before the first `expect`. */
22
23
  readonly knownPaths: ReadonlySet<string> | null;
23
- /** The accepted description of each described path, keyed by the path. The tool writes only a known path. */
24
- readonly descriptions: Map<string, SubmittedFileDescription>;
25
- /** Arm the cell for one continuation: set the known paths, and drop each accepted description. */
24
+ /** The known paths that the earlier calls described. The loop folds each call record into it. */
25
+ readonly described: ReadonlySet<string>;
26
+ /** Arm the cell for one follow-up request: set the known paths, and forget each described path. */
26
27
  expect(paths: readonly string[]): void;
27
- }
28
+ /** Add the paths of one call record. */
29
+ fold(paths: readonly string[]): void;
30
+ };
28
31
  export declare function createFileMetadataCell(): FileMetadataCell;
29
32
  /** Build the `submit_file_metadata` tool bound to the cell of one step. */
30
33
  export declare function createSubmitFileMetadataTool(cell: FileMetadataCell): Tool;