@inflexa-ai/harness 0.1.1 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (330) hide show
  1. package/README.md +48 -0
  2. package/dist/agents/conversation-agent.d.ts +15 -11
  3. package/dist/agents/conversation-agent.js +31 -34
  4. package/dist/agents/report-builder.js +2 -1
  5. package/dist/agents/sandbox/bulk-transcriptomics-agent.js +1 -1
  6. package/dist/agents/sandbox/cheminformatics-agent.js +1 -19
  7. package/dist/agents/sandbox/chromatin-agent.js +1 -10
  8. package/dist/agents/sandbox/dna-methylation-agent.js +1 -10
  9. package/dist/agents/sandbox/drug-repurposing-agent.js +4 -14
  10. package/dist/agents/sandbox/enrichment-agent.js +1 -10
  11. package/dist/agents/sandbox/ephemeral-executor.js +1 -10
  12. package/dist/agents/sandbox/genomic-variant-agent.js +1 -3
  13. package/dist/agents/sandbox/immune-profiling-agent.js +1 -13
  14. package/dist/agents/sandbox/metabolomics-agent.js +1 -1
  15. package/dist/agents/sandbox/microbiome-agent.js +1 -1
  16. package/dist/agents/sandbox/multi-omics-integration-agent.js +1 -12
  17. package/dist/agents/sandbox/multimodal-sc-agent.js +1 -1
  18. package/dist/agents/sandbox/network-agent.js +1 -10
  19. package/dist/agents/sandbox/pkpd-clinical-response-agent.js +2 -8
  20. package/dist/agents/sandbox/proteomics-agent.js +1 -1
  21. package/dist/agents/sandbox/scientific-executor.js +1 -10
  22. package/dist/agents/sandbox/shared.d.ts +20 -6
  23. package/dist/agents/sandbox/shared.js +50 -39
  24. package/dist/agents/sandbox/single-cell-agent.js +1 -1
  25. package/dist/agents/sandbox/spatial-omics-agent.js +1 -1
  26. package/dist/agents/sandbox/statistical-modeling-agent.js +1 -1
  27. package/dist/agents/sandbox/translational-safety-agent.js +3 -9
  28. package/dist/agents/sandbox/types.d.ts +1 -1
  29. package/dist/agents/system-prompt.d.ts +37 -11
  30. package/dist/agents/system-prompt.js +35 -12
  31. package/dist/app/chat-turn.d.ts +3 -0
  32. package/dist/app/chat-turn.js +3 -1
  33. package/dist/app/data-profile-orientation.d.ts +34 -0
  34. package/dist/app/data-profile-orientation.js +117 -0
  35. package/dist/app/synthesize-run.d.ts +3 -0
  36. package/dist/app/synthesize-run.js +3 -1
  37. package/dist/contracts/schemas/chat-parts.d.ts +9 -9
  38. package/dist/execution/artifact-metadata.d.ts +3 -0
  39. package/dist/execution/artifact-metadata.js +10 -3
  40. package/dist/execution/artifact-registration.d.ts +2 -1
  41. package/dist/execution/artifact-registration.js +8 -2
  42. package/dist/execution/ephemeral-runner.d.ts +16 -0
  43. package/dist/execution/ephemeral-runner.js +31 -5
  44. package/dist/execution/post-step-pipeline.d.ts +3 -0
  45. package/dist/execution/post-step-pipeline.js +24 -4
  46. package/dist/execution/reconcile-manifest.d.ts +7 -0
  47. package/dist/execution/reconcile-manifest.js +19 -5
  48. package/dist/execution/report-runner.d.ts +3 -0
  49. package/dist/execution/report-runner.js +4 -4
  50. package/dist/execution/run-synthesis.js +20 -19
  51. package/dist/execution/step-summary.d.ts +3 -0
  52. package/dist/execution/step-summary.js +6 -3
  53. package/dist/index.d.ts +9 -2
  54. package/dist/index.js +24 -5
  55. package/dist/lib/chrome.d.ts +4 -1
  56. package/dist/lib/chrome.js +10 -7
  57. package/dist/lib/console-logger.d.ts +19 -0
  58. package/dist/lib/console-logger.js +62 -0
  59. package/dist/lib/logger.d.ts +88 -0
  60. package/dist/lib/logger.js +37 -0
  61. package/dist/lib/otel.d.ts +2 -1
  62. package/dist/lib/otel.js +8 -3
  63. package/dist/loop/__fixtures__/scripted-provider.d.ts +2 -2
  64. package/dist/loop/__fixtures__/scripted-provider.js +2 -1
  65. package/dist/loop/metrics.d.ts +33 -1
  66. package/dist/loop/metrics.js +56 -2
  67. package/dist/loop/run-agent.d.ts +13 -1
  68. package/dist/loop/run-agent.js +19 -4
  69. package/dist/memory/card-builders.d.ts +8 -1
  70. package/dist/memory/card-builders.js +20 -3
  71. package/dist/memory/reconstruct-cards.js +4 -3
  72. package/dist/memory/thread-history.d.ts +27 -2
  73. package/dist/memory/thread-history.js +45 -5
  74. package/dist/memory/working-memory.d.ts +93 -10
  75. package/dist/memory/working-memory.js +220 -84
  76. package/dist/prompts/SOUL.d.ts +22 -9
  77. package/dist/prompts/SOUL.js +56 -37
  78. package/dist/prompts/analogical-reasoner.d.ts +1 -1
  79. package/dist/prompts/analogical-reasoner.js +2 -2
  80. package/dist/prompts/briefing.d.ts +100 -0
  81. package/dist/prompts/briefing.js +166 -0
  82. package/dist/prompts/conversation.d.ts +1 -1
  83. package/dist/prompts/conversation.js +94 -440
  84. package/dist/prompts/literature-reviewer.d.ts +1 -1
  85. package/dist/prompts/literature-reviewer.js +10 -10
  86. package/dist/prompts/planner.js +28 -59
  87. package/dist/prompts/report-builder.d.ts +1 -1
  88. package/dist/prompts/report-builder.js +71 -24
  89. package/dist/prompts/sandbox/bulk-transcriptomics-agent.d.ts +1 -1
  90. package/dist/prompts/sandbox/bulk-transcriptomics-agent.js +2 -7
  91. package/dist/prompts/sandbox/cheminformatics-agent.d.ts +1 -1
  92. package/dist/prompts/sandbox/cheminformatics-agent.js +11 -15
  93. package/dist/prompts/sandbox/chromatin-agent.d.ts +1 -1
  94. package/dist/prompts/sandbox/chromatin-agent.js +3 -7
  95. package/dist/prompts/sandbox/data-profiler.d.ts +1 -1
  96. package/dist/prompts/sandbox/data-profiler.js +13 -8
  97. package/dist/prompts/sandbox/dna-methylation-agent.d.ts +1 -1
  98. package/dist/prompts/sandbox/dna-methylation-agent.js +2 -7
  99. package/dist/prompts/sandbox/drug-repurposing-agent.d.ts +1 -1
  100. package/dist/prompts/sandbox/drug-repurposing-agent.js +15 -16
  101. package/dist/prompts/sandbox/enrichment-agent.d.ts +1 -1
  102. package/dist/prompts/sandbox/enrichment-agent.js +2 -9
  103. package/dist/prompts/sandbox/genomic-variant-agent.d.ts +1 -1
  104. package/dist/prompts/sandbox/genomic-variant-agent.js +2 -6
  105. package/dist/prompts/sandbox/immune-profiling-agent.d.ts +1 -1
  106. package/dist/prompts/sandbox/immune-profiling-agent.js +3 -8
  107. package/dist/prompts/sandbox/metabolomics-agent.d.ts +1 -1
  108. package/dist/prompts/sandbox/metabolomics-agent.js +1 -7
  109. package/dist/prompts/sandbox/microbiome-agent.d.ts +1 -1
  110. package/dist/prompts/sandbox/microbiome-agent.js +2 -7
  111. package/dist/prompts/sandbox/multi-omics-integration-agent.d.ts +1 -1
  112. package/dist/prompts/sandbox/multi-omics-integration-agent.js +2 -8
  113. package/dist/prompts/sandbox/multimodal-sc-agent.d.ts +1 -1
  114. package/dist/prompts/sandbox/multimodal-sc-agent.js +2 -7
  115. package/dist/prompts/sandbox/network-agent.d.ts +1 -1
  116. package/dist/prompts/sandbox/network-agent.js +2 -7
  117. package/dist/prompts/sandbox/proteomics-agent.d.ts +1 -1
  118. package/dist/prompts/sandbox/proteomics-agent.js +2 -9
  119. package/dist/prompts/sandbox/single-cell-agent.d.ts +1 -1
  120. package/dist/prompts/sandbox/single-cell-agent.js +2 -9
  121. package/dist/prompts/sandbox/spatial-omics-agent.d.ts +1 -1
  122. package/dist/prompts/sandbox/spatial-omics-agent.js +3 -6
  123. package/dist/prompts/sandbox/statistical-modeling-agent.d.ts +1 -1
  124. package/dist/prompts/sandbox/statistical-modeling-agent.js +2 -7
  125. package/dist/prompts/sandbox/translational-safety-agent.d.ts +1 -1
  126. package/dist/prompts/sandbox/translational-safety-agent.js +13 -14
  127. package/dist/prompts/sandbox-standards.d.ts +22 -14
  128. package/dist/prompts/sandbox-standards.js +91 -71
  129. package/dist/prompts/synthesis-agent.d.ts +1 -1
  130. package/dist/prompts/synthesis-agent.js +33 -131
  131. package/dist/provenance/collector.js +1 -1
  132. package/dist/providers/ai-sdk.js +31 -4
  133. package/dist/providers/prompt-cache.d.ts +74 -0
  134. package/dist/providers/prompt-cache.js +77 -0
  135. package/dist/providers/types.d.ts +33 -0
  136. package/dist/reference-data/catalog.d.ts +131 -0
  137. package/dist/reference-data/catalog.js +348 -0
  138. package/dist/reference-data/receipt.d.ts +41 -0
  139. package/dist/reference-data/receipt.js +40 -0
  140. package/dist/runtime/boot.d.ts +2 -2
  141. package/dist/runtime/boot.js +1 -1
  142. package/dist/runtime/connection-budget.d.ts +2 -2
  143. package/dist/runtime/connection-budget.js +5 -3
  144. package/dist/runtime/dbos.d.ts +7 -7
  145. package/dist/runtime/dbos.js +14 -11
  146. package/dist/runtime/shutdown.d.ts +2 -2
  147. package/dist/runtime/shutdown.js +4 -3
  148. package/dist/sandbox/create-sandbox.d.ts +2 -2
  149. package/dist/sandbox/docker-client.d.ts +2 -2
  150. package/dist/sandbox/docker-client.js +4 -1
  151. package/dist/sandbox/k8s-client.d.ts +3 -0
  152. package/dist/sandbox/k8s-client.js +5 -4
  153. package/dist/sandbox/notification-sweep.d.ts +3 -3
  154. package/dist/sandbox/notification-sweep.js +4 -2
  155. package/dist/sandbox/reaper.d.ts +3 -3
  156. package/dist/sandbox/reaper.js +7 -4
  157. package/dist/sandbox/watchdog.d.ts +3 -3
  158. package/dist/sandbox/watchdog.js +8 -2
  159. package/dist/schemas/data-profile-schemas.js +5 -3
  160. package/dist/schemas/plan-schemas.d.ts +21 -21
  161. package/dist/schemas/plan-schemas.js +9 -3
  162. package/dist/schemas/run-synthesis.d.ts +8 -4
  163. package/dist/schemas/run-synthesis.js +92 -56
  164. package/dist/schemas/validate-plan.js +1 -1
  165. package/dist/schemas/workflow-state.d.ts +7 -1
  166. package/dist/schemas/workflow-state.js +33 -19
  167. package/dist/state/artifacts.d.ts +13 -0
  168. package/dist/state/artifacts.js +27 -0
  169. package/dist/state/data-profile.d.ts +64 -5
  170. package/dist/state/index.d.ts +3 -3
  171. package/dist/state/index.js +1 -1
  172. package/dist/state/init.d.ts +2 -1
  173. package/dist/state/init.js +5 -6
  174. package/dist/tasks/data-profile.d.ts +25 -2
  175. package/dist/tasks/data-profile.js +95 -39
  176. package/dist/tools/bio/chembl.d.ts +38 -0
  177. package/dist/tools/bio/chembl.js +138 -0
  178. package/dist/tools/bio/comptox.d.ts +50 -0
  179. package/dist/tools/bio/comptox.js +149 -0
  180. package/dist/tools/bio/get-impc-ko-profile.js +9 -6
  181. package/dist/tools/bio/index.d.ts +5 -17
  182. package/dist/tools/bio/index.js +5 -17
  183. package/dist/tools/bio/keys.d.ts +14 -9
  184. package/dist/tools/bio/keys.js +16 -16
  185. package/dist/tools/bio/opentargets.d.ts +38 -0
  186. package/dist/tools/bio/opentargets.js +89 -0
  187. package/dist/tools/bio/pubchem.d.ts +29 -0
  188. package/dist/tools/bio/pubchem.js +92 -0
  189. package/dist/tools/bio/pubmed.d.ts +51 -0
  190. package/dist/tools/bio/pubmed.js +100 -0
  191. package/dist/tools/bio/search-bgee-expression.js +12 -6
  192. package/dist/tools/bio/search-clinical-trials.js +16 -5
  193. package/dist/tools/bio/search-dgidb.d.ts +11 -1
  194. package/dist/tools/bio/search-dgidb.js +92 -78
  195. package/dist/tools/bio/search-faers.js +8 -4
  196. package/dist/tools/bio/search-geo-datasets.js +20 -6
  197. package/dist/tools/bio/search-gwas-catalog.d.ts +1 -1
  198. package/dist/tools/bio/search-pharmgkb.js +10 -4
  199. package/dist/tools/display/index.d.ts +1 -0
  200. package/dist/tools/display/index.js +1 -0
  201. package/dist/tools/display/normalize-echart-spec.d.ts +61 -0
  202. package/dist/tools/display/normalize-echart-spec.js +211 -0
  203. package/dist/tools/display/show-user.d.ts +6 -1
  204. package/dist/tools/display/show-user.js +25 -12
  205. package/dist/tools/execute-plan.js +5 -2
  206. package/dist/tools/iterate-report.d.ts +171 -118
  207. package/dist/tools/iterate-report.js +336 -96
  208. package/dist/tools/lib/chembl-client.d.ts +12 -0
  209. package/dist/tools/lib/chembl-client.js +127 -0
  210. package/dist/tools/lib/ctx-ops.d.ts +224 -0
  211. package/dist/tools/lib/ctx-ops.js +450 -0
  212. package/dist/tools/lib/iuphar-client.js +10 -1
  213. package/dist/tools/lib/openfda-client.js +11 -3
  214. package/dist/tools/lib/pathway-client.js +10 -4
  215. package/dist/tools/lib/pubchem-ops.d.ts +74 -0
  216. package/dist/tools/lib/pubchem-ops.js +224 -0
  217. package/dist/tools/memory/update-working-memory.d.ts +45 -7
  218. package/dist/tools/memory/update-working-memory.js +111 -41
  219. package/dist/tools/report/index.d.ts +3 -2
  220. package/dist/tools/report/index.js +3 -2
  221. package/dist/tools/research/generate-analogy-report.js +25 -12
  222. package/dist/tools/research/generate-plan.d.ts +12 -5
  223. package/dist/tools/research/generate-plan.js +168 -37
  224. package/dist/tools/research/index.d.ts +1 -0
  225. package/dist/tools/research/index.js +1 -0
  226. package/dist/tools/research/inspect-data-profile.d.ts +85 -0
  227. package/dist/tools/research/inspect-data-profile.js +161 -0
  228. package/dist/tools/research/literature-reviewer.d.ts +3 -0
  229. package/dist/tools/research/literature-reviewer.js +5 -6
  230. package/dist/tools/sandbox/list-available-packages.d.ts +79 -5
  231. package/dist/tools/sandbox/list-available-packages.js +152 -10
  232. package/dist/tools/sandbox/list-available-refs.d.ts +141 -5
  233. package/dist/tools/sandbox/list-available-refs.js +647 -134
  234. package/dist/tools/sandbox/report-blocker.d.ts +39 -9
  235. package/dist/tools/sandbox/report-blocker.js +43 -20
  236. package/dist/tools/workspace/execute-command.d.ts +3 -0
  237. package/dist/tools/workspace/execute-command.js +3 -1
  238. package/dist/tools/workspace/read-file.js +4 -5
  239. package/dist/tools/workspace/run-exec.d.ts +4 -4
  240. package/dist/tools/workspace/run-exec.js +4 -4
  241. package/dist/tools/workspace/show-file.js +10 -6
  242. package/dist/tools/workspace/show-plan.js +12 -6
  243. package/dist/tools/workspace/workspace-search.d.ts +1 -1
  244. package/dist/tools/workspace/workspace-search.js +11 -5
  245. package/dist/workflows/execute-analysis.d.ts +46 -4
  246. package/dist/workflows/execute-analysis.js +118 -13
  247. package/dist/workflows/execute-target-assessment.d.ts +3 -0
  248. package/dist/workflows/execute-target-assessment.js +19 -15
  249. package/dist/workflows/sandbox-step.d.ts +9 -0
  250. package/dist/workflows/sandbox-step.js +39 -17
  251. package/dist/workflows/target-assessment/lib/citation-validator.js +2 -2
  252. package/dist/workflows/target-assessment/lib/clinical-consequence-annotator.js +2 -1
  253. package/dist/workflows/target-assessment/lib/llm-step.d.ts +3 -0
  254. package/dist/workflows/target-assessment/lib/llm-step.js +3 -1
  255. package/dist/workflows/target-assessment/lib/structured-llm.d.ts +3 -0
  256. package/dist/workflows/target-assessment/lib/structured-llm.js +1 -0
  257. package/dist/workflows/target-assessment/phase5-persist.d.ts +3 -0
  258. package/dist/workflows/target-assessment/phase5-persist.js +8 -3
  259. package/dist/workflows/target-assessment/progress.d.ts +2 -1
  260. package/dist/workflows/target-assessment/progress.js +4 -3
  261. package/dist/workspace/filesystem.js +163 -74
  262. package/dist/workspace/paths.d.ts +2 -2
  263. package/dist/workspace/paths.js +2 -2
  264. package/package.json +95 -96
  265. package/dist/execution/filesystem-artifact-registry.d.ts +0 -57
  266. package/dist/execution/filesystem-artifact-registry.js +0 -92
  267. package/dist/lib/identifiers.d.ts +0 -8
  268. package/dist/lib/identifiers.js +0 -10
  269. package/dist/lib/mime-detect.d.ts +0 -17
  270. package/dist/lib/mime-detect.js +0 -29
  271. package/dist/lib/streamed-download.d.ts +0 -28
  272. package/dist/lib/streamed-download.js +0 -111
  273. package/dist/lib/trace-context.d.ts +0 -11
  274. package/dist/lib/trace-context.js +0 -49
  275. package/dist/providers/llm-capabilities.d.ts +0 -33
  276. package/dist/providers/llm-capabilities.js +0 -58
  277. package/dist/schemas/render-step-prompt.d.ts +0 -32
  278. package/dist/schemas/render-step-prompt.js +0 -76
  279. package/dist/tools/bio/find-approval-precedent.d.ts +0 -32
  280. package/dist/tools/bio/find-approval-precedent.js +0 -72
  281. package/dist/tools/bio/get-article-details.d.ts +0 -11
  282. package/dist/tools/bio/get-article-details.js +0 -20
  283. package/dist/tools/bio/get-article-full-text.d.ts +0 -19
  284. package/dist/tools/bio/get-article-full-text.js +0 -32
  285. package/dist/tools/bio/get-bioactivity.d.ts +0 -11
  286. package/dist/tools/bio/get-bioactivity.js +0 -23
  287. package/dist/tools/bio/get-drug-info.d.ts +0 -9
  288. package/dist/tools/bio/get-drug-info.js +0 -22
  289. package/dist/tools/bio/get-mechanism.d.ts +0 -8
  290. package/dist/tools/bio/get-mechanism.js +0 -18
  291. package/dist/tools/bio/get-pubchem-assays.d.ts +0 -22
  292. package/dist/tools/bio/get-pubchem-assays.js +0 -107
  293. package/dist/tools/bio/get-pubchem-cross-refs.d.ts +0 -15
  294. package/dist/tools/bio/get-pubchem-cross-refs.js +0 -68
  295. package/dist/tools/bio/get-target-safety.d.ts +0 -18
  296. package/dist/tools/bio/get-target-safety.js +0 -26
  297. package/dist/tools/bio/search-compounds.d.ts +0 -22
  298. package/dist/tools/bio/search-compounds.js +0 -160
  299. package/dist/tools/bio/search-ctx-chemical.d.ts +0 -50
  300. package/dist/tools/bio/search-ctx-chemical.js +0 -130
  301. package/dist/tools/bio/search-ctx-exposure.d.ts +0 -55
  302. package/dist/tools/bio/search-ctx-exposure.js +0 -176
  303. package/dist/tools/bio/search-ctx-hazard.d.ts +0 -111
  304. package/dist/tools/bio/search-ctx-hazard.js +0 -178
  305. package/dist/tools/bio/search-opentargets.d.ts +0 -11
  306. package/dist/tools/bio/search-opentargets.js +0 -25
  307. package/dist/tools/bio/search-pubchem-compound.d.ts +0 -26
  308. package/dist/tools/bio/search-pubchem-compound.js +0 -110
  309. package/dist/tools/bio/search-pubmed.d.ts +0 -17
  310. package/dist/tools/bio/search-pubmed.js +0 -31
  311. package/dist/tools/bio/search-targets.d.ts +0 -9
  312. package/dist/tools/bio/search-targets.js +0 -20
  313. package/dist/tools/bio/search-toxcast.d.ts +0 -36
  314. package/dist/tools/bio/search-toxcast.js +0 -141
  315. package/dist/workflows/register-workflows.d.ts +0 -51
  316. package/dist/workflows/register-workflows.js +0 -48
  317. package/dist/workflows/resume-execute-analysis.d.ts +0 -70
  318. package/dist/workflows/resume-execute-analysis.js +0 -80
  319. package/dist/workflows/target-assessment/correction-loop.d.ts +0 -45
  320. package/dist/workflows/target-assessment/correction-loop.js +0 -62
  321. package/dist/workflows/target-assessment/steps/phase0-resolve.d.ts +0 -71
  322. package/dist/workflows/target-assessment/steps/phase0-resolve.js +0 -21
  323. package/dist/workflows/target-assessment/steps/phase1-aggregate.d.ts +0 -1018
  324. package/dist/workflows/target-assessment/steps/phase1-aggregate.js +0 -25
  325. package/dist/workspace/mount-strategy.d.ts +0 -50
  326. package/dist/workspace/mount-strategy.js +0 -67
  327. package/dist/workspace/provenance-collector.d.ts +0 -34
  328. package/dist/workspace/provenance-collector.js +0 -16
  329. package/dist/workspace/workspace-paths.d.ts +0 -26
  330. package/dist/workspace/workspace-paths.js +0 -31
