@inflexa-ai/harness 0.45.0 → 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 (802) hide show
  1. package/README.md +6 -3
  2. package/dist/agents/conversation-agent.d.ts +19 -3
  3. package/dist/agents/conversation-agent.js +49 -30
  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 +35 -16
  9. package/dist/agents/sandbox/shared.js +63 -24
  10. package/dist/agents/sandbox/translational-safety-agent.js +26 -0
  11. package/dist/agents/sandbox/types.d.ts +26 -3
  12. package/dist/agents/sandbox/validate-skills.d.ts +2 -2
  13. package/dist/agents/sandbox/validate-skills.js +3 -1
  14. package/dist/agents/sandbox-catalog.d.ts +16 -2
  15. package/dist/agents/sandbox-catalog.js +22 -3
  16. package/dist/agents/system-prompt.d.ts +2 -2
  17. package/dist/app/approve-plan.d.ts +5 -2
  18. package/dist/app/approve-plan.js +1 -1
  19. package/dist/app/chat-turn-workflow.d.ts +114 -0
  20. package/dist/app/chat-turn-workflow.js +307 -0
  21. package/dist/app/chat-turn.d.ts +85 -57
  22. package/dist/app/chat-turn.js +125 -99
  23. package/dist/app/data-profile-orientation.js +10 -8
  24. package/dist/app/data-profile-view.d.ts +4 -4
  25. package/dist/app/data-profile-view.js +9 -8
  26. package/dist/app/in-process-turn.d.ts +42 -0
  27. package/dist/app/in-process-turn.js +139 -0
  28. package/dist/app/message-assembly.d.ts +10 -4
  29. package/dist/app/message-assembly.js +13 -8
  30. package/dist/app/report-session-runtime.d.ts +4 -4
  31. package/dist/app/report-session-runtime.js +36 -21
  32. package/dist/app/spawn-report-session.d.ts +33 -28
  33. package/dist/app/spawn-report-session.js +25 -40
  34. package/dist/app/synthesize-run.d.ts +22 -16
  35. package/dist/app/synthesize-run.js +41 -35
  36. package/dist/app/work.d.ts +96 -0
  37. package/dist/app/work.js +147 -0
  38. package/dist/auth/local-auth-context.d.ts +1 -3
  39. package/dist/auth/local-auth-context.js +1 -3
  40. package/dist/auth/local-run-authorizer.d.ts +1 -1
  41. package/dist/auth/local-run-authorizer.js +5 -3
  42. package/dist/auth/types.d.ts +26 -26
  43. package/dist/billing/cached-resolver.d.ts +4 -4
  44. package/dist/billing/run-charge.d.ts +5 -8
  45. package/dist/billing/run-charge.js +2 -2
  46. package/dist/billing/usage-recorder.d.ts +9 -9
  47. package/dist/citations/aggregate.js +1 -1
  48. package/dist/citations/clients/arxiv.d.ts +2 -2
  49. package/dist/citations/clients/arxiv.js +12 -4
  50. package/dist/citations/clients/common.js +4 -2
  51. package/dist/citations/clients/crossref.d.ts +2 -2
  52. package/dist/citations/clients/crossref.js +37 -37
  53. package/dist/citations/clients/doi-registry.js +15 -16
  54. package/dist/citations/clients/pubmed.d.ts +2 -2
  55. package/dist/citations/clients/pubmed.js +20 -13
  56. package/dist/citations/clients/semantic-scholar.d.ts +2 -2
  57. package/dist/citations/clients/semantic-scholar.js +9 -9
  58. package/dist/citations/compare.js +2 -2
  59. package/dist/citations/match.d.ts +2 -2
  60. package/dist/citations/match.js +12 -7
  61. package/dist/citations/normalize.js +35 -26
  62. package/dist/citations/plan.js +6 -2
  63. package/dist/citations/resolve.d.ts +6 -6
  64. package/dist/citations/resolve.js +34 -25
  65. package/dist/citations/types.d.ts +77 -77
  66. package/dist/config/environment-stores.d.ts +10 -8
  67. package/dist/config/resource-limits.js +1 -3
  68. package/dist/contracts/analogy-report.d.ts +7 -7
  69. package/dist/contracts/analogy-report.js +2 -2
  70. package/dist/contracts/chat-events.d.ts +46 -22
  71. package/dist/contracts/chat-events.js +1 -1
  72. package/dist/contracts/chat-frame.d.ts +15 -5
  73. package/dist/contracts/chat-frame.js +67 -40
  74. package/dist/contracts/chat-parts.d.ts +130 -67
  75. package/dist/contracts/chat-parts.js +1 -0
  76. package/dist/contracts/content-url.js +16 -2
  77. package/dist/contracts/data-profile.d.ts +38 -38
  78. package/dist/contracts/index.d.ts +3 -3
  79. package/dist/contracts/index.js +1 -1
  80. package/dist/contracts/message.d.ts +6 -6
  81. package/dist/contracts/organ-system.d.ts +11 -11
  82. package/dist/contracts/part-registry.d.ts +5 -4
  83. package/dist/contracts/part-registry.js +5 -0
  84. package/dist/contracts/profile-vocabulary.d.ts +11 -10
  85. package/dist/contracts/profile-vocabulary.js +10 -3
  86. package/dist/contracts/report-blocks.d.ts +329 -329
  87. package/dist/contracts/report-reference.d.ts +105 -81
  88. package/dist/contracts/report-reference.js +30 -13
  89. package/dist/contracts/schemas/chat-events.d.ts +45 -6
  90. package/dist/contracts/schemas/chat-events.js +16 -0
  91. package/dist/contracts/schemas/chat-parts.d.ts +214 -102
  92. package/dist/contracts/schemas/chat-parts.js +50 -7
  93. package/dist/contracts/schemas/index.d.ts +1 -1
  94. package/dist/contracts/schemas/index.js +1 -1
  95. package/dist/contracts/severity.d.ts +1 -1
  96. package/dist/contracts/structure-source.d.ts +3 -3
  97. package/dist/contracts/structure-source.js +6 -2
  98. package/dist/contracts/subagent-activity.d.ts +2 -2
  99. package/dist/contracts/subagent-activity.js +5 -3
  100. package/dist/contracts/usage.d.ts +2 -2
  101. package/dist/data/safety-panel-schema.d.ts +25 -25
  102. package/dist/data/safety-panel-schema.js +13 -4
  103. package/dist/execution/artifact-metadata.d.ts +23 -15
  104. package/dist/execution/artifact-metadata.js +33 -10
  105. package/dist/execution/artifact-record.d.ts +2 -2
  106. package/dist/execution/artifact-registration.d.ts +5 -5
  107. package/dist/execution/artifact-registry.d.ts +8 -8
  108. package/dist/execution/dbos-run-launcher.d.ts +24 -4
  109. package/dist/execution/dbos-run-launcher.js +58 -4
  110. package/dist/execution/dbos-workflow-purger.d.ts +7 -6
  111. package/dist/execution/dbos-workflow-purger.js +29 -21
  112. package/dist/execution/input-signature.d.ts +2 -2
  113. package/dist/execution/post-step-pipeline.d.ts +9 -9
  114. package/dist/execution/post-step-pipeline.js +1 -1
  115. package/dist/execution/post-step.js +2 -2
  116. package/dist/execution/reconcile-manifest.d.ts +4 -4
  117. package/dist/execution/reconcile-manifest.js +3 -2
  118. package/dist/execution/run-authorizer.d.ts +46 -37
  119. package/dist/execution/run-authorizer.js +8 -8
  120. package/dist/execution/run-canceler.d.ts +39 -17
  121. package/dist/execution/run-canceler.js +137 -28
  122. package/dist/execution/run-end-record.d.ts +29 -0
  123. package/dist/execution/run-end-record.js +27 -0
  124. package/dist/execution/run-event-parts.d.ts +0 -8
  125. package/dist/execution/run-event-parts.js +29 -24
  126. package/dist/execution/run-event-stream.d.ts +8 -8
  127. package/dist/execution/run-event-stream.js +3 -4
  128. package/dist/execution/run-launcher.d.ts +4 -4
  129. package/dist/execution/run-synthesis.d.ts +49 -48
  130. package/dist/execution/run-synthesis.js +96 -255
  131. package/dist/execution/staged-input.d.ts +2 -2
  132. package/dist/execution/step-summary.d.ts +6 -6
  133. package/dist/execution/step-summary.js +4 -8
  134. package/dist/execution/topo-sort.js +4 -3
  135. package/dist/execution/workflow-purger.d.ts +2 -2
  136. package/dist/index.d.ts +25 -24
  137. package/dist/index.js +36 -37
  138. package/dist/input-sanitization.js +9 -2
  139. package/dist/input-scan/clustering.d.ts +6 -6
  140. package/dist/input-scan/clustering.js +11 -5
  141. package/dist/input-scan/companions.js +3 -2
  142. package/dist/input-scan/detect-sets.d.ts +2 -2
  143. package/dist/input-scan/detect-sets.js +25 -21
  144. package/dist/input-scan/enrich.d.ts +6 -6
  145. package/dist/input-scan/enrich.js +29 -12
  146. package/dist/input-scan/formats.d.ts +2 -2
  147. package/dist/input-scan/formats.js +8 -2
  148. package/dist/input-scan/markers.d.ts +2 -2
  149. package/dist/input-scan/markers.js +14 -5
  150. package/dist/input-scan/menu.d.ts +10 -10
  151. package/dist/input-scan/menu.js +0 -0
  152. package/dist/input-scan/quarantine.d.ts +2 -2
  153. package/dist/input-scan/quarantine.js +23 -18
  154. package/dist/input-scan/readout-budget.d.ts +2 -2
  155. package/dist/input-scan/readout-budget.js +1 -1
  156. package/dist/input-scan/readout.d.ts +2 -2
  157. package/dist/input-scan/readout.js +47 -34
  158. package/dist/input-scan/scan.d.ts +2 -2
  159. package/dist/input-scan/scan.js +7 -5
  160. package/dist/input-scan/set-types.d.ts +28 -28
  161. package/dist/input-scan/shapes.d.ts +4 -4
  162. package/dist/input-scan/shapes.js +0 -0
  163. package/dist/input-scan/templates.d.ts +10 -10
  164. package/dist/input-scan/templates.js +30 -22
  165. package/dist/input-scan/tokens.d.ts +6 -4
  166. package/dist/input-scan/tokens.js +100 -38
  167. package/dist/input-scan/types.d.ts +22 -22
  168. package/dist/lib/async-utils.d.ts +3 -7
  169. package/dist/lib/async-utils.js +5 -9
  170. package/dist/lib/cache.js +1 -1
  171. package/dist/lib/chrome.d.ts +46 -6
  172. package/dist/lib/console-logger.js +2 -2
  173. package/dist/lib/db-result.d.ts +22 -6
  174. package/dist/lib/db-result.js +9 -13
  175. package/dist/lib/eyes.d.ts +4 -4
  176. package/dist/lib/eyes.js +1 -1
  177. package/dist/lib/fs-helpers.js +18 -6
  178. package/dist/lib/fs-result.d.ts +1 -0
  179. package/dist/lib/fs-result.js +5 -6
  180. package/dist/lib/hooks.d.ts +23 -7
  181. package/dist/lib/hooks.js +17 -3
  182. package/dist/lib/host-concurrency.js +3 -2
  183. package/dist/lib/logger.d.ts +2 -2
  184. package/dist/lib/logger.js +2 -1
  185. package/dist/lib/metrics.d.ts +1 -1
  186. package/dist/lib/null-proto.d.ts +6 -0
  187. package/dist/lib/null-proto.js +17 -0
  188. package/dist/lib/otel-spans.d.ts +1 -1
  189. package/dist/lib/otel-spans.js +9 -5
  190. package/dist/lib/otel.d.ts +4 -2
  191. package/dist/lib/otel.js +10 -2
  192. package/dist/lib/page-capture.d.ts +8 -8
  193. package/dist/lib/page-capture.js +9 -4
  194. package/dist/lib/parse-json.d.ts +5 -0
  195. package/dist/lib/parse-json.js +12 -0
  196. package/dist/lib/present.d.ts +12 -0
  197. package/dist/lib/present.js +39 -0
  198. package/dist/lib/rate-limit.d.ts +4 -4
  199. package/dist/lib/rate-limit.js +12 -13
  200. package/dist/lib/regulatory-corpus/fetch-fda-guidance.d.ts +4 -4
  201. package/dist/lib/regulatory-corpus/fetch-fda-guidance.js +4 -10
  202. package/dist/lib/regulatory-corpus/fetch-ich.d.ts +4 -4
  203. package/dist/lib/regulatory-corpus/fetch-ich.js +18 -14
  204. package/dist/lib/regulatory-corpus/normalize-whitespace.d.ts +6 -0
  205. package/dist/lib/regulatory-corpus/normalize-whitespace.js +41 -0
  206. package/dist/lib/regulatory-corpus.d.ts +10 -10
  207. package/dist/lib/regulatory-corpus.js +3 -1
  208. package/dist/lib/result.d.ts +10 -11
  209. package/dist/lib/result.js +15 -13
  210. package/dist/lib/storage.d.ts +2 -2
  211. package/dist/lib/test/async-iterable.d.ts +9 -0
  212. package/dist/lib/test/async-iterable.js +28 -0
  213. package/dist/lib/test/request-url.d.ts +5 -0
  214. package/dist/lib/test/request-url.js +7 -0
  215. package/dist/lib/test/result-assert.d.ts +12 -0
  216. package/dist/lib/test/result-assert.js +17 -0
  217. package/dist/lib/test/text-shapes.d.ts +24 -0
  218. package/dist/lib/test/text-shapes.js +63 -0
  219. package/dist/lib/text.d.ts +22 -0
  220. package/dist/lib/text.js +68 -0
  221. package/dist/lib/thrown.d.ts +18 -0
  222. package/dist/lib/thrown.js +30 -0
  223. package/dist/lib/unknown-array.d.ts +6 -0
  224. package/dist/lib/unknown-array.js +8 -0
  225. package/dist/lib/unknown-containers.d.ts +14 -0
  226. package/dist/lib/unknown-containers.js +17 -0
  227. package/dist/lib/unknown-text.d.ts +8 -0
  228. package/dist/lib/unknown-text.js +28 -0
  229. package/dist/lib/zod-issue-shape.d.ts +1 -1
  230. package/dist/lib/zod-issue-shape.js +31 -31
  231. package/dist/lib/zod-issues.d.ts +3 -3
  232. package/dist/lib/zod-issues.js +30 -17
  233. package/dist/literature/sources/arxiv.d.ts +6 -6
  234. package/dist/literature/sources/arxiv.js +92 -35
  235. package/dist/literature/sources/http.d.ts +2 -2
  236. package/dist/literature/sources/http.js +16 -15
  237. package/dist/literature/sources/pubmed.d.ts +16 -16
  238. package/dist/literature/sources/pubmed.js +96 -61
  239. package/dist/literature/sources/semantic-scholar.d.ts +8 -8
  240. package/dist/literature/sources/semantic-scholar.js +22 -13
  241. package/dist/loop/accounting.d.ts +63 -0
  242. package/dist/loop/accounting.js +141 -0
  243. package/dist/loop/call-policy.d.ts +73 -0
  244. package/dist/loop/call-policy.js +109 -0
  245. package/dist/loop/chat-stream.d.ts +62 -0
  246. package/dist/loop/chat-stream.js +237 -0
  247. package/dist/loop/compaction.d.ts +14 -9
  248. package/dist/loop/compaction.js +17 -0
  249. package/dist/loop/metrics.d.ts +12 -15
  250. package/dist/loop/metrics.js +14 -26
  251. package/dist/loop/run-loop.d.ts +233 -0
  252. package/dist/loop/run-loop.js +770 -0
  253. package/dist/loop/sub-agent.d.ts +61 -0
  254. package/dist/loop/sub-agent.js +161 -0
  255. package/dist/loop/tool-adapter.d.ts +98 -0
  256. package/dist/loop/tool-adapter.js +364 -0
  257. package/dist/loop/tool-detail.d.ts +1 -1
  258. package/dist/loop/tool-detail.js +6 -5
  259. package/dist/loop/tool-outcome.d.ts +1 -1
  260. package/dist/loop/tool-output.d.ts +4 -4
  261. package/dist/loop/tool-output.js +2 -2
  262. package/dist/loop/turn-credentials.d.ts +34 -0
  263. package/dist/loop/turn-credentials.js +73 -0
  264. package/dist/loop/types.d.ts +34 -37
  265. package/dist/loop/types.js +2 -7
  266. package/dist/memory/ai-sdk-message-storage.d.ts +5 -5
  267. package/dist/memory/ai-sdk-message-storage.js +13 -11
  268. package/dist/memory/card-builders.d.ts +14 -14
  269. package/dist/memory/card-builders.js +19 -15
  270. package/dist/memory/conversation-display-recorder.d.ts +22 -6
  271. package/dist/memory/conversation-display-recorder.js +64 -20
  272. package/dist/memory/conversation-display-replay.js +3 -2
  273. package/dist/memory/conversation-display-storage.d.ts +15 -7
  274. package/dist/memory/conversation-display-storage.js +141 -36
  275. package/dist/memory/conversation-view.d.ts +4 -4
  276. package/dist/memory/conversation-view.js +5 -4
  277. package/dist/memory/count-tokens.js +10 -8
  278. package/dist/memory/derive-thread-title.d.ts +0 -13
  279. package/dist/memory/derive-thread-title.js +2 -1
  280. package/dist/memory/message-backfill.d.ts +12 -5
  281. package/dist/memory/message-backfill.js +5 -3
  282. package/dist/memory/thread-history.d.ts +66 -24
  283. package/dist/memory/thread-history.js +212 -79
  284. package/dist/memory/thread-store.d.ts +26 -17
  285. package/dist/memory/thread-store.js +15 -9
  286. package/dist/memory/tool-call-integrity.d.ts +2 -2
  287. package/dist/memory/tool-call-integrity.js +4 -3
  288. package/dist/memory/working-memory.d.ts +16 -12
  289. package/dist/memory/working-memory.js +72 -61
  290. package/dist/prompts/briefing.d.ts +63 -9
  291. package/dist/prompts/briefing.js +130 -3
  292. package/dist/prompts/planner.js +13 -2
  293. package/dist/prompts/synthesis-agent.d.ts +1 -1
  294. package/dist/prompts/synthesis-agent.js +6 -14
  295. package/dist/provenance/collector.d.ts +6 -6
  296. package/dist/provenance/collector.js +15 -8
  297. package/dist/provenance/exec-frame.d.ts +2 -2
  298. package/dist/provenance/exec-frame.js +6 -1
  299. package/dist/provenance/seam.d.ts +24 -19
  300. package/dist/provenance/seam.js +7 -5
  301. package/dist/provenance/types.d.ts +6 -6
  302. package/dist/providers/ai-sdk.d.ts +113 -62
  303. package/dist/providers/ai-sdk.js +303 -458
  304. package/dist/providers/embedding.d.ts +2 -2
  305. package/dist/providers/embedding.js +1 -1
  306. package/dist/providers/errors.d.ts +22 -2
  307. package/dist/providers/errors.js +98 -50
  308. package/dist/providers/prompt-cache.d.ts +8 -8
  309. package/dist/providers/prompt-cache.js +13 -11
  310. package/dist/providers/reasoning.d.ts +2 -2
  311. package/dist/providers/reasoning.js +2 -2
  312. package/dist/providers/types.d.ts +59 -92
  313. package/dist/reference-data/catalog.d.ts +2 -15
  314. package/dist/reference-data/catalog.js +166 -10
  315. package/dist/reference-data/receipt.d.ts +2 -2
  316. package/dist/report-model/assert-rules.js +1 -1
  317. package/dist/report-model/authoring-grammar.d.ts +209 -231
  318. package/dist/report-model/block-walk.d.ts +10 -10
  319. package/dist/report-model/block-walk.js +2 -0
  320. package/dist/report-model/draft-finish.d.ts +8 -8
  321. package/dist/report-model/draft-finish.js +1 -1
  322. package/dist/report-model/draft-hash.js +8 -7
  323. package/dist/report-model/draft-operations.d.ts +22 -10
  324. package/dist/report-model/draft-operations.js +48 -30
  325. package/dist/report-model/draft-read.d.ts +19 -7
  326. package/dist/report-model/draft-read.js +16 -6
  327. package/dist/report-model/draft.d.ts +844 -2
  328. package/dist/report-model/draft.js +3 -1
  329. package/dist/report-model/fixture-resolver.js +39 -16
  330. package/dist/report-model/pin-snapshot.d.ts +2 -2
  331. package/dist/report-model/pin-snapshot.js +15 -15
  332. package/dist/report-model/production-resolver.d.ts +18 -18
  333. package/dist/report-model/production-resolver.js +50 -42
  334. package/dist/report-model/reference-resolver.d.ts +26 -10
  335. package/dist/report-model/reference-resolver.js +68 -5
  336. package/dist/report-model/reference-stamp.js +30 -38
  337. package/dist/report-model/structural-validation.js +12 -4
  338. package/dist/report-model/validate.d.ts +7 -7
  339. package/dist/report-model/validate.js +6 -6
  340. package/dist/report-render/assets.d.ts +2 -2
  341. package/dist/report-render/assets.js +27 -3
  342. package/dist/report-render/chart-export.d.ts +10 -2
  343. package/dist/report-render/chart-export.js +37 -11
  344. package/dist/report-render/chart-presets.d.ts +8 -8
  345. package/dist/report-render/chart-presets.js +3 -3
  346. package/dist/report-render/chart-renderers.d.ts +23 -16
  347. package/dist/report-render/chart-renderers.js +74 -53
  348. package/dist/report-render/chart-toolbox.d.ts +2 -2
  349. package/dist/report-render/chart-toolbox.js +7 -6
  350. package/dist/report-render/chart.d.ts +15 -16
  351. package/dist/report-render/chart.js +369 -252
  352. package/dist/report-render/design.d.ts +36 -297
  353. package/dist/report-render/design.js +0 -12
  354. package/dist/report-render/figures/common.d.ts +12 -12
  355. package/dist/report-render/figures/common.js +42 -31
  356. package/dist/report-render/figures/dendrogram.d.ts +3 -3
  357. package/dist/report-render/figures/dendrogram.js +10 -10
  358. package/dist/report-render/figures/dense.js +15 -8
  359. package/dist/report-render/figures/dotplot.js +46 -33
  360. package/dist/report-render/figures/embedding.js +52 -43
  361. package/dist/report-render/figures/equal-units.d.ts +10 -10
  362. package/dist/report-render/figures/equal-units.js +27 -27
  363. package/dist/report-render/figures/forest.js +9 -7
  364. package/dist/report-render/figures/gsea.js +21 -11
  365. package/dist/report-render/figures/heatmap.js +13 -9
  366. package/dist/report-render/figures/index.d.ts +10 -10
  367. package/dist/report-render/figures/index.js +4 -2
  368. package/dist/report-render/figures/km.js +10 -9
  369. package/dist/report-render/figures/label-room.d.ts +12 -12
  370. package/dist/report-render/figures/label-room.js +7 -2
  371. package/dist/report-render/figures/locuszoom.d.ts +2 -2
  372. package/dist/report-render/figures/locuszoom.js +59 -31
  373. package/dist/report-render/figures/lollipop.js +3 -2
  374. package/dist/report-render/figures/ma.js +8 -4
  375. package/dist/report-render/figures/manhattan.d.ts +1 -2
  376. package/dist/report-render/figures/manhattan.js +52 -34
  377. package/dist/report-render/figures/oncoprint.js +4 -5
  378. package/dist/report-render/figures/pca.js +25 -11
  379. package/dist/report-render/figures/qq.js +20 -9
  380. package/dist/report-render/figures/roc.js +1 -1
  381. package/dist/report-render/figures/sankey.d.ts +2 -2
  382. package/dist/report-render/figures/sankey.js +11 -10
  383. package/dist/report-render/figures/upset.d.ts +6 -6
  384. package/dist/report-render/figures/upset.js +7 -4
  385. package/dist/report-render/figures/volcano.js +12 -10
  386. package/dist/report-render/hybrid-svg.d.ts +4 -4
  387. package/dist/report-render/hybrid-svg.js +7 -5
  388. package/dist/report-render/number-format.d.ts +4 -4
  389. package/dist/report-render/number-format.js +62 -27
  390. package/dist/report-render/page.js +2 -1
  391. package/dist/report-render/provenance-data.d.ts +2 -2
  392. package/dist/report-render/references.d.ts +4 -4
  393. package/dist/report-render/render.d.ts +2 -2
  394. package/dist/report-render/render.js +10 -11
  395. package/dist/report-render/script-json.js +1 -1
  396. package/dist/report-render/table-data.d.ts +6 -6
  397. package/dist/report-render/test/options.d.ts +49 -0
  398. package/dist/report-render/test/options.js +143 -0
  399. package/dist/report-render/test/page-function.d.ts +19 -0
  400. package/dist/report-render/test/page-function.js +33 -0
  401. package/dist/report-render/types.d.ts +10 -10
  402. package/dist/report-render/value-bridge.d.ts +4 -4
  403. package/dist/report-render/value-bridge.js +27 -14
  404. package/dist/report-render/views/chart-view.d.ts +2 -2
  405. package/dist/report-render/views/chart-view.js +2 -2
  406. package/dist/report-render/views/lineage.d.ts +6 -6
  407. package/dist/report-render/views/lineage.js +2 -0
  408. package/dist/report-render/views/page-view.d.ts +2 -2
  409. package/dist/report-render/views/page-view.js +1 -0
  410. package/dist/report-render/views/prose.js +25 -8
  411. package/dist/report-render/views/references-view.js +12 -1
  412. package/dist/report-render/views/values.js +1 -1
  413. package/dist/runtime/assemble.d.ts +53 -26
  414. package/dist/runtime/assemble.js +103 -56
  415. package/dist/runtime/boot.d.ts +8 -7
  416. package/dist/runtime/boot.js +1 -1
  417. package/dist/runtime/connection-budget.d.ts +6 -6
  418. package/dist/runtime/connection-budget.js +1 -1
  419. package/dist/runtime/dbos.d.ts +29 -19
  420. package/dist/runtime/dbos.js +35 -20
  421. package/dist/runtime/result-serialization.js +18 -5
  422. package/dist/runtime/shutdown.d.ts +2 -2
  423. package/dist/sandbox/client.d.ts +7 -3
  424. package/dist/sandbox/cpu-files.d.ts +2 -2
  425. package/dist/sandbox/cpu-files.js +21 -4
  426. package/dist/sandbox/create-sandbox.d.ts +7 -8
  427. package/dist/sandbox/create-sandbox.js +6 -12
  428. package/dist/sandbox/docker-client.d.ts +48 -3
  429. package/dist/sandbox/docker-client.js +10 -6
  430. package/dist/sandbox/estimate-data-profile-resources.js +2 -7
  431. package/dist/sandbox/exec-outcome.d.ts +2 -2
  432. package/dist/sandbox/exec-outcome.js +1 -1
  433. package/dist/sandbox/exec.d.ts +10 -6
  434. package/dist/sandbox/exec.js +27 -12
  435. package/dist/sandbox/execution-id.js +14 -6
  436. package/dist/sandbox/farm.d.ts +2 -2
  437. package/dist/sandbox/farm.js +22 -27
  438. package/dist/sandbox/identity.d.ts +7 -0
  439. package/dist/sandbox/identity.js +14 -3
  440. package/dist/sandbox/image-packages.d.ts +26 -4
  441. package/dist/sandbox/image-packages.js +29 -27
  442. package/dist/sandbox/k8s-client.d.ts +35 -8
  443. package/dist/sandbox/k8s-client.js +6 -5
  444. package/dist/sandbox/labels.js +1 -0
  445. package/dist/sandbox/liveness.js +3 -1
  446. package/dist/sandbox/mount-plan.d.ts +10 -10
  447. package/dist/sandbox/mount-plan.js +13 -14
  448. package/dist/sandbox/notification-sweep.d.ts +4 -4
  449. package/dist/sandbox/notification-sweep.js +4 -7
  450. package/dist/sandbox/package-identity.d.ts +6 -13
  451. package/dist/sandbox/package-identity.js +46 -28
  452. package/dist/sandbox/reaper.d.ts +10 -10
  453. package/dist/sandbox/reaper.js +4 -6
  454. package/dist/sandbox/sandbox-error.d.ts +2 -9
  455. package/dist/sandbox/sandbox-error.js +21 -8
  456. package/dist/sandbox/sandbox-step-translate.d.ts +8 -5
  457. package/dist/sandbox/sandbox-step-translate.js +22 -8
  458. package/dist/sandbox/step-sandbox.d.ts +47 -0
  459. package/dist/sandbox/step-sandbox.js +53 -0
  460. package/dist/sandbox/types.d.ts +18 -19
  461. package/dist/sandbox/types.js +1 -1
  462. package/dist/schemas/artifact-manifest.d.ts +4 -4
  463. package/dist/schemas/data-profile-schemas.d.ts +351 -306
  464. package/dist/schemas/file-metadata.js +2 -4
  465. package/dist/schemas/plan-schemas.d.ts +79 -25
  466. package/dist/schemas/plan-schemas.js +1 -1
  467. package/dist/schemas/run-synthesis.d.ts +95 -26
  468. package/dist/schemas/run-synthesis.js +3 -1
  469. package/dist/schemas/validate-plan.d.ts +4 -4
  470. package/dist/schemas/validate-plan.js +17 -5
  471. package/dist/schemas/workflow-state.d.ts +127 -14
  472. package/dist/schemas/workflow-state.js +56 -2
  473. package/dist/state/active-turns.d.ts +36 -0
  474. package/dist/state/active-turns.js +67 -0
  475. package/dist/state/analyses-metrics.d.ts +8 -8
  476. package/dist/state/analyses-metrics.js +4 -4
  477. package/dist/state/analyses.d.ts +0 -14
  478. package/dist/state/analyses.js +0 -32
  479. package/dist/state/artifacts.d.ts +47 -18
  480. package/dist/state/artifacts.js +48 -7
  481. package/dist/state/data-profile.d.ts +2 -2
  482. package/dist/state/db.d.ts +12 -2
  483. package/dist/state/db.js +5 -0
  484. package/dist/state/edit-intents.d.ts +4 -0
  485. package/dist/state/edit-intents.js +71 -0
  486. package/dist/state/index.d.ts +5 -5
  487. package/dist/state/index.js +3 -3
  488. package/dist/state/init.d.ts +2 -1
  489. package/dist/state/init.js +5 -2
  490. package/dist/state/migrations/20260927120000_baseline.js +3 -1
  491. package/dist/state/migrations/20261026120000_add_the_edit_intents.d.ts +7 -0
  492. package/dist/state/migrations/20261026120000_add_the_edit_intents.js +21 -0
  493. package/dist/state/migrations/20261027120000_record_the_applied_memory_edits.d.ts +7 -0
  494. package/dist/state/migrations/20261027120000_record_the_applied_memory_edits.js +16 -0
  495. package/dist/state/migrations/20261027120100_store_the_authoring_results.d.ts +8 -0
  496. package/dist/state/migrations/20261027120100_store_the_authoring_results.js +20 -0
  497. package/dist/state/migrations/20261027120200_key_the_groups_of_a_turn.d.ts +7 -0
  498. package/dist/state/migrations/20261027120200_key_the_groups_of_a_turn.js +12 -0
  499. package/dist/state/migrations/20261027120300_mark_the_active_turn_of_a_thread.d.ts +7 -0
  500. package/dist/state/migrations/20261027120300_mark_the_active_turn_of_a_thread.js +11 -0
  501. package/dist/state/migrations/20261028120000_record_the_paused_work.d.ts +7 -0
  502. package/dist/state/migrations/20261028120000_record_the_paused_work.js +25 -0
  503. package/dist/state/migrations/20261028120100_end_the_suspended_runs.d.ts +8 -0
  504. package/dist/state/migrations/20261028120100_end_the_suspended_runs.js +13 -0
  505. package/dist/state/migrations/20261029120000_reference_the_run_mandate.d.ts +7 -0
  506. package/dist/state/migrations/20261029120000_reference_the_run_mandate.js +23 -0
  507. package/dist/state/migrations/20261029120100_record_the_run_session_of_a_pause.d.ts +7 -0
  508. package/dist/state/migrations/20261029120100_record_the_run_session_of_a_pause.js +11 -0
  509. package/dist/state/migrations/index.js +18 -0
  510. package/dist/state/paused-work.d.ts +52 -0
  511. package/dist/state/paused-work.js +105 -0
  512. package/dist/state/plans.d.ts +27 -8
  513. package/dist/state/plans.js +14 -11
  514. package/dist/state/purge-analysis.d.ts +6 -6
  515. package/dist/state/purge-analysis.js +10 -2
  516. package/dist/state/report-session-state.d.ts +43 -18
  517. package/dist/state/report-session-state.js +43 -4
  518. package/dist/state/report-versions.d.ts +16 -11
  519. package/dist/state/report-versions.js +5 -3
  520. package/dist/state/runs.d.ts +70 -25
  521. package/dist/state/runs.js +127 -64
  522. package/dist/state/schema.d.ts +18 -21
  523. package/dist/state/schema.js +4 -5
  524. package/dist/state/snapshot-parse.d.ts +2 -2
  525. package/dist/state/snapshot-parse.js +14 -8
  526. package/dist/state/step-executions.d.ts +29 -8
  527. package/dist/state/step-executions.js +28 -4
  528. package/dist/state/tool-outputs.d.ts +2 -2
  529. package/dist/state/tool-outputs.js +2 -1
  530. package/dist/state/vector-store.d.ts +16 -16
  531. package/dist/state/vector-store.js +11 -7
  532. package/dist/tasks/data-profile-absorb.d.ts +3 -3
  533. package/dist/tasks/data-profile-absorb.js +21 -16
  534. package/dist/tasks/data-profile-activity.d.ts +5 -5
  535. package/dist/tasks/data-profile-activity.js +5 -5
  536. package/dist/tasks/data-profile-index.d.ts +4 -4
  537. package/dist/tasks/data-profile-index.js +32 -17
  538. package/dist/tasks/data-profile-resolve.d.ts +8 -8
  539. package/dist/tasks/data-profile-resolve.js +88 -62
  540. package/dist/tasks/data-profile.d.ts +40 -31
  541. package/dist/tasks/data-profile.js +138 -95
  542. package/dist/tasks/extract-values.d.ts +26 -79
  543. package/dist/tasks/extract-values.js +48 -108
  544. package/dist/tasks/refresh-regulatory-corpus.d.ts +4 -20
  545. package/dist/tasks/refresh-regulatory-corpus.js +12 -8
  546. package/dist/tasks/regulatory-corpus-boot-refresh.d.ts +2 -2
  547. package/dist/tasks/regulatory-corpus-boot-refresh.js +12 -10
  548. package/dist/testing.d.ts +60 -0
  549. package/dist/testing.js +96 -0
  550. package/dist/tools/ad-hoc-router.d.ts +11 -9
  551. package/dist/tools/ad-hoc-router.js +80 -51
  552. package/dist/tools/analysis-invocation.d.ts +7 -0
  553. package/dist/tools/analysis-invocation.js +29 -5
  554. package/dist/tools/approval/contract.d.ts +8 -52
  555. package/dist/tools/approval/contract.js +7 -36
  556. package/dist/tools/approval/gateway.d.ts +27 -28
  557. package/dist/tools/approval/gateway.js +33 -130
  558. package/dist/tools/approval/queries.d.ts +6 -11
  559. package/dist/tools/approval/queries.js +43 -29
  560. package/dist/tools/approval/uuidv7.js +2 -2
  561. package/dist/tools/bio/chembl.d.ts +3 -3
  562. package/dist/tools/bio/chembl.js +10 -0
  563. package/dist/tools/bio/comptox.d.ts +25 -8
  564. package/dist/tools/bio/comptox.js +4 -2
  565. package/dist/tools/bio/drug-gene-interactions.d.ts +27 -17
  566. package/dist/tools/bio/drug-gene-interactions.js +11 -8
  567. package/dist/tools/bio/gene-disease-evidence.d.ts +61 -15
  568. package/dist/tools/bio/gene-disease-evidence.js +10 -6
  569. package/dist/tools/bio/gene-preclinical-profile.d.ts +11 -11
  570. package/dist/tools/bio/keys.d.ts +2 -2
  571. package/dist/tools/bio/keys.js +3 -3
  572. package/dist/tools/bio/lookup-annotation.d.ts +5 -5
  573. package/dist/tools/bio/lookup-annotation.js +3 -0
  574. package/dist/tools/bio/opentargets.d.ts +1 -1
  575. package/dist/tools/bio/opentargets.js +6 -0
  576. package/dist/tools/bio/pubchem.d.ts +2 -2
  577. package/dist/tools/bio/pubchem.js +6 -0
  578. package/dist/tools/bio/pubmed.d.ts +26 -16
  579. package/dist/tools/bio/pubmed.js +9 -3
  580. package/dist/tools/bio/search-clinical-trials.d.ts +4 -4
  581. package/dist/tools/bio/search-clinical-trials.js +5 -1
  582. package/dist/tools/bio/search-faers.d.ts +2 -2
  583. package/dist/tools/bio/search-faers.js +1 -1
  584. package/dist/tools/bio/search-gene.d.ts +2 -2
  585. package/dist/tools/bio/search-gene.js +1 -0
  586. package/dist/tools/bio/search-geo-datasets.d.ts +4 -4
  587. package/dist/tools/bio/search-geo-datasets.js +5 -5
  588. package/dist/tools/bio/search-interactions.d.ts +1 -1
  589. package/dist/tools/bio/search-patents.d.ts +28 -22
  590. package/dist/tools/bio/search-patents.js +20 -17
  591. package/dist/tools/bio/search-protein.d.ts +2 -2
  592. package/dist/tools/bio/search-protein.js +1 -1
  593. package/dist/tools/bio/search-regulatory-approvals.d.ts +64 -18
  594. package/dist/tools/bio/search-regulatory-approvals.js +21 -16
  595. package/dist/tools/bio/target-safety.d.ts +8 -8
  596. package/dist/tools/bio/target-safety.js +11 -6
  597. package/dist/tools/capability-data.d.ts +40 -0
  598. package/dist/tools/capability-data.js +74 -0
  599. package/dist/tools/define-tool.d.ts +55 -46
  600. package/dist/tools/define-tool.js +39 -27
  601. package/dist/tools/display/normalize-echart-spec.d.ts +2 -2
  602. package/dist/tools/display/normalize-echart-spec.js +51 -27
  603. package/dist/tools/display/show-user.d.ts +2 -2
  604. package/dist/tools/display/show-user.js +1 -1
  605. package/dist/tools/execute-analysis.d.ts +54 -17
  606. package/dist/tools/execute-analysis.js +193 -62
  607. package/dist/tools/knowledge/check.d.ts +182 -0
  608. package/dist/tools/knowledge/check.js +94 -0
  609. package/dist/tools/knowledge/client.d.ts +351 -0
  610. package/dist/tools/knowledge/client.js +319 -0
  611. package/dist/tools/knowledge/environment.d.ts +78 -0
  612. package/dist/tools/knowledge/environment.js +116 -0
  613. package/dist/tools/knowledge/index.d.ts +49 -0
  614. package/dist/tools/knowledge/index.js +70 -0
  615. package/dist/tools/knowledge/local-slots.d.ts +62 -0
  616. package/dist/tools/knowledge/local-slots.js +184 -0
  617. package/dist/tools/knowledge/pin.d.ts +14 -0
  618. package/dist/tools/knowledge/pin.js +17 -0
  619. package/dist/tools/knowledge/recommend.d.ts +67 -0
  620. package/dist/tools/knowledge/recommend.js +106 -0
  621. package/dist/tools/knowledge/situation.d.ts +143 -0
  622. package/dist/tools/knowledge/situation.js +157 -0
  623. package/dist/tools/knowledge/skeleton.d.ts +69 -0
  624. package/dist/tools/knowledge/skeleton.js +201 -0
  625. package/dist/tools/knowledge/template.d.ts +139 -0
  626. package/dist/tools/knowledge/template.js +273 -0
  627. package/dist/tools/lib/alphafold-client.js +2 -1
  628. package/dist/tools/lib/amass-client.d.ts +28 -28
  629. package/dist/tools/lib/amass-client.js +20 -10
  630. package/dist/tools/lib/api-utils.d.ts +13 -3
  631. package/dist/tools/lib/api-utils.js +17 -3
  632. package/dist/tools/lib/bgee-client.d.ts +6 -6
  633. package/dist/tools/lib/bgee-client.js +16 -10
  634. package/dist/tools/lib/cbioportal-client.d.ts +4 -4
  635. package/dist/tools/lib/cbioportal-client.js +9 -8
  636. package/dist/tools/lib/chembl-client.d.ts +14 -14
  637. package/dist/tools/lib/chembl-client.js +11 -4
  638. package/dist/tools/lib/clinical-benchmarks-client.d.ts +4 -4
  639. package/dist/tools/lib/clinical-benchmarks-client.js +4 -7
  640. package/dist/tools/lib/clinical-trials-client.d.ts +18 -18
  641. package/dist/tools/lib/clinical-trials-client.js +10 -10
  642. package/dist/tools/lib/clinvar-client.d.ts +2 -2
  643. package/dist/tools/lib/clinvar-client.js +6 -6
  644. package/dist/tools/lib/ctx-ops.d.ts +23 -23
  645. package/dist/tools/lib/ctx-ops.js +13 -10
  646. package/dist/tools/lib/dgidb-client.d.ts +6 -6
  647. package/dist/tools/lib/dgidb-client.js +10 -12
  648. package/dist/tools/lib/disgenet-client.d.ts +4 -4
  649. package/dist/tools/lib/ema-client.d.ts +2 -2
  650. package/dist/tools/lib/ensembl-client.d.ts +4 -4
  651. package/dist/tools/lib/ensembl-client.js +5 -4
  652. package/dist/tools/lib/gwas-catalog-client.d.ts +4 -4
  653. package/dist/tools/lib/gwas-catalog-client.js +17 -17
  654. package/dist/tools/lib/html-text.d.ts +6 -0
  655. package/dist/tools/lib/html-text.js +9 -0
  656. package/dist/tools/lib/identifier-resolver.d.ts +4 -4
  657. package/dist/tools/lib/identifier-resolver.js +7 -3
  658. package/dist/tools/lib/impc-client.d.ts +8 -8
  659. package/dist/tools/lib/impc-client.js +46 -35
  660. package/dist/tools/lib/iuphar-client.d.ts +2 -2
  661. package/dist/tools/lib/iuphar-client.js +7 -16
  662. package/dist/tools/lib/monarch-client.d.ts +4 -4
  663. package/dist/tools/lib/openfda-client.d.ts +22 -22
  664. package/dist/tools/lib/openfda-client.js +23 -22
  665. package/dist/tools/lib/opentargets-client.d.ts +12 -12
  666. package/dist/tools/lib/pathway-client.d.ts +4 -4
  667. package/dist/tools/lib/pathway-client.js +15 -19
  668. package/dist/tools/lib/pharmgkb-client.d.ts +2 -2
  669. package/dist/tools/lib/pharmgkb-client.js +1 -1
  670. package/dist/tools/lib/protein-family-modality.d.ts +2 -2
  671. package/dist/tools/lib/protein-family-modality.js +0 -2
  672. package/dist/tools/lib/protein-family-normalize.js +7 -0
  673. package/dist/tools/lib/pubchem-client.d.ts +2 -2
  674. package/dist/tools/lib/pubchem-client.js +1 -0
  675. package/dist/tools/lib/pubchem-ops.d.ts +4 -4
  676. package/dist/tools/lib/pubchem-ops.js +8 -0
  677. package/dist/tools/lib/pubmed-client.d.ts +9 -9
  678. package/dist/tools/lib/pubmed-client.js +1 -1
  679. package/dist/tools/lib/string-client.d.ts +6 -6
  680. package/dist/tools/lib/uniprot-client.d.ts +8 -8
  681. package/dist/tools/lib/uniprot-client.js +5 -1
  682. package/dist/tools/memory/update-working-memory.d.ts +16 -13
  683. package/dist/tools/memory/update-working-memory.js +21 -3
  684. package/dist/tools/read-tool-output.js +8 -2
  685. package/dist/tools/registry.d.ts +2 -2
  686. package/dist/tools/report-authoring/authoring-tools.d.ts +54 -23
  687. package/dist/tools/report-authoring/authoring-tools.js +128 -62
  688. package/dist/tools/report-session/derive-table.d.ts +19 -59
  689. package/dist/tools/report-session/derive-table.js +120 -122
  690. package/dist/tools/report-session/examine-page.d.ts +6 -6
  691. package/dist/tools/report-session/examine-page.js +14 -12
  692. package/dist/tools/report-session/list-artifacts.d.ts +6 -6
  693. package/dist/tools/report-session/list-artifacts.js +5 -5
  694. package/dist/tools/report-session/page-faults.d.ts +6 -6
  695. package/dist/tools/report-session/page-faults.js +3 -1
  696. package/dist/tools/report-session/preview-report.d.ts +4 -3
  697. package/dist/tools/report-session/preview-report.js +26 -7
  698. package/dist/tools/report-session/record-version.d.ts +9 -4
  699. package/dist/tools/report-session/record-version.js +16 -9
  700. package/dist/tools/report-session/session-page-publisher.d.ts +6 -6
  701. package/dist/tools/research/generate-analogy-report.d.ts +14 -7
  702. package/dist/tools/research/generate-analogy-report.js +80 -76
  703. package/dist/tools/research/generate-plan.d.ts +39 -16
  704. package/dist/tools/research/generate-plan.js +565 -338
  705. package/dist/tools/research/guarded-address.d.ts +20 -0
  706. package/dist/tools/research/guarded-address.js +149 -0
  707. package/dist/tools/research/inspect-data-profile.d.ts +27 -20
  708. package/dist/tools/research/inspect-data-profile.js +26 -25
  709. package/dist/tools/research/inspect-run.d.ts +54 -27
  710. package/dist/tools/research/inspect-run.js +50 -40
  711. package/dist/tools/research/literature-reviewer.d.ts +8 -7
  712. package/dist/tools/research/literature-reviewer.js +29 -28
  713. package/dist/tools/research/search-arxiv.d.ts +1 -1
  714. package/dist/tools/research/search-arxiv.js +1 -1
  715. package/dist/tools/research/search-github-repos.d.ts +10 -7
  716. package/dist/tools/research/search-github-repos.js +25 -22
  717. package/dist/tools/research/search-semantic-scholar.js +1 -1
  718. package/dist/tools/research/searxng-engine.d.ts +40 -0
  719. package/dist/tools/research/searxng-engine.js +122 -0
  720. package/dist/tools/research/web-fetch.d.ts +127 -0
  721. package/dist/tools/research/web-fetch.js +618 -0
  722. package/dist/tools/research/web-search.d.ts +84 -0
  723. package/dist/tools/research/web-search.js +117 -0
  724. package/dist/tools/sandbox/link-packages.d.ts +11 -7
  725. package/dist/tools/sandbox/link-packages.js +11 -8
  726. package/dist/tools/sandbox/list-available-packages.d.ts +24 -12
  727. package/dist/tools/sandbox/list-available-packages.js +43 -29
  728. package/dist/tools/sandbox/list-available-refs.d.ts +38 -14
  729. package/dist/tools/sandbox/list-available-refs.js +119 -37
  730. package/dist/tools/sandbox/report-blocker.d.ts +30 -37
  731. package/dist/tools/sandbox/report-blocker.js +22 -68
  732. package/dist/tools/sandbox/skills.d.ts +16 -12
  733. package/dist/tools/sandbox/skills.js +16 -12
  734. package/dist/tools/sandbox/submit-file-metadata.d.ts +12 -9
  735. package/dist/tools/sandbox/submit-file-metadata.js +18 -21
  736. package/dist/tools/start-report-session.d.ts +13 -5
  737. package/dist/tools/start-report-session.js +35 -8
  738. package/dist/tools/terminal-text.d.ts +14 -0
  739. package/dist/tools/terminal-text.js +51 -0
  740. package/dist/tools/workspace/decision-record.d.ts +81 -0
  741. package/dist/tools/workspace/decision-record.js +127 -0
  742. package/dist/tools/workspace/edit-file.d.ts +59 -18
  743. package/dist/tools/workspace/edit-file.js +98 -15
  744. package/dist/tools/workspace/execute-command.d.ts +31 -12
  745. package/dist/tools/workspace/execute-command.js +37 -8
  746. package/dist/tools/workspace/file-stat.d.ts +6 -3
  747. package/dist/tools/workspace/grep.d.ts +10 -7
  748. package/dist/tools/workspace/grep.js +9 -3
  749. package/dist/tools/workspace/index.d.ts +1 -0
  750. package/dist/tools/workspace/index.js +1 -0
  751. package/dist/tools/workspace/list-files.d.ts +6 -3
  752. package/dist/tools/workspace/mutator.d.ts +28 -15
  753. package/dist/tools/workspace/mutator.js +107 -53
  754. package/dist/tools/workspace/read-file.d.ts +8 -5
  755. package/dist/tools/workspace/result-bounds.d.ts +5 -5
  756. package/dist/tools/workspace/result-bounds.js +4 -2
  757. package/dist/tools/workspace/run-exec.d.ts +2 -2
  758. package/dist/tools/workspace/run-exec.js +3 -3
  759. package/dist/tools/workspace/scan-inputs.d.ts +8 -5
  760. package/dist/tools/workspace/scan-inputs.js +17 -5
  761. package/dist/tools/workspace/show-file.d.ts +1 -1
  762. package/dist/tools/workspace/show-file.js +2 -1
  763. package/dist/tools/workspace/show-plan.d.ts +8 -5
  764. package/dist/tools/workspace/show-plan.js +9 -8
  765. package/dist/tools/workspace/workspace-search.d.ts +41 -13
  766. package/dist/tools/workspace/workspace-search.js +27 -14
  767. package/dist/tools/workspace/write-file.d.ts +9 -7
  768. package/dist/workflows/execute-analysis-scheduler.d.ts +9 -9
  769. package/dist/workflows/execute-analysis-scheduler.js +6 -3
  770. package/dist/workflows/execute-analysis.d.ts +100 -76
  771. package/dist/workflows/execute-analysis.js +380 -247
  772. package/dist/workflows/pause.d.ts +71 -0
  773. package/dist/workflows/pause.js +173 -0
  774. package/dist/workflows/sandbox-step.d.ts +50 -61
  775. package/dist/workflows/sandbox-step.js +99 -106
  776. package/dist/workflows/test/sql-writes.d.ts +21 -0
  777. package/dist/workflows/test/sql-writes.js +36 -0
  778. package/dist/workspace/filesystem.d.ts +6 -6
  779. package/dist/workspace/filesystem.js +10 -8
  780. package/dist/workspace/paths.d.ts +1 -1
  781. package/dist/workspace/paths.js +15 -4
  782. package/dist/workspace/search-config.d.ts +2 -2
  783. package/dist/workspace/search-config.js +1 -1
  784. package/package.json +25 -22
  785. package/dist/loop/continue-agent.d.ts +0 -40
  786. package/dist/loop/continue-agent.js +0 -38
  787. package/dist/loop/genai-spans.d.ts +0 -47
  788. package/dist/loop/genai-spans.js +0 -134
  789. package/dist/loop/run-agent.d.ts +0 -236
  790. package/dist/loop/run-agent.js +0 -1110
  791. package/dist/loop/run-step.d.ts +0 -29
  792. package/dist/loop/run-step.js +0 -34
  793. package/dist/loop/run-to-terminal.d.ts +0 -66
  794. package/dist/loop/run-to-terminal.js +0 -90
  795. package/dist/loop/tool-mask.d.ts +0 -23
  796. package/dist/loop/tool-mask.js +0 -46
  797. package/dist/providers/streaming-chat.d.ts +0 -32
  798. package/dist/providers/streaming-chat.js +0 -91
  799. package/dist/tasks/derive-table-exec.d.ts +0 -54
  800. package/dist/tasks/derive-table-exec.js +0 -86
  801. package/dist/workflows/suspension.d.ts +0 -32
  802. package/dist/workflows/suspension.js +0 -38
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Record each workflow that waits in a pause. The row is the state that a host
3
+ * reads when it lists the paused work of an analysis, for example after a
4
+ * restart, and it names the topic that the resume sends to.
5
+ */
6
+ import type { Migration } from "kysely/migration";
7
+ export declare const recordThePausedWork: Migration;
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Record each workflow that waits in a pause. The row is the state that a host
3
+ * reads when it lists the paused work of an analysis, for example after a
4
+ * restart, and it names the topic that the resume sends to.
5
+ */
6
+ import { sql } from "kysely";
7
+ export const recordThePausedWork = {
8
+ async up(db) {
9
+ await sql `CREATE TABLE IF NOT EXISTS cortex_paused_work (
10
+ workflow_id TEXT PRIMARY KEY,
11
+ work_id TEXT NOT NULL,
12
+ work_kind TEXT NOT NULL,
13
+ analysis_id TEXT NOT NULL,
14
+ thread_id TEXT,
15
+ state TEXT NOT NULL,
16
+ cause JSONB NOT NULL,
17
+ attempt INTEGER NOT NULL,
18
+ retry_at TIMESTAMPTZ,
19
+ topic TEXT NOT NULL,
20
+ paused_at TIMESTAMPTZ NOT NULL
21
+ )`.execute(db);
22
+ await sql `CREATE INDEX IF NOT EXISTS idx_cortex_paused_work_analysis ON cortex_paused_work(analysis_id)`.execute(db);
23
+ await sql `CREATE INDEX IF NOT EXISTS idx_cortex_paused_work_work ON cortex_paused_work(work_id)`.execute(db);
24
+ },
25
+ };
@@ -0,0 +1,8 @@
1
+ /**
2
+ * End the rows of the suspended state. A suspended run ended `CANCELLED` in the
3
+ * engine, and no code can resume it, thus its row reads as `failed` with its
4
+ * reason. An analysis has no suspended state any more, because paused work
5
+ * records itself in `cortex_paused_work`.
6
+ */
7
+ import type { Migration } from "kysely/migration";
8
+ export declare const endTheSuspendedRuns: Migration;
@@ -0,0 +1,13 @@
1
+ /**
2
+ * End the rows of the suspended state. A suspended run ended `CANCELLED` in the
3
+ * engine, and no code can resume it, thus its row reads as `failed` with its
4
+ * reason. An analysis has no suspended state any more, because paused work
5
+ * records itself in `cortex_paused_work`.
6
+ */
7
+ import { sql } from "kysely";
8
+ export const endTheSuspendedRuns = {
9
+ async up(db) {
10
+ await sql `UPDATE cortex_runs SET status = 'failed' WHERE status = 'suspended_insufficient_funds'`.execute(db);
11
+ await sql `UPDATE cortex_analysis_state SET status = 'active' WHERE status = 'suspended_insufficient_funds'`.execute(db);
12
+ },
13
+ };
@@ -0,0 +1,7 @@
1
+ /**
2
+ * The run ledger keeps a reference to the run credential, not a token: the id
3
+ * of the mandate, which a realization resolves to a short-lived credential.
4
+ * The reference has no expiry, because the run does not depend on a clock.
5
+ */
6
+ import type { Migration } from "kysely/migration";
7
+ export declare const referenceTheRunMandate: Migration;
@@ -0,0 +1,23 @@
1
+ /**
2
+ * The run ledger keeps a reference to the run credential, not a token: the id
3
+ * of the mandate, which a realization resolves to a short-lived credential.
4
+ * The reference has no expiry, because the run does not depend on a clock.
5
+ */
6
+ import { sql } from "kysely";
7
+ export const referenceTheRunMandate = {
8
+ async up(db) {
9
+ // The baseline adds `mandate_jti` again on a database that ran it before, thus the column can stand beside
10
+ // `mandate_id`. Then it holds no value that `mandate_id` does not.
11
+ await sql `DO $$
12
+ BEGIN
13
+ IF EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name = 'cortex_runs' AND column_name = 'mandate_jti') THEN
14
+ IF EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name = 'cortex_runs' AND column_name = 'mandate_id') THEN
15
+ ALTER TABLE cortex_runs DROP COLUMN mandate_jti;
16
+ ELSE
17
+ ALTER TABLE cortex_runs RENAME COLUMN mandate_jti TO mandate_id;
18
+ END IF;
19
+ END IF;
20
+ END $$`.execute(db); // oss-core-managed-ok: run-mandate ledger (nullable; OSS leaves null)
21
+ await sql `ALTER TABLE cortex_runs DROP COLUMN IF EXISTS mandate_expires_at`.execute(db); // oss-core-managed-ok: run-mandate ledger
22
+ },
23
+ };
@@ -0,0 +1,7 @@
1
+ /**
2
+ * A pause row of a run or a profile keeps the run session of its workflow. A
3
+ * resume renews the run credential from it before the work goes on, and a
4
+ * turn, whose credential comes with the person, keeps none.
5
+ */
6
+ import type { Migration } from "kysely/migration";
7
+ export declare const recordTheRunSessionOfAPause: Migration;
@@ -0,0 +1,11 @@
1
+ /**
2
+ * A pause row of a run or a profile keeps the run session of its workflow. A
3
+ * resume renews the run credential from it before the work goes on, and a
4
+ * turn, whose credential comes with the person, keeps none.
5
+ */
6
+ import { sql } from "kysely";
7
+ export const recordTheRunSessionOfAPause = {
8
+ async up(db) {
9
+ await sql `ALTER TABLE cortex_paused_work ADD COLUMN IF NOT EXISTS run_session JSONB`.execute(db);
10
+ },
11
+ };
@@ -12,6 +12,15 @@ import { indexTheRunsByStart } from "./20261012120000_index_the_runs_by_start.js
12
12
  import { indexTheEndedRunsAndTheRecentThreads } from "./20261013120000_index_the_ended_runs_and_the_recent_threads.js";
