@inflexa-ai/harness 0.45.1 → 0.46.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (790) hide show
  1. package/README.md +6 -3
  2. package/dist/agents/conversation-agent.d.ts +9 -3
  3. package/dist/agents/conversation-agent.js +34 -33
  4. package/dist/agents/report-session-agent.d.ts +15 -15
  5. package/dist/agents/report-session-agent.js +23 -15
  6. package/dist/agents/sandbox/index.d.ts +1 -1
  7. package/dist/agents/sandbox/index.js +1 -1
  8. package/dist/agents/sandbox/shared.d.ts +12 -14
  9. package/dist/agents/sandbox/shared.js +18 -12
  10. package/dist/agents/sandbox/types.d.ts +4 -4
  11. package/dist/agents/sandbox/validate-skills.d.ts +2 -2
  12. package/dist/agents/sandbox/validate-skills.js +3 -1
  13. package/dist/agents/sandbox-catalog.d.ts +2 -2
  14. package/dist/agents/sandbox-catalog.js +3 -3
  15. package/dist/agents/system-prompt.d.ts +2 -2
  16. package/dist/app/chat-turn-workflow.d.ts +114 -0
  17. package/dist/app/chat-turn-workflow.js +306 -0
  18. package/dist/app/chat-turn.d.ts +85 -57
  19. package/dist/app/chat-turn.js +123 -100
  20. package/dist/app/data-profile-orientation.js +10 -8
  21. package/dist/app/data-profile-view.d.ts +4 -4
  22. package/dist/app/data-profile-view.js +9 -8
  23. package/dist/app/in-process-turn.d.ts +42 -0
  24. package/dist/app/in-process-turn.js +139 -0
  25. package/dist/app/message-assembly.d.ts +10 -4
  26. package/dist/app/message-assembly.js +13 -8
  27. package/dist/app/report-session-runtime.d.ts +4 -4
  28. package/dist/app/report-session-runtime.js +36 -21
  29. package/dist/app/spawn-report-session.d.ts +33 -28
  30. package/dist/app/spawn-report-session.js +25 -40
  31. package/dist/app/synthesize-run.d.ts +22 -16
  32. package/dist/app/synthesize-run.js +41 -35
  33. package/dist/app/work.d.ts +96 -0
  34. package/dist/app/work.js +147 -0
  35. package/dist/auth/local-auth-context.d.ts +1 -3
  36. package/dist/auth/local-auth-context.js +1 -3
  37. package/dist/auth/local-run-authorizer.d.ts +1 -1
  38. package/dist/auth/local-run-authorizer.js +5 -3
  39. package/dist/auth/types.d.ts +26 -26
  40. package/dist/billing/cached-resolver.d.ts +4 -4
  41. package/dist/billing/run-charge.d.ts +5 -8
  42. package/dist/billing/run-charge.js +2 -2
  43. package/dist/billing/usage-recorder.d.ts +9 -9
  44. package/dist/citations/aggregate.js +1 -1
  45. package/dist/citations/clients/arxiv.d.ts +2 -2
  46. package/dist/citations/clients/arxiv.js +12 -4
  47. package/dist/citations/clients/common.js +4 -2
  48. package/dist/citations/clients/crossref.d.ts +2 -2
  49. package/dist/citations/clients/crossref.js +37 -37
  50. package/dist/citations/clients/doi-registry.js +15 -16
  51. package/dist/citations/clients/pubmed.d.ts +2 -2
  52. package/dist/citations/clients/pubmed.js +20 -13
  53. package/dist/citations/clients/semantic-scholar.d.ts +2 -2
  54. package/dist/citations/clients/semantic-scholar.js +9 -9
  55. package/dist/citations/compare.js +2 -2
  56. package/dist/citations/match.d.ts +2 -2
  57. package/dist/citations/match.js +12 -7
  58. package/dist/citations/normalize.js +35 -26
  59. package/dist/citations/plan.js +6 -2
  60. package/dist/citations/resolve.d.ts +6 -6
  61. package/dist/citations/resolve.js +34 -25
  62. package/dist/citations/types.d.ts +77 -77
  63. package/dist/config/environment-stores.d.ts +6 -6
  64. package/dist/config/resource-limits.js +1 -3
  65. package/dist/contracts/analogy-report.d.ts +7 -7
  66. package/dist/contracts/analogy-report.js +2 -2
  67. package/dist/contracts/chat-events.d.ts +38 -24
  68. package/dist/contracts/chat-frame.d.ts +15 -5
  69. package/dist/contracts/chat-frame.js +64 -41
  70. package/dist/contracts/chat-parts.d.ts +130 -67
  71. package/dist/contracts/chat-parts.js +1 -0
  72. package/dist/contracts/content-url.js +16 -2
  73. package/dist/contracts/data-profile.d.ts +38 -38
  74. package/dist/contracts/index.d.ts +2 -2
  75. package/dist/contracts/index.js +1 -1
  76. package/dist/contracts/message.d.ts +6 -6
  77. package/dist/contracts/organ-system.d.ts +11 -11
  78. package/dist/contracts/part-registry.d.ts +5 -4
  79. package/dist/contracts/part-registry.js +5 -0
  80. package/dist/contracts/profile-vocabulary.d.ts +11 -10
  81. package/dist/contracts/profile-vocabulary.js +10 -3
  82. package/dist/contracts/report-blocks.d.ts +329 -329
  83. package/dist/contracts/report-reference.d.ts +105 -81
  84. package/dist/contracts/report-reference.js +30 -13
  85. package/dist/contracts/schemas/chat-events.d.ts +30 -16
  86. package/dist/contracts/schemas/chat-events.js +15 -6
  87. package/dist/contracts/schemas/chat-parts.d.ts +175 -102
  88. package/dist/contracts/schemas/chat-parts.js +33 -7
  89. package/dist/contracts/severity.d.ts +1 -1
  90. package/dist/contracts/structure-source.d.ts +3 -3
  91. package/dist/contracts/structure-source.js +6 -2
  92. package/dist/contracts/subagent-activity.d.ts +2 -2
  93. package/dist/contracts/subagent-activity.js +5 -3
  94. package/dist/contracts/usage.d.ts +2 -2
  95. package/dist/data/safety-panel-schema.d.ts +25 -25
  96. package/dist/data/safety-panel-schema.js +13 -4
  97. package/dist/execution/artifact-metadata.d.ts +23 -15
  98. package/dist/execution/artifact-metadata.js +33 -10
  99. package/dist/execution/artifact-record.d.ts +2 -2
  100. package/dist/execution/artifact-registration.d.ts +5 -5
  101. package/dist/execution/artifact-registry.d.ts +8 -8
  102. package/dist/execution/dbos-run-launcher.d.ts +24 -4
  103. package/dist/execution/dbos-run-launcher.js +58 -4
  104. package/dist/execution/dbos-workflow-purger.d.ts +5 -6
  105. package/dist/execution/dbos-workflow-purger.js +8 -7
  106. package/dist/execution/input-signature.d.ts +2 -2
  107. package/dist/execution/post-step-pipeline.d.ts +9 -9
  108. package/dist/execution/post-step-pipeline.js +1 -1
  109. package/dist/execution/post-step.js +2 -2
  110. package/dist/execution/reconcile-manifest.d.ts +4 -4
  111. package/dist/execution/reconcile-manifest.js +3 -2
  112. package/dist/execution/run-authorizer.d.ts +46 -37
  113. package/dist/execution/run-authorizer.js +8 -8
  114. package/dist/execution/run-canceler.d.ts +7 -7
  115. package/dist/execution/run-canceler.js +14 -7
  116. package/dist/execution/run-end-record.d.ts +2 -3
  117. package/dist/execution/run-event-parts.d.ts +0 -8
  118. package/dist/execution/run-event-parts.js +29 -24
  119. package/dist/execution/run-event-stream.d.ts +8 -8
  120. package/dist/execution/run-event-stream.js +3 -4
  121. package/dist/execution/run-launcher.d.ts +4 -4
  122. package/dist/execution/run-synthesis.d.ts +49 -48
  123. package/dist/execution/run-synthesis.js +96 -255
  124. package/dist/execution/staged-input.d.ts +2 -2
  125. package/dist/execution/step-summary.d.ts +6 -6
  126. package/dist/execution/step-summary.js +4 -8
  127. package/dist/execution/topo-sort.js +4 -3
  128. package/dist/execution/workflow-purger.d.ts +2 -2
  129. package/dist/index.d.ts +17 -20
  130. package/dist/index.js +25 -36
  131. package/dist/input-sanitization.js +9 -2
  132. package/dist/input-scan/clustering.d.ts +6 -6
  133. package/dist/input-scan/clustering.js +11 -5
  134. package/dist/input-scan/companions.js +3 -2
  135. package/dist/input-scan/detect-sets.d.ts +2 -2
  136. package/dist/input-scan/detect-sets.js +25 -21
  137. package/dist/input-scan/enrich.d.ts +6 -6
  138. package/dist/input-scan/enrich.js +29 -12
  139. package/dist/input-scan/formats.d.ts +2 -2
  140. package/dist/input-scan/formats.js +8 -2
  141. package/dist/input-scan/markers.d.ts +2 -2
  142. package/dist/input-scan/markers.js +14 -5
  143. package/dist/input-scan/menu.d.ts +10 -10
  144. package/dist/input-scan/menu.js +0 -0
  145. package/dist/input-scan/quarantine.d.ts +2 -2
  146. package/dist/input-scan/quarantine.js +23 -18
  147. package/dist/input-scan/readout-budget.d.ts +2 -2
  148. package/dist/input-scan/readout-budget.js +1 -1
  149. package/dist/input-scan/readout.d.ts +2 -2
  150. package/dist/input-scan/readout.js +47 -34
  151. package/dist/input-scan/scan.d.ts +2 -2
  152. package/dist/input-scan/scan.js +7 -5
  153. package/dist/input-scan/set-types.d.ts +28 -28
  154. package/dist/input-scan/shapes.d.ts +4 -4
  155. package/dist/input-scan/shapes.js +0 -0
  156. package/dist/input-scan/templates.d.ts +10 -10
  157. package/dist/input-scan/templates.js +30 -22
  158. package/dist/input-scan/tokens.d.ts +6 -4
  159. package/dist/input-scan/tokens.js +100 -38
  160. package/dist/input-scan/types.d.ts +22 -22
  161. package/dist/lib/async-utils.d.ts +3 -7
  162. package/dist/lib/async-utils.js +5 -9
  163. package/dist/lib/cache.js +1 -1
  164. package/dist/lib/chrome.d.ts +46 -6
  165. package/dist/lib/console-logger.js +2 -2
  166. package/dist/lib/db-result.d.ts +22 -6
  167. package/dist/lib/db-result.js +9 -13
  168. package/dist/lib/eyes.d.ts +4 -4
  169. package/dist/lib/eyes.js +1 -1
  170. package/dist/lib/fs-helpers.js +18 -6
  171. package/dist/lib/fs-result.d.ts +1 -0
  172. package/dist/lib/fs-result.js +5 -6
  173. package/dist/lib/hooks.d.ts +32 -7
  174. package/dist/lib/hooks.js +22 -3
  175. package/dist/lib/host-concurrency.js +3 -2
  176. package/dist/lib/logger.d.ts +2 -2
  177. package/dist/lib/logger.js +2 -1
  178. package/dist/lib/metrics.d.ts +1 -1
  179. package/dist/lib/null-proto.d.ts +6 -0
  180. package/dist/lib/null-proto.js +17 -0
  181. package/dist/lib/otel-spans.d.ts +1 -1
  182. package/dist/lib/otel-spans.js +9 -5
  183. package/dist/lib/otel.d.ts +4 -2
  184. package/dist/lib/otel.js +10 -2
  185. package/dist/lib/page-capture.d.ts +8 -8
  186. package/dist/lib/page-capture.js +9 -4
  187. package/dist/lib/parse-json.d.ts +5 -0
  188. package/dist/lib/parse-json.js +12 -0
  189. package/dist/lib/present.d.ts +12 -0
  190. package/dist/lib/present.js +39 -0
  191. package/dist/lib/rate-limit.d.ts +4 -4
  192. package/dist/lib/rate-limit.js +12 -13
  193. package/dist/lib/regulatory-corpus/fetch-fda-guidance.d.ts +4 -4
  194. package/dist/lib/regulatory-corpus/fetch-fda-guidance.js +4 -10
  195. package/dist/lib/regulatory-corpus/fetch-ich.d.ts +4 -4
  196. package/dist/lib/regulatory-corpus/fetch-ich.js +18 -14
  197. package/dist/lib/regulatory-corpus/normalize-whitespace.d.ts +6 -0
  198. package/dist/lib/regulatory-corpus/normalize-whitespace.js +41 -0
  199. package/dist/lib/regulatory-corpus.d.ts +10 -10
  200. package/dist/lib/regulatory-corpus.js +3 -1
  201. package/dist/lib/result.d.ts +10 -11
  202. package/dist/lib/result.js +15 -13
  203. package/dist/lib/storage.d.ts +2 -2
  204. package/dist/lib/test/async-iterable.d.ts +9 -0
  205. package/dist/lib/test/async-iterable.js +28 -0
  206. package/dist/lib/test/request-url.d.ts +5 -0
  207. package/dist/lib/test/request-url.js +7 -0
  208. package/dist/lib/test/result-assert.d.ts +12 -0
  209. package/dist/lib/test/result-assert.js +17 -0
  210. package/dist/lib/test/text-shapes.d.ts +24 -0
  211. package/dist/lib/test/text-shapes.js +63 -0
  212. package/dist/lib/text.d.ts +22 -0
  213. package/dist/lib/text.js +68 -0
  214. package/dist/lib/thrown.d.ts +18 -0
  215. package/dist/lib/thrown.js +30 -0
  216. package/dist/lib/unknown-array.d.ts +6 -0
  217. package/dist/lib/unknown-array.js +8 -0
  218. package/dist/lib/unknown-containers.d.ts +14 -0
  219. package/dist/lib/unknown-containers.js +17 -0
  220. package/dist/lib/unknown-text.d.ts +8 -0
  221. package/dist/lib/unknown-text.js +28 -0
  222. package/dist/lib/zod-issue-shape.d.ts +1 -1
  223. package/dist/lib/zod-issue-shape.js +31 -31
  224. package/dist/lib/zod-issues.d.ts +3 -3
  225. package/dist/lib/zod-issues.js +30 -17
  226. package/dist/literature/sources/arxiv.d.ts +6 -6
  227. package/dist/literature/sources/arxiv.js +92 -35
  228. package/dist/literature/sources/http.d.ts +2 -2
  229. package/dist/literature/sources/http.js +16 -15
  230. package/dist/literature/sources/pubmed.d.ts +16 -16
  231. package/dist/literature/sources/pubmed.js +96 -61
  232. package/dist/literature/sources/semantic-scholar.d.ts +8 -8
  233. package/dist/literature/sources/semantic-scholar.js +22 -13
  234. package/dist/loop/accounting.d.ts +63 -0
  235. package/dist/loop/accounting.js +141 -0
  236. package/dist/loop/call-policy.d.ts +73 -0
  237. package/dist/loop/call-policy.js +109 -0
  238. package/dist/loop/chat-stream.d.ts +62 -0
  239. package/dist/loop/chat-stream.js +237 -0
  240. package/dist/loop/compaction.d.ts +9 -9
  241. package/dist/loop/compaction.js +1 -1
  242. package/dist/loop/metrics.d.ts +12 -15
  243. package/dist/loop/metrics.js +14 -26
  244. package/dist/loop/run-loop.d.ts +233 -0
  245. package/dist/loop/run-loop.js +770 -0
  246. package/dist/loop/sub-agent.d.ts +61 -0
  247. package/dist/loop/sub-agent.js +160 -0
  248. package/dist/loop/tool-adapter.d.ts +98 -0
  249. package/dist/loop/tool-adapter.js +364 -0
  250. package/dist/loop/tool-detail.d.ts +1 -1
  251. package/dist/loop/tool-detail.js +6 -5
  252. package/dist/loop/tool-outcome.d.ts +1 -1
  253. package/dist/loop/tool-output.d.ts +4 -4
  254. package/dist/loop/tool-output.js +2 -2
  255. package/dist/loop/turn-credentials.d.ts +39 -0
  256. package/dist/loop/turn-credentials.js +90 -0
  257. package/dist/loop/types.d.ts +29 -38
  258. package/dist/loop/types.js +2 -7
  259. package/dist/memory/ai-sdk-message-storage.d.ts +5 -5
  260. package/dist/memory/ai-sdk-message-storage.js +13 -11
  261. package/dist/memory/card-builders.d.ts +14 -14
  262. package/dist/memory/card-builders.js +19 -15
  263. package/dist/memory/conversation-display-recorder.d.ts +22 -4
  264. package/dist/memory/conversation-display-recorder.js +43 -24
  265. package/dist/memory/conversation-display-replay.js +3 -2
  266. package/dist/memory/conversation-display-storage.d.ts +15 -7
  267. package/dist/memory/conversation-display-storage.js +141 -36
  268. package/dist/memory/conversation-view.d.ts +4 -4
  269. package/dist/memory/conversation-view.js +5 -4
  270. package/dist/memory/count-tokens.js +10 -8
  271. package/dist/memory/derive-thread-title.d.ts +0 -13
  272. package/dist/memory/derive-thread-title.js +2 -1
  273. package/dist/memory/message-backfill.d.ts +12 -5
  274. package/dist/memory/message-backfill.js +5 -3
  275. package/dist/memory/thread-history.d.ts +36 -21
  276. package/dist/memory/thread-history.js +78 -54
  277. package/dist/memory/thread-store.d.ts +26 -17
  278. package/dist/memory/thread-store.js +15 -9
  279. package/dist/memory/tool-call-integrity.d.ts +2 -2
  280. package/dist/memory/tool-call-integrity.js +4 -3
  281. package/dist/memory/working-memory.d.ts +16 -12
  282. package/dist/memory/working-memory.js +72 -61
  283. package/dist/prompts/briefing.d.ts +12 -12
  284. package/dist/prompts/briefing.js +1 -1
  285. package/dist/prompts/synthesis-agent.d.ts +1 -1
  286. package/dist/prompts/synthesis-agent.js +6 -14
  287. package/dist/provenance/collector.d.ts +6 -6
  288. package/dist/provenance/collector.js +15 -8
  289. package/dist/provenance/exec-frame.d.ts +2 -2
  290. package/dist/provenance/exec-frame.js +6 -1
  291. package/dist/provenance/seam.d.ts +1 -4
  292. package/dist/provenance/types.d.ts +6 -6
  293. package/dist/providers/ai-sdk.d.ts +113 -62
  294. package/dist/providers/ai-sdk.js +283 -518
  295. package/dist/providers/embedding.d.ts +2 -2
  296. package/dist/providers/embedding.js +1 -1
  297. package/dist/providers/errors.d.ts +22 -2
  298. package/dist/providers/errors.js +98 -50
  299. package/dist/providers/prompt-cache.d.ts +8 -8
  300. package/dist/providers/prompt-cache.js +13 -11
  301. package/dist/providers/reasoning.d.ts +2 -2
  302. package/dist/providers/reasoning.js +2 -2
  303. package/dist/providers/request-headers.js +12 -3
  304. package/dist/providers/types.d.ts +55 -94
  305. package/dist/reference-data/catalog.d.ts +2 -15
  306. package/dist/reference-data/catalog.js +25 -8
  307. package/dist/reference-data/receipt.d.ts +2 -2
  308. package/dist/report-model/assert-rules.js +1 -1
  309. package/dist/report-model/authoring-grammar.d.ts +211 -233
  310. package/dist/report-model/block-walk.d.ts +10 -10
  311. package/dist/report-model/block-walk.js +2 -0
  312. package/dist/report-model/draft-finish.d.ts +8 -8
  313. package/dist/report-model/draft-finish.js +1 -1
  314. package/dist/report-model/draft-hash.js +8 -7
  315. package/dist/report-model/draft-operations.d.ts +22 -10
  316. package/dist/report-model/draft-operations.js +48 -30
  317. package/dist/report-model/draft-read.d.ts +19 -7
  318. package/dist/report-model/draft-read.js +16 -6
  319. package/dist/report-model/draft.d.ts +844 -2
  320. package/dist/report-model/draft.js +3 -1
  321. package/dist/report-model/fixture-resolver.js +39 -16
  322. package/dist/report-model/pin-snapshot.d.ts +2 -2
  323. package/dist/report-model/pin-snapshot.js +15 -15
  324. package/dist/report-model/production-resolver.d.ts +18 -18
  325. package/dist/report-model/production-resolver.js +50 -42
  326. package/dist/report-model/reference-resolver.d.ts +26 -10
  327. package/dist/report-model/reference-resolver.js +68 -5
  328. package/dist/report-model/reference-stamp.js +30 -38
  329. package/dist/report-model/structural-validation.js +12 -4
  330. package/dist/report-model/validate.d.ts +7 -7
  331. package/dist/report-model/validate.js +6 -6
  332. package/dist/report-render/assets.d.ts +2 -2
  333. package/dist/report-render/assets.js +27 -3
  334. package/dist/report-render/chart-export.d.ts +10 -2
  335. package/dist/report-render/chart-export.js +37 -11
  336. package/dist/report-render/chart-presets.d.ts +8 -8
  337. package/dist/report-render/chart-presets.js +3 -3
  338. package/dist/report-render/chart-renderers.d.ts +23 -16
  339. package/dist/report-render/chart-renderers.js +74 -53
  340. package/dist/report-render/chart-toolbox.d.ts +2 -2
  341. package/dist/report-render/chart-toolbox.js +7 -6
  342. package/dist/report-render/chart.d.ts +15 -16
  343. package/dist/report-render/chart.js +369 -252
  344. package/dist/report-render/design.d.ts +36 -297
  345. package/dist/report-render/design.js +0 -12
  346. package/dist/report-render/figures/common.d.ts +12 -12
  347. package/dist/report-render/figures/common.js +42 -31
  348. package/dist/report-render/figures/dendrogram.d.ts +3 -3
  349. package/dist/report-render/figures/dendrogram.js +10 -10
  350. package/dist/report-render/figures/dense.js +15 -8
  351. package/dist/report-render/figures/dotplot.js +46 -33
  352. package/dist/report-render/figures/embedding.js +52 -43
  353. package/dist/report-render/figures/equal-units.d.ts +10 -10
  354. package/dist/report-render/figures/equal-units.js +27 -27
  355. package/dist/report-render/figures/forest.js +9 -7
  356. package/dist/report-render/figures/gsea.js +21 -11
  357. package/dist/report-render/figures/heatmap.js +13 -9
  358. package/dist/report-render/figures/index.d.ts +10 -10
  359. package/dist/report-render/figures/index.js +4 -2
  360. package/dist/report-render/figures/km.js +10 -9
  361. package/dist/report-render/figures/label-room.d.ts +12 -12
  362. package/dist/report-render/figures/label-room.js +7 -2
  363. package/dist/report-render/figures/locuszoom.d.ts +2 -2
  364. package/dist/report-render/figures/locuszoom.js +59 -31
  365. package/dist/report-render/figures/lollipop.js +3 -2
  366. package/dist/report-render/figures/ma.js +8 -4
  367. package/dist/report-render/figures/manhattan.d.ts +1 -2
  368. package/dist/report-render/figures/manhattan.js +52 -34
  369. package/dist/report-render/figures/oncoprint.js +4 -5
  370. package/dist/report-render/figures/pca.js +25 -11
  371. package/dist/report-render/figures/qq.js +20 -9
  372. package/dist/report-render/figures/roc.js +1 -1
  373. package/dist/report-render/figures/sankey.d.ts +2 -2
  374. package/dist/report-render/figures/sankey.js +11 -10
  375. package/dist/report-render/figures/upset.d.ts +6 -6
  376. package/dist/report-render/figures/upset.js +7 -4
  377. package/dist/report-render/figures/volcano.js +12 -10
  378. package/dist/report-render/hybrid-svg.d.ts +4 -4
  379. package/dist/report-render/hybrid-svg.js +7 -5
  380. package/dist/report-render/number-format.d.ts +4 -4
  381. package/dist/report-render/number-format.js +62 -27
  382. package/dist/report-render/page.js +2 -1
  383. package/dist/report-render/provenance-data.d.ts +2 -2
  384. package/dist/report-render/references.d.ts +4 -4
  385. package/dist/report-render/render.d.ts +2 -2
  386. package/dist/report-render/render.js +10 -11
  387. package/dist/report-render/script-json.js +1 -1
  388. package/dist/report-render/table-data.d.ts +6 -6
  389. package/dist/report-render/test/options.d.ts +49 -0
  390. package/dist/report-render/test/options.js +143 -0
  391. package/dist/report-render/test/page-function.d.ts +19 -0
  392. package/dist/report-render/test/page-function.js +33 -0
  393. package/dist/report-render/types.d.ts +10 -10
  394. package/dist/report-render/value-bridge.d.ts +4 -4
  395. package/dist/report-render/value-bridge.js +27 -14
  396. package/dist/report-render/views/chart-view.d.ts +2 -2
  397. package/dist/report-render/views/chart-view.js +2 -2
  398. package/dist/report-render/views/lineage.d.ts +6 -6
  399. package/dist/report-render/views/lineage.js +2 -0
  400. package/dist/report-render/views/page-view.d.ts +2 -2
  401. package/dist/report-render/views/page-view.js +1 -0
  402. package/dist/report-render/views/prose.js +25 -8
  403. package/dist/report-render/views/references-view.js +12 -1
  404. package/dist/report-render/views/values.js +1 -1
  405. package/dist/runtime/assemble.d.ts +53 -26
  406. package/dist/runtime/assemble.js +103 -56
  407. package/dist/runtime/boot.d.ts +8 -7
  408. package/dist/runtime/boot.js +1 -1
  409. package/dist/runtime/connection-budget.d.ts +6 -6
  410. package/dist/runtime/connection-budget.js +1 -1
  411. package/dist/runtime/dbos.d.ts +29 -19
  412. package/dist/runtime/dbos.js +35 -20
  413. package/dist/runtime/result-serialization.js +18 -5
  414. package/dist/runtime/shutdown.d.ts +2 -2
  415. package/dist/sandbox/client.d.ts +7 -3
  416. package/dist/sandbox/cpu-files.d.ts +2 -2
  417. package/dist/sandbox/cpu-files.js +21 -4
  418. package/dist/sandbox/create-sandbox.d.ts +7 -8
  419. package/dist/sandbox/create-sandbox.js +6 -12
  420. package/dist/sandbox/docker-client.d.ts +48 -3
  421. package/dist/sandbox/docker-client.js +10 -6
  422. package/dist/sandbox/estimate-data-profile-resources.js +2 -7
  423. package/dist/sandbox/exec-outcome.d.ts +2 -2
  424. package/dist/sandbox/exec-outcome.js +1 -1
  425. package/dist/sandbox/exec.d.ts +10 -6
  426. package/dist/sandbox/exec.js +27 -12
  427. package/dist/sandbox/execution-id.js +14 -6
  428. package/dist/sandbox/farm.d.ts +2 -2
  429. package/dist/sandbox/farm.js +22 -27
  430. package/dist/sandbox/identity.d.ts +7 -0
  431. package/dist/sandbox/identity.js +14 -3
  432. package/dist/sandbox/image-packages.js +15 -27
  433. package/dist/sandbox/k8s-client.d.ts +35 -8
  434. package/dist/sandbox/k8s-client.js +6 -5
  435. package/dist/sandbox/labels.js +1 -0
  436. package/dist/sandbox/liveness.js +3 -1
  437. package/dist/sandbox/mount-plan.d.ts +10 -10
  438. package/dist/sandbox/mount-plan.js +13 -14
  439. package/dist/sandbox/notification-sweep.d.ts +4 -4
  440. package/dist/sandbox/notification-sweep.js +4 -7
  441. package/dist/sandbox/package-identity.d.ts +6 -13
  442. package/dist/sandbox/package-identity.js +46 -28
  443. package/dist/sandbox/reaper.d.ts +10 -10
  444. package/dist/sandbox/reaper.js +4 -6
  445. package/dist/sandbox/sandbox-error.d.ts +2 -9
  446. package/dist/sandbox/sandbox-error.js +21 -8
  447. package/dist/sandbox/sandbox-step-translate.d.ts +8 -5
  448. package/dist/sandbox/sandbox-step-translate.js +22 -8
  449. package/dist/sandbox/step-sandbox.d.ts +47 -0
  450. package/dist/sandbox/step-sandbox.js +53 -0
  451. package/dist/sandbox/types.d.ts +18 -19
  452. package/dist/sandbox/types.js +1 -1
  453. package/dist/schemas/artifact-manifest.d.ts +4 -4
  454. package/dist/schemas/data-profile-schemas.d.ts +343 -298
  455. package/dist/schemas/file-metadata.js +2 -4
  456. package/dist/schemas/plan-schemas.d.ts +31 -31
  457. package/dist/schemas/run-synthesis.d.ts +95 -26
  458. package/dist/schemas/run-synthesis.js +3 -1
  459. package/dist/schemas/validate-plan.d.ts +4 -4
  460. package/dist/schemas/validate-plan.js +17 -5
  461. package/dist/schemas/workflow-state.d.ts +19 -19
  462. package/dist/schemas/workflow-state.js +2 -2
  463. package/dist/state/active-turns.d.ts +36 -0
  464. package/dist/state/active-turns.js +67 -0
  465. package/dist/state/analyses-metrics.d.ts +8 -8
  466. package/dist/state/analyses-metrics.js +4 -4
  467. package/dist/state/analyses.d.ts +0 -14
  468. package/dist/state/analyses.js +0 -32
  469. package/dist/state/artifacts.d.ts +32 -19
  470. package/dist/state/artifacts.js +28 -5
  471. package/dist/state/data-profile.d.ts +2 -2
  472. package/dist/state/db.d.ts +12 -2
  473. package/dist/state/db.js +5 -0
  474. package/dist/state/edit-intents.d.ts +4 -0
  475. package/dist/state/edit-intents.js +71 -0
  476. package/dist/state/index.d.ts +4 -4
  477. package/dist/state/index.js +2 -2
  478. package/dist/state/init.d.ts +2 -1
  479. package/dist/state/init.js +5 -2
  480. package/dist/state/migrations/20260927120000_baseline.js +3 -1
  481. package/dist/state/migrations/20261026120000_add_the_edit_intents.d.ts +7 -0
  482. package/dist/state/migrations/20261026120000_add_the_edit_intents.js +21 -0
  483. package/dist/state/migrations/20261027120000_record_the_applied_memory_edits.d.ts +7 -0
  484. package/dist/state/migrations/20261027120000_record_the_applied_memory_edits.js +16 -0
  485. package/dist/state/migrations/20261027120100_store_the_authoring_results.d.ts +8 -0
  486. package/dist/state/migrations/20261027120100_store_the_authoring_results.js +20 -0
  487. package/dist/state/migrations/20261027120200_key_the_groups_of_a_turn.d.ts +7 -0
  488. package/dist/state/migrations/20261027120200_key_the_groups_of_a_turn.js +12 -0
  489. package/dist/state/migrations/20261027120300_mark_the_active_turn_of_a_thread.d.ts +7 -0
  490. package/dist/state/migrations/20261027120300_mark_the_active_turn_of_a_thread.js +11 -0
  491. package/dist/state/migrations/20261028120000_record_the_paused_work.d.ts +7 -0
  492. package/dist/state/migrations/20261028120000_record_the_paused_work.js +25 -0
  493. package/dist/state/migrations/20261028120100_end_the_suspended_runs.d.ts +8 -0
  494. package/dist/state/migrations/20261028120100_end_the_suspended_runs.js +13 -0
  495. package/dist/state/migrations/20261029120000_reference_the_run_mandate.d.ts +7 -0
  496. package/dist/state/migrations/20261029120000_reference_the_run_mandate.js +23 -0
  497. package/dist/state/migrations/20261029120100_record_the_run_session_of_a_pause.d.ts +7 -0
  498. package/dist/state/migrations/20261029120100_record_the_run_session_of_a_pause.js +11 -0
  499. package/dist/state/migrations/index.js +18 -0
  500. package/dist/state/paused-work.d.ts +52 -0
  501. package/dist/state/paused-work.js +105 -0
  502. package/dist/state/plans.d.ts +27 -8
  503. package/dist/state/plans.js +14 -11
  504. package/dist/state/purge-analysis.d.ts +6 -6
  505. package/dist/state/purge-analysis.js +10 -2
  506. package/dist/state/report-session-state.d.ts +43 -18
  507. package/dist/state/report-session-state.js +43 -4
  508. package/dist/state/report-versions.d.ts +16 -11
  509. package/dist/state/report-versions.js +5 -3
  510. package/dist/state/runs.d.ts +30 -19
  511. package/dist/state/runs.js +43 -51
  512. package/dist/state/schema.d.ts +18 -21
  513. package/dist/state/schema.js +4 -5
  514. package/dist/state/snapshot-parse.d.ts +2 -2
  515. package/dist/state/snapshot-parse.js +14 -8
  516. package/dist/state/step-executions.d.ts +20 -8
  517. package/dist/state/step-executions.js +6 -4
  518. package/dist/state/tool-outputs.d.ts +2 -2
  519. package/dist/state/tool-outputs.js +2 -1
  520. package/dist/state/vector-store.d.ts +16 -16
  521. package/dist/state/vector-store.js +11 -7
  522. package/dist/tasks/data-profile-absorb.d.ts +3 -3
  523. package/dist/tasks/data-profile-absorb.js +21 -16
  524. package/dist/tasks/data-profile-activity.d.ts +5 -5
  525. package/dist/tasks/data-profile-activity.js +5 -5
  526. package/dist/tasks/data-profile-index.d.ts +4 -4
  527. package/dist/tasks/data-profile-index.js +32 -17
  528. package/dist/tasks/data-profile-resolve.d.ts +8 -8
  529. package/dist/tasks/data-profile-resolve.js +88 -62
  530. package/dist/tasks/data-profile.d.ts +40 -31
  531. package/dist/tasks/data-profile.js +138 -95
  532. package/dist/tasks/extract-values.d.ts +26 -79
  533. package/dist/tasks/extract-values.js +48 -108
  534. package/dist/tasks/refresh-regulatory-corpus.d.ts +4 -20
  535. package/dist/tasks/refresh-regulatory-corpus.js +12 -8
  536. package/dist/tasks/regulatory-corpus-boot-refresh.d.ts +2 -2
  537. package/dist/tasks/regulatory-corpus-boot-refresh.js +12 -10
  538. package/dist/testing.d.ts +62 -0
  539. package/dist/testing.js +101 -0
  540. package/dist/tools/ad-hoc-router.d.ts +9 -9
  541. package/dist/tools/ad-hoc-router.js +65 -52
  542. package/dist/tools/analysis-invocation.d.ts +7 -0
  543. package/dist/tools/analysis-invocation.js +29 -5
  544. package/dist/tools/approval/contract.d.ts +8 -52
  545. package/dist/tools/approval/contract.js +7 -36
  546. package/dist/tools/approval/gateway.d.ts +27 -28
  547. package/dist/tools/approval/gateway.js +33 -130
  548. package/dist/tools/approval/queries.d.ts +6 -11
  549. package/dist/tools/approval/queries.js +43 -29
  550. package/dist/tools/approval/uuidv7.js +2 -2
  551. package/dist/tools/bio/chembl.d.ts +3 -3
  552. package/dist/tools/bio/chembl.js +10 -0
  553. package/dist/tools/bio/comptox.d.ts +25 -8
  554. package/dist/tools/bio/comptox.js +4 -2
  555. package/dist/tools/bio/drug-gene-interactions.d.ts +27 -17
  556. package/dist/tools/bio/drug-gene-interactions.js +11 -8
  557. package/dist/tools/bio/gene-disease-evidence.d.ts +61 -15
  558. package/dist/tools/bio/gene-disease-evidence.js +10 -6
  559. package/dist/tools/bio/gene-preclinical-profile.d.ts +11 -11
  560. package/dist/tools/bio/keys.d.ts +2 -2
  561. package/dist/tools/bio/keys.js +3 -3
  562. package/dist/tools/bio/lookup-annotation.d.ts +5 -5
  563. package/dist/tools/bio/lookup-annotation.js +3 -0
  564. package/dist/tools/bio/opentargets.d.ts +1 -1
  565. package/dist/tools/bio/opentargets.js +6 -0
  566. package/dist/tools/bio/pubchem.d.ts +2 -2
  567. package/dist/tools/bio/pubchem.js +6 -0
  568. package/dist/tools/bio/pubmed.d.ts +26 -16
  569. package/dist/tools/bio/pubmed.js +9 -3
  570. package/dist/tools/bio/search-clinical-trials.d.ts +4 -4
  571. package/dist/tools/bio/search-clinical-trials.js +5 -1
  572. package/dist/tools/bio/search-faers.d.ts +2 -2
  573. package/dist/tools/bio/search-faers.js +1 -1
  574. package/dist/tools/bio/search-gene.d.ts +2 -2
  575. package/dist/tools/bio/search-gene.js +1 -0
  576. package/dist/tools/bio/search-geo-datasets.d.ts +4 -4
  577. package/dist/tools/bio/search-geo-datasets.js +5 -5
  578. package/dist/tools/bio/search-interactions.d.ts +1 -1
  579. package/dist/tools/bio/search-patents.d.ts +28 -22
  580. package/dist/tools/bio/search-patents.js +20 -17
  581. package/dist/tools/bio/search-protein.d.ts +2 -2
  582. package/dist/tools/bio/search-protein.js +1 -1
  583. package/dist/tools/bio/search-regulatory-approvals.d.ts +64 -18
  584. package/dist/tools/bio/search-regulatory-approvals.js +21 -16
  585. package/dist/tools/bio/target-safety.d.ts +8 -8
  586. package/dist/tools/bio/target-safety.js +11 -6
  587. package/dist/tools/capability-data.d.ts +9 -5
  588. package/dist/tools/capability-data.js +2 -1
  589. package/dist/tools/define-tool.d.ts +55 -46
  590. package/dist/tools/define-tool.js +39 -27
  591. package/dist/tools/display/normalize-echart-spec.d.ts +2 -2
  592. package/dist/tools/display/normalize-echart-spec.js +51 -27
  593. package/dist/tools/display/show-user.d.ts +2 -2
  594. package/dist/tools/display/show-user.js +1 -1
  595. package/dist/tools/execute-analysis.d.ts +19 -10
  596. package/dist/tools/execute-analysis.js +83 -62
  597. package/dist/tools/knowledge/check.d.ts +166 -44
  598. package/dist/tools/knowledge/check.js +5 -3
  599. package/dist/tools/knowledge/client.d.ts +31 -62
  600. package/dist/tools/knowledge/client.js +44 -27
  601. package/dist/tools/knowledge/environment.d.ts +6 -6
  602. package/dist/tools/knowledge/environment.js +18 -7
  603. package/dist/tools/knowledge/index.d.ts +2 -2
  604. package/dist/tools/knowledge/index.js +9 -9
  605. package/dist/tools/knowledge/local-slots.d.ts +4 -4
  606. package/dist/tools/knowledge/local-slots.js +11 -4
  607. package/dist/tools/knowledge/pin.d.ts +2 -2
  608. package/dist/tools/knowledge/recommend.d.ts +20 -45
  609. package/dist/tools/knowledge/recommend.js +27 -19
  610. package/dist/tools/knowledge/situation.d.ts +40 -40
  611. package/dist/tools/knowledge/situation.js +2 -9
  612. package/dist/tools/knowledge/skeleton.d.ts +4 -4
  613. package/dist/tools/knowledge/skeleton.js +10 -11
  614. package/dist/tools/knowledge/template.d.ts +20 -18
  615. package/dist/tools/knowledge/template.js +38 -32
  616. package/dist/tools/lib/alphafold-client.js +2 -1
  617. package/dist/tools/lib/amass-client.d.ts +28 -28
  618. package/dist/tools/lib/amass-client.js +20 -10
  619. package/dist/tools/lib/api-utils.d.ts +13 -3
  620. package/dist/tools/lib/api-utils.js +17 -3
  621. package/dist/tools/lib/bgee-client.d.ts +6 -6
  622. package/dist/tools/lib/bgee-client.js +16 -10
  623. package/dist/tools/lib/cbioportal-client.d.ts +4 -4
  624. package/dist/tools/lib/cbioportal-client.js +9 -8
  625. package/dist/tools/lib/chembl-client.d.ts +14 -14
  626. package/dist/tools/lib/chembl-client.js +11 -4
  627. package/dist/tools/lib/clinical-benchmarks-client.d.ts +4 -4
  628. package/dist/tools/lib/clinical-benchmarks-client.js +4 -7
  629. package/dist/tools/lib/clinical-trials-client.d.ts +18 -18
  630. package/dist/tools/lib/clinical-trials-client.js +10 -10
  631. package/dist/tools/lib/clinvar-client.d.ts +2 -2
  632. package/dist/tools/lib/clinvar-client.js +6 -6
  633. package/dist/tools/lib/ctx-ops.d.ts +23 -23
  634. package/dist/tools/lib/ctx-ops.js +13 -10
  635. package/dist/tools/lib/dgidb-client.d.ts +6 -6
  636. package/dist/tools/lib/dgidb-client.js +10 -12
  637. package/dist/tools/lib/disgenet-client.d.ts +4 -4
  638. package/dist/tools/lib/ema-client.d.ts +2 -2
  639. package/dist/tools/lib/ensembl-client.d.ts +4 -4
  640. package/dist/tools/lib/ensembl-client.js +5 -4
  641. package/dist/tools/lib/gwas-catalog-client.d.ts +4 -4
  642. package/dist/tools/lib/gwas-catalog-client.js +17 -17
  643. package/dist/tools/lib/html-text.d.ts +6 -0
  644. package/dist/tools/lib/html-text.js +9 -0
  645. package/dist/tools/lib/identifier-resolver.d.ts +4 -4
  646. package/dist/tools/lib/identifier-resolver.js +7 -3
  647. package/dist/tools/lib/impc-client.d.ts +8 -8
  648. package/dist/tools/lib/impc-client.js +46 -35
  649. package/dist/tools/lib/iuphar-client.d.ts +2 -2
  650. package/dist/tools/lib/iuphar-client.js +7 -16
  651. package/dist/tools/lib/monarch-client.d.ts +4 -4
  652. package/dist/tools/lib/openfda-client.d.ts +22 -22
  653. package/dist/tools/lib/openfda-client.js +23 -22
  654. package/dist/tools/lib/opentargets-client.d.ts +12 -12
  655. package/dist/tools/lib/pathway-client.d.ts +4 -4
  656. package/dist/tools/lib/pathway-client.js +15 -19
  657. package/dist/tools/lib/pharmgkb-client.d.ts +2 -2
  658. package/dist/tools/lib/pharmgkb-client.js +1 -1
  659. package/dist/tools/lib/protein-family-modality.d.ts +2 -2
  660. package/dist/tools/lib/protein-family-modality.js +0 -2
  661. package/dist/tools/lib/protein-family-normalize.js +7 -0
  662. package/dist/tools/lib/pubchem-client.d.ts +2 -2
  663. package/dist/tools/lib/pubchem-client.js +1 -0
  664. package/dist/tools/lib/pubchem-ops.d.ts +4 -4
  665. package/dist/tools/lib/pubchem-ops.js +8 -0
  666. package/dist/tools/lib/pubmed-client.d.ts +9 -9
  667. package/dist/tools/lib/pubmed-client.js +1 -1
  668. package/dist/tools/lib/string-client.d.ts +6 -6
  669. package/dist/tools/lib/uniprot-client.d.ts +8 -8
  670. package/dist/tools/lib/uniprot-client.js +5 -1
  671. package/dist/tools/memory/update-working-memory.d.ts +16 -13
  672. package/dist/tools/memory/update-working-memory.js +21 -3
  673. package/dist/tools/read-tool-output.js +8 -2
  674. package/dist/tools/registry.d.ts +2 -2
  675. package/dist/tools/report-authoring/authoring-tools.d.ts +54 -23
  676. package/dist/tools/report-authoring/authoring-tools.js +128 -62
  677. package/dist/tools/report-session/derive-table.d.ts +19 -59
  678. package/dist/tools/report-session/derive-table.js +120 -122
  679. package/dist/tools/report-session/examine-page.d.ts +6 -6
  680. package/dist/tools/report-session/examine-page.js +14 -12
  681. package/dist/tools/report-session/list-artifacts.d.ts +6 -6
  682. package/dist/tools/report-session/list-artifacts.js +5 -5
  683. package/dist/tools/report-session/page-faults.d.ts +6 -6
  684. package/dist/tools/report-session/page-faults.js +3 -1
  685. package/dist/tools/report-session/preview-report.d.ts +4 -3
  686. package/dist/tools/report-session/preview-report.js +26 -7
  687. package/dist/tools/report-session/record-version.d.ts +9 -4
  688. package/dist/tools/report-session/record-version.js +16 -9
  689. package/dist/tools/report-session/session-page-publisher.d.ts +6 -6
  690. package/dist/tools/research/generate-analogy-report.d.ts +14 -7
  691. package/dist/tools/research/generate-analogy-report.js +80 -76
  692. package/dist/tools/research/generate-plan.d.ts +16 -16
  693. package/dist/tools/research/generate-plan.js +410 -374
  694. package/dist/tools/research/guarded-address.js +3 -2
  695. package/dist/tools/research/inspect-data-profile.d.ts +27 -20
  696. package/dist/tools/research/inspect-data-profile.js +26 -25
  697. package/dist/tools/research/inspect-run.d.ts +54 -27
  698. package/dist/tools/research/inspect-run.js +50 -40
  699. package/dist/tools/research/literature-reviewer.d.ts +8 -7
  700. package/dist/tools/research/literature-reviewer.js +29 -28
  701. package/dist/tools/research/search-arxiv.d.ts +1 -1
  702. package/dist/tools/research/search-arxiv.js +1 -1
  703. package/dist/tools/research/search-github-repos.d.ts +10 -7
  704. package/dist/tools/research/search-github-repos.js +25 -22
  705. package/dist/tools/research/search-semantic-scholar.js +1 -1
  706. package/dist/tools/research/searxng-engine.d.ts +2 -2
  707. package/dist/tools/research/searxng-engine.js +6 -4
  708. package/dist/tools/research/web-fetch.d.ts +24 -21
  709. package/dist/tools/research/web-fetch.js +65 -74
  710. package/dist/tools/research/web-search.d.ts +26 -17
  711. package/dist/tools/research/web-search.js +26 -21
  712. package/dist/tools/sandbox/link-packages.d.ts +11 -7
  713. package/dist/tools/sandbox/link-packages.js +11 -8
  714. package/dist/tools/sandbox/list-available-packages.d.ts +17 -8
  715. package/dist/tools/sandbox/list-available-packages.js +31 -25
  716. package/dist/tools/sandbox/list-available-refs.d.ts +17 -14
  717. package/dist/tools/sandbox/list-available-refs.js +61 -36
  718. package/dist/tools/sandbox/report-blocker.d.ts +30 -37
  719. package/dist/tools/sandbox/report-blocker.js +23 -73
  720. package/dist/tools/sandbox/skills.d.ts +16 -12
  721. package/dist/tools/sandbox/skills.js +16 -12
  722. package/dist/tools/sandbox/submit-file-metadata.d.ts +12 -9
  723. package/dist/tools/sandbox/submit-file-metadata.js +18 -21
  724. package/dist/tools/start-report-session.d.ts +13 -5
  725. package/dist/tools/start-report-session.js +35 -8
  726. package/dist/tools/terminal-text.d.ts +5 -2
  727. package/dist/tools/terminal-text.js +35 -3
  728. package/dist/tools/workspace/decision-record.d.ts +4 -4
  729. package/dist/tools/workspace/decision-record.js +23 -13
  730. package/dist/tools/workspace/edit-file.d.ts +59 -20
  731. package/dist/tools/workspace/edit-file.js +81 -16
  732. package/dist/tools/workspace/execute-command.d.ts +15 -13
  733. package/dist/tools/workspace/execute-command.js +11 -9
  734. package/dist/tools/workspace/file-stat.d.ts +6 -3
  735. package/dist/tools/workspace/grep.d.ts +10 -7
  736. package/dist/tools/workspace/grep.js +9 -3
  737. package/dist/tools/workspace/list-files.d.ts +6 -3
  738. package/dist/tools/workspace/mutator.d.ts +28 -15
  739. package/dist/tools/workspace/mutator.js +107 -53
  740. package/dist/tools/workspace/read-file.d.ts +8 -5
  741. package/dist/tools/workspace/result-bounds.d.ts +5 -5
  742. package/dist/tools/workspace/result-bounds.js +4 -2
  743. package/dist/tools/workspace/run-exec.d.ts +2 -2
  744. package/dist/tools/workspace/run-exec.js +3 -3
  745. package/dist/tools/workspace/scan-inputs.d.ts +8 -5
  746. package/dist/tools/workspace/scan-inputs.js +17 -5
  747. package/dist/tools/workspace/show-file.d.ts +1 -1
  748. package/dist/tools/workspace/show-file.js +2 -1
  749. package/dist/tools/workspace/show-plan.d.ts +8 -5
  750. package/dist/tools/workspace/show-plan.js +9 -8
  751. package/dist/tools/workspace/workspace-search.d.ts +41 -13
  752. package/dist/tools/workspace/workspace-search.js +27 -14
  753. package/dist/tools/workspace/write-file.d.ts +9 -7
  754. package/dist/workflows/execute-analysis-scheduler.d.ts +9 -9
  755. package/dist/workflows/execute-analysis-scheduler.js +6 -3
  756. package/dist/workflows/execute-analysis.d.ts +46 -62
  757. package/dist/workflows/execute-analysis.js +137 -219
  758. package/dist/workflows/pause.d.ts +71 -0
  759. package/dist/workflows/pause.js +173 -0
  760. package/dist/workflows/sandbox-step.d.ts +38 -61
  761. package/dist/workflows/sandbox-step.js +99 -106
  762. package/dist/workflows/test/sql-writes.d.ts +21 -0
  763. package/dist/workflows/test/sql-writes.js +36 -0
  764. package/dist/workspace/filesystem.d.ts +6 -6
  765. package/dist/workspace/filesystem.js +10 -8
  766. package/dist/workspace/paths.d.ts +1 -1
  767. package/dist/workspace/paths.js +15 -4
  768. package/dist/workspace/search-config.d.ts +2 -2
  769. package/dist/workspace/search-config.js +1 -1
  770. package/package.json +21 -22
  771. package/dist/loop/call-guard.d.ts +0 -50
  772. package/dist/loop/call-guard.js +0 -90
  773. package/dist/loop/continue-agent.d.ts +0 -40
  774. package/dist/loop/continue-agent.js +0 -38
  775. package/dist/loop/genai-spans.d.ts +0 -47
  776. package/dist/loop/genai-spans.js +0 -134
  777. package/dist/loop/run-agent.d.ts +0 -245
  778. package/dist/loop/run-agent.js +0 -1124
  779. package/dist/loop/run-step.d.ts +0 -29
  780. package/dist/loop/run-step.js +0 -34
  781. package/dist/loop/run-to-terminal.d.ts +0 -66
  782. package/dist/loop/run-to-terminal.js +0 -93
  783. package/dist/loop/tool-mask.d.ts +0 -23
  784. package/dist/loop/tool-mask.js +0 -46
  785. package/dist/providers/streaming-chat.d.ts +0 -32
  786. package/dist/providers/streaming-chat.js +0 -91
  787. package/dist/tasks/derive-table-exec.d.ts +0 -54
  788. package/dist/tasks/derive-table-exec.js +0 -86
  789. package/dist/workflows/suspension.d.ts +0 -32
  790. package/dist/workflows/suspension.js +0 -38
