@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
@@ -0,0 +1,364 @@
1
+ /**
2
+ * The adapter from a harness `Tool` to an AI SDK tool.
3
+ *
4
+ * Each call runs as one durable step inside a workflow (`durableTools`), and
5
+ * directly outside one. The step output is one plain JSON value, the
6
+ * `ToolCallOutput`: the outcome of the call, its value or its excerpt, the
7
+ * call record, and the pictures. Thus a replay gets back each fact that the
8
+ * loop reads later, and the tool body does not run again.
9
+ *
10
+ * The adapter never throws for a failed call: the failure becomes an error
11
+ * output that the model reads. Only a fatal error leaves the call, for example
12
+ * the cancel of the workflow, and the loop then ends the run with it.
13
+ *
14
+ * The model reads the view that `toModelOutput` builds from the output. It never
15
+ * reads the call record.
16
+ */
17
+ import { durableTools } from "@dbos-inc/vercel-ai";
18
+ import { jsonSchema, tool as aiTool } from "ai";
19
+ import { z } from "zod";
20
+ import { stripNulCharacters } from "../input-sanitization.js";
21
+ import { ResultError } from "../lib/result.js";
22
+ import { errorMessageOf, errorNameOf, errorOf } from "../lib/thrown.js";
23
+ import { textOf } from "../lib/unknown-text.js";
24
+ import { describeZodIssueShapes } from "../lib/zod-issue-shape.js";
25
+ import { hintForZodIssue, repairToolInput } from "../lib/zod-issues.js";
26
+ import { classifyProviderError } from "../providers/errors.js";
27
+ import { isWorkflowCancellation } from "../runtime/dbos.js";
28
+ import { isToolError, readToolCallRecord, readToolResultImages, } from "../tools/define-tool.js";
29
+ import { recordKeyFor } from "./accounting.js";
30
+ import { computeDetail, computeResultDetail } from "./tool-detail.js";
31
+ import { excerptOf, keptTextOf, TOOL_RESULT_CAP, toolOutputRef } from "./tool-output.js";
32
+ const ToolResultImageSchema = z.object({ base64: z.string(), mediaType: z.string() });
33
+ const JsonSchema = z.json();
34
+ /**
35
+ * The output of one tool call, as its step records it.
36
+ *
37
+ * - `ok`: the value that the tool gave, or the excerpt of a value longer than
38
+ * the cap. A cut value keeps only its excerpt. `record` is the call record,
39
+ * and `images` are the pictures that the wire of the run carries.
40
+ * - `error`: the text that the model reads, already cut when it is long.
41
+ * - `denied`: the user rejected the approval that the tool asked for.
42
+ */
43
+ export const ToolCallOutputSchema = z.discriminatedUnion("outcome", [
44
+ z.object({
45
+ outcome: z.literal("ok"),
46
+ value: JsonSchema.optional(),
47
+ excerpt: z.string().optional(),
48
+ record: JsonSchema.optional(),
49
+ images: z.array(ToolResultImageSchema).optional(),
50
+ }),
51
+ z.object({ outcome: z.literal("error"), text: z.string() }),
52
+ z.object({ outcome: z.literal("denied"), reason: z.string() }),
53
+ ]);
54
+ /**
55
+ * The input of a recorded call as the call itself read it. A stringified
56
+ * argument gets the repair of the call, thus a selector of the outcome reads
57
+ * the value that the tool checked.
58
+ */
59
+ export function recordedInputOf(schema, raw) {
60
+ const parsed = schema.safeParse(raw);
61
+ if (parsed.success)
62
+ return parsed.data;
63
+ const repaired = schema.safeParse(repairToolInput(raw, parsed.error));
64
+ return repaired.success ? repaired.data : undefined;
65
+ }
66
+ /** A cancel of the run or of its workflow is control flow, never a result that the model reads. */
67
+ export function isFatalToolError(err) {
68
+ return errorNameOf(err) === "AbortError" || isWorkflowCancellation(err);
69
+ }
70
+ /**
71
+ * The AI SDK tools of a run. Inside a workflow each call is a durable step
72
+ * named `<tool>.<toolCallId>`. A throw from a call is fatal by construction,
73
+ * because the adapter turns each other failure into an output.
74
+ */
75
+ export function adaptTools(tools, run) {
76
+ const set = {};
77
+ for (const harnessTool of tools) {
78
+ set[harnessTool.id] = aiTool({
79
+ description: harnessTool.description,
80
+ // No validation here: the call validates its input, thus a failure keeps
81
+ // the repair of a stringified argument and the hints of the harness.
82
+ inputSchema: jsonSchema(harnessTool.jsonSchema),
83
+ execute: (input, options) => runToolCall(harnessTool, input, options, run),
84
+ toModelOutput: ({ output }) => modelViewOf(output),
85
+ });
86
+ }
87
+ // A call that starts a child workflow runs in the body, because a step cannot start a workflow.
88
+ const inBody = Object.fromEntries(tools.filter((tool) => tool.startsWorkflow === true).map((tool) => [tool.id, false]));
89
+ const durable = durableTools(set, { tools: inBody, writer: run.writer });
90
+ const guarded = {};
91
+ for (const [name, definition] of Object.entries(durable)) {
92
+ const execute = definition.execute;
93
+ if (execute === undefined) {
94
+ guarded[name] = definition;
95
+ continue;
96
+ }
97
+ guarded[name] = {
98
+ ...definition,
99
+ execute: async (input, options) => {
100
+ try {
101
+ return await execute(input, options);
102
+ }
103
+ catch (err) {
104
+ run.fail(err);
105
+ throw err;
106
+ }
107
+ },
108
+ };
109
+ }
110
+ return guarded;
111
+ }
112
+ /** What the model reads of one output. */
113
+ export function modelViewOf(output) {
114
+ switch (output.outcome) {
115
+ case "ok": {
116
+ const images = output.images ?? [];
117
+ if (images.length > 0) {
118
+ return {
119
+ type: "content",
120
+ value: [
121
+ { type: "text", text: output.excerpt ?? JSON.stringify(output.value ?? null) },
122
+ ...images.map((image) => ({ type: "file", mediaType: image.mediaType, data: { type: "data", data: image.base64 } })),
123
+ ],
124
+ };
125
+ }
126
+ return output.excerpt === undefined ? { type: "json", value: output.value ?? null } : { type: "text", value: output.excerpt };
127
+ }
128
+ case "error":
129
+ return { type: "error-text", value: output.text };
130
+ case "denied":
131
+ return { type: "execution-denied", reason: output.reason };
132
+ }
133
+ }
134
+ /** The outcome that an event and a counter report for one output. */
135
+ export function outcomeOf(output) {
136
+ return output.outcome;
137
+ }
138
+ /** Hand the call record of each output to its tool, in the order of the calls. A throw is logged, because the call has settled already. */
139
+ export function foldCallRecords(tools, calls, log) {
140
+ const byId = new Map(tools.map((t) => [t.id, t]));
141
+ for (const call of calls) {
142
+ const output = call.output;
143
+ if (output?.outcome !== "ok" || output.record === undefined)
144
+ continue;
145
+ const tool = byId.get(call.toolName);
146
+ if (tool?.foldCallRecord === undefined)
147
+ continue;
148
+ try {
149
+ tool.foldCallRecord(output.record);
150
+ }
151
+ catch (err) {
152
+ log.error("a tool call record did not fold", { tool: tool.id, toolCallId: call.toolCallId, ...log.errorFields(err) });
153
+ }
154
+ }
155
+ }
156
+ async function runToolCall(tool, input, options, run) {
157
+ const startedAt = performance.now();
158
+ const { toolCallId } = options;
159
+ const detail = computeDetail(tool, input, run.log);
160
+ // The emit and the call start before the first await: a call that runs in the body of a workflow takes its
161
+ // function ids in the order of the calls, thus a replay gives each call its own child.
162
+ const started = run.emit({ type: "tool-started", source: run.source, toolUseId: toolCallId, name: tool.id, input, ...detailField(detail) });
163
+ const ctx = {
164
+ invocationId: toolCallId,
165
+ session: run.session,
166
+ signal: options.abortSignal ?? new AbortController().signal,
167
+ emit: run.emit,
168
+ turnUsage: run.turnUsage,
169
+ };
170
+ // One wait reads the two, thus a failed emit leaves no rejection of the call unread.
171
+ const [, settled] = await Promise.all([started, settleCall(tool, input, ctx, run)]);
172
+ const output = await cutLongOutput(settled.output, tool.id, toolCallId, run);
173
+ await run.emit({
174
+ type: "tool-finished",
175
+ source: run.source,
176
+ toolUseId: toolCallId,
177
+ name: tool.id,
178
+ outcome: output.outcome,
179
+ ...detailField(settled.detail ?? detail),
180
+ durationMs: Math.round(performance.now() - startedAt),
181
+ });
182
+ return output;
183
+ }
184
+ async function settleCall(tool, input, ctx, run) {
185
+ const parsed = tool.inputSchema.safeParse(input);
186
+ let data;
187
+ if (parsed.success) {
188
+ data = parsed.data;
189
+ }
190
+ else {
191
+ // A complete JSON argument can arrive as a string behind function-call
192
+ // markup or a code fence. Repair only makes the schema reachable — the
193
+ // repaired value is validated in full, and the tool's own semantic checks
194
+ // still run, so nothing here weakens validation.
195
+ const repairedInput = repairToolInput(input, parsed.error);
196
+ const repaired = repairedInput === undefined ? undefined : tool.inputSchema.safeParse(repairedInput);
197
+ if (repaired?.success !== true) {
198
+ // The Zod text can quote the input, thus the log gets only the shape of the failure.
199
+ run.log.warn("tool call rejected", { tool: tool.id, toolCallId: ctx.invocationId, issues: describeZodIssueShapes(parsed.error, tool.inputSchema) });
200
+ return { output: errorOutput(`input validation failed: ${formatZodIssues(parsed.error, input)}`) };
201
+ }
202
+ data = repaired.data;
203
+ }
204
+ try {
205
+ const result = await tool.execute(data, ctx);
206
+ if (result.isErr()) {
207
+ logToolFailure(tool, ctx.invocationId, result.error, run.log);
208
+ return { output: errorOutput(toolErrorContent(result.error)) };
209
+ }
210
+ // The one place a result description runs: the ok value in hand, the
211
+ // input already validated, and the guard inside the compute.
212
+ return { output: okOutput(tool.id, result.value, run), detail: computeResultDetail(tool, data, result.value, run.log) };
213
+ }
214
+ catch (err) {
215
+ if (isFatalToolError(err))
216
+ throw err;
217
+ logToolFailure(tool, ctx.invocationId, err, run.log);
218
+ return { output: errorOutput(toolErrorContent(err)) };
219
+ }
220
+ }
221
+ /**
222
+ * The ok output of a value. The JSON data loses each NUL, and the pictures leave
223
+ * it. A wire that carries no picture in a tool result gets the text alone, and
224
+ * one warn with the count rides the log: base64 text floods the context, and the
225
+ * model cannot see it.
226
+ */
227
+ function okOutput(toolId, value, run) {
228
+ const output = {
229
+ outcome: "ok",
230
+ value: jsonValue(value),
231
+ };
232
+ const record = readToolCallRecord(value);
233
+ // The record crosses the step cache, thus the contract of a call record is plain JSON.
234
+ if (record !== undefined)
235
+ output.record = jsonValue(record);
236
+ const images = readToolResultImages(value);
237
+ if (images.length > 0) {
238
+ if (run.capabilities.imageToolResults === true) {
239
+ output.images = images.map((image) => ({ base64: image.base64, mediaType: image.mediaType }));
240
+ }
241
+ else {
242
+ run.log.warn("the wired provider carries no picture in a tool result, thus the pictures are dropped", {
243
+ toolName: toolId,
244
+ imageCount: images.length,
245
+ });
246
+ }
247
+ }
248
+ return output;
249
+ }
250
+ function errorOutput(text) {
251
+ // A thrown tool error routinely quotes stderr verbatim — as exposed to NUL as a success payload.
252
+ return { outcome: "error", text: stripNulCharacters(text) };
253
+ }
254
+ /**
255
+ * The output with an excerpt in place of a text longer than the cap. The text
256
+ * is kept first under a reference that a rerun of the call gives again, and the
257
+ * excerpt does not depend on the outcome of the put. Thus a rerun gives the
258
+ * same bytes.
259
+ */
260
+ async function cutLongOutput(output, toolName, toolCallId, run) {
261
+ if (output.outcome === "denied")
262
+ return output;
263
+ const text = output.outcome === "ok" ? JSON.stringify(output.value ?? null) : output.text;
264
+ if (text.length <= TOOL_RESULT_CAP)
265
+ return output;
266
+ let kept;
267
+ if (run.store !== undefined) {
268
+ const { session } = run;
269
+ const ref = toolOutputRef(recordKeyFor(session, run.invocationId, toolCallId));
270
+ const content = keptTextOf(text);
271
+ // A run session carries the thread of the chat that started the run, but a run belongs to its analysis.
272
+ const threadId = session.runFrame === undefined ? session.scope.threadId : undefined;
273
+ const put = await run.store.put({
274
+ analysisId: session.scope.analysisId,
275
+ ref,
276
+ toolName,
277
+ toolCallId,
278
+ content,
279
+ totalLength: text.length,
280
+ threadId,
281
+ });
282
+ if (put.isErr())
283
+ run.log.warn("tool output not kept", { toolName, toolCallId, ref, errorType: put.error.type });
284
+ kept = { ref, keptLength: content.length };
285
+ }
286
+ const excerpt = excerptOf(text, kept);
287
+ if (output.outcome === "error")
288
+ return { outcome: "error", text: excerpt };
289
+ const cut = {
290
+ outcome: "ok",
291
+ excerpt,
292
+ };
293
+ if (output.record !== undefined)
294
+ cut.record = output.record;
295
+ if (output.images !== undefined)
296
+ cut.images = output.images;
297
+ return cut;
298
+ }
299
+ /**
300
+ * Log a tool failure. A `ToolError` is a failure that the tool modeled, thus its
301
+ * own text is the account. Any other `Error` is a fault that the tool did not
302
+ * model, and the log gets one warn.
303
+ */
304
+ function logToolFailure(tool, toolCallId, failure, log) {
305
+ if (modeledToolError(failure) !== undefined)
306
+ return;
307
+ const failureError = errorOf(failure);
308
+ if (failureError !== undefined)
309
+ log.warn("tool call threw", { tool: tool.id, toolCallId, ...log.errorFields(failureError) });
310
+ }
311
+ /** The `ToolError` of a failure: the value itself, or the value that `unwrapOrThrow` wrapped in a `ResultError`. */
312
+ function modeledToolError(failure) {
313
+ if (isToolError(failure))
314
+ return failure;
315
+ return failure instanceof ResultError && isToolError(failure.value) ? failure.value : undefined;
316
+ }
317
+ /**
318
+ * Normalize a tool's return value to plain JSON, stripping NUL from every string
319
+ * it holds. The reviver sees values, not keys — a NUL in an object KEY would
320
+ * still reach the row, but keys come from tool result types rather than scanned
321
+ * bytes, so nothing produces one.
322
+ */
323
+ function jsonValue(value) {
324
+ // The stringify/parse round trip holds only JSON values, so the parse never
325
+ // refuses; it moves the parser's `any` out of the tool-result field.
326
+ // oxlint-disable-next-line eslint-js/no-restricted-syntax -- the NUL-stripping reviver walks a value this code serialized one line above, not text of unknown shape; a schema proves nothing here.
327
+ const serialized = JSON.parse(JSON.stringify(value ?? null), (_key, v) => (typeof v === "string" ? stripNulCharacters(v) : v));
328
+ return JsonSchema.parse(serialized);
329
+ }
330
+ // NUL is stripped from the prose BEFORE it is serialized: past the stringify it
331
+ // is the six-character escape \u0000 — legitimate JSON text, and no longer
332
+ // distinguishable from an error that happens to quote that escape.
333
+ function toolErrorContent(value) {
334
+ const toolError = modeledToolError(value);
335
+ if (toolError !== undefined) {
336
+ return JSON.stringify({ error: stripNulCharacters(toolError.error), retryable: toolError.retryable });
337
+ }
338
+ const { retryable } = classifyProviderError(value);
339
+ const error = stripNulCharacters(errorMessageOf(value) ?? textOf(value));
340
+ return JSON.stringify({ error, retryable });
341
+ }
342
+ /** The prose of a rejected approval is the only account that the model gets of the denial. */
343
+ export function deniedReason(feedback) {
344
+ return feedback === undefined || feedback.length === 0
345
+ ? "The user rejected this action."
346
+ : `The user rejected this action with the following feedback: ${feedback}`;
347
+ }
348
+ /**
349
+ * The optional `detail` field, present only when there is one. Spread rather
350
+ * than assigned so an undescribed call emits an event with no `detail` key at
351
+ * all, which is what the contract promises: absent, never empty.
352
+ */
353
+ function detailField(detail) {
354
+ return detail === undefined ? {} : { detail };
355
+ }
356
+ function formatZodIssues(error, input) {
357
+ return error.issues
358
+ .map((issue) => {
359
+ const path = issue.path.length > 0 ? issue.path.join(".") : "(root)";
360
+ const hint = hintForZodIssue(issue, input);
361
+ return hint === undefined ? `${path}: ${issue.message}` : `${path}: ${issue.message} — ${hint}`;
362
+ })
363
+ .join("; ");
364
+ }
@@ -19,7 +19,7 @@
19
19
  import type { ToolCallDetail } from "../contracts/chat-events.js";
