@inflexa-ai/harness 0.45.0 → 0.46.0
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/README.md +6 -3
- package/dist/agents/conversation-agent.d.ts +19 -3
- package/dist/agents/conversation-agent.js +49 -30
- package/dist/agents/report-session-agent.d.ts +15 -15
- package/dist/agents/report-session-agent.js +23 -15
- package/dist/agents/sandbox/index.d.ts +1 -1
- package/dist/agents/sandbox/index.js +1 -1
- package/dist/agents/sandbox/shared.d.ts +35 -16
- package/dist/agents/sandbox/shared.js +63 -24
- package/dist/agents/sandbox/translational-safety-agent.js +26 -0
- package/dist/agents/sandbox/types.d.ts +26 -3
- package/dist/agents/sandbox/validate-skills.d.ts +2 -2
- package/dist/agents/sandbox/validate-skills.js +3 -1
- package/dist/agents/sandbox-catalog.d.ts +16 -2
- package/dist/agents/sandbox-catalog.js +22 -3
- package/dist/agents/system-prompt.d.ts +2 -2
- package/dist/app/approve-plan.d.ts +5 -2
- package/dist/app/approve-plan.js +1 -1
- package/dist/app/chat-turn-workflow.d.ts +114 -0
- package/dist/app/chat-turn-workflow.js +307 -0
- package/dist/app/chat-turn.d.ts +85 -57
- package/dist/app/chat-turn.js +125 -99
- package/dist/app/data-profile-orientation.js +10 -8
- package/dist/app/data-profile-view.d.ts +4 -4
- package/dist/app/data-profile-view.js +9 -8
- package/dist/app/in-process-turn.d.ts +42 -0
- package/dist/app/in-process-turn.js +139 -0
- package/dist/app/message-assembly.d.ts +10 -4
- package/dist/app/message-assembly.js +13 -8
- package/dist/app/report-session-runtime.d.ts +4 -4
- package/dist/app/report-session-runtime.js +36 -21
- package/dist/app/spawn-report-session.d.ts +33 -28
- package/dist/app/spawn-report-session.js +25 -40
- package/dist/app/synthesize-run.d.ts +22 -16
- package/dist/app/synthesize-run.js +41 -35
- package/dist/app/work.d.ts +96 -0
- package/dist/app/work.js +147 -0
- package/dist/auth/local-auth-context.d.ts +1 -3
- package/dist/auth/local-auth-context.js +1 -3
- package/dist/auth/local-run-authorizer.d.ts +1 -1
- package/dist/auth/local-run-authorizer.js +5 -3
- package/dist/auth/types.d.ts +26 -26
- package/dist/billing/cached-resolver.d.ts +4 -4
- package/dist/billing/run-charge.d.ts +5 -8
- package/dist/billing/run-charge.js +2 -2
- package/dist/billing/usage-recorder.d.ts +9 -9
- package/dist/citations/aggregate.js +1 -1
- package/dist/citations/clients/arxiv.d.ts +2 -2
- package/dist/citations/clients/arxiv.js +12 -4
- package/dist/citations/clients/common.js +4 -2
- package/dist/citations/clients/crossref.d.ts +2 -2
- package/dist/citations/clients/crossref.js +37 -37
- package/dist/citations/clients/doi-registry.js +15 -16
- package/dist/citations/clients/pubmed.d.ts +2 -2
- package/dist/citations/clients/pubmed.js +20 -13
- package/dist/citations/clients/semantic-scholar.d.ts +2 -2
- package/dist/citations/clients/semantic-scholar.js +9 -9
- package/dist/citations/compare.js +2 -2
- package/dist/citations/match.d.ts +2 -2
- package/dist/citations/match.js +12 -7
- package/dist/citations/normalize.js +35 -26
- package/dist/citations/plan.js +6 -2
- package/dist/citations/resolve.d.ts +6 -6
- package/dist/citations/resolve.js +34 -25
- package/dist/citations/types.d.ts +77 -77
- package/dist/config/environment-stores.d.ts +10 -8
- package/dist/config/resource-limits.js +1 -3
- package/dist/contracts/analogy-report.d.ts +7 -7
- package/dist/contracts/analogy-report.js +2 -2
- package/dist/contracts/chat-events.d.ts +46 -22
- package/dist/contracts/chat-events.js +1 -1
- package/dist/contracts/chat-frame.d.ts +15 -5
- package/dist/contracts/chat-frame.js +67 -40
- package/dist/contracts/chat-parts.d.ts +130 -67
- package/dist/contracts/chat-parts.js +1 -0
- package/dist/contracts/content-url.js +16 -2
- package/dist/contracts/data-profile.d.ts +38 -38
- package/dist/contracts/index.d.ts +3 -3
- package/dist/contracts/index.js +1 -1
- package/dist/contracts/message.d.ts +6 -6
- package/dist/contracts/organ-system.d.ts +11 -11
- package/dist/contracts/part-registry.d.ts +5 -4
- package/dist/contracts/part-registry.js +5 -0
- package/dist/contracts/profile-vocabulary.d.ts +11 -10
- package/dist/contracts/profile-vocabulary.js +10 -3
- package/dist/contracts/report-blocks.d.ts +329 -329
- package/dist/contracts/report-reference.d.ts +105 -81
- package/dist/contracts/report-reference.js +30 -13
- package/dist/contracts/schemas/chat-events.d.ts +45 -6
- package/dist/contracts/schemas/chat-events.js +16 -0
- package/dist/contracts/schemas/chat-parts.d.ts +214 -102
- package/dist/contracts/schemas/chat-parts.js +50 -7
- package/dist/contracts/schemas/index.d.ts +1 -1
- package/dist/contracts/schemas/index.js +1 -1
- package/dist/contracts/severity.d.ts +1 -1
- package/dist/contracts/structure-source.d.ts +3 -3
- package/dist/contracts/structure-source.js +6 -2
- package/dist/contracts/subagent-activity.d.ts +2 -2
- package/dist/contracts/subagent-activity.js +5 -3
- package/dist/contracts/usage.d.ts +2 -2
- package/dist/data/safety-panel-schema.d.ts +25 -25
- package/dist/data/safety-panel-schema.js +13 -4
- package/dist/execution/artifact-metadata.d.ts +23 -15
- package/dist/execution/artifact-metadata.js +33 -10
- package/dist/execution/artifact-record.d.ts +2 -2
- package/dist/execution/artifact-registration.d.ts +5 -5
- package/dist/execution/artifact-registry.d.ts +8 -8
- package/dist/execution/dbos-run-launcher.d.ts +24 -4
- package/dist/execution/dbos-run-launcher.js +58 -4
- package/dist/execution/dbos-workflow-purger.d.ts +7 -6
- package/dist/execution/dbos-workflow-purger.js +29 -21
- package/dist/execution/input-signature.d.ts +2 -2
- package/dist/execution/post-step-pipeline.d.ts +9 -9
- package/dist/execution/post-step-pipeline.js +1 -1
- package/dist/execution/post-step.js +2 -2
- package/dist/execution/reconcile-manifest.d.ts +4 -4
- package/dist/execution/reconcile-manifest.js +3 -2
- package/dist/execution/run-authorizer.d.ts +46 -37
- package/dist/execution/run-authorizer.js +8 -8
- package/dist/execution/run-canceler.d.ts +39 -17
- package/dist/execution/run-canceler.js +137 -28
- package/dist/execution/run-end-record.d.ts +29 -0
- package/dist/execution/run-end-record.js +27 -0
- package/dist/execution/run-event-parts.d.ts +0 -8
- package/dist/execution/run-event-parts.js +29 -24
- package/dist/execution/run-event-stream.d.ts +8 -8
- package/dist/execution/run-event-stream.js +3 -4
- package/dist/execution/run-launcher.d.ts +4 -4
- package/dist/execution/run-synthesis.d.ts +49 -48
- package/dist/execution/run-synthesis.js +96 -255
- package/dist/execution/staged-input.d.ts +2 -2
- package/dist/execution/step-summary.d.ts +6 -6
- package/dist/execution/step-summary.js +4 -8
- package/dist/execution/topo-sort.js +4 -3
- package/dist/execution/workflow-purger.d.ts +2 -2
- package/dist/index.d.ts +25 -24
- package/dist/index.js +36 -37
- package/dist/input-sanitization.js +9 -2
- package/dist/input-scan/clustering.d.ts +6 -6
- package/dist/input-scan/clustering.js +11 -5
- package/dist/input-scan/companions.js +3 -2
- package/dist/input-scan/detect-sets.d.ts +2 -2
- package/dist/input-scan/detect-sets.js +25 -21
- package/dist/input-scan/enrich.d.ts +6 -6
- package/dist/input-scan/enrich.js +29 -12
- package/dist/input-scan/formats.d.ts +2 -2
- package/dist/input-scan/formats.js +8 -2
- package/dist/input-scan/markers.d.ts +2 -2
- package/dist/input-scan/markers.js +14 -5
- package/dist/input-scan/menu.d.ts +10 -10
- package/dist/input-scan/menu.js +0 -0
- package/dist/input-scan/quarantine.d.ts +2 -2
- package/dist/input-scan/quarantine.js +23 -18
- package/dist/input-scan/readout-budget.d.ts +2 -2
- package/dist/input-scan/readout-budget.js +1 -1
- package/dist/input-scan/readout.d.ts +2 -2
- package/dist/input-scan/readout.js +47 -34
- package/dist/input-scan/scan.d.ts +2 -2
- package/dist/input-scan/scan.js +7 -5
- package/dist/input-scan/set-types.d.ts +28 -28
- package/dist/input-scan/shapes.d.ts +4 -4
- package/dist/input-scan/shapes.js +0 -0
- package/dist/input-scan/templates.d.ts +10 -10
- package/dist/input-scan/templates.js +30 -22
- package/dist/input-scan/tokens.d.ts +6 -4
- package/dist/input-scan/tokens.js +100 -38
- package/dist/input-scan/types.d.ts +22 -22
- package/dist/lib/async-utils.d.ts +3 -7
- package/dist/lib/async-utils.js +5 -9
- package/dist/lib/cache.js +1 -1
- package/dist/lib/chrome.d.ts +46 -6
- package/dist/lib/console-logger.js +2 -2
- package/dist/lib/db-result.d.ts +22 -6
- package/dist/lib/db-result.js +9 -13
- package/dist/lib/eyes.d.ts +4 -4
- package/dist/lib/eyes.js +1 -1
- package/dist/lib/fs-helpers.js +18 -6
- package/dist/lib/fs-result.d.ts +1 -0
- package/dist/lib/fs-result.js +5 -6
- package/dist/lib/hooks.d.ts +23 -7
- package/dist/lib/hooks.js +17 -3
- package/dist/lib/host-concurrency.js +3 -2
- package/dist/lib/logger.d.ts +2 -2
- package/dist/lib/logger.js +2 -1
- package/dist/lib/metrics.d.ts +1 -1
- package/dist/lib/null-proto.d.ts +6 -0
- package/dist/lib/null-proto.js +17 -0
- package/dist/lib/otel-spans.d.ts +1 -1
- package/dist/lib/otel-spans.js +9 -5
- package/dist/lib/otel.d.ts +4 -2
- package/dist/lib/otel.js +10 -2
- package/dist/lib/page-capture.d.ts +8 -8
- package/dist/lib/page-capture.js +9 -4
- package/dist/lib/parse-json.d.ts +5 -0
- package/dist/lib/parse-json.js +12 -0
- package/dist/lib/present.d.ts +12 -0
- package/dist/lib/present.js +39 -0
- package/dist/lib/rate-limit.d.ts +4 -4
- package/dist/lib/rate-limit.js +12 -13
- package/dist/lib/regulatory-corpus/fetch-fda-guidance.d.ts +4 -4
- package/dist/lib/regulatory-corpus/fetch-fda-guidance.js +4 -10
- package/dist/lib/regulatory-corpus/fetch-ich.d.ts +4 -4
- package/dist/lib/regulatory-corpus/fetch-ich.js +18 -14
- package/dist/lib/regulatory-corpus/normalize-whitespace.d.ts +6 -0
- package/dist/lib/regulatory-corpus/normalize-whitespace.js +41 -0
- package/dist/lib/regulatory-corpus.d.ts +10 -10
- package/dist/lib/regulatory-corpus.js +3 -1
- package/dist/lib/result.d.ts +10 -11
- package/dist/lib/result.js +15 -13
- package/dist/lib/storage.d.ts +2 -2
- package/dist/lib/test/async-iterable.d.ts +9 -0
- package/dist/lib/test/async-iterable.js +28 -0
- package/dist/lib/test/request-url.d.ts +5 -0
- package/dist/lib/test/request-url.js +7 -0
- package/dist/lib/test/result-assert.d.ts +12 -0
- package/dist/lib/test/result-assert.js +17 -0
- package/dist/lib/test/text-shapes.d.ts +24 -0
- package/dist/lib/test/text-shapes.js +63 -0
- package/dist/lib/text.d.ts +22 -0
- package/dist/lib/text.js +68 -0
- package/dist/lib/thrown.d.ts +18 -0
- package/dist/lib/thrown.js +30 -0
- package/dist/lib/unknown-array.d.ts +6 -0
- package/dist/lib/unknown-array.js +8 -0
- package/dist/lib/unknown-containers.d.ts +14 -0
- package/dist/lib/unknown-containers.js +17 -0
- package/dist/lib/unknown-text.d.ts +8 -0
- package/dist/lib/unknown-text.js +28 -0
- package/dist/lib/zod-issue-shape.d.ts +1 -1
- package/dist/lib/zod-issue-shape.js +31 -31
- package/dist/lib/zod-issues.d.ts +3 -3
- package/dist/lib/zod-issues.js +30 -17
- package/dist/literature/sources/arxiv.d.ts +6 -6
- package/dist/literature/sources/arxiv.js +92 -35
- package/dist/literature/sources/http.d.ts +2 -2
- package/dist/literature/sources/http.js +16 -15
- package/dist/literature/sources/pubmed.d.ts +16 -16
- package/dist/literature/sources/pubmed.js +96 -61
- package/dist/literature/sources/semantic-scholar.d.ts +8 -8
- package/dist/literature/sources/semantic-scholar.js +22 -13
- package/dist/loop/accounting.d.ts +63 -0
- package/dist/loop/accounting.js +141 -0
- package/dist/loop/call-policy.d.ts +73 -0
- package/dist/loop/call-policy.js +109 -0
- package/dist/loop/chat-stream.d.ts +62 -0
- package/dist/loop/chat-stream.js +237 -0
- package/dist/loop/compaction.d.ts +14 -9
- package/dist/loop/compaction.js +17 -0
- package/dist/loop/metrics.d.ts +12 -15
- package/dist/loop/metrics.js +14 -26
- package/dist/loop/run-loop.d.ts +233 -0
- package/dist/loop/run-loop.js +770 -0
- package/dist/loop/sub-agent.d.ts +61 -0
- package/dist/loop/sub-agent.js +161 -0
- package/dist/loop/tool-adapter.d.ts +98 -0
- package/dist/loop/tool-adapter.js +364 -0
- package/dist/loop/tool-detail.d.ts +1 -1
- package/dist/loop/tool-detail.js +6 -5
- package/dist/loop/tool-outcome.d.ts +1 -1
- package/dist/loop/tool-output.d.ts +4 -4
- package/dist/loop/tool-output.js +2 -2
- package/dist/loop/turn-credentials.d.ts +34 -0
- package/dist/loop/turn-credentials.js +73 -0
- package/dist/loop/types.d.ts +34 -37
- package/dist/loop/types.js +2 -7
- package/dist/memory/ai-sdk-message-storage.d.ts +5 -5
- package/dist/memory/ai-sdk-message-storage.js +13 -11
- package/dist/memory/card-builders.d.ts +14 -14
- package/dist/memory/card-builders.js +19 -15
- package/dist/memory/conversation-display-recorder.d.ts +22 -6
- package/dist/memory/conversation-display-recorder.js +64 -20
- package/dist/memory/conversation-display-replay.js +3 -2
- package/dist/memory/conversation-display-storage.d.ts +15 -7
- package/dist/memory/conversation-display-storage.js +141 -36
- package/dist/memory/conversation-view.d.ts +4 -4
- package/dist/memory/conversation-view.js +5 -4
- package/dist/memory/count-tokens.js +10 -8
- package/dist/memory/derive-thread-title.d.ts +0 -13
- package/dist/memory/derive-thread-title.js +2 -1
- package/dist/memory/message-backfill.d.ts +12 -5
- package/dist/memory/message-backfill.js +5 -3
- package/dist/memory/thread-history.d.ts +66 -24
- package/dist/memory/thread-history.js +212 -79
- package/dist/memory/thread-store.d.ts +26 -17
- package/dist/memory/thread-store.js +15 -9
- package/dist/memory/tool-call-integrity.d.ts +2 -2
- package/dist/memory/tool-call-integrity.js +4 -3
- package/dist/memory/working-memory.d.ts +16 -12
- package/dist/memory/working-memory.js +72 -61
- package/dist/prompts/briefing.d.ts +63 -9
- package/dist/prompts/briefing.js +130 -3
- package/dist/prompts/planner.js +13 -2
- package/dist/prompts/synthesis-agent.d.ts +1 -1
- package/dist/prompts/synthesis-agent.js +6 -14
- package/dist/provenance/collector.d.ts +6 -6
- package/dist/provenance/collector.js +15 -8
- package/dist/provenance/exec-frame.d.ts +2 -2
- package/dist/provenance/exec-frame.js +6 -1
- package/dist/provenance/seam.d.ts +24 -19
- package/dist/provenance/seam.js +7 -5
- package/dist/provenance/types.d.ts +6 -6
- package/dist/providers/ai-sdk.d.ts +113 -62
- package/dist/providers/ai-sdk.js +303 -458
- package/dist/providers/embedding.d.ts +2 -2
- package/dist/providers/embedding.js +1 -1
- package/dist/providers/errors.d.ts +22 -2
- package/dist/providers/errors.js +98 -50
- package/dist/providers/prompt-cache.d.ts +8 -8
- package/dist/providers/prompt-cache.js +13 -11
- package/dist/providers/reasoning.d.ts +2 -2
- package/dist/providers/reasoning.js +2 -2
- package/dist/providers/types.d.ts +59 -92
- package/dist/reference-data/catalog.d.ts +2 -15
- package/dist/reference-data/catalog.js +166 -10
- package/dist/reference-data/receipt.d.ts +2 -2
- package/dist/report-model/assert-rules.js +1 -1
- package/dist/report-model/authoring-grammar.d.ts +209 -231
- package/dist/report-model/block-walk.d.ts +10 -10
- package/dist/report-model/block-walk.js +2 -0
- package/dist/report-model/draft-finish.d.ts +8 -8
- package/dist/report-model/draft-finish.js +1 -1
- package/dist/report-model/draft-hash.js +8 -7
- package/dist/report-model/draft-operations.d.ts +22 -10
- package/dist/report-model/draft-operations.js +48 -30
- package/dist/report-model/draft-read.d.ts +19 -7
- package/dist/report-model/draft-read.js +16 -6
- package/dist/report-model/draft.d.ts +844 -2
- package/dist/report-model/draft.js +3 -1
- package/dist/report-model/fixture-resolver.js +39 -16
- package/dist/report-model/pin-snapshot.d.ts +2 -2
- package/dist/report-model/pin-snapshot.js +15 -15
- package/dist/report-model/production-resolver.d.ts +18 -18
- package/dist/report-model/production-resolver.js +50 -42
- package/dist/report-model/reference-resolver.d.ts +26 -10
- package/dist/report-model/reference-resolver.js +68 -5
- package/dist/report-model/reference-stamp.js +30 -38
- package/dist/report-model/structural-validation.js +12 -4
- package/dist/report-model/validate.d.ts +7 -7
- package/dist/report-model/validate.js +6 -6
- package/dist/report-render/assets.d.ts +2 -2
- package/dist/report-render/assets.js +27 -3
- package/dist/report-render/chart-export.d.ts +10 -2
- package/dist/report-render/chart-export.js +37 -11
- package/dist/report-render/chart-presets.d.ts +8 -8
- package/dist/report-render/chart-presets.js +3 -3
- package/dist/report-render/chart-renderers.d.ts +23 -16
- package/dist/report-render/chart-renderers.js +74 -53
- package/dist/report-render/chart-toolbox.d.ts +2 -2
- package/dist/report-render/chart-toolbox.js +7 -6
- package/dist/report-render/chart.d.ts +15 -16
- package/dist/report-render/chart.js +369 -252
- package/dist/report-render/design.d.ts +36 -297
- package/dist/report-render/design.js +0 -12
- package/dist/report-render/figures/common.d.ts +12 -12
- package/dist/report-render/figures/common.js +42 -31
- package/dist/report-render/figures/dendrogram.d.ts +3 -3
- package/dist/report-render/figures/dendrogram.js +10 -10
- package/dist/report-render/figures/dense.js +15 -8
- package/dist/report-render/figures/dotplot.js +46 -33
- package/dist/report-render/figures/embedding.js +52 -43
- package/dist/report-render/figures/equal-units.d.ts +10 -10
- package/dist/report-render/figures/equal-units.js +27 -27
- package/dist/report-render/figures/forest.js +9 -7
- package/dist/report-render/figures/gsea.js +21 -11
- package/dist/report-render/figures/heatmap.js +13 -9
- package/dist/report-render/figures/index.d.ts +10 -10
- package/dist/report-render/figures/index.js +4 -2
- package/dist/report-render/figures/km.js +10 -9
- package/dist/report-render/figures/label-room.d.ts +12 -12
- package/dist/report-render/figures/label-room.js +7 -2
- package/dist/report-render/figures/locuszoom.d.ts +2 -2
- package/dist/report-render/figures/locuszoom.js +59 -31
- package/dist/report-render/figures/lollipop.js +3 -2
- package/dist/report-render/figures/ma.js +8 -4
- package/dist/report-render/figures/manhattan.d.ts +1 -2
- package/dist/report-render/figures/manhattan.js +52 -34
- package/dist/report-render/figures/oncoprint.js +4 -5
- package/dist/report-render/figures/pca.js +25 -11
- package/dist/report-render/figures/qq.js +20 -9
- package/dist/report-render/figures/roc.js +1 -1
- package/dist/report-render/figures/sankey.d.ts +2 -2
- package/dist/report-render/figures/sankey.js +11 -10
- package/dist/report-render/figures/upset.d.ts +6 -6
- package/dist/report-render/figures/upset.js +7 -4
- package/dist/report-render/figures/volcano.js +12 -10
- package/dist/report-render/hybrid-svg.d.ts +4 -4
- package/dist/report-render/hybrid-svg.js +7 -5
- package/dist/report-render/number-format.d.ts +4 -4
- package/dist/report-render/number-format.js +62 -27
- package/dist/report-render/page.js +2 -1
- package/dist/report-render/provenance-data.d.ts +2 -2
- package/dist/report-render/references.d.ts +4 -4
- package/dist/report-render/render.d.ts +2 -2
- package/dist/report-render/render.js +10 -11
- package/dist/report-render/script-json.js +1 -1
- package/dist/report-render/table-data.d.ts +6 -6
- package/dist/report-render/test/options.d.ts +49 -0
- package/dist/report-render/test/options.js +143 -0
- package/dist/report-render/test/page-function.d.ts +19 -0
- package/dist/report-render/test/page-function.js +33 -0
- package/dist/report-render/types.d.ts +10 -10
- package/dist/report-render/value-bridge.d.ts +4 -4
- package/dist/report-render/value-bridge.js +27 -14
- package/dist/report-render/views/chart-view.d.ts +2 -2
- package/dist/report-render/views/chart-view.js +2 -2
- package/dist/report-render/views/lineage.d.ts +6 -6
- package/dist/report-render/views/lineage.js +2 -0
- package/dist/report-render/views/page-view.d.ts +2 -2
- package/dist/report-render/views/page-view.js +1 -0
- package/dist/report-render/views/prose.js +25 -8
- package/dist/report-render/views/references-view.js +12 -1
- package/dist/report-render/views/values.js +1 -1
- package/dist/runtime/assemble.d.ts +53 -26
- package/dist/runtime/assemble.js +103 -56
- package/dist/runtime/boot.d.ts +8 -7
- package/dist/runtime/boot.js +1 -1
- package/dist/runtime/connection-budget.d.ts +6 -6
- package/dist/runtime/connection-budget.js +1 -1
- package/dist/runtime/dbos.d.ts +29 -19
- package/dist/runtime/dbos.js +35 -20
- package/dist/runtime/result-serialization.js +18 -5
- package/dist/runtime/shutdown.d.ts +2 -2
- package/dist/sandbox/client.d.ts +7 -3
- package/dist/sandbox/cpu-files.d.ts +2 -2
- package/dist/sandbox/cpu-files.js +21 -4
- package/dist/sandbox/create-sandbox.d.ts +7 -8
- package/dist/sandbox/create-sandbox.js +6 -12
- package/dist/sandbox/docker-client.d.ts +48 -3
- package/dist/sandbox/docker-client.js +10 -6
- package/dist/sandbox/estimate-data-profile-resources.js +2 -7
- package/dist/sandbox/exec-outcome.d.ts +2 -2
- package/dist/sandbox/exec-outcome.js +1 -1
- package/dist/sandbox/exec.d.ts +10 -6
- package/dist/sandbox/exec.js +27 -12
- package/dist/sandbox/execution-id.js +14 -6
- package/dist/sandbox/farm.d.ts +2 -2
- package/dist/sandbox/farm.js +22 -27
- package/dist/sandbox/identity.d.ts +7 -0
- package/dist/sandbox/identity.js +14 -3
- package/dist/sandbox/image-packages.d.ts +26 -4
- package/dist/sandbox/image-packages.js +29 -27
- package/dist/sandbox/k8s-client.d.ts +35 -8
- package/dist/sandbox/k8s-client.js +6 -5
- package/dist/sandbox/labels.js +1 -0
- package/dist/sandbox/liveness.js +3 -1
- package/dist/sandbox/mount-plan.d.ts +10 -10
- package/dist/sandbox/mount-plan.js +13 -14
- package/dist/sandbox/notification-sweep.d.ts +4 -4
- package/dist/sandbox/notification-sweep.js +4 -7
- package/dist/sandbox/package-identity.d.ts +6 -13
- package/dist/sandbox/package-identity.js +46 -28
- package/dist/sandbox/reaper.d.ts +10 -10
- package/dist/sandbox/reaper.js +4 -6
- package/dist/sandbox/sandbox-error.d.ts +2 -9
- package/dist/sandbox/sandbox-error.js +21 -8
- package/dist/sandbox/sandbox-step-translate.d.ts +8 -5
- package/dist/sandbox/sandbox-step-translate.js +22 -8
- package/dist/sandbox/step-sandbox.d.ts +47 -0
- package/dist/sandbox/step-sandbox.js +53 -0
- package/dist/sandbox/types.d.ts +18 -19
- package/dist/sandbox/types.js +1 -1
- package/dist/schemas/artifact-manifest.d.ts +4 -4
- package/dist/schemas/data-profile-schemas.d.ts +351 -306
- package/dist/schemas/file-metadata.js +2 -4
- package/dist/schemas/plan-schemas.d.ts +79 -25
- package/dist/schemas/plan-schemas.js +1 -1
- package/dist/schemas/run-synthesis.d.ts +95 -26
- package/dist/schemas/run-synthesis.js +3 -1
- package/dist/schemas/validate-plan.d.ts +4 -4
- package/dist/schemas/validate-plan.js +17 -5
- package/dist/schemas/workflow-state.d.ts +127 -14
- package/dist/schemas/workflow-state.js +56 -2
- package/dist/state/active-turns.d.ts +36 -0
- package/dist/state/active-turns.js +67 -0
- package/dist/state/analyses-metrics.d.ts +8 -8
- package/dist/state/analyses-metrics.js +4 -4
- package/dist/state/analyses.d.ts +0 -14
- package/dist/state/analyses.js +0 -32
- package/dist/state/artifacts.d.ts +47 -18
- package/dist/state/artifacts.js +48 -7
- package/dist/state/data-profile.d.ts +2 -2
- package/dist/state/db.d.ts +12 -2
- package/dist/state/db.js +5 -0
- package/dist/state/edit-intents.d.ts +4 -0
- package/dist/state/edit-intents.js +71 -0
- package/dist/state/index.d.ts +5 -5
- package/dist/state/index.js +3 -3
- package/dist/state/init.d.ts +2 -1
- package/dist/state/init.js +5 -2
- package/dist/state/migrations/20260927120000_baseline.js +3 -1
- package/dist/state/migrations/20261026120000_add_the_edit_intents.d.ts +7 -0
- package/dist/state/migrations/20261026120000_add_the_edit_intents.js +21 -0
- package/dist/state/migrations/20261027120000_record_the_applied_memory_edits.d.ts +7 -0
- package/dist/state/migrations/20261027120000_record_the_applied_memory_edits.js +16 -0
- package/dist/state/migrations/20261027120100_store_the_authoring_results.d.ts +8 -0
- package/dist/state/migrations/20261027120100_store_the_authoring_results.js +20 -0
- package/dist/state/migrations/20261027120200_key_the_groups_of_a_turn.d.ts +7 -0
- package/dist/state/migrations/20261027120200_key_the_groups_of_a_turn.js +12 -0
- package/dist/state/migrations/20261027120300_mark_the_active_turn_of_a_thread.d.ts +7 -0
- package/dist/state/migrations/20261027120300_mark_the_active_turn_of_a_thread.js +11 -0
- package/dist/state/migrations/20261028120000_record_the_paused_work.d.ts +7 -0
- package/dist/state/migrations/20261028120000_record_the_paused_work.js +25 -0
- package/dist/state/migrations/20261028120100_end_the_suspended_runs.d.ts +8 -0
- package/dist/state/migrations/20261028120100_end_the_suspended_runs.js +13 -0
- package/dist/state/migrations/20261029120000_reference_the_run_mandate.d.ts +7 -0
- package/dist/state/migrations/20261029120000_reference_the_run_mandate.js +23 -0
- package/dist/state/migrations/20261029120100_record_the_run_session_of_a_pause.d.ts +7 -0
- package/dist/state/migrations/20261029120100_record_the_run_session_of_a_pause.js +11 -0
- package/dist/state/migrations/index.js +18 -0
- package/dist/state/paused-work.d.ts +52 -0
- package/dist/state/paused-work.js +105 -0
- package/dist/state/plans.d.ts +27 -8
- package/dist/state/plans.js +14 -11
- package/dist/state/purge-analysis.d.ts +6 -6
- package/dist/state/purge-analysis.js +10 -2
- package/dist/state/report-session-state.d.ts +43 -18
- package/dist/state/report-session-state.js +43 -4
- package/dist/state/report-versions.d.ts +16 -11
- package/dist/state/report-versions.js +5 -3
- package/dist/state/runs.d.ts +70 -25
- package/dist/state/runs.js +127 -64
- package/dist/state/schema.d.ts +18 -21
- package/dist/state/schema.js +4 -5
- package/dist/state/snapshot-parse.d.ts +2 -2
- package/dist/state/snapshot-parse.js +14 -8
- package/dist/state/step-executions.d.ts +29 -8
- package/dist/state/step-executions.js +28 -4
- package/dist/state/tool-outputs.d.ts +2 -2
- package/dist/state/tool-outputs.js +2 -1
- package/dist/state/vector-store.d.ts +16 -16
- package/dist/state/vector-store.js +11 -7
- package/dist/tasks/data-profile-absorb.d.ts +3 -3
- package/dist/tasks/data-profile-absorb.js +21 -16
- package/dist/tasks/data-profile-activity.d.ts +5 -5
- package/dist/tasks/data-profile-activity.js +5 -5
- package/dist/tasks/data-profile-index.d.ts +4 -4
- package/dist/tasks/data-profile-index.js +32 -17
- package/dist/tasks/data-profile-resolve.d.ts +8 -8
- package/dist/tasks/data-profile-resolve.js +88 -62
- package/dist/tasks/data-profile.d.ts +40 -31
- package/dist/tasks/data-profile.js +138 -95
- package/dist/tasks/extract-values.d.ts +26 -79
- package/dist/tasks/extract-values.js +48 -108
- package/dist/tasks/refresh-regulatory-corpus.d.ts +4 -20
- package/dist/tasks/refresh-regulatory-corpus.js +12 -8
- package/dist/tasks/regulatory-corpus-boot-refresh.d.ts +2 -2
- package/dist/tasks/regulatory-corpus-boot-refresh.js +12 -10
- package/dist/testing.d.ts +60 -0
- package/dist/testing.js +96 -0
- package/dist/tools/ad-hoc-router.d.ts +11 -9
- package/dist/tools/ad-hoc-router.js +80 -51
- package/dist/tools/analysis-invocation.d.ts +7 -0
- package/dist/tools/analysis-invocation.js +29 -5
- package/dist/tools/approval/contract.d.ts +8 -52
- package/dist/tools/approval/contract.js +7 -36
- package/dist/tools/approval/gateway.d.ts +27 -28
- package/dist/tools/approval/gateway.js +33 -130
- package/dist/tools/approval/queries.d.ts +6 -11
- package/dist/tools/approval/queries.js +43 -29
- package/dist/tools/approval/uuidv7.js +2 -2
- package/dist/tools/bio/chembl.d.ts +3 -3
- package/dist/tools/bio/chembl.js +10 -0
- package/dist/tools/bio/comptox.d.ts +25 -8
- package/dist/tools/bio/comptox.js +4 -2
- package/dist/tools/bio/drug-gene-interactions.d.ts +27 -17
- package/dist/tools/bio/drug-gene-interactions.js +11 -8
- package/dist/tools/bio/gene-disease-evidence.d.ts +61 -15
- package/dist/tools/bio/gene-disease-evidence.js +10 -6
- package/dist/tools/bio/gene-preclinical-profile.d.ts +11 -11
- package/dist/tools/bio/keys.d.ts +2 -2
- package/dist/tools/bio/keys.js +3 -3
- package/dist/tools/bio/lookup-annotation.d.ts +5 -5
- package/dist/tools/bio/lookup-annotation.js +3 -0
- package/dist/tools/bio/opentargets.d.ts +1 -1
- package/dist/tools/bio/opentargets.js +6 -0
- package/dist/tools/bio/pubchem.d.ts +2 -2
- package/dist/tools/bio/pubchem.js +6 -0
- package/dist/tools/bio/pubmed.d.ts +26 -16
- package/dist/tools/bio/pubmed.js +9 -3
- package/dist/tools/bio/search-clinical-trials.d.ts +4 -4
- package/dist/tools/bio/search-clinical-trials.js +5 -1
- package/dist/tools/bio/search-faers.d.ts +2 -2
- package/dist/tools/bio/search-faers.js +1 -1
- package/dist/tools/bio/search-gene.d.ts +2 -2
- package/dist/tools/bio/search-gene.js +1 -0
- package/dist/tools/bio/search-geo-datasets.d.ts +4 -4
- package/dist/tools/bio/search-geo-datasets.js +5 -5
- package/dist/tools/bio/search-interactions.d.ts +1 -1
- package/dist/tools/bio/search-patents.d.ts +28 -22
- package/dist/tools/bio/search-patents.js +20 -17
- package/dist/tools/bio/search-protein.d.ts +2 -2
- package/dist/tools/bio/search-protein.js +1 -1
- package/dist/tools/bio/search-regulatory-approvals.d.ts +64 -18
- package/dist/tools/bio/search-regulatory-approvals.js +21 -16
- package/dist/tools/bio/target-safety.d.ts +8 -8
- package/dist/tools/bio/target-safety.js +11 -6
- package/dist/tools/capability-data.d.ts +40 -0
- package/dist/tools/capability-data.js +74 -0
- package/dist/tools/define-tool.d.ts +55 -46
- package/dist/tools/define-tool.js +39 -27
- package/dist/tools/display/normalize-echart-spec.d.ts +2 -2
- package/dist/tools/display/normalize-echart-spec.js +51 -27
- package/dist/tools/display/show-user.d.ts +2 -2
- package/dist/tools/display/show-user.js +1 -1
- package/dist/tools/execute-analysis.d.ts +54 -17
- package/dist/tools/execute-analysis.js +193 -62
- package/dist/tools/knowledge/check.d.ts +182 -0
- package/dist/tools/knowledge/check.js +94 -0
- package/dist/tools/knowledge/client.d.ts +351 -0
- package/dist/tools/knowledge/client.js +319 -0
- package/dist/tools/knowledge/environment.d.ts +78 -0
- package/dist/tools/knowledge/environment.js +116 -0
- package/dist/tools/knowledge/index.d.ts +49 -0
- package/dist/tools/knowledge/index.js +70 -0
- package/dist/tools/knowledge/local-slots.d.ts +62 -0
- package/dist/tools/knowledge/local-slots.js +184 -0
- package/dist/tools/knowledge/pin.d.ts +14 -0
- package/dist/tools/knowledge/pin.js +17 -0
- package/dist/tools/knowledge/recommend.d.ts +67 -0
- package/dist/tools/knowledge/recommend.js +106 -0
- package/dist/tools/knowledge/situation.d.ts +143 -0
- package/dist/tools/knowledge/situation.js +157 -0
- package/dist/tools/knowledge/skeleton.d.ts +69 -0
- package/dist/tools/knowledge/skeleton.js +201 -0
- package/dist/tools/knowledge/template.d.ts +139 -0
- package/dist/tools/knowledge/template.js +273 -0
- package/dist/tools/lib/alphafold-client.js +2 -1
- package/dist/tools/lib/amass-client.d.ts +28 -28
- package/dist/tools/lib/amass-client.js +20 -10
- package/dist/tools/lib/api-utils.d.ts +13 -3
- package/dist/tools/lib/api-utils.js +17 -3
- package/dist/tools/lib/bgee-client.d.ts +6 -6
- package/dist/tools/lib/bgee-client.js +16 -10
- package/dist/tools/lib/cbioportal-client.d.ts +4 -4
- package/dist/tools/lib/cbioportal-client.js +9 -8
- package/dist/tools/lib/chembl-client.d.ts +14 -14
- package/dist/tools/lib/chembl-client.js +11 -4
- package/dist/tools/lib/clinical-benchmarks-client.d.ts +4 -4
- package/dist/tools/lib/clinical-benchmarks-client.js +4 -7
- package/dist/tools/lib/clinical-trials-client.d.ts +18 -18
- package/dist/tools/lib/clinical-trials-client.js +10 -10
- package/dist/tools/lib/clinvar-client.d.ts +2 -2
- package/dist/tools/lib/clinvar-client.js +6 -6
- package/dist/tools/lib/ctx-ops.d.ts +23 -23
- package/dist/tools/lib/ctx-ops.js +13 -10
- package/dist/tools/lib/dgidb-client.d.ts +6 -6
- package/dist/tools/lib/dgidb-client.js +10 -12
- package/dist/tools/lib/disgenet-client.d.ts +4 -4
- package/dist/tools/lib/ema-client.d.ts +2 -2
- package/dist/tools/lib/ensembl-client.d.ts +4 -4
- package/dist/tools/lib/ensembl-client.js +5 -4
- package/dist/tools/lib/gwas-catalog-client.d.ts +4 -4
- package/dist/tools/lib/gwas-catalog-client.js +17 -17
- package/dist/tools/lib/html-text.d.ts +6 -0
- package/dist/tools/lib/html-text.js +9 -0
- package/dist/tools/lib/identifier-resolver.d.ts +4 -4
- package/dist/tools/lib/identifier-resolver.js +7 -3
- package/dist/tools/lib/impc-client.d.ts +8 -8
- package/dist/tools/lib/impc-client.js +46 -35
- package/dist/tools/lib/iuphar-client.d.ts +2 -2
- package/dist/tools/lib/iuphar-client.js +7 -16
- package/dist/tools/lib/monarch-client.d.ts +4 -4
- package/dist/tools/lib/openfda-client.d.ts +22 -22
- package/dist/tools/lib/openfda-client.js +23 -22
- package/dist/tools/lib/opentargets-client.d.ts +12 -12
- package/dist/tools/lib/pathway-client.d.ts +4 -4
- package/dist/tools/lib/pathway-client.js +15 -19
- package/dist/tools/lib/pharmgkb-client.d.ts +2 -2
- package/dist/tools/lib/pharmgkb-client.js +1 -1
- package/dist/tools/lib/protein-family-modality.d.ts +2 -2
- package/dist/tools/lib/protein-family-modality.js +0 -2
- package/dist/tools/lib/protein-family-normalize.js +7 -0
- package/dist/tools/lib/pubchem-client.d.ts +2 -2
- package/dist/tools/lib/pubchem-client.js +1 -0
- package/dist/tools/lib/pubchem-ops.d.ts +4 -4
- package/dist/tools/lib/pubchem-ops.js +8 -0
- package/dist/tools/lib/pubmed-client.d.ts +9 -9
- package/dist/tools/lib/pubmed-client.js +1 -1
- package/dist/tools/lib/string-client.d.ts +6 -6
- package/dist/tools/lib/uniprot-client.d.ts +8 -8
- package/dist/tools/lib/uniprot-client.js +5 -1
- package/dist/tools/memory/update-working-memory.d.ts +16 -13
- package/dist/tools/memory/update-working-memory.js +21 -3
- package/dist/tools/read-tool-output.js +8 -2
- package/dist/tools/registry.d.ts +2 -2
- package/dist/tools/report-authoring/authoring-tools.d.ts +54 -23
- package/dist/tools/report-authoring/authoring-tools.js +128 -62
- package/dist/tools/report-session/derive-table.d.ts +19 -59
- package/dist/tools/report-session/derive-table.js +120 -122
- package/dist/tools/report-session/examine-page.d.ts +6 -6
- package/dist/tools/report-session/examine-page.js +14 -12
- package/dist/tools/report-session/list-artifacts.d.ts +6 -6
- package/dist/tools/report-session/list-artifacts.js +5 -5
- package/dist/tools/report-session/page-faults.d.ts +6 -6
- package/dist/tools/report-session/page-faults.js +3 -1
- package/dist/tools/report-session/preview-report.d.ts +4 -3
- package/dist/tools/report-session/preview-report.js +26 -7
- package/dist/tools/report-session/record-version.d.ts +9 -4
- package/dist/tools/report-session/record-version.js +16 -9
- package/dist/tools/report-session/session-page-publisher.d.ts +6 -6
- package/dist/tools/research/generate-analogy-report.d.ts +14 -7
- package/dist/tools/research/generate-analogy-report.js +80 -76
- package/dist/tools/research/generate-plan.d.ts +39 -16
- package/dist/tools/research/generate-plan.js +565 -338
- package/dist/tools/research/guarded-address.d.ts +20 -0
- package/dist/tools/research/guarded-address.js +149 -0
- package/dist/tools/research/inspect-data-profile.d.ts +27 -20
- package/dist/tools/research/inspect-data-profile.js +26 -25
- package/dist/tools/research/inspect-run.d.ts +54 -27
- package/dist/tools/research/inspect-run.js +50 -40
- package/dist/tools/research/literature-reviewer.d.ts +8 -7
- package/dist/tools/research/literature-reviewer.js +29 -28
- package/dist/tools/research/search-arxiv.d.ts +1 -1
- package/dist/tools/research/search-arxiv.js +1 -1
- package/dist/tools/research/search-github-repos.d.ts +10 -7
- package/dist/tools/research/search-github-repos.js +25 -22
- package/dist/tools/research/search-semantic-scholar.js +1 -1
- package/dist/tools/research/searxng-engine.d.ts +40 -0
- package/dist/tools/research/searxng-engine.js +122 -0
- package/dist/tools/research/web-fetch.d.ts +127 -0
- package/dist/tools/research/web-fetch.js +618 -0
- package/dist/tools/research/web-search.d.ts +84 -0
- package/dist/tools/research/web-search.js +117 -0
- package/dist/tools/sandbox/link-packages.d.ts +11 -7
- package/dist/tools/sandbox/link-packages.js +11 -8
- package/dist/tools/sandbox/list-available-packages.d.ts +24 -12
- package/dist/tools/sandbox/list-available-packages.js +43 -29
- package/dist/tools/sandbox/list-available-refs.d.ts +38 -14
- package/dist/tools/sandbox/list-available-refs.js +119 -37
- package/dist/tools/sandbox/report-blocker.d.ts +30 -37
- package/dist/tools/sandbox/report-blocker.js +22 -68
- package/dist/tools/sandbox/skills.d.ts +16 -12
- package/dist/tools/sandbox/skills.js +16 -12
- package/dist/tools/sandbox/submit-file-metadata.d.ts +12 -9
- package/dist/tools/sandbox/submit-file-metadata.js +18 -21
- package/dist/tools/start-report-session.d.ts +13 -5
- package/dist/tools/start-report-session.js +35 -8
- package/dist/tools/terminal-text.d.ts +14 -0
- package/dist/tools/terminal-text.js +51 -0
- package/dist/tools/workspace/decision-record.d.ts +81 -0
- package/dist/tools/workspace/decision-record.js +127 -0
- package/dist/tools/workspace/edit-file.d.ts +59 -18
- package/dist/tools/workspace/edit-file.js +98 -15
- package/dist/tools/workspace/execute-command.d.ts +31 -12
- package/dist/tools/workspace/execute-command.js +37 -8
- package/dist/tools/workspace/file-stat.d.ts +6 -3
- package/dist/tools/workspace/grep.d.ts +10 -7
- package/dist/tools/workspace/grep.js +9 -3
- package/dist/tools/workspace/index.d.ts +1 -0
- package/dist/tools/workspace/index.js +1 -0
- package/dist/tools/workspace/list-files.d.ts +6 -3
- package/dist/tools/workspace/mutator.d.ts +28 -15
- package/dist/tools/workspace/mutator.js +107 -53
- package/dist/tools/workspace/read-file.d.ts +8 -5
- package/dist/tools/workspace/result-bounds.d.ts +5 -5
- package/dist/tools/workspace/result-bounds.js +4 -2
- package/dist/tools/workspace/run-exec.d.ts +2 -2
- package/dist/tools/workspace/run-exec.js +3 -3
- package/dist/tools/workspace/scan-inputs.d.ts +8 -5
- package/dist/tools/workspace/scan-inputs.js +17 -5
- package/dist/tools/workspace/show-file.d.ts +1 -1
- package/dist/tools/workspace/show-file.js +2 -1
- package/dist/tools/workspace/show-plan.d.ts +8 -5
- package/dist/tools/workspace/show-plan.js +9 -8
- package/dist/tools/workspace/workspace-search.d.ts +41 -13
- package/dist/tools/workspace/workspace-search.js +27 -14
- package/dist/tools/workspace/write-file.d.ts +9 -7
- package/dist/workflows/execute-analysis-scheduler.d.ts +9 -9
- package/dist/workflows/execute-analysis-scheduler.js +6 -3
- package/dist/workflows/execute-analysis.d.ts +100 -76
- package/dist/workflows/execute-analysis.js +380 -247
- package/dist/workflows/pause.d.ts +71 -0
- package/dist/workflows/pause.js +173 -0
- package/dist/workflows/sandbox-step.d.ts +50 -61
- package/dist/workflows/sandbox-step.js +99 -106
- package/dist/workflows/test/sql-writes.d.ts +21 -0
- package/dist/workflows/test/sql-writes.js +36 -0
- package/dist/workspace/filesystem.d.ts +6 -6
- package/dist/workspace/filesystem.js +10 -8
- package/dist/workspace/paths.d.ts +1 -1
- package/dist/workspace/paths.js +15 -4
- package/dist/workspace/search-config.d.ts +2 -2
- package/dist/workspace/search-config.js +1 -1
- package/package.json +25 -22
- package/dist/loop/continue-agent.d.ts +0 -40
- package/dist/loop/continue-agent.js +0 -38
- package/dist/loop/genai-spans.d.ts +0 -47
- package/dist/loop/genai-spans.js +0 -134
- package/dist/loop/run-agent.d.ts +0 -236
- package/dist/loop/run-agent.js +0 -1110
- package/dist/loop/run-step.d.ts +0 -29
- package/dist/loop/run-step.js +0 -34
- package/dist/loop/run-to-terminal.d.ts +0 -66
- package/dist/loop/run-to-terminal.js +0 -90
- package/dist/loop/tool-mask.d.ts +0 -23
- package/dist/loop/tool-mask.js +0 -46
- package/dist/providers/streaming-chat.d.ts +0 -32
- package/dist/providers/streaming-chat.js +0 -91
- package/dist/tasks/derive-table-exec.d.ts +0 -54
- package/dist/tasks/derive-table-exec.js +0 -86
- package/dist/workflows/suspension.d.ts +0 -32
- package/dist/workflows/suspension.js +0 -38
|
@@ -3,24 +3,30 @@
|
|
|
3
3
|
* hoc analyses. Both modes launch the ordinary executeAnalysis workflow.
|
|
4
4
|
*/
|
|
5
5
|
import { randomUUID } from "node:crypto";
|
|
6
|
-
import { err, ok, ResultAsync } from "neverthrow";
|
|
6
|
+
import { err, ok, okAsync, ResultAsync } from "neverthrow";
|
|
7
|
+
import { errorNameOf } from "../lib/thrown.js";
|
|
7
8
|
import { z } from "zod";
|
|
9
|
+
import { capabilityDataRequirement } from "../agents/sandbox-catalog.js";
|
|
8
10
|
import { SANDBOX_AGENT_META } from "../agents/sandbox/index.js";
|
|
9
11
|
import { DEFAULT_SANDBOX_MAX_STEPS } from "../config/resource-limits.js";
|
|
10
12
|
import { createNoopLogger } from "../lib/console-logger.js";
|
|
13
|
+
import { readInstalledDatasetIds } from "./sandbox/list-available-refs.js";
|
|
14
|
+
import { tryQuery, withTransaction } from "../lib/db-result.js";
|
|
11
15
|
import { deliverNotice, passGate } from "../lib/hooks.js";
|
|
12
16
|
import { unwrapOrThrow } from "../lib/result.js";
|
|
13
17
|
import { buildRunCardData } from "../memory/card-builders.js";
|
|
14
18
|
import { formatQuery, parseQuery } from "../sandbox/package-identity.js";
|
|
15
19
|
import { AnalysisPlanSchema } from "../schemas/workflow-state.js";
|
|
16
20
|
import { validatePlan } from "../schemas/validate-plan.js";
|
|
17
|
-
import { RunDedupCollisionError, insertRun, loadPlan, queryActiveRun,
|
|
21
|
+
import { RunDedupCollisionError, insertRun, loadPlan, queryActiveRun, queryNewestPlanRun, queryRun, reserveRunById, updateRunStatus, upsertPlan, } from "../state/index.js";
|
|
18
22
|
import { routeAdHocRequest } from "./ad-hoc-router.js";
|
|
19
|
-
import { adHocPlanId, adHocRunId } from "./analysis-invocation.js";
|
|
23
|
+
import { adHocPlanId, adHocRunId, callRunId, durableCallKey } from "./analysis-invocation.js";
|
|
20
24
|
import { defineTool } from "./define-tool.js";
|
|
21
25
|
import { queryPackages, readInventorySections } from "./sandbox/list-available-packages.js";
|
|
22
26
|
import { callExtendAnalysisFarm } from "./sandbox/link-packages.js";
|
|
23
|
-
|
|
27
|
+
import { PLAN_ID_RE } from "../contracts/schemas/chat-parts.js";
|
|
28
|
+
import { collapseWhitespace } from "../lib/text.js";
|
|
29
|
+
const planIdSchema = z.string().regex(PLAN_ID_RE, "planId must be a pln-<8hex> value");
|
|
24
30
|
const inputSchema = z
|
|
25
31
|
.object({
|
|
26
32
|
mode: z
|
|
@@ -64,7 +70,7 @@ export class PlanValidationError extends Error {
|
|
|
64
70
|
}
|
|
65
71
|
}
|
|
66
72
|
function isDedupCollision(err) {
|
|
67
|
-
return err instanceof RunDedupCollisionError || (err
|
|
73
|
+
return err instanceof RunDedupCollisionError || errorNameOf(err) === "RunDedupCollisionError";
|
|
68
74
|
}
|
|
69
75
|
/**
|
|
70
76
|
* A pool miss at the pre-launch link pass. The message names the missing
|
|
@@ -92,6 +98,66 @@ export class PlanPackagesMissingError extends Error {
|
|
|
92
98
|
this.name = "PlanPackagesMissingError";
|
|
93
99
|
}
|
|
94
100
|
}
|
|
101
|
+
/**
|
|
102
|
+
* A declared dataset that the reference store does not hold, found at the pre-launch pass. The
|
|
103
|
+
* message names the datasets and no remedy command — the remedy belongs to the embedder, and its
|
|
104
|
+
* wrapper appends it.
|
|
105
|
+
*/
|
|
106
|
+
export class PlanReferencesMissingError extends Error {
|
|
107
|
+
missing;
|
|
108
|
+
unavailable;
|
|
109
|
+
constructor(missing, unavailable) {
|
|
110
|
+
const parts = [
|
|
111
|
+
// The store-level reason FIRST, for the same reason the package error leads with it:
|
|
112
|
+
// with an unanswerable store, no per-dataset claim below it is trustworthy.
|
|
113
|
+
unavailable !== undefined
|
|
114
|
+
? `the store cannot answer (${unavailable}) — this says nothing about the datasets themselves, so do not re-request them`
|
|
115
|
+
: null,
|
|
116
|
+
missing.length > 0 ? `the store does not hold: ${missing.join(", ")}` : null,
|
|
117
|
+
].filter((part) => part !== null);
|
|
118
|
+
super(`The reference data of this plan is not installed — ${parts.join(" ")}`);
|
|
119
|
+
this.missing = missing;
|
|
120
|
+
this.unavailable = unavailable;
|
|
121
|
+
this.name = "PlanReferencesMissingError";
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Resolve the reference data that the capabilities of a plan declare, before the run reserves
|
|
126
|
+
* anything. A step names its capability, the agent of the step holds the declaration, and the
|
|
127
|
+
* declaration names catalog ids. An absent dataset refuses the launch with the ids named.
|
|
128
|
+
*
|
|
129
|
+
* Nothing is read when no step declares a requirement: the common plan touches no store at all.
|
|
130
|
+
*
|
|
131
|
+
* @returns How many datasets reached the store. Zero says that nothing was checked — a plan that
|
|
132
|
+
* declares none, or a store the embedder bound nowhere — which a launch record must be able to tell
|
|
133
|
+
* from a checked launch.
|
|
134
|
+
*/
|
|
135
|
+
async function resolvePlanReferences(refStorePath, plan) {
|
|
136
|
+
const declared = new Set();
|
|
137
|
+
for (const step of plan.steps) {
|
|
138
|
+
if (!step.agent || !step.capability)
|
|
139
|
+
continue;
|
|
140
|
+
for (const dataset of capabilityDataRequirement(step.agent, step.capability))
|
|
141
|
+
declared.add(dataset);
|
|
142
|
+
}
|
|
143
|
+
if (declared.size === 0)
|
|
144
|
+
return ok(0);
|
|
145
|
+
// An unbound store is an embedder that provisions reference data some other way, exactly as an
|
|
146
|
+
// unbound farm seam leaves the package pass at once. Reading the container path here instead
|
|
147
|
+
// would fail on every host and refuse every launch that declares a capability.
|
|
148
|
+
if (refStorePath === undefined)
|
|
149
|
+
return ok(0);
|
|
150
|
+
const installed = await readInstalledDatasetIds({ refStorePath });
|
|
151
|
+
if (installed === undefined) {
|
|
152
|
+
// The path is named, because the reason is a fault of the environment and the reader has to
|
|
153
|
+
// know WHICH store did not answer. A bare "could not be read" sends a caller round in circles.
|
|
154
|
+
return err({ type: "references_missing", missing: [], unavailable: `the reference store at ${refStorePath} could not be read` });
|
|
155
|
+
}
|
|
156
|
+
const missing = [...declared].filter((dataset) => !installed.has(dataset)).sort();
|
|
157
|
+
if (missing.length > 0)
|
|
158
|
+
return err({ type: "references_missing", missing });
|
|
159
|
+
return ok(declared.size);
|
|
160
|
+
}
|
|
95
161
|
/**
|
|
96
162
|
* Link the packages of the plan into the farm of the analysis, before the
|
|
97
163
|
* run reserves anything. The linked set is the union of the queries of each
|
|
@@ -166,7 +232,7 @@ async function linkPlanPackages(extendAnalysisFarm, analysisId, planId, plan) {
|
|
|
166
232
|
const collisions = outcomes
|
|
167
233
|
.filter((o) => o.kind === "collision")
|
|
168
234
|
.map((o) => `${o.spelling} — two store directories claim it, ${o.storeDirs[0]} and ${o.storeDirs[1]}` +
|
|
169
|
-
|
|
235
|
+
(o.detail === undefined ? "" : ` (${o.detail})`) +
|
|
170
236
|
`; when the two directories are one spelling in two tracks, name the track in the plan, as ` +
|
|
171
237
|
`${formatQuery({ spelling: o.spelling, track: "python" })} or ${formatQuery({ spelling: o.spelling, track: "r" })}`);
|
|
172
238
|
if (missing.length > 0 || collisions.length > 0) {
|
|
@@ -202,14 +268,13 @@ function workflowInput(planId, plan, args) {
|
|
|
202
268
|
planId,
|
|
203
269
|
planSummary: planSummary(plan),
|
|
204
270
|
threadId: args.threadId,
|
|
205
|
-
steps: plan.steps.map((step) => ({ id: step.id, depends_on: step.depends_on
|
|
271
|
+
steps: plan.steps.map((step) => ({ id: step.id, depends_on: step.depends_on })),
|
|
206
272
|
planStepById: Object.fromEntries(plan.steps.map((step) => [step.id, step])),
|
|
207
273
|
agentByStepId: Object.fromEntries(plan.steps.map((step) => [step.id, step.agent ?? "unknown"])),
|
|
208
274
|
resourcesByStepId: args.resourcesByStepId,
|
|
209
|
-
timeoutByStepId: Object.fromEntries(plan.steps.
|
|
275
|
+
timeoutByStepId: Object.fromEntries(plan.steps.flatMap((step) => (step.timeout === undefined ? [] : [[step.id, step.timeout]]))),
|
|
210
276
|
budget: args.budget,
|
|
211
277
|
runSession: args.runSession,
|
|
212
|
-
ownsMandate: args.ownsMandate,
|
|
213
278
|
synthesisEnabled: args.synthesisEnabled,
|
|
214
279
|
};
|
|
215
280
|
}
|
|
@@ -226,11 +291,11 @@ function parseStoredPlan(raw, planId) {
|
|
|
226
291
|
function validateStoredPlan(raw, planId) {
|
|
227
292
|
const parsed = parseStoredPlan(raw, planId);
|
|
228
293
|
if (parsed.isErr())
|
|
229
|
-
return throwLaunchRefusal(parsed.error);
|
|
294
|
+
return throwLaunchRefusal(parsed.error, planId);
|
|
230
295
|
return parsed.value;
|
|
231
296
|
}
|
|
232
297
|
function adHocTitle(request) {
|
|
233
|
-
const compact = request
|
|
298
|
+
const compact = collapseWhitespace(request);
|
|
234
299
|
return compact.length <= 80 ? compact : `${compact.slice(0, 77)}…`;
|
|
235
300
|
}
|
|
236
301
|
/** How a dropped entry reads to the step agent, in the terms of its own reason. */
|
|
@@ -286,6 +351,7 @@ export function buildAdHocPlan(request, route, createdAt = new Date().toISOStrin
|
|
|
286
351
|
status: "pending",
|
|
287
352
|
resources: route.resources,
|
|
288
353
|
agent: route.agentId,
|
|
354
|
+
capability: route.capability,
|
|
289
355
|
maxSteps: meta?.defaultMaxSteps ?? DEFAULT_SANDBOX_MAX_STEPS,
|
|
290
356
|
},
|
|
291
357
|
],
|
|
@@ -305,9 +371,9 @@ function adHocPackageResolver(deps, analysisId) {
|
|
|
305
371
|
if (!deps.farmLockFile && !deps.imagePackagesFile && !deps.readPoolInventory)
|
|
306
372
|
return undefined;
|
|
307
373
|
const inventory = {
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
374
|
+
farmLockFile: deps.farmLockFile,
|
|
375
|
+
imagePackagesFile: deps.imagePackagesFile,
|
|
376
|
+
readPoolInventory: deps.readPoolInventory,
|
|
311
377
|
};
|
|
312
378
|
return async (names) => {
|
|
313
379
|
const read = await readInventorySections(inventory, analysisId);
|
|
@@ -330,14 +396,14 @@ async function persistedAdHocPlan(deps, args) {
|
|
|
330
396
|
pool: deps.pool,
|
|
331
397
|
resourcePolicy: deps.resourcePolicy,
|
|
332
398
|
logger: deps.logger,
|
|
333
|
-
|
|
334
|
-
|
|
399
|
+
resolvePackages,
|
|
400
|
+
usageRecorder: deps.usageRecorder,
|
|
335
401
|
}, {
|
|
336
402
|
analysisId: args.analysisId,
|
|
337
403
|
request: args.request,
|
|
338
404
|
session: args.ctx.session,
|
|
339
405
|
signal: args.ctx.signal,
|
|
340
|
-
|
|
406
|
+
turnUsage: args.ctx.turnUsage,
|
|
341
407
|
invocationId: args.ctx.invocationId,
|
|
342
408
|
});
|
|
343
409
|
const candidate = buildAdHocPlan(args.request, route);
|
|
@@ -350,6 +416,10 @@ async function persistedAdHocPlan(deps, args) {
|
|
|
350
416
|
/**
|
|
351
417
|
* The half of a launch that the plan mode and the ad hoc mode share: the link pass, the reservation,
|
|
352
418
|
* the authorization, and the workflow start. It gives each outcome as a `Result`.
|
|
419
|
+
*
|
|
420
|
+
* A launch of the run of this call always authorizes and starts, also when its row exists. A rerun of
|
|
421
|
+
* the call can come after the reservation and before the start, and the launcher starts one workflow for
|
|
422
|
+
* each run id. A rerun after the start mints a second mandate that no run uses.
|
|
353
423
|
*/
|
|
354
424
|
async function launchReservedRun(deps, args) {
|
|
355
425
|
const logger = (deps.logger ?? createNoopLogger()).named("execute-analysis-tool");
|
|
@@ -359,6 +429,12 @@ async function launchReservedRun(deps, args) {
|
|
|
359
429
|
const resources = stepResources(planId, plan);
|
|
360
430
|
if (resources.isErr())
|
|
361
431
|
return err(resources.error);
|
|
432
|
+
// Reference data first: it is a read, so it costs nothing to learn before the farm link
|
|
433
|
+
// writes. Both passes come before the run reserves anything, thus a miss of either leaves no
|
|
434
|
+
// run row and no revoked authorization behind.
|
|
435
|
+
const references = await resolvePlanReferences(deps.refStorePath, plan);
|
|
436
|
+
if (references.isErr())
|
|
437
|
+
return err(references.error);
|
|
362
438
|
// The link pass comes before the run reserves anything, thus a pool
|
|
363
439
|
// miss leaves no run row and no revoked authorization behind.
|
|
364
440
|
const linked = await linkPlanPackages(deps.extendAnalysisFarm, analysisId, planId, plan);
|
|
@@ -368,9 +444,10 @@ async function launchReservedRun(deps, args) {
|
|
|
368
444
|
const reservation = await args.reserve({ analysisId, threadId });
|
|
369
445
|
if (reservation.isErr())
|
|
370
446
|
return err(reservation.error);
|
|
371
|
-
|
|
447
|
+
// A different run holds the slot of the plan, or the view of the caller is stale: this call starts nothing.
|
|
448
|
+
if (reservation.value.runId !== args.runId)
|
|
372
449
|
return reservation;
|
|
373
|
-
const runId =
|
|
450
|
+
const runId = args.runId;
|
|
374
451
|
const authorized = await passGate("RunAuthorizer.authorize", deps.runAuthorizer.authorize({
|
|
375
452
|
auth: session.auth,
|
|
376
453
|
scope: session.scope,
|
|
@@ -378,25 +455,17 @@ async function launchReservedRun(deps, args) {
|
|
|
378
455
|
frame: { runId },
|
|
379
456
|
}));
|
|
380
457
|
if (authorized.isErr()) {
|
|
381
|
-
// The refusal ends the run before a workflow exists, thus the
|
|
382
|
-
//
|
|
458
|
+
// The refusal ends the run before a workflow exists, thus the reserved row must not stay `running`. No work
|
|
459
|
+
// exists yet, thus a refusal with the suspend flag does not pause, and it marks no analysis.
|
|
383
460
|
const { kind, reason } = authorized.error;
|
|
384
|
-
if (kind === "suspended") {
|
|
385
|
-
await updateRunStatus(deps.pool, runId, "suspended_insufficient_funds", reason).match(() => { }, () => { });
|
|
386
|
-
const suspension = await suspendAnalysis(deps.pool, analysisId);
|
|
387
|
-
if (suspension.isErr())
|
|
388
|
-
return err({ type: "store_failed", cause: suspension.error });
|
|
389
|
-
return err({ type: "suspended", reason });
|
|
390
|
-
}
|
|
391
461
|
await updateRunStatus(deps.pool, runId, "failed", reason).match(() => { }, () => { });
|
|
392
|
-
return err({ type: "not_authorized", reason });
|
|
462
|
+
return err(kind === "suspended" ? { type: "suspended", reason } : { type: "not_authorized", reason });
|
|
393
463
|
}
|
|
394
|
-
const
|
|
464
|
+
const runSession = authorized.value;
|
|
395
465
|
const wfInput = workflowInput(planId, plan, {
|
|
396
466
|
analysisId,
|
|
397
467
|
threadId,
|
|
398
|
-
runSession
|
|
399
|
-
ownsMandate: authorization.ownsMandate,
|
|
468
|
+
runSession,
|
|
400
469
|
budget: deps.resourcePolicy?.budget,
|
|
401
470
|
synthesisEnabled: args.mode === "plan",
|
|
402
471
|
resourcesByStepId: resources.value,
|
|
@@ -405,7 +474,7 @@ async function launchReservedRun(deps, args) {
|
|
|
405
474
|
await deps.runLauncher.launch(deps.executeAnalysisWorkflow, { workflowId: runId }, wfInput);
|
|
406
475
|
}
|
|
407
476
|
catch (cause) {
|
|
408
|
-
await deliverNotice(logger, "RunAuthorizer.revoke", deps.runAuthorizer.revoke(
|
|
477
|
+
await deliverNotice(logger, "RunAuthorizer.revoke", deps.runAuthorizer.revoke(runSession, "workflow-start-failed"));
|
|
409
478
|
// A failed write leaves the row `running` with no workflow. The boot repair (`reconcileOrphanedRuns`) fails it.
|
|
410
479
|
await updateRunStatus(deps.pool, runId, "failed", "workflow start failed").match(() => { }, (error) => logger.warn("the failed status of a run whose start failed was not written", { runId, ...logger.errorFields(error) }));
|
|
411
480
|
return err({ type: "launch_failed", cause });
|
|
@@ -413,26 +482,57 @@ async function launchReservedRun(deps, args) {
|
|
|
413
482
|
logger.info("analysis launched", { analysisId, runId, planId, mode: args.mode, packageQueries });
|
|
414
483
|
return ok({ runId, started: true });
|
|
415
484
|
}
|
|
485
|
+
function staleViewOf(newest, seen) {
|
|
486
|
+
if (newest !== null)
|
|
487
|
+
return newest === seen ? null : { type: "newer", runId: newest };
|
|
488
|
+
return seen === null ? null : { type: "missing", runId: seen };
|
|
489
|
+
}
|
|
490
|
+
/** A stale view starts nothing: it gives the newest run with `started: false`, or `run_not_found` when the plan has no run. */
|
|
491
|
+
function refuseStaleView(view) {
|
|
492
|
+
return view.type === "newer" ? ok({ runId: view.runId, started: false }) : err({ type: "run_not_found", runId: view.runId });
|
|
493
|
+
}
|
|
494
|
+
function lockPlanLaunch(client, planId) {
|
|
495
|
+
return tryQuery("execute-analysis.lockPlanLaunch", () => client.query("SELECT pg_advisory_xact_lock(hashtext($1))", [`plan-launch:${planId}`])).map(() => undefined);
|
|
496
|
+
}
|
|
416
497
|
/**
|
|
417
|
-
* Reserve
|
|
418
|
-
*
|
|
498
|
+
* Reserve the run `runId` for a plan under the lock of the plan, thus the reservations of one plan occur
|
|
499
|
+
* one after the other. A row of `runId` that exists is the reservation of a first attempt of the same
|
|
500
|
+
* call. A caller with a `newestRunId` reserves nothing when the newest run of the plan is a different run.
|
|
501
|
+
* The new row starts after the newest start, thus it is the newest run of the plan. A concurrent launch of
|
|
502
|
+
* the same plan can hold the active-plan slot, and its run is the answer.
|
|
419
503
|
*/
|
|
420
504
|
async function reservePlanRun(deps, args) {
|
|
421
|
-
const runId =
|
|
505
|
+
const { runId } = args;
|
|
422
506
|
try {
|
|
423
|
-
const
|
|
424
|
-
runId
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
planId: args.planId
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
507
|
+
const reserved = await withTransaction(deps.pool, "execute-analysis.reservePlanRun", (client) => lockPlanLaunch(client, args.planId)
|
|
508
|
+
.andThen(() => queryRun(client, runId))
|
|
509
|
+
.andThen((own) => {
|
|
510
|
+
if (own !== null)
|
|
511
|
+
return okAsync({ type: "reserved" });
|
|
512
|
+
return queryNewestPlanRun(client, { analysisId: args.analysisId, planId: args.planId }).andThen((newest) => {
|
|
513
|
+
const stale = args.newestRunId === undefined ? null : staleViewOf(newest?.runId ?? null, args.newestRunId);
|
|
514
|
+
if (stale)
|
|
515
|
+
return okAsync({ type: "stale", view: stale });
|
|
516
|
+
const startedAt = newest === null ? undefined : new Date(Math.max(Date.now(), Date.parse(newest.startedAt) + 1)).toISOString();
|
|
517
|
+
return insertRun(client, {
|
|
518
|
+
runId,
|
|
519
|
+
analysisId: args.analysisId,
|
|
520
|
+
threadId: args.threadId,
|
|
521
|
+
workflowName: "executeAnalysis",
|
|
522
|
+
planId: args.planId,
|
|
523
|
+
startedAt,
|
|
524
|
+
}).map(() => ({ type: "reserved" }));
|
|
525
|
+
});
|
|
526
|
+
}));
|
|
527
|
+
if (reserved.isErr())
|
|
528
|
+
return err({ type: "store_failed", cause: reserved.error });
|
|
529
|
+
if (reserved.value.type === "stale")
|
|
530
|
+
return refuseStaleView(reserved.value.view);
|
|
432
531
|
return ok({ runId, started: true });
|
|
433
532
|
}
|
|
434
533
|
catch (cause) {
|
|
435
|
-
// `insertRun` rejects its promise on a collision of the active-plan index, and on nothing else.
|
|
534
|
+
// `insertRun` rejects its promise on a collision of the active-plan index, and on nothing else. The
|
|
535
|
+
// transaction is rolled back and released by now, so the read goes to the pool.
|
|
436
536
|
if (!isDedupCollision(cause))
|
|
437
537
|
return err({ type: "store_failed", cause });
|
|
438
538
|
const active = await queryActiveRun(deps.pool, args.analysisId, args.planId);
|
|
@@ -467,8 +567,9 @@ async function reserveAdHocRun(deps, args) {
|
|
|
467
567
|
}
|
|
468
568
|
}
|
|
469
569
|
async function launchStoredPlan(deps, input) {
|
|
470
|
-
const { session, planId } = input;
|
|
570
|
+
const { session, planId, newestRunId } = input;
|
|
471
571
|
const analysisId = session.scope.analysisId;
|
|
572
|
+
const runId = input.runId ?? randomUUID();
|
|
472
573
|
const raw = await loadPlan(deps.pool, planId, { analysisId });
|
|
473
574
|
if (raw.isErr())
|
|
474
575
|
return err({ type: "store_failed", cause: raw.error });
|
|
@@ -477,23 +578,40 @@ async function launchStoredPlan(deps, input) {
|
|
|
477
578
|
const plan = parseStoredPlan(raw.value, planId);
|
|
478
579
|
if (plan.isErr())
|
|
479
580
|
return err(plan.error);
|
|
581
|
+
if (newestRunId !== undefined) {
|
|
582
|
+
const newest = await queryNewestPlanRun(deps.pool, { analysisId, planId });
|
|
583
|
+
if (newest.isErr())
|
|
584
|
+
return err({ type: "store_failed", cause: newest.error });
|
|
585
|
+
const stale = staleViewOf(newest.value?.runId ?? null, newestRunId);
|
|
586
|
+
if (stale)
|
|
587
|
+
return refuseStaleView(stale);
|
|
588
|
+
}
|
|
480
589
|
const active = await queryActiveRun(deps.pool, analysisId, planId);
|
|
481
590
|
if (active.isErr())
|
|
482
591
|
return err({ type: "store_failed", cause: active.error });
|
|
483
|
-
if (active.value)
|
|
484
|
-
|
|
592
|
+
if (active.value && active.value.runId !== runId) {
|
|
593
|
+
// A rerun of a call whose run ended keeps its run, also when a later launch holds the slot.
|
|
594
|
+
const own = await queryRun(deps.pool, runId);
|
|
595
|
+
if (own.isErr())
|
|
596
|
+
return err({ type: "store_failed", cause: own.error });
|
|
597
|
+
if (own.value === null)
|
|
598
|
+
return ok({ runId: active.value.runId, started: false });
|
|
599
|
+
}
|
|
485
600
|
return launchReservedRun(deps, {
|
|
486
601
|
session,
|
|
487
602
|
planId,
|
|
488
603
|
plan: plan.value,
|
|
489
604
|
mode: "plan",
|
|
490
|
-
|
|
605
|
+
runId,
|
|
606
|
+
reserve: (frame) => reservePlanRun(deps, { ...frame, planId, runId, newestRunId }),
|
|
491
607
|
});
|
|
492
608
|
}
|
|
493
609
|
/**
|
|
494
610
|
* Start the run of a stored plan. It reads the plan under the analysis of the session, validates it,
|
|
495
|
-
*
|
|
496
|
-
*
|
|
611
|
+
* compares the newest run of the plan with `newestRunId`, links its packages, reserves a run,
|
|
612
|
+
* authorizes it, and starts the workflow. It gives the run id, or the refusal, and it emits no chat
|
|
613
|
+
* part. `started` is false when this call started nothing: a run of the plan was already active, or the
|
|
614
|
+
* newest run of the plan is not the run that the caller saw. `runId` then names that run.
|
|
497
615
|
*
|
|
498
616
|
* This is an API boundary: a host calls it outside a tool body, thus no outcome above rejects the
|
|
499
617
|
* promise.
|
|
@@ -502,14 +620,18 @@ export function launchPlanRun(deps, input) {
|
|
|
502
620
|
return new ResultAsync(launchStoredPlan(deps, input));
|
|
503
621
|
}
|
|
504
622
|
/** Throw the error that the tool body threw before the launch gave a `Result`. */
|
|
505
|
-
function throwLaunchRefusal(refusal) {
|
|
623
|
+
function throwLaunchRefusal(refusal, planId) {
|
|
506
624
|
switch (refusal.type) {
|
|
625
|
+
case "run_not_found":
|
|
626
|
+
throw new Error(`Plan ${planId} has no run ${refusal.runId}`);
|
|
507
627
|
case "plan_not_found":
|
|
508
628
|
throw new PlanNotFoundError(refusal.planId);
|
|
509
629
|
case "plan_invalid":
|
|
510
630
|
throw refusal.malformed ? new PlanMalformedError(refusal.planId) : new PlanValidationError(refusal.planId, refusal.errors);
|
|
511
631
|
case "packages_missing":
|
|
512
632
|
throw new PlanPackagesMissingError(refusal.missing, refusal.collisions, refusal.unavailable);
|
|
633
|
+
case "references_missing":
|
|
634
|
+
throw new PlanReferencesMissingError(refusal.missing, refusal.unavailable);
|
|
513
635
|
case "store_failed":
|
|
514
636
|
return unwrapOrThrow(err(refusal.cause));
|
|
515
637
|
case "launch_failed":
|
|
@@ -535,20 +657,28 @@ export function createExecuteAnalysisTool(deps) {
|
|
|
535
657
|
// running is a different event from an ad hoc request being routed.
|
|
536
658
|
describeCall: (input) => (input.mode === "plan" ? `plan ${input.planId ?? ""}` : `ad hoc: ${input.request ?? ""}`),
|
|
537
659
|
execute: async (input, ctx) => {
|
|
538
|
-
if (ctx.session.scope.kind !== "analysis")
|
|
539
|
-
throw new Error("execute_analysis requires an analysis-scoped session");
|
|
540
|
-
if (!ctx.session.auth)
|
|
541
|
-
throw new Error("execute_analysis: session is missing its auth capability");
|
|
542
660
|
const analysisId = ctx.session.scope.analysisId;
|
|
543
|
-
|
|
661
|
+
let planId;
|
|
662
|
+
if (input.mode === "plan") {
|
|
663
|
+
if (input.planId === undefined)
|
|
664
|
+
throw new Error("plan mode requires planId");
|
|
665
|
+
planId = input.planId;
|
|
666
|
+
}
|
|
667
|
+
else {
|
|
668
|
+
planId = adHocPlanId(analysisId, ctx.invocationId);
|
|
669
|
+
}
|
|
544
670
|
const emitRunCard = async (runId) => {
|
|
545
671
|
const card = await buildRunCardData(deps.pool, { planId, analysisId, runId }).unwrapOr(null);
|
|
546
672
|
if (card)
|
|
547
673
|
await ctx.emit({ type: "data-run-card", source: ctx.session.provenance, data: card });
|
|
548
674
|
};
|
|
549
675
|
const launch = async () => {
|
|
550
|
-
if (input.mode === "plan")
|
|
551
|
-
|
|
676
|
+
if (input.mode === "plan") {
|
|
677
|
+
const callKey = durableCallKey(ctx.invocationId);
|
|
678
|
+
return launchPlanRun(deps, { session: ctx.session, planId, runId: callKey === undefined ? undefined : callRunId(callKey) });
|
|
679
|
+
}
|
|
680
|
+
if (input.request === undefined)
|
|
681
|
+
throw new Error("adhoc mode requires request");
|
|
552
682
|
const plan = await persistedAdHocPlan(deps, { analysisId, request: input.request, ctx, planId });
|
|
553
683
|
const runId = adHocRunId(analysisId, ctx.invocationId);
|
|
554
684
|
return launchReservedRun(deps, {
|
|
@@ -556,6 +686,7 @@ export function createExecuteAnalysisTool(deps) {
|
|
|
556
686
|
planId,
|
|
557
687
|
plan,
|
|
558
688
|
mode: "adhoc",
|
|
689
|
+
runId,
|
|
559
690
|
reserve: (frame) => reserveAdHocRun(deps, { ...frame, planId, runId }),
|
|
560
691
|
});
|
|
561
692
|
};
|
|
@@ -563,10 +694,10 @@ export function createExecuteAnalysisTool(deps) {
|
|
|
563
694
|
if (launched.isErr()) {
|
|
564
695
|
const refusal = launched.error;
|
|
565
696
|
if (refusal.type === "suspended")
|
|
566
|
-
return err({ error: `The
|
|
697
|
+
return err({ error: `The host refused the run: ${refusal.reason}`, retryable: false });
|
|
567
698
|
if (refusal.type === "not_authorized")
|
|
568
699
|
return err({ error: `The run was not authorized: ${refusal.reason}`, retryable: false });
|
|
569
|
-
return throwLaunchRefusal(refusal);
|
|
700
|
+
return throwLaunchRefusal(refusal, planId);
|
|
570
701
|
}
|
|
571
702
|
await emitRunCard(launched.value.runId);
|
|
572
703
|
return ok({ runId: launched.value.runId, status: "in_progress" });
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `knowledge_check` — the drafted steps against the rules, once, before
|
|
3
|
+
* `submit_plan`. A violation names the rule and the permitted alternatives.
|
|
4
|
+
* The planner revises once. There is no loop: the host counts the calls of
|
|
5
|
+
* one plan generation, and past `CHECK_CALL_LIMIT` the tool answers with a
|
|
6
|
+
* typed refusal and never reaches the service. A small model that cannot
|
|
7
|
+
* satisfy a finding otherwise rephrases the step until the plan times out.
|
|
8
|
+
*/
|
|
9
|
+
import { z } from "zod";
|
|
10
|
+
import { type Tool } from "../define-tool.js";
|
|
11
|
+
import type { CheckResponse, KnowledgeClient, KnowledgeRejected, KnowledgeSnapshotMismatch, KnowledgeUnavailable } from "./client.js";
|
|
12
|
+
import type { SnapshotPin } from "./pin.js";
|
|
13
|
+
export type KnowledgeCheckDeps = {
|
|
14
|
+
readonly client: KnowledgeClient;
|
|
15
|
+
/** The release the plan pinned on its first recommend answer. The check sends it, thus another release refuses the call. */
|
|
16
|
+
readonly pin?: SnapshotPin;
|
|
17
|
+
};
|
|
18
|
+
export type KnowledgeCheckOutput = CheckResponse | KnowledgeUnavailable | KnowledgeRejected | KnowledgeSnapshotMismatch;
|
|
19
|
+
/** The checks one plan generation may run. Two is a draft and one revision; the third is slack. */
|
|
20
|
+
export declare const CHECK_CALL_LIMIT = 3;
|
|
21
|
+
declare const KnowledgeCheckInputSchema: z.ZodObject<{
|
|
22
|
+
question: z.ZodEnum<{
|
|
23
|
+
clustering: "clustering";
|
|
24
|
+
coexpression: "coexpression";
|
|
25
|
+
deconvolution: "deconvolution";
|
|
26
|
+
differential_expression: "differential_expression";
|
|
27
|
+
enrichment: "enrichment";
|
|
28
|
+
full_plan: "full_plan";
|
|
29
|
+
qc: "qc";
|
|
30
|
+
signature_scoring: "signature_scoring";
|
|
31
|
+
survival: "survival";
|
|
32
|
+
tf_activity: "tf_activity";
|
|
33
|
+
}>;
|
|
34
|
+
modality: z.ZodLiteral<"bulk_rna_seq">;
|
|
35
|
+
data_state: z.ZodEnum<{
|
|
36
|
+
counts: "counts";
|
|
37
|
+
fastq: "fastq";
|
|
38
|
+
log_normalized: "log_normalized";
|
|
39
|
+
tpm_or_fpkm: "tpm_or_fpkm";
|
|
40
|
+
}>;
|
|
41
|
+
count_source: z.ZodOptional<z.ZodEnum<{
|
|
42
|
+
kallisto: "kallisto";
|
|
43
|
+
rsem: "rsem";
|
|
44
|
+
salmon: "salmon";
|
|
45
|
+
star_featurecounts: "star_featurecounts";
|
|
46
|
+
unknown: "unknown";
|
|
47
|
+
}>>;
|
|
48
|
+
import_state: z.ZodOptional<z.ZodEnum<{
|
|
49
|
+
corrected_counts: "corrected_counts";
|
|
50
|
+
estimated_counts_with_lengths: "estimated_counts_with_lengths";
|
|
51
|
+
integer_counts: "integer_counts";
|
|
52
|
+
quantifications: "quantifications";
|
|
53
|
+
unknown: "unknown";
|
|
54
|
+
}>>;
|
|
55
|
+
organism: z.ZodEnum<{
|
|
56
|
+
human: "human";
|
|
57
|
+
mouse: "mouse";
|
|
58
|
+
other: "other";
|
|
59
|
+
}>;
|
|
60
|
+
n_groups: z.ZodNumber;
|
|
61
|
+
n_per_group_min: z.ZodNumber;
|
|
62
|
+
n_per_group_max: z.ZodNumber;
|
|
63
|
+
n_samples: z.ZodOptional<z.ZodNumber>;
|
|
64
|
+
n_events: z.ZodOptional<z.ZodNumber>;
|
|
65
|
+
paired: z.ZodBoolean;
|
|
66
|
+
blocking_factor: z.ZodOptional<z.ZodNullable<z.ZodEnum<{
|
|
67
|
+
cell_line: "cell_line";
|
|
68
|
+
individual: "individual";
|
|
69
|
+
litter: "litter";
|
|
70
|
+
other: "other";
|
|
71
|
+
pair: "pair";
|
|
72
|
+
site: "site";
|
|
73
|
+
}>>>;
|
|
74
|
+
block_structure: z.ZodOptional<z.ZodEnum<{
|
|
75
|
+
crossed: "crossed";
|
|
76
|
+
nested: "nested";
|
|
77
|
+
}>>;
|
|
78
|
+
batch: z.ZodEnum<{
|
|
79
|
+
known_balanced: "known_balanced";
|
|
80
|
+
known_confounded: "known_confounded";
|
|
81
|
+
known_unbalanced: "known_unbalanced";
|
|
82
|
+
none: "none";
|
|
83
|
+
suspected: "suspected";
|
|
84
|
+
}>;
|
|
85
|
+
covariates: z.ZodOptional<z.ZodArray<z.ZodEnum<{
|
|
86
|
+
age: "age";
|
|
87
|
+
clinical: "clinical";
|
|
88
|
+
other: "other";
|
|
89
|
+
sex: "sex";
|
|
90
|
+
technical: "technical";
|
|
91
|
+
}>>>;
|
|
92
|
+
n_timepoints: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
|
|
93
|
+
continuous_predictor: z.ZodOptional<z.ZodNullable<z.ZodEnum<{
|
|
94
|
+
age: "age";
|
|
95
|
+
dose: "dose";
|
|
96
|
+
other: "other";
|
|
97
|
+
score: "score";
|
|
98
|
+
time: "time";
|
|
99
|
+
}>>>;
|
|
100
|
+
technical_replicates: z.ZodOptional<z.ZodBoolean>;
|
|
101
|
+
sample_exclusions: z.ZodOptional<z.ZodBoolean>;
|
|
102
|
+
feature_level: z.ZodOptional<z.ZodEnum<{
|
|
103
|
+
exon: "exon";
|
|
104
|
+
gene: "gene";
|
|
105
|
+
transcript: "transcript";
|
|
106
|
+
}>>;
|
|
107
|
+
library_type: z.ZodOptional<z.ZodEnum<{
|
|
108
|
+
polyA: "polyA";
|
|
109
|
+
three_prime: "three_prime";
|
|
110
|
+
total: "total";
|
|
111
|
+
unknown: "unknown";
|
|
112
|
+
}>>;
|
|
113
|
+
strandedness: z.ZodOptional<z.ZodEnum<{
|
|
114
|
+
declared_unverified: "declared_unverified";
|
|
115
|
+
unknown: "unknown";
|
|
116
|
+
verified: "verified";
|
|
117
|
+
}>>;
|
|
118
|
+
interaction: z.ZodOptional<z.ZodBoolean>;
|
|
119
|
+
classifier: z.ZodOptional<z.ZodBoolean>;
|
|
120
|
+
extra_analyses: z.ZodOptional<z.ZodArray<z.ZodEnum<{
|
|
121
|
+
annotation: "annotation";
|
|
122
|
+
clustering: "clustering";
|
|
123
|
+
coexpression: "coexpression";
|
|
124
|
+
deconvolution: "deconvolution";
|
|
125
|
+
pathway_activity: "pathway_activity";
|
|
126
|
+
signature_scoring: "signature_scoring";
|
|
127
|
+
survival: "survival";
|
|
128
|
+
tf_activity: "tf_activity";
|
|
129
|
+
transcript_level: "transcript_level";
|
|
130
|
+
variance_partition: "variance_partition";
|
|
131
|
+
}>>>;
|
|
132
|
+
preferred_language: z.ZodOptional<z.ZodEnum<{
|
|
133
|
+
R: "R";
|
|
134
|
+
python: "python";
|
|
135
|
+
}>>;
|
|
136
|
+
enrichment_input: z.ZodOptional<z.ZodEnum<{
|
|
137
|
+
gene_list: "gene_list";
|
|
138
|
+
ranked_list: "ranked_list";
|
|
139
|
+
sample_scores: "sample_scores";
|
|
140
|
+
}>>;
|
|
141
|
+
quality_flags: z.ZodOptional<z.ZodArray<z.ZodEnum<{
|
|
142
|
+
degraded_rna: "degraded_rna";
|
|
143
|
+
high_duplication: "high_duplication";
|
|
144
|
+
low_depth_sample: "low_depth_sample";
|
|
145
|
+
outlier_sample: "outlier_sample";
|
|
146
|
+
sample_identity_doubt: "sample_identity_doubt";
|
|
147
|
+
}>>>;
|
|
148
|
+
steps: z.ZodArray<z.ZodObject<{
|
|
149
|
+
step_type: z.ZodEnum<{
|
|
150
|
+
annotation: "annotation";
|
|
151
|
+
clustering: "clustering";
|
|
152
|
+
coexpression: "coexpression";
|
|
153
|
+
cohort_assembly: "cohort_assembly";
|
|
154
|
+
deconvolution: "deconvolution";
|
|
155
|
+
differential_expression: "differential_expression";
|
|
156
|
+
enrichment: "enrichment";
|
|
157
|
+
filter_low_counts: "filter_low_counts";
|
|
158
|
+
model_design: "model_design";
|
|
159
|
+
multiple_testing: "multiple_testing";
|
|
160
|
+
normalize: "normalize";
|
|
161
|
+
pathway_activity: "pathway_activity";
|
|
162
|
+
qc_sample_structure: "qc_sample_structure";
|
|
163
|
+
report: "report";
|
|
164
|
+
shrink_lfc: "shrink_lfc";
|
|
165
|
+
signature_scoring: "signature_scoring";
|
|
166
|
+
survival: "survival";
|
|
167
|
+
tf_activity: "tf_activity";
|
|
168
|
+
transcript_level: "transcript_level";
|
|
169
|
+
variance_partition: "variance_partition";
|
|
170
|
+
}>;
|
|
171
|
+
method: z.ZodString;
|
|
172
|
+
method_id: z.ZodOptional<z.ZodString>;
|
|
173
|
+
package: z.ZodOptional<z.ZodString>;
|
|
174
|
+
parameters: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
175
|
+
name: z.ZodString;
|
|
176
|
+
value: z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean]>;
|
|
177
|
+
}, z.core.$strip>>>;
|
|
178
|
+
outcome: z.ZodOptional<z.ZodString>;
|
|
179
|
+
}, z.core.$strip>>;
|
|
180
|
+
}, z.core.$strip>;
|
|
181
|
+
export declare function createKnowledgeCheckTool(deps: KnowledgeCheckDeps): Tool<z.infer<typeof KnowledgeCheckInputSchema>, KnowledgeCheckOutput>;
|
|
182
|
+
export {};
|