@inflexa-ai/harness 0.45.1 → 0.46.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (789) hide show
  1. package/README.md +6 -3
  2. package/dist/agents/conversation-agent.d.ts +9 -3
  3. package/dist/agents/conversation-agent.js +34 -33
  4. package/dist/agents/report-session-agent.d.ts +15 -15
  5. package/dist/agents/report-session-agent.js +23 -15
  6. package/dist/agents/sandbox/index.d.ts +1 -1
  7. package/dist/agents/sandbox/index.js +1 -1
  8. package/dist/agents/sandbox/shared.d.ts +12 -14
  9. package/dist/agents/sandbox/shared.js +18 -12
  10. package/dist/agents/sandbox/types.d.ts +4 -4
  11. package/dist/agents/sandbox/validate-skills.d.ts +2 -2
  12. package/dist/agents/sandbox/validate-skills.js +3 -1
  13. package/dist/agents/sandbox-catalog.d.ts +2 -2
  14. package/dist/agents/sandbox-catalog.js +3 -3
  15. package/dist/agents/system-prompt.d.ts +2 -2
  16. package/dist/app/chat-turn-workflow.d.ts +114 -0
  17. package/dist/app/chat-turn-workflow.js +307 -0
  18. package/dist/app/chat-turn.d.ts +85 -57
  19. package/dist/app/chat-turn.js +123 -100
  20. package/dist/app/data-profile-orientation.js +10 -8
  21. package/dist/app/data-profile-view.d.ts +4 -4
  22. package/dist/app/data-profile-view.js +9 -8
  23. package/dist/app/in-process-turn.d.ts +42 -0
  24. package/dist/app/in-process-turn.js +139 -0
  25. package/dist/app/message-assembly.d.ts +10 -4
  26. package/dist/app/message-assembly.js +13 -8
  27. package/dist/app/report-session-runtime.d.ts +4 -4
  28. package/dist/app/report-session-runtime.js +36 -21
  29. package/dist/app/spawn-report-session.d.ts +33 -28
  30. package/dist/app/spawn-report-session.js +25 -40
  31. package/dist/app/synthesize-run.d.ts +22 -16
  32. package/dist/app/synthesize-run.js +41 -35
  33. package/dist/app/work.d.ts +96 -0
  34. package/dist/app/work.js +147 -0
  35. package/dist/auth/local-auth-context.d.ts +1 -3
  36. package/dist/auth/local-auth-context.js +1 -3
  37. package/dist/auth/local-run-authorizer.d.ts +1 -1
  38. package/dist/auth/local-run-authorizer.js +5 -3
  39. package/dist/auth/types.d.ts +26 -26
  40. package/dist/billing/cached-resolver.d.ts +4 -4
  41. package/dist/billing/run-charge.d.ts +5 -8
  42. package/dist/billing/run-charge.js +2 -2
  43. package/dist/billing/usage-recorder.d.ts +9 -9
  44. package/dist/citations/aggregate.js +1 -1
  45. package/dist/citations/clients/arxiv.d.ts +2 -2
  46. package/dist/citations/clients/arxiv.js +12 -4
  47. package/dist/citations/clients/common.js +4 -2
  48. package/dist/citations/clients/crossref.d.ts +2 -2
  49. package/dist/citations/clients/crossref.js +37 -37
  50. package/dist/citations/clients/doi-registry.js +15 -16
  51. package/dist/citations/clients/pubmed.d.ts +2 -2
  52. package/dist/citations/clients/pubmed.js +20 -13
  53. package/dist/citations/clients/semantic-scholar.d.ts +2 -2
  54. package/dist/citations/clients/semantic-scholar.js +9 -9
  55. package/dist/citations/compare.js +2 -2
  56. package/dist/citations/match.d.ts +2 -2
  57. package/dist/citations/match.js +12 -7
  58. package/dist/citations/normalize.js +35 -26
  59. package/dist/citations/plan.js +6 -2
  60. package/dist/citations/resolve.d.ts +6 -6
  61. package/dist/citations/resolve.js +34 -25
  62. package/dist/citations/types.d.ts +77 -77
  63. package/dist/config/environment-stores.d.ts +6 -6
  64. package/dist/config/resource-limits.js +1 -3
  65. package/dist/contracts/analogy-report.d.ts +7 -7
  66. package/dist/contracts/analogy-report.js +2 -2
  67. package/dist/contracts/chat-events.d.ts +38 -24
  68. package/dist/contracts/chat-frame.d.ts +15 -5
  69. package/dist/contracts/chat-frame.js +64 -41
  70. package/dist/contracts/chat-parts.d.ts +130 -67
  71. package/dist/contracts/chat-parts.js +1 -0
  72. package/dist/contracts/content-url.js +16 -2
  73. package/dist/contracts/data-profile.d.ts +38 -38
  74. package/dist/contracts/index.d.ts +2 -2
  75. package/dist/contracts/index.js +1 -1
  76. package/dist/contracts/message.d.ts +6 -6
  77. package/dist/contracts/organ-system.d.ts +11 -11
  78. package/dist/contracts/part-registry.d.ts +5 -4
  79. package/dist/contracts/part-registry.js +5 -0
  80. package/dist/contracts/profile-vocabulary.d.ts +11 -10
  81. package/dist/contracts/profile-vocabulary.js +10 -3
  82. package/dist/contracts/report-blocks.d.ts +329 -329
  83. package/dist/contracts/report-reference.d.ts +105 -81
  84. package/dist/contracts/report-reference.js +30 -13
  85. package/dist/contracts/schemas/chat-events.d.ts +30 -16
  86. package/dist/contracts/schemas/chat-events.js +15 -6
  87. package/dist/contracts/schemas/chat-parts.d.ts +175 -102
  88. package/dist/contracts/schemas/chat-parts.js +33 -7
  89. package/dist/contracts/severity.d.ts +1 -1
  90. package/dist/contracts/structure-source.d.ts +3 -3
  91. package/dist/contracts/structure-source.js +6 -2
  92. package/dist/contracts/subagent-activity.d.ts +2 -2
  93. package/dist/contracts/subagent-activity.js +5 -3
  94. package/dist/contracts/usage.d.ts +2 -2
  95. package/dist/data/safety-panel-schema.d.ts +25 -25
  96. package/dist/data/safety-panel-schema.js +13 -4
  97. package/dist/execution/artifact-metadata.d.ts +23 -15
  98. package/dist/execution/artifact-metadata.js +33 -10
  99. package/dist/execution/artifact-record.d.ts +2 -2
  100. package/dist/execution/artifact-registration.d.ts +5 -5
  101. package/dist/execution/artifact-registry.d.ts +8 -8
  102. package/dist/execution/dbos-run-launcher.d.ts +24 -4
  103. package/dist/execution/dbos-run-launcher.js +58 -4
  104. package/dist/execution/dbos-workflow-purger.d.ts +5 -6
  105. package/dist/execution/dbos-workflow-purger.js +8 -7
  106. package/dist/execution/input-signature.d.ts +2 -2
  107. package/dist/execution/post-step-pipeline.d.ts +9 -9
  108. package/dist/execution/post-step-pipeline.js +1 -1
  109. package/dist/execution/post-step.js +2 -2
  110. package/dist/execution/reconcile-manifest.d.ts +4 -4
  111. package/dist/execution/reconcile-manifest.js +3 -2
  112. package/dist/execution/run-authorizer.d.ts +46 -37
  113. package/dist/execution/run-authorizer.js +8 -8
  114. package/dist/execution/run-canceler.d.ts +7 -7
  115. package/dist/execution/run-canceler.js +14 -7
  116. package/dist/execution/run-end-record.d.ts +2 -3
  117. package/dist/execution/run-event-parts.d.ts +0 -8
  118. package/dist/execution/run-event-parts.js +29 -24
  119. package/dist/execution/run-event-stream.d.ts +8 -8
  120. package/dist/execution/run-event-stream.js +3 -4
  121. package/dist/execution/run-launcher.d.ts +4 -4
  122. package/dist/execution/run-synthesis.d.ts +49 -48
  123. package/dist/execution/run-synthesis.js +96 -255
  124. package/dist/execution/staged-input.d.ts +2 -2
  125. package/dist/execution/step-summary.d.ts +6 -6
  126. package/dist/execution/step-summary.js +4 -8
  127. package/dist/execution/topo-sort.js +4 -3
  128. package/dist/execution/workflow-purger.d.ts +2 -2
  129. package/dist/index.d.ts +17 -20
  130. package/dist/index.js +25 -36
  131. package/dist/input-sanitization.js +9 -2
  132. package/dist/input-scan/clustering.d.ts +6 -6
  133. package/dist/input-scan/clustering.js +11 -5
  134. package/dist/input-scan/companions.js +3 -2
  135. package/dist/input-scan/detect-sets.d.ts +2 -2
  136. package/dist/input-scan/detect-sets.js +25 -21
  137. package/dist/input-scan/enrich.d.ts +6 -6
  138. package/dist/input-scan/enrich.js +29 -12
  139. package/dist/input-scan/formats.d.ts +2 -2
  140. package/dist/input-scan/formats.js +8 -2
  141. package/dist/input-scan/markers.d.ts +2 -2
  142. package/dist/input-scan/markers.js +14 -5
  143. package/dist/input-scan/menu.d.ts +10 -10
  144. package/dist/input-scan/menu.js +0 -0
  145. package/dist/input-scan/quarantine.d.ts +2 -2
  146. package/dist/input-scan/quarantine.js +23 -18
  147. package/dist/input-scan/readout-budget.d.ts +2 -2
  148. package/dist/input-scan/readout-budget.js +1 -1
  149. package/dist/input-scan/readout.d.ts +2 -2
  150. package/dist/input-scan/readout.js +47 -34
  151. package/dist/input-scan/scan.d.ts +2 -2
  152. package/dist/input-scan/scan.js +7 -5
  153. package/dist/input-scan/set-types.d.ts +28 -28
  154. package/dist/input-scan/shapes.d.ts +4 -4
  155. package/dist/input-scan/shapes.js +0 -0
  156. package/dist/input-scan/templates.d.ts +10 -10
  157. package/dist/input-scan/templates.js +30 -22
  158. package/dist/input-scan/tokens.d.ts +6 -4
  159. package/dist/input-scan/tokens.js +100 -38
  160. package/dist/input-scan/types.d.ts +22 -22
  161. package/dist/lib/async-utils.d.ts +3 -7
  162. package/dist/lib/async-utils.js +5 -9
  163. package/dist/lib/cache.js +1 -1
  164. package/dist/lib/chrome.d.ts +46 -6
  165. package/dist/lib/console-logger.js +2 -2
  166. package/dist/lib/db-result.d.ts +22 -6
  167. package/dist/lib/db-result.js +9 -13
  168. package/dist/lib/eyes.d.ts +4 -4
  169. package/dist/lib/eyes.js +1 -1
  170. package/dist/lib/fs-helpers.js +18 -6
  171. package/dist/lib/fs-result.d.ts +1 -0
  172. package/dist/lib/fs-result.js +5 -6
  173. package/dist/lib/hooks.d.ts +23 -7
  174. package/dist/lib/hooks.js +17 -3
  175. package/dist/lib/host-concurrency.js +3 -2
  176. package/dist/lib/logger.d.ts +2 -2
  177. package/dist/lib/logger.js +2 -1
  178. package/dist/lib/metrics.d.ts +1 -1
  179. package/dist/lib/null-proto.d.ts +6 -0
  180. package/dist/lib/null-proto.js +17 -0
  181. package/dist/lib/otel-spans.d.ts +1 -1
  182. package/dist/lib/otel-spans.js +9 -5
  183. package/dist/lib/otel.d.ts +4 -2
  184. package/dist/lib/otel.js +10 -2
  185. package/dist/lib/page-capture.d.ts +8 -8
  186. package/dist/lib/page-capture.js +9 -4
  187. package/dist/lib/parse-json.d.ts +5 -0
  188. package/dist/lib/parse-json.js +12 -0
  189. package/dist/lib/present.d.ts +12 -0
  190. package/dist/lib/present.js +39 -0
  191. package/dist/lib/rate-limit.d.ts +4 -4
  192. package/dist/lib/rate-limit.js +12 -13
  193. package/dist/lib/regulatory-corpus/fetch-fda-guidance.d.ts +4 -4
  194. package/dist/lib/regulatory-corpus/fetch-fda-guidance.js +4 -10
  195. package/dist/lib/regulatory-corpus/fetch-ich.d.ts +4 -4
  196. package/dist/lib/regulatory-corpus/fetch-ich.js +18 -14
  197. package/dist/lib/regulatory-corpus/normalize-whitespace.d.ts +6 -0
  198. package/dist/lib/regulatory-corpus/normalize-whitespace.js +41 -0
  199. package/dist/lib/regulatory-corpus.d.ts +10 -10
  200. package/dist/lib/regulatory-corpus.js +3 -1
  201. package/dist/lib/result.d.ts +10 -11
  202. package/dist/lib/result.js +15 -13
  203. package/dist/lib/storage.d.ts +2 -2
  204. package/dist/lib/test/async-iterable.d.ts +9 -0
  205. package/dist/lib/test/async-iterable.js +28 -0
  206. package/dist/lib/test/request-url.d.ts +5 -0
  207. package/dist/lib/test/request-url.js +7 -0
  208. package/dist/lib/test/result-assert.d.ts +12 -0
  209. package/dist/lib/test/result-assert.js +17 -0
  210. package/dist/lib/test/text-shapes.d.ts +24 -0
  211. package/dist/lib/test/text-shapes.js +63 -0
  212. package/dist/lib/text.d.ts +22 -0
  213. package/dist/lib/text.js +68 -0
  214. package/dist/lib/thrown.d.ts +18 -0
  215. package/dist/lib/thrown.js +30 -0
  216. package/dist/lib/unknown-array.d.ts +6 -0
  217. package/dist/lib/unknown-array.js +8 -0
  218. package/dist/lib/unknown-containers.d.ts +14 -0
  219. package/dist/lib/unknown-containers.js +17 -0
  220. package/dist/lib/unknown-text.d.ts +8 -0
  221. package/dist/lib/unknown-text.js +28 -0
  222. package/dist/lib/zod-issue-shape.d.ts +1 -1
  223. package/dist/lib/zod-issue-shape.js +31 -31
  224. package/dist/lib/zod-issues.d.ts +3 -3
  225. package/dist/lib/zod-issues.js +30 -17
  226. package/dist/literature/sources/arxiv.d.ts +6 -6
  227. package/dist/literature/sources/arxiv.js +92 -35
  228. package/dist/literature/sources/http.d.ts +2 -2
  229. package/dist/literature/sources/http.js +16 -15
  230. package/dist/literature/sources/pubmed.d.ts +16 -16
  231. package/dist/literature/sources/pubmed.js +96 -61
  232. package/dist/literature/sources/semantic-scholar.d.ts +8 -8
  233. package/dist/literature/sources/semantic-scholar.js +22 -13
  234. package/dist/loop/accounting.d.ts +63 -0
  235. package/dist/loop/accounting.js +141 -0
  236. package/dist/loop/call-policy.d.ts +73 -0
  237. package/dist/loop/call-policy.js +109 -0
  238. package/dist/loop/chat-stream.d.ts +62 -0
  239. package/dist/loop/chat-stream.js +237 -0
  240. package/dist/loop/compaction.d.ts +9 -9
  241. package/dist/loop/compaction.js +1 -1
  242. package/dist/loop/metrics.d.ts +12 -15
  243. package/dist/loop/metrics.js +14 -26
  244. package/dist/loop/run-loop.d.ts +233 -0
  245. package/dist/loop/run-loop.js +770 -0
  246. package/dist/loop/sub-agent.d.ts +61 -0
  247. package/dist/loop/sub-agent.js +161 -0
  248. package/dist/loop/tool-adapter.d.ts +98 -0
  249. package/dist/loop/tool-adapter.js +364 -0
  250. package/dist/loop/tool-detail.d.ts +1 -1
  251. package/dist/loop/tool-detail.js +6 -5
  252. package/dist/loop/tool-outcome.d.ts +1 -1
  253. package/dist/loop/tool-output.d.ts +4 -4
  254. package/dist/loop/tool-output.js +2 -2
  255. package/dist/loop/turn-credentials.d.ts +34 -0
  256. package/dist/loop/turn-credentials.js +73 -0
  257. package/dist/loop/types.d.ts +29 -38
  258. package/dist/loop/types.js +2 -7
  259. package/dist/memory/ai-sdk-message-storage.d.ts +5 -5
  260. package/dist/memory/ai-sdk-message-storage.js +13 -11
  261. package/dist/memory/card-builders.d.ts +14 -14
  262. package/dist/memory/card-builders.js +19 -15
  263. package/dist/memory/conversation-display-recorder.d.ts +22 -4
  264. package/dist/memory/conversation-display-recorder.js +43 -24
  265. package/dist/memory/conversation-display-replay.js +3 -2
  266. package/dist/memory/conversation-display-storage.d.ts +15 -7
  267. package/dist/memory/conversation-display-storage.js +141 -36
  268. package/dist/memory/conversation-view.d.ts +4 -4
  269. package/dist/memory/conversation-view.js +5 -4
  270. package/dist/memory/count-tokens.js +10 -8
  271. package/dist/memory/derive-thread-title.d.ts +0 -13
  272. package/dist/memory/derive-thread-title.js +2 -1
  273. package/dist/memory/message-backfill.d.ts +12 -5
  274. package/dist/memory/message-backfill.js +5 -3
  275. package/dist/memory/thread-history.d.ts +36 -21
  276. package/dist/memory/thread-history.js +78 -54
  277. package/dist/memory/thread-store.d.ts +26 -17
  278. package/dist/memory/thread-store.js +15 -9
  279. package/dist/memory/tool-call-integrity.d.ts +2 -2
  280. package/dist/memory/tool-call-integrity.js +4 -3
  281. package/dist/memory/working-memory.d.ts +16 -12
  282. package/dist/memory/working-memory.js +72 -61
  283. package/dist/prompts/briefing.d.ts +12 -12
  284. package/dist/prompts/briefing.js +1 -1
  285. package/dist/prompts/synthesis-agent.d.ts +1 -1
  286. package/dist/prompts/synthesis-agent.js +6 -14
  287. package/dist/provenance/collector.d.ts +6 -6
  288. package/dist/provenance/collector.js +15 -8
  289. package/dist/provenance/exec-frame.d.ts +2 -2
  290. package/dist/provenance/exec-frame.js +6 -1
  291. package/dist/provenance/seam.d.ts +1 -4
  292. package/dist/provenance/types.d.ts +6 -6
  293. package/dist/providers/ai-sdk.d.ts +113 -62
  294. package/dist/providers/ai-sdk.js +283 -518
  295. package/dist/providers/embedding.d.ts +2 -2
  296. package/dist/providers/embedding.js +1 -1
  297. package/dist/providers/errors.d.ts +22 -2
  298. package/dist/providers/errors.js +98 -50
  299. package/dist/providers/prompt-cache.d.ts +8 -8
  300. package/dist/providers/prompt-cache.js +13 -11
  301. package/dist/providers/reasoning.d.ts +2 -2
  302. package/dist/providers/reasoning.js +2 -2
  303. package/dist/providers/types.d.ts +55 -94
  304. package/dist/reference-data/catalog.d.ts +2 -15
  305. package/dist/reference-data/catalog.js +25 -8
  306. package/dist/reference-data/receipt.d.ts +2 -2
  307. package/dist/report-model/assert-rules.js +1 -1
  308. package/dist/report-model/authoring-grammar.d.ts +211 -233
  309. package/dist/report-model/block-walk.d.ts +10 -10
  310. package/dist/report-model/block-walk.js +2 -0
  311. package/dist/report-model/draft-finish.d.ts +8 -8
  312. package/dist/report-model/draft-finish.js +1 -1
  313. package/dist/report-model/draft-hash.js +8 -7
  314. package/dist/report-model/draft-operations.d.ts +22 -10
  315. package/dist/report-model/draft-operations.js +48 -30
  316. package/dist/report-model/draft-read.d.ts +19 -7
  317. package/dist/report-model/draft-read.js +16 -6
  318. package/dist/report-model/draft.d.ts +844 -2
  319. package/dist/report-model/draft.js +3 -1
  320. package/dist/report-model/fixture-resolver.js +39 -16
  321. package/dist/report-model/pin-snapshot.d.ts +2 -2
  322. package/dist/report-model/pin-snapshot.js +15 -15
  323. package/dist/report-model/production-resolver.d.ts +18 -18
  324. package/dist/report-model/production-resolver.js +50 -42
  325. package/dist/report-model/reference-resolver.d.ts +26 -10
  326. package/dist/report-model/reference-resolver.js +68 -5
  327. package/dist/report-model/reference-stamp.js +30 -38
  328. package/dist/report-model/structural-validation.js +12 -4
  329. package/dist/report-model/validate.d.ts +7 -7
  330. package/dist/report-model/validate.js +6 -6
  331. package/dist/report-render/assets.d.ts +2 -2
  332. package/dist/report-render/assets.js +27 -3
  333. package/dist/report-render/chart-export.d.ts +10 -2
  334. package/dist/report-render/chart-export.js +37 -11
  335. package/dist/report-render/chart-presets.d.ts +8 -8
  336. package/dist/report-render/chart-presets.js +3 -3
  337. package/dist/report-render/chart-renderers.d.ts +23 -16
  338. package/dist/report-render/chart-renderers.js +74 -53
  339. package/dist/report-render/chart-toolbox.d.ts +2 -2
  340. package/dist/report-render/chart-toolbox.js +7 -6
  341. package/dist/report-render/chart.d.ts +15 -16
  342. package/dist/report-render/chart.js +369 -252
  343. package/dist/report-render/design.d.ts +36 -297
  344. package/dist/report-render/design.js +0 -12
  345. package/dist/report-render/figures/common.d.ts +12 -12
  346. package/dist/report-render/figures/common.js +42 -31
  347. package/dist/report-render/figures/dendrogram.d.ts +3 -3
  348. package/dist/report-render/figures/dendrogram.js +10 -10
  349. package/dist/report-render/figures/dense.js +15 -8
  350. package/dist/report-render/figures/dotplot.js +46 -33
  351. package/dist/report-render/figures/embedding.js +52 -43
  352. package/dist/report-render/figures/equal-units.d.ts +10 -10
  353. package/dist/report-render/figures/equal-units.js +27 -27
  354. package/dist/report-render/figures/forest.js +9 -7
  355. package/dist/report-render/figures/gsea.js +21 -11
  356. package/dist/report-render/figures/heatmap.js +13 -9
  357. package/dist/report-render/figures/index.d.ts +10 -10
  358. package/dist/report-render/figures/index.js +4 -2
  359. package/dist/report-render/figures/km.js +10 -9
  360. package/dist/report-render/figures/label-room.d.ts +12 -12
  361. package/dist/report-render/figures/label-room.js +7 -2
  362. package/dist/report-render/figures/locuszoom.d.ts +2 -2
  363. package/dist/report-render/figures/locuszoom.js +59 -31
  364. package/dist/report-render/figures/lollipop.js +3 -2
  365. package/dist/report-render/figures/ma.js +8 -4
  366. package/dist/report-render/figures/manhattan.d.ts +1 -2
  367. package/dist/report-render/figures/manhattan.js +52 -34
  368. package/dist/report-render/figures/oncoprint.js +4 -5
  369. package/dist/report-render/figures/pca.js +25 -11
  370. package/dist/report-render/figures/qq.js +20 -9
  371. package/dist/report-render/figures/roc.js +1 -1
  372. package/dist/report-render/figures/sankey.d.ts +2 -2
  373. package/dist/report-render/figures/sankey.js +11 -10
  374. package/dist/report-render/figures/upset.d.ts +6 -6
  375. package/dist/report-render/figures/upset.js +7 -4
  376. package/dist/report-render/figures/volcano.js +12 -10
  377. package/dist/report-render/hybrid-svg.d.ts +4 -4
  378. package/dist/report-render/hybrid-svg.js +7 -5
  379. package/dist/report-render/number-format.d.ts +4 -4
  380. package/dist/report-render/number-format.js +62 -27
  381. package/dist/report-render/page.js +2 -1
  382. package/dist/report-render/provenance-data.d.ts +2 -2
  383. package/dist/report-render/references.d.ts +4 -4
  384. package/dist/report-render/render.d.ts +2 -2
  385. package/dist/report-render/render.js +10 -11
  386. package/dist/report-render/script-json.js +1 -1
  387. package/dist/report-render/table-data.d.ts +6 -6
  388. package/dist/report-render/test/options.d.ts +49 -0
  389. package/dist/report-render/test/options.js +143 -0
  390. package/dist/report-render/test/page-function.d.ts +19 -0
  391. package/dist/report-render/test/page-function.js +33 -0
  392. package/dist/report-render/types.d.ts +10 -10
  393. package/dist/report-render/value-bridge.d.ts +4 -4
  394. package/dist/report-render/value-bridge.js +27 -14
  395. package/dist/report-render/views/chart-view.d.ts +2 -2
  396. package/dist/report-render/views/chart-view.js +2 -2
  397. package/dist/report-render/views/lineage.d.ts +6 -6
  398. package/dist/report-render/views/lineage.js +2 -0
  399. package/dist/report-render/views/page-view.d.ts +2 -2
  400. package/dist/report-render/views/page-view.js +1 -0
  401. package/dist/report-render/views/prose.js +25 -8
  402. package/dist/report-render/views/references-view.js +12 -1
  403. package/dist/report-render/views/values.js +1 -1
  404. package/dist/runtime/assemble.d.ts +53 -26
  405. package/dist/runtime/assemble.js +103 -56
  406. package/dist/runtime/boot.d.ts +8 -7
  407. package/dist/runtime/boot.js +1 -1
  408. package/dist/runtime/connection-budget.d.ts +6 -6
  409. package/dist/runtime/connection-budget.js +1 -1
  410. package/dist/runtime/dbos.d.ts +29 -19
  411. package/dist/runtime/dbos.js +35 -20
  412. package/dist/runtime/result-serialization.js +18 -5
  413. package/dist/runtime/shutdown.d.ts +2 -2
  414. package/dist/sandbox/client.d.ts +7 -3
  415. package/dist/sandbox/cpu-files.d.ts +2 -2
  416. package/dist/sandbox/cpu-files.js +21 -4
  417. package/dist/sandbox/create-sandbox.d.ts +7 -8
  418. package/dist/sandbox/create-sandbox.js +6 -12
  419. package/dist/sandbox/docker-client.d.ts +48 -3
  420. package/dist/sandbox/docker-client.js +10 -6
  421. package/dist/sandbox/estimate-data-profile-resources.js +2 -7
  422. package/dist/sandbox/exec-outcome.d.ts +2 -2
  423. package/dist/sandbox/exec-outcome.js +1 -1
  424. package/dist/sandbox/exec.d.ts +10 -6
  425. package/dist/sandbox/exec.js +27 -12
  426. package/dist/sandbox/execution-id.js +14 -6
  427. package/dist/sandbox/farm.d.ts +2 -2
  428. package/dist/sandbox/farm.js +22 -27
  429. package/dist/sandbox/identity.d.ts +7 -0
  430. package/dist/sandbox/identity.js +14 -3
  431. package/dist/sandbox/image-packages.js +15 -27
  432. package/dist/sandbox/k8s-client.d.ts +35 -8
  433. package/dist/sandbox/k8s-client.js +6 -5
  434. package/dist/sandbox/labels.js +1 -0
  435. package/dist/sandbox/liveness.js +3 -1
  436. package/dist/sandbox/mount-plan.d.ts +10 -10
  437. package/dist/sandbox/mount-plan.js +13 -14
  438. package/dist/sandbox/notification-sweep.d.ts +4 -4
  439. package/dist/sandbox/notification-sweep.js +4 -7
  440. package/dist/sandbox/package-identity.d.ts +6 -13
  441. package/dist/sandbox/package-identity.js +46 -28
  442. package/dist/sandbox/reaper.d.ts +10 -10
  443. package/dist/sandbox/reaper.js +4 -6
  444. package/dist/sandbox/sandbox-error.d.ts +2 -9
  445. package/dist/sandbox/sandbox-error.js +21 -8
  446. package/dist/sandbox/sandbox-step-translate.d.ts +8 -5
  447. package/dist/sandbox/sandbox-step-translate.js +22 -8
  448. package/dist/sandbox/step-sandbox.d.ts +47 -0
  449. package/dist/sandbox/step-sandbox.js +53 -0
  450. package/dist/sandbox/types.d.ts +18 -19
  451. package/dist/sandbox/types.js +1 -1
  452. package/dist/schemas/artifact-manifest.d.ts +4 -4
  453. package/dist/schemas/data-profile-schemas.d.ts +343 -298
  454. package/dist/schemas/file-metadata.js +2 -4
  455. package/dist/schemas/plan-schemas.d.ts +31 -31
  456. package/dist/schemas/run-synthesis.d.ts +95 -26
  457. package/dist/schemas/run-synthesis.js +3 -1
  458. package/dist/schemas/validate-plan.d.ts +4 -4
  459. package/dist/schemas/validate-plan.js +17 -5
  460. package/dist/schemas/workflow-state.d.ts +19 -19
  461. package/dist/schemas/workflow-state.js +2 -2
  462. package/dist/state/active-turns.d.ts +36 -0
  463. package/dist/state/active-turns.js +67 -0
  464. package/dist/state/analyses-metrics.d.ts +8 -8
  465. package/dist/state/analyses-metrics.js +4 -4
  466. package/dist/state/analyses.d.ts +0 -14
  467. package/dist/state/analyses.js +0 -32
  468. package/dist/state/artifacts.d.ts +32 -19
  469. package/dist/state/artifacts.js +28 -5
  470. package/dist/state/data-profile.d.ts +2 -2
  471. package/dist/state/db.d.ts +12 -2
  472. package/dist/state/db.js +5 -0
  473. package/dist/state/edit-intents.d.ts +4 -0
  474. package/dist/state/edit-intents.js +71 -0
  475. package/dist/state/index.d.ts +4 -4
  476. package/dist/state/index.js +2 -2
  477. package/dist/state/init.d.ts +2 -1
  478. package/dist/state/init.js +5 -2
  479. package/dist/state/migrations/20260927120000_baseline.js +3 -1
  480. package/dist/state/migrations/20261026120000_add_the_edit_intents.d.ts +7 -0
  481. package/dist/state/migrations/20261026120000_add_the_edit_intents.js +21 -0
  482. package/dist/state/migrations/20261027120000_record_the_applied_memory_edits.d.ts +7 -0
  483. package/dist/state/migrations/20261027120000_record_the_applied_memory_edits.js +16 -0
  484. package/dist/state/migrations/20261027120100_store_the_authoring_results.d.ts +8 -0
  485. package/dist/state/migrations/20261027120100_store_the_authoring_results.js +20 -0
  486. package/dist/state/migrations/20261027120200_key_the_groups_of_a_turn.d.ts +7 -0
  487. package/dist/state/migrations/20261027120200_key_the_groups_of_a_turn.js +12 -0
  488. package/dist/state/migrations/20261027120300_mark_the_active_turn_of_a_thread.d.ts +7 -0
  489. package/dist/state/migrations/20261027120300_mark_the_active_turn_of_a_thread.js +11 -0
  490. package/dist/state/migrations/20261028120000_record_the_paused_work.d.ts +7 -0
  491. package/dist/state/migrations/20261028120000_record_the_paused_work.js +25 -0
  492. package/dist/state/migrations/20261028120100_end_the_suspended_runs.d.ts +8 -0
  493. package/dist/state/migrations/20261028120100_end_the_suspended_runs.js +13 -0
  494. package/dist/state/migrations/20261029120000_reference_the_run_mandate.d.ts +7 -0
  495. package/dist/state/migrations/20261029120000_reference_the_run_mandate.js +23 -0
  496. package/dist/state/migrations/20261029120100_record_the_run_session_of_a_pause.d.ts +7 -0
  497. package/dist/state/migrations/20261029120100_record_the_run_session_of_a_pause.js +11 -0
  498. package/dist/state/migrations/index.js +18 -0
  499. package/dist/state/paused-work.d.ts +52 -0
  500. package/dist/state/paused-work.js +105 -0
  501. package/dist/state/plans.d.ts +27 -8
  502. package/dist/state/plans.js +14 -11
  503. package/dist/state/purge-analysis.d.ts +6 -6
  504. package/dist/state/purge-analysis.js +10 -2
  505. package/dist/state/report-session-state.d.ts +43 -18
  506. package/dist/state/report-session-state.js +43 -4
  507. package/dist/state/report-versions.d.ts +16 -11
  508. package/dist/state/report-versions.js +5 -3
  509. package/dist/state/runs.d.ts +30 -19
  510. package/dist/state/runs.js +43 -51
  511. package/dist/state/schema.d.ts +18 -21
  512. package/dist/state/schema.js +4 -5
  513. package/dist/state/snapshot-parse.d.ts +2 -2
  514. package/dist/state/snapshot-parse.js +14 -8
  515. package/dist/state/step-executions.d.ts +20 -8
  516. package/dist/state/step-executions.js +6 -4
  517. package/dist/state/tool-outputs.d.ts +2 -2
  518. package/dist/state/tool-outputs.js +2 -1
  519. package/dist/state/vector-store.d.ts +16 -16
  520. package/dist/state/vector-store.js +11 -7
  521. package/dist/tasks/data-profile-absorb.d.ts +3 -3
  522. package/dist/tasks/data-profile-absorb.js +21 -16
  523. package/dist/tasks/data-profile-activity.d.ts +5 -5
  524. package/dist/tasks/data-profile-activity.js +5 -5
  525. package/dist/tasks/data-profile-index.d.ts +4 -4
  526. package/dist/tasks/data-profile-index.js +32 -17
  527. package/dist/tasks/data-profile-resolve.d.ts +8 -8
  528. package/dist/tasks/data-profile-resolve.js +88 -62
  529. package/dist/tasks/data-profile.d.ts +40 -31
  530. package/dist/tasks/data-profile.js +138 -95
  531. package/dist/tasks/extract-values.d.ts +26 -79
  532. package/dist/tasks/extract-values.js +48 -108
  533. package/dist/tasks/refresh-regulatory-corpus.d.ts +4 -20
  534. package/dist/tasks/refresh-regulatory-corpus.js +12 -8
  535. package/dist/tasks/regulatory-corpus-boot-refresh.d.ts +2 -2
  536. package/dist/tasks/regulatory-corpus-boot-refresh.js +12 -10
  537. package/dist/testing.d.ts +60 -0
  538. package/dist/testing.js +96 -0
  539. package/dist/tools/ad-hoc-router.d.ts +9 -9
  540. package/dist/tools/ad-hoc-router.js +65 -52
  541. package/dist/tools/analysis-invocation.d.ts +7 -0
  542. package/dist/tools/analysis-invocation.js +29 -5
  543. package/dist/tools/approval/contract.d.ts +8 -52
  544. package/dist/tools/approval/contract.js +7 -36
  545. package/dist/tools/approval/gateway.d.ts +27 -28
  546. package/dist/tools/approval/gateway.js +33 -130
  547. package/dist/tools/approval/queries.d.ts +6 -11
  548. package/dist/tools/approval/queries.js +43 -29
  549. package/dist/tools/approval/uuidv7.js +2 -2
  550. package/dist/tools/bio/chembl.d.ts +3 -3
  551. package/dist/tools/bio/chembl.js +10 -0
  552. package/dist/tools/bio/comptox.d.ts +25 -8
  553. package/dist/tools/bio/comptox.js +4 -2
  554. package/dist/tools/bio/drug-gene-interactions.d.ts +27 -17
  555. package/dist/tools/bio/drug-gene-interactions.js +11 -8
  556. package/dist/tools/bio/gene-disease-evidence.d.ts +61 -15
  557. package/dist/tools/bio/gene-disease-evidence.js +10 -6
  558. package/dist/tools/bio/gene-preclinical-profile.d.ts +11 -11
  559. package/dist/tools/bio/keys.d.ts +2 -2
  560. package/dist/tools/bio/keys.js +3 -3
  561. package/dist/tools/bio/lookup-annotation.d.ts +5 -5
  562. package/dist/tools/bio/lookup-annotation.js +3 -0
  563. package/dist/tools/bio/opentargets.d.ts +1 -1
  564. package/dist/tools/bio/opentargets.js +6 -0
  565. package/dist/tools/bio/pubchem.d.ts +2 -2
  566. package/dist/tools/bio/pubchem.js +6 -0
  567. package/dist/tools/bio/pubmed.d.ts +26 -16
  568. package/dist/tools/bio/pubmed.js +9 -3
  569. package/dist/tools/bio/search-clinical-trials.d.ts +4 -4
  570. package/dist/tools/bio/search-clinical-trials.js +5 -1
  571. package/dist/tools/bio/search-faers.d.ts +2 -2
  572. package/dist/tools/bio/search-faers.js +1 -1
  573. package/dist/tools/bio/search-gene.d.ts +2 -2
  574. package/dist/tools/bio/search-gene.js +1 -0
  575. package/dist/tools/bio/search-geo-datasets.d.ts +4 -4
  576. package/dist/tools/bio/search-geo-datasets.js +5 -5
  577. package/dist/tools/bio/search-interactions.d.ts +1 -1
  578. package/dist/tools/bio/search-patents.d.ts +28 -22
  579. package/dist/tools/bio/search-patents.js +20 -17
  580. package/dist/tools/bio/search-protein.d.ts +2 -2
  581. package/dist/tools/bio/search-protein.js +1 -1
  582. package/dist/tools/bio/search-regulatory-approvals.d.ts +64 -18
  583. package/dist/tools/bio/search-regulatory-approvals.js +21 -16
  584. package/dist/tools/bio/target-safety.d.ts +8 -8
  585. package/dist/tools/bio/target-safety.js +11 -6
  586. package/dist/tools/capability-data.d.ts +9 -5
  587. package/dist/tools/capability-data.js +2 -1
  588. package/dist/tools/define-tool.d.ts +55 -46
  589. package/dist/tools/define-tool.js +39 -27
  590. package/dist/tools/display/normalize-echart-spec.d.ts +2 -2
  591. package/dist/tools/display/normalize-echart-spec.js +51 -27
  592. package/dist/tools/display/show-user.d.ts +2 -2
  593. package/dist/tools/display/show-user.js +1 -1
  594. package/dist/tools/execute-analysis.d.ts +19 -10
  595. package/dist/tools/execute-analysis.js +83 -62
  596. package/dist/tools/knowledge/check.d.ts +166 -44
  597. package/dist/tools/knowledge/check.js +5 -3
  598. package/dist/tools/knowledge/client.d.ts +31 -62
  599. package/dist/tools/knowledge/client.js +44 -27
  600. package/dist/tools/knowledge/environment.d.ts +6 -6
  601. package/dist/tools/knowledge/environment.js +18 -7
  602. package/dist/tools/knowledge/index.d.ts +2 -2
  603. package/dist/tools/knowledge/index.js +9 -9
  604. package/dist/tools/knowledge/local-slots.d.ts +4 -4
  605. package/dist/tools/knowledge/local-slots.js +11 -4
  606. package/dist/tools/knowledge/pin.d.ts +2 -2
  607. package/dist/tools/knowledge/recommend.d.ts +20 -45
  608. package/dist/tools/knowledge/recommend.js +27 -19
  609. package/dist/tools/knowledge/situation.d.ts +40 -40
  610. package/dist/tools/knowledge/situation.js +2 -9
  611. package/dist/tools/knowledge/skeleton.d.ts +4 -4
  612. package/dist/tools/knowledge/skeleton.js +10 -11
  613. package/dist/tools/knowledge/template.d.ts +20 -18
  614. package/dist/tools/knowledge/template.js +38 -32
  615. package/dist/tools/lib/alphafold-client.js +2 -1
  616. package/dist/tools/lib/amass-client.d.ts +28 -28
  617. package/dist/tools/lib/amass-client.js +20 -10
  618. package/dist/tools/lib/api-utils.d.ts +13 -3
  619. package/dist/tools/lib/api-utils.js +17 -3
  620. package/dist/tools/lib/bgee-client.d.ts +6 -6
  621. package/dist/tools/lib/bgee-client.js +16 -10
  622. package/dist/tools/lib/cbioportal-client.d.ts +4 -4
  623. package/dist/tools/lib/cbioportal-client.js +9 -8
  624. package/dist/tools/lib/chembl-client.d.ts +14 -14
  625. package/dist/tools/lib/chembl-client.js +11 -4
  626. package/dist/tools/lib/clinical-benchmarks-client.d.ts +4 -4
  627. package/dist/tools/lib/clinical-benchmarks-client.js +4 -7
  628. package/dist/tools/lib/clinical-trials-client.d.ts +18 -18
  629. package/dist/tools/lib/clinical-trials-client.js +10 -10
  630. package/dist/tools/lib/clinvar-client.d.ts +2 -2
  631. package/dist/tools/lib/clinvar-client.js +6 -6
  632. package/dist/tools/lib/ctx-ops.d.ts +23 -23
  633. package/dist/tools/lib/ctx-ops.js +13 -10
  634. package/dist/tools/lib/dgidb-client.d.ts +6 -6
  635. package/dist/tools/lib/dgidb-client.js +10 -12
  636. package/dist/tools/lib/disgenet-client.d.ts +4 -4
  637. package/dist/tools/lib/ema-client.d.ts +2 -2
  638. package/dist/tools/lib/ensembl-client.d.ts +4 -4
  639. package/dist/tools/lib/ensembl-client.js +5 -4
  640. package/dist/tools/lib/gwas-catalog-client.d.ts +4 -4
  641. package/dist/tools/lib/gwas-catalog-client.js +17 -17
  642. package/dist/tools/lib/html-text.d.ts +6 -0
  643. package/dist/tools/lib/html-text.js +9 -0
  644. package/dist/tools/lib/identifier-resolver.d.ts +4 -4
  645. package/dist/tools/lib/identifier-resolver.js +7 -3
  646. package/dist/tools/lib/impc-client.d.ts +8 -8
  647. package/dist/tools/lib/impc-client.js +46 -35
  648. package/dist/tools/lib/iuphar-client.d.ts +2 -2
  649. package/dist/tools/lib/iuphar-client.js +7 -16
  650. package/dist/tools/lib/monarch-client.d.ts +4 -4
  651. package/dist/tools/lib/openfda-client.d.ts +22 -22
  652. package/dist/tools/lib/openfda-client.js +23 -22
  653. package/dist/tools/lib/opentargets-client.d.ts +12 -12
  654. package/dist/tools/lib/pathway-client.d.ts +4 -4
  655. package/dist/tools/lib/pathway-client.js +15 -19
  656. package/dist/tools/lib/pharmgkb-client.d.ts +2 -2
  657. package/dist/tools/lib/pharmgkb-client.js +1 -1
  658. package/dist/tools/lib/protein-family-modality.d.ts +2 -2
  659. package/dist/tools/lib/protein-family-modality.js +0 -2
  660. package/dist/tools/lib/protein-family-normalize.js +7 -0
  661. package/dist/tools/lib/pubchem-client.d.ts +2 -2
  662. package/dist/tools/lib/pubchem-client.js +1 -0
  663. package/dist/tools/lib/pubchem-ops.d.ts +4 -4
  664. package/dist/tools/lib/pubchem-ops.js +8 -0
  665. package/dist/tools/lib/pubmed-client.d.ts +9 -9
  666. package/dist/tools/lib/pubmed-client.js +1 -1
  667. package/dist/tools/lib/string-client.d.ts +6 -6
  668. package/dist/tools/lib/uniprot-client.d.ts +8 -8
  669. package/dist/tools/lib/uniprot-client.js +5 -1
  670. package/dist/tools/memory/update-working-memory.d.ts +16 -13
  671. package/dist/tools/memory/update-working-memory.js +21 -3
  672. package/dist/tools/read-tool-output.js +8 -2
  673. package/dist/tools/registry.d.ts +2 -2
  674. package/dist/tools/report-authoring/authoring-tools.d.ts +54 -23
  675. package/dist/tools/report-authoring/authoring-tools.js +128 -62
  676. package/dist/tools/report-session/derive-table.d.ts +19 -59
  677. package/dist/tools/report-session/derive-table.js +120 -122
  678. package/dist/tools/report-session/examine-page.d.ts +6 -6
  679. package/dist/tools/report-session/examine-page.js +14 -12
  680. package/dist/tools/report-session/list-artifacts.d.ts +6 -6
  681. package/dist/tools/report-session/list-artifacts.js +5 -5
  682. package/dist/tools/report-session/page-faults.d.ts +6 -6
  683. package/dist/tools/report-session/page-faults.js +3 -1
  684. package/dist/tools/report-session/preview-report.d.ts +4 -3
  685. package/dist/tools/report-session/preview-report.js +26 -7
  686. package/dist/tools/report-session/record-version.d.ts +9 -4
  687. package/dist/tools/report-session/record-version.js +16 -9
  688. package/dist/tools/report-session/session-page-publisher.d.ts +6 -6
  689. package/dist/tools/research/generate-analogy-report.d.ts +14 -7
  690. package/dist/tools/research/generate-analogy-report.js +80 -76
  691. package/dist/tools/research/generate-plan.d.ts +16 -16
  692. package/dist/tools/research/generate-plan.js +410 -374
  693. package/dist/tools/research/guarded-address.js +3 -2
  694. package/dist/tools/research/inspect-data-profile.d.ts +27 -20
  695. package/dist/tools/research/inspect-data-profile.js +26 -25
  696. package/dist/tools/research/inspect-run.d.ts +54 -27
  697. package/dist/tools/research/inspect-run.js +50 -40
  698. package/dist/tools/research/literature-reviewer.d.ts +8 -7
  699. package/dist/tools/research/literature-reviewer.js +29 -28
  700. package/dist/tools/research/search-arxiv.d.ts +1 -1
  701. package/dist/tools/research/search-arxiv.js +1 -1
  702. package/dist/tools/research/search-github-repos.d.ts +10 -7
  703. package/dist/tools/research/search-github-repos.js +25 -22
  704. package/dist/tools/research/search-semantic-scholar.js +1 -1
  705. package/dist/tools/research/searxng-engine.d.ts +2 -2
  706. package/dist/tools/research/searxng-engine.js +6 -4
  707. package/dist/tools/research/web-fetch.d.ts +24 -21
  708. package/dist/tools/research/web-fetch.js +65 -74
  709. package/dist/tools/research/web-search.d.ts +26 -17
  710. package/dist/tools/research/web-search.js +26 -21
  711. package/dist/tools/sandbox/link-packages.d.ts +11 -7
  712. package/dist/tools/sandbox/link-packages.js +11 -8
  713. package/dist/tools/sandbox/list-available-packages.d.ts +17 -8
  714. package/dist/tools/sandbox/list-available-packages.js +31 -25
  715. package/dist/tools/sandbox/list-available-refs.d.ts +17 -14
  716. package/dist/tools/sandbox/list-available-refs.js +61 -36
  717. package/dist/tools/sandbox/report-blocker.d.ts +30 -37
  718. package/dist/tools/sandbox/report-blocker.js +23 -73
  719. package/dist/tools/sandbox/skills.d.ts +16 -12
  720. package/dist/tools/sandbox/skills.js +16 -12
  721. package/dist/tools/sandbox/submit-file-metadata.d.ts +12 -9
  722. package/dist/tools/sandbox/submit-file-metadata.js +18 -21
  723. package/dist/tools/start-report-session.d.ts +13 -5
  724. package/dist/tools/start-report-session.js +35 -8
  725. package/dist/tools/terminal-text.d.ts +5 -2
  726. package/dist/tools/terminal-text.js +35 -3
  727. package/dist/tools/workspace/decision-record.d.ts +4 -4
  728. package/dist/tools/workspace/decision-record.js +23 -13
  729. package/dist/tools/workspace/edit-file.d.ts +59 -20
  730. package/dist/tools/workspace/edit-file.js +81 -16
  731. package/dist/tools/workspace/execute-command.d.ts +15 -13
  732. package/dist/tools/workspace/execute-command.js +11 -9
  733. package/dist/tools/workspace/file-stat.d.ts +6 -3
  734. package/dist/tools/workspace/grep.d.ts +10 -7
  735. package/dist/tools/workspace/grep.js +9 -3
  736. package/dist/tools/workspace/list-files.d.ts +6 -3
  737. package/dist/tools/workspace/mutator.d.ts +28 -15
  738. package/dist/tools/workspace/mutator.js +107 -53
  739. package/dist/tools/workspace/read-file.d.ts +8 -5
  740. package/dist/tools/workspace/result-bounds.d.ts +5 -5
  741. package/dist/tools/workspace/result-bounds.js +4 -2
  742. package/dist/tools/workspace/run-exec.d.ts +2 -2
  743. package/dist/tools/workspace/run-exec.js +3 -3
  744. package/dist/tools/workspace/scan-inputs.d.ts +8 -5
  745. package/dist/tools/workspace/scan-inputs.js +17 -5
  746. package/dist/tools/workspace/show-file.d.ts +1 -1
  747. package/dist/tools/workspace/show-file.js +2 -1
  748. package/dist/tools/workspace/show-plan.d.ts +8 -5
  749. package/dist/tools/workspace/show-plan.js +9 -8
  750. package/dist/tools/workspace/workspace-search.d.ts +41 -13
  751. package/dist/tools/workspace/workspace-search.js +27 -14
  752. package/dist/tools/workspace/write-file.d.ts +9 -7
  753. package/dist/workflows/execute-analysis-scheduler.d.ts +9 -9
  754. package/dist/workflows/execute-analysis-scheduler.js +6 -3
  755. package/dist/workflows/execute-analysis.d.ts +46 -62
  756. package/dist/workflows/execute-analysis.js +137 -219
  757. package/dist/workflows/pause.d.ts +71 -0
  758. package/dist/workflows/pause.js +173 -0
  759. package/dist/workflows/sandbox-step.d.ts +38 -61
  760. package/dist/workflows/sandbox-step.js +99 -106
  761. package/dist/workflows/test/sql-writes.d.ts +21 -0
  762. package/dist/workflows/test/sql-writes.js +36 -0
  763. package/dist/workspace/filesystem.d.ts +6 -6
  764. package/dist/workspace/filesystem.js +10 -8
  765. package/dist/workspace/paths.d.ts +1 -1
  766. package/dist/workspace/paths.js +15 -4
  767. package/dist/workspace/search-config.d.ts +2 -2
  768. package/dist/workspace/search-config.js +1 -1
  769. package/package.json +21 -22
  770. package/dist/loop/call-guard.d.ts +0 -50
  771. package/dist/loop/call-guard.js +0 -90
  772. package/dist/loop/continue-agent.d.ts +0 -40
  773. package/dist/loop/continue-agent.js +0 -38
  774. package/dist/loop/genai-spans.d.ts +0 -47
  775. package/dist/loop/genai-spans.js +0 -134
  776. package/dist/loop/run-agent.d.ts +0 -245
  777. package/dist/loop/run-agent.js +0 -1124
  778. package/dist/loop/run-step.d.ts +0 -29
  779. package/dist/loop/run-step.js +0 -34
  780. package/dist/loop/run-to-terminal.d.ts +0 -66
  781. package/dist/loop/run-to-terminal.js +0 -93
  782. package/dist/loop/tool-mask.d.ts +0 -23
  783. package/dist/loop/tool-mask.js +0 -46
  784. package/dist/providers/streaming-chat.d.ts +0 -32
  785. package/dist/providers/streaming-chat.js +0 -91
  786. package/dist/tasks/derive-table-exec.d.ts +0 -54
  787. package/dist/tasks/derive-table-exec.js +0 -86
  788. package/dist/workflows/suspension.d.ts +0 -32
  789. package/dist/workflows/suspension.js +0 -38
