@inflexa-ai/harness 0.1.1

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 (823) hide show
  1. package/LICENSE +202 -0
  2. package/NOTICE +5 -0
  3. package/README.md +58 -0
  4. package/dist/agents/conversation-agent.d.ts +105 -0
  5. package/dist/agents/conversation-agent.js +140 -0
  6. package/dist/agents/report-builder.d.ts +32 -0
  7. package/dist/agents/report-builder.js +31 -0
  8. package/dist/agents/sandbox/__fixtures__/deps.d.ts +23 -0
  9. package/dist/agents/sandbox/__fixtures__/deps.js +96 -0
  10. package/dist/agents/sandbox/bulk-transcriptomics-agent.d.ts +8 -0
  11. package/dist/agents/sandbox/bulk-transcriptomics-agent.js +22 -0
  12. package/dist/agents/sandbox/cheminformatics-agent.d.ts +9 -0
  13. package/dist/agents/sandbox/cheminformatics-agent.js +62 -0
  14. package/dist/agents/sandbox/chromatin-agent.d.ts +8 -0
  15. package/dist/agents/sandbox/chromatin-agent.js +24 -0
  16. package/dist/agents/sandbox/data-profiler.d.ts +10 -0
  17. package/dist/agents/sandbox/data-profiler.js +24 -0
  18. package/dist/agents/sandbox/dna-methylation-agent.d.ts +8 -0
  19. package/dist/agents/sandbox/dna-methylation-agent.js +24 -0
  20. package/dist/agents/sandbox/drug-repurposing-agent.d.ts +8 -0
  21. package/dist/agents/sandbox/drug-repurposing-agent.js +54 -0
  22. package/dist/agents/sandbox/enrichment-agent.d.ts +8 -0
  23. package/dist/agents/sandbox/enrichment-agent.js +24 -0
  24. package/dist/agents/sandbox/ephemeral-executor.d.ts +9 -0
  25. package/dist/agents/sandbox/ephemeral-executor.js +29 -0
  26. package/dist/agents/sandbox/genomic-variant-agent.d.ts +8 -0
  27. package/dist/agents/sandbox/genomic-variant-agent.js +27 -0
  28. package/dist/agents/sandbox/immune-profiling-agent.d.ts +8 -0
  29. package/dist/agents/sandbox/immune-profiling-agent.js +43 -0
  30. package/dist/agents/sandbox/index.d.ts +31 -0
  31. package/dist/agents/sandbox/index.js +96 -0
  32. package/dist/agents/sandbox/metabolomics-agent.d.ts +8 -0
  33. package/dist/agents/sandbox/metabolomics-agent.js +15 -0
  34. package/dist/agents/sandbox/microbiome-agent.d.ts +8 -0
  35. package/dist/agents/sandbox/microbiome-agent.js +15 -0
  36. package/dist/agents/sandbox/multi-omics-integration-agent.d.ts +8 -0
  37. package/dist/agents/sandbox/multi-omics-integration-agent.js +33 -0
  38. package/dist/agents/sandbox/multimodal-sc-agent.d.ts +8 -0
  39. package/dist/agents/sandbox/multimodal-sc-agent.js +15 -0
  40. package/dist/agents/sandbox/network-agent.d.ts +8 -0
  41. package/dist/agents/sandbox/network-agent.js +25 -0
  42. package/dist/agents/sandbox/pkpd-clinical-response-agent.d.ts +8 -0
  43. package/dist/agents/sandbox/pkpd-clinical-response-agent.js +59 -0
  44. package/dist/agents/sandbox/proteomics-agent.d.ts +8 -0
  45. package/dist/agents/sandbox/proteomics-agent.js +15 -0
  46. package/dist/agents/sandbox/scientific-executor.d.ts +9 -0
  47. package/dist/agents/sandbox/scientific-executor.js +56 -0
  48. package/dist/agents/sandbox/shared.d.ts +100 -0
  49. package/dist/agents/sandbox/shared.js +195 -0
  50. package/dist/agents/sandbox/single-cell-agent.d.ts +8 -0
  51. package/dist/agents/sandbox/single-cell-agent.js +25 -0
  52. package/dist/agents/sandbox/spatial-omics-agent.d.ts +8 -0
  53. package/dist/agents/sandbox/spatial-omics-agent.js +15 -0
  54. package/dist/agents/sandbox/statistical-modeling-agent.d.ts +8 -0
  55. package/dist/agents/sandbox/statistical-modeling-agent.js +37 -0
  56. package/dist/agents/sandbox/translational-safety-agent.d.ts +8 -0
  57. package/dist/agents/sandbox/translational-safety-agent.js +59 -0
  58. package/dist/agents/sandbox/types.d.ts +34 -0
  59. package/dist/agents/sandbox/types.js +15 -0
  60. package/dist/agents/sandbox/validate-skills.d.ts +18 -0
  61. package/dist/agents/sandbox/validate-skills.js +40 -0
  62. package/dist/agents/sandbox-catalog.d.ts +33 -0
  63. package/dist/agents/sandbox-catalog.js +44 -0
  64. package/dist/agents/system-prompt.d.ts +25 -0
  65. package/dist/agents/system-prompt.js +23 -0
  66. package/dist/app/chat-turn.d.ts +35 -0
  67. package/dist/app/chat-turn.js +64 -0
  68. package/dist/app/data-profile-policy.d.ts +36 -0
  69. package/dist/app/data-profile-policy.js +37 -0
  70. package/dist/app/message-assembly.d.ts +65 -0
  71. package/dist/app/message-assembly.js +61 -0
  72. package/dist/app/synthesize-run.d.ts +57 -0
  73. package/dist/app/synthesize-run.js +103 -0
  74. package/dist/auth/local-auth-context.d.ts +19 -0
  75. package/dist/auth/local-auth-context.js +20 -0
  76. package/dist/auth/local-run-authorizer.d.ts +10 -0
  77. package/dist/auth/local-run-authorizer.js +23 -0
  78. package/dist/auth/types.d.ts +166 -0
  79. package/dist/auth/types.js +61 -0
  80. package/dist/billing/cached-resolver.d.ts +23 -0
  81. package/dist/billing/cached-resolver.js +61 -0
  82. package/dist/billing/noop-resolver.d.ts +6 -0
  83. package/dist/billing/noop-resolver.js +7 -0
  84. package/dist/billing/noop-run-charge.d.ts +6 -0
  85. package/dist/billing/noop-run-charge.js +10 -0
  86. package/dist/billing/resolver.d.ts +64 -0
  87. package/dist/billing/resolver.js +24 -0
  88. package/dist/billing/run-charge.d.ts +24 -0
  89. package/dist/billing/run-charge.js +9 -0
  90. package/dist/config/resource-limits.d.ts +76 -0
  91. package/dist/config/resource-limits.js +116 -0
  92. package/dist/contracts/analogy-report.d.ts +120 -0
  93. package/dist/contracts/analogy-report.js +50 -0
  94. package/dist/contracts/chat-events.d.ts +61 -0
  95. package/dist/contracts/chat-events.js +13 -0
  96. package/dist/contracts/chat-parts.d.ts +308 -0
  97. package/dist/contracts/chat-parts.js +13 -0
  98. package/dist/contracts/content-url.d.ts +49 -0
  99. package/dist/contracts/content-url.js +56 -0
  100. package/dist/contracts/index.d.ts +12 -0
  101. package/dist/contracts/index.js +5 -0
  102. package/dist/contracts/message.d.ts +36 -0
  103. package/dist/contracts/message.js +9 -0
  104. package/dist/contracts/part-registry.d.ts +18 -0
  105. package/dist/contracts/part-registry.js +28 -0
  106. package/dist/contracts/schemas/chat-events.d.ts +90 -0
  107. package/dist/contracts/schemas/chat-events.js +43 -0
  108. package/dist/contracts/schemas/chat-parts.d.ts +683 -0
  109. package/dist/contracts/schemas/chat-parts.js +295 -0
  110. package/dist/contracts/schemas/index.d.ts +2 -0
  111. package/dist/contracts/schemas/index.js +2 -0
  112. package/dist/contracts/target-assessment-row.d.ts +85 -0
  113. package/dist/contracts/target-assessment-row.js +37 -0
  114. package/dist/contracts/target-dossier.d.ts +16720 -0
  115. package/dist/contracts/target-dossier.js +1339 -0
  116. package/dist/data/clinical-benchmarks.json +108 -0
  117. package/dist/data/protein-family-modality.json +101 -0
  118. package/dist/data/safety-panel-schema.d.ts +64 -0
  119. package/dist/data/safety-panel-schema.js +34 -0
  120. package/dist/data/safety-panel.json +436 -0
  121. package/dist/execution/artifact-metadata.d.ts +74 -0
  122. package/dist/execution/artifact-metadata.js +203 -0
  123. package/dist/execution/artifact-record.d.ts +19 -0
  124. package/dist/execution/artifact-record.js +7 -0
  125. package/dist/execution/artifact-registration.d.ts +36 -0
  126. package/dist/execution/artifact-registration.js +61 -0
  127. package/dist/execution/artifact-registry.d.ts +82 -0
  128. package/dist/execution/artifact-registry.js +17 -0
  129. package/dist/execution/dbos-run-launcher.d.ts +7 -0
  130. package/dist/execution/dbos-run-launcher.js +38 -0
  131. package/dist/execution/ephemeral-runner.d.ts +81 -0
  132. package/dist/execution/ephemeral-runner.js +161 -0
  133. package/dist/execution/filesystem-artifact-registry.d.ts +57 -0
  134. package/dist/execution/filesystem-artifact-registry.js +92 -0
  135. package/dist/execution/noop-artifact-registry.d.ts +11 -0
  136. package/dist/execution/noop-artifact-registry.js +17 -0
  137. package/dist/execution/post-step-pipeline.d.ts +70 -0
  138. package/dist/execution/post-step-pipeline.js +207 -0
  139. package/dist/execution/post-step.d.ts +20 -0
  140. package/dist/execution/post-step.js +65 -0
  141. package/dist/execution/reconcile-manifest.d.ts +25 -0
  142. package/dist/execution/reconcile-manifest.js +132 -0
  143. package/dist/execution/report-render.d.ts +39 -0
  144. package/dist/execution/report-render.js +98 -0
  145. package/dist/execution/report-runner.d.ts +87 -0
  146. package/dist/execution/report-runner.js +227 -0
  147. package/dist/execution/run-authorizer.d.ts +43 -0
  148. package/dist/execution/run-authorizer.js +17 -0
  149. package/dist/execution/run-launcher.d.ts +36 -0
  150. package/dist/execution/run-launcher.js +15 -0
  151. package/dist/execution/run-synthesis.d.ts +107 -0
  152. package/dist/execution/run-synthesis.js +329 -0
  153. package/dist/execution/staged-input.d.ts +41 -0
  154. package/dist/execution/staged-input.js +15 -0
  155. package/dist/execution/step-summary-metrics.d.ts +10 -0
  156. package/dist/execution/step-summary-metrics.js +22 -0
  157. package/dist/execution/step-summary.d.ts +55 -0
  158. package/dist/execution/step-summary.js +106 -0
  159. package/dist/execution/topo-sort.d.ts +33 -0
  160. package/dist/execution/topo-sort.js +99 -0
  161. package/dist/index.d.ts +112 -0
  162. package/dist/index.js +157 -0
  163. package/dist/input-sanitization.d.ts +22 -0
  164. package/dist/input-sanitization.js +64 -0
  165. package/dist/lib/async-utils.d.ts +10 -0
  166. package/dist/lib/async-utils.js +24 -0
  167. package/dist/lib/chrome.d.ts +15 -0
  168. package/dist/lib/chrome.js +95 -0
  169. package/dist/lib/db-result.d.ts +93 -0
  170. package/dist/lib/db-result.js +197 -0
  171. package/dist/lib/fs-helpers.d.ts +74 -0
  172. package/dist/lib/fs-helpers.js +119 -0
  173. package/dist/lib/fs-result.d.ts +98 -0
  174. package/dist/lib/fs-result.js +137 -0
  175. package/dist/lib/host-concurrency.d.ts +16 -0
  176. package/dist/lib/host-concurrency.js +60 -0
  177. package/dist/lib/identifiers.d.ts +8 -0
  178. package/dist/lib/identifiers.js +10 -0
  179. package/dist/lib/metrics.d.ts +7 -0
  180. package/dist/lib/metrics.js +12 -0
  181. package/dist/lib/mime-detect.d.ts +17 -0
  182. package/dist/lib/mime-detect.js +29 -0
  183. package/dist/lib/otel.d.ts +30 -0
  184. package/dist/lib/otel.js +102 -0
  185. package/dist/lib/regulatory-corpus/fetch-fda-guidance.d.ts +35 -0
  186. package/dist/lib/regulatory-corpus/fetch-fda-guidance.js +107 -0
  187. package/dist/lib/regulatory-corpus/fetch-ich.d.ts +46 -0
  188. package/dist/lib/regulatory-corpus/fetch-ich.js +173 -0
  189. package/dist/lib/regulatory-corpus.d.ts +88 -0
  190. package/dist/lib/regulatory-corpus.js +141 -0
  191. package/dist/lib/result.d.ts +87 -0
  192. package/dist/lib/result.js +103 -0
  193. package/dist/lib/storage.d.ts +29 -0
  194. package/dist/lib/storage.js +37 -0
  195. package/dist/lib/streamed-download.d.ts +28 -0
  196. package/dist/lib/streamed-download.js +111 -0
  197. package/dist/lib/trace-context.d.ts +11 -0
  198. package/dist/lib/trace-context.js +49 -0
  199. package/dist/loop/__fixtures__/scripted-provider.d.ts +31 -0
  200. package/dist/loop/__fixtures__/scripted-provider.js +57 -0
  201. package/dist/loop/budget-exceeded.d.ts +22 -0
  202. package/dist/loop/budget-exceeded.js +41 -0
  203. package/dist/loop/metrics.d.ts +25 -0
  204. package/dist/loop/metrics.js +46 -0
  205. package/dist/loop/run-agent.d.ts +28 -0
  206. package/dist/loop/run-agent.js +204 -0
  207. package/dist/loop/run-step.d.ts +29 -0
  208. package/dist/loop/run-step.js +34 -0
  209. package/dist/loop/run-to-terminal.d.ts +46 -0
  210. package/dist/loop/run-to-terminal.js +51 -0
  211. package/dist/loop/types.d.ts +95 -0
  212. package/dist/loop/types.js +10 -0
  213. package/dist/memory/ai-sdk-message-storage.d.ts +20 -0
  214. package/dist/memory/ai-sdk-message-storage.js +114 -0
  215. package/dist/memory/card-builders.d.ts +114 -0
  216. package/dist/memory/card-builders.js +231 -0
  217. package/dist/memory/content-to-cortex.d.ts +42 -0
  218. package/dist/memory/content-to-cortex.js +85 -0
  219. package/dist/memory/count-tokens.d.ts +18 -0
  220. package/dist/memory/count-tokens.js +64 -0
  221. package/dist/memory/derive-thread-title.d.ts +14 -0
  222. package/dist/memory/derive-thread-title.js +26 -0
  223. package/dist/memory/message-backfill.d.ts +2 -0
  224. package/dist/memory/message-backfill.js +38 -0
  225. package/dist/memory/reconstruct-cards.d.ts +23 -0
  226. package/dist/memory/reconstruct-cards.js +64 -0
  227. package/dist/memory/thread-history.d.ts +80 -0
  228. package/dist/memory/thread-history.js +187 -0
  229. package/dist/memory/thread-store.d.ts +66 -0
  230. package/dist/memory/thread-store.js +88 -0
  231. package/dist/memory/working-memory.d.ts +135 -0
  232. package/dist/memory/working-memory.js +185 -0
  233. package/dist/prompts/SOUL.d.ts +17 -0
  234. package/dist/prompts/SOUL.js +173 -0
  235. package/dist/prompts/analogical-reasoner.d.ts +1 -0
  236. package/dist/prompts/analogical-reasoner.js +170 -0
  237. package/dist/prompts/conversation.d.ts +1 -0
  238. package/dist/prompts/conversation.js +697 -0
  239. package/dist/prompts/execute-analysis/step-summary.d.ts +1 -0
  240. package/dist/prompts/execute-analysis/step-summary.js +38 -0
  241. package/dist/prompts/literature-reviewer.d.ts +1 -0
  242. package/dist/prompts/literature-reviewer.js +107 -0
  243. package/dist/prompts/planner.d.ts +2 -0
  244. package/dist/prompts/planner.js +259 -0
  245. package/dist/prompts/report-builder.d.ts +1 -0
  246. package/dist/prompts/report-builder.js +127 -0
  247. package/dist/prompts/sandbox/bulk-transcriptomics-agent.d.ts +1 -0
  248. package/dist/prompts/sandbox/bulk-transcriptomics-agent.js +78 -0
  249. package/dist/prompts/sandbox/cheminformatics-agent.d.ts +1 -0
  250. package/dist/prompts/sandbox/cheminformatics-agent.js +224 -0
  251. package/dist/prompts/sandbox/chromatin-agent.d.ts +1 -0
  252. package/dist/prompts/sandbox/chromatin-agent.js +100 -0
  253. package/dist/prompts/sandbox/data-profiler.d.ts +1 -0
  254. package/dist/prompts/sandbox/data-profiler.js +291 -0
  255. package/dist/prompts/sandbox/dna-methylation-agent.d.ts +1 -0
  256. package/dist/prompts/sandbox/dna-methylation-agent.js +96 -0
  257. package/dist/prompts/sandbox/drug-repurposing-agent.d.ts +1 -0
  258. package/dist/prompts/sandbox/drug-repurposing-agent.js +144 -0
  259. package/dist/prompts/sandbox/enrichment-agent.d.ts +1 -0
  260. package/dist/prompts/sandbox/enrichment-agent.js +89 -0
  261. package/dist/prompts/sandbox/ephemeral-executor.d.ts +1 -0
  262. package/dist/prompts/sandbox/ephemeral-executor.js +66 -0
  263. package/dist/prompts/sandbox/genomic-variant-agent.d.ts +1 -0
  264. package/dist/prompts/sandbox/genomic-variant-agent.js +83 -0
  265. package/dist/prompts/sandbox/immune-profiling-agent.d.ts +1 -0
  266. package/dist/prompts/sandbox/immune-profiling-agent.js +101 -0
  267. package/dist/prompts/sandbox/metabolomics-agent.d.ts +1 -0
  268. package/dist/prompts/sandbox/metabolomics-agent.js +89 -0
  269. package/dist/prompts/sandbox/microbiome-agent.d.ts +1 -0
  270. package/dist/prompts/sandbox/microbiome-agent.js +109 -0
  271. package/dist/prompts/sandbox/multi-omics-integration-agent.d.ts +1 -0
  272. package/dist/prompts/sandbox/multi-omics-integration-agent.js +122 -0
  273. package/dist/prompts/sandbox/multimodal-sc-agent.d.ts +1 -0
  274. package/dist/prompts/sandbox/multimodal-sc-agent.js +90 -0
  275. package/dist/prompts/sandbox/network-agent.d.ts +1 -0
  276. package/dist/prompts/sandbox/network-agent.js +95 -0
  277. package/dist/prompts/sandbox/pkpd-clinical-response-agent.d.ts +1 -0
  278. package/dist/prompts/sandbox/pkpd-clinical-response-agent.js +71 -0
  279. package/dist/prompts/sandbox/proteomics-agent.d.ts +1 -0
  280. package/dist/prompts/sandbox/proteomics-agent.js +93 -0
  281. package/dist/prompts/sandbox/scientific-executor.d.ts +1 -0
  282. package/dist/prompts/sandbox/scientific-executor.js +68 -0
  283. package/dist/prompts/sandbox/single-cell-agent.d.ts +1 -0
  284. package/dist/prompts/sandbox/single-cell-agent.js +129 -0
  285. package/dist/prompts/sandbox/spatial-omics-agent.d.ts +1 -0
  286. package/dist/prompts/sandbox/spatial-omics-agent.js +94 -0
  287. package/dist/prompts/sandbox/statistical-modeling-agent.d.ts +1 -0
  288. package/dist/prompts/sandbox/statistical-modeling-agent.js +112 -0
  289. package/dist/prompts/sandbox/translational-safety-agent.d.ts +1 -0
  290. package/dist/prompts/sandbox/translational-safety-agent.js +105 -0
  291. package/dist/prompts/sandbox-standards.d.ts +18 -0
  292. package/dist/prompts/sandbox-standards.js +358 -0
  293. package/dist/prompts/synthesis-agent.d.ts +1 -0
  294. package/dist/prompts/synthesis-agent.js +289 -0
  295. package/dist/prompts/target-assessment/briefs/executive-recommendation.d.ts +1 -0
  296. package/dist/prompts/target-assessment/briefs/executive-recommendation.js +85 -0
  297. package/dist/prompts/target-assessment/briefs/index.d.ts +4 -0
  298. package/dist/prompts/target-assessment/briefs/index.js +4 -0
  299. package/dist/prompts/target-assessment/briefs/liability-bullets.d.ts +1 -0
  300. package/dist/prompts/target-assessment/briefs/liability-bullets.js +114 -0
  301. package/dist/prompts/target-assessment/briefs/target-organ-liabilities.d.ts +1 -0
  302. package/dist/prompts/target-assessment/briefs/target-organ-liabilities.js +29 -0
  303. package/dist/prompts/target-assessment/briefs/translational-commentary.d.ts +1 -0
  304. package/dist/prompts/target-assessment/briefs/translational-commentary.js +23 -0
  305. package/dist/prompts/target-assessment/drugs-in-class.d.ts +1 -0
  306. package/dist/prompts/target-assessment/drugs-in-class.js +29 -0
  307. package/dist/prompts/target-assessment/modulator-triage.d.ts +1 -0
  308. package/dist/prompts/target-assessment/modulator-triage.js +31 -0
  309. package/dist/prompts/target-assessment/off-target-annotator.d.ts +1 -0
  310. package/dist/prompts/target-assessment/off-target-annotator.js +28 -0
  311. package/dist/prompts/target-assessment/tox-voice/core.d.ts +1 -0
  312. package/dist/prompts/target-assessment/tox-voice/core.js +74 -0
  313. package/dist/prompts/target-assessment/tox-voice/critique.d.ts +7 -0
  314. package/dist/prompts/target-assessment/tox-voice/critique.js +109 -0
  315. package/dist/prompts/target-assessment/tox-voice/exemplars.d.ts +8 -0
  316. package/dist/prompts/target-assessment/tox-voice/exemplars.js +24 -0
  317. package/dist/prompts/target-assessment/tox-voice/index.d.ts +4 -0
  318. package/dist/prompts/target-assessment/tox-voice/index.js +4 -0
  319. package/dist/prompts/target-assessment/tox-voice/vocabulary.d.ts +15 -0
  320. package/dist/prompts/target-assessment/tox-voice/vocabulary.js +72 -0
  321. package/dist/provenance/collector.d.ts +148 -0
  322. package/dist/provenance/collector.js +296 -0
  323. package/dist/provenance/exec-frame.d.ts +36 -0
  324. package/dist/provenance/exec-frame.js +49 -0
  325. package/dist/provenance/types.d.ts +95 -0
  326. package/dist/provenance/types.js +64 -0
  327. package/dist/providers/__fixtures__/session.d.ts +16 -0
  328. package/dist/providers/__fixtures__/session.js +20 -0
  329. package/dist/providers/ai-sdk.d.ts +47 -0
  330. package/dist/providers/ai-sdk.js +142 -0
  331. package/dist/providers/anthropic.d.ts +22 -0
  332. package/dist/providers/anthropic.js +26 -0
  333. package/dist/providers/embedding.d.ts +32 -0
  334. package/dist/providers/embedding.js +42 -0
  335. package/dist/providers/errors.d.ts +80 -0
  336. package/dist/providers/errors.js +137 -0
  337. package/dist/providers/llm-capabilities.d.ts +33 -0
  338. package/dist/providers/llm-capabilities.js +58 -0
  339. package/dist/providers/streaming-chat.d.ts +23 -0
  340. package/dist/providers/streaming-chat.js +61 -0
  341. package/dist/providers/types.d.ts +59 -0
  342. package/dist/providers/types.js +8 -0
  343. package/dist/runtime/assemble.d.ts +68 -0
  344. package/dist/runtime/assemble.js +46 -0
  345. package/dist/runtime/boot.d.ts +73 -0
  346. package/dist/runtime/boot.js +65 -0
  347. package/dist/runtime/connection-budget.d.ts +48 -0
  348. package/dist/runtime/connection-budget.js +57 -0
  349. package/dist/runtime/dbos.d.ts +94 -0
  350. package/dist/runtime/dbos.js +160 -0
  351. package/dist/runtime/lifecycle.d.ts +12 -0
  352. package/dist/runtime/lifecycle.js +19 -0
  353. package/dist/runtime/pools.d.ts +25 -0
  354. package/dist/runtime/pools.js +30 -0
  355. package/dist/runtime/shutdown.d.ts +33 -0
  356. package/dist/runtime/shutdown.js +39 -0
  357. package/dist/sandbox/await-exec.d.ts +143 -0
  358. package/dist/sandbox/await-exec.js +406 -0
  359. package/dist/sandbox/client.d.ts +82 -0
  360. package/dist/sandbox/client.js +23 -0
  361. package/dist/sandbox/create-sandbox.d.ts +105 -0
  362. package/dist/sandbox/create-sandbox.js +132 -0
  363. package/dist/sandbox/deliver-exec-event.d.ts +25 -0
  364. package/dist/sandbox/deliver-exec-event.js +29 -0
  365. package/dist/sandbox/docker-client.d.ts +75 -0
  366. package/dist/sandbox/docker-client.js +315 -0
  367. package/dist/sandbox/estimate-data-profile-resources.d.ts +5 -0
  368. package/dist/sandbox/estimate-data-profile-resources.js +73 -0
  369. package/dist/sandbox/exec-id.d.ts +12 -0
  370. package/dist/sandbox/exec-id.js +20 -0
  371. package/dist/sandbox/execution-id.d.ts +30 -0
  372. package/dist/sandbox/execution-id.js +47 -0
  373. package/dist/sandbox/hmac.d.ts +54 -0
  374. package/dist/sandbox/hmac.js +67 -0
  375. package/dist/sandbox/identity.d.ts +15 -0
  376. package/dist/sandbox/identity.js +22 -0
  377. package/dist/sandbox/ignored-dirs.d.ts +7 -0
  378. package/dist/sandbox/ignored-dirs.js +7 -0
  379. package/dist/sandbox/k8s-client.d.ts +71 -0
  380. package/dist/sandbox/k8s-client.js +488 -0
  381. package/dist/sandbox/liveness.d.ts +60 -0
  382. package/dist/sandbox/liveness.js +82 -0
  383. package/dist/sandbox/mount-plan.d.ts +77 -0
  384. package/dist/sandbox/mount-plan.js +84 -0
  385. package/dist/sandbox/notification-sweep.d.ts +42 -0
  386. package/dist/sandbox/notification-sweep.js +74 -0
  387. package/dist/sandbox/reaper.d.ts +70 -0
  388. package/dist/sandbox/reaper.js +124 -0
  389. package/dist/sandbox/sandbox-error.d.ts +105 -0
  390. package/dist/sandbox/sandbox-error.js +92 -0
  391. package/dist/sandbox/sandbox-step-translate.d.ts +35 -0
  392. package/dist/sandbox/sandbox-step-translate.js +76 -0
  393. package/dist/sandbox/submit-exec.d.ts +33 -0
  394. package/dist/sandbox/submit-exec.js +68 -0
  395. package/dist/sandbox/types.d.ts +277 -0
  396. package/dist/sandbox/types.js +147 -0
  397. package/dist/sandbox/watchdog.d.ts +71 -0
  398. package/dist/sandbox/watchdog.js +150 -0
  399. package/dist/schemas/artifact-manifest.d.ts +34 -0
  400. package/dist/schemas/artifact-manifest.js +36 -0
  401. package/dist/schemas/data-profile-schemas.d.ts +92 -0
  402. package/dist/schemas/data-profile-schemas.js +89 -0
  403. package/dist/schemas/file-metadata.d.ts +51 -0
  404. package/dist/schemas/file-metadata.js +39 -0
  405. package/dist/schemas/plan-schemas.d.ts +110 -0
  406. package/dist/schemas/plan-schemas.js +50 -0
  407. package/dist/schemas/render-step-prompt.d.ts +32 -0
  408. package/dist/schemas/render-step-prompt.js +76 -0
  409. package/dist/schemas/run-synthesis.d.ts +148 -0
  410. package/dist/schemas/run-synthesis.js +87 -0
  411. package/dist/schemas/step-summary.d.ts +18 -0
  412. package/dist/schemas/step-summary.js +20 -0
  413. package/dist/schemas/validate-plan.d.ts +39 -0
  414. package/dist/schemas/validate-plan.js +120 -0
  415. package/dist/schemas/workflow-state.d.ts +314 -0
  416. package/dist/schemas/workflow-state.js +139 -0
  417. package/dist/state/active-sandboxes.d.ts +58 -0
  418. package/dist/state/active-sandboxes.js +100 -0
  419. package/dist/state/analyses-metrics.d.ts +21 -0
  420. package/dist/state/analyses-metrics.js +59 -0
  421. package/dist/state/analyses.d.ts +58 -0
  422. package/dist/state/analyses.js +132 -0
  423. package/dist/state/artifacts.d.ts +53 -0
  424. package/dist/state/artifacts.js +175 -0
  425. package/dist/state/data-profile.d.ts +176 -0
  426. package/dist/state/data-profile.js +284 -0
  427. package/dist/state/db.d.ts +10 -0
  428. package/dist/state/db.js +9 -0
  429. package/dist/state/index.d.ts +29 -0
  430. package/dist/state/index.js +20 -0
  431. package/dist/state/init.d.ts +14 -0
  432. package/dist/state/init.js +406 -0
  433. package/dist/state/plans.d.ts +56 -0
  434. package/dist/state/plans.js +117 -0
  435. package/dist/state/runs.d.ts +69 -0
  436. package/dist/state/runs.js +206 -0
  437. package/dist/state/schema.d.ts +150 -0
  438. package/dist/state/schema.js +100 -0
  439. package/dist/state/step-executions.d.ts +77 -0
  440. package/dist/state/step-executions.js +175 -0
  441. package/dist/state/target-assessments.d.ts +68 -0
  442. package/dist/state/target-assessments.js +222 -0
  443. package/dist/state/vector-store.d.ts +53 -0
  444. package/dist/state/vector-store.js +89 -0
  445. package/dist/tasks/data-profile.d.ts +171 -0
  446. package/dist/tasks/data-profile.js +461 -0
  447. package/dist/tasks/refresh-regulatory-corpus.d.ts +59 -0
  448. package/dist/tasks/refresh-regulatory-corpus.js +146 -0
  449. package/dist/tasks/regulatory-corpus-boot-refresh.d.ts +55 -0
  450. package/dist/tasks/regulatory-corpus-boot-refresh.js +149 -0
  451. package/dist/tools/__fixtures__/tool-context.d.ts +13 -0
  452. package/dist/tools/__fixtures__/tool-context.js +18 -0
  453. package/dist/tools/bio/check-safety-panel.d.ts +35 -0
  454. package/dist/tools/bio/check-safety-panel.js +76 -0
  455. package/dist/tools/bio/find-approval-precedent.d.ts +32 -0
  456. package/dist/tools/bio/find-approval-precedent.js +72 -0
  457. package/dist/tools/bio/get-article-details.d.ts +11 -0
  458. package/dist/tools/bio/get-article-details.js +20 -0
  459. package/dist/tools/bio/get-article-full-text.d.ts +19 -0
  460. package/dist/tools/bio/get-article-full-text.js +32 -0
  461. package/dist/tools/bio/get-bioactivity.d.ts +11 -0
  462. package/dist/tools/bio/get-bioactivity.js +23 -0
  463. package/dist/tools/bio/get-drug-info.d.ts +9 -0
  464. package/dist/tools/bio/get-drug-info.js +22 -0
  465. package/dist/tools/bio/get-impc-ko-profile.d.ts +9 -0
  466. package/dist/tools/bio/get-impc-ko-profile.js +20 -0
  467. package/dist/tools/bio/get-mechanism.d.ts +8 -0
  468. package/dist/tools/bio/get-mechanism.js +18 -0
  469. package/dist/tools/bio/get-pubchem-assays.d.ts +22 -0
  470. package/dist/tools/bio/get-pubchem-assays.js +107 -0
  471. package/dist/tools/bio/get-pubchem-cross-refs.d.ts +15 -0
  472. package/dist/tools/bio/get-pubchem-cross-refs.js +68 -0
  473. package/dist/tools/bio/get-target-safety.d.ts +18 -0
  474. package/dist/tools/bio/get-target-safety.js +26 -0
  475. package/dist/tools/bio/index.d.ts +41 -0
  476. package/dist/tools/bio/index.js +48 -0
  477. package/dist/tools/bio/keys.d.ts +31 -0
  478. package/dist/tools/bio/keys.js +30 -0
  479. package/dist/tools/bio/lookup-go-term.d.ts +31 -0
  480. package/dist/tools/bio/lookup-go-term.js +116 -0
  481. package/dist/tools/bio/search-bgee-expression.d.ts +10 -0
  482. package/dist/tools/bio/search-bgee-expression.js +24 -0
  483. package/dist/tools/bio/search-clinical-trials.d.ts +12 -0
  484. package/dist/tools/bio/search-clinical-trials.js +21 -0
  485. package/dist/tools/bio/search-clinvar.d.ts +13 -0
  486. package/dist/tools/bio/search-clinvar.js +28 -0
  487. package/dist/tools/bio/search-compounds.d.ts +22 -0
  488. package/dist/tools/bio/search-compounds.js +160 -0
  489. package/dist/tools/bio/search-ctx-chemical.d.ts +50 -0
  490. package/dist/tools/bio/search-ctx-chemical.js +130 -0
  491. package/dist/tools/bio/search-ctx-exposure.d.ts +55 -0
  492. package/dist/tools/bio/search-ctx-exposure.js +176 -0
  493. package/dist/tools/bio/search-ctx-hazard.d.ts +111 -0
  494. package/dist/tools/bio/search-ctx-hazard.js +178 -0
  495. package/dist/tools/bio/search-dgidb.d.ts +43 -0
  496. package/dist/tools/bio/search-dgidb.js +199 -0
  497. package/dist/tools/bio/search-disgenet.d.ts +30 -0
  498. package/dist/tools/bio/search-disgenet.js +84 -0
  499. package/dist/tools/bio/search-drugbank.d.ts +38 -0
  500. package/dist/tools/bio/search-drugbank.js +109 -0
  501. package/dist/tools/bio/search-faers.d.ts +11 -0
  502. package/dist/tools/bio/search-faers.js +23 -0
  503. package/dist/tools/bio/search-gene.d.ts +11 -0
  504. package/dist/tools/bio/search-gene.js +19 -0
  505. package/dist/tools/bio/search-geo-datasets.d.ts +20 -0
  506. package/dist/tools/bio/search-geo-datasets.js +86 -0
  507. package/dist/tools/bio/search-gwas-catalog.d.ts +33 -0
  508. package/dist/tools/bio/search-gwas-catalog.js +172 -0
  509. package/dist/tools/bio/search-interactions.d.ts +17 -0
  510. package/dist/tools/bio/search-interactions.js +31 -0
  511. package/dist/tools/bio/search-opentargets.d.ts +11 -0
  512. package/dist/tools/bio/search-opentargets.js +25 -0
  513. package/dist/tools/bio/search-pathway.d.ts +12 -0
  514. package/dist/tools/bio/search-pathway.js +32 -0
  515. package/dist/tools/bio/search-pharmgkb.d.ts +17 -0
  516. package/dist/tools/bio/search-pharmgkb.js +46 -0
  517. package/dist/tools/bio/search-pubchem-compound.d.ts +26 -0
  518. package/dist/tools/bio/search-pubchem-compound.js +110 -0
  519. package/dist/tools/bio/search-pubmed.d.ts +17 -0
  520. package/dist/tools/bio/search-pubmed.js +31 -0
  521. package/dist/tools/bio/search-targets.d.ts +9 -0
  522. package/dist/tools/bio/search-targets.js +20 -0
  523. package/dist/tools/bio/search-toxcast.d.ts +36 -0
  524. package/dist/tools/bio/search-toxcast.js +141 -0
  525. package/dist/tools/define-tool.d.ts +80 -0
  526. package/dist/tools/define-tool.js +48 -0
  527. package/dist/tools/display/index.d.ts +4 -0
  528. package/dist/tools/display/index.js +4 -0
  529. package/dist/tools/display/show-user.d.ts +33 -0
  530. package/dist/tools/display/show-user.js +67 -0
  531. package/dist/tools/execute-plan.d.ts +64 -0
  532. package/dist/tools/execute-plan.js +208 -0
  533. package/dist/tools/iterate-report.d.ts +172 -0
  534. package/dist/tools/iterate-report.js +521 -0
  535. package/dist/tools/lib/api-utils.d.ts +80 -0
  536. package/dist/tools/lib/api-utils.js +128 -0
  537. package/dist/tools/lib/bgee-client.d.ts +36 -0
  538. package/dist/tools/lib/bgee-client.js +150 -0
  539. package/dist/tools/lib/cbioportal-client.d.ts +34 -0
  540. package/dist/tools/lib/cbioportal-client.js +159 -0
  541. package/dist/tools/lib/chembl-client.d.ts +123 -0
  542. package/dist/tools/lib/chembl-client.js +458 -0
  543. package/dist/tools/lib/chembl-config.d.ts +5 -0
  544. package/dist/tools/lib/chembl-config.js +3 -0
  545. package/dist/tools/lib/clinical-benchmarks-client.d.ts +33 -0
  546. package/dist/tools/lib/clinical-benchmarks-client.js +54 -0
  547. package/dist/tools/lib/clinical-trials-client.d.ts +216 -0
  548. package/dist/tools/lib/clinical-trials-client.js +339 -0
  549. package/dist/tools/lib/clinicaltrials-config.d.ts +4 -0
  550. package/dist/tools/lib/clinicaltrials-config.js +2 -0
  551. package/dist/tools/lib/clinvar-client.d.ts +25 -0
  552. package/dist/tools/lib/clinvar-client.js +126 -0
  553. package/dist/tools/lib/disgenet-config.d.ts +2 -0
  554. package/dist/tools/lib/disgenet-config.js +11 -0
  555. package/dist/tools/lib/drugbank-config.d.ts +2 -0
  556. package/dist/tools/lib/drugbank-config.js +12 -0
  557. package/dist/tools/lib/ema-client.d.ts +45 -0
  558. package/dist/tools/lib/ema-client.js +127 -0
  559. package/dist/tools/lib/ema-config.d.ts +7 -0
  560. package/dist/tools/lib/ema-config.js +7 -0
  561. package/dist/tools/lib/ensembl-client.d.ts +27 -0
  562. package/dist/tools/lib/ensembl-client.js +82 -0
  563. package/dist/tools/lib/gwas-catalog-config.d.ts +4 -0
  564. package/dist/tools/lib/gwas-catalog-config.js +2 -0
  565. package/dist/tools/lib/identifier-resolver.d.ts +85 -0
  566. package/dist/tools/lib/identifier-resolver.js +333 -0
  567. package/dist/tools/lib/impc-client.d.ts +44 -0
  568. package/dist/tools/lib/impc-client.js +239 -0
  569. package/dist/tools/lib/iuphar-client.d.ts +75 -0
  570. package/dist/tools/lib/iuphar-client.js +230 -0
  571. package/dist/tools/lib/iuphar-config.d.ts +5 -0
  572. package/dist/tools/lib/iuphar-config.js +3 -0
  573. package/dist/tools/lib/ncbi-utils.d.ts +58 -0
  574. package/dist/tools/lib/ncbi-utils.js +286 -0
  575. package/dist/tools/lib/openfda-client.d.ts +53 -0
  576. package/dist/tools/lib/openfda-client.js +192 -0
  577. package/dist/tools/lib/openfda-config.d.ts +2 -0
  578. package/dist/tools/lib/openfda-config.js +2 -0
  579. package/dist/tools/lib/opentargets-client.d.ts +64 -0
  580. package/dist/tools/lib/opentargets-client.js +290 -0
  581. package/dist/tools/lib/opentargets-config.d.ts +5 -0
  582. package/dist/tools/lib/opentargets-config.js +5 -0
  583. package/dist/tools/lib/path-validation.d.ts +14 -0
  584. package/dist/tools/lib/path-validation.js +26 -0
  585. package/dist/tools/lib/pathway-client.d.ts +27 -0
  586. package/dist/tools/lib/pathway-client.js +149 -0
  587. package/dist/tools/lib/pharmgkb-config.d.ts +4 -0
  588. package/dist/tools/lib/pharmgkb-config.js +2 -0
  589. package/dist/tools/lib/preview-lock.d.ts +20 -0
  590. package/dist/tools/lib/preview-lock.js +35 -0
  591. package/dist/tools/lib/protein-family-modality.d.ts +16 -0
  592. package/dist/tools/lib/protein-family-modality.js +42 -0
  593. package/dist/tools/lib/protein-family-normalize.d.ts +12 -0
  594. package/dist/tools/lib/protein-family-normalize.js +46 -0
  595. package/dist/tools/lib/pubchem-client.d.ts +40 -0
  596. package/dist/tools/lib/pubchem-client.js +128 -0
  597. package/dist/tools/lib/pubchem-config.d.ts +5 -0
  598. package/dist/tools/lib/pubchem-config.js +3 -0
  599. package/dist/tools/lib/pubmed-client.d.ts +28 -0
  600. package/dist/tools/lib/pubmed-client.js +91 -0
  601. package/dist/tools/lib/report-preflight.d.ts +39 -0
  602. package/dist/tools/lib/report-preflight.js +283 -0
  603. package/dist/tools/lib/string-client.d.ts +33 -0
  604. package/dist/tools/lib/string-client.js +93 -0
  605. package/dist/tools/lib/toxcast-config.d.ts +2 -0
  606. package/dist/tools/lib/toxcast-config.js +11 -0
  607. package/dist/tools/lib/uniprot-client.d.ts +28 -0
  608. package/dist/tools/lib/uniprot-client.js +103 -0
  609. package/dist/tools/lib/uniprot-config.d.ts +5 -0
  610. package/dist/tools/lib/uniprot-config.js +3 -0
  611. package/dist/tools/memory/index.d.ts +4 -0
  612. package/dist/tools/memory/index.js +4 -0
  613. package/dist/tools/memory/update-working-memory.d.ts +25 -0
  614. package/dist/tools/memory/update-working-memory.js +112 -0
  615. package/dist/tools/registry.d.ts +15 -0
  616. package/dist/tools/registry.js +26 -0
  617. package/dist/tools/report/build-report.d.ts +13 -0
  618. package/dist/tools/report/build-report.js +26 -0
  619. package/dist/tools/report/index.d.ts +14 -0
  620. package/dist/tools/report/index.js +14 -0
  621. package/dist/tools/report/mint-preview-url.d.ts +26 -0
  622. package/dist/tools/report/mint-preview-url.js +44 -0
  623. package/dist/tools/report/preview-publisher.d.ts +37 -0
  624. package/dist/tools/report/preview-publisher.js +25 -0
  625. package/dist/tools/report/preview-snapshot.d.ts +26 -0
  626. package/dist/tools/report/preview-snapshot.js +121 -0
  627. package/dist/tools/report/submit-report.d.ts +25 -0
  628. package/dist/tools/report/submit-report.js +126 -0
  629. package/dist/tools/report/version-fs.d.ts +15 -0
  630. package/dist/tools/report/version-fs.js +154 -0
  631. package/dist/tools/research/context7-docs.d.ts +31 -0
  632. package/dist/tools/research/context7-docs.js +61 -0
  633. package/dist/tools/research/generate-analogy-report.d.ts +60 -0
  634. package/dist/tools/research/generate-analogy-report.js +288 -0
  635. package/dist/tools/research/generate-plan.d.ts +39 -0
  636. package/dist/tools/research/generate-plan.js +393 -0
  637. package/dist/tools/research/index.d.ts +15 -0
  638. package/dist/tools/research/index.js +15 -0
  639. package/dist/tools/research/inspect-run.d.ts +54 -0
  640. package/dist/tools/research/inspect-run.js +85 -0
  641. package/dist/tools/research/literature-reviewer.d.ts +29 -0
  642. package/dist/tools/research/literature-reviewer.js +84 -0
  643. package/dist/tools/research/search-arxiv.d.ts +32 -0
  644. package/dist/tools/research/search-arxiv.js +123 -0
  645. package/dist/tools/research/search-github-repos.d.ts +32 -0
  646. package/dist/tools/research/search-github-repos.js +86 -0
  647. package/dist/tools/research/search-semantic-scholar.d.ts +33 -0
  648. package/dist/tools/research/search-semantic-scholar.js +93 -0
  649. package/dist/tools/run-ephemeral.d.ts +33 -0
  650. package/dist/tools/run-ephemeral.js +65 -0
  651. package/dist/tools/sandbox/index.d.ts +7 -0
  652. package/dist/tools/sandbox/index.js +7 -0
  653. package/dist/tools/sandbox/list-available-packages.d.ts +7 -0
  654. package/dist/tools/sandbox/list-available-packages.js +27 -0
  655. package/dist/tools/sandbox/list-available-refs.d.ts +7 -0
  656. package/dist/tools/sandbox/list-available-refs.js +147 -0
  657. package/dist/tools/sandbox/report-blocker.d.ts +23 -0
  658. package/dist/tools/sandbox/report-blocker.js +39 -0
  659. package/dist/tools/sandbox/skills.d.ts +72 -0
  660. package/dist/tools/sandbox/skills.js +144 -0
  661. package/dist/tools/workspace/edit-file.d.ts +46 -0
  662. package/dist/tools/workspace/edit-file.js +100 -0
  663. package/dist/tools/workspace/execute-command.d.ts +80 -0
  664. package/dist/tools/workspace/execute-command.js +95 -0
  665. package/dist/tools/workspace/file-stat.d.ts +24 -0
  666. package/dist/tools/workspace/file-stat.js +37 -0
  667. package/dist/tools/workspace/grep.d.ts +57 -0
  668. package/dist/tools/workspace/grep.js +154 -0
  669. package/dist/tools/workspace/index.d.ts +26 -0
  670. package/dist/tools/workspace/index.js +27 -0
  671. package/dist/tools/workspace/list-files.d.ts +24 -0
  672. package/dist/tools/workspace/list-files.js +38 -0
  673. package/dist/tools/workspace/mutator.d.ts +83 -0
  674. package/dist/tools/workspace/mutator.js +81 -0
  675. package/dist/tools/workspace/read-file.d.ts +39 -0
  676. package/dist/tools/workspace/read-file.js +93 -0
  677. package/dist/tools/workspace/result-bounds.d.ts +42 -0
  678. package/dist/tools/workspace/result-bounds.js +50 -0
  679. package/dist/tools/workspace/run-exec.d.ts +32 -0
  680. package/dist/tools/workspace/run-exec.js +34 -0
  681. package/dist/tools/workspace/show-file.d.ts +37 -0
  682. package/dist/tools/workspace/show-file.js +54 -0
  683. package/dist/tools/workspace/show-plan.d.ts +23 -0
  684. package/dist/tools/workspace/show-plan.js +44 -0
  685. package/dist/tools/workspace/workspace-search.d.ts +25 -0
  686. package/dist/tools/workspace/workspace-search.js +78 -0
  687. package/dist/tools/workspace/write-file.d.ts +16 -0
  688. package/dist/tools/workspace/write-file.js +33 -0
  689. package/dist/workflows/execute-analysis-scheduler.d.ts +94 -0
  690. package/dist/workflows/execute-analysis-scheduler.js +186 -0
  691. package/dist/workflows/execute-analysis.d.ts +271 -0
  692. package/dist/workflows/execute-analysis.js +746 -0
  693. package/dist/workflows/execute-target-assessment.d.ts +101 -0
  694. package/dist/workflows/execute-target-assessment.js +528 -0
  695. package/dist/workflows/metrics.d.ts +37 -0
  696. package/dist/workflows/metrics.js +55 -0
  697. package/dist/workflows/plan/level.d.ts +12 -0
  698. package/dist/workflows/plan/level.js +12 -0
  699. package/dist/workflows/register-workflows.d.ts +51 -0
  700. package/dist/workflows/register-workflows.js +48 -0
  701. package/dist/workflows/resume-execute-analysis.d.ts +70 -0
  702. package/dist/workflows/resume-execute-analysis.js +80 -0
  703. package/dist/workflows/sandbox-step.d.ts +243 -0
  704. package/dist/workflows/sandbox-step.js +573 -0
  705. package/dist/workflows/target-assessment/assemblers/index.d.ts +5 -0
  706. package/dist/workflows/target-assessment/assemblers/index.js +4 -0
  707. package/dist/workflows/target-assessment/assemblers/literature.d.ts +299 -0
  708. package/dist/workflows/target-assessment/assemblers/literature.js +987 -0
  709. package/dist/workflows/target-assessment/assemblers/orchestrator.d.ts +109 -0
  710. package/dist/workflows/target-assessment/assemblers/orchestrator.js +835 -0
  711. package/dist/workflows/target-assessment/assemblers/safety.d.ts +352 -0
  712. package/dist/workflows/target-assessment/assemblers/safety.js +985 -0
  713. package/dist/workflows/target-assessment/assemblers/trials.d.ts +30 -0
  714. package/dist/workflows/target-assessment/assemblers/trials.js +75 -0
  715. package/dist/workflows/target-assessment/collectors/index.d.ts +105 -0
  716. package/dist/workflows/target-assessment/collectors/index.js +468 -0
  717. package/dist/workflows/target-assessment/correction-loop.d.ts +45 -0
  718. package/dist/workflows/target-assessment/correction-loop.js +62 -0
  719. package/dist/workflows/target-assessment/coverage.d.ts +81 -0
  720. package/dist/workflows/target-assessment/coverage.js +82 -0
  721. package/dist/workflows/target-assessment/decisions/index.d.ts +86 -0
  722. package/dist/workflows/target-assessment/decisions/index.js +127 -0
  723. package/dist/workflows/target-assessment/fanout/index.d.ts +31 -0
  724. package/dist/workflows/target-assessment/fanout/index.js +155 -0
  725. package/dist/workflows/target-assessment/lib/approval-precedents.d.ts +52 -0
  726. package/dist/workflows/target-assessment/lib/approval-precedents.js +119 -0
  727. package/dist/workflows/target-assessment/lib/citation-validator.d.ts +46 -0
  728. package/dist/workflows/target-assessment/lib/citation-validator.js +316 -0
  729. package/dist/workflows/target-assessment/lib/clinical-consequence-annotator.d.ts +62 -0
  730. package/dist/workflows/target-assessment/lib/clinical-consequence-annotator.js +172 -0
  731. package/dist/workflows/target-assessment/lib/clinical-evidence-attribution.d.ts +45 -0
  732. package/dist/workflows/target-assessment/lib/clinical-evidence-attribution.js +156 -0
  733. package/dist/workflows/target-assessment/lib/compute-derived.d.ts +19 -0
  734. package/dist/workflows/target-assessment/lib/compute-derived.js +252 -0
  735. package/dist/workflows/target-assessment/lib/compute-selectivity.d.ts +15 -0
  736. package/dist/workflows/target-assessment/lib/compute-selectivity.js +18 -0
  737. package/dist/workflows/target-assessment/lib/dedup-modulators.d.ts +37 -0
  738. package/dist/workflows/target-assessment/lib/dedup-modulators.js +157 -0
  739. package/dist/workflows/target-assessment/lib/evidence-conflict-detector.d.ts +17 -0
  740. package/dist/workflows/target-assessment/lib/evidence-conflict-detector.js +100 -0
  741. package/dist/workflows/target-assessment/lib/expression-constants.d.ts +21 -0
  742. package/dist/workflows/target-assessment/lib/expression-constants.js +21 -0
  743. package/dist/workflows/target-assessment/lib/family-complex-supplement.d.ts +21 -0
  744. package/dist/workflows/target-assessment/lib/family-complex-supplement.js +37 -0
  745. package/dist/workflows/target-assessment/lib/heterodimer-filter.d.ts +39 -0
  746. package/dist/workflows/target-assessment/lib/heterodimer-filter.js +54 -0
  747. package/dist/workflows/target-assessment/lib/intended-polypharm-filter.d.ts +4 -0
  748. package/dist/workflows/target-assessment/lib/intended-polypharm-filter.js +24 -0
  749. package/dist/workflows/target-assessment/lib/llm-step.d.ts +77 -0
  750. package/dist/workflows/target-assessment/lib/llm-step.js +99 -0
  751. package/dist/workflows/target-assessment/lib/meddra-organ-map.d.ts +30 -0
  752. package/dist/workflows/target-assessment/lib/meddra-organ-map.js +126 -0
  753. package/dist/workflows/target-assessment/lib/recommendation-quality-gates.d.ts +17 -0
  754. package/dist/workflows/target-assessment/lib/recommendation-quality-gates.js +99 -0
  755. package/dist/workflows/target-assessment/lib/recommendation-sanitizer.d.ts +2 -0
  756. package/dist/workflows/target-assessment/lib/recommendation-sanitizer.js +51 -0
  757. package/dist/workflows/target-assessment/lib/regulatory-actions.d.ts +26 -0
  758. package/dist/workflows/target-assessment/lib/regulatory-actions.js +147 -0
  759. package/dist/workflows/target-assessment/lib/structured-llm.d.ts +58 -0
  760. package/dist/workflows/target-assessment/lib/structured-llm.js +101 -0
  761. package/dist/workflows/target-assessment/lib/target-identity-filter.d.ts +60 -0
  762. package/dist/workflows/target-assessment/lib/target-identity-filter.js +86 -0
  763. package/dist/workflows/target-assessment/lib/therapeutic-programs.d.ts +20 -0
  764. package/dist/workflows/target-assessment/lib/therapeutic-programs.js +68 -0
  765. package/dist/workflows/target-assessment/metrics.d.ts +21 -0
  766. package/dist/workflows/target-assessment/metrics.js +42 -0
  767. package/dist/workflows/target-assessment/phase4-assemble.d.ts +1841 -0
  768. package/dist/workflows/target-assessment/phase4-assemble.js +39 -0
  769. package/dist/workflows/target-assessment/phase5-persist.d.ts +57 -0
  770. package/dist/workflows/target-assessment/phase5-persist.js +461 -0
  771. package/dist/workflows/target-assessment/progress.d.ts +38 -0
  772. package/dist/workflows/target-assessment/progress.js +76 -0
  773. package/dist/workflows/target-assessment/schemas.d.ts +931 -0
  774. package/dist/workflows/target-assessment/schemas.js +293 -0
  775. package/dist/workflows/target-assessment/steps/collectors/pathways.d.ts +15 -0
  776. package/dist/workflows/target-assessment/steps/collectors/pathways.js +58 -0
  777. package/dist/workflows/target-assessment/steps/fanout/aes-for-one-class-drug-step.d.ts +34 -0
  778. package/dist/workflows/target-assessment/steps/fanout/aes-for-one-class-drug-step.js +31 -0
  779. package/dist/workflows/target-assessment/steps/fanout/aes-for-one-trial-step.d.ts +57 -0
  780. package/dist/workflows/target-assessment/steps/fanout/aes-for-one-trial-step.js +54 -0
  781. package/dist/workflows/target-assessment/steps/fanout/faers-for-one-modulator-step.d.ts +35 -0
  782. package/dist/workflows/target-assessment/steps/fanout/faers-for-one-modulator-step.js +32 -0
  783. package/dist/workflows/target-assessment/steps/fanout/index.d.ts +14 -0
  784. package/dist/workflows/target-assessment/steps/fanout/index.js +10 -0
  785. package/dist/workflows/target-assessment/steps/fanout/polypharm-for-one-modulator-step.d.ts +28 -0
  786. package/dist/workflows/target-assessment/steps/fanout/polypharm-for-one-modulator-step.js +27 -0
  787. package/dist/workflows/target-assessment/steps/phase0-resolve.d.ts +71 -0
  788. package/dist/workflows/target-assessment/steps/phase0-resolve.js +21 -0
  789. package/dist/workflows/target-assessment/steps/phase1-aggregate.d.ts +1018 -0
  790. package/dist/workflows/target-assessment/steps/phase1-aggregate.js +25 -0
  791. package/dist/workflows/target-assessment/steps/phase2-aggregate.d.ts +696 -0
  792. package/dist/workflows/target-assessment/steps/phase2-aggregate.js +38 -0
  793. package/dist/workflows/target-assessment/steps/phase3-aggregate.d.ts +936 -0
  794. package/dist/workflows/target-assessment/steps/phase3-aggregate.js +22 -0
  795. package/dist/workflows/target-assessment/steps/synthesis/diagnostics.d.ts +34 -0
  796. package/dist/workflows/target-assessment/steps/synthesis/diagnostics.js +45 -0
  797. package/dist/workflows/target-assessment/sub-workflows/index.d.ts +15 -0
  798. package/dist/workflows/target-assessment/sub-workflows/index.js +11 -0
  799. package/dist/workflows/target-assessment/sub-workflows/per-class-drug-aes.d.ts +41 -0
  800. package/dist/workflows/target-assessment/sub-workflows/per-class-drug-aes.js +12 -0
  801. package/dist/workflows/target-assessment/sub-workflows/per-modulator-faers.d.ts +41 -0
  802. package/dist/workflows/target-assessment/sub-workflows/per-modulator-faers.js +12 -0
  803. package/dist/workflows/target-assessment/sub-workflows/per-modulator-polypharm.d.ts +36 -0
  804. package/dist/workflows/target-assessment/sub-workflows/per-modulator-polypharm.js +12 -0
  805. package/dist/workflows/target-assessment/sub-workflows/per-trial-aes.d.ts +66 -0
  806. package/dist/workflows/target-assessment/sub-workflows/per-trial-aes.js +12 -0
  807. package/dist/workflows/target-assessment/synthesis/index.d.ts +560 -0
  808. package/dist/workflows/target-assessment/synthesis/index.js +351 -0
  809. package/dist/workflows/target-assessment/synthesis-probes.d.ts +56 -0
  810. package/dist/workflows/target-assessment/synthesis-probes.js +320 -0
  811. package/dist/workspace/filesystem.d.ts +117 -0
  812. package/dist/workspace/filesystem.js +304 -0
  813. package/dist/workspace/mount-strategy.d.ts +50 -0
  814. package/dist/workspace/mount-strategy.js +67 -0
  815. package/dist/workspace/paths.d.ts +185 -0
  816. package/dist/workspace/paths.js +219 -0
  817. package/dist/workspace/provenance-collector.d.ts +34 -0
  818. package/dist/workspace/provenance-collector.js +16 -0
  819. package/dist/workspace/search-config.d.ts +23 -0
  820. package/dist/workspace/search-config.js +43 -0
  821. package/dist/workspace/workspace-paths.d.ts +26 -0
  822. package/dist/workspace/workspace-paths.js +31 -0
  823. package/package.json +101 -0
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Refresh the FDA/ICH regulatory corpus stored in `cortex_regulatory_chunks`.
3
+ *
4
+ * Pipeline: list documents → download → extract text → chunk → embed →
5
+ * upsert into `cortex_regulatory_chunks`. Idempotent at the (source, doc_id)
6
+ * grain — re-running replaces existing rows.
7
+ *
8
+ * Two callers:
9
+ * - `scripts/index-regulatory-corpus.ts` — operator-run CLI
10
+ * - `regulatory-corpus-boot-refresh.ts` — automatic 90-day-stale boot trigger
11
+ */
12
+ import type { Pool } from "pg";
13
+ export type RegulatoryCorpusSource = "FDA-CDER" | "FDA-CBER" | "ICH";
14
+ export declare const REGULATORY_CORPUS_SOURCES: RegulatoryCorpusSource[];
15
+ export interface RefreshResult {
16
+ ok: number;
17
+ fail: number;
18
+ }
19
+ export interface RefreshOptions {
20
+ pool: Pool;
21
+ sources?: RegulatoryCorpusSource[];
22
+ /**
23
+ * Embedder used to vectorise chunks. Required — callers must build one
24
+ * via `buildMaintenanceEmbedder(env)` (direct OpenAI, bypassing the billing gateway)
25
+ * or supply an injected stub for tests. There is no default: the corpus
26
+ * refresh is system-scoped maintenance work with no analysis to bill
27
+ * against, so we never silently fall through to the billing-gateway-routed
28
+ * `createEmbedder()` and emit unattributed calls.
29
+ */
30
+ embedder: (text: string) => Promise<number[]>;
31
+ /** Logger used for per-doc progress. Defaults to `console`. */
32
+ log?: Pick<Console, "log" | "error">;
33
+ }
34
+ /**
35
+ * Build an embedder that talks directly to api.openai.com using the given
36
+ * `apiKey`, bypassing the billing gateway.
37
+ *
38
+ * Returns `null` when `apiKey` is missing — callers MUST treat that as
39
+ * "auto-refresh disabled" rather than falling back to the workspace
40
+ * embedder (`workspace/search-config.ts`), which routes through the billing gateway
41
+ * via `OPENAI_BASE_URL` and would generate unbilled calls outside an ALS
42
+ * billing scope.
43
+ *
44
+ * The model id mirrors the workspace embedder default
45
+ * (`text-embedding-3-small`, 1536 dim) so chunks remain comparable to the
46
+ * default `cortex_regulatory_chunks.embedding` shape. Pass the existing
47
+ * `OPENAI_API_KEY` (a real OpenAI key, NOT a billing-gateway virtual key — direct
48
+ * calls to api.openai.com would 401 against a `sk-billing-*` value).
49
+ */
50
+ export declare function buildMaintenanceEmbedder(opts: {
51
+ apiKey?: string;
52
+ embeddingModel?: string;
53
+ }): ((text: string) => Promise<number[]>) | null;
54
+ /**
55
+ * Refresh one or more regulatory corpus sources end-to-end. Returns
56
+ * aggregate ok/fail counts across all requested sources. Never throws —
57
+ * per-document failures are counted but do not abort the run.
58
+ */
59
+ export declare function refreshRegulatoryCorpus(opts: RefreshOptions): Promise<RefreshResult>;
@@ -0,0 +1,146 @@
1
+ /**
2
+ * Refresh the FDA/ICH regulatory corpus stored in `cortex_regulatory_chunks`.
3
+ *
4
+ * Pipeline: list documents → download → extract text → chunk → embed →
5
+ * upsert into `cortex_regulatory_chunks`. Idempotent at the (source, doc_id)
6
+ * grain — re-running replaces existing rows.
7
+ *
8
+ * Two callers:
9
+ * - `scripts/index-regulatory-corpus.ts` — operator-run CLI
10
+ * - `regulatory-corpus-boot-refresh.ts` — automatic 90-day-stale boot trigger
11
+ */
12
+ import { unwrapOrThrow } from "../lib/result.js";
13
+ import { fetchFdaGuidanceListing, fetchAndExtractFdaDoc } from "../lib/regulatory-corpus/fetch-fda-guidance.js";
14
+ import { fetchIchListing, fetchAndExtractIchDoc } from "../lib/regulatory-corpus/fetch-ich.js";
15
+ import { chunkText, upsertChunks } from "../lib/regulatory-corpus.js";
16
+ export const REGULATORY_CORPUS_SOURCES = ["FDA-CDER", "FDA-CBER", "ICH"];
17
+ // A large guidance doc can chunk into 200-500+ pieces. Firing them all at
18
+ // once trips embedding-API rate limits and silently truncates the upserted
19
+ // chunks, so we batch.
20
+ const EMBED_CONCURRENCY = 20;
21
+ /**
22
+ * Build an embedder that talks directly to api.openai.com using the given
23
+ * `apiKey`, bypassing the billing gateway.
24
+ *
25
+ * Returns `null` when `apiKey` is missing — callers MUST treat that as
26
+ * "auto-refresh disabled" rather than falling back to the workspace
27
+ * embedder (`workspace/search-config.ts`), which routes through the billing gateway
28
+ * via `OPENAI_BASE_URL` and would generate unbilled calls outside an ALS
29
+ * billing scope.
30
+ *
31
+ * The model id mirrors the workspace embedder default
32
+ * (`text-embedding-3-small`, 1536 dim) so chunks remain comparable to the
33
+ * default `cortex_regulatory_chunks.embedding` shape. Pass the existing
34
+ * `OPENAI_API_KEY` (a real OpenAI key, NOT a billing-gateway virtual key — direct
35
+ * calls to api.openai.com would 401 against a `sk-billing-*` value).
36
+ */
37
+ export function buildMaintenanceEmbedder(opts) {
38
+ const { apiKey } = opts;
39
+ if (!apiKey)
40
+ return null;
41
+ // Strip the `openai/` provider prefix if present; we always talk to OpenAI here.
42
+ const id = opts.embeddingModel ?? "openai/text-embedding-3-small";
43
+ const modelId = id.startsWith("openai/") ? id.slice("openai/".length) : id;
44
+ // Direct call to api.openai.com (bypasses the billing gateway) — unbilled maintenance
45
+ // path. See doc comment above.
46
+ return async (text) => {
47
+ const res = await fetch("https://api.openai.com/v1/embeddings", {
48
+ method: "POST",
49
+ headers: {
50
+ "content-type": "application/json",
51
+ authorization: `Bearer ${apiKey}`,
52
+ },
53
+ body: JSON.stringify({ model: modelId, input: text, encoding_format: "float" }),
54
+ });
55
+ if (!res.ok) {
56
+ const body = await res.text();
57
+ throw new Error(`buildMaintenanceEmbedder: openai /embeddings ${res.status}: ${body}`);
58
+ }
59
+ const data = (await res.json());
60
+ const embedding = data.data?.[0]?.embedding;
61
+ if (!embedding)
62
+ throw new Error("buildMaintenanceEmbedder: empty response");
63
+ return embedding;
64
+ };
65
+ }
66
+ async function listForSource(source) {
67
+ switch (source) {
68
+ case "FDA-CDER":
69
+ return (await fetchFdaGuidanceListing("CDER")).map((s) => ({
70
+ ...s,
71
+ center: "CDER",
72
+ }));
73
+ case "FDA-CBER":
74
+ return (await fetchFdaGuidanceListing("CBER")).map((s) => ({
75
+ ...s,
76
+ center: "CBER",
77
+ }));
78
+ case "ICH":
79
+ return await fetchIchListing();
80
+ }
81
+ }
82
+ async function fetchOne(source, stub) {
83
+ if (source === "ICH")
84
+ return await fetchAndExtractIchDoc(stub);
85
+ return await fetchAndExtractFdaDoc(stub);
86
+ }
87
+ async function indexSource(pool, source, embedder, log) {
88
+ log.log(`\n=== ${source} ===`);
89
+ const stubs = await listForSource(source);
90
+ log.log(` ${stubs.length} document(s) listed`);
91
+ let ok = 0;
92
+ let fail = 0;
93
+ for (const stub of stubs) {
94
+ try {
95
+ const doc = await fetchOne(source, stub);
96
+ const rawChunks = chunkText(doc.text);
97
+ if (rawChunks.length === 0) {
98
+ log.error(` SKIP ${doc.doc_id}: no chunks emitted`);
99
+ continue;
100
+ }
101
+ const embeddings = [];
102
+ for (let i = 0; i < rawChunks.length; i += EMBED_CONCURRENCY) {
103
+ const batch = rawChunks.slice(i, i + EMBED_CONCURRENCY);
104
+ const batchResults = await Promise.all(batch.map((c) => embedder(c.text)));
105
+ embeddings.push(...batchResults);
106
+ }
107
+ const chunks = rawChunks.map((c, i) => ({ ...c, embedding: embeddings[i] }));
108
+ const row = {
109
+ source,
110
+ doc_id: doc.doc_id,
111
+ doc_title: doc.doc_title,
112
+ doc_url: doc.doc_url,
113
+ chunks,
114
+ metadata: doc.metadata,
115
+ };
116
+ unwrapOrThrow(await upsertChunks(pool, row));
117
+ ok++;
118
+ log.log(` ok ${doc.doc_id} (${chunks.length} chunks)`);
119
+ }
120
+ catch (err) {
121
+ fail++;
122
+ const msg = err instanceof Error ? err.message : String(err);
123
+ log.error(` FAIL ${stub.doc_id}: ${msg}`);
124
+ }
125
+ }
126
+ return { ok, fail };
127
+ }
128
+ /**
129
+ * Refresh one or more regulatory corpus sources end-to-end. Returns
130
+ * aggregate ok/fail counts across all requested sources. Never throws —
131
+ * per-document failures are counted but do not abort the run.
132
+ */
133
+ export async function refreshRegulatoryCorpus(opts) {
134
+ const sources = opts.sources ?? REGULATORY_CORPUS_SOURCES;
135
+ const { pool, embedder } = opts;
136
+ const log = opts.log ?? console;
137
+ let totalOk = 0;
138
+ let totalFail = 0;
139
+ for (const source of sources) {
140
+ const { ok, fail } = await indexSource(pool, source, embedder, log);
141
+ totalOk += ok;
142
+ totalFail += fail;
143
+ }
144
+ log.log(`\nDone. ok=${totalOk} fail=${totalFail}`);
145
+ return { ok: totalOk, fail: totalFail };
146
+ }
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Boot-time regulatory corpus refresher.
3
+ *
4
+ * On every Cortex startup, check whether `cortex_regulatory_chunks` was
5
+ * last refreshed more than 90 days ago (or has never been populated). If
6
+ * stale, fire `refreshRegulatoryCorpus()` asynchronously so it does not
7
+ * block the server from coming up.
8
+ *
9
+ * Multi-replica safety: the refresh acquires a Postgres advisory lock on
10
+ * a dedicated `pg.Client` (advisory locks are session-scoped, so the lock
11
+ * only releases when the client connection closes — which we do explicitly
12
+ * after the refresh resolves or rejects). Replicas that lose the race
13
+ * skip silently. The 90-day check itself is racy against the lock holder
14
+ * but the cost of a redundant check is one round-trip; the actual scrape
15
+ * is what we serialize.
16
+ */
17
+ import type { Pool } from "pg";
18
+ import { refreshRegulatoryCorpus, type RefreshOptions } from "./refresh-regulatory-corpus.js";
19
+ export declare const REFRESH_INTERVAL_DAYS = 90;
20
+ export interface BootRefreshDeps {
21
+ /** Shared `pg.Pool`. */
22
+ pool: Pool;
23
+ /** Forwarded to `refreshRegulatoryCorpus()` when the refresh fires. */
24
+ refreshOptions?: Omit<RefreshOptions, "embedder">;
25
+ /**
26
+ * Embedder injected directly (used by tests). When omitted, the boot
27
+ * task derives one from `REGULATORY_CORPUS_OPENAI_API_KEY` — and skips
28
+ * the refresh when that env var is unset, to avoid generating
29
+ * unattributed billing-gateway calls outside any billing scope.
30
+ */
31
+ embedder?: (text: string) => Promise<number[]>;
32
+ /** Override the refresh function (used by tests). */
33
+ refresh?: typeof refreshRegulatoryCorpus;
34
+ /** Logger. Defaults to `console`. */
35
+ log?: Pick<Console, "log" | "warn" | "error">;
36
+ /** Override the staleness threshold (used by tests). */
37
+ intervalDays?: number;
38
+ /** Embedding model for the maintenance embedder (when `embedder` omitted). */
39
+ embeddingModel?: string;
40
+ /** Direct OpenAI key for the maintenance embedder (NOT a billing-gateway VK). */
41
+ openaiApiKey?: string;
42
+ }
43
+ /**
44
+ * Check the corpus freshness and, if stale, kick off an asynchronous
45
+ * refresh. Resolves quickly — does NOT wait for the refresh to finish.
46
+ *
47
+ * Returns:
48
+ * - "skipped-fresh" when corpus age < intervalDays
49
+ * - "skipped-unconfigured" when no maintenance embedder is available
50
+ * (no `REGULATORY_CORPUS_OPENAI_API_KEY` and no injected embedder)
51
+ * - "skipped-locked" when another replica holds the advisory lock
52
+ * - "started" when this replica acquired the lock and dispatched the refresh
53
+ * - "error" when the freshness check itself failed (refresh not attempted)
54
+ */
55
+ export declare function maybeKickOffRegulatoryCorpusRefresh(deps: BootRefreshDeps): Promise<"skipped-fresh" | "skipped-unconfigured" | "skipped-locked" | "started" | "error">;
@@ -0,0 +1,149 @@
1
+ /**
2
+ * Boot-time regulatory corpus refresher.
3
+ *
4
+ * On every Cortex startup, check whether `cortex_regulatory_chunks` was
5
+ * last refreshed more than 90 days ago (or has never been populated). If
6
+ * stale, fire `refreshRegulatoryCorpus()` asynchronously so it does not
7
+ * block the server from coming up.
8
+ *
9
+ * Multi-replica safety: the refresh acquires a Postgres advisory lock on
10
+ * a dedicated `pg.Client` (advisory locks are session-scoped, so the lock
11
+ * only releases when the client connection closes — which we do explicitly
12
+ * after the refresh resolves or rejects). Replicas that lose the race
13
+ * skip silently. The 90-day check itself is racy against the lock holder
14
+ * but the cost of a redundant check is one round-trip; the actual scrape
15
+ * is what we serialize.
16
+ */
17
+ import { buildMaintenanceEmbedder, refreshRegulatoryCorpus } from "./refresh-regulatory-corpus.js";
18
+ export const REFRESH_INTERVAL_DAYS = 90;
19
+ const ADVISORY_LOCK_KEY = "cortex_regulatory_corpus_refresh";
20
+ async function checkFreshness(pool, intervalDays) {
21
+ const { rows } = await pool.query(`SELECT MAX(indexed_at) AS last_indexed_at,
22
+ EXTRACT(EPOCH FROM (NOW() - MAX(indexed_at))) / 86400 AS age_days
23
+ FROM cortex_regulatory_chunks`);
24
+ const row = rows[0];
25
+ const lastIndexedAt = row?.last_indexed_at ?? null;
26
+ const ageDays = row?.age_days != null ? Number(row.age_days) : null;
27
+ const stale = lastIndexedAt === null || (ageDays ?? Infinity) >= intervalDays;
28
+ return { stale, lastIndexedAt, ageDays };
29
+ }
30
+ /**
31
+ * Hash a string into a bigint suitable for `pg_try_advisory_lock(bigint)`.
32
+ * Uses Postgres's own `hashtext()`.
33
+ */
34
+ async function tryAcquireLock(client) {
35
+ const { rows } = await client.query("SELECT pg_try_advisory_lock(hashtext($1)) AS acquired", [ADVISORY_LOCK_KEY]);
36
+ return rows[0]?.acquired === true;
37
+ }
38
+ async function releaseLock(client) {
39
+ try {
40
+ await client.query("SELECT pg_advisory_unlock(hashtext($1))", [ADVISORY_LOCK_KEY]);
41
+ }
42
+ catch {
43
+ // Connection may already be closed/poisoned — release-on-disconnect
44
+ // covers us. Swallow.
45
+ }
46
+ }
47
+ /**
48
+ * Check the corpus freshness and, if stale, kick off an asynchronous
49
+ * refresh. Resolves quickly — does NOT wait for the refresh to finish.
50
+ *
51
+ * Returns:
52
+ * - "skipped-fresh" when corpus age < intervalDays
53
+ * - "skipped-unconfigured" when no maintenance embedder is available
54
+ * (no `REGULATORY_CORPUS_OPENAI_API_KEY` and no injected embedder)
55
+ * - "skipped-locked" when another replica holds the advisory lock
56
+ * - "started" when this replica acquired the lock and dispatched the refresh
57
+ * - "error" when the freshness check itself failed (refresh not attempted)
58
+ */
59
+ export async function maybeKickOffRegulatoryCorpusRefresh(deps) {
60
+ const pool = deps.pool;
61
+ const log = deps.log ?? console;
62
+ const intervalDays = deps.intervalDays ?? REFRESH_INTERVAL_DAYS;
63
+ const refresh = deps.refresh ?? refreshRegulatoryCorpus;
64
+ // Freshness first — cheap (single query) and has no env dependency. Pod
65
+ // restarts and scale-ups on a long-lived cluster hit this path constantly;
66
+ // logging "auto-refresh disabled because key is unset" on every one of
67
+ // them creates alert fatigue. Only complain about missing config when a
68
+ // refresh is actually needed.
69
+ let freshness;
70
+ try {
71
+ freshness = await checkFreshness(pool, intervalDays);
72
+ }
73
+ catch (err) {
74
+ log.warn("[boot] Regulatory corpus freshness check failed; skipping auto-refresh:", err instanceof Error ? err.message : err);
75
+ return "error";
76
+ }
77
+ if (!freshness.stale) {
78
+ log.log(`[boot] Regulatory corpus is fresh (age ${freshness.ageDays?.toFixed(1)}d < ${intervalDays}d); skipping refresh`);
79
+ return "skipped-fresh";
80
+ }
81
+ // Corpus is stale — resolve the maintenance embedder. System-scoped
82
+ // maintenance work has no analysis/target-assessment to bill against, so
83
+ // we route directly to api.openai.com on a dedicated key. Never the
84
+ // billing-gateway-routed workspace embedder, which would emit unattributed calls
85
+ // and flood the boot log via `billing-fetch-patch`.
86
+ let embedder = deps.embedder ?? null;
87
+ if (!embedder) {
88
+ try {
89
+ embedder = buildMaintenanceEmbedder({
90
+ apiKey: deps.openaiApiKey,
91
+ embeddingModel: deps.embeddingModel ?? "",
92
+ });
93
+ }
94
+ catch (err) {
95
+ log.warn("[boot] Could not load env for regulatory corpus refresh; skipping:", err instanceof Error ? err.message : err);
96
+ return "skipped-unconfigured";
97
+ }
98
+ }
99
+ if (!embedder) {
100
+ const ageStr = freshness.lastIndexedAt === null ? "empty" : `age ${freshness.ageDays?.toFixed(1)}d`;
101
+ log.warn(`[boot] Regulatory corpus is stale (${ageStr}) but ` +
102
+ "REGULATORY_CORPUS_OPENAI_API_KEY is unset; skipping auto-refresh. " +
103
+ "Set it (a real OpenAI key, NOT a billing-gateway virtual key — the " +
104
+ "maintenance embedder talks direct to api.openai.com) to enable, " +
105
+ "or run scripts/index-regulatory-corpus.ts manually.");
106
+ return "skipped-unconfigured";
107
+ }
108
+ // Acquire the advisory lock on a dedicated pool client. We hold this
109
+ // client (and the lock) for the whole refresh — releasing it only after
110
+ // the detached promise settles. Other replicas booting in the meantime
111
+ // hit `pg_try_advisory_lock` and skip.
112
+ const client = await pool.connect();
113
+ let acquired;
114
+ try {
115
+ acquired = await tryAcquireLock(client);
116
+ }
117
+ catch (err) {
118
+ client.release();
119
+ log.warn("[boot] Regulatory corpus advisory-lock attempt failed; skipping auto-refresh:", err instanceof Error ? err.message : err);
120
+ return "error";
121
+ }
122
+ if (!acquired) {
123
+ client.release();
124
+ log.log("[boot] Regulatory corpus refresh already in progress on another replica; skipping");
125
+ return "skipped-locked";
126
+ }
127
+ const ageStr = freshness.lastIndexedAt === null ? "empty" : `age ${freshness.ageDays?.toFixed(1)}d`;
128
+ log.log(`[boot] Regulatory corpus is stale (${ageStr}); starting async refresh in background`);
129
+ // Detached promise — startup must not wait for this to finish.
130
+ const dispatchEmbedder = embedder;
131
+ void (async () => {
132
+ try {
133
+ const result = await refresh({
134
+ ...(deps.refreshOptions ?? {}),
135
+ pool,
136
+ embedder: dispatchEmbedder,
137
+ });
138
+ log.log(`[boot] Regulatory corpus refresh complete: ok=${result.ok} fail=${result.fail}`);
139
+ }
140
+ catch (err) {
141
+ log.error("[boot] Regulatory corpus refresh threw:", err instanceof Error ? err.message : err);
142
+ }
143
+ finally {
144
+ await releaseLock(client);
145
+ client.release();
146
+ }
147
+ })();
148
+ return "started";
149
+ }
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Test-only `ToolContext` builder. Not a `*.test.ts` file, so the test
3
+ * runner ignores it; imported by the tool unit tests.
4
+ */
5
+ import type { ToolContext } from "../define-tool.js";
6
+ /** A `ToolContext` plus the list of events its `emit` recorded. */
7
+ export interface TestToolContext {
8
+ readonly ctx: ToolContext;
9
+ /** Every event passed to `ctx.emit`, in call order. */
10
+ readonly emitted: unknown[];
11
+ }
12
+ /** Build a `ToolContext` for tests; `emit` records into `emitted`. */
13
+ export declare function makeToolContext(signal?: AbortSignal): TestToolContext;
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Test-only `ToolContext` builder. Not a `*.test.ts` file, so the test
3
+ * runner ignores it; imported by the tool unit tests.
4
+ */
5
+ import { makeSession } from "../../providers/__fixtures__/session.js";
6
+ /** Build a `ToolContext` for tests; `emit` records into `emitted`. */
7
+ export function makeToolContext(signal) {
8
+ const emitted = [];
9
+ const ctx = {
10
+ session: makeSession(),
11
+ signal: signal ?? new AbortController().signal,
12
+ emit: (event) => {
13
+ emitted.push(event);
14
+ },
15
+ runStep: (_name, fn) => fn(),
16
+ };
17
+ return { ctx, emitted };
18
+ }
@@ -0,0 +1,35 @@
1
+ /**
2
+ * checkSafetyPanel — look up identifiers against the curated
3
+ * secondary-pharmacology safety target panel.
4
+ */
5
+ export declare const checkSafetyPanelTool: import("../define-tool.js").Tool<{
6
+ identifiers: string[];
7
+ identifier_type: "auto" | "gene_symbol" | "uniprot" | "chembl_id";
8
+ filter_organ?: "hematologic" | "metabolic" | "immune" | "hepatic" | "cns" | "renal" | "respiratory" | "cardiac" | "gi" | undefined;
9
+ }, {
10
+ matches: {
11
+ input: string;
12
+ matched_entry: {
13
+ chembl_id: string;
14
+ gene_symbol: string;
15
+ uniprot: string;
16
+ name: string;
17
+ organ_system: "hematologic" | "metabolic" | "immune" | "hepatic" | "cns" | "renal" | "respiratory" | "cardiac" | "gi";
18
+ clinical_consequence: string;
19
+ severity: "high" | "medium" | "low";
20
+ references: string[];
21
+ ensembl_gene_id?: string | undefined;
22
+ } | null;
23
+ }[];
24
+ summary: {
25
+ total_input: number;
26
+ matched: number;
27
+ by_severity: {
28
+ high: number;
29
+ medium: number;
30
+ low: number;
31
+ };
32
+ by_organ: Record<string, number>;
33
+ };
34
+ panel_version: string;
35
+ }>;
@@ -0,0 +1,76 @@
1
+ /**
2
+ * checkSafetyPanel — look up identifiers against the curated
3
+ * secondary-pharmacology safety target panel.
4
+ */
5
+ import { ok } from "neverthrow";
6
+ import { z } from "zod";
7
+ import { CHEMBL_RE, ORGAN_SYSTEMS, SafetyPanelFileSchema, UNIPROT_RE } from "../../data/safety-panel-schema.js";
8
+ import panelData from "../../data/safety-panel.json" with { type: "json" };
9
+ import { defineTool } from "../define-tool.js";
10
+ const PANEL = SafetyPanelFileSchema.parse(panelData);
11
+ const BY_CHEMBL = new Map(PANEL.targets.map((t) => [t.chembl_id, t]));
12
+ const BY_GENE = new Map(PANEL.targets.map((t) => [t.gene_symbol, t]));
13
+ const BY_UNIPROT = new Map(PANEL.targets.map((t) => [t.uniprot, t]));
14
+ function detectType(id) {
15
+ if (CHEMBL_RE.test(id))
16
+ return "chembl_id";
17
+ if (UNIPROT_RE.test(id))
18
+ return "uniprot";
19
+ return "gene_symbol";
20
+ }
21
+ function lookup(id, type) {
22
+ switch (type) {
23
+ case "chembl_id":
24
+ return BY_CHEMBL.get(id) ?? null;
25
+ case "gene_symbol":
26
+ return BY_GENE.get(id.toUpperCase()) ?? null;
27
+ case "uniprot":
28
+ return BY_UNIPROT.get(id) ?? null;
29
+ }
30
+ }
31
+ export const checkSafetyPanelTool = defineTool({
32
+ id: "check_safety_panel",
33
+ description: "Look up identifiers (ChEMBL ID, gene symbol, or UniProt accession) against the curated " +
34
+ "secondary-pharmacology safety target panel. Returns organ system, severity, and clinical " +
35
+ "consequence for each matched target. Use as a fast first-pass off-target liability check; " +
36
+ "for comprehensive assessment also call get-target-safety and search-toxcast.",
37
+ inputSchema: z.object({
38
+ identifiers: z.array(z.string().min(1)).min(0).max(200).describe("0-200 identifiers (ChEMBL IDs, gene symbols, or UniProt accessions)."),
39
+ identifier_type: z
40
+ .enum(["chembl_id", "gene_symbol", "uniprot", "auto"])
41
+ .default("auto")
42
+ .describe("Identifier interpretation. 'auto' detects per-input."),
43
+ filter_organ: z.enum(ORGAN_SYSTEMS).optional().describe("Restrict matches to this organ system."),
44
+ }),
45
+ execute: async ({ identifiers, identifier_type = "auto", filter_organ }) => {
46
+ const matches = identifiers.map((input) => {
47
+ const type = identifier_type === "auto" ? detectType(input) : identifier_type;
48
+ let entry = lookup(input, type);
49
+ if (entry && filter_organ && entry.organ_system !== filter_organ) {
50
+ entry = null;
51
+ }
52
+ return { input, matched_entry: entry };
53
+ });
54
+ const bySeverity = { high: 0, medium: 0, low: 0 };
55
+ const byOrgan = {};
56
+ let matched = 0;
57
+ for (const m of matches) {
58
+ if (!m.matched_entry)
59
+ continue;
60
+ matched++;
61
+ bySeverity[m.matched_entry.severity]++;
62
+ const o = m.matched_entry.organ_system;
63
+ byOrgan[o] = (byOrgan[o] ?? 0) + 1;
64
+ }
65
+ return ok({
66
+ matches,
67
+ summary: {
68
+ total_input: identifiers.length,
69
+ matched,
70
+ by_severity: bySeverity,
71
+ by_organ: byOrgan,
72
+ },
73
+ panel_version: PANEL.panel_version,
74
+ });
75
+ },
76
+ });
@@ -0,0 +1,32 @@
1
+ /**
2
+ * findApprovalPrecedent — query openFDA / Drugs@FDA for prior approvals in a
3
+ * given indication.
4
+ */
5
+ import { z } from "zod";
6
+ export declare const findApprovalPrecedentInputSchema: z.ZodObject<{
7
+ indication: z.ZodString;
8
+ modality: z.ZodOptional<z.ZodEnum<{
9
+ small_molecule: "small_molecule";
10
+ biologic: "biologic";
11
+ gene_therapy: "gene_therapy";
12
+ cell_therapy: "cell_therapy";
13
+ }>>;
14
+ mechanism: z.ZodOptional<z.ZodString>;
15
+ }, z.core.$strip>;
16
+ interface Precedent {
17
+ application_number: string;
18
+ brand_name?: string;
19
+ generic_name?: string;
20
+ approval_date?: string;
21
+ label_section_excerpts?: Record<string, string>;
22
+ }
23
+ export declare const findApprovalPrecedent: import("../define-tool.js").Tool<{
24
+ indication: string;
25
+ modality?: "small_molecule" | "biologic" | "gene_therapy" | "cell_therapy" | undefined;
26
+ mechanism?: string | undefined;
27
+ }, {
28
+ precedents: Precedent[];
29
+ }>;
30
+ /** Test-only — clears the in-memory cache to avoid cross-test bleed. */
31
+ export declare function __resetApprovalPrecedentCacheForTest(): void;
32
+ export {};
@@ -0,0 +1,72 @@
1
+ /**
2
+ * findApprovalPrecedent — query openFDA / Drugs@FDA for prior approvals in a
3
+ * given indication.
4
+ */
5
+ import { ok } from "neverthrow";
6
+ import { z } from "zod";
7
+ import { defineTool } from "../define-tool.js";
8
+ export const findApprovalPrecedentInputSchema = z.object({
9
+ indication: z.string().min(1).describe("Indication / disease name — searched against openFDA label.indications_and_usage"),
10
+ modality: z
11
+ .enum(["small_molecule", "biologic", "gene_therapy", "cell_therapy"])
12
+ .optional()
13
+ .describe("Optional modality hint (advisory; not used for filtering today)"),
14
+ mechanism: z.string().optional().describe("Optional MoA / mechanism hint (advisory; not used for filtering today)"),
15
+ });
16
+ const cache = new Map();
17
+ const TTL_MS = 60 * 60 * 1000;
18
+ export const findApprovalPrecedent = defineTool({
19
+ id: "find_approval_precedent",
20
+ description: "Query openFDA / Drugs@FDA for prior approvals in a given indication. Returns NDA/BLA application numbers, generic and brand names, approval dates (effective time of the label), and label-section excerpts (boxed warning, warnings and precautions, contraindications). Use to ground class-precedent claims and disposition framing in the executive recommendation.",
21
+ inputSchema: findApprovalPrecedentInputSchema,
22
+ execute: async ({ indication, modality, mechanism }) => {
23
+ const key = JSON.stringify({
24
+ indication: indication.toLowerCase(),
25
+ modality,
26
+ mechanism,
27
+ });
28
+ const cached = cache.get(key);
29
+ if (cached && Date.now() - cached.ts < TTL_MS)
30
+ return ok(cached.value);
31
+ const term = indication.replace(/"/g, "");
32
+ const url = new URL("https://api.fda.gov/drug/label.json");
33
+ url.searchParams.set("search", `indications_and_usage:"${term}"`);
34
+ url.searchParams.set("limit", "10");
35
+ const res = await fetch(url);
36
+ // openFDA answers a zero-match search with 404 — an expected "no
37
+ // precedents" outcome, not a failure. It is returned uncached so a
38
+ // later, more specific query is not masked. Any other non-ok status
39
+ // (5xx, 429) is an unexpected failure and throws.
40
+ if (res.status === 404)
41
+ return ok({ precedents: [] });
42
+ if (!res.ok) {
43
+ throw new Error(`openFDA label query failed: HTTP ${res.status}`);
44
+ }
45
+ const json = (await res.json());
46
+ const precedents = (json.results ?? []).slice(0, 10).map((r) => {
47
+ const excerpts = {};
48
+ if (r.boxed_warning?.[0])
49
+ excerpts.boxed_warning = r.boxed_warning[0].slice(0, 1000);
50
+ if (r.warnings_and_precautions?.[0])
51
+ excerpts.warnings_and_precautions = r.warnings_and_precautions[0].slice(0, 1000);
52
+ else if (r.warnings?.[0])
53
+ excerpts.warnings = r.warnings[0].slice(0, 1000);
54
+ if (r.contraindications?.[0])
55
+ excerpts.contraindications = r.contraindications[0].slice(0, 1000);
56
+ return {
57
+ application_number: r.openfda?.application_number?.[0] ?? "(unknown)",
58
+ brand_name: r.openfda?.brand_name?.[0],
59
+ generic_name: r.openfda?.generic_name?.[0],
60
+ approval_date: r.effective_time,
61
+ label_section_excerpts: Object.keys(excerpts).length > 0 ? excerpts : undefined,
62
+ };
63
+ });
64
+ const value = { precedents };
65
+ cache.set(key, { ts: Date.now(), value });
66
+ return ok(value);
67
+ },
68
+ });
69
+ /** Test-only — clears the in-memory cache to avoid cross-test bleed. */
70
+ export function __resetApprovalPrecedentCacheForTest() {
71
+ cache.clear();
72
+ }
@@ -0,0 +1,11 @@
1
+ /**
2
+ * getArticleDetails — fetch detailed metadata for PubMed articles.
3
+ */
4
+ export declare function createGetArticleDetailsTool(deps: {
5
+ ncbiApiKey?: string;
6
+ }): import("../define-tool.js").Tool<{
7
+ pmids: string[];
8
+ }, {
9
+ articles: import("../lib/ncbi-utils.js").ArticleDetail[];
10
+ notFound: string[];
11
+ }>;