@gajae-code/coding-agent 0.13.3 → 0.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (599) hide show
  1. package/CHANGELOG.md +184 -2
  2. package/README.md +2 -0
  3. package/bin/gajaessi.js +4 -0
  4. package/dist/types/async/job-manager.d.ts +55 -2
  5. package/dist/types/async/support.d.ts +14 -0
  6. package/dist/types/capability/mcp.d.ts +6 -0
  7. package/dist/types/capability/types.d.ts +6 -0
  8. package/dist/types/cli/accounts-cli.d.ts +19 -0
  9. package/dist/types/cli/args.d.ts +3 -0
  10. package/dist/types/cli/config-cli.d.ts +6 -0
  11. package/dist/types/cli/crash-cli.d.ts +10 -0
  12. package/dist/types/cli/customize-doctor.d.ts +145 -0
  13. package/dist/types/cli/daemon-cli.d.ts +3 -1
  14. package/dist/types/cli/mcp-cli.d.ts +11 -0
  15. package/dist/types/cli/notify-cli.d.ts +1 -1
  16. package/dist/types/cli/root-flags.d.ts +12 -0
  17. package/dist/types/cli/setup-cli.d.ts +3 -1
  18. package/dist/types/cli/skills-cli.d.ts +2 -1
  19. package/dist/types/cli/update-cli.d.ts +19 -1
  20. package/dist/types/cli.d.ts +6 -0
  21. package/dist/types/commands/accounts.d.ts +40 -0
  22. package/dist/types/commands/crash.d.ts +24 -0
  23. package/dist/types/commands/customize.d.ts +22 -0
  24. package/dist/types/commands/daemon.d.ts +1 -1
  25. package/dist/types/commands/launch.d.ts +6 -0
  26. package/dist/types/commands/setup.d.ts +6 -0
  27. package/dist/types/commands/skills.d.ts +6 -1
  28. package/dist/types/commands/update.d.ts +7 -0
  29. package/dist/types/config/atomic-yaml-patch-worker.d.ts +25 -0
  30. package/dist/types/config/atomic-yaml-patch.d.ts +62 -2
  31. package/dist/types/config/config-schema-version.d.ts +10 -0
  32. package/dist/types/config/file-lock.d.ts +18 -0
  33. package/dist/types/config/model-profile-activation.d.ts +3 -1
  34. package/dist/types/config/model-registry.d.ts +9 -1
  35. package/dist/types/config/models-config-schema.d.ts +2 -0
  36. package/dist/types/config/settings-schema.d.ts +70 -6
  37. package/dist/types/config/settings.d.ts +63 -0
  38. package/dist/types/config/skill-settings-defaults.d.ts +26 -0
  39. package/dist/types/config/task-delegation.d.ts +39 -0
  40. package/dist/types/config/update-channel.d.ts +10 -0
  41. package/dist/types/coordinator-mcp/server.d.ts +5 -1
  42. package/dist/types/crash/index-store.d.ts +87 -0
  43. package/dist/types/crash/nudge.d.ts +50 -0
  44. package/dist/types/crash/record-loader.d.ts +17 -0
  45. package/dist/types/crash/report.d.ts +134 -0
  46. package/dist/types/crash/sanitize.d.ts +25 -0
  47. package/dist/types/cursor.d.ts +13 -2
  48. package/dist/types/customization/import.d.ts +37 -0
  49. package/dist/types/customization/index.d.ts +4 -0
  50. package/dist/types/customization/inventory.d.ts +25 -0
  51. package/dist/types/customization/mutations.d.ts +32 -0
  52. package/dist/types/customization/types.d.ts +115 -0
  53. package/dist/types/daemon/control-types.d.ts +8 -1
  54. package/dist/types/daemon/operator-contract.d.ts +4 -4
  55. package/dist/types/discovery/claude.d.ts +39 -1
  56. package/dist/types/discovery/codex.d.ts +39 -1
  57. package/dist/types/discovery/index.d.ts +2 -0
  58. package/dist/types/discovery/mcp-compat.d.ts +30 -0
  59. package/dist/types/edit/renderer.d.ts +23 -0
  60. package/dist/types/extensibility/extensions/runner.d.ts +3 -0
  61. package/dist/types/extensibility/extensions/types.d.ts +21 -4
  62. package/dist/types/extensibility/gjc-plugins/observability.d.ts +6 -1
  63. package/dist/types/extensibility/gjc-plugins/registry.d.ts +8 -1
  64. package/dist/types/extensibility/hooks/loader.d.ts +19 -5
  65. package/dist/types/extensibility/runtime-skill-discovery.d.ts +22 -1
  66. package/dist/types/extensibility/skill-management.d.ts +107 -0
  67. package/dist/types/gjc-runtime/deep-interview-runtime.d.ts +3 -1
  68. package/dist/types/gjc-runtime/launch-worktree.d.ts +8 -0
  69. package/dist/types/gjc-runtime/linux-proc.d.ts +3 -0
  70. package/dist/types/gjc-runtime/ralplan-runtime.d.ts +10 -6
  71. package/dist/types/gjc-runtime/session-state-lock.d.ts +104 -0
  72. package/dist/types/gjc-runtime/session-state-sidecar.d.ts +120 -2
  73. package/dist/types/gjc-runtime/state-writer.d.ts +10 -1
  74. package/dist/types/gjc-runtime/ultragoal-guard.d.ts +4 -2
  75. package/dist/types/gjc-runtime/ultragoal-runtime.d.ts +8 -6
  76. package/dist/types/gjc-runtime/workflow-settings.d.ts +109 -0
  77. package/dist/types/hooks/events.d.ts +60 -0
  78. package/dist/types/hooks/normalize.d.ts +83 -0
  79. package/dist/types/hooks/skill-state.d.ts +9 -2
  80. package/dist/types/main.d.ts +1 -1
  81. package/dist/types/modes/acp/abort-scope.d.ts +13 -0
  82. package/dist/types/modes/acp/acp-agent.d.ts +7 -4
  83. package/dist/types/modes/components/customization/customization-dashboard.d.ts +44 -0
  84. package/dist/types/modes/components/customization/import-wizard.d.ts +21 -0
  85. package/dist/types/modes/components/customization/index.d.ts +1 -0
  86. package/dist/types/modes/components/gajae-pet-widget.d.ts +8 -30
  87. package/dist/types/modes/components/irc-sidebar.d.ts +1 -0
  88. package/dist/types/modes/components/iterm-pet-transport.d.ts +122 -0
  89. package/dist/types/modes/components/oauth-selector.d.ts +10 -4
  90. package/dist/types/modes/components/pet-capability.d.ts +11 -25
  91. package/dist/types/modes/components/status-line/gh.d.ts +6 -2
  92. package/dist/types/modes/controllers/extension-ui-controller.d.ts +1 -1
  93. package/dist/types/modes/controllers/selector-controller.d.ts +7 -8
  94. package/dist/types/modes/controllers/stt-controller.d.ts +1 -1
  95. package/dist/types/modes/interactive-mode.d.ts +1 -0
  96. package/dist/types/modes/types.d.ts +1 -0
  97. package/dist/types/modes/utils/injected-user-submission.d.ts +10 -0
  98. package/dist/types/runtime-mcp/config.d.ts +9 -0
  99. package/dist/types/runtime-mcp/manager.d.ts +26 -1
  100. package/dist/types/runtime-mcp/oauth-discovery.d.ts +4 -0
  101. package/dist/types/runtime-mcp/oauth-flow.d.ts +24 -1
  102. package/dist/types/runtime-mcp/pool-key.d.ts +2 -0
  103. package/dist/types/runtime-mcp/protocol.d.ts +278 -0
  104. package/dist/types/runtime-mcp/scope-config.d.ts +29 -0
  105. package/dist/types/runtime-mcp/tool-bridge.d.ts +15 -13
  106. package/dist/types/runtime-mcp/transports/http.d.ts +9 -0
  107. package/dist/types/runtime-mcp/types.d.ts +102 -10
  108. package/dist/types/sdk/acp/adapter.d.ts +26 -5
  109. package/dist/types/sdk/broker/broker.d.ts +3 -55
  110. package/dist/types/sdk/broker/lifecycle.d.ts +18 -12
  111. package/dist/types/sdk/broker/session-index.d.ts +14 -5
  112. package/dist/types/sdk/broker/startup-failure.d.ts +16 -1
  113. package/dist/types/sdk/bus/chat-daemon-control.d.ts +51 -1
  114. package/dist/types/sdk/bus/chat-daemon-runtime.d.ts +4 -41
  115. package/dist/types/sdk/bus/config.d.ts +11 -0
  116. package/dist/types/sdk/bus/conversation-store.d.ts +0 -1
  117. package/dist/types/sdk/bus/daemon-paths.d.ts +6 -0
  118. package/dist/types/sdk/bus/discord-conversation.d.ts +2 -0
  119. package/dist/types/sdk/bus/discord-daemon.d.ts +17 -12
  120. package/dist/types/sdk/bus/existing-thread-readiness.d.ts +4 -34
  121. package/dist/types/sdk/bus/inbound-reaction-ordering.d.ts +61 -0
  122. package/dist/types/sdk/bus/index.d.ts +85 -99
  123. package/dist/types/sdk/bus/kind-aware-reconciliation.d.ts +29 -7
  124. package/dist/types/sdk/bus/managed-daemon.d.ts +2 -32
  125. package/dist/types/sdk/bus/notification-service.d.ts +52 -0
  126. package/dist/types/sdk/bus/operator-runtime.d.ts +1 -1
  127. package/dist/types/sdk/bus/prompt-reconciliation.d.ts +16 -5
  128. package/dist/types/sdk/bus/reconciliation-store.d.ts +113 -5
  129. package/dist/types/sdk/bus/session-control.d.ts +25 -1
  130. package/dist/types/sdk/bus/slack-conversation.d.ts +4 -0
  131. package/dist/types/sdk/bus/slack-daemon.d.ts +9 -17
  132. package/dist/types/sdk/bus/slack-live-provider.d.ts +3 -1
  133. package/dist/types/sdk/bus/slack-provider.d.ts +4 -0
  134. package/dist/types/sdk/bus/slack-thread-binding.d.ts +6 -40
  135. package/dist/types/sdk/bus/telegram-adoption-intent.d.ts +30 -104
  136. package/dist/types/sdk/bus/telegram-daemon-cli.d.ts +10 -0
  137. package/dist/types/sdk/bus/telegram-daemon-contract.d.ts +262 -19
  138. package/dist/types/sdk/bus/telegram-daemon-orphan-reap.d.ts +125 -0
  139. package/dist/types/sdk/bus/telegram-daemon-owner-registry.d.ts +22 -0
  140. package/dist/types/sdk/bus/telegram-daemon.d.ts +119 -310
  141. package/dist/types/sdk/bus/telegram-reference.d.ts +1 -47
  142. package/dist/types/sdk/bus/threaded-render.d.ts +1 -0
  143. package/dist/types/sdk/bus/topic-registry.d.ts +33 -17
  144. package/dist/types/sdk/cli/rows.d.ts +2 -11
  145. package/dist/types/sdk/cli/session-cli.d.ts +15 -25
  146. package/dist/types/sdk/client/client.d.ts +97 -1
  147. package/dist/types/sdk/host/control/dispatch.d.ts +0 -7
  148. package/dist/types/sdk/host/control/index.d.ts +1 -1
  149. package/dist/types/sdk/host/control/operations.d.ts +18 -5
  150. package/dist/types/sdk/host/control/runtime-gate.d.ts +19 -0
  151. package/dist/types/sdk/host/host.d.ts +15 -1
  152. package/dist/types/sdk/host/query/handlers.d.ts +5 -0
  153. package/dist/types/sdk/host/reverse-leases.d.ts +1 -1
  154. package/dist/types/sdk/host/session-runtime.d.ts +127 -7
  155. package/dist/types/sdk/host/types.d.ts +1 -1
  156. package/dist/types/sdk/host/websocket-transport.d.ts +1 -1
  157. package/dist/types/sdk/index.d.ts +2 -1
  158. package/dist/types/sdk/lifecycle/broker-client.d.ts +8 -0
  159. package/dist/types/sdk/lifecycle/client.d.ts +59 -0
  160. package/dist/types/sdk/lifecycle/index.d.ts +3 -0
  161. package/dist/types/sdk/lifecycle/service.d.ts +232 -0
  162. package/dist/types/sdk/mcp/server.d.ts +9 -6
  163. package/dist/types/sdk/prompt-deadline-lease.d.ts +43 -0
  164. package/dist/types/sdk/prompt-deadline-manager.d.ts +28 -0
  165. package/dist/types/sdk/prompt-status.d.ts +10 -3
  166. package/dist/types/sdk/protocol/operation-registry.d.ts +5 -0
  167. package/dist/types/sdk/receipt-state.d.ts +17 -0
  168. package/dist/types/sdk/reconciliation-extensions.d.ts +2 -0
  169. package/dist/types/sdk/router/index.d.ts +1 -0
  170. package/dist/types/sdk/router/session-router.d.ts +152 -0
  171. package/dist/types/sdk/session-list.d.ts +22 -0
  172. package/dist/types/sdk/session-reconnect.d.ts +43 -1
  173. package/dist/types/sdk/session.d.ts +34 -1
  174. package/dist/types/sdk/transport/serve-cli.d.ts +1 -4
  175. package/dist/types/session/account-inventory.d.ts +86 -0
  176. package/dist/types/session/agent-session.d.ts +145 -6
  177. package/dist/types/session/agent-storage.d.ts +10 -0
  178. package/dist/types/session/coordinator-tool-label.d.ts +28 -0
  179. package/dist/types/session/internal/managed-session-storage.d.ts +23 -4
  180. package/dist/types/session/messages.d.ts +1 -1
  181. package/dist/types/session/secure-token-file.d.ts +3 -0
  182. package/dist/types/session/session-manager.d.ts +40 -1
  183. package/dist/types/session/startup-auth-config.d.ts +44 -0
  184. package/dist/types/session/terminal-abort.d.ts +378 -0
  185. package/dist/types/session/yield-queue.d.ts +7 -0
  186. package/dist/types/session-import/claude.d.ts +26 -0
  187. package/dist/types/session-import/codex.d.ts +88 -0
  188. package/dist/types/session-import/command.d.ts +35 -0
  189. package/dist/types/session-import/detect.d.ts +22 -0
  190. package/dist/types/session-import/index.d.ts +7 -0
  191. package/dist/types/session-import/provider-codex.d.ts +22 -0
  192. package/dist/types/session-import/provider-service.d.ts +38 -0
  193. package/dist/types/session-import/redact.d.ts +23 -0
  194. package/dist/types/session-import/service.d.ts +47 -0
  195. package/dist/types/session-import/types.d.ts +120 -0
  196. package/dist/types/setup/paseo/check.d.ts +16 -0
  197. package/dist/types/setup/paseo/install-saga.d.ts +115 -0
  198. package/dist/types/setup/paseo/json-publisher.d.ts +76 -0
  199. package/dist/types/setup/paseo/orchestration-preferences.d.ts +24 -0
  200. package/dist/types/setup/paseo/paseo-ownership.d.ts +87 -0
  201. package/dist/types/setup/paseo/paseo-setup.d.ts +29 -0
  202. package/dist/types/setup/paseo/provider-config.d.ts +35 -0
  203. package/dist/types/setup/paseo/remove.d.ts +14 -0
  204. package/dist/types/setup/paseo/result-types.d.ts +59 -0
  205. package/dist/types/setup/paseo/setup-deps.d.ts +73 -0
  206. package/dist/types/setup/paseo/skills-bridge.d.ts +44 -0
  207. package/dist/types/skill-state/active-state.d.ts +5 -1
  208. package/dist/types/slash-commands/acp-builtins.d.ts +5 -1
  209. package/dist/types/slash-commands/builtin-registry.d.ts +2 -0
  210. package/dist/types/slash-commands/helpers/credential-switch.d.ts +12 -0
  211. package/dist/types/slash-commands/helpers/usage-report.d.ts +5 -6
  212. package/dist/types/slash-commands/types.d.ts +7 -1
  213. package/dist/types/task/executor.d.ts +10 -0
  214. package/dist/types/task/index.d.ts +3 -1
  215. package/dist/types/tools/ask-answer-registry.d.ts +6 -3
  216. package/dist/types/tools/bash-sleep-advisory.d.ts +14 -0
  217. package/dist/types/tools/bash.d.ts +2 -6
  218. package/dist/types/tools/browser/attach.d.ts +11 -0
  219. package/dist/types/tools/browser/launch.d.ts +20 -0
  220. package/dist/types/tools/browser/profile-discovery.d.ts +6 -0
  221. package/dist/types/tools/browser/render.d.ts +1 -0
  222. package/dist/types/tools/browser.d.ts +3 -1
  223. package/dist/types/tools/image-gen.d.ts +9 -2
  224. package/dist/types/tools/index.d.ts +8 -0
  225. package/dist/types/tools/monitor.d.ts +1 -1
  226. package/dist/types/tools/skill-discovery.d.ts +8 -1
  227. package/dist/types/tools/subagent.d.ts +2 -0
  228. package/dist/types/tools/ultragoal-ask-guard.d.ts +2 -2
  229. package/dist/types/utils/herdr-pane.d.ts +76 -0
  230. package/package.json +19 -9
  231. package/scripts/build-binary.ts +2 -1
  232. package/scripts/build-sdk-package-smoke.ts +2 -13
  233. package/scripts/capture-sticky-viewport-showcase.ts +0 -1
  234. package/scripts/compile-args.ts +2 -0
  235. package/scripts/generate-sdk-adapter-parity-manifest.ts +31 -16
  236. package/scripts/generate-sdk-operation-inventory.ts +28 -0
  237. package/scripts/generate-telegram-baseline-manifest.ts +1 -0
  238. package/scripts/generate-tool-catalog.ts +6 -4
  239. package/scripts/verify-gjc-sdk-canonicalization.ts +5 -39
  240. package/src/async/job-manager.ts +352 -17
  241. package/src/async/support.ts +25 -0
  242. package/src/autoresearch/dashboard.ts +28 -13
  243. package/src/capability/index.ts +3 -1
  244. package/src/capability/mcp.ts +6 -0
  245. package/src/capability/types.ts +6 -0
  246. package/src/cli/accounts-cli.ts +395 -0
  247. package/src/cli/args.ts +23 -0
  248. package/src/cli/auth-broker-cli.ts +136 -66
  249. package/src/cli/auth-gateway-cli.ts +94 -70
  250. package/src/cli/config-cli.ts +27 -2
  251. package/src/cli/crash-cli.ts +78 -0
  252. package/src/cli/customize-doctor.ts +1605 -0
  253. package/src/cli/daemon-cli.ts +12 -3
  254. package/src/cli/fast-help.ts +1 -0
  255. package/src/cli/mcp-cli.ts +128 -60
  256. package/src/cli/notify-cli.ts +8 -14
  257. package/src/cli/root-flags.ts +8 -0
  258. package/src/cli/setup-cli.ts +145 -0
  259. package/src/cli/skills-cli.ts +38 -2
  260. package/src/cli/update-cli.ts +167 -12
  261. package/src/cli.ts +4 -0
  262. package/src/commands/accounts.ts +71 -0
  263. package/src/commands/crash.ts +35 -0
  264. package/src/commands/customize.ts +84 -0
  265. package/src/commands/daemon.ts +2 -2
  266. package/src/commands/deep-interview.ts +2 -0
  267. package/src/commands/launch.ts +1 -0
  268. package/src/commands/mcp.ts +12 -7
  269. package/src/commands/ralplan.ts +2 -0
  270. package/src/commands/sdk.ts +65 -32
  271. package/src/commands/setup.ts +5 -0
  272. package/src/commands/skills.ts +14 -4
  273. package/src/commands/ultragoal.ts +10 -1
  274. package/src/commands/update.ts +26 -15
  275. package/src/config/atomic-yaml-patch-worker.ts +57 -0
  276. package/src/config/atomic-yaml-patch.ts +769 -29
  277. package/src/config/config-schema-version.ts +10 -0
  278. package/src/config/file-lock.ts +70 -1
  279. package/src/config/mcp-schema.json +52 -14
  280. package/src/config/model-profile-activation.ts +20 -1
  281. package/src/config/model-profiles.ts +29 -19
  282. package/src/config/model-registry.ts +132 -21
  283. package/src/config/models-config-schema.ts +1 -1
  284. package/src/config/settings-schema.ts +76 -6
  285. package/src/config/settings.ts +4038 -199
  286. package/src/config/skill-settings-defaults.ts +41 -3
  287. package/src/config/task-delegation.ts +87 -0
  288. package/src/config/update-channel.ts +23 -0
  289. package/src/coordinator-mcp/server.ts +377 -308
  290. package/src/crash/index-store.ts +723 -0
  291. package/src/crash/nudge.ts +89 -0
  292. package/src/crash/record-loader.ts +149 -0
  293. package/src/crash/report.ts +551 -0
  294. package/src/crash/sanitize.ts +129 -0
  295. package/src/cursor.ts +36 -10
  296. package/src/customization/import.ts +946 -0
  297. package/src/customization/index.ts +4 -0
  298. package/src/customization/inventory.ts +335 -0
  299. package/src/customization/mutations.ts +141 -0
  300. package/src/customization/types.ts +223 -0
  301. package/src/daemon/control-types.ts +8 -1
  302. package/src/daemon/operator-contract.ts +6 -6
  303. package/src/defaults/gjc/skills/deep-interview/SKILL.md +11 -22
  304. package/src/defaults/gjc/skills/ralplan/SKILL.md +36 -23
  305. package/src/defaults/gjc/skills/ultragoal/SKILL.md +16 -0
  306. package/src/discovery/claude-hooks.ts +38 -0
  307. package/src/discovery/claude.ts +142 -209
  308. package/src/discovery/codex-hooks.ts +38 -0
  309. package/src/discovery/codex.ts +132 -198
  310. package/src/discovery/helpers.ts +8 -1
  311. package/src/discovery/index.ts +2 -0
  312. package/src/discovery/mcp-compat.ts +234 -0
  313. package/src/discovery/mcp-json.ts +6 -0
  314. package/src/edit/renderer.ts +40 -0
  315. package/src/edit/streaming.ts +4 -2
  316. package/src/exec/bash-executor.ts +24 -20
  317. package/src/export/html/index.ts +51 -2
  318. package/src/extensibility/extensions/loader.ts +9 -1
  319. package/src/extensibility/extensions/runner.ts +17 -4
  320. package/src/extensibility/extensions/types.ts +31 -6
  321. package/src/extensibility/gjc-plugins/constrained-hooks.ts +33 -0
  322. package/src/extensibility/gjc-plugins/installer.ts +9 -5
  323. package/src/extensibility/gjc-plugins/observability.ts +8 -2
  324. package/src/extensibility/gjc-plugins/registry.ts +13 -2
  325. package/src/extensibility/gjc-plugins/runtime-adapters.ts +3 -1
  326. package/src/extensibility/gjc-plugins/schema.ts +222 -39
  327. package/src/extensibility/hooks/loader.ts +154 -10
  328. package/src/extensibility/runtime-skill-discovery.ts +257 -60
  329. package/src/extensibility/skill-management.ts +368 -0
  330. package/src/extensibility/skills.ts +52 -16
  331. package/src/gjc-runtime/deep-interview-runtime.ts +45 -61
  332. package/src/gjc-runtime/launch-worktree.ts +56 -2
  333. package/src/gjc-runtime/linux-proc.ts +7 -1
  334. package/src/gjc-runtime/ralplan-runtime.ts +100 -164
  335. package/src/gjc-runtime/session-state-lock.ts +992 -0
  336. package/src/gjc-runtime/session-state-sidecar.ts +644 -142
  337. package/src/gjc-runtime/state-writer.ts +39 -14
  338. package/src/gjc-runtime/tmux-owner-isolation.ts +5 -4
  339. package/src/gjc-runtime/ultragoal-guard.ts +11 -4
  340. package/src/gjc-runtime/ultragoal-runtime.ts +44 -41
  341. package/src/gjc-runtime/workflow-settings.ts +596 -0
  342. package/src/goals/tools/goal-tool.ts +6 -1
  343. package/src/hooks/events.ts +291 -0
  344. package/src/hooks/native-skill-hook.ts +4 -0
  345. package/src/hooks/normalize.ts +369 -0
  346. package/src/hooks/skill-state.ts +165 -46
  347. package/src/internal-urls/docs-index.generated.ts +40 -32
  348. package/src/main.ts +32 -5
  349. package/src/migrate/mcp-mapper.ts +25 -2
  350. package/src/modes/acp/abort-scope.ts +29 -0
  351. package/src/modes/acp/acp-agent.ts +423 -98
  352. package/src/modes/components/assistant-message.ts +6 -1
  353. package/src/modes/components/customization/customization-dashboard.ts +443 -0
  354. package/src/modes/components/customization/import-wizard.ts +372 -0
  355. package/src/modes/components/customization/index.ts +1 -0
  356. package/src/modes/components/gajae-pet-widget.ts +539 -213
  357. package/src/modes/components/irc-sidebar.ts +11 -0
  358. package/src/modes/components/iterm-pet-transport.ts +585 -0
  359. package/src/modes/components/oauth-selector.ts +277 -86
  360. package/src/modes/components/pet-capability.ts +39 -40
  361. package/src/modes/components/settings-selector.ts +9 -0
  362. package/src/modes/components/status-line/gh.ts +45 -1
  363. package/src/modes/components/status-line/segments.ts +16 -1
  364. package/src/modes/components/tool-status-header.ts +13 -3
  365. package/src/modes/controllers/command-controller.ts +20 -8
  366. package/src/modes/controllers/extension-ui-controller.ts +56 -257
  367. package/src/modes/controllers/input-controller.ts +10 -0
  368. package/src/modes/controllers/runtime-mcp-command-controller.ts +16 -3
  369. package/src/modes/controllers/selector-controller.ts +177 -72
  370. package/src/modes/controllers/stt-controller.ts +3 -3
  371. package/src/modes/interactive-mode.ts +88 -16
  372. package/src/modes/print-mode.ts +35 -6
  373. package/src/modes/runtime-init.ts +21 -68
  374. package/src/modes/types.ts +1 -0
  375. package/src/modes/utils/injected-user-submission.ts +25 -0
  376. package/src/modes/utils/terminal-bell.ts +15 -1
  377. package/src/prompts/agent-fragments/ralplan-persistence.md +1 -1
  378. package/src/prompts/agent-fragments/restricted-bash.md +1 -1
  379. package/src/prompts/agents/critic.md +1 -1
  380. package/src/prompts/system/rlm-research.md +1 -1
  381. package/src/prompts/system/system-prompt.md +0 -2
  382. package/src/prompts/tools/bash.md +7 -1
  383. package/src/prompts/tools/browser.md +1 -1
  384. package/src/prompts/tools/cron.md +6 -6
  385. package/src/prompts/tools/read.md +0 -2
  386. package/src/prompts/tools/skill-discovery.md +4 -2
  387. package/src/runtime-mcp/client.ts +427 -23
  388. package/src/runtime-mcp/config.ts +37 -5
  389. package/src/runtime-mcp/manager-pool.test.ts +56 -0
  390. package/src/runtime-mcp/manager.ts +52 -2
  391. package/src/runtime-mcp/oauth-discovery.ts +13 -0
  392. package/src/runtime-mcp/oauth-flow.ts +46 -1
  393. package/src/runtime-mcp/pool-key.ts +5 -1
  394. package/src/runtime-mcp/pool.test.ts +9 -0
  395. package/src/runtime-mcp/protocol.test.ts +353 -0
  396. package/src/runtime-mcp/protocol.ts +624 -0
  397. package/src/runtime-mcp/scope-config.ts +78 -0
  398. package/src/runtime-mcp/tool-bridge.ts +44 -10
  399. package/src/runtime-mcp/transports/http.ts +84 -13
  400. package/src/runtime-mcp/types.ts +123 -12
  401. package/src/sdk/acp/adapter.ts +328 -97
  402. package/src/sdk/broker/broker.ts +160 -741
  403. package/src/sdk/broker/ensure.ts +9 -1
  404. package/src/sdk/broker/lifecycle.ts +510 -116
  405. package/src/sdk/broker/operation-receipt-ledger.ts +11 -2
  406. package/src/sdk/broker/process-incarnation.ts +19 -0
  407. package/src/sdk/broker/session-index.ts +516 -117
  408. package/src/sdk/broker/startup-failure.ts +28 -5
  409. package/src/sdk/broker/transport.ts +1 -13
  410. package/src/sdk/bus/chat-daemon-cli.ts +4 -2
  411. package/src/sdk/bus/chat-daemon-control.ts +67 -6
  412. package/src/sdk/bus/chat-daemon-runtime.ts +183 -859
  413. package/src/sdk/bus/config.ts +13 -0
  414. package/src/sdk/bus/conversation-store.ts +59 -171
  415. package/src/sdk/bus/daemon-paths.ts +20 -0
  416. package/src/sdk/bus/discord-conversation.ts +2 -0
  417. package/src/sdk/bus/discord-daemon.ts +524 -126
  418. package/src/sdk/bus/discord-live-provider.ts +206 -79
  419. package/src/sdk/bus/existing-thread-readiness.ts +4 -97
  420. package/src/sdk/bus/inbound-reaction-ordering.ts +122 -0
  421. package/src/sdk/bus/index.ts +2480 -456
  422. package/src/sdk/bus/kind-aware-reconciliation.ts +204 -34
  423. package/src/sdk/bus/lifecycle-commands.ts +2 -2
  424. package/src/sdk/bus/managed-daemon.ts +2 -145
  425. package/src/sdk/bus/notification-service.ts +196 -0
  426. package/src/sdk/bus/operator-runtime.ts +1 -1
  427. package/src/sdk/bus/prompt-reconciliation.ts +24 -15
  428. package/src/sdk/bus/reconciliation-store.ts +553 -24
  429. package/src/sdk/bus/session-control.ts +49 -3
  430. package/src/sdk/bus/slack-conversation.ts +4 -0
  431. package/src/sdk/bus/slack-daemon.ts +733 -134
  432. package/src/sdk/bus/slack-live-provider.ts +65 -15
  433. package/src/sdk/bus/slack-provider.ts +4 -0
  434. package/src/sdk/bus/slack-thread-binding.ts +9 -104
  435. package/src/sdk/bus/telegram-adoption-intent.ts +299 -209
  436. package/src/sdk/bus/telegram-daemon-cli.ts +194 -7
  437. package/src/sdk/bus/telegram-daemon-contract.ts +265 -19
  438. package/src/sdk/bus/telegram-daemon-control.ts +3 -13
  439. package/src/sdk/bus/telegram-daemon-orphan-reap.ts +498 -0
  440. package/src/sdk/bus/telegram-daemon-owner-registry.ts +176 -0
  441. package/src/sdk/bus/telegram-daemon.ts +2552 -2280
  442. package/src/sdk/bus/telegram-reference.ts +1 -226
  443. package/src/sdk/bus/telegram-setup.ts +2 -2
  444. package/src/sdk/bus/threaded-render.ts +1 -0
  445. package/src/sdk/bus/topic-registry.ts +279 -146
  446. package/src/sdk/cli/rows.ts +2 -35
  447. package/src/sdk/cli/session-cli.ts +776 -700
  448. package/src/sdk/client/client.ts +892 -1
  449. package/src/sdk/host/control/dispatch.ts +93 -58
  450. package/src/sdk/host/control/index.ts +1 -1
  451. package/src/sdk/host/control/operations.ts +18 -10
  452. package/src/sdk/host/control/runtime-gate.ts +40 -0
  453. package/src/sdk/host/host.ts +63 -12
  454. package/src/sdk/host/query/handlers.ts +66 -7
  455. package/src/sdk/host/reverse-leases.ts +2 -2
  456. package/src/sdk/host/sdk-surface-parity.test.ts +1 -1
  457. package/src/sdk/host/session-runtime.test.ts +2787 -34
  458. package/src/sdk/host/session-runtime.ts +1489 -101
  459. package/src/sdk/host/surface-policy.ts +12 -8
  460. package/src/sdk/host/types.ts +1 -1
  461. package/src/sdk/host/websocket-transport.lifecycle.test.ts +31 -59
  462. package/src/sdk/host/websocket-transport.ts +85 -50
  463. package/src/sdk/index.ts +2 -1
  464. package/src/sdk/lifecycle/broker-client.ts +53 -0
  465. package/src/sdk/lifecycle/client.ts +234 -0
  466. package/src/sdk/lifecycle/index.ts +3 -0
  467. package/src/sdk/{bus/recent-activity.ts → lifecycle/recent-sessions.ts} +5 -2
  468. package/src/sdk/lifecycle/service.ts +720 -0
  469. package/src/sdk/mcp/server.ts +226 -188
  470. package/src/sdk/prompt-deadline-lease.ts +55 -0
  471. package/src/sdk/prompt-deadline-manager.ts +148 -0
  472. package/src/sdk/prompt-status.ts +11 -3
  473. package/src/sdk/protocol/operation-inventory.generated.json +272 -129
  474. package/src/sdk/protocol/operation-registry.ts +71 -8
  475. package/src/sdk/receipt-state.ts +43 -0
  476. package/src/sdk/reconciliation-extensions.ts +14 -0
  477. package/src/sdk/router/index.ts +1 -0
  478. package/src/sdk/router/session-router.ts +1658 -0
  479. package/src/sdk/session-list.ts +93 -0
  480. package/src/sdk/session-reconnect.ts +45 -1
  481. package/src/sdk/session.ts +716 -120
  482. package/src/sdk/transport/serve-cli.ts +18 -34
  483. package/src/session/account-inventory.ts +603 -0
  484. package/src/session/agent-session.ts +2857 -582
  485. package/src/session/agent-storage.ts +35 -0
  486. package/src/session/blob-store.ts +32 -1
  487. package/src/session/coordinator-tool-label.ts +40 -0
  488. package/src/session/internal/managed-session-scope.ts +4 -0
  489. package/src/session/internal/managed-session-storage.ts +173 -12
  490. package/src/session/messages.ts +1 -1
  491. package/src/session/secure-token-file.ts +80 -0
  492. package/src/session/session-manager.ts +730 -58
  493. package/src/session/session-storage.ts +25 -16
  494. package/src/session/startup-auth-config.ts +297 -0
  495. package/src/session/terminal-abort.ts +1253 -0
  496. package/src/session/yield-queue.ts +57 -15
  497. package/src/session-import/claude.ts +334 -0
  498. package/src/session-import/codex.ts +1033 -0
  499. package/src/session-import/command.ts +77 -0
  500. package/src/session-import/detect.ts +133 -0
  501. package/src/session-import/index.ts +7 -0
  502. package/src/session-import/provider-codex.ts +327 -0
  503. package/src/session-import/provider-service.ts +457 -0
  504. package/src/session-import/redact.ts +128 -0
  505. package/src/session-import/service.ts +1264 -0
  506. package/src/session-import/types.ts +148 -0
  507. package/src/setup/paseo/check.ts +213 -0
  508. package/src/setup/paseo/install-saga.ts +293 -0
  509. package/src/setup/paseo/json-publisher.ts +263 -0
  510. package/src/setup/paseo/orchestration-preferences.ts +86 -0
  511. package/src/setup/paseo/paseo-ownership.ts +224 -0
  512. package/src/setup/paseo/paseo-setup.ts +253 -0
  513. package/src/setup/paseo/provider-config.ts +139 -0
  514. package/src/setup/paseo/remove.ts +183 -0
  515. package/src/setup/paseo/result-types.ts +79 -0
  516. package/src/setup/paseo/setup-deps.ts +175 -0
  517. package/src/setup/paseo/skills-bridge.ts +260 -0
  518. package/src/skill-state/active-state.ts +21 -11
  519. package/src/slash-commands/acp-builtins.ts +9 -1
  520. package/src/slash-commands/builtin-registry.ts +98 -16
  521. package/src/slash-commands/helpers/credential-switch.ts +143 -0
  522. package/src/slash-commands/helpers/mcp.ts +9 -3
  523. package/src/slash-commands/helpers/usage-report.ts +61 -56
  524. package/src/slash-commands/types.ts +7 -2
  525. package/src/task/executor.ts +30 -11
  526. package/src/task/index.ts +66 -7
  527. package/src/task/render.ts +23 -9
  528. package/src/tools/ask-answer-registry.ts +23 -7
  529. package/src/tools/ask.ts +8 -4
  530. package/src/tools/bash-sleep-advisory.ts +115 -0
  531. package/src/tools/bash.ts +98 -18
  532. package/src/tools/browser/attach.ts +71 -3
  533. package/src/tools/browser/launch.ts +86 -13
  534. package/src/tools/browser/profile-discovery.ts +57 -7
  535. package/src/tools/browser/render.ts +8 -1
  536. package/src/tools/browser.ts +130 -21
  537. package/src/tools/computer.enforcement.test.ts +1 -1
  538. package/src/tools/computer.ts +3 -2
  539. package/src/tools/cron.ts +12 -1
  540. package/src/tools/image-gen.ts +27 -16
  541. package/src/tools/index.ts +8 -0
  542. package/src/tools/job.ts +33 -6
  543. package/src/tools/monitor.ts +41 -2
  544. package/src/tools/skill-discovery.ts +21 -29
  545. package/src/tools/subagent.ts +142 -24
  546. package/src/tools/tool-catalog.generated.ts +6 -6
  547. package/src/tools/ultragoal-ask-guard.ts +10 -3
  548. package/src/utils/herdr-pane.ts +345 -0
  549. package/src/utils/title-generator.ts +2 -0
  550. package/src/web/scrapers/index.ts +6 -4
  551. package/dist/types/cli/malloc-env-guard.test.d.ts +0 -1
  552. package/dist/types/defaults/gjc-defaults.test.d.ts +0 -1
  553. package/dist/types/memory-backend/lazy-loading.test.d.ts +0 -1
  554. package/dist/types/runtime/boot-ordering.test.d.ts +0 -1
  555. package/dist/types/runtime/lazy-service.test.d.ts +0 -1
  556. package/dist/types/runtime/network-prewarm-service.test.d.ts +0 -1
  557. package/dist/types/runtime/workspace-tree-service.test.d.ts +0 -1
  558. package/dist/types/runtime-mcp/config.test.d.ts +0 -1
  559. package/dist/types/runtime-mcp/http.test.d.ts +0 -1
  560. package/dist/types/runtime-mcp/manager-pool.test.d.ts +0 -1
  561. package/dist/types/runtime-mcp/pool-key.test.d.ts +0 -1
  562. package/dist/types/runtime-mcp/pool.test.d.ts +0 -1
  563. package/dist/types/sdk/bus/lifecycle-control-runtime.d.ts +0 -117
  564. package/dist/types/sdk/bus/lifecycle-orchestrator.d.ts +0 -141
  565. package/dist/types/sdk/bus/telegram-cli.d.ts +0 -31
  566. package/dist/types/sdk/elevation/allowlist.d.ts +0 -20
  567. package/dist/types/sdk/elevation/audit.d.ts +0 -93
  568. package/dist/types/sdk/elevation/capability.d.ts +0 -3
  569. package/dist/types/sdk/elevation/digest.d.ts +0 -72
  570. package/dist/types/sdk/elevation/dispatch-receipt.d.ts +0 -85
  571. package/dist/types/sdk/elevation/grant-ledger.d.ts +0 -163
  572. package/dist/types/sdk/elevation/owner.d.ts +0 -48
  573. package/dist/types/sdk/host/import-graph.test.d.ts +0 -1
  574. package/dist/types/sdk/host/sdk-surface-parity.test.d.ts +0 -1
  575. package/dist/types/sdk/host/session-runtime.test.d.ts +0 -1
  576. package/dist/types/sdk/host/websocket-transport.lifecycle.test.d.ts +0 -1
  577. package/dist/types/session/auth-broker-config.d.ts +0 -13
  578. package/dist/types/session/heap-eviction-artifacts.test.d.ts +0 -1
  579. package/dist/types/skills/skills.test.d.ts +0 -1
  580. package/dist/types/slash-commands/notify-command.test.d.ts +0 -1
  581. package/dist/types/task/token-log.test.d.ts +0 -1
  582. package/dist/types/tools/computer.enforcement.test.d.ts +0 -1
  583. package/dist/types/tools/descriptors.test.d.ts +0 -1
  584. package/scripts/g005-daemon-smoke.ts +0 -180
  585. package/scripts/g011-daemon-path-smoke.ts +0 -153
  586. package/src/sdk/bus/lifecycle-control-runtime.ts +0 -1733
  587. package/src/sdk/bus/lifecycle-orchestrator.ts +0 -489
  588. package/src/sdk/bus/telegram-cli.ts +0 -212
  589. package/src/sdk/elevation/allowlist.ts +0 -54
  590. package/src/sdk/elevation/audit.ts +0 -208
  591. package/src/sdk/elevation/capability.ts +0 -41
  592. package/src/sdk/elevation/digest.ts +0 -129
  593. package/src/sdk/elevation/dispatch-receipt.ts +0 -184
  594. package/src/sdk/elevation/grant-ledger.ts +0 -1142
  595. package/src/sdk/elevation/owner.ts +0 -109
  596. package/src/session/auth-broker-config.ts +0 -109
  597. /package/dist/types/{ai-core-import-gate.test.d.ts → discovery/claude-hooks.d.ts} +0 -0
  598. /package/dist/types/{cli/fixture-report.test.d.ts → discovery/codex-hooks.d.ts} +0 -0
  599. /package/dist/types/sdk/{bus/recent-activity.d.ts → lifecycle/recent-sessions.d.ts} +0 -0