@@ -25,11 +25,12 @@ import { metrics } from "@opentelemetry/api";
25
25
  import { ResultAsync, ok, okAsync } from "neverthrow";
26
26
  import { stripNulCharacters } from "../input-sanitization.js";
27
27
  import { tryMutation, tryQuery, withTransaction } from "../lib/db-result.js";
28
+ import { presentFirst } from "../lib/present.js";
28
29
  import { hasReportedUsage } from "../loop/metrics.js";
29
30
  import { countTokens } from "./count-tokens.js";
30
31
  import { conversationView, groupTurns, isGenuineUserStart } from "./conversation-view.js";
31
32
  import { HARNESS_PROVIDER_NAMESPACE, SYNTHETIC_MESSAGE_KEY, envelopeMessage, parseStoredMessageEnvelope, syntheticRecordMessage, } from "./ai-sdk-message-storage.js";
32
- import { conversationDisplayPart, envelopeDisplayMessages, parseStoredDisplayEnvelope, } from "./conversation-display-storage.js";
33
+ import { conversationDisplayPart, envelopeDisplayMessages, isStoredSourcePart, parseStoredDisplayEnvelope, } from "./conversation-display-storage.js";
33
34
  /** A resolved `ok(undefined)` ResultAsync — the empty/seed transaction step. */
