@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
@@ -1,10 +1,16 @@
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";
7
- import { Input, isPetMode, Loader, Spacer, Text } from "@gajae-code/tui";
13
+ import { Input, Loader, resolvePetMode, Spacer, Text } from "@gajae-code/tui";
8
14
  import { getAgentDbPath, getProjectDir, logger, VERSION } from "@gajae-code/utils";
9
15
  import type { AppKeybinding } from "../../config/keybindings";
10
16
  import {
@@ -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
  });
@@ -1772,6 +1735,36 @@ export class SelectorController {
1772
1735
  this.#refreshThemeUi();
1773
1736
  });
1774
1737
  },
1738
+ onThemeCommit: async (path, themeName, previousTheme) => {
1739
+ if (!settings.canWriteDurableConfig()) {
1740
+ this.ctx.showError(
1741
+ "Cannot change settings while config.yml has invalid YAML syntax. Repair config.yml and reload settings.",
1742
+ );
1743
+ return false;
1744
+ }
1745
+ const applied = await restoreThemePreview(themeName);
1746
+ if (!applied.success) {
1747
+ if (applied.error && !isThemePreviewSuperseded(applied)) {
1748
+ this.ctx.showError(`Failed to apply theme "${themeName}": ${applied.error}`);
1749
+ }
1750
+ const restored = await restoreThemePreview(previousTheme);
1751
+ if (!restored.success && restored.error && !isThemePreviewSuperseded(restored)) {
1752
+ this.ctx.showError(`Failed to restore theme preview: ${restored.error}`);
1753
+ }
1754
+ this.#refreshThemeUi();
1755
+ return false;
1756
+ }
1757
+ try {
1758
+ settings.set(path, themeName);
1759
+ } catch (error) {
1760
+ await restoreThemePreview(previousTheme);
1761
+ this.ctx.showError(error instanceof Error ? error.message : String(error));
1762
+ this.#refreshThemeUi();
1763
+ return false;
1764
+ }
1765
+ this.#refreshThemeUi();
1766
+ return true;
1767
+ },
1775
1768
  onPetPreview: mode => {
1776
1769
  this.ctx.previewPetMode(mode as PetMode);
1777
1770
  },
