@inflexa-ai/harness 0.45.1 → 0.46.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (790) hide show
  1. package/README.md +6 -3
  2. package/dist/agents/conversation-agent.d.ts +9 -3
  3. package/dist/agents/conversation-agent.js +34 -33
  4. package/dist/agents/report-session-agent.d.ts +15 -15
  5. package/dist/agents/report-session-agent.js +23 -15
  6. package/dist/agents/sandbox/index.d.ts +1 -1
  7. package/dist/agents/sandbox/index.js +1 -1
  8. package/dist/agents/sandbox/shared.d.ts +12 -14
  9. package/dist/agents/sandbox/shared.js +18 -12
  10. package/dist/agents/sandbox/types.d.ts +4 -4
  11. package/dist/agents/sandbox/validate-skills.d.ts +2 -2
  12. package/dist/agents/sandbox/validate-skills.js +3 -1
  13. package/dist/agents/sandbox-catalog.d.ts +2 -2
  14. package/dist/agents/sandbox-catalog.js +3 -3
  15. package/dist/agents/system-prompt.d.ts +2 -2
  16. package/dist/app/chat-turn-workflow.d.ts +114 -0
  17. package/dist/app/chat-turn-workflow.js +306 -0
  18. package/dist/app/chat-turn.d.ts +85 -57
  19. package/dist/app/chat-turn.js +123 -100
  20. package/dist/app/data-profile-orientation.js +10 -8
  21. package/dist/app/data-profile-view.d.ts +4 -4
  22. package/dist/app/data-profile-view.js +9 -8
  23. package/dist/app/in-process-turn.d.ts +42 -0
  24. package/dist/app/in-process-turn.js +139 -0
  25. package/dist/app/message-assembly.d.ts +10 -4
  26. package/dist/app/message-assembly.js +13 -8
  27. package/dist/app/report-session-runtime.d.ts +4 -4
  28. package/dist/app/report-session-runtime.js +36 -21
  29. package/dist/app/spawn-report-session.d.ts +33 -28
  30. package/dist/app/spawn-report-session.js +25 -40
  31. package/dist/app/synthesize-run.d.ts +22 -16
  32. package/dist/app/synthesize-run.js +41 -35
  33. package/dist/app/work.d.ts +96 -0
  34. package/dist/app/work.js +147 -0
  35. package/dist/auth/local-auth-context.d.ts +1 -3
  36. package/dist/auth/local-auth-context.js +1 -3
  37. package/dist/auth/local-run-authorizer.d.ts +1 -1
  38. package/dist/auth/local-run-authorizer.js +5 -3
  39. package/dist/auth/types.d.ts +26 -26
  40. package/dist/billing/cached-resolver.d.ts +4 -4
  41. package/dist/billing/run-charge.d.ts +5 -8
  42. package/dist/billing/run-charge.js +2 -2
  43. package/dist/billing/usage-recorder.d.ts +9 -9
  44. package/dist/citations/aggregate.js +1 -1
  45. package/dist/citations/clients/arxiv.d.ts +2 -2
  46. package/dist/citations/clients/arxiv.js +12 -4
  47. package/dist/citations/clients/common.js +4 -2
  48. package/dist/citations/clients/crossref.d.ts +2 -2
  49. package/dist/citations/clients/crossref.js +37 -37
  50. package/dist/citations/clients/doi-registry.js +15 -16
  51. package/dist/citations/clients/pubmed.d.ts +2 -2
  52. package/dist/citations/clients/pubmed.js +20 -13
  53. package/dist/citations/clients/semantic-scholar.d.ts +2 -2
  54. package/dist/citations/clients/semantic-scholar.js +9 -9
  55. package/dist/citations/compare.js +2 -2
  56. package/dist/citations/match.d.ts +2 -2
  57. package/dist/citations/match.js +12 -7
  58. package/dist/citations/normalize.js +35 -26
  59. package/dist/citations/plan.js +6 -2
  60. package/dist/citations/resolve.d.ts +6 -6
  61. package/dist/citations/resolve.js +34 -25
  62. package/dist/citations/types.d.ts +77 -77
  63. package/dist/config/environment-stores.d.ts +6 -6
  64. package/dist/config/resource-limits.js +1 -3
  65. package/dist/contracts/analogy-report.d.ts +7 -7
  66. package/dist/contracts/analogy-report.js +2 -2
  67. package/dist/contracts/chat-events.d.ts +38 -24
  68. package/dist/contracts/chat-frame.d.ts +15 -5
  69. package/dist/contracts/chat-frame.js +64 -41
  70. package/dist/contracts/chat-parts.d.ts +130 -67
  71. package/dist/contracts/chat-parts.js +1 -0
  72. package/dist/contracts/content-url.js +16 -2
  73. package/dist/contracts/data-profile.d.ts +38 -38
  74. package/dist/contracts/index.d.ts +2 -2
  75. package/dist/contracts/index.js +1 -1
  76. package/dist/contracts/message.d.ts +6 -6
  77. package/dist/contracts/organ-system.d.ts +11 -11
  78. package/dist/contracts/part-registry.d.ts +5 -4
  79. package/dist/contracts/part-registry.js +5 -0
  80. package/dist/contracts/profile-vocabulary.d.ts +11 -10
  81. package/dist/contracts/profile-vocabulary.js +10 -3
  82. package/dist/contracts/report-blocks.d.ts +329 -329
  83. package/dist/contracts/report-reference.d.ts +105 -81
  84. package/dist/contracts/report-reference.js +30 -13
  85. package/dist/contracts/schemas/chat-events.d.ts +30 -16
  86. package/dist/contracts/schemas/chat-events.js +15 -6
  87. package/dist/contracts/schemas/chat-parts.d.ts +175 -102
  88. package/dist/contracts/schemas/chat-parts.js +33 -7
  89. package/dist/contracts/severity.d.ts +1 -1
  90. package/dist/contracts/structure-source.d.ts +3 -3
  91. package/dist/contracts/structure-source.js +6 -2
  92. package/dist/contracts/subagent-activity.d.ts +2 -2
  93. package/dist/contracts/subagent-activity.js +5 -3
  94. package/dist/contracts/usage.d.ts +2 -2
  95. package/dist/data/safety-panel-schema.d.ts +25 -25
  96. package/dist/data/safety-panel-schema.js +13 -4
  97. package/dist/execution/artifact-metadata.d.ts +23 -15
  98. package/dist/execution/artifact-metadata.js +33 -10
  99. package/dist/execution/artifact-record.d.ts +2 -2
  100. package/dist/execution/artifact-registration.d.ts +5 -5
  101. package/dist/execution/artifact-registry.d.ts +8 -8
  102. package/dist/execution/dbos-run-launcher.d.ts +24 -4
  103. package/dist/execution/dbos-run-launcher.js +58 -4
  104. package/dist/execution/dbos-workflow-purger.d.ts +5 -6
  105. package/dist/execution/dbos-workflow-purger.js +8 -7
  106. package/dist/execution/input-signature.d.ts +2 -2
  107. package/dist/execution/post-step-pipeline.d.ts +9 -9
  108. package/dist/execution/post-step-pipeline.js +1 -1
  109. package/dist/execution/post-step.js +2 -2
  110. package/dist/execution/reconcile-manifest.d.ts +4 -4
  111. package/dist/execution/reconcile-manifest.js +3 -2
  112. package/dist/execution/run-authorizer.d.ts +46 -37
  113. package/dist/execution/run-authorizer.js +8 -8
  114. package/dist/execution/run-canceler.d.ts +7 -7
  115. package/dist/execution/run-canceler.js +14 -7
  116. package/dist/execution/run-end-record.d.ts +2 -3
  117. package/dist/execution/run-event-parts.d.ts +0 -8
  118. package/dist/execution/run-event-parts.js +29 -24
  119. package/dist/execution/run-event-stream.d.ts +8 -8
  120. package/dist/execution/run-event-stream.js +3 -4
  121. package/dist/execution/run-launcher.d.ts +4 -4
  122. package/dist/execution/run-synthesis.d.ts +49 -48
  123. package/dist/execution/run-synthesis.js +96 -255
  124. package/dist/execution/staged-input.d.ts +2 -2
  125. package/dist/execution/step-summary.d.ts +6 -6
  126. package/dist/execution/step-summary.js +4 -8
  127. package/dist/execution/topo-sort.js +4 -3
  128. package/dist/execution/workflow-purger.d.ts +2 -2
  129. package/dist/index.d.ts +17 -20
  130. package/dist/index.js +25 -36
  131. package/dist/input-sanitization.js +9 -2
  132. package/dist/input-scan/clustering.d.ts +6 -6
  133. package/dist/input-scan/clustering.js +11 -5
  134. package/dist/input-scan/companions.js +3 -2
  135. package/dist/input-scan/detect-sets.d.ts +2 -2
  136. package/dist/input-scan/detect-sets.js +25 -21
  137. package/dist/input-scan/enrich.d.ts +6 -6
  138. package/dist/input-scan/enrich.js +29 -12
  139. package/dist/input-scan/formats.d.ts +2 -2
  140. package/dist/input-scan/formats.js +8 -2
  141. package/dist/input-scan/markers.d.ts +2 -2
  142. package/dist/input-scan/markers.js +14 -5
  143. package/dist/input-scan/menu.d.ts +10 -10
  144. package/dist/input-scan/menu.js +0 -0
  145. package/dist/input-scan/quarantine.d.ts +2 -2
  146. package/dist/input-scan/quarantine.js +23 -18
  147. package/dist/input-scan/readout-budget.d.ts +2 -2
  148. package/dist/input-scan/readout-budget.js +1 -1
  149. package/dist/input-scan/readout.d.ts +2 -2
  150. package/dist/input-scan/readout.js +47 -34
  151. package/dist/input-scan/scan.d.ts +2 -2
  152. package/dist/input-scan/scan.js +7 -5
  153. package/dist/input-scan/set-types.d.ts +28 -28
  154. package/dist/input-scan/shapes.d.ts +4 -4
  155. package/dist/input-scan/shapes.js +0 -0
  156. package/dist/input-scan/templates.d.ts +10 -10
  157. package/dist/input-scan/templates.js +30 -22
  158. package/dist/input-scan/tokens.d.ts +6 -4
  159. package/dist/input-scan/tokens.js +100 -38
  160. package/dist/input-scan/types.d.ts +22 -22
  161. package/dist/lib/async-utils.d.ts +3 -7
  162. package/dist/lib/async-utils.js +5 -9
  163. package/dist/lib/cache.js +1 -1
  164. package/dist/lib/chrome.d.ts +46 -6
  165. package/dist/lib/console-logger.js +2 -2
  166. package/dist/lib/db-result.d.ts +22 -6
  167. package/dist/lib/db-result.js +9 -13
  168. package/dist/lib/eyes.d.ts +4 -4
  169. package/dist/lib/eyes.js +1 -1
  170. package/dist/lib/fs-helpers.js +18 -6
  171. package/dist/lib/fs-result.d.ts +1 -0
  172. package/dist/lib/fs-result.js +5 -6
  173. package/dist/lib/hooks.d.ts +32 -7
  174. package/dist/lib/hooks.js +22 -3
  175. package/dist/lib/host-concurrency.js +3 -2
  176. package/dist/lib/logger.d.ts +2 -2
  177. package/dist/lib/logger.js +2 -1
  178. package/dist/lib/metrics.d.ts +1 -1
  179. package/dist/lib/null-proto.d.ts +6 -0
  180. package/dist/lib/null-proto.js +17 -0
  181. package/dist/lib/otel-spans.d.ts +1 -1
  182. package/dist/lib/otel-spans.js +9 -5
  183. package/dist/lib/otel.d.ts +4 -2
  184. package/dist/lib/otel.js +10 -2
  185. package/dist/lib/page-capture.d.ts +8 -8
  186. package/dist/lib/page-capture.js +9 -4
  187. package/dist/lib/parse-json.d.ts +5 -0
  188. package/dist/lib/parse-json.js +12 -0
  189. package/dist/lib/present.d.ts +12 -0
  190. package/dist/lib/present.js +39 -0
  191. package/dist/lib/rate-limit.d.ts +4 -4
  192. package/dist/lib/rate-limit.js +12 -13
  193. package/dist/lib/regulatory-corpus/fetch-fda-guidance.d.ts +4 -4
  194. package/dist/lib/regulatory-corpus/fetch-fda-guidance.js +4 -10
  195. package/dist/lib/regulatory-corpus/fetch-ich.d.ts +4 -4
  196. package/dist/lib/regulatory-corpus/fetch-ich.js +18 -14
  197. package/dist/lib/regulatory-corpus/normalize-whitespace.d.ts +6 -0
  198. package/dist/lib/regulatory-corpus/normalize-whitespace.js +41 -0
  199. package/dist/lib/regulatory-corpus.d.ts +10 -10
  200. package/dist/lib/regulatory-corpus.js +3 -1
  201. package/dist/lib/result.d.ts +10 -11
  202. package/dist/lib/result.js +15 -13
  203. package/dist/lib/storage.d.ts +2 -2
  204. package/dist/lib/test/async-iterable.d.ts +9 -0
  205. package/dist/lib/test/async-iterable.js +28 -0
  206. package/dist/lib/test/request-url.d.ts +5 -0
  207. package/dist/lib/test/request-url.js +7 -0
  208. package/dist/lib/test/result-assert.d.ts +12 -0
  209. package/dist/lib/test/result-assert.js +17 -0
  210. package/dist/lib/test/text-shapes.d.ts +24 -0
  211. package/dist/lib/test/text-shapes.js +63 -0
  212. package/dist/lib/text.d.ts +22 -0
  213. package/dist/lib/text.js +68 -0
  214. package/dist/lib/thrown.d.ts +18 -0
  215. package/dist/lib/thrown.js +30 -0
  216. package/dist/lib/unknown-array.d.ts +6 -0
  217. package/dist/lib/unknown-array.js +8 -0
  218. package/dist/lib/unknown-containers.d.ts +14 -0
  219. package/dist/lib/unknown-containers.js +17 -0
  220. package/dist/lib/unknown-text.d.ts +8 -0
  221. package/dist/lib/unknown-text.js +28 -0
  222. package/dist/lib/zod-issue-shape.d.ts +1 -1
  223. package/dist/lib/zod-issue-shape.js +31 -31
  224. package/dist/lib/zod-issues.d.ts +3 -3
  225. package/dist/lib/zod-issues.js +30 -17
  226. package/dist/literature/sources/arxiv.d.ts +6 -6
  227. package/dist/literature/sources/arxiv.js +92 -35
  228. package/dist/literature/sources/http.d.ts +2 -2
  229. package/dist/literature/sources/http.js +16 -15
  230. package/dist/literature/sources/pubmed.d.ts +16 -16
  231. package/dist/literature/sources/pubmed.js +96 -61
  232. package/dist/literature/sources/semantic-scholar.d.ts +8 -8
  233. package/dist/literature/sources/semantic-scholar.js +22 -13
  234. package/dist/loop/accounting.d.ts +63 -0
  235. package/dist/loop/accounting.js +141 -0
  236. package/dist/loop/call-policy.d.ts +73 -0
  237. package/dist/loop/call-policy.js +109 -0
  238. package/dist/loop/chat-stream.d.ts +62 -0
  239. package/dist/loop/chat-stream.js +237 -0
  240. package/dist/loop/compaction.d.ts +9 -9
  241. package/dist/loop/compaction.js +1 -1
  242. package/dist/loop/metrics.d.ts +12 -15
  243. package/dist/loop/metrics.js +14 -26
  244. package/dist/loop/run-loop.d.ts +233 -0
  245. package/dist/loop/run-loop.js +770 -0
  246. package/dist/loop/sub-agent.d.ts +61 -0
  247. package/dist/loop/sub-agent.js +160 -0
  248. package/dist/loop/tool-adapter.d.ts +98 -0
  249. package/dist/loop/tool-adapter.js +364 -0
  250. package/dist/loop/tool-detail.d.ts +1 -1
  251. package/dist/loop/tool-detail.js +6 -5
  252. package/dist/loop/tool-outcome.d.ts +1 -1
  253. package/dist/loop/tool-output.d.ts +4 -4
  254. package/dist/loop/tool-output.js +2 -2
  255. package/dist/loop/turn-credentials.d.ts +39 -0
  256. package/dist/loop/turn-credentials.js +90 -0
  257. package/dist/loop/types.d.ts +29 -38
  258. package/dist/loop/types.js +2 -7
  259. package/dist/memory/ai-sdk-message-storage.d.ts +5 -5
  260. package/dist/memory/ai-sdk-message-storage.js +13 -11
  261. package/dist/memory/card-builders.d.ts +14 -14
  262. package/dist/memory/card-builders.js +19 -15
  263. package/dist/memory/conversation-display-recorder.d.ts +22 -4
  264. package/dist/memory/conversation-display-recorder.js +43 -24
  265. package/dist/memory/conversation-display-replay.js +3 -2
  266. package/dist/memory/conversation-display-storage.d.ts +15 -7
  267. package/dist/memory/conversation-display-storage.js +141 -36
  268. package/dist/memory/conversation-view.d.ts +4 -4
  269. package/dist/memory/conversation-view.js +5 -4
  270. package/dist/memory/count-tokens.js +10 -8
  271. package/dist/memory/derive-thread-title.d.ts +0 -13
  272. package/dist/memory/derive-thread-title.js +2 -1
  273. package/dist/memory/message-backfill.d.ts +12 -5
  274. package/dist/memory/message-backfill.js +5 -3
  275. package/dist/memory/thread-history.d.ts +36 -21
  276. package/dist/memory/thread-history.js +78 -54
  277. package/dist/memory/thread-store.d.ts +26 -17
  278. package/dist/memory/thread-store.js +15 -9
  279. package/dist/memory/tool-call-integrity.d.ts +2 -2
  280. package/dist/memory/tool-call-integrity.js +4 -3
  281. package/dist/memory/working-memory.d.ts +16 -12
  282. package/dist/memory/working-memory.js +72 -61
  283. package/dist/prompts/briefing.d.ts +12 -12
  284. package/dist/prompts/briefing.js +1 -1
  285. package/dist/prompts/synthesis-agent.d.ts +1 -1
  286. package/dist/prompts/synthesis-agent.js +6 -14
  287. package/dist/provenance/collector.d.ts +6 -6
  288. package/dist/provenance/collector.js +15 -8
  289. package/dist/provenance/exec-frame.d.ts +2 -2
  290. package/dist/provenance/exec-frame.js +6 -1
  291. package/dist/provenance/seam.d.ts +1 -4
  292. package/dist/provenance/types.d.ts +6 -6
  293. package/dist/providers/ai-sdk.d.ts +113 -62
  294. package/dist/providers/ai-sdk.js +283 -518
  295. package/dist/providers/embedding.d.ts +2 -2
  296. package/dist/providers/embedding.js +1 -1
  297. package/dist/providers/errors.d.ts +22 -2
  298. package/dist/providers/errors.js +98 -50
  299. package/dist/providers/prompt-cache.d.ts +8 -8
  300. package/dist/providers/prompt-cache.js +13 -11
  301. package/dist/providers/reasoning.d.ts +2 -2
  302. package/dist/providers/reasoning.js +2 -2
  303. package/dist/providers/request-headers.js +12 -3
  304. package/dist/providers/types.d.ts +55 -94
  305. package/dist/reference-data/catalog.d.ts +2 -15
  306. package/dist/reference-data/catalog.js +25 -8
  307. package/dist/reference-data/receipt.d.ts +2 -2
  308. package/dist/report-model/assert-rules.js +1 -1
  309. package/dist/report-model/authoring-grammar.d.ts +211 -233
  310. package/dist/report-model/block-walk.d.ts +10 -10
  311. package/dist/report-model/block-walk.js +2 -0
  312. package/dist/report-model/draft-finish.d.ts +8 -8
  313. package/dist/report-model/draft-finish.js +1 -1
  314. package/dist/report-model/draft-hash.js +8 -7
  315. package/dist/report-model/draft-operations.d.ts +22 -10
  316. package/dist/report-model/draft-operations.js +48 -30
  317. package/dist/report-model/draft-read.d.ts +19 -7
  318. package/dist/report-model/draft-read.js +16 -6
  319. package/dist/report-model/draft.d.ts +844 -2
  320. package/dist/report-model/draft.js +3 -1
  321. package/dist/report-model/fixture-resolver.js +39 -16
  322. package/dist/report-model/pin-snapshot.d.ts +2 -2
  323. package/dist/report-model/pin-snapshot.js +15 -15
  324. package/dist/report-model/production-resolver.d.ts +18 -18
  325. package/dist/report-model/production-resolver.js +50 -42
  326. package/dist/report-model/reference-resolver.d.ts +26 -10
  327. package/dist/report-model/reference-resolver.js +68 -5
  328. package/dist/report-model/reference-stamp.js +30 -38
  329. package/dist/report-model/structural-validation.js +12 -4
  330. package/dist/report-model/validate.d.ts +7 -7
  331. package/dist/report-model/validate.js +6 -6
  332. package/dist/report-render/assets.d.ts +2 -2
  333. package/dist/report-render/assets.js +27 -3
  334. package/dist/report-render/chart-export.d.ts +10 -2
  335. package/dist/report-render/chart-export.js +37 -11
  336. package/dist/report-render/chart-presets.d.ts +8 -8
  337. package/dist/report-render/chart-presets.js +3 -3
  338. package/dist/report-render/chart-renderers.d.ts +23 -16
  339. package/dist/report-render/chart-renderers.js +74 -53
  340. package/dist/report-render/chart-toolbox.d.ts +2 -2
  341. package/dist/report-render/chart-toolbox.js +7 -6
  342. package/dist/report-render/chart.d.ts +15 -16
  343. package/dist/report-render/chart.js +369 -252
  344. package/dist/report-render/design.d.ts +36 -297
  345. package/dist/report-render/design.js +0 -12
  346. package/dist/report-render/figures/common.d.ts +12 -12
  347. package/dist/report-render/figures/common.js +42 -31
  348. package/dist/report-render/figures/dendrogram.d.ts +3 -3
  349. package/dist/report-render/figures/dendrogram.js +10 -10
  350. package/dist/report-render/figures/dense.js +15 -8
  351. package/dist/report-render/figures/dotplot.js +46 -33
  352. package/dist/report-render/figures/embedding.js +52 -43
  353. package/dist/report-render/figures/equal-units.d.ts +10 -10
  354. package/dist/report-render/figures/equal-units.js +27 -27
  355. package/dist/report-render/figures/forest.js +9 -7
  356. package/dist/report-render/figures/gsea.js +21 -11
  357. package/dist/report-render/figures/heatmap.js +13 -9
  358. package/dist/report-render/figures/index.d.ts +10 -10
  359. package/dist/report-render/figures/index.js +4 -2
  360. package/dist/report-render/figures/km.js +10 -9
  361. package/dist/report-render/figures/label-room.d.ts +12 -12
  362. package/dist/report-render/figures/label-room.js +7 -2
  363. package/dist/report-render/figures/locuszoom.d.ts +2 -2
  364. package/dist/report-render/figures/locuszoom.js +59 -31
  365. package/dist/report-render/figures/lollipop.js +3 -2
  366. package/dist/report-render/figures/ma.js +8 -4
  367. package/dist/report-render/figures/manhattan.d.ts +1 -2
  368. package/dist/report-render/figures/manhattan.js +52 -34
  369. package/dist/report-render/figures/oncoprint.js +4 -5
  370. package/dist/report-render/figures/pca.js +25 -11
  371. package/dist/report-render/figures/qq.js +20 -9
  372. package/dist/report-render/figures/roc.js +1 -1
  373. package/dist/report-render/figures/sankey.d.ts +2 -2
  374. package/dist/report-render/figures/sankey.js +11 -10
  375. package/dist/report-render/figures/upset.d.ts +6 -6
  376. package/dist/report-render/figures/upset.js +7 -4
  377. package/dist/report-render/figures/volcano.js +12 -10
  378. package/dist/report-render/hybrid-svg.d.ts +4 -4
  379. package/dist/report-render/hybrid-svg.js +7 -5
  380. package/dist/report-render/number-format.d.ts +4 -4
  381. package/dist/report-render/number-format.js +62 -27
  382. package/dist/report-render/page.js +2 -1
  383. package/dist/report-render/provenance-data.d.ts +2 -2
  384. package/dist/report-render/references.d.ts +4 -4
  385. package/dist/report-render/render.d.ts +2 -2
  386. package/dist/report-render/render.js +10 -11
  387. package/dist/report-render/script-json.js +1 -1
  388. package/dist/report-render/table-data.d.ts +6 -6
  389. package/dist/report-render/test/options.d.ts +49 -0
  390. package/dist/report-render/test/options.js +143 -0
  391. package/dist/report-render/test/page-function.d.ts +19 -0
  392. package/dist/report-render/test/page-function.js +33 -0
  393. package/dist/report-render/types.d.ts +10 -10
  394. package/dist/report-render/value-bridge.d.ts +4 -4
  395. package/dist/report-render/value-bridge.js +27 -14
  396. package/dist/report-render/views/chart-view.d.ts +2 -2
  397. package/dist/report-render/views/chart-view.js +2 -2
  398. package/dist/report-render/views/lineage.d.ts +6 -6
  399. package/dist/report-render/views/lineage.js +2 -0
  400. package/dist/report-render/views/page-view.d.ts +2 -2
  401. package/dist/report-render/views/page-view.js +1 -0
  402. package/dist/report-render/views/prose.js +25 -8
  403. package/dist/report-render/views/references-view.js +12 -1
  404. package/dist/report-render/views/values.js +1 -1
  405. package/dist/runtime/assemble.d.ts +53 -26
  406. package/dist/runtime/assemble.js +103 -56
  407. package/dist/runtime/boot.d.ts +8 -7
  408. package/dist/runtime/boot.js +1 -1
  409. package/dist/runtime/connection-budget.d.ts +6 -6
  410. package/dist/runtime/connection-budget.js +1 -1
  411. package/dist/runtime/dbos.d.ts +29 -19
  412. package/dist/runtime/dbos.js +35 -20
  413. package/dist/runtime/result-serialization.js +18 -5
  414. package/dist/runtime/shutdown.d.ts +2 -2
  415. package/dist/sandbox/client.d.ts +7 -3
  416. package/dist/sandbox/cpu-files.d.ts +2 -2
  417. package/dist/sandbox/cpu-files.js +21 -4
  418. package/dist/sandbox/create-sandbox.d.ts +7 -8
  419. package/dist/sandbox/create-sandbox.js +6 -12
  420. package/dist/sandbox/docker-client.d.ts +48 -3
  421. package/dist/sandbox/docker-client.js +10 -6
  422. package/dist/sandbox/estimate-data-profile-resources.js +2 -7
  423. package/dist/sandbox/exec-outcome.d.ts +2 -2
  424. package/dist/sandbox/exec-outcome.js +1 -1
  425. package/dist/sandbox/exec.d.ts +10 -6
  426. package/dist/sandbox/exec.js +27 -12
  427. package/dist/sandbox/execution-id.js +14 -6
  428. package/dist/sandbox/farm.d.ts +2 -2
  429. package/dist/sandbox/farm.js +22 -27
  430. package/dist/sandbox/identity.d.ts +7 -0
  431. package/dist/sandbox/identity.js +14 -3
  432. package/dist/sandbox/image-packages.js +15 -27
  433. package/dist/sandbox/k8s-client.d.ts +35 -8
  434. package/dist/sandbox/k8s-client.js +6 -5
  435. package/dist/sandbox/labels.js +1 -0
  436. package/dist/sandbox/liveness.js +3 -1
  437. package/dist/sandbox/mount-plan.d.ts +10 -10
  438. package/dist/sandbox/mount-plan.js +13 -14
  439. package/dist/sandbox/notification-sweep.d.ts +4 -4
  440. package/dist/sandbox/notification-sweep.js +4 -7
  441. package/dist/sandbox/package-identity.d.ts +6 -13
  442. package/dist/sandbox/package-identity.js +46 -28
  443. package/dist/sandbox/reaper.d.ts +10 -10
  444. package/dist/sandbox/reaper.js +4 -6
  445. package/dist/sandbox/sandbox-error.d.ts +2 -9
  446. package/dist/sandbox/sandbox-error.js +21 -8
  447. package/dist/sandbox/sandbox-step-translate.d.ts +8 -5
  448. package/dist/sandbox/sandbox-step-translate.js +22 -8
  449. package/dist/sandbox/step-sandbox.d.ts +47 -0
  450. package/dist/sandbox/step-sandbox.js +53 -0
  451. package/dist/sandbox/types.d.ts +18 -19
  452. package/dist/sandbox/types.js +1 -1
  453. package/dist/schemas/artifact-manifest.d.ts +4 -4
  454. package/dist/schemas/data-profile-schemas.d.ts +343 -298
  455. package/dist/schemas/file-metadata.js +2 -4
  456. package/dist/schemas/plan-schemas.d.ts +31 -31
  457. package/dist/schemas/run-synthesis.d.ts +95 -26
  458. package/dist/schemas/run-synthesis.js +3 -1
  459. package/dist/schemas/validate-plan.d.ts +4 -4
  460. package/dist/schemas/validate-plan.js +17 -5
  461. package/dist/schemas/workflow-state.d.ts +19 -19
  462. package/dist/schemas/workflow-state.js +2 -2
  463. package/dist/state/active-turns.d.ts +36 -0
  464. package/dist/state/active-turns.js +67 -0
  465. package/dist/state/analyses-metrics.d.ts +8 -8
  466. package/dist/state/analyses-metrics.js +4 -4
  467. package/dist/state/analyses.d.ts +0 -14
  468. package/dist/state/analyses.js +0 -32
  469. package/dist/state/artifacts.d.ts +32 -19
  470. package/dist/state/artifacts.js +28 -5
  471. package/dist/state/data-profile.d.ts +2 -2
  472. package/dist/state/db.d.ts +12 -2
  473. package/dist/state/db.js +5 -0
  474. package/dist/state/edit-intents.d.ts +4 -0
  475. package/dist/state/edit-intents.js +71 -0
  476. package/dist/state/index.d.ts +4 -4
  477. package/dist/state/index.js +2 -2
  478. package/dist/state/init.d.ts +2 -1
  479. package/dist/state/init.js +5 -2
  480. package/dist/state/migrations/20260927120000_baseline.js +3 -1
  481. package/dist/state/migrations/20261026120000_add_the_edit_intents.d.ts +7 -0
  482. package/dist/state/migrations/20261026120000_add_the_edit_intents.js +21 -0
  483. package/dist/state/migrations/20261027120000_record_the_applied_memory_edits.d.ts +7 -0
  484. package/dist/state/migrations/20261027120000_record_the_applied_memory_edits.js +16 -0
  485. package/dist/state/migrations/20261027120100_store_the_authoring_results.d.ts +8 -0
  486. package/dist/state/migrations/20261027120100_store_the_authoring_results.js +20 -0
  487. package/dist/state/migrations/20261027120200_key_the_groups_of_a_turn.d.ts +7 -0
  488. package/dist/state/migrations/20261027120200_key_the_groups_of_a_turn.js +12 -0
  489. package/dist/state/migrations/20261027120300_mark_the_active_turn_of_a_thread.d.ts +7 -0
  490. package/dist/state/migrations/20261027120300_mark_the_active_turn_of_a_thread.js +11 -0
  491. package/dist/state/migrations/20261028120000_record_the_paused_work.d.ts +7 -0
  492. package/dist/state/migrations/20261028120000_record_the_paused_work.js +25 -0
  493. package/dist/state/migrations/20261028120100_end_the_suspended_runs.d.ts +8 -0
  494. package/dist/state/migrations/20261028120100_end_the_suspended_runs.js +13 -0
  495. package/dist/state/migrations/20261029120000_reference_the_run_mandate.d.ts +7 -0
  496. package/dist/state/migrations/20261029120000_reference_the_run_mandate.js +23 -0
  497. package/dist/state/migrations/20261029120100_record_the_run_session_of_a_pause.d.ts +7 -0
  498. package/dist/state/migrations/20261029120100_record_the_run_session_of_a_pause.js +11 -0
  499. package/dist/state/migrations/index.js +18 -0
  500. package/dist/state/paused-work.d.ts +52 -0
  501. package/dist/state/paused-work.js +105 -0
  502. package/dist/state/plans.d.ts +27 -8
  503. package/dist/state/plans.js +14 -11
  504. package/dist/state/purge-analysis.d.ts +6 -6
  505. package/dist/state/purge-analysis.js +10 -2
  506. package/dist/state/report-session-state.d.ts +43 -18
  507. package/dist/state/report-session-state.js +43 -4
  508. package/dist/state/report-versions.d.ts +16 -11
  509. package/dist/state/report-versions.js +5 -3
  510. package/dist/state/runs.d.ts +30 -19
  511. package/dist/state/runs.js +43 -51
  512. package/dist/state/schema.d.ts +18 -21
  513. package/dist/state/schema.js +4 -5
  514. package/dist/state/snapshot-parse.d.ts +2 -2
  515. package/dist/state/snapshot-parse.js +14 -8
  516. package/dist/state/step-executions.d.ts +20 -8
  517. package/dist/state/step-executions.js +6 -4
  518. package/dist/state/tool-outputs.d.ts +2 -2
  519. package/dist/state/tool-outputs.js +2 -1
  520. package/dist/state/vector-store.d.ts +16 -16
  521. package/dist/state/vector-store.js +11 -7
  522. package/dist/tasks/data-profile-absorb.d.ts +3 -3
  523. package/dist/tasks/data-profile-absorb.js +21 -16
  524. package/dist/tasks/data-profile-activity.d.ts +5 -5
  525. package/dist/tasks/data-profile-activity.js +5 -5
  526. package/dist/tasks/data-profile-index.d.ts +4 -4
  527. package/dist/tasks/data-profile-index.js +32 -17
  528. package/dist/tasks/data-profile-resolve.d.ts +8 -8
  529. package/dist/tasks/data-profile-resolve.js +88 -62
  530. package/dist/tasks/data-profile.d.ts +40 -31
  531. package/dist/tasks/data-profile.js +138 -95
  532. package/dist/tasks/extract-values.d.ts +26 -79
  533. package/dist/tasks/extract-values.js +48 -108
  534. package/dist/tasks/refresh-regulatory-corpus.d.ts +4 -20
  535. package/dist/tasks/refresh-regulatory-corpus.js +12 -8
  536. package/dist/tasks/regulatory-corpus-boot-refresh.d.ts +2 -2
  537. package/dist/tasks/regulatory-corpus-boot-refresh.js +12 -10
  538. package/dist/testing.d.ts +62 -0
  539. package/dist/testing.js +101 -0
  540. package/dist/tools/ad-hoc-router.d.ts +9 -9
  541. package/dist/tools/ad-hoc-router.js +65 -52
  542. package/dist/tools/analysis-invocation.d.ts +7 -0
  543. package/dist/tools/analysis-invocation.js +29 -5
  544. package/dist/tools/approval/contract.d.ts +8 -52
  545. package/dist/tools/approval/contract.js +7 -36
  546. package/dist/tools/approval/gateway.d.ts +27 -28
  547. package/dist/tools/approval/gateway.js +33 -130
  548. package/dist/tools/approval/queries.d.ts +6 -11
  549. package/dist/tools/approval/queries.js +43 -29
  550. package/dist/tools/approval/uuidv7.js +2 -2
  551. package/dist/tools/bio/chembl.d.ts +3 -3
  552. package/dist/tools/bio/chembl.js +10 -0
  553. package/dist/tools/bio/comptox.d.ts +25 -8
  554. package/dist/tools/bio/comptox.js +4 -2
  555. package/dist/tools/bio/drug-gene-interactions.d.ts +27 -17
  556. package/dist/tools/bio/drug-gene-interactions.js +11 -8
  557. package/dist/tools/bio/gene-disease-evidence.d.ts +61 -15
  558. package/dist/tools/bio/gene-disease-evidence.js +10 -6
  559. package/dist/tools/bio/gene-preclinical-profile.d.ts +11 -11
  560. package/dist/tools/bio/keys.d.ts +2 -2
  561. package/dist/tools/bio/keys.js +3 -3
  562. package/dist/tools/bio/lookup-annotation.d.ts +5 -5
  563. package/dist/tools/bio/lookup-annotation.js +3 -0
  564. package/dist/tools/bio/opentargets.d.ts +1 -1
  565. package/dist/tools/bio/opentargets.js +6 -0
  566. package/dist/tools/bio/pubchem.d.ts +2 -2
  567. package/dist/tools/bio/pubchem.js +6 -0
  568. package/dist/tools/bio/pubmed.d.ts +26 -16
  569. package/dist/tools/bio/pubmed.js +9 -3
  570. package/dist/tools/bio/search-clinical-trials.d.ts +4 -4
  571. package/dist/tools/bio/search-clinical-trials.js +5 -1
  572. package/dist/tools/bio/search-faers.d.ts +2 -2
  573. package/dist/tools/bio/search-faers.js +1 -1
  574. package/dist/tools/bio/search-gene.d.ts +2 -2
  575. package/dist/tools/bio/search-gene.js +1 -0
  576. package/dist/tools/bio/search-geo-datasets.d.ts +4 -4
  577. package/dist/tools/bio/search-geo-datasets.js +5 -5
  578. package/dist/tools/bio/search-interactions.d.ts +1 -1
  579. package/dist/tools/bio/search-patents.d.ts +28 -22
  580. package/dist/tools/bio/search-patents.js +20 -17
  581. package/dist/tools/bio/search-protein.d.ts +2 -2
  582. package/dist/tools/bio/search-protein.js +1 -1
  583. package/dist/tools/bio/search-regulatory-approvals.d.ts +64 -18
  584. package/dist/tools/bio/search-regulatory-approvals.js +21 -16
  585. package/dist/tools/bio/target-safety.d.ts +8 -8
  586. package/dist/tools/bio/target-safety.js +11 -6
  587. package/dist/tools/capability-data.d.ts +9 -5
  588. package/dist/tools/capability-data.js +2 -1
  589. package/dist/tools/define-tool.d.ts +55 -46
  590. package/dist/tools/define-tool.js +39 -27
  591. package/dist/tools/display/normalize-echart-spec.d.ts +2 -2
  592. package/dist/tools/display/normalize-echart-spec.js +51 -27
  593. package/dist/tools/display/show-user.d.ts +2 -2
  594. package/dist/tools/display/show-user.js +1 -1
  595. package/dist/tools/execute-analysis.d.ts +19 -10
  596. package/dist/tools/execute-analysis.js +83 -62
  597. package/dist/tools/knowledge/check.d.ts +166 -44
  598. package/dist/tools/knowledge/check.js +5 -3
  599. package/dist/tools/knowledge/client.d.ts +31 -62
  600. package/dist/tools/knowledge/client.js +44 -27
  601. package/dist/tools/knowledge/environment.d.ts +6 -6
  602. package/dist/tools/knowledge/environment.js +18 -7
  603. package/dist/tools/knowledge/index.d.ts +2 -2
  604. package/dist/tools/knowledge/index.js +9 -9
  605. package/dist/tools/knowledge/local-slots.d.ts +4 -4
  606. package/dist/tools/knowledge/local-slots.js +11 -4
  607. package/dist/tools/knowledge/pin.d.ts +2 -2
  608. package/dist/tools/knowledge/recommend.d.ts +20 -45
  609. package/dist/tools/knowledge/recommend.js +27 -19
  610. package/dist/tools/knowledge/situation.d.ts +40 -40
  611. package/dist/tools/knowledge/situation.js +2 -9
  612. package/dist/tools/knowledge/skeleton.d.ts +4 -4
  613. package/dist/tools/knowledge/skeleton.js +10 -11
  614. package/dist/tools/knowledge/template.d.ts +20 -18
  615. package/dist/tools/knowledge/template.js +38 -32
  616. package/dist/tools/lib/alphafold-client.js +2 -1
  617. package/dist/tools/lib/amass-client.d.ts +28 -28
  618. package/dist/tools/lib/amass-client.js +20 -10
  619. package/dist/tools/lib/api-utils.d.ts +13 -3
  620. package/dist/tools/lib/api-utils.js +17 -3
  621. package/dist/tools/lib/bgee-client.d.ts +6 -6
  622. package/dist/tools/lib/bgee-client.js +16 -10
  623. package/dist/tools/lib/cbioportal-client.d.ts +4 -4
  624. package/dist/tools/lib/cbioportal-client.js +9 -8
  625. package/dist/tools/lib/chembl-client.d.ts +14 -14
  626. package/dist/tools/lib/chembl-client.js +11 -4
  627. package/dist/tools/lib/clinical-benchmarks-client.d.ts +4 -4
  628. package/dist/tools/lib/clinical-benchmarks-client.js +4 -7
  629. package/dist/tools/lib/clinical-trials-client.d.ts +18 -18
  630. package/dist/tools/lib/clinical-trials-client.js +10 -10
  631. package/dist/tools/lib/clinvar-client.d.ts +2 -2
  632. package/dist/tools/lib/clinvar-client.js +6 -6
  633. package/dist/tools/lib/ctx-ops.d.ts +23 -23
  634. package/dist/tools/lib/ctx-ops.js +13 -10
  635. package/dist/tools/lib/dgidb-client.d.ts +6 -6
  636. package/dist/tools/lib/dgidb-client.js +10 -12
  637. package/dist/tools/lib/disgenet-client.d.ts +4 -4
  638. package/dist/tools/lib/ema-client.d.ts +2 -2
  639. package/dist/tools/lib/ensembl-client.d.ts +4 -4
  640. package/dist/tools/lib/ensembl-client.js +5 -4
  641. package/dist/tools/lib/gwas-catalog-client.d.ts +4 -4
  642. package/dist/tools/lib/gwas-catalog-client.js +17 -17
  643. package/dist/tools/lib/html-text.d.ts +6 -0
  644. package/dist/tools/lib/html-text.js +9 -0
  645. package/dist/tools/lib/identifier-resolver.d.ts +4 -4
  646. package/dist/tools/lib/identifier-resolver.js +7 -3
  647. package/dist/tools/lib/impc-client.d.ts +8 -8
  648. package/dist/tools/lib/impc-client.js +46 -35
  649. package/dist/tools/lib/iuphar-client.d.ts +2 -2
  650. package/dist/tools/lib/iuphar-client.js +7 -16
  651. package/dist/tools/lib/monarch-client.d.ts +4 -4
  652. package/dist/tools/lib/openfda-client.d.ts +22 -22
  653. package/dist/tools/lib/openfda-client.js +23 -22
  654. package/dist/tools/lib/opentargets-client.d.ts +12 -12
  655. package/dist/tools/lib/pathway-client.d.ts +4 -4
  656. package/dist/tools/lib/pathway-client.js +15 -19
  657. package/dist/tools/lib/pharmgkb-client.d.ts +2 -2
  658. package/dist/tools/lib/pharmgkb-client.js +1 -1
  659. package/dist/tools/lib/protein-family-modality.d.ts +2 -2
  660. package/dist/tools/lib/protein-family-modality.js +0 -2
  661. package/dist/tools/lib/protein-family-normalize.js +7 -0
  662. package/dist/tools/lib/pubchem-client.d.ts +2 -2
  663. package/dist/tools/lib/pubchem-client.js +1 -0
  664. package/dist/tools/lib/pubchem-ops.d.ts +4 -4
  665. package/dist/tools/lib/pubchem-ops.js +8 -0
  666. package/dist/tools/lib/pubmed-client.d.ts +9 -9
  667. package/dist/tools/lib/pubmed-client.js +1 -1
  668. package/dist/tools/lib/string-client.d.ts +6 -6
  669. package/dist/tools/lib/uniprot-client.d.ts +8 -8
  670. package/dist/tools/lib/uniprot-client.js +5 -1
  671. package/dist/tools/memory/update-working-memory.d.ts +16 -13
  672. package/dist/tools/memory/update-working-memory.js +21 -3
  673. package/dist/tools/read-tool-output.js +8 -2
  674. package/dist/tools/registry.d.ts +2 -2
  675. package/dist/tools/report-authoring/authoring-tools.d.ts +54 -23
  676. package/dist/tools/report-authoring/authoring-tools.js +128 -62
  677. package/dist/tools/report-session/derive-table.d.ts +19 -59
  678. package/dist/tools/report-session/derive-table.js +120 -122
  679. package/dist/tools/report-session/examine-page.d.ts +6 -6
  680. package/dist/tools/report-session/examine-page.js +14 -12
  681. package/dist/tools/report-session/list-artifacts.d.ts +6 -6
  682. package/dist/tools/report-session/list-artifacts.js +5 -5
  683. package/dist/tools/report-session/page-faults.d.ts +6 -6
  684. package/dist/tools/report-session/page-faults.js +3 -1
  685. package/dist/tools/report-session/preview-report.d.ts +4 -3
  686. package/dist/tools/report-session/preview-report.js +26 -7
  687. package/dist/tools/report-session/record-version.d.ts +9 -4
  688. package/dist/tools/report-session/record-version.js +16 -9
  689. package/dist/tools/report-session/session-page-publisher.d.ts +6 -6
  690. package/dist/tools/research/generate-analogy-report.d.ts +14 -7
  691. package/dist/tools/research/generate-analogy-report.js +80 -76
  692. package/dist/tools/research/generate-plan.d.ts +16 -16
  693. package/dist/tools/research/generate-plan.js +410 -374
  694. package/dist/tools/research/guarded-address.js +3 -2
  695. package/dist/tools/research/inspect-data-profile.d.ts +27 -20
  696. package/dist/tools/research/inspect-data-profile.js +26 -25
  697. package/dist/tools/research/inspect-run.d.ts +54 -27
  698. package/dist/tools/research/inspect-run.js +50 -40
  699. package/dist/tools/research/literature-reviewer.d.ts +8 -7
  700. package/dist/tools/research/literature-reviewer.js +29 -28
  701. package/dist/tools/research/search-arxiv.d.ts +1 -1
  702. package/dist/tools/research/search-arxiv.js +1 -1
  703. package/dist/tools/research/search-github-repos.d.ts +10 -7
  704. package/dist/tools/research/search-github-repos.js +25 -22
  705. package/dist/tools/research/search-semantic-scholar.js +1 -1
  706. package/dist/tools/research/searxng-engine.d.ts +2 -2
  707. package/dist/tools/research/searxng-engine.js +6 -4
  708. package/dist/tools/research/web-fetch.d.ts +24 -21
  709. package/dist/tools/research/web-fetch.js +65 -74
  710. package/dist/tools/research/web-search.d.ts +26 -17
  711. package/dist/tools/research/web-search.js +26 -21
  712. package/dist/tools/sandbox/link-packages.d.ts +11 -7
  713. package/dist/tools/sandbox/link-packages.js +11 -8
  714. package/dist/tools/sandbox/list-available-packages.d.ts +17 -8
  715. package/dist/tools/sandbox/list-available-packages.js +31 -25
  716. package/dist/tools/sandbox/list-available-refs.d.ts +17 -14
  717. package/dist/tools/sandbox/list-available-refs.js +61 -36
  718. package/dist/tools/sandbox/report-blocker.d.ts +30 -37
  719. package/dist/tools/sandbox/report-blocker.js +23 -73
  720. package/dist/tools/sandbox/skills.d.ts +16 -12
  721. package/dist/tools/sandbox/skills.js +16 -12
  722. package/dist/tools/sandbox/submit-file-metadata.d.ts +12 -9
  723. package/dist/tools/sandbox/submit-file-metadata.js +18 -21
  724. package/dist/tools/start-report-session.d.ts +13 -5
  725. package/dist/tools/start-report-session.js +35 -8
  726. package/dist/tools/terminal-text.d.ts +5 -2
  727. package/dist/tools/terminal-text.js +35 -3
  728. package/dist/tools/workspace/decision-record.d.ts +4 -4
  729. package/dist/tools/workspace/decision-record.js +23 -13
  730. package/dist/tools/workspace/edit-file.d.ts +59 -20
  731. package/dist/tools/workspace/edit-file.js +81 -16
  732. package/dist/tools/workspace/execute-command.d.ts +15 -13
  733. package/dist/tools/workspace/execute-command.js +11 -9
  734. package/dist/tools/workspace/file-stat.d.ts +6 -3
  735. package/dist/tools/workspace/grep.d.ts +10 -7
  736. package/dist/tools/workspace/grep.js +9 -3
  737. package/dist/tools/workspace/list-files.d.ts +6 -3
  738. package/dist/tools/workspace/mutator.d.ts +28 -15
  739. package/dist/tools/workspace/mutator.js +107 -53
  740. package/dist/tools/workspace/read-file.d.ts +8 -5
  741. package/dist/tools/workspace/result-bounds.d.ts +5 -5
  742. package/dist/tools/workspace/result-bounds.js +4 -2
  743. package/dist/tools/workspace/run-exec.d.ts +2 -2
  744. package/dist/tools/workspace/run-exec.js +3 -3
  745. package/dist/tools/workspace/scan-inputs.d.ts +8 -5
  746. package/dist/tools/workspace/scan-inputs.js +17 -5
  747. package/dist/tools/workspace/show-file.d.ts +1 -1
  748. package/dist/tools/workspace/show-file.js +2 -1
  749. package/dist/tools/workspace/show-plan.d.ts +8 -5
  750. package/dist/tools/workspace/show-plan.js +9 -8
  751. package/dist/tools/workspace/workspace-search.d.ts +41 -13
  752. package/dist/tools/workspace/workspace-search.js +27 -14
  753. package/dist/tools/workspace/write-file.d.ts +9 -7
  754. package/dist/workflows/execute-analysis-scheduler.d.ts +9 -9
  755. package/dist/workflows/execute-analysis-scheduler.js +6 -3
  756. package/dist/workflows/execute-analysis.d.ts +46 -62
  757. package/dist/workflows/execute-analysis.js +137 -219
  758. package/dist/workflows/pause.d.ts +71 -0
  759. package/dist/workflows/pause.js +173 -0
  760. package/dist/workflows/sandbox-step.d.ts +38 -61
  761. package/dist/workflows/sandbox-step.js +99 -106
  762. package/dist/workflows/test/sql-writes.d.ts +21 -0
  763. package/dist/workflows/test/sql-writes.js +36 -0
  764. package/dist/workspace/filesystem.d.ts +6 -6
  765. package/dist/workspace/filesystem.js +10 -8
  766. package/dist/workspace/paths.d.ts +1 -1
  767. package/dist/workspace/paths.js +15 -4
  768. package/dist/workspace/search-config.d.ts +2 -2
  769. package/dist/workspace/search-config.js +1 -1
  770. package/package.json +21 -22
  771. package/dist/loop/call-guard.d.ts +0 -50
  772. package/dist/loop/call-guard.js +0 -90
  773. package/dist/loop/continue-agent.d.ts +0 -40
  774. package/dist/loop/continue-agent.js +0 -38
  775. package/dist/loop/genai-spans.d.ts +0 -47
  776. package/dist/loop/genai-spans.js +0 -134
  777. package/dist/loop/run-agent.d.ts +0 -245
  778. package/dist/loop/run-agent.js +0 -1124
  779. package/dist/loop/run-step.d.ts +0 -29
  780. package/dist/loop/run-step.js +0 -34
  781. package/dist/loop/run-to-terminal.d.ts +0 -66
  782. package/dist/loop/run-to-terminal.js +0 -93
  783. package/dist/loop/tool-mask.d.ts +0 -23
  784. package/dist/loop/tool-mask.js +0 -46
  785. package/dist/providers/streaming-chat.d.ts +0 -32
  786. package/dist/providers/streaming-chat.js +0 -91
  787. package/dist/tasks/derive-table-exec.d.ts +0 -54
  788. package/dist/tasks/derive-table-exec.js +0 -86
  789. package/dist/workflows/suspension.d.ts +0 -32
  790. package/dist/workflows/suspension.js +0 -38
