@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,105 @@
1
+ /**
2
+ * The one place pi's tool-result shape is named.
3
+ *
4
+ * The lesson matcher needs the CALL ARGUMENTS, not just the result text: a
5
+ * host in a URL, an extension in a path, a Galaxy tool id in `tool_id` are all
6
+ * triggers. Only `tool_result` carries them. `message_end` -- which the
7
+ * existing model-facing hints in `skill-triggers.ts` use -- carries just
8
+ * `{ message }`, so a hint hosted there could never match on arguments. The
9
+ * assertions below make that a compile error rather than a silently dead
10
+ * trigger table if upstream ever moves a field.
11
+ *
12
+ * Handlers chain inside one extension in registration order, and pi feeds each
13
+ * one the previous handler's `content`. So every handler registered after
14
+ * `registerLessonHint` sees the hint, which is why the hint is a block of its
15
+ * own, and why this module remembers which blocks it appended: a consumer that
16
+ * drops "the hint" drops only those, never a tool's own block that happens to
17
+ * open with the marker.
18
+ */
19
+
20
+ import type { MessageEndEvent, ToolResultEvent } from "@earendil-works/pi-coding-agent";
21
+ import { isLessonHintBlock } from "../../../shared/lesson-hint-marker.js";
22
+
23
+ // The exact text of every hint this process appended. A tool can open a block
24
+ // of its own with the marker, but it cannot put that block in here, so a
25
+ // hostile output that dresses its error up as a lesson is still read as the
26
+ // tool's error by the observation collector and the activity log. One entry
27
+ // per lesson that fired; cleared with the armed set on session_start.
28
+ const appendedHints = new Set<string>();
29
+
30
+ /** The content array pi hands a `tool_result` handler, and accepts back. */
31
+ export type LessonToolResultContent = ToolResultEvent["content"];
32
+
33
+ /** Everything lesson matching reads off a `tool_result` event. */
34
+ export interface LessonToolResultFields {
35
+ toolName: string;
36
+ toolCallId: string;
37
+ input: Record<string, unknown>;
38
+ content: LessonToolResultContent;
39
+ /**
40
+ * Carried for completeness, and deliberately NOT a matcher input:
41
+ * `invocation-failure-hint.ts` finds failures inside successful results, so
42
+ * gating a lesson on `isError` would miss the cases that matter.
43
+ */
44
+ isError: boolean;
45
+ }
46
+
47
+ // Compile-time proof that pi's event really carries all of them.
48
+ const toolResultFields: (e: ToolResultEvent) => LessonToolResultFields = (e) => ({
49
+ toolName: e.toolName,
50
+ toolCallId: e.toolCallId,
51
+ input: e.input,
52
+ content: e.content,
53
+ isError: e.isError,
54
+ });
55
+ void toolResultFields;
56
+
57
+ // ...and that `message_end` carries nothing but the message, which is why the
58
+ // hint cannot live there.
59
+ type MessageEndExtraKeys = Exclude<keyof MessageEndEvent, "type" | "message">;
60
+ const messageEndHasOnlyMessage: [MessageEndExtraKeys] extends [never] ? true : false = true;
61
+ void messageEndHasOnlyMessage;
62
+
63
+ /** Every text block of a result, joined -- the signature-matching haystack. */
64
+ export function resultTextOf(content: LessonToolResultContent): string {
65
+ const parts: string[] = [];
66
+ for (const block of content) {
67
+ if (block.type === "text") parts.push(block.text);
68
+ }
69
+ return parts.join("\n");
70
+ }
71
+
72
+ /**
73
+ * Add the hint as a text block of its own at the end. Not folded into the
74
+ * tool's last block: a later handler reading the result as the tool's output
75
+ * has to be able to tell the two apart, and a failed call with no text of its
76
+ * own would otherwise be described by the hint. By the time this runs the
77
+ * oversized-output recovery has already replaced a huge result with its
78
+ * preview (`index.ts` registers that first), so the end of the content is
79
+ * still the end of what the model reads. Returns a copy.
80
+ */
81
+ export function appendHintToContent(
82
+ content: LessonToolResultContent,
83
+ hint: string,
84
+ ): LessonToolResultContent {
85
+ appendedHints.add(hint);
86
+ return [...content, { type: "text", text: hint }];
87
+ }
88
+
89
+ /** A block Orbit itself appended -- not merely one that opens with the marker. */
90
+ export function isAppendedLessonHint(
91
+ block: { type: string; text?: string } | null | undefined,
92
+ ): boolean {
93
+ return isLessonHintBlock(block) && appendedHints.has(block!.text as string);
94
+ }
95
+
96
+ /** The content as the tool produced it: every hint Orbit appended removed. */
97
+ export function withoutAppendedLessonHints<T extends { type: string; text?: string }>(
98
+ content: readonly T[],
99
+ ): T[] {
100
+ return content.filter((block) => !isAppendedLessonHint(block));
101
+ }
102
+
103
+ export function resetAppendedLessonHints(): void {
104
+ appendedHints.clear();
105
+ }
@@ -0,0 +1,103 @@
1
+ /**
2
+ * Replaying a planted lesson proposal, for the model-free eval.
3
+ *
4
+ * What is worth pinning deterministically is that a hostile draft is REJECTED
5
+ * and recorded as such. Reaching that through a model is unreliable by
6
+ * construction: a model that understood the attack declines to propose at all,
7
+ * which is the better behaviour and leaves no row to assert on. So the eval
8
+ * plants the proposal and drives the real core.
9
+ *
10
+ * The same shape as submission-replay.ts, with its two constraints:
11
+ *
12
+ * - the file must resolve inside the session directory (its resolveReplayPath,
13
+ * symlinks included), so the env var alone cannot point the replay anywhere
14
+ * else on the machine;
15
+ * - every replay writes a `lesson.replay` row FIRST, so its outcome is never
16
+ * indistinguishable from a proposal a user made.
17
+ *
18
+ * It does NOT forge an approval. It arms a proposal and calls proposeLesson
19
+ * with the session's real ctx, so the approval step still runs and still
20
+ * refuses when there is nobody to ask. A seam that could write a lesson
21
+ * without a human would be a hole, not a fixture.
22
+ *
23
+ * It also keeps the session_start ctx past the handler's return, which pi
24
+ * asks extensions not to do: the approval dialog is left pending (see below)
25
+ * and its answer comes back through that ctx. If the session is replaced
26
+ * while the dialog is open (/new, a fork, a resume), pi's RPC mode still
27
+ * delivers the answer to the old dialog, so a Save can still write the lesson
28
+ * -- and its lesson.saved row lands in the new session's activity log with no
29
+ * lesson.replay row ahead of it. Only a ctx.ui call made after the replacement
30
+ * throws (the stale-ctx error), and the .catch swallows that. Tolerable only
31
+ * because this runs behind ORBIT_LESSON_PROPOSAL_REPLAY (or its LOOM_ alias)
32
+ * in evals, where nothing replaces the session; nothing user-facing should
33
+ * copy it.
34
+ */
35
+
36
+ import * as fs from "fs";
37
+ import { isLessonsEnabled } from "./enabled";
38
+ import * as path from "path";
39
+ import type { ExtensionAPI, ExtensionContext } from "@earendil-works/pi-coding-agent";
40
+ import { readEnv } from "../../../shared/orbit-env.js";
41
+ import { appendActivityEvent } from "../activity.js";
42
+ import { getNotebookPath } from "../state.js";
43
+ import { resolveReplayPath } from "../submission-replay.js";
44
+ import type { LessonProposalInput } from "./compose.js";
45
+ import { armLessonProposal, disarmLessonProposal, proposeLesson } from "./propose.js";
46
+
47
+ export function isLessonProposalReplayEnabled(): boolean {
48
+ return !!readEnv("LESSON_PROPOSAL_REPLAY")?.trim();
49
+ }
50
+
51
+ export function registerLessonProposalReplay(pi: ExtensionAPI): void {
52
+ pi.on("session_start", async (_event, ctx: ExtensionContext) => {
53
+ const configured = readEnv("LESSON_PROPOSAL_REPLAY")?.trim();
54
+ if (!configured) return;
55
+ // Same answer the live surface gives: nothing read, written or armed while off.
56
+ if (!isLessonsEnabled()) return;
57
+
58
+ const notebookPath = getNotebookPath();
59
+ if (!notebookPath) return;
60
+ const sessionDir = path.dirname(notebookPath);
61
+
62
+ const file = resolveReplayPath(sessionDir, configured);
63
+ if (!file || !fs.existsSync(file)) return;
64
+
65
+ appendActivityEvent(sessionDir, {
66
+ timestamp: new Date().toISOString(),
67
+ kind: "lesson.replay",
68
+ source: "lesson-propose-replay",
69
+ // Relative to the realpath'd directory, the way resolveReplayPath
70
+ // compared it: against the spelled path a macOS /var -> /private/var hop
71
+ // turns this into a ../-climb through the machine's directory names.
72
+ payload: { file: path.relative(fs.realpathSync(sessionDir), file) },
73
+ });
74
+
75
+ let proposal: LessonProposalInput;
76
+ try {
77
+ proposal = JSON.parse(fs.readFileSync(file, "utf-8")) as LessonProposalInput;
78
+ } catch {
79
+ return;
80
+ }
81
+
82
+ // Live straight away: there is no agent run here to start it, and the
83
+ // replay stands in for a proposal made inside one.
84
+ const arming = armLessonProposal("explicit", { live: true });
85
+ // Not awaited. pi's RPC mode emits session_start before it starts reading
86
+ // stdin, so holding this handler open on the approval dialog would wait
87
+ // for an answer that can never arrive -- and hang the whole session.
88
+ // Everything up to the dialog (validation, the activity rows) still runs
89
+ // synchronously here.
90
+ void proposeLesson(proposal, {
91
+ hasUI: ctx.hasUI,
92
+ ui: {
93
+ notify: (message, level) => ctx.ui.notify(message, level),
94
+ select: (title, options) => ctx.ui.select(title, options),
95
+ confirm: (title, message) => ctx.ui.confirm(title, message),
96
+ },
97
+ })
98
+ .catch(() => undefined)
99
+ // A rejected draft keeps its retry; the replay's arming must not outlive
100
+ // it -- but a /lesson typed while the dialog was open is not ours to clear.
101
+ .finally(() => disarmLessonProposal(arming));
102
+ });
103
+ }
@@ -0,0 +1,222 @@
1
+ /**
2
+ * `lesson_propose` -- the agent's only way to put a lesson on disk.
3
+ *
4
+ * A tool rather than a parse of the agent's next message:
5
+ *
6
+ * - pi validates arguments against this schema before execute runs, so a
7
+ * wrong-shaped proposal never reaches our code and the model gets an error
8
+ * it can act on. A fence parser would be a hand-written tokenizer attacked by
9
+ * exactly the content it extracts -- the body rules forbid code fences, so a
10
+ * hostile draft is the input that contains one.
11
+ * - structured fields are what let the brain build the document and own
12
+ * type/status/generated/verified by construction. A whole file from the
13
+ * model could only be allowlisted by re-parsing and re-emitting it, which is
14
+ * the scrubbing pass the threat model rules out.
15
+ * - the validator's errors come back as a tool result, so a rejection is
16
+ * correctable in the same turn.
17
+ * - execute gets a real ExtensionContext (ui + hasUI) in TUI, RPC and json mode.
18
+ *
19
+ * This schema is a convenience for the model, NOT the security boundary. Every
20
+ * cap here is re-enforced by validateLessonMarkdown on the composed bytes; a
21
+ * disagreement is a bug in this schema, never a reason to relax the validator.
22
+ *
23
+ * No promptSnippet: nothing about lessons goes in the cached system prompt.
24
+ */
25
+
26
+ import type { ExtensionAPI, ExtensionContext } from "@earendil-works/pi-coding-agent";
27
+ import { Text } from "@earendil-works/pi-tui";
28
+ import { Type } from "@sinclair/typebox";
29
+ import {
30
+ EVIDENCE_CAUSE,
31
+ EVIDENCE_OUTCOME,
32
+ EVIDENCE_SYMPTOM,
33
+ LESSON_KINDS,
34
+ LESSON_STAGES,
35
+ LIMITS,
36
+ PROPOSABLE_NAMESPACES,
37
+ } from "../../../shared/lesson-rules.js";
38
+ import type { LessonProposalInput } from "./compose.js";
39
+ import { proposeLesson, type ProposeUiContext } from "./propose.js";
40
+
41
+ export const LESSON_PROPOSE_TOOL_NAME = "lesson_propose";
42
+
43
+ const literals = (values: readonly string[]) => Type.Union(values.map((v) => Type.Literal(v)));
44
+
45
+ const stringList = (maxLength: number, description: string) =>
46
+ Type.Optional(
47
+ Type.Array(Type.String({ maxLength }), { maxItems: LIMITS.listItems, description }),
48
+ );
49
+
50
+ const PARAMETERS = Type.Object({
51
+ namespace: literals(PROPOSABLE_NAMESPACES),
52
+ slug: Type.String({
53
+ maxLength: LIMITS.slug,
54
+ description:
55
+ "Lowercase words joined by hyphens naming the SITUATION, not the fix, e.g. " +
56
+ "'na-coerced-to-zero-in-filters'.",
57
+ }),
58
+ title: Type.String({
59
+ maxLength: LIMITS.title,
60
+ description: "One line describing the situation, not the fix.",
61
+ }),
62
+ description: Type.String({
63
+ maxLength: LIMITS.description,
64
+ description: "One line, one sentence.",
65
+ }),
66
+ kind: literals(LESSON_KINDS),
67
+ stage: Type.Array(literals(LESSON_STAGES), {
68
+ minItems: 1,
69
+ maxItems: LESSON_STAGES.length,
70
+ description: "Which stage(s) of an analysis this bites in.",
71
+ }),
72
+ tags: stringList(LIMITS.tag, "Short keywords."),
73
+ stale_after: Type.String({
74
+ maxLength: 10,
75
+ description:
76
+ "YYYY-MM-DD after which this should be re-checked. Galaxy ships quarterly, so pick 6-12 " +
77
+ "months out, and sooner for anything from a forum answer.",
78
+ }),
79
+ cues: Type.String({
80
+ maxLength: LIMITS.cues,
81
+ description: "When this applies, in a sentence a person reads. One line.",
82
+ }),
83
+ applies_to: Type.Object({
84
+ versions: Type.String({
85
+ maxLength: LIMITS.appliesTo,
86
+ description: "Versions it holds for, or 'any'.",
87
+ }),
88
+ tested: Type.String({
89
+ maxLength: LIMITS.appliesTo,
90
+ description: "What it was actually seen against.",
91
+ }),
92
+ }),
93
+ evidence: Type.Object({
94
+ symptom: literals(EVIDENCE_SYMPTOM),
95
+ cause: literals(EVIDENCE_CAUSE),
96
+ outcome: literals(EVIDENCE_OUTCOME),
97
+ method: Type.String({
98
+ maxLength: LIMITS.method,
99
+ description: "How you know. 'hypothesized' and 'unvalidated' are fine answers.",
100
+ }),
101
+ }),
102
+ trigger: Type.Optional(
103
+ Type.Object({
104
+ signatures: stringList(
105
+ LIMITS.signature,
106
+ "The distinctive first line of the error, at least 8 characters, with URLs, paths, " +
107
+ "emails, long hex ids and 5+ digit numbers already replaced by <url>, <path>, <email>, " +
108
+ "<id>, <n>.",
109
+ ),
110
+ tools: stringList(LIMITS.tool, "Short Galaxy tool ids or families, e.g. 'deseq2'. No '/'."),
111
+ mcp_tools: stringList(LIMITS.mcpTool, "galaxy_* tool names."),
112
+ formats: stringList(LIMITS.format, "Lowercase Galaxy datatypes, e.g. 'tabular'."),
113
+ hosts: stringList(LIMITS.host, "Public hostnames seen in commands, e.g. 'ncbi.nlm.nih.gov'."),
114
+ extensions: stringList(LIMITS.extension, "File extensions seen in arguments, e.g. '.gtf'."),
115
+ step_keywords: stringList(
116
+ LIMITS.stepKeyword,
117
+ "Lowercase words matched against plan-step text.",
118
+ ),
119
+ }),
120
+ ),
121
+ sources: Type.Optional(
122
+ Type.Array(
123
+ Type.Object({
124
+ id: Type.String({ maxLength: LIMITS.sourceId }),
125
+ resource: Type.Optional(Type.String({ maxLength: LIMITS.sourceText })),
126
+ title: Type.Optional(Type.String({ maxLength: LIMITS.sourceText })),
127
+ }),
128
+ {
129
+ maxItems: LIMITS.listItems,
130
+ description:
131
+ "Required when this came from GTN or the forum, whose content is attribution-licensed. " +
132
+ "resource, if given, is an https link.",
133
+ },
134
+ ),
135
+ ),
136
+ sections: Type.Object(
137
+ {
138
+ symptom: Type.String({ maxLength: LIMITS.section }),
139
+ cause: Type.Optional(Type.String({ maxLength: LIMITS.section })),
140
+ check_first: Type.String({ maxLength: LIMITS.section }),
141
+ intervention: Type.String({ maxLength: LIMITS.section }),
142
+ validate: Type.String({ maxLength: LIMITS.section }),
143
+ not_when: Type.String({ maxLength: LIMITS.section }),
144
+ },
145
+ {
146
+ description:
147
+ "Prose only: no code fences, URLs, markdown links, headings or HTML. Up to 600 characters " +
148
+ "each. Omit `cause` if you do not actually know it.",
149
+ },
150
+ ),
151
+ });
152
+
153
+ const DESCRIPTION = `Propose ONE lesson drawn from what happened in this session, for the user to
154
+ approve. The user always sees the draft and decides; nothing is written without that.
155
+
156
+ Only call this when the user asked -- they typed /lesson, or Orbit told you they corrected you and
157
+ they then said yes to writing it down. Never call it on your own initiative: an unasked call is
158
+ refused and recorded.
159
+
160
+ A lesson is for what you only catch by knowing the science or the data: a silently wrong result,
161
+ a sanity range that makes a silent failure visible, a choice and when it flips, a data-source
162
+ quirk, or what it actually takes to reproduce a published analysis. If a validator, a schema or a
163
+ better error message could catch it, it belongs upstream instead -- say so and do not call this.
164
+
165
+ Nothing identifying goes in a lesson: no paths, URLs, hostnames of private servers, ids, emails or
166
+ copied data values. If the draft fails the schema you get the violations back and may fix them
167
+ and call once more.`;
168
+
169
+ function uiOf(ctx: ExtensionContext): ProposeUiContext {
170
+ return {
171
+ hasUI: ctx.hasUI,
172
+ ui: {
173
+ notify: (message, level) => ctx.ui.notify(message, level),
174
+ select: (title, options) => ctx.ui.select(title, options),
175
+ confirm: (title, message) => ctx.ui.confirm(title, message),
176
+ },
177
+ };
178
+ }
179
+
180
+ export function registerLessonProposeTool(pi: ExtensionAPI): void {
181
+ pi.registerTool({
182
+ name: LESSON_PROPOSE_TOOL_NAME,
183
+ label: "Propose a Lesson",
184
+ description: DESCRIPTION,
185
+ parameters: PARAMETERS,
186
+ async execute(_toolCallId, params, _signal, _onUpdate, ctx: ExtensionContext) {
187
+ // Never throw out of execute: the model always gets an answer it can act
188
+ // on, and a thrown error would carry a stack instead.
189
+ try {
190
+ const outcome = await proposeLesson(params as unknown as LessonProposalInput, uiOf(ctx));
191
+ if (outcome.ok) {
192
+ return {
193
+ content: [
194
+ {
195
+ type: "text" as const,
196
+ text:
197
+ `The user approved it. Lesson saved as ${outcome.id}. Tell them it is saved, ` +
198
+ `as a local draft that stays on this machine.`,
199
+ },
200
+ ],
201
+ details: { id: outcome.id, saved: true },
202
+ };
203
+ }
204
+ return {
205
+ content: [{ type: "text" as const, text: outcome.message }],
206
+ details: { error: true, reason: outcome.reason },
207
+ };
208
+ } catch {
209
+ return {
210
+ content: [{ type: "text" as const, text: "lesson_propose failed; nothing was saved." }],
211
+ details: { error: true, reason: "exception" },
212
+ };
213
+ }
214
+ },
215
+ renderResult: (result) => {
216
+ const details = result.details as
217
+ { saved?: boolean; id?: string; reason?: string } | undefined;
218
+ if (details?.saved) return new Text(`Lesson saved: ${details.id}`);
219
+ return new Text(`Lesson not saved (${details?.reason ?? "rejected"})`);
220
+ },
221
+ });
222
+ }