@inflexa-ai/harness 0.45.1 → 0.46.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (789) hide show
  1. package/README.md +6 -3
  2. package/dist/agents/conversation-agent.d.ts +9 -3
  3. package/dist/agents/conversation-agent.js +34 -33
  4. package/dist/agents/report-session-agent.d.ts +15 -15
  5. package/dist/agents/report-session-agent.js +23 -15
  6. package/dist/agents/sandbox/index.d.ts +1 -1
  7. package/dist/agents/sandbox/index.js +1 -1
  8. package/dist/agents/sandbox/shared.d.ts +12 -14
  9. package/dist/agents/sandbox/shared.js +18 -12
  10. package/dist/agents/sandbox/types.d.ts +4 -4
  11. package/dist/agents/sandbox/validate-skills.d.ts +2 -2
  12. package/dist/agents/sandbox/validate-skills.js +3 -1
  13. package/dist/agents/sandbox-catalog.d.ts +2 -2
  14. package/dist/agents/sandbox-catalog.js +3 -3
  15. package/dist/agents/system-prompt.d.ts +2 -2
  16. package/dist/app/chat-turn-workflow.d.ts +114 -0
  17. package/dist/app/chat-turn-workflow.js +307 -0
  18. package/dist/app/chat-turn.d.ts +85 -57
  19. package/dist/app/chat-turn.js +123 -100
  20. package/dist/app/data-profile-orientation.js +10 -8
  21. package/dist/app/data-profile-view.d.ts +4 -4
  22. package/dist/app/data-profile-view.js +9 -8
  23. package/dist/app/in-process-turn.d.ts +42 -0
  24. package/dist/app/in-process-turn.js +139 -0
  25. package/dist/app/message-assembly.d.ts +10 -4
  26. package/dist/app/message-assembly.js +13 -8
  27. package/dist/app/report-session-runtime.d.ts +4 -4
  28. package/dist/app/report-session-runtime.js +36 -21
  29. package/dist/app/spawn-report-session.d.ts +33 -28
  30. package/dist/app/spawn-report-session.js +25 -40
  31. package/dist/app/synthesize-run.d.ts +22 -16
  32. package/dist/app/synthesize-run.js +41 -35
  33. package/dist/app/work.d.ts +96 -0
  34. package/dist/app/work.js +147 -0
  35. package/dist/auth/local-auth-context.d.ts +1 -3
  36. package/dist/auth/local-auth-context.js +1 -3
  37. package/dist/auth/local-run-authorizer.d.ts +1 -1
  38. package/dist/auth/local-run-authorizer.js +5 -3
  39. package/dist/auth/types.d.ts +26 -26
  40. package/dist/billing/cached-resolver.d.ts +4 -4
  41. package/dist/billing/run-charge.d.ts +5 -8
  42. package/dist/billing/run-charge.js +2 -2
  43. package/dist/billing/usage-recorder.d.ts +9 -9
  44. package/dist/citations/aggregate.js +1 -1
  45. package/dist/citations/clients/arxiv.d.ts +2 -2
  46. package/dist/citations/clients/arxiv.js +12 -4
  47. package/dist/citations/clients/common.js +4 -2
  48. package/dist/citations/clients/crossref.d.ts +2 -2
  49. package/dist/citations/clients/crossref.js +37 -37
  50. package/dist/citations/clients/doi-registry.js +15 -16
  51. package/dist/citations/clients/pubmed.d.ts +2 -2
  52. package/dist/citations/clients/pubmed.js +20 -13
  53. package/dist/citations/clients/semantic-scholar.d.ts +2 -2
  54. package/dist/citations/clients/semantic-scholar.js +9 -9
  55. package/dist/citations/compare.js +2 -2
  56. package/dist/citations/match.d.ts +2 -2
  57. package/dist/citations/match.js +12 -7
  58. package/dist/citations/normalize.js +35 -26
  59. package/dist/citations/plan.js +6 -2
  60. package/dist/citations/resolve.d.ts +6 -6
  61. package/dist/citations/resolve.js +34 -25
  62. package/dist/citations/types.d.ts +77 -77
  63. package/dist/config/environment-stores.d.ts +6 -6
  64. package/dist/config/resource-limits.js +1 -3
  65. package/dist/contracts/analogy-report.d.ts +7 -7
  66. package/dist/contracts/analogy-report.js +2 -2
  67. package/dist/contracts/chat-events.d.ts +38 -24
  68. package/dist/contracts/chat-frame.d.ts +15 -5
  69. package/dist/contracts/chat-frame.js +64 -41
  70. package/dist/contracts/chat-parts.d.ts +130 -67
  71. package/dist/contracts/chat-parts.js +1 -0
  72. package/dist/contracts/content-url.js +16 -2
  73. package/dist/contracts/data-profile.d.ts +38 -38
  74. package/dist/contracts/index.d.ts +2 -2
  75. package/dist/contracts/index.js +1 -1
  76. package/dist/contracts/message.d.ts +6 -6
  77. package/dist/contracts/organ-system.d.ts +11 -11
  78. package/dist/contracts/part-registry.d.ts +5 -4
  79. package/dist/contracts/part-registry.js +5 -0
  80. package/dist/contracts/profile-vocabulary.d.ts +11 -10
  81. package/dist/contracts/profile-vocabulary.js +10 -3
  82. package/dist/contracts/report-blocks.d.ts +329 -329
  83. package/dist/contracts/report-reference.d.ts +105 -81
  84. package/dist/contracts/report-reference.js +30 -13
  85. package/dist/contracts/schemas/chat-events.d.ts +30 -16
  86. package/dist/contracts/schemas/chat-events.js +15 -6
  87. package/dist/contracts/schemas/chat-parts.d.ts +175 -102
  88. package/dist/contracts/schemas/chat-parts.js +33 -7
  89. package/dist/contracts/severity.d.ts +1 -1
  90. package/dist/contracts/structure-source.d.ts +3 -3
  91. package/dist/contracts/structure-source.js +6 -2
  92. package/dist/contracts/subagent-activity.d.ts +2 -2
  93. package/dist/contracts/subagent-activity.js +5 -3
  94. package/dist/contracts/usage.d.ts +2 -2
  95. package/dist/data/safety-panel-schema.d.ts +25 -25
  96. package/dist/data/safety-panel-schema.js +13 -4
  97. package/dist/execution/artifact-metadata.d.ts +23 -15
  98. package/dist/execution/artifact-metadata.js +33 -10
  99. package/dist/execution/artifact-record.d.ts +2 -2
  100. package/dist/execution/artifact-registration.d.ts +5 -5
  101. package/dist/execution/artifact-registry.d.ts +8 -8
  102. package/dist/execution/dbos-run-launcher.d.ts +24 -4
  103. package/dist/execution/dbos-run-launcher.js +58 -4
  104. package/dist/execution/dbos-workflow-purger.d.ts +5 -6
  105. package/dist/execution/dbos-workflow-purger.js +8 -7
  106. package/dist/execution/input-signature.d.ts +2 -2
  107. package/dist/execution/post-step-pipeline.d.ts +9 -9
  108. package/dist/execution/post-step-pipeline.js +1 -1
  109. package/dist/execution/post-step.js +2 -2
  110. package/dist/execution/reconcile-manifest.d.ts +4 -4
  111. package/dist/execution/reconcile-manifest.js +3 -2
  112. package/dist/execution/run-authorizer.d.ts +46 -37
  113. package/dist/execution/run-authorizer.js +8 -8
  114. package/dist/execution/run-canceler.d.ts +7 -7
  115. package/dist/execution/run-canceler.js +14 -7
  116. package/dist/execution/run-end-record.d.ts +2 -3
  117. package/dist/execution/run-event-parts.d.ts +0 -8
  118. package/dist/execution/run-event-parts.js +29 -24
  119. package/dist/execution/run-event-stream.d.ts +8 -8
  120. package/dist/execution/run-event-stream.js +3 -4
  121. package/dist/execution/run-launcher.d.ts +4 -4
  122. package/dist/execution/run-synthesis.d.ts +49 -48
  123. package/dist/execution/run-synthesis.js +96 -255
  124. package/dist/execution/staged-input.d.ts +2 -2
  125. package/dist/execution/step-summary.d.ts +6 -6
  126. package/dist/execution/step-summary.js +4 -8
  127. package/dist/execution/topo-sort.js +4 -3
  128. package/dist/execution/workflow-purger.d.ts +2 -2
  129. package/dist/index.d.ts +17 -20
  130. package/dist/index.js +25 -36
  131. package/dist/input-sanitization.js +9 -2
  132. package/dist/input-scan/clustering.d.ts +6 -6
  133. package/dist/input-scan/clustering.js +11 -5
  134. package/dist/input-scan/companions.js +3 -2
  135. package/dist/input-scan/detect-sets.d.ts +2 -2
  136. package/dist/input-scan/detect-sets.js +25 -21
  137. package/dist/input-scan/enrich.d.ts +6 -6
  138. package/dist/input-scan/enrich.js +29 -12
  139. package/dist/input-scan/formats.d.ts +2 -2
  140. package/dist/input-scan/formats.js +8 -2
  141. package/dist/input-scan/markers.d.ts +2 -2
  142. package/dist/input-scan/markers.js +14 -5
  143. package/dist/input-scan/menu.d.ts +10 -10
  144. package/dist/input-scan/menu.js +0 -0
  145. package/dist/input-scan/quarantine.d.ts +2 -2
  146. package/dist/input-scan/quarantine.js +23 -18
  147. package/dist/input-scan/readout-budget.d.ts +2 -2
  148. package/dist/input-scan/readout-budget.js +1 -1
  149. package/dist/input-scan/readout.d.ts +2 -2
  150. package/dist/input-scan/readout.js +47 -34
  151. package/dist/input-scan/scan.d.ts +2 -2
  152. package/dist/input-scan/scan.js +7 -5
  153. package/dist/input-scan/set-types.d.ts +28 -28
  154. package/dist/input-scan/shapes.d.ts +4 -4
  155. package/dist/input-scan/shapes.js +0 -0
  156. package/dist/input-scan/templates.d.ts +10 -10
  157. package/dist/input-scan/templates.js +30 -22
  158. package/dist/input-scan/tokens.d.ts +6 -4
  159. package/dist/input-scan/tokens.js +100 -38
  160. package/dist/input-scan/types.d.ts +22 -22
  161. package/dist/lib/async-utils.d.ts +3 -7
  162. package/dist/lib/async-utils.js +5 -9
  163. package/dist/lib/cache.js +1 -1
  164. package/dist/lib/chrome.d.ts +46 -6
  165. package/dist/lib/console-logger.js +2 -2
  166. package/dist/lib/db-result.d.ts +22 -6
  167. package/dist/lib/db-result.js +9 -13
  168. package/dist/lib/eyes.d.ts +4 -4
  169. package/dist/lib/eyes.js +1 -1
  170. package/dist/lib/fs-helpers.js +18 -6
  171. package/dist/lib/fs-result.d.ts +1 -0
  172. package/dist/lib/fs-result.js +5 -6
  173. package/dist/lib/hooks.d.ts +23 -7
  174. package/dist/lib/hooks.js +17 -3
  175. package/dist/lib/host-concurrency.js +3 -2
  176. package/dist/lib/logger.d.ts +2 -2
  177. package/dist/lib/logger.js +2 -1
  178. package/dist/lib/metrics.d.ts +1 -1
  179. package/dist/lib/null-proto.d.ts +6 -0
  180. package/dist/lib/null-proto.js +17 -0
  181. package/dist/lib/otel-spans.d.ts +1 -1
  182. package/dist/lib/otel-spans.js +9 -5
  183. package/dist/lib/otel.d.ts +4 -2
  184. package/dist/lib/otel.js +10 -2
  185. package/dist/lib/page-capture.d.ts +8 -8
  186. package/dist/lib/page-capture.js +9 -4
  187. package/dist/lib/parse-json.d.ts +5 -0
  188. package/dist/lib/parse-json.js +12 -0
  189. package/dist/lib/present.d.ts +12 -0
  190. package/dist/lib/present.js +39 -0
  191. package/dist/lib/rate-limit.d.ts +4 -4
  192. package/dist/lib/rate-limit.js +12 -13
  193. package/dist/lib/regulatory-corpus/fetch-fda-guidance.d.ts +4 -4
  194. package/dist/lib/regulatory-corpus/fetch-fda-guidance.js +4 -10
  195. package/dist/lib/regulatory-corpus/fetch-ich.d.ts +4 -4
  196. package/dist/lib/regulatory-corpus/fetch-ich.js +18 -14
  197. package/dist/lib/regulatory-corpus/normalize-whitespace.d.ts +6 -0
  198. package/dist/lib/regulatory-corpus/normalize-whitespace.js +41 -0
  199. package/dist/lib/regulatory-corpus.d.ts +10 -10
  200. package/dist/lib/regulatory-corpus.js +3 -1
  201. package/dist/lib/result.d.ts +10 -11
  202. package/dist/lib/result.js +15 -13
  203. package/dist/lib/storage.d.ts +2 -2
  204. package/dist/lib/test/async-iterable.d.ts +9 -0
  205. package/dist/lib/test/async-iterable.js +28 -0
  206. package/dist/lib/test/request-url.d.ts +5 -0
  207. package/dist/lib/test/request-url.js +7 -0
  208. package/dist/lib/test/result-assert.d.ts +12 -0
  209. package/dist/lib/test/result-assert.js +17 -0
  210. package/dist/lib/test/text-shapes.d.ts +24 -0
  211. package/dist/lib/test/text-shapes.js +63 -0
  212. package/dist/lib/text.d.ts +22 -0
  213. package/dist/lib/text.js +68 -0
  214. package/dist/lib/thrown.d.ts +18 -0
  215. package/dist/lib/thrown.js +30 -0
  216. package/dist/lib/unknown-array.d.ts +6 -0
  217. package/dist/lib/unknown-array.js +8 -0
  218. package/dist/lib/unknown-containers.d.ts +14 -0
  219. package/dist/lib/unknown-containers.js +17 -0
  220. package/dist/lib/unknown-text.d.ts +8 -0
  221. package/dist/lib/unknown-text.js +28 -0
  222. package/dist/lib/zod-issue-shape.d.ts +1 -1
  223. package/dist/lib/zod-issue-shape.js +31 -31
  224. package/dist/lib/zod-issues.d.ts +3 -3
  225. package/dist/lib/zod-issues.js +30 -17
  226. package/dist/literature/sources/arxiv.d.ts +6 -6
  227. package/dist/literature/sources/arxiv.js +92 -35
  228. package/dist/literature/sources/http.d.ts +2 -2
  229. package/dist/literature/sources/http.js +16 -15
  230. package/dist/literature/sources/pubmed.d.ts +16 -16
  231. package/dist/literature/sources/pubmed.js +96 -61
  232. package/dist/literature/sources/semantic-scholar.d.ts +8 -8
  233. package/dist/literature/sources/semantic-scholar.js +22 -13
  234. package/dist/loop/accounting.d.ts +63 -0
  235. package/dist/loop/accounting.js +141 -0
  236. package/dist/loop/call-policy.d.ts +73 -0
  237. package/dist/loop/call-policy.js +109 -0
  238. package/dist/loop/chat-stream.d.ts +62 -0
  239. package/dist/loop/chat-stream.js +237 -0
  240. package/dist/loop/compaction.d.ts +9 -9
  241. package/dist/loop/compaction.js +1 -1
  242. package/dist/loop/metrics.d.ts +12 -15
  243. package/dist/loop/metrics.js +14 -26
  244. package/dist/loop/run-loop.d.ts +233 -0
  245. package/dist/loop/run-loop.js +770 -0
  246. package/dist/loop/sub-agent.d.ts +61 -0
  247. package/dist/loop/sub-agent.js +161 -0
  248. package/dist/loop/tool-adapter.d.ts +98 -0
  249. package/dist/loop/tool-adapter.js +364 -0
  250. package/dist/loop/tool-detail.d.ts +1 -1
  251. package/dist/loop/tool-detail.js +6 -5
  252. package/dist/loop/tool-outcome.d.ts +1 -1
  253. package/dist/loop/tool-output.d.ts +4 -4
  254. package/dist/loop/tool-output.js +2 -2
  255. package/dist/loop/turn-credentials.d.ts +34 -0
  256. package/dist/loop/turn-credentials.js +73 -0
  257. package/dist/loop/types.d.ts +29 -38
  258. package/dist/loop/types.js +2 -7
  259. package/dist/memory/ai-sdk-message-storage.d.ts +5 -5
  260. package/dist/memory/ai-sdk-message-storage.js +13 -11
  261. package/dist/memory/card-builders.d.ts +14 -14
  262. package/dist/memory/card-builders.js +19 -15
  263. package/dist/memory/conversation-display-recorder.d.ts +22 -4
  264. package/dist/memory/conversation-display-recorder.js +43 -24
  265. package/dist/memory/conversation-display-replay.js +3 -2
  266. package/dist/memory/conversation-display-storage.d.ts +15 -7
  267. package/dist/memory/conversation-display-storage.js +141 -36
  268. package/dist/memory/conversation-view.d.ts +4 -4
  269. package/dist/memory/conversation-view.js +5 -4
  270. package/dist/memory/count-tokens.js +10 -8
  271. package/dist/memory/derive-thread-title.d.ts +0 -13
  272. package/dist/memory/derive-thread-title.js +2 -1
  273. package/dist/memory/message-backfill.d.ts +12 -5
  274. package/dist/memory/message-backfill.js +5 -3
  275. package/dist/memory/thread-history.d.ts +36 -21
  276. package/dist/memory/thread-history.js +78 -54
  277. package/dist/memory/thread-store.d.ts +26 -17
  278. package/dist/memory/thread-store.js +15 -9
  279. package/dist/memory/tool-call-integrity.d.ts +2 -2
  280. package/dist/memory/tool-call-integrity.js +4 -3
  281. package/dist/memory/working-memory.d.ts +16 -12
  282. package/dist/memory/working-memory.js +72 -61
  283. package/dist/prompts/briefing.d.ts +12 -12
  284. package/dist/prompts/briefing.js +1 -1
  285. package/dist/prompts/synthesis-agent.d.ts +1 -1
  286. package/dist/prompts/synthesis-agent.js +6 -14
  287. package/dist/provenance/collector.d.ts +6 -6
  288. package/dist/provenance/collector.js +15 -8
  289. package/dist/provenance/exec-frame.d.ts +2 -2
  290. package/dist/provenance/exec-frame.js +6 -1
  291. package/dist/provenance/seam.d.ts +1 -4
  292. package/dist/provenance/types.d.ts +6 -6
  293. package/dist/providers/ai-sdk.d.ts +113 -62
  294. package/dist/providers/ai-sdk.js +283 -518
  295. package/dist/providers/embedding.d.ts +2 -2
  296. package/dist/providers/embedding.js +1 -1
  297. package/dist/providers/errors.d.ts +22 -2
  298. package/dist/providers/errors.js +98 -50
  299. package/dist/providers/prompt-cache.d.ts +8 -8
  300. package/dist/providers/prompt-cache.js +13 -11
  301. package/dist/providers/reasoning.d.ts +2 -2
  302. package/dist/providers/reasoning.js +2 -2
  303. package/dist/providers/types.d.ts +55 -94
  304. package/dist/reference-data/catalog.d.ts +2 -15
  305. package/dist/reference-data/catalog.js +25 -8
  306. package/dist/reference-data/receipt.d.ts +2 -2
  307. package/dist/report-model/assert-rules.js +1 -1
  308. package/dist/report-model/authoring-grammar.d.ts +211 -233
  309. package/dist/report-model/block-walk.d.ts +10 -10
  310. package/dist/report-model/block-walk.js +2 -0
  311. package/dist/report-model/draft-finish.d.ts +8 -8
  312. package/dist/report-model/draft-finish.js +1 -1
  313. package/dist/report-model/draft-hash.js +8 -7
  314. package/dist/report-model/draft-operations.d.ts +22 -10
  315. package/dist/report-model/draft-operations.js +48 -30
  316. package/dist/report-model/draft-read.d.ts +19 -7
  317. package/dist/report-model/draft-read.js +16 -6
  318. package/dist/report-model/draft.d.ts +844 -2
  319. package/dist/report-model/draft.js +3 -1
  320. package/dist/report-model/fixture-resolver.js +39 -16
  321. package/dist/report-model/pin-snapshot.d.ts +2 -2
  322. package/dist/report-model/pin-snapshot.js +15 -15
  323. package/dist/report-model/production-resolver.d.ts +18 -18
  324. package/dist/report-model/production-resolver.js +50 -42
  325. package/dist/report-model/reference-resolver.d.ts +26 -10
  326. package/dist/report-model/reference-resolver.js +68 -5
  327. package/dist/report-model/reference-stamp.js +30 -38
  328. package/dist/report-model/structural-validation.js +12 -4
  329. package/dist/report-model/validate.d.ts +7 -7
  330. package/dist/report-model/validate.js +6 -6
  331. package/dist/report-render/assets.d.ts +2 -2
  332. package/dist/report-render/assets.js +27 -3
  333. package/dist/report-render/chart-export.d.ts +10 -2
  334. package/dist/report-render/chart-export.js +37 -11
  335. package/dist/report-render/chart-presets.d.ts +8 -8
  336. package/dist/report-render/chart-presets.js +3 -3
  337. package/dist/report-render/chart-renderers.d.ts +23 -16
  338. package/dist/report-render/chart-renderers.js +74 -53
  339. package/dist/report-render/chart-toolbox.d.ts +2 -2
  340. package/dist/report-render/chart-toolbox.js +7 -6
  341. package/dist/report-render/chart.d.ts +15 -16
  342. package/dist/report-render/chart.js +369 -252
  343. package/dist/report-render/design.d.ts +36 -297
  344. package/dist/report-render/design.js +0 -12
  345. package/dist/report-render/figures/common.d.ts +12 -12
  346. package/dist/report-render/figures/common.js +42 -31
  347. package/dist/report-render/figures/dendrogram.d.ts +3 -3
  348. package/dist/report-render/figures/dendrogram.js +10 -10
  349. package/dist/report-render/figures/dense.js +15 -8
  350. package/dist/report-render/figures/dotplot.js +46 -33
  351. package/dist/report-render/figures/embedding.js +52 -43
  352. package/dist/report-render/figures/equal-units.d.ts +10 -10
  353. package/dist/report-render/figures/equal-units.js +27 -27
  354. package/dist/report-render/figures/forest.js +9 -7
  355. package/dist/report-render/figures/gsea.js +21 -11
  356. package/dist/report-render/figures/heatmap.js +13 -9
  357. package/dist/report-render/figures/index.d.ts +10 -10
  358. package/dist/report-render/figures/index.js +4 -2
  359. package/dist/report-render/figures/km.js +10 -9
  360. package/dist/report-render/figures/label-room.d.ts +12 -12
  361. package/dist/report-render/figures/label-room.js +7 -2
  362. package/dist/report-render/figures/locuszoom.d.ts +2 -2
  363. package/dist/report-render/figures/locuszoom.js +59 -31
  364. package/dist/report-render/figures/lollipop.js +3 -2
  365. package/dist/report-render/figures/ma.js +8 -4
  366. package/dist/report-render/figures/manhattan.d.ts +1 -2
  367. package/dist/report-render/figures/manhattan.js +52 -34
  368. package/dist/report-render/figures/oncoprint.js +4 -5
  369. package/dist/report-render/figures/pca.js +25 -11
  370. package/dist/report-render/figures/qq.js +20 -9
  371. package/dist/report-render/figures/roc.js +1 -1
  372. package/dist/report-render/figures/sankey.d.ts +2 -2
  373. package/dist/report-render/figures/sankey.js +11 -10
  374. package/dist/report-render/figures/upset.d.ts +6 -6
  375. package/dist/report-render/figures/upset.js +7 -4
  376. package/dist/report-render/figures/volcano.js +12 -10
  377. package/dist/report-render/hybrid-svg.d.ts +4 -4
  378. package/dist/report-render/hybrid-svg.js +7 -5
  379. package/dist/report-render/number-format.d.ts +4 -4
  380. package/dist/report-render/number-format.js +62 -27
  381. package/dist/report-render/page.js +2 -1
  382. package/dist/report-render/provenance-data.d.ts +2 -2
  383. package/dist/report-render/references.d.ts +4 -4
  384. package/dist/report-render/render.d.ts +2 -2
  385. package/dist/report-render/render.js +10 -11
  386. package/dist/report-render/script-json.js +1 -1
  387. package/dist/report-render/table-data.d.ts +6 -6
  388. package/dist/report-render/test/options.d.ts +49 -0
  389. package/dist/report-render/test/options.js +143 -0
  390. package/dist/report-render/test/page-function.d.ts +19 -0
  391. package/dist/report-render/test/page-function.js +33 -0
  392. package/dist/report-render/types.d.ts +10 -10
  393. package/dist/report-render/value-bridge.d.ts +4 -4
  394. package/dist/report-render/value-bridge.js +27 -14
  395. package/dist/report-render/views/chart-view.d.ts +2 -2
  396. package/dist/report-render/views/chart-view.js +2 -2
  397. package/dist/report-render/views/lineage.d.ts +6 -6
  398. package/dist/report-render/views/lineage.js +2 -0
  399. package/dist/report-render/views/page-view.d.ts +2 -2
  400. package/dist/report-render/views/page-view.js +1 -0
  401. package/dist/report-render/views/prose.js +25 -8
  402. package/dist/report-render/views/references-view.js +12 -1
  403. package/dist/report-render/views/values.js +1 -1
  404. package/dist/runtime/assemble.d.ts +53 -26
  405. package/dist/runtime/assemble.js +103 -56
  406. package/dist/runtime/boot.d.ts +8 -7
  407. package/dist/runtime/boot.js +1 -1
  408. package/dist/runtime/connection-budget.d.ts +6 -6
  409. package/dist/runtime/connection-budget.js +1 -1
  410. package/dist/runtime/dbos.d.ts +29 -19
  411. package/dist/runtime/dbos.js +35 -20
  412. package/dist/runtime/result-serialization.js +18 -5
  413. package/dist/runtime/shutdown.d.ts +2 -2
  414. package/dist/sandbox/client.d.ts +7 -3
  415. package/dist/sandbox/cpu-files.d.ts +2 -2
  416. package/dist/sandbox/cpu-files.js +21 -4
  417. package/dist/sandbox/create-sandbox.d.ts +7 -8
  418. package/dist/sandbox/create-sandbox.js +6 -12
  419. package/dist/sandbox/docker-client.d.ts +48 -3
  420. package/dist/sandbox/docker-client.js +10 -6
  421. package/dist/sandbox/estimate-data-profile-resources.js +2 -7
  422. package/dist/sandbox/exec-outcome.d.ts +2 -2
  423. package/dist/sandbox/exec-outcome.js +1 -1
  424. package/dist/sandbox/exec.d.ts +10 -6
  425. package/dist/sandbox/exec.js +27 -12
  426. package/dist/sandbox/execution-id.js +14 -6
  427. package/dist/sandbox/farm.d.ts +2 -2
  428. package/dist/sandbox/farm.js +22 -27
  429. package/dist/sandbox/identity.d.ts +7 -0
  430. package/dist/sandbox/identity.js +14 -3
  431. package/dist/sandbox/image-packages.js +15 -27
  432. package/dist/sandbox/k8s-client.d.ts +35 -8
  433. package/dist/sandbox/k8s-client.js +6 -5
  434. package/dist/sandbox/labels.js +1 -0
  435. package/dist/sandbox/liveness.js +3 -1
  436. package/dist/sandbox/mount-plan.d.ts +10 -10
  437. package/dist/sandbox/mount-plan.js +13 -14
  438. package/dist/sandbox/notification-sweep.d.ts +4 -4
  439. package/dist/sandbox/notification-sweep.js +4 -7
  440. package/dist/sandbox/package-identity.d.ts +6 -13
  441. package/dist/sandbox/package-identity.js +46 -28
  442. package/dist/sandbox/reaper.d.ts +10 -10
  443. package/dist/sandbox/reaper.js +4 -6
  444. package/dist/sandbox/sandbox-error.d.ts +2 -9
  445. package/dist/sandbox/sandbox-error.js +21 -8
  446. package/dist/sandbox/sandbox-step-translate.d.ts +8 -5
  447. package/dist/sandbox/sandbox-step-translate.js +22 -8
  448. package/dist/sandbox/step-sandbox.d.ts +47 -0
  449. package/dist/sandbox/step-sandbox.js +53 -0
  450. package/dist/sandbox/types.d.ts +18 -19
  451. package/dist/sandbox/types.js +1 -1
  452. package/dist/schemas/artifact-manifest.d.ts +4 -4
  453. package/dist/schemas/data-profile-schemas.d.ts +343 -298
  454. package/dist/schemas/file-metadata.js +2 -4
  455. package/dist/schemas/plan-schemas.d.ts +31 -31
  456. package/dist/schemas/run-synthesis.d.ts +95 -26
  457. package/dist/schemas/run-synthesis.js +3 -1
  458. package/dist/schemas/validate-plan.d.ts +4 -4
  459. package/dist/schemas/validate-plan.js +17 -5
  460. package/dist/schemas/workflow-state.d.ts +19 -19
  461. package/dist/schemas/workflow-state.js +2 -2
  462. package/dist/state/active-turns.d.ts +36 -0
  463. package/dist/state/active-turns.js +67 -0
  464. package/dist/state/analyses-metrics.d.ts +8 -8
  465. package/dist/state/analyses-metrics.js +4 -4
  466. package/dist/state/analyses.d.ts +0 -14
  467. package/dist/state/analyses.js +0 -32
  468. package/dist/state/artifacts.d.ts +32 -19
  469. package/dist/state/artifacts.js +28 -5
  470. package/dist/state/data-profile.d.ts +2 -2
  471. package/dist/state/db.d.ts +12 -2
  472. package/dist/state/db.js +5 -0
  473. package/dist/state/edit-intents.d.ts +4 -0
  474. package/dist/state/edit-intents.js +71 -0
  475. package/dist/state/index.d.ts +4 -4
  476. package/dist/state/index.js +2 -2
  477. package/dist/state/init.d.ts +2 -1
  478. package/dist/state/init.js +5 -2
  479. package/dist/state/migrations/20260927120000_baseline.js +3 -1
  480. package/dist/state/migrations/20261026120000_add_the_edit_intents.d.ts +7 -0
  481. package/dist/state/migrations/20261026120000_add_the_edit_intents.js +21 -0
  482. package/dist/state/migrations/20261027120000_record_the_applied_memory_edits.d.ts +7 -0
  483. package/dist/state/migrations/20261027120000_record_the_applied_memory_edits.js +16 -0
  484. package/dist/state/migrations/20261027120100_store_the_authoring_results.d.ts +8 -0
  485. package/dist/state/migrations/20261027120100_store_the_authoring_results.js +20 -0
  486. package/dist/state/migrations/20261027120200_key_the_groups_of_a_turn.d.ts +7 -0
  487. package/dist/state/migrations/20261027120200_key_the_groups_of_a_turn.js +12 -0
  488. package/dist/state/migrations/20261027120300_mark_the_active_turn_of_a_thread.d.ts +7 -0
  489. package/dist/state/migrations/20261027120300_mark_the_active_turn_of_a_thread.js +11 -0
  490. package/dist/state/migrations/20261028120000_record_the_paused_work.d.ts +7 -0
  491. package/dist/state/migrations/20261028120000_record_the_paused_work.js +25 -0
  492. package/dist/state/migrations/20261028120100_end_the_suspended_runs.d.ts +8 -0
  493. package/dist/state/migrations/20261028120100_end_the_suspended_runs.js +13 -0
  494. package/dist/state/migrations/20261029120000_reference_the_run_mandate.d.ts +7 -0
  495. package/dist/state/migrations/20261029120000_reference_the_run_mandate.js +23 -0
  496. package/dist/state/migrations/20261029120100_record_the_run_session_of_a_pause.d.ts +7 -0
  497. package/dist/state/migrations/20261029120100_record_the_run_session_of_a_pause.js +11 -0
  498. package/dist/state/migrations/index.js +18 -0
  499. package/dist/state/paused-work.d.ts +52 -0
  500. package/dist/state/paused-work.js +105 -0
  501. package/dist/state/plans.d.ts +27 -8
  502. package/dist/state/plans.js +14 -11
  503. package/dist/state/purge-analysis.d.ts +6 -6
  504. package/dist/state/purge-analysis.js +10 -2
  505. package/dist/state/report-session-state.d.ts +43 -18
  506. package/dist/state/report-session-state.js +43 -4
  507. package/dist/state/report-versions.d.ts +16 -11
  508. package/dist/state/report-versions.js +5 -3
  509. package/dist/state/runs.d.ts +30 -19
  510. package/dist/state/runs.js +43 -51
  511. package/dist/state/schema.d.ts +18 -21
  512. package/dist/state/schema.js +4 -5
  513. package/dist/state/snapshot-parse.d.ts +2 -2
  514. package/dist/state/snapshot-parse.js +14 -8
  515. package/dist/state/step-executions.d.ts +20 -8
  516. package/dist/state/step-executions.js +6 -4
  517. package/dist/state/tool-outputs.d.ts +2 -2
  518. package/dist/state/tool-outputs.js +2 -1
  519. package/dist/state/vector-store.d.ts +16 -16
  520. package/dist/state/vector-store.js +11 -7
  521. package/dist/tasks/data-profile-absorb.d.ts +3 -3
  522. package/dist/tasks/data-profile-absorb.js +21 -16
  523. package/dist/tasks/data-profile-activity.d.ts +5 -5
  524. package/dist/tasks/data-profile-activity.js +5 -5
  525. package/dist/tasks/data-profile-index.d.ts +4 -4
  526. package/dist/tasks/data-profile-index.js +32 -17
  527. package/dist/tasks/data-profile-resolve.d.ts +8 -8
  528. package/dist/tasks/data-profile-resolve.js +88 -62
  529. package/dist/tasks/data-profile.d.ts +40 -31
  530. package/dist/tasks/data-profile.js +138 -95
  531. package/dist/tasks/extract-values.d.ts +26 -79
  532. package/dist/tasks/extract-values.js +48 -108
  533. package/dist/tasks/refresh-regulatory-corpus.d.ts +4 -20
  534. package/dist/tasks/refresh-regulatory-corpus.js +12 -8
  535. package/dist/tasks/regulatory-corpus-boot-refresh.d.ts +2 -2
  536. package/dist/tasks/regulatory-corpus-boot-refresh.js +12 -10
  537. package/dist/testing.d.ts +60 -0
  538. package/dist/testing.js +96 -0
  539. package/dist/tools/ad-hoc-router.d.ts +9 -9
  540. package/dist/tools/ad-hoc-router.js +65 -52
  541. package/dist/tools/analysis-invocation.d.ts +7 -0
  542. package/dist/tools/analysis-invocation.js +29 -5
  543. package/dist/tools/approval/contract.d.ts +8 -52
  544. package/dist/tools/approval/contract.js +7 -36
  545. package/dist/tools/approval/gateway.d.ts +27 -28
  546. package/dist/tools/approval/gateway.js +33 -130
  547. package/dist/tools/approval/queries.d.ts +6 -11
  548. package/dist/tools/approval/queries.js +43 -29
  549. package/dist/tools/approval/uuidv7.js +2 -2
  550. package/dist/tools/bio/chembl.d.ts +3 -3
  551. package/dist/tools/bio/chembl.js +10 -0
  552. package/dist/tools/bio/comptox.d.ts +25 -8
  553. package/dist/tools/bio/comptox.js +4 -2
  554. package/dist/tools/bio/drug-gene-interactions.d.ts +27 -17
  555. package/dist/tools/bio/drug-gene-interactions.js +11 -8
  556. package/dist/tools/bio/gene-disease-evidence.d.ts +61 -15
  557. package/dist/tools/bio/gene-disease-evidence.js +10 -6
  558. package/dist/tools/bio/gene-preclinical-profile.d.ts +11 -11
  559. package/dist/tools/bio/keys.d.ts +2 -2
  560. package/dist/tools/bio/keys.js +3 -3
  561. package/dist/tools/bio/lookup-annotation.d.ts +5 -5
  562. package/dist/tools/bio/lookup-annotation.js +3 -0
  563. package/dist/tools/bio/opentargets.d.ts +1 -1
  564. package/dist/tools/bio/opentargets.js +6 -0
  565. package/dist/tools/bio/pubchem.d.ts +2 -2
  566. package/dist/tools/bio/pubchem.js +6 -0
  567. package/dist/tools/bio/pubmed.d.ts +26 -16
  568. package/dist/tools/bio/pubmed.js +9 -3
  569. package/dist/tools/bio/search-clinical-trials.d.ts +4 -4
  570. package/dist/tools/bio/search-clinical-trials.js +5 -1
  571. package/dist/tools/bio/search-faers.d.ts +2 -2
  572. package/dist/tools/bio/search-faers.js +1 -1
  573. package/dist/tools/bio/search-gene.d.ts +2 -2
  574. package/dist/tools/bio/search-gene.js +1 -0
  575. package/dist/tools/bio/search-geo-datasets.d.ts +4 -4
  576. package/dist/tools/bio/search-geo-datasets.js +5 -5
  577. package/dist/tools/bio/search-interactions.d.ts +1 -1
  578. package/dist/tools/bio/search-patents.d.ts +28 -22
  579. package/dist/tools/bio/search-patents.js +20 -17
  580. package/dist/tools/bio/search-protein.d.ts +2 -2
  581. package/dist/tools/bio/search-protein.js +1 -1
  582. package/dist/tools/bio/search-regulatory-approvals.d.ts +64 -18
  583. package/dist/tools/bio/search-regulatory-approvals.js +21 -16
  584. package/dist/tools/bio/target-safety.d.ts +8 -8
  585. package/dist/tools/bio/target-safety.js +11 -6
  586. package/dist/tools/capability-data.d.ts +9 -5
  587. package/dist/tools/capability-data.js +2 -1
  588. package/dist/tools/define-tool.d.ts +55 -46
  589. package/dist/tools/define-tool.js +39 -27
  590. package/dist/tools/display/normalize-echart-spec.d.ts +2 -2
  591. package/dist/tools/display/normalize-echart-spec.js +51 -27
  592. package/dist/tools/display/show-user.d.ts +2 -2
  593. package/dist/tools/display/show-user.js +1 -1
  594. package/dist/tools/execute-analysis.d.ts +19 -10
  595. package/dist/tools/execute-analysis.js +83 -62
  596. package/dist/tools/knowledge/check.d.ts +166 -44
  597. package/dist/tools/knowledge/check.js +5 -3
  598. package/dist/tools/knowledge/client.d.ts +31 -62
  599. package/dist/tools/knowledge/client.js +44 -27
  600. package/dist/tools/knowledge/environment.d.ts +6 -6
  601. package/dist/tools/knowledge/environment.js +18 -7
  602. package/dist/tools/knowledge/index.d.ts +2 -2
  603. package/dist/tools/knowledge/index.js +9 -9
  604. package/dist/tools/knowledge/local-slots.d.ts +4 -4
  605. package/dist/tools/knowledge/local-slots.js +11 -4
  606. package/dist/tools/knowledge/pin.d.ts +2 -2
  607. package/dist/tools/knowledge/recommend.d.ts +20 -45
  608. package/dist/tools/knowledge/recommend.js +27 -19
  609. package/dist/tools/knowledge/situation.d.ts +40 -40
  610. package/dist/tools/knowledge/situation.js +2 -9
  611. package/dist/tools/knowledge/skeleton.d.ts +4 -4
  612. package/dist/tools/knowledge/skeleton.js +10 -11
  613. package/dist/tools/knowledge/template.d.ts +20 -18
  614. package/dist/tools/knowledge/template.js +38 -32
  615. package/dist/tools/lib/alphafold-client.js +2 -1
  616. package/dist/tools/lib/amass-client.d.ts +28 -28
  617. package/dist/tools/lib/amass-client.js +20 -10
  618. package/dist/tools/lib/api-utils.d.ts +13 -3
  619. package/dist/tools/lib/api-utils.js +17 -3
  620. package/dist/tools/lib/bgee-client.d.ts +6 -6
  621. package/dist/tools/lib/bgee-client.js +16 -10
  622. package/dist/tools/lib/cbioportal-client.d.ts +4 -4
  623. package/dist/tools/lib/cbioportal-client.js +9 -8
  624. package/dist/tools/lib/chembl-client.d.ts +14 -14
  625. package/dist/tools/lib/chembl-client.js +11 -4
  626. package/dist/tools/lib/clinical-benchmarks-client.d.ts +4 -4
  627. package/dist/tools/lib/clinical-benchmarks-client.js +4 -7
  628. package/dist/tools/lib/clinical-trials-client.d.ts +18 -18
  629. package/dist/tools/lib/clinical-trials-client.js +10 -10
  630. package/dist/tools/lib/clinvar-client.d.ts +2 -2
  631. package/dist/tools/lib/clinvar-client.js +6 -6
  632. package/dist/tools/lib/ctx-ops.d.ts +23 -23
  633. package/dist/tools/lib/ctx-ops.js +13 -10
  634. package/dist/tools/lib/dgidb-client.d.ts +6 -6
  635. package/dist/tools/lib/dgidb-client.js +10 -12
  636. package/dist/tools/lib/disgenet-client.d.ts +4 -4
  637. package/dist/tools/lib/ema-client.d.ts +2 -2
  638. package/dist/tools/lib/ensembl-client.d.ts +4 -4
  639. package/dist/tools/lib/ensembl-client.js +5 -4
  640. package/dist/tools/lib/gwas-catalog-client.d.ts +4 -4
  641. package/dist/tools/lib/gwas-catalog-client.js +17 -17
  642. package/dist/tools/lib/html-text.d.ts +6 -0
  643. package/dist/tools/lib/html-text.js +9 -0
  644. package/dist/tools/lib/identifier-resolver.d.ts +4 -4
  645. package/dist/tools/lib/identifier-resolver.js +7 -3
  646. package/dist/tools/lib/impc-client.d.ts +8 -8
  647. package/dist/tools/lib/impc-client.js +46 -35
  648. package/dist/tools/lib/iuphar-client.d.ts +2 -2
  649. package/dist/tools/lib/iuphar-client.js +7 -16
  650. package/dist/tools/lib/monarch-client.d.ts +4 -4
  651. package/dist/tools/lib/openfda-client.d.ts +22 -22
  652. package/dist/tools/lib/openfda-client.js +23 -22
  653. package/dist/tools/lib/opentargets-client.d.ts +12 -12
  654. package/dist/tools/lib/pathway-client.d.ts +4 -4
  655. package/dist/tools/lib/pathway-client.js +15 -19
  656. package/dist/tools/lib/pharmgkb-client.d.ts +2 -2
  657. package/dist/tools/lib/pharmgkb-client.js +1 -1
  658. package/dist/tools/lib/protein-family-modality.d.ts +2 -2
  659. package/dist/tools/lib/protein-family-modality.js +0 -2
  660. package/dist/tools/lib/protein-family-normalize.js +7 -0
  661. package/dist/tools/lib/pubchem-client.d.ts +2 -2
  662. package/dist/tools/lib/pubchem-client.js +1 -0
  663. package/dist/tools/lib/pubchem-ops.d.ts +4 -4
  664. package/dist/tools/lib/pubchem-ops.js +8 -0
  665. package/dist/tools/lib/pubmed-client.d.ts +9 -9
  666. package/dist/tools/lib/pubmed-client.js +1 -1
  667. package/dist/tools/lib/string-client.d.ts +6 -6
  668. package/dist/tools/lib/uniprot-client.d.ts +8 -8
  669. package/dist/tools/lib/uniprot-client.js +5 -1
  670. package/dist/tools/memory/update-working-memory.d.ts +16 -13
  671. package/dist/tools/memory/update-working-memory.js +21 -3
  672. package/dist/tools/read-tool-output.js +8 -2
  673. package/dist/tools/registry.d.ts +2 -2
  674. package/dist/tools/report-authoring/authoring-tools.d.ts +54 -23
  675. package/dist/tools/report-authoring/authoring-tools.js +128 -62
  676. package/dist/tools/report-session/derive-table.d.ts +19 -59
  677. package/dist/tools/report-session/derive-table.js +120 -122
  678. package/dist/tools/report-session/examine-page.d.ts +6 -6
  679. package/dist/tools/report-session/examine-page.js +14 -12
  680. package/dist/tools/report-session/list-artifacts.d.ts +6 -6
  681. package/dist/tools/report-session/list-artifacts.js +5 -5
  682. package/dist/tools/report-session/page-faults.d.ts +6 -6
  683. package/dist/tools/report-session/page-faults.js +3 -1
  684. package/dist/tools/report-session/preview-report.d.ts +4 -3
  685. package/dist/tools/report-session/preview-report.js +26 -7
  686. package/dist/tools/report-session/record-version.d.ts +9 -4
  687. package/dist/tools/report-session/record-version.js +16 -9
  688. package/dist/tools/report-session/session-page-publisher.d.ts +6 -6
  689. package/dist/tools/research/generate-analogy-report.d.ts +14 -7
  690. package/dist/tools/research/generate-analogy-report.js +80 -76
  691. package/dist/tools/research/generate-plan.d.ts +16 -16
  692. package/dist/tools/research/generate-plan.js +410 -374
  693. package/dist/tools/research/guarded-address.js +3 -2
  694. package/dist/tools/research/inspect-data-profile.d.ts +27 -20
  695. package/dist/tools/research/inspect-data-profile.js +26 -25
  696. package/dist/tools/research/inspect-run.d.ts +54 -27
  697. package/dist/tools/research/inspect-run.js +50 -40
  698. package/dist/tools/research/literature-reviewer.d.ts +8 -7
  699. package/dist/tools/research/literature-reviewer.js +29 -28
  700. package/dist/tools/research/search-arxiv.d.ts +1 -1
  701. package/dist/tools/research/search-arxiv.js +1 -1
  702. package/dist/tools/research/search-github-repos.d.ts +10 -7
  703. package/dist/tools/research/search-github-repos.js +25 -22
  704. package/dist/tools/research/search-semantic-scholar.js +1 -1
  705. package/dist/tools/research/searxng-engine.d.ts +2 -2
  706. package/dist/tools/research/searxng-engine.js +6 -4
  707. package/dist/tools/research/web-fetch.d.ts +24 -21
  708. package/dist/tools/research/web-fetch.js +65 -74
  709. package/dist/tools/research/web-search.d.ts +26 -17
  710. package/dist/tools/research/web-search.js +26 -21
  711. package/dist/tools/sandbox/link-packages.d.ts +11 -7
  712. package/dist/tools/sandbox/link-packages.js +11 -8
  713. package/dist/tools/sandbox/list-available-packages.d.ts +17 -8
  714. package/dist/tools/sandbox/list-available-packages.js +31 -25
  715. package/dist/tools/sandbox/list-available-refs.d.ts +17 -14
  716. package/dist/tools/sandbox/list-available-refs.js +61 -36
  717. package/dist/tools/sandbox/report-blocker.d.ts +30 -37
  718. package/dist/tools/sandbox/report-blocker.js +23 -73
  719. package/dist/tools/sandbox/skills.d.ts +16 -12
  720. package/dist/tools/sandbox/skills.js +16 -12
  721. package/dist/tools/sandbox/submit-file-metadata.d.ts +12 -9
  722. package/dist/tools/sandbox/submit-file-metadata.js +18 -21
  723. package/dist/tools/start-report-session.d.ts +13 -5
  724. package/dist/tools/start-report-session.js +35 -8
  725. package/dist/tools/terminal-text.d.ts +5 -2
  726. package/dist/tools/terminal-text.js +35 -3
  727. package/dist/tools/workspace/decision-record.d.ts +4 -4
  728. package/dist/tools/workspace/decision-record.js +23 -13
  729. package/dist/tools/workspace/edit-file.d.ts +59 -20
  730. package/dist/tools/workspace/edit-file.js +81 -16
  731. package/dist/tools/workspace/execute-command.d.ts +15 -13
  732. package/dist/tools/workspace/execute-command.js +11 -9
  733. package/dist/tools/workspace/file-stat.d.ts +6 -3
  734. package/dist/tools/workspace/grep.d.ts +10 -7
  735. package/dist/tools/workspace/grep.js +9 -3
  736. package/dist/tools/workspace/list-files.d.ts +6 -3
  737. package/dist/tools/workspace/mutator.d.ts +28 -15
  738. package/dist/tools/workspace/mutator.js +107 -53
  739. package/dist/tools/workspace/read-file.d.ts +8 -5
  740. package/dist/tools/workspace/result-bounds.d.ts +5 -5
  741. package/dist/tools/workspace/result-bounds.js +4 -2
  742. package/dist/tools/workspace/run-exec.d.ts +2 -2
  743. package/dist/tools/workspace/run-exec.js +3 -3
  744. package/dist/tools/workspace/scan-inputs.d.ts +8 -5
  745. package/dist/tools/workspace/scan-inputs.js +17 -5
  746. package/dist/tools/workspace/show-file.d.ts +1 -1
  747. package/dist/tools/workspace/show-file.js +2 -1
  748. package/dist/tools/workspace/show-plan.d.ts +8 -5
  749. package/dist/tools/workspace/show-plan.js +9 -8
  750. package/dist/tools/workspace/workspace-search.d.ts +41 -13
  751. package/dist/tools/workspace/workspace-search.js +27 -14
  752. package/dist/tools/workspace/write-file.d.ts +9 -7
  753. package/dist/workflows/execute-analysis-scheduler.d.ts +9 -9
  754. package/dist/workflows/execute-analysis-scheduler.js +6 -3
  755. package/dist/workflows/execute-analysis.d.ts +46 -62
  756. package/dist/workflows/execute-analysis.js +137 -219
  757. package/dist/workflows/pause.d.ts +71 -0
  758. package/dist/workflows/pause.js +173 -0
  759. package/dist/workflows/sandbox-step.d.ts +38 -61
  760. package/dist/workflows/sandbox-step.js +99 -106
  761. package/dist/workflows/test/sql-writes.d.ts +21 -0
  762. package/dist/workflows/test/sql-writes.js +36 -0
  763. package/dist/workspace/filesystem.d.ts +6 -6
  764. package/dist/workspace/filesystem.js +10 -8
  765. package/dist/workspace/paths.d.ts +1 -1
  766. package/dist/workspace/paths.js +15 -4
  767. package/dist/workspace/search-config.d.ts +2 -2
  768. package/dist/workspace/search-config.js +1 -1
  769. package/package.json +21 -22
  770. package/dist/loop/call-guard.d.ts +0 -50
  771. package/dist/loop/call-guard.js +0 -90
  772. package/dist/loop/continue-agent.d.ts +0 -40
  773. package/dist/loop/continue-agent.js +0 -38
  774. package/dist/loop/genai-spans.d.ts +0 -47
  775. package/dist/loop/genai-spans.js +0 -134
  776. package/dist/loop/run-agent.d.ts +0 -245
  777. package/dist/loop/run-agent.js +0 -1124
  778. package/dist/loop/run-step.d.ts +0 -29
  779. package/dist/loop/run-step.js +0 -34
  780. package/dist/loop/run-to-terminal.d.ts +0 -66
  781. package/dist/loop/run-to-terminal.js +0 -93
  782. package/dist/loop/tool-mask.d.ts +0 -23
  783. package/dist/loop/tool-mask.js +0 -46
  784. package/dist/providers/streaming-chat.d.ts +0 -32
  785. package/dist/providers/streaming-chat.js +0 -91
  786. package/dist/tasks/derive-table-exec.d.ts +0 -54
  787. package/dist/tasks/derive-table-exec.js +0 -86
  788. package/dist/workflows/suspension.d.ts +0 -32
  789. package/dist/workflows/suspension.js +0 -38