@@ -212,7 +212,9 @@ async function loadImpl<T>(
212
212
  function filterProviders<T>(capability: Capability<T>, options: LoadOptions): Provider<T>[] {
213
213
  const activeSettings = options.settings ?? settingsByCwd.get(path.normalize(options.cwd ?? getProjectDir()));
214
214
  const activeDisabledProviders = new Set(activeSettings?.get("disabledProviders") ?? disabledProviders);
215
- let providers = (capability.providers as Provider<T>[]).filter(p => !activeDisabledProviders.has(p.id));
215
+ let providers = (capability.providers as Provider<T>[]).filter(
216
+ p => options.includeDisabledProviders === true || !activeDisabledProviders.has(p.id),
217
+ );
216
218
  if (options.providers) {
217
219
  const allowed = new Set(options.providers);
218
220
  providers = providers.filter(p => allowed.has(p.id));
@@ -21,6 +21,12 @@ export interface MCPServer {
21
21
  /** MCP connection pool identity mode; defaults to one lease per session. */
22
22
  sharing?: "per-session" | "shared";
23
23
  timeout?: number;
24
+ /**
25
+ * Protocol preference for remote (http/sse) servers: `auto` (default) negotiates
26
+ * MCP 2026-07-28 (stateless) first with a bounded observable legacy fallback,
27
+ * `2026-07-28` is strict modern-only, `legacy` forces the compatibility handshake.
28
+ */
29
+ protocol?: "auto" | "2026-07-28" | "legacy";
24
30
  /** Command to run (for stdio transport) */
25
31
  command?: string;
26
32
  /** Command arguments */
@@ -71,6 +71,12 @@ export interface LoadOptions {
71
71
  includeInvalid?: boolean;
72
72
  /** Include items disabled via settings. Default: false */
73
73
  includeDisabled?: boolean;
74
+ /**
75
+ * Include providers disabled via settings (for diagnostics). Default: false.
76
+ * Items loaded from a disabled provider are not marked by the registry; callers
77
+ * compare `_source.provider` against the disabled-provider set themselves.
78
+ */
79
+ includeDisabledProviders?: boolean;
74
80
  /** Explicit disabled extension IDs to apply instead of settings. */
75
81
  disabledExtensions?: string[];
76
82
  /** Session settings whose provider policy applies to this load. */
@@ -0,0 +1,395 @@
1
+ /**
2
+ * Handlers for the sole account-management CLI namespace (`gjc accounts`).
3
+ *
4
+ * This surface deliberately consumes AuthStorage's payload-free inventory APIs.
5
+ * Credential payloads are never rendered or copied into settings; persistent pins
6
+ * are written as canonical `id:<row-id>` selectors only.
7
+ */
8
+ import {
9
+ type AuthCredentialSelector,
10
+ type AuthStorage,
11
+ type CredentialInventoryRecord,
12
+ type CredentialRemovalTarget,
13
+ resolveOAuthStorageProvider,
14
+ } from "@gajae-code/ai/core";
15
+ import { getAgentDir } from "@gajae-code/utils";
16
+ import { ModelRegistry } from "../config/model-registry";
17
+ import { type RawSettings, Settings, type SettingsAtomicPatch } from "../config/settings";
18
+ import { discoverAuthStorage } from "../sdk/session";
19
+ import {
20
+ buildAccountInventorySnapshot,
21
+ checkAccountInventory,
22
+ clearPersistentPinForRemovedRows,
23
+ } from "../session/account-inventory";
24
+ import { resolveStartupAuthConfig, type StartupAuthConfigSnapshot } from "../session/startup-auth-config";
25
+
26
+ export const ACCOUNTS_ACTIONS = ["list", "check", "pin", "logout"] as const;
27
+ export type AccountsAction = (typeof ACCOUNTS_ACTIONS)[number];
28
+
29
+ export interface AccountsCommandArgs {
30
+ action: AccountsAction;
31
+ provider?: string;
32
+ selector?: string;
33
+ flags: {
34
+ json?: boolean;
35
+ persistent?: boolean;
36
+ clear?: boolean;
37
+ account?: string;
38
+ all?: boolean;
39
+ };
40
+ }
41
+
42
+ class AccountsCommandError extends Error {
43
+ constructor(message: string) {
44
+ super(message);
45
+ this.name = "AccountsCommandError";
46
+ }
47
+ }
48
+
49
+ function writeJson(value: unknown): void {
50
+ process.stdout.write(`${JSON.stringify(value, null, 2)}\n`);
51
+ }
52
+
53
+ function writeText(lines: readonly string[]): void {
54
+ process.stdout.write(`${lines.join("\n")}\n`);
55
+ }
56
+
57
+ function asRecord(value: unknown): Record<string, unknown> | undefined {
58
+ return value !== null && typeof value === "object" && !Array.isArray(value)
59
+ ? (value as Record<string, unknown>)
60
+ : undefined;
61
+ }
62
+
63
+ function cleanReason(value: unknown): string | undefined {
64
+ if (value === undefined || value === null) return undefined;
65
+ let reason = value instanceof Error ? value.message : String(value);
66
+ reason = reason.replace(/bearer\s+[^\s,;]+/gi, "Bearer [redacted]");
67
+ reason = reason.replace(/(api[_-]?key|token|secret|authorization)[=:]\s*[^\s,;]+/gi, "$1=[redacted]");
68
+ reason = reason.replace(/[\r\n\t ]+/g, " ").trim();
69
+ if (reason.length > 256) reason = `${reason.slice(0, 253)}...`;
70
+ return reason || undefined;
71
+ }
72
+
73
+ function canonicalProvider(provider: string | undefined): string {
74
+ const value = provider?.trim();
75
+ if (!value) throw new AccountsCommandError("A provider is required.");
76
+ if (/[\u0000-\u001f\u007f]/u.test(value))
77
+ throw new AccountsCommandError("Provider contains invalid control characters.");
78
+ return resolveOAuthStorageProvider(value);
79
+ }
80
+
81
+ function selectorFromInput(raw: string | undefined): AuthCredentialSelector {
82
+ const value = raw?.trim() ?? "";
83
+ if (/^id:[1-9]\d*$/.test(value)) return { kind: "id", value: value.slice(3) };
84
+ if (/^email:[^@\s]+@[^@\s]+$/.test(value)) return { kind: "email", value: value.slice(6) };
85
+ if (/^account:\S+$/.test(value)) return { kind: "account", value: value.slice(8) };
86
+ if (/^[^@\s]+@[^@\s]+$/.test(value)) return { kind: "email", value };
87
+ throw new AccountsCommandError(
88
+ "Pin target must be a bare email or an id:<row-id>, email:<email>, or account:<account-id> selector.",
89
+ );
90
+ }
91
+
92
+ function inventoryIdentity(row: CredentialInventoryRecord): string | undefined {
93
+ return typeof row.identityLabel === "string" ? row.identityLabel : undefined;
94
+ }
95
+
96
+ function formatCandidate(row: CredentialInventoryRecord): string {
97
+ const identity = inventoryIdentity(row) ?? "(no identity)";
98
+ return ` id=${row.id} ${identity}${row.disabled ? " [disabled]" : ""}`;
99
+ }
100
+
101
+ async function withAuthStorageAndModels<T>(
102
+ callback: (storage: AuthStorage, modelRegistry: ModelRegistry, startupAuth: StartupAuthConfigSnapshot) => Promise<T>,
103
+ ): Promise<T> {
104
+ const startupAuth = await resolveStartupAuthConfig();
105
+ const storage = await discoverAuthStorage(getAgentDir(), startupAuth);
106
+ const modelRegistry = new ModelRegistry(storage);
107
+ try {
108
+ await modelRegistry.refresh("offline");
109
+ return await callback(storage, modelRegistry, startupAuth);
110
+ } finally {
111
+ storage.close();
112
+ }
113
+ }
114
+
115
+ async function runList(flags: AccountsCommandArgs["flags"]): Promise<void> {
116
+ await withAuthStorageAndModels(async (storage, modelRegistry) => {
117
+ const snapshot = buildAccountInventorySnapshot({ authStorage: storage, modelRegistry });
118
+ const accounts = snapshot.rows;
119
+ if (flags.json) {
120
+ writeJson({ ok: true, generatedAt: snapshot.generatedAt, generation: snapshot.generation, accounts });
121
+ return;
122
+ }
123
+ if (accounts.length === 0) {
124
+ writeText(["No stored accounts or configured API-key sources."]);
125
+ return;
126
+ }
127
+ writeText(
128
+ accounts.map(account => {
129
+ const identity = account.identityLabel ?? "(no identity)";
130
+ const usage = account.usage?.freshness ?? "unknown";
131
+ const health = account.health.status;
132
+ return `${account.provider}\tid=${account.id}\t${account.credentialKind}\t${identity}\t${account.source}\t${
133
+ account.disabled ? "disabled" : "active"
134
+ }\thealth=${health}\tusage=${usage}`;
135
+ }),
136
+ );
137
+ });
138
+ }
139
+
140
+ async function runCheck(providerArg: string | undefined, flags: AccountsCommandArgs["flags"]): Promise<void> {
141
+ const provider = providerArg ? canonicalProvider(providerArg) : undefined;
142
+ await withAuthStorageAndModels(async (storage, modelRegistry) => {
143
+ const snapshot = await checkAccountInventory({
144
+ authStorage: storage,
145
+ modelRegistry,
146
+ provider,
147
+ });
148
+ const checks = snapshot.rows
149
+ .filter(row => provider === undefined || row.provider === provider)
150
+ .map(row => ({
151
+ id: row.id,
152
+ provider: row.provider,
153
+ kind: row.credentialKind,
154
+ source: row.source,
155
+ ...(row.identityLabel ? { identity: row.identityLabel } : {}),
156
+ ok: row.health.status === "ok" ? true : row.health.status === "failed" ? false : null,
157
+ status: row.health.status === "ok" ? "ok" : row.health.status === "failed" ? "failed" : "unknown",
158
+ ...(cleanReason(row.health.reason) ? { reason: cleanReason(row.health.reason) } : {}),
159
+ }));
160
+ if (flags.json) {
161
+ writeJson({ ok: true, ...(provider ? { provider } : {}), checks });
162
+ } else if (checks.length === 0) {
163
+ writeText([provider ? `No account sources for ${provider}.` : "No account sources."]);
164
+ } else {
165
+ writeText(
166
+ checks.map(check => {
167
+ const identity = check.identity ?? "(no identity)";
168
+ const reason = check.reason ? ` — ${check.reason}` : "";
169
+ return `${check.provider}\tid=${check.id}\t${check.kind}\t${check.source}\t${identity}\t${check.status}${reason}`;
170
+ }),
171
+ );
172
+ }
173
+ if (checks.some(check => check.ok === false)) process.exitCode = 1;
174
+ });
175
+ }
176
+
177
+ function assertPersistent(flags: AccountsCommandArgs["flags"]): void {
178
+ if (!flags.persistent) {
179
+ throw new AccountsCommandError("Persistent account pinning requires --persistent.");
180
+ }
181
+ }
182
+
183
+ function pinsFromCurrent(current: Readonly<RawSettings>): Record<string, string> {
184
+ const auth = current.auth;
185
+ if (auth === undefined) return {};
186
+ const authRecord = asRecord(auth);
187
+ if (!authRecord) throw new AccountsCommandError("Global auth configuration is malformed; no pin was written.");
188
+ const rawPins = authRecord.credentialPins;
189
+ if (rawPins === undefined) return {};
190
+ const pins = asRecord(rawPins);
191
+ if (!pins || Object.values(pins).some(value => typeof value !== "string")) {
192
+ throw new AccountsCommandError("Global auth.credentialPins is malformed; no pin was written.");
193
+ }
194
+ return Object.fromEntries(Object.entries(pins).map(([key, value]) => [key, String(value).trim()]));
195
+ }
196
+
197
+ async function writePersistentPin(
198
+ provider: string,
199
+ selector: string | undefined,
200
+ clear: boolean,
201
+ credentialStoreIdentity?: string,
202
+ ): Promise<void> {
203
+ const settings = await Settings.init();
204
+ await settings.commitAtomicBatchWithCurrent(current => {
205
+ const pins = pinsFromCurrent(current);
206
+ const currentAuth = asRecord(current.auth);
207
+ const existingStoreIdentity =
208
+ typeof currentAuth?.credentialPinStoreIdentity === "string"
209
+ ? currentAuth.credentialPinStoreIdentity.trim()
210
+ : undefined;
211
+ if (
212
+ Object.values(pins).some(value => value.startsWith("id:")) &&
213
+ credentialStoreIdentity &&
214
+ existingStoreIdentity !== credentialStoreIdentity
215
+ ) {
216
+ for (const [pinnedProvider, pinnedSelector] of Object.entries(pins)) {
217
+ if (pinnedSelector.startsWith("id:")) delete pins[pinnedProvider];
218
+ }
219
+ }
220
+ if (clear) delete pins[provider];
221
+ else if (selector) pins[provider] = selector;
222
+ const patches: SettingsAtomicPatch[] = [{ path: "auth.credentialPins", op: "set", value: pins }];
223
+ const hasNumericPins = Object.values(pins).some(value => value.startsWith("id:"));
224
+ if (hasNumericPins) {
225
+ if (credentialStoreIdentity && (!existingStoreIdentity || existingStoreIdentity === credentialStoreIdentity)) {
226
+ patches.push({ path: "auth.credentialPinStoreIdentity", op: "set", value: credentialStoreIdentity });
227
+ } else if (!clear) {
228
+ throw new AccountsCommandError(
229
+ "Numeric persistent pins require a credential-store identity; no pin was written.",
230
+ );
231
+ }
232
+ } else {
233
+ patches.push({ path: "auth.credentialPinStoreIdentity", op: "unset" });
234
+ }
235
+ return patches;
236
+ });
237
+ }
238
+
239
+ async function runPin(
240
+ providerArg: string | undefined,
241
+ selectorArg: string | undefined,
242
+ flags: AccountsCommandArgs["flags"],
243
+ ): Promise<void> {
244
+ assertPersistent(flags);
245
+ const provider = canonicalProvider(providerArg);
246
+ if (flags.clear && selectorArg) {
247
+ throw new AccountsCommandError("Use either a pin selector or --clear, not both.");
248
+ }
249
+ if (!flags.clear && !selectorArg) {
250
+ throw new AccountsCommandError("Pin requires a selector, or use --clear to remove the persistent pin.");
251
+ }
252
+ if (flags.clear) {
253
+ await writePersistentPin(provider, undefined, true);
254
+ if (flags.json) writeJson({ ok: true, provider, cleared: true });
255
+ else writeText([`Cleared persistent account pin for ${provider}.`]);
256
+ return;
257
+ }
258
+
259
+ const selector = selectorFromInput(selectorArg);
260
+ await withAuthStorageAndModels(async (storage, modelRegistry, startupAuth) => {
261
+ if (
262
+ !modelRegistry.getConfiguredProviderIds().includes(provider) &&
263
+ modelRegistry.getAll().every(model => model.provider !== provider)
264
+ ) {
265
+ throw new AccountsCommandError(`Provider ${provider} is not configured; no pin was written.`);
266
+ }
267
+ const target = storage.resolveOAuthPinTarget(provider, selector);
268
+ const canonicalSelector = `${target.canonicalSelector.kind}:${target.canonicalSelector.value}`;
269
+ await writePersistentPin(provider, canonicalSelector, false, startupAuth.credentialStoreIdentity);
270
+ if (flags.json) writeJson({ ok: true, provider, selector: canonicalSelector });
271
+ else writeText([`Pinned ${provider} to ${canonicalSelector}.`]);
272
+ });
273
+ }
274
+
275
+ function accountMatches(row: CredentialInventoryRecord, rawAccount: string): boolean {
276
+ const value = rawAccount.trim();
277
+ if (value.length === 0) return false;
278
+ if (/^[1-9]\d*$/.test(value) && row.id === Number(value)) return true;
279
+ const identity = inventoryIdentity(row);
280
+ return identity?.toLowerCase() === value.toLowerCase();
281
+ }
282
+
283
+ function removalCandidates(
284
+ inventory: readonly CredentialInventoryRecord[],
285
+ targets: readonly CredentialRemovalTarget[],
286
+ ): Array<{ row: CredentialInventoryRecord; target: CredentialRemovalTarget }> {
287
+ const targetById = new Map(targets.map(target => [target.id, target]));
288
+ return inventory
289
+ .filter(row => row.credentialKind === "oauth")
290
+ .map(row => ({ row, target: targetById.get(row.id) }))
291
+ .filter((entry): entry is { row: CredentialInventoryRecord; target: CredentialRemovalTarget } => !!entry.target);
292
+ }
293
+
294
+ function throwLogoutResolutionError(
295
+ provider: string,
296
+ account: string | undefined,
297
+ candidates: readonly { row: CredentialInventoryRecord; target: CredentialRemovalTarget }[],
298
+ ): never {
299
+ const lines =
300
+ candidates.length > 0
301
+ ? ["Safe candidates:", ...candidates.map(candidate => formatCandidate(candidate.row))]
302
+ : ["No OAuth account candidates found."];
303
+ const prefix = account
304
+ ? `Account ${JSON.stringify(account)} for ${provider} was missing or ambiguous.`
305
+ : `No removable OAuth accounts found for ${provider}.`;
306
+ throw new AccountsCommandError(`${prefix} No credentials were removed.\n${lines.join("\n")}`);
307
+ }
308
+
309
+ async function runLogout(providerArg: string | undefined, flags: AccountsCommandArgs["flags"]): Promise<void> {
310
+ const provider = canonicalProvider(providerArg);
311
+ if ((flags.all ? 1 : 0) + (flags.account ? 1 : 0) !== 1) {
312
+ throw new AccountsCommandError("Logout requires exactly one of --account <id|email> or --all.");
313
+ }
314
+ const startupAuth = await resolveStartupAuthConfig();
315
+ if (startupAuth.broker) {
316
+ throw new AccountsCommandError(
317
+ "`gjc accounts logout` only mutates local credentials. A broker/gateway is configured; run logout on the broker host with `gjc auth-broker` or unset the broker configuration. No credentials were removed.",
318
+ );
319
+ }
320
+ const storage = await discoverAuthStorage(getAgentDir(), startupAuth);
321
+ try {
322
+ const inventory = storage.listCredentialInventory(provider);
323
+ const targets = removalCandidates(inventory, storage.listCredentialRemovalTargets(provider));
324
+ const selected = flags.all
325
+ ? targets
326
+ : targets.filter(candidate => accountMatches(candidate.row, flags.account ?? ""));
327
+ if (selected.length !== 1 && !flags.all) throwLogoutResolutionError(provider, flags.account, targets);
328
+ if (selected.length === 0) throwLogoutResolutionError(provider, flags.account, targets);
329
+ const result = storage.removeAuthCredentialsHard(
330
+ provider,
331
+ selected.map(candidate => candidate.target),
332
+ );
333
+ if (result.kind !== "removed") {
334
+ throw new AccountsCommandError(
335
+ `Account inventory changed before logout; no credentials were removed. Retry and choose from current candidates (ids: ${result.currentIds.join(", ") || "none"}).`,
336
+ );
337
+ }
338
+ const settings = await Settings.init();
339
+ await clearPersistentPinForRemovedRows(settings, provider, inventory, result.ids);
340
+ if (flags.json) writeJson({ ok: true, provider, removedIds: [...result.ids] });
341
+ else
342
+ writeText([
343
+ `Removed ${result.ids.length} OAuth account${result.ids.length === 1 ? "" : "s"} from ${provider}.`,
344
+ ]);
345
+ } finally {
346
+ storage.close();
347
+ }
348
+ }
349
+
350
+ function writeJsonFailure(error: unknown): void {
351
+ // Machine contract: exactly one JSON document on stdout, never secrets/stacks.
352
+ if (error instanceof AccountsCommandError) {
353
+ writeJson({ ok: false, error: { code: "accounts-error", message: cleanReason(error) ?? "Command failed." } });
354
+ return;
355
+ }
356
+ writeJson({
357
+ ok: false,
358
+ error: { code: "internal-error", message: "Accounts command failed; see stderr for diagnostics." },
359
+ });
360
+ }
361
+
362
+ export async function runAccountsCommand(cmd: AccountsCommandArgs): Promise<void> {
363
+ try {
364
+ switch (cmd.action) {
365
+ case "list":
366
+ await runList(cmd.flags);
367
+ return;
368
+ case "check":
369
+ await runCheck(cmd.provider, cmd.flags);
370
+ return;
371
+ case "pin":
372
+ await runPin(cmd.provider, cmd.selector, cmd.flags);
373
+ return;
374
+ case "logout":
375
+ await runLogout(cmd.provider, cmd.flags);
376
+ return;
377
+ default: {
378
+ const exhaustive: never = cmd.action;
379
+ throw new AccountsCommandError(`Unknown accounts action: ${String(exhaustive)}`);
380
+ }
381
+ }
382
+ } catch (error) {
383
+ if (cmd.flags.json) {
384
+ if (!(error instanceof AccountsCommandError)) {
385
+ process.stderr.write(`accounts command failed: ${cleanReason(error) ?? "Command failed."}\n`);
386
+ }
387
+ process.exitCode = 1;
388
+ writeJsonFailure(error);
389
+ return;
390
+ }
391
+ throw error;
392
+ }
393
+ }
394
+
395
+ export { AccountsCommandError };
package/src/cli/args.ts CHANGED
@@ -47,11 +47,14 @@ export interface Args {
47
47
  default?: boolean;
48
48
  apiKey?: string;
49
49
  credential?: string;
50
+ preferCredential?: string;
50
51
  systemPrompt?: string;
51
52
  appendSystemPrompt?: string;
52
53
  clipboardTransport?: "auto" | "native" | "osc52" | "ssh";
53
54
  clipboardSshHost?: string;
54
55
  mcpConfig?: string;
56
+ /** Opt a standalone session out of conventional MCP autoload (mutually exclusive with --mcp-config). */
57
+ noMcp?: boolean;
55
58
  thinking?: Effort;
56
59
  continue?: boolean;
57
60
  resume?: string | true;
@@ -223,6 +226,12 @@ export function parseArgs(args: string[], authority: ParseArgsAuthority = "local
223
226
  throw new CliParseError("--credential requires <selector>");
224
227
  }
225
228
  result.credential = args[++i];
229
+ } else if (arg === "--prefer-credential") {
230
+ const next = args[i + 1];
231
+ if (!next || next.startsWith("-")) {
232
+ throw new CliParseError("--prefer-credential requires <selector>");
233
+ }
234
+ result.preferCredential = args[++i];
226
235
  } else if (arg === "--system-prompt") {
227
236
  result.systemPrompt = takePromptValue(args, i++, "--system-prompt", hasInlineValue);
228
237
  } else if (arg === "--append-system-prompt") {
@@ -253,11 +262,19 @@ export function parseArgs(args: string[], authority: ParseArgsAuthority = "local
253
262
  if (result.mcpConfig !== undefined) {
254
263
  throw new CliParseError("--mcp-config can only be specified once");
255
264
  }
265
+ if (result.noMcp === true) {
266
+ throw new CliParseError("--no-mcp and --mcp-config are mutually exclusive");
267
+ }
256
268
  const next = args[i + 1];
257
269
  if (!next || next.startsWith("-") || !path.isAbsolute(next)) {
258
270
  throw new CliParseError("--mcp-config requires <absolute-path>");
259
271
  }
260
272
  result.mcpConfig = args[++i];
273
+ } else if (arg === "--no-mcp") {
274
+ result.noMcp = true;
275
+ if (result.mcpConfig !== undefined) {
276
+ throw new CliParseError("--no-mcp and --mcp-config are mutually exclusive");
277
+ }
261
278
  } else if (arg === "--provider-session-id") {
262
279
  result.providerSessionId = takeFlagValue(args, i++, "--provider-session-id");
263
280
  } else if (arg === "--no-session") {
@@ -357,6 +374,12 @@ export function parseArgs(args: string[], authority: ParseArgsAuthority = "local
357
374
  if (result.default && !result.mpreset) {
358
375
  throw new CliParseError("--default requires --mpreset <name>");
359
376
  }
377
+ if (result.credential && result.preferCredential) {
378
+ throw new CliParseError("--credential and --prefer-credential cannot be used together");
379
+ }
380
+ if (result.apiKey && result.preferCredential) {
381
+ throw new CliParseError("--api-key and --prefer-credential cannot be used together");
382
+ }
360
383
  if (result.mcpConfig !== undefined && (result.listModels !== undefined || result.export !== undefined)) {
361
384
  throw new CliParseError(
362
385
  "--mcp-config is only supported in standalone interactive, tmux, print, text, or json modes.",