@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
@@ -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;
@@ -30,6 +30,7 @@
30
30
  import { err, ok, okAsync } from "neverthrow";
31
31
  import { z } from "zod";
32
32
  import { tryMutation, tryQuery, withTransaction } from "../lib/db-result.js";
33
+ import { presentGet } from "../lib/present.js";
33
34
  /**
34
35
  * The write-time bounds on working memory. `updateSection` enforces them, the
35
36
  * `update_working_memory` input schema declares them to the model (importing
@@ -140,7 +141,7 @@ function countFindings(findings) {
140
141
  }
141
142
  /** The run a finding id hangs under, or `undefined` if no run holds it. */
142
143
  function runOfFinding(findings, id) {
143
- return Object.keys(findings).find((runId) => findings[runId].some((f) => f.id === id));
144
+ return Object.keys(findings).find((runId) => presentGet(findings, runId, "the run's findings").some((f) => f.id === id));
144
145
  }
145
146
  function applyFindingOp(findings, op) {
146
147
  switch (op.op) {
@@ -159,59 +160,51 @@ function applyFindingOp(findings, op) {
159
160
  return rejectUnknownId("finding", op.id);
160
161
  return checkEntryText("finding", op.text).map((text) => ({
161
162
  ...findings,
162
- [runId]: findings[runId].map((f) => (f.id === op.id ? { ...f, text } : f)),
163
+ [runId]: presentGet(findings, runId, "the run's findings").map((f) => (f.id === op.id ? { ...f, text } : f)),
163
164
  }));
164
165
  }
165
166
  case "retire": {
166
167
  const runId = runOfFinding(findings, op.id);
167
168
  if (runId === undefined)
168
169
  return rejectUnknownId("finding", op.id);
169
- const kept = findings[runId].filter((f) => f.id !== op.id);
170
+ const kept = presentGet(findings, runId, "the run's findings").filter((f) => f.id !== op.id);
170
171
  const next = { ...findings };
171
172
  // An emptied run bucket is dropped whole: memory references a run only
172
173
  // for as long as it holds a finding from it.
173
174
  if (kept.length === 0)
174
- delete next[runId];
175
+ Reflect.deleteProperty(next, runId);
175
176
  else
176
177
  next[runId] = kept;
177
178
  return ok(next);
178
179
  }
179
180
  }
180
181
  }
