@inflexa-ai/harness 0.45.0 → 0.46.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (802) hide show
  1. package/README.md +6 -3
  2. package/dist/agents/conversation-agent.d.ts +19 -3
  3. package/dist/agents/conversation-agent.js +49 -30
  4. package/dist/agents/report-session-agent.d.ts +15 -15
  5. package/dist/agents/report-session-agent.js +23 -15
  6. package/dist/agents/sandbox/index.d.ts +1 -1
  7. package/dist/agents/sandbox/index.js +1 -1
  8. package/dist/agents/sandbox/shared.d.ts +35 -16
  9. package/dist/agents/sandbox/shared.js +63 -24
  10. package/dist/agents/sandbox/translational-safety-agent.js +26 -0
  11. package/dist/agents/sandbox/types.d.ts +26 -3
  12. package/dist/agents/sandbox/validate-skills.d.ts +2 -2
  13. package/dist/agents/sandbox/validate-skills.js +3 -1
  14. package/dist/agents/sandbox-catalog.d.ts +16 -2
  15. package/dist/agents/sandbox-catalog.js +22 -3
  16. package/dist/agents/system-prompt.d.ts +2 -2
  17. package/dist/app/approve-plan.d.ts +5 -2
  18. package/dist/app/approve-plan.js +1 -1
  19. package/dist/app/chat-turn-workflow.d.ts +114 -0
  20. package/dist/app/chat-turn-workflow.js +307 -0
  21. package/dist/app/chat-turn.d.ts +85 -57
  22. package/dist/app/chat-turn.js +125 -99
  23. package/dist/app/data-profile-orientation.js +10 -8
  24. package/dist/app/data-profile-view.d.ts +4 -4
  25. package/dist/app/data-profile-view.js +9 -8
  26. package/dist/app/in-process-turn.d.ts +42 -0
  27. package/dist/app/in-process-turn.js +139 -0
  28. package/dist/app/message-assembly.d.ts +10 -4
  29. package/dist/app/message-assembly.js +13 -8
  30. package/dist/app/report-session-runtime.d.ts +4 -4
  31. package/dist/app/report-session-runtime.js +36 -21
  32. package/dist/app/spawn-report-session.d.ts +33 -28
  33. package/dist/app/spawn-report-session.js +25 -40
  34. package/dist/app/synthesize-run.d.ts +22 -16
  35. package/dist/app/synthesize-run.js +41 -35
  36. package/dist/app/work.d.ts +96 -0
  37. package/dist/app/work.js +147 -0
  38. package/dist/auth/local-auth-context.d.ts +1 -3
  39. package/dist/auth/local-auth-context.js +1 -3
  40. package/dist/auth/local-run-authorizer.d.ts +1 -1
  41. package/dist/auth/local-run-authorizer.js +5 -3
  42. package/dist/auth/types.d.ts +26 -26
  43. package/dist/billing/cached-resolver.d.ts +4 -4
  44. package/dist/billing/run-charge.d.ts +5 -8
  45. package/dist/billing/run-charge.js +2 -2
  46. package/dist/billing/usage-recorder.d.ts +9 -9
  47. package/dist/citations/aggregate.js +1 -1
  48. package/dist/citations/clients/arxiv.d.ts +2 -2
  49. package/dist/citations/clients/arxiv.js +12 -4
  50. package/dist/citations/clients/common.js +4 -2
  51. package/dist/citations/clients/crossref.d.ts +2 -2
  52. package/dist/citations/clients/crossref.js +37 -37
  53. package/dist/citations/clients/doi-registry.js +15 -16
  54. package/dist/citations/clients/pubmed.d.ts +2 -2
  55. package/dist/citations/clients/pubmed.js +20 -13
  56. package/dist/citations/clients/semantic-scholar.d.ts +2 -2
  57. package/dist/citations/clients/semantic-scholar.js +9 -9
  58. package/dist/citations/compare.js +2 -2
  59. package/dist/citations/match.d.ts +2 -2
  60. package/dist/citations/match.js +12 -7
  61. package/dist/citations/normalize.js +35 -26
  62. package/dist/citations/plan.js +6 -2
  63. package/dist/citations/resolve.d.ts +6 -6
  64. package/dist/citations/resolve.js +34 -25
  65. package/dist/citations/types.d.ts +77 -77
  66. package/dist/config/environment-stores.d.ts +10 -8
  67. package/dist/config/resource-limits.js +1 -3
  68. package/dist/contracts/analogy-report.d.ts +7 -7
  69. package/dist/contracts/analogy-report.js +2 -2
  70. package/dist/contracts/chat-events.d.ts +46 -22
  71. package/dist/contracts/chat-events.js +1 -1
  72. package/dist/contracts/chat-frame.d.ts +15 -5
  73. package/dist/contracts/chat-frame.js +67 -40
  74. package/dist/contracts/chat-parts.d.ts +130 -67
  75. package/dist/contracts/chat-parts.js +1 -0
  76. package/dist/contracts/content-url.js +16 -2
  77. package/dist/contracts/data-profile.d.ts +38 -38
  78. package/dist/contracts/index.d.ts +3 -3
  79. package/dist/contracts/index.js +1 -1
  80. package/dist/contracts/message.d.ts +6 -6
  81. package/dist/contracts/organ-system.d.ts +11 -11
  82. package/dist/contracts/part-registry.d.ts +5 -4
  83. package/dist/contracts/part-registry.js +5 -0
  84. package/dist/contracts/profile-vocabulary.d.ts +11 -10
  85. package/dist/contracts/profile-vocabulary.js +10 -3
  86. package/dist/contracts/report-blocks.d.ts +329 -329
  87. package/dist/contracts/report-reference.d.ts +105 -81
  88. package/dist/contracts/report-reference.js +30 -13
  89. package/dist/contracts/schemas/chat-events.d.ts +45 -6
  90. package/dist/contracts/schemas/chat-events.js +16 -0
  91. package/dist/contracts/schemas/chat-parts.d.ts +214 -102
  92. package/dist/contracts/schemas/chat-parts.js +50 -7
  93. package/dist/contracts/schemas/index.d.ts +1 -1
  94. package/dist/contracts/schemas/index.js +1 -1
  95. package/dist/contracts/severity.d.ts +1 -1
  96. package/dist/contracts/structure-source.d.ts +3 -3
  97. package/dist/contracts/structure-source.js +6 -2
  98. package/dist/contracts/subagent-activity.d.ts +2 -2
  99. package/dist/contracts/subagent-activity.js +5 -3
  100. package/dist/contracts/usage.d.ts +2 -2
  101. package/dist/data/safety-panel-schema.d.ts +25 -25
  102. package/dist/data/safety-panel-schema.js +13 -4
  103. package/dist/execution/artifact-metadata.d.ts +23 -15
  104. package/dist/execution/artifact-metadata.js +33 -10
  105. package/dist/execution/artifact-record.d.ts +2 -2
  106. package/dist/execution/artifact-registration.d.ts +5 -5
  107. package/dist/execution/artifact-registry.d.ts +8 -8
  108. package/dist/execution/dbos-run-launcher.d.ts +24 -4
  109. package/dist/execution/dbos-run-launcher.js +58 -4
  110. package/dist/execution/dbos-workflow-purger.d.ts +7 -6
  111. package/dist/execution/dbos-workflow-purger.js +29 -21
  112. package/dist/execution/input-signature.d.ts +2 -2
  113. package/dist/execution/post-step-pipeline.d.ts +9 -9
  114. package/dist/execution/post-step-pipeline.js +1 -1
  115. package/dist/execution/post-step.js +2 -2
  116. package/dist/execution/reconcile-manifest.d.ts +4 -4
  117. package/dist/execution/reconcile-manifest.js +3 -2
  118. package/dist/execution/run-authorizer.d.ts +46 -37
  119. package/dist/execution/run-authorizer.js +8 -8
  120. package/dist/execution/run-canceler.d.ts +39 -17
  121. package/dist/execution/run-canceler.js +137 -28
  122. package/dist/execution/run-end-record.d.ts +29 -0
  123. package/dist/execution/run-end-record.js +27 -0
  124. package/dist/execution/run-event-parts.d.ts +0 -8
  125. package/dist/execution/run-event-parts.js +29 -24
  126. package/dist/execution/run-event-stream.d.ts +8 -8
  127. package/dist/execution/run-event-stream.js +3 -4
  128. package/dist/execution/run-launcher.d.ts +4 -4
  129. package/dist/execution/run-synthesis.d.ts +49 -48
  130. package/dist/execution/run-synthesis.js +96 -255
  131. package/dist/execution/staged-input.d.ts +2 -2
  132. package/dist/execution/step-summary.d.ts +6 -6
  133. package/dist/execution/step-summary.js +4 -8
  134. package/dist/execution/topo-sort.js +4 -3
  135. package/dist/execution/workflow-purger.d.ts +2 -2
  136. package/dist/index.d.ts +25 -24
  137. package/dist/index.js +36 -37
  138. package/dist/input-sanitization.js +9 -2
  139. package/dist/input-scan/clustering.d.ts +6 -6
  140. package/dist/input-scan/clustering.js +11 -5
  141. package/dist/input-scan/companions.js +3 -2
  142. package/dist/input-scan/detect-sets.d.ts +2 -2
  143. package/dist/input-scan/detect-sets.js +25 -21
  144. package/dist/input-scan/enrich.d.ts +6 -6
  145. package/dist/input-scan/enrich.js +29 -12
  146. package/dist/input-scan/formats.d.ts +2 -2
  147. package/dist/input-scan/formats.js +8 -2
  148. package/dist/input-scan/markers.d.ts +2 -2
  149. package/dist/input-scan/markers.js +14 -5
  150. package/dist/input-scan/menu.d.ts +10 -10
  151. package/dist/input-scan/menu.js +0 -0
  152. package/dist/input-scan/quarantine.d.ts +2 -2
  153. package/dist/input-scan/quarantine.js +23 -18
  154. package/dist/input-scan/readout-budget.d.ts +2 -2
  155. package/dist/input-scan/readout-budget.js +1 -1
  156. package/dist/input-scan/readout.d.ts +2 -2
  157. package/dist/input-scan/readout.js +47 -34
  158. package/dist/input-scan/scan.d.ts +2 -2
  159. package/dist/input-scan/scan.js +7 -5
  160. package/dist/input-scan/set-types.d.ts +28 -28
  161. package/dist/input-scan/shapes.d.ts +4 -4
  162. package/dist/input-scan/shapes.js +0 -0
  163. package/dist/input-scan/templates.d.ts +10 -10
  164. package/dist/input-scan/templates.js +30 -22
  165. package/dist/input-scan/tokens.d.ts +6 -4
  166. package/dist/input-scan/tokens.js +100 -38
  167. package/dist/input-scan/types.d.ts +22 -22
  168. package/dist/lib/async-utils.d.ts +3 -7
  169. package/dist/lib/async-utils.js +5 -9
  170. package/dist/lib/cache.js +1 -1
  171. package/dist/lib/chrome.d.ts +46 -6
  172. package/dist/lib/console-logger.js +2 -2
  173. package/dist/lib/db-result.d.ts +22 -6
  174. package/dist/lib/db-result.js +9 -13
  175. package/dist/lib/eyes.d.ts +4 -4
  176. package/dist/lib/eyes.js +1 -1
  177. package/dist/lib/fs-helpers.js +18 -6
  178. package/dist/lib/fs-result.d.ts +1 -0
  179. package/dist/lib/fs-result.js +5 -6
  180. package/dist/lib/hooks.d.ts +23 -7
  181. package/dist/lib/hooks.js +17 -3
  182. package/dist/lib/host-concurrency.js +3 -2
  183. package/dist/lib/logger.d.ts +2 -2
  184. package/dist/lib/logger.js +2 -1
  185. package/dist/lib/metrics.d.ts +1 -1
  186. package/dist/lib/null-proto.d.ts +6 -0
  187. package/dist/lib/null-proto.js +17 -0
  188. package/dist/lib/otel-spans.d.ts +1 -1
  189. package/dist/lib/otel-spans.js +9 -5
  190. package/dist/lib/otel.d.ts +4 -2
  191. package/dist/lib/otel.js +10 -2
  192. package/dist/lib/page-capture.d.ts +8 -8
  193. package/dist/lib/page-capture.js +9 -4
  194. package/dist/lib/parse-json.d.ts +5 -0
  195. package/dist/lib/parse-json.js +12 -0
  196. package/dist/lib/present.d.ts +12 -0
  197. package/dist/lib/present.js +39 -0
  198. package/dist/lib/rate-limit.d.ts +4 -4
  199. package/dist/lib/rate-limit.js +12 -13
  200. package/dist/lib/regulatory-corpus/fetch-fda-guidance.d.ts +4 -4
  201. package/dist/lib/regulatory-corpus/fetch-fda-guidance.js +4 -10
  202. package/dist/lib/regulatory-corpus/fetch-ich.d.ts +4 -4
  203. package/dist/lib/regulatory-corpus/fetch-ich.js +18 -14
  204. package/dist/lib/regulatory-corpus/normalize-whitespace.d.ts +6 -0
  205. package/dist/lib/regulatory-corpus/normalize-whitespace.js +41 -0
  206. package/dist/lib/regulatory-corpus.d.ts +10 -10
  207. package/dist/lib/regulatory-corpus.js +3 -1
  208. package/dist/lib/result.d.ts +10 -11
  209. package/dist/lib/result.js +15 -13
  210. package/dist/lib/storage.d.ts +2 -2
  211. package/dist/lib/test/async-iterable.d.ts +9 -0
  212. package/dist/lib/test/async-iterable.js +28 -0
  213. package/dist/lib/test/request-url.d.ts +5 -0
  214. package/dist/lib/test/request-url.js +7 -0
  215. package/dist/lib/test/result-assert.d.ts +12 -0
  216. package/dist/lib/test/result-assert.js +17 -0
  217. package/dist/lib/test/text-shapes.d.ts +24 -0
  218. package/dist/lib/test/text-shapes.js +63 -0
  219. package/dist/lib/text.d.ts +22 -0
  220. package/dist/lib/text.js +68 -0
  221. package/dist/lib/thrown.d.ts +18 -0
  222. package/dist/lib/thrown.js +30 -0
  223. package/dist/lib/unknown-array.d.ts +6 -0
  224. package/dist/lib/unknown-array.js +8 -0
  225. package/dist/lib/unknown-containers.d.ts +14 -0
  226. package/dist/lib/unknown-containers.js +17 -0
  227. package/dist/lib/unknown-text.d.ts +8 -0
  228. package/dist/lib/unknown-text.js +28 -0
  229. package/dist/lib/zod-issue-shape.d.ts +1 -1
  230. package/dist/lib/zod-issue-shape.js +31 -31
  231. package/dist/lib/zod-issues.d.ts +3 -3
  232. package/dist/lib/zod-issues.js +30 -17
  233. package/dist/literature/sources/arxiv.d.ts +6 -6
  234. package/dist/literature/sources/arxiv.js +92 -35
  235. package/dist/literature/sources/http.d.ts +2 -2
  236. package/dist/literature/sources/http.js +16 -15
  237. package/dist/literature/sources/pubmed.d.ts +16 -16
  238. package/dist/literature/sources/pubmed.js +96 -61
  239. package/dist/literature/sources/semantic-scholar.d.ts +8 -8
  240. package/dist/literature/sources/semantic-scholar.js +22 -13
  241. package/dist/loop/accounting.d.ts +63 -0
  242. package/dist/loop/accounting.js +141 -0
  243. package/dist/loop/call-policy.d.ts +73 -0
  244. package/dist/loop/call-policy.js +109 -0
  245. package/dist/loop/chat-stream.d.ts +62 -0
  246. package/dist/loop/chat-stream.js +237 -0
  247. package/dist/loop/compaction.d.ts +14 -9
  248. package/dist/loop/compaction.js +17 -0
  249. package/dist/loop/metrics.d.ts +12 -15
  250. package/dist/loop/metrics.js +14 -26
  251. package/dist/loop/run-loop.d.ts +233 -0
  252. package/dist/loop/run-loop.js +770 -0
  253. package/dist/loop/sub-agent.d.ts +61 -0
  254. package/dist/loop/sub-agent.js +161 -0
  255. package/dist/loop/tool-adapter.d.ts +98 -0
  256. package/dist/loop/tool-adapter.js +364 -0
  257. package/dist/loop/tool-detail.d.ts +1 -1
  258. package/dist/loop/tool-detail.js +6 -5
  259. package/dist/loop/tool-outcome.d.ts +1 -1
  260. package/dist/loop/tool-output.d.ts +4 -4
  261. package/dist/loop/tool-output.js +2 -2
  262. package/dist/loop/turn-credentials.d.ts +34 -0
  263. package/dist/loop/turn-credentials.js +73 -0
  264. package/dist/loop/types.d.ts +34 -37
  265. package/dist/loop/types.js +2 -7
  266. package/dist/memory/ai-sdk-message-storage.d.ts +5 -5
  267. package/dist/memory/ai-sdk-message-storage.js +13 -11
  268. package/dist/memory/card-builders.d.ts +14 -14
  269. package/dist/memory/card-builders.js +19 -15
  270. package/dist/memory/conversation-display-recorder.d.ts +22 -6
  271. package/dist/memory/conversation-display-recorder.js +64 -20
  272. package/dist/memory/conversation-display-replay.js +3 -2
  273. package/dist/memory/conversation-display-storage.d.ts +15 -7
  274. package/dist/memory/conversation-display-storage.js +141 -36
  275. package/dist/memory/conversation-view.d.ts +4 -4
  276. package/dist/memory/conversation-view.js +5 -4
  277. package/dist/memory/count-tokens.js +10 -8
  278. package/dist/memory/derive-thread-title.d.ts +0 -13
  279. package/dist/memory/derive-thread-title.js +2 -1
  280. package/dist/memory/message-backfill.d.ts +12 -5
  281. package/dist/memory/message-backfill.js +5 -3
  282. package/dist/memory/thread-history.d.ts +66 -24
  283. package/dist/memory/thread-history.js +212 -79
  284. package/dist/memory/thread-store.d.ts +26 -17
  285. package/dist/memory/thread-store.js +15 -9
  286. package/dist/memory/tool-call-integrity.d.ts +2 -2
  287. package/dist/memory/tool-call-integrity.js +4 -3
  288. package/dist/memory/working-memory.d.ts +16 -12
  289. package/dist/memory/working-memory.js +72 -61
  290. package/dist/prompts/briefing.d.ts +63 -9
  291. package/dist/prompts/briefing.js +130 -3
  292. package/dist/prompts/planner.js +13 -2
  293. package/dist/prompts/synthesis-agent.d.ts +1 -1
  294. package/dist/prompts/synthesis-agent.js +6 -14
  295. package/dist/provenance/collector.d.ts +6 -6
  296. package/dist/provenance/collector.js +15 -8
  297. package/dist/provenance/exec-frame.d.ts +2 -2
  298. package/dist/provenance/exec-frame.js +6 -1
  299. package/dist/provenance/seam.d.ts +24 -19
  300. package/dist/provenance/seam.js +7 -5
  301. package/dist/provenance/types.d.ts +6 -6
  302. package/dist/providers/ai-sdk.d.ts +113 -62
  303. package/dist/providers/ai-sdk.js +303 -458
  304. package/dist/providers/embedding.d.ts +2 -2
  305. package/dist/providers/embedding.js +1 -1
  306. package/dist/providers/errors.d.ts +22 -2
  307. package/dist/providers/errors.js +98 -50
  308. package/dist/providers/prompt-cache.d.ts +8 -8
  309. package/dist/providers/prompt-cache.js +13 -11
  310. package/dist/providers/reasoning.d.ts +2 -2
  311. package/dist/providers/reasoning.js +2 -2
  312. package/dist/providers/types.d.ts +59 -92
  313. package/dist/reference-data/catalog.d.ts +2 -15
  314. package/dist/reference-data/catalog.js +166 -10
  315. package/dist/reference-data/receipt.d.ts +2 -2
  316. package/dist/report-model/assert-rules.js +1 -1
  317. package/dist/report-model/authoring-grammar.d.ts +209 -231
  318. package/dist/report-model/block-walk.d.ts +10 -10
  319. package/dist/report-model/block-walk.js +2 -0
  320. package/dist/report-model/draft-finish.d.ts +8 -8
  321. package/dist/report-model/draft-finish.js +1 -1
  322. package/dist/report-model/draft-hash.js +8 -7
  323. package/dist/report-model/draft-operations.d.ts +22 -10
  324. package/dist/report-model/draft-operations.js +48 -30
  325. package/dist/report-model/draft-read.d.ts +19 -7
  326. package/dist/report-model/draft-read.js +16 -6
  327. package/dist/report-model/draft.d.ts +844 -2
  328. package/dist/report-model/draft.js +3 -1
  329. package/dist/report-model/fixture-resolver.js +39 -16
  330. package/dist/report-model/pin-snapshot.d.ts +2 -2
  331. package/dist/report-model/pin-snapshot.js +15 -15
  332. package/dist/report-model/production-resolver.d.ts +18 -18
  333. package/dist/report-model/production-resolver.js +50 -42
  334. package/dist/report-model/reference-resolver.d.ts +26 -10
  335. package/dist/report-model/reference-resolver.js +68 -5
  336. package/dist/report-model/reference-stamp.js +30 -38
  337. package/dist/report-model/structural-validation.js +12 -4
  338. package/dist/report-model/validate.d.ts +7 -7
  339. package/dist/report-model/validate.js +6 -6
  340. package/dist/report-render/assets.d.ts +2 -2
  341. package/dist/report-render/assets.js +27 -3
  342. package/dist/report-render/chart-export.d.ts +10 -2
  343. package/dist/report-render/chart-export.js +37 -11
  344. package/dist/report-render/chart-presets.d.ts +8 -8
  345. package/dist/report-render/chart-presets.js +3 -3
  346. package/dist/report-render/chart-renderers.d.ts +23 -16
  347. package/dist/report-render/chart-renderers.js +74 -53
  348. package/dist/report-render/chart-toolbox.d.ts +2 -2
  349. package/dist/report-render/chart-toolbox.js +7 -6
  350. package/dist/report-render/chart.d.ts +15 -16
  351. package/dist/report-render/chart.js +369 -252
  352. package/dist/report-render/design.d.ts +36 -297
  353. package/dist/report-render/design.js +0 -12
  354. package/dist/report-render/figures/common.d.ts +12 -12
  355. package/dist/report-render/figures/common.js +42 -31
  356. package/dist/report-render/figures/dendrogram.d.ts +3 -3
  357. package/dist/report-render/figures/dendrogram.js +10 -10
  358. package/dist/report-render/figures/dense.js +15 -8
  359. package/dist/report-render/figures/dotplot.js +46 -33
  360. package/dist/report-render/figures/embedding.js +52 -43
  361. package/dist/report-render/figures/equal-units.d.ts +10 -10
  362. package/dist/report-render/figures/equal-units.js +27 -27
  363. package/dist/report-render/figures/forest.js +9 -7
  364. package/dist/report-render/figures/gsea.js +21 -11
  365. package/dist/report-render/figures/heatmap.js +13 -9
  366. package/dist/report-render/figures/index.d.ts +10 -10
  367. package/dist/report-render/figures/index.js +4 -2
  368. package/dist/report-render/figures/km.js +10 -9
  369. package/dist/report-render/figures/label-room.d.ts +12 -12
  370. package/dist/report-render/figures/label-room.js +7 -2
  371. package/dist/report-render/figures/locuszoom.d.ts +2 -2
  372. package/dist/report-render/figures/locuszoom.js +59 -31
  373. package/dist/report-render/figures/lollipop.js +3 -2
  374. package/dist/report-render/figures/ma.js +8 -4
  375. package/dist/report-render/figures/manhattan.d.ts +1 -2
  376. package/dist/report-render/figures/manhattan.js +52 -34
  377. package/dist/report-render/figures/oncoprint.js +4 -5
  378. package/dist/report-render/figures/pca.js +25 -11
  379. package/dist/report-render/figures/qq.js +20 -9
  380. package/dist/report-render/figures/roc.js +1 -1
  381. package/dist/report-render/figures/sankey.d.ts +2 -2
  382. package/dist/report-render/figures/sankey.js +11 -10
  383. package/dist/report-render/figures/upset.d.ts +6 -6
  384. package/dist/report-render/figures/upset.js +7 -4
  385. package/dist/report-render/figures/volcano.js +12 -10
  386. package/dist/report-render/hybrid-svg.d.ts +4 -4
  387. package/dist/report-render/hybrid-svg.js +7 -5
  388. package/dist/report-render/number-format.d.ts +4 -4
  389. package/dist/report-render/number-format.js +62 -27
  390. package/dist/report-render/page.js +2 -1
  391. package/dist/report-render/provenance-data.d.ts +2 -2
  392. package/dist/report-render/references.d.ts +4 -4
  393. package/dist/report-render/render.d.ts +2 -2
  394. package/dist/report-render/render.js +10 -11
  395. package/dist/report-render/script-json.js +1 -1
  396. package/dist/report-render/table-data.d.ts +6 -6
  397. package/dist/report-render/test/options.d.ts +49 -0
  398. package/dist/report-render/test/options.js +143 -0
  399. package/dist/report-render/test/page-function.d.ts +19 -0
  400. package/dist/report-render/test/page-function.js +33 -0
  401. package/dist/report-render/types.d.ts +10 -10
  402. package/dist/report-render/value-bridge.d.ts +4 -4
  403. package/dist/report-render/value-bridge.js +27 -14
  404. package/dist/report-render/views/chart-view.d.ts +2 -2
  405. package/dist/report-render/views/chart-view.js +2 -2
  406. package/dist/report-render/views/lineage.d.ts +6 -6
  407. package/dist/report-render/views/lineage.js +2 -0
  408. package/dist/report-render/views/page-view.d.ts +2 -2
  409. package/dist/report-render/views/page-view.js +1 -0
  410. package/dist/report-render/views/prose.js +25 -8
  411. package/dist/report-render/views/references-view.js +12 -1
  412. package/dist/report-render/views/values.js +1 -1
  413. package/dist/runtime/assemble.d.ts +53 -26
  414. package/dist/runtime/assemble.js +103 -56
  415. package/dist/runtime/boot.d.ts +8 -7
  416. package/dist/runtime/boot.js +1 -1
  417. package/dist/runtime/connection-budget.d.ts +6 -6
  418. package/dist/runtime/connection-budget.js +1 -1
  419. package/dist/runtime/dbos.d.ts +29 -19
  420. package/dist/runtime/dbos.js +35 -20
  421. package/dist/runtime/result-serialization.js +18 -5
  422. package/dist/runtime/shutdown.d.ts +2 -2
  423. package/dist/sandbox/client.d.ts +7 -3
  424. package/dist/sandbox/cpu-files.d.ts +2 -2
  425. package/dist/sandbox/cpu-files.js +21 -4
  426. package/dist/sandbox/create-sandbox.d.ts +7 -8
  427. package/dist/sandbox/create-sandbox.js +6 -12
  428. package/dist/sandbox/docker-client.d.ts +48 -3
  429. package/dist/sandbox/docker-client.js +10 -6
  430. package/dist/sandbox/estimate-data-profile-resources.js +2 -7
  431. package/dist/sandbox/exec-outcome.d.ts +2 -2
  432. package/dist/sandbox/exec-outcome.js +1 -1
  433. package/dist/sandbox/exec.d.ts +10 -6
  434. package/dist/sandbox/exec.js +27 -12
  435. package/dist/sandbox/execution-id.js +14 -6
  436. package/dist/sandbox/farm.d.ts +2 -2
  437. package/dist/sandbox/farm.js +22 -27
  438. package/dist/sandbox/identity.d.ts +7 -0
  439. package/dist/sandbox/identity.js +14 -3
  440. package/dist/sandbox/image-packages.d.ts +26 -4
  441. package/dist/sandbox/image-packages.js +29 -27
  442. package/dist/sandbox/k8s-client.d.ts +35 -8
  443. package/dist/sandbox/k8s-client.js +6 -5
  444. package/dist/sandbox/labels.js +1 -0
  445. package/dist/sandbox/liveness.js +3 -1
  446. package/dist/sandbox/mount-plan.d.ts +10 -10
  447. package/dist/sandbox/mount-plan.js +13 -14
  448. package/dist/sandbox/notification-sweep.d.ts +4 -4
  449. package/dist/sandbox/notification-sweep.js +4 -7
  450. package/dist/sandbox/package-identity.d.ts +6 -13
  451. package/dist/sandbox/package-identity.js +46 -28
  452. package/dist/sandbox/reaper.d.ts +10 -10
  453. package/dist/sandbox/reaper.js +4 -6
  454. package/dist/sandbox/sandbox-error.d.ts +2 -9
  455. package/dist/sandbox/sandbox-error.js +21 -8
  456. package/dist/sandbox/sandbox-step-translate.d.ts +8 -5
  457. package/dist/sandbox/sandbox-step-translate.js +22 -8
  458. package/dist/sandbox/step-sandbox.d.ts +47 -0
  459. package/dist/sandbox/step-sandbox.js +53 -0
  460. package/dist/sandbox/types.d.ts +18 -19
  461. package/dist/sandbox/types.js +1 -1
  462. package/dist/schemas/artifact-manifest.d.ts +4 -4
  463. package/dist/schemas/data-profile-schemas.d.ts +351 -306
  464. package/dist/schemas/file-metadata.js +2 -4
  465. package/dist/schemas/plan-schemas.d.ts +79 -25
  466. package/dist/schemas/plan-schemas.js +1 -1
  467. package/dist/schemas/run-synthesis.d.ts +95 -26
  468. package/dist/schemas/run-synthesis.js +3 -1
  469. package/dist/schemas/validate-plan.d.ts +4 -4
  470. package/dist/schemas/validate-plan.js +17 -5
  471. package/dist/schemas/workflow-state.d.ts +127 -14
  472. package/dist/schemas/workflow-state.js +56 -2
  473. package/dist/state/active-turns.d.ts +36 -0
  474. package/dist/state/active-turns.js +67 -0
  475. package/dist/state/analyses-metrics.d.ts +8 -8
  476. package/dist/state/analyses-metrics.js +4 -4
  477. package/dist/state/analyses.d.ts +0 -14
  478. package/dist/state/analyses.js +0 -32
  479. package/dist/state/artifacts.d.ts +47 -18
  480. package/dist/state/artifacts.js +48 -7
  481. package/dist/state/data-profile.d.ts +2 -2
  482. package/dist/state/db.d.ts +12 -2
  483. package/dist/state/db.js +5 -0
  484. package/dist/state/edit-intents.d.ts +4 -0
  485. package/dist/state/edit-intents.js +71 -0
  486. package/dist/state/index.d.ts +5 -5
  487. package/dist/state/index.js +3 -3
  488. package/dist/state/init.d.ts +2 -1
  489. package/dist/state/init.js +5 -2
  490. package/dist/state/migrations/20260927120000_baseline.js +3 -1
  491. package/dist/state/migrations/20261026120000_add_the_edit_intents.d.ts +7 -0
  492. package/dist/state/migrations/20261026120000_add_the_edit_intents.js +21 -0
  493. package/dist/state/migrations/20261027120000_record_the_applied_memory_edits.d.ts +7 -0
  494. package/dist/state/migrations/20261027120000_record_the_applied_memory_edits.js +16 -0
  495. package/dist/state/migrations/20261027120100_store_the_authoring_results.d.ts +8 -0
  496. package/dist/state/migrations/20261027120100_store_the_authoring_results.js +20 -0
  497. package/dist/state/migrations/20261027120200_key_the_groups_of_a_turn.d.ts +7 -0
  498. package/dist/state/migrations/20261027120200_key_the_groups_of_a_turn.js +12 -0
  499. package/dist/state/migrations/20261027120300_mark_the_active_turn_of_a_thread.d.ts +7 -0
  500. package/dist/state/migrations/20261027120300_mark_the_active_turn_of_a_thread.js +11 -0
  501. package/dist/state/migrations/20261028120000_record_the_paused_work.d.ts +7 -0
  502. package/dist/state/migrations/20261028120000_record_the_paused_work.js +25 -0
  503. package/dist/state/migrations/20261028120100_end_the_suspended_runs.d.ts +8 -0
  504. package/dist/state/migrations/20261028120100_end_the_suspended_runs.js +13 -0
  505. package/dist/state/migrations/20261029120000_reference_the_run_mandate.d.ts +7 -0
  506. package/dist/state/migrations/20261029120000_reference_the_run_mandate.js +23 -0
  507. package/dist/state/migrations/20261029120100_record_the_run_session_of_a_pause.d.ts +7 -0
  508. package/dist/state/migrations/20261029120100_record_the_run_session_of_a_pause.js +11 -0
  509. package/dist/state/migrations/index.js +18 -0
  510. package/dist/state/paused-work.d.ts +52 -0
  511. package/dist/state/paused-work.js +105 -0
  512. package/dist/state/plans.d.ts +27 -8
  513. package/dist/state/plans.js +14 -11
  514. package/dist/state/purge-analysis.d.ts +6 -6
  515. package/dist/state/purge-analysis.js +10 -2
  516. package/dist/state/report-session-state.d.ts +43 -18
  517. package/dist/state/report-session-state.js +43 -4
  518. package/dist/state/report-versions.d.ts +16 -11
  519. package/dist/state/report-versions.js +5 -3
  520. package/dist/state/runs.d.ts +70 -25
  521. package/dist/state/runs.js +127 -64
  522. package/dist/state/schema.d.ts +18 -21
  523. package/dist/state/schema.js +4 -5
  524. package/dist/state/snapshot-parse.d.ts +2 -2
  525. package/dist/state/snapshot-parse.js +14 -8
  526. package/dist/state/step-executions.d.ts +29 -8
  527. package/dist/state/step-executions.js +28 -4
  528. package/dist/state/tool-outputs.d.ts +2 -2
  529. package/dist/state/tool-outputs.js +2 -1
  530. package/dist/state/vector-store.d.ts +16 -16
  531. package/dist/state/vector-store.js +11 -7
  532. package/dist/tasks/data-profile-absorb.d.ts +3 -3
  533. package/dist/tasks/data-profile-absorb.js +21 -16
  534. package/dist/tasks/data-profile-activity.d.ts +5 -5
  535. package/dist/tasks/data-profile-activity.js +5 -5
  536. package/dist/tasks/data-profile-index.d.ts +4 -4
  537. package/dist/tasks/data-profile-index.js +32 -17
  538. package/dist/tasks/data-profile-resolve.d.ts +8 -8
  539. package/dist/tasks/data-profile-resolve.js +88 -62
  540. package/dist/tasks/data-profile.d.ts +40 -31
  541. package/dist/tasks/data-profile.js +138 -95
  542. package/dist/tasks/extract-values.d.ts +26 -79
  543. package/dist/tasks/extract-values.js +48 -108
  544. package/dist/tasks/refresh-regulatory-corpus.d.ts +4 -20
  545. package/dist/tasks/refresh-regulatory-corpus.js +12 -8
  546. package/dist/tasks/regulatory-corpus-boot-refresh.d.ts +2 -2
  547. package/dist/tasks/regulatory-corpus-boot-refresh.js +12 -10
  548. package/dist/testing.d.ts +60 -0
  549. package/dist/testing.js +96 -0
  550. package/dist/tools/ad-hoc-router.d.ts +11 -9
  551. package/dist/tools/ad-hoc-router.js +80 -51
  552. package/dist/tools/analysis-invocation.d.ts +7 -0
  553. package/dist/tools/analysis-invocation.js +29 -5
  554. package/dist/tools/approval/contract.d.ts +8 -52
  555. package/dist/tools/approval/contract.js +7 -36
  556. package/dist/tools/approval/gateway.d.ts +27 -28
  557. package/dist/tools/approval/gateway.js +33 -130
  558. package/dist/tools/approval/queries.d.ts +6 -11
  559. package/dist/tools/approval/queries.js +43 -29
  560. package/dist/tools/approval/uuidv7.js +2 -2
  561. package/dist/tools/bio/chembl.d.ts +3 -3
  562. package/dist/tools/bio/chembl.js +10 -0
  563. package/dist/tools/bio/comptox.d.ts +25 -8
  564. package/dist/tools/bio/comptox.js +4 -2
  565. package/dist/tools/bio/drug-gene-interactions.d.ts +27 -17
  566. package/dist/tools/bio/drug-gene-interactions.js +11 -8
  567. package/dist/tools/bio/gene-disease-evidence.d.ts +61 -15
  568. package/dist/tools/bio/gene-disease-evidence.js +10 -6
  569. package/dist/tools/bio/gene-preclinical-profile.d.ts +11 -11
  570. package/dist/tools/bio/keys.d.ts +2 -2
  571. package/dist/tools/bio/keys.js +3 -3
  572. package/dist/tools/bio/lookup-annotation.d.ts +5 -5
  573. package/dist/tools/bio/lookup-annotation.js +3 -0
  574. package/dist/tools/bio/opentargets.d.ts +1 -1
  575. package/dist/tools/bio/opentargets.js +6 -0
  576. package/dist/tools/bio/pubchem.d.ts +2 -2
  577. package/dist/tools/bio/pubchem.js +6 -0
  578. package/dist/tools/bio/pubmed.d.ts +26 -16
  579. package/dist/tools/bio/pubmed.js +9 -3
  580. package/dist/tools/bio/search-clinical-trials.d.ts +4 -4
  581. package/dist/tools/bio/search-clinical-trials.js +5 -1
  582. package/dist/tools/bio/search-faers.d.ts +2 -2
  583. package/dist/tools/bio/search-faers.js +1 -1
  584. package/dist/tools/bio/search-gene.d.ts +2 -2
  585. package/dist/tools/bio/search-gene.js +1 -0
  586. package/dist/tools/bio/search-geo-datasets.d.ts +4 -4
  587. package/dist/tools/bio/search-geo-datasets.js +5 -5
  588. package/dist/tools/bio/search-interactions.d.ts +1 -1
  589. package/dist/tools/bio/search-patents.d.ts +28 -22
  590. package/dist/tools/bio/search-patents.js +20 -17
  591. package/dist/tools/bio/search-protein.d.ts +2 -2
  592. package/dist/tools/bio/search-protein.js +1 -1
  593. package/dist/tools/bio/search-regulatory-approvals.d.ts +64 -18
  594. package/dist/tools/bio/search-regulatory-approvals.js +21 -16
  595. package/dist/tools/bio/target-safety.d.ts +8 -8
  596. package/dist/tools/bio/target-safety.js +11 -6
  597. package/dist/tools/capability-data.d.ts +40 -0
  598. package/dist/tools/capability-data.js +74 -0
  599. package/dist/tools/define-tool.d.ts +55 -46
  600. package/dist/tools/define-tool.js +39 -27
  601. package/dist/tools/display/normalize-echart-spec.d.ts +2 -2
  602. package/dist/tools/display/normalize-echart-spec.js +51 -27
  603. package/dist/tools/display/show-user.d.ts +2 -2
  604. package/dist/tools/display/show-user.js +1 -1
  605. package/dist/tools/execute-analysis.d.ts +54 -17
  606. package/dist/tools/execute-analysis.js +193 -62
  607. package/dist/tools/knowledge/check.d.ts +182 -0
  608. package/dist/tools/knowledge/check.js +94 -0
  609. package/dist/tools/knowledge/client.d.ts +351 -0
  610. package/dist/tools/knowledge/client.js +319 -0
  611. package/dist/tools/knowledge/environment.d.ts +78 -0
  612. package/dist/tools/knowledge/environment.js +116 -0
  613. package/dist/tools/knowledge/index.d.ts +49 -0
  614. package/dist/tools/knowledge/index.js +70 -0
  615. package/dist/tools/knowledge/local-slots.d.ts +62 -0
  616. package/dist/tools/knowledge/local-slots.js +184 -0
  617. package/dist/tools/knowledge/pin.d.ts +14 -0
  618. package/dist/tools/knowledge/pin.js +17 -0
  619. package/dist/tools/knowledge/recommend.d.ts +67 -0
  620. package/dist/tools/knowledge/recommend.js +106 -0
  621. package/dist/tools/knowledge/situation.d.ts +143 -0
  622. package/dist/tools/knowledge/situation.js +157 -0
  623. package/dist/tools/knowledge/skeleton.d.ts +69 -0
  624. package/dist/tools/knowledge/skeleton.js +201 -0
  625. package/dist/tools/knowledge/template.d.ts +139 -0
  626. package/dist/tools/knowledge/template.js +273 -0
  627. package/dist/tools/lib/alphafold-client.js +2 -1
  628. package/dist/tools/lib/amass-client.d.ts +28 -28
  629. package/dist/tools/lib/amass-client.js +20 -10
  630. package/dist/tools/lib/api-utils.d.ts +13 -3
  631. package/dist/tools/lib/api-utils.js +17 -3
  632. package/dist/tools/lib/bgee-client.d.ts +6 -6
  633. package/dist/tools/lib/bgee-client.js +16 -10
  634. package/dist/tools/lib/cbioportal-client.d.ts +4 -4
  635. package/dist/tools/lib/cbioportal-client.js +9 -8
  636. package/dist/tools/lib/chembl-client.d.ts +14 -14
  637. package/dist/tools/lib/chembl-client.js +11 -4
  638. package/dist/tools/lib/clinical-benchmarks-client.d.ts +4 -4
  639. package/dist/tools/lib/clinical-benchmarks-client.js +4 -7
  640. package/dist/tools/lib/clinical-trials-client.d.ts +18 -18
  641. package/dist/tools/lib/clinical-trials-client.js +10 -10
  642. package/dist/tools/lib/clinvar-client.d.ts +2 -2
  643. package/dist/tools/lib/clinvar-client.js +6 -6
  644. package/dist/tools/lib/ctx-ops.d.ts +23 -23
  645. package/dist/tools/lib/ctx-ops.js +13 -10
  646. package/dist/tools/lib/dgidb-client.d.ts +6 -6
  647. package/dist/tools/lib/dgidb-client.js +10 -12
  648. package/dist/tools/lib/disgenet-client.d.ts +4 -4
  649. package/dist/tools/lib/ema-client.d.ts +2 -2
  650. package/dist/tools/lib/ensembl-client.d.ts +4 -4
  651. package/dist/tools/lib/ensembl-client.js +5 -4
  652. package/dist/tools/lib/gwas-catalog-client.d.ts +4 -4
  653. package/dist/tools/lib/gwas-catalog-client.js +17 -17
  654. package/dist/tools/lib/html-text.d.ts +6 -0
  655. package/dist/tools/lib/html-text.js +9 -0
  656. package/dist/tools/lib/identifier-resolver.d.ts +4 -4
  657. package/dist/tools/lib/identifier-resolver.js +7 -3
  658. package/dist/tools/lib/impc-client.d.ts +8 -8
  659. package/dist/tools/lib/impc-client.js +46 -35
  660. package/dist/tools/lib/iuphar-client.d.ts +2 -2
  661. package/dist/tools/lib/iuphar-client.js +7 -16
  662. package/dist/tools/lib/monarch-client.d.ts +4 -4
  663. package/dist/tools/lib/openfda-client.d.ts +22 -22
  664. package/dist/tools/lib/openfda-client.js +23 -22
  665. package/dist/tools/lib/opentargets-client.d.ts +12 -12
  666. package/dist/tools/lib/pathway-client.d.ts +4 -4
  667. package/dist/tools/lib/pathway-client.js +15 -19
  668. package/dist/tools/lib/pharmgkb-client.d.ts +2 -2
  669. package/dist/tools/lib/pharmgkb-client.js +1 -1
  670. package/dist/tools/lib/protein-family-modality.d.ts +2 -2
  671. package/dist/tools/lib/protein-family-modality.js +0 -2
  672. package/dist/tools/lib/protein-family-normalize.js +7 -0
  673. package/dist/tools/lib/pubchem-client.d.ts +2 -2
  674. package/dist/tools/lib/pubchem-client.js +1 -0
  675. package/dist/tools/lib/pubchem-ops.d.ts +4 -4
  676. package/dist/tools/lib/pubchem-ops.js +8 -0
  677. package/dist/tools/lib/pubmed-client.d.ts +9 -9
  678. package/dist/tools/lib/pubmed-client.js +1 -1
  679. package/dist/tools/lib/string-client.d.ts +6 -6
  680. package/dist/tools/lib/uniprot-client.d.ts +8 -8
  681. package/dist/tools/lib/uniprot-client.js +5 -1
  682. package/dist/tools/memory/update-working-memory.d.ts +16 -13
  683. package/dist/tools/memory/update-working-memory.js +21 -3
  684. package/dist/tools/read-tool-output.js +8 -2
  685. package/dist/tools/registry.d.ts +2 -2
  686. package/dist/tools/report-authoring/authoring-tools.d.ts +54 -23
  687. package/dist/tools/report-authoring/authoring-tools.js +128 -62
  688. package/dist/tools/report-session/derive-table.d.ts +19 -59
  689. package/dist/tools/report-session/derive-table.js +120 -122
  690. package/dist/tools/report-session/examine-page.d.ts +6 -6
  691. package/dist/tools/report-session/examine-page.js +14 -12
  692. package/dist/tools/report-session/list-artifacts.d.ts +6 -6
  693. package/dist/tools/report-session/list-artifacts.js +5 -5
  694. package/dist/tools/report-session/page-faults.d.ts +6 -6
  695. package/dist/tools/report-session/page-faults.js +3 -1
  696. package/dist/tools/report-session/preview-report.d.ts +4 -3
  697. package/dist/tools/report-session/preview-report.js +26 -7
  698. package/dist/tools/report-session/record-version.d.ts +9 -4
  699. package/dist/tools/report-session/record-version.js +16 -9
  700. package/dist/tools/report-session/session-page-publisher.d.ts +6 -6
  701. package/dist/tools/research/generate-analogy-report.d.ts +14 -7
  702. package/dist/tools/research/generate-analogy-report.js +80 -76
  703. package/dist/tools/research/generate-plan.d.ts +39 -16
  704. package/dist/tools/research/generate-plan.js +565 -338
  705. package/dist/tools/research/guarded-address.d.ts +20 -0
  706. package/dist/tools/research/guarded-address.js +149 -0
  707. package/dist/tools/research/inspect-data-profile.d.ts +27 -20
  708. package/dist/tools/research/inspect-data-profile.js +26 -25
  709. package/dist/tools/research/inspect-run.d.ts +54 -27
  710. package/dist/tools/research/inspect-run.js +50 -40
  711. package/dist/tools/research/literature-reviewer.d.ts +8 -7
  712. package/dist/tools/research/literature-reviewer.js +29 -28
  713. package/dist/tools/research/search-arxiv.d.ts +1 -1
  714. package/dist/tools/research/search-arxiv.js +1 -1
  715. package/dist/tools/research/search-github-repos.d.ts +10 -7
  716. package/dist/tools/research/search-github-repos.js +25 -22
  717. package/dist/tools/research/search-semantic-scholar.js +1 -1
  718. package/dist/tools/research/searxng-engine.d.ts +40 -0
  719. package/dist/tools/research/searxng-engine.js +122 -0
  720. package/dist/tools/research/web-fetch.d.ts +127 -0
  721. package/dist/tools/research/web-fetch.js +618 -0
  722. package/dist/tools/research/web-search.d.ts +84 -0
  723. package/dist/tools/research/web-search.js +117 -0
  724. package/dist/tools/sandbox/link-packages.d.ts +11 -7
  725. package/dist/tools/sandbox/link-packages.js +11 -8
  726. package/dist/tools/sandbox/list-available-packages.d.ts +24 -12
  727. package/dist/tools/sandbox/list-available-packages.js +43 -29
  728. package/dist/tools/sandbox/list-available-refs.d.ts +38 -14
  729. package/dist/tools/sandbox/list-available-refs.js +119 -37
  730. package/dist/tools/sandbox/report-blocker.d.ts +30 -37
  731. package/dist/tools/sandbox/report-blocker.js +22 -68
  732. package/dist/tools/sandbox/skills.d.ts +16 -12
  733. package/dist/tools/sandbox/skills.js +16 -12
  734. package/dist/tools/sandbox/submit-file-metadata.d.ts +12 -9
  735. package/dist/tools/sandbox/submit-file-metadata.js +18 -21
  736. package/dist/tools/start-report-session.d.ts +13 -5
  737. package/dist/tools/start-report-session.js +35 -8
  738. package/dist/tools/terminal-text.d.ts +14 -0
  739. package/dist/tools/terminal-text.js +51 -0
  740. package/dist/tools/workspace/decision-record.d.ts +81 -0
  741. package/dist/tools/workspace/decision-record.js +127 -0
  742. package/dist/tools/workspace/edit-file.d.ts +59 -18
  743. package/dist/tools/workspace/edit-file.js +98 -15
  744. package/dist/tools/workspace/execute-command.d.ts +31 -12
  745. package/dist/tools/workspace/execute-command.js +37 -8
  746. package/dist/tools/workspace/file-stat.d.ts +6 -3
  747. package/dist/tools/workspace/grep.d.ts +10 -7
  748. package/dist/tools/workspace/grep.js +9 -3
  749. package/dist/tools/workspace/index.d.ts +1 -0
  750. package/dist/tools/workspace/index.js +1 -0
  751. package/dist/tools/workspace/list-files.d.ts +6 -3
  752. package/dist/tools/workspace/mutator.d.ts +28 -15
  753. package/dist/tools/workspace/mutator.js +107 -53
  754. package/dist/tools/workspace/read-file.d.ts +8 -5
  755. package/dist/tools/workspace/result-bounds.d.ts +5 -5
  756. package/dist/tools/workspace/result-bounds.js +4 -2
  757. package/dist/tools/workspace/run-exec.d.ts +2 -2
  758. package/dist/tools/workspace/run-exec.js +3 -3
  759. package/dist/tools/workspace/scan-inputs.d.ts +8 -5
  760. package/dist/tools/workspace/scan-inputs.js +17 -5
  761. package/dist/tools/workspace/show-file.d.ts +1 -1
  762. package/dist/tools/workspace/show-file.js +2 -1
  763. package/dist/tools/workspace/show-plan.d.ts +8 -5
  764. package/dist/tools/workspace/show-plan.js +9 -8
  765. package/dist/tools/workspace/workspace-search.d.ts +41 -13
  766. package/dist/tools/workspace/workspace-search.js +27 -14
  767. package/dist/tools/workspace/write-file.d.ts +9 -7
  768. package/dist/workflows/execute-analysis-scheduler.d.ts +9 -9
  769. package/dist/workflows/execute-analysis-scheduler.js +6 -3
  770. package/dist/workflows/execute-analysis.d.ts +100 -76
  771. package/dist/workflows/execute-analysis.js +380 -247
  772. package/dist/workflows/pause.d.ts +71 -0
  773. package/dist/workflows/pause.js +173 -0
  774. package/dist/workflows/sandbox-step.d.ts +50 -61
  775. package/dist/workflows/sandbox-step.js +99 -106
  776. package/dist/workflows/test/sql-writes.d.ts +21 -0
  777. package/dist/workflows/test/sql-writes.js +36 -0
  778. package/dist/workspace/filesystem.d.ts +6 -6
  779. package/dist/workspace/filesystem.js +10 -8
  780. package/dist/workspace/paths.d.ts +1 -1
  781. package/dist/workspace/paths.js +15 -4
  782. package/dist/workspace/search-config.d.ts +2 -2
  783. package/dist/workspace/search-config.js +1 -1
  784. package/package.json +25 -22
  785. package/dist/loop/continue-agent.d.ts +0 -40
  786. package/dist/loop/continue-agent.js +0 -38
  787. package/dist/loop/genai-spans.d.ts +0 -47
  788. package/dist/loop/genai-spans.js +0 -134
  789. package/dist/loop/run-agent.d.ts +0 -236
  790. package/dist/loop/run-agent.js +0 -1110
  791. package/dist/loop/run-step.d.ts +0 -29
  792. package/dist/loop/run-step.js +0 -34
  793. package/dist/loop/run-to-terminal.d.ts +0 -66
  794. package/dist/loop/run-to-terminal.js +0 -90
  795. package/dist/loop/tool-mask.d.ts +0 -23
  796. package/dist/loop/tool-mask.js +0 -46
  797. package/dist/providers/streaming-chat.d.ts +0 -32
  798. package/dist/providers/streaming-chat.js +0 -91
  799. package/dist/tasks/derive-table-exec.d.ts +0 -54
  800. package/dist/tasks/derive-table-exec.js +0 -86
  801. package/dist/workflows/suspension.d.ts +0 -32
  802. package/dist/workflows/suspension.js +0 -38
