@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,93 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unicode-confusables fold for tool-name lookups. STOPGAP -- see #100.
|
|
3
|
+
*
|
|
4
|
+
* Some open-weights LLMs (gpt-oss, smaller frontier models) sample
|
|
5
|
+
* Cyrillic/Greek lookalikes for Latin letters when generating identifiers
|
|
6
|
+
* -- most often `с` (U+0441) where Latin `c` belongs. pi-agent-core's
|
|
7
|
+
* tool dispatch does an exact-string match (prepareToolCall in
|
|
8
|
+
* node_modules/@earendil-works/pi-agent-core/dist/agent-loop.js), so one
|
|
9
|
+
* Cyrillic char in `brс_analytics_*` is enough to surface "Tool not
|
|
10
|
+
* found" to the agent.
|
|
11
|
+
*
|
|
12
|
+
* Why this is a stopgap and not a proper fix: the right place to
|
|
13
|
+
* normalize is at the lookup layer in pi-agent-core. Upstream's stance on input normalization is in
|
|
14
|
+
* earendil-works/pi#638 (case-mismatch case): "this is not something pi
|
|
15
|
+
* will 'normalize', and the suggested fix is just plain wrong." So
|
|
16
|
+
* landing this upstream is unlikely. Meanwhile we can't intercept
|
|
17
|
+
* before pi-agent-core's find() from inside Orbit either -- the
|
|
18
|
+
* message_end extension event is queued async by agent-session.js and
|
|
19
|
+
* races the synchronous tool dispatch.
|
|
20
|
+
*
|
|
21
|
+
* What this does: hook the tool-result message_end (which fires AFTER
|
|
22
|
+
* the not-found failure), fold confusables, and append a "Did you mean
|
|
23
|
+
* X?" hint to the error. The agent recovers in one turn instead of
|
|
24
|
+
* two or three. Drop this when upstream lookup becomes fold-aware or
|
|
25
|
+
* when models stop sampling lookalikes -- whichever comes first.
|
|
26
|
+
*/
|
|
27
|
+
/** @type {Record<string, string>} */
|
|
28
|
+
const CONFUSABLES = {
|
|
29
|
+
// Cyrillic lowercase that look like Latin
|
|
30
|
+
а: "a",
|
|
31
|
+
е: "e",
|
|
32
|
+
о: "o",
|
|
33
|
+
р: "p",
|
|
34
|
+
с: "c",
|
|
35
|
+
х: "x",
|
|
36
|
+
у: "y",
|
|
37
|
+
// Cyrillic uppercase
|
|
38
|
+
А: "A",
|
|
39
|
+
Е: "E",
|
|
40
|
+
О: "O",
|
|
41
|
+
Р: "P",
|
|
42
|
+
С: "C",
|
|
43
|
+
Х: "X",
|
|
44
|
+
У: "Y",
|
|
45
|
+
// Greek lowercase
|
|
46
|
+
ν: "v",
|
|
47
|
+
τ: "t",
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
/** @param {string} s @returns {string} */
|
|
51
|
+
export function foldConfusables(s) {
|
|
52
|
+
let changed = false;
|
|
53
|
+
let out = "";
|
|
54
|
+
for (const ch of s) {
|
|
55
|
+
const mapped = CONFUSABLES[ch];
|
|
56
|
+
if (mapped !== undefined) {
|
|
57
|
+
out += mapped;
|
|
58
|
+
changed = true;
|
|
59
|
+
} else {
|
|
60
|
+
out += ch;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return changed ? out : s;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/** @param {string} s @returns {boolean} */
|
|
67
|
+
export function hasConfusables(s) {
|
|
68
|
+
for (const ch of s) {
|
|
69
|
+
if (CONFUSABLES[ch] !== undefined) return true;
|
|
70
|
+
}
|
|
71
|
+
return false;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Look up a folded match for `badName` against `candidateNames`. Returns
|
|
76
|
+
* the canonical name iff `badName` actually contains a confusable AND its
|
|
77
|
+
* folded form equals one of the candidates' folded forms. Returns
|
|
78
|
+
* undefined when there's nothing to suggest -- including the case where
|
|
79
|
+
* `badName` is already pure ASCII and doesn't match anything (a real
|
|
80
|
+
* hallucination, not a confusables issue).
|
|
81
|
+
*
|
|
82
|
+
* @param {string} badName
|
|
83
|
+
* @param {string[]} candidateNames
|
|
84
|
+
* @returns {string | undefined}
|
|
85
|
+
*/
|
|
86
|
+
export function findConfusablesMatch(badName, candidateNames) {
|
|
87
|
+
if (!hasConfusables(badName)) return undefined;
|
|
88
|
+
const folded = foldConfusables(badName);
|
|
89
|
+
for (const name of candidateNames) {
|
|
90
|
+
if (foldConfusables(name) === folded) return name;
|
|
91
|
+
}
|
|
92
|
+
return undefined;
|
|
93
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import type { LlmProviderConfig } from "./orbit-config.js";
|
|
2
|
+
|
|
3
|
+
export interface CustomModelDef {
|
|
4
|
+
id: string;
|
|
5
|
+
name: string;
|
|
6
|
+
reasoning: boolean;
|
|
7
|
+
input: ("text" | "image")[];
|
|
8
|
+
contextWindow: number;
|
|
9
|
+
maxTokens: number;
|
|
10
|
+
cost: { input: number; output: number; cacheRead: number; cacheWrite: number };
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export interface ModelsConfig {
|
|
14
|
+
providers?: Record<
|
|
15
|
+
string,
|
|
16
|
+
{ name?: string; baseUrl?: string; api?: string; apiKey?: string; models?: unknown[] }
|
|
17
|
+
>;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export type EndpointApi = "openai-completions" | "anthropic-messages";
|
|
21
|
+
|
|
22
|
+
export const ENDPOINT_APIS: readonly EndpointApi[];
|
|
23
|
+
export const DEFAULT_ENDPOINT_API: EndpointApi;
|
|
24
|
+
/** Throws on any value outside ENDPOINT_APIS; empty/absent resolves to the default. */
|
|
25
|
+
export function normalizeEndpointApi(value: string | undefined | null): EndpointApi;
|
|
26
|
+
|
|
27
|
+
export const ACTIVE_LLM_API_KEY_ENV: "LOOM_ACTIVE_LLM_API_KEY";
|
|
28
|
+
export function isCustomProvider(entry: LlmProviderConfig | undefined): boolean;
|
|
29
|
+
export const NO_AUTH_API_KEY: "no-key";
|
|
30
|
+
export function isKeylessCustomProvider(entry: LlmProviderConfig | undefined | null): boolean;
|
|
31
|
+
export function synthesizeModelDef(entry: LlmProviderConfig): CustomModelDef;
|
|
32
|
+
export function mergeCustomProviderIntoModelsConfig(
|
|
33
|
+
modelsConfig: ModelsConfig,
|
|
34
|
+
providerName: string,
|
|
35
|
+
entry: LlmProviderConfig,
|
|
36
|
+
): ModelsConfig;
|
|
37
|
+
export function syncCustomProviderModelsFile(
|
|
38
|
+
modelsJsonPath: string,
|
|
39
|
+
providerName: string,
|
|
40
|
+
entry: LlmProviderConfig,
|
|
41
|
+
): ModelsConfig;
|
|
42
|
+
export function resolveActiveLlmApiKey(
|
|
43
|
+
entry: LlmProviderConfig | undefined,
|
|
44
|
+
env: NodeJS.ProcessEnv | Record<string, string | undefined>,
|
|
45
|
+
): string | undefined;
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { readEnv } from "./orbit-env.js";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* A provider entry is "custom" (a user-supplied endpoint) when it carries a
|
|
7
|
+
* non-empty baseUrl. That single field is the discriminator everywhere.
|
|
8
|
+
*/
|
|
9
|
+
export function isCustomProvider(entry) {
|
|
10
|
+
return Boolean(entry && entry.baseUrl);
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Wire formats a custom endpoint can speak. Both are pi APIs that need nothing
|
|
15
|
+
* beyond a base URL and an API key, which is the whole contract a custom
|
|
16
|
+
* provider entry can express -- pi knows others (bedrock, vertex, azure) but
|
|
17
|
+
* those need credentials and deployment identifiers this shape has nowhere to
|
|
18
|
+
* put, so offering them would promise something that cannot work.
|
|
19
|
+
*
|
|
20
|
+
* The two disagree about what a base URL includes, because their SDKs do:
|
|
21
|
+
* the OpenAI client appends `/chat/completions` to whatever it is given, so the
|
|
22
|
+
* version segment belongs in the URL (`https://host/v1`), while the Anthropic
|
|
23
|
+
* client appends `/v1/messages`, so it must not (`https://host`). Getting this
|
|
24
|
+
* backwards is a 404 against a URL that looks right.
|
|
25
|
+
*/
|
|
26
|
+
export const ENDPOINT_APIS = ["openai-completions", "anthropic-messages"];
|
|
27
|
+
|
|
28
|
+
/** What an entry with no explicit `api` means -- the only shape Loom used to speak. */
|
|
29
|
+
export const DEFAULT_ENDPOINT_API = "openai-completions";
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Resolve an entry's wire format, rejecting anything we can't actually drive.
|
|
33
|
+
*
|
|
34
|
+
* Throwing beats defaulting here. pi's ModelRegistry drops a provider whose
|
|
35
|
+
* `api` names no registered handler, so a typo would surface as
|
|
36
|
+
* "--provider/--model failed to resolve" with nothing pointing at the cause;
|
|
37
|
+
* and silently falling back to openai-completions would send OpenAI JSON at an
|
|
38
|
+
* Anthropic endpoint, which fails later and less legibly than failing here.
|
|
39
|
+
*/
|
|
40
|
+
export function normalizeEndpointApi(value) {
|
|
41
|
+
if (value === undefined || value === null || value === "") return DEFAULT_ENDPOINT_API;
|
|
42
|
+
const api = String(value).trim().toLowerCase();
|
|
43
|
+
if (!ENDPOINT_APIS.includes(api)) {
|
|
44
|
+
throw new Error(
|
|
45
|
+
`unsupported endpoint api "${value}" -- expected one of: ${ENDPOINT_APIS.join(", ")}`,
|
|
46
|
+
);
|
|
47
|
+
}
|
|
48
|
+
return api;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Build a permissive model def from just a model id. Cost is zeroed (custom
|
|
53
|
+
* endpoints are typically free, self-hosted, or billed somewhere Orbit cannot
|
|
54
|
+
* see) and the model is registered for selection; the key is supplied
|
|
55
|
+
* separately at runtime.
|
|
56
|
+
*
|
|
57
|
+
* The context window is a guess either way -- the endpoint is not asked and
|
|
58
|
+
* generally will not say. 128K mirrors the defaults used for the existing local
|
|
59
|
+
* litellm setup; an Anthropic-shaped endpoint gets 200K because every Claude
|
|
60
|
+
* model in service carries at least that, and under-declaring makes pi compact
|
|
61
|
+
* a conversation that had room left. Both clear the 50K picker floor and the
|
|
62
|
+
* 16K assertion floor, so neither hides the model (#418) or trips the
|
|
63
|
+
* "window too small" message (#419).
|
|
64
|
+
*/
|
|
65
|
+
export function synthesizeModelDef(entry) {
|
|
66
|
+
if (!entry.model) {
|
|
67
|
+
throw new Error("custom provider entry requires a model id to synthesize a model def");
|
|
68
|
+
}
|
|
69
|
+
const api = normalizeEndpointApi(entry.api);
|
|
70
|
+
return {
|
|
71
|
+
id: entry.model,
|
|
72
|
+
name: entry.model,
|
|
73
|
+
reasoning: false,
|
|
74
|
+
input: ["text"],
|
|
75
|
+
contextWindow: api === "anthropic-messages" ? 200000 : 128000,
|
|
76
|
+
maxTokens: 16384,
|
|
77
|
+
cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Name of the env var Orbit injects with the decrypted active-LLM key. We write
|
|
83
|
+
* this *name* (not the secret) into the synthesized models.json apiKey field.
|
|
84
|
+
*/
|
|
85
|
+
export const ACTIVE_LLM_API_KEY_ENV = "LOOM_ACTIVE_LLM_API_KEY";
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Return a NEW models.json config with the custom provider upserted. Other
|
|
89
|
+
* providers are preserved untouched.
|
|
90
|
+
*
|
|
91
|
+
* The apiKey field is set to the *name* of the env var Orbit injects, never the
|
|
92
|
+
* secret itself. pi's ModelRegistry rejects any custom (non-built-in) provider
|
|
93
|
+
* that defines models without an apiKey and drops the whole provider, so
|
|
94
|
+
* omitting it makes `--provider/--model` fail to resolve and the brain won't
|
|
95
|
+
* launch. The real key never lands on disk: bin/orbit.js hands it to pi with
|
|
96
|
+
* --api-key, which takes precedence. (pi 1.x reads a bare apiKey string as a
|
|
97
|
+
* literal, not an env-var name, so without --api-key this name itself is what
|
|
98
|
+
* gets sent.)
|
|
99
|
+
*/
|
|
100
|
+
export function mergeCustomProviderIntoModelsConfig(modelsConfig, providerName, entry) {
|
|
101
|
+
const providers = { ...((modelsConfig && modelsConfig.providers) || {}) };
|
|
102
|
+
providers[providerName] = {
|
|
103
|
+
name: providerName,
|
|
104
|
+
baseUrl: entry.baseUrl,
|
|
105
|
+
api: normalizeEndpointApi(entry.api),
|
|
106
|
+
apiKey: ACTIVE_LLM_API_KEY_ENV,
|
|
107
|
+
models: [synthesizeModelDef(entry)],
|
|
108
|
+
};
|
|
109
|
+
return { ...modelsConfig, providers };
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* Read models.json (if present), upsert the custom provider, write it back with
|
|
114
|
+
* mode 0600. Best-effort: a malformed existing file is treated as empty rather
|
|
115
|
+
* than throwing, matching how bin/orbit.js already tolerates models.json.
|
|
116
|
+
*/
|
|
117
|
+
export function syncCustomProviderModelsFile(modelsJsonPath, providerName, entry) {
|
|
118
|
+
let current = {};
|
|
119
|
+
try {
|
|
120
|
+
if (fs.existsSync(modelsJsonPath)) {
|
|
121
|
+
current = JSON.parse(fs.readFileSync(modelsJsonPath, "utf-8")) || {};
|
|
122
|
+
}
|
|
123
|
+
} catch {
|
|
124
|
+
current = {};
|
|
125
|
+
}
|
|
126
|
+
const merged = mergeCustomProviderIntoModelsConfig(current, providerName, entry);
|
|
127
|
+
fs.mkdirSync(path.dirname(modelsJsonPath), { recursive: true });
|
|
128
|
+
// Plain write + chmod (not tmp+rename): this file is regenerated on every
|
|
129
|
+
// launch, so a torn write is self-healing. chmod runs after the write because
|
|
130
|
+
// writeFileSync's mode option only applies when the file is first created.
|
|
131
|
+
fs.writeFileSync(modelsJsonPath, JSON.stringify(merged, null, 2), { mode: 0o600 });
|
|
132
|
+
try {
|
|
133
|
+
fs.chmodSync(modelsJsonPath, 0o600);
|
|
134
|
+
} catch {
|
|
135
|
+
/* best-effort */
|
|
136
|
+
}
|
|
137
|
+
return merged;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* What a keyless endpoint gets sent as its key. pi refuses to run a request
|
|
142
|
+
* with no key at all, and a server that doesn't check (llama-server, a local
|
|
143
|
+
* vLLM) ignores whatever arrives.
|
|
144
|
+
*/
|
|
145
|
+
export const NO_AUTH_API_KEY = "no-key";
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* A custom endpoint with no key stored in any form -- the user left the field
|
|
149
|
+
* blank because the server needs none (#600). An encrypted key counts as
|
|
150
|
+
* stored even where it can't be decrypted: that's a key we failed to read, and
|
|
151
|
+
* sending a placeholder in its place would hide the failure.
|
|
152
|
+
*/
|
|
153
|
+
export function isKeylessCustomProvider(entry) {
|
|
154
|
+
return isCustomProvider(entry) && !entry.apiKey && !entry.apiKeyEncrypted;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/**
|
|
158
|
+
* Resolve the API key for a custom provider at runtime. Orbit injects the
|
|
159
|
+
* decrypted key via LOOM_ACTIVE_LLM_API_KEY (or ORBIT_ACTIVE_LLM_API_KEY); the standalone CLI uses the
|
|
160
|
+
* plaintext apiKey on the entry; a keyless endpoint gets NO_AUTH_API_KEY.
|
|
161
|
+
* Returns undefined when none of those applies.
|
|
162
|
+
*/
|
|
163
|
+
export function resolveActiveLlmApiKey(entry, env) {
|
|
164
|
+
return (
|
|
165
|
+
(env && readEnv("ACTIVE_LLM_API_KEY", env)) ||
|
|
166
|
+
(entry && entry.apiKey) ||
|
|
167
|
+
(isKeylessCustomProvider(entry) ? NO_AUTH_API_KEY : undefined)
|
|
168
|
+
);
|
|
169
|
+
}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
export const DASHBOARD_SCHEMA_VERSION: 1;
|
|
2
|
+
|
|
3
|
+
/** Per-analysis layout file, beside notebook.md in the working directory. */
|
|
4
|
+
export const DASHBOARD_FILENAME: ".loom-dashboard.json";
|
|
5
|
+
|
|
6
|
+
/** Refuse to persist anything larger. Layout, not a blob store. */
|
|
7
|
+
export const DASHBOARD_MAX_BYTES: number;
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Advisory list used to build presets and to give the brain a vocabulary. It is
|
|
11
|
+
* deliberately not the set of renderable widgets -- the renderer's registry is
|
|
12
|
+
* that, and it includes flag-gated widgets this list should not advertise.
|
|
13
|
+
* Validation never consults either.
|
|
14
|
+
*/
|
|
15
|
+
export const KNOWN_WIDGET_TYPES: readonly string[];
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Caps the validator enforces by truncating. A caller that would rather refuse
|
|
19
|
+
* a click than silently drop what it just added reads them from here.
|
|
20
|
+
*/
|
|
21
|
+
export const MAX_DASHBOARDS: number;
|
|
22
|
+
export const MAX_PANELS: number;
|
|
23
|
+
|
|
24
|
+
/** Panel height bounds, in grid row units. */
|
|
25
|
+
export const MIN_ROWS: number;
|
|
26
|
+
export const MAX_ROWS: number;
|
|
27
|
+
|
|
28
|
+
export type PanelSpan = 1 | 2;
|
|
29
|
+
|
|
30
|
+
export interface DashboardPanelLayout {
|
|
31
|
+
/** Grid columns this panel occupies. */
|
|
32
|
+
span: PanelSpan;
|
|
33
|
+
/** Height in grid row units, 1..6. */
|
|
34
|
+
rows: number;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/** Who put this panel here. Recorded, preserved, and not yet rendered. */
|
|
38
|
+
export type PanelOrigin = "user" | "agent" | "preset";
|
|
39
|
+
|
|
40
|
+
export interface DashboardPanel {
|
|
41
|
+
id: string;
|
|
42
|
+
/** Widget type key. An unrecognised value is preserved, not dropped. */
|
|
43
|
+
widget: string;
|
|
44
|
+
/** Overrides the widget's own label when set. */
|
|
45
|
+
title?: string;
|
|
46
|
+
config: Record<string, unknown>;
|
|
47
|
+
layout: DashboardPanelLayout;
|
|
48
|
+
/**
|
|
49
|
+
* Provenance. Carried in v1 so that an agent curating the dashboard later can
|
|
50
|
+
* say who added a panel and why, and so the user can pin one against being
|
|
51
|
+
* re-curated away, without a schema migration. The validator preserves these;
|
|
52
|
+
* the host ignores them.
|
|
53
|
+
*
|
|
54
|
+
* **Absent reads as the user's.** The only panels that arrive with no
|
|
55
|
+
* provenance are hand-written ones, so anything deciding what an agent may
|
|
56
|
+
* touch has to treat an unlabelled panel as protected -- otherwise a
|
|
57
|
+
* hand-edited layout is the one case where curation quietly deletes work.
|
|
58
|
+
*/
|
|
59
|
+
addedBy?: PanelOrigin;
|
|
60
|
+
/** Short note on why this panel is here. Capped at 280 characters. */
|
|
61
|
+
reason?: string;
|
|
62
|
+
/** Set by the user to mean "leave this one alone". */
|
|
63
|
+
pinned?: boolean;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
export interface Dashboard {
|
|
67
|
+
id: string;
|
|
68
|
+
title: string;
|
|
69
|
+
panels: DashboardPanel[];
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
export interface DashboardDocument {
|
|
73
|
+
version: number;
|
|
74
|
+
/** id of the dashboard shown by default. Always present in a validated document. */
|
|
75
|
+
activeId: string;
|
|
76
|
+
dashboards: Dashboard[];
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
export interface DashboardProblem {
|
|
80
|
+
/** Dotted path into the input, "" for the document itself. */
|
|
81
|
+
path: string;
|
|
82
|
+
message: string;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
export type DashboardValidation =
|
|
86
|
+
| { ok: true; document: DashboardDocument; problems: DashboardProblem[] }
|
|
87
|
+
| { ok: false; problems: DashboardProblem[] };
|
|
88
|
+
|
|
89
|
+
export interface DashboardPreset {
|
|
90
|
+
id: string;
|
|
91
|
+
label: string;
|
|
92
|
+
description: string;
|
|
93
|
+
dashboard: Dashboard;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
export const DASHBOARD_PRESETS: readonly DashboardPreset[];
|
|
97
|
+
|
|
98
|
+
/** A fresh copy of a preset's dashboard, or null if there is no such preset. */
|
|
99
|
+
export function dashboardFromPreset(presetId: string): Dashboard | null;
|
|
100
|
+
|
|
101
|
+
/** The document a workspace starts with: one dashboard, the current-analysis preset. */
|
|
102
|
+
export function createDefaultDashboardDocument(): DashboardDocument;
|
|
103
|
+
|
|
104
|
+
export function serializeDashboardDocument(document: DashboardDocument): string;
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* A short content fingerprint for the layout file: the compare-and-swap token a
|
|
108
|
+
* save carries to prove which version it was based on. Returns null for a
|
|
109
|
+
* non-string (i.e. no file).
|
|
110
|
+
*/
|
|
111
|
+
export function dashboardRevision(raw: unknown): string | null;
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* Normalize an untrusted value into a dashboard document. Never throws.
|
|
115
|
+
*
|
|
116
|
+
* `ok: true` carries the document plus every repair that was made. `ok: false`
|
|
117
|
+
* means the input could not be repaired: not an object, no usable version, or a
|
|
118
|
+
* version newer than this build understands.
|
|
119
|
+
*/
|
|
120
|
+
export function validateDashboardDocument(input: unknown): DashboardValidation;
|
|
121
|
+
|
|
122
|
+
/** JSON text -> validated document. Same total-function guarantee. */
|
|
123
|
+
export function parseDashboardDocument(raw: unknown): DashboardValidation;
|