20
20
  import type { Logger } from "../lib/logger.js";
21
21
  import type { Tool } from "../tools/define-tool.js";
22
- export type { ToolCallDetail };
22
+ export type { ToolCallDetail } from "../contracts/chat-events.js";
23
23
  /**
24
24
  * The length cap, in characters. A full workspace path with a line range fits
25
25
  * comfortably; a `write_file` content field does not, which is the point — a
@@ -17,6 +17,7 @@
17
17
  * the length cap slightly wrong. Here it is one auditable path.
18
18
  */
19
19
  import { normalizeUnicode, redactSecrets } from "../input-sanitization.js";
20
+ import { collapseWhitespace } from "../lib/text.js";
20
21
  /**
21
22
  * The length cap, in characters. A full workspace path with a line range fits
22
23
  * comfortably; a `write_file` content field does not, which is the point — a
@@ -88,7 +89,7 @@ export function normalizeDetail(raw) {
88
89
  // `normalizeUnicode` leaves tab, newline and carriage return in place (they
89
90
  // are legitimate whitespace in prose); the collapse below is what turns them
90
91
  // into the single line this contract promises.
91
- const oneLine = normalizeUnicode(raw).replace(/\s+/g, " ").trim();
92
+ const oneLine = collapseWhitespace(normalizeUnicode(raw));
92
93
  if (oneLine.length === 0)
93
94
  return undefined;
94
95
  const capped = capCodePoints(redactSecrets(oneLine), DETAIL_MAX_LENGTH);
@@ -112,9 +113,9 @@ export function computeDetail(tool, rawInput, log) {
112
113
  // an open list — an embedder contributes its own through the host-tools seam —
113
114
  // so a `describeCall` that is not callable is reachable. Such a tool counts as
114
115
  // undescribed, because the alternative is a TypeError on every one of its calls.
115
- const describeCall = tool.describeCall;
116
- if (typeof describeCall !== "function")
116
+ if (typeof tool.describeCall !== "function")
117
117
  return undefined;
118
+ const describeCall = tool.describeCall.bind(tool);
118
119
  try {
119
120
  // The parse is INSIDE the guard, not before it. `safeParse` returns an
120
121
  // error for a rejected value but THROWS for a schema it cannot run
@@ -155,9 +156,9 @@ export function computeResultDetail(tool, parsedInput, result, log) {
155
156
  // The guard tests for a function, not for presence, for the same reason as in
156
157
  // `computeDetail`: a packaged tool comes from an open list, thus a
157
158
  // `describeResult` that is not callable is reachable.
158
- const describeResult = tool.describeResult;
159
- if (typeof describeResult !== "function")
159
+ if (typeof tool.describeResult !== "function")
160
160
  return undefined;
161
+ const describeResult = tool.describeResult.bind(tool);
161
162
  try {
162
163
  return normalizeDetail(describeResult(parsedInput, result));
163
164
  }
@@ -9,7 +9,7 @@
9
9
  * reporting success for every call because it never looked at the result at all.
10
10
  */
