@kaitranntt/ccs 7.76.0-dev.2 → 7.76.0-dev.3

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 (473) hide show
  1. package/dist/api/services/cliproxy-profile-bridge.d.ts.map +1 -1
  2. package/dist/api/services/cliproxy-profile-bridge.js +5 -6
  3. package/dist/api/services/cliproxy-profile-bridge.js.map +1 -1
  4. package/dist/api/services/openrouter-catalog.js +2 -2
  5. package/dist/api/services/openrouter-catalog.js.map +1 -1
  6. package/dist/api/services/profile-lifecycle-service.d.ts.map +1 -1
  7. package/dist/api/services/profile-lifecycle-service.js +6 -6
  8. package/dist/api/services/profile-lifecycle-service.js.map +1 -1
  9. package/dist/api/services/profile-reader.d.ts.map +1 -1
  10. package/dist/api/services/profile-reader.js +14 -15
  11. package/dist/api/services/profile-reader.js.map +1 -1
  12. package/dist/api/services/profile-writer.d.ts.map +1 -1
  13. package/dist/api/services/profile-writer.js +13 -13
  14. package/dist/api/services/profile-writer.js.map +1 -1
  15. package/dist/auth/commands/create-command.d.ts.map +1 -1
  16. package/dist/auth/commands/create-command.js +2 -2
  17. package/dist/auth/commands/create-command.js.map +1 -1
  18. package/dist/auth/commands/default-command.d.ts.map +1 -1
  19. package/dist/auth/commands/default-command.js +3 -3
  20. package/dist/auth/commands/default-command.js.map +1 -1
  21. package/dist/auth/commands/remove-command.d.ts.map +1 -1
  22. package/dist/auth/commands/remove-command.js +2 -2
  23. package/dist/auth/commands/remove-command.js.map +1 -1
  24. package/dist/auth/profile-continuity-inheritance.d.ts.map +1 -1
  25. package/dist/auth/profile-continuity-inheritance.js +4 -4
  26. package/dist/auth/profile-continuity-inheritance.js.map +1 -1
  27. package/dist/auth/profile-detector.d.ts.map +1 -1
  28. package/dist/auth/profile-detector.js +5 -6
  29. package/dist/auth/profile-detector.js.map +1 -1
  30. package/dist/auth/profile-registry.d.ts.map +1 -1
  31. package/dist/auth/profile-registry.js +14 -15
  32. package/dist/auth/profile-registry.js.map +1 -1
  33. package/dist/auth/resume-lane-diagnostics.d.ts.map +1 -1
  34. package/dist/auth/resume-lane-diagnostics.js +2 -2
  35. package/dist/auth/resume-lane-diagnostics.js.map +1 -1
  36. package/dist/ccs.js +30 -1257
  37. package/dist/ccs.js.map +1 -1
  38. package/dist/channels/official-channels-ids.d.ts +21 -0
  39. package/dist/channels/official-channels-ids.d.ts.map +1 -0
  40. package/dist/channels/official-channels-ids.js +46 -0
  41. package/dist/channels/official-channels-ids.js.map +1 -0
  42. package/dist/channels/official-channels-runtime.d.ts +2 -5
  43. package/dist/channels/official-channels-runtime.d.ts.map +1 -1
  44. package/dist/channels/official-channels-runtime.js +14 -29
  45. package/dist/channels/official-channels-runtime.js.map +1 -1
  46. package/dist/channels/official-channels-store.d.ts.map +1 -1
  47. package/dist/channels/official-channels-store.js +2 -2
  48. package/dist/channels/official-channels-store.js.map +1 -1
  49. package/dist/cliproxy/accounts/account-safety.js +4 -4
  50. package/dist/cliproxy/accounts/account-safety.js.map +1 -1
  51. package/dist/cliproxy/auth/antigravity-responsibility.js +2 -2
  52. package/dist/cliproxy/auth/antigravity-responsibility.js.map +1 -1
  53. package/dist/cliproxy/auth/auth-token-manager.d.ts.map +1 -1
  54. package/dist/cliproxy/auth/auth-token-manager.js +8 -8
  55. package/dist/cliproxy/auth/auth-token-manager.js.map +1 -1
  56. package/dist/cliproxy/auth/token-refresh-config.d.ts.map +1 -1
  57. package/dist/cliproxy/auth/token-refresh-config.js +2 -2
  58. package/dist/cliproxy/auth/token-refresh-config.js.map +1 -1
  59. package/dist/cliproxy/binary-manager.d.ts.map +1 -1
  60. package/dist/cliproxy/binary-manager.js +2 -2
  61. package/dist/cliproxy/binary-manager.js.map +1 -1
  62. package/dist/cliproxy/config/env-builder.d.ts.map +1 -1
  63. package/dist/cliproxy/config/env-builder.js +2 -2
  64. package/dist/cliproxy/config/env-builder.js.map +1 -1
  65. package/dist/cliproxy/config/generator.d.ts.map +1 -1
  66. package/dist/cliproxy/config/generator.js +5 -5
  67. package/dist/cliproxy/config/generator.js.map +1 -1
  68. package/dist/cliproxy/config/model-config.d.ts.map +1 -1
  69. package/dist/cliproxy/config/model-config.js +2 -2
  70. package/dist/cliproxy/config/model-config.js.map +1 -1
  71. package/dist/cliproxy/config/path-resolver.d.ts.map +1 -1
  72. package/dist/cliproxy/config/path-resolver.js +4 -4
  73. package/dist/cliproxy/config/path-resolver.js.map +1 -1
  74. package/dist/cliproxy/config/thinking-config.d.ts.map +1 -1
  75. package/dist/cliproxy/config/thinking-config.js +2 -2
  76. package/dist/cliproxy/config/thinking-config.js.map +1 -1
  77. package/dist/cliproxy/executor/account-resolution.d.ts +52 -0
  78. package/dist/cliproxy/executor/account-resolution.d.ts.map +1 -0
  79. package/dist/cliproxy/executor/account-resolution.js +154 -0
  80. package/dist/cliproxy/executor/account-resolution.js.map +1 -0
  81. package/dist/cliproxy/executor/arg-parser.d.ts +96 -0
  82. package/dist/cliproxy/executor/arg-parser.d.ts.map +1 -0
  83. package/dist/cliproxy/executor/arg-parser.js +529 -0
  84. package/dist/cliproxy/executor/arg-parser.js.map +1 -0
  85. package/dist/cliproxy/executor/auth-coordinator.d.ts +96 -0
  86. package/dist/cliproxy/executor/auth-coordinator.d.ts.map +1 -0
  87. package/dist/cliproxy/executor/auth-coordinator.js +342 -0
  88. package/dist/cliproxy/executor/auth-coordinator.js.map +1 -0
  89. package/dist/cliproxy/executor/browser-launch-setup.d.ts +36 -0
  90. package/dist/cliproxy/executor/browser-launch-setup.d.ts.map +1 -0
  91. package/dist/cliproxy/executor/browser-launch-setup.js +80 -0
  92. package/dist/cliproxy/executor/browser-launch-setup.js.map +1 -0
  93. package/dist/cliproxy/executor/claude-launcher.d.ts +55 -0
  94. package/dist/cliproxy/executor/claude-launcher.d.ts.map +1 -0
  95. package/dist/cliproxy/executor/claude-launcher.js +112 -0
  96. package/dist/cliproxy/executor/claude-launcher.js.map +1 -0
  97. package/dist/cliproxy/executor/index.d.ts +4 -9
  98. package/dist/cliproxy/executor/index.d.ts.map +1 -1
  99. package/dist/cliproxy/executor/index.js +110 -866
  100. package/dist/cliproxy/executor/index.js.map +1 -1
  101. package/dist/cliproxy/executor/model-warnings.d.ts +22 -0
  102. package/dist/cliproxy/executor/model-warnings.d.ts.map +1 -0
  103. package/dist/cliproxy/executor/model-warnings.js +67 -0
  104. package/dist/cliproxy/executor/model-warnings.js.map +1 -0
  105. package/dist/cliproxy/executor/proxy-chain-builder.d.ts +71 -0
  106. package/dist/cliproxy/executor/proxy-chain-builder.d.ts.map +1 -0
  107. package/dist/cliproxy/executor/proxy-chain-builder.js +143 -0
  108. package/dist/cliproxy/executor/proxy-chain-builder.js.map +1 -0
  109. package/dist/cliproxy/executor/proxy-resolver.d.ts +44 -0
  110. package/dist/cliproxy/executor/proxy-resolver.d.ts.map +1 -0
  111. package/dist/cliproxy/executor/proxy-resolver.js +173 -0
  112. package/dist/cliproxy/executor/proxy-resolver.js.map +1 -0
  113. package/dist/cliproxy/proxy/proxy-target-resolver.js +2 -2
  114. package/dist/cliproxy/proxy/proxy-target-resolver.js.map +1 -1
  115. package/dist/cliproxy/proxy/tool-sanitization-proxy.d.ts.map +1 -1
  116. package/dist/cliproxy/proxy/tool-sanitization-proxy.js +2 -2
  117. package/dist/cliproxy/proxy/tool-sanitization-proxy.js.map +1 -1
  118. package/dist/cliproxy/quota/quota-manager.d.ts.map +1 -1
  119. package/dist/cliproxy/quota/quota-manager.js +4 -4
  120. package/dist/cliproxy/quota/quota-manager.js.map +1 -1
  121. package/dist/cliproxy/routing/routing-strategy.d.ts.map +1 -1
  122. package/dist/cliproxy/routing/routing-strategy.js +5 -5
  123. package/dist/cliproxy/routing/routing-strategy.js.map +1 -1
  124. package/dist/cliproxy/services/binary-service.js +8 -8
  125. package/dist/cliproxy/services/binary-service.js.map +1 -1
  126. package/dist/cliproxy/services/catalog-cache.d.ts.map +1 -1
  127. package/dist/cliproxy/services/catalog-cache.js +2 -2
  128. package/dist/cliproxy/services/catalog-cache.js.map +1 -1
  129. package/dist/cliproxy/services/variant-config-adapter.d.ts.map +1 -1
  130. package/dist/cliproxy/services/variant-config-adapter.js +10 -10
  131. package/dist/cliproxy/services/variant-config-adapter.js.map +1 -1
  132. package/dist/cliproxy/services/variant-service.d.ts.map +1 -1
  133. package/dist/cliproxy/services/variant-service.js +7 -8
  134. package/dist/cliproxy/services/variant-service.js.map +1 -1
  135. package/dist/cliproxy/services/variant-settings.d.ts.map +1 -1
  136. package/dist/cliproxy/services/variant-settings.js +5 -5
  137. package/dist/cliproxy/services/variant-settings.js.map +1 -1
  138. package/dist/cliproxy/sync/auto-sync-watcher.js +3 -4
  139. package/dist/cliproxy/sync/auto-sync-watcher.js.map +1 -1
  140. package/dist/cliproxy/sync/profile-mapper.d.ts.map +1 -1
  141. package/dist/cliproxy/sync/profile-mapper.js +2 -2
  142. package/dist/cliproxy/sync/profile-mapper.js.map +1 -1
  143. package/dist/commands/browser-command.d.ts.map +1 -1
  144. package/dist/commands/browser-command.js +7 -7
  145. package/dist/commands/browser-command.js.map +1 -1
  146. package/dist/commands/cliproxy/resolve-lifecycle-port.d.ts.map +1 -1
  147. package/dist/commands/cliproxy/resolve-lifecycle-port.js +2 -2
  148. package/dist/commands/cliproxy/resolve-lifecycle-port.js.map +1 -1
  149. package/dist/commands/cliproxy/variant-subcommand.d.ts.map +1 -1
  150. package/dist/commands/cliproxy/variant-subcommand.js +4 -4
  151. package/dist/commands/cliproxy/variant-subcommand.js.map +1 -1
  152. package/dist/commands/config-auth/disable-command.d.ts.map +1 -1
  153. package/dist/commands/config-auth/disable-command.js +3 -3
  154. package/dist/commands/config-auth/disable-command.js.map +1 -1
  155. package/dist/commands/config-auth/setup-command.d.ts.map +1 -1
  156. package/dist/commands/config-auth/setup-command.js +2 -2
  157. package/dist/commands/config-auth/setup-command.js.map +1 -1
  158. package/dist/commands/config-auth/show-command.js +2 -2
  159. package/dist/commands/config-auth/show-command.js.map +1 -1
  160. package/dist/commands/config-channels-command.d.ts.map +1 -1
  161. package/dist/commands/config-channels-command.js +4 -4
  162. package/dist/commands/config-channels-command.js.map +1 -1
  163. package/dist/commands/config-command.d.ts +1 -1
  164. package/dist/commands/config-command.d.ts.map +1 -1
  165. package/dist/commands/config-command.js +2 -2
  166. package/dist/commands/config-command.js.map +1 -1
  167. package/dist/commands/config-image-analysis-command.d.ts.map +1 -1
  168. package/dist/commands/config-image-analysis-command.js +4 -4
  169. package/dist/commands/config-image-analysis-command.js.map +1 -1
  170. package/dist/commands/config-thinking-command.d.ts.map +1 -1
  171. package/dist/commands/config-thinking-command.js +4 -4
  172. package/dist/commands/config-thinking-command.js.map +1 -1
  173. package/dist/commands/copilot-command.d.ts.map +1 -1
  174. package/dist/commands/copilot-command.js +4 -4
  175. package/dist/commands/copilot-command.js.map +1 -1
  176. package/dist/commands/cursor-command.d.ts.map +1 -1
  177. package/dist/commands/cursor-command.js +7 -7
  178. package/dist/commands/cursor-command.js.map +1 -1
  179. package/dist/commands/env-command.d.ts.map +1 -1
  180. package/dist/commands/env-command.js +2 -2
  181. package/dist/commands/env-command.js.map +1 -1
  182. package/dist/commands/migrate-command.d.ts.map +1 -1
  183. package/dist/commands/migrate-command.js +2 -2
  184. package/dist/commands/migrate-command.js.map +1 -1
  185. package/dist/commands/proxy-command.d.ts.map +1 -1
  186. package/dist/commands/proxy-command.js +2 -1
  187. package/dist/commands/proxy-command.js.map +1 -1
  188. package/dist/commands/setup-command.d.ts.map +1 -1
  189. package/dist/commands/setup-command.js +6 -7
  190. package/dist/commands/setup-command.js.map +1 -1
  191. package/dist/commands/version-command.d.ts.map +1 -1
  192. package/dist/commands/version-command.js +2 -1
  193. package/dist/commands/version-command.js.map +1 -1
  194. package/dist/config/loader/config-getters.d.ts +121 -0
  195. package/dist/config/loader/config-getters.d.ts.map +1 -0
  196. package/dist/config/loader/config-getters.js +260 -0
  197. package/dist/config/loader/config-getters.js.map +1 -0
  198. package/dist/config/loader/defaults-merger.d.ts +21 -0
  199. package/dist/config/loader/defaults-merger.d.ts.map +1 -0
  200. package/dist/config/loader/defaults-merger.js +270 -0
  201. package/dist/config/loader/defaults-merger.js.map +1 -0
  202. package/dist/config/loader/io-locks.d.ts +76 -0
  203. package/dist/config/loader/io-locks.d.ts.map +1 -0
  204. package/dist/config/loader/io-locks.js +297 -0
  205. package/dist/config/loader/io-locks.js.map +1 -0
  206. package/dist/config/loader/normalizers.d.ts +40 -0
  207. package/dist/config/loader/normalizers.d.ts.map +1 -0
  208. package/dist/config/loader/normalizers.js +172 -0
  209. package/dist/config/loader/normalizers.js.map +1 -0
  210. package/dist/config/loader/yaml-serializer.d.ts +19 -0
  211. package/dist/config/loader/yaml-serializer.d.ts.map +1 -0
  212. package/dist/config/loader/yaml-serializer.js +299 -0
  213. package/dist/config/loader/yaml-serializer.js.map +1 -0
  214. package/dist/config/unified-config-loader.d.ts +21 -124
  215. package/dist/config/unified-config-loader.d.ts.map +1 -1
  216. package/dist/config/unified-config-loader.js +100 -1098
  217. package/dist/config/unified-config-loader.js.map +1 -1
  218. package/dist/copilot/copilot-daemon.d.ts.map +1 -1
  219. package/dist/copilot/copilot-daemon.js +2 -2
  220. package/dist/copilot/copilot-daemon.js.map +1 -1
  221. package/dist/copilot/copilot-executor.d.ts.map +1 -1
  222. package/dist/copilot/copilot-executor.js +2 -2
  223. package/dist/copilot/copilot-executor.js.map +1 -1
  224. package/dist/copilot/copilot-package-manager.js +2 -2
  225. package/dist/copilot/copilot-package-manager.js.map +1 -1
  226. package/dist/cursor/cursor-auth.js +2 -2
  227. package/dist/cursor/cursor-auth.js.map +1 -1
  228. package/dist/cursor/cursor-daemon-pid.js +2 -2
  229. package/dist/cursor/cursor-daemon-pid.js.map +1 -1
  230. package/dist/cursor/cursor-profile-executor.d.ts.map +1 -1
  231. package/dist/cursor/cursor-profile-executor.js +2 -2
  232. package/dist/cursor/cursor-profile-executor.js.map +1 -1
  233. package/dist/delegation/delegation-handler.js +2 -2
  234. package/dist/delegation/delegation-handler.js.map +1 -1
  235. package/dist/delegation/headless-executor.d.ts.map +1 -1
  236. package/dist/delegation/headless-executor.js +4 -4
  237. package/dist/delegation/headless-executor.js.map +1 -1
  238. package/dist/delegation/session-manager.js +2 -2
  239. package/dist/delegation/session-manager.js.map +1 -1
  240. package/dist/dispatcher/cli-argument-parser.d.ts +70 -0
  241. package/dist/dispatcher/cli-argument-parser.d.ts.map +1 -0
  242. package/dist/dispatcher/cli-argument-parser.js +285 -0
  243. package/dist/dispatcher/cli-argument-parser.js.map +1 -0
  244. package/dist/dispatcher/dispatcher-context.d.ts +24 -0
  245. package/dist/dispatcher/dispatcher-context.d.ts.map +1 -0
  246. package/dist/dispatcher/dispatcher-context.js +11 -0
  247. package/dist/dispatcher/dispatcher-context.js.map +1 -0
  248. package/dist/dispatcher/environment-builder.d.ts +20 -0
  249. package/dist/dispatcher/environment-builder.d.ts.map +1 -0
  250. package/dist/dispatcher/environment-builder.js +95 -0
  251. package/dist/dispatcher/environment-builder.js.map +1 -0
  252. package/dist/dispatcher/flows/account-flow.d.ts +9 -0
  253. package/dist/dispatcher/flows/account-flow.d.ts.map +1 -0
  254. package/dist/dispatcher/flows/account-flow.js +49 -0
  255. package/dist/dispatcher/flows/account-flow.js.map +1 -0
  256. package/dist/dispatcher/flows/cliproxy-flow.d.ts +8 -0
  257. package/dist/dispatcher/flows/cliproxy-flow.d.ts.map +1 -0
  258. package/dist/dispatcher/flows/cliproxy-flow.js +165 -0
  259. package/dist/dispatcher/flows/cliproxy-flow.js.map +1 -0
  260. package/dist/dispatcher/flows/copilot-flow.d.ts +8 -0
  261. package/dist/dispatcher/flows/copilot-flow.d.ts.map +1 -0
  262. package/dist/dispatcher/flows/copilot-flow.js +72 -0
  263. package/dist/dispatcher/flows/copilot-flow.js.map +1 -0
  264. package/dist/dispatcher/flows/cursor-flow.d.ts +8 -0
  265. package/dist/dispatcher/flows/cursor-flow.d.ts.map +1 -0
  266. package/dist/dispatcher/flows/cursor-flow.js +62 -0
  267. package/dist/dispatcher/flows/cursor-flow.js.map +1 -0
  268. package/dist/dispatcher/flows/default-flow.d.ts +10 -0
  269. package/dist/dispatcher/flows/default-flow.d.ts.map +1 -0
  270. package/dist/dispatcher/flows/default-flow.js +99 -0
  271. package/dist/dispatcher/flows/default-flow.js.map +1 -0
  272. package/dist/dispatcher/flows/settings-flow.d.ts +9 -0
  273. package/dist/dispatcher/flows/settings-flow.d.ts.map +1 -0
  274. package/dist/dispatcher/flows/settings-flow.js +318 -0
  275. package/dist/dispatcher/flows/settings-flow.js.map +1 -0
  276. package/dist/dispatcher/flows/settings-image-analysis-prep.d.ts +28 -0
  277. package/dist/dispatcher/flows/settings-image-analysis-prep.d.ts.map +1 -0
  278. package/dist/dispatcher/flows/settings-image-analysis-prep.js +81 -0
  279. package/dist/dispatcher/flows/settings-image-analysis-prep.js.map +1 -0
  280. package/dist/dispatcher/pre-dispatch.d.ts +23 -0
  281. package/dist/dispatcher/pre-dispatch.d.ts.map +1 -0
  282. package/dist/dispatcher/pre-dispatch.js +156 -0
  283. package/dist/dispatcher/pre-dispatch.js.map +1 -0
  284. package/dist/dispatcher/profile-resolver.d.ts +65 -0
  285. package/dist/dispatcher/profile-resolver.d.ts.map +1 -0
  286. package/dist/dispatcher/profile-resolver.js +290 -0
  287. package/dist/dispatcher/profile-resolver.js.map +1 -0
  288. package/dist/dispatcher/target-executor.d.ts +26 -0
  289. package/dist/dispatcher/target-executor.d.ts.map +1 -0
  290. package/dist/dispatcher/target-executor.js +81 -0
  291. package/dist/dispatcher/target-executor.js.map +1 -0
  292. package/dist/docker/docker-assets.d.ts.map +1 -1
  293. package/dist/docker/docker-assets.js +2 -2
  294. package/dist/docker/docker-assets.js.map +1 -1
  295. package/dist/glmt/glmt-transformer.d.ts.map +1 -1
  296. package/dist/glmt/glmt-transformer.js +2 -2
  297. package/dist/glmt/glmt-transformer.js.map +1 -1
  298. package/dist/management/checks/config-check.d.ts.map +1 -1
  299. package/dist/management/checks/config-check.js +2 -2
  300. package/dist/management/checks/config-check.js.map +1 -1
  301. package/dist/management/checks/env-check.d.ts.map +1 -1
  302. package/dist/management/checks/env-check.js +2 -1
  303. package/dist/management/checks/env-check.js.map +1 -1
  304. package/dist/management/checks/image-analysis-check.d.ts.map +1 -1
  305. package/dist/management/checks/image-analysis-check.js +4 -4
  306. package/dist/management/checks/image-analysis-check.js.map +1 -1
  307. package/dist/management/checks/profile-check.js +4 -4
  308. package/dist/management/checks/profile-check.js.map +1 -1
  309. package/dist/management/checks/symlink-check.js +2 -2
  310. package/dist/management/checks/symlink-check.js.map +1 -1
  311. package/dist/management/checks/system-check.js +2 -2
  312. package/dist/management/checks/system-check.js.map +1 -1
  313. package/dist/management/instance-manager.d.ts.map +1 -1
  314. package/dist/management/instance-manager.js +2 -1
  315. package/dist/management/instance-manager.js.map +1 -1
  316. package/dist/management/recovery-manager.d.ts.map +1 -1
  317. package/dist/management/recovery-manager.js +5 -5
  318. package/dist/management/recovery-manager.js.map +1 -1
  319. package/dist/management/repair/auto-repair.d.ts.map +1 -1
  320. package/dist/management/repair/auto-repair.js +2 -2
  321. package/dist/management/repair/auto-repair.js.map +1 -1
  322. package/dist/management/shared-manager.d.ts.map +1 -1
  323. package/dist/management/shared-manager.js +2 -2
  324. package/dist/management/shared-manager.js.map +1 -1
  325. package/dist/proxy/proxy-daemon-entry.js +2 -2
  326. package/dist/proxy/proxy-daemon-entry.js.map +1 -1
  327. package/dist/proxy/proxy-daemon-paths.js +2 -2
  328. package/dist/proxy/proxy-daemon-paths.js.map +1 -1
  329. package/dist/proxy/proxy-port-resolver.js +2 -2
  330. package/dist/proxy/proxy-port-resolver.js.map +1 -1
  331. package/dist/proxy/request-router.d.ts.map +1 -1
  332. package/dist/proxy/request-router.js +3 -3
  333. package/dist/proxy/request-router.js.map +1 -1
  334. package/dist/services/logging/log-config.d.ts.map +1 -1
  335. package/dist/services/logging/log-config.js +3 -3
  336. package/dist/services/logging/log-config.js.map +1 -1
  337. package/dist/services/logging/log-paths.js +3 -3
  338. package/dist/services/logging/log-paths.js.map +1 -1
  339. package/dist/utils/browser/browser-setup.d.ts +2 -2
  340. package/dist/utils/browser/browser-setup.d.ts.map +1 -1
  341. package/dist/utils/browser/browser-setup.js +4 -4
  342. package/dist/utils/browser/browser-setup.js.map +1 -1
  343. package/dist/utils/browser/browser-status.d.ts.map +1 -1
  344. package/dist/utils/browser/browser-status.js +3 -3
  345. package/dist/utils/browser/browser-status.js.map +1 -1
  346. package/dist/utils/hooks/get-image-analysis-hook-env.d.ts.map +1 -1
  347. package/dist/utils/hooks/get-image-analysis-hook-env.js +2 -2
  348. package/dist/utils/hooks/get-image-analysis-hook-env.js.map +1 -1
  349. package/dist/utils/hooks/image-analyzer-hook-configuration.d.ts.map +1 -1
  350. package/dist/utils/hooks/image-analyzer-hook-configuration.js +2 -2
  351. package/dist/utils/hooks/image-analyzer-hook-configuration.js.map +1 -1
  352. package/dist/utils/hooks/image-analyzer-hook-installer.d.ts.map +1 -1
  353. package/dist/utils/hooks/image-analyzer-hook-installer.js +2 -2
  354. package/dist/utils/hooks/image-analyzer-hook-installer.js.map +1 -1
  355. package/dist/utils/hooks/image-analyzer-profile-hook-injector.d.ts.map +1 -1
  356. package/dist/utils/hooks/image-analyzer-profile-hook-injector.js +2 -2
  357. package/dist/utils/hooks/image-analyzer-profile-hook-injector.js.map +1 -1
  358. package/dist/utils/image-analysis/mcp-installer.d.ts.map +1 -1
  359. package/dist/utils/image-analysis/mcp-installer.js +5 -5
  360. package/dist/utils/image-analysis/mcp-installer.js.map +1 -1
  361. package/dist/utils/shell-executor.d.ts.map +1 -1
  362. package/dist/utils/shell-executor.js +2 -2
  363. package/dist/utils/shell-executor.js.map +1 -1
  364. package/dist/utils/websearch/hook-config.d.ts.map +1 -1
  365. package/dist/utils/websearch/hook-config.js +3 -3
  366. package/dist/utils/websearch/hook-config.js.map +1 -1
  367. package/dist/utils/websearch/hook-env.js +2 -2
  368. package/dist/utils/websearch/hook-env.js.map +1 -1
  369. package/dist/utils/websearch/hook-installer.d.ts.map +1 -1
  370. package/dist/utils/websearch/hook-installer.js +2 -2
  371. package/dist/utils/websearch/hook-installer.js.map +1 -1
  372. package/dist/utils/websearch/mcp-installer.d.ts.map +1 -1
  373. package/dist/utils/websearch/mcp-installer.js +5 -5
  374. package/dist/utils/websearch/mcp-installer.js.map +1 -1
  375. package/dist/utils/websearch/profile-hook-injector.d.ts.map +1 -1
  376. package/dist/utils/websearch/profile-hook-injector.js +3 -3
  377. package/dist/utils/websearch/profile-hook-injector.js.map +1 -1
  378. package/dist/utils/websearch/provider-secrets.js +2 -2
  379. package/dist/utils/websearch/provider-secrets.js.map +1 -1
  380. package/dist/utils/websearch/status.d.ts.map +1 -1
  381. package/dist/utils/websearch/status.js +4 -4
  382. package/dist/utils/websearch/status.js.map +1 -1
  383. package/dist/web-server/file-watcher.js +2 -2
  384. package/dist/web-server/file-watcher.js.map +1 -1
  385. package/dist/web-server/health/config-checks.d.ts.map +1 -1
  386. package/dist/web-server/health/config-checks.js +3 -3
  387. package/dist/web-server/health/config-checks.js.map +1 -1
  388. package/dist/web-server/health/profile-checks.d.ts.map +1 -1
  389. package/dist/web-server/health/profile-checks.js +3 -3
  390. package/dist/web-server/health/profile-checks.js.map +1 -1
  391. package/dist/web-server/health-service.d.ts.map +1 -1
  392. package/dist/web-server/health-service.js +7 -6
  393. package/dist/web-server/health-service.js.map +1 -1
  394. package/dist/web-server/middleware/auth-middleware.d.ts.map +1 -1
  395. package/dist/web-server/middleware/auth-middleware.js +6 -7
  396. package/dist/web-server/middleware/auth-middleware.js.map +1 -1
  397. package/dist/web-server/models-dev/registry-cache.d.ts.map +1 -1
  398. package/dist/web-server/models-dev/registry-cache.js +2 -2
  399. package/dist/web-server/models-dev/registry-cache.js.map +1 -1
  400. package/dist/web-server/overview-routes.d.ts.map +1 -1
  401. package/dist/web-server/overview-routes.js +2 -2
  402. package/dist/web-server/overview-routes.js.map +1 -1
  403. package/dist/web-server/routes/account-routes.d.ts.map +1 -1
  404. package/dist/web-server/routes/account-routes.js +7 -7
  405. package/dist/web-server/routes/account-routes.js.map +1 -1
  406. package/dist/web-server/routes/auth-routes.d.ts.map +1 -1
  407. package/dist/web-server/routes/auth-routes.js +4 -4
  408. package/dist/web-server/routes/auth-routes.js.map +1 -1
  409. package/dist/web-server/routes/browser-routes.d.ts.map +1 -1
  410. package/dist/web-server/routes/browser-routes.js +2 -2
  411. package/dist/web-server/routes/browser-routes.js.map +1 -1
  412. package/dist/web-server/routes/channels-routes.d.ts.map +1 -1
  413. package/dist/web-server/routes/channels-routes.js +4 -4
  414. package/dist/web-server/routes/channels-routes.js.map +1 -1
  415. package/dist/web-server/routes/cliproxy-auth-routes.d.ts.map +1 -1
  416. package/dist/web-server/routes/cliproxy-auth-routes.js +2 -2
  417. package/dist/web-server/routes/cliproxy-auth-routes.js.map +1 -1
  418. package/dist/web-server/routes/cliproxy-local-proxy.d.ts.map +1 -1
  419. package/dist/web-server/routes/cliproxy-local-proxy.js +2 -2
  420. package/dist/web-server/routes/cliproxy-local-proxy.js.map +1 -1
  421. package/dist/web-server/routes/cliproxy-sync-routes.d.ts.map +1 -1
  422. package/dist/web-server/routes/cliproxy-sync-routes.js +2 -2
  423. package/dist/web-server/routes/cliproxy-sync-routes.js.map +1 -1
  424. package/dist/web-server/routes/config-routes.d.ts.map +1 -1
  425. package/dist/web-server/routes/config-routes.js +6 -6
  426. package/dist/web-server/routes/config-routes.js.map +1 -1
  427. package/dist/web-server/routes/copilot-routes.d.ts.map +1 -1
  428. package/dist/web-server/routes/copilot-routes.js +3 -3
  429. package/dist/web-server/routes/copilot-routes.js.map +1 -1
  430. package/dist/web-server/routes/copilot-settings-routes.d.ts.map +1 -1
  431. package/dist/web-server/routes/copilot-settings-routes.js +6 -7
  432. package/dist/web-server/routes/copilot-settings-routes.js.map +1 -1
  433. package/dist/web-server/routes/cursor-routes.d.ts.map +1 -1
  434. package/dist/web-server/routes/cursor-routes.js +5 -5
  435. package/dist/web-server/routes/cursor-routes.js.map +1 -1
  436. package/dist/web-server/routes/cursor-settings-routes.d.ts.map +1 -1
  437. package/dist/web-server/routes/cursor-settings-routes.js +8 -9
  438. package/dist/web-server/routes/cursor-settings-routes.js.map +1 -1
  439. package/dist/web-server/routes/image-analysis-routes.d.ts.map +1 -1
  440. package/dist/web-server/routes/image-analysis-routes.js +5 -6
  441. package/dist/web-server/routes/image-analysis-routes.js.map +1 -1
  442. package/dist/web-server/routes/misc-routes.d.ts.map +1 -1
  443. package/dist/web-server/routes/misc-routes.js +10 -11
  444. package/dist/web-server/routes/misc-routes.js.map +1 -1
  445. package/dist/web-server/routes/proxy-routes.d.ts.map +1 -1
  446. package/dist/web-server/routes/proxy-routes.js +6 -6
  447. package/dist/web-server/routes/proxy-routes.js.map +1 -1
  448. package/dist/web-server/routes/route-helpers.d.ts.map +1 -1
  449. package/dist/web-server/routes/route-helpers.js +7 -6
  450. package/dist/web-server/routes/route-helpers.js.map +1 -1
  451. package/dist/web-server/routes/settings-routes.d.ts.map +1 -1
  452. package/dist/web-server/routes/settings-routes.js +8 -9
  453. package/dist/web-server/routes/settings-routes.js.map +1 -1
  454. package/dist/web-server/routes/websearch-routes.d.ts.map +1 -1
  455. package/dist/web-server/routes/websearch-routes.js +4 -4
  456. package/dist/web-server/routes/websearch-routes.js.map +1 -1
  457. package/dist/web-server/services/claude-extension-binding-service.js +2 -2
  458. package/dist/web-server/services/claude-extension-binding-service.js.map +1 -1
  459. package/dist/web-server/services/logs-dashboard-service.d.ts.map +1 -1
  460. package/dist/web-server/services/logs-dashboard-service.js +2 -2
  461. package/dist/web-server/services/logs-dashboard-service.js.map +1 -1
  462. package/dist/web-server/shared-routes.d.ts.map +1 -1
  463. package/dist/web-server/shared-routes.js +4 -4
  464. package/dist/web-server/shared-routes.js.map +1 -1
  465. package/dist/web-server/usage/aggregator.d.ts.map +1 -1
  466. package/dist/web-server/usage/aggregator.js +2 -2
  467. package/dist/web-server/usage/aggregator.js.map +1 -1
  468. package/dist/web-server/usage/cliproxy-usage-syncer.d.ts.map +1 -1
  469. package/dist/web-server/usage/cliproxy-usage-syncer.js +2 -2
  470. package/dist/web-server/usage/cliproxy-usage-syncer.js.map +1 -1
  471. package/dist/web-server/usage/disk-cache.js +2 -2
  472. package/dist/web-server/usage/disk-cache.js.map +1 -1
  473. package/package.json +1 -1
package/dist/ccs.js CHANGED
@@ -25,457 +25,46 @@ 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 fs = __importStar(require("fs"));
29
- const claude_detector_1 = require("./utils/claude-detector");
30
- const config_manager_1 = require("./utils/config-manager");
31
- const helpers_1 = require("./utils/helpers");
32
- const api_key_validator_1 = require("./utils/api-key-validator");
33
28
  const error_manager_1 = require("./utils/error-manager");
34
- const cliproxy_1 = require("./cliproxy");
35
- const env_builder_1 = require("./cliproxy/config/env-builder");
36
- const port_manager_1 = require("./cliproxy/config/port-manager");
37
- const websearch_manager_1 = require("./utils/websearch-manager");
38
- const image_analysis_1 = require("./utils/image-analysis");
39
- const browser_1 = require("./utils/browser");
40
- const unified_config_loader_1 = require("./config/unified-config-loader");
41
- const image_analyzer_profile_hook_injector_1 = require("./utils/hooks/image-analyzer-profile-hook-injector");
42
- const hooks_1 = require("./utils/hooks");
43
29
  const ui_1 = require("./utils/ui");
44
- const constants_1 = require("./copilot/constants");
45
- const official_channels_runtime_1 = require("./channels/official-channels-runtime");
46
- const official_channels_store_1 = require("./channels/official-channels-store");
47
- const constants_2 = require("./cursor/constants");
48
- const provider_capabilities_1 = require("./cliproxy/provider-capabilities");
49
30
  // Import centralized error handling
50
31
  const errors_1 = require("./errors");
51
- const root_command_router_1 = require("./commands/root-command-router");
52
- // Import extracted utility functions
53
- const shell_executor_1 = require("./utils/shell-executor");
54
- const glmt_deprecation_1 = require("./utils/glmt-deprecation");
55
- const openai_compat_launch_settings_1 = require("./utils/openai-compat-launch-settings");
56
- const resume_lane_warning_1 = require("./auth/resume-lane-warning");
57
32
  const logging_1 = require("./services/logging");
58
- const browser_codex_overrides_1 = require("./utils/browser-codex-overrides");
59
33
  // Import target adapter system
60
34
  const targets_1 = require("./targets");
61
- const target_resolver_1 = require("./targets/target-resolver");
62
- const droid_reasoning_runtime_1 = require("./targets/droid-reasoning-runtime");
63
- const droid_command_router_1 = require("./targets/droid-command-router");
64
- const cliproxy_profile_bridge_1 = require("./api/services/cliproxy-profile-bridge");
65
- const proxy_1 = require("./proxy");
66
- // Version and Update check utilities
67
- const version_1 = require("./utils/version");
68
- const update_checker_1 = require("./utils/update-checker");
69
- const CODEX_RUNTIME_REASONING_LEVELS = new Set(['minimal', 'low', 'medium', 'high', 'xhigh']);
70
- const CODEX_NATIVE_PASSTHROUGH_FLAGS = new Set(['--help', '-h', '--version', '-v']);
71
- const NATIVE_CLAUDE_EFFORT_LEVELS = ['low', 'medium', 'high', 'xhigh', 'max'];
72
- const NATIVE_CLAUDE_EFFORT_LEVEL_SET = new Set(NATIVE_CLAUDE_EFFORT_LEVELS);
73
- function resolveCodexRuntimeConfigOverrides(target, browserLaunchOverride) {
74
- if (target !== 'codex') {
75
- return [];
76
- }
77
- const codexBrowserExposure = (0, browser_1.resolveBrowserExposure)((0, unified_config_loader_1.getBrowserConfig)().codex, browserLaunchOverride);
78
- if (!codexBrowserExposure.exposeForLaunch) {
79
- return [];
80
- }
81
- return (0, browser_codex_overrides_1.buildCodexBrowserMcpOverrides)();
82
- }
83
- /**
84
- * Smart profile detection
85
- */
86
- function detectProfile(args) {
87
- if (args.length === 0 || args[0].startsWith('-')) {
88
- // No args or first arg is a flag → use default profile
89
- return { profile: 'default', remainingArgs: args };
90
- }
91
- else {
92
- // First arg doesn't start with '-' → treat as profile name
93
- return { profile: args[0], remainingArgs: args.slice(1) };
94
- }
95
- }
96
- function normalizeLegacyCursorArgs(args) {
97
- if (args[0] === 'legacy' && args[1] === 'cursor') {
98
- return [constants_2.LEGACY_CURSOR_PROFILE_NAME, ...args.slice(2)];
99
- }
100
- return args;
101
- }
102
- function printCursorLegacySubcommandDeprecation(subcommand) {
103
- console.error((0, ui_1.info)(`\`ccs cursor ${subcommand}\` is deprecated for the legacy Cursor IDE bridge.`));
104
- console.error((0, ui_1.info)(`Use \`ccs legacy cursor ${subcommand}\` for the old bridge, or \`ccs cursor --auth|--accounts|--config\` for the CLIProxy provider.`));
105
- console.error('');
106
- }
107
- function resolveRuntimeReasoningFlags(args, envThinkingValue) {
108
- const runtime = (0, droid_reasoning_runtime_1.resolveDroidReasoningRuntime)(args, envThinkingValue);
109
- if (runtime.duplicateDisplays.length > 0) {
110
- console.error((0, ui_1.warn)(`[!] Multiple reasoning flags detected. Using first occurrence: ${runtime.sourceDisplay || '<first-flag>'}`));
111
- }
112
- return {
113
- argsWithoutReasoningFlags: runtime.argsWithoutReasoningFlags,
114
- reasoningOverride: runtime.reasoningOverride,
115
- reasoningSource: runtime.sourceFlag
116
- ? 'flag'
117
- : runtime.reasoningOverride !== undefined
118
- ? 'env'
119
- : undefined,
120
- sourceDisplay: runtime.sourceDisplay,
121
- };
122
- }
123
- function normalizeCodexRuntimeReasoningOverride(value) {
124
- return typeof value === 'string' && CODEX_RUNTIME_REASONING_LEVELS.has(value) ? value : undefined;
125
- }
126
- function exitWithRuntimeReasoningFlagError(message, options) {
127
- console.error((0, ui_1.fail)(message));
128
- console.error(' Examples: --thinking low, --thinking 8192, --thinking off');
129
- console.error(` Codex alias: --effort ${options.codexAliasLevels}`);
130
- if (options.includeDroidExecExample) {
131
- console.error(' Droid exec: --reasoning-effort high');
132
- }
133
- process.exit(1);
134
- }
135
- function normalizeNativeClaudeEffortArgs(args) {
136
- const normalizedArgs = [];
137
- const allowedValues = NATIVE_CLAUDE_EFFORT_LEVELS.join(', ');
138
- for (let i = 0; i < args.length; i++) {
139
- const arg = args[i];
140
- if (arg === '--effort') {
141
- const rawValue = args[i + 1];
142
- if (!rawValue || rawValue.startsWith('-') || !rawValue.trim()) {
143
- throw new Error(`--effort requires a value: ${allowedValues}`);
144
- }
145
- const value = rawValue.toLowerCase();
146
- if (!NATIVE_CLAUDE_EFFORT_LEVEL_SET.has(value)) {
147
- throw new Error(`Invalid --effort value: ${rawValue}. Expected one of: ${allowedValues}.`);
148
- }
149
- normalizedArgs.push(arg, value);
150
- i++;
151
- continue;
152
- }
153
- if (arg.startsWith('--effort=')) {
154
- const rawValue = arg.slice('--effort='.length);
155
- if (!rawValue.trim()) {
156
- throw new Error(`--effort requires a value: ${allowedValues}`);
157
- }
158
- const value = rawValue.toLowerCase();
159
- if (!NATIVE_CLAUDE_EFFORT_LEVEL_SET.has(value)) {
160
- throw new Error(`Invalid --effort value: ${rawValue}. Expected one of: ${allowedValues}.`);
161
- }
162
- normalizedArgs.push(`--effort=${value}`);
163
- continue;
164
- }
165
- normalizedArgs.push(arg);
166
- }
167
- return normalizedArgs;
168
- }
169
- function shouldNormalizeNativeClaudeEffort(profileType) {
170
- return profileType === 'default' || profileType === 'account' || profileType === 'settings';
171
- }
172
- /**
173
- * Perform background update check (refreshes cache, no notification)
174
- */
175
- async function refreshUpdateCache() {
176
- try {
177
- const currentVersion = (0, version_1.getVersion)();
178
- // npm is now the only supported installation method
179
- await (0, update_checker_1.checkForUpdates)(currentVersion, true, 'npm');
180
- }
181
- catch (_e) {
182
- // Silently fail - update check shouldn't crash main CLI
183
- }
184
- }
185
- /**
186
- * Show update notification if cached result indicates update available
187
- * Returns true if notification was shown
188
- */
189
- async function showCachedUpdateNotification() {
190
- try {
191
- const currentVersion = (0, version_1.getVersion)();
192
- const updateInfo = (0, update_checker_1.checkCachedUpdate)(currentVersion);
193
- if (updateInfo) {
194
- await (0, update_checker_1.showUpdateNotification)(updateInfo);
195
- return true;
196
- }
197
- }
198
- catch (_e) {
199
- // Silently fail
200
- }
201
- return false;
202
- }
203
- function resolveNativeClaudeLaunchArgs(args, profileType, targetConfigDir) {
204
- const config = (0, unified_config_loader_1.getOfficialChannelsConfig)();
205
- const environment = (0, official_channels_runtime_1.getOfficialChannelsEnvironmentStatus)(targetConfigDir ? { CLAUDE_CONFIG_DIR: targetConfigDir } : undefined);
206
- const channelReadiness = {
207
- telegram: (0, official_channels_store_1.getOfficialChannelReadiness)('telegram'),
208
- discord: (0, official_channels_store_1.getOfficialChannelReadiness)('discord'),
209
- imessage: !(0, official_channels_runtime_1.officialChannelRequiresMacOS)('imessage') || process.platform === 'darwin',
210
- };
211
- const plan = (0, official_channels_runtime_1.resolveOfficialChannelsLaunchPlan)({
212
- args,
213
- config,
214
- target: 'claude',
215
- profileType,
216
- environment,
217
- channelReadiness,
218
- });
219
- for (const message of plan.skippedMessages) {
220
- console.error((0, ui_1.warn)(message));
221
- }
222
- if (config.selected.length > 0 &&
223
- environment.auth.state === 'eligible' &&
224
- environment.auth.orgRequirementMessage) {
225
- console.error((0, ui_1.warn)(environment.auth.orgRequirementMessage));
226
- }
227
- if (!plan.applied) {
228
- return args;
229
- }
230
- return (0, official_channels_runtime_1.buildOfficialChannelsArgs)(args, plan.appliedChannels, plan.wantsPermissionBypass);
231
- }
232
- function shouldPassthroughNativeCodexFlagCommand(args) {
233
- return getNativeCodexPassthroughArgs(args) !== null;
234
- }
235
- function getNativeCodexPassthroughArgs(args) {
236
- const targetArgs = (0, target_resolver_1.stripTargetFlag)(args);
237
- if ((0, target_resolver_1.resolveTargetType)(args) !== 'codex' || targetArgs.length === 0) {
238
- return null;
239
- }
240
- const firstArg = targetArgs[0] || '';
241
- if (CODEX_NATIVE_PASSTHROUGH_FLAGS.has(firstArg)) {
242
- return targetArgs;
243
- }
244
- const secondArg = targetArgs[1] || '';
245
- if (firstArg === 'codex' && CODEX_NATIVE_PASSTHROUGH_FLAGS.has(secondArg)) {
246
- return targetArgs.slice(1);
247
- }
248
- return null;
249
- }
250
- function execNativeCodexFlagCommand(args) {
251
- const adapter = (0, targets_1.getTarget)('codex');
252
- if (!adapter) {
253
- console.error((0, ui_1.fail)('Target adapter not found for "codex"'));
254
- process.exit(1);
255
- }
256
- const binaryInfo = adapter.detectBinary();
257
- if (!binaryInfo) {
258
- console.error((0, ui_1.fail)('Codex CLI not found.'));
259
- console.error((0, ui_1.info)('Install a recent @openai/codex build, then retry.'));
260
- process.exit(1);
261
- }
262
- const targetArgs = getNativeCodexPassthroughArgs(args);
263
- if (!targetArgs) {
264
- console.error((0, ui_1.fail)('Native Codex passthrough args could not be resolved.'));
265
- process.exit(1);
266
- }
267
- const creds = {
268
- profile: 'default',
269
- baseUrl: '',
270
- apiKey: '',
271
- };
272
- const builtArgs = adapter.buildArgs('default', targetArgs, {
273
- creds,
274
- profileType: 'default',
275
- binaryInfo,
276
- });
277
- const targetEnv = adapter.buildEnv(creds, 'default');
278
- adapter.exec(builtArgs, targetEnv, { binaryInfo });
279
- }
35
+ // Import extracted dispatcher modules
36
+ const cli_argument_parser_1 = require("./dispatcher/cli-argument-parser");
37
+ const target_executor_1 = require("./dispatcher/target-executor");
38
+ const pre_dispatch_1 = require("./dispatcher/pre-dispatch");
39
+ const profile_resolver_1 = require("./dispatcher/profile-resolver");
40
+ // ========== Main Execution ==========
280
41
  async function main() {
281
- // Register target adapters
42
+ // Register target adapters (singleton wiring — stays in main)
282
43
  (0, targets_1.registerTarget)(new targets_1.ClaudeAdapter());
283
44
  (0, targets_1.registerTarget)(new targets_1.DroidAdapter());
284
45
  (0, targets_1.registerTarget)(new targets_1.CodexAdapter());
285
46
  const cliLogger = (0, logging_1.createLogger)('cli');
286
- let args = process.argv.slice(2);
287
- const isCompletionCommand = args[0] === '__complete';
288
- // Initialize UI colors early to ensure consistent colored output
289
- // Must happen before any status messages (ok, info, fail, etc.)
290
- if (!isCompletionCommand && process.stdout.isTTY && !process.env['CI']) {
291
- const { initUI } = await Promise.resolve().then(() => __importStar(require('./utils/ui')));
292
- await initUI();
293
- }
294
- // Parse --config-dir flag (must happen before any config loading)
295
- const configDirIdx = args.findIndex((a) => a === '--config-dir' || a.startsWith('--config-dir='));
296
- if (configDirIdx !== -1) {
297
- const arg = args[configDirIdx];
298
- let configDirValue;
299
- let spliceCount = 1;
300
- if (arg.startsWith('--config-dir=')) {
301
- configDirValue = arg.split('=').slice(1).join('=');
302
- }
303
- else {
304
- configDirValue = args[configDirIdx + 1];
305
- spliceCount = 2;
306
- }
307
- if (!configDirValue || configDirValue.startsWith('-')) {
308
- console.error((0, ui_1.fail)('--config-dir requires a path argument'));
309
- process.exit(1);
310
- }
311
- try {
312
- const stat = fs.statSync(configDirValue);
313
- if (!stat.isDirectory()) {
314
- console.error((0, ui_1.fail)(`Not a directory: ${configDirValue}`));
315
- process.exit(1);
316
- }
317
- }
318
- catch {
319
- console.error((0, ui_1.fail)(`Config directory not found: ${configDirValue}`));
320
- console.error((0, ui_1.info)('Create the directory first, then copy your config files into it.'));
321
- process.exit(1);
322
- }
323
- (0, config_manager_1.setGlobalConfigDir)(configDirValue);
324
- // Security warning: cloud sync paths expose OAuth tokens
325
- const cloudService = (0, config_manager_1.detectCloudSyncPath)(configDirValue);
326
- if (!isCompletionCommand && cloudService) {
327
- console.error((0, ui_1.warn)(`CCS directory is under ${cloudService}.`));
328
- console.error(' OAuth tokens in cliproxy/auth/ will be synced to cloud.');
329
- console.error(' Consider: CCS_DIR=/path/outside/cloud ccs ...');
330
- }
331
- // Remove consumed args so they don't leak to Claude CLI
332
- args.splice(configDirIdx, spliceCount);
333
- }
334
- else if (process.env.CCS_DIR) {
335
- // Also warn for CCS_DIR env var pointing to cloud sync
336
- const cloudService = (0, config_manager_1.detectCloudSyncPath)(process.env.CCS_DIR);
337
- if (!isCompletionCommand && cloudService) {
338
- console.error((0, ui_1.warn)(`CCS directory is under ${cloudService}.`));
339
- console.error(' OAuth tokens in cliproxy/auth/ will be synced to cloud.');
340
- console.error(' Consider: CCS_DIR=/path/outside/cloud ccs ...');
341
- }
342
- }
343
- else if (process.env.CCS_HOME) {
344
- // Also warn for CCS_HOME env var pointing to cloud sync
345
- const cloudService = (0, config_manager_1.detectCloudSyncPath)(process.env.CCS_HOME);
346
- if (!isCompletionCommand && cloudService) {
347
- console.error((0, ui_1.warn)(`CCS directory is under ${cloudService}.`));
348
- console.error(' OAuth tokens in cliproxy/auth/ will be synced to cloud.');
349
- console.error(' Consider: CCS_DIR=/path/outside/cloud ccs ...');
350
- }
351
- }
352
- if (isCompletionCommand) {
353
- await (0, root_command_router_1.tryHandleRootCommand)(args);
354
- return;
355
- }
356
- args = normalizeLegacyCursorArgs(args);
357
- let browserLaunchOverride;
358
- try {
359
- const browserLaunchFlags = (0, browser_1.resolveBrowserLaunchFlagResolution)(args);
360
- browserLaunchOverride = browserLaunchFlags.override;
361
- args = browserLaunchFlags.argsWithoutFlags;
362
- }
363
- catch (error) {
364
- console.error((0, ui_1.fail)(error.message));
365
- process.exit(1);
47
+ // Phase A: bootstrap + early arg pre-parse
48
+ const bootstrap = await (0, cli_argument_parser_1.bootstrapAndParseEarlyCli)(process.argv.slice(2));
49
+ if (bootstrap.exitNow) {
366
50
  return;
367
51
  }
52
+ const args = bootstrap.args;
53
+ const browserLaunchOverride = bootstrap.browserLaunchOverride;
368
54
  cliLogger.info('command.start', 'CLI invocation started', {
369
55
  command: args[0] || 'default',
370
56
  argCount: args.length,
371
57
  flags: args.filter((arg) => arg.startsWith('-')).slice(0, 20),
372
58
  });
373
- if (shouldPassthroughNativeCodexFlagCommand(args)) {
374
- execNativeCodexFlagCommand(args);
59
+ // Phase B: pre-dispatch side-effects (update check, migrate, recovery, root commands, routing)
60
+ const preDispatchConsumed = await (0, pre_dispatch_1.runPreDispatchHandlers)({ args, cliLogger });
61
+ if (preDispatchConsumed) {
375
62
  return;
376
63
  }
377
- const firstArg = args[0];
378
- // Trigger update check early for ALL commands except version/help/update
379
- // Only if TTY and not CI to avoid noise in automated environments
380
- const skipUpdateCheck = [
381
- 'version',
382
- '--version',
383
- '-v',
384
- 'help',
385
- '--help',
386
- '-h',
387
- 'update',
388
- '--update',
389
- ];
390
- if (process.stdout.isTTY && !process.env['CI'] && !skipUpdateCheck.includes(firstArg)) {
391
- // 1. Show cached update notification (async for proper UI)
392
- await showCachedUpdateNotification();
393
- // 2. Refresh cache in background if stale (non-blocking)
394
- if ((0, update_checker_1.isCacheStale)()) {
395
- refreshUpdateCache();
396
- }
397
- }
398
- // Auto-migrate to unified config format (silent if already migrated)
399
- // Skip if user is explicitly running migrate command
400
- if (firstArg !== 'migrate') {
401
- const { autoMigrate } = await Promise.resolve().then(() => __importStar(require('./config/migration-manager')));
402
- await autoMigrate();
403
- }
404
- // Auto-recovery for missing configuration (BEFORE any early-exit commands)
405
- // This ensures ALL commands benefit from auto-recovery, not just profile-switching flow
406
- // Recovery is safe to run early - it only creates missing files with safe defaults
407
- // Wrapped in try-catch to prevent blocking --version/--help on permission errors
408
- try {
409
- const RecoveryManagerModule = await Promise.resolve().then(() => __importStar(require('./management/recovery-manager')));
410
- const RecoveryManager = RecoveryManagerModule.default;
411
- const recovery = new RecoveryManager();
412
- const recovered = recovery.recoverAll();
413
- if (recovered) {
414
- recovery.showRecoveryHints();
415
- }
416
- }
417
- catch (err) {
418
- cliLogger.warn('recovery.failed', 'Auto-recovery failed during CLI startup', {
419
- message: err.message,
420
- });
421
- // Recovery is best-effort - don't block basic CLI functionality
422
- console.warn('[!] Recovery failed:', err.message);
423
- }
424
- if (await (0, root_command_router_1.tryHandleRootCommand)(args)) {
425
- return;
426
- }
427
- if (typeof firstArg === 'string' &&
428
- (0, provider_capabilities_1.isCLIProxyProvider)(firstArg) &&
429
- args.length > 1 &&
430
- (args.includes('--help') || args.includes('-h'))) {
431
- const { showProviderShortcutHelp } = await Promise.resolve().then(() => __importStar(require('./commands/help-command')));
432
- await showProviderShortcutHelp(firstArg);
433
- return;
434
- }
435
- // Special case: copilot command (GitHub Copilot integration)
436
- // Route known subcommands to command handler, keep all other args as profile passthrough.
437
- if (firstArg === 'copilot' && args.length > 1) {
438
- const copilotToken = args[1];
439
- const shouldRouteToCopilotCommand = (0, constants_1.isCopilotSubcommandToken)(copilotToken);
440
- if (shouldRouteToCopilotCommand) {
441
- const { handleCopilotCommand } = await Promise.resolve().then(() => __importStar(require('./commands/copilot-command')));
442
- const exitCode = await handleCopilotCommand(args.slice(1));
443
- process.exit(exitCode);
444
- }
445
- }
446
- // Special case: explicit legacy Cursor bridge namespace.
447
- if (firstArg === constants_2.LEGACY_CURSOR_PROFILE_NAME && args.length > 1) {
448
- const { handleCursorCommand } = await Promise.resolve().then(() => __importStar(require('./commands/cursor-command')));
449
- const cursorToken = args[1];
450
- if ((0, constants_2.isCursorSubcommandToken)(cursorToken)) {
451
- const exitCode = await handleCursorCommand(args.slice(1));
452
- process.exit(exitCode);
453
- }
454
- }
455
- // Compatibility shim: old `ccs cursor <subcommand>` still forwards to the legacy bridge
456
- // for one migration window, but bare/positional `ccs cursor` now belongs to CLIProxy.
457
- if (firstArg === 'cursor' && args.length > 1) {
458
- const { handleCursorCommand } = await Promise.resolve().then(() => __importStar(require('./commands/cursor-command')));
459
- const cursorToken = args[1];
460
- if ((0, constants_2.isCursorSubcommandToken)(cursorToken) && cursorToken !== '--help' && cursorToken !== '-h') {
461
- printCursorLegacySubcommandDeprecation(cursorToken);
462
- const exitCode = await handleCursorCommand(args.slice(1));
463
- process.exit(exitCode);
464
- }
465
- }
466
- // First-time install: offer setup wizard for interactive users
467
- // Check independently of recovery status (user may have empty config.yaml)
468
- // Skip if headless, CI, or non-TTY environment
469
- const { isFirstTimeInstall } = await Promise.resolve().then(() => __importStar(require('./commands/setup-command')));
470
- if (process.stdout.isTTY && !process.env['CI'] && isFirstTimeInstall()) {
471
- console.log('');
472
- console.log((0, ui_1.info)('First-time install detected. Run `ccs setup` for guided configuration.'));
473
- console.log(' Or use `ccs config` for the web dashboard.');
474
- console.log('');
475
- }
476
- // Use ProfileDetector to determine profile type
477
- const ProfileDetectorModule = await Promise.resolve().then(() => __importStar(require('./auth/profile-detector')));
478
- const ProfileDetector = ProfileDetectorModule.default;
64
+ // Phase C: profile + target detection (extracted to dispatcher/profile-resolver.ts)
65
+ const resolvedProfile = await (0, profile_resolver_1.resolveProfileAndTarget)({ args, browserLaunchOverride, cliLogger });
66
+ const { profile, profileInfo, resolvedTarget, nativeClaudeRemainingArgs } = resolvedProfile;
67
+ // Dynamic imports needed by Phase E flows — preserve original load ordering.
479
68
  const InstanceManagerModule = await Promise.resolve().then(() => __importStar(require('./management/instance-manager')));
480
69
  const InstanceManager = InstanceManagerModule.default;
481
70
  const ProfileRegistryModule = await Promise.resolve().then(() => __importStar(require('./auth/profile-registry')));
@@ -484,195 +73,16 @@ async function main() {
484
73
  const { resolveAccountContextPolicy, isAccountContextMetadata } = AccountContextModule;
485
74
  const ProfileContinuityModule = await Promise.resolve().then(() => __importStar(require('./auth/profile-continuity-inheritance')));
486
75
  const { resolveProfileContinuityInheritance } = ProfileContinuityModule;
487
- const detector = new ProfileDetector();
76
+ // Build full dispatch context (Phase E)
77
+ const dispatchCtx = {
78
+ ...resolvedProfile,
79
+ InstanceManager,
80
+ ProfileRegistry,
81
+ resolveAccountContextPolicy,
82
+ isAccountContextMetadata,
83
+ resolveProfileContinuityInheritance,
84
+ };
488
85
  try {
489
- // Detect profile (strip --target flags before profile detection)
490
- const cleanArgs = (0, target_resolver_1.stripTargetFlag)(args);
491
- const { profile, remainingArgs } = detectProfile(cleanArgs);
492
- const profileInfo = detector.detectProfileType(profile);
493
- let resolvedTarget;
494
- try {
495
- resolvedTarget = (0, target_resolver_1.resolveTargetType)(args, profileInfo.target ? { target: profileInfo.target } : undefined);
496
- }
497
- catch (error) {
498
- console.error((0, ui_1.fail)(error.message));
499
- process.exit(1);
500
- return;
501
- }
502
- // Detect Claude CLI (needed for claude target and all CLIProxy-derived flows)
503
- const claudeCliRaw = (0, claude_detector_1.detectClaudeCli)();
504
- if (resolvedTarget === 'claude' && !claudeCliRaw) {
505
- await error_manager_1.ErrorManager.showClaudeNotFound();
506
- process.exit(1);
507
- }
508
- const claudeCli = claudeCliRaw || '';
509
- // Resolve non-claude target adapter once.
510
- const targetAdapter = resolvedTarget !== 'claude' ? (0, targets_1.getTarget)(resolvedTarget) : null;
511
- let resolvedSettingsPath;
512
- let resolvedSettings;
513
- let resolvedCliproxyBridge;
514
- // Preflight unsupported profile/target combinations BEFORE binary detection,
515
- // so users get the most actionable error even when the target CLI is not installed.
516
- if (resolvedTarget !== 'claude') {
517
- if (!targetAdapter) {
518
- console.error((0, ui_1.fail)(`Target adapter not found for "${resolvedTarget}"`));
519
- process.exit(1);
520
- }
521
- if (profileInfo.type === 'settings') {
522
- resolvedSettingsPath = profileInfo.settingsPath
523
- ? (0, helpers_1.expandPath)(profileInfo.settingsPath)
524
- : (0, config_manager_1.getSettingsPath)(profileInfo.name);
525
- resolvedSettings = (0, config_manager_1.loadSettings)(resolvedSettingsPath);
526
- resolvedCliproxyBridge = (0, cliproxy_profile_bridge_1.resolveCliproxyBridgeMetadata)(resolvedSettings);
527
- const compatibility = (0, targets_1.evaluateTargetRuntimeCompatibility)({
528
- target: resolvedTarget,
529
- profileType: profileInfo.type,
530
- cliproxyBridgeProvider: resolvedCliproxyBridge?.provider ?? null,
531
- });
532
- if (!compatibility.supported) {
533
- console.error((0, ui_1.fail)(compatibility.reason || `${targetAdapter.displayName} does not support this profile.`));
534
- if (compatibility.suggestion) {
535
- console.error((0, ui_1.info)(compatibility.suggestion));
536
- }
537
- process.exit(1);
538
- }
539
- }
540
- else {
541
- const compatibility = (0, targets_1.evaluateTargetRuntimeCompatibility)({
542
- target: resolvedTarget,
543
- profileType: profileInfo.type,
544
- cliproxyProvider: profileInfo.type === 'cliproxy' ? profileInfo.provider : undefined,
545
- isComposite: profileInfo.type === 'cliproxy' ? Boolean(profileInfo.isComposite) : undefined,
546
- });
547
- if (!compatibility.supported) {
548
- console.error((0, ui_1.fail)(compatibility.reason || `${targetAdapter.displayName} does not support this profile.`));
549
- if (compatibility.suggestion) {
550
- console.error((0, ui_1.info)(compatibility.suggestion));
551
- }
552
- process.exit(1);
553
- }
554
- }
555
- if (profileInfo.type === 'default') {
556
- if (!targetAdapter.supportsProfileType('default')) {
557
- console.error((0, ui_1.fail)(`${targetAdapter.displayName} does not support default profile mode`));
558
- process.exit(1);
559
- }
560
- // For default mode, Droid requires explicit credentials from environment.
561
- if (resolvedTarget === 'droid') {
562
- const baseUrl = process.env['ANTHROPIC_BASE_URL'] || '';
563
- const apiKey = process.env['ANTHROPIC_AUTH_TOKEN'] || '';
564
- if (!baseUrl.trim() || !apiKey.trim()) {
565
- console.error((0, ui_1.fail)(`${targetAdapter.displayName} default mode requires ANTHROPIC_BASE_URL and ANTHROPIC_AUTH_TOKEN`));
566
- console.error((0, ui_1.info)('Use a settings-based profile instead: ccs glm --target droid'));
567
- process.exit(1);
568
- }
569
- }
570
- }
571
- }
572
- // For non-claude targets, verify target binary exists once and pass it through.
573
- const targetBinaryInfo = targetAdapter?.detectBinary() ?? null;
574
- const browserConfig = (0, unified_config_loader_1.getBrowserConfig)();
575
- const claudeAttachConfig = resolvedTarget === 'claude'
576
- ? (0, browser_1.getEffectiveClaudeBrowserAttachConfig)(browserConfig)
577
- : undefined;
578
- const codexRuntimeConfigOverrides = resolveCodexRuntimeConfigOverrides(resolvedTarget, browserLaunchOverride);
579
- const claudeBrowserExposure = resolvedTarget === 'claude'
580
- ? (0, browser_1.resolveBrowserExposure)({
581
- enabled: claudeAttachConfig?.enabled ?? browserConfig.claude.enabled,
582
- policy: browserConfig.claude.policy,
583
- }, browserLaunchOverride)
584
- : undefined;
585
- const codexBrowserExposure = resolvedTarget === 'codex'
586
- ? (0, browser_1.resolveBrowserExposure)(browserConfig.codex, browserLaunchOverride)
587
- : undefined;
588
- const blockedBrowserOverrideWarning = resolvedTarget === 'claude' && claudeBrowserExposure
589
- ? (0, browser_1.getBlockedBrowserOverrideWarning)('Claude Browser Attach', claudeBrowserExposure)
590
- : resolvedTarget === 'codex' && codexBrowserExposure
591
- ? (0, browser_1.getBlockedBrowserOverrideWarning)('Codex Browser Tools', codexBrowserExposure)
592
- : undefined;
593
- if (blockedBrowserOverrideWarning) {
594
- console.error((0, ui_1.warn)(blockedBrowserOverrideWarning));
595
- }
596
- if (resolvedTarget !== 'claude' && !targetBinaryInfo) {
597
- const displayName = targetAdapter?.displayName || resolvedTarget;
598
- console.error((0, ui_1.fail)(`${displayName} CLI not found.`));
599
- if (resolvedTarget === 'droid') {
600
- console.error((0, ui_1.info)('Install: npm i -g @factory/cli'));
601
- }
602
- else if (resolvedTarget === 'codex') {
603
- console.error((0, ui_1.info)('Install a recent @openai/codex build, then retry.'));
604
- }
605
- process.exit(1);
606
- }
607
- // Best-effort: prune stale Droid model entries at runtime so settings.json stays clean.
608
- if (resolvedTarget === 'droid') {
609
- try {
610
- const allProfiles = detector.getAllProfiles();
611
- const activeProfiles = allProfiles.settings.filter((name) => /^[a-zA-Z0-9._-]+$/.test(name));
612
- await (0, targets_1.pruneOrphanedModels)(activeProfiles);
613
- }
614
- catch (error) {
615
- console.error((0, ui_1.warn)(`[!] Droid prune skipped: ${error.message}`));
616
- }
617
- }
618
- let targetRemainingArgs = remainingArgs;
619
- let runtimeReasoningOverride;
620
- let nativeClaudeRemainingArgs = remainingArgs;
621
- if (resolvedTarget === 'droid') {
622
- try {
623
- const droidRoute = (0, droid_command_router_1.routeDroidCommandArgs)(remainingArgs);
624
- targetRemainingArgs = droidRoute.argsForDroid;
625
- if (droidRoute.mode === 'interactive') {
626
- const runtime = resolveRuntimeReasoningFlags(remainingArgs, process.env.CCS_THINKING);
627
- targetRemainingArgs = runtime.argsWithoutReasoningFlags;
628
- runtimeReasoningOverride = runtime.reasoningOverride;
629
- }
630
- else {
631
- if (droidRoute.duplicateReasoningDisplays.length > 0) {
632
- console.error((0, ui_1.warn)(`[!] Multiple reasoning flags detected. Using first occurrence: ${droidRoute.reasoningSourceDisplay || '<first-flag>'}`));
633
- }
634
- if (droidRoute.autoPrependedExec && process.stdout.isTTY) {
635
- console.error((0, ui_1.info)('Detected Droid exec-only flags. Routing as: droid exec <flags> [prompt]'));
636
- }
637
- }
638
- }
639
- catch (error) {
640
- if (error instanceof droid_reasoning_runtime_1.DroidReasoningFlagError || error instanceof droid_command_router_1.DroidCommandRouterError) {
641
- exitWithRuntimeReasoningFlagError(error.message, {
642
- codexAliasLevels: 'minimal|low|medium|high|xhigh',
643
- includeDroidExecExample: true,
644
- });
645
- }
646
- throw error;
647
- }
648
- }
649
- else if (resolvedTarget === 'codex') {
650
- try {
651
- const runtime = resolveRuntimeReasoningFlags(remainingArgs, process.env.CCS_THINKING);
652
- targetRemainingArgs = runtime.argsWithoutReasoningFlags;
653
- const normalizedReasoning = normalizeCodexRuntimeReasoningOverride(runtime.reasoningOverride);
654
- if (runtime.reasoningOverride !== undefined && !normalizedReasoning) {
655
- if (runtime.reasoningSource === 'flag') {
656
- throw new droid_reasoning_runtime_1.DroidReasoningFlagError('Codex target supports reasoning levels only: minimal, low, medium, high, xhigh.', '--effort');
657
- }
658
- runtimeReasoningOverride = undefined;
659
- }
660
- else {
661
- runtimeReasoningOverride = normalizedReasoning;
662
- }
663
- }
664
- catch (error) {
665
- if (error instanceof droid_reasoning_runtime_1.DroidReasoningFlagError) {
666
- exitWithRuntimeReasoningFlagError(error.message, {
667
- codexAliasLevels: 'minimal|low|medium|high|xhigh',
668
- });
669
- }
670
- throw error;
671
- }
672
- }
673
- else if (resolvedTarget === 'claude' && shouldNormalizeNativeClaudeEffort(profileInfo.type)) {
674
- nativeClaudeRemainingArgs = normalizeNativeClaudeEffortArgs(remainingArgs);
675
- }
676
86
  // Special case: headless delegation (-p/--prompt)
677
87
  // Keep existing behavior for Claude targets only; non-claude targets must continue
678
88
  // through normal adapter dispatch logic.
@@ -685,645 +95,8 @@ async function main() {
685
95
  return;
686
96
  }
687
97
  }
688
- if (profileInfo.type === 'cliproxy') {
689
- // CLIPROXY FLOW: OAuth-based profiles (gemini, codex, agy, qwen) or user-defined variants
690
- const imageAnalysisMcpReady = resolvedTarget === 'claude' ? (0, image_analysis_1.ensureImageAnalysisMcpOrThrow)() : true;
691
- if (resolvedTarget === 'claude') {
692
- (0, websearch_manager_1.ensureWebSearchMcpOrThrow)();
693
- }
694
- const provider = profileInfo.provider || profileInfo.name;
695
- const expandedCliproxySettingsPath = profileInfo.settingsPath
696
- ? (0, helpers_1.expandPath)(profileInfo.settingsPath)
697
- : undefined;
698
- if (resolvedTarget === 'claude') {
699
- if (imageAnalysisMcpReady) {
700
- (0, image_analyzer_profile_hook_injector_1.removeImageAnalysisProfileHook)(profileInfo.name, expandedCliproxySettingsPath);
701
- }
702
- else {
703
- const imageAnalysisFallbackHookReady = (0, hooks_1.prepareImageAnalysisFallbackHook)();
704
- (0, image_analyzer_profile_hook_injector_1.ensureProfileHooks)({
705
- profileName: profileInfo.name,
706
- profileType: profileInfo.type,
707
- cliproxyProvider: provider,
708
- isComposite: profileInfo.isComposite,
709
- settingsPath: expandedCliproxySettingsPath,
710
- sharedHookInstalled: imageAnalysisFallbackHookReady,
711
- });
712
- }
713
- }
714
- const customSettingsPath = profileInfo.settingsPath; // undefined for hardcoded profiles
715
- const variantPort = profileInfo.port; // variant-specific port for isolation
716
- const cliproxyPort = variantPort || port_manager_1.CLIPROXY_DEFAULT_PORT;
717
- if (resolvedTarget !== 'claude') {
718
- const adapter = targetAdapter;
719
- if (!adapter) {
720
- console.error((0, ui_1.fail)(`Target adapter not found for "${resolvedTarget}"`));
721
- process.exitCode = 1;
722
- return;
723
- }
724
- if (!adapter.supportsProfileType('cliproxy')) {
725
- console.error((0, ui_1.fail)(`${adapter.displayName} does not support CLIProxy profiles`));
726
- process.exitCode = 1;
727
- return;
728
- }
729
- // Keep CLIProxy management/auth flags on Claude flow only.
730
- const unsupportedCliproxyFlags = [
731
- '--auth',
732
- '--logout',
733
- '--accounts',
734
- '--add',
735
- '--use',
736
- '--config',
737
- '--headless',
738
- '--paste-callback',
739
- '--port-forward',
740
- '--nickname',
741
- '--kiro-auth-method',
742
- '--kiro-idc-start-url',
743
- '--kiro-idc-region',
744
- '--kiro-idc-flow',
745
- '--backend',
746
- '--proxy-host',
747
- '--proxy-port',
748
- '--proxy-protocol',
749
- '--proxy-auth-token',
750
- '--proxy-timeout',
751
- '--local-proxy',
752
- '--remote-only',
753
- '--no-fallback',
754
- '--allow-self-signed',
755
- '--1m',
756
- '--no-1m',
757
- ];
758
- const providedUnsupportedFlag = unsupportedCliproxyFlags.find((flag) => targetRemainingArgs.includes(flag) ||
759
- targetRemainingArgs.some((arg) => arg.startsWith(`${flag}=`)));
760
- if (providedUnsupportedFlag) {
761
- console.error((0, ui_1.fail)(`${providedUnsupportedFlag} is only supported when running CLIProxy profiles on Claude target`));
762
- console.error((0, ui_1.info)(`Run with Claude target: ccs ${profileInfo.name} --target claude ...`));
763
- process.exitCode = 1;
764
- return;
765
- }
766
- // For Droid execution path, require existing OAuth auth and running local proxy.
767
- if (profileInfo.isComposite && profileInfo.compositeTiers) {
768
- const compositeProviders = [
769
- ...new Set(Object.values(profileInfo.compositeTiers).map((tier) => tier.provider)),
770
- ];
771
- const missingProvider = compositeProviders.find((p) => !(0, cliproxy_1.isAuthenticated)(p));
772
- if (missingProvider) {
773
- console.error((0, ui_1.fail)(`Missing OAuth auth for composite tier provider: ${missingProvider}`));
774
- console.error((0, ui_1.info)(`Authenticate first: ccs ${missingProvider} --auth`));
775
- process.exitCode = 1;
776
- return;
777
- }
778
- }
779
- else if (!(0, cliproxy_1.isAuthenticated)(provider)) {
780
- console.error((0, ui_1.fail)(`No OAuth authentication found for provider: ${provider}`));
781
- console.error((0, ui_1.info)(`Authenticate first: ccs ${provider} --auth`));
782
- process.exitCode = 1;
783
- return;
784
- }
785
- const ensureServiceResult = await (0, cliproxy_1.ensureCliproxyService)(cliproxyPort, targetRemainingArgs.includes('--verbose') || targetRemainingArgs.includes('-v'));
786
- if (!ensureServiceResult.started) {
787
- console.error((0, ui_1.fail)(ensureServiceResult.error || 'Failed to start local CLIProxy service'));
788
- process.exitCode = 1;
789
- return;
790
- }
791
- const envVars = profileInfo.isComposite && profileInfo.compositeTiers && profileInfo.compositeDefaultTier
792
- ? (0, env_builder_1.getCompositeEnvVars)(profileInfo.compositeTiers, profileInfo.compositeDefaultTier, cliproxyPort, customSettingsPath)
793
- : (0, env_builder_1.getEffectiveEnvVars)(provider, cliproxyPort, customSettingsPath);
794
- const creds = {
795
- profile: profileInfo.name,
796
- baseUrl: envVars['ANTHROPIC_BASE_URL'] || '',
797
- apiKey: envVars['ANTHROPIC_AUTH_TOKEN'] || '',
798
- model: envVars['ANTHROPIC_MODEL'] || undefined,
799
- provider: (0, targets_1.resolveDroidProvider)({
800
- provider: envVars['CCS_DROID_PROVIDER'] || envVars['DROID_PROVIDER'],
801
- baseUrl: envVars['ANTHROPIC_BASE_URL'],
802
- model: envVars['ANTHROPIC_MODEL'],
803
- }),
804
- reasoningOverride: runtimeReasoningOverride,
805
- runtimeConfigOverrides: codexRuntimeConfigOverrides,
806
- envVars,
807
- };
808
- if (!creds.baseUrl || !creds.apiKey) {
809
- console.error((0, ui_1.fail)(`Missing CLIProxy runtime credentials for ${profileInfo.name} (ANTHROPIC_BASE_URL/AUTH_TOKEN)`));
810
- console.error((0, ui_1.info)('Reconfigure with: ccs config > CLIProxy, or run ccs <provider> --config'));
811
- process.exitCode = 1;
812
- return;
813
- }
814
- await adapter.prepareCredentials(creds);
815
- const targetArgs = adapter.buildArgs(profileInfo.name, targetRemainingArgs, {
816
- creds,
817
- profileType: profileInfo.type,
818
- binaryInfo: targetBinaryInfo || undefined,
819
- });
820
- const targetEnv = adapter.buildEnv(creds, profileInfo.type);
821
- adapter.exec(targetArgs, targetEnv, { binaryInfo: targetBinaryInfo || undefined });
822
- return;
823
- }
824
- await (0, cliproxy_1.execClaudeWithCLIProxy)(claudeCli, provider, remainingArgs, {
825
- customSettingsPath,
826
- port: cliproxyPort,
827
- isComposite: profileInfo.isComposite,
828
- compositeTiers: profileInfo.compositeTiers,
829
- compositeDefaultTier: profileInfo.compositeDefaultTier,
830
- profileName: profileInfo.name,
831
- });
832
- }
833
- else if (profileInfo.type === 'copilot') {
834
- // COPILOT FLOW: GitHub Copilot subscription via copilot-api proxy
835
- (0, websearch_manager_1.ensureWebSearchMcpOrThrow)();
836
- const imageAnalysisMcpReady = (0, image_analysis_1.ensureImageAnalysisMcpOrThrow)();
837
- if (resolvedTarget === 'claude') {
838
- if (imageAnalysisMcpReady) {
839
- (0, image_analyzer_profile_hook_injector_1.removeImageAnalysisProfileHook)(profileInfo.name);
840
- }
841
- else {
842
- const imageAnalysisFallbackHookReady = (0, hooks_1.prepareImageAnalysisFallbackHook)();
843
- (0, image_analyzer_profile_hook_injector_1.ensureProfileHooks)({
844
- profileName: profileInfo.name,
845
- profileType: profileInfo.type,
846
- sharedHookInstalled: imageAnalysisFallbackHookReady,
847
- });
848
- }
849
- }
850
- const { executeCopilotProfile } = await Promise.resolve().then(() => __importStar(require('./copilot')));
851
- const copilotConfig = profileInfo.copilotConfig;
852
- if (!copilotConfig) {
853
- console.error((0, ui_1.fail)('Copilot configuration not found'));
854
- process.exit(1);
855
- }
856
- const continuityInheritance = await resolveProfileContinuityInheritance({
857
- profileName: profileInfo.name,
858
- profileType: profileInfo.type,
859
- target: resolvedTarget,
860
- });
861
- if (continuityInheritance.sourceAccount && process.env.CCS_DEBUG) {
862
- console.error((0, ui_1.info)(`Continuity inheritance active: profile "${profileInfo.name}" -> account "${continuityInheritance.sourceAccount}"`));
863
- }
864
- const exitCode = await executeCopilotProfile(copilotConfig, remainingArgs, continuityInheritance.claudeConfigDir, claudeCli);
865
- process.exit(exitCode);
866
- }
867
- else if (profileInfo.type === 'cursor') {
868
- // CURSOR FLOW: local Cursor daemon profile
869
- (0, websearch_manager_1.ensureWebSearchMcpOrThrow)();
870
- (0, hooks_1.installImageAnalyzerHook)();
871
- (0, image_analyzer_profile_hook_injector_1.ensureProfileHooks)({
872
- profileName: profileInfo.name,
873
- profileType: profileInfo.type,
874
- });
875
- const { executeCursorProfile } = await Promise.resolve().then(() => __importStar(require('./cursor')));
876
- const cursorConfig = profileInfo.cursorConfig;
877
- if (!cursorConfig) {
878
- console.error((0, ui_1.fail)('Cursor configuration not found'));
879
- process.exit(1);
880
- }
881
- const continuityInheritance = await resolveProfileContinuityInheritance({
882
- profileName: profileInfo.name,
883
- profileType: profileInfo.type,
884
- target: resolvedTarget,
885
- });
886
- if (continuityInheritance.sourceAccount && process.env.CCS_DEBUG) {
887
- console.error((0, ui_1.info)(`Continuity inheritance active: profile "${profileInfo.name}" -> account "${continuityInheritance.sourceAccount}"`));
888
- }
889
- const exitCode = await executeCursorProfile(cursorConfig, remainingArgs, continuityInheritance.claudeConfigDir, claudeCli);
890
- process.exit(exitCode);
891
- }
892
- else if (profileInfo.type === 'settings') {
893
- // Settings-based profiles (glm, glmt) are third-party providers
894
- const imageAnalysisMcpReady = resolvedTarget === 'claude' ? (0, image_analysis_1.ensureImageAnalysisMcpOrThrow)() : true;
895
- const browserAttachRuntime = resolvedTarget === 'claude' &&
896
- claudeBrowserExposure?.exposeForLaunch &&
897
- claudeAttachConfig?.enabled
898
- ? await (0, browser_1.resolveOptionalBrowserAttachRuntime)(claudeAttachConfig)
899
- : undefined;
900
- const browserRuntimeEnv = browserAttachRuntime?.runtimeEnv;
901
- if (browserAttachRuntime?.warning) {
902
- process.stderr.write(`${(0, ui_1.warn)(browserAttachRuntime.warning)}\n`);
903
- }
904
- if (resolvedTarget === 'claude') {
905
- (0, websearch_manager_1.ensureWebSearchMcpOrThrow)();
906
- if (browserRuntimeEnv) {
907
- (0, browser_1.ensureBrowserMcpOrThrow)();
908
- }
909
- }
910
- // Display WebSearch status (single line, equilibrium UX)
911
- (0, websearch_manager_1.displayWebSearchStatus)();
912
- const continuityInheritance = resolvedTarget === 'claude'
913
- ? await resolveProfileContinuityInheritance({
914
- profileName: profileInfo.name,
915
- profileType: profileInfo.type,
916
- target: resolvedTarget,
917
- })
918
- : {};
919
- if (continuityInheritance.sourceAccount && process.env.CCS_DEBUG) {
920
- console.error((0, ui_1.info)(`Continuity inheritance active: profile "${profileInfo.name}" -> account "${continuityInheritance.sourceAccount}"`));
921
- }
922
- const inheritedClaudeConfigDir = continuityInheritance.claudeConfigDir;
923
- (0, websearch_manager_1.syncWebSearchMcpToConfigDir)(inheritedClaudeConfigDir);
924
- (0, image_analysis_1.syncImageAnalysisMcpToConfigDir)(inheritedClaudeConfigDir);
925
- if (browserRuntimeEnv &&
926
- inheritedClaudeConfigDir &&
927
- !(0, browser_1.syncBrowserMcpToConfigDir)(inheritedClaudeConfigDir)) {
928
- throw new Error('Browser MCP is enabled, but CCS could not sync the browser MCP config into the inherited Claude instance.');
929
- }
930
- const expandedSettingsPath = resolvedSettingsPath ??
931
- (profileInfo.settingsPath
932
- ? (0, helpers_1.expandPath)(profileInfo.settingsPath)
933
- : (0, config_manager_1.getSettingsPath)(profileInfo.name));
934
- const settings = resolvedSettings ?? (0, config_manager_1.loadSettings)(expandedSettingsPath);
935
- const cliproxyBridge = resolvedCliproxyBridge ?? (0, cliproxy_profile_bridge_1.resolveCliproxyBridgeMetadata)(settings);
936
- let imageAnalysisFallbackHookReady;
937
- if (resolvedTarget === 'claude') {
938
- if (imageAnalysisMcpReady) {
939
- (0, image_analyzer_profile_hook_injector_1.removeImageAnalysisProfileHook)(profileInfo.name, expandedSettingsPath);
940
- }
941
- else {
942
- imageAnalysisFallbackHookReady = (0, hooks_1.prepareImageAnalysisFallbackHook)();
943
- (0, image_analyzer_profile_hook_injector_1.ensureProfileHooks)({
944
- profileName: profileInfo.name,
945
- profileType: profileInfo.type,
946
- settingsPath: expandedSettingsPath,
947
- settings,
948
- cliproxyBridge,
949
- sharedHookInstalled: imageAnalysisFallbackHookReady,
950
- });
951
- }
952
- }
953
- if (resolvedTarget !== 'claude') {
954
- const compatibility = (0, targets_1.evaluateTargetRuntimeCompatibility)({
955
- target: resolvedTarget,
956
- profileType: profileInfo.type,
957
- cliproxyBridgeProvider: cliproxyBridge?.provider ?? null,
958
- });
959
- if (!compatibility.supported) {
960
- console.error((0, ui_1.fail)(compatibility.reason ||
961
- `${targetAdapter?.displayName || resolvedTarget} does not support this profile.`));
962
- if (compatibility.suggestion) {
963
- console.error((0, ui_1.info)(compatibility.suggestion));
964
- }
965
- process.exit(1);
966
- }
967
- }
968
- const rawSettingsEnv = profileInfo.env ?? settings.env ?? {};
969
- const isDeprecatedGlmtProfile = (0, glmt_deprecation_1.isDeprecatedGlmtProfileName)(profileInfo.name);
970
- const glmtNormalization = isDeprecatedGlmtProfile
971
- ? (0, glmt_deprecation_1.normalizeDeprecatedGlmtEnv)(rawSettingsEnv)
972
- : null;
973
- const settingsEnv = glmtNormalization?.env ?? rawSettingsEnv;
974
- if (glmtNormalization) {
975
- for (const message of glmtNormalization.warnings) {
976
- console.error((0, ui_1.warn)(message));
977
- }
978
- }
979
- // Pre-flight validation for Z.AI-compatible profiles.
980
- if (profileInfo.name === 'glm' || isDeprecatedGlmtProfile) {
981
- const apiKey = settingsEnv['ANTHROPIC_AUTH_TOKEN'];
982
- if (apiKey) {
983
- const validation = await (0, api_key_validator_1.validateGlmKey)(apiKey, settingsEnv['ANTHROPIC_BASE_URL']);
984
- if (!validation.valid) {
985
- console.error('');
986
- console.error((0, ui_1.fail)(validation.error || 'API key validation failed'));
987
- if (validation.suggestion) {
988
- console.error('');
989
- console.error(validation.suggestion);
990
- }
991
- console.error('');
992
- console.error((0, ui_1.info)('To skip validation: CCS_SKIP_PREFLIGHT=1 ccs glm "prompt"'));
993
- process.exit(1);
994
- }
995
- }
996
- }
997
- if (profileInfo.name === 'mm') {
998
- const apiKey = settingsEnv['ANTHROPIC_AUTH_TOKEN'];
999
- if (apiKey) {
1000
- const validation = await (0, api_key_validator_1.validateMiniMaxKey)(apiKey, settingsEnv['ANTHROPIC_BASE_URL']);
1001
- if (!validation.valid) {
1002
- console.error('');
1003
- console.error((0, ui_1.fail)(validation.error || 'API key validation failed'));
1004
- if (validation.suggestion) {
1005
- console.error('');
1006
- console.error(validation.suggestion);
1007
- }
1008
- console.error('');
1009
- console.error((0, ui_1.info)('To skip validation: CCS_SKIP_PREFLIGHT=1 ccs mm "prompt"'));
1010
- process.exit(1);
1011
- }
1012
- }
1013
- }
1014
- // Pre-flight validation for Anthropic direct profiles (ANTHROPIC_API_KEY + no BASE_URL)
1015
- {
1016
- const anthropicApiKey = settingsEnv['ANTHROPIC_API_KEY'];
1017
- const hasBaseUrl = !!settingsEnv['ANTHROPIC_BASE_URL'];
1018
- if (anthropicApiKey && !hasBaseUrl) {
1019
- const validation = await (0, api_key_validator_1.validateAnthropicKey)(anthropicApiKey);
1020
- if (!validation.valid) {
1021
- console.error('');
1022
- console.error((0, ui_1.fail)(validation.error || 'API key validation failed'));
1023
- if (validation.suggestion) {
1024
- console.error('');
1025
- console.error(validation.suggestion);
1026
- }
1027
- console.error('');
1028
- console.error((0, ui_1.info)(`To skip validation: CCS_SKIP_PREFLIGHT=1 ccs ${profileInfo.name} "prompt"`));
1029
- process.exit(1);
1030
- }
1031
- }
1032
- }
1033
- const webSearchEnv = (0, websearch_manager_1.getWebSearchHookEnv)();
1034
- const imageAnalysisStatus = await (0, hooks_1.resolveImageAnalysisRuntimeStatus)({
1035
- profileName: profileInfo.name,
1036
- profileType: profileInfo.type,
1037
- settings,
1038
- cliproxyBridge,
1039
- sharedHookInstalled: imageAnalysisFallbackHookReady,
1040
- });
1041
- const runtimeConnection = (0, hooks_1.resolveImageAnalysisRuntimeConnection)();
1042
- let imageAnalysisEnv = (0, hooks_1.getImageAnalysisHookEnv)({
1043
- profileName: profileInfo.name,
1044
- profileType: profileInfo.type,
1045
- settings,
1046
- cliproxyBridge,
1047
- });
1048
- imageAnalysisEnv = (0, hooks_1.applyImageAnalysisRuntimeOverrides)(imageAnalysisEnv, {
1049
- backendId: imageAnalysisStatus.backendId,
1050
- model: imageAnalysisStatus.model,
1051
- runtimePath: imageAnalysisStatus.runtimePath,
1052
- baseUrl: runtimeConnection.baseUrl,
1053
- apiKey: runtimeConnection.apiKey,
1054
- allowSelfSigned: runtimeConnection.allowSelfSigned,
1055
- });
1056
- imageAnalysisEnv = {
1057
- ...imageAnalysisEnv,
1058
- CCS_IMAGE_ANALYSIS_SKIP_HOOK: resolvedTarget === 'claude' && imageAnalysisMcpReady ? '1' : '0',
1059
- };
1060
- const imageAnalysisProvider = imageAnalysisEnv['CCS_CURRENT_PROVIDER'];
1061
- if (resolvedTarget === 'claude' &&
1062
- imageAnalysisEnv['CCS_IMAGE_ANALYSIS_SKIP'] !== '1' &&
1063
- imageAnalysisProvider) {
1064
- const verboseProxyLaunch = remainingArgs.includes('--verbose') ||
1065
- remainingArgs.includes('-v') ||
1066
- targetRemainingArgs.includes('--verbose') ||
1067
- targetRemainingArgs.includes('-v');
1068
- if (imageAnalysisStatus.effectiveRuntimeMode === 'native-read') {
1069
- console.error((0, ui_1.info)(`${imageAnalysisStatus.effectiveRuntimeReason || `Image analysis via ${imageAnalysisProvider} is unavailable.`} This session will use native Read.`));
1070
- imageAnalysisEnv = {
1071
- ...imageAnalysisEnv,
1072
- CCS_CURRENT_PROVIDER: '',
1073
- CCS_IMAGE_ANALYSIS_SKIP: '1',
1074
- CCS_IMAGE_ANALYSIS_RUNTIME_PATH: '',
1075
- CCS_IMAGE_ANALYSIS_RUNTIME_BASE_URL: '',
1076
- CCS_IMAGE_ANALYSIS_RUNTIME_API_KEY: '',
1077
- CCS_IMAGE_ANALYSIS_RUNTIME_ALLOW_SELF_SIGNED: '0',
1078
- };
1079
- }
1080
- else if (imageAnalysisStatus.proxyReadiness === 'stopped') {
1081
- const ensureServiceResult = await (0, cliproxy_1.ensureCliproxyService)(port_manager_1.CLIPROXY_DEFAULT_PORT, verboseProxyLaunch);
1082
- if (!ensureServiceResult.started) {
1083
- console.error((0, ui_1.warn)(`Image analysis via ${imageAnalysisProvider} is unavailable because CCS could not start the local CLIProxy service. This session will use native Read.`));
1084
- imageAnalysisEnv = {
1085
- ...imageAnalysisEnv,
1086
- CCS_CURRENT_PROVIDER: '',
1087
- CCS_IMAGE_ANALYSIS_SKIP: '1',
1088
- };
1089
- }
1090
- }
1091
- }
1092
- // Get global env vars (DISABLE_TELEMETRY, etc.) for third-party profiles
1093
- const globalEnvConfig = (0, unified_config_loader_1.getGlobalEnvConfig)();
1094
- const globalEnv = globalEnvConfig.enabled ? globalEnvConfig.env : {};
1095
- // Log global env injection for visibility (debug mode only)
1096
- if (globalEnvConfig.enabled && Object.keys(globalEnv).length > 0 && process.env.CCS_DEBUG) {
1097
- const envNames = Object.keys(globalEnv).join(', ');
1098
- console.error((0, ui_1.info)(`Global env: ${envNames}`));
1099
- }
1100
- // For Claude target launches that already pass `--settings`, keep runtime
1101
- // env free of ANTHROPIC routing/auth while preserving non-routing profile
1102
- // env so nested Team/subagent sessions can still inherit model intent and
1103
- // other profile-scoped runtime flags.
1104
- const settingsRuntimeEnv = (0, shell_executor_1.stripBrowserEnv)({ ...globalEnv, ...settingsEnv });
1105
- const claudeRuntimeEnvVars = {
1106
- ...(0, shell_executor_1.stripAnthropicRoutingEnv)(settingsRuntimeEnv),
1107
- ...(inheritedClaudeConfigDir ? { CLAUDE_CONFIG_DIR: inheritedClaudeConfigDir } : {}),
1108
- ...webSearchEnv,
1109
- ...imageAnalysisEnv,
1110
- ...(browserRuntimeEnv || {}),
1111
- CCS_PROFILE_TYPE: 'settings',
1112
- CCS_STRIP_INHERITED_ANTHROPIC_ENV: '1',
1113
- };
1114
- // Non-Claude targets still need effective credentials injected directly.
1115
- const envVars = {
1116
- ...settingsRuntimeEnv,
1117
- ...(inheritedClaudeConfigDir ? { CLAUDE_CONFIG_DIR: inheritedClaudeConfigDir } : {}),
1118
- ...webSearchEnv,
1119
- ...imageAnalysisEnv,
1120
- ...(browserRuntimeEnv || {}),
1121
- CCS_PROFILE_TYPE: 'settings',
1122
- };
1123
- // Dispatch through target adapter for non-claude targets
1124
- if (resolvedTarget !== 'claude') {
1125
- const adapter = targetAdapter;
1126
- if (!adapter) {
1127
- console.error((0, ui_1.fail)(`Target adapter not found for "${resolvedTarget}"`));
1128
- process.exit(1);
1129
- }
1130
- const directAnthropicBaseUrl = settingsEnv['ANTHROPIC_BASE_URL'] ||
1131
- (settingsEnv['ANTHROPIC_API_KEY'] ? 'https://api.anthropic.com' : '');
1132
- const creds = {
1133
- profile: profileInfo.name,
1134
- baseUrl: directAnthropicBaseUrl,
1135
- apiKey: settingsEnv['ANTHROPIC_AUTH_TOKEN'] || settingsEnv['ANTHROPIC_API_KEY'] || '',
1136
- model: settingsEnv['ANTHROPIC_MODEL'],
1137
- provider: (0, targets_1.resolveDroidProvider)({
1138
- provider: settingsEnv['CCS_DROID_PROVIDER'] || settingsEnv['DROID_PROVIDER'],
1139
- baseUrl: directAnthropicBaseUrl,
1140
- model: settingsEnv['ANTHROPIC_MODEL'],
1141
- }),
1142
- reasoningOverride: runtimeReasoningOverride,
1143
- runtimeConfigOverrides: codexRuntimeConfigOverrides,
1144
- envVars,
1145
- };
1146
- await adapter.prepareCredentials(creds);
1147
- const targetArgs = adapter.buildArgs(profileInfo.name, targetRemainingArgs, {
1148
- creds,
1149
- profileType: profileInfo.type,
1150
- binaryInfo: targetBinaryInfo || undefined,
1151
- });
1152
- const targetEnv = adapter.buildEnv(creds, profileInfo.type);
1153
- adapter.exec(targetArgs, targetEnv, { binaryInfo: targetBinaryInfo || undefined });
1154
- return;
1155
- }
1156
- const imageAnalysisArgs = imageAnalysisMcpReady
1157
- ? (0, image_analysis_1.appendThirdPartyImageAnalysisToolArgs)(nativeClaudeRemainingArgs)
1158
- : nativeClaudeRemainingArgs;
1159
- const browserArgs = browserRuntimeEnv
1160
- ? (0, browser_1.appendBrowserToolArgs)(imageAnalysisArgs)
1161
- : imageAnalysisArgs;
1162
- const openAICompatProfile = (0, proxy_1.resolveOpenAICompatProfileConfig)(profileInfo.name, expandedSettingsPath, settingsEnv);
1163
- if (openAICompatProfile) {
1164
- const proxyStart = await (0, proxy_1.startOpenAICompatProxy)(openAICompatProfile, {
1165
- insecure: openAICompatProfile.insecure,
1166
- });
1167
- if (!proxyStart.success) {
1168
- console.error((0, ui_1.fail)(proxyStart.error || 'Failed to start local OpenAI-compatible proxy'));
1169
- process.exit(1);
1170
- }
1171
- console.error((0, ui_1.info)(`Using local OpenAI-compatible proxy for "${profileInfo.name}" on port ${proxyStart.port}`));
1172
- const proxyEnv = {
1173
- ...envVars,
1174
- ...(0, proxy_1.buildOpenAICompatProxyEnv)(openAICompatProfile, proxyStart.port, proxyStart.authToken || '', inheritedClaudeConfigDir),
1175
- };
1176
- delete proxyEnv.ANTHROPIC_API_KEY;
1177
- const launchSettings = (0, openai_compat_launch_settings_1.createOpenAICompatLaunchSettings)(expandedSettingsPath, settings);
1178
- const launchArgs = [
1179
- '--settings',
1180
- launchSettings.settingsPath,
1181
- ...(0, websearch_manager_1.appendThirdPartyWebSearchToolArgs)(browserArgs),
1182
- ];
1183
- const traceEnv = (0, websearch_manager_1.createWebSearchTraceContext)({
1184
- launcher: 'ccs.settings-profile.proxy',
1185
- args: launchArgs,
1186
- profile: profileInfo.name,
1187
- profileType: profileInfo.type,
1188
- settingsPath: expandedSettingsPath,
1189
- });
1190
- (0, shell_executor_1.execClaude)(claudeCli, launchArgs, { ...proxyEnv, ...traceEnv }, launchSettings.cleanup);
1191
- return;
1192
- }
1193
- const launchArgs = [
1194
- '--settings',
1195
- expandedSettingsPath,
1196
- ...(0, websearch_manager_1.appendThirdPartyWebSearchToolArgs)(browserArgs),
1197
- ];
1198
- const traceEnv = (0, websearch_manager_1.createWebSearchTraceContext)({
1199
- launcher: 'ccs.settings-profile',
1200
- args: launchArgs,
1201
- profile: profileInfo.name,
1202
- profileType: profileInfo.type,
1203
- settingsPath: expandedSettingsPath,
1204
- });
1205
- (0, shell_executor_1.execClaude)(claudeCli, launchArgs, { ...claudeRuntimeEnvVars, ...traceEnv });
1206
- }
1207
- else if (profileInfo.type === 'account') {
1208
- // NEW FLOW: Account-based profile (work, personal)
1209
- // All platforms: Use instance isolation with CLAUDE_CONFIG_DIR
1210
- const registry = new ProfileRegistry();
1211
- const instanceMgr = new InstanceManager();
1212
- const accountMetadata = isAccountContextMetadata(profileInfo.profile)
1213
- ? profileInfo.profile
1214
- : undefined;
1215
- const isBareProfile = typeof profileInfo.profile === 'object' &&
1216
- profileInfo.profile !== null &&
1217
- profileInfo.profile.bare === true;
1218
- const contextPolicy = resolveAccountContextPolicy(accountMetadata);
1219
- // Ensure instance exists (lazy init if needed)
1220
- const instancePath = await instanceMgr.ensureInstance(profileInfo.name, contextPolicy, {
1221
- bare: isBareProfile,
1222
- });
1223
- // Update last_used timestamp (check unified config first, fallback to legacy)
1224
- if (registry.hasAccountUnified(profileInfo.name)) {
1225
- registry.touchAccountUnified(profileInfo.name);
1226
- }
1227
- else {
1228
- registry.touchProfile(profileInfo.name);
1229
- }
1230
- // Execute Claude with instance isolation
1231
- // Skip WebSearch hook - account profiles use native server-side WebSearch
1232
- // Skip Image Analyzer hook - account profiles have native vision support
1233
- const envVars = {
1234
- CLAUDE_CONFIG_DIR: instancePath,
1235
- CCS_PROFILE_TYPE: 'account',
1236
- CCS_WEBSEARCH_SKIP: '1',
1237
- CCS_IMAGE_ANALYSIS_SKIP: '1',
1238
- };
1239
- await (0, resume_lane_warning_1.maybeWarnAboutResumeLaneMismatch)(profileInfo.name, instancePath, nativeClaudeRemainingArgs);
1240
- const launchArgs = resolveNativeClaudeLaunchArgs(nativeClaudeRemainingArgs, 'account', instancePath);
1241
- (0, shell_executor_1.execClaude)(claudeCli, launchArgs, envVars);
1242
- }
1243
- else {
1244
- // DEFAULT: No profile configured, use Claude's own defaults
1245
- // Skip WebSearch hook - native Claude has server-side WebSearch
1246
- // Skip Image Analyzer hook - native Claude has native vision support
1247
- const envVars = {
1248
- CCS_PROFILE_TYPE: 'default',
1249
- CCS_WEBSEARCH_SKIP: '1',
1250
- CCS_IMAGE_ANALYSIS_SKIP: '1',
1251
- };
1252
- const browserAttachRuntime = resolvedTarget === 'claude' &&
1253
- claudeBrowserExposure?.exposeForLaunch &&
1254
- claudeAttachConfig?.enabled
1255
- ? await (0, browser_1.resolveOptionalBrowserAttachRuntime)(claudeAttachConfig)
1256
- : undefined;
1257
- const browserRuntimeEnv = browserAttachRuntime?.runtimeEnv;
1258
- if (browserAttachRuntime?.warning) {
1259
- process.stderr.write(`${(0, ui_1.warn)(browserAttachRuntime.warning)}\n`);
1260
- }
1261
- if (resolvedTarget === 'claude') {
1262
- if (browserRuntimeEnv) {
1263
- (0, browser_1.ensureBrowserMcpOrThrow)();
1264
- Object.assign(envVars, browserRuntimeEnv);
1265
- }
1266
- const defaultContinuityInheritance = await resolveProfileContinuityInheritance({
1267
- profileName: profileInfo.name,
1268
- profileType: profileInfo.type,
1269
- target: resolvedTarget,
1270
- });
1271
- if (defaultContinuityInheritance.sourceAccount && process.env.CCS_DEBUG) {
1272
- console.error((0, ui_1.info)(`Continuity inheritance active: profile "${profileInfo.name}" -> account "${defaultContinuityInheritance.sourceAccount}"`));
1273
- }
1274
- if (defaultContinuityInheritance.claudeConfigDir) {
1275
- envVars.CLAUDE_CONFIG_DIR = defaultContinuityInheritance.claudeConfigDir;
1276
- if (browserRuntimeEnv &&
1277
- !(0, browser_1.syncBrowserMcpToConfigDir)(defaultContinuityInheritance.claudeConfigDir)) {
1278
- throw new Error('Browser MCP is enabled, but CCS could not sync the browser MCP config into the inherited Claude instance.');
1279
- }
1280
- }
1281
- }
1282
- // Dispatch through target adapter for non-claude targets
1283
- if (resolvedTarget !== 'claude') {
1284
- const adapter = targetAdapter;
1285
- if (!adapter) {
1286
- console.error((0, ui_1.fail)(`Target adapter not found for "${resolvedTarget}"`));
1287
- process.exit(1);
1288
- }
1289
- if (!adapter.supportsProfileType('default')) {
1290
- console.error((0, ui_1.fail)(`${adapter.displayName} does not support default profile mode`));
1291
- process.exit(1);
1292
- }
1293
- const creds = {
1294
- profile: 'default',
1295
- baseUrl: process.env['ANTHROPIC_BASE_URL'] || '',
1296
- apiKey: process.env['ANTHROPIC_AUTH_TOKEN'] || '',
1297
- model: process.env['ANTHROPIC_MODEL'],
1298
- provider: (0, targets_1.resolveDroidProvider)({
1299
- provider: process.env['CCS_DROID_PROVIDER'] || process.env['DROID_PROVIDER'],
1300
- baseUrl: process.env['ANTHROPIC_BASE_URL'],
1301
- model: process.env['ANTHROPIC_MODEL'],
1302
- }),
1303
- reasoningOverride: runtimeReasoningOverride,
1304
- runtimeConfigOverrides: codexRuntimeConfigOverrides,
1305
- browserRuntimeEnv,
1306
- };
1307
- if (resolvedTarget === 'droid' && (!creds.baseUrl || !creds.apiKey)) {
1308
- console.error((0, ui_1.fail)(`${adapter.displayName} default mode requires ANTHROPIC_BASE_URL and ANTHROPIC_AUTH_TOKEN`));
1309
- console.error((0, ui_1.info)('Use a settings-based profile instead: ccs glm --target droid'));
1310
- process.exit(1);
1311
- }
1312
- await adapter.prepareCredentials(creds);
1313
- const targetArgs = adapter.buildArgs('default', targetRemainingArgs, {
1314
- creds,
1315
- profileType: 'default',
1316
- binaryInfo: targetBinaryInfo || undefined,
1317
- });
1318
- const targetEnv = adapter.buildEnv(creds, 'default');
1319
- adapter.exec(targetArgs, targetEnv, { binaryInfo: targetBinaryInfo || undefined });
1320
- return;
1321
- }
1322
- const launchArgs = resolveNativeClaudeLaunchArgs(browserRuntimeEnv
1323
- ? (0, browser_1.appendBrowserToolArgs)(nativeClaudeRemainingArgs)
1324
- : nativeClaudeRemainingArgs, 'default', envVars.CLAUDE_CONFIG_DIR);
1325
- (0, shell_executor_1.execClaude)(claudeCli, launchArgs, envVars);
1326
- }
98
+ // Phase E: dispatch to per-profile-type flow (all 6 branches now live in flows/)
99
+ await (0, target_executor_1.dispatchProfile)(dispatchCtx);
1327
100
  }
1328
101
  catch (error) {
1329
102
  const err = error;