@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,93 @@
1
+ /**
2
+ * Unicode-confusables fold for tool-name lookups. STOPGAP -- see #100.
3
+ *
4
+ * Some open-weights LLMs (gpt-oss, smaller frontier models) sample
5
+ * Cyrillic/Greek lookalikes for Latin letters when generating identifiers
6
+ * -- most often `с` (U+0441) where Latin `c` belongs. pi-agent-core's
7
+ * tool dispatch does an exact-string match (prepareToolCall in
8
+ * node_modules/@earendil-works/pi-agent-core/dist/agent-loop.js), so one
9
+ * Cyrillic char in `brс_analytics_*` is enough to surface "Tool not
10
+ * found" to the agent.
11
+ *
12
+ * Why this is a stopgap and not a proper fix: the right place to
13
+ * normalize is at the lookup layer in pi-agent-core. Upstream's stance on input normalization is in
14
+ * earendil-works/pi#638 (case-mismatch case): "this is not something pi
15
+ * will 'normalize', and the suggested fix is just plain wrong." So
16
+ * landing this upstream is unlikely. Meanwhile we can't intercept
17
+ * before pi-agent-core's find() from inside Orbit either -- the
18
+ * message_end extension event is queued async by agent-session.js and
19
+ * races the synchronous tool dispatch.
20
+ *
21
+ * What this does: hook the tool-result message_end (which fires AFTER
22
+ * the not-found failure), fold confusables, and append a "Did you mean
23
+ * X?" hint to the error. The agent recovers in one turn instead of
24
+ * two or three. Drop this when upstream lookup becomes fold-aware or
25
+ * when models stop sampling lookalikes -- whichever comes first.
26
+ */
27
+ /** @type {Record<string, string>} */
28
+ const CONFUSABLES = {
29
+ // Cyrillic lowercase that look like Latin
30
+ а: "a",
31
+ е: "e",
32
+ о: "o",
33
+ р: "p",
34
+ с: "c",
35
+ х: "x",
36
+ у: "y",
37
+ // Cyrillic uppercase
38
+ А: "A",
39
+ Е: "E",
40
+ О: "O",
41
+ Р: "P",
42
+ С: "C",
43
+ Х: "X",
44
+ У: "Y",
45
+ // Greek lowercase
46
+ ν: "v",
47
+ τ: "t",
48
+ };
49
+
50
+ /** @param {string} s @returns {string} */
51
+ export function foldConfusables(s) {
52
+ let changed = false;
53
+ let out = "";
54
+ for (const ch of s) {
55
+ const mapped = CONFUSABLES[ch];
56
+ if (mapped !== undefined) {
57
+ out += mapped;
58
+ changed = true;
59
+ } else {
60
+ out += ch;
61
+ }
62
+ }
63
+ return changed ? out : s;
64
+ }
65
+
66
+ /** @param {string} s @returns {boolean} */
67
+ export function hasConfusables(s) {
68
+ for (const ch of s) {
69
+ if (CONFUSABLES[ch] !== undefined) return true;
70
+ }
71
+ return false;
72
+ }
73
+
74
+ /**
75
+ * Look up a folded match for `badName` against `candidateNames`. Returns
76
+ * the canonical name iff `badName` actually contains a confusable AND its
77
+ * folded form equals one of the candidates' folded forms. Returns
78
+ * undefined when there's nothing to suggest -- including the case where
79
+ * `badName` is already pure ASCII and doesn't match anything (a real
80
+ * hallucination, not a confusables issue).
81
+ *
82
+ * @param {string} badName
83
+ * @param {string[]} candidateNames
84
+ * @returns {string | undefined}
85
+ */
86
+ export function findConfusablesMatch(badName, candidateNames) {
87
+ if (!hasConfusables(badName)) return undefined;
88
+ const folded = foldConfusables(badName);
89
+ for (const name of candidateNames) {
90
+ if (foldConfusables(name) === folded) return name;
91
+ }
92
+ return undefined;
93
+ }
@@ -0,0 +1,45 @@
1
+ import type { LlmProviderConfig } from "./orbit-config.js";
2
+
3
+ export interface CustomModelDef {
4
+ id: string;
5
+ name: string;
6
+ reasoning: boolean;
7
+ input: ("text" | "image")[];
8
+ contextWindow: number;
9
+ maxTokens: number;
10
+ cost: { input: number; output: number; cacheRead: number; cacheWrite: number };
11
+ }
12
+
13
+ export interface ModelsConfig {
14
+ providers?: Record<
15
+ string,
16
+ { name?: string; baseUrl?: string; api?: string; apiKey?: string; models?: unknown[] }
17
+ >;
18
+ }
19
+
20
+ export type EndpointApi = "openai-completions" | "anthropic-messages";
21
+
22
+ export const ENDPOINT_APIS: readonly EndpointApi[];
23
+ export const DEFAULT_ENDPOINT_API: EndpointApi;
24
+ /** Throws on any value outside ENDPOINT_APIS; empty/absent resolves to the default. */
25
+ export function normalizeEndpointApi(value: string | undefined | null): EndpointApi;
26
+
27
+ export const ACTIVE_LLM_API_KEY_ENV: "LOOM_ACTIVE_LLM_API_KEY";
28
+ export function isCustomProvider(entry: LlmProviderConfig | undefined): boolean;
29
+ export const NO_AUTH_API_KEY: "no-key";
30
+ export function isKeylessCustomProvider(entry: LlmProviderConfig | undefined | null): boolean;
31
+ export function synthesizeModelDef(entry: LlmProviderConfig): CustomModelDef;
32
+ export function mergeCustomProviderIntoModelsConfig(
33
+ modelsConfig: ModelsConfig,
34
+ providerName: string,
35
+ entry: LlmProviderConfig,
36
+ ): ModelsConfig;
37
+ export function syncCustomProviderModelsFile(
38
+ modelsJsonPath: string,
39
+ providerName: string,
40
+ entry: LlmProviderConfig,
41
+ ): ModelsConfig;
42
+ export function resolveActiveLlmApiKey(
43
+ entry: LlmProviderConfig | undefined,
44
+ env: NodeJS.ProcessEnv | Record<string, string | undefined>,
45
+ ): string | undefined;
@@ -0,0 +1,169 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { readEnv } from "./orbit-env.js";
4
+
5
+ /**
6
+ * A provider entry is "custom" (a user-supplied endpoint) when it carries a
7
+ * non-empty baseUrl. That single field is the discriminator everywhere.
8
+ */
9
+ export function isCustomProvider(entry) {
10
+ return Boolean(entry && entry.baseUrl);
11
+ }
12
+
13
+ /**
14
+ * Wire formats a custom endpoint can speak. Both are pi APIs that need nothing
15
+ * beyond a base URL and an API key, which is the whole contract a custom
16
+ * provider entry can express -- pi knows others (bedrock, vertex, azure) but
17
+ * those need credentials and deployment identifiers this shape has nowhere to
18
+ * put, so offering them would promise something that cannot work.
19
+ *
20
+ * The two disagree about what a base URL includes, because their SDKs do:
21
+ * the OpenAI client appends `/chat/completions` to whatever it is given, so the
22
+ * version segment belongs in the URL (`https://host/v1`), while the Anthropic
23
+ * client appends `/v1/messages`, so it must not (`https://host`). Getting this
24
+ * backwards is a 404 against a URL that looks right.
25
+ */
26
+ export const ENDPOINT_APIS = ["openai-completions", "anthropic-messages"];
27
+
28
+ /** What an entry with no explicit `api` means -- the only shape Loom used to speak. */
29
+ export const DEFAULT_ENDPOINT_API = "openai-completions";
30
+
31
+ /**
32
+ * Resolve an entry's wire format, rejecting anything we can't actually drive.
33
+ *
34
+ * Throwing beats defaulting here. pi's ModelRegistry drops a provider whose
35
+ * `api` names no registered handler, so a typo would surface as
36
+ * "--provider/--model failed to resolve" with nothing pointing at the cause;
37
+ * and silently falling back to openai-completions would send OpenAI JSON at an
38
+ * Anthropic endpoint, which fails later and less legibly than failing here.
39
+ */
40
+ export function normalizeEndpointApi(value) {
41
+ if (value === undefined || value === null || value === "") return DEFAULT_ENDPOINT_API;
42
+ const api = String(value).trim().toLowerCase();
43
+ if (!ENDPOINT_APIS.includes(api)) {
44
+ throw new Error(
45
+ `unsupported endpoint api "${value}" -- expected one of: ${ENDPOINT_APIS.join(", ")}`,
46
+ );
47
+ }
48
+ return api;
49
+ }
50
+
51
+ /**
52
+ * Build a permissive model def from just a model id. Cost is zeroed (custom
53
+ * endpoints are typically free, self-hosted, or billed somewhere Orbit cannot
54
+ * see) and the model is registered for selection; the key is supplied
55
+ * separately at runtime.
56
+ *
57
+ * The context window is a guess either way -- the endpoint is not asked and
58
+ * generally will not say. 128K mirrors the defaults used for the existing local
59
+ * litellm setup; an Anthropic-shaped endpoint gets 200K because every Claude
60
+ * model in service carries at least that, and under-declaring makes pi compact
61
+ * a conversation that had room left. Both clear the 50K picker floor and the
62
+ * 16K assertion floor, so neither hides the model (#418) or trips the
63
+ * "window too small" message (#419).
64
+ */
65
+ export function synthesizeModelDef(entry) {
66
+ if (!entry.model) {
67
+ throw new Error("custom provider entry requires a model id to synthesize a model def");
68
+ }
69
+ const api = normalizeEndpointApi(entry.api);
70
+ return {
71
+ id: entry.model,
72
+ name: entry.model,
73
+ reasoning: false,
74
+ input: ["text"],
75
+ contextWindow: api === "anthropic-messages" ? 200000 : 128000,
76
+ maxTokens: 16384,
77
+ cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
78
+ };
79
+ }
80
+
81
+ /**
82
+ * Name of the env var Orbit injects with the decrypted active-LLM key. We write
83
+ * this *name* (not the secret) into the synthesized models.json apiKey field.
84
+ */
85
+ export const ACTIVE_LLM_API_KEY_ENV = "LOOM_ACTIVE_LLM_API_KEY";
86
+
87
+ /**
88
+ * Return a NEW models.json config with the custom provider upserted. Other
89
+ * providers are preserved untouched.
90
+ *
91
+ * The apiKey field is set to the *name* of the env var Orbit injects, never the
92
+ * secret itself. pi's ModelRegistry rejects any custom (non-built-in) provider
93
+ * that defines models without an apiKey and drops the whole provider, so
94
+ * omitting it makes `--provider/--model` fail to resolve and the brain won't
95
+ * launch. The real key never lands on disk: bin/orbit.js hands it to pi with
96
+ * --api-key, which takes precedence. (pi 1.x reads a bare apiKey string as a
97
+ * literal, not an env-var name, so without --api-key this name itself is what
98
+ * gets sent.)
99
+ */
100
+ export function mergeCustomProviderIntoModelsConfig(modelsConfig, providerName, entry) {
101
+ const providers = { ...((modelsConfig && modelsConfig.providers) || {}) };
102
+ providers[providerName] = {
103
+ name: providerName,
104
+ baseUrl: entry.baseUrl,
105
+ api: normalizeEndpointApi(entry.api),
106
+ apiKey: ACTIVE_LLM_API_KEY_ENV,
107
+ models: [synthesizeModelDef(entry)],
108
+ };
109
+ return { ...modelsConfig, providers };
110
+ }
111
+
112
+ /**
113
+ * Read models.json (if present), upsert the custom provider, write it back with
114
+ * mode 0600. Best-effort: a malformed existing file is treated as empty rather
115
+ * than throwing, matching how bin/orbit.js already tolerates models.json.
116
+ */
117
+ export function syncCustomProviderModelsFile(modelsJsonPath, providerName, entry) {
118
+ let current = {};
119
+ try {
120
+ if (fs.existsSync(modelsJsonPath)) {
121
+ current = JSON.parse(fs.readFileSync(modelsJsonPath, "utf-8")) || {};
122
+ }
123
+ } catch {
124
+ current = {};
125
+ }
126
+ const merged = mergeCustomProviderIntoModelsConfig(current, providerName, entry);
127
+ fs.mkdirSync(path.dirname(modelsJsonPath), { recursive: true });
128
+ // Plain write + chmod (not tmp+rename): this file is regenerated on every
129
+ // launch, so a torn write is self-healing. chmod runs after the write because
130
+ // writeFileSync's mode option only applies when the file is first created.
131
+ fs.writeFileSync(modelsJsonPath, JSON.stringify(merged, null, 2), { mode: 0o600 });
132
+ try {
133
+ fs.chmodSync(modelsJsonPath, 0o600);
134
+ } catch {
135
+ /* best-effort */
136
+ }
137
+ return merged;
138
+ }
139
+
140
+ /**
141
+ * What a keyless endpoint gets sent as its key. pi refuses to run a request
142
+ * with no key at all, and a server that doesn't check (llama-server, a local
143
+ * vLLM) ignores whatever arrives.
144
+ */
145
+ export const NO_AUTH_API_KEY = "no-key";
146
+
147
+ /**
148
+ * A custom endpoint with no key stored in any form -- the user left the field
149
+ * blank because the server needs none (#600). An encrypted key counts as
150
+ * stored even where it can't be decrypted: that's a key we failed to read, and
151
+ * sending a placeholder in its place would hide the failure.
152
+ */
153
+ export function isKeylessCustomProvider(entry) {
154
+ return isCustomProvider(entry) && !entry.apiKey && !entry.apiKeyEncrypted;
155
+ }
156
+
157
+ /**
158
+ * Resolve the API key for a custom provider at runtime. Orbit injects the
159
+ * decrypted key via LOOM_ACTIVE_LLM_API_KEY (or ORBIT_ACTIVE_LLM_API_KEY); the standalone CLI uses the
160
+ * plaintext apiKey on the entry; a keyless endpoint gets NO_AUTH_API_KEY.
161
+ * Returns undefined when none of those applies.
162
+ */
163
+ export function resolveActiveLlmApiKey(entry, env) {
164
+ return (
165
+ (env && readEnv("ACTIVE_LLM_API_KEY", env)) ||
166
+ (entry && entry.apiKey) ||
167
+ (isKeylessCustomProvider(entry) ? NO_AUTH_API_KEY : undefined)
168
+ );
169
+ }
@@ -0,0 +1,123 @@
1
+ export const DASHBOARD_SCHEMA_VERSION: 1;
2
+
3
+ /** Per-analysis layout file, beside notebook.md in the working directory. */
4
+ export const DASHBOARD_FILENAME: ".loom-dashboard.json";
5
+
6
+ /** Refuse to persist anything larger. Layout, not a blob store. */
7
+ export const DASHBOARD_MAX_BYTES: number;
8
+
9
+ /**
10
+ * Advisory list used to build presets and to give the brain a vocabulary. It is
11
+ * deliberately not the set of renderable widgets -- the renderer's registry is
12
+ * that, and it includes flag-gated widgets this list should not advertise.
13
+ * Validation never consults either.
14
+ */
15
+ export const KNOWN_WIDGET_TYPES: readonly string[];
16
+
17
+ /**
18
+ * Caps the validator enforces by truncating. A caller that would rather refuse
19
+ * a click than silently drop what it just added reads them from here.
20
+ */
21
+ export const MAX_DASHBOARDS: number;
22
+ export const MAX_PANELS: number;
23
+
24
+ /** Panel height bounds, in grid row units. */
25
+ export const MIN_ROWS: number;
26
+ export const MAX_ROWS: number;
27
+
28
+ export type PanelSpan = 1 | 2;
29
+
30
+ export interface DashboardPanelLayout {
31
+ /** Grid columns this panel occupies. */
32
+ span: PanelSpan;
33
+ /** Height in grid row units, 1..6. */
34
+ rows: number;
35
+ }
36
+
37
+ /** Who put this panel here. Recorded, preserved, and not yet rendered. */
38
+ export type PanelOrigin = "user" | "agent" | "preset";
39
+
40
+ export interface DashboardPanel {
41
+ id: string;
42
+ /** Widget type key. An unrecognised value is preserved, not dropped. */
43
+ widget: string;
44
+ /** Overrides the widget's own label when set. */
45
+ title?: string;
46
+ config: Record<string, unknown>;
47
+ layout: DashboardPanelLayout;
48
+ /**
49
+ * Provenance. Carried in v1 so that an agent curating the dashboard later can
50
+ * say who added a panel and why, and so the user can pin one against being
51
+ * re-curated away, without a schema migration. The validator preserves these;
52
+ * the host ignores them.
53
+ *
54
+ * **Absent reads as the user's.** The only panels that arrive with no
55
+ * provenance are hand-written ones, so anything deciding what an agent may
56
+ * touch has to treat an unlabelled panel as protected -- otherwise a
57
+ * hand-edited layout is the one case where curation quietly deletes work.
58
+ */
59
+ addedBy?: PanelOrigin;
60
+ /** Short note on why this panel is here. Capped at 280 characters. */
61
+ reason?: string;
62
+ /** Set by the user to mean "leave this one alone". */
63
+ pinned?: boolean;
64
+ }
65
+
66
+ export interface Dashboard {
67
+ id: string;
68
+ title: string;
69
+ panels: DashboardPanel[];
70
+ }
71
+
72
+ export interface DashboardDocument {
73
+ version: number;
74
+ /** id of the dashboard shown by default. Always present in a validated document. */
75
+ activeId: string;
76
+ dashboards: Dashboard[];
77
+ }
78
+
79
+ export interface DashboardProblem {
80
+ /** Dotted path into the input, "" for the document itself. */
81
+ path: string;
82
+ message: string;
83
+ }
84
+
85
+ export type DashboardValidation =
86
+ | { ok: true; document: DashboardDocument; problems: DashboardProblem[] }
87
+ | { ok: false; problems: DashboardProblem[] };
88
+
89
+ export interface DashboardPreset {
90
+ id: string;
91
+ label: string;
92
+ description: string;
93
+ dashboard: Dashboard;
94
+ }
95
+
96
+ export const DASHBOARD_PRESETS: readonly DashboardPreset[];
97
+
98
+ /** A fresh copy of a preset's dashboard, or null if there is no such preset. */
99
+ export function dashboardFromPreset(presetId: string): Dashboard | null;
100
+
101
+ /** The document a workspace starts with: one dashboard, the current-analysis preset. */
102
+ export function createDefaultDashboardDocument(): DashboardDocument;
103
+
104
+ export function serializeDashboardDocument(document: DashboardDocument): string;
105
+
106
+ /**
107
+ * A short content fingerprint for the layout file: the compare-and-swap token a
108
+ * save carries to prove which version it was based on. Returns null for a
109
+ * non-string (i.e. no file).
110
+ */
111
+ export function dashboardRevision(raw: unknown): string | null;
112
+
113
+ /**
114
+ * Normalize an untrusted value into a dashboard document. Never throws.
115
+ *
116
+ * `ok: true` carries the document plus every repair that was made. `ok: false`
117
+ * means the input could not be repaired: not an object, no usable version, or a
118
+ * version newer than this build understands.
119
+ */
120
+ export function validateDashboardDocument(input: unknown): DashboardValidation;
121
+
122
+ /** JSON text -> validated document. Same total-function guarantee. */
123
+ export function parseDashboardDocument(raw: unknown): DashboardValidation;