@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,15 +1,10 @@
1
1
  /**
2
- * Agent-loop seam — shared types.
3
- *
4
- * `runAgent` (run-agent.ts) is a pure-async function: it owns the message
5
- * loop and nothing else. Durability and streaming are *injected* — a
6
- * `RunStep` wraps each LLM/tool call (`passthroughStep` for chat, a
7
- * `DBOS.runStep` wrapper in PR #3) and an `EmitFn` is the flat event sink.
8
- * The loop body itself knows nothing about DBOS, HTTP, or memory.
2
+ * The shared types of the agent loop: the definition of an agent, its
3
+ * messages, and the flat event sink.
9
4
  */
10
5
  import type { ModelMessage } from "ai";
11
6
  import type { ToolCallDetail, ToolOutcome } from "../contracts/chat-events.js";
12
- import type { ChatStreamEvent } from "../providers/types.js";
7
+ import type { ChatStreamEvent, ProviderOptions } from "../providers/types.js";
13
8
  import type { Tool } from "../tools/define-tool.js";
14
9
  import type { CompactionRules } from "./compaction.js";
15
10
  /**
@@ -18,37 +13,37 @@ import type { CompactionRules } from "./compaction.js";
18
13
  */
19
14
  export type LoopMessage = ModelMessage;
20
15
  /**
21
- * Everything `runAgent` needs to drive one agent: identity, the system
16
+ * Everything the loop needs to drive one agent: identity, the system
22
17
  * prompt, the model id (provenance / metric label — the `ChatProvider`
23
18
  * owns the wire model), the tool surface, and the runaway-guard cap.
24
19
  */
25
- export interface AgentDefinition {
20
+ export type AgentDefinition = {
26
21
  readonly id: string;
27
22
  readonly systemPrompt: string;
28
23
  readonly model: string;
29
24
  readonly tools: readonly Tool[];
30
- /** Runaway guard: at the cap the loop runs up to two masked wrap-up requests, until it gets a text answer. */
25
+ /** Runaway guard: the cap of model requests of one run. The run ends at the cap. */
31
26
  readonly maxIterations: number;
32
27
  /** The compaction rules of an agent that a chat thread runs. Absent: the conversation never compacts. */
33
28
  readonly compaction?: CompactionRules;
34
- }
35
- /**
36
- * The durability seam. `passthroughStep` (`(_, fn) => fn()`) in the chat
37
- * route; a `DBOS.runStep` wrapper in PR #3. The loop is agnostic — it only
38
- * promises a deterministic `name` per call (the step-naming contract).
39
- */
40
- export type RunStep = <T>(name: string, fn: () => Promise<T>) => Promise<T>;
29
+ /**
30
+ * Provider options that each request of the agent sends, beside the options of
31
+ * the provider. They are part of the agent, thus each request of a
32
+ * conversation sends the same options.
33
+ */
34
+ readonly providerOptions?: ProviderOptions;
35
+ };
41
36
  /**
42
37
  * Provenance stamped onto every orchestration event — the agent call
43
38
  * chain at the point of emission, derived from the `Session` (see the harness-durable-runtime spec).
44
39
  * `callPath` is provenance only; nothing branches on it.
45
40
  */
46
- export interface EventSource {
41
+ export type EventSource = {
47
42
  readonly agentId: string;
48
43
  readonly callPath: readonly string[];
49
44
  /** The id of the tool call that runs this loop. For a data profile, the workflow id of its attempt. */
50
45
  readonly invocationId?: string;
51
- }
46
+ };
52
47
  /**
53
48
  * Orchestration events the loop emits: iteration boundaries and tool-call
54
49
  * lifecycle. Distinct from `ChatStreamEvent` (model-output text deltas) —
@@ -57,12 +52,9 @@ export interface EventSource {
57
52
  export type EmitEvent = {
58
53
  readonly type: "iteration";
59
54
  readonly source: EventSource;
60
- /** Zero-based. Wrap-up request `k` has index `maxIterations + k`; a continuation counts from 0. */
55
+ /** Zero-based. A follow-up request counts from 0. */
61
56
  readonly index: number;
62
- /**
63
- * True when this iteration produced the loop's terminal reply, including
64
- * the last wrap-up even when its reply called a tool.
65
- */
57
+ /** True when this request produced the terminal reply of the loop. */
66
58
  readonly final: boolean;
67
59
  } | {
68
60
  readonly type: "tool-started";
@@ -90,16 +82,9 @@ export type EmitEvent = {
90
82
  /** The same detail the matching `tool-started` carried. */
91
83
  readonly detail?: ToolCallDetail;
92
84
  /**
93
- * The time around this call's own dispatch, in milliseconds.
94
- *
95
- * A host cannot measure this itself. The loop emits every
96
- * `tool-started` of a round before it dispatches anything, and every
97
- * `tool-finished` after the round settles. Thus a host that brackets
98
- * the two events measures the round, and each call of a multi-call
99
- * round reports the same figure.
100
- *
101
- * The field is optional, and it is absent when no measurement was
102
- * taken. As a result a host can fall back to its own observation.
85
+ * The time of this call itself, in milliseconds, measured inside its
86
+ * step. A refused call did not run, thus it has no figure, and a host
87
+ * can fall back to its own observation.
103
88
  */
104
89
  readonly durationMs?: number;
105
90
  } | {
@@ -107,7 +92,13 @@ export type EmitEvent = {
107
92
  readonly type: "message-start";
108
93
  readonly source: EventSource;
109
94
  readonly messageId: string;
110
- readonly role: "user" | "assistant";
95
+ readonly role: "user";
96
+ readonly text: string;
97
+ } | {
98
+ readonly type: "message-start";
99
+ readonly source: EventSource;
100
+ readonly messageId: string;
101
+ readonly role: "assistant";
111
102
  };
112
103
  /**
113
104
  * A UI presentation event a tool streams to chat — an AI-SDK `data-*`
@@ -115,7 +106,7 @@ export type EmitEvent = {
115
106
  * synthesized content). The loop and `emit` are agnostic to the payload
116
107
  * shape; the typed contract lives in `harness/contracts`.
117
108
  */
118
- export interface ChatDataPart {
109
+ export type ChatDataPart = {
119
110
  readonly type: `data-${string}`;
120
111
  readonly data: unknown;
121
112
  /**
@@ -125,7 +116,7 @@ export interface ChatDataPart {
125
116
  * routing envelopes).
126
117
  */
127
118
  readonly source?: EventSource;
128
- }
119
+ };
129
120
  /**
130
121
  * The flat event sink. One function reference flows unchanged through
131
122
  * every nesting level. It carries three event categories: orchestration
@@ -1,10 +1,5 @@
1
1
  /**
2
- * Agent-loop seam — shared types.
3
- *
4
- * `runAgent` (run-agent.ts) is a pure-async function: it owns the message
5
- * loop and nothing else. Durability and streaming are *injected* — a
6
- * `RunStep` wraps each LLM/tool call (`passthroughStep` for chat, a
7
- * `DBOS.runStep` wrapper in PR #3) and an `EmitFn` is the flat event sink.
8
- * The loop body itself knows nothing about DBOS, HTTP, or memory.
2
+ * The shared types of the agent loop: the definition of an agent, its
3
+ * messages, and the flat event sink.
9
4
  */
10
5
  export {};
@@ -118,20 +118,20 @@ declare const CompactionMarkerSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
118
118
  tokensBefore: z.ZodNumber;
119
119
  durationMs: z.ZodNumber;
120
120
  trigger: z.ZodOptional<z.ZodEnum<{
121
- "turn-start": "turn-start";
122
121
  "mid-turn": "mid-turn";
122
+ "turn-start": "turn-start";
123
123
  }>>;
124
124
  kind: z.ZodLiteral<"summary">;
125
125
  }, z.core.$strip>, z.ZodObject<{
126
- keptTurns: z.ZodNumber;
127
126
  id: z.ZodString;
128
127
  tokensBefore: z.ZodNumber;
129
128
  durationMs: z.ZodNumber;
130
129
  trigger: z.ZodOptional<z.ZodEnum<{
131
- "turn-start": "turn-start";
132
130
  "mid-turn": "mid-turn";
131
+ "turn-start": "turn-start";
133
132
  }>>;
134
133
  kind: z.ZodLiteral<"drop">;
134
+ keptTurns: z.ZodNumber;
135
135
  }, z.core.$strip>], "kind">;
136
136
  export type CompactionMarker = z.infer<typeof CompactionMarkerSchema>;
137
137
  /** The {@link HARNESS_PROVIDER_NAMESPACE} key that holds the input tokens that the provider reported for the request of an assistant message. */
@@ -152,11 +152,11 @@ export declare function dropMarkerMessage(marker: Extract<CompactionMarker, {
152
152
  }>): ModelMessage;
153
153
  export declare function compactionMarkerOf(message: ModelMessage): CompactionMarker | undefined;
154
154
  type LegacyContent = string | Array<Record<string, unknown>>;
155
- export interface LegacyMessageRow {
155
+ export type LegacyMessageRow = {
156
156
  readonly threadId: string;
157
157
  readonly seq: number;
158
158
  readonly role: string;
159
159
  readonly content: LegacyContent;
160
- }
160
+ };
161
161
  export declare function legacyAnthropicToModelMessage(row: LegacyMessageRow): ModelMessage;
162
162
  export {};
@@ -1,5 +1,8 @@
1
+ import { textOf } from "../lib/unknown-text.js";
2
+ import { parseUnknownRecord } from "../lib/unknown-containers.js";
1
3
  import { createHash } from "node:crypto";
2
4
  import { modelMessageSchema } from "ai";
5
+ import { isJSONValue } from "@ai-sdk/provider";
3
6
  import { z } from "zod";
4
7
  export const SUPPORTED_AI_SDK_MAJOR = 7;
5
8
  export const StoredMessageEnvelopeSchema = z.object({
@@ -52,6 +55,7 @@ export const CONTEXT_KIND_KEY = "contextKind";
52
55
  /** The {@link HARNESS_PROVIDER_NAMESPACE} key that holds the SHA-256 hex hash of the text of a context record. */
53
56
  export const CONTEXT_HASH_KEY = "contextHash";
54
57
  const CONTEXT_KINDS = ["analysis-context", "run-activity", "working-memory"];
58
+ const ContextKindSchema = z.enum(CONTEXT_KINDS);
55
59
  /**
56
60
  * A context record: a synthetic `user` message, and no host record, thus it opens no turn and the
57
61
  * display does not show it.
@@ -64,17 +68,14 @@ export function contextRecordMessage(kind, text) {
64
68
  providerOptions: { [HARNESS_PROVIDER_NAMESPACE]: { [SYNTHETIC_MESSAGE_KEY]: true, [CONTEXT_KIND_KEY]: kind, [CONTEXT_HASH_KEY]: hash } },
65
69
  };
66
70
  }
67
- function isContextKind(value) {
68
- return CONTEXT_KINDS.some((kind) => kind === value);
69
- }
70
71
  /** The kind and the hash of a context record, or `undefined` for a message that is no record. */
71
72
  export function contextRecordOf(message) {
72
73
  const harness = message.providerOptions?.[HARNESS_PROVIDER_NAMESPACE];
73
- const kind = harness?.[CONTEXT_KIND_KEY];
74
+ const kind = ContextKindSchema.safeParse(harness?.[CONTEXT_KIND_KEY]);
74
75
  const hash = harness?.[CONTEXT_HASH_KEY];
75
- if (typeof hash !== "string" || !isContextKind(kind))
76
+ if (typeof hash !== "string" || !kind.success)
76
77
  return undefined;
77
- return { kind, hash };
78
+ return { kind: kind.data, hash };
78
79
  }
79
80
  /**
80
81
  * Return a copy of `message` carrying the interruption marker in the harness namespace.
@@ -232,8 +233,9 @@ function providerOptionsFromLegacy(block) {
232
233
  const anthropic = {};
233
234
  if (typeof block.signature === "string")
234
235
  anthropic.signature = block.signature;
235
- if (typeof block.cache_control === "object" && block.cache_control !== null) {
236
- anthropic.cacheControl = block.cache_control;
236
+ const cacheControl = block.cache_control;
237
+ if (cacheControl !== null && isJSONValue(cacheControl) && parseUnknownRecord(cacheControl) !== undefined) {
238
+ anthropic.cacheControl = cacheControl;
237
239
  }
238
240
  return Object.keys(anthropic).length > 0 ? { anthropic } : undefined;
239
241
  }
@@ -268,9 +270,9 @@ export function legacyAnthropicToModelMessage(row) {
268
270
  }
269
271
  const unrepresentable = content.find((block) => !(block.type === "text" && typeof block.text === "string"));
270
272
  if (unrepresentable !== undefined) {
271
- throw new Error(`Legacy user row ${row.threadId}/${row.seq} contains unrepresentable block type "${String(unrepresentable.type)}"; failing rather than writing a lossy envelope`);
273
+ throw new Error(`Legacy user row ${row.threadId}/${row.seq} contains unrepresentable block type "${textOf(unrepresentable.type)}"; failing rather than writing a lossy envelope`);
272
274
  }
273
- const userContent = content.map((block) => ({ type: "text", text: String(block.text), providerOptions: providerOptionsFromLegacy(block) }));
275
+ const userContent = content.map((block) => ({ type: "text", text: textOf(block.text), providerOptions: providerOptionsFromLegacy(block) }));
274
276
  return {
275
277
  role: "user",
276
278
  content: userContent,
@@ -304,7 +306,7 @@ export function legacyAnthropicToModelMessage(row) {
304
306
  }
305
307
  // Any other block (e.g. redacted_thinking) may carry signed provider
306
308
  // data required for continuation; fail the row instead of dropping it.
307
- throw new Error(`Legacy assistant row ${row.threadId}/${row.seq} contains unrepresentable block type "${String(block.type)}"; failing rather than writing a lossy envelope`);
309
+ throw new Error(`Legacy assistant row ${row.threadId}/${row.seq} contains unrepresentable block type "${textOf(block.type)}"; failing rather than writing a lossy envelope`);
308
310
  }
309
311
  return {
310
312
  role: "assistant",
@@ -14,11 +14,11 @@
14
14
  * under the part `type` directly.
15
15
  */
16
16
  import { type ResultAsync } from "neverthrow";
17
- import type { Pool } from "pg";
17
+ import type { Querier } from "../state/db.js";
18
18
  import { type DbError } from "../lib/db-result.js";
19
19
  import type { PlanPart } from "../contracts/chat-parts.js";
20
- import { type PlanRecord } from "../state/index.js";
21
- export interface PlanCardData {
20
+ import { type PlanRecord, type PlanRowQuerier } from "../state/index.js";
21
+ export type PlanCardData = {
22
22
  id: string;
23
23
  planId: string;
24
24
  parentPlanId?: string;
@@ -27,19 +27,19 @@ export interface PlanCardData {
27
27
  analytical_narrative: unknown;
28
28
  omicsType: unknown;
29
29
  omicsSubtype: unknown;
30
- }
31
- export interface PresentationCardData {
30
+ };
31
+ export type PresentationCardData = {
32
32
  id: string;
33
33
  title?: string;
34
34
  content: Record<string, unknown>;
35
- }
36
- export interface RunCardData {
35
+ };
36
+ export type RunCardData = {
37
37
  id: string;
38
38
  runId: string;
39
39
  planId: string;
40
40
  title: string;
41
41
  stepCount: number;
42
- }
42
+ };
43
43
  /** Build the `data-plan` payload of a stored plan record. `null` when the
44
44
  * document no longer parses. An explicit `title` overrides the plan title. */
45
45
  export declare function planCardOf(record: PlanRecord, title?: string): PlanCardData | null;
@@ -51,14 +51,14 @@ export declare function planPartOf(record: PlanRecord): PlanPart | null;
51
51
  /** Build the `data-plan` payload by loading the stored plan. `ok(null)` when
52
52
  * the plan is missing or no longer parses (absence is NOT an error) — the
53
53
  * caller falls back to a chip. */
54
- export declare function buildPlanCardData(pool: Pool, planId: string, analysisId: string, title?: string): ResultAsync<PlanCardData | null, DbError>;
54
+ export declare function buildPlanCardData(pool: PlanRowQuerier, planId: string, analysisId: string, title?: string): ResultAsync<PlanCardData | null, DbError>;
55
55
  /** Build the `data-run-card` payload for a started analysis run. Loads the
56
56
  * plan (for `title` + `stepCount`) the same way `buildPlanCardData` does. The
57
57
  * live emit path passes the freshly-minted `runId`; the reconstruct-on-read
58
58
  * path omits it and the most recent run for `(analysisId, planId)` is looked
59
59
  * up from `cortex_runs`. Null when the plan or run cannot be resolved — the
60
60
  * caller falls back to a chip. */
61
- export declare function buildRunCardData(pool: Pool, opts: {
61
+ export declare function buildRunCardData(pool: Querier, opts: {
62
62
  planId: string;
63
63
  analysisId: string;
64
64
  runId?: string;
@@ -82,17 +82,17 @@ export declare function buildPresentationCardData(input: Record<string, unknown>
82
82
  /** Max files a `show_file` group may reference; multiple render as a gallery. */
83
83
  export declare const MAX_FILES = 10;
84
84
  /** One referenced file in a `data-file-reference` card. */
85
- export interface FileReferenceEntryData {
85
+ export type FileReferenceEntryData = {
86
86
  path: string;
87
87
  runId?: string;
88
88
  caption?: string;
89
- }
89
+ };
90
90
  /** The `data-file-reference` payload: a group of referenced analysis artifacts. */
91
- export interface FileReferenceCardData {
91
+ export type FileReferenceCardData = {
92
92
  id: string;
93
93
  title?: string;
94
94
  files: FileReferenceEntryData[];
95
- }
95
+ };
96
96
  /** Extracts `runId` from paths shaped `runs/{runId}/...`; undefined otherwise. */
97
97
  export declare function deriveRunId(path: string): string | undefined;
98
98
  /** Stable dedup key over sorted paths + optional title. */
@@ -16,15 +16,13 @@
16
16
  import { createHash } from "node:crypto";
17
17
  import { okAsync } from "neverthrow";
18
18
  import { tryQuery } from "../lib/db-result.js";
19
+ import { parseUnknownRecord } from "../lib/unknown-containers.js";
19
20
  import { PlanPartSchema } from "../contracts/schemas/chat-parts.js";
20
21
  import { AnalysisPlanSchema } from "../schemas/workflow-state.js";
21
22
  import { loadPlan, loadPlanRecord } from "../state/index.js";
22
23
  import { parseStructureUrl } from "../contracts/structure-source.js";
23
24
  import { normalizeEchartSpec } from "../tools/display/normalize-echart-spec.js";
24
25
  import { validatePath } from "../tools/lib/path-validation.js";
25
- function isRecord(value) {
26
- return typeof value === "object" && value !== null && !Array.isArray(value);
27
- }
28
26
  /** Deterministic presentation id — must match `show_user`'s. */
29
27
  function presentationId(input) {
30
28
  const hash = createHash("sha256")
@@ -43,16 +41,18 @@ export function planCardOf(record, title) {
43
41
  // Explicit `show_plan({ title })` overrides; otherwise default to the
44
42
  // planner-set plan title so both cards share one source.
45
43
  const heading = title ?? parsed.data.title;
46
- return {
44
+ const card = {
47
45
  id,
48
46
  planId: record.planId,
49
- ...(record.parentPlanId !== null ? { parentPlanId: record.parentPlanId } : {}),
50
- ...(heading !== undefined ? { title: heading } : {}),
47
+ title: heading,
51
48
  steps: parsed.data.steps,
52
49
  analytical_narrative: parsed.data.analytical_narrative,
53
50
  omicsType: parsed.data.omicsType,
54
51
  omicsSubtype: parsed.data.omicsSubtype,
55
52
  };
53
+ if (record.parentPlanId !== null)
54
+ card.parentPlanId = record.parentPlanId;
55
+ return card;
56
56
  }
57
57
  /** The `data-plan` part of a stored plan record, with the title of the plan. The
58
58
  * part schema drops each key that it does not name, thus the part equals the
@@ -139,8 +139,9 @@ export function buildPresentationCardData(input) {
139
139
  return null;
140
140
  content = { kind, format: source.format, url: source.url, provider: source.provider, accession: source.accession, version: source.version };
141
141
  }
142
- else if (kind === "echart" && isRecord(rest.spec)) {
143
- content = { kind, ...rest, spec: normalizeEchartSpec(rest.spec, { title: cardTitle }) };
142
+ else if (kind === "echart") {
143
+ const spec = parseUnknownRecord(rest.spec);
144
+ content = spec !== undefined ? { kind, ...rest, spec: normalizeEchartSpec(spec, { title: cardTitle }) } : { kind, ...rest };
144
145
  }
145
146
  else {
146
147
  // Every other kind (and an echart the model called without a `spec`) is carried through
@@ -149,7 +150,7 @@ export function buildPresentationCardData(input) {
149
150
  }
150
151
  return {
151
152
  id: presentationId(input),
152
- ...(cardTitle !== undefined ? { title: cardTitle } : {}),
153
+ title: cardTitle,
153
154
  content,
154
155
  };
155
156
  }
@@ -158,8 +159,9 @@ export const MAX_FILES = 10;
158
159
  /** Extracts `runId` from paths shaped `runs/{runId}/...`; undefined otherwise. */
159
160
  export function deriveRunId(path) {
160
161
  const segments = path.split("/");
161
- if (segments.length >= 2 && segments[0] === "runs" && segments[1].length > 0) {
162
- return segments[1];
162
+ const runId = segments[1];
163
+ if (segments.length >= 2 && segments[0] === "runs" && runId !== undefined && runId.length > 0) {
164
+ return runId;
163
165
  }
164
166
  return undefined;
165
167
  }
@@ -185,7 +187,9 @@ export function buildFileReferenceCardData(input) {
185
187
  return null;
186
188
  const files = [];
187
189
  for (const raw of rawFiles) {
188
- const file = (raw ?? {});
190
+ const file = parseUnknownRecord(raw);
191
+ if (file === undefined)
192
+ return null;
189
193
  const path = typeof file.path === "string" ? file.path : "";
190
194
  if (validatePath(path) !== null)
191
195
  return null;
@@ -193,10 +197,10 @@ export function buildFileReferenceCardData(input) {
193
197
  const caption = typeof file.caption === "string" ? file.caption : undefined;
194
198
  files.push({
195
199
  path,
196
- ...(runId !== undefined ? { runId } : {}),
197
- ...(caption !== undefined ? { caption } : {}),
200
+ runId,
201
+ caption,
198
202
  });
199
203
  }
200
204
  const id = `pres-${fileGroupHash(files.map((f) => f.path), title)}`;
201
- return { id, ...(title !== undefined ? { title } : {}), files };
205
+ return { id, title, files };
202
206
  }
@@ -1,8 +1,18 @@
1
1
  import type { ModelMessage } from "ai";
2
+ import type { ChatFrame } from "../contracts/chat-events.js";
2
3
  import type { EmitFn } from "../loop/types.js";
3
4
  import { type ConversationUIMessage } from "./conversation-display-storage.js";
4
- export interface ConversationDisplayRecorder {
5
+ export type ConversationDisplayRecorder = {
5
6
  readonly emit: EmitFn;
7
+ /**
8
+ * Record one frame that reached the stream of the turn by another path, and forward nothing. A turn workflow
9
+ * records each frame of its stream with it, the frames that a replay of a tool step gives again included.
10
+ */
11
+ observe(frame: ChatFrame): void;
12
+ /** The id of the assistant message that the next parts go to. A marker of a round gives the next message a new id. */
13
+ assistantMessageId(): string;
14
+ /** The id of the user message of the turn. */
15
+ userMessageId(): string;
6
16
  /** The user message of the turn. */
7
17
  takeOpening(): ConversationUIMessage[];
8
18
  /** The assistant message of one round, when the recorder got parts after the last take, and the divider of a marker of the round. */
@@ -12,15 +22,23 @@ export interface ConversationDisplayRecorder {
12
22
  readonly fallbackText?: string;
13
23
  readonly interrupted?: boolean;
14
24
  }): ConversationUIMessage[];
15
- }
16
- export interface ConversationDisplayRecorderOptions {
25
+ };
26
+ export type ConversationDisplayRecorderOptions = {
17
27
  readonly userText: string;
18
28
  /** The root agent of the turn. Its call path is `[agentId]`, and an event with a longer path is from a sub-agent. */
19
29
  readonly agentId: string;
20
30
  readonly sink: EmitFn;
21
31
  /** The clock for the times of the sub-agent activity, in milliseconds. The default is the wall clock. */
22
32
  readonly now?: () => number;
23
- }
33
+ /**
34
+ * The ids of the messages of the turn: the user message, and the assistant message after each marker, from 0 on.
35
+ * A turn workflow gives ids from its turn id, thus a replay gives the same ids. The default is a random id.
36
+ */
37
+ readonly messageIds?: {
38
+ readonly user: string;
39
+ readonly assistant: (index: number) => string;
40
+ };
41
+ };
24
42
  /**
25
43
  * Record the display of a turn through the same translation path as a live surface: each event becomes a
26
44
  * frame (`toChatFrame`), and the frames build the messages of the round (`applyChatFrame`). Only a part that
@@ -3,15 +3,19 @@ import { applyChatFrame, checkChatPart, isRootFrame, toChatFrame } from "../cont
3
3
  import { PART_REGISTRY } from "../contracts/part-registry.js";
4
4
  import { createSubAgentActivityTracker } from "../contracts/subagent-activity.js";
5
5
  import { compactionExchangeOf, compactionMarkerOf } from "./ai-sdk-message-storage.js";
6
- import { conversationDisplayPart } from "./conversation-display-storage.js";
6
+ import { conversationDisplayPart, isStoredSourcePart } from "./conversation-display-storage.js";
7
7
  function jsonCopy(value) {
8
- return JSON.parse(JSON.stringify(value));
8
+ return structuredClone(value);
9
9
  }
10
+ const DURABLE_CONVERSATION_PART_TYPES = new Set(Object.entries(PART_REGISTRY)
11
+ .filter(([, descriptor]) => descriptor.emitter === "conversation" && descriptor.consumer === "conversation" && !descriptor.transient)
12
+ .map(([type]) => type));
10
13
  function durableConversationType(type) {
11
- if (!Object.hasOwn(PART_REGISTRY, type))
12
- return false;
13
- const descriptor = PART_REGISTRY[type];
14
- return descriptor.emitter === "conversation" && descriptor.consumer === "conversation" && !descriptor.transient;
14
+ return DURABLE_CONVERSATION_PART_TYPES.has(type);
15
+ }
16
+ /** Each chat event type is named without the `data-` prefix, thus a `data-` frame is a part frame. */
17
+ function isPartFrame(frame) {
18
+ return frame.type.startsWith("data-");
15
19
  }
16
20
  /** The checked part of a data frame, copied at receipt, because the emitter keeps its own reference to the payload. */
17
21
  function recordedPart(frame) {
@@ -28,6 +32,8 @@ function displayParts(parts) {
28
32
  return parts.flatMap((part) => {
29
33
  if (part.type === "text")
30
34
  return part.text.length === 0 ? [] : [{ type: "text", text: part.text, state: "done" }];
35
+ if (!isStoredSourcePart(part))
36
+ return [];
31
37
  if (part.type === "data-ask" && part.status === "pending")
32
38
  return [conversationDisplayPart({ ...part, status: "aborted" })];
33
39
  return [conversationDisplayPart(part)];
@@ -47,14 +53,16 @@ function assistantText(messages) {
47
53
  }
48
54
  /** The divider of a compaction marker: a `system` message with the part at the final status of the compaction. */
49
55
  function compactionDivider(marker) {
50
- const part = conversationDisplayPart({
56
+ const compaction = {
51
57
  type: "data-compaction",
52
58
  id: marker.id,
53
59
  status: marker.kind === "summary" ? "done" : "failed",
54
60
  tokensBefore: marker.tokensBefore,
55
61
  durationMs: marker.durationMs,
56
- ...(marker.trigger === undefined ? {} : { trigger: marker.trigger }),
57
- });
62
+ };
63
+ if (marker.trigger !== undefined)
64
+ compaction.trigger = marker.trigger;
65
+ const part = conversationDisplayPart(compaction);
58
66
  return { id: marker.id, role: "system", parts: [part] };
59
67
  }
60
68
  /**
@@ -64,8 +72,10 @@ function compactionDivider(marker) {
64
72
  */
65
73
  export function createConversationDisplayRecorder(options) {
66
74
  // One id for each message of the turn, thus the rounds of a turn replay as one assistant message.
67
- const userMessageId = randomUUID();
68
- let assistantMessageId = randomUUID();
75
+ const userMessageId = options.messageIds?.user ?? randomUUID();
76
+ let assistantIndex = 0;
77
+ const assistantIdAt = (index) => options.messageIds?.assistant(index) ?? randomUUID();
78
+ let assistantMessageId = assistantIdAt(assistantIndex);
69
79
  let userAnnounced = false;
70
80
  let announcedAssistantId;
71
81
  const rootSource = { agentId: options.agentId, callPath: [options.agentId] };
@@ -89,7 +99,11 @@ export function createConversationDisplayRecorder(options) {
89
99
  }
90
100
  function record(event) {
91
101
  const frame = toChatFrame(event, rootSource);
92
- if (frame === null)
102
+ if (frame !== null)
103
+ observe(frame);
104
+ }
105
+ function observe(frame) {
106
+ if (finished)
93
107
  return;
94
108
  // The tracker reads the frames of the sub-agents, and `applyChatFrame` ignores them.
95
109
  const activity = subAgentActivity.track(frame, now());
@@ -97,27 +111,29 @@ export function createConversationDisplayRecorder(options) {
97
111
  apply(recordedPart(activity));
98
112
  if (!isRootFrame(frame))
99
113
  return;
100
- if (frame.type.startsWith("data-")) {
101
- // Each chat event type is named without the `data-` prefix, thus a `data-` frame is a part frame.
114
+ if (isPartFrame(frame)) {
102
115
  if (durableConversationType(frame.type))
103
116
  apply(recordedPart(frame));
104
117
  return;
105
118
  }
106
119
  apply(frame);
107
120
  }
108
- function messageStart(messageId, role) {
109
- return { type: "message-start", messageId, role, source: rootSource };
121
+ function userMessageStart() {
122
+ return { type: "message-start", messageId: userMessageId, role: "user", text: options.userText, source: rootSource };
123
+ }
124
+ function assistantMessageStart(messageId) {
125
+ return { type: "message-start", messageId, role: "assistant", source: rootSource };
110
126
  }
111
127
  /** The `message-start` of each id that the sink did not get yet. */
112
128
  function announcements() {
113
129
  const starts = [];
114
130
  if (!userAnnounced) {
115
131
  userAnnounced = true;
116
- starts.push(messageStart(userMessageId, "user"));
132
+ starts.push(userMessageStart());
117
133
  }
118
134
  if (announcedAssistantId !== assistantMessageId) {
119
135
  announcedAssistantId = assistantMessageId;
120
- starts.push(messageStart(assistantMessageId, "assistant"));
136
+ starts.push(assistantMessageStart(assistantMessageId));
121
137
  }
122
138
  return starts;
123
139
  }
@@ -131,7 +147,7 @@ export function createConversationDisplayRecorder(options) {
131
147
  return options.sink(event);
132
148
  // The calls start in the order of the stream with no await between them: a later emit that its caller does
133
149
  // not await, for example a text delta, must not reach the sink before them.
134
- return Promise.all([...starts, event].map((next) => options.sink(next))).then(() => undefined);
150
+ return Promise.all([...starts, event].map((next) => Promise.resolve(options.sink(next)))).then(() => undefined);
135
151
  };
136
152
  function takeOpening() {
137
153
  return [{ id: userMessageId, role: "user", parts: [{ type: "text", text: options.userText, state: "done" }] }];
@@ -146,7 +162,8 @@ export function createConversationDisplayRecorder(options) {
146
162
  if (marker !== undefined) {
147
163
  taken.push(compactionDivider(marker));
148
164
  // The divider splits the turn into two assistant messages of the replay, and two messages must not share an id.
149
- assistantMessageId = randomUUID();
165
+ assistantIndex += 1;
166
+ assistantMessageId = assistantIdAt(assistantIndex);
150
167
  }
151
168
  return taken;
152
169
  }
@@ -159,14 +176,16 @@ export function createConversationDisplayRecorder(options) {
159
176
  const messages = takeOpening();
160
177
  const parts = displayParts(roundParts());
161
178
  if (parts.length > 0) {
162
- messages.push({
179
+ const message = {
163
180
  id: assistantMessageId,
164
181
  role: "assistant",
165
- ...(finishOptions?.interrupted ? { metadata: { interrupted: true } } : {}),
166
182
  parts: jsonCopy(parts),
167
- });
183
+ };
184
+ if (finishOptions?.interrupted)
185
+ message.metadata = { interrupted: true };
186
+ messages.push(message);
168
187
  }
169
188
  return messages;
170
189
  }
171
- return { emit, takeOpening, takeRound, finish };
190
+ return { emit, observe, assistantMessageId: () => assistantMessageId, userMessageId: () => userMessageId, takeOpening, takeRound, finish };
172
191
  }
@@ -46,10 +46,11 @@ export function storedMessagesToChat(messages) {
46
46
  // spreads the message acquires one that overwrites a real value. `Date`
47
47
  // does not survive the JSON crossing typed, hence the ISO string here.
48
48
  const createdAt = row.createdAt === undefined ? {} : { createdAt: row.createdAt.toISOString() };
49
- const author = row.author === undefined ? {} : { author: row.author };
50
49
  groupLast = undefined;
51
50
  for (const message of conversationUIToChatMessages(row.displayEnvelope.messages)) {
52
- const stamped = { ...message, ...createdAt, ...(message.role === "user" ? author : {}) };
51
+ const stamped = { ...message, ...createdAt };
52
+ if (message.role === "user" && row.author !== undefined)
53
+ stamped.author = row.author;
53
54
  const previous = out.at(-1);
54
55
  // The merged message keeps the creation time of its first round.
55
56
  if (stamped.role === "assistant" && previous?.role === "assistant" && previous.id === stamped.id)