@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,134 @@
|
|
|
1
|
+
import type { ExtensionAPI, ExtensionContext } from "@earendil-works/pi-coding-agent";
|
|
2
|
+
import { getNotebookPath, setCurrentStepAnchor } from "./state.js";
|
|
3
|
+
import { checkPreconditions, renderFailures } from "./init-gate.js";
|
|
4
|
+
import { buildStepLessonNote } from "./lesson-hint.js";
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Plan/execution commands. Plans live as markdown sections in `notebook.md`;
|
|
8
|
+
* these commands send the agent an instruction to read the notebook and act.
|
|
9
|
+
*
|
|
10
|
+
* Before sending the agent off, run a precondition check (see init-gate.ts):
|
|
11
|
+
* - hard failures (no notebook; plan needs Galaxy but disconnected) refuse
|
|
12
|
+
* to send the agent prompt at all
|
|
13
|
+
* - soft failures (no plan; weak acceptance criteria; no history selected
|
|
14
|
+
* for a Galaxy plan) still prompt, but the prompt carries the failure
|
|
15
|
+
* list so the agent resolves with the user before invoking anything
|
|
16
|
+
*
|
|
17
|
+
* A passing gate also points `state.currentStepAnchor` at the step it found,
|
|
18
|
+
* so any Galaxy submission the agent makes in the run that follows is
|
|
19
|
+
* attributed to that step without the agent having to say so. The pointer is
|
|
20
|
+
* cleared when the run settles.
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
export function registerExecutionCommands(pi: ExtensionAPI): void {
|
|
24
|
+
// The anchor is ARMED by /execute and only goes live when a run actually
|
|
25
|
+
// starts. Setting it directly was wrong in two reachable ways.
|
|
26
|
+
//
|
|
27
|
+
// pi dispatches a slash command while a previous run is still streaming, but
|
|
28
|
+
// then rejects the `sendUserMessage` /execute makes (it passes no
|
|
29
|
+
// deliverAs), and that rejection is swallowed. So /execute during an active
|
|
30
|
+
// run repointed the anchor at a step whose run never began, and the RUNNING
|
|
31
|
+
// run's next Galaxy submission was filed under it. Separately, a send that
|
|
32
|
+
// fails for any other reason -- no model configured, auth -- left an anchor
|
|
33
|
+
// set with no agent_end coming to clear it.
|
|
34
|
+
//
|
|
35
|
+
// Arming means an anchor is only ever consumed by a run that really started,
|
|
36
|
+
// and every anchor that goes live has an agent_end to clear it.
|
|
37
|
+
let pendingAnchor: string | null = null;
|
|
38
|
+
let runActive = false;
|
|
39
|
+
|
|
40
|
+
const executeHandler = async (_args: string | undefined, ctx: ExtensionContext) => {
|
|
41
|
+
const nbPath = getNotebookPath();
|
|
42
|
+
const gate = await checkPreconditions();
|
|
43
|
+
|
|
44
|
+
if (gate.hardFailed) {
|
|
45
|
+
ctx.ui.notify(renderFailures(gate.failures), "warning");
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
if (!gate.ok) {
|
|
50
|
+
// A soft-failed gate still sends the agent off, but it has no step worth
|
|
51
|
+
// binding to -- most soft failures ARE "there is no usable next step".
|
|
52
|
+
// Only the armed anchor is dropped; a live one belongs to a run that is
|
|
53
|
+
// already going and is not ours to clear.
|
|
54
|
+
pendingAnchor = null;
|
|
55
|
+
ctx.ui.notify(renderFailures(gate.failures), "info");
|
|
56
|
+
pi.sendUserMessage(
|
|
57
|
+
`The user typed /execute (or /run) but the precondition check did not pass:\n\n${renderFailures(
|
|
58
|
+
gate.failures,
|
|
59
|
+
)}\n\nResolve these with the user first. Do NOT invoke Galaxy workflows or run local pipeline steps until the gate passes.`,
|
|
60
|
+
);
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// While a run is streaming pi rejects the message below, so there is no run
|
|
65
|
+
// to attribute and arming would only strand the anchor.
|
|
66
|
+
pendingAnchor = runActive ? null : (gate.plan?.nextStep?.anchor ?? null);
|
|
67
|
+
|
|
68
|
+
// Recorded lessons matching the next step's wording, framed as data and
|
|
69
|
+
// placed last. Not built while a run is streaming: pi drops that message,
|
|
70
|
+
// and a surfacing the model never saw shouldn't be counted.
|
|
71
|
+
const lessonNote = runActive ? "" : buildStepLessonNote(gate.plan?.nextStep?.raw ?? "");
|
|
72
|
+
|
|
73
|
+
pi.sendUserMessage(
|
|
74
|
+
`The user typed /execute (or /run). Read \`${nbPath}\`, locate the most ` +
|
|
75
|
+
`recent plan section that has unchecked steps (\`- [ ]\`), and execute ` +
|
|
76
|
+
`the next pending step, then continue the authorized plan as prerequisites are verified. ` +
|
|
77
|
+
`This is an execution request, not a request for another plan draft or status-only response. For each step:\n` +
|
|
78
|
+
`1. Decide local vs Galaxy per the plan's routing tag (see [local|hybrid|remote] in the section header).\n` +
|
|
79
|
+
`2. **Galaxy steps run in the BACKGROUND — this is the default.** Propose the run with loom_propose ` +
|
|
80
|
+
`and wait for the user's /approve, then invoke exactly that with the Galaxy tools and call ` +
|
|
81
|
+
`galaxy_invocation_record({ invocationId, notebookAnchor, label, proposalId }) — or, for a single tool run, ` +
|
|
82
|
+
`galaxy_job_record({ jobId, notebookAnchor, label, proposalId }). Continue other ready, authorized work. ` +
|
|
83
|
+
`If no work is ready because a prerequisite is still running, report that and yield; ` +
|
|
84
|
+
`the background poller queues automatic follow-up by default. Do NOT sit in this turn polling the invocation to completion. ` +
|
|
85
|
+
`Leave unverified steps unchecked. Respect an explicit automatic-follow-up opt-out and report it honestly.\n` +
|
|
86
|
+
`3. For local steps: run via bash synchronously; capture results into the notebook.\n` +
|
|
87
|
+
`4. **Verify before claiming done — but only for work that has actually finished.** A *local* result: verify now ` +
|
|
88
|
+
`(read/parse/lint/smoke-test; use the step's \`Verification:\` sub-bullet). For a Galaxy run, ` +
|
|
89
|
+
`verification happens automatically once it is terminal: inspect current job/invocation state and the output datasets, ` +
|
|
90
|
+
`record evidence, then flip the checkbox. If the run already finished, verify it in this turn, including immediately after submission. ` +
|
|
91
|
+
`Do not wait for the user to ask again.\n` +
|
|
92
|
+
`5. Write the verification evidence into the notebook before changing status.\n` +
|
|
93
|
+
`6. Only after verification succeeds, edit the markdown checkbox to \`- [x]\` (or \`- [!]\` on failure). ` +
|
|
94
|
+
`If verification is blocked or inconclusive, leave the step pending and record the actual blocker; ` +
|
|
95
|
+
`say "created but not verified" for created artifacts. Resolve it within existing authorization, ` +
|
|
96
|
+
`and ask only when a necessary decision, information or authorization is missing.\n` +
|
|
97
|
+
`Give concise progress updates while executing; status questions do not revoke authorization to continue. ` +
|
|
98
|
+
`Do NOT claim the artifact or step is done in chat unless verification evidence is recorded. ` +
|
|
99
|
+
`On failure, stop dependent work and investigate; do not advance past errors or unverified results. ` +
|
|
100
|
+
`Respect explicit pause/stop requests.` +
|
|
101
|
+
(lessonNote ? `\n\n${lessonNote}` : ""),
|
|
102
|
+
);
|
|
103
|
+
};
|
|
104
|
+
|
|
105
|
+
// Promote the armed anchor when a run actually starts.
|
|
106
|
+
pi.on("agent_start", async () => {
|
|
107
|
+
runActive = true;
|
|
108
|
+
if (pendingAnchor !== null) {
|
|
109
|
+
setCurrentStepAnchor(pendingAnchor);
|
|
110
|
+
pendingAnchor = null;
|
|
111
|
+
}
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
// Clear the pointer when the agent run settles, not on `turn_end`.
|
|
115
|
+
// pi's agentic loop emits turn_end after every model round trip inside one
|
|
116
|
+
// run (agent-loop.js emits turn_end at :131 and loops back to turn_start at
|
|
117
|
+
// :90), so clearing there would drop the anchor between the turn that reads
|
|
118
|
+
// the notebook and the turn that actually submits -- which is the normal
|
|
119
|
+
// shape of an /execute. `agent_end` fires once, when the run is over.
|
|
120
|
+
pi.on("agent_end", async () => {
|
|
121
|
+
runActive = false;
|
|
122
|
+
setCurrentStepAnchor(null);
|
|
123
|
+
});
|
|
124
|
+
|
|
125
|
+
pi.registerCommand("execute", {
|
|
126
|
+
description: "Execute authorized work in the latest plan section",
|
|
127
|
+
handler: executeHandler,
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
pi.registerCommand("run", {
|
|
131
|
+
description: "Alias for /execute",
|
|
132
|
+
handler: executeHandler,
|
|
133
|
+
});
|
|
134
|
+
}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import type { ExtensionAPI, ExtensionContext } from "@earendil-works/pi-coding-agent";
|
|
2
|
+
import { submitFeedback, buildBrainSysinfo, appendToOutbox, readOrbitVersion } from "./feedback.js";
|
|
3
|
+
import { getRecentActivityEvents } from "./activity.js";
|
|
4
|
+
import { loadConfig } from "./config.js";
|
|
5
|
+
import {
|
|
6
|
+
CLI_FEEDBACK_SOURCE,
|
|
7
|
+
SCHEMA_VERSION,
|
|
8
|
+
formatActivityTail,
|
|
9
|
+
capFeedbackPayload,
|
|
10
|
+
} from "../../shared/feedback-contract.js";
|
|
11
|
+
import type { FeedbackPayload } from "../../shared/feedback-contract.js";
|
|
12
|
+
import { readEnv } from "../../shared/orbit-env.js";
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* /feedback -- gather feedback inline via ctx.ui and POST it to the capture
|
|
16
|
+
* worker. Cross-shell: ctx.ui renders in Orbit desktop and the Orbit CLI alike. The
|
|
17
|
+
* brain cannot open Orbit's HTML modal (no plumbing), so this is the brain's
|
|
18
|
+
* own capture path. Guards on ctx.hasUI so it never POSTs an empty payload in
|
|
19
|
+
* non-interactive/RPC mode.
|
|
20
|
+
*/
|
|
21
|
+
export function registerFeedbackCommand(pi: ExtensionAPI): void {
|
|
22
|
+
pi.registerCommand("feedback", {
|
|
23
|
+
description: "Send feedback about Orbit to the team (captures optional diagnostics).",
|
|
24
|
+
handler: async (args: string | undefined, ctx: ExtensionContext) => {
|
|
25
|
+
if (!ctx.hasUI) {
|
|
26
|
+
ctx.ui.notify(
|
|
27
|
+
"/feedback needs interactive mode. Re-run it in Orbit or an interactive CLI session.",
|
|
28
|
+
"warning",
|
|
29
|
+
);
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
const title =
|
|
34
|
+
(args && args.trim()) || (await ctx.ui.input("Feedback -- short title", "Summarize it"));
|
|
35
|
+
if (!title || !title.trim()) return;
|
|
36
|
+
|
|
37
|
+
const body = (await ctx.ui.editor("What's the feedback?", "")) ?? "";
|
|
38
|
+
|
|
39
|
+
const includeDiagnostics = await ctx.ui.confirm(
|
|
40
|
+
"Include diagnostics?",
|
|
41
|
+
"Attach system info + a summary of recent activity (tool names, arguments, and truncated results), sent to the Orbit team's private feedback store. Credentials and API keys are redacted.",
|
|
42
|
+
);
|
|
43
|
+
|
|
44
|
+
// Opaque tester code (config, env override) -- non-secret; lets the team
|
|
45
|
+
// attribute the report. Omitted from the payload when unset.
|
|
46
|
+
const testerId = loadConfig().testerId || readEnv("TESTER_ID");
|
|
47
|
+
|
|
48
|
+
// The app version always rides along (non-sensitive build metadata) so every
|
|
49
|
+
// loom-cli row is filterable by release in triage, even without diagnostics.
|
|
50
|
+
const payload: FeedbackPayload = {
|
|
51
|
+
schemaVersion: SCHEMA_VERSION,
|
|
52
|
+
source: CLI_FEEDBACK_SOURCE,
|
|
53
|
+
title: title.trim(),
|
|
54
|
+
body: body.trim(),
|
|
55
|
+
clientTs: new Date().toISOString(),
|
|
56
|
+
...(testerId ? { testerId } : {}),
|
|
57
|
+
...(includeDiagnostics
|
|
58
|
+
? {
|
|
59
|
+
sysinfo: buildBrainSysinfo(),
|
|
60
|
+
activityTail: formatActivityTail(getRecentActivityEvents(60)),
|
|
61
|
+
}
|
|
62
|
+
: { sysinfo: { appVersion: readOrbitVersion() } }),
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
const capped = capFeedbackPayload(payload);
|
|
66
|
+
const res = await submitFeedback(capped);
|
|
67
|
+
if (res.ok) {
|
|
68
|
+
ctx.ui.notify("Thanks -- your feedback was sent.", "info");
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
// Durability: never lose the user's note if the store is unreachable.
|
|
72
|
+
const saved = appendToOutbox(capped);
|
|
73
|
+
ctx.ui.notify(
|
|
74
|
+
saved
|
|
75
|
+
? `Couldn't reach the feedback service (${res.error ?? "unknown error"}) -- saved locally, we'll pick it up later.`
|
|
76
|
+
: `Couldn't reach the feedback service (${res.error ?? "unknown error"}). Please try again later.`,
|
|
77
|
+
saved ? "warning" : "error",
|
|
78
|
+
);
|
|
79
|
+
},
|
|
80
|
+
});
|
|
81
|
+
}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import {
|
|
2
|
+
FEEDBACK_ROUTE,
|
|
3
|
+
FEEDBACK_ENDPOINT_URL,
|
|
4
|
+
FEEDBACK_KEY_HEADER,
|
|
5
|
+
SCHEMA_VERSION,
|
|
6
|
+
} from "../../shared/feedback-contract.js";
|
|
7
|
+
import type { FeedbackPayload, FeedbackSysinfo } from "../../shared/feedback-contract.js";
|
|
8
|
+
import { loadConfig, getConfigDir } from "./config.js";
|
|
9
|
+
import { loadProfiles } from "./profiles.js";
|
|
10
|
+
import { appendFileSync, readFileSync } from "fs";
|
|
11
|
+
import { fileURLToPath } from "url";
|
|
12
|
+
import { dirname, join } from "path";
|
|
13
|
+
import { release } from "os";
|
|
14
|
+
import { isWsl } from "../../shared/wsl.js";
|
|
15
|
+
import { readEnv } from "../../shared/orbit-env.js";
|
|
16
|
+
|
|
17
|
+
// Endpoint base is the shared constant; LOOM_FEEDBACK_URL overrides it for local
|
|
18
|
+
// dev (point at http://localhost:8787 while running `wrangler dev`).
|
|
19
|
+
const ENDPOINT = (readEnv("FEEDBACK_URL") || FEEDBACK_ENDPOINT_URL) + FEEDBACK_ROUTE;
|
|
20
|
+
const TIMEOUT_MS = 10_000;
|
|
21
|
+
|
|
22
|
+
export interface FeedbackResult {
|
|
23
|
+
ok: boolean;
|
|
24
|
+
status?: number;
|
|
25
|
+
id?: string;
|
|
26
|
+
error?: string;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Best-effort read of the Orbit package version so loom-cli rows carry a build for
|
|
31
|
+
* triage. Resolves the repo-root package.json the same way the brain resolves
|
|
32
|
+
* ../../shared at runtime. Returns undefined if it can't be read (safe fallback).
|
|
33
|
+
*/
|
|
34
|
+
export function readOrbitVersion(): string | undefined {
|
|
35
|
+
try {
|
|
36
|
+
const here = dirname(fileURLToPath(import.meta.url));
|
|
37
|
+
const pkg = JSON.parse(readFileSync(join(here, "../../package.json"), "utf-8")) as {
|
|
38
|
+
version?: string;
|
|
39
|
+
};
|
|
40
|
+
return pkg.version;
|
|
41
|
+
} catch {
|
|
42
|
+
return undefined;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/** Brain-side sysinfo. No Electron here (the brain is a Node child), no secrets. */
|
|
47
|
+
export function buildBrainSysinfo(): FeedbackSysinfo {
|
|
48
|
+
const cfg = loadConfig() as {
|
|
49
|
+
llm?: { active?: string; providers?: Record<string, { model?: string }> };
|
|
50
|
+
};
|
|
51
|
+
const active = cfg.llm?.active;
|
|
52
|
+
return {
|
|
53
|
+
appVersion: readOrbitVersion(),
|
|
54
|
+
platform: process.platform,
|
|
55
|
+
arch: process.arch,
|
|
56
|
+
wsl: isWsl({ platform: process.platform, env: process.env, release: release() }),
|
|
57
|
+
node: process.versions.node,
|
|
58
|
+
llmProvider: active,
|
|
59
|
+
llmModel: active ? cfg.llm?.providers?.[active]?.model : undefined,
|
|
60
|
+
galaxyConfigured: Boolean(loadProfiles().active),
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export async function submitFeedback(payload: FeedbackPayload): Promise<FeedbackResult> {
|
|
65
|
+
try {
|
|
66
|
+
const headers: Record<string, string> = { "Content-Type": "application/json" };
|
|
67
|
+
const feedbackKey = readEnv("FEEDBACK_KEY");
|
|
68
|
+
if (feedbackKey) headers[FEEDBACK_KEY_HEADER] = feedbackKey;
|
|
69
|
+
const res = await fetch(ENDPOINT, {
|
|
70
|
+
method: "POST",
|
|
71
|
+
headers,
|
|
72
|
+
body: JSON.stringify(payload),
|
|
73
|
+
signal: AbortSignal.timeout(TIMEOUT_MS),
|
|
74
|
+
});
|
|
75
|
+
const data = (await res.json().catch(() => ({}))) as { id?: string; error?: string };
|
|
76
|
+
return { ok: res.ok, status: res.status, id: data.id, error: data.error };
|
|
77
|
+
} catch (err) {
|
|
78
|
+
return { ok: false, error: err instanceof Error ? err.message : String(err) };
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Durability backstop: when a POST fails, append the payload to a local outbox so
|
|
84
|
+
* the feedback isn't lost. Returns the outbox path on success, null on failure.
|
|
85
|
+
*/
|
|
86
|
+
export function appendToOutbox(payload: FeedbackPayload): string | null {
|
|
87
|
+
try {
|
|
88
|
+
const outbox = join(getConfigDir(), "feedback-outbox.jsonl");
|
|
89
|
+
appendFileSync(outbox, JSON.stringify(payload) + "\n", "utf-8");
|
|
90
|
+
return outbox;
|
|
91
|
+
} catch {
|
|
92
|
+
return null;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
export const FEEDBACK_SCHEMA_VERSION = SCHEMA_VERSION;
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { describe, it, expect, vi, beforeAll, afterAll, beforeEach, afterEach } from "vitest";
|
|
2
|
+
import { galaxyGetMostRecentHistory } from "./galaxy-api.js";
|
|
3
|
+
|
|
4
|
+
describe("galaxyGetMostRecentHistory", () => {
|
|
5
|
+
const origFetch = global.fetch;
|
|
6
|
+
beforeEach(() => {
|
|
7
|
+
process.env.GALAXY_URL = "https://g.example";
|
|
8
|
+
process.env.GALAXY_API_KEY = "k";
|
|
9
|
+
});
|
|
10
|
+
afterEach(() => {
|
|
11
|
+
global.fetch = origFetch;
|
|
12
|
+
delete process.env.GALAXY_URL;
|
|
13
|
+
delete process.env.GALAXY_API_KEY;
|
|
14
|
+
vi.restoreAllMocks();
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
it("calls most_recently_used with the api key and returns the history", async () => {
|
|
18
|
+
const fetchMock = vi
|
|
19
|
+
.fn()
|
|
20
|
+
.mockResolvedValue({ ok: true, json: async () => ({ id: "h1", name: "My History" }) });
|
|
21
|
+
global.fetch = fetchMock as unknown as typeof fetch;
|
|
22
|
+
const h = await galaxyGetMostRecentHistory();
|
|
23
|
+
expect(h?.id).toBe("h1");
|
|
24
|
+
expect(fetchMock).toHaveBeenCalledWith(
|
|
25
|
+
"https://g.example/api/histories/most_recently_used",
|
|
26
|
+
expect.objectContaining({ headers: { "x-api-key": "k" } }),
|
|
27
|
+
);
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
it("returns null when Galaxy returns an empty body", async () => {
|
|
31
|
+
global.fetch = vi
|
|
32
|
+
.fn()
|
|
33
|
+
.mockResolvedValue({ ok: true, json: async () => null }) as unknown as typeof fetch;
|
|
34
|
+
expect(await galaxyGetMostRecentHistory()).toBeNull();
|
|
35
|
+
});
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
// ---------------------------------------------------------------------------
|
|
39
|
+
// Redirects. Two real servers, because the thing being tested is what undici
|
|
40
|
+
// does with a credential header on a hop the mock layer never models.
|
|
41
|
+
// ---------------------------------------------------------------------------
|
|
42
|
+
|
|
43
|
+
import http from "node:http";
|
|
44
|
+
import type { AddressInfo } from "node:net";
|
|
45
|
+
import { galaxyGet, galaxyPost } from "./galaxy-api.js";
|
|
46
|
+
|
|
47
|
+
describe("galaxy API redirect handling", () => {
|
|
48
|
+
const KEY = "SEKRET-CANARY-123";
|
|
49
|
+
let target: http.Server;
|
|
50
|
+
let configured: http.Server;
|
|
51
|
+
let targetOrigin: string;
|
|
52
|
+
let configuredOrigin: string;
|
|
53
|
+
let keysSeenByTarget: (string | null)[] = [];
|
|
54
|
+
let keysSeenByConfigured: (string | null)[] = [];
|
|
55
|
+
let mode: "cross" | "same" | "plain" = "cross";
|
|
56
|
+
|
|
57
|
+
beforeAll(async () => {
|
|
58
|
+
target = http.createServer((req, res) => {
|
|
59
|
+
keysSeenByTarget.push((req.headers["x-api-key"] as string | undefined) ?? null);
|
|
60
|
+
res.writeHead(200, { "content-type": "application/json" });
|
|
61
|
+
res.end(JSON.stringify({ id: "leaked" }));
|
|
62
|
+
});
|
|
63
|
+
await new Promise<void>((r) => target.listen(0, "127.0.0.1", r));
|
|
64
|
+
targetOrigin = `http://127.0.0.1:${(target.address() as AddressInfo).port}`;
|
|
65
|
+
|
|
66
|
+
configured = http.createServer((req, res) => {
|
|
67
|
+
keysSeenByConfigured.push((req.headers["x-api-key"] as string | undefined) ?? null);
|
|
68
|
+
if (mode === "plain" || req.url?.endsWith("/settled")) {
|
|
69
|
+
res.writeHead(200, { "content-type": "application/json" });
|
|
70
|
+
res.end(JSON.stringify({ id: "h1" }));
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
const location =
|
|
74
|
+
mode === "cross" ? `${targetOrigin}${req.url}` : `${configuredOrigin}/api/settled`;
|
|
75
|
+
res.writeHead(302, { location });
|
|
76
|
+
res.end();
|
|
77
|
+
});
|
|
78
|
+
await new Promise<void>((r) => configured.listen(0, "127.0.0.1", r));
|
|
79
|
+
configuredOrigin = `http://127.0.0.1:${(configured.address() as AddressInfo).port}`;
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
afterAll(async () => {
|
|
83
|
+
await new Promise<void>((r) => target.close(() => r()));
|
|
84
|
+
await new Promise<void>((r) => configured.close(() => r()));
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
beforeEach(() => {
|
|
88
|
+
keysSeenByTarget = [];
|
|
89
|
+
keysSeenByConfigured = [];
|
|
90
|
+
process.env.GALAXY_URL = configuredOrigin;
|
|
91
|
+
process.env.GALAXY_API_KEY = KEY;
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
afterEach(() => {
|
|
95
|
+
delete process.env.GALAXY_URL;
|
|
96
|
+
delete process.env.GALAXY_API_KEY;
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
it("does not hand the API key to a host the configured server redirects to", async () => {
|
|
100
|
+
mode = "cross";
|
|
101
|
+
const err = await galaxyGet("/histories/most_recently_used").catch((e: Error) => e);
|
|
102
|
+
expect(err).toBeInstanceOf(Error);
|
|
103
|
+
expect((err as Error).message).toContain("GALAXY_URL");
|
|
104
|
+
expect((err as Error).message).toContain(targetOrigin);
|
|
105
|
+
expect(keysSeenByTarget).toEqual([]);
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
it("does not hand the key over on a POST either, nor replay the body", async () => {
|
|
109
|
+
mode = "cross";
|
|
110
|
+
const err = await galaxyPost("/tools/fetch", { history_id: "h1" }).catch((e: Error) => e);
|
|
111
|
+
expect((err as Error).message).toContain(targetOrigin);
|
|
112
|
+
expect(keysSeenByTarget).toEqual([]);
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
it("still follows a redirect that stays on the configured server", async () => {
|
|
116
|
+
mode = "same";
|
|
117
|
+
await expect(galaxyGet("/histories/most_recently_used")).resolves.toEqual({ id: "h1" });
|
|
118
|
+
// Both hops went to the configured server, both carrying the key.
|
|
119
|
+
expect(keysSeenByConfigured).toEqual([KEY, KEY]);
|
|
120
|
+
expect(keysSeenByTarget).toEqual([]);
|
|
121
|
+
});
|
|
122
|
+
});
|