@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
@@ -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.",