@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
@@ -52,8 +52,8 @@ export function mountCoordsOf(session, spec) {
52
52
  analysisId: session.scope.analysisId,
53
53
  runId: session.runFrame.runId,
54
54
  stepId: session.runFrame.stepId,
55
- ...(spec.readOnly !== undefined ? { readOnly: spec.readOnly } : {}),
56
- ...(spec.writableTail !== undefined ? { writableTail: spec.writableTail } : {}),
55
+ readOnly: spec.readOnly,
56
+ writableTail: spec.writableTail,
57
57
  };
58
58
  }
59
59
  /**
@@ -110,7 +110,7 @@ export function buildSessionSubPaths(coords, workspaceSubPath) {
110
110
  const write = sandboxWriteTail(coords);
111
111
  return {
112
112
  ro: workspaceSubPath,
113
- ...(write === undefined ? {} : { rw: `${workspaceSubPath}/${write.tail}` }),
113
+ rw: write === undefined ? undefined : `${workspaceSubPath}/${write.tail}`,
114
114
  };
115
115
  }
116
116
  /**
@@ -135,17 +135,16 @@ function libStoreEnv(toolchainSource, cache) {
135
135
  };
136
136
  }
137
137
  const farm = farmContainerPath(toolchainSource);
138
- return {
138
+ const env = {
139
139
  R_LIBS_SITE: `${farm}/r/github:${farm}/r/bioconductor:${farm}/r/cran`,
140
140
  NODE_PATH: "/opt/node/node_modules",
141
141
  PATH: `/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/conda/bin:${farm}/python/bin`,
142
- ...(cache
143
- ? {
144
- NUMBA_CACHE_DIR: `${FARM_CACHE_CONTAINER_PATH}/numba-cache`,
145
- MPLCONFIGDIR: `${FARM_CACHE_CONTAINER_PATH}/matplotlib_config`,
146
- }
147
- : {}),
148
142
  };
143
+ if (cache) {
144
+ env.NUMBA_CACHE_DIR = `${FARM_CACHE_CONTAINER_PATH}/numba-cache`;
145
+ env.MPLCONFIGDIR = `${FARM_CACHE_CONTAINER_PATH}/matplotlib_config`;
146
+ }
147
+ return env;
149
148
  }
150
149
  export function buildMountPlan(coords, stores) {
151
150
  const { analysisId } = coords;
@@ -156,6 +155,9 @@ export function buildMountPlan(coords, stores) {
156
155
  const write = sandboxWriteTail(coords);
157
156
  const writableStepPath = write === undefined ? undefined : `${readonlyTreePath}/${write.tail}`;
158
157
  const cache = stores.libs && stores.cache === true;
158
+ const env = { PROVENANCE_WATCH_DIRS: readonlyTreePath };
159
+ if (stores.libs)
160
+ Object.assign(env, libStoreEnv(stores.toolchainSource, cache));
159
161
  return {
160
162
  readonlyTreePath,
161
163
  writableStepPath,
@@ -165,9 +167,6 @@ export function buildMountPlan(coords, stores) {
165
167
  cachePath: cache ? FARM_CACHE_CONTAINER_PATH : undefined,
166
168
  refsPath: stores.refs ? REFS_CONTAINER_PATH : undefined,
167
169
  stepSubdirs: write?.subdirs ?? [],
168
- env: {
169
- PROVENANCE_WATCH_DIRS: readonlyTreePath,
170
- ...(stores.libs ? libStoreEnv(stores.toolchainSource, cache) : {}),
171
- },
170
+ env,
172
171
  };
173
172
  }
@@ -15,14 +15,14 @@
15
15
  */
16
16
  import type { Pool } from "pg";
17
17
  import type { Logger } from "../lib/logger.js";
18
- export interface SweepDeps {
18
+ export type SweepDeps = {
19
19
  /**
20
20
  * Execute the bounded DELETE. Returns the row count cleared. Injected
21
21
  * for tests; production wires the app pool.
22
22
  */
23
23
  deleteStale: (limit: number) => Promise<number>;
24
24
  logger?: Logger;
25
- }
25
+ };
26
26
  export declare function sweepStaleNotifications(deps: SweepDeps): Promise<number>;
27
27
  /**
28
28
  * Default `deleteStale` for production — issues the bounded DELETE
@@ -30,10 +30,10 @@ export declare function sweepStaleNotifications(deps: SweepDeps): Promise<number
30
30
  * to. The CTE form keeps the join + the LIMIT in one statement.
31
31
  */
32
32
  export declare function makeDefaultDeleteStale(pool: Pool): (limit: number) => Promise<number>;
33
- export interface RegisterNotificationSweepDeps {
33
+ export type RegisterNotificationSweepDeps = {
34
34
  pool: Pool;
35
35
  logger?: Logger;
36
36
  /** Override the DELETE driver — production defaults to the app pool. */
37
37
  deleteStale?: (limit: number) => Promise<number>;
38
- }
38
+ };
39
39
  export declare function registerNotificationSweep(deps: RegisterNotificationSweepDeps): void;
@@ -16,6 +16,7 @@
16
16
  import { DBOS } from "@dbos-inc/dbos-sdk";
17
17
  import { createNoopLogger } from "../lib/console-logger.js";
18
18
  import { untracedWorkflow } from "../lib/otel-spans.js";
19
+ import { scheduleWorkflow } from "../runtime/dbos.js";
19
20
  const SWEEP_CRON = "0 */5 * * * *";
20
21
  const SWEEP_WORKFLOW = "dbos-notifications-sweep";
21
22
  const DELETE_BATCH_LIMIT = 10_000;
@@ -62,15 +63,11 @@ export function makeDefaultDeleteStale(pool) {
62
63
  }
63
64
  export function registerNotificationSweep(deps) {
64
65
  const deleteStale = deps.deleteStale ?? makeDefaultDeleteStale(deps.pool);
65
- // The scheduled target must itself be a registered workflow — DBOS's
66
- // scheduler loop skips (and errors on) any `@scheduled` function that lacks
67
- // a workflow registration. Register, then schedule the same callable.
66
+ // The scheduled target must itself be a registered workflow. Register, then
67
+ // schedule the same callable.
68
68
  const sweep = DBOS.registerWorkflow(async () => {
69
69
  await sweepStaleNotifications({ deleteStale, logger: deps.logger });
70
70
  }, { name: SWEEP_WORKFLOW });
71
71
  untracedWorkflow(SWEEP_WORKFLOW);
72
- DBOS.registerScheduled(sweep, {
73
- name: SWEEP_WORKFLOW,
74
- crontab: SWEEP_CRON,
75
- });
72
+ scheduleWorkflow({ scheduleName: SWEEP_WORKFLOW, workflowFn: sweep, schedule: SWEEP_CRON });
76
73
  }
@@ -9,9 +9,11 @@
9
9
  *
10
10
  * Two types carry the two ideas. A {@link PackageQuery} is what a person or an
11
11
  * agent asked: a spelling, an optional track, an optional version. A
12
- * {@link PackageIdentity} is the name that an ecosystem recognizes. The
13
- * identity is opaque, thus a caller cannot invent one, and every identity comes
14
- * from {@link pythonIdentity}, {@link rIdentity}, or {@link identityOf}.
12
+ * {@link PackageIdentity} is the name that an ecosystem recognizes. The name is
13
+ * a plain string, so the type alone cannot make a caller construct through the
14
+ * rule; the guard is the constructor funnel — every identity comes from
15
+ * {@link pythonIdentity}, {@link rIdentity}, or {@link identityOf}, and each
16
+ * of them validates and folds the name before it hands one out.
15
17
  *
16
18
  * The PEP 503 fold lives in exactly one function of this file. The provisioner
17
19
  * holds the Python twin, `images/sandbox-provisioner/package_identity.py`, and
@@ -34,12 +36,6 @@ export type PackageQuery = {
34
36
  readonly track?: Track;
35
37
  readonly version?: string;
36
38
  };
37
- /**
38
- * The brand of an identity name. It has no runtime value: it exists so that a
39
- * literal `{ track, name }` fails the typecheck outside this module, and thus
40
- * every identity comes from a constructor that applied the rule of its track.
41
- */
42
- declare const identityBrand: unique symbol;
43
39
  /**
44
40
  * The name that one ecosystem recognizes, under the track that holds it.
45
41
  *
@@ -50,9 +46,7 @@ declare const identityBrand: unique symbol;
50
46
  */
51
47
  export type PackageIdentity = {
52
48
  readonly track: Track;
53
- readonly name: string & {
54
- readonly [identityBrand]: true;
55
- };
49
+ readonly name: string;
56
50
  };
57
51
  /**
58
52
  * The Python identity of a spelling. The name folds, because PEP 503 makes
@@ -205,4 +199,3 @@ export type QueryResolution = {
205
199
  * `decoupler`, and the R package never links.
206
200
  */
207
201
  export declare function resolveQuery(query: PackageQuery, pool: PoolIndex): QueryResolution;
208
- export {};
@@ -9,9 +9,11 @@
9
9
  *
10
10
  * Two types carry the two ideas. A {@link PackageQuery} is what a person or an
11
11
  * agent asked: a spelling, an optional track, an optional version. A
12
- * {@link PackageIdentity} is the name that an ecosystem recognizes. The
13
- * identity is opaque, thus a caller cannot invent one, and every identity comes
14
- * from {@link pythonIdentity}, {@link rIdentity}, or {@link identityOf}.
12
+ * {@link PackageIdentity} is the name that an ecosystem recognizes. The name is
13
+ * a plain string, so the type alone cannot make a caller construct through the
14
+ * rule; the guard is the constructor funnel — every identity comes from
15
+ * {@link pythonIdentity}, {@link rIdentity}, or {@link identityOf}, and each
16
+ * of them validates and folds the name before it hands one out.
15
17
  *
16
18
  * The PEP 503 fold lives in exactly one function of this file. The provisioner
17
19
  * holds the Python twin, `images/sandbox-provisioner/package_identity.py`, and
@@ -24,19 +26,22 @@ import { err, ok } from "neverthrow";
24
26
  * idempotent, thus a fold of a folded name gives that name again.
25
27
  */
26
28
  function fold(name) {
27
- return name.replace(/[-_.]+/g, "-").toLowerCase();
28
- }
29
- /**
30
- * Brand a name that a constructor of this module already ruled on.
31
- *
32
- * The cast is the whole point of the brand: the brand has no runtime value,
33
- * thus only a cast can produce one, and this function is the one place that
34
- * casts. A caller outside the module reaches a name through a constructor.
35
- */
36
- function brand(name) {
37
- // The brand is a compile-time marker with no runtime value, thus a cast is
38
- // the only way to mint one, and this function is the only site that casts.
39
- return name;
29
+ let out = "";
30
+ let inRun = false;
31
+ for (const char of name) {
32
+ if (char === "-" || char === "_" || char === ".") {
33
+ inRun = true;
34
+ continue;
35
+ }
36
+ if (inRun) {
37
+ out += "-";
38
+ inRun = false;
39
+ }
40
+ out += char;
41
+ }
42
+ if (inRun)
43
+ out += "-";
44
+ return out.toLowerCase();
40
45
  }
41
46
  /**
42
47
  * The Python identity of a spelling. The name folds, because PEP 503 makes
@@ -45,7 +50,7 @@ function brand(name) {
45
50
  * @param spelling The distribution name, as the caller spells it.
46
51
  */
47
52
  export function pythonIdentity(spelling) {
48
- return { track: "python", name: brand(fold(spelling)) };
53
+ return { track: "python", name: fold(spelling) };
49
54
  }
50
55
  /**
51
56
  * The R identity of a name. The name keeps its spelling, because `library()`
@@ -54,7 +59,7 @@ export function pythonIdentity(spelling) {
54
59
  * @param name The DESCRIPTION `Package` value.
55
60
  */
56
61
  export function rIdentity(name) {
57
- return { track: "r", name: brand(name) };
62
+ return { track: "r", name };
58
63
  }
59
64
  /**
60
65
  * The identity of a name that an emitter already minted — a graph node, a lock
@@ -113,10 +118,23 @@ export function identityAddress(identity) {
113
118
  * A path, a URL, or a store directory. The entry is trimmed already, thus a
114
119
  * leading space cannot defeat the guard.
115
120
  */
116
- const LOCATION = /^[.~]|[/\\]|:\/\//;
117
- /** The `<word>:` prefix of an entry. The group holds the word before the colon. */
118
- const PREFIX = /^([A-Za-z][A-Za-z0-9_.-]*):/;
119
- /** A run of specifier characters. Only the exact run `==` names a version. */
121
+ function isLocation(entry) {
122
+ return entry.startsWith(".") || entry.startsWith("~") || entry.includes("/") || entry.includes("\\") || entry.includes("://");
123
+ }
124
+ /** The `<word>:` prefix of an entry, or `undefined` when the word before the colon is empty or starts outside the letters. */
125
+ function prefixWordOf(entry) {
126
+ const at = entry.indexOf(":");
127
+ if (at < 1)
128
+ return undefined;
129
+ const word = entry.slice(0, at);
130
+ const first = word.charAt(0);
131
+ const isLeadingLetter = (first >= "A" && first <= "Z") || (first >= "a" && first <= "z");
132
+ if (!isLeadingLetter)
133
+ return undefined;
134
+ const isWordChar = (char) => (char >= "A" && char <= "Z") || (char >= "a" && char <= "z") || (char >= "0" && char <= "9") || char === "_" || char === "." || char === "-";
135
+ return Array.from(word).every(isWordChar) ? word : undefined;
136
+ }
137
+ // oxlint-disable-next-line eslint-js/no-restricted-syntax -- the specifier grammar is a run of comparison characters; the parser reads the first run verbatim to accept only `==` and to report any other run.
120
138
  const SPECIFIER = /[<>!~=]+/;
121
139
  /**
122
140
  * A run of characters that an exact version cannot hold: a specifier
@@ -124,6 +142,7 @@ const SPECIFIER = /[<>!~=]+/;
124
142
  * thus `numpy==1.26,<2` gives the version `1.26,<2` without this guard, and
125
143
  * the compound range then rides into the pool as a version string.
126
144
  */
145
+ // oxlint-disable-next-line eslint-js/no-restricted-syntax -- the guard reads the first intruder run of the version text to report it verbatim; the run is the compound specifier the pool must not see.
127
146
  const VERSION_INTRUDER = /[<>!~=,\s]+/;
128
147
  /**
129
148
  * Read one entry of the grammar `[python:|r:]<spelling>[==<version>]`.
@@ -139,10 +158,9 @@ export function parseQuery(entry) {
139
158
  const trimmed = entry.trim();
140
159
  if (trimmed === "")
141
160
  return err({ type: "empty" });
142
- if (LOCATION.test(trimmed))
161
+ if (isLocation(trimmed))
143
162
  return err({ type: "location", entry: trimmed });
144
- const prefix = PREFIX.exec(trimmed);
145
- const word = prefix?.[1];
163
+ const word = prefixWordOf(trimmed);
146
164
  if (word !== undefined && word !== "python" && word !== "r") {
147
165
  return err({ type: "unknown_prefix", prefix: word, entry: trimmed });
148
166
  }
@@ -152,7 +170,7 @@ export function parseQuery(entry) {
152
170
  return err({ type: "empty" });
153
171
  const specifier = SPECIFIER.exec(rest);
154
172
  if (specifier === null)
155
- return ok({ spelling: rest, ...(track === undefined ? {} : { track }) });
173
+ return ok({ spelling: rest, track });
156
174
  if (specifier[0] !== "==") {
157
175
  return err({ type: "unsupported_specifier", specifier: specifier[0], entry: trimmed });
158
176
  }
@@ -172,8 +190,8 @@ export function parseQuery(entry) {
172
190
  }
173
191
  return ok({
174
192
  spelling,
175
- ...(track === undefined ? {} : { track }),
176
- ...(version === "" ? {} : { version }),
193
+ track,
194
+ version: version === "" ? undefined : version,
177
195
  });
178
196
  }
179
197
  /**
@@ -19,8 +19,8 @@
19
19
  * hoisted for unit testing without a DBOS runtime; `registerSandboxReaper` is
20
20
  * the thin production wiring.
21
21
  */
22
- import type { Pool } from "pg";
23
22
  import type { Logger } from "../lib/logger.js";
23
+ import type { Querier } from "../state/db.js";
24
24
  import type { SandboxClient } from "./client.js";
25
25
  import type { ManagedSandbox } from "./types.js";
26
26
  export type ReapDecision = "leave" | "reap" | "reap-if-dead";
@@ -41,8 +41,8 @@ export declare function classifyManaged(sb: ManagedSandbox, status: {
41
41
  } | null, nowMs: number, graceMs: number): ReapDecision;
42
42
  /** Map the owning workflow's terminal status to the step row's terminal status. */
43
43
  export declare function terminalStepStatus(workflowStatus: string | null): "canceled" | "failed" | "completed";
44
- export interface ReaperDeps {
45
- pool: Pool;
44
+ export type ReaperDeps = {
45
+ pool: Querier;
46
46
  sandboxClient: Pick<SandboxClient, "listManagedSandboxes" | "teardownById" | "isAliveById">;
47
47
  getStatus: (workflowId: string) => Promise<{
48
48
  status: string;
@@ -52,8 +52,8 @@ export interface ReaperDeps {
52
52
  /** Wall-clock ms; injected for tests. */
53
53
  nowMs?: () => number;
54
54
  logger?: Logger;
55
- }
56
- export interface ReapSummary {
55
+ };
56
+ export type ReapSummary = {
57
57
  managedCount: number;
58
58
  reapedCount: number;
59
59
  rowsReconciled: number;
@@ -64,18 +64,18 @@ export interface ReapSummary {
64
64
  * *and* a bug signal — it means owner ids are not round-tripping.
65
65
  */
66
66
  liveUnattributed: number;
67
- }
67
+ };
68
68
  /**
69
69
  * One cluster→registry sweep. Lists managed machines, classifies each against
70
70
  * its owner workflow's status, and reaps the terminal/orphaned ones. A reap
71
71
  * failure on one machine is logged and skipped — the next sweep retries.
72
72
  */
73
73
  export declare function reapOnce(deps: ReaperDeps): Promise<ReapSummary>;
74
- export interface RegisterReaperDeps {
75
- pool: Pool;
74
+ export type RegisterReaperDeps = {
75
+ pool: Querier;
76
76
  sandboxClient: Pick<SandboxClient, "listManagedSandboxes" | "teardownById" | "isAliveById">;
77
77
  graceMs?: number;
78
78
  logger?: Logger;
79
- }
80
- /** Production registration: a single (unsharded) `@DBOS.scheduled` workflow. */
79
+ };
80
+ /** Production registration: a single (unsharded) scheduled workflow. */
81
81
  export declare function registerSandboxReaper(deps: RegisterReaperDeps): void;
@@ -22,6 +22,7 @@
22
22
  import { DBOS } from "@dbos-inc/dbos-sdk";
23
23
  import { createNoopLogger } from "../lib/console-logger.js";
24
24
  import { untracedWorkflow } from "../lib/otel-spans.js";
25
+ import { scheduleWorkflow } from "../runtime/dbos.js";
25
26
  import { unwrapOrThrow } from "../lib/result.js";
26
27
  import { reconcileReapedSandbox } from "../state/active-sandboxes.js";
27
28
  const REAPER_CRON = "0 */5 * * * *";
@@ -138,7 +139,7 @@ export async function reapOnce(deps) {
138
139
  logger.info("sweep completed", { ...summary });
139
140
  return summary;
140
141
  }
141
- /** Production registration: a single (unsharded) `@DBOS.scheduled` workflow. */
142
+ /** Production registration: a single (unsharded) scheduled workflow. */
142
143
  export function registerSandboxReaper(deps) {
143
144
  const reaper = DBOS.registerWorkflow(async () => {
144
145
  // The whole sweep is ONE step: `listManagedSandboxes` is live cluster
@@ -150,14 +151,11 @@ export function registerSandboxReaper(deps) {
150
151
  await DBOS.runStep(() => reapOnce({
151
152
  pool: deps.pool,
152
153
  sandboxClient: deps.sandboxClient,
153
- getStatus: async (workflowId) => (await DBOS.getWorkflowStatus(workflowId)),
154
+ getStatus: async (workflowId) => await DBOS.getWorkflowStatus(workflowId),
154
155
  graceMs: deps.graceMs,
155
156
  logger: deps.logger,
156
157
  }), { name: "sandbox-reaper-sweep" });
157
158
  }, { name: REAPER_WORKFLOW });
158
159
  untracedWorkflow(REAPER_WORKFLOW);
159
- DBOS.registerScheduled(reaper, {
160
- name: REAPER_WORKFLOW,
161
- crontab: REAPER_CRON,
162
- });
160
+ scheduleWorkflow({ scheduleName: REAPER_WORKFLOW, workflowFn: reaper, schedule: REAPER_CRON });
163
161
  }
@@ -85,8 +85,8 @@ export type SandboxError = {
85
85
  /**
86
86
  * The label hook of the host refused the spawn. The client made no
87
87
  * step tree and called no backend. `reason` is the text of the host,
88
- * and `suspend` asks the caller to suspend the work in place of a
89
- * failure (see `lib/hooks.ts`).
88
+ * and `suspend` asks a caller inside a workflow to pause the work in
89
+ * place of a failure (see `workflows/pause.ts`).
90
90
  */
91
91
  readonly type: "labels_refused";
92
92
  readonly op: string;
@@ -122,13 +122,6 @@ export type SandboxError = {
122
122
  readonly lockError: FarmLockError["type"];
123
123
  readonly cause: unknown;
124
124
  };
125
- /**
126
- * The HTTP/driver status a backend SDK error carries. dockerode exposes it on
127
- * `.statusCode`; `@kubernetes/client-node` (v1.x) on `.code` (a number).
128
- * Mirror the per-client `statusCodeOf` so 404/409 classification is identical.
129
- * A Node system error (`code: "ECONNREFUSED"`) has a string `code`, so guard on
130
- * `typeof === "number"` to avoid returning it as a status.
131
- */
132
125
  export declare function sandboxStatusOf(cause: unknown): number | undefined;
133
126
  /**
134
127
  * A one-line, user-facing description of a `SandboxError` for logs/error
@@ -37,7 +37,9 @@
37
37
  * step and throws directly, so the seam forwards its promise as-is.)
38
38
  */
39
39
  import { ResultAsync, err, ok } from "neverthrow";
40
- import { ZodError } from "zod";
40
+ import { z, ZodError } from "zod";
41
+ import { presentFirst } from "../lib/present.js";
42
+ import { errorMessageOf } from "../lib/thrown.js";
41
43
  import { unwrapOrThrow } from "../lib/result.js";
42
44
  const _assertDomainError = true;
43
45
  /**
@@ -47,11 +49,22 @@ const _assertDomainError = true;
47
49
  * A Node system error (`code: "ECONNREFUSED"`) has a string `code`, so guard on
48
50
  * `typeof === "number"` to avoid returning it as a status.
49
51
  */
52
+ /** The error fields the backend SDKs attach: dockerode `statusCode`, k8s numeric `code`, and the SDK `response`. */
53
+ const SandboxCauseSchema = z.looseObject({
54
+ code: z.unknown().optional(),
55
+ statusCode: z.unknown().optional(),
56
+ response: z.looseObject({ statusCode: z.unknown().optional() }).nullish(),
57
+ });
50
58
  export function sandboxStatusOf(cause) {
51
- const e = cause;
59
+ const parsed = SandboxCauseSchema.safeParse(cause);
60
+ if (!parsed.success)
61
+ return undefined;
62
+ const e = parsed.data;
52
63
  if (typeof e.code === "number")
53
64
  return e.code;
54
- return e.statusCode ?? e.response?.statusCode;
65
+ if (typeof e.statusCode === "number")
66
+ return e.statusCode;
67
+ return typeof e.response?.statusCode === "number" ? e.response.statusCode : undefined;
55
68
  }
56
69
  /**
57
70
  * The bound on the appended cause line — the same 200 characters the profile
@@ -78,16 +91,16 @@ function causeLine(cause) {
78
91
  const path = issue.path.join(".");
79
92
  text = path.length > 0 ? `${path}: ${issue.message}` : issue.message;
80
93
  }
81
- else if (cause instanceof Error) {
82
- text = cause.message;
83
- }
84
94
  else if (typeof cause === "string") {
85
95
  text = cause;
86
96
  }
87
97
  else {
88
- return undefined;
98
+ const message = errorMessageOf(cause);
99
+ if (message === undefined)
100
+ return undefined;
101
+ text = message;
89
102
  }
90
- const first = text.split("\n", 1)[0].trim();
103
+ const first = presentFirst(text.split("\n", 1), "the first cause line").trim();
91
104
  if (first.length === 0)
92
105
  return undefined;
93
106
  return first.length > CAUSE_LINE_MAX ? `${first.slice(0, CAUSE_LINE_MAX - 1)}…` : first;
@@ -23,16 +23,19 @@ export declare function stepPartId(kind: string, runId: string, stepId: string):
23
23
  /**
24
24
  * The two parts of one activity emission: the reconciling `data-step-activity` that holds the current activity,
25
25
  * and the `data-activity-entry` that keeps the emission in the run stream. Both carry the same phase, activity,
26
- * and time. `seq` is the position of the emission in the body of its workflow, so each entry has its own id, and a
27
- * recovered body counts the same emissions again and gives the same ids. Every producer mints the two parts here.
26
+ * and time. `key` names the entry: the position of a body emission in the body of its workflow, or `tool-` and the
27
+ * id of the call for the emission of a tool call. A recovered body counts the same body emissions again, and a
28
+ * replayed tool step emits nothing, thus each entry keeps its id. Every producer mints the two parts here.
28
29
  */
29
30
  export declare function activityEmission(frame: {
30
31
  readonly runId: string;
31
32
  readonly stepId: string;
32
- }, seq: number, phase: StepPhase, activity: string, at: string): {
33
+ }, key: number | string, phase: StepPhase, activity: string, at: string): {
33
34
  readonly activity: StepActivityPart;
34
35
  readonly entry: ActivityEntryPart;
35
36
  };
37
+ /** The key of the activity entry of one tool call. */
38
+ export declare function toolActivityKey(toolUseId: string): string;
36
39
  /**
37
40
  * The two parts of one synthesis progress report: the reconciling `data-synthesis-progress` that holds the current
38
41
  * phase, and the `data-activity-entry` that keeps the report in the run stream under the synthesis step. `seq` is the
@@ -65,11 +68,11 @@ export declare function synthesisEmission(runId: string, stepId: string, seq: nu
65
68
  export declare function activityForTool(name: string, input?: unknown, resolveDetail?: ToolDetailResolver): string;
66
69
  /** On-change working-tree delta the sandbox executor posts per exec (paths
67
70
  * only; the executor skips directories). */
68
- export interface SandboxTreeDelta {
71
+ export type SandboxTreeDelta = {
69
72
  added?: string[];
70
73
  modified?: string[];
71
74
  removed?: string[];
72
- }
75
+ };
73
76
  /** Extract the tree delta from a `data-sandbox-event` part, or null when the
74
77
  * part is some other sandbox event. The wrapper shape is set by
75
78
  * `run-exec.ts`: `{ type: "data-sandbox-event", data: { event } }`
@@ -5,6 +5,8 @@
5
5
  * extraction/fold, and the chat-data-part narrowing a workflow body composes
6
6
  * into its emitters.
7
7
  */
8
+ import { z } from "zod";
9
+ import { parseUnknownRecord } from "../lib/unknown-containers.js";
8
10
  /**
9
11
  * Stable reconciliation id for a step's reconciling parts
10
12
  * (`data-step-activity`, `data-step-file-tree`). One id per (runId, stepId)
@@ -22,16 +24,21 @@ export function stepPartId(kind, runId, stepId) {
22
24
  /**
23
25
  * The two parts of one activity emission: the reconciling `data-step-activity` that holds the current activity,
24
26
  * and the `data-activity-entry` that keeps the emission in the run stream. Both carry the same phase, activity,
25
- * and time. `seq` is the position of the emission in the body of its workflow, so each entry has its own id, and a
26
- * recovered body counts the same emissions again and gives the same ids. Every producer mints the two parts here.
27
+ * and time. `key` names the entry: the position of a body emission in the body of its workflow, or `tool-` and the
28
+ * id of the call for the emission of a tool call. A recovered body counts the same body emissions again, and a
29
+ * replayed tool step emits nothing, thus each entry keeps its id. Every producer mints the two parts here.
27
30
  */
28
- export function activityEmission(frame, seq, phase, activity, at) {
31
+ export function activityEmission(frame, key, phase, activity, at) {
29
32
  const { runId, stepId } = frame;
30
33
  return {
31
34
  activity: { type: "data-step-activity", id: stepPartId("step-activity", runId, stepId), runId, stepId, phase, activity, at },
32
- entry: { type: "data-activity-entry", id: `${stepPartId("activity-entry", runId, stepId)}-${seq}`, runId, stepId, phase, activity, at },
35
+ entry: { type: "data-activity-entry", id: `${stepPartId("activity-entry", runId, stepId)}-${key}`, runId, stepId, phase, activity, at },
33
36
  };
34
37
  }
38
+ /** The key of the activity entry of one tool call. */
39
+ export function toolActivityKey(toolUseId) {
40
+ return `tool-${toolUseId}`;
41
+ }
35
42
  /**
36
43
  * The two parts of one synthesis progress report: the reconciling `data-synthesis-progress` that holds the current
37
44
  * phase, and the `data-activity-entry` that keeps the report in the run stream under the synthesis step. `seq` is the
@@ -67,6 +74,11 @@ export function activityForTool(name, input, resolveDetail) {
67
74
  const detail = resolveDetail?.(name, input);
68
75
  return detail === undefined ? name : `${name} ${detail}`;
69
76
  }
77
+ const SandboxTreeDeltaSchema = z.object({
78
+ added: z.array(z.string()).optional(),
79
+ modified: z.array(z.string()).optional(),
80
+ removed: z.array(z.string()).optional(),
81
+ });
70
82
  /** Extract the tree delta from a `data-sandbox-event` part, or null when the
71
83
  * part is some other sandbox event. The wrapper shape is set by
72
84
  * `run-exec.ts`: `{ type: "data-sandbox-event", data: { event } }`
@@ -74,10 +86,12 @@ export function activityForTool(name, input, resolveDetail) {
74
86
  export function sandboxTreeDelta(part) {
75
87
  if (part.type !== "data-sandbox-event")
76
88
  return null;
77
- const inner = part.data?.event;
78
- if (!inner || inner.kind !== "file-tree" || !inner.tree)
89
+ const data = parseUnknownRecord(part.data);
90
+ const inner = data === undefined ? undefined : parseUnknownRecord(data.event);
91
+ if (!inner || inner.kind !== "file-tree")
79
92
  return null;
80
- return inner.tree;
93
+ const tree = SandboxTreeDeltaSchema.safeParse(inner.tree);
94
+ return tree.success ? tree.data : null;
81
95
  }
82
96
  /** Apply one on-change delta to the per-step cumulative path set. `added`
83
97
  * and `modified` add the path; `removed` deletes it. Folding many deltas
@@ -98,5 +112,5 @@ export function applyTreeDelta(files, delta) {
98
112
  * `done`) never start with `data-`.
99
113
  */
100
114
  export function isChatDataPart(event) {
101
- return typeof event.type === "string" && event.type.startsWith("data-");
115
+ return "type" in event && typeof event.type === "string" && event.type.startsWith("data-");
102
116
  }
@@ -0,0 +1,47 @@
1
+ /**
2
+ * One ephemeral sandbox for one exec, inside the durable step of a tool call.
3
+ *
4
+ * The identity comes from the step: the exec id is the key of the step, plus a discriminator when one step
5
+ * runs more than one exec, and the sandbox name comes from the exec id. Thus a rerun of the step adopts the
6
+ * container of the earlier attempt (`createOrAdopt`), and sandbox-server gives the record of the same exec.
7
+ * The container goes away when the work ends. Outside a workflow nothing reruns, thus the ids are random.
8
+ */
9
+ import { type Result } from "neverthrow";
10
+ import type { AuthContext, Identity, SpawnSession } from "../auth/types.js";
11
+ import type { Logger } from "../lib/logger.js";
12
+ import type { SandboxClient } from "./client.js";
13
+ import { type SuspendingRefusal } from "./sandbox-error.js";
14
+ import type { ExecRequest, ExecResult, SandboxSpec } from "./types.js";
15
+ /** The pass of the harness that a sandbox serves. Its run id and its step id name no run of the analysis. */
16
+ export type SandboxPass = {
17
+ readonly analysisId: string;
18
+ readonly runId: string;
19
+ readonly stepId: string;
20
+ readonly agentId: string;
21
+ };
22
+ /**
23
+ * The spawn session of a pass that runs under the auth of a tool call.
24
+ *
25
+ * The pass mints no mandate. The session never enters durable state: the sandbox client reads its scope and
26
+ * its frame for the mounts and the labels, and the label hook of the host reads it in process.
27
+ */
28
+ export declare function passSpawnSession(caller: {
29
+ readonly identity: Identity;
30
+ readonly auth: AuthContext;
31
+ }, pass: SandboxPass): SpawnSession;
32
+ export type StepSandboxRequest = {
33
+ readonly session: SpawnSession;
34
+ readonly spec: Omit<SandboxSpec, "childWorkflowId">;
35
+ /** Tells two execs of one step apart. A step that runs one exec gives none. */
36
+ readonly execKey?: string;
37
+ };
38
+ /**
39
+ * The one exec of a step sandbox, with its budget in milliseconds. A pass reports no live activity, thus the
40
+ * events go nowhere.
41
+ */
42
+ export type StepSandboxExec = (request: ExecRequest, budgetMs: number) => Promise<ExecResult>;
43
+ /**
44
+ * Make the sandbox, give `work` its exec, and remove the sandbox when `work` ends. A suspending refusal of
45
+ * the spawn is the `err`, and each other fault throws.
46
+ */
47
+ export declare function withStepSandbox<T>(client: SandboxClient, request: StepSandboxRequest, logger: Logger, work: (exec: StepSandboxExec) => Promise<T>): Promise<Result<T, SuspendingRefusal>>;