@@ -1853,6 +1846,8 @@ export class SelectorController {
1853
1846
  showThemeSelector(): void {
1854
1847
  getAvailableThemes().then(availableThemes => {
1855
1848
  const initialTheme = getCurrentThemeName() ?? "red-claw";
1849
+ const settingsPath = getDetectedThemeSettingsPath();
1850
+ const savedTheme = settings.get(settingsPath);
1856
1851
  this.showSelector(done => {
1857
1852
  const restoreAndClose = () => {
1858
1853
  void restoreThemePreview(initialTheme).then(result => {
@@ -1875,7 +1870,7 @@ export class SelectorController {
1875
1870
  return;
1876
1871
  }
1877
1872
  try {
1878
- settings.set(getDetectedThemeSettingsPath(), themeName);
1873
+ settings.set(settingsPath, themeName);
1879
1874
  } catch (error) {
1880
1875
  if (!settings.canWriteDurableConfig()) {
1881
1876
  this.ctx.showError(error instanceof Error ? error.message : String(error));
@@ -1884,8 +1879,21 @@ export class SelectorController {
1884
1879
  }
1885
1880
  throw error;
1886
1881
  }
1887
- this.#refreshThemeUi();
1888
- done();
1882
+ void restoreThemePreview(themeName).then(result => {
1883
+ if (!result.success && result.error && !isThemePreviewSuperseded(result)) {
1884
+ this.ctx.showError(`Failed to apply theme: ${result.error}`);
1885
+ settings.set(settingsPath, savedTheme);
1886
+ void restoreThemePreview(initialTheme).then(recovery => {
1887
+ if (!recovery.success && recovery.error && !isThemePreviewSuperseded(recovery)) {
1888
+ this.ctx.showError(`Failed to restore theme preview: ${recovery.error}`);
1889
+ }
1890
+ this.#refreshThemeUi();
1891
+ });
1892
+ return;
1893
+ }
1894
+ this.#refreshThemeUi();
1895
+ done();
1896
+ });
1889
1897
  },
1890
1898
  restoreAndClose,
1891
1899
  themeName => {
@@ -1904,7 +1912,7 @@ export class SelectorController {
1904
1912
 
1905
1913
  showPetSelector(): void {
1906
1914
  const stored = settings.get("pet.mode");
1907
- const initial: PetMode = isPetMode(stored) ? stored : "off";
1915
+ const initial: PetMode = resolvePetMode(stored);
1908
1916
  this.showSelector(done => {
1909
1917
  // Live-preview via previewMode (no editor re-mount, so the overlay stays);
1910
1918
  // Enter commits + persists, Esc restores the initial skin.
@@ -1966,6 +1974,31 @@ export class SelectorController {
1966
1974
  });
1967
1975
  }
1968
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
+
1969
2002
  /**
1970
2003
  * Show the Agent Control Center dashboard.
1971
2004
  */
@@ -2091,6 +2124,17 @@ export class SelectorController {
2091
2124
  });
2092
2125
  break;
2093
2126
  }
2127
+ case "theme.dark":
2128
+ case "theme.light": {
2129
+ restoreThemePreview(value as string).then(result => {
2130
+ if (this.ctx.isStopped?.()) return;
2131
+ this.#refreshThemeUi();
2132
+ if (!result.success && result.error && !isThemePreviewSuperseded(result)) {
2133
+ this.ctx.showError(`Failed to apply theme "${value}": ${result.error}`);
2134
+ }
2135
+ });
2136
+ break;
2137
+ }
2094
2138
  case "pet.mode":
2095
2139
  // The settings submenu already persisted the value; apply it to the live
2096
2140
  // widget via previewMode (the settings overlay is still open, so a full
@@ -3154,18 +3198,60 @@ export class SelectorController {
3154
3198
  }
3155
3199
  }
3156
3200
 
3157
- async #handleOAuthLogout(providerId: string): Promise<void> {
3201
+ async #handleOAuthLogout(providerId: string, targets?: readonly CredentialRemovalTarget[]): Promise<void> {
3158
3202
  try {
3159
- await this.ctx.session.modelRegistry.authStorage.logout(providerId);
3160
- await this.ctx.session.modelRegistry.refresh();
3161
- this.ctx.chatContainer.addChild(new Spacer(1));
3162
- this.ctx.chatContainer.addChild(
3163
- 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]),
3164
3208
  );
3165
- this.ctx.chatContainer.addChild(
3166
- 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}.`,
3167
3254
  );
3168
- this.ctx.ui.requestRender();
3169
3255
  } catch (error: unknown) {
3170
3256
  this.ctx.showError(`Logout failed: ${error instanceof Error ? error.message : String(error)}`);
3171
3257
  }
@@ -3177,16 +3263,95 @@ export class SelectorController {
3177
3263
  options?: OAuthSelectorOptions,
3178
3264
  ): Promise<void> {
3179
3265
  if (providerId) {
3180
- const oauthProvider = getOAuthProviders().find(provider => provider.id === providerId);
3181
- if (!oauthProvider && !this.ctx.session.modelRegistry.getModelProfiles().has(providerId)) {
3182
- 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
+ });
3183
3323
  return;
3184
3324
  }
3185
3325
  if (mode === "login") {
3186
- await this.#handleOAuthLogin(providerId, options);
3187
- } else {
3188
- await this.#handleOAuthLogout(providerId);
3326
+ await this.#handleOAuthLogin(selectedProviderId, options);
3327
+ return;
3189
3328
  }
3329
+ if (!hasRemovableOAuth) {
3330
+ await this.#handleOAuthLogout(selectedProviderId);
3331
+ return;
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
+ });
3190
3355
  return;
3191
3356
  }
3192
3357
 
@@ -3328,16 +3493,12 @@ export class SelectorController {
3328
3493
  async (selectedProviderId: string) => {
3329
3494
  selector.stopValidation();
3330
3495
  done();
3331
- if (mode === "login") {
3332
- await this.#handleOAuthLogin(selectedProviderId);
3333
- } else {
3334
- await this.#handleOAuthLogout(selectedProviderId);
3335
- }
3496
+ await this.showOAuthSelector(mode, selectedProviderId);
3336
3497
  },
3337
3498
  () => {
3338
3499
  selector.stopValidation();
3339
3500
  done();
3340
- this.ctx.ui.requestRender();
3501
+ this.ctx.ui.requestLayoutRender("oauth-selector-close");
3341
3502
  },
3342
3503
  {
3343
3504
  validateAuth: async (selectedProviderId: string) => {
@@ -3348,7 +3509,7 @@ export class SelectorController {
3348
3509
  return !!apiKey;
3349
3510
  },
3350
3511
  requestRender: () => {
3351
- this.ctx.ui.requestRender();
3512
+ this.ctx.ui.requestLayoutRender("oauth-selector-spinner");
3352
3513
  },
3353
3514
  externalCredentialCandidates,
3354
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
  }