@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,254 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
|
|
3
|
+
export interface SessionHeader {
|
|
4
|
+
id: string;
|
|
5
|
+
cwd: string;
|
|
6
|
+
createdAt: string;
|
|
7
|
+
parentSession: string | null;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export interface EntryRow {
|
|
11
|
+
entry_id: string;
|
|
12
|
+
parent_id: string | null;
|
|
13
|
+
entry_type: string;
|
|
14
|
+
timestamp: string;
|
|
15
|
+
role: "user" | "assistant" | null;
|
|
16
|
+
text_content: string | null;
|
|
17
|
+
raw_json: string;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export interface ToolCallRow {
|
|
21
|
+
entry_id: string;
|
|
22
|
+
tool_use_id: string;
|
|
23
|
+
tool_name: string;
|
|
24
|
+
arguments_json: string;
|
|
25
|
+
result_text: string | null;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export interface ParseResult {
|
|
29
|
+
header: SessionHeader;
|
|
30
|
+
entries: EntryRow[];
|
|
31
|
+
tool_calls: ToolCallRow[];
|
|
32
|
+
/** Latest customType=galaxy_analyst_plan entry's data.notebookPath, if any. */
|
|
33
|
+
notebookPath: string | null;
|
|
34
|
+
/** Latest customType=session_info name, if any. */
|
|
35
|
+
sessionName: string | null;
|
|
36
|
+
/**
|
|
37
|
+
* Byte offset (exclusive) of the last newline-terminated line parsed.
|
|
38
|
+
* Trailing bytes after the last newline are not consumed -- the next
|
|
39
|
+
* scan will re-read them, so a torn read while Pi is actively writing
|
|
40
|
+
* doesn't silently drop the partial line.
|
|
41
|
+
*/
|
|
42
|
+
endOffset: number;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export interface ParseOptions {
|
|
46
|
+
/** Start parsing from this byte offset (used for incremental scans). */
|
|
47
|
+
startOffset?: number;
|
|
48
|
+
/** Skip emitting the header if we're resuming past it. */
|
|
49
|
+
skipHeader?: boolean;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Parse a Pi session JSONL file into normalized rows for the index.
|
|
54
|
+
*
|
|
55
|
+
* Does NOT throw on malformed lines; invalid JSON lines are skipped and
|
|
56
|
+
* the caller's endOffset still advances past them (so incremental scans
|
|
57
|
+
* don't loop on a corrupt line).
|
|
58
|
+
*/
|
|
59
|
+
export function parseSessionFile(filePath: string, opts: ParseOptions = {}): ParseResult {
|
|
60
|
+
const startOffset = opts.startOffset ?? 0;
|
|
61
|
+
const buf = fs.readFileSync(filePath);
|
|
62
|
+
const slice = buf.subarray(startOffset);
|
|
63
|
+
const text = slice.toString("utf8");
|
|
64
|
+
|
|
65
|
+
const entries: EntryRow[] = [];
|
|
66
|
+
const toolCalls: ToolCallRow[] = [];
|
|
67
|
+
const pendingResults = new Map<string, string>();
|
|
68
|
+
let header: SessionHeader | null = null;
|
|
69
|
+
let notebookPath: string | null = null;
|
|
70
|
+
let sessionName: string | null = null;
|
|
71
|
+
|
|
72
|
+
let lineStart = 0;
|
|
73
|
+
let lastCompleteLineEnd = 0;
|
|
74
|
+
for (let i = 0; i < text.length; i++) {
|
|
75
|
+
if (text.charCodeAt(i) !== 10 /* \n */) continue;
|
|
76
|
+
const raw = text.slice(lineStart, i);
|
|
77
|
+
lineStart = i + 1;
|
|
78
|
+
lastCompleteLineEnd = i + 1;
|
|
79
|
+
if (raw.length === 0) continue;
|
|
80
|
+
let obj: Record<string, unknown>;
|
|
81
|
+
try {
|
|
82
|
+
obj = JSON.parse(raw);
|
|
83
|
+
} catch {
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
if (obj.type === "session") {
|
|
88
|
+
if (!opts.skipHeader) {
|
|
89
|
+
header = {
|
|
90
|
+
id: String(obj.id ?? ""),
|
|
91
|
+
cwd: String(obj.cwd ?? ""),
|
|
92
|
+
createdAt: String(obj.timestamp ?? ""),
|
|
93
|
+
parentSession: typeof obj.parentSession === "string" ? obj.parentSession : null,
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
continue;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
const row = entryRowFromObj(obj);
|
|
100
|
+
if (!row) continue;
|
|
101
|
+
entries.push(row);
|
|
102
|
+
|
|
103
|
+
if (row.entry_type === "message" && row.role === "assistant") {
|
|
104
|
+
for (const tc of extractToolUses(obj)) {
|
|
105
|
+
toolCalls.push({ entry_id: row.entry_id, ...tc });
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
if (row.entry_type === "message" && row.role === "user") {
|
|
109
|
+
for (const { tool_use_id, text_content } of extractToolResults(obj)) {
|
|
110
|
+
pendingResults.set(tool_use_id, text_content);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
if (row.entry_type === "custom") {
|
|
115
|
+
const customType = String((obj as { customType?: unknown }).customType ?? "");
|
|
116
|
+
if (customType === "galaxy_analyst_plan") {
|
|
117
|
+
const data = (obj as { data?: { notebookPath?: string } }).data;
|
|
118
|
+
if (data?.notebookPath) notebookPath = data.notebookPath;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
if (row.entry_type === "session_info") {
|
|
122
|
+
const name = (obj as { name?: string }).name;
|
|
123
|
+
if (name) sessionName = name;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
// Join tool-call results by tool_use_id (now a first-class field).
|
|
128
|
+
const byUseId = new Map<string, ToolCallRow>();
|
|
129
|
+
for (const tc of toolCalls) {
|
|
130
|
+
byUseId.set(tc.tool_use_id, tc);
|
|
131
|
+
}
|
|
132
|
+
for (const [useId, text] of pendingResults) {
|
|
133
|
+
const target = byUseId.get(useId);
|
|
134
|
+
if (target) target.result_text = text;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
if (!header && !opts.skipHeader) {
|
|
138
|
+
throw new Error(`No session header found in ${filePath}`);
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
return {
|
|
142
|
+
header: header ?? ({ id: "", cwd: "", createdAt: "", parentSession: null } as SessionHeader),
|
|
143
|
+
entries,
|
|
144
|
+
tool_calls: toolCalls,
|
|
145
|
+
notebookPath,
|
|
146
|
+
sessionName,
|
|
147
|
+
endOffset: startOffset + Buffer.byteLength(text.slice(0, lastCompleteLineEnd), "utf8"),
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
function entryRowFromObj(obj: Record<string, unknown>): EntryRow | null {
|
|
152
|
+
const type = typeof obj.type === "string" ? obj.type : "";
|
|
153
|
+
const entryId = typeof obj.id === "string" ? obj.id : null;
|
|
154
|
+
if (!type || !entryId) return null;
|
|
155
|
+
|
|
156
|
+
const parentId = typeof obj.parentId === "string" ? obj.parentId : null;
|
|
157
|
+
const timestamp = typeof obj.timestamp === "string" ? obj.timestamp : "";
|
|
158
|
+
|
|
159
|
+
let role: "user" | "assistant" | null = null;
|
|
160
|
+
let text: string | null = null;
|
|
161
|
+
if (type === "message") {
|
|
162
|
+
const msg = (obj as { message?: { role?: string; content?: unknown } }).message;
|
|
163
|
+
const r = msg?.role;
|
|
164
|
+
if (r === "user" || r === "assistant") role = r;
|
|
165
|
+
text = flattenTextBlocks(msg?.content);
|
|
166
|
+
} else if (type === "compaction") {
|
|
167
|
+
text =
|
|
168
|
+
typeof (obj as { summary?: string }).summary === "string"
|
|
169
|
+
? (obj as { summary: string }).summary
|
|
170
|
+
: null;
|
|
171
|
+
} else if (type === "branch_summary") {
|
|
172
|
+
text =
|
|
173
|
+
typeof (obj as { summary?: string }).summary === "string"
|
|
174
|
+
? (obj as { summary: string }).summary
|
|
175
|
+
: null;
|
|
176
|
+
} else if (type === "custom") {
|
|
177
|
+
text = JSON.stringify((obj as { data?: unknown }).data ?? null);
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
return {
|
|
181
|
+
entry_id: entryId,
|
|
182
|
+
parent_id: parentId,
|
|
183
|
+
entry_type: type,
|
|
184
|
+
timestamp,
|
|
185
|
+
role,
|
|
186
|
+
text_content: text,
|
|
187
|
+
raw_json: JSON.stringify(obj),
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
function flattenTextBlocks(content: unknown): string | null {
|
|
192
|
+
if (typeof content === "string") return content;
|
|
193
|
+
if (!Array.isArray(content)) return null;
|
|
194
|
+
const parts: string[] = [];
|
|
195
|
+
for (const block of content) {
|
|
196
|
+
if (typeof block === "string") {
|
|
197
|
+
parts.push(block);
|
|
198
|
+
continue;
|
|
199
|
+
}
|
|
200
|
+
if (!block || typeof block !== "object") continue;
|
|
201
|
+
const b = block as { type?: string; text?: string };
|
|
202
|
+
if (b.type === "text" && typeof b.text === "string") parts.push(b.text);
|
|
203
|
+
}
|
|
204
|
+
return parts.length > 0 ? parts.join("\n") : null;
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
function extractToolUses(
|
|
208
|
+
obj: Record<string, unknown>,
|
|
209
|
+
): Array<{ tool_use_id: string; tool_name: string; arguments_json: string; result_text: null }> {
|
|
210
|
+
const content = (obj as { message?: { content?: unknown } }).message?.content;
|
|
211
|
+
if (!Array.isArray(content)) return [];
|
|
212
|
+
const out: Array<{
|
|
213
|
+
tool_use_id: string;
|
|
214
|
+
tool_name: string;
|
|
215
|
+
arguments_json: string;
|
|
216
|
+
result_text: null;
|
|
217
|
+
}> = [];
|
|
218
|
+
for (const block of content) {
|
|
219
|
+
if (!block || typeof block !== "object") continue;
|
|
220
|
+
const b = block as { type?: string; name?: string; input?: unknown; id?: string };
|
|
221
|
+
if (b.type !== "tool_use" || typeof b.name !== "string") continue;
|
|
222
|
+
const tool_use_id =
|
|
223
|
+
typeof b.id === "string" && b.id.length > 0 ? b.id : `synth-${b.name}-${out.length}`;
|
|
224
|
+
out.push({
|
|
225
|
+
tool_use_id,
|
|
226
|
+
tool_name: b.name,
|
|
227
|
+
arguments_json: JSON.stringify(b.input ?? {}),
|
|
228
|
+
result_text: null,
|
|
229
|
+
});
|
|
230
|
+
}
|
|
231
|
+
return out;
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
function extractToolResults(
|
|
235
|
+
obj: Record<string, unknown>,
|
|
236
|
+
): Array<{ tool_use_id: string; text_content: string }> {
|
|
237
|
+
const content = (obj as { message?: { content?: unknown } }).message?.content;
|
|
238
|
+
if (!Array.isArray(content)) return [];
|
|
239
|
+
const out: Array<{ tool_use_id: string; text_content: string }> = [];
|
|
240
|
+
for (const block of content) {
|
|
241
|
+
if (!block || typeof block !== "object") continue;
|
|
242
|
+
const b = block as {
|
|
243
|
+
type?: string;
|
|
244
|
+
tool_use_id?: string;
|
|
245
|
+
content?: unknown;
|
|
246
|
+
};
|
|
247
|
+
if (b.type !== "tool_result" || typeof b.tool_use_id !== "string") continue;
|
|
248
|
+
out.push({
|
|
249
|
+
tool_use_id: b.tool_use_id,
|
|
250
|
+
text_content: flattenTextBlocks(b.content) ?? "",
|
|
251
|
+
});
|
|
252
|
+
}
|
|
253
|
+
return out;
|
|
254
|
+
}
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
import type { Database as Db } from "better-sqlite3";
|
|
2
|
+
|
|
3
|
+
export interface SearchHit {
|
|
4
|
+
entry_id: string;
|
|
5
|
+
session_id: string;
|
|
6
|
+
session_name: string | null;
|
|
7
|
+
cwd: string;
|
|
8
|
+
notebook_path: string | null;
|
|
9
|
+
timestamp: string;
|
|
10
|
+
role: "user" | "assistant" | null;
|
|
11
|
+
snippet: string;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export interface ContextRow {
|
|
15
|
+
entry_id: string;
|
|
16
|
+
role: "user" | "assistant" | null;
|
|
17
|
+
entry_type: string;
|
|
18
|
+
timestamp: string;
|
|
19
|
+
text: string;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export interface ToolCallHit {
|
|
23
|
+
entry_id: string;
|
|
24
|
+
session_id: string;
|
|
25
|
+
cwd: string;
|
|
26
|
+
notebook_path: string | null;
|
|
27
|
+
timestamp: string;
|
|
28
|
+
arguments: unknown;
|
|
29
|
+
result_summary: string | null;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export interface SearchParams {
|
|
33
|
+
query: string;
|
|
34
|
+
scope?: "all" | "cwd";
|
|
35
|
+
cwd?: string;
|
|
36
|
+
limit?: number;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export interface ContextParams {
|
|
40
|
+
entry_id: string;
|
|
41
|
+
before?: number;
|
|
42
|
+
after?: number;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export interface ToolCallParams {
|
|
46
|
+
tool_name: string;
|
|
47
|
+
args_contains?: string;
|
|
48
|
+
scope?: "all" | "cwd";
|
|
49
|
+
cwd?: string;
|
|
50
|
+
limit?: number;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
const DEFAULT_LIMIT = 20;
|
|
54
|
+
const MAX_LIMIT = 100;
|
|
55
|
+
|
|
56
|
+
function clampLimit(n?: number): number {
|
|
57
|
+
if (typeof n !== "number" || !Number.isFinite(n)) return DEFAULT_LIMIT;
|
|
58
|
+
return Math.max(1, Math.min(MAX_LIMIT, Math.floor(n)));
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
export function searchChat(db: Db, params: SearchParams): SearchHit[] {
|
|
62
|
+
const limit = clampLimit(params.limit);
|
|
63
|
+
const scopeCwd = params.scope === "cwd" && params.cwd;
|
|
64
|
+
const scopeClause = scopeCwd ? "AND s.cwd = @cwd" : "";
|
|
65
|
+
|
|
66
|
+
const rows = db
|
|
67
|
+
.prepare(
|
|
68
|
+
`
|
|
69
|
+
SELECT
|
|
70
|
+
e.entry_id,
|
|
71
|
+
e.session_id,
|
|
72
|
+
s.name AS session_name,
|
|
73
|
+
s.cwd,
|
|
74
|
+
s.notebook_path,
|
|
75
|
+
e.timestamp,
|
|
76
|
+
e.role,
|
|
77
|
+
snippet(entries_fts, 0, '[', ']', '…', 20) AS snippet
|
|
78
|
+
FROM entries_fts
|
|
79
|
+
JOIN entries e ON e.rowid = entries_fts.rowid
|
|
80
|
+
JOIN sessions s ON s.session_id = e.session_id
|
|
81
|
+
WHERE entries_fts MATCH @query
|
|
82
|
+
${scopeClause}
|
|
83
|
+
ORDER BY e.timestamp DESC
|
|
84
|
+
LIMIT @limit
|
|
85
|
+
`,
|
|
86
|
+
)
|
|
87
|
+
.all({ query: params.query, cwd: params.cwd ?? "", limit }) as SearchHit[];
|
|
88
|
+
|
|
89
|
+
return rows;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
export function getSessionContext(db: Db, params: ContextParams): ContextRow[] {
|
|
93
|
+
const before = Math.max(0, params.before ?? 3);
|
|
94
|
+
const after = Math.max(0, params.after ?? 3);
|
|
95
|
+
|
|
96
|
+
const anchor = db
|
|
97
|
+
.prepare("SELECT session_id, timestamp FROM entries WHERE entry_id = ?")
|
|
98
|
+
.get(params.entry_id) as { session_id: string; timestamp: string } | undefined;
|
|
99
|
+
if (!anchor) return [];
|
|
100
|
+
|
|
101
|
+
const beforeRows = db
|
|
102
|
+
.prepare(
|
|
103
|
+
`
|
|
104
|
+
SELECT entry_id, role, entry_type, timestamp, COALESCE(text_content, '') AS text
|
|
105
|
+
FROM entries
|
|
106
|
+
WHERE session_id = @sid AND (timestamp, entry_id) < (@ts, @eid)
|
|
107
|
+
ORDER BY timestamp DESC, entry_id DESC
|
|
108
|
+
LIMIT @n
|
|
109
|
+
`,
|
|
110
|
+
)
|
|
111
|
+
.all({
|
|
112
|
+
sid: anchor.session_id,
|
|
113
|
+
ts: anchor.timestamp,
|
|
114
|
+
eid: params.entry_id,
|
|
115
|
+
n: before,
|
|
116
|
+
}) as ContextRow[];
|
|
117
|
+
|
|
118
|
+
const anchorRow = db
|
|
119
|
+
.prepare(
|
|
120
|
+
`
|
|
121
|
+
SELECT entry_id, role, entry_type, timestamp, COALESCE(text_content, '') AS text
|
|
122
|
+
FROM entries WHERE entry_id = ?
|
|
123
|
+
`,
|
|
124
|
+
)
|
|
125
|
+
.get(params.entry_id) as ContextRow;
|
|
126
|
+
|
|
127
|
+
const afterRows = db
|
|
128
|
+
.prepare(
|
|
129
|
+
`
|
|
130
|
+
SELECT entry_id, role, entry_type, timestamp, COALESCE(text_content, '') AS text
|
|
131
|
+
FROM entries
|
|
132
|
+
WHERE session_id = @sid AND (timestamp, entry_id) > (@ts, @eid)
|
|
133
|
+
ORDER BY timestamp ASC, entry_id ASC
|
|
134
|
+
LIMIT @n
|
|
135
|
+
`,
|
|
136
|
+
)
|
|
137
|
+
.all({
|
|
138
|
+
sid: anchor.session_id,
|
|
139
|
+
ts: anchor.timestamp,
|
|
140
|
+
eid: params.entry_id,
|
|
141
|
+
n: after,
|
|
142
|
+
}) as ContextRow[];
|
|
143
|
+
|
|
144
|
+
return [...beforeRows.reverse(), anchorRow, ...afterRows];
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
export function findToolCalls(db: Db, params: ToolCallParams): ToolCallHit[] {
|
|
148
|
+
const limit = clampLimit(params.limit);
|
|
149
|
+
const scopeCwd = params.scope === "cwd" && params.cwd;
|
|
150
|
+
const scopeClause = scopeCwd ? "AND s.cwd = @cwd" : "";
|
|
151
|
+
const argsClause = params.args_contains ? "AND tc.arguments_json LIKE @args ESCAPE '\\'" : "";
|
|
152
|
+
|
|
153
|
+
const bindParams: Record<string, unknown> = { tool: params.tool_name, limit };
|
|
154
|
+
if (params.args_contains) bindParams.args = `%${escapeLike(params.args_contains)}%`;
|
|
155
|
+
if (scopeCwd) bindParams.cwd = params.cwd;
|
|
156
|
+
|
|
157
|
+
const rows = db
|
|
158
|
+
.prepare(
|
|
159
|
+
`
|
|
160
|
+
SELECT
|
|
161
|
+
tc.entry_id,
|
|
162
|
+
tc.session_id,
|
|
163
|
+
s.cwd,
|
|
164
|
+
s.notebook_path,
|
|
165
|
+
e.timestamp,
|
|
166
|
+
tc.arguments_json,
|
|
167
|
+
tc.result_text
|
|
168
|
+
FROM tool_calls tc
|
|
169
|
+
JOIN entries e ON e.entry_id = tc.entry_id
|
|
170
|
+
JOIN sessions s ON s.session_id = tc.session_id
|
|
171
|
+
WHERE tc.tool_name = @tool
|
|
172
|
+
${argsClause}
|
|
173
|
+
${scopeClause}
|
|
174
|
+
ORDER BY e.timestamp DESC
|
|
175
|
+
LIMIT @limit
|
|
176
|
+
`,
|
|
177
|
+
)
|
|
178
|
+
.all(bindParams) as Array<{
|
|
179
|
+
entry_id: string;
|
|
180
|
+
session_id: string;
|
|
181
|
+
cwd: string;
|
|
182
|
+
notebook_path: string | null;
|
|
183
|
+
timestamp: string;
|
|
184
|
+
arguments_json: string;
|
|
185
|
+
result_text: string | null;
|
|
186
|
+
}>;
|
|
187
|
+
|
|
188
|
+
return rows.map((r) => ({
|
|
189
|
+
entry_id: r.entry_id,
|
|
190
|
+
session_id: r.session_id,
|
|
191
|
+
cwd: r.cwd,
|
|
192
|
+
notebook_path: r.notebook_path,
|
|
193
|
+
timestamp: r.timestamp,
|
|
194
|
+
arguments: safeJson(r.arguments_json),
|
|
195
|
+
result_summary: r.result_text ? r.result_text.slice(0, 500) : null,
|
|
196
|
+
}));
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
function safeJson(s: string): unknown {
|
|
200
|
+
try {
|
|
201
|
+
return JSON.parse(s);
|
|
202
|
+
} catch {
|
|
203
|
+
return s;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
function escapeLike(s: string): string {
|
|
208
|
+
return s.replace(/[\\%_]/g, "\\$&");
|
|
209
|
+
}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/** Bump this whenever a migration would be needed. openIndexDb() responds
|
|
2
|
+
* by dropping the existing DB and rebuilding from scratch -- the source of
|
|
3
|
+
* truth is the Pi JSONLs, so this is cheap and safe.
|
|
4
|
+
*/
|
|
5
|
+
export const SCHEMA_VERSION = 3;
|
|
6
|
+
|
|
7
|
+
export const SCHEMA_SQL = `
|
|
8
|
+
CREATE TABLE sessions (
|
|
9
|
+
session_id TEXT PRIMARY KEY,
|
|
10
|
+
file_path TEXT NOT NULL UNIQUE,
|
|
11
|
+
cwd TEXT NOT NULL,
|
|
12
|
+
name TEXT,
|
|
13
|
+
parent_session TEXT,
|
|
14
|
+
notebook_path TEXT,
|
|
15
|
+
created_at TEXT NOT NULL,
|
|
16
|
+
last_indexed_at TEXT NOT NULL,
|
|
17
|
+
last_indexed_offset INTEGER NOT NULL
|
|
18
|
+
);
|
|
19
|
+
CREATE INDEX sessions_cwd ON sessions(cwd);
|
|
20
|
+
|
|
21
|
+
CREATE TABLE entries (
|
|
22
|
+
entry_id TEXT PRIMARY KEY,
|
|
23
|
+
session_id TEXT NOT NULL REFERENCES sessions(session_id) ON DELETE CASCADE,
|
|
24
|
+
parent_id TEXT,
|
|
25
|
+
entry_type TEXT NOT NULL,
|
|
26
|
+
timestamp TEXT NOT NULL,
|
|
27
|
+
role TEXT,
|
|
28
|
+
text_content TEXT,
|
|
29
|
+
raw_json TEXT NOT NULL
|
|
30
|
+
);
|
|
31
|
+
CREATE INDEX entries_session ON entries(session_id, timestamp);
|
|
32
|
+
CREATE INDEX entries_type ON entries(entry_type);
|
|
33
|
+
|
|
34
|
+
CREATE TABLE tool_calls (
|
|
35
|
+
entry_id TEXT NOT NULL REFERENCES entries(entry_id) ON DELETE CASCADE,
|
|
36
|
+
session_id TEXT NOT NULL REFERENCES sessions(session_id) ON DELETE CASCADE,
|
|
37
|
+
tool_use_id TEXT NOT NULL,
|
|
38
|
+
tool_name TEXT NOT NULL,
|
|
39
|
+
arguments_json TEXT NOT NULL,
|
|
40
|
+
result_text TEXT,
|
|
41
|
+
PRIMARY KEY (entry_id, tool_use_id)
|
|
42
|
+
);
|
|
43
|
+
CREATE INDEX tool_calls_name ON tool_calls(tool_name);
|
|
44
|
+
|
|
45
|
+
CREATE VIRTUAL TABLE entries_fts USING fts5(
|
|
46
|
+
text_content,
|
|
47
|
+
content='entries',
|
|
48
|
+
content_rowid='rowid',
|
|
49
|
+
tokenize='porter unicode61'
|
|
50
|
+
);
|
|
51
|
+
|
|
52
|
+
-- Keep FTS in sync with entries
|
|
53
|
+
CREATE TRIGGER entries_ai AFTER INSERT ON entries BEGIN
|
|
54
|
+
INSERT INTO entries_fts(rowid, text_content)
|
|
55
|
+
VALUES (new.rowid, coalesce(new.text_content, ''));
|
|
56
|
+
END;
|
|
57
|
+
CREATE TRIGGER entries_ad AFTER DELETE ON entries BEGIN
|
|
58
|
+
INSERT INTO entries_fts(entries_fts, rowid, text_content)
|
|
59
|
+
VALUES ('delete', old.rowid, coalesce(old.text_content, ''));
|
|
60
|
+
END;
|
|
61
|
+
CREATE TRIGGER entries_au AFTER UPDATE ON entries BEGIN
|
|
62
|
+
INSERT INTO entries_fts(entries_fts, rowid, text_content)
|
|
63
|
+
VALUES ('delete', old.rowid, coalesce(old.text_content, ''));
|
|
64
|
+
INSERT INTO entries_fts(rowid, text_content)
|
|
65
|
+
VALUES (new.rowid, coalesce(new.text_content, ''));
|
|
66
|
+
END;
|
|
67
|
+
|
|
68
|
+
CREATE TABLE meta (
|
|
69
|
+
key TEXT PRIMARY KEY,
|
|
70
|
+
value TEXT NOT NULL
|
|
71
|
+
);
|
|
72
|
+
`;
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
|
|
2
|
+
import { Text } from "@earendil-works/pi-tui";
|
|
3
|
+
import { Type } from "@sinclair/typebox";
|
|
4
|
+
import { openIndexDb, defaultDbPath } from "./db";
|
|
5
|
+
import { scanSessions } from "./indexer";
|
|
6
|
+
import { searchChat, getSessionContext, findToolCalls } from "./query";
|
|
7
|
+
|
|
8
|
+
export function registerSessionIndexTools(pi: ExtensionAPI): void {
|
|
9
|
+
// Long-lived DB handle for the lifetime of the extension. The session-index
|
|
10
|
+
// DB assumes a single writer per user (see db.ts) -- opening once here and
|
|
11
|
+
// keeping the WAL/shm files live for the process is the intended shape.
|
|
12
|
+
const db = openIndexDb(defaultDbPath());
|
|
13
|
+
|
|
14
|
+
// Dedup refreshes inside a burst of tool calls. Pi routes a model's tool
|
|
15
|
+
// round-trips through us in quick succession; re-scanning every time would
|
|
16
|
+
// triple-stat the corpus for no added freshness.
|
|
17
|
+
const REFRESH_WINDOW_MS = 2_000;
|
|
18
|
+
let lastScanAt = 0;
|
|
19
|
+
function refresh(): void {
|
|
20
|
+
const now = Date.now();
|
|
21
|
+
if (now - lastScanAt < REFRESH_WINDOW_MS) return;
|
|
22
|
+
lastScanAt = now;
|
|
23
|
+
try {
|
|
24
|
+
scanSessions(db);
|
|
25
|
+
} catch {
|
|
26
|
+
// Don't fail a tool call because of a broken scan; return whatever's indexed.
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
pi.registerTool({
|
|
31
|
+
name: "chat_search",
|
|
32
|
+
label: "Search prior sessions",
|
|
33
|
+
description:
|
|
34
|
+
"Full-text search across every Pi session you've had in this account. " +
|
|
35
|
+
"Searches message text only -- for tool-call arguments use chat_find_tool_calls. " +
|
|
36
|
+
"Default scope is 'all' (every project). Use scope='cwd' to restrict to the " +
|
|
37
|
+
"current analysis directory. Returns ranked hits with a snippet; follow up " +
|
|
38
|
+
"with chat_session_context to read surrounding turns.",
|
|
39
|
+
parameters: Type.Object({
|
|
40
|
+
query: Type.String({ minLength: 1, description: "FTS5 query (porter-stemmed tokens)." }),
|
|
41
|
+
scope: Type.Optional(
|
|
42
|
+
Type.Union([Type.Literal("all"), Type.Literal("cwd")], {
|
|
43
|
+
description: "Which sessions to search. Default: 'all'.",
|
|
44
|
+
}),
|
|
45
|
+
),
|
|
46
|
+
limit: Type.Optional(
|
|
47
|
+
Type.Integer({ minimum: 1, maximum: 100, description: "Max hits. Default 20." }),
|
|
48
|
+
),
|
|
49
|
+
}),
|
|
50
|
+
async execute(_id, params) {
|
|
51
|
+
refresh();
|
|
52
|
+
try {
|
|
53
|
+
const hits = searchChat(db, {
|
|
54
|
+
query: params.query,
|
|
55
|
+
scope: params.scope ?? "all",
|
|
56
|
+
cwd: process.cwd(),
|
|
57
|
+
limit: params.limit,
|
|
58
|
+
});
|
|
59
|
+
return {
|
|
60
|
+
content: [{ type: "text" as const, text: JSON.stringify(hits, null, 2) }],
|
|
61
|
+
details: { count: hits.length, error: undefined as string | undefined },
|
|
62
|
+
};
|
|
63
|
+
} catch (err) {
|
|
64
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
65
|
+
return {
|
|
66
|
+
content: [
|
|
67
|
+
{
|
|
68
|
+
type: "text" as const,
|
|
69
|
+
text: JSON.stringify(
|
|
70
|
+
{ error: msg, hint: "Check FTS5 query syntax (e.g. quoting)." },
|
|
71
|
+
null,
|
|
72
|
+
2,
|
|
73
|
+
),
|
|
74
|
+
},
|
|
75
|
+
],
|
|
76
|
+
details: { count: 0, error: msg as string | undefined },
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
},
|
|
80
|
+
renderResult: (result) => {
|
|
81
|
+
const d = result.details as { count?: number; error?: string } | undefined;
|
|
82
|
+
if (d?.error) return new Text(`⚠️ ${d.error}`);
|
|
83
|
+
return new Text(`🔎 ${d?.count ?? 0} hits`);
|
|
84
|
+
},
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
pi.registerTool({
|
|
88
|
+
name: "chat_session_context",
|
|
89
|
+
label: "Read surrounding turns",
|
|
90
|
+
description:
|
|
91
|
+
"Given an entry_id (from chat_search or chat_find_tool_calls), return a " +
|
|
92
|
+
"window of N entries before and after it from the same session. Default " +
|
|
93
|
+
"window is 3 before + 3 after. Entries above a compaction point are " +
|
|
94
|
+
"still retrievable (the index keeps everything the JSONL keeps).",
|
|
95
|
+
parameters: Type.Object({
|
|
96
|
+
entry_id: Type.String({ minLength: 1 }),
|
|
97
|
+
before: Type.Optional(Type.Integer({ minimum: 0, maximum: 50, default: 3 })),
|
|
98
|
+
after: Type.Optional(Type.Integer({ minimum: 0, maximum: 50, default: 3 })),
|
|
99
|
+
}),
|
|
100
|
+
async execute(_id, params) {
|
|
101
|
+
refresh();
|
|
102
|
+
const rows = getSessionContext(db, {
|
|
103
|
+
entry_id: params.entry_id,
|
|
104
|
+
before: params.before,
|
|
105
|
+
after: params.after,
|
|
106
|
+
});
|
|
107
|
+
return {
|
|
108
|
+
content: [{ type: "text" as const, text: JSON.stringify(rows, null, 2) }],
|
|
109
|
+
details: { count: rows.length },
|
|
110
|
+
};
|
|
111
|
+
},
|
|
112
|
+
renderResult: (result) => {
|
|
113
|
+
const d = result.details as { count?: number } | undefined;
|
|
114
|
+
return new Text(`📜 ${d?.count ?? 0} entries`);
|
|
115
|
+
},
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
pi.registerTool({
|
|
119
|
+
name: "chat_find_tool_calls",
|
|
120
|
+
label: "Find prior tool calls",
|
|
121
|
+
description:
|
|
122
|
+
"Structured search over prior tool invocations. Pass tool_name to filter " +
|
|
123
|
+
"(e.g. 'workflow_set_overrides'); optional args_contains does a substring " +
|
|
124
|
+
"match on the arguments JSON (underscore and percent are escaped to avoid " +
|
|
125
|
+
"LIKE wildcard surprises). Returns parsed arguments and a truncated " +
|
|
126
|
+
"result summary per hit.",
|
|
127
|
+
parameters: Type.Object({
|
|
128
|
+
tool_name: Type.String({ minLength: 1 }),
|
|
129
|
+
args_contains: Type.Optional(Type.String({ minLength: 1 })),
|
|
130
|
+
scope: Type.Optional(Type.Union([Type.Literal("all"), Type.Literal("cwd")])),
|
|
131
|
+
limit: Type.Optional(Type.Integer({ minimum: 1, maximum: 100 })),
|
|
132
|
+
}),
|
|
133
|
+
async execute(_id, params) {
|
|
134
|
+
refresh();
|
|
135
|
+
const calls = findToolCalls(db, {
|
|
136
|
+
tool_name: params.tool_name,
|
|
137
|
+
args_contains: params.args_contains,
|
|
138
|
+
scope: params.scope ?? "all",
|
|
139
|
+
cwd: process.cwd(),
|
|
140
|
+
limit: params.limit,
|
|
141
|
+
});
|
|
142
|
+
return {
|
|
143
|
+
content: [{ type: "text" as const, text: JSON.stringify(calls, null, 2) }],
|
|
144
|
+
details: { count: calls.length, tool: params.tool_name },
|
|
145
|
+
};
|
|
146
|
+
},
|
|
147
|
+
renderResult: (result) => {
|
|
148
|
+
const d = result.details as { count?: number; tool?: string } | undefined;
|
|
149
|
+
return new Text(`🛠 ${d?.count ?? 0} ${d?.tool ?? ""} calls`);
|
|
150
|
+
},
|
|
151
|
+
});
|
|
152
|
+
}
|