@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
@@ -3,17 +3,18 @@
3
3
  *
4
4
  * The conversation agent delegates batch literature/biology research by
5
5
  * calling this tool. `execute` derives a child `Session` (`forSubAgent`)
6
- * and runs `runAgent` over a focused literature-reviewer agent: a research
6
+ * and runs `runLoop` over a focused literature-reviewer agent: a research
7
7
  * brief in, a structured evidence report out. The child's transcript is
8
8
  * ephemeral — it lives only for this call and is never persisted (see the harness-thread-store spec).
9
9
  *
10
10
  * This is the whole of sub-agent delegation in the harness. There is no
11
11
  * `agents: {}` config, no `messageFilter`, no `stripParentToolParts`: the
12
12
  * child cannot see the parent's tool history because it is simply handed
13
- * none — only the brief. The child loop uses `passthroughStep` because the
14
- * entire tool call is one step in the parent loop (PR #3 caches it whole,
15
- * so the child never replays).
13
+ * none — only the brief. Inside the body of a workflow the call starts a
14
+ * child workflow (`loop/sub-agent.ts`), thus each call of the child is a step
15
+ * of its own.
16
16
  */
17
+ import type { SubAgentRegistrar } from "../../loop/sub-agent.js";
17
18
  import type { ToolOutputStore } from "../../loop/tool-output.js";
18
19
  import { type ChatProvider } from "../../providers/types.js";
19
20
  import { type Tool } from "../define-tool.js";
@@ -21,7 +22,7 @@ import { type BioToolKeys } from "../bio/keys.js";
21
22
  import type { Logger } from "../../lib/logger.js";
22
23
  import type { UsageRecorder } from "../../billing/usage-recorder.js";
23
24
  import type { CitationResolver } from "../../citations/types.js";
