@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,171 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Data-profile DBOS workflow — profiles the already-staged input files, runs
|
|
3
|
+
* the data-profiler sandbox agent, writes per-file metadata to
|
|
4
|
+
* cortex_artifacts, and indexes descriptions into the pgvector store. Inputs
|
|
5
|
+
* are staged under `data/inputs/` by the embedder before the run (see the data-profile-init spec);
|
|
6
|
+
* the body assumes a populated tree and never downloads.
|
|
7
|
+
*
|
|
8
|
+
* Recoverable: a crashed Cortex pod resumes the workflow from the DBOS step
|
|
9
|
+
* cache. The run authorization is minted at the async edge (`triggerDataProfile`)
|
|
10
|
+
* and rides in `input.runSession`; the body never mints. The body revokes the
|
|
11
|
+
* authorization on every terminal path.
|
|
12
|
+
*
|
|
13
|
+
* The `cortex_analysis_state.data_profile_status` ledger (claimed via
|
|
14
|
+
* `tryStartDataProfile` / `tryRerunDataProfile` / `tryRetryDataProfile`)
|
|
15
|
+
* still drives the UI status and the trigger's return value. Concurrent
|
|
16
|
+
* triggers dedup via the ledger CAS (only one `tryStart/tryRerun/tryRetry`
|
|
17
|
+
* UPDATE wins); each winning attempt starts a workflow under a per-attempt id.
|
|
18
|
+
*/
|
|
19
|
+
import type { Pool } from "pg";
|
|
20
|
+
import { type AuthContext, type RunSession } from "../auth/types.js";
|
|
21
|
+
import type { RunAuthorization, RunAuthorizer } from "../execution/run-authorizer.js";
|
|
22
|
+
import type { StagedInput } from "../execution/staged-input.js";
|
|
23
|
+
import type { BioToolKeys } from "../tools/bio/keys.js";
|
|
24
|
+
import type { ChatProvider, EmbeddingProvider } from "../providers/types.js";
|
|
25
|
+
import type { SandboxClient } from "../sandbox/client.js";
|
|
26
|
+
import type { WorkspaceFilesystem } from "../workspace/filesystem.js";
|
|
27
|
+
import type { ResolveWorkspaceRoot } from "../workspace/paths.js";
|
|
28
|
+
import { type DataProfileInputFile } from "../state/index.js";
|
|
29
|
+
/** The body's construction-time deps — closed over at registration. */
|
|
30
|
+
export interface DataProfileDeps {
|
|
31
|
+
readonly provider: ChatProvider;
|
|
32
|
+
readonly pool: Pool;
|
|
33
|
+
readonly sandboxClient: SandboxClient;
|
|
34
|
+
readonly workspaceFs: WorkspaceFilesystem;
|
|
35
|
+
/** Workspace-root resolution seam (see workspace/paths.ts). */
|
|
36
|
+
readonly resolveWorkspaceRoot: ResolveWorkspaceRoot;
|
|
37
|
+
/** Model id — provenance / metric label; the provider owns the wire model. */
|
|
38
|
+
readonly model: string;
|
|
39
|
+
readonly runAuthorizer: RunAuthorizer;
|
|
40
|
+
/** API keys for the bio/chem tools the profiler sandbox agent may use. */
|
|
41
|
+
readonly bioKeys: BioToolKeys;
|
|
42
|
+
/**
|
|
43
|
+
* Write-side embedder for the vector indexer. An instance, not endpoint
|
|
44
|
+
* config: the host composes its own realization (cloud endpoint, local
|
|
45
|
+
* in-process model, …) and the provider's `dimensions` sizes the
|
|
46
|
+
* per-analysis index — matching every other write-side workflow dep.
|
|
47
|
+
*/
|
|
48
|
+
readonly embedding: EmbeddingProvider;
|
|
49
|
+
/** Absolute path to the skills tree (one subdirectory per skill). */
|
|
50
|
+
readonly skillsDir: string;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Workflow input. JSON-serialisable — DBOS persists it as the workflow's
|
|
54
|
+
* input row. The `RunSession` carries the run authorization; the body reads it
|
|
55
|
+
* and never mints.
|
|
56
|
+
*/
|
|
57
|
+
export interface DataProfileWorkflowInput {
|
|
58
|
+
readonly analysisId: string;
|
|
59
|
+
readonly runSession: RunSession;
|
|
60
|
+
/**
|
|
61
|
+
* Manifest of the input files staged under `data/inputs/` before the run
|
|
62
|
+
* started (see the data-profile-init spec). The body assumes the tree is populated and profiles
|
|
63
|
+
* exactly these files — it never downloads. JSON-serializable; rides in the
|
|
64
|
+
* DBOS workflow input and survives recovery.
|
|
65
|
+
*/
|
|
66
|
+
readonly stagedInputs: readonly StagedInput[];
|
|
67
|
+
/**
|
|
68
|
+
* True when Cortex owns the run-authorization lifecycle and therefore must
|
|
69
|
+
* revoke it on every terminal path. False when the caller supplied its own
|
|
70
|
+
* authorization: the caller owns the lifecycle, so the body must NOT revoke
|
|
71
|
+
* it. The ownership decision is made by the `RunAuthorizer` seam — see
|
|
72
|
+
* `authorizeDataProfile`.
|
|
73
|
+
*
|
|
74
|
+
* Optional because a workflow persisted before this field existed (recovered
|
|
75
|
+
* across the deploy that added it) deserializes without it; the body defaults
|
|
76
|
+
* absent → true, matching the prior Cortex-owned behavior.
|
|
77
|
+
*/
|
|
78
|
+
readonly ownsMandate?: boolean;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Build the drift-signature comparand a completed profile persists, or `undefined`
|
|
82
|
+
* to omit it. `inputFiles` records whether the profiled files still hold the same
|
|
83
|
+
* bytes; it sits beside the `inputFileIds` audit record (WHICH files) in the stored
|
|
84
|
+
* `DataProfileResult`.
|
|
85
|
+
*
|
|
86
|
+
* A workflow input persisted before `StagedInput.mtimeMs` existed (recovered across
|
|
87
|
+
* the deploy that added it) carries entries with NO `mtimeMs` despite the compile-time
|
|
88
|
+
* type — the same recovered-legacy-input case `ownsMandate` handles. A per-entry
|
|
89
|
+
* `{ …, mtimeMs: undefined }` would JSON.stringify to `{ fileId, size }` and violate
|
|
90
|
+
* `DataProfileInputFile`, so the WHOLE signature is omitted when ANY entry lacks
|
|
91
|
+
* `mtimeMs`: an absent comparand reads back as drift and buys one clean re-profile,
|
|
92
|
+
* exactly as a wholly-absent `result` already does (see `DataProfileResult.inputFiles`).
|
|
93
|
+
* The cast defeats the required-`number` type precisely to observe that legacy gap.
|
|
94
|
+
*/
|
|
95
|
+
export declare function buildDriftSignature(stagedInputs: readonly StagedInput[]): DataProfileInputFile[] | undefined;
|
|
96
|
+
/**
|
|
97
|
+
* Register the data-profile workflow with DBOS. Returns the registered
|
|
98
|
+
* callable so `triggerDataProfile` can dispatch via `DBOS.startWorkflow`.
|
|
99
|
+
*/
|
|
100
|
+
export declare function registerDataProfileWorkflow(deps: DataProfileDeps): (input: DataProfileWorkflowInput) => Promise<void>;
|
|
101
|
+
/**
|
|
102
|
+
* Body extracted so tests can drive it without registering a workflow.
|
|
103
|
+
* Updates `cortex_analysis_state` status to 'completed' on success or
|
|
104
|
+
* 'failed' on error, and revokes the run authorization on every terminal path.
|
|
105
|
+
*/
|
|
106
|
+
export declare function runDataProfileBody(input: DataProfileWorkflowInput, deps: DataProfileDeps): Promise<void>;
|
|
107
|
+
export type DataProfileTriggerResult = "started" | "restarted" | "already_running" | "failed";
|
|
108
|
+
/**
|
|
109
|
+
* Route-side deps for triggering the data-profile workflow: the ledger pool,
|
|
110
|
+
* the run authorizer, and the registered workflow callable. The body's
|
|
111
|
+
* construction-time deps are closed over at registration
|
|
112
|
+
* (`registerDataProfileWorkflow`); the route never holds them.
|
|
113
|
+
*/
|
|
114
|
+
export interface DataProfileTriggerDeps {
|
|
115
|
+
readonly pool: Pool;
|
|
116
|
+
readonly runAuthorizer: RunAuthorizer;
|
|
117
|
+
readonly workflow: (input: DataProfileWorkflowInput) => Promise<void>;
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Identity + staged inputs for a profile run. The caller (the managed route /
|
|
121
|
+
* the CLI) stages `data/inputs/` BEFORE triggering (see the data-profile-init spec) and passes the
|
|
122
|
+
* resulting manifest here; this trigger never stages — it forwards the manifest
|
|
123
|
+
* into the workflow input.
|
|
124
|
+
*/
|
|
125
|
+
export interface DataProfileTriggerParams {
|
|
126
|
+
readonly auth: AuthContext;
|
|
127
|
+
readonly analysisId: string;
|
|
128
|
+
readonly stagedInputs: readonly StagedInput[];
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Resolve the `RunSession` the workflow runs under. Whether the authorization
|
|
132
|
+
* is freshly minted (Cortex-owned) or reused (caller-owned) is decided by the
|
|
133
|
+
* `RunAuthorizer` seam from the opaque auth; this passes that auth straight
|
|
134
|
+
* through and never inspects it.
|
|
135
|
+
*/
|
|
136
|
+
export declare function authorizeDataProfile(deps: DataProfileTriggerDeps, params: DataProfileTriggerParams): Promise<RunAuthorization>;
|
|
137
|
+
/**
|
|
138
|
+
* Per-attempt DBOS workflow id. The `nonce` is fresh per attempt (a bare
|
|
139
|
+
* `randomUUID()` minted at the trigger), so each (re-)profile of the same
|
|
140
|
+
* analysis gets a distinct id. DBOS workflow ids are permanent idempotency
|
|
141
|
+
* keys: a stable `dataprofile:{analysisId}` would make every attempt after the
|
|
142
|
+
* first a no-op — a re-profile/retry would dedup against the first (terminal)
|
|
143
|
+
* run, the body would never re-execute, and the ledger would sit at 'running'
|
|
144
|
+
* until it timed out. Concurrent double-starts are already prevented by the
|
|
145
|
+
* ledger CAS in tryStart/tryRerun/tryRetry, so the id does not need to dedup
|
|
146
|
+
* them. (`runId` is the constant `DATA_PROFILE_RUN_LITERAL`, so it can't key
|
|
147
|
+
* the id; an explicit nonce is what distinguishes attempts.)
|
|
148
|
+
*/
|
|
149
|
+
export declare function dataProfileWorkflowId(analysisId: string, nonce: string): string;
|
|
150
|
+
/**
|
|
151
|
+
* Attempt to claim and run data profiling for an analysis, then start the workflow
|
|
152
|
+
* fire-and-forget for whichever claim won. Safe to call from multiple sites
|
|
153
|
+
* concurrently: the claims are CAS UPDATEs, so at most one caller dispatches.
|
|
154
|
+
*
|
|
155
|
+
* Every claim requires a non-empty `seed_input_file_ids` — a profile must always name
|
|
156
|
+
* the files it covers. The startable claim takes `'pending'` or a NULL status (NULL is
|
|
157
|
+
* the cleared-then-reseeded state); the rerun claim takes `'completed'`. A `'failed'`
|
|
158
|
+
* row is claimed by neither: retrying a failure is a deliberate act the caller drives
|
|
159
|
+
* through `tryRetryDataProfile` + `runDataProfile`.
|
|
160
|
+
*
|
|
161
|
+
* Returns what happened, so the caller can surface it (e.g. in the seed response).
|
|
162
|
+
*/
|
|
163
|
+
export declare function triggerDataProfile(deps: DataProfileTriggerDeps, params: DataProfileTriggerParams): Promise<DataProfileTriggerResult>;
|
|
164
|
+
/**
|
|
165
|
+
* Start the data-profile workflow for an already-claimed analysis (the retry
|
|
166
|
+
* route claims via `tryRetryDataProfile`, then calls this). The caller does not
|
|
167
|
+
* await the workflow's completion, but a start that rejects compensates the
|
|
168
|
+
* ledger (see {@link compensateStartFailure}) before re-throwing, so a caller's
|
|
169
|
+
* own `.catch` still observes the error and the row never wedges at `running`.
|
|
170
|
+
*/
|
|
171
|
+
export declare function runDataProfile(deps: DataProfileTriggerDeps, params: DataProfileTriggerParams): Promise<void>;
|
|
@@ -0,0 +1,461 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Data-profile DBOS workflow — profiles the already-staged input files, runs
|
|
3
|
+
* the data-profiler sandbox agent, writes per-file metadata to
|
|
4
|
+
* cortex_artifacts, and indexes descriptions into the pgvector store. Inputs
|
|
5
|
+
* are staged under `data/inputs/` by the embedder before the run (see the data-profile-init spec);
|
|
6
|
+
* the body assumes a populated tree and never downloads.
|
|
7
|
+
*
|
|
8
|
+
* Recoverable: a crashed Cortex pod resumes the workflow from the DBOS step
|
|
9
|
+
* cache. The run authorization is minted at the async edge (`triggerDataProfile`)
|
|
10
|
+
* and rides in `input.runSession`; the body never mints. The body revokes the
|
|
11
|
+
* authorization on every terminal path.
|
|
12
|
+
*
|
|
13
|
+
* The `cortex_analysis_state.data_profile_status` ledger (claimed via
|
|
14
|
+
* `tryStartDataProfile` / `tryRerunDataProfile` / `tryRetryDataProfile`)
|
|
15
|
+
* still drives the UI status and the trigger's return value. Concurrent
|
|
16
|
+
* triggers dedup via the ledger CAS (only one `tryStart/tryRerun/tryRetry`
|
|
17
|
+
* UPDATE wins); each winning attempt starts a workflow under a per-attempt id.
|
|
18
|
+
*/
|
|
19
|
+
import { DBOS } from "@dbos-inc/dbos-sdk";
|
|
20
|
+
import { randomUUID } from "node:crypto";
|
|
21
|
+
import { ok } from "neverthrow";
|
|
22
|
+
import { forSubAgent } from "../auth/types.js";
|
|
23
|
+
import { createDataProfilerAgent } from "../agents/sandbox/data-profiler.js";
|
|
24
|
+
import { runToTerminal } from "../loop/run-to-terminal.js";
|
|
25
|
+
import { durableStep } from "../loop/run-step.js";
|
|
26
|
+
import { unwrapOrThrow } from "../lib/result.js";
|
|
27
|
+
import { defineTool } from "../tools/define-tool.js";
|
|
28
|
+
import { estimateDataProfileResources } from "../sandbox/estimate-data-profile-resources.js";
|
|
29
|
+
import { generateExecutionId } from "../sandbox/execution-id.js";
|
|
30
|
+
import { mintSandboxIdentity } from "../sandbox/identity.js";
|
|
31
|
+
import { createVectorStore } from "../state/vector-store.js";
|
|
32
|
+
import { ProfilerOutputSchema } from "../schemas/data-profile-schemas.js";
|
|
33
|
+
import { completeDataProfile, failDataProfile, loadDataProfileStatus, loadSeedInputFileIds, tryRerunDataProfile, tryStartDataProfile, upsertArtifacts, } from "../state/index.js";
|
|
34
|
+
import { ensureSearchIndex, searchIndexName } from "../workspace/search-config.js";
|
|
35
|
+
/** Synthetic run/step literal for the data-profile workflow. */
|
|
36
|
+
const DATA_PROFILE_RUN_LITERAL = "data-profile";
|
|
37
|
+
const DATA_PROFILE_STEP_LITERAL = "profile";
|
|
38
|
+
const DATA_PROFILE_AGENT_ID = "data-profiler";
|
|
39
|
+
/** Sandbox-server exec budget for the profile run. */
|
|
40
|
+
const DEFAULT_DEADLINE_MS = 300_000;
|
|
41
|
+
/** Build the canonical artifact path for a staged input file. */
|
|
42
|
+
function inputArtifactPath(f) {
|
|
43
|
+
return `data/${f.relativePath}`;
|
|
44
|
+
}
|
|
45
|
+
/** Lowercased extension of a path, or `"unknown"` when none. */
|
|
46
|
+
function fileExtension(p) {
|
|
47
|
+
const base = p.slice(p.lastIndexOf("/") + 1);
|
|
48
|
+
const dot = base.lastIndexOf(".");
|
|
49
|
+
return dot > 0 ? base.slice(dot + 1).toLowerCase() : "unknown";
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Build the drift-signature comparand a completed profile persists, or `undefined`
|
|
53
|
+
* to omit it. `inputFiles` records whether the profiled files still hold the same
|
|
54
|
+
* bytes; it sits beside the `inputFileIds` audit record (WHICH files) in the stored
|
|
55
|
+
* `DataProfileResult`.
|
|
56
|
+
*
|
|
57
|
+
* A workflow input persisted before `StagedInput.mtimeMs` existed (recovered across
|
|
58
|
+
* the deploy that added it) carries entries with NO `mtimeMs` despite the compile-time
|
|
59
|
+
* type — the same recovered-legacy-input case `ownsMandate` handles. A per-entry
|
|
60
|
+
* `{ …, mtimeMs: undefined }` would JSON.stringify to `{ fileId, size }` and violate
|
|
61
|
+
* `DataProfileInputFile`, so the WHOLE signature is omitted when ANY entry lacks
|
|
62
|
+
* `mtimeMs`: an absent comparand reads back as drift and buys one clean re-profile,
|
|
63
|
+
* exactly as a wholly-absent `result` already does (see `DataProfileResult.inputFiles`).
|
|
64
|
+
* The cast defeats the required-`number` type precisely to observe that legacy gap.
|
|
65
|
+
*/
|
|
66
|
+
export function buildDriftSignature(stagedInputs) {
|
|
67
|
+
const mtimeOf = (f) => f.mtimeMs;
|
|
68
|
+
if (!stagedInputs.every((f) => mtimeOf(f) !== undefined))
|
|
69
|
+
return undefined;
|
|
70
|
+
return stagedInputs.map((f) => ({ fileId: f.fileId, size: f.size, mtimeMs: mtimeOf(f) }));
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Register the data-profile workflow with DBOS. Returns the registered
|
|
74
|
+
* callable so `triggerDataProfile` can dispatch via `DBOS.startWorkflow`.
|
|
75
|
+
*/
|
|
76
|
+
export function registerDataProfileWorkflow(deps) {
|
|
77
|
+
return DBOS.registerWorkflow((input) => runDataProfileBody(input, deps), { name: "data-profile" });
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Body extracted so tests can drive it without registering a workflow.
|
|
81
|
+
* Updates `cortex_analysis_state` status to 'completed' on success or
|
|
82
|
+
* 'failed' on error, and revokes the run authorization on every terminal path.
|
|
83
|
+
*/
|
|
84
|
+
export async function runDataProfileBody(input, deps) {
|
|
85
|
+
// Ownership defaults to true for inputs persisted before the field existed
|
|
86
|
+
// (a #247 workflow recovered across this deploy): those were always
|
|
87
|
+
// Cortex-owned and must be revoked here.
|
|
88
|
+
const { analysisId, runSession, ownsMandate = true, stagedInputs } = input; // oss-core-managed-ok
|
|
89
|
+
const authorization = { runSession, ownsMandate }; // oss-core-managed-ok
|
|
90
|
+
try {
|
|
91
|
+
// 1. Input files are already staged under data/inputs/ (see the data-profile-init spec); the
|
|
92
|
+
// embedder populated the tree and handed us this manifest in the workflow
|
|
93
|
+
// input. The body never downloads.
|
|
94
|
+
if (stagedInputs.length === 0) {
|
|
95
|
+
console.warn(`[data-profile] No input files staged for ${analysisId}`);
|
|
96
|
+
if (!unwrapOrThrow(await completeDataProfile(deps.pool, analysisId)))
|
|
97
|
+
logTerminalNoop(analysisId, "completion");
|
|
98
|
+
await deps.runAuthorizer.revoke(authorization, "data-profile-completed");
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
// 2. Register staged files in cortex_artifacts
|
|
102
|
+
await upsertArtifacts(deps.pool, stagedInputs.map((f) => ({
|
|
103
|
+
resourceId: analysisId,
|
|
104
|
+
path: inputArtifactPath(f),
|
|
105
|
+
hash: f.hash,
|
|
106
|
+
size: f.size,
|
|
107
|
+
role: "input",
|
|
108
|
+
fileId: f.fileId,
|
|
109
|
+
})));
|
|
110
|
+
// 3. Run data-profiler sandbox agent
|
|
111
|
+
const fileList = stagedInputs.map((f) => inputArtifactPath(f));
|
|
112
|
+
const prompt = [
|
|
113
|
+
`Profile all input data files for this analysis.`,
|
|
114
|
+
``,
|
|
115
|
+
`IMPORTANT: You MUST use execute_command to profile files before submitting results. Do NOT submit empty files or placeholder text.`,
|
|
116
|
+
``,
|
|
117
|
+
`CRITICAL: File and directory paths may contain spaces. You MUST always double-quote paths in shell commands (e.g. head "data/inputs/My Folder/file.csv"). Unquoted paths with spaces will silently break commands.`,
|
|
118
|
+
``,
|
|
119
|
+
`The following input files are available (paths relative to analysis root):`,
|
|
120
|
+
...fileList.map((f) => `- ${f}`),
|
|
121
|
+
``,
|
|
122
|
+
`Steps:`,
|
|
123
|
+
`1. For each file, use head and wc to inspect structure (ALWAYS double-quote file paths)`,
|
|
124
|
+
`2. Write a Python script for detailed profiling — use pathlib or os.path for path handling (handles spaces natively)`,
|
|
125
|
+
`3. Call the \`submit_profile\` tool with structured metadata for EVERY file listed above`,
|
|
126
|
+
``,
|
|
127
|
+
`The analysis root is mounted at /${analysisId}/. All file paths in your response must be relative to the analysis root and must EXACTLY match the paths listed above.`,
|
|
128
|
+
].join("\n");
|
|
129
|
+
const executionId = generateExecutionId(DATA_PROFILE_AGENT_ID);
|
|
130
|
+
const workflowId = DBOS.workflowID ?? `${DATA_PROFILE_RUN_LITERAL}:${executionId}`;
|
|
131
|
+
const childSession = forSubAgent(runSession, DATA_PROFILE_AGENT_ID);
|
|
132
|
+
// A resolver throw fails the workflow loudly (workspace-root-resolution
|
|
133
|
+
// contract) — profiling an analysis whose root cannot be resolved is
|
|
134
|
+
// meaningless, so no softer handling is warranted.
|
|
135
|
+
const workspaceRoot = deps.resolveWorkspaceRoot(analysisId);
|
|
136
|
+
console.log(`[data-profile] execution=${executionId} analysis=${analysisId} starting sandbox`);
|
|
137
|
+
const sandbox = await deps.sandboxClient.createSandbox({
|
|
138
|
+
runId: DATA_PROFILE_RUN_LITERAL,
|
|
139
|
+
stepId: DATA_PROFILE_STEP_LITERAL,
|
|
140
|
+
analysisId,
|
|
141
|
+
childWorkflowId: workflowId,
|
|
142
|
+
resources: estimateDataProfileResources(stagedInputs),
|
|
143
|
+
}, mintSandboxIdentity(DATA_PROFILE_RUN_LITERAL));
|
|
144
|
+
try {
|
|
145
|
+
// Checkpointed clock, not `Date.now()`: `awaitExec` gates on this absolute
|
|
146
|
+
// deadline and its recovery-pull is a durable step, so a wall-clock deadline
|
|
147
|
+
// that grew on replay would shift which loop iteration crosses the deadline
|
|
148
|
+
// and desynchronise the recorded function-ID sequence (see sandbox-step.ts,
|
|
149
|
+
// which captures its step deadline the same way).
|
|
150
|
+
const deadlineAbs = (await DBOS.now()) + DEFAULT_DEADLINE_MS;
|
|
151
|
+
const nextFunctionId = makeNextFunctionId();
|
|
152
|
+
const sandboxAgentDeps = {
|
|
153
|
+
provider: deps.provider,
|
|
154
|
+
pool: deps.pool,
|
|
155
|
+
sandboxClient: deps.sandboxClient,
|
|
156
|
+
workspaceFs: deps.workspaceFs,
|
|
157
|
+
embedding: deps.embedding,
|
|
158
|
+
model: deps.model,
|
|
159
|
+
skillsDir: deps.skillsDir,
|
|
160
|
+
bioKeys: deps.bioKeys,
|
|
161
|
+
step: {
|
|
162
|
+
sandbox,
|
|
163
|
+
workspaceRoot,
|
|
164
|
+
analysisId,
|
|
165
|
+
runId: DATA_PROFILE_RUN_LITERAL,
|
|
166
|
+
stepId: DATA_PROFILE_STEP_LITERAL,
|
|
167
|
+
workflowId,
|
|
168
|
+
// The profiler writes Python scripts and intermediate artifacts under
|
|
169
|
+
// the synthetic step path; the post-agent `rm -rf runs/data-profile/`
|
|
170
|
+
// cleanup wipes them.
|
|
171
|
+
allowedWritePrefix: `${workspaceRoot}/runs/${DATA_PROFILE_RUN_LITERAL}/${DATA_PROFILE_STEP_LITERAL}`,
|
|
172
|
+
nextFunctionId,
|
|
173
|
+
deadlineMs: () => deadlineAbs,
|
|
174
|
+
},
|
|
175
|
+
};
|
|
176
|
+
let capturedProfile = null;
|
|
177
|
+
const submitProfileTool = defineTool({
|
|
178
|
+
id: "submit_profile",
|
|
179
|
+
description: "Submit the profiling results. Call this tool once after completing " + "all profiling work — it validates and records your findings.",
|
|
180
|
+
inputSchema: ProfilerOutputSchema,
|
|
181
|
+
execute: async (input) => {
|
|
182
|
+
capturedProfile = input;
|
|
183
|
+
return ok({ status: "accepted" });
|
|
184
|
+
},
|
|
185
|
+
});
|
|
186
|
+
const baseAgent = createDataProfilerAgent(sandboxAgentDeps);
|
|
187
|
+
const agentDef = { ...baseAgent, tools: [...baseAgent.tools, submitProfileTool] };
|
|
188
|
+
const signal = new AbortController().signal;
|
|
189
|
+
await runToTerminal(agentDef, [{ role: "user", content: prompt }], childSession, {
|
|
190
|
+
provider: deps.provider,
|
|
191
|
+
signal,
|
|
192
|
+
emit: () => { },
|
|
193
|
+
runStep: durableStep,
|
|
194
|
+
}, {
|
|
195
|
+
resolved: () => capturedProfile !== null,
|
|
196
|
+
tools: [submitProfileTool],
|
|
197
|
+
nudge: "You stopped without calling submit_profile, so no profile was " +
|
|
198
|
+
"recorded. Call submit_profile now with structured metadata for " +
|
|
199
|
+
"every input file — base it on the profiling you already did.",
|
|
200
|
+
});
|
|
201
|
+
if (!capturedProfile) {
|
|
202
|
+
throw new Error("Data profiling failed: agent did not call submit_profile");
|
|
203
|
+
}
|
|
204
|
+
const profilerData = capturedProfile;
|
|
205
|
+
// 4. Index into vector store — real files only, consistent type metadata
|
|
206
|
+
const profilerByPath = new Map(profilerData.files.map((f) => [f.path, f]));
|
|
207
|
+
const normPath = (p) => p
|
|
208
|
+
.replace(/\/+/g, "/")
|
|
209
|
+
.replace(/^\/|\/$/g, "")
|
|
210
|
+
.trim();
|
|
211
|
+
const profilerByNorm = new Map(profilerData.files.map((f) => [normPath(f.path), f]));
|
|
212
|
+
await ensureSearchIndex(deps.pool, analysisId, deps.embedding.dimensions);
|
|
213
|
+
const vectorStore = createVectorStore(deps.pool);
|
|
214
|
+
const embedOne = async (text, session) => {
|
|
215
|
+
const [vec] = unwrapOrThrow(await deps.embedding.embed([text], session));
|
|
216
|
+
if (!vec)
|
|
217
|
+
throw new Error("data-profile: empty embedding response");
|
|
218
|
+
return vec;
|
|
219
|
+
};
|
|
220
|
+
const indexName = searchIndexName(analysisId);
|
|
221
|
+
let indexed = 0;
|
|
222
|
+
let fallbackCount = 0;
|
|
223
|
+
for (const matFile of stagedInputs) {
|
|
224
|
+
const dbPath = inputArtifactPath(matFile);
|
|
225
|
+
const desc = profilerByPath.get(dbPath) ?? profilerByNorm.get(normPath(dbPath));
|
|
226
|
+
// Lossless: a materialized input file the profiler agent omitted
|
|
227
|
+
// still gets a deterministic, no-LLM description so it stays
|
|
228
|
+
// discoverable via search. The agent's profile is enrichment, not a
|
|
229
|
+
// gate on indexing — mirrors the step-output metadata fallback.
|
|
230
|
+
const searchMeta = desc
|
|
231
|
+
? {
|
|
232
|
+
text: desc.description,
|
|
233
|
+
type: "input",
|
|
234
|
+
dataType: desc.dataType,
|
|
235
|
+
format: desc.format,
|
|
236
|
+
...(desc.tags ? { tags: desc.tags } : {}),
|
|
237
|
+
}
|
|
238
|
+
: {
|
|
239
|
+
text: `${dbPath} — input file (${fileExtension(dbPath)}, ${matFile.size} bytes); automated profile unavailable.`,
|
|
240
|
+
type: "input",
|
|
241
|
+
dataType: "unknown",
|
|
242
|
+
format: fileExtension(dbPath),
|
|
243
|
+
};
|
|
244
|
+
if (!desc)
|
|
245
|
+
fallbackCount++;
|
|
246
|
+
const embedding = await embedOne(searchMeta.text, runSession);
|
|
247
|
+
unwrapOrThrow(await vectorStore.upsert({
|
|
248
|
+
indexName,
|
|
249
|
+
vectors: [embedding],
|
|
250
|
+
metadata: [searchMeta],
|
|
251
|
+
ids: [`/${analysisId}/${dbPath}`],
|
|
252
|
+
}));
|
|
253
|
+
indexed++;
|
|
254
|
+
}
|
|
255
|
+
if (fallbackCount > 0) {
|
|
256
|
+
console.warn(`[data-profile] ${fallbackCount}/${stagedInputs.length} input file(s) used a deterministic fallback description (analysis=${analysisId}) — profiler omitted them`);
|
|
257
|
+
}
|
|
258
|
+
console.log(`[data-profile] Indexed ${indexed} file(s) for ${analysisId}`);
|
|
259
|
+
// 5. Complete — store result with input snapshot for staleness detection.
|
|
260
|
+
if (!unwrapOrThrow(await completeDataProfile(deps.pool, analysisId, {
|
|
261
|
+
summary: profilerData.analysisSummary,
|
|
262
|
+
files: profilerData.files.map((f) => ({
|
|
263
|
+
path: f.path,
|
|
264
|
+
description: f.description,
|
|
265
|
+
})),
|
|
266
|
+
inputFileIds: stagedInputs.map((f) => f.fileId),
|
|
267
|
+
inputFiles: buildDriftSignature(stagedInputs),
|
|
268
|
+
profiledAt: new Date().toISOString(),
|
|
269
|
+
}))) {
|
|
270
|
+
logTerminalNoop(analysisId, "completion");
|
|
271
|
+
}
|
|
272
|
+
await deps.runAuthorizer.revoke(authorization, "data-profile-completed");
|
|
273
|
+
}
|
|
274
|
+
finally {
|
|
275
|
+
try {
|
|
276
|
+
await deps.sandboxClient.teardown(sandbox);
|
|
277
|
+
}
|
|
278
|
+
catch (teardownErr) {
|
|
279
|
+
console.warn(`[data-profile] execution=${executionId} teardown failed (non-fatal):`, teardownErr);
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
catch (err) {
|
|
284
|
+
console.error(`[data-profile] Failed for ${analysisId}:`, err);
|
|
285
|
+
if (!unwrapOrThrow(await failDataProfile(deps.pool, analysisId, profileFailureReason(err))))
|
|
286
|
+
logTerminalNoop(analysisId, "failure");
|
|
287
|
+
await deps.runAuthorizer.revoke(authorization, "data-profile-failed");
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
/**
|
|
291
|
+
* Log a terminal ledger write the running-CAS refused: the row was cleared
|
|
292
|
+
* (emptied inputs) or expired (stale-timeout) out from under a live workflow, so
|
|
293
|
+
* there is no `running` row to stamp. Not an error — the ledger correctly moved
|
|
294
|
+
* on; the workflow still revokes its own authorization on the same terminal path.
|
|
295
|
+
*/
|
|
296
|
+
function logTerminalNoop(analysisId, write) {
|
|
297
|
+
console.warn(`[data-profile] ${write} write skipped for ${analysisId}: ledger row not running (cleared or expired concurrently)`);
|
|
298
|
+
}
|
|
299
|
+
/**
|
|
300
|
+
* Resolve the `RunSession` the workflow runs under. Whether the authorization
|
|
301
|
+
* is freshly minted (Cortex-owned) or reused (caller-owned) is decided by the
|
|
302
|
+
* `RunAuthorizer` seam from the opaque auth; this passes that auth straight
|
|
303
|
+
* through and never inspects it.
|
|
304
|
+
*/
|
|
305
|
+
export async function authorizeDataProfile(deps, params) {
|
|
306
|
+
const { auth, analysisId } = params;
|
|
307
|
+
return deps.runAuthorizer.authorize({
|
|
308
|
+
auth,
|
|
309
|
+
scope: { kind: "analysis", analysisId },
|
|
310
|
+
provenance: { agentId: DATA_PROFILE_AGENT_ID, callPath: [DATA_PROFILE_AGENT_ID] },
|
|
311
|
+
frame: { runId: DATA_PROFILE_RUN_LITERAL, stepId: DATA_PROFILE_STEP_LITERAL },
|
|
312
|
+
});
|
|
313
|
+
}
|
|
314
|
+
/**
|
|
315
|
+
* Per-attempt DBOS workflow id. The `nonce` is fresh per attempt (a bare
|
|
316
|
+
* `randomUUID()` minted at the trigger), so each (re-)profile of the same
|
|
317
|
+
* analysis gets a distinct id. DBOS workflow ids are permanent idempotency
|
|
318
|
+
* keys: a stable `dataprofile:{analysisId}` would make every attempt after the
|
|
319
|
+
* first a no-op — a re-profile/retry would dedup against the first (terminal)
|
|
320
|
+
* run, the body would never re-execute, and the ledger would sit at 'running'
|
|
321
|
+
* until it timed out. Concurrent double-starts are already prevented by the
|
|
322
|
+
* ledger CAS in tryStart/tryRerun/tryRetry, so the id does not need to dedup
|
|
323
|
+
* them. (`runId` is the constant `DATA_PROFILE_RUN_LITERAL`, so it can't key
|
|
324
|
+
* the id; an explicit nonce is what distinguishes attempts.)
|
|
325
|
+
*/
|
|
326
|
+
export function dataProfileWorkflowId(analysisId, nonce) {
|
|
327
|
+
return `dataprofile:${analysisId}:${nonce}`;
|
|
328
|
+
}
|
|
329
|
+
/**
|
|
330
|
+
* Authorize the run via the `RunAuthorizer` and start the data-profile workflow
|
|
331
|
+
* under a per-attempt id `dataprofile:{analysisId}:{nonce}` — concurrent
|
|
332
|
+
* triggers are already serialized by the ledger CAS. The caller has already
|
|
333
|
+
* staged the inputs and supplied the manifest in `params.stagedInputs`; this
|
|
334
|
+
* forwards it into the workflow input. Fire-and-forget: the handle result is
|
|
335
|
+
* not awaited.
|
|
336
|
+
*/
|
|
337
|
+
async function startDataProfileWorkflow(deps, params) {
|
|
338
|
+
const { runSession, ownsMandate } = await authorizeDataProfile(deps, params); // oss-core-managed-ok
|
|
339
|
+
const attemptNonce = randomUUID();
|
|
340
|
+
await DBOS.startWorkflow(deps.workflow, {
|
|
341
|
+
workflowID: dataProfileWorkflowId(params.analysisId, attemptNonce),
|
|
342
|
+
})({
|
|
343
|
+
analysisId: params.analysisId,
|
|
344
|
+
runSession,
|
|
345
|
+
ownsMandate, // oss-core-managed-ok
|
|
346
|
+
stagedInputs: params.stagedInputs,
|
|
347
|
+
});
|
|
348
|
+
}
|
|
349
|
+
/**
|
|
350
|
+
* Attempt to claim and run data profiling for an analysis, then start the workflow
|
|
351
|
+
* fire-and-forget for whichever claim won. Safe to call from multiple sites
|
|
352
|
+
* concurrently: the claims are CAS UPDATEs, so at most one caller dispatches.
|
|
353
|
+
*
|
|
354
|
+
* Every claim requires a non-empty `seed_input_file_ids` — a profile must always name
|
|
355
|
+
* the files it covers. The startable claim takes `'pending'` or a NULL status (NULL is
|
|
356
|
+
* the cleared-then-reseeded state); the rerun claim takes `'completed'`. A `'failed'`
|
|
357
|
+
* row is claimed by neither: retrying a failure is a deliberate act the caller drives
|
|
358
|
+
* through `tryRetryDataProfile` + `runDataProfile`.
|
|
359
|
+
*
|
|
360
|
+
* Returns what happened, so the caller can surface it (e.g. in the seed response).
|
|
361
|
+
*/
|
|
362
|
+
export async function triggerDataProfile(deps, params) {
|
|
363
|
+
const { analysisId } = params;
|
|
364
|
+
try {
|
|
365
|
+
// ADVISORY pre-check, not the enforcement — the claim CAS carries the same seed
|
|
366
|
+
// conjunct (see `SEEDED` in state/data-profile.ts) and is what actually makes a
|
|
367
|
+
// seedless `running` row impossible. This read exists only to name the cause: on
|
|
368
|
+
// the ordinary non-racing path it turns an opaque "no claim matched" into a
|
|
369
|
+
// precise reason. An empty array is not a seed — it names zero files. Reads via
|
|
370
|
+
// `loadSeedInputFileIds`, which returns null for BOTH a missing analysis row and
|
|
371
|
+
// a NULL-seed row (`loadDataProfileStatus` would hide the seed of a cleared row).
|
|
372
|
+
const seeded = unwrapOrThrow(await loadSeedInputFileIds(deps.pool, analysisId));
|
|
373
|
+
if (seeded === null || seeded.length === 0) {
|
|
374
|
+
console.error(`[data-profile] Trigger rejected for ${analysisId}: no seeded input set (missing analysis row or caller skipped seeding)`);
|
|
375
|
+
return "failed";
|
|
376
|
+
}
|
|
377
|
+
// The trigger validates the ledger seed above; it must also validate the manifest
|
|
378
|
+
// it is about to dispatch. A seeded row profiled against an EMPTY manifest would
|
|
379
|
+
// claim `running` and then hit the body's empty-manifest path — completing with a
|
|
380
|
+
// NULL result while the seed still names files, an incoherence a staleness policy
|
|
381
|
+
// then loops on re-triggering. Refuse the divergence before any claim.
|
|
382
|
+
if (params.stagedInputs.length === 0) {
|
|
383
|
+
console.error(`[data-profile] Trigger rejected for ${analysisId}: empty manifest dispatched against a seed naming ${seeded.length} file(s)`);
|
|
384
|
+
return "failed";
|
|
385
|
+
}
|
|
386
|
+
const started = unwrapOrThrow(await tryStartDataProfile(deps.pool, analysisId));
|
|
387
|
+
if (started) {
|
|
388
|
+
startDataProfileWorkflow(deps, params).catch((err) => compensateStartFailure(deps, analysisId, "Run", err));
|
|
389
|
+
return "started";
|
|
390
|
+
}
|
|
391
|
+
const restarted = unwrapOrThrow(await tryRerunDataProfile(deps.pool, analysisId));
|
|
392
|
+
if (restarted) {
|
|
393
|
+
startDataProfileWorkflow(deps, params).catch((err) => compensateStartFailure(deps, analysisId, "Re-run", err));
|
|
394
|
+
return "restarted";
|
|
395
|
+
}
|
|
396
|
+
const status = unwrapOrThrow(await loadDataProfileStatus(deps.pool, analysisId));
|
|
397
|
+
if (status?.status === "running")
|
|
398
|
+
return "already_running";
|
|
399
|
+
return "failed";
|
|
400
|
+
}
|
|
401
|
+
catch (err) {
|
|
402
|
+
console.error(`[data-profile] Trigger error for ${analysisId}:`, err);
|
|
403
|
+
return "failed";
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
/**
|
|
407
|
+
* Compensate a fire-and-forget start that rejected. The ledger CAS in
|
|
408
|
+
* `tryStart`/`tryRerun`/`tryRetry` already flipped the row to `running`; if the
|
|
409
|
+
* dispatch never landed a workflow, DBOS has nothing to recover, so without
|
|
410
|
+
* this the row would sit at `running` forever and every later trigger would
|
|
411
|
+
* report `already_running`. Failing the ledger lets the retry path recover.
|
|
412
|
+
* Best-effort — a compensation write that itself fails is only logged, since
|
|
413
|
+
* there is no further channel to report it on.
|
|
414
|
+
*/
|
|
415
|
+
async function compensateStartFailure(deps, analysisId, phase, err) {
|
|
416
|
+
console.error(`[data-profile] ${phase} error for ${analysisId}:`, err);
|
|
417
|
+
const failed = await failDataProfile(deps.pool, analysisId, profileFailureReason(err));
|
|
418
|
+
if (failed.isErr()) {
|
|
419
|
+
console.error(`[data-profile] Failed to mark ${analysisId} failed after a start error:`, failed.error);
|
|
420
|
+
}
|
|
421
|
+
else if (!failed.value) {
|
|
422
|
+
// The row this compensation was written to fail is no longer `running` — a
|
|
423
|
+
// concurrent clear/expire already moved it on, so the running-CAS refused the
|
|
424
|
+
// stamp. Nothing wedged at `running`, which is the outcome compensation exists
|
|
425
|
+
// to guarantee; just record the no-op.
|
|
426
|
+
logTerminalNoop(analysisId, "compensation");
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
/**
|
|
430
|
+
* Start the data-profile workflow for an already-claimed analysis (the retry
|
|
431
|
+
* route claims via `tryRetryDataProfile`, then calls this). The caller does not
|
|
432
|
+
* await the workflow's completion, but a start that rejects compensates the
|
|
433
|
+
* ledger (see {@link compensateStartFailure}) before re-throwing, so a caller's
|
|
434
|
+
* own `.catch` still observes the error and the row never wedges at `running`.
|
|
435
|
+
*/
|
|
436
|
+
export async function runDataProfile(deps, params) {
|
|
437
|
+
try {
|
|
438
|
+
await startDataProfileWorkflow(deps, params);
|
|
439
|
+
}
|
|
440
|
+
catch (err) {
|
|
441
|
+
await compensateStartFailure(deps, params.analysisId, "Retry", err);
|
|
442
|
+
throw err;
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
/**
|
|
446
|
+
* Concise, UI-safe failure reason. `data_profile_error` is surfaced verbatim
|
|
447
|
+
* to the frontend, so raw errors — K8s API response bodies, multi-line stack
|
|
448
|
+
* traces — must never reach it. The full error is preserved in the logs; this
|
|
449
|
+
* collapses to a single bounded line for display.
|
|
450
|
+
*/
|
|
451
|
+
const PROFILE_ERROR_MAX_LEN = 200;
|
|
452
|
+
function profileFailureReason(err) {
|
|
453
|
+
const raw = err instanceof Error ? err.message : String(err);
|
|
454
|
+
const firstLine = raw.split("\n", 1)[0].replace(/\s+/g, " ").trim();
|
|
455
|
+
return firstLine.length > PROFILE_ERROR_MAX_LEN ? firstLine.slice(0, PROFILE_ERROR_MAX_LEN - 1) + "…" : firstLine || "Data profiling failed";
|
|
456
|
+
}
|
|
457
|
+
/** Per-call function-id minter — replay-deterministic. */
|
|
458
|
+
function makeNextFunctionId() {
|
|
459
|
+
let n = 0;
|
|
460
|
+
return () => `fn-${(n++).toString(36)}`;
|
|
461
|
+
}
|