@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,326 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The Galaxy tools Orbit builds for itself: one pi tool per galaxy-ops operation, run in-process.
|
|
3
|
+
*
|
|
4
|
+
* Each tool is galaxy-ops' own: its name is the operation's wire name, its description is the
|
|
5
|
+
* line galaxy-ops gives that operation, and every parameter carries its zod field's description,
|
|
6
|
+
* so the model reads what galaxy-ops' TypeScript server would advertise. Parameters are snake_case
|
|
7
|
+
* at the top level and mapped back to the operation's camelCase input before it runs.
|
|
8
|
+
*
|
|
9
|
+
* The schema is plain JSON schema, not TypeBox: pi validates a schema without TypeBox's Kind
|
|
10
|
+
* symbol by coercing values at every depth, which is what the MCP tools these replace always got.
|
|
11
|
+
*
|
|
12
|
+
* `@galaxyproject/galaxy-ops` is imported bare, so Node resolves the 45-operation entry and a
|
|
13
|
+
* bundler's `browser` condition the 42-operation one, with no code change here.
|
|
14
|
+
*/
|
|
15
|
+
import type { AgentToolResult } from "@earendil-works/pi-coding-agent";
|
|
16
|
+
import type { TSchema } from "@sinclair/typebox";
|
|
17
|
+
import { Type } from "@sinclair/typebox";
|
|
18
|
+
import * as galaxyOps from "@galaxyproject/galaxy-ops";
|
|
19
|
+
import {
|
|
20
|
+
allOperations,
|
|
21
|
+
describeOperation,
|
|
22
|
+
isPlainObject,
|
|
23
|
+
laxenLikePydantic,
|
|
24
|
+
runWithEnvelope,
|
|
25
|
+
spellParamNames,
|
|
26
|
+
type AnyOperation,
|
|
27
|
+
} from "@galaxyproject/galaxy-ops";
|
|
28
|
+
import { getJobDetailsBridge, getJobLogsBridge, listJobsBridge } from "./galaxy-job-ops";
|
|
29
|
+
import { GALAXY_OP_POLICY, type GalaxyOpArgs, type GalaxyOpPolicy } from "./galaxy-op-policy";
|
|
30
|
+
import { inspectOutput, type OutputQuery } from "./galaxy-output";
|
|
31
|
+
import { galaxyOutputStore } from "./galaxy-output-store";
|
|
32
|
+
import { getPageBridge, updatePageBridge } from "./galaxy-page-ops";
|
|
33
|
+
import type { GalaxyTool, GalaxyToolSource } from "./galaxy-tool-source";
|
|
34
|
+
import {
|
|
35
|
+
GALAXY_ENVELOPE_SCHEMA,
|
|
36
|
+
galaxyFailure,
|
|
37
|
+
renderGalaxyResult,
|
|
38
|
+
runGalaxyCall,
|
|
39
|
+
type GalaxyCallDetails,
|
|
40
|
+
type GalaxyContextFactory,
|
|
41
|
+
type GalaxyEnvelope,
|
|
42
|
+
} from "./galaxy-tool-wrap";
|
|
43
|
+
|
|
44
|
+
/** galaxy-ops' camelCase input key as the wire spells it; the same regex the TS server uses. */
|
|
45
|
+
export const snake = (key: string) => key.replace(/([a-z0-9])([A-Z])/g, "$1_$2").toLowerCase();
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* What a zod 4 field offers, without naming zod: root resolves zod 3, and galaxy-ops' fields are
|
|
49
|
+
* its own nested zod 4 instances, so the source talks to each field through its own methods.
|
|
50
|
+
*/
|
|
51
|
+
interface ZodField {
|
|
52
|
+
toJSONSchema(params: { io: "input" }): Record<string, unknown>;
|
|
53
|
+
safeParse(
|
|
54
|
+
value: unknown,
|
|
55
|
+
):
|
|
56
|
+
{ success: true; data: unknown } | { success: false; error: { issues: { message: string }[] } };
|
|
57
|
+
description?: string;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
const fieldsOf = (op: AnyOperation) => Object.entries(op.input) as unknown as [string, ZodField][];
|
|
61
|
+
|
|
62
|
+
export interface RenderedOperation {
|
|
63
|
+
parameters: {
|
|
64
|
+
type: "object";
|
|
65
|
+
properties: Record<string, Record<string, unknown>>;
|
|
66
|
+
required?: string[];
|
|
67
|
+
additionalProperties: false;
|
|
68
|
+
};
|
|
69
|
+
/** The operation's fields under their wire names, for laxenLikePydantic. */
|
|
70
|
+
snakeShape: AnyOperation["input"];
|
|
71
|
+
/** The model's snake_case arguments under the operation's own keys; unknown keys pass through. */
|
|
72
|
+
inputOf(args: GalaxyOpArgs): GalaxyOpArgs;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* An operation's input as JSON schema, rendered field by field. The result equals
|
|
77
|
+
* `z.toJSONSchema(z.strictObject(op.input), { io: "input" })` with snake_case keys, which the
|
|
78
|
+
* tests pin against galaxy-ops' own zod.
|
|
79
|
+
*/
|
|
80
|
+
export function renderOperation(op: AnyOperation): RenderedOperation {
|
|
81
|
+
const properties: Record<string, Record<string, unknown>> = {};
|
|
82
|
+
const required: string[] = [];
|
|
83
|
+
const snakeShape: Record<string, unknown> = {};
|
|
84
|
+
const toInput = new Map<string, string>();
|
|
85
|
+
for (const [key, field] of fieldsOf(op)) {
|
|
86
|
+
const { $schema: _dialect, ...schema } = field.toJSONSchema({ io: "input" });
|
|
87
|
+
properties[snake(key)] = schema;
|
|
88
|
+
if (!field.safeParse(undefined).success) required.push(snake(key));
|
|
89
|
+
snakeShape[snake(key)] = field;
|
|
90
|
+
toInput.set(snake(key), key);
|
|
91
|
+
}
|
|
92
|
+
return {
|
|
93
|
+
parameters: {
|
|
94
|
+
type: "object",
|
|
95
|
+
properties,
|
|
96
|
+
...(required.length > 0 ? { required } : {}),
|
|
97
|
+
additionalProperties: false,
|
|
98
|
+
},
|
|
99
|
+
snakeShape: snakeShape as AnyOperation["input"],
|
|
100
|
+
inputOf: (args) =>
|
|
101
|
+
Object.fromEntries(Object.entries(args).map(([k, v]) => [toInput.get(k) ?? k, v])),
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
export type ParsedInput = { ok: true; input: GalaxyOpArgs } | { ok: false; message: string };
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* The operation's input as galaxy-ops' zod would parse it: each present field parsed (so a
|
|
109
|
+
* field's transform runs), each absent field given its default. runWithEnvelope does neither,
|
|
110
|
+
* and the MCP servers this replaces did both. A missing required key is left to Galaxy: pi has
|
|
111
|
+
* already enforced the schema's `required`, and a bridging op may relax it.
|
|
112
|
+
*/
|
|
113
|
+
export function parseInput(op: AnyOperation, input: GalaxyOpArgs): ParsedInput {
|
|
114
|
+
const out: GalaxyOpArgs = { ...input };
|
|
115
|
+
for (const [key, field] of fieldsOf(op)) {
|
|
116
|
+
if (input[key] === undefined) {
|
|
117
|
+
const r = field.safeParse(undefined);
|
|
118
|
+
if (r.success && r.data !== undefined) out[key] = r.data;
|
|
119
|
+
continue;
|
|
120
|
+
}
|
|
121
|
+
const r = field.safeParse(input[key]);
|
|
122
|
+
if (!r.success) {
|
|
123
|
+
const issue = r.error.issues[0]?.message ?? "invalid value";
|
|
124
|
+
return { ok: false, message: `Invalid arguments for ${op.name}: ${snake(key)}: ${issue}` };
|
|
125
|
+
}
|
|
126
|
+
out[key] = r.data;
|
|
127
|
+
}
|
|
128
|
+
return { ok: true, input: out };
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
// The envelope's `data` is whatever Galaxy sent, which pi's JsonValue cannot spell.
|
|
132
|
+
const asToolResult = (result: ReturnType<typeof renderGalaxyResult>) =>
|
|
133
|
+
result as unknown as AgentToolResult<GalaxyCallDetails>;
|
|
134
|
+
|
|
135
|
+
const NAMESPACE = Object.freeze({
|
|
136
|
+
name: "galaxy",
|
|
137
|
+
description: "Galaxy operations, run in-process through galaxy-ops",
|
|
138
|
+
instructions:
|
|
139
|
+
"Galaxy ids are the encoded strings Galaxy returns; pass them back exactly, never shortened or invented. Listing tools return one page at a time: pass pagination.next_offset as offset for the next page.",
|
|
140
|
+
});
|
|
141
|
+
|
|
142
|
+
export interface ToolFromOperationOptions {
|
|
143
|
+
policy?: GalaxyOpPolicy;
|
|
144
|
+
/** Bridging ops replace the rendered schema, description or key mapping; nothing else does. */
|
|
145
|
+
parameters?: RenderedOperation["parameters"];
|
|
146
|
+
description?: string;
|
|
147
|
+
inputOf?: (args: GalaxyOpArgs) => GalaxyOpArgs;
|
|
148
|
+
context?: GalaxyContextFactory;
|
|
149
|
+
deadlineMs?: number;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/** One galaxy-ops operation as a pi tool: rendered schema, lax arguments, the shared wrapper. */
|
|
153
|
+
export function toolFromOperation(
|
|
154
|
+
op: AnyOperation,
|
|
155
|
+
opts: ToolFromOperationOptions = {},
|
|
156
|
+
): GalaxyTool {
|
|
157
|
+
const rendered = renderOperation(op);
|
|
158
|
+
const inputOf = opts.inputOf ?? rendered.inputOf;
|
|
159
|
+
const policy = opts.policy;
|
|
160
|
+
const invalid = (message: string) => galaxyFailure(message, "validation");
|
|
161
|
+
return {
|
|
162
|
+
name: op.name,
|
|
163
|
+
label: op.name,
|
|
164
|
+
description: opts.description ?? spellParamNames(describeOperation(op), op.input, snake),
|
|
165
|
+
parameters: (opts.parameters ?? rendered.parameters) as unknown as TSchema,
|
|
166
|
+
// The MCP servers decode ints and bools the way pydantic does ("5", "yes", "off"); keeping
|
|
167
|
+
// every spelling they accepted means a model's habits carry over.
|
|
168
|
+
prepareArguments: (args: unknown) =>
|
|
169
|
+
isPlainObject(args) ? laxenLikePydantic(rendered.snakeShape, args) : args,
|
|
170
|
+
annotations: { readOnlyHint: op.readOnly !== false, destructiveHint: op.destructive === true },
|
|
171
|
+
// upload_file stays registered so the family knows the name; the local upload tool is the
|
|
172
|
+
// model's way in, as it was under the MCP server.
|
|
173
|
+
exposure: op.name === "upload_file" ? "hidden" : "direct",
|
|
174
|
+
namespace: NAMESPACE,
|
|
175
|
+
outputSchema: GALAXY_ENVELOPE_SCHEMA as unknown as TSchema,
|
|
176
|
+
async execute(_toolCallId, params: GalaxyOpArgs, signal) {
|
|
177
|
+
const upfront = parseInput(op, inputOf(params));
|
|
178
|
+
if (!upfront.ok)
|
|
179
|
+
return asToolResult(renderGalaxyResult(op.name, invalid(upfront.message), 0));
|
|
180
|
+
const result = await runGalaxyCall(
|
|
181
|
+
op.name,
|
|
182
|
+
signal,
|
|
183
|
+
async (ctx, joined): Promise<GalaxyEnvelope> => {
|
|
184
|
+
// Inside the deadline: a policy that asks Galaxy something must not outlive the call.
|
|
185
|
+
const refusal = await policy?.check?.(params, { signal: joined });
|
|
186
|
+
if (refusal !== undefined) return invalid(refusal);
|
|
187
|
+
const run = async (sent?: GalaxyOpArgs): Promise<GalaxyEnvelope> => {
|
|
188
|
+
// A check or lock wait that outlasted the deadline has already been reported as an
|
|
189
|
+
// unknown result; sending the request now could submit work the model then retries.
|
|
190
|
+
joined.throwIfAborted();
|
|
191
|
+
const parsed = sent === undefined ? upfront : parseInput(op, inputOf(sent));
|
|
192
|
+
if (!parsed.ok) return invalid(parsed.message);
|
|
193
|
+
return runWithEnvelope(op, parsed.input as never, ctx);
|
|
194
|
+
};
|
|
195
|
+
const env = policy?.around
|
|
196
|
+
? await policy.around(run, params, { signal: joined })
|
|
197
|
+
: await run();
|
|
198
|
+
if (env.success === false && policy?.refused) {
|
|
199
|
+
const message = policy.refused(String(env.message ?? ""), params);
|
|
200
|
+
if (message !== undefined) return { ...env, message };
|
|
201
|
+
}
|
|
202
|
+
return env;
|
|
203
|
+
},
|
|
204
|
+
{ deadlineMs: opts.deadlineMs, context: opts.context },
|
|
205
|
+
);
|
|
206
|
+
return asToolResult(result);
|
|
207
|
+
},
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
/** Orbit's reader for a spilled Galaxy output. Registered beside the family, not in it. */
|
|
212
|
+
export function galaxyReadOutputTool(): GalaxyTool {
|
|
213
|
+
return {
|
|
214
|
+
name: "galaxy_read_output",
|
|
215
|
+
label: "Inspect saved Galaxy output",
|
|
216
|
+
description:
|
|
217
|
+
"Read/search an oversized Galaxy response already returned in this session. Use the outputId from its preview. Saved outputs live in memory for this session only, and only those are readable. JSON Pointer selects a field; query searches literal text in scalar fields; offset/limit page results. User-defined tool catalogs default to identity/name/version/container summaries; query searches their metadata, and definitionPointer selects a full definition for inspection. Object previews may omit fields: use their pointers to inspect exact values. Text offsets are characters, not lines. Continue the authorized task without asking the user to inspect the output.",
|
|
218
|
+
parameters: Type.Object({
|
|
219
|
+
outputId: Type.String(),
|
|
220
|
+
pointer: Type.Optional(Type.String({ maxLength: 2000 })),
|
|
221
|
+
query: Type.Optional(Type.String({ minLength: 1, maxLength: 200 })),
|
|
222
|
+
offset: Type.Optional(Type.Integer({ minimum: 0 })),
|
|
223
|
+
limit: Type.Optional(Type.Integer({ minimum: 1, maximum: 20 })),
|
|
224
|
+
}),
|
|
225
|
+
annotations: { readOnlyHint: true },
|
|
226
|
+
async execute(_toolCallId, args: OutputQuery, signal) {
|
|
227
|
+
signal?.throwIfAborted();
|
|
228
|
+
const text = galaxyOutputStore().get(args.outputId);
|
|
229
|
+
if (text === undefined) {
|
|
230
|
+
throw new Error(
|
|
231
|
+
`Galaxy output ${args.outputId} is no longer available: saved outputs live in memory for this session only. Call the original tool again with a narrower request.`,
|
|
232
|
+
);
|
|
233
|
+
}
|
|
234
|
+
let page: Record<string, unknown>;
|
|
235
|
+
try {
|
|
236
|
+
page = inspectOutput(text, args);
|
|
237
|
+
} catch (error) {
|
|
238
|
+
// pi turns a throw into an error result; returning one would read as a success.
|
|
239
|
+
throw new Error(
|
|
240
|
+
`Galaxy output inspection failed: ${error instanceof Error ? error.message : String(error)}. Do not infer missing results or repeat a submission.`,
|
|
241
|
+
{ cause: error },
|
|
242
|
+
);
|
|
243
|
+
}
|
|
244
|
+
return { content: [{ type: "text", text: JSON.stringify(page) }], details: {} };
|
|
245
|
+
},
|
|
246
|
+
};
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
/**
|
|
250
|
+
* Which galaxy-ops entry this module loaded. The browser conformance test asserts it saw the
|
|
251
|
+
* 42-operation browser entry, so a resolution that silently picks the Node entry cannot pass.
|
|
252
|
+
* `in` rather than a read: vitest's mocked namespace throws on reading an export it lacks.
|
|
253
|
+
*/
|
|
254
|
+
export function galaxyOpsEntry(): { operations: readonly string[]; hasUploadFile: boolean } {
|
|
255
|
+
return {
|
|
256
|
+
operations: galaxyOps.allOperations.map((op) => op.name),
|
|
257
|
+
hasUploadFile: "uploadFileOp" in galaxyOps,
|
|
258
|
+
};
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
/**
|
|
262
|
+
* An operation Orbit supplies because galaxy-ops does not have it yet, in galaxy-ops' own shape.
|
|
263
|
+
* It runs through the same wrapper as every operation; only its tool's words and schema may
|
|
264
|
+
* differ from what the operation would render on its own.
|
|
265
|
+
*/
|
|
266
|
+
export interface GalaxyBridge {
|
|
267
|
+
op: AnyOperation;
|
|
268
|
+
/** A sentence after galaxy-ops' own description of the operation, saying what the bridge adds. */
|
|
269
|
+
note?: string;
|
|
270
|
+
parameters?: RenderedOperation["parameters"];
|
|
271
|
+
inputOf?: (args: GalaxyOpArgs) => GalaxyOpArgs;
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
/** Bridges that widen an operation the entry has, and replace it under the same name. */
|
|
275
|
+
const WIDENED: readonly GalaxyBridge[] = [getJobDetailsBridge, getPageBridge, updatePageBridge];
|
|
276
|
+
/**
|
|
277
|
+
* Bridges with a name galaxy-ops lacks, registered after the operations. When galaxy-ops ships
|
|
278
|
+
* one, registration refuses the duplicate name, which is the cue to delete the bridge.
|
|
279
|
+
*/
|
|
280
|
+
const ADDED: readonly GalaxyBridge[] = [listJobsBridge, getJobLogsBridge];
|
|
281
|
+
|
|
282
|
+
function bridgeTool(bridge: GalaxyBridge, policy: GalaxyOpPolicy | undefined): GalaxyTool {
|
|
283
|
+
const { op, note } = bridge;
|
|
284
|
+
return toolFromOperation(op, {
|
|
285
|
+
policy,
|
|
286
|
+
parameters: bridge.parameters,
|
|
287
|
+
inputOf: bridge.inputOf,
|
|
288
|
+
...(note === undefined
|
|
289
|
+
? {}
|
|
290
|
+
: { description: `${spellParamNames(describeOperation(op), op.input, snake)} ${note}` }),
|
|
291
|
+
});
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
export interface GalaxyOpsToolSourceOptions {
|
|
295
|
+
/** Tools the shell supplies because its galaxy-ops entry lacks them; appended as given. */
|
|
296
|
+
extras?: readonly GalaxyTool[];
|
|
297
|
+
policies?: Record<string, GalaxyOpPolicy>;
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
/**
|
|
301
|
+
* Orbit's default Galaxy tool source: every operation of the loaded galaxy-ops entry, the widened
|
|
302
|
+
* ones replaced by their bridges, then the added bridges, then the shell's extras.
|
|
303
|
+
*/
|
|
304
|
+
export function createGalaxyOpsToolSource(
|
|
305
|
+
options: GalaxyOpsToolSourceOptions = {},
|
|
306
|
+
): GalaxyToolSource {
|
|
307
|
+
const policies = options.policies ?? GALAXY_OP_POLICY;
|
|
308
|
+
return {
|
|
309
|
+
tools() {
|
|
310
|
+
// A snapshot: allOperations is one array both entries share, and grows when the other loads.
|
|
311
|
+
const ops = [...allOperations];
|
|
312
|
+
const widened = new Map(WIDENED.map((bridge) => [bridge.op.name, bridge]));
|
|
313
|
+
return [
|
|
314
|
+
...ops.map((op) => {
|
|
315
|
+
const bridge = widened.get(op.name);
|
|
316
|
+
return bridge
|
|
317
|
+
? bridgeTool(bridge, policies[op.name])
|
|
318
|
+
: toolFromOperation(op, { policy: policies[op.name] });
|
|
319
|
+
}),
|
|
320
|
+
...ADDED.map((bridge) => bridgeTool(bridge, policies[bridge.op.name])),
|
|
321
|
+
...(options.extras ?? []),
|
|
322
|
+
];
|
|
323
|
+
},
|
|
324
|
+
companions: () => [galaxyReadOutputTool()],
|
|
325
|
+
};
|
|
326
|
+
}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Where an oversized Galaxy result waits for `galaxy_read_output`.
|
|
3
|
+
*
|
|
4
|
+
* galaxy-ops runs in the same heap as the tool that reads its output back, so a spill needs no
|
|
5
|
+
* temp file: the full text stays in a bounded ring of recent outputs, and the model gets an id.
|
|
6
|
+
* Lookups are by that id only, never by a path the model supplies. The ring does not survive a
|
|
7
|
+
* restart; `galaxy_read_output` tells the model to call the tool again when an id is gone.
|
|
8
|
+
*
|
|
9
|
+
* `setGalaxyOutputStore` is a seam for a shell that wants persistence. Nothing installs one.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import { utf8ByteLength } from "../../shared/truncate-middle.js";
|
|
13
|
+
import { ulid } from "./ulid";
|
|
14
|
+
|
|
15
|
+
export interface GalaxyOutputEntry {
|
|
16
|
+
id: string;
|
|
17
|
+
tool: string;
|
|
18
|
+
bytes: number;
|
|
19
|
+
at: number;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export interface GalaxyOutputStore {
|
|
23
|
+
put(text: string, tool: string): string;
|
|
24
|
+
get(id: string): string | undefined;
|
|
25
|
+
/** Oldest first. */
|
|
26
|
+
list(): readonly GalaxyOutputEntry[];
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export interface GalaxyOutputLimits {
|
|
30
|
+
entries: number;
|
|
31
|
+
bytes: number;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export const DEFAULT_OUTPUT_LIMITS: Readonly<GalaxyOutputLimits> = Object.freeze({
|
|
35
|
+
entries: 32,
|
|
36
|
+
bytes: 64 * 1024 * 1024,
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
export function createMemoryOutputStore(
|
|
40
|
+
limits: GalaxyOutputLimits = DEFAULT_OUTPUT_LIMITS,
|
|
41
|
+
): GalaxyOutputStore {
|
|
42
|
+
// A Map iterates in insertion order, so its first key is always the oldest entry.
|
|
43
|
+
const entries = new Map<string, GalaxyOutputEntry & { text: string }>();
|
|
44
|
+
let total = 0;
|
|
45
|
+
return {
|
|
46
|
+
put(text, tool) {
|
|
47
|
+
const bytes = utf8ByteLength(text);
|
|
48
|
+
// An entry over the byte cap still evicts everything else and is kept alone: dropping it
|
|
49
|
+
// would leave the model a preview whose outputId resolves to nothing.
|
|
50
|
+
while (entries.size > 0 && (entries.size >= limits.entries || total + bytes > limits.bytes)) {
|
|
51
|
+
const [oldest, entry] = entries.entries().next().value!;
|
|
52
|
+
entries.delete(oldest);
|
|
53
|
+
total -= entry.bytes;
|
|
54
|
+
}
|
|
55
|
+
const id = ulid();
|
|
56
|
+
entries.set(id, { id, tool, bytes, at: Date.now(), text });
|
|
57
|
+
total += bytes;
|
|
58
|
+
return id;
|
|
59
|
+
},
|
|
60
|
+
get(id) {
|
|
61
|
+
return entries.get(id)?.text;
|
|
62
|
+
},
|
|
63
|
+
list() {
|
|
64
|
+
return [...entries.values()].map(({ id, tool, bytes, at }) => ({ id, tool, bytes, at }));
|
|
65
|
+
},
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
let current: GalaxyOutputStore | null = null;
|
|
70
|
+
|
|
71
|
+
/** The installed store, or the default in-memory ring, created on first use. */
|
|
72
|
+
export function galaxyOutputStore(): GalaxyOutputStore {
|
|
73
|
+
current ??= createMemoryOutputStore();
|
|
74
|
+
return current;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/** Install a store; `null` drops it so the next use creates a fresh default ring. */
|
|
78
|
+
export function setGalaxyOutputStore(store: GalaxyOutputStore | null): void {
|
|
79
|
+
current = store;
|
|
80
|
+
}
|