11
11
  import type { ToolOutcome } from "../contracts/chat-events.js";
12
- export type { ToolOutcome };
12
+ export type { ToolOutcome } from "../contracts/chat-events.js";
13
13
  /**
14
14
  * Classify a tool result's output type.
15
15
  *
@@ -14,7 +14,7 @@ export declare const EXCERPT_TAIL_CHARS: number;
14
14
  /** The bound of a file that `grep` reads, thus a pattern search over a kept text costs no more than a `grep`. */
15
15
  export declare const TOOL_OUTPUT_KEEP_MAX: number;
16
16
  export declare const READ_TOOL_OUTPUT_TOOL_ID = "read_tool_output";
17
- export interface KeptToolOutput {
17
+ export type KeptToolOutput = {
18
18
  readonly analysisId: string;
19
19
  readonly ref: string;
20
20
  readonly toolName: string;
@@ -25,13 +25,13 @@ export interface KeptToolOutput {
25
25
  readonly content: string;
26
26
  /** The length of the whole text of the result. */
27
27
  readonly totalLength: number;
28
- }
28
+ };
29
29
  /** Keeps the text of each cut tool result for `read_tool_output`. */
30
- export interface ToolOutputStore {
30
+ export type ToolOutputStore = {
31
31
  /** A second put of the same analysis id and reference replaces the text. */
32
32
  put(output: KeptToolOutput): ResultAsync<void, DomainError>;
33
33
  get(analysisId: string, ref: string): ResultAsync<KeptToolOutput | null, DomainError>;
34
- }
34
+ };
35
35
  /** The reference of one kept text. It is short, because the model copies it. */
36
36
  export declare function toolOutputRef(key: string): string;
37
37
  /** The text that the model reads for a result, or `undefined` for a denial, which is never cut. */
@@ -26,7 +26,7 @@ export function resultTextOf(output) {
26
26
  case "error-text":
27
27
  return output.value;
28
28
  case "content":
29
- return output.value.map((part) => (part.type === "text" ? part.text : "")).join("");
29
+ return output.value.map((part) => ("text" in part ? part.text : "")).join("");
30
30
  case "execution-denied":
31
31
  return undefined;
32
32
  }
@@ -72,7 +72,7 @@ export function withExcerpt(part, excerpt) {
72
72
  case "error-text":
73
73
  return { ...part, output: { type: "error-text", value: excerpt } };
74
74
  case "content":
75
- return { ...part, output: { type: "content", value: [{ type: "text", text: excerpt }, ...output.value.filter((p) => p.type !== "text")] } };
75
+ return { ...part, output: { type: "content", value: [{ type: "text", text: excerpt }, ...output.value.filter((p) => !("text" in p))] } };
76
76
  case "execution-denied":
77
77
  return part;
78
78
  }
@@ -0,0 +1,34 @@
1
+ /**
2
+ * The live credential of each chat turn of this process.
3
+ *
4
+ * A chat turn stores no credential in its workflow. The open of a turn puts the
5
+ * credential of the request here, and the end of the turn takes it away. A turn
6
+ * that a recovery runs in a new process finds no entry, thus the function of
7
+ * the host gives its credential, or nothing. A sub-agent of a turn asks for the
8
+ * credential of its root turn, which it knows from the context of its body.
9
+ */
10
+ import type { LanguageModelMiddleware } from "ai";
11
+ import type { AuthContext } from "../auth/types.js";
12
+ export declare const turnCredentials: {
13
+ put(turnId: string, auth: AuthContext): void;
14
+ drop(turnId: string): void;
15
+ /** The credential of a turn: the live one of this process, else the one that the function of the host gives. */
16
+ of(turnId: string): AuthContext | undefined;
17
+ /** The function of the host for a turn that this process did not open. */
18
+ setHostCredential(credentialFor: ((turnId: string) => AuthContext | undefined) | undefined): void;
19
+ };
20
+ /** Run the body of a turn, or of one of its sub-agents, with the id of its root turn in its context. */
21
+ export declare function withRootTurn<T>(turnId: string, body: () => Promise<T>): Promise<T>;
22
+ /** The id of the root chat turn of the body that runs, or `undefined` outside a chat turn. */
23
+ export declare function currentRootTurn(): string | undefined;
24
+ /** The error of a model call of a turn whose host gives no credential. The turn pauses on it with the cause `credential`. */
25
+ export declare class TurnCredentialMissingError extends Error {
26
+ constructor();
27
+ }
28
+ /**
29
+ * A middleware that fails each model call while `credentialOf` gives no credential. It runs inside the step of the
30
+ * call, thus a replay of a recorded call does not read the credential again.
31
+ */
32
+ export declare function credentialGuard(credentialOf: () => AuthContext | undefined): LanguageModelMiddleware;
33
+ /** Whether an error, or an error on its cause chain, is a missing credential of a turn. A replay of a step gives the name again. */
34
+ export declare function isTurnCredentialMissing(err: unknown): boolean;
@@ -0,0 +1,73 @@
1
+ /**
2
+ * The live credential of each chat turn of this process.
3
+ *
4
+ * A chat turn stores no credential in its workflow. The open of a turn puts the
5
+ * credential of the request here, and the end of the turn takes it away. A turn
6
+ * that a recovery runs in a new process finds no entry, thus the function of
7
+ * the host gives its credential, or nothing. A sub-agent of a turn asks for the
8
+ * credential of its root turn, which it knows from the context of its body.
9
+ */
10
+ import { AsyncLocalStorage } from "node:async_hooks";
11
+ import { z } from "zod";
12
+ import { errorNameOf } from "../lib/thrown.js";
13
+ const credentials = new Map();
14
+ let hostCredential;
15
+ const rootTurn = new AsyncLocalStorage();
16
+ export const turnCredentials = {
17
+ put(turnId, auth) {
18
+ credentials.set(turnId, auth);
19
+ },
20
+ drop(turnId) {
21
+ credentials.delete(turnId);
22
+ },
23
+ /** The credential of a turn: the live one of this process, else the one that the function of the host gives. */
24
+ of(turnId) {
25
+ return credentials.get(turnId) ?? hostCredential?.(turnId);
26
+ },
27
+ /** The function of the host for a turn that this process did not open. */
28
+ setHostCredential(credentialFor) {
29
+ hostCredential = credentialFor;
30
+ },
31
+ };
32
+ /** Run the body of a turn, or of one of its sub-agents, with the id of its root turn in its context. */
33
+ export function withRootTurn(turnId, body) {
34
+ return rootTurn.run(turnId, body);
35
+ }
36
+ /** The id of the root chat turn of the body that runs, or `undefined` outside a chat turn. */
37
+ export function currentRootTurn() {
38
+ return rootTurn.getStore();
39
+ }
40
+ /** The error of a model call of a turn whose host gives no credential. The turn pauses on it with the cause `credential`. */
41
+ export class TurnCredentialMissingError extends Error {
42
+ constructor() {
43
+ super("The turn has no credential of its user.");
44
+ this.name = "TurnCredentialMissingError";
45
+ }
46
+ }
47
+ /**
48
+ * A middleware that fails each model call while `credentialOf` gives no credential. It runs inside the step of the
49
+ * call, thus a replay of a recorded call does not read the credential again.
50
+ */
51
+ export function credentialGuard(credentialOf) {
52
+ const missing = () => credentialOf() === undefined;
53
+ return {
54
+ specificationVersion: "v4",
55
+ wrapStream: ({ doStream }) => (missing() ? Promise.reject(new TurnCredentialMissingError()) : doStream()),
56
+ wrapGenerate: ({ doGenerate }) => (missing() ? Promise.reject(new TurnCredentialMissingError()) : doGenerate()),
57
+ };
58
+ }
59
+ /** A link of the chain whose cause is an error. The error of a missing credential is an `Error`, thus the walk follows errors only. */
60
+ const CauseLinkSchema = z.looseObject({ cause: z.instanceof(Error) });
61
+ /** The depth of a cause chain that the walk reads, as a bound for a chain with a cycle. */
62
+ const CAUSE_CHAIN_DEPTH = 8;
63
+ /** Whether an error, or an error on its cause chain, is a missing credential of a turn. A replay of a step gives the name again. */
64
+ export function isTurnCredentialMissing(err) {
65
+ let link = err;
66
+ for (let depth = 0; depth < CAUSE_CHAIN_DEPTH && link !== undefined; depth++) {
67
+ if (errorNameOf(link) === "TurnCredentialMissingError")
68
+ return true;
69
+ const next = CauseLinkSchema.safeParse(link);
70
+ link = next.success ? next.data.cause : undefined;
71
+ }
72
+ return false;
73
+ }