@@ -5,10 +5,12 @@
5
5
  * table that a block can bind: a join, a pivot, or an aggregate. The agent writes the script, and the record
6
6
  * chains the derived table back to the evidence that made it.
7
7
  *
8
- * A session derivation is not an analysis run. It mints no run id, it registers no artifact, and it writes
8
+ * A session derivation is not an analysis run. It mints no run id, no mandate, and no artifact, and it writes
9
9
  * under the session directory alone. The rails are the rails of the value tier (`tasks/extract-values.ts`):
10
- * the injected exec runner, the identity mint, and the authorizer on every terminal path. The container is
11
- * ephemeral, and it goes away with the work.
10
+ * one ephemeral container inside the step of the call (`sandbox/step-sandbox.ts`), which goes away with the
11
+ * work. The container stays until the record lands, thus a rerun of the step before the record adopts the
12
+ * container and the exec record of the first attempt, and the script does not run again. A rerun after the
13
+ * record finds the record of its call, and it gives that table back.
12
14
  *
13
15
  * The container mounts the analysis tree read-only, and one write mount covers the `derived/` directory of
14
16
  * the session alone. The script writes its table into that mount directly, thus a large table makes no
@@ -25,24 +27,19 @@
25
27
  * The tool refuses an output name that the membership already holds. A record is immutable, and a second