@@ -49,18 +49,28 @@ export type ConversationUIData = {
49
49
  })[];
50
50
  };
51
51
  };
52
- export interface ConversationDisplayMetadata {
52
+ export type ConversationDisplayMetadata = {
53
53
  interrupted?: boolean;
54
- }
54
+ };
55
55
  export type ConversationUIMessage = UIMessage<ConversationDisplayMetadata, ConversationUIData>;
56
- export interface StoredDisplayEnvelope {
56
+ export type StoredDisplayEnvelope = {
57
57
  readonly kind: "ai-sdk-ui-messages";
58
58
  readonly aiSdkMajor: 7;
59
59
  readonly schemaVersion: typeof SUPPORTED_DISPLAY_SCHEMA_VERSION;
60
60
  readonly messages: ConversationUIMessage[];
61
- }
61
+ };
62
62
  export declare function envelopeDisplayMessages(messages: readonly ConversationUIMessage[]): StoredDisplayEnvelope;
63
63
  export declare function parseStoredDisplayEnvelope(value: unknown, identity: string, logger?: Logger): Promise<StoredDisplayEnvelope>;
64
+ /** The message-part arm a stored data part round-trips from: the payload is the arm minus its discriminant. */
65
+ export type StoredSourcePart = Extract<Exclude<MessagePart, {
66
+ type: "text";
67
+ }>, {
68
+ type: ToolCallPart["type"] | PresentationPart["type"] | PlanPart["type"] | RunCardPart["type"] | PlanApprovalPart["type"] | FileReferencePart["type"] | AskPart["type"] | ChildSessionStartedPart["type"] | ReportRenderedPart["type"] | CompactionPart["type"] | SubAgentActivityPart["type"];
69
+ }>;
70
+ /** Whether `part` is an arm the stored vocabulary can hold; anything else cannot become a stored card. */
71
+ export declare function isStoredSourcePart(part: Exclude<MessagePart, {
72
+ type: "text";
73
+ }>): part is StoredSourcePart;
64
74
  /**
65
75
  * Build the stored form of one non-text message part.
66
76
  *
@@ -72,9 +82,7 @@ export declare function parseStoredDisplayEnvelope(value: unknown, identity: str
72
82
  * lifetime changes — rather than at each reader. An entry of a sub-agent call
73
83
  * closes the same way, and an `incomplete` entry has no end time.
74
84
  */
