@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
@@ -11,6 +11,7 @@
11
11
  * older consumers already handled. Nothing it drops is unavailable — the full record is
12
12
  * on the row, and consumers that want the resolved structure read it directly.
13
13
  */
14
+ import { presentFirst } from "../lib/present.js";
14
15
  /**
15
16
  * Every number the observations reported, side by side and de-duplicated.
16
17
  *
@@ -40,7 +41,7 @@ function examplesOf(dimension) {
40
41
  return [];
41
42
  }
42
43
  function fromGroup(group) {
43
- const format = group.formats.length === 1 ? group.formats[0].format : undefined;
44
+ const format = group.formats.length === 1 ? presentFirst(group.formats, "the single group format").format : undefined;
44
45
  return {
45
46
  id: group.id,
46
47
  name: group.name,
@@ -48,9 +49,9 @@ function fromGroup(group) {
48
49
  description: group.description,
49
50
  count: group.count,
50
51
  pattern: group.displayPattern,
51
- ...(format ? { format } : {}),
52
- ...(group.slots ? { slotIds: group.slots.map((slot) => slot.id) } : {}),
53
- ...(group.unclassified ? { unclassified: true } : {}),
52
+ format: format ? format : undefined,
53
+ slotIds: group.slots?.map((slot) => slot.id),
54
+ unclassified: group.unclassified ? true : undefined,
54
55
  };
55
56
  }
56
57
  /** The dataset's structure, from whichever field the snapshot carries it in. */
@@ -64,7 +65,7 @@ export function profileGroups(result) {
64
65
  description: kind.description,
65
66
  count: kind.count,
66
67
  pattern: kind.pathPattern,
67
- ...(kind.format ? { format: kind.format } : {}),
68
+ format: kind.format ? kind.format : undefined,
68
69
  }));
69
70
  }
70
71
  /** What varies across the dataset, from whichever field the snapshot carries it in. */
@@ -74,14 +75,14 @@ export function profileDimensions(result) {
74
75
  label: dimension.label,
75
76
  cardinalities: dimensionCardinalities(dimension),
76
77
  exampleValues: examplesOf(dimension),
77
- ...(dimension.description ? { description: dimension.description } : {}),
78
+ description: dimension.description ? dimension.description : undefined,
78
79
  }));
79
80
  }
80
81
  return (result.axes ?? []).map((axis) => ({
81
82
  label: axis.label,
82
83
  cardinalities: [axis.cardinality],
83
84
  exampleValues: axis.exampleValues ?? [],
84
- ...(axis.description ? { description: axis.description } : {}),
85
+ description: axis.description ? axis.description : undefined,
85
86
  }));
86
87
  }