26
28
  * derivation of one table takes a new name.
27
29
  *
28
- * A composition with no sandbox client and no run authorizer cannot derive at all. The tool reports that
29
- * condition one time, up front, the same discipline as the eyes. A per-attempt failure would instead read as
30
- * a transient fault, and it would invite a repeat of a call that can never pass.
31
- *
32
- * The container runs behind a seam, and never in the turn. An exec is a durable step of a workflow, and a
33
- * report turn is not a workflow. Thus the tool takes an injected runner, and a registered workflow owns the
34
- * container. The tool holds no sandbox client, and it imports no DBOS.
30
+ * A composition with no sandbox client cannot derive at all. The tool reports that condition one time, up
31
+ * front, the same discipline as the eyes. A per-attempt failure would instead read as a transient fault, and
32
+ * it would invite a repeat of a call that can never pass.
35
33
  */
36
34
  import { ok } from "neverthrow";
37
- import { unlink } from "node:fs/promises";
38
35
  import { join } from "node:path";
39
36
  import { z } from "zod";
40
37
  import { createNoopLogger } from "../../lib/console-logger.js";
41
- import { deliverNotice, passGate } from "../../lib/hooks.js";
42
38
  import { classifyWithinRoot, computeSha256, computeSha256File } from "../../lib/fs-helpers.js";
