@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,52 @@
1
+ /**
2
+ * Approval-precedent grounding for Phase-5 synthesis.
3
+ *
4
+ * Synthesis runs single-shot forced-`submit` LLM calls and can therefore call
5
+ * no tool. This module does the openFDA / Drugs@FDA lookup deterministically
6
+ * before synthesis so the fetched precedents can be injected into the synthesis
7
+ * prompts as a static markdown block. The fetch, in-memory TTL cache, and
8
+ * mapping mirror what a per-turn tool would have done, minus the tool wrapper.
9
+ */
10
+ import type { DossierV4Body } from "../../../contracts/target-dossier.js";
11
+ export type PrecedentModality = "small_molecule" | "biologic" | "gene_therapy" | "cell_therapy";
12
+ export interface FetchApprovalPrecedentsInput {
13
+ indication: string;
14
+ modality?: PrecedentModality;
15
+ mechanism?: string;
16
+ }
17
+ export interface Precedent {
18
+ application_number: string;
19
+ brand_name?: string;
20
+ generic_name?: string;
21
+ approval_date?: string;
22
+ label_section_excerpts?: Record<string, string>;
23
+ }
24
+ /**
25
+ * Query openFDA for prior approvals in a given indication. Returns
26
+ * NDA/BLA application numbers, generic and brand names, approval dates
27
+ * (label effective time), and label-section excerpts.
28
+ *
29
+ * openFDA answers a zero-match search with 404 — an expected "no precedents"
30
+ * outcome, returned uncached so a later, more specific query is not masked.
31
+ * Any other non-ok status (5xx, 429) is an unexpected failure and throws; the
32
+ * caller wraps the throw.
33
+ */
34
+ export declare function fetchApprovalPrecedents(input: FetchApprovalPrecedentsInput): Promise<{
35
+ precedents: Precedent[];
36
+ }>;
37
+ /** Test-only — clears the in-memory cache to avoid cross-test bleed. */
38
+ export declare function __resetApprovalPrecedentCacheForTest(): void;
39
+ /**
40
+ * Pick the openFDA query term for a Phase-4 dossier: the top `indications`
41
+ * row by `composite_score` (only when indications coverage is available and
42
+ * has rows), falling back to the inferred therapeutic area, else null.
43
+ */
44
+ export declare function pickIndicationForPrecedents(dossier: DossierV4Body): string | null;
45
+ /**
46
+ * Render the fetched precedents as a markdown block for injection into the
47
+ * synthesis prompts. The block always begins with the `## FDA approval
48
+ * precedents` header, which the synthesis briefs reference verbatim.
49
+ */
50
+ export declare function renderApprovalPrecedents(indication: string | null, result: {
51
+ precedents: Precedent[];
52
+ } | null): string;
@@ -0,0 +1,119 @@
1
+ /**
2
+ * Approval-precedent grounding for Phase-5 synthesis.
3
+ *
4
+ * Synthesis runs single-shot forced-`submit` LLM calls and can therefore call
5
+ * no tool. This module does the openFDA / Drugs@FDA lookup deterministically
6
+ * before synthesis so the fetched precedents can be injected into the synthesis
7
+ * prompts as a static markdown block. The fetch, in-memory TTL cache, and
8
+ * mapping mirror what a per-turn tool would have done, minus the tool wrapper.
9
+ */
10
+ const cache = new Map();
11
+ const TTL_MS = 60 * 60 * 1000;
12
+ /**
13
+ * Query openFDA for prior approvals in a given indication. Returns
14
+ * NDA/BLA application numbers, generic and brand names, approval dates
15
+ * (label effective time), and label-section excerpts.
16
+ *
17
+ * openFDA answers a zero-match search with 404 — an expected "no precedents"
18
+ * outcome, returned uncached so a later, more specific query is not masked.
19
+ * Any other non-ok status (5xx, 429) is an unexpected failure and throws; the
20
+ * caller wraps the throw.
21
+ */
22
+ export async function fetchApprovalPrecedents(input) {
23
+ const { indication, modality, mechanism } = input;
24
+ const key = JSON.stringify({
25
+ indication: indication.toLowerCase(),
26
+ modality,
27
+ mechanism,
28
+ });
29
+ const cached = cache.get(key);
30
+ if (cached && Date.now() - cached.ts < TTL_MS)
31
+ return cached.value;
32
+ const term = indication.replace(/"/g, "");
33
+ const url = new URL("https://api.fda.gov/drug/label.json");
34
+ url.searchParams.set("search", `indications_and_usage:"${term}"`);
35
+ url.searchParams.set("limit", "10");
36
+ const res = await fetch(url);
37
+ if (res.status === 404)
38
+ return { precedents: [] };
39
+ if (!res.ok) {
40
+ throw new Error(`openFDA label query failed: HTTP ${res.status}`);
41
+ }
42
+ const json = (await res.json());
43
+ const precedents = (json.results ?? []).slice(0, 10).map((r) => {
44
+ const excerpts = {};
45
+ if (r.boxed_warning?.[0])
46
+ excerpts.boxed_warning = r.boxed_warning[0].slice(0, 1000);
47
+ if (r.warnings_and_precautions?.[0])
48
+ excerpts.warnings_and_precautions = r.warnings_and_precautions[0].slice(0, 1000);
49
+ else if (r.warnings?.[0])
50
+ excerpts.warnings = r.warnings[0].slice(0, 1000);
51
+ if (r.contraindications?.[0])
52
+ excerpts.contraindications = r.contraindications[0].slice(0, 1000);
53
+ return {
54
+ application_number: r.openfda?.application_number?.[0] ?? "(unknown)",
55
+ brand_name: r.openfda?.brand_name?.[0],
56
+ generic_name: r.openfda?.generic_name?.[0],
57
+ approval_date: r.effective_time,
58
+ label_section_excerpts: Object.keys(excerpts).length > 0 ? excerpts : undefined,
59
+ };
60
+ });
61
+ const value = { precedents };
62
+ cache.set(key, { ts: Date.now(), value });
63
+ return value;
64
+ }
65
+ /** Test-only — clears the in-memory cache to avoid cross-test bleed. */
66
+ export function __resetApprovalPrecedentCacheForTest() {
67
+ cache.clear();
68
+ }
69
+ /**
70
+ * Pick the openFDA query term for a Phase-4 dossier: the top `indications`
71
+ * row by `composite_score` (only when indications coverage is available and
72
+ * has rows), falling back to the inferred therapeutic area, else null.
73
+ */
74
+ export function pickIndicationForPrecedents(dossier) {
75
+ const indications = dossier.indications;
76
+ if (indications.coverage === "available" && indications.data.rows.length > 0) {
77
+ const top = indications.data.rows.reduce((best, row) => (row.composite_score > best.composite_score ? row : best));
78
+ if (top.disease_name)
79
+ return top.disease_name;
80
+ }
81
+ return dossier.liability_summary.inferred_therapeutic_area ?? null;
82
+ }
83
+ /**
84
+ * Render the fetched precedents as a markdown block for injection into the
85
+ * synthesis prompts. The block always begins with the `## FDA approval
86
+ * precedents` header, which the synthesis briefs reference verbatim.
87
+ */
88
+ export function renderApprovalPrecedents(indication, result) {
89
+ const header = "## FDA approval precedents";
90
+ if (indication === null) {
91
+ return [header, "", "No indication could be resolved from the dossier, so no FDA approval precedents were queried."].join("\n");
92
+ }
93
+ const precedents = result?.precedents ?? [];
94
+ if (precedents.length === 0) {
95
+ return [
96
+ header,
97
+ "",
98
+ `No FDA approval precedents were found for "${indication}". Do not assert class precedents that are not present in the dossier.`,
99
+ ].join("\n");
100
+ }
101
+ const lines = [
102
+ header,
103
+ "",
104
+ `Prior FDA approvals retrieved for "${indication}". Ground class-precedent and disposition claims in these records; do not invent precedents beyond this list and the dossier.`,
105
+ "",
106
+ ];
107
+ for (const p of precedents) {
108
+ const generic = p.generic_name ?? "unknown generic";
109
+ const brand = p.brand_name ?? "unknown brand";
110
+ const date = p.approval_date ?? "unknown date";
111
+ lines.push(`- ${generic} (${brand}), ${p.application_number}, approved ${date}`);
112
+ if (p.label_section_excerpts) {
113
+ for (const [section, excerpt] of Object.entries(p.label_section_excerpts)) {
114
+ lines.push(` - ${section}: ${excerpt}`);
115
+ }
116
+ }
117
+ }
118
+ return lines.join("\n");
119
+ }
@@ -0,0 +1,46 @@
1
+ export type RecommendationAuditEntry = {
2
+ surface: "rationale" | "key_strengths" | "key_risks" | "modality_choice";
3
+ path: string;
4
+ excerpt: string;
5
+ } | {
6
+ surface: "external_missing";
7
+ id: string;
8
+ excerpt: string;
9
+ } | {
10
+ surface: "organ_claim_without_probe_pass";
11
+ excerpt: string;
12
+ bullet_category: string;
13
+ } | {
14
+ surface: "nct_wrong_class";
15
+ id: string;
16
+ excerpt: string;
17
+ } | {
18
+ surface: "pmid_not_in_key_papers";
19
+ id: string;
20
+ excerpt: string;
21
+ };
22
+ export type RecommendationAudit = {
23
+ citations_total: number;
24
+ citations_unresolved: RecommendationAuditEntry[];
25
+ non_dossier_citations: Array<{
26
+ token: string;
27
+ source: string;
28
+ }>;
29
+ };
30
+ type KeyRiskLike = {
31
+ text: string;
32
+ category?: string;
33
+ } | string;
34
+ type RecLike = {
35
+ rationale: string;
36
+ key_strengths: KeyRiskLike[];
37
+ key_risks: KeyRiskLike[];
38
+ modality_choice: {
39
+ rationale: string;
40
+ };
41
+ external_citations?: Array<{
42
+ id: string;
43
+ }>;
44
+ };
45
+ export declare function validateRecommendationCitations(rec: RecLike, dossier: unknown): RecommendationAudit;
46
+ export {};
@@ -0,0 +1,316 @@
1
+ // The recommendation agent emits citations as `[dossier: path; path; …]`
2
+ // blocks (colon-space, semicolon-separated), sometimes with a trailing
3
+ // `external citation: id; id` segment inside the same bracket. The old
4
+ // `dossier.path` regex never matched this in production — citations_total
5
+ // was always 0. These patterns match the format the agent actually writes.
6
+ // The block content may include array index notation like `[0]`, so we
7
+ // use a pattern that allows `[digits]` inside the outer brackets.
8
+ const DOSSIER_CITE_BLOCK_RE = /\[dossier:\s*((?:[^[\]]*(?:\[\d+\])?)*)\]/gi;
9
+ // External citation IDs are plain strings — no array-index notation like `[n]` — so the simple [^\]]+ class suffices here instead of the array-index-aware pattern used by DOSSIER_CITE_BLOCK_RE.
10
+ const EXTERNAL_CITE_BLOCK_RE = /\[external citation:\s*([^\]]+)\]/gi;
11
+ // Assumes at most one `external citation:` segment per dossier block (the recommendation prompt produces at most one); a hypothetical second segment in the same block would be parsed imperfectly.
12
+ const EXTERNAL_SEGMENT_RE = /external citation:\s*((?:[^[\]]*(?:\[\d+\])?)*)/i;
13
+ const NCT_RE = /\bNCT\d{8}\b/g;
14
+ const PMID_RE = /\bPMID[:\s]?(\d{6,9})\b/g;
15
+ // Legacy inline format: `dossier.path.foo` written directly in prose, no
16
+ // brackets. Still emitted by some recommendation outputs and exercised by
17
+ // the regression fixtures, so BOTH this and the `[dossier: …]` block format
18
+ // must be supported. This pattern only matches a bare `dossier.x.y` token —
19
+ // inside a `[dossier: …]` block the word `dossier` is followed by `:`, not
20
+ // `.`/`[`, so the two are disjoint and never double-count.
21
+ const DOSSIER_PATH_RE = /\bdossier(?:\.[A-Za-z_][A-Za-z0-9_]*|\[\d+\])+/g;
22
+ // Legacy bare external reference: `[ANDA215864]` — an all-caps id in
23
+ // brackets. Disjoint from `[dossier: …]` / `[external citation: …]` blocks
24
+ // (those start with a lowercase word) and from `[0]` array indices (digits).
25
+ const EXTERNAL_ID_RE = /\[([A-Z]{2,}[A-Z0-9_-]+)\]/g;
26
+ // Path prefixes the agent uses that are NOT part of the persisted dossier
27
+ // body — they refer to the per-section synthesis inputs the agent was
28
+ // shown. Citing them is legitimate; resolving them against the dossier is
29
+ // not, so they go to `non_dossier_citations` instead of `unresolved`.
30
+ const NON_DOSSIER_PREFIXES = ["per_section_synthesis"];
31
+ const ORGAN_CATEGORIES = new Set(["high_safety_organ_expression", "broad_expression", "class_liability"]);
32
+ /**
33
+ * Keyword fallback for detecting organ-level claims when the bullet has
34
+ * no structural `category` field (the production
35
+ * DossierRecommendationOutputSchema types key_risks as z.array(z.string())
36
+ * with no category metadata, so a category check alone would be dead
37
+ * code). Matches the regression-test approach in
38
+ * [C4] of calcr-target-assessment.test.ts.
39
+ */
40
+ const ORGAN_KEYWORDS_RE = /\b(kidney|kidneys|renal|nephro\w*|cns|central\s+nervous|brain|hypothalam\w*|cardiac|cardiovascular|hepatic|liver|hepato\w*|pulmonary|respiratory|gastrointestinal)\b/i;
41
+ /**
42
+ * Bullet-keyword → canonical organ class. The keys mirror the alternatives
43
+ * in `ORGAN_KEYWORDS_RE`; values match `target_organ_liabilities[i].organ`,
44
+ * which the assembler emits using the canonical safety-panel set
45
+ * (`cardiac` | `cns` | `hepatic` | `renal` | `gi` | `respiratory` | ...).
46
+ *
47
+ * Used to cross-match an organ-level key_risk bullet against the TOL probe
48
+ * pass without depending on the bullet text containing the literal JSON
49
+ * path `dossier.safety_profile.target_organ_liabilities` — LLM bullets are
50
+ * plain English so the path-based check from earlier never matched in
51
+ * production.
52
+ */
53
+ const BULLET_KEYWORD_TO_ORGAN = [
54
+ { rx: /\b(kidney|kidneys|renal|nephro\w*)\b/i, organ: "renal" },
55
+ { rx: /\b(cns|central\s+nervous|brain|hypothalam\w*)\b/i, organ: "cns" },
56
+ { rx: /\b(cardiac|cardiovascular)\b/i, organ: "cardiac" },
57
+ { rx: /\b(hepatic|liver|hepato\w*)\b/i, organ: "hepatic" },
58
+ { rx: /\b(pulmonary|respiratory)\b/i, organ: "respiratory" },
59
+ { rx: /\b(gastrointestinal)\b/i, organ: "gi" },
60
+ ];
61
+ function extractOrganClassesFromText(text) {
62
+ const result = new Set();
63
+ for (const { rx, organ } of BULLET_KEYWORD_TO_ORGAN) {
64
+ if (rx.test(text))
65
+ result.add(organ);
66
+ }
67
+ return result;
68
+ }
69
+ function resolvePath(root, path) {
70
+ if (!path.startsWith("dossier"))
71
+ return undefined;
72
+ const stripped = path.replace(/^dossier\.?/, "");
73
+ if (stripped === "")
74
+ return root;
75
+ const parts = stripped.split(/\.|\[(\d+)\]/).filter(Boolean);
76
+ return walkWithDataFallback(root, parts);
77
+ }
78
+ function walkWithDataFallback(root, parts) {
79
+ let cur = root;
80
+ for (const p of parts) {
81
+ if (cur == null)
82
+ return undefined;
83
+ const next = readPart(cur, p);
84
+ if (next !== undefined) {
85
+ cur = next;
86
+ continue;
87
+ }
88
+ // The dossier wraps every section as { coverage, data: {...} }. When a
89
+ // lookup misses and the current node has a `data` child, descend through
90
+ // it transparently — the LLM consistently writes paths without the wrapper
91
+ // (e.g. "translational_chain.peak_evidence_tier" instead of
92
+ // "translational_chain.data.peak_evidence_tier"). This mirrors how a human
93
+ // reader refers to the field; flagging it as unresolved produces noise.
94
+ if (typeof cur === "object" && "data" in cur) {
95
+ const viaData = readPart(cur.data, p);
96
+ if (viaData !== undefined) {
97
+ cur = viaData;
98
+ continue;
99
+ }
100
+ }
101
+ return undefined;
102
+ }
103
+ return cur;
104
+ }
105
+ function readPart(node, p) {
106
+ if (node == null)
107
+ return undefined;
108
+ if (/^\d+$/.test(p))
109
+ return Array.isArray(node) ? node[parseInt(p, 10)] : undefined;
110
+ return typeof node === "object" ? node[p] : undefined;
111
+ }
112
+ /**
113
+ * Extract dossier-path citations from `text`, supporting two formats:
114
+ * - New `[dossier: path; path]` blocks — `;`-separated bare paths, a
115
+ * trailing `/ID-list` suffix dropped, `external citation:` segment
116
+ * excluded (picked up by `findExternalIds`).
117
+ * - Legacy inline `dossier.path.foo` tokens written directly in prose.
118
+ *
119
+ * Returns `{ path, resolvable }` pairs: `path` is what surfaces in an
120
+ * unresolved-citation entry (bare for block tokens, `dossier.`-prefixed for
121
+ * legacy tokens — matching what each format's callers expect); `resolvable`
122
+ * is always `dossier.`-prefixed so `resolvePath` can walk it.
123
+ */
124
+ function findPathTokens(text) {
125
+ const tokens = [];
126
+ // New `[dossier: …]` block format.
127
+ for (const block of text.matchAll(DOSSIER_CITE_BLOCK_RE)) {
128
+ const dossierPart = block[1].split(/external citation:/i)[0];
129
+ for (const raw of dossierPart.split(";")) {
130
+ const token = raw.trim().split("/")[0].trim();
131
+ if (token.length > 0)
132
+ tokens.push({ path: token, resolvable: `dossier.${token}` });
133
+ }
134
+ }
135
+ // Legacy inline `dossier.path.foo` format. The match already carries the
136
+ // `dossier.` prefix — keep it in `path` (callers expect the prefixed form
137
+ // for this format) and use it directly as `resolvable`.
138
+ for (const m of text.matchAll(DOSSIER_PATH_RE)) {
139
+ tokens.push({ path: m[0], resolvable: m[0] });
140
+ }
141
+ return tokens;
142
+ }
143
+ /**
144
+ * Extract external-citation ids. The agent writes them either as a
145
+ * standalone `[external citation: id; id]` block or as a trailing segment
146
+ * inside a `[dossier: …; external citation: id]` block.
147
+ */
148
+ function findExternalIds(text) {
149
+ const ids = [];
150
+ const push = (segment) => {
151
+ for (const raw of segment.split(";")) {
152
+ const id = raw.trim();
153
+ if (id.length > 0)
154
+ ids.push(id);
155
+ }
156
+ };
157
+ for (const block of text.matchAll(EXTERNAL_CITE_BLOCK_RE))
158
+ push(block[1]);
159
+ for (const block of text.matchAll(DOSSIER_CITE_BLOCK_RE)) {
160
+ const m = block[1].match(EXTERNAL_SEGMENT_RE);
161
+ if (m)
162
+ push(m[1]);
163
+ }
164
+ // Legacy bare `[UPPERCASE_ID]` external reference (e.g. `[ANDA215864]`).
165
+ // NCT and PMID references in bracket form are already handled by NCT_RE /
166
+ // PMID_RE in the main loop — skip them here to avoid double-processing.
167
+ for (const m of text.matchAll(EXTERNAL_ID_RE)) {
168
+ const id = m[1];
169
+ if (/^NCT\d/.test(id) || /^PMID\d/.test(id))
170
+ continue;
171
+ ids.push(id);
172
+ }
173
+ return ids;
174
+ }
175
+ function normaliseBullet(b) {
176
+ return typeof b === "string" ? { text: b } : { text: b.text, category: b.category };
177
+ }
178
+ function collectClassDrugNames(dossier) {
179
+ const rows = dossier?.drug_interactions?.data?.rows ?? [];
180
+ return new Set(rows.map((r) => String(r.drug_name ?? "").toUpperCase()).filter(Boolean));
181
+ }
182
+ function collectKeyPaperPmids(dossier) {
183
+ const rows = dossier?.reference_biology?.key_papers?.data?.rows ?? [];
184
+ return new Set(rows.map((r) => String(r.pmid)).filter(Boolean));
185
+ }
186
+ /**
187
+ * Extract intervention names from a trial row. Handles two shapes:
188
+ * - Flat `interventions: string[]` — the production dossier shape assembled by
189
+ * `partitionTrialsByAttribution`.
190
+ * - Nested `armsInterventionsModule.interventions: Array<{ name: string }>` — the
191
+ * raw CT.gov v2 JSON shape that may appear in test fixtures or future collector
192
+ * output before the assembler flattens it.
193
+ */
194
+ function extractInterventionNames(row) {
195
+ // Production flat shape (priority)
196
+ if (Array.isArray(row.interventions)) {
197
+ return row.interventions.map((iv) => (typeof iv === "string" ? iv.toUpperCase() : String(iv?.name ?? "").toUpperCase()));
198
+ }
199
+ // Raw CT.gov nested shape fallback
200
+ const nested = row?.armsInterventionsModule?.interventions;
201
+ if (Array.isArray(nested)) {
202
+ return nested.map((iv) => String(iv?.name ?? "").toUpperCase());
203
+ }
204
+ return [];
205
+ }
206
+ function findTrialInterventions(dossier, nctId) {
207
+ const trialSets = [
208
+ dossier?.clinical_development?.trials?.data?.rows ?? [],
209
+ dossier?.clinical_development?.failed_trials?.data?.rows ?? [],
210
+ dossier?.analytics?.discovery_trials?.data?.rows ?? [],
211
+ ];
212
+ for (const set of trialSets) {
213
+ const row = set.find((t) => t.nct_id === nctId);
214
+ if (!row)
215
+ continue;
216
+ return extractInterventionNames(row);
217
+ }
218
+ return [];
219
+ }
220
+ export function validateRecommendationCitations(rec, dossier) {
221
+ const dossierView = dossier;
222
+ const unresolved = [];
223
+ const nonDossier = [];
224
+ let total = 0;
225
+ const externalIds = new Set((rec.external_citations ?? []).map((c) => c.id));
226
+ const surfaces = [
227
+ { surface: "rationale", text: rec.rationale },
228
+ { surface: "modality_choice", text: rec.modality_choice.rationale },
229
+ ...rec.key_strengths.map((b) => ({ surface: "key_strengths", text: normaliseBullet(b).text })),
230
+ ...rec.key_risks.map((b) => ({ surface: "key_risks", text: normaliseBullet(b).text })),
231
+ ];
232
+ const classDrugNames = collectClassDrugNames(dossierView);
233
+ const keyPmids = collectKeyPaperPmids(dossierView);
234
+ for (const { surface, text } of surfaces) {
235
+ for (const { path, resolvable } of findPathTokens(text)) {
236
+ total += 1;
237
+ // Legacy-format tokens carry a `dossier.` prefix; block-format tokens
238
+ // are bare. Strip the prefix so the non-dossier-prefix check works for
239
+ // both formats.
240
+ const barePath = path.startsWith("dossier.") ? path.slice("dossier.".length) : path;
241
+ if (NON_DOSSIER_PREFIXES.some((p) => barePath === p || barePath.startsWith(`${p}.`) || barePath.startsWith(`${p}[`))) {
242
+ nonDossier.push({ token: path, source: surface });
243
+ continue;
244
+ }
245
+ const resolved = resolvePath(dossier, resolvable);
246
+ if (resolved === undefined || resolved === null) {
247
+ unresolved.push({ surface, path, excerpt: text.slice(0, 200) });
248
+ }
249
+ }
250
+ for (const id of findExternalIds(text)) {
251
+ if (!externalIds.has(id)) {
252
+ unresolved.push({ surface: "external_missing", id, excerpt: text.slice(0, 200) });
253
+ }
254
+ }
255
+ for (const m of text.matchAll(NCT_RE)) {
256
+ const nctId = m[0];
257
+ const interventions = findTrialInterventions(dossierView, nctId);
258
+ // Only flag wrong-class when the trial IS present in the dossier
259
+ // and its interventions don't reference the class. Trials absent
260
+ // from the collected sets are unverifiable — flagging them would
261
+ // produce false positives for any on-class trial that the
262
+ // synthesis agent cited but the discovery collector missed.
263
+ if (interventions.length === 0)
264
+ continue;
265
+ // Skip when no class-drug catalog is available — without a reference
266
+ // set (early-stage / first-in-class targets, or drug_interactions
267
+ // collector returning queried_no_data) every cited trial would
268
+ // otherwise flag as wrong-class regardless of its actual class.
269
+ if (classDrugNames.size === 0)
270
+ continue;
271
+ const referencesClassDrug = interventions.some((iv) => [...classDrugNames].some((name) => iv.includes(name)));
272
+ if (!referencesClassDrug) {
273
+ unresolved.push({ surface: "nct_wrong_class", id: nctId, excerpt: text.slice(0, 200) });
274
+ }
275
+ }
276
+ for (const m of text.matchAll(PMID_RE)) {
277
+ const pmid = m[1];
278
+ if (!keyPmids.has(pmid)) {
279
+ unresolved.push({ surface: "pmid_not_in_key_papers", id: pmid, excerpt: text.slice(0, 200) });
280
+ }
281
+ }
282
+ }
283
+ const organLiabilities = dossierView?.safety_profile?.target_organ_liabilities ?? [];
284
+ const tolOrgans = new Set(organLiabilities
285
+ .map((t) => String(t?.organ ?? "")
286
+ .toLowerCase()
287
+ .trim())
288
+ .filter((o) => o.length > 0));
289
+ for (const b of rec.key_risks ?? []) {
290
+ const norm = normaliseBullet(b);
291
+ // Detect organ-level claims by structural category when available
292
+ // (typed bullets) OR by keyword match on the text (plain-string
293
+ // bullets — the production shape).
294
+ const isOrganClaim = (norm.category != null && ORGAN_CATEGORIES.has(norm.category)) || ORGAN_KEYWORDS_RE.test(norm.text);
295
+ if (!isOrganClaim)
296
+ continue;
297
+ // "Probe pass" = the TOL section has an entry whose organ matches the
298
+ // organ class mentioned in the bullet. Production bullets are plain
299
+ // English so we extract the organ class via keyword matching and
300
+ // cross-reference against the canonical TOL organ field.
301
+ const bulletOrgans = extractOrganClassesFromText(norm.text);
302
+ const citesTOL = bulletOrgans.size > 0 && [...bulletOrgans].some((o) => tolOrgans.has(o));
303
+ if (!citesTOL) {
304
+ unresolved.push({
305
+ surface: "organ_claim_without_probe_pass",
306
+ excerpt: norm.text.slice(0, 200),
307
+ bullet_category: norm.category ?? "inferred_from_text",
308
+ });
309
+ }
310
+ }
311
+ return {
312
+ citations_total: total,
313
+ citations_unresolved: unresolved,
314
+ non_dossier_citations: nonDossier,
315
+ };
316
+ }
@@ -0,0 +1,62 @@
1
+ /**
2
+ * Per-row LLM clinical-consequence annotator with Postgres caching.
3
+ *
4
+ * Any off-target row missing a `clinical_consequence` gets annotated by a
5
+ * focused tool-less LLM specialist that returns ONE sentence + provenance.
6
+ * Results are cached in `cortex_off_target_annotations` keyed by
7
+ * (primary_target_gene, off_target_key) so repeat assessments reuse prior
8
+ * work.
9
+ *
10
+ * Cache miss path: when a `deps` bundle is supplied, build a compact JSON
11
+ * prompt, run a single-shot harness agent loop (no tools, max 2 iterations),
12
+ * parse JSON out of the final assistant text, INSERT on success, return the
13
+ * consequence. With no `deps`, the function returns null on cache miss
14
+ * (no LLM call). Cache hit path: a single primary-key lookup, no LLM call.
15
+ * Per-row failures (LLM, schema validation, DB) are swallowed — annotation
16
+ * is supplementary; the dossier renders fine with null.
17
+ */
18
+ import { z } from "zod";
19
+ import type { Pool } from "pg";
20
+ import type { AgentSession } from "../../../auth/types.js";
21
+ import type { ChatProvider } from "../../../providers/types.js";
22
+ export declare const OffTargetAnnotationSchema: z.ZodObject<{
23
+ clinical_consequence: z.ZodString;
24
+ provenance: z.ZodString;
25
+ }, z.core.$strip>;
26
+ export type OffTargetAnnotation = z.infer<typeof OffTargetAnnotationSchema>;
27
+ export interface ClinicalConsequenceAnnotatorDeps {
28
+ readonly provider: ChatProvider;
29
+ readonly session: AgentSession;
30
+ readonly model: string;
31
+ }
32
+ export interface AnnotationInput {
33
+ primaryTargetGene: string;
34
+ offTargetId: string | null;
35
+ offTargetName: string;
36
+ offTargetAccession: string | null;
37
+ pchembl: number;
38
+ /** Optional one-line family-relationship hint (e.g., "obligate cofactor"). */
39
+ context?: string;
40
+ }
41
+ /**
42
+ * Annotate a single off-target row. Returns null on any failure (cache
43
+ * miss + no deps, cache miss + LLM unavailable, schema validation failure,
44
+ * DB unreachable, etc.) — callers must treat null as "no annotation" and
45
+ * leave `clinical_consequence` as their original fallback.
46
+ */
47
+ export declare function annotateClinicalConsequence(pool: Pool, input: AnnotationInput, deps?: ClinicalConsequenceAnnotatorDeps): Promise<OffTargetAnnotation | null>;
48
+ /**
49
+ * Annotate every row in an off-target panel whose `clinical_consequence`
50
+ * is currently null. Mutates the supplied arrays in-place. Pure assembly-
51
+ * time helper — no return value.
52
+ *
53
+ * Per-row LLM calls are bounded by the "annotation-llm" host budget (4 in
54
+ * flight). Cache hits skip the LLM entirely and consume only a cheap
55
+ * Postgres lookup, so the budget gate is held briefly for those rows.
56
+ * Without `deps`, the panel is annotated cache-only — rows missing a
57
+ * cached entry remain with their original fallback.
58
+ */
59
+ export declare function annotateOffTargetPanel(pool: Pool, panel: {
60
+ rows: Array<Record<string, unknown>>;
61
+ excluded_rows: Array<Record<string, unknown>>;
62
+ }, primaryTargetGene: string, deps?: ClinicalConsequenceAnnotatorDeps): Promise<void>;