@inflexa-ai/harness 0.45.0 → 0.46.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (802) hide show
  1. package/README.md +6 -3
  2. package/dist/agents/conversation-agent.d.ts +19 -3
  3. package/dist/agents/conversation-agent.js +49 -30
  4. package/dist/agents/report-session-agent.d.ts +15 -15
  5. package/dist/agents/report-session-agent.js +23 -15
  6. package/dist/agents/sandbox/index.d.ts +1 -1
  7. package/dist/agents/sandbox/index.js +1 -1
  8. package/dist/agents/sandbox/shared.d.ts +35 -16
  9. package/dist/agents/sandbox/shared.js +63 -24
  10. package/dist/agents/sandbox/translational-safety-agent.js +26 -0
  11. package/dist/agents/sandbox/types.d.ts +26 -3
  12. package/dist/agents/sandbox/validate-skills.d.ts +2 -2
  13. package/dist/agents/sandbox/validate-skills.js +3 -1
  14. package/dist/agents/sandbox-catalog.d.ts +16 -2
  15. package/dist/agents/sandbox-catalog.js +22 -3
  16. package/dist/agents/system-prompt.d.ts +2 -2
  17. package/dist/app/approve-plan.d.ts +5 -2
  18. package/dist/app/approve-plan.js +1 -1
  19. package/dist/app/chat-turn-workflow.d.ts +114 -0
  20. package/dist/app/chat-turn-workflow.js +307 -0
  21. package/dist/app/chat-turn.d.ts +85 -57
  22. package/dist/app/chat-turn.js +125 -99
  23. package/dist/app/data-profile-orientation.js +10 -8
  24. package/dist/app/data-profile-view.d.ts +4 -4
  25. package/dist/app/data-profile-view.js +9 -8
  26. package/dist/app/in-process-turn.d.ts +42 -0
  27. package/dist/app/in-process-turn.js +139 -0
  28. package/dist/app/message-assembly.d.ts +10 -4
  29. package/dist/app/message-assembly.js +13 -8
  30. package/dist/app/report-session-runtime.d.ts +4 -4
  31. package/dist/app/report-session-runtime.js +36 -21
  32. package/dist/app/spawn-report-session.d.ts +33 -28
  33. package/dist/app/spawn-report-session.js +25 -40
  34. package/dist/app/synthesize-run.d.ts +22 -16
  35. package/dist/app/synthesize-run.js +41 -35
  36. package/dist/app/work.d.ts +96 -0
  37. package/dist/app/work.js +147 -0
  38. package/dist/auth/local-auth-context.d.ts +1 -3
  39. package/dist/auth/local-auth-context.js +1 -3
  40. package/dist/auth/local-run-authorizer.d.ts +1 -1
  41. package/dist/auth/local-run-authorizer.js +5 -3
  42. package/dist/auth/types.d.ts +26 -26
  43. package/dist/billing/cached-resolver.d.ts +4 -4
  44. package/dist/billing/run-charge.d.ts +5 -8
  45. package/dist/billing/run-charge.js +2 -2
  46. package/dist/billing/usage-recorder.d.ts +9 -9
  47. package/dist/citations/aggregate.js +1 -1
  48. package/dist/citations/clients/arxiv.d.ts +2 -2
  49. package/dist/citations/clients/arxiv.js +12 -4
  50. package/dist/citations/clients/common.js +4 -2
  51. package/dist/citations/clients/crossref.d.ts +2 -2
  52. package/dist/citations/clients/crossref.js +37 -37
  53. package/dist/citations/clients/doi-registry.js +15 -16
  54. package/dist/citations/clients/pubmed.d.ts +2 -2
  55. package/dist/citations/clients/pubmed.js +20 -13
  56. package/dist/citations/clients/semantic-scholar.d.ts +2 -2
  57. package/dist/citations/clients/semantic-scholar.js +9 -9
  58. package/dist/citations/compare.js +2 -2
  59. package/dist/citations/match.d.ts +2 -2
  60. package/dist/citations/match.js +12 -7
  61. package/dist/citations/normalize.js +35 -26
  62. package/dist/citations/plan.js +6 -2
  63. package/dist/citations/resolve.d.ts +6 -6
  64. package/dist/citations/resolve.js +34 -25
  65. package/dist/citations/types.d.ts +77 -77
  66. package/dist/config/environment-stores.d.ts +10 -8
  67. package/dist/config/resource-limits.js +1 -3
  68. package/dist/contracts/analogy-report.d.ts +7 -7
  69. package/dist/contracts/analogy-report.js +2 -2
  70. package/dist/contracts/chat-events.d.ts +46 -22
  71. package/dist/contracts/chat-events.js +1 -1
  72. package/dist/contracts/chat-frame.d.ts +15 -5
  73. package/dist/contracts/chat-frame.js +67 -40
  74. package/dist/contracts/chat-parts.d.ts +130 -67
  75. package/dist/contracts/chat-parts.js +1 -0
  76. package/dist/contracts/content-url.js +16 -2
  77. package/dist/contracts/data-profile.d.ts +38 -38
  78. package/dist/contracts/index.d.ts +3 -3
  79. package/dist/contracts/index.js +1 -1
  80. package/dist/contracts/message.d.ts +6 -6
  81. package/dist/contracts/organ-system.d.ts +11 -11
  82. package/dist/contracts/part-registry.d.ts +5 -4
  83. package/dist/contracts/part-registry.js +5 -0
  84. package/dist/contracts/profile-vocabulary.d.ts +11 -10
  85. package/dist/contracts/profile-vocabulary.js +10 -3
  86. package/dist/contracts/report-blocks.d.ts +329 -329
  87. package/dist/contracts/report-reference.d.ts +105 -81
  88. package/dist/contracts/report-reference.js +30 -13
  89. package/dist/contracts/schemas/chat-events.d.ts +45 -6
  90. package/dist/contracts/schemas/chat-events.js +16 -0
  91. package/dist/contracts/schemas/chat-parts.d.ts +214 -102
  92. package/dist/contracts/schemas/chat-parts.js +50 -7
  93. package/dist/contracts/schemas/index.d.ts +1 -1
  94. package/dist/contracts/schemas/index.js +1 -1
  95. package/dist/contracts/severity.d.ts +1 -1
  96. package/dist/contracts/structure-source.d.ts +3 -3
  97. package/dist/contracts/structure-source.js +6 -2
  98. package/dist/contracts/subagent-activity.d.ts +2 -2
  99. package/dist/contracts/subagent-activity.js +5 -3
  100. package/dist/contracts/usage.d.ts +2 -2
  101. package/dist/data/safety-panel-schema.d.ts +25 -25
  102. package/dist/data/safety-panel-schema.js +13 -4
  103. package/dist/execution/artifact-metadata.d.ts +23 -15
  104. package/dist/execution/artifact-metadata.js +33 -10
  105. package/dist/execution/artifact-record.d.ts +2 -2
  106. package/dist/execution/artifact-registration.d.ts +5 -5
  107. package/dist/execution/artifact-registry.d.ts +8 -8
  108. package/dist/execution/dbos-run-launcher.d.ts +24 -4
  109. package/dist/execution/dbos-run-launcher.js +58 -4
  110. package/dist/execution/dbos-workflow-purger.d.ts +7 -6
  111. package/dist/execution/dbos-workflow-purger.js +29 -21
  112. package/dist/execution/input-signature.d.ts +2 -2
  113. package/dist/execution/post-step-pipeline.d.ts +9 -9
  114. package/dist/execution/post-step-pipeline.js +1 -1
  115. package/dist/execution/post-step.js +2 -2
  116. package/dist/execution/reconcile-manifest.d.ts +4 -4
  117. package/dist/execution/reconcile-manifest.js +3 -2
  118. package/dist/execution/run-authorizer.d.ts +46 -37
  119. package/dist/execution/run-authorizer.js +8 -8
  120. package/dist/execution/run-canceler.d.ts +39 -17
  121. package/dist/execution/run-canceler.js +137 -28
  122. package/dist/execution/run-end-record.d.ts +29 -0
  123. package/dist/execution/run-end-record.js +27 -0
  124. package/dist/execution/run-event-parts.d.ts +0 -8
  125. package/dist/execution/run-event-parts.js +29 -24
  126. package/dist/execution/run-event-stream.d.ts +8 -8
  127. package/dist/execution/run-event-stream.js +3 -4
  128. package/dist/execution/run-launcher.d.ts +4 -4
  129. package/dist/execution/run-synthesis.d.ts +49 -48
  130. package/dist/execution/run-synthesis.js +96 -255
  131. package/dist/execution/staged-input.d.ts +2 -2
  132. package/dist/execution/step-summary.d.ts +6 -6
  133. package/dist/execution/step-summary.js +4 -8
  134. package/dist/execution/topo-sort.js +4 -3
  135. package/dist/execution/workflow-purger.d.ts +2 -2
  136. package/dist/index.d.ts +25 -24
  137. package/dist/index.js +36 -37
  138. package/dist/input-sanitization.js +9 -2
  139. package/dist/input-scan/clustering.d.ts +6 -6
  140. package/dist/input-scan/clustering.js +11 -5
  141. package/dist/input-scan/companions.js +3 -2
  142. package/dist/input-scan/detect-sets.d.ts +2 -2
  143. package/dist/input-scan/detect-sets.js +25 -21
  144. package/dist/input-scan/enrich.d.ts +6 -6
  145. package/dist/input-scan/enrich.js +29 -12
  146. package/dist/input-scan/formats.d.ts +2 -2
  147. package/dist/input-scan/formats.js +8 -2
  148. package/dist/input-scan/markers.d.ts +2 -2
  149. package/dist/input-scan/markers.js +14 -5
  150. package/dist/input-scan/menu.d.ts +10 -10
  151. package/dist/input-scan/menu.js +0 -0
  152. package/dist/input-scan/quarantine.d.ts +2 -2
  153. package/dist/input-scan/quarantine.js +23 -18
  154. package/dist/input-scan/readout-budget.d.ts +2 -2
  155. package/dist/input-scan/readout-budget.js +1 -1
  156. package/dist/input-scan/readout.d.ts +2 -2
  157. package/dist/input-scan/readout.js +47 -34
  158. package/dist/input-scan/scan.d.ts +2 -2
  159. package/dist/input-scan/scan.js +7 -5
  160. package/dist/input-scan/set-types.d.ts +28 -28
  161. package/dist/input-scan/shapes.d.ts +4 -4
  162. package/dist/input-scan/shapes.js +0 -0
  163. package/dist/input-scan/templates.d.ts +10 -10
  164. package/dist/input-scan/templates.js +30 -22
  165. package/dist/input-scan/tokens.d.ts +6 -4
  166. package/dist/input-scan/tokens.js +100 -38
  167. package/dist/input-scan/types.d.ts +22 -22
  168. package/dist/lib/async-utils.d.ts +3 -7
  169. package/dist/lib/async-utils.js +5 -9
  170. package/dist/lib/cache.js +1 -1
  171. package/dist/lib/chrome.d.ts +46 -6
  172. package/dist/lib/console-logger.js +2 -2
  173. package/dist/lib/db-result.d.ts +22 -6
  174. package/dist/lib/db-result.js +9 -13
  175. package/dist/lib/eyes.d.ts +4 -4
  176. package/dist/lib/eyes.js +1 -1
  177. package/dist/lib/fs-helpers.js +18 -6
  178. package/dist/lib/fs-result.d.ts +1 -0
  179. package/dist/lib/fs-result.js +5 -6
  180. package/dist/lib/hooks.d.ts +23 -7
  181. package/dist/lib/hooks.js +17 -3
  182. package/dist/lib/host-concurrency.js +3 -2
  183. package/dist/lib/logger.d.ts +2 -2
  184. package/dist/lib/logger.js +2 -1
  185. package/dist/lib/metrics.d.ts +1 -1
  186. package/dist/lib/null-proto.d.ts +6 -0
  187. package/dist/lib/null-proto.js +17 -0
  188. package/dist/lib/otel-spans.d.ts +1 -1
  189. package/dist/lib/otel-spans.js +9 -5
  190. package/dist/lib/otel.d.ts +4 -2
  191. package/dist/lib/otel.js +10 -2
  192. package/dist/lib/page-capture.d.ts +8 -8
  193. package/dist/lib/page-capture.js +9 -4
  194. package/dist/lib/parse-json.d.ts +5 -0
  195. package/dist/lib/parse-json.js +12 -0
  196. package/dist/lib/present.d.ts +12 -0
  197. package/dist/lib/present.js +39 -0
  198. package/dist/lib/rate-limit.d.ts +4 -4
  199. package/dist/lib/rate-limit.js +12 -13
  200. package/dist/lib/regulatory-corpus/fetch-fda-guidance.d.ts +4 -4
  201. package/dist/lib/regulatory-corpus/fetch-fda-guidance.js +4 -10
  202. package/dist/lib/regulatory-corpus/fetch-ich.d.ts +4 -4
  203. package/dist/lib/regulatory-corpus/fetch-ich.js +18 -14
  204. package/dist/lib/regulatory-corpus/normalize-whitespace.d.ts +6 -0
  205. package/dist/lib/regulatory-corpus/normalize-whitespace.js +41 -0
  206. package/dist/lib/regulatory-corpus.d.ts +10 -10
  207. package/dist/lib/regulatory-corpus.js +3 -1
  208. package/dist/lib/result.d.ts +10 -11
  209. package/dist/lib/result.js +15 -13
  210. package/dist/lib/storage.d.ts +2 -2
  211. package/dist/lib/test/async-iterable.d.ts +9 -0
  212. package/dist/lib/test/async-iterable.js +28 -0
  213. package/dist/lib/test/request-url.d.ts +5 -0
  214. package/dist/lib/test/request-url.js +7 -0
  215. package/dist/lib/test/result-assert.d.ts +12 -0
  216. package/dist/lib/test/result-assert.js +17 -0
  217. package/dist/lib/test/text-shapes.d.ts +24 -0
  218. package/dist/lib/test/text-shapes.js +63 -0
  219. package/dist/lib/text.d.ts +22 -0
  220. package/dist/lib/text.js +68 -0
  221. package/dist/lib/thrown.d.ts +18 -0
  222. package/dist/lib/thrown.js +30 -0
  223. package/dist/lib/unknown-array.d.ts +6 -0
  224. package/dist/lib/unknown-array.js +8 -0
  225. package/dist/lib/unknown-containers.d.ts +14 -0
  226. package/dist/lib/unknown-containers.js +17 -0
  227. package/dist/lib/unknown-text.d.ts +8 -0
  228. package/dist/lib/unknown-text.js +28 -0
  229. package/dist/lib/zod-issue-shape.d.ts +1 -1
  230. package/dist/lib/zod-issue-shape.js +31 -31
  231. package/dist/lib/zod-issues.d.ts +3 -3
  232. package/dist/lib/zod-issues.js +30 -17
  233. package/dist/literature/sources/arxiv.d.ts +6 -6
  234. package/dist/literature/sources/arxiv.js +92 -35
  235. package/dist/literature/sources/http.d.ts +2 -2
  236. package/dist/literature/sources/http.js +16 -15
  237. package/dist/literature/sources/pubmed.d.ts +16 -16
  238. package/dist/literature/sources/pubmed.js +96 -61
  239. package/dist/literature/sources/semantic-scholar.d.ts +8 -8
  240. package/dist/literature/sources/semantic-scholar.js +22 -13
  241. package/dist/loop/accounting.d.ts +63 -0
  242. package/dist/loop/accounting.js +141 -0
  243. package/dist/loop/call-policy.d.ts +73 -0
  244. package/dist/loop/call-policy.js +109 -0
  245. package/dist/loop/chat-stream.d.ts +62 -0
  246. package/dist/loop/chat-stream.js +237 -0
  247. package/dist/loop/compaction.d.ts +14 -9
  248. package/dist/loop/compaction.js +17 -0
  249. package/dist/loop/metrics.d.ts +12 -15
  250. package/dist/loop/metrics.js +14 -26
  251. package/dist/loop/run-loop.d.ts +233 -0
  252. package/dist/loop/run-loop.js +770 -0
  253. package/dist/loop/sub-agent.d.ts +61 -0
  254. package/dist/loop/sub-agent.js +161 -0
  255. package/dist/loop/tool-adapter.d.ts +98 -0
  256. package/dist/loop/tool-adapter.js +364 -0
  257. package/dist/loop/tool-detail.d.ts +1 -1
  258. package/dist/loop/tool-detail.js +6 -5
  259. package/dist/loop/tool-outcome.d.ts +1 -1
  260. package/dist/loop/tool-output.d.ts +4 -4
  261. package/dist/loop/tool-output.js +2 -2
  262. package/dist/loop/turn-credentials.d.ts +34 -0
  263. package/dist/loop/turn-credentials.js +73 -0
  264. package/dist/loop/types.d.ts +34 -37
  265. package/dist/loop/types.js +2 -7
  266. package/dist/memory/ai-sdk-message-storage.d.ts +5 -5
  267. package/dist/memory/ai-sdk-message-storage.js +13 -11
  268. package/dist/memory/card-builders.d.ts +14 -14
  269. package/dist/memory/card-builders.js +19 -15
  270. package/dist/memory/conversation-display-recorder.d.ts +22 -6
  271. package/dist/memory/conversation-display-recorder.js +64 -20
  272. package/dist/memory/conversation-display-replay.js +3 -2
  273. package/dist/memory/conversation-display-storage.d.ts +15 -7
  274. package/dist/memory/conversation-display-storage.js +141 -36
  275. package/dist/memory/conversation-view.d.ts +4 -4
  276. package/dist/memory/conversation-view.js +5 -4
  277. package/dist/memory/count-tokens.js +10 -8
  278. package/dist/memory/derive-thread-title.d.ts +0 -13
  279. package/dist/memory/derive-thread-title.js +2 -1
  280. package/dist/memory/message-backfill.d.ts +12 -5
  281. package/dist/memory/message-backfill.js +5 -3
  282. package/dist/memory/thread-history.d.ts +66 -24
  283. package/dist/memory/thread-history.js +212 -79
  284. package/dist/memory/thread-store.d.ts +26 -17
  285. package/dist/memory/thread-store.js +15 -9
  286. package/dist/memory/tool-call-integrity.d.ts +2 -2
  287. package/dist/memory/tool-call-integrity.js +4 -3
  288. package/dist/memory/working-memory.d.ts +16 -12
  289. package/dist/memory/working-memory.js +72 -61
  290. package/dist/prompts/briefing.d.ts +63 -9
  291. package/dist/prompts/briefing.js +130 -3
  292. package/dist/prompts/planner.js +13 -2
  293. package/dist/prompts/synthesis-agent.d.ts +1 -1
  294. package/dist/prompts/synthesis-agent.js +6 -14
  295. package/dist/provenance/collector.d.ts +6 -6
  296. package/dist/provenance/collector.js +15 -8
  297. package/dist/provenance/exec-frame.d.ts +2 -2
  298. package/dist/provenance/exec-frame.js +6 -1
  299. package/dist/provenance/seam.d.ts +24 -19
  300. package/dist/provenance/seam.js +7 -5
  301. package/dist/provenance/types.d.ts +6 -6
  302. package/dist/providers/ai-sdk.d.ts +113 -62
  303. package/dist/providers/ai-sdk.js +303 -458
  304. package/dist/providers/embedding.d.ts +2 -2
  305. package/dist/providers/embedding.js +1 -1
  306. package/dist/providers/errors.d.ts +22 -2
  307. package/dist/providers/errors.js +98 -50
  308. package/dist/providers/prompt-cache.d.ts +8 -8
  309. package/dist/providers/prompt-cache.js +13 -11
  310. package/dist/providers/reasoning.d.ts +2 -2
  311. package/dist/providers/reasoning.js +2 -2
  312. package/dist/providers/types.d.ts +59 -92
  313. package/dist/reference-data/catalog.d.ts +2 -15
  314. package/dist/reference-data/catalog.js +166 -10
  315. package/dist/reference-data/receipt.d.ts +2 -2
  316. package/dist/report-model/assert-rules.js +1 -1
  317. package/dist/report-model/authoring-grammar.d.ts +209 -231
  318. package/dist/report-model/block-walk.d.ts +10 -10
  319. package/dist/report-model/block-walk.js +2 -0
  320. package/dist/report-model/draft-finish.d.ts +8 -8
  321. package/dist/report-model/draft-finish.js +1 -1
  322. package/dist/report-model/draft-hash.js +8 -7
  323. package/dist/report-model/draft-operations.d.ts +22 -10
  324. package/dist/report-model/draft-operations.js +48 -30
  325. package/dist/report-model/draft-read.d.ts +19 -7
  326. package/dist/report-model/draft-read.js +16 -6
  327. package/dist/report-model/draft.d.ts +844 -2
  328. package/dist/report-model/draft.js +3 -1
  329. package/dist/report-model/fixture-resolver.js +39 -16
  330. package/dist/report-model/pin-snapshot.d.ts +2 -2
  331. package/dist/report-model/pin-snapshot.js +15 -15
  332. package/dist/report-model/production-resolver.d.ts +18 -18
  333. package/dist/report-model/production-resolver.js +50 -42
  334. package/dist/report-model/reference-resolver.d.ts +26 -10
  335. package/dist/report-model/reference-resolver.js +68 -5
  336. package/dist/report-model/reference-stamp.js +30 -38
  337. package/dist/report-model/structural-validation.js +12 -4
  338. package/dist/report-model/validate.d.ts +7 -7
  339. package/dist/report-model/validate.js +6 -6
  340. package/dist/report-render/assets.d.ts +2 -2
  341. package/dist/report-render/assets.js +27 -3
  342. package/dist/report-render/chart-export.d.ts +10 -2
  343. package/dist/report-render/chart-export.js +37 -11
  344. package/dist/report-render/chart-presets.d.ts +8 -8
  345. package/dist/report-render/chart-presets.js +3 -3
  346. package/dist/report-render/chart-renderers.d.ts +23 -16
  347. package/dist/report-render/chart-renderers.js +74 -53
  348. package/dist/report-render/chart-toolbox.d.ts +2 -2
  349. package/dist/report-render/chart-toolbox.js +7 -6
  350. package/dist/report-render/chart.d.ts +15 -16
  351. package/dist/report-render/chart.js +369 -252
  352. package/dist/report-render/design.d.ts +36 -297
  353. package/dist/report-render/design.js +0 -12
  354. package/dist/report-render/figures/common.d.ts +12 -12
  355. package/dist/report-render/figures/common.js +42 -31
  356. package/dist/report-render/figures/dendrogram.d.ts +3 -3
  357. package/dist/report-render/figures/dendrogram.js +10 -10
  358. package/dist/report-render/figures/dense.js +15 -8
  359. package/dist/report-render/figures/dotplot.js +46 -33
  360. package/dist/report-render/figures/embedding.js +52 -43
  361. package/dist/report-render/figures/equal-units.d.ts +10 -10
  362. package/dist/report-render/figures/equal-units.js +27 -27
  363. package/dist/report-render/figures/forest.js +9 -7
  364. package/dist/report-render/figures/gsea.js +21 -11
  365. package/dist/report-render/figures/heatmap.js +13 -9
  366. package/dist/report-render/figures/index.d.ts +10 -10
  367. package/dist/report-render/figures/index.js +4 -2
  368. package/dist/report-render/figures/km.js +10 -9
  369. package/dist/report-render/figures/label-room.d.ts +12 -12
  370. package/dist/report-render/figures/label-room.js +7 -2
  371. package/dist/report-render/figures/locuszoom.d.ts +2 -2
  372. package/dist/report-render/figures/locuszoom.js +59 -31
  373. package/dist/report-render/figures/lollipop.js +3 -2
  374. package/dist/report-render/figures/ma.js +8 -4
  375. package/dist/report-render/figures/manhattan.d.ts +1 -2
  376. package/dist/report-render/figures/manhattan.js +52 -34
  377. package/dist/report-render/figures/oncoprint.js +4 -5
  378. package/dist/report-render/figures/pca.js +25 -11
  379. package/dist/report-render/figures/qq.js +20 -9
  380. package/dist/report-render/figures/roc.js +1 -1
  381. package/dist/report-render/figures/sankey.d.ts +2 -2
  382. package/dist/report-render/figures/sankey.js +11 -10
  383. package/dist/report-render/figures/upset.d.ts +6 -6
  384. package/dist/report-render/figures/upset.js +7 -4
  385. package/dist/report-render/figures/volcano.js +12 -10
  386. package/dist/report-render/hybrid-svg.d.ts +4 -4
  387. package/dist/report-render/hybrid-svg.js +7 -5
  388. package/dist/report-render/number-format.d.ts +4 -4
  389. package/dist/report-render/number-format.js +62 -27
  390. package/dist/report-render/page.js +2 -1
  391. package/dist/report-render/provenance-data.d.ts +2 -2
  392. package/dist/report-render/references.d.ts +4 -4
  393. package/dist/report-render/render.d.ts +2 -2
  394. package/dist/report-render/render.js +10 -11
  395. package/dist/report-render/script-json.js +1 -1
  396. package/dist/report-render/table-data.d.ts +6 -6
  397. package/dist/report-render/test/options.d.ts +49 -0
  398. package/dist/report-render/test/options.js +143 -0
  399. package/dist/report-render/test/page-function.d.ts +19 -0
  400. package/dist/report-render/test/page-function.js +33 -0
  401. package/dist/report-render/types.d.ts +10 -10
  402. package/dist/report-render/value-bridge.d.ts +4 -4
  403. package/dist/report-render/value-bridge.js +27 -14
  404. package/dist/report-render/views/chart-view.d.ts +2 -2
  405. package/dist/report-render/views/chart-view.js +2 -2
  406. package/dist/report-render/views/lineage.d.ts +6 -6
  407. package/dist/report-render/views/lineage.js +2 -0
  408. package/dist/report-render/views/page-view.d.ts +2 -2
  409. package/dist/report-render/views/page-view.js +1 -0
  410. package/dist/report-render/views/prose.js +25 -8
  411. package/dist/report-render/views/references-view.js +12 -1
  412. package/dist/report-render/views/values.js +1 -1
  413. package/dist/runtime/assemble.d.ts +53 -26
  414. package/dist/runtime/assemble.js +103 -56
  415. package/dist/runtime/boot.d.ts +8 -7
  416. package/dist/runtime/boot.js +1 -1
  417. package/dist/runtime/connection-budget.d.ts +6 -6
  418. package/dist/runtime/connection-budget.js +1 -1
  419. package/dist/runtime/dbos.d.ts +29 -19
  420. package/dist/runtime/dbos.js +35 -20
  421. package/dist/runtime/result-serialization.js +18 -5
  422. package/dist/runtime/shutdown.d.ts +2 -2
  423. package/dist/sandbox/client.d.ts +7 -3
  424. package/dist/sandbox/cpu-files.d.ts +2 -2
  425. package/dist/sandbox/cpu-files.js +21 -4
  426. package/dist/sandbox/create-sandbox.d.ts +7 -8
  427. package/dist/sandbox/create-sandbox.js +6 -12
  428. package/dist/sandbox/docker-client.d.ts +48 -3
  429. package/dist/sandbox/docker-client.js +10 -6
  430. package/dist/sandbox/estimate-data-profile-resources.js +2 -7
  431. package/dist/sandbox/exec-outcome.d.ts +2 -2
  432. package/dist/sandbox/exec-outcome.js +1 -1
  433. package/dist/sandbox/exec.d.ts +10 -6
  434. package/dist/sandbox/exec.js +27 -12
  435. package/dist/sandbox/execution-id.js +14 -6
  436. package/dist/sandbox/farm.d.ts +2 -2
  437. package/dist/sandbox/farm.js +22 -27
  438. package/dist/sandbox/identity.d.ts +7 -0
  439. package/dist/sandbox/identity.js +14 -3
  440. package/dist/sandbox/image-packages.d.ts +26 -4
  441. package/dist/sandbox/image-packages.js +29 -27
  442. package/dist/sandbox/k8s-client.d.ts +35 -8
  443. package/dist/sandbox/k8s-client.js +6 -5
  444. package/dist/sandbox/labels.js +1 -0
  445. package/dist/sandbox/liveness.js +3 -1
  446. package/dist/sandbox/mount-plan.d.ts +10 -10
  447. package/dist/sandbox/mount-plan.js +13 -14
  448. package/dist/sandbox/notification-sweep.d.ts +4 -4
  449. package/dist/sandbox/notification-sweep.js +4 -7
  450. package/dist/sandbox/package-identity.d.ts +6 -13
  451. package/dist/sandbox/package-identity.js +46 -28
  452. package/dist/sandbox/reaper.d.ts +10 -10
  453. package/dist/sandbox/reaper.js +4 -6
  454. package/dist/sandbox/sandbox-error.d.ts +2 -9
  455. package/dist/sandbox/sandbox-error.js +21 -8
  456. package/dist/sandbox/sandbox-step-translate.d.ts +8 -5
  457. package/dist/sandbox/sandbox-step-translate.js +22 -8
  458. package/dist/sandbox/step-sandbox.d.ts +47 -0
  459. package/dist/sandbox/step-sandbox.js +53 -0
  460. package/dist/sandbox/types.d.ts +18 -19
  461. package/dist/sandbox/types.js +1 -1
  462. package/dist/schemas/artifact-manifest.d.ts +4 -4
  463. package/dist/schemas/data-profile-schemas.d.ts +351 -306
  464. package/dist/schemas/file-metadata.js +2 -4
  465. package/dist/schemas/plan-schemas.d.ts +79 -25
  466. package/dist/schemas/plan-schemas.js +1 -1
  467. package/dist/schemas/run-synthesis.d.ts +95 -26
  468. package/dist/schemas/run-synthesis.js +3 -1
  469. package/dist/schemas/validate-plan.d.ts +4 -4
  470. package/dist/schemas/validate-plan.js +17 -5
  471. package/dist/schemas/workflow-state.d.ts +127 -14
  472. package/dist/schemas/workflow-state.js +56 -2
  473. package/dist/state/active-turns.d.ts +36 -0
  474. package/dist/state/active-turns.js +67 -0
  475. package/dist/state/analyses-metrics.d.ts +8 -8
  476. package/dist/state/analyses-metrics.js +4 -4
  477. package/dist/state/analyses.d.ts +0 -14
  478. package/dist/state/analyses.js +0 -32
  479. package/dist/state/artifacts.d.ts +47 -18
  480. package/dist/state/artifacts.js +48 -7
  481. package/dist/state/data-profile.d.ts +2 -2
  482. package/dist/state/db.d.ts +12 -2
  483. package/dist/state/db.js +5 -0
  484. package/dist/state/edit-intents.d.ts +4 -0
  485. package/dist/state/edit-intents.js +71 -0
  486. package/dist/state/index.d.ts +5 -5
  487. package/dist/state/index.js +3 -3
  488. package/dist/state/init.d.ts +2 -1
  489. package/dist/state/init.js +5 -2
  490. package/dist/state/migrations/20260927120000_baseline.js +3 -1
  491. package/dist/state/migrations/20261026120000_add_the_edit_intents.d.ts +7 -0
  492. package/dist/state/migrations/20261026120000_add_the_edit_intents.js +21 -0
  493. package/dist/state/migrations/20261027120000_record_the_applied_memory_edits.d.ts +7 -0
  494. package/dist/state/migrations/20261027120000_record_the_applied_memory_edits.js +16 -0
  495. package/dist/state/migrations/20261027120100_store_the_authoring_results.d.ts +8 -0
  496. package/dist/state/migrations/20261027120100_store_the_authoring_results.js +20 -0
  497. package/dist/state/migrations/20261027120200_key_the_groups_of_a_turn.d.ts +7 -0
  498. package/dist/state/migrations/20261027120200_key_the_groups_of_a_turn.js +12 -0
  499. package/dist/state/migrations/20261027120300_mark_the_active_turn_of_a_thread.d.ts +7 -0
  500. package/dist/state/migrations/20261027120300_mark_the_active_turn_of_a_thread.js +11 -0
  501. package/dist/state/migrations/20261028120000_record_the_paused_work.d.ts +7 -0
  502. package/dist/state/migrations/20261028120000_record_the_paused_work.js +25 -0
  503. package/dist/state/migrations/20261028120100_end_the_suspended_runs.d.ts +8 -0
  504. package/dist/state/migrations/20261028120100_end_the_suspended_runs.js +13 -0
  505. package/dist/state/migrations/20261029120000_reference_the_run_mandate.d.ts +7 -0
  506. package/dist/state/migrations/20261029120000_reference_the_run_mandate.js +23 -0
  507. package/dist/state/migrations/20261029120100_record_the_run_session_of_a_pause.d.ts +7 -0
  508. package/dist/state/migrations/20261029120100_record_the_run_session_of_a_pause.js +11 -0
  509. package/dist/state/migrations/index.js +18 -0
  510. package/dist/state/paused-work.d.ts +52 -0
  511. package/dist/state/paused-work.js +105 -0
  512. package/dist/state/plans.d.ts +27 -8
  513. package/dist/state/plans.js +14 -11
  514. package/dist/state/purge-analysis.d.ts +6 -6
  515. package/dist/state/purge-analysis.js +10 -2
  516. package/dist/state/report-session-state.d.ts +43 -18
  517. package/dist/state/report-session-state.js +43 -4
  518. package/dist/state/report-versions.d.ts +16 -11
  519. package/dist/state/report-versions.js +5 -3
  520. package/dist/state/runs.d.ts +70 -25
  521. package/dist/state/runs.js +127 -64
  522. package/dist/state/schema.d.ts +18 -21
  523. package/dist/state/schema.js +4 -5
  524. package/dist/state/snapshot-parse.d.ts +2 -2
  525. package/dist/state/snapshot-parse.js +14 -8
  526. package/dist/state/step-executions.d.ts +29 -8
  527. package/dist/state/step-executions.js +28 -4
  528. package/dist/state/tool-outputs.d.ts +2 -2
  529. package/dist/state/tool-outputs.js +2 -1
  530. package/dist/state/vector-store.d.ts +16 -16
  531. package/dist/state/vector-store.js +11 -7
  532. package/dist/tasks/data-profile-absorb.d.ts +3 -3
  533. package/dist/tasks/data-profile-absorb.js +21 -16
  534. package/dist/tasks/data-profile-activity.d.ts +5 -5
  535. package/dist/tasks/data-profile-activity.js +5 -5
  536. package/dist/tasks/data-profile-index.d.ts +4 -4
  537. package/dist/tasks/data-profile-index.js +32 -17
  538. package/dist/tasks/data-profile-resolve.d.ts +8 -8
  539. package/dist/tasks/data-profile-resolve.js +88 -62
  540. package/dist/tasks/data-profile.d.ts +40 -31
  541. package/dist/tasks/data-profile.js +138 -95
  542. package/dist/tasks/extract-values.d.ts +26 -79
  543. package/dist/tasks/extract-values.js +48 -108
  544. package/dist/tasks/refresh-regulatory-corpus.d.ts +4 -20
  545. package/dist/tasks/refresh-regulatory-corpus.js +12 -8
  546. package/dist/tasks/regulatory-corpus-boot-refresh.d.ts +2 -2
  547. package/dist/tasks/regulatory-corpus-boot-refresh.js +12 -10
  548. package/dist/testing.d.ts +60 -0
  549. package/dist/testing.js +96 -0
  550. package/dist/tools/ad-hoc-router.d.ts +11 -9
  551. package/dist/tools/ad-hoc-router.js +80 -51
  552. package/dist/tools/analysis-invocation.d.ts +7 -0
  553. package/dist/tools/analysis-invocation.js +29 -5
  554. package/dist/tools/approval/contract.d.ts +8 -52
  555. package/dist/tools/approval/contract.js +7 -36
  556. package/dist/tools/approval/gateway.d.ts +27 -28
  557. package/dist/tools/approval/gateway.js +33 -130
  558. package/dist/tools/approval/queries.d.ts +6 -11
  559. package/dist/tools/approval/queries.js +43 -29
  560. package/dist/tools/approval/uuidv7.js +2 -2
  561. package/dist/tools/bio/chembl.d.ts +3 -3
  562. package/dist/tools/bio/chembl.js +10 -0
  563. package/dist/tools/bio/comptox.d.ts +25 -8
  564. package/dist/tools/bio/comptox.js +4 -2
  565. package/dist/tools/bio/drug-gene-interactions.d.ts +27 -17
  566. package/dist/tools/bio/drug-gene-interactions.js +11 -8
  567. package/dist/tools/bio/gene-disease-evidence.d.ts +61 -15
  568. package/dist/tools/bio/gene-disease-evidence.js +10 -6
  569. package/dist/tools/bio/gene-preclinical-profile.d.ts +11 -11
  570. package/dist/tools/bio/keys.d.ts +2 -2
  571. package/dist/tools/bio/keys.js +3 -3
  572. package/dist/tools/bio/lookup-annotation.d.ts +5 -5
  573. package/dist/tools/bio/lookup-annotation.js +3 -0
  574. package/dist/tools/bio/opentargets.d.ts +1 -1
  575. package/dist/tools/bio/opentargets.js +6 -0
  576. package/dist/tools/bio/pubchem.d.ts +2 -2
  577. package/dist/tools/bio/pubchem.js +6 -0
  578. package/dist/tools/bio/pubmed.d.ts +26 -16
  579. package/dist/tools/bio/pubmed.js +9 -3
  580. package/dist/tools/bio/search-clinical-trials.d.ts +4 -4
  581. package/dist/tools/bio/search-clinical-trials.js +5 -1
  582. package/dist/tools/bio/search-faers.d.ts +2 -2
  583. package/dist/tools/bio/search-faers.js +1 -1
  584. package/dist/tools/bio/search-gene.d.ts +2 -2
  585. package/dist/tools/bio/search-gene.js +1 -0
  586. package/dist/tools/bio/search-geo-datasets.d.ts +4 -4
  587. package/dist/tools/bio/search-geo-datasets.js +5 -5
  588. package/dist/tools/bio/search-interactions.d.ts +1 -1
  589. package/dist/tools/bio/search-patents.d.ts +28 -22
  590. package/dist/tools/bio/search-patents.js +20 -17
  591. package/dist/tools/bio/search-protein.d.ts +2 -2
  592. package/dist/tools/bio/search-protein.js +1 -1
  593. package/dist/tools/bio/search-regulatory-approvals.d.ts +64 -18
  594. package/dist/tools/bio/search-regulatory-approvals.js +21 -16
  595. package/dist/tools/bio/target-safety.d.ts +8 -8
  596. package/dist/tools/bio/target-safety.js +11 -6
  597. package/dist/tools/capability-data.d.ts +40 -0
  598. package/dist/tools/capability-data.js +74 -0
  599. package/dist/tools/define-tool.d.ts +55 -46
  600. package/dist/tools/define-tool.js +39 -27
  601. package/dist/tools/display/normalize-echart-spec.d.ts +2 -2
  602. package/dist/tools/display/normalize-echart-spec.js +51 -27
  603. package/dist/tools/display/show-user.d.ts +2 -2
  604. package/dist/tools/display/show-user.js +1 -1
  605. package/dist/tools/execute-analysis.d.ts +54 -17
  606. package/dist/tools/execute-analysis.js +193 -62
  607. package/dist/tools/knowledge/check.d.ts +182 -0
  608. package/dist/tools/knowledge/check.js +94 -0
  609. package/dist/tools/knowledge/client.d.ts +351 -0
  610. package/dist/tools/knowledge/client.js +319 -0
  611. package/dist/tools/knowledge/environment.d.ts +78 -0
  612. package/dist/tools/knowledge/environment.js +116 -0
  613. package/dist/tools/knowledge/index.d.ts +49 -0
  614. package/dist/tools/knowledge/index.js +70 -0
  615. package/dist/tools/knowledge/local-slots.d.ts +62 -0
  616. package/dist/tools/knowledge/local-slots.js +184 -0
  617. package/dist/tools/knowledge/pin.d.ts +14 -0
  618. package/dist/tools/knowledge/pin.js +17 -0
  619. package/dist/tools/knowledge/recommend.d.ts +67 -0
  620. package/dist/tools/knowledge/recommend.js +106 -0
  621. package/dist/tools/knowledge/situation.d.ts +143 -0
  622. package/dist/tools/knowledge/situation.js +157 -0
  623. package/dist/tools/knowledge/skeleton.d.ts +69 -0
  624. package/dist/tools/knowledge/skeleton.js +201 -0
  625. package/dist/tools/knowledge/template.d.ts +139 -0
  626. package/dist/tools/knowledge/template.js +273 -0
  627. package/dist/tools/lib/alphafold-client.js +2 -1
  628. package/dist/tools/lib/amass-client.d.ts +28 -28
  629. package/dist/tools/lib/amass-client.js +20 -10
  630. package/dist/tools/lib/api-utils.d.ts +13 -3
  631. package/dist/tools/lib/api-utils.js +17 -3
  632. package/dist/tools/lib/bgee-client.d.ts +6 -6
  633. package/dist/tools/lib/bgee-client.js +16 -10
  634. package/dist/tools/lib/cbioportal-client.d.ts +4 -4
  635. package/dist/tools/lib/cbioportal-client.js +9 -8
  636. package/dist/tools/lib/chembl-client.d.ts +14 -14
  637. package/dist/tools/lib/chembl-client.js +11 -4
  638. package/dist/tools/lib/clinical-benchmarks-client.d.ts +4 -4
  639. package/dist/tools/lib/clinical-benchmarks-client.js +4 -7
  640. package/dist/tools/lib/clinical-trials-client.d.ts +18 -18
  641. package/dist/tools/lib/clinical-trials-client.js +10 -10
  642. package/dist/tools/lib/clinvar-client.d.ts +2 -2
  643. package/dist/tools/lib/clinvar-client.js +6 -6
  644. package/dist/tools/lib/ctx-ops.d.ts +23 -23
  645. package/dist/tools/lib/ctx-ops.js +13 -10
  646. package/dist/tools/lib/dgidb-client.d.ts +6 -6
  647. package/dist/tools/lib/dgidb-client.js +10 -12
  648. package/dist/tools/lib/disgenet-client.d.ts +4 -4
  649. package/dist/tools/lib/ema-client.d.ts +2 -2
  650. package/dist/tools/lib/ensembl-client.d.ts +4 -4
  651. package/dist/tools/lib/ensembl-client.js +5 -4
  652. package/dist/tools/lib/gwas-catalog-client.d.ts +4 -4
  653. package/dist/tools/lib/gwas-catalog-client.js +17 -17
  654. package/dist/tools/lib/html-text.d.ts +6 -0
  655. package/dist/tools/lib/html-text.js +9 -0
  656. package/dist/tools/lib/identifier-resolver.d.ts +4 -4
  657. package/dist/tools/lib/identifier-resolver.js +7 -3
  658. package/dist/tools/lib/impc-client.d.ts +8 -8
  659. package/dist/tools/lib/impc-client.js +46 -35
  660. package/dist/tools/lib/iuphar-client.d.ts +2 -2
  661. package/dist/tools/lib/iuphar-client.js +7 -16
  662. package/dist/tools/lib/monarch-client.d.ts +4 -4
  663. package/dist/tools/lib/openfda-client.d.ts +22 -22
  664. package/dist/tools/lib/openfda-client.js +23 -22
  665. package/dist/tools/lib/opentargets-client.d.ts +12 -12
  666. package/dist/tools/lib/pathway-client.d.ts +4 -4
  667. package/dist/tools/lib/pathway-client.js +15 -19
  668. package/dist/tools/lib/pharmgkb-client.d.ts +2 -2
  669. package/dist/tools/lib/pharmgkb-client.js +1 -1
  670. package/dist/tools/lib/protein-family-modality.d.ts +2 -2
  671. package/dist/tools/lib/protein-family-modality.js +0 -2
  672. package/dist/tools/lib/protein-family-normalize.js +7 -0
  673. package/dist/tools/lib/pubchem-client.d.ts +2 -2
  674. package/dist/tools/lib/pubchem-client.js +1 -0
  675. package/dist/tools/lib/pubchem-ops.d.ts +4 -4
  676. package/dist/tools/lib/pubchem-ops.js +8 -0
  677. package/dist/tools/lib/pubmed-client.d.ts +9 -9
  678. package/dist/tools/lib/pubmed-client.js +1 -1
  679. package/dist/tools/lib/string-client.d.ts +6 -6
  680. package/dist/tools/lib/uniprot-client.d.ts +8 -8
  681. package/dist/tools/lib/uniprot-client.js +5 -1
  682. package/dist/tools/memory/update-working-memory.d.ts +16 -13
  683. package/dist/tools/memory/update-working-memory.js +21 -3
  684. package/dist/tools/read-tool-output.js +8 -2
  685. package/dist/tools/registry.d.ts +2 -2
  686. package/dist/tools/report-authoring/authoring-tools.d.ts +54 -23
  687. package/dist/tools/report-authoring/authoring-tools.js +128 -62
  688. package/dist/tools/report-session/derive-table.d.ts +19 -59
  689. package/dist/tools/report-session/derive-table.js +120 -122
  690. package/dist/tools/report-session/examine-page.d.ts +6 -6
  691. package/dist/tools/report-session/examine-page.js +14 -12
  692. package/dist/tools/report-session/list-artifacts.d.ts +6 -6
  693. package/dist/tools/report-session/list-artifacts.js +5 -5
  694. package/dist/tools/report-session/page-faults.d.ts +6 -6
  695. package/dist/tools/report-session/page-faults.js +3 -1
  696. package/dist/tools/report-session/preview-report.d.ts +4 -3
  697. package/dist/tools/report-session/preview-report.js +26 -7
  698. package/dist/tools/report-session/record-version.d.ts +9 -4
  699. package/dist/tools/report-session/record-version.js +16 -9
  700. package/dist/tools/report-session/session-page-publisher.d.ts +6 -6
  701. package/dist/tools/research/generate-analogy-report.d.ts +14 -7
  702. package/dist/tools/research/generate-analogy-report.js +80 -76
  703. package/dist/tools/research/generate-plan.d.ts +39 -16
  704. package/dist/tools/research/generate-plan.js +565 -338
  705. package/dist/tools/research/guarded-address.d.ts +20 -0
  706. package/dist/tools/research/guarded-address.js +149 -0
  707. package/dist/tools/research/inspect-data-profile.d.ts +27 -20
  708. package/dist/tools/research/inspect-data-profile.js +26 -25
  709. package/dist/tools/research/inspect-run.d.ts +54 -27
  710. package/dist/tools/research/inspect-run.js +50 -40
  711. package/dist/tools/research/literature-reviewer.d.ts +8 -7
  712. package/dist/tools/research/literature-reviewer.js +29 -28
  713. package/dist/tools/research/search-arxiv.d.ts +1 -1
  714. package/dist/tools/research/search-arxiv.js +1 -1
  715. package/dist/tools/research/search-github-repos.d.ts +10 -7
  716. package/dist/tools/research/search-github-repos.js +25 -22
  717. package/dist/tools/research/search-semantic-scholar.js +1 -1
  718. package/dist/tools/research/searxng-engine.d.ts +40 -0
  719. package/dist/tools/research/searxng-engine.js +122 -0
  720. package/dist/tools/research/web-fetch.d.ts +127 -0
  721. package/dist/tools/research/web-fetch.js +618 -0
  722. package/dist/tools/research/web-search.d.ts +84 -0
  723. package/dist/tools/research/web-search.js +117 -0
  724. package/dist/tools/sandbox/link-packages.d.ts +11 -7
  725. package/dist/tools/sandbox/link-packages.js +11 -8
  726. package/dist/tools/sandbox/list-available-packages.d.ts +24 -12
  727. package/dist/tools/sandbox/list-available-packages.js +43 -29
  728. package/dist/tools/sandbox/list-available-refs.d.ts +38 -14
  729. package/dist/tools/sandbox/list-available-refs.js +119 -37
  730. package/dist/tools/sandbox/report-blocker.d.ts +30 -37
  731. package/dist/tools/sandbox/report-blocker.js +22 -68
  732. package/dist/tools/sandbox/skills.d.ts +16 -12
  733. package/dist/tools/sandbox/skills.js +16 -12
  734. package/dist/tools/sandbox/submit-file-metadata.d.ts +12 -9
  735. package/dist/tools/sandbox/submit-file-metadata.js +18 -21
  736. package/dist/tools/start-report-session.d.ts +13 -5
  737. package/dist/tools/start-report-session.js +35 -8
  738. package/dist/tools/terminal-text.d.ts +14 -0
  739. package/dist/tools/terminal-text.js +51 -0
  740. package/dist/tools/workspace/decision-record.d.ts +81 -0
  741. package/dist/tools/workspace/decision-record.js +127 -0
  742. package/dist/tools/workspace/edit-file.d.ts +59 -18
  743. package/dist/tools/workspace/edit-file.js +98 -15
  744. package/dist/tools/workspace/execute-command.d.ts +31 -12
  745. package/dist/tools/workspace/execute-command.js +37 -8
  746. package/dist/tools/workspace/file-stat.d.ts +6 -3
  747. package/dist/tools/workspace/grep.d.ts +10 -7
  748. package/dist/tools/workspace/grep.js +9 -3
  749. package/dist/tools/workspace/index.d.ts +1 -0
  750. package/dist/tools/workspace/index.js +1 -0
  751. package/dist/tools/workspace/list-files.d.ts +6 -3
  752. package/dist/tools/workspace/mutator.d.ts +28 -15
  753. package/dist/tools/workspace/mutator.js +107 -53
  754. package/dist/tools/workspace/read-file.d.ts +8 -5
  755. package/dist/tools/workspace/result-bounds.d.ts +5 -5
  756. package/dist/tools/workspace/result-bounds.js +4 -2
  757. package/dist/tools/workspace/run-exec.d.ts +2 -2
  758. package/dist/tools/workspace/run-exec.js +3 -3
  759. package/dist/tools/workspace/scan-inputs.d.ts +8 -5
  760. package/dist/tools/workspace/scan-inputs.js +17 -5
  761. package/dist/tools/workspace/show-file.d.ts +1 -1
  762. package/dist/tools/workspace/show-file.js +2 -1
  763. package/dist/tools/workspace/show-plan.d.ts +8 -5
  764. package/dist/tools/workspace/show-plan.js +9 -8
  765. package/dist/tools/workspace/workspace-search.d.ts +41 -13
  766. package/dist/tools/workspace/workspace-search.js +27 -14
  767. package/dist/tools/workspace/write-file.d.ts +9 -7
  768. package/dist/workflows/execute-analysis-scheduler.d.ts +9 -9
  769. package/dist/workflows/execute-analysis-scheduler.js +6 -3
  770. package/dist/workflows/execute-analysis.d.ts +100 -76
  771. package/dist/workflows/execute-analysis.js +380 -247
  772. package/dist/workflows/pause.d.ts +71 -0
  773. package/dist/workflows/pause.js +173 -0
  774. package/dist/workflows/sandbox-step.d.ts +50 -61
  775. package/dist/workflows/sandbox-step.js +99 -106
  776. package/dist/workflows/test/sql-writes.d.ts +21 -0
  777. package/dist/workflows/test/sql-writes.js +36 -0
  778. package/dist/workspace/filesystem.d.ts +6 -6
  779. package/dist/workspace/filesystem.js +10 -8
  780. package/dist/workspace/paths.d.ts +1 -1
  781. package/dist/workspace/paths.js +15 -4
  782. package/dist/workspace/search-config.d.ts +2 -2
  783. package/dist/workspace/search-config.js +1 -1
  784. package/package.json +25 -22
  785. package/dist/loop/continue-agent.d.ts +0 -40
  786. package/dist/loop/continue-agent.js +0 -38
  787. package/dist/loop/genai-spans.d.ts +0 -47
  788. package/dist/loop/genai-spans.js +0 -134
  789. package/dist/loop/run-agent.d.ts +0 -236
  790. package/dist/loop/run-agent.js +0 -1110
  791. package/dist/loop/run-step.d.ts +0 -29
  792. package/dist/loop/run-step.js +0 -34
  793. package/dist/loop/run-to-terminal.d.ts +0 -66
  794. package/dist/loop/run-to-terminal.js +0 -90
  795. package/dist/loop/tool-mask.d.ts +0 -23
  796. package/dist/loop/tool-mask.js +0 -46
  797. package/dist/providers/streaming-chat.d.ts +0 -32
  798. package/dist/providers/streaming-chat.js +0 -91
  799. package/dist/tasks/derive-table-exec.d.ts +0 -54
  800. package/dist/tasks/derive-table-exec.js +0 -86
  801. package/dist/workflows/suspension.d.ts +0 -32
  802. package/dist/workflows/suspension.js +0 -38
@@ -37,7 +37,7 @@ export function summarizeExec(result) {
37
37
  exitCode: result.exitCode,
38
38
  timedOut: result.timedOut,
39
39
  stderrTotalBytes: result.stderrTotalBytes ?? Buffer.byteLength(result.stderr, "utf8"),
40
- ...(result.syntheticFailure ? { syntheticFailureReason: result.syntheticFailure.reason } : {}),
40
+ syntheticFailureReason: result.syntheticFailure?.reason,
41
41
  };
42
42
  }
43
43
  /**
@@ -18,13 +18,17 @@ export declare class ExecTimeoutError extends Error {
18
18
  constructor(execId: string);
19
19
  }
20
20
  /** The effects of one exec. Each member has a default, and a test replaces it. */
21
- export interface ExecDeps {
21
+ export type ExecDeps = {
22
22
  /** Defaults to `globalThis.fetch`. */
23
23
  readonly fetch?: typeof fetch;
24
- /** The clock of the deadline and of the cancel reads. Defaults to `Date.now`. */
25
- readonly now?: () => number;
26
- /** The pause between two polls. Defaults to a timer. */
27
- readonly sleep?: (ms: number) => Promise<void>;
24
+ /**
25
+ * The clock of the deadline, of the cancel reads, and of the pause between
26
+ * two polls. Defaults to the system clock and a timer.
27
+ */
28
+ readonly clock?: {
29
+ now(): number;
30
+ wait(ms: number, signal?: AbortSignal): Promise<void>;
31
+ };
28
32
  /**
29
33
  * Sink for advisory warnings: events that the sandbox ring shed. Defaults to
30
34
  * `DBOS.logger.warn`. The terminal result, not the event stream, is the
@@ -41,7 +45,7 @@ export interface ExecDeps {
41
45
  readonly isCancelled?: () => Promise<boolean>;
42
46
  /** Per-stream retention budget sent with the submit. Defaults to `EXEC_STREAM_BYTE_CAP`. */
43
47
  readonly execStreamByteCap?: number;
44
- }
48
+ };
45
49
  /**
46
50
  * The id of the exec that runs in the current durable step: the workflow id
47
51
  * and the function id of the step. Both are stable across a replay, and DBOS
@@ -12,8 +12,13 @@
12
12
  * finished exec instead of a second run. The poll then starts at cursor 0, and
13
13
  * the caller gets the events of the exec again.
14
14
  */
15
+ import { errorMessageOf } from "../lib/thrown.js";
16
+ import { textOf } from "../lib/unknown-text.js";
17
+ import { setTimeout as sleep } from "node:timers/promises";
15
18
  import { DBOS, Error as DBOSErrors, StatusString } from "@dbos-inc/dbos-sdk";
16
19
  import { untracedFetch } from "../lib/otel-spans.js";
20
+ import { parseJsonAs } from "../lib/parse-json.js";
21
+ import { presentFirst } from "../lib/present.js";
17
22
  import { EXEC_STREAM_BYTE_CAP } from "../tools/workspace/result-bounds.js";
18
23
  import { createEscalationPolicy, probeLiveness, syntheticFailureReason, syntheticFailureResult } from "./liveness.js";
19
24
  import { PollResponseSchema } from "./types.js";
@@ -33,6 +38,10 @@ const SLOW_POLL_INTERVAL_MS = 10_000;
33
38
  * when the workflow is cancelled.
34
39
  */
35
40
  const CANCEL_CHECK_INTERVAL_MS = 10_000;
41
+ const systemClock = {
42
+ now: Date.now,
43
+ wait: (ms, signal) => sleep(ms, undefined, { signal }),
44
+ };
36
45
  export class ExecTimeoutError extends Error {
37
46
  execId;
38
47
  constructor(execId) {
@@ -63,15 +72,19 @@ export function stepExecId() {
63
72
  export async function runExec(ref, execId, request, emit, deadlineMs, deps = {}) {
64
73
  const fetchImpl = deps.fetch ?? fetch;
65
74
  const cap = deps.execStreamByteCap ?? EXEC_STREAM_BYTE_CAP;
66
- await submitExec(fetchImpl, ref, {
75
+ const body = {
67
76
  command: [...request.command],
68
77
  execId,
69
- ...(request.cwd === undefined ? {} : { cwd: request.cwd }),
70
- ...(request.env === undefined ? {} : { env: { ...request.env } }),
71
- ...(request.timeoutSeconds === undefined ? {} : { timeoutSeconds: request.timeoutSeconds }),
72
78
  stdoutByteCap: cap,
73
79
  stderrByteCap: cap,
74
- });
80
+ };
81
+ if (request.cwd !== undefined)
82
+ body.cwd = request.cwd;
83
+ if (request.env !== undefined)
84
+ body.env = { ...request.env };
85
+ if (request.timeoutSeconds !== undefined)
86
+ body.timeoutSeconds = request.timeoutSeconds;
87
+ await submitExec(fetchImpl, ref, body);
75
88
  return pollExec(ref, execId, emit, deadlineMs, deps);
76
89
  }
77
90
  /**
@@ -81,6 +94,7 @@ export async function runExec(ref, execId, request, emit, deadlineMs, deps = {})
81
94
  */
82
95
  async function submitExec(fetchImpl, ref, body) {
83
96
  const controller = new AbortController();
97
+ // oxlint-disable-next-line eslint-js/no-restricted-syntax -- a deadline guard, not a wait: it aborts the controller of the in-flight submit, and the finally clears it.
84
98
  const timer = setTimeout(() => controller.abort(), SUBMIT_HTTP_TIMEOUT_MS);
85
99
  try {
86
100
  const res = await untracedFetch(fetchImpl, `http://${ref.host}:${ref.port}/exec`, {
@@ -102,6 +116,7 @@ async function submitExec(fetchImpl, ref, body) {
102
116
  }
103
117
  async function pollOnce(fetchImpl, ref, execId, cursor) {
104
118
  const controller = new AbortController();
119
+ // oxlint-disable-next-line eslint-js/no-restricted-syntax -- a deadline guard, not a wait: it aborts the controller of the in-flight poll, and the finally clears it.
105
120
  const timer = setTimeout(() => controller.abort(), POLL_HTTP_TIMEOUT_MS);
106
121
  try {
107
122
  const res = await untracedFetch(fetchImpl, `http://${ref.host}:${ref.port}/exec/${encodeURIComponent(execId)}?since=${cursor}`, {
@@ -115,7 +130,7 @@ async function pollOnce(fetchImpl, ref, execId, cursor) {
115
130
  return { kind: "ok", raw: await res.text() };
116
131
  }
117
132
  catch (cause) {
118
- return { kind: "unavailable", detail: cause instanceof Error ? cause.message : String(cause) };
133
+ return { kind: "unavailable", detail: errorMessageOf(cause) ?? textOf(cause) };
119
134
  }
120
135
  finally {
121
136
  clearTimeout(timer);
@@ -132,25 +147,25 @@ async function pollOnce(fetchImpl, ref, execId, cursor) {
132
147
  */
133
148
  async function pollExec(ref, execId, emit, deadlineMs, deps) {
134
149
  const fetchImpl = deps.fetch ?? fetch;
135
- const now = deps.now ?? Date.now;
136
- const sleep = deps.sleep ?? ((ms) => new Promise((resolve) => setTimeout(resolve, ms)));
150
+ const now = deps.clock?.now.bind(deps.clock) ?? systemClock.now.bind(systemClock);
151
+ const wait = deps.clock?.wait.bind(deps.clock) ?? systemClock.wait.bind(systemClock);
137
152
  const warn = deps.warn ?? ((message) => DBOS.logger.warn(message));
138
153
  const isCancelled = deps.isCancelled ?? workflowCancelled;
139
154
  let cursor = 0;
140
155
  let pollAttempt = 0;
141
156
  let lastCancelCheckMs = now();
142
157
  const escalation = createEscalationPolicy();
143
- while (true) {
158
+ for (;;) {
144
159
  pollAttempt += 1;
145
160
  const polled = await pollOnce(fetchImpl, ref, execId, cursor);
146
161
  if (polled.kind === "ok") {
147
- const resp = PollResponseSchema.parse(JSON.parse(polled.raw));
162
+ const resp = parseJsonAs(polled.raw, PollResponseSchema);
148
163
  // Each event is emitted at most once, whatever `since` the server applied.
149
164
  const newEvents = resp.events.filter((ev) => ev.seq > cursor);
150
165
  // Sequence numbers are contiguous per exec, thus a hole between the local
151
166
  // cursor and the next delivered (or high-water) seq proves that the ring
152
167
  // shed events before the host saw them.
153
- const nextSeq = newEvents.length > 0 ? newEvents[0].seq : resp.cursor > cursor ? resp.cursor + 1 : cursor + 1;
168
+ const nextSeq = newEvents.length > 0 ? presentFirst(newEvents, "the new sandbox event").seq : resp.cursor > cursor ? resp.cursor + 1 : cursor + 1;
154
169
  const lost = nextSeq - cursor - 1;
155
170
  if (lost > 0) {
156
171
  warn(`exec[${execId}]: ${lost} progress event(s) (seq ${cursor + 1}-${cursor + lost}) shed by the sandbox ring before delivery; the terminal result is unaffected`);
@@ -184,7 +199,7 @@ async function pollExec(ref, execId, emit, deadlineMs, deps) {
184
199
  throw new DBOSErrors.DBOSWorkflowCancelledError(DBOS.workflowID ?? execId);
185
200
  }
186
201
  const intervalMs = pollAttempt <= FAST_POLL_ATTEMPTS ? FAST_POLL_INTERVAL_MS : SLOW_POLL_INTERVAL_MS;
187
- await sleep(Math.min(intervalMs, remainingMs));
202
+ await wait(Math.min(intervalMs, remainingMs));
188
203
  }
189
204
  }
190
205
  /** Read the status of the workflow that runs this exec. Outside a workflow, nothing can cancel it. */
@@ -27,12 +27,20 @@ const nanoid = customAlphabet("abcdefghijklmnopqrstuvwxyz0123456789");
27
27
  * - Truncated to 40 characters
28
28
  */
29
29
  export function sanitizeAgentName(name) {
30
- return name
31
- .toLowerCase()
32
- .replace(/[^a-z0-9-]/g, "-")
33
- .replace(/-{2,}/g, "-")
34
- .replace(/^-+|-+$/g, "")
35
- .slice(0, AGENT_NAME_MAX_LENGTH);
30
+ let out = "";
31
+ let inRun = false;
32
+ for (const char of name.toLowerCase()) {
33
+ const keeps = (char >= "a" && char <= "z") || (char >= "0" && char <= "9");
34
+ if (!keeps) {
35
+ inRun = true;
36
+ continue;
37
+ }
38
+ if (inRun && out.length > 0)
39
+ out += "-";
40
+ inRun = false;
41
+ out += char;
42
+ }
43
+ return out.slice(0, AGENT_NAME_MAX_LENGTH);
36
44
  }
37
45
  /**
38
46
  * Generate a unified execution ID for an agent invocation.
@@ -55,7 +55,7 @@ export declare const FarmLockSchema: z.ZodObject<{
55
55
  r: z.ZodOptional<z.ZodObject<{
56
56
  version: z.ZodString;
57
57
  bioc_releases: z.ZodArray<z.ZodString>;
58
- pak_lock: z.ZodOptional<z.ZodUnknown>;
58
+ pak_lock: z.ZodOptional<z.ZodCustom<unknown, unknown>>;
59
59
  }, z.core.$loose>>;
60
60
  }, z.core.$loose>;
61
61
  warm: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
@@ -65,8 +65,8 @@ export declare const FarmLockSchema: z.ZodObject<{
65
65
  merge_conflicts: z.ZodOptional<z.ZodArray<z.ZodObject<{
66
66
  entry: z.ZodString;
67
67
  action: z.ZodEnum<{
68
- skipped: "skipped";
69
68
  "kept-first": "kept-first";
69
+ skipped: "skipped";
70
70
  }>;
71
71
  }, z.core.$loose>>>;
72
72
  }, z.core.$loose>;
@@ -18,11 +18,11 @@ import { readFileSync } from "node:fs";
18
18
  import { join } from "node:path";
19
19
  import { err, ok } from "neverthrow";
20
20
  import { z } from "zod";
21
+ import { safeParseJsonAs } from "../lib/parse-json.js";
21
22
  /** The one metadata file of a farm. */
22
23
  export const FARM_LOCK_FILE = "inflexa.lock";
23
24
  /** One linked distribution. `requested` obeys the PEP 376 meaning: true for a direct ask, false for a transitive dependency. */
24
- export const FarmLockPackageSchema = z
25
- .object({
25
+ export const FarmLockPackageSchema = z.looseObject({
26
26
  name: z.string(),
27
27
  version: z.string(),
28
28
  /** The link subtree of the package (for example `python`, `cran`, `bioconductor`). */
@@ -31,52 +31,48 @@ export const FarmLockPackageSchema = z
31
31
  /** The full sha256 of the sorted store tree. */
32
32
  hash: z.string(),
33
33
  requested: z.boolean(),
34
- })
35
- .passthrough();
34
+ });
35
+ /**
36
+ * Whatever `JSON.parse` yields: a JSON value, plus Infinity — an over-large
37
+ * literal such as `1e999` reads as Infinity, which `z.json()` refuses.
38
+ * `JSON.parse` output never holds `undefined`, so the check is exact for that feed.
39
+ */
40
+ const ParsedJsonValue = z.custom((value) => value !== undefined);
36
41
  /**
37
42
  * `inflexa.lock` at schema version 1. Additive fields pass through — a
38
43
  * breaking change to the shape must move the schema number instead.
39
44
  */
40
- export const FarmLockSchema = z
41
- .object({
45
+ export const FarmLockSchema = z.looseObject({
42
46
  schema: z.literal(1),
43
47
  arch: z.enum(["amd64", "arm64"]),
44
48
  packages: z.array(FarmLockPackageSchema),
45
49
  /** Per-language provenance. Each language object owns its own fields. */
46
- languages: z
47
- .object({
48
- python: z.object({ version: z.string(), index: z.string() }).passthrough().optional(),
50
+ languages: z.looseObject({
51
+ python: z.looseObject({ version: z.string(), index: z.string() }).optional(),
49
52
  r: z
50
- .object({
53
+ .looseObject({
51
54
  version: z.string(),
52
55
  bioc_releases: z.array(z.string()),
53
56
  /** The embedded pak lock of the build, verbatim. */
54
- pak_lock: z.unknown().optional(),
57
+ pak_lock: ParsedJsonValue.optional(),
55
58
  })
56
- .passthrough()
57
59
  .optional(),
58
- })
59
- .passthrough(),
60
+ }),
60
61
  /** The warm replay record. Present in the catalog farm only. */
61
62
  warm: z
62
- .record(z.string(), z
63
- .object({
63
+ .record(z.string(), z.looseObject({
64
64
  script_sha256: z.string(),
65
65
  cache_entries: z.array(z.string()),
66
- })
67
- .passthrough())
66
+ }))
68
67
  .optional(),
69
68
  /** The top-level entries that the link merge kept-first or skipped. */
70
69
  merge_conflicts: z
71
- .array(z
72
- .object({
70
+ .array(z.looseObject({
73
71
  entry: z.string(),
74
72
  action: z.enum(["kept-first", "skipped"]),
75
- })
76
- .passthrough())
73
+ }))
77
74
  .optional(),
78
- })
79
- .passthrough();
75
+ });
80
76
  /**
81
77
  * Read and validate the `inflexa.lock` of a farm directory. The mount gate
82
78
  * accepts a farm only when this returns ok — a farm whose lock is absent,
@@ -94,14 +90,13 @@ export function readFarmLockFile(lockPath) {
94
90
  catch (cause) {
95
91
  return err({ type: "lock_unreadable", lockPath, cause });
96
92
  }
97
- let parsed;
93
+ let lock;
98
94
  try {
99
- parsed = JSON.parse(raw);
95
+ lock = safeParseJsonAs(raw, FarmLockSchema);
100
96
  }
101
97
  catch (cause) {
102
98
  return err({ type: "lock_invalid", lockPath, cause });
103
99
  }
104
- const lock = FarmLockSchema.safeParse(parsed);
105
100
  if (!lock.success) {
106
101
  return err({ type: "lock_invalid", lockPath, cause: lock.error });
107
102
  }
@@ -13,3 +13,10 @@ import type { SandboxIdentity } from "./types.js";
13
13
  * adoption is owner-label-guarded, but a unique name keeps a collision from
14
14
  * ever reaching that guard. */
15
15
  export declare function mintSandboxIdentity(runId: string): SandboxIdentity;
16
+ /**
17
+ * `sbx-{run8}-{hash12}` — the name of a sandbox whose identity comes from a
18
+ * key, not from a checkpoint. The same key gives the same name, thus a rerun
19
+ * of a step adopts the machine of the earlier attempt. The key is hashed,
20
+ * because a workflow id can hold characters that a container name refuses.
21
+ */
22
+ export declare function keyedSandboxIdentity(runId: string, key: string): SandboxIdentity;
@@ -6,14 +6,25 @@
6
6
  * spawn-step checkpoint is recoverable — the re-run adopts the existing machine
7
7
  * under the same name.
8
8
  */
9
- import { randomUUID } from "node:crypto";
9
+ import { createHash, randomUUID } from "node:crypto";
10
10
  /** `sbx-{run8}-{rand8}` — run prefix aids `kubectl` triage; the 8-hex random
11
11
  * suffix makes within-run collisions across a run's concurrent steps
12
12
  * negligible. Names are NOT the idempotency mechanism (the checkpoint is), and
13
13
  * adoption is owner-label-guarded, but a unique name keeps a collision from
14
14
  * ever reaching that guard. */
15
15
  export function mintSandboxIdentity(runId) {
16
- const run8 = runId.replace(/-/g, "").slice(0, 8);
17
- const suffix = randomUUID().replace(/-/g, "").slice(0, 8);
16
+ const run8 = runId.replaceAll("-", "").slice(0, 8);
17
+ const suffix = randomUUID().replaceAll("-", "").slice(0, 8);
18
+ return { sandboxId: `sbx-${run8}-${suffix}` };
19
+ }
20
+ /**
21
+ * `sbx-{run8}-{hash12}` — the name of a sandbox whose identity comes from a
22
+ * key, not from a checkpoint. The same key gives the same name, thus a rerun
23
+ * of a step adopts the machine of the earlier attempt. The key is hashed,
24
+ * because a workflow id can hold characters that a container name refuses.
25
+ */
26
+ export function keyedSandboxIdentity(runId, key) {
27
+ const run8 = runId.replaceAll("-", "").slice(0, 8);
28
+ const suffix = createHash("sha256").update(key, "utf8").digest("hex").slice(0, 12);
18
29
  return { sandboxId: `sbx-${run8}-${suffix}` };
19
30
  }
@@ -1,9 +1,11 @@
1
1
  /**
2
2
  * `image-packages.json` — the self-description of the sandbox image.
3
3
  *
4
- * The image bakes two package tracks that the content-addressed store cannot
5
- * hold: the conda tools at `/opt/conda` and the Node packages at `/opt/node`.
6
- * The image writes one record of them at `/opt/inflexa/image-packages.json`,
4
+ * The image bakes the package tracks that the content-addressed store cannot
5
+ * hold: the conda tools at `/opt/conda`, the Node packages at `/opt/node`,
6
+ * and the R packages that ship with the R runtime (the base and the
7
+ * recommended packages, which no farm lock lists). The image writes one
8
+ * record of them at `/opt/inflexa/image-packages.json`,
7
9
  * and the catalog build copies that record verbatim into the root of the
8
10
  * package store it packed beside it. Thus every reader of a store learns the
9
11
  * image inventory from the store alone — with no container engine, no
@@ -57,10 +59,22 @@ export declare const ImageNodePackageSchema: z.ZodObject<{
57
59
  name: z.ZodString;
58
60
  version: z.ZodString;
59
61
  }, z.core.$loose>;
62
+ /** One R package that ships with the R runtime of the image: a base package or a recommended package. */
63
+ export declare const ImageRBasePackageSchema: z.ZodObject<{
64
+ name: z.ZodString;
65
+ version: z.ZodString;
66
+ priority: z.ZodEnum<{
67
+ base: "base";
68
+ recommended: "recommended";
69
+ }>;
70
+ }, z.core.$loose>;
60
71
  /**
61
72
  * `image-packages.json` at schema version 1. The keys `system_tools` and
62
73
  * `node` are the keys of the image manifest, thus one name means one track
63
- * across the build and the reader.
74
+ * across the build and the reader. `r_base` is the track of the R runtime
75
+ * itself: the packages R ships, which no manifest names and no farm lock
76
+ * lists. It is optional, because a record from before the field existed is
77
+ * still a valid record of its image.
64
78
  */
65
79
  export declare const ImagePackagesSchema: z.ZodObject<{
66
80
  schema: z.ZodLiteral<1>;
@@ -86,6 +100,14 @@ export declare const ImagePackagesSchema: z.ZodObject<{
86
100
  name: z.ZodString;
87
101
  version: z.ZodString;
88
102
  }, z.core.$loose>>;
103
+ r_base: z.ZodOptional<z.ZodArray<z.ZodObject<{
104
+ name: z.ZodString;
105
+ version: z.ZodString;
106
+ priority: z.ZodEnum<{
107
+ base: "base";
108
+ recommended: "recommended";
109
+ }>;
110
+ }, z.core.$loose>>>;
89
111
  }, z.core.$loose>;
90
112
  export type ImagePackages = z.infer<typeof ImagePackagesSchema>;
91
113
  export type ImagePackagesError = {
@@ -1,9 +1,11 @@
1
1
  /**
2
2
  * `image-packages.json` — the self-description of the sandbox image.
3
3
  *
4
- * The image bakes two package tracks that the content-addressed store cannot
5
- * hold: the conda tools at `/opt/conda` and the Node packages at `/opt/node`.
6
- * The image writes one record of them at `/opt/inflexa/image-packages.json`,
4
+ * The image bakes the package tracks that the content-addressed store cannot
5
+ * hold: the conda tools at `/opt/conda`, the Node packages at `/opt/node`,
6
+ * and the R packages that ship with the R runtime (the base and the
7
+ * recommended packages, which no farm lock lists). The image writes one
8
+ * record of them at `/opt/inflexa/image-packages.json`,
7
9
  * and the catalog build copies that record verbatim into the root of the
8
10
  * package store it packed beside it. Thus every reader of a store learns the
9
11
  * image inventory from the store alone — with no container engine, no
@@ -22,6 +24,7 @@
22
24
  import { readFileSync } from "node:fs";
23
25
  import { err, ok } from "neverthrow";
24
26
  import { z } from "zod";
27
+ import { safeParseJsonAs } from "../lib/parse-json.js";
25
28
  /**
26
29
  * The file name of the record, at the root of the package store. Exported,
27
30
  * as `FARM_LOCK_FILE` is, thus an embedder that joins the path onto its own
@@ -29,54 +32,54 @@ import { z } from "zod";
29
32
  */
30
33
  export const IMAGE_PACKAGES_FILE = "image-packages.json";
31
34
  /** The image the record describes. The pair of tags shares one version string. */
32
- export const ImageIdentitySchema = z
33
- .object({
35
+ export const ImageIdentitySchema = z.looseObject({
34
36
  repository: z.string(),
35
37
  version: z.string(),
36
38
  arch: z.enum(["amd64", "arm64"]),
37
- })
38
- .passthrough();
39
+ });
39
40
  /** The interpreter versions of the image, so a reader can compare them against the lock. */
40
- export const ImageRuntimesSchema = z
41
- .object({
41
+ export const ImageRuntimesSchema = z.looseObject({
42
42
  python: z.string(),
43
43
  r: z.string(),
44
44
  node: z.string(),
45
- })
46
- .passthrough();
45
+ });
47
46
  /**
48
47
  * One conda tool of the image. `executable` carries the binary name when it
49
48
  * differs from the package name (the manifest `binaries:` map holds those
50
49
  * exceptions), because an agent invokes the binary and not the package.
51
50
  */
52
- export const ImageSystemToolSchema = z
53
- .object({
51
+ export const ImageSystemToolSchema = z.looseObject({
54
52
  name: z.string(),
55
53
  version: z.string(),
56
54
  executable: z.string().optional(),
57
- })
58
- .passthrough();
55
+ });
59
56
  /** One Node package of the image. */
60
- export const ImageNodePackageSchema = z
61
- .object({
57
+ export const ImageNodePackageSchema = z.looseObject({
62
58
  name: z.string(),
63
59
  version: z.string(),
64
- })
65
- .passthrough();
60
+ });
61
+ /** One R package that ships with the R runtime of the image: a base package or a recommended package. */
62
+ export const ImageRBasePackageSchema = z.looseObject({
63
+ name: z.string(),
64
+ version: z.string(),
65
+ priority: z.enum(["base", "recommended"]),
66
+ });
66
67
  /**
67
68
  * `image-packages.json` at schema version 1. The keys `system_tools` and
68
69
  * `node` are the keys of the image manifest, thus one name means one track
69
- * across the build and the reader.
70
+ * across the build and the reader. `r_base` is the track of the R runtime
71
+ * itself: the packages R ships, which no manifest names and no farm lock
72
+ * lists. It is optional, because a record from before the field existed is
73
+ * still a valid record of its image.
70
74
  */
71
- export const ImagePackagesSchema = z
72
- .object({
75
+ export const ImagePackagesSchema = z.looseObject({
73
76
  schema: z.literal(1),
74
77
  image: ImageIdentitySchema,
75
78
  runtimes: ImageRuntimesSchema,
76
79
  system_tools: z.array(ImageSystemToolSchema),
77
80
  node: z.array(ImageNodePackageSchema),
78
- })
79
- .passthrough();
81
+ r_base: z.array(ImageRBasePackageSchema).optional(),
82
+ });
80
83
  /**
81
84
  * Read and validate one `image-packages.json` by its file path. The read is
82
85
  * synchronous, the same as {@link readFarmLockFile}, because the caller reads
@@ -92,14 +95,13 @@ export function readImagePackagesFile(recordPath) {
92
95
  catch (cause) {
93
96
  return err({ type: "record_unreadable", recordPath, cause });
94
97
  }
95
- let parsed;
98
+ let record;
96
99
  try {
97
- parsed = JSON.parse(raw);
100
+ record = safeParseJsonAs(raw, ImagePackagesSchema);
98
101
  }
99
102
  catch (cause) {
100
103
  return err({ type: "record_invalid", recordPath, cause });
101
104
  }
102
- const record = ImagePackagesSchema.safeParse(parsed);
103
105
  if (!record.success) {
104
106
  return err({ type: "record_invalid", recordPath, cause: record.error });
105
107
  }
@@ -13,14 +13,41 @@
13
13
  * derived from the same `resolveWorkspaceRoot` seam the harness pre-creates
14
14
  * the step tree under, so both sides address one directory by construction.
15
15
  */
16
- import { BatchV1Api, CoreV1Api, type V1Toleration } from "@kubernetes/client-node";
16
+ import { type V1Job, type V1JobList, type V1PodList, type V1Toleration } from "@kubernetes/client-node";
17
17
  import { ResultAsync } from "neverthrow";
18
18
  import type { ResolveWorkspaceRoot } from "../workspace/paths.js";
19
19
  import { type SandboxError } from "./sandbox-error.js";
20
20
  import type { SpawnSession } from "../auth/types.js";
21
21
  import type { FarmSource, ManagedSandbox, SandboxIdentity, SandboxLabels, SandboxLiveness, SandboxRef, SandboxSpec, ToolchainSource } from "./types.js";
22
22
  import type { Logger } from "../lib/logger.js";
23
- export interface K8sClientConfig {
23
+ /** The Job operations of `BatchV1Api` the module reads, read structurally so tests build fakes cast-free. */
24
+ export type BatchJobApi = {
25
+ createNamespacedJob(request: {
26
+ namespace: string;
27
+ body: V1Job;
28
+ }): Promise<V1Job>;
29
+ readNamespacedJob(request: {
30
+ namespace: string;
31
+ name: string;
32
+ }): Promise<V1Job>;
33
+ deleteNamespacedJob(request: {
34
+ namespace: string;
35
+ name: string;
36
+ propagationPolicy?: string;
37
+ }): Promise<unknown>;
38
+ listNamespacedJob(request: {
39
+ namespace: string;
40
+ labelSelector?: string;
41
+ }): Promise<V1JobList>;
42
+ };
43
+ /** The Pod operations of `CoreV1Api` the module reads, read structurally so tests build fakes cast-free. */
44
+ export type CorePodApi = {
45
+ listNamespacedPod(request: {
46
+ namespace: string;
47
+ labelSelector?: string;
48
+ }): Promise<V1PodList>;
49
+ };
50
+ export type K8sClientConfig = {
24
51
  /** Operational logging seam; omitted falls back to no-op. */
25
52
  readonly logger?: Logger;
26
53
  image: string;
@@ -76,17 +103,17 @@ export interface K8sClientConfig {
76
103
  /** RuntimeClass for runtime isolation (e.g. `gvisor`). Omit for the default runtime. */
77
104
  runtimeClassName?: string;
78
105
  /** Injected for tests. */
79
- batchApi?: BatchV1Api;
80
- coreApi?: CoreV1Api;
106
+ batchApi?: BatchJobApi;
107
+ coreApi?: CorePodApi;
81
108
  registerSandbox: (session: SpawnSession, spec: SandboxSpec, ref: SandboxRef) => Promise<void>;
82
- }
109
+ };
83
110
  /** Clock and sleep seams, so a test can drive the slow-pod warning without waiting a minute. */
84
- export interface WaitForPodReadyDeps {
111
+ export type WaitForPodReadyDeps = {
85
112
  readonly logger?: Logger;
86
113
  readonly now?: () => number;
87
114
  readonly sleep?: (ms: number) => Promise<void>;
88
- }
89
- export declare function waitForPodReady(coreApi: CoreV1Api, namespace: string, sandboxId: string, deps?: WaitForPodReadyDeps): ResultAsync<{
115
+ };
116
+ export declare function waitForPodReady(coreApi: CorePodApi, namespace: string, sandboxId: string, deps?: WaitForPodReadyDeps): ResultAsync<{
90
117
  podIP: string;
91
118
  podName: string;
92
119
  }, SandboxError>;
@@ -14,6 +14,7 @@
14
14
  * the step tree under, so both sides address one directory by construction.
15
15
  */
16
16
  import { join, relative as relativePath, sep } from "node:path";
17
+ import { setTimeout as timerSleep } from "node:timers/promises";
17
18
  import { BatchV1Api, CoreV1Api, KubeConfig, } from "@kubernetes/client-node";
18
19
  import { ResultAsync, err, ok } from "neverthrow";
19
20
  import { trySandbox } from "./sandbox-error.js";
@@ -132,7 +133,7 @@ async function buildJobSpec(session, sandboxSpec, hostLabels, config, identity,
132
133
  const env = Object.entries({
133
134
  ...threadLimitEnv(spec),
134
135
  ...plan.env,
135
- ...(sandboxSpec.extraEnv ?? {}),
136
+ ...sandboxSpec.extraEnv,
136
137
  }).map(([name, value]) => ({ name, value }));
137
138
  // requests == limits → Guaranteed QoS and a predictable OOM bound; also
138
139
  // satisfies the namespace ResourceQuota, which rejects any pod that omits
@@ -178,7 +179,7 @@ async function buildJobSpec(session, sandboxSpec, hostLabels, config, identity,
178
179
  // Volume-level readOnly only when nothing writes through the claim:
179
180
  // the cache mount needs write access, and the per-mount flags keep
180
181
  // the store and the farm read-only either way.
181
- persistentVolumeClaim: { claimName: config.libStorePvc, ...(cacheSubPath === undefined ? { readOnly: true } : {}) },
182
+ persistentVolumeClaim: { claimName: config.libStorePvc, readOnly: cacheSubPath === undefined ? true : undefined },
182
183
  });
183
184
  volumeMounts.push({
184
185
  name: LIBS_VOLUME_NAME,
@@ -295,7 +296,7 @@ export function waitForPodReady(coreApi, namespace, sandboxId, deps = {}) {
295
296
  cause,
296
297
  });
297
298
  const now = deps.now ?? (() => Date.now());
298
- const sleep = deps.sleep ?? ((ms) => new Promise((r) => setTimeout(r, ms)));
299
+ const sleep = deps.sleep ?? timerSleep;
299
300
  const logger = (deps.logger ?? createNoopLogger()).named("k8s-client");
300
301
  return new ResultAsync((async () => {
301
302
  const startedAt = now();
@@ -378,7 +379,7 @@ function waitForJobGone(batchApi, namespace, name) {
378
379
  return ok(undefined);
379
380
  return err(read.error);
380
381
  }
381
- await new Promise((r) => setTimeout(r, 500));
382
+ await timerSleep(500);
382
383
  }
383
384
  return err(createFailed(undefined, new Error(`K8sSandbox ${name}: prior Job did not delete within 60s`)));
384
385
  })());
@@ -501,7 +502,7 @@ export function createK8sSandboxOps(config) {
501
502
  // finishes) — the Job controller retries pod creation forever. Delete
502
503
  // the Job on any startup failure so a failed create can't leak a
503
504
  // zombie that floods k8s events indefinitely.
504
- const ready = await waitForPodReady(coreApi, config.namespace, sandboxId, { ...(config.logger ? { logger: config.logger } : {}) });
505
+ const ready = await waitForPodReady(coreApi, config.namespace, sandboxId, { logger: config.logger });
505
506
  if (ready.isOk()) {
506
507
  const ref = {
507
508
  sandboxId,
@@ -27,6 +27,7 @@ export const STEP_ID_LABEL = "cortex/step-id";
27
27
  */
28
28
  export const OWNER_WORKFLOW_KEY = "cortex/owner-workflow-id";
29
29
  /** A valid K8s label value: 1 to 63 characters, `[A-Za-z0-9._-]` only, a letter or a digit at each end. */
30
+ // oxlint-disable-next-line eslint-js/no-restricted-syntax -- the K8s label-value grammar: the bounded charset with the letter-or-digit ends; the shape is the K8s validation rule.
30
31
  const LABEL_VALUE = /^[A-Za-z0-9](?:[A-Za-z0-9._-]{0,61}[A-Za-z0-9])?$/;
31
32
  /** The harness never applies it to a host value. */
32
33
  export function isLabelValue(value) {