@gajae-code/coding-agent 0.13.2 → 0.14.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 (610) hide show
  1. package/CHANGELOG.md +215 -8
  2. package/README.md +2 -0
  3. package/bin/gajaessi.js +4 -0
  4. package/dist/types/async/job-manager.d.ts +55 -2
  5. package/dist/types/async/support.d.ts +14 -0
  6. package/dist/types/capability/mcp.d.ts +6 -0
  7. package/dist/types/capability/types.d.ts +6 -0
  8. package/dist/types/cli/accounts-cli.d.ts +19 -0
  9. package/dist/types/cli/args.d.ts +3 -0
  10. package/dist/types/cli/config-cli.d.ts +6 -0
  11. package/dist/types/cli/crash-cli.d.ts +10 -0
  12. package/dist/types/cli/customize-doctor.d.ts +145 -0
  13. package/dist/types/cli/daemon-cli.d.ts +3 -1
  14. package/dist/types/cli/mcp-cli.d.ts +11 -0
  15. package/dist/types/cli/notify-cli.d.ts +1 -1
  16. package/dist/types/cli/root-flags.d.ts +12 -0
  17. package/dist/types/cli/setup-cli.d.ts +3 -1
  18. package/dist/types/cli/skills-cli.d.ts +2 -1
  19. package/dist/types/cli/update-cli.d.ts +19 -1
  20. package/dist/types/cli.d.ts +6 -0
  21. package/dist/types/commands/accounts.d.ts +40 -0
  22. package/dist/types/commands/crash.d.ts +24 -0
  23. package/dist/types/commands/customize.d.ts +22 -0
  24. package/dist/types/commands/daemon.d.ts +1 -1
  25. package/dist/types/commands/launch.d.ts +6 -0
  26. package/dist/types/commands/setup.d.ts +6 -0
  27. package/dist/types/commands/skills.d.ts +6 -1
  28. package/dist/types/commands/update.d.ts +7 -0
  29. package/dist/types/config/atomic-yaml-patch-worker.d.ts +25 -0
  30. package/dist/types/config/atomic-yaml-patch.d.ts +62 -2
  31. package/dist/types/config/config-schema-version.d.ts +10 -0
  32. package/dist/types/config/file-lock.d.ts +18 -0
  33. package/dist/types/config/model-profile-activation.d.ts +3 -1
  34. package/dist/types/config/model-registry.d.ts +10 -1
  35. package/dist/types/config/models-config-schema.d.ts +2 -0
  36. package/dist/types/config/settings-schema.d.ts +73 -9
  37. package/dist/types/config/settings.d.ts +63 -0
  38. package/dist/types/config/skill-settings-defaults.d.ts +26 -0
  39. package/dist/types/config/task-delegation.d.ts +39 -0
  40. package/dist/types/config/update-channel.d.ts +10 -0
  41. package/dist/types/coordinator-mcp/server.d.ts +5 -1
  42. package/dist/types/crash/index-store.d.ts +87 -0
  43. package/dist/types/crash/nudge.d.ts +50 -0
  44. package/dist/types/crash/record-loader.d.ts +17 -0
  45. package/dist/types/crash/report.d.ts +134 -0
  46. package/dist/types/crash/sanitize.d.ts +25 -0
  47. package/dist/types/cursor.d.ts +13 -2
  48. package/dist/types/customization/import.d.ts +37 -0
  49. package/dist/types/customization/index.d.ts +4 -0
  50. package/dist/types/customization/inventory.d.ts +25 -0
  51. package/dist/types/customization/mutations.d.ts +32 -0
  52. package/dist/types/customization/types.d.ts +115 -0
  53. package/dist/types/daemon/control-types.d.ts +8 -1
  54. package/dist/types/daemon/operator-contract.d.ts +4 -4
  55. package/dist/types/discovery/claude.d.ts +39 -1
  56. package/dist/types/discovery/codex.d.ts +39 -1
  57. package/dist/types/discovery/index.d.ts +2 -0
  58. package/dist/types/discovery/mcp-compat.d.ts +30 -0
  59. package/dist/types/edit/renderer.d.ts +23 -0
  60. package/dist/types/extensibility/extensions/runner.d.ts +3 -0
  61. package/dist/types/extensibility/extensions/types.d.ts +21 -4
  62. package/dist/types/extensibility/gjc-plugins/observability.d.ts +6 -1
  63. package/dist/types/extensibility/gjc-plugins/registry.d.ts +8 -1
  64. package/dist/types/extensibility/hooks/loader.d.ts +19 -5
  65. package/dist/types/extensibility/runtime-skill-discovery.d.ts +22 -1
  66. package/dist/types/extensibility/skill-management.d.ts +107 -0
  67. package/dist/types/gjc-runtime/deep-interview-runtime.d.ts +3 -1
  68. package/dist/types/gjc-runtime/launch-worktree.d.ts +8 -0
  69. package/dist/types/gjc-runtime/linux-proc.d.ts +3 -0
  70. package/dist/types/gjc-runtime/ralplan-runtime.d.ts +10 -6
  71. package/dist/types/gjc-runtime/session-state-lock.d.ts +104 -0
  72. package/dist/types/gjc-runtime/session-state-sidecar.d.ts +120 -2
  73. package/dist/types/gjc-runtime/state-writer.d.ts +10 -1
  74. package/dist/types/gjc-runtime/ultragoal-guard.d.ts +4 -2
  75. package/dist/types/gjc-runtime/ultragoal-runtime.d.ts +8 -6
  76. package/dist/types/gjc-runtime/workflow-settings.d.ts +109 -0
  77. package/dist/types/hooks/events.d.ts +60 -0
  78. package/dist/types/hooks/normalize.d.ts +83 -0
  79. package/dist/types/hooks/skill-state.d.ts +9 -2
  80. package/dist/types/main.d.ts +2 -1
  81. package/dist/types/modes/acp/abort-scope.d.ts +13 -0
  82. package/dist/types/modes/acp/acp-agent.d.ts +7 -4
  83. package/dist/types/modes/components/customization/customization-dashboard.d.ts +44 -0
  84. package/dist/types/modes/components/customization/import-wizard.d.ts +21 -0
  85. package/dist/types/modes/components/customization/index.d.ts +1 -0
  86. package/dist/types/modes/components/dynamic-theme-text.d.ts +9 -0
  87. package/dist/types/modes/components/gajae-pet-widget.d.ts +6 -28
  88. package/dist/types/modes/components/irc-sidebar.d.ts +1 -0
  89. package/dist/types/modes/components/iterm-pet-transport.d.ts +122 -0
  90. package/dist/types/modes/components/oauth-selector.d.ts +10 -4
  91. package/dist/types/modes/components/pet-capability.d.ts +7 -21
  92. package/dist/types/modes/components/settings-selector.d.ts +5 -0
  93. package/dist/types/modes/components/status-line/gh.d.ts +6 -2
  94. package/dist/types/modes/controllers/extension-ui-controller.d.ts +1 -1
  95. package/dist/types/modes/controllers/selector-controller.d.ts +7 -8
  96. package/dist/types/modes/controllers/stt-controller.d.ts +1 -1
  97. package/dist/types/modes/interactive-mode.d.ts +1 -0
  98. package/dist/types/modes/theme/defaults/index.d.ts +118 -0
  99. package/dist/types/modes/types.d.ts +1 -0
  100. package/dist/types/modes/utils/injected-user-submission.d.ts +10 -0
  101. package/dist/types/runtime-mcp/config.d.ts +9 -0
  102. package/dist/types/runtime-mcp/manager.d.ts +26 -1
  103. package/dist/types/runtime-mcp/oauth-discovery.d.ts +4 -0
  104. package/dist/types/runtime-mcp/oauth-flow.d.ts +24 -1
  105. package/dist/types/runtime-mcp/pool-key.d.ts +2 -0
  106. package/dist/types/runtime-mcp/protocol.d.ts +278 -0
  107. package/dist/types/runtime-mcp/scope-config.d.ts +29 -0
  108. package/dist/types/runtime-mcp/tool-bridge.d.ts +15 -13
  109. package/dist/types/runtime-mcp/transports/http.d.ts +9 -0
  110. package/dist/types/runtime-mcp/types.d.ts +102 -10
  111. package/dist/types/sdk/acp/adapter.d.ts +26 -5
  112. package/dist/types/sdk/broker/broker.d.ts +3 -55
  113. package/dist/types/sdk/broker/lifecycle.d.ts +18 -12
  114. package/dist/types/sdk/broker/session-index.d.ts +14 -5
  115. package/dist/types/sdk/broker/startup-failure.d.ts +16 -1
  116. package/dist/types/sdk/bus/chat-daemon-control.d.ts +51 -1
  117. package/dist/types/sdk/bus/chat-daemon-runtime.d.ts +4 -41
  118. package/dist/types/sdk/bus/config.d.ts +11 -0
  119. package/dist/types/sdk/bus/conversation-store.d.ts +0 -1
  120. package/dist/types/sdk/bus/daemon-paths.d.ts +6 -0
  121. package/dist/types/sdk/bus/discord-conversation.d.ts +2 -0
  122. package/dist/types/sdk/bus/discord-daemon.d.ts +17 -12
  123. package/dist/types/sdk/bus/existing-thread-readiness.d.ts +4 -34
  124. package/dist/types/sdk/bus/inbound-reaction-ordering.d.ts +61 -0
  125. package/dist/types/sdk/bus/index.d.ts +85 -99
  126. package/dist/types/sdk/bus/kind-aware-reconciliation.d.ts +29 -7
  127. package/dist/types/sdk/bus/managed-daemon.d.ts +2 -32
  128. package/dist/types/sdk/bus/notification-service.d.ts +52 -0
  129. package/dist/types/sdk/bus/operator-runtime.d.ts +1 -1
  130. package/dist/types/sdk/bus/prompt-reconciliation.d.ts +16 -5
  131. package/dist/types/sdk/bus/reconciliation-store.d.ts +113 -5
  132. package/dist/types/sdk/bus/session-control.d.ts +25 -1
  133. package/dist/types/sdk/bus/slack-conversation.d.ts +4 -0
  134. package/dist/types/sdk/bus/slack-daemon.d.ts +9 -17
  135. package/dist/types/sdk/bus/slack-live-provider.d.ts +3 -1
  136. package/dist/types/sdk/bus/slack-provider.d.ts +4 -0
  137. package/dist/types/sdk/bus/slack-thread-binding.d.ts +6 -40
  138. package/dist/types/sdk/bus/telegram-adoption-intent.d.ts +30 -104
  139. package/dist/types/sdk/bus/telegram-daemon-cli.d.ts +10 -0
  140. package/dist/types/sdk/bus/telegram-daemon-contract.d.ts +262 -19
  141. package/dist/types/sdk/bus/telegram-daemon-orphan-reap.d.ts +125 -0
  142. package/dist/types/sdk/bus/telegram-daemon-owner-registry.d.ts +22 -0
  143. package/dist/types/sdk/bus/telegram-daemon.d.ts +119 -310
  144. package/dist/types/sdk/bus/telegram-reference.d.ts +1 -47
  145. package/dist/types/sdk/bus/threaded-render.d.ts +1 -0
  146. package/dist/types/sdk/bus/topic-registry.d.ts +33 -17
  147. package/dist/types/sdk/cli/rows.d.ts +2 -11
  148. package/dist/types/sdk/cli/session-cli.d.ts +15 -25
  149. package/dist/types/sdk/client/client.d.ts +97 -1
  150. package/dist/types/sdk/host/control/dispatch.d.ts +0 -7
  151. package/dist/types/sdk/host/control/index.d.ts +1 -1
  152. package/dist/types/sdk/host/control/operations.d.ts +18 -5
  153. package/dist/types/sdk/host/control/runtime-gate.d.ts +19 -0
  154. package/dist/types/sdk/host/host.d.ts +15 -1
  155. package/dist/types/sdk/host/query/handlers.d.ts +5 -0
  156. package/dist/types/sdk/host/reverse-leases.d.ts +1 -1
  157. package/dist/types/sdk/host/session-runtime.d.ts +127 -7
  158. package/dist/types/sdk/host/types.d.ts +1 -1
  159. package/dist/types/sdk/host/websocket-transport.d.ts +1 -1
  160. package/dist/types/sdk/index.d.ts +2 -1
  161. package/dist/types/sdk/lifecycle/broker-client.d.ts +8 -0
  162. package/dist/types/sdk/lifecycle/client.d.ts +59 -0
  163. package/dist/types/sdk/lifecycle/index.d.ts +3 -0
  164. package/dist/types/sdk/lifecycle/service.d.ts +232 -0
  165. package/dist/types/sdk/mcp/server.d.ts +9 -6
  166. package/dist/types/sdk/prompt-deadline-lease.d.ts +43 -0
  167. package/dist/types/sdk/prompt-deadline-manager.d.ts +28 -0
  168. package/dist/types/sdk/prompt-status.d.ts +10 -3
  169. package/dist/types/sdk/protocol/operation-registry.d.ts +5 -0
  170. package/dist/types/sdk/receipt-state.d.ts +17 -0
  171. package/dist/types/sdk/reconciliation-extensions.d.ts +2 -0
  172. package/dist/types/sdk/router/index.d.ts +1 -0
  173. package/dist/types/sdk/router/session-router.d.ts +152 -0
  174. package/dist/types/sdk/session-list.d.ts +22 -0
  175. package/dist/types/sdk/session-reconnect.d.ts +43 -1
  176. package/dist/types/sdk/session.d.ts +34 -1
  177. package/dist/types/sdk/transport/serve-cli.d.ts +1 -4
  178. package/dist/types/session/account-inventory.d.ts +86 -0
  179. package/dist/types/session/agent-session.d.ts +145 -6
  180. package/dist/types/session/agent-storage.d.ts +10 -0
  181. package/dist/types/session/coordinator-tool-label.d.ts +28 -0
  182. package/dist/types/session/internal/managed-session-storage.d.ts +23 -4
  183. package/dist/types/session/messages.d.ts +1 -1
  184. package/dist/types/session/secure-token-file.d.ts +3 -0
  185. package/dist/types/session/session-manager.d.ts +47 -1
  186. package/dist/types/session/startup-auth-config.d.ts +44 -0
  187. package/dist/types/session/terminal-abort.d.ts +378 -0
  188. package/dist/types/session/yield-queue.d.ts +7 -0
  189. package/dist/types/session-import/claude.d.ts +26 -0
  190. package/dist/types/session-import/codex.d.ts +88 -0
  191. package/dist/types/session-import/command.d.ts +35 -0
  192. package/dist/types/session-import/detect.d.ts +22 -0
  193. package/dist/types/session-import/index.d.ts +7 -0
  194. package/dist/types/session-import/provider-codex.d.ts +22 -0
  195. package/dist/types/session-import/provider-service.d.ts +38 -0
  196. package/dist/types/session-import/redact.d.ts +23 -0
  197. package/dist/types/session-import/service.d.ts +47 -0
  198. package/dist/types/session-import/types.d.ts +120 -0
  199. package/dist/types/setup/paseo/check.d.ts +16 -0
  200. package/dist/types/setup/paseo/install-saga.d.ts +115 -0
  201. package/dist/types/setup/paseo/json-publisher.d.ts +76 -0
  202. package/dist/types/setup/paseo/orchestration-preferences.d.ts +24 -0
  203. package/dist/types/setup/paseo/paseo-ownership.d.ts +87 -0
  204. package/dist/types/setup/paseo/paseo-setup.d.ts +29 -0
  205. package/dist/types/setup/paseo/provider-config.d.ts +35 -0
  206. package/dist/types/setup/paseo/remove.d.ts +14 -0
  207. package/dist/types/setup/paseo/result-types.d.ts +59 -0
  208. package/dist/types/setup/paseo/setup-deps.d.ts +73 -0
  209. package/dist/types/setup/paseo/skills-bridge.d.ts +44 -0
  210. package/dist/types/skill-state/active-state.d.ts +5 -1
  211. package/dist/types/slash-commands/acp-builtins.d.ts +5 -1
  212. package/dist/types/slash-commands/builtin-registry.d.ts +2 -0
  213. package/dist/types/slash-commands/helpers/credential-switch.d.ts +12 -0
  214. package/dist/types/slash-commands/helpers/usage-report.d.ts +5 -6
  215. package/dist/types/slash-commands/types.d.ts +7 -1
  216. package/dist/types/task/executor.d.ts +10 -0
  217. package/dist/types/task/index.d.ts +3 -1
  218. package/dist/types/tools/ask-answer-registry.d.ts +6 -3
  219. package/dist/types/tools/bash-sleep-advisory.d.ts +14 -0
  220. package/dist/types/tools/bash.d.ts +2 -6
  221. package/dist/types/tools/browser/attach.d.ts +11 -0
  222. package/dist/types/tools/browser/launch.d.ts +20 -0
  223. package/dist/types/tools/browser/profile-discovery.d.ts +6 -0
  224. package/dist/types/tools/browser/render.d.ts +1 -0
  225. package/dist/types/tools/browser.d.ts +3 -1
  226. package/dist/types/tools/image-gen.d.ts +10 -2
  227. package/dist/types/tools/index.d.ts +8 -0
  228. package/dist/types/tools/monitor.d.ts +1 -1
  229. package/dist/types/tools/skill-discovery.d.ts +8 -1
  230. package/dist/types/tools/subagent.d.ts +2 -0
  231. package/dist/types/tools/ultragoal-ask-guard.d.ts +2 -2
  232. package/dist/types/utils/herdr-pane.d.ts +76 -0
  233. package/package.json +19 -9
  234. package/scripts/build-binary.ts +2 -1
  235. package/scripts/build-sdk-package-smoke.ts +2 -13
  236. package/scripts/capture-sticky-viewport-showcase.ts +0 -1
  237. package/scripts/compile-args.ts +2 -0
  238. package/scripts/generate-sdk-adapter-parity-manifest.ts +31 -16
  239. package/scripts/generate-sdk-operation-inventory.ts +28 -0
  240. package/scripts/generate-telegram-baseline-manifest.ts +1 -0
  241. package/scripts/generate-tool-catalog.ts +6 -4
  242. package/scripts/verify-gjc-sdk-canonicalization.ts +5 -39
  243. package/src/async/job-manager.ts +352 -17
  244. package/src/async/support.ts +25 -0
  245. package/src/autoresearch/dashboard.ts +28 -13
  246. package/src/capability/index.ts +3 -1
  247. package/src/capability/mcp.ts +6 -0
  248. package/src/capability/types.ts +6 -0
  249. package/src/cli/accounts-cli.ts +395 -0
  250. package/src/cli/args.ts +23 -0
  251. package/src/cli/auth-broker-cli.ts +136 -66
  252. package/src/cli/auth-gateway-cli.ts +94 -70
  253. package/src/cli/config-cli.ts +27 -2
  254. package/src/cli/crash-cli.ts +78 -0
  255. package/src/cli/customize-doctor.ts +1605 -0
  256. package/src/cli/daemon-cli.ts +12 -3
  257. package/src/cli/fast-help.ts +1 -0
  258. package/src/cli/mcp-cli.ts +128 -60
  259. package/src/cli/notify-cli.ts +8 -14
  260. package/src/cli/root-flags.ts +8 -0
  261. package/src/cli/setup-cli.ts +145 -0
  262. package/src/cli/skills-cli.ts +38 -2
  263. package/src/cli/update-cli.ts +167 -12
  264. package/src/cli.ts +4 -0
  265. package/src/commands/accounts.ts +71 -0
  266. package/src/commands/crash.ts +35 -0
  267. package/src/commands/customize.ts +84 -0
  268. package/src/commands/daemon.ts +2 -2
  269. package/src/commands/deep-interview.ts +2 -0
  270. package/src/commands/launch.ts +1 -0
  271. package/src/commands/mcp.ts +12 -7
  272. package/src/commands/ralplan.ts +2 -0
  273. package/src/commands/sdk.ts +65 -32
  274. package/src/commands/setup.ts +5 -0
  275. package/src/commands/skills.ts +14 -4
  276. package/src/commands/ultragoal.ts +10 -1
  277. package/src/commands/update.ts +26 -15
  278. package/src/config/atomic-yaml-patch-worker.ts +57 -0
  279. package/src/config/atomic-yaml-patch.ts +769 -29
  280. package/src/config/config-schema-version.ts +10 -0
  281. package/src/config/file-lock.ts +70 -1
  282. package/src/config/mcp-schema.json +52 -14
  283. package/src/config/model-profile-activation.ts +23 -2
  284. package/src/config/model-profiles.ts +88 -21
  285. package/src/config/model-registry.ts +147 -21
  286. package/src/config/models-config-schema.ts +1 -1
  287. package/src/config/settings-schema.ts +77 -7
  288. package/src/config/settings.ts +4038 -199
  289. package/src/config/skill-settings-defaults.ts +41 -3
  290. package/src/config/task-delegation.ts +87 -0
  291. package/src/config/update-channel.ts +23 -0
  292. package/src/coordinator-mcp/server.ts +377 -308
  293. package/src/crash/index-store.ts +723 -0
  294. package/src/crash/nudge.ts +89 -0
  295. package/src/crash/record-loader.ts +149 -0
  296. package/src/crash/report.ts +551 -0
  297. package/src/crash/sanitize.ts +129 -0
  298. package/src/cursor.ts +36 -10
  299. package/src/customization/import.ts +946 -0
  300. package/src/customization/index.ts +4 -0
  301. package/src/customization/inventory.ts +335 -0
  302. package/src/customization/mutations.ts +141 -0
  303. package/src/customization/types.ts +223 -0
  304. package/src/daemon/control-types.ts +8 -1
  305. package/src/daemon/operator-contract.ts +6 -6
  306. package/src/defaults/gjc/extensions/grok-cli-vendor/src/models/catalog.ts +31 -6
  307. package/src/defaults/gjc/skills/deep-interview/SKILL.md +11 -22
  308. package/src/defaults/gjc/skills/ralplan/SKILL.md +36 -23
  309. package/src/defaults/gjc/skills/ultragoal/SKILL.md +16 -0
  310. package/src/discovery/claude-hooks.ts +38 -0
  311. package/src/discovery/claude.ts +142 -209
  312. package/src/discovery/codex-hooks.ts +38 -0
  313. package/src/discovery/codex.ts +132 -198
  314. package/src/discovery/helpers.ts +8 -1
  315. package/src/discovery/index.ts +2 -0
  316. package/src/discovery/mcp-compat.ts +234 -0
  317. package/src/discovery/mcp-json.ts +6 -0
  318. package/src/edit/renderer.ts +40 -0
  319. package/src/edit/streaming.ts +4 -2
  320. package/src/exec/bash-executor.ts +24 -20
  321. package/src/export/html/index.ts +51 -2
  322. package/src/extensibility/extensions/loader.ts +9 -1
  323. package/src/extensibility/extensions/runner.ts +17 -4
  324. package/src/extensibility/extensions/types.ts +31 -6
  325. package/src/extensibility/gjc-plugins/constrained-hooks.ts +33 -0
  326. package/src/extensibility/gjc-plugins/installer.ts +9 -5
  327. package/src/extensibility/gjc-plugins/observability.ts +8 -2
  328. package/src/extensibility/gjc-plugins/registry.ts +13 -2
  329. package/src/extensibility/gjc-plugins/runtime-adapters.ts +3 -1
  330. package/src/extensibility/gjc-plugins/schema.ts +222 -39
  331. package/src/extensibility/hooks/loader.ts +154 -10
  332. package/src/extensibility/runtime-skill-discovery.ts +257 -60
  333. package/src/extensibility/skill-management.ts +368 -0
  334. package/src/extensibility/skills.ts +52 -16
  335. package/src/gjc-runtime/deep-interview-runtime.ts +45 -61
  336. package/src/gjc-runtime/launch-worktree.ts +56 -2
  337. package/src/gjc-runtime/linux-proc.ts +7 -1
  338. package/src/gjc-runtime/ralplan-runtime.ts +100 -164
  339. package/src/gjc-runtime/session-state-lock.ts +992 -0
  340. package/src/gjc-runtime/session-state-sidecar.ts +644 -142
  341. package/src/gjc-runtime/state-writer.ts +39 -14
  342. package/src/gjc-runtime/tmux-owner-isolation.ts +5 -4
  343. package/src/gjc-runtime/ultragoal-guard.ts +11 -4
  344. package/src/gjc-runtime/ultragoal-runtime.ts +44 -41
  345. package/src/gjc-runtime/workflow-settings.ts +596 -0
  346. package/src/goals/tools/goal-tool.ts +6 -1
  347. package/src/hooks/events.ts +291 -0
  348. package/src/hooks/native-skill-hook.ts +4 -0
  349. package/src/hooks/normalize.ts +369 -0
  350. package/src/hooks/skill-state.ts +165 -46
  351. package/src/internal-urls/docs-index.generated.ts +41 -32
  352. package/src/main.ts +36 -5
  353. package/src/migrate/mcp-mapper.ts +25 -2
  354. package/src/modes/acp/abort-scope.ts +29 -0
  355. package/src/modes/acp/acp-agent.ts +423 -98
  356. package/src/modes/components/assistant-message.ts +6 -1
  357. package/src/modes/components/chrome.ts +4 -3
  358. package/src/modes/components/customization/customization-dashboard.ts +443 -0
  359. package/src/modes/components/customization/import-wizard.ts +372 -0
  360. package/src/modes/components/customization/index.ts +1 -0
  361. package/src/modes/components/dynamic-theme-text.ts +22 -0
  362. package/src/modes/components/gajae-pet-widget.ts +607 -193
  363. package/src/modes/components/irc-sidebar.ts +11 -0
  364. package/src/modes/components/iterm-pet-transport.ts +585 -0
  365. package/src/modes/components/model-selector.ts +1 -6
  366. package/src/modes/components/oauth-selector.ts +277 -86
  367. package/src/modes/components/pet-capability.ts +35 -31
  368. package/src/modes/components/settings-selector.ts +29 -5
  369. package/src/modes/components/status-line/gh.ts +45 -1
  370. package/src/modes/components/status-line/segments.ts +19 -4
  371. package/src/modes/components/tool-status-header.ts +13 -3
  372. package/src/modes/controllers/command-controller.ts +20 -8
  373. package/src/modes/controllers/extension-ui-controller.ts +56 -257
  374. package/src/modes/controllers/input-controller.ts +10 -0
  375. package/src/modes/controllers/runtime-mcp-command-controller.ts +16 -3
  376. package/src/modes/controllers/selector-controller.ts +238 -77
  377. package/src/modes/controllers/stt-controller.ts +3 -3
  378. package/src/modes/interactive-mode.ts +88 -16
  379. package/src/modes/print-mode.ts +35 -6
  380. package/src/modes/runtime-init.ts +21 -68
  381. package/src/modes/theme/defaults/index.ts +2 -0
  382. package/src/modes/theme/defaults/ouroboros.json +118 -0
  383. package/src/modes/types.ts +1 -0
  384. package/src/modes/utils/injected-user-submission.ts +25 -0
  385. package/src/modes/utils/terminal-bell.ts +15 -1
  386. package/src/prompts/agent-fragments/ralplan-persistence.md +1 -1
  387. package/src/prompts/agent-fragments/restricted-bash.md +1 -1
  388. package/src/prompts/agents/critic.md +1 -1
  389. package/src/prompts/system/rlm-research.md +1 -1
  390. package/src/prompts/system/system-prompt.md +0 -2
  391. package/src/prompts/tools/bash.md +7 -1
  392. package/src/prompts/tools/browser.md +1 -1
  393. package/src/prompts/tools/cron.md +6 -6
  394. package/src/prompts/tools/read.md +0 -2
  395. package/src/prompts/tools/skill-discovery.md +4 -2
  396. package/src/runtime-mcp/client.ts +427 -23
  397. package/src/runtime-mcp/config.ts +37 -5
  398. package/src/runtime-mcp/manager-pool.test.ts +56 -0
  399. package/src/runtime-mcp/manager.ts +52 -2
  400. package/src/runtime-mcp/oauth-discovery.ts +13 -0
  401. package/src/runtime-mcp/oauth-flow.ts +46 -1
  402. package/src/runtime-mcp/pool-key.ts +5 -1
  403. package/src/runtime-mcp/pool.test.ts +9 -0
  404. package/src/runtime-mcp/protocol.test.ts +353 -0
  405. package/src/runtime-mcp/protocol.ts +624 -0
  406. package/src/runtime-mcp/scope-config.ts +78 -0
  407. package/src/runtime-mcp/tool-bridge.ts +44 -10
  408. package/src/runtime-mcp/transports/http.ts +84 -13
  409. package/src/runtime-mcp/types.ts +123 -12
  410. package/src/sdk/acp/adapter.ts +328 -97
  411. package/src/sdk/broker/broker.ts +160 -741
  412. package/src/sdk/broker/ensure.ts +9 -1
  413. package/src/sdk/broker/lifecycle.ts +510 -116
  414. package/src/sdk/broker/operation-receipt-ledger.ts +11 -2
  415. package/src/sdk/broker/process-incarnation.ts +19 -0
  416. package/src/sdk/broker/session-index.ts +516 -117
  417. package/src/sdk/broker/startup-failure.ts +28 -5
  418. package/src/sdk/broker/transport.ts +1 -13
  419. package/src/sdk/bus/chat-daemon-cli.ts +4 -2
  420. package/src/sdk/bus/chat-daemon-control.ts +67 -6
  421. package/src/sdk/bus/chat-daemon-runtime.ts +183 -859
  422. package/src/sdk/bus/config.ts +13 -0
  423. package/src/sdk/bus/conversation-store.ts +59 -171
  424. package/src/sdk/bus/daemon-paths.ts +20 -0
  425. package/src/sdk/bus/discord-conversation.ts +2 -0
  426. package/src/sdk/bus/discord-daemon.ts +524 -126
  427. package/src/sdk/bus/discord-live-provider.ts +206 -79
  428. package/src/sdk/bus/existing-thread-readiness.ts +4 -97
  429. package/src/sdk/bus/inbound-reaction-ordering.ts +122 -0
  430. package/src/sdk/bus/index.ts +2480 -456
  431. package/src/sdk/bus/kind-aware-reconciliation.ts +204 -34
  432. package/src/sdk/bus/lifecycle-commands.ts +2 -2
  433. package/src/sdk/bus/managed-daemon.ts +2 -145
  434. package/src/sdk/bus/notification-service.ts +196 -0
  435. package/src/sdk/bus/operator-runtime.ts +1 -1
  436. package/src/sdk/bus/prompt-reconciliation.ts +24 -15
  437. package/src/sdk/bus/reconciliation-store.ts +553 -24
  438. package/src/sdk/bus/session-control.ts +49 -3
  439. package/src/sdk/bus/slack-conversation.ts +4 -0
  440. package/src/sdk/bus/slack-daemon.ts +733 -134
  441. package/src/sdk/bus/slack-live-provider.ts +65 -15
  442. package/src/sdk/bus/slack-provider.ts +4 -0
  443. package/src/sdk/bus/slack-thread-binding.ts +9 -104
  444. package/src/sdk/bus/telegram-adoption-intent.ts +299 -209
  445. package/src/sdk/bus/telegram-daemon-cli.ts +194 -7
  446. package/src/sdk/bus/telegram-daemon-contract.ts +265 -19
  447. package/src/sdk/bus/telegram-daemon-control.ts +3 -13
  448. package/src/sdk/bus/telegram-daemon-orphan-reap.ts +498 -0
  449. package/src/sdk/bus/telegram-daemon-owner-registry.ts +176 -0
  450. package/src/sdk/bus/telegram-daemon.ts +2552 -2280
  451. package/src/sdk/bus/telegram-reference.ts +1 -226
  452. package/src/sdk/bus/telegram-setup.ts +2 -2
  453. package/src/sdk/bus/threaded-render.ts +1 -0
  454. package/src/sdk/bus/topic-registry.ts +279 -146
  455. package/src/sdk/cli/rows.ts +2 -35
  456. package/src/sdk/cli/session-cli.ts +776 -700
  457. package/src/sdk/client/client.ts +892 -1
  458. package/src/sdk/host/control/dispatch.ts +93 -58
  459. package/src/sdk/host/control/index.ts +1 -1
  460. package/src/sdk/host/control/operations.ts +18 -10
  461. package/src/sdk/host/control/runtime-gate.ts +40 -0
  462. package/src/sdk/host/host.ts +63 -12
  463. package/src/sdk/host/query/handlers.ts +66 -7
  464. package/src/sdk/host/reverse-leases.ts +2 -2
  465. package/src/sdk/host/sdk-surface-parity.test.ts +1 -1
  466. package/src/sdk/host/session-runtime.test.ts +2787 -34
  467. package/src/sdk/host/session-runtime.ts +1489 -101
  468. package/src/sdk/host/surface-policy.ts +12 -8
  469. package/src/sdk/host/types.ts +1 -1
  470. package/src/sdk/host/websocket-transport.lifecycle.test.ts +31 -59
  471. package/src/sdk/host/websocket-transport.ts +85 -50
  472. package/src/sdk/index.ts +2 -1
  473. package/src/sdk/lifecycle/broker-client.ts +53 -0
  474. package/src/sdk/lifecycle/client.ts +234 -0
  475. package/src/sdk/lifecycle/index.ts +3 -0
  476. package/src/sdk/{bus/recent-activity.ts → lifecycle/recent-sessions.ts} +5 -2
  477. package/src/sdk/lifecycle/service.ts +720 -0
  478. package/src/sdk/mcp/server.ts +226 -188
  479. package/src/sdk/prompt-deadline-lease.ts +55 -0
  480. package/src/sdk/prompt-deadline-manager.ts +148 -0
  481. package/src/sdk/prompt-status.ts +11 -3
  482. package/src/sdk/protocol/operation-inventory.generated.json +272 -129
  483. package/src/sdk/protocol/operation-registry.ts +71 -8
  484. package/src/sdk/receipt-state.ts +43 -0
  485. package/src/sdk/reconciliation-extensions.ts +14 -0
  486. package/src/sdk/router/index.ts +1 -0
  487. package/src/sdk/router/session-router.ts +1658 -0
  488. package/src/sdk/session-list.ts +93 -0
  489. package/src/sdk/session-reconnect.ts +45 -1
  490. package/src/sdk/session.ts +716 -120
  491. package/src/sdk/transport/serve-cli.ts +18 -34
  492. package/src/session/account-inventory.ts +603 -0
  493. package/src/session/agent-session.ts +2873 -559
  494. package/src/session/agent-storage.ts +35 -0
  495. package/src/session/blob-store.ts +32 -1
  496. package/src/session/coordinator-tool-label.ts +40 -0
  497. package/src/session/internal/managed-session-scope.ts +4 -0
  498. package/src/session/internal/managed-session-storage.ts +199 -31
  499. package/src/session/messages.ts +1 -1
  500. package/src/session/secure-token-file.ts +80 -0
  501. package/src/session/session-manager.ts +757 -57
  502. package/src/session/session-storage.ts +25 -16
  503. package/src/session/startup-auth-config.ts +297 -0
  504. package/src/session/terminal-abort.ts +1253 -0
  505. package/src/session/yield-queue.ts +57 -15
  506. package/src/session-import/claude.ts +334 -0
  507. package/src/session-import/codex.ts +1033 -0
  508. package/src/session-import/command.ts +77 -0
  509. package/src/session-import/detect.ts +133 -0
  510. package/src/session-import/index.ts +7 -0
  511. package/src/session-import/provider-codex.ts +327 -0
  512. package/src/session-import/provider-service.ts +457 -0
  513. package/src/session-import/redact.ts +128 -0
  514. package/src/session-import/service.ts +1264 -0
  515. package/src/session-import/types.ts +148 -0
  516. package/src/setup/paseo/check.ts +213 -0
  517. package/src/setup/paseo/install-saga.ts +293 -0
  518. package/src/setup/paseo/json-publisher.ts +263 -0
  519. package/src/setup/paseo/orchestration-preferences.ts +86 -0
  520. package/src/setup/paseo/paseo-ownership.ts +224 -0
  521. package/src/setup/paseo/paseo-setup.ts +253 -0
  522. package/src/setup/paseo/provider-config.ts +139 -0
  523. package/src/setup/paseo/remove.ts +183 -0
  524. package/src/setup/paseo/result-types.ts +79 -0
  525. package/src/setup/paseo/setup-deps.ts +175 -0
  526. package/src/setup/paseo/skills-bridge.ts +260 -0
  527. package/src/skill-state/active-state.ts +21 -11
  528. package/src/slash-commands/acp-builtins.ts +9 -1
  529. package/src/slash-commands/builtin-registry.ts +117 -19
  530. package/src/slash-commands/helpers/credential-switch.ts +143 -0
  531. package/src/slash-commands/helpers/mcp.ts +9 -3
  532. package/src/slash-commands/helpers/usage-report.ts +61 -56
  533. package/src/slash-commands/types.ts +7 -2
  534. package/src/task/executor.ts +30 -11
  535. package/src/task/index.ts +66 -7
  536. package/src/task/render.ts +23 -9
  537. package/src/tools/ask-answer-registry.ts +23 -7
  538. package/src/tools/ask.ts +8 -4
  539. package/src/tools/bash-sleep-advisory.ts +115 -0
  540. package/src/tools/bash.ts +98 -18
  541. package/src/tools/browser/attach.ts +71 -3
  542. package/src/tools/browser/launch.ts +86 -13
  543. package/src/tools/browser/profile-discovery.ts +57 -7
  544. package/src/tools/browser/render.ts +8 -1
  545. package/src/tools/browser.ts +130 -21
  546. package/src/tools/computer.enforcement.test.ts +1 -1
  547. package/src/tools/computer.ts +3 -2
  548. package/src/tools/cron.ts +12 -1
  549. package/src/tools/image-gen.ts +349 -142
  550. package/src/tools/index.ts +8 -0
  551. package/src/tools/job.ts +33 -6
  552. package/src/tools/monitor.ts +41 -2
  553. package/src/tools/skill-discovery.ts +21 -29
  554. package/src/tools/subagent.ts +142 -24
  555. package/src/tools/todo-contract.ts +55 -3
  556. package/src/tools/todo-write.ts +4 -3
  557. package/src/tools/tool-catalog.generated.ts +6 -6
  558. package/src/tools/ultragoal-ask-guard.ts +10 -3
  559. package/src/utils/herdr-pane.ts +345 -0
  560. package/src/utils/title-generator.ts +2 -0
  561. package/src/web/scrapers/index.ts +6 -4
  562. package/dist/types/cli/malloc-env-guard.test.d.ts +0 -1
  563. package/dist/types/defaults/gjc-defaults.test.d.ts +0 -1
  564. package/dist/types/memory-backend/lazy-loading.test.d.ts +0 -1
  565. package/dist/types/runtime/boot-ordering.test.d.ts +0 -1
  566. package/dist/types/runtime/lazy-service.test.d.ts +0 -1
  567. package/dist/types/runtime/network-prewarm-service.test.d.ts +0 -1
  568. package/dist/types/runtime/workspace-tree-service.test.d.ts +0 -1
  569. package/dist/types/runtime-mcp/config.test.d.ts +0 -1
  570. package/dist/types/runtime-mcp/http.test.d.ts +0 -1
  571. package/dist/types/runtime-mcp/manager-pool.test.d.ts +0 -1
  572. package/dist/types/runtime-mcp/pool-key.test.d.ts +0 -1
  573. package/dist/types/runtime-mcp/pool.test.d.ts +0 -1
  574. package/dist/types/sdk/bus/lifecycle-control-runtime.d.ts +0 -117
  575. package/dist/types/sdk/bus/lifecycle-orchestrator.d.ts +0 -141
  576. package/dist/types/sdk/bus/telegram-cli.d.ts +0 -31
  577. package/dist/types/sdk/elevation/allowlist.d.ts +0 -20
  578. package/dist/types/sdk/elevation/audit.d.ts +0 -93
  579. package/dist/types/sdk/elevation/capability.d.ts +0 -3
  580. package/dist/types/sdk/elevation/digest.d.ts +0 -72
  581. package/dist/types/sdk/elevation/dispatch-receipt.d.ts +0 -85
  582. package/dist/types/sdk/elevation/grant-ledger.d.ts +0 -163
  583. package/dist/types/sdk/elevation/owner.d.ts +0 -48
  584. package/dist/types/sdk/host/import-graph.test.d.ts +0 -1
  585. package/dist/types/sdk/host/sdk-surface-parity.test.d.ts +0 -1
  586. package/dist/types/sdk/host/session-runtime.test.d.ts +0 -1
  587. package/dist/types/sdk/host/websocket-transport.lifecycle.test.d.ts +0 -1
  588. package/dist/types/session/auth-broker-config.d.ts +0 -13
  589. package/dist/types/session/heap-eviction-artifacts.test.d.ts +0 -1
  590. package/dist/types/skills/skills.test.d.ts +0 -1
  591. package/dist/types/slash-commands/notify-command.test.d.ts +0 -1
  592. package/dist/types/task/token-log.test.d.ts +0 -1
  593. package/dist/types/tools/computer.enforcement.test.d.ts +0 -1
  594. package/dist/types/tools/descriptors.test.d.ts +0 -1
  595. package/scripts/g005-daemon-smoke.ts +0 -180
  596. package/scripts/g011-daemon-path-smoke.ts +0 -153
  597. package/src/sdk/bus/lifecycle-control-runtime.ts +0 -1733
  598. package/src/sdk/bus/lifecycle-orchestrator.ts +0 -489
  599. package/src/sdk/bus/telegram-cli.ts +0 -212
  600. package/src/sdk/elevation/allowlist.ts +0 -54
  601. package/src/sdk/elevation/audit.ts +0 -208
  602. package/src/sdk/elevation/capability.ts +0 -41
  603. package/src/sdk/elevation/digest.ts +0 -129
  604. package/src/sdk/elevation/dispatch-receipt.ts +0 -184
  605. package/src/sdk/elevation/grant-ledger.ts +0 -1142
  606. package/src/sdk/elevation/owner.ts +0 -109
  607. package/src/session/auth-broker-config.ts +0 -109
  608. /package/dist/types/{ai-core-import-gate.test.d.ts → discovery/claude-hooks.d.ts} +0 -0
  609. /package/dist/types/{cli/fixture-report.test.d.ts → discovery/codex-hooks.d.ts} +0 -0
  610. /package/dist/types/sdk/{bus/recent-activity.d.ts → lifecycle/recent-sessions.d.ts} +0 -0
@@ -0,0 +1,253 @@
1
+ /**
2
+ * Top-level orchestration for `gjc setup paseo`.
3
+ *
4
+ * Dispatches to diagnosis, install, or removal, and owns the flag combinations
5
+ * that must be rejected before any target is touched.
6
+ */
7
+ import { Settings } from "../../config/settings";
8
+ import { checkPaseoSetup } from "./check";
9
+ import { type CompletedStep, compensate, receiptStep, recoverIntent, runJsonStep, SagaStepError } from "./install-saga";
10
+ import { PaseoPublishError, readTarget } from "./json-publisher";
11
+ import { createOrchestrationSeed, removeSeededRoles } from "./orchestration-preferences";
12
+ import { readProvenance, writeProvenance } from "./paseo-ownership";
13
+ import {
14
+ buildProviderEntry,
15
+ createProviderMutation,
16
+ hasProviderConflict,
17
+ providerEntryHash,
18
+ providerKeyFor,
19
+ resolveGjcCommand,
20
+ } from "./provider-config";
21
+ import { removePaseoSetup } from "./remove";
22
+ import type { PaseoInstallResult, PaseoRemoveResult, SetupCheckResult } from "./result-types";
23
+ import type { PaseoSetupDependencies } from "./setup-deps";
24
+ import {
25
+ installSkillsBridge,
26
+ inverseSkillsBridge,
27
+ preflightSkillsBridge,
28
+ registerSkillsBridgeDirectory,
29
+ } from "./skills-bridge";
30
+
31
+ export interface PaseoSetupFlags {
32
+ readonly check?: boolean;
33
+ readonly json?: boolean;
34
+ readonly force?: boolean;
35
+ readonly remove?: boolean;
36
+ readonly mpreset?: string;
37
+ }
38
+
39
+ export class PaseoSetupUsageError extends Error {
40
+ constructor(message: string) {
41
+ super(message);
42
+ this.name = "PaseoSetupUsageError";
43
+ }
44
+ }
45
+
46
+ export type PaseoSetupOutcome =
47
+ | { readonly kind: "check"; readonly result: SetupCheckResult }
48
+ | { readonly kind: "install"; readonly result: PaseoInstallResult }
49
+ | { readonly kind: "remove"; readonly result: PaseoRemoveResult };
50
+
51
+ /**
52
+ * Reject flag combinations that have no coherent meaning.
53
+ *
54
+ * Rejected before any read or write so a misuse can never leave partial state.
55
+ */
56
+ export function assertUsableFlags(flags: PaseoSetupFlags): void {
57
+ if (flags.check && flags.remove) {
58
+ throw new PaseoSetupUsageError(
59
+ "--check and --remove cannot be combined: --check only reports, --remove mutates.",
60
+ );
61
+ }
62
+ if (flags.mpreset !== undefined && flags.mpreset.trim() === "") {
63
+ throw new PaseoSetupUsageError("--mpreset requires a preset name.");
64
+ }
65
+ }
66
+
67
+ export async function runPaseoSetup(flags: PaseoSetupFlags, deps: PaseoSetupDependencies): Promise<PaseoSetupOutcome> {
68
+ assertUsableFlags(flags);
69
+
70
+ if (flags.check) {
71
+ const result = await checkPaseoSetup(deps, { mpreset: flags.mpreset, force: flags.force });
72
+ return { kind: "check", result };
73
+ }
74
+
75
+ if (flags.remove) {
76
+ const settings = await Settings.init();
77
+ const result = await removePaseoSetup(deps, {
78
+ now: deps.now(),
79
+ unregisterBridgeDirectory: async () => {
80
+ await unregisterBridgeDirectory(settings, deps.paths.bridgeDir);
81
+ },
82
+ });
83
+ return { kind: "remove", result };
84
+ }
85
+
86
+ return { kind: "install", result: await installPaseoSetup(flags, deps) };
87
+ }
88
+
89
+ /**
90
+ * Run the four-step install saga.
91
+ *
92
+ * Preflight happens first and is entirely read-only, so the common failure
93
+ * cases (unparseable config, a conflicting entry, an unresolvable executable, a
94
+ * foreign file sitting at one of our bridge names) all abort before anything is
95
+ * written and therefore need no compensation.
96
+ */
97
+ async function installPaseoSetup(flags: PaseoSetupFlags, deps: PaseoSetupDependencies): Promise<PaseoInstallResult> {
98
+ const now = deps.now();
99
+
100
+ // An interrupted earlier run must be settled before starting a new one. A
101
+ // discardable intent is cleared here; a `complete-ledger` intent whose ledger
102
+ // contents are unknown to this run is reported rather than guessed at, and
103
+ // the steps below re-derive and commit the same provenance anyway.
104
+ const recovery = await recoverIntent(deps.paths.intentRecord, { repair: true });
105
+ if (recovery && !recovery.recovered) {
106
+ return {
107
+ outcome: "partial-install",
108
+ compensated: [],
109
+ uncompensated: [deps.paths.intentRecord],
110
+ evidence: { failedStep: "intent-recovery", detail: recovery.detail, retained: [deps.paths.intentRecord] },
111
+ };
112
+ }
113
+
114
+ const resolution = resolveGjcCommand();
115
+ if (!resolution.ok) {
116
+ throw new PaseoSetupUsageError(
117
+ `Cannot register GJC with Paseo: ${resolution.detail}. Paseo needs an absolute command path, so GJC will not write a bare 'gjc' string.`,
118
+ );
119
+ }
120
+
121
+ const providerKey = providerKeyFor(flags.mpreset);
122
+ const entry = buildProviderEntry(resolution.command, flags.mpreset);
123
+
124
+ const config = await readTarget(deps.paths.configJson);
125
+ const conflict = hasProviderConflict(config.parsed, providerKey, entry);
126
+ if (conflict.conflict && !flags.force) {
127
+ throw new PaseoSetupUsageError(`${conflict.detail} Re-run with --force to overwrite it.`);
128
+ }
129
+
130
+ const preferences = await readTarget(deps.paths.orchestrationPreferences);
131
+ const seed = createOrchestrationSeed(preferences.parsed);
132
+ const bridgePreflight = await preflightSkillsBridge(deps);
133
+
134
+ const completed: CompletedStep[] = [];
135
+ const changed: string[] = [];
136
+ const entryHash = providerEntryHash(entry);
137
+
138
+ try {
139
+ // Step 1: provider entry + provider-key provenance.
140
+ const step1 = await runJsonStep({
141
+ label: deps.paths.configJson,
142
+ step: "provider-config",
143
+ targetPath: deps.paths.configJson,
144
+ provenancePath: deps.paths.provenanceLedger,
145
+ intentPath: deps.paths.intentRecord,
146
+ ownedKeys: [`agents.providers.${providerKey}`],
147
+ mutate: createProviderMutation(config, providerKey, entry),
148
+ nextLedger: ledger => ({ ...ledger, providerKeys: { ...ledger.providerKeys, [providerKey]: entryHash } }),
149
+ revert: draft => removeProviderKey(draft, providerKey),
150
+ revertLedger: ledger => {
151
+ const providerKeys = { ...ledger.providerKeys };
152
+ delete providerKeys[providerKey];
153
+ return { ...ledger, providerKeys };
154
+ },
155
+ now,
156
+ });
157
+ completed.push(step1.completed);
158
+ if (step1.changed) changed.push(deps.paths.configJson);
159
+
160
+ // Step 2: seed empty orchestration roles only.
161
+ if (seed.seededKeys.length > 0) {
162
+ const step2 = await runJsonStep({
163
+ label: deps.paths.orchestrationPreferences,
164
+ step: "orchestration-preferences",
165
+ targetPath: deps.paths.orchestrationPreferences,
166
+ provenancePath: deps.paths.provenanceLedger,
167
+ intentPath: deps.paths.intentRecord,
168
+ ownedKeys: [...seed.seededKeys],
169
+ mutate: seed.mutate,
170
+ nextLedger: ledger => ({
171
+ ...ledger,
172
+ seededOrchestrationKeys: { ...ledger.seededOrchestrationKeys, ...seed.seededValues },
173
+ }),
174
+ // Compensation must reach the same nested map the forward step wrote.
175
+ revert: draft => removeSeededRoles(draft, seed.seededKeys, () => true),
176
+ revertLedger: ledger => {
177
+ const seededOrchestrationKeys = { ...ledger.seededOrchestrationKeys };
178
+ for (const key of seed.seededKeys) delete seededOrchestrationKeys[key];
179
+ return { ...ledger, seededOrchestrationKeys };
180
+ },
181
+ now,
182
+ });
183
+ completed.push(step2.completed);
184
+ if (step2.changed) changed.push(deps.paths.orchestrationPreferences);
185
+ }
186
+
187
+ // Step 3: the symlink bridge.
188
+ const bridge = await installSkillsBridge(bridgePreflight);
189
+ if (bridge.createdEntries.length > 0 || bridge.bridgeDirCreated) {
190
+ changed.push(deps.paths.bridgeDir);
191
+ const ledger = await readProvenance(deps.paths.provenanceLedger);
192
+ await writeProvenance(deps.paths.provenanceLedger, {
193
+ ...ledger,
194
+ bridgePath: deps.paths.bridgeDir,
195
+ bridgeEntries: [...bridge.createdEntries],
196
+ bridgeDirCreated: bridge.bridgeDirCreated,
197
+ });
198
+ completed.push({
199
+ label: deps.paths.bridgeDir,
200
+ undo: async () => {
201
+ try {
202
+ await inverseSkillsBridge(deps, bridge);
203
+ return { status: "reverted" as const };
204
+ } catch (error) {
205
+ return {
206
+ status: "conflict" as const,
207
+ detail: error instanceof Error ? error.message : String(error),
208
+ retained: [deps.paths.bridgeDir],
209
+ };
210
+ }
211
+ },
212
+ });
213
+ }
214
+
215
+ // Step 4: register the bridge with GJC skill discovery.
216
+ const settings = await Settings.init();
217
+ const receipt = await registerSkillsBridgeDirectory(settings, deps.paths.bridgeDir);
218
+ completed.push(receiptStep("config.yml skills.customDirectories", receipt));
219
+ changed.push("config.yml skills.customDirectories");
220
+ } catch (error) {
221
+ const failure =
222
+ error instanceof SagaStepError
223
+ ? error
224
+ : new SagaStepError(
225
+ "install",
226
+ error instanceof PaseoPublishError || error instanceof Error ? error.message : String(error),
227
+ );
228
+ const outcome = await compensate(completed, failure);
229
+ return { outcome: "partial-install", ...outcome };
230
+ }
231
+
232
+ return { outcome: "installed", changed };
233
+ }
234
+
235
+ function removeProviderKey(draft: Record<string, unknown>, providerKey: string): void {
236
+ const agents = draft.agents;
237
+ if (!agents || typeof agents !== "object" || Array.isArray(agents)) return;
238
+ const providers = (agents as Record<string, unknown>).providers;
239
+ if (!providers || typeof providers !== "object" || Array.isArray(providers)) return;
240
+ delete (providers as Record<string, unknown>)[providerKey];
241
+ }
242
+
243
+ async function unregisterBridgeDirectory(settings: Settings, bridgeDir: string): Promise<void> {
244
+ await settings.commitAtomicBatchWithCurrent(current => {
245
+ const skills = current.skills;
246
+ if (!skills || typeof skills !== "object" || Array.isArray(skills)) return [];
247
+ const directories = (skills as Record<string, unknown>).customDirectories;
248
+ if (!Array.isArray(directories)) return [];
249
+ const next = directories.filter(directory => directory !== bridgeDir);
250
+ if (next.length === directories.length) return [];
251
+ return [{ path: "skills.customDirectories", op: "set", value: next }];
252
+ });
253
+ }
@@ -0,0 +1,139 @@
1
+ import * as fs from "node:fs";
2
+ import * as path from "node:path";
3
+ import { $which } from "@gajae-code/utils";
4
+ import { type BuildChannel, resolveBuildMetadata } from "../../build-metadata";
5
+ import { hashBytes, type ReadTargetResult } from "./json-publisher";
6
+ import { PROVIDER_EXTENDS, PROVIDER_KEY } from "./setup-deps";
7
+
8
+ const PROVIDER_LABEL = "Gajae Code";
9
+
10
+ export interface PaseoProviderEntry {
11
+ extends: string;
12
+ label: string;
13
+ command: string[];
14
+ env: Record<string, string>;
15
+ enabled: boolean;
16
+ }
17
+
18
+ export type GjcCommandResolution =
19
+ | { readonly ok: true; readonly command: string[]; readonly channel: BuildChannel }
20
+ | { readonly ok: false; readonly channel: BuildChannel; readonly detail: string };
21
+
22
+ export type ProviderConflict =
23
+ | { readonly conflict: false }
24
+ | { readonly conflict: true; readonly subject: string; readonly detail: string };
25
+
26
+ /** Resolve an executable from PATH without ever returning its bare command name. */
27
+ function resolveViaPath(name: string): string | undefined {
28
+ return $which(name) ?? undefined;
29
+ }
30
+
31
+ export function resolveGjcCommand(): GjcCommandResolution {
32
+ const metadata = resolveBuildMetadata();
33
+ switch (metadata.channel) {
34
+ case "release":
35
+ case "dev":
36
+ case "compiled":
37
+ return { ok: true, command: [process.execPath, "acp"], channel: metadata.channel };
38
+ case "local-source": {
39
+ const launcher = process.argv[1];
40
+ if (!launcher) {
41
+ return {
42
+ ok: false,
43
+ channel: metadata.channel,
44
+ detail: "local-source launcher process.argv[1] is missing; cannot write an absolute command path",
45
+ };
46
+ }
47
+ const resolvedLauncher = path.resolve(launcher);
48
+ if (!isReadableFile(resolvedLauncher)) {
49
+ return {
50
+ ok: false,
51
+ channel: metadata.channel,
52
+ detail: `local-source launcher '${resolvedLauncher}' is not a readable file; cannot write an absolute command path`,
53
+ };
54
+ }
55
+ return { ok: true, command: [process.execPath, resolvedLauncher, "acp"], channel: metadata.channel };
56
+ }
57
+ case "package-install": {
58
+ const executable = resolveViaPath("gjc");
59
+ if (!executable || !path.isAbsolute(executable)) {
60
+ return {
61
+ ok: false,
62
+ channel: metadata.channel,
63
+ detail: "gjc was not found on PATH; cannot write an absolute command path",
64
+ };
65
+ }
66
+ return { ok: true, command: [executable, "acp"], channel: metadata.channel };
67
+ }
68
+ case "unknown":
69
+ return { ok: false, channel: metadata.channel, detail: "build channel is unknown; cannot resolve gjc" };
70
+ default: {
71
+ const _exhaustive: never = metadata.channel;
72
+ throw new Error(`Unhandled build channel '${_exhaustive}'`);
73
+ }
74
+ }
75
+ }
76
+
77
+ export function providerKeyFor(mpreset?: string): string {
78
+ return mpreset === undefined ? PROVIDER_KEY : `${PROVIDER_KEY}-${mpreset}`;
79
+ }
80
+
81
+ export function buildProviderEntry(command: string[], mpreset?: string): PaseoProviderEntry {
82
+ return {
83
+ extends: PROVIDER_EXTENDS,
84
+ label: mpreset === undefined ? PROVIDER_LABEL : `${PROVIDER_LABEL} (${mpreset})`,
85
+ command: mpreset === undefined ? [...command] : [...command, "--mpreset", mpreset],
86
+ env: { GJC_ACP_PERMISSION_MODE: "prompt" },
87
+ enabled: true,
88
+ };
89
+ }
90
+
91
+ /**
92
+ * Produces the narrowly scoped mutation passed to {@link planPublish}. The
93
+ * read result is accepted so callers retain an explicit preflight-to-plan flow.
94
+ */
95
+ export function createProviderMutation(
96
+ _current: ReadTargetResult,
97
+ key: string,
98
+ entry: PaseoProviderEntry,
99
+ ): (draft: Record<string, unknown>) => void {
100
+ return draft => {
101
+ const agents = asRecord(draft.agents);
102
+ if (!agents) draft.agents = {};
103
+ const targetAgents = draft.agents as Record<string, unknown>;
104
+ const providers = asRecord(targetAgents.providers);
105
+ if (!providers) targetAgents.providers = {};
106
+ (targetAgents.providers as Record<string, unknown>)[key] = entry;
107
+ };
108
+ }
109
+
110
+ export function hasProviderConflict(
111
+ config: Record<string, unknown>,
112
+ key: string,
113
+ entry: PaseoProviderEntry,
114
+ ): ProviderConflict {
115
+ const existing = asRecord(asRecord(config.agents)?.providers)?.[key];
116
+ if (existing === undefined || JSON.stringify(existing) === JSON.stringify(entry)) return { conflict: false };
117
+ return {
118
+ conflict: true,
119
+ subject: `agents.providers.${key}`,
120
+ detail: `Existing provider entry at agents.providers.${key} differs from the GJC-managed entry.`,
121
+ };
122
+ }
123
+
124
+ export function providerEntryHash(entry: PaseoProviderEntry): string {
125
+ return hashBytes(JSON.stringify(entry));
126
+ }
127
+
128
+ function asRecord(value: unknown): Record<string, unknown> | undefined {
129
+ return value && typeof value === "object" && !Array.isArray(value) ? (value as Record<string, unknown>) : undefined;
130
+ }
131
+
132
+ function isReadableFile(filePath: string): boolean {
133
+ try {
134
+ fs.accessSync(filePath, fs.constants.R_OK);
135
+ return fs.statSync(filePath).isFile();
136
+ } catch {
137
+ return false;
138
+ }
139
+ }
@@ -0,0 +1,183 @@
1
+ /**
2
+ * Provenance-gated rollback for `gjc setup paseo --remove`.
3
+ *
4
+ * Removal never deletes on value-equality alone. A key is removed only when
5
+ * GJC's own ledger recorded creating it AND the current value still hashes to
6
+ * what GJC wrote. A user who hand-authored the same value, or who edited ours
7
+ * afterwards, keeps their content.
8
+ *
9
+ * Steps are undone in reverse of the install order (4 to 1). The first step
10
+ * that cannot be undone safely halts the rest, so the result is an
11
+ * interpretable prefix rather than a scattered mix.
12
+ */
13
+ import { planPublish, publishPlan, readTarget } from "./json-publisher";
14
+ import { removeSeededRoles } from "./orchestration-preferences";
15
+ import {
16
+ EMPTY_LEDGER,
17
+ isProvenancedOrchestrationKey,
18
+ isProvenancedProvider,
19
+ provenancedProviderKeys,
20
+ readProvenance,
21
+ writeProvenance,
22
+ } from "./paseo-ownership";
23
+ import { type PaseoProviderEntry, providerEntryHash } from "./provider-config";
24
+ import type { PartialRemovalEvidence, PaseoRemoveResult } from "./result-types";
25
+ import { INSTALL_SKILL_NAMES, type InstallSkillName, type PaseoSetupDependencies } from "./setup-deps";
26
+ import { inverseSkillsBridge, SkillsBridgeError } from "./skills-bridge";
27
+
28
+ export interface RemoveOptions {
29
+ readonly now: Date;
30
+ /** Undo the config.yml `skills.customDirectories` append. Supplied by the orchestrator. */
31
+ readonly unregisterBridgeDirectory?: () => Promise<void>;
32
+ }
33
+
34
+ /**
35
+ * Remove every target GJC can prove it owns.
36
+ *
37
+ * Returns `nothing-to-remove` when the ledger holds no ownership at all, which
38
+ * is distinct from removing zero keys because the user edited all of them.
39
+ */
40
+ export async function removePaseoSetup(
41
+ deps: PaseoSetupDependencies,
42
+ options: RemoveOptions,
43
+ ): Promise<PaseoRemoveResult> {
44
+ const ledger = await readProvenance(deps.paths.provenanceLedger);
45
+ const ownsAnything =
46
+ provenancedProviderKeys(ledger).length > 0 ||
47
+ Object.keys(ledger.seededOrchestrationKeys).length > 0 ||
48
+ (ledger.bridgeEntries?.length ?? 0) > 0;
49
+ if (!ownsAnything) return { outcome: "nothing-to-remove" };
50
+
51
+ const removed: string[] = [];
52
+ const remaining: string[] = [];
53
+ let nextLedger = ledger;
54
+
55
+ // Step 4 inverse: config.yml registration.
56
+ if (options.unregisterBridgeDirectory) {
57
+ try {
58
+ await options.unregisterBridgeDirectory();
59
+ removed.push("config.yml skills.customDirectories");
60
+ } catch (error) {
61
+ return partial(removed, ["config.yml skills.customDirectories"], {
62
+ failedStep: "config.yml skills.customDirectories",
63
+ detail: error instanceof Error ? error.message : String(error),
64
+ retained: [deps.paths.provenanceLedger],
65
+ });
66
+ }
67
+ }
68
+
69
+ // Step 3 inverse: the symlink bridge.
70
+ if (ledger.bridgeEntries && ledger.bridgeEntries.length > 0) {
71
+ try {
72
+ // Only names the locked allowlist knows are undone; a ledger carrying an
73
+ // unknown name is ignored rather than trusted into a filesystem removal.
74
+ const createdEntries = ledger.bridgeEntries.filter((name): name is InstallSkillName =>
75
+ (INSTALL_SKILL_NAMES as readonly string[]).includes(name),
76
+ );
77
+ await inverseSkillsBridge(deps, {
78
+ createdEntries,
79
+ bridgeDirCreated: ledger.bridgeDirCreated ?? false,
80
+ });
81
+ removed.push(deps.paths.bridgeDir);
82
+ nextLedger = { ...nextLedger, bridgeEntries: [], bridgeDirCreated: false };
83
+ } catch (error) {
84
+ const detail = error instanceof SkillsBridgeError ? error.message : String(error);
85
+ remaining.push(deps.paths.bridgeDir);
86
+ await writeProvenance(deps.paths.provenanceLedger, nextLedger);
87
+ return partial(removed, remaining, {
88
+ failedStep: deps.paths.bridgeDir,
89
+ detail,
90
+ retained: [deps.paths.provenanceLedger],
91
+ });
92
+ }
93
+ }
94
+
95
+ // Step 2 inverse: seeded orchestration roles.
96
+ const seededKeys = Object.keys(nextLedger.seededOrchestrationKeys);
97
+ if (seededKeys.length > 0) {
98
+ // Roles live under `providers`, so removal must reach into that map. Deleting
99
+ // a top-level key would clear our provenance while leaving the role pointing
100
+ // at the provider entry we are about to delete.
101
+ const outcome = await revertJson(deps.paths.orchestrationPreferences, options.now, draft =>
102
+ removeSeededRoles(draft, seededKeys, (key, currentValue) =>
103
+ isProvenancedOrchestrationKey(nextLedger, key, currentValue ?? ""),
104
+ ),
105
+ );
106
+ if (!outcome.ok) {
107
+ remaining.push(deps.paths.orchestrationPreferences);
108
+ await writeProvenance(deps.paths.provenanceLedger, nextLedger);
109
+ return partial(removed, remaining, {
110
+ failedStep: deps.paths.orchestrationPreferences,
111
+ detail: outcome.detail,
112
+ retained: [deps.paths.provenanceLedger],
113
+ });
114
+ }
115
+ removed.push(deps.paths.orchestrationPreferences);
116
+ nextLedger = { ...nextLedger, seededOrchestrationKeys: {} };
117
+ }
118
+
119
+ // Step 1 inverse: provider entries, including every earlier `--mpreset` run.
120
+ const providerKeys = provenancedProviderKeys(nextLedger);
121
+ if (providerKeys.length > 0) {
122
+ const survivors: Record<string, string> = {};
123
+ const outcome = await revertJson(deps.paths.configJson, options.now, draft => {
124
+ const providers = providersOf(draft);
125
+ if (!providers) return;
126
+ for (const key of providerKeys) {
127
+ const entry = providers[key];
128
+ if (entry === undefined) continue;
129
+ const hash = providerEntryHash(entry as PaseoProviderEntry);
130
+ if (isProvenancedProvider(nextLedger, key, hash)) delete providers[key];
131
+ else survivors[key] = nextLedger.providerKeys[key] ?? hash;
132
+ }
133
+ });
134
+ if (!outcome.ok) {
135
+ remaining.push(deps.paths.configJson);
136
+ await writeProvenance(deps.paths.provenanceLedger, nextLedger);
137
+ return partial(removed, remaining, {
138
+ failedStep: deps.paths.configJson,
139
+ detail: outcome.detail,
140
+ retained: [deps.paths.provenanceLedger],
141
+ });
142
+ }
143
+ removed.push(deps.paths.configJson);
144
+ nextLedger = { ...nextLedger, providerKeys: survivors };
145
+ }
146
+
147
+ const stillOwns =
148
+ Object.keys(nextLedger.providerKeys).length > 0 || Object.keys(nextLedger.seededOrchestrationKeys).length > 0;
149
+ await writeProvenance(deps.paths.provenanceLedger, stillOwns ? nextLedger : EMPTY_LEDGER);
150
+ return { outcome: "removed", removed };
151
+ }
152
+
153
+ function providersOf(draft: Record<string, unknown>): Record<string, unknown> | undefined {
154
+ const agents = draft.agents;
155
+ if (!agents || typeof agents !== "object" || Array.isArray(agents)) return undefined;
156
+ const providers = (agents as Record<string, unknown>).providers;
157
+ if (!providers || typeof providers !== "object" || Array.isArray(providers)) return undefined;
158
+ return providers as Record<string, unknown>;
159
+ }
160
+
161
+ async function revertJson(
162
+ targetPath: string,
163
+ now: Date,
164
+ mutate: (draft: Record<string, unknown>) => void,
165
+ ): Promise<{ ok: true } | { ok: false; detail: string }> {
166
+ try {
167
+ const current = await readTarget(targetPath);
168
+ if (!current.exists) return { ok: true };
169
+ const plan = planPublish(current, mutate);
170
+ await publishPlan(targetPath, plan, { expectedIdentity: current.identity, backup: true, now });
171
+ return { ok: true };
172
+ } catch (error) {
173
+ return { ok: false, detail: error instanceof Error ? error.message : String(error) };
174
+ }
175
+ }
176
+
177
+ function partial(
178
+ removed: readonly string[],
179
+ remaining: readonly string[],
180
+ evidence: PartialRemovalEvidence,
181
+ ): PaseoRemoveResult {
182
+ return { outcome: "partial-removal", removed, remaining, evidence };
183
+ }
@@ -0,0 +1,79 @@
1
+ /**
2
+ * Result unions for `gjc setup paseo`.
3
+ *
4
+ * `SetupCheckResult` is deliberately four-valued. Parse failures, conflicts,
5
+ * missing executables, and partial-operation evidence are all `drift` carrying
6
+ * a structured reason -- they are NOT extra top-level statuses. Install and
7
+ * remove outcomes live in their own unions so command outcomes never leak into
8
+ * the diagnosis DTO.
9
+ */
10
+
11
+ /** The four locked check states. Adding a fifth is a spec change, not an implementation detail. */
12
+ export type SetupCheckStatus = "pass" | "drift" | "stale" | "skipped";
13
+
14
+ /** Structured detail carried inside a `drift` result. */
15
+ export type DriftReasonCode =
16
+ | "parse-refusal"
17
+ | "format-drift"
18
+ | "owned-key-conflict"
19
+ | "missing-executable"
20
+ | "partial-install"
21
+ | "partial-removal"
22
+ | "orphan-skill"
23
+ | "unlinked-skill"
24
+ | "missing-provider-entry"
25
+ | "missing-bridge-link"
26
+ | "missing-skills-directory"
27
+ | "unseeded-orchestration-role";
28
+
29
+ export interface DriftReason {
30
+ readonly code: DriftReasonCode;
31
+ /** Which owned path or key the reason concerns. Never a secret value. */
32
+ readonly subject: string;
33
+ readonly detail: string;
34
+ }
35
+
36
+ export interface SetupCheckResult {
37
+ readonly component: "paseo";
38
+ readonly status: SetupCheckStatus;
39
+ readonly reasons: readonly DriftReason[];
40
+ /** Human-facing next step, present for `stale` so the user knows a restart is theirs to make. */
41
+ readonly guidance?: string;
42
+ }
43
+
44
+ export interface PartialInstallEvidence {
45
+ readonly failedStep: string;
46
+ readonly detail: string;
47
+ /** Paths whose state was preserved for recovery. Never file contents. */
48
+ readonly retained: readonly string[];
49
+ }
50
+
51
+ export type PaseoInstallResult =
52
+ | { readonly outcome: "installed"; readonly changed: readonly string[] }
53
+ | {
54
+ readonly outcome: "partial-install";
55
+ readonly compensated: readonly string[];
56
+ readonly uncompensated: readonly string[];
57
+ readonly evidence: PartialInstallEvidence;
58
+ };
59
+
60
+ export interface PartialRemovalEvidence {
61
+ readonly failedStep: string;
62
+ readonly detail: string;
63
+ readonly retained: readonly string[];
64
+ }
65
+
66
+ export type PaseoRemoveResult =
67
+ | { readonly outcome: "removed"; readonly removed: readonly string[] }
68
+ | { readonly outcome: "nothing-to-remove" }
69
+ | {
70
+ readonly outcome: "partial-removal";
71
+ readonly removed: readonly string[];
72
+ readonly remaining: readonly string[];
73
+ readonly evidence: PartialRemovalEvidence;
74
+ };
75
+
76
+ /** Exit code for a check result. `stale` and `skipped` are not failures. */
77
+ export function checkExitCode(result: SetupCheckResult): number {
78
+ return result.status === "drift" ? 1 : 0;
79
+ }