@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,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Phase 4 — deterministic dossier assembly.
|
|
3
|
+
*
|
|
4
|
+
* Pure function over a Phase-3 bundle. Calls `assembleDossier` (~3.5K LOC
|
|
5
|
+
* of pure compute) and returns the assembled `DossierV4Body`. The Phase-5
|
|
6
|
+
* synthesis sections (translational commentary, liability bullets, safety-
|
|
7
|
+
* flags trail) are stamped by the Phase-5 persist step after this step
|
|
8
|
+
* completes.
|
|
9
|
+
*
|
|
10
|
+
* The DBOS workflow body wraps this in `DBOS.runStep({name: "phase4-assemble"})`
|
|
11
|
+
* so recovery on a fresh replica replays the cached output without re-running
|
|
12
|
+
* the ~1-3 sec compute.
|
|
13
|
+
*
|
|
14
|
+
* `assembleDossier` accepts an optional `ClinicalConsequenceAnnotatorDeps`
|
|
15
|
+
* bundle that is threaded through to `annotateOffTargetPanel`. For the
|
|
16
|
+
* DBOS workflow the parameter is undefined — the annotator falls back to
|
|
17
|
+
* its DB cache + no-LLM path. Threading a real deps bundle (provider +
|
|
18
|
+
* session + model) through Phase-4 is a follow-up tracked in §17 cleanup.
|
|
19
|
+
*/
|
|
20
|
+
import { DossierV4BodySchema } from "@inflexa-ai/harness/contracts/target-dossier.js";
|
|
21
|
+
import { z } from "zod";
|
|
22
|
+
import { assembleDossier } from "./assemblers/index.js";
|
|
23
|
+
import { Phase3BundleSchema } from "./steps/phase3-aggregate.js";
|
|
24
|
+
export const Phase4OutputSchema = z.object({
|
|
25
|
+
assessmentId: z.string(),
|
|
26
|
+
dossier: DossierV4BodySchema,
|
|
27
|
+
});
|
|
28
|
+
export { Phase3BundleSchema };
|
|
29
|
+
/**
|
|
30
|
+
* Run Phase 4 — assemble the v4 dossier body from the Phase-3 bundle.
|
|
31
|
+
* Deterministic over its inputs; safely cached on DBOS replay.
|
|
32
|
+
*/
|
|
33
|
+
export async function phase4Assemble(pool, phase3) {
|
|
34
|
+
const dossier = await assembleDossier(pool, phase3.phase2, phase3, undefined);
|
|
35
|
+
return {
|
|
36
|
+
assessmentId: phase3.phase2.phase1.resolved.assessmentId,
|
|
37
|
+
dossier,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Phase 5 — stamps the four Phase-5 synthesis outputs into the Phase-4 dossier,
|
|
3
|
+
* runs the deterministic refinement passes (coverage-qualifier reconcile,
|
|
4
|
+
* no-liabilities disclosure rewrite, recommendation citation validation +
|
|
5
|
+
* demotion, recommendation quality gates), upgrades the v4 body to v5,
|
|
6
|
+
* computes derived fields, and validates against `DossierV5Schema`.
|
|
7
|
+
*
|
|
8
|
+
* The DB write (`setDossier` / `markFailed`) lives in the workflow's terminal
|
|
9
|
+
* handler in §6. This module returns the validated dossier instead of writing it.
|
|
10
|
+
* Typed throws (`DossierSchemaViolationError`, `DossierDerivedInvariantError`)
|
|
11
|
+
* let the terminal handler dispatch to `markFailed` with the matching `error.kind`.
|
|
12
|
+
*
|
|
13
|
+
* The direction-of-effect audit (`auditCitationDirections`) is NOT called here —
|
|
14
|
+
* it requires an LLM and is not on the PR #4 critical path. Follow-up tracked
|
|
15
|
+
* in §17 if a harness-native audit pipeline is wired.
|
|
16
|
+
*/
|
|
17
|
+
import { z } from "zod";
|
|
18
|
+
import { type DossierV4Body } from "@inflexa-ai/harness/contracts/target-dossier.js";
|
|
19
|
+
import type { Phase2Bundle } from "./steps/phase2-aggregate.js";
|
|
20
|
+
import type { DossierRecommendationStepOutput, LiabilityBulletsStepOutput, SafetyFlagsTrailStepOutput, TranslationalCommentaryStepOutput } from "./synthesis/index.js";
|
|
21
|
+
export declare class DossierSchemaViolationError extends Error {
|
|
22
|
+
readonly issues: readonly unknown[];
|
|
23
|
+
constructor(message: string, issues: readonly unknown[]);
|
|
24
|
+
}
|
|
25
|
+
export declare class DossierDerivedInvariantError extends Error {
|
|
26
|
+
readonly cause?: unknown | undefined;
|
|
27
|
+
constructor(message: string, cause?: unknown | undefined);
|
|
28
|
+
}
|
|
29
|
+
export interface Phase5PersistInput {
|
|
30
|
+
readonly assessmentId: string;
|
|
31
|
+
readonly phase4Dossier: DossierV4Body;
|
|
32
|
+
readonly phase2: Phase2Bundle;
|
|
33
|
+
readonly synthesis: {
|
|
34
|
+
readonly bullets: LiabilityBulletsStepOutput;
|
|
35
|
+
readonly flags: SafetyFlagsTrailStepOutput;
|
|
36
|
+
readonly commentary: TranslationalCommentaryStepOutput;
|
|
37
|
+
readonly recommendation: DossierRecommendationStepOutput;
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
export declare const Phase5PersistResultSchema: z.ZodObject<{
|
|
41
|
+
assessmentId: z.ZodString;
|
|
42
|
+
dossier: z.ZodRecord<z.ZodString, z.ZodUnknown>;
|
|
43
|
+
bytes: z.ZodNumber;
|
|
44
|
+
}, z.core.$strip>;
|
|
45
|
+
export interface Phase5PersistResult {
|
|
46
|
+
readonly assessmentId: string;
|
|
47
|
+
readonly dossier: Record<string, unknown>;
|
|
48
|
+
readonly bytes: number;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Run Phase-5 persist as a pure function. Returns the validated v5
|
|
52
|
+
* dossier (and computed bytes) on success. Throws
|
|
53
|
+
* `DossierDerivedInvariantError` when `computeDerivedFields` rejects the
|
|
54
|
+
* dossier; throws `DossierSchemaViolationError` when the v5 schema
|
|
55
|
+
* rejects the final dossier.
|
|
56
|
+
*/
|
|
57
|
+
export declare function phase5Persist(input: Phase5PersistInput): Promise<Phase5PersistResult>;
|
|
@@ -0,0 +1,461 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Phase 5 — stamps the four Phase-5 synthesis outputs into the Phase-4 dossier,
|
|
3
|
+
* runs the deterministic refinement passes (coverage-qualifier reconcile,
|
|
4
|
+
* no-liabilities disclosure rewrite, recommendation citation validation +
|
|
5
|
+
* demotion, recommendation quality gates), upgrades the v4 body to v5,
|
|
6
|
+
* computes derived fields, and validates against `DossierV5Schema`.
|
|
7
|
+
*
|
|
8
|
+
* The DB write (`setDossier` / `markFailed`) lives in the workflow's terminal
|
|
9
|
+
* handler in §6. This module returns the validated dossier instead of writing it.
|
|
10
|
+
* Typed throws (`DossierSchemaViolationError`, `DossierDerivedInvariantError`)
|
|
11
|
+
* let the terminal handler dispatch to `markFailed` with the matching `error.kind`.
|
|
12
|
+
*
|
|
13
|
+
* The direction-of-effect audit (`auditCitationDirections`) is NOT called here —
|
|
14
|
+
* it requires an LLM and is not on the PR #4 critical path. Follow-up tracked
|
|
15
|
+
* in §17 if a harness-native audit pipeline is wired.
|
|
16
|
+
*/
|
|
17
|
+
import { z } from "zod";
|
|
18
|
+
import { DossierV5Schema, } from "@inflexa-ai/harness/contracts/target-dossier.js";
|
|
19
|
+
import { getDrugPrimaryTargetUniprots } from "../../tools/lib/chembl-client.js";
|
|
20
|
+
import { deterministicTranslationalCommentary } from "./assemblers/index.js";
|
|
21
|
+
import { validateRecommendationCitations } from "./lib/citation-validator.js";
|
|
22
|
+
import { classifyClinicalEvidenceTrial } from "./lib/clinical-evidence-attribution.js";
|
|
23
|
+
import { computeDerivedFields } from "./lib/compute-derived.js";
|
|
24
|
+
import { detectStructuralEvidenceConflicts } from "./lib/evidence-conflict-detector.js";
|
|
25
|
+
import { applyRecommendationQualityGates } from "./lib/recommendation-quality-gates.js";
|
|
26
|
+
import { sanitizeRecommendation } from "./lib/recommendation-sanitizer.js";
|
|
27
|
+
import { resolveFamilySiblingUniprots } from "./lib/target-identity-filter.js";
|
|
28
|
+
const SOFT_CAP_BYTES = 16 * 1024 * 1024;
|
|
29
|
+
// ── Typed throws — handled in §6 terminal handler ────────────────────
|
|
30
|
+
export class DossierSchemaViolationError extends Error {
|
|
31
|
+
issues;
|
|
32
|
+
constructor(message, issues) {
|
|
33
|
+
super(message);
|
|
34
|
+
this.issues = issues;
|
|
35
|
+
this.name = "DossierSchemaViolationError";
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
export class DossierDerivedInvariantError extends Error {
|
|
39
|
+
cause;
|
|
40
|
+
constructor(message, cause) {
|
|
41
|
+
super(message);
|
|
42
|
+
this.cause = cause;
|
|
43
|
+
this.name = "DossierDerivedInvariantError";
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
export const Phase5PersistResultSchema = z.object({
|
|
47
|
+
assessmentId: z.string(),
|
|
48
|
+
dossier: z.record(z.string(), z.unknown()),
|
|
49
|
+
bytes: z.number(),
|
|
50
|
+
});
|
|
51
|
+
// ── Internal helpers ─────────────────────────────────────────────────
|
|
52
|
+
function approximateSize(d) {
|
|
53
|
+
return Buffer.byteLength(JSON.stringify(d), "utf-8");
|
|
54
|
+
}
|
|
55
|
+
function truncateOversize(d) {
|
|
56
|
+
const next = structuredClone(d);
|
|
57
|
+
const ta = next.reference_biology.therapeutic_area_associations;
|
|
58
|
+
if (ta.coverage === "available" && ta.data.rows.length > 50) {
|
|
59
|
+
ta.data.rows = ta.data.rows.slice(0, 50);
|
|
60
|
+
ta.truncated = true;
|
|
61
|
+
}
|
|
62
|
+
const ind = next.indications;
|
|
63
|
+
if (ind.coverage === "available" && ind.data.rows.length > 25) {
|
|
64
|
+
ind.data.rows = ind.data.rows.slice(0, 25);
|
|
65
|
+
ind.truncated = true;
|
|
66
|
+
}
|
|
67
|
+
const ppi = next.reference_biology.ppi_network;
|
|
68
|
+
if (ppi.coverage === "available" && ppi.data.partners.length > 50) {
|
|
69
|
+
ppi.data.partners = ppi.data.partners.slice(0, 50);
|
|
70
|
+
ppi.truncated = true;
|
|
71
|
+
}
|
|
72
|
+
return next;
|
|
73
|
+
}
|
|
74
|
+
function pickCommentarySeverity(row) {
|
|
75
|
+
const blob = `${row.predicate} ${row.commentary}`.toLowerCase();
|
|
76
|
+
if (row.topic === "ko_phenotype" && /pre[- ]?weaning|embryonic|lethal/i.test(blob)) {
|
|
77
|
+
return "caution";
|
|
78
|
+
}
|
|
79
|
+
if (row.topic === "expression_translation" && /(≥|>=|two[- ]?step|2[- ]?step|diverge|divergence|rank.*differ)/i.test(blob)) {
|
|
80
|
+
return "caution";
|
|
81
|
+
}
|
|
82
|
+
if (/queried.+(no data|no calls|empty|no tissue)/i.test(blob)) {
|
|
83
|
+
return "gap";
|
|
84
|
+
}
|
|
85
|
+
return "ok";
|
|
86
|
+
}
|
|
87
|
+
function stampSynthesis(phase4Dossier, syn, phase2) {
|
|
88
|
+
const next = structuredClone(phase4Dossier);
|
|
89
|
+
if (syn.bullets.coverage === "available") {
|
|
90
|
+
next.liability_summary.liability_bullets = syn.bullets.data.bullets.map((b) => ({ text: b.text, rationale: b.rationale, category: b.category }));
|
|
91
|
+
}
|
|
92
|
+
if (syn.flags.coverage === "available" && syn.flags.data.flags.length > 0) {
|
|
93
|
+
next.safety_profile.target_organ_liabilities = syn.flags.data.flags;
|
|
94
|
+
}
|
|
95
|
+
const deterministicAll = deterministicTranslationalCommentary(phase2);
|
|
96
|
+
const deterministicSorted = [...deterministicAll].sort((a, b) => {
|
|
97
|
+
const order = { caution: 0, gap: 1, ok: 2 };
|
|
98
|
+
return order[a.severity] - order[b.severity];
|
|
99
|
+
});
|
|
100
|
+
const deterministic = deterministicSorted.slice(0, 4);
|
|
101
|
+
const agentRows = syn.commentary.coverage === "available"
|
|
102
|
+
? syn.commentary.data.rows.slice(0, 4).map((r) => ({
|
|
103
|
+
severity: pickCommentarySeverity(r),
|
|
104
|
+
text: `${r.predicate}. ${r.commentary}`,
|
|
105
|
+
}))
|
|
106
|
+
: [];
|
|
107
|
+
const allRows = [...deterministic, ...agentRows].slice(0, 8);
|
|
108
|
+
if (allRows.length > 0) {
|
|
109
|
+
next.reference_biology.preclinical.translational_commentary = {
|
|
110
|
+
coverage: "available",
|
|
111
|
+
data: { rows: allRows },
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
else if (syn.commentary.coverage === "queried_no_data") {
|
|
115
|
+
next.reference_biology.preclinical.translational_commentary = {
|
|
116
|
+
coverage: "queried_no_data",
|
|
117
|
+
error: syn.commentary.error,
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
const recommendation = syn.recommendation.coverage === "available"
|
|
121
|
+
? {
|
|
122
|
+
coverage: "available",
|
|
123
|
+
data: sanitizeRecommendation(syn.recommendation.data),
|
|
124
|
+
}
|
|
125
|
+
: {
|
|
126
|
+
coverage: "queried_no_data",
|
|
127
|
+
error: syn.recommendation.error,
|
|
128
|
+
};
|
|
129
|
+
next.executive_recommendation = recommendation;
|
|
130
|
+
if (syn.flags.coverage !== "available" && next.executive_recommendation.coverage === "available") {
|
|
131
|
+
const qual = next.executive_recommendation.data.coverage_qualifier;
|
|
132
|
+
if (qual) {
|
|
133
|
+
if (!qual.sections_unavailable.includes("safety_profile.target_organ_liabilities")) {
|
|
134
|
+
qual.sections_unavailable.push("safety_profile.target_organ_liabilities");
|
|
135
|
+
}
|
|
136
|
+
const errorKind = syn.flags.error?.kind ?? "unavailable";
|
|
137
|
+
const annotation = `The deterministic safety-flag audit trail was not generated for this dossier (synthesis step \`safety-flags-trail\` failed with \`${errorKind}\`); the safety-bullet citations below are not anchored to a per-flag audit row.`;
|
|
138
|
+
qual.note = qual.note ? `${annotation} ${qual.note}` : annotation;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
const diagnostics = [syn.bullets.diagnostic, syn.flags.diagnostic, syn.commentary.diagnostic, syn.recommendation.diagnostic];
|
|
142
|
+
next.analytics.synthesis_diagnostics = {
|
|
143
|
+
coverage: "available",
|
|
144
|
+
data: { rows: diagnostics },
|
|
145
|
+
};
|
|
146
|
+
if (syn.recommendation.coverage === "available") {
|
|
147
|
+
try {
|
|
148
|
+
const audit = validateRecommendationCitations(syn.recommendation.data, next);
|
|
149
|
+
if (audit.citations_unresolved.length > 0) {
|
|
150
|
+
console.warn(`[phase5-persist] recommendation_audit: ${audit.citations_unresolved.length} unresolved citation(s)`);
|
|
151
|
+
}
|
|
152
|
+
next.analytics.recommendation_audit = {
|
|
153
|
+
coverage: "available",
|
|
154
|
+
data: audit,
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
catch (err) {
|
|
158
|
+
next.analytics.recommendation_audit = {
|
|
159
|
+
coverage: "queried_no_data",
|
|
160
|
+
error: { message: err instanceof Error ? err.message : String(err) },
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
return next;
|
|
165
|
+
}
|
|
166
|
+
function applyCitationAuditDemotion(rec, audit) {
|
|
167
|
+
const flagged = audit.citations_unresolved.filter((u) => u.surface === "organ_claim_without_probe_pass");
|
|
168
|
+
if (flagged.length === 0)
|
|
169
|
+
return rec;
|
|
170
|
+
const flaggedExcerpts = flagged.map((f) => ("excerpt" in f ? f.excerpt : ""));
|
|
171
|
+
const keptRisks = [];
|
|
172
|
+
const demotedTexts = new Set();
|
|
173
|
+
for (const risk of rec.key_risks) {
|
|
174
|
+
const isFlagged = flaggedExcerpts.some((excerpt) => excerpt.length > 0 && risk.includes(excerpt.slice(0, Math.min(80, excerpt.length))));
|
|
175
|
+
if (isFlagged) {
|
|
176
|
+
demotedTexts.add(risk);
|
|
177
|
+
}
|
|
178
|
+
else {
|
|
179
|
+
keptRisks.push(risk);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
const unverified = flagged.map((f) => ({
|
|
183
|
+
text: [...demotedTexts].find((t) => "excerpt" in f && t.includes(f.excerpt.slice(0, Math.min(80, f.excerpt.length)))) ?? ("excerpt" in f ? f.excerpt : ""),
|
|
184
|
+
bullet_category: f.bullet_category,
|
|
185
|
+
surface: "organ_claim_without_probe_pass",
|
|
186
|
+
}));
|
|
187
|
+
return {
|
|
188
|
+
...rec,
|
|
189
|
+
key_risks: keptRisks,
|
|
190
|
+
coverage_qualifier: {
|
|
191
|
+
...rec.coverage_qualifier,
|
|
192
|
+
unverified_bullets: unverified,
|
|
193
|
+
},
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
function rewriteNoLiabilitiesDisclosure(dossier) {
|
|
197
|
+
const ls = dossier.liability_summary;
|
|
198
|
+
if (!ls)
|
|
199
|
+
return;
|
|
200
|
+
const bullets = Array.isArray(ls.liability_bullets)
|
|
201
|
+
? ls.liability_bullets
|
|
202
|
+
: [];
|
|
203
|
+
const current = String(ls.no_liabilities_disclosure ?? "");
|
|
204
|
+
if (current.startsWith("insufficient safety data"))
|
|
205
|
+
return;
|
|
206
|
+
const m = current.match(/(\d+) of 4 safety data sources returned data/);
|
|
207
|
+
if (!m)
|
|
208
|
+
return;
|
|
209
|
+
const N = m[1];
|
|
210
|
+
if (bullets.length === 0) {
|
|
211
|
+
ls.no_liabilities_disclosure =
|
|
212
|
+
`${N} of 4 safety data sources returned data; no class-level liabilities synthesised`;
|
|
213
|
+
}
|
|
214
|
+
else {
|
|
215
|
+
ls.no_liabilities_disclosure =
|
|
216
|
+
`${bullets.length} liabilities identified across ${N} of 4 safety data sources`;
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
function resolveSection(dossier, path) {
|
|
220
|
+
let cur = dossier;
|
|
221
|
+
for (const part of path.split(".")) {
|
|
222
|
+
if (cur == null || typeof cur !== "object")
|
|
223
|
+
return { resolved: false };
|
|
224
|
+
cur = cur[part];
|
|
225
|
+
}
|
|
226
|
+
if (cur === undefined)
|
|
227
|
+
return { resolved: false };
|
|
228
|
+
const coverage = cur && typeof cur === "object" && typeof cur.coverage === "string" ? cur.coverage : undefined;
|
|
229
|
+
return { resolved: true, coverage };
|
|
230
|
+
}
|
|
231
|
+
function reconcileCoverageQualifier(dossier) {
|
|
232
|
+
const cq = dossier.executive_recommendation
|
|
233
|
+
?.data?.coverage_qualifier;
|
|
234
|
+
if (!cq || !Array.isArray(cq.sections_unavailable))
|
|
235
|
+
return;
|
|
236
|
+
cq.sections_unavailable = cq.sections_unavailable.filter((entry) => {
|
|
237
|
+
const path = String(entry).split(" (")[0].trim();
|
|
238
|
+
const { resolved, coverage } = resolveSection(dossier, path);
|
|
239
|
+
if (!resolved)
|
|
240
|
+
return false;
|
|
241
|
+
return coverage !== "available";
|
|
242
|
+
});
|
|
243
|
+
}
|
|
244
|
+
function makeUnknownAttribution(reason) {
|
|
245
|
+
return {
|
|
246
|
+
relationship: "unknown",
|
|
247
|
+
evidence_role: "excluded",
|
|
248
|
+
basis: [{ kind: "text_match", source: "legacy-v4-upgrade" }],
|
|
249
|
+
resolved_interventions: [],
|
|
250
|
+
exclusion_reason: reason,
|
|
251
|
+
};
|
|
252
|
+
}
|
|
253
|
+
async function buildAttributionContext(phase2, knownClassDrugsBase, therapeuticPrograms) {
|
|
254
|
+
const ctgov = phase2.phase1.collectors.ctgov.coverage === "available"
|
|
255
|
+
? [...phase2.phase1.collectors.ctgov.data.active, ...phase2.phase1.collectors.ctgov.data.failed]
|
|
256
|
+
: [];
|
|
257
|
+
const assessmentUniprot = phase2.phase1.resolved.ids?.uniprot ?? "";
|
|
258
|
+
const geneSymbol = phase2.phase1.resolved.geneSymbol ?? "";
|
|
259
|
+
const [familyUniprots, resolvedDrugs] = await Promise.all([
|
|
260
|
+
assessmentUniprot || geneSymbol ? resolveFamilySiblingUniprots(assessmentUniprot || geneSymbol) : Promise.resolve([]),
|
|
261
|
+
Promise.all(knownClassDrugsBase.map(async (drug) => {
|
|
262
|
+
const resolved = drug.moleculeChemblId ? await getDrugPrimaryTargetUniprots(drug.moleculeChemblId).catch(() => []) : [];
|
|
263
|
+
const targetUniprots = resolved.length > 0 ? resolved : assessmentUniprot ? [assessmentUniprot] : [];
|
|
264
|
+
return { ...drug, targetUniprots };
|
|
265
|
+
})),
|
|
266
|
+
]);
|
|
267
|
+
return {
|
|
268
|
+
byNct: new Map(ctgov.map((trial) => [trial.nctId, trial])),
|
|
269
|
+
classifyOpts: {
|
|
270
|
+
assessmentSymbol: geneSymbol,
|
|
271
|
+
assessmentUniprot,
|
|
272
|
+
familyUniprots,
|
|
273
|
+
knownClassDrugs: resolvedDrugs,
|
|
274
|
+
therapeuticPrograms,
|
|
275
|
+
},
|
|
276
|
+
};
|
|
277
|
+
}
|
|
278
|
+
function attachAttribution(row, ctx) {
|
|
279
|
+
const source = ctx.byNct.get(row.nct_id);
|
|
280
|
+
const classified = source
|
|
281
|
+
? classifyClinicalEvidenceTrial(source, ctx.classifyOpts)
|
|
282
|
+
: {
|
|
283
|
+
attribution: makeUnknownAttribution("No normalized CT.gov source row was available for this legacy row."),
|
|
284
|
+
eligible_for_toxicology_aggregation: false,
|
|
285
|
+
};
|
|
286
|
+
return {
|
|
287
|
+
...row,
|
|
288
|
+
attribution: classified.attribution,
|
|
289
|
+
eligible_for_toxicology_aggregation: classified.eligible_for_toxicology_aggregation,
|
|
290
|
+
};
|
|
291
|
+
}
|
|
292
|
+
function upgradeTrialRows(rows, ctx) {
|
|
293
|
+
const kept = [];
|
|
294
|
+
const excluded = [];
|
|
295
|
+
for (const row of rows) {
|
|
296
|
+
const upgraded = attachAttribution(row, ctx);
|
|
297
|
+
if (upgraded.eligible_for_toxicology_aggregation)
|
|
298
|
+
kept.push(upgraded);
|
|
299
|
+
else
|
|
300
|
+
excluded.push(upgraded);
|
|
301
|
+
}
|
|
302
|
+
return { rows: kept, excluded_rows: excluded };
|
|
303
|
+
}
|
|
304
|
+
function normalizeRegulatoryActionRows(rows) {
|
|
305
|
+
return rows.map((row) => {
|
|
306
|
+
if (row.source_kind)
|
|
307
|
+
return row;
|
|
308
|
+
const action_kind = row.action_kind;
|
|
309
|
+
const agency = row.agency;
|
|
310
|
+
const source_kind = action_kind === "black_box"
|
|
311
|
+
? "boxed_warning"
|
|
312
|
+
: action_kind === "REMS"
|
|
313
|
+
? "rems"
|
|
314
|
+
: action_kind === "withdrawal"
|
|
315
|
+
? "withdrawal"
|
|
316
|
+
: agency === "EMA"
|
|
317
|
+
? "referral"
|
|
318
|
+
: "label_warning";
|
|
319
|
+
return {
|
|
320
|
+
...row,
|
|
321
|
+
source_kind,
|
|
322
|
+
action_kind: source_kind === "label_warning" && action_kind === "safety_communication" ? "label_warning" : action_kind,
|
|
323
|
+
source_date: row.action_date,
|
|
324
|
+
};
|
|
325
|
+
});
|
|
326
|
+
}
|
|
327
|
+
async function upgradeDossierToV5(body, phase2) {
|
|
328
|
+
const next = structuredClone(body);
|
|
329
|
+
next.schema_version = "5";
|
|
330
|
+
const drugInteractions = next.drug_interactions;
|
|
331
|
+
const knownClassDrugsBase = drugInteractions?.coverage === "available"
|
|
332
|
+
? (drugInteractions.data?.rows ?? []).map((row) => ({
|
|
333
|
+
name: String(row.drug_name ?? ""),
|
|
334
|
+
moleculeChemblId: row.drug_id ?? null,
|
|
335
|
+
}))
|
|
336
|
+
: [];
|
|
337
|
+
const tpCollector = phase2.phase1.collectors.therapeuticPrograms;
|
|
338
|
+
const therapeuticPrograms = tpCollector?.coverage === "available"
|
|
339
|
+
? tpCollector.data.programs.map((program) => ({
|
|
340
|
+
programId: program.programId,
|
|
341
|
+
name: program.name,
|
|
342
|
+
targetSymbol: program.targetSymbol,
|
|
343
|
+
targetUniprot: program.targetUniprot,
|
|
344
|
+
modality: program.modality,
|
|
345
|
+
nctIds: program.nctIds,
|
|
346
|
+
}))
|
|
347
|
+
: [];
|
|
348
|
+
const attributionCtx = await buildAttributionContext(phase2, knownClassDrugsBase, therapeuticPrograms);
|
|
349
|
+
const cd = next.clinical_development;
|
|
350
|
+
if (cd?.trials?.coverage === "available") {
|
|
351
|
+
const upgraded = upgradeTrialRows(cd.trials.data.rows, attributionCtx);
|
|
352
|
+
cd.trials.data.rows = upgraded.rows;
|
|
353
|
+
cd.trials.data.excluded_rows = [...(cd.trials.data.excluded_rows ?? []), ...upgraded.excluded_rows];
|
|
354
|
+
}
|
|
355
|
+
if (cd?.failed_trials?.coverage === "available") {
|
|
356
|
+
const upgraded = upgradeTrialRows(cd.failed_trials.data.rows, attributionCtx);
|
|
357
|
+
cd.failed_trials.data.rows = upgraded.rows;
|
|
358
|
+
cd.failed_trials.data.excluded_rows = [...(cd.failed_trials.data.excluded_rows ?? []), ...upgraded.excluded_rows];
|
|
359
|
+
}
|
|
360
|
+
if (cd?.outcomes?.coverage === "available") {
|
|
361
|
+
cd.outcomes.data.rows = cd.outcomes.data.rows.map((row) => attachAttribution(row, attributionCtx));
|
|
362
|
+
}
|
|
363
|
+
const analytics = next.analytics;
|
|
364
|
+
if (analytics?.discovery_trials?.coverage === "available") {
|
|
365
|
+
const upgraded = upgradeTrialRows(analytics.discovery_trials.data.rows, attributionCtx);
|
|
366
|
+
analytics.discovery_trials.data.rows = upgraded.rows;
|
|
367
|
+
analytics.discovery_trials.data.excluded_rows = [...(analytics.discovery_trials.data.excluded_rows ?? []), ...upgraded.excluded_rows];
|
|
368
|
+
delete analytics.discovery_trials.data.related_target_trials;
|
|
369
|
+
delete analytics.discovery_trials.data.related_receptor;
|
|
370
|
+
}
|
|
371
|
+
const sp = next.safety_profile;
|
|
372
|
+
const regulatory = sp?.regulatory_actions;
|
|
373
|
+
if (regulatory?.coverage === "available") {
|
|
374
|
+
regulatory.data.rows = normalizeRegulatoryActionRows(regulatory.data.rows ?? []);
|
|
375
|
+
}
|
|
376
|
+
next.analytics.quality_gates ??= {
|
|
377
|
+
coverage: "available",
|
|
378
|
+
data: { rows: [] },
|
|
379
|
+
};
|
|
380
|
+
return next;
|
|
381
|
+
}
|
|
382
|
+
// ── Pure-function entry point ────────────────────────────────────────
|
|
383
|
+
/**
|
|
384
|
+
* Run Phase-5 persist as a pure function. Returns the validated v5
|
|
385
|
+
* dossier (and computed bytes) on success. Throws
|
|
386
|
+
* `DossierDerivedInvariantError` when `computeDerivedFields` rejects the
|
|
387
|
+
* dossier; throws `DossierSchemaViolationError` when the v5 schema
|
|
388
|
+
* rejects the final dossier.
|
|
389
|
+
*/
|
|
390
|
+
export async function phase5Persist(input) {
|
|
391
|
+
// The dossier rides through this function as an untyped working blob; the
|
|
392
|
+
// `as unknown as DossierV{4,5}Body` casts below are version-shim views that
|
|
393
|
+
// let the typed helpers operate on it. None of these casts is load-bearing
|
|
394
|
+
// for soundness: `DossierV5Schema.safeParse(fullDossier)` at the end is the
|
|
395
|
+
// single validation gate, and it throws before anything is returned.
|
|
396
|
+
let dossier = stampSynthesis(input.phase4Dossier, input.synthesis, input.phase2);
|
|
397
|
+
// Demote organ-claim flagged bullets into coverage_qualifier.unverified_bullets.
|
|
398
|
+
const exec = dossier.executive_recommendation;
|
|
399
|
+
if (exec?.coverage === "available") {
|
|
400
|
+
const audit = dossier.analytics.recommendation_audit?.data;
|
|
401
|
+
if (audit && exec.data) {
|
|
402
|
+
dossier.executive_recommendation.data = applyCitationAuditDemotion(exec.data, audit);
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
reconcileCoverageQualifier(dossier);
|
|
406
|
+
rewriteNoLiabilitiesDisclosure(dossier);
|
|
407
|
+
dossier = (await upgradeDossierToV5(dossier, input.phase2));
|
|
408
|
+
const recommendationAudit = dossier.analytics.recommendation_audit?.data;
|
|
409
|
+
const synthesisDiagnostics = dossier.analytics.synthesis_diagnostics?.coverage ===
|
|
410
|
+
"available"
|
|
411
|
+
? dossier.analytics.synthesis_diagnostics.data.rows
|
|
412
|
+
: [];
|
|
413
|
+
const trials = dossier.clinical_development
|
|
414
|
+
.trials;
|
|
415
|
+
const hasDirectClinicalEvidence = trials?.coverage === "available" && (trials.data.rows ?? []).some((row) => row.eligible_for_toxicology_aggregation === true);
|
|
416
|
+
const gated = applyRecommendationQualityGates({
|
|
417
|
+
executive_recommendation: dossier.executive_recommendation,
|
|
418
|
+
synthesis_diagnostics: synthesisDiagnostics,
|
|
419
|
+
recommendation_audit: recommendationAudit,
|
|
420
|
+
has_direct_clinical_evidence: hasDirectClinicalEvidence,
|
|
421
|
+
});
|
|
422
|
+
dossier.executive_recommendation = gated.executive_recommendation;
|
|
423
|
+
const qg = dossier.analytics.quality_gates;
|
|
424
|
+
dossier.analytics.quality_gates = {
|
|
425
|
+
coverage: "available",
|
|
426
|
+
data: {
|
|
427
|
+
rows: [...(qg?.data?.rows ?? []), ...gated.quality_gates],
|
|
428
|
+
},
|
|
429
|
+
};
|
|
430
|
+
let bytes = approximateSize(dossier);
|
|
431
|
+
if (bytes > SOFT_CAP_BYTES) {
|
|
432
|
+
dossier = truncateOversize(dossier);
|
|
433
|
+
bytes = approximateSize(dossier);
|
|
434
|
+
}
|
|
435
|
+
let derived;
|
|
436
|
+
try {
|
|
437
|
+
derived = computeDerivedFields(dossier);
|
|
438
|
+
}
|
|
439
|
+
catch (err) {
|
|
440
|
+
throw new DossierDerivedInvariantError(err instanceof Error ? err.message : String(err), err);
|
|
441
|
+
}
|
|
442
|
+
const fullDossier = { ...dossier, derived };
|
|
443
|
+
const structuralConflicts = detectStructuralEvidenceConflicts(fullDossier);
|
|
444
|
+
if (structuralConflicts.length > 0) {
|
|
445
|
+
const existing = fullDossier.analytics.evidence_conflicts;
|
|
446
|
+
const existingRows = existing?.coverage === "available" ? (existing.data?.rows ?? []) : [];
|
|
447
|
+
fullDossier.analytics.evidence_conflicts = {
|
|
448
|
+
coverage: "available",
|
|
449
|
+
data: { rows: [...existingRows, ...structuralConflicts] },
|
|
450
|
+
};
|
|
451
|
+
}
|
|
452
|
+
const parsed = DossierV5Schema.safeParse(fullDossier);
|
|
453
|
+
if (!parsed.success) {
|
|
454
|
+
throw new DossierSchemaViolationError("Dossier failed v5 schema validation", parsed.error.issues);
|
|
455
|
+
}
|
|
456
|
+
return {
|
|
457
|
+
assessmentId: input.assessmentId,
|
|
458
|
+
dossier: parsed.data,
|
|
459
|
+
bytes,
|
|
460
|
+
};
|
|
461
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Progress emission for the target-assessment DBOS workflow.
|
|
3
|
+
*
|
|
4
|
+
* Emits a typed `data-target-assessment-progress` part via
|
|
5
|
+
* `DBOS.writeStream("progress", part)` and updates `cortex_target_assessments.progress`.
|
|
6
|
+
* Both writes happen inside a `DBOS.runStep` so a recovered workflow does not
|
|
7
|
+
* duplicate the event.
|
|
8
|
+
*
|
|
9
|
+
* Wire shape: `TargetAssessmentProgressEventSchema` in
|
|
10
|
+
* `harness/src/contracts/target-dossier.ts`. The SSE route reads via
|
|
11
|
+
* `DBOS.readStream(workflowId, "progress")` and folds-on-read by `phase`.
|
|
12
|
+
*/
|
|
13
|
+
import type { Pool } from "pg";
|
|
14
|
+
import type { TargetAssessmentPhase, TargetAssessmentProgressEvent } from "@inflexa-ai/harness/contracts/target-dossier.js";
|
|
15
|
+
/** DBOS stream key the SSE route reads via `DBOS.readStream(wfId, "progress")`. */
|
|
16
|
+
export declare const TA_PROGRESS_STREAM_KEY = "progress";
|
|
17
|
+
export type ProgressPhase = TargetAssessmentPhase;
|
|
18
|
+
/**
|
|
19
|
+
* Wire shape of one progress event. Matches the harness's contracts
|
|
20
|
+
* `TargetAssessmentProgressEventSchema`. Wrapped in a typed chat part
|
|
21
|
+
* envelope by the SSE route on the way out.
|
|
22
|
+
*/
|
|
23
|
+
export interface ProgressPart {
|
|
24
|
+
readonly type: "data-target-assessment-progress";
|
|
25
|
+
readonly payload: TargetAssessmentProgressEvent;
|
|
26
|
+
}
|
|
27
|
+
export declare const PROGRESS_PERCENTS: Record<ProgressPhase, number>;
|
|
28
|
+
export declare const PROGRESS_MESSAGES: Record<ProgressPhase, string>;
|
|
29
|
+
/**
|
|
30
|
+
* Emit one progress transition. MUST be called from inside the workflow
|
|
31
|
+
* body — the `DBOS.runStep` wrapper makes it replay-safe (DBOS persists
|
|
32
|
+
* the stream-write offset under `(workflowID, function_id)`; replay
|
|
33
|
+
* returns cached without re-writing the part).
|
|
34
|
+
*
|
|
35
|
+
* Best-effort: a DB or stream failure logs and continues — progress
|
|
36
|
+
* emission MUST NOT block the workflow.
|
|
37
|
+
*/
|
|
38
|
+
export declare function emitProgress(pool: Pool, assessmentId: string, phase: ProgressPhase): Promise<void>;
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Progress emission for the target-assessment DBOS workflow.
|
|
3
|
+
*
|
|
4
|
+
* Emits a typed `data-target-assessment-progress` part via
|
|
5
|
+
* `DBOS.writeStream("progress", part)` and updates `cortex_target_assessments.progress`.
|
|
6
|
+
* Both writes happen inside a `DBOS.runStep` so a recovered workflow does not
|
|
7
|
+
* duplicate the event.
|
|
8
|
+
*
|
|
9
|
+
* Wire shape: `TargetAssessmentProgressEventSchema` in
|
|
10
|
+
* `harness/src/contracts/target-dossier.ts`. The SSE route reads via
|
|
11
|
+
* `DBOS.readStream(workflowId, "progress")` and folds-on-read by `phase`.
|
|
12
|
+
*/
|
|
13
|
+
import { DBOS } from "@dbos-inc/dbos-sdk";
|
|
14
|
+
import { describeDbError } from "../../lib/db-result.js";
|
|
15
|
+
import { updateProgress } from "../../state/target-assessments.js";
|
|
16
|
+
/** DBOS stream key the SSE route reads via `DBOS.readStream(wfId, "progress")`. */
|
|
17
|
+
export const TA_PROGRESS_STREAM_KEY = "progress";
|
|
18
|
+
export const PROGRESS_PERCENTS = {
|
|
19
|
+
resolving: 5,
|
|
20
|
+
collecting: 25,
|
|
21
|
+
deciding: 55,
|
|
22
|
+
fanning_out: 70,
|
|
23
|
+
assembling: 85,
|
|
24
|
+
synthesizing: 90,
|
|
25
|
+
completed: 100,
|
|
26
|
+
failed: 100,
|
|
27
|
+
suspended: 100,
|
|
28
|
+
};
|
|
29
|
+
export const PROGRESS_MESSAGES = {
|
|
30
|
+
resolving: "Resolving target identity",
|
|
31
|
+
collecting: "Collecting evidence from 14 data sources",
|
|
32
|
+
deciding: "Triaging modulators and classifying trials",
|
|
33
|
+
fanning_out: "Building per-modulator and per-trial detail",
|
|
34
|
+
assembling: "Assembling dossier sections",
|
|
35
|
+
synthesizing: "Drafting safety and translational commentary",
|
|
36
|
+
completed: "Completed",
|
|
37
|
+
failed: "Failed",
|
|
38
|
+
suspended: "Suspended — insufficient funds",
|
|
39
|
+
};
|
|
40
|
+
/**
|
|
41
|
+
* Emit one progress transition. MUST be called from inside the workflow
|
|
42
|
+
* body — the `DBOS.runStep` wrapper makes it replay-safe (DBOS persists
|
|
43
|
+
* the stream-write offset under `(workflowID, function_id)`; replay
|
|
44
|
+
* returns cached without re-writing the part).
|
|
45
|
+
*
|
|
46
|
+
* Best-effort: a DB or stream failure logs and continues — progress
|
|
47
|
+
* emission MUST NOT block the workflow.
|
|
48
|
+
*/
|
|
49
|
+
export async function emitProgress(pool, assessmentId, phase) {
|
|
50
|
+
const message = PROGRESS_MESSAGES[phase];
|
|
51
|
+
const percent = PROGRESS_PERCENTS[phase];
|
|
52
|
+
await DBOS.runStep(async () => {
|
|
53
|
+
const part = {
|
|
54
|
+
type: "data-target-assessment-progress",
|
|
55
|
+
payload: { phase, message, percent, at: new Date().toISOString() },
|
|
56
|
+
};
|
|
57
|
+
try {
|
|
58
|
+
await DBOS.writeStream(TA_PROGRESS_STREAM_KEY, part);
|
|
59
|
+
}
|
|
60
|
+
catch (err) {
|
|
61
|
+
console.warn(`[ta-progress] writeStream failed for ${assessmentId} (${phase}): ${err instanceof Error ? err.message : err}`);
|
|
62
|
+
}
|
|
63
|
+
// The "suspended" phase is owned by the terminal handler
|
|
64
|
+
// (`markAssessmentSuspended` already set status + progress text). A
|
|
65
|
+
// row write here would either race or overwrite the suspended status.
|
|
66
|
+
if (phase !== "suspended") {
|
|
67
|
+
const rowStatus = phase === "completed" ? "completed" : phase === "failed" ? "failed" : "running";
|
|
68
|
+
// Best-effort: log a failed row write and continue — progress
|
|
69
|
+
// emission MUST NOT block the workflow. `updateProgress` returns
|
|
70
|
+
// its DB failure as an `Err`, so handle both branches here.
|
|
71
|
+
(await updateProgress(pool, assessmentId, message, rowStatus)).match(() => { }, (error) => {
|
|
72
|
+
console.warn(`[ta-progress] updateProgress failed for ${assessmentId} (${phase}): ${describeDbError(error)}`);
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
}, { name: `ta-progress:${phase}` });
|
|
76
|
+
}
|