@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,300 @@
1
+ import * as os from "os";
2
+ import * as path from "path";
3
+ import * as fs from "fs";
4
+ import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
5
+ import { Text } from "@earendil-works/pi-tui";
6
+ import { Type } from "@sinclair/typebox";
7
+ import { getGalaxyConfig, galaxyGet, galaxyPost } from "./galaxy-api";
8
+ import { getCurrentHistoryId } from "./state";
9
+ import { isSensitivePath } from "./exec-guard/sensitive-read";
10
+ import { resolveStateDir } from "../../shared/state-dir.js";
11
+ import type { GalaxyToolFamily } from "../../shared/galaxy-tool-family.js";
12
+ import {
13
+ tusUpload,
14
+ buildFetchPayload,
15
+ waitForDataset,
16
+ type DatasetState,
17
+ } from "./galaxy-upload-tus";
18
+
19
+ interface FetchResponse {
20
+ outputs?: Array<{ id: string; hid?: number; name?: string; state?: string }>;
21
+ jobs?: Array<{ id: string; state?: string }>;
22
+ }
23
+
24
+ /** Shared resume-state file; tus-js-client keys entries by file fingerprint. */
25
+ export function resolveStoragePath(): string {
26
+ return path.join(resolveStateDir(), "upload-resume.json");
27
+ }
28
+
29
+ export interface HistoryContentItem {
30
+ id: string;
31
+ hid: number;
32
+ name: string;
33
+ state: string;
34
+ history_content_type?: string;
35
+ }
36
+
37
+ /** Newest dataset (highest hid) whose name matches; collections excluded. */
38
+ export function pickUploadedDataset(
39
+ contents: HistoryContentItem[],
40
+ fileName: string,
41
+ ): HistoryContentItem | null {
42
+ const matches = contents.filter(
43
+ (c) => (c.history_content_type ?? "dataset") === "dataset" && c.name === fileName,
44
+ );
45
+ if (matches.length === 0) return null;
46
+ return matches.reduce((a, b) => (b.hid > a.hid ? b : a));
47
+ }
48
+
49
+ function err(text: string) {
50
+ return { content: [{ type: "text" as const, text }], details: { error: true } };
51
+ }
52
+
53
+ // Galaxy's Dataset.valid_input_states is "every state EXCEPT these three" -- a
54
+ // dataset that lands in one of them cannot be selected as input to a downstream
55
+ // tool (galaxy: lib/galaxy/model/__init__.py valid_input_states, enforced in
56
+ // tools/parameters/dataset_matcher.py). So an upload ending here transferred the
57
+ // bytes but did NOT produce a dataset the agent can actually use; report it as a
58
+ // failure rather than a success. (ok/empty/deferred are usable -> success.)
59
+ const UNUSABLE_DATASET_STATES = new Set(["error", "discarded", "failed_metadata"]);
60
+
61
+ export function isUnusableDatasetState(state: string): boolean {
62
+ return UNUSABLE_DATASET_STATES.has(state);
63
+ }
64
+
65
+ // State-specific guidance: failed_metadata is recoverable (set the datatype),
66
+ // while error/discarded mean the data did not survive ingest.
67
+ export function ingestFailureMessage(state: string, fileName: string): string {
68
+ if (state === "failed_metadata") {
69
+ return `"${fileName}" transferred, but Galaxy could not detect its metadata (state "failed_metadata"), so it isn't usable as a tool input yet. Set the dataset's datatype in Galaxy and it becomes usable -- no need to re-upload.`;
70
+ }
71
+ if (state === "discarded") {
72
+ return `"${fileName}" transferred, but Galaxy discarded the dataset (state "discarded") without retaining the data. Re-upload to try again.`;
73
+ }
74
+ return `"${fileName}" transferred, but Galaxy's ingest failed (state "error"). Inspect the dataset's job for details before retrying.`;
75
+ }
76
+
77
+ export function registerGalaxyUploadTool(pi: ExtensionAPI, family: GalaxyToolFamily): void {
78
+ pi.registerTool({
79
+ name: "galaxy_upload_local_file",
80
+ label: "Upload local file to Galaxy",
81
+ description:
82
+ "Upload a LOCAL file from the user's machine to a Galaxy history using a resumable " +
83
+ "(TUS) upload, then waits for Galaxy to finish ingesting the dataset before returning. " +
84
+ `For a file already at a public URL, use ${family.tool("upload_file_from_url")} instead.`,
85
+ parameters: Type.Object({
86
+ path: Type.String({ description: "Path to the local file to upload" }),
87
+ history_id: Type.Optional(
88
+ Type.String({ description: "Target Galaxy history id. Defaults to the current history." }),
89
+ ),
90
+ file_name: Type.Optional(
91
+ Type.String({
92
+ description: "Name for the dataset in Galaxy (defaults to the file's basename)",
93
+ }),
94
+ ),
95
+ file_type: Type.Optional(
96
+ Type.String({
97
+ description: "Galaxy datatype (e.g. 'fastqsanger.gz'). Defaults to auto-detect.",
98
+ }),
99
+ ),
100
+ dbkey: Type.Optional(
101
+ Type.String({
102
+ description: "Genome build / dbkey (e.g. 'hg38'). Defaults to unspecified.",
103
+ }),
104
+ ),
105
+ }),
106
+ async execute(_toolCallId, params, signal, _onUpdate, _ctx) {
107
+ const cfg = getGalaxyConfig();
108
+ if (!cfg) {
109
+ return err(
110
+ "Galaxy is not configured (GALAXY_URL / GALAXY_API_KEY). Connect with /connect first.",
111
+ );
112
+ }
113
+
114
+ const historyId = (params.history_id as string | undefined) ?? getCurrentHistoryId();
115
+ if (!historyId) {
116
+ return err(
117
+ "No history_id given and no current Galaxy history is set. Create or select a history, then pass history_id.",
118
+ );
119
+ }
120
+
121
+ const absPath = path.resolve(params.path as string);
122
+ let stat: fs.Stats;
123
+ try {
124
+ stat = fs.statSync(absPath);
125
+ } catch {
126
+ return err(`File not found: ${params.path}`);
127
+ }
128
+ if (!stat.isFile()) return err(`Not a regular file: ${params.path}`);
129
+
130
+ // Resolve symlinks before the sensitive-path check: tusUpload follows
131
+ // the link, so a benign-named symlink to ~/.ssh/id_rsa would otherwise
132
+ // exfiltrate the target. Check both the literal path and its real target.
133
+ let realPath: string;
134
+ try {
135
+ realPath = fs.realpathSync(absPath);
136
+ } catch {
137
+ return err(`Cannot resolve path: ${params.path}`);
138
+ }
139
+ const home = os.homedir();
140
+ if (isSensitivePath(absPath, home) || isSensitivePath(realPath, home)) {
141
+ return err(
142
+ `Refusing to upload "${params.path}": it (or its target) matches loom's sensitive/credential path policy.`,
143
+ );
144
+ }
145
+
146
+ const storagePath = resolveStoragePath();
147
+ fs.mkdirSync(path.dirname(storagePath), { recursive: true });
148
+
149
+ // fileName comes from absPath (the link's own name), not realPath (the target) --
150
+ // the dataset should be named after what the user pointed at, not where the symlink leads.
151
+ const fileName = (params.file_name as string | undefined) ?? path.basename(absPath);
152
+
153
+ let sessionId: string;
154
+ try {
155
+ ({ sessionId } = await tusUpload({
156
+ baseUrl: cfg.url,
157
+ apiKey: cfg.apiKey,
158
+ filePath: realPath, // realpath: already symlink-checked above
159
+ storagePath,
160
+ signal,
161
+ }));
162
+ } catch (e) {
163
+ if (e instanceof Error && e.name === "AbortError") return err("Upload cancelled.");
164
+ return err(`Upload failed during transfer: ${e instanceof Error ? e.message : String(e)}`);
165
+ }
166
+
167
+ let fetchResp: FetchResponse;
168
+ try {
169
+ fetchResp = await galaxyPost<FetchResponse>(
170
+ "/tools/fetch",
171
+ buildFetchPayload({
172
+ historyId,
173
+ sessionId,
174
+ fileName,
175
+ fileType: params.file_type as string | undefined,
176
+ dbkey: params.dbkey as string | undefined,
177
+ }),
178
+ signal,
179
+ );
180
+ } catch (e) {
181
+ if (e instanceof Error && e.name === "AbortError") return err("Upload cancelled.");
182
+ return err(`Galaxy rejected the upload: ${e instanceof Error ? e.message : String(e)}`);
183
+ }
184
+
185
+ // /tools/fetch answers with the upload job(s) as well as the dataset.
186
+ // Carry the ids into `details` so the submission-capture hook can record
187
+ // the upload the same way it records any other Galaxy job -- they were
188
+ // parsed here and then dropped on the floor before.
189
+ const uploadJobIds = (fetchResp.jobs ?? [])
190
+ .map((j) => j?.id)
191
+ .filter((id): id is string => typeof id === "string" && id.length > 0);
192
+
193
+ const output = fetchResp.outputs?.[0];
194
+ let dataset: DatasetState | null = output
195
+ ? { id: output.id, state: output.state ?? "queued", hid: output.hid, name: output.name }
196
+ : null;
197
+
198
+ // Wait the ingest to terminal so we don't hand back a "queued" non-answer.
199
+ if (dataset) {
200
+ try {
201
+ dataset = await waitForDataset(dataset.id, {
202
+ get: (id) => galaxyGet<DatasetState>(`/datasets/${encodeURIComponent(id)}`, signal),
203
+ });
204
+ } catch {
205
+ // Abort or ingest-timeout while polling: the file is already uploaded and the
206
+ // dataset exists, so return it with its last-known state rather than claiming
207
+ // cancellation or failure -- the non-terminal state tells the model to follow up.
208
+ }
209
+ } else {
210
+ // No outputs in the fetch response: fall back to the name-matched read-back.
211
+ try {
212
+ const contents = await galaxyGet<HistoryContentItem[]>(
213
+ `/histories/${encodeURIComponent(historyId)}/contents?keys=id,hid,name,state,history_content_type`,
214
+ signal,
215
+ );
216
+ const ds = pickUploadedDataset(contents, fileName);
217
+ if (ds) dataset = { id: ds.id, state: ds.state, hid: ds.hid, name: ds.name };
218
+ } catch {
219
+ /* best-effort */
220
+ }
221
+ }
222
+
223
+ if (dataset) {
224
+ if (isUnusableDatasetState(dataset.state)) {
225
+ return {
226
+ content: [
227
+ {
228
+ type: "text" as const,
229
+ text: JSON.stringify(
230
+ {
231
+ uploaded: false,
232
+ history_id: historyId,
233
+ dataset: {
234
+ id: dataset.id,
235
+ hid: dataset.hid,
236
+ name: dataset.name,
237
+ state: dataset.state,
238
+ },
239
+ error: ingestFailureMessage(dataset.state, fileName),
240
+ },
241
+ null,
242
+ 2,
243
+ ),
244
+ },
245
+ ],
246
+ details: {
247
+ error: true,
248
+ historyId,
249
+ datasetId: dataset.id,
250
+ state: dataset.state,
251
+ jobs: uploadJobIds,
252
+ },
253
+ };
254
+ }
255
+ return {
256
+ content: [
257
+ {
258
+ type: "text" as const,
259
+ text: JSON.stringify(
260
+ {
261
+ uploaded: true,
262
+ history_id: historyId,
263
+ dataset: {
264
+ id: dataset.id,
265
+ hid: dataset.hid,
266
+ name: dataset.name,
267
+ state: dataset.state,
268
+ },
269
+ },
270
+ null,
271
+ 2,
272
+ ),
273
+ },
274
+ ],
275
+ details: { historyId, datasetId: dataset.id, state: dataset.state, jobs: uploadJobIds },
276
+ };
277
+ }
278
+
279
+ return {
280
+ content: [
281
+ {
282
+ type: "text" as const,
283
+ text:
284
+ `Uploaded "${fileName}" to history ${historyId} (resumable transfer complete). ` +
285
+ `The dataset is being ingested; call get_history_contents("${historyId}") for its id and state.`,
286
+ },
287
+ ],
288
+ details: { historyId, uploaded: true, jobs: uploadJobIds },
289
+ };
290
+ },
291
+ renderResult: (result) => {
292
+ const d = result.details as
293
+ { error?: boolean; datasetId?: string; state?: string } | undefined;
294
+ if (d?.error) return new Text("❌ Galaxy upload failed");
295
+ if (d?.datasetId)
296
+ return new Text(`⬆️ Uploaded to Galaxy (dataset ${d.datasetId}, ${d.state ?? "queued"})`);
297
+ return new Text("⬆️ Uploaded to Galaxy");
298
+ },
299
+ });
300
+ }
@@ -0,0 +1,65 @@
1
+ /**
2
+ * The Galaxy version observations carry.
3
+ *
4
+ * The Galaxy tools have no connect step to report it, so the version comes
5
+ * from galaxy-ops' own /api/version lookup once per session, and is refreshed
6
+ * whenever the model reads get_server_info.
7
+ */
8
+ import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
9
+ import type { GalaxyToolFamily } from "../../shared/galaxy-tool-family.js";
10
+ import { galaxyOpsContext, resetGalaxyOpsVersion } from "./galaxy-api";
11
+ import { recordGalaxyVersion } from "./observations";
12
+
13
+ const isRecord = (v: unknown): v is Record<string, unknown> =>
14
+ typeof v === "object" && v !== null && !Array.isArray(v);
15
+
16
+ /** "26.1" + "1" -> "26.1.1": the release number the connect result used to carry. */
17
+ export function versionOf(payload: unknown): string | undefined {
18
+ if (!isRecord(payload)) return undefined;
19
+ const major = payload.version_major;
20
+ if (typeof major !== "string" || !major) return undefined;
21
+ const minor = payload.version_minor;
22
+ return typeof minor === "string" && minor ? `${major}.${minor}` : major;
23
+ }
24
+
25
+ /** The get_server_info envelope, from structuredContent while it survives, else the text. */
26
+ function envelopeOf(structured: unknown, content: ReadonlyArray<{ type: string; text?: string }>) {
27
+ if (isRecord(structured)) return structured;
28
+ const text = content.find((c) => c.type === "text")?.text;
29
+ if (!text) return undefined;
30
+ try {
31
+ const parsed: unknown = JSON.parse(text);
32
+ return isRecord(parsed) ? parsed : undefined;
33
+ } catch {
34
+ // A preview or a message, not the envelope: nothing to read a version from.
35
+ return undefined;
36
+ }
37
+ }
38
+
39
+ // A session_start whose lookup finishes after a newer one began (a /connect
40
+ // reload, say) must not label the new server with the old one's version.
41
+ let generation = 0;
42
+
43
+ export function registerGalaxyVersionCapture(pi: ExtensionAPI, family: GalaxyToolFamily): void {
44
+ pi.on("session_start", async () => {
45
+ const g = ++generation;
46
+ // A /connect reloads into a new session, possibly on another server or release.
47
+ resetGalaxyOpsVersion();
48
+ const ctx = galaxyOpsContext();
49
+ if (!ctx?.galaxyVersion) return;
50
+ // Not awaited: session start must not wait on a Galaxy round trip.
51
+ void ctx
52
+ .galaxyVersion()
53
+ .then((report) => {
54
+ if (g === generation && report.payload) recordGalaxyVersion(versionOf(report.payload));
55
+ })
56
+ .catch(() => {});
57
+ });
58
+
59
+ pi.on("tool_result", async (event) => {
60
+ if (event.isError || family.toolName(event.toolName) !== "get_server_info") return;
61
+ const env = envelopeOf(event.structuredContent, event.content);
62
+ const data = env?.data;
63
+ if (isRecord(data)) recordGalaxyVersion(versionOf(data.version));
64
+ });
65
+ }
@@ -0,0 +1,173 @@
1
+ /**
2
+ * Automatic git tracking for analysis notebooks.
3
+ *
4
+ * Uses child_process.execFileSync directly — no Pi API dependency — so it can
5
+ * be called from state.ts without threading the extension context through.
6
+ * Every function silently swallows errors: git tracking is nice-to-have,
7
+ * never a reason to break an analysis.
8
+ *
9
+ * `execFileSync` (not `execSync`) is the only spawner used here. It bypasses
10
+ * the shell, so commit messages or filenames containing backticks, $(...),
11
+ * quotes, or any other shell metacharacters can never be interpreted as code.
12
+ */
13
+
14
+ import { execFileSync } from "child_process";
15
+ import { writeFileSync, existsSync } from "fs";
16
+ import * as path from "path";
17
+
18
+ // Change types that warrant their own commit. Everything else (frontmatter,
19
+ // galaxy_ref, literature_ref) is too granular — those changes get picked up
20
+ // by the next real commit since `git add` stages the current file state.
21
+ export const COMMIT_CHANGE_TYPES = new Set([
22
+ "step_added",
23
+ "step_updated",
24
+ "decision",
25
+ "checkpoint",
26
+ "phase_change",
27
+ "data_provenance",
28
+ "publication_update",
29
+ "brc_context_updated",
30
+ "assertion_added",
31
+ ]);
32
+
33
+ const GITIGNORE_CONTENT = `# Large bioinformatics data
34
+ *.fastq
35
+ *.fastq.gz
36
+ *.fq.gz
37
+ *.bam
38
+ *.bai
39
+ *.sam
40
+ *.cram
41
+ *.vcf.gz
42
+ *.bcf
43
+ *.bigwig
44
+ *.bw
45
+ *.h5ad
46
+
47
+ # Archives
48
+ *.tar.gz
49
+ *.tar.bz2
50
+ *.zip
51
+
52
+ # OS
53
+ .DS_Store
54
+ Thumbs.db
55
+
56
+ # Python/R
57
+ __pycache__/
58
+ *.pyc
59
+ .Rhistory
60
+ .RData
61
+
62
+ # Editors
63
+ .vscode/
64
+ .idea/
65
+ *.swp
66
+ *~
67
+
68
+ # Orbit per-analysis conda env (large, reproducible from the notebook's
69
+ # Environment table rather than committed bytes)
70
+ .loom/env/
71
+ .orbit/env/
72
+
73
+ # Orbit session sidecars
74
+ activity.jsonl
75
+ session.jsonl
76
+ `;
77
+
78
+ function git(args: string[], cwd: string): void {
79
+ execFileSync("git", args, { cwd, stdio: "ignore" });
80
+ }
81
+
82
+ function gitOutput(args: string[], cwd: string): string {
83
+ return execFileSync("git", args, {
84
+ cwd,
85
+ stdio: ["ignore", "pipe", "ignore"],
86
+ encoding: "utf-8",
87
+ }).trim();
88
+ }
89
+
90
+ export function isOrbitManagedRepo(cwd: string): boolean {
91
+ try {
92
+ return gitOutput(["config", "--bool", "loom.managed"], cwd) === "true";
93
+ } catch {
94
+ return false;
95
+ }
96
+ }
97
+
98
+ /**
99
+ * Make sure `cwd` is inside a git repo. If it isn't, run `git init`,
100
+ * drop a bioinformatics-friendly .gitignore, and create an initial commit.
101
+ * Returns true only for repos Orbit created or previously marked as managed.
102
+ */
103
+ export function ensureGitRepo(cwd: string): boolean {
104
+ try {
105
+ execFileSync("git", ["rev-parse", "--is-inside-work-tree"], { cwd, stdio: "ignore" });
106
+ return isOrbitManagedRepo(cwd);
107
+ } catch {
108
+ // not a repo — fall through to init
109
+ }
110
+
111
+ try {
112
+ git(["init"], cwd);
113
+ git(["config", "loom.managed", "true"], cwd);
114
+
115
+ const gitignorePath = path.join(cwd, ".gitignore");
116
+ if (!existsSync(gitignorePath)) {
117
+ writeFileSync(gitignorePath, GITIGNORE_CONTENT);
118
+ }
119
+
120
+ git(["add", ".gitignore"], cwd);
121
+ git(["commit", "-m", "Initialize analysis tracking"], cwd);
122
+ return true;
123
+ } catch {
124
+ // git not installed or init failed — silently give up
125
+ return false;
126
+ }
127
+ }
128
+
129
+ /**
130
+ * Stage a single file and commit with `message`.
131
+ * No-ops if nothing changed (git commit exits non-zero, caught by try/catch).
132
+ */
133
+ export function commitFile(filePath: string, message: string): void {
134
+ try {
135
+ const cwd = path.dirname(filePath);
136
+ const filename = path.basename(filePath);
137
+ git(["add", filename], cwd);
138
+ git(["commit", "-m", message], cwd);
139
+ } catch {
140
+ // nothing to commit, or git not available
141
+ }
142
+ }
143
+
144
+ /** Back-compat alias for callers that still commit the notebook file. */
145
+ export function commitNotebook(notebookPath: string, message: string): void {
146
+ commitFile(notebookPath, message);
147
+ }
148
+
149
+ /**
150
+ * Build a human-readable commit message from a change type and its data.
151
+ */
152
+ export function buildCommitMessage(changeType: string, data: Record<string, unknown>): string {
153
+ switch (changeType) {
154
+ case "step_added":
155
+ return `Add step: ${(data.step as { name?: string })?.name ?? "unknown"}`;
156
+ case "step_updated":
157
+ return `Step ${data.stepId ?? "?"}: ${data.status ?? "updated"}`;
158
+ case "decision":
159
+ return `Log: ${data.type ?? "decision"}`;
160
+ case "checkpoint":
161
+ return `QC: ${data.name ?? "checkpoint"} (${data.status ?? "?"})`;
162
+ case "phase_change":
163
+ return `Phase: ${data.phase ?? "unknown"}`;
164
+ case "data_provenance":
165
+ return "Data provenance updated";
166
+ case "publication_update":
167
+ return `Publication: ${data.updateType ?? "update"}`;
168
+ case "assertion_added":
169
+ return `Assertion: ${data.claim ?? "claim recorded"} (${data.verdict ?? "pending"})`;
170
+ default:
171
+ return `Notebook update (${changeType})`;
172
+ }
173
+ }