@kaitranntt/ccs 7.54.0 → 7.55.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 (215) hide show
  1. package/README.md +26 -4
  2. package/config/base-codex.settings.json +4 -4
  3. package/dist/ccs.js +70 -370
  4. package/dist/ccs.js.map +1 -1
  5. package/dist/cliproxy/codex-plan-compatibility.d.ts +10 -0
  6. package/dist/cliproxy/codex-plan-compatibility.d.ts.map +1 -0
  7. package/dist/cliproxy/codex-plan-compatibility.js +69 -0
  8. package/dist/cliproxy/codex-plan-compatibility.js.map +1 -0
  9. package/dist/cliproxy/executor/index.d.ts.map +1 -1
  10. package/dist/cliproxy/executor/index.js +8 -0
  11. package/dist/cliproxy/executor/index.js.map +1 -1
  12. package/dist/cliproxy/index.d.ts +1 -0
  13. package/dist/cliproxy/index.d.ts.map +1 -1
  14. package/dist/cliproxy/index.js +6 -2
  15. package/dist/cliproxy/index.js.map +1 -1
  16. package/dist/cliproxy/model-catalog.d.ts.map +1 -1
  17. package/dist/cliproxy/model-catalog.js +81 -12
  18. package/dist/cliproxy/model-catalog.js.map +1 -1
  19. package/dist/cliproxy/model-config.d.ts.map +1 -1
  20. package/dist/cliproxy/model-config.js +2 -2
  21. package/dist/cliproxy/model-config.js.map +1 -1
  22. package/dist/cliproxy/services/variant-settings.d.ts +3 -1
  23. package/dist/cliproxy/services/variant-settings.d.ts.map +1 -1
  24. package/dist/cliproxy/services/variant-settings.js +5 -2
  25. package/dist/cliproxy/services/variant-settings.js.map +1 -1
  26. package/dist/commands/api-command/copy-command.d.ts +2 -0
  27. package/dist/commands/api-command/copy-command.d.ts.map +1 -0
  28. package/dist/commands/api-command/copy-command.js +41 -0
  29. package/dist/commands/api-command/copy-command.js.map +1 -0
  30. package/dist/commands/api-command/create-command.d.ts +2 -0
  31. package/dist/commands/api-command/create-command.d.ts.map +1 -0
  32. package/dist/commands/api-command/create-command.js +249 -0
  33. package/dist/commands/api-command/create-command.js.map +1 -0
  34. package/dist/commands/api-command/discover-command.d.ts +2 -0
  35. package/dist/commands/api-command/discover-command.d.ts.map +1 -0
  36. package/dist/commands/api-command/discover-command.js +69 -0
  37. package/dist/commands/api-command/discover-command.js.map +1 -0
  38. package/dist/commands/api-command/export-command.d.ts +2 -0
  39. package/dist/commands/api-command/export-command.d.ts.map +1 -0
  40. package/dist/commands/api-command/export-command.js +73 -0
  41. package/dist/commands/api-command/export-command.js.map +1 -0
  42. package/dist/commands/api-command/help.d.ts +3 -0
  43. package/dist/commands/api-command/help.d.ts.map +1 -0
  44. package/dist/commands/api-command/help.js +100 -0
  45. package/dist/commands/api-command/help.js.map +1 -0
  46. package/dist/commands/api-command/import-command.d.ts +2 -0
  47. package/dist/commands/api-command/import-command.d.ts.map +1 -0
  48. package/dist/commands/api-command/import-command.js +111 -0
  49. package/dist/commands/api-command/import-command.js.map +1 -0
  50. package/dist/commands/api-command/index.d.ts +3 -0
  51. package/dist/commands/api-command/index.d.ts.map +1 -0
  52. package/dist/commands/api-command/index.js +34 -0
  53. package/dist/commands/api-command/index.js.map +1 -0
  54. package/dist/commands/api-command/list-command.d.ts +2 -0
  55. package/dist/commands/api-command/list-command.d.ts.map +1 -0
  56. package/dist/commands/api-command/list-command.js +53 -0
  57. package/dist/commands/api-command/list-command.js.map +1 -0
  58. package/dist/commands/api-command/remove-command.d.ts +2 -0
  59. package/dist/commands/api-command/remove-command.d.ts.map +1 -0
  60. package/dist/commands/api-command/remove-command.js +63 -0
  61. package/dist/commands/api-command/remove-command.js.map +1 -0
  62. package/dist/commands/api-command/shared.d.ts +36 -0
  63. package/dist/commands/api-command/shared.d.ts.map +1 -0
  64. package/dist/commands/api-command/shared.js +164 -0
  65. package/dist/commands/api-command/shared.js.map +1 -0
  66. package/dist/commands/api-command.d.ts +1 -26
  67. package/dist/commands/api-command.d.ts.map +1 -1
  68. package/dist/commands/api-command.js +3 -807
  69. package/dist/commands/api-command.js.map +1 -1
  70. package/dist/commands/arg-extractor.d.ts +15 -0
  71. package/dist/commands/arg-extractor.d.ts.map +1 -1
  72. package/dist/commands/arg-extractor.js +48 -2
  73. package/dist/commands/arg-extractor.js.map +1 -1
  74. package/dist/commands/config-auth/index.d.ts.map +1 -1
  75. package/dist/commands/config-auth/index.js +35 -19
  76. package/dist/commands/config-auth/index.js.map +1 -1
  77. package/dist/commands/config-command-options.d.ts +14 -0
  78. package/dist/commands/config-command-options.d.ts.map +1 -0
  79. package/dist/commands/config-command-options.js +108 -0
  80. package/dist/commands/config-command-options.js.map +1 -0
  81. package/dist/commands/config-command.d.ts +1 -1
  82. package/dist/commands/config-command.d.ts.map +1 -1
  83. package/dist/commands/config-command.js +91 -104
  84. package/dist/commands/config-command.js.map +1 -1
  85. package/dist/commands/config-dashboard-host.d.ts +17 -0
  86. package/dist/commands/config-dashboard-host.d.ts.map +1 -0
  87. package/dist/commands/config-dashboard-host.js +99 -0
  88. package/dist/commands/config-dashboard-host.js.map +1 -0
  89. package/dist/commands/env-command.d.ts.map +1 -1
  90. package/dist/commands/env-command.js +5 -0
  91. package/dist/commands/env-command.js.map +1 -1
  92. package/dist/commands/help-command.js +1 -1
  93. package/dist/commands/help-command.js.map +1 -1
  94. package/dist/commands/named-command-router.d.ts +17 -0
  95. package/dist/commands/named-command-router.d.ts.map +1 -0
  96. package/dist/commands/named-command-router.js +39 -0
  97. package/dist/commands/named-command-router.js.map +1 -0
  98. package/dist/commands/persist-command.js +1 -1
  99. package/dist/commands/persist-command.js.map +1 -1
  100. package/dist/commands/root-command-router.d.ts +2 -0
  101. package/dist/commands/root-command-router.d.ts.map +1 -0
  102. package/dist/commands/root-command-router.js +209 -0
  103. package/dist/commands/root-command-router.js.map +1 -0
  104. package/dist/config/unified-config-loader.js +1 -1
  105. package/dist/config/unified-config-loader.js.map +1 -1
  106. package/dist/cursor/cursor-anthropic-response.d.ts +6 -0
  107. package/dist/cursor/cursor-anthropic-response.d.ts.map +1 -0
  108. package/dist/cursor/cursor-anthropic-response.js +190 -0
  109. package/dist/cursor/cursor-anthropic-response.js.map +1 -0
  110. package/dist/cursor/cursor-anthropic-translator.d.ts +11 -0
  111. package/dist/cursor/cursor-anthropic-translator.d.ts.map +1 -0
  112. package/dist/cursor/cursor-anthropic-translator.js +167 -0
  113. package/dist/cursor/cursor-anthropic-translator.js.map +1 -0
  114. package/dist/cursor/cursor-anthropic-types.d.ts +46 -0
  115. package/dist/cursor/cursor-anthropic-types.d.ts.map +1 -0
  116. package/dist/cursor/cursor-anthropic-types.js +3 -0
  117. package/dist/cursor/cursor-anthropic-types.js.map +1 -0
  118. package/dist/cursor/cursor-daemon-entry.d.ts.map +1 -1
  119. package/dist/cursor/cursor-daemon-entry.js +53 -24
  120. package/dist/cursor/cursor-daemon-entry.js.map +1 -1
  121. package/dist/cursor/cursor-models.d.ts.map +1 -1
  122. package/dist/cursor/cursor-models.js +36 -2
  123. package/dist/cursor/cursor-models.js.map +1 -1
  124. package/dist/glmt/glmt-proxy.d.ts +4 -3
  125. package/dist/glmt/glmt-proxy.d.ts.map +1 -1
  126. package/dist/glmt/glmt-proxy.js +4 -3
  127. package/dist/glmt/glmt-proxy.js.map +1 -1
  128. package/dist/glmt/sse-parser.d.ts +2 -0
  129. package/dist/glmt/sse-parser.d.ts.map +1 -1
  130. package/dist/glmt/sse-parser.js +4 -0
  131. package/dist/glmt/sse-parser.js.map +1 -1
  132. package/dist/management/instance-manager.d.ts.map +1 -1
  133. package/dist/management/instance-manager.js +1 -0
  134. package/dist/management/instance-manager.js.map +1 -1
  135. package/dist/management/recovery-manager.d.ts +2 -2
  136. package/dist/management/recovery-manager.js +2 -2
  137. package/dist/management/shared-manager.d.ts +18 -1
  138. package/dist/management/shared-manager.d.ts.map +1 -1
  139. package/dist/management/shared-manager.js +82 -14
  140. package/dist/management/shared-manager.js.map +1 -1
  141. package/dist/shared/claude-extension-setup.d.ts.map +1 -1
  142. package/dist/shared/claude-extension-setup.js +16 -2
  143. package/dist/shared/claude-extension-setup.js.map +1 -1
  144. package/dist/shared/provider-preset-catalog.d.ts +1 -1
  145. package/dist/shared/provider-preset-catalog.d.ts.map +1 -1
  146. package/dist/shared/provider-preset-catalog.js +34 -40
  147. package/dist/shared/provider-preset-catalog.js.map +1 -1
  148. package/dist/ui/assets/{accounts-CZEg1_PX.js → accounts-CjGyCl_8.js} +1 -1
  149. package/dist/ui/assets/{alert-dialog-DhwS38kc.js → alert-dialog-cy99V8EM.js} +1 -1
  150. package/dist/ui/assets/{api-sWNND4wP.js → api-DKrhDjiy.js} +1 -1
  151. package/dist/ui/assets/{auth-section-nJIpOcnm.js → auth-section-DsDyGmzl.js} +1 -1
  152. package/dist/ui/assets/{backups-section-D3A6hmrU.js → backups-section-B63xrUmB.js} +1 -1
  153. package/dist/ui/assets/checkbox-AxZFvatO.js +1 -0
  154. package/dist/ui/assets/{claude-extension-BjInaILv.js → claude-extension-N0lxo7BY.js} +1 -1
  155. package/dist/ui/assets/cliproxy-D2ozaUJ3.js +3 -0
  156. package/dist/ui/assets/{cliproxy-control-panel-CKO2Sn9B.js → cliproxy-control-panel-5fYLcZKs.js} +1 -1
  157. package/dist/ui/assets/{confirm-dialog-DTKxwrat.js → confirm-dialog-D2bDFGvT.js} +1 -1
  158. package/dist/ui/assets/copilot-INm6uOZF.js +3 -0
  159. package/dist/ui/assets/cursor-C8rDHKEp.js +1 -0
  160. package/dist/ui/assets/{droid-Cl8QsJJL.js → droid-OZDvbiwC.js} +2 -2
  161. package/dist/ui/assets/{globalenv-section-C3dxxoD9.js → globalenv-section-ClTBgKg5.js} +1 -1
  162. package/dist/ui/assets/{health-BUifaDU7.js → health-CGaRANip.js} +1 -1
  163. package/dist/ui/assets/icons-DtwH984l.js +1 -0
  164. package/dist/ui/assets/{index-CPdceT1C.js → index-CCSdUs7x.js} +1 -1
  165. package/dist/ui/assets/{index-BOsbrhaa.js → index-CGOZU3jq.js} +1 -1
  166. package/dist/ui/assets/index-ClEn7Y7g.css +1 -0
  167. package/dist/ui/assets/{index-xayyyR26.js → index-DQ4jn6yA.js} +1 -1
  168. package/dist/ui/assets/{index-CYo-E5rU.js → index-DS1QEaxk.js} +1 -1
  169. package/dist/ui/assets/index-tMnuUCFi.js +47 -0
  170. package/dist/ui/assets/providers/llama-cpp.svg +5 -0
  171. package/dist/ui/assets/{proxy-status-widget-D94htBPb.js → proxy-status-widget-PESjh9-t.js} +1 -1
  172. package/dist/ui/assets/{radix-ui-BR1vy4kf.js → radix-ui-Dt3edmE5.js} +8 -8
  173. package/dist/ui/assets/searchable-select-D6dcPTiL.js +1 -0
  174. package/dist/ui/assets/{separator-3fBbTn-V.js → separator-Czy9IRpl.js} +1 -1
  175. package/dist/ui/assets/{shared-q_FNNbjD.js → shared-BUJNJgAr.js} +1 -1
  176. package/dist/ui/assets/{switch-5N8qBdBr.js → switch-Bog43RUy.js} +1 -1
  177. package/dist/ui/assets/{tanstack-e99Cjjy2.js → tanstack-B8i0evp-.js} +1 -1
  178. package/dist/ui/assets/{updates-CubQ54J0.js → updates-jcWPnn9L.js} +1 -1
  179. package/dist/ui/icons/novita.svg +9 -0
  180. package/dist/ui/index.html +5 -5
  181. package/dist/utils/config-manager.d.ts +1 -1
  182. package/dist/utils/config-manager.js +1 -1
  183. package/dist/utils/fetch-proxy-setup.d.ts.map +1 -1
  184. package/dist/utils/fetch-proxy-setup.js.map +1 -1
  185. package/dist/utils/glmt-deprecation.d.ts +11 -0
  186. package/dist/utils/glmt-deprecation.d.ts.map +1 -0
  187. package/dist/utils/glmt-deprecation.js +64 -0
  188. package/dist/utils/glmt-deprecation.js.map +1 -0
  189. package/dist/utils/shell-executor.d.ts.map +1 -1
  190. package/dist/utils/shell-executor.js +12 -0
  191. package/dist/utils/shell-executor.js.map +1 -1
  192. package/dist/web-server/index.d.ts +1 -0
  193. package/dist/web-server/index.d.ts.map +1 -1
  194. package/dist/web-server/index.js +39 -3
  195. package/dist/web-server/index.js.map +1 -1
  196. package/dist/web-server/routes/profile-routes.d.ts +1 -0
  197. package/dist/web-server/routes/profile-routes.d.ts.map +1 -1
  198. package/dist/web-server/routes/profile-routes.js +3 -0
  199. package/dist/web-server/routes/profile-routes.js.map +1 -1
  200. package/dist/web-server/routes/variant-routes.d.ts +1 -0
  201. package/dist/web-server/routes/variant-routes.d.ts.map +1 -1
  202. package/dist/web-server/routes/variant-routes.js +3 -0
  203. package/dist/web-server/routes/variant-routes.js.map +1 -1
  204. package/package.json +3 -2
  205. package/scripts/completion/README.md +1 -1
  206. package/scripts/completion/ccs.fish +1 -2
  207. package/scripts/completion/ccs.zsh +1 -2
  208. package/scripts/postinstall.js +3 -3
  209. package/dist/ui/assets/checkbox-CZrxD1iS.js +0 -1
  210. package/dist/ui/assets/cliproxy-BGiSCGkl.js +0 -3
  211. package/dist/ui/assets/copilot-CuRngdBg.js +0 -3
  212. package/dist/ui/assets/cursor-Dxo0uIiU.js +0 -1
  213. package/dist/ui/assets/icons-DrEfTmfX.js +0 -1
  214. package/dist/ui/assets/index-Btf_ow2V.css +0 -1
  215. package/dist/ui/assets/index-Cw9Urr0S.js +0 -47
