@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.
Files changed (451) hide show
  1. package/CHANGELOG.md +123 -0
  2. package/LICENSE +21 -0
  3. package/README.md +760 -5
  4. package/bin/legacy-mcp-config.js +363 -0
  5. package/bin/orbit.js +810 -0
  6. package/bin/pi-extension-path.d.ts +4 -0
  7. package/bin/pi-extension-path.js +44 -0
  8. package/bin/provider-auth.d.ts +22 -0
  9. package/bin/provider-auth.js +77 -0
  10. package/bin/thinking-pref.js +38 -0
  11. package/bin/update-check.d.ts +15 -0
  12. package/bin/update-check.js +137 -0
  13. package/extensions/cli-update/index.ts +32 -0
  14. package/extensions/orbit/activity-hooks.ts +141 -0
  15. package/extensions/orbit/activity.ts +116 -0
  16. package/extensions/orbit/agent-dir.ts +11 -0
  17. package/extensions/orbit/auto-resume.ts +352 -0
  18. package/extensions/orbit/config.ts +3 -0
  19. package/extensions/orbit/confusables.ts +1 -0
  20. package/extensions/orbit/context.ts +957 -0
  21. package/extensions/orbit/dashboard-commands.ts +191 -0
  22. package/extensions/orbit/dashboard-store.ts +473 -0
  23. package/extensions/orbit/dashboard-tools.ts +1185 -0
  24. package/extensions/orbit/empty-completion.ts +99 -0
  25. package/extensions/orbit/evidence-gate.ts +1276 -0
  26. package/extensions/orbit/evidence-override-command.ts +294 -0
  27. package/extensions/orbit/exec-guard/bash-risk.ts +1408 -0
  28. package/extensions/orbit/exec-guard/gate.ts +181 -0
  29. package/extensions/orbit/exec-guard/guardian-config.ts +54 -0
  30. package/extensions/orbit/exec-guard/index.ts +1 -0
  31. package/extensions/orbit/exec-guard/model-tier.ts +36 -0
  32. package/extensions/orbit/exec-guard/path-jail.ts +54 -0
  33. package/extensions/orbit/exec-guard/policy.ts +342 -0
  34. package/extensions/orbit/exec-guard/runtime-state.ts +15 -0
  35. package/extensions/orbit/exec-guard/sensitive-read.ts +525 -0
  36. package/extensions/orbit/exec-guard/types.ts +42 -0
  37. package/extensions/orbit/execution-commands.ts +134 -0
  38. package/extensions/orbit/feedback-command.ts +81 -0
  39. package/extensions/orbit/feedback.ts +96 -0
  40. package/extensions/orbit/galaxy-api.test.ts +122 -0
  41. package/extensions/orbit/galaxy-api.ts +606 -0
  42. package/extensions/orbit/galaxy-artifact-link-guidance.ts +5 -0
  43. package/extensions/orbit/galaxy-destructive-gate.ts +113 -0
  44. package/extensions/orbit/galaxy-enrich.ts +1108 -0
  45. package/extensions/orbit/galaxy-failure.ts +101 -0
  46. package/extensions/orbit/galaxy-fixture.ts +126 -0
  47. package/extensions/orbit/galaxy-history-guard.ts +233 -0
  48. package/extensions/orbit/galaxy-job-block.ts +347 -0
  49. package/extensions/orbit/galaxy-job-ops.ts +288 -0
  50. package/extensions/orbit/galaxy-live-source.ts +929 -0
  51. package/extensions/orbit/galaxy-markdown-adapter.ts +248 -0
  52. package/extensions/orbit/galaxy-op-policy.ts +332 -0
  53. package/extensions/orbit/galaxy-ops-tools.ts +326 -0
  54. package/extensions/orbit/galaxy-output-store.ts +80 -0
  55. package/extensions/orbit/galaxy-output.ts +346 -0
  56. package/extensions/orbit/galaxy-page-binding.ts +222 -0
  57. package/extensions/orbit/galaxy-page-markdown-guidance.ts +15 -0
  58. package/extensions/orbit/galaxy-page-ops.ts +159 -0
  59. package/extensions/orbit/galaxy-page-sync.test.ts +417 -0
  60. package/extensions/orbit/galaxy-page-sync.ts +318 -0
  61. package/extensions/orbit/galaxy-pages-api.ts +203 -0
  62. package/extensions/orbit/galaxy-pages-sync.ts +409 -0
  63. package/extensions/orbit/galaxy-poll-guard.ts +189 -0
  64. package/extensions/orbit/galaxy-poller.ts +706 -0
  65. package/extensions/orbit/galaxy-provenance.ts +623 -0
  66. package/extensions/orbit/galaxy-reconcile.ts +956 -0
  67. package/extensions/orbit/galaxy-recovery.ts +176 -0
  68. package/extensions/orbit/galaxy-repeat-guard.ts +55 -0
  69. package/extensions/orbit/galaxy-submission-capture.ts +707 -0
  70. package/extensions/orbit/galaxy-submission.ts +502 -0
  71. package/extensions/orbit/galaxy-tool-source.ts +78 -0
  72. package/extensions/orbit/galaxy-tool-wrap.ts +234 -0
  73. package/extensions/orbit/galaxy-udt-block.ts +127 -0
  74. package/extensions/orbit/galaxy-upload-tus.ts +334 -0
  75. package/extensions/orbit/galaxy-upload.ts +300 -0
  76. package/extensions/orbit/galaxy-version-capture.ts +65 -0
  77. package/extensions/orbit/git.ts +173 -0
  78. package/extensions/orbit/harness-block-fields.ts +597 -0
  79. package/extensions/orbit/index.ts +593 -0
  80. package/extensions/orbit/init-gate.ts +284 -0
  81. package/extensions/orbit/instructions-command.ts +136 -0
  82. package/extensions/orbit/invocation-failure-hint.ts +57 -0
  83. package/extensions/orbit/iwc-plan-check.ts +94 -0
  84. package/extensions/orbit/lesson-command.ts +303 -0
  85. package/extensions/orbit/lesson-hint.ts +245 -0
  86. package/extensions/orbit/lesson-nudge.ts +106 -0
  87. package/extensions/orbit/lessons/compose.ts +177 -0
  88. package/extensions/orbit/lessons/counters.ts +120 -0
  89. package/extensions/orbit/lessons/enabled.ts +116 -0
  90. package/extensions/orbit/lessons/matcher.ts +346 -0
  91. package/extensions/orbit/lessons/paths.ts +286 -0
  92. package/extensions/orbit/lessons/pi-event-contract.ts +105 -0
  93. package/extensions/orbit/lessons/propose-replay.ts +103 -0
  94. package/extensions/orbit/lessons/propose-tool.ts +222 -0
  95. package/extensions/orbit/lessons/propose.ts +502 -0
  96. package/extensions/orbit/lessons/replay.ts +89 -0
  97. package/extensions/orbit/lessons/reproduction-index.ts +83 -0
  98. package/extensions/orbit/lessons/search-tool.ts +99 -0
  99. package/extensions/orbit/lessons/search.ts +136 -0
  100. package/extensions/orbit/lessons/store.ts +415 -0
  101. package/extensions/orbit/lessons/text.ts +36 -0
  102. package/extensions/orbit/lessons/types.ts +69 -0
  103. package/extensions/orbit/lessons/user-dir.ts +24 -0
  104. package/extensions/orbit/lessons/user-lesson.ts +88 -0
  105. package/extensions/orbit/lessons/wrapper.ts +61 -0
  106. package/extensions/orbit/lessons-command.ts +147 -0
  107. package/extensions/orbit/local-exec.ts +39 -0
  108. package/extensions/orbit/mcp-output.ts +179 -0
  109. package/extensions/orbit/mcp-servers.test.ts +24 -0
  110. package/extensions/orbit/mcp-servers.ts +25 -0
  111. package/extensions/orbit/model-script.ts +351 -0
  112. package/extensions/orbit/notebook-anchors.ts +342 -0
  113. package/extensions/orbit/notebook-writer.ts +863 -0
  114. package/extensions/orbit/observation-allowlists.ts +1109 -0
  115. package/extensions/orbit/observation-replay.ts +148 -0
  116. package/extensions/orbit/observation-triggers.ts +563 -0
  117. package/extensions/orbit/observation-ui.ts +175 -0
  118. package/extensions/orbit/observations-command.ts +421 -0
  119. package/extensions/orbit/observations-config.ts +200 -0
  120. package/extensions/orbit/observations.ts +1381 -0
  121. package/extensions/orbit/profiles.ts +270 -0
  122. package/extensions/orbit/progress-updates.ts +95 -0
  123. package/extensions/orbit/proposal-commands.ts +882 -0
  124. package/extensions/orbit/provenance-fs-file.ts +59 -0
  125. package/extensions/orbit/provenance-fs.ts +32 -0
  126. package/extensions/orbit/provenance-memory-fs.ts +59 -0
  127. package/extensions/orbit/record-store-file.ts +177 -0
  128. package/extensions/orbit/record-store-page.ts +77 -0
  129. package/extensions/orbit/record-store-seam.ts +47 -0
  130. package/extensions/orbit/record-store.ts +149 -0
  131. package/extensions/orbit/registry-carrier.ts +107 -0
  132. package/extensions/orbit/registry-eligibility.ts +95 -0
  133. package/extensions/orbit/registry-evaluation.ts +403 -0
  134. package/extensions/orbit/registry-evaluator.ts +519 -0
  135. package/extensions/orbit/registry-import.ts +91 -0
  136. package/extensions/orbit/registry-lock.ts +221 -0
  137. package/extensions/orbit/registry-memory-fs.ts +42 -0
  138. package/extensions/orbit/registry-page-carrier.ts +103 -0
  139. package/extensions/orbit/registry-proposal.ts +1348 -0
  140. package/extensions/orbit/registry-runtime.ts +234 -0
  141. package/extensions/orbit/registry-schema.ts +735 -0
  142. package/extensions/orbit/registry-submitter.ts +59 -0
  143. package/extensions/orbit/registry-templates.ts +346 -0
  144. package/extensions/orbit/registry.ts +476 -0
  145. package/extensions/orbit/sandbox/index.ts +120 -0
  146. package/extensions/orbit/sandbox/sandbox-bash.ts +93 -0
  147. package/extensions/orbit/sandbox/sandbox-config.ts +87 -0
  148. package/extensions/orbit/sandbox/sandbox-init-message.ts +28 -0
  149. package/extensions/orbit/secret-redaction.ts +247 -0
  150. package/extensions/orbit/session-index/cwd.ts +18 -0
  151. package/extensions/orbit/session-index/db.ts +56 -0
  152. package/extensions/orbit/session-index/indexer.ts +154 -0
  153. package/extensions/orbit/session-index/is-enabled.ts +17 -0
  154. package/extensions/orbit/session-index/parse.ts +254 -0
  155. package/extensions/orbit/session-index/query.ts +209 -0
  156. package/extensions/orbit/session-index/schema.ts +72 -0
  157. package/extensions/orbit/session-index/tools.ts +152 -0
  158. package/extensions/orbit/session-lifecycle.ts +321 -0
  159. package/extensions/orbit/skill-triggers.ts +159 -0
  160. package/extensions/orbit/skills-command.ts +48 -0
  161. package/extensions/orbit/skills-discovery.ts +435 -0
  162. package/extensions/orbit/skills.ts +84 -0
  163. package/extensions/orbit/sra-import-gate.ts +77 -0
  164. package/extensions/orbit/state.ts +265 -0
  165. package/extensions/orbit/submission-replay.ts +147 -0
  166. package/extensions/orbit/sync-command.ts +157 -0
  167. package/extensions/orbit/teams/critic-parser.ts +93 -0
  168. package/extensions/orbit/teams/dispatcher.ts +210 -0
  169. package/extensions/orbit/teams/is-enabled.ts +22 -0
  170. package/extensions/orbit/teams/tool.ts +187 -0
  171. package/extensions/orbit/teams/types.ts +57 -0
  172. package/extensions/orbit/teams/validate.ts +42 -0
  173. package/extensions/orbit/tester-id-command.ts +133 -0
  174. package/extensions/orbit/tools-sync.ts +279 -0
  175. package/extensions/orbit/tools.ts +1300 -0
  176. package/extensions/orbit/types.ts +41 -0
  177. package/extensions/orbit/ui-bridge.ts +55 -0
  178. package/extensions/orbit/ulid.ts +60 -0
  179. package/extensions/orbit/user-instructions.ts +388 -0
  180. package/extensions/orbit/vendor/skills/_catalog.json +68 -0
  181. package/extensions/orbit/vendor/skills/_manifest.json +1106 -0
  182. package/extensions/orbit/vendor/skills/advance-galaxy-draft-step/SKILL.md +112 -0
  183. package/extensions/orbit/vendor/skills/advance-galaxy-draft-step/_provenance.json +218 -0
  184. package/extensions/orbit/vendor/skills/advance-galaxy-draft-step/_required_tools.json +33 -0
  185. package/extensions/orbit/vendor/skills/advance-galaxy-draft-step/_verify.json +4 -0
  186. package/extensions/orbit/vendor/skills/advance-galaxy-draft-step/references/cli/add.json +50 -0
  187. package/extensions/orbit/vendor/skills/advance-galaxy-draft-step/references/cli/draft-extract.json +51 -0
  188. package/extensions/orbit/vendor/skills/advance-galaxy-draft-step/references/cli/draft-next-step.json +42 -0
  189. package/extensions/orbit/vendor/skills/advance-galaxy-draft-step/references/cli/draft-validate.json +140 -0
  190. package/extensions/orbit/vendor/skills/advance-galaxy-draft-step/references/cli/list.json +32 -0
  191. package/extensions/orbit/vendor/skills/advance-galaxy-draft-step/references/notes/galaxy-tool-job-failure-reference.md +137 -0
  192. package/extensions/orbit/vendor/skills/advance-galaxy-draft-step/references/notes/open-requirements-ledger.md +173 -0
  193. package/extensions/orbit/vendor/skills/advance-galaxy-draft-step/references/schemas/galaxy-tool-summary.schema.json +175 -0
  194. package/extensions/orbit/vendor/skills/advance-galaxy-draft-step/references/schemas/galaxy-workflow-draft.schema.json +2727 -0
  195. package/extensions/orbit/vendor/skills/apply-galaxy-workflow-changeset/SKILL.md +82 -0
  196. package/extensions/orbit/vendor/skills/apply-galaxy-workflow-changeset/_provenance.json +133 -0
  197. package/extensions/orbit/vendor/skills/apply-galaxy-workflow-changeset/_required_tools.json +16 -0
  198. package/extensions/orbit/vendor/skills/apply-galaxy-workflow-changeset/_verify.json +4 -0
  199. package/extensions/orbit/vendor/skills/apply-galaxy-workflow-changeset/references/cli/draft-validate.json +140 -0
  200. package/extensions/orbit/vendor/skills/apply-galaxy-workflow-changeset/references/notes/galaxy-workflow-draft-format.md +135 -0
  201. package/extensions/orbit/vendor/skills/apply-galaxy-workflow-changeset/references/notes/open-requirements-ledger.md +173 -0
  202. package/extensions/orbit/vendor/skills/apply-galaxy-workflow-changeset/references/schemas/galaxy-workflow-draft.schema.json +2727 -0
  203. package/extensions/orbit/vendor/skills/changeset-to-galaxy-test-plan/SKILL.md +84 -0
  204. package/extensions/orbit/vendor/skills/changeset-to-galaxy-test-plan/_provenance.json +166 -0
  205. package/extensions/orbit/vendor/skills/changeset-to-galaxy-test-plan/_verify.json +29 -0
  206. package/extensions/orbit/vendor/skills/changeset-to-galaxy-test-plan/references/notes/galaxy-workflow-testability-design.md +136 -0
  207. package/extensions/orbit/vendor/skills/changeset-to-galaxy-test-plan/references/notes/iwc-shortcuts-anti-patterns.md +357 -0
  208. package/extensions/orbit/vendor/skills/changeset-to-galaxy-test-plan/references/notes/iwc-test-data-conventions.md +308 -0
  209. package/extensions/orbit/vendor/skills/changeset-to-galaxy-test-plan/references/notes/planemo-asserts-idioms.md +246 -0
  210. package/extensions/orbit/vendor/skills/changeset-to-galaxy-test-plan/references/notes/planemo-workflow-test-architecture.md +151 -0
  211. package/extensions/orbit/vendor/skills/changeset-to-galaxy-test-plan/references/schemas/galaxy-workflow-test-plan.schema.json +552 -0
  212. package/extensions/orbit/vendor/skills/changeset-to-galaxy-test-plan/references/schemas/summary-galaxy-workflow.schema.json +687 -0
  213. package/extensions/orbit/vendor/skills/changeset-to-galaxy-test-plan/references/schemas/tests-format.schema.json +7328 -0
  214. package/extensions/orbit/vendor/skills/compare-against-iwc-exemplar/SKILL.md +127 -0
  215. package/extensions/orbit/vendor/skills/compare-against-iwc-exemplar/_provenance.json +198 -0
  216. package/extensions/orbit/vendor/skills/compare-against-iwc-exemplar/_required_tools.json +16 -0
  217. package/extensions/orbit/vendor/skills/compare-against-iwc-exemplar/_verify.json +4 -0
  218. package/extensions/orbit/vendor/skills/compare-against-iwc-exemplar/references/cli/convert.json +123 -0
  219. package/extensions/orbit/vendor/skills/compare-against-iwc-exemplar/references/notes/galaxy-data-flow-draft-contract.md +129 -0
  220. package/extensions/orbit/vendor/skills/compare-against-iwc-exemplar/references/notes/iwc-shortcuts-anti-patterns.md +357 -0
  221. package/extensions/orbit/vendor/skills/compare-against-iwc-exemplar/references/notes/iwc-test-data-conventions.md +308 -0
  222. package/extensions/orbit/vendor/skills/compare-against-iwc-exemplar/references/notes/open-requirements-ledger.md +173 -0
  223. package/extensions/orbit/vendor/skills/debug-galaxy-workflow-output/SKILL.md +73 -0
  224. package/extensions/orbit/vendor/skills/debug-galaxy-workflow-output/_provenance.json +160 -0
  225. package/extensions/orbit/vendor/skills/debug-galaxy-workflow-output/_verify.json +4 -0
  226. package/extensions/orbit/vendor/skills/debug-galaxy-workflow-output/references/notes/galaxy-collection-semantics.md +43 -0
  227. package/extensions/orbit/vendor/skills/debug-galaxy-workflow-output/references/notes/galaxy-collection-semantics.yml +1250 -0
  228. package/extensions/orbit/vendor/skills/debug-galaxy-workflow-output/references/notes/galaxy-tool-job-failure-reference.md +137 -0
  229. package/extensions/orbit/vendor/skills/debug-galaxy-workflow-output/references/notes/galaxy-workflow-invocation-failure-reference.md +138 -0
  230. package/extensions/orbit/vendor/skills/debug-galaxy-workflow-output/references/notes/iwc-shortcuts-anti-patterns.md +357 -0
  231. package/extensions/orbit/vendor/skills/debug-galaxy-workflow-output/references/notes/nextflow-operators-to-galaxy-collection-recipes.md +98 -0
  232. package/extensions/orbit/vendor/skills/debug-galaxy-workflow-output/references/notes/planemo-asserts-idioms.md +246 -0
  233. package/extensions/orbit/vendor/skills/debug-galaxy-workflow-output/references/notes/planemo-workflow-test-architecture.md +151 -0
  234. package/extensions/orbit/vendor/skills/discover-shed-tool/SKILL.md +174 -0
  235. package/extensions/orbit/vendor/skills/discover-shed-tool/_provenance.json +130 -0
  236. package/extensions/orbit/vendor/skills/discover-shed-tool/_required_tools.json +18 -0
  237. package/extensions/orbit/vendor/skills/discover-shed-tool/_verify.json +17 -0
  238. package/extensions/orbit/vendor/skills/discover-shed-tool/references/cli/tool-revisions.json +48 -0
  239. package/extensions/orbit/vendor/skills/discover-shed-tool/references/cli/tool-search.json +95 -0
  240. package/extensions/orbit/vendor/skills/discover-shed-tool/references/cli/tool-versions.json +39 -0
  241. package/extensions/orbit/vendor/skills/discover-shed-tool/references/notes/component-tool-shed-search.md +230 -0
  242. package/extensions/orbit/vendor/skills/discover-shed-tool/references/schemas/galaxy-tool-discovery.schema.json +231 -0
  243. package/extensions/orbit/vendor/skills/implement-galaxy-workflow-test/SKILL.md +93 -0
  244. package/extensions/orbit/vendor/skills/implement-galaxy-workflow-test/_provenance.json +201 -0
  245. package/extensions/orbit/vendor/skills/implement-galaxy-workflow-test/_required_tools.json +28 -0
  246. package/extensions/orbit/vendor/skills/implement-galaxy-workflow-test/_verify.json +17 -0
  247. package/extensions/orbit/vendor/skills/implement-galaxy-workflow-test/references/cli/planemo.md +44 -0
  248. package/extensions/orbit/vendor/skills/implement-galaxy-workflow-test/references/cli/validate-tests.json +40 -0
  249. package/extensions/orbit/vendor/skills/implement-galaxy-workflow-test/references/notes/galaxy-workflow-testability-design.md +136 -0
  250. package/extensions/orbit/vendor/skills/implement-galaxy-workflow-test/references/notes/iwc-shortcuts-anti-patterns.md +357 -0
  251. package/extensions/orbit/vendor/skills/implement-galaxy-workflow-test/references/notes/iwc-test-data-conventions.md +308 -0
  252. package/extensions/orbit/vendor/skills/implement-galaxy-workflow-test/references/notes/planemo-asserts-idioms.md +246 -0
  253. package/extensions/orbit/vendor/skills/implement-galaxy-workflow-test/references/notes/planemo-workflow-test-architecture.md +151 -0
  254. package/extensions/orbit/vendor/skills/implement-galaxy-workflow-test/references/schemas/galaxy-workflow-test-plan.schema.json +552 -0
  255. package/extensions/orbit/vendor/skills/implement-galaxy-workflow-test/references/schemas/tests-format.schema.json +7328 -0
  256. package/extensions/orbit/vendor/skills/interview-to-galaxy-workflow-changeset/SKILL.md +81 -0
  257. package/extensions/orbit/vendor/skills/interview-to-galaxy-workflow-changeset/_provenance.json +93 -0
  258. package/extensions/orbit/vendor/skills/interview-to-galaxy-workflow-changeset/_verify.json +17 -0
  259. package/extensions/orbit/vendor/skills/interview-to-galaxy-workflow-changeset/references/notes/open-requirements-ledger.md +173 -0
  260. package/extensions/orbit/vendor/skills/interview-to-galaxy-workflow-changeset/references/schemas/summary-galaxy-workflow.schema.json +687 -0
  261. package/extensions/orbit/vendor/skills/pipeline-update-interview-to-galaxy/SKILL.md +81 -0
  262. package/extensions/orbit/vendor/skills/pipeline-update-interview-to-galaxy/_assembly.json +23 -0
  263. package/extensions/orbit/vendor/skills/run-workflow-test/SKILL.md +79 -0
  264. package/extensions/orbit/vendor/skills/run-workflow-test/_provenance.json +125 -0
  265. package/extensions/orbit/vendor/skills/run-workflow-test/_required_tools.json +28 -0
  266. package/extensions/orbit/vendor/skills/run-workflow-test/_verify.json +4 -0
  267. package/extensions/orbit/vendor/skills/run-workflow-test/references/cli/planemo.md +44 -0
  268. package/extensions/orbit/vendor/skills/run-workflow-test/references/cli/validate-tests.json +40 -0
  269. package/extensions/orbit/vendor/skills/run-workflow-test/references/notes/galaxy-workflow-invocation-failure-reference.md +138 -0
  270. package/extensions/orbit/vendor/skills/run-workflow-test/references/notes/planemo-asserts-idioms.md +246 -0
  271. package/extensions/orbit/vendor/skills/run-workflow-test/references/notes/planemo-workflow-test-architecture.md +151 -0
  272. package/extensions/orbit/vendor/skills/run-workflow-test/references/schemas/tests-format.schema.json +7328 -0
  273. package/extensions/orbit/vendor/skills/skills/LICENSE +21 -0
  274. package/extensions/orbit/vendor/skills/skills/collection-manipulation/README.md +39 -0
  275. package/extensions/orbit/vendor/skills/skills/collection-manipulation/SKILL.md +892 -0
  276. package/extensions/orbit/vendor/skills/skills/collection-manipulation/references/api-patterns.md +927 -0
  277. package/extensions/orbit/vendor/skills/skills/collection-manipulation/references/apply-rules.md +1482 -0
  278. package/extensions/orbit/vendor/skills/skills/collection-manipulation/references/test-patterns.md +996 -0
  279. package/extensions/orbit/vendor/skills/skills/collection-manipulation/references/tools.md +609 -0
  280. package/extensions/orbit/vendor/skills/skills/galaxy-data-libraries/SKILL.md +170 -0
  281. package/extensions/orbit/vendor/skills/skills/galaxy-integration/README.md +162 -0
  282. package/extensions/orbit/vendor/skills/skills/galaxy-integration/SKILL.md +99 -0
  283. package/extensions/orbit/vendor/skills/skills/galaxy-integration/examples/README.md +119 -0
  284. package/extensions/orbit/vendor/skills/skills/galaxy-integration/examples/tool-checking.md +419 -0
  285. package/extensions/orbit/vendor/skills/skills/galaxy-integration/examples/workflow-testing.md +617 -0
  286. package/extensions/orbit/vendor/skills/skills/galaxy-integration/galaxy-integration.md +614 -0
  287. package/extensions/orbit/vendor/skills/skills/galaxy-integration/jupyterlite/SKILL.md +144 -0
  288. package/extensions/orbit/vendor/skills/skills/galaxy-integration/jupyterlite/examples/average_col3.ipynb +68 -0
  289. package/extensions/orbit/vendor/skills/skills/galaxy-integration/jupyterlite/examples/extract_sample_metadata.ipynb +190 -0
  290. package/extensions/orbit/vendor/skills/skills/galaxy-integration/jupyterlite/examples/variant_annotation.ipynb +816 -0
  291. package/extensions/orbit/vendor/skills/skills/galaxy-integration/jupyterlite/examples/vcp_variant_map.ipynb +443 -0
  292. package/extensions/orbit/vendor/skills/skills/galaxy-integration/scripts/README.md +165 -0
  293. package/extensions/orbit/vendor/skills/skills/galaxy-integration/scripts/galaxy_tool_checker.py +521 -0
  294. package/extensions/orbit/vendor/skills/skills/galaxy-mcp-reference/SKILL.md +128 -0
  295. package/extensions/orbit/vendor/skills/skills/galaxy-mcp-reference/gotchas.md +135 -0
  296. package/extensions/orbit/vendor/skills/skills/galaxy-mcp-reference/history-access.md +132 -0
  297. package/extensions/orbit/vendor/skills/skills/reproduciblify/SKILL.md +146 -0
  298. package/extensions/orbit/vendor/skills/skills/reproduciblify/references/directives.yml +496 -0
  299. package/extensions/orbit/vendor/skills/skills/udt-authoring/SKILL.md +245 -0
  300. package/extensions/orbit/vendor/skills/skills/udt-authoring/examples/01-minimal-echo.yml +27 -0
  301. package/extensions/orbit/vendor/skills/skills/udt-authoring/examples/02-single-data-in-out.yml +27 -0
  302. package/extensions/orbit/vendor/skills/skills/udt-authoring/examples/03-multiple-data-js.yml +28 -0
  303. package/extensions/orbit/vendor/skills/skills/udt-authoring/examples/04-select-integer-boolean.yml +41 -0
  304. package/extensions/orbit/vendor/skills/skills/udt-authoring/examples/05-resource-requirements.yml +25 -0
  305. package/extensions/orbit/vendor/skills/skills/udt-authoring/examples/06-biocontainer-tool.yml +38 -0
  306. package/extensions/orbit/vendor/skills/skills/udt-authoring/examples/07-inline-python-script.yml +56 -0
  307. package/extensions/orbit/vendor/skills/skills/udt-authoring/examples/08-configfile-script.yml +74 -0
  308. package/extensions/orbit/vendor/skills/skills/udt-authoring/references/common-mistakes.md +76 -0
  309. package/extensions/orbit/vendor/skills/skills/udt-authoring/references/schema-reference.md +155 -0
  310. package/extensions/orbit/vendor/skills/skills/udt-authoring/references/templating.md +196 -0
  311. package/extensions/orbit/vendor/skills/skills/udt-authoring/scripts/validate.py +109 -0
  312. package/extensions/orbit/vendor/skills/skills/workflow-reports/README.md +71 -0
  313. package/extensions/orbit/vendor/skills/skills/workflow-reports/SKILL.md +190 -0
  314. package/extensions/orbit/vendor/skills/skills/workflow-reports/examples/histology-staining.md +145 -0
  315. package/extensions/orbit/vendor/skills/skills/workflow-reports/examples/tissue-microarray-analysis.md +176 -0
  316. package/extensions/orbit/vendor/skills/skills/workflow-reports/references/directives.md +415 -0
  317. package/extensions/orbit/vendor/skills/summarize-galaxy-workflow/SKILL.md +98 -0
  318. package/extensions/orbit/vendor/skills/summarize-galaxy-workflow/_provenance.json +93 -0
  319. package/extensions/orbit/vendor/skills/summarize-galaxy-workflow/_required_tools.json +28 -0
  320. package/extensions/orbit/vendor/skills/summarize-galaxy-workflow/_verify.json +17 -0
  321. package/extensions/orbit/vendor/skills/summarize-galaxy-workflow/references/cli/convert.json +123 -0
  322. package/extensions/orbit/vendor/skills/summarize-galaxy-workflow/references/cli/foundry.md +25 -0
  323. package/extensions/orbit/vendor/skills/summarize-galaxy-workflow/references/cli/validate.json +142 -0
  324. package/extensions/orbit/vendor/skills/summarize-galaxy-workflow/references/schemas/summary-galaxy-workflow.schema.json +687 -0
  325. package/extensions/orbit/vendor/skills/validate-galaxy-workflow/SKILL.md +74 -0
  326. package/extensions/orbit/vendor/skills/validate-galaxy-workflow/_provenance.json +71 -0
  327. package/extensions/orbit/vendor/skills/validate-galaxy-workflow/_required_tools.json +16 -0
  328. package/extensions/orbit/vendor/skills/validate-galaxy-workflow/_verify.json +4 -0
  329. package/extensions/orbit/vendor/skills/validate-galaxy-workflow/references/cli/validate.json +142 -0
  330. package/extensions/orbit/vendor/skills/validate-galaxy-workflow/references/notes/galaxy-workflow-invocation-failure-reference.md +138 -0
  331. package/extensions/orbit/vendor/skills/validate-galaxy-workflow/references/notes/galaxy-workflow-testability-design.md +136 -0
  332. package/extensions/orbit/vendor-skills.ts +283 -0
  333. package/extensions/orbit/workspace-state-dir.ts +46 -0
  334. package/extensions/orbit-handoff/index.ts +73 -0
  335. package/extensions/orbit-handoff/orbit-launcher.ts +142 -0
  336. package/extensions/whats-new/index.ts +98 -0
  337. package/lessons/LICENSE +17 -0
  338. package/lessons/README.md +117 -0
  339. package/lessons/SCHEMA.md +187 -0
  340. package/lessons/build-snapshot.mjs +311 -0
  341. package/lessons/data/downloaded-file-is-not-what-its-extension-says.md +61 -0
  342. package/lessons/galaxy-api/403-history-is-a-hard-stop.md +57 -0
  343. package/lessons/galaxy-api/collection-into-single-dataset-input.md +61 -0
  344. package/lessons/galaxy-api/connectedvalue-in-command-line.md +62 -0
  345. package/lessons/galaxy-api/hid-is-not-an-id.md +59 -0
  346. package/lessons/galaxy-api/invoke-workflow-inputs-not-params.md +60 -0
  347. package/lessons/galaxy-api/repeat-param-pipe-keys.md +63 -0
  348. package/lessons/galaxy-api/run-tool-returns-on-submit.md +61 -0
  349. package/lessons/galaxy-tools/reference-index-not-on-server.md +62 -0
  350. package/lessons/log.md +42 -0
  351. package/lessons/reproduction/input-population-mismatch.md +59 -0
  352. package/lessons/reproduction/methods-text-vs-executed-parameters.md +62 -0
  353. package/lessons/snapshot.json +1004 -0
  354. package/lessons/stats/de-contrast-direction-and-sample-labels.md +63 -0
  355. package/lessons/stats/na-coerced-to-zero-in-filters.md +59 -0
  356. package/lessons/validate.mjs +1219 -0
  357. package/package.json +103 -5
  358. package/shared/agent-prompt.d.ts +8 -0
  359. package/shared/agent-prompt.js +15 -0
  360. package/shared/approval-prompt.d.ts +4 -0
  361. package/shared/approval-prompt.js +61 -0
  362. package/shared/brain-env.d.ts +14 -0
  363. package/shared/brain-env.js +108 -0
  364. package/shared/brain-exit.d.ts +20 -0
  365. package/shared/brain-exit.js +149 -0
  366. package/shared/capability-profile.d.ts +16 -0
  367. package/shared/capability-profile.js +75 -0
  368. package/shared/config-source.d.ts +13 -0
  369. package/shared/config-source.js +17 -0
  370. package/shared/confusables.d.ts +3 -0
  371. package/shared/confusables.js +93 -0
  372. package/shared/custom-provider.d.ts +45 -0
  373. package/shared/custom-provider.js +169 -0
  374. package/shared/dashboard-contract.d.ts +123 -0
  375. package/shared/dashboard-contract.js +560 -0
  376. package/shared/dashboard-layout-store.d.ts +44 -0
  377. package/shared/dashboard-layout-store.js +281 -0
  378. package/shared/feedback-contract.d.ts +61 -0
  379. package/shared/feedback-contract.js +146 -0
  380. package/shared/galaxy-artifact-links.d.ts +30 -0
  381. package/shared/galaxy-artifact-links.js +166 -0
  382. package/shared/galaxy-credentials.d.ts +26 -0
  383. package/shared/galaxy-credentials.js +71 -0
  384. package/shared/galaxy-destructive.d.ts +21 -0
  385. package/shared/galaxy-destructive.js +269 -0
  386. package/shared/galaxy-guidance.d.ts +2 -0
  387. package/shared/galaxy-guidance.js +53 -0
  388. package/shared/galaxy-live-contract.d.ts +92 -0
  389. package/shared/galaxy-live-contract.js +180 -0
  390. package/shared/galaxy-page-cells.d.ts +2 -0
  391. package/shared/galaxy-page-cells.js +22 -0
  392. package/shared/galaxy-tool-family.d.ts +5 -0
  393. package/shared/galaxy-tool-family.js +27 -0
  394. package/shared/galaxy-url.d.ts +1 -0
  395. package/shared/galaxy-url.js +48 -0
  396. package/shared/gtn.d.ts +31 -0
  397. package/shared/gtn.js +253 -0
  398. package/shared/handled-prompt.d.ts +3 -0
  399. package/shared/handled-prompt.js +26 -0
  400. package/shared/known-provider.d.ts +11 -0
  401. package/shared/known-provider.js +89 -0
  402. package/shared/lesson-hint-marker.d.ts +7 -0
  403. package/shared/lesson-hint-marker.js +32 -0
  404. package/shared/lesson-rules.d.ts +150 -0
  405. package/shared/lesson-rules.js +203 -0
  406. package/shared/malformed-object-ids.d.ts +1 -0
  407. package/shared/malformed-object-ids.js +37 -0
  408. package/shared/markdown-sections.d.ts +10 -0
  409. package/shared/markdown-sections.js +118 -0
  410. package/shared/notebook-fences.d.ts +12 -0
  411. package/shared/notebook-fences.js +53 -0
  412. package/shared/observation-contract.d.ts +91 -0
  413. package/shared/observation-contract.js +544 -0
  414. package/shared/orbit-config.d.ts +226 -0
  415. package/shared/orbit-config.js +189 -0
  416. package/shared/orbit-env.d.ts +13 -0
  417. package/shared/orbit-env.js +124 -0
  418. package/shared/orbit-shell-contract.d.ts +74 -0
  419. package/shared/orbit-shell-contract.js +30 -0
  420. package/shared/page-content-hash.d.ts +1 -0
  421. package/shared/page-content-hash.js +13 -0
  422. package/shared/pi-default-model.d.ts +7 -0
  423. package/shared/pi-default-model.js +41 -0
  424. package/shared/prompt-blocks.d.ts +87 -0
  425. package/shared/prompt-blocks.js +898 -0
  426. package/shared/provider-auth-caps.d.ts +22 -0
  427. package/shared/provider-auth-caps.js +57 -0
  428. package/shared/random.d.ts +2 -0
  429. package/shared/random.js +15 -0
  430. package/shared/record-excerpt.d.ts +4 -0
  431. package/shared/record-excerpt.js +16 -0
  432. package/shared/redirect-guard.d.ts +36 -0
  433. package/shared/redirect-guard.js +235 -0
  434. package/shared/skills-pin.d.ts +8 -0
  435. package/shared/skills-pin.js +9 -0
  436. package/shared/skills-router.d.ts +17 -0
  437. package/shared/skills-router.js +63 -0
  438. package/shared/sra-import.d.ts +34 -0
  439. package/shared/sra-import.js +206 -0
  440. package/shared/state-dir.d.ts +21 -0
  441. package/shared/state-dir.js +240 -0
  442. package/shared/team-dispatch-contract.d.ts +28 -0
  443. package/shared/team-dispatch-contract.js +1 -0
  444. package/shared/truncate-middle.d.ts +11 -0
  445. package/shared/truncate-middle.js +68 -0
  446. package/shared/version-compare.d.ts +10 -0
  447. package/shared/version-compare.js +74 -0
  448. package/shared/whats-new.d.ts +31 -0
  449. package/shared/whats-new.js +83 -0
  450. package/shared/wsl.d.ts +10 -0
  451. 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
+ }