13
13
  import { narrowTheActiveRunIndex } from "./20261013180000_narrow_the_active_run_index.js";
14
14
  import { indexThePlansByParentAndTheRunsByPlan } from "./20261014120000_index_the_plans_by_parent_and_the_runs_by_plan.js";
15
+ import { addTheEditIntents } from "./20261026120000_add_the_edit_intents.js";
16
+ import { recordTheAppliedMemoryEdits } from "./20261027120000_record_the_applied_memory_edits.js";
17
+ import { storeTheAuthoringResults } from "./20261027120100_store_the_authoring_results.js";
18
+ import { keyTheGroupsOfATurn } from "./20261027120200_key_the_groups_of_a_turn.js";
19
+ import { markTheActiveTurnOfAThread } from "./20261027120300_mark_the_active_turn_of_a_thread.js";
20
+ import { recordThePausedWork } from "./20261028120000_record_the_paused_work.js";
21
+ import { endTheSuspendedRuns } from "./20261028120100_end_the_suspended_runs.js";
22
+ import { referenceTheRunMandate } from "./20261029120000_reference_the_run_mandate.js";
23
+ import { recordTheRunSessionOfAPause } from "./20261029120100_record_the_run_session_of_a_pause.js";
15
24
  export function cortexMigrations(logger) {
16
25
  return {
17
26
  "20260927120000_baseline": baseline(logger),
@@ -21,5 +30,14 @@ export function cortexMigrations(logger) {
21
30
  "20261013120000_index_the_ended_runs_and_the_recent_threads": indexTheEndedRunsAndTheRecentThreads,
22
31
  "20261013180000_narrow_the_active_run_index": narrowTheActiveRunIndex,
23
32
  "20261014120000_index_the_plans_by_parent_and_the_runs_by_plan": indexThePlansByParentAndTheRunsByPlan,
33
+ "20261026120000_add_the_edit_intents": addTheEditIntents,
34
+ "20261027120000_record_the_applied_memory_edits": recordTheAppliedMemoryEdits,
35
+ "20261027120100_store_the_authoring_results": storeTheAuthoringResults,
36
+ "20261027120200_key_the_groups_of_a_turn": keyTheGroupsOfATurn,
37
+ "20261027120300_mark_the_active_turn_of_a_thread": markTheActiveTurnOfAThread,
38
+ "20261028120000_record_the_paused_work": recordThePausedWork,
39
+ "20261028120100_end_the_suspended_runs": endTheSuspendedRuns,
40
+ "20261029120000_reference_the_run_mandate": referenceTheRunMandate,
41
+ "20261029120100_record_the_run_session_of_a_pause": recordTheRunSessionOfAPause,
24
42
  };
25
43
  }
@@ -0,0 +1,52 @@
1
+ /**
2
+ * The rows of `cortex_paused_work`: one row for each workflow that waits in a pause. The workflow writes its row
3
+ * before it waits and deletes it when the wait ends. A stop of the work deletes the rows of the work.
4
+ */
5
+ import type { ResultAsync } from "neverthrow";
6
+ import type { QueryConfig } from "pg";
7
+ import type { RunSession } from "../auth/types.js";
8
+ import type { PauseCause, WorkKind } from "../contracts/chat-parts.js";
9
+ import { type DbError } from "../lib/db-result.js";
10
+ import type { Querier } from "./db.js";
11
+ /** One waiting workflow, as its row records it. */
12
+ export type PauseRecord = {
13
+ readonly workflowId: string;
14
+ readonly workId: string;
15
+ readonly workKind: WorkKind;
16
+ readonly analysisId: string;
17
+ readonly threadId?: string;
18
+ readonly state: "retrying" | "paused";
19
+ readonly cause: PauseCause;
20
+ /** The count of timer retries before this wait. */
21
+ readonly attempt: number;
22
+ /** ISO 8601. Present for the state `retrying` only. */
23
+ readonly retryAt?: string;
24
+ /** The topic that the message of a resume goes to. */
25
+ readonly topic: string;
26
+ /** ISO 8601. */
27
+ readonly pausedAt: string;
28
+ /** The run session of the workflow, for a run and a profile. A resume renews the run credential from it. */
29
+ readonly runSession?: RunSession;
30
+ };
31
+ /**
32
+ * The row-reading surface of the reads: one query whose rows the row schema types. A computed test fake satisfies
33
+ * it directly, where the row-generic of `Querier` cannot be implemented by a fake that computes its rows.
34
+ */
35
+ export type PauseRowQuerier = {
36
+ query(queryTextOrConfig: string | QueryConfig, values?: unknown[]): Promise<{
37
+ rows: Record<string, unknown>[];
38
+ rowCount: number | null;
39
+ }>;
40
+ };
41
+ /** Write the row of a waiting workflow. A workflow waits in one pause at a time, thus a new pause replaces its row. */
42
+ export declare function recordPause(pool: Querier, record: PauseRecord): ResultAsync<void, DbError>;
43
+ /** Delete the row of a workflow whose wait ended. A second delete changes nothing. */
44
+ export declare function clearPause(pool: Querier, workflowId: string): ResultAsync<void, DbError>;
45
+ /** Delete the rows of workflows that no longer wait, in one statement. */
46
+ export declare function clearPauses(pool: Querier, workflowIds: readonly string[]): ResultAsync<void, DbError>;
47
+ /** Delete the rows of each workflow of the work, for a stop of the work. */
48
+ export declare function clearPausesOfWork(pool: Querier, workId: string): ResultAsync<void, DbError>;
49
+ /** The rows of the paused work of an analysis, the oldest pause first. */
50
+ export declare function queryPausesOfAnalysis(pool: PauseRowQuerier, analysisId: string): ResultAsync<PauseRecord[], DbError>;
51
+ /** The rows of the waiting workflows of one work in an analysis. */
52
+ export declare function queryPausesOfWork(pool: PauseRowQuerier, analysisId: string, workId: string): ResultAsync<PauseRecord[], DbError>;
@@ -0,0 +1,105 @@
1
+ /**
2
+ * The rows of `cortex_paused_work`: one row for each workflow that waits in a pause. The workflow writes its row
3
+ * before it waits and deletes it when the wait ends. A stop of the work deletes the rows of the work.
4
+ */
5
+ import { z } from "zod";
6
+ import { tryMutation, tryQuery } from "../lib/db-result.js";
7
+ const PauseCauseSchema = z.discriminatedUnion("kind", [
8
+ z.object({ kind: z.literal("outage") }),
9
+ z.object({ kind: z.literal("credential") }),
10
+ z.object({ kind: z.literal("host"), reason: z.string() }),
11
+ ]);
12
+ const PauseRowSchema = z.object({
13
+ workflow_id: z.string(),
14
+ work_id: z.string(),
15
+ work_kind: z.enum(["turn", "run", "profile"]),
16
+ analysis_id: z.string(),
17
+ thread_id: z.string().nullable(),
18
+ state: z.enum(["retrying", "paused"]),
19
+ cause: PauseCauseSchema,
20
+ attempt: z.number(),
21
+ retry_at: z.date().nullable(),
22
+ topic: z.string(),
23
+ paused_at: z.date(),
24
+ run_session: z
25
+ .object({
26
+ identity: z.object({ user: z.string() }),
27
+ scope: z.object({ kind: z.literal("analysis"), analysisId: z.string(), threadId: z.string().optional() }),
28
+ provenance: z.object({ agentId: z.string(), callPath: z.array(z.string()) }),
29
+ runFrame: z.object({ runId: z.string(), stepId: z.string().optional() }),
30
+ // The harness never reads the opaque `auth`: the row holds the JSON that the workflow wrote from its own
31
+ // `RunSession`, and the realization of the host downcasts it.
32
+ auth: z.record(z.string(), z.json()),
33
+ })
34
+ .nullable(),
35
+ });
36
+ const COLUMNS = "workflow_id, work_id, work_kind, analysis_id, thread_id, state, cause, attempt, retry_at, topic, paused_at, run_session";
37
+ function recordOf(row) {
38
+ const parsed = PauseRowSchema.parse(row);
39
+ return {
40
+ workflowId: parsed.workflow_id,
41
+ workId: parsed.work_id,
42
+ workKind: parsed.work_kind,
43
+ analysisId: parsed.analysis_id,
44
+ threadId: parsed.thread_id ?? undefined,
45
+ state: parsed.state,
46
+ cause: parsed.cause,
47
+ attempt: parsed.attempt,
48
+ retryAt: parsed.retry_at?.toISOString(),
49
+ topic: parsed.topic,
50
+ pausedAt: parsed.paused_at.toISOString(),
51
+ runSession: parsed.run_session ?? undefined,
52
+ };
53
+ }
54
+ /** Write the row of a waiting workflow. A workflow waits in one pause at a time, thus a new pause replaces its row. */
55
+ export function recordPause(pool, record) {
56
+ return tryMutation("pausedWork.record", () => pool.query(`INSERT INTO cortex_paused_work (${COLUMNS})
57
+ VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12)
58
+ ON CONFLICT (workflow_id) DO UPDATE SET
59
+ work_id = EXCLUDED.work_id, work_kind = EXCLUDED.work_kind, analysis_id = EXCLUDED.analysis_id,
60
+ thread_id = EXCLUDED.thread_id, state = EXCLUDED.state, cause = EXCLUDED.cause, attempt = EXCLUDED.attempt,
61
+ retry_at = EXCLUDED.retry_at, topic = EXCLUDED.topic, paused_at = EXCLUDED.paused_at,
62
+ run_session = EXCLUDED.run_session`, [
63
+ record.workflowId,
64
+ record.workId,
65
+ record.workKind,
66
+ record.analysisId,
67
+ record.threadId ?? null,
68
+ record.state,
69
+ JSON.stringify(record.cause),
70
+ record.attempt,
71
+ record.retryAt ?? null,
72
+ record.topic,
73
+ record.pausedAt,
74
+ record.runSession === undefined ? null : JSON.stringify(record.runSession),
75
+ ])).map(() => undefined);
76
+ }
77
+ /** Delete the row of a workflow whose wait ended. A second delete changes nothing. */
78
+ export function clearPause(pool, workflowId) {
79
+ return tryMutation("pausedWork.clear", () => pool.query("DELETE FROM cortex_paused_work WHERE workflow_id = $1", [workflowId])).map(() => undefined);
80
+ }
81
+ /** Delete the rows of workflows that no longer wait, in one statement. */
82
+ export function clearPauses(pool, workflowIds) {
83
+ return tryMutation("pausedWork.clearMany", () => pool.query("DELETE FROM cortex_paused_work WHERE workflow_id = ANY($1)", [workflowIds])).map(() => undefined);
84
+ }
85
+ /** Delete the rows of each workflow of the work, for a stop of the work. */
86
+ export function clearPausesOfWork(pool, workId) {
87
+ return tryMutation("pausedWork.clearWork", () => pool.query("DELETE FROM cortex_paused_work WHERE work_id = $1", [workId])).map(() => undefined);
88
+ }
89
+ /** The rows of the paused work of an analysis, the oldest pause first. */
90
+ export function queryPausesOfAnalysis(pool, analysisId) {
91
+ return tryQuery("pausedWork.ofAnalysis", async () => {
92
+ const { rows } = await pool.query(`SELECT ${COLUMNS} FROM cortex_paused_work WHERE analysis_id = $1 ORDER BY paused_at, workflow_id`, [analysisId]);
93
+ return rows.map(recordOf);
94
+ });
95
+ }
96
+ /** The rows of the waiting workflows of one work in an analysis. */
97
+ export function queryPausesOfWork(pool, analysisId, workId) {
98
+ return tryQuery("pausedWork.ofWork", async () => {
99
+ const { rows } = await pool.query(`SELECT ${COLUMNS} FROM cortex_paused_work WHERE analysis_id = $1 AND work_id = $2 ORDER BY workflow_id`, [
100
+ analysisId,
101
+ workId,
102
+ ]);
103
+ return rows.map(recordOf);
104
+ });
105
+ }
@@ -3,13 +3,32 @@
3
3
  * and analysis-scoped lookup.
4
4
  */
5
5
  import type { ResultAsync } from "neverthrow";
6
+ import type { QueryConfig } from "pg";
6
7
  import { type DbError } from "../lib/db-result.js";
7
8
  import type { Querier } from "./db.js";
8
- export interface InsertPlanInput {
9
+ /**
10
+ * What the plan reads of the pool: one row-reading query over concrete rows.
11
+ * A real `Pool` and a `Querier`-typed caller satisfy it; a computed test fake
12
+ * satisfies it directly, where the row-generic `Querier` refuses it.
13
+ */
14
+ export type PlanRowQuerier = {
15
+ query(queryTextOrConfig: string | QueryConfig, values?: unknown[]): Promise<{
16
+ rows: Record<string, unknown>[];
17
+ rowCount: number | null;
18
+ }>;
19
+ };
20
+ /**
21
+ * `cortex_plans.plan_id` shape contract — `pln-` followed by 8 lowercase hex
22
+ * chars. The chat trigger (`tools/execute-analysis.ts`) enforces the same regex on
23
+ * its tool input; `upsertPlan` re-asserts it because it accepts a caller-derived
24
+ * id rather than minting one. The shape itself is the `PLAN_ID_RE` home in
25
+ * `contracts/schemas/chat-parts.ts`.
26
+ */
27
+ export type InsertPlanInput = {
9
28
  analysisId: string;
10
29
  plan: unknown;
11
30
  parentPlanId?: string | null;
12
- }
31
+ };
13
32
  /**
14
33
  * Insert a plan and return the generated planId.
15
34
  * Validates that parentPlanId (if set) belongs to the same analysis —
@@ -21,13 +40,13 @@ export interface InsertPlanInput {
21
40
  * as a query failure and they surface verbatim to the caller.
22
41
  */
23
42
  export declare function insertPlan(pool: Querier, input: InsertPlanInput): ResultAsync<string, DbError>;
24
- export interface UpsertPlanInput {
43
+ export type UpsertPlanInput = {
25
44
  /** Caller-derived id — must match the `pln-<8hex>` contract. */
26
45
  planId: string;
27
46
  analysisId: string;
28
47
  plan: unknown;
29
48
  parentPlanId?: string | null;
30
- }
49
+ };
31
50
  /**
32
51
  * Insert a plan under a caller-supplied id, or no-op if that id already exists
33
52
  * (`ON CONFLICT (plan_id) DO NOTHING`). Unlike {@link insertPlan}, the id is
@@ -53,9 +72,9 @@ export declare function upsertPlan(pool: Querier, input: UpsertPlanInput): Resul
53
72
  */
54
73
  export declare function loadPlan(pool: Querier, planId: string, opts: {
55
74
  analysisId: string;
56
- }): ResultAsync<unknown | null, DbError>;
75
+ }): ResultAsync<unknown, DbError>;
57
76
  /** A stored plan with its lineage, as {@link loadPlanRecord} reads it. */