43
39
  import { defaultErrorFields } from "../../lib/logger.js";
44
40
  import { snapshotEntry } from "../../report-model/reference-resolver.js";
45
- import { generateExecutionId } from "../../sandbox/execution-id.js";
41
+ import { isWorkflowCancellation } from "../../runtime/dbos.js";
42
+ import { passSpawnSession, withStepSandbox } from "../../sandbox/step-sandbox.js";
46
43
  import { isSafeId, reportSessionDerivedDir, toSandboxPath } from "../../workspace/paths.js";
47
44
  import { defineTool } from "../define-tool.js";
48
45
  import { openReportThread } from "../report-authoring/authoring-tools.js";
@@ -55,17 +52,17 @@ const deriveTableInput = z.object({
55
52
  output: z.string().min(1),
56
53
  });
57
54
  /** The synthetic run id and step id of one derivation. Both are constants, and neither names a run row. */
58
- export const DERIVE_RUN_LITERAL = "derive-table";
59
- export const DERIVE_STEP_LITERAL = "derive";
55
+ const DERIVE_RUN_LITERAL = "derive-table";
56
+ const DERIVE_STEP_LITERAL = "derive";
60
57
  /** The provenance agent id. No agent loop runs in the container, thus this names the derivation pass. */
61
58
  const DERIVE_AGENT_ID = "table-deriver";
