@inflexa-ai/harness 0.45.1 → 0.46.2

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 (790) hide show
  1. package/README.md +6 -3
  2. package/dist/agents/conversation-agent.d.ts +9 -3
  3. package/dist/agents/conversation-agent.js +34 -33
  4. package/dist/agents/report-session-agent.d.ts +15 -15
  5. package/dist/agents/report-session-agent.js +23 -15
  6. package/dist/agents/sandbox/index.d.ts +1 -1
  7. package/dist/agents/sandbox/index.js +1 -1
  8. package/dist/agents/sandbox/shared.d.ts +12 -14
  9. package/dist/agents/sandbox/shared.js +18 -12
  10. package/dist/agents/sandbox/types.d.ts +4 -4
  11. package/dist/agents/sandbox/validate-skills.d.ts +2 -2
  12. package/dist/agents/sandbox/validate-skills.js +3 -1
  13. package/dist/agents/sandbox-catalog.d.ts +2 -2
  14. package/dist/agents/sandbox-catalog.js +3 -3
  15. package/dist/agents/system-prompt.d.ts +2 -2
  16. package/dist/app/chat-turn-workflow.d.ts +114 -0
  17. package/dist/app/chat-turn-workflow.js +306 -0
  18. package/dist/app/chat-turn.d.ts +85 -57
  19. package/dist/app/chat-turn.js +123 -100
  20. package/dist/app/data-profile-orientation.js +10 -8
  21. package/dist/app/data-profile-view.d.ts +4 -4
  22. package/dist/app/data-profile-view.js +9 -8
  23. package/dist/app/in-process-turn.d.ts +42 -0
  24. package/dist/app/in-process-turn.js +139 -0
  25. package/dist/app/message-assembly.d.ts +10 -4
  26. package/dist/app/message-assembly.js +13 -8
  27. package/dist/app/report-session-runtime.d.ts +4 -4
  28. package/dist/app/report-session-runtime.js +36 -21
  29. package/dist/app/spawn-report-session.d.ts +33 -28
  30. package/dist/app/spawn-report-session.js +25 -40
  31. package/dist/app/synthesize-run.d.ts +22 -16
  32. package/dist/app/synthesize-run.js +41 -35
  33. package/dist/app/work.d.ts +96 -0
  34. package/dist/app/work.js +147 -0
  35. package/dist/auth/local-auth-context.d.ts +1 -3
  36. package/dist/auth/local-auth-context.js +1 -3
  37. package/dist/auth/local-run-authorizer.d.ts +1 -1
  38. package/dist/auth/local-run-authorizer.js +5 -3
  39. package/dist/auth/types.d.ts +26 -26
  40. package/dist/billing/cached-resolver.d.ts +4 -4
  41. package/dist/billing/run-charge.d.ts +5 -8
  42. package/dist/billing/run-charge.js +2 -2
  43. package/dist/billing/usage-recorder.d.ts +9 -9
  44. package/dist/citations/aggregate.js +1 -1
  45. package/dist/citations/clients/arxiv.d.ts +2 -2
  46. package/dist/citations/clients/arxiv.js +12 -4
  47. package/dist/citations/clients/common.js +4 -2
  48. package/dist/citations/clients/crossref.d.ts +2 -2
  49. package/dist/citations/clients/crossref.js +37 -37
  50. package/dist/citations/clients/doi-registry.js +15 -16
  51. package/dist/citations/clients/pubmed.d.ts +2 -2
  52. package/dist/citations/clients/pubmed.js +20 -13
  53. package/dist/citations/clients/semantic-scholar.d.ts +2 -2
  54. package/dist/citations/clients/semantic-scholar.js +9 -9
  55. package/dist/citations/compare.js +2 -2
  56. package/dist/citations/match.d.ts +2 -2
  57. package/dist/citations/match.js +12 -7
  58. package/dist/citations/normalize.js +35 -26
  59. package/dist/citations/plan.js +6 -2
  60. package/dist/citations/resolve.d.ts +6 -6
  61. package/dist/citations/resolve.js +34 -25
  62. package/dist/citations/types.d.ts +77 -77
  63. package/dist/config/environment-stores.d.ts +6 -6
  64. package/dist/config/resource-limits.js +1 -3
  65. package/dist/contracts/analogy-report.d.ts +7 -7
  66. package/dist/contracts/analogy-report.js +2 -2
  67. package/dist/contracts/chat-events.d.ts +38 -24
  68. package/dist/contracts/chat-frame.d.ts +15 -5
  69. package/dist/contracts/chat-frame.js +64 -41
  70. package/dist/contracts/chat-parts.d.ts +130 -67
  71. package/dist/contracts/chat-parts.js +1 -0
  72. package/dist/contracts/content-url.js +16 -2
  73. package/dist/contracts/data-profile.d.ts +38 -38
  74. package/dist/contracts/index.d.ts +2 -2
  75. package/dist/contracts/index.js +1 -1
  76. package/dist/contracts/message.d.ts +6 -6
  77. package/dist/contracts/organ-system.d.ts +11 -11
  78. package/dist/contracts/part-registry.d.ts +5 -4
  79. package/dist/contracts/part-registry.js +5 -0
  80. package/dist/contracts/profile-vocabulary.d.ts +11 -10
  81. package/dist/contracts/profile-vocabulary.js +10 -3
  82. package/dist/contracts/report-blocks.d.ts +329 -329
  83. package/dist/contracts/report-reference.d.ts +105 -81
  84. package/dist/contracts/report-reference.js +30 -13
  85. package/dist/contracts/schemas/chat-events.d.ts +30 -16
  86. package/dist/contracts/schemas/chat-events.js +15 -6
  87. package/dist/contracts/schemas/chat-parts.d.ts +175 -102
  88. package/dist/contracts/schemas/chat-parts.js +33 -7
  89. package/dist/contracts/severity.d.ts +1 -1
  90. package/dist/contracts/structure-source.d.ts +3 -3
  91. package/dist/contracts/structure-source.js +6 -2
  92. package/dist/contracts/subagent-activity.d.ts +2 -2
  93. package/dist/contracts/subagent-activity.js +5 -3
  94. package/dist/contracts/usage.d.ts +2 -2
  95. package/dist/data/safety-panel-schema.d.ts +25 -25
  96. package/dist/data/safety-panel-schema.js +13 -4
  97. package/dist/execution/artifact-metadata.d.ts +23 -15
  98. package/dist/execution/artifact-metadata.js +33 -10
  99. package/dist/execution/artifact-record.d.ts +2 -2
  100. package/dist/execution/artifact-registration.d.ts +5 -5
  101. package/dist/execution/artifact-registry.d.ts +8 -8
  102. package/dist/execution/dbos-run-launcher.d.ts +24 -4
  103. package/dist/execution/dbos-run-launcher.js +58 -4
  104. package/dist/execution/dbos-workflow-purger.d.ts +5 -6
  105. package/dist/execution/dbos-workflow-purger.js +8 -7
  106. package/dist/execution/input-signature.d.ts +2 -2
  107. package/dist/execution/post-step-pipeline.d.ts +9 -9
  108. package/dist/execution/post-step-pipeline.js +1 -1
  109. package/dist/execution/post-step.js +2 -2
  110. package/dist/execution/reconcile-manifest.d.ts +4 -4
  111. package/dist/execution/reconcile-manifest.js +3 -2
  112. package/dist/execution/run-authorizer.d.ts +46 -37
  113. package/dist/execution/run-authorizer.js +8 -8
  114. package/dist/execution/run-canceler.d.ts +7 -7
  115. package/dist/execution/run-canceler.js +14 -7
  116. package/dist/execution/run-end-record.d.ts +2 -3
  117. package/dist/execution/run-event-parts.d.ts +0 -8
  118. package/dist/execution/run-event-parts.js +29 -24
  119. package/dist/execution/run-event-stream.d.ts +8 -8
  120. package/dist/execution/run-event-stream.js +3 -4
  121. package/dist/execution/run-launcher.d.ts +4 -4
  122. package/dist/execution/run-synthesis.d.ts +49 -48
  123. package/dist/execution/run-synthesis.js +96 -255
  124. package/dist/execution/staged-input.d.ts +2 -2
  125. package/dist/execution/step-summary.d.ts +6 -6
  126. package/dist/execution/step-summary.js +4 -8
  127. package/dist/execution/topo-sort.js +4 -3
  128. package/dist/execution/workflow-purger.d.ts +2 -2
  129. package/dist/index.d.ts +17 -20
  130. package/dist/index.js +25 -36
  131. package/dist/input-sanitization.js +9 -2
  132. package/dist/input-scan/clustering.d.ts +6 -6
  133. package/dist/input-scan/clustering.js +11 -5
  134. package/dist/input-scan/companions.js +3 -2
  135. package/dist/input-scan/detect-sets.d.ts +2 -2
  136. package/dist/input-scan/detect-sets.js +25 -21
  137. package/dist/input-scan/enrich.d.ts +6 -6
  138. package/dist/input-scan/enrich.js +29 -12
  139. package/dist/input-scan/formats.d.ts +2 -2
  140. package/dist/input-scan/formats.js +8 -2
  141. package/dist/input-scan/markers.d.ts +2 -2
  142. package/dist/input-scan/markers.js +14 -5
  143. package/dist/input-scan/menu.d.ts +10 -10
  144. package/dist/input-scan/menu.js +0 -0
  145. package/dist/input-scan/quarantine.d.ts +2 -2
  146. package/dist/input-scan/quarantine.js +23 -18
  147. package/dist/input-scan/readout-budget.d.ts +2 -2
  148. package/dist/input-scan/readout-budget.js +1 -1
  149. package/dist/input-scan/readout.d.ts +2 -2
  150. package/dist/input-scan/readout.js +47 -34
  151. package/dist/input-scan/scan.d.ts +2 -2
  152. package/dist/input-scan/scan.js +7 -5
  153. package/dist/input-scan/set-types.d.ts +28 -28
  154. package/dist/input-scan/shapes.d.ts +4 -4
  155. package/dist/input-scan/shapes.js +0 -0
  156. package/dist/input-scan/templates.d.ts +10 -10
  157. package/dist/input-scan/templates.js +30 -22
  158. package/dist/input-scan/tokens.d.ts +6 -4
  159. package/dist/input-scan/tokens.js +100 -38
  160. package/dist/input-scan/types.d.ts +22 -22
  161. package/dist/lib/async-utils.d.ts +3 -7
  162. package/dist/lib/async-utils.js +5 -9
  163. package/dist/lib/cache.js +1 -1
  164. package/dist/lib/chrome.d.ts +46 -6
  165. package/dist/lib/console-logger.js +2 -2
  166. package/dist/lib/db-result.d.ts +22 -6
  167. package/dist/lib/db-result.js +9 -13
  168. package/dist/lib/eyes.d.ts +4 -4
  169. package/dist/lib/eyes.js +1 -1
  170. package/dist/lib/fs-helpers.js +18 -6
  171. package/dist/lib/fs-result.d.ts +1 -0
  172. package/dist/lib/fs-result.js +5 -6
  173. package/dist/lib/hooks.d.ts +32 -7
  174. package/dist/lib/hooks.js +22 -3
  175. package/dist/lib/host-concurrency.js +3 -2
  176. package/dist/lib/logger.d.ts +2 -2
  177. package/dist/lib/logger.js +2 -1
  178. package/dist/lib/metrics.d.ts +1 -1
  179. package/dist/lib/null-proto.d.ts +6 -0
  180. package/dist/lib/null-proto.js +17 -0
  181. package/dist/lib/otel-spans.d.ts +1 -1
  182. package/dist/lib/otel-spans.js +9 -5
  183. package/dist/lib/otel.d.ts +4 -2
  184. package/dist/lib/otel.js +10 -2
  185. package/dist/lib/page-capture.d.ts +8 -8
  186. package/dist/lib/page-capture.js +9 -4
  187. package/dist/lib/parse-json.d.ts +5 -0
  188. package/dist/lib/parse-json.js +12 -0
  189. package/dist/lib/present.d.ts +12 -0
  190. package/dist/lib/present.js +39 -0
  191. package/dist/lib/rate-limit.d.ts +4 -4
  192. package/dist/lib/rate-limit.js +12 -13
  193. package/dist/lib/regulatory-corpus/fetch-fda-guidance.d.ts +4 -4
  194. package/dist/lib/regulatory-corpus/fetch-fda-guidance.js +4 -10
  195. package/dist/lib/regulatory-corpus/fetch-ich.d.ts +4 -4
  196. package/dist/lib/regulatory-corpus/fetch-ich.js +18 -14
  197. package/dist/lib/regulatory-corpus/normalize-whitespace.d.ts +6 -0
  198. package/dist/lib/regulatory-corpus/normalize-whitespace.js +41 -0
  199. package/dist/lib/regulatory-corpus.d.ts +10 -10
  200. package/dist/lib/regulatory-corpus.js +3 -1
  201. package/dist/lib/result.d.ts +10 -11
  202. package/dist/lib/result.js +15 -13
  203. package/dist/lib/storage.d.ts +2 -2
  204. package/dist/lib/test/async-iterable.d.ts +9 -0
  205. package/dist/lib/test/async-iterable.js +28 -0
  206. package/dist/lib/test/request-url.d.ts +5 -0
  207. package/dist/lib/test/request-url.js +7 -0
  208. package/dist/lib/test/result-assert.d.ts +12 -0
  209. package/dist/lib/test/result-assert.js +17 -0
  210. package/dist/lib/test/text-shapes.d.ts +24 -0
  211. package/dist/lib/test/text-shapes.js +63 -0
  212. package/dist/lib/text.d.ts +22 -0
  213. package/dist/lib/text.js +68 -0
  214. package/dist/lib/thrown.d.ts +18 -0
  215. package/dist/lib/thrown.js +30 -0
  216. package/dist/lib/unknown-array.d.ts +6 -0
  217. package/dist/lib/unknown-array.js +8 -0
  218. package/dist/lib/unknown-containers.d.ts +14 -0
  219. package/dist/lib/unknown-containers.js +17 -0
  220. package/dist/lib/unknown-text.d.ts +8 -0
  221. package/dist/lib/unknown-text.js +28 -0
  222. package/dist/lib/zod-issue-shape.d.ts +1 -1
  223. package/dist/lib/zod-issue-shape.js +31 -31
  224. package/dist/lib/zod-issues.d.ts +3 -3
  225. package/dist/lib/zod-issues.js +30 -17
  226. package/dist/literature/sources/arxiv.d.ts +6 -6
  227. package/dist/literature/sources/arxiv.js +92 -35
  228. package/dist/literature/sources/http.d.ts +2 -2
  229. package/dist/literature/sources/http.js +16 -15
  230. package/dist/literature/sources/pubmed.d.ts +16 -16
  231. package/dist/literature/sources/pubmed.js +96 -61
  232. package/dist/literature/sources/semantic-scholar.d.ts +8 -8
  233. package/dist/literature/sources/semantic-scholar.js +22 -13
  234. package/dist/loop/accounting.d.ts +63 -0
  235. package/dist/loop/accounting.js +141 -0
  236. package/dist/loop/call-policy.d.ts +73 -0
  237. package/dist/loop/call-policy.js +109 -0
  238. package/dist/loop/chat-stream.d.ts +62 -0
  239. package/dist/loop/chat-stream.js +237 -0
  240. package/dist/loop/compaction.d.ts +9 -9
  241. package/dist/loop/compaction.js +1 -1
  242. package/dist/loop/metrics.d.ts +12 -15
  243. package/dist/loop/metrics.js +14 -26
  244. package/dist/loop/run-loop.d.ts +233 -0
  245. package/dist/loop/run-loop.js +770 -0
  246. package/dist/loop/sub-agent.d.ts +61 -0
  247. package/dist/loop/sub-agent.js +160 -0
  248. package/dist/loop/tool-adapter.d.ts +98 -0
  249. package/dist/loop/tool-adapter.js +364 -0
  250. package/dist/loop/tool-detail.d.ts +1 -1
  251. package/dist/loop/tool-detail.js +6 -5
  252. package/dist/loop/tool-outcome.d.ts +1 -1
  253. package/dist/loop/tool-output.d.ts +4 -4
  254. package/dist/loop/tool-output.js +2 -2
  255. package/dist/loop/turn-credentials.d.ts +39 -0
  256. package/dist/loop/turn-credentials.js +90 -0
  257. package/dist/loop/types.d.ts +29 -38
  258. package/dist/loop/types.js +2 -7
  259. package/dist/memory/ai-sdk-message-storage.d.ts +5 -5
  260. package/dist/memory/ai-sdk-message-storage.js +13 -11
  261. package/dist/memory/card-builders.d.ts +14 -14
  262. package/dist/memory/card-builders.js +19 -15
  263. package/dist/memory/conversation-display-recorder.d.ts +22 -4
  264. package/dist/memory/conversation-display-recorder.js +43 -24
  265. package/dist/memory/conversation-display-replay.js +3 -2
  266. package/dist/memory/conversation-display-storage.d.ts +15 -7
  267. package/dist/memory/conversation-display-storage.js +141 -36
  268. package/dist/memory/conversation-view.d.ts +4 -4
  269. package/dist/memory/conversation-view.js +5 -4
  270. package/dist/memory/count-tokens.js +10 -8
  271. package/dist/memory/derive-thread-title.d.ts +0 -13
  272. package/dist/memory/derive-thread-title.js +2 -1
  273. package/dist/memory/message-backfill.d.ts +12 -5
  274. package/dist/memory/message-backfill.js +5 -3
  275. package/dist/memory/thread-history.d.ts +36 -21
  276. package/dist/memory/thread-history.js +78 -54
  277. package/dist/memory/thread-store.d.ts +26 -17
  278. package/dist/memory/thread-store.js +15 -9
  279. package/dist/memory/tool-call-integrity.d.ts +2 -2
  280. package/dist/memory/tool-call-integrity.js +4 -3
  281. package/dist/memory/working-memory.d.ts +16 -12
  282. package/dist/memory/working-memory.js +72 -61
  283. package/dist/prompts/briefing.d.ts +12 -12
  284. package/dist/prompts/briefing.js +1 -1
  285. package/dist/prompts/synthesis-agent.d.ts +1 -1
  286. package/dist/prompts/synthesis-agent.js +6 -14
  287. package/dist/provenance/collector.d.ts +6 -6
  288. package/dist/provenance/collector.js +15 -8
  289. package/dist/provenance/exec-frame.d.ts +2 -2
  290. package/dist/provenance/exec-frame.js +6 -1
  291. package/dist/provenance/seam.d.ts +1 -4
  292. package/dist/provenance/types.d.ts +6 -6
  293. package/dist/providers/ai-sdk.d.ts +113 -62
  294. package/dist/providers/ai-sdk.js +283 -518
  295. package/dist/providers/embedding.d.ts +2 -2
  296. package/dist/providers/embedding.js +1 -1
  297. package/dist/providers/errors.d.ts +22 -2
  298. package/dist/providers/errors.js +98 -50
  299. package/dist/providers/prompt-cache.d.ts +8 -8
  300. package/dist/providers/prompt-cache.js +13 -11
  301. package/dist/providers/reasoning.d.ts +2 -2
  302. package/dist/providers/reasoning.js +2 -2
  303. package/dist/providers/request-headers.js +12 -3
  304. package/dist/providers/types.d.ts +55 -94
  305. package/dist/reference-data/catalog.d.ts +2 -15
  306. package/dist/reference-data/catalog.js +25 -8
  307. package/dist/reference-data/receipt.d.ts +2 -2
  308. package/dist/report-model/assert-rules.js +1 -1
  309. package/dist/report-model/authoring-grammar.d.ts +211 -233
  310. package/dist/report-model/block-walk.d.ts +10 -10
  311. package/dist/report-model/block-walk.js +2 -0
  312. package/dist/report-model/draft-finish.d.ts +8 -8
  313. package/dist/report-model/draft-finish.js +1 -1
  314. package/dist/report-model/draft-hash.js +8 -7
  315. package/dist/report-model/draft-operations.d.ts +22 -10
  316. package/dist/report-model/draft-operations.js +48 -30
  317. package/dist/report-model/draft-read.d.ts +19 -7
  318. package/dist/report-model/draft-read.js +16 -6
  319. package/dist/report-model/draft.d.ts +844 -2
  320. package/dist/report-model/draft.js +3 -1
  321. package/dist/report-model/fixture-resolver.js +39 -16
  322. package/dist/report-model/pin-snapshot.d.ts +2 -2
  323. package/dist/report-model/pin-snapshot.js +15 -15
  324. package/dist/report-model/production-resolver.d.ts +18 -18
  325. package/dist/report-model/production-resolver.js +50 -42
  326. package/dist/report-model/reference-resolver.d.ts +26 -10
  327. package/dist/report-model/reference-resolver.js +68 -5
  328. package/dist/report-model/reference-stamp.js +30 -38
  329. package/dist/report-model/structural-validation.js +12 -4
  330. package/dist/report-model/validate.d.ts +7 -7
  331. package/dist/report-model/validate.js +6 -6
  332. package/dist/report-render/assets.d.ts +2 -2
  333. package/dist/report-render/assets.js +27 -3
  334. package/dist/report-render/chart-export.d.ts +10 -2
  335. package/dist/report-render/chart-export.js +37 -11
  336. package/dist/report-render/chart-presets.d.ts +8 -8
  337. package/dist/report-render/chart-presets.js +3 -3
  338. package/dist/report-render/chart-renderers.d.ts +23 -16
  339. package/dist/report-render/chart-renderers.js +74 -53
  340. package/dist/report-render/chart-toolbox.d.ts +2 -2
  341. package/dist/report-render/chart-toolbox.js +7 -6
  342. package/dist/report-render/chart.d.ts +15 -16
  343. package/dist/report-render/chart.js +369 -252
  344. package/dist/report-render/design.d.ts +36 -297
  345. package/dist/report-render/design.js +0 -12
  346. package/dist/report-render/figures/common.d.ts +12 -12
  347. package/dist/report-render/figures/common.js +42 -31
  348. package/dist/report-render/figures/dendrogram.d.ts +3 -3
  349. package/dist/report-render/figures/dendrogram.js +10 -10
  350. package/dist/report-render/figures/dense.js +15 -8
  351. package/dist/report-render/figures/dotplot.js +46 -33
  352. package/dist/report-render/figures/embedding.js +52 -43
  353. package/dist/report-render/figures/equal-units.d.ts +10 -10
  354. package/dist/report-render/figures/equal-units.js +27 -27
  355. package/dist/report-render/figures/forest.js +9 -7
  356. package/dist/report-render/figures/gsea.js +21 -11
  357. package/dist/report-render/figures/heatmap.js +13 -9
  358. package/dist/report-render/figures/index.d.ts +10 -10
  359. package/dist/report-render/figures/index.js +4 -2
  360. package/dist/report-render/figures/km.js +10 -9
  361. package/dist/report-render/figures/label-room.d.ts +12 -12
  362. package/dist/report-render/figures/label-room.js +7 -2
  363. package/dist/report-render/figures/locuszoom.d.ts +2 -2
  364. package/dist/report-render/figures/locuszoom.js +59 -31
  365. package/dist/report-render/figures/lollipop.js +3 -2
  366. package/dist/report-render/figures/ma.js +8 -4
  367. package/dist/report-render/figures/manhattan.d.ts +1 -2
  368. package/dist/report-render/figures/manhattan.js +52 -34
  369. package/dist/report-render/figures/oncoprint.js +4 -5
  370. package/dist/report-render/figures/pca.js +25 -11
  371. package/dist/report-render/figures/qq.js +20 -9
  372. package/dist/report-render/figures/roc.js +1 -1
  373. package/dist/report-render/figures/sankey.d.ts +2 -2
  374. package/dist/report-render/figures/sankey.js +11 -10
  375. package/dist/report-render/figures/upset.d.ts +6 -6
  376. package/dist/report-render/figures/upset.js +7 -4
  377. package/dist/report-render/figures/volcano.js +12 -10
  378. package/dist/report-render/hybrid-svg.d.ts +4 -4
  379. package/dist/report-render/hybrid-svg.js +7 -5
  380. package/dist/report-render/number-format.d.ts +4 -4
  381. package/dist/report-render/number-format.js +62 -27
  382. package/dist/report-render/page.js +2 -1
  383. package/dist/report-render/provenance-data.d.ts +2 -2
  384. package/dist/report-render/references.d.ts +4 -4
  385. package/dist/report-render/render.d.ts +2 -2
  386. package/dist/report-render/render.js +10 -11
  387. package/dist/report-render/script-json.js +1 -1
  388. package/dist/report-render/table-data.d.ts +6 -6
  389. package/dist/report-render/test/options.d.ts +49 -0
  390. package/dist/report-render/test/options.js +143 -0
  391. package/dist/report-render/test/page-function.d.ts +19 -0
  392. package/dist/report-render/test/page-function.js +33 -0
  393. package/dist/report-render/types.d.ts +10 -10
  394. package/dist/report-render/value-bridge.d.ts +4 -4
  395. package/dist/report-render/value-bridge.js +27 -14
  396. package/dist/report-render/views/chart-view.d.ts +2 -2
  397. package/dist/report-render/views/chart-view.js +2 -2
  398. package/dist/report-render/views/lineage.d.ts +6 -6
  399. package/dist/report-render/views/lineage.js +2 -0
  400. package/dist/report-render/views/page-view.d.ts +2 -2
  401. package/dist/report-render/views/page-view.js +1 -0
  402. package/dist/report-render/views/prose.js +25 -8
  403. package/dist/report-render/views/references-view.js +12 -1
  404. package/dist/report-render/views/values.js +1 -1
  405. package/dist/runtime/assemble.d.ts +53 -26
  406. package/dist/runtime/assemble.js +103 -56
  407. package/dist/runtime/boot.d.ts +8 -7
  408. package/dist/runtime/boot.js +1 -1
  409. package/dist/runtime/connection-budget.d.ts +6 -6
  410. package/dist/runtime/connection-budget.js +1 -1
  411. package/dist/runtime/dbos.d.ts +29 -19
  412. package/dist/runtime/dbos.js +35 -20
  413. package/dist/runtime/result-serialization.js +18 -5
  414. package/dist/runtime/shutdown.d.ts +2 -2
  415. package/dist/sandbox/client.d.ts +7 -3
  416. package/dist/sandbox/cpu-files.d.ts +2 -2
  417. package/dist/sandbox/cpu-files.js +21 -4
  418. package/dist/sandbox/create-sandbox.d.ts +7 -8
  419. package/dist/sandbox/create-sandbox.js +6 -12
  420. package/dist/sandbox/docker-client.d.ts +48 -3
  421. package/dist/sandbox/docker-client.js +10 -6
  422. package/dist/sandbox/estimate-data-profile-resources.js +2 -7
  423. package/dist/sandbox/exec-outcome.d.ts +2 -2
  424. package/dist/sandbox/exec-outcome.js +1 -1
  425. package/dist/sandbox/exec.d.ts +10 -6
  426. package/dist/sandbox/exec.js +27 -12
  427. package/dist/sandbox/execution-id.js +14 -6
  428. package/dist/sandbox/farm.d.ts +2 -2
  429. package/dist/sandbox/farm.js +22 -27
  430. package/dist/sandbox/identity.d.ts +7 -0
  431. package/dist/sandbox/identity.js +14 -3
  432. package/dist/sandbox/image-packages.js +15 -27
  433. package/dist/sandbox/k8s-client.d.ts +35 -8
  434. package/dist/sandbox/k8s-client.js +6 -5
  435. package/dist/sandbox/labels.js +1 -0
  436. package/dist/sandbox/liveness.js +3 -1
  437. package/dist/sandbox/mount-plan.d.ts +10 -10
  438. package/dist/sandbox/mount-plan.js +13 -14
  439. package/dist/sandbox/notification-sweep.d.ts +4 -4
  440. package/dist/sandbox/notification-sweep.js +4 -7
  441. package/dist/sandbox/package-identity.d.ts +6 -13
  442. package/dist/sandbox/package-identity.js +46 -28
  443. package/dist/sandbox/reaper.d.ts +10 -10
  444. package/dist/sandbox/reaper.js +4 -6
  445. package/dist/sandbox/sandbox-error.d.ts +2 -9
  446. package/dist/sandbox/sandbox-error.js +21 -8
  447. package/dist/sandbox/sandbox-step-translate.d.ts +8 -5
  448. package/dist/sandbox/sandbox-step-translate.js +22 -8
  449. package/dist/sandbox/step-sandbox.d.ts +47 -0
  450. package/dist/sandbox/step-sandbox.js +53 -0
  451. package/dist/sandbox/types.d.ts +18 -19
  452. package/dist/sandbox/types.js +1 -1
  453. package/dist/schemas/artifact-manifest.d.ts +4 -4
  454. package/dist/schemas/data-profile-schemas.d.ts +343 -298
  455. package/dist/schemas/file-metadata.js +2 -4
  456. package/dist/schemas/plan-schemas.d.ts +31 -31
  457. package/dist/schemas/run-synthesis.d.ts +95 -26
  458. package/dist/schemas/run-synthesis.js +3 -1
  459. package/dist/schemas/validate-plan.d.ts +4 -4
  460. package/dist/schemas/validate-plan.js +17 -5
  461. package/dist/schemas/workflow-state.d.ts +19 -19
  462. package/dist/schemas/workflow-state.js +2 -2
  463. package/dist/state/active-turns.d.ts +36 -0
  464. package/dist/state/active-turns.js +67 -0
  465. package/dist/state/analyses-metrics.d.ts +8 -8
  466. package/dist/state/analyses-metrics.js +4 -4
  467. package/dist/state/analyses.d.ts +0 -14
  468. package/dist/state/analyses.js +0 -32
  469. package/dist/state/artifacts.d.ts +32 -19
  470. package/dist/state/artifacts.js +28 -5
  471. package/dist/state/data-profile.d.ts +2 -2
  472. package/dist/state/db.d.ts +12 -2
  473. package/dist/state/db.js +5 -0
  474. package/dist/state/edit-intents.d.ts +4 -0
  475. package/dist/state/edit-intents.js +71 -0
  476. package/dist/state/index.d.ts +4 -4
  477. package/dist/state/index.js +2 -2
  478. package/dist/state/init.d.ts +2 -1
  479. package/dist/state/init.js +5 -2
  480. package/dist/state/migrations/20260927120000_baseline.js +3 -1
  481. package/dist/state/migrations/20261026120000_add_the_edit_intents.d.ts +7 -0
  482. package/dist/state/migrations/20261026120000_add_the_edit_intents.js +21 -0
  483. package/dist/state/migrations/20261027120000_record_the_applied_memory_edits.d.ts +7 -0
  484. package/dist/state/migrations/20261027120000_record_the_applied_memory_edits.js +16 -0
  485. package/dist/state/migrations/20261027120100_store_the_authoring_results.d.ts +8 -0
  486. package/dist/state/migrations/20261027120100_store_the_authoring_results.js +20 -0
  487. package/dist/state/migrations/20261027120200_key_the_groups_of_a_turn.d.ts +7 -0
  488. package/dist/state/migrations/20261027120200_key_the_groups_of_a_turn.js +12 -0
  489. package/dist/state/migrations/20261027120300_mark_the_active_turn_of_a_thread.d.ts +7 -0
  490. package/dist/state/migrations/20261027120300_mark_the_active_turn_of_a_thread.js +11 -0
  491. package/dist/state/migrations/20261028120000_record_the_paused_work.d.ts +7 -0
  492. package/dist/state/migrations/20261028120000_record_the_paused_work.js +25 -0
  493. package/dist/state/migrations/20261028120100_end_the_suspended_runs.d.ts +8 -0
  494. package/dist/state/migrations/20261028120100_end_the_suspended_runs.js +13 -0
  495. package/dist/state/migrations/20261029120000_reference_the_run_mandate.d.ts +7 -0
  496. package/dist/state/migrations/20261029120000_reference_the_run_mandate.js +23 -0
  497. package/dist/state/migrations/20261029120100_record_the_run_session_of_a_pause.d.ts +7 -0
  498. package/dist/state/migrations/20261029120100_record_the_run_session_of_a_pause.js +11 -0
  499. package/dist/state/migrations/index.js +18 -0
  500. package/dist/state/paused-work.d.ts +52 -0
  501. package/dist/state/paused-work.js +105 -0
  502. package/dist/state/plans.d.ts +27 -8
  503. package/dist/state/plans.js +14 -11
  504. package/dist/state/purge-analysis.d.ts +6 -6
  505. package/dist/state/purge-analysis.js +10 -2
  506. package/dist/state/report-session-state.d.ts +43 -18
  507. package/dist/state/report-session-state.js +43 -4
  508. package/dist/state/report-versions.d.ts +16 -11
  509. package/dist/state/report-versions.js +5 -3
  510. package/dist/state/runs.d.ts +30 -19
  511. package/dist/state/runs.js +43 -51
  512. package/dist/state/schema.d.ts +18 -21
  513. package/dist/state/schema.js +4 -5
  514. package/dist/state/snapshot-parse.d.ts +2 -2
  515. package/dist/state/snapshot-parse.js +14 -8
  516. package/dist/state/step-executions.d.ts +20 -8
  517. package/dist/state/step-executions.js +6 -4
  518. package/dist/state/tool-outputs.d.ts +2 -2
  519. package/dist/state/tool-outputs.js +2 -1
  520. package/dist/state/vector-store.d.ts +16 -16
  521. package/dist/state/vector-store.js +11 -7
  522. package/dist/tasks/data-profile-absorb.d.ts +3 -3
  523. package/dist/tasks/data-profile-absorb.js +21 -16
  524. package/dist/tasks/data-profile-activity.d.ts +5 -5
  525. package/dist/tasks/data-profile-activity.js +5 -5
  526. package/dist/tasks/data-profile-index.d.ts +4 -4
  527. package/dist/tasks/data-profile-index.js +32 -17
  528. package/dist/tasks/data-profile-resolve.d.ts +8 -8
  529. package/dist/tasks/data-profile-resolve.js +88 -62
  530. package/dist/tasks/data-profile.d.ts +40 -31
  531. package/dist/tasks/data-profile.js +138 -95
  532. package/dist/tasks/extract-values.d.ts +26 -79
  533. package/dist/tasks/extract-values.js +48 -108
  534. package/dist/tasks/refresh-regulatory-corpus.d.ts +4 -20
  535. package/dist/tasks/refresh-regulatory-corpus.js +12 -8
  536. package/dist/tasks/regulatory-corpus-boot-refresh.d.ts +2 -2
  537. package/dist/tasks/regulatory-corpus-boot-refresh.js +12 -10
  538. package/dist/testing.d.ts +62 -0
  539. package/dist/testing.js +101 -0
  540. package/dist/tools/ad-hoc-router.d.ts +9 -9
  541. package/dist/tools/ad-hoc-router.js +65 -52
  542. package/dist/tools/analysis-invocation.d.ts +7 -0
  543. package/dist/tools/analysis-invocation.js +29 -5
  544. package/dist/tools/approval/contract.d.ts +8 -52
  545. package/dist/tools/approval/contract.js +7 -36
  546. package/dist/tools/approval/gateway.d.ts +27 -28
  547. package/dist/tools/approval/gateway.js +33 -130
  548. package/dist/tools/approval/queries.d.ts +6 -11
  549. package/dist/tools/approval/queries.js +43 -29
  550. package/dist/tools/approval/uuidv7.js +2 -2
  551. package/dist/tools/bio/chembl.d.ts +3 -3
  552. package/dist/tools/bio/chembl.js +10 -0
  553. package/dist/tools/bio/comptox.d.ts +25 -8
  554. package/dist/tools/bio/comptox.js +4 -2
  555. package/dist/tools/bio/drug-gene-interactions.d.ts +27 -17
  556. package/dist/tools/bio/drug-gene-interactions.js +11 -8
  557. package/dist/tools/bio/gene-disease-evidence.d.ts +61 -15
  558. package/dist/tools/bio/gene-disease-evidence.js +10 -6
  559. package/dist/tools/bio/gene-preclinical-profile.d.ts +11 -11
  560. package/dist/tools/bio/keys.d.ts +2 -2
  561. package/dist/tools/bio/keys.js +3 -3
  562. package/dist/tools/bio/lookup-annotation.d.ts +5 -5
  563. package/dist/tools/bio/lookup-annotation.js +3 -0
  564. package/dist/tools/bio/opentargets.d.ts +1 -1
  565. package/dist/tools/bio/opentargets.js +6 -0
  566. package/dist/tools/bio/pubchem.d.ts +2 -2
  567. package/dist/tools/bio/pubchem.js +6 -0
  568. package/dist/tools/bio/pubmed.d.ts +26 -16
  569. package/dist/tools/bio/pubmed.js +9 -3
  570. package/dist/tools/bio/search-clinical-trials.d.ts +4 -4
  571. package/dist/tools/bio/search-clinical-trials.js +5 -1
  572. package/dist/tools/bio/search-faers.d.ts +2 -2
  573. package/dist/tools/bio/search-faers.js +1 -1
  574. package/dist/tools/bio/search-gene.d.ts +2 -2
  575. package/dist/tools/bio/search-gene.js +1 -0
  576. package/dist/tools/bio/search-geo-datasets.d.ts +4 -4
  577. package/dist/tools/bio/search-geo-datasets.js +5 -5
  578. package/dist/tools/bio/search-interactions.d.ts +1 -1
  579. package/dist/tools/bio/search-patents.d.ts +28 -22
  580. package/dist/tools/bio/search-patents.js +20 -17
  581. package/dist/tools/bio/search-protein.d.ts +2 -2
  582. package/dist/tools/bio/search-protein.js +1 -1
  583. package/dist/tools/bio/search-regulatory-approvals.d.ts +64 -18
  584. package/dist/tools/bio/search-regulatory-approvals.js +21 -16
  585. package/dist/tools/bio/target-safety.d.ts +8 -8
  586. package/dist/tools/bio/target-safety.js +11 -6
  587. package/dist/tools/capability-data.d.ts +9 -5
  588. package/dist/tools/capability-data.js +2 -1
  589. package/dist/tools/define-tool.d.ts +55 -46
  590. package/dist/tools/define-tool.js +39 -27
  591. package/dist/tools/display/normalize-echart-spec.d.ts +2 -2
  592. package/dist/tools/display/normalize-echart-spec.js +51 -27
  593. package/dist/tools/display/show-user.d.ts +2 -2
  594. package/dist/tools/display/show-user.js +1 -1
  595. package/dist/tools/execute-analysis.d.ts +19 -10
  596. package/dist/tools/execute-analysis.js +83 -62
  597. package/dist/tools/knowledge/check.d.ts +166 -44
  598. package/dist/tools/knowledge/check.js +5 -3
  599. package/dist/tools/knowledge/client.d.ts +31 -62
  600. package/dist/tools/knowledge/client.js +44 -27
  601. package/dist/tools/knowledge/environment.d.ts +6 -6
  602. package/dist/tools/knowledge/environment.js +18 -7
  603. package/dist/tools/knowledge/index.d.ts +2 -2
  604. package/dist/tools/knowledge/index.js +9 -9
  605. package/dist/tools/knowledge/local-slots.d.ts +4 -4
  606. package/dist/tools/knowledge/local-slots.js +11 -4
  607. package/dist/tools/knowledge/pin.d.ts +2 -2
  608. package/dist/tools/knowledge/recommend.d.ts +20 -45
  609. package/dist/tools/knowledge/recommend.js +27 -19
  610. package/dist/tools/knowledge/situation.d.ts +40 -40
  611. package/dist/tools/knowledge/situation.js +2 -9
  612. package/dist/tools/knowledge/skeleton.d.ts +4 -4
  613. package/dist/tools/knowledge/skeleton.js +10 -11
  614. package/dist/tools/knowledge/template.d.ts +20 -18
  615. package/dist/tools/knowledge/template.js +38 -32
  616. package/dist/tools/lib/alphafold-client.js +2 -1
  617. package/dist/tools/lib/amass-client.d.ts +28 -28
  618. package/dist/tools/lib/amass-client.js +20 -10
  619. package/dist/tools/lib/api-utils.d.ts +13 -3
  620. package/dist/tools/lib/api-utils.js +17 -3
  621. package/dist/tools/lib/bgee-client.d.ts +6 -6
  622. package/dist/tools/lib/bgee-client.js +16 -10
  623. package/dist/tools/lib/cbioportal-client.d.ts +4 -4
  624. package/dist/tools/lib/cbioportal-client.js +9 -8
  625. package/dist/tools/lib/chembl-client.d.ts +14 -14
  626. package/dist/tools/lib/chembl-client.js +11 -4
  627. package/dist/tools/lib/clinical-benchmarks-client.d.ts +4 -4
  628. package/dist/tools/lib/clinical-benchmarks-client.js +4 -7
  629. package/dist/tools/lib/clinical-trials-client.d.ts +18 -18
  630. package/dist/tools/lib/clinical-trials-client.js +10 -10
  631. package/dist/tools/lib/clinvar-client.d.ts +2 -2
  632. package/dist/tools/lib/clinvar-client.js +6 -6
  633. package/dist/tools/lib/ctx-ops.d.ts +23 -23
  634. package/dist/tools/lib/ctx-ops.js +13 -10
  635. package/dist/tools/lib/dgidb-client.d.ts +6 -6
  636. package/dist/tools/lib/dgidb-client.js +10 -12
  637. package/dist/tools/lib/disgenet-client.d.ts +4 -4
  638. package/dist/tools/lib/ema-client.d.ts +2 -2
  639. package/dist/tools/lib/ensembl-client.d.ts +4 -4
  640. package/dist/tools/lib/ensembl-client.js +5 -4
  641. package/dist/tools/lib/gwas-catalog-client.d.ts +4 -4
  642. package/dist/tools/lib/gwas-catalog-client.js +17 -17
  643. package/dist/tools/lib/html-text.d.ts +6 -0
  644. package/dist/tools/lib/html-text.js +9 -0
  645. package/dist/tools/lib/identifier-resolver.d.ts +4 -4
  646. package/dist/tools/lib/identifier-resolver.js +7 -3
  647. package/dist/tools/lib/impc-client.d.ts +8 -8
  648. package/dist/tools/lib/impc-client.js +46 -35
  649. package/dist/tools/lib/iuphar-client.d.ts +2 -2
  650. package/dist/tools/lib/iuphar-client.js +7 -16
  651. package/dist/tools/lib/monarch-client.d.ts +4 -4
  652. package/dist/tools/lib/openfda-client.d.ts +22 -22
  653. package/dist/tools/lib/openfda-client.js +23 -22
  654. package/dist/tools/lib/opentargets-client.d.ts +12 -12
  655. package/dist/tools/lib/pathway-client.d.ts +4 -4
  656. package/dist/tools/lib/pathway-client.js +15 -19
  657. package/dist/tools/lib/pharmgkb-client.d.ts +2 -2
  658. package/dist/tools/lib/pharmgkb-client.js +1 -1
  659. package/dist/tools/lib/protein-family-modality.d.ts +2 -2
  660. package/dist/tools/lib/protein-family-modality.js +0 -2
  661. package/dist/tools/lib/protein-family-normalize.js +7 -0
  662. package/dist/tools/lib/pubchem-client.d.ts +2 -2
  663. package/dist/tools/lib/pubchem-client.js +1 -0
  664. package/dist/tools/lib/pubchem-ops.d.ts +4 -4
  665. package/dist/tools/lib/pubchem-ops.js +8 -0
  666. package/dist/tools/lib/pubmed-client.d.ts +9 -9
  667. package/dist/tools/lib/pubmed-client.js +1 -1
  668. package/dist/tools/lib/string-client.d.ts +6 -6
  669. package/dist/tools/lib/uniprot-client.d.ts +8 -8
  670. package/dist/tools/lib/uniprot-client.js +5 -1
  671. package/dist/tools/memory/update-working-memory.d.ts +16 -13
  672. package/dist/tools/memory/update-working-memory.js +21 -3
  673. package/dist/tools/read-tool-output.js +8 -2
  674. package/dist/tools/registry.d.ts +2 -2
  675. package/dist/tools/report-authoring/authoring-tools.d.ts +54 -23
  676. package/dist/tools/report-authoring/authoring-tools.js +128 -62
  677. package/dist/tools/report-session/derive-table.d.ts +19 -59
  678. package/dist/tools/report-session/derive-table.js +120 -122
  679. package/dist/tools/report-session/examine-page.d.ts +6 -6
  680. package/dist/tools/report-session/examine-page.js +14 -12
  681. package/dist/tools/report-session/list-artifacts.d.ts +6 -6
  682. package/dist/tools/report-session/list-artifacts.js +5 -5
  683. package/dist/tools/report-session/page-faults.d.ts +6 -6
  684. package/dist/tools/report-session/page-faults.js +3 -1
  685. package/dist/tools/report-session/preview-report.d.ts +4 -3
  686. package/dist/tools/report-session/preview-report.js +26 -7
  687. package/dist/tools/report-session/record-version.d.ts +9 -4
  688. package/dist/tools/report-session/record-version.js +16 -9
  689. package/dist/tools/report-session/session-page-publisher.d.ts +6 -6
  690. package/dist/tools/research/generate-analogy-report.d.ts +14 -7
  691. package/dist/tools/research/generate-analogy-report.js +80 -76
  692. package/dist/tools/research/generate-plan.d.ts +16 -16
  693. package/dist/tools/research/generate-plan.js +410 -374
  694. package/dist/tools/research/guarded-address.js +3 -2
  695. package/dist/tools/research/inspect-data-profile.d.ts +27 -20
  696. package/dist/tools/research/inspect-data-profile.js +26 -25
  697. package/dist/tools/research/inspect-run.d.ts +54 -27
  698. package/dist/tools/research/inspect-run.js +50 -40
  699. package/dist/tools/research/literature-reviewer.d.ts +8 -7
  700. package/dist/tools/research/literature-reviewer.js +29 -28
  701. package/dist/tools/research/search-arxiv.d.ts +1 -1
  702. package/dist/tools/research/search-arxiv.js +1 -1
  703. package/dist/tools/research/search-github-repos.d.ts +10 -7
  704. package/dist/tools/research/search-github-repos.js +25 -22
  705. package/dist/tools/research/search-semantic-scholar.js +1 -1
  706. package/dist/tools/research/searxng-engine.d.ts +2 -2
  707. package/dist/tools/research/searxng-engine.js +6 -4
  708. package/dist/tools/research/web-fetch.d.ts +24 -21
  709. package/dist/tools/research/web-fetch.js +65 -74
  710. package/dist/tools/research/web-search.d.ts +26 -17
  711. package/dist/tools/research/web-search.js +26 -21
  712. package/dist/tools/sandbox/link-packages.d.ts +11 -7
  713. package/dist/tools/sandbox/link-packages.js +11 -8
  714. package/dist/tools/sandbox/list-available-packages.d.ts +17 -8
  715. package/dist/tools/sandbox/list-available-packages.js +31 -25
  716. package/dist/tools/sandbox/list-available-refs.d.ts +17 -14
  717. package/dist/tools/sandbox/list-available-refs.js +61 -36
  718. package/dist/tools/sandbox/report-blocker.d.ts +30 -37
  719. package/dist/tools/sandbox/report-blocker.js +23 -73
  720. package/dist/tools/sandbox/skills.d.ts +16 -12
  721. package/dist/tools/sandbox/skills.js +16 -12
  722. package/dist/tools/sandbox/submit-file-metadata.d.ts +12 -9
  723. package/dist/tools/sandbox/submit-file-metadata.js +18 -21
  724. package/dist/tools/start-report-session.d.ts +13 -5
  725. package/dist/tools/start-report-session.js +35 -8
  726. package/dist/tools/terminal-text.d.ts +5 -2
  727. package/dist/tools/terminal-text.js +35 -3
  728. package/dist/tools/workspace/decision-record.d.ts +4 -4
  729. package/dist/tools/workspace/decision-record.js +23 -13
  730. package/dist/tools/workspace/edit-file.d.ts +59 -20
  731. package/dist/tools/workspace/edit-file.js +81 -16
  732. package/dist/tools/workspace/execute-command.d.ts +15 -13
  733. package/dist/tools/workspace/execute-command.js +11 -9
  734. package/dist/tools/workspace/file-stat.d.ts +6 -3
  735. package/dist/tools/workspace/grep.d.ts +10 -7
  736. package/dist/tools/workspace/grep.js +9 -3
  737. package/dist/tools/workspace/list-files.d.ts +6 -3
  738. package/dist/tools/workspace/mutator.d.ts +28 -15
  739. package/dist/tools/workspace/mutator.js +107 -53
  740. package/dist/tools/workspace/read-file.d.ts +8 -5
  741. package/dist/tools/workspace/result-bounds.d.ts +5 -5
  742. package/dist/tools/workspace/result-bounds.js +4 -2
  743. package/dist/tools/workspace/run-exec.d.ts +2 -2
  744. package/dist/tools/workspace/run-exec.js +3 -3
  745. package/dist/tools/workspace/scan-inputs.d.ts +8 -5
  746. package/dist/tools/workspace/scan-inputs.js +17 -5
  747. package/dist/tools/workspace/show-file.d.ts +1 -1
  748. package/dist/tools/workspace/show-file.js +2 -1
  749. package/dist/tools/workspace/show-plan.d.ts +8 -5
  750. package/dist/tools/workspace/show-plan.js +9 -8
  751. package/dist/tools/workspace/workspace-search.d.ts +41 -13
  752. package/dist/tools/workspace/workspace-search.js +27 -14
  753. package/dist/tools/workspace/write-file.d.ts +9 -7
  754. package/dist/workflows/execute-analysis-scheduler.d.ts +9 -9
  755. package/dist/workflows/execute-analysis-scheduler.js +6 -3
  756. package/dist/workflows/execute-analysis.d.ts +46 -62
  757. package/dist/workflows/execute-analysis.js +137 -219
  758. package/dist/workflows/pause.d.ts +71 -0
  759. package/dist/workflows/pause.js +173 -0
  760. package/dist/workflows/sandbox-step.d.ts +38 -61
  761. package/dist/workflows/sandbox-step.js +99 -106
  762. package/dist/workflows/test/sql-writes.d.ts +21 -0
  763. package/dist/workflows/test/sql-writes.js +36 -0
  764. package/dist/workspace/filesystem.d.ts +6 -6
  765. package/dist/workspace/filesystem.js +10 -8
  766. package/dist/workspace/paths.d.ts +1 -1
  767. package/dist/workspace/paths.js +15 -4
  768. package/dist/workspace/search-config.d.ts +2 -2
  769. package/dist/workspace/search-config.js +1 -1
  770. package/package.json +21 -22
  771. package/dist/loop/call-guard.d.ts +0 -50
  772. package/dist/loop/call-guard.js +0 -90
  773. package/dist/loop/continue-agent.d.ts +0 -40
  774. package/dist/loop/continue-agent.js +0 -38
  775. package/dist/loop/genai-spans.d.ts +0 -47
  776. package/dist/loop/genai-spans.js +0 -134
  777. package/dist/loop/run-agent.d.ts +0 -245
  778. package/dist/loop/run-agent.js +0 -1124
  779. package/dist/loop/run-step.d.ts +0 -29
  780. package/dist/loop/run-step.js +0 -34
  781. package/dist/loop/run-to-terminal.d.ts +0 -66
  782. package/dist/loop/run-to-terminal.js +0 -93
  783. package/dist/loop/tool-mask.d.ts +0 -23
  784. package/dist/loop/tool-mask.js +0 -46
  785. package/dist/providers/streaming-chat.d.ts +0 -32
  786. package/dist/providers/streaming-chat.js +0 -91
  787. package/dist/tasks/derive-table-exec.d.ts +0 -54
  788. package/dist/tasks/derive-table-exec.js +0 -86
  789. package/dist/workflows/suspension.d.ts +0 -32
  790. package/dist/workflows/suspension.js +0 -38