@@ -1,26 +1,28 @@
1
1
  /**
2
- * The chat turn of a host: a turn is `runChatTurn`, which is `openChatTurn` and then the `run` of the
3
- * open turn. `prepareChatTurn` is the first step of the open. The host gives only its transport
4
- * values, and the harness stores the opening, each round, and the outcome.
2
+ * The run of one chat turn: `runOpenTurn` runs the root loop over a prepared turn, stores the opening and each
3
+ * round, and closes the turn with its outcome. A transport gives the surface and the store of the turn. The turn
4
+ * workflow (`chat-turn-workflow.ts`) gives the transport of a workflow, and a host reaches the turn through it.
5
5
  */
6
- import type { Pool } from "pg";
6
+ import type { LanguageModelMiddleware, ModelMessage, UIMessageStreamWriter } from "ai";
7
7
  import type { RequestSession } from "../auth/types.js";
8
8
  import type { UsageRecorder } from "../billing/usage-recorder.js";
9
9
  import type { TokenUsageRollup } from "../contracts/usage.js";
10
- import type { DbError } from "../lib/db-result.js";
11
- import { type AgentFinish } from "../loop/run-agent.js";
10
+ import { type Connectable, type DbError } from "../lib/db-result.js";
11
+ import type { Querier } from "../state/db.js";
12
+ import { type AgentFinish, type LoopOptions } from "../loop/run-loop.js";
12
13
  import type { AgentDefinition, EmitFn } from "../loop/types.js";
