@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
@@ -26,20 +26,20 @@ import { type ChromeConfig } from "./chrome.js";
26
26
  * page navigation reads a `file://` URL of the host tree. The caller resolves the root already, thus the
27
27
  * scope hands it over and a realization holds no second resolver.
28
28
  */
29
- export interface EyesScope {
29
+ export type EyesScope = {
30
30
  readonly analysisId: string;
31
31
  readonly workspaceRoot: string;
32
- }
32
+ };
33
33
  /**
34
34
  * One acquired browser, and the end of the lease.
35
35
  *
36
36
  * `browserUrl` is the endpoint that a capture connects to. `release` ends the lease of the caller. The shape
37
37
  * binds no duration, thus one look and a longer interactive hold read the same.
38
38
  */
39
- export interface EyesLease {
39
+ export type EyesLease = {
40
40
  readonly browserUrl: string;
41
41
  release(): Promise<void>;
42
- }
42
+ };
43
43
  /**
44
44
  * The eyes seam. One call gives one lease over one scope.
45
45
  *
package/dist/lib/eyes.js CHANGED
@@ -36,7 +36,7 @@ export function createStaticEyes(chrome) {
36
36
  throw new Error("static eyes need a browser endpoint, and the chrome config names none");
37
37
  }
38
38
  const browserUrl = chrome.browserUrl;
39
- return async (_scope) => ({
39
+ return (_scope) => Promise.resolve({
40
40
  browserUrl,
41
41
  release: async () => {
42
42
  // The standing sidecar outlives every look, thus nothing ends here.
@@ -5,6 +5,8 @@ import { createHash } from "node:crypto";
5
5
  import { constants as fsConstants, createReadStream } from "node:fs";
6
6
  import { access, mkdir, open, realpath } from "node:fs/promises";
7
7
  import { dirname, resolve, sep } from "node:path";
8
+ import { isAllHex } from "./text.js";
9
+ import { errorOf } from "./thrown.js";
8
10
  /**
9
11
  * Compute SHA-256 hash of in-memory content.
10
12
  * Returns `sha256:<hex>` format.
@@ -34,7 +36,14 @@ export async function computeSha256File(filePath) {
34
36
  * an attestation invariant violation, not something to paper over.
35
37
  */
36
38
  export function hasValidContentHash(hash) {
37
- return !!hash && /^[a-z0-9]+:[0-9a-f]+$/i.test(hash);
39
+ if (!hash)
40
+ return false;
41
+ const colon = hash.indexOf(":");
42
+ if (colon === -1)
43
+ return false;
44
+ const algorithm = hash.slice(0, colon).toLowerCase();
45
+ const isAlgorithmChar = (char) => (char >= "a" && char <= "z") || (char >= "0" && char <= "9");
46
+ return algorithm.length > 0 && Array.from(algorithm).every(isAlgorithmChar) && colon + 1 < hash.length && isAllHex(hash.slice(colon + 1));
38
47
  }
39
48
  /**
40
49
  * Check whether a file exists (access-based, no stat overhead).
@@ -73,7 +82,10 @@ export async function classifyWithinRoot(confinementRoot, absPath) {
73
82
  real = await realpath(absPath);
74
83
  }
75
84
  catch (cause) {
76
- const code = cause.code;
85
+ // Node's fs rejects with an `ErrnoException`, so the code read covers every real rejection;
86
+ // a non-Error throw carries no errno code and propagates.
87
+ const causeError = errorOf(cause);
88
+ const code = causeError !== undefined && "code" in causeError ? causeError.code : undefined;
77
89
  // A path (or symlink target) that does not resolve leaks nothing; let the
78
90
  // caller's own not-found/fallback path handle it. Genuine faults (e.g.
79
91
  // EACCES traversing a directory) propagate.
@@ -105,10 +117,10 @@ export async function writeFileWithinRoot(workspaceRoot, absPath, data) {
105
117
  if (realDir !== realRoot && !realDir.startsWith(realRoot + sep)) {
106
118
  throw new Error(`writeFileWithinRoot: parent directory escapes the workspace root via a symlink: ${absPath}`);
107
119
  }
108
- // `O_NOFOLLOW ?? 0`: the flag is defined on Linux/macOS (the harness host
109
- // platforms); the `?? 0` keeps the open valid on a platform that lacks it
110
- // rather than NaN-ing the flag mask.
111
- const flags = fsConstants.O_WRONLY | fsConstants.O_CREAT | fsConstants.O_TRUNC | (fsConstants.O_NOFOLLOW ?? 0);
120
+ // A platform may lack `O_NOFOLLOW` — absent at runtime even though the
121
+ // constants type says number. The bitwise OR coerces an absent flag to 0,
122
+ // so the open stays valid without a nullish guard on the flag.
123
+ const flags = fsConstants.O_WRONLY | fsConstants.O_CREAT | fsConstants.O_TRUNC | fsConstants.O_NOFOLLOW;
112
124
  const fh = await open(target, flags, 0o644);
113
125
  try {
114
126
  await fh.writeFile(data);
@@ -64,6 +64,7 @@ export type FsError = {
64
64
  readonly path?: string;
65
65
  readonly cause: unknown;
66
66
  };
67
+ export declare function errnoOf(cause: unknown): string | undefined;
67
68
  /** True when the throw is a plain "this path isn't here" — `ENOENT`/`ENOTDIR`. */
68
69
  export declare function isAbsent(cause: unknown): boolean;
69
70
  /** A one-line, user-facing description of an `FsError` for logs and error bodies. */
@@ -29,6 +29,7 @@
29
29
  * (`card-builders`) `.unwrapOr(null)` / `.match` to preserve their "any failure
30
30
  * → fall back to a chip" behaviour.
31
31
  */
32
+ import { z } from "zod";
32
33
  import { ResultAsync, err, ok } from "neverthrow";
33
34
  const _assertDomainError = true;
34
35
  /** errno codes that mean "the path is absent" — the caller's concern, mapped to
@@ -36,12 +37,10 @@ const _assertDomainError = true;
36
37
  const ABSENT_CODES = new Set(["ENOENT", "ENOTDIR"]);
37
38
  /** errno codes that mean "permission denied". */
38
39
  const PERMISSION_CODES = new Set(["EACCES", "EPERM"]);
39
- function errnoOf(cause) {
40
- if (cause && typeof cause === "object" && "code" in cause) {
41
- const code = cause.code;
42
- return typeof code === "string" ? code : undefined;
43
- }
44
- return undefined;
40
+ const ErrnoCauseSchema = z.object({ code: z.string() });
41
+ export function errnoOf(cause) {
42
+ const parsed = ErrnoCauseSchema.safeParse(cause);
43
+ return parsed.success ? parsed.data.code : undefined;
45
44
  }
46
45
  /** True when the throw is a plain "this path isn't here" — `ENOENT`/`ENOTDIR`. */
47
46
  export function isAbsent(cause) {
@@ -20,16 +20,32 @@
20
20
  */
21
21
  import { ResultAsync } from "neverthrow";
22
22
  import type { Logger } from "./logger.js";
23
- export interface GateFailure {
23
+ export type GateFailure = {
24
24
  readonly reason: string;
25
25
  /** True when the host asks the harness to suspend the work in place of a failure. */
26
26
  readonly suspend: boolean;
27
- }
28
- export interface NoticeFailure {
27
+ };
28
+ /**
29
+ * The settlement a gate's `ResultAsync` resolves to, read structurally. An embedder whose neverthrow is
30
+ * a second package copy resolves a settlement that holds the same members without the harness class,
31
+ * and `passGate` reads it the same way.
32
+ */
33
+ export type GateSettlement<T> = {
34
+ isOk(): true;
35
+ readonly value: T;
36
+ } | {
37
+ isOk(): false;
38
+ readonly error: GateFailure;
39
+ };
40
+ /** A gate result that an embedder's own neverthrow copy produced: a thenable over the settlement. */
41
+ export type ForeignGateResult<T> = {
42
+ then(onfulfilled: (settled: GateSettlement<T>) => unknown): unknown;
43
+ };
44
+ export type NoticeFailure = {
29
45
  readonly reason: string;
30
- }
31
- export type GateName = "RunAuthorizer.authorize" | "RunCharge.open" | "ArtifactRegistry.register" | "resolveRequestHeaders" | "resolveSandboxLabels";
32
- export type NoticeName = "RunAuthorizer.revoke" | "RunAuthorizer.revokeByJti" | "RunCharge.close" | "ArtifactRegistry.sync" | "UsageRecorder.record" | "notifyDataProfileSettled";
46
+ };
47
+ export type GateName = "RunAuthorizer.authorize" | "RunAuthorizer.renew" | "RunCharge.open" | "ArtifactRegistry.register" | "resolveRequestHeaders" | "resolveSandboxLabels";
48
+ export type NoticeName = "RunAuthorizer.revoke" | "RunAuthorizer.revokeByMandateId" | "RunAuthorizer.suspend" | "RunCharge.close" | "ArtifactRegistry.sync" | "UsageRecorder.record" | "notifyDataProfileSettled";
33
49
  export type GateRefusal = {
34
50
  readonly kind: "failed";
35
51
  readonly gate: GateName;
@@ -45,5 +61,5 @@ export type GateRefusal = {
45
61
  * checkpoint recipes (`runtime/result-serialization.ts`) recognize the class,
46
62
  * and a replay reads the same outcome.
47
63
  */
48
- export declare function passGate<T>(gate: GateName, result: ResultAsync<T, GateFailure>): ResultAsync<T, GateRefusal>;
64
+ export declare function passGate<T>(gate: GateName, result: ResultAsync<T, GateFailure> | ForeignGateResult<T>): ResultAsync<T, GateRefusal>;
49
65
  export declare function deliverNotice(log: Logger, notice: NoticeName, result: ResultAsync<void, NoticeFailure>): Promise<boolean>;
package/dist/lib/hooks.js CHANGED
@@ -19,6 +19,17 @@
19
19
  * branches on it.
20
20
  */
21
21
  import { err, ok, ResultAsync } from "neverthrow";
22
+ function settlementOk(settled) {
23
+ return settled.isOk();
24
+ }
25
+ /** Await the gate result and read it as one settlement, whichever package copy produced it. */
26
+ async function settlementOf(result) {
27
+ if (result instanceof ResultAsync) {
28
+ const settled = await result;
29
+ return settled.isOk() ? { isOk: () => true, value: settled.value } : { isOk: () => false, error: settled.error };
30
+ }
31
+ return await result;
32
+ }
22
33
  /**
23
34
  * The host can build its `Result` with its own copy of neverthrow. The helper
24
35
  * gives the outcome again as a `Result` of the copy of the harness. Thus the
@@ -26,9 +37,12 @@ import { err, ok, ResultAsync } from "neverthrow";
26
37
  * and a replay reads the same outcome.
27
38
  */
28
39
  export function passGate(gate, result) {
29
- return new ResultAsync(Promise.resolve(result).then((settled) => settled.isOk()
30
- ? ok(settled.value)
31
- : err({ kind: settled.error.suspend ? "suspended" : "failed", gate, reason: settled.error.reason })));
40
+ return new ResultAsync((async () => {
41
+ const settled = await settlementOf(result);
42
+ if (settlementOk(settled))
43
+ return ok(settled.value);
44
+ return err({ kind: settled.error.suspend ? "suspended" : "failed", gate, reason: settled.error.reason });
45
+ })());
32
46
  }
33
47
  export async function deliverNotice(log, notice, result) {
34
48
  const delivered = await result;
@@ -12,6 +12,7 @@
12
12
  * import { withHost } from "../../lib/host-concurrency.js";
13
13
  * const result = await withHost("chembl", () => chembl.getMechanism(id));
14
14
  */
15
+ const DEFAULT_HOST_LIMIT = 4;
15
16
  const DEFAULT_LIMITS = {
16
17
  chembl: 4,
17
18
  openfda: 4,
@@ -31,13 +32,13 @@ const DEFAULT_LIMITS = {
31
32
  ema: 2,
32
33
  pubchem: 4,
33
34
  "annotation-llm": 4,
34
- default: 4,
35
+ default: DEFAULT_HOST_LIMIT,
35
36
  };
36
37
  const budgets = new Map();
37
38
  function getBudget(host) {
38
39
  let b = budgets.get(host);
39
40
  if (!b) {
40
- b = { limit: DEFAULT_LIMITS[host] ?? DEFAULT_LIMITS.default, inUse: 0, queue: [] };
41
+ b = { limit: DEFAULT_LIMITS[host] ?? DEFAULT_HOST_LIMIT, inUse: 0, queue: [] };
41
42
  budgets.set(host, b);
42
43
  }
43
44
  return b;
@@ -34,7 +34,7 @@ export type LogFields = Record<string, unknown>;
34
34
  * this contract to match one of them would model the published surface on a
35
35
  * single consumer's choice.
36
36
  */
37
- export interface Logger {
37
+ export type Logger = {
38
38
  debug(msg: string, fields?: LogFields): void;
39
39
  info(msg: string, fields?: LogFields): void;
40
40
  warn(msg: string, fields?: LogFields): void;
@@ -74,7 +74,7 @@ export interface Logger {
74
74
  * implementation — a realization with no opinion just references it.
75
75
  */
76
76
  errorFields(err: unknown): LogFields;
77
- }
77
+ };
78
78
  /**
79
79
  * The default `Logger.errorFields`: `err` carries the message, `stack` rides as
80
80
  * its own field when there is one.
@@ -19,6 +19,7 @@
19
19
  * when something has gone wrong. `createConsoleLogger` (`./console-logger.ts`)
20
20
  * is the one sanctioned console site.
21
21
  */
22
+ import { textOf } from "./unknown-text.js";
22
23
  /**
23
24
  * The default `Logger.errorFields`: `err` carries the message, `stack` rides as
24
25
  * its own field when there is one.
@@ -33,5 +34,5 @@ export function defaultErrorFields(err) {
33
34
  if (err instanceof Error) {
34
35
  return err.stack ? { err: err.message, stack: err.stack } : { err: err.message };
35
36
  }
36
- return { err: String(err) };
37
+ return { err: textOf(err) };
37
38
  }
@@ -33,7 +33,7 @@
33
33
  */
34
34
  import type { StepExecutionStatus } from "../state/schema.js";
35
35
  /** Terminal status of a run, the same as the run ledger. */
36
- export type RunOutcome = "completed" | "partial" | "failed" | "canceled" | "suspended_insufficient_funds";
36
+ export type RunOutcome = "completed" | "partial" | "failed" | "canceled";
37
37
  /** The workflow family a run belongs to. */
38
38
  export type RunWorkflow = "analysis" | "data_profile";
39
39
  /** Terminal status of an executed step. A blocker is a failure to deliver, so `blocked` maps here to `failed`. */
@@ -0,0 +1,6 @@
1
+ /**
2
+ * A record with a null prototype, for maps whose keys come from outside the
3
+ * process (stored snapshots, ledger paths). A key such as `__proto__` stays an
4
+ * ordinary entry and never reaches a prototype slot, on writes and on reads.
5
+ */
6
+ export declare function nullProtoRecord<T>(): Record<string, T>;
@@ -0,0 +1,17 @@
1
+ /**
2
+ * A record with a null prototype, for maps whose keys come from outside the
3
+ * process (stored snapshots, ledger paths). A key such as `__proto__` stays an
4
+ * ordinary entry and never reaches a prototype slot, on writes and on reads.
5
+ */
6
+ export function nullProtoRecord() {
7
+ const created = Object.create(null);
8
+ // Object.create(null) always yields an object, so the guard never refuses;
9
+ // it moves the parser's `any` out of the returned record. The empty record
10
+ // holds no member, so it is a `Record<string, T>` for every `T`.
11
+ if (!isRecordOf(created))
12
+ throw new Error("Object.create(null) did not yield an object");
13
+ return created;
14
+ }
15
+ function isRecordOf(value) {
16
+ return typeof value === "object" && value !== null;
17
+ }
@@ -74,7 +74,7 @@ export declare function stableSpan(dbosName: string, name: string, attributes: A
74
74
  * writes no client span. Sandbox-server records no spans, and the step span
75
75
  * around the call already covers it.
76
76
  */
77
- export declare function untracedFetch(fetchImpl: typeof fetch, url: string, init: RequestInit & {
77
+ export declare function untracedFetch(fetchImpl: typeof fetch, url: string, init: Omit<RequestInit, "headers"> & {
78
78
  headers?: Record<string, string>;
79
79
  }): Promise<Response>;
80
80
  /**
@@ -96,7 +96,7 @@ export function stableSpan(dbosName, name, attributes) {
96
96
  if (span === undefined || !span.isRecording())
97
97
  return;
98
98
  // The API `Span` has no name accessor; the SDK span the provider hands out does.
99
- if (span.name !== dbosName)
99
+ if (!("name" in span) || span.name !== dbosName)
100
100
  return;
101
101
  span.updateName(name);
102
102
  span.setAttributes(attributes);
@@ -124,6 +124,10 @@ export function untracedFetch(fetchImpl, url, init) {
124
124
  export function passThroughTracer(tracer, passesThrough) {
125
125
  return new PassThroughTracer(tracer, passesThrough);
126
126
  }
127
+ /** Run `fn(span)` under `contextWithSpan`, so the callback's own result type survives the context switch. */
128
+ function runWithSpan(contextWithSpan, span, fn) {
129
+ return context.with(contextWithSpan, () => fn(span));
130
+ }
127
131
  class PassThroughTracer {
128
132
  inner;
129
133
  passesThrough;
@@ -140,11 +144,11 @@ class PassThroughTracer {
140
144
  }
141
145
  // The inner tracer cannot take this call: its own `startActiveSpan` calls its own `startSpan`, past the rule.
142
146
  startActiveSpan(name, ...rest) {
143
- const fn = rest[rest.length - 1];
144
- const options = rest.length > 1 ? rest[0] : {};
145
- const parentContext = (rest.length > 2 ? rest[1] : undefined) ?? context.active();
147
+ const parentContext = rest.length === 3 ? (rest[1] ?? context.active()) : context.active();
148
+ const options = rest.length === 1 ? {} : rest[0];
149
+ const fn = rest.length === 3 ? rest[2] : rest.length === 2 ? rest[1] : rest[0];
146
150
  const span = this.startSpan(name, options, parentContext);
147
- return context.with(trace.setSpan(parentContext, span), () => fn(span));
151
+ return runWithSpan(trace.setSpan(parentContext, span), span, fn);
148
152
  }
149
153
  }
150
154
  /** The name of the span that the enclosing `passThroughSpan` declared. */
@@ -39,14 +39,14 @@
39
39
  import type { Logger } from "./logger.js";
40
40
  /** The SDK's own default when neither the host nor the environment says otherwise. */
41
41
  export declare const DEFAULT_METRIC_EXPORT_INTERVAL_MS = 60000;
42
- export interface InitOtelOptions {
42
+ export type InitOtelOptions = {
43
43
  /** Diagnostics sink; omitted falls back to no-op. */
44
44
  readonly logger?: Logger;
45
45
  /** `service.name` when `OTEL_SERVICE_NAME` is unset. Default `cortex`. */
46
46
  readonly serviceName?: string;
47
47
  /** `service.version` — the host's package version. Omitted leaves the attribute unset. */
48
48
  readonly serviceVersion?: string;
49
- }
49
+ };
50
50
  /**
51
51
  * `OTEL_METRICS_EXPORTER=none` turns metric export off while the OTLP endpoint
52
52
  * stays set for traces. Any other value (including unset) keeps the OTLP
@@ -79,3 +79,5 @@ export declare function shutdownOtel(): Promise<void>;
79
79
  export declare function __resetOtelForTest(): Promise<void>;
80
80
  /** Test hook: whether `initOtel` registered a metric-exporting MeterProvider. Test-only. */
81
81
  export declare function __otelMeterProviderRegisteredForTest(): boolean;
82
+ /** Test hook: the attributes of the resource the registered TracerProvider carries. Test-only. */
83
+ export declare function __otelTracerResourceForTest(): Record<string, unknown> | undefined;
package/dist/lib/otel.js CHANGED
@@ -38,6 +38,7 @@
38
38
  */
39
39
  import { context, propagation, metrics, trace } from "@opentelemetry/api";
40
40
  import { createNoopLogger } from "./console-logger.js";
41
+ import { trimTrailingOf } from "./text.js";
41
42
  import { createHarnessSampler, DbosSpanProcessor, HarnessTracerProvider } from "./otel-spans.js";
42
43
  import { W3CTraceContextPropagator } from "@opentelemetry/core";
43
44
  import { MeterProvider, PeriodicExportingMetricReader } from "@opentelemetry/sdk-metrics";
@@ -50,6 +51,7 @@ import { ATTR_SERVICE_NAME, ATTR_SERVICE_VERSION } from "@opentelemetry/semantic
50
51
  export const DEFAULT_METRIC_EXPORT_INTERVAL_MS = 60_000;
51
52
  let initialized = false;
52
53
  let registeredTracerProvider;
54
+ let registeredTracerResource;
53
55
  let registeredMeterProvider;
54
56
  /**
55
57
  * `OTEL_METRICS_EXPORTER=none` turns metric export off while the OTLP endpoint
@@ -108,7 +110,7 @@ export function initOtel(options = {}) {
108
110
  {
109
111
  const spanProcessors = [];
110
112
  if (endpoint) {
111
- const base = endpoint.replace(/\/+$/, "");
113
+ const base = trimTrailingOf(endpoint, "/");
112
114
  spanProcessors.push(new DbosSpanProcessor(new BatchSpanProcessor(new OTLPTraceExporter({ url: `${base}/v1/traces` }))));
113
115
  }
114
116
  const tracerProvider = new HarnessTracerProvider({
@@ -118,6 +120,7 @@ export function initOtel(options = {}) {
118
120
  });
119
121
  tracerProvider.register();
120
122
  registeredTracerProvider = tracerProvider;
123
+ registeredTracerResource = resource.attributes;
121
124
  // Debug: verify registration actually worked
122
125
  const testTracer = trace.getTracer("otel-init-check");
123
126
  const testSpan = testTracer.startSpan("init-check");
@@ -140,7 +143,7 @@ export function initOtel(options = {}) {
140
143
  // With no MeterProvider registered the API's global no-op provider serves
141
144
  // every instrument, so the record sites stay valid when export is off.
142
145
  if (endpoint && !metricsExportDisabled()) {
143
- const base = endpoint.replace(/\/+$/, "");
146
+ const base = trimTrailingOf(endpoint, "/");
144
147
  const metricExporter = new OTLPMetricExporter({
145
148
  url: `${base}/v1/metrics`,
146
149
  });
@@ -178,6 +181,7 @@ export async function shutdownOtel() {
178
181
  export async function __resetOtelForTest() {
179
182
  await shutdownOtel();
180
183
  registeredTracerProvider = undefined;
184
+ registeredTracerResource = undefined;
181
185
  registeredMeterProvider = undefined;
182
186
  trace.disable();
183
187
  metrics.disable();
@@ -189,3 +193,7 @@ export async function __resetOtelForTest() {
189
193
  export function __otelMeterProviderRegisteredForTest() {
190
194
  return registeredMeterProvider !== undefined;
191
195
  }
196
+ /** Test hook: the attributes of the resource the registered TracerProvider carries. Test-only. */
197
+ export function __otelTracerResourceForTest() {
198
+ return registeredTracerResource;
199
+ }
@@ -30,19 +30,19 @@
30
30
  */
31
31
  import { type ChromeConfig } from "./chrome.js";
32
32
  /** One request that the page could not load, with the reason that the browser gave. */
33
- export interface FailedRequest {
33
+ export type FailedRequest = {
34
34
  url: string;
35
35
  reason: string;
36
- }
36
+ };
37
37
  /** One picture of a capture: the base64 bytes, and the document rows that a slice holds. */
38
- export interface CapturedShot {
38
+ export type CapturedShot = {
39
39
  readonly base64: string;
40
40
  /** The vertical document range of a slice, in CSS pixels. Absent on a whole-document or window picture. */
41
41
  readonly range?: {
42
42
  readonly fromY: number;
43
43
  readonly toY: number;
44
44
  };
45
- }
45
+ };
46
46
  /**
47
47
  * What the pictures hold together. `full` is one shot of the whole document. `tiled` is consecutive vertical
48
48
  * slices in document order; `capturedPx` is the height the slices cover and `totalPx` is the document height,
@@ -69,7 +69,7 @@ export type CaptureCoverage = {
69
69
  readonly kind: "no-block";
70
70
  };
71
71
  /** The pictures and the faults of one page capture. */
72
- export interface PageCapture {
72
+ export type PageCapture = {
73
73
  /**
74
74
  * The pictures in document order: one shot under `full` and `viewport`, the slices under `tiled` and
75
75
  * `block`, and none under `no-block`.
@@ -78,7 +78,7 @@ export interface PageCapture {
78
78
  coverage: CaptureCoverage;
79
79
  consoleErrors: string[];
80
80
  failedRequests: FailedRequest[];
81
- }
81
+ };
82
82
  /**
83
83
  * The capture seam. It navigates to a page URL, and it gives back the screenshots and the faults. The seam
84
84
  * speaks the throw protocol, because the chrome connection does. A test injects a seam that reads no
@@ -86,14 +86,14 @@ export interface PageCapture {
86
86
  */
87
87
  export type CapturePage = (url: string, options?: CaptureOptions) => Promise<PageCapture>;
88
88
  /** The extra settle steps and the target of one capture. A call site that needs none passes nothing. */
89
- export interface CaptureOptions {
89
+ export type CaptureOptions = {
90
90
  /** A CSS selector to wait for after the readiness signal. The wait is best-effort. */
91
91
  readonly waitForSelector?: string;
92
92
  /** An extra settle time in milliseconds after the readiness signal, for a late paint. */
93
93
  readonly waitMs?: number;
94
94
  /** The id of the one block to capture. Absent, the capture takes the whole document. */
95
95
  readonly blockId?: string;
96
- }
96
+ };
97
97
  /**
98
98
  * Capture one page: the screenshots, the console errors, and the failed requests.
99
99
  *
@@ -28,6 +28,8 @@
28
28
  * The capture speaks the throw protocol, because the chrome connection does. A caller that needs a typed
29
29
  * outcome guards the call.
30
30
  */
31
+ import { setTimeout as sleep } from "node:timers/promises";
32
+ import { errorOf } from "./thrown.js";
31
33
  import { withPage } from "./chrome.js";
32
34
  import { PAGE_NAV_TIMEOUT_MS, PAGE_READY_TIMEOUT_MS, THEME_READY_EVENT, THEME_READY_SENTINEL } from "../report-render/page.js";
33
35
  import { BLOCK_ID_ATTRIBUTE } from "../report-render/views/block-mark.js";
@@ -69,10 +71,11 @@ const BLOCK_MARGIN_PX = 16;
69
71
  function waitForThemeReady(sentinel, event, timeout) {
70
72
  return new Promise((resolve) => {
71
73
  // The sentinel name arrives as a value, thus no declared property of the global object describes it.
72
- if (window[sentinel]) {
74
+ if (Reflect.get(window, sentinel)) {
73
75
  resolve();
74
76
  return;
75
77
  }
78
+ // oxlint-disable-next-line eslint-js/no-restricted-syntax -- the browser runs this body as page source, so the node timers module does not exist here; the timer bounds a page that never signals.
76
79
  const timer = setTimeout(() => {
77
80
  resolve();
78
81
  }, timeout);
@@ -98,6 +101,7 @@ async function measureTotalHeight(page) {
98
101
  const measured = await page.evaluate(measureScrollHeight).catch(() => undefined);
99
102
  return typeof measured === "number" && Number.isFinite(measured) ? measured : 0;
100
103
  }
104
+ /** A document area of one capture, in CSS pixels: the columns from `x`, and the rows from `fromY` to `toY`. */
101
105
  /**
102
106
  * Capture the rows of one area as slices, in document order. Each slice clips {@link TILE_HEIGHT_PX} rows,
103
107
  * and the last slice ends at the area or at the budget, whichever comes first.
@@ -181,8 +185,9 @@ async function captureShots(page) {
181
185
  catch (refusedViewport) {
182
186
  // The two refusals together are the account of a dead look, and the caller reports the second one
183
187
  // alone. Thus the first one rides as the cause, and no reader of that report loses half of it.
184
- if (refusedViewport instanceof Error && refusedViewport.cause === undefined) {
185
- refusedViewport.cause = refused;
188
+ const refusedViewportError = errorOf(refusedViewport);
189
+ if (refusedViewportError !== undefined && refusedViewportError.cause === undefined) {
190
+ refusedViewportError.cause = refused;
186
191
  }
187
192
  throw refusedViewport;
188
193
  }
@@ -229,7 +234,7 @@ export function capturePage(chrome, url, options = {}) {
229
234
  }
230
235
  if (options.waitMs !== undefined && options.waitMs > 0) {
231
236
  const settle = options.waitMs;
232
- await new Promise((resolve) => setTimeout(resolve, settle));
237
+ await sleep(settle);
233
238
  }
234
239
  // The pictures must show the whole document at the layout that a reader gets. Thus a defect below the
235
240
  // fold is visible, and a question about content that never appeared has an answer.
@@ -0,0 +1,5 @@
1
+ import { z } from "zod";
2
+ /** Parse `text` and validate it with `schema`: malformed text throws the parse's `SyntaxError`, a schema failure throws the `ZodError`. */
3
+ export declare function parseJsonAs<T>(text: string, schema: z.ZodType<T>): T;
4
+ /** Parse `text`, validate it with `schema`, and give the zod result. A malformed text still throws the parse's `SyntaxError`; only the schema outcome is a result. */
5
+ export declare function safeParseJsonAs<T>(text: string, schema: z.ZodType<T>): z.ZodSafeParseResult<T>;
@@ -0,0 +1,12 @@
1
+ function parseJsonText(text) {
2
+ // oxlint-disable-next-line eslint-js/no-restricted-syntax -- the one JSON.parse of the tree: every caller states the schema its boundary assumes.
3
+ return JSON.parse(text);
4
+ }
5
+ /** Parse `text` and validate it with `schema`: malformed text throws the parse's `SyntaxError`, a schema failure throws the `ZodError`. */
6
+ export function parseJsonAs(text, schema) {
7
+ return schema.parse(parseJsonText(text));
8
+ }
9
+ /** Parse `text`, validate it with `schema`, and give the zod result. A malformed text still throws the parse's `SyntaxError`; only the schema outcome is a result. */
10
+ export function safeParseJsonAs(text, schema) {
11
+ return schema.safeParse(parseJsonText(text));
12
+ }
@@ -0,0 +1,12 @@
1
+ /**
2
+ * A positional or keyed read whose construction guarantees presence, replacing
3
+ * a non-null assertion with a failure that names the read. A helper serves only
4
+ * a guaranteed read — a lookup that can miss takes its module's absence path,
5
+ * because a throw there would turn a handled absence into a crash.
6
+ */
7
+ export declare function presentFirst<T>(values: readonly T[], what?: string): T;
8
+ export declare function presentAt<T>(values: readonly T[], index: number, what?: string): T;
9
+ export declare function presentLast<T>(values: readonly T[], what?: string): T;
10
+ export declare function presentFind<T>(values: readonly T[], matches: (value: T) => boolean, what?: string): T;
11
+ export declare function presentGet<V>(source: Map<string, V> | Readonly<Record<string, V>>, key: string, what?: string): V;
12
+ export declare function presentGet<K, V>(source: Map<K, V>, key: K, what?: string): V;
@@ -0,0 +1,39 @@
1
+ /**
2
+ * A positional or keyed read whose construction guarantees presence, replacing
3
+ * a non-null assertion with a failure that names the read. A helper serves only
4
+ * a guaranteed read — a lookup that can miss takes its module's absence path,
5
+ * because a throw there would turn a handled absence into a crash.
6
+ */
7
+ function absent(what) {
8
+ return new Error(`${what} is absent`);
9
+ }
10
+ export function presentFirst(values, what) {
11
+ const first = values[0];
12
+ if (first === undefined)
13
+ throw absent(what ?? "the first element");
14
+ return first;
15
+ }
16
+ export function presentAt(values, index, what) {
17
+ const value = values[index];
18
+ if (value === undefined)
19
+ throw absent(what ?? `the element at index ${index}`);
20
+ return value;
21
+ }
22
+ export function presentLast(values, what) {
23
+ const last = values[values.length - 1];
24
+ if (last === undefined)
25
+ throw absent(what ?? "the last element");
26
+ return last;
27
+ }
28
+ export function presentFind(values, matches, what) {
29
+ const found = values.find(matches);
30
+ if (found === undefined)
31
+ throw absent(what ?? "the matching element");
32
+ return found;
33
+ }
34
+ export function presentGet(source, key, what) {
35
+ const value = source instanceof Map ? source.get(key) : source[key];
36
+ if (value === undefined)
37
+ throw absent(what ?? `the entry for "${key}"`);
38
+ return value;
39
+ }
@@ -1,4 +1,4 @@
1
- export interface RateLimitConfig {
1
+ export type RateLimitConfig = {
2
2
  readonly maxConcurrency: number;
3
3
  readonly requestsPerSecond: number;
4
4
  /**
@@ -8,11 +8,11 @@ export interface RateLimitConfig {
8
8
  */
9
9
  readonly maxRetries: number;
10
10
  readonly maxRetryDelayMs: number;
11
- }
12
- export interface RateLimitRuntime {
11
+ };
12
+ export type RateLimitRuntime = {
13
13
  readonly now?: () => number;
14
14
  readonly sleep?: (milliseconds: number, signal?: AbortSignal) => Promise<void>;
15
- }
15
+ };
16
16
  export declare function sleepWithSignal(milliseconds: number, signal?: AbortSignal): Promise<void>;
17
17
  export declare class BoundedRateLimiter {
18
18
  private readonly config;