@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,175 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Putting an observation in front of a human, and the `ask`-mode description
|
|
3
|
+
* the human writes.
|
|
4
|
+
*
|
|
5
|
+
* The confirm shows the EXACT payload, field by field, because "we send
|
|
6
|
+
* structured signals and a generic description" is a claim the user should be
|
|
7
|
+
* able to check rather than take on trust -- the only value held back is the
|
|
8
|
+
* install token, which is local state and is not something to invite anyone to
|
|
9
|
+
* paste into a bug report.
|
|
10
|
+
*
|
|
11
|
+
* Only `ask` carries free text, because only `ask` has a human reading it
|
|
12
|
+
* before it goes. `auto` sends the structured fields and nothing else, so no
|
|
13
|
+
* model is ever asked to write a description. A description that fails
|
|
14
|
+
* validation is dropped, never trimmed.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import type { ExtensionContext } from "@earendil-works/pi-coding-agent";
|
|
18
|
+
import {
|
|
19
|
+
DESCRIPTION_MAX,
|
|
20
|
+
textLeaks,
|
|
21
|
+
validateObservation,
|
|
22
|
+
} from "../../shared/observation-contract.js";
|
|
23
|
+
import type { Observation } from "../../shared/observation-contract.js";
|
|
24
|
+
import type { ObservationsMode } from "./observations-config.js";
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Why anyone would say yes. The confirm leads with this because the privacy
|
|
28
|
+
* statement alone reads like a cookie banner: it says what is withheld and
|
|
29
|
+
* nothing about what the report is for.
|
|
30
|
+
*/
|
|
31
|
+
export const PURPOSE_STATEMENT =
|
|
32
|
+
"Reports like this are how recurring problems get turned into lessons Orbit surfaces " +
|
|
33
|
+
"to everyone -- including you -- the next time it happens, and into fixes in Galaxy " +
|
|
34
|
+
"and Orbit.";
|
|
35
|
+
|
|
36
|
+
export const PRIVACY_STATEMENT =
|
|
37
|
+
"Only the fields above are sent, to the Galaxy team's private intake queue, tied to " +
|
|
38
|
+
"a random per-install token rather than any account or machine identity. In `ask` " +
|
|
39
|
+
"mode the signature and description are shown to you in full and sent only if you " +
|
|
40
|
+
"say yes; error text that still looks like it names a host, address, path or id " +
|
|
41
|
+
"after scrubbing is withheld, and you are offered the rest. In `auto` mode no free text is sent at all -- no error text and no " +
|
|
42
|
+
"description, only the structured fields; `/observe` always asks first, in any mode. " +
|
|
43
|
+
"Never transcript text, data values, file " +
|
|
44
|
+
"paths, history or dataset ids, or URLs. Rows expire after 180 days and " +
|
|
45
|
+
"`/observations retract <id>` deletes one at any time. `/observations mode off` " +
|
|
46
|
+
"stops collection entirely.";
|
|
47
|
+
|
|
48
|
+
// -----------------------------------------------------------------------------
|
|
49
|
+
// The confirm
|
|
50
|
+
// -----------------------------------------------------------------------------
|
|
51
|
+
|
|
52
|
+
function orNone(value: string): string {
|
|
53
|
+
return value.length > 0 ? value : "(none)";
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/** Pure, so the thing the user is shown is pinned by a test. */
|
|
57
|
+
export function renderObservationForConfirm(obs: Observation): string {
|
|
58
|
+
const tools = obs.tools.map((t) => (t.version ? `${t.id} ${t.version}` : t.id)).join(", ");
|
|
59
|
+
return [
|
|
60
|
+
`kind: ${obs.kind}`,
|
|
61
|
+
`stage: ${obs.stage}`,
|
|
62
|
+
`trigger: ${obs.trigger}`,
|
|
63
|
+
`signature: ${obs.signature}`,
|
|
64
|
+
`description: ${orNone(obs.description)}`,
|
|
65
|
+
`mcp tool: ${orNone(obs.mcpTool ?? "")}`,
|
|
66
|
+
`galaxy tools: ${orNone(tools)}`,
|
|
67
|
+
`datatypes: ${orNone(obs.datatypes.join(", "))}`,
|
|
68
|
+
`galaxy server: ${obs.galaxy.server}${obs.galaxy.version ? ` (${obs.galaxy.version})` : ""}`,
|
|
69
|
+
`client: ${obs.client.app} ${obs.client.version} ${obs.client.platform}${obs.client.wsl ? " (wsl)" : ""}`,
|
|
70
|
+
`sent at: ${obs.clientTs}`,
|
|
71
|
+
`id: ${obs.id}`,
|
|
72
|
+
"install token: (32 random hex, stored locally, not shown)",
|
|
73
|
+
].join("\n");
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
export async function confirmObservation(
|
|
77
|
+
obs: Observation,
|
|
78
|
+
ctx: ExtensionContext,
|
|
79
|
+
note?: string,
|
|
80
|
+
): Promise<boolean> {
|
|
81
|
+
try {
|
|
82
|
+
return await ctx.ui.confirm(
|
|
83
|
+
"Send this observation to the Galaxy team?",
|
|
84
|
+
`Orbit hit something that looks like a failure pattern. ${PURPOSE_STATEMENT}\n\n` +
|
|
85
|
+
(note ? `${note}\n\n` : "") +
|
|
86
|
+
`${renderObservationForConfirm(obs)}\n\n${PRIVACY_STATEMENT}`,
|
|
87
|
+
);
|
|
88
|
+
} catch {
|
|
89
|
+
// A stale context after a session swap, or a shell with no dialog. Either
|
|
90
|
+
// way the answer is no.
|
|
91
|
+
return false;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// -----------------------------------------------------------------------------
|
|
96
|
+
// The description
|
|
97
|
+
// -----------------------------------------------------------------------------
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* Accept a candidate description only if the contract would accept it. The
|
|
101
|
+
* probe payload is a minimal legal observation with this description dropped
|
|
102
|
+
* in, so the single source of truth for "is this text safe" stays the
|
|
103
|
+
* validator rather than a second copy of its rules.
|
|
104
|
+
*/
|
|
105
|
+
export function acceptDescription(candidate: string): string {
|
|
106
|
+
const whole = String(candidate ?? "");
|
|
107
|
+
// Everything the user typed is scanned before any of it is cut: the cap and
|
|
108
|
+
// the first-line rule can both drop the part of a leak a rule keys on.
|
|
109
|
+
if (textLeaks(whole.replace(/\s+/g, " ")).length > 0) return "";
|
|
110
|
+
const text = whole.split(/\r?\n/)[0].trim().slice(0, DESCRIPTION_MAX);
|
|
111
|
+
if (!text || text === "NONE") return "";
|
|
112
|
+
const probe = {
|
|
113
|
+
schemaVersion: 1 as const,
|
|
114
|
+
id: "00000000-0000-4000-8000-000000000000",
|
|
115
|
+
clientTs: "2026-01-01T00:00:00.000Z",
|
|
116
|
+
client: { app: "loom-cli" as const, version: "0", platform: "linux" as const },
|
|
117
|
+
installToken: "0".repeat(32),
|
|
118
|
+
kind: "other" as const,
|
|
119
|
+
stage: "unknown" as const,
|
|
120
|
+
trigger: "explicit" as const,
|
|
121
|
+
tools: [],
|
|
122
|
+
datatypes: [],
|
|
123
|
+
signature: "unknown",
|
|
124
|
+
galaxy: { server: "private" },
|
|
125
|
+
description: text,
|
|
126
|
+
};
|
|
127
|
+
return validateObservation(probe).ok && textLeaks(text).length === 0 ? text : "";
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* In `ask` mode the human writes it, because they are already being shown the
|
|
132
|
+
* payload. One re-prompt on a rejection, then empty -- a third round of "that
|
|
133
|
+
* still has an email address in it" is nagging.
|
|
134
|
+
*/
|
|
135
|
+
export async function askUserForDescription(
|
|
136
|
+
obs: Observation,
|
|
137
|
+
ctx: ExtensionContext,
|
|
138
|
+
): Promise<string> {
|
|
139
|
+
for (let attempt = 0; attempt < 2; attempt++) {
|
|
140
|
+
let raw: string | undefined;
|
|
141
|
+
try {
|
|
142
|
+
raw = await ctx.ui.input(
|
|
143
|
+
"One line about what went wrong (optional, generic -- no ids, paths or names)",
|
|
144
|
+
// The built signature, not the raw facts: the prompt shows only what
|
|
145
|
+
// already passed the builder.
|
|
146
|
+
`signature: ${obs.signature}`,
|
|
147
|
+
);
|
|
148
|
+
} catch {
|
|
149
|
+
return "";
|
|
150
|
+
}
|
|
151
|
+
if (!raw || !raw.trim()) return "";
|
|
152
|
+
const accepted = acceptDescription(raw);
|
|
153
|
+
if (accepted) return accepted;
|
|
154
|
+
try {
|
|
155
|
+
ctx.ui.notify(
|
|
156
|
+
"That description looked like it carried an id, path, URL or address, so it was left blank. Try again, or press enter to skip.",
|
|
157
|
+
"warning",
|
|
158
|
+
);
|
|
159
|
+
} catch {
|
|
160
|
+
return "";
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
return "";
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
export async function describeObservation(
|
|
167
|
+
mode: ObservationsMode,
|
|
168
|
+
obs: Observation,
|
|
169
|
+
ctx: ExtensionContext,
|
|
170
|
+
): Promise<string> {
|
|
171
|
+
// Only `ask` has a description. `auto` sends no free text, so there is
|
|
172
|
+
// nothing to write and no model call to make.
|
|
173
|
+
if (mode !== "ask" || !ctx.hasUI) return "";
|
|
174
|
+
return askUserForDescription(obs, ctx);
|
|
175
|
+
}
|
|
@@ -0,0 +1,421 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* /observations and /observe -- the user's half of the collector.
|
|
3
|
+
*
|
|
4
|
+
* Both are deterministic: no model turn, no agent in the loop. /observations is
|
|
5
|
+
* how someone sees what the collector is doing, changes their mind, reads back
|
|
6
|
+
* what was sent, and deletes a row. /observe is the one trigger the user owns.
|
|
7
|
+
*
|
|
8
|
+
* Switching to `auto` for the first time shows a REAL sample payload built
|
|
9
|
+
* from this install (its client, its server, and the most recent thing a
|
|
10
|
+
* trigger actually saw when there is one) plus the privacy statement, and does
|
|
11
|
+
* not take effect without a confirm. Everything here writes only the
|
|
12
|
+
* `observations` block of the config, through the fail-closed writer.
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import type { ExtensionAPI, ExtensionContext } from "@earendil-works/pi-coding-agent";
|
|
16
|
+
import {
|
|
17
|
+
describeObservationsMode,
|
|
18
|
+
hasAcknowledgedAuto,
|
|
19
|
+
isObservationsHardDisabled,
|
|
20
|
+
markAutoAcknowledged,
|
|
21
|
+
observationsModeChangeBlocker,
|
|
22
|
+
peekInstallToken,
|
|
23
|
+
setObservationsMode,
|
|
24
|
+
} from "./observations-config.js";
|
|
25
|
+
import type { ObservationsMode, ObservationsModeState } from "./observations-config.js";
|
|
26
|
+
import { LESSONS_OFF_POINTER } from "./lessons/enabled.js";
|
|
27
|
+
import {
|
|
28
|
+
SENT_LOG_FILE,
|
|
29
|
+
appendSentLog,
|
|
30
|
+
buildObservation,
|
|
31
|
+
collectObservationEnvelope,
|
|
32
|
+
forgetRetractToken,
|
|
33
|
+
observationsFilePath,
|
|
34
|
+
readRetractToken,
|
|
35
|
+
readSentLog,
|
|
36
|
+
removeFromObservationOutbox,
|
|
37
|
+
retractObservation,
|
|
38
|
+
} from "./observations.js";
|
|
39
|
+
import type { ObservationFacts, ObservationSentEntry } from "./observations.js";
|
|
40
|
+
import {
|
|
41
|
+
deliverObservation,
|
|
42
|
+
lastObservationFacts,
|
|
43
|
+
liveDeliverDeps,
|
|
44
|
+
localWriteWarning,
|
|
45
|
+
} from "./observation-triggers.js";
|
|
46
|
+
import {
|
|
47
|
+
PRIVACY_STATEMENT,
|
|
48
|
+
PURPOSE_STATEMENT,
|
|
49
|
+
renderObservationForConfirm,
|
|
50
|
+
} from "./observation-ui.js";
|
|
51
|
+
import { scanObservationForLeaks, validateObservation } from "../../shared/observation-contract.js";
|
|
52
|
+
|
|
53
|
+
export const OBSERVATIONS_USAGE =
|
|
54
|
+
"Usage: /observations [status | mode <off|ask|auto> | sent | retract <id>]";
|
|
55
|
+
|
|
56
|
+
export function formatObservationsStatus(info: {
|
|
57
|
+
mode: ObservationsMode;
|
|
58
|
+
override?: ObservationsModeState["override"];
|
|
59
|
+
hardDisabled: boolean;
|
|
60
|
+
hasToken: boolean;
|
|
61
|
+
sentLogPath: string;
|
|
62
|
+
counts: { sent: number; queued: number; retracted: number; cancelled: number };
|
|
63
|
+
}): string {
|
|
64
|
+
const lines = [
|
|
65
|
+
"Observations -- failure patterns reported back so they become lessons Orbit surfaces to everyone",
|
|
66
|
+
"",
|
|
67
|
+
` mode: ${info.mode}`,
|
|
68
|
+
];
|
|
69
|
+
if (info.override === "auto-unacknowledged") {
|
|
70
|
+
lines.push(
|
|
71
|
+
" The config says auto, but there is no recorded confirmation of auto, so it runs",
|
|
72
|
+
" as ask: every report is shown to you before it goes. /observations mode auto",
|
|
73
|
+
" shows the sample payload and turns auto on once you confirm.",
|
|
74
|
+
);
|
|
75
|
+
}
|
|
76
|
+
if (info.override === "lessons-off") {
|
|
77
|
+
lines.push(
|
|
78
|
+
" Lessons are off, so nothing is collected or sent whatever the mode says.",
|
|
79
|
+
" /lessons on turns the loop on; then pick a mode here.",
|
|
80
|
+
);
|
|
81
|
+
}
|
|
82
|
+
if (info.override === "lessons-env") {
|
|
83
|
+
lines.push(
|
|
84
|
+
" Lessons are on from the environment only, which never turns reporting on.",
|
|
85
|
+
" /lessons on writes the config; then pick a mode here.",
|
|
86
|
+
);
|
|
87
|
+
}
|
|
88
|
+
if (info.hardDisabled) {
|
|
89
|
+
lines.push(" ORBIT_OBSERVATIONS=off is set, so collection is disabled for this install");
|
|
90
|
+
lines.push(" and the mode can't be changed from here.");
|
|
91
|
+
}
|
|
92
|
+
lines.push(
|
|
93
|
+
` install token: ${info.hasToken ? "stored locally (not shown)" : "not generated yet"}`,
|
|
94
|
+
` ${info.counts.sent} sent, ${info.counts.queued} queued, ${info.counts.retracted} retracted, ${info.counts.cancelled} cancelled`,
|
|
95
|
+
` log: ${info.sentLogPath}`,
|
|
96
|
+
"",
|
|
97
|
+
" off -- collect nothing (default)",
|
|
98
|
+
" ask -- show the exact payload, error text and description included, and send only on a confirm",
|
|
99
|
+
" auto -- send without asking, structured fields only: no error text, no description",
|
|
100
|
+
"",
|
|
101
|
+
OBSERVATIONS_USAGE,
|
|
102
|
+
);
|
|
103
|
+
return lines.join("\n");
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/** Latest status per id, oldest first. One line each, with the id to retract by. */
|
|
107
|
+
export function sentLogSummary(rows: ObservationSentEntry[]): string {
|
|
108
|
+
if (rows.length === 0) {
|
|
109
|
+
return "Nothing has been sent yet. /observations status shows the current mode.";
|
|
110
|
+
}
|
|
111
|
+
const latest = new Map<string, ObservationSentEntry>();
|
|
112
|
+
for (const row of rows) latest.set(row.id, row);
|
|
113
|
+
const lines = ["What this install has sent (newest last):", ""];
|
|
114
|
+
for (const row of latest.values()) {
|
|
115
|
+
lines.push(
|
|
116
|
+
` ${row.at} ${row.status.padEnd(9)} ${row.kind.padEnd(18)} ${row.id}`,
|
|
117
|
+
` ${row.signature}`,
|
|
118
|
+
);
|
|
119
|
+
if (row.description) lines.push(` ${row.description}`);
|
|
120
|
+
}
|
|
121
|
+
lines.push("", "Delete a sent one, or cancel a queued one, with /observations retract <id>.");
|
|
122
|
+
return lines.join("\n");
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
// The confirm never prints the token, so the sample doesn't need the real one
|
|
126
|
+
// -- and building it shouldn't write a token to disk before the user says yes.
|
|
127
|
+
const SAMPLE_INSTALL_TOKEN = "0".repeat(32);
|
|
128
|
+
|
|
129
|
+
const REPRESENTATIVE_FACTS: ObservationFacts = {
|
|
130
|
+
kind: "tool-error",
|
|
131
|
+
trigger: "tool_error",
|
|
132
|
+
mcpTool: "galaxy_run_tool",
|
|
133
|
+
toolIds: ["toolshed.g2.bx.psu.edu/repos/iuc/hisat2/hisat2"],
|
|
134
|
+
datatypes: ["fastqsanger.gz"],
|
|
135
|
+
rawSignature: "ToolExecutionError: input dataset is in state 'error'",
|
|
136
|
+
};
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
* A sample that is honest about this install. When a trigger has already seen
|
|
140
|
+
* something this session that is what gets shown -- but only if it would
|
|
141
|
+
* actually be sent; a refused one would show the user text that never leaves
|
|
142
|
+
* the machine. Otherwise a representative signature carries the same real
|
|
143
|
+
* client and server fields.
|
|
144
|
+
*/
|
|
145
|
+
export function sampleObservationFacts(): ObservationFacts {
|
|
146
|
+
const last = lastObservationFacts();
|
|
147
|
+
if (last) {
|
|
148
|
+
const probe = buildObservation(
|
|
149
|
+
last,
|
|
150
|
+
collectObservationEnvelope(SAMPLE_INSTALL_TOKEN),
|
|
151
|
+
"structured",
|
|
152
|
+
);
|
|
153
|
+
if (validateObservation(probe).ok && scanObservationForLeaks(probe).length === 0) return last;
|
|
154
|
+
}
|
|
155
|
+
return REPRESENTATIVE_FACTS;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
export async function confirmAutoMode(ctx: ExtensionContext): Promise<boolean> {
|
|
159
|
+
// The auto shape: the sample has to show what auto actually sends, which is
|
|
160
|
+
// the structured fields with no signature text and no description.
|
|
161
|
+
const sample = buildObservation(
|
|
162
|
+
sampleObservationFacts(),
|
|
163
|
+
collectObservationEnvelope(peekInstallToken() ?? SAMPLE_INSTALL_TOKEN),
|
|
164
|
+
"structured",
|
|
165
|
+
);
|
|
166
|
+
try {
|
|
167
|
+
return await ctx.ui.confirm(
|
|
168
|
+
"Send observations automatically from now on?",
|
|
169
|
+
`${PURPOSE_STATEMENT}\n\n` +
|
|
170
|
+
"This is exactly what one looks like in auto mode -- the same fields, from this " +
|
|
171
|
+
"install. The error text is never sent in auto, so the signature is always " +
|
|
172
|
+
"`unknown` and there is no description:\n\n" +
|
|
173
|
+
`${renderObservationForConfirm(sample)}\n\n${PRIVACY_STATEMENT}`,
|
|
174
|
+
);
|
|
175
|
+
} catch {
|
|
176
|
+
return false;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
async function showStatus(ctx: ExtensionContext): Promise<void> {
|
|
181
|
+
const rows = readSentLog();
|
|
182
|
+
const latest = new Map<string, ObservationSentEntry>();
|
|
183
|
+
for (const row of rows) latest.set(row.id, row);
|
|
184
|
+
const counts = { sent: 0, queued: 0, retracted: 0, cancelled: 0 };
|
|
185
|
+
for (const row of latest.values()) {
|
|
186
|
+
if (row.status in counts) counts[row.status] += 1;
|
|
187
|
+
}
|
|
188
|
+
const state = describeObservationsMode();
|
|
189
|
+
ctx.ui.notify(
|
|
190
|
+
formatObservationsStatus({
|
|
191
|
+
mode: state.mode,
|
|
192
|
+
override: state.override,
|
|
193
|
+
hardDisabled: isObservationsHardDisabled(),
|
|
194
|
+
hasToken: peekInstallToken() !== undefined,
|
|
195
|
+
sentLogPath: observationsFilePath(SENT_LOG_FILE),
|
|
196
|
+
counts,
|
|
197
|
+
}),
|
|
198
|
+
"info",
|
|
199
|
+
);
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
async function changeMode(ctx: ExtensionContext, requested: string): Promise<void> {
|
|
203
|
+
if (requested !== "off" && requested !== "ask" && requested !== "auto") {
|
|
204
|
+
ctx.ui.notify(`Unknown mode "${requested}".\n${OBSERVATIONS_USAGE}`, "warning");
|
|
205
|
+
return;
|
|
206
|
+
}
|
|
207
|
+
// Before the sample payload and its acknowledgement: a change the writer
|
|
208
|
+
// would refuse must not leave the acknowledgement behind in the config.
|
|
209
|
+
const blocked = observationsModeChangeBlocker(requested);
|
|
210
|
+
if (blocked) {
|
|
211
|
+
ctx.ui.notify(blocked, "warning");
|
|
212
|
+
return;
|
|
213
|
+
}
|
|
214
|
+
// Turning collection ON is the one transition that needs the payload shown
|
|
215
|
+
// first, and a shell with no dialog can't show it.
|
|
216
|
+
if (requested === "auto" && !hasAcknowledgedAuto()) {
|
|
217
|
+
if (!ctx.hasUI) {
|
|
218
|
+
ctx.ui.notify(
|
|
219
|
+
"Switching to auto needs interactive mode -- it shows you a real sample payload first. Re-run it in Orbit or an interactive CLI session.",
|
|
220
|
+
"warning",
|
|
221
|
+
);
|
|
222
|
+
return;
|
|
223
|
+
}
|
|
224
|
+
if (!(await confirmAutoMode(ctx))) {
|
|
225
|
+
ctx.ui.notify("Left as is. Nothing was changed.", "info");
|
|
226
|
+
return;
|
|
227
|
+
}
|
|
228
|
+
markAutoAcknowledged();
|
|
229
|
+
}
|
|
230
|
+
try {
|
|
231
|
+
setObservationsMode(requested);
|
|
232
|
+
} catch (err) {
|
|
233
|
+
// setObservationsMode only throws messages it authored.
|
|
234
|
+
ctx.ui.notify(err instanceof Error ? err.message : "Couldn't change the mode.", "error");
|
|
235
|
+
return;
|
|
236
|
+
}
|
|
237
|
+
ctx.ui.notify(`Observations mode is now ${requested}.`, "info");
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
/** A follow-up sent-log row for `id`, carrying over what the log already had. */
|
|
241
|
+
function sentLogRowFor(id: string, status: "retracted" | "cancelled"): ObservationSentEntry {
|
|
242
|
+
const previous = readSentLog().find((r) => r.id === id);
|
|
243
|
+
return {
|
|
244
|
+
at: new Date().toISOString(),
|
|
245
|
+
id,
|
|
246
|
+
status,
|
|
247
|
+
kind: previous?.kind ?? "other",
|
|
248
|
+
stage: previous?.stage ?? "unknown",
|
|
249
|
+
trigger: previous?.trigger ?? "explicit",
|
|
250
|
+
signature: previous?.signature ?? "",
|
|
251
|
+
tools: previous?.tools ?? [],
|
|
252
|
+
...(previous?.mcpTool ? { mcpTool: previous.mcpTool } : {}),
|
|
253
|
+
datatypes: previous?.datatypes ?? [],
|
|
254
|
+
server: previous?.server ?? "private",
|
|
255
|
+
description: previous?.description ?? "",
|
|
256
|
+
};
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
async function doRetract(ctx: ExtensionContext, id: string): Promise<void> {
|
|
260
|
+
if (!id) {
|
|
261
|
+
ctx.ui.notify(`Which one?\n${OBSERVATIONS_USAGE}`, "warning");
|
|
262
|
+
return;
|
|
263
|
+
}
|
|
264
|
+
const token = readRetractToken(id);
|
|
265
|
+
if (!token) {
|
|
266
|
+
// No token means it was never accepted by the service -- but it may still
|
|
267
|
+
// be sitting in the outbox, due to go on the next settle. Take it out.
|
|
268
|
+
const removal = removeFromObservationOutbox(id);
|
|
269
|
+
if (removal === "removed") {
|
|
270
|
+
appendSentLog(sentLogRowFor(id, "cancelled"));
|
|
271
|
+
ctx.ui.notify(`Cancelled ${id}. It was still queued, and now it will never be sent.`, "info");
|
|
272
|
+
return;
|
|
273
|
+
}
|
|
274
|
+
if (removal === "busy") {
|
|
275
|
+
ctx.ui.notify(
|
|
276
|
+
`Queued observations are being sent right now, so ${id} can't be cancelled this moment. Try again shortly.`,
|
|
277
|
+
"warning",
|
|
278
|
+
);
|
|
279
|
+
return;
|
|
280
|
+
}
|
|
281
|
+
if (removal === "failed") {
|
|
282
|
+
ctx.ui.notify(
|
|
283
|
+
`Couldn't update the local outbox to cancel ${id}, so nothing was changed. Check that the Orbit state directory is writable.`,
|
|
284
|
+
"error",
|
|
285
|
+
);
|
|
286
|
+
return;
|
|
287
|
+
}
|
|
288
|
+
ctx.ui.notify(
|
|
289
|
+
`There is no retract token stored for "${id}", and it isn't queued. /observations sent lists the ids this install can still retract.`,
|
|
290
|
+
"warning",
|
|
291
|
+
);
|
|
292
|
+
return;
|
|
293
|
+
}
|
|
294
|
+
const res = await retractObservation(id, token);
|
|
295
|
+
if (!res.ok) {
|
|
296
|
+
ctx.ui.notify(
|
|
297
|
+
`Couldn't reach the service to retract ${id} (${res.error ?? `status ${res.status}`}). The token is kept, so try again later.`,
|
|
298
|
+
"error",
|
|
299
|
+
);
|
|
300
|
+
return;
|
|
301
|
+
}
|
|
302
|
+
forgetRetractToken(id);
|
|
303
|
+
// A row that was sent but whose outbox rewrite never happened (lock
|
|
304
|
+
// contention, a crash mid-drain) would otherwise go again on the next drain
|
|
305
|
+
// -- and after a retract the service would accept it as new.
|
|
306
|
+
const leftover = removeFromObservationOutbox(id);
|
|
307
|
+
appendSentLog(sentLogRowFor(id, "retracted"));
|
|
308
|
+
ctx.ui.notify(
|
|
309
|
+
(res.alreadyGone ? `${id} was already gone -- nothing is stored.` : `Retracted ${id}.`) +
|
|
310
|
+
(leftover === "busy" || leftover === "failed"
|
|
311
|
+
? " A copy may still be queued locally; run the same retract again to cancel it."
|
|
312
|
+
: ""),
|
|
313
|
+
"info",
|
|
314
|
+
);
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
const OBSERVE_CHOICES = [
|
|
318
|
+
"something the agent got wrong",
|
|
319
|
+
"a result that looked fine but was wrong",
|
|
320
|
+
] as const;
|
|
321
|
+
|
|
322
|
+
async function doObserve(args: string | undefined, ctx: ExtensionContext): Promise<void> {
|
|
323
|
+
if (!ctx.hasUI) {
|
|
324
|
+
ctx.ui.notify(
|
|
325
|
+
"/observe needs interactive mode. Re-run it in Orbit or an interactive CLI session.",
|
|
326
|
+
"warning",
|
|
327
|
+
);
|
|
328
|
+
return;
|
|
329
|
+
}
|
|
330
|
+
const state = describeObservationsMode();
|
|
331
|
+
if (state.mode === "off") {
|
|
332
|
+
ctx.ui.notify(
|
|
333
|
+
state.override === "lessons-off"
|
|
334
|
+
? `${LESSONS_OFF_POINTER} Then /observations mode ask turns reporting on.`
|
|
335
|
+
: state.override === "lessons-env"
|
|
336
|
+
? "Lessons are on from the environment only, which never turns reporting on. /lessons on writes the config; then /observations mode ask."
|
|
337
|
+
: "Observations are off, so there is nowhere to send this. /observations mode ask turns them on.",
|
|
338
|
+
"info",
|
|
339
|
+
);
|
|
340
|
+
return;
|
|
341
|
+
}
|
|
342
|
+
const note =
|
|
343
|
+
(args && args.trim()) ||
|
|
344
|
+
(
|
|
345
|
+
await ctx.ui.input("What went wrong? (one line, generic -- no ids, paths or names)")
|
|
346
|
+
)?.trim() ||
|
|
347
|
+
"";
|
|
348
|
+
if (!note) return;
|
|
349
|
+
|
|
350
|
+
const chosen = await ctx.ui.select("What kind of problem is this?", [...OBSERVE_CHOICES]);
|
|
351
|
+
if (chosen === undefined || chosen === null) return;
|
|
352
|
+
const kind = chosen === OBSERVE_CHOICES[1] ? "silent-wrong-result" : "user-correction";
|
|
353
|
+
|
|
354
|
+
const last = lastObservationFacts();
|
|
355
|
+
const facts: ObservationFacts = {
|
|
356
|
+
kind,
|
|
357
|
+
// The user asked for this explicitly; nothing here was inferred from their
|
|
358
|
+
// words. `user_correction` stays reserved in the contract for an automatic
|
|
359
|
+
// detector, which nothing here builds on purpose.
|
|
360
|
+
trigger: "explicit",
|
|
361
|
+
...(last?.mcpTool ? { mcpTool: last.mcpTool } : {}),
|
|
362
|
+
toolIds: last?.toolIds ?? [],
|
|
363
|
+
datatypes: last?.datatypes ?? [],
|
|
364
|
+
rawSignature: note,
|
|
365
|
+
};
|
|
366
|
+
|
|
367
|
+
// Always the ask path, whatever the mode: the user typed a sentence and
|
|
368
|
+
// should see what it normalized to before it goes, and the description is
|
|
369
|
+
// theirs to write rather than a model call's.
|
|
370
|
+
const outcome = await deliverObservation(facts, ctx, liveDeliverDeps("ask"));
|
|
371
|
+
const warning = localWriteWarning(outcome);
|
|
372
|
+
if (outcome === "sent") ctx.ui.notify("Thanks -- that was sent.", "info");
|
|
373
|
+
else if (warning) ctx.ui.notify(warning, "warning");
|
|
374
|
+
else if (outcome === "queued")
|
|
375
|
+
ctx.ui.notify("Saved locally; it'll go when the service is reachable.", "warning");
|
|
376
|
+
else if (outcome === "skipped")
|
|
377
|
+
ctx.ui.notify(
|
|
378
|
+
"Nothing was sent: observations were turned off before it went, or this session has already sent its share.",
|
|
379
|
+
"info",
|
|
380
|
+
);
|
|
381
|
+
else if (outcome === "invalid")
|
|
382
|
+
ctx.ui.notify(
|
|
383
|
+
"That couldn't be sent safely -- it looked like it carried an id, path or address. Nothing was sent.",
|
|
384
|
+
"warning",
|
|
385
|
+
);
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
export function registerObservationsCommand(pi: ExtensionAPI): void {
|
|
389
|
+
pi.registerCommand("observations", {
|
|
390
|
+
description:
|
|
391
|
+
"Show or change automatic Galaxy-failure reporting. Subcommands: status | mode <off|ask|auto> | sent | retract <id>.",
|
|
392
|
+
handler: async (args: string | undefined, ctx: ExtensionContext) => {
|
|
393
|
+
const parts = (args ?? "").trim().split(/\s+/).filter(Boolean);
|
|
394
|
+
const sub = (parts[0] ?? "").toLowerCase();
|
|
395
|
+
try {
|
|
396
|
+
if (!sub || sub === "status") return await showStatus(ctx);
|
|
397
|
+
if (sub === "mode") return await changeMode(ctx, (parts[1] ?? "").toLowerCase());
|
|
398
|
+
if (sub === "sent") {
|
|
399
|
+
ctx.ui.notify(sentLogSummary(readSentLog()), "info");
|
|
400
|
+
return;
|
|
401
|
+
}
|
|
402
|
+
if (sub === "retract") return await doRetract(ctx, parts[1] ?? "");
|
|
403
|
+
ctx.ui.notify(
|
|
404
|
+
`Unknown /observations subcommand: ${sub}.\n${OBSERVATIONS_USAGE}`,
|
|
405
|
+
"warning",
|
|
406
|
+
);
|
|
407
|
+
} catch (err) {
|
|
408
|
+
ctx.ui.notify(
|
|
409
|
+
`/observations ${sub}: ${err instanceof Error ? err.message : String(err)}`,
|
|
410
|
+
"error",
|
|
411
|
+
);
|
|
412
|
+
}
|
|
413
|
+
},
|
|
414
|
+
});
|
|
415
|
+
|
|
416
|
+
pi.registerCommand("observe", {
|
|
417
|
+
description:
|
|
418
|
+
"Report that the agent or Galaxy got something wrong, as one generic line. You see the payload before it goes.",
|
|
419
|
+
handler: doObserve,
|
|
420
|
+
});
|
|
421
|
+
}
|