14
+ import type { ConversationDisplayRecorder } from "../memory/conversation-display-recorder.js";
13
15
  import { type ThreadType } from "../memory/thread-store.js";
14
- import type { AgentChat, PromptCachePolicy } from "../providers/types.js";
16
+ import type { ChatProvider, PromptCachePolicy } from "../providers/types.js";
15
17
  import type { ThreadAgentResolver } from "../runtime/assemble.js";
16
- import type { AskApproval, AskRequest } from "../tools/approval/contract.js";
18
+ import type { AskGateway } from "../tools/approval/gateway.js";
17
19
  import { type AssembledMessages } from "./message-assembly.js";
18
20
  import type { Logger } from "../lib/logger.js";
19
21
  import { type ProvenanceSeam } from "../provenance/seam.js";
20
- export interface PrepareChatTurnDeps {
22
+ export type PrepareChatTurnDeps = {
21
23
  /** Operational logging seam; omitted falls back to no-op. */
22
24
  readonly logger?: Logger;
23
- readonly pool: Pool;
25
+ readonly pool: Querier & Connectable;
24
26
  /**
25
27
  * The provenance seam. The turn reads its session emit member, and no other
26
28
  * member. The turn holds the one site that writes the conversation thread of
@@ -31,58 +33,65 @@ export interface PrepareChatTurnDeps {
31
33
  * of a report session.
32
34
  */
33
35
  readonly provenance?: ProvenanceSeam;
34
- }
35
- export interface PrepareChatTurnParams {
36
+ };
37
+ export type PrepareChatTurnParams = {
36
38
  readonly analysisId: string;
37
39
  readonly threadId: string;
38
40
  readonly userInput: string;
39
- }
41
+ };
40
42
  export type PrepareChatTurnResult = ({
41
43
  readonly kind: "ok";
42
44
  readonly threadType: ThreadType;
43
45
  } & AssembledMessages) | {
44
46
  readonly kind: "not_found";
45
47
  };
