@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,563 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The deterministic triggers that raise an observation, and the one path that
|
|
3
|
+
* delivers one.
|
|
4
|
+
*
|
|
5
|
+
* Every trigger ENQUEUES; nothing is built, shown or sent from inside the hook
|
|
6
|
+
* that noticed it. That is not bookkeeping -- in `ask` mode delivery blocks on
|
|
7
|
+
* ctx.ui.confirm, and awaiting a human inside a tool_result handler would stall
|
|
8
|
+
* the agent loop mid-turn. The queue drains on agent_settled, when the turn is
|
|
9
|
+
* over and the user is reading anyway.
|
|
10
|
+
*
|
|
11
|
+
* Three triggers, all deterministic, none of them a model judgement:
|
|
12
|
+
* - a Galaxy tool result with isError (one the shell's Galaxy tool family
|
|
13
|
+
* names, or one of Orbit's own `galaxy_*` tools)
|
|
14
|
+
* - the same tool and the same normalized signature RETRY_LOOP_THRESHOLD times
|
|
15
|
+
* - the evidence gate blocking a plan-step completion
|
|
16
|
+
* A fourth, the user's own `/observe`, lives in observations-command.ts and
|
|
17
|
+
* delivers immediately because the user is standing right there.
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
import type { ExtensionAPI, ExtensionContext } from "@earendil-works/pi-coding-agent";
|
|
21
|
+
import path from "node:path";
|
|
22
|
+
import { normalizeSignature } from "../../shared/observation-contract.js";
|
|
23
|
+
import type {
|
|
24
|
+
Observation,
|
|
25
|
+
ObservationKind,
|
|
26
|
+
ObservationTrigger,
|
|
27
|
+
} from "../../shared/observation-contract.js";
|
|
28
|
+
import { withoutAppendedLessonHints } from "./lessons/pi-event-contract";
|
|
29
|
+
import {
|
|
30
|
+
appendSentLog,
|
|
31
|
+
appendToObservationOutbox,
|
|
32
|
+
buildCheckedObservation,
|
|
33
|
+
collectObservationEnvelope,
|
|
34
|
+
consentFor,
|
|
35
|
+
drainObservationOutbox,
|
|
36
|
+
extractDatatypes,
|
|
37
|
+
extractToolIds,
|
|
38
|
+
observationToolName,
|
|
39
|
+
resetGalaxyVersion,
|
|
40
|
+
saveRetractToken,
|
|
41
|
+
sentLogEntryFor,
|
|
42
|
+
shapeForMode,
|
|
43
|
+
submitObservation,
|
|
44
|
+
withheldReason,
|
|
45
|
+
} from "./observations.js";
|
|
46
|
+
import type {
|
|
47
|
+
ObservationFacts,
|
|
48
|
+
ObservationProblems,
|
|
49
|
+
ObservationShape,
|
|
50
|
+
SubmitObservationResult,
|
|
51
|
+
} from "./observations.js";
|
|
52
|
+
import { getOrCreateInstallToken, resolveObservationsMode } from "./observations-config.js";
|
|
53
|
+
import type { ObservationsMode } from "./observations-config.js";
|
|
54
|
+
import { onEvidenceDecision } from "./evidence-gate.js";
|
|
55
|
+
import { appendActivityEvent } from "./activity.js";
|
|
56
|
+
import { getNotebookPath } from "./state.js";
|
|
57
|
+
import { confirmObservation, describeObservation } from "./observation-ui.js";
|
|
58
|
+
import type { GalaxyToolFamily } from "../../shared/galaxy-tool-family.js";
|
|
59
|
+
|
|
60
|
+
export const RETRY_LOOP_THRESHOLD = 3;
|
|
61
|
+
/**
|
|
62
|
+
* A local ceiling on top of the Worker's 200-per-24h. One pathological session
|
|
63
|
+
* should not be able to spend a day's budget, and 20 reports from one session
|
|
64
|
+
* is already more signal than triage can use.
|
|
65
|
+
*/
|
|
66
|
+
export const OBSERVATIONS_SESSION_CAP = 20;
|
|
67
|
+
|
|
68
|
+
export interface TriggerState {
|
|
69
|
+
/** `${tool}|${signature}` -> how many times it has failed this session. */
|
|
70
|
+
counts: Map<string, number>;
|
|
71
|
+
/** `${kind}|${tool}|${signature}` already reported, so nothing repeats. */
|
|
72
|
+
emitted: Set<string>;
|
|
73
|
+
/** Observations actually sent or queued this session. */
|
|
74
|
+
delivered: number;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
export function newTriggerState(): TriggerState {
|
|
78
|
+
return { counts: new Map(), emitted: new Set(), delivered: 0 };
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Pure. One failure of one tool with one signature in, at most one report out.
|
|
83
|
+
*
|
|
84
|
+
* A loop therefore yields two observations, not three or ten: the first
|
|
85
|
+
* failure is reported as a tool-error, and the third is reported as a
|
|
86
|
+
* retry-loop (which is the more informative one -- it says the agent could not
|
|
87
|
+
* get past it). Everything in between, and everything after, is silent.
|
|
88
|
+
*/
|
|
89
|
+
export function decideToolResultObservation(
|
|
90
|
+
state: TriggerState,
|
|
91
|
+
key: { mcpTool: string; signature: string; toolIds?: string[] },
|
|
92
|
+
): { kind: ObservationKind; trigger: ObservationTrigger } | null {
|
|
93
|
+
if (!key.mcpTool || !key.signature) return null;
|
|
94
|
+
// The Galaxy tool is part of "the same tool": three different tools failing
|
|
95
|
+
// galaxy_run_tool with one message are three failures, not a loop.
|
|
96
|
+
const tools = [...(key.toolIds ?? [])].sort().join(",");
|
|
97
|
+
const k = `${key.mcpTool}|${tools}|${key.signature}`;
|
|
98
|
+
const count = (state.counts.get(k) ?? 0) + 1;
|
|
99
|
+
state.counts.set(k, count);
|
|
100
|
+
|
|
101
|
+
const once = (kind: ObservationKind, trigger: ObservationTrigger) => {
|
|
102
|
+
const marker = `${kind}|${k}`;
|
|
103
|
+
if (state.emitted.has(marker)) return null;
|
|
104
|
+
state.emitted.add(marker);
|
|
105
|
+
return { kind, trigger };
|
|
106
|
+
};
|
|
107
|
+
|
|
108
|
+
if (count === 1) return once("tool-error", "tool_error");
|
|
109
|
+
if (count === RETRY_LOOP_THRESHOLD) return once("retry-loop", "retry_loop");
|
|
110
|
+
return null;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
// -----------------------------------------------------------------------------
|
|
114
|
+
// Session state
|
|
115
|
+
// -----------------------------------------------------------------------------
|
|
116
|
+
|
|
117
|
+
let state = newTriggerState();
|
|
118
|
+
const pending: ObservationFacts[] = [];
|
|
119
|
+
|
|
120
|
+
let lastFacts: ObservationFacts | null = null;
|
|
121
|
+
|
|
122
|
+
/** The most recent thing a trigger saw, so `mode auto` can show a real sample. */
|
|
123
|
+
export function lastObservationFacts(): ObservationFacts | null {
|
|
124
|
+
return lastFacts;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
export function resetObservationTriggers(): void {
|
|
128
|
+
state = newTriggerState();
|
|
129
|
+
pending.length = 0;
|
|
130
|
+
lastFacts = null;
|
|
131
|
+
resetGalaxyVersion();
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
export function enqueueObservation(facts: ObservationFacts): void {
|
|
135
|
+
lastFacts = facts;
|
|
136
|
+
pending.push(facts);
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
export function pendingObservationCount(): number {
|
|
140
|
+
return pending.length;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
// -----------------------------------------------------------------------------
|
|
144
|
+
// Facts from a tool result
|
|
145
|
+
// -----------------------------------------------------------------------------
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* `mcpTool` comes out in wire spelling (see observationToolName), so the retry
|
|
149
|
+
* key, the stage rules and the allowlist all see `galaxy_run_tool` whichever
|
|
150
|
+
* way pi spelled the call.
|
|
151
|
+
*/
|
|
152
|
+
export function factsForToolResult(
|
|
153
|
+
toolName: string,
|
|
154
|
+
input: Record<string, unknown>,
|
|
155
|
+
text: string,
|
|
156
|
+
family: GalaxyToolFamily,
|
|
157
|
+
): ObservationFacts | null {
|
|
158
|
+
const args = input ?? {};
|
|
159
|
+
const name = observationToolName(toolName, family);
|
|
160
|
+
if (!name) return null;
|
|
161
|
+
const raw = String(text ?? "").trim();
|
|
162
|
+
if (!raw) return null;
|
|
163
|
+
return {
|
|
164
|
+
kind: "tool-error",
|
|
165
|
+
trigger: "tool_error",
|
|
166
|
+
mcpTool: name,
|
|
167
|
+
inProcess: true as const,
|
|
168
|
+
toolIds: extractToolIds(args),
|
|
169
|
+
datatypes: extractDatatypes(args),
|
|
170
|
+
rawSignature: raw,
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
// -----------------------------------------------------------------------------
|
|
175
|
+
// Delivery
|
|
176
|
+
// -----------------------------------------------------------------------------
|
|
177
|
+
|
|
178
|
+
/**
|
|
179
|
+
* `unsaved`: the send failed in a way worth retrying, but the outbox could not
|
|
180
|
+
* be written, so nothing is kept. `sent-unretractable`: it went, but its
|
|
181
|
+
* retract token could not be saved. Both are local-write failures the user has
|
|
182
|
+
* to hear about, since the usual message ("saved locally", "retract it any
|
|
183
|
+
* time") would be untrue.
|
|
184
|
+
*/
|
|
185
|
+
export type DeliveryOutcome =
|
|
186
|
+
"sent" | "sent-unretractable" | "queued" | "unsaved" | "declined" | "invalid" | "skipped";
|
|
187
|
+
|
|
188
|
+
/**
|
|
189
|
+
* Everything impure, injected. The privacy-relevant decisions -- does this
|
|
190
|
+
* send, does the user see it first, is it legal to send at all -- are then
|
|
191
|
+
* testable with no pi session, no filesystem and no network.
|
|
192
|
+
*/
|
|
193
|
+
export interface DeliverDeps {
|
|
194
|
+
/** The mode this delivery started under; it decides the payload shape. */
|
|
195
|
+
mode: ObservationsMode;
|
|
196
|
+
/**
|
|
197
|
+
* The mode right now. Read again immediately before the POST, because the
|
|
198
|
+
* confirm can sit open for minutes and another session (or the user, in
|
|
199
|
+
* another window) can turn collection off in the meantime.
|
|
200
|
+
*/
|
|
201
|
+
currentMode(): ObservationsMode;
|
|
202
|
+
state: TriggerState;
|
|
203
|
+
installToken(): string;
|
|
204
|
+
/** Gets the built observation, never the raw facts. */
|
|
205
|
+
describe(obs: Observation, ctx: ExtensionContext): Promise<string>;
|
|
206
|
+
/** `note` is a one-line reason shown above the payload, e.g. why text was withheld. */
|
|
207
|
+
confirm(obs: Observation, ctx: ExtensionContext, note?: string): Promise<boolean>;
|
|
208
|
+
submit(obs: Observation): Promise<SubmitObservationResult>;
|
|
209
|
+
record(kind: string, payload: Record<string, unknown>): void;
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
export interface BuiltObservation {
|
|
213
|
+
obs: Observation;
|
|
214
|
+
valid: boolean;
|
|
215
|
+
errors: string[];
|
|
216
|
+
leaks: string[];
|
|
217
|
+
/** Patterns that got the signature withheld (ask only); empty otherwise. */
|
|
218
|
+
withheld: string[];
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
/**
|
|
222
|
+
* Build, check, and record -- and nothing else. Split out of
|
|
223
|
+
* deliverObservation so the eval replay can exercise exactly the half that
|
|
224
|
+
* matters for privacy with no transport anywhere in its call graph: a dry run
|
|
225
|
+
* that cannot send because there is nothing to send with, not because a stub
|
|
226
|
+
* refused.
|
|
227
|
+
*/
|
|
228
|
+
export function buildAndRecordObservation(
|
|
229
|
+
facts: ObservationFacts,
|
|
230
|
+
description: string,
|
|
231
|
+
deps: Pick<DeliverDeps, "installToken" | "record">,
|
|
232
|
+
shape: ObservationShape,
|
|
233
|
+
): BuiltObservation {
|
|
234
|
+
const { obs, errors, leaks, withheld } = buildCheckedObservation(
|
|
235
|
+
{ ...facts, description },
|
|
236
|
+
collectObservationEnvelope(deps.installToken()),
|
|
237
|
+
shape,
|
|
238
|
+
);
|
|
239
|
+
const valid = errors.length === 0;
|
|
240
|
+
// No free text in this row, ever. It is written before anyone has agreed to
|
|
241
|
+
// anything -- before the ask confirm, and for /observe the signature is the
|
|
242
|
+
// user's own sentence -- and a refused payload's text is exactly the text
|
|
243
|
+
// that may carry the leak. The structured fields are safe to show: they are
|
|
244
|
+
// admitted from allowlists by the builder. A withheld signature is named by
|
|
245
|
+
// the patterns it tripped, never by its text.
|
|
246
|
+
deps.record("observation.built", {
|
|
247
|
+
kind: obs.kind,
|
|
248
|
+
trigger: obs.trigger,
|
|
249
|
+
stage: obs.stage,
|
|
250
|
+
shape,
|
|
251
|
+
mcpTool: obs.mcpTool ?? "",
|
|
252
|
+
toolIds: obs.tools.map((t) => t.id).join(","),
|
|
253
|
+
datatypes: obs.datatypes.join(","),
|
|
254
|
+
server: obs.galaxy.server,
|
|
255
|
+
descriptionLength: obs.description.length,
|
|
256
|
+
signatureWithheld: withheld.join(","),
|
|
257
|
+
valid,
|
|
258
|
+
leakScan: leaks.length === 0 ? "clean" : "dirty",
|
|
259
|
+
});
|
|
260
|
+
return { obs, valid, errors, leaks, withheld };
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
function isClean(p: ObservationProblems): boolean {
|
|
264
|
+
return p.errors.length === 0 && p.leaks.length === 0;
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
export async function deliverObservation(
|
|
268
|
+
facts: ObservationFacts,
|
|
269
|
+
ctx: ExtensionContext,
|
|
270
|
+
deps: DeliverDeps,
|
|
271
|
+
): Promise<DeliveryOutcome> {
|
|
272
|
+
if (deps.mode === "off") {
|
|
273
|
+
deps.record("observation.skipped", { reason: "mode-off" });
|
|
274
|
+
return "skipped";
|
|
275
|
+
}
|
|
276
|
+
if (deps.state.delivered >= OBSERVATIONS_SESSION_CAP) {
|
|
277
|
+
deps.record("observation.skipped", { reason: "session-cap" });
|
|
278
|
+
return "skipped";
|
|
279
|
+
}
|
|
280
|
+
// `ask` without a dialog surface is not "send it anyway", it is "don't".
|
|
281
|
+
if (deps.mode === "ask" && !ctx.hasUI) {
|
|
282
|
+
deps.record("observation.skipped", { reason: "no-ui" });
|
|
283
|
+
return "skipped";
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
const shape = shapeForMode(deps.mode);
|
|
287
|
+
|
|
288
|
+
// Check the rest of the payload before asking anyone for a description: if
|
|
289
|
+
// it can't be sent, prompting the user for one is wasted, and the build
|
|
290
|
+
// below records the refusal either way. `auto` never asks -- it carries no
|
|
291
|
+
// free text.
|
|
292
|
+
let description = "";
|
|
293
|
+
const precheck =
|
|
294
|
+
shape === "full"
|
|
295
|
+
? buildCheckedObservation(
|
|
296
|
+
{ ...facts, description: "" },
|
|
297
|
+
collectObservationEnvelope(deps.installToken()),
|
|
298
|
+
shape,
|
|
299
|
+
)
|
|
300
|
+
: undefined;
|
|
301
|
+
if (precheck && isClean(precheck)) {
|
|
302
|
+
try {
|
|
303
|
+
description = await deps.describe(precheck.obs, ctx);
|
|
304
|
+
} catch {
|
|
305
|
+
// A description is a nice-to-have; the structured observation is the point.
|
|
306
|
+
description = "";
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
// The install token is written to config here, before any confirm, because a
|
|
311
|
+
// valid payload needs one and the confirm has to show the real payload. It
|
|
312
|
+
// is local state until the user says send.
|
|
313
|
+
const { obs, valid, errors, leaks, withheld } = buildAndRecordObservation(
|
|
314
|
+
facts,
|
|
315
|
+
description,
|
|
316
|
+
deps,
|
|
317
|
+
shape,
|
|
318
|
+
);
|
|
319
|
+
|
|
320
|
+
if (!valid || leaks.length > 0) {
|
|
321
|
+
// Fail closed. Nothing is sent, and only field and pattern names are
|
|
322
|
+
// recorded -- the offending value stays out of the log too.
|
|
323
|
+
deps.record("observation.invalid", {
|
|
324
|
+
kind: obs.kind,
|
|
325
|
+
errors: errors.join(","),
|
|
326
|
+
leaks: leaks.join(","),
|
|
327
|
+
});
|
|
328
|
+
return "invalid";
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
const note = withheld.length > 0 ? withheldReason(withheld) : undefined;
|
|
332
|
+
if (deps.mode === "ask" && !(await deps.confirm(obs, ctx, note))) {
|
|
333
|
+
// No signature: the user said no, and for /observe it is their own words.
|
|
334
|
+
deps.record("observation.declined", { kind: obs.kind });
|
|
335
|
+
return "declined";
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
// Consent is checked where it is spent. Off means off, even mid-confirm; and
|
|
339
|
+
// an auto delivery no longer goes once the user has stepped back to ask,
|
|
340
|
+
// since they never saw this one. An ask that was confirmed still goes under
|
|
341
|
+
// auto: the user has already seen it and said yes.
|
|
342
|
+
const now = deps.currentMode();
|
|
343
|
+
if (now === "off" || (deps.mode === "auto" && now !== "auto")) {
|
|
344
|
+
deps.record("observation.skipped", { reason: "mode-changed" });
|
|
345
|
+
return "skipped";
|
|
346
|
+
}
|
|
347
|
+
// Pinned to these exact bytes now, so a queued copy can be held to them.
|
|
348
|
+
const consent = consentFor(obs, deps.mode === "auto" ? "auto" : "ask");
|
|
349
|
+
|
|
350
|
+
const res = await deps.submit(obs);
|
|
351
|
+
if (res.ok) {
|
|
352
|
+
const tokenLost = Boolean(res.retractToken) && !saveRetractToken(obs.id, res.retractToken!);
|
|
353
|
+
appendSentLog(sentLogEntryFor(obs, "sent"));
|
|
354
|
+
deps.state.delivered += 1;
|
|
355
|
+
deps.record("observation.sent", {
|
|
356
|
+
id: obs.id,
|
|
357
|
+
kind: obs.kind,
|
|
358
|
+
// After consent, so the normalized signature may be logged -- except the
|
|
359
|
+
// user's own /observe sentence, which stays in the sent log only.
|
|
360
|
+
...(obs.trigger === "explicit" ? {} : { signature: obs.signature }),
|
|
361
|
+
...(tokenLost ? { tokenWrite: "failed" } : {}),
|
|
362
|
+
});
|
|
363
|
+
return tokenLost ? "sent-unretractable" : "sent";
|
|
364
|
+
}
|
|
365
|
+
if (res.status === 409) {
|
|
366
|
+
// The intake already holds this id from an attempt whose 202 was lost. It
|
|
367
|
+
// went; only the retract token is gone.
|
|
368
|
+
appendSentLog(sentLogEntryFor(obs, "sent"));
|
|
369
|
+
deps.state.delivered += 1;
|
|
370
|
+
deps.record("observation.sent", {
|
|
371
|
+
id: obs.id,
|
|
372
|
+
kind: obs.kind,
|
|
373
|
+
...(obs.trigger === "explicit" ? {} : { signature: obs.signature }),
|
|
374
|
+
duplicate: true,
|
|
375
|
+
});
|
|
376
|
+
return "sent-unretractable";
|
|
377
|
+
}
|
|
378
|
+
if (res.queueable) {
|
|
379
|
+
if (!appendToObservationOutbox(obs, consent)) {
|
|
380
|
+
deps.record("observation.unsaved", {
|
|
381
|
+
id: obs.id,
|
|
382
|
+
kind: obs.kind,
|
|
383
|
+
status: res.status ?? 0,
|
|
384
|
+
reason: "outbox-write-failed",
|
|
385
|
+
});
|
|
386
|
+
return "unsaved";
|
|
387
|
+
}
|
|
388
|
+
appendSentLog(sentLogEntryFor(obs, "queued"));
|
|
389
|
+
deps.state.delivered += 1;
|
|
390
|
+
deps.record("observation.queued", {
|
|
391
|
+
id: obs.id,
|
|
392
|
+
kind: obs.kind,
|
|
393
|
+
status: res.status ?? 0,
|
|
394
|
+
// Never the error text: it comes from the transport or the Worker.
|
|
395
|
+
reason: res.status ? `status ${res.status}` : "unreachable",
|
|
396
|
+
});
|
|
397
|
+
return "queued";
|
|
398
|
+
}
|
|
399
|
+
deps.record("observation.invalid", {
|
|
400
|
+
kind: obs.kind,
|
|
401
|
+
status: res.status ?? 0,
|
|
402
|
+
// The Worker's error list is endpoint-controlled text, and the endpoint
|
|
403
|
+
// can be repointed; only `field:reason` names are kept.
|
|
404
|
+
errors: (res.errors ?? []).filter(isFieldReason).join(","),
|
|
405
|
+
leaks: "",
|
|
406
|
+
});
|
|
407
|
+
return "invalid";
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
// -----------------------------------------------------------------------------
|
|
411
|
+
// Registration
|
|
412
|
+
// -----------------------------------------------------------------------------
|
|
413
|
+
|
|
414
|
+
const FIELD_REASON_RE = /^[A-Za-z0-9_.<>[\]]{1,60}:[a-z0-9-]{1,40}$/;
|
|
415
|
+
|
|
416
|
+
function isFieldReason(v: unknown): boolean {
|
|
417
|
+
return typeof v === "string" && FIELD_REASON_RE.test(v);
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
// A filesystem error message carries the path, and the path carries the
|
|
421
|
+
// username; only the error's code or name is printed.
|
|
422
|
+
function errorTag(err: unknown): string {
|
|
423
|
+
const code = (err as NodeJS.ErrnoException | undefined)?.code;
|
|
424
|
+
if (typeof code === "string") return code;
|
|
425
|
+
return err instanceof Error ? err.name : "error";
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
/** What to tell the user when a delivery's local write failed, if anything. */
|
|
429
|
+
export function localWriteWarning(outcome: DeliveryOutcome): string | undefined {
|
|
430
|
+
if (outcome === "unsaved") {
|
|
431
|
+
return "An observation couldn't be sent right now, and it couldn't be saved locally to retry either (check that the Orbit state directory is writable). Nothing was kept.";
|
|
432
|
+
}
|
|
433
|
+
if (outcome === "sent-unretractable") {
|
|
434
|
+
return "An observation was sent, but its retract token couldn't be saved locally, so /observations retract won't be able to delete it.";
|
|
435
|
+
}
|
|
436
|
+
return undefined;
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
/** Activity rows land beside the session's notebook, like every other row. */
|
|
440
|
+
export function recordObservationActivity(
|
|
441
|
+
kind: string,
|
|
442
|
+
payload: Record<string, unknown>,
|
|
443
|
+
source = "observations",
|
|
444
|
+
): void {
|
|
445
|
+
const notebook = getNotebookPath();
|
|
446
|
+
if (!notebook) return;
|
|
447
|
+
appendActivityEvent(path.dirname(notebook), {
|
|
448
|
+
timestamp: new Date().toISOString(),
|
|
449
|
+
kind,
|
|
450
|
+
source,
|
|
451
|
+
payload,
|
|
452
|
+
});
|
|
453
|
+
}
|
|
454
|
+
|
|
455
|
+
/** The production dep set. */
|
|
456
|
+
export function liveDeliverDeps(
|
|
457
|
+
ctxMode: ObservationsMode = resolveObservationsMode(),
|
|
458
|
+
): DeliverDeps {
|
|
459
|
+
return {
|
|
460
|
+
mode: ctxMode,
|
|
461
|
+
currentMode: resolveObservationsMode,
|
|
462
|
+
state,
|
|
463
|
+
installToken: getOrCreateInstallToken,
|
|
464
|
+
describe: (obs, ctx) => describeObservation(ctxMode, obs, ctx),
|
|
465
|
+
confirm: confirmObservation,
|
|
466
|
+
submit: submitObservation,
|
|
467
|
+
record: (kind, payload) => recordObservationActivity(kind, payload),
|
|
468
|
+
};
|
|
469
|
+
}
|
|
470
|
+
|
|
471
|
+
function errorTextOf(content: ReadonlyArray<{ type: string; text?: string }>): string {
|
|
472
|
+
// A hint Orbit appended is Orbit's prose, not the tool's error, wherever it
|
|
473
|
+
// sits. A block the TOOL opened with the marker is still the tool's error.
|
|
474
|
+
return withoutAppendedLessonHints(content)
|
|
475
|
+
.filter((c) => c.type === "text" && typeof c.text === "string")
|
|
476
|
+
.map((c) => c.text as string)
|
|
477
|
+
.join("\n");
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
const EVIDENCE_MARKER = "assertion-failed|evidence-gate";
|
|
481
|
+
|
|
482
|
+
export function registerObservationTriggers(pi: ExtensionAPI, family: GalaxyToolFamily): void {
|
|
483
|
+
pi.on("session_start", async () => {
|
|
484
|
+
resetObservationTriggers();
|
|
485
|
+
});
|
|
486
|
+
|
|
487
|
+
pi.on("tool_result", async (event) => {
|
|
488
|
+
// Registered AFTER secret redaction in index.ts, so `content` here is the
|
|
489
|
+
// already-scrubbed text the model sees. Reading the raw result would put
|
|
490
|
+
// an API key one normalization away from the wire.
|
|
491
|
+
if (resolveObservationsMode() === "off") return;
|
|
492
|
+
|
|
493
|
+
const failed = event.isError || Boolean((event.details as { error?: unknown })?.error);
|
|
494
|
+
if (!failed) return;
|
|
495
|
+
const facts = factsForToolResult(
|
|
496
|
+
event.toolName,
|
|
497
|
+
event.input,
|
|
498
|
+
errorTextOf(event.content),
|
|
499
|
+
family,
|
|
500
|
+
);
|
|
501
|
+
if (!facts) return;
|
|
502
|
+
|
|
503
|
+
const decision = decideToolResultObservation(state, {
|
|
504
|
+
mcpTool: facts.mcpTool ?? "",
|
|
505
|
+
toolIds: facts.toolIds,
|
|
506
|
+
signature: normalizeSignature(facts.rawSignature),
|
|
507
|
+
});
|
|
508
|
+
if (!decision) return;
|
|
509
|
+
enqueueObservation({ ...facts, kind: decision.kind, trigger: decision.trigger });
|
|
510
|
+
});
|
|
511
|
+
|
|
512
|
+
onEvidenceDecision((info) => {
|
|
513
|
+
if (info.outcome !== "blocked") return;
|
|
514
|
+
if (resolveObservationsMode() === "off") return;
|
|
515
|
+
// Once per session. The agent usually retries a blocked write, and each
|
|
516
|
+
// block would otherwise cost the user another prompt for the same report.
|
|
517
|
+
if (state.emitted.has(EVIDENCE_MARKER)) return;
|
|
518
|
+
state.emitted.add(EVIDENCE_MARKER);
|
|
519
|
+
enqueueObservation({
|
|
520
|
+
kind: "assertion-failed",
|
|
521
|
+
trigger: "assertion",
|
|
522
|
+
stage: "result-interpretation",
|
|
523
|
+
toolIds: [],
|
|
524
|
+
datatypes: [],
|
|
525
|
+
// No step text, no anchor, no invocation id: the signal is the shape of
|
|
526
|
+
// the mistake, and the shape is the whole message.
|
|
527
|
+
rawSignature:
|
|
528
|
+
"the evidence gate refused a plan-step completion claimed over an unfinished Galaxy invocation",
|
|
529
|
+
});
|
|
530
|
+
});
|
|
531
|
+
|
|
532
|
+
pi.on("agent_settled", async (_event, ctx) => {
|
|
533
|
+
// Earlier sends that hit a transport failure, a 429 or a 5xx. They were
|
|
534
|
+
// already consented to (confirmed, or sent in auto), so they go without a
|
|
535
|
+
// prompt -- but only unchanged, never while collection is off, and an
|
|
536
|
+
// auto row only while auto is still in effect.
|
|
537
|
+
if (resolveObservationsMode() !== "off") {
|
|
538
|
+
try {
|
|
539
|
+
const drained = await drainObservationOutbox(submitObservation, resolveObservationsMode);
|
|
540
|
+
if (drained.sent + drained.dropped > 0) {
|
|
541
|
+
recordObservationActivity("observation.outbox", { ...drained });
|
|
542
|
+
}
|
|
543
|
+
if (drained.unretractable && ctx.hasUI) {
|
|
544
|
+
ctx.ui.notify(localWriteWarning("sent-unretractable") ?? "", "warning");
|
|
545
|
+
}
|
|
546
|
+
} catch (err) {
|
|
547
|
+
console.error("observation outbox drain failed:", errorTag(err));
|
|
548
|
+
}
|
|
549
|
+
}
|
|
550
|
+
while (pending.length > 0) {
|
|
551
|
+
const facts = pending.shift();
|
|
552
|
+
if (!facts) break;
|
|
553
|
+
try {
|
|
554
|
+
const outcome = await deliverObservation(facts, ctx, liveDeliverDeps());
|
|
555
|
+
const warning = localWriteWarning(outcome);
|
|
556
|
+
if (warning && ctx.hasUI) ctx.ui.notify(warning, "warning");
|
|
557
|
+
} catch (err) {
|
|
558
|
+
// A failed delivery must never take the settle handler down with it.
|
|
559
|
+
console.error("observation delivery failed:", errorTag(err));
|
|
560
|
+
}
|
|
561
|
+
}
|
|
562
|
+
});
|
|
563
|
+
}
|