@inflexa-ai/harness 0.45.1 → 0.46.2

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 (790) 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 +306 -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 +32 -7
  174. package/dist/lib/hooks.js +22 -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 +160 -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 +39 -0
  256. package/dist/loop/turn-credentials.js +90 -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/request-headers.js +12 -3
  304. package/dist/providers/types.d.ts +55 -94
  305. package/dist/reference-data/catalog.d.ts +2 -15
  306. package/dist/reference-data/catalog.js +25 -8
  307. package/dist/reference-data/receipt.d.ts +2 -2
  308. package/dist/report-model/assert-rules.js +1 -1
  309. package/dist/report-model/authoring-grammar.d.ts +211 -233
  310. package/dist/report-model/block-walk.d.ts +10 -10
  311. package/dist/report-model/block-walk.js +2 -0
  312. package/dist/report-model/draft-finish.d.ts +8 -8
  313. package/dist/report-model/draft-finish.js +1 -1
  314. package/dist/report-model/draft-hash.js +8 -7
  315. package/dist/report-model/draft-operations.d.ts +22 -10
  316. package/dist/report-model/draft-operations.js +48 -30
  317. package/dist/report-model/draft-read.d.ts +19 -7
  318. package/dist/report-model/draft-read.js +16 -6
  319. package/dist/report-model/draft.d.ts +844 -2
  320. package/dist/report-model/draft.js +3 -1
  321. package/dist/report-model/fixture-resolver.js +39 -16
  322. package/dist/report-model/pin-snapshot.d.ts +2 -2
  323. package/dist/report-model/pin-snapshot.js +15 -15
  324. package/dist/report-model/production-resolver.d.ts +18 -18
  325. package/dist/report-model/production-resolver.js +50 -42
  326. package/dist/report-model/reference-resolver.d.ts +26 -10
  327. package/dist/report-model/reference-resolver.js +68 -5
  328. package/dist/report-model/reference-stamp.js +30 -38
  329. package/dist/report-model/structural-validation.js +12 -4
  330. package/dist/report-model/validate.d.ts +7 -7
  331. package/dist/report-model/validate.js +6 -6
  332. package/dist/report-render/assets.d.ts +2 -2
  333. package/dist/report-render/assets.js +27 -3
  334. package/dist/report-render/chart-export.d.ts +10 -2
  335. package/dist/report-render/chart-export.js +37 -11
  336. package/dist/report-render/chart-presets.d.ts +8 -8
  337. package/dist/report-render/chart-presets.js +3 -3
  338. package/dist/report-render/chart-renderers.d.ts +23 -16
  339. package/dist/report-render/chart-renderers.js +74 -53
  340. package/dist/report-render/chart-toolbox.d.ts +2 -2
  341. package/dist/report-render/chart-toolbox.js +7 -6
  342. package/dist/report-render/chart.d.ts +15 -16
  343. package/dist/report-render/chart.js +369 -252
  344. package/dist/report-render/design.d.ts +36 -297
  345. package/dist/report-render/design.js +0 -12
  346. package/dist/report-render/figures/common.d.ts +12 -12
  347. package/dist/report-render/figures/common.js +42 -31
  348. package/dist/report-render/figures/dendrogram.d.ts +3 -3
  349. package/dist/report-render/figures/dendrogram.js +10 -10
  350. package/dist/report-render/figures/dense.js +15 -8
  351. package/dist/report-render/figures/dotplot.js +46 -33
  352. package/dist/report-render/figures/embedding.js +52 -43
  353. package/dist/report-render/figures/equal-units.d.ts +10 -10
  354. package/dist/report-render/figures/equal-units.js +27 -27
  355. package/dist/report-render/figures/forest.js +9 -7
  356. package/dist/report-render/figures/gsea.js +21 -11
  357. package/dist/report-render/figures/heatmap.js +13 -9
  358. package/dist/report-render/figures/index.d.ts +10 -10
  359. package/dist/report-render/figures/index.js +4 -2
  360. package/dist/report-render/figures/km.js +10 -9
  361. package/dist/report-render/figures/label-room.d.ts +12 -12
  362. package/dist/report-render/figures/label-room.js +7 -2
  363. package/dist/report-render/figures/locuszoom.d.ts +2 -2
  364. package/dist/report-render/figures/locuszoom.js +59 -31
  365. package/dist/report-render/figures/lollipop.js +3 -2
  366. package/dist/report-render/figures/ma.js +8 -4
  367. package/dist/report-render/figures/manhattan.d.ts +1 -2
  368. package/dist/report-render/figures/manhattan.js +52 -34
  369. package/dist/report-render/figures/oncoprint.js +4 -5
  370. package/dist/report-render/figures/pca.js +25 -11
  371. package/dist/report-render/figures/qq.js +20 -9
  372. package/dist/report-render/figures/roc.js +1 -1
  373. package/dist/report-render/figures/sankey.d.ts +2 -2
  374. package/dist/report-render/figures/sankey.js +11 -10
  375. package/dist/report-render/figures/upset.d.ts +6 -6
  376. package/dist/report-render/figures/upset.js +7 -4
  377. package/dist/report-render/figures/volcano.js +12 -10
  378. package/dist/report-render/hybrid-svg.d.ts +4 -4
  379. package/dist/report-render/hybrid-svg.js +7 -5
  380. package/dist/report-render/number-format.d.ts +4 -4
  381. package/dist/report-render/number-format.js +62 -27
  382. package/dist/report-render/page.js +2 -1
  383. package/dist/report-render/provenance-data.d.ts +2 -2
  384. package/dist/report-render/references.d.ts +4 -4
  385. package/dist/report-render/render.d.ts +2 -2
  386. package/dist/report-render/render.js +10 -11
  387. package/dist/report-render/script-json.js +1 -1
  388. package/dist/report-render/table-data.d.ts +6 -6
  389. package/dist/report-render/test/options.d.ts +49 -0
  390. package/dist/report-render/test/options.js +143 -0
  391. package/dist/report-render/test/page-function.d.ts +19 -0
  392. package/dist/report-render/test/page-function.js +33 -0
  393. package/dist/report-render/types.d.ts +10 -10
  394. package/dist/report-render/value-bridge.d.ts +4 -4
  395. package/dist/report-render/value-bridge.js +27 -14
  396. package/dist/report-render/views/chart-view.d.ts +2 -2
  397. package/dist/report-render/views/chart-view.js +2 -2
  398. package/dist/report-render/views/lineage.d.ts +6 -6
  399. package/dist/report-render/views/lineage.js +2 -0
  400. package/dist/report-render/views/page-view.d.ts +2 -2
  401. package/dist/report-render/views/page-view.js +1 -0
  402. package/dist/report-render/views/prose.js +25 -8
  403. package/dist/report-render/views/references-view.js +12 -1
  404. package/dist/report-render/views/values.js +1 -1
  405. package/dist/runtime/assemble.d.ts +53 -26
  406. package/dist/runtime/assemble.js +103 -56
  407. package/dist/runtime/boot.d.ts +8 -7
  408. package/dist/runtime/boot.js +1 -1
  409. package/dist/runtime/connection-budget.d.ts +6 -6
  410. package/dist/runtime/connection-budget.js +1 -1
  411. package/dist/runtime/dbos.d.ts +29 -19
  412. package/dist/runtime/dbos.js +35 -20
  413. package/dist/runtime/result-serialization.js +18 -5
  414. package/dist/runtime/shutdown.d.ts +2 -2
  415. package/dist/sandbox/client.d.ts +7 -3
  416. package/dist/sandbox/cpu-files.d.ts +2 -2
  417. package/dist/sandbox/cpu-files.js +21 -4
  418. package/dist/sandbox/create-sandbox.d.ts +7 -8
  419. package/dist/sandbox/create-sandbox.js +6 -12
  420. package/dist/sandbox/docker-client.d.ts +48 -3
  421. package/dist/sandbox/docker-client.js +10 -6
  422. package/dist/sandbox/estimate-data-profile-resources.js +2 -7
  423. package/dist/sandbox/exec-outcome.d.ts +2 -2
  424. package/dist/sandbox/exec-outcome.js +1 -1
  425. package/dist/sandbox/exec.d.ts +10 -6
  426. package/dist/sandbox/exec.js +27 -12
  427. package/dist/sandbox/execution-id.js +14 -6
  428. package/dist/sandbox/farm.d.ts +2 -2
  429. package/dist/sandbox/farm.js +22 -27
  430. package/dist/sandbox/identity.d.ts +7 -0
  431. package/dist/sandbox/identity.js +14 -3
  432. package/dist/sandbox/image-packages.js +15 -27
  433. package/dist/sandbox/k8s-client.d.ts +35 -8
  434. package/dist/sandbox/k8s-client.js +6 -5
  435. package/dist/sandbox/labels.js +1 -0
  436. package/dist/sandbox/liveness.js +3 -1
  437. package/dist/sandbox/mount-plan.d.ts +10 -10
  438. package/dist/sandbox/mount-plan.js +13 -14
  439. package/dist/sandbox/notification-sweep.d.ts +4 -4
  440. package/dist/sandbox/notification-sweep.js +4 -7
  441. package/dist/sandbox/package-identity.d.ts +6 -13
  442. package/dist/sandbox/package-identity.js +46 -28
  443. package/dist/sandbox/reaper.d.ts +10 -10
  444. package/dist/sandbox/reaper.js +4 -6
  445. package/dist/sandbox/sandbox-error.d.ts +2 -9
  446. package/dist/sandbox/sandbox-error.js +21 -8
  447. package/dist/sandbox/sandbox-step-translate.d.ts +8 -5
  448. package/dist/sandbox/sandbox-step-translate.js +22 -8
  449. package/dist/sandbox/step-sandbox.d.ts +47 -0
  450. package/dist/sandbox/step-sandbox.js +53 -0
  451. package/dist/sandbox/types.d.ts +18 -19
  452. package/dist/sandbox/types.js +1 -1
  453. package/dist/schemas/artifact-manifest.d.ts +4 -4
  454. package/dist/schemas/data-profile-schemas.d.ts +343 -298
  455. package/dist/schemas/file-metadata.js +2 -4
  456. package/dist/schemas/plan-schemas.d.ts +31 -31
  457. package/dist/schemas/run-synthesis.d.ts +95 -26
  458. package/dist/schemas/run-synthesis.js +3 -1
  459. package/dist/schemas/validate-plan.d.ts +4 -4
  460. package/dist/schemas/validate-plan.js +17 -5
  461. package/dist/schemas/workflow-state.d.ts +19 -19
  462. package/dist/schemas/workflow-state.js +2 -2
  463. package/dist/state/active-turns.d.ts +36 -0
  464. package/dist/state/active-turns.js +67 -0
  465. package/dist/state/analyses-metrics.d.ts +8 -8
  466. package/dist/state/analyses-metrics.js +4 -4
  467. package/dist/state/analyses.d.ts +0 -14
  468. package/dist/state/analyses.js +0 -32
  469. package/dist/state/artifacts.d.ts +32 -19
  470. package/dist/state/artifacts.js +28 -5
  471. package/dist/state/data-profile.d.ts +2 -2
  472. package/dist/state/db.d.ts +12 -2
  473. package/dist/state/db.js +5 -0
  474. package/dist/state/edit-intents.d.ts +4 -0
  475. package/dist/state/edit-intents.js +71 -0
  476. package/dist/state/index.d.ts +4 -4
  477. package/dist/state/index.js +2 -2
  478. package/dist/state/init.d.ts +2 -1
  479. package/dist/state/init.js +5 -2
  480. package/dist/state/migrations/20260927120000_baseline.js +3 -1
  481. package/dist/state/migrations/20261026120000_add_the_edit_intents.d.ts +7 -0
  482. package/dist/state/migrations/20261026120000_add_the_edit_intents.js +21 -0
  483. package/dist/state/migrations/20261027120000_record_the_applied_memory_edits.d.ts +7 -0
  484. package/dist/state/migrations/20261027120000_record_the_applied_memory_edits.js +16 -0
  485. package/dist/state/migrations/20261027120100_store_the_authoring_results.d.ts +8 -0
  486. package/dist/state/migrations/20261027120100_store_the_authoring_results.js +20 -0
  487. package/dist/state/migrations/20261027120200_key_the_groups_of_a_turn.d.ts +7 -0
  488. package/dist/state/migrations/20261027120200_key_the_groups_of_a_turn.js +12 -0
  489. package/dist/state/migrations/20261027120300_mark_the_active_turn_of_a_thread.d.ts +7 -0
  490. package/dist/state/migrations/20261027120300_mark_the_active_turn_of_a_thread.js +11 -0
  491. package/dist/state/migrations/20261028120000_record_the_paused_work.d.ts +7 -0
  492. package/dist/state/migrations/20261028120000_record_the_paused_work.js +25 -0
  493. package/dist/state/migrations/20261028120100_end_the_suspended_runs.d.ts +8 -0
  494. package/dist/state/migrations/20261028120100_end_the_suspended_runs.js +13 -0
  495. package/dist/state/migrations/20261029120000_reference_the_run_mandate.d.ts +7 -0
  496. package/dist/state/migrations/20261029120000_reference_the_run_mandate.js +23 -0
  497. package/dist/state/migrations/20261029120100_record_the_run_session_of_a_pause.d.ts +7 -0
  498. package/dist/state/migrations/20261029120100_record_the_run_session_of_a_pause.js +11 -0
  499. package/dist/state/migrations/index.js +18 -0
  500. package/dist/state/paused-work.d.ts +52 -0
  501. package/dist/state/paused-work.js +105 -0
  502. package/dist/state/plans.d.ts +27 -8
  503. package/dist/state/plans.js +14 -11
  504. package/dist/state/purge-analysis.d.ts +6 -6
  505. package/dist/state/purge-analysis.js +10 -2
  506. package/dist/state/report-session-state.d.ts +43 -18
  507. package/dist/state/report-session-state.js +43 -4
  508. package/dist/state/report-versions.d.ts +16 -11
  509. package/dist/state/report-versions.js +5 -3
  510. package/dist/state/runs.d.ts +30 -19
  511. package/dist/state/runs.js +43 -51
  512. package/dist/state/schema.d.ts +18 -21
  513. package/dist/state/schema.js +4 -5
  514. package/dist/state/snapshot-parse.d.ts +2 -2
  515. package/dist/state/snapshot-parse.js +14 -8
  516. package/dist/state/step-executions.d.ts +20 -8
  517. package/dist/state/step-executions.js +6 -4
  518. package/dist/state/tool-outputs.d.ts +2 -2
  519. package/dist/state/tool-outputs.js +2 -1
  520. package/dist/state/vector-store.d.ts +16 -16
  521. package/dist/state/vector-store.js +11 -7
  522. package/dist/tasks/data-profile-absorb.d.ts +3 -3
  523. package/dist/tasks/data-profile-absorb.js +21 -16
  524. package/dist/tasks/data-profile-activity.d.ts +5 -5
  525. package/dist/tasks/data-profile-activity.js +5 -5
  526. package/dist/tasks/data-profile-index.d.ts +4 -4
  527. package/dist/tasks/data-profile-index.js +32 -17
  528. package/dist/tasks/data-profile-resolve.d.ts +8 -8
  529. package/dist/tasks/data-profile-resolve.js +88 -62
  530. package/dist/tasks/data-profile.d.ts +40 -31
  531. package/dist/tasks/data-profile.js +138 -95
  532. package/dist/tasks/extract-values.d.ts +26 -79
  533. package/dist/tasks/extract-values.js +48 -108
  534. package/dist/tasks/refresh-regulatory-corpus.d.ts +4 -20
  535. package/dist/tasks/refresh-regulatory-corpus.js +12 -8
  536. package/dist/tasks/regulatory-corpus-boot-refresh.d.ts +2 -2
  537. package/dist/tasks/regulatory-corpus-boot-refresh.js +12 -10
  538. package/dist/testing.d.ts +62 -0
  539. package/dist/testing.js +101 -0
  540. package/dist/tools/ad-hoc-router.d.ts +9 -9
  541. package/dist/tools/ad-hoc-router.js +65 -52
  542. package/dist/tools/analysis-invocation.d.ts +7 -0
  543. package/dist/tools/analysis-invocation.js +29 -5
  544. package/dist/tools/approval/contract.d.ts +8 -52
  545. package/dist/tools/approval/contract.js +7 -36
  546. package/dist/tools/approval/gateway.d.ts +27 -28
  547. package/dist/tools/approval/gateway.js +33 -130
  548. package/dist/tools/approval/queries.d.ts +6 -11
  549. package/dist/tools/approval/queries.js +43 -29
  550. package/dist/tools/approval/uuidv7.js +2 -2
  551. package/dist/tools/bio/chembl.d.ts +3 -3
  552. package/dist/tools/bio/chembl.js +10 -0
  553. package/dist/tools/bio/comptox.d.ts +25 -8
  554. package/dist/tools/bio/comptox.js +4 -2
  555. package/dist/tools/bio/drug-gene-interactions.d.ts +27 -17
  556. package/dist/tools/bio/drug-gene-interactions.js +11 -8
  557. package/dist/tools/bio/gene-disease-evidence.d.ts +61 -15
  558. package/dist/tools/bio/gene-disease-evidence.js +10 -6
  559. package/dist/tools/bio/gene-preclinical-profile.d.ts +11 -11
  560. package/dist/tools/bio/keys.d.ts +2 -2
  561. package/dist/tools/bio/keys.js +3 -3
  562. package/dist/tools/bio/lookup-annotation.d.ts +5 -5
  563. package/dist/tools/bio/lookup-annotation.js +3 -0
  564. package/dist/tools/bio/opentargets.d.ts +1 -1
  565. package/dist/tools/bio/opentargets.js +6 -0
  566. package/dist/tools/bio/pubchem.d.ts +2 -2
  567. package/dist/tools/bio/pubchem.js +6 -0
  568. package/dist/tools/bio/pubmed.d.ts +26 -16
  569. package/dist/tools/bio/pubmed.js +9 -3
  570. package/dist/tools/bio/search-clinical-trials.d.ts +4 -4
  571. package/dist/tools/bio/search-clinical-trials.js +5 -1
  572. package/dist/tools/bio/search-faers.d.ts +2 -2
  573. package/dist/tools/bio/search-faers.js +1 -1
  574. package/dist/tools/bio/search-gene.d.ts +2 -2
  575. package/dist/tools/bio/search-gene.js +1 -0
  576. package/dist/tools/bio/search-geo-datasets.d.ts +4 -4
  577. package/dist/tools/bio/search-geo-datasets.js +5 -5
  578. package/dist/tools/bio/search-interactions.d.ts +1 -1
  579. package/dist/tools/bio/search-patents.d.ts +28 -22
  580. package/dist/tools/bio/search-patents.js +20 -17
  581. package/dist/tools/bio/search-protein.d.ts +2 -2
  582. package/dist/tools/bio/search-protein.js +1 -1
  583. package/dist/tools/bio/search-regulatory-approvals.d.ts +64 -18
  584. package/dist/tools/bio/search-regulatory-approvals.js +21 -16
  585. package/dist/tools/bio/target-safety.d.ts +8 -8
  586. package/dist/tools/bio/target-safety.js +11 -6
  587. package/dist/tools/capability-data.d.ts +9 -5
  588. package/dist/tools/capability-data.js +2 -1
  589. package/dist/tools/define-tool.d.ts +55 -46
  590. package/dist/tools/define-tool.js +39 -27
  591. package/dist/tools/display/normalize-echart-spec.d.ts +2 -2
  592. package/dist/tools/display/normalize-echart-spec.js +51 -27
  593. package/dist/tools/display/show-user.d.ts +2 -2
  594. package/dist/tools/display/show-user.js +1 -1
  595. package/dist/tools/execute-analysis.d.ts +19 -10
  596. package/dist/tools/execute-analysis.js +83 -62
  597. package/dist/tools/knowledge/check.d.ts +166 -44
  598. package/dist/tools/knowledge/check.js +5 -3
  599. package/dist/tools/knowledge/client.d.ts +31 -62
  600. package/dist/tools/knowledge/client.js +44 -27
  601. package/dist/tools/knowledge/environment.d.ts +6 -6
  602. package/dist/tools/knowledge/environment.js +18 -7
  603. package/dist/tools/knowledge/index.d.ts +2 -2
  604. package/dist/tools/knowledge/index.js +9 -9
  605. package/dist/tools/knowledge/local-slots.d.ts +4 -4
  606. package/dist/tools/knowledge/local-slots.js +11 -4
  607. package/dist/tools/knowledge/pin.d.ts +2 -2
  608. package/dist/tools/knowledge/recommend.d.ts +20 -45
  609. package/dist/tools/knowledge/recommend.js +27 -19
  610. package/dist/tools/knowledge/situation.d.ts +40 -40
  611. package/dist/tools/knowledge/situation.js +2 -9
  612. package/dist/tools/knowledge/skeleton.d.ts +4 -4
  613. package/dist/tools/knowledge/skeleton.js +10 -11
  614. package/dist/tools/knowledge/template.d.ts +20 -18
  615. package/dist/tools/knowledge/template.js +38 -32
  616. package/dist/tools/lib/alphafold-client.js +2 -1
  617. package/dist/tools/lib/amass-client.d.ts +28 -28
  618. package/dist/tools/lib/amass-client.js +20 -10
  619. package/dist/tools/lib/api-utils.d.ts +13 -3
  620. package/dist/tools/lib/api-utils.js +17 -3
  621. package/dist/tools/lib/bgee-client.d.ts +6 -6
  622. package/dist/tools/lib/bgee-client.js +16 -10
  623. package/dist/tools/lib/cbioportal-client.d.ts +4 -4
  624. package/dist/tools/lib/cbioportal-client.js +9 -8
  625. package/dist/tools/lib/chembl-client.d.ts +14 -14
  626. package/dist/tools/lib/chembl-client.js +11 -4
  627. package/dist/tools/lib/clinical-benchmarks-client.d.ts +4 -4
  628. package/dist/tools/lib/clinical-benchmarks-client.js +4 -7
  629. package/dist/tools/lib/clinical-trials-client.d.ts +18 -18
  630. package/dist/tools/lib/clinical-trials-client.js +10 -10
  631. package/dist/tools/lib/clinvar-client.d.ts +2 -2
  632. package/dist/tools/lib/clinvar-client.js +6 -6
  633. package/dist/tools/lib/ctx-ops.d.ts +23 -23
  634. package/dist/tools/lib/ctx-ops.js +13 -10
  635. package/dist/tools/lib/dgidb-client.d.ts +6 -6
  636. package/dist/tools/lib/dgidb-client.js +10 -12
  637. package/dist/tools/lib/disgenet-client.d.ts +4 -4
  638. package/dist/tools/lib/ema-client.d.ts +2 -2
  639. package/dist/tools/lib/ensembl-client.d.ts +4 -4
  640. package/dist/tools/lib/ensembl-client.js +5 -4
  641. package/dist/tools/lib/gwas-catalog-client.d.ts +4 -4
  642. package/dist/tools/lib/gwas-catalog-client.js +17 -17
  643. package/dist/tools/lib/html-text.d.ts +6 -0
  644. package/dist/tools/lib/html-text.js +9 -0
  645. package/dist/tools/lib/identifier-resolver.d.ts +4 -4
  646. package/dist/tools/lib/identifier-resolver.js +7 -3
  647. package/dist/tools/lib/impc-client.d.ts +8 -8
  648. package/dist/tools/lib/impc-client.js +46 -35
  649. package/dist/tools/lib/iuphar-client.d.ts +2 -2
  650. package/dist/tools/lib/iuphar-client.js +7 -16
  651. package/dist/tools/lib/monarch-client.d.ts +4 -4
  652. package/dist/tools/lib/openfda-client.d.ts +22 -22
  653. package/dist/tools/lib/openfda-client.js +23 -22
  654. package/dist/tools/lib/opentargets-client.d.ts +12 -12
  655. package/dist/tools/lib/pathway-client.d.ts +4 -4
  656. package/dist/tools/lib/pathway-client.js +15 -19
  657. package/dist/tools/lib/pharmgkb-client.d.ts +2 -2
  658. package/dist/tools/lib/pharmgkb-client.js +1 -1
  659. package/dist/tools/lib/protein-family-modality.d.ts +2 -2
  660. package/dist/tools/lib/protein-family-modality.js +0 -2
  661. package/dist/tools/lib/protein-family-normalize.js +7 -0
  662. package/dist/tools/lib/pubchem-client.d.ts +2 -2
  663. package/dist/tools/lib/pubchem-client.js +1 -0
  664. package/dist/tools/lib/pubchem-ops.d.ts +4 -4
  665. package/dist/tools/lib/pubchem-ops.js +8 -0
  666. package/dist/tools/lib/pubmed-client.d.ts +9 -9
  667. package/dist/tools/lib/pubmed-client.js +1 -1
  668. package/dist/tools/lib/string-client.d.ts +6 -6
  669. package/dist/tools/lib/uniprot-client.d.ts +8 -8
  670. package/dist/tools/lib/uniprot-client.js +5 -1
  671. package/dist/tools/memory/update-working-memory.d.ts +16 -13
  672. package/dist/tools/memory/update-working-memory.js +21 -3
  673. package/dist/tools/read-tool-output.js +8 -2
  674. package/dist/tools/registry.d.ts +2 -2
  675. package/dist/tools/report-authoring/authoring-tools.d.ts +54 -23
  676. package/dist/tools/report-authoring/authoring-tools.js +128 -62
  677. package/dist/tools/report-session/derive-table.d.ts +19 -59
  678. package/dist/tools/report-session/derive-table.js +120 -122
  679. package/dist/tools/report-session/examine-page.d.ts +6 -6
  680. package/dist/tools/report-session/examine-page.js +14 -12
  681. package/dist/tools/report-session/list-artifacts.d.ts +6 -6
  682. package/dist/tools/report-session/list-artifacts.js +5 -5
  683. package/dist/tools/report-session/page-faults.d.ts +6 -6
  684. package/dist/tools/report-session/page-faults.js +3 -1
  685. package/dist/tools/report-session/preview-report.d.ts +4 -3
  686. package/dist/tools/report-session/preview-report.js +26 -7
  687. package/dist/tools/report-session/record-version.d.ts +9 -4
  688. package/dist/tools/report-session/record-version.js +16 -9
  689. package/dist/tools/report-session/session-page-publisher.d.ts +6 -6
  690. package/dist/tools/research/generate-analogy-report.d.ts +14 -7
  691. package/dist/tools/research/generate-analogy-report.js +80 -76
  692. package/dist/tools/research/generate-plan.d.ts +16 -16
  693. package/dist/tools/research/generate-plan.js +410 -374
  694. package/dist/tools/research/guarded-address.js +3 -2
  695. package/dist/tools/research/inspect-data-profile.d.ts +27 -20
  696. package/dist/tools/research/inspect-data-profile.js +26 -25
  697. package/dist/tools/research/inspect-run.d.ts +54 -27
  698. package/dist/tools/research/inspect-run.js +50 -40
  699. package/dist/tools/research/literature-reviewer.d.ts +8 -7
  700. package/dist/tools/research/literature-reviewer.js +29 -28
  701. package/dist/tools/research/search-arxiv.d.ts +1 -1
  702. package/dist/tools/research/search-arxiv.js +1 -1
  703. package/dist/tools/research/search-github-repos.d.ts +10 -7
  704. package/dist/tools/research/search-github-repos.js +25 -22
  705. package/dist/tools/research/search-semantic-scholar.js +1 -1
  706. package/dist/tools/research/searxng-engine.d.ts +2 -2
  707. package/dist/tools/research/searxng-engine.js +6 -4
  708. package/dist/tools/research/web-fetch.d.ts +24 -21
  709. package/dist/tools/research/web-fetch.js +65 -74
  710. package/dist/tools/research/web-search.d.ts +26 -17
  711. package/dist/tools/research/web-search.js +26 -21
  712. package/dist/tools/sandbox/link-packages.d.ts +11 -7
  713. package/dist/tools/sandbox/link-packages.js +11 -8
  714. package/dist/tools/sandbox/list-available-packages.d.ts +17 -8
  715. package/dist/tools/sandbox/list-available-packages.js +31 -25
  716. package/dist/tools/sandbox/list-available-refs.d.ts +17 -14
  717. package/dist/tools/sandbox/list-available-refs.js +61 -36
  718. package/dist/tools/sandbox/report-blocker.d.ts +30 -37
  719. package/dist/tools/sandbox/report-blocker.js +23 -73
  720. package/dist/tools/sandbox/skills.d.ts +16 -12
  721. package/dist/tools/sandbox/skills.js +16 -12
  722. package/dist/tools/sandbox/submit-file-metadata.d.ts +12 -9
  723. package/dist/tools/sandbox/submit-file-metadata.js +18 -21
  724. package/dist/tools/start-report-session.d.ts +13 -5
  725. package/dist/tools/start-report-session.js +35 -8
  726. package/dist/tools/terminal-text.d.ts +5 -2
  727. package/dist/tools/terminal-text.js +35 -3
  728. package/dist/tools/workspace/decision-record.d.ts +4 -4
  729. package/dist/tools/workspace/decision-record.js +23 -13
  730. package/dist/tools/workspace/edit-file.d.ts +59 -20
  731. package/dist/tools/workspace/edit-file.js +81 -16
  732. package/dist/tools/workspace/execute-command.d.ts +15 -13
  733. package/dist/tools/workspace/execute-command.js +11 -9
  734. package/dist/tools/workspace/file-stat.d.ts +6 -3
  735. package/dist/tools/workspace/grep.d.ts +10 -7
  736. package/dist/tools/workspace/grep.js +9 -3
  737. package/dist/tools/workspace/list-files.d.ts +6 -3
  738. package/dist/tools/workspace/mutator.d.ts +28 -15
  739. package/dist/tools/workspace/mutator.js +107 -53
  740. package/dist/tools/workspace/read-file.d.ts +8 -5
  741. package/dist/tools/workspace/result-bounds.d.ts +5 -5
  742. package/dist/tools/workspace/result-bounds.js +4 -2
  743. package/dist/tools/workspace/run-exec.d.ts +2 -2
  744. package/dist/tools/workspace/run-exec.js +3 -3
  745. package/dist/tools/workspace/scan-inputs.d.ts +8 -5
  746. package/dist/tools/workspace/scan-inputs.js +17 -5
  747. package/dist/tools/workspace/show-file.d.ts +1 -1
  748. package/dist/tools/workspace/show-file.js +2 -1
  749. package/dist/tools/workspace/show-plan.d.ts +8 -5
  750. package/dist/tools/workspace/show-plan.js +9 -8
  751. package/dist/tools/workspace/workspace-search.d.ts +41 -13
  752. package/dist/tools/workspace/workspace-search.js +27 -14
  753. package/dist/tools/workspace/write-file.d.ts +9 -7
  754. package/dist/workflows/execute-analysis-scheduler.d.ts +9 -9
  755. package/dist/workflows/execute-analysis-scheduler.js +6 -3
  756. package/dist/workflows/execute-analysis.d.ts +46 -62
  757. package/dist/workflows/execute-analysis.js +137 -219
  758. package/dist/workflows/pause.d.ts +71 -0
  759. package/dist/workflows/pause.js +173 -0
  760. package/dist/workflows/sandbox-step.d.ts +38 -61
  761. package/dist/workflows/sandbox-step.js +99 -106
  762. package/dist/workflows/test/sql-writes.d.ts +21 -0
  763. package/dist/workflows/test/sql-writes.js +36 -0
  764. package/dist/workspace/filesystem.d.ts +6 -6
  765. package/dist/workspace/filesystem.js +10 -8
  766. package/dist/workspace/paths.d.ts +1 -1
  767. package/dist/workspace/paths.js +15 -4
  768. package/dist/workspace/search-config.d.ts +2 -2
  769. package/dist/workspace/search-config.js +1 -1
  770. package/package.json +21 -22
  771. package/dist/loop/call-guard.d.ts +0 -50
  772. package/dist/loop/call-guard.js +0 -90
  773. package/dist/loop/continue-agent.d.ts +0 -40
  774. package/dist/loop/continue-agent.js +0 -38
  775. package/dist/loop/genai-spans.d.ts +0 -47
  776. package/dist/loop/genai-spans.js +0 -134
  777. package/dist/loop/run-agent.d.ts +0 -245
  778. package/dist/loop/run-agent.js +0 -1124
  779. package/dist/loop/run-step.d.ts +0 -29
  780. package/dist/loop/run-step.js +0 -34
  781. package/dist/loop/run-to-terminal.d.ts +0 -66
  782. package/dist/loop/run-to-terminal.js +0 -93
  783. package/dist/loop/tool-mask.d.ts +0 -23
  784. package/dist/loop/tool-mask.js +0 -46
  785. package/dist/providers/streaming-chat.d.ts +0 -32
  786. package/dist/providers/streaming-chat.js +0 -91
  787. package/dist/tasks/derive-table-exec.d.ts +0 -54
  788. package/dist/tasks/derive-table-exec.js +0 -86
  789. package/dist/workflows/suspension.d.ts +0 -32
  790. package/dist/workflows/suspension.js +0 -38