48
+ /** A prepared turn: the type of its thread, the view of the thread, and the opening. */
49
+ export type PreparedChatTurn = Extract<PrepareChatTurnResult, {
50
+ kind: "ok";
51
+ }>;
46
52
  /**
47
53
  * Prepare one chat turn: resolve thread ownership, seed the title, load
48
54
  * analysis status, and assemble the message array. Input sanitization stays
49
55
  * inside {@link assembleMessages} (applied once to the new user input only).
50
56
  */
51
57
  export declare function prepareChatTurn(deps: PrepareChatTurnDeps, params: PrepareChatTurnParams): Promise<PrepareChatTurnResult>;
52
- export interface RunChatTurnDeps extends PrepareChatTurnDeps {
58
+ /**
59
+ * Open the thread of a turn: check that the analysis owns it, make it when it is absent, and seed its title. A
60
+ * thread that a different analysis owns is `not_found`.
61
+ */
62
+ export declare function openThread(deps: PrepareChatTurnDeps, params: PrepareChatTurnParams): Promise<{
63
+ readonly kind: "ok";
64
+ readonly threadType: ThreadType;
65
+ } | {
66
+ readonly kind: "not_found";
67
+ }>;
68
+ /** The analysis context and the run activity of a turn. A failed read gives the fallback of its kind. */
69
+ export declare function readTurnContext(pool: Querier, analysisId: string): Promise<{
70
+ readonly analysisContext: string | null;
71
+ readonly runActivityContext: string;
72
+ }>;
73
+ /** The runtime values of a turn. `assembleCoreRuntime` gives them to the turn workflow. */
74
+ export type RunChatTurnDeps = PrepareChatTurnDeps & {
53
75
  /** The agent of a turn comes from the thread type, which only the preparation knows. */
54
76
  readonly agents: ThreadAgentResolver;
55
- }
77
+ /** The model of the conversation. A host that switches the model swaps the provider between two turns. */
78
+ readonly provider: ChatProvider;
79
+ /** Each model call of the turn reaches it, the calls of a sub-agent included. */
80
+ readonly usageRecorder: UsageRecorder;
81
+ /** The ledger of the asks of a turn. Absent, the loop denies each call that asks for an approval. */
82
+ readonly askGateway?: AskGateway;
83
+ };
56
84
  /**
57
85
  * The session of a turn without its provenance. The harness sets the provenance from the agent that
58
86
  * it resolves, because only the preparation knows the thread type.
59
87
  */
