@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,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The one place pi's tool-result shape is named.
|
|
3
|
+
*
|
|
4
|
+
* The lesson matcher needs the CALL ARGUMENTS, not just the result text: a
|
|
5
|
+
* host in a URL, an extension in a path, a Galaxy tool id in `tool_id` are all
|
|
6
|
+
* triggers. Only `tool_result` carries them. `message_end` -- which the
|
|
7
|
+
* existing model-facing hints in `skill-triggers.ts` use -- carries just
|
|
8
|
+
* `{ message }`, so a hint hosted there could never match on arguments. The
|
|
9
|
+
* assertions below make that a compile error rather than a silently dead
|
|
10
|
+
* trigger table if upstream ever moves a field.
|
|
11
|
+
*
|
|
12
|
+
* Handlers chain inside one extension in registration order, and pi feeds each
|
|
13
|
+
* one the previous handler's `content`. So every handler registered after
|
|
14
|
+
* `registerLessonHint` sees the hint, which is why the hint is a block of its
|
|
15
|
+
* own, and why this module remembers which blocks it appended: a consumer that
|
|
16
|
+
* drops "the hint" drops only those, never a tool's own block that happens to
|
|
17
|
+
* open with the marker.
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
import type { MessageEndEvent, ToolResultEvent } from "@earendil-works/pi-coding-agent";
|
|
21
|
+
import { isLessonHintBlock } from "../../../shared/lesson-hint-marker.js";
|
|
22
|
+
|
|
23
|
+
// The exact text of every hint this process appended. A tool can open a block
|
|
24
|
+
// of its own with the marker, but it cannot put that block in here, so a
|
|
25
|
+
// hostile output that dresses its error up as a lesson is still read as the
|
|
26
|
+
// tool's error by the observation collector and the activity log. One entry
|
|
27
|
+
// per lesson that fired; cleared with the armed set on session_start.
|
|
28
|
+
const appendedHints = new Set<string>();
|
|
29
|
+
|
|
30
|
+
/** The content array pi hands a `tool_result` handler, and accepts back. */
|
|
31
|
+
export type LessonToolResultContent = ToolResultEvent["content"];
|
|
32
|
+
|
|
33
|
+
/** Everything lesson matching reads off a `tool_result` event. */
|
|
34
|
+
export interface LessonToolResultFields {
|
|
35
|
+
toolName: string;
|
|
36
|
+
toolCallId: string;
|
|
37
|
+
input: Record<string, unknown>;
|
|
38
|
+
content: LessonToolResultContent;
|
|
39
|
+
/**
|
|
40
|
+
* Carried for completeness, and deliberately NOT a matcher input:
|
|
41
|
+
* `invocation-failure-hint.ts` finds failures inside successful results, so
|
|
42
|
+
* gating a lesson on `isError` would miss the cases that matter.
|
|
43
|
+
*/
|
|
44
|
+
isError: boolean;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// Compile-time proof that pi's event really carries all of them.
|
|
48
|
+
const toolResultFields: (e: ToolResultEvent) => LessonToolResultFields = (e) => ({
|
|
49
|
+
toolName: e.toolName,
|
|
50
|
+
toolCallId: e.toolCallId,
|
|
51
|
+
input: e.input,
|
|
52
|
+
content: e.content,
|
|
53
|
+
isError: e.isError,
|
|
54
|
+
});
|
|
55
|
+
void toolResultFields;
|
|
56
|
+
|
|
57
|
+
// ...and that `message_end` carries nothing but the message, which is why the
|
|
58
|
+
// hint cannot live there.
|
|
59
|
+
type MessageEndExtraKeys = Exclude<keyof MessageEndEvent, "type" | "message">;
|
|
60
|
+
const messageEndHasOnlyMessage: [MessageEndExtraKeys] extends [never] ? true : false = true;
|
|
61
|
+
void messageEndHasOnlyMessage;
|
|
62
|
+
|
|
63
|
+
/** Every text block of a result, joined -- the signature-matching haystack. */
|
|
64
|
+
export function resultTextOf(content: LessonToolResultContent): string {
|
|
65
|
+
const parts: string[] = [];
|
|
66
|
+
for (const block of content) {
|
|
67
|
+
if (block.type === "text") parts.push(block.text);
|
|
68
|
+
}
|
|
69
|
+
return parts.join("\n");
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Add the hint as a text block of its own at the end. Not folded into the
|
|
74
|
+
* tool's last block: a later handler reading the result as the tool's output
|
|
75
|
+
* has to be able to tell the two apart, and a failed call with no text of its
|
|
76
|
+
* own would otherwise be described by the hint. By the time this runs the
|
|
77
|
+
* oversized-output recovery has already replaced a huge result with its
|
|
78
|
+
* preview (`index.ts` registers that first), so the end of the content is
|
|
79
|
+
* still the end of what the model reads. Returns a copy.
|
|
80
|
+
*/
|
|
81
|
+
export function appendHintToContent(
|
|
82
|
+
content: LessonToolResultContent,
|
|
83
|
+
hint: string,
|
|
84
|
+
): LessonToolResultContent {
|
|
85
|
+
appendedHints.add(hint);
|
|
86
|
+
return [...content, { type: "text", text: hint }];
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/** A block Orbit itself appended -- not merely one that opens with the marker. */
|
|
90
|
+
export function isAppendedLessonHint(
|
|
91
|
+
block: { type: string; text?: string } | null | undefined,
|
|
92
|
+
): boolean {
|
|
93
|
+
return isLessonHintBlock(block) && appendedHints.has(block!.text as string);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/** The content as the tool produced it: every hint Orbit appended removed. */
|
|
97
|
+
export function withoutAppendedLessonHints<T extends { type: string; text?: string }>(
|
|
98
|
+
content: readonly T[],
|
|
99
|
+
): T[] {
|
|
100
|
+
return content.filter((block) => !isAppendedLessonHint(block));
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
export function resetAppendedLessonHints(): void {
|
|
104
|
+
appendedHints.clear();
|
|
105
|
+
}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Replaying a planted lesson proposal, for the model-free eval.
|
|
3
|
+
*
|
|
4
|
+
* What is worth pinning deterministically is that a hostile draft is REJECTED
|
|
5
|
+
* and recorded as such. Reaching that through a model is unreliable by
|
|
6
|
+
* construction: a model that understood the attack declines to propose at all,
|
|
7
|
+
* which is the better behaviour and leaves no row to assert on. So the eval
|
|
8
|
+
* plants the proposal and drives the real core.
|
|
9
|
+
*
|
|
10
|
+
* The same shape as submission-replay.ts, with its two constraints:
|
|
11
|
+
*
|
|
12
|
+
* - the file must resolve inside the session directory (its resolveReplayPath,
|
|
13
|
+
* symlinks included), so the env var alone cannot point the replay anywhere
|
|
14
|
+
* else on the machine;
|
|
15
|
+
* - every replay writes a `lesson.replay` row FIRST, so its outcome is never
|
|
16
|
+
* indistinguishable from a proposal a user made.
|
|
17
|
+
*
|
|
18
|
+
* It does NOT forge an approval. It arms a proposal and calls proposeLesson
|
|
19
|
+
* with the session's real ctx, so the approval step still runs and still
|
|
20
|
+
* refuses when there is nobody to ask. A seam that could write a lesson
|
|
21
|
+
* without a human would be a hole, not a fixture.
|
|
22
|
+
*
|
|
23
|
+
* It also keeps the session_start ctx past the handler's return, which pi
|
|
24
|
+
* asks extensions not to do: the approval dialog is left pending (see below)
|
|
25
|
+
* and its answer comes back through that ctx. If the session is replaced
|
|
26
|
+
* while the dialog is open (/new, a fork, a resume), pi's RPC mode still
|
|
27
|
+
* delivers the answer to the old dialog, so a Save can still write the lesson
|
|
28
|
+
* -- and its lesson.saved row lands in the new session's activity log with no
|
|
29
|
+
* lesson.replay row ahead of it. Only a ctx.ui call made after the replacement
|
|
30
|
+
* throws (the stale-ctx error), and the .catch swallows that. Tolerable only
|
|
31
|
+
* because this runs behind ORBIT_LESSON_PROPOSAL_REPLAY (or its LOOM_ alias)
|
|
32
|
+
* in evals, where nothing replaces the session; nothing user-facing should
|
|
33
|
+
* copy it.
|
|
34
|
+
*/
|
|
35
|
+
|
|
36
|
+
import * as fs from "fs";
|
|
37
|
+
import { isLessonsEnabled } from "./enabled";
|
|
38
|
+
import * as path from "path";
|
|
39
|
+
import type { ExtensionAPI, ExtensionContext } from "@earendil-works/pi-coding-agent";
|
|
40
|
+
import { readEnv } from "../../../shared/orbit-env.js";
|
|
41
|
+
import { appendActivityEvent } from "../activity.js";
|
|
42
|
+
import { getNotebookPath } from "../state.js";
|
|
43
|
+
import { resolveReplayPath } from "../submission-replay.js";
|
|
44
|
+
import type { LessonProposalInput } from "./compose.js";
|
|
45
|
+
import { armLessonProposal, disarmLessonProposal, proposeLesson } from "./propose.js";
|
|
46
|
+
|
|
47
|
+
export function isLessonProposalReplayEnabled(): boolean {
|
|
48
|
+
return !!readEnv("LESSON_PROPOSAL_REPLAY")?.trim();
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export function registerLessonProposalReplay(pi: ExtensionAPI): void {
|
|
52
|
+
pi.on("session_start", async (_event, ctx: ExtensionContext) => {
|
|
53
|
+
const configured = readEnv("LESSON_PROPOSAL_REPLAY")?.trim();
|
|
54
|
+
if (!configured) return;
|
|
55
|
+
// Same answer the live surface gives: nothing read, written or armed while off.
|
|
56
|
+
if (!isLessonsEnabled()) return;
|
|
57
|
+
|
|
58
|
+
const notebookPath = getNotebookPath();
|
|
59
|
+
if (!notebookPath) return;
|
|
60
|
+
const sessionDir = path.dirname(notebookPath);
|
|
61
|
+
|
|
62
|
+
const file = resolveReplayPath(sessionDir, configured);
|
|
63
|
+
if (!file || !fs.existsSync(file)) return;
|
|
64
|
+
|
|
65
|
+
appendActivityEvent(sessionDir, {
|
|
66
|
+
timestamp: new Date().toISOString(),
|
|
67
|
+
kind: "lesson.replay",
|
|
68
|
+
source: "lesson-propose-replay",
|
|
69
|
+
// Relative to the realpath'd directory, the way resolveReplayPath
|
|
70
|
+
// compared it: against the spelled path a macOS /var -> /private/var hop
|
|
71
|
+
// turns this into a ../-climb through the machine's directory names.
|
|
72
|
+
payload: { file: path.relative(fs.realpathSync(sessionDir), file) },
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
let proposal: LessonProposalInput;
|
|
76
|
+
try {
|
|
77
|
+
proposal = JSON.parse(fs.readFileSync(file, "utf-8")) as LessonProposalInput;
|
|
78
|
+
} catch {
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// Live straight away: there is no agent run here to start it, and the
|
|
83
|
+
// replay stands in for a proposal made inside one.
|
|
84
|
+
const arming = armLessonProposal("explicit", { live: true });
|
|
85
|
+
// Not awaited. pi's RPC mode emits session_start before it starts reading
|
|
86
|
+
// stdin, so holding this handler open on the approval dialog would wait
|
|
87
|
+
// for an answer that can never arrive -- and hang the whole session.
|
|
88
|
+
// Everything up to the dialog (validation, the activity rows) still runs
|
|
89
|
+
// synchronously here.
|
|
90
|
+
void proposeLesson(proposal, {
|
|
91
|
+
hasUI: ctx.hasUI,
|
|
92
|
+
ui: {
|
|
93
|
+
notify: (message, level) => ctx.ui.notify(message, level),
|
|
94
|
+
select: (title, options) => ctx.ui.select(title, options),
|
|
95
|
+
confirm: (title, message) => ctx.ui.confirm(title, message),
|
|
96
|
+
},
|
|
97
|
+
})
|
|
98
|
+
.catch(() => undefined)
|
|
99
|
+
// A rejected draft keeps its retry; the replay's arming must not outlive
|
|
100
|
+
// it -- but a /lesson typed while the dialog was open is not ours to clear.
|
|
101
|
+
.finally(() => disarmLessonProposal(arming));
|
|
102
|
+
});
|
|
103
|
+
}
|
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `lesson_propose` -- the agent's only way to put a lesson on disk.
|
|
3
|
+
*
|
|
4
|
+
* A tool rather than a parse of the agent's next message:
|
|
5
|
+
*
|
|
6
|
+
* - pi validates arguments against this schema before execute runs, so a
|
|
7
|
+
* wrong-shaped proposal never reaches our code and the model gets an error
|
|
8
|
+
* it can act on. A fence parser would be a hand-written tokenizer attacked by
|
|
9
|
+
* exactly the content it extracts -- the body rules forbid code fences, so a
|
|
10
|
+
* hostile draft is the input that contains one.
|
|
11
|
+
* - structured fields are what let the brain build the document and own
|
|
12
|
+
* type/status/generated/verified by construction. A whole file from the
|
|
13
|
+
* model could only be allowlisted by re-parsing and re-emitting it, which is
|
|
14
|
+
* the scrubbing pass the threat model rules out.
|
|
15
|
+
* - the validator's errors come back as a tool result, so a rejection is
|
|
16
|
+
* correctable in the same turn.
|
|
17
|
+
* - execute gets a real ExtensionContext (ui + hasUI) in TUI, RPC and json mode.
|
|
18
|
+
*
|
|
19
|
+
* This schema is a convenience for the model, NOT the security boundary. Every
|
|
20
|
+
* cap here is re-enforced by validateLessonMarkdown on the composed bytes; a
|
|
21
|
+
* disagreement is a bug in this schema, never a reason to relax the validator.
|
|
22
|
+
*
|
|
23
|
+
* No promptSnippet: nothing about lessons goes in the cached system prompt.
|
|
24
|
+
*/
|
|
25
|
+
|
|
26
|
+
import type { ExtensionAPI, ExtensionContext } from "@earendil-works/pi-coding-agent";
|
|
27
|
+
import { Text } from "@earendil-works/pi-tui";
|
|
28
|
+
import { Type } from "@sinclair/typebox";
|
|
29
|
+
import {
|
|
30
|
+
EVIDENCE_CAUSE,
|
|
31
|
+
EVIDENCE_OUTCOME,
|
|
32
|
+
EVIDENCE_SYMPTOM,
|
|
33
|
+
LESSON_KINDS,
|
|
34
|
+
LESSON_STAGES,
|
|
35
|
+
LIMITS,
|
|
36
|
+
PROPOSABLE_NAMESPACES,
|
|
37
|
+
} from "../../../shared/lesson-rules.js";
|
|
38
|
+
import type { LessonProposalInput } from "./compose.js";
|
|
39
|
+
import { proposeLesson, type ProposeUiContext } from "./propose.js";
|
|
40
|
+
|
|
41
|
+
export const LESSON_PROPOSE_TOOL_NAME = "lesson_propose";
|
|
42
|
+
|
|
43
|
+
const literals = (values: readonly string[]) => Type.Union(values.map((v) => Type.Literal(v)));
|
|
44
|
+
|
|
45
|
+
const stringList = (maxLength: number, description: string) =>
|
|
46
|
+
Type.Optional(
|
|
47
|
+
Type.Array(Type.String({ maxLength }), { maxItems: LIMITS.listItems, description }),
|
|
48
|
+
);
|
|
49
|
+
|
|
50
|
+
const PARAMETERS = Type.Object({
|
|
51
|
+
namespace: literals(PROPOSABLE_NAMESPACES),
|
|
52
|
+
slug: Type.String({
|
|
53
|
+
maxLength: LIMITS.slug,
|
|
54
|
+
description:
|
|
55
|
+
"Lowercase words joined by hyphens naming the SITUATION, not the fix, e.g. " +
|
|
56
|
+
"'na-coerced-to-zero-in-filters'.",
|
|
57
|
+
}),
|
|
58
|
+
title: Type.String({
|
|
59
|
+
maxLength: LIMITS.title,
|
|
60
|
+
description: "One line describing the situation, not the fix.",
|
|
61
|
+
}),
|
|
62
|
+
description: Type.String({
|
|
63
|
+
maxLength: LIMITS.description,
|
|
64
|
+
description: "One line, one sentence.",
|
|
65
|
+
}),
|
|
66
|
+
kind: literals(LESSON_KINDS),
|
|
67
|
+
stage: Type.Array(literals(LESSON_STAGES), {
|
|
68
|
+
minItems: 1,
|
|
69
|
+
maxItems: LESSON_STAGES.length,
|
|
70
|
+
description: "Which stage(s) of an analysis this bites in.",
|
|
71
|
+
}),
|
|
72
|
+
tags: stringList(LIMITS.tag, "Short keywords."),
|
|
73
|
+
stale_after: Type.String({
|
|
74
|
+
maxLength: 10,
|
|
75
|
+
description:
|
|
76
|
+
"YYYY-MM-DD after which this should be re-checked. Galaxy ships quarterly, so pick 6-12 " +
|
|
77
|
+
"months out, and sooner for anything from a forum answer.",
|
|
78
|
+
}),
|
|
79
|
+
cues: Type.String({
|
|
80
|
+
maxLength: LIMITS.cues,
|
|
81
|
+
description: "When this applies, in a sentence a person reads. One line.",
|
|
82
|
+
}),
|
|
83
|
+
applies_to: Type.Object({
|
|
84
|
+
versions: Type.String({
|
|
85
|
+
maxLength: LIMITS.appliesTo,
|
|
86
|
+
description: "Versions it holds for, or 'any'.",
|
|
87
|
+
}),
|
|
88
|
+
tested: Type.String({
|
|
89
|
+
maxLength: LIMITS.appliesTo,
|
|
90
|
+
description: "What it was actually seen against.",
|
|
91
|
+
}),
|
|
92
|
+
}),
|
|
93
|
+
evidence: Type.Object({
|
|
94
|
+
symptom: literals(EVIDENCE_SYMPTOM),
|
|
95
|
+
cause: literals(EVIDENCE_CAUSE),
|
|
96
|
+
outcome: literals(EVIDENCE_OUTCOME),
|
|
97
|
+
method: Type.String({
|
|
98
|
+
maxLength: LIMITS.method,
|
|
99
|
+
description: "How you know. 'hypothesized' and 'unvalidated' are fine answers.",
|
|
100
|
+
}),
|
|
101
|
+
}),
|
|
102
|
+
trigger: Type.Optional(
|
|
103
|
+
Type.Object({
|
|
104
|
+
signatures: stringList(
|
|
105
|
+
LIMITS.signature,
|
|
106
|
+
"The distinctive first line of the error, at least 8 characters, with URLs, paths, " +
|
|
107
|
+
"emails, long hex ids and 5+ digit numbers already replaced by <url>, <path>, <email>, " +
|
|
108
|
+
"<id>, <n>.",
|
|
109
|
+
),
|
|
110
|
+
tools: stringList(LIMITS.tool, "Short Galaxy tool ids or families, e.g. 'deseq2'. No '/'."),
|
|
111
|
+
mcp_tools: stringList(LIMITS.mcpTool, "galaxy_* tool names."),
|
|
112
|
+
formats: stringList(LIMITS.format, "Lowercase Galaxy datatypes, e.g. 'tabular'."),
|
|
113
|
+
hosts: stringList(LIMITS.host, "Public hostnames seen in commands, e.g. 'ncbi.nlm.nih.gov'."),
|
|
114
|
+
extensions: stringList(LIMITS.extension, "File extensions seen in arguments, e.g. '.gtf'."),
|
|
115
|
+
step_keywords: stringList(
|
|
116
|
+
LIMITS.stepKeyword,
|
|
117
|
+
"Lowercase words matched against plan-step text.",
|
|
118
|
+
),
|
|
119
|
+
}),
|
|
120
|
+
),
|
|
121
|
+
sources: Type.Optional(
|
|
122
|
+
Type.Array(
|
|
123
|
+
Type.Object({
|
|
124
|
+
id: Type.String({ maxLength: LIMITS.sourceId }),
|
|
125
|
+
resource: Type.Optional(Type.String({ maxLength: LIMITS.sourceText })),
|
|
126
|
+
title: Type.Optional(Type.String({ maxLength: LIMITS.sourceText })),
|
|
127
|
+
}),
|
|
128
|
+
{
|
|
129
|
+
maxItems: LIMITS.listItems,
|
|
130
|
+
description:
|
|
131
|
+
"Required when this came from GTN or the forum, whose content is attribution-licensed. " +
|
|
132
|
+
"resource, if given, is an https link.",
|
|
133
|
+
},
|
|
134
|
+
),
|
|
135
|
+
),
|
|
136
|
+
sections: Type.Object(
|
|
137
|
+
{
|
|
138
|
+
symptom: Type.String({ maxLength: LIMITS.section }),
|
|
139
|
+
cause: Type.Optional(Type.String({ maxLength: LIMITS.section })),
|
|
140
|
+
check_first: Type.String({ maxLength: LIMITS.section }),
|
|
141
|
+
intervention: Type.String({ maxLength: LIMITS.section }),
|
|
142
|
+
validate: Type.String({ maxLength: LIMITS.section }),
|
|
143
|
+
not_when: Type.String({ maxLength: LIMITS.section }),
|
|
144
|
+
},
|
|
145
|
+
{
|
|
146
|
+
description:
|
|
147
|
+
"Prose only: no code fences, URLs, markdown links, headings or HTML. Up to 600 characters " +
|
|
148
|
+
"each. Omit `cause` if you do not actually know it.",
|
|
149
|
+
},
|
|
150
|
+
),
|
|
151
|
+
});
|
|
152
|
+
|
|
153
|
+
const DESCRIPTION = `Propose ONE lesson drawn from what happened in this session, for the user to
|
|
154
|
+
approve. The user always sees the draft and decides; nothing is written without that.
|
|
155
|
+
|
|
156
|
+
Only call this when the user asked -- they typed /lesson, or Orbit told you they corrected you and
|
|
157
|
+
they then said yes to writing it down. Never call it on your own initiative: an unasked call is
|
|
158
|
+
refused and recorded.
|
|
159
|
+
|
|
160
|
+
A lesson is for what you only catch by knowing the science or the data: a silently wrong result,
|
|
161
|
+
a sanity range that makes a silent failure visible, a choice and when it flips, a data-source
|
|
162
|
+
quirk, or what it actually takes to reproduce a published analysis. If a validator, a schema or a
|
|
163
|
+
better error message could catch it, it belongs upstream instead -- say so and do not call this.
|
|
164
|
+
|
|
165
|
+
Nothing identifying goes in a lesson: no paths, URLs, hostnames of private servers, ids, emails or
|
|
166
|
+
copied data values. If the draft fails the schema you get the violations back and may fix them
|
|
167
|
+
and call once more.`;
|
|
168
|
+
|
|
169
|
+
function uiOf(ctx: ExtensionContext): ProposeUiContext {
|
|
170
|
+
return {
|
|
171
|
+
hasUI: ctx.hasUI,
|
|
172
|
+
ui: {
|
|
173
|
+
notify: (message, level) => ctx.ui.notify(message, level),
|
|
174
|
+
select: (title, options) => ctx.ui.select(title, options),
|
|
175
|
+
confirm: (title, message) => ctx.ui.confirm(title, message),
|
|
176
|
+
},
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
export function registerLessonProposeTool(pi: ExtensionAPI): void {
|
|
181
|
+
pi.registerTool({
|
|
182
|
+
name: LESSON_PROPOSE_TOOL_NAME,
|
|
183
|
+
label: "Propose a Lesson",
|
|
184
|
+
description: DESCRIPTION,
|
|
185
|
+
parameters: PARAMETERS,
|
|
186
|
+
async execute(_toolCallId, params, _signal, _onUpdate, ctx: ExtensionContext) {
|
|
187
|
+
// Never throw out of execute: the model always gets an answer it can act
|
|
188
|
+
// on, and a thrown error would carry a stack instead.
|
|
189
|
+
try {
|
|
190
|
+
const outcome = await proposeLesson(params as unknown as LessonProposalInput, uiOf(ctx));
|
|
191
|
+
if (outcome.ok) {
|
|
192
|
+
return {
|
|
193
|
+
content: [
|
|
194
|
+
{
|
|
195
|
+
type: "text" as const,
|
|
196
|
+
text:
|
|
197
|
+
`The user approved it. Lesson saved as ${outcome.id}. Tell them it is saved, ` +
|
|
198
|
+
`as a local draft that stays on this machine.`,
|
|
199
|
+
},
|
|
200
|
+
],
|
|
201
|
+
details: { id: outcome.id, saved: true },
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
return {
|
|
205
|
+
content: [{ type: "text" as const, text: outcome.message }],
|
|
206
|
+
details: { error: true, reason: outcome.reason },
|
|
207
|
+
};
|
|
208
|
+
} catch {
|
|
209
|
+
return {
|
|
210
|
+
content: [{ type: "text" as const, text: "lesson_propose failed; nothing was saved." }],
|
|
211
|
+
details: { error: true, reason: "exception" },
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
},
|
|
215
|
+
renderResult: (result) => {
|
|
216
|
+
const details = result.details as
|
|
217
|
+
{ saved?: boolean; id?: string; reason?: string } | undefined;
|
|
218
|
+
if (details?.saved) return new Text(`Lesson saved: ${details.id}`);
|
|
219
|
+
return new Text(`Lesson not saved (${details?.reason ?? "rejected"})`);
|
|
220
|
+
},
|
|
221
|
+
});
|
|
222
|
+
}
|