87
88
  /**
@@ -96,7 +97,7 @@ export function profileFileRecords(result) {
96
97
  return result.groups.flatMap((group) => (group.memberAnnotations ?? []).map((annotation) => ({
97
98
  path: annotation.path,
98
99
  description: annotation.note,
99
- ...(group.formats.length === 1 ? { format: group.formats[0].format } : {}),
100
+ format: group.formats.length === 1 ? presentFirst(group.formats, "the single group format").format : undefined,
100
101
  })));
101
102
  }
102
103
  return result.files ?? [];
@@ -0,0 +1,42 @@
1
+ /**
2
+ * A chat turn in the process of a test, with no workflow. The turn of `chat-turn.ts` runs over a transport that
3
+ * streams to an emit sink and runs each write directly, thus a test drives the storage and the loop of a turn with
4
+ * no DBOS engine. A host reaches a turn through the turn workflow only, and `inProcessChatTurns` gives the test of
5
+ * a host the same surface over this turn.
6
+ */
7
+ import { type ChatTurns } from "./chat-turn-workflow.js";
8
+ import type { LoopOptions } from "../loop/run-loop.js";
9
+ import type { EmitFn } from "../loop/types.js";
10
+ import type { PromptCachePolicy } from "../providers/types.js";
11
+ import type { AgentDefinition } from "../loop/types.js";
12
+ import { type ChatTurnRan, type ChatTurnRefusal, type ChatTurnSession, type OpenChatTurnParams, type RunChatTurnDeps } from "./chat-turn.js";
13
+ /** The transport values of a turn in process. */
14
+ export type InProcessRunParams = {
15
+ readonly session: ChatTurnSession;
16
+ readonly emit: EmitFn;
17
+ readonly signal: AbortSignal;
18
+ readonly author?: string;
19
+ /** Absent counts from the open. */
20
+ readonly startedAtMs?: number;
21
+ readonly promptCache?: PromptCachePolicy;
22
+ /** The decision of the user on a call that asks for approval. Absent: the loop denies the call. */
23
+ readonly approve?: LoopOptions["approve"];
24
+ };
25
+ export type InProcessTurnParams = OpenChatTurnParams & InProcessRunParams;
26
+ export type InProcessTurnResult = ChatTurnRefusal | ChatTurnRan;
27
+ /** A prepared turn with its agent. Call `run` one time: each call stores a new opening of the same user message. */
28
+ export type InProcessOpenTurn = {
29
+ readonly kind: "ready";
30
+ readonly agent: AgentDefinition;
31
+ readonly run: (params: InProcessRunParams) => Promise<ChatTurnRan>;
32
+ };
33
+ /** Prepare a turn and resolve its agent. A refusal comes back before any row of the turn exists. */
34
+ export declare function openInProcessTurn(deps: RunChatTurnDeps, params: OpenChatTurnParams): Promise<InProcessOpenTurn | ChatTurnRefusal>;
35
+ /** Open a turn in process and run it. */
36
+ export declare function runInProcessTurn(deps: RunChatTurnDeps, params: InProcessTurnParams): Promise<InProcessTurnResult>;
37
+ /**
38
+ * The chat turns of a host test, over the turn in process: `open` starts the turn at once, `read` gives its frames
39
+ * with the end frame of a turn workflow, `stop` aborts it, and `outcome` gives its end. An ask has no answer here,
40
+ * thus a call that asks for an approval is denied.
41
+ */
42
+ export declare function inProcessChatTurns(deps: RunChatTurnDeps): ChatTurns;
@@ -0,0 +1,139 @@
1
+ /**
2
+ * A chat turn in the process of a test, with no workflow. The turn of `chat-turn.ts` runs over a transport that
3
+ * streams to an emit sink and runs each write directly, thus a test drives the storage and the loop of a turn with
4
+ * no DBOS engine. A host reaches a turn through the turn workflow only, and `inProcessChatTurns` gives the test of
5
+ * a host the same surface over this turn.
6
+ */
7
+ import { randomUUID } from "node:crypto";
8
+ import { toChatFrame } from "../contracts/chat-frame.js";
9
+ import { chatTurnEndOf } from "./chat-turn-workflow.js";
10
+ import { createConversationDisplayRecorder } from "../memory/conversation-display-recorder.js";
11
+ import { prepareChatTurn, runOpenTurn, userTextOf, } from "./chat-turn.js";
12
+ /** Prepare a turn and resolve its agent. A refusal comes back before any row of the turn exists. */
13
+ export async function openInProcessTurn(deps, params) {
14
+ const openedAtMs = Date.now();
15
+ let prepared;
16
+ try {
17
+ prepared = await prepareChatTurn(deps, params);
18
+ }
19
+ catch (cause) {
20
+ return { kind: "prepare_failed", cause };
21
+ }
22
+ if (prepared.kind === "not_found")
23
+ return prepared;
24
+ const agent = deps.agents.forThread(prepared.threadType);
25
+ if (agent.isErr())
26
+ return { kind: "agent_unresolved", threadType: prepared.threadType };
27
+ const ready = prepared;
28
+ return {
29
+ kind: "ready",
30
+ agent: agent.value,
31
+ run: (run) => {
32
+ const recorder = createConversationDisplayRecorder({ userText: userTextOf(ready.userMessage), agentId: agent.value.id, sink: run.emit });
33
+ return runOpenTurn(deps, params, ready, agent.value, { session: run.session, author: run.author, startedAtMs: run.startedAtMs ?? openedAtMs, promptCache: run.promptCache }, {
34
+ signal: run.signal,
35
+ emit: recorder.emit,
36
+ onText: (text) => recorder.emit({ type: "text-delta", text }),
37
+ recorder,
38
+ durably: (_name, write) => write(),
39
+ approve: run.approve,
40
+ });
41
+ },
42
+ };
43
+ }
44
+ /** Open a turn in process and run it. */
45
+ export async function runInProcessTurn(deps, params) {
46
+ const { analysisId, threadId, userInput, ...run } = params;
47
+ const opened = await openInProcessTurn(deps, { analysisId, threadId, userInput });
48
+ if (opened.kind !== "ready")
49
+ return opened;
50
+ return opened.run(run);
51
+ }
52
+ function createFrameLog() {
53
+ const frames = [];
54
+ let closed = false;
55
+ let waiters = [];
56
+ const wake = () => {
57
+ const woken = waiters;
58
+ waiters = [];
59
+ for (const resolve of woken)
60
+ resolve();
61
+ };
62
+ return {
63
+ push(frame) {
64
+ frames.push(frame);
65
+ wake();
66
+ },
67
+ close() {
68
+ closed = true;
69
+ wake();
70
+ },
71
+ async *read() {
72
+ for (let index = 0;; index += 1) {
73
+ while (index >= frames.length) {
74
+ if (closed)
75
+ return;
76
+ await new Promise((resolve) => waiters.push(resolve));
77
+ }
78
+ const frame = frames[index];
79
+ if (frame !== undefined)
80
+ yield frame;
81
+ }
82
+ },
83
+ };
84
+ }
85
+ /**
86
+ * The chat turns of a host test, over the turn in process: `open` starts the turn at once, `read` gives its frames
87
+ * with the end frame of a turn workflow, `stop` aborts it, and `outcome` gives its end. An ask has no answer here,
88
+ * thus a call that asks for an approval is denied.
89
+ */
90
+ export function inProcessChatTurns(deps) {
91
+ const turns = new Map();
92
+ return {
93
+ async open(session, request) {
94
+ const opened = await openInProcessTurn(deps, { analysisId: request.analysisId, threadId: request.threadId, userInput: request.userInput });
95
+ if (opened.kind !== "ready")
96
+ return opened;
97
+ const turnId = randomUUID();
98
+ const rootSource = { agentId: opened.agent.id, callPath: [opened.agent.id] };
99
+ const log = createFrameLog();
100
+ const controller = new AbortController();
101
+ const end = opened
102
+ .run({
103
+ session,
104
+ emit: (event) => {
105
+ const frame = toChatFrame(event, rootSource);
106
+ if (frame !== null)
107
+ log.push(structuredClone(frame));
108
+ },
109
+ signal: controller.signal,
110
+ author: request.author,
111
+ startedAtMs: request.startedAtMs,
112
+ promptCache: request.promptCache,
113
+ })
114
+ .then((ran) => {
115
+ const turnEnd = chatTurnEndOf(ran);
116
+ log.push(turnEnd.status === "failed"
117
+ ? { type: "error", message: turnEnd.reason ?? "The turn failed.", reason: turnEnd.code, source: rootSource }
118
+ : { type: "finish", source: rootSource, turnUsage: turnEnd.turnUsage });
119
+ return turnEnd;
120
+ })
121
+ .catch(() => null)
122
+ .finally(() => log.close());
123
+ turns.set(turnId, { log, controller, end });
124
+ return { kind: "started", turnId, agent: opened.agent };
125
+ },
126
+ read(turnId) {
127
+ const turn = turns.get(turnId);
128
+ if (turn === undefined)
129
+ throw new Error(`No turn ${turnId} runs in this process.`);
130
+ return turn.log.read();
131
+ },
132
+ stop(turnId) {
133
+ turns.get(turnId)?.controller.abort(new DOMException("The user stopped the turn.", "AbortError"));
134
+ return Promise.resolve();
135
+ },
136
+ answer: () => Promise.resolve("not_found"),
137
+ outcome: (turnId) => turns.get(turnId)?.end ?? Promise.resolve(null),
138
+ };
139
+ }
@@ -12,7 +12,7 @@ import type { LoopMessage } from "../loop/types.js";
12
12
  import type { ThreadHistory } from "../memory/thread-history.js";