@@ -1,58 +0,0 @@
1
- /**
2
- * Per-model capability gates for harness provider calls.
3
- *
4
- * The harness `ChatRequest` is a passthrough of `MessageCreateParamsBase`,
5
- * so callers already pass per-call overrides (`temperature`, `thinking`,
6
- * tool config, …) as native fields. This module is the silent drop-on-reject
7
- * gate at the provider edge: model-rejected fields are stripped before they
8
- * hit the wire so the call still succeeds (e.g. `acceptsTemperature`).
9
- *
10
- * Classification is pattern-based on the bare model name (no provider
11
- * prefix — the harness `createAnthropicProvider` already knows it is
12
- * Anthropic). No network calls, no runtime probing.
13
- */
14
- /**
15
- * Anthropic Opus/Sonnet/Haiku 4.7+ reject `temperature` with HTTP 400.
16
- * 4.6 and earlier accept it.
17
- */
18
- export function anthropicAcceptsTemperature(modelName) {
19
- return !/^claude-(opus|sonnet|haiku)-4-([7-9]|\d{2,})\b/.test(modelName.toLowerCase());
20
- }
21
- /**
22
- * The model's true maximum output-token ceiling — the `max_tokens` the
23
- * Anthropic provider sets per call (the API requires the field). Pattern-
24
- * matched on the bare model name (no provider prefix). Ceilings per the
25
- * current Anthropic model reference: Opus 4.x → 128K, Sonnet 4.6 → 64K,
26
- * Haiku 4.5 → 64K.
27
- */
28
- export function maxOutputTokens(modelName) {
29
- const name = modelName.toLowerCase();
30
- if (/^claude-opus-4-/.test(name))
31
- return 128_000;
32
- if (/^claude-sonnet-4-/.test(name))
33
- return 64_000;
34
- if (/^claude-haiku-4-/.test(name))
35
- return 64_000;
36
- // Unknown model — a generous default broadly accepted by current models;
37
- // the loop recovers from truncation, so erring high is cheap.
38
- return 32_768;
39
- }
40
- /**
41
- * Map an OpenAI `finish_reason` into the Anthropic `stop_reason` the harness
42
- * loop branches on (see the harness-providers spec — every provider adapts into Anthropic shape).
43
- * The imminent `openai.ts` adapter is the first caller.
44
- */
45
- export function mapOpenAiFinishReason(finishReason) {
46
- switch (finishReason) {
47
- case "length":
48
- return "max_tokens";
49
- case "tool_calls":
50
- return "tool_use";
51
- case "stop":
52
- return "end_turn";
53
- case "content_filter":
54
- return "refusal";
55
- default:
56
- return "end_turn";
57
- }
58
- }
@@ -1,32 +0,0 @@
1
- /**
2
- * Render an AnalysisStep into the user-content prompt the sandbox agent
3
- * receives as its initial message.
4
- *
5
- * The planner writes the bulk of a step's instructions into structured
6
- * fields (`constraints`, `acceptance_criteria`, `context`, `caveats`,
7
- * `description`) alongside the one-line `question`. The execution path
8
- * forwards a single `prompt` string to the sandbox agent, so every
9
- * instruction-bearing field must be folded into that string here — otherwise
10
- * the agent runs against the bare question and improvises the rest.
11
- *
12
- * `STEP_PROMPT_INSTRUCTION_FIELDS` / `STEP_PROMPT_NON_INSTRUCTION_FIELDS`
13
- * partition every AnalysisStep field so the field-coverage guard test can
14
- * fail when a new field is added to the schema without a deliberate decision
15
- * about whether the agent needs to see it.
16
- */
17
- import type { AnalysisStep } from "./workflow-state.js";
18
- /** Fields whose content is agent-facing and MUST appear in the rendered prompt. */
19
- export declare const STEP_PROMPT_INSTRUCTION_FIELDS: readonly ["name", "question", "description", "context", "constraints", "acceptance_criteria", "caveats"];
20
- /**
21
- * Fields deliberately excluded from the prompt: identity/DAG structure
22
- * threaded separately through the workflow input, execution knobs, and
23
- * result fields populated after the step runs.
24
- */
25
- export declare const STEP_PROMPT_NON_INSTRUCTION_FIELDS: readonly ["id", "track", "step_type", "depends_on", "status", "resources", "agent", "timeout", "maxSteps", "summary", "artifactIds", "error"];
26
- /**
27
- * Compose the agent's initial prompt from a plan step. Only the `question`
28
- * is guaranteed present; the remaining instruction fields are appended as
29
- * dedicated sections when populated. Empty strings and empty arrays are
30
- * skipped so a sparse step renders cleanly.
31
- */
32
- export declare function renderStepPrompt(step: AnalysisStep): string;
@@ -1,76 +0,0 @@
1
- /**
2
- * Render an AnalysisStep into the user-content prompt the sandbox agent
3
- * receives as its initial message.
4
- *
5
- * The planner writes the bulk of a step's instructions into structured
6
- * fields (`constraints`, `acceptance_criteria`, `context`, `caveats`,
7
- * `description`) alongside the one-line `question`. The execution path
8
- * forwards a single `prompt` string to the sandbox agent, so every
9
- * instruction-bearing field must be folded into that string here — otherwise
10
- * the agent runs against the bare question and improvises the rest.
11
- *
12
- * `STEP_PROMPT_INSTRUCTION_FIELDS` / `STEP_PROMPT_NON_INSTRUCTION_FIELDS`
13
- * partition every AnalysisStep field so the field-coverage guard test can
14
- * fail when a new field is added to the schema without a deliberate decision
15
- * about whether the agent needs to see it.
16
- */
17
- /** Fields whose content is agent-facing and MUST appear in the rendered prompt. */
18
- export const STEP_PROMPT_INSTRUCTION_FIELDS = [
19
- "name",
20
- "question",
21
- "description",
22
- "context",
23
- "constraints",
24
- "acceptance_criteria",
25
- "caveats",
26
- ];
27
- /**
28
- * Fields deliberately excluded from the prompt: identity/DAG structure
29
- * threaded separately through the workflow input, execution knobs, and
30
- * result fields populated after the step runs.
31
- */
32
- export const STEP_PROMPT_NON_INSTRUCTION_FIELDS = [
33
- "id",
34
- "track",
35
- "step_type",
36
- "depends_on",
37
- "status",
38
- "resources",
39
- "agent",
40
- "timeout",
41
- "maxSteps",
42
- "summary",
43
- "artifactIds",
44
- "error",
45
- ];
46
- function section(heading, body) {
47
- return `## ${heading}\n${body}`;
48
- }
49
- function bullets(items) {
50
- return items.map((i) => `- ${i}`).join("\n");
51
- }
52
- /**
53
- * Compose the agent's initial prompt from a plan step. Only the `question`
54
- * is guaranteed present; the remaining instruction fields are appended as
55
- * dedicated sections when populated. Empty strings and empty arrays are
56
- * skipped so a sparse step renders cleanly.
57
- */
58
- export function renderStepPrompt(step) {
59
- const parts = [`# ${step.name}`, section("Task", step.question)];
60
- if (step.description?.trim()) {
61
- parts.push(section("What this step produces", step.description.trim()));
62
- }
63
- if (step.context?.trim()) {
64
- parts.push(section("Context", step.context.trim()));
65
- }
66
- if (step.constraints && step.constraints.length > 0) {
67
- parts.push(section("Constraints (these are requirements, not suggestions — follow them exactly)", bullets(step.constraints)));
68
- }
69
- if (step.acceptance_criteria && step.acceptance_criteria.length > 0) {
70
- parts.push(section("Acceptance criteria (the result must satisfy all of these)", bullets(step.acceptance_criteria)));
71
- }
72
- if (step.caveats && step.caveats.length > 0) {
73
- parts.push(section("Caveats", bullets(step.caveats)));
74
- }
75
- return parts.join("\n\n");
76
- }
@@ -1,32 +0,0 @@
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 {};
@@ -1,72 +0,0 @@
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
- }
@@ -1,11 +0,0 @@
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
- }>;
@@ -1,20 +0,0 @@
1
- /**
2
- * getArticleDetails — fetch detailed metadata for PubMed articles.
3
- */
4
- import { ok } from "neverthrow";
5
- import { z } from "zod";
6
- import { defineTool } from "../define-tool.js";
7
- import { getArticleDetails } from "../lib/pubmed-client.js";
8
- export function createGetArticleDetailsTool(deps) {
9
- return defineTool({
10
- id: "get_article_details",
11
- description: "Fetch detailed metadata for PubMed articles by PMID. " +
12
- "Returns title, full abstract, authors, journal, year, DOI, MeSH terms, " +
13
- "and PMC ID (if open-access full text is available in PubMed Central). " +
14
- "Accepts up to 20 PMIDs per call for batch retrieval.",
15
- inputSchema: z.object({
16
- pmids: z.array(z.string()).min(1).max(20).describe("PubMed IDs to fetch details for (max 20)"),
17
- }),
18
- execute: async ({ pmids }) => ok(await getArticleDetails(deps.ncbiApiKey, pmids)),
19
- });
20
- }
@@ -1,19 +0,0 @@
1
- /**
2
- * getArticleFullText — fetch full text of open-access articles from PMC.
3
- */
4
- import type { ArticleSection } from "../lib/ncbi-utils.js";
5
- type FullTextResult = {
6
- pmcId: string;
7
- available: false;
8
- } | {
9
- pmcId: string;
10
- available: true;
11
- fullText: string;
12
- sections: ArticleSection[];
13
- };
14
- export declare function createGetArticleFullTextTool(deps: {
15
- ncbiApiKey?: string;
16
- }): import("../define-tool.js").Tool<{
17
- pmcId: string;
18
- }, FullTextResult>;
19
- export {};
@@ -1,32 +0,0 @@
1
- /**
2
- * getArticleFullText — fetch full text of open-access articles from PMC.
3
- */
4
- import { ok } from "neverthrow";
5
- import { z } from "zod";
6
- import { defineTool } from "../define-tool.js";
7
- import { getArticleFullText } from "../lib/pubmed-client.js";
8
- export function createGetArticleFullTextTool(deps) {
9
- return defineTool({
10
- id: "get_article_full_text",
11
- description: "Fetch the full text of an open-access article from PubMed Central (PMC). " +
12
- "Accepts a PMC ID (e.g., 'PMC1234567') as returned by getArticleDetails. " +
13
- "Returns the article body as plain text with section headers preserved. " +
14
- "Only works for open-access articles available in PMC — check the pmcId " +
15
- "field from getArticleDetails before calling this tool.",
16
- inputSchema: z.object({
17
- pmcId: z.string().describe('PubMed Central ID (e.g., "PMC1234567")'),
18
- }),
19
- execute: async ({ pmcId }) => {
20
- const parsed = await getArticleFullText(deps.ncbiApiKey, pmcId);
21
- // "Not open-access" is an expected outcome — a data variant, not an error.
22
- if (!parsed)
23
- return ok({ pmcId, available: false });
24
- return ok({
25
- pmcId,
26
- available: true,
27
- fullText: parsed.fullText,
28
- sections: parsed.sections,
29
- });
30
- },
31
- });
32
- }
@@ -1,11 +0,0 @@
1
- /**
2
- * getBioactivity tool — retrieve bioactivity data (IC50, EC50, Ki) from ChEMBL.
3
- */
4
- export declare const getBioactivityTool: import("../define-tool.js").Tool<{
5
- chemblId: string;
6
- type: "target" | "compound";
7
- limit: number;
8
- activityType?: string | undefined;
9
- }, {
10
- activities: import("../lib/chembl-client.js").ChemblActivity[];
11
- }>;
@@ -1,23 +0,0 @@
1
- /**
2
- * getBioactivity tool — retrieve bioactivity data (IC50, EC50, Ki) from ChEMBL.
3
- */
4
- import { ok } from "neverthrow";
5
- import { z } from "zod";
6
- import { defineTool } from "../define-tool.js";
7
- import { getBioactivity } from "../lib/chembl-client.js";
8
- export const getBioactivityTool = defineTool({
9
- id: "get_bioactivity",
10
- description: "Get bioactivity data (IC50, EC50, Ki, etc.) from ChEMBL for a compound or target. " +
11
- "Returns activity values, assay information, and pChEMBL values. " +
12
- "Optionally filter by activity type (e.g. 'IC50', 'EC50', 'Ki').",
13
- inputSchema: z.object({
14
- chemblId: z.string().min(1).describe("ChEMBL ID (e.g. 'CHEMBL25' for aspirin, 'CHEMBL203' for EGFR target)"),
15
- type: z.enum(["compound", "target"]).describe("Whether the ChEMBL ID refers to a compound or a target"),
16
- activityType: z.string().optional().describe("Filter by standard_type (e.g. 'IC50', 'EC50', 'Ki')"),
17
- limit: z.number().int().min(1).max(500).default(500).describe("Maximum number of activity records to return"),
18
- }),
19
- execute: async ({ chemblId, type, activityType, limit }) => {
20
- const activities = await getBioactivity(chemblId, type, { activityType, limit });
21
- return ok({ activities });
22
- },
23
- });
@@ -1,9 +0,0 @@
1
- /**
2
- * getDrugInfo tool — search ChEMBL for approved drugs by indication or name.
3
- */
4
- export declare const getDrugInfoTool: import("../define-tool.js").Tool<{
5
- query: string;
6
- limit: number;
7
- }, {
8
- drugs: import("../lib/chembl-client.js").ChemblDrug[];
9
- }>;
@@ -1,22 +0,0 @@
1
- /**
2
- * getDrugInfo tool — search ChEMBL for approved drugs by indication or name.
3
- */
4
- import { ok } from "neverthrow";
5
- import { z } from "zod";
6
- import { defineTool } from "../define-tool.js";
7
- import { getDrugInfo } from "../lib/chembl-client.js";
8
- export const getDrugInfoTool = defineTool({
9
- id: "get_drug_info",
10
- description: "Search ChEMBL for approved drugs by indication or drug name. " +
11
- "Returns drug metadata including approval phase, molecule type, " +
12
- "first approval year, and indications. Falls back to molecule search " +
13
- "filtered by max_phase >= 4 if the drug endpoint yields no results.",
14
- inputSchema: z.object({
15
- query: z.string().min(1).describe("Drug name or indication to search for (e.g. 'imatinib', 'breast cancer')"),
16
- limit: z.number().int().min(1).max(25).default(25).describe("Maximum number of results to return"),
17
- }),
18
- execute: async ({ query, limit }) => {
19
- const drugs = await getDrugInfo(query, limit);
20
- return ok({ drugs });
21
- },
22
- });
@@ -1,8 +0,0 @@
1
- /**
2
- * getMechanism tool — retrieve mechanism of action data from ChEMBL.
3
- */
4
- export declare const getMechanismTool: import("../define-tool.js").Tool<{
5
- chemblId: string;
6
- }, {
7
- mechanisms: import("../lib/chembl-client.js").ChemblMechanism[];
8
- }>;
@@ -1,18 +0,0 @@
1
- /**
2
- * getMechanism tool — retrieve mechanism of action data from ChEMBL.
3
- */
4
- import { ok } from "neverthrow";
5
- import { z } from "zod";
6
- import { defineTool } from "../define-tool.js";
7
- import { getMechanism } from "../lib/chembl-client.js";
8
- export const getMechanismTool = defineTool({
9
- id: "get_mechanism",
10
- description: "Get mechanism of action for a compound from ChEMBL. " + "Returns mechanism descriptions, action types, and associated target information.",
11
- inputSchema: z.object({
12
- chemblId: z.string().min(1).describe("Compound ChEMBL ID (e.g. 'CHEMBL25' for aspirin)"),
13
- }),
14
- execute: async ({ chemblId }) => {
15
- const mechanisms = await getMechanism(chemblId);
16
- return ok({ mechanisms });
17
- },
18
- });
@@ -1,22 +0,0 @@
1
- /**
2
- * getPubchemAssays tool — retrieve bioassay screening summaries for a PubChem CID.
3
- *
4
- * Returns per-assay activity outcomes (active/inactive/inconclusive),
5
- * target names, and assay descriptions. Broader coverage than ChEMBL's
6
- * curated bioactivity data.
7
- */
8
- interface Assay {
9
- aid: number;
10
- assayName: string | null;
11
- targetName: string | null;
12
- activityOutcome: string | null;
13
- activityValue: number | null;
14
- }
15
- export declare const getPubchemAssaysTool: import("../define-tool.js").Tool<{
16
- cid: number;
17
- activeOnly: boolean;
18
- limit: number;
19
- }, {
20
- assays: Assay[];
21
- }>;
22
- export {};
@@ -1,107 +0,0 @@
1
- /**
2
- * getPubchemAssays tool — retrieve bioassay screening summaries for a PubChem CID.
3
- *
4
- * Returns per-assay activity outcomes (active/inactive/inconclusive),
5
- * target names, and assay descriptions. Broader coverage than ChEMBL's
6
- * curated bioactivity data.
7
- */
8
- import { ok } from "neverthrow";
9
- import { z } from "zod";
10
- import { defineTool } from "../define-tool.js";
11
- import { apiFetchValidated, describeApiError } from "../lib/api-utils.js";
12
- import { PUBCHEM_HEADERS as HEADERS, PUBCHEM_BASE } from "../lib/pubchem-config.js";
13
- // The PUG-REST assay-summary wire shape (a table of columns + rows), validated
14
- // at the fetch boundary; `parseAssaySummary` maps the heading-indexed cells into
15
- // `Assay` records. Every field is optional — PubChem omits absent values.
16
- const PugAssaySummarySchema = z.object({
17
- Table: z
18
- .object({
19
- Columns: z
20
- .object({
21
- Column: z.array(z.object({ Heading: z.string().optional() })).optional(),
22
- })
23
- .optional(),
24
- Row: z
25
- .array(z.object({
26
- Cell: z
27
- .array(z.object({
28
- intval: z.number().optional(),
29
- fval: z.number().optional(),
30
- sval: z.string().optional(),
31
- }))
32
- .optional(),
33
- }))
34
- .optional(),
35
- })
36
- .optional(),
37
- });
38
- function parseAssaySummary(data) {
39
- const columns = data.Table?.Columns?.Column ?? [];
40
- const rows = data.Table?.Row ?? [];
41
- // Find column indices by heading
42
- const headingIndex = new Map();
43
- for (let i = 0; i < columns.length; i++) {
44
- if (columns[i].Heading) {
45
- headingIndex.set(columns[i].Heading, i);
46
- }
47
- }
48
- const aidIdx = headingIndex.get("AID");
49
- const nameIdx = headingIndex.get("AssayName");
50
- const targetIdx = headingIndex.get("TargetName");
51
- const outcomeIdx = headingIndex.get("ActivityOutcome");
52
- const valueIdx = headingIndex.get("ActivityValue");
53
- const results = [];
54
- for (const row of rows) {
55
- const cells = row.Cell ?? [];
56
- const getCellStr = (idx) => {
57
- if (idx === undefined || idx >= cells.length)
58
- return null;
59
- return cells[idx]?.sval ?? null;
60
- };
61
- const getCellNum = (idx) => {
62
- if (idx === undefined || idx >= cells.length)
63
- return null;
64
- const cell = cells[idx];
65
- if (cell?.fval !== undefined)
66
- return cell.fval;
67
- if (cell?.intval !== undefined)
68
- return cell.intval;
69
- return null;
70
- };
71
- results.push({
72
- aid: getCellNum(aidIdx) ?? 0,
73
- assayName: getCellStr(nameIdx),
74
- targetName: getCellStr(targetIdx),
75
- activityOutcome: getCellStr(outcomeIdx),
76
- activityValue: getCellNum(valueIdx),
77
- });
78
- }
79
- return results;
80
- }
81
- export const getPubchemAssaysTool = defineTool({
82
- id: "get_pubchem_assays",
83
- description: "Get bioassay screening summaries for a PubChem CID. " +
84
- "Returns per-assay activity outcomes (Active/Inactive/Inconclusive), target names, " +
85
- "and activity values. Covers HTS screening data beyond ChEMBL's curated bioactivity. " +
86
- "Use activeOnly=true to filter for active results only.",
87
- inputSchema: z.object({
88
- cid: z.number().int().positive().describe("PubChem Compound ID (CID)"),
89
- activeOnly: z.boolean().default(false).describe("If true, return only assays where the compound was active"),
90
- limit: z.number().int().min(1).max(500).default(50).describe("Maximum number of assay records to return"),
91
- }),
92
- execute: async ({ cid, activeOnly = false, limit = 50 }) => {
93
- const url = `${PUBCHEM_BASE}/compound/cid/${cid}/assaysummary/JSON`;
94
- const res = await apiFetchValidated(url, PugAssaySummarySchema, { headers: HEADERS });
95
- if (res.isErr()) {
96
- // PubChem returns 404 when the CID has no assay data — expected.
97
- if (res.error.type === "http_status" && res.error.status === 404)
98
- return ok({ assays: [] });
99
- throw new Error(describeApiError(res.error));
100
- }
101
- let assays = parseAssaySummary(res.value);
102
- if (activeOnly) {
103
- assays = assays.filter((a) => a.activityOutcome?.toLowerCase() === "active");
104
- }
105
- return ok({ assays: assays.slice(0, limit) });
106
- },
107
- });
@@ -1,15 +0,0 @@
1
- /**
2
- * getPubchemCrossRefs tool — retrieve external database identifiers for a PubChem CID.
3
- *
4
- * Bridges PubChem compounds to ChEMBL, DrugBank, KEGG, PDB, and other registries.
5
- */
6
- interface CrossRefEntry {
7
- source: string;
8
- id: string;
9
- }
10
- export declare const getPubchemCrossRefsTool: import("../define-tool.js").Tool<{
11
- cid: number;
12
- }, {
13
- crossRefs: CrossRefEntry[];
14
- }>;
15
- export {};