@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,346 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Inspect a saved Galaxy response without putting all of it back into model context: JSON Pointer
|
|
3
|
+
* selection, literal search over scalar fields, paging, and a summary view of user-defined tool
|
|
4
|
+
* catalogs. Pure string-in, object-out, so the same code serves Orbit and the browser worker.
|
|
5
|
+
*
|
|
6
|
+
* Kept apart from mcp-output.ts, whose file reader pulls in Node-only modules: that file's
|
|
7
|
+
* `mcp_read_output` (other MCP servers, such as brc-analytics) and galaxy-ops-tools.ts'
|
|
8
|
+
* `galaxy_read_output` both inspect through this module.
|
|
9
|
+
*/
|
|
10
|
+
import { truncateMiddle, utf8ByteLength } from "../../shared/truncate-middle.js";
|
|
11
|
+
|
|
12
|
+
const PAGE_BYTES = 12 * 1024;
|
|
13
|
+
export type Recordish = Record<string, unknown>;
|
|
14
|
+
export function record(value: unknown): Recordish | undefined {
|
|
15
|
+
return value !== null && typeof value === "object" && !Array.isArray(value)
|
|
16
|
+
? (value as Recordish)
|
|
17
|
+
: undefined;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export interface OutputQuery {
|
|
21
|
+
outputId: string;
|
|
22
|
+
pointer?: string;
|
|
23
|
+
query?: string;
|
|
24
|
+
offset?: number;
|
|
25
|
+
limit?: number;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
function pointerPart(key: string): string {
|
|
29
|
+
return key.replace(/~/g, "~0").replace(/\//g, "~1");
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/** A bounded, explicitly lossy preview, never an apparently complete object. */
|
|
33
|
+
function preview(value: unknown, depth = 0): unknown {
|
|
34
|
+
if (typeof value === "string") {
|
|
35
|
+
return value.length <= 300
|
|
36
|
+
? value
|
|
37
|
+
: { preview: value.slice(0, 300), characters: value.length, omitted: true };
|
|
38
|
+
}
|
|
39
|
+
if (Array.isArray(value)) return { type: "array", items: value.length, omitted: true };
|
|
40
|
+
const obj = record(value);
|
|
41
|
+
if (!obj) return value;
|
|
42
|
+
const keys = Object.keys(obj);
|
|
43
|
+
if (depth >= 1) return { type: "object", keys: keys.slice(0, 12), omitted: true };
|
|
44
|
+
return {
|
|
45
|
+
fields: Object.fromEntries(keys.slice(0, 12).map((key) => [key, preview(obj[key], depth + 1)])),
|
|
46
|
+
omitted: keys.length > 12,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
function select(root: unknown, pointer: string): unknown {
|
|
51
|
+
if (!pointer) return root;
|
|
52
|
+
if (!pointer.startsWith("/") || /~(?![01])/u.test(pointer))
|
|
53
|
+
throw new Error("Use a JSON Pointer, for example /data/0.");
|
|
54
|
+
let value = root;
|
|
55
|
+
for (const part of pointer.slice(1).split("/")) {
|
|
56
|
+
const key = part.replace(/~1/g, "/").replace(/~0/g, "~");
|
|
57
|
+
if (value === null || typeof value !== "object" || !Object.hasOwn(value, key))
|
|
58
|
+
throw new Error(`JSON Pointer does not exist: ${pointer}`);
|
|
59
|
+
value = (value as Recordish)[key];
|
|
60
|
+
}
|
|
61
|
+
return value;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/** Search scalar fields, not serialized ancestors (which would match whole catalogs). */
|
|
65
|
+
function* matches(
|
|
66
|
+
value: unknown,
|
|
67
|
+
pointer: string,
|
|
68
|
+
query: string,
|
|
69
|
+
): Generator<{ pointer: string; value: unknown }> {
|
|
70
|
+
const stack = [{ pointer, value }];
|
|
71
|
+
let visited = 0;
|
|
72
|
+
while (stack.length) {
|
|
73
|
+
if (++visited > 100_000)
|
|
74
|
+
throw new Error("Search scope too large; select a narrower JSON Pointer.");
|
|
75
|
+
const item = stack.pop()!;
|
|
76
|
+
const obj = record(item.value);
|
|
77
|
+
if (
|
|
78
|
+
obj &&
|
|
79
|
+
Object.values(obj).some(
|
|
80
|
+
(v) =>
|
|
81
|
+
(typeof v === "string" || typeof v === "number") &&
|
|
82
|
+
String(v).toLowerCase().includes(query),
|
|
83
|
+
)
|
|
84
|
+
) {
|
|
85
|
+
yield item;
|
|
86
|
+
} else if (typeof item.value === "string" && item.value.toLowerCase().includes(query)) {
|
|
87
|
+
yield item;
|
|
88
|
+
}
|
|
89
|
+
if (item.value !== null && typeof item.value === "object") {
|
|
90
|
+
const entries = Object.entries(item.value);
|
|
91
|
+
for (let i = entries.length - 1; i >= 0; i--) {
|
|
92
|
+
const [key, child] = entries[i];
|
|
93
|
+
// Object scalar fields were checked together above; retain their parent IDs.
|
|
94
|
+
if ((child !== null && typeof child === "object") || Array.isArray(item.value)) {
|
|
95
|
+
stack.push({ pointer: `${item.pointer}/${pointerPart(key)}`, value: child });
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/** Catalog discovery needs identity fields, not every tool's embedded script. */
|
|
103
|
+
function userToolCatalog(root: unknown, args: OutputQuery): Recordish | undefined {
|
|
104
|
+
const response = record(root);
|
|
105
|
+
const tools = response?.data;
|
|
106
|
+
if (
|
|
107
|
+
!response ||
|
|
108
|
+
response.success === false ||
|
|
109
|
+
(args.pointer && args.pointer !== "/data") ||
|
|
110
|
+
!Array.isArray(tools) ||
|
|
111
|
+
tools.length === 0 ||
|
|
112
|
+
!tools.every((tool) => {
|
|
113
|
+
const row = record(tool);
|
|
114
|
+
return (
|
|
115
|
+
row?.tool_format === "GalaxyUserTool" &&
|
|
116
|
+
typeof row.id === "string" &&
|
|
117
|
+
typeof row.uuid === "string" &&
|
|
118
|
+
typeof row.tool_id === "string" &&
|
|
119
|
+
record(row.representation)
|
|
120
|
+
);
|
|
121
|
+
})
|
|
122
|
+
)
|
|
123
|
+
return;
|
|
124
|
+
|
|
125
|
+
const query = args.query?.toLowerCase();
|
|
126
|
+
const offset = Math.max(0, Math.floor(args.offset ?? 0));
|
|
127
|
+
const limit = Math.max(1, Math.min(20, Math.floor(args.limit ?? 10)));
|
|
128
|
+
const items: Recordish[] = [];
|
|
129
|
+
let totalItems = 0;
|
|
130
|
+
let bytes = 0;
|
|
131
|
+
let more = false;
|
|
132
|
+
for (const [index, tool] of tools.entries()) {
|
|
133
|
+
const definition = tool.representation as Recordish;
|
|
134
|
+
const fields = {
|
|
135
|
+
id: tool.id,
|
|
136
|
+
uuid: tool.uuid,
|
|
137
|
+
tool_id: tool.tool_id,
|
|
138
|
+
name: definition.name,
|
|
139
|
+
version: definition.version,
|
|
140
|
+
description: definition.description,
|
|
141
|
+
container: definition.container,
|
|
142
|
+
active: tool.active,
|
|
143
|
+
hidden: tool.hidden,
|
|
144
|
+
};
|
|
145
|
+
if (
|
|
146
|
+
query &&
|
|
147
|
+
!Object.values(fields).some(
|
|
148
|
+
(value) => typeof value === "string" && value.toLowerCase().includes(query),
|
|
149
|
+
)
|
|
150
|
+
)
|
|
151
|
+
continue;
|
|
152
|
+
if (totalItems++ < offset) continue;
|
|
153
|
+
const item = {
|
|
154
|
+
pointer: `/data/${index}`,
|
|
155
|
+
definitionPointer: `/data/${index}/representation`,
|
|
156
|
+
...Object.fromEntries(Object.entries(fields).map(([key, value]) => [key, preview(value)])),
|
|
157
|
+
};
|
|
158
|
+
const size = utf8ByteLength(JSON.stringify(item));
|
|
159
|
+
if (more || items.length >= limit || bytes + size > PAGE_BYTES) {
|
|
160
|
+
more = true;
|
|
161
|
+
continue;
|
|
162
|
+
}
|
|
163
|
+
items.push(item);
|
|
164
|
+
bytes += size;
|
|
165
|
+
}
|
|
166
|
+
if (more && items.length === 0)
|
|
167
|
+
throw new Error("Catalog entry exceeds the preview budget; select its exact JSON Pointer.");
|
|
168
|
+
return {
|
|
169
|
+
outputId: args.outputId,
|
|
170
|
+
pointer: "/data",
|
|
171
|
+
type: "user_tool_catalog",
|
|
172
|
+
offset,
|
|
173
|
+
totalItems,
|
|
174
|
+
responseItems: tools.length,
|
|
175
|
+
sourceCount: preview(response.count),
|
|
176
|
+
sourcePagination: preview(response.pagination),
|
|
177
|
+
galaxyPage: galaxyPage(response.pagination, tools.length),
|
|
178
|
+
items,
|
|
179
|
+
nextOffset: more ? offset + items.length : null,
|
|
180
|
+
definitionsOmitted: true,
|
|
181
|
+
searchScope: "tool identity, name, version, description, container, not command bodies",
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
function count(value: unknown): number | undefined {
|
|
186
|
+
return Number.isInteger(value) && (value as number) >= 0 ? (value as number) : undefined;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
/**
|
|
190
|
+
* Galaxy's pagination block, keeping only fields consistent with this response. next_offset is
|
|
191
|
+
* used as given, never offset + limit: Galaxy's output budget can cut a page short of `limit`,
|
|
192
|
+
* so that would skip records.
|
|
193
|
+
*/
|
|
194
|
+
function galaxyPage(pagination: unknown, returned: number): Recordish | null {
|
|
195
|
+
const source = record(pagination);
|
|
196
|
+
if (!source) return null;
|
|
197
|
+
const offset = count(source.offset);
|
|
198
|
+
let total = count(source.total_items);
|
|
199
|
+
if (total !== undefined && total < (offset ?? 0) + returned) total = undefined;
|
|
200
|
+
let hasNext = typeof source.has_next === "boolean" ? source.has_next : undefined;
|
|
201
|
+
if (total !== undefined && offset !== undefined) {
|
|
202
|
+
const more = offset + returned < total;
|
|
203
|
+
// A has_next that contradicts the total proves nothing either way.
|
|
204
|
+
hasNext = hasNext === undefined || hasNext === more ? more : undefined;
|
|
205
|
+
}
|
|
206
|
+
let nextOffset = hasNext ? count(source.next_offset) : undefined;
|
|
207
|
+
// Backwards would loop the model on one page; past the total would skip records.
|
|
208
|
+
if (
|
|
209
|
+
nextOffset !== undefined &&
|
|
210
|
+
((offset !== undefined && nextOffset <= offset) || (total !== undefined && nextOffset >= total))
|
|
211
|
+
)
|
|
212
|
+
nextOffset = undefined;
|
|
213
|
+
return {
|
|
214
|
+
totalItems: total ?? null,
|
|
215
|
+
offset: offset ?? null,
|
|
216
|
+
hasNext: hasNext ?? null,
|
|
217
|
+
nextOffset: nextOffset ?? null,
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
/** The tool that reads a spilled response back: galaxy-ops' ring or pi's MCP file store. */
|
|
222
|
+
export type OutputReadTool = "galaxy_read_output" | "mcp_read_output";
|
|
223
|
+
|
|
224
|
+
/** The first line the model reads, so it must never call a partial page complete. */
|
|
225
|
+
export function catalogHeadline(page: Recordish, readTool: OutputReadTool): string {
|
|
226
|
+
const shown = (page.items as unknown[]).length;
|
|
227
|
+
const galaxy = record(page.galaxyPage);
|
|
228
|
+
const total = count(galaxy?.totalItems);
|
|
229
|
+
const offset = count(galaxy?.offset);
|
|
230
|
+
const unread = count(page.nextOffset);
|
|
231
|
+
const parts = [
|
|
232
|
+
total === undefined
|
|
233
|
+
? `User-defined tools: showing ${shown} of ${page.responseItems} tools in this response.`
|
|
234
|
+
: `User-defined tools: showing ${shown} of ${total}${offset === undefined ? "" : ` (Galaxy offset ${offset})`}.`,
|
|
235
|
+
];
|
|
236
|
+
if (unread !== undefined)
|
|
237
|
+
parts.push(
|
|
238
|
+
`This response holds ${page.responseItems}; read the rest first with ${readTool} offset=${unread}.`,
|
|
239
|
+
);
|
|
240
|
+
if (galaxy?.hasNext === true) {
|
|
241
|
+
const next = count(galaxy.nextOffset);
|
|
242
|
+
parts.push(
|
|
243
|
+
`More pages exist in Galaxy -- ${unread === undefined ? "" : "after that, "}re-call the Galaxy tool with ${next === undefined ? "a later offset" : `offset=${next}`}.`,
|
|
244
|
+
);
|
|
245
|
+
} else if (galaxy?.hasNext === false) parts.push("This is Galaxy's last page.");
|
|
246
|
+
else if (total === undefined)
|
|
247
|
+
parts.push("Galaxy did not report a total, so other pages may exist.");
|
|
248
|
+
else parts.push("Galaxy did not say whether more pages exist.");
|
|
249
|
+
parts.push("Full definitions are available on demand.");
|
|
250
|
+
return parts.join(" ");
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
/** Guidance for the model once a response turned out to be a user-defined tool catalog. */
|
|
254
|
+
export const CATALOG_NEXT_STEPS =
|
|
255
|
+
"Search tool names/IDs/descriptions with query, or page this catalog by passing its nextOffset as offset. Use a tool's definitionPointer to inspect its inputs, outputs or command only when needed. These are summaries of this response, not proof that Galaxy has no other pages.";
|
|
256
|
+
|
|
257
|
+
export function inspectOutput(text: string, args: OutputQuery): Recordish {
|
|
258
|
+
const offset = Math.max(0, Math.floor(args.offset ?? 0));
|
|
259
|
+
const limit = Math.max(1, Math.min(20, Math.floor(args.limit ?? 10)));
|
|
260
|
+
const pointer = args.pointer ?? "";
|
|
261
|
+
let root: unknown;
|
|
262
|
+
try {
|
|
263
|
+
root = JSON.parse(text);
|
|
264
|
+
} catch {
|
|
265
|
+
root = text;
|
|
266
|
+
}
|
|
267
|
+
const catalog = userToolCatalog(root, args);
|
|
268
|
+
if (catalog) return catalog;
|
|
269
|
+
const value = select(root, pointer);
|
|
270
|
+
const base = { outputId: args.outputId, pointer, offset };
|
|
271
|
+
if (typeof value === "string" && !args.query) {
|
|
272
|
+
// Character offsets work even when the entire response occupies one line.
|
|
273
|
+
const chunk = value.slice(offset, offset + 2000);
|
|
274
|
+
return {
|
|
275
|
+
...base,
|
|
276
|
+
type: "text",
|
|
277
|
+
characters: value.length,
|
|
278
|
+
text: chunk,
|
|
279
|
+
nextOffset: offset + chunk.length < value.length ? offset + chunk.length : null,
|
|
280
|
+
};
|
|
281
|
+
}
|
|
282
|
+
let entries: Iterable<{ pointer: string; value: unknown }>;
|
|
283
|
+
if (args.query) entries = matches(value, pointer, args.query.toLowerCase());
|
|
284
|
+
else if (value !== null && typeof value === "object") {
|
|
285
|
+
entries = Object.entries(value).map(([key, child]) => ({
|
|
286
|
+
pointer: `${pointer}/${pointerPart(key)}`,
|
|
287
|
+
value: child,
|
|
288
|
+
}));
|
|
289
|
+
} else return { ...base, value, nextOffset: null };
|
|
290
|
+
const items: unknown[] = [];
|
|
291
|
+
let index = 0;
|
|
292
|
+
let bytes = 0;
|
|
293
|
+
let more = false;
|
|
294
|
+
for (const entry of entries) {
|
|
295
|
+
if (index++ < offset) continue;
|
|
296
|
+
const item = { pointer: entry.pointer, preview: preview(entry.value) };
|
|
297
|
+
const size = utf8ByteLength(JSON.stringify(item));
|
|
298
|
+
if (items.length >= limit || bytes + size > PAGE_BYTES) {
|
|
299
|
+
more = true;
|
|
300
|
+
break;
|
|
301
|
+
}
|
|
302
|
+
items.push(item);
|
|
303
|
+
bytes += size;
|
|
304
|
+
}
|
|
305
|
+
if (more && items.length === 0)
|
|
306
|
+
throw new Error("Entry exceeds the preview budget; select a narrower JSON Pointer.");
|
|
307
|
+
return {
|
|
308
|
+
...base,
|
|
309
|
+
type: args.query ? "search" : Array.isArray(value) ? "array" : "object",
|
|
310
|
+
totalItems: args.query ? undefined : Object.keys(value as object).length,
|
|
311
|
+
items,
|
|
312
|
+
nextOffset: more ? offset + items.length : null,
|
|
313
|
+
previewsOnly: true,
|
|
314
|
+
};
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
export const GALAXY_OUTPUT_MARKER = "[loom Galaxy output]";
|
|
318
|
+
|
|
319
|
+
// Keeps headline + overview + pointer text under the 20 KiB spill threshold when the preview
|
|
320
|
+
// cannot be built and the raw text is cut instead.
|
|
321
|
+
const FALLBACK_PREVIEW_BYTES = 16 * 1024;
|
|
322
|
+
|
|
323
|
+
/**
|
|
324
|
+
* What the model sees in place of a spilled Galaxy response: a headline, the same bounded
|
|
325
|
+
* overview `galaxy_read_output` returns, a marker, and how to read more.
|
|
326
|
+
*/
|
|
327
|
+
export function spillPreview(text: string, outputId: string, isError: boolean): string {
|
|
328
|
+
let headline = isError
|
|
329
|
+
? "Galaxy returned a large error response. Saved response preview follows."
|
|
330
|
+
: "Large Galaxy response saved in memory. Showing a bounded preview.";
|
|
331
|
+
let next =
|
|
332
|
+
"Select a JSON Pointer from the preview, or use query to find relevant records. A partial preview does not establish that omitted records are absent.";
|
|
333
|
+
let overview: string;
|
|
334
|
+
try {
|
|
335
|
+
const page = inspectOutput(text, { outputId, limit: 20 });
|
|
336
|
+
overview = JSON.stringify(page);
|
|
337
|
+
if (page.type === "user_tool_catalog") {
|
|
338
|
+
if (!isError) headline = catalogHeadline(page, "galaxy_read_output");
|
|
339
|
+
next = CATALOG_NEXT_STEPS;
|
|
340
|
+
}
|
|
341
|
+
} catch {
|
|
342
|
+
// One entry is larger than a preview page; a raw head and tail still shows its shape.
|
|
343
|
+
overview = truncateMiddle(text, FALLBACK_PREVIEW_BYTES).content;
|
|
344
|
+
}
|
|
345
|
+
return `${headline}\n${overview}\n${GALAXY_OUTPUT_MARKER}\nFor more detail, use galaxy_read_output with outputId ${JSON.stringify(outputId)}. ${next} Saved outputs live in memory for this session only. Inspect required fields before proceeding. Do not repeat the original operation just to recover output.`;
|
|
346
|
+
}
|
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `loom-galaxy-page` fenced YAML block — the durable record of a notebook's
|
|
3
|
+
* binding to a Galaxy page (see galaxyproject/galaxy#22361, Galaxy Notebooks).
|
|
4
|
+
*
|
|
5
|
+
* Lives inside notebook.md alongside the existing `loom-invocation` blocks
|
|
6
|
+
* documented in notebook-writer.ts. Same render / find / upsert grammar,
|
|
7
|
+
* keyed on `page_id`. Today's MVP uses one block per notebook, but the
|
|
8
|
+
* keyed-upsert contract supports N-per-notebook for future per-plan
|
|
9
|
+
* bindings.
|
|
10
|
+
*
|
|
11
|
+
* Block shape:
|
|
12
|
+
*
|
|
13
|
+
* ```loom-galaxy-page
|
|
14
|
+
* page_id: abc123
|
|
15
|
+
* page_slug: my-analysis
|
|
16
|
+
* galaxy_server_url: "https://usegalaxy.org"
|
|
17
|
+
* history_id: hist456
|
|
18
|
+
* last_synced_revision: rev789
|
|
19
|
+
* bound_at: 2026-05-14T11:00:00Z
|
|
20
|
+
* ```
|
|
21
|
+
*
|
|
22
|
+
* v1 sync semantics — IMPORTANT, document expectations here so future readers
|
|
23
|
+
* don't have to spelunk through tool code:
|
|
24
|
+
*
|
|
25
|
+
* - `push` is **unconditional local-wins**. The local notebook content
|
|
26
|
+
* replaces the Galaxy page body. Concurrent edits on the Galaxy UI side
|
|
27
|
+
* are silently discarded.
|
|
28
|
+
* - `pull` is **unconditional remote-wins**. The Galaxy page body replaces
|
|
29
|
+
* the local notebook content. Local edits since the last sync are lost
|
|
30
|
+
* except for typed blocks (loom-galaxy-page itself, loom-invocation),
|
|
31
|
+
* which the pull flow re-applies on top of the remote body.
|
|
32
|
+
* - `last_synced_revision` is stored and refreshed after every successful
|
|
33
|
+
* push/pull so v2 can add a pre-flight concurrency check without a data
|
|
34
|
+
* migration. It is **not** enforced today.
|
|
35
|
+
*
|
|
36
|
+
* Galaxy Pages are not the primary edit surface and the agent is the only
|
|
37
|
+
* push caller, so concurrent UI edits during an active session are an edge
|
|
38
|
+
* case rather than the norm. v2 will revisit once we have real usage data.
|
|
39
|
+
*/
|
|
40
|
+
|
|
41
|
+
import {
|
|
42
|
+
isNotebookFenceOpen,
|
|
43
|
+
notebookFenceOpen,
|
|
44
|
+
replaceNotebookBlocks,
|
|
45
|
+
} from "../../shared/notebook-fences.js";
|
|
46
|
+
|
|
47
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
48
|
+
// Type
|
|
49
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
50
|
+
|
|
51
|
+
export interface GalaxyPageBindingYaml {
|
|
52
|
+
pageId: string;
|
|
53
|
+
pageSlug: string | null;
|
|
54
|
+
galaxyServerUrl: string;
|
|
55
|
+
historyId: string;
|
|
56
|
+
lastSyncedRevision: string | null;
|
|
57
|
+
boundAt: string;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
const BINDING_FENCE_OPEN = notebookFenceOpen("galaxy-page");
|
|
61
|
+
const BINDING_FENCE_CLOSE = "```";
|
|
62
|
+
|
|
63
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
64
|
+
// Render
|
|
65
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Render a binding as a `loom-galaxy-page` fenced block. The trailing
|
|
69
|
+
* newline is intentional so blocks can be appended cleanly.
|
|
70
|
+
*/
|
|
71
|
+
export function renderGalaxyPageBlock(binding: GalaxyPageBindingYaml): string {
|
|
72
|
+
const lines: string[] = [
|
|
73
|
+
BINDING_FENCE_OPEN,
|
|
74
|
+
`page_id: ${binding.pageId}`,
|
|
75
|
+
`page_slug: ${binding.pageSlug ?? ""}`,
|
|
76
|
+
`galaxy_server_url: ${escapeYaml(binding.galaxyServerUrl)}`,
|
|
77
|
+
`history_id: ${binding.historyId}`,
|
|
78
|
+
`last_synced_revision: ${binding.lastSyncedRevision ?? ""}`,
|
|
79
|
+
`bound_at: ${binding.boundAt}`,
|
|
80
|
+
BINDING_FENCE_CLOSE,
|
|
81
|
+
];
|
|
82
|
+
return lines.join("\n") + "\n";
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
86
|
+
// Find
|
|
87
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Find every `loom-galaxy-page` block in the notebook content and parse
|
|
91
|
+
* each into a GalaxyPageBindingYaml. Skips blocks that fail validation
|
|
92
|
+
* (missing required fields).
|
|
93
|
+
*/
|
|
94
|
+
export function findGalaxyPageBlocks(content: string): GalaxyPageBindingYaml[] {
|
|
95
|
+
const result: GalaxyPageBindingYaml[] = [];
|
|
96
|
+
const lines = content.split("\n");
|
|
97
|
+
let i = 0;
|
|
98
|
+
while (i < lines.length) {
|
|
99
|
+
if (isNotebookFenceOpen(lines[i], "galaxy-page")) {
|
|
100
|
+
const start = i + 1;
|
|
101
|
+
let end = start;
|
|
102
|
+
while (end < lines.length && lines[end].trim() !== BINDING_FENCE_CLOSE) {
|
|
103
|
+
end++;
|
|
104
|
+
}
|
|
105
|
+
const parsed = parseGalaxyPageBlock(lines.slice(start, end));
|
|
106
|
+
if (parsed) result.push(parsed);
|
|
107
|
+
i = end + 1;
|
|
108
|
+
} else {
|
|
109
|
+
i++;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
return result;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
116
|
+
// Upsert
|
|
117
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Upsert a `loom-galaxy-page` block keyed by `page_id`. Replaces in place
|
|
121
|
+
* if a block with the same page id exists; otherwise appends at the end
|
|
122
|
+
* of the file with a leading blank line.
|
|
123
|
+
*/
|
|
124
|
+
export function upsertGalaxyPageBlock(content: string, binding: GalaxyPageBindingYaml): string {
|
|
125
|
+
const matching = findGalaxyPageBlockRanges(content).filter((r) => r.pageId === binding.pageId);
|
|
126
|
+
const newBlock = renderGalaxyPageBlock(binding).trimEnd().split("\n");
|
|
127
|
+
if (matching.length > 0) return replaceNotebookBlocks(content, matching, newBlock);
|
|
128
|
+
|
|
129
|
+
const trimmed = content.replace(/\s+$/, "");
|
|
130
|
+
const sep = trimmed.length > 0 ? "\n\n" : "";
|
|
131
|
+
return trimmed + sep + newBlock.join("\n") + "\n";
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* Remove every `loom-galaxy-page` block from the content. Used on push so
|
|
136
|
+
* Galaxy doesn't render Orbit's internal binding metadata, and defensively
|
|
137
|
+
* on pull in case the remote echoed it back.
|
|
138
|
+
*/
|
|
139
|
+
export function stripGalaxyPageBlocks(content: string): string {
|
|
140
|
+
const ranges = findGalaxyPageBlockRanges(content);
|
|
141
|
+
if (ranges.length === 0) return content;
|
|
142
|
+
|
|
143
|
+
const lines = content.split("\n");
|
|
144
|
+
const drop = new Set<number>();
|
|
145
|
+
for (const r of ranges) {
|
|
146
|
+
for (let n = r.start; n <= r.end; n++) drop.add(n);
|
|
147
|
+
// Also drop a single trailing blank line so consecutive strips don't
|
|
148
|
+
// leave wide gaps in the output.
|
|
149
|
+
if (r.end + 1 < lines.length && lines[r.end + 1].trim() === "") {
|
|
150
|
+
drop.add(r.end + 1);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
return lines.filter((_, idx) => !drop.has(idx)).join("\n");
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
157
|
+
// Internals
|
|
158
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
159
|
+
|
|
160
|
+
interface GalaxyPageBlockRange {
|
|
161
|
+
pageId: string;
|
|
162
|
+
start: number;
|
|
163
|
+
end: number;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
function findGalaxyPageBlockRanges(content: string): GalaxyPageBlockRange[] {
|
|
167
|
+
const result: GalaxyPageBlockRange[] = [];
|
|
168
|
+
const lines = content.split("\n");
|
|
169
|
+
let i = 0;
|
|
170
|
+
while (i < lines.length) {
|
|
171
|
+
if (isNotebookFenceOpen(lines[i], "galaxy-page")) {
|
|
172
|
+
const start = i;
|
|
173
|
+
let end = start + 1;
|
|
174
|
+
let pageId: string | null = null;
|
|
175
|
+
while (end < lines.length && lines[end].trim() !== BINDING_FENCE_CLOSE) {
|
|
176
|
+
const m = lines[end].match(/^page_id:\s*(.+)$/);
|
|
177
|
+
if (m) pageId = m[1].trim();
|
|
178
|
+
end++;
|
|
179
|
+
}
|
|
180
|
+
if (pageId) {
|
|
181
|
+
result.push({ pageId, start, end });
|
|
182
|
+
}
|
|
183
|
+
i = end + 1;
|
|
184
|
+
} else {
|
|
185
|
+
i++;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
return result;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
function parseGalaxyPageBlock(blockLines: string[]): GalaxyPageBindingYaml | null {
|
|
192
|
+
const fields: Record<string, string> = {};
|
|
193
|
+
for (const line of blockLines) {
|
|
194
|
+
const m = line.match(/^([a-z_]+):\s*(.*)$/);
|
|
195
|
+
if (m) fields[m[1]] = unescapeYaml(m[2].trim());
|
|
196
|
+
}
|
|
197
|
+
if (!fields.page_id || !fields.galaxy_server_url || !fields.history_id || !fields.bound_at) {
|
|
198
|
+
return null;
|
|
199
|
+
}
|
|
200
|
+
return {
|
|
201
|
+
pageId: fields.page_id,
|
|
202
|
+
pageSlug: fields.page_slug || null,
|
|
203
|
+
galaxyServerUrl: fields.galaxy_server_url,
|
|
204
|
+
historyId: fields.history_id,
|
|
205
|
+
lastSyncedRevision: fields.last_synced_revision || null,
|
|
206
|
+
boundAt: fields.bound_at,
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
function escapeYaml(value: string): string {
|
|
211
|
+
if (/[:#\n]/.test(value)) {
|
|
212
|
+
return `"${value.replace(/"/g, '\\"')}"`;
|
|
213
|
+
}
|
|
214
|
+
return value;
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
function unescapeYaml(value: string): string {
|
|
218
|
+
if (value.startsWith('"') && value.endsWith('"')) {
|
|
219
|
+
return value.slice(1, -1).replace(/\\"/g, '"');
|
|
220
|
+
}
|
|
221
|
+
return value;
|
|
222
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { GalaxyToolFamily } from "../../shared/galaxy-tool-family.js";
|
|
2
|
+
import { galaxyPageMarkdown } from "../../shared/prompt-blocks.js";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* How to author content destined for a Galaxy page. The text is shared with the browser shell
|
|
6
|
+
* (shared/prompt-blocks.js): Galaxy's client splits a page at every ``` line and renders only
|
|
7
|
+
* its own cell types, and current Galaxy refuses a page with any other fence, so the author is
|
|
8
|
+
* steered toward ~~~ for code. The push adapter (galaxy-markdown-adapter.ts) only rewrites
|
|
9
|
+
* Orbit's own typed fences; everything else in notebook.md reaches the page verbatim.
|
|
10
|
+
*
|
|
11
|
+
* Shared by the notebook_push_to_galaxy tool description (covers the first push, before any
|
|
12
|
+
* binding block exists) and the live page-binding context block.
|
|
13
|
+
*/
|
|
14
|
+
export const galaxyPageMarkdownGuidance = (family: GalaxyToolFamily): string =>
|
|
15
|
+
galaxyPageMarkdown({ tool: family.tool });
|