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