75
- export declare function conversationDisplayPart(part: Exclude<MessagePart, {
76
- type: "text";
77
- }>): DataUIPart<ConversationUIData>;
85
+ export declare function conversationDisplayPart(part: StoredSourcePart): DataUIPart<ConversationUIData>;
78
86
  /**
79
87
  * Read the durable representation back as chat messages.
80
88
  *
@@ -14,8 +14,11 @@
14
14
  * ({@link conversationUIToChatMessages}) is a near-identity rather than a
15
15
  * reconstruction.
16
16
  */
17
- import { validateUIMessages } from "ai";
17
+ import { errorMessageOf } from "../lib/thrown.js";
18
+ import { textOf } from "../lib/unknown-text.js";
19
+ import { isDataUIPart, validateUIMessages } from "ai";
18
20
  import { z } from "zod";
21
+ import { parseUnknownRecord } from "../lib/unknown-containers.js";
19
22
  import { AskPartSchema, ChildSessionStartedPartSchema, CompactionPartSchema, FileReferencePartSchema, PlanApprovalPartSchema, PlanPartSchema, PresentationPartSchema, ReportRenderedPartSchema, RunCardPartSchema, SubAgentActivityEntrySchema, SubAgentActivityPartSchema, } from "../contracts/schemas/chat-parts.js";
