@gajae-code/coding-agent 0.10.1 → 0.11.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 (474) hide show
  1. package/CHANGELOG.md +70 -2
  2. package/dist/types/append-only-mode.d.ts +1 -1
  3. package/dist/types/cli/args.d.ts +4 -5
  4. package/dist/types/cli/daemon-cli.d.ts +12 -1
  5. package/dist/types/cli/notify-cli.d.ts +21 -1
  6. package/dist/types/cli.d.ts +3 -0
  7. package/dist/types/commands/daemon.d.ts +39 -0
  8. package/dist/types/commands/launch.d.ts +3 -0
  9. package/dist/types/commands/notify.d.ts +28 -1
  10. package/dist/types/commands/sdk.d.ts +33 -0
  11. package/dist/types/config/atomic-yaml-patch.d.ts +85 -0
  12. package/dist/types/config/model-profile-activation.d.ts +35 -15
  13. package/dist/types/config/model-profiles.d.ts +11 -5
  14. package/dist/types/config/model-registry.d.ts +3 -3
  15. package/dist/types/config/model-resolver.d.ts +39 -6
  16. package/dist/types/config/model-selector-value.d.ts +17 -0
  17. package/dist/types/config/models-config-schema.d.ts +10 -6
  18. package/dist/types/config/settings-schema.d.ts +133 -6
  19. package/dist/types/config/settings.d.ts +63 -35
  20. package/dist/types/coordinator-mcp/model-preset.d.ts +7 -6
  21. package/dist/types/coordinator-mcp/server.d.ts +6 -49
  22. package/dist/types/daemon/builtin.d.ts +6 -5
  23. package/dist/types/daemon/control-types.d.ts +1 -1
  24. package/dist/types/discovery/mcp-json.d.ts +12 -1
  25. package/dist/types/extensibility/custom-tools/types.d.ts +1 -1
  26. package/dist/types/extensibility/extensions/compact-handler.d.ts +4 -2
  27. package/dist/types/extensibility/extensions/get-commands-handler.d.ts +2 -2
  28. package/dist/types/extensibility/extensions/loader.d.ts +10 -1
  29. package/dist/types/extensibility/extensions/runner.d.ts +3 -3
  30. package/dist/types/extensibility/extensions/types.d.ts +141 -16
  31. package/dist/types/extensibility/hooks/types.d.ts +1 -1
  32. package/dist/types/gjc-runtime/launch-tmux.d.ts +3 -2
  33. package/dist/types/gjc-runtime/psmux-detect.d.ts +3 -0
  34. package/dist/types/gjc-runtime/session-state-sidecar.d.ts +3 -0
  35. package/dist/types/gjc-runtime/team-runtime.d.ts +3 -4
  36. package/dist/types/gjc-runtime/tmux-owner-isolation-cli.d.ts +13 -0
  37. package/dist/types/gjc-runtime/tmux-sessions.d.ts +4 -1
  38. package/dist/types/gjc-runtime/windows-powershell-command.d.ts +9 -0
  39. package/dist/types/harness-control-plane/operate.d.ts +5 -5
  40. package/dist/types/harness-control-plane/owner.d.ts +18 -4
  41. package/dist/types/harness-control-plane/receipts.d.ts +0 -1
  42. package/dist/types/harness-control-plane/sdk-transport.d.ts +43 -0
  43. package/dist/types/harness-control-plane/session-transport.d.ts +48 -0
  44. package/dist/types/harness-control-plane/types.d.ts +3 -4
  45. package/dist/types/lsp/index.d.ts +1 -1
  46. package/dist/types/main.d.ts +32 -38
  47. package/dist/types/modes/acp/acp-agent.d.ts +224 -53
  48. package/dist/types/modes/acp/acp-client-bridge.d.ts +1 -0
  49. package/dist/types/modes/acp/acp-mode.d.ts +6 -15
  50. package/dist/types/modes/acp/permission-mode.d.ts +4 -0
  51. package/dist/types/modes/acp/startup-options.d.ts +6 -0
  52. package/dist/types/modes/components/agent-dashboard.d.ts +3 -0
  53. package/dist/types/modes/components/gajae-pet-widget.d.ts +1 -0
  54. package/dist/types/modes/components/model-selector.d.ts +1 -0
  55. package/dist/types/modes/components/notifications-settings-editor.d.ts +135 -0
  56. package/dist/types/modes/components/pet-capability.d.ts +37 -0
  57. package/dist/types/modes/components/pet-selector.d.ts +1 -1
  58. package/dist/types/modes/components/settings-selector.d.ts +15 -4
  59. package/dist/types/modes/components/welcome.d.ts +1 -1
  60. package/dist/types/modes/controllers/selector-controller.d.ts +35 -1
  61. package/dist/types/modes/index.d.ts +0 -4
  62. package/dist/types/modes/interactive-mode.d.ts +5 -1
  63. package/dist/types/modes/runtime-init.d.ts +2 -2
  64. package/dist/types/modes/shared/agent-wire/approval-gate.d.ts +6 -9
  65. package/dist/types/modes/shared/agent-wire/deep-interview-gate.d.ts +4 -6
  66. package/dist/types/modes/shared/agent-wire/event-contract.d.ts +6 -6
  67. package/dist/types/modes/shared/agent-wire/event-envelope.d.ts +4 -9
  68. package/dist/types/modes/shared/agent-wire/event-observation.d.ts +1 -1
  69. package/dist/types/modes/shared/agent-wire/workflow-gate-broker.d.ts +169 -30
  70. package/dist/types/modes/shared/agent-wire/workflow-gate-schema.d.ts +7 -7
  71. package/dist/types/modes/shared/agent-wire/workflow-gate-types.d.ts +105 -0
  72. package/dist/types/modes/types.d.ts +16 -1
  73. package/dist/types/runtime-mcp/client.d.ts +2 -0
  74. package/dist/types/runtime-mcp/config.d.ts +5 -1
  75. package/dist/types/runtime-mcp/manager.d.ts +8 -1
  76. package/dist/types/runtime-mcp/types.d.ts +4 -0
  77. package/dist/types/sdk/acp/adapter.d.ts +67 -0
  78. package/dist/types/sdk/acp/index.d.ts +2 -0
  79. package/dist/types/sdk/broker/broker.d.ts +53 -0
  80. package/dist/types/sdk/broker/discovery.d.ts +30 -0
  81. package/dist/types/sdk/broker/ensure.d.ts +33 -0
  82. package/dist/types/sdk/broker/identity.d.ts +3 -0
  83. package/dist/types/sdk/broker/index.d.ts +8 -0
  84. package/dist/types/sdk/broker/lifecycle-ledger.d.ts +95 -0
  85. package/dist/types/sdk/broker/lifecycle.d.ts +85 -0
  86. package/dist/types/sdk/broker/process-incarnation.d.ts +14 -0
  87. package/dist/types/sdk/broker/runtime.d.ts +33 -0
  88. package/dist/types/sdk/broker/session-index.d.ts +57 -0
  89. package/dist/types/sdk/broker/state-version.d.ts +8 -0
  90. package/dist/types/sdk/broker/transport.d.ts +9 -0
  91. package/dist/types/sdk/bus/chat-command-policy.d.ts +49 -0
  92. package/dist/types/sdk/bus/chat-daemon-cli.d.ts +21 -0
  93. package/dist/types/sdk/bus/chat-daemon-control.d.ts +111 -0
  94. package/dist/types/sdk/bus/chat-daemon-runtime.d.ts +77 -0
  95. package/dist/types/sdk/bus/chat-effect-journal.d.ts +84 -0
  96. package/dist/types/{notifications → sdk/bus}/config-commands.d.ts +7 -2
  97. package/dist/types/sdk/bus/config.d.ts +274 -0
  98. package/dist/types/sdk/bus/conversation-store.d.ts +72 -0
  99. package/dist/types/sdk/bus/discord-conversation.d.ts +58 -0
  100. package/dist/types/sdk/bus/discord-daemon.d.ts +45 -0
  101. package/dist/types/sdk/bus/discord-live-provider.d.ts +70 -0
  102. package/dist/types/sdk/bus/discord-provider.d.ts +85 -0
  103. package/dist/types/{notifications → sdk/bus}/html-format.d.ts +2 -2
  104. package/dist/types/{notifications → sdk/bus}/index.d.ts +113 -13
  105. package/dist/types/{notifications → sdk/bus}/lifecycle-control-runtime.d.ts +4 -2
  106. package/dist/types/{notifications → sdk/bus}/lifecycle-orchestrator.d.ts +18 -21
  107. package/dist/types/{notifications → sdk/bus}/managed-daemon.d.ts +1 -1
  108. package/dist/types/sdk/bus/native-runtime-compatibility.d.ts +13 -0
  109. package/dist/types/sdk/bus/notification-orchestration.d.ts +170 -0
  110. package/dist/types/{notifications → sdk/bus}/notification-service.d.ts +7 -1
  111. package/dist/types/sdk/bus/session-control.d.ts +83 -0
  112. package/dist/types/sdk/bus/slack-conversation.d.ts +56 -0
  113. package/dist/types/sdk/bus/slack-daemon.d.ts +60 -0
  114. package/dist/types/sdk/bus/slack-live-provider.d.ts +59 -0
  115. package/dist/types/sdk/bus/slack-provider.d.ts +55 -0
  116. package/dist/types/{notifications → sdk/bus}/telegram-cli.d.ts +4 -4
  117. package/dist/types/{notifications → sdk/bus}/telegram-daemon-cli.d.ts +14 -5
  118. package/dist/types/sdk/bus/telegram-daemon-contract.d.ts +12 -0
  119. package/dist/types/{notifications → sdk/bus}/telegram-daemon-control.d.ts +2 -2
  120. package/dist/types/{notifications → sdk/bus}/telegram-daemon.d.ts +55 -17
  121. package/dist/types/{notifications → sdk/bus}/telegram-reference.d.ts +2 -2
  122. package/dist/types/sdk/bus/telegram-setup.d.ts +128 -0
  123. package/dist/types/{notifications → sdk/bus}/topic-registry.d.ts +11 -0
  124. package/dist/types/sdk/cli/index.d.ts +1 -0
  125. package/dist/types/sdk/cli/session-cli.d.ts +19 -0
  126. package/dist/types/sdk/client/client.d.ts +1 -0
  127. package/dist/types/sdk/client/discovery.d.ts +27 -0
  128. package/dist/types/sdk/client/index.d.ts +2 -0
  129. package/dist/types/sdk/host/control/dispatch.d.ts +34 -0
  130. package/dist/types/sdk/host/control/index.d.ts +2 -0
  131. package/dist/types/sdk/host/control/operations.d.ts +65 -0
  132. package/dist/types/sdk/host/events.d.ts +35 -0
  133. package/dist/types/sdk/host/host.d.ts +35 -0
  134. package/dist/types/sdk/host/index.d.ts +4 -0
  135. package/dist/types/sdk/host/query/cursor.d.ts +62 -0
  136. package/dist/types/sdk/host/query/handlers.d.ts +70 -0
  137. package/dist/types/sdk/host/query/index.d.ts +3 -0
  138. package/dist/types/sdk/host/query/revision-store.d.ts +60 -0
  139. package/dist/types/sdk/host/reverse-leases.d.ts +45 -0
  140. package/dist/types/sdk/host/types.d.ts +32 -0
  141. package/dist/types/sdk/index.d.ts +6 -0
  142. package/dist/types/sdk/lifecycle-session.d.ts +14 -0
  143. package/dist/types/sdk/mcp/index.d.ts +1 -0
  144. package/dist/types/sdk/mcp/server.d.ts +37 -0
  145. package/dist/types/sdk/models.d.ts +44 -0
  146. package/dist/types/sdk/protocol/adapter-validation.d.ts +14 -0
  147. package/dist/types/sdk/protocol/operation-registry.d.ts +24 -0
  148. package/dist/types/{sdk.d.ts → sdk/session.d.ts} +44 -38
  149. package/dist/types/sdk/startup-capability.d.ts +50 -0
  150. package/dist/types/session/agent-session.d.ts +114 -21
  151. package/dist/types/session/default-model-selection.d.ts +25 -0
  152. package/dist/types/session/fallback-chain-controller.d.ts +52 -0
  153. package/dist/types/session/session-manager.d.ts +58 -1
  154. package/dist/types/setup/credential-auto-import.d.ts +36 -6
  155. package/dist/types/tools/ask-answer-registry.d.ts +1 -1
  156. package/dist/types/tools/browser/benchmark/detector-report.d.ts +63 -0
  157. package/dist/types/tools/browser/benchmark/run-suite.d.ts +18 -0
  158. package/dist/types/tools/browser/launch.d.ts +22 -0
  159. package/dist/types/tools/browser/profile-discovery.d.ts +31 -0
  160. package/dist/types/tools/browser/profile-posture.d.ts +37 -0
  161. package/dist/types/tools/browser/profile-reuse.d.ts +39 -0
  162. package/dist/types/tools/browser/profile-warmup.d.ts +39 -0
  163. package/dist/types/tools/browser/registry.d.ts +19 -0
  164. package/dist/types/tools/browser/tab-protocol.d.ts +4 -0
  165. package/dist/types/tools/index.d.ts +8 -8
  166. package/package.json +34 -13
  167. package/scripts/build-sdk-package-smoke.ts +94 -0
  168. package/scripts/capture-notifications-settings-showcase.ts +435 -0
  169. package/scripts/compile-args.ts +4 -2
  170. package/scripts/g005-daemon-smoke.ts +4 -5
  171. package/scripts/g011-daemon-path-smoke.ts +5 -5
  172. package/scripts/generate-sdk-adapter-parity-manifest.ts +163 -0
  173. package/scripts/generate-sdk-operation-inventory.ts +867 -0
  174. package/scripts/generate-telegram-baseline-manifest.ts +128 -0
  175. package/scripts/manifest-schema.ts +124 -0
  176. package/scripts/run-test-manifest.ts +153 -0
  177. package/scripts/run-threat-model-check.ts +157 -0
  178. package/scripts/verify-gjc-sdk-canonicalization.ts +3467 -0
  179. package/scripts/verify-gjc-sdk-rename.ts +90 -0
  180. package/src/append-only-mode.ts +1 -1
  181. package/src/cli/args.ts +43 -12
  182. package/src/cli/auth-gateway-cli.ts +2 -2
  183. package/src/cli/config-cli.ts +2 -1
  184. package/src/cli/daemon-cli.ts +63 -14
  185. package/src/cli/list-models.ts +1 -1
  186. package/src/cli/notify-cli.ts +288 -286
  187. package/src/cli.ts +21 -2
  188. package/src/commands/daemon.ts +50 -6
  189. package/src/commands/harness.ts +93 -36
  190. package/src/commands/launch.ts +5 -2
  191. package/src/commands/mcp-serve.ts +19 -12
  192. package/src/commands/notify.ts +36 -3
  193. package/src/commands/sdk.ts +426 -0
  194. package/src/commit/agentic/agent.ts +1 -0
  195. package/src/config/atomic-yaml-patch.ts +423 -0
  196. package/src/config/model-profile-activation.ts +240 -89
  197. package/src/config/model-profiles.ts +37 -34
  198. package/src/config/model-registry.ts +51 -26
  199. package/src/config/model-resolver.ts +138 -51
  200. package/src/config/model-selector-value.ts +50 -0
  201. package/src/config/models-config-schema.ts +14 -21
  202. package/src/config/settings-schema.ts +128 -10
  203. package/src/config/settings.ts +1120 -158
  204. package/src/coordinator-mcp/model-preset.ts +74 -20
  205. package/src/coordinator-mcp/server.ts +1597 -3052
  206. package/src/daemon/builtin.ts +8 -5
  207. package/src/daemon/control-types.ts +1 -1
  208. package/src/defaults/gjc/skills/team/SKILL.md +4 -4
  209. package/src/discovery/mcp-json.ts +327 -20
  210. package/src/extensibility/custom-tools/types.ts +1 -1
  211. package/src/extensibility/extensions/compact-handler.ts +3 -3
  212. package/src/extensibility/extensions/get-commands-handler.ts +2 -2
  213. package/src/extensibility/extensions/loader.ts +69 -5
  214. package/src/extensibility/extensions/runner.ts +112 -4
  215. package/src/extensibility/extensions/types.ts +176 -17
  216. package/src/extensibility/hooks/types.ts +1 -1
  217. package/src/extensibility/slash-commands.ts +3 -3
  218. package/src/gjc-runtime/launch-tmux.ts +170 -86
  219. package/src/gjc-runtime/psmux-detect.ts +82 -4
  220. package/src/gjc-runtime/session-state-sidecar.ts +41 -31
  221. package/src/gjc-runtime/team-runtime.ts +54 -35
  222. package/src/gjc-runtime/tmux-owner-isolation-cli.ts +53 -17
  223. package/src/gjc-runtime/tmux-owner-isolation.ts +5 -2
  224. package/src/gjc-runtime/tmux-sessions.ts +19 -13
  225. package/src/gjc-runtime/ultragoal-guard.ts +53 -6
  226. package/src/gjc-runtime/ultragoal-runtime.ts +155 -3
  227. package/src/gjc-runtime/windows-powershell-command.ts +58 -0
  228. package/src/harness-control-plane/operate.ts +9 -9
  229. package/src/harness-control-plane/owner.ts +283 -39
  230. package/src/harness-control-plane/receipts.ts +0 -1
  231. package/src/harness-control-plane/sdk-transport.ts +395 -0
  232. package/src/harness-control-plane/session-transport.ts +94 -0
  233. package/src/harness-control-plane/types.ts +1 -1
  234. package/src/internal-urls/docs-index.generated.ts +36 -37
  235. package/src/lsp/client.ts +42 -6
  236. package/src/lsp/index.ts +2 -2
  237. package/src/main.ts +299 -204
  238. package/src/modes/DESIGN.md +258 -0
  239. package/src/modes/acp/acp-agent.ts +1228 -2612
  240. package/src/modes/acp/acp-client-bridge.ts +2 -20
  241. package/src/modes/acp/acp-event-mapper.ts +18 -2
  242. package/src/modes/acp/acp-mode.ts +8 -36
  243. package/src/modes/acp/permission-mode.ts +25 -0
  244. package/src/modes/acp/startup-options.ts +6 -0
  245. package/src/modes/components/agent-dashboard.ts +37 -17
  246. package/src/modes/components/custom-editor.ts +1 -0
  247. package/src/modes/components/gajae-pet-widget.ts +169 -20
  248. package/src/modes/components/model-selector.ts +93 -35
  249. package/src/modes/components/notifications-settings-editor.ts +1379 -0
  250. package/src/modes/components/pet-capability.ts +115 -0
  251. package/src/modes/components/pet-selector.ts +4 -6
  252. package/src/modes/components/settings-selector.ts +86 -11
  253. package/src/modes/components/welcome.ts +4 -4
  254. package/src/modes/controllers/command-controller.ts +1 -2
  255. package/src/modes/controllers/event-controller.ts +11 -16
  256. package/src/modes/controllers/extension-ui-controller.ts +357 -12
  257. package/src/modes/controllers/input-controller.ts +43 -13
  258. package/src/modes/controllers/selector-controller.ts +671 -44
  259. package/src/modes/index.ts +0 -22
  260. package/src/modes/interactive-mode.ts +108 -24
  261. package/src/modes/runtime-init.ts +298 -6
  262. package/src/modes/shared/agent-wire/approval-gate.ts +9 -11
  263. package/src/modes/shared/agent-wire/deep-interview-gate.ts +10 -11
  264. package/src/modes/shared/agent-wire/event-contract.ts +7 -8
  265. package/src/modes/shared/agent-wire/event-envelope.ts +9 -17
  266. package/src/modes/shared/agent-wire/event-observation.ts +16 -7
  267. package/src/modes/shared/agent-wire/workflow-gate-broker.ts +1254 -87
  268. package/src/modes/shared/agent-wire/workflow-gate-schema.ts +15 -15
  269. package/src/modes/shared/agent-wire/workflow-gate-types.ts +113 -0
  270. package/src/modes/types.ts +16 -1
  271. package/src/runtime-mcp/client.ts +94 -19
  272. package/src/runtime-mcp/config.ts +27 -15
  273. package/src/runtime-mcp/manager.ts +343 -105
  274. package/src/runtime-mcp/oauth-flow.ts +42 -12
  275. package/src/runtime-mcp/transports/http.ts +49 -19
  276. package/src/runtime-mcp/transports/stdio.ts +47 -28
  277. package/src/runtime-mcp/types.ts +10 -0
  278. package/src/sdk/acp/adapter.ts +418 -0
  279. package/src/sdk/acp/index.ts +2 -0
  280. package/src/sdk/broker/broker.ts +642 -0
  281. package/src/sdk/broker/discovery.ts +94 -0
  282. package/src/sdk/broker/ensure.ts +249 -0
  283. package/src/sdk/broker/identity.ts +42 -0
  284. package/src/sdk/broker/index.ts +8 -0
  285. package/src/sdk/broker/internal-source-marker-2178.txt +1 -0
  286. package/src/sdk/broker/internal-source.bunfig.toml +1 -0
  287. package/src/sdk/broker/lifecycle-ledger.ts +286 -0
  288. package/src/sdk/broker/lifecycle.ts +2157 -0
  289. package/src/sdk/broker/process-incarnation.ts +159 -0
  290. package/src/sdk/broker/runtime.ts +164 -0
  291. package/src/sdk/broker/session-index.ts +318 -0
  292. package/src/sdk/broker/state-version.ts +23 -0
  293. package/src/sdk/broker/transport.ts +125 -0
  294. package/src/sdk/bus/chat-command-policy.ts +107 -0
  295. package/src/sdk/bus/chat-daemon-cli.ts +214 -0
  296. package/src/sdk/bus/chat-daemon-control.ts +713 -0
  297. package/src/sdk/bus/chat-daemon-runtime.ts +526 -0
  298. package/src/sdk/bus/chat-effect-journal.ts +353 -0
  299. package/src/{notifications → sdk/bus}/config-commands.ts +39 -10
  300. package/src/sdk/bus/config.ts +433 -0
  301. package/src/sdk/bus/conversation-store.ts +391 -0
  302. package/src/sdk/bus/discord-conversation.ts +85 -0
  303. package/src/sdk/bus/discord-daemon.ts +2275 -0
  304. package/src/sdk/bus/discord-live-provider.ts +521 -0
  305. package/src/sdk/bus/discord-provider.ts +56 -0
  306. package/src/{notifications → sdk/bus}/html-format.ts +2 -2
  307. package/src/sdk/bus/index.ts +3943 -0
  308. package/src/{notifications → sdk/bus}/lifecycle-commands.ts +2 -0
  309. package/src/{notifications → sdk/bus}/lifecycle-control-runtime.ts +225 -196
  310. package/src/{notifications → sdk/bus}/lifecycle-orchestrator.ts +161 -74
  311. package/src/{notifications → sdk/bus}/managed-daemon.ts +2 -2
  312. package/src/sdk/bus/native-runtime-compatibility.ts +42 -0
  313. package/src/sdk/bus/natives-augment.d.ts +38 -0
  314. package/src/sdk/bus/notification-orchestration.ts +535 -0
  315. package/src/{notifications → sdk/bus}/notification-service.ts +106 -12
  316. package/src/sdk/bus/session-control.ts +333 -0
  317. package/src/sdk/bus/slack-conversation.ts +74 -0
  318. package/src/sdk/bus/slack-daemon.ts +2144 -0
  319. package/src/sdk/bus/slack-live-provider.ts +380 -0
  320. package/src/sdk/bus/slack-provider.ts +76 -0
  321. package/src/{notifications → sdk/bus}/telegram-cli.ts +8 -8
  322. package/src/sdk/bus/telegram-daemon-cli.ts +330 -0
  323. package/src/sdk/bus/telegram-daemon-contract.ts +14 -0
  324. package/src/{notifications → sdk/bus}/telegram-daemon-control.ts +4 -4
  325. package/src/{notifications → sdk/bus}/telegram-daemon.ts +502 -54
  326. package/src/{notifications → sdk/bus}/telegram-reference.ts +2 -2
  327. package/src/sdk/bus/telegram-setup.ts +663 -0
  328. package/src/{notifications → sdk/bus}/topic-registry.ts +32 -0
  329. package/src/sdk/cli/index.ts +1 -0
  330. package/src/sdk/cli/session-cli.ts +275 -0
  331. package/src/sdk/client/client.ts +1 -0
  332. package/src/sdk/client/discovery.ts +108 -0
  333. package/src/sdk/client/index.ts +2 -0
  334. package/src/sdk/host/control/dispatch.ts +367 -0
  335. package/src/sdk/host/control/index.ts +10 -0
  336. package/src/sdk/host/control/operations.ts +63 -0
  337. package/src/sdk/host/events.ts +91 -0
  338. package/src/sdk/host/host.ts +296 -0
  339. package/src/sdk/host/index.ts +4 -0
  340. package/src/sdk/host/query/cursor.ts +189 -0
  341. package/src/sdk/host/query/handlers.ts +533 -0
  342. package/src/sdk/host/query/index.ts +3 -0
  343. package/src/sdk/host/query/revision-store.ts +1126 -0
  344. package/src/sdk/host/reverse-leases.ts +325 -0
  345. package/src/sdk/host/types.ts +29 -0
  346. package/src/sdk/index.ts +13 -0
  347. package/src/sdk/lifecycle-session.ts +39 -0
  348. package/src/sdk/mcp/index.ts +1 -0
  349. package/src/sdk/mcp/server.ts +332 -0
  350. package/src/sdk/models.ts +168 -0
  351. package/src/sdk/protocol/adapter-validation.ts +48 -0
  352. package/src/sdk/protocol/operation-inventory.generated.json +5654 -0
  353. package/src/sdk/protocol/operation-registry.ts +312 -0
  354. package/src/{sdk.ts → sdk/session.ts} +339 -212
  355. package/src/sdk/startup-capability.ts +189 -0
  356. package/src/session/agent-session.ts +2470 -866
  357. package/src/session/default-model-selection.ts +93 -0
  358. package/src/session/fallback-chain-controller.ts +136 -0
  359. package/src/session/session-manager.ts +447 -13
  360. package/src/session/session-storage.ts +8 -1
  361. package/src/setup/credential-auto-import.ts +290 -35
  362. package/src/setup/hermes/templates/operator-instructions.v1.md +3 -5
  363. package/src/slash-commands/builtin-registry.ts +33 -30
  364. package/src/task/executor.ts +62 -13
  365. package/src/tools/ask-answer-registry.ts +1 -1
  366. package/src/tools/ask.ts +13 -8
  367. package/src/tools/browser/STEALTH-THIRD-PARTY-NOTICES.md +26 -0
  368. package/src/tools/browser/benchmark/detector-report.ts +157 -0
  369. package/src/tools/browser/benchmark/run-suite.ts +39 -0
  370. package/src/tools/browser/launch.ts +124 -19
  371. package/src/tools/browser/profile-discovery.ts +63 -0
  372. package/src/tools/browser/profile-posture.ts +59 -0
  373. package/src/tools/browser/profile-reuse.ts +102 -0
  374. package/src/tools/browser/profile-warmup.ts +109 -0
  375. package/src/tools/browser/registry.ts +87 -11
  376. package/src/tools/browser/tab-protocol.ts +1 -0
  377. package/src/tools/browser/tab-supervisor.ts +1 -0
  378. package/src/tools/browser/tab-worker.ts +1 -1
  379. package/src/tools/browser.ts +6 -0
  380. package/src/tools/index.ts +8 -8
  381. package/src/tools/puppeteer/14_stealth_permissions.txt +57 -0
  382. package/src/tools/puppeteer/15_stealth_webrtc.txt +60 -0
  383. package/src/tools/telegram-send.ts +2 -2
  384. package/vendor/insane-search/MANIFEST.json +2 -1
  385. package/vendor/insane-search/engine/bias_check.py +4 -1
  386. package/vendor/insane-search/engine/phase0.py +26 -1
  387. package/dist/types/harness-control-plane/rpc-adapter.d.ts +0 -69
  388. package/dist/types/modes/bridge/auth.d.ts +0 -12
  389. package/dist/types/modes/bridge/bridge-client-bridge.d.ts +0 -9
  390. package/dist/types/modes/bridge/bridge-mode.d.ts +0 -47
  391. package/dist/types/modes/bridge/bridge-ui-context.d.ts +0 -88
  392. package/dist/types/modes/bridge/event-stream.d.ts +0 -8
  393. package/dist/types/modes/rpc/host-tools.d.ts +0 -1
  394. package/dist/types/modes/rpc/host-uris.d.ts +0 -1
  395. package/dist/types/modes/rpc/rpc-client.d.ts +0 -299
  396. package/dist/types/modes/rpc/rpc-mode.d.ts +0 -86
  397. package/dist/types/modes/rpc/rpc-socket-security.d.ts +0 -10
  398. package/dist/types/modes/rpc/rpc-types.d.ts +0 -810
  399. package/dist/types/modes/shared/agent-wire/command-contract.d.ts +0 -18
  400. package/dist/types/modes/shared/agent-wire/command-dispatch.d.ts +0 -37
  401. package/dist/types/modes/shared/agent-wire/command-validation.d.ts +0 -2
  402. package/dist/types/modes/shared/agent-wire/handshake.d.ts +0 -56
  403. package/dist/types/modes/shared/agent-wire/host-tool-bridge.d.ts +0 -16
  404. package/dist/types/modes/shared/agent-wire/host-uri-bridge.d.ts +0 -17
  405. package/dist/types/modes/shared/agent-wire/protocol.d.ts +0 -25
  406. package/dist/types/modes/shared/agent-wire/responses.d.ts +0 -4
  407. package/dist/types/modes/shared/agent-wire/scopes.d.ts +0 -18
  408. package/dist/types/modes/shared/agent-wire/session-registry.d.ts +0 -25
  409. package/dist/types/modes/shared/agent-wire/ui-request-broker.d.ts +0 -42
  410. package/dist/types/modes/shared/agent-wire/ui-result.d.ts +0 -27
  411. package/dist/types/modes/shared/agent-wire/unattended-action-policy.d.ts +0 -29
  412. package/dist/types/modes/shared/agent-wire/unattended-audit.d.ts +0 -68
  413. package/dist/types/modes/shared/agent-wire/unattended-run-controller.d.ts +0 -166
  414. package/dist/types/modes/shared/agent-wire/unattended-session.d.ts +0 -127
  415. package/dist/types/notifications/config.d.ts +0 -132
  416. package/src/harness-control-plane/rpc-adapter.ts +0 -290
  417. package/src/modes/bridge/auth.ts +0 -41
  418. package/src/modes/bridge/bridge-client-bridge.ts +0 -47
  419. package/src/modes/bridge/bridge-mode.ts +0 -675
  420. package/src/modes/bridge/bridge-ui-context.ts +0 -200
  421. package/src/modes/bridge/event-stream.ts +0 -70
  422. package/src/modes/rpc/host-tools.ts +0 -1
  423. package/src/modes/rpc/host-uris.ts +0 -1
  424. package/src/modes/rpc/rpc-client.ts +0 -1166
  425. package/src/modes/rpc/rpc-mode.ts +0 -1029
  426. package/src/modes/rpc/rpc-socket-security.ts +0 -115
  427. package/src/modes/rpc/rpc-types.ts +0 -637
  428. package/src/modes/shared/agent-wire/command-contract.ts +0 -18
  429. package/src/modes/shared/agent-wire/command-dispatch.ts +0 -498
  430. package/src/modes/shared/agent-wire/command-validation.ts +0 -181
  431. package/src/modes/shared/agent-wire/handshake.ts +0 -157
  432. package/src/modes/shared/agent-wire/host-tool-bridge.ts +0 -197
  433. package/src/modes/shared/agent-wire/host-uri-bridge.ts +0 -236
  434. package/src/modes/shared/agent-wire/protocol.ts +0 -46
  435. package/src/modes/shared/agent-wire/responses.ts +0 -17
  436. package/src/modes/shared/agent-wire/scopes.ts +0 -94
  437. package/src/modes/shared/agent-wire/session-registry.ts +0 -109
  438. package/src/modes/shared/agent-wire/ui-request-broker.ts +0 -150
  439. package/src/modes/shared/agent-wire/ui-result.ts +0 -48
  440. package/src/modes/shared/agent-wire/unattended-action-policy.ts +0 -365
  441. package/src/modes/shared/agent-wire/unattended-audit.ts +0 -176
  442. package/src/modes/shared/agent-wire/unattended-run-controller.ts +0 -426
  443. package/src/modes/shared/agent-wire/unattended-session.ts +0 -528
  444. package/src/notifications/config.ts +0 -219
  445. package/src/notifications/index.ts +0 -1835
  446. package/src/notifications/telegram-daemon-cli.ts +0 -243
  447. package/src/tools/puppeteer/09_stealth_locale.txt +0 -46
  448. /package/dist/types/{notifications → sdk/bus}/attachment-registry.d.ts +0 -0
  449. /package/dist/types/{notifications → sdk/bus}/chat-adapters.d.ts +0 -0
  450. /package/dist/types/{notifications → sdk/bus}/daemon-paths.d.ts +0 -0
  451. /package/dist/types/{notifications → sdk/bus}/engine.d.ts +0 -0
  452. /package/dist/types/{notifications → sdk/bus}/helpers.d.ts +0 -0
  453. /package/dist/types/{notifications → sdk/bus}/lifecycle-commands.d.ts +0 -0
  454. /package/dist/types/{notifications → sdk/bus}/operator-runtime.d.ts +0 -0
  455. /package/dist/types/{notifications → sdk/bus}/rate-limit-pool.d.ts +0 -0
  456. /package/dist/types/{notifications → sdk/bus}/recent-activity.d.ts +0 -0
  457. /package/dist/types/{notifications → sdk/bus}/reply-sent-store.d.ts +0 -0
  458. /package/dist/types/{notifications → sdk/bus}/rich-draft.d.ts +0 -0
  459. /package/dist/types/{notifications → sdk/bus}/rich-render.d.ts +0 -0
  460. /package/dist/types/{notifications → sdk/bus}/threaded-inbound.d.ts +0 -0
  461. /package/dist/types/{notifications → sdk/bus}/threaded-render.d.ts +0 -0
  462. /package/src/{notifications → sdk/bus}/attachment-registry.ts +0 -0
  463. /package/src/{notifications → sdk/bus}/chat-adapters.ts +0 -0
  464. /package/src/{notifications → sdk/bus}/daemon-paths.ts +0 -0
  465. /package/src/{notifications → sdk/bus}/engine.ts +0 -0
  466. /package/src/{notifications → sdk/bus}/helpers.ts +0 -0
  467. /package/src/{notifications → sdk/bus}/operator-runtime.ts +0 -0
  468. /package/src/{notifications → sdk/bus}/rate-limit-pool.ts +0 -0
  469. /package/src/{notifications → sdk/bus}/recent-activity.ts +0 -0
  470. /package/src/{notifications → sdk/bus}/reply-sent-store.ts +0 -0
  471. /package/src/{notifications → sdk/bus}/rich-draft.ts +0 -0
  472. /package/src/{notifications → sdk/bus}/rich-render.ts +0 -0
  473. /package/src/{notifications → sdk/bus}/threaded-inbound.ts +0 -0
  474. /package/src/{notifications → sdk/bus}/threaded-render.ts +0 -0