@@ -0,0 +1,237 @@
1
+ /**
2
+ * The durable stream of a chat turn, and of each sub-agent of the turn.
3
+ *
4
+ * The turn writes to the stream of its workflow with the writer of
5
+ * `@dbos-inc/vercel-ai`: each model call writes its text from inside its step,
6
+ * and the harness writes each of its own frames as one `data-harness-frame`
7
+ * chunk. The reader converts the chunks to the `ChatFrame`s that a host gives
8
+ * its client. A model record also holds the input of each tool call, and the
9
+ * converter drops it, thus a client gets the frames of an in-process turn.
10
+ */
11
+ import { setTimeout as sleep } from "node:timers/promises";
12
+ import { DBOS } from "@dbos-inc/dbos-sdk";
13
+ import { functionIDGetIncrement, getCurrentContextStore } from "@dbos-inc/dbos-sdk/internal/context";
14
+ import { readDurableStream, toolWriter, writeDurableStream } from "@dbos-inc/vercel-ai";
15
+ import { z } from "zod";
16
+ import { checkChatPart, isRootFrame, toChatFrame } from "../contracts/chat-frame.js";
17
+ import { isKnownPartType, PART_REGISTRY } from "../contracts/part-registry.js";
18
+ import { ChatEventSchema } from "../contracts/schemas/chat-events.js";
19
+ /** The key of the durable stream of a chat turn. */
20
+ export const CHAT_STREAM_KEY = "chat";
21
+ /** The data part that names the child workflow of a sub-agent call in the stream of its caller. */
22
+ export const SUB_AGENT_STREAM_PART = "data-subagent-stream";
23
+ const SubAgentStreamFrameSchema = z.object({ type: z.literal(SUB_AGENT_STREAM_PART), workflowId: z.string() });
24
+ const HARNESS_FRAME_CHUNK = "data-harness-frame";
25
+ /** The source of a frame that comes before the first frame of the harness. A turn writes no such frame. */
26
+ const UNKNOWN_SOURCE = { agentId: "", callPath: [] };
27
+ const HarnessFrameChunkSchema = z.object({
28
+ type: z.literal(HARNESS_FRAME_CHUNK),
29
+ data: z.looseObject({ type: z.string() }),
30
+ });
31
+ /** The chunk that carries one frame of the harness in the stream of a turn. A transient chunk is live only. */
32
+ export function chunkOfFrame(frame, transient = false) {
33
+ return transient ? { type: HARNESS_FRAME_CHUNK, data: frame, transient: true } : { type: HARNESS_FRAME_CHUNK, data: frame };
34
+ }
35
+ /**
36
+ * Whether a frame from a tool step shows progress only. The library gives such a frame live, and a replay of the
37
+ * step does not give it again. Each other frame of a tool step is checkpointed with the step, and the display of a
38
+ * round that a recovery stores keeps it: the end of each call, and each part of the root agent.
39
+ */
40
+ function isProgressFrame(frame) {
41
+ if (!isRootFrame(frame) || frame.type === "tool-started" || frame.type === "iteration")
42
+ return true;
43
+ return isKnownPartType(frame.type) && PART_REGISTRY[frame.type].transient;
44
+ }
45
+ /**
46
+ * Run each body write of one workflow after the body write before it ends.
47
+ *
48
+ * DBOS gives a stream write its offset inside the insert, thus two writes in flight take the same offset, and the
49
+ * write that loses sleeps 100 ms before it tries again. A body write must still take its function id at the call,
50
+ * because a replay finds each checkpoint by the order of the calls. Thus the call reserves its id now, and the
51
+ * chained write takes the reserved id from the context of the workflow when it starts.
52
+ */
53
+ function chainBodyWrites() {
54
+ let tail = Promise.resolve();
55
+ return (start) => {
56
+ const ctx = getCurrentContextStore();
57
+ if (ctx === undefined || !DBOS.isInWorkflow() || DBOS.isInStep())
58
+ return start();
59
+ const reserved = functionIDGetIncrement();
60
+ const run = () => {
61
+ // A continuation keeps the async context of its call, thus DBOS reads the id from this same context.
62
+ if (getCurrentContextStore() !== ctx)
63
+ throw new Error("A chained stream write lost the context of its workflow.");
64
+ const next = ctx.curWFFunctionId;
65
+ ctx.curWFFunctionId = reserved;
66
+ try {
67
+ // DBOS takes the function id before its first await, thus the swap ends before any other call can read it.
68
+ return start();
69
+ }
70
+ finally {
71
+ ctx.curWFFunctionId = next;
72
+ }
73
+ };
74
+ const write = tail.then(run, run);
75
+ tail = write.then(() => undefined, () => undefined);
76
+ return write;
77
+ };
78
+ }
79
+ /**
80
+ * The writer of the stream of a turn workflow. `observe` gets each frame of the turn that goes to the stream: the
81
+ * frames of the body, and the frames of each tool step, the frames that a replay of a step gives again included.
82
+ *
83
+ * From the body a write is checkpointed, thus a replay writes nothing again. From a step a write is at-least-once,
84
+ * and a fold of the frames by the id of a tool call or a part makes a second copy harmless.
85
+ */
86
+ export function createTurnStreamWriter(rootSource, observe) {
87
+ const pending = [];
88
+ const chained = chainBodyWrites();
89
+ const track = (write) => {
90
+ // Observed now, thus a failure before the settle is not an unhandled rejection. The settle still sees it.
91
+ write.catch(() => undefined);
92
+ pending.push(write);
93
+ };
94
+ const writer = {
95
+ write(chunk) {
96
+ const frame = harnessFrameOf(chunk);
97
+ if (frame !== undefined)
98
+ observe(frame);
99
+ track(chained(() => writeDurableStream(CHAT_STREAM_KEY, [chunk])));
100
+ },
101
+ merge(stream) {
102
+ track((async () => {
103
+ for await (const chunk of stream)
104
+ writer.write(chunk);
105
+ })());
106
+ },
107
+ onError: undefined,
108
+ };
109
+ const write = async (frame) => {
110
+ observe(frame);
111
+ await chained(() => writeDurableStream(CHAT_STREAM_KEY, [chunkOfFrame(frame)]));
112
+ };
113
+ const emit = async (event) => {
114
+ const frame = toChatFrame(event, rootSource);
115
+ if (frame === null)
116
+ return;
117
+ // A tool step gives its frames to the library, which checkpoints each one that is not progress.
118
+ if (DBOS.isInStep()) {
119
+ toolWriter().write(chunkOfFrame(frame, isProgressFrame(frame)));
120
+ return;
121
+ }
122
+ await write(frame);
123
+ };
124
+ return {
125
+ emit,
126
+ toolWriter: writer,
127
+ write,
128
+ async settle() {
129
+ while (pending.length > 0)
130
+ await Promise.all(pending.splice(0));
131
+ },
132
+ };
133
+ }
134
+ /** The frame that one harness chunk carries, checked as a frame from outside the process. */
135
+ function harnessFrameOf(chunk) {
136
+ const carried = HarnessFrameChunkSchema.safeParse(chunk);
137
+ if (!carried.success)
138
+ return undefined;
139
+ if (carried.data.data.type.startsWith("data-")) {
140
+ const part = checkChatPart(carried.data.data);
141
+ return part.ok ? part.frame : undefined;
142
+ }
143
+ const event = ChatEventSchema.safeParse(carried.data.data);
144
+ return event.success ? event.data : undefined;
145
+ }
146
+ /**
147
+ * The frames of one chunk of the stream. The text of a model call is the text of the root agent, because a
148
+ * sub-agent writes to the stream of its own workflow. The end chunks of the library carry no fact of the turn,
149
+ * except the error and the abort of a workflow that ended before the turn wrote its own end.
150
+ */
151
+ export function framesOfChunk(chunk, rootSource) {
152
+ switch (chunk.type) {
153
+ case "text-delta":
154
+ return chunk.delta.length === 0 ? [] : [{ type: "text-delta", text: chunk.delta, source: rootSource }];
155
+ case "error":
156
+ return [{ type: "error", message: chunk.errorText, source: rootSource }];
157
+ case "abort":
158
+ return [{ type: "finish", source: rootSource }];
159
+ default: {
160
+ const frame = harnessFrameOf(chunk);
161
+ return frame === undefined ? [] : [frame];
162
+ }
163
+ }
164
+ }
165
+ /** How long a read waits for a child workflow that its caller named, and the interval of each look. */
166
+ const CHILD_START_WAIT_MS = 10_000;
167
+ const CHILD_START_POLL_MS = 50;
168
+ /**
169
+ * The chunks of the stream of a sub-agent child. The caller names the child in the same tick as it starts the child,
170
+ * thus the name can arrive before the child exists, and a read of a stream of no workflow fails. A child that never
171
+ * starts fails the tool call of its caller, and the result of that call tells it.
172
+ */
173
+ async function* childChunks(workflowID, client) {
174
+ const source = client ?? DBOS;
175
+ const deadline = Date.now() + CHILD_START_WAIT_MS;
176
+ while ((await source.retrieveWorkflow(workflowID).getStatus()) === null) {
177
+ if (Date.now() > deadline)
178
+ return;
179
+ await sleep(CHILD_START_POLL_MS);
180
+ }
181
+ yield* readDurableStream({ workflowID, key: CHAT_STREAM_KEY, client, sendReasoning: false });
182
+ }
183
+ /**
184
+ * Read the frames of a turn from its start, live, until the turn ends. A second read gives the same frames.
185
+ *
186
+ * The read merges the stream of each sub-agent child that the turn names, in the order of arrival. A child stream
187
+ * gives only the frames of the harness: the child ends before its caller continues, and the result of its tool call
188
+ * tells its outcome. The end frame of the turn comes last.
189
+ */
190
+ export async function* readChatTurn(turnId, options) {
191
+ const readers = [];
192
+ const reads = new Map();
193
+ const pull = (reader) => {
194
+ reads.set(reader, reader.next().then((next) => ({ reader, next })));
195
+ };
196
+ const open = (chunks) => {
197
+ const reader = chunks[Symbol.asyncIterator]();
198
+ readers.push(reader);
199
+ pull(reader);
200
+ return reader;
201
+ };
202
+ const root = open(readDurableStream({ workflowID: turnId, key: CHAT_STREAM_KEY, client: options.client, sendReasoning: false }));
203
+ let rootSource = options.rootSource;
204
+ const ends = [];
205
+ try {
206
+ while (reads.size > 0) {
207
+ const { reader, next } = await Promise.race(reads.values());
208
+ if (next.done === true) {
209
+ reads.delete(reader);
210
+ continue;
211
+ }
212
+ pull(reader);
213
+ const frame = harnessFrameOf(next.value);
214
+ const child = SubAgentStreamFrameSchema.safeParse(frame);
215
+ if (child.success) {
216
+ open(childChunks(child.data.workflowId, options.client));
217
+ continue;
218
+ }
219
+ if (reader !== root) {
220
+ if (frame !== undefined)
221
+ yield frame;
222
+ continue;
223
+ }
224
+ rootSource ??= frame?.source;
225
+ for (const rootFrame of framesOfChunk(next.value, rootSource ?? UNKNOWN_SOURCE)) {
226
+ if (rootFrame.type === "finish" || rootFrame.type === "error")
227
+ ends.push(rootFrame);
228
+ else
229
+ yield rootFrame;
230
+ }
231
+ }
232
+ yield* ends;
233
+ }
234
+ finally {
235
+ await Promise.all(readers.map(async (reader) => await reader.return?.()));
236
+ }
237
+ }
@@ -1,24 +1,24 @@
1
- import type { AgentChat } from "../providers/types.js";
2
- import type { ToolMask } from "./tool-mask.js";
1
+ import type { ToolMask } from "./call-policy.js";
3
2
  import type { LoopMessage } from "./types.js";