60
88
  export type ChatTurnSession = Omit<RequestSession, "provenance">;
61
89
  /** What opens a turn: the thread and the user input. */
62
- export interface OpenChatTurnParams {
90
+ export type OpenChatTurnParams = {
63
91
  readonly analysisId: string;
64
92
  readonly threadId: string;
65
93
  readonly userInput: string;
66
- }
67
- /** The transport values of a turn that is open. */
68
- export interface RunOpenChatTurnParams {
69
- readonly session: ChatTurnSession;
70
- /** Makes the provider of the turn over the emit sink of the display recorder. */
71
- readonly chat: (emit: EmitFn) => AgentChat;
72
- readonly emit: EmitFn;
73
- readonly signal: AbortSignal;
74
- readonly usageRecorder: UsageRecorder;
75
- /** The approval binding. It gets the emit sink of the display recorder, thus the display records each `data-ask`. */
76
- readonly ask?: (request: AskRequest, emit: EmitFn) => Promise<AskApproval>;
77
- /** Who sent the user message. */
78
- readonly author?: string;
79
- /** When the host opened the turn. Absent counts from the call to {@link openChatTurn}. */
80
- readonly startedAtMs?: number;
81
- /** The cache policy of the root loop. Absent gives {@link CONVERSATION_PROMPT_CACHE}. */
82
- readonly promptCache?: PromptCachePolicy;
83
- }
84
- /** The values of one whole turn. */
85
- export type RunChatTurnParams = OpenChatTurnParams & RunOpenChatTurnParams;
94
+ };
86
95
  export type ChatTurnOutcome = {
87
96
  readonly status: "done";
88
97
  readonly finish: AgentFinish;
@@ -92,6 +101,7 @@ export type ChatTurnOutcome = {
92
101
  } | {
93
102
  readonly status: "failed";
94
103
  readonly reason: string;
104
+ readonly code: string;
95
105
  readonly cause: unknown;
96
106
  };
97
107
  /** A turn that ended before its run. It wrote no row and no turn record. */
@@ -104,7 +114,7 @@ export type ChatTurnRefusal = {
104
114
  readonly kind: "agent_unresolved";
105
115
  readonly threadType: ThreadType;
106
116
  };
107
- export interface ChatTurnRan {
117
+ export type ChatTurnRan = {
108
118
  readonly kind: "ran";
109
119
  readonly outcome: ChatTurnOutcome;
110
120
  /** True when the opening of the turn landed. */
@@ -115,25 +125,43 @@ export interface ChatTurnRan {
115
125
  readonly turnUsage?: TokenUsageRollup;
116
126
  /** The final text of a run that returned. */
117
127
  readonly fallbackText?: string;
118
- }
119
- export type ChatTurnResult = ChatTurnRefusal | ChatTurnRan;
120
- /**
121
- * A turn that is prepared, with its agent resolved. Call `run` one time: each call stores a new
122
- * opening of the same user message.
123
- */
124
- export interface OpenChatTurn {
125
- readonly kind: "ready";
126
- /** The agent that runs the turn. The harness stamps its provenance on the session of the run. */
127
- readonly agent: AgentDefinition;
128
- readonly run: (params: RunOpenChatTurnParams) => Promise<ChatTurnRan>;
129
- }
130
- /**
131
- * Open one chat turn: prepare it and resolve its agent. A refusal comes back before any row of the
132
- * turn exists, thus a host can answer it before it starts a stream.
133
- */
134
- export declare function openChatTurn(deps: RunChatTurnDeps, params: OpenChatTurnParams): Promise<OpenChatTurn | ChatTurnRefusal>;
128
+ };
129
+ /** How a turn reaches its surface and its store. A turn workflow streams to its durable stream and runs each write as a step. */
130
+ export type TurnTransport = {
131
+ readonly signal: AbortSignal;
132
+ /** The emit sink of the loop. */
133
+ readonly emit: EmitFn;
134
+ /** Receives each text delta of the root reply. A turn workflow gives none, because its model calls stream the text. */
135
+ readonly onText?: (text: string) => void | Promise<void>;
136
+ /** The durable stream that the model calls write their text to. */
137
+ readonly chatStream?: string;
138
+ /** Receives the chunks of each tool step, on a replay too. */
139
+ readonly toolWriter?: UIMessageStreamWriter;
140
+ readonly recorder: ConversationDisplayRecorder;
141
+ /** Runs one write of the turn. A turn workflow runs it as a step. */
142
+ readonly durably: <T>(name: string, write: () => Promise<T>) => Promise<T>;
143
+ /** The key of the group of the turn at an index, thus a write that runs again stores nothing. */
144
+ readonly groupKey?: (index: number) => string;
145
+ /** Called when the display starts a new assistant message, after a marker. */
146
+ readonly announce?: (messageId: string) => Promise<void>;
147
+ /** Model middleware inside the step of each model call. */
148
+ readonly modelMiddleware?: readonly LanguageModelMiddleware[];
149
+ /** The decision of the user on a call whose tool asks for approval. Absent: the loop denies such a call. */
150
+ readonly approve?: LoopOptions["approve"];
151
+ /** The pause of the turn. A turn workflow gives it. Absent: each failure of a request fails the turn. */
152
+ readonly pause?: LoopOptions["pause"];
153
+ };
154
+ /** The values of a turn that its run reads. */
155
+ export type TurnRunParams = {
156
+ readonly session: ChatTurnSession;
157
+ readonly author?: string;
158
+ readonly startedAtMs: number;
159
+ readonly promptCache?: PromptCachePolicy;
160
+ };
135
161
  /**
136
- * Run one chat turn: open it, store its opening, run the root loop with a round sink that stores
137
- * each round, and close the turn with its outcome.
162
+ * Run a prepared turn: store its opening, run the root loop with a round sink that stores each round, and close the
163
+ * turn with its outcome.
138
164
  */
139
- export declare function runChatTurn(deps: RunChatTurnDeps, params: RunChatTurnParams): Promise<ChatTurnResult>;
165
+ export declare function runOpenTurn(deps: RunChatTurnDeps, turn: OpenChatTurnParams, prepared: PreparedChatTurn, agent: AgentDefinition, params: TurnRunParams, transport: TurnTransport): Promise<ChatTurnRan>;
166
+ /** The sanitized text of the user message, thus the display never holds a secret that the model does not see. */
167
+ export declare function userTextOf(message: ModelMessage): string;
@@ -1,24 +1,25 @@
1
1
  /**
2
- * The chat turn of a host: a turn is `runChatTurn`, which is `openChatTurn` and then the `run` of the
3
- * open turn. `prepareChatTurn` is the first step of the open. The host gives only its transport
4
- * values, and the harness stores the opening, each round, and the outcome.
2
+ * The run of one chat turn: `runOpenTurn` runs the root loop over a prepared turn, stores the opening and each
3
+ * round, and closes the turn with its outcome. A transport gives the surface and the store of the turn. The turn
4
+ * workflow (`chat-turn-workflow.ts`) gives the transport of a workflow, and a host reaches the turn through it.
5
5
  */
6
+ import { presentFirst } from "../lib/present.js";
7
+ import { errorNameOf } from "../lib/thrown.js";
6
8
  import { unwrapOrThrow } from "../lib/result.js";
7
9
  import { rulesForContextWindow } from "../loop/compaction.js";
8
- import { finalText, runAgent } from "../loop/run-agent.js";
9
- import { passthroughStep } from "../loop/run-step.js";
10
+ import { finalText, runLoop } from "../loop/run-loop.js";
11
+ import { isTurnCredentialMissing } from "../loop/turn-credentials.js";
10
12
  import { compactionExchangeOf, syntheticUserMessage } from "../memory/ai-sdk-message-storage.js";
11
- import { createConversationDisplayRecorder } from "../memory/conversation-display-recorder.js";
12
13
  import { deriveThreadTitle } from "../memory/derive-thread-title.js";
13
14
  import { conversationRecordTurn, createThreadHistory } from "../memory/thread-history.js";
14
15
  import { createThreadStore } from "../memory/thread-store.js";
16
+ import { isWorkflowCancellation } from "../runtime/dbos.js";
15
17
  import { createWorkingMemory } from "../memory/working-memory.js";
16
- import { findProviderError } from "../providers/errors.js";
18
+ import { findProviderError, modelFailureOf } from "../providers/errors.js";
17
19
  import { MEMORY_COMPACTION_REQUEST, SUMMARY_COMPACTION_REQUEST } from "../prompts/compaction.js";
18
20
  import { CONVERSATION_PROMPT_CACHE } from "../providers/prompt-cache.js";
19
21
  import { loadAnalysisStatus, queryNonTerminalRunsByAnalysis } from "../state/index.js";
20
22
  import { createToolOutputStore } from "../state/tool-outputs.js";
21
- import { suspensionOfFailure } from "../workflows/suspension.js";
22
23
  import { assembleMessages, contextRecordsFor } from "./message-assembly.js";
23
24
  import { renderRunActivity, renderRunActivityUnavailable, RUN_ACTIVITY_DETAIL_LIMIT } from "./run-activity.js";
24
25
  import { createNoopLogger } from "../lib/console-logger.js";
@@ -29,6 +30,28 @@ import { bindSessionEmit } from "../provenance/seam.js";
29
30
  * inside {@link assembleMessages} (applied once to the new user input only).
30
31
  */
31
32
  export async function prepareChatTurn(deps, params) {
33
+ const opened = await openThread(deps, params);
34
+ if (opened.kind === "not_found")
35
+ return opened;
36
+ const { pool } = deps;
37
+ const { analysisId, threadId, userInput } = params;
38
+ const assembled = await assembleMessages({
39
+ threadId,
40
+ threadType: opened.threadType,
41
+ analysisId,
42
+ userInput,
43
+ ...(await readTurnContext(pool, analysisId)),
44
+ history: createThreadHistory(pool),
45
+ workingMemory: createWorkingMemory(pool),
46
+ logger: deps.logger,
47
+ });
48
+ return { kind: "ok", threadType: opened.threadType, ...assembled };
49
+ }
50
+ /**
51
+ * Open the thread of a turn: check that the analysis owns it, make it when it is absent, and seed its title. A
52
+ * thread that a different analysis owns is `not_found`.
53
+ */
54
+ export async function openThread(deps, params) {
32
55
  const { pool } = deps;
33
56
  const { analysisId, threadId, userInput } = params;
34
57
  const logger = (deps.logger ?? createNoopLogger()).named("harness.chat");
@@ -80,69 +103,30 @@ export async function prepareChatTurn(deps, params) {
80
103
  catch (err) {
81
104
  logger.warn("title-seed failed (non-fatal)", logger.errorFields(err));
82
105
  }
83
- const assembled = await assembleMessages({
84
- threadId,
85
- threadType,
86
- analysisId,
87
- userInput,
88
- ...(await readTurnContext(pool, analysisId)),
89
- history: createThreadHistory(pool),
90
- workingMemory: createWorkingMemory(pool),
91
- ...(deps.logger ? { logger: deps.logger } : {}),
92
- });
93
- return { kind: "ok", threadType, ...assembled };
106
+ return { kind: "ok", threadType };
94
107
  }
95
108
  /** The analysis context and the run activity of a turn. A failed read gives the fallback of its kind. */
96
- async function readTurnContext(pool, analysisId) {
109
+ export async function readTurnContext(pool, analysisId) {
97
110
  const analysisState = await loadAnalysisStatus(pool, analysisId).unwrapOr(null);
98
111
  const runActivityContext = await queryNonTerminalRunsByAnalysis(pool, analysisId, RUN_ACTIVITY_DETAIL_LIMIT).match((activity) => renderRunActivity(activity), () => renderRunActivityUnavailable());
99
112
  return { analysisContext: analysisState?.context ?? null, runActivityContext };
100
113
  }
101
114
  /**
102
- * Open one chat turn: prepare it and resolve its agent. A refusal comes back before any row of the
103
- * turn exists, thus a host can answer it before it starts a stream.
104
- */
105
- export async function openChatTurn(deps, params) {
106
- const openedAtMs = Date.now();
107
- let prepared;
108
- try {
109
- prepared = await prepareChatTurn(deps, params);
110
- }
111
- catch (cause) {
112
- return { kind: "prepare_failed", cause };
113
- }
114
- if (prepared.kind === "not_found")
115
- return prepared;
116
- const agent = deps.agents.forThread(prepared.threadType);
117
- if (agent.isErr())
118
- return { kind: "agent_unresolved", threadType: prepared.threadType };
119
- const ready = prepared;
120
- return {
121
- kind: "ready",
122
- agent: agent.value,
123
- run: (run) => runOpenTurn(deps, params, ready, agent.value, { ...run, startedAtMs: run.startedAtMs ?? openedAtMs }),
124
- };
125
- }
126
- /**
127
- * Run one chat turn: open it, store its opening, run the root loop with a round sink that stores
128
- * each round, and close the turn with its outcome.
115
+ * Run a prepared turn: store its opening, run the root loop with a round sink that stores each round, and close the
116
+ * turn with its outcome.
129
117
  */
130
- export async function runChatTurn(deps, params) {
131
- const { analysisId, threadId, userInput, ...run } = params;
132
- const opened = await openChatTurn(deps, { analysisId, threadId, userInput });
133
- if (opened.kind !== "ready")
134
- return opened;
135
- return opened.run(run);
136
- }
137
- async function runOpenTurn(deps, turn, prepared, agent, params) {
118
+ export async function runOpenTurn(deps, turn, prepared, agent, params, transport) {
138
119
  const logger = (deps.logger ?? createNoopLogger()).named("harness.chat");
139
120
  const session = { ...params.session, provenance: { agentId: agent.id, callPath: [agent.id] } };
140
121
  const history = createThreadHistory(deps.pool, deps.logger);
141
- const recorder = createConversationDisplayRecorder({
142
- userText: userTextOf(prepared.userMessage),
143
- agentId: agent.id,
144
- sink: params.emit,
145
- });
122
+ const { recorder } = transport;
123
+ let groupIndex = 0;
124
+ /** The group with its key in the turn, when the transport keys its writes. */
125
+ const keyed = (group) => {
126
+ const index = groupIndex;
127
+ groupIndex += 1;
128
+ return transport.groupKey === undefined ? group : { ...group, key: transport.groupKey(index) };
129
+ };
146
130
  // The groups that did not land yet, in the order of the turn. A failed write keeps them for the next write.
147
131
  let pending = [];
148
132
  let startSeq;
@@ -153,9 +137,11 @@ async function runOpenTurn(deps, turn, prepared, agent, params) {
153
137
  // A turn that ends before its user message was sent has no rows to close.
154
138
  if (!opened() || (pending.length === 0 && close === undefined))
155
139
  return;
156
- const closing = close === undefined ? {} : { close };
157
- const write = startSeq === undefined ? { opening: pending[0], rounds: pending.slice(1), ...closing } : { startSeq, rounds: pending, ...closing };
158
- (await history.writeTurn(turn.threadId, write)).match((written) => {
140
+ const closing = close === undefined ? {} : { close: close.note === undefined ? close : { ...close, note: keyed(close.note) } };
141
+ const write = startSeq === undefined
142
+ ? { opening: presentFirst(pending, "the pending turn"), rounds: pending.slice(1), ...closing }
143
+ : { startSeq, rounds: pending, ...closing };
144
+ (await transport.durably("chat-turn.write", async () => await history.writeTurn(turn.threadId, write))).match((written) => {
159
145
  pending = [];
160
146
  startSeq = written.startSeq;
161
147
  storeError = undefined;
@@ -168,7 +154,8 @@ async function runOpenTurn(deps, turn, prepared, agent, params) {
168
154
  if (!opened() && round.messages[0] !== prepared.userMessage) {
169
155
  // A turn-start compaction comes before the user message, thus its rows land before the turn opens. A later
170
156
  // write cannot keep that order, thus a failed write is not tried again, and the next turn compacts again.
171
- const appended = await history.appendTurn(turn.threadId, { modelMessages: round.messages, displayMessages: recorder.takeRound(round.messages) });
157
+ const group = keyed({ modelMessages: round.messages, displayMessages: recorder.takeRound(round.messages) });
158
+ const appended = await transport.durably("chat-turn.compaction-write", async () => await history.appendTurn(turn.threadId, group));
172
159
  if (appended.isErr()) {
173
160
  logger.warn("chat turn compaction write failed", {
174
161
  threadId: turn.threadId,
@@ -179,28 +166,34 @@ async function runOpenTurn(deps, turn, prepared, agent, params) {
179
166
  return;
180
167
  }
181
168
  const author = params.author === undefined ? {} : { author: params.author };
182
- pending.push(opened()
169
+ const assistantBefore = recorder.assistantMessageId();
170
+ pending.push(keyed(opened()
183
171
  ? { modelMessages: round.messages, displayMessages: recorder.takeRound(round.messages) }
184
- : { modelMessages: round.messages, displayMessages: recorder.takeOpening(), ...author });
172
+ : { modelMessages: round.messages, displayMessages: recorder.takeOpening(), ...author }));
185
173
  await flush();
174
+ if (recorder.assistantMessageId() !== assistantBefore)
175
+ await transport.announce?.(recorder.assistantMessageId());
186
176
  };
187
- const { ask } = params;
188
- const compaction = compactionPolicy(deps, turn.analysisId, params, prepared.threadType, agent, recorder.emit);
177
+ const compaction = compactionPolicy(deps, turn.analysisId, prepared.threadType, agent);
189
178
  let outcome;
190
179
  let fallbackText;
191
180
  try {
192
- const run = await runAgent(agent, prepared.history, session, {
193
- provider: params.chat(recorder.emit),
194
- signal: params.signal,
195
- emit: recorder.emit,
196
- runStep: passthroughStep,
197
- usageRecorder: params.usageRecorder,
181
+ const run = await runLoop(agent, prepared.history, session, {
182
+ provider: deps.provider,
183
+ signal: transport.signal,
184
+ emit: transport.emit,
185
+ onText: transport.onText,
186
+ chatStream: transport.chatStream,
187
+ toolWriter: transport.toolWriter,
188
+ modelMiddleware: transport.modelMiddleware,
189
+ usageRecorder: deps.usageRecorder,
198
190
  toolOutputStore: createToolOutputStore(deps.pool),
199
191
  promptCache: params.promptCache ?? CONVERSATION_PROMPT_CACHE,
200
192
  turnInput: [prepared.userMessage, ...prepared.contextRecords],
201
- ...(compaction === undefined ? {} : { compaction }),
202
- ...(deps.logger === undefined ? {} : { logger: deps.logger }),
203
- ...(ask === undefined ? {} : { ask: (request) => ask(request, recorder.emit) }),
193
+ compaction,
194
+ logger: deps.logger,
195
+ approve: transport.approve,
196
+ pause: transport.pause,
204
197
  onRound: storeRound,
205
198
  });
206
199
  outcome = run.finish.reason === "aborted" ? { status: "aborted", finish: run.finish } : { status: "done", finish: run.finish };
@@ -209,65 +202,95 @@ async function runOpenTurn(deps, turn, prepared, agent, params) {
209
202
  fallbackText = finalText(run.messages.slice(prepared.history.length).filter((message) => compactionExchangeOf(message) === undefined));
210
203
  }
211
204
  catch (cause) {
205
+ // A canceled workflow writes nothing more: its recovery, or the stop of its host, closes the turn.
206
+ if (isWorkflowCancellation(cause))
207
+ throw cause;
212
208
  // A provider failure that races an abort stays a failure, thus both facts must hold.
213
- const aborted = params.signal.aborted && cause instanceof Error && cause.name === "AbortError";
214
- outcome = aborted ? { status: "aborted" } : { status: "failed", reason: failureReasonOf(cause), cause };
209
+ const aborted = transport.signal.aborted && errorNameOf(cause) === "AbortError";
210
+ outcome = aborted ? { status: "aborted" } : { status: "failed", reason: failureReasonOf(cause), code: failureCodeOf(cause), cause };
211
+ // A host gets the scrubbed text and the code of the failure. This record is the one place where the whole
212
+ // cause survives.
213
+ if (outcome.status === "failed")
214
+ logger.error("chat turn failed", { threadId: turn.threadId, code: outcome.code, ...logger.errorFields(cause) });
215
215
  }
216
216
  const durationMs = Date.now() - params.startedAtMs;
217
217
  const turnUsage = outcome.status === "failed" ? undefined : outcome.finish?.turnUsage;
218
218
  await flush({
219
219
  status: outcome.status,
220
- ...(outcome.status === "failed" ? { reason: outcome.reason, note: conversationRecordTurn(failureNote(outcome.reason)) } : {}),
221
- ...(outcome.status === "aborted" ? { note: interruptionNote() } : {}),
222
- ...(turnUsage === undefined ? {} : { turnUsage }),
220
+ reason: outcome.status === "failed" ? outcome.reason : undefined,
221
+ note: outcome.status === "failed" ? conversationRecordTurn(failureNote(outcome.reason)) : outcome.status === "aborted" ? interruptionNote() : undefined,
222
+ turnUsage,
223
223
  turnDurationMs: durationMs,
224
224
  });
225
+ const storeErrorField = storeError === undefined ? undefined : { storeError };
225
226
  return {
226
227
  kind: "ran",
227
228
  outcome,
228
229
  opened: startSeq !== undefined,
229
- ...(storeError === undefined ? {} : { storeError }),
230
230
  durationMs,
231
- ...(turnUsage === undefined ? {} : { turnUsage: { ...turnUsage } }),
232
- ...(fallbackText === undefined ? {} : { fallbackText }),
231
+ turnUsage: turnUsage === undefined ? undefined : { ...turnUsage },
232
+ fallbackText,
233
+ ...storeErrorField,
233
234
  };
234
235
  }
235
236
  /** The sanitized text of the user message, thus the display never holds a secret that the model does not see. */
236
- function userTextOf(message) {
237
+ export function userTextOf(message) {
237
238
  if (typeof message.content === "string")
238
239
  return message.content;
239
240
  return message.content.map((part) => (part.type === "text" ? part.text : "")).join("");
240
241
  }
241
242
  const WORKING_MEMORY_TOOL_ID = "update_working_memory";
242
- function compactionPolicy(deps, analysisId, params, threadType, agent, emit) {
243
+ function compactionPolicy(deps, analysisId, threadType, agent) {
243
244
  if (agent.compaction === undefined)
244
245
  return undefined;
245
246
  // A report thread reads a frozen copy of the working memory, thus its agent declares no memory tool.
246
247
  const remembers = agent.tools.some((tool) => tool.id === WORKING_MEMORY_TOOL_ID);
247
248
  const workingMemory = createWorkingMemory(deps.pool);
248
- // A streaming provider sends each text delta with no source, thus a delta of the summary would show as a reply.
249
- const provider = params.chat((event) => (event.type === "text-delta" ? undefined : emit(event)));
250
249
  return {
251
250
  // The capabilities are read for each turn, because a host can switch the model of the conversation between turns.
252
- ...rulesForContextWindow(agent.compaction, provider.capabilities.contextWindow),
253
- provider,
251
+ ...rulesForContextWindow(agent.compaction, deps.provider.capabilities.contextWindow),
254
252
  request: remembers ? MEMORY_COMPACTION_REQUEST : SUMMARY_COMPACTION_REQUEST,
255
253
  mask: remembers ? { allow: [WORKING_MEMORY_TOOL_ID] } : "none",
256
254
  keepFirstTurn: threadType === "report",
257
255
  recordsAfter: async (view) => contextRecordsFor({ threadType, analysisId, workingMemory, ...(await readTurnContext(deps.pool, analysisId)) }, view),
258
256
  };
259
257
  }
258
+ /**
259
+ * The machine code of a failure, which the end frame of a turn carries for a host. A turn workflow pauses on a
260
+ * suspend error, a refused or missing credential, and an outage, thus their codes come only from a turn with no
261
+ * workflow: the suspend reason of the host, `credential`, or `outage`. Each other provider error gives `provider`,
262
+ * and each other error gives `internal`.
263
+ */
264
+ function failureCodeOf(err) {
265
+ if (isTurnCredentialMissing(err))
266
+ return "credential";
267
+ const failure = modelFailureOf(err);
268
+ switch (failure.kind) {
269
+ case "billing":
270
+ return failure.reason;
271
+ case "credential":
272
+ return "credential";
273
+ case "outage":
274
+ return "outage";
275
+ case "other":
276
+ return findProviderError(err) === undefined ? "internal" : "provider";
277
+ }
278
+ }
260
279
  /** The reason of a failed turn. It never holds the error message, because each later turn sends the note to the vendor. */
261
280
  function failureReasonOf(err) {
262
- const suspension = suspensionOfFailure(err);
263
- if (suspension !== undefined)
264
- return suspension.reason;
265
- const providerError = findProviderError(err);
266
- if (providerError?.type === "auth")
267
- return "The model endpoint refused the credential.";
268
- if (providerError !== undefined)
269
- return "The model request failed.";
270
- return "The turn stopped on an internal error.";
281
+ if (isTurnCredentialMissing(err))
282
+ return "The turn has no credential of its user.";
283
+ const failure = modelFailureOf(err);
284
+ switch (failure.kind) {
285
+ case "billing":
286
+ return failure.reason;
287
+ case "credential":
288
+ return "The model endpoint refused the credential.";
289
+ case "outage":
290
+ return "The model request failed.";
291
+ case "other":
292
+ return findProviderError(err) === undefined ? "The turn stopped on an internal error." : "The model request failed.";
293
+ }
271
294
  }
272
295
  /**
273
296
  * The note of an aborted turn. Without it, the next turn reads the request of the aborted turn as open, and
@@ -38,6 +38,8 @@
38
38
  * form resolves to the same file in every frame, including the conversation agent's, so
39
39
  * the projection is unconditional.
40
40
  */
41
+ import { presentFirst } from "../lib/present.js";
42
+ import { collapseWhitespace } from "../lib/text.js";
41
43
  import { toAnalysisRootPath } from "../workspace/paths.js";
42
44
  import { profileCaveats, profileDimensions, profileFileRecords, profileGroups } from "./data-profile-view.js";
43
45
  /**
@@ -99,11 +101,11 @@ function clamp(text, max) {
99
101
  * keeps one record on one line.
100
102
  */
101
103
  function clip(text, max) {
102
- return clamp(text.replace(/\s+/g, " ").trim(), max);
104
+ return clamp(collapseWhitespace(text), max);
103
105
  }
104
106
  /** Non-empty, whitespace-collapsed value, or `undefined` — nulls and blanks read the same. */
105
107
  function present(value) {
106
- const flat = value?.replace(/\s+/g, " ").trim();
108
+ const flat = value === null || value === undefined ? undefined : collapseWhitespace(value);
107
109
  return flat ? flat : undefined;
108
110
  }
109
111
  /** `Homo sapiens (taxon 9606)`, plus a confidence marker when the profiler was unsure. */
@@ -128,9 +130,9 @@ function identityLine(result) {
128
130
  const identity = [
129
131
  [present(result.domain), present(result.subtype)].filter((f) => f !== undefined).join(" / ") || undefined,
130
132
  formatOrganism(result.organism),
131
- present(result.tissue) ? `tissue: ${present(result.tissue)}` : undefined,
132
- present(result.cellType) ? `cells: ${present(result.cellType)}` : undefined,
133
- present(result.condition) ? `condition: ${present(result.condition)}` : undefined,
133
+ present(result.tissue) ? `tissue: ${String(present(result.tissue))}` : undefined,
134
+ present(result.cellType) ? `cells: ${String(present(result.cellType))}` : undefined,
135
+ present(result.condition) ? `condition: ${String(present(result.condition))}` : undefined,
134
136
  ].filter((f) => f !== undefined);
135
137
  return `Dataset: ${identity.length > 0 ? identity.join(" — ") : clip(result.summary, MAX_IDENTITY_CHARS)}`;
136
138
  }
@@ -175,7 +177,7 @@ function formatCensus(view, group) {
175
177
  if (formats.length === 0)
176
178
  return present(view.format);
177
179
  if (formats.length === 1)
178
- return present(formats[0].format);
180
+ return present(presentFirst(formats, "the single group format").format);
179
181
  const shown = formats.slice(0, MAX_GROUP_FORMATS).map((entry) => `${entry.format} ${entry.count}`);
180
182
  return `${shown.join(", ")}${formats.length > shown.length ? `, +${formats.length - shown.length}` : ""}`;
181
183
  }
@@ -278,7 +280,7 @@ function caveatsSection(caveats, budget) {
278
280
  return line;
279
281
  }
280
282
  const room = budget - render([""]).length;
281
- return room >= MIN_PROSE_CHARS ? render([clamp(capped[0], room)]) : undefined;
283
+ return room >= MIN_PROSE_CHARS ? render([clamp(presentFirst(capped, "the shortened caveat"), room)]) : undefined;
282
284
  }
283
285
  /**
284
286
  * Fit the body sections into `budget`, in order, each one whole or absent.
@@ -380,7 +382,7 @@ export function buildDataProfileOrientation(result, analysisId, maxChars = DATA_
380
382
  // what remains, so the one line saying how much of the dataset is accounted for
381
383
  // cannot be the line the body's budget drops.
382
384
  const identityBudget = Math.max(0, Math.min(MAX_IDENTITY_CHARS, maxChars - (census ? census.length + 1 : 0)));
383
- const header = [clamp(identityLine(result), identityBudget), census].filter((line) => Boolean(line)).join("\n");
385
+ const header = [clamp(identityLine(result), identityBudget), census].flatMap((line) => (line ? [line] : [])).join("\n");
384
386
  const headerText = clamp(header, maxChars);
385
387
  const bodyBudget = maxChars - headerText.length - 1;
386
388
  if (bodyBudget <= 0)
@@ -13,7 +13,7 @@
13
13
  */
14
14
  import type { DataProfileDimension, DataProfileFile, DataProfileResult } from "../contracts/data-profile.js";
15
15
  /** A group as consumers read it, whether it was authored as a group or as a kind. */
16
- export interface ProfileGroupView {
16
+ export type ProfileGroupView = {
17
17
  readonly id: string;
18
18
  readonly name: string;
19
19
  readonly memberRepresents: string;
@@ -26,18 +26,18 @@ export interface ProfileGroupView {
26
26
  /** The scanner slots this group carries, on a groups-era row. */
27
27
  readonly slotIds?: readonly string[];
28
28
  readonly unclassified?: boolean;
29
- }
29
+ };
30
30
  /**
31
31
  * A dimension as consumers read it. `cardinalities` carries every number the
32
32
  * observations reported, side by side: there is no canonical count, and a single field
33
33
  * would be a silent judgement between disagreeing sources.
34
34
  */
35
- export interface ProfileDimensionView {
35
+ export type ProfileDimensionView = {
36
36
  readonly label: string;
37
37
  readonly cardinalities: readonly number[];
38
38
  readonly exampleValues: readonly string[];
39
39
  readonly description?: string;
40
- }
40
+ };
41
41
  /**
42
42
  * Every number the observations reported, side by side and de-duplicated.
43
43
  *