@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.
- package/LICENSE +202 -0
- package/NOTICE +5 -0
- package/README.md +58 -0
- package/dist/agents/conversation-agent.d.ts +105 -0
- package/dist/agents/conversation-agent.js +140 -0
- package/dist/agents/report-builder.d.ts +32 -0
- package/dist/agents/report-builder.js +31 -0
- package/dist/agents/sandbox/__fixtures__/deps.d.ts +23 -0
- package/dist/agents/sandbox/__fixtures__/deps.js +96 -0
- package/dist/agents/sandbox/bulk-transcriptomics-agent.d.ts +8 -0
- package/dist/agents/sandbox/bulk-transcriptomics-agent.js +22 -0
- package/dist/agents/sandbox/cheminformatics-agent.d.ts +9 -0
- package/dist/agents/sandbox/cheminformatics-agent.js +62 -0
- package/dist/agents/sandbox/chromatin-agent.d.ts +8 -0
- package/dist/agents/sandbox/chromatin-agent.js +24 -0
- package/dist/agents/sandbox/data-profiler.d.ts +10 -0
- package/dist/agents/sandbox/data-profiler.js +24 -0
- package/dist/agents/sandbox/dna-methylation-agent.d.ts +8 -0
- package/dist/agents/sandbox/dna-methylation-agent.js +24 -0
- package/dist/agents/sandbox/drug-repurposing-agent.d.ts +8 -0
- package/dist/agents/sandbox/drug-repurposing-agent.js +54 -0
- package/dist/agents/sandbox/enrichment-agent.d.ts +8 -0
- package/dist/agents/sandbox/enrichment-agent.js +24 -0
- package/dist/agents/sandbox/ephemeral-executor.d.ts +9 -0
- package/dist/agents/sandbox/ephemeral-executor.js +29 -0
- package/dist/agents/sandbox/genomic-variant-agent.d.ts +8 -0
- package/dist/agents/sandbox/genomic-variant-agent.js +27 -0
- package/dist/agents/sandbox/immune-profiling-agent.d.ts +8 -0
- package/dist/agents/sandbox/immune-profiling-agent.js +43 -0
- package/dist/agents/sandbox/index.d.ts +31 -0
- package/dist/agents/sandbox/index.js +96 -0
- package/dist/agents/sandbox/metabolomics-agent.d.ts +8 -0
- package/dist/agents/sandbox/metabolomics-agent.js +15 -0
- package/dist/agents/sandbox/microbiome-agent.d.ts +8 -0
- package/dist/agents/sandbox/microbiome-agent.js +15 -0
- package/dist/agents/sandbox/multi-omics-integration-agent.d.ts +8 -0
- package/dist/agents/sandbox/multi-omics-integration-agent.js +33 -0
- package/dist/agents/sandbox/multimodal-sc-agent.d.ts +8 -0
- package/dist/agents/sandbox/multimodal-sc-agent.js +15 -0
- package/dist/agents/sandbox/network-agent.d.ts +8 -0
- package/dist/agents/sandbox/network-agent.js +25 -0
- package/dist/agents/sandbox/pkpd-clinical-response-agent.d.ts +8 -0
- package/dist/agents/sandbox/pkpd-clinical-response-agent.js +59 -0
- package/dist/agents/sandbox/proteomics-agent.d.ts +8 -0
- package/dist/agents/sandbox/proteomics-agent.js +15 -0
- package/dist/agents/sandbox/scientific-executor.d.ts +9 -0
- package/dist/agents/sandbox/scientific-executor.js +56 -0
- package/dist/agents/sandbox/shared.d.ts +100 -0
- package/dist/agents/sandbox/shared.js +195 -0
- package/dist/agents/sandbox/single-cell-agent.d.ts +8 -0
- package/dist/agents/sandbox/single-cell-agent.js +25 -0
- package/dist/agents/sandbox/spatial-omics-agent.d.ts +8 -0
- package/dist/agents/sandbox/spatial-omics-agent.js +15 -0
- package/dist/agents/sandbox/statistical-modeling-agent.d.ts +8 -0
- package/dist/agents/sandbox/statistical-modeling-agent.js +37 -0
- package/dist/agents/sandbox/translational-safety-agent.d.ts +8 -0
- package/dist/agents/sandbox/translational-safety-agent.js +59 -0
- package/dist/agents/sandbox/types.d.ts +34 -0
- package/dist/agents/sandbox/types.js +15 -0
- package/dist/agents/sandbox/validate-skills.d.ts +18 -0
- package/dist/agents/sandbox/validate-skills.js +40 -0
- package/dist/agents/sandbox-catalog.d.ts +33 -0
- package/dist/agents/sandbox-catalog.js +44 -0
- package/dist/agents/system-prompt.d.ts +25 -0
- package/dist/agents/system-prompt.js +23 -0
- package/dist/app/chat-turn.d.ts +35 -0
- package/dist/app/chat-turn.js +64 -0
- package/dist/app/data-profile-policy.d.ts +36 -0
- package/dist/app/data-profile-policy.js +37 -0
- package/dist/app/message-assembly.d.ts +65 -0
- package/dist/app/message-assembly.js +61 -0
- package/dist/app/synthesize-run.d.ts +57 -0
- package/dist/app/synthesize-run.js +103 -0
- package/dist/auth/local-auth-context.d.ts +19 -0
- package/dist/auth/local-auth-context.js +20 -0
- package/dist/auth/local-run-authorizer.d.ts +10 -0
- package/dist/auth/local-run-authorizer.js +23 -0
- package/dist/auth/types.d.ts +166 -0
- package/dist/auth/types.js +61 -0
- package/dist/billing/cached-resolver.d.ts +23 -0
- package/dist/billing/cached-resolver.js +61 -0
- package/dist/billing/noop-resolver.d.ts +6 -0
- package/dist/billing/noop-resolver.js +7 -0
- package/dist/billing/noop-run-charge.d.ts +6 -0
- package/dist/billing/noop-run-charge.js +10 -0
- package/dist/billing/resolver.d.ts +64 -0
- package/dist/billing/resolver.js +24 -0
- package/dist/billing/run-charge.d.ts +24 -0
- package/dist/billing/run-charge.js +9 -0
- package/dist/config/resource-limits.d.ts +76 -0
- package/dist/config/resource-limits.js +116 -0
- package/dist/contracts/analogy-report.d.ts +120 -0
- package/dist/contracts/analogy-report.js +50 -0
- package/dist/contracts/chat-events.d.ts +61 -0
- package/dist/contracts/chat-events.js +13 -0
- package/dist/contracts/chat-parts.d.ts +308 -0
- package/dist/contracts/chat-parts.js +13 -0
- package/dist/contracts/content-url.d.ts +49 -0
- package/dist/contracts/content-url.js +56 -0
- package/dist/contracts/index.d.ts +12 -0
- package/dist/contracts/index.js +5 -0
- package/dist/contracts/message.d.ts +36 -0
- package/dist/contracts/message.js +9 -0
- package/dist/contracts/part-registry.d.ts +18 -0
- package/dist/contracts/part-registry.js +28 -0
- package/dist/contracts/schemas/chat-events.d.ts +90 -0
- package/dist/contracts/schemas/chat-events.js +43 -0
- package/dist/contracts/schemas/chat-parts.d.ts +683 -0
- package/dist/contracts/schemas/chat-parts.js +295 -0
- package/dist/contracts/schemas/index.d.ts +2 -0
- package/dist/contracts/schemas/index.js +2 -0
- package/dist/contracts/target-assessment-row.d.ts +85 -0
- package/dist/contracts/target-assessment-row.js +37 -0
- package/dist/contracts/target-dossier.d.ts +16720 -0
- package/dist/contracts/target-dossier.js +1339 -0
- package/dist/data/clinical-benchmarks.json +108 -0
- package/dist/data/protein-family-modality.json +101 -0
- package/dist/data/safety-panel-schema.d.ts +64 -0
- package/dist/data/safety-panel-schema.js +34 -0
- package/dist/data/safety-panel.json +436 -0
- package/dist/execution/artifact-metadata.d.ts +74 -0
- package/dist/execution/artifact-metadata.js +203 -0
- package/dist/execution/artifact-record.d.ts +19 -0
- package/dist/execution/artifact-record.js +7 -0
- package/dist/execution/artifact-registration.d.ts +36 -0
- package/dist/execution/artifact-registration.js +61 -0
- package/dist/execution/artifact-registry.d.ts +82 -0
- package/dist/execution/artifact-registry.js +17 -0
- package/dist/execution/dbos-run-launcher.d.ts +7 -0
- package/dist/execution/dbos-run-launcher.js +38 -0
- package/dist/execution/ephemeral-runner.d.ts +81 -0
- package/dist/execution/ephemeral-runner.js +161 -0
- package/dist/execution/filesystem-artifact-registry.d.ts +57 -0
- package/dist/execution/filesystem-artifact-registry.js +92 -0
- package/dist/execution/noop-artifact-registry.d.ts +11 -0
- package/dist/execution/noop-artifact-registry.js +17 -0
- package/dist/execution/post-step-pipeline.d.ts +70 -0
- package/dist/execution/post-step-pipeline.js +207 -0
- package/dist/execution/post-step.d.ts +20 -0
- package/dist/execution/post-step.js +65 -0
- package/dist/execution/reconcile-manifest.d.ts +25 -0
- package/dist/execution/reconcile-manifest.js +132 -0
- package/dist/execution/report-render.d.ts +39 -0
- package/dist/execution/report-render.js +98 -0
- package/dist/execution/report-runner.d.ts +87 -0
- package/dist/execution/report-runner.js +227 -0
- package/dist/execution/run-authorizer.d.ts +43 -0
- package/dist/execution/run-authorizer.js +17 -0
- package/dist/execution/run-launcher.d.ts +36 -0
- package/dist/execution/run-launcher.js +15 -0
- package/dist/execution/run-synthesis.d.ts +107 -0
- package/dist/execution/run-synthesis.js +329 -0
- package/dist/execution/staged-input.d.ts +41 -0
- package/dist/execution/staged-input.js +15 -0
- package/dist/execution/step-summary-metrics.d.ts +10 -0
- package/dist/execution/step-summary-metrics.js +22 -0
- package/dist/execution/step-summary.d.ts +55 -0
- package/dist/execution/step-summary.js +106 -0
- package/dist/execution/topo-sort.d.ts +33 -0
- package/dist/execution/topo-sort.js +99 -0
- package/dist/index.d.ts +112 -0
- package/dist/index.js +157 -0
- package/dist/input-sanitization.d.ts +22 -0
- package/dist/input-sanitization.js +64 -0
- package/dist/lib/async-utils.d.ts +10 -0
- package/dist/lib/async-utils.js +24 -0
- package/dist/lib/chrome.d.ts +15 -0
- package/dist/lib/chrome.js +95 -0
- package/dist/lib/db-result.d.ts +93 -0
- package/dist/lib/db-result.js +197 -0
- package/dist/lib/fs-helpers.d.ts +74 -0
- package/dist/lib/fs-helpers.js +119 -0
- package/dist/lib/fs-result.d.ts +98 -0
- package/dist/lib/fs-result.js +137 -0
- package/dist/lib/host-concurrency.d.ts +16 -0
- package/dist/lib/host-concurrency.js +60 -0
- package/dist/lib/identifiers.d.ts +8 -0
- package/dist/lib/identifiers.js +10 -0
- package/dist/lib/metrics.d.ts +7 -0
- package/dist/lib/metrics.js +12 -0
- package/dist/lib/mime-detect.d.ts +17 -0
- package/dist/lib/mime-detect.js +29 -0
- package/dist/lib/otel.d.ts +30 -0
- package/dist/lib/otel.js +102 -0
- package/dist/lib/regulatory-corpus/fetch-fda-guidance.d.ts +35 -0
- package/dist/lib/regulatory-corpus/fetch-fda-guidance.js +107 -0
- package/dist/lib/regulatory-corpus/fetch-ich.d.ts +46 -0
- package/dist/lib/regulatory-corpus/fetch-ich.js +173 -0
- package/dist/lib/regulatory-corpus.d.ts +88 -0
- package/dist/lib/regulatory-corpus.js +141 -0
- package/dist/lib/result.d.ts +87 -0
- package/dist/lib/result.js +103 -0
- package/dist/lib/storage.d.ts +29 -0
- package/dist/lib/storage.js +37 -0
- package/dist/lib/streamed-download.d.ts +28 -0
- package/dist/lib/streamed-download.js +111 -0
- package/dist/lib/trace-context.d.ts +11 -0
- package/dist/lib/trace-context.js +49 -0
- package/dist/loop/__fixtures__/scripted-provider.d.ts +31 -0
- package/dist/loop/__fixtures__/scripted-provider.js +57 -0
- package/dist/loop/budget-exceeded.d.ts +22 -0
- package/dist/loop/budget-exceeded.js +41 -0
- package/dist/loop/metrics.d.ts +25 -0
- package/dist/loop/metrics.js +46 -0
- package/dist/loop/run-agent.d.ts +28 -0
- package/dist/loop/run-agent.js +204 -0
- package/dist/loop/run-step.d.ts +29 -0
- package/dist/loop/run-step.js +34 -0
- package/dist/loop/run-to-terminal.d.ts +46 -0
- package/dist/loop/run-to-terminal.js +51 -0
- package/dist/loop/types.d.ts +95 -0
- package/dist/loop/types.js +10 -0
- package/dist/memory/ai-sdk-message-storage.d.ts +20 -0
- package/dist/memory/ai-sdk-message-storage.js +114 -0
- package/dist/memory/card-builders.d.ts +114 -0
- package/dist/memory/card-builders.js +231 -0
- package/dist/memory/content-to-cortex.d.ts +42 -0
- package/dist/memory/content-to-cortex.js +85 -0
- package/dist/memory/count-tokens.d.ts +18 -0
- package/dist/memory/count-tokens.js +64 -0
- package/dist/memory/derive-thread-title.d.ts +14 -0
- package/dist/memory/derive-thread-title.js +26 -0
- package/dist/memory/message-backfill.d.ts +2 -0
- package/dist/memory/message-backfill.js +38 -0
- package/dist/memory/reconstruct-cards.d.ts +23 -0
- package/dist/memory/reconstruct-cards.js +64 -0
- package/dist/memory/thread-history.d.ts +80 -0
- package/dist/memory/thread-history.js +187 -0
- package/dist/memory/thread-store.d.ts +66 -0
- package/dist/memory/thread-store.js +88 -0
- package/dist/memory/working-memory.d.ts +135 -0
- package/dist/memory/working-memory.js +185 -0
- package/dist/prompts/SOUL.d.ts +17 -0
- package/dist/prompts/SOUL.js +173 -0
- package/dist/prompts/analogical-reasoner.d.ts +1 -0
- package/dist/prompts/analogical-reasoner.js +170 -0
- package/dist/prompts/conversation.d.ts +1 -0
- package/dist/prompts/conversation.js +697 -0
- package/dist/prompts/execute-analysis/step-summary.d.ts +1 -0
- package/dist/prompts/execute-analysis/step-summary.js +38 -0
- package/dist/prompts/literature-reviewer.d.ts +1 -0
- package/dist/prompts/literature-reviewer.js +107 -0
- package/dist/prompts/planner.d.ts +2 -0
- package/dist/prompts/planner.js +259 -0
- package/dist/prompts/report-builder.d.ts +1 -0
- package/dist/prompts/report-builder.js +127 -0
- package/dist/prompts/sandbox/bulk-transcriptomics-agent.d.ts +1 -0
- package/dist/prompts/sandbox/bulk-transcriptomics-agent.js +78 -0
- package/dist/prompts/sandbox/cheminformatics-agent.d.ts +1 -0
- package/dist/prompts/sandbox/cheminformatics-agent.js +224 -0
- package/dist/prompts/sandbox/chromatin-agent.d.ts +1 -0
- package/dist/prompts/sandbox/chromatin-agent.js +100 -0
- package/dist/prompts/sandbox/data-profiler.d.ts +1 -0
- package/dist/prompts/sandbox/data-profiler.js +291 -0
- package/dist/prompts/sandbox/dna-methylation-agent.d.ts +1 -0
- package/dist/prompts/sandbox/dna-methylation-agent.js +96 -0
- package/dist/prompts/sandbox/drug-repurposing-agent.d.ts +1 -0
- package/dist/prompts/sandbox/drug-repurposing-agent.js +144 -0
- package/dist/prompts/sandbox/enrichment-agent.d.ts +1 -0
- package/dist/prompts/sandbox/enrichment-agent.js +89 -0
- package/dist/prompts/sandbox/ephemeral-executor.d.ts +1 -0
- package/dist/prompts/sandbox/ephemeral-executor.js +66 -0
- package/dist/prompts/sandbox/genomic-variant-agent.d.ts +1 -0
- package/dist/prompts/sandbox/genomic-variant-agent.js +83 -0
- package/dist/prompts/sandbox/immune-profiling-agent.d.ts +1 -0
- package/dist/prompts/sandbox/immune-profiling-agent.js +101 -0
- package/dist/prompts/sandbox/metabolomics-agent.d.ts +1 -0
- package/dist/prompts/sandbox/metabolomics-agent.js +89 -0
- package/dist/prompts/sandbox/microbiome-agent.d.ts +1 -0
- package/dist/prompts/sandbox/microbiome-agent.js +109 -0
- package/dist/prompts/sandbox/multi-omics-integration-agent.d.ts +1 -0
- package/dist/prompts/sandbox/multi-omics-integration-agent.js +122 -0
- package/dist/prompts/sandbox/multimodal-sc-agent.d.ts +1 -0
- package/dist/prompts/sandbox/multimodal-sc-agent.js +90 -0
- package/dist/prompts/sandbox/network-agent.d.ts +1 -0
- package/dist/prompts/sandbox/network-agent.js +95 -0
- package/dist/prompts/sandbox/pkpd-clinical-response-agent.d.ts +1 -0
- package/dist/prompts/sandbox/pkpd-clinical-response-agent.js +71 -0
- package/dist/prompts/sandbox/proteomics-agent.d.ts +1 -0
- package/dist/prompts/sandbox/proteomics-agent.js +93 -0
- package/dist/prompts/sandbox/scientific-executor.d.ts +1 -0
- package/dist/prompts/sandbox/scientific-executor.js +68 -0
- package/dist/prompts/sandbox/single-cell-agent.d.ts +1 -0
- package/dist/prompts/sandbox/single-cell-agent.js +129 -0
- package/dist/prompts/sandbox/spatial-omics-agent.d.ts +1 -0
- package/dist/prompts/sandbox/spatial-omics-agent.js +94 -0
- package/dist/prompts/sandbox/statistical-modeling-agent.d.ts +1 -0
- package/dist/prompts/sandbox/statistical-modeling-agent.js +112 -0
- package/dist/prompts/sandbox/translational-safety-agent.d.ts +1 -0
- package/dist/prompts/sandbox/translational-safety-agent.js +105 -0
- package/dist/prompts/sandbox-standards.d.ts +18 -0
- package/dist/prompts/sandbox-standards.js +358 -0
- package/dist/prompts/synthesis-agent.d.ts +1 -0
- package/dist/prompts/synthesis-agent.js +289 -0
- package/dist/prompts/target-assessment/briefs/executive-recommendation.d.ts +1 -0
- package/dist/prompts/target-assessment/briefs/executive-recommendation.js +85 -0
- package/dist/prompts/target-assessment/briefs/index.d.ts +4 -0
- package/dist/prompts/target-assessment/briefs/index.js +4 -0
- package/dist/prompts/target-assessment/briefs/liability-bullets.d.ts +1 -0
- package/dist/prompts/target-assessment/briefs/liability-bullets.js +114 -0
- package/dist/prompts/target-assessment/briefs/target-organ-liabilities.d.ts +1 -0
- package/dist/prompts/target-assessment/briefs/target-organ-liabilities.js +29 -0
- package/dist/prompts/target-assessment/briefs/translational-commentary.d.ts +1 -0
- package/dist/prompts/target-assessment/briefs/translational-commentary.js +23 -0
- package/dist/prompts/target-assessment/drugs-in-class.d.ts +1 -0
- package/dist/prompts/target-assessment/drugs-in-class.js +29 -0
- package/dist/prompts/target-assessment/modulator-triage.d.ts +1 -0
- package/dist/prompts/target-assessment/modulator-triage.js +31 -0
- package/dist/prompts/target-assessment/off-target-annotator.d.ts +1 -0
- package/dist/prompts/target-assessment/off-target-annotator.js +28 -0
- package/dist/prompts/target-assessment/tox-voice/core.d.ts +1 -0
- package/dist/prompts/target-assessment/tox-voice/core.js +74 -0
- package/dist/prompts/target-assessment/tox-voice/critique.d.ts +7 -0
- package/dist/prompts/target-assessment/tox-voice/critique.js +109 -0
- package/dist/prompts/target-assessment/tox-voice/exemplars.d.ts +8 -0
- package/dist/prompts/target-assessment/tox-voice/exemplars.js +24 -0
- package/dist/prompts/target-assessment/tox-voice/index.d.ts +4 -0
- package/dist/prompts/target-assessment/tox-voice/index.js +4 -0
- package/dist/prompts/target-assessment/tox-voice/vocabulary.d.ts +15 -0
- package/dist/prompts/target-assessment/tox-voice/vocabulary.js +72 -0
- package/dist/provenance/collector.d.ts +148 -0
- package/dist/provenance/collector.js +296 -0
- package/dist/provenance/exec-frame.d.ts +36 -0
- package/dist/provenance/exec-frame.js +49 -0
- package/dist/provenance/types.d.ts +95 -0
- package/dist/provenance/types.js +64 -0
- package/dist/providers/__fixtures__/session.d.ts +16 -0
- package/dist/providers/__fixtures__/session.js +20 -0
- package/dist/providers/ai-sdk.d.ts +47 -0
- package/dist/providers/ai-sdk.js +142 -0
- package/dist/providers/anthropic.d.ts +22 -0
- package/dist/providers/anthropic.js +26 -0
- package/dist/providers/embedding.d.ts +32 -0
- package/dist/providers/embedding.js +42 -0
- package/dist/providers/errors.d.ts +80 -0
- package/dist/providers/errors.js +137 -0
- package/dist/providers/llm-capabilities.d.ts +33 -0
- package/dist/providers/llm-capabilities.js +58 -0
- package/dist/providers/streaming-chat.d.ts +23 -0
- package/dist/providers/streaming-chat.js +61 -0
- package/dist/providers/types.d.ts +59 -0
- package/dist/providers/types.js +8 -0
- package/dist/runtime/assemble.d.ts +68 -0
- package/dist/runtime/assemble.js +46 -0
- package/dist/runtime/boot.d.ts +73 -0
- package/dist/runtime/boot.js +65 -0
- package/dist/runtime/connection-budget.d.ts +48 -0
- package/dist/runtime/connection-budget.js +57 -0
- package/dist/runtime/dbos.d.ts +94 -0
- package/dist/runtime/dbos.js +160 -0
- package/dist/runtime/lifecycle.d.ts +12 -0
- package/dist/runtime/lifecycle.js +19 -0
- package/dist/runtime/pools.d.ts +25 -0
- package/dist/runtime/pools.js +30 -0
- package/dist/runtime/shutdown.d.ts +33 -0
- package/dist/runtime/shutdown.js +39 -0
- package/dist/sandbox/await-exec.d.ts +143 -0
- package/dist/sandbox/await-exec.js +406 -0
- package/dist/sandbox/client.d.ts +82 -0
- package/dist/sandbox/client.js +23 -0
- package/dist/sandbox/create-sandbox.d.ts +105 -0
- package/dist/sandbox/create-sandbox.js +132 -0
- package/dist/sandbox/deliver-exec-event.d.ts +25 -0
- package/dist/sandbox/deliver-exec-event.js +29 -0
- package/dist/sandbox/docker-client.d.ts +75 -0
- package/dist/sandbox/docker-client.js +315 -0
- package/dist/sandbox/estimate-data-profile-resources.d.ts +5 -0
- package/dist/sandbox/estimate-data-profile-resources.js +73 -0
- package/dist/sandbox/exec-id.d.ts +12 -0
- package/dist/sandbox/exec-id.js +20 -0
- package/dist/sandbox/execution-id.d.ts +30 -0
- package/dist/sandbox/execution-id.js +47 -0
- package/dist/sandbox/hmac.d.ts +54 -0
- package/dist/sandbox/hmac.js +67 -0
- package/dist/sandbox/identity.d.ts +15 -0
- package/dist/sandbox/identity.js +22 -0
- package/dist/sandbox/ignored-dirs.d.ts +7 -0
- package/dist/sandbox/ignored-dirs.js +7 -0
- package/dist/sandbox/k8s-client.d.ts +71 -0
- package/dist/sandbox/k8s-client.js +488 -0
- package/dist/sandbox/liveness.d.ts +60 -0
- package/dist/sandbox/liveness.js +82 -0
- package/dist/sandbox/mount-plan.d.ts +77 -0
- package/dist/sandbox/mount-plan.js +84 -0
- package/dist/sandbox/notification-sweep.d.ts +42 -0
- package/dist/sandbox/notification-sweep.js +74 -0
- package/dist/sandbox/reaper.d.ts +70 -0
- package/dist/sandbox/reaper.js +124 -0
- package/dist/sandbox/sandbox-error.d.ts +105 -0
- package/dist/sandbox/sandbox-error.js +92 -0
- package/dist/sandbox/sandbox-step-translate.d.ts +35 -0
- package/dist/sandbox/sandbox-step-translate.js +76 -0
- package/dist/sandbox/submit-exec.d.ts +33 -0
- package/dist/sandbox/submit-exec.js +68 -0
- package/dist/sandbox/types.d.ts +277 -0
- package/dist/sandbox/types.js +147 -0
- package/dist/sandbox/watchdog.d.ts +71 -0
- package/dist/sandbox/watchdog.js +150 -0
- package/dist/schemas/artifact-manifest.d.ts +34 -0
- package/dist/schemas/artifact-manifest.js +36 -0
- package/dist/schemas/data-profile-schemas.d.ts +92 -0
- package/dist/schemas/data-profile-schemas.js +89 -0
- package/dist/schemas/file-metadata.d.ts +51 -0
- package/dist/schemas/file-metadata.js +39 -0
- package/dist/schemas/plan-schemas.d.ts +110 -0
- package/dist/schemas/plan-schemas.js +50 -0
- package/dist/schemas/render-step-prompt.d.ts +32 -0
- package/dist/schemas/render-step-prompt.js +76 -0
- package/dist/schemas/run-synthesis.d.ts +148 -0
- package/dist/schemas/run-synthesis.js +87 -0
- package/dist/schemas/step-summary.d.ts +18 -0
- package/dist/schemas/step-summary.js +20 -0
- package/dist/schemas/validate-plan.d.ts +39 -0
- package/dist/schemas/validate-plan.js +120 -0
- package/dist/schemas/workflow-state.d.ts +314 -0
- package/dist/schemas/workflow-state.js +139 -0
- package/dist/state/active-sandboxes.d.ts +58 -0
- package/dist/state/active-sandboxes.js +100 -0
- package/dist/state/analyses-metrics.d.ts +21 -0
- package/dist/state/analyses-metrics.js +59 -0
- package/dist/state/analyses.d.ts +58 -0
- package/dist/state/analyses.js +132 -0
- package/dist/state/artifacts.d.ts +53 -0
- package/dist/state/artifacts.js +175 -0
- package/dist/state/data-profile.d.ts +176 -0
- package/dist/state/data-profile.js +284 -0
- package/dist/state/db.d.ts +10 -0
- package/dist/state/db.js +9 -0
- package/dist/state/index.d.ts +29 -0
- package/dist/state/index.js +20 -0
- package/dist/state/init.d.ts +14 -0
- package/dist/state/init.js +406 -0
- package/dist/state/plans.d.ts +56 -0
- package/dist/state/plans.js +117 -0
- package/dist/state/runs.d.ts +69 -0
- package/dist/state/runs.js +206 -0
- package/dist/state/schema.d.ts +150 -0
- package/dist/state/schema.js +100 -0
- package/dist/state/step-executions.d.ts +77 -0
- package/dist/state/step-executions.js +175 -0
- package/dist/state/target-assessments.d.ts +68 -0
- package/dist/state/target-assessments.js +222 -0
- package/dist/state/vector-store.d.ts +53 -0
- package/dist/state/vector-store.js +89 -0
- package/dist/tasks/data-profile.d.ts +171 -0
- package/dist/tasks/data-profile.js +461 -0
- package/dist/tasks/refresh-regulatory-corpus.d.ts +59 -0
- package/dist/tasks/refresh-regulatory-corpus.js +146 -0
- package/dist/tasks/regulatory-corpus-boot-refresh.d.ts +55 -0
- package/dist/tasks/regulatory-corpus-boot-refresh.js +149 -0
- package/dist/tools/__fixtures__/tool-context.d.ts +13 -0
- package/dist/tools/__fixtures__/tool-context.js +18 -0
- package/dist/tools/bio/check-safety-panel.d.ts +35 -0
- package/dist/tools/bio/check-safety-panel.js +76 -0
- package/dist/tools/bio/find-approval-precedent.d.ts +32 -0
- package/dist/tools/bio/find-approval-precedent.js +72 -0
- package/dist/tools/bio/get-article-details.d.ts +11 -0
- package/dist/tools/bio/get-article-details.js +20 -0
- package/dist/tools/bio/get-article-full-text.d.ts +19 -0
- package/dist/tools/bio/get-article-full-text.js +32 -0
- package/dist/tools/bio/get-bioactivity.d.ts +11 -0
- package/dist/tools/bio/get-bioactivity.js +23 -0
- package/dist/tools/bio/get-drug-info.d.ts +9 -0
- package/dist/tools/bio/get-drug-info.js +22 -0
- package/dist/tools/bio/get-impc-ko-profile.d.ts +9 -0
- package/dist/tools/bio/get-impc-ko-profile.js +20 -0
- package/dist/tools/bio/get-mechanism.d.ts +8 -0
- package/dist/tools/bio/get-mechanism.js +18 -0
- package/dist/tools/bio/get-pubchem-assays.d.ts +22 -0
- package/dist/tools/bio/get-pubchem-assays.js +107 -0
- package/dist/tools/bio/get-pubchem-cross-refs.d.ts +15 -0
- package/dist/tools/bio/get-pubchem-cross-refs.js +68 -0
- package/dist/tools/bio/get-target-safety.d.ts +18 -0
- package/dist/tools/bio/get-target-safety.js +26 -0
- package/dist/tools/bio/index.d.ts +41 -0
- package/dist/tools/bio/index.js +48 -0
- package/dist/tools/bio/keys.d.ts +31 -0
- package/dist/tools/bio/keys.js +30 -0
- package/dist/tools/bio/lookup-go-term.d.ts +31 -0
- package/dist/tools/bio/lookup-go-term.js +116 -0
- package/dist/tools/bio/search-bgee-expression.d.ts +10 -0
- package/dist/tools/bio/search-bgee-expression.js +24 -0
- package/dist/tools/bio/search-clinical-trials.d.ts +12 -0
- package/dist/tools/bio/search-clinical-trials.js +21 -0
- package/dist/tools/bio/search-clinvar.d.ts +13 -0
- package/dist/tools/bio/search-clinvar.js +28 -0
- package/dist/tools/bio/search-compounds.d.ts +22 -0
- package/dist/tools/bio/search-compounds.js +160 -0
- package/dist/tools/bio/search-ctx-chemical.d.ts +50 -0
- package/dist/tools/bio/search-ctx-chemical.js +130 -0
- package/dist/tools/bio/search-ctx-exposure.d.ts +55 -0
- package/dist/tools/bio/search-ctx-exposure.js +176 -0
- package/dist/tools/bio/search-ctx-hazard.d.ts +111 -0
- package/dist/tools/bio/search-ctx-hazard.js +178 -0
- package/dist/tools/bio/search-dgidb.d.ts +43 -0
- package/dist/tools/bio/search-dgidb.js +199 -0
- package/dist/tools/bio/search-disgenet.d.ts +30 -0
- package/dist/tools/bio/search-disgenet.js +84 -0
- package/dist/tools/bio/search-drugbank.d.ts +38 -0
- package/dist/tools/bio/search-drugbank.js +109 -0
- package/dist/tools/bio/search-faers.d.ts +11 -0
- package/dist/tools/bio/search-faers.js +23 -0
- package/dist/tools/bio/search-gene.d.ts +11 -0
- package/dist/tools/bio/search-gene.js +19 -0
- package/dist/tools/bio/search-geo-datasets.d.ts +20 -0
- package/dist/tools/bio/search-geo-datasets.js +86 -0
- package/dist/tools/bio/search-gwas-catalog.d.ts +33 -0
- package/dist/tools/bio/search-gwas-catalog.js +172 -0
- package/dist/tools/bio/search-interactions.d.ts +17 -0
- package/dist/tools/bio/search-interactions.js +31 -0
- package/dist/tools/bio/search-opentargets.d.ts +11 -0
- package/dist/tools/bio/search-opentargets.js +25 -0
- package/dist/tools/bio/search-pathway.d.ts +12 -0
- package/dist/tools/bio/search-pathway.js +32 -0
- package/dist/tools/bio/search-pharmgkb.d.ts +17 -0
- package/dist/tools/bio/search-pharmgkb.js +46 -0
- package/dist/tools/bio/search-pubchem-compound.d.ts +26 -0
- package/dist/tools/bio/search-pubchem-compound.js +110 -0
- package/dist/tools/bio/search-pubmed.d.ts +17 -0
- package/dist/tools/bio/search-pubmed.js +31 -0
- package/dist/tools/bio/search-targets.d.ts +9 -0
- package/dist/tools/bio/search-targets.js +20 -0
- package/dist/tools/bio/search-toxcast.d.ts +36 -0
- package/dist/tools/bio/search-toxcast.js +141 -0
- package/dist/tools/define-tool.d.ts +80 -0
- package/dist/tools/define-tool.js +48 -0
- package/dist/tools/display/index.d.ts +4 -0
- package/dist/tools/display/index.js +4 -0
- package/dist/tools/display/show-user.d.ts +33 -0
- package/dist/tools/display/show-user.js +67 -0
- package/dist/tools/execute-plan.d.ts +64 -0
- package/dist/tools/execute-plan.js +208 -0
- package/dist/tools/iterate-report.d.ts +172 -0
- package/dist/tools/iterate-report.js +521 -0
- package/dist/tools/lib/api-utils.d.ts +80 -0
- package/dist/tools/lib/api-utils.js +128 -0
- package/dist/tools/lib/bgee-client.d.ts +36 -0
- package/dist/tools/lib/bgee-client.js +150 -0
- package/dist/tools/lib/cbioportal-client.d.ts +34 -0
- package/dist/tools/lib/cbioportal-client.js +159 -0
- package/dist/tools/lib/chembl-client.d.ts +123 -0
- package/dist/tools/lib/chembl-client.js +458 -0
- package/dist/tools/lib/chembl-config.d.ts +5 -0
- package/dist/tools/lib/chembl-config.js +3 -0
- package/dist/tools/lib/clinical-benchmarks-client.d.ts +33 -0
- package/dist/tools/lib/clinical-benchmarks-client.js +54 -0
- package/dist/tools/lib/clinical-trials-client.d.ts +216 -0
- package/dist/tools/lib/clinical-trials-client.js +339 -0
- package/dist/tools/lib/clinicaltrials-config.d.ts +4 -0
- package/dist/tools/lib/clinicaltrials-config.js +2 -0
- package/dist/tools/lib/clinvar-client.d.ts +25 -0
- package/dist/tools/lib/clinvar-client.js +126 -0
- package/dist/tools/lib/disgenet-config.d.ts +2 -0
- package/dist/tools/lib/disgenet-config.js +11 -0
- package/dist/tools/lib/drugbank-config.d.ts +2 -0
- package/dist/tools/lib/drugbank-config.js +12 -0
- package/dist/tools/lib/ema-client.d.ts +45 -0
- package/dist/tools/lib/ema-client.js +127 -0
- package/dist/tools/lib/ema-config.d.ts +7 -0
- package/dist/tools/lib/ema-config.js +7 -0
- package/dist/tools/lib/ensembl-client.d.ts +27 -0
- package/dist/tools/lib/ensembl-client.js +82 -0
- package/dist/tools/lib/gwas-catalog-config.d.ts +4 -0
- package/dist/tools/lib/gwas-catalog-config.js +2 -0
- package/dist/tools/lib/identifier-resolver.d.ts +85 -0
- package/dist/tools/lib/identifier-resolver.js +333 -0
- package/dist/tools/lib/impc-client.d.ts +44 -0
- package/dist/tools/lib/impc-client.js +239 -0
- package/dist/tools/lib/iuphar-client.d.ts +75 -0
- package/dist/tools/lib/iuphar-client.js +230 -0
- package/dist/tools/lib/iuphar-config.d.ts +5 -0
- package/dist/tools/lib/iuphar-config.js +3 -0
- package/dist/tools/lib/ncbi-utils.d.ts +58 -0
- package/dist/tools/lib/ncbi-utils.js +286 -0
- package/dist/tools/lib/openfda-client.d.ts +53 -0
- package/dist/tools/lib/openfda-client.js +192 -0
- package/dist/tools/lib/openfda-config.d.ts +2 -0
- package/dist/tools/lib/openfda-config.js +2 -0
- package/dist/tools/lib/opentargets-client.d.ts +64 -0
- package/dist/tools/lib/opentargets-client.js +290 -0
- package/dist/tools/lib/opentargets-config.d.ts +5 -0
- package/dist/tools/lib/opentargets-config.js +5 -0
- package/dist/tools/lib/path-validation.d.ts +14 -0
- package/dist/tools/lib/path-validation.js +26 -0
- package/dist/tools/lib/pathway-client.d.ts +27 -0
- package/dist/tools/lib/pathway-client.js +149 -0
- package/dist/tools/lib/pharmgkb-config.d.ts +4 -0
- package/dist/tools/lib/pharmgkb-config.js +2 -0
- package/dist/tools/lib/preview-lock.d.ts +20 -0
- package/dist/tools/lib/preview-lock.js +35 -0
- package/dist/tools/lib/protein-family-modality.d.ts +16 -0
- package/dist/tools/lib/protein-family-modality.js +42 -0
- package/dist/tools/lib/protein-family-normalize.d.ts +12 -0
- package/dist/tools/lib/protein-family-normalize.js +46 -0
- package/dist/tools/lib/pubchem-client.d.ts +40 -0
- package/dist/tools/lib/pubchem-client.js +128 -0
- package/dist/tools/lib/pubchem-config.d.ts +5 -0
- package/dist/tools/lib/pubchem-config.js +3 -0
- package/dist/tools/lib/pubmed-client.d.ts +28 -0
- package/dist/tools/lib/pubmed-client.js +91 -0
- package/dist/tools/lib/report-preflight.d.ts +39 -0
- package/dist/tools/lib/report-preflight.js +283 -0
- package/dist/tools/lib/string-client.d.ts +33 -0
- package/dist/tools/lib/string-client.js +93 -0
- package/dist/tools/lib/toxcast-config.d.ts +2 -0
- package/dist/tools/lib/toxcast-config.js +11 -0
- package/dist/tools/lib/uniprot-client.d.ts +28 -0
- package/dist/tools/lib/uniprot-client.js +103 -0
- package/dist/tools/lib/uniprot-config.d.ts +5 -0
- package/dist/tools/lib/uniprot-config.js +3 -0
- package/dist/tools/memory/index.d.ts +4 -0
- package/dist/tools/memory/index.js +4 -0
- package/dist/tools/memory/update-working-memory.d.ts +25 -0
- package/dist/tools/memory/update-working-memory.js +112 -0
- package/dist/tools/registry.d.ts +15 -0
- package/dist/tools/registry.js +26 -0
- package/dist/tools/report/build-report.d.ts +13 -0
- package/dist/tools/report/build-report.js +26 -0
- package/dist/tools/report/index.d.ts +14 -0
- package/dist/tools/report/index.js +14 -0
- package/dist/tools/report/mint-preview-url.d.ts +26 -0
- package/dist/tools/report/mint-preview-url.js +44 -0
- package/dist/tools/report/preview-publisher.d.ts +37 -0
- package/dist/tools/report/preview-publisher.js +25 -0
- package/dist/tools/report/preview-snapshot.d.ts +26 -0
- package/dist/tools/report/preview-snapshot.js +121 -0
- package/dist/tools/report/submit-report.d.ts +25 -0
- package/dist/tools/report/submit-report.js +126 -0
- package/dist/tools/report/version-fs.d.ts +15 -0
- package/dist/tools/report/version-fs.js +154 -0
- package/dist/tools/research/context7-docs.d.ts +31 -0
- package/dist/tools/research/context7-docs.js +61 -0
- package/dist/tools/research/generate-analogy-report.d.ts +60 -0
- package/dist/tools/research/generate-analogy-report.js +288 -0
- package/dist/tools/research/generate-plan.d.ts +39 -0
- package/dist/tools/research/generate-plan.js +393 -0
- package/dist/tools/research/index.d.ts +15 -0
- package/dist/tools/research/index.js +15 -0
- package/dist/tools/research/inspect-run.d.ts +54 -0
- package/dist/tools/research/inspect-run.js +85 -0
- package/dist/tools/research/literature-reviewer.d.ts +29 -0
- package/dist/tools/research/literature-reviewer.js +84 -0
- package/dist/tools/research/search-arxiv.d.ts +32 -0
- package/dist/tools/research/search-arxiv.js +123 -0
- package/dist/tools/research/search-github-repos.d.ts +32 -0
- package/dist/tools/research/search-github-repos.js +86 -0
- package/dist/tools/research/search-semantic-scholar.d.ts +33 -0
- package/dist/tools/research/search-semantic-scholar.js +93 -0
- package/dist/tools/run-ephemeral.d.ts +33 -0
- package/dist/tools/run-ephemeral.js +65 -0
- package/dist/tools/sandbox/index.d.ts +7 -0
- package/dist/tools/sandbox/index.js +7 -0
- package/dist/tools/sandbox/list-available-packages.d.ts +7 -0
- package/dist/tools/sandbox/list-available-packages.js +27 -0
- package/dist/tools/sandbox/list-available-refs.d.ts +7 -0
- package/dist/tools/sandbox/list-available-refs.js +147 -0
- package/dist/tools/sandbox/report-blocker.d.ts +23 -0
- package/dist/tools/sandbox/report-blocker.js +39 -0
- package/dist/tools/sandbox/skills.d.ts +72 -0
- package/dist/tools/sandbox/skills.js +144 -0
- package/dist/tools/workspace/edit-file.d.ts +46 -0
- package/dist/tools/workspace/edit-file.js +100 -0
- package/dist/tools/workspace/execute-command.d.ts +80 -0
- package/dist/tools/workspace/execute-command.js +95 -0
- package/dist/tools/workspace/file-stat.d.ts +24 -0
- package/dist/tools/workspace/file-stat.js +37 -0
- package/dist/tools/workspace/grep.d.ts +57 -0
- package/dist/tools/workspace/grep.js +154 -0
- package/dist/tools/workspace/index.d.ts +26 -0
- package/dist/tools/workspace/index.js +27 -0
- package/dist/tools/workspace/list-files.d.ts +24 -0
- package/dist/tools/workspace/list-files.js +38 -0
- package/dist/tools/workspace/mutator.d.ts +83 -0
- package/dist/tools/workspace/mutator.js +81 -0
- package/dist/tools/workspace/read-file.d.ts +39 -0
- package/dist/tools/workspace/read-file.js +93 -0
- package/dist/tools/workspace/result-bounds.d.ts +42 -0
- package/dist/tools/workspace/result-bounds.js +50 -0
- package/dist/tools/workspace/run-exec.d.ts +32 -0
- package/dist/tools/workspace/run-exec.js +34 -0
- package/dist/tools/workspace/show-file.d.ts +37 -0
- package/dist/tools/workspace/show-file.js +54 -0
- package/dist/tools/workspace/show-plan.d.ts +23 -0
- package/dist/tools/workspace/show-plan.js +44 -0
- package/dist/tools/workspace/workspace-search.d.ts +25 -0
- package/dist/tools/workspace/workspace-search.js +78 -0
- package/dist/tools/workspace/write-file.d.ts +16 -0
- package/dist/tools/workspace/write-file.js +33 -0
- package/dist/workflows/execute-analysis-scheduler.d.ts +94 -0
- package/dist/workflows/execute-analysis-scheduler.js +186 -0
- package/dist/workflows/execute-analysis.d.ts +271 -0
- package/dist/workflows/execute-analysis.js +746 -0
- package/dist/workflows/execute-target-assessment.d.ts +101 -0
- package/dist/workflows/execute-target-assessment.js +528 -0
- package/dist/workflows/metrics.d.ts +37 -0
- package/dist/workflows/metrics.js +55 -0
- package/dist/workflows/plan/level.d.ts +12 -0
- package/dist/workflows/plan/level.js +12 -0
- package/dist/workflows/register-workflows.d.ts +51 -0
- package/dist/workflows/register-workflows.js +48 -0
- package/dist/workflows/resume-execute-analysis.d.ts +70 -0
- package/dist/workflows/resume-execute-analysis.js +80 -0
- package/dist/workflows/sandbox-step.d.ts +243 -0
- package/dist/workflows/sandbox-step.js +573 -0
- package/dist/workflows/target-assessment/assemblers/index.d.ts +5 -0
- package/dist/workflows/target-assessment/assemblers/index.js +4 -0
- package/dist/workflows/target-assessment/assemblers/literature.d.ts +299 -0
- package/dist/workflows/target-assessment/assemblers/literature.js +987 -0
- package/dist/workflows/target-assessment/assemblers/orchestrator.d.ts +109 -0
- package/dist/workflows/target-assessment/assemblers/orchestrator.js +835 -0
- package/dist/workflows/target-assessment/assemblers/safety.d.ts +352 -0
- package/dist/workflows/target-assessment/assemblers/safety.js +985 -0
- package/dist/workflows/target-assessment/assemblers/trials.d.ts +30 -0
- package/dist/workflows/target-assessment/assemblers/trials.js +75 -0
- package/dist/workflows/target-assessment/collectors/index.d.ts +105 -0
- package/dist/workflows/target-assessment/collectors/index.js +468 -0
- package/dist/workflows/target-assessment/correction-loop.d.ts +45 -0
- package/dist/workflows/target-assessment/correction-loop.js +62 -0
- package/dist/workflows/target-assessment/coverage.d.ts +81 -0
- package/dist/workflows/target-assessment/coverage.js +82 -0
- package/dist/workflows/target-assessment/decisions/index.d.ts +86 -0
- package/dist/workflows/target-assessment/decisions/index.js +127 -0
- package/dist/workflows/target-assessment/fanout/index.d.ts +31 -0
- package/dist/workflows/target-assessment/fanout/index.js +155 -0
- package/dist/workflows/target-assessment/lib/approval-precedents.d.ts +52 -0
- package/dist/workflows/target-assessment/lib/approval-precedents.js +119 -0
- package/dist/workflows/target-assessment/lib/citation-validator.d.ts +46 -0
- package/dist/workflows/target-assessment/lib/citation-validator.js +316 -0
- package/dist/workflows/target-assessment/lib/clinical-consequence-annotator.d.ts +62 -0
- package/dist/workflows/target-assessment/lib/clinical-consequence-annotator.js +172 -0
- package/dist/workflows/target-assessment/lib/clinical-evidence-attribution.d.ts +45 -0
- package/dist/workflows/target-assessment/lib/clinical-evidence-attribution.js +156 -0
- package/dist/workflows/target-assessment/lib/compute-derived.d.ts +19 -0
- package/dist/workflows/target-assessment/lib/compute-derived.js +252 -0
- package/dist/workflows/target-assessment/lib/compute-selectivity.d.ts +15 -0
- package/dist/workflows/target-assessment/lib/compute-selectivity.js +18 -0
- package/dist/workflows/target-assessment/lib/dedup-modulators.d.ts +37 -0
- package/dist/workflows/target-assessment/lib/dedup-modulators.js +157 -0
- package/dist/workflows/target-assessment/lib/evidence-conflict-detector.d.ts +17 -0
- package/dist/workflows/target-assessment/lib/evidence-conflict-detector.js +100 -0
- package/dist/workflows/target-assessment/lib/expression-constants.d.ts +21 -0
- package/dist/workflows/target-assessment/lib/expression-constants.js +21 -0
- package/dist/workflows/target-assessment/lib/family-complex-supplement.d.ts +21 -0
- package/dist/workflows/target-assessment/lib/family-complex-supplement.js +37 -0
- package/dist/workflows/target-assessment/lib/heterodimer-filter.d.ts +39 -0
- package/dist/workflows/target-assessment/lib/heterodimer-filter.js +54 -0
- package/dist/workflows/target-assessment/lib/intended-polypharm-filter.d.ts +4 -0
- package/dist/workflows/target-assessment/lib/intended-polypharm-filter.js +24 -0
- package/dist/workflows/target-assessment/lib/llm-step.d.ts +77 -0
- package/dist/workflows/target-assessment/lib/llm-step.js +99 -0
- package/dist/workflows/target-assessment/lib/meddra-organ-map.d.ts +30 -0
- package/dist/workflows/target-assessment/lib/meddra-organ-map.js +126 -0
- package/dist/workflows/target-assessment/lib/recommendation-quality-gates.d.ts +17 -0
- package/dist/workflows/target-assessment/lib/recommendation-quality-gates.js +99 -0
- package/dist/workflows/target-assessment/lib/recommendation-sanitizer.d.ts +2 -0
- package/dist/workflows/target-assessment/lib/recommendation-sanitizer.js +51 -0
- package/dist/workflows/target-assessment/lib/regulatory-actions.d.ts +26 -0
- package/dist/workflows/target-assessment/lib/regulatory-actions.js +147 -0
- package/dist/workflows/target-assessment/lib/structured-llm.d.ts +58 -0
- package/dist/workflows/target-assessment/lib/structured-llm.js +101 -0
- package/dist/workflows/target-assessment/lib/target-identity-filter.d.ts +60 -0
- package/dist/workflows/target-assessment/lib/target-identity-filter.js +86 -0
- package/dist/workflows/target-assessment/lib/therapeutic-programs.d.ts +20 -0
- package/dist/workflows/target-assessment/lib/therapeutic-programs.js +68 -0
- package/dist/workflows/target-assessment/metrics.d.ts +21 -0
- package/dist/workflows/target-assessment/metrics.js +42 -0
- package/dist/workflows/target-assessment/phase4-assemble.d.ts +1841 -0
- package/dist/workflows/target-assessment/phase4-assemble.js +39 -0
- package/dist/workflows/target-assessment/phase5-persist.d.ts +57 -0
- package/dist/workflows/target-assessment/phase5-persist.js +461 -0
- package/dist/workflows/target-assessment/progress.d.ts +38 -0
- package/dist/workflows/target-assessment/progress.js +76 -0
- package/dist/workflows/target-assessment/schemas.d.ts +931 -0
- package/dist/workflows/target-assessment/schemas.js +293 -0
- package/dist/workflows/target-assessment/steps/collectors/pathways.d.ts +15 -0
- package/dist/workflows/target-assessment/steps/collectors/pathways.js +58 -0
- package/dist/workflows/target-assessment/steps/fanout/aes-for-one-class-drug-step.d.ts +34 -0
- package/dist/workflows/target-assessment/steps/fanout/aes-for-one-class-drug-step.js +31 -0
- package/dist/workflows/target-assessment/steps/fanout/aes-for-one-trial-step.d.ts +57 -0
- package/dist/workflows/target-assessment/steps/fanout/aes-for-one-trial-step.js +54 -0
- package/dist/workflows/target-assessment/steps/fanout/faers-for-one-modulator-step.d.ts +35 -0
- package/dist/workflows/target-assessment/steps/fanout/faers-for-one-modulator-step.js +32 -0
- package/dist/workflows/target-assessment/steps/fanout/index.d.ts +14 -0
- package/dist/workflows/target-assessment/steps/fanout/index.js +10 -0
- package/dist/workflows/target-assessment/steps/fanout/polypharm-for-one-modulator-step.d.ts +28 -0
- package/dist/workflows/target-assessment/steps/fanout/polypharm-for-one-modulator-step.js +27 -0
- package/dist/workflows/target-assessment/steps/phase0-resolve.d.ts +71 -0
- package/dist/workflows/target-assessment/steps/phase0-resolve.js +21 -0
- package/dist/workflows/target-assessment/steps/phase1-aggregate.d.ts +1018 -0
- package/dist/workflows/target-assessment/steps/phase1-aggregate.js +25 -0
- package/dist/workflows/target-assessment/steps/phase2-aggregate.d.ts +696 -0
- package/dist/workflows/target-assessment/steps/phase2-aggregate.js +38 -0
- package/dist/workflows/target-assessment/steps/phase3-aggregate.d.ts +936 -0
- package/dist/workflows/target-assessment/steps/phase3-aggregate.js +22 -0
- package/dist/workflows/target-assessment/steps/synthesis/diagnostics.d.ts +34 -0
- package/dist/workflows/target-assessment/steps/synthesis/diagnostics.js +45 -0
- package/dist/workflows/target-assessment/sub-workflows/index.d.ts +15 -0
- package/dist/workflows/target-assessment/sub-workflows/index.js +11 -0
- package/dist/workflows/target-assessment/sub-workflows/per-class-drug-aes.d.ts +41 -0
- package/dist/workflows/target-assessment/sub-workflows/per-class-drug-aes.js +12 -0
- package/dist/workflows/target-assessment/sub-workflows/per-modulator-faers.d.ts +41 -0
- package/dist/workflows/target-assessment/sub-workflows/per-modulator-faers.js +12 -0
- package/dist/workflows/target-assessment/sub-workflows/per-modulator-polypharm.d.ts +36 -0
- package/dist/workflows/target-assessment/sub-workflows/per-modulator-polypharm.js +12 -0
- package/dist/workflows/target-assessment/sub-workflows/per-trial-aes.d.ts +66 -0
- package/dist/workflows/target-assessment/sub-workflows/per-trial-aes.js +12 -0
- package/dist/workflows/target-assessment/synthesis/index.d.ts +560 -0
- package/dist/workflows/target-assessment/synthesis/index.js +351 -0
- package/dist/workflows/target-assessment/synthesis-probes.d.ts +56 -0
- package/dist/workflows/target-assessment/synthesis-probes.js +320 -0
- package/dist/workspace/filesystem.d.ts +117 -0
- package/dist/workspace/filesystem.js +304 -0
- package/dist/workspace/mount-strategy.d.ts +50 -0
- package/dist/workspace/mount-strategy.js +67 -0
- package/dist/workspace/paths.d.ts +185 -0
- package/dist/workspace/paths.js +219 -0
- package/dist/workspace/provenance-collector.d.ts +34 -0
- package/dist/workspace/provenance-collector.js +16 -0
- package/dist/workspace/search-config.d.ts +23 -0
- package/dist/workspace/search-config.js +43 -0
- package/dist/workspace/workspace-paths.d.ts +26 -0
- package/dist/workspace/workspace-paths.js +31 -0
- package/package.json +101 -0
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Refresh the FDA/ICH regulatory corpus stored in `cortex_regulatory_chunks`.
|
|
3
|
+
*
|
|
4
|
+
* Pipeline: list documents → download → extract text → chunk → embed →
|
|
5
|
+
* upsert into `cortex_regulatory_chunks`. Idempotent at the (source, doc_id)
|
|
6
|
+
* grain — re-running replaces existing rows.
|
|
7
|
+
*
|
|
8
|
+
* Two callers:
|
|
9
|
+
* - `scripts/index-regulatory-corpus.ts` — operator-run CLI
|
|
10
|
+
* - `regulatory-corpus-boot-refresh.ts` — automatic 90-day-stale boot trigger
|
|
11
|
+
*/
|
|
12
|
+
import type { Pool } from "pg";
|
|
13
|
+
export type RegulatoryCorpusSource = "FDA-CDER" | "FDA-CBER" | "ICH";
|
|
14
|
+
export declare const REGULATORY_CORPUS_SOURCES: RegulatoryCorpusSource[];
|
|
15
|
+
export interface RefreshResult {
|
|
16
|
+
ok: number;
|
|
17
|
+
fail: number;
|
|
18
|
+
}
|
|
19
|
+
export interface RefreshOptions {
|
|
20
|
+
pool: Pool;
|
|
21
|
+
sources?: RegulatoryCorpusSource[];
|
|
22
|
+
/**
|
|
23
|
+
* Embedder used to vectorise chunks. Required — callers must build one
|
|
24
|
+
* via `buildMaintenanceEmbedder(env)` (direct OpenAI, bypassing the billing gateway)
|
|
25
|
+
* or supply an injected stub for tests. There is no default: the corpus
|
|
26
|
+
* refresh is system-scoped maintenance work with no analysis to bill
|
|
27
|
+
* against, so we never silently fall through to the billing-gateway-routed
|
|
28
|
+
* `createEmbedder()` and emit unattributed calls.
|
|
29
|
+
*/
|
|
30
|
+
embedder: (text: string) => Promise<number[]>;
|
|
31
|
+
/** Logger used for per-doc progress. Defaults to `console`. */
|
|
32
|
+
log?: Pick<Console, "log" | "error">;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Build an embedder that talks directly to api.openai.com using the given
|
|
36
|
+
* `apiKey`, bypassing the billing gateway.
|
|
37
|
+
*
|
|
38
|
+
* Returns `null` when `apiKey` is missing — callers MUST treat that as
|
|
39
|
+
* "auto-refresh disabled" rather than falling back to the workspace
|
|
40
|
+
* embedder (`workspace/search-config.ts`), which routes through the billing gateway
|
|
41
|
+
* via `OPENAI_BASE_URL` and would generate unbilled calls outside an ALS
|
|
42
|
+
* billing scope.
|
|
43
|
+
*
|
|
44
|
+
* The model id mirrors the workspace embedder default
|
|
45
|
+
* (`text-embedding-3-small`, 1536 dim) so chunks remain comparable to the
|
|
46
|
+
* default `cortex_regulatory_chunks.embedding` shape. Pass the existing
|
|
47
|
+
* `OPENAI_API_KEY` (a real OpenAI key, NOT a billing-gateway virtual key — direct
|
|
48
|
+
* calls to api.openai.com would 401 against a `sk-billing-*` value).
|
|
49
|
+
*/
|
|
50
|
+
export declare function buildMaintenanceEmbedder(opts: {
|
|
51
|
+
apiKey?: string;
|
|
52
|
+
embeddingModel?: string;
|
|
53
|
+
}): ((text: string) => Promise<number[]>) | null;
|
|
54
|
+
/**
|
|
55
|
+
* Refresh one or more regulatory corpus sources end-to-end. Returns
|
|
56
|
+
* aggregate ok/fail counts across all requested sources. Never throws —
|
|
57
|
+
* per-document failures are counted but do not abort the run.
|
|
58
|
+
*/
|
|
59
|
+
export declare function refreshRegulatoryCorpus(opts: RefreshOptions): Promise<RefreshResult>;
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Refresh the FDA/ICH regulatory corpus stored in `cortex_regulatory_chunks`.
|
|
3
|
+
*
|
|
4
|
+
* Pipeline: list documents → download → extract text → chunk → embed →
|
|
5
|
+
* upsert into `cortex_regulatory_chunks`. Idempotent at the (source, doc_id)
|
|
6
|
+
* grain — re-running replaces existing rows.
|
|
7
|
+
*
|
|
8
|
+
* Two callers:
|
|
9
|
+
* - `scripts/index-regulatory-corpus.ts` — operator-run CLI
|
|
10
|
+
* - `regulatory-corpus-boot-refresh.ts` — automatic 90-day-stale boot trigger
|
|
11
|
+
*/
|
|
12
|
+
import { unwrapOrThrow } from "../lib/result.js";
|
|
13
|
+
import { fetchFdaGuidanceListing, fetchAndExtractFdaDoc } from "../lib/regulatory-corpus/fetch-fda-guidance.js";
|
|
14
|
+
import { fetchIchListing, fetchAndExtractIchDoc } from "../lib/regulatory-corpus/fetch-ich.js";
|
|
15
|
+
import { chunkText, upsertChunks } from "../lib/regulatory-corpus.js";
|
|
16
|
+
export const REGULATORY_CORPUS_SOURCES = ["FDA-CDER", "FDA-CBER", "ICH"];
|
|
17
|
+
// A large guidance doc can chunk into 200-500+ pieces. Firing them all at
|
|
18
|
+
// once trips embedding-API rate limits and silently truncates the upserted
|
|
19
|
+
// chunks, so we batch.
|
|
20
|
+
const EMBED_CONCURRENCY = 20;
|
|
21
|
+
/**
|
|
22
|
+
* Build an embedder that talks directly to api.openai.com using the given
|
|
23
|
+
* `apiKey`, bypassing the billing gateway.
|
|
24
|
+
*
|
|
25
|
+
* Returns `null` when `apiKey` is missing — callers MUST treat that as
|
|
26
|
+
* "auto-refresh disabled" rather than falling back to the workspace
|
|
27
|
+
* embedder (`workspace/search-config.ts`), which routes through the billing gateway
|
|
28
|
+
* via `OPENAI_BASE_URL` and would generate unbilled calls outside an ALS
|
|
29
|
+
* billing scope.
|
|
30
|
+
*
|
|
31
|
+
* The model id mirrors the workspace embedder default
|
|
32
|
+
* (`text-embedding-3-small`, 1536 dim) so chunks remain comparable to the
|
|
33
|
+
* default `cortex_regulatory_chunks.embedding` shape. Pass the existing
|
|
34
|
+
* `OPENAI_API_KEY` (a real OpenAI key, NOT a billing-gateway virtual key — direct
|
|
35
|
+
* calls to api.openai.com would 401 against a `sk-billing-*` value).
|
|
36
|
+
*/
|
|
37
|
+
export function buildMaintenanceEmbedder(opts) {
|
|
38
|
+
const { apiKey } = opts;
|
|
39
|
+
if (!apiKey)
|
|
40
|
+
return null;
|
|
41
|
+
// Strip the `openai/` provider prefix if present; we always talk to OpenAI here.
|
|
42
|
+
const id = opts.embeddingModel ?? "openai/text-embedding-3-small";
|
|
43
|
+
const modelId = id.startsWith("openai/") ? id.slice("openai/".length) : id;
|
|
44
|
+
// Direct call to api.openai.com (bypasses the billing gateway) — unbilled maintenance
|
|
45
|
+
// path. See doc comment above.
|
|
46
|
+
return async (text) => {
|
|
47
|
+
const res = await fetch("https://api.openai.com/v1/embeddings", {
|
|
48
|
+
method: "POST",
|
|
49
|
+
headers: {
|
|
50
|
+
"content-type": "application/json",
|
|
51
|
+
authorization: `Bearer ${apiKey}`,
|
|
52
|
+
},
|
|
53
|
+
body: JSON.stringify({ model: modelId, input: text, encoding_format: "float" }),
|
|
54
|
+
});
|
|
55
|
+
if (!res.ok) {
|
|
56
|
+
const body = await res.text();
|
|
57
|
+
throw new Error(`buildMaintenanceEmbedder: openai /embeddings ${res.status}: ${body}`);
|
|
58
|
+
}
|
|
59
|
+
const data = (await res.json());
|
|
60
|
+
const embedding = data.data?.[0]?.embedding;
|
|
61
|
+
if (!embedding)
|
|
62
|
+
throw new Error("buildMaintenanceEmbedder: empty response");
|
|
63
|
+
return embedding;
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
async function listForSource(source) {
|
|
67
|
+
switch (source) {
|
|
68
|
+
case "FDA-CDER":
|
|
69
|
+
return (await fetchFdaGuidanceListing("CDER")).map((s) => ({
|
|
70
|
+
...s,
|
|
71
|
+
center: "CDER",
|
|
72
|
+
}));
|
|
73
|
+
case "FDA-CBER":
|
|
74
|
+
return (await fetchFdaGuidanceListing("CBER")).map((s) => ({
|
|
75
|
+
...s,
|
|
76
|
+
center: "CBER",
|
|
77
|
+
}));
|
|
78
|
+
case "ICH":
|
|
79
|
+
return await fetchIchListing();
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
async function fetchOne(source, stub) {
|
|
83
|
+
if (source === "ICH")
|
|
84
|
+
return await fetchAndExtractIchDoc(stub);
|
|
85
|
+
return await fetchAndExtractFdaDoc(stub);
|
|
86
|
+
}
|
|
87
|
+
async function indexSource(pool, source, embedder, log) {
|
|
88
|
+
log.log(`\n=== ${source} ===`);
|
|
89
|
+
const stubs = await listForSource(source);
|
|
90
|
+
log.log(` ${stubs.length} document(s) listed`);
|
|
91
|
+
let ok = 0;
|
|
92
|
+
let fail = 0;
|
|
93
|
+
for (const stub of stubs) {
|
|
94
|
+
try {
|
|
95
|
+
const doc = await fetchOne(source, stub);
|
|
96
|
+
const rawChunks = chunkText(doc.text);
|
|
97
|
+
if (rawChunks.length === 0) {
|
|
98
|
+
log.error(` SKIP ${doc.doc_id}: no chunks emitted`);
|
|
99
|
+
continue;
|
|
100
|
+
}
|
|
101
|
+
const embeddings = [];
|
|
102
|
+
for (let i = 0; i < rawChunks.length; i += EMBED_CONCURRENCY) {
|
|
103
|
+
const batch = rawChunks.slice(i, i + EMBED_CONCURRENCY);
|
|
104
|
+
const batchResults = await Promise.all(batch.map((c) => embedder(c.text)));
|
|
105
|
+
embeddings.push(...batchResults);
|
|
106
|
+
}
|
|
107
|
+
const chunks = rawChunks.map((c, i) => ({ ...c, embedding: embeddings[i] }));
|
|
108
|
+
const row = {
|
|
109
|
+
source,
|
|
110
|
+
doc_id: doc.doc_id,
|
|
111
|
+
doc_title: doc.doc_title,
|
|
112
|
+
doc_url: doc.doc_url,
|
|
113
|
+
chunks,
|
|
114
|
+
metadata: doc.metadata,
|
|
115
|
+
};
|
|
116
|
+
unwrapOrThrow(await upsertChunks(pool, row));
|
|
117
|
+
ok++;
|
|
118
|
+
log.log(` ok ${doc.doc_id} (${chunks.length} chunks)`);
|
|
119
|
+
}
|
|
120
|
+
catch (err) {
|
|
121
|
+
fail++;
|
|
122
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
123
|
+
log.error(` FAIL ${stub.doc_id}: ${msg}`);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
return { ok, fail };
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Refresh one or more regulatory corpus sources end-to-end. Returns
|
|
130
|
+
* aggregate ok/fail counts across all requested sources. Never throws —
|
|
131
|
+
* per-document failures are counted but do not abort the run.
|
|
132
|
+
*/
|
|
133
|
+
export async function refreshRegulatoryCorpus(opts) {
|
|
134
|
+
const sources = opts.sources ?? REGULATORY_CORPUS_SOURCES;
|
|
135
|
+
const { pool, embedder } = opts;
|
|
136
|
+
const log = opts.log ?? console;
|
|
137
|
+
let totalOk = 0;
|
|
138
|
+
let totalFail = 0;
|
|
139
|
+
for (const source of sources) {
|
|
140
|
+
const { ok, fail } = await indexSource(pool, source, embedder, log);
|
|
141
|
+
totalOk += ok;
|
|
142
|
+
totalFail += fail;
|
|
143
|
+
}
|
|
144
|
+
log.log(`\nDone. ok=${totalOk} fail=${totalFail}`);
|
|
145
|
+
return { ok: totalOk, fail: totalFail };
|
|
146
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Boot-time regulatory corpus refresher.
|
|
3
|
+
*
|
|
4
|
+
* On every Cortex startup, check whether `cortex_regulatory_chunks` was
|
|
5
|
+
* last refreshed more than 90 days ago (or has never been populated). If
|
|
6
|
+
* stale, fire `refreshRegulatoryCorpus()` asynchronously so it does not
|
|
7
|
+
* block the server from coming up.
|
|
8
|
+
*
|
|
9
|
+
* Multi-replica safety: the refresh acquires a Postgres advisory lock on
|
|
10
|
+
* a dedicated `pg.Client` (advisory locks are session-scoped, so the lock
|
|
11
|
+
* only releases when the client connection closes — which we do explicitly
|
|
12
|
+
* after the refresh resolves or rejects). Replicas that lose the race
|
|
13
|
+
* skip silently. The 90-day check itself is racy against the lock holder
|
|
14
|
+
* but the cost of a redundant check is one round-trip; the actual scrape
|
|
15
|
+
* is what we serialize.
|
|
16
|
+
*/
|
|
17
|
+
import type { Pool } from "pg";
|
|
18
|
+
import { refreshRegulatoryCorpus, type RefreshOptions } from "./refresh-regulatory-corpus.js";
|
|
19
|
+
export declare const REFRESH_INTERVAL_DAYS = 90;
|
|
20
|
+
export interface BootRefreshDeps {
|
|
21
|
+
/** Shared `pg.Pool`. */
|
|
22
|
+
pool: Pool;
|
|
23
|
+
/** Forwarded to `refreshRegulatoryCorpus()` when the refresh fires. */
|
|
24
|
+
refreshOptions?: Omit<RefreshOptions, "embedder">;
|
|
25
|
+
/**
|
|
26
|
+
* Embedder injected directly (used by tests). When omitted, the boot
|
|
27
|
+
* task derives one from `REGULATORY_CORPUS_OPENAI_API_KEY` — and skips
|
|
28
|
+
* the refresh when that env var is unset, to avoid generating
|
|
29
|
+
* unattributed billing-gateway calls outside any billing scope.
|
|
30
|
+
*/
|
|
31
|
+
embedder?: (text: string) => Promise<number[]>;
|
|
32
|
+
/** Override the refresh function (used by tests). */
|
|
33
|
+
refresh?: typeof refreshRegulatoryCorpus;
|
|
34
|
+
/** Logger. Defaults to `console`. */
|
|
35
|
+
log?: Pick<Console, "log" | "warn" | "error">;
|
|
36
|
+
/** Override the staleness threshold (used by tests). */
|
|
37
|
+
intervalDays?: number;
|
|
38
|
+
/** Embedding model for the maintenance embedder (when `embedder` omitted). */
|
|
39
|
+
embeddingModel?: string;
|
|
40
|
+
/** Direct OpenAI key for the maintenance embedder (NOT a billing-gateway VK). */
|
|
41
|
+
openaiApiKey?: string;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Check the corpus freshness and, if stale, kick off an asynchronous
|
|
45
|
+
* refresh. Resolves quickly — does NOT wait for the refresh to finish.
|
|
46
|
+
*
|
|
47
|
+
* Returns:
|
|
48
|
+
* - "skipped-fresh" when corpus age < intervalDays
|
|
49
|
+
* - "skipped-unconfigured" when no maintenance embedder is available
|
|
50
|
+
* (no `REGULATORY_CORPUS_OPENAI_API_KEY` and no injected embedder)
|
|
51
|
+
* - "skipped-locked" when another replica holds the advisory lock
|
|
52
|
+
* - "started" when this replica acquired the lock and dispatched the refresh
|
|
53
|
+
* - "error" when the freshness check itself failed (refresh not attempted)
|
|
54
|
+
*/
|
|
55
|
+
export declare function maybeKickOffRegulatoryCorpusRefresh(deps: BootRefreshDeps): Promise<"skipped-fresh" | "skipped-unconfigured" | "skipped-locked" | "started" | "error">;
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Boot-time regulatory corpus refresher.
|
|
3
|
+
*
|
|
4
|
+
* On every Cortex startup, check whether `cortex_regulatory_chunks` was
|
|
5
|
+
* last refreshed more than 90 days ago (or has never been populated). If
|
|
6
|
+
* stale, fire `refreshRegulatoryCorpus()` asynchronously so it does not
|
|
7
|
+
* block the server from coming up.
|
|
8
|
+
*
|
|
9
|
+
* Multi-replica safety: the refresh acquires a Postgres advisory lock on
|
|
10
|
+
* a dedicated `pg.Client` (advisory locks are session-scoped, so the lock
|
|
11
|
+
* only releases when the client connection closes — which we do explicitly
|
|
12
|
+
* after the refresh resolves or rejects). Replicas that lose the race
|
|
13
|
+
* skip silently. The 90-day check itself is racy against the lock holder
|
|
14
|
+
* but the cost of a redundant check is one round-trip; the actual scrape
|
|
15
|
+
* is what we serialize.
|
|
16
|
+
*/
|
|
17
|
+
import { buildMaintenanceEmbedder, refreshRegulatoryCorpus } from "./refresh-regulatory-corpus.js";
|
|
18
|
+
export const REFRESH_INTERVAL_DAYS = 90;
|
|
19
|
+
const ADVISORY_LOCK_KEY = "cortex_regulatory_corpus_refresh";
|
|
20
|
+
async function checkFreshness(pool, intervalDays) {
|
|
21
|
+
const { rows } = await pool.query(`SELECT MAX(indexed_at) AS last_indexed_at,
|
|
22
|
+
EXTRACT(EPOCH FROM (NOW() - MAX(indexed_at))) / 86400 AS age_days
|
|
23
|
+
FROM cortex_regulatory_chunks`);
|
|
24
|
+
const row = rows[0];
|
|
25
|
+
const lastIndexedAt = row?.last_indexed_at ?? null;
|
|
26
|
+
const ageDays = row?.age_days != null ? Number(row.age_days) : null;
|
|
27
|
+
const stale = lastIndexedAt === null || (ageDays ?? Infinity) >= intervalDays;
|
|
28
|
+
return { stale, lastIndexedAt, ageDays };
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Hash a string into a bigint suitable for `pg_try_advisory_lock(bigint)`.
|
|
32
|
+
* Uses Postgres's own `hashtext()`.
|
|
33
|
+
*/
|
|
34
|
+
async function tryAcquireLock(client) {
|
|
35
|
+
const { rows } = await client.query("SELECT pg_try_advisory_lock(hashtext($1)) AS acquired", [ADVISORY_LOCK_KEY]);
|
|
36
|
+
return rows[0]?.acquired === true;
|
|
37
|
+
}
|
|
38
|
+
async function releaseLock(client) {
|
|
39
|
+
try {
|
|
40
|
+
await client.query("SELECT pg_advisory_unlock(hashtext($1))", [ADVISORY_LOCK_KEY]);
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
// Connection may already be closed/poisoned — release-on-disconnect
|
|
44
|
+
// covers us. Swallow.
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Check the corpus freshness and, if stale, kick off an asynchronous
|
|
49
|
+
* refresh. Resolves quickly — does NOT wait for the refresh to finish.
|
|
50
|
+
*
|
|
51
|
+
* Returns:
|
|
52
|
+
* - "skipped-fresh" when corpus age < intervalDays
|
|
53
|
+
* - "skipped-unconfigured" when no maintenance embedder is available
|
|
54
|
+
* (no `REGULATORY_CORPUS_OPENAI_API_KEY` and no injected embedder)
|
|
55
|
+
* - "skipped-locked" when another replica holds the advisory lock
|
|
56
|
+
* - "started" when this replica acquired the lock and dispatched the refresh
|
|
57
|
+
* - "error" when the freshness check itself failed (refresh not attempted)
|
|
58
|
+
*/
|
|
59
|
+
export async function maybeKickOffRegulatoryCorpusRefresh(deps) {
|
|
60
|
+
const pool = deps.pool;
|
|
61
|
+
const log = deps.log ?? console;
|
|
62
|
+
const intervalDays = deps.intervalDays ?? REFRESH_INTERVAL_DAYS;
|
|
63
|
+
const refresh = deps.refresh ?? refreshRegulatoryCorpus;
|
|
64
|
+
// Freshness first — cheap (single query) and has no env dependency. Pod
|
|
65
|
+
// restarts and scale-ups on a long-lived cluster hit this path constantly;
|
|
66
|
+
// logging "auto-refresh disabled because key is unset" on every one of
|
|
67
|
+
// them creates alert fatigue. Only complain about missing config when a
|
|
68
|
+
// refresh is actually needed.
|
|
69
|
+
let freshness;
|
|
70
|
+
try {
|
|
71
|
+
freshness = await checkFreshness(pool, intervalDays);
|
|
72
|
+
}
|
|
73
|
+
catch (err) {
|
|
74
|
+
log.warn("[boot] Regulatory corpus freshness check failed; skipping auto-refresh:", err instanceof Error ? err.message : err);
|
|
75
|
+
return "error";
|
|
76
|
+
}
|
|
77
|
+
if (!freshness.stale) {
|
|
78
|
+
log.log(`[boot] Regulatory corpus is fresh (age ${freshness.ageDays?.toFixed(1)}d < ${intervalDays}d); skipping refresh`);
|
|
79
|
+
return "skipped-fresh";
|
|
80
|
+
}
|
|
81
|
+
// Corpus is stale — resolve the maintenance embedder. System-scoped
|
|
82
|
+
// maintenance work has no analysis/target-assessment to bill against, so
|
|
83
|
+
// we route directly to api.openai.com on a dedicated key. Never the
|
|
84
|
+
// billing-gateway-routed workspace embedder, which would emit unattributed calls
|
|
85
|
+
// and flood the boot log via `billing-fetch-patch`.
|
|
86
|
+
let embedder = deps.embedder ?? null;
|
|
87
|
+
if (!embedder) {
|
|
88
|
+
try {
|
|
89
|
+
embedder = buildMaintenanceEmbedder({
|
|
90
|
+
apiKey: deps.openaiApiKey,
|
|
91
|
+
embeddingModel: deps.embeddingModel ?? "",
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
catch (err) {
|
|
95
|
+
log.warn("[boot] Could not load env for regulatory corpus refresh; skipping:", err instanceof Error ? err.message : err);
|
|
96
|
+
return "skipped-unconfigured";
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
if (!embedder) {
|
|
100
|
+
const ageStr = freshness.lastIndexedAt === null ? "empty" : `age ${freshness.ageDays?.toFixed(1)}d`;
|
|
101
|
+
log.warn(`[boot] Regulatory corpus is stale (${ageStr}) but ` +
|
|
102
|
+
"REGULATORY_CORPUS_OPENAI_API_KEY is unset; skipping auto-refresh. " +
|
|
103
|
+
"Set it (a real OpenAI key, NOT a billing-gateway virtual key — the " +
|
|
104
|
+
"maintenance embedder talks direct to api.openai.com) to enable, " +
|
|
105
|
+
"or run scripts/index-regulatory-corpus.ts manually.");
|
|
106
|
+
return "skipped-unconfigured";
|
|
107
|
+
}
|
|
108
|
+
// Acquire the advisory lock on a dedicated pool client. We hold this
|
|
109
|
+
// client (and the lock) for the whole refresh — releasing it only after
|
|
110
|
+
// the detached promise settles. Other replicas booting in the meantime
|
|
111
|
+
// hit `pg_try_advisory_lock` and skip.
|
|
112
|
+
const client = await pool.connect();
|
|
113
|
+
let acquired;
|
|
114
|
+
try {
|
|
115
|
+
acquired = await tryAcquireLock(client);
|
|
116
|
+
}
|
|
117
|
+
catch (err) {
|
|
118
|
+
client.release();
|
|
119
|
+
log.warn("[boot] Regulatory corpus advisory-lock attempt failed; skipping auto-refresh:", err instanceof Error ? err.message : err);
|
|
120
|
+
return "error";
|
|
121
|
+
}
|
|
122
|
+
if (!acquired) {
|
|
123
|
+
client.release();
|
|
124
|
+
log.log("[boot] Regulatory corpus refresh already in progress on another replica; skipping");
|
|
125
|
+
return "skipped-locked";
|
|
126
|
+
}
|
|
127
|
+
const ageStr = freshness.lastIndexedAt === null ? "empty" : `age ${freshness.ageDays?.toFixed(1)}d`;
|
|
128
|
+
log.log(`[boot] Regulatory corpus is stale (${ageStr}); starting async refresh in background`);
|
|
129
|
+
// Detached promise — startup must not wait for this to finish.
|
|
130
|
+
const dispatchEmbedder = embedder;
|
|
131
|
+
void (async () => {
|
|
132
|
+
try {
|
|
133
|
+
const result = await refresh({
|
|
134
|
+
...(deps.refreshOptions ?? {}),
|
|
135
|
+
pool,
|
|
136
|
+
embedder: dispatchEmbedder,
|
|
137
|
+
});
|
|
138
|
+
log.log(`[boot] Regulatory corpus refresh complete: ok=${result.ok} fail=${result.fail}`);
|
|
139
|
+
}
|
|
140
|
+
catch (err) {
|
|
141
|
+
log.error("[boot] Regulatory corpus refresh threw:", err instanceof Error ? err.message : err);
|
|
142
|
+
}
|
|
143
|
+
finally {
|
|
144
|
+
await releaseLock(client);
|
|
145
|
+
client.release();
|
|
146
|
+
}
|
|
147
|
+
})();
|
|
148
|
+
return "started";
|
|
149
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Test-only `ToolContext` builder. Not a `*.test.ts` file, so the test
|
|
3
|
+
* runner ignores it; imported by the tool unit tests.
|
|
4
|
+
*/
|
|
5
|
+
import type { ToolContext } from "../define-tool.js";
|
|
6
|
+
/** A `ToolContext` plus the list of events its `emit` recorded. */
|
|
7
|
+
export interface TestToolContext {
|
|
8
|
+
readonly ctx: ToolContext;
|
|
9
|
+
/** Every event passed to `ctx.emit`, in call order. */
|
|
10
|
+
readonly emitted: unknown[];
|
|
11
|
+
}
|
|
12
|
+
/** Build a `ToolContext` for tests; `emit` records into `emitted`. */
|
|
13
|
+
export declare function makeToolContext(signal?: AbortSignal): TestToolContext;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Test-only `ToolContext` builder. Not a `*.test.ts` file, so the test
|
|
3
|
+
* runner ignores it; imported by the tool unit tests.
|
|
4
|
+
*/
|
|
5
|
+
import { makeSession } from "../../providers/__fixtures__/session.js";
|
|
6
|
+
/** Build a `ToolContext` for tests; `emit` records into `emitted`. */
|
|
7
|
+
export function makeToolContext(signal) {
|
|
8
|
+
const emitted = [];
|
|
9
|
+
const ctx = {
|
|
10
|
+
session: makeSession(),
|
|
11
|
+
signal: signal ?? new AbortController().signal,
|
|
12
|
+
emit: (event) => {
|
|
13
|
+
emitted.push(event);
|
|
14
|
+
},
|
|
15
|
+
runStep: (_name, fn) => fn(),
|
|
16
|
+
};
|
|
17
|
+
return { ctx, emitted };
|
|
18
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* checkSafetyPanel — look up identifiers against the curated
|
|
3
|
+
* secondary-pharmacology safety target panel.
|
|
4
|
+
*/
|
|
5
|
+
export declare const checkSafetyPanelTool: import("../define-tool.js").Tool<{
|
|
6
|
+
identifiers: string[];
|
|
7
|
+
identifier_type: "auto" | "gene_symbol" | "uniprot" | "chembl_id";
|
|
8
|
+
filter_organ?: "hematologic" | "metabolic" | "immune" | "hepatic" | "cns" | "renal" | "respiratory" | "cardiac" | "gi" | undefined;
|
|
9
|
+
}, {
|
|
10
|
+
matches: {
|
|
11
|
+
input: string;
|
|
12
|
+
matched_entry: {
|
|
13
|
+
chembl_id: string;
|
|
14
|
+
gene_symbol: string;
|
|
15
|
+
uniprot: string;
|
|
16
|
+
name: string;
|
|
17
|
+
organ_system: "hematologic" | "metabolic" | "immune" | "hepatic" | "cns" | "renal" | "respiratory" | "cardiac" | "gi";
|
|
18
|
+
clinical_consequence: string;
|
|
19
|
+
severity: "high" | "medium" | "low";
|
|
20
|
+
references: string[];
|
|
21
|
+
ensembl_gene_id?: string | undefined;
|
|
22
|
+
} | null;
|
|
23
|
+
}[];
|
|
24
|
+
summary: {
|
|
25
|
+
total_input: number;
|
|
26
|
+
matched: number;
|
|
27
|
+
by_severity: {
|
|
28
|
+
high: number;
|
|
29
|
+
medium: number;
|
|
30
|
+
low: number;
|
|
31
|
+
};
|
|
32
|
+
by_organ: Record<string, number>;
|
|
33
|
+
};
|
|
34
|
+
panel_version: string;
|
|
35
|
+
}>;
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* checkSafetyPanel — look up identifiers against the curated
|
|
3
|
+
* secondary-pharmacology safety target panel.
|
|
4
|
+
*/
|
|
5
|
+
import { ok } from "neverthrow";
|
|
6
|
+
import { z } from "zod";
|
|
7
|
+
import { CHEMBL_RE, ORGAN_SYSTEMS, SafetyPanelFileSchema, UNIPROT_RE } from "../../data/safety-panel-schema.js";
|
|
8
|
+
import panelData from "../../data/safety-panel.json" with { type: "json" };
|
|
9
|
+
import { defineTool } from "../define-tool.js";
|
|
10
|
+
const PANEL = SafetyPanelFileSchema.parse(panelData);
|
|
11
|
+
const BY_CHEMBL = new Map(PANEL.targets.map((t) => [t.chembl_id, t]));
|
|
12
|
+
const BY_GENE = new Map(PANEL.targets.map((t) => [t.gene_symbol, t]));
|
|
13
|
+
const BY_UNIPROT = new Map(PANEL.targets.map((t) => [t.uniprot, t]));
|
|
14
|
+
function detectType(id) {
|
|
15
|
+
if (CHEMBL_RE.test(id))
|
|
16
|
+
return "chembl_id";
|
|
17
|
+
if (UNIPROT_RE.test(id))
|
|
18
|
+
return "uniprot";
|
|
19
|
+
return "gene_symbol";
|
|
20
|
+
}
|
|
21
|
+
function lookup(id, type) {
|
|
22
|
+
switch (type) {
|
|
23
|
+
case "chembl_id":
|
|
24
|
+
return BY_CHEMBL.get(id) ?? null;
|
|
25
|
+
case "gene_symbol":
|
|
26
|
+
return BY_GENE.get(id.toUpperCase()) ?? null;
|
|
27
|
+
case "uniprot":
|
|
28
|
+
return BY_UNIPROT.get(id) ?? null;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
export const checkSafetyPanelTool = defineTool({
|
|
32
|
+
id: "check_safety_panel",
|
|
33
|
+
description: "Look up identifiers (ChEMBL ID, gene symbol, or UniProt accession) against the curated " +
|
|
34
|
+
"secondary-pharmacology safety target panel. Returns organ system, severity, and clinical " +
|
|
35
|
+
"consequence for each matched target. Use as a fast first-pass off-target liability check; " +
|
|
36
|
+
"for comprehensive assessment also call get-target-safety and search-toxcast.",
|
|
37
|
+
inputSchema: z.object({
|
|
38
|
+
identifiers: z.array(z.string().min(1)).min(0).max(200).describe("0-200 identifiers (ChEMBL IDs, gene symbols, or UniProt accessions)."),
|
|
39
|
+
identifier_type: z
|
|
40
|
+
.enum(["chembl_id", "gene_symbol", "uniprot", "auto"])
|
|
41
|
+
.default("auto")
|
|
42
|
+
.describe("Identifier interpretation. 'auto' detects per-input."),
|
|
43
|
+
filter_organ: z.enum(ORGAN_SYSTEMS).optional().describe("Restrict matches to this organ system."),
|
|
44
|
+
}),
|
|
45
|
+
execute: async ({ identifiers, identifier_type = "auto", filter_organ }) => {
|
|
46
|
+
const matches = identifiers.map((input) => {
|
|
47
|
+
const type = identifier_type === "auto" ? detectType(input) : identifier_type;
|
|
48
|
+
let entry = lookup(input, type);
|
|
49
|
+
if (entry && filter_organ && entry.organ_system !== filter_organ) {
|
|
50
|
+
entry = null;
|
|
51
|
+
}
|
|
52
|
+
return { input, matched_entry: entry };
|
|
53
|
+
});
|
|
54
|
+
const bySeverity = { high: 0, medium: 0, low: 0 };
|
|
55
|
+
const byOrgan = {};
|
|
56
|
+
let matched = 0;
|
|
57
|
+
for (const m of matches) {
|
|
58
|
+
if (!m.matched_entry)
|
|
59
|
+
continue;
|
|
60
|
+
matched++;
|
|
61
|
+
bySeverity[m.matched_entry.severity]++;
|
|
62
|
+
const o = m.matched_entry.organ_system;
|
|
63
|
+
byOrgan[o] = (byOrgan[o] ?? 0) + 1;
|
|
64
|
+
}
|
|
65
|
+
return ok({
|
|
66
|
+
matches,
|
|
67
|
+
summary: {
|
|
68
|
+
total_input: identifiers.length,
|
|
69
|
+
matched,
|
|
70
|
+
by_severity: bySeverity,
|
|
71
|
+
by_organ: byOrgan,
|
|
72
|
+
},
|
|
73
|
+
panel_version: PANEL.panel_version,
|
|
74
|
+
});
|
|
75
|
+
},
|
|
76
|
+
});
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* findApprovalPrecedent — query openFDA / Drugs@FDA for prior approvals in a
|
|
3
|
+
* given indication.
|
|
4
|
+
*/
|
|
5
|
+
import { z } from "zod";
|
|
6
|
+
export declare const findApprovalPrecedentInputSchema: z.ZodObject<{
|
|
7
|
+
indication: z.ZodString;
|
|
8
|
+
modality: z.ZodOptional<z.ZodEnum<{
|
|
9
|
+
small_molecule: "small_molecule";
|
|
10
|
+
biologic: "biologic";
|
|
11
|
+
gene_therapy: "gene_therapy";
|
|
12
|
+
cell_therapy: "cell_therapy";
|
|
13
|
+
}>>;
|
|
14
|
+
mechanism: z.ZodOptional<z.ZodString>;
|
|
15
|
+
}, z.core.$strip>;
|
|
16
|
+
interface Precedent {
|
|
17
|
+
application_number: string;
|
|
18
|
+
brand_name?: string;
|
|
19
|
+
generic_name?: string;
|
|
20
|
+
approval_date?: string;
|
|
21
|
+
label_section_excerpts?: Record<string, string>;
|
|
22
|
+
}
|
|
23
|
+
export declare const findApprovalPrecedent: import("../define-tool.js").Tool<{
|
|
24
|
+
indication: string;
|
|
25
|
+
modality?: "small_molecule" | "biologic" | "gene_therapy" | "cell_therapy" | undefined;
|
|
26
|
+
mechanism?: string | undefined;
|
|
27
|
+
}, {
|
|
28
|
+
precedents: Precedent[];
|
|
29
|
+
}>;
|
|
30
|
+
/** Test-only — clears the in-memory cache to avoid cross-test bleed. */
|
|
31
|
+
export declare function __resetApprovalPrecedentCacheForTest(): void;
|
|
32
|
+
export {};
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* findApprovalPrecedent — query openFDA / Drugs@FDA for prior approvals in a
|
|
3
|
+
* given indication.
|
|
4
|
+
*/
|
|
5
|
+
import { ok } from "neverthrow";
|
|
6
|
+
import { z } from "zod";
|
|
7
|
+
import { defineTool } from "../define-tool.js";
|
|
8
|
+
export const findApprovalPrecedentInputSchema = z.object({
|
|
9
|
+
indication: z.string().min(1).describe("Indication / disease name — searched against openFDA label.indications_and_usage"),
|
|
10
|
+
modality: z
|
|
11
|
+
.enum(["small_molecule", "biologic", "gene_therapy", "cell_therapy"])
|
|
12
|
+
.optional()
|
|
13
|
+
.describe("Optional modality hint (advisory; not used for filtering today)"),
|
|
14
|
+
mechanism: z.string().optional().describe("Optional MoA / mechanism hint (advisory; not used for filtering today)"),
|
|
15
|
+
});
|
|
16
|
+
const cache = new Map();
|
|
17
|
+
const TTL_MS = 60 * 60 * 1000;
|
|
18
|
+
export const findApprovalPrecedent = defineTool({
|
|
19
|
+
id: "find_approval_precedent",
|
|
20
|
+
description: "Query openFDA / Drugs@FDA for prior approvals in a given indication. Returns NDA/BLA application numbers, generic and brand names, approval dates (effective time of the label), and label-section excerpts (boxed warning, warnings and precautions, contraindications). Use to ground class-precedent claims and disposition framing in the executive recommendation.",
|
|
21
|
+
inputSchema: findApprovalPrecedentInputSchema,
|
|
22
|
+
execute: async ({ indication, modality, mechanism }) => {
|
|
23
|
+
const key = JSON.stringify({
|
|
24
|
+
indication: indication.toLowerCase(),
|
|
25
|
+
modality,
|
|
26
|
+
mechanism,
|
|
27
|
+
});
|
|
28
|
+
const cached = cache.get(key);
|
|
29
|
+
if (cached && Date.now() - cached.ts < TTL_MS)
|
|
30
|
+
return ok(cached.value);
|
|
31
|
+
const term = indication.replace(/"/g, "");
|
|
32
|
+
const url = new URL("https://api.fda.gov/drug/label.json");
|
|
33
|
+
url.searchParams.set("search", `indications_and_usage:"${term}"`);
|
|
34
|
+
url.searchParams.set("limit", "10");
|
|
35
|
+
const res = await fetch(url);
|
|
36
|
+
// openFDA answers a zero-match search with 404 — an expected "no
|
|
37
|
+
// precedents" outcome, not a failure. It is returned uncached so a
|
|
38
|
+
// later, more specific query is not masked. Any other non-ok status
|
|
39
|
+
// (5xx, 429) is an unexpected failure and throws.
|
|
40
|
+
if (res.status === 404)
|
|
41
|
+
return ok({ precedents: [] });
|
|
42
|
+
if (!res.ok) {
|
|
43
|
+
throw new Error(`openFDA label query failed: HTTP ${res.status}`);
|
|
44
|
+
}
|
|
45
|
+
const json = (await res.json());
|
|
46
|
+
const precedents = (json.results ?? []).slice(0, 10).map((r) => {
|
|
47
|
+
const excerpts = {};
|
|
48
|
+
if (r.boxed_warning?.[0])
|
|
49
|
+
excerpts.boxed_warning = r.boxed_warning[0].slice(0, 1000);
|
|
50
|
+
if (r.warnings_and_precautions?.[0])
|
|
51
|
+
excerpts.warnings_and_precautions = r.warnings_and_precautions[0].slice(0, 1000);
|
|
52
|
+
else if (r.warnings?.[0])
|
|
53
|
+
excerpts.warnings = r.warnings[0].slice(0, 1000);
|
|
54
|
+
if (r.contraindications?.[0])
|
|
55
|
+
excerpts.contraindications = r.contraindications[0].slice(0, 1000);
|
|
56
|
+
return {
|
|
57
|
+
application_number: r.openfda?.application_number?.[0] ?? "(unknown)",
|
|
58
|
+
brand_name: r.openfda?.brand_name?.[0],
|
|
59
|
+
generic_name: r.openfda?.generic_name?.[0],
|
|
60
|
+
approval_date: r.effective_time,
|
|
61
|
+
label_section_excerpts: Object.keys(excerpts).length > 0 ? excerpts : undefined,
|
|
62
|
+
};
|
|
63
|
+
});
|
|
64
|
+
const value = { precedents };
|
|
65
|
+
cache.set(key, { ts: Date.now(), value });
|
|
66
|
+
return ok(value);
|
|
67
|
+
},
|
|
68
|
+
});
|
|
69
|
+
/** Test-only — clears the in-memory cache to avoid cross-test bleed. */
|
|
70
|
+
export function __resetApprovalPrecedentCacheForTest() {
|
|
71
|
+
cache.clear();
|
|
72
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* getArticleDetails — fetch detailed metadata for PubMed articles.
|
|
3
|
+
*/
|
|
4
|
+
export declare function createGetArticleDetailsTool(deps: {
|
|
5
|
+
ncbiApiKey?: string;
|
|
6
|
+
}): import("../define-tool.js").Tool<{
|
|
7
|
+
pmids: string[];
|
|
8
|
+
}, {
|
|
9
|
+
articles: import("../lib/ncbi-utils.js").ArticleDetail[];
|
|
10
|
+
notFound: string[];
|
|
11
|
+
}>;
|