@@ -0,0 +1,20 @@
1
+ /**
2
+ * The guarded-address classifier of the web research tools.
3
+ *
4
+ * One pure function over one address: `isGuardedAddress` answers whether the
5
+ * address falls in a range that `web_fetch` asks the user about before it
6
+ * connects. The ranges are a pinned subset of the special-purpose address
7
+ * ranges of the IANA registries — loopback, private, shared, link-local,
8
+ * multicast, reserved, documentation, and benchmarking space, IPv4 and IPv6.
9
+ * A public unicast address is never guarded.
10
+ *
11
+ * The caller owns the question "which address does the connection use": the
12
+ * classifier never resolves a name and it never reads the network.
13
+ */
14
+ /**
15
+ * Is this address one the web tools guard? An IP literal of either family
16
+ * classifies against the pinned table; the IPv4-mapped IPv6 form
17
+ * (`::ffff:10.0.0.1`) classifies as its IPv4 half. A value that is not an IP
18
+ * address gives false — the caller resolves names before it reaches here.
19
+ */
20
+ export declare function isGuardedAddress(ip: string): boolean;
@@ -0,0 +1,149 @@
1
+ /**
2
+ * The guarded-address classifier of the web research tools.
3
+ *
4
+ * One pure function over one address: `isGuardedAddress` answers whether the
5
+ * address falls in a range that `web_fetch` asks the user about before it
6
+ * connects. The ranges are a pinned subset of the special-purpose address
7
+ * ranges of the IANA registries — loopback, private, shared, link-local,
8
+ * multicast, reserved, documentation, and benchmarking space, IPv4 and IPv6.
9
+ * A public unicast address is never guarded.
10
+ *
11
+ * The caller owns the question "which address does the connection use": the
12
+ * classifier never resolves a name and it never reads the network.
13
+ */
14
+ import { isIP } from "node:net";
15
+ import { isAllDigits, isAllHex } from "../../lib/text.js";
16
+ /** Parse a dotted-quad IPv4 address into its 32-bit value. Anything else gives null. */
17
+ function ipv4ToNumber(ip) {
18
+ const parts = ip.split(".");
19
+ if (parts.length !== 4)
20
+ return null;
21
+ let value = 0;
22
+ for (const part of parts) {
23
+ if (part.length === 0 || part.length > 3 || !isAllDigits(part))
24
+ return null;
25
+ const octet = Number(part);
26
+ if (octet > 255)
27
+ return null;
28
+ value = (value << 8) | octet;
29
+ }
30
+ return value >>> 0;
31
+ }
32
+ /** Parse an IPv6 address into its 128-bit value. Anything else gives null. */
33
+ function ipv6ToBigInt(ip) {
34
+ let text = ip.toLowerCase();
35
+ // An embedded IPv4 tail stands for its two low-order groups.
36
+ if (text.includes(".")) {
37
+ const lastColon = text.lastIndexOf(":");
38
+ const tail = ipv4ToNumber(text.slice(lastColon + 1));
39
+ if (tail === null)
40
+ return null;
41
+ const high = ((tail >>> 16) & 0xffff).toString(16);
42
+ const low = (tail & 0xffff).toString(16);
43
+ text = `${text.slice(0, lastColon + 1)}${high}:${low}`;
44
+ }
45
+ const groupsOf = (half) => {
46
+ if (half === "")
47
+ return [];
48
+ const groups = [];
49
+ for (const group of half.split(":")) {
50
+ if (group.length === 0 || group.length > 4 || !isAllHex(group))
51
+ return null;
52
+ groups.push(BigInt(`0x${group}`));
53
+ }
54
+ return groups;
55
+ };
56
+ const halves = text.split("::");
57
+ if (halves.length > 2)
58
+ return null;
59
+ const left = groupsOf(halves[0] ?? "");
60
+ const right = halves.length === 2 ? groupsOf(halves[1] ?? "") : [];
61
+ if (left === null || right === null)
62
+ return null;
63
+ const fill = 8 - left.length - right.length;
64
+ if (halves.length === 2 ? fill < 0 : fill !== 0)
65
+ return null;
66
+ return [...left, ...new Array(Math.max(fill, 0)).fill(0n), ...right].reduce((acc, group) => (acc << 16n) | group, 0n);
67
+ }
68
+ const ipv4Span = (first, last) => {
69
+ const low = ipv4ToNumber(first);
70
+ const high = ipv4ToNumber(last);
71
+ if (low === null || high === null)
72
+ throw new Error(`Bad IPv4 range literal: ${first}..${last}`);
73
+ return { first: low, last: high };
74
+ };
75
+ const ipv6Span = (first, last) => {
76
+ const low = ipv6ToBigInt(first);
77
+ const high = ipv6ToBigInt(last);
78
+ if (low === null || high === null)
79
+ throw new Error(`Bad IPv6 range literal: ${first}..${last}`);
80
+ return { first: low, last: high };
81
+ };
82
+ /**
83
+ * The pinned IPv4 table. `240.0.0.0/4` holds the reserved and the broadcast
84
+ * space together, and it ends at the top of the address family.
85
+ */
86
+ const GUARDED_IPV4_RANGES = [
87
+ ipv4Span("0.0.0.0", "0.255.255.255"), // 0.0.0.0/8
88
+ ipv4Span("10.0.0.0", "10.255.255.255"), // 10.0.0.0/8
89
+ ipv4Span("100.64.0.0", "100.127.255.255"), // 100.64.0.0/10
90
+ ipv4Span("127.0.0.0", "127.255.255.255"), // 127.0.0.0/8
91
+ ipv4Span("169.254.0.0", "169.254.255.255"), // 169.254.0.0/16
92
+ ipv4Span("172.16.0.0", "172.31.255.255"), // 172.16.0.0/12
93
+ ipv4Span("192.0.0.0", "192.0.0.255"), // 192.0.0.0/24
94
+ ipv4Span("192.0.2.0", "192.0.2.255"), // 192.0.2.0/24
95
+ ipv4Span("192.88.99.0", "192.88.99.255"), // 192.88.99.0/24
96
+ ipv4Span("192.168.0.0", "192.168.255.255"), // 192.168.0.0/16
97
+ ipv4Span("198.18.0.0", "198.19.255.255"), // 198.18.0.0/15
98
+ ipv4Span("198.51.100.0", "198.51.100.255"), // 198.51.100.0/24
99
+ ipv4Span("203.0.113.0", "203.0.113.255"), // 203.0.113.0/24
100
+ ipv4Span("224.0.0.0", "239.255.255.255"), // 224.0.0.0/4
101
+ ipv4Span("240.0.0.0", "255.255.255.255"), // 240.0.0.0/4
102
+ ];
103
+ /**
104
+ * The pinned IPv6 table, without `::ffff:0:0/96`: an IPv4-mapped address
105
+ * normalizes to its IPv4 half first, thus that range classifies through the
106
+ * IPv4 table above.
107
+ */
108
+ const GUARDED_IPV6_RANGES = [
109
+ ipv6Span("::", "::"), // ::/128
110
+ ipv6Span("::1", "::1"), // ::1/128
111
+ ipv6Span("64:ff9b::", "64:ff9b::ffff:ffff"), // 64:ff9b::/96
112
+ ipv6Span("64:ff9b:1::", "64:ff9b:1:ffff:ffff:ffff:ffff:ffff"), // 64:ff9b:1::/48
113
+ ipv6Span("100::", "100::ffff:ffff:ffff:ffff"), // 100::/64
114
+ ipv6Span("2001::", "2001:0:ffff:ffff:ffff:ffff:ffff:ffff"), // 2001::/32
115
+ ipv6Span("2001:db8::", "2001:db8:ffff:ffff:ffff:ffff:ffff:ffff"), // 2001:db8::/32
116
+ ipv6Span("2002::", "2002:ffff:ffff:ffff:ffff:ffff:ffff:ffff"), // 2002::/16
117
+ ipv6Span("fc00::", "fdff:ffff:ffff:ffff:ffff:ffff:ffff:ffff"), // fc00::/7
118
+ ipv6Span("fe80::", "febf:ffff:ffff:ffff:ffff:ffff:ffff:ffff"), // fe80::/10
119
+ ipv6Span("ff00::", "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff"), // ff00::/8
120
+ ];
121
+ function isGuardedIpv4(value) {
122
+ return GUARDED_IPV4_RANGES.some((range) => value >= range.first && value <= range.last);
123
+ }
124
+ function isGuardedIpv6(value) {
125
+ return GUARDED_IPV6_RANGES.some((range) => value >= range.first && value <= range.last);
126
+ }
127
+ /**
128
+ * Is this address one the web tools guard? An IP literal of either family
129
+ * classifies against the pinned table; the IPv4-mapped IPv6 form
130
+ * (`::ffff:10.0.0.1`) classifies as its IPv4 half. A value that is not an IP
131
+ * address gives false — the caller resolves names before it reaches here.
132
+ */
133
+ export function isGuardedAddress(ip) {
134
+ const family = isIP(ip);
135
+ if (family === 4) {
136
+ const value = ipv4ToNumber(ip);
137
+ return value !== null && isGuardedIpv4(value);
138
+ }
139
+ if (family === 6) {
140
+ const value = ipv6ToBigInt(ip);
141
+ if (value === null)
142
+ return false;
143
+ // The IPv4-mapped form, ::ffff:0:0/96, classifies as its IPv4 half.
144
+ if (value >> 32n === 0xffffn)
145
+ return isGuardedIpv4(Number(value & 0xffffffffn));
146
+ return isGuardedIpv6(value);
147
+ }
148
+ return false;
149
+ }
@@ -29,21 +29,23 @@
29
29
  * form names a file that does not exist in the frame of the caller. The same