4
3
  /** The cap of requests of one compaction exchange: up to 3 rounds of memory edits, and then the summary. */
5
4
  export declare const COMPACTION_MAX_REQUESTS = 4;
6
5
  /** When an agent compacts its conversation, in the input tokens that the provider reported for the last request. */
7
- export interface CompactionRules {
6
+ export type CompactionRules = {
8
7
  /** The budget before each request of a turn. */
9
8
  readonly budget: number;
10
9
  /** The budget before the user message of a turn joins the conversation. Absent: no compaction before the user message. */
11
10
  readonly turnStartBudget?: number;
12
- }
11
+ };
13
12
  /**
14
13
  * The rules of an agent for a model with `contextWindow`. The budget is the smaller of the declared budget and 80% of
15
14
  * the window. The turn-start budget keeps its ratio to the budget. An absent window keeps the declared rules.
16
15
  */
17
16
  export declare function rulesForContextWindow(rules: CompactionRules, contextWindow: number | undefined): CompactionRules;
18
- /** How the loop compacts its conversation when the last request passed a budget. */
19
- export interface CompactionPolicy extends CompactionRules {
20
- /** The provider of the conversation, with no text stream to the surface: the summary is no reply. */
21
- readonly provider: AgentChat;
17
+ /**
18
+ * How the loop compacts its conversation when the last request passed a budget. The exchange streams no
19
+ * text to the surface, because the summary is no reply.
20
+ */
21
+ export type CompactionPolicy = CompactionRules & {
22
22
  /** The text of the compaction request. */
23
23
  readonly request: string;
24
24
  /** The tools that can run in the exchange. */
@@ -27,4 +27,4 @@ export interface CompactionPolicy extends CompactionRules {
27
27
  readonly keepFirstTurn: boolean;
28
28
  /** The context records that come after a new marker, for the view that starts at the marker. */
29
29
  readonly recordsAfter: (view: readonly LoopMessage[]) => Promise<readonly LoopMessage[]>;
30
- }
30
+ };
@@ -14,6 +14,6 @@ export function rulesForContextWindow(rules, contextWindow) {
14
14
  return rules;
15
15
  return {
16
16
  budget,
17
- ...(rules.turnStartBudget === undefined ? {} : { turnStartBudget: Math.floor((rules.turnStartBudget * budget) / rules.budget) }),
17
+ turnStartBudget: rules.turnStartBudget === undefined ? undefined : Math.floor((rules.turnStartBudget * budget) / rules.budget),
18
18
  };
19
19
  }
@@ -12,11 +12,11 @@
12
12
  * agree on whether `outputTokens` includes the reasoning tokens, so the
13
13
  * reasoning counter keeps a `provider` label.
14
14
  *
15
- * Each `runAgent` completion also records, with the `agent_id` label only:
16
- * - cortex.harness.agent.iterations — histogram of LLM iterations per run.
15
+ * Each run of the loop also records, with the `agent_id` label only:
16
+ * - cortex.harness.agent.iterations — histogram of model requests per run.
17
17
  * A creeping distribution is a leading indicator of prompt drift.
18
18
  * - cortex.harness.agent.cap_hits — counter, incremented once per run that
19
- * exhausted `maxIterations` and took the forced wrap-up path.
19
+ * reached its step cap.
20
20
  *
21
21
  * The two cache counters are what make prompt caching *observable*: the hit
22
22
  * rate for an agent type is `cache_read_tokens / input_tokens` (the harness's
@@ -33,19 +33,19 @@
33
33
  * exporter from `harness/lib/otel.ts`; tests: an in-memory reader).
34
34
  */
35
35
  import { type TokenUsageRollup } from "../contracts/usage.js";
36
- import type { ChatResponse, ChatUsage } from "../providers/types.js";
36
+ import type { ChatUsage } from "../providers/types.js";
37
37
  /**
38
- * Token usage summed over LLM calls, either one `runAgent` run or a whole
38
+ * Token usage summed over LLM calls, either one run of the loop or a whole
39
39
  * turn. A field stays `undefined` until a call reports it, so an unreported
40
40
  * field never masquerades as a measured zero.
41
41
  */
42
- export interface AgentRunUsage {
42
+ export type AgentRunUsage = {
43
43
  inputTokens?: number;
44
44
  outputTokens?: number;
45
45
  cacheCreationInputTokens?: number;
46
46
  cacheReadInputTokens?: number;
47
47
  reasoningTokens?: number;
48
- }
48
+ };
49
49
  /** Fold one call's reported usage into a run's running total. */
50
50
  export declare function addChatUsage(total: AgentRunUsage, usage: ChatUsage | undefined): void;
51
51
  /**
@@ -59,17 +59,14 @@ export declare function addChatUsage(total: AgentRunUsage, usage: ChatUsage | un
59
59
  * at either end is how the two would come to disagree.
60
60
  */
61
61
  export declare function hasReportedUsage(usage: AgentRunUsage | ChatUsage | TokenUsageRollup | undefined): boolean;
62
- /**
63
- * Maps a step's response to grow its token counters. Use inside the step
64
- * body, `provider.chat(...).map(countChatTokens(agentId))`. A call that gives
65
- * `err` counts nothing.
66
- */
67
- export declare function countChatTokens(agentId: string): (response: ChatResponse) => ChatResponse;
62
+ /** Grow the token counters by one completed call. A figure that the provider did not report counts nothing. */
68
63
  export declare function recordChatCall(call: {
69
64
  readonly agentId: string;
70
- readonly response: ChatResponse;
65
+ readonly usage: ChatUsage;
66
+ readonly servedModelId?: string;
67
+ readonly provider?: string;
71
68
  }): void;
72
- /** Record one completed `runAgent` invocation. */
69
+ /** Record one completed run of the loop. */
73
70
  export declare function recordAgentRun(run: {
74
71
  readonly agentId: string;
75
72
  readonly iterations: number;
@@ -12,11 +12,11 @@
12
12
  * agree on whether `outputTokens` includes the reasoning tokens, so the
13
13
  * reasoning counter keeps a `provider` label.
14
14
  *
15
- * Each `runAgent` completion also records, with the `agent_id` label only:
16
- * - cortex.harness.agent.iterations — histogram of LLM iterations per run.
15
+ * Each run of the loop also records, with the `agent_id` label only:
16
+ * - cortex.harness.agent.iterations — histogram of model requests per run.
17
17
  * A creeping distribution is a leading indicator of prompt drift.
18
18
  * - cortex.harness.agent.cap_hits — counter, incremented once per run that
19
- * exhausted `maxIterations` and took the forced wrap-up path.
19
+ * reached its step cap.
20
20
  *
21
21
  * The two cache counters are what make prompt caching *observable*: the hit
22
22
  * rate for an agent type is `cache_read_tokens / input_tokens` (the harness's
@@ -40,11 +40,11 @@ function getInstruments() {
40
40
  const meter = metrics.getMeter("cortex.harness.loop");
41
41
  instruments = {
42
42
  iterations: meter.createHistogram("cortex.harness.agent.iterations", {
43
- description: "LLM iterations executed per runAgent completion",
43
+ description: "Model requests of each run of the agent loop",
44
44
  unit: "{iteration}",
45
45
  }),
46
46
  capHits: meter.createCounter("cortex.harness.agent.cap_hits", {
47
- description: "runAgent completions that exhausted maxIterations and took the " + "forced wrap-up path",
47
+ description: "Runs of the agent loop that reached their step cap",
48
48
  }),
49
49
  inputTokens: meter.createCounter("cortex.harness.agent.input_tokens", {
50
50
  description: "Input tokens billed for each completed LLM call, cache reads included",
@@ -94,29 +94,17 @@ export function addChatUsage(total, usage) {
94
94
  export function hasReportedUsage(usage) {
95
95
  if (usage === undefined)
96
96
  return false;
97
- return Object.values(usage).some((value) => value !== undefined);
98
- }
99
- /**
100
- * Maps a step's response to grow its token counters. Use inside the step
101
- * body, `provider.chat(...).map(countChatTokens(agentId))`. A call that gives
102
- * `err` counts nothing.
103
- */
104
- export function countChatTokens(agentId) {
105
- return (response) => {
106
- recordChatCall({ agentId, response });
107
- return response;
108
- };
97
+ return TOKEN_USAGE_FIELDS.some((field) => usage[field] !== undefined);
109
98
  }
99
+ /** Grow the token counters by one completed call. A figure that the provider did not report counts nothing. */
110
100
  export function recordChatCall(call) {
111
- const { usage, servedModelId, provider } = call.response;
112
- if (usage === undefined)
113
- return;
101
+ const { usage } = call;
114
102
  const { inputTokens, outputTokens, cacheReadTokens, cacheWriteTokens, reasoningTokens } = getInstruments();
115
- const attributes = {
116
- agent_id: call.agentId,
117
- ...(servedModelId === undefined ? {} : { model: servedModelId }),
118
- ...(provider === undefined ? {} : { provider }),
119
- };
103
+ const attributes = { agent_id: call.agentId };
104
+ if (call.servedModelId !== undefined)
105
+ attributes.model = call.servedModelId;
106
+ if (call.provider !== undefined)
107
+ attributes.provider = call.provider;
120
108
  if (usage.inputTokens !== undefined)
121
109
  inputTokens.add(usage.inputTokens, attributes);
122
110
  if (usage.outputTokens !== undefined)
@@ -128,7 +116,7 @@ export function recordChatCall(call) {
128
116
  if (usage.reasoningTokens !== undefined)
129
117
  reasoningTokens.add(usage.reasoningTokens, attributes);
130
118
  }
131
- /** Record one completed `runAgent` invocation. */
119
+ /** Record one completed run of the loop. */
132
120
  export function recordAgentRun(run) {
133
121
  const { iterations, capHits } = getInstruments();
134
122
  const attributes = { agent_id: run.agentId };
@@ -0,0 +1,233 @@
1
+ /**
2
+ * The agent loop: one conversation of one agent with a model and its tools.
3
+ *
4
+ * The AI SDK drives each request series with `streamText`. Inside a DBOS
5
+ * workflow, `durableCalls` makes each model call a step, and the tool adapter
6
+ * makes each tool call a step, thus a recovery replays each completed call
7
+ * from its checkpoint. Outside a workflow, each call runs directly. The same
8
+ * loop serves a chat turn, a workflow step, and a sub-agent.
9
+ *
10
+ * The loop keeps the transcript itself, and each request sends its view of
11
+ * the transcript. This gives the loop the work that the SDK does not do: the
12
+ * append-only record of each round, the round sink, the compaction, the
13
+ * follow-up request, the salvage, the not-run answer of each unanswered call
14
+ * at an exit, and the finish record.
15
+ */
16
+ import { type LanguageModelMiddleware, type UIMessageStreamWriter } from "ai";
17
+ import { type AgentSession } from "../auth/types.js";
18
+ import type { UsageRecorder } from "../billing/usage-recorder.js";
19
+ import type { Logger } from "../lib/logger.js";
20
+ import type { ChatProvider, PromptCachePolicy, ReasoningPolicy } from "../providers/types.js";
21
+ import type { AskRequest } from "../tools/approval/contract.js";
22
+ import { type CallPolicy, type ToolMask } from "./call-policy.js";
23
+ import { type CompactionPolicy } from "./compaction.js";
24
+ import { type AgentRunUsage } from "./metrics.js";
25
+ import { type ToolCallOutput } from "./tool-adapter.js";
26
+ import { type ToolOutputStore } from "./tool-output.js";
27
+ import type { AgentDefinition, EmitFn, LoopMessage } from "./types.js";
28
+ export type AgentFinish = {
29
+ /**
30
+ * The stop reason: the finish reason of the last reply, `aborted`, `max_iterations` at the step cap, or
31
+ * `denied` after a denial of the user. A word outside the modeled union stays as the provider sent it.
32
+ */
33
+ readonly reason: "stop" | "length" | "content-filter" | "tool-calls" | "error" | "other" | "aborted" | "max_iterations" | "denied" | (string & {});
34
+ /** The word of the endpoint for the stop, when the provider captured one. */
35
+ readonly rawFinishReason?: string;
36
+ readonly cappedOut: boolean;
37
+ /** What the model calls of this run reported. Absent when no call reported anything — never an all-zero figure. */
38
+ readonly usage?: AgentRunUsage;
39
+ /**
40
+ * The whole turn's total, every descendant loop included. Present only on
41
+ * the loop that created the turn accumulator — the run whose options
42
+ * carried none, which is by construction the turn's root.
43
+ */
44
+ readonly turnUsage?: AgentRunUsage;
45
+ };
46
+ /** One tool call of a completed request, in the order that the model made the calls. */
47
+ export type LoopToolCall = {
48
+ readonly toolCallId: string;
49
+ readonly toolName: string;
50
+ readonly input: unknown;
51
+ /** The output of a call that ran. Absent for a refused call and for an input that did not parse. */
52
+ readonly output?: ToolCallOutput;
53
+ /** The policy of the run refused the call, thus it did not run. */
54
+ readonly refused: boolean;
55
+ /** The call has a result in the conversation. */
56
+ readonly answered: boolean;
57
+ };
58
+ /** One completed model request of a run, and the tool calls of its reply. */
59
+ export type LoopStep = {
60
+ readonly finishReason: string;
61
+ readonly rawFinishReason?: string;
62
+ readonly calls: readonly LoopToolCall[];
63
+ };
64
+ export type LoopResult = {
65
+ readonly messages: LoopMessage[];
66
+ readonly finish: AgentFinish;
67
+ /** Each completed request of the run, in order. A selector reads the outcome of a run from them. */
68
+ readonly steps: readonly LoopStep[];
69
+ };
70
+ /** A request that the provider refused for its content: the HTTP status and the text of the provider error. */
71
+ export type RequestRefusal = {
72
+ readonly status: number;
73
+ readonly message: string;
74
+ };
75
+ /** The messages that the loop appended after the last call of the round sink. */
76
+ export type AgentRound = {
77
+ readonly messages: readonly LoopMessage[];
78
+ };
79
+ /** The decision of the user on the approval of one call. */
80
+ export type ApprovalDecision = {
81
+ readonly kind: "approved";
82
+ } | {
83
+ readonly kind: "denied";
84
+ readonly feedback?: string;
85
+ };
86
+ export type LoopOptions = {
87
+ readonly provider: ChatProvider;
88
+ readonly signal: AbortSignal;
89
+ readonly emit: EmitFn;
90
+ /** Receives each text delta of the reply as it streams. A loop with a live reader of its text gives it. */
91
+ readonly onText?: (text: string) => void | Promise<void>;
92
+ /**
93
+ * The round sink. The loop awaits it before each model request, at each exit, and before a throw.
94
+ * A durable loop passes no sink, because DBOS replays the loop body.
95
+ */
96
+ readonly onRound?: (round: AgentRound) => Promise<void>;
97
+ /**
98
+ * The compaction policy. Each request then sends the view of the transcript, and the loop compacts
99
+ * before a task request whose view passes the budget. A durable loop passes no policy, because
100
+ * `recordsAfter` reads the database outside a step.
101
+ */
102
+ readonly compaction?: CompactionPolicy;
103
+ /**
104
+ * The messages that open the turn of a chat thread: the user message and its context records. The loop appends
105
+ * them after the turn-start compaction, thus the conversation holds each message in the order that it was sent.
106
+ * Absent: `initial` holds the whole conversation.
107
+ */
108
+ readonly turnInput?: readonly LoopMessage[];
109
+ /**
110
+ * The decision of the user on a call whose tool asks for approval. The loop asks before the call runs, after the
111
+ * call policy. Absent: no surface can answer, and the loop denies each such call.
112
+ */
113
+ readonly approve?: (request: AskRequest, call: {
114
+ readonly toolCallId: string;
115
+ readonly toolName: string;
116
+ }) => Promise<ApprovalDecision>;
117
+ /** The mask of the task, the budget, and the guard of the run. A refused call does not run. */
118
+ readonly policy?: CallPolicy;
119
+ /** Ends the run when its outcome is final, for example a blocker of a step agent. The finish reason is `stop`. */
120
+ readonly stopWhen?: (steps: readonly LoopStep[]) => boolean;
121
+ /** An early cap: the run ends as if it reached its step cap, for example after the refusal limit of a guard. */
122
+ readonly capWhen?: () => boolean;
123
+ /**
124
+ * Prompt-cache policy for every model call of this run. Defaults to `DEFAULT_PROMPT_CACHE` (5m) — an agent
125
+ * loop always re-sends its prefix, so it breaks even by the second request. A host whose endpoint ignores
126
+ * or charges badly for cache directives passes `"off"`.
127
+ */
128
+ readonly promptCache?: PromptCachePolicy;
129
+ /**
130
+ * The reasoning effort for each model call of this run. Anthropic discards its message cache when the
131
+ * top-level effort changes, so the run sends the same value, or none, throughout.
132
+ */
133
+ readonly reasoning?: ReasoningPolicy;
134
+ readonly logger?: Logger;
135
+ /** Per-call usage accounting. Omitted falls back to the no-op recorder. */
136
+ readonly usageRecorder?: UsageRecorder;
137
+ /** Keeps the text of each cut tool result. A run with no store cuts, and it keeps nothing. */
138
+ readonly toolOutputStore?: ToolOutputStore;
139
+ /**
140
+ * The turn's usage accumulator, supplied by whatever ran this loop as part of a larger turn (a
141
+ * sub-agent-running tool passes `ctx.turnUsage`). A run that receives none creates its own and is
142
+ * therefore the turn's root: it alone reports `turnUsage` on its finish.
143
+ */
144
+ readonly turnUsage?: AgentRunUsage;
145
+ /**
146
+ * The durable stream that each model call of the run writes its text to, from inside its step. A loop
147
+ * outside a workflow writes nothing, and `onText` gives its text.
148
+ */
149
+ readonly chatStream?: string;
150
+ /** Receives the chunks that each tool step writes through the tool writer of the library, on a replay too. */
151
+ readonly toolWriter?: UIMessageStreamWriter;
152
+ /** Model middleware inside the step of each model call, thus a replay of a recorded call does not run it. */
153
+ readonly modelMiddleware?: readonly LanguageModelMiddleware[];
154
+ /**
155
+ * The id of the tool call this loop runs inside, supplied by a sub-agent-running tool from its
156
+ * `ctx.invocationId`. It separates two dispatches of the same sub-agent in one round in the usage record
157
+ * key. The data profile gives the workflow id of its attempt, because each profile runs under the same
158
+ * constant frame.
159
+ */
160
+ readonly invocationId?: string;
161
+ /**
162
+ * Waits out a failed request whose cause a person or time can repair, and gives how the wait ended: the deadline
163
+ * of a retry, a resume, or a stop. `undefined`: the failure does not pause, and the loop throws it. The body of a
164
+ * workflow gives the pause of its work. A loop with no pause throws each failure.
165
+ */
166
+ readonly pause?: (failure: unknown, attempt: number, signal: AbortSignal) => Promise<"retry" | "resume" | "abort" | undefined>;
167
+ };
168
+ /** The harness request after a reply that a failed request cut. The model reads its partial reply, and continues it. */
169
+ export declare const CONTINUE_REQUEST = "[The model request failed during your reply above. Continue the reply from where it stopped.]";
170
+ /** A run that receives no turn accumulator is the turn's root. See `LoopOptions.turnUsage`. */
171
+ export declare const isTurnRoot: (opts: Pick<LoopOptions, "turnUsage">) => boolean;
172
+ /** Run an agent over `initial` until its reply ends the run. */
173
+ export declare function runLoop(agent: AgentDefinition, initial: readonly LoopMessage[], session: AgentSession, opts: LoopOptions): Promise<LoopResult>;
174
+ /** One harness request that continues a finished conversation. */
175
+ export type FollowUpRequest = {
176
+ /** Appended as a synthetic user message, thus it opens no turn in a stored thread. */
177
+ readonly text: string;
178
+ /** The tools that can run. The request still declares every tool of the agent. */
179
+ readonly mask: ToolMask;
180
+ readonly maxRequests: number;
181
+ /**
182
+ * When set, metrics and token counts are attributed to this id instead of
183
+ * `agent.id`, through `forSubAgent`. Omitted, both stay the agent's own.
184
+ */
185
+ readonly accountingAgentId?: string;
186
+ /** A `provider` error with the status `400` or `413` ends the request with the finish reason `error`, and no throw. */
187
+ readonly endOnRequestRefusal?: boolean;
188
+ };
189
+ export type FollowUpResult = LoopResult & {
190
+ /** The refusal that ended a request with `endOnRequestRefusal`. */
191
+ readonly refusal?: RequestRefusal;
192
+ };
193
+ /**
194
+ * Continue a finished conversation with one harness request. `agent` and `opts`
195
+ * must match the conversation's own, since each request extends its cached
196
+ * prefix. `conversation` itself is never changed. The result holds only the new
197
+ * messages, starting with the request.
198
+ */
199
+ export declare function continueLoop(agent: AgentDefinition, conversation: readonly LoopMessage[], request: FollowUpRequest, session: AgentSession, opts: LoopOptions): Promise<FollowUpResult>;
200
+ /** Default salvage budget: one submit plus a fix of a refused submission or two. */
201
+ export declare const DEFAULT_SALVAGE_REQUESTS = 3;
202
+ /** How to salvage a run that ended with no outcome. */
203
+ export type TerminalSalvage = {
204
+ /** The tools that can run in the salvage request. Each one must be a declared tool of the agent. */
205
+ readonly tools: readonly string[];
206
+ /** Opens the salvage request as a synthetic user message. */
207
+ readonly nudge: string;
208
+ /** The cap of salvage requests. Defaults to {@link DEFAULT_SALVAGE_REQUESTS}. */
209
+ readonly maxRequests?: number;
210
+ /** Whether the recorded steps hold the outcome of the agent. */
211
+ readonly hasOutcome: (steps: readonly LoopStep[]) => boolean;
212
+ };
213
+ /**
214
+ * What a salvage request was and how it went — present only when one ran. The first finish is the
215
+ * diagnosis of why a salvage was needed: a run that capped out spent its budget, and a run that ended
216
+ * on prose gave up early.
217
+ */
218
+ export type SalvageRecord = {
219
+ readonly firstFinish: AgentFinish;
220
+ readonly finish: AgentFinish;
221
+ };
222
+ export type SalvagedResult = LoopResult & {
223
+ /** Null when the first run reached its outcome and no salvage ran. */
224
+ readonly salvage: SalvageRecord | null;
225
+ };
226
+ /**
227
+ * Run an agent that has an outcome, and send one salvage request when the run
228
+ * ends with none and was not aborted. The salvage request lets only the
229
+ * terminal tools of the agent run. A salvaged result carries both runs'
230
+ * messages and steps and the summed rollups, with the finish of the salvage.
231
+ */
232
+ export declare function runWithSalvage(agent: AgentDefinition, initial: readonly LoopMessage[], session: AgentSession, opts: LoopOptions, salvage: TerminalSalvage): Promise<SalvagedResult>;
233
+ export declare function finalText(messages: readonly LoopMessage[]): string;