34
35
  function okVoid() {
35
36
  return new ResultAsync(Promise.resolve(ok(undefined)));
@@ -56,7 +57,9 @@ export function conversationRecordTurn(text, displayParts) {
56
57
  {
57
58
  id: randomUUID(),
58
59
  role: "system",
59
- parts: displayParts !== undefined && displayParts.length > 0 ? displayParts.map(conversationDisplayPart) : [{ type: "text", text, state: "done" }],
60
+ parts: displayParts !== undefined && displayParts.length > 0
61
+ ? displayParts.filter(isStoredSourcePart).map(conversationDisplayPart)
62
+ : [{ type: "text", text, state: "done" }],
60
63
  },
61
64
  ],
62
65
  };
@@ -128,12 +131,12 @@ function nextSeq(client, threadId, op) {
128
131
  const { rows } = await client.query("SELECT COALESCE(MAX(seq), -1)::text AS max_seq FROM messages WHERE thread_id = $1", [
129
132
  threadId,
130
133
  ]);
131
- return Number(rows[0].max_seq) + 1;
134
+ return Number(presentFirst(rows, "the max-seq row").max_seq) + 1;
132
135
  });
133
136
  }
134
137
  /** Insert the rows of one group, from `startSeq` on. */
135
138
  function insertGroup(client, threadId, startSeq, group, op) {
136
- const { modelMessages: messages, displayMessages, author } = group;
139
+ const { modelMessages: messages, displayMessages, author, key } = group;
137
140
  // The display projection rides the group's FIRST row, so one SELECT of a
138
141
  // thread's rows yields every envelope in order with no join and no grouping.
139
142
  // Whichever row that is — a genuine user message opening a turn, or the lone
@@ -154,19 +157,21 @@ function insertGroup(client, threadId, startSeq, group, op) {
154
157
  return messages.reduce((chain, message, i) => chain.andThen(() => tryMutation(`${op}.insert`, () => client.query(
155
158
  // `message_envelope::json`, never `::jsonb`; `display_envelope::jsonb`,
156
159
  // never `::json` — see the column comments in the state-init DDL.
157
- `INSERT INTO messages (thread_id, seq, message_envelope, display_envelope, tokens, author)
158
- VALUES ($1, $2, $3::json, $4::jsonb, $5, $6)
160
+ `INSERT INTO messages (thread_id, seq, message_envelope, display_envelope, tokens, author, round_key)
161
+ VALUES ($1, $2, $3::json, $4::jsonb, $5, $6, $7)
159
162
  ON CONFLICT (thread_id, seq) DO UPDATE
160
163
  SET message_envelope = EXCLUDED.message_envelope,
161
164
  display_envelope = EXCLUDED.display_envelope,
162
165
  tokens = EXCLUDED.tokens,
163
- author = EXCLUDED.author`, [
166
+ author = EXCLUDED.author,
167
+ round_key = EXCLUDED.round_key`, [
164
168
  threadId,
165
169
  startSeq + i,
166
170
  serializeEnvelope(message),
167
171
  i === 0 ? displayEnvelope : null,
168
172
  countTokens(message.content),
169
173
  i === authorRow ? turnAuthor : null,
174
+ i === 0 ? (key ?? null) : null,
170
175
  ])).map(() => undefined)), okVoid());
171
176
  }
172
177
  /** Move `cortex_analysis_threads.updated_at` forward inside the write transaction. */
@@ -209,6 +214,16 @@ function touchThread(client, threadId, op) {
209
214
  .map(() => undefined)
210
215
  .orElse(() => okVoid()));
211
216
  }