62
59
  /** The exec budget of one derivation. It matches the budget of the value tier. */
63
- export const DERIVATION_DEADLINE_MS = 300_000;
60
+ const DERIVATION_DEADLINE_MS = 300_000;
64
61
  /**
65
62
  * The container size of one derivation. A join or a pivot loads each declared input into pandas at one
66
63
  * time, thus the container needs the headroom of the value tier.
67
64
  */
68
- export const DERIVATION_RESOURCES = { cpu: 2, memoryGb: 8 };
65
+ const DERIVATION_RESOURCES = { cpu: 2, memoryGb: 8 };
69
66
  /** The cap of the script, in bytes. A reshaping script sits far under it, and the command line carries it. */
70
67
  const SCRIPT_CAP_BYTES = 64 * 1024;
71
68
  /** The cap of the declared inputs. One derivation reads the evidence of a few artifacts, and never a tree. */
@@ -74,12 +71,23 @@ const INPUT_CAP = 20;
74
71
  export const DERIVE_INPUT_ENV = "DERIVE_INPUTS";
75
72
  /** The environment variable that carries the container path of the output file into the container. */
76
73
  export const DERIVE_OUTPUT_ENV = "DERIVE_OUTPUT";
74
+ /**
75
+ * The shell of the exec: clear the output path, then run the script. The script rides as the first
76
+ * positional argument, thus `python3 -c` gets it byte for byte.
77
+ *
78
+ * The clearance belongs to the exec, and not to the host. A failed derivation can leave a file at the name
79
+ * that this one declares, and a script that writes nothing must not adopt those bytes as its table.
80
+ * sandbox-server runs one exec id one time, thus a rerun that attaches to the exec of an earlier attempt
81
+ * keeps the table of that exec. A clearance on the host would remove it.
82
+ */
83
+ const CLEAR_THEN_RUN = `rm -f -- "$${DERIVE_OUTPUT_ENV}" && exec python3 -c "$1"`;
77
84
  /** The cap of the failure detail that the tool copies out of the standard error of the script. */