58
- export interface PlanRecord {
77
+ export type PlanRecord = {
59
78
  planId: string;
60
79
  /** The stored document, as the store holds it. A reader parses it. */
61
80
  plan: unknown;
@@ -63,7 +82,7 @@ export interface PlanRecord {
63
82
  /** The newest plan of the same analysis that names this plan as its parent. */
64
83
  supersededBy: string | null;
65
84
  createdAt: string;
66
- }
85
+ };
67
86
  /**
68
87
  * Analysis-scoped read of one plan with its parent and the newest plan that
69
88
  * replaced it, in one statement. Returns `ok(null)` for an unknown planId OR a
@@ -72,6 +91,6 @@ export interface PlanRecord {
72
91
  * `created_at` is ISO 8601 text, thus the text order is the time order; the plan
73
92
  * id breaks a tie so that the answer is stable.
74
93
  */
75
- export declare function loadPlanRecord(pool: Querier, planId: string, opts: {
94
+ export declare function loadPlanRecord(pool: PlanRowQuerier, planId: string, opts: {
76
95
  analysisId: string;
77
96
  }): ResultAsync<PlanRecord | null, DbError>;
@@ -3,14 +3,9 @@
3
3
  * and analysis-scoped lookup.
4
4
  */
5
5
  import { randomUUID } from "node:crypto";
6
+ import { PLAN_ID_RE } from "../contracts/schemas/chat-parts.js";
7
+ import { z } from "zod";
6
8
  import { tryMutation, tryQuery } from "../lib/db-result.js";
7
- /**
8
- * `cortex_plans.plan_id` shape contract — `pln-` followed by 8 lowercase hex
9
- * chars. The chat trigger (`tools/execute-analysis.ts`) enforces the same regex on
10
- * its tool input; `upsertPlan` re-asserts it because it accepts a caller-derived
11
- * id rather than minting one.
12
- */
13
- const PLAN_ID_PATTERN = /^pln-[a-f0-9]{8}$/;
14
9
  /**
15
10
  * Enforce tenant scope for a `parentPlanId`: the parent row must exist AND belong
16
11
  * to `analysisId`. Shared by {@link insertPlan} and {@link upsertPlan} — the
@@ -30,7 +25,7 @@ function checkParentScope(pool, parentPlanId, analysisId, label) {
30
25
  if ((parent.rowCount ?? 0) === 0) {
31
26
  throw new Error(`parent plan ${parentPlanId} not found`);
32
27
  }
33
- if (parent.rows[0].analysis_id !== analysisId) {
28
+ if (parent.rows[0]?.analysis_id !== analysisId) {
34
29
  throw new Error(`parent plan ${parentPlanId} belongs to a different analysis`);
35
30
  }
36
31
  });
@@ -80,7 +75,7 @@ export function insertPlan(pool, input) {
80
75
  * (mirroring the parent-scope violations, which throw before the INSERT).
81
76
  */
82
77
  export function upsertPlan(pool, input) {
83
- if (!PLAN_ID_PATTERN.test(input.planId)) {
78
+ if (!PLAN_ID_RE.test(input.planId)) {
84
79
  throw new Error(`upsertPlan: invalid plan id "${input.planId}" — expected the pln-<8hex> shape`);
85
80
  }
86
81
  const upsert = () => {
@@ -115,6 +110,13 @@ export function loadPlan(pool, planId, opts) {
115
110
  return result.rows[0]?.plan ?? null;
116
111
  });
117
112
  }
113
+ /** The `cortex_plans` row of {@link loadPlanRecord}, as the SELECT returns it. */
114
+ const PlanRecordRowSchema = z.object({
115
+ plan: z.json(),
116
+ parent_plan_id: z.string().nullable(),
117
+ created_at: z.string(),
118
+ superseded_by: z.string().nullable(),
119
+ });
118
120
  /**
119
121
  * Analysis-scoped read of one plan with its parent and the newest plan that
120
122
  * replaced it, in one statement. Returns `ok(null)` for an unknown planId OR a
@@ -134,9 +136,10 @@ export function loadPlanRecord(pool, planId, opts) {
134
136
  WHERE p.plan_id = $1 AND p.analysis_id = $2`,
135
137
  values: [planId, opts.analysisId],
136
138
  });
137
- const row = result.rows[0];
138
- if (!row)
139
+ const raw = result.rows[0];
140
+ if (!raw)
139
141
  return null;
142
+ const row = PlanRecordRowSchema.parse(raw);
140
143
  return { planId, plan: row.plan, parentPlanId: row.parent_plan_id, supersededBy: row.superseded_by, createdAt: row.created_at };
141
144
  });
142
145
  }
@@ -43,7 +43,7 @@ import type { Logger } from "../lib/logger.js";
43
43
  * behind, and rows written under a workflow the purge already deleted, which trip
44
44
  * their foreign key.
45
45
  */
46
- export interface AnalysisPurgeOutcome {
46
+ export type AnalysisPurgeOutcome = {
47
47
  readonly threads: number;
48
48
  readonly messages: number;
49
49
  /**
@@ -54,14 +54,14 @@ export interface AnalysisPurgeOutcome {
54
54
  */
55
55
  readonly workflows: number;
56
56
  readonly vectorIndexDropped: boolean;
57
- }
58
- export interface AnalysisPurgeDeps {
57
+ };
58
+ export type AnalysisPurgeDeps = {
59
59
  readonly pool: Pool;
60
60
  /** The workflow-ledger seam. Cancellation and deletion by id, engine-agnostic. */
61
61
  readonly workflows: WorkflowPurger;
62
62
  readonly logger?: Logger;
63
- }
64
- export interface AnalysisPurge {
63
+ };
64
+ export type AnalysisPurge = {
65
65
  /**
66
66
  * Remove the analysis's entire persisted Postgres footprint. Absence is a
67
67
  * normal outcome: an unknown or already-purged analysis succeeds with zeroes.
@@ -69,5 +69,5 @@ export interface AnalysisPurge {
69
69
  * it did not achieve. The caller quiesces the analysis first (module note).
70
70
  */
71
71
  purgeAnalysis(analysisId: string): ResultAsync<AnalysisPurgeOutcome, DbError>;
72
- }
72
+ };
73
73
  export declare function createAnalysisPurge({ pool, workflows, logger: injected }: AnalysisPurgeDeps): AnalysisPurge;
@@ -56,7 +56,11 @@ import { isSqlIdentifier } from "./vector-store.js";
56
56
  * Empty is outside the shape too: it derives the bare table prefix, which is a
57
57
  * perfectly legal identifier and belongs to no analysis.
58
58
  */
59
- const PURGEABLE_ANALYSIS_ID = /^[a-z0-9_-]+$/;
59
+ function isPurgeableAnalysisIdShape(analysisId) {
60
+ if (analysisId.length === 0)
61
+ return false;
62
+ return Array.from(analysisId).every((char) => (char >= "a" && char <= "z") || (char >= "0" && char <= "9") || char === "_" || char === "-");
63
+ }
60
64
  /**
61
65
  * The analysis-keyed deletes that follow the thread/message pair, in the order
62
66
  * they run.
@@ -80,6 +84,10 @@ const ANALYSIS_KEYED_DELETES = [
80
84
  { op: "purgeAnalysis.askGrants", sql: "DELETE FROM cortex_ask_grants WHERE analysis_id = $1" },
81
85
  // By its own analysis id, not through the thread rows: a kept text of a run names no thread.
82
86
  { op: "purgeAnalysis.toolOutputs", sql: "DELETE FROM cortex_tool_outputs WHERE analysis_id = $1" },
87
+ { op: "purgeAnalysis.editIntents", sql: "DELETE FROM cortex_edit_intents WHERE analysis_id = $1" },
88
+ { op: "purgeAnalysis.appliedMemoryEdits", sql: "DELETE FROM cortex_applied_memory_edits WHERE analysis_id = $1" },
89
+ { op: "purgeAnalysis.authoringResults", sql: "DELETE FROM cortex_authoring_results WHERE analysis_id = $1" },
90
+ { op: "purgeAnalysis.pausedWork", sql: "DELETE FROM cortex_paused_work WHERE analysis_id = $1" },
83
91
  { op: "purgeAnalysis.plans", sql: "DELETE FROM cortex_plans WHERE analysis_id = $1" },
84
92
  { op: "purgeAnalysis.reportVersions", sql: "DELETE FROM cortex_report_versions WHERE analysis_id = $1" },
85
93
  { op: "purgeAnalysis.reportSessionState", sql: "DELETE FROM cortex_report_session_state WHERE analysis_id = $1" },
@@ -170,7 +178,7 @@ export function createAnalysisPurge({ pool, workflows, logger: injected }) {
170
178
  await pool.query(`DROP TABLE IF EXISTS "${indexName}"`);
171
179
  }).map(() => present));
172
180
  const purgeAnalysis = (analysisId) => {
173
- if (!PURGEABLE_ANALYSIS_ID.test(analysisId)) {
181
+ if (!isPurgeableAnalysisIdShape(analysisId)) {
174
182
  return refuse("purgeAnalysis.analysisId", `purge-analysis: refusing unpurgeable analysis id "${analysisId}"`);
175
183
  }
176
184
  const indexName = searchIndexName(analysisId);
@@ -31,20 +31,24 @@
31
31
  * lands only when the row still holds it. Thus two concurrent turns cannot both land,
32
32
  * and the loser reads the state again.
33
33
  *
34
+ * A persist that names an authoring call stores the result of the call in
35
+ * `cortex_authoring_results`, in the transaction of the document and under the lock
36
+ * of the row. A second persist of the same call finds that result and writes nothing.
37
+ *
34
38
  * A purge of the analysis removes the row through the analysis-id cascade.
35
39
  */
36
40
  import { type ResultAsync } from "neverthrow";
37
- import type { Pool } from "pg";
38
- import { type DbError } from "../lib/db-result.js";
41
+ import type { Querier } from "../state/db.js";
42
+ import { type Connectable, type DbError } from "../lib/db-result.js";
39
43
  import type { Logger } from "../lib/logger.js";
40
44
  import { type DraftDocument } from "../report-model/draft.js";
41
45
  import type { ReportSnapshot } from "../report-model/reference-resolver.js";
42
46
  import { type SchemaIssue } from "./snapshot-parse.js";
43
47
  /** One source of a derivation: the pinned path that the script read, and the hash of that path. */
44
- export interface DerivationSource {
48
+ export type DerivationSource = {
45
49
  readonly path: string;
46
50
  readonly hash: string;
47
- }
51
+ };
48
52
  /**
49
53
  * One derivation of a session.
50
54
  *
@@ -54,21 +58,25 @@ export interface DerivationSource {
54
58
  *
55
59
  * `outputPath` is the workspace-root-relative path of the derived file, and it is the key that the served
56
60
  * membership holds. A record is immutable, thus a new derivation takes a new output path.
61
+ *
62
+ * `toolCallId` names the call that made the record, thus a rerun of that call finds its own table. A stored
63
+ * record can lack it, and such a record matches no call.
57
64
  */
58
- export interface DerivationRecord {
65
+ export type DerivationRecord = {
59
66
  readonly outputPath: string;
60
67
  readonly outputHash: string;
61
68
  readonly sources: readonly DerivationSource[];
62
69
  readonly scriptHash: string;
63
70
  readonly script: string;
64
- }
71
+ readonly toolCallId?: string;
72
+ };
65
73
  /**
66
74
  * The outcome of an append. `appended` landed the record. `duplicate` means that a record already holds the
67
75
  * output path, thus the list stays as it is. `absent` means that no row holds the thread.
68
76
  */
69
77
  export type AppendDerivationOutcome = "appended" | "duplicate" | "absent";
70
78
  /** The state of one report session, as the store gives it back. */
71
- export interface ReportSessionState {
79
+ export type ReportSessionState = {
72
80
  readonly threadId: string;
73
81
  readonly analysisId: string;
74
82
  /** The in-progress draft document, or `null` before the first document lands. */
@@ -82,16 +90,16 @@ export interface ReportSessionState {
82
90
  /** The hash that the last eyes capture saw, or `null` before the first look. */
83
91
  readonly seenDocumentHash: string | null;
84
92
  readonly createdAt: Date;
85
- }
93
+ };
86
94
  /** The snapshot and the anchor of a row to create. */
87
- export interface WriteSnapshotInput {
95
+ export type WriteSnapshotInput = {
88
96
  readonly threadId: string;
89
97
  readonly analysisId: string;
90
98
  /** The pinned snapshot, stored as given. */
91
99
  readonly snapshot: ReportSnapshot;
92
- }
100
+ };
93
101
  /** The document to persist against an existing row, and the prior document that the load read. */
94
- export interface PersistDocumentInput {
102
+ export type PersistDocumentInput = {
95
103
  readonly threadId: string;
96
104
  /** The draft document, stored as given. */
97
105
  readonly document: DraftDocument;
@@ -101,13 +109,26 @@ export interface PersistDocumentInput {
101
109
  * landed first turns this persist into a conflict.
102
110
  */
103
111
  readonly expected: DraftDocument | null;
104
- }
112
+ /**
113
+ * The authoring call that lands the document, keyed by its durable step. Its result
114
+ * lands in the transaction of the document, under the lock of the row.
115
+ */
116
+ readonly call?: AuthoringCall;
117
+ };
118
+ /** One authoring call that a durable step runs, and the result that it gives when its document lands. */
119
+ export type AuthoringCall = {
120
+ readonly key: string;
121
+ /** The result, stored as given. */
122
+ readonly result: unknown;
123
+ };
105
124
  /**
106
125
  * The outcome of a persist. `persisted` landed the document. `conflict` means the row
107
126
  * no longer holds the expected prior document, thus a concurrent turn landed first and
108
127
  * this turn must read the state again. `absent` means no row holds the thread.
128
+ * `replayed` means that the row already holds a result for the call, thus an earlier
129
+ * run of the call landed, and the persist wrote nothing.
109
130
  */
110
- export type PersistOutcome = "persisted" | "conflict" | "absent";
131
+ export type PersistOutcome = "persisted" | "conflict" | "absent" | "replayed";
111
132
  /**
112
133
  * The outcome of a stamp. `stamped` wrote the hash on the row. `absent` means that no row holds the
113
134
  * thread, thus the stamp wrote nothing. A stamp reads nothing before the write.
@@ -130,7 +151,7 @@ export type SessionStateReadError = {
130
151
  readonly part: "document" | "snapshot" | "derivations";
131
152
  readonly issues: readonly SchemaIssue[];
132
153
  };
133
- export interface ReportSessionStateStore {
154
+ export type ReportSessionStateStore = {
134
155
  /**
135
156
  * The state of a thread, or `null` when no row holds it. A parse failure on a
136
157
  * stored column reads as a typed error, and an absent row reads as a normal
@@ -150,6 +171,10 @@ export interface ReportSessionStateStore {
150
171
  * concurrent turn landed first, and `absent` means no row holds the thread.
151
172
  */
152
173
  persistDocument(input: PersistDocumentInput): ResultAsync<PersistOutcome, DbError>;
174
+ /** The stored result of one authoring call of a thread, or `null` when that call landed no document. */
175
+ readCallResult(threadId: string, callKey: string): ResultAsync<{
176
+ readonly result: unknown;
177
+ } | null, DbError>;
153
178
  /**
154
179
  * Stamp the rendered-document hash on the row. The preview calls it when the page lands, thus the row
155
180
  * holds the hash of the draft that the page shows. `absent` means that no row holds the thread.
@@ -168,11 +193,11 @@ export interface ReportSessionStateStore {
168
193
  * that no row holds the thread.
169
194
  */
170
195
  appendDerivation(threadId: string, record: DerivationRecord): ResultAsync<AppendDerivationOutcome, DbError>;
171
- }
172
- export interface ReportSessionStateStoreDeps {
173
- readonly pool: Pool;
196
+ };
197
+ export type ReportSessionStateStoreDeps = {
198
+ readonly pool: Querier & Connectable;
174
199
  readonly logger?: Logger;
175
- }
200
+ };
176
201
  /**
177
202
  * Create a `ReportSessionStateStore` bound to a Postgres pool. The
178
203
  * `cortex_report_session_state` table is provisioned by the state-init DDL.