217
+ /** The `seq` of the first row of a group that a write stored before, by the key of the group. */
218
+ function storedGroupSeq(client, threadId, key, op) {
219
+ if (key === undefined)
220
+ return okAsync(undefined);
221
+ return tryQuery(`${op}.storedKey`, async () => {
222
+ const { rows } = await client.query("SELECT seq::text AS seq FROM messages WHERE thread_id = $1 AND round_key = $2", [threadId, key]);
223
+ const row = rows[0];
224
+ return row === undefined ? undefined : Number(row.seq);
225
+ });
226
+ }
212
227
  /** Add the `open` record of a turn. The upsert replaces a record whose rows are gone, because the opening row holds its key now. */
213
228
  function openTurnRecord(client, threadId, startSeq) {
214
229
  return tryMutation("thread-history.writeTurn.openRecord", () => client.query(`INSERT INTO cortex_thread_turns (thread_id, start_seq, status)
@@ -320,46 +335,50 @@ const PAGE_SQL = `WITH RECURSIVE page_walk(seq, starts) AS (
320
335
  function pageLimit(limit) {
321
336
  return Number.isFinite(limit) ? Math.min(Math.max(1, Math.trunc(limit)), Number.MAX_SAFE_INTEGER) : 1;
322
337
  }
323
- /**
324
- * Create a `ThreadHistory` bound to a Postgres pool — a factory closure
325
- * capturing `pool` (dependency injection per the harness-durable-runtime spec). The `messages` table is
326
- * provisioned by the project's state-init DDL.
327
- *
328
- * `logger` serves exactly one purpose: reporting a stored display part the
329
- * current vocabulary had to drop. It is optional because the read returns the
330
- * same messages either way — the drop reports a deploy, not a failed read — and
331
- * requiring it would break every call site over a diagnostic.
332
- */
338
+ /** `appendTurn` inside the transaction of the caller, thus another write of the caller commits with the turn or not at all. */
339
+ export function appendTurnIn(client, threadId, turn) {
340
+ if (turn.modelMessages.length === 0)
341
+ return okVoid();
342
+ return lockThread(client, threadId, "thread-history.appendTurn")
343
+ .andThen(() => nextSeq(client, threadId, "thread-history.appendTurn"))
344
+ .andThen((startSeq) => insertGroup(client, threadId, startSeq, turn, "thread-history.appendTurn"))
345
+ .andThen(() => touchThread(client, threadId, "thread-history.appendTurn"));
346
+ }
333
347
  export function createThreadHistory(pool, logger) {
334
348
  function appendTurn(threadId, turn) {
335
349
  if (turn.modelMessages.length === 0)
336
350
  return okVoid();
337
- return withTransaction(pool, "thread-history.appendTurn", (client) => lockThread(client, threadId, "thread-history.appendTurn")
338
- .andThen(() => nextSeq(client, threadId, "thread-history.appendTurn"))
339
- .andThen((startSeq) => insertGroup(client, threadId, startSeq, turn, "thread-history.appendTurn"))
340
- .andThen(() => touchThread(client, threadId, "thread-history.appendTurn")));
351
+ return withTransaction(pool, "thread-history.appendTurn", (client) => appendTurnIn(client, threadId, turn));
341
352
  }
342
353
  function writeTurn(threadId, write) {
343
354
  const { close } = write;
344
355
  const groups = [...(write.opening === undefined ? [] : [write.opening]), ...write.rounds, ...(close?.note === undefined ? [] : [close.note])];
345
356
  return withTransaction(pool, "thread-history.writeTurn", (client) => lockThread(client, threadId, "thread-history.writeTurn")
346
- .andThen(() => nextSeq(client, threadId, "thread-history.writeTurn"))
347
- .andThen((firstSeq) => {
348
- const startSeq = write.opening === undefined ? write.startSeq : firstSeq;
349
- const steps = [];
350
- let seq = firstSeq;
351
- for (const [index, group] of groups.entries()) {
352
- const groupSeq = seq;
353
- seq += group.modelMessages.length;
354
- steps.push(() => insertGroup(client, threadId, groupSeq, group, "thread-history.writeTurn"));
355
- if (index === 0 && write.opening !== undefined)
356
- steps.push(() => openTurnRecord(client, threadId, startSeq));
357
- }
358
- if (close !== undefined)
359
- steps.push(() => closeTurnRecord(client, threadId, startSeq, close));
360
- steps.push(() => touchThread(client, threadId, "thread-history.writeTurn"));
361
- return steps.reduce((chain, step) => chain.andThen(step), okVoid()).map(() => ({ startSeq }));
357
+ // One transaction stores each group of a write, thus a stored first group means a stored write.
358
+ .andThen(() => storedGroupSeq(client, threadId, groups[0]?.key, "thread-history.writeTurn"))
359
+ .andThen((storedSeq) => {
360
+ if (storedSeq === undefined)
361
+ return writeGroups(client);
362
+ return okAsync({ startSeq: write.opening === undefined ? write.startSeq : storedSeq });
362
363
  }));
364
+ function writeGroups(client) {
365
+ return nextSeq(client, threadId, "thread-history.writeTurn").andThen((firstSeq) => {
366
+ const startSeq = write.opening === undefined ? write.startSeq : firstSeq;
367
+ const steps = [];
368
+ let seq = firstSeq;
369
+ for (const [index, group] of groups.entries()) {
370
+ const groupSeq = seq;
371
+ seq += group.modelMessages.length;
372
+ steps.push(() => insertGroup(client, threadId, groupSeq, group, "thread-history.writeTurn"));
373
+ if (index === 0 && write.opening !== undefined)
374
+ steps.push(() => openTurnRecord(client, threadId, startSeq));
375
+ }
376
+ if (close !== undefined)
377
+ steps.push(() => closeTurnRecord(client, threadId, startSeq, close));
378
+ steps.push(() => touchThread(client, threadId, "thread-history.writeTurn"));
379
+ return steps.reduce((chain, step) => chain.andThen(step), okVoid()).map(() => ({ startSeq }));
380
+ });
381
+ }
363
382
  }
364
383
  function loadRecent(threadId, options) {
365
384
  return tryQuery("thread-history.loadRecent", async () => {
@@ -375,7 +394,7 @@ export function createThreadHistory(pool, logger) {
375
394
  // nothing has no rollup at all. The two are different measurements
376
395
  // sharing a unit; see the column comments.
377
396
  `SELECT seq::text AS seq, message_envelope, tokens
378
- FROM messages WHERE thread_id = $1 ORDER BY messages.seq ASC`, [threadId]);
397
+ FROM messages WHERE thread_id = $1 AND ($2::bigint IS NULL OR messages.seq <= $2::bigint) ORDER BY messages.seq ASC`, [threadId, options?.throughSeq ?? null]);
379
398
  const parsed = rows.map((row, index) => ({
380
399
  index,
381
400
  message: parseStoredMessageEnvelope(row.message_envelope, `${threadId}/${row.seq}`).message,
@@ -405,25 +424,30 @@ export function createThreadHistory(pool, logger) {
405
424
  async function toStoredMessage(threadId, r) {
406
425
  const envelope = parseStoredMessageEnvelope(r.message_envelope, `${threadId}/${r.seq}`);
407
426
  const displayEnvelope = r.display_envelope == null ? undefined : await parseStoredDisplayEnvelope(r.display_envelope, `${threadId}/${r.seq}/display`, logger);
408
- const turn = r.turn_status === null
409
- ? undefined
410
- : {
411
- status: r.turn_status,
412
- ...(r.turn_reason === null ? {} : { reason: r.turn_reason }),
413
- ...(r.turn_usage === null ? {} : { usage: r.turn_usage }),
414
- ...(r.turn_record_duration_ms === null ? {} : { durationMs: Number(r.turn_record_duration_ms) }),
415
- };
416
- return {
427
+ const row = {
417
428
  seq: Number(r.seq),
418
429
  envelope,
419
430
  message: envelope.message,
420
- ...(displayEnvelope ? { displayEnvelope } : {}),
421
- ...(r.reported_usage === null ? {} : { usage: r.reported_usage }),
422
- ...(r.turn_duration_ms === null ? {} : { durationMs: Number(r.turn_duration_ms) }),
423
- ...(turn === undefined ? {} : { turn }),
424
- ...(r.author === null ? {} : { author: r.author }),
431
+ displayEnvelope,
425
432
  createdAt: r.created_at,
426
433
  };
434
+ if (r.reported_usage !== null)
435
+ row.usage = r.reported_usage;
436
+ if (r.turn_duration_ms !== null)
437
+ row.durationMs = Number(r.turn_duration_ms);
438
+ if (r.author !== null)
439
+ row.author = r.author;
440
+ if (r.turn_status !== null) {
441
+ const turn = { status: r.turn_status };
442
+ if (r.turn_reason !== null)
443
+ turn.reason = r.turn_reason;
444
+ if (r.turn_usage !== null)
445
+ turn.usage = r.turn_usage;
446
+ if (r.turn_record_duration_ms !== null)
447
+ turn.durationMs = Number(r.turn_record_duration_ms);
448
+ row.turn = turn;
449
+ }
450
+ return row;
427
451
  }
428
452
  async function toTurns(threadId, rows) {
429
453
  const stored = await Promise.all(rows.map((row) => toStoredMessage(threadId, row)));
@@ -488,7 +512,7 @@ export function createThreadHistory(pool, logger) {
488
512
  (SELECT MAX(seq)::text FROM messages
489
513
  WHERE thread_id = $1
490
514
  AND ${GENUINE_USER_START_SQL}) AS boundary`, [threadId]);
491
- return rows[0];
515
+ return presentFirst(rows, "the thread boundary row");
492
516
  }))
493
517
  .andThen(({ has_rows, boundary }) => {
494
518
  if (!has_rows)
@@ -533,7 +557,7 @@ export function createThreadHistory(pool, logger) {
533
557
  return tryQuery("thread-history.countUserTurnsAfter", () => pool.query(`SELECT COUNT(*)::text AS turns FROM messages
534
558
  WHERE thread_id = $1
535
559
  AND seq > $2::bigint
536
- AND ${GENUINE_USER_START_SQL}`, [threadId, seq])).map(({ rows }) => Number(rows[0].turns));
560
+ AND ${GENUINE_USER_START_SQL}`, [threadId, seq])).map(({ rows }) => Number(presentFirst(rows, "the user-turn count row").turns));
537
561
  }
538
562
  return { appendTurn, writeTurn, loadRecent, loadAll, loadPage, retractLastTurn, latestSeq, latestTurnAt, countUserTurnsAfter };
539
563
  }
@@ -44,8 +44,9 @@
44
44
  * so it does not enforce that.
45
45
  */
46
46
  import { type ResultAsync } from "neverthrow";
47
- import type { Pool } from "pg";
48
- import { type DbError } from "../lib/db-result.js";
47
+ import { type DbError, type Connectable } from "../lib/db-result.js";
48
+ import type { Querier } from "../state/db.js";
49
+ import { type ConversationTurn } from "./thread-history.js";
49
50
  /**
50
51
  * The kind of session a thread holds. `conversation` is the analysis
51
52
  * conversation the product has always had; `report` is a report session spawned
@@ -65,7 +66,7 @@ import { type DbError } from "../lib/db-result.js";
65
66
  declare const THREAD_TYPES: readonly ["conversation", "report"];
66
67
  export type ThreadType = (typeof THREAD_TYPES)[number];
67
68
  /** One conversation thread's metadata, as returned by the store. */
68
- export interface Thread {
69
+ export type Thread = {
69
70
  readonly threadId: string;
70
71
  readonly analysisId: string;
71
72
  readonly title: string | null;
@@ -93,13 +94,13 @@ export interface Thread {
93
94
  * fall through and render a tombstoned conversation as live.
94
95
  */
95
96
  readonly deletedAt: Date | null;
96
- }
97
- export interface CreateThreadInput {
97
+ };
98
+ export type CreateThreadInput = {
98
99
  readonly threadId: string;
99
100
  readonly analysisId: string;
100
101
  readonly title?: string | null;
101
- /** Omitted is `conversation` — what a thread is when nothing says otherwise. */
102
- readonly type?: ThreadType;
102
+ /** Omitted is `conversation` — what a thread is when nothing says otherwise. The store refuses a value outside the closed set at runtime: an untyped caller (a JSON body across a package boundary) can hand in any string, and `unknown_thread_type` is the declared refusal for it. */
103
+ readonly type?: string;
103
104
  /**
104
105
  * The thread this one is spawned from. It must belong to the same analysis
105
106
  * as the child; whether it exists at all is the foreign key's verdict, not
@@ -112,7 +113,13 @@ export interface CreateThreadInput {
112
113
  * and either half alone describes no place.
113
114
  */
114
115
  readonly parentSeq?: number;
115
- }
116
+ /**
117
+ * The first turn of the new thread. The row and the turn commit in one
118
+ * transaction. A create that finds the row already there writes no turn,
119
+ * thus a second create with the same id gives the thread with one turn.
120
+ */
121
+ readonly firstTurn?: ConversationTurn;
122
+ };
116
123
  /**
117
124
  * A create the store refuses on its own, before any row is written. Distinct
118
125
  * from `DbError`: nothing failed at the driver — the request described a thread
@@ -143,7 +150,7 @@ export type ThreadInputError = {
143
150
  readonly threadId: string;
144
151
  readonly threadType: string;
145
152
  };
146
- export interface ListThreadsInput {
153
+ export type ListThreadsInput = {
147
154
  readonly analysisId: string;
148
155
  readonly page?: number;
149
156
  readonly perPage?: number;
@@ -168,21 +175,21 @@ export interface ListThreadsInput {
168
175
  readonly type?: ThreadType;
169
176
  /** Narrow to one thread's direct children, exact match. Same polarity as `type`: omitting it narrows nothing. */
170
177
  readonly parentThreadId?: string;
171
- }
172
- export interface ListRecentThreadsInput {
178
+ };
179
+ export type ListRecentThreadsInput = {
173
180
  /** The most threads to give. It clamps to 1 to 200, the bounds of a page of `listThreads`. */
174
181
  readonly limit: number;
175
182
  /** Narrow to one kind of session, exact match. Omitting it narrows nothing. */
176
183
  readonly type?: ThreadType;
177
- }
178
- export interface ThreadPage {
184
+ };
185
+ export type ThreadPage = {
179
186
  readonly threads: Thread[];
180
187
  readonly total: number;
181
188
  readonly page: number;
182
189
  readonly perPage: number;
183
190
  readonly hasMore: boolean;
184
- }
185
- export interface ThreadStore {
191
+ };
192
+ export type ThreadStore = {
186
193
  /**
187
194
  * Create a thread row. Idempotent on `thread_id` — a second create for an
188
195
  * existing id is a no-op that preserves the existing row (including its
@@ -260,11 +267,13 @@ export interface ThreadStore {
260
267
  * archived thread is never in it.
261
268
  */
262
269
  listRecentThreads(input: ListRecentThreadsInput): ResultAsync<Thread[], DbError>;
263
- }
270
+ };
264
271
  /**
265
272
  * Create a `ThreadStore` bound to a Postgres pool — a factory closure
266
273
  * capturing `pool` (dependency injection per the harness-durable-runtime spec). The
267
274
  * `cortex_analysis_threads` table is provisioned by the state-init DDL.
268
275
  */
269
- export declare function createThreadStore(pool: Pool): ThreadStore;
276
+ /** What this module reads of the pool: the direct `query` plus the transactional `connect`. */
277
+ type ThreadStorePool = Querier & Connectable;
278
+ export declare function createThreadStore(pool: ThreadStorePool): ThreadStore;
270
279
  export {};
@@ -45,6 +45,8 @@
45
45
  */
46
46
  import { errAsync, okAsync } from "neverthrow";
47
47
  import { tryMutation, tryQuery, withTransaction } from "../lib/db-result.js";
48
+ import { presentFirst } from "../lib/present.js";
49
+ import { appendTurnIn } from "./thread-history.js";
48
50
  /**
49
51
  * The kind of session a thread holds. `conversation` is the analysis
50
52
  * conversation the product has always had; `report` is a report session spawned
@@ -106,11 +108,6 @@ function toThread(row) {
106
108
  }
107
109
  const DEFAULT_PER_PAGE = 100;
108
110
  const MAX_PER_PAGE = 200;
109
- /**
110
- * Create a `ThreadStore` bound to a Postgres pool — a factory closure
111
- * capturing `pool` (dependency injection per the harness-durable-runtime spec). The
112
- * `cortex_analysis_threads` table is provisioned by the state-init DDL.
113
- */
114
111
  export function createThreadStore(pool) {
115
112
  /**
116
113
  * The parent's own analysis scope, or `null` when no such row exists.
@@ -141,16 +138,22 @@ export function createThreadStore(pool) {
141
138
  * returned row.
142
139
  */
143
140
  function insertThread(input) {
144
- return tryMutation("thread-store.createThread.insert", () => pool.query(`INSERT INTO cortex_analysis_threads (thread_id, analysis_id, title, thread_type, parent_thread_id, parent_seq)
141
+ const { firstTurn } = input;
142
+ if (firstTurn === undefined)
143
+ return insertRow(pool, input).map(({ thread }) => thread);
144
+ return withTransaction(pool, "thread-store.createThread", (client) => insertRow(client, input).andThen(({ thread, inserted }) => inserted ? appendTurnIn(client, thread.threadId, firstTurn).map(() => thread) : okAsync(thread)));
145
+ }
146
+ function insertRow(querier, input) {
147
+ return tryMutation("thread-store.createThread.insert", () => querier.query(`INSERT INTO cortex_analysis_threads (thread_id, analysis_id, title, thread_type, parent_thread_id, parent_seq)
145
148
  VALUES ($1, $2, $3, $4, $5, $6)
146
149
  ON CONFLICT (thread_id) DO NOTHING
147
150
  RETURNING ${THREAD_COLUMNS}`, [input.threadId, input.analysisId, input.title ?? null, input.type ?? "conversation", input.parentThreadId ?? null, input.parentSeq ?? null])).andThen(({ rows }) => {
148
151
  if (rows[0])
149
- return okAsync(toThread(rows[0]));
152
+ return okAsync({ thread: toThread(rows[0]), inserted: true });
150
153
  // Row already existed — ON CONFLICT DO NOTHING returns nothing. Read it
151
154
  // back (it may be archived; return it regardless so the caller sees
152
155
  // the existing row's identity).
153
- return tryQuery("thread-store.createThread.readback", () => pool.query(`SELECT ${THREAD_COLUMNS} FROM cortex_analysis_threads WHERE thread_id = $1`, [input.threadId])).map(({ rows: existing }) => toThread(existing[0]));
156
+ return tryQuery("thread-store.createThread.readback", () => querier.query(`SELECT ${THREAD_COLUMNS} FROM cortex_analysis_threads WHERE thread_id = $1`, [input.threadId])).map(({ rows: existing }) => ({ thread: toThread(presentFirst(existing, "the thread row read back")), inserted: false }));
154
157
  });
155
158
  }
156
159
  function createThread(input) {
@@ -289,6 +292,7 @@ export function createThreadStore(pool) {
289
292
  // `cortex_analysis_threads` either, so the cascade cannot reach it. Its row
290
293
  // holds a whole draft document, and a purged thread can never be composed
291
294
  // again, so a row left behind is dead weight until the analysis purge runs.
295
+ // The stored results of its authoring calls go with it, for the same reason.
292
296
  //
293
297
  // Messages go first, and the thread rows go last: the walk every statement
294
298
  // shares reads the very rows the last one removes. Thus a thread delete before
@@ -305,6 +309,8 @@ export function createThreadStore(pool) {
305
309
  DELETE FROM cortex_thread_turns WHERE thread_id IN (SELECT thread_id FROM subtree)`, [threadId])))
306
310
  .andThen(() => tryMutation("thread-store.purgeThread.reportSessionState", () => client.query(`${SUBTREE_CTE}
307
311
  DELETE FROM cortex_report_session_state WHERE thread_id IN (SELECT thread_id FROM subtree)`, [threadId])))
312
+ .andThen(() => tryMutation("thread-store.purgeThread.authoringResults", () => client.query(`${SUBTREE_CTE}
313
+ DELETE FROM cortex_authoring_results WHERE thread_id IN (SELECT thread_id FROM subtree)`, [threadId])))
308
314
  // A kept text of a run names no thread, thus it stays for the analysis purge.
309
315
  .andThen(() => tryMutation("thread-store.purgeThread.toolOutputs", () => client.query(`${SUBTREE_CTE}
310
316
  DELETE FROM cortex_tool_outputs WHERE thread_id IN (SELECT thread_id FROM subtree)`, [threadId])))
@@ -352,7 +358,7 @@ export function createThreadStore(pool) {
352
358
  return tryQuery("thread-store.listThreads.count", () => pool.query(`SELECT COUNT(*)::text AS count
353
359
  FROM cortex_analysis_threads
354
360
  WHERE ${scope}`, scopeValues)).andThen((totalResult) => {
355
- const total = Number(totalResult.rows[0].count);
361
+ const total = Number(presentFirst(totalResult.rows, "the thread count row").count);
356
362
  return tryQuery("thread-store.listThreads.page", () => pool.query(`SELECT ${THREAD_COLUMNS}
357
363
  FROM cortex_analysis_threads
358
364
  WHERE ${scope}
@@ -18,10 +18,10 @@ import type { ModelMessage, ToolCallPart, ToolResultPart } from "ai";
18
18
  export declare const NOT_RUN_TOOL_RESULT = "Not run: the turn ended before this call ran.";
19
19
  export declare function notRunResult(call: Pick<ToolCallPart, "toolCallId" | "toolName">): ToolResultPart;
20
20
  /** One tool call that {@link answerUnansweredToolCalls} answered, identified for the caller's diagnostic record. */
21
- export interface AnsweredToolCall {
21
+ export type AnsweredToolCall = {
22
22
  readonly toolCallId: string;
23
23
  readonly toolName: string;
24
- }
24
+ };
25
25
  /**
26
26
  * Answer, in place, every tool call at or past `fromIndex` that has no matching
27
27
  * tool result anywhere in `messages`. No message is removed or changed. Returns
@@ -14,6 +14,7 @@
14
14
  * because a signed thinking block and the prompt cache both key on the exact
15
15
  * prior prefix.
16
16
  */
17
+ import { presentAt } from "../lib/present.js";
17
18
  export const NOT_RUN_TOOL_RESULT = "Not run: the turn ended before this call ran.";
18
19
  export function notRunResult(call) {
19
20
  return {
@@ -67,14 +68,14 @@ export function answerUnansweredToolCalls(messages, fromIndex = 0) {
67
68
  // Backward, so an insertion after a message cannot shift an index this walk
68
69
  // has yet to visit.
69
70
  for (let idx = messages.length - 1; idx >= fromIndex; idx--) {
70
- const message = messages[idx];
71
+ const message = presentAt(messages, idx, "the message at the index");
71
72
  if (message.role !== "assistant" || typeof message.content === "string")
72
73
  continue;
73
- const unanswered = message.content.filter((part) => part.type === "tool-call" && needsClientResult(part) && !resultIds.has(part.toolCallId));
74
+ const unanswered = message.content.flatMap((part) => part.type === "tool-call" && needsClientResult(part) && !resultIds.has(part.toolCallId) ? [part] : []);
74
75
  if (unanswered.length === 0)
75
76
  continue;
76
77
  let insertAt = idx + 1;
77
- while (insertAt < messages.length && messages[insertAt].role === "tool")
78
+ while (insertAt < messages.length && presentAt(messages, insertAt, "the message at the insert point").role === "tool")
78
79
  insertAt++;
79
80
  messages.splice(insertAt, 0, { role: "tool", content: unanswered.map((part) => notRunResult(part)) });
80
81
  // Prepended as a batch: the walk visits messages tail-first, but the
@@ -28,9 +28,9 @@
28
28
  * list; the run's detail stays retrievable via `inspect_run`.
29
29
  */
30
30
  import { type ResultAsync } from "neverthrow";
31
- import type { Pool } from "pg";
32
31
  import { z } from "zod";
33
- import { type DbError } from "../lib/db-result.js";
32
+ import { type Connectable, type DbError } from "../lib/db-result.js";
33
+ import type { Querier } from "../state/db.js";
34
34
  /**
35
35
  * The write-time bounds on working memory. `updateSection` enforces them, the
36
36
  * `update_working_memory` input schema declares them to the model (importing
@@ -53,8 +53,8 @@ export declare const constraintSchema: z.ZodObject<{
53
53
  id: z.ZodString;
54
54
  text: z.ZodString;
55
55
  origin: z.ZodEnum<{
56
- user: "user";
57
56
  agent: "agent";
57
+ user: "user";
58
58
  }>;
59
59
  }, z.core.$strip>;
60
60
  export type Constraint = z.infer<typeof constraintSchema>;
@@ -85,8 +85,8 @@ export declare const workingMemorySchema: z.ZodObject<{
85
85
  id: z.ZodString;
86
86
  text: z.ZodString;
87
87
  origin: z.ZodEnum<{
88
- user: "user";
89
88
  agent: "agent";
89
+ user: "user";
90
90
  }>;
91
91
  }, z.core.$strip>>;
92
92
  hypotheses: z.ZodArray<z.ZodObject<{
@@ -107,10 +107,10 @@ export declare function emptyWorkingMemory(): WorkingMemory;
107
107
  * written for the model and says what to do next (shorten this, retire that).
108
108
  * The tool surfaces it as an `is_error` tool result; the row is untouched.
109
109
  */
110
- export interface WorkingMemoryRejection {
110
+ export type WorkingMemoryRejection = {
111
111
  readonly type: "working_memory_rejected";
112
112
  readonly message: string;
113
- }
113
+ };
114
114
  /** `updateSection`'s error channel: a storage failure, or a refused write. */
115
115
  export type WorkingMemoryError = DbError | WorkingMemoryRejection;
116
116
  /** Narrow a `WorkingMemoryError` to the model-correctable branch. */
@@ -162,21 +162,21 @@ export type FindingOp = {
162
162
  readonly id: string;
163
163
  };
164
164
  /** The `value` argument of `updateSection`, keyed by the `section` name. */
165
- export interface SectionValue {
165
+ export type SectionValue = {
166
166
  readonly goal: {
167
167
  readonly text: string;
168
168
  };
169
169
  readonly constraint: ConstraintOp;
170
170
  readonly hypothesis: ListOp;
171
171
  readonly finding: FindingOp;
172
- }
172
+ };
173
173
  export type Section = keyof SectionValue;
174
174
  /**
175
175
  * The working-memory store. Three methods — `load` reads the structured
176
176
  * shape, `updateSection` amends one section, `render` serializes to the
177
177
  * Markdown the chat route injects.
178
178
  */
179
- export interface WorkingMemoryStore {
179
+ export type WorkingMemoryStore = {
180
180
  /** Read the row; return the empty shape if absent (no lazy insert). */
181
181
  load(analysisId: string): ResultAsync<WorkingMemory, DbError>;
182
182
  /**
@@ -184,11 +184,15 @@ export interface WorkingMemoryStore {
184
184
  * left byte-identical; the row is upserted if absent. A write that breaks a
185
185
  * cap or addresses an unknown id is refused — `err(WorkingMemoryRejection)`,
186
186
  * and the row is left exactly as it was.
187
+ *
188
+ * `callKey` names the durable step of the call. The edit records it in its
189
+ * own transaction, and an edit whose key is recorded already changes nothing
190
+ * and gives ok. Thus a rerun of the step applies the edit one time.
187
191
  */
188
- updateSection<S extends Section>(analysisId: string, section: S, value: SectionValue[S]): ResultAsync<void, WorkingMemoryError>;
192
+ updateSection<S extends Section>(analysisId: string, section: S, value: SectionValue[S], callKey?: string): ResultAsync<void, WorkingMemoryError>;
189
193
  /** Serialize working memory to a Markdown document for injection. */
190
194
  render(analysisId: string): ResultAsync<string, DbError>;
191
- }
195
+ };
192
196
  /**
193
197
  * Serialize working memory to the Markdown document of the working-memory context record.
194
198
  *
@@ -212,4 +216,4 @@ export declare function renderWorkingMemory(wm: WorkingMemory): string;
212
216
  * `cortex_working_memory` table is provisioned by the project's state-init
213
217
  * DDL.
214
218
  */
215
- export declare function createWorkingMemory(pool: Pool): WorkingMemoryStore;
219
+ export declare function createWorkingMemory(pool: Querier & Connectable): WorkingMemoryStore;