78
85
  const STDERR_TAIL_CAP = 2_000;
79
86
  /** The line that the agent reads when the composition binds no sandbox rails. */
80
87
  const NO_SANDBOX_DETAIL = "the composition gives no sandbox, thus this session cannot derive a table";
81
88
  /**
82
- * Build the sandbox exec of one derivation. The command runs the script of the agent through `python3 -c`.
89
+ * Build the sandbox exec of one derivation. The command clears the output path, and then it runs the script
90
+ * of the agent through `python3 -c`.
83
91
  *
84
92
  * The working directory is the write mount, thus the script writes its table beside where it stands. Each
85
93
  * declared input rides as its mounted path, thus the script opens the file wherever it works from. The
@@ -89,7 +97,7 @@ const NO_SANDBOX_DETAIL = "the composition gives no sandbox, thus this session c
89
97
  */
90
98
  export function buildDerivationExec(args) {
91
99
  return {
92
- command: ["python3", "-c", args.script],
100
+ command: ["sh", "-c", CLEAR_THEN_RUN, "derive_table", args.script],
93
101
  cwd: args.workingDir,
94
102
  env: {
95
103
  [DERIVE_INPUT_ENV]: JSON.stringify(args.inputs.map((input) => ({ path: input.path, hash: input.hash }))),
@@ -130,7 +138,20 @@ export function describeExecFailure(result) {
130
138
  export function createDeriveTableTool(deps) {
131
139
  const logger = (deps.logger ?? createNoopLogger()).named("derive-table");
132
140
  const observe = bindSessionEmit(deps.provenance, logger);
133
- const { runDerivation, runAuthorizer } = deps;
141
+ const observeDerived = (analysisId, threadId, result) => {
142
+ if (result.outcome !== "derived")
143
+ return;
144
+ observe({
145
+ type: "run-derivation",
146
+ analysisId,
147
+ threadId,
148
+ outputPath: result.path,
149
+ outputHash: result.hash,
150
+ scriptHash: result.scriptHash,
151
+ sources: result.sources,
152
+ });
153
+ };
154
+ const { sandboxClient } = deps;
134
155
  return defineTool({
135
156
  id: "derive_table",
136
157
  description: "Derive one table from the pinned evidence with a Python script, and pin the result to this session. " +
@@ -149,15 +170,14 @@ export function createDeriveTableTool(deps) {
149
170
  "A failed script gives back exec-failed with the tail of its standard error. " +
150
171
  "The outcome unavailable means that this host cannot run a derivation, and a repeat gives the same outcome.",
151
172
  inputSchema: deriveTableInput,
152
- executionMode: "inline",
153
173
  describeCall: (input) => `derive ${input.output}`,
154
174
  // The derived path is the one durable product of the call, thus the derived arm names it. Each other
155
175
  // arm is a condition that refused, and the kind of the arm is what a watcher must read.
156
176
  describeResult: (_input, result) => (result.outcome === "derived" ? result.path : result.outcome),
157
177
  execute: async (input, ctx) => {
158
178
  // The check runs before every read, thus one clear signal replaces a failure for each attempt.
159
- // It also narrows the two rails below, thus the exec needs no assertion.
160
- if (runDerivation === undefined || runAuthorizer === undefined) {
179
+ // It also narrows the rail below, thus the exec needs no assertion.
180
+ if (sandboxClient === undefined) {
161
181
  logger.warn("the composition gives no sandbox, thus no derivation can run");
162
182
  return ok({ outcome: "unavailable", detail: NO_SANDBOX_DETAIL });
163
183
  }
@@ -165,7 +185,7 @@ export function createDeriveTableTool(deps) {
165
185
  if (opened.isErr()) {
166
186
  return ok({ outcome: "refused", refusal: opened.error });
167
187
  }
168
- const { threadId, analysisId, state } = opened.value;
188
+ const { threadId, analysisId, state, derivations } = opened.value;
169
189
  const bytes = Buffer.byteLength(input.script, "utf8");
170
190
  if (bytes > SCRIPT_CAP_BYTES) {
171
191
  return ok({
@@ -210,15 +230,6 @@ export function createDeriveTableTool(deps) {
210
230
  // compose from the session-directory builder, thus the layout has one owner.
211
231
  const writableTail = reportSessionDerivedDir(threadId);
212
232
  const outputPath = `${writableTail}/${input.output}`;
213
- // The served membership carries each derivation of the session, thus this one test refuses a
214
- // repeated name and a collision with a pinned artifact alike.
215
- if (snapshotEntry(state.snapshot, outputPath) !== undefined) {
216
- return ok({
217
- outcome: "repeated-name",
218
- outputPath,
219
- detail: `the evidence of this session already holds ${outputPath}, thus this derivation takes a new name`,
220
- });
221
- }
222
233
  let root;
223
234
  try {
224
235
  root = await deps.resolveWorkspaceRoot(analysisId);
@@ -227,59 +238,56 @@ export function createDeriveTableTool(deps) {
227
238
  logger.warn("the workspace root did not resolve", { threadId, analysisId, ...defaultErrorFields(cause) });
228
239
  return ok({ outcome: "unavailable", detail: "the workspace root did not resolve, thus the derived table has no place to land" });
229
240
  }
230
- const authorized = await passGate("RunAuthorizer.authorize", runAuthorizer.authorize({
231
- auth: ctx.session.auth,
232
- scope: { kind: "analysis", analysisId },
233
- provenance: { agentId: DERIVE_AGENT_ID, callPath: [DERIVE_AGENT_ID] },
234
- frame: { runId: DERIVE_RUN_LITERAL, stepId: DERIVE_STEP_LITERAL },
235
- }));
236
- if (authorized.isErr()) {
237
- const { kind, reason } = authorized.error;
238
- logger.error("the derivation was not authorized", { threadId, analysisId, reason, suspend: kind === "suspended" });
239
- if (kind === "suspended")
240
- return ok({ outcome: "suspended", reason, detail: `the analysis is suspended (${reason}), thus the derivation did not run` });
241
- return ok({ outcome: "unavailable", detail: `the derivation was not authorized: ${reason}` });
241
+ // A rerun of a call whose record landed gives that record back. The membership holds the output of
242
+ // the record by now, thus the name test below would refuse the call its own table.
243
+ const recorded = derivations.find((record) => record.toolCallId === ctx.invocationId);
244
+ if (recorded !== undefined) {
245
+ const replayed = {
246
+ outcome: "derived",
247
+ path: recorded.outputPath,
248
+ hash: recorded.outputHash,
249
+ scriptHash: recorded.scriptHash,
250
+ sources: [...recorded.sources],
251
+ columns: await readColumnsQuietly(outputPath, join(root, outputPath), logger),
252
+ };
253
+ // A crash between the record and the emit of the earlier run loses its event, thus the rerun
254
+ // emits again. A consumer can get the act two times, never zero times.
255
+ observeDerived(analysisId, threadId, replayed);
256
+ return ok(replayed);
242
257
  }
243
- const authorization = authorized.value;
244
- // The work sits inside the `try`, and the revoke sits in the `finally`. Thus the authorization
245
- // revokes on every terminal path, the thrown one included: a path builder refuses a hostile
246
- // stored path with a throw, and that throw must not leave an authorization standing.
247
- let result;
248
- try {
249
- result = await derive({
250
- runDerivation,
251
- derivations: deps.derivations,
252
- root,
253
- threadId,
254
- analysisId,
255
- runSession: authorization.runSession,
256
- script: input.script,
257
- sources,
258
- writableTail,
258
+ // The served membership carries each derivation of the session, thus this one test refuses a
259
+ // repeated name and a collision with a pinned artifact alike.
260
+ if (snapshotEntry(state.snapshot, outputPath) !== undefined) {
261
+ return ok({
262
+ outcome: "repeated-name",
259
263
  outputPath,
260
- outputName: input.output,
261
- logger,
264
+ detail: `the evidence of this session already holds ${outputPath}, thus this derivation takes a new name`,
262
265
  });
263
- // The record of the derivation lands before this point, thus the event states a table that
264
- // the session already holds as evidence. Each other arm derived nothing.
265
- if (result.outcome === "derived") {
266
- observe({
267
- type: "run-derivation",
268
- analysisId,
269
- threadId,
270
- outputPath: result.path,
271
- outputHash: result.hash,
272
- scriptHash: result.scriptHash,
273
- sources: result.sources,
274
- });
275
- }
276
- return ok(result);
277
- }
278
- finally {
279
- // The revoke is a notice: its failure changes no outcome of the call, thus it reaches the log
280
- // alone. An absent result means that the work threw, and a throw is a failed derivation.
281
- await deliverNotice(logger.with({ threadId, analysisId }), "RunAuthorizer.revoke", runAuthorizer.revoke(authorization, result?.outcome === "derived" ? "derive-table-completed" : "derive-table-failed"));
282
266
  }
267
+ const result = await derive({
268
+ sandboxClient,
269
+ session: passSpawnSession(ctx.session, {
270
+ analysisId,
271
+ runId: DERIVE_RUN_LITERAL,
272
+ stepId: DERIVE_STEP_LITERAL,
273
+ agentId: DERIVE_AGENT_ID,
274
+ }),
275
+ derivations: deps.derivations,
276
+ root,
277
+ threadId,
278
+ analysisId,
279
+ toolCallId: ctx.invocationId,
280
+ script: input.script,
281
+ sources,
282
+ writableTail,
283
+ outputPath,
284
+ outputName: input.output,
285
+ logger,
286
+ });
287
+ // The record of the derivation lands before this point, thus the event states a table that the
288
+ // session already holds as evidence. Each other arm derived nothing.
289
+ observeDerived(analysisId, threadId, result);
290
+ return ok(result);
283
291
  },
284
292
  });
285
293
  }
@@ -288,62 +296,51 @@ export function createDeriveTableTool(deps) {
288
296
  *
289
297
  * The order is the order of the evidence. The script writes into the write mount, the host classifies the
290
298
  * file, the hash comes off the disk, and the record lands last. Thus the recorded hash is the hash of the
291
- * file that a verifier reads.
299
+ * file that a verifier reads. The container goes away after the record.
292
300
  *
293
301
  * The classification is the guard of the read. A script can leave a symbolic link at the output name, and a
294
302
  * link that resolves outside the tree would otherwise carry a host file into the evidence of the session.
295
- *
296
- * The output path clears before the exec. The host owns the `derived/` directory, and a failed attempt can
297
- * leave a file at the name that this attempt declares. Without the clearance a script that writes nothing
298
- * would adopt those bytes as its own table, and the record would chain a script to a file that it never
299
- * wrote. A clearance fault refuses the derivation, because the same doubt stands.
300
303
  */
301
304
  async function derive(args) {
302
- const executionId = generateExecutionId(DERIVE_AGENT_ID);
303
305
  const absolute = join(args.root, args.outputPath);
304
306
  // The container sees the tree at its own mount point, thus each path that the script reads maps through
305
- // the one host-to-container mapper and never through a formula here.
306
- const workingDir = toSandboxPath(args.root, args.analysisId, join(args.root, args.writableTail));
307
- // `unlink` removes a symbolic link as the link, and never the file that it names. An absent path is the
308
- // normal condition, thus it is not a fault.
309
- try {
310
- await unlink(absolute);
311
- }
312
- catch (cause) {
313
- if (cause.code !== "ENOENT") {
314
- args.logger.error("the output path did not clear before the derivation", { threadId: args.threadId, ...defaultErrorFields(cause) });
315
- return { outcome: "exec-failed", detail: `${args.outputName} already holds a file that did not clear, thus this derivation takes a new name` };
316
- }
317
- }
318
- // The path mapper refuses a stored path that escapes the root, with a throw. It runs before the try,
319
- // thus that refusal stays a throw and it never reads as a fault of the container.
320
- const execInput = {
321
- analysisId: args.analysisId,
322
- runSession: args.runSession,
323
- executionId,
307
+ // the one host-to-container mapper and never through a formula here. The mapper refuses a stored path
308
+ // that escapes the root with a throw. It runs before the try, thus that refusal stays a throw and it never
309
+ // reads as a fault of the container.
310
+ const request = buildDerivationExec({
324
311
  script: args.script,
325
- writableTail: args.writableTail,
326
- workingDir,
312
+ workingDir: toSandboxPath(args.root, args.analysisId, join(args.root, args.writableTail)),
327
313
  inputs: args.sources.map((source) => ({ path: toSandboxPath(args.root, args.analysisId, join(args.root, source.path)), hash: source.hash })),
328
314
  output: toSandboxPath(args.root, args.analysisId, absolute),
329
- };
315
+ });
330
316
  let ran;
331
317
  try {
332
- ran = await args.runDerivation(execInput);
318
+ ran = await withStepSandbox(args.sandboxClient, { session: args.session, spec: { resources: DERIVATION_RESOURCES, writableTail: args.writableTail } }, args.logger, async (exec) => {
319
+ const failure = describeExecFailure(await exec(request, DERIVATION_DEADLINE_MS));
320
+ if (failure !== undefined) {
321
+ return { outcome: "exec-failed", detail: failure };
322
+ }
323
+ return recordDerivedTable({ ...args, absolute });
324
+ });
333
325
  }
334
326
  catch (cause) {
327
+ if (isWorkflowCancellation(cause))
328
+ throw cause;
335
329
  args.logger.error("the derivation exec did not complete", { threadId: args.threadId, ...defaultErrorFields(cause) });
336
330
  return { outcome: "exec-failed", detail: "the derivation exec did not complete" };
337
331
  }
338
332
  if (ran.isErr()) {
339
- return { outcome: "suspended", reason: ran.error.reason, detail: `the analysis is suspended (${ran.error.reason}), thus the derivation did not run` };
340
- }
341
- const executed = ran.value;
342
- const failure = describeExecFailure(executed);
343
- if (failure !== undefined) {
344
- return { outcome: "exec-failed", detail: failure };
333
+ return {
334
+ outcome: "suspended",
335
+ reason: ran.error.reason,
336
+ detail: `the host refused the sandbox (${ran.error.reason}), thus the derivation did not run`,
337
+ };
345
338
  }
346
- const verdict = await classifyWithinRoot(args.root, absolute).catch((cause) => {
339
+ return ran.value;
340
+ }
341
+ /** Classify, hash, and record the table that a green script wrote. */
342
+ async function recordDerivedTable(args) {
343
+ const verdict = await classifyWithinRoot(args.root, args.absolute).catch((cause) => {
347
344
  args.logger.error("the derived table did not classify", { threadId: args.threadId, ...defaultErrorFields(cause) });
348
345
  return "escaped";
349
346
  });
@@ -361,7 +358,7 @@ async function derive(args) {
361
358
  }
362
359
  let outputHash;
363
360
  try {
364
- outputHash = await computeSha256File(absolute);
361
+ outputHash = await computeSha256File(args.absolute);
365
362
  }
366
363
  catch (cause) {
367
364
  args.logger.error("the derived table did not hash", { threadId: args.threadId, ...defaultErrorFields(cause) });
@@ -373,6 +370,7 @@ async function derive(args) {
373
370
  sources: [...args.sources],
374
371
  scriptHash: computeSha256(Buffer.from(args.script, "utf8")),
375
372
  script: args.script,
373
+ toolCallId: args.toolCallId,
376
374
  };
377
375
  const appended = await args.derivations.appendDerivation(args.threadId, record);
378
376
  if (appended.isErr()) {
@@ -394,14 +392,14 @@ async function derive(args) {
394
392
  }
395
393
  // The columns describe the derived table the same way as the listing describes a pinned one. A file that
396
394
  // gives no header gives no columns, and absence is a normal condition here.
397
- const columns = await readColumnsQuietly(args.outputPath, absolute, args.logger);
395
+ const columns = await readColumnsQuietly(args.outputPath, args.absolute, args.logger);
398
396
  return {
399
397
  outcome: "derived",
400
398
  path: args.outputPath,
401
399
  hash: outputHash,
402
400
  scriptHash: record.scriptHash,
403
401
  sources: [...args.sources],
404
- ...(columns === undefined ? {} : { columns }),
402
+ columns,
405
403
  };
406
404
  }
407
405
  /**
@@ -56,12 +56,12 @@ import { type ChromeConfig } from "../../lib/chrome.js";
56
56
  import type { GateFailure } from "../../lib/hooks.js";
57
57
  import { type AcquireEyes } from "../../lib/eyes.js";
58
58
  import { type Logger } from "../../lib/logger.js";
59
- import { type CaptureCoverage, type CapturePage, type FailedRequest, type PageCapture } from "../../lib/page-capture.js";
59
+ import { type CaptureCoverage, type CapturePage } from "../../lib/page-capture.js";
60
60
  import { type ResolveWorkspaceRoot } from "../../workspace/paths.js";
61
61
  import { type Tool } from "../define-tool.js";
62
62
  import { type ReportSessionStateGateway, type SessionRefusal } from "../report-authoring/authoring-tools.js";
63
63
  import { type ConsoleErrorEntry, type FailedRequestEntry } from "./page-faults.js";
64
- export type { CaptureCoverage, CapturePage, FailedRequest, PageCapture };
64
+ export type { CaptureCoverage, CapturePage, FailedRequest, PageCapture } from "../../lib/page-capture.js";
65
65
  /**
66
66
  * The URL formation of one look. It maps the page of the thread onto the URL that the browser opens.
67
67
  * A composition whose browser cannot reach the workspace tree binds a resolver that names a served URL.
@@ -80,11 +80,11 @@ declare const examinePageInput: z.ZodObject<{
80
80
  }, z.core.$strip>;
81
81
  export type ExaminePageInput = z.infer<typeof examinePageInput>;
82
82
  /** The document range of one slice of a tiled look, in the order that the pictures ride. */
83
- export interface ExaminedTile {
83
+ export type ExaminedTile = {
84
84
  index: number;
85
85
  fromY: number;
86
86
  toY: number;
87
- }
87
+ };
88
88
  /**
89
89
  * The typed outcome of the eyes tool. Each arm is ok-channel data, thus the tool never throws for a
90
90
  * degraded condition. `examined` carries the coverage of the look, the digest of the console errors and the
@@ -137,7 +137,7 @@ export type ExaminePageResult = {
137
137
  * tree names a served URL instead. `capture` is optional and it replaces the whole transport, thus a test
138
138
  * injects a seam that reads no browser.
139
139
  */
140
- export interface ExaminePageToolDeps {
140
+ export type ExaminePageToolDeps = {
141
141
  readonly gateway: ReportSessionStateGateway;
142
142
  readonly resolveWorkspaceRoot: ResolveWorkspaceRoot;
143
143
  readonly chrome: ChromeConfig;
@@ -154,7 +154,7 @@ export interface ExaminePageToolDeps {
154
154
  readonly acquireMs?: number;
155
155
  readonly releaseMs?: number;
156
156
  };
157
- }
157
+ };
158
158
  /**
159
159
  * Make the eyes tool over the session-state gateway, the workspace-root seam, and the eyes of the composition.
160
160
  *
@@ -49,12 +49,16 @@
49
49
  * deadline. A realization that hangs while it starts a browser would otherwise hold the whole agent turn,
50
50
  * and no outcome would ever arrive.
51
51
  */
52
+ import { errorMessageOf } from "../../lib/thrown.js";
53
+ import { textOf } from "../../lib/unknown-text.js";
52
54
  import { err, ok } from "neverthrow";
53
55
  import { access } from "node:fs/promises";
54
56
  import { join } from "node:path";
55
57
  import { pathToFileURL } from "node:url";
58
+ import { setTimeout as sleep } from "node:timers/promises";
56
59
  import { z } from "zod";
57
60
  import { hasBrowserUrl } from "../../lib/chrome.js";
61
+ import { errnoOf } from "../../lib/fs-result.js";
58
62
  import { createNoopLogger } from "../../lib/console-logger.js";
59
63
  import { createStaticEyes } from "../../lib/eyes.js";
60
64
  import { defaultErrorFields } from "../../lib/logger.js";
@@ -114,7 +118,7 @@ const ACQUIRE_DEADLINE_MS = 60_000;
114
118
  * provisions.
115
119
  */
116
120
  const RELEASE_DEADLINE_MS = 10_000;
117
- /** The win of the timer arm. A symbol cannot collide with a value that the operation gives. */
121
+ /** The win of the expiry arm. A symbol cannot collide with a value that the operation gives. */
118
122
  const EXPIRED = Symbol("expired");
119
123
  /**
120
124
  * Run one operation against a deadline, and give the value, the cause, or the expiry.
@@ -122,19 +126,17 @@ const EXPIRED = Symbol("expired");
122
126
  * The eyes seam takes no abort signal, thus a race is the whole bound. The loser of the race stays in
123
127
  * flight, and the caller of an expired operation owns whatever arrives late.
124
128
  *
125
- * Each path clears the timer. `sleep` of `async-utils.ts` holds a timer that nothing can clear. Thus an
126
- * operation that wins its race would still keep the process alive for the rest of the budget.
129
+ * The abort after the race clears the wait of a settled operation, so no armed timer outlives the budget.
127
130
  */
128
131
  async function withDeadline(work, ms) {
129
- let timer;
130
132
  // The settled arm never rejects. Thus a fault that arrives after the expiry stays contained here, and it
131
133
  // never reaches the process as an unhandled rejection.
132
134
  const settled = work.then((value) => ok(value), (cause) => err({ kind: "threw", cause }));
133
- const expiry = new Promise((resolve) => {
134
- timer = setTimeout(() => resolve(EXPIRED), ms);
135
- });
135
+ const gate = new AbortController();
136
+ // The rejection arm answers the abort of a settled race, and its value is never read.
137
+ const expiry = sleep(ms, undefined, { signal: gate.signal }).then(() => EXPIRED, () => EXPIRED);
136
138
  const winner = await Promise.race([settled, expiry]);
137
- clearTimeout(timer);
139
+ gate.abort();
138
140
  return winner === EXPIRED ? err({ kind: "expired" }) : winner;
139
141
  }
140
142
  /** The cause of one such fault. An expiry names its budget, thus the detail of the outcome names it too. */
@@ -153,6 +155,7 @@ function startSeamCall(call) {
153
155
  return call();
154
156
  }
155
157
  catch (cause) {
158
+ // oxlint-disable-next-line typescript/prefer-promise-reject-errors -- the rejection reason is the thrown value itself; the awaiter reads its identity, and a wrapper would erase it.
156
159
  return Promise.reject(cause);
157
160
  }
158
161
  }
@@ -251,7 +254,6 @@ export function createExaminePageTool(deps) {
251
254
  "The outcomes no-page and missed-stamp mean that no preview rendered the current page: run preview_report, then look again. " +
252
255
  "The outcome no-browser means that this host gives no browser, and a repeat gives the same outcome.",
253
256
  inputSchema: examinePageInput,
254
- executionMode: "inline",
255
257
  describeCall: (input) => {
256
258
  const blockId = input.blockId ?? undefined;
257
259
  return blockId === undefined ? "look at the page" : `look at ${blockId}`;
@@ -288,7 +290,7 @@ export function createExaminePageTool(deps) {
288
290
  await access(pagePath);
289
291
  }
290
292
  catch (cause) {
291
- if (cause.code === "ENOENT") {
293
+ if (errnoOf(cause) === "ENOENT") {
292
294
  // No preview wrote the page yet. The agent runs the preview first.
293
295
  return ok({ outcome: "no-page" });
294
296
  }
@@ -330,7 +332,7 @@ export function createExaminePageTool(deps) {
330
332
  if (looked.isErr()) {
331
333
  const { stage, cause } = looked.error;
332
334
  logger.warn(LOOK_FAULT_MESSAGE[stage], { threadId, analysisId, ...defaultErrorFields(cause) });
333
- return ok({ outcome: "capture-failed", detail: cause instanceof Error ? cause.message : String(cause) });
335
+ return ok({ outcome: "capture-failed", detail: errorMessageOf(cause) ?? textOf(cause) });
334
336
  }
335
337
  const captured = looked.value;
336
338
  if (blockId !== undefined && captured.coverage.kind === "no-block") {
@@ -360,7 +362,7 @@ export function createExaminePageTool(deps) {
360
362
  return ok(withToolResultImages({
361
363
  outcome: "examined",
362
364
  coverage: captured.coverage,
363
- ...(tiles.length === 0 ? {} : { tiles }),
365
+ tiles: tiles.length === 0 ? undefined : tiles,
364
366
  ...digestPageFaults(captured.consoleErrors, captured.failedRequests),
365
367
  pagePath: relativePagePath,
366
368
  }, captured.screenshots.map((shot) => ({ base64: shot.base64, mediaType: SCREENSHOT_MEDIA_TYPE }))));
@@ -38,12 +38,12 @@ export type ListPinnedArtifactsInput = z.infer<typeof listPinnedArtifactsInput>;
38
38
  * only for a header that the read recovered, thus their absence says nothing about the content of the file.
39
39
  * The listing gives `columnCount`, and a call with a path gives `columns` as well.
40
40
  */
41
- export interface PinnedArtifact {
41
+ export type PinnedArtifact = {
42
42
  path: string;
43
43
  fileType?: string;
44
44
  columnCount?: number;
45
45
  columns?: string[];
46
- }
46
+ };
47
47
  /**
48
48
  * One pinned citation of the listing: the key, and the short citation of its pinned record.
49
49
  *
@@ -51,10 +51,10 @@ export interface PinnedArtifact {
51
51
  * the pin recorded no citation for carries none, because absence is a normal condition. The description of
52
52
  * the record stays out, because the listing is an orientation surface.
53
53
  */
54
- export interface PinnedCitation {
54
+ export type PinnedCitation = {
55
55
  key: string;
56
56
  citation?: string;
57
- }
57
+ };
58
58
  /**
59
59
  * The typed outcome of the listing tool. Each arm is ok-channel data, thus the tool never throws for one
60
60
  * of them.
@@ -87,11 +87,11 @@ export type ListPinnedArtifactsResult = {
87
87
  * `resolveWorkspaceRoot` maps the analysis of the call onto its workspace root, thus one singleton tool
88
88
  * serves every analysis and it resolves the root per call from the scope.
89
89
  */
90
- export interface ListPinnedArtifactsToolDeps {
90
+ export type ListPinnedArtifactsToolDeps = {
91
91
  readonly gateway: ReportSessionStateGateway;
92
92
  readonly resolveWorkspaceRoot: ResolveWorkspaceRoot;
93
93
  readonly logger?: Logger;
94
- }
94
+ };
95
95
  /**
96
96
  * The header columns of a file on disk, or `undefined` when the file gives none.
97
97
  *
@@ -27,9 +27,10 @@ import { extname } from "node:path";
27
27
  import { z } from "zod";
28
28
  import { resolveWorkspacePath } from "../../workspace/paths.js";
29
29
  import { createNoopLogger } from "../../lib/console-logger.js";
30
+ import { splitLines } from "../../lib/text.js";
30
31
  import { tryFs } from "../../lib/fs-result.js";
31
32
  import { defaultErrorFields } from "../../lib/logger.js";
32
- import { citationRecordOf, fileTypeHoldsNoCell } from "../../report-model/reference-resolver.js";
33
+ import { citationRecordOf, fileTypeHoldsNoCell, snapshotEntry } from "../../report-model/reference-resolver.js";
33
34
  import { defineTool } from "../define-tool.js";
34
35
  import { openReportThread } from "../report-authoring/authoring-tools.js";
35
36
  /** No path lists the pinned set. A path gives the header columns of that one pinned artifact. */
@@ -87,7 +88,7 @@ async function readHeaderLine(absolute) {
87
88
  if (head === undefined) {
88
89
  return undefined;
89
90
  }
90
- const line = head.text.split(/\r?\n/, 1)[0];
91
+ const [line = ""] = splitLines(head.text).slice(0, 1);
91
92
  if (line.length === 0) {
92
93
  return undefined;
93
94
  }
@@ -147,7 +148,6 @@ export function createListPinnedArtifactsTool(deps) {
147
148
  "Read the listing to orient before you bind a block. Read the columns of one artifact to choose the column that a locator names. " +
148
149
  "A reference names the path alone: the session stamps the hash from this evidence, thus the tool gives no hash.",
149
150
  inputSchema: listPinnedArtifactsInput,
150
- executionMode: "inline",
151
151
  describeCall: (input) => input.path ?? "the pinned set",
152
152
  // The size of the listing is what a watcher reads, and the cap makes that size differ from the
153
153
  // pinned set. Thus a truncated listing names the total beside the count, and a whole listing names
@@ -180,8 +180,8 @@ export function createListPinnedArtifactsTool(deps) {
180
180
  logger.warn("the workspace root did not resolve", { threadId, analysisId, ...defaultErrorFields(cause) });
181
181
  }
182
182
  const describe = async (path) => {
183
- const fileType = state.snapshot.artifacts[path].fileType;
184
- const artifact = { path, ...(typeof fileType === "string" ? { fileType } : {}) };
183
+ const fileType = snapshotEntry(state.snapshot, path)?.fileType ?? undefined;
184
+ const artifact = { path, fileType };
185
185
  if (root === undefined || fileTypeHoldsNoCell(fileType)) {
186
186
  return { artifact };
187
187
  }
@@ -4,25 +4,25 @@
4
4
  */
5
5
  import type { FailedRequest } from "../../lib/page-capture.js";
6
6
  /** One distinct console error of a look, and how many times the page logged it. */
7
- export interface ConsoleErrorEntry {
7
+ export type ConsoleErrorEntry = {
8
8
  text: string;
9
9
  count: number;
10
- }
10
+ };
11
11
  /** One distinct failed request of a look, and how many times the page made it. */
12
- export interface FailedRequestEntry {
12
+ export type FailedRequestEntry = {
13
13
  url: string;
14
14
  reason: string;
15
15
  count: number;
16
- }
16
+ };
17
17
  /** The digest of one look. `omittedFaults` counts the distinct entries that the cap left out, thus a cut is never silent. */
18
- export interface PageFaults {
18
+ export type PageFaults = {
19
19
  consoleErrors: ConsoleErrorEntry[];
20
20
  failedRequests: FailedRequestEntry[];
21
21
  omittedFaults?: {
22
22
  consoleErrors: number;
23
23
  failedRequests: number;
24
24
  };
25
- }
25
+ };
26
26
  /** Shorten one fault text: the inline data becomes placeholders, and the text stops at the cap. */
27
27
  export declare function shortenFaultText(text: string): string;
28
28
  /** Digest the raw faults of one capture into the short lists that the agent reads. */