@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,177 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Build a lesson document from the fields an agent proposed.
|
|
3
|
+
*
|
|
4
|
+
* The model supplies field VALUES; this module supplies the document -- the
|
|
5
|
+
* key set, the key order, the section order, and every field that establishes
|
|
6
|
+
* provenance or standing. So a proposal cannot arrive already marked `stable`,
|
|
7
|
+
* cannot claim a human wrote or verified it, and cannot mark itself graduated
|
|
8
|
+
* (which would hide it on arrival).
|
|
9
|
+
*
|
|
10
|
+
* What this module deliberately does NOT do is sanitise. It normalises CRLF and
|
|
11
|
+
* trims, and otherwise inserts the model's values verbatim -- a two-line title
|
|
12
|
+
* stays two lines, a non-string stays a non-string. A scrubbing pass here would
|
|
13
|
+
* launder a poisoned draft into one the validator accepts. Compose writes the
|
|
14
|
+
* bytes; validateLessonMarkdown judges them.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import { stringify as stringifyYaml } from "yaml";
|
|
18
|
+
import { BODY_SECTIONS, TRIGGER_KEYS } from "../../../shared/lesson-rules.js";
|
|
19
|
+
|
|
20
|
+
export interface LessonProposalTrigger {
|
|
21
|
+
signatures?: string[];
|
|
22
|
+
tools?: string[];
|
|
23
|
+
mcp_tools?: string[];
|
|
24
|
+
formats?: string[];
|
|
25
|
+
hosts?: string[];
|
|
26
|
+
extensions?: string[];
|
|
27
|
+
step_keywords?: string[];
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export interface LessonProposalSections {
|
|
31
|
+
symptom: string;
|
|
32
|
+
cause?: string;
|
|
33
|
+
check_first: string;
|
|
34
|
+
intervention: string;
|
|
35
|
+
validate: string;
|
|
36
|
+
not_when: string;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export interface LessonProposalSource {
|
|
40
|
+
id: string;
|
|
41
|
+
resource?: string;
|
|
42
|
+
title?: string;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/** Exactly what a model may supply. Anything else is ignored by compose. */
|
|
46
|
+
export interface LessonProposalInput {
|
|
47
|
+
namespace: string;
|
|
48
|
+
slug: string;
|
|
49
|
+
title: string;
|
|
50
|
+
description: string;
|
|
51
|
+
kind: string;
|
|
52
|
+
stage: string[];
|
|
53
|
+
tags?: string[];
|
|
54
|
+
stale_after: string;
|
|
55
|
+
cues: string;
|
|
56
|
+
applies_to: { versions: string; tested: string };
|
|
57
|
+
evidence: { symptom: string; cause: string; outcome: string; method: string };
|
|
58
|
+
trigger?: LessonProposalTrigger;
|
|
59
|
+
sources?: LessonProposalSource[];
|
|
60
|
+
sections: LessonProposalSections;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
export interface ComposeMeta {
|
|
64
|
+
/** e.g. "agent:loom/0.8.0". Never taken from the input. */
|
|
65
|
+
generatedBy: string;
|
|
66
|
+
/** YYYY-MM-DD. Never taken from the input. */
|
|
67
|
+
generatedAt: string;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* CRLF would make the line-based validator's view differ from what an editor
|
|
72
|
+
* shows. Anything that is not a string is passed through untouched so the
|
|
73
|
+
* validator reports it as the wrong type instead of compose papering over it.
|
|
74
|
+
*/
|
|
75
|
+
function text(value: unknown): unknown {
|
|
76
|
+
// ASCII whitespace only: String.trim() also eats U+2028, U+00A0 and U+FEFF,
|
|
77
|
+
// which would hide them from the validator's printable-ASCII rule.
|
|
78
|
+
return typeof value === "string"
|
|
79
|
+
? value.replace(/\r\n/g, "\n").replace(/^[ \t\n]+|[ \t\n]+$/g, "")
|
|
80
|
+
: value;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
function list(value: unknown): unknown {
|
|
84
|
+
if (value === undefined) return [];
|
|
85
|
+
return Array.isArray(value) ? value.map(text) : value;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
function pick(value: unknown, key: string): unknown {
|
|
89
|
+
return value !== null && typeof value === "object"
|
|
90
|
+
? (value as Record<string, unknown>)[key]
|
|
91
|
+
: undefined;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
export function composeLessonMarkdown(input: LessonProposalInput, meta: ComposeMeta): string {
|
|
95
|
+
const trigger: Record<string, unknown> = {};
|
|
96
|
+
for (const key of TRIGGER_KEYS) trigger[key] = list(pick(input?.trigger, key));
|
|
97
|
+
|
|
98
|
+
const sources = Array.isArray(input?.sources)
|
|
99
|
+
? input.sources.map((source) => {
|
|
100
|
+
const entry: Record<string, unknown> = { id: text(pick(source, "id")) };
|
|
101
|
+
for (const key of ["resource", "title"]) {
|
|
102
|
+
const value = pick(source, key);
|
|
103
|
+
if (value !== undefined) entry[key] = text(value);
|
|
104
|
+
}
|
|
105
|
+
return entry;
|
|
106
|
+
})
|
|
107
|
+
: list(input?.sources);
|
|
108
|
+
|
|
109
|
+
// Key ORDER is fixed here, not inherited from the input object, so the model
|
|
110
|
+
// does not decide what a reviewer reads first. Same order as the corpus.
|
|
111
|
+
const frontmatter: Record<string, unknown> = {
|
|
112
|
+
type: "Lesson",
|
|
113
|
+
title: text(input?.title),
|
|
114
|
+
description: text(input?.description),
|
|
115
|
+
tags: list(input?.tags),
|
|
116
|
+
// A local lesson is always a draft. Promotion is a human act in the corpus
|
|
117
|
+
// repo, and nothing on this path can perform it.
|
|
118
|
+
status: "draft",
|
|
119
|
+
generated: { by: meta.generatedBy, at: meta.generatedAt },
|
|
120
|
+
stale_after: text(input?.stale_after),
|
|
121
|
+
sources,
|
|
122
|
+
kind: text(input?.kind),
|
|
123
|
+
stage: list(input?.stage),
|
|
124
|
+
trigger,
|
|
125
|
+
cues: text(input?.cues),
|
|
126
|
+
applies_to: {
|
|
127
|
+
versions: text(pick(input?.applies_to, "versions")),
|
|
128
|
+
tested: text(pick(input?.applies_to, "tested")),
|
|
129
|
+
},
|
|
130
|
+
evidence: {
|
|
131
|
+
symptom: text(pick(input?.evidence, "symptom")),
|
|
132
|
+
cause: text(pick(input?.evidence, "cause")),
|
|
133
|
+
outcome: text(pick(input?.evidence, "outcome")),
|
|
134
|
+
method: text(pick(input?.evidence, "method")),
|
|
135
|
+
},
|
|
136
|
+
// Empty on purpose. A non-empty graduated_to means "do not surface this",
|
|
137
|
+
// and upstream/supersedes are curation decisions; none is the model's to
|
|
138
|
+
// make. `verified` is omitted entirely -- only a human reviewer adds one.
|
|
139
|
+
graduated_to: [],
|
|
140
|
+
upstream: [],
|
|
141
|
+
supersedes: [],
|
|
142
|
+
};
|
|
143
|
+
|
|
144
|
+
// lineWidth 0: no folding, so a long title stays on its line. blockQuote
|
|
145
|
+
// false: a multi-line value is written as one escaped double-quoted line,
|
|
146
|
+
// never a block scalar, so no value can put a line of its own -- a `---`
|
|
147
|
+
// that would close the frontmatter early -- into the document. The validator
|
|
148
|
+
// still rejects it as multi-line. No aliases either: the strict loader
|
|
149
|
+
// refuses them, and an alias is a way to show one value and mean another.
|
|
150
|
+
const yaml = stringifyYaml(frontmatter, {
|
|
151
|
+
lineWidth: 0,
|
|
152
|
+
blockQuote: false,
|
|
153
|
+
aliasDuplicateObjects: false,
|
|
154
|
+
}).replace(/\n$/, "");
|
|
155
|
+
|
|
156
|
+
const body = BODY_SECTIONS.map((section) => {
|
|
157
|
+
const value = text(pick(input?.sections, section.key));
|
|
158
|
+
if (!section.required && (value === undefined || value === "")) return null;
|
|
159
|
+
// A non-string is written as an empty section, which the validator refuses,
|
|
160
|
+
// rather than stringified into prose that would pass.
|
|
161
|
+
return `## ${section.heading}\n\n${typeof value === "string" ? value : ""}`;
|
|
162
|
+
})
|
|
163
|
+
.filter((block): block is string => block !== null)
|
|
164
|
+
.join("\n\n");
|
|
165
|
+
|
|
166
|
+
return `---\n${yaml}\n---\n\n${body}\n`;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
/**
|
|
170
|
+
* The draft as shown to the user: all of it. The validator already capped the
|
|
171
|
+
* file at 16 KB and ruled out URLs, fences and invisible characters, and the
|
|
172
|
+
* approval is only a control if what is approved is exactly what was seen --
|
|
173
|
+
* a truncated preview hides the sections, which come last.
|
|
174
|
+
*/
|
|
175
|
+
export function renderProposalPreview(markdown: string): string {
|
|
176
|
+
return markdown;
|
|
177
|
+
}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* How often each lesson has been surfaced, locally.
|
|
3
|
+
*
|
|
4
|
+
* C5 fixes the shape and the one rule that matters: this is NEVER transmitted.
|
|
5
|
+
* A `{lesson id, helped}` ping would reveal which problem the user hit. What
|
|
6
|
+
* this file is for is the user's own question -- "what keeps firing at me?" --
|
|
7
|
+
* and the /lesson command's suppress list.
|
|
8
|
+
*
|
|
9
|
+
* Deliberately NOT under LOOM_LESSONS_DIR: the lessons directory holds content
|
|
10
|
+
* that can be shared or pointed somewhere else, and this is one install's tally.
|
|
11
|
+
*
|
|
12
|
+
* Read-modify-write on every bump, with no in-memory cache. The file is small,
|
|
13
|
+
* and two concurrent sessions losing a count matters far less than one of them
|
|
14
|
+
* serving a stale suppress flag.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import fs from "node:fs";
|
|
18
|
+
import path from "node:path";
|
|
19
|
+
import { resolveStateDir } from "../../../shared/state-dir.js";
|
|
20
|
+
|
|
21
|
+
export interface LessonCounter {
|
|
22
|
+
surfaced: number;
|
|
23
|
+
suppressed: boolean;
|
|
24
|
+
/** ISO 8601, or "" when this id has only ever been suppressed. */
|
|
25
|
+
lastSurfaced: string;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export type LessonCounters = Record<string, LessonCounter>;
|
|
29
|
+
|
|
30
|
+
const MAX_BYTES = 1024 * 1024;
|
|
31
|
+
|
|
32
|
+
export function countersPath(): string {
|
|
33
|
+
return path.join(resolveStateDir(), "lessons", "counters.json");
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export function readCounters(file: string = countersPath()): LessonCounters {
|
|
37
|
+
// Null prototype: the keys come from a file anyone can edit, and a
|
|
38
|
+
// "__proto__" key must stay a key.
|
|
39
|
+
const out: LessonCounters = Object.create(null);
|
|
40
|
+
try {
|
|
41
|
+
if (fs.statSync(file).size > MAX_BYTES) return out;
|
|
42
|
+
const data: unknown = JSON.parse(fs.readFileSync(file, "utf-8"));
|
|
43
|
+
if (!data || typeof data !== "object" || Array.isArray(data)) return out;
|
|
44
|
+
for (const [id, value] of Object.entries(data as Record<string, unknown>)) {
|
|
45
|
+
const v = (value && typeof value === "object" ? value : {}) as Record<string, unknown>;
|
|
46
|
+
out[id] = {
|
|
47
|
+
surfaced:
|
|
48
|
+
typeof v.surfaced === "number" && Number.isFinite(v.surfaced) && v.surfaced > 0
|
|
49
|
+
? Math.floor(v.surfaced)
|
|
50
|
+
: 0,
|
|
51
|
+
suppressed: v.suppressed === true,
|
|
52
|
+
lastSurfaced: typeof v.lastSurfaced === "string" ? v.lastSurfaced : "",
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
return out;
|
|
56
|
+
} catch {
|
|
57
|
+
return out;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/** Atomic, 0600, and silent on failure -- a tally is not worth failing a turn. */
|
|
62
|
+
function writeCounters(file: string, counters: LessonCounters): void {
|
|
63
|
+
const tmp = `${file}.tmp-${process.pid}`;
|
|
64
|
+
try {
|
|
65
|
+
fs.mkdirSync(path.dirname(file), { recursive: true });
|
|
66
|
+
fs.writeFileSync(tmp, `${JSON.stringify(counters, null, 2)}\n`, { mode: 0o600 });
|
|
67
|
+
fs.renameSync(tmp, file);
|
|
68
|
+
fs.chmodSync(file, 0o600);
|
|
69
|
+
} catch {
|
|
70
|
+
try {
|
|
71
|
+
fs.unlinkSync(tmp);
|
|
72
|
+
} catch {
|
|
73
|
+
/* nothing was written */
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
export function bumpSurfaced(lessonId: string, opts: { file?: string; now?: Date } = {}): void {
|
|
79
|
+
const file = opts.file ?? countersPath();
|
|
80
|
+
const counters = readCounters(file);
|
|
81
|
+
const prev = counters[lessonId];
|
|
82
|
+
counters[lessonId] = {
|
|
83
|
+
surfaced: (prev?.surfaced ?? 0) + 1,
|
|
84
|
+
suppressed: prev?.suppressed ?? false,
|
|
85
|
+
lastSurfaced: (opts.now ?? new Date()).toISOString(),
|
|
86
|
+
};
|
|
87
|
+
writeCounters(file, counters);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Mirror the config's suppress list into the counters file, so the
|
|
92
|
+
* `suppressed` field C5 specifies is actually live -- a suppressed lesson never
|
|
93
|
+
* surfaces, so a bump would never set it. Nothing reads this flag to decide
|
|
94
|
+
* anything; `lessons.suppress` in the config is the authority. Writes only on
|
|
95
|
+
* a real change.
|
|
96
|
+
*/
|
|
97
|
+
export function syncSuppressedFlags(suppressed: string[], opts: { file?: string } = {}): void {
|
|
98
|
+
const file = opts.file ?? countersPath();
|
|
99
|
+
const counters = readCounters(file);
|
|
100
|
+
const want = new Set(suppressed);
|
|
101
|
+
let changed = false;
|
|
102
|
+
|
|
103
|
+
for (const id of want) {
|
|
104
|
+
const prev = counters[id];
|
|
105
|
+
if (prev?.suppressed === true) continue;
|
|
106
|
+
counters[id] = {
|
|
107
|
+
surfaced: prev?.surfaced ?? 0,
|
|
108
|
+
suppressed: true,
|
|
109
|
+
lastSurfaced: prev?.lastSurfaced ?? "",
|
|
110
|
+
};
|
|
111
|
+
changed = true;
|
|
112
|
+
}
|
|
113
|
+
for (const [id, counter] of Object.entries(counters)) {
|
|
114
|
+
if (counter.suppressed && !want.has(id)) {
|
|
115
|
+
counters[id] = { ...counter, suppressed: false };
|
|
116
|
+
changed = true;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
if (changed) writeCounters(file, counters);
|
|
120
|
+
}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The one switch for the lesson loop: `lessons.enabled` in the Orbit config.
|
|
3
|
+
*
|
|
4
|
+
* Off by default. Off means nothing recorded reaches the model on any
|
|
5
|
+
* surface (inline hint, /execute note, reproduction index, lessons_search),
|
|
6
|
+
* /lesson and lesson_propose refuse, and the observation collector is off
|
|
7
|
+
* whatever its own mode says. On means lessons are surfaced and searchable,
|
|
8
|
+
* /lesson works, and collection follows `observations.mode` again.
|
|
9
|
+
*
|
|
10
|
+
* Kept apart from the store so observations-config can read it without
|
|
11
|
+
* pulling the corpus loader in. Two env spellings on top of the config:
|
|
12
|
+
* `LOOM_LESSONS=off` is a hard disable that wins over everything, for a
|
|
13
|
+
* managed deployment; `LOOM_LESSONS=on` turns the switch on where nobody can
|
|
14
|
+
* write the config (the eval runner's throwaway HOME, CI). The on spelling
|
|
15
|
+
* only ever enables READING lessons: observations still need their own mode,
|
|
16
|
+
* which no env value can set.
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
import fs from "node:fs";
|
|
20
|
+
import { getConfigPath, loadConfig, saveConfig } from "../config.js";
|
|
21
|
+
import { envNames } from "../../../shared/orbit-env.js";
|
|
22
|
+
|
|
23
|
+
export interface LessonsSwitch {
|
|
24
|
+
enabled: boolean;
|
|
25
|
+
/** Where the answer came from, for the status line. */
|
|
26
|
+
source: "env" | "config" | "default";
|
|
27
|
+
/** The env var that decided it, when `source` is "env" -- for messages. */
|
|
28
|
+
via?: string;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
function envValue(name: string, env: NodeJS.ProcessEnv): string | undefined {
|
|
32
|
+
const value = env[name];
|
|
33
|
+
return typeof value === "string" ? value.trim().toLowerCase() : undefined;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
function envNameWith(value: string, env: NodeJS.ProcessEnv): string | undefined {
|
|
37
|
+
return envNames("LESSONS").find((n) => envValue(n, env) === value);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export function describeLessonsSwitch(env: NodeJS.ProcessEnv = process.env): LessonsSwitch {
|
|
41
|
+
// Every spelling is checked for "off" first, so an ambient ORBIT_LESSONS=on
|
|
42
|
+
// can't mask a LOOM_LESSONS=off a deployment put there on purpose.
|
|
43
|
+
const off = envNameWith("off", env);
|
|
44
|
+
if (off) return { enabled: false, source: "env", via: off };
|
|
45
|
+
const cfg = loadConfig() as { lessons?: { enabled?: unknown } };
|
|
46
|
+
const configured = cfg.lessons?.enabled;
|
|
47
|
+
if (configured === true || configured === false) {
|
|
48
|
+
return { enabled: configured, source: "config" };
|
|
49
|
+
}
|
|
50
|
+
const on = envNameWith("on", env);
|
|
51
|
+
if (on) return { enabled: true, source: "env", via: on };
|
|
52
|
+
return { enabled: false, source: "default" };
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/** Master switch. Off means no lesson reaches the model on any surface. */
|
|
56
|
+
export function isLessonsEnabled(): boolean {
|
|
57
|
+
return describeLessonsSwitch().enabled;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/** True when the env has the last word, so the config can't change anything. */
|
|
61
|
+
export function isLessonsHardDisabled(env: NodeJS.ProcessEnv = process.env): boolean {
|
|
62
|
+
return envNameWith("off", env) !== undefined;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/** The one line every refusing surface points at. */
|
|
66
|
+
export const LESSONS_OFF_POINTER = "Lessons are off on this install. /lessons on turns them on.";
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Write `lessons.enabled`. Fail-closed like the other config writers:
|
|
70
|
+
* loadConfig() returns {} for a file it can't parse (or one that isn't an
|
|
71
|
+
* object), and saving that back would wipe the user's API keys.
|
|
72
|
+
*
|
|
73
|
+
* Turning the loop on also sets `observations.mode` back to `off` when the
|
|
74
|
+
* file holds anything else: a mode left behind from before the switch went
|
|
75
|
+
* off, or hand-edited in, must not start reporting the moment lessons come
|
|
76
|
+
* back. The user picks a mode again; the one-time auto acknowledgement is
|
|
77
|
+
* kept, since it only records that the sample payload was seen.
|
|
78
|
+
*/
|
|
79
|
+
export function setLessonsEnabled(enabled: boolean): void {
|
|
80
|
+
const off = envNameWith("off", process.env);
|
|
81
|
+
if (off) {
|
|
82
|
+
throw new Error(
|
|
83
|
+
`Lessons are hard-disabled for this install (${off}=off), so the switch can't be changed here.`,
|
|
84
|
+
);
|
|
85
|
+
}
|
|
86
|
+
const configPath = getConfigPath();
|
|
87
|
+
if (fs.existsSync(configPath)) {
|
|
88
|
+
let parsed: unknown;
|
|
89
|
+
try {
|
|
90
|
+
parsed = JSON.parse(fs.readFileSync(configPath, "utf-8"));
|
|
91
|
+
} catch (err) {
|
|
92
|
+
throw new Error(
|
|
93
|
+
"The Orbit config couldn't be read, so it wasn't changed -- fix or remove the file and try again.",
|
|
94
|
+
{ cause: err },
|
|
95
|
+
);
|
|
96
|
+
}
|
|
97
|
+
if (parsed === null || typeof parsed !== "object" || Array.isArray(parsed)) {
|
|
98
|
+
throw new Error(
|
|
99
|
+
"The Orbit config isn't a JSON object, so it wasn't changed -- fix or remove the file and try again.",
|
|
100
|
+
);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
const cfg = loadConfig();
|
|
104
|
+
cfg.lessons = { ...(cfg.lessons ?? {}), enabled };
|
|
105
|
+
if (enabled && cfg.observations?.mode !== undefined && cfg.observations.mode !== "off") {
|
|
106
|
+
cfg.observations = { ...cfg.observations, mode: "off" };
|
|
107
|
+
}
|
|
108
|
+
try {
|
|
109
|
+
saveConfig(cfg);
|
|
110
|
+
} catch (err) {
|
|
111
|
+
throw new Error(
|
|
112
|
+
"Couldn't write the Orbit config -- check file permissions and free space, then try again.",
|
|
113
|
+
{ cause: err },
|
|
114
|
+
);
|
|
115
|
+
}
|
|
116
|
+
}
|