@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,89 @@
1
+ // pi drops providers between releases (1.1.0 removed ollama, #598), and a
2
+ // config saved under an older Orbit still names them. pi rejects an unknown
3
+ // --provider with a plain exit 1, which a shell reads as a crash and retries --
4
+ // so the brain checks first and exits EX_CONFIG with a message instead.
5
+
6
+ import { existsSync, readdirSync, readFileSync } from "node:fs";
7
+ import { join } from "node:path";
8
+
9
+ /**
10
+ * Provider names declared in pi's models.json. pi resolves --provider against
11
+ * these as well as its built-ins, so a legacy custom provider stays valid.
12
+ * @param {string} modelsPath
13
+ * @returns {string[]}
14
+ */
15
+ export function modelsJsonProviders(modelsPath) {
16
+ if (!existsSync(modelsPath)) return [];
17
+ try {
18
+ const parsed = JSON.parse(readFileSync(modelsPath, "utf-8"));
19
+ const providers = parsed?.providers;
20
+ return providers && typeof providers === "object" ? Object.keys(providers) : [];
21
+ } catch {
22
+ return [];
23
+ }
24
+ }
25
+
26
+ const nonEmptyDir = (dir) => {
27
+ try {
28
+ // Dotfiles (.DS_Store, .gitkeep) aren't extensions.
29
+ return readdirSync(dir).some((f) => !f.startsWith("."));
30
+ } catch {
31
+ return false;
32
+ }
33
+ };
34
+
35
+ const settingsLoadsCode = (path) => {
36
+ try {
37
+ const s = JSON.parse(readFileSync(path, "utf-8"));
38
+ return [s?.packages, s?.extensions].some((v) => Array.isArray(v) && v.length > 0);
39
+ } catch {
40
+ return false;
41
+ }
42
+ };
43
+
44
+ /**
45
+ * Could a pi extension register providers we can't see from here? pi loads
46
+ * extensions from these places after startup, and any of them can call
47
+ * registerProvider -- so with one present, an unrecognized name isn't proof.
48
+ * @param {string} agentDir
49
+ * @param {string} cwd
50
+ */
51
+ export function userExtensionsMayRegisterProviders(agentDir, cwd) {
52
+ const projectDir = join(cwd, ".pi");
53
+ return (
54
+ nonEmptyDir(join(agentDir, "extensions")) ||
55
+ nonEmptyDir(join(projectDir, "extensions")) ||
56
+ settingsLoadsCode(join(agentDir, "settings.json")) ||
57
+ settingsLoadsCode(join(projectDir, "settings.json"))
58
+ );
59
+ }
60
+
61
+ /**
62
+ * Would pi accept `provider` as --provider? Case-insensitive, as pi matches.
63
+ * @param {string} provider
64
+ * @param {Iterable<string>} builtIn pi-ai's getProviders()
65
+ * @param {Iterable<string>} [extra] names from models.json
66
+ */
67
+ export function isKnownProvider(provider, builtIn, extra = []) {
68
+ const wanted = provider.toLowerCase();
69
+ for (const name of [...builtIn, ...extra]) {
70
+ if (name.toLowerCase() === wanted) return true;
71
+ }
72
+ return false;
73
+ }
74
+
75
+ /**
76
+ * What the brain prints before exiting EX_CONFIG on an unknown provider.
77
+ * Mentions the custom-endpoint route because the provider that triggered this
78
+ * (ollama) is still reachable that way.
79
+ * @param {string} provider
80
+ */
81
+ export function unknownProviderMessage(provider) {
82
+ return `orbit: provider "${provider}" isn't supported by this version of Orbit, so the
83
+ agent can't start with it.
84
+
85
+ Open Preferences and pick another provider. If this was a local server
86
+ (Ollama, llama.cpp), set it up as an "OpenAI-compatible endpoint" with its
87
+ base URL instead (e.g. http://127.0.0.1:11434/v1).
88
+ `;
89
+ }
@@ -0,0 +1,7 @@
1
+ export const LESSON_HINT_MARKER: "[loom lesson]";
2
+ export function isLessonHintBlock(
3
+ block: { type: string; text?: string } | null | undefined,
4
+ ): boolean;
5
+ export function withoutLessonHints<T extends { type: string; text?: string }>(
6
+ content: readonly T[],
7
+ ): T[];
@@ -0,0 +1,32 @@
1
+ // The inline lesson hint rides a tool result as a content block of its own,
2
+ // opening with this marker. Every tool_result handler pi runs after the hint
3
+ // sees that block too, so a handler that reads the result as the tool's own
4
+ // output -- an error signature, a failure pattern -- has to leave it out, or a
5
+ // failed call with no text of its own would be described by Orbit's hint.
6
+ //
7
+ // The prefix test here is for a shell rendering a result it did not build.
8
+ // Inside the brain, consumers strip only the hints the process itself
9
+ // appended (extensions/orbit/lessons/pi-event-contract.ts), since a tool can
10
+ // open a block with the marker too and its text must still count as its own.
11
+
12
+ export const LESSON_HINT_MARKER = "[loom lesson]";
13
+
14
+ /** @param {{ type: string, text?: string } | null | undefined} block */
15
+ export function isLessonHintBlock(block) {
16
+ return (
17
+ !!block &&
18
+ block.type === "text" &&
19
+ typeof block.text === "string" &&
20
+ block.text.startsWith(LESSON_HINT_MARKER)
21
+ );
22
+ }
23
+
24
+ /**
25
+ * The content as the tool produced it: every lesson hint block removed.
26
+ * @template {{ type: string, text?: string }} T
27
+ * @param {readonly T[]} content
28
+ * @returns {T[]}
29
+ */
30
+ export function withoutLessonHints(content) {
31
+ return content.filter((block) => !isLessonHintBlock(block));
32
+ }
@@ -0,0 +1,150 @@
1
+ export type LessonNamespace = "stats" | "reproduction" | "data" | "galaxy-tools" | "galaxy-api";
2
+ export type ProposableNamespace = "stats" | "reproduction" | "data" | "galaxy-tools";
3
+ export type LessonKind = "pitfall" | "expectation" | "choice" | "source-quirk" | "reproduction";
4
+ export type LessonStage =
5
+ | "data-acquisition"
6
+ | "metadata-reconciliation"
7
+ | "tool-parameterization"
8
+ | "job-execution"
9
+ | "result-interpretation";
10
+ export type LessonStatus = "draft" | "stable" | "deprecated";
11
+ export type LessonSectionKey =
12
+ "symptom" | "cause" | "check_first" | "intervention" | "validate" | "not_when";
13
+
14
+ export declare const NAMESPACES: readonly LessonNamespace[];
15
+ export declare const STATUSES: readonly LessonStatus[];
16
+ export declare const KINDS: readonly LessonKind[];
17
+ export declare const STAGES: readonly LessonStage[];
18
+ export declare const EVIDENCE: {
19
+ readonly symptom: readonly string[];
20
+ readonly cause: readonly string[];
21
+ readonly outcome: readonly string[];
22
+ };
23
+ export declare const REQUIRED_KEYS: readonly string[];
24
+ export declare const OPTIONAL_KEYS: readonly string[];
25
+ export declare const TRIGGER_KEYS: readonly string[];
26
+ /** Body sections in order; `heading` includes the leading `## `. */
27
+ export declare const SECTIONS: readonly {
28
+ heading: string;
29
+ key: LessonSectionKey;
30
+ required: boolean;
31
+ }[];
32
+ export declare const LIMITS: {
33
+ readonly slug: number;
34
+ readonly title: number;
35
+ readonly description: number;
36
+ readonly tag: number;
37
+ readonly cues: number;
38
+ readonly signature: number;
39
+ readonly tool: number;
40
+ readonly mcpTool: number;
41
+ readonly format: number;
42
+ readonly host: number;
43
+ readonly extension: number;
44
+ readonly stepKeyword: number;
45
+ readonly appliesTo: number;
46
+ readonly method: number;
47
+ readonly sourceId: number;
48
+ readonly sourceText: number;
49
+ readonly freeText: number;
50
+ readonly section: number;
51
+ readonly listItems: number;
52
+ readonly minSignature: number;
53
+ readonly fileBytes: number;
54
+ };
55
+ export declare const UNKNOWN_SIGNATURE: string;
56
+
57
+ export declare const LESSON_NAMESPACES: readonly LessonNamespace[];
58
+ export declare const PROPOSABLE_NAMESPACES: readonly ProposableNamespace[];
59
+ export declare const LESSON_KINDS: readonly LessonKind[];
60
+ export declare const LESSON_STAGES: readonly LessonStage[];
61
+ export declare const LESSON_STATUSES: readonly LessonStatus[];
62
+ export declare const EVIDENCE_SYMPTOM: readonly string[];
63
+ export declare const EVIDENCE_CAUSE: readonly string[];
64
+ export declare const EVIDENCE_OUTCOME: readonly string[];
65
+ /** Body sections in order; `heading` is the bare text, e.g. "Check first". */
66
+ export declare const BODY_SECTIONS: readonly {
67
+ heading: string;
68
+ key: LessonSectionKey;
69
+ required: boolean;
70
+ }[];
71
+ export declare const FRONTMATTER_KEYS: readonly string[];
72
+ export declare const REQUIRED_FRONTMATTER_KEYS: readonly string[];
73
+
74
+ export declare const MAX_FILE_BYTES: number;
75
+ export declare const MAX_TITLE: number;
76
+ export declare const MAX_DESCRIPTION: number;
77
+ export declare const MAX_SECTION: number;
78
+ export declare const MAX_CUES: number;
79
+ export declare const MAX_METHOD: number;
80
+ export declare const MAX_SIGNATURE: number;
81
+ export declare const MIN_SIGNATURE: number;
82
+ export declare const MAX_TRIGGER_ITEM: number;
83
+ export declare const MAX_TRIGGER_ITEMS: number;
84
+ export declare const MAX_TAG: number;
85
+ export declare const MAX_TAGS: number;
86
+ export declare const MAX_SOURCES: number;
87
+ export declare const MAX_VERIFIED: number;
88
+ export declare const MAX_GENERIC_STRING: number;
89
+ export declare const MAX_SLUG: number;
90
+
91
+ export type LessonSections = Partial<Record<LessonSectionKey, string>>;
92
+
93
+ export interface ParsedLesson {
94
+ frontmatter: Record<string, unknown> | null;
95
+ sections: LessonSections;
96
+ /** 1-based source line for each top-level frontmatter key and each section key. */
97
+ lines: Record<string, number>;
98
+ /** Structural failures that stopped the parse; empty when it parsed. */
99
+ errors: string[];
100
+ }
101
+
102
+ export declare function parseLesson(text: string): ParsedLesson;
103
+ export declare function isValidLessonNamespace(value: unknown): boolean;
104
+ export declare function isValidLessonSlug(value: unknown): boolean;
105
+ export declare function lessonIdFromPath(relPath: string): string | null;
106
+
107
+ export type LessonValidation = { ok: true } | { ok: false; errors: string[] };
108
+ /** Errors are `"<line>: <message>"`. */
109
+ export declare function validateLessonMarkdown(
110
+ text: string,
111
+ opts?: { namespace?: string },
112
+ ): LessonValidation;
113
+ /** Corpus form: `relPath` is `<namespace>/<slug>.md`; lines are `path:line: message`. */
114
+ export declare function validateLessonFile(relPath: string, raw: string): string[];
115
+
116
+ export declare function normalizeSignature(text: unknown): string;
117
+ /**
118
+ * The corpus validator's own checks, imported from lessons/validate.mjs. Each
119
+ * returns `"<where> contains <what>"` messages (or `"<where> is too long to
120
+ * check"`); an empty list means the text passed.
121
+ */
122
+ export declare function markupProblems(text: string, where: string): string[];
123
+ export declare function identifyingProblems(text: string, where: string): string[];
124
+ /** For a field that may hold a link: one canonical https URL to a LINK_HOSTS host. */
125
+ export declare function linkProblems(link: string, where: string): string[];
126
+ export declare const LINK_HOSTS: readonly string[];
127
+ export declare function loadFrontmatter(fmText: string): {
128
+ value: unknown;
129
+ problems: string[];
130
+ };
131
+ export declare function isIsoDate(value: unknown): boolean;
132
+ export declare function splitFrontmatter(text: string): {
133
+ fmText: string;
134
+ fmLines: string[];
135
+ fmFirstLine: number;
136
+ body: string;
137
+ bodyFirstLine: number;
138
+ } | null;
139
+ export declare function parseSections(
140
+ body: string,
141
+ bodyFirstLine?: number,
142
+ ): {
143
+ found: {
144
+ spec: { heading: string; key: LessonSectionKey; required: boolean };
145
+ index: number;
146
+ line: number;
147
+ }[];
148
+ unexpected: { text: string; line: number }[];
149
+ sections: Partial<Record<LessonSectionKey, { text: string; line: number }>>;
150
+ };
@@ -0,0 +1,203 @@
1
+ /**
2
+ * The brain's view of the C3 lesson schema. The rules themselves live in
3
+ * `lessons/validate.mjs`; this module imports them and adds only what the
4
+ * proposal flow needs on top: a parser that never throws, validation of bytes
5
+ * that have no path yet, and the id/namespace helpers.
6
+ *
7
+ * Nothing here re-implements a check. The schema is a security boundary -- a
8
+ * proposal's draft is assembled from session content that may include hostile
9
+ * tool output -- and a second copy of a markup or identifying-data rule is a
10
+ * copy that falls behind the first time the corpus validator is tightened.
11
+ *
12
+ * Dual-file (.js runtime + hand-written .d.ts) like shared/feedback-contract.js.
13
+ * UNLIKE that file this one pulls in `node:fs`, `yaml` and `marked` through
14
+ * the validator, so it is Node/brain side only: never import it from
15
+ * app/src/renderer.
16
+ */
17
+
18
+ import {
19
+ EVIDENCE,
20
+ KINDS,
21
+ LIMITS,
22
+ NAMESPACES,
23
+ OPTIONAL_KEYS,
24
+ REQUIRED_KEYS,
25
+ SECTIONS,
26
+ STAGES,
27
+ STATUSES,
28
+ loadFrontmatter,
29
+ parseSections,
30
+ splitFrontmatter,
31
+ validateLessonFile,
32
+ } from "../lessons/validate.mjs";
33
+
34
+ export {
35
+ EVIDENCE,
36
+ KINDS,
37
+ LIMITS,
38
+ LINK_HOSTS,
39
+ NAMESPACES,
40
+ OPTIONAL_KEYS,
41
+ REQUIRED_KEYS,
42
+ SECTIONS,
43
+ STAGES,
44
+ STATUSES,
45
+ TRIGGER_KEYS,
46
+ UNKNOWN_SIGNATURE,
47
+ identifyingProblems,
48
+ isIsoDate,
49
+ linkProblems,
50
+ loadFrontmatter,
51
+ markupProblems,
52
+ normalizeSignature,
53
+ parseSections,
54
+ splitFrontmatter,
55
+ validateLessonFile,
56
+ } from "../lessons/validate.mjs";
57
+
58
+ /**
59
+ * Parse a lesson into its frontmatter and body sections. Never throws: a
60
+ * structural failure (no frontmatter, YAML the strict loader refuses, a
61
+ * frontmatter that is not a mapping, a file over the byte cap) comes back as
62
+ * `frontmatter: null` with `"<line>: <message>"` entries in `errors`.
63
+ *
64
+ * This is a parser, not the validator. A lesson that parses can still break
65
+ * every content rule; callers that act on a lesson run validateLessonMarkdown
66
+ * (or validateLessonFile) first.
67
+ */
68
+ export function parseLesson(raw) {
69
+ const empty = { frontmatter: null, sections: {}, lines: {}, errors: [] };
70
+ if (typeof raw !== "string") return { ...empty, errors: ["1: lesson is not text"] };
71
+ // Before the YAML parse, so a planted huge file costs one byte count.
72
+ if (Buffer.byteLength(raw, "utf8") > LIMITS.fileBytes) {
73
+ return { ...empty, errors: [`1: file is over ${LIMITS.fileBytes} bytes`] };
74
+ }
75
+ const text = raw.replace(/\r\n/g, "\n");
76
+ const split = splitFrontmatter(text);
77
+ if (!split) return { ...empty, errors: ["1: missing YAML frontmatter"] };
78
+ let loaded;
79
+ try {
80
+ loaded = loadFrontmatter(split.fmText);
81
+ } catch (err) {
82
+ const message = err instanceof Error ? err.message.split("\n")[0] : String(err);
83
+ return {
84
+ ...empty,
85
+ errors: [`${split.fmFirstLine}: frontmatter is not valid YAML: ${message}`],
86
+ };
87
+ }
88
+ if (loaded.problems.length > 0) {
89
+ return { ...empty, errors: loaded.problems.map((p) => `${split.fmFirstLine}: ${p}`) };
90
+ }
91
+ const frontmatter = loaded.value;
92
+ if (frontmatter === null || typeof frontmatter !== "object" || Array.isArray(frontmatter)) {
93
+ return { ...empty, errors: [`${split.fmFirstLine}: frontmatter must be a YAML mapping`] };
94
+ }
95
+
96
+ const lines = {};
97
+ for (const key of Object.keys(frontmatter)) {
98
+ const i = split.fmLines.findIndex((line) => line.startsWith(`${key}:`));
99
+ lines[key] = i === -1 ? split.fmFirstLine : split.fmFirstLine + i;
100
+ }
101
+ const { sections: found } = parseSections(split.body, split.bodyFirstLine);
102
+ const sections = {};
103
+ for (const spec of SECTIONS) {
104
+ if (found[spec.key] === undefined) continue;
105
+ sections[spec.key] = found[spec.key].text;
106
+ lines[spec.key] = found[spec.key].line;
107
+ }
108
+ return { frontmatter, sections, lines, errors: [] };
109
+ }
110
+
111
+ // A proposal has no path until it is saved, and the corpus validator only
112
+ // judges a path-bearing file. The stand-in is a valid slug under the lesson's
113
+ // namespace when the caller knows it, so the path checks pass and every
114
+ // content rule runs unchanged, the galaxy-api graduation rule included. With
115
+ // no namespace the stand-in is a proposable one; a proposal can never land in
116
+ // galaxy-api, and its caller checks the real namespace and slug itself.
117
+ const STAND_IN_SLUG = "proposal";
118
+ const DEFAULT_NAMESPACE = "stats";
119
+
120
+ /**
121
+ * Validate a lesson's bytes with no path attached -- a proposal before it has
122
+ * been written anywhere, or a local lesson whose file name is not part of the
123
+ * verdict. Pass the namespace whenever it is known, so the namespace's own
124
+ * rules apply. Errors are `"<line>: <message>"`. Run it on exactly
125
+ * the bytes that will be shown and saved: a check on anything upstream of
126
+ * those (the structured input, a sanitised copy) checks the wrong thing.
127
+ */
128
+ export function validateLessonMarkdown(text, { namespace = DEFAULT_NAMESPACE } = {}) {
129
+ if (typeof text !== "string") return { ok: false, errors: ["1: lesson is not text"] };
130
+ // An unknown namespace goes through as is: the corpus form refuses it.
131
+ const standIn = `${String(namespace)}/${STAND_IN_SLUG}.md`;
132
+ const prefix = `${standIn}:`;
133
+ const errors = validateLessonFile(standIn, text).map((v) =>
134
+ v.startsWith(prefix) ? v.slice(prefix.length) : v,
135
+ );
136
+ return errors.length === 0 ? { ok: true } : { ok: false, errors };
137
+ }
138
+
139
+ // The names the brain side uses. Aliases of the validator's tables rather
140
+ // than second copies, so a bound changes in exactly one place.
141
+ export const LESSON_NAMESPACES = NAMESPACES;
142
+ /**
143
+ * `galaxy-api` holds lessons that graduated upstream and are kept unsurfaced,
144
+ * so a new proposal can never land there -- it would be hidden on arrival.
145
+ */
146
+ export const PROPOSABLE_NAMESPACES = NAMESPACES.filter((ns) => ns !== "galaxy-api");
147
+ export const LESSON_KINDS = KINDS;
148
+ export const LESSON_STAGES = STAGES;
149
+ export const LESSON_STATUSES = STATUSES;
150
+ export const EVIDENCE_SYMPTOM = EVIDENCE.symptom;
151
+ export const EVIDENCE_CAUSE = EVIDENCE.cause;
152
+ export const EVIDENCE_OUTCOME = EVIDENCE.outcome;
153
+ /** SECTIONS with the bare heading text, for code that writes a body. */
154
+ export const BODY_SECTIONS = SECTIONS.map((s) => ({
155
+ heading: s.heading.replace(/^## /, ""),
156
+ key: s.key,
157
+ required: s.required,
158
+ }));
159
+ export const FRONTMATTER_KEYS = [...REQUIRED_KEYS, ...OPTIONAL_KEYS];
160
+ export const REQUIRED_FRONTMATTER_KEYS = REQUIRED_KEYS;
161
+
162
+ export const MAX_FILE_BYTES = LIMITS.fileBytes;
163
+ export const MAX_TITLE = LIMITS.title;
164
+ export const MAX_DESCRIPTION = LIMITS.description;
165
+ export const MAX_SECTION = LIMITS.section;
166
+ export const MAX_CUES = LIMITS.cues;
167
+ export const MAX_METHOD = LIMITS.method;
168
+ export const MAX_SIGNATURE = LIMITS.signature;
169
+ export const MIN_SIGNATURE = LIMITS.minSignature;
170
+ export const MAX_TRIGGER_ITEM = LIMITS.tool;
171
+ export const MAX_TRIGGER_ITEMS = LIMITS.listItems;
172
+ export const MAX_TAG = LIMITS.tag;
173
+ export const MAX_TAGS = LIMITS.listItems;
174
+ export const MAX_SOURCES = LIMITS.listItems;
175
+ export const MAX_VERIFIED = LIMITS.listItems;
176
+ export const MAX_GENERIC_STRING = LIMITS.freeText;
177
+ export const MAX_SLUG = LIMITS.slug;
178
+
179
+ const SLUG_RE = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;
180
+
181
+ export function isValidLessonNamespace(value) {
182
+ return typeof value === "string" && NAMESPACES.includes(value);
183
+ }
184
+
185
+ export function isValidLessonSlug(value) {
186
+ return typeof value === "string" && value.length <= LIMITS.slug && SLUG_RE.test(value);
187
+ }
188
+
189
+ /**
190
+ * `stats/na-coerced-to-zero-in-filters.md` -> `stats/na-coerced-to-zero-in-filters`.
191
+ * Null for anything that is not exactly `<namespace>/<slug>.md`: a deeper path,
192
+ * a `..` segment, an unknown namespace, a non-slug basename. Windows separators
193
+ * are accepted so a win32 `path.relative` resolves the same.
194
+ */
195
+ export function lessonIdFromPath(relPath) {
196
+ if (typeof relPath !== "string") return null;
197
+ const parts = relPath.split(/[\\/]/);
198
+ if (parts.length !== 2) return null;
199
+ const [namespace, file] = parts;
200
+ if (!isValidLessonNamespace(namespace) || !file.endsWith(".md")) return null;
201
+ const slug = file.slice(0, -3);
202
+ return isValidLessonSlug(slug) ? `${namespace}/${slug}` : null;
203
+ }
@@ -0,0 +1 @@
1
+ export function malformedObjectIds(content: string | null | undefined): string[];
@@ -0,0 +1,37 @@
1
+ // Galaxy directive arguments that name an object by something other than its encoded id. Galaxy
2
+ // resolves a directive's id when the page renders, so `history_dataset_id=3` (a hid) or
3
+ // `history_id=my-history` is saved without complaint and then embeds nothing. Catching it before
4
+ // the write is the only point where the model can still be told. Kept in step with the browser's
5
+ // galaxy-ops fork by browser/core/src/agent/parity.test.ts, so both shells refuse the same pages.
6
+
7
+ const ID_ARGUMENTS = [
8
+ "history_id",
9
+ "workflow_id",
10
+ "history_dataset_id",
11
+ "history_dataset_collection_id",
12
+ "job_id",
13
+ "implicit_collection_jobs_id",
14
+ "invocation_id",
15
+ ];
16
+ const ID_ARGUMENT = new RegExp(`\\b(${ID_ARGUMENTS.join("|")})\\s*=\\s*["']?([^\\s,)"']+)`, "g");
17
+ // Galaxy encodes an id as one or more 16-hex-digit blocks, lowercase.
18
+ const ENCODED_ID = /^(?:[0-9a-f]{16})+$/;
19
+ // A ```galaxy fenced block, or an inline ${galaxy ...} directive.
20
+ const DIRECTIVES = /^```[ \t]*galaxy[^\n]*\n[\s\S]*?^```|\$\{galaxy\s[^}]*\}/gm;
21
+
22
+ /**
23
+ * Each id argument inside a Galaxy directive whose value is not an encoded id, as `name=value`,
24
+ * in page order. Text outside directives is never read: prose may mention a hid freely.
25
+ * @param {string | null | undefined} content
26
+ * @returns {string[]}
27
+ */
28
+ export function malformedObjectIds(content) {
29
+ /** @type {string[]} */
30
+ const found = [];
31
+ for (const directive of (content ?? "").match(DIRECTIVES) ?? []) {
32
+ for (const [, name, value] of directive.matchAll(ID_ARGUMENT)) {
33
+ if (!ENCODED_ID.test(value)) found.push(`${name}=${value}`);
34
+ }
35
+ }
36
+ return found;
37
+ }
@@ -0,0 +1,10 @@
1
+ export function repeatedHeadingRefusal(
2
+ content: string | null | undefined,
3
+ heading: string,
4
+ ): string | undefined;
5
+ export function applySectionEdit(
6
+ original: string | null | undefined,
7
+ heading: string,
8
+ section: string,
9
+ ): string;
10
+ export function sectionsHeaded(content: string | null | undefined, heading: string): string[];
@@ -0,0 +1,118 @@
1
+ // A markdown page cut at its heading lines, the way a section edit to a Galaxy page addresses it.
2
+ // Orbit's update_page bridge, its stale-hash repair and the evidence gate all cut a page here, so
3
+ // a section edit writes, compares and is judged on the same bytes. A section holds its
4
+ // subsections, and a "# comment" in fenced code is not a heading: otherwise section_content that
5
+ // carries its own "### Steps" would leave the old one behind, and a fenced shell comment would
6
+ // cut a section mid-fence. section_content with no subsection headings of its own rewrites only
7
+ // the section's lead, the text above its first subsection, so an intro edit under a page's "#"
8
+ // title cannot wipe every plan beneath it. The browser's galaxy-ops fork still cuts flat at
9
+ // every heading, so the browser's update_page hands it a whole-page write of this cut instead;
10
+ // browser/core/src/agent/parity.test.ts pins where the two differ until the fork is deleted.
11
+
12
+ const HEADING = /^(#{1,6})\s/;
13
+ // A backtick fence's info string holds no backtick (CommonMark), so "```x``` is code" is prose.
14
+ const FENCE = /^ {0,3}(`{3,}(?=[^`]*$)|~{3,})/;
15
+ const FENCE_CLOSE = /^ {0,3}(`{3,}|~{3,})\s*$/;
16
+
17
+ /**
18
+ * Every heading outside fenced code, with the line span its section covers: from the heading to
19
+ * the line before the next heading of the same or a higher level.
20
+ * @param {string[]} lines
21
+ * @returns {{ heading: string, level: number, start: number, end: number }[]}
22
+ */
23
+ function headingSpans(lines) {
24
+ /** @type {{ heading: string, level: number, start: number, end: number }[]} */
25
+ const spans = [];
26
+ /** @type {string | null} */
27
+ let fence = null;
28
+ lines.forEach((line, i) => {
29
+ if (fence !== null) {
30
+ const close = FENCE_CLOSE.exec(line)?.[1];
31
+ if (close && close[0] === fence[0] && close.length >= fence.length) fence = null;
32
+ return;
33
+ }
34
+ const marker = FENCE.exec(line)?.[1];
35
+ if (marker) {
36
+ fence = marker;
37
+ return;
38
+ }
39
+ const level = HEADING.exec(line)?.[1].length;
40
+ if (level === undefined) return;
41
+ for (const open of spans) {
42
+ if (open.end === lines.length - 1 && open.start < i && open.level >= level) open.end = i - 1;
43
+ }
44
+ spans.push({ heading: line, level, start: i, end: lines.length - 1 });
45
+ });
46
+ return spans;
47
+ }
48
+
49
+ /**
50
+ * Why a section edit under `heading` cannot go ahead on `content`, or undefined when the page
51
+ * holds that heading at most once. Replacing every match would overwrite one plan's "### Steps"
52
+ * with another's, so a repeated heading is refused and the model is pointed at the unique heading
53
+ * above it.
54
+ * @param {string | null | undefined} content
55
+ * @param {string} heading
56
+ * @returns {string | undefined}
57
+ */
58
+ export function repeatedHeadingRefusal(content, heading) {
59
+ const spans = headingSpans((content ?? "").split("\n"));
60
+ const matches = spans.filter((s) => s.heading === heading);
61
+ if (matches.length < 2) return undefined;
62
+ const parents = matches
63
+ .map((m) => spans.filter((s) => s.start < m.start && s.end >= m.end && s.level < m.level).pop())
64
+ .map((p) => (p ? JSON.stringify(p.heading) : null));
65
+ const unique = parents.every((p, i) => p !== null && parents.indexOf(p) === i);
66
+ return (
67
+ `The page has ${matches.length} sections headed ${JSON.stringify(heading)}, so a section ` +
68
+ `edit cannot tell which one you mean. ` +
69
+ (unique
70
+ ? `Send section_heading as the heading of the section that holds it (one of ${parents.join(", ")}) `
71
+ : `Send section_heading as a heading the page holds once, above the one you mean, `) +
72
+ `and section_content as that whole section, its subsections included.`
73
+ );
74
+ }
75
+
76
+ /**
77
+ * `original` with the section headed exactly `heading` replaced by `section`, subsections and
78
+ * all, or with `section` appended when the page has no such heading. A `section` that carries no
79
+ * heading below its first line replaces only the lead and keeps the old subsections. Throws when the heading is
80
+ * repeated (see repeatedHeadingRefusal); callers refuse before getting here.
81
+ * @param {string | null | undefined} original
82
+ * @param {string} heading
83
+ * @param {string} section
84
+ * @returns {string}
85
+ */
86
+ export function applySectionEdit(original, heading, section) {
87
+ const refused = repeatedHeadingRefusal(original, heading);
88
+ if (refused) throw new Error(refused);
89
+ if (!original) return section;
90
+ const lines = original.split("\n");
91
+ const spans = headingSpans(lines);
92
+ const span = spans.find((s) => s.heading === heading);
93
+ if (!span) return `${original}\n${section}`;
94
+ const child = spans.find((s) => s.start > span.start && s.start <= span.end);
95
+ const leadOnly =
96
+ child !== undefined && !headingSpans(section.split("\n")).some((s) => s.start > 0);
97
+ const end = leadOnly ? child.start - 1 : span.end;
98
+ return [
99
+ ...(span.start > 0 ? [lines.slice(0, span.start).join("\n")] : []),
100
+ section,
101
+ ...(end < lines.length - 1 ? [lines.slice(end + 1).join("\n")] : []),
102
+ ].join("\n");
103
+ }
104
+
105
+ /**
106
+ * The content of each section headed exactly `heading`, subsections included, in page order:
107
+ * what a section edit would replace.
108
+ * @param {string | null | undefined} content
109
+ * @param {string} heading
110
+ * @returns {string[]}
111
+ */
112
+ export function sectionsHeaded(content, heading) {
113
+ if (!content) return [];
114
+ const lines = content.split("\n");
115
+ return headingSpans(lines)
116
+ .filter((s) => s.heading === heading)
117
+ .map((s) => lines.slice(s.start, s.end + 1).join("\n"));
118
+ }
@@ -0,0 +1,12 @@
1
+ // Types for the notebook fence names. Impl is shared/notebook-fences.js.
2
+ export type NotebookFenceKind =
3
+ "session" | "invocation" | "job" | "galaxy-page" | "udt" | "proposal";
4
+ export const NOTEBOOK_FENCE_WRITE_PREFIX: "orbit";
5
+ export const NOTEBOOK_FENCE_READ_PREFIXES: readonly string[];
6
+ export function notebookFenceOpen(kind: NotebookFenceKind): string;
7
+ export function isNotebookFenceOpen(line: string, kind: NotebookFenceKind): boolean;
8
+ export function replaceNotebookBlocks(
9
+ content: string,
10
+ ranges: ReadonlyArray<{ start: number; end: number }>,
11
+ newBlock: string[],
12
+ ): string;