@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,563 @@
1
+ /**
2
+ * The deterministic triggers that raise an observation, and the one path that
3
+ * delivers one.
4
+ *
5
+ * Every trigger ENQUEUES; nothing is built, shown or sent from inside the hook
6
+ * that noticed it. That is not bookkeeping -- in `ask` mode delivery blocks on
7
+ * ctx.ui.confirm, and awaiting a human inside a tool_result handler would stall
8
+ * the agent loop mid-turn. The queue drains on agent_settled, when the turn is
9
+ * over and the user is reading anyway.
10
+ *
11
+ * Three triggers, all deterministic, none of them a model judgement:
12
+ * - a Galaxy tool result with isError (one the shell's Galaxy tool family
13
+ * names, or one of Orbit's own `galaxy_*` tools)
14
+ * - the same tool and the same normalized signature RETRY_LOOP_THRESHOLD times
15
+ * - the evidence gate blocking a plan-step completion
16
+ * A fourth, the user's own `/observe`, lives in observations-command.ts and
17
+ * delivers immediately because the user is standing right there.
18
+ */
19
+
20
+ import type { ExtensionAPI, ExtensionContext } from "@earendil-works/pi-coding-agent";
21
+ import path from "node:path";
22
+ import { normalizeSignature } from "../../shared/observation-contract.js";
23
+ import type {
24
+ Observation,
25
+ ObservationKind,
26
+ ObservationTrigger,
27
+ } from "../../shared/observation-contract.js";
28
+ import { withoutAppendedLessonHints } from "./lessons/pi-event-contract";
29
+ import {
30
+ appendSentLog,
31
+ appendToObservationOutbox,
32
+ buildCheckedObservation,
33
+ collectObservationEnvelope,
34
+ consentFor,
35
+ drainObservationOutbox,
36
+ extractDatatypes,
37
+ extractToolIds,
38
+ observationToolName,
39
+ resetGalaxyVersion,
40
+ saveRetractToken,
41
+ sentLogEntryFor,
42
+ shapeForMode,
43
+ submitObservation,
44
+ withheldReason,
45
+ } from "./observations.js";
46
+ import type {
47
+ ObservationFacts,
48
+ ObservationProblems,
49
+ ObservationShape,
50
+ SubmitObservationResult,
51
+ } from "./observations.js";
52
+ import { getOrCreateInstallToken, resolveObservationsMode } from "./observations-config.js";
53
+ import type { ObservationsMode } from "./observations-config.js";
54
+ import { onEvidenceDecision } from "./evidence-gate.js";
55
+ import { appendActivityEvent } from "./activity.js";
56
+ import { getNotebookPath } from "./state.js";
57
+ import { confirmObservation, describeObservation } from "./observation-ui.js";
58
+ import type { GalaxyToolFamily } from "../../shared/galaxy-tool-family.js";
59
+
60
+ export const RETRY_LOOP_THRESHOLD = 3;
61
+ /**
62
+ * A local ceiling on top of the Worker's 200-per-24h. One pathological session
63
+ * should not be able to spend a day's budget, and 20 reports from one session
64
+ * is already more signal than triage can use.
65
+ */
66
+ export const OBSERVATIONS_SESSION_CAP = 20;
67
+
68
+ export interface TriggerState {
69
+ /** `${tool}|${signature}` -> how many times it has failed this session. */
70
+ counts: Map<string, number>;
71
+ /** `${kind}|${tool}|${signature}` already reported, so nothing repeats. */
72
+ emitted: Set<string>;
73
+ /** Observations actually sent or queued this session. */
74
+ delivered: number;
75
+ }
76
+
77
+ export function newTriggerState(): TriggerState {
78
+ return { counts: new Map(), emitted: new Set(), delivered: 0 };
79
+ }
80
+
81
+ /**
82
+ * Pure. One failure of one tool with one signature in, at most one report out.
83
+ *
84
+ * A loop therefore yields two observations, not three or ten: the first
85
+ * failure is reported as a tool-error, and the third is reported as a
86
+ * retry-loop (which is the more informative one -- it says the agent could not
87
+ * get past it). Everything in between, and everything after, is silent.
88
+ */
89
+ export function decideToolResultObservation(
90
+ state: TriggerState,
91
+ key: { mcpTool: string; signature: string; toolIds?: string[] },
92
+ ): { kind: ObservationKind; trigger: ObservationTrigger } | null {
93
+ if (!key.mcpTool || !key.signature) return null;
94
+ // The Galaxy tool is part of "the same tool": three different tools failing
95
+ // galaxy_run_tool with one message are three failures, not a loop.
96
+ const tools = [...(key.toolIds ?? [])].sort().join(",");
97
+ const k = `${key.mcpTool}|${tools}|${key.signature}`;
98
+ const count = (state.counts.get(k) ?? 0) + 1;
99
+ state.counts.set(k, count);
100
+
101
+ const once = (kind: ObservationKind, trigger: ObservationTrigger) => {
102
+ const marker = `${kind}|${k}`;
103
+ if (state.emitted.has(marker)) return null;
104
+ state.emitted.add(marker);
105
+ return { kind, trigger };
106
+ };
107
+
108
+ if (count === 1) return once("tool-error", "tool_error");
109
+ if (count === RETRY_LOOP_THRESHOLD) return once("retry-loop", "retry_loop");
110
+ return null;
111
+ }
112
+
113
+ // -----------------------------------------------------------------------------
114
+ // Session state
115
+ // -----------------------------------------------------------------------------
116
+
117
+ let state = newTriggerState();
118
+ const pending: ObservationFacts[] = [];
119
+
120
+ let lastFacts: ObservationFacts | null = null;
121
+
122
+ /** The most recent thing a trigger saw, so `mode auto` can show a real sample. */
123
+ export function lastObservationFacts(): ObservationFacts | null {
124
+ return lastFacts;
125
+ }
126
+
127
+ export function resetObservationTriggers(): void {
128
+ state = newTriggerState();
129
+ pending.length = 0;
130
+ lastFacts = null;
131
+ resetGalaxyVersion();
132
+ }
133
+
134
+ export function enqueueObservation(facts: ObservationFacts): void {
135
+ lastFacts = facts;
136
+ pending.push(facts);
137
+ }
138
+
139
+ export function pendingObservationCount(): number {
140
+ return pending.length;
141
+ }
142
+
143
+ // -----------------------------------------------------------------------------
144
+ // Facts from a tool result
145
+ // -----------------------------------------------------------------------------
146
+
147
+ /**
148
+ * `mcpTool` comes out in wire spelling (see observationToolName), so the retry
149
+ * key, the stage rules and the allowlist all see `galaxy_run_tool` whichever
150
+ * way pi spelled the call.
151
+ */
152
+ export function factsForToolResult(
153
+ toolName: string,
154
+ input: Record<string, unknown>,
155
+ text: string,
156
+ family: GalaxyToolFamily,
157
+ ): ObservationFacts | null {
158
+ const args = input ?? {};
159
+ const name = observationToolName(toolName, family);
160
+ if (!name) return null;
161
+ const raw = String(text ?? "").trim();
162
+ if (!raw) return null;
163
+ return {
164
+ kind: "tool-error",
165
+ trigger: "tool_error",
166
+ mcpTool: name,
167
+ inProcess: true as const,
168
+ toolIds: extractToolIds(args),
169
+ datatypes: extractDatatypes(args),
170
+ rawSignature: raw,
171
+ };
172
+ }
173
+
174
+ // -----------------------------------------------------------------------------
175
+ // Delivery
176
+ // -----------------------------------------------------------------------------
177
+
178
+ /**
179
+ * `unsaved`: the send failed in a way worth retrying, but the outbox could not
180
+ * be written, so nothing is kept. `sent-unretractable`: it went, but its
181
+ * retract token could not be saved. Both are local-write failures the user has
182
+ * to hear about, since the usual message ("saved locally", "retract it any
183
+ * time") would be untrue.
184
+ */
185
+ export type DeliveryOutcome =
186
+ "sent" | "sent-unretractable" | "queued" | "unsaved" | "declined" | "invalid" | "skipped";
187
+
188
+ /**
189
+ * Everything impure, injected. The privacy-relevant decisions -- does this
190
+ * send, does the user see it first, is it legal to send at all -- are then
191
+ * testable with no pi session, no filesystem and no network.
192
+ */
193
+ export interface DeliverDeps {
194
+ /** The mode this delivery started under; it decides the payload shape. */
195
+ mode: ObservationsMode;
196
+ /**
197
+ * The mode right now. Read again immediately before the POST, because the
198
+ * confirm can sit open for minutes and another session (or the user, in
199
+ * another window) can turn collection off in the meantime.
200
+ */
201
+ currentMode(): ObservationsMode;
202
+ state: TriggerState;
203
+ installToken(): string;
204
+ /** Gets the built observation, never the raw facts. */
205
+ describe(obs: Observation, ctx: ExtensionContext): Promise<string>;
206
+ /** `note` is a one-line reason shown above the payload, e.g. why text was withheld. */
207
+ confirm(obs: Observation, ctx: ExtensionContext, note?: string): Promise<boolean>;
208
+ submit(obs: Observation): Promise<SubmitObservationResult>;
209
+ record(kind: string, payload: Record<string, unknown>): void;
210
+ }
211
+
212
+ export interface BuiltObservation {
213
+ obs: Observation;
214
+ valid: boolean;
215
+ errors: string[];
216
+ leaks: string[];
217
+ /** Patterns that got the signature withheld (ask only); empty otherwise. */
218
+ withheld: string[];
219
+ }
220
+
221
+ /**
222
+ * Build, check, and record -- and nothing else. Split out of
223
+ * deliverObservation so the eval replay can exercise exactly the half that
224
+ * matters for privacy with no transport anywhere in its call graph: a dry run
225
+ * that cannot send because there is nothing to send with, not because a stub
226
+ * refused.
227
+ */
228
+ export function buildAndRecordObservation(
229
+ facts: ObservationFacts,
230
+ description: string,
231
+ deps: Pick<DeliverDeps, "installToken" | "record">,
232
+ shape: ObservationShape,
233
+ ): BuiltObservation {
234
+ const { obs, errors, leaks, withheld } = buildCheckedObservation(
235
+ { ...facts, description },
236
+ collectObservationEnvelope(deps.installToken()),
237
+ shape,
238
+ );
239
+ const valid = errors.length === 0;
240
+ // No free text in this row, ever. It is written before anyone has agreed to
241
+ // anything -- before the ask confirm, and for /observe the signature is the
242
+ // user's own sentence -- and a refused payload's text is exactly the text
243
+ // that may carry the leak. The structured fields are safe to show: they are
244
+ // admitted from allowlists by the builder. A withheld signature is named by
245
+ // the patterns it tripped, never by its text.
246
+ deps.record("observation.built", {
247
+ kind: obs.kind,
248
+ trigger: obs.trigger,
249
+ stage: obs.stage,
250
+ shape,
251
+ mcpTool: obs.mcpTool ?? "",
252
+ toolIds: obs.tools.map((t) => t.id).join(","),
253
+ datatypes: obs.datatypes.join(","),
254
+ server: obs.galaxy.server,
255
+ descriptionLength: obs.description.length,
256
+ signatureWithheld: withheld.join(","),
257
+ valid,
258
+ leakScan: leaks.length === 0 ? "clean" : "dirty",
259
+ });
260
+ return { obs, valid, errors, leaks, withheld };
261
+ }
262
+
263
+ function isClean(p: ObservationProblems): boolean {
264
+ return p.errors.length === 0 && p.leaks.length === 0;
265
+ }
266
+
267
+ export async function deliverObservation(
268
+ facts: ObservationFacts,
269
+ ctx: ExtensionContext,
270
+ deps: DeliverDeps,
271
+ ): Promise<DeliveryOutcome> {
272
+ if (deps.mode === "off") {
273
+ deps.record("observation.skipped", { reason: "mode-off" });
274
+ return "skipped";
275
+ }
276
+ if (deps.state.delivered >= OBSERVATIONS_SESSION_CAP) {
277
+ deps.record("observation.skipped", { reason: "session-cap" });
278
+ return "skipped";
279
+ }
280
+ // `ask` without a dialog surface is not "send it anyway", it is "don't".
281
+ if (deps.mode === "ask" && !ctx.hasUI) {
282
+ deps.record("observation.skipped", { reason: "no-ui" });
283
+ return "skipped";
284
+ }
285
+
286
+ const shape = shapeForMode(deps.mode);
287
+
288
+ // Check the rest of the payload before asking anyone for a description: if
289
+ // it can't be sent, prompting the user for one is wasted, and the build
290
+ // below records the refusal either way. `auto` never asks -- it carries no
291
+ // free text.
292
+ let description = "";
293
+ const precheck =
294
+ shape === "full"
295
+ ? buildCheckedObservation(
296
+ { ...facts, description: "" },
297
+ collectObservationEnvelope(deps.installToken()),
298
+ shape,
299
+ )
300
+ : undefined;
301
+ if (precheck && isClean(precheck)) {
302
+ try {
303
+ description = await deps.describe(precheck.obs, ctx);
304
+ } catch {
305
+ // A description is a nice-to-have; the structured observation is the point.
306
+ description = "";
307
+ }
308
+ }
309
+
310
+ // The install token is written to config here, before any confirm, because a
311
+ // valid payload needs one and the confirm has to show the real payload. It
312
+ // is local state until the user says send.
313
+ const { obs, valid, errors, leaks, withheld } = buildAndRecordObservation(
314
+ facts,
315
+ description,
316
+ deps,
317
+ shape,
318
+ );
319
+
320
+ if (!valid || leaks.length > 0) {
321
+ // Fail closed. Nothing is sent, and only field and pattern names are
322
+ // recorded -- the offending value stays out of the log too.
323
+ deps.record("observation.invalid", {
324
+ kind: obs.kind,
325
+ errors: errors.join(","),
326
+ leaks: leaks.join(","),
327
+ });
328
+ return "invalid";
329
+ }
330
+
331
+ const note = withheld.length > 0 ? withheldReason(withheld) : undefined;
332
+ if (deps.mode === "ask" && !(await deps.confirm(obs, ctx, note))) {
333
+ // No signature: the user said no, and for /observe it is their own words.
334
+ deps.record("observation.declined", { kind: obs.kind });
335
+ return "declined";
336
+ }
337
+
338
+ // Consent is checked where it is spent. Off means off, even mid-confirm; and
339
+ // an auto delivery no longer goes once the user has stepped back to ask,
340
+ // since they never saw this one. An ask that was confirmed still goes under
341
+ // auto: the user has already seen it and said yes.
342
+ const now = deps.currentMode();
343
+ if (now === "off" || (deps.mode === "auto" && now !== "auto")) {
344
+ deps.record("observation.skipped", { reason: "mode-changed" });
345
+ return "skipped";
346
+ }
347
+ // Pinned to these exact bytes now, so a queued copy can be held to them.
348
+ const consent = consentFor(obs, deps.mode === "auto" ? "auto" : "ask");
349
+
350
+ const res = await deps.submit(obs);
351
+ if (res.ok) {
352
+ const tokenLost = Boolean(res.retractToken) && !saveRetractToken(obs.id, res.retractToken!);
353
+ appendSentLog(sentLogEntryFor(obs, "sent"));
354
+ deps.state.delivered += 1;
355
+ deps.record("observation.sent", {
356
+ id: obs.id,
357
+ kind: obs.kind,
358
+ // After consent, so the normalized signature may be logged -- except the
359
+ // user's own /observe sentence, which stays in the sent log only.
360
+ ...(obs.trigger === "explicit" ? {} : { signature: obs.signature }),
361
+ ...(tokenLost ? { tokenWrite: "failed" } : {}),
362
+ });
363
+ return tokenLost ? "sent-unretractable" : "sent";
364
+ }
365
+ if (res.status === 409) {
366
+ // The intake already holds this id from an attempt whose 202 was lost. It
367
+ // went; only the retract token is gone.
368
+ appendSentLog(sentLogEntryFor(obs, "sent"));
369
+ deps.state.delivered += 1;
370
+ deps.record("observation.sent", {
371
+ id: obs.id,
372
+ kind: obs.kind,
373
+ ...(obs.trigger === "explicit" ? {} : { signature: obs.signature }),
374
+ duplicate: true,
375
+ });
376
+ return "sent-unretractable";
377
+ }
378
+ if (res.queueable) {
379
+ if (!appendToObservationOutbox(obs, consent)) {
380
+ deps.record("observation.unsaved", {
381
+ id: obs.id,
382
+ kind: obs.kind,
383
+ status: res.status ?? 0,
384
+ reason: "outbox-write-failed",
385
+ });
386
+ return "unsaved";
387
+ }
388
+ appendSentLog(sentLogEntryFor(obs, "queued"));
389
+ deps.state.delivered += 1;
390
+ deps.record("observation.queued", {
391
+ id: obs.id,
392
+ kind: obs.kind,
393
+ status: res.status ?? 0,
394
+ // Never the error text: it comes from the transport or the Worker.
395
+ reason: res.status ? `status ${res.status}` : "unreachable",
396
+ });
397
+ return "queued";
398
+ }
399
+ deps.record("observation.invalid", {
400
+ kind: obs.kind,
401
+ status: res.status ?? 0,
402
+ // The Worker's error list is endpoint-controlled text, and the endpoint
403
+ // can be repointed; only `field:reason` names are kept.
404
+ errors: (res.errors ?? []).filter(isFieldReason).join(","),
405
+ leaks: "",
406
+ });
407
+ return "invalid";
408
+ }
409
+
410
+ // -----------------------------------------------------------------------------
411
+ // Registration
412
+ // -----------------------------------------------------------------------------
413
+
414
+ const FIELD_REASON_RE = /^[A-Za-z0-9_.<>[\]]{1,60}:[a-z0-9-]{1,40}$/;
415
+
416
+ function isFieldReason(v: unknown): boolean {
417
+ return typeof v === "string" && FIELD_REASON_RE.test(v);
418
+ }
419
+
420
+ // A filesystem error message carries the path, and the path carries the
421
+ // username; only the error's code or name is printed.
422
+ function errorTag(err: unknown): string {
423
+ const code = (err as NodeJS.ErrnoException | undefined)?.code;
424
+ if (typeof code === "string") return code;
425
+ return err instanceof Error ? err.name : "error";
426
+ }
427
+
428
+ /** What to tell the user when a delivery's local write failed, if anything. */
429
+ export function localWriteWarning(outcome: DeliveryOutcome): string | undefined {
430
+ if (outcome === "unsaved") {
431
+ return "An observation couldn't be sent right now, and it couldn't be saved locally to retry either (check that the Orbit state directory is writable). Nothing was kept.";
432
+ }
433
+ if (outcome === "sent-unretractable") {
434
+ return "An observation was sent, but its retract token couldn't be saved locally, so /observations retract won't be able to delete it.";
435
+ }
436
+ return undefined;
437
+ }
438
+
439
+ /** Activity rows land beside the session's notebook, like every other row. */
440
+ export function recordObservationActivity(
441
+ kind: string,
442
+ payload: Record<string, unknown>,
443
+ source = "observations",
444
+ ): void {
445
+ const notebook = getNotebookPath();
446
+ if (!notebook) return;
447
+ appendActivityEvent(path.dirname(notebook), {
448
+ timestamp: new Date().toISOString(),
449
+ kind,
450
+ source,
451
+ payload,
452
+ });
453
+ }
454
+
455
+ /** The production dep set. */
456
+ export function liveDeliverDeps(
457
+ ctxMode: ObservationsMode = resolveObservationsMode(),
458
+ ): DeliverDeps {
459
+ return {
460
+ mode: ctxMode,
461
+ currentMode: resolveObservationsMode,
462
+ state,
463
+ installToken: getOrCreateInstallToken,
464
+ describe: (obs, ctx) => describeObservation(ctxMode, obs, ctx),
465
+ confirm: confirmObservation,
466
+ submit: submitObservation,
467
+ record: (kind, payload) => recordObservationActivity(kind, payload),
468
+ };
469
+ }
470
+
471
+ function errorTextOf(content: ReadonlyArray<{ type: string; text?: string }>): string {
472
+ // A hint Orbit appended is Orbit's prose, not the tool's error, wherever it
473
+ // sits. A block the TOOL opened with the marker is still the tool's error.
474
+ return withoutAppendedLessonHints(content)
475
+ .filter((c) => c.type === "text" && typeof c.text === "string")
476
+ .map((c) => c.text as string)
477
+ .join("\n");
478
+ }
479
+
480
+ const EVIDENCE_MARKER = "assertion-failed|evidence-gate";
481
+
482
+ export function registerObservationTriggers(pi: ExtensionAPI, family: GalaxyToolFamily): void {
483
+ pi.on("session_start", async () => {
484
+ resetObservationTriggers();
485
+ });
486
+
487
+ pi.on("tool_result", async (event) => {
488
+ // Registered AFTER secret redaction in index.ts, so `content` here is the
489
+ // already-scrubbed text the model sees. Reading the raw result would put
490
+ // an API key one normalization away from the wire.
491
+ if (resolveObservationsMode() === "off") return;
492
+
493
+ const failed = event.isError || Boolean((event.details as { error?: unknown })?.error);
494
+ if (!failed) return;
495
+ const facts = factsForToolResult(
496
+ event.toolName,
497
+ event.input,
498
+ errorTextOf(event.content),
499
+ family,
500
+ );
501
+ if (!facts) return;
502
+
503
+ const decision = decideToolResultObservation(state, {
504
+ mcpTool: facts.mcpTool ?? "",
505
+ toolIds: facts.toolIds,
506
+ signature: normalizeSignature(facts.rawSignature),
507
+ });
508
+ if (!decision) return;
509
+ enqueueObservation({ ...facts, kind: decision.kind, trigger: decision.trigger });
510
+ });
511
+
512
+ onEvidenceDecision((info) => {
513
+ if (info.outcome !== "blocked") return;
514
+ if (resolveObservationsMode() === "off") return;
515
+ // Once per session. The agent usually retries a blocked write, and each
516
+ // block would otherwise cost the user another prompt for the same report.
517
+ if (state.emitted.has(EVIDENCE_MARKER)) return;
518
+ state.emitted.add(EVIDENCE_MARKER);
519
+ enqueueObservation({
520
+ kind: "assertion-failed",
521
+ trigger: "assertion",
522
+ stage: "result-interpretation",
523
+ toolIds: [],
524
+ datatypes: [],
525
+ // No step text, no anchor, no invocation id: the signal is the shape of
526
+ // the mistake, and the shape is the whole message.
527
+ rawSignature:
528
+ "the evidence gate refused a plan-step completion claimed over an unfinished Galaxy invocation",
529
+ });
530
+ });
531
+
532
+ pi.on("agent_settled", async (_event, ctx) => {
533
+ // Earlier sends that hit a transport failure, a 429 or a 5xx. They were
534
+ // already consented to (confirmed, or sent in auto), so they go without a
535
+ // prompt -- but only unchanged, never while collection is off, and an
536
+ // auto row only while auto is still in effect.
537
+ if (resolveObservationsMode() !== "off") {
538
+ try {
539
+ const drained = await drainObservationOutbox(submitObservation, resolveObservationsMode);
540
+ if (drained.sent + drained.dropped > 0) {
541
+ recordObservationActivity("observation.outbox", { ...drained });
542
+ }
543
+ if (drained.unretractable && ctx.hasUI) {
544
+ ctx.ui.notify(localWriteWarning("sent-unretractable") ?? "", "warning");
545
+ }
546
+ } catch (err) {
547
+ console.error("observation outbox drain failed:", errorTag(err));
548
+ }
549
+ }
550
+ while (pending.length > 0) {
551
+ const facts = pending.shift();
552
+ if (!facts) break;
553
+ try {
554
+ const outcome = await deliverObservation(facts, ctx, liveDeliverDeps());
555
+ const warning = localWriteWarning(outcome);
556
+ if (warning && ctx.hasUI) ctx.ui.notify(warning, "warning");
557
+ } catch (err) {
558
+ // A failed delivery must never take the settle handler down with it.
559
+ console.error("observation delivery failed:", errorTag(err));
560
+ }
561
+ }
562
+ });
563
+ }