package/README.md CHANGED
@@ -11,7 +11,7 @@ Run Claude, Gemini, GLM, and any Anthropic-compatible API - concurrently, withou
11
11
  [![npm](https://img.shields.io/npm/v/@kaitranntt/ccs?style=for-the-badge&logo=npm)](https://www.npmjs.com/package/@kaitranntt/ccs)
12
12
  [![PoweredBy](https://img.shields.io/badge/PoweredBy-ClaudeKit-C15F3C?style=for-the-badge)](https://claudekit.cc?ref=HMNKXOHN)
13
13
 
14
- **[Features & Pricing](https://ccs.kaitran.ca)** | **[Documentation](https://docs.ccs.kaitran.ca)**
14
+ **[Features & Pricing](https://ccs.kaitran.ca)** | **[Documentation Hub](https://docs.ccs.kaitran.ca)**
15
15
 
16
16
  </div>
17
17
 
@@ -29,6 +29,9 @@ Run Claude, Gemini, GLM, and any Anthropic-compatible API - concurrently, withou
29
29
 
30
30
  ## Quick Start
31
31
 
32
+ Looking for the full setup guide, command reference, provider guides, or troubleshooting?
33
+ Start at **https://docs.ccs.kaitran.ca**.
34
+
32
35
  ### 1. Install
33
36
 
34
37
  ```bash
@@ -50,9 +53,23 @@ bun add -g @kaitranntt/ccs # bun (30x faster)
50
53
 
51
54
  ```bash
52
55
  ccs config
53
- # Opens http://localhost:3000
56
+ # Opens a local browser URL
54
57
  ```
55
58
 
59
+ CCS uses the runtime's system-default bind. If that bind is reachable beyond loopback,
60
+ the CLI also prints bind/network details plus an auth reminder.
61
+
62
+ Force all-interface binding for remote devices:
63
+
64
+ ```bash
65
+ ccs config --host 0.0.0.0
66
+ # Terminal prints the reachable URLs to open from the other device
67
+ ```
68
+
69
+ If you expose the dashboard beyond localhost, protect it first with `ccs config auth setup`.
70
+
71
+ Use `ccs config --host 127.0.0.1` to force local-only binding.
72
+
56
73
  Dashboard updates hub: `http://localhost:3000/updates`
57
74
 
58
75
  Want to run the dashboard in Docker or pull the prebuilt image? See `docker/README.md`.
@@ -110,6 +127,7 @@ The dashboard provides visual management for all account types:
110
127
  | **Azure Foundry** | API Key | `ccs foundry` | Claude via Microsoft Azure |
111
128
  | **Minimax** | API Key | `ccs mm` | M2 series, 1M context |
112
129
  | **DeepSeek** | API Key | `ccs deepseek` | V3.2 and R1 reasoning |
130
+ | **Novita AI** | API Key | `ccs api create --preset novita` | Anthropic-compatible Novita endpoint for Claude Code |
113
131
  | **Qwen (OAuth)** | OAuth | `ccs qwen` | Qwen Code via CLIProxy |
114
132
  | **Qwen API** | API Key | `ccs api create --preset qwen` | DashScope Anthropic-compatible API |
115
133
  | **Alibaba Coding Plan** | API Key | `ccs api create --preset alibaba-coding-plan` | Model Studio Coding Plan endpoint |
@@ -593,10 +611,14 @@ Notes:
593
611
 
594
612
  <br>
595
613
 
596
- ## Documentation
614
+ ## Documentation Hub
615
+
616
+ If you are not sure where to start, open **https://docs.ccs.kaitran.ca** first.
617
+ The hosted docs are the best entry point for setup, command reference, provider guides, and troubleshooting.
597
618
 
598
619
  | Topic | Link |
599
620
  |-------|------|
621
+ | Docs Home | [docs.ccs.kaitran.ca](https://docs.ccs.kaitran.ca) |
600
622
  | Installation | [docs.ccs.kaitran.ca/getting-started/installation](https://docs.ccs.kaitran.ca/getting-started/installation) |
601
623
  | Configuration | [docs.ccs.kaitran.ca/getting-started/configuration](https://docs.ccs.kaitran.ca/getting-started/configuration) |
602
624
  | OAuth Providers | [docs.ccs.kaitran.ca/providers/oauth-providers](https://docs.ccs.kaitran.ca/providers/oauth-providers) |
@@ -658,6 +680,6 @@ MIT License - see [LICENSE](LICENSE).
658
680
 
659
681
  ---
660
682
 
661
- **[ccs.kaitran.ca](https://ccs.kaitran.ca)** | [Report Issues](https://github.com/kaitranntt/ccs/issues) | [Star on GitHub](https://github.com/kaitranntt/ccs)
683
+ **[ccs.kaitran.ca](https://ccs.kaitran.ca)** | **[docs.ccs.kaitran.ca](https://docs.ccs.kaitran.ca)** | [Report Issues](https://github.com/kaitranntt/ccs/issues) | [Star on GitHub](https://github.com/kaitranntt/ccs)
662
684
 
663
685
  </div>
@@ -2,9 +2,9 @@
2
2
  "env": {
3
3
  "ANTHROPIC_BASE_URL": "http://127.0.0.1:8317/api/provider/codex",
4
4
  "ANTHROPIC_AUTH_TOKEN": "ccs-internal-managed",
5
- "ANTHROPIC_MODEL": "gpt-5.3-codex",
6
- "ANTHROPIC_DEFAULT_OPUS_MODEL": "gpt-5.3-codex",
7
- "ANTHROPIC_DEFAULT_SONNET_MODEL": "gpt-5.3-codex",
8
- "ANTHROPIC_DEFAULT_HAIKU_MODEL": "gpt-5.1-codex-mini"
5
+ "ANTHROPIC_MODEL": "gpt-5-codex",
6
+ "ANTHROPIC_DEFAULT_OPUS_MODEL": "gpt-5-codex",
7
+ "ANTHROPIC_DEFAULT_SONNET_MODEL": "gpt-5-codex",
8
+ "ANTHROPIC_DEFAULT_HAIKU_MODEL": "gpt-5-codex-mini"
9
9
  }
10
10
  }
package/dist/ccs.js CHANGED
@@ -25,8 +25,6 @@ var __importStar = (this && this.__importStar) || function (mod) {
25
25
  };
26
26
  Object.defineProperty(exports, "__esModule", { value: true });
27
27
  require("./utils/fetch-proxy-setup");
28
- const child_process_1 = require("child_process");
29
- const path = __importStar(require("path"));
30
28
  const fs = __importStar(require("fs"));
31
29
  const claude_detector_1 = require("./utils/claude-detector");
32
30
  const config_manager_1 = require("./utils/config-manager");
@@ -44,17 +42,10 @@ const ui_1 = require("./utils/ui");
44
42
  const constants_1 = require("./copilot/constants");
45
43
  // Import centralized error handling
46
44
  const errors_1 = require("./errors");
47
- // Import extracted command handlers
48
- const version_command_1 = require("./commands/version-command");
49
- const help_command_1 = require("./commands/help-command");
50
- const install_command_1 = require("./commands/install-command");
51
- const doctor_command_1 = require("./commands/doctor-command");
52
- const sync_command_1 = require("./commands/sync-command");
53
- const shell_completion_command_1 = require("./commands/shell-completion-command");
54
- const update_command_1 = require("./commands/update-command");
45
+ const root_command_router_1 = require("./commands/root-command-router");
55
46
  // Import extracted utility functions
56
47
  const shell_executor_1 = require("./utils/shell-executor");
57
- const signal_forwarder_1 = require("./utils/signal-forwarder");
48
+ const glmt_deprecation_1 = require("./utils/glmt-deprecation");
58
49
  // Import target adapter system
59
50
  const targets_1 = require("./targets");
60
51
  const target_resolver_1 = require("./targets/target-resolver");
@@ -76,177 +67,6 @@ function detectProfile(args) {
76
67
  return { profile: args[0], remainingArgs: args.slice(1) };
77
68
  }
78
69
  }
79
- // ========== GLMT Proxy Execution ==========
80
- /**
81
- * Execute Claude CLI with embedded proxy (for GLMT profile)
82
- */
83
- async function execClaudeWithProxy(claudeCli, profileName, args, claudeConfigDir) {
84
- // 1. Read settings to get API key
85
- const settingsPath = (0, config_manager_1.getSettingsPath)(profileName);
86
- const settings = JSON.parse(fs.readFileSync(settingsPath, 'utf8'));
87
- const envData = settings.env;
88
- const apiKey = envData['ANTHROPIC_AUTH_TOKEN'];
89
- if (!apiKey || apiKey === 'YOUR_GLM_API_KEY_HERE') {
90
- console.error((0, ui_1.fail)('GLMT profile requires Z.AI API key'));
91
- console.error(` Edit ${(0, config_manager_1.getCcsDir)()}/glmt.settings.json and set ANTHROPIC_AUTH_TOKEN`);
92
- process.exit(1);
93
- }
94
- // Detect verbose flag
95
- const verbose = args.includes('--verbose') || args.includes('-v');
96
- // 2. Spawn embedded proxy with verbose flag
97
- const proxyPath = path.join(__dirname, 'glmt', 'glmt-proxy.js');
98
- const proxyArgs = verbose ? ['--verbose'] : [];
99
- // Use process.execPath for Windows compatibility (CVE-2024-27980)
100
- // Pass environment variables to proxy subprocess (required for auth)
101
- const proxy = (0, child_process_1.spawn)(process.execPath, [proxyPath, ...proxyArgs], {
102
- stdio: ['ignore', 'pipe', verbose ? 'pipe' : 'inherit'],
103
- env: {
104
- ...process.env,
105
- ANTHROPIC_AUTH_TOKEN: apiKey,
106
- ANTHROPIC_BASE_URL: envData['ANTHROPIC_BASE_URL'],
107
- },
108
- });
109
- const stopProxy = () => {
110
- try {
111
- if (!proxy.killed) {
112
- proxy.kill('SIGTERM');
113
- }
114
- }
115
- catch {
116
- // Best-effort cleanup on process teardown.
117
- }
118
- };
119
- // 3. Wait for proxy ready signal (with timeout)
120
- const { ProgressIndicator } = await Promise.resolve().then(() => __importStar(require('./utils/progress-indicator')));
121
- const spinner = new ProgressIndicator('Starting GLMT proxy');
122
- spinner.start();
123
- let port;
124
- try {
125
- port = await new Promise((resolve, reject) => {
126
- const timeout = setTimeout(() => {
127
- reject(new Error('Proxy startup timeout (5s)'));
128
- }, 5000);
129
- proxy.stdout?.on('data', (data) => {
130
- const match = data.toString().match(/PROXY_READY:(\d+)/);
131
- if (match) {
132
- clearTimeout(timeout);
133
- resolve(parseInt(match[1]));
134
- }
135
- });
136
- proxy.on('error', (error) => {
137
- clearTimeout(timeout);
138
- reject(error);
139
- });
140
- proxy.on('exit', (code) => {
141
- if (code !== 0 && code !== null) {
142
- clearTimeout(timeout);
143
- reject(new Error(`Proxy exited with code ${code}`));
144
- }
145
- });
146
- });
147
- spinner.succeed(`GLMT proxy ready on port ${port}`);
148
- }
149
- catch (error) {
150
- const err = error;
151
- spinner.fail('Failed to start GLMT proxy');
152
- console.error((0, ui_1.fail)(`Error: ${err.message}`));
153
- console.error('');
154
- console.error('Possible causes:');
155
- console.error(' 1. Port conflict (unlikely with random port)');
156
- console.error(' 2. Node.js permission issue');
157
- console.error(' 3. Firewall blocking localhost');
158
- console.error('');
159
- console.error('Workarounds:');
160
- console.error(' - Use non-thinking mode: ccs glm "prompt"');
161
- console.error(' - Enable verbose logging: ccs glmt --verbose "prompt"');
162
- console.error(` - Check proxy logs in ${(0, config_manager_1.getCcsDir)()}/logs/ (if debug enabled)`);
163
- console.error('');
164
- stopProxy();
165
- (0, errors_1.runCleanup)();
166
- process.exit(1);
167
- }
168
- // 4. Spawn Claude CLI with proxy URL
169
- // Use model from user's settings (not hardcoded) - fixes issue #358
170
- const configuredModel = envData['ANTHROPIC_MODEL'] || 'glm-5';
171
- const envVars = {
172
- ANTHROPIC_BASE_URL: `http://127.0.0.1:${port}`,
173
- ANTHROPIC_AUTH_TOKEN: apiKey,
174
- ANTHROPIC_MODEL: configuredModel,
175
- ...(claudeConfigDir ? { CLAUDE_CONFIG_DIR: claudeConfigDir } : {}),
176
- };
177
- const isWindows = process.platform === 'win32';
178
- const isPowerShellScript = isWindows && /\.ps1$/i.test(claudeCli);
179
- const needsShell = isWindows && /\.(cmd|bat)$/i.test(claudeCli);
180
- const webSearchEnv = (0, websearch_manager_1.getWebSearchHookEnv)();
181
- const imageAnalysisEnv = (0, hooks_1.getImageAnalysisHookEnv)(profileName);
182
- const claudeLaunchEnv = (0, shell_executor_1.getClaudeLaunchEnvOverrides)();
183
- const env = (0, shell_executor_1.stripClaudeCodeEnv)({
184
- ...process.env,
185
- ...claudeLaunchEnv,
186
- ...envVars,
187
- ...webSearchEnv,
188
- ...imageAnalysisEnv,
189
- CCS_PROFILE_TYPE: 'settings', // Signal to WebSearch hook this is a third-party provider
190
- });
191
- let claude;
192
- if (isPowerShellScript) {
193
- claude = (0, child_process_1.spawn)('powershell.exe', ['-NoProfile', '-ExecutionPolicy', 'Bypass', '-File', claudeCli, ...args], {
194
- stdio: 'inherit',
195
- windowsHide: true,
196
- env,
197
- });
198
- }
199
- else if (needsShell) {
200
- const cmdString = [claudeCli, ...args].map(shell_executor_1.escapeShellArg).join(' ');
201
- claude = (0, child_process_1.spawn)(cmdString, {
202
- stdio: 'inherit',
203
- windowsHide: true,
204
- shell: true,
205
- env,
206
- });
207
- }
208
- else {
209
- claude = (0, child_process_1.spawn)(claudeCli, args, {
210
- stdio: 'inherit',
211
- windowsHide: true,
212
- env,
213
- });
214
- }
215
- // 5. Shared signal forwarding + proxy cleanup lifecycle
216
- (0, signal_forwarder_1.wireChildProcessSignals)(claude, (err) => {
217
- if (err.code === 'EACCES') {
218
- console.error((0, ui_1.fail)(`Claude CLI is not executable: ${claudeCli}`));
219
- console.error(' Check file permissions and executable bit.');
220
- }
221
- else if (err.code === 'ENOENT') {
222
- if (isPowerShellScript) {
223
- console.error((0, ui_1.fail)('PowerShell executable not found (required for .ps1 wrapper launch).'));
224
- console.error(' Ensure powershell.exe is available in PATH.');
225
- }
226
- else if (needsShell) {
227
- console.error((0, ui_1.fail)('Windows command shell not found for Claude wrapper launch.'));
228
- console.error(' Ensure cmd.exe is available and accessible.');
229
- }
230
- else {
231
- console.error((0, ui_1.fail)(`Claude CLI not found: ${claudeCli}`));
232
- }
233
- }
234
- else {
235
- console.error((0, ui_1.fail)(`Claude CLI error: ${err.message}`));
236
- }
237
- stopProxy();
238
- (0, errors_1.runCleanup)();
239
- process.exit(1);
240
- }, (code, signal) => {
241
- stopProxy();
242
- if (signal) {
243
- process.kill(process.pid, signal);
244
- }
245
- else {
246
- process.exit(code || 0);
247
- }
248
- });
249
- }
250
70
  /**
251
71
  * Perform background update check (refreshes cache, no notification)
252
72
  */
@@ -391,110 +211,7 @@ async function main() {
391
211
  // Recovery is best-effort - don't block basic CLI functionality
392
212
  console.warn('[!] Recovery failed:', err.message);
393
213
  }
394
- // Special case: migrate command
395
- if (firstArg === 'migrate' || firstArg === '--migrate') {
396
- const { handleMigrateCommand, printMigrateHelp } = await Promise.resolve().then(() => __importStar(require('./commands/migrate-command')));
397
- const migrateArgs = args.slice(1);
398
- if (migrateArgs.includes('--help') || migrateArgs.includes('-h')) {
399
- printMigrateHelp();
400
- return;
401
- }
402
- await handleMigrateCommand(migrateArgs);
403
- return;
404
- }
405
- // Special case: update command
406
- if (firstArg === 'update' || firstArg === '--update') {
407
- const updateArgs = args.slice(1);
408
- // Handle --help for update command
409
- if (updateArgs.includes('--help') || updateArgs.includes('-h')) {
410
- console.log('');
411
- console.log('Usage: ccs update [options]');
412
- console.log('');
413
- console.log('Options:');
414
- console.log(' --force Force reinstall current version');
415
- console.log(' --beta, --dev Install from dev channel (unstable)');
416
- console.log(' --help, -h Show this help message');
417
- console.log('');
418
- console.log('Examples:');
419
- console.log(' ccs update Update to latest stable');
420
- console.log(' ccs update --force Force reinstall');
421
- console.log(' ccs update --beta Install dev channel');
422
- console.log('');
423
- return;
424
- }
425
- const forceFlag = updateArgs.includes('--force');
426
- const betaFlag = updateArgs.includes('--beta') || updateArgs.includes('--dev');
427
- await (0, update_command_1.handleUpdateCommand)({ force: forceFlag, beta: betaFlag });
428
- return;
429
- }
430
- const commandAliases = {
431
- '--version': 'version',
432
- '-v': 'version',
433
- '--help': 'help',
434
- '-h': 'help',
435
- '--doctor': 'doctor',
436
- '--sync': 'sync',
437
- '--cleanup': 'cleanup',
438
- '--setup': 'setup',
439
- };
440
- const normalizedFirstArg = commandAliases[firstArg] || firstArg;
441
- const earlyCommandHandlers = {
442
- version: async () => (0, version_command_1.handleVersionCommand)(),
443
- help: async () => (0, help_command_1.handleHelpCommand)(),
444
- '--install': async () => (0, install_command_1.handleInstallCommand)(),
445
- '--uninstall': async () => (0, install_command_1.handleUninstallCommand)(),
446
- '--shell-completion': async () => (0, shell_completion_command_1.handleShellCompletionCommand)(args.slice(1)),
447
- '-sc': async () => (0, shell_completion_command_1.handleShellCompletionCommand)(args.slice(1)),
448
- doctor: async () => (0, doctor_command_1.handleDoctorCommand)(args.slice(1)),
449
- sync: async () => (0, sync_command_1.handleSyncCommand)(),
450
- cleanup: async () => {
451
- const { handleCleanupCommand } = await Promise.resolve().then(() => __importStar(require('./commands/cleanup-command')));
452
- await handleCleanupCommand(args.slice(1));
453
- },
454
- auth: async () => {
455
- const AuthCommandsModule = await Promise.resolve().then(() => __importStar(require('./auth/auth-commands')));
456
- const AuthCommands = AuthCommandsModule.default;
457
- const authCommands = new AuthCommands();
458
- await authCommands.route(args.slice(1));
459
- },
460
- api: async () => {
461
- const { handleApiCommand } = await Promise.resolve().then(() => __importStar(require('./commands/api-command')));
462
- await handleApiCommand(args.slice(1));
463
- },
464
- cliproxy: async () => {
465
- const { handleCliproxyCommand } = await Promise.resolve().then(() => __importStar(require('./commands/cliproxy-command')));
466
- await handleCliproxyCommand(args.slice(1));
467
- },
468
- config: async () => {
469
- const { handleConfigCommand } = await Promise.resolve().then(() => __importStar(require('./commands/config-command')));
470
- await handleConfigCommand(args.slice(1));
471
- },
472
- tokens: async () => {
473
- const { handleTokensCommand } = await Promise.resolve().then(() => __importStar(require('./commands/tokens-command')));
474
- const exitCode = await handleTokensCommand(args.slice(1));
475
- process.exit(exitCode);
476
- },
477
- persist: async () => {
478
- const { handlePersistCommand } = await Promise.resolve().then(() => __importStar(require('./commands/persist-command')));
479
- await handlePersistCommand(args.slice(1));
480
- },
481
- env: async () => {
482
- const { handleEnvCommand } = await Promise.resolve().then(() => __importStar(require('./commands/env-command')));
483
- await handleEnvCommand(args.slice(1));
484
- },
485
- setup: async () => {
486
- const { handleSetupCommand } = await Promise.resolve().then(() => __importStar(require('./commands/setup-command')));
487
- await handleSetupCommand(args.slice(1));
488
- },
489
- cursor: async () => {
490
- const { handleCursorCommand } = await Promise.resolve().then(() => __importStar(require('./commands/cursor-command')));
491
- const exitCode = await handleCursorCommand(args.slice(1));
492
- process.exit(exitCode);
493
- },
494
- };
495
- const earlyCommandHandler = earlyCommandHandlers[normalizedFirstArg];
496
- if (earlyCommandHandler) {
497
- await earlyCommandHandler();
214
+ if (await (0, root_command_router_1.tryHandleRootCommand)(args)) {
498
215
  return;
499
216
  }
500
217
  // Special case: copilot command (GitHub Copilot integration)
@@ -574,12 +291,6 @@ async function main() {
574
291
  console.error((0, ui_1.info)('Use a settings-based profile with --target instead'));
575
292
  process.exit(1);
576
293
  }
577
- // GLMT always requires Claude target because it depends on embedded proxy flow.
578
- if (profileInfo.type === 'settings' && profileInfo.name === 'glmt') {
579
- console.error((0, ui_1.fail)(`${targetAdapter.displayName} does not support GLMT proxy profiles`));
580
- console.error((0, ui_1.info)('Use --target claude for glmt, or switch to a direct API profile (glm/km)'));
581
- process.exit(1);
582
- }
583
294
  if (profileInfo.type === 'default') {
584
295
  if (!targetAdapter.supportsProfileType('default')) {
585
296
  console.error((0, ui_1.fail)(`${targetAdapter.displayName} does not support default profile mode`));
@@ -826,13 +537,26 @@ async function main() {
826
537
  console.error((0, ui_1.info)(`Continuity inheritance active: profile "${profileInfo.name}" -> account "${continuityInheritance.sourceAccount}"`));
827
538
  }
828
539
  const inheritedClaudeConfigDir = continuityInheritance.claudeConfigDir;
829
- // Pre-flight validation for GLM/GLMT/MiniMax profiles
830
- if (profileInfo.name === 'glm' || profileInfo.name === 'glmt') {
831
- const preflightSettingsPath = (0, config_manager_1.getSettingsPath)(profileInfo.name);
832
- const preflightSettings = (0, config_manager_1.loadSettings)(preflightSettingsPath);
833
- const apiKey = preflightSettings.env?.['ANTHROPIC_AUTH_TOKEN'];
540
+ const expandedSettingsPath = profileInfo.settingsPath
541
+ ? (0, helpers_1.expandPath)(profileInfo.settingsPath)
542
+ : (0, config_manager_1.getSettingsPath)(profileInfo.name);
543
+ const settings = (0, config_manager_1.loadSettings)(expandedSettingsPath);
544
+ const rawSettingsEnv = profileInfo.env ?? settings.env ?? {};
545
+ const isDeprecatedGlmtProfile = (0, glmt_deprecation_1.isDeprecatedGlmtProfileName)(profileInfo.name);
546
+ const glmtNormalization = isDeprecatedGlmtProfile
547
+ ? (0, glmt_deprecation_1.normalizeDeprecatedGlmtEnv)(rawSettingsEnv)
548
+ : null;
549
+ const settingsEnv = glmtNormalization?.env ?? rawSettingsEnv;
550
+ if (glmtNormalization) {
551
+ for (const message of glmtNormalization.warnings) {
552
+ console.error((0, ui_1.warn)(message));
553
+ }
554
+ }
555
+ // Pre-flight validation for Z.AI-compatible profiles.
556
+ if (profileInfo.name === 'glm' || isDeprecatedGlmtProfile) {
557
+ const apiKey = settingsEnv['ANTHROPIC_AUTH_TOKEN'];
834
558
  if (apiKey) {
835
- const validation = await (0, api_key_validator_1.validateGlmKey)(apiKey, preflightSettings.env?.['ANTHROPIC_BASE_URL']);
559
+ const validation = await (0, api_key_validator_1.validateGlmKey)(apiKey, settingsEnv['ANTHROPIC_BASE_URL']);
836
560
  if (!validation.valid) {
837
561
  console.error('');
838
562
  console.error((0, ui_1.fail)(validation.error || 'API key validation failed'));
@@ -847,11 +571,9 @@ async function main() {
847
571
  }
848
572
  }
849
573
  if (profileInfo.name === 'mm') {
850
- const preflightSettingsPath = (0, config_manager_1.getSettingsPath)(profileInfo.name);
851
- const preflightSettings = (0, config_manager_1.loadSettings)(preflightSettingsPath);
852
- const apiKey = preflightSettings.env?.['ANTHROPIC_AUTH_TOKEN'];
574
+ const apiKey = settingsEnv['ANTHROPIC_AUTH_TOKEN'];
853
575
  if (apiKey) {
854
- const validation = await (0, api_key_validator_1.validateMiniMaxKey)(apiKey, preflightSettings.env?.['ANTHROPIC_BASE_URL']);
576
+ const validation = await (0, api_key_validator_1.validateMiniMaxKey)(apiKey, settingsEnv['ANTHROPIC_BASE_URL']);
855
577
  if (!validation.valid) {
856
578
  console.error('');
857
579
  console.error((0, ui_1.fail)(validation.error || 'API key validation failed'));
@@ -867,10 +589,8 @@ async function main() {
867
589
  }
868
590
  // Pre-flight validation for Anthropic direct profiles (ANTHROPIC_API_KEY + no BASE_URL)
869
591
  {
870
- const preflightSettingsPath = (0, config_manager_1.getSettingsPath)(profileInfo.name);
871
- const preflightSettings = (0, config_manager_1.loadSettings)(preflightSettingsPath);
872
- const anthropicApiKey = preflightSettings.env?.['ANTHROPIC_API_KEY'];
873
- const hasBaseUrl = !!preflightSettings.env?.['ANTHROPIC_BASE_URL'];
592
+ const anthropicApiKey = settingsEnv['ANTHROPIC_API_KEY'];
593
+ const hasBaseUrl = !!settingsEnv['ANTHROPIC_BASE_URL'];
874
594
  if (anthropicApiKey && !hasBaseUrl) {
875
595
  const validation = await (0, api_key_validator_1.validateAnthropicKey)(anthropicApiKey);
876
596
  if (!validation.valid) {
@@ -886,75 +606,55 @@ async function main() {
886
606
  }
887
607
  }
888
608
  }
889
- // Check if this is GLMT profile (requires proxy)
890
- if (profileInfo.name === 'glmt') {
891
- if (resolvedTarget !== 'claude') {
892
- console.error((0, ui_1.fail)(`${targetAdapter?.displayName || 'Target'} does not support GLMT proxy profiles`));
893
- console.error((0, ui_1.info)('Use --target claude for glmt, or switch to a direct API profile (glm/km)'));
894
- process.exit(1);
895
- }
896
- // GLMT FLOW: Settings-based with embedded proxy for thinking support
897
- await execClaudeWithProxy(claudeCli, profileInfo.name, remainingArgs, inheritedClaudeConfigDir);
609
+ const webSearchEnv = (0, websearch_manager_1.getWebSearchHookEnv)();
610
+ const imageAnalysisEnv = (0, hooks_1.getImageAnalysisHookEnv)(profileInfo.name);
611
+ // Get global env vars (DISABLE_TELEMETRY, etc.) for third-party profiles
612
+ const globalEnvConfig = (0, unified_config_loader_1.getGlobalEnvConfig)();
613
+ const globalEnv = globalEnvConfig.enabled ? globalEnvConfig.env : {};
614
+ // Log global env injection for visibility (debug mode only)
615
+ if (globalEnvConfig.enabled && Object.keys(globalEnv).length > 0 && process.env.CCS_DEBUG) {
616
+ const envNames = Object.keys(globalEnv).join(', ');
617
+ console.error((0, ui_1.info)(`Global env: ${envNames}`));
898
618
  }
899
- else {
900
- // EXISTING FLOW: Settings-based profile (glm)
901
- // Use --settings flag (backward compatible)
902
- const expandedSettingsPath = profileInfo.settingsPath
903
- ? (0, helpers_1.expandPath)(profileInfo.settingsPath)
904
- : (0, config_manager_1.getSettingsPath)(profileInfo.name);
905
- const webSearchEnv = (0, websearch_manager_1.getWebSearchHookEnv)();
906
- const imageAnalysisEnv = (0, hooks_1.getImageAnalysisHookEnv)(profileInfo.name);
907
- // Get global env vars (DISABLE_TELEMETRY, etc.) for third-party profiles
908
- const globalEnvConfig = (0, unified_config_loader_1.getGlobalEnvConfig)();
909
- const globalEnv = globalEnvConfig.enabled ? globalEnvConfig.env : {};
910
- // Log global env injection for visibility (debug mode only)
911
- if (globalEnvConfig.enabled && Object.keys(globalEnv).length > 0 && process.env.CCS_DEBUG) {
912
- const envNames = Object.keys(globalEnv).join(', ');
913
- console.error((0, ui_1.info)(`Global env: ${envNames}`));
619
+ // Explicitly inject effective settings env vars so stale ANTHROPIC_*
620
+ // values from prior sessions cannot leak into the active profile.
621
+ const envVars = {
622
+ ...globalEnv,
623
+ ...settingsEnv,
624
+ ...(inheritedClaudeConfigDir ? { CLAUDE_CONFIG_DIR: inheritedClaudeConfigDir } : {}),
625
+ ...webSearchEnv,
626
+ ...imageAnalysisEnv,
627
+ CCS_PROFILE_TYPE: 'settings',
628
+ };
629
+ // Dispatch through target adapter for non-claude targets
630
+ if (resolvedTarget !== 'claude') {
631
+ const adapter = targetAdapter;
632
+ if (!adapter) {
633
+ console.error((0, ui_1.fail)(`Target adapter not found for "${resolvedTarget}"`));
634
+ process.exit(1);
914
635
  }
915
- // CRITICAL: Load settings and explicitly set ANTHROPIC_* env vars
916
- // to prevent inheriting stale values from previous CLIProxy sessions.
917
- // Environment variables take precedence over --settings file values,
918
- // so we must explicitly set them here to ensure correct routing.
919
- const settings = (0, config_manager_1.loadSettings)(expandedSettingsPath);
920
- const settingsEnv = settings.env || {};
921
- const envVars = {
922
- ...globalEnv,
923
- ...settingsEnv, // Explicitly inject all settings env vars
924
- ...(inheritedClaudeConfigDir ? { CLAUDE_CONFIG_DIR: inheritedClaudeConfigDir } : {}),
925
- ...webSearchEnv,
926
- ...imageAnalysisEnv,
927
- CCS_PROFILE_TYPE: 'settings', // Signal to WebSearch hook this is a third-party provider
928
- };
929
- // Dispatch through target adapter for non-claude targets
930
- if (resolvedTarget !== 'claude') {
931
- const adapter = targetAdapter;
932
- if (!adapter) {
933
- console.error((0, ui_1.fail)(`Target adapter not found for "${resolvedTarget}"`));
934
- process.exit(1);
935
- }
936
- const directAnthropicBaseUrl = settingsEnv['ANTHROPIC_BASE_URL'] ||
937
- (settingsEnv['ANTHROPIC_API_KEY'] ? 'https://api.anthropic.com' : '');
938
- const creds = {
939
- profile: profileInfo.name,
636
+ const directAnthropicBaseUrl = settingsEnv['ANTHROPIC_BASE_URL'] ||
637
+ (settingsEnv['ANTHROPIC_API_KEY'] ? 'https://api.anthropic.com' : '');
638
+ const creds = {
639
+ profile: profileInfo.name,
640
+ baseUrl: directAnthropicBaseUrl,
641
+ apiKey: settingsEnv['ANTHROPIC_AUTH_TOKEN'] || settingsEnv['ANTHROPIC_API_KEY'] || '',
642
+ model: settingsEnv['ANTHROPIC_MODEL'],
643
+ provider: (0, targets_1.resolveDroidProvider)({
644
+ provider: settingsEnv['CCS_DROID_PROVIDER'] || settingsEnv['DROID_PROVIDER'],
940
645
  baseUrl: directAnthropicBaseUrl,
941
- apiKey: settingsEnv['ANTHROPIC_AUTH_TOKEN'] || settingsEnv['ANTHROPIC_API_KEY'] || '',
942
646
  model: settingsEnv['ANTHROPIC_MODEL'],
943
- provider: (0, targets_1.resolveDroidProvider)({
944
- provider: settingsEnv['CCS_DROID_PROVIDER'] || settingsEnv['DROID_PROVIDER'],
945
- baseUrl: directAnthropicBaseUrl,
946
- model: settingsEnv['ANTHROPIC_MODEL'],
947
- }),
948
- reasoningOverride: droidReasoningOverride,
949
- };
950
- await adapter.prepareCredentials(creds);
951
- const targetArgs = adapter.buildArgs(profileInfo.name, targetRemainingArgs);
952
- const targetEnv = adapter.buildEnv(creds, profileInfo.type);
953
- adapter.exec(targetArgs, targetEnv, { binaryInfo: targetBinaryInfo || undefined });
954
- return;
955
- }
956
- (0, shell_executor_1.execClaude)(claudeCli, ['--settings', expandedSettingsPath, ...remainingArgs], envVars);
647
+ }),
648
+ reasoningOverride: droidReasoningOverride,
649
+ envVars,
650
+ };
651
+ await adapter.prepareCredentials(creds);
652
+ const targetArgs = adapter.buildArgs(profileInfo.name, targetRemainingArgs);
653
+ const targetEnv = adapter.buildEnv(creds, profileInfo.type);
654
+ adapter.exec(targetArgs, targetEnv, { binaryInfo: targetBinaryInfo || undefined });
655
+ return;
957
656
  }
657
+ (0, shell_executor_1.execClaude)(claudeCli, ['--settings', expandedSettingsPath, ...remainingArgs], envVars);
958
658
  }
959
659
  else if (profileInfo.type === 'account') {
960
660
  // NEW FLOW: Account-based profile (work, personal)