@@ -0,0 +1,115 @@
1
+ import {
2
+ ImageProtocol,
3
+ isUnderTerminalMultiplexer,
4
+ onImageProtocolChanged,
5
+ type SelectItem,
6
+ shouldProbeSixelCapability,
7
+ TERMINAL,
8
+ } from "@gajae-code/tui";
9
+
10
+ export type PetPixelProtocol = "sixel" | "kitty";
11
+
12
+ export const PET_UNAVAILABLE_DESCRIPTION = "Unavailable: requires compatible Kitty or Sixel overlay rendering";
13
+ export const PET_SAVED_UNAVAILABLE_DESCRIPTION =
14
+ "Saved, unavailable — requires compatible Kitty or Sixel overlay rendering";
15
+ export const PET_UNAVAILABLE_WARNING =
16
+ "⚠ Pets aren’t available in this terminal. Its image support isn’t compatible with Gajae Pet’s overlay rendering yet. Try Kitty, Ghostty, WezTerm, or a terminal with compatible Sixel support.";
17
+ const PET_MULTIPLEXER_UNAVAILABLE_WARNING =
18
+ "⚠ Gajae Pet graphics are unavailable inside tmux, screen, or zellij because image escapes are not forwarded end to end. Run gjc outside the multiplexer, or set PI_FORCE_IMAGE_PROTOCOL=sixel only when the full terminal chain supports Sixel.";
19
+
20
+ export function getPetUnavailableWarning(env: NodeJS.ProcessEnv = Bun.env): string {
21
+ return isUnderTerminalMultiplexer(env) ? PET_MULTIPLEXER_UNAVAILABLE_WARNING : PET_UNAVAILABLE_WARNING;
22
+ }
23
+
24
+ export function getPetPixelProtocol(): PetPixelProtocol | null {
25
+ if (TERMINAL.imageProtocol === ImageProtocol.Kitty) return "kitty";
26
+ if (TERMINAL.imageProtocol === ImageProtocol.Sixel) return "sixel";
27
+ return null;
28
+ }
29
+
30
+ export function isPetAvailable(): boolean {
31
+ return getPetPixelProtocol() !== null;
32
+ }
33
+
34
+ export function createPetSelectItems(
35
+ options: ReadonlyArray<SelectItem>,
36
+ currentValue: string,
37
+ available: boolean,
38
+ ): SelectItem[] {
39
+ return options.map(option => {
40
+ const disabled = !available && option.value !== "off";
41
+ const current = option.value === currentValue;
42
+ const savedUnavailable = disabled && current;
43
+ let description = `${option.description ?? ""}${current ? " (current)" : ""}`;
44
+ if (disabled) {
45
+ description = savedUnavailable ? PET_SAVED_UNAVAILABLE_DESCRIPTION : PET_UNAVAILABLE_DESCRIPTION;
46
+ }
47
+ return {
48
+ ...option,
49
+ label: savedUnavailable ? `${option.label} (saved)` : option.label,
50
+ description,
51
+ disabled,
52
+ };
53
+ });
54
+ }
55
+
56
+ /**
57
+ * Grace period before declaring the terminal pet-incapable at startup. The
58
+ * asynchronous Sixel capability probe starts inside `TUI.start()` and answers
59
+ * within its own 250 ms deadline; this margin covers probe scheduling so a
60
+ * supported terminal is never told it is incompatible while the probe is
61
+ * still in flight.
62
+ */
63
+ export const PET_CAPABILITY_SETTLE_MS = 1_000;
64
+
65
+ /**
66
+ * Whether the asynchronous startup Sixel capability probe may still enable
67
+ * graphics for this session, meaning current unavailability is not final.
68
+ */
69
+ export function isPetCapabilityProbePending(
70
+ env: NodeJS.ProcessEnv = Bun.env,
71
+ platform: NodeJS.Platform = process.platform,
72
+ ): boolean {
73
+ if (TERMINAL.imageProtocol !== null) return false;
74
+ if (!process.stdin.isTTY || !process.stdout.isTTY) return false;
75
+ return shouldProbeSixelCapability(env, platform);
76
+ }
77
+
78
+ /**
79
+ * Deliver the pet-unavailable startup warning only once the capability
80
+ * question is settled. With no probe pending, unavailability is final and
81
+ * `onUnavailable` fires immediately. While a probe may still enable
82
+ * graphics, the warning is deferred: a protocol-change event cancels it (the
83
+ * saved pet re-applies through the existing subscription), and only the
84
+ * settle deadline passing with the terminal still unavailable emits it.
85
+ * Returns a disposer that cancels the pending decision.
86
+ */
87
+ export function warnWhenPetCapabilitySettled(options: {
88
+ probePending: boolean;
89
+ isAvailable?: () => boolean;
90
+ onUnavailable: () => void;
91
+ settleMs?: number;
92
+ }): () => void {
93
+ if (!options.probePending) {
94
+ options.onUnavailable();
95
+ return () => {};
96
+ }
97
+ const isAvailable = options.isAvailable ?? isPetAvailable;
98
+ let settled = false;
99
+ const finish = () => {
100
+ if (settled) return;
101
+ settled = true;
102
+ clearTimeout(timer);
103
+ unsubscribe();
104
+ };
105
+ const unsubscribe = onImageProtocolChanged(protocol => {
106
+ if (!protocol) return;
107
+ finish();
108
+ });
109
+ const timer = setTimeout(() => {
110
+ finish();
111
+ if (!isAvailable()) options.onUnavailable();
112
+ }, options.settleMs ?? PET_CAPABILITY_SETTLE_MS);
113
+ timer.unref?.();
114
+ return finish;
115
+ }
@@ -1,7 +1,8 @@
1
- import { Container, PET_SKIN_IDS, PET_SKINS, type SelectItem, SelectList } from "@gajae-code/tui";
1
+ import { Container, PET_SKIN_IDS, PET_SKINS, SelectList } from "@gajae-code/tui";
2
2
  import { getSelectListTheme } from "../theme/theme";