181
- /**
182
- * Pure section-addressable amendment. Sibling sections are never touched; a
183
- * refused write returns `err` and the caller writes nothing.
184
- */
185
- function applySectionUpdate(wm, section, value) {
186
- switch (section) {
187
- case "goal": {
188
- const text = value.text.trim();
189
- if (text.length > WORKING_MEMORY_LIMITS.goalChars) {
190
- return reject(`the goal is ${text.length} characters — the cap is ${WORKING_MEMORY_LIMITS.goalChars}. It was NOT ` +
191
- `recorded. State the objective in a sentence or two; the supporting detail belongs in ` +
192
- `constraints and findings, not in the goal.`);
193
- }
194
- return ok({ ...wm, goal: text });
182
+ const sectionWriters = {
183
+ goal: (wm, value) => {
184
+ const text = value.text.trim();
185
+ if (text.length > WORKING_MEMORY_LIMITS.goalChars) {
186
+ return reject(`the goal is ${text.length} characters — the cap is ${WORKING_MEMORY_LIMITS.goalChars}. It was NOT ` +
187
+ `recorded. State the objective in a sentence or two; the supporting detail belongs in ` +
188
+ `constraints and findings, not in the goal.`);
195
189
  }
196
- case "constraint": {
197
- const op = value;
198
- const origin = op.op === "add" ? op.origin : "agent";
199
- return applyEntryOp(wm.constraints, op, "constraints", WORKING_MEMORY_LIMITS.constraints, (text) => ({
200
- id: newId(),
201
- text,
202
- origin,
203
- })).map((constraints) => ({ ...wm, constraints }));
204
- }
205
- case "hypothesis":
206
- return applyEntryOp(wm.hypotheses, value, "hypotheses", WORKING_MEMORY_LIMITS.hypotheses, (text) => ({
207
- id: newId(),
208
- text,
209
- })).map((hypotheses) => ({ ...wm, hypotheses }));
210
- case "finding":
211
- return applyFindingOp(wm.findings, value).map((findings) => ({ ...wm, findings }));
212
- }
213
- // Unreachable — `section` is exhaustively a `Section`.
214
- return ok(wm);
190
+ return ok({ ...wm, goal: text });
191
+ },
192
+ constraint: (wm, op) => {
193
+ const origin = op.op === "add" ? op.origin : "agent";
194
+ return applyEntryOp(wm.constraints, op, "constraints", WORKING_MEMORY_LIMITS.constraints, (text) => ({
195
+ id: newId(),
196
+ text,
197
+ origin,
198
+ })).map((constraints) => ({ ...wm, constraints }));
199
+ },
200
+ hypothesis: (wm, op) => applyEntryOp(wm.hypotheses, op, "hypotheses", WORKING_MEMORY_LIMITS.hypotheses, (text) => ({
201
+ id: newId(),
202
+ text,
203
+ })).map((hypotheses) => ({ ...wm, hypotheses })),
204
+ finding: (wm, op) => applyFindingOp(wm.findings, op).map((findings) => ({ ...wm, findings })),
205
+ };
206
+ function applySectionUpdate(wm, section, value) {
207
+ return sectionWriters[section](wm, value);
215
208
  }
216
209
  /** Every finding, in insertion order, each carrying its run reference. */
217
210
  function flattenFindings(findings) {
@@ -283,33 +276,51 @@ export function createWorkingMemory(pool) {
283
276
  // The driver read is the only thing wrapped; `workingMemorySchema.parse`
284
277
  // runs in `.map` so a schema-validation throw propagates verbatim rather
285
278
  // than being miscaptured as a `DbError`.
286
- return tryQuery("working-memory.load", () => pool.query("SELECT data FROM cortex_working_memory WHERE analysis_id = $1", [analysisId])).map(({ rows }) => (rows.length === 0 ? emptyWorkingMemory() : workingMemorySchema.parse(rows[0].data)));
279
+ return tryQuery("working-memory.load", () => pool.query("SELECT data FROM cortex_working_memory WHERE analysis_id = $1", [analysisId])).map(({ rows }) => {
280
+ const [stored] = rows;
281
+ return stored === undefined ? emptyWorkingMemory() : workingMemorySchema.parse(stored.data);
282
+ });
287
283
  }
288
- function updateSection(analysisId, section, value) {
289
- return withTransaction(pool, "working-memory.updateSection", (client) =>
290
- // Serialize concurrent read-modify-write on this analysis — the lock
291
- // covers the not-yet-existing-row case an `SELECT ... FOR UPDATE`
292
- // would miss. Released automatically at COMMIT/ROLLBACK. The cap check
293
- // runs under it too, so two racing adds cannot both slip past a full
294
- // section.
295
- tryQuery("working-memory.updateSection.lock", () => client.query("SELECT pg_advisory_xact_lock(hashtext($1))", [analysisId]))
296
- .andThen(() => tryQuery("working-memory.updateSection.read", () => client.query("SELECT data FROM cortex_working_memory WHERE analysis_id = $1", [analysisId])))
297
- .map(({ rows }) => {
298
- // Schema parse stays outside the driver wrapper — a validation throw
299
- // propagates verbatim (and `withTransaction` still rolls back).
300
- const current = rows.length === 0 ? emptyWorkingMemory() : workingMemorySchema.parse(rows[0].data);
301
- return applySectionUpdate(current, section, value);
302
- })
303
- .andThen((amended) =>
304
- // A rejection rides the transaction's ok channel: it is a decision, not a
305
- // storage failure. The transaction commits having written nothing, and the
306
- // rejection is lifted back into the error channel below.
307
- amended.isErr()
308
- ? okAsync(err(amended.error))
309
- : tryMutation("working-memory.updateSection.upsert", () => client.query(`INSERT INTO cortex_working_memory (analysis_id, data, updated_at)
284
+ function updateSection(analysisId, section, value, callKey) {
285
+ const written = ok(undefined);
286
+ return withTransaction(pool, "working-memory.updateSection", (client) => {
287
+ // The key is read under the analysis lock, thus a second run of one call
288
+ // waits for the first and then finds its key.
289
+ const alreadyApplied = () => callKey === undefined
290
+ ? okAsync(false)
291
+ : tryQuery("working-memory.updateSection.appliedKey", () => client.query("SELECT 1 FROM cortex_applied_memory_edits WHERE call_key = $1", [callKey])).map(({ rows }) => rows.length > 0);
292
+ const recordKey = () => callKey === undefined
293
+ ? okAsync(undefined)
294
+ : tryMutation("working-memory.updateSection.recordKey", () => client.query("INSERT INTO cortex_applied_memory_edits (call_key, analysis_id) VALUES ($1, $2)", [callKey, analysisId])).map(() => undefined);
295
+ const amend = () => tryQuery("working-memory.updateSection.read", () => client.query("SELECT data FROM cortex_working_memory WHERE analysis_id = $1", [analysisId]))
296
+ .map(({ rows }) => {
297
+ // Schema parse stays outside the driver wrapper — a validation throw
298
+ // propagates verbatim (and `withTransaction` still rolls back).
299
+ const [stored] = rows;
300
+ const current = stored === undefined ? emptyWorkingMemory() : workingMemorySchema.parse(stored.data);
301
+ return applySectionUpdate(current, section, value);
302
+ })
303
+ .andThen((amended) =>
304
+ // A rejection rides the transaction's ok channel: it is a decision, not a
305
+ // storage failure. The transaction commits having written nothing, and the
306
+ // rejection is lifted back into the error channel below.
307
+ amended.isErr()
308
+ ? okAsync(err(amended.error))
309
+ : tryMutation("working-memory.updateSection.upsert", () => client.query(`INSERT INTO cortex_working_memory (analysis_id, data, updated_at)
310
310
  VALUES ($1, $2::jsonb, NOW())
311
311
  ON CONFLICT (analysis_id)
312
- DO UPDATE SET data = EXCLUDED.data, updated_at = NOW()`, [analysisId, JSON.stringify(amended.value)])).map(() => ok(undefined)))).andThen((written) => written);
312
+ DO UPDATE SET data = EXCLUDED.data, updated_at = NOW()`, [analysisId, JSON.stringify(amended.value)]))
313
+ .andThen(recordKey)
314
+ .map(() => written));
315
+ // Serialize concurrent read-modify-write on this analysis — the lock
316
+ // covers the not-yet-existing-row case an `SELECT ... FOR UPDATE`
317
+ // would miss. Released automatically at COMMIT/ROLLBACK. The cap check
318
+ // runs under it too, so two racing adds cannot both slip past a full
319
+ // section.
320
+ return tryQuery("working-memory.updateSection.lock", () => client.query("SELECT pg_advisory_xact_lock(hashtext($1))", [analysisId]))
321
+ .andThen(alreadyApplied)
322
+ .andThen((done) => (done ? okAsync(written) : amend()));
323
+ }).andThen((result) => result);
313
324
  }
314
325
  function render(analysisId) {
315
326
  return load(analysisId).map(renderWorkingMemory);
@@ -24,14 +24,20 @@
24
24
  import { type WorkingMemory } from "../memory/working-memory.js";
25
25
  import type { DataProfileResult } from "../state/data-profile.js";
26
26
  import type { AnalysisStep } from "../schemas/workflow-state.js";
27
+ import type { TemplateParameter } from "../tools/knowledge/client.js";
28
+ import type { TemplateBindingValue } from "../tools/knowledge/template.js";
27
29
  /** Completed dependencies rendered as upstream blocks; the tail is counted, not rendered. */
28
30
  export declare const MAX_UPSTREAM_DEPS = 5;
29
31
  /** Characters of each dependency's summary carried in the seed — the gist, not the document. */
30
32
  export declare const UPSTREAM_SUMMARY_MAX_CHARS = 500;
31
33
  /** Artifact paths listed per dependency; the rest are reachable from its output directory. */
32
34
  export declare const MAX_UPSTREAM_ARTIFACTS = 8;
35
+ /** Adaptable slots rendered in the Template contract section; the tail is counted, not rendered. */
36
+ export declare const MAX_TEMPLATE_SLOTS = 24;
37
+ /** Characters of one slot description carried in the seed — the constraint, not the manual. */
38
+ export declare const TEMPLATE_SLOT_DESCRIPTION_MAX_CHARS = 160;
33
39
  /** Fields whose content is agent-facing and MUST appear in the rendered task. */
34
- export declare const STEP_TASK_FIELDS: readonly ["name", "question", "description", "context", "constraints", "acceptance_criteria", "caveats"];
40
+ export declare const STEP_TASK_FIELDS: readonly ["name", "question", "description", "context", "constraints", "acceptance_criteria", "caveats", "grounding"];
35
41
  /**
36
42
  * Fields deliberately excluded from the task section: identity/DAG structure
37
43
  * threaded separately through the workflow input, execution knobs, and result
@@ -41,7 +47,7 @@ export declare const STEP_TASK_FIELDS: readonly ["name", "question", "descriptio
41
47
  * {@link renderResources} section, because the budget is an execution bound,
42
48
  * not a task instruction.
43
49
  */
44
- export declare const STEP_NON_TASK_FIELDS: readonly ["id", "track", "step_type", "depends_on", "status", "resources", "agent", "timeout", "maxSteps", "summary", "artifactIds", "error", "packages"];
50
+ export declare const STEP_NON_TASK_FIELDS: readonly ["id", "track", "step_type", "depends_on", "status", "resources", "agent", "timeout", "maxSteps", "summary", "artifactIds", "error", "packages", "capability"];
45
51
  /**
46
52
  * The step's own instructions. Only `question` is guaranteed present; the
47
53
  * remaining task fields are appended as dedicated sections when populated, so a
@@ -50,7 +56,7 @@ export declare const STEP_NON_TASK_FIELDS: readonly ["id", "track", "step_type",
50
56
  * folded in here — otherwise the agent runs against the bare question and
51
57
  * improvises the rest.
52
58
  */
53
- export declare function renderTask(step: AnalysisStep): string;
59
+ export declare function renderTask(step: AnalysisStep, contract?: Pick<StepBriefing, "template" | "templateNotRetrieved">): string;
54
60
  /**
55
61
  * The heading of the analysis-memory section. The orient core of the sandbox
56
62
  * prompt names this same text, thus a test pins the two together.
@@ -75,6 +81,46 @@ export declare function emptyStepMemory(): StepMemory;
75
81
  * entry — it has no memory tool.
76
82
  */
77
83
  export declare function renderMemory(memory: StepMemory): string;
84
+ /** A file the script of the template reads. `path` names the slot that gives it, for example `{{counts_path}}`. */
85
+ export type TemplateBriefInput = {
86
+ readonly name: string;
87
+ readonly path: string;
88
+ readonly description?: string;
89
+ };
90
+ /** One plan setting bound to an adaptable slot of the template. */
91
+ export type TemplateBoundSetting = {
92
+ readonly name: string;
93
+ readonly value: TemplateBindingValue;
94
+ /** The source of the value (a doi or a document), or `plan` when the procedure names none. */
95
+ readonly source: string;
96
+ };
97
+ /**
98
+ * The contract of the template a step renders, projected for the seed. The
99
+ * parent fetches it at dispatch and binds the plan settings to it; the
100
+ * section is what lets an agent that has never seen the template make one
101
+ * valid render call.
102
+ */
103
+ export type TemplateBrief = {
104
+ /** The template reference of the plan step, with its version when the plan names one. */
105
+ readonly ref: string;
106
+ /** The version the service serves. Differs from the version of `ref` when the snapshot moved on. */
107
+ readonly version_served: string;
108
+ /** The adaptable slots of the contract, in the order the template declares them. A pinned slot is never rendered. */
109
+ readonly slots: readonly TemplateParameter[];
110
+ readonly inputs: readonly TemplateBriefInput[];
111
+ /** The plan settings bound to a slot, in plan order. Empty when the served version differs from the plan. */
112
+ readonly bound: readonly TemplateBoundSetting[];
113
+ /** The plan settings no bound slot carries, one line each with the reason. */
114
+ readonly unbound_settings: readonly string[];
115
+ };
116
+ /**
117
+ * The Template contract section. Only the adaptable slots render, bounded by
118
+ * {@link MAX_TEMPLATE_SLOTS} and the description clamp, so a wide template
119
+ * cannot blow the seed. A served version that differs from the plan renders
120
+ * as a caveat: the render refuses the plan version, and the settings are not
121
+ * bound to a version the plan did not name.
122
+ */
123
+ export declare function renderTemplateContract(brief: TemplateBrief | undefined): string;
78
124
  /**
79
125
  * What anchors every path the agent writes or reads: the id the tree is mounted
80
126
  * at, and the step's writable directory.
@@ -84,12 +130,12 @@ export declare function renderMemory(memory: StepMemory): string;
84
130
  * every other path in the briefing is rooted with, thus one field serves the
85
131
  * workspace section and the orientation alike.
86
132
  */
87
- export interface WorkspaceFrame {
133
+ export type WorkspaceFrame = {
88
134
  /** The analysis id. The sandbox mounts the read-only analysis tree at `/{analysisId}`. */
89
135
  readonly analysisId: string;
90
136
  /** In-sandbox working directory — this step's writable artifact directory, and its cwd. */
91
137
  readonly workingDir: string;
92
- }
138
+ };
93
139
  /** The in-sandbox analysis root of a frame — the read-only mount of the whole tree. */
94
140
  export declare function analysisRootOf(frame: WorkspaceFrame): string;
95
141
  export declare function renderWorkspace(frame: WorkspaceFrame): string;
@@ -113,7 +159,7 @@ export declare function renderOrientation(profile: DataProfileResult | null | un
113
159
  * to the rest — an agent that needs more than the excerpt reads the summary at
114
160
  * `summaryPath` rather than having the whole document pushed into its context.
115
161
  */
116
- export interface UpstreamHandoff {
162
+ export type UpstreamHandoff = {
117
163
  readonly stepId: string;
118
164
  readonly agentId: string;
119
165
  /** The dependency's step summary. Clamped to {@link UPSTREAM_SUMMARY_MAX_CHARS} here, not by the caller. */
@@ -124,10 +170,10 @@ export interface UpstreamHandoff {
124
170
  readonly outputDir: string;
125
171
  /** In-sandbox absolute paths of the artifacts the dependency registered. */
126
172
  readonly artifacts: readonly string[];
127
- }
173
+ };
128
174
  export declare function renderUpstream(handoffs: readonly UpstreamHandoff[]): string;
129
175
  /** Everything one step's seed is composed from — all of it known at dispatch time. */
130
- export interface StepBriefing {
176
+ export type StepBriefing = {
131
177
  readonly step: AnalysisStep;
132
178
  readonly workspace: WorkspaceFrame;
133
179
  /** The analysis's persisted data profile; `null` when never profiled or still pending. */
@@ -136,7 +182,15 @@ export interface StepBriefing {
136
182
  readonly upstream: readonly UpstreamHandoff[];
137
183
  /** The goal and the constraints of the analysis, read from the working memory at dispatch. */
138
184
  readonly memory: StepMemory;
139
- }
185
+ /** The contract of the template the step renders, with the plan settings bound to it. Absent when none was retrieved. */
186
+ readonly template?: TemplateBrief;
187
+ /**
188
+ * Why the seed carries no template contract for a step whose grounding
189
+ * names one: no client is bound, the service did not answer, or the
190
+ * service does not hold the template. Read only when `template` is absent.
191
+ */
192
+ readonly templateNotRetrieved?: string;
193
+ };
140
194
  /**
141
195
  * Compose the seed. Absent sections collapse out entirely — an independent step
142
196
  * with no profile and an empty memory yields exactly the task and workspace sections, byte-identical