@@ -84,7 +84,7 @@ function mapInteraction(raw, perspective, inputSide, includeAttributes) {
84
84
  const pmids = (raw.publications ?? []).map((p) => (p.pmid != null ? String(p.pmid) : "")).filter(Boolean);
85
85
  const types = (raw.interactionTypes ?? []).map((t) => ({
86
86
  type: t.type ?? "",
87
- ...(t.directionality ? { directionality: t.directionality } : {}),
87
+ directionality: t.directionality ?? undefined,
88
88
  }));
89
89
  const geneName = perspective === "gene" ? (inputSide.geneName ?? "") : (raw.gene?.name ?? "");
90
90
  const drugName = perspective === "drug" ? (inputSide.drugName ?? "") : (raw.drug?.name ?? "");
@@ -92,21 +92,19 @@ function mapInteraction(raw, perspective, inputSide, includeAttributes) {
92
92
  return {
93
93
  geneName,
94
94
  drugName,
95
- ...(drugConceptId ? { drugConceptId } : {}),
95
+ drugConceptId,
96
96
  interactionTypes: types,
97
- ...(raw.interactionScore != null ? { interactionScore: raw.interactionScore } : {}),
97
+ interactionScore: raw.interactionScore ?? undefined,
98
98
  sourceCount: sources.length,
99
99
  sources,
100
100
  publicationCount: pmids.length,
101
101
  pmids: pmids.slice(0, MAX_PMIDS),
102
- ...(includeAttributes
103
- ? {
104
- attributes: (raw.interactionAttributes ?? []).slice(0, MAX_ATTRIBUTES).map((a) => ({
105
- name: a.name ?? "",
106
- value: (a.value ?? "").slice(0, MAX_ATTRIBUTE_CHARS),
107
- })),
108
- }
109
- : {}),
102
+ attributes: includeAttributes
103
+ ? (raw.interactionAttributes ?? []).slice(0, MAX_ATTRIBUTES).map((a) => ({
104
+ name: a.name ?? "",
105
+ value: (a.value ?? "").slice(0, MAX_ATTRIBUTE_CHARS),
106
+ }))
107
+ : undefined,
110
108
  };
111
109
  }
112
110
  function applyFilters(interactions, filters) {
@@ -144,7 +142,7 @@ export async function searchDgidb(inputs, searchType, filters = {}, onPartialErr
144
142
  if (res.isErr())
145
143
  throw new Error(describeApiError(res.error));
146
144
  const body = res.value;
147
- if (!body || !body.data)
145
+ if (!body.data)
148
146
  throw new Error("DGIdb returned no data");
149
147
  if (body.errors?.length)
150
148
  onPartialErrors?.(body.errors.slice(0, 3));
@@ -122,16 +122,16 @@ export type DisgenetSearchType = "gene" | "disease";
122
122
  */
123
123
  export declare const DISGENET_SOURCES: readonly ["ALL", "BIOBANK", "CHEMBL", "CLINICALTRIALS", "CLINGEN", "CLINPGX", "CLINVAR", "CURATED", "FINNGEN", "GENCC", "GWASCAT", "HPO", "INFERRED", "MGD_HUMAN", "MGD_MOUSE", "MODELS", "ORPHANET", "PHEWASCAT", "PSYGENET", "RGD_HUMAN", "RGD_RAT", "TEXTMINING_HUMAN", "TEXTMINING_MODELS", "UKBIOBANK", "UNIPROT"];
124
124
  export type DisgenetSource = (typeof DISGENET_SOURCES)[number];
125
- export interface DisgenetSearchOptions {
125
+ export type DisgenetSearchOptions = {
126
126
  minScore?: number;
127
127
  source?: DisgenetSource;
128
128
  limit?: number;
129
- }
129
+ };
130
130
  /** The result of one GDA query: the records of the first page, and the count of the whole query. */
131
- export interface DisgenetSearchResult {
131
+ export type DisgenetSearchResult = {
132
132
  records: Gda[];
133
133
  totalFound: number;
134
- }
134
+ };
135
135
  /**
136
136
  * Gene-disease associations for a gene symbol or for a disease.
137
137
  *
@@ -13,7 +13,7 @@
13
13
  * `.optional()`.
14
14
  */
15
15
  import { z } from "zod";
16
- export interface EmaReferral {
16
+ export type EmaReferral = {
17
17
  category: string;
18
18
  referralName: string;
19
19
  inn: string;
@@ -33,7 +33,7 @@ export interface EmaReferral {
33
33
  firstPublishedDate: string;
34
34
  lastUpdatedDate: string;
35
35
  referralUrl: string;
36
- }
36
+ };
37
37
  /** The catalogue file. It is exported so that the golden-fixture table drives it. */
38
38
  export declare const ReferralFileSchema: z.ZodObject<{
39
39
  meta: z.ZodOptional<z.ZodObject<{
@@ -7,7 +7,7 @@
7
7
  * an explicit `null`. Thus a maybe-absent field carries `.optional()`, not
8
8
  * `.nullable()`.
9
9
  */
10
- export interface GeneInfo {
10
+ export type GeneInfo = {
11
11
  symbol: string;
12
12
  id: string;
13
13
  displayName: string;
@@ -18,10 +18,10 @@ export interface GeneInfo {
18
18
  strand: number;
19
19
  assemblyName: string;
20
20
  seqRegionName: string;
21
- }
22
- export interface LookupOptions {
21
+ };
22
+ export type LookupOptions = {
23
23
  species?: string;
24
- }
24
+ };
25
25
  /**
26
26
  * Look up genes by symbol. Gene-level only: `RawGeneSchema`/`mapGene` model the
27
27
  * gene record itself, so there is no transcript or exon detail to ask for.
@@ -48,15 +48,16 @@ function mapGene(symbol, raw) {
48
48
  */
49
49
  export async function lookupGenes(symbols, options = {}) {
50
50
  const species = options.species ?? "homo_sapiens";
51
- if (symbols.length === 1) {
52
- const result = await apiFetchValidated(`${ENSEMBL_BASE}/lookup/symbol/${species}/${symbols[0]}`, RawGeneSchema, { headers: HEADERS });
51
+ const [singleSymbol] = symbols;
52
+ if (symbols.length === 1 && singleSymbol !== undefined) {
53
+ const result = await apiFetchValidated(`${ENSEMBL_BASE}/lookup/symbol/${species}/${singleSymbol}`, RawGeneSchema, { headers: HEADERS });
53
54
  if (result.isErr()) {
54
55
  if (result.error.type === "http_status" && result.error.status === 400) {
55
- return { genes: [], notFound: [symbols[0]] };
56
+ return { genes: [], notFound: [singleSymbol] };
56
57
  }
57
58
  throw new Error(describeApiError(result.error));
58
59
  }
59
- return { genes: [mapGene(symbols[0], result.value)], notFound: [] };
60
+ return { genes: [mapGene(singleSymbol, result.value)], notFound: [] };
60
61
  }
61
62
  const result = await apiFetchValidated(`${ENSEMBL_BASE}/lookup/symbol/${species}`, z.record(z.string(), RawGeneSchema), {
62
63
  method: "POST",
@@ -11,7 +11,7 @@
11
11
  * only when the projection that the request named excludes it.
12
12
  */
13
13
  import { z } from "zod";
14
- export interface GwasAssociation {
14
+ export type GwasAssociation = {
15
15
  rsId: string;
16
16
  pValue: number;
17
17
  pValueMantissa: number;
@@ -25,7 +25,7 @@ export interface GwasAssociation {
25
25
  studyAccession: string;
26
26
  pubmedId: string;
27
27
  sampleSize: string;
28
- }
28
+ };
29
29
  export type GwasSearchType = "gene" | "trait" | "variant" | "study";
30
30
  declare const RawGwasAssociationSchema: z.ZodObject<{
31
31
  _snpRsId: z.ZodOptional<z.ZodString>;
@@ -113,10 +113,10 @@ export declare const GwasSnpSearchResponseSchema: z.ZodObject<{
113
113
  }, z.core.$strip>>;
114
114
  }, z.core.$strip>;
115
115
  export declare function mapAssociation(a: RawGwasAssociation): GwasAssociation;
116
- export interface GwasSearchOptions {
116
+ export type GwasSearchOptions = {
117
117
  pValueThreshold?: number;
118
118
  limit?: number;
119
- }
119
+ };
120
120
  export declare function searchGwasCatalog(query: string, searchType: GwasSearchType, options?: GwasSearchOptions): Promise<{
121
121
  totalFound: number;
122
122
  associations: GwasAssociation[];
@@ -72,26 +72,26 @@ export const GwasSnpSearchResponseSchema = z.object({
72
72
  });
73
73
  export function mapAssociation(a) {
74
74
  const loci = a.loci ?? [];
75
- const riskAlleles = loci.flatMap((l) => l.strongestRiskAlleles?.map((ra) => String(ra.riskAlleleName ?? "")) ?? []);
76
- const genes = loci.flatMap((l) => l.authorReportedGenes?.map((g) => String(g.geneName ?? "")) ?? []);
77
- const traits = (a.efoTraits ?? []).map((t) => String(t.trait ?? ""));
75
+ const riskAlleles = loci.flatMap((l) => l.strongestRiskAlleles?.map((ra) => ra.riskAlleleName ?? "") ?? []);
76
+ const genes = loci.flatMap((l) => l.authorReportedGenes?.map((g) => g.geneName ?? "") ?? []);
77
+ const traits = (a.efoTraits ?? []).map((t) => t.trait ?? "");
78
78
  const study = a.study ?? {};
79
79
  const pMantissa = a.pvalueMantissa ?? 0;
80
80
  const pExponent = a.pvalueExponent ?? 0;
81
81
  return {
82
- rsId: String(a._snpRsId ?? riskAlleles[0]?.split("-")[0] ?? ""),
82
+ rsId: a._snpRsId ?? riskAlleles[0]?.split("-")[0] ?? "",
83
83
  pValue: pMantissa * Math.pow(10, pExponent),
84
84
  pValueMantissa: pMantissa,
85
85
  pValueExponent: pExponent,
86
86
  riskAllele: riskAlleles.join(", "),
87
- riskFrequency: String(a.riskFrequency ?? ""),
88
- orBeta: (a.orPerCopyNum ?? a.betaNum ?? null),
89
- ci: String(a.range ?? ""),
87
+ riskFrequency: a.riskFrequency ?? "",
88
+ orBeta: a.orPerCopyNum ?? a.betaNum ?? null,
89
+ ci: a.range ?? "",
90
90
  trait: traits.join("; "),
91
91
  mappedGenes: [...new Set(genes)],
92
- studyAccession: String(study.accessionId ?? ""),
93
- pubmedId: String(study.publicationInfo?.pubmedId ?? ""),
94
- sampleSize: String(study.initialSampleSize ?? ""),
92
+ studyAccession: study.accessionId ?? "",
93
+ pubmedId: study.publicationInfo?.pubmedId ?? "",
94
+ sampleSize: study.initialSampleSize ?? "",
95
95
  };
96
96
  }
97
97
  /** Max SNPs whose associations the 'gene' path walks; each is one request. */
@@ -104,15 +104,15 @@ export async function searchGwasCatalog(query, searchType, options = {}) {
104
104
  const snpRes = await apiFetchValidated(url, GwasSnpSearchResponseSchema, { headers: GWAS_HEADERS });
105
105
  if (snpRes.isErr())
106
106
  throw new Error(describeApiError(snpRes.error));
107
- const snps = snpRes.value?._embedded?.singleNucleotidePolymorphisms ?? [];
107
+ const snps = snpRes.value._embedded?.singleNucleotidePolymorphisms ?? [];
108
108
  const allAssocs = [];
109
109
  for (const snp of snps.slice(0, Math.min(limit, GENE_PATH_MAX_SNPS))) {
110
- const assocLink = snp?._links?.associations?.href;
110
+ const assocLink = snp._links?.associations?.href;
111
111
  if (!assocLink)
112
112
  continue;
113
113
  const aRes = await apiFetchValidated(assocLink, GwasEmbeddedSchema, { headers: GWAS_HEADERS });
114
114
  if (aRes.isOk()) {
115
- for (const a of aRes.value?._embedded?.associations ?? []) {
115
+ for (const a of aRes.value._embedded?.associations ?? []) {
116
116
  a._snpRsId = snp.rsId;
117
117
  allAssocs.push(a);
118
118
  }
@@ -143,10 +143,10 @@ export async function searchGwasCatalog(query, searchType, options = {}) {
143
143
  });
144
144
  if (traitRes.isErr())
145
145
  throw new Error(describeApiError(traitRes.error));
146
- const traitUri = (traitRes.value?._embedded?.efoTraits ?? [])[0]?._links?.self?.href;
146
+ const traitUri = (traitRes.value._embedded?.efoTraits ?? [])[0]?._links?.self?.href;
147
147
  if (!traitUri)
148
148
  return { totalFound: 0, associations: [] };
149
- associationsUrl = `${GWAS_BASE}/efoTraits/${traitUri.split("/").pop()}/associations?size=${limit}`;
149
+ associationsUrl = `${GWAS_BASE}/efoTraits/${String(traitUri.split("/").pop())}/associations?size=${limit}`;
150
150
  }
151
151
  const res = await apiFetchValidated(associationsUrl, GwasEmbeddedSchema, { headers: GWAS_HEADERS });
152
152
  if (res.isErr()) {
@@ -156,8 +156,8 @@ export async function searchGwasCatalog(query, searchType, options = {}) {
156
156
  return { totalFound: 0, associations: [] };
157
157
  throw new Error(describeApiError(res.error));
158
158
  }
159
- const rawAssocs = res.value?._embedded?.associations ?? [];
160
- const totalFound = res.value?.page?.totalElements ?? rawAssocs.length;
159
+ const rawAssocs = res.value._embedded?.associations ?? [];
160
+ const totalFound = res.value.page?.totalElements ?? rawAssocs.length;
161
161
  const filtered = rawAssocs.filter((a) => (a.pvalueMantissa ?? 1) * Math.pow(10, a.pvalueExponent ?? 0) <= pValueThreshold).slice(0, limit);
162
162
  return { totalFound, associations: filtered.map(mapAssociation) };
163
163
  }
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Strip each `<...>` run to its first closing bracket. One pass already
3
+ * reaches the fixpoint: a span's interior holds no `>`, so a removal cannot
4
+ * form a new `<...>` pair.
5
+ */
6
+ export declare function stripHtmlTags(text: string): string;
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Strip each `<...>` run to its first closing bracket. One pass already
3
+ * reaches the fixpoint: a span's interior holds no `>`, so a removal cannot
4
+ * form a new `<...>` pair.
5
+ */
6
+ export function stripHtmlTags(text) {
7
+ // oxlint-disable-next-line eslint-js/no-restricted-syntax -- an HTML tag run to the first closing bracket; a quoted `>` inside an attribute is deliberately not seen.
8
+ return text.replace(/<[^>]+>/g, "");
9
+ }
@@ -18,7 +18,7 @@
18
18
  */
19
19
  import { z } from "zod";
20
20
  import type { Logger } from "../../lib/logger.js";
21
- export interface ResolvedTarget {
21
+ export type ResolvedTarget = {
22
22
  /** Canonical id used as the entity-resolution anchor — preferred order: HGNC, then Ensembl. */
23
23
  canonicalId: string;
24
24
  /** What ontology produced the canonical id ("hgnc" or "ensembl"). */
@@ -48,7 +48,7 @@ export interface ResolvedTarget {
48
48
  ensembl: boolean;
49
49
  chembl: boolean;
50
50
  };
51
- }
51
+ };
52
52
  export declare const HgncResponseSchema: z.ZodObject<{
53
53
  response: z.ZodOptional<z.ZodObject<{
54
54
  docs: z.ZodOptional<z.ZodArray<z.ZodObject<{
@@ -69,7 +69,7 @@ export declare const HgncResponseSchema: z.ZodObject<{
69
69
  * @throws when the input cannot be mapped to any human gene/protein.
70
70
  */
71
71
  export declare function resolveTarget(input: string, logger?: Logger): Promise<ResolvedTarget>;
72
- export interface AutocompleteCandidate {
72
+ export type AutocompleteCandidate = {
73
73
  /** Approved HGNC symbol when known, otherwise the input symbol. */
74
74
  symbol: string;
75
75
  /** Full gene/protein name. */
@@ -79,7 +79,7 @@ export interface AutocompleteCandidate {
79
79
  uniprotId: string | null;
80
80
  /** Sorted synonyms across HGNC + UniProt. */
81
81
  synonyms: string[];
82
- }
82
+ };
83
83
  /**
84
84
  * Resolve a single gene-symbol query for the autocomplete UI by fanning
85
85
  * out HGNC + UniProt + Ensembl in parallel and merging into one canonical
@@ -26,9 +26,13 @@ const HGNC_BASE = "https://rest.genenames.org/fetch";
26
26
  const UNIPROT_BASE = "https://rest.uniprot.org/uniprotkb/search";
27
27
  const HGNC_HEADERS = { Accept: "application/json" };
28
28
  const UNIPROT_HEADERS = { Accept: "application/json" };
29
+ // oxlint-disable-next-line eslint-js/no-restricted-syntax -- Ensembl gene ids are ENSG plus 11 digits; the fixed shape is the identifier rule.
29
30
  const ENSG_RE = /^ENSG\d{11}$/;
31
+ // oxlint-disable-next-line eslint-js/no-restricted-syntax -- the UniProt accession shape with its optional isoform suffix (-<n>).
30
32
  const UNIPROT_RE = /^[A-Z][0-9][A-Z0-9]{3}[0-9](-\d+)?$/;
33
+ // oxlint-disable-next-line eslint-js/no-restricted-syntax -- ChEMBL ids carry the fixed CHEMBL<n> shape.
31
34
  const CHEMBL_RE = /^CHEMBL\d+$/;
35
+ // oxlint-disable-next-line eslint-js/no-restricted-syntax -- HGNC ids are the HGNC: prefix plus digits.
32
36
  const HGNC_RE = /^HGNC:\d+$/;
33
37
  // HGNC search payload, validated at the fetch boundary. Every field is optional
34
38
  // because the API omits absent values; each read below is optional-chained /
@@ -166,7 +170,7 @@ export async function resolveTarget(input, logger) {
166
170
  }
167
171
  }
168
172
  else if (seedHgncId) {
169
- hgncDoc = await fetchHgncBy("hgnc_id", seedHgncId.replace(/^HGNC:/, ""));
173
+ hgncDoc = await fetchHgncBy("hgnc_id", seedHgncId.startsWith("HGNC:") ? seedHgncId.slice("HGNC:".length) : seedHgncId);
170
174
  }
171
175
  else if (seedEnsemblId) {
172
176
  hgncDoc = await fetchHgncBy("ensembl_gene_id", seedEnsemblId);
@@ -230,9 +234,9 @@ export async function resolveTarget(input, logger) {
230
234
  }
231
235
  const synonyms = new Set();
232
236
  for (const s of hgncDoc?.alias_symbol ?? [])
233
- synonyms.add(String(s));
237
+ synonyms.add(s);
234
238
  for (const s of hgncDoc?.prev_symbol ?? [])
235
- synonyms.add(String(s));
239
+ synonyms.add(s);
236
240
  for (const g of uniprotDoc?.genes ?? []) {
237
241
  for (const syn of g.synonyms ?? []) {
238
242
  if (syn.value)
@@ -8,27 +8,27 @@
8
8
  * sends an explicit `null`. Thus a maybe-absent field carries `.optional()`,
9
9
  * not `.nullable()`.
10
10
  */
11
- export interface MpTerm {
11
+ export type MpTerm = {
12
12
  id: string;
13
13
  term: string;
14
14
  bestPValue: number | null;
15
- }
16
- export interface PhenotypeProfile {
15
+ };
16
+ export type PhenotypeProfile = {
17
17
  mpTerms: MpTerm[];
18
18
  organSystems: string[];
19
19
  sexDimorphic: boolean;
20
20
  phenotypeCount: number;
21
- }
22
- export interface ViabilityCall {
21
+ };
22
+ export type ViabilityCall = {
23
23
  zygosity: string;
24
24
  parameterStableId: string;
25
25
  mpTerm: {
26
26
  id: string;
27
27
  name: string;
28
28
  } | null;
29
- }
29
+ };
30
30
  export type ViabilityCategory = "lethal_pre_weaning" | "subviable" | "viable" | null;
31
- export interface KoPhenotypeProfile {
31
+ export type KoPhenotypeProfile = {
32
32
  geneSymbol: string;
33
33
  mouseMarkerSymbol: string | null;
34
34
  mgiAccessionId: string | null;
@@ -40,7 +40,7 @@ export interface KoPhenotypeProfile {
40
40
  phenotypeCount: number;
41
41
  phenotypeDocsTotal: number;
42
42
  phenotypesTruncated: boolean;
43
- }
43
+ };
44
44
  export declare function parsePhenotypeResponse(raw: unknown): PhenotypeProfile;
45
45
  export declare function buildViabilityCalls(docsB: unknown, docsC: unknown): ViabilityCall[];
46
46
  export declare function derivedViability(calls: ViabilityCall[]): ViabilityCategory;
@@ -9,6 +9,9 @@
9
9
  * not `.nullable()`.
10
10
  */
11
11
  import { z } from "zod";
12
+ import { isUnknownArray } from "../../lib/unknown-array.js";
13
+ import { presentGet } from "../../lib/present.js";
14
+ import { parseUnknownRecord } from "../../lib/unknown-containers.js";
12
15
  import { apiFetchValidated, describeApiError, isUnexpectedApiError } from "./api-utils.js";
13
16
  const IMPC_BASE = "https://www.ebi.ac.uk/mi/impc/solr";
14
17
  const PHENOTYPE_ROW_CAP = 500;
@@ -40,14 +43,14 @@ const ORGAN_SYSTEM_MAP = {
40
43
  "embryo phenotype": "growth",
41
44
  };
42
45
  // A single IMPC Solr document — fields vary by core; all optional. `top_level_mp_term_name`
43
- // and `sex` are `z.unknown()` because the code reads them defensively (`Array.isArray`,
46
+ // and `sex` ride as JSON values: the code reads them defensively (`Array.isArray`,
44
47
  // `typeof === "string"`) rather than trusting a wire type.
45
48
  const ImpcSolrDocSchema = z.object({
46
49
  mp_term_id: z.string().optional(),
47
50
  mp_term_name: z.string().optional(),
48
51
  p_value: z.number().optional(),
49
- top_level_mp_term_name: z.unknown().optional(),
50
- sex: z.unknown().optional(),
52
+ top_level_mp_term_name: z.json().optional(),
53
+ sex: z.json().optional(),
51
54
  parameter_stable_id: z.string().optional(),
52
55
  parameter_name: z.string().optional(),
53
56
  marker_symbol: z.string().optional(),
@@ -57,14 +60,21 @@ const ImpcSolrDocSchema = z.object({
57
60
  const ImpcSolrResponseSchema = z.object({
58
61
  response: z.object({ docs: z.array(ImpcSolrDocSchema).optional(), numFound: z.number().optional() }).optional(),
59
62
  });
63
+ import { hasWhitespace } from "../../lib/text.js";
60
64
  function escapeSolrValue(value) {
61
- return value.replace(/([+\-&|!(){}[\]^"~*?:\\/\s])/g, "\\$1");
65
+ const specials = '+-&|!(){}[]^"~*?:\\/';
66
+ let out = "";
67
+ for (const char of value) {
68
+ if (specials.includes(char) || hasWhitespace(char))
69
+ out += "\\" + char;
70
+ else
71
+ out += char;
72
+ }
73
+ return out;
62
74
  }
63
75
  export function parsePhenotypeResponse(raw) {
64
- // `raw` is the untyped IMPC Solr response; we reach `.response.docs` defensively
65
- // (optional-chained, defaulted to []) and treat each doc's fields as optional below.
66
- const docs = raw?.response?.docs ?? [];
67
- if (!Array.isArray(docs) || docs.length === 0) {
76
+ const docs = solrDocsOf(raw);
77
+ if (docs.length === 0) {
68
78
  return { mpTerms: [], organSystems: [], sexDimorphic: false, phenotypeCount: 0 };
69
79
  }
70
80
  const byMp = new Map();
@@ -72,13 +82,13 @@ export function parsePhenotypeResponse(raw) {
72
82
  const mpToSexes = new Map();
73
83
  const allSexes = new Set();
74
84
  for (const doc of docs) {
75
- const mpId = doc.mp_term_id;
85
+ const mpId = readString(doc, "mp_term_id");
76
86
  if (!mpId)
77
87
  continue;
78
88
  const newP = typeof doc.p_value === "number" && Number.isFinite(doc.p_value) ? doc.p_value : null;
79
89
  const existing = byMp.get(mpId);
80
90
  if (!existing) {
81
- byMp.set(mpId, { id: mpId, term: doc.mp_term_name ?? "", bestPValue: newP });
91
+ byMp.set(mpId, { id: mpId, term: readString(doc, "mp_term_name") ?? "", bestPValue: newP });
82
92
  }
83
93
  else if (newP !== null && (existing.bestPValue === null || newP < existing.bestPValue)) {
84
94
  existing.bestPValue = newP;
@@ -97,7 +107,7 @@ export function parsePhenotypeResponse(raw) {
97
107
  allSexes.add(sex);
98
108
  if (!mpToSexes.has(mpId))
99
109
  mpToSexes.set(mpId, new Set());
100
- mpToSexes.get(mpId).add(sex);
110
+ presentGet(mpToSexes, mpId, "the sex set of the phenotype").add(sex);
101
111
  }
102
112
  }
103
113
  const mpTerms = [...byMp.values()].sort((a, b) => {
@@ -110,33 +120,34 @@ export function parsePhenotypeResponse(raw) {
110
120
  const sexDimorphic = bothSexesTested && [...mpToSexes.values()].some((sexes) => (sexes.has("male") && !sexes.has("female")) || (sexes.has("female") && !sexes.has("male")));
111
121
  return { mpTerms, organSystems, sexDimorphic, phenotypeCount: byMp.size };
112
122
  }
123
+ function readString(record, key) {
124
+ const value = record[key];
125
+ return typeof value === "string" ? value : undefined;
126
+ }
127
+ /** The `.response.docs` of a Solr envelope, each doc as the record its fields are read off; a non-record doc is skipped. */
128
+ function solrDocsOf(raw) {
129
+ const docs = parseUnknownRecord(parseUnknownRecord(raw)?.response)?.docs;
130
+ if (!isUnknownArray(docs))
131
+ return [];
132
+ return docs.flatMap((doc) => {
133
+ const record = parseUnknownRecord(doc);
134
+ return record === undefined ? [] : [record];
135
+ });
136
+ }
113
137
  export function buildViabilityCalls(docsB, docsC) {
114
- // `docsB`/`docsC` are untyped IMPC Solr responses; the `.response.docs` reach is
115
- // optional-chained + defaulted, so a shape mismatch degrades to an empty result.
116
- const bDocs = docsB?.response?.docs ?? [];
117
- const cDocs = docsC?.response?.docs ?? [];
118
138
  const seen = new Set();
119
139
  const out = [];
120
- for (const d of bDocs) {
121
- const pid = d.parameter_stable_id;
122
- if (!pid || seen.has(pid))
123
- continue;
124
- seen.add(pid);
125
- out.push({
126
- zygosity: d.parameter_name ?? "",
127
- parameterStableId: pid,
128
- mpTerm: d.mp_term_id && d.mp_term_name ? { id: d.mp_term_id, name: d.mp_term_name } : null,
129
- });
130
- }
131
- for (const d of cDocs) {
132
- const pid = d.parameter_stable_id;
140
+ for (const d of [...solrDocsOf(docsB), ...solrDocsOf(docsC)]) {
141
+ const pid = readString(d, "parameter_stable_id");
133
142
  if (!pid || seen.has(pid))
134
143
  continue;
135
144
  seen.add(pid);
145
+ const mpId = readString(d, "mp_term_id");
146
+ const mpName = readString(d, "mp_term_name");
136
147
  out.push({
137
- zygosity: d.parameter_name ?? "",
148
+ zygosity: readString(d, "parameter_name") ?? "",
138
149
  parameterStableId: pid,
139
- mpTerm: null,
150
+ mpTerm: mpId && mpName ? { id: mpId, name: mpName } : null,
140
151
  });
141
152
  }
142
153
  return out;
@@ -159,15 +170,15 @@ async function resolveImpcGene(humanSymbol) {
159
170
  throw new Error(describeApiError(res.error));
160
171
  return null;
161
172
  }
162
- const docs = res.value?.response?.docs ?? [];
173
+ const docs = res.value.response?.docs ?? [];
163
174
  if (!Array.isArray(docs) || docs.length === 0)
164
175
  return null;
165
176
  const doc = docs[0];
166
- if (!doc.marker_symbol || !doc.mgi_accession_id)
177
+ if (doc === undefined || !doc.marker_symbol || !doc.mgi_accession_id)
167
178
  return null;
168
179
  return {
169
- mouseMarkerSymbol: String(doc.marker_symbol),
170
- mgiAccessionId: String(doc.mgi_accession_id),
180
+ mouseMarkerSymbol: doc.marker_symbol,
181
+ mgiAccessionId: doc.mgi_accession_id,
171
182
  };
172
183
  }
173
184
  async function fetchPhenotypes(mouseSym) {
@@ -179,7 +190,7 @@ async function fetchPhenotypes(mouseSym) {
179
190
  throw new Error(describeApiError(res.error));
180
191
  return { raw: { response: { docs: [] } }, numFound: 0 };
181
192
  }
182
- const numFound = Number(res.value?.response?.numFound ?? 0);
193
+ const numFound = res.value.response?.numFound ?? 0;
183
194
  return { raw: res.value, numFound };
184
195
  }
185
196
  async function fetchAssignedViability(mouseSym) {
@@ -19,14 +19,14 @@ export declare const IupharTargetSchema: z.ZodObject<{
19
19
  subunitType: z.ZodOptional<z.ZodString>;
20
20
  }, z.core.$strip>;
21
21
  export type IupharTarget = z.infer<typeof IupharTargetSchema>;
22
- export interface IupharHeterodimer {
22
+ export type IupharHeterodimer = {
23
23
  /** Complex target record (e.g., the AMY1 receptor). */
24
24
  complex: IupharTarget;
25
25
  /** All subunits of the complex, including the primary protein and accessory(ies). */
26
26
  subunits: IupharTarget[];
27
27
  /** Accessory-protein subunits only (type === "AccessoryProtein"). */
28
28
  accessories: IupharTarget[];
29
- }
29
+ };
30
30
  export declare function findTargetByGeneSymbol(geneSymbol: string): Promise<IupharTarget | null>;
31
31
  export declare function findTargetByUniprot(accession: string): Promise<IupharTarget | null>;
32
32
  /**
@@ -9,6 +9,8 @@
9
9
  */
10
10
  import { z } from "zod";
11
11
  import { createNoopLogger } from "../../lib/console-logger.js";
12
+ import { presentAt } from "../../lib/present.js";
13
+ import { stripHtmlTags } from "./html-text.js";
12
14
  import { apiFetchValidated, describeApiError, isUnexpectedApiError } from "./api-utils.js";
13
15
  import { IUPHAR_BASE, IUPHAR_HEADERS as HEADERS } from "./iuphar-config.js";
14
16
  // Validated at the fetch boundary. GtoPdb serves the target record in three
@@ -36,19 +38,8 @@ export const IupharTargetSchema = z.object({
36
38
  complexIds: z.array(z.number()).optional(),
37
39
  subunitType: z.string().optional(),
38
40
  });
41
+ // oxlint-disable-next-line eslint-js/no-restricted-syntax -- the issued UniProt accession shape is the identifier rule of the target records.
39
42
  const UNIPROT_ACCESSION_RE = /^[A-Z][0-9][A-Z0-9]{3}[0-9]$/;
40
- function stripHtml(name) {
41
- // Strip tags to a fixpoint: a single pass can leave a `<…>` behind when
42
- // removing an inner tag lets the surrounding angle brackets form a new one,
43
- // so repeat until the string stops changing.
44
- let out = name;
45
- let prev;
46
- do {
47
- prev = out;
48
- out = out.replace(/<[^>]+>/g, "");
49
- } while (out !== prev);
50
- return out;
51
- }
52
43
  function notFound(error) {
53
44
  return error.type === "http_status" && (error.status === 404 || error.status === 204);
54
45
  }
@@ -123,9 +114,9 @@ export async function getFamilyHeterodimers(uniprotOrGeneSymbol) {
123
114
  const batch = complexes.slice(i, i + concurrency);
124
115
  const subunitLists = await Promise.all(batch.map((c) => getSubunits(c.targetId)));
125
116
  for (let j = 0; j < batch.length; j++) {
126
- const complex = batch[j];
127
- const subunits = subunitLists[j];
128
- const cleanedSubunits = subunits.map((s) => ({ ...s, name: stripHtml(s.name) }));
117
+ const complex = presentAt(batch, j, "the complex of the batch");
118
+ const subunits = presentAt(subunitLists, j, "the subunits of the complex");
119
+ const cleanedSubunits = subunits.map((s) => ({ ...s, name: stripHtmlTags(s.name) }));
129
120
  // Only a shape B row reaches this filter, because `getSubunits`
130
121
  // calls `/targets/{id}/subunits`. Shape B is the one shape that
131
122
  // names the kind of a target as `AccessoryProtein`, and the
@@ -134,7 +125,7 @@ export async function getFamilyHeterodimers(uniprotOrGeneSymbol) {
134
125
  // row or a single-target row would match nothing.
135
126
  const accessories = cleanedSubunits.filter((s) => (s.type ?? "").toLowerCase() === "accessoryprotein");
136
127
  results.push({
137
- complex: { ...complex, name: stripHtml(complex.name) },
128
+ complex: { ...complex, name: stripHtmlTags(complex.name) },
138
129
  subunits: cleanedSubunits,
139
130
  accessories,
140
131
  });
@@ -17,7 +17,7 @@
17
17
  * field carries `.nullish()` exactly.
18
18
  */
19
19
  /** A curated human phenotype attributed to variation in the gene. */
20
- export interface MonarchPhenotypeAssociation {
20
+ export type MonarchPhenotypeAssociation = {
21
21
  /** HPO term id, e.g. `HP:0001392`. */
22
22
  readonly hpoId: string;
23
23
  readonly label: string;
@@ -30,12 +30,12 @@ export interface MonarchPhenotypeAssociation {
30
30
  /** Share of affected individuals showing the phenotype, when annotated. */
31
31
  readonly frequencyPercent: number | null;
32
32
  readonly primaryKnowledgeSource: string | null;
33
- }
34
- export interface MonarchGeneProfile {
33
+ };
34
+ export type MonarchGeneProfile = {
35
35
  /** The curie the gene was queried by, e.g. `HGNC:1097`. */
36
36
  readonly geneCurie: string;
37
37
  readonly phenotypes: MonarchPhenotypeAssociation[];
38
- }
38
+ };
39
39
  /**
40
40
  * Curated human phenotype associations for one gene.
41
41
  *