13
13
  import type { ThreadType } from "../memory/thread-store.js";
14
14
  import type { WorkingMemoryStore } from "../memory/working-memory.js";
15
- export interface AssembleMessagesArgs {
15
+ export type AssembleMessagesArgs = {
16
16
  /** The conversation thread — a UI-generated UUID, never the analysisId. */
17
17
  readonly threadId: string;
18
18
  /** The type of the thread. A `report` thread gets no working-memory record, and its view keeps the seed. */
@@ -31,19 +31,25 @@ export interface AssembleMessagesArgs {
31
31
  readonly workingMemory: WorkingMemoryStore;
32
32
  /** Diagnostic seam for the history repair record; omitted falls back to no-op. */
33
33
  readonly logger?: Logger;
34
- }
35
- export interface AssembledMessages {
34
+ /** Read the thread up to this `seq` only (see `LoadRecentOptions.throughSeq`). */
35
+ readonly throughSeq?: number;
36
+ };
37
+ export type AssembledMessages = {
36
38
  /** The view of the thread before the turn. */
37
39
  readonly history: LoopMessage[];
38
40
  /** The sanitized user input as its own message — the genuine turn start. */
39
41
  readonly userMessage: ModelMessage;
40
42
  /** The context records after the user message. The turn stores them with the user message. */
41
43
  readonly contextRecords: readonly ModelMessage[];
42
- }
44
+ };
43
45
  /**
44
46
  * Assemble the message array for one chat turn. Async — it reads the view of
45
47
  * the thread and renders working memory.
46
48
  */
47
49
  export declare function assembleMessages(args: AssembleMessagesArgs): Promise<AssembledMessages>;
50
+ /** The user input as the message of the turn. Sanitization applies one time, here, to the new user input only. */
51
+ export declare function sanitizedUserMessage(userInput: string): ModelMessage;
52
+ /** The view of the thread before the turn, with a not-run result for each stored call that has no result. */
53
+ export declare function loadHistoryView(args: Pick<AssembleMessagesArgs, "threadId" | "threadType" | "history" | "logger" | "throughSeq">): Promise<LoopMessage[]>;
48
54
  /** The context records of one turn, in the order analysis context, run activity, working memory. */
49
55
  export declare function contextRecordsFor(args: Pick<AssembleMessagesArgs, "threadType" | "analysisId" | "analysisContext" | "runActivityContext" | "workingMemory">, history: readonly ModelMessage[]): Promise<ModelMessage[]>;
@@ -16,7 +16,18 @@ import { normalizeUnicode, redactSecrets } from "../input-sanitization.js";
16
16
  * the thread and renders working memory.
17
17
  */
18
18
  export async function assembleMessages(args) {
19
- const history = unwrapOrThrow(await args.history.loadRecent(args.threadId, { keepFirstTurn: args.threadType === "report" }));
19
+ const history = await loadHistoryView(args);
20
+ const userMessage = sanitizedUserMessage(args.userInput);
21
+ const contextRecords = await contextRecordsFor(args, history);
22
+ return { history, userMessage, contextRecords };
23
+ }
24
+ /** The user input as the message of the turn. Sanitization applies one time, here, to the new user input only. */
25
+ export function sanitizedUserMessage(userInput) {
26
+ return { role: "user", content: normalizeUnicode(redactSecrets(userInput)) };
27
+ }
28
+ /** The view of the thread before the turn, with a not-run result for each stored call that has no result. */
29
+ export async function loadHistoryView(args) {
30
+ const history = unwrapOrThrow(await args.history.loadRecent(args.threadId, { keepFirstTurn: args.threadType === "report", throughSeq: args.throughSeq }));
20
31
  // Read-side safety net for the wire contract: every tool call carries a
21
32
  // result. The loop upholds it at every exit, but the store outlives any one
22
33
  // writer — a row an older build wrote, or a hand-edited database, can carry
@@ -33,13 +44,7 @@ export async function assembleMessages(args) {
33
44
  tools: repaired.map((d) => d.toolName),
34
45
  });
35
46
  }
