@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
@@ -31,12 +31,7 @@ import { HookEditorComponent } from "../../modes/components/hook-editor";
31
31
  import { HookInputComponent } from "../../modes/components/hook-input";
32
32
  import { HookSelectorComponent } from "../../modes/components/hook-selector";
33
33
  import { getAvailableThemesWithPaths, getThemeByName, setTheme, type Theme, theme } from "../../modes/theme/theme";
34
- import {
35
- clearInteractiveActivityLoaders,
36
- type InteractiveModeContext,
37
- stopInteractiveActivityIndicator,
38
- syncInteractiveActivityIndicator,
39
- } from "../../modes/types";
34
+ import type { InteractiveModeContext } from "../../modes/types";
40
35
  import {
41
36
  parseSyntheticModelId,
42
37
  resolveSyntheticModelSelection,
@@ -48,9 +43,8 @@ import { parseThinkingLevel } from "../../thinking";
48
43
  import type { TodoPhase } from "../../tools/todo-write";
49
44
  import { setSessionTerminalTitle, setTerminalTitle } from "../../utils/title-generator";
50
45
  import { emitHostStatus } from "../utils/host-status";
51
- import { applyInjectedUserSubmission } from "../utils/injected-user-submission";
46
+ import { applyInjectedUserSubmission, extensionUserMessageContentError } from "../utils/injected-user-submission";
52
47
  import { classifyHookSelectorBellEvent, ringTerminalBell } from "../utils/terminal-bell";
53
- import { prepareTranscriptRebuild } from "../utils/ui-helpers";
54
48
 
55
49
  const MAX_WIDGET_LINES = 10;
56
50
  const HOOK_SELECTOR_CHROME_ROWS = 7;
@@ -106,6 +100,23 @@ const EXTENSION_COMMAND_MUTATIONS: ReadonlySet<PropertyKey> = new Set([
106
100
  "switchSession",
107
101
  ]);
108
102
 
103
+ const BROKER_LIFECYCLE_OPERATIONS = new Set([
104
+ "session.new",
105
+ "session.fork",
106
+ "session.resume",
107
+ "session.close",
108
+ "session.switch",
109
+ "session.branch",
110
+ "session.handoff",
111
+ "session.delete",
112
+ ]);
113
+
114
+ function prohibitBrokerLifecycleOperation(operation: string): never {
115
+ throw Object.assign(new Error(`${operation} is available only through the Broker lifecycle service.`), {
116
+ code: "operation_prohibited",
117
+ });
118
+ }
119
+
109
120
  export class ExtensionUiController {
110
121
  #extensionTerminalInputUnsubscribers = new Set<() => void>();
111
122
  #extensionErrorUnsubscribe?: () => void;
@@ -314,52 +325,8 @@ export class ExtensionUiController {
314
325
  case "retry.abort":
315
326
  session.abortRetry();
316
327
  return { aborted: true };
317
- case "session.new":
318
- return { created: await session.newSession() };
319
- case "session.fork":
320
- return { session: await session.fork() };
321
- case "session.resume":
322
- return { resumed: await session.switchSession(String(input.id)) };
323
- case "session.close":
324
- await session.sessionManager.flush();
325
- return { closed: true };
326
- case "session.switch":
327
- return { switched: await session.switchSession(String(input.id)) };
328
- case "session.branch":
329
- try {
330
- return await session.branch(String(input.entryId));
331
- } catch (error) {
332
- throw Object.assign(new Error(error instanceof Error ? error.message : "Branch entry was not found."), {
333
- code: "resource_gone",
334
- });
335
- }
336
328
  case "session.rename":
337
329
  return { renamed: await session.setSessionName(String(input.name), "user") };
338
- case "session.handoff":
339
- try {
340
- return {
341
- handoff: await session.handoff(
342
- typeof input.target === "string"
343
- ? input.target
344
- : typeof input.instructions === "string"
345
- ? input.instructions
346
- : undefined,
347
- ),
348
- };
349
- } catch (error) {
350
- const typed = error as { code?: unknown; handoffDocument?: unknown };
351
- const handoffDocument =
352
- typeof typed?.handoffDocument === "string" ? { handoffDocument: typed.handoffDocument } : undefined;
353
- // Preserve a safe typed code (e.g. transient `busy`) so clients keep
354
- // correct retry/backoff semantics; only synthesize invalid_request for
355
- // otherwise-untyped failures.
356
- const code = typed?.code === "busy" ? "busy" : "invalid_request";
357
- throw Object.assign(
358
- new Error(error instanceof Error ? error.message : "Handoff is unavailable for the current state."),
359
- { code },
360
- handoffDocument,
361
- );
362
- }
363
330
  case "session.export_html":
364
331
  try {
365
332
  return { path: await session.exportToHtml(typeof input.path === "string" ? input.path : undefined) };
@@ -426,13 +393,11 @@ export class ExtensionUiController {
426
393
  }
427
394
  return { changed: true, enabled: on };
428
395
  }
429
- case "session.delete":
430
- await session.sessionManager.dropSession(String(input.id));
431
- return { deleted: true };
432
396
  case "session.cwd.move":
433
397
  await session.sessionManager.moveTo(String(input.path));
434
398
  return { moved: true, cwd: session.sessionManager.getCwd() };
435
399
  default:
400
+ if (BROKER_LIFECYCLE_OPERATIONS.has(operation)) prohibitBrokerLifecycleOperation(operation);
436
401
  throw Object.assign(new Error(`${operation} has no AgentSession implementation.`), { code: "unavailable" });
437
402
  }
438
403
  };
@@ -531,7 +496,13 @@ export class ExtensionUiController {
531
496
  sendMessage: (message, options) => {
532
497
  const wasStreaming = this.ctx.session.isStreaming;
533
498
  this.ctx.session
534
- .sendCustomMessage(message, options)
499
+ // The extension seam is the trusted runtime boundary: extension
500
+ // producers are external to the turn's model/tool runtime, so
501
+ // nextTurn messages are classified "external" here (survive a
502
+ // terminal abort) instead of letting the extension label its
503
+ // own origin — caller-controlled origin defeats source-based
504
+ // continuation fencing (review thread P2).
505
+ .sendCustomMessage(message, { ...options, origin: "external" })
535
506
  .then(() => {
536
507
  if (!this.#isStopped()) this.#applyCustomMessageDisplay(wasStreaming, message.display);
537
508
  })
@@ -640,6 +611,13 @@ export class ExtensionUiController {
640
611
  const commandActions: ExtensionCommandContextActions = {
641
612
  getContextUsage: () => this.ctx.session.getContextUsage(),
642
613
  waitForIdle: () => this.ctx.session.agent.waitForIdle(),
614
+ newSession: async () => prohibitBrokerLifecycleOperation("session.new"),
615
+ branch: async () => prohibitBrokerLifecycleOperation("session.branch"),
616
+ navigateTree: async (targetId, navOptions) => {
617
+ const result = await this.ctx.session.navigateTree(targetId, { summarize: navOptions?.summarize });
618
+ return { cancelled: result.cancelled };
619
+ },
620
+ switchSession: async () => prohibitBrokerLifecycleOperation("session.switch"),
643
621
  reload: async () => {
644
622
  const previousSessionId = this.ctx.sessionManager.getSessionId();
645
623
  await this.ctx.session.reload();
@@ -651,105 +629,7 @@ export class ExtensionUiController {
651
629
  if (this.#isStopped()) return;
652
630
  this.ctx.showStatus("Reloaded session");
653
631
  },
654
- newSession: async options => {
655
- const cleanupPreviousSessionUi = this.captureSessionUiCleanup();
656
- const success = await this.ctx.session.newSession({ parentSession: options?.parentSession });
657
- if (!success) {
658
- return { cancelled: true };
659
- }
660
- if (this.#isStopped()) return { cancelled: true };
661
- clearInteractiveActivityLoaders(this.ctx);
662
- cleanupPreviousSessionUi();
663
-
664
- stopInteractiveActivityIndicator(this.ctx);
665
- this.ctx.resetIrcSidebarSession();
666
- setSessionTerminalTitle(this.ctx.sessionManager.getSessionName(), this.ctx.sessionManager.getCwd());
667
-
668
- if (options?.setup) {
669
- await options.setup(this.ctx.sessionManager);
670
- if (this.#isStopped()) return { cancelled: true };
671
- }
672
-
673
- this.ctx.statusLine.invalidate();
674
- this.ctx.statusLine.setSessionStartTime(Date.now());
675
- this.ctx.updateEditorTopBorder();
676
- this.ctx.ui.requestRender();
677
-
678
- prepareTranscriptRebuild(this.ctx.ui, "replace-identity");
679
- this.ctx.chatContainer.clear();
680
- this.ctx.pendingMessagesContainer.clear();
681
- this.ctx.compactionQueuedMessages = [];
682
- this.ctx.streamingComponent = undefined;
683
- this.ctx.streamingMessage = undefined;
684
- this.ctx.pendingTools.clear();
685
-
686
- this.ctx.chatContainer.addChild(
687
- new Text(`${theme.fg("accent", `${theme.status.success} New session started`)}`, 1, 0),
688
- );
689
- await this.ctx.reloadTodos();
690
- if (this.#isStopped()) return { cancelled: true };
691
- this.ctx.ui.requestRender();
692
-
693
- return { cancelled: false };
694
- },
695
- branch: async entryId => {
696
- const result = await this.ctx.session.branch(entryId);
697
- if (this.#isStopped()) return { cancelled: true };
698
- if (result.cancelled) {
699
- return { cancelled: true };
700
- }
701
- this.ctx.resetIrcSidebarSession();
702
-
703
- // Update UI
704
- this.ctx.rebuildInitialMessages("replace-identity");
705
- await this.ctx.reloadTodos();
706
- if (this.#isStopped()) return { cancelled: true };
707
- this.ctx.editor.setText(result.selectedText);
708
- this.ctx.showStatus("Branched to new session");
709
-
710
- return { cancelled: false };
711
- },
712
- navigateTree: async (targetId, options) => {
713
- const result = await this.ctx.session.navigateTree(targetId, { summarize: options?.summarize });
714
- if (this.#isStopped()) return { cancelled: true };
715
- if (result.cancelled) {
716
- return { cancelled: true };
717
- }
718
-
719
- // Update UI
720
- this.ctx.rebuildInitialMessages("reconcile-same-transcript");
721
- await this.ctx.reloadTodos();
722
- if (this.#isStopped()) return { cancelled: true };
723
- if (result.editorText && !this.ctx.editor.getText().trim()) {
724
- this.ctx.editor.setText(result.editorText);
725
- }
726
- this.ctx.showStatus("Navigated to selected point");
727
-
728
- return { cancelled: false };
729
- },
730
632
  compact: async instructionsOrOptions => this.#handleInteractiveCompact(instructionsOrOptions),
731
- switchSession: async sessionPath => {
732
- const previousSessionId = this.ctx.sessionManager.getSessionId();
733
-
734
- this.clearHookWidgets();
735
- const result = await this.ctx.session.switchSession(sessionPath);
736
- if (this.#isStopped()) return { cancelled: true };
737
- if (!result) {
738
- return { cancelled: true };
739
- }
740
- clearInteractiveActivityLoaders(this.ctx);
741
- const switchingToDifferentSession = previousSessionId !== this.ctx.sessionManager.getSessionId();
742
- if (switchingToDifferentSession) this.ctx.resetIrcSidebarSession();
743
-
744
- setSessionTerminalTitle(this.ctx.sessionManager.getSessionName(), this.ctx.sessionManager.getCwd());
745
- this.ctx.rebuildInitialMessages(
746
- switchingToDifferentSession ? "replace-identity" : "reconcile-same-transcript",
747
- );
748
- await this.ctx.reloadTodos();
749
- if (this.#isStopped()) return { cancelled: true };
750
- syncInteractiveActivityIndicator(this.ctx);
751
- return { cancelled: false };
752
- },
753
633
  };
754
634
 
755
635
  extensionRunner.initialize(
@@ -849,7 +729,10 @@ export class ExtensionUiController {
849
729
  sendMessage: (message, options) => {
850
730
  const wasStreaming = this.ctx.session.isStreaming;
851
731
  this.ctx.session
852
- .sendCustomMessage(message, options)
732
+ // Trusted seam: extension producers are external to the turn
733
+ // runtime, so classify nextTurn messages "external" here
734
+ // instead of accepting a caller-supplied origin (review P2).
735
+ .sendCustomMessage(message, { ...options, origin: "external" })
853
736
  .then(() => this.#applyCustomMessageDisplay(wasStreaming, message.display))
854
737
  .catch((err: unknown) => {
855
738
  const errorText = `Extension sendMessage failed: ${err instanceof Error ? err.message : String(err)}`;
@@ -955,6 +838,13 @@ export class ExtensionUiController {
955
838
  const commandActions: ExtensionCommandContextActions = {
956
839
  getContextUsage: () => this.ctx.session.getContextUsage(),
957
840
  waitForIdle: () => this.ctx.session.agent.waitForIdle(),
841
+ newSession: async () => prohibitBrokerLifecycleOperation("session.new"),
842
+ branch: async () => prohibitBrokerLifecycleOperation("session.branch"),
843
+ navigateTree: async (targetId, navOptions) => {
844
+ const result = await this.ctx.session.navigateTree(targetId, { summarize: navOptions?.summarize });
845
+ return { cancelled: result.cancelled };
846
+ },
847
+ switchSession: async () => prohibitBrokerLifecycleOperation("session.switch"),
958
848
  reload: async () => {
959
849
  if (this.ctx.isBackgrounded) {
960
850
  return;
@@ -969,109 +859,7 @@ export class ExtensionUiController {
969
859
  if (this.#isStopped()) return;
970
860
  this.ctx.showStatus("Reloaded session");
971
861
  },
972
- newSession: async options => {
973
- if (this.ctx.isBackgrounded) {
974
- return { cancelled: true };
975
- }
976
- const cleanupPreviousSessionUi = this.captureSessionUiCleanup();
977
- const success = await this.ctx.session.newSession({ parentSession: options?.parentSession });
978
- if (!success) {
979
- return { cancelled: true };
980
- }
981
- if (this.#isStopped()) return { cancelled: true };
982
- clearInteractiveActivityLoaders(this.ctx);
983
- cleanupPreviousSessionUi();
984
-
985
- stopInteractiveActivityIndicator(this.ctx);
986
- this.ctx.resetIrcSidebarSession();
987
-
988
- if (options?.setup) {
989
- await options.setup(this.ctx.sessionManager);
990
- if (this.#isStopped()) return { cancelled: true };
991
- }
992
-
993
- prepareTranscriptRebuild(this.ctx.ui, "replace-identity");
994
- this.ctx.chatContainer.clear();
995
- this.ctx.pendingMessagesContainer.clear();
996
- this.ctx.compactionQueuedMessages = [];
997
- this.ctx.streamingComponent = undefined;
998
- this.ctx.streamingMessage = undefined;
999
- this.ctx.pendingTools.clear();
1000
-
1001
- this.ctx.chatContainer.addChild(
1002
- new Text(`${theme.fg("accent", `${theme.status.success} New session started`)}`, 1, 0),
1003
- );
1004
- await this.ctx.reloadTodos();
1005
- if (this.#isStopped()) return { cancelled: true };
1006
- this.ctx.ui.requestRender();
1007
-
1008
- return { cancelled: false };
1009
- },
1010
- branch: async entryId => {
1011
- if (this.ctx.isBackgrounded) {
1012
- return { cancelled: true };
1013
- }
1014
- const result = await this.ctx.session.branch(entryId);
1015
- if (this.#isStopped()) return { cancelled: true };
1016
- if (result.cancelled) {
1017
- return { cancelled: true };
1018
- }
1019
- this.ctx.resetIrcSidebarSession();
1020
-
1021
- // Update UI
1022
- this.ctx.rebuildInitialMessages("replace-identity");
1023
- await this.ctx.reloadTodos();
1024
- if (this.#isStopped()) return { cancelled: true };
1025
- this.ctx.editor.setText(result.selectedText);
1026
- this.ctx.showStatus("Branched to new session");
1027
-
1028
- return { cancelled: false };
1029
- },
1030
- navigateTree: async (targetId, options) => {
1031
- if (this.ctx.isBackgrounded) {
1032
- return { cancelled: true };
1033
- }
1034
- const result = await this.ctx.session.navigateTree(targetId, { summarize: options?.summarize });
1035
- if (this.#isStopped()) return { cancelled: true };
1036
- if (result.cancelled) {
1037
- return { cancelled: true };
1038
- }
1039
-
1040
- // Update UI
1041
- this.ctx.rebuildInitialMessages("reconcile-same-transcript");
1042
- await this.ctx.reloadTodos();
1043
- if (this.#isStopped()) return { cancelled: true };
1044
- if (result.editorText && !this.ctx.editor.getText().trim()) {
1045
- this.ctx.editor.setText(result.editorText);
1046
- }
1047
- this.ctx.showStatus("Navigated to selected point");
1048
-
1049
- return { cancelled: false };
1050
- },
1051
862
  compact: async instructionsOrOptions => this.#handleInteractiveCompact(instructionsOrOptions),
1052
- switchSession: async sessionPath => {
1053
- if (this.ctx.isBackgrounded) {
1054
- return { cancelled: true };
1055
- }
1056
- const previousSessionId = this.ctx.sessionManager.getSessionId();
1057
-
1058
- this.clearHookWidgets();
1059
- const result = await this.ctx.session.switchSession(sessionPath);
1060
- if (this.#isStopped()) return { cancelled: true };
1061
- if (!result) {
1062
- return { cancelled: true };
1063
- }
1064
- clearInteractiveActivityLoaders(this.ctx);
1065
- const switchingToDifferentSession = previousSessionId !== this.ctx.sessionManager.getSessionId();
1066
- if (switchingToDifferentSession) this.ctx.resetIrcSidebarSession();
1067
- this.ctx.rebuildInitialMessages(
1068
- switchingToDifferentSession ? "replace-identity" : "reconcile-same-transcript",
1069
- );
1070
- await this.ctx.reloadTodos();
1071
- if (this.#isStopped()) return { cancelled: true };
1072
- syncInteractiveActivityIndicator(this.ctx);
1073
- return { cancelled: false };
1074
- },
1075
863
  };
1076
864
 
1077
865
  extensionRunner.initialize(
@@ -1703,6 +1491,17 @@ export class ExtensionUiController {
1703
1491
 
1704
1492
  #sendExtensionUserMessage: SendUserMessageHandler = (content, options) => {
1705
1493
  if (this.#isStopped()) return Promise.resolve();
1494
+ // Validate at the owning boundary BEFORE session delivery and UI bookkeeping:
1495
+ // applyInjectedUserSubmission → normalizeInjectedUserContent iterates content
1496
+ // and dereferences part.type synchronously. Absent/null content (the
1497
+ // container) OR null/undefined/non-object array elements throw an untyped
1498
+ // TypeError synchronously — before the send.catch handler below is attached,
1499
+ // leaving the typed invalid_input rejection from AgentSession unobserved
1500
+ // (unhandled rejection) and crashing the resident process. Reject as a typed
1501
+ // nonfatal control error so callers can surface it without losing session
1502
+ // continuity.
1503
+ const invalidContentError = extensionUserMessageContentError(content);
1504
+ if (invalidContentError) return Promise.reject(invalidContentError);
1706
1505
  // Compute queued BEFORE send: prompt() may flip session.isStreaming synchronously.
1707
1506
  const queued = Boolean(options?.deliverAs) || this.ctx.session.isStreaming;
1708
1507
  // Call send first so the busy/queued path finds the session queue populated
@@ -26,6 +26,7 @@ import { ensureSupportedImageInput, ImageInputTooLargeError } from "../../utils/
26
26
  import { resizeImage } from "../../utils/image-resize";
27
27
  import { loadPastedImageBatch, PastedImageBatchError } from "../../utils/pasted-image-loading";
28
28
  import {
29
+ decodePastedPathCandidate,
29
30
  formatPastedImageReference,
30
31
  locatePastedImageReferenceAroundCursor,
31
32
  parsePastedImagePaths,
@@ -55,8 +56,13 @@ export const BACKGROUND_FOLD_DOUBLE_PRESS_MS = 750;
55
56
  const DRAFT_CLEAR_DOUBLE_ESCAPE_WINDOW_MS = 800;
56
57
  const EMPTY_EDITOR_DOUBLE_ESCAPE_WINDOW_MS = 500;
57
58
  const IMAGE_PLACEHOLDER_PATTERN = /\[image ([1-9]\d*)\]/g;
59
+ const ITERM_PET_DRAG_PATH_PATTERN = /^\/var\/folders\/[^/]+\/[^/]+\/T\/iTerm2\.[A-Za-z0-9]+\.gajae-pet\.(?:png|gif)$/;
58
60
  const IMAGE_PLACEHOLDER_PRESENT_PATTERN = /\[image [1-9]\d*\]/;
59
61
 
62
+ function isItermPetDragPaste(text: string): boolean {
63
+ return ITERM_PET_DRAG_PATH_PATTERN.test(decodePastedPathCandidate(text) ?? "");
64
+ }
65
+
60
66
  interface InputControllerDependencies {
61
67
  loadPastedImageBatch?: typeof loadPastedImageBatch;
62
68
  }
@@ -1675,6 +1681,10 @@ export class InputController {
1675
1681
  }
1676
1682
 
1677
1683
  handleTextPaste(text: string, context: PasteTextContext): boolean | Promise<boolean> {
1684
+ if (isItermPetDragPaste(text)) {
1685
+ this.ctx.showStatus("Ignored dragged Gajae Pet image.", { dim: true });
1686
+ return true;
1687
+ }
1678
1688
  if (this.ctx.isBashMode || this.ctx.isPythonMode) return false;
1679
1689
  const parsed = parsePastedImagePaths(text, { cwd: this.ctx.sessionManager.getCwd() });
1680
1690
  if (!parsed) return false;
@@ -18,7 +18,7 @@ import {
18
18
  setServerDisabled,
19
19
  updateMCPServer,
20
20
  } from "../../runtime-mcp/config-writer";
21
- import { MCPOAuthFlow } from "../../runtime-mcp/oauth-flow";
21
+ import { canonicalMCPResourceUri, MCPOAuthFlow } from "../../runtime-mcp/oauth-flow";
22
22
  import {
23
23
  clearSmitheryApiKey,
24
24
  createSmitheryCliAuthSession,
@@ -434,6 +434,7 @@ export class MCPCommandController {
434
434
  finalConfig.oauth?.callbackPort,
435
435
  finalConfig.oauth?.callbackPath,
436
436
  finalConfig.oauth?.redirectUri,
437
+ { issuer: oauth.issuer, issuerResponseIssSupported: oauth.authorizationResponseIssSupported },
437
438
  );
438
439
  const persistedClientId = oauthResult.clientId ?? oauth.clientId ?? finalConfig.oauth?.clientId;
439
440
  const persistedClientSecret = oauthResult.clientSecret ?? finalConfig.oauth?.clientSecret;
@@ -522,6 +523,7 @@ export class MCPCommandController {
522
523
  callbackPort?: number,
523
524
  callbackPath?: string,
524
525
  redirectUri?: string,
526
+ oauthMeta?: { issuer?: string; issuerResponseIssSupported?: boolean },
525
527
  ): Promise<OAuthFlowResult> {
526
528
  const authStorage = this.ctx.session.modelRegistry.authStorage;
527
529
  let parsedAuthUrl: URL;
@@ -553,6 +555,13 @@ export class MCPCommandController {
553
555
  redirectUri,
554
556
  callbackPort,
555
557
  callbackPath,
558
+ // RFC 8707 canonical MCP server resource on auth + token requests.
559
+ ...(canonicalMCPResourceUri(endpointUrl) ? { resource: canonicalMCPResourceUri(endpointUrl) } : {}),
560
+ // RFC 9207 issuer validation (recorded from validated discovery metadata).
561
+ ...(oauthMeta?.issuer ? { issuer: oauthMeta.issuer } : {}),
562
+ ...(oauthMeta?.issuerResponseIssSupported !== undefined
563
+ ? { issuerResponseIssSupported: oauthMeta.issuerResponseIssSupported }
564
+ : {}),
556
565
  },
557
566
  {
558
567
  onAuth: (info: { url: string; instructions?: string }) => {
@@ -738,6 +747,8 @@ export class MCPCommandController {
738
747
  tokenUrl: string;
739
748
  clientId?: string;
740
749
  scopes?: string;
750
+ issuer?: string;
751
+ authorizationResponseIssSupported?: boolean;
741
752
  }> {
742
753
  // First test if server actually needs auth by connecting without OAuth
743
754
  let connectionSucceeded = false;
@@ -1358,6 +1369,7 @@ export class MCPCommandController {
1358
1369
  found.config.oauth?.callbackPort,
1359
1370
  found.config.oauth?.callbackPath,
1360
1371
  found.config.oauth?.redirectUri,
1372
+ { issuer: oauth.issuer, issuerResponseIssSupported: oauth.authorizationResponseIssSupported },
1361
1373
  );
1362
1374
 
1363
1375
  const persistedClientId = oauthResult.clientId ?? oauth.clientId ?? found.config.oauth?.clientId;
@@ -1466,8 +1478,9 @@ export class MCPCommandController {
1466
1478
  // Disconnect all existing servers
1467
1479
  await this.ctx.mcpManager.disconnectAll();
1468
1480
 
1469
- // Rediscover and connect
1470
- const result = await this.ctx.mcpManager.discoverAndConnect();
1481
+ // Rediscover and connect (native `.gjc` scopes only: Claude Code/Codex
1482
+ // MCP files are explicit import sources, not runtime authorities).
1483
+ const result = await this.ctx.mcpManager.discoverAndConnect({ nativeOnly: true });
1471
1484
  await this.ctx.session.refreshMCPTools(this.ctx.mcpManager.getTools());
1472
1485
 
1473
1486
  // Show any connection errors