@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,406 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `awaitExec` — awaits a submitted exec's terminal result, forwarding progress
|
|
3
|
+
* events, under one of two transports selected by `options.transport`:
|
|
4
|
+
*
|
|
5
|
+
* - `poll` (default): {@link awaitExecPoll} loops durable pull steps against
|
|
6
|
+
* `GET /exec/{execId}?since={cursor}`. The sandbox initiates nothing; the
|
|
7
|
+
* host asks. Inherently restart-proof — a recovered workflow just resumes
|
|
8
|
+
* polling from its current identity — so the recovery wedge (#41) does not
|
|
9
|
+
* apply. A machine that dies mid-exec fast-fails in-loop: sustained
|
|
10
|
+
* `unavailable` polls escalate to a backend-inspect probe (`liveness.ts`)
|
|
11
|
+
* and an observably dead machine returns the synthetic-failure result
|
|
12
|
+
* instead of waiting out the deadline.
|
|
13
|
+
* - `callback`: {@link awaitExecCallback} is the recv loop below, with the
|
|
14
|
+
* pull as its recovery backstop.
|
|
15
|
+
*
|
|
16
|
+
* Both run in the workflow body (NOT a step) — `DBOS.recv`, `DBOS.writeStream`,
|
|
17
|
+
* and `DBOS.sleepms` are body-only — and both verify every result against the
|
|
18
|
+
* per-sandbox HMAC, treating a bad/stale signature as a hard cancel.
|
|
19
|
+
*
|
|
20
|
+
* ## Callback mode: the recv loop
|
|
21
|
+
*
|
|
22
|
+
* On each received envelope:
|
|
23
|
+
*
|
|
24
|
+
* 1. If it carries `signature: null` and the payload is a
|
|
25
|
+
* `synthetic-failure` done-marker, accept it — the watchdog is an
|
|
26
|
+
* in-process trusted sender. Any other null-signature message
|
|
27
|
+
* hard-cancels.
|
|
28
|
+
* 2. Otherwise HMAC-verify against the per-sandbox `callbackSecret`.
|
|
29
|
+
* A bad or stale signature throws `HardCancelError`, which DBOS
|
|
30
|
+
* treats as a fatal workflow error (no retry).
|
|
31
|
+
* 3. If the verified payload is a done-marker, return its `result`.
|
|
32
|
+
* 4. Otherwise forward the payload via `emit` and continue.
|
|
33
|
+
*
|
|
34
|
+
* `deadline` is an absolute unix-ms timestamp — the durable backstop
|
|
35
|
+
* (typically `step.timeout`). `T` is liveness-agnostic recv pacing: we
|
|
36
|
+
* use `min(5s, remaining)` so the loop returns often enough to honour
|
|
37
|
+
* the deadline.
|
|
38
|
+
*
|
|
39
|
+
* ## Recv is not the only way home
|
|
40
|
+
*
|
|
41
|
+
* The completion callback is a *push* to an address baked into the container at
|
|
42
|
+
* creation. A host that dies mid-exec comes back with a different ingress port,
|
|
43
|
+
* so the push can never land — the sandbox retries into a void while the
|
|
44
|
+
* recovered recv waits for a message that will never arrive. That is the
|
|
45
|
+
* recovery wedge (#41), and it is silent: a `running` row that never advances.
|
|
46
|
+
*
|
|
47
|
+
* So whenever the topic falls quiet, this loop stops waiting and *asks*:
|
|
48
|
+
* `GET /exec/{execId}` on the sandbox itself returns the terminal result,
|
|
49
|
+
* signed fresh at request time. The bytes are the ones the callback would have
|
|
50
|
+
* carried, so the provenance frame survives the recovery path intact and one
|
|
51
|
+
* verification path serves both. Push remains the fast path; pull is what makes
|
|
52
|
+
* the protocol durable rather than merely optimistic.
|
|
53
|
+
*
|
|
54
|
+
* The pull is a DBOS step, not a bare `fetch`: a body-level call whose result
|
|
55
|
+
* varied between replays would desynchronise the recorded function-ID sequence.
|
|
56
|
+
*/
|
|
57
|
+
import { DBOS } from "@dbos-inc/dbos-sdk";
|
|
58
|
+
import { signCallback, verifyCallback } from "./hmac.js";
|
|
59
|
+
import { createEscalationPolicy, probeLiveness, syntheticFailureReason, syntheticFailureResult } from "./liveness.js";
|
|
60
|
+
import { ExecResultSchema, isDoneMarker, isSyntheticFailure, PollResponseSchema, } from "./types.js";
|
|
61
|
+
const DEFAULT_FRESHNESS_SECONDS = 300;
|
|
62
|
+
const MAX_RECV_TIMEOUT_SECONDS = 5;
|
|
63
|
+
/**
|
|
64
|
+
* Two-phase poll cadence. Every poll writes a durable step row (plus a durable
|
|
65
|
+
* sleep), so the interval is a direct multiplier on DBOS system-table growth
|
|
66
|
+
* for the life of the exec: 1.5s for the first 40 attempts (~the exec's first
|
|
67
|
+
* minute) keeps short commands snappy; 10s thereafter keeps an hours-long
|
|
68
|
+
* exec's row growth bounded, at a terminal-latency cost that is noise at that
|
|
69
|
+
* runtime. Attempt-derived, so the schedule is a pure function of the
|
|
70
|
+
* checkpointed step sequence and replays identically.
|
|
71
|
+
*/
|
|
72
|
+
const DEFAULT_POLL_INTERVAL_MS = 1_500;
|
|
73
|
+
const DEFAULT_FAST_POLL_ATTEMPTS = 40;
|
|
74
|
+
const DEFAULT_SLOW_POLL_INTERVAL_MS = 10_000;
|
|
75
|
+
/**
|
|
76
|
+
* Silent recv slices to tolerate before pulling. At `MAX_RECV_TIMEOUT_SECONDS`
|
|
77
|
+
* per slice this is ~30s of silence — long enough that a chatty exec never
|
|
78
|
+
* pulls at all, short enough that a recovered workflow converges quickly. Each
|
|
79
|
+
* pull is a durable step, so polling every slice would write a step row every
|
|
80
|
+
* five seconds for the life of a quiet three-hour exec.
|
|
81
|
+
*/
|
|
82
|
+
const PULL_AFTER_SILENT_SLICES = 6;
|
|
83
|
+
const PULL_HTTP_TIMEOUT_MS = 10_000;
|
|
84
|
+
/**
|
|
85
|
+
* Fetch the terminal result for `execId` directly from sandbox-server.
|
|
86
|
+
*
|
|
87
|
+
* Never throws: every failure mode collapses to `unavailable`, because a failed
|
|
88
|
+
* pull is not a failed exec. Returning an error here would fail the enclosing
|
|
89
|
+
* DBOS step and take the workflow with it, when the correct response is simply
|
|
90
|
+
* to keep waiting for the push.
|
|
91
|
+
*
|
|
92
|
+
* A terminal response is distinguished by the presence of the signature header
|
|
93
|
+
* — sandbox-server leaves a still-running exec unsigned, having nothing to
|
|
94
|
+
* attest to yet.
|
|
95
|
+
*/
|
|
96
|
+
async function pullExecResult(fetchImpl, ref, execId) {
|
|
97
|
+
const controller = new AbortController();
|
|
98
|
+
const timer = setTimeout(() => controller.abort(), PULL_HTTP_TIMEOUT_MS);
|
|
99
|
+
try {
|
|
100
|
+
// The result discloses the command's output, so sandbox-server requires a
|
|
101
|
+
// signed request. Sign an empty body over the same construction as the
|
|
102
|
+
// callbacks. `Date.now()` is safe: this runs inside a `DBOS.runStep` whose
|
|
103
|
+
// cached result is replayed without re-executing the body.
|
|
104
|
+
const reqTimestamp = Math.floor(Date.now() / 1000);
|
|
105
|
+
const reqSignature = signCallback({ execId, body: "", timestamp: reqTimestamp, secret: ref.callbackSecret });
|
|
106
|
+
const res = await fetchImpl(`http://${ref.host}:${ref.port}/exec/${encodeURIComponent(execId)}`, {
|
|
107
|
+
method: "GET",
|
|
108
|
+
headers: {
|
|
109
|
+
"x-sandbox-signature": reqSignature,
|
|
110
|
+
"x-sandbox-timestamp": String(reqTimestamp),
|
|
111
|
+
},
|
|
112
|
+
signal: controller.signal,
|
|
113
|
+
});
|
|
114
|
+
if (!res.ok) {
|
|
115
|
+
await res.text().catch(() => "");
|
|
116
|
+
return { kind: "unavailable", detail: `status ${res.status}` };
|
|
117
|
+
}
|
|
118
|
+
const signature = res.headers.get("x-sandbox-signature");
|
|
119
|
+
const raw = await res.text();
|
|
120
|
+
if (signature === null)
|
|
121
|
+
return { kind: "running" };
|
|
122
|
+
const tsHeader = res.headers.get("x-sandbox-timestamp");
|
|
123
|
+
const parsedTs = tsHeader === null ? null : Number.parseInt(tsHeader, 10);
|
|
124
|
+
return {
|
|
125
|
+
kind: "completed",
|
|
126
|
+
raw,
|
|
127
|
+
signature,
|
|
128
|
+
// An unparseable timestamp forwards as null so `verifyCallback`
|
|
129
|
+
// reports `missing` rather than us guessing a wall-clock.
|
|
130
|
+
timestamp: parsedTs === null || Number.isNaN(parsedTs) ? null : parsedTs,
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
catch (cause) {
|
|
134
|
+
return { kind: "unavailable", detail: cause instanceof Error ? cause.message : String(cause) };
|
|
135
|
+
}
|
|
136
|
+
finally {
|
|
137
|
+
clearTimeout(timer);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
export class HardCancelError extends Error {
|
|
141
|
+
execId;
|
|
142
|
+
reason;
|
|
143
|
+
constructor(execId, reason, detail) {
|
|
144
|
+
super(`awaitExec[${execId}]: hard cancel — ${reason}${detail ? ` (${detail})` : ""}`);
|
|
145
|
+
this.execId = execId;
|
|
146
|
+
this.reason = reason;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
export class ExecTimeoutError extends Error {
|
|
150
|
+
execId;
|
|
151
|
+
constructor(execId) {
|
|
152
|
+
super(`awaitExec[${execId}]: deadline exceeded before done-marker`);
|
|
153
|
+
this.execId = execId;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Await a submitted exec's terminal result. Dispatches on transport — `poll`
|
|
158
|
+
* (default) or `callback`. Both verify every result against the per-sandbox
|
|
159
|
+
* HMAC and are bounded by `deadlineMs`.
|
|
160
|
+
*/
|
|
161
|
+
export async function awaitExec(ref, execId, emit, deadlineMs, options = {}) {
|
|
162
|
+
const transport = options.transport ?? "poll";
|
|
163
|
+
return transport === "callback" ? awaitExecCallback(ref, execId, emit, deadlineMs, options) : awaitExecPoll(ref, execId, emit, deadlineMs, options);
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Body of the recv loop (callback transport). Hoisted so it's testable without
|
|
167
|
+
* spinning up DBOS — `recv` is injectable and `now` is overridable.
|
|
168
|
+
*/
|
|
169
|
+
export async function awaitExecCallback(ref, execId, emit, deadlineMs, options = {}) {
|
|
170
|
+
const topic = `exec-event:${execId}`;
|
|
171
|
+
const callbackSecret = ref.callbackSecret;
|
|
172
|
+
const now = options.now ?? (() => DBOS.now());
|
|
173
|
+
const recv = options.recv ?? (async (t, sec) => DBOS.recv(t, sec));
|
|
174
|
+
const fetchImpl = options.fetch ?? fetch;
|
|
175
|
+
const runStep = options.runStep ?? ((fn, c) => DBOS.runStep(fn, c));
|
|
176
|
+
// Both counters are pure functions of the checkpointed recv sequence, so a
|
|
177
|
+
// replay issues exactly the same pulls in exactly the same order — which is
|
|
178
|
+
// what keeps the DBOS function-ID sequence stable.
|
|
179
|
+
let silentSlices = 0;
|
|
180
|
+
let pullAttempt = 0;
|
|
181
|
+
/** Ask the sandbox directly. Returns null when the exec has not finished. */
|
|
182
|
+
const pull = async () => {
|
|
183
|
+
pullAttempt += 1;
|
|
184
|
+
const pulled = await runStep(() => pullExecResult(fetchImpl, ref, execId), {
|
|
185
|
+
name: `sandbox.pull-exec-result.${execId}.${pullAttempt}`,
|
|
186
|
+
});
|
|
187
|
+
if (pulled.kind !== "completed")
|
|
188
|
+
return null;
|
|
189
|
+
// Identical treatment to a pushed completion: the bytes were signed by
|
|
190
|
+
// the same secret, so a forgery is as fatal here as it is there.
|
|
191
|
+
const verified = verifyCallback({
|
|
192
|
+
execId,
|
|
193
|
+
body: Buffer.from(pulled.raw, "utf8"),
|
|
194
|
+
signature: pulled.signature,
|
|
195
|
+
timestamp: pulled.timestamp,
|
|
196
|
+
secret: callbackSecret,
|
|
197
|
+
nowSec: Math.floor((await now()) / 1000),
|
|
198
|
+
freshnessSec: DEFAULT_FRESHNESS_SECONDS,
|
|
199
|
+
});
|
|
200
|
+
if (!verified.valid) {
|
|
201
|
+
throw new HardCancelError(execId, verified.reason, "pulled result");
|
|
202
|
+
}
|
|
203
|
+
return ExecResultSchema.parse(JSON.parse(pulled.raw));
|
|
204
|
+
};
|
|
205
|
+
while (true) {
|
|
206
|
+
const remainingMs = deadlineMs - (await now());
|
|
207
|
+
if (remainingMs <= 0) {
|
|
208
|
+
// A lost callback is not a slow command. Ask once before declaring a
|
|
209
|
+
// timeout — the result may have been sitting in the sandbox the whole
|
|
210
|
+
// time, and reporting a timeout would discard a completed analysis.
|
|
211
|
+
const pulled = await pull();
|
|
212
|
+
if (pulled !== null)
|
|
213
|
+
return pulled;
|
|
214
|
+
throw new ExecTimeoutError(execId);
|
|
215
|
+
}
|
|
216
|
+
const timeoutSec = Math.min(MAX_RECV_TIMEOUT_SECONDS, Math.max(1, Math.ceil(remainingMs / 1000)));
|
|
217
|
+
const msg = await recv(topic, timeoutSec);
|
|
218
|
+
if (msg === null) {
|
|
219
|
+
silentSlices += 1;
|
|
220
|
+
if (silentSlices >= PULL_AFTER_SILENT_SLICES) {
|
|
221
|
+
silentSlices = 0;
|
|
222
|
+
const pulled = await pull();
|
|
223
|
+
if (pulled !== null)
|
|
224
|
+
return pulled;
|
|
225
|
+
}
|
|
226
|
+
continue;
|
|
227
|
+
}
|
|
228
|
+
silentSlices = 0;
|
|
229
|
+
if (msg.signature === null) {
|
|
230
|
+
if (isSyntheticFailure(msg.payload)) {
|
|
231
|
+
return ExecResultSchema.parse(msg.payload.result);
|
|
232
|
+
}
|
|
233
|
+
throw new HardCancelError(execId, "synthetic-without-marker");
|
|
234
|
+
}
|
|
235
|
+
// Verify against the exact bytes sandbox-server signed. The route
|
|
236
|
+
// preserves them as `payloadRaw`; the JSON.stringify fallback exists
|
|
237
|
+
// only for messages persisted before that field was added — re-
|
|
238
|
+
// serializing diverges from Go's HTML-escaping encoder.
|
|
239
|
+
const bodyBytes = Buffer.from(msg.payloadRaw ?? JSON.stringify(msg.payload), "utf8");
|
|
240
|
+
const result = verifyCallback({
|
|
241
|
+
execId,
|
|
242
|
+
body: bodyBytes,
|
|
243
|
+
signature: msg.signature,
|
|
244
|
+
timestamp: msg.timestamp,
|
|
245
|
+
secret: callbackSecret,
|
|
246
|
+
nowSec: Math.floor((await now()) / 1000),
|
|
247
|
+
freshnessSec: DEFAULT_FRESHNESS_SECONDS,
|
|
248
|
+
});
|
|
249
|
+
if (!result.valid) {
|
|
250
|
+
throw new HardCancelError(execId, result.reason);
|
|
251
|
+
}
|
|
252
|
+
if (isDoneMarker(msg.payload)) {
|
|
253
|
+
return ExecResultSchema.parse(msg.payload.result);
|
|
254
|
+
}
|
|
255
|
+
await emit(msg.payload);
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
async function pollExecOnce(fetchImpl, ref, execId, cursor) {
|
|
259
|
+
const controller = new AbortController();
|
|
260
|
+
const timer = setTimeout(() => controller.abort(), PULL_HTTP_TIMEOUT_MS);
|
|
261
|
+
try {
|
|
262
|
+
// The response discloses the command's output, so the request is signed
|
|
263
|
+
// over an empty body — the same construction as the callbacks. `Date.now()`
|
|
264
|
+
// is safe: this runs inside a `DBOS.runStep` whose cached result is
|
|
265
|
+
// replayed without re-executing the body.
|
|
266
|
+
const reqTimestamp = Math.floor(Date.now() / 1000);
|
|
267
|
+
const reqSignature = signCallback({ execId, body: "", timestamp: reqTimestamp, secret: ref.callbackSecret });
|
|
268
|
+
const res = await fetchImpl(`http://${ref.host}:${ref.port}/exec/${encodeURIComponent(execId)}?since=${cursor}`, {
|
|
269
|
+
method: "GET",
|
|
270
|
+
headers: {
|
|
271
|
+
"x-sandbox-signature": reqSignature,
|
|
272
|
+
"x-sandbox-timestamp": String(reqTimestamp),
|
|
273
|
+
},
|
|
274
|
+
signal: controller.signal,
|
|
275
|
+
});
|
|
276
|
+
if (!res.ok) {
|
|
277
|
+
await res.text().catch(() => "");
|
|
278
|
+
return { kind: "unavailable", detail: `status ${res.status}` };
|
|
279
|
+
}
|
|
280
|
+
const signature = res.headers.get("x-sandbox-signature");
|
|
281
|
+
const raw = await res.text();
|
|
282
|
+
if (signature === null)
|
|
283
|
+
return { kind: "unavailable", detail: "poll response missing signature" };
|
|
284
|
+
const tsHeader = res.headers.get("x-sandbox-timestamp");
|
|
285
|
+
const parsedTs = tsHeader === null ? null : Number.parseInt(tsHeader, 10);
|
|
286
|
+
return {
|
|
287
|
+
kind: "ok",
|
|
288
|
+
raw,
|
|
289
|
+
signature,
|
|
290
|
+
timestamp: parsedTs === null || Number.isNaN(parsedTs) ? null : parsedTs,
|
|
291
|
+
};
|
|
292
|
+
}
|
|
293
|
+
catch (cause) {
|
|
294
|
+
return { kind: "unavailable", detail: cause instanceof Error ? cause.message : String(cause) };
|
|
295
|
+
}
|
|
296
|
+
finally {
|
|
297
|
+
clearTimeout(timer);
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
/**
|
|
301
|
+
* Body of the poll loop (poll transport). No `DBOS.recv`, no per-exec topic, no
|
|
302
|
+
* callback handler: a sequence of durable pull steps named
|
|
303
|
+
* `sandbox.poll-exec-result.${execId}.${n}`, each fetching the signed
|
|
304
|
+
* `{ status, events, cursor, result? }`, verifying it exactly as a pushed
|
|
305
|
+
* completion is verified, forwarding new events via `emit`, advancing the
|
|
306
|
+
* cursor, and returning `result` once terminal. `sleep`, `now`, `fetch`,
|
|
307
|
+
* `runStep`, and `isAlive` are injectable so the loop is testable without DBOS.
|
|
308
|
+
*
|
|
309
|
+
* Liveness: when the `isAlive` seam is wired (the client always wires it),
|
|
310
|
+
* consecutive `unavailable` polls past the module threshold escalate to a
|
|
311
|
+
* durable probe step `sandbox.probe-liveness.${execId}.${k}`; a dead verdict
|
|
312
|
+
* returns the synthetic-failure result in-loop — the poll-mode analogue of the
|
|
313
|
+
* watchdog's synthetic-complete, minus the topic and the race gate, since the
|
|
314
|
+
* verdict is produced and consumed by the same workflow in sequence.
|
|
315
|
+
*
|
|
316
|
+
* The `cursor`, `pollAttempt`, and `probeAttempt` counters are pure functions
|
|
317
|
+
* of the cached step sequence, so a replay issues the same polls and probes in
|
|
318
|
+
* the same order and the DBOS function-ID sequence stays stable.
|
|
319
|
+
*/
|
|
320
|
+
export async function awaitExecPoll(ref, execId, emit, deadlineMs, options = {}) {
|
|
321
|
+
const callbackSecret = ref.callbackSecret;
|
|
322
|
+
const now = options.now ?? (() => DBOS.now());
|
|
323
|
+
const fetchImpl = options.fetch ?? fetch;
|
|
324
|
+
const runStep = options.runStep ?? ((fn, c) => DBOS.runStep(fn, c));
|
|
325
|
+
const sleep = options.sleep ?? ((ms) => DBOS.sleepms(ms));
|
|
326
|
+
const warn = options.warn ?? ((message) => DBOS.logger.warn(message));
|
|
327
|
+
const isAlive = options.isAlive;
|
|
328
|
+
let cursor = 0;
|
|
329
|
+
let pollAttempt = 0;
|
|
330
|
+
// Sustained-unavailability escalation (`liveness.ts`): consecutive
|
|
331
|
+
// `unavailable` polls arm a backend-inspect probe; poll failures alone
|
|
332
|
+
// never fail the exec (`unavailable` conflates unreachable with unknown
|
|
333
|
+
// execId / non-200). Policy state and the probe counter are pure functions
|
|
334
|
+
// of the checkpointed poll outcomes, so replays walk the identical
|
|
335
|
+
// poll/probe step sequence.
|
|
336
|
+
const escalation = createEscalationPolicy();
|
|
337
|
+
let probeAttempt = 0;
|
|
338
|
+
while (true) {
|
|
339
|
+
pollAttempt += 1;
|
|
340
|
+
const polled = await runStep(() => pollExecOnce(fetchImpl, ref, execId, cursor), {
|
|
341
|
+
name: `sandbox.poll-exec-result.${execId}.${pollAttempt}`,
|
|
342
|
+
});
|
|
343
|
+
if (polled.kind === "ok") {
|
|
344
|
+
// Identical treatment to a pushed completion: the bytes were signed by
|
|
345
|
+
// the same secret, so a forgery is as fatal here as it is there.
|
|
346
|
+
const verified = verifyCallback({
|
|
347
|
+
execId,
|
|
348
|
+
body: Buffer.from(polled.raw, "utf8"),
|
|
349
|
+
signature: polled.signature,
|
|
350
|
+
timestamp: polled.timestamp,
|
|
351
|
+
secret: callbackSecret,
|
|
352
|
+
nowSec: Math.floor((await now()) / 1000),
|
|
353
|
+
freshnessSec: DEFAULT_FRESHNESS_SECONDS,
|
|
354
|
+
});
|
|
355
|
+
if (!verified.valid) {
|
|
356
|
+
throw new HardCancelError(execId, verified.reason, "poll response");
|
|
357
|
+
}
|
|
358
|
+
const resp = PollResponseSchema.parse(JSON.parse(polled.raw));
|
|
359
|
+
// Forward only events past the local cursor, before returning, so
|
|
360
|
+
// trailing progress lands ahead of the terminal result. The filter is
|
|
361
|
+
// load-bearing: the signature covers the body but not the request's
|
|
362
|
+
// `since`, so any validly-signed snapshot verifies against any poll —
|
|
363
|
+
// a replayed or crossed response must not re-emit delivered events.
|
|
364
|
+
const newEvents = resp.events.filter((ev) => ev.seq > cursor);
|
|
365
|
+
// Sequence numbers are per-exec contiguous, so a hole between the
|
|
366
|
+
// local cursor and the next delivered (or high-water) seq is exact
|
|
367
|
+
// proof the ring shed events before the host saw them. Advisory: the
|
|
368
|
+
// terminal result, not the event stream, is the authoritative outcome.
|
|
369
|
+
const nextSeq = newEvents.length > 0 ? newEvents[0].seq : resp.cursor > cursor ? resp.cursor + 1 : cursor + 1;
|
|
370
|
+
const lost = nextSeq - cursor - 1;
|
|
371
|
+
if (lost > 0) {
|
|
372
|
+
warn(`awaitExecPoll[${execId}]: ${lost} progress event(s) (seq ${cursor + 1}-${cursor + lost}) shed by the sandbox ring before delivery; the terminal result is unaffected`);
|
|
373
|
+
}
|
|
374
|
+
for (const ev of newEvents) {
|
|
375
|
+
await emit(ev.payload);
|
|
376
|
+
}
|
|
377
|
+
if (resp.cursor > cursor)
|
|
378
|
+
cursor = resp.cursor;
|
|
379
|
+
if (resp.result !== undefined)
|
|
380
|
+
return resp.result;
|
|
381
|
+
}
|
|
382
|
+
if (isAlive && escalation.onPoll(polled.kind === "ok" ? "ok" : "unavailable")) {
|
|
383
|
+
probeAttempt += 1;
|
|
384
|
+
const verdict = await runStep(() => probeLiveness(isAlive, ref), {
|
|
385
|
+
name: `sandbox.probe-liveness.${execId}.${probeAttempt}`,
|
|
386
|
+
});
|
|
387
|
+
// Only an observably dead machine fails the exec — the result lives
|
|
388
|
+
// in that machine and nowhere else, so it is unrecoverable and the
|
|
389
|
+
// synthetic failure races nothing. `alive` (live-but-slow exec,
|
|
390
|
+
// evicted execId) and `inconclusive` (backend API error) both
|
|
391
|
+
// resume polling, bounded by the deadline.
|
|
392
|
+
if (verdict.kind === "dead") {
|
|
393
|
+
return syntheticFailureResult(execId, syntheticFailureReason({ oomKilled: verdict.oomKilled }));
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
// The deadline gate sits AFTER the poll so the loop always asks once more
|
|
397
|
+
// before declaring a timeout — same reasoning as the callback loop's
|
|
398
|
+
// deadline pull: a lost poll window is not a slow command, and reporting
|
|
399
|
+
// a timeout would discard a completed analysis.
|
|
400
|
+
const remainingMs = deadlineMs - (await now());
|
|
401
|
+
if (remainingMs <= 0)
|
|
402
|
+
throw new ExecTimeoutError(execId);
|
|
403
|
+
const intervalMs = pollAttempt <= DEFAULT_FAST_POLL_ATTEMPTS ? DEFAULT_POLL_INTERVAL_MS : DEFAULT_SLOW_POLL_INTERVAL_MS;
|
|
404
|
+
await sleep(Math.min(intervalMs, remainingMs));
|
|
405
|
+
}
|
|
406
|
+
}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `SandboxClient` — the five-method seam every sandbox-backed module in
|
|
3
|
+
* the harness sits on. Implementations are backend-selected
|
|
4
|
+
* (`docker`/`k8s`) by `createSandboxClient()` in `create-sandbox.ts` and
|
|
5
|
+
* injected at the composition root as a construction-time dependency
|
|
6
|
+
* (see the harness-durable-runtime spec). Callers do NOT import a backend module directly.
|
|
7
|
+
*
|
|
8
|
+
* The interface is split across three files:
|
|
9
|
+
* - `client.ts` (here) — the interface and the per-method types.
|
|
10
|
+
* - `create-sandbox.ts` — the factory + per-backend `createSandbox` /
|
|
11
|
+
* `teardown` / `isAlive` implementations.
|
|
12
|
+
* - `submit-exec.ts` + `await-exec.ts` — `submitExec` and the workflow-
|
|
13
|
+
* body recv loop, which are backend-agnostic (HTTP + DBOS messages).
|
|
14
|
+
*
|
|
15
|
+
* Lifetime separation (CONTEXT.md "Sandbox exec"):
|
|
16
|
+
* - The **sandbox machine** lifetime is `createSandbox → ... → teardown`.
|
|
17
|
+
* Many execs may fire against the same machine.
|
|
18
|
+
* - The **exec** lifetime is one `submitExec → awaitExec`.
|
|
19
|
+
*
|
|
20
|
+
* `awaitExec` runs in the workflow body (not as a DBOS step) because
|
|
21
|
+
* `DBOS.recv` and `DBOS.writeStream` are body-only.
|
|
22
|
+
*/
|
|
23
|
+
import type { CreateSandboxMeta, ExecEmit, ExecResult, ManagedSandbox, SandboxIdentity, SandboxLiveness, SandboxRef, SubmitExecBody } from "./types.js";
|
|
24
|
+
export interface SandboxClient {
|
|
25
|
+
/**
|
|
26
|
+
* DBOS step (`sandbox.create`) — the spawn half of the two-step create
|
|
27
|
+
* (see the harness-sandbox-exec spec). Launches the sandbox-base container/Job under the
|
|
28
|
+
* pre-minted `identity` (name + HMAC secret checkpointed by `sandbox.mint`),
|
|
29
|
+
* stamps ownership labels, waits for `/health`, records the live handle in
|
|
30
|
+
* the active-sandbox registry, and returns the in-memory `SandboxRef`. A
|
|
31
|
+
* recovery re-run whose machine already exists (the crash window between
|
|
32
|
+
* spawn and checkpoint) **adopts** it rather than leaking a second one.
|
|
33
|
+
*/
|
|
34
|
+
createSandbox(meta: CreateSandboxMeta, identity: SandboxIdentity): Promise<SandboxRef>;
|
|
35
|
+
/**
|
|
36
|
+
* DBOS step (`sandbox.submit-exec.${execId}`). POSTs the command to
|
|
37
|
+
* sandbox-server's `/exec` and returns after the HTTP 202 ack. Does NOT
|
|
38
|
+
* wait for command completion. Replay-safe: the cached step output is
|
|
39
|
+
* returned on subsequent invocations; any duplicate POST that reaches
|
|
40
|
+
* sandbox-server during the in-flight window is deduped server-side
|
|
41
|
+
* (PR #3 change 4) on `execId`.
|
|
42
|
+
*/
|
|
43
|
+
submitExec(ref: SandboxRef, body: SubmitExecBody): Promise<void>;
|
|
44
|
+
/**
|
|
45
|
+
* Awaits a submitted exec's terminal result under the client's transport.
|
|
46
|
+
* Poll (default) loops durable, signed `GET /exec/{execId}?since={cursor}`
|
|
47
|
+
* steps against the sandbox in `ref`; callback loops
|
|
48
|
+
* `DBOS.recv("exec-event:${execId}", T)` with a signed pull as its
|
|
49
|
+
* recovery backstop. Both HMAC-verify every body against
|
|
50
|
+
* `ref.callbackSecret`, forward progress events via `emit`, and are
|
|
51
|
+
* bounded by `deadline` (absolute unix-ms timestamp).
|
|
52
|
+
*/
|
|
53
|
+
awaitExec(ref: SandboxRef, execId: string, emit: ExecEmit, deadline: number): Promise<ExecResult>;
|
|
54
|
+
/**
|
|
55
|
+
* Per-sandbox-machine liveness. `alive: false` only when observably dead
|
|
56
|
+
* (terminal pod phase, missing container); `oomKilled` marks a death the
|
|
57
|
+
* backend attributes to the machine's memory limit. Transient API errors
|
|
58
|
+
* throw, so callers can decide whether to retry — silently lying about
|
|
59
|
+
* dead sandboxes would race the synthetic-complete path.
|
|
60
|
+
*/
|
|
61
|
+
isAlive(ref: SandboxRef): Promise<SandboxLiveness>;
|
|
62
|
+
/**
|
|
63
|
+
* DBOS step (`sandbox.teardown`). Deletes the K8s Job / removes the
|
|
64
|
+
* Docker container, clears the active-sandbox registry. Idempotent —
|
|
65
|
+
* "already gone" is a successful teardown.
|
|
66
|
+
*/
|
|
67
|
+
teardown(ref: SandboxRef): Promise<void>;
|
|
68
|
+
/**
|
|
69
|
+
* Delete a sandbox machine by id alone — the reaper path (see the harness-sandbox-exec spec), which
|
|
70
|
+
* holds a `sandboxId` from the cluster sweep but no full `SandboxRef`.
|
|
71
|
+
* Does NOT touch the registry; the reaper reconciles the row itself.
|
|
72
|
+
* Idempotent: "already gone" is success.
|
|
73
|
+
*/
|
|
74
|
+
teardownById(sandboxId: string): Promise<void>;
|
|
75
|
+
/**
|
|
76
|
+
* Enumerate every Cortex-managed sandbox machine the backend is running,
|
|
77
|
+
* scoped to the configured namespace (`app.kubernetes.io/managed-by=cortex`).
|
|
78
|
+
* The cluster→registry direction the reaper needs — every other op takes a
|
|
79
|
+
* ref the caller already holds; this one finds machines Cortex has forgotten.
|
|
80
|
+
*/
|
|
81
|
+
listManagedSandboxes(): Promise<ManagedSandbox[]>;
|
|
82
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `SandboxClient` — the five-method seam every sandbox-backed module in
|
|
3
|
+
* the harness sits on. Implementations are backend-selected
|
|
4
|
+
* (`docker`/`k8s`) by `createSandboxClient()` in `create-sandbox.ts` and
|
|
5
|
+
* injected at the composition root as a construction-time dependency
|
|
6
|
+
* (see the harness-durable-runtime spec). Callers do NOT import a backend module directly.
|
|
7
|
+
*
|
|
8
|
+
* The interface is split across three files:
|
|
9
|
+
* - `client.ts` (here) — the interface and the per-method types.
|
|
10
|
+
* - `create-sandbox.ts` — the factory + per-backend `createSandbox` /
|
|
11
|
+
* `teardown` / `isAlive` implementations.
|
|
12
|
+
* - `submit-exec.ts` + `await-exec.ts` — `submitExec` and the workflow-
|
|
13
|
+
* body recv loop, which are backend-agnostic (HTTP + DBOS messages).
|
|
14
|
+
*
|
|
15
|
+
* Lifetime separation (CONTEXT.md "Sandbox exec"):
|
|
16
|
+
* - The **sandbox machine** lifetime is `createSandbox → ... → teardown`.
|
|
17
|
+
* Many execs may fire against the same machine.
|
|
18
|
+
* - The **exec** lifetime is one `submitExec → awaitExec`.
|
|
19
|
+
*
|
|
20
|
+
* `awaitExec` runs in the workflow body (not as a DBOS step) because
|
|
21
|
+
* `DBOS.recv` and `DBOS.writeStream` are body-only.
|
|
22
|
+
*/
|
|
23
|
+
export {};
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Backend-selected `SandboxClient` factory.
|
|
3
|
+
*
|
|
4
|
+
* Docker for local dev, K8s for production — the single place the
|
|
5
|
+
* `SANDBOX_BACKEND` env decision lives. Injected at the composition root
|
|
6
|
+
* as a construction-time dependency (see the harness-durable-runtime spec); callers do NOT import a
|
|
7
|
+
* backend module directly.
|
|
8
|
+
*
|
|
9
|
+
* Registry write/clear callbacks are wired here so the per-backend
|
|
10
|
+
* `createSandbox` / `teardown` implementations stay free of state-layer
|
|
11
|
+
* coupling (they just call the closures we hand them). `submitExec` and
|
|
12
|
+
* `awaitExec` are backend-agnostic — they only need the SandboxRef.
|
|
13
|
+
*/
|
|
14
|
+
import type { V1Toleration } from "@kubernetes/client-node";
|
|
15
|
+
import type { Pool } from "pg";
|
|
16
|
+
import type pino from "pino";
|
|
17
|
+
import { type ResourceLimits } from "../config/resource-limits.js";
|
|
18
|
+
import { type ResolveWorkspaceRoot } from "../workspace/paths.js";
|
|
19
|
+
import { clearSandboxRef } from "../state/index.js";
|
|
20
|
+
import { type AwaitExecOptions } from "./await-exec.js";
|
|
21
|
+
import type { SandboxClient } from "./client.js";
|
|
22
|
+
import { type SubmitExecDeps } from "./submit-exec.js";
|
|
23
|
+
import { type SandboxTransport } from "./types.js";
|
|
24
|
+
/**
|
|
25
|
+
* Narrow config slice the sandbox factory reads off `Env` — the backend
|
|
26
|
+
* default and the K8s namespace fallback. Composition roots map their
|
|
27
|
+
* validated `Env` onto this.
|
|
28
|
+
*/
|
|
29
|
+
export interface SandboxBackendConfig {
|
|
30
|
+
readonly backend: "docker" | "k8s";
|
|
31
|
+
readonly namespace: string;
|
|
32
|
+
}
|
|
33
|
+
export interface CreateSandboxClientConfig {
|
|
34
|
+
/** App pool — used for registry writes inside the create/teardown steps. */
|
|
35
|
+
pool: Pool;
|
|
36
|
+
/** Backend default + namespace fallback source. */
|
|
37
|
+
env: SandboxBackendConfig;
|
|
38
|
+
/** Cortex base URL injected into sandbox-server's env for callbacks. */
|
|
39
|
+
cortexBaseUrl: string;
|
|
40
|
+
/**
|
|
41
|
+
* Result transport for every sandbox this client creates. Threaded to the
|
|
42
|
+
* container as `SANDBOX_TRANSPORT` and to `awaitExec`'s loop selection.
|
|
43
|
+
* Defaults to `poll`.
|
|
44
|
+
*/
|
|
45
|
+
transport?: SandboxTransport;
|
|
46
|
+
/** Default sandbox-base image when the workflow doesn't override per-step. */
|
|
47
|
+
image: string;
|
|
48
|
+
/** Cluster resource ceilings; every sandbox request is clamped to these. */
|
|
49
|
+
resourceLimits: ResourceLimits;
|
|
50
|
+
/** K8s namespace; only used by the k8s backend. */
|
|
51
|
+
namespace?: string;
|
|
52
|
+
/**
|
|
53
|
+
* Workspace-root resolution seam (see workspace/paths.ts). Docker binds
|
|
54
|
+
* each analysis's resolved root; on K8s the resolved roots live under the
|
|
55
|
+
* session PVC. Always required: the writable step dir is pre-created under
|
|
56
|
+
* the resolved root regardless of backend.
|
|
57
|
+
*/
|
|
58
|
+
resolveWorkspaceRoot: ResolveWorkspaceRoot;
|
|
59
|
+
/** Docker: host dir bind-mounted read-only at `/mnt/libs`. */
|
|
60
|
+
libStorePath?: string;
|
|
61
|
+
/** Docker: host dir bind-mounted read-only at `/mnt/refs`. */
|
|
62
|
+
refStorePath?: string;
|
|
63
|
+
/** Docker: force the container platform (e.g. `linux/amd64`) so the sandbox matches the mounted lib store's arch. */
|
|
64
|
+
platform?: string;
|
|
65
|
+
/** K8s: PVC claim backing the session PVC the workspace roots live under. */
|
|
66
|
+
sessionPvc?: string;
|
|
67
|
+
/**
|
|
68
|
+
* K8s: absolute mountpoint of `sessionPvc` on this process's filesystem. Required with
|
|
69
|
+
* `sessionPvc` — the pod's `subPath` is a resolved workspace root taken relative to it,
|
|
70
|
+
* which is what keeps the pre-created step tree and the mounted step tree the same one.
|
|
71
|
+
*/
|
|
72
|
+
sessionPvcRoot?: string;
|
|
73
|
+
/** K8s: PVC claim mounted read-only at `/mnt/libs`. */
|
|
74
|
+
libStorePvc?: string;
|
|
75
|
+
/** K8s: PVC claim mounted read-only at `/mnt/refs`. */
|
|
76
|
+
refStorePvc?: string;
|
|
77
|
+
/** K8s: node selector pinning sandbox pods to the dedicated agent pool. */
|
|
78
|
+
nodeSelector?: Record<string, string>;
|
|
79
|
+
/** K8s: tolerations letting sandbox pods land on the tainted agent nodes. */
|
|
80
|
+
tolerations?: V1Toleration[];
|
|
81
|
+
/** K8s: RuntimeClass for runtime isolation (e.g. `gvisor`). */
|
|
82
|
+
runtimeClassName?: string;
|
|
83
|
+
/** Override the backend selection — defaults to `env.SANDBOX_BACKEND`. */
|
|
84
|
+
backend?: "docker" | "k8s";
|
|
85
|
+
/**
|
|
86
|
+
* Optional logger forwarded to the Docker backend so a lib-store degradation
|
|
87
|
+
* (a configured store whose `current` vanished/went incomplete mid-session) is
|
|
88
|
+
* observable rather than a silent mount drop. No-op when unset.
|
|
89
|
+
*/
|
|
90
|
+
logger?: Pick<pino.Logger, "info" | "warn" | "error">;
|
|
91
|
+
/** Dependency seams (fetch, durable step/sleep, clock, recv, warn sink) forwarded to submit/await. */
|
|
92
|
+
submitDeps?: SubmitExecDeps;
|
|
93
|
+
awaitOptions?: AwaitExecOptions;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Assemble `awaitExec`'s options: the liveness probe self-wires from the
|
|
97
|
+
* backend ops (the poll loop's escalation always has its arbiter under the
|
|
98
|
+
* client), explicit seam injections in `base` win over the self-wired probe,
|
|
99
|
+
* and the transport is client-owned — never overridable through the seam bag.
|
|
100
|
+
* Exported for tests.
|
|
101
|
+
*/
|
|
102
|
+
export declare function composeAwaitOptions(base: AwaitExecOptions | undefined, transport: SandboxTransport, isAlive: NonNullable<AwaitExecOptions["isAlive"]>): AwaitExecOptions;
|
|
103
|
+
export declare function createSandboxClient(config: CreateSandboxClientConfig): SandboxClient;
|
|
104
|
+
/** Re-exports so consumers import once from this module. */
|
|
105
|
+
export { clearSandboxRef };
|