30
30
  * projection guards the step briefing (`app/data-profile-orientation.ts`).
31
31
  */
32
- import type { Pool } from "pg";
32
+ import type { Querier } from "../../state/db.js";
33
+ import { z } from "zod";
33
34
  import { type DataProfileFile, type DataProfileResult } from "../../state/index.js";
35
+ import { type Tool } from "../define-tool.js";
34
36
  /**
35
37
  * Whether the served profile can be trusted to describe the analysis's CURRENT inputs.
36
38
  * `"stale"` still carries the full profile — a stale profile is far better than none —
37
39
  * but says plainly why it may be wrong.
38
40
  */
39
41
  type Freshness = "ready" | "stale";
40
- interface ProfileEnvelope {
42
+ type ProfileEnvelope = {
41
43
  readonly state: Freshness;
42
44
  /** Why the profile may not describe the current inputs. Present only when `state` is `"stale"`. */
43
45
  readonly staleReason?: string;
44
46
  readonly profiledAt: string;
45
- }
46
- interface OverviewOutput extends ProfileEnvelope {
47
+ };
48
+ type OverviewOutput = ProfileEnvelope & {
47
49
  readonly scope: "overview";
48
50
  readonly summary: string;
49
51
  readonly domain?: string;
@@ -76,7 +78,7 @@ interface OverviewOutput extends ProfileEnvelope {
76
78
  */
77
79
  readonly partition?: DataProfileResult["partition"];
78
80
  readonly coverage?: DataProfileResult["coverage"];
79
- }
81
+ };
80
82
  /**
81
83
  * The dataset's structure. A snapshot carrying none reports `available: false` rather
82
84
  * than an empty list: "this profile predates the structure" and "this dataset has no
@@ -85,7 +87,7 @@ interface OverviewOutput extends ProfileEnvelope {
85
87
  * A snapshot written under the previous model is served through `kinds`/`axes`, labelled
86
88
  * — the structure exists, and an agent must not be told the dataset has none.
87
89
  */
88
- interface GroupsOutput extends ProfileEnvelope {
90
+ type GroupsOutput = ProfileEnvelope & {
89
91
  readonly scope: "groups";
90
92
  readonly available: boolean;
91
93
  /** Authored under the previous model — `kinds`/`axes` rather than resolved groups. */
@@ -99,13 +101,13 @@ interface GroupsOutput extends ProfileEnvelope {
99
101
  readonly axes?: DataProfileResult["axes"];
100
102
  readonly coverage?: DataProfileResult["coverage"];
101
103
  readonly message?: string;
102
- }
104
+ };
103
105
  /**
104
106
  * The members the profile describes individually — annotated members on a resolved
105
107
  * snapshot, the notable-file records on an older one. Never the dataset: `datasetFileCount`
106
108
  * on the overview is what says how big that is.
107
109
  */
108
- interface FilesOutput extends ProfileEnvelope {
110
+ type FilesOutput = ProfileEnvelope & {
109
111
  readonly scope: "files";
110
112
  readonly page: number;
111
113
  readonly pageSize: number;
@@ -116,7 +118,7 @@ interface FilesOutput extends ProfileEnvelope {
116
118
  /** How many files the dataset holds, so a page of 20 never reads as the whole of it. */
117
119
  readonly datasetFileCount: number | null;
118
120
  readonly files: DataProfileFile[];
119
- }
121
+ };
120
122
  /**
121
123
  * No profile to serve — the honest lifecycle states, in the ok channel.
122
124
  *
@@ -128,15 +130,15 @@ interface FilesOutput extends ProfileEnvelope {
128
130
  * constant here, and a constant field carries no information while implying
129
131
  * that it does. `FailedOutput` omits one for the same reason — see its note.
130
132
  */
131
- interface AbsentOutput {
133
+ type AbsentOutput = {
132
134
  readonly state: "absent";
133
135
  readonly message: string;
134
- }
135
- interface PendingOutput {
136
+ };
137
+ type PendingOutput = {
136
138
  readonly state: "pending";
137
139
  readonly status: "pending" | "running";
138
140
  readonly message: string;
139
- }
141
+ };
140
142
  /**
141
143
  * A recorded failure with no profile to fall back on.
142
144
  *
@@ -152,17 +154,22 @@ interface PendingOutput {
152
154
  * `failedAt` is reported instead: a fact the row actually holds, and one an agent
153
155
  * that knows when the input set last changed can act on.
154
156
  */
155
- interface FailedOutput {
157
+ type FailedOutput = {
156
158
  readonly state: "failed";
157
159
  readonly error: string | null;
158
160
  /** When the failure was recorded; `null` when the row holds no time. */
159
161
  readonly failedAt: string | null;
160
162
  readonly message: string;
161
- }
163
+ };
162
164
  export type InspectDataProfileOutput = OverviewOutput | GroupsOutput | FilesOutput | AbsentOutput | PendingOutput | FailedOutput;
163
- export declare function createInspectDataProfileTool(pool: Pool): import("../define-tool.js").Tool<{
164
- scope?: "groups" | "files" | "overview" | undefined;
165
- page?: number | undefined;
166
- pageSize?: number | undefined;
167
- }, InspectDataProfileOutput>;
165
+ declare const InspectDataProfileInputSchema: z.ZodObject<{
166
+ scope: z.ZodOptional<z.ZodEnum<{
167
+ files: "files";
168
+ groups: "groups";
169
+ overview: "overview";
170
+ }>>;
171
+ page: z.ZodOptional<z.ZodNumber>;
172
+ pageSize: z.ZodOptional<z.ZodNumber>;
173
+ }, z.core.$strip>;
174
+ export declare function createInspectDataProfileTool(pool: Querier): Tool<z.infer<typeof InspectDataProfileInputSchema>, InspectDataProfileOutput>;
168
175
  export {};
@@ -90,6 +90,22 @@ function stalenessReasons(status) {
90
90
  const FAILURE_SCOPE_NOTE = "This records an earlier attempt; this row cannot establish whether it covered the input files the analysis " +
91
91
  "holds now, so do not read it as a verdict on the current data. Compare failedAt against when the input set " +
92
92
  "last changed, and re-profile if they have moved apart.";
93
+ const InspectDataProfileInputSchema = z.object({
94
+ scope: z
95
+ .enum(["overview", "groups", "files"])
96
+ .optional()
97
+ .describe("'overview' (default): dataset-level facts, the partition accounting, the annotated-member count, and the dataset file count. " +
98
+ "'groups': the groups the dataset is made of, with their slots, and the dimensions that vary across it. " +
99
+ "'files': paged records for the individually annotated members."),
100
+ page: z.number().int().min(1).optional().describe("1-based page of member records. Only used when scope is 'files'. Default 1."),
101
+ pageSize: z
102
+ .number()
103
+ .int()
104
+ .min(1)
105
+ .max(MAX_PAGE_SIZE)
106
+ .optional()
107
+ .describe(`Member records per page. Only used when scope is 'files'. Default ${DEFAULT_PAGE_SIZE}, max ${MAX_PAGE_SIZE}.`),
108
+ });
93
109
  export function createInspectDataProfileTool(pool) {
94
110
  return defineTool({
95
111
  id: "inspect_data_profile",
@@ -119,22 +135,7 @@ export function createInspectDataProfileTool(pool) {
119
135
  "input files you are holding now, and this tool cannot tell you whether that attempt covered them. Compare failedAt " +
120
136
  "against when the input set last changed before you conclude anything: if the data moved since, say the profile " +
121
137
  "needs re-running rather than diagnosing the data itself.",
122
- inputSchema: z.object({
123
- scope: z
124
- .enum(["overview", "groups", "files"])
125
- .optional()
126
- .describe("'overview' (default): dataset-level facts, the partition accounting, the annotated-member count, and the dataset file count. " +
127
- "'groups': the groups the dataset is made of, with their slots, and the dimensions that vary across it. " +
128
- "'files': paged records for the individually annotated members."),
129
- page: z.number().int().min(1).optional().describe("1-based page of member records. Only used when scope is 'files'. Default 1."),
130
- pageSize: z
131
- .number()
132
- .int()
133
- .min(1)
134
- .max(MAX_PAGE_SIZE)
135
- .optional()
136
- .describe(`Member records per page. Only used when scope is 'files'. Default ${DEFAULT_PAGE_SIZE}, max ${MAX_PAGE_SIZE}.`),
137
- }),
138
+ inputSchema: InspectDataProfileInputSchema,
138
139
  // `execute` defaults both fields internally, and the hook applies the same
139
140
  // defaults. Without them the ordinary call, which names no field at all,
140
141
  // gives no detail. `page` acts only on the `files` scope, as in `execute`.
@@ -214,9 +215,9 @@ export function createInspectDataProfileTool(pool) {
214
215
  // nothing of carries `groups: []`, and "zero groups" is a finding — reading
215
216
  // it as "no structure record" would report the analysis unprofiled.
216
217
  groupCount: result.groups !== undefined || result.kinds !== undefined ? groups.length : null,
217
- ...(structureNote ? { structureNote } : {}),
218
- ...(result.partition ? { partition: result.partition } : {}),
219
- ...(result.coverage ? { coverage: result.coverage } : {}),
218
+ structureNote,
219
+ partition: result.partition,
220
+ coverage: result.coverage,
220
221
  });
221
222
  }
222
223
  if (scope === "groups") {
@@ -226,10 +227,10 @@ export function createInspectDataProfileTool(pool) {
226
227
  scope: "groups",
227
228
  available: true,
228
229
  groups: rootGroupPatterns(result.groups, resourceId),
229
- ...(result.dimensions ? { dimensions: result.dimensions } : {}),
230
- ...(result.probes ? { probes: result.probes } : {}),
231
- ...(result.partition ? { partition: result.partition } : {}),
232
- ...(result.recipe ? { recipe: result.recipe } : {}),
230
+ dimensions: result.dimensions,
231
+ probes: result.probes,
232
+ partition: result.partition,
233
+ recipe: result.recipe,
233
234
  });
234
235
  }
235
236
  if (result.kinds === undefined) {
@@ -251,8 +252,8 @@ export function createInspectDataProfileTool(pool) {
251
252
  available: true,
252
253
  legacy: true,
253
254
  kinds: rootKindPatterns(result.kinds, resourceId),
254
- ...(result.axes ? { axes: result.axes } : {}),
255
- ...(result.coverage ? { coverage: result.coverage } : {}),
255
+ axes: result.axes,
256
+ coverage: result.coverage,
256
257
  message: "Authored under the previous model: these are kinds and axes, not resolved groups and dimensions. " +
257
258
  "Counts and patterns were the profiler's own claims rather than a computed partition, and there is no " +
258
259
  "unclassified sweep or quarantine accounting on a profile of that era.",
@@ -5,10 +5,24 @@
5
5
  * conversation. List mode puts the running runs first and is paged. Targeted mode makes
6
6
  * readiness explicit and can perform one bounded, abort-aware wait.
7
7
  */
8
- import type { Pool } from "pg";
8
+ import type { QueryConfig } from "pg";
9
+ import { z } from "zod";
10
+ import type { PauseCause } from "../../contracts/chat-parts.js";
9
11
  import type { CortexRunRow } from "../../state/schema.js";
10
- type FormattedRun = ReturnType<typeof formatRun>;
11
- interface FormattedStep {
12
+ import { type Tool } from "../define-tool.js";
13
+ type FormattedRun = {
14
+ runId: string;
15
+ workflowName: string;
16
+ status: CortexRunRow["status"];
17
+ startedAt: string;
18
+ completedAt: string | null;
19
+ planId: string | null;
20
+ synthesisPath: string | null;
21
+ synthesisStatus: CortexRunRow["synthesisStatus"];
22
+ error: string | null | undefined;
23
+ synthesisReason?: string;
24
+ };
25
+ type FormattedStep = {
12
26
  stepId: string;
13
27
  agentId: string;
14
28
  wave: number;
@@ -20,11 +34,11 @@ interface FormattedStep {
20
34
  lastErrorClass?: string | null;
21
35
  finishReason?: string | null;
22
36
  hitMaxSteps?: boolean | null;
23
- }
24
- interface WaitMetadata {
37
+ };
38
+ type WaitMetadata = {
25
39
  readonly requestedSeconds: number;
26
40
  readonly cutoffReached: boolean;
27
- }
41
+ };
28
42
  type InspectRunOutput = {
29
43
  runs: FormattedRun[];
30
44
  total: number;
@@ -36,7 +50,20 @@ type InspectRunOutput = {
36
50
  message: string;
37
51
  wait?: WaitMetadata;
38
52
  } | {
39
- inspectionState: "in_progress" | "suspended" | "terminal";
53
+ inspectionState: "paused";
54
+ message: string;
55
+ run: FormattedRun;
56
+ steps: FormattedStep[];
57
+ /** Each workflow of the run that waits: a step, or the synthesis. */
58
+ pauses: {
59
+ state: "retrying" | "paused";
60
+ cause: PauseCause;
61
+ attempt: number;
62
+ retryAt?: string;
63
+ }[];
64
+ wait?: WaitMetadata;
65
+ } | {
66
+ inspectionState: "in_progress" | "terminal";
40
67
  message: string;
41
68
  run: FormattedRun;
42
69
  steps: FormattedStep[];
@@ -44,31 +71,31 @@ type InspectRunOutput = {
44
71
  wait?: WaitMetadata;
45
72
  selfWaitPrevented?: boolean;
46
73
  };
47
- interface InspectRunClock {
74
+ type InspectRunClock = {
48
75
  now(): number;
49
76
  wait(ms: number, signal: AbortSignal): Promise<void>;
50
- }
51
- declare function formatRun(r: CortexRunRow, verbose: boolean, exposePaths?: boolean): {
52
- error?: string | null | undefined;
53
- synthesisReason?: string | undefined;
54
- runId: string;
55
- workflowName: string;
56
- status: "failed" | "running" | "completed" | "partial" | "canceled" | "suspended_insufficient_funds";
57
- startedAt: string;
58
- completedAt: string | null;
59
- planId: string | null;
60
- synthesisPath: string | null;
61
- synthesisStatus: "failed" | "produced" | "skipped_no_summaries" | "skipped_blocker" | null;
77
+ };
78
+ declare const inputSchema: z.ZodObject<{
79
+ runId: z.ZodOptional<z.ZodString>;
80
+ page: z.ZodOptional<z.ZodNumber>;
81
+ pageSize: z.ZodOptional<z.ZodNumber>;
82
+ waitForTerminalSeconds: z.ZodOptional<z.ZodNumber>;
83
+ includeDiagnostics: z.ZodOptional<z.ZodBoolean>;
84
+ }, z.core.$strip>;
85
+ /**
86
+ * The pool surface this tool reads: one query whose rows the state row parsers type. A computed test fake
87
+ * satisfies this shape directly, where the row-generic of `Querier` cannot be implemented by a fake that
88
+ * computes its rows.
89
+ */
90
+ export type InspectRunQuerier = {
91
+ query(queryTextOrConfig: string | QueryConfig, values?: unknown[]): Promise<{
92
+ rows: Record<string, unknown>[];
93
+ rowCount: number | null;
94
+ }>;
62
95
  };
63
96
  /**
64
97
  * Build the run-inspection tool. The optional clock is an internal testing
65
98
  * seam for deterministic cutoff and transition coverage.
66
99
  */
67
- export declare function createInspectRunTool(pool: Pool, clock?: InspectRunClock): import("../define-tool.js").Tool<{
68
- runId?: string | undefined;
69
- page?: number | undefined;
70
- pageSize?: number | undefined;
71
- waitForTerminalSeconds?: number | undefined;
72
- includeDiagnostics?: boolean | undefined;
73
- }, InspectRunOutput>;
100
+ export declare function createInspectRunTool(pool: InspectRunQuerier, clock?: InspectRunClock): Tool<z.infer<typeof inputSchema>, InspectRunOutput>;
74
101
  export {};
@@ -11,6 +11,7 @@ import { z } from "zod";
11
11
  import { scopeResource } from "../../auth/types.js";
12
12
  import { unwrapOrThrow } from "../../lib/result.js";
13
13
  import { queryRun, queryRunsForInspection, queryStepsByRun } from "../../state/index.js";
14
+ import { queryPausesOfWork } from "../../state/paused-work.js";
14
15
  import { SYNTHESIS_STEP_ID } from "../../workspace/paths.js";
15
16
  import { defineTool } from "../define-tool.js";
16
17
  const DEFAULT_PAGE_SIZE = 50;
@@ -20,10 +21,10 @@ const systemClock = {
20
21
  wait: (ms, signal) => sleep(ms, undefined, { signal }),
21
22
  };
22
23
  function isTerminal(status) {
23
- return status === "completed" || status === "partial" || status === "failed" || status === "canceled" || status === "suspended_insufficient_funds";
24
+ return status === "completed" || status === "partial" || status === "failed" || status === "canceled";
24
25
  }
25
26
  function formatRun(r, verbose, exposePaths = isTerminal(r.status)) {
26
- return {
27
+ const run = {
27
28
  runId: r.runId,
28
29
  workflowName: r.workflowName,
29
30
  status: r.status,
@@ -32,30 +33,33 @@ function formatRun(r, verbose, exposePaths = isTerminal(r.status)) {
32
33
  planId: r.planId,
33
34
  synthesisPath: exposePaths && r.synthesisStatus === "produced" ? `runs/${r.runId}/synthesis.json` : null,
34
35
  synthesisStatus: r.synthesisStatus,
35
- ...(r.synthesisReason !== null ? { synthesisReason: r.synthesisReason } : {}),
36
- ...(verbose ? { error: r.error } : {}),
36
+ error: verbose ? (r.error ?? null) : undefined,
37
37
  };
38
+ if (r.synthesisReason !== null)
39
+ return { ...run, synthesisReason: r.synthesisReason };
40
+ return run;
38
41
  }
39
42
  function formatSteps(runId, stepRows, verbose, exposePaths) {
40
- return stepRows.map((s) => ({
41
- stepId: s.stepId,
42
- agentId: s.agentId,
43
- wave: s.wave,
44
- status: s.status,
45
- ...(exposePaths && s.status !== "pending" && s.status !== "skipped" && s.stepId !== SYNTHESIS_STEP_ID
46
- ? { summaryPath: `runs/${runId}/${s.stepId}/output/summary.md` }
47
- : {}),
48
- ...(verbose
49
- ? {
50
- durationMs: s.durationMs,
51
- error: s.error,
52
- attempts: s.attempts,
53
- lastErrorClass: s.lastErrorClass,
54
- finishReason: s.finishReason,
55
- hitMaxSteps: s.hitMaxSteps,
56
- }
57
- : {}),
58
- }));
43
+ return stepRows.map((s) => {
44
+ const step = {
45
+ stepId: s.stepId,
46
+ agentId: s.agentId,
47
+ wave: s.wave,
48
+ status: s.status,
49
+ };
50
+ if (exposePaths && s.status !== "pending" && s.status !== "skipped" && s.stepId !== SYNTHESIS_STEP_ID) {
51
+ step.summaryPath = `runs/${runId}/${s.stepId}/output/summary.md`;
52
+ }
53
+ if (verbose) {
54
+ step.durationMs = s.durationMs;
55
+ step.error = s.error;
56
+ step.attempts = s.attempts;
57
+ step.lastErrorClass = s.lastErrorClass;
58
+ step.finishReason = s.finishReason;
59
+ step.hitMaxSteps = s.hitMaxSteps;
60
+ }
61
+ return step;
62
+ });
59
63
  }
60
64
  const inputSchema = z
61
65
  .object({
@@ -77,14 +81,14 @@ const inputSchema = z
77
81
  .superRefine((input, refinement) => {
78
82
  if (input.runId && (input.page !== undefined || input.pageSize !== undefined)) {
79
83
  refinement.addIssue({
80
- code: z.ZodIssueCode.custom,
84
+ code: "custom",
81
85
  message: "page and pageSize are valid only when runId is omitted",
82
86
  path: input.page !== undefined ? ["page"] : ["pageSize"],
83
87
  });
84
88
  }
85
89
  if (!input.runId && input.waitForTerminalSeconds !== undefined) {
86
90
  refinement.addIssue({
87
- code: z.ZodIssueCode.custom,
91
+ code: "custom",
88
92
  message: "waitForTerminalSeconds requires runId",
89
93
  path: ["waitForTerminalSeconds"],
90
94
  });
@@ -99,9 +103,9 @@ export function createInspectRunTool(pool, clock = systemClock) {
99
103
  id: "inspect_run",
100
104
  description: "Inspect workflow runs for this analysis. A run never posts its completion into the conversation; this tool is how you read it. " +
101
105
  "Without a runId, returns a paged list (running runs first, then each other run) with total and hasMore. " +
102
- "With a runId, returns the run, its steps, and an inspectionState: not_found; in_progress; suspended (the host suspended the run, it does not progress, and a new run of the plan can start); " +
106
+ "With a runId, returns the run, its steps, and an inspectionState: not_found; in_progress; paused (a step waits until the user resumes or stops the run, and pauses gives each cause); " +
103
107
  "or terminal (run.status completed, partial, failed, or canceled). " +
104
- "Output paths appear only on a suspended or terminal run: run.synthesisPath when synthesisStatus is produced, and the summaryPath of each step that ran. " +
108
+ "Output paths appear only on a terminal run: run.synthesisPath when synthesisStatus is produced, and the summaryPath of each step that ran. " +
105
109
  "For a user-directed check, waitForTerminalSeconds can wait once for 1-30 seconds; if the cutoff returns in_progress, stop polling for that turn. " +
106
110
  "A wait on the run that the caller itself runs inside returns at once with selfWaitPrevented. " +
107
111
  "Default response is lightweight — pass includeDiagnostics:true to add error/duration/retry telemetry.",
@@ -132,14 +136,17 @@ export function createInspectRunTool(pool, clock = systemClock) {
132
136
  return ok({
133
137
  inspectionState: "not_found",
134
138
  message: `Run ${input.runId} was not found in this analysis.`,
135
- ...(waitSeconds === undefined ? {} : { wait: { requestedSeconds: waitSeconds, cutoffReached: false } }),
139
+ wait: waitSeconds === undefined ? undefined : { requestedSeconds: waitSeconds, cutoffReached: false },
136
140
  });
137
141
  }
138
142
  const selfWait = waitSeconds !== undefined && ctx.session.runFrame?.runId === input.runId;
143
+ const runId = input.runId;
144
+ const pausesOf = async (status) => status === "running" ? unwrapOrThrow(await queryPausesOfWork(pool, resourceId, runId)) : [];
145
+ let pauses = await pausesOf(run.status);
139
146
  let cutoffReached = false;
140
- if (waitSeconds !== undefined && run.status === "running" && !selfWait) {
147
+ if (waitSeconds !== undefined && run.status === "running" && pauses.length === 0 && !selfWait) {
141
148
  const deadline = clock.now() + waitSeconds * 1_000;
142
- while (run.status === "running") {
149
+ while (run.status === "running" && pauses.length === 0) {
143
150
  const remaining = deadline - clock.now();
144
151
  if (remaining <= 0) {
145
152
  cutoffReached = true;
@@ -154,12 +161,24 @@ export function createInspectRunTool(pool, clock = systemClock) {
154
161
  wait: { requestedSeconds: waitSeconds, cutoffReached: false },
155
162
  });
156
163
  }
164
+ pauses = await pausesOf(run.status);
157
165
  }
158
166
  }
159
167
  const terminal = isTerminal(run.status);
160
168
  const stepRows = unwrapOrThrow(await queryStepsByRun(pool, input.runId));
161
169
  const steps = formatSteps(input.runId, stepRows, verbose, terminal);
162
170
  const wait = waitSeconds === undefined ? {} : { wait: { requestedSeconds: waitSeconds, cutoffReached } };
171
+ if (run.status === "running" && pauses.length > 0) {
172
+ return ok({
173
+ inspectionState: "paused",
174
+ message: "This run waits in a pause, and results are not ready. Tell the user the cause of each pause. " +
175
+ "The user can resume the run or stop it. A pause in the state retrying also sends its request again at retryAt.",
176
+ run: formatRun(run, verbose, false),
177
+ steps,
178
+ pauses: pauses.map((pause) => ({ state: pause.state, cause: pause.cause, attempt: pause.attempt, retryAt: pause.retryAt })),
179
+ ...wait,
180
+ });
181
+ }
163
182
  if (run.status === "running") {
164
183
  const message = selfWait
165
184
  ? "This run is still in progress. Results are not ready, and the enclosing workflow cannot finish while its current step waits for itself."
@@ -173,16 +192,7 @@ export function createInspectRunTool(pool, clock = systemClock) {
173
192
  steps,
174
193
  elapsedMs: Math.max(0, clock.now() - Date.parse(run.startedAt)),
175
194
  ...wait,
176
- ...(selfWait ? { selfWaitPrevented: true } : {}),
177
- });
178
- }
179
- if (run.status === "suspended_insufficient_funds") {
180
- return ok({
181
- inspectionState: "suspended",
182
- message: "The host suspended this run. The run does not progress. A new run of the plan can start.",
183
- run: formatRun(run, verbose, true),
184
- steps,
185
- ...wait,
195
+ selfWaitPrevented: selfWait ? true : undefined,
186
196
  });
187
197
  }
188
198
  return ok({