36
- // Sanitization — applied once, here, to the new user input only.
37
- const userMessage = {
38
- role: "user",
39
- content: normalizeUnicode(redactSecrets(args.userInput)),
40
- };
41
- const contextRecords = await contextRecordsFor(args, history);
42
- return { history, userMessage, contextRecords };
47
+ return history;
43
48
  }
44
49
  /** The context records of one turn, in the order analysis context, run activity, working memory. */
45
50
  export async function contextRecordsFor(args, history) {
@@ -56,7 +56,7 @@ export type EnsureSessionStateResult = {
56
56
  kind: EnsureFailureKind;
57
57
  detail: string;
58
58
  };
59
- export interface ReportSessionRuntimeDeps {
59
+ export type ReportSessionRuntimeDeps = {
60
60
  readonly pool: Pool;
61
61
  /**
62
62
  * The workspace-root seam of the pin. The citation evidence of an analysis sits on disk under the
@@ -64,7 +64,7 @@ export interface ReportSessionRuntimeDeps {
64
64
  */
65
65
  readonly resolveWorkspaceRoot?: ResolveWorkspaceRoot;
66
66
  readonly logger?: Logger;
67
- }
67
+ };
68
68
  /**
69
69
  * The report session-state runtime. The gateway serves the authoring tools, and
70
70
  * `ensureSessionState` anchors the session. The spawn of a report session runs
@@ -72,7 +72,7 @@ export interface ReportSessionRuntimeDeps {
72
72
  * turn runs it at the turn start, and the gateway `load` runs it too. Thus a tool
73
73
  * call cannot arrive before the state exists.
74
74
  */
75
- export interface ReportSessionRuntime {
75
+ export type ReportSessionRuntime = {
76
76
  readonly gateway: ReportSessionStateGateway;
77
77
  /**
78
78
  * The derivation ledger of the session state. The derivation tool appends one record for each
@@ -80,7 +80,7 @@ export interface ReportSessionRuntime {
80
80
  */
81
81
  readonly derivations: Pick<ReportSessionStateStore, "appendDerivation">;
82
82
  ensureSessionState(threadId: string): Promise<EnsureSessionStateResult>;
83
- }
83
+ };
84
84
  /**
85
85
  * Build the report session-state runtime bound to a Postgres pool. The factory
86
86
  * closure captures the pool and constructs the session-state store and the thread
@@ -34,6 +34,7 @@
34
34
  */
35
35
  import { createNoopLogger } from "../lib/console-logger.js";
36
36
  import { describeDbError } from "../lib/db-result.js";
37
+ import { nullProtoRecord } from "../lib/null-proto.js";
37
38
  import { createThreadStore } from "../memory/thread-store.js";
38
39
  import { pinReportSnapshot } from "../report-model/pin-snapshot.js";
39
40
  import { createReportSessionStateStore, } from "../state/report-session-state.js";
@@ -58,7 +59,7 @@ function serveMembership(snapshot, derivations) {
58
59
  if (derivations.length === 0) {
59
60
  return snapshot;
60
61
  }
61
- const artifacts = Object.create(null);
62
+ const artifacts = nullProtoRecord();
62
63
  for (const [path, entry] of Object.entries(snapshot.artifacts)) {
63
64
  artifacts[path] = entry;
64
65
  }
@@ -166,7 +167,7 @@ export function createReportSessionRuntime(deps) {
166
167
  };
167
168
  }
168
169
  const gateway = {
169
- async load(threadId) {
170
+ async load(threadId, callKey) {
170
171
  const ensured = await ensureSessionState(threadId);
171
172
  if (ensured.outcome === "failed") {
172
173
  switch (ensured.kind) {
@@ -178,27 +179,41 @@ export function createReportSessionRuntime(deps) {
178
179
  return { outcome: "failed", detail: ensured.detail };
179
180
  }
180
181
  }
181
- return toLoad(ensured.state);
182
+ const loaded = toLoad(ensured.state);
183
+ if (callKey === undefined || loaded.outcome !== "found")
184
+ return loaded;
185
+ const stored = await store.readCallResult(threadId, callKey);
186
+ if (stored.isErr())
187
+ return { outcome: "failed", detail: describeDbError(stored.error) };
188
+ return stored.value === null ? loaded : { ...loaded, landed: stored.value.result };
182
189
  },
183
- async persist(threadId, document, expected) {
184
- const result = await store.persistDocument({ threadId, document, expected });
185
- return result.match((outcome) => {
186
- switch (outcome) {
187
- case "persisted":
188
- return { outcome: "persisted" };
189
- case "conflict":
190
- // A concurrent turn landed first. The turn refuses and reads the state again.
191
- return { outcome: "conflict" };
192
- case "absent":
193
- // The pin writes the row first. A persist that finds no row means the
194
- // pin-first invariant broke.
195
- log.error("the session-state persist matched no row", { threadId });
196
- return { outcome: "failed", detail: "no report session state row exists to persist the document" };
190
+ async persist(threadId, document, expected, call) {
191
+ const result = await store.persistDocument({ threadId, document, expected, call });
192
+ if (result.isErr()) {
193
+ log.error("the session-state persist failed", { threadId, ...log.errorFields(result.error.cause) });
194
+ return { outcome: "failed", detail: describeDbError(result.error) };
195
+ }
196
+ switch (result.value) {
197
+ case "persisted":
198
+ return { outcome: "persisted" };
199
+ case "conflict":
200
+ // A concurrent turn landed first. The turn refuses and reads the state again.
201
+ return { outcome: "conflict" };
202
+ case "replayed": {
203
+ // An earlier run of the call landed while this run waited on the row lock.
204
+ const stored = call === undefined ? null : (await store.readCallResult(threadId, call.key)).unwrapOr(null);
205
+ if (stored === null) {
206
+ log.error("the stored result of an authoring call did not read back", { threadId });
207
+ return { outcome: "failed", detail: "the stored result of an earlier run of this call did not read back" };
208
+ }
209
+ return { outcome: "replayed", landed: stored.result };
197
210
  }
198
- }, (error) => {
199
- log.error("the session-state persist failed", { threadId, ...log.errorFields(error.cause) });
200
- return { outcome: "failed", detail: describeDbError(error) };
201
- });
211
+ case "absent":
212
+ // The pin writes the row first. A persist that finds no row means the
213
+ // pin-first invariant broke.
214
+ log.error("the session-state persist matched no row", { threadId });
215
+ return { outcome: "failed", detail: "no report session state row exists to persist the document" };
216
+ }
202
217
  },
203
218
  async stampRendered(threadId, hash) {
204
219
  const result = await store.stampRendered(threadId, hash);
@@ -5,11 +5,10 @@
5
5
  * The operation owns no table. It composes the reads and the writes that the
6
6
  * store, the thread history, and the working memory already give. `getThread`
7
7
  * finds the parent, and `latestSeq` gives the anchor. `listThreads` counts the
8
- * report children, and `createThread` writes the insert. `render` and
9
- * `appendTurn` make the seed, and `purgeThread` removes a child that holds no
10
- * seed. The two storage reads that this capability adds, `latestSeq` and
11
- * `countUserTurnsAfter`, live on the thread history, because that module owns
12
- * the `messages` table.
8
+ * report children, and `render` makes the seed. `createThread` writes the row
9
+ * and the seed in one transaction. The two storage reads that this capability
10
+ * adds, `latestSeq` and `countUserTurnsAfter`, live on the thread history,
11
+ * because that module owns the `messages` table.
13
12
  *
14
13
  * The reads and the insert take no lock and no transaction. A concurrent turn
15
14
  * can append between the anchor read and the insert, and a retract can cut the
@@ -18,8 +17,10 @@
18
17
  * past the parent's current end is a normal state a reader expects.
19
18
  *
20
19
  * A conversation thread id comes from the host UI. But the spawn is a harness
21
- * operation with no UI in front of it. Thus it mints a `randomUUID` and returns
22
- * the full row. A managed deployment gets the same behavior with no host code.
20
+ * operation with no UI in front of it. Thus the caller gives the child id, or
21
+ * the spawn mints a `randomUUID`, and the spawn returns the full row. A managed
22
+ * deployment gets the same behavior with no host code. A second spawn with the
23
+ * id of a child gives that child, and it writes nothing.
23
24
  *
24
25
  * The spawn also gates on the eyes of the composition. A report session records
25
26
  * a version only after a look at the rendered page, and only a browser can look.
@@ -32,9 +33,9 @@
32
33
  * The spawn seeds the context of the child at the anchor. It writes one message
33
34
  * that holds the brief and a copy of the working-memory render. The transcript
34
35
  * is append-only, thus the copy stays frozen at the anchor by construction, and
35
- * a later change to the working memory leaves it as it is. When the seed write
36
- * fails, the spawn purges the child, because a report thread with no context is
37
- * a dead end.
36
+ * a later change to the working memory leaves it as it is. The row and the seed
37
+ * commit in one transaction, because a report thread with no context is a dead
38
+ * end.
38
39
  *
39
40
  * The seed takes no redaction pass, and that is deliberate. The two parts are
40
41
  * agent-authored, the same trust tier as the working-memory render of a
@@ -59,8 +60,8 @@
59
60
  * the spawn.
60
61
  */
61
62
  import { ResultAsync } from "neverthrow";
62
- import type { Pool } from "pg";
63
- import type { DbError } from "../lib/db-result.js";
63
+ import type { Querier } from "../state/db.js";
64
+ import { type Connectable, type DbError } from "../lib/db-result.js";
64
65
  import { type ChromeConfig } from "../lib/chrome.js";
65
66
  import type { AcquireEyes } from "../lib/eyes.js";
66
67
  import type { Logger } from "../lib/logger.js";
@@ -98,10 +99,10 @@ export type SpawnRefusal = {
98
99
  readonly threadType: ThreadType;
99
100
  };
100
101
  /** The paging inputs `listReportSessions` forwards to the thread listing. */
101
- export interface ReportSessionPaging {
102
+ export type ReportSessionPaging = {
102
103
  readonly page?: number;
103
104
  readonly perPage?: number;
104
- }
105
+ };
105
106
  /**
106
107
  * The intent brief of one report session. The caller writes it at the moment of
107
108
  * the ask, and each field is short prose.
@@ -109,7 +110,7 @@ export interface ReportSessionPaging {
109
110
  * The brief carries intent alone. No field names a path, a dataset, or a format,
110
111
  * because the report session reads those from the workspace itself.
111
112
  */
112
- export interface ReportBrief {
113
+ export type ReportBrief = {
113
114
  /** The question that the report must answer. */
114
115
  readonly objective: string;
115
116
  /** The reader of the report. */
@@ -120,25 +121,25 @@ export interface ReportBrief {
120
121
  readonly exclusions?: string;
121
122
  /** The points that the user did not decide yet. */
122
123
  readonly openQuestions?: string;
123
- }
124
+ };
124
125
  /**
125
126
  * The report child that carries the greatest anchor. A tie on the anchor comes
126
127
  * from two concurrent spawns, and the newest `createdAt` wins it.
127
128
  */
128
- export interface NewestReportChild {
129
+ export type NewestReportChild = {
129
130
  readonly threadId: string;
130
131
  readonly title: string | null;
131
132
  /** The `parentSeq` of the child — the point of the parent transcript that it was built on. */
132
133
  readonly anchor: number;
133
134
  readonly createdAt: Date;
134
- }
135
+ };
135
136
  /**
136
137
  * The state that a caller reads before a new spawn. `newestChild` is `null` when
137
138
  * the parent holds no live report child, and an archived child reads the same
138
139
  * way, because a steer into hidden state is not permitted. An absent parent
139
140
  * reads the same way.
140
141
  */
141
- export interface ReportSessionDelta {
142
+ export type ReportSessionDelta = {
142
143
  readonly newestChild: NewestReportChild | null;
143
144
  /**
144
145
  * The count of the parent turns that a person opened past the anchor of
@@ -149,7 +150,7 @@ export interface ReportSessionDelta {
149
150
  * gives no anchor to count from. No count query runs in that case.
150
151
  */
151
152
  readonly userTurnsSinceAnchor: number | null;
152
- }
153
+ };
153
154
  /**
154
155
  * The construction inputs of the report-session operations.
155
156
  *
@@ -157,8 +158,8 @@ export interface ReportSessionDelta {
157
158
  * `capture`, and a `chrome` config that names a browser. One present route
158
159
  * passes the gate of the spawn.
159
160
  */
160
- export interface ReportSessionSpawnDeps {
161
- readonly pool: Pool;
161
+ export type ReportSessionSpawnDeps = {
162
+ readonly pool: Querier & Connectable;
162
163
  /**
163
164
  * The chrome config that the same composition gives to the eyes tool. The
164
165
  * spawn reads only whether it names a browser, thus the spawn and the tool
@@ -201,7 +202,7 @@ export interface ReportSessionSpawnDeps {
201
202
  readonly provenance?: ProvenanceSeam;
202
203
  /** Operational logging seam. An omitted logger falls back to the no-op. */
203
204
  readonly logger?: Logger;
204
- }
205
+ };
205
206
  /**
206
207
  * Whether the composition gives a route to a look at the rendered page. The
207
208
  * three routes are the eyes seam, the capture seam, and a chrome config that
@@ -220,7 +221,7 @@ export interface ReportSessionSpawnDeps {
220
221
  * gate expression of the module, and a new route belongs here and nowhere else.
221
222
  */
222
223
  export declare function compositionHasEyes(deps: Pick<ReportSessionSpawnDeps, "chrome" | "capture" | "eyes">): boolean;
223
- export interface ReportSessionSpawn {
224
+ export type ReportSessionSpawn = {
224
225
  /**
225
226
  * Make a `report` child of the parent conversation and return the full row.
226
227
  * The child takes the analysis of the parent, the parent thread id, and the
@@ -234,10 +235,14 @@ export interface ReportSessionSpawn {
234
235
  * Refused with a `SpawnRefusal`, no row written: a composition with no
235
236
  * eyes, an absent or archived parent, and a parent that is not a
236
237
  * conversation. A store refusal (`DbError`,
237
- * `ThreadInputError`) passes through unchanged. A failed seed write purges
238
- * the child and returns the fault, thus no context-less thread survives.
238
+ * `ThreadInputError`) passes through unchanged. The row and the seed
239
+ * commit in one transaction, thus a failed seed leaves no child.
240
+ *
241
+ * `childThreadId` names the child, and a spawn with no id mints a random
242
+ * one. A child with that id already stands after a first spawn, thus a
243
+ * second spawn gives it back and writes no second seed.
239
244
  */
240
- spawnReportSession(parentThreadId: string, brief: ReportBrief): ResultAsync<Thread, SpawnRefusal | DbError | ThreadInputError>;
245
+ spawnReportSession(parentThreadId: string, brief: ReportBrief, childThreadId?: string): ResultAsync<Thread, SpawnRefusal | DbError | ThreadInputError>;
241
246
  /**
242
247
  * The report sessions of one analysis, through the thread listing narrowed
243
248
  * to the type `report`. It adds no predicate of its own, so its answer and
@@ -259,7 +264,7 @@ export interface ReportSessionSpawn {
259
264
  * and not by the anchor. It reads no model judgment, and it writes nothing.
260
265
  */
261
266
  reportSessionDelta(parentThreadId: string): ResultAsync<ReportSessionDelta, DbError>;
262
- }
267
+ };
263
268
  /**
264
269
  * The page size of the walk over the report children of one parent. The
265
270
  * one-version policy keeps the count of children small, thus the walk reads one