@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,4 @@
1
+ export function resolvePiExtensionDir(
2
+ name: string,
3
+ resolveSpecifier: (specifier: string) => string,
4
+ ): string;
@@ -0,0 +1,44 @@
1
+ // Resolve the on-disk directory of a Pi extension package (pi-mcp-adapter,
2
+ // pi-web-access) so bin/orbit.js can hand the path to Pi as an extension.
3
+ //
4
+ // Two package shapes are in the wild and neither resolves the other's way:
5
+ //
6
+ // * No "exports" map (pi-mcp-adapter <=2.11.0, pi-web-access today). These
7
+ // also declare no "main", so the bare specifier has nothing to resolve
8
+ // against -- only the deep "<name>/index.ts" subpath works.
9
+ // * An "exports" map (pi-mcp-adapter >=2.12.0). Exports are a closed list, so
10
+ // the deep subpath is refused with ERR_PACKAGE_PATH_NOT_EXPORTED -- only the
11
+ // bare specifier works, and it points at index.ts anyway.
12
+ //
13
+ // Orbit depends on a range that spans both shapes, so a fresh install resolves to
14
+ // whichever the registry serves today. Hardcoding either specifier breaks the
15
+ // other half. pi-mcp-adapter 2.12.0 added its exports map on 2026-07-24 and that
16
+ // silently broke `npm install -g @galaxyproject/orbit` -- the CLI died on startup
17
+ // before printing anything. Try both and take whichever answers.
18
+
19
+ import { dirname } from "node:path";
20
+
21
+ /**
22
+ * @param {string} name package name, e.g. "pi-mcp-adapter"
23
+ * @param {(specifier: string) => string} resolveSpecifier normally a
24
+ * `createRequire(...)`-derived `require.resolve`; injected so this is testable
25
+ * without installing several versions of the real package.
26
+ * @returns {string} directory containing the extension's entry point
27
+ */
28
+ export function resolvePiExtensionDir(name, resolveSpecifier) {
29
+ const failures = [];
30
+ // Bare first: it honors whatever entry point the package declares. The deep
31
+ // subpath is the compatibility fallback for packages that declare none.
32
+ for (const specifier of [name, `${name}/index.ts`]) {
33
+ try {
34
+ return dirname(resolveSpecifier(specifier));
35
+ } catch (err) {
36
+ failures.push(` ${specifier} -- ${err && (err.code || err.message)}`);
37
+ }
38
+ }
39
+ throw new Error(
40
+ `orbit: could not resolve the "${name}" extension. Tried:\n${failures.join("\n")}\n` +
41
+ `This usually means the package is missing or was published with an entry ` +
42
+ `point Orbit does not know about. Reinstalling Orbit normally fixes it.`,
43
+ );
44
+ }
@@ -0,0 +1,22 @@
1
+ export declare function hasStoredCredential(
2
+ auth: Record<string, unknown> | undefined,
3
+ provider: string,
4
+ ): boolean;
5
+
6
+ export declare function isProviderUsable(
7
+ provider: string,
8
+ entry: { apiKey?: string } | undefined,
9
+ auth: Record<string, unknown> | undefined,
10
+ opts?: {
11
+ env?: Record<string, string | undefined>;
12
+ oauthOnlyProviders?: ReadonlySet<string>;
13
+ providerEnvMap?: Record<string, string>;
14
+ customKeyResolved?: string | undefined;
15
+ },
16
+ ): boolean;
17
+
18
+ export declare function pickSignedInFallback(
19
+ auth: Record<string, unknown> | undefined,
20
+ oauthOnlyProviders: Iterable<string>,
21
+ current: string,
22
+ ): string | null;
@@ -0,0 +1,77 @@
1
+ /**
2
+ * Deciding whether this process can authenticate a given LLM provider, and
3
+ * which signed-in provider to fall back on when it can't.
4
+ *
5
+ * Split out of bin/orbit.js so the decision is testable without spawning the
6
+ * CLI -- #429 was a wrong answer here that silently rewrote user config.
7
+ */
8
+
9
+ /**
10
+ * Does ~/.pi/agent/auth.json hold a credential pi can use for this provider?
11
+ *
12
+ * Checked for EVERY provider, not just sign-in-only ones: pi reads auth.json
13
+ * natively, so a stored anthropic login is exactly as usable as a codex one.
14
+ * The old code only consulted auth.json for openai-codex, which meant a CLI
15
+ * user signed into Anthropic still got judged unusable and bounced elsewhere.
16
+ */
17
+ export function hasStoredCredential(auth, provider) {
18
+ const cred = auth?.[provider];
19
+ if (!cred || typeof cred !== "object" || Array.isArray(cred)) return false;
20
+ // Mirrors pi's own idea of a valid credential: OAuthCredential requires
21
+ // access + refresh + expires (a partial entry has nothing to refresh with),
22
+ // and ReadOnlyAuthStorage.load() hard-throws on anything that isn't one of
23
+ // these two shapes. Tolerating a looser shape -- a missing `type`, say --
24
+ // doesn't buy compatibility with older files, it just calls something a login
25
+ // when nothing downstream can authenticate with it.
26
+ if (cred.type === "api_key") {
27
+ const validKey = cred.key === undefined || typeof cred.key === "string";
28
+ const validEnv =
29
+ cred.env === undefined ||
30
+ (typeof cred.env === "object" &&
31
+ cred.env !== null &&
32
+ !Array.isArray(cred.env) &&
33
+ Object.values(cred.env).every((v) => typeof v === "string"));
34
+ return validKey && validEnv;
35
+ }
36
+ return (
37
+ cred.type === "oauth" &&
38
+ typeof cred.access === "string" &&
39
+ typeof cred.refresh === "string" &&
40
+ typeof cred.expires === "number" &&
41
+ Number.isFinite(cred.expires)
42
+ );
43
+ }
44
+
45
+ /**
46
+ * Can this process authenticate `provider`?
47
+ *
48
+ * `oauthOnlyProviders` is the set that authenticates ONLY by sign-in -- for pi
49
+ * 0.84 that is just openai-codex. Providers that offer sign-in *and* accept a
50
+ * key (anthropic, xai, openrouter, ...) are deliberately not in it: they can
51
+ * still be driven by an API key, which is the whole point of #429.
52
+ *
53
+ * `customKeyResolved` is the already-resolved key for an OpenAI-compatible
54
+ * custom provider, or undefined when the entry isn't one.
55
+ */
56
+ export function isProviderUsable(provider, entry, auth, opts = {}) {
57
+ const { env = {}, oauthOnlyProviders = new Set(), providerEnvMap = {}, customKeyResolved } = opts;
58
+ if (hasStoredCredential(auth, provider)) return true;
59
+ // Sign-in is the only way in, and there's no stored login -- no key can help.
60
+ if (oauthOnlyProviders.has(provider)) return false;
61
+ if (customKeyResolved !== undefined) return Boolean(customKeyResolved);
62
+ if (entry?.apiKey) return true;
63
+ const envVar = providerEnvMap[provider];
64
+ return Boolean(envVar && env[envVar]);
65
+ }
66
+
67
+ /**
68
+ * Pick a signed-in sign-in-only provider to fall back to. Returns null when
69
+ * nothing is signed in, or when the only candidate is the provider we're
70
+ * already on.
71
+ */
72
+ export function pickSignedInFallback(auth, oauthOnlyProviders, current) {
73
+ for (const p of oauthOnlyProviders) {
74
+ if (p !== current && hasStoredCredential(auth, p)) return p;
75
+ }
76
+ return null;
77
+ }
@@ -0,0 +1,38 @@
1
+ // Terminal "thinking block" visibility. Pi streams the model's reasoning into
2
+ // the interactive TUI by default, which makes the Orbit terminal noisy. Orbit
3
+ // hides it by default and writes the resolved value to pi's `hideThinkingBlock`
4
+ // setting (the same ~/.pi/agent/settings.json Orbit already manages for
5
+ // `quietStartup`). That setting is global and only the interactive renderer
6
+ // reads it, so bin/orbit.js only reconciles it for interactive terminal launches.
7
+ //
8
+ // Override the default persistently with `ui.showThinking: true` in
9
+ // ~/.orbit/config.json; for a one-off, pi's built-in Ctrl+T toggles it live.
10
+ //
11
+ // Pure so it can be unit-tested; bin/orbit.js supplies the config value.
12
+
13
+ /**
14
+ * Resolve whether pi should hide thinking blocks in the terminal.
15
+ * @param {{ configShowThinking?: boolean }} [opts] `ui.showThinking` from ~/.orbit/config.json
16
+ * @returns {boolean} true = hide (the default); false = show (config opted in)
17
+ */
18
+ export function resolveHideThinking({ configShowThinking } = {}) {
19
+ return configShowThinking !== true;
20
+ }
21
+
22
+ /**
23
+ * Is this Orbit launch an interactive terminal TUI? `hideThinkingBlock` only
24
+ * affects pi's interactive renderer, so non-interactive launches must not
25
+ * write it (it would churn the global settings file for a setting they never
26
+ * read): `--mode rpc` (Orbit and the web dev server), `--mode json` (evals),
27
+ * and headless `--print` / `-p`. Gating on the mode rather than a per-spawner
28
+ * env var means new non-interactive callers are covered automatically.
29
+ * @param {string[]} [argv] the CLI user args (process.argv.slice(2))
30
+ * @returns {boolean}
31
+ */
32
+ export function isInteractiveTerminal(argv = []) {
33
+ if (argv.includes("--print") || argv.includes("-p")) return false;
34
+ const i = argv.indexOf("--mode");
35
+ const mode =
36
+ i !== -1 ? argv[i + 1] : argv.find((a) => a.startsWith("--mode="))?.slice("--mode=".length);
37
+ return mode !== "rpc" && mode !== "json";
38
+ }
@@ -0,0 +1,15 @@
1
+ // Mirrors the discriminated union in update-check.js: a failure entry carries
2
+ // no latest/channel; a success entry requires both.
3
+ export type Cache =
4
+ | { fetchedAt: number; failed: true }
5
+ | { fetchedAt: number; failed?: false; latest: string; channel: string };
6
+ export function getOrbitVersion(): string;
7
+ export function parseCache(raw: string, now: number): Cache | null;
8
+ export function noticeFor(current: string, cache: Cache | null): string | null;
9
+ export function readCache(): Cache | null;
10
+ export function readNotice(): string | null;
11
+ export function refreshCache(): Promise<void>;
12
+ export function detectInstall(channel: string): {
13
+ kind: "global" | "local" | "unknown";
14
+ cmd: string | null;
15
+ };
@@ -0,0 +1,137 @@
1
+ // CLI-owned update-check helper. Queries the npm registry for the newest
2
+ // version on the user's channel, caches the answer in the state dir, and exposes a
3
+ // notice string for the CLI-shell glue extension to surface in-session. The
4
+ // network refresh runs as a detached child (see bin/orbit.js) so it never
5
+ // blocks startup or is killed mid-write. Pure helpers (parseCache, noticeFor)
6
+ // are unit-tested; the I/O wrappers are thin.
7
+
8
+ import fs from "node:fs";
9
+ import path from "node:path";
10
+ import { pathToFileURL, fileURLToPath } from "node:url";
11
+ import { execSync } from "node:child_process";
12
+ import { isNewer, pickChannel } from "../shared/version-compare.js";
13
+ import { resolveCliVersionCheckPath } from "../shared/state-dir.js";
14
+
15
+ const PKG = "@galaxyproject/orbit";
16
+ const REGISTRY = "https://registry.npmjs.org/@galaxyproject/orbit";
17
+ const SUCCESS_TTL_MS = 24 * 60 * 60 * 1000;
18
+ const FAILURE_TTL_MS = 60 * 60 * 1000;
19
+ const FETCH_TIMEOUT_MS = 5000;
20
+
21
+ // This file lives at <pkg>/bin/update-check.js, so the package root is one up.
22
+ const PKG_ROOT = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..");
23
+
24
+ /** @returns {string} the installed Orbit version, from this package's package.json. */
25
+ export function getOrbitVersion() {
26
+ const pkg = JSON.parse(fs.readFileSync(path.join(PKG_ROOT, "package.json"), "utf-8"));
27
+ return pkg.version;
28
+ }
29
+
30
+ /**
31
+ * @typedef {{ fetchedAt: number, failed: true } | { fetchedAt: number, failed?: false, latest: string, channel: string }} Cache
32
+ */
33
+
34
+ /** Parse + TTL-validate a cache file's contents. Pure.
35
+ * @param {string} raw @param {number} now @returns {Cache | null} */
36
+ export function parseCache(raw, now) {
37
+ let parsed;
38
+ try {
39
+ parsed = JSON.parse(raw);
40
+ } catch {
41
+ return null;
42
+ }
43
+ if (!parsed || typeof parsed.fetchedAt !== "number") return null;
44
+ const failed = parsed.failed === true;
45
+ if (now - parsed.fetchedAt > (failed ? FAILURE_TTL_MS : SUCCESS_TTL_MS)) return null;
46
+ if (failed) return { fetchedAt: parsed.fetchedAt, failed: true };
47
+ if (typeof parsed.latest !== "string" || typeof parsed.channel !== "string") return null;
48
+ /** @type {Cache} */
49
+ const entry = { fetchedAt: parsed.fetchedAt, latest: parsed.latest, channel: parsed.channel };
50
+ return entry;
51
+ }
52
+
53
+ /** Build the notice string, or null if up to date / no usable cache. Pure.
54
+ * @param {string} current @param {Cache | null} cache @returns {string | null} */
55
+ export function noticeFor(current, cache) {
56
+ if (!cache || cache.failed) return null;
57
+ if (!isNewer(current, cache.latest)) return null;
58
+ return `orbit ${cache.latest} is available (you have ${current}) -- run: npm i -g ${PKG}@${cache.channel}`;
59
+ }
60
+
61
+ /** Read + validate the cache from disk. @returns {Cache | null} */
62
+ export function readCache() {
63
+ try {
64
+ return parseCache(fs.readFileSync(resolveCliVersionCheckPath(), "utf-8"), Date.now());
65
+ } catch {
66
+ return null;
67
+ }
68
+ }
69
+
70
+ /** The in-session notice for the current install, or null. @returns {string | null} */
71
+ export function readNotice() {
72
+ try {
73
+ return noticeFor(getOrbitVersion(), readCache());
74
+ } catch {
75
+ return null;
76
+ }
77
+ }
78
+
79
+ function writeCache(entry) {
80
+ try {
81
+ const file = resolveCliVersionCheckPath();
82
+ fs.mkdirSync(path.dirname(file), { recursive: true });
83
+ fs.writeFileSync(file, JSON.stringify(entry));
84
+ } catch {}
85
+ }
86
+
87
+ /** Query the npm registry for the newest version on the install's channel and
88
+ * cache it. Best-effort: a failure writes a short-TTL failure marker. */
89
+ export async function refreshCache() {
90
+ if (readCache()) return; // still fresh; nothing to do
91
+ const channel = pickChannel(getOrbitVersion());
92
+ try {
93
+ const res = await fetch(REGISTRY, {
94
+ headers: { Accept: "application/vnd.npm.install-v1+json" },
95
+ signal: AbortSignal.timeout(FETCH_TIMEOUT_MS),
96
+ });
97
+ if (!res.ok) throw new Error(`registry ${res.status}`);
98
+ const body = await res.json();
99
+ // dist-tags is present in the abbreviated install manifest too, so the
100
+ // lightweight Accept header above is enough -- no full packument needed.
101
+ const latest = body["dist-tags"]?.[channel];
102
+ if (typeof latest !== "string") throw new Error("no dist-tag");
103
+ writeCache({ fetchedAt: Date.now(), latest, channel });
104
+ } catch {
105
+ writeCache({ fetchedAt: Date.now(), failed: true });
106
+ }
107
+ }
108
+
109
+ /** Resolve how Orbit was installed, for `orbit update`.
110
+ * @param {string} channel @returns {{ kind: "global" | "local" | "unknown", cmd: string | null }} */
111
+ export function detectInstall(channel) {
112
+ // A git checkout run via tsx isn't an npm install -- don't try to npm-update it.
113
+ if (fs.existsSync(path.join(PKG_ROOT, ".git"))) {
114
+ return { kind: "unknown", cmd: null };
115
+ }
116
+ let globalRoot = "";
117
+ try {
118
+ globalRoot = execSync("npm root -g", { encoding: "utf-8" }).trim();
119
+ } catch {}
120
+ // Compare on a path boundary so "/x/node_modules" doesn't match a sibling
121
+ // like "/x/node_modules-vendor/...".
122
+ const isGlobal = Boolean(globalRoot) && PKG_ROOT.startsWith(globalRoot + path.sep);
123
+ const flag = isGlobal ? "-g " : "";
124
+ return {
125
+ kind: isGlobal ? "global" : "local",
126
+ cmd: `npm install ${flag}${PKG}@${channel}`,
127
+ };
128
+ }
129
+
130
+ // Detached-refresh entrypoint: `node bin/update-check.js --refresh`.
131
+ if (
132
+ process.argv[1] &&
133
+ import.meta.url === pathToFileURL(process.argv[1]).href &&
134
+ process.argv.includes("--refresh")
135
+ ) {
136
+ refreshCache().finally(() => process.exit(0));
137
+ }
@@ -0,0 +1,32 @@
1
+ /**
2
+ * CLI update notice -- terminal-CLI shell glue, NOT part of the loom brain.
3
+ *
4
+ * Surfaces the cached "update available" notice (computed by bin/update-check.js)
5
+ * once per session via ctx.ui.notify. Lives here, alongside orbit-handoff, so
6
+ * extensions/orbit/ stays shell-neutral. No-ops inside Orbit (which owns its own
7
+ * updates) and when update checks are disabled.
8
+ */
9
+
10
+ import type { ExtensionAPI, ExtensionContext } from "@earendil-works/pi-coding-agent";
11
+ // bin/ is a sibling of extensions/; this resolves to <pkg>/bin/update-check.js.
12
+ import { readNotice } from "../../bin/update-check.js";
13
+ import { isDesktopShell, readEnv } from "../../shared/orbit-env.js";
14
+
15
+ export default function cliUpdateExtension(pi: ExtensionAPI): void {
16
+ let shown = false;
17
+ pi.on("before_agent_start", async (_event, ctx: ExtensionContext) => {
18
+ if (shown) return;
19
+ shown = true;
20
+ // Orbit owns updates for its embedded brain; the bundled CLI copy can't be
21
+ // npm-updated. LOOM_NO_UPDATE_CHECK is set by bin/orbit.js from the config
22
+ // flag / --no-update-check.
23
+ if (isDesktopShell()) return;
24
+ if (readEnv("NO_UPDATE_CHECK") === "1") return;
25
+ try {
26
+ const notice = readNotice();
27
+ if (notice) ctx.ui.notify(notice, "info");
28
+ } catch {
29
+ // A notice must never break a session.
30
+ }
31
+ });
32
+ }
@@ -0,0 +1,141 @@
1
+ /**
2
+ * Activity hooks — stream user prompts and tool calls into activity.jsonl.
3
+ *
4
+ * Mirrors the conversation into the session's append-only activity log so the
5
+ * Activity pane reflects every non-trivial interaction, not just plan
6
+ * mutations. Guarded on `getNotebookPath()` so nothing writes before
7
+ * `initSessionArtifacts()` has set up the session dir.
8
+ */
9
+
10
+ import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
11
+ import * as path from "path";
12
+ import { getNotebookPath } from "./state";
13
+ import { appendActivityEvent } from "./activity";
14
+ import { currentSecretValues, redactSecrets } from "./secret-redaction";
15
+ import { withoutAppendedLessonHints } from "./lessons/pi-event-contract";
16
+
17
+ // Read-only / filesystem-traversal tools clutter the log without telling the
18
+ // user anything they'd want to re-read later. Omit them. lessons_search is
19
+ // here for a different reason: its query says what the user is stuck on and
20
+ // its result is lesson prose, and the lesson.surfaced row already records
21
+ // which lesson surfaced.
22
+ const NOISY_TOOLS = new Set(["read", "grep", "glob", "ls", "find", "lessons_search"]);
23
+
24
+ // Tools whose argument shape is known to carry credentials. activity.jsonl
25
+ // lives in the project cwd and users may share the dir (commit it, send it
26
+ // over for help) — never persist secrets there.
27
+ const CREDENTIAL_TOOLS = new Set(["galaxy_set_profile"]);
28
+
29
+ // Argument keys that universally indicate secrets, redacted on every tool.
30
+ const CREDENTIAL_KEYS = new Set([
31
+ "apikey",
32
+ "api_key",
33
+ "authorization",
34
+ "token",
35
+ "password",
36
+ "secret",
37
+ "credentials",
38
+ ]);
39
+
40
+ const REDACTED = "[redacted]";
41
+
42
+ /**
43
+ * Walk an args object and replace any credential-looking values with a
44
+ * placeholder. Mutates a deep clone so the live event still has the
45
+ * original shape (the upstream tool runner needs it).
46
+ */
47
+ export function redactArgs(toolName: string, args: unknown): unknown {
48
+ if (CREDENTIAL_TOOLS.has(toolName)) {
49
+ // Whole-object redact — opt-in for tools that exist solely to take a
50
+ // credential. Only the tool name survives in the activity log.
51
+ return { _redacted: true };
52
+ }
53
+ if (args === null || typeof args !== "object") return args;
54
+ if (Array.isArray(args)) return args.map((v) => redactArgs(toolName, v));
55
+ const out: Record<string, unknown> = {};
56
+ for (const [k, v] of Object.entries(args as Record<string, unknown>)) {
57
+ if (CREDENTIAL_KEYS.has(k.toLowerCase())) {
58
+ out[k] = REDACTED;
59
+ } else {
60
+ out[k] = redactArgs(toolName, v);
61
+ }
62
+ }
63
+ return out;
64
+ }
65
+
66
+ const RESULT_SUMMARY_MAX = 500;
67
+
68
+ function sessionDir(): string | null {
69
+ const nb = getNotebookPath();
70
+ return nb ? path.dirname(nb) : null;
71
+ }
72
+
73
+ // Redact BEFORE truncating so a secret can't survive by being split across the
74
+ // truncation boundary. Tool RESULTS (unlike args) carry whatever a command
75
+ // printed -- a `cat`-style leak lands here, and this log also feeds /feedback.
76
+ export function summarizeResult(result: unknown, secrets: string[] = []): string {
77
+ if (result == null) return "";
78
+ const raw = typeof result === "string" ? result : JSON.stringify(result);
79
+ const str = redactSecrets(raw, secrets);
80
+ if (str.length <= RESULT_SUMMARY_MAX) return str;
81
+ return (
82
+ str.slice(0, RESULT_SUMMARY_MAX) + `… [truncated ${str.length - RESULT_SUMMARY_MAX} chars]`
83
+ );
84
+ }
85
+
86
+ // The end event carries the result after the tool_result hooks, so a lesson
87
+ // hint rides along. It is Orbit's prose, not the tool's output, and this log
88
+ // ships with /feedback; the lesson.surfaced row already says which one fired.
89
+ function withoutHintBlocks(result: unknown): unknown {
90
+ const content = (result as { content?: unknown } | null)?.content;
91
+ if (!Array.isArray(content)) return result;
92
+ return { ...(result as object), content: withoutAppendedLessonHints(content) };
93
+ }
94
+
95
+ export function registerActivityHooks(pi: ExtensionAPI): void {
96
+ pi.on("input", async (event) => {
97
+ const dir = sessionDir();
98
+ if (!dir) return;
99
+ appendActivityEvent(dir, {
100
+ timestamp: new Date().toISOString(),
101
+ kind: "user.prompt",
102
+ source: event.source,
103
+ payload: { text: event.text },
104
+ });
105
+ return { action: "continue" };
106
+ });
107
+
108
+ pi.on("tool_execution_start", async (event) => {
109
+ if (NOISY_TOOLS.has(event.toolName)) return;
110
+ const dir = sessionDir();
111
+ if (!dir) return;
112
+ appendActivityEvent(dir, {
113
+ timestamp: new Date().toISOString(),
114
+ kind: "tool.start",
115
+ source: "agent",
116
+ payload: {
117
+ toolCallId: event.toolCallId,
118
+ toolName: event.toolName,
119
+ args: redactArgs(event.toolName, event.args),
120
+ },
121
+ });
122
+ });
123
+
124
+ pi.on("tool_execution_end", async (event) => {
125
+ if (NOISY_TOOLS.has(event.toolName)) return;
126
+ const dir = sessionDir();
127
+ if (!dir) return;
128
+ const secrets = currentSecretValues({ auth: false });
129
+ appendActivityEvent(dir, {
130
+ timestamp: new Date().toISOString(),
131
+ kind: "tool.end",
132
+ source: "agent",
133
+ payload: {
134
+ toolCallId: event.toolCallId,
135
+ toolName: event.toolName,
136
+ isError: event.isError,
137
+ resultSummary: summarizeResult(withoutHintBlocks(event.result), secrets),
138
+ },
139
+ });
140
+ });
141
+ }
@@ -0,0 +1,116 @@
1
+ /**
2
+ * Activity log — append-only JSONL record of plan/session events.
3
+ *
4
+ * Written alongside the session's notebook.md (same dir). Every entry is a
5
+ * generic envelope {timestamp, kind, source, payload} so new event kinds can
6
+ * be added without a schema migration. Consumers (activity tab, /summarize)
7
+ * read back by streaming the file.
8
+ *
9
+ * The module also holds an in-memory mirror of the current session's events
10
+ * so the UI bridge can stream them to the shell without re-parsing JSONL on
11
+ * every mutation.
12
+ */
13
+
14
+ import { appendFileSync, mkdirSync, readFileSync, existsSync } from "fs";
15
+ import * as path from "path";
16
+ import { capabilityProfile } from "../../shared/capability-profile.js";
17
+
18
+ export interface ActivityEvent {
19
+ timestamp: string;
20
+ kind: string;
21
+ source: string;
22
+ payload: Record<string, unknown>;
23
+ }
24
+
25
+ let currentEvents: ActivityEvent[] = [];
26
+
27
+ type ActivityChangeListener = (events: ActivityEvent[]) => void;
28
+ const changeListeners: ActivityChangeListener[] = [];
29
+
30
+ /** Subscribe to activity updates; returns an unsubscribe function. */
31
+ export function onActivityChange(listener: ActivityChangeListener): () => void {
32
+ changeListeners.push(listener);
33
+ return () => {
34
+ const idx = changeListeners.indexOf(listener);
35
+ if (idx >= 0) changeListeners.splice(idx, 1);
36
+ };
37
+ }
38
+
39
+ function notifyActivityChange(): void {
40
+ for (const listener of changeListeners) {
41
+ listener(currentEvents);
42
+ }
43
+ }
44
+
45
+ /** Return a snapshot of the current in-memory event list. */
46
+ export function getActivityEvents(): ActivityEvent[] {
47
+ return currentEvents;
48
+ }
49
+
50
+ /** Return the last `n` events (most recent last). Used for context injection. */
51
+ export function getRecentActivityEvents(n: number): ActivityEvent[] {
52
+ if (n <= 0) return [];
53
+ return currentEvents.slice(-n);
54
+ }
55
+
56
+ /** Clear the in-memory event list (session boundary / reset). */
57
+ export function resetActivity(): void {
58
+ currentEvents = [];
59
+ notifyActivityChange();
60
+ }
61
+
62
+ /**
63
+ * Hydrate the in-memory event list from an existing activity.jsonl on disk.
64
+ * Called on session_start / notebook-path change so the Activity pane shows
65
+ * historical events from previous runs.
66
+ */
67
+ export function loadActivityLog(sessionDir: string): void {
68
+ const filePath = path.join(sessionDir, "activity.jsonl");
69
+ currentEvents = [];
70
+ // A page notebook has no directory beside it, so the mirror starts empty.
71
+ if (capabilityProfile().notebook !== "file" || !existsSync(filePath)) {
72
+ notifyActivityChange();
73
+ return;
74
+ }
75
+ try {
76
+ const raw = readFileSync(filePath, "utf-8");
77
+ for (const line of raw.split("\n")) {
78
+ if (!line.trim()) continue;
79
+ try {
80
+ const event = JSON.parse(line) as ActivityEvent;
81
+ currentEvents.push(event);
82
+ } catch {
83
+ // Skip malformed lines rather than abort the whole session.
84
+ }
85
+ }
86
+ } catch (err) {
87
+ console.error("activity hydrate failed:", err);
88
+ }
89
+ notifyActivityChange();
90
+ }
91
+
92
+ /**
93
+ * Append an event to <sessionDir>/activity.jsonl. Creates the directory if
94
+ * missing. Returns the absolute path of the file that was written, or null
95
+ * when nothing was written (a page notebook has no file; a failed write).
96
+ * Also updates the in-memory mirror and notifies listeners so the UI can
97
+ * refresh incrementally.
98
+ */
99
+ export function appendActivityEvent(sessionDir: string, event: ActivityEvent): string | null {
100
+ const filePath = path.join(sessionDir, "activity.jsonl");
101
+ // The mirror is what the UI bridge and the lesson nudge read; the file is
102
+ // the audit sidecar, which only a file notebook has a directory for.
103
+ const onDisk = capabilityProfile().notebook === "file";
104
+ try {
105
+ if (onDisk) {
106
+ mkdirSync(sessionDir, { recursive: true });
107
+ appendFileSync(filePath, JSON.stringify(event) + "\n", "utf-8");
108
+ }
109
+ currentEvents.push(event);
110
+ notifyActivityChange();
111
+ return onDisk ? filePath : null;
112
+ } catch (err) {
113
+ console.error("activity append failed:", err);
114
+ return null;
115
+ }
116
+ }
@@ -0,0 +1,11 @@
1
+ import * as path from "path";
2
+ import * as os from "os";
3
+
4
+ /**
5
+ * Resolve pi's agent directory -- where mcp.json, sessions, and Orbit's own
6
+ * per-cwd state live. Honors PI_CODING_AGENT_DIR (set in tests and custom
7
+ * setups), else ~/.pi/agent.
8
+ */
9
+ export function piAgentDir(): string {
10
+ return process.env.PI_CODING_AGENT_DIR || path.join(os.homedir(), ".pi", "agent");
11
+ }