@galaxyproject/orbit 0.0.0 → 0.9.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/CHANGELOG.md +123 -0
- package/LICENSE +21 -0
- package/README.md +760 -5
- package/bin/legacy-mcp-config.js +363 -0
- package/bin/orbit.js +810 -0
- package/bin/pi-extension-path.d.ts +4 -0
- package/bin/pi-extension-path.js +44 -0
- package/bin/provider-auth.d.ts +22 -0
- package/bin/provider-auth.js +77 -0
- package/bin/thinking-pref.js +38 -0
- package/bin/update-check.d.ts +15 -0
- package/bin/update-check.js +137 -0
- package/extensions/cli-update/index.ts +32 -0
- package/extensions/orbit/activity-hooks.ts +141 -0
- package/extensions/orbit/activity.ts +116 -0
- package/extensions/orbit/agent-dir.ts +11 -0
- package/extensions/orbit/auto-resume.ts +352 -0
- package/extensions/orbit/config.ts +3 -0
- package/extensions/orbit/confusables.ts +1 -0
- package/extensions/orbit/context.ts +957 -0
- package/extensions/orbit/dashboard-commands.ts +191 -0
- package/extensions/orbit/dashboard-store.ts +473 -0
- package/extensions/orbit/dashboard-tools.ts +1185 -0
- package/extensions/orbit/empty-completion.ts +99 -0
- package/extensions/orbit/evidence-gate.ts +1276 -0
- package/extensions/orbit/evidence-override-command.ts +294 -0
- package/extensions/orbit/exec-guard/bash-risk.ts +1408 -0
- package/extensions/orbit/exec-guard/gate.ts +181 -0
- package/extensions/orbit/exec-guard/guardian-config.ts +54 -0
- package/extensions/orbit/exec-guard/index.ts +1 -0
- package/extensions/orbit/exec-guard/model-tier.ts +36 -0
- package/extensions/orbit/exec-guard/path-jail.ts +54 -0
- package/extensions/orbit/exec-guard/policy.ts +342 -0
- package/extensions/orbit/exec-guard/runtime-state.ts +15 -0
- package/extensions/orbit/exec-guard/sensitive-read.ts +525 -0
- package/extensions/orbit/exec-guard/types.ts +42 -0
- package/extensions/orbit/execution-commands.ts +134 -0
- package/extensions/orbit/feedback-command.ts +81 -0
- package/extensions/orbit/feedback.ts +96 -0
- package/extensions/orbit/galaxy-api.test.ts +122 -0
- package/extensions/orbit/galaxy-api.ts +606 -0
- package/extensions/orbit/galaxy-artifact-link-guidance.ts +5 -0
- package/extensions/orbit/galaxy-destructive-gate.ts +113 -0
- package/extensions/orbit/galaxy-enrich.ts +1108 -0
- package/extensions/orbit/galaxy-failure.ts +101 -0
- package/extensions/orbit/galaxy-fixture.ts +126 -0
- package/extensions/orbit/galaxy-history-guard.ts +233 -0
- package/extensions/orbit/galaxy-job-block.ts +347 -0
- package/extensions/orbit/galaxy-job-ops.ts +288 -0
- package/extensions/orbit/galaxy-live-source.ts +929 -0
- package/extensions/orbit/galaxy-markdown-adapter.ts +248 -0
- package/extensions/orbit/galaxy-op-policy.ts +332 -0
- package/extensions/orbit/galaxy-ops-tools.ts +326 -0
- package/extensions/orbit/galaxy-output-store.ts +80 -0
- package/extensions/orbit/galaxy-output.ts +346 -0
- package/extensions/orbit/galaxy-page-binding.ts +222 -0
- package/extensions/orbit/galaxy-page-markdown-guidance.ts +15 -0
- package/extensions/orbit/galaxy-page-ops.ts +159 -0
- package/extensions/orbit/galaxy-page-sync.test.ts +417 -0
- package/extensions/orbit/galaxy-page-sync.ts +318 -0
- package/extensions/orbit/galaxy-pages-api.ts +203 -0
- package/extensions/orbit/galaxy-pages-sync.ts +409 -0
- package/extensions/orbit/galaxy-poll-guard.ts +189 -0
- package/extensions/orbit/galaxy-poller.ts +706 -0
- package/extensions/orbit/galaxy-provenance.ts +623 -0
- package/extensions/orbit/galaxy-reconcile.ts +956 -0
- package/extensions/orbit/galaxy-recovery.ts +176 -0
- package/extensions/orbit/galaxy-repeat-guard.ts +55 -0
- package/extensions/orbit/galaxy-submission-capture.ts +707 -0
- package/extensions/orbit/galaxy-submission.ts +502 -0
- package/extensions/orbit/galaxy-tool-source.ts +78 -0
- package/extensions/orbit/galaxy-tool-wrap.ts +234 -0
- package/extensions/orbit/galaxy-udt-block.ts +127 -0
- package/extensions/orbit/galaxy-upload-tus.ts +334 -0
- package/extensions/orbit/galaxy-upload.ts +300 -0
- package/extensions/orbit/galaxy-version-capture.ts +65 -0
- package/extensions/orbit/git.ts +173 -0
- package/extensions/orbit/harness-block-fields.ts +597 -0
- package/extensions/orbit/index.ts +593 -0
- package/extensions/orbit/init-gate.ts +284 -0
- package/extensions/orbit/instructions-command.ts +136 -0
- package/extensions/orbit/invocation-failure-hint.ts +57 -0
- package/extensions/orbit/iwc-plan-check.ts +94 -0
- package/extensions/orbit/lesson-command.ts +303 -0
- package/extensions/orbit/lesson-hint.ts +245 -0
- package/extensions/orbit/lesson-nudge.ts +106 -0
- package/extensions/orbit/lessons/compose.ts +177 -0
- package/extensions/orbit/lessons/counters.ts +120 -0
- package/extensions/orbit/lessons/enabled.ts +116 -0
- package/extensions/orbit/lessons/matcher.ts +346 -0
- package/extensions/orbit/lessons/paths.ts +286 -0
- package/extensions/orbit/lessons/pi-event-contract.ts +105 -0
- package/extensions/orbit/lessons/propose-replay.ts +103 -0
- package/extensions/orbit/lessons/propose-tool.ts +222 -0
- package/extensions/orbit/lessons/propose.ts +502 -0
- package/extensions/orbit/lessons/replay.ts +89 -0
- package/extensions/orbit/lessons/reproduction-index.ts +83 -0
- package/extensions/orbit/lessons/search-tool.ts +99 -0
- package/extensions/orbit/lessons/search.ts +136 -0
- package/extensions/orbit/lessons/store.ts +415 -0
- package/extensions/orbit/lessons/text.ts +36 -0
- package/extensions/orbit/lessons/types.ts +69 -0
- package/extensions/orbit/lessons/user-dir.ts +24 -0
- package/extensions/orbit/lessons/user-lesson.ts +88 -0
- package/extensions/orbit/lessons/wrapper.ts +61 -0
- package/extensions/orbit/lessons-command.ts +147 -0
- package/extensions/orbit/local-exec.ts +39 -0
- package/extensions/orbit/mcp-output.ts +179 -0
- package/extensions/orbit/mcp-servers.test.ts +24 -0
- package/extensions/orbit/mcp-servers.ts +25 -0
- package/extensions/orbit/model-script.ts +351 -0
- package/extensions/orbit/notebook-anchors.ts +342 -0
- package/extensions/orbit/notebook-writer.ts +863 -0
- package/extensions/orbit/observation-allowlists.ts +1109 -0
- package/extensions/orbit/observation-replay.ts +148 -0
- package/extensions/orbit/observation-triggers.ts +563 -0
- package/extensions/orbit/observation-ui.ts +175 -0
- package/extensions/orbit/observations-command.ts +421 -0
- package/extensions/orbit/observations-config.ts +200 -0
- package/extensions/orbit/observations.ts +1381 -0
- package/extensions/orbit/profiles.ts +270 -0
- package/extensions/orbit/progress-updates.ts +95 -0
- package/extensions/orbit/proposal-commands.ts +882 -0
- package/extensions/orbit/provenance-fs-file.ts +59 -0
- package/extensions/orbit/provenance-fs.ts +32 -0
- package/extensions/orbit/provenance-memory-fs.ts +59 -0
- package/extensions/orbit/record-store-file.ts +177 -0
- package/extensions/orbit/record-store-page.ts +77 -0
- package/extensions/orbit/record-store-seam.ts +47 -0
- package/extensions/orbit/record-store.ts +149 -0
- package/extensions/orbit/registry-carrier.ts +107 -0
- package/extensions/orbit/registry-eligibility.ts +95 -0
- package/extensions/orbit/registry-evaluation.ts +403 -0
- package/extensions/orbit/registry-evaluator.ts +519 -0
- package/extensions/orbit/registry-import.ts +91 -0
- package/extensions/orbit/registry-lock.ts +221 -0
- package/extensions/orbit/registry-memory-fs.ts +42 -0
- package/extensions/orbit/registry-page-carrier.ts +103 -0
- package/extensions/orbit/registry-proposal.ts +1348 -0
- package/extensions/orbit/registry-runtime.ts +234 -0
- package/extensions/orbit/registry-schema.ts +735 -0
- package/extensions/orbit/registry-submitter.ts +59 -0
- package/extensions/orbit/registry-templates.ts +346 -0
- package/extensions/orbit/registry.ts +476 -0
- package/extensions/orbit/sandbox/index.ts +120 -0
- package/extensions/orbit/sandbox/sandbox-bash.ts +93 -0
- package/extensions/orbit/sandbox/sandbox-config.ts +87 -0
- package/extensions/orbit/sandbox/sandbox-init-message.ts +28 -0
- package/extensions/orbit/secret-redaction.ts +247 -0
- package/extensions/orbit/session-index/cwd.ts +18 -0
- package/extensions/orbit/session-index/db.ts +56 -0
- package/extensions/orbit/session-index/indexer.ts +154 -0
- package/extensions/orbit/session-index/is-enabled.ts +17 -0
- package/extensions/orbit/session-index/parse.ts +254 -0
- package/extensions/orbit/session-index/query.ts +209 -0
- package/extensions/orbit/session-index/schema.ts +72 -0
- package/extensions/orbit/session-index/tools.ts +152 -0
- package/extensions/orbit/session-lifecycle.ts +321 -0
- package/extensions/orbit/skill-triggers.ts +159 -0
- package/extensions/orbit/skills-command.ts +48 -0
- package/extensions/orbit/skills-discovery.ts +435 -0
- package/extensions/orbit/skills.ts +84 -0
- package/extensions/orbit/sra-import-gate.ts +77 -0
- package/extensions/orbit/state.ts +265 -0
- package/extensions/orbit/submission-replay.ts +147 -0
- package/extensions/orbit/sync-command.ts +157 -0
- package/extensions/orbit/teams/critic-parser.ts +93 -0
- package/extensions/orbit/teams/dispatcher.ts +210 -0
- package/extensions/orbit/teams/is-enabled.ts +22 -0
- package/extensions/orbit/teams/tool.ts +187 -0
- package/extensions/orbit/teams/types.ts +57 -0
- package/extensions/orbit/teams/validate.ts +42 -0
- package/extensions/orbit/tester-id-command.ts +133 -0
- package/extensions/orbit/tools-sync.ts +279 -0
- package/extensions/orbit/tools.ts +1300 -0
- package/extensions/orbit/types.ts +41 -0
- package/extensions/orbit/ui-bridge.ts +55 -0
- package/extensions/orbit/ulid.ts +60 -0
- package/extensions/orbit/user-instructions.ts +388 -0
- package/extensions/orbit/vendor/skills/_catalog.json +68 -0
- package/extensions/orbit/vendor/skills/_manifest.json +1106 -0
- package/extensions/orbit/vendor/skills/advance-galaxy-draft-step/SKILL.md +112 -0
- package/extensions/orbit/vendor/skills/advance-galaxy-draft-step/_provenance.json +218 -0
- package/extensions/orbit/vendor/skills/advance-galaxy-draft-step/_required_tools.json +33 -0
- package/extensions/orbit/vendor/skills/advance-galaxy-draft-step/_verify.json +4 -0
- package/extensions/orbit/vendor/skills/advance-galaxy-draft-step/references/cli/add.json +50 -0
- package/extensions/orbit/vendor/skills/advance-galaxy-draft-step/references/cli/draft-extract.json +51 -0
- package/extensions/orbit/vendor/skills/advance-galaxy-draft-step/references/cli/draft-next-step.json +42 -0
- package/extensions/orbit/vendor/skills/advance-galaxy-draft-step/references/cli/draft-validate.json +140 -0
- package/extensions/orbit/vendor/skills/advance-galaxy-draft-step/references/cli/list.json +32 -0
- package/extensions/orbit/vendor/skills/advance-galaxy-draft-step/references/notes/galaxy-tool-job-failure-reference.md +137 -0
- package/extensions/orbit/vendor/skills/advance-galaxy-draft-step/references/notes/open-requirements-ledger.md +173 -0
- package/extensions/orbit/vendor/skills/advance-galaxy-draft-step/references/schemas/galaxy-tool-summary.schema.json +175 -0
- package/extensions/orbit/vendor/skills/advance-galaxy-draft-step/references/schemas/galaxy-workflow-draft.schema.json +2727 -0
- package/extensions/orbit/vendor/skills/apply-galaxy-workflow-changeset/SKILL.md +82 -0
- package/extensions/orbit/vendor/skills/apply-galaxy-workflow-changeset/_provenance.json +133 -0
- package/extensions/orbit/vendor/skills/apply-galaxy-workflow-changeset/_required_tools.json +16 -0
- package/extensions/orbit/vendor/skills/apply-galaxy-workflow-changeset/_verify.json +4 -0
- package/extensions/orbit/vendor/skills/apply-galaxy-workflow-changeset/references/cli/draft-validate.json +140 -0
- package/extensions/orbit/vendor/skills/apply-galaxy-workflow-changeset/references/notes/galaxy-workflow-draft-format.md +135 -0
- package/extensions/orbit/vendor/skills/apply-galaxy-workflow-changeset/references/notes/open-requirements-ledger.md +173 -0
- package/extensions/orbit/vendor/skills/apply-galaxy-workflow-changeset/references/schemas/galaxy-workflow-draft.schema.json +2727 -0
- package/extensions/orbit/vendor/skills/changeset-to-galaxy-test-plan/SKILL.md +84 -0
- package/extensions/orbit/vendor/skills/changeset-to-galaxy-test-plan/_provenance.json +166 -0
- package/extensions/orbit/vendor/skills/changeset-to-galaxy-test-plan/_verify.json +29 -0
- package/extensions/orbit/vendor/skills/changeset-to-galaxy-test-plan/references/notes/galaxy-workflow-testability-design.md +136 -0
- package/extensions/orbit/vendor/skills/changeset-to-galaxy-test-plan/references/notes/iwc-shortcuts-anti-patterns.md +357 -0
- package/extensions/orbit/vendor/skills/changeset-to-galaxy-test-plan/references/notes/iwc-test-data-conventions.md +308 -0
- package/extensions/orbit/vendor/skills/changeset-to-galaxy-test-plan/references/notes/planemo-asserts-idioms.md +246 -0
- package/extensions/orbit/vendor/skills/changeset-to-galaxy-test-plan/references/notes/planemo-workflow-test-architecture.md +151 -0
- package/extensions/orbit/vendor/skills/changeset-to-galaxy-test-plan/references/schemas/galaxy-workflow-test-plan.schema.json +552 -0
- package/extensions/orbit/vendor/skills/changeset-to-galaxy-test-plan/references/schemas/summary-galaxy-workflow.schema.json +687 -0
- package/extensions/orbit/vendor/skills/changeset-to-galaxy-test-plan/references/schemas/tests-format.schema.json +7328 -0
- package/extensions/orbit/vendor/skills/compare-against-iwc-exemplar/SKILL.md +127 -0
- package/extensions/orbit/vendor/skills/compare-against-iwc-exemplar/_provenance.json +198 -0
- package/extensions/orbit/vendor/skills/compare-against-iwc-exemplar/_required_tools.json +16 -0
- package/extensions/orbit/vendor/skills/compare-against-iwc-exemplar/_verify.json +4 -0
- package/extensions/orbit/vendor/skills/compare-against-iwc-exemplar/references/cli/convert.json +123 -0
- package/extensions/orbit/vendor/skills/compare-against-iwc-exemplar/references/notes/galaxy-data-flow-draft-contract.md +129 -0
- package/extensions/orbit/vendor/skills/compare-against-iwc-exemplar/references/notes/iwc-shortcuts-anti-patterns.md +357 -0
- package/extensions/orbit/vendor/skills/compare-against-iwc-exemplar/references/notes/iwc-test-data-conventions.md +308 -0
- package/extensions/orbit/vendor/skills/compare-against-iwc-exemplar/references/notes/open-requirements-ledger.md +173 -0
- package/extensions/orbit/vendor/skills/debug-galaxy-workflow-output/SKILL.md +73 -0
- package/extensions/orbit/vendor/skills/debug-galaxy-workflow-output/_provenance.json +160 -0
- package/extensions/orbit/vendor/skills/debug-galaxy-workflow-output/_verify.json +4 -0
- package/extensions/orbit/vendor/skills/debug-galaxy-workflow-output/references/notes/galaxy-collection-semantics.md +43 -0
- package/extensions/orbit/vendor/skills/debug-galaxy-workflow-output/references/notes/galaxy-collection-semantics.yml +1250 -0
- package/extensions/orbit/vendor/skills/debug-galaxy-workflow-output/references/notes/galaxy-tool-job-failure-reference.md +137 -0
- package/extensions/orbit/vendor/skills/debug-galaxy-workflow-output/references/notes/galaxy-workflow-invocation-failure-reference.md +138 -0
- package/extensions/orbit/vendor/skills/debug-galaxy-workflow-output/references/notes/iwc-shortcuts-anti-patterns.md +357 -0
- package/extensions/orbit/vendor/skills/debug-galaxy-workflow-output/references/notes/nextflow-operators-to-galaxy-collection-recipes.md +98 -0
- package/extensions/orbit/vendor/skills/debug-galaxy-workflow-output/references/notes/planemo-asserts-idioms.md +246 -0
- package/extensions/orbit/vendor/skills/debug-galaxy-workflow-output/references/notes/planemo-workflow-test-architecture.md +151 -0
- package/extensions/orbit/vendor/skills/discover-shed-tool/SKILL.md +174 -0
- package/extensions/orbit/vendor/skills/discover-shed-tool/_provenance.json +130 -0
- package/extensions/orbit/vendor/skills/discover-shed-tool/_required_tools.json +18 -0
- package/extensions/orbit/vendor/skills/discover-shed-tool/_verify.json +17 -0
- package/extensions/orbit/vendor/skills/discover-shed-tool/references/cli/tool-revisions.json +48 -0
- package/extensions/orbit/vendor/skills/discover-shed-tool/references/cli/tool-search.json +95 -0
- package/extensions/orbit/vendor/skills/discover-shed-tool/references/cli/tool-versions.json +39 -0
- package/extensions/orbit/vendor/skills/discover-shed-tool/references/notes/component-tool-shed-search.md +230 -0
- package/extensions/orbit/vendor/skills/discover-shed-tool/references/schemas/galaxy-tool-discovery.schema.json +231 -0
- package/extensions/orbit/vendor/skills/implement-galaxy-workflow-test/SKILL.md +93 -0
- package/extensions/orbit/vendor/skills/implement-galaxy-workflow-test/_provenance.json +201 -0
- package/extensions/orbit/vendor/skills/implement-galaxy-workflow-test/_required_tools.json +28 -0
- package/extensions/orbit/vendor/skills/implement-galaxy-workflow-test/_verify.json +17 -0
- package/extensions/orbit/vendor/skills/implement-galaxy-workflow-test/references/cli/planemo.md +44 -0
- package/extensions/orbit/vendor/skills/implement-galaxy-workflow-test/references/cli/validate-tests.json +40 -0
- package/extensions/orbit/vendor/skills/implement-galaxy-workflow-test/references/notes/galaxy-workflow-testability-design.md +136 -0
- package/extensions/orbit/vendor/skills/implement-galaxy-workflow-test/references/notes/iwc-shortcuts-anti-patterns.md +357 -0
- package/extensions/orbit/vendor/skills/implement-galaxy-workflow-test/references/notes/iwc-test-data-conventions.md +308 -0
- package/extensions/orbit/vendor/skills/implement-galaxy-workflow-test/references/notes/planemo-asserts-idioms.md +246 -0
- package/extensions/orbit/vendor/skills/implement-galaxy-workflow-test/references/notes/planemo-workflow-test-architecture.md +151 -0
- package/extensions/orbit/vendor/skills/implement-galaxy-workflow-test/references/schemas/galaxy-workflow-test-plan.schema.json +552 -0
- package/extensions/orbit/vendor/skills/implement-galaxy-workflow-test/references/schemas/tests-format.schema.json +7328 -0
- package/extensions/orbit/vendor/skills/interview-to-galaxy-workflow-changeset/SKILL.md +81 -0
- package/extensions/orbit/vendor/skills/interview-to-galaxy-workflow-changeset/_provenance.json +93 -0
- package/extensions/orbit/vendor/skills/interview-to-galaxy-workflow-changeset/_verify.json +17 -0
- package/extensions/orbit/vendor/skills/interview-to-galaxy-workflow-changeset/references/notes/open-requirements-ledger.md +173 -0
- package/extensions/orbit/vendor/skills/interview-to-galaxy-workflow-changeset/references/schemas/summary-galaxy-workflow.schema.json +687 -0
- package/extensions/orbit/vendor/skills/pipeline-update-interview-to-galaxy/SKILL.md +81 -0
- package/extensions/orbit/vendor/skills/pipeline-update-interview-to-galaxy/_assembly.json +23 -0
- package/extensions/orbit/vendor/skills/run-workflow-test/SKILL.md +79 -0
- package/extensions/orbit/vendor/skills/run-workflow-test/_provenance.json +125 -0
- package/extensions/orbit/vendor/skills/run-workflow-test/_required_tools.json +28 -0
- package/extensions/orbit/vendor/skills/run-workflow-test/_verify.json +4 -0
- package/extensions/orbit/vendor/skills/run-workflow-test/references/cli/planemo.md +44 -0
- package/extensions/orbit/vendor/skills/run-workflow-test/references/cli/validate-tests.json +40 -0
- package/extensions/orbit/vendor/skills/run-workflow-test/references/notes/galaxy-workflow-invocation-failure-reference.md +138 -0
- package/extensions/orbit/vendor/skills/run-workflow-test/references/notes/planemo-asserts-idioms.md +246 -0
- package/extensions/orbit/vendor/skills/run-workflow-test/references/notes/planemo-workflow-test-architecture.md +151 -0
- package/extensions/orbit/vendor/skills/run-workflow-test/references/schemas/tests-format.schema.json +7328 -0
- package/extensions/orbit/vendor/skills/skills/LICENSE +21 -0
- package/extensions/orbit/vendor/skills/skills/collection-manipulation/README.md +39 -0
- package/extensions/orbit/vendor/skills/skills/collection-manipulation/SKILL.md +892 -0
- package/extensions/orbit/vendor/skills/skills/collection-manipulation/references/api-patterns.md +927 -0
- package/extensions/orbit/vendor/skills/skills/collection-manipulation/references/apply-rules.md +1482 -0
- package/extensions/orbit/vendor/skills/skills/collection-manipulation/references/test-patterns.md +996 -0
- package/extensions/orbit/vendor/skills/skills/collection-manipulation/references/tools.md +609 -0
- package/extensions/orbit/vendor/skills/skills/galaxy-data-libraries/SKILL.md +170 -0
- package/extensions/orbit/vendor/skills/skills/galaxy-integration/README.md +162 -0
- package/extensions/orbit/vendor/skills/skills/galaxy-integration/SKILL.md +99 -0
- package/extensions/orbit/vendor/skills/skills/galaxy-integration/examples/README.md +119 -0
- package/extensions/orbit/vendor/skills/skills/galaxy-integration/examples/tool-checking.md +419 -0
- package/extensions/orbit/vendor/skills/skills/galaxy-integration/examples/workflow-testing.md +617 -0
- package/extensions/orbit/vendor/skills/skills/galaxy-integration/galaxy-integration.md +614 -0
- package/extensions/orbit/vendor/skills/skills/galaxy-integration/jupyterlite/SKILL.md +144 -0
- package/extensions/orbit/vendor/skills/skills/galaxy-integration/jupyterlite/examples/average_col3.ipynb +68 -0
- package/extensions/orbit/vendor/skills/skills/galaxy-integration/jupyterlite/examples/extract_sample_metadata.ipynb +190 -0
- package/extensions/orbit/vendor/skills/skills/galaxy-integration/jupyterlite/examples/variant_annotation.ipynb +816 -0
- package/extensions/orbit/vendor/skills/skills/galaxy-integration/jupyterlite/examples/vcp_variant_map.ipynb +443 -0
- package/extensions/orbit/vendor/skills/skills/galaxy-integration/scripts/README.md +165 -0
- package/extensions/orbit/vendor/skills/skills/galaxy-integration/scripts/galaxy_tool_checker.py +521 -0
- package/extensions/orbit/vendor/skills/skills/galaxy-mcp-reference/SKILL.md +128 -0
- package/extensions/orbit/vendor/skills/skills/galaxy-mcp-reference/gotchas.md +135 -0
- package/extensions/orbit/vendor/skills/skills/galaxy-mcp-reference/history-access.md +132 -0
- package/extensions/orbit/vendor/skills/skills/reproduciblify/SKILL.md +146 -0
- package/extensions/orbit/vendor/skills/skills/reproduciblify/references/directives.yml +496 -0
- package/extensions/orbit/vendor/skills/skills/udt-authoring/SKILL.md +245 -0
- package/extensions/orbit/vendor/skills/skills/udt-authoring/examples/01-minimal-echo.yml +27 -0
- package/extensions/orbit/vendor/skills/skills/udt-authoring/examples/02-single-data-in-out.yml +27 -0
- package/extensions/orbit/vendor/skills/skills/udt-authoring/examples/03-multiple-data-js.yml +28 -0
- package/extensions/orbit/vendor/skills/skills/udt-authoring/examples/04-select-integer-boolean.yml +41 -0
- package/extensions/orbit/vendor/skills/skills/udt-authoring/examples/05-resource-requirements.yml +25 -0
- package/extensions/orbit/vendor/skills/skills/udt-authoring/examples/06-biocontainer-tool.yml +38 -0
- package/extensions/orbit/vendor/skills/skills/udt-authoring/examples/07-inline-python-script.yml +56 -0
- package/extensions/orbit/vendor/skills/skills/udt-authoring/examples/08-configfile-script.yml +74 -0
- package/extensions/orbit/vendor/skills/skills/udt-authoring/references/common-mistakes.md +76 -0
- package/extensions/orbit/vendor/skills/skills/udt-authoring/references/schema-reference.md +155 -0
- package/extensions/orbit/vendor/skills/skills/udt-authoring/references/templating.md +196 -0
- package/extensions/orbit/vendor/skills/skills/udt-authoring/scripts/validate.py +109 -0
- package/extensions/orbit/vendor/skills/skills/workflow-reports/README.md +71 -0
- package/extensions/orbit/vendor/skills/skills/workflow-reports/SKILL.md +190 -0
- package/extensions/orbit/vendor/skills/skills/workflow-reports/examples/histology-staining.md +145 -0
- package/extensions/orbit/vendor/skills/skills/workflow-reports/examples/tissue-microarray-analysis.md +176 -0
- package/extensions/orbit/vendor/skills/skills/workflow-reports/references/directives.md +415 -0
- package/extensions/orbit/vendor/skills/summarize-galaxy-workflow/SKILL.md +98 -0
- package/extensions/orbit/vendor/skills/summarize-galaxy-workflow/_provenance.json +93 -0
- package/extensions/orbit/vendor/skills/summarize-galaxy-workflow/_required_tools.json +28 -0
- package/extensions/orbit/vendor/skills/summarize-galaxy-workflow/_verify.json +17 -0
- package/extensions/orbit/vendor/skills/summarize-galaxy-workflow/references/cli/convert.json +123 -0
- package/extensions/orbit/vendor/skills/summarize-galaxy-workflow/references/cli/foundry.md +25 -0
- package/extensions/orbit/vendor/skills/summarize-galaxy-workflow/references/cli/validate.json +142 -0
- package/extensions/orbit/vendor/skills/summarize-galaxy-workflow/references/schemas/summary-galaxy-workflow.schema.json +687 -0
- package/extensions/orbit/vendor/skills/validate-galaxy-workflow/SKILL.md +74 -0
- package/extensions/orbit/vendor/skills/validate-galaxy-workflow/_provenance.json +71 -0
- package/extensions/orbit/vendor/skills/validate-galaxy-workflow/_required_tools.json +16 -0
- package/extensions/orbit/vendor/skills/validate-galaxy-workflow/_verify.json +4 -0
- package/extensions/orbit/vendor/skills/validate-galaxy-workflow/references/cli/validate.json +142 -0
- package/extensions/orbit/vendor/skills/validate-galaxy-workflow/references/notes/galaxy-workflow-invocation-failure-reference.md +138 -0
- package/extensions/orbit/vendor/skills/validate-galaxy-workflow/references/notes/galaxy-workflow-testability-design.md +136 -0
- package/extensions/orbit/vendor-skills.ts +283 -0
- package/extensions/orbit/workspace-state-dir.ts +46 -0
- package/extensions/orbit-handoff/index.ts +73 -0
- package/extensions/orbit-handoff/orbit-launcher.ts +142 -0
- package/extensions/whats-new/index.ts +98 -0
- package/lessons/LICENSE +17 -0
- package/lessons/README.md +117 -0
- package/lessons/SCHEMA.md +187 -0
- package/lessons/build-snapshot.mjs +311 -0
- package/lessons/data/downloaded-file-is-not-what-its-extension-says.md +61 -0
- package/lessons/galaxy-api/403-history-is-a-hard-stop.md +57 -0
- package/lessons/galaxy-api/collection-into-single-dataset-input.md +61 -0
- package/lessons/galaxy-api/connectedvalue-in-command-line.md +62 -0
- package/lessons/galaxy-api/hid-is-not-an-id.md +59 -0
- package/lessons/galaxy-api/invoke-workflow-inputs-not-params.md +60 -0
- package/lessons/galaxy-api/repeat-param-pipe-keys.md +63 -0
- package/lessons/galaxy-api/run-tool-returns-on-submit.md +61 -0
- package/lessons/galaxy-tools/reference-index-not-on-server.md +62 -0
- package/lessons/log.md +42 -0
- package/lessons/reproduction/input-population-mismatch.md +59 -0
- package/lessons/reproduction/methods-text-vs-executed-parameters.md +62 -0
- package/lessons/snapshot.json +1004 -0
- package/lessons/stats/de-contrast-direction-and-sample-labels.md +63 -0
- package/lessons/stats/na-coerced-to-zero-in-filters.md +59 -0
- package/lessons/validate.mjs +1219 -0
- package/package.json +103 -5
- package/shared/agent-prompt.d.ts +8 -0
- package/shared/agent-prompt.js +15 -0
- package/shared/approval-prompt.d.ts +4 -0
- package/shared/approval-prompt.js +61 -0
- package/shared/brain-env.d.ts +14 -0
- package/shared/brain-env.js +108 -0
- package/shared/brain-exit.d.ts +20 -0
- package/shared/brain-exit.js +149 -0
- package/shared/capability-profile.d.ts +16 -0
- package/shared/capability-profile.js +75 -0
- package/shared/config-source.d.ts +13 -0
- package/shared/config-source.js +17 -0
- package/shared/confusables.d.ts +3 -0
- package/shared/confusables.js +93 -0
- package/shared/custom-provider.d.ts +45 -0
- package/shared/custom-provider.js +169 -0
- package/shared/dashboard-contract.d.ts +123 -0
- package/shared/dashboard-contract.js +560 -0
- package/shared/dashboard-layout-store.d.ts +44 -0
- package/shared/dashboard-layout-store.js +281 -0
- package/shared/feedback-contract.d.ts +61 -0
- package/shared/feedback-contract.js +146 -0
- package/shared/galaxy-artifact-links.d.ts +30 -0
- package/shared/galaxy-artifact-links.js +166 -0
- package/shared/galaxy-credentials.d.ts +26 -0
- package/shared/galaxy-credentials.js +71 -0
- package/shared/galaxy-destructive.d.ts +21 -0
- package/shared/galaxy-destructive.js +269 -0
- package/shared/galaxy-guidance.d.ts +2 -0
- package/shared/galaxy-guidance.js +53 -0
- package/shared/galaxy-live-contract.d.ts +92 -0
- package/shared/galaxy-live-contract.js +180 -0
- package/shared/galaxy-page-cells.d.ts +2 -0
- package/shared/galaxy-page-cells.js +22 -0
- package/shared/galaxy-tool-family.d.ts +5 -0
- package/shared/galaxy-tool-family.js +27 -0
- package/shared/galaxy-url.d.ts +1 -0
- package/shared/galaxy-url.js +48 -0
- package/shared/gtn.d.ts +31 -0
- package/shared/gtn.js +253 -0
- package/shared/handled-prompt.d.ts +3 -0
- package/shared/handled-prompt.js +26 -0
- package/shared/known-provider.d.ts +11 -0
- package/shared/known-provider.js +89 -0
- package/shared/lesson-hint-marker.d.ts +7 -0
- package/shared/lesson-hint-marker.js +32 -0
- package/shared/lesson-rules.d.ts +150 -0
- package/shared/lesson-rules.js +203 -0
- package/shared/malformed-object-ids.d.ts +1 -0
- package/shared/malformed-object-ids.js +37 -0
- package/shared/markdown-sections.d.ts +10 -0
- package/shared/markdown-sections.js +118 -0
- package/shared/notebook-fences.d.ts +12 -0
- package/shared/notebook-fences.js +53 -0
- package/shared/observation-contract.d.ts +91 -0
- package/shared/observation-contract.js +544 -0
- package/shared/orbit-config.d.ts +226 -0
- package/shared/orbit-config.js +189 -0
- package/shared/orbit-env.d.ts +13 -0
- package/shared/orbit-env.js +124 -0
- package/shared/orbit-shell-contract.d.ts +74 -0
- package/shared/orbit-shell-contract.js +30 -0
- package/shared/page-content-hash.d.ts +1 -0
- package/shared/page-content-hash.js +13 -0
- package/shared/pi-default-model.d.ts +7 -0
- package/shared/pi-default-model.js +41 -0
- package/shared/prompt-blocks.d.ts +87 -0
- package/shared/prompt-blocks.js +898 -0
- package/shared/provider-auth-caps.d.ts +22 -0
- package/shared/provider-auth-caps.js +57 -0
- package/shared/random.d.ts +2 -0
- package/shared/random.js +15 -0
- package/shared/record-excerpt.d.ts +4 -0
- package/shared/record-excerpt.js +16 -0
- package/shared/redirect-guard.d.ts +36 -0
- package/shared/redirect-guard.js +235 -0
- package/shared/skills-pin.d.ts +8 -0
- package/shared/skills-pin.js +9 -0
- package/shared/skills-router.d.ts +17 -0
- package/shared/skills-router.js +63 -0
- package/shared/sra-import.d.ts +34 -0
- package/shared/sra-import.js +206 -0
- package/shared/state-dir.d.ts +21 -0
- package/shared/state-dir.js +240 -0
- package/shared/team-dispatch-contract.d.ts +28 -0
- package/shared/team-dispatch-contract.js +1 -0
- package/shared/truncate-middle.d.ts +11 -0
- package/shared/truncate-middle.js +68 -0
- package/shared/version-compare.d.ts +10 -0
- package/shared/version-compare.js +74 -0
- package/shared/whats-new.d.ts +31 -0
- package/shared/whats-new.js +83 -0
- package/shared/wsl.d.ts +10 -0
- package/shared/wsl.js +24 -0
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The registry's port to Galaxy: how an approved Spec gets submitted and how
|
|
3
|
+
* the template frozen at approval gets fetched.
|
|
4
|
+
*
|
|
5
|
+
* The registry core never talks to Galaxy itself, so it stays free of the
|
|
6
|
+
* harness and of any one client. Inside Orbit the adapter is galaxy-ops running
|
|
7
|
+
* in process -- the same operations galaxy-mcp exposes, so the gated path uses
|
|
8
|
+
* the tools we recommend rather than a private copy of how to call Galaxy. A
|
|
9
|
+
* standalone process can supply its own adapter over the same contract.
|
|
10
|
+
*
|
|
11
|
+
* Types only; nothing here runs.
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import type { Spec } from "./registry-schema";
|
|
15
|
+
|
|
16
|
+
/** What the adapter fetched at approval, frozen under `templates/<digest>.json`. */
|
|
17
|
+
export interface TemplateSnapshot {
|
|
18
|
+
/** The tool schema, workflow run form, or user-defined tool definition. */
|
|
19
|
+
body: unknown;
|
|
20
|
+
/** The version the server resolved, which becomes `Spec.target.version`. */
|
|
21
|
+
version: string;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* The three things a submission can come back as, and they are not
|
|
26
|
+
* interchangeable. `refused` means Galaxy answered and nothing ran, so the
|
|
27
|
+
* reservation can be released. `unknown` means no answer arrived -- a timeout,
|
|
28
|
+
* a dropped connection -- and the run may exist; the attempt becomes
|
|
29
|
+
* `submission_unknown` and only the user can attribute it.
|
|
30
|
+
*/
|
|
31
|
+
export type SubmitOutcome =
|
|
32
|
+
| {
|
|
33
|
+
kind: "accepted";
|
|
34
|
+
invocation_id?: string;
|
|
35
|
+
job_ids: string[];
|
|
36
|
+
output_ids: string[];
|
|
37
|
+
/**
|
|
38
|
+
* The version Galaxy reports actually ran, or null if the reply doesn't
|
|
39
|
+
* say. Asking for a version is not proof of getting it: Galaxy's toolbox
|
|
40
|
+
* hands back the newest installed version when the requested one is
|
|
41
|
+
* missing, so the caller compares this against the Spec.
|
|
42
|
+
*/
|
|
43
|
+
ran_version: string | null;
|
|
44
|
+
/** sha256 of the canonical request the adapter sent. */
|
|
45
|
+
request_digest: string;
|
|
46
|
+
}
|
|
47
|
+
| { kind: "refused"; reason: string }
|
|
48
|
+
| { kind: "unknown"; detail: string };
|
|
49
|
+
|
|
50
|
+
export interface Submitter {
|
|
51
|
+
/** Fetch the template or definition for a target, at its version when given. */
|
|
52
|
+
fetchTemplate(target: Spec["target"], historyId?: string): Promise<TemplateSnapshot>;
|
|
53
|
+
/**
|
|
54
|
+
* Submit exactly what the Spec says, built against the frozen template. An
|
|
55
|
+
* adapter must not retry a submission on its own: a retry after an
|
|
56
|
+
* `unknown` can run the same thing twice.
|
|
57
|
+
*/
|
|
58
|
+
submit(spec: Spec, template: unknown): Promise<SubmitOutcome>;
|
|
59
|
+
}
|
|
@@ -0,0 +1,346 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fetching the template a proposal is validated against and an approval
|
|
3
|
+
* freezes, through galaxy-ops in process -- the same operations galaxy-mcp
|
|
4
|
+
* exposes, so the gated path reads Galaxy the way the tools we recommend do.
|
|
5
|
+
*
|
|
6
|
+
* What gets frozen (the registry-core handoff asked slice 2 to confirm this):
|
|
7
|
+
*
|
|
8
|
+
* - a tool: Galaxy's own description of it with `io_details`
|
|
9
|
+
* (`getToolDetails`), not galaxy-mcp's filled-in skeleton;
|
|
10
|
+
* - a workflow: Galaxy's details at the resolved version
|
|
11
|
+
* (`getWorkflowDetails`) together with the run form's input slots
|
|
12
|
+
* (`resolveWorkflowSlots`, which reads `download?style=run`);
|
|
13
|
+
* - a user-defined tool: the tool's record from Galaxy, representation and
|
|
14
|
+
* all, found by uuid in `listUserTools`.
|
|
15
|
+
*
|
|
16
|
+
* Where galaxy-ops can't yet do what's asked it says so instead of guessing:
|
|
17
|
+
* it can't describe a tool at a version other than the one its id names,
|
|
18
|
+
* template an older workflow version, or fetch one user-defined tool by uuid.
|
|
19
|
+
* Those are listed in the PR as galaxy-ops gaps.
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
import * as fs from "fs";
|
|
23
|
+
import * as path from "path";
|
|
24
|
+
import {
|
|
25
|
+
getCollectionDetails,
|
|
26
|
+
getDatasetDetails,
|
|
27
|
+
getDatatypesMapping,
|
|
28
|
+
getToolDetails,
|
|
29
|
+
getWorkflowDetails,
|
|
30
|
+
listUserTools,
|
|
31
|
+
resolveWorkflowSlots,
|
|
32
|
+
subtypeSatisfies,
|
|
33
|
+
type DatatypesMapping,
|
|
34
|
+
type GalaxyContext,
|
|
35
|
+
} from "@galaxyproject/galaxy-ops";
|
|
36
|
+
import { readEnv } from "../../shared/orbit-env.js";
|
|
37
|
+
import { appendActivityEvent } from "./activity";
|
|
38
|
+
import { galaxyOpsContext } from "./galaxy-api";
|
|
39
|
+
import {
|
|
40
|
+
UNPINNED,
|
|
41
|
+
inputKey,
|
|
42
|
+
targetId,
|
|
43
|
+
type InputFormats,
|
|
44
|
+
type Proposal,
|
|
45
|
+
type ProposalTarget,
|
|
46
|
+
} from "./registry-proposal";
|
|
47
|
+
import type { TemplateSnapshot } from "./registry-submitter";
|
|
48
|
+
import { resolveReplayPath } from "./submission-replay";
|
|
49
|
+
|
|
50
|
+
export type TemplateFetcher = (
|
|
51
|
+
target: ProposalTarget,
|
|
52
|
+
historyId: string,
|
|
53
|
+
signal?: AbortSignal,
|
|
54
|
+
) => Promise<TemplateSnapshot>;
|
|
55
|
+
|
|
56
|
+
/** A template fetch that can't be done, with a sentence the model or user can act on. */
|
|
57
|
+
export class TemplateUnavailableError extends Error {
|
|
58
|
+
constructor(message: string) {
|
|
59
|
+
super(message);
|
|
60
|
+
this.name = "TemplateUnavailableError";
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
function isRecord(v: unknown): v is Record<string, unknown> {
|
|
65
|
+
return v !== null && typeof v === "object" && !Array.isArray(v);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/** Galaxy's answer as a sentence, without the stack. */
|
|
69
|
+
function reason(err: unknown): string {
|
|
70
|
+
return err instanceof Error ? err.message : String(err);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
export async function fetchTemplateWith(
|
|
74
|
+
ctx: GalaxyContext,
|
|
75
|
+
target: ProposalTarget,
|
|
76
|
+
historyId: string,
|
|
77
|
+
): Promise<TemplateSnapshot> {
|
|
78
|
+
const id = targetId(target);
|
|
79
|
+
if (!id) throw new TemplateUnavailableError(`the ${target.kind} has no id`);
|
|
80
|
+
try {
|
|
81
|
+
if (target.kind === "tool") {
|
|
82
|
+
const body = await getToolDetails({ toolId: id, ioDetails: true }, ctx);
|
|
83
|
+
// Galaxy can answer for a tool id it doesn't have with a different tool
|
|
84
|
+
// or lineage. Freezing that schema against a Spec naming this id would
|
|
85
|
+
// approve one thing and describe another.
|
|
86
|
+
if (body.id !== id) {
|
|
87
|
+
throw new TemplateUnavailableError(
|
|
88
|
+
`Galaxy answered with tool ${String(body.id)} when asked for ${id}; propose the tool id Galaxy has`,
|
|
89
|
+
);
|
|
90
|
+
}
|
|
91
|
+
if (typeof body.version !== "string" || body.version === "") {
|
|
92
|
+
throw new TemplateUnavailableError(`Galaxy did not say which version of ${id} it has`);
|
|
93
|
+
}
|
|
94
|
+
return { body, version: body.version };
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
if (target.kind === "workflow") {
|
|
98
|
+
const details = await getWorkflowDetails({ workflowId: id }, ctx);
|
|
99
|
+
const latest = String(details.version);
|
|
100
|
+
if (target.version !== UNPINNED && target.version !== latest) {
|
|
101
|
+
throw new TemplateUnavailableError(
|
|
102
|
+
`workflow ${id} is at version ${latest}; galaxy-ops can only read the run form of ` +
|
|
103
|
+
`the latest version, so version ${target.version} can't be approved yet`,
|
|
104
|
+
);
|
|
105
|
+
}
|
|
106
|
+
const resolved = await resolveWorkflowSlots(ctx, id, historyId);
|
|
107
|
+
return { body: { workflow: details, slots: resolved.slots }, version: latest };
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
for (let offset = 0; offset < 10_000;) {
|
|
111
|
+
const page = await listUserTools({ active: true, limit: 100, offset }, ctx);
|
|
112
|
+
const hit = page.items.find((t) => t.uuid === id);
|
|
113
|
+
if (hit) {
|
|
114
|
+
const rep = isRecord(hit.representation) ? hit.representation : null;
|
|
115
|
+
const version = typeof rep?.version === "string" ? rep.version : "";
|
|
116
|
+
if (!version) {
|
|
117
|
+
throw new TemplateUnavailableError(
|
|
118
|
+
`user-defined tool ${id} has no version in its definition`,
|
|
119
|
+
);
|
|
120
|
+
}
|
|
121
|
+
return { body: hit, version };
|
|
122
|
+
}
|
|
123
|
+
if (!page.pagination.hasNext || page.pagination.nextOffset === undefined) break;
|
|
124
|
+
offset = page.pagination.nextOffset;
|
|
125
|
+
}
|
|
126
|
+
throw new TemplateUnavailableError(`no active user-defined tool with uuid ${id}`);
|
|
127
|
+
} catch (err) {
|
|
128
|
+
if (err instanceof TemplateUnavailableError) throw err;
|
|
129
|
+
throw new TemplateUnavailableError(
|
|
130
|
+
`Galaxy couldn't describe ${target.kind} ${id}: ${reason(err)}`,
|
|
131
|
+
);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/** The fetcher for the configured Galaxy server. */
|
|
136
|
+
export const galaxyTemplateFetcher: TemplateFetcher = async (target, historyId, signal) => {
|
|
137
|
+
const ctx = galaxyOpsContext(signal);
|
|
138
|
+
if (!ctx) {
|
|
139
|
+
throw new TemplateUnavailableError(
|
|
140
|
+
"Galaxy isn't configured in this session (GALAXY_URL, GALAXY_API_KEY)",
|
|
141
|
+
);
|
|
142
|
+
}
|
|
143
|
+
return fetchTemplateWith(ctx, target, historyId);
|
|
144
|
+
};
|
|
145
|
+
|
|
146
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
147
|
+
// Dataset formats, for the format check
|
|
148
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
149
|
+
|
|
150
|
+
/** Reads what Galaxy says about a proposal's inputs; null where the check can't run. */
|
|
151
|
+
export type InputFormatFetcher = (
|
|
152
|
+
inputs: Proposal["inputs"],
|
|
153
|
+
signal?: AbortSignal,
|
|
154
|
+
) => Promise<InputFormats>;
|
|
155
|
+
|
|
156
|
+
interface Converter {
|
|
157
|
+
source: string;
|
|
158
|
+
target: string;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* Whether Galaxy would take `ext` where `accepted` are asked for: the same
|
|
163
|
+
* datatype or a subclass of one (`fastqsanger` for `fastq`), or something an
|
|
164
|
+
* installed converter turns into one (`fastqsanger.gz` for `fastqsanger`,
|
|
165
|
+
* which Galaxy converts implicitly). Galaxy's own hierarchy, not a table of
|
|
166
|
+
* ours, so a server's custom datatypes are read the way it reads them.
|
|
167
|
+
*/
|
|
168
|
+
export function datatypeAccepts(
|
|
169
|
+
mapping: DatatypesMapping,
|
|
170
|
+
converters: Converter[] | null,
|
|
171
|
+
): (ext: string, accepted: string[]) => boolean | undefined {
|
|
172
|
+
const known = (e: string) => mapping.ext_to_class_name[e] !== undefined;
|
|
173
|
+
const compressed = (e: string) =>
|
|
174
|
+
mapping.class_to_classes[mapping.ext_to_class_name[e]]?.[
|
|
175
|
+
"galaxy.datatypes.binary.DynamicCompressedArchive"
|
|
176
|
+
] === true;
|
|
177
|
+
const isA = (sub: string, sup: string) =>
|
|
178
|
+
known(sub) && known(sup) && subtypeSatisfies(sub, [sup], mapping);
|
|
179
|
+
return (ext, accepted) => {
|
|
180
|
+
if (!known(ext)) return undefined;
|
|
181
|
+
if (accepted.some((a) => isA(ext, a))) return true;
|
|
182
|
+
if (converters?.some((c) => isA(ext, c.source) && accepted.some((a) => isA(c.target, a)))) {
|
|
183
|
+
return true;
|
|
184
|
+
}
|
|
185
|
+
// A converter list we couldn't read, or an accepted format the server
|
|
186
|
+
// doesn't describe, might have been the way in.
|
|
187
|
+
if (!converters || !accepted.every(known)) return undefined;
|
|
188
|
+
// Galaxy matches compressed datatypes by their uncompressed type
|
|
189
|
+
// (fastqsanger.bz2 fits fastq.bz2), which the class tree doesn't show.
|
|
190
|
+
if (compressed(ext) && accepted.some(compressed)) return undefined;
|
|
191
|
+
return false;
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
/** The hierarchy and converters change only with the server's config; read them once. */
|
|
196
|
+
const datatypeCache = new Map<
|
|
197
|
+
string,
|
|
198
|
+
Promise<{ accepts: InputFormats["accepts"]; complete: boolean }>
|
|
199
|
+
>();
|
|
200
|
+
|
|
201
|
+
async function readDatatypes(
|
|
202
|
+
ctx: GalaxyContext,
|
|
203
|
+
): Promise<{ accepts: InputFormats["accepts"]; complete: boolean }> {
|
|
204
|
+
const mapping = await getDatatypesMapping(ctx);
|
|
205
|
+
// galaxy-ops answers a failed read with an empty mapping.
|
|
206
|
+
if (Object.keys(mapping.ext_to_class_name ?? {}).length === 0) {
|
|
207
|
+
return { accepts: null, complete: false };
|
|
208
|
+
}
|
|
209
|
+
let converters: Converter[] | null = null;
|
|
210
|
+
try {
|
|
211
|
+
const { data } = await ctx.client.GET("/api/datatypes/converters");
|
|
212
|
+
if (Array.isArray(data)) converters = data;
|
|
213
|
+
} catch {
|
|
214
|
+
// Unknown converters only make more pairings unknown.
|
|
215
|
+
}
|
|
216
|
+
return { accepts: datatypeAccepts(mapping, converters), complete: converters !== null };
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
export async function fetchInputFormatsWith(
|
|
220
|
+
ctx: GalaxyContext,
|
|
221
|
+
serverKey: string,
|
|
222
|
+
inputs: Proposal["inputs"],
|
|
223
|
+
): Promise<InputFormats> {
|
|
224
|
+
let pending = datatypeCache.get(serverKey);
|
|
225
|
+
if (!pending) {
|
|
226
|
+
pending = readDatatypes(ctx).catch(() => ({ accepts: null, complete: false }));
|
|
227
|
+
datatypeCache.set(serverKey, pending);
|
|
228
|
+
}
|
|
229
|
+
const { accepts, complete } = await pending;
|
|
230
|
+
// A partial read serves this proposal but isn't kept, so a blip doesn't
|
|
231
|
+
// leave every later check unable to refuse anything.
|
|
232
|
+
if (!complete) datatypeCache.delete(serverKey);
|
|
233
|
+
|
|
234
|
+
const extensions = new Map<string, string[] | null>();
|
|
235
|
+
await Promise.all(
|
|
236
|
+
inputs.map(async (input) => {
|
|
237
|
+
const key = inputKey(input);
|
|
238
|
+
if (extensions.has(key)) return;
|
|
239
|
+
extensions.set(key, null);
|
|
240
|
+
try {
|
|
241
|
+
if (input.src === "hda") {
|
|
242
|
+
const { dataset } = await getDatasetDetails(
|
|
243
|
+
{ datasetId: input.id, includePreview: false },
|
|
244
|
+
ctx,
|
|
245
|
+
);
|
|
246
|
+
const ext = dataset.extension ?? dataset.file_ext;
|
|
247
|
+
if (typeof ext === "string" && ext !== "") extensions.set(key, [ext]);
|
|
248
|
+
} else if (input.src === "hdca") {
|
|
249
|
+
const c = await getCollectionDetails({ collectionId: input.id, maxElements: 1 }, ctx);
|
|
250
|
+
const exts = c.elements_datatypes?.filter((e) => typeof e === "string" && e !== "");
|
|
251
|
+
if (exts && exts.length > 0) extensions.set(key, exts);
|
|
252
|
+
}
|
|
253
|
+
// A library dataset (ldda) isn't read here; it goes unchecked.
|
|
254
|
+
} catch {
|
|
255
|
+
// Left null: the check lists it as unchecked rather than guessing.
|
|
256
|
+
}
|
|
257
|
+
}),
|
|
258
|
+
);
|
|
259
|
+
return { extensions, accepts };
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
/** For the configured Galaxy server; null when there isn't one to ask. */
|
|
263
|
+
export function inputFormatFetcherFor(_sessionDir: string): InputFormatFetcher | null {
|
|
264
|
+
// Replayed templates stand in for a Galaxy that isn't there.
|
|
265
|
+
if (readEnv("TEMPLATE_REPLAY")?.trim()) return null;
|
|
266
|
+
return async (inputs, signal) => {
|
|
267
|
+
const ctx = galaxyOpsContext(signal);
|
|
268
|
+
if (!ctx) return { extensions: new Map(), accepts: null };
|
|
269
|
+
return fetchInputFormatsWith(ctx, ctx.baseUrl ?? "", inputs);
|
|
270
|
+
};
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
/** Test seam: forget what was read about each server's datatypes. */
|
|
274
|
+
export function resetDatatypeCache(): void {
|
|
275
|
+
datatypeCache.clear();
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
279
|
+
// Eval-only replay
|
|
280
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
281
|
+
|
|
282
|
+
/**
|
|
283
|
+
* `LOOM_TEMPLATE_REPLAY` names a JSON file inside the session directory whose
|
|
284
|
+
* keys are `<kind>:<id>` and whose values are `{body, version}` -- recorded
|
|
285
|
+
* templates, so the Tier-1 scenarios can approve without a Galaxy server.
|
|
286
|
+
*
|
|
287
|
+
* Same constraints as the submission replay: off unless set, the file must
|
|
288
|
+
* resolve inside the session directory, and every fetch it answers writes a
|
|
289
|
+
* `template.replay` activity row, so an approval frozen from a replayed
|
|
290
|
+
* template is never indistinguishable from one frozen from Galaxy. It only
|
|
291
|
+
* stands in for Galaxy's answer; consent still comes from `/approve`.
|
|
292
|
+
*/
|
|
293
|
+
const replaySnapshots = new Map<string, Record<string, unknown> | Error>();
|
|
294
|
+
|
|
295
|
+
/**
|
|
296
|
+
* Read the replay file once and keep what it said. Primed at session start,
|
|
297
|
+
* before the model has had a turn, so editing the file mid-session -- the
|
|
298
|
+
* model can write inside the session directory -- changes nothing.
|
|
299
|
+
*/
|
|
300
|
+
export function primeTemplateReplay(sessionDir: string): void {
|
|
301
|
+
const configured = readEnv("TEMPLATE_REPLAY")?.trim();
|
|
302
|
+
if (!configured) return;
|
|
303
|
+
const file = resolveReplayPath(sessionDir, configured);
|
|
304
|
+
const key = file ?? `${sessionDir}::${configured}`;
|
|
305
|
+
if (replaySnapshots.has(key)) return;
|
|
306
|
+
try {
|
|
307
|
+
if (!file) throw new Error("outside the session directory");
|
|
308
|
+
const parsed = JSON.parse(fs.readFileSync(file, "utf-8")) as unknown;
|
|
309
|
+
if (!isRecord(parsed)) throw new Error("not a JSON object");
|
|
310
|
+
replaySnapshots.set(key, parsed);
|
|
311
|
+
} catch (err) {
|
|
312
|
+
replaySnapshots.set(key, err instanceof Error ? err : new Error(String(err)));
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
export function replayTemplateFetcher(sessionDir: string): TemplateFetcher | null {
|
|
317
|
+
const configured = readEnv("TEMPLATE_REPLAY")?.trim();
|
|
318
|
+
if (!configured) return null;
|
|
319
|
+
const file = resolveReplayPath(sessionDir, configured);
|
|
320
|
+
primeTemplateReplay(sessionDir);
|
|
321
|
+
const snapshot = replaySnapshots.get(file ?? `${sessionDir}::${configured}`);
|
|
322
|
+
return async (target) => {
|
|
323
|
+
const key = `${target.kind}:${targetId(target)}`;
|
|
324
|
+
if (!snapshot || snapshot instanceof Error) {
|
|
325
|
+
throw new TemplateUnavailableError(
|
|
326
|
+
`template replay unreadable: ${snapshot instanceof Error ? snapshot.message : "not loaded"}`,
|
|
327
|
+
);
|
|
328
|
+
}
|
|
329
|
+
const entry = snapshot[key];
|
|
330
|
+
if (!isRecord(entry) || typeof entry.version !== "string" || !("body" in entry)) {
|
|
331
|
+
throw new TemplateUnavailableError(`template replay has no entry for ${key}`);
|
|
332
|
+
}
|
|
333
|
+
appendActivityEvent(sessionDir, {
|
|
334
|
+
timestamp: new Date().toISOString(),
|
|
335
|
+
kind: "template.replay",
|
|
336
|
+
source: "template-replay",
|
|
337
|
+
payload: { file: path.relative(sessionDir, file as string), key, version: entry.version },
|
|
338
|
+
});
|
|
339
|
+
return { body: structuredClone(entry.body), version: entry.version };
|
|
340
|
+
};
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
/** Replay when the eval seam is on, Galaxy otherwise. */
|
|
344
|
+
export function templateFetcherFor(sessionDir: string): TemplateFetcher {
|
|
345
|
+
return replayTemplateFetcher(sessionDir) ?? galaxyTemplateFetcher;
|
|
346
|
+
}
|