@gajae-code/coding-agent 0.13.3 → 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 (599) hide show
  1. package/CHANGELOG.md +184 -2
  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 +9 -1
  35. package/dist/types/config/models-config-schema.d.ts +2 -0
  36. package/dist/types/config/settings-schema.d.ts +70 -6
  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 +1 -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/gajae-pet-widget.d.ts +8 -30
  87. package/dist/types/modes/components/irc-sidebar.d.ts +1 -0
  88. package/dist/types/modes/components/iterm-pet-transport.d.ts +122 -0
  89. package/dist/types/modes/components/oauth-selector.d.ts +10 -4
  90. package/dist/types/modes/components/pet-capability.d.ts +11 -25
  91. package/dist/types/modes/components/status-line/gh.d.ts +6 -2
  92. package/dist/types/modes/controllers/extension-ui-controller.d.ts +1 -1
  93. package/dist/types/modes/controllers/selector-controller.d.ts +7 -8
  94. package/dist/types/modes/controllers/stt-controller.d.ts +1 -1
  95. package/dist/types/modes/interactive-mode.d.ts +1 -0
  96. package/dist/types/modes/types.d.ts +1 -0
  97. package/dist/types/modes/utils/injected-user-submission.d.ts +10 -0
  98. package/dist/types/runtime-mcp/config.d.ts +9 -0
  99. package/dist/types/runtime-mcp/manager.d.ts +26 -1
  100. package/dist/types/runtime-mcp/oauth-discovery.d.ts +4 -0
  101. package/dist/types/runtime-mcp/oauth-flow.d.ts +24 -1
  102. package/dist/types/runtime-mcp/pool-key.d.ts +2 -0
  103. package/dist/types/runtime-mcp/protocol.d.ts +278 -0
  104. package/dist/types/runtime-mcp/scope-config.d.ts +29 -0
  105. package/dist/types/runtime-mcp/tool-bridge.d.ts +15 -13
  106. package/dist/types/runtime-mcp/transports/http.d.ts +9 -0
  107. package/dist/types/runtime-mcp/types.d.ts +102 -10
  108. package/dist/types/sdk/acp/adapter.d.ts +26 -5
  109. package/dist/types/sdk/broker/broker.d.ts +3 -55
  110. package/dist/types/sdk/broker/lifecycle.d.ts +18 -12
  111. package/dist/types/sdk/broker/session-index.d.ts +14 -5
  112. package/dist/types/sdk/broker/startup-failure.d.ts +16 -1
  113. package/dist/types/sdk/bus/chat-daemon-control.d.ts +51 -1
  114. package/dist/types/sdk/bus/chat-daemon-runtime.d.ts +4 -41
  115. package/dist/types/sdk/bus/config.d.ts +11 -0
  116. package/dist/types/sdk/bus/conversation-store.d.ts +0 -1
  117. package/dist/types/sdk/bus/daemon-paths.d.ts +6 -0
  118. package/dist/types/sdk/bus/discord-conversation.d.ts +2 -0
  119. package/dist/types/sdk/bus/discord-daemon.d.ts +17 -12
  120. package/dist/types/sdk/bus/existing-thread-readiness.d.ts +4 -34
  121. package/dist/types/sdk/bus/inbound-reaction-ordering.d.ts +61 -0
  122. package/dist/types/sdk/bus/index.d.ts +85 -99
  123. package/dist/types/sdk/bus/kind-aware-reconciliation.d.ts +29 -7
  124. package/dist/types/sdk/bus/managed-daemon.d.ts +2 -32
  125. package/dist/types/sdk/bus/notification-service.d.ts +52 -0
  126. package/dist/types/sdk/bus/operator-runtime.d.ts +1 -1
  127. package/dist/types/sdk/bus/prompt-reconciliation.d.ts +16 -5
  128. package/dist/types/sdk/bus/reconciliation-store.d.ts +113 -5
  129. package/dist/types/sdk/bus/session-control.d.ts +25 -1
  130. package/dist/types/sdk/bus/slack-conversation.d.ts +4 -0
  131. package/dist/types/sdk/bus/slack-daemon.d.ts +9 -17
  132. package/dist/types/sdk/bus/slack-live-provider.d.ts +3 -1
  133. package/dist/types/sdk/bus/slack-provider.d.ts +4 -0
  134. package/dist/types/sdk/bus/slack-thread-binding.d.ts +6 -40
  135. package/dist/types/sdk/bus/telegram-adoption-intent.d.ts +30 -104
  136. package/dist/types/sdk/bus/telegram-daemon-cli.d.ts +10 -0
  137. package/dist/types/sdk/bus/telegram-daemon-contract.d.ts +262 -19
  138. package/dist/types/sdk/bus/telegram-daemon-orphan-reap.d.ts +125 -0
  139. package/dist/types/sdk/bus/telegram-daemon-owner-registry.d.ts +22 -0
  140. package/dist/types/sdk/bus/telegram-daemon.d.ts +119 -310
  141. package/dist/types/sdk/bus/telegram-reference.d.ts +1 -47
  142. package/dist/types/sdk/bus/threaded-render.d.ts +1 -0
  143. package/dist/types/sdk/bus/topic-registry.d.ts +33 -17
  144. package/dist/types/sdk/cli/rows.d.ts +2 -11
  145. package/dist/types/sdk/cli/session-cli.d.ts +15 -25
  146. package/dist/types/sdk/client/client.d.ts +97 -1
  147. package/dist/types/sdk/host/control/dispatch.d.ts +0 -7
  148. package/dist/types/sdk/host/control/index.d.ts +1 -1
  149. package/dist/types/sdk/host/control/operations.d.ts +18 -5
  150. package/dist/types/sdk/host/control/runtime-gate.d.ts +19 -0
  151. package/dist/types/sdk/host/host.d.ts +15 -1
  152. package/dist/types/sdk/host/query/handlers.d.ts +5 -0
  153. package/dist/types/sdk/host/reverse-leases.d.ts +1 -1
  154. package/dist/types/sdk/host/session-runtime.d.ts +127 -7
  155. package/dist/types/sdk/host/types.d.ts +1 -1
  156. package/dist/types/sdk/host/websocket-transport.d.ts +1 -1
  157. package/dist/types/sdk/index.d.ts +2 -1
  158. package/dist/types/sdk/lifecycle/broker-client.d.ts +8 -0
  159. package/dist/types/sdk/lifecycle/client.d.ts +59 -0
  160. package/dist/types/sdk/lifecycle/index.d.ts +3 -0
  161. package/dist/types/sdk/lifecycle/service.d.ts +232 -0
  162. package/dist/types/sdk/mcp/server.d.ts +9 -6
  163. package/dist/types/sdk/prompt-deadline-lease.d.ts +43 -0
  164. package/dist/types/sdk/prompt-deadline-manager.d.ts +28 -0
  165. package/dist/types/sdk/prompt-status.d.ts +10 -3
  166. package/dist/types/sdk/protocol/operation-registry.d.ts +5 -0
  167. package/dist/types/sdk/receipt-state.d.ts +17 -0
  168. package/dist/types/sdk/reconciliation-extensions.d.ts +2 -0
  169. package/dist/types/sdk/router/index.d.ts +1 -0
  170. package/dist/types/sdk/router/session-router.d.ts +152 -0
  171. package/dist/types/sdk/session-list.d.ts +22 -0
  172. package/dist/types/sdk/session-reconnect.d.ts +43 -1
  173. package/dist/types/sdk/session.d.ts +34 -1
  174. package/dist/types/sdk/transport/serve-cli.d.ts +1 -4
  175. package/dist/types/session/account-inventory.d.ts +86 -0
  176. package/dist/types/session/agent-session.d.ts +145 -6
  177. package/dist/types/session/agent-storage.d.ts +10 -0
  178. package/dist/types/session/coordinator-tool-label.d.ts +28 -0
  179. package/dist/types/session/internal/managed-session-storage.d.ts +23 -4
  180. package/dist/types/session/messages.d.ts +1 -1
  181. package/dist/types/session/secure-token-file.d.ts +3 -0
  182. package/dist/types/session/session-manager.d.ts +40 -1
  183. package/dist/types/session/startup-auth-config.d.ts +44 -0
  184. package/dist/types/session/terminal-abort.d.ts +378 -0
  185. package/dist/types/session/yield-queue.d.ts +7 -0
  186. package/dist/types/session-import/claude.d.ts +26 -0
  187. package/dist/types/session-import/codex.d.ts +88 -0
  188. package/dist/types/session-import/command.d.ts +35 -0
  189. package/dist/types/session-import/detect.d.ts +22 -0
  190. package/dist/types/session-import/index.d.ts +7 -0
  191. package/dist/types/session-import/provider-codex.d.ts +22 -0
  192. package/dist/types/session-import/provider-service.d.ts +38 -0
  193. package/dist/types/session-import/redact.d.ts +23 -0
  194. package/dist/types/session-import/service.d.ts +47 -0
  195. package/dist/types/session-import/types.d.ts +120 -0
  196. package/dist/types/setup/paseo/check.d.ts +16 -0
  197. package/dist/types/setup/paseo/install-saga.d.ts +115 -0
  198. package/dist/types/setup/paseo/json-publisher.d.ts +76 -0
  199. package/dist/types/setup/paseo/orchestration-preferences.d.ts +24 -0
  200. package/dist/types/setup/paseo/paseo-ownership.d.ts +87 -0
  201. package/dist/types/setup/paseo/paseo-setup.d.ts +29 -0
  202. package/dist/types/setup/paseo/provider-config.d.ts +35 -0
  203. package/dist/types/setup/paseo/remove.d.ts +14 -0
  204. package/dist/types/setup/paseo/result-types.d.ts +59 -0
  205. package/dist/types/setup/paseo/setup-deps.d.ts +73 -0
  206. package/dist/types/setup/paseo/skills-bridge.d.ts +44 -0
  207. package/dist/types/skill-state/active-state.d.ts +5 -1
  208. package/dist/types/slash-commands/acp-builtins.d.ts +5 -1
  209. package/dist/types/slash-commands/builtin-registry.d.ts +2 -0
  210. package/dist/types/slash-commands/helpers/credential-switch.d.ts +12 -0
  211. package/dist/types/slash-commands/helpers/usage-report.d.ts +5 -6
  212. package/dist/types/slash-commands/types.d.ts +7 -1
  213. package/dist/types/task/executor.d.ts +10 -0
  214. package/dist/types/task/index.d.ts +3 -1
  215. package/dist/types/tools/ask-answer-registry.d.ts +6 -3
  216. package/dist/types/tools/bash-sleep-advisory.d.ts +14 -0
  217. package/dist/types/tools/bash.d.ts +2 -6
  218. package/dist/types/tools/browser/attach.d.ts +11 -0
  219. package/dist/types/tools/browser/launch.d.ts +20 -0
  220. package/dist/types/tools/browser/profile-discovery.d.ts +6 -0
  221. package/dist/types/tools/browser/render.d.ts +1 -0
  222. package/dist/types/tools/browser.d.ts +3 -1
  223. package/dist/types/tools/image-gen.d.ts +9 -2
  224. package/dist/types/tools/index.d.ts +8 -0
  225. package/dist/types/tools/monitor.d.ts +1 -1
  226. package/dist/types/tools/skill-discovery.d.ts +8 -1
  227. package/dist/types/tools/subagent.d.ts +2 -0
  228. package/dist/types/tools/ultragoal-ask-guard.d.ts +2 -2
  229. package/dist/types/utils/herdr-pane.d.ts +76 -0
  230. package/package.json +19 -9
  231. package/scripts/build-binary.ts +2 -1
  232. package/scripts/build-sdk-package-smoke.ts +2 -13
  233. package/scripts/capture-sticky-viewport-showcase.ts +0 -1
  234. package/scripts/compile-args.ts +2 -0
  235. package/scripts/generate-sdk-adapter-parity-manifest.ts +31 -16
  236. package/scripts/generate-sdk-operation-inventory.ts +28 -0
  237. package/scripts/generate-telegram-baseline-manifest.ts +1 -0
  238. package/scripts/generate-tool-catalog.ts +6 -4
  239. package/scripts/verify-gjc-sdk-canonicalization.ts +5 -39
  240. package/src/async/job-manager.ts +352 -17
  241. package/src/async/support.ts +25 -0
  242. package/src/autoresearch/dashboard.ts +28 -13
  243. package/src/capability/index.ts +3 -1
  244. package/src/capability/mcp.ts +6 -0
  245. package/src/capability/types.ts +6 -0
  246. package/src/cli/accounts-cli.ts +395 -0
  247. package/src/cli/args.ts +23 -0
  248. package/src/cli/auth-broker-cli.ts +136 -66
  249. package/src/cli/auth-gateway-cli.ts +94 -70
  250. package/src/cli/config-cli.ts +27 -2
  251. package/src/cli/crash-cli.ts +78 -0
  252. package/src/cli/customize-doctor.ts +1605 -0
  253. package/src/cli/daemon-cli.ts +12 -3
  254. package/src/cli/fast-help.ts +1 -0
  255. package/src/cli/mcp-cli.ts +128 -60
  256. package/src/cli/notify-cli.ts +8 -14
  257. package/src/cli/root-flags.ts +8 -0
  258. package/src/cli/setup-cli.ts +145 -0
  259. package/src/cli/skills-cli.ts +38 -2
  260. package/src/cli/update-cli.ts +167 -12
  261. package/src/cli.ts +4 -0
  262. package/src/commands/accounts.ts +71 -0
  263. package/src/commands/crash.ts +35 -0
  264. package/src/commands/customize.ts +84 -0
  265. package/src/commands/daemon.ts +2 -2
  266. package/src/commands/deep-interview.ts +2 -0
  267. package/src/commands/launch.ts +1 -0
  268. package/src/commands/mcp.ts +12 -7
  269. package/src/commands/ralplan.ts +2 -0
  270. package/src/commands/sdk.ts +65 -32
  271. package/src/commands/setup.ts +5 -0
  272. package/src/commands/skills.ts +14 -4
  273. package/src/commands/ultragoal.ts +10 -1
  274. package/src/commands/update.ts +26 -15
  275. package/src/config/atomic-yaml-patch-worker.ts +57 -0
  276. package/src/config/atomic-yaml-patch.ts +769 -29
  277. package/src/config/config-schema-version.ts +10 -0
  278. package/src/config/file-lock.ts +70 -1
  279. package/src/config/mcp-schema.json +52 -14
  280. package/src/config/model-profile-activation.ts +20 -1
  281. package/src/config/model-profiles.ts +29 -19
  282. package/src/config/model-registry.ts +132 -21
  283. package/src/config/models-config-schema.ts +1 -1
  284. package/src/config/settings-schema.ts +76 -6
  285. package/src/config/settings.ts +4038 -199
  286. package/src/config/skill-settings-defaults.ts +41 -3
  287. package/src/config/task-delegation.ts +87 -0
  288. package/src/config/update-channel.ts +23 -0
  289. package/src/coordinator-mcp/server.ts +377 -308
  290. package/src/crash/index-store.ts +723 -0
  291. package/src/crash/nudge.ts +89 -0
  292. package/src/crash/record-loader.ts +149 -0
  293. package/src/crash/report.ts +551 -0
  294. package/src/crash/sanitize.ts +129 -0
  295. package/src/cursor.ts +36 -10
  296. package/src/customization/import.ts +946 -0
  297. package/src/customization/index.ts +4 -0
  298. package/src/customization/inventory.ts +335 -0
  299. package/src/customization/mutations.ts +141 -0
  300. package/src/customization/types.ts +223 -0
  301. package/src/daemon/control-types.ts +8 -1
  302. package/src/daemon/operator-contract.ts +6 -6
  303. package/src/defaults/gjc/skills/deep-interview/SKILL.md +11 -22
  304. package/src/defaults/gjc/skills/ralplan/SKILL.md +36 -23
  305. package/src/defaults/gjc/skills/ultragoal/SKILL.md +16 -0
  306. package/src/discovery/claude-hooks.ts +38 -0
  307. package/src/discovery/claude.ts +142 -209
  308. package/src/discovery/codex-hooks.ts +38 -0
  309. package/src/discovery/codex.ts +132 -198
  310. package/src/discovery/helpers.ts +8 -1
  311. package/src/discovery/index.ts +2 -0
  312. package/src/discovery/mcp-compat.ts +234 -0
  313. package/src/discovery/mcp-json.ts +6 -0
  314. package/src/edit/renderer.ts +40 -0
  315. package/src/edit/streaming.ts +4 -2
  316. package/src/exec/bash-executor.ts +24 -20
  317. package/src/export/html/index.ts +51 -2
  318. package/src/extensibility/extensions/loader.ts +9 -1
  319. package/src/extensibility/extensions/runner.ts +17 -4
  320. package/src/extensibility/extensions/types.ts +31 -6
  321. package/src/extensibility/gjc-plugins/constrained-hooks.ts +33 -0
  322. package/src/extensibility/gjc-plugins/installer.ts +9 -5
  323. package/src/extensibility/gjc-plugins/observability.ts +8 -2
  324. package/src/extensibility/gjc-plugins/registry.ts +13 -2
  325. package/src/extensibility/gjc-plugins/runtime-adapters.ts +3 -1
  326. package/src/extensibility/gjc-plugins/schema.ts +222 -39
  327. package/src/extensibility/hooks/loader.ts +154 -10
  328. package/src/extensibility/runtime-skill-discovery.ts +257 -60
  329. package/src/extensibility/skill-management.ts +368 -0
  330. package/src/extensibility/skills.ts +52 -16
  331. package/src/gjc-runtime/deep-interview-runtime.ts +45 -61
  332. package/src/gjc-runtime/launch-worktree.ts +56 -2
  333. package/src/gjc-runtime/linux-proc.ts +7 -1
  334. package/src/gjc-runtime/ralplan-runtime.ts +100 -164
  335. package/src/gjc-runtime/session-state-lock.ts +992 -0
  336. package/src/gjc-runtime/session-state-sidecar.ts +644 -142
  337. package/src/gjc-runtime/state-writer.ts +39 -14
  338. package/src/gjc-runtime/tmux-owner-isolation.ts +5 -4
  339. package/src/gjc-runtime/ultragoal-guard.ts +11 -4
  340. package/src/gjc-runtime/ultragoal-runtime.ts +44 -41
  341. package/src/gjc-runtime/workflow-settings.ts +596 -0
  342. package/src/goals/tools/goal-tool.ts +6 -1
  343. package/src/hooks/events.ts +291 -0
  344. package/src/hooks/native-skill-hook.ts +4 -0
  345. package/src/hooks/normalize.ts +369 -0
  346. package/src/hooks/skill-state.ts +165 -46
  347. package/src/internal-urls/docs-index.generated.ts +40 -32
  348. package/src/main.ts +32 -5
  349. package/src/migrate/mcp-mapper.ts +25 -2
  350. package/src/modes/acp/abort-scope.ts +29 -0
  351. package/src/modes/acp/acp-agent.ts +423 -98
  352. package/src/modes/components/assistant-message.ts +6 -1
  353. package/src/modes/components/customization/customization-dashboard.ts +443 -0
  354. package/src/modes/components/customization/import-wizard.ts +372 -0
  355. package/src/modes/components/customization/index.ts +1 -0
  356. package/src/modes/components/gajae-pet-widget.ts +539 -213
  357. package/src/modes/components/irc-sidebar.ts +11 -0
  358. package/src/modes/components/iterm-pet-transport.ts +585 -0
  359. package/src/modes/components/oauth-selector.ts +277 -86
  360. package/src/modes/components/pet-capability.ts +39 -40
  361. package/src/modes/components/settings-selector.ts +9 -0
  362. package/src/modes/components/status-line/gh.ts +45 -1
  363. package/src/modes/components/status-line/segments.ts +16 -1
  364. package/src/modes/components/tool-status-header.ts +13 -3
  365. package/src/modes/controllers/command-controller.ts +20 -8
  366. package/src/modes/controllers/extension-ui-controller.ts +56 -257
  367. package/src/modes/controllers/input-controller.ts +10 -0
  368. package/src/modes/controllers/runtime-mcp-command-controller.ts +16 -3
  369. package/src/modes/controllers/selector-controller.ts +177 -72
  370. package/src/modes/controllers/stt-controller.ts +3 -3
  371. package/src/modes/interactive-mode.ts +88 -16
  372. package/src/modes/print-mode.ts +35 -6
  373. package/src/modes/runtime-init.ts +21 -68
  374. package/src/modes/types.ts +1 -0
  375. package/src/modes/utils/injected-user-submission.ts +25 -0
  376. package/src/modes/utils/terminal-bell.ts +15 -1
  377. package/src/prompts/agent-fragments/ralplan-persistence.md +1 -1
  378. package/src/prompts/agent-fragments/restricted-bash.md +1 -1
  379. package/src/prompts/agents/critic.md +1 -1
  380. package/src/prompts/system/rlm-research.md +1 -1
  381. package/src/prompts/system/system-prompt.md +0 -2
  382. package/src/prompts/tools/bash.md +7 -1
  383. package/src/prompts/tools/browser.md +1 -1
  384. package/src/prompts/tools/cron.md +6 -6
  385. package/src/prompts/tools/read.md +0 -2
  386. package/src/prompts/tools/skill-discovery.md +4 -2
  387. package/src/runtime-mcp/client.ts +427 -23
  388. package/src/runtime-mcp/config.ts +37 -5
  389. package/src/runtime-mcp/manager-pool.test.ts +56 -0
  390. package/src/runtime-mcp/manager.ts +52 -2
  391. package/src/runtime-mcp/oauth-discovery.ts +13 -0
  392. package/src/runtime-mcp/oauth-flow.ts +46 -1
  393. package/src/runtime-mcp/pool-key.ts +5 -1
  394. package/src/runtime-mcp/pool.test.ts +9 -0
  395. package/src/runtime-mcp/protocol.test.ts +353 -0
  396. package/src/runtime-mcp/protocol.ts +624 -0
  397. package/src/runtime-mcp/scope-config.ts +78 -0
  398. package/src/runtime-mcp/tool-bridge.ts +44 -10
  399. package/src/runtime-mcp/transports/http.ts +84 -13
  400. package/src/runtime-mcp/types.ts +123 -12
  401. package/src/sdk/acp/adapter.ts +328 -97
  402. package/src/sdk/broker/broker.ts +160 -741
  403. package/src/sdk/broker/ensure.ts +9 -1
  404. package/src/sdk/broker/lifecycle.ts +510 -116
  405. package/src/sdk/broker/operation-receipt-ledger.ts +11 -2
  406. package/src/sdk/broker/process-incarnation.ts +19 -0
  407. package/src/sdk/broker/session-index.ts +516 -117
  408. package/src/sdk/broker/startup-failure.ts +28 -5
  409. package/src/sdk/broker/transport.ts +1 -13
  410. package/src/sdk/bus/chat-daemon-cli.ts +4 -2
  411. package/src/sdk/bus/chat-daemon-control.ts +67 -6
  412. package/src/sdk/bus/chat-daemon-runtime.ts +183 -859
  413. package/src/sdk/bus/config.ts +13 -0
  414. package/src/sdk/bus/conversation-store.ts +59 -171
  415. package/src/sdk/bus/daemon-paths.ts +20 -0
  416. package/src/sdk/bus/discord-conversation.ts +2 -0
  417. package/src/sdk/bus/discord-daemon.ts +524 -126
  418. package/src/sdk/bus/discord-live-provider.ts +206 -79
  419. package/src/sdk/bus/existing-thread-readiness.ts +4 -97
  420. package/src/sdk/bus/inbound-reaction-ordering.ts +122 -0
  421. package/src/sdk/bus/index.ts +2480 -456
  422. package/src/sdk/bus/kind-aware-reconciliation.ts +204 -34
  423. package/src/sdk/bus/lifecycle-commands.ts +2 -2
  424. package/src/sdk/bus/managed-daemon.ts +2 -145
  425. package/src/sdk/bus/notification-service.ts +196 -0
  426. package/src/sdk/bus/operator-runtime.ts +1 -1
  427. package/src/sdk/bus/prompt-reconciliation.ts +24 -15
  428. package/src/sdk/bus/reconciliation-store.ts +553 -24
  429. package/src/sdk/bus/session-control.ts +49 -3
  430. package/src/sdk/bus/slack-conversation.ts +4 -0
  431. package/src/sdk/bus/slack-daemon.ts +733 -134
  432. package/src/sdk/bus/slack-live-provider.ts +65 -15
  433. package/src/sdk/bus/slack-provider.ts +4 -0
  434. package/src/sdk/bus/slack-thread-binding.ts +9 -104
  435. package/src/sdk/bus/telegram-adoption-intent.ts +299 -209
  436. package/src/sdk/bus/telegram-daemon-cli.ts +194 -7
  437. package/src/sdk/bus/telegram-daemon-contract.ts +265 -19
  438. package/src/sdk/bus/telegram-daemon-control.ts +3 -13
  439. package/src/sdk/bus/telegram-daemon-orphan-reap.ts +498 -0
  440. package/src/sdk/bus/telegram-daemon-owner-registry.ts +176 -0
  441. package/src/sdk/bus/telegram-daemon.ts +2552 -2280
  442. package/src/sdk/bus/telegram-reference.ts +1 -226
  443. package/src/sdk/bus/telegram-setup.ts +2 -2
  444. package/src/sdk/bus/threaded-render.ts +1 -0
  445. package/src/sdk/bus/topic-registry.ts +279 -146
  446. package/src/sdk/cli/rows.ts +2 -35
  447. package/src/sdk/cli/session-cli.ts +776 -700
  448. package/src/sdk/client/client.ts +892 -1
  449. package/src/sdk/host/control/dispatch.ts +93 -58
  450. package/src/sdk/host/control/index.ts +1 -1
  451. package/src/sdk/host/control/operations.ts +18 -10
  452. package/src/sdk/host/control/runtime-gate.ts +40 -0
  453. package/src/sdk/host/host.ts +63 -12
  454. package/src/sdk/host/query/handlers.ts +66 -7
  455. package/src/sdk/host/reverse-leases.ts +2 -2
  456. package/src/sdk/host/sdk-surface-parity.test.ts +1 -1
  457. package/src/sdk/host/session-runtime.test.ts +2787 -34
  458. package/src/sdk/host/session-runtime.ts +1489 -101
  459. package/src/sdk/host/surface-policy.ts +12 -8
  460. package/src/sdk/host/types.ts +1 -1
  461. package/src/sdk/host/websocket-transport.lifecycle.test.ts +31 -59
  462. package/src/sdk/host/websocket-transport.ts +85 -50
  463. package/src/sdk/index.ts +2 -1
  464. package/src/sdk/lifecycle/broker-client.ts +53 -0
  465. package/src/sdk/lifecycle/client.ts +234 -0
  466. package/src/sdk/lifecycle/index.ts +3 -0
  467. package/src/sdk/{bus/recent-activity.ts → lifecycle/recent-sessions.ts} +5 -2
  468. package/src/sdk/lifecycle/service.ts +720 -0
  469. package/src/sdk/mcp/server.ts +226 -188
  470. package/src/sdk/prompt-deadline-lease.ts +55 -0
  471. package/src/sdk/prompt-deadline-manager.ts +148 -0
  472. package/src/sdk/prompt-status.ts +11 -3
  473. package/src/sdk/protocol/operation-inventory.generated.json +272 -129
  474. package/src/sdk/protocol/operation-registry.ts +71 -8
  475. package/src/sdk/receipt-state.ts +43 -0
  476. package/src/sdk/reconciliation-extensions.ts +14 -0
  477. package/src/sdk/router/index.ts +1 -0
  478. package/src/sdk/router/session-router.ts +1658 -0
  479. package/src/sdk/session-list.ts +93 -0
  480. package/src/sdk/session-reconnect.ts +45 -1
  481. package/src/sdk/session.ts +716 -120
  482. package/src/sdk/transport/serve-cli.ts +18 -34
  483. package/src/session/account-inventory.ts +603 -0
  484. package/src/session/agent-session.ts +2857 -582
  485. package/src/session/agent-storage.ts +35 -0
  486. package/src/session/blob-store.ts +32 -1
  487. package/src/session/coordinator-tool-label.ts +40 -0
  488. package/src/session/internal/managed-session-scope.ts +4 -0
  489. package/src/session/internal/managed-session-storage.ts +173 -12
  490. package/src/session/messages.ts +1 -1
  491. package/src/session/secure-token-file.ts +80 -0
  492. package/src/session/session-manager.ts +730 -58
  493. package/src/session/session-storage.ts +25 -16
  494. package/src/session/startup-auth-config.ts +297 -0
  495. package/src/session/terminal-abort.ts +1253 -0
  496. package/src/session/yield-queue.ts +57 -15
  497. package/src/session-import/claude.ts +334 -0
  498. package/src/session-import/codex.ts +1033 -0
  499. package/src/session-import/command.ts +77 -0
  500. package/src/session-import/detect.ts +133 -0
  501. package/src/session-import/index.ts +7 -0
  502. package/src/session-import/provider-codex.ts +327 -0
  503. package/src/session-import/provider-service.ts +457 -0
  504. package/src/session-import/redact.ts +128 -0
  505. package/src/session-import/service.ts +1264 -0
  506. package/src/session-import/types.ts +148 -0
  507. package/src/setup/paseo/check.ts +213 -0
  508. package/src/setup/paseo/install-saga.ts +293 -0
  509. package/src/setup/paseo/json-publisher.ts +263 -0
  510. package/src/setup/paseo/orchestration-preferences.ts +86 -0
  511. package/src/setup/paseo/paseo-ownership.ts +224 -0
  512. package/src/setup/paseo/paseo-setup.ts +253 -0
  513. package/src/setup/paseo/provider-config.ts +139 -0
  514. package/src/setup/paseo/remove.ts +183 -0
  515. package/src/setup/paseo/result-types.ts +79 -0
  516. package/src/setup/paseo/setup-deps.ts +175 -0
  517. package/src/setup/paseo/skills-bridge.ts +260 -0
  518. package/src/skill-state/active-state.ts +21 -11
  519. package/src/slash-commands/acp-builtins.ts +9 -1
  520. package/src/slash-commands/builtin-registry.ts +98 -16
  521. package/src/slash-commands/helpers/credential-switch.ts +143 -0
  522. package/src/slash-commands/helpers/mcp.ts +9 -3
  523. package/src/slash-commands/helpers/usage-report.ts +61 -56
  524. package/src/slash-commands/types.ts +7 -2
  525. package/src/task/executor.ts +30 -11
  526. package/src/task/index.ts +66 -7
  527. package/src/task/render.ts +23 -9
  528. package/src/tools/ask-answer-registry.ts +23 -7
  529. package/src/tools/ask.ts +8 -4
  530. package/src/tools/bash-sleep-advisory.ts +115 -0
  531. package/src/tools/bash.ts +98 -18
  532. package/src/tools/browser/attach.ts +71 -3
  533. package/src/tools/browser/launch.ts +86 -13
  534. package/src/tools/browser/profile-discovery.ts +57 -7
  535. package/src/tools/browser/render.ts +8 -1
  536. package/src/tools/browser.ts +130 -21
  537. package/src/tools/computer.enforcement.test.ts +1 -1
  538. package/src/tools/computer.ts +3 -2
  539. package/src/tools/cron.ts +12 -1
  540. package/src/tools/image-gen.ts +27 -16
  541. package/src/tools/index.ts +8 -0
  542. package/src/tools/job.ts +33 -6
  543. package/src/tools/monitor.ts +41 -2
  544. package/src/tools/skill-discovery.ts +21 -29
  545. package/src/tools/subagent.ts +142 -24
  546. package/src/tools/tool-catalog.generated.ts +6 -6
  547. package/src/tools/ultragoal-ask-guard.ts +10 -3
  548. package/src/utils/herdr-pane.ts +345 -0
  549. package/src/utils/title-generator.ts +2 -0
  550. package/src/web/scrapers/index.ts +6 -4
  551. package/dist/types/cli/malloc-env-guard.test.d.ts +0 -1
  552. package/dist/types/defaults/gjc-defaults.test.d.ts +0 -1
  553. package/dist/types/memory-backend/lazy-loading.test.d.ts +0 -1
  554. package/dist/types/runtime/boot-ordering.test.d.ts +0 -1
  555. package/dist/types/runtime/lazy-service.test.d.ts +0 -1
  556. package/dist/types/runtime/network-prewarm-service.test.d.ts +0 -1
  557. package/dist/types/runtime/workspace-tree-service.test.d.ts +0 -1
  558. package/dist/types/runtime-mcp/config.test.d.ts +0 -1
  559. package/dist/types/runtime-mcp/http.test.d.ts +0 -1
  560. package/dist/types/runtime-mcp/manager-pool.test.d.ts +0 -1
  561. package/dist/types/runtime-mcp/pool-key.test.d.ts +0 -1
  562. package/dist/types/runtime-mcp/pool.test.d.ts +0 -1
  563. package/dist/types/sdk/bus/lifecycle-control-runtime.d.ts +0 -117
  564. package/dist/types/sdk/bus/lifecycle-orchestrator.d.ts +0 -141
  565. package/dist/types/sdk/bus/telegram-cli.d.ts +0 -31
  566. package/dist/types/sdk/elevation/allowlist.d.ts +0 -20
  567. package/dist/types/sdk/elevation/audit.d.ts +0 -93
  568. package/dist/types/sdk/elevation/capability.d.ts +0 -3
  569. package/dist/types/sdk/elevation/digest.d.ts +0 -72
  570. package/dist/types/sdk/elevation/dispatch-receipt.d.ts +0 -85
  571. package/dist/types/sdk/elevation/grant-ledger.d.ts +0 -163
  572. package/dist/types/sdk/elevation/owner.d.ts +0 -48
  573. package/dist/types/sdk/host/import-graph.test.d.ts +0 -1
  574. package/dist/types/sdk/host/sdk-surface-parity.test.d.ts +0 -1
  575. package/dist/types/sdk/host/session-runtime.test.d.ts +0 -1
  576. package/dist/types/sdk/host/websocket-transport.lifecycle.test.d.ts +0 -1
  577. package/dist/types/session/auth-broker-config.d.ts +0 -13
  578. package/dist/types/session/heap-eviction-artifacts.test.d.ts +0 -1
  579. package/dist/types/skills/skills.test.d.ts +0 -1
  580. package/dist/types/slash-commands/notify-command.test.d.ts +0 -1
  581. package/dist/types/task/token-log.test.d.ts +0 -1
  582. package/dist/types/tools/computer.enforcement.test.d.ts +0 -1
  583. package/dist/types/tools/descriptors.test.d.ts +0 -1
  584. package/scripts/g005-daemon-smoke.ts +0 -180
  585. package/scripts/g011-daemon-path-smoke.ts +0 -153
  586. package/src/sdk/bus/lifecycle-control-runtime.ts +0 -1733
  587. package/src/sdk/bus/lifecycle-orchestrator.ts +0 -489
  588. package/src/sdk/bus/telegram-cli.ts +0 -212
  589. package/src/sdk/elevation/allowlist.ts +0 -54
  590. package/src/sdk/elevation/audit.ts +0 -208
  591. package/src/sdk/elevation/capability.ts +0 -41
  592. package/src/sdk/elevation/digest.ts +0 -129
  593. package/src/sdk/elevation/dispatch-receipt.ts +0 -184
  594. package/src/sdk/elevation/grant-ledger.ts +0 -1142
  595. package/src/sdk/elevation/owner.ts +0 -109
  596. package/src/session/auth-broker-config.ts +0 -109
  597. /package/dist/types/{ai-core-import-gate.test.d.ts → discovery/claude-hooks.d.ts} +0 -0
  598. /package/dist/types/{cli/fixture-report.test.d.ts → discovery/codex-hooks.d.ts} +0 -0
  599. /package/dist/types/sdk/{bus/recent-activity.d.ts → lifecycle/recent-sessions.d.ts} +0 -0
