@kaitranntt/ccs 4.4.0 → 5.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (262) hide show
  1. package/README.md +14 -7
  2. package/VERSION +1 -1
  3. package/config/base-agy.settings.json +10 -0
  4. package/config/base-codex.settings.json +10 -0
  5. package/config/base-gemini.settings.json +10 -0
  6. package/dist/auth/auth-commands.d.ts +52 -0
  7. package/dist/auth/auth-commands.d.ts.map +1 -0
  8. package/dist/auth/auth-commands.js +479 -0
  9. package/dist/auth/auth-commands.js.map +1 -0
  10. package/dist/auth/profile-detector.d.ts +68 -0
  11. package/dist/auth/profile-detector.d.ts.map +1 -0
  12. package/dist/auth/profile-detector.js +209 -0
  13. package/dist/auth/profile-detector.js.map +1 -0
  14. package/dist/auth/profile-registry.d.ts +60 -0
  15. package/dist/auth/profile-registry.d.ts.map +1 -0
  16. package/dist/auth/profile-registry.js +188 -0
  17. package/dist/auth/profile-registry.js.map +1 -0
  18. package/dist/ccs.d.ts +10 -0
  19. package/dist/ccs.d.ts.map +1 -0
  20. package/dist/ccs.js +320 -0
  21. package/dist/ccs.js.map +1 -0
  22. package/dist/cliproxy/auth-handler.d.ts +93 -0
  23. package/dist/cliproxy/auth-handler.d.ts.map +1 -0
  24. package/dist/cliproxy/auth-handler.js +402 -0
  25. package/dist/cliproxy/auth-handler.js.map +1 -0
  26. package/dist/cliproxy/base-config-loader.d.ts +42 -0
  27. package/dist/cliproxy/base-config-loader.d.ts.map +1 -0
  28. package/dist/cliproxy/base-config-loader.js +123 -0
  29. package/dist/cliproxy/base-config-loader.js.map +1 -0
  30. package/dist/cliproxy/binary-manager.d.ts +104 -0
  31. package/dist/cliproxy/binary-manager.d.ts.map +1 -0
  32. package/dist/cliproxy/binary-manager.js +567 -0
  33. package/dist/cliproxy/binary-manager.js.map +1 -0
  34. package/dist/cliproxy/cliproxy-executor.d.ts +33 -0
  35. package/dist/cliproxy/cliproxy-executor.d.ts.map +1 -0
  36. package/dist/cliproxy/cliproxy-executor.js +297 -0
  37. package/dist/cliproxy/cliproxy-executor.js.map +1 -0
  38. package/dist/cliproxy/config-generator.d.ts +89 -0
  39. package/dist/cliproxy/config-generator.d.ts.map +1 -0
  40. package/dist/cliproxy/config-generator.js +263 -0
  41. package/dist/cliproxy/config-generator.js.map +1 -0
  42. package/dist/cliproxy/index.d.ts +13 -0
  43. package/dist/cliproxy/index.d.ts.map +1 -0
  44. package/dist/cliproxy/index.js +62 -0
  45. package/dist/cliproxy/index.js.map +1 -0
  46. package/dist/cliproxy/platform-detector.d.ts +48 -0
  47. package/dist/cliproxy/platform-detector.d.ts.map +1 -0
  48. package/dist/cliproxy/platform-detector.js +118 -0
  49. package/dist/cliproxy/platform-detector.js.map +1 -0
  50. package/dist/cliproxy/types.d.ts +169 -0
  51. package/dist/cliproxy/types.d.ts.map +1 -0
  52. package/dist/cliproxy/types.js +7 -0
  53. package/dist/cliproxy/types.js.map +1 -0
  54. package/dist/commands/doctor-command.d.ts +10 -0
  55. package/dist/commands/doctor-command.d.ts.map +1 -0
  56. package/dist/commands/doctor-command.js +44 -0
  57. package/dist/commands/doctor-command.js.map +1 -0
  58. package/dist/commands/help-command.d.ts +5 -0
  59. package/dist/commands/help-command.d.ts.map +1 -0
  60. package/dist/commands/help-command.js +104 -0
  61. package/dist/commands/help-command.js.map +1 -0
  62. package/dist/commands/install-command.d.ts +14 -0
  63. package/dist/commands/install-command.d.ts.map +1 -0
  64. package/dist/commands/install-command.js +39 -0
  65. package/dist/commands/install-command.js.map +1 -0
  66. package/dist/commands/shell-completion-command.d.ts +10 -0
  67. package/dist/commands/shell-completion-command.d.ts.map +1 -0
  68. package/dist/commands/shell-completion-command.js +85 -0
  69. package/dist/commands/shell-completion-command.js.map +1 -0
  70. package/dist/commands/sync-command.d.ts +10 -0
  71. package/dist/commands/sync-command.d.ts.map +1 -0
  72. package/dist/commands/sync-command.js +59 -0
  73. package/dist/commands/sync-command.js.map +1 -0
  74. package/dist/commands/update-command.d.ts +12 -0
  75. package/dist/commands/update-command.d.ts.map +1 -0
  76. package/dist/commands/update-command.js +295 -0
  77. package/dist/commands/update-command.js.map +1 -0
  78. package/dist/commands/version-command.d.ts +10 -0
  79. package/dist/commands/version-command.d.ts.map +1 -0
  80. package/dist/commands/version-command.js +100 -0
  81. package/dist/commands/version-command.js.map +1 -0
  82. package/dist/delegation/delegation-handler.d.ts +60 -0
  83. package/dist/delegation/delegation-handler.d.ts.map +1 -0
  84. package/dist/delegation/delegation-handler.js +174 -0
  85. package/dist/delegation/delegation-handler.js.map +1 -0
  86. package/dist/delegation/headless-executor.d.ts +114 -0
  87. package/dist/delegation/headless-executor.d.ts.map +1 -0
  88. package/dist/delegation/headless-executor.js +562 -0
  89. package/dist/delegation/headless-executor.js.map +1 -0
  90. package/dist/delegation/result-formatter.d.ts +108 -0
  91. package/dist/delegation/result-formatter.d.ts.map +1 -0
  92. package/dist/delegation/result-formatter.js +391 -0
  93. package/dist/delegation/result-formatter.js.map +1 -0
  94. package/dist/delegation/session-manager.d.ts +58 -0
  95. package/dist/delegation/session-manager.d.ts.map +1 -0
  96. package/dist/delegation/session-manager.js +153 -0
  97. package/dist/delegation/session-manager.js.map +1 -0
  98. package/dist/delegation/settings-parser.d.ts +31 -0
  99. package/dist/delegation/settings-parser.d.ts.map +1 -0
  100. package/dist/delegation/settings-parser.js +107 -0
  101. package/dist/delegation/settings-parser.js.map +1 -0
  102. package/dist/glmt/delta-accumulator.d.ts +210 -0
  103. package/dist/glmt/delta-accumulator.d.ts.map +1 -0
  104. package/dist/glmt/delta-accumulator.js +351 -0
  105. package/dist/glmt/delta-accumulator.js.map +1 -0
  106. package/dist/glmt/glmt-proxy.d.ts +72 -0
  107. package/dist/glmt/glmt-proxy.d.ts.map +1 -0
  108. package/dist/glmt/glmt-proxy.js +427 -0
  109. package/dist/glmt/glmt-proxy.js.map +1 -0
  110. package/dist/glmt/glmt-transformer.d.ts +265 -0
  111. package/dist/glmt/glmt-transformer.d.ts.map +1 -0
  112. package/dist/glmt/glmt-transformer.js +832 -0
  113. package/dist/glmt/glmt-transformer.js.map +1 -0
  114. package/dist/glmt/locale-enforcer.d.ts +38 -0
  115. package/dist/glmt/locale-enforcer.d.ts.map +1 -0
  116. package/dist/glmt/locale-enforcer.js +69 -0
  117. package/dist/glmt/locale-enforcer.js.map +1 -0
  118. package/dist/glmt/reasoning-enforcer.d.ts +52 -0
  119. package/dist/glmt/reasoning-enforcer.d.ts.map +1 -0
  120. package/dist/glmt/reasoning-enforcer.js +151 -0
  121. package/dist/glmt/reasoning-enforcer.js.map +1 -0
  122. package/dist/glmt/sse-parser.d.ts +47 -0
  123. package/dist/glmt/sse-parser.d.ts.map +1 -0
  124. package/dist/glmt/sse-parser.js +93 -0
  125. package/dist/glmt/sse-parser.js.map +1 -0
  126. package/dist/management/doctor.d.ts +104 -0
  127. package/dist/management/doctor.d.ts.map +1 -0
  128. package/dist/management/doctor.js +673 -0
  129. package/dist/management/doctor.js.map +1 -0
  130. package/dist/management/instance-manager.d.ts +57 -0
  131. package/dist/management/instance-manager.d.ts.map +1 -0
  132. package/dist/management/instance-manager.js +195 -0
  133. package/dist/management/instance-manager.js.map +1 -0
  134. package/dist/management/recovery-manager.d.ts +39 -0
  135. package/dist/management/recovery-manager.d.ts.map +1 -0
  136. package/dist/management/recovery-manager.js +141 -0
  137. package/dist/management/recovery-manager.js.map +1 -0
  138. package/dist/management/shared-manager.d.ts +47 -0
  139. package/dist/management/shared-manager.d.ts.map +1 -0
  140. package/dist/management/shared-manager.js +388 -0
  141. package/dist/management/shared-manager.js.map +1 -0
  142. package/dist/types/cli.d.ts +50 -0
  143. package/dist/types/cli.d.ts.map +1 -0
  144. package/dist/types/cli.js +16 -0
  145. package/dist/types/cli.js.map +1 -0
  146. package/dist/types/config.d.ts +51 -0
  147. package/dist/types/config.d.ts.map +1 -0
  148. package/dist/types/config.js +26 -0
  149. package/dist/types/config.js.map +1 -0
  150. package/dist/types/delegation.d.ts +61 -0
  151. package/dist/types/delegation.d.ts.map +1 -0
  152. package/dist/types/delegation.js +6 -0
  153. package/dist/types/delegation.js.map +1 -0
  154. package/dist/types/glmt.d.ts +95 -0
  155. package/dist/types/glmt.d.ts.map +1 -0
  156. package/dist/types/glmt.js +7 -0
  157. package/dist/types/glmt.js.map +1 -0
  158. package/dist/types/index.d.ts +13 -0
  159. package/dist/types/index.d.ts.map +1 -0
  160. package/dist/types/index.js +16 -0
  161. package/dist/types/index.js.map +1 -0
  162. package/dist/types/utils.d.ts +36 -0
  163. package/dist/types/utils.d.ts.map +1 -0
  164. package/dist/types/utils.js +22 -0
  165. package/dist/types/utils.js.map +1 -0
  166. package/dist/utils/claude-detector.d.ts +14 -0
  167. package/dist/utils/claude-detector.d.ts.map +1 -0
  168. package/dist/utils/claude-detector.js +112 -0
  169. package/dist/utils/claude-detector.js.map +1 -0
  170. package/dist/utils/claude-dir-installer.d.ts +46 -0
  171. package/dist/utils/claude-dir-installer.d.ts.map +1 -0
  172. package/dist/utils/claude-dir-installer.js +289 -0
  173. package/dist/utils/claude-dir-installer.js.map +1 -0
  174. package/dist/utils/claude-symlink-manager.d.ts +61 -0
  175. package/dist/utils/claude-symlink-manager.d.ts.map +1 -0
  176. package/dist/utils/claude-symlink-manager.js +291 -0
  177. package/dist/utils/claude-symlink-manager.js.map +1 -0
  178. package/dist/utils/config-manager.d.ts +32 -0
  179. package/dist/utils/config-manager.d.ts.map +1 -0
  180. package/dist/utils/config-manager.js +143 -0
  181. package/dist/utils/config-manager.js.map +1 -0
  182. package/dist/utils/delegation-validator.d.ts +39 -0
  183. package/dist/utils/delegation-validator.d.ts.map +1 -0
  184. package/dist/utils/delegation-validator.js +161 -0
  185. package/dist/utils/delegation-validator.js.map +1 -0
  186. package/dist/utils/error-codes.d.ts +36 -0
  187. package/dist/utils/error-codes.d.ts.map +1 -0
  188. package/dist/utils/error-codes.js +63 -0
  189. package/dist/utils/error-codes.js.map +1 -0
  190. package/dist/utils/error-manager.d.ts +59 -0
  191. package/dist/utils/error-manager.d.ts.map +1 -0
  192. package/dist/utils/error-manager.js +228 -0
  193. package/dist/utils/error-manager.js.map +1 -0
  194. package/dist/utils/helpers.d.ts +27 -0
  195. package/dist/utils/helpers.d.ts.map +1 -0
  196. package/dist/utils/helpers.js +150 -0
  197. package/dist/utils/helpers.js.map +1 -0
  198. package/dist/utils/package-manager-detector.d.ts +14 -0
  199. package/dist/utils/package-manager-detector.d.ts.map +1 -0
  200. package/dist/utils/package-manager-detector.js +162 -0
  201. package/dist/utils/package-manager-detector.js.map +1 -0
  202. package/dist/utils/progress-indicator.d.ts +52 -0
  203. package/dist/utils/progress-indicator.d.ts.map +1 -0
  204. package/dist/utils/progress-indicator.js +102 -0
  205. package/dist/utils/progress-indicator.js.map +1 -0
  206. package/dist/utils/prompt.d.ts +29 -0
  207. package/dist/utils/prompt.d.ts.map +1 -0
  208. package/dist/utils/prompt.js +116 -0
  209. package/dist/utils/prompt.js.map +1 -0
  210. package/dist/utils/shell-completion.d.ts +52 -0
  211. package/dist/utils/shell-completion.d.ts.map +1 -0
  212. package/dist/utils/shell-completion.js +231 -0
  213. package/dist/utils/shell-completion.js.map +1 -0
  214. package/dist/utils/shell-executor.d.ts +15 -0
  215. package/dist/utils/shell-executor.d.ts.map +1 -0
  216. package/dist/utils/shell-executor.js +57 -0
  217. package/dist/utils/shell-executor.js.map +1 -0
  218. package/dist/utils/update-checker.d.ts +48 -0
  219. package/dist/utils/update-checker.d.ts.map +1 -0
  220. package/dist/utils/update-checker.js +241 -0
  221. package/dist/utils/update-checker.js.map +1 -0
  222. package/lib/ccs +21 -1907
  223. package/lib/ccs.ps1 +26 -1800
  224. package/lib/error-codes.ps1 +2 -1
  225. package/lib/prompt.ps1 +2 -2
  226. package/package.json +31 -11
  227. package/scripts/add-shebang.js +39 -0
  228. package/scripts/bump-version.sh +25 -37
  229. package/scripts/dev-install.sh +32 -11
  230. package/scripts/postinstall.js +29 -29
  231. package/bin/auth/auth-commands.js +0 -499
  232. package/bin/auth/profile-detector.js +0 -204
  233. package/bin/auth/profile-registry.js +0 -225
  234. package/bin/ccs.js +0 -1034
  235. package/bin/delegation/README.md +0 -191
  236. package/bin/delegation/delegation-handler.js +0 -212
  237. package/bin/delegation/headless-executor.js +0 -618
  238. package/bin/delegation/result-formatter.js +0 -485
  239. package/bin/delegation/session-manager.js +0 -157
  240. package/bin/delegation/settings-parser.js +0 -109
  241. package/bin/glmt/delta-accumulator.js +0 -276
  242. package/bin/glmt/glmt-proxy.js +0 -495
  243. package/bin/glmt/glmt-transformer.js +0 -999
  244. package/bin/glmt/locale-enforcer.js +0 -72
  245. package/bin/glmt/reasoning-enforcer.js +0 -173
  246. package/bin/glmt/sse-parser.js +0 -96
  247. package/bin/management/doctor.js +0 -721
  248. package/bin/management/instance-manager.js +0 -202
  249. package/bin/management/recovery-manager.js +0 -135
  250. package/bin/management/shared-manager.js +0 -402
  251. package/bin/utils/claude-detector.js +0 -73
  252. package/bin/utils/claude-dir-installer.js +0 -283
  253. package/bin/utils/claude-symlink-manager.js +0 -289
  254. package/bin/utils/config-manager.js +0 -103
  255. package/bin/utils/delegation-validator.js +0 -154
  256. package/bin/utils/error-codes.js +0 -59
  257. package/bin/utils/error-manager.js +0 -165
  258. package/bin/utils/helpers.js +0 -136
  259. package/bin/utils/progress-indicator.js +0 -111
  260. package/bin/utils/prompt.js +0 -134
  261. package/bin/utils/shell-completion.js +0 -256
  262. package/bin/utils/update-checker.js +0 -243
@@ -0,0 +1,402 @@
1
+ "use strict";
2
+ /**
3
+ * Auth Handler for CLIProxyAPI
4
+ *
5
+ * Manages OAuth authentication for CLIProxy providers (Gemini, Codex, Antigravity).
6
+ * CLIProxyAPI handles OAuth internally - we just need to:
7
+ * 1. Check if auth exists (token files in CCS auth directory)
8
+ * 2. Trigger OAuth flow by spawning binary with auth flag
9
+ * 3. Auto-detect headless environments (SSH, no DISPLAY)
10
+ * 4. Use -no-browser flag for headless, display OAuth URL for manual auth
11
+ *
12
+ * Token storage: ~/.ccs/cliproxy/auth/<provider>/
13
+ * Each provider has its own directory to avoid conflicts.
14
+ */
15
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
16
+ if (k2 === undefined) k2 = k;
17
+ var desc = Object.getOwnPropertyDescriptor(m, k);
18
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
19
+ desc = { enumerable: true, get: function() { return m[k]; } };
20
+ }
21
+ Object.defineProperty(o, k2, desc);
22
+ }) : (function(o, m, k, k2) {
23
+ if (k2 === undefined) k2 = k;
24
+ o[k2] = m[k];
25
+ }));
26
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
27
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
28
+ }) : function(o, v) {
29
+ o["default"] = v;
30
+ });
31
+ var __importStar = (this && this.__importStar) || function (mod) {
32
+ if (mod && mod.__esModule) return mod;
33
+ var result = {};
34
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
35
+ __setModuleDefault(result, mod);
36
+ return result;
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.displayAuthStatus = exports.ensureAuth = exports.triggerOAuth = exports.clearAuth = exports.getAllAuthStatus = exports.getAuthStatus = exports.isAuthenticated = exports.getProviderTokenDir = exports.getOAuthConfig = void 0;
40
+ const fs = __importStar(require("fs"));
41
+ const path = __importStar(require("path"));
42
+ const child_process_1 = require("child_process");
43
+ const progress_indicator_1 = require("../utils/progress-indicator");
44
+ const config_generator_1 = require("./config-generator");
45
+ const binary_manager_1 = require("./binary-manager");
46
+ /**
47
+ * Detect if running in a headless environment (no browser available)
48
+ */
49
+ function isHeadlessEnvironment() {
50
+ // SSH session
51
+ if (process.env.SSH_TTY || process.env.SSH_CLIENT || process.env.SSH_CONNECTION) {
52
+ return true;
53
+ }
54
+ // No display (Linux/X11)
55
+ if (process.platform === 'linux' && !process.env.DISPLAY && !process.env.WAYLAND_DISPLAY) {
56
+ return true;
57
+ }
58
+ // Non-interactive (piped stdin)
59
+ if (!process.stdin.isTTY) {
60
+ return true;
61
+ }
62
+ return false;
63
+ }
64
+ /**
65
+ * OAuth configurations per provider
66
+ * Note: CLIProxyAPI handles actual OAuth - these are for display/manual flow
67
+ */
68
+ const OAUTH_CONFIGS = {
69
+ gemini: {
70
+ provider: 'gemini',
71
+ displayName: 'Google Gemini',
72
+ authUrl: 'https://accounts.google.com/o/oauth2/v2/auth',
73
+ scopes: ['https://www.googleapis.com/auth/generative-language'],
74
+ authFlag: '-login',
75
+ },
76
+ codex: {
77
+ provider: 'codex',
78
+ displayName: 'Codex',
79
+ authUrl: 'https://auth.openai.com/authorize',
80
+ scopes: ['openid', 'profile'],
81
+ authFlag: '-codex-login',
82
+ },
83
+ agy: {
84
+ provider: 'agy',
85
+ displayName: 'Antigravity',
86
+ authUrl: 'https://antigravity.ai/oauth/authorize',
87
+ scopes: ['api'],
88
+ authFlag: '-antigravity-login',
89
+ },
90
+ };
91
+ /**
92
+ * Get OAuth config for provider
93
+ */
94
+ function getOAuthConfig(provider) {
95
+ const config = OAUTH_CONFIGS[provider];
96
+ if (!config) {
97
+ throw new Error(`Unknown provider: ${provider}`);
98
+ }
99
+ return config;
100
+ }
101
+ exports.getOAuthConfig = getOAuthConfig;
102
+ /**
103
+ * Get token directory for provider
104
+ */
105
+ function getProviderTokenDir(provider) {
106
+ return (0, config_generator_1.getProviderAuthDir)(provider);
107
+ }
108
+ exports.getProviderTokenDir = getProviderTokenDir;
109
+ /**
110
+ * Provider-specific auth file prefixes
111
+ * CLIProxyAPI names auth files with provider prefix (e.g., "antigravity-user@email.json")
112
+ */
113
+ const PROVIDER_AUTH_PREFIXES = {
114
+ gemini: ['gemini-', 'google-'],
115
+ codex: ['codex-', 'openai-'],
116
+ agy: ['antigravity-', 'agy-'],
117
+ };
118
+ /**
119
+ * Check if provider has valid authentication
120
+ * CLIProxyAPI stores OAuth tokens as JSON files in the auth directory.
121
+ * Files are named with provider prefix (e.g., "antigravity-user@email.json").
122
+ * We MUST check for provider-specific files, not just any .json file.
123
+ */
124
+ function isAuthenticated(provider) {
125
+ const tokenDir = getProviderTokenDir(provider);
126
+ if (!fs.existsSync(tokenDir)) {
127
+ return false;
128
+ }
129
+ // Get valid prefixes for this provider
130
+ const validPrefixes = PROVIDER_AUTH_PREFIXES[provider] || [];
131
+ // Check for provider-specific token files
132
+ try {
133
+ const files = fs.readdirSync(tokenDir);
134
+ const providerTokenFiles = files.filter((f) => {
135
+ // Must be a token-like file
136
+ if (!f.endsWith('.json') && !f.endsWith('.token') && f !== 'credentials') {
137
+ return false;
138
+ }
139
+ // Must have provider-specific prefix
140
+ const lowerFile = f.toLowerCase();
141
+ return validPrefixes.some((prefix) => lowerFile.startsWith(prefix));
142
+ });
143
+ return providerTokenFiles.length > 0;
144
+ }
145
+ catch {
146
+ return false;
147
+ }
148
+ }
149
+ exports.isAuthenticated = isAuthenticated;
150
+ /**
151
+ * Get detailed auth status for provider
152
+ */
153
+ function getAuthStatus(provider) {
154
+ const tokenDir = getProviderTokenDir(provider);
155
+ let tokenFiles = [];
156
+ let lastAuth;
157
+ // Get valid prefixes for this provider
158
+ const validPrefixes = PROVIDER_AUTH_PREFIXES[provider] || [];
159
+ if (fs.existsSync(tokenDir)) {
160
+ const files = fs.readdirSync(tokenDir);
161
+ // Only include provider-specific files
162
+ tokenFiles = files.filter((f) => {
163
+ if (!f.endsWith('.json') && !f.endsWith('.token') && f !== 'credentials') {
164
+ return false;
165
+ }
166
+ const lowerFile = f.toLowerCase();
167
+ return validPrefixes.some((prefix) => lowerFile.startsWith(prefix));
168
+ });
169
+ // Get most recent modification time
170
+ for (const file of tokenFiles) {
171
+ const filePath = path.join(tokenDir, file);
172
+ const stats = fs.statSync(filePath);
173
+ if (!lastAuth || stats.mtime > lastAuth) {
174
+ lastAuth = stats.mtime;
175
+ }
176
+ }
177
+ }
178
+ return {
179
+ provider,
180
+ authenticated: tokenFiles.length > 0,
181
+ tokenDir,
182
+ tokenFiles,
183
+ lastAuth,
184
+ };
185
+ }
186
+ exports.getAuthStatus = getAuthStatus;
187
+ /**
188
+ * Get auth status for all providers
189
+ */
190
+ function getAllAuthStatus() {
191
+ const providers = ['gemini', 'codex', 'agy'];
192
+ return providers.map(getAuthStatus);
193
+ }
194
+ exports.getAllAuthStatus = getAllAuthStatus;
195
+ /**
196
+ * Clear authentication for provider
197
+ */
198
+ function clearAuth(provider) {
199
+ const tokenDir = getProviderTokenDir(provider);
200
+ if (!fs.existsSync(tokenDir)) {
201
+ return false;
202
+ }
203
+ // Remove all files in token directory
204
+ const files = fs.readdirSync(tokenDir);
205
+ for (const file of files) {
206
+ fs.unlinkSync(path.join(tokenDir, file));
207
+ }
208
+ // Remove directory
209
+ fs.rmdirSync(tokenDir);
210
+ return true;
211
+ }
212
+ exports.clearAuth = clearAuth;
213
+ /**
214
+ * Trigger OAuth flow for provider
215
+ * Auto-detects headless environment and uses -no-browser flag accordingly
216
+ */
217
+ async function triggerOAuth(provider, options = {}) {
218
+ const oauthConfig = getOAuthConfig(provider);
219
+ const { verbose = false } = options;
220
+ // Auto-detect headless if not explicitly set
221
+ const headless = options.headless ?? isHeadlessEnvironment();
222
+ const log = (msg) => {
223
+ if (verbose) {
224
+ console.error(`[auth] ${msg}`);
225
+ }
226
+ };
227
+ // Ensure binary exists
228
+ let binaryPath;
229
+ try {
230
+ binaryPath = await (0, binary_manager_1.ensureCLIProxyBinary)(verbose);
231
+ }
232
+ catch (error) {
233
+ console.error('[X] Failed to prepare CLIProxy binary');
234
+ throw error;
235
+ }
236
+ // Ensure auth directory exists
237
+ const tokenDir = getProviderTokenDir(provider);
238
+ fs.mkdirSync(tokenDir, { recursive: true, mode: 0o700 });
239
+ // Generate config file (CLIProxyAPI requires it even for auth)
240
+ const configPath = (0, config_generator_1.generateConfig)(provider);
241
+ log(`Config generated: ${configPath}`);
242
+ // Build args: config + auth flag + optional -no-browser for headless
243
+ const args = ['-config', configPath, oauthConfig.authFlag];
244
+ if (headless) {
245
+ args.push('-no-browser');
246
+ }
247
+ // Show appropriate message
248
+ console.log('');
249
+ if (headless) {
250
+ console.log(`[i] Headless mode detected - manual authentication required`);
251
+ console.log(`[i] ${oauthConfig.displayName} will display an OAuth URL below`);
252
+ console.log('');
253
+ }
254
+ else {
255
+ console.log(`[i] Opening browser for ${oauthConfig.displayName} authentication...`);
256
+ console.log('[i] Complete the login in your browser.');
257
+ console.log('');
258
+ }
259
+ const spinner = new progress_indicator_1.ProgressIndicator(`Authenticating with ${oauthConfig.displayName}`);
260
+ if (!headless) {
261
+ spinner.start();
262
+ }
263
+ return new Promise((resolve) => {
264
+ // Spawn CLIProxyAPI with auth flag (and -no-browser if headless)
265
+ const authProcess = (0, child_process_1.spawn)(binaryPath, args, {
266
+ stdio: ['ignore', 'pipe', 'pipe'],
267
+ env: {
268
+ ...process.env,
269
+ CLI_PROXY_AUTH_DIR: tokenDir,
270
+ },
271
+ });
272
+ let stderrData = '';
273
+ let urlDisplayed = false;
274
+ authProcess.stdout?.on('data', (data) => {
275
+ const output = data.toString();
276
+ log(`stdout: ${output.trim()}`);
277
+ // In headless mode, display OAuth URLs prominently
278
+ if (headless) {
279
+ const lines = output.split('\n');
280
+ for (const line of lines) {
281
+ // Look for URLs in the output
282
+ const urlMatch = line.match(/https?:\/\/[^\s]+/);
283
+ if (urlMatch && !urlDisplayed) {
284
+ console.log(` ${urlMatch[0]}`);
285
+ console.log('');
286
+ console.log('[i] Waiting for authentication... (press Ctrl+C to cancel)');
287
+ urlDisplayed = true;
288
+ }
289
+ }
290
+ }
291
+ });
292
+ authProcess.stderr?.on('data', (data) => {
293
+ const output = data.toString();
294
+ stderrData += output;
295
+ log(`stderr: ${output.trim()}`);
296
+ // Also check stderr for URLs (some tools output there)
297
+ if (headless && !urlDisplayed) {
298
+ const urlMatch = output.match(/https?:\/\/[^\s]+/);
299
+ if (urlMatch) {
300
+ console.log(` ${urlMatch[0]}`);
301
+ console.log('');
302
+ console.log('[i] Waiting for authentication... (press Ctrl+C to cancel)');
303
+ urlDisplayed = true;
304
+ }
305
+ }
306
+ });
307
+ // Timeout after 5 minutes for headless (user needs time to copy URL)
308
+ const timeoutMs = headless ? 300000 : 120000;
309
+ const timeout = setTimeout(() => {
310
+ if (!headless)
311
+ spinner.fail('Authentication timeout');
312
+ authProcess.kill();
313
+ console.error(`[X] OAuth timed out after ${headless ? 5 : 2} minutes`);
314
+ console.error('');
315
+ if (!headless) {
316
+ console.error('Troubleshooting:');
317
+ console.error(' - Make sure a browser is available');
318
+ console.error(' - Try running with --verbose for details');
319
+ }
320
+ resolve(false);
321
+ }, timeoutMs);
322
+ authProcess.on('exit', (code) => {
323
+ clearTimeout(timeout);
324
+ if (code === 0) {
325
+ if (!headless)
326
+ spinner.succeed(`Authenticated with ${oauthConfig.displayName}`);
327
+ // Verify token was created
328
+ if (isAuthenticated(provider)) {
329
+ console.log('[OK] Authentication successful');
330
+ resolve(true);
331
+ }
332
+ else {
333
+ if (!headless)
334
+ spinner.fail('Authentication incomplete');
335
+ console.error('[X] Token not found after authentication');
336
+ console.error(' The OAuth flow may have been cancelled');
337
+ resolve(false);
338
+ }
339
+ }
340
+ else {
341
+ if (!headless)
342
+ spinner.fail('Authentication failed');
343
+ console.error(`[X] CLIProxyAPI auth exited with code ${code}`);
344
+ if (stderrData && !urlDisplayed) {
345
+ console.error(` ${stderrData.trim().split('\n')[0]}`);
346
+ }
347
+ // Show headless hint if we detected headless environment
348
+ if (headless && !urlDisplayed) {
349
+ console.error('');
350
+ console.error('[i] No OAuth URL was displayed. Try with --verbose for details.');
351
+ }
352
+ resolve(false);
353
+ }
354
+ });
355
+ authProcess.on('error', (error) => {
356
+ clearTimeout(timeout);
357
+ if (!headless)
358
+ spinner.fail('Authentication error');
359
+ console.error(`[X] Failed to start auth process: ${error.message}`);
360
+ resolve(false);
361
+ });
362
+ });
363
+ }
364
+ exports.triggerOAuth = triggerOAuth;
365
+ /**
366
+ * Ensure provider is authenticated
367
+ * Triggers OAuth flow if not authenticated
368
+ */
369
+ async function ensureAuth(provider, options = {}) {
370
+ // Check if already authenticated
371
+ if (isAuthenticated(provider)) {
372
+ if (options.verbose) {
373
+ console.error(`[auth] ${provider} already authenticated`);
374
+ }
375
+ return true;
376
+ }
377
+ // Not authenticated - trigger OAuth
378
+ const oauthConfig = getOAuthConfig(provider);
379
+ console.log(`[i] ${oauthConfig.displayName} authentication required`);
380
+ return triggerOAuth(provider, options);
381
+ }
382
+ exports.ensureAuth = ensureAuth;
383
+ /**
384
+ * Display auth status for all providers
385
+ */
386
+ function displayAuthStatus() {
387
+ console.log('CLIProxy Authentication Status:');
388
+ console.log('');
389
+ const statuses = getAllAuthStatus();
390
+ for (const status of statuses) {
391
+ const oauthConfig = getOAuthConfig(status.provider);
392
+ const icon = status.authenticated ? '[OK]' : '[!]';
393
+ const authStatus = status.authenticated ? 'Authenticated' : 'Not authenticated';
394
+ const lastAuthStr = status.lastAuth ? ` (last: ${status.lastAuth.toLocaleDateString()})` : '';
395
+ console.log(`${icon} ${oauthConfig.displayName}: ${authStatus}${lastAuthStr}`);
396
+ }
397
+ console.log('');
398
+ console.log('To authenticate: ccs <provider> --auth');
399
+ console.log('To logout: ccs <provider> --logout');
400
+ }
401
+ exports.displayAuthStatus = displayAuthStatus;
402
+ //# sourceMappingURL=auth-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-handler.js","sourceRoot":"","sources":["../../src/cliproxy/auth-handler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Base Config Loader for CLIProxy Providers
3
+ *
4
+ * Loads provider configurations from config/base-{provider}.settings.json files.
5
+ * This allows model mappings to be easily updated without digging into code.
6
+ *
7
+ * Config files are bundled with the npm package and read at runtime.
8
+ */
9
+ /// <reference types="node" />
10
+ import { CLIProxyProvider, ProviderModelMapping } from './types';
11
+ /** Base settings file structure */
12
+ interface BaseSettings {
13
+ env: {
14
+ ANTHROPIC_BASE_URL: string;
15
+ ANTHROPIC_AUTH_TOKEN: string;
16
+ ANTHROPIC_MODEL: string;
17
+ ANTHROPIC_DEFAULT_OPUS_MODEL: string;
18
+ ANTHROPIC_DEFAULT_SONNET_MODEL: string;
19
+ ANTHROPIC_DEFAULT_HAIKU_MODEL: string;
20
+ };
21
+ }
22
+ /**
23
+ * Load base config for a provider
24
+ * Returns parsed settings from config/base-{provider}.settings.json
25
+ */
26
+ export declare function loadBaseConfig(provider: CLIProxyProvider): BaseSettings;
27
+ /**
28
+ * Get model mapping from base config
29
+ * Extracts model names from env vars
30
+ */
31
+ export declare function getModelMappingFromConfig(provider: CLIProxyProvider): ProviderModelMapping;
32
+ /**
33
+ * Get full env vars from base config
34
+ * Returns the complete env object for Claude CLI
35
+ */
36
+ export declare function getEnvVarsFromConfig(provider: CLIProxyProvider): NodeJS.ProcessEnv;
37
+ /**
38
+ * Clear config cache (useful for testing)
39
+ */
40
+ export declare function clearConfigCache(): void;
41
+ export {};
42
+ //# sourceMappingURL=base-config-loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base-config-loader.d.ts","sourceRoot":"","sources":["../../src/cliproxy/base-config-loader.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;;AAIH,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAEjE,mCAAmC;AACnC,UAAU,YAAY;IACpB,GAAG,EAAE;QACH,kBAAkB,EAAE,MAAM,CAAC;QAC3B,oBAAoB,EAAE,MAAM,CAAC;QAC7B,eAAe,EAAE,MAAM,CAAC;QACxB,4BAA4B,EAAE,MAAM,CAAC;QACrC,8BAA8B,EAAE,MAAM,CAAC;QACvC,6BAA6B,EAAE,MAAM,CAAC;KACvC,CAAC;CACH;AAgBD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,gBAAgB,GAAG,YAAY,CA6CvE;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,gBAAgB,GAAG,oBAAoB,CAU1F;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,gBAAgB,GAAG,MAAM,CAAC,UAAU,CAGlF;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,IAAI,CAEvC"}
@@ -0,0 +1,123 @@
1
+ "use strict";
2
+ /**
3
+ * Base Config Loader for CLIProxy Providers
4
+ *
5
+ * Loads provider configurations from config/base-{provider}.settings.json files.
6
+ * This allows model mappings to be easily updated without digging into code.
7
+ *
8
+ * Config files are bundled with the npm package and read at runtime.
9
+ */
10
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ var desc = Object.getOwnPropertyDescriptor(m, k);
13
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
14
+ desc = { enumerable: true, get: function() { return m[k]; } };
15
+ }
16
+ Object.defineProperty(o, k2, desc);
17
+ }) : (function(o, m, k, k2) {
18
+ if (k2 === undefined) k2 = k;
19
+ o[k2] = m[k];
20
+ }));
21
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
22
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
23
+ }) : function(o, v) {
24
+ o["default"] = v;
25
+ });
26
+ var __importStar = (this && this.__importStar) || function (mod) {
27
+ if (mod && mod.__esModule) return mod;
28
+ var result = {};
29
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
30
+ __setModuleDefault(result, mod);
31
+ return result;
32
+ };
33
+ Object.defineProperty(exports, "__esModule", { value: true });
34
+ exports.clearConfigCache = exports.getEnvVarsFromConfig = exports.getModelMappingFromConfig = exports.loadBaseConfig = void 0;
35
+ const fs = __importStar(require("fs"));
36
+ const path = __importStar(require("path"));
37
+ /** Cached configs to avoid repeated file reads */
38
+ const configCache = new Map();
39
+ /**
40
+ * Get path to base config file for provider
41
+ * Config files are in the config/ directory relative to package root
42
+ */
43
+ function getBaseConfigPath(provider) {
44
+ // __dirname points to dist/cliproxy at runtime
45
+ // Config files are at package root: ../config/
46
+ const configDir = path.join(__dirname, '..', '..', 'config');
47
+ return path.join(configDir, `base-${provider}.settings.json`);
48
+ }
49
+ /**
50
+ * Load base config for a provider
51
+ * Returns parsed settings from config/base-{provider}.settings.json
52
+ */
53
+ function loadBaseConfig(provider) {
54
+ // Check cache first
55
+ const cached = configCache.get(provider);
56
+ if (cached) {
57
+ return cached;
58
+ }
59
+ const configPath = getBaseConfigPath(provider);
60
+ if (!fs.existsSync(configPath)) {
61
+ throw new Error(`Base config not found for provider '${provider}': ${configPath}\n` +
62
+ `Expected file: config/base-${provider}.settings.json`);
63
+ }
64
+ try {
65
+ const content = fs.readFileSync(configPath, 'utf-8');
66
+ const settings = JSON.parse(content);
67
+ // Validate required fields
68
+ if (!settings.env || typeof settings.env !== 'object') {
69
+ throw new Error('Missing or invalid "env" object');
70
+ }
71
+ const required = [
72
+ 'ANTHROPIC_MODEL',
73
+ 'ANTHROPIC_DEFAULT_OPUS_MODEL',
74
+ 'ANTHROPIC_DEFAULT_SONNET_MODEL',
75
+ 'ANTHROPIC_DEFAULT_HAIKU_MODEL',
76
+ ];
77
+ for (const field of required) {
78
+ if (!settings.env[field]) {
79
+ throw new Error(`Missing required field: env.${field}`);
80
+ }
81
+ }
82
+ // Cache and return
83
+ configCache.set(provider, settings);
84
+ return settings;
85
+ }
86
+ catch (error) {
87
+ const err = error;
88
+ throw new Error(`Failed to load base config for '${provider}': ${err.message}`);
89
+ }
90
+ }
91
+ exports.loadBaseConfig = loadBaseConfig;
92
+ /**
93
+ * Get model mapping from base config
94
+ * Extracts model names from env vars
95
+ */
96
+ function getModelMappingFromConfig(provider) {
97
+ const config = loadBaseConfig(provider);
98
+ return {
99
+ defaultModel: config.env.ANTHROPIC_MODEL,
100
+ claudeModel: config.env.ANTHROPIC_MODEL,
101
+ opusModel: config.env.ANTHROPIC_DEFAULT_OPUS_MODEL,
102
+ sonnetModel: config.env.ANTHROPIC_DEFAULT_SONNET_MODEL,
103
+ haikuModel: config.env.ANTHROPIC_DEFAULT_HAIKU_MODEL,
104
+ };
105
+ }
106
+ exports.getModelMappingFromConfig = getModelMappingFromConfig;
107
+ /**
108
+ * Get full env vars from base config
109
+ * Returns the complete env object for Claude CLI
110
+ */
111
+ function getEnvVarsFromConfig(provider) {
112
+ const config = loadBaseConfig(provider);
113
+ return config.env;
114
+ }
115
+ exports.getEnvVarsFromConfig = getEnvVarsFromConfig;
116
+ /**
117
+ * Clear config cache (useful for testing)
118
+ */
119
+ function clearConfigCache() {
120
+ configCache.clear();
121
+ }
122
+ exports.clearConfigCache = clearConfigCache;
123
+ //# sourceMappingURL=base-config-loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base-config-loader.js","sourceRoot":"","sources":["../../src/cliproxy/base-config-loader.ts"],"names":[],"mappings":"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"}