3
3
  import { DynamicBorder } from "./dynamic-border";
4
4
  import type { PetMode } from "./gajae-pet-widget";
5
+ import { createPetSelectItems } from "./pet-capability";
5
6
 
6
7
  const PET_OPTIONS: { value: PetMode; label: string; description: string }[] = [
7
8
  { value: "off", label: "Off", description: "No pet" },
@@ -24,14 +25,11 @@ export class PetSelectorComponent extends Container {
24
25
  onSelect: (mode: PetMode) => void,
25
26
  onCancel: () => void,
26
27
  onPreview: (mode: PetMode) => void,
28
+ available: boolean,
27
29
  ) {
28
30
  super();
29
31
 
30
- const items: SelectItem[] = PET_OPTIONS.map(option => ({
31
- value: option.value,
32
- label: option.label,
33
- description: option.value === current ? `${option.description} (current)` : option.description,
34
- }));
32
+ const items = createPetSelectItems(PET_OPTIONS, current, available);
35
33
 
36
34
  this.addChild(new DynamicBorder());
37
35
 
@@ -1,6 +1,7 @@
1
1
  import { ThinkingLevel, type ThinkingLevel as ThinkingLevelValue } from "@gajae-code/agent-core";
2
2
  import type { Effort } from "@gajae-code/ai";
3
3
  import {
4
+ type Component,
4
5
  Container,
5
6
  Input,
6
7
  matchesKey,
@@ -25,6 +26,11 @@ import { getCurrentThemeName, getSelectListTheme, getSettingsListTheme, theme }
25
26
  import { matchesAppInterrupt } from "../../modes/utils/keybinding-matchers";
26
27
  import { getTabBarTheme } from "../shared";
27
28
  import { DynamicBorder } from "./dynamic-border";
29
+ import {
30
+ type NotificationsEditorOperations,
31
+ NotificationsSettingsEditorComponent,
32
+ } from "./notifications-settings-editor";
33
+ import { createPetSelectItems, getPetUnavailableWarning, isPetAvailable } from "./pet-capability";
28
34
  import { handleInputOrEscape, PluginSettingsComponent } from "./plugin-settings";
29
35
  import { getSettingsForTab, type SettingDef } from "./settings-defs";
30
36
  import type { StatusLineSegmentOptions } from "./status-line";
@@ -661,6 +667,8 @@ export interface SettingsRuntimeContext {
661
667
  availableModelProfiles: string[];
662
668
  /** Working directory for plugins tab */
663
669
  cwd: string;
670
+ /** Whether this terminal can render the pet overlay. */
671
+ petAvailable?: boolean;
664
672
  }
665
673
 
666
674
  /** Status line settings subset for preview */
@@ -684,6 +692,13 @@ export interface SettingsCallbacks {
684
692
  onThemePreviewCancel?: (theme: string) => void | Promise<void>;
685
693
  /** Called to live-preview the gajae pet skin while browsing the pet setting. */
686
694
  onPetPreview?: (mode: string) => void;
695
+ /**
696
+ * Commit a pet mode through the shared result-returning policy. The policy
697
+ * rechecks capability immediately before mutation and owns persistence, so
698
+ * the settings surface never persists `pet.mode` ahead of acceptance.
699
+ * Returns whether the commit was accepted.
700
+ */
701
+ onPetCommit?: (mode: string) => boolean;
687
702
  /** Called for status line preview while configuring */
688
703
  onStatusLinePreview?: (settings: StatusLinePreviewSettings) => void;
689
704
  /** Get current rendered status line for inline preview */
@@ -702,6 +717,7 @@ export class SettingsSelectorComponent extends Container {
702
717
  #tabBar: TabBar;
703
718
  #currentList: SettingsList | null = null;
704
719
  #pluginComponent: PluginSettingsComponent | null = null;
720
+ #notificationsEditor: NotificationsSettingsEditorComponent | null = null;
705
721
  #statusPreviewContainer: Container | null = null;
706
722
  #statusPreviewText: Text | null = null;
707
723
  #currentTabId: SettingTab | "plugins" = "appearance";
@@ -710,6 +726,7 @@ export class SettingsSelectorComponent extends Container {
710
726
  constructor(
711
727
  private readonly context: SettingsRuntimeContext,
712
728
  private readonly callbacks: SettingsCallbacks,
729
+ private readonly notificationsOperations?: NotificationsEditorOperations,
713
730
  ) {
714
731
  super();
715
732
 
@@ -721,6 +738,7 @@ export class SettingsSelectorComponent extends Container {
721
738
  this.#tabBar.onTabChange = () => {
722
739
  this.#switchToTab(this.#tabBar.getActiveTab().id as SettingTab | "plugins");
723
740
  };
741
+
724
742
  this.addChild(this.#tabBar);
725
743
 
726
744
  // Spacer after tab bar
@@ -734,6 +752,9 @@ export class SettingsSelectorComponent extends Container {
734
752
  }
735
753
 
736
754
  #switchToTab(tabId: SettingTab | "plugins"): void {
755
+ if (this.#currentTabId === "notifications" && tabId !== "notifications" && !this.#disposeNotificationsEditor()) {
756
+ return;
757
+ }
737
758
  this.#currentTabId = tabId;
738
759
 
739
760
  // Remove current content
@@ -757,6 +778,8 @@ export class SettingsSelectorComponent extends Container {
757
778
 
758
779
  if (tabId === "plugins") {
759
780
  this.#showPluginsTab();
781
+ } else if (tabId === "notifications") {
782
+ this.#showNotificationsTab();
760
783
  } else {
761
784
  this.#showSettingsTab(tabId);
762
785
  }
@@ -765,6 +788,16 @@ export class SettingsSelectorComponent extends Container {
765
788
  this.addChild(bottomBorder);
766
789
  }
767
790
 
791
+ #disposeNotificationsEditor(): boolean {
792
+ const editor = this.#notificationsEditor;
793
+ if (!editor) return true;
794
+ if (editor.navigationLocked) return false;
795
+ editor.dispose();
796
+ this.removeChild(editor);
797
+ this.#notificationsEditor = null;
798
+ return true;
799
+ }
800
+
768
801
  /**
769
802
  * Convert a setting definition to a SettingItem for the UI.
770
803
  */
@@ -857,6 +890,14 @@ export class SettingsSelectorComponent extends Container {
857
890
  if (def.path === "statusLine.preset") {
858
891
  options = options.filter(option => option.value !== "custom");
859
892
  }
893
+ let description = def.description;
894
+ if (def.path === "pet.mode") {
895
+ const petAvailable = this.context.petAvailable ?? isPetAvailable();
896
+ options = createPetSelectItems(options, currentValue, petAvailable);
897
+ // Unsupported terminals must see the same actionable guidance the
898
+ // startup notice and /pet show, not only dimmed option descriptions.
899
+ if (!petAvailable) description = getPetUnavailableWarning();
900
+ }
860
901
  // Preview handlers
861
902
  let onPreview: ((value: string) => void | Promise<void>) | undefined;
862
903
  let onPreviewCancel: (() => void) | undefined;
@@ -943,10 +984,18 @@ export class SettingsSelectorComponent extends Container {
943
984
 
944
985
  return new SelectSubmenu(
945
986
  def.label,
946
- def.description,
987
+ description,
947
988
  options,
948
989
  currentValue,
949
990
  value => {
991
+ if (def.path === "pet.mode") {
992
+ // The shared pet commit policy rechecks capability immediately
993
+ // before mutation and persists only on acceptance; the settings
994
+ // surface must not persist ahead of that result.
995
+ const accepted = this.callbacks.onPetCommit?.(value) ?? false;
996
+ done(accepted ? value : undefined);
997
+ return;
998
+ }
950
999
  this.#setSettingValue(def.path, value);
951
1000
  this.callbacks.onChange(def.path, value);
952
1001
  done(value);
@@ -1007,6 +1056,14 @@ export class SettingsSelectorComponent extends Container {
1007
1056
  }
1008
1057
  }
1009
1058
 
1059
+ #showNotificationsTab(): void {
1060
+ if (!this.notificationsOperations) return;
1061
+ this.#notificationsEditor = new NotificationsSettingsEditorComponent(this.notificationsOperations, {
1062
+ onCancel: () => this.callbacks.onCancel(),
1063
+ });
1064
+ this.addChild(this.#notificationsEditor);
1065
+ }
1066
+
1010
1067
  /**
1011
1068
  * Show a settings tab using definitions.
1012
1069
  */
@@ -1171,21 +1228,39 @@ export class SettingsSelectorComponent extends Container {
1171
1228
  this.addChild(this.#pluginComponent);
1172
1229
  }
1173
1230
 
1174
- getFocusComponent(): SettingsList | PluginSettingsComponent {
1175
- // Return the current focusable component - one of these will always be set
1176
- return (this.#currentList || this.#pluginComponent)!;
1231
+ getFocusComponent(): Component {
1232
+ return (this.#currentList || this.#pluginComponent || this.#notificationsEditor)!;
1233
+ }
1234
+
1235
+ override dispose(): void {
1236
+ if (this.#notificationsEditor?.navigationLocked) return;
1237
+ this.#notificationsEditor?.dispose();
1238
+ this.#notificationsEditor = null;
1239
+ super.dispose();
1177
1240
  }
1178
1241
 
1179
1242
  handleInput(data: string): void {
1243
+ const tabNavigation =
1244
+ matchesKey(data, "tab") ||
1245
+ matchesKey(data, "shift+tab") ||
1246
+ matchesKey(data, "left") ||
1247
+ matchesKey(data, "right");
1248
+ if (this.#notificationsEditor && this.#currentTabId === "notifications") {
1249
+ if (tabNavigation) {
1250
+ if (this.#notificationsEditor.navigationLocked) {
1251
+ this.#notificationsEditor.handleInput(data);
1252
+ return;
1253
+ }
1254
+ this.#tabBar.handleInput(data);
1255
+ return;
1256
+ }
1257
+ this.#notificationsEditor.handleInput(data);
1258
+ return;
1259
+ }
1260
+
1180
1261
  // Handle tab switching — but NOT when a text input is active, since
1181
1262
  // arrow keys must reach the cursor and Tab must not switch tabs.
1182
- if (
1183
- !this.#textInputActive &&
1184
- (matchesKey(data, "tab") ||
1185
- matchesKey(data, "shift+tab") ||
1186
- matchesKey(data, "left") ||
1187
- matchesKey(data, "right"))
1188
- ) {
1263
+ if (!this.#textInputActive && tabNavigation) {
1189
1264
  this.#tabBar.handleInput(data);
1190
1265
  return;
1191
1266
  }
@@ -10,7 +10,7 @@ export interface RecentSession {
10
10
 
11
11
  export interface LspServerInfo {
12
12
  name: string;
13
- status: "ready" | "error" | "connecting";
13
+ status: "idle" | "ready" | "error" | "connecting";
14
14
  fileTypes: string[];
15
15
  }
16
16
 
@@ -172,9 +172,9 @@ export class WelcomeComponent implements Component {
172
172
  const icon =
173
173
  server.status === "ready"
174
174
  ? theme.styledSymbol("status.success", "success")
175
- : server.status === "connecting"
176
- ? theme.styledSymbol("status.pending", "muted")
177
- : theme.styledSymbol("status.error", "error");
175
+ : server.status === "error"
176
+ ? theme.styledSymbol("status.error", "error")
177
+ : theme.styledSymbol("status.pending", "muted");
178
178
  const exts = server.fileTypes.slice(0, 3).join(" ");
179
179
  lspLines.push(` ${icon} ${theme.fg("muted", server.name)} ${theme.fg("dim", exts)}`);
180
180
  }
@@ -450,8 +450,7 @@ export class CommandController {
450
450
  if (this.ctx.lspServers && this.ctx.lspServers.length > 0) {
451
451
  info += `\n${theme.bold("LSP Servers")}\n`;
452
452
  for (const server of this.ctx.lspServers) {
453
- const statusColor =
454
- server.status === "ready" ? "success" : server.status === "connecting" ? "warning" : "error";
453
+ const statusColor = server.status === "ready" ? "success" : server.status === "error" ? "error" : "warning";
455
454
  const statusText =
456
455
  server.status === "error" && server.error ? `${server.status}: ${server.error}` : server.status;
457
456
  info += `${theme.fg("dim", `${server.name}:`)} ${theme.fg(statusColor, statusText)} ${theme.fg("dim", `(${server.fileTypes.join(", ")})`)}\n`;
@@ -16,9 +16,9 @@ import { ToolExecutionComponent } from "../../modes/components/tool-execution";
16
16
  import { TtsrNotificationComponent } from "../../modes/components/ttsr-notification";
17
17
  import { getSymbolTheme, theme } from "../../modes/theme/theme";
18
18
  import type { InteractiveModeContext, TodoPhase } from "../../modes/types";
19
- import { completionNotifyDisabledByEnv } from "../../notifications/config";
20
- import { summaryFromMessage } from "../../notifications/helpers";
21
19
  import type { PlanApprovalDetails } from "../../plan-mode/approved-plan";
20
+ import { completionNotifyDisabledByEnv } from "../../sdk/bus/config";
21
+ import { summaryFromMessage } from "../../sdk/bus/helpers";
22
22
  import type { AgentSessionEvent } from "../../session/agent-session";
23
23
  import { type CustomMessage, isSilentAbort, readPendingDisplayTag } from "../../session/messages";
24
24
  import { transferSessionMessageIdentity } from "../../session/session-manager";
@@ -135,14 +135,13 @@ export class EventController {
135
135
  auto_compaction_end: e => this.#handleAutoCompactionEnd(e),
136
136
  auto_retry_start: e => this.#handleAutoRetryStart(e),
137
137
  auto_retry_end: e => this.#handleAutoRetryEnd(e),
138
- retry_fallback_applied: e => this.#handleRetryFallbackApplied(e),
139
- retry_fallback_succeeded: e => this.#handleRetryFallbackSucceeded(e),
140
138
  ttsr_triggered: e => this.#handleTtsrTriggered(e),
141
139
  todo_reminder: e => this.#handleTodoReminder(e),
142
140
  todo_auto_clear: e => this.#handleTodoAutoClear(e),
143
141
  irc_message: e => this.#handleIrcMessage(e),
144
142
  subagent_steer_message: e => this.#handleSubagentSteerMessage(e),
145
143
  notice: e => this.#handleNotice(e),
144
+ model_fallback_switched: e => this.#handleModelFallbackSwitched(e),
146
145
  thinking_level_changed: async () => {},
147
146
  goal_updated: async () => {},
148
147
  } satisfies AgentSessionEventHandlers;
@@ -497,6 +496,14 @@ export class EventController {
497
496
  this.ctx.ui.requestRender();
498
497
  }
499
498
 
499
+ async #handleModelFallbackSwitched(
500
+ event: Extract<AgentSessionEvent, { type: "model_fallback_switched" }>,
501
+ ): Promise<void> {
502
+ this.ctx.showStatus(`Fallback model: ${event.from} → ${event.to}`);
503
+ this.ctx.statusLine.invalidate();
504
+ this.ctx.ui.requestRender();
505
+ }
506
+
500
507
  async #handleNotice(event: Extract<AgentSessionEvent, { type: "notice" }>): Promise<void> {
501
508
  const message = event.source ? `${event.source}: ${event.message}` : event.message;
502
509
  if (event.level === "error") {
@@ -977,18 +984,6 @@ export class EventController {
977
984
  this.ctx.ui.requestRender();
978
985
  }
979
986
 
980
- async #handleRetryFallbackApplied(
981
- event: Extract<AgentSessionEvent, { type: "retry_fallback_applied" }>,
982
- ): Promise<void> {
983
- this.ctx.showWarning(`Fallback: ${event.from} -> ${event.to}`);
984
- }
985
-
986
- async #handleRetryFallbackSucceeded(
987
- event: Extract<AgentSessionEvent, { type: "retry_fallback_succeeded" }>,
988
- ): Promise<void> {
989
- this.ctx.showStatus(`Fallback succeeded on ${event.model}`);
990
- }
991
-
992
987
  async #handleTtsrTriggered(event: Extract<AgentSessionEvent, { type: "ttsr_triggered" }>): Promise<void> {
993
988
  const component = new TtsrNotificationComponent(event.rules);
994
989
  component.setExpanded(this.ctx.toolOutputExpanded);