24
- export interface LiteratureReviewerDeps {
25
+ export type LiteratureReviewerDeps = {
25
26
  /** Operational logging seam; omitted falls back to no-op. */
26
27
  readonly logger?: Logger;
27
28
  /** The LLM seam the child loop runs on. */
@@ -36,6 +37,6 @@ export interface LiteratureReviewerDeps {
36
37
  readonly toolOutputStore?: ToolOutputStore;
37
38
  /** Shared bibliographic verification service; all agent surfaces share its pacing/cache. */
38
39
  readonly citationResolver: CitationResolver;
39
- }
40
+ };
40
41
  /** Build the `literature_reviewer` delegation tool bound to its provider. */
41
- export declare function createLiteratureReviewerTool(deps: LiteratureReviewerDeps): Tool;
42
+ export declare function createLiteratureReviewerTool(deps: LiteratureReviewerDeps, registerSubAgent: SubAgentRegistrar): Tool;
@@ -3,21 +3,20 @@
3
3
  *
4
4
  * The conversation agent delegates batch literature/biology research by
5
5
  * calling this tool. `execute` derives a child `Session` (`forSubAgent`)
6
- * and runs `runAgent` over a focused literature-reviewer agent: a research
6
+ * and runs `runLoop` over a focused literature-reviewer agent: a research
7
7
  * brief in, a structured evidence report out. The child's transcript is
8
8
  * ephemeral — it lives only for this call and is never persisted (see the harness-thread-store spec).
9
9
  *
10
10
  * This is the whole of sub-agent delegation in the harness. There is no
11
11
  * `agents: {}` config, no `messageFilter`, no `stripParentToolParts`: the
12
12
  * child cannot see the parent's tool history because it is simply handed
13
- * none — only the brief. The child loop uses `passthroughStep` because the
14
- * entire tool call is one step in the parent loop (PR #3 caches it whole,
15
- * so the child never replays).
13
+ * none — only the brief. Inside the body of a workflow the call starts a
14
+ * child workflow (`loop/sub-agent.ts`), thus each call of the child is a step
15
+ * of its own.
16
16
  */
17
17
  import { err, ok } from "neverthrow";
18
18
  import { z } from "zod";
19
- import { finalText, runAgent } from "../../loop/run-agent.js";
20
- import { passthroughStep } from "../../loop/run-step.js";
19
+ import { finalText, runLoop } from "../../loop/run-loop.js";
21
20
  import { literatureReviewerPrompt } from "../../prompts/literature-reviewer.js";
22
21
  import { composeSystemPrompt } from "../../agents/system-prompt.js";
23
22
  import { forSubAgent } from "../../auth/types.js";
@@ -35,9 +34,9 @@ const AGENT_ID = "literature-reviewer";
35
34
  /** Multi-tool research budget — search → read → synthesize over many genes. */
36
35
  const REVIEWER_MAX_ITERATIONS = 30;
37
36
  /** Build the `literature_reviewer` delegation tool bound to its provider. */
38
- export function createLiteratureReviewerTool(deps) {
37
+ export function createLiteratureReviewerTool(deps, registerSubAgent) {
39
38
  const ncbi = createNcbiTools(deps.bioKeys);
40
- const chemDb = createChemDbTools(deps.bioKeys, { ...(deps.logger ? { logger: deps.logger } : {}) });
39
+ const chemDb = createChemDbTools(deps.bioKeys, { logger: deps.logger });
41
40
  const reviewerTools = [
42
41
  searchGeneTool,
43
42
  searchProteinTool,
@@ -56,6 +55,17 @@ export function createLiteratureReviewerTool(deps) {
56
55
  tools: reviewerTools,
57
56
  maxIterations: REVIEWER_MAX_ITERATIONS,
58
57
  };
58
+ // A review ends with a report, or with the finish reason of a run that gave none.
59
+ const review = registerSubAgent(AGENT_ID, async ({ payload, ctx, loop }) => {
60
+ const { messages: transcript, finish } = await runLoop(agent, [{ role: "user", content: payload.brief }], forSubAgent(ctx.session, AGENT_ID), {
61
+ ...loop,
62
+ provider: deps.provider,
63
+ usageRecorder: deps.usageRecorder,
64
+ toolOutputStore: deps.toolOutputStore,
65
+ });
66
+ const report = finalText(transcript);
67
+ return report.trim() === "" ? { finishReason: finish.reason } : { report };
68
+ });
59
69
  return defineTool({
60
70
  id: "literature_reviewer",
61
71
  description: "Delegate batch literature/biology research to a sub-agent: looking up " +
@@ -78,29 +88,20 @@ export function createLiteratureReviewerTool(deps) {
78
88
  "context. The reviewer sees only this — include everything it needs."),
79
89
  }),
80
90
  describeCall: "none",
91
+ startsWorkflow: true,
81
92
  execute: async ({ brief }, ctx) => {
82
- const { messages: transcript, finish } = await runAgent(agent, [{ role: "user", content: brief }], forSubAgent(ctx.session, AGENT_ID), {
83
- provider: deps.provider,
84
- signal: ctx.signal,
85
- emit: ctx.emit,
86
- runStep: passthroughStep,
87
- usageRecorder: deps.usageRecorder,
88
- toolOutputStore: deps.toolOutputStore,
89
- // Fold the child's calls into the turn total the root loop reports.
90
- turnUsage: ctx.turnUsage,
91
- // Keeps the usage record keys of two parallel reviews disjoint —
92
- // same frame, same call path, same loop-local step names.
93
- invocationId: ctx.invocationId,
94
- });
95
- const report = finalText(transcript);
93
+ const reviewed = await review({ brief }, ctx);
96
94
  // A child run can end with no final text. Examples are a terminal
97
- // reply with no text block, and a capped-out run whose wrap-up is
98
- // empty. An ok result with an empty report hides that failure, so
99
- // the tool returns an error that names the finish reason.
100
- if (report.trim() === "") {
101
- return err({ error: `The literature reviewer gave no report (finish reason: ${finish.reason}). Retry, or narrow the brief.`, retryable: true });
95
+ // reply with no text block, and a run that reached its step cap. An
96
+ // ok result with an empty report hides that failure, so the tool
97
+ // returns an error that names the finish reason.
98
+ if ("finishReason" in reviewed) {
99
+ return err({
100
+ error: `The literature reviewer gave no report (finish reason: ${reviewed.finishReason}). Retry, or narrow the brief.`,
101
+ retryable: true,
102
+ });
102
103
  }
103
- return ok({ report });
104
+ return ok({ report: reviewed.report });
104
105
  },
105
106
  });
106
107
  }
@@ -11,6 +11,6 @@ type SearchArxivOutput = {
11
11
  };
12
12
  export declare const searchArxivTool: import("../define-tool.js").Tool<{
13
13
  query: string;
14
- limit: number;
15
14
  categories?: string[] | undefined;
15
+ limit: number;
16
16
  }, SearchArxivOutput>;
@@ -26,7 +26,7 @@ export const searchArxivTool = defineTool({
26
26
  }),
27
27
  describeCall: "none",
28
28
  execute: async ({ query, categories, limit }, context) => {
29
- const result = await source.search({ query, ...(categories === undefined ? {} : { categories }), limit }, context.signal);
29
+ const result = await source.search({ query, categories, limit }, context.signal);
30
30
  if (result.status !== "ok")
31
31
  return ok({ success: false, error: result.detail, papers: [] });
32
32
  return ok({ success: true, papers: result.value });
@@ -9,6 +9,8 @@
9
9
  * `language` as required and nullable, thus an absent value is an explicit
10
10
  * `null`. The OpenAPI document gives the modifier of each field.
11
11
  */
12
+ import { z } from "zod";
13
+ import { type Tool } from "../define-tool.js";
12
14
  type SearchGithubReposOutput = {
13
15
  success: false;
14
16
  error: string;
@@ -17,20 +19,21 @@ type SearchGithubReposOutput = {
17
19
  success: true;
18
20
  repos: GithubRepo[];
19
21
  };
20
- export interface GithubRepo {
22
+ export type GithubRepo = {
21
23
  url: string;
22
24
  fullName: string;
23
25
  description?: string;
24
26
  stars: number;
25
27
  language?: string;
26
28
  lastUpdated?: string;
27
- }
29
+ };
28
30
  export declare function parseGithubReposResponse(raw: unknown): GithubRepo[];
31
+ declare const SearchGithubReposInputSchema: z.ZodObject<{
32
+ query: z.ZodString;
33
+ language: z.ZodOptional<z.ZodString>;
34
+ limit: z.ZodDefault<z.ZodNumber>;
35
+ }, z.core.$strip>;
29
36
  export declare function createSearchGithubReposTool(deps: {
30
37
  githubToken?: string;
31
- }): import("../define-tool.js").Tool<{
32
- query: string;
33
- limit: number;
34
- language?: string | undefined;
35
- }, SearchGithubReposOutput>;
38
+ }): Tool<z.infer<typeof SearchGithubReposInputSchema>, SearchGithubReposOutput>;
36
39
  export {};
@@ -13,6 +13,8 @@ import { ok } from "neverthrow";
13
13
  import { z } from "zod";
14
14
  import { defineTool } from "../define-tool.js";
15
15
  import { apiFetchValidated, describeApiError } from "../lib/api-utils.js";
16
+ import { parseUnknownRecord } from "../../lib/unknown-containers.js";
17
+ import { isUnknownArray } from "../../lib/unknown-array.js";
16
18
  const BASE_URL = "https://api.github.com/search/repositories";
17
19
  // Raw GitHub search wire shape, validated at the fetch boundary. Every field is
18
20
  // optional — `parseGithubReposResponse` already filters out items missing the
@@ -33,23 +35,30 @@ const GithubReposResponseSchema = z.object({
33
35
  .optional(),
34
36
  });
35
37
  export function parseGithubReposResponse(raw) {
36
- const items = raw?.items;
37
- if (!Array.isArray(items))
38
+ const items = parseUnknownRecord(raw)?.items;
39
+ if (!isUnknownArray(items))
38
40
  return [];
39
- return items
40
- .filter((i) => typeof i === "object" &&
41
- i !== null &&
42
- typeof i.html_url === "string" &&
43
- typeof i.full_name === "string")
44
- .map((i) => ({
45
- url: String(i.html_url),
46
- fullName: String(i.full_name),
47
- description: typeof i.description === "string" ? i.description : undefined,
48
- stars: typeof i.stargazers_count === "number" ? i.stargazers_count : 0,
49
- language: typeof i.language === "string" ? i.language : undefined,
50
- lastUpdated: typeof i.updated_at === "string" ? i.updated_at : undefined,
51
- }));
41
+ return items.flatMap((item) => {
42
+ const record = parseUnknownRecord(item);
43
+ if (record === undefined || typeof record.html_url !== "string" || typeof record.full_name !== "string")
44
+ return [];
45
+ return [
46
+ {
47
+ url: record.html_url,
48
+ fullName: record.full_name,
49
+ description: typeof record.description === "string" ? record.description : undefined,
50
+ stars: typeof record.stargazers_count === "number" ? record.stargazers_count : 0,
51
+ language: typeof record.language === "string" ? record.language : undefined,
52
+ lastUpdated: typeof record.updated_at === "string" ? record.updated_at : undefined,
53
+ },
54
+ ];
55
+ });
52
56
  }
57
+ const SearchGithubReposInputSchema = z.object({
58
+ query: z.string().describe("GitHub search syntax. Plain text matches anywhere; qualifiers " + 'like "topic:bioinformatics" or "stars:>100" are supported.'),
59
+ language: z.string().optional().describe('Optional language filter (e.g., "python").'),
60
+ limit: z.number().int().min(1).max(20).default(10).describe("Maximum results (1–20, default 10)."),
61
+ });
53
62
  export function createSearchGithubReposTool(deps) {
54
63
  return defineTool({
55
64
  id: "search_github_repos",
@@ -64,13 +73,7 @@ export function createSearchGithubReposTool(deps) {
64
73
  "and `success: false` with an `error` string means GitHub could not be " +
65
74
  "reached or refused the request (the low unauthenticated rate limit " +
66
75
  "lands here). Report either one and continue, do not retry unchanged.",
67
- inputSchema: z.object({
68
- query: z
69
- .string()
70
- .describe("GitHub search syntax. Plain text matches anywhere; qualifiers " + 'like "topic:bioinformatics" or "stars:>100" are supported.'),
71
- language: z.string().optional().describe('Optional language filter (e.g., "python").'),
72
- limit: z.number().int().min(1).max(20).default(10).describe("Maximum results (1–20, default 10)."),
73
- }),
76
+ inputSchema: SearchGithubReposInputSchema,
74
77
  describeCall: "none",
75
78
  execute: async ({ query, language, limit }) => {
76
79
  const q = language ? `${query} language:${language}` : query;
@@ -9,7 +9,7 @@ export function createSearchSemanticScholarTool(options = {}) {
9
9
  maxRetries: 3,
10
10
  retryDelayMs: 1_000,
11
11
  timeoutMs: 90_000,
12
- ...(options.apiKey === undefined ? {} : { apiKey: options.apiKey }),
12
+ apiKey: options.apiKey,
13
13
  });
14
14
  return defineTool({
15
15
  id: "search_semantic_scholar",
@@ -0,0 +1,40 @@
1
+ /**
2
+ * The SearXNG realization of the `WebSearchEngine` capability.
3
+ *
4
+ * One SearXNG instance is the only engine the harness ships (the embedder owns
5
+ * it and builds this realization at its composition root). The call rides
6
+ * `apiFetchValidated` with a zod schema over the JSON envelope, and every
7
+ * failure lands on the error side of the `Result` as the data-status variant the
8
+ * tool reports — an HTTP error, a spent retryable status, a schema mismatch,
9
+ * and a body that is not JSON are answers, not errors of the turn.
10
+ */
11
+ import { z } from "zod";
12
+ import { type ApiError } from "../lib/api-utils.js";
13
+ import type { WebSearchEngine, WebSearchEngineError, WebSearchPage } from "./web-search.js";
14
+ export declare const SearxngSearchResponseSchema: z.ZodObject<{
15
+ results: z.ZodOptional<z.ZodArray<z.ZodObject<{
16
+ title: z.ZodOptional<z.ZodNullable<z.ZodString>>;
17
+ url: z.ZodOptional<z.ZodNullable<z.ZodString>>;
18
+ content: z.ZodOptional<z.ZodNullable<z.ZodString>>;
19
+ }, z.core.$strip>>>;
20
+ answers: z.ZodOptional<z.ZodArray<z.ZodObject<{
21
+ answer: z.ZodOptional<z.ZodNullable<z.ZodString>>;
22
+ url: z.ZodOptional<z.ZodNullable<z.ZodString>>;
23
+ }, z.core.$loose>>>;
24
+ }, z.core.$strip>;
25
+ /** Map a parsed SearXNG envelope to the rows the tool reports. */
26
+ export declare function mapSearxngResponse(response: z.infer<typeof SearxngSearchResponseSchema>): WebSearchPage;
27
+ /**
28
+ * Normalize the SearXNG base URL the embedder gives: `http`/`https` only, no
29
+ * user name and no password, and no query, fragment, or trailing slash. The
30
+ * value is a composition-root constant, thus a bad one throws here at wiring
31
+ * time and not inside a tool call.
32
+ */
33
+ export declare function normalizeSearxngBaseUrl(raw: string): string;
34
+ /** Map one `ApiError` of the helper to the error data variant it names. */
35
+ export declare function describeSearchFailure(error: ApiError): WebSearchEngineError;
36
+ export type SearxngEngineDeps = {
37
+ /** The base URL of the SearXNG instance the embedder runs. */
38
+ readonly baseUrl: string;
39
+ };
40
+ export declare function createSearxngEngine(deps: SearxngEngineDeps): WebSearchEngine;
@@ -0,0 +1,122 @@
1
+ /**
2
+ * The SearXNG realization of the `WebSearchEngine` capability.
3
+ *
4
+ * One SearXNG instance is the only engine the harness ships (the embedder owns
5
+ * it and builds this realization at its composition root). The call rides
6
+ * `apiFetchValidated` with a zod schema over the JSON envelope, and every
7
+ * failure lands on the error side of the `Result` as the data-status variant the
8
+ * tool reports — an HTTP error, a spent retryable status, a schema mismatch,
9
+ * and a body that is not JSON are answers, not errors of the turn.
10
+ */
11
+ import { err, ok } from "neverthrow";
12
+ import { z } from "zod";
13
+ import { apiFetchValidated } from "../lib/api-utils.js";
14
+ import { isAllDigits, trimTrailingOf } from "../../lib/text.js";
15
+ // SearXNG sends an explicit null for a snippet no engine produced, and it omits
16
+ // a key no engine filled, thus each field is optional and nullable alike. The
17
+ // fields an engine adds (`engine`, `score`, `publishedDate`, …) pass and strip.
18
+ const SearxngResultSchema = z.object({
19
+ title: z.string().nullable().optional(),
20
+ url: z.string().nullable().optional(),
21
+ content: z.string().nullable().optional(),
22
+ });
23
+ // An answer is an object of a changing shape (`answer`, `url`, `template`,
24
+ // `engine`, …), thus the schema keeps it loose and the mapper reads the two
25
+ // fields the tool reports.
26
+ export const SearxngSearchResponseSchema = z.object({
27
+ results: z.array(SearxngResultSchema).optional(),
28
+ answers: z.array(z.looseObject({ answer: z.string().nullable().optional(), url: z.string().nullable().optional() })).optional(),
29
+ });
30
+ /** Map a parsed SearXNG envelope to the rows the tool reports. */
31
+ export function mapSearxngResponse(response) {
32
+ const answers = [];
33
+ for (const row of response.answers ?? []) {
34
+ const answer = typeof row.answer === "string" ? row.answer : undefined;
35
+ const url = typeof row.url === "string" ? row.url : undefined;
36
+ if (answer === undefined && url === undefined)
37
+ continue;
38
+ answers.push({ answer, url });
39
+ }
40
+ const results = [];
41
+ for (const row of response.results ?? []) {
42
+ if (typeof row.url !== "string" || typeof row.title !== "string")
43
+ continue;
44
+ results.push({ title: row.title, url: row.url, snippet: typeof row.content === "string" ? row.content : undefined });
45
+ }
46
+ return { answers, results };
47
+ }
48
+ /**
49
+ * Normalize the SearXNG base URL the embedder gives: `http`/`https` only, no
50
+ * user name and no password, and no query, fragment, or trailing slash. The
51
+ * value is a composition-root constant, thus a bad one throws here at wiring
52
+ * time and not inside a tool call.
53
+ */
54
+ export function normalizeSearxngBaseUrl(raw) {
55
+ const parsed = new URL(raw);
56
+ if (parsed.protocol !== "http:" && parsed.protocol !== "https:") {
57
+ throw new Error(`The SearXNG base URL must use http or https: ${raw}`);
58
+ }
59
+ if (parsed.username !== "" || parsed.password !== "") {
60
+ throw new Error(`The SearXNG base URL must carry no user name or password: ${raw}`);
61
+ }
62
+ return `${parsed.protocol}//${parsed.host}${trimTrailingOf(parsed.pathname, "/")}`;
63
+ }
64
+ /** The first 300 characters of a body, as the HTTP-error text reports it. */
65
+ function bodyExcerpt(body) {
66
+ return body.length > 300 ? body.slice(0, 300) : body;
67
+ }
68
+ /** Map one `ApiError` of the helper to the error data variant it names. */
69
+ export function describeSearchFailure(error) {
70
+ switch (error.type) {
71
+ case "http_status":
72
+ return {
73
+ status: "http_error",
74
+ httpStatus: error.status,
75
+ text: `SearXNG answered HTTP ${error.status}${error.body ? `: ${bodyExcerpt(error.body)}` : ""}`,
76
+ };
77
+ case "invalid_response":
78
+ return { status: "schema_mismatch", text: `SearXNG response did not match the expected schema: ${error.issues}` };
79
+ case "timeout":
80
+ return {
81
+ status: "not_json",
82
+ text: `SearXNG did not answer with a valid JSON body: the request timed out after ${error.timeoutMs}ms`,
83
+ };
84
+ case "exhausted": {
85
+ // A spent retryable status arrives as `exhausted` with an `HTTP <status>`
86
+ // last error, because the helper reports it there and not as `http_status`.
87
+ const statusText = error.lastError.startsWith("HTTP ") ? error.lastError.slice("HTTP ".length) : undefined;
88
+ const status = statusText !== undefined && isAllDigits(statusText) ? statusText : null;
89
+ if (status) {
90
+ return {
91
+ status: "retryable_status",
92
+ httpStatus: Number(status),
93
+ text: `SearXNG answered HTTP ${status} and spent its retry attempt`,
94
+ };
95
+ }
96
+ // A transport failure and a body that will not parse share this bucket,
97
+ // and the text stays fixed so it never echoes a runtime parse message.
98
+ return {
99
+ status: "not_json",
100
+ text: "SearXNG did not answer with a valid JSON body",
101
+ detail: error.lastError,
102
+ };
103
+ }
104
+ }
105
+ }
106
+ export function createSearxngEngine(deps) {
107
+ const baseUrl = normalizeSearxngBaseUrl(deps.baseUrl);
108
+ return {
109
+ async search({ query, recencyFilter }) {
110
+ const params = new URLSearchParams({ q: query, format: "json" });
111
+ if (recencyFilter !== undefined)
112
+ params.set("time_range", recencyFilter);
113
+ const response = await apiFetchValidated(`${baseUrl}/search?${params}`, SearxngSearchResponseSchema, {
114
+ headers: { Accept: "application/json" },
115
+ maxRetries: 0,
116
+ });
117
+ if (response.isErr())
118
+ return err(describeSearchFailure(response.error));
119
+ return ok(mapSearxngResponse(response.value));
120
+ },
121
+ };
122
+ }
@@ -0,0 +1,127 @@
1
+ /**
2
+ * `web_fetch` — the page-reading step of the conversation agent's web research.
3
+ *
4
+ * One URL in, extracted text out: HTML becomes Markdown (Readability over a
5
+ * `linkedom` DOM, then Turndown, with the body text as the fallback), a PDF
6
+ * becomes the text of its first 100 pages through `pdf-parse`, and a text or
7
+ * JSON body passes through. A bad scheme, an internal address, an HTTP error, an
8
+ * oversized body, a redirect chain past the limit, and a body the tool cannot
9
+ * extract are all normal results on the ok channel — never a failure of the
10
+ * turn.
11
+ *
12
+ * The address guard reads the address the connection itself uses, because a
13
+ * separate name resolution before a `fetch` races the resolver (DNS rebinding):
14
+ * a literal host classifies before the request is sent — the connection layer
15
+ * runs no name lookup for a literal — and a name classifies inside the `lookup`
16
+ * hook of `node:http`/`node:https`, over every address of the resolution,
17
+ * because the connect layer falls back to a later address after an earlier one
18
+ * fails. A guarded hop is destroyed before it connects, and the call gives a
19
+ * refusal that names the origin. The tool asks nothing.
20
+ */
21
+ import { type LookupAddress, type LookupAllOptions } from "node:dns";
22
+ import { type LookupFunction } from "node:net";
23
+ import { z } from "zod";
24
+ import { type ToolOutputStore } from "../../loop/tool-output.js";
25
+ import { type Tool } from "../define-tool.js";
26
+ /** The response head and body stream of one hop, narrowed to what the tool reads. */
27
+ export type WebFetchHopResponse = {
28
+ readonly statusCode?: number;
29
+ readonly headers: Record<string, string | string[] | undefined>;
30
+ on(event: "data", listener: (chunk: Buffer) => void): void;
31
+ on(event: "end", listener: () => void): void;
32
+ on(event: "error", listener: (error: Error) => void): void;
33
+ destroy(error?: Error): void;
34
+ /** A real response holds these; the decode path pauses the encoded side while the decoder drains. */
35
+ pause?(): void;
36
+ resume?(): void;
37
+ };
38
+ /** One hop request, narrowed to what the tool drives. */
39
+ export type WebFetchHopRequestHandle = {
40
+ on(event: "response", listener: (response: WebFetchHopResponse) => void): void;
41
+ on(event: "error", listener: (error: Error) => void): void;
42
+ on(event: "timeout", listener: () => void): void;
43
+ end(): void;
44
+ destroy(error?: Error): void;
45
+ };
46
+ export type WebFetchHopRequestOptions = {
47
+ readonly headers: Record<string, string>;
48
+ readonly lookup?: LookupFunction;
49
+ readonly timeoutMs: number;
50
+ };
51
+ /** One HTTP hop. The default is the real `node:http`/`node:https` request; a test can substitute a recorded hop. */
52
+ export type WebFetchHopRequest = (url: URL, options: WebFetchHopRequestOptions) => WebFetchHopRequestHandle;
53
+ /** A name resolution that answers every address at once, the `all: true` shape of `dns.lookup`. */
54
+ export type WebFetchLookup = (hostname: string, options: LookupAllOptions, callback: (err: NodeJS.ErrnoException | null, addresses: LookupAddress[]) => void) => void;
55
+ export type WebFetchKept = {
56
+ readonly ref: string;
57
+ readonly keptLength: number;
58
+ };
59
+ export type WebFetchPdfCut = {
60
+ readonly totalPages: number;
61
+ readonly pagesRead: number;
62
+ };
63
+ export type WebFetchOk = {
64
+ readonly status: "ok";
65
+ readonly finalUrl: string;
66
+ readonly contentType: string;
67
+ readonly text: string;
68
+ readonly totalLength: number;
69
+ readonly cut: boolean;
70
+ readonly pdfCut?: WebFetchPdfCut;
71
+ readonly kept?: WebFetchKept;
72
+ readonly remainderNotKept?: boolean;
73
+ };
74
+ export type WebFetchOutput = WebFetchOk | {
75
+ readonly status: "invalid_url";
76
+ readonly text: string;
77
+ } | {
78
+ readonly status: "unsupported_scheme";
79
+ readonly scheme: string;
80
+ readonly text: string;
81
+ } | {
82
+ readonly status: "refused";
83
+ readonly text: string;
84
+ } | {
85
+ readonly status: "http_error";
86
+ readonly httpStatus: number;
87
+ readonly text: string;
88
+ } | {
89
+ readonly status: "redirect_limit";
90
+ readonly text: string;
91
+ } | {
92
+ readonly status: "body_too_large";
93
+ readonly limitBytes: number;
94
+ readonly contentType: string;
95
+ readonly text: string;
96
+ } | {
97
+ readonly status: "unextractable";
98
+ readonly contentType: string;
99
+ readonly text: string;
100
+ readonly detail?: string;
101
+ } | {
102
+ readonly status: "request_failed";
103
+ readonly text: string;
104
+ readonly detail?: string;
105
+ };
106
+ export type WebFetchToolDeps = {
107
+ readonly toolOutputStore?: ToolOutputStore;
108
+ /** Substitutes the name resolution, so a test answers a controlled address set. The default is `dns.lookup`. */
109
+ readonly lookup?: WebFetchLookup;
110
+ /** Substitutes one HTTP hop, so a test serves recorded bodies offline. The default is the real node hop. */
111
+ readonly hopRequest?: WebFetchHopRequest;
112
+ };
113
+ /**
114
+ * Estimate the deepest element nesting of an HTML document in one linear scan, without building a DOM.
115
+ * Deep nesting is the input shape that makes the linkedom/Readability pair burn CPU for minutes on a
116
+ * body under the byte limit, and the extraction is synchronous, so no deadline can interrupt it — the
117
+ * bound must gate the parse, not watch it. The estimate never parses: void elements and self-closing
118
+ * tags open no level, raw-text elements skip to their close, quoted attribute values hide their `<`,
119
+ * and an implied-close family pops its open peers, so a list or a table of any length stays flat and a
120
+ * stray close tag pops to its nearest matching open.
121
+ */
122
+ export declare function htmlNestingDepth(html: string): number;
123
+ declare const WebFetchInputSchema: z.ZodObject<{
124
+ url: z.ZodString;
125
+ }, z.core.$strip>;
126
+ export declare function createWebFetchTool(deps?: WebFetchToolDeps): Tool<z.infer<typeof WebFetchInputSchema>, WebFetchOutput>;
127
+ export {};