20
23
  import { ToolCallOutcomeSchema } from "../contracts/schemas/chat-events.js";
21
24
  export const SUPPORTED_DISPLAY_SCHEMA_VERSION = 1;
@@ -82,12 +85,9 @@ export function envelopeDisplayMessages(messages) {
82
85
  kind: "ai-sdk-ui-messages",
83
86
  aiSdkMajor: 7,
84
87
  schemaVersion: SUPPORTED_DISPLAY_SCHEMA_VERSION,
85
- messages: structuredClone(messages),
88
+ messages: structuredClone([...messages]),
86
89
  };
87
90
  }
88
- function isRecord(value) {
89
- return typeof value === "object" && value !== null && !Array.isArray(value);
90
- }
91
91
  /**
92
92
  * Strip every `data-*` part the current vocabulary cannot render.
93
93
  *
@@ -109,36 +109,47 @@ function dropUnrenderableDataParts(messages, identity, logger) {
109
109
  const unknownKey = [];
110
110
  const schemaMismatch = [];
111
111
  const filtered = messages.map((message) => {
112
- if (!isRecord(message) || !Array.isArray(message.parts))
112
+ const record = parseUnknownRecord(message);
113
+ if (record === undefined || !Array.isArray(record.parts))
113
114
  return message;
114
- const parts = message.parts.filter((part) => {
115
- if (!isRecord(part) || typeof part.type !== "string" || !part.type.startsWith("data-"))
115
+ const parts = record.parts.filter((part) => {
116
+ const partRecord = parseUnknownRecord(part);
117
+ if (partRecord === undefined || typeof partRecord.type !== "string" || !partRecord.type.startsWith("data-"))
116
118
  return true;
117
- const key = part.type.slice("data-".length);
119
+ const key = partRecord.type.slice("data-".length);
118
120
  // `Object.hasOwn` before the index: a part typed `data-constructor`
119
121
  // would otherwise resolve up the prototype chain to something that is
120
122
  // not a schema at all, and throw where it should have been dropped.
121
- if (!Object.hasOwn(dataSchemas, key)) {
122
- unknownKey.push(part.type);
123
+ // `Object.entries` lists own keys only, so the lookup refuses a
124
+ // prototype name the same way.
125
+ const schema = dataSchemaOf(key);
126
+ if (schema === undefined) {
127
+ unknownKey.push(partRecord.type);
123
128
  return false;
124
129
  }
125
- if (!dataSchemas[key].safeParse(part.data).success) {
126
- schemaMismatch.push(part.type);
130
+ if (!schema.safeParse(partRecord.data).success) {
131
+ schemaMismatch.push(partRecord.type);
127
132
  return false;
128
133
  }
129
134
  return true;
130
135
  });
131
- return parts.length === message.parts.length ? message : { ...message, parts };
136
+ return parts.length === record.parts.length ? message : { ...record, parts };
132
137
  });
133
138
  if (unknownKey.length > 0 || schemaMismatch.length > 0) {
134
- logger?.warn("dropped unrenderable stored display parts", {
135
- identity,
136
- ...(unknownKey.length > 0 ? { unknownKey: [...new Set(unknownKey)] } : {}),
137
- ...(schemaMismatch.length > 0 ? { schemaMismatch: [...new Set(schemaMismatch)] } : {}),
138
- });
139
+ const fields = { identity };
140
+ if (unknownKey.length > 0)
141
+ fields.unknownKey = [...new Set(unknownKey)];
142
+ if (schemaMismatch.length > 0)
143
+ fields.schemaMismatch = [...new Set(schemaMismatch)];
144
+ logger?.warn("dropped unrenderable stored display parts", fields);
139
145
  }
140
146
  return filtered;
141
147
  }
148
+ /** The schema behind one stored data-part key, or `undefined` when the key was retired or never stood. */
149
+ function dataSchemaOf(key) {
150
+ const entry = Object.entries(dataSchemas).find(([name]) => name === key);
151
+ return entry?.[1];
152
+ }
142
153
  export async function parseStoredDisplayEnvelope(value, identity, logger) {
143
154
  const header = DisplayEnvelopeHeaderSchema.safeParse(value);
144
155
  if (!header.success) {
@@ -153,13 +164,27 @@ export async function parseStoredDisplayEnvelope(value, identity, logger) {
153
164
  return { ...header.data, messages };
154
165
  }
155
166
  catch (error) {
156
- const message = error instanceof Error ? error.message : String(error);
167
+ const message = errorMessageOf(error) ?? textOf(error);
157
168
  throw new Error(`Invalid stored conversation display envelope at ${identity}: ${message}`, { cause: error });
158
169
  }
159
170
  }
160
- /** The data-part key a message part is stored under — its `type` minus the `data-` prefix. */
161
- function displayPartType(part) {
162
- return (part.type === "tool-call" ? "data-tool-call" : part.type);
171
+ const STORED_SOURCE_TYPES = [
172
+ "tool-call",
173
+ "data-presentation",
174
+ "data-plan",
175
+ "data-run-card",
176
+ "data-plan-approval",
177
+ "data-file-reference",
178
+ "data-ask",
179
+ "data-child-session-started",
180
+ "data-report-rendered",
181
+ "data-compaction",
182
+ "data-subagent-activity",
183
+ ];
184
+ const STORED_SOURCE_TYPE_SET = new Set(STORED_SOURCE_TYPES);
185
+ /** Whether `part` is an arm the stored vocabulary can hold; anything else cannot become a stored card. */
186
+ export function isStoredSourcePart(part) {
187
+ return STORED_SOURCE_TYPE_SET.has(part.type);
163
188
  }
164
189
  function closedEntry(entry) {
165
190
  if (entry.outcome !== undefined)
@@ -185,13 +210,57 @@ function displayPartId(part) {
185
210
  * closes the same way, and an `incomplete` entry has no end time.
186
211
  */
187
212
  export function conversationDisplayPart(part) {
188
- const { type: _type, ...rest } = part;
189
- const data = part.type === "tool-call"
190
- ? { ...rest, outcome: part.outcome ?? "incomplete" }
191
- : part.type === "data-subagent-activity"
192
- ? { ...rest, entries: part.entries.map(closedEntry) }
193
- : rest;
194
- return { type: displayPartType(part), id: displayPartId(part), data };
213
+ const id = displayPartId(part);
214
+ switch (part.type) {
215
+ case "tool-call": {
216
+ const { type: _type, ...payload } = part;
217
+ return { type: "data-tool-call", id, data: { ...payload, outcome: part.outcome ?? "incomplete" } };
218
+ }
219
+ case "data-presentation": {
220
+ const { type: _type, ...data } = part;
221
+ return { type: "data-presentation", id, data };
222
+ }
223
+ case "data-plan": {
224
+ const { type: _type, ...data } = part;
225
+ return { type: "data-plan", id, data };
226
+ }
227
+ case "data-run-card": {
228
+ const { type: _type, ...data } = part;
229
+ return { type: "data-run-card", id, data };
230
+ }
231
+ case "data-plan-approval": {
232
+ const { type: _type, ...data } = part;
233
+ return { type: "data-plan-approval", id, data };
234
+ }
235
+ case "data-file-reference": {
236
+ const { type: _type, ...data } = part;
237
+ return { type: "data-file-reference", id, data };
238
+ }
239
+ case "data-ask": {
240
+ const { type: _type, ...data } = part;
241
+ return { type: "data-ask", id, data };
242
+ }
243
+ case "data-child-session-started": {
244
+ const { type: _type, ...data } = part;
245
+ return { type: "data-child-session-started", id, data };
246
+ }
247
+ case "data-report-rendered": {
248
+ const { type: _type, ...data } = part;
249
+ return { type: "data-report-rendered", id, data };
250
+ }
251
+ case "data-compaction": {
252
+ const { type: _type, ...data } = part;
253
+ return { type: "data-compaction", id, data };
254
+ }
255
+ case "data-subagent-activity": {
256
+ const { type: _type, ...payload } = part;
257
+ return { type: "data-subagent-activity", id, data: { ...payload, entries: part.entries.map(closedEntry) } };
258
+ }
259
+ default: {
260
+ const unreachable = part;
261
+ return unreachable;
262
+ }
263
+ }
195
264
  }
196
265
  /**
197
266
  * Read the durable representation back as chat messages.
@@ -214,19 +283,55 @@ export function conversationUIToChatMessages(messages) {
214
283
  parts.push({ type: "tool-call", ...part.data });
215
284
  continue;
216
285
  }
217
- if (part.type.startsWith("data-")) {
218
- const data = part;
219
- parts.push({ type: data.type, ...data.data });
286
+ if (isDataUIPart(part)) {
287
+ switch (part.type) {
288
+ case "data-presentation":
289
+ parts.push({ type: "data-presentation", ...part.data });
290
+ break;
291
+ case "data-plan":
292
+ parts.push({ type: "data-plan", ...part.data });
293
+ break;
294
+ case "data-run-card":
295
+ parts.push({ type: "data-run-card", ...part.data });
296
+ break;
297
+ case "data-plan-approval":
298
+ parts.push({ type: "data-plan-approval", ...part.data });
299
+ break;
300
+ case "data-file-reference":
301
+ parts.push({ type: "data-file-reference", ...part.data });
302
+ break;
303
+ case "data-ask":
304
+ parts.push({ type: "data-ask", ...part.data });
305
+ break;
306
+ case "data-child-session-started":
307
+ parts.push({ type: "data-child-session-started", ...part.data });
308
+ break;
309
+ case "data-report-rendered":
310
+ parts.push({ type: "data-report-rendered", ...part.data });
311
+ break;
312
+ case "data-compaction":
313
+ parts.push({ type: "data-compaction", ...part.data });
314
+ break;
315
+ case "data-subagent-activity":
316
+ parts.push({ type: "data-subagent-activity", ...part.data });
317
+ break;
318
+ default: {
319
+ const unhandled = part;
320
+ throw new Error(`stored display part has no chat-part arm: ${String(unhandled)}`);
321
+ }
322
+ }
220
323
  }
221
324
  }
222
325
  if (parts.length === 0)
223
326
  continue;
224
- out.push({
327
+ const chat = {
225
328
  id: message.id,
226
329
  role: message.role,
227
330
  parts,
228
- ...(message.metadata?.interrupted ? { interrupted: true } : {}),
229
- });
331
+ };
332
+ if (message.metadata?.interrupted)
333
+ chat.interrupted = true;
334
+ out.push(chat);
230
335
  }
231
336
  return out;
232
337
  }
@@ -35,15 +35,15 @@ export declare function isGenuineUserStart(message: ModelMessage): boolean;
35
35
  * (`loadAll`) share it, each supplying its own start predicate.
36
36
  */
37
37
  export declare function groupTurns<T>(rows: readonly T[], isStart: (row: T) => boolean): T[][];
38
- export interface ConversationViewOptions {
38
+ export type ConversationViewOptions = {
39
39
  /** Keep the first turn in front of the view: the seed of a report thread. */
40
40
  readonly keepFirstTurn?: boolean;
41
- }
42
- export interface ConversationView {
41
+ };
42
+ export type ConversationView = {
43
43
  readonly messages: ModelMessage[];
44
44
  /** `sources[i]` is the index of the input message that gives `messages[i]`. */
45
45
  readonly sources: number[];
46
- }
46
+ };
47
47
  export declare function conversationView(messages: readonly ModelMessage[], options: ConversationViewOptions): ConversationView;
48
48
  /** The message with no reasoning part, or `undefined` for an assistant message with no part left. */
49
49
  export declare function withoutReasoning(message: ModelMessage): ModelMessage | undefined;
@@ -4,6 +4,7 @@
4
4
  * turns of the body without their reasoning. The loop and the reader call this one function, thus the
5
5
  * next turn reads back the prefix that the last request sent.
6
6
  */
7
+ import { presentAt, presentLast } from "../lib/present.js";
7
8
  import { compactionExchangeOf, compactionMarkerOf, isSyntheticUserMessage, requestInputTokensOf } from "./ai-sdk-message-storage.js";
8
9
  /**
9
10
  * A turn starts on a `user` message that a human actually sent. Two kinds of
@@ -43,7 +44,7 @@ export function groupTurns(rows, isStart) {
43
44
  turns.push([row]);
44
45
  }
45
46
  else {
46
- turns[turns.length - 1].push(row);
47
+ presentLast(turns, "the open turn").push(row);
47
48
  }
48
49
  }
49
50
  return turns;
@@ -66,7 +67,7 @@ function viewParts(messages, options) {
66
67
  let headEnd = 0;
67
68
  if (options.keepFirstTurn === true) {
68
69
  while (headEnd < messages.length) {
69
- const message = messages[headEnd];
70
+ const message = presentAt(messages, headEnd, "the head message");
70
71
  if (isCompactionMessage(message) || (headEnd > 0 && isGenuineUserStart(message)))
71
72
  break;
72
73
  headEnd++;
@@ -76,7 +77,7 @@ function viewParts(messages, options) {
76
77
  let front;
77
78
  let body = [];
78
79
  for (let source = headEnd; source < messages.length; source++) {
79
- const message = messages[source];
80
+ const message = presentAt(messages, source, "the message at the source index");
80
81
  if (compactionExchangeOf(message) !== undefined)
81
82
  continue;
82
83
  const marker = compactionMarkerOf(message);
@@ -115,7 +116,7 @@ export function withoutReasoning(message) {
115
116
  */
116
117
  export function lastRequestInputTokens(messages) {
117
118
  for (let at = messages.length - 1; at >= 0; at--) {
118
- const message = messages[at];
119
+ const message = presentAt(messages, at, "the message at the index");
119
120
  if (compactionMarkerOf(message) !== undefined)
120
121
  return undefined;
121
122
  const tokens = requestInputTokensOf(message);
@@ -8,7 +8,9 @@
8
8
  * callers treat the budget as a soft target with a safety margin below the
9
9
  * true context limit.
10
10
  */
11
+ import { textOf } from "../lib/unknown-text.js";
11
12
  import { getEncoding } from "js-tiktoken";
13
+ import { parseUnknownRecord } from "../lib/unknown-containers.js";
12
14
  let encoder;
13
15
  function enc() {
14
16
  encoder ??= getEncoding("cl100k_base");
@@ -27,16 +29,16 @@ function enc() {
27
29
  * Each other output arm is plain JSON, thus it is stringified whole.
28
30
  */
29
31
  function toolResultText(output) {
30
- if (typeof output !== "object" || output === null)
32
+ const out = parseUnknownRecord(output);
33
+ if (out === undefined)
31
34
  return JSON.stringify(output ?? {});
32
- const out = output;
33
35
  if (out.type !== "content" || !Array.isArray(out.value))
34
36
  return JSON.stringify(out);
35
37
  const texts = [];
36
38
  for (const item of out.value) {
37
- if (typeof item !== "object" || item === null)
39
+ const nested = parseUnknownRecord(item);
40
+ if (nested === undefined)
38
41
  continue;
39
- const nested = item;
40
42
  if (nested.type === "text" && typeof nested.text === "string")
41
43
  texts.push(nested.text);
42
44
  }
@@ -52,9 +54,9 @@ function toolResultText(output) {
52
54
  function tokenizableText(block) {
53
55
  if (typeof block === "string")
54
56
  return block;
55
- if (typeof block !== "object" || block === null)
57
+ const part = parseUnknownRecord(block);
58
+ if (part === undefined)
56
59
  return JSON.stringify(block);
57
- const part = block;
58
60
  switch (part.type) {
59
61
  case "text":
60
62
  return typeof part.text === "string" ? part.text : "";
@@ -66,9 +68,9 @@ function tokenizableText(block) {
66
68
  case "image":
67
69
  return "";
68
70
  case "tool-call":
69
- return `${String(part.toolName ?? "")} ${JSON.stringify(part.input ?? {})}`;
71
+ return `${textOf(part.toolName ?? "")} ${JSON.stringify(part.input ?? {})}`;
70
72
  case "tool-result": {
71
- return `${String(part.toolName ?? "")} ${toolResultText(part.output)}`;
73
+ return `${textOf(part.toolName ?? "")} ${toolResultText(part.output)}`;
72
74
  }
73
75
  default:
74
76
  return JSON.stringify(part);
@@ -1,14 +1 @@
1
- /**
2
- * Derive a deterministic thread title from the user's first message.
3
- * Pure function — no I/O, no global state.
4
- *
5
- * Rules:
6
- * 1. Collapse runs of whitespace to a single space.
7
- * 2. Trim.
8
- * 3. Empty / whitespace-only input → `"Untitled"`.
9
- * 4. If length ≤ `max`, return unchanged.
10
- * 5. Else slice to `max`, walk back to the last space (word boundary),
11
- * append the real ellipsis `…` (U+2026). If no space exists inside
12
- * the window, hard-slice at `max` and append `…`.
13
- */
14
1
  export declare function deriveThreadTitle(text: string, max?: number): string;
@@ -11,8 +11,9 @@
11
11
  * append the real ellipsis `…` (U+2026). If no space exists inside
12
12
  * the window, hard-slice at `max` and append `…`.
13
13
  */
14
+ import { collapseWhitespace } from "../lib/text.js";
14
15
  export function deriveThreadTitle(text, max = 40) {
15
- const normalized = text.replace(/\s+/g, " ").trim();
16
+ const normalized = collapseWhitespace(text);
16
17
  if (normalized.length === 0)
17
18
  return "Untitled";
18
19
  if (normalized.length <= max)
@@ -1,8 +1,15 @@
1
1
  import type { QueryResultRow } from "pg";
2
2
  /** The query method of a `pg` client, which the migration transaction also supplies. */
3
- export interface BackfillClient {
4
- query<R extends QueryResultRow>(text: string, values?: unknown[]): Promise<{
5
- rows: R[];
3
+ export type BackfillClient<Row extends QueryResultRow = QueryResultRow> = {
4
+ query(text: string, values?: unknown[]): Promise<{
5
+ rows: Row[];
6
6
  }>;
7
- }
8
- export declare function backfillAiSdkMessageEnvelopes(client: BackfillClient): Promise<void>;
7
+ };
8
+ type LegacyRow = {
9
+ readonly thread_id: string;
10
+ readonly seq: string;
11
+ readonly role: string;
12
+ readonly content_jsonb: string | Array<Record<string, unknown>>;
13
+ };
14
+ export declare function backfillAiSdkMessageEnvelopes(client: BackfillClient<LegacyRow>): Promise<void>;
15
+ export {};
@@ -1,3 +1,5 @@
1
+ import { errorMessageOf } from "../lib/thrown.js";
2
+ import { textOf } from "../lib/unknown-text.js";
1
3
  import { envelopeMessage, legacyAnthropicToModelMessage } from "./ai-sdk-message-storage.js";
2
4
  export async function backfillAiSdkMessageEnvelopes(client) {
3
5
  // Legacy Anthropic columns (`role`, `content_jsonb`) are temporary and
@@ -22,7 +24,7 @@ export async function backfillAiSdkMessageEnvelopes(client) {
22
24
  ]);
23
25
  }
24
26
  catch (err) {
25
- const message = err instanceof Error ? err.message : String(err);
27
+ const message = errorMessageOf(err) ?? textOf(err);
26
28
  throw new Error(`Failed to backfill AI SDK message envelope for ${identity}: ${message}`, { cause: err });
27
29
  }
28
30
  }
@@ -31,8 +33,8 @@ export async function backfillAiSdkMessageEnvelopes(client) {
31
33
  WHERE message_envelope IS NULL
32
34
  ORDER BY thread_id, seq
33
35
  LIMIT 1`);
34
- if (remaining.rows.length > 0) {
35
- const row = remaining.rows[0];
36
+ const [row] = remaining.rows;
37
+ if (row !== undefined) {
36
38
  throw new Error(`AI SDK message backfill left an unmigrated row at ${row.thread_id}/${row.seq}`);
37
39
  }
38
40
  }
@@ -22,15 +22,15 @@
22
22
  */
23
23
  import type { ModelMessage } from "ai";
24
24
  import { ResultAsync } from "neverthrow";
25
- import type { Pool } from "pg";
26
25
  import type { TokenUsageRollup } from "../contracts/usage.js";
27
- import { type DbError } from "../lib/db-result.js";
26
+ import { type Connectable, type DbError, type TransactionQuerier } from "../lib/db-result.js";
28
27
  import type { Logger } from "../lib/logger.js";
28
+ import type { Querier } from "../state/db.js";
29
29
  import { type StoredMessageEnvelope } from "./ai-sdk-message-storage.js";
30
30
  import type { MessagePart } from "../contracts/message.js";
31
31
  import { type ConversationUIMessage, type StoredDisplayEnvelope } from "./conversation-display-storage.js";
32
32
  /** One stored message, as returned by the display reads (`loadAll` and `loadPage`). */
33
- export interface StoredMessage {
33
+ export type StoredMessage = {
34
34
  readonly seq: number;
35
35
  readonly envelope: StoredMessageEnvelope;
36
36
  readonly message: ModelMessage;
@@ -69,7 +69,7 @@ export interface StoredMessage {
69
69
  * behind it.
70
70
  */
71
71
  readonly createdAt?: Date;
72
- }
72
+ };
73
73
  /**
74
74
  * One atomic group of rows: the exact provider-facing history, and the display
75
75
  * projection of what the user was shown.
@@ -79,7 +79,7 @@ export interface StoredMessage {
79
79
  * what the transcript replays. Neither is derived from the other, and a failed
80
80
  * write commits neither.
81
81
  */
82
- export interface ConversationTurn {
82
+ export type ConversationTurn = {
83
83
  /** Exact provider-facing history; token accounting and model reads use only this projection. */
84
84
  readonly modelMessages: readonly ModelMessage[];
85
85
  /** Complete ordered AI SDK UI messages recorded from the live display event stream. */
@@ -94,7 +94,12 @@ export interface ConversationTurn {
94
94
  * envelope, because a `text` parameter carrying 0x00 fails the statement.
95
95
  */
96
96
  readonly author?: string;
97
- }
97
+ /**
98
+ * The key of the group in its turn, stored on its first row. A turn workflow gives each group a key, thus a
99
+ * write that runs again after its commit finds the key and stores nothing.
100
+ */
101
+ readonly key?: string;
102
+ };
98
103
  /**
99
104
  * The append a host uses to record out-of-band work in a thread — an analysis
100
105
  * run's outcome, typically.
@@ -116,7 +121,7 @@ export declare function conversationRecordTurn(text: string, displayParts?: read
116
121
  /** The status of a chat turn: `open` while it runs, then its outcome. */
117
122
  export type TurnStatus = "open" | "done" | "aborted" | "failed";
118
123
  /** The close of a chat turn. It sets the outcome on the turn record, one time. */
119
- export interface TurnClose {
124
+ export type TurnClose = {
120
125
  readonly status: Exclude<TurnStatus, "open">;
121
126
  /** The reason of a failure. */
122
127
  readonly reason?: string;
@@ -125,7 +130,7 @@ export interface TurnClose {
125
130
  readonly turnDurationMs?: number;
126
131
  /** The note of a failure or of an abort, stored after the rounds. */
127
132
  readonly note?: ConversationTurn;
128
- }
133
+ };
129
134
  /**
130
135
  * One write of a chat turn. The opening adds the turn record, and a later write names the turn by
131
136
  * `startSeq`. The `never` members make a write with both keys fail to compile.
@@ -141,17 +146,17 @@ export type TurnWrite = {
141
146
  readonly rounds: readonly ConversationTurn[];
142
147
  readonly close?: TurnClose;
143
148
  };
144
- export interface TurnWriteResult {
149
+ export type TurnWriteResult = {
145
150
  /** The `seq` of the user row that opens the turn, which keys its turn record. */
146
151
  readonly startSeq: number;
147
- }
152
+ };
148
153
  /** The turn record of a chat turn, as the display read gives it. */
149
- export interface StoredTurnRecord {
154
+ export type StoredTurnRecord = {
150
155
  readonly status: TurnStatus;
151
156
  readonly reason?: string;
152
157
  readonly usage?: TokenUsageRollup;
153
158
  readonly durationMs?: number;
154
- }
159
+ };
155
160
  /**
156
161
  * The result of `retractLastTurn`. `retracted` carries `messages` — the number
157
162
  * of rows removed — so a caller can assert exactly what came off the tail. The
@@ -168,29 +173,34 @@ export type RetractOutcome = {
168
173
  kind: "no-user-turn";
169
174
  };
170
175
  /** The read options of {@link ThreadHistory.loadRecent}. */
171
- export interface LoadRecentOptions {
176
+ export type LoadRecentOptions = {
172
177
  /** Keep the first turn of the thread, the seed of a report thread, in front of the latest summary. */
173
178
  readonly keepFirstTurn?: boolean;
174
- }
179
+ /**
180
+ * Read the rows up to this `seq` only. A row never changes after its write, thus a turn workflow that reads up
181
+ * to the last row before its turn reads the same view on a replay.
182
+ */
183
+ readonly throughSeq?: number;
184
+ };
175
185
  /** The options of {@link ThreadHistory.loadPage}. */
176
- export interface LoadPageOptions {
186
+ export type LoadPageOptions = {
177
187
  /** The cursor that the previous page gave. Absent for the newest page. */
178
188
  readonly before?: number;
179
189
  /** The maximum count of turns in the page. */
180
190
  readonly limit: number;
181
- }
191
+ };
182
192
  /** One page of the display read, as {@link ThreadHistory.loadPage} gives it. */
183
- export interface TurnPage {
193
+ export type TurnPage = {
184
194
  /** The whole turns of the page, oldest-first. */
185
195
  readonly turns: StoredMessage[][];
186
196
  /** The cursor of the next older page, or `null` when the page holds the oldest row of the thread. */
187
197
  readonly before: number | null;
188
- }
198
+ };
189
199
  /**
190
200
  * The conversation message store. Two methods, by design — no generic row
191
201
  * insert (see the harness-thread-store spec). `threadId` is the conversation scope — one UI thread.
192
202
  */
193
- export interface ThreadHistory {
203
+ export type ThreadHistory = {
194
204
  /**
195
205
  * Append one group, for example a record of a host — every message written in a
196
206
  * single transaction with a `seq` monotonically increasing per thread.
@@ -286,7 +296,7 @@ export interface ThreadHistory {
286
296
  * one adds to the count.
287
297
  */
288
298
  countUserTurnsAfter(threadId: string, seq: number): ResultAsync<number, DbError>;
289
- }
299
+ };
290
300
  /**
291
301
  * Drop the memoized instruments so the next `loadRecent` rebinds to a
292
302
  * freshly-registered `MeterProvider`. Test-only.
@@ -302,4 +312,9 @@ export declare function __resetThreadHistoryMetricsForTest(): void;
302
312
  * same messages either way — the drop reports a deploy, not a failed read — and
303
313
  * requiring it would break every call site over a diagnostic.
304
314
  */
305
- export declare function createThreadHistory(pool: Pool, logger?: Logger): ThreadHistory;
315
+ /** What this module reads of the pool: the direct `query` plus the transactional `connect`. */
316
+ type ThreadHistoryPool = Querier & Connectable;
317
+ /** `appendTurn` inside the transaction of the caller, thus another write of the caller commits with the turn or not at all. */
318
+ export declare function appendTurnIn(client: TransactionQuerier, threadId: string, turn: ConversationTurn): ResultAsync<void, DbError>;
319
+ export declare function createThreadHistory(pool: ThreadHistoryPool, logger?: Logger): ThreadHistory;
320
+ export {};