@inflexa-ai/harness 0.45.1 → 0.46.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (789) hide show
  1. package/README.md +6 -3
  2. package/dist/agents/conversation-agent.d.ts +9 -3
  3. package/dist/agents/conversation-agent.js +34 -33
  4. package/dist/agents/report-session-agent.d.ts +15 -15
  5. package/dist/agents/report-session-agent.js +23 -15
  6. package/dist/agents/sandbox/index.d.ts +1 -1
  7. package/dist/agents/sandbox/index.js +1 -1
  8. package/dist/agents/sandbox/shared.d.ts +12 -14
  9. package/dist/agents/sandbox/shared.js +18 -12
  10. package/dist/agents/sandbox/types.d.ts +4 -4
  11. package/dist/agents/sandbox/validate-skills.d.ts +2 -2
  12. package/dist/agents/sandbox/validate-skills.js +3 -1
  13. package/dist/agents/sandbox-catalog.d.ts +2 -2
  14. package/dist/agents/sandbox-catalog.js +3 -3
  15. package/dist/agents/system-prompt.d.ts +2 -2
  16. package/dist/app/chat-turn-workflow.d.ts +114 -0
  17. package/dist/app/chat-turn-workflow.js +307 -0
  18. package/dist/app/chat-turn.d.ts +85 -57
  19. package/dist/app/chat-turn.js +123 -100
  20. package/dist/app/data-profile-orientation.js +10 -8
  21. package/dist/app/data-profile-view.d.ts +4 -4
  22. package/dist/app/data-profile-view.js +9 -8
  23. package/dist/app/in-process-turn.d.ts +42 -0
  24. package/dist/app/in-process-turn.js +139 -0
  25. package/dist/app/message-assembly.d.ts +10 -4
  26. package/dist/app/message-assembly.js +13 -8
  27. package/dist/app/report-session-runtime.d.ts +4 -4
  28. package/dist/app/report-session-runtime.js +36 -21
  29. package/dist/app/spawn-report-session.d.ts +33 -28
  30. package/dist/app/spawn-report-session.js +25 -40
  31. package/dist/app/synthesize-run.d.ts +22 -16
  32. package/dist/app/synthesize-run.js +41 -35
  33. package/dist/app/work.d.ts +96 -0
  34. package/dist/app/work.js +147 -0
  35. package/dist/auth/local-auth-context.d.ts +1 -3
  36. package/dist/auth/local-auth-context.js +1 -3
  37. package/dist/auth/local-run-authorizer.d.ts +1 -1
  38. package/dist/auth/local-run-authorizer.js +5 -3
  39. package/dist/auth/types.d.ts +26 -26
  40. package/dist/billing/cached-resolver.d.ts +4 -4
  41. package/dist/billing/run-charge.d.ts +5 -8
  42. package/dist/billing/run-charge.js +2 -2
  43. package/dist/billing/usage-recorder.d.ts +9 -9
  44. package/dist/citations/aggregate.js +1 -1
  45. package/dist/citations/clients/arxiv.d.ts +2 -2
  46. package/dist/citations/clients/arxiv.js +12 -4
  47. package/dist/citations/clients/common.js +4 -2
  48. package/dist/citations/clients/crossref.d.ts +2 -2
  49. package/dist/citations/clients/crossref.js +37 -37
  50. package/dist/citations/clients/doi-registry.js +15 -16
  51. package/dist/citations/clients/pubmed.d.ts +2 -2
  52. package/dist/citations/clients/pubmed.js +20 -13
  53. package/dist/citations/clients/semantic-scholar.d.ts +2 -2
  54. package/dist/citations/clients/semantic-scholar.js +9 -9
  55. package/dist/citations/compare.js +2 -2
  56. package/dist/citations/match.d.ts +2 -2
  57. package/dist/citations/match.js +12 -7
  58. package/dist/citations/normalize.js +35 -26
  59. package/dist/citations/plan.js +6 -2
  60. package/dist/citations/resolve.d.ts +6 -6
  61. package/dist/citations/resolve.js +34 -25
  62. package/dist/citations/types.d.ts +77 -77
  63. package/dist/config/environment-stores.d.ts +6 -6
  64. package/dist/config/resource-limits.js +1 -3
  65. package/dist/contracts/analogy-report.d.ts +7 -7
  66. package/dist/contracts/analogy-report.js +2 -2
  67. package/dist/contracts/chat-events.d.ts +38 -24
  68. package/dist/contracts/chat-frame.d.ts +15 -5
  69. package/dist/contracts/chat-frame.js +64 -41
  70. package/dist/contracts/chat-parts.d.ts +130 -67
  71. package/dist/contracts/chat-parts.js +1 -0
  72. package/dist/contracts/content-url.js +16 -2
  73. package/dist/contracts/data-profile.d.ts +38 -38
  74. package/dist/contracts/index.d.ts +2 -2
  75. package/dist/contracts/index.js +1 -1
  76. package/dist/contracts/message.d.ts +6 -6
  77. package/dist/contracts/organ-system.d.ts +11 -11
  78. package/dist/contracts/part-registry.d.ts +5 -4
  79. package/dist/contracts/part-registry.js +5 -0
  80. package/dist/contracts/profile-vocabulary.d.ts +11 -10
  81. package/dist/contracts/profile-vocabulary.js +10 -3
  82. package/dist/contracts/report-blocks.d.ts +329 -329
  83. package/dist/contracts/report-reference.d.ts +105 -81
  84. package/dist/contracts/report-reference.js +30 -13
  85. package/dist/contracts/schemas/chat-events.d.ts +30 -16
  86. package/dist/contracts/schemas/chat-events.js +15 -6
  87. package/dist/contracts/schemas/chat-parts.d.ts +175 -102
  88. package/dist/contracts/schemas/chat-parts.js +33 -7
  89. package/dist/contracts/severity.d.ts +1 -1
  90. package/dist/contracts/structure-source.d.ts +3 -3
  91. package/dist/contracts/structure-source.js +6 -2
  92. package/dist/contracts/subagent-activity.d.ts +2 -2
  93. package/dist/contracts/subagent-activity.js +5 -3
  94. package/dist/contracts/usage.d.ts +2 -2
  95. package/dist/data/safety-panel-schema.d.ts +25 -25
  96. package/dist/data/safety-panel-schema.js +13 -4
  97. package/dist/execution/artifact-metadata.d.ts +23 -15
  98. package/dist/execution/artifact-metadata.js +33 -10
  99. package/dist/execution/artifact-record.d.ts +2 -2
  100. package/dist/execution/artifact-registration.d.ts +5 -5
  101. package/dist/execution/artifact-registry.d.ts +8 -8
  102. package/dist/execution/dbos-run-launcher.d.ts +24 -4
  103. package/dist/execution/dbos-run-launcher.js +58 -4
  104. package/dist/execution/dbos-workflow-purger.d.ts +5 -6
  105. package/dist/execution/dbos-workflow-purger.js +8 -7
  106. package/dist/execution/input-signature.d.ts +2 -2
  107. package/dist/execution/post-step-pipeline.d.ts +9 -9
  108. package/dist/execution/post-step-pipeline.js +1 -1
  109. package/dist/execution/post-step.js +2 -2
  110. package/dist/execution/reconcile-manifest.d.ts +4 -4
  111. package/dist/execution/reconcile-manifest.js +3 -2
  112. package/dist/execution/run-authorizer.d.ts +46 -37
  113. package/dist/execution/run-authorizer.js +8 -8
  114. package/dist/execution/run-canceler.d.ts +7 -7
  115. package/dist/execution/run-canceler.js +14 -7
  116. package/dist/execution/run-end-record.d.ts +2 -3
  117. package/dist/execution/run-event-parts.d.ts +0 -8
  118. package/dist/execution/run-event-parts.js +29 -24
  119. package/dist/execution/run-event-stream.d.ts +8 -8
  120. package/dist/execution/run-event-stream.js +3 -4
  121. package/dist/execution/run-launcher.d.ts +4 -4
  122. package/dist/execution/run-synthesis.d.ts +49 -48
  123. package/dist/execution/run-synthesis.js +96 -255
  124. package/dist/execution/staged-input.d.ts +2 -2
  125. package/dist/execution/step-summary.d.ts +6 -6
  126. package/dist/execution/step-summary.js +4 -8
  127. package/dist/execution/topo-sort.js +4 -3
  128. package/dist/execution/workflow-purger.d.ts +2 -2
  129. package/dist/index.d.ts +17 -20
  130. package/dist/index.js +25 -36
  131. package/dist/input-sanitization.js +9 -2
  132. package/dist/input-scan/clustering.d.ts +6 -6
  133. package/dist/input-scan/clustering.js +11 -5
  134. package/dist/input-scan/companions.js +3 -2
  135. package/dist/input-scan/detect-sets.d.ts +2 -2
  136. package/dist/input-scan/detect-sets.js +25 -21
  137. package/dist/input-scan/enrich.d.ts +6 -6
  138. package/dist/input-scan/enrich.js +29 -12
  139. package/dist/input-scan/formats.d.ts +2 -2
  140. package/dist/input-scan/formats.js +8 -2
  141. package/dist/input-scan/markers.d.ts +2 -2
  142. package/dist/input-scan/markers.js +14 -5
  143. package/dist/input-scan/menu.d.ts +10 -10
  144. package/dist/input-scan/menu.js +0 -0
  145. package/dist/input-scan/quarantine.d.ts +2 -2
  146. package/dist/input-scan/quarantine.js +23 -18
  147. package/dist/input-scan/readout-budget.d.ts +2 -2
  148. package/dist/input-scan/readout-budget.js +1 -1
  149. package/dist/input-scan/readout.d.ts +2 -2
  150. package/dist/input-scan/readout.js +47 -34
  151. package/dist/input-scan/scan.d.ts +2 -2
  152. package/dist/input-scan/scan.js +7 -5
  153. package/dist/input-scan/set-types.d.ts +28 -28
  154. package/dist/input-scan/shapes.d.ts +4 -4
  155. package/dist/input-scan/shapes.js +0 -0
  156. package/dist/input-scan/templates.d.ts +10 -10
  157. package/dist/input-scan/templates.js +30 -22
  158. package/dist/input-scan/tokens.d.ts +6 -4
  159. package/dist/input-scan/tokens.js +100 -38
  160. package/dist/input-scan/types.d.ts +22 -22
  161. package/dist/lib/async-utils.d.ts +3 -7
  162. package/dist/lib/async-utils.js +5 -9
  163. package/dist/lib/cache.js +1 -1
  164. package/dist/lib/chrome.d.ts +46 -6
  165. package/dist/lib/console-logger.js +2 -2
  166. package/dist/lib/db-result.d.ts +22 -6
  167. package/dist/lib/db-result.js +9 -13
  168. package/dist/lib/eyes.d.ts +4 -4
  169. package/dist/lib/eyes.js +1 -1
  170. package/dist/lib/fs-helpers.js +18 -6
  171. package/dist/lib/fs-result.d.ts +1 -0
  172. package/dist/lib/fs-result.js +5 -6
  173. package/dist/lib/hooks.d.ts +23 -7
  174. package/dist/lib/hooks.js +17 -3
  175. package/dist/lib/host-concurrency.js +3 -2
  176. package/dist/lib/logger.d.ts +2 -2
  177. package/dist/lib/logger.js +2 -1
  178. package/dist/lib/metrics.d.ts +1 -1
  179. package/dist/lib/null-proto.d.ts +6 -0
  180. package/dist/lib/null-proto.js +17 -0
  181. package/dist/lib/otel-spans.d.ts +1 -1
  182. package/dist/lib/otel-spans.js +9 -5
  183. package/dist/lib/otel.d.ts +4 -2
  184. package/dist/lib/otel.js +10 -2
  185. package/dist/lib/page-capture.d.ts +8 -8
  186. package/dist/lib/page-capture.js +9 -4
  187. package/dist/lib/parse-json.d.ts +5 -0
  188. package/dist/lib/parse-json.js +12 -0
  189. package/dist/lib/present.d.ts +12 -0
  190. package/dist/lib/present.js +39 -0
  191. package/dist/lib/rate-limit.d.ts +4 -4
  192. package/dist/lib/rate-limit.js +12 -13
  193. package/dist/lib/regulatory-corpus/fetch-fda-guidance.d.ts +4 -4
  194. package/dist/lib/regulatory-corpus/fetch-fda-guidance.js +4 -10
  195. package/dist/lib/regulatory-corpus/fetch-ich.d.ts +4 -4
  196. package/dist/lib/regulatory-corpus/fetch-ich.js +18 -14
  197. package/dist/lib/regulatory-corpus/normalize-whitespace.d.ts +6 -0
  198. package/dist/lib/regulatory-corpus/normalize-whitespace.js +41 -0
  199. package/dist/lib/regulatory-corpus.d.ts +10 -10
  200. package/dist/lib/regulatory-corpus.js +3 -1
  201. package/dist/lib/result.d.ts +10 -11
  202. package/dist/lib/result.js +15 -13
  203. package/dist/lib/storage.d.ts +2 -2
  204. package/dist/lib/test/async-iterable.d.ts +9 -0
  205. package/dist/lib/test/async-iterable.js +28 -0
  206. package/dist/lib/test/request-url.d.ts +5 -0
  207. package/dist/lib/test/request-url.js +7 -0
  208. package/dist/lib/test/result-assert.d.ts +12 -0
  209. package/dist/lib/test/result-assert.js +17 -0
  210. package/dist/lib/test/text-shapes.d.ts +24 -0
  211. package/dist/lib/test/text-shapes.js +63 -0
  212. package/dist/lib/text.d.ts +22 -0
  213. package/dist/lib/text.js +68 -0
  214. package/dist/lib/thrown.d.ts +18 -0
  215. package/dist/lib/thrown.js +30 -0
  216. package/dist/lib/unknown-array.d.ts +6 -0
  217. package/dist/lib/unknown-array.js +8 -0
  218. package/dist/lib/unknown-containers.d.ts +14 -0
  219. package/dist/lib/unknown-containers.js +17 -0
  220. package/dist/lib/unknown-text.d.ts +8 -0
  221. package/dist/lib/unknown-text.js +28 -0
  222. package/dist/lib/zod-issue-shape.d.ts +1 -1
  223. package/dist/lib/zod-issue-shape.js +31 -31
  224. package/dist/lib/zod-issues.d.ts +3 -3
  225. package/dist/lib/zod-issues.js +30 -17
  226. package/dist/literature/sources/arxiv.d.ts +6 -6
  227. package/dist/literature/sources/arxiv.js +92 -35
  228. package/dist/literature/sources/http.d.ts +2 -2
  229. package/dist/literature/sources/http.js +16 -15
  230. package/dist/literature/sources/pubmed.d.ts +16 -16
  231. package/dist/literature/sources/pubmed.js +96 -61
  232. package/dist/literature/sources/semantic-scholar.d.ts +8 -8
  233. package/dist/literature/sources/semantic-scholar.js +22 -13
  234. package/dist/loop/accounting.d.ts +63 -0
  235. package/dist/loop/accounting.js +141 -0
  236. package/dist/loop/call-policy.d.ts +73 -0
  237. package/dist/loop/call-policy.js +109 -0
  238. package/dist/loop/chat-stream.d.ts +62 -0
  239. package/dist/loop/chat-stream.js +237 -0
  240. package/dist/loop/compaction.d.ts +9 -9
  241. package/dist/loop/compaction.js +1 -1
  242. package/dist/loop/metrics.d.ts +12 -15
  243. package/dist/loop/metrics.js +14 -26
  244. package/dist/loop/run-loop.d.ts +233 -0
  245. package/dist/loop/run-loop.js +770 -0
  246. package/dist/loop/sub-agent.d.ts +61 -0
  247. package/dist/loop/sub-agent.js +161 -0
  248. package/dist/loop/tool-adapter.d.ts +98 -0
  249. package/dist/loop/tool-adapter.js +364 -0
  250. package/dist/loop/tool-detail.d.ts +1 -1
  251. package/dist/loop/tool-detail.js +6 -5
  252. package/dist/loop/tool-outcome.d.ts +1 -1
  253. package/dist/loop/tool-output.d.ts +4 -4
  254. package/dist/loop/tool-output.js +2 -2
  255. package/dist/loop/turn-credentials.d.ts +34 -0
  256. package/dist/loop/turn-credentials.js +73 -0
  257. package/dist/loop/types.d.ts +29 -38
  258. package/dist/loop/types.js +2 -7
  259. package/dist/memory/ai-sdk-message-storage.d.ts +5 -5
  260. package/dist/memory/ai-sdk-message-storage.js +13 -11
  261. package/dist/memory/card-builders.d.ts +14 -14
  262. package/dist/memory/card-builders.js +19 -15
  263. package/dist/memory/conversation-display-recorder.d.ts +22 -4
  264. package/dist/memory/conversation-display-recorder.js +43 -24
  265. package/dist/memory/conversation-display-replay.js +3 -2
  266. package/dist/memory/conversation-display-storage.d.ts +15 -7
  267. package/dist/memory/conversation-display-storage.js +141 -36
  268. package/dist/memory/conversation-view.d.ts +4 -4
  269. package/dist/memory/conversation-view.js +5 -4
  270. package/dist/memory/count-tokens.js +10 -8
  271. package/dist/memory/derive-thread-title.d.ts +0 -13
  272. package/dist/memory/derive-thread-title.js +2 -1
  273. package/dist/memory/message-backfill.d.ts +12 -5
  274. package/dist/memory/message-backfill.js +5 -3
  275. package/dist/memory/thread-history.d.ts +36 -21
  276. package/dist/memory/thread-history.js +78 -54
  277. package/dist/memory/thread-store.d.ts +26 -17
  278. package/dist/memory/thread-store.js +15 -9
  279. package/dist/memory/tool-call-integrity.d.ts +2 -2
  280. package/dist/memory/tool-call-integrity.js +4 -3
  281. package/dist/memory/working-memory.d.ts +16 -12
  282. package/dist/memory/working-memory.js +72 -61
  283. package/dist/prompts/briefing.d.ts +12 -12
  284. package/dist/prompts/briefing.js +1 -1
  285. package/dist/prompts/synthesis-agent.d.ts +1 -1
  286. package/dist/prompts/synthesis-agent.js +6 -14
  287. package/dist/provenance/collector.d.ts +6 -6
  288. package/dist/provenance/collector.js +15 -8
  289. package/dist/provenance/exec-frame.d.ts +2 -2
  290. package/dist/provenance/exec-frame.js +6 -1
  291. package/dist/provenance/seam.d.ts +1 -4
  292. package/dist/provenance/types.d.ts +6 -6
  293. package/dist/providers/ai-sdk.d.ts +113 -62
  294. package/dist/providers/ai-sdk.js +283 -518
  295. package/dist/providers/embedding.d.ts +2 -2
  296. package/dist/providers/embedding.js +1 -1
  297. package/dist/providers/errors.d.ts +22 -2
  298. package/dist/providers/errors.js +98 -50
  299. package/dist/providers/prompt-cache.d.ts +8 -8
  300. package/dist/providers/prompt-cache.js +13 -11
  301. package/dist/providers/reasoning.d.ts +2 -2
  302. package/dist/providers/reasoning.js +2 -2
  303. package/dist/providers/types.d.ts +55 -94
  304. package/dist/reference-data/catalog.d.ts +2 -15
  305. package/dist/reference-data/catalog.js +25 -8
  306. package/dist/reference-data/receipt.d.ts +2 -2
  307. package/dist/report-model/assert-rules.js +1 -1
  308. package/dist/report-model/authoring-grammar.d.ts +211 -233
  309. package/dist/report-model/block-walk.d.ts +10 -10
  310. package/dist/report-model/block-walk.js +2 -0
  311. package/dist/report-model/draft-finish.d.ts +8 -8
  312. package/dist/report-model/draft-finish.js +1 -1
  313. package/dist/report-model/draft-hash.js +8 -7
  314. package/dist/report-model/draft-operations.d.ts +22 -10
  315. package/dist/report-model/draft-operations.js +48 -30
  316. package/dist/report-model/draft-read.d.ts +19 -7
  317. package/dist/report-model/draft-read.js +16 -6
  318. package/dist/report-model/draft.d.ts +844 -2
  319. package/dist/report-model/draft.js +3 -1
  320. package/dist/report-model/fixture-resolver.js +39 -16
  321. package/dist/report-model/pin-snapshot.d.ts +2 -2
  322. package/dist/report-model/pin-snapshot.js +15 -15
  323. package/dist/report-model/production-resolver.d.ts +18 -18
  324. package/dist/report-model/production-resolver.js +50 -42
  325. package/dist/report-model/reference-resolver.d.ts +26 -10
  326. package/dist/report-model/reference-resolver.js +68 -5
  327. package/dist/report-model/reference-stamp.js +30 -38
  328. package/dist/report-model/structural-validation.js +12 -4
  329. package/dist/report-model/validate.d.ts +7 -7
  330. package/dist/report-model/validate.js +6 -6
  331. package/dist/report-render/assets.d.ts +2 -2
  332. package/dist/report-render/assets.js +27 -3
  333. package/dist/report-render/chart-export.d.ts +10 -2
  334. package/dist/report-render/chart-export.js +37 -11
  335. package/dist/report-render/chart-presets.d.ts +8 -8
  336. package/dist/report-render/chart-presets.js +3 -3
  337. package/dist/report-render/chart-renderers.d.ts +23 -16
  338. package/dist/report-render/chart-renderers.js +74 -53
  339. package/dist/report-render/chart-toolbox.d.ts +2 -2
  340. package/dist/report-render/chart-toolbox.js +7 -6
  341. package/dist/report-render/chart.d.ts +15 -16
  342. package/dist/report-render/chart.js +369 -252
  343. package/dist/report-render/design.d.ts +36 -297
  344. package/dist/report-render/design.js +0 -12
  345. package/dist/report-render/figures/common.d.ts +12 -12
  346. package/dist/report-render/figures/common.js +42 -31
  347. package/dist/report-render/figures/dendrogram.d.ts +3 -3
  348. package/dist/report-render/figures/dendrogram.js +10 -10
  349. package/dist/report-render/figures/dense.js +15 -8
  350. package/dist/report-render/figures/dotplot.js +46 -33
  351. package/dist/report-render/figures/embedding.js +52 -43
  352. package/dist/report-render/figures/equal-units.d.ts +10 -10
  353. package/dist/report-render/figures/equal-units.js +27 -27
  354. package/dist/report-render/figures/forest.js +9 -7
  355. package/dist/report-render/figures/gsea.js +21 -11
  356. package/dist/report-render/figures/heatmap.js +13 -9
  357. package/dist/report-render/figures/index.d.ts +10 -10
  358. package/dist/report-render/figures/index.js +4 -2
  359. package/dist/report-render/figures/km.js +10 -9
  360. package/dist/report-render/figures/label-room.d.ts +12 -12
  361. package/dist/report-render/figures/label-room.js +7 -2
  362. package/dist/report-render/figures/locuszoom.d.ts +2 -2
  363. package/dist/report-render/figures/locuszoom.js +59 -31
  364. package/dist/report-render/figures/lollipop.js +3 -2
  365. package/dist/report-render/figures/ma.js +8 -4
  366. package/dist/report-render/figures/manhattan.d.ts +1 -2
  367. package/dist/report-render/figures/manhattan.js +52 -34
  368. package/dist/report-render/figures/oncoprint.js +4 -5
  369. package/dist/report-render/figures/pca.js +25 -11
  370. package/dist/report-render/figures/qq.js +20 -9
  371. package/dist/report-render/figures/roc.js +1 -1
  372. package/dist/report-render/figures/sankey.d.ts +2 -2
  373. package/dist/report-render/figures/sankey.js +11 -10
  374. package/dist/report-render/figures/upset.d.ts +6 -6
  375. package/dist/report-render/figures/upset.js +7 -4
  376. package/dist/report-render/figures/volcano.js +12 -10
  377. package/dist/report-render/hybrid-svg.d.ts +4 -4
  378. package/dist/report-render/hybrid-svg.js +7 -5
  379. package/dist/report-render/number-format.d.ts +4 -4
  380. package/dist/report-render/number-format.js +62 -27
  381. package/dist/report-render/page.js +2 -1
  382. package/dist/report-render/provenance-data.d.ts +2 -2
  383. package/dist/report-render/references.d.ts +4 -4
  384. package/dist/report-render/render.d.ts +2 -2
  385. package/dist/report-render/render.js +10 -11
  386. package/dist/report-render/script-json.js +1 -1
  387. package/dist/report-render/table-data.d.ts +6 -6
  388. package/dist/report-render/test/options.d.ts +49 -0
  389. package/dist/report-render/test/options.js +143 -0
  390. package/dist/report-render/test/page-function.d.ts +19 -0
  391. package/dist/report-render/test/page-function.js +33 -0
  392. package/dist/report-render/types.d.ts +10 -10
  393. package/dist/report-render/value-bridge.d.ts +4 -4
  394. package/dist/report-render/value-bridge.js +27 -14
  395. package/dist/report-render/views/chart-view.d.ts +2 -2
  396. package/dist/report-render/views/chart-view.js +2 -2
  397. package/dist/report-render/views/lineage.d.ts +6 -6
  398. package/dist/report-render/views/lineage.js +2 -0
  399. package/dist/report-render/views/page-view.d.ts +2 -2
  400. package/dist/report-render/views/page-view.js +1 -0
  401. package/dist/report-render/views/prose.js +25 -8
  402. package/dist/report-render/views/references-view.js +12 -1
  403. package/dist/report-render/views/values.js +1 -1
  404. package/dist/runtime/assemble.d.ts +53 -26
  405. package/dist/runtime/assemble.js +103 -56
  406. package/dist/runtime/boot.d.ts +8 -7
  407. package/dist/runtime/boot.js +1 -1
  408. package/dist/runtime/connection-budget.d.ts +6 -6
  409. package/dist/runtime/connection-budget.js +1 -1
  410. package/dist/runtime/dbos.d.ts +29 -19
  411. package/dist/runtime/dbos.js +35 -20
  412. package/dist/runtime/result-serialization.js +18 -5
  413. package/dist/runtime/shutdown.d.ts +2 -2
  414. package/dist/sandbox/client.d.ts +7 -3
  415. package/dist/sandbox/cpu-files.d.ts +2 -2
  416. package/dist/sandbox/cpu-files.js +21 -4
  417. package/dist/sandbox/create-sandbox.d.ts +7 -8
  418. package/dist/sandbox/create-sandbox.js +6 -12
  419. package/dist/sandbox/docker-client.d.ts +48 -3
  420. package/dist/sandbox/docker-client.js +10 -6
  421. package/dist/sandbox/estimate-data-profile-resources.js +2 -7
  422. package/dist/sandbox/exec-outcome.d.ts +2 -2
  423. package/dist/sandbox/exec-outcome.js +1 -1
  424. package/dist/sandbox/exec.d.ts +10 -6
  425. package/dist/sandbox/exec.js +27 -12
  426. package/dist/sandbox/execution-id.js +14 -6
  427. package/dist/sandbox/farm.d.ts +2 -2
  428. package/dist/sandbox/farm.js +22 -27
  429. package/dist/sandbox/identity.d.ts +7 -0
  430. package/dist/sandbox/identity.js +14 -3
  431. package/dist/sandbox/image-packages.js +15 -27
  432. package/dist/sandbox/k8s-client.d.ts +35 -8
  433. package/dist/sandbox/k8s-client.js +6 -5
  434. package/dist/sandbox/labels.js +1 -0
  435. package/dist/sandbox/liveness.js +3 -1
  436. package/dist/sandbox/mount-plan.d.ts +10 -10
  437. package/dist/sandbox/mount-plan.js +13 -14
  438. package/dist/sandbox/notification-sweep.d.ts +4 -4
  439. package/dist/sandbox/notification-sweep.js +4 -7
  440. package/dist/sandbox/package-identity.d.ts +6 -13
  441. package/dist/sandbox/package-identity.js +46 -28
  442. package/dist/sandbox/reaper.d.ts +10 -10
  443. package/dist/sandbox/reaper.js +4 -6
  444. package/dist/sandbox/sandbox-error.d.ts +2 -9
  445. package/dist/sandbox/sandbox-error.js +21 -8
  446. package/dist/sandbox/sandbox-step-translate.d.ts +8 -5
  447. package/dist/sandbox/sandbox-step-translate.js +22 -8
  448. package/dist/sandbox/step-sandbox.d.ts +47 -0
  449. package/dist/sandbox/step-sandbox.js +53 -0
  450. package/dist/sandbox/types.d.ts +18 -19
  451. package/dist/sandbox/types.js +1 -1
  452. package/dist/schemas/artifact-manifest.d.ts +4 -4
  453. package/dist/schemas/data-profile-schemas.d.ts +343 -298
  454. package/dist/schemas/file-metadata.js +2 -4
  455. package/dist/schemas/plan-schemas.d.ts +31 -31
  456. package/dist/schemas/run-synthesis.d.ts +95 -26
  457. package/dist/schemas/run-synthesis.js +3 -1
  458. package/dist/schemas/validate-plan.d.ts +4 -4
  459. package/dist/schemas/validate-plan.js +17 -5
  460. package/dist/schemas/workflow-state.d.ts +19 -19
  461. package/dist/schemas/workflow-state.js +2 -2
  462. package/dist/state/active-turns.d.ts +36 -0
  463. package/dist/state/active-turns.js +67 -0
  464. package/dist/state/analyses-metrics.d.ts +8 -8
  465. package/dist/state/analyses-metrics.js +4 -4
  466. package/dist/state/analyses.d.ts +0 -14
  467. package/dist/state/analyses.js +0 -32
  468. package/dist/state/artifacts.d.ts +32 -19
  469. package/dist/state/artifacts.js +28 -5
  470. package/dist/state/data-profile.d.ts +2 -2
  471. package/dist/state/db.d.ts +12 -2
  472. package/dist/state/db.js +5 -0
  473. package/dist/state/edit-intents.d.ts +4 -0
  474. package/dist/state/edit-intents.js +71 -0
  475. package/dist/state/index.d.ts +4 -4
  476. package/dist/state/index.js +2 -2
  477. package/dist/state/init.d.ts +2 -1
  478. package/dist/state/init.js +5 -2
  479. package/dist/state/migrations/20260927120000_baseline.js +3 -1
  480. package/dist/state/migrations/20261026120000_add_the_edit_intents.d.ts +7 -0
  481. package/dist/state/migrations/20261026120000_add_the_edit_intents.js +21 -0
  482. package/dist/state/migrations/20261027120000_record_the_applied_memory_edits.d.ts +7 -0
  483. package/dist/state/migrations/20261027120000_record_the_applied_memory_edits.js +16 -0
  484. package/dist/state/migrations/20261027120100_store_the_authoring_results.d.ts +8 -0
  485. package/dist/state/migrations/20261027120100_store_the_authoring_results.js +20 -0
  486. package/dist/state/migrations/20261027120200_key_the_groups_of_a_turn.d.ts +7 -0
  487. package/dist/state/migrations/20261027120200_key_the_groups_of_a_turn.js +12 -0
  488. package/dist/state/migrations/20261027120300_mark_the_active_turn_of_a_thread.d.ts +7 -0
  489. package/dist/state/migrations/20261027120300_mark_the_active_turn_of_a_thread.js +11 -0
  490. package/dist/state/migrations/20261028120000_record_the_paused_work.d.ts +7 -0
  491. package/dist/state/migrations/20261028120000_record_the_paused_work.js +25 -0
  492. package/dist/state/migrations/20261028120100_end_the_suspended_runs.d.ts +8 -0
  493. package/dist/state/migrations/20261028120100_end_the_suspended_runs.js +13 -0
  494. package/dist/state/migrations/20261029120000_reference_the_run_mandate.d.ts +7 -0
  495. package/dist/state/migrations/20261029120000_reference_the_run_mandate.js +23 -0
  496. package/dist/state/migrations/20261029120100_record_the_run_session_of_a_pause.d.ts +7 -0
  497. package/dist/state/migrations/20261029120100_record_the_run_session_of_a_pause.js +11 -0
  498. package/dist/state/migrations/index.js +18 -0
  499. package/dist/state/paused-work.d.ts +52 -0
  500. package/dist/state/paused-work.js +105 -0
  501. package/dist/state/plans.d.ts +27 -8
  502. package/dist/state/plans.js +14 -11
  503. package/dist/state/purge-analysis.d.ts +6 -6
  504. package/dist/state/purge-analysis.js +10 -2
  505. package/dist/state/report-session-state.d.ts +43 -18
  506. package/dist/state/report-session-state.js +43 -4
  507. package/dist/state/report-versions.d.ts +16 -11
  508. package/dist/state/report-versions.js +5 -3
  509. package/dist/state/runs.d.ts +30 -19
  510. package/dist/state/runs.js +43 -51
  511. package/dist/state/schema.d.ts +18 -21
  512. package/dist/state/schema.js +4 -5
  513. package/dist/state/snapshot-parse.d.ts +2 -2
  514. package/dist/state/snapshot-parse.js +14 -8
  515. package/dist/state/step-executions.d.ts +20 -8
  516. package/dist/state/step-executions.js +6 -4
  517. package/dist/state/tool-outputs.d.ts +2 -2
  518. package/dist/state/tool-outputs.js +2 -1
  519. package/dist/state/vector-store.d.ts +16 -16
  520. package/dist/state/vector-store.js +11 -7
  521. package/dist/tasks/data-profile-absorb.d.ts +3 -3
  522. package/dist/tasks/data-profile-absorb.js +21 -16
  523. package/dist/tasks/data-profile-activity.d.ts +5 -5
  524. package/dist/tasks/data-profile-activity.js +5 -5
  525. package/dist/tasks/data-profile-index.d.ts +4 -4
  526. package/dist/tasks/data-profile-index.js +32 -17
  527. package/dist/tasks/data-profile-resolve.d.ts +8 -8
  528. package/dist/tasks/data-profile-resolve.js +88 -62
  529. package/dist/tasks/data-profile.d.ts +40 -31
  530. package/dist/tasks/data-profile.js +138 -95
  531. package/dist/tasks/extract-values.d.ts +26 -79
  532. package/dist/tasks/extract-values.js +48 -108
  533. package/dist/tasks/refresh-regulatory-corpus.d.ts +4 -20
  534. package/dist/tasks/refresh-regulatory-corpus.js +12 -8
  535. package/dist/tasks/regulatory-corpus-boot-refresh.d.ts +2 -2
  536. package/dist/tasks/regulatory-corpus-boot-refresh.js +12 -10
  537. package/dist/testing.d.ts +60 -0
  538. package/dist/testing.js +96 -0
  539. package/dist/tools/ad-hoc-router.d.ts +9 -9
  540. package/dist/tools/ad-hoc-router.js +65 -52
  541. package/dist/tools/analysis-invocation.d.ts +7 -0
  542. package/dist/tools/analysis-invocation.js +29 -5
  543. package/dist/tools/approval/contract.d.ts +8 -52
  544. package/dist/tools/approval/contract.js +7 -36
  545. package/dist/tools/approval/gateway.d.ts +27 -28
  546. package/dist/tools/approval/gateway.js +33 -130
  547. package/dist/tools/approval/queries.d.ts +6 -11
  548. package/dist/tools/approval/queries.js +43 -29
  549. package/dist/tools/approval/uuidv7.js +2 -2
  550. package/dist/tools/bio/chembl.d.ts +3 -3
  551. package/dist/tools/bio/chembl.js +10 -0
  552. package/dist/tools/bio/comptox.d.ts +25 -8
  553. package/dist/tools/bio/comptox.js +4 -2
  554. package/dist/tools/bio/drug-gene-interactions.d.ts +27 -17
  555. package/dist/tools/bio/drug-gene-interactions.js +11 -8
  556. package/dist/tools/bio/gene-disease-evidence.d.ts +61 -15
  557. package/dist/tools/bio/gene-disease-evidence.js +10 -6
  558. package/dist/tools/bio/gene-preclinical-profile.d.ts +11 -11
  559. package/dist/tools/bio/keys.d.ts +2 -2
  560. package/dist/tools/bio/keys.js +3 -3
  561. package/dist/tools/bio/lookup-annotation.d.ts +5 -5
  562. package/dist/tools/bio/lookup-annotation.js +3 -0
  563. package/dist/tools/bio/opentargets.d.ts +1 -1
  564. package/dist/tools/bio/opentargets.js +6 -0
  565. package/dist/tools/bio/pubchem.d.ts +2 -2
  566. package/dist/tools/bio/pubchem.js +6 -0
  567. package/dist/tools/bio/pubmed.d.ts +26 -16
  568. package/dist/tools/bio/pubmed.js +9 -3
  569. package/dist/tools/bio/search-clinical-trials.d.ts +4 -4
  570. package/dist/tools/bio/search-clinical-trials.js +5 -1
  571. package/dist/tools/bio/search-faers.d.ts +2 -2
  572. package/dist/tools/bio/search-faers.js +1 -1
  573. package/dist/tools/bio/search-gene.d.ts +2 -2
  574. package/dist/tools/bio/search-gene.js +1 -0
  575. package/dist/tools/bio/search-geo-datasets.d.ts +4 -4
  576. package/dist/tools/bio/search-geo-datasets.js +5 -5
  577. package/dist/tools/bio/search-interactions.d.ts +1 -1
  578. package/dist/tools/bio/search-patents.d.ts +28 -22
  579. package/dist/tools/bio/search-patents.js +20 -17
  580. package/dist/tools/bio/search-protein.d.ts +2 -2
  581. package/dist/tools/bio/search-protein.js +1 -1
  582. package/dist/tools/bio/search-regulatory-approvals.d.ts +64 -18
  583. package/dist/tools/bio/search-regulatory-approvals.js +21 -16
  584. package/dist/tools/bio/target-safety.d.ts +8 -8
  585. package/dist/tools/bio/target-safety.js +11 -6
  586. package/dist/tools/capability-data.d.ts +9 -5
  587. package/dist/tools/capability-data.js +2 -1
  588. package/dist/tools/define-tool.d.ts +55 -46
  589. package/dist/tools/define-tool.js +39 -27
  590. package/dist/tools/display/normalize-echart-spec.d.ts +2 -2
  591. package/dist/tools/display/normalize-echart-spec.js +51 -27
  592. package/dist/tools/display/show-user.d.ts +2 -2
  593. package/dist/tools/display/show-user.js +1 -1
  594. package/dist/tools/execute-analysis.d.ts +19 -10
  595. package/dist/tools/execute-analysis.js +83 -62
  596. package/dist/tools/knowledge/check.d.ts +166 -44
  597. package/dist/tools/knowledge/check.js +5 -3
  598. package/dist/tools/knowledge/client.d.ts +31 -62
  599. package/dist/tools/knowledge/client.js +44 -27
  600. package/dist/tools/knowledge/environment.d.ts +6 -6
  601. package/dist/tools/knowledge/environment.js +18 -7
  602. package/dist/tools/knowledge/index.d.ts +2 -2
  603. package/dist/tools/knowledge/index.js +9 -9
  604. package/dist/tools/knowledge/local-slots.d.ts +4 -4
  605. package/dist/tools/knowledge/local-slots.js +11 -4
  606. package/dist/tools/knowledge/pin.d.ts +2 -2
  607. package/dist/tools/knowledge/recommend.d.ts +20 -45
  608. package/dist/tools/knowledge/recommend.js +27 -19
  609. package/dist/tools/knowledge/situation.d.ts +40 -40
  610. package/dist/tools/knowledge/situation.js +2 -9
  611. package/dist/tools/knowledge/skeleton.d.ts +4 -4
  612. package/dist/tools/knowledge/skeleton.js +10 -11
  613. package/dist/tools/knowledge/template.d.ts +20 -18
  614. package/dist/tools/knowledge/template.js +38 -32
  615. package/dist/tools/lib/alphafold-client.js +2 -1
  616. package/dist/tools/lib/amass-client.d.ts +28 -28
  617. package/dist/tools/lib/amass-client.js +20 -10
  618. package/dist/tools/lib/api-utils.d.ts +13 -3
  619. package/dist/tools/lib/api-utils.js +17 -3
  620. package/dist/tools/lib/bgee-client.d.ts +6 -6
  621. package/dist/tools/lib/bgee-client.js +16 -10
  622. package/dist/tools/lib/cbioportal-client.d.ts +4 -4
  623. package/dist/tools/lib/cbioportal-client.js +9 -8
  624. package/dist/tools/lib/chembl-client.d.ts +14 -14
  625. package/dist/tools/lib/chembl-client.js +11 -4
  626. package/dist/tools/lib/clinical-benchmarks-client.d.ts +4 -4
  627. package/dist/tools/lib/clinical-benchmarks-client.js +4 -7
  628. package/dist/tools/lib/clinical-trials-client.d.ts +18 -18
  629. package/dist/tools/lib/clinical-trials-client.js +10 -10
  630. package/dist/tools/lib/clinvar-client.d.ts +2 -2
  631. package/dist/tools/lib/clinvar-client.js +6 -6
  632. package/dist/tools/lib/ctx-ops.d.ts +23 -23
  633. package/dist/tools/lib/ctx-ops.js +13 -10
  634. package/dist/tools/lib/dgidb-client.d.ts +6 -6
  635. package/dist/tools/lib/dgidb-client.js +10 -12
  636. package/dist/tools/lib/disgenet-client.d.ts +4 -4
  637. package/dist/tools/lib/ema-client.d.ts +2 -2
  638. package/dist/tools/lib/ensembl-client.d.ts +4 -4
  639. package/dist/tools/lib/ensembl-client.js +5 -4
  640. package/dist/tools/lib/gwas-catalog-client.d.ts +4 -4
  641. package/dist/tools/lib/gwas-catalog-client.js +17 -17
  642. package/dist/tools/lib/html-text.d.ts +6 -0
  643. package/dist/tools/lib/html-text.js +9 -0
  644. package/dist/tools/lib/identifier-resolver.d.ts +4 -4
  645. package/dist/tools/lib/identifier-resolver.js +7 -3
  646. package/dist/tools/lib/impc-client.d.ts +8 -8
  647. package/dist/tools/lib/impc-client.js +46 -35
  648. package/dist/tools/lib/iuphar-client.d.ts +2 -2
  649. package/dist/tools/lib/iuphar-client.js +7 -16
  650. package/dist/tools/lib/monarch-client.d.ts +4 -4
  651. package/dist/tools/lib/openfda-client.d.ts +22 -22
  652. package/dist/tools/lib/openfda-client.js +23 -22
  653. package/dist/tools/lib/opentargets-client.d.ts +12 -12
  654. package/dist/tools/lib/pathway-client.d.ts +4 -4
  655. package/dist/tools/lib/pathway-client.js +15 -19
  656. package/dist/tools/lib/pharmgkb-client.d.ts +2 -2
  657. package/dist/tools/lib/pharmgkb-client.js +1 -1
  658. package/dist/tools/lib/protein-family-modality.d.ts +2 -2
  659. package/dist/tools/lib/protein-family-modality.js +0 -2
  660. package/dist/tools/lib/protein-family-normalize.js +7 -0
  661. package/dist/tools/lib/pubchem-client.d.ts +2 -2
  662. package/dist/tools/lib/pubchem-client.js +1 -0
  663. package/dist/tools/lib/pubchem-ops.d.ts +4 -4
  664. package/dist/tools/lib/pubchem-ops.js +8 -0
  665. package/dist/tools/lib/pubmed-client.d.ts +9 -9
  666. package/dist/tools/lib/pubmed-client.js +1 -1
  667. package/dist/tools/lib/string-client.d.ts +6 -6
  668. package/dist/tools/lib/uniprot-client.d.ts +8 -8
  669. package/dist/tools/lib/uniprot-client.js +5 -1
  670. package/dist/tools/memory/update-working-memory.d.ts +16 -13
  671. package/dist/tools/memory/update-working-memory.js +21 -3
  672. package/dist/tools/read-tool-output.js +8 -2
  673. package/dist/tools/registry.d.ts +2 -2
  674. package/dist/tools/report-authoring/authoring-tools.d.ts +54 -23
  675. package/dist/tools/report-authoring/authoring-tools.js +128 -62
  676. package/dist/tools/report-session/derive-table.d.ts +19 -59
  677. package/dist/tools/report-session/derive-table.js +120 -122
  678. package/dist/tools/report-session/examine-page.d.ts +6 -6
  679. package/dist/tools/report-session/examine-page.js +14 -12
  680. package/dist/tools/report-session/list-artifacts.d.ts +6 -6
  681. package/dist/tools/report-session/list-artifacts.js +5 -5
  682. package/dist/tools/report-session/page-faults.d.ts +6 -6
  683. package/dist/tools/report-session/page-faults.js +3 -1
  684. package/dist/tools/report-session/preview-report.d.ts +4 -3
  685. package/dist/tools/report-session/preview-report.js +26 -7
  686. package/dist/tools/report-session/record-version.d.ts +9 -4
  687. package/dist/tools/report-session/record-version.js +16 -9
  688. package/dist/tools/report-session/session-page-publisher.d.ts +6 -6
  689. package/dist/tools/research/generate-analogy-report.d.ts +14 -7
  690. package/dist/tools/research/generate-analogy-report.js +80 -76
  691. package/dist/tools/research/generate-plan.d.ts +16 -16
  692. package/dist/tools/research/generate-plan.js +410 -374
  693. package/dist/tools/research/guarded-address.js +3 -2
  694. package/dist/tools/research/inspect-data-profile.d.ts +27 -20
  695. package/dist/tools/research/inspect-data-profile.js +26 -25
  696. package/dist/tools/research/inspect-run.d.ts +54 -27
  697. package/dist/tools/research/inspect-run.js +50 -40
  698. package/dist/tools/research/literature-reviewer.d.ts +8 -7
  699. package/dist/tools/research/literature-reviewer.js +29 -28
  700. package/dist/tools/research/search-arxiv.d.ts +1 -1
  701. package/dist/tools/research/search-arxiv.js +1 -1
  702. package/dist/tools/research/search-github-repos.d.ts +10 -7
  703. package/dist/tools/research/search-github-repos.js +25 -22
  704. package/dist/tools/research/search-semantic-scholar.js +1 -1
  705. package/dist/tools/research/searxng-engine.d.ts +2 -2
  706. package/dist/tools/research/searxng-engine.js +6 -4
  707. package/dist/tools/research/web-fetch.d.ts +24 -21
  708. package/dist/tools/research/web-fetch.js +65 -74
  709. package/dist/tools/research/web-search.d.ts +26 -17
  710. package/dist/tools/research/web-search.js +26 -21
  711. package/dist/tools/sandbox/link-packages.d.ts +11 -7
  712. package/dist/tools/sandbox/link-packages.js +11 -8
  713. package/dist/tools/sandbox/list-available-packages.d.ts +17 -8
  714. package/dist/tools/sandbox/list-available-packages.js +31 -25
  715. package/dist/tools/sandbox/list-available-refs.d.ts +17 -14
  716. package/dist/tools/sandbox/list-available-refs.js +61 -36
  717. package/dist/tools/sandbox/report-blocker.d.ts +30 -37
  718. package/dist/tools/sandbox/report-blocker.js +23 -73
  719. package/dist/tools/sandbox/skills.d.ts +16 -12
  720. package/dist/tools/sandbox/skills.js +16 -12
  721. package/dist/tools/sandbox/submit-file-metadata.d.ts +12 -9
  722. package/dist/tools/sandbox/submit-file-metadata.js +18 -21
  723. package/dist/tools/start-report-session.d.ts +13 -5
  724. package/dist/tools/start-report-session.js +35 -8
  725. package/dist/tools/terminal-text.d.ts +5 -2
  726. package/dist/tools/terminal-text.js +35 -3
  727. package/dist/tools/workspace/decision-record.d.ts +4 -4
  728. package/dist/tools/workspace/decision-record.js +23 -13
  729. package/dist/tools/workspace/edit-file.d.ts +59 -20
  730. package/dist/tools/workspace/edit-file.js +81 -16
  731. package/dist/tools/workspace/execute-command.d.ts +15 -13
  732. package/dist/tools/workspace/execute-command.js +11 -9
  733. package/dist/tools/workspace/file-stat.d.ts +6 -3
  734. package/dist/tools/workspace/grep.d.ts +10 -7
  735. package/dist/tools/workspace/grep.js +9 -3
  736. package/dist/tools/workspace/list-files.d.ts +6 -3
  737. package/dist/tools/workspace/mutator.d.ts +28 -15
  738. package/dist/tools/workspace/mutator.js +107 -53
  739. package/dist/tools/workspace/read-file.d.ts +8 -5
  740. package/dist/tools/workspace/result-bounds.d.ts +5 -5
  741. package/dist/tools/workspace/result-bounds.js +4 -2
  742. package/dist/tools/workspace/run-exec.d.ts +2 -2
  743. package/dist/tools/workspace/run-exec.js +3 -3
  744. package/dist/tools/workspace/scan-inputs.d.ts +8 -5
  745. package/dist/tools/workspace/scan-inputs.js +17 -5
  746. package/dist/tools/workspace/show-file.d.ts +1 -1
  747. package/dist/tools/workspace/show-file.js +2 -1
  748. package/dist/tools/workspace/show-plan.d.ts +8 -5
  749. package/dist/tools/workspace/show-plan.js +9 -8
  750. package/dist/tools/workspace/workspace-search.d.ts +41 -13
  751. package/dist/tools/workspace/workspace-search.js +27 -14
  752. package/dist/tools/workspace/write-file.d.ts +9 -7
  753. package/dist/workflows/execute-analysis-scheduler.d.ts +9 -9
  754. package/dist/workflows/execute-analysis-scheduler.js +6 -3
  755. package/dist/workflows/execute-analysis.d.ts +46 -62
  756. package/dist/workflows/execute-analysis.js +137 -219
  757. package/dist/workflows/pause.d.ts +71 -0
  758. package/dist/workflows/pause.js +173 -0
  759. package/dist/workflows/sandbox-step.d.ts +38 -61
  760. package/dist/workflows/sandbox-step.js +99 -106
  761. package/dist/workflows/test/sql-writes.d.ts +21 -0
  762. package/dist/workflows/test/sql-writes.js +36 -0
  763. package/dist/workspace/filesystem.d.ts +6 -6
  764. package/dist/workspace/filesystem.js +10 -8
  765. package/dist/workspace/paths.d.ts +1 -1
  766. package/dist/workspace/paths.js +15 -4
  767. package/dist/workspace/search-config.d.ts +2 -2
  768. package/dist/workspace/search-config.js +1 -1
  769. package/package.json +21 -22
  770. package/dist/loop/call-guard.d.ts +0 -50
  771. package/dist/loop/call-guard.js +0 -90
  772. package/dist/loop/continue-agent.d.ts +0 -40
  773. package/dist/loop/continue-agent.js +0 -38
  774. package/dist/loop/genai-spans.d.ts +0 -47
  775. package/dist/loop/genai-spans.js +0 -134
  776. package/dist/loop/run-agent.d.ts +0 -245
  777. package/dist/loop/run-agent.js +0 -1124
  778. package/dist/loop/run-step.d.ts +0 -29
  779. package/dist/loop/run-step.js +0 -34
  780. package/dist/loop/run-to-terminal.d.ts +0 -66
  781. package/dist/loop/run-to-terminal.js +0 -93
  782. package/dist/loop/tool-mask.d.ts +0 -23
  783. package/dist/loop/tool-mask.js +0 -46
  784. package/dist/providers/streaming-chat.d.ts +0 -32
  785. package/dist/providers/streaming-chat.js +0 -91
  786. package/dist/tasks/derive-table-exec.d.ts +0 -54
  787. package/dist/tasks/derive-table-exec.js +0 -86
  788. package/dist/workflows/suspension.d.ts +0 -32
  789. package/dist/workflows/suspension.js +0 -38
@@ -26,12 +26,16 @@
26
26
  * nothing again.
27
27
  */
28
28
  import { ok } from "neverthrow";
29
+ import { presentGet } from "../../lib/present.js";
29
30
  import { z } from "zod";
30
31
  import { defineTool, withToolCallRecord } from "../define-tool.js";
31
32
  import { decisionRecordPath, scriptSha256 } from "../workspace/decision-record.js";
32
33
  import { installedPackages } from "./environment.js";
33
34
  import { bindLocalSlots, localParameters, validateLocalSlot } from "./local-slots.js";
35
+ // oxlint-disable-next-line eslint-js/no-restricted-syntax -- the template reference grammar: the tpl- prefix, an id, and an optional @version tail.
34
36
  const TEMPLATE_REF = /^tpl-[a-z0-9-]+(@\d+\.\d+\.\d+)?$/;
37
+ // oxlint-disable-next-line eslint-js/no-restricted-syntax -- a script file name is one segment of the safe file-name charset; the shape is the path-safety rule.
38
+ const SCRIPT_NAME_RE = /^[A-Za-z0-9_.-]+$/;
35
39
  /** A model value equals a bound value when the scalars are identical, or when two lists hold the same strings in order. */
36
40
  function sameValue(bound, value) {
37
41
  if (Array.isArray(bound)) {
@@ -83,6 +87,27 @@ function splitSlots(slots, names) {
83
87
  (names.has(name) ? local : remote)[name] = value;
84
88
  return { local, remote };
85
89
  }
90
+ const KnowledgeTemplateInputSchema = z.object({
91
+ template: z
92
+ .string()
93
+ .regex(TEMPLATE_REF, "a template id, optionally with @version")
94
+ .describe("The template id from the Grounding of the step, with its version, for example `tpl-deseq2-two-group@1.0.0`."),
95
+ slots: z
96
+ .record(z.string(), z.union([z.string(), z.number(), z.boolean(), z.array(z.string())]))
97
+ .describe("The slot values, by slot name. Only the adaptable slots of the template; a pinned slot is refused. Strings, numbers, booleans, and lists of strings."),
98
+ overrides: z
99
+ .array(z.object({
100
+ slot: z.string().min(1).describe("The name of the bound slot whose value you change."),
101
+ reason: z.string().min(1).describe("Why the plan value does not hold for this step, in one sentence."),
102
+ }))
103
+ .optional()
104
+ .describe("One entry per bound slot whose value you change from the plan value. Absent when you send every bound value as it is."),
105
+ script_name: z
106
+ .string()
107
+ .regex(SCRIPT_NAME_RE)
108
+ .optional()
109
+ .describe("The file name under `scripts/`. Defaults to `<template id>.R` or `<template id>.py` by the language of the template."),
110
+ });
86
111
  export function createKnowledgeTemplateTool(deps) {
87
112
  return defineTool({
88
113
  id: "knowledge_template",
@@ -94,30 +119,11 @@ export function createKnowledgeTemplateTool(deps) {
94
119
  "A bound value rides into the script as it is; send it unchanged, or omit it. To change a bound value, send the new value and add an `overrides` entry with the slot and the reason. A changed value without an override is refused before the service call. " +
95
120
  "Prefer the template over a script of your own: it is tested, and it carries the settings of the plan. When the template does not fit the step (a design it does not cover, or an input it cannot read), write the script yourself with `write_file`, and state the reason in your summary. " +
96
121
  "The tool writes `scripts/<template>.R` or `scripts/<template>.py` and `output/decision_record_<script>.json`, one record per rendered script (the step, its claims, the template, the snapshot, each slot with its source, the bound slots, the overrides, the environment match, the citations, and the digest of the script as written), then you run the script with `execute_command` using the command in `run_with`. " +
97
- "A slot value the template refuses comes back as `match: rejected` with the slot and the permitted values; correct it and call again. " +
122
+ "A slot value of the right type that the template refuses comes back as `match: rejected` with the slot and the permitted values; correct it and call again. " +
123
+ "A slot value of a different type (a string for a number, for example) fails the input check of the tool before the template sees it; send the type that the slot states. " +
98
124
  "A change the slots do not cover: use `edit_file` on a line marked `# [adaptable: ...]` in the rendered script, and keep the edit small; the record lists each such edit. " +
99
125
  "`match: unavailable` means the service did not answer, and `match: snapshot_mismatch` means the service moved to another release than the plan pinned; in both cases write the script yourself as you would without this tool, and state it in your summary.",
100
- inputSchema: z.object({
101
- template: z
102
- .string()
103
- .regex(TEMPLATE_REF, "a template id, optionally with @version")
104
- .describe("The template id from the Grounding of the step, with its version, for example `tpl-deseq2-two-group@1.0.0`."),
105
- slots: z
106
- .record(z.string(), z.unknown())
107
- .describe("The slot values, by slot name. Only the adaptable slots of the template; a pinned slot is refused. Strings, numbers, booleans, and lists of strings."),
108
- overrides: z
109
- .array(z.object({
110
- slot: z.string().min(1).describe("The name of the bound slot whose value you change."),
111
- reason: z.string().min(1).describe("Why the plan value does not hold for this step, in one sentence."),
112
- }))
113
- .optional()
114
- .describe("One entry per bound slot whose value you change from the plan value. Absent when you send every bound value as it is."),
115
- script_name: z
116
- .string()
117
- .regex(/^[A-Za-z0-9_.-]+$/)
118
- .optional()
119
- .describe("The file name under `scripts/`. Defaults to `<template id>.R` or `<template id>.py` by the language of the template."),
120
- }),
126
+ inputSchema: KnowledgeTemplateInputSchema,
121
127
  describeCall: ({ template }) => template,
122
128
  describeResult: (_input, result) => "status" in result ? (result.status === "ok" ? `${result.script_path} (${result.environment_match})` : result.status) : result.match,
123
129
  execute: async ({ template, slots, overrides, script_name }, ctx) => {
@@ -161,7 +167,7 @@ export function createKnowledgeTemplateTool(deps) {
161
167
  const localByName = new Map(locals.map((parameter) => [parameter.name, parameter]));
162
168
  // A local value the contract refuses is refused before the service call, thus a bad path costs no render.
163
169
  const localIssues = Object.entries(localValues).flatMap(([name, value]) => {
164
- const issue = validateLocalSlot(localByName.get(name), value);
170
+ const issue = validateLocalSlot(presentGet(localByName, name, "the template parameter of the local value"), value);
165
171
  return issue ? [issue] : [];
166
172
  });
167
173
  if (localIssues.length > 0) {
@@ -169,13 +175,13 @@ export function createKnowledgeTemplateTool(deps) {
169
175
  }
170
176
  const farmLockFile = typeof deps.farmLockFile === "function" ? deps.farmLockFile(ctx.session.scope.analysisId) : deps.farmLockFile;
171
177
  const installed = installedPackages({
172
- ...(farmLockFile ? { farmLockFile } : {}),
173
- ...(deps.imagePackagesFile ? { imagePackagesFile: deps.imagePackagesFile } : {}),
178
+ farmLockFile,
179
+ imagePackagesFile: deps.imagePackagesFile,
174
180
  });
175
181
  const answer = await deps.client.render(template, merged, installed.packages, {
176
- ...(binding?.step ? { step: binding.step } : {}),
177
- ...(binding?.claims ? { claims: binding.claims } : {}),
178
- ...(binding?.snapshot ? { expectedSnapshot: binding.snapshot } : {}),
182
+ step: binding?.step,
183
+ claims: binding?.claims,
184
+ expectedSnapshot: binding?.snapshot,
179
185
  });
180
186
  // A rendered answer carries `ok: true`; the refusals carry `match` and no `ok`.
181
187
  if (!("ok" in answer))
@@ -205,7 +211,7 @@ export function createKnowledgeTemplateTool(deps) {
205
211
  return ok({ status: "write_refused", path: scriptWrite.path, reason: scriptWrite.status });
206
212
  const boundSlots = Object.entries(binding?.slots ?? {}).map(([slot, value]) => ({
207
213
  slot,
208
- value: value,
214
+ value,
209
215
  source: binding ? sourceOf(binding, slot) : "plan",
210
216
  }));
211
217
  const settingsOverrides = boundSlots.flatMap(({ slot, value }) => {
@@ -245,9 +251,9 @@ export function createKnowledgeTemplateTool(deps) {
245
251
  version: answer.template.version,
246
252
  label: answer.template.label,
247
253
  method: { id: answer.template.method.id, label: answer.template.method.label },
248
- ...(answer.template.substitute_for
249
- ? { substitute_for: { id: answer.template.substitute_for.id, label: answer.template.substitute_for.label } }
250
- : {}),
254
+ substitute_for: answer.template.substitute_for === undefined
255
+ ? undefined
256
+ : { id: answer.template.substitute_for.id, label: answer.template.substitute_for.label },
251
257
  },
252
258
  snapshot: answer.snapshot,
253
259
  slots: reportedSlots,
@@ -19,6 +19,7 @@
19
19
  * `found: false` tells the agent to report the absence and not to retry.
20
20
  */
21
21
  import { z } from "zod";
22
+ import { presentFirst } from "../../lib/present.js";
22
23
  import { apiFetchValidated, describeApiError } from "./api-utils.js";
23
24
  const ALPHAFOLD_BASE = "https://alphafold.ebi.ac.uk/api/prediction";
24
25
  /**
@@ -70,7 +71,7 @@ export async function fetchAlphaFoldPrediction(uniprotAccession) {
70
71
  if (entries.length === 0)
71
72
  return null;
72
73
  const exact = entries.find((entry) => entry.uniprotAccession.toUpperCase() === accession.toUpperCase());
73
- return exact ?? entries[0];
74
+ return exact ?? presentFirst(entries, "the fallback entry");
74
75
  }
75
76
  function isAbsence(e) {
76
77
  return e.type === "http_status" && (e.status === 400 || e.status === 404);
@@ -349,24 +349,24 @@ export declare const RegulatorySectionResponseSchema: z.ZodObject<{
349
349
  }, z.core.$strip>;
350
350
  type RegulatoryBase = z.infer<typeof RegulatoryBaseSchema>;
351
351
  /** The sections of one source document. The document fields appear once, not on every section. */
352
- export interface SectionGroup<S> {
352
+ export type SectionGroup<S> = {
353
353
  readonly docType: string;
354
354
  readonly sourceUrl: string | null;
355
355
  readonly sourceDate: string | null;
356
356
  readonly sections: S[];
357
- }
357
+ };
358
358
  /** One entry of a table of contents. */
359
- export interface SectionEntry {
359
+ export type SectionEntry = {
360
360
  readonly documentSectionId: string;
361
361
  readonly path: string | null;
362
362
  readonly title: string | null;
363
- }
363
+ };
364
364
  /** One matched section of a search, with the excerpt that drove the match. */
365
- export interface MatchedSectionEntry extends SectionEntry {
365
+ export type MatchedSectionEntry = SectionEntry & {
366
366
  readonly matchedText: string | null;
367
- }
367
+ };
368
368
  /** The fields of an authorization that both the search and the details answer carry. */
369
- export interface AuthorizationSummary {
369
+ export type AuthorizationSummary = {
370
370
  readonly amassId: string;
371
371
  readonly agency: string;
372
372
  readonly name: string | null;
@@ -382,22 +382,22 @@ export interface AuthorizationSummary {
382
382
  readonly designations: RegulatoryBase["designations"];
383
383
  readonly otherAuthorizations: RegulatoryBase["authorizationsByAgency"];
384
384
  readonly sourceUrl: string | null;
385
- }
385
+ };
386
386
  /** The matched sections that a search row keeps. The count still reports all of them. */
387
387
  export declare const MAX_MATCHED_SECTIONS = 5;
388
- export interface AuthorizationSearchRow extends AuthorizationSummary {
388
+ export type AuthorizationSearchRow = AuthorizationSummary & {
389
389
  readonly matchedSectionCount: number;
390
390
  readonly matchedDocuments: SectionGroup<MatchedSectionEntry>[];
391
- }
391
+ };
392
392
  export declare function mapRegulatorySearchRow(record: z.infer<typeof RegulatorySearchResponseSchema>["data"][number]): AuthorizationSearchRow;
393
- export interface AuthorizationRecord extends AuthorizationSummary {
393
+ export type AuthorizationRecord = AuthorizationSummary & {
394
394
  readonly fdaDetails: z.infer<typeof FdaDetailsSchema> | null;
395
395
  readonly emaDetails: z.infer<typeof EmaDetailsSchema> | null;
396
396
  readonly sectionCount: number;
397
397
  readonly documents: SectionGroup<SectionEntry>[];
398
- }
398
+ };
399
399
  export declare function mapRegulatoryRecord(record: z.infer<typeof RegulatoryRecordResponseSchema>["data"]): AuthorizationRecord;
400
- export interface RegulatorySection {
400
+ export type RegulatorySection = {
401
401
  readonly amassId: string;
402
402
  readonly documentSectionId: string;
403
403
  readonly docType: string;
@@ -406,8 +406,8 @@ export interface RegulatorySection {
406
406
  readonly sourceUrl: string | null;
407
407
  readonly sourceDate: string | null;
408
408
  readonly content: string | null;
409
- }
410
- export interface RegulatorySearchParams {
409
+ };
410
+ export type RegulatorySearchParams = {
411
411
  readonly query: string;
412
412
  readonly limit: number;
413
413
  readonly agency?: readonly string[];
@@ -418,19 +418,19 @@ export interface RegulatorySearchParams {
418
418
  readonly minAuthorizationDate?: string;
419
419
  readonly maxAuthorizationDate?: string;
420
420
  readonly amassId?: string;
421
- }
421
+ };
422
422
  export declare function searchRegulatoryRecords(params: RegulatorySearchParams, headers: Record<string, string>): ResultAsync<AuthorizationSearchRow[], AmassError>;
423
423
  /** One authorization with its table of contents, or `null` when Amass holds no such ID. */
424
424
  export declare function getRegulatoryRecord(amassId: string, headers: Record<string, string>): ResultAsync<AuthorizationRecord | null, AmassError>;
425
425
  /** The full text of one document section, or `null` when Amass holds no such section. */
426
426
  export declare function getRegulatorySection(amassId: string, documentSectionId: string, headers: Record<string, string>): ResultAsync<RegulatorySection | null, AmassError>;
427
427
  /** The identifiers that the RegulatoryCore lookup accepts. Exactly one is set. */
428
- export interface RegulatoryIdentifier {
428
+ export type RegulatoryIdentifier = {
429
429
  readonly fdaApplicationNumber?: string;
430
430
  readonly emaProductNumber?: string;
431
431
  readonly ndc?: string;
432
432
  readonly splSetId?: string;
433
- }
433
+ };
434
434
  export declare function regulatoryLookupItems(id: RegulatoryIdentifier): LookupItem[];
435
435
  export declare function lookupRegulatoryIds(id: RegulatoryIdentifier, headers: Record<string, string>): ResultAsync<string[], AmassError>;
436
436
  declare const PatentBaseSchema: z.ZodObject<{
@@ -523,7 +523,7 @@ export declare const PatentRecordResponseSchema: z.ZodObject<{
523
523
  }, z.core.$strip>;
524
524
  type PatentBase = z.infer<typeof PatentBaseSchema>;
525
525
  /** A patent with its citation counts. The citation lists stay out: a cited patent can carry thousands. */
526
- export interface PatentSummary {
526
+ export type PatentSummary = {
527
527
  readonly amassId: string;
528
528
  readonly publicationNumber: string | null;
529
529
  readonly applicationNumber: string | null;
@@ -546,17 +546,17 @@ export interface PatentSummary {
546
546
  readonly hasClaims: boolean | null;
547
547
  readonly hasDescription: boolean | null;
548
548
  readonly url: string | null;
549
- }
549
+ };
550
550
  export declare function mapPatentSummary(record: PatentBase): PatentSummary;
551
- export interface PatentRecord extends PatentSummary {
551
+ export type PatentRecord = PatentSummary & {
552
552
  readonly familyMembers: string[];
553
553
  readonly language: string | null;
554
554
  readonly nonEnglishFallback: boolean | null;
555
- readonly claims?: string | null;
556
- readonly description?: string | null;
557
- }
555
+ claims?: string | null;
556
+ description?: string | null;
557
+ };
558
558
  export declare function mapPatentRecord(record: PatentBase): PatentRecord;
559
- export interface PatentSearchParams {
559
+ export type PatentSearchParams = {
560
560
  readonly query: string;
561
561
  readonly limit: number;
562
562
  readonly assignee?: readonly string[];
@@ -571,16 +571,16 @@ export interface PatentSearchParams {
571
571
  readonly maxPriorityDate?: string;
572
572
  readonly minGrantDate?: string;
573
573
  readonly maxGrantDate?: string;
574
- }
574
+ };
575
575
  export declare function searchPatentRecords(params: PatentSearchParams, headers: Record<string, string>): ResultAsync<PatentSummary[], AmassError>;
576
576
  export declare function getPatentRecord(amassId: string, include: {
577
577
  readonly claims: boolean;
578
578
  readonly description: boolean;
579
579
  }, headers: Record<string, string>): ResultAsync<PatentRecord | null, AmassError>;
580
580
  /** The identifiers that the PatentCore lookup accepts. Exactly one is set. */
581
- export interface PatentIdentifier {
581
+ export type PatentIdentifier = {
582
582
  readonly publicationNumber?: string;
583
583
  readonly applicationNumber?: string;
584
- }
584
+ };
585
585
  export declare function lookupPatentIds(id: PatentIdentifier, headers: Record<string, string>): ResultAsync<string[], AmassError>;
586
586
  export {};
@@ -31,6 +31,8 @@
31
31
  import { err, ok } from "neverthrow";
32
32
  import { z } from "zod";
33
33
  import { apiFetchValidated, describeApiError } from "./api-utils.js";
34
+ import { safeParseJsonAs } from "../../lib/parse-json.js";
35
+ import { hasWhitespace, isAllDigits } from "../../lib/text.js";
34
36
  import { AMASS_BASE } from "./amass-config.js";
35
37
  /** Render an `AmassError` as a one-line message for the model or for a throw. */
36
38
  export function describeAmassError(e) {
@@ -60,14 +62,13 @@ export const AmassErrorEnvelopeSchema = z.object({
60
62
  });
61
63
  /** Read the message of an Amass error body, with the per-field reasons of a 400. */
62
64
  function envelopeOf(body) {
63
- let parsed;
65
+ let envelope;
64
66
  try {
65
- parsed = JSON.parse(body);
67
+ envelope = safeParseJsonAs(body, AmassErrorEnvelopeSchema);
66
68
  }
67
69
  catch {
68
70
  return { code: null, message: body || "no message" };
69
71
  }
70
- const envelope = AmassErrorEnvelopeSchema.safeParse(parsed);
71
72
  if (!envelope.success)
72
73
  return { code: null, message: body || "no message" };
73
74
  const { code, message, fields } = envelope.data.error;
@@ -105,7 +106,8 @@ function urlOf(path, params) {
105
106
  if (value === undefined)
106
107
  continue;
107
108
  if (Array.isArray(value)) {
108
- for (const item of value)
109
+ const items = value;
110
+ for (const item of items)
109
111
  url.searchParams.append(key, item);
110
112
  }
111
113
  else {
@@ -154,8 +156,11 @@ const FDA_APPLICATION_PREFIXES = ["NDA", "BLA", "ANDA"];
154
156
  * thus goes as all three prefixes, in one request at the price of one.
155
157
  */
156
158
  export function fdaApplicationForms(input) {
157
- const compact = input.replace(/[\s-]/g, "").toUpperCase();
158
- if (/^\d+$/.test(compact))
159
+ const compact = Array.from(input)
160
+ .filter((char) => char !== "-" && !hasWhitespace(char))
161
+ .join("")
162
+ .toUpperCase();
163
+ if (compact !== "" && isAllDigits(compact))
159
164
  return FDA_APPLICATION_PREFIXES.map((prefix) => `${prefix}${compact}`);
160
165
  return [compact];
161
166
  }
@@ -166,7 +171,9 @@ export function fdaApplicationForms(input) {
166
171
  export function productNdcOf(input) {
167
172
  const trimmed = input.trim();
168
173
  const segments = trimmed.split("-");
169
- return segments.length === 3 && segments.every((segment) => /^\d+$/.test(segment)) ? `${segments[0]}-${segments[1]}` : trimmed;
174
+ return segments.length === 3 && segments.every((segment) => segment.length > 0 && isAllDigits(segment))
175
+ ? `${String(segments[0])}-${String(segments[1])}`
176
+ : trimmed;
170
177
  }
171
178
  // ---------------------------------------------------------------------------
172
179
  // RegulatoryCore
@@ -455,14 +462,17 @@ export function mapPatentSummary(record) {
455
462
  };
456
463
  }
457
464
  export function mapPatentRecord(record) {
458
- return {
465
+ const patent = {
459
466
  ...mapPatentSummary(record),
460
467
  familyMembers: record.familyMembers,
461
468
  language: record.language,
462
469
  nonEnglishFallback: record.nonEnglishFallback,
463
- ...(record.claims === undefined ? {} : { claims: record.claims }),
464
- ...(record.description === undefined ? {} : { description: record.description }),
465
470
  };
471
+ if (record.claims !== undefined)
472
+ patent.claims = record.claims;
473
+ if (record.description !== undefined)
474
+ patent.description = record.description;
475
+ return patent;
466
476
  }
467
477
  /** PatentCore reads a list filter as one comma-separated value, not as a repeated parameter. */
468
478
  function commaList(values) {
@@ -10,7 +10,7 @@
10
10
  */
11
11
  import { ResultAsync } from "neverthrow";
12
12
  import { z } from "zod";
13
- export interface ApiFetchOptions {
13
+ export type ApiFetchOptions = {
14
14
  method?: "GET" | "POST";
15
15
  headers?: Record<string, string>;
16
16
  body?: string;
@@ -31,7 +31,7 @@ export interface ApiFetchOptions {
31
31
  sleep?: (ms: number) => Promise<void>;
32
32
  timeoutMs?: number;
33
33
  parseAs?: "json" | "text";
34
- }
34
+ };
35
35
  /** The error channel of `apiFetch`. A `DomainError` (string `type` discriminant). */
36
36
  export type ApiError = {
37
37
  readonly type: "http_status";
@@ -64,8 +64,18 @@ export declare const HARNESS_USER_AGENT = "inflexa-harness (+https://inflexa.ai)
64
64
  * and every wait stays at or below `maxRetryDelayMs`.
65
65
  *
66
66
  * Each request sends `HARNESS_USER_AGENT`, unless `headers` sets a User-Agent.
67
+ *
68
+ * The success value is `unknown`: the caller either walks it with guards, or
69
+ * validates it with `apiFetchValidated`, or reads text with `apiFetchText`.
70
+ */
71
+ export declare function apiFetch(url: string, options?: ApiFetchOptions): ResultAsync<unknown, ApiError>;
72
+ /**
73
+ * `apiFetch` for a `parseAs: "text"` response. The body reader is what makes the
74
+ * value a string, so the wrapper states that shape instead of casting the
75
+ * `unknown` read; the check never refuses a body, because `res.text()` always
76
+ * resolves to one.
67
77
  */
68
- export declare function apiFetch<T = unknown>(url: string, options?: ApiFetchOptions): ResultAsync<T, ApiError>;
78
+ export declare function apiFetchText(url: string, options?: ApiFetchOptions): ResultAsync<string, ApiError>;
69
79
  /**
70
80
  * `apiFetch` that validates the JSON response against a Zod `schema` before
71
81
  * returning it. The success value is the schema's parsed output, so callers
@@ -8,6 +8,8 @@
8
8
  * `ResultAsync<T, ApiError>` rather than throwing — callers branch on
9
9
  * `isErr()` and read `value` / `error` (see `result.ts` for the house rules).
10
10
  */
11
+ import { errorMessageOf } from "../../lib/thrown.js";
12
+ import { textOf } from "../../lib/unknown-text.js";
11
13
  import { ResultAsync, err, ok } from "neverthrow";
12
14
  import { z } from "zod";
13
15
  import { sleep } from "../../lib/async-utils.js";
@@ -33,10 +35,22 @@ export const HARNESS_USER_AGENT = "inflexa-harness (+https://inflexa.ai)";
33
35
  * and every wait stays at or below `maxRetryDelayMs`.
34
36
  *
35
37
  * Each request sends `HARNESS_USER_AGENT`, unless `headers` sets a User-Agent.
38
+ *
39
+ * The success value is `unknown`: the caller either walks it with guards, or
40
+ * validates it with `apiFetchValidated`, or reads text with `apiFetchText`.
36
41
  */
37
42
  export function apiFetch(url, options = {}) {
38
43
  return new ResultAsync(runFetch(url, options));
39
44
  }
45
+ /**
46
+ * `apiFetch` for a `parseAs: "text"` response. The body reader is what makes the
47
+ * value a string, so the wrapper states that shape instead of casting the
48
+ * `unknown` read; the check never refuses a body, because `res.text()` always
49
+ * resolves to one.
50
+ */
51
+ export function apiFetchText(url, options = {}) {
52
+ return apiFetch(url, { ...options, parseAs: "text" }).andThen((data) => typeof data === "string" ? ok(data) : err({ type: "invalid_response", issues: "expected a text body" }));
53
+ }
40
54
  /**
41
55
  * `apiFetch` that validates the JSON response against a Zod `schema` before
42
56
  * returning it. The success value is the schema's parsed output, so callers
@@ -125,14 +139,14 @@ async function runFetch(url, options) {
125
139
  const text = await res.text().catch(() => "");
126
140
  return err({ type: "http_status", status: res.status, body: text.trim() });
127
141
  }
128
- const data = parseAs === "text" ? (await res.text()) : (await res.json());
129
- return ok(data);
142
+ const readBody = parseAs === "text" ? (res) => res.text() : (res) => res.json();
143
+ return ok(await readBody(res));
130
144
  }
131
145
  catch (e) {
132
146
  if (e instanceof DOMException && e.name === "TimeoutError") {
133
147
  return err({ type: "timeout", timeoutMs });
134
148
  }
135
- lastError = e instanceof Error ? e.message : String(e);
149
+ lastError = errorMessageOf(e) ?? textOf(e);
136
150
  if (attempt < maxRetries) {
137
151
  await wait(Math.min(maxRetryDelayMs, retryDelayMs * 2 ** attempt));
138
152
  continue;
@@ -15,26 +15,26 @@ export declare const SUPPORTED_SPECIES: readonly ["homo_sapiens", "mus_musculus"
15
15
  export type SupportedSpecies = (typeof SUPPORTED_SPECIES)[number];
16
16
  export declare const SPECIES_TAXON: Record<SupportedSpecies, number>;
17
17
  export type ExpressionRank = "absent" | "low" | "medium" | "high";
18
- export interface TissueRow {
18
+ export type TissueRow = {
19
19
  tissue: string;
20
20
  cellType: string | null;
21
21
  expressionScore: number | null;
22
22
  confidence: "gold" | "silver" | null;
23
23
  expressionState: "expressed" | "not expressed";
24
24
  rank: ExpressionRank;
25
- }
26
- export interface SpeciesEntry {
25
+ };
26
+ export type SpeciesEntry = {
27
27
  species: SupportedSpecies;
28
28
  taxonId: number;
29
29
  ensemblId: string;
30
30
  tissues: TissueRow[];
31
- }
32
- export interface MultiSpeciesExpression {
31
+ };
32
+ export type MultiSpeciesExpression = {
33
33
  geneSymbol: string;
34
34
  humanEnsemblId: string | null;
35
35
  bySpecies: SpeciesEntry[];
36
36
  notFound: string[];
37
- }
37
+ };
38
38
  export declare function bucketRank(expressionState: string, score: number | null): ExpressionRank;
39
39
  export declare const EnsemblLookupSchema: z.ZodObject<{
40
40
  id: z.ZodOptional<z.ZodString>;
@@ -11,6 +11,8 @@
11
11
  * field carries `.optional()`, not `.nullable()`.
12
12
  */
13
13
  import { z } from "zod";
14
+ import { isUnknownArray } from "../../lib/unknown-array.js";
15
+ import { parseUnknownRecord } from "../../lib/unknown-containers.js";
14
16
  import { apiFetchValidated, describeApiError, isUnexpectedApiError } from "./api-utils.js";
15
17
  const ENSEMBL_BASE = "https://rest.ensembl.org";
16
18
  const BGEE_BASE = "https://www.bgee.org/api";
@@ -60,28 +62,32 @@ export const EnsemblHomologyResponseSchema = z.object({
60
62
  data: z.array(z.object({ homologies: z.array(z.object({ id: z.string().optional(), type: z.string().optional() })).optional() })).optional(),
61
63
  });
62
64
  export function parseExpressionResponse(raw) {
63
- // `raw` is the untyped Bgee API payload; `.data.calls` is reached defensively and
64
- // the `Array.isArray` guard below means a shape mismatch degrades to an empty list.
65
- const calls = raw?.data?.calls;
66
- if (!Array.isArray(calls))
65
+ const calls = parseUnknownRecord(parseUnknownRecord(raw)?.data)?.calls;
66
+ if (!isUnknownArray(calls))
67
67
  return [];
68
68
  const out = [];
69
- for (const call of calls) {
70
- const anatName = call?.condition?.anatEntity?.name ?? "";
69
+ for (const entry of calls) {
70
+ const call = parseUnknownRecord(entry);
71
+ if (!call)
72
+ continue;
73
+ const condition = parseUnknownRecord(call.condition);
74
+ const anatEntity = parseUnknownRecord(condition?.anatEntity);
75
+ const anatName = typeof anatEntity?.name === "string" ? anatEntity.name : "";
71
76
  const tissue = anatName.trim().toLowerCase();
72
77
  if (!tissue)
73
78
  continue;
74
- const cellTypeName = call?.condition?.cellType?.name;
79
+ const cellTypeRecord = parseUnknownRecord(condition?.cellType);
80
+ const cellTypeName = cellTypeRecord?.name;
75
81
  const cellType = typeof cellTypeName === "string" && cellTypeName.trim() !== "" ? cellTypeName.trim().toLowerCase() : null;
76
- const rawScore = call?.expressionScore?.expressionScore;
82
+ const rawScore = parseUnknownRecord(call.expressionScore)?.expressionScore;
77
83
  let expressionScore = null;
78
84
  if (typeof rawScore === "string" || typeof rawScore === "number") {
79
85
  const n = typeof rawScore === "number" ? rawScore : parseFloat(rawScore);
80
86
  expressionScore = Number.isFinite(n) ? n : null;
81
87
  }
82
- const quality = call?.expressionQuality;
88
+ const quality = call.expressionQuality;
83
89
  const confidence = quality === "gold" || quality === "silver" ? quality : null;
84
- const stateRaw = call?.expressionState;
90
+ const stateRaw = call.expressionState;
85
91
  const expressionState = stateRaw === "not expressed" ? "not expressed" : "expressed";
86
92
  out.push({
87
93
  tissue,
@@ -11,19 +11,19 @@
11
11
  * not `.nullable()`.
12
12
  */
13
13
  import { z } from "zod";
14
- export interface CancerStudy {
14
+ export type CancerStudy = {
15
15
  studyId: string;
16
16
  cancerType: string;
17
17
  cancerTypeName: string;
18
- }
19
- export interface MutationFrequency {
18
+ };
19
+ export type MutationFrequency = {
20
20
  cancerTypeId: string;
21
21
  cancerTypeName: string;
22
22
  totalSamples: number;
23
23
  mutatedSamples: number;
24
24
  frequency: number;
25
25
  studies: string[];
26
- }
26
+ };
27
27
  export declare const RawMutationRowSchema: z.ZodObject<{
28
28
  studyId: z.ZodString;
29
29
  sampleId: z.ZodString;
@@ -12,6 +12,7 @@
12
12
  */
13
13
  import { z } from "zod";
14
14
  import { apiFetchValidated, describeApiError } from "./api-utils.js";
15
+ import { presentGet } from "../../lib/present.js";
15
16
  const CBIOPORTAL_BASE = "https://www.cbioportal.org/api";
16
17
  const HEADERS = { Accept: "application/json" };
17
18
  // Raw cBioPortal wire shapes, validated at the fetch boundary. Fields the code
@@ -52,7 +53,7 @@ async function listStudies() {
52
53
  const res = await apiFetchValidated(url, z.array(RawCancerStudySchema), { headers: HEADERS });
53
54
  if (res.isErr())
54
55
  throw new Error(describeApiError(res.error));
55
- return res.value ?? [];
56
+ return res.value;
56
57
  }
57
58
  /**
58
59
  * The cancer-type vocabulary, keyed by its id. The study SUMMARY projection
@@ -65,7 +66,7 @@ async function cancerTypeNames() {
65
66
  const names = new Map();
66
67
  if (res.isErr())
67
68
  return names;
68
- for (const row of res.value ?? []) {
69
+ for (const row of res.value) {
69
70
  if (row.cancerTypeId && row.name)
70
71
  names.set(row.cancerTypeId, row.name);
71
72
  }
@@ -76,14 +77,14 @@ async function listAllSampleLists() {
76
77
  const res = await apiFetchValidated(url, z.array(RawSampleListSchema), { headers: HEADERS });
77
78
  if (res.isErr())
78
79
  throw new Error(describeApiError(res.error));
79
- return res.value ?? [];
80
+ return res.value;
80
81
  }
81
82
  async function listMutationProfiles() {
82
83
  const url = `${CBIOPORTAL_BASE}/molecular-profiles?projection=SUMMARY&pageSize=10000`;
83
84
  const res = await apiFetchValidated(url, z.array(RawMolecularProfileSchema), { headers: HEADERS });
84
85
  if (res.isErr())
85
86
  throw new Error(describeApiError(res.error));
86
- return (res.value ?? []).filter((p) => p.molecularAlterationType === "MUTATION_EXTENDED");
87
+ return res.value.filter((p) => p.molecularAlterationType === "MUTATION_EXTENDED");
87
88
  }
88
89
  async function fetchMutationRowsForGene(entrezGeneId, profileIds) {
89
90
  if (profileIds.length === 0)
@@ -99,7 +100,7 @@ async function fetchMutationRowsForGene(entrezGeneId, profileIds) {
99
100
  });
100
101
  if (res.isErr())
101
102
  throw new Error(describeApiError(res.error));
102
- return res.value ?? [];
103
+ return res.value;
103
104
  }
104
105
  /**
105
106
  * Resolve a gene symbol to its NCBI Entrez Gene ID via cBioPortal's gene
@@ -111,7 +112,7 @@ async function resolveEntrezId(symbol) {
111
112
  const res = await apiFetchValidated(url, z.object({ entrezGeneId: z.number().optional() }), { headers: HEADERS });
112
113
  if (res.isErr())
113
114
  return null;
114
- return res.value?.entrezGeneId ?? null;
115
+ return res.value.entrezGeneId ?? null;
115
116
  }
116
117
  /**
117
118
  * Compute somatic mutation frequencies for a target across all curated
@@ -145,7 +146,7 @@ export async function getSomaticMutationFrequencies(geneSymbol, options = {}) {
145
146
  for (const m of mutations) {
146
147
  if (!mutatedStudySamples.has(m.studyId))
147
148
  mutatedStudySamples.set(m.studyId, new Set());
148
- mutatedStudySamples.get(m.studyId).add(m.sampleId);
149
+ presentGet(mutatedStudySamples, m.studyId, "the sample set of the study").add(m.sampleId);
149
150
  }
150
151
  const byCancerType = new Map();
151
152
  for (const studyId of studiesWithMutations) {
@@ -163,7 +164,7 @@ export async function getSomaticMutationFrequencies(geneSymbol, options = {}) {
163
164
  studies: new Set(),
164
165
  });
165
166
  }
166
- const bucket = byCancerType.get(cancerTypeId);
167
+ const bucket = presentGet(byCancerType, cancerTypeId, "the aggregate bucket");
167
168
  bucket.total += sampleCount;
168
169
  bucket.mutated += mutatedStudySamples.get(studyId)?.size ?? 0;
169
170
  bucket.studies.add(studyId);