@@ -18,7 +18,7 @@ import {
18
18
  setServerDisabled,
19
19
  updateMCPServer,
20
20
  } from "../../runtime-mcp/config-writer";
21
- import { MCPOAuthFlow } from "../../runtime-mcp/oauth-flow";
21
+ import { canonicalMCPResourceUri, MCPOAuthFlow } from "../../runtime-mcp/oauth-flow";
22
22
  import {
23
23
  clearSmitheryApiKey,
24
24
  createSmitheryCliAuthSession,
@@ -434,6 +434,7 @@ export class MCPCommandController {
434
434
  finalConfig.oauth?.callbackPort,
435
435
  finalConfig.oauth?.callbackPath,
436
436
  finalConfig.oauth?.redirectUri,
437
+ { issuer: oauth.issuer, issuerResponseIssSupported: oauth.authorizationResponseIssSupported },
437
438
  );
438
439
  const persistedClientId = oauthResult.clientId ?? oauth.clientId ?? finalConfig.oauth?.clientId;
439
440
  const persistedClientSecret = oauthResult.clientSecret ?? finalConfig.oauth?.clientSecret;
@@ -522,6 +523,7 @@ export class MCPCommandController {
522
523
  callbackPort?: number,
523
524
  callbackPath?: string,
524
525
  redirectUri?: string,
526
+ oauthMeta?: { issuer?: string; issuerResponseIssSupported?: boolean },
525
527
  ): Promise<OAuthFlowResult> {
526
528
  const authStorage = this.ctx.session.modelRegistry.authStorage;
527
529
  let parsedAuthUrl: URL;
@@ -553,6 +555,13 @@ export class MCPCommandController {
553
555
  redirectUri,
554
556
  callbackPort,
555
557
  callbackPath,
558
+ // RFC 8707 canonical MCP server resource on auth + token requests.
559
+ ...(canonicalMCPResourceUri(endpointUrl) ? { resource: canonicalMCPResourceUri(endpointUrl) } : {}),
560
+ // RFC 9207 issuer validation (recorded from validated discovery metadata).
561
+ ...(oauthMeta?.issuer ? { issuer: oauthMeta.issuer } : {}),
562
+ ...(oauthMeta?.issuerResponseIssSupported !== undefined
563
+ ? { issuerResponseIssSupported: oauthMeta.issuerResponseIssSupported }
564
+ : {}),
556
565
  },
557
566
  {
558
567
  onAuth: (info: { url: string; instructions?: string }) => {
@@ -738,6 +747,8 @@ export class MCPCommandController {
738
747
  tokenUrl: string;
739
748
  clientId?: string;
740
749
  scopes?: string;
750
+ issuer?: string;
751
+ authorizationResponseIssSupported?: boolean;
741
752
  }> {
742
753
  // First test if server actually needs auth by connecting without OAuth
743
754
  let connectionSucceeded = false;
@@ -1358,6 +1369,7 @@ export class MCPCommandController {
1358
1369
  found.config.oauth?.callbackPort,
1359
1370
  found.config.oauth?.callbackPath,
1360
1371
  found.config.oauth?.redirectUri,
1372
+ { issuer: oauth.issuer, issuerResponseIssSupported: oauth.authorizationResponseIssSupported },
1361
1373
  );
1362
1374
 
1363
1375
  const persistedClientId = oauthResult.clientId ?? oauth.clientId ?? found.config.oauth?.clientId;
@@ -1466,8 +1478,9 @@ export class MCPCommandController {
1466
1478
  // Disconnect all existing servers
1467
1479
  await this.ctx.mcpManager.disconnectAll();
1468
1480
 
1469
- // Rediscover and connect
1470
- const result = await this.ctx.mcpManager.discoverAndConnect();
1481
+ // Rediscover and connect (native `.gjc` scopes only: Claude Code/Codex
1482
+ // MCP files are explicit import sources, not runtime authorities).
1483
+ const result = await this.ctx.mcpManager.discoverAndConnect({ nativeOnly: true });
1471
1484
  await this.ctx.session.refreshMCPTools(this.ctx.mcpManager.getTools());
1472
1485
 
1473
1486
  // Show any connection errors
@@ -1,6 +1,12 @@
1
1
  import * as path from "node:path";
2
2
  import { ThinkingLevel } from "@gajae-code/agent-core";
3
- import type { Api, Model } from "@gajae-code/ai/core";
3
+ import {
4
+ type Api,
5
+ type AuthCredentialSelector,
6
+ type CredentialRemovalTarget,
7
+ type Model,
8
+ resolveOAuthStorageProvider,
9
+ } from "@gajae-code/ai/core";
4
10
  import { getOAuthProviders } from "@gajae-code/ai/utils/oauth";
5
11
  import type { OAuthProvider } from "@gajae-code/ai/utils/oauth/types";
6
12
  import type { Component, OverlayHandle, SlashCommand } from "@gajae-code/tui";
@@ -85,19 +91,13 @@ import {
85
91
  sendNotificationTest,
86
92
  } from "../../sdk/bus/notification-service";
87
93
  import type { NotificationSessionStatus } from "../../sdk/bus/session-control";
88
- import {
89
- ensureTelegramDaemonRunningDetailed,
90
- readNotificationRootRegistration,
91
- resolveTelegramSetupPreflight,
92
- unregisterNotificationRoot,
93
- withNotificationRootRegistryFence,
94
- } from "../../sdk/bus/telegram-daemon";
94
+ import { ensureTelegramDaemonRunningDetailed, resolveTelegramSetupPreflight } from "../../sdk/bus/telegram-daemon";
95
95
  import { TelegramDaemonController } from "../../sdk/bus/telegram-daemon-control";
96
96
  import { runTelegramSetup, type TelegramSetupPreflight } from "../../sdk/bus/telegram-setup";
97
+ import { clearPersistentPinForRemovedRows } from "../../session/account-inventory";
97
98
  import type { DefaultFallbackRuntimeState } from "../../session/agent-session";
98
99
  import { type SessionInfo, SessionManager } from "../../session/session-manager";
99
100
  import { getTreeForInternalRead } from "../../session/session-manager-internal";
100
-
101
101
  import { FileSessionStorage } from "../../session/session-storage";
102
102
  import {
103
103
  CREDENTIAL_AUTO_IMPORT_DISCOVERY_WARNING,
@@ -147,6 +147,7 @@ import {
147
147
  type CustomModelPresetWizardSubmit,
148
148
  } from "../components/custom-model-preset-wizard";
149
149
  import { CustomProviderWizardComponent, type CustomProviderWizardSubmit } from "../components/custom-provider-wizard";
150
+ import { CustomizationDashboard } from "../components/customization";
150
151
  import { ExtensionDashboard } from "../components/extensions";
151
152
  import type { PetMode } from "../components/gajae-pet-widget";
152
153
  import { HistorySearchComponent } from "../components/history-search";
@@ -270,13 +271,6 @@ export interface NotificationsEditorOperationDependencies {
270
271
  reconcileCommittedTelegramConfiguration: typeof reconcileCommittedTelegramConfiguration;
271
272
  saveTelegramInactive: typeof saveTelegramInactive;
272
273
  removeTelegramConfiguration: typeof removeTelegramConfiguration;
273
- readNotificationRootRegistration: typeof readNotificationRootRegistration;
274
- unregisterNotificationRoot: typeof unregisterNotificationRoot;
275
- stopTelegramDaemonIfRootRegistryFenceMatches(input: {
276
- settings: Settings;
277
- registryFingerprint: string;
278
- stop: () => Promise<TelegramDaemonStopResult>;
279
- }): Promise<boolean>;
280
274
 
281
275
  reloadTelegramDaemon(settings: Settings): Promise<{ ok: boolean; message: string }>;
282
276
  restartTelegramDaemon(settings: Settings): Promise<{ ok: boolean; message: string }>;
@@ -300,17 +294,6 @@ const notificationEditorOperationDependencies: NotificationsEditorOperationDepen
300
294
  reconcileCommittedTelegramConfiguration,
301
295
  saveTelegramInactive,
302
296
  removeTelegramConfiguration,
303
- readNotificationRootRegistration,
304
- unregisterNotificationRoot,
305
- stopTelegramDaemonIfRootRegistryFenceMatches: async input =>
306
- await withNotificationRootRegistryFence({
307
- settings: input.settings,
308
- registryFingerprint: input.registryFingerprint,
309
- action: async () => {
310
- const stopped = await input.stop();
311
- if (!stopped.ok) throw new Error(stopped.message);
312
- },
313
- }),
314
297
 
315
298
  reloadTelegramDaemon: async settings =>
316
299
  await new TelegramDaemonController(settings).reload({ spawnIfStopped: false }),
@@ -361,12 +344,7 @@ export function createNotificationsEditorOperations(
361
344
  const notifyAfterDurableCommit = async (): Promise<void> => {
362
345
  await ctx.notifyConfigChanged?.();
363
346
  };
364
- const reconnect = async () =>
365
- await services.ensureTelegramDaemonRunningDetailed({
366
- settings: ctx.settings,
367
- cwd: ctx.sessionManager.getCwd(),
368
- sessionId: ctx.sessionManager.getSessionId(),
369
- });
347
+ const reconnect = async () => await services.ensureTelegramDaemonRunningDetailed({ settings: ctx.settings });
370
348
  const telegramSetupPreflight = async (): Promise<TelegramSetupPreflight> =>
371
349
  await services.resolveTelegramSetupPreflight(ctx.settings);
372
350
  const providerRuntime: NotificationProviderRuntimeAuthority = services.providerRuntime ?? {
@@ -1041,23 +1019,8 @@ export function createNotificationsEditorOperations(
1041
1019
  stopAndUnregister: async () => {
1042
1020
  if (controller) await controller.enterBlockedRuntime(sessionContext());
1043
1021
  runtimePrepared = true;
1044
- const registration = await services.readNotificationRootRegistration({
1045
- settings: ctx.settings,
1046
- sessionId: ctx.sessionManager.getSessionId(),
1047
- });
1048
- const unregistered = await services.unregisterNotificationRoot({
1049
- settings: ctx.settings,
1050
- cwd: ctx.sessionManager.getCwd(),
1051
- sessionId: ctx.sessionManager.getSessionId(),
1052
- registrationToken: registration.token,
1053
- });
1054
- if (unregistered.registryFingerprint !== undefined) {
1055
- await services.stopTelegramDaemonIfRootRegistryFenceMatches({
1056
- settings: ctx.settings,
1057
- registryFingerprint: unregistered.registryFingerprint,
1058
- stop: () => services.stopTelegramDaemon(ctx.settings),
1059
- });
1060
- }
1022
+ const stopped = await services.stopTelegramDaemon(ctx.settings);
1023
+ if (!stopped.ok) throw new Error(stopped.message);
1061
1024
  },
1062
1025
  },
1063
1026
  });
@@ -2011,6 +1974,31 @@ export class SelectorController {
2011
1974
  });
2012
1975
  }
2013
1976
 
1977
+ /**
1978
+ * Show the `/extensions` umbrella local-customization dashboard (skills,
1979
+ * hooks, MCPs, import) — a separate surface from the provider-focused
1980
+ * Extension Control Center above (issue #4291).
1981
+ */
1982
+ async showCustomizationDashboard(): Promise<void> {
1983
+ let dashboard: CustomizationDashboard;
1984
+ try {
1985
+ dashboard = await CustomizationDashboard.create(getProjectDir(), this.ctx.settings);
1986
+ } catch (error) {
1987
+ this.ctx.showError(`Failed to open /extensions: ${error instanceof Error ? error.message : String(error)}`);
1988
+ return;
1989
+ }
1990
+ this.showSelector(done => {
1991
+ dashboard.onClose = () => {
1992
+ done();
1993
+ this.ctx.ui.requestRender();
1994
+ };
1995
+ dashboard.onRequestRender = () => {
1996
+ this.ctx.ui.requestRender();
1997
+ };
1998
+ return { component: dashboard, focus: dashboard };
1999
+ });
2000
+ }
2001
+
2014
2002
  /**
2015
2003
  * Show the Agent Control Center dashboard.
2016
2004
  */
@@ -3210,18 +3198,60 @@ export class SelectorController {
3210
3198
  }
3211
3199
  }
3212
3200
 
3213
- async #handleOAuthLogout(providerId: string): Promise<void> {
3201
+ async #handleOAuthLogout(providerId: string, targets?: readonly CredentialRemovalTarget[]): Promise<void> {
3214
3202
  try {
3215
- await this.ctx.session.modelRegistry.authStorage.logout(providerId);
3216
- await this.ctx.session.modelRegistry.refresh();
3217
- this.ctx.chatContainer.addChild(new Spacer(1));
3218
- this.ctx.chatContainer.addChild(
3219
- new Text(theme.fg("success", `${theme.status.success} Successfully logged out of ${providerId}`), 1, 0),
3203
+ const authStorage = this.ctx.session.modelRegistry.authStorage;
3204
+ const inventory = authStorage.listCredentialInventory(providerId);
3205
+ const oauthRows = inventory.filter(row => row.provider === providerId && row.credentialKind === "oauth");
3206
+ const removalTargetsById = new Map(
3207
+ authStorage.listCredentialRemovalTargets(providerId).map(target => [target.id, target]),
3220
3208
  );
3221
- this.ctx.chatContainer.addChild(
3222
- new Text(theme.fg("dim", `Credentials removed from ${getAgentDbPath()}`), 1, 0),
3209
+ const oauthRemovalTargets = oauthRows
3210
+ .map(row => removalTargetsById.get(row.id))
3211
+ .filter((target): target is CredentialRemovalTarget => target !== undefined);
3212
+ if (oauthRows.length > 0 && oauthRemovalTargets.length === 0) {
3213
+ this.ctx.showError(
3214
+ `Logout is broker-managed for ${providerId}; run \`gjc auth-broker logout ${providerId}\` on the broker host.`,
3215
+ );
3216
+ return;
3217
+ }
3218
+ if (targets) {
3219
+ if (targets.length === 0) {
3220
+ this.ctx.showError(
3221
+ `No OAuth accounts to remove for ${providerId}; API-key credentials are not managed here.`,
3222
+ );
3223
+ return;
3224
+ }
3225
+ const result = authStorage.removeAuthCredentialsHard(providerId, targets);
3226
+ if (result.kind !== "removed") {
3227
+ this.ctx.showError(
3228
+ "Logout failed: account inventory changed; no credentials were removed. Retry /logout.",
3229
+ );
3230
+ return;
3231
+ }
3232
+ await clearPersistentPinForRemovedRows(this.ctx.settings, providerId, inventory, result.ids);
3233
+ await this.ctx.session.modelRegistry.refresh();
3234
+ this.ctx.showStatus(
3235
+ `Successfully removed ${result.ids.length} OAuth account${result.ids.length === 1 ? "" : "s"} from ${providerId}.`,
3236
+ );
3237
+ return;
3238
+ }
3239
+ if (oauthRemovalTargets.length === 0) {
3240
+ this.ctx.showError(
3241
+ `No OAuth accounts to remove for ${providerId}; API-key credentials are not managed here.`,
3242
+ );
3243
+ return;
3244
+ }
3245
+ const result = authStorage.removeAuthCredentialsHard(providerId, oauthRemovalTargets);
3246
+ if (result.kind !== "removed") {
3247
+ this.ctx.showError("Logout failed: account inventory changed; no credentials were removed. Retry /logout.");
3248
+ return;
3249
+ }
3250
+ await clearPersistentPinForRemovedRows(this.ctx.settings, providerId, inventory, result.ids);
3251
+ await this.ctx.session.modelRegistry.refresh();
3252
+ this.ctx.showStatus(
3253
+ `Successfully removed ${result.ids.length} OAuth account${result.ids.length === 1 ? "" : "s"} from ${providerId}.`,
3223
3254
  );
3224
- this.ctx.ui.requestRender();
3225
3255
  } catch (error: unknown) {
3226
3256
  this.ctx.showError(`Logout failed: ${error instanceof Error ? error.message : String(error)}`);
3227
3257
  }
@@ -3233,16 +3263,95 @@ export class SelectorController {
3233
3263
  options?: OAuthSelectorOptions,
3234
3264
  ): Promise<void> {
3235
3265
  if (providerId) {
3236
- const oauthProvider = getOAuthProviders().find(provider => provider.id === providerId);
3237
- if (!oauthProvider && !this.ctx.session.modelRegistry.getModelProfiles().has(providerId)) {
3238
- this.ctx.showError(`Unknown OAuth provider: ${providerId}`);
3266
+ const selectedProviderId = mode === "logout" ? resolveOAuthStorageProvider(providerId) : providerId;
3267
+ const oauthProvider = getOAuthProviders().find(provider => provider.id === selectedProviderId);
3268
+ if (!oauthProvider && !this.ctx.session.modelRegistry.getModelProfiles().has(selectedProviderId)) {
3269
+ this.ctx.showError(`Unknown OAuth provider: ${selectedProviderId}`);
3270
+ return;
3271
+ }
3272
+ const authStorage = this.ctx.session.modelRegistry.authStorage;
3273
+ const hasOAuthInventory = authStorage
3274
+ .listCredentialInventory(selectedProviderId)
3275
+ .some(row => row.provider === selectedProviderId && row.credentialKind === "oauth");
3276
+ const hasRemovableOAuth = authStorage
3277
+ .listCredentialRemovalTargets(selectedProviderId)
3278
+ .some(target => target.provider === selectedProviderId);
3279
+ if (mode === "logout" && hasOAuthInventory && !hasRemovableOAuth) {
3280
+ await this.#handleOAuthLogout(selectedProviderId);
3281
+ return;
3282
+ }
3283
+ if (hasOAuthInventory && !options?.manualCode) {
3284
+ this.showSelector(done => {
3285
+ let selector: OAuthSelectorComponent;
3286
+ selector = new OAuthSelectorComponent(
3287
+ mode,
3288
+ authStorage,
3289
+ () => undefined,
3290
+ () => {
3291
+ selector.stopValidation();
3292
+ done();
3293
+ this.ctx.ui.requestRender();
3294
+ },
3295
+ {
3296
+ accountProviderId: selectedProviderId,
3297
+ onAccountSelect: async (selectorValue: AuthCredentialSelector) => {
3298
+ await this.ctx.session.setCredentialPin(selectedProviderId, selectorValue);
3299
+ selector.stopValidation();
3300
+ done();
3301
+ this.ctx.showStatus(`Pinned OAuth account for ${selectedProviderId} to this session.`);
3302
+ },
3303
+ onAutoSelect: async () => {
3304
+ await this.ctx.session.setCredentialAuto(selectedProviderId);
3305
+ selector.stopValidation();
3306
+ done();
3307
+ this.ctx.showStatus(`Using AUTO (ranked) OAuth accounts for ${selectedProviderId}.`);
3308
+ },
3309
+ onAddAccount: async () => {
3310
+ selector.stopValidation();
3311
+ done();
3312
+ await this.#handleOAuthLogin(selectedProviderId, options);
3313
+ },
3314
+ onAccountRemove: async targets => {
3315
+ await this.#handleOAuthLogout(selectedProviderId, targets);
3316
+ selector.stopValidation();
3317
+ done();
3318
+ },
3319
+ },
3320
+ );
3321
+ return { component: selector, focus: selector };
3322
+ });
3239
3323
  return;
3240
3324
  }
3241
3325
  if (mode === "login") {
3242
- await this.#handleOAuthLogin(providerId, options);
3243
- } else {
3244
- await this.#handleOAuthLogout(providerId);
3326
+ await this.#handleOAuthLogin(selectedProviderId, options);
3327
+ return;
3328
+ }
3329
+ if (!hasRemovableOAuth) {
3330
+ await this.#handleOAuthLogout(selectedProviderId);
3331
+ return;
3245
3332
  }
3333
+ this.showSelector(done => {
3334
+ let selector: OAuthSelectorComponent;
3335
+ selector = new OAuthSelectorComponent(
3336
+ "logout",
3337
+ authStorage,
3338
+ () => undefined,
3339
+ () => {
3340
+ selector.stopValidation();
3341
+ done();
3342
+ this.ctx.ui.requestRender();
3343
+ },
3344
+ {
3345
+ accountProviderId: selectedProviderId,
3346
+ onAccountRemove: async targets => {
3347
+ await this.#handleOAuthLogout(selectedProviderId, targets);
3348
+ selector.stopValidation();
3349
+ done();
3350
+ },
3351
+ },
3352
+ );
3353
+ return { component: selector, focus: selector };
3354
+ });
3246
3355
  return;
3247
3356
  }
3248
3357
 
@@ -3384,16 +3493,12 @@ export class SelectorController {
3384
3493
  async (selectedProviderId: string) => {
3385
3494
  selector.stopValidation();
3386
3495
  done();
3387
- if (mode === "login") {
3388
- await this.#handleOAuthLogin(selectedProviderId);
3389
- } else {
3390
- await this.#handleOAuthLogout(selectedProviderId);
3391
- }
3496
+ await this.showOAuthSelector(mode, selectedProviderId);
3392
3497
  },
3393
3498
  () => {
3394
3499
  selector.stopValidation();
3395
3500
  done();
3396
- this.ctx.ui.requestRender();
3501
+ this.ctx.ui.requestLayoutRender("oauth-selector-close");
3397
3502
  },
3398
3503
  {
3399
3504
  validateAuth: async (selectedProviderId: string) => {
@@ -3404,7 +3509,7 @@ export class SelectorController {
3404
3509
  return !!apiKey;
3405
3510
  },
3406
3511
  requestRender: () => {
3407
- this.ctx.ui.requestRender();
3512
+ this.ctx.ui.requestLayoutRender("oauth-selector-spinner");
3408
3513
  },
3409
3514
  externalCredentialCandidates,
3410
3515
  },
@@ -12,7 +12,7 @@ interface SttEditor {
12
12
 
13
13
  interface SttUi {
14
14
  getShowHardwareCursor(): boolean;
15
- requestRender(): void;
15
+ requestLayoutRender(source?: string): void;
16
16
  setShowHardwareCursor(enabled: boolean): void;
17
17
  }
18
18
 
@@ -59,7 +59,7 @@ export class SttModeController {
59
59
  this.#cleanupAnimation(ctx);
60
60
  }
61
61
  ctx.updateEditorChrome();
62
- ctx.ui.requestRender();
62
+ ctx.ui.requestLayoutRender("stt-state");
63
63
  }
64
64
 
65
65
  #setMicCursor(editor: SttEditor, color: { r: number; g: number; b: number }): void {
@@ -74,7 +74,7 @@ export class SttModeController {
74
74
  this.#animationInterval = setInterval(() => {
75
75
  this.#hue = (this.#hue + 8) % 360;
76
76
  this.#updateMicIcon(ctx.editor);
77
- ctx.ui.requestRender();
77
+ ctx.ui.requestLayoutRender("stt-animation");
78
78
  }, 60);
79
79
  }
80
80
 
@@ -25,6 +25,8 @@ import {
25
25
  type KeyDisplayContext,
26
26
  } from "../config/keybindings";
27
27
  import { isSettingsInitialized, type Settings, settings } from "../config/settings";
28
+ import { compactCrashIndex, resolveCrashStatePaths } from "../crash/index-store";
29
+ import { crashNudgeGate, maybeShowCrashNudge } from "../crash/nudge";
28
30
  import { DEFAULT_GJC_DEFINITION_NAMES } from "../defaults/gjc-defaults";
29
31
  import type {
30
32
  ExtensionUIContext,
@@ -67,10 +69,14 @@ import {
67
69
  IrcLeftLaneComponent,
68
70
  IrcSplitViewComponent,
69
71
  } from "./components/irc-sidebar";
72
+ import { createNativePetTransport, type ItermPetTransport } from "./components/iterm-pet-transport";
70
73
  import {
74
+ getItermPetAvailability,
75
+ getItermPetUnavailableReason,
71
76
  getPetUnavailableWarning,
72
77
  isPetAvailable,
73
78
  isPetCapabilityProbePending,
79
+ setVerifiedItermPetAvailability,
74
80
  warnWhenPetCapabilitySettled,
75
81
  } from "./components/pet-capability";
76
82
  import type { ToolExecutionHandle } from "./components/tool-execution";
@@ -432,6 +438,20 @@ export class InteractiveMode implements InteractiveModeContext {
432
438
  #resolvedSlashCommands: SlashCommand[] = [];
433
439
  #baseReservedSlashCommandNames: Set<string> = new Set();
434
440
  #cleanupUnsubscribe?: () => void;
441
+ #itermPetTransport?: ItermPetTransport;
442
+
443
+ /**
444
+ * Pet-unavailable warning text. The iTerm transport reason is parenthesized
445
+ * only when a transport actually reported one; non-iTerm terminals and a
446
+ * probe still in flight keep the plain warning instead of "(unknown)".
447
+ */
448
+ #petUnavailableStatusText(): string {
449
+ if (!this.#itermPetTransport || getItermPetAvailability() === undefined) return getPetUnavailableWarning();
450
+ const reason = getItermPetUnavailableReason();
451
+ return reason === undefined ? getPetUnavailableWarning() : `${getPetUnavailableWarning()} (${reason})`;
452
+ }
453
+
454
+ #petTransportAvailabilityUnsubscribe?: () => void;
435
455
  #subprocessTeardownUnsubscribe?: () => void;
436
456
  #petProtocolUnsubscribe?: () => void;
437
457
  /** Cancels a startup pet-unavailable warning still awaiting probe settlement. */
@@ -618,6 +638,18 @@ export class InteractiveMode implements InteractiveModeContext {
618
638
  }
619
639
  },
620
640
  });
641
+ this.#itermPetTransport = createNativePetTransport({ ui: this.ui });
642
+ if (this.#itermPetTransport) {
643
+ this.#petTransportAvailabilityUnsubscribe = this.#itermPetTransport.subscribe(availability => {
644
+ if (!availability.available) void this.petWidget?.suspendItermCapability();
645
+ setVerifiedItermPetAvailability(availability);
646
+ if (availability.available) {
647
+ if (availability.mode === "managed") this.ui.refreshImageCellSize();
648
+ const saved = settings.get("pet.mode");
649
+ if (saved !== "off" && this.petWidget && this.petWidget.mode === "off") this.petWidget.setMode(saved);
650
+ }
651
+ });
652
+ }
621
653
  this.ui.setClearOnShrink(settings.get("clearOnShrink"));
622
654
  this.chatContainer = new Container();
623
655
  this.#ircSplitView = new IrcSplitViewComponent(this.chatContainer, this.ircLedger, () => theme);
@@ -810,26 +842,15 @@ export class InteractiveMode implements InteractiveModeContext {
810
842
  // appears without the user re-running /pet.
811
843
  this.#petProtocolUnsubscribe?.();
812
844
  this.#petProtocolUnsubscribe = onImageProtocolChanged(protocol => {
813
- if (!protocol) return;
845
+ if (!protocol) {
846
+ void this.petWidget?.suspendItermCapability();
847
+ return;
848
+ }
814
849
  const saved = settings.get("pet.mode");
815
850
  if (saved !== "off" && this.petWidget && this.petWidget.mode === "off") {
816
851
  this.petWidget.setMode(saved);
817
852
  }
818
853
  });
819
- if (configuredPetMode !== "off" && !isPetAvailable()) {
820
- // The async Sixel capability probe (started by TUI.start()) may still
821
- // enable graphics; warn only once the capability question is settled
822
- // so a supported terminal is never told it is incompatible.
823
- this.#petUnavailableWarningDisposer?.();
824
- this.#petUnavailableWarningDisposer = warnWhenPetCapabilitySettled({
825
- probePending: isPetCapabilityProbePending(),
826
- onUnavailable: () => {
827
- this.showStatus(theme.fg("warning", getPetUnavailableWarning()), { dim: false });
828
- this.ui.requestRender();
829
- },
830
- });
831
- }
832
-
833
854
  this.#inputController.setupKeyHandlers();
834
855
  this.#inputController.setupEditorSubmitHandler();
835
856
  this.editor.onViewportPageScroll = direction => {
@@ -878,6 +899,23 @@ export class InteractiveMode implements InteractiveModeContext {
878
899
 
879
900
  // Start the UI
880
901
  this.ui.start();
902
+ if (this.#itermPetTransport) {
903
+ if (this.#itermPetTransport.availability.mode === "direct") void this.#itermPetTransport.probe();
904
+ else this.#itermPetTransport.startManagedPolling();
905
+ }
906
+ if (configuredPetMode !== "off" && !isPetAvailable()) {
907
+ // An async terminal capability probe may still enable graphics; warn only once
908
+ // the capability question is settled so a supported terminal is never told it
909
+ // is incompatible.
910
+ this.#petUnavailableWarningDisposer?.();
911
+ this.#petUnavailableWarningDisposer = warnWhenPetCapabilitySettled({
912
+ probePending: this.#itermPetTransport !== undefined || isPetCapabilityProbePending(),
913
+ onUnavailable: () => {
914
+ this.showStatus(theme.fg("warning", this.#petUnavailableStatusText()), { dim: false });
915
+ this.ui.requestRender();
916
+ },
917
+ });
918
+ }
881
919
  pushTerminalTitle();
882
920
  setSessionTerminalTitle(this.sessionManager.getSessionName(), this.sessionManager.getCwd());
883
921
  this.updateEditorChrome();
@@ -928,6 +966,26 @@ export class InteractiveMode implements InteractiveModeContext {
928
966
  }),
929
967
  );
930
968
  }
969
+ // Crash nudge (interactive-only, local-only). Runs after the first render
970
+ // and routes through the centralized status surface — never `console.*`.
971
+ if (crashNudgeGate({ enabled: settings.get("crashReport.nudge"), interactive: true, quiet: startupQuiet })) {
972
+ const crashNudgeTimer = setTimeout(() => {
973
+ void (async () => {
974
+ try {
975
+ const paths = resolveCrashStatePaths();
976
+ const index = await compactCrashIndex({ paths });
977
+ if (this.#stopped) return;
978
+ await maybeShowCrashNudge(message => this.showStatus(message, { dim: true }), { paths, index });
979
+ } catch (error) {
980
+ logger.debug("Crash nudge skipped", {
981
+ error: error instanceof Error ? error.message : String(error),
982
+ });
983
+ }
984
+ })();
985
+ }, 0);
986
+ crashNudgeTimer.unref?.();
987
+ }
988
+
931
989
  if (starReminderGate.schedule) {
932
990
  scheduleLaunchStarReminderAfterFirstRender({
933
991
  confirm: (title, message) =>
@@ -1301,7 +1359,8 @@ export class InteractiveMode implements InteractiveModeContext {
1301
1359
  */
1302
1360
  #commitPetMode(mode: PetMode, apply: (mode: PetMode) => void): boolean {
1303
1361
  if (mode !== "off" && !isPetAvailable()) {
1304
- this.showStatus(theme.fg("warning", getPetUnavailableWarning()), { dim: false });
1362
+ void this.#itermPetTransport?.retry();
1363
+ this.showStatus(theme.fg("warning", this.#petUnavailableStatusText()), { dim: false });
1305
1364
  this.ui.requestRender();
1306
1365
  return false;
1307
1366
  }
@@ -1362,6 +1421,8 @@ export class InteractiveMode implements InteractiveModeContext {
1362
1421
  getComposerBottomOffset: () =>
1363
1422
  this.petFloorContainer.render(this.ui.terminal.columns).length +
1364
1423
  this.hookWidgetContainerBelow.render(this.ui.terminal.columns).length,
1424
+ syncManagedItermCursor: (row, column) =>
1425
+ this.#itermPetTransport?.refreshManagedClient(row, column) ?? Promise.resolve(false),
1365
1426
  });
1366
1427
  }
1367
1428
 
@@ -1515,6 +1576,11 @@ export class InteractiveMode implements InteractiveModeContext {
1515
1576
  this.#petUnavailableWarningDisposer = undefined;
1516
1577
  this.petWidget?.dispose();
1517
1578
  this.petWidget = undefined;
1579
+ this.#petTransportAvailabilityUnsubscribe?.();
1580
+ this.#petTransportAvailabilityUnsubscribe = undefined;
1581
+ void this.#itermPetTransport?.dispose();
1582
+ this.#itermPetTransport = undefined;
1583
+ setVerifiedItermPetAvailability(undefined);
1518
1584
  this.#welcomeComponent?.dispose();
1519
1585
  this.#welcomeComponent = undefined;
1520
1586
  if (this.#sttController) {
@@ -1585,6 +1651,8 @@ export class InteractiveMode implements InteractiveModeContext {
1585
1651
  // This prevents escape sequences from leaking to the parent shell over slow SSH.
1586
1652
  await this.ui.terminal.drainInput(1000);
1587
1653
  popTerminalTitle();
1654
+ await this.petWidget?.disposeAsync();
1655
+ await this.#itermPetTransport?.dispose();
1588
1656
  this.stop();
1589
1657
 
1590
1658
  // Print resumption hint if this is a persisted session
@@ -2249,6 +2317,10 @@ export class InteractiveMode implements InteractiveModeContext {
2249
2317
  void this.#selectorController.showExtensionsDashboard();
2250
2318
  }
2251
2319
 
2320
+ showCustomizationDashboard(): void {
2321
+ void this.#selectorController.showCustomizationDashboard();
2322
+ }
2323
+
2252
2324
  showAgentsDashboard(): void {
2253
2325
  void this.#selectorController.showAgentsDashboard();
2254
2326
  }