@kaitranntt/ccs 4.4.0 → 5.0.1

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 +98 -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 +95 -0
  23. package/dist/cliproxy/auth-handler.d.ts.map +1 -0
  24. package/dist/cliproxy/auth-handler.js +443 -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,443 @@
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 (fallback detection)
111
+ * CLIProxyAPI names auth files with provider prefix (e.g., "antigravity-user@email.json")
112
+ * Note: Gemini tokens may NOT have prefix - CLIProxyAPI uses {email}-{projectID}.json format
113
+ */
114
+ const PROVIDER_AUTH_PREFIXES = {
115
+ gemini: ['gemini-', 'google-'],
116
+ codex: ['codex-', 'openai-'],
117
+ agy: ['antigravity-', 'agy-'],
118
+ };
119
+ /**
120
+ * Provider type values inside token JSON files
121
+ * CLIProxyAPI sets "type" field in token JSON (e.g., {"type": "gemini"})
122
+ */
123
+ const PROVIDER_TYPE_VALUES = {
124
+ gemini: ['gemini'],
125
+ codex: ['codex'],
126
+ agy: ['antigravity'],
127
+ };
128
+ /**
129
+ * Check if a JSON file contains a token for the given provider
130
+ * Reads the file and checks the "type" field
131
+ */
132
+ function isTokenFileForProvider(filePath, provider) {
133
+ try {
134
+ const content = fs.readFileSync(filePath, 'utf-8');
135
+ const data = JSON.parse(content);
136
+ const typeValue = (data.type || '').toLowerCase();
137
+ const validTypes = PROVIDER_TYPE_VALUES[provider] || [];
138
+ return validTypes.includes(typeValue);
139
+ }
140
+ catch {
141
+ return false;
142
+ }
143
+ }
144
+ /**
145
+ * Check if provider has valid authentication
146
+ * CLIProxyAPI stores OAuth tokens as JSON files in the auth directory.
147
+ * Detection strategy:
148
+ * 1. First check by filename prefix (fast path)
149
+ * 2. If no match, check JSON content for "type" field (Gemini uses {email}-{projectID}.json without prefix)
150
+ */
151
+ function isAuthenticated(provider) {
152
+ const tokenDir = getProviderTokenDir(provider);
153
+ if (!fs.existsSync(tokenDir)) {
154
+ return false;
155
+ }
156
+ const validPrefixes = PROVIDER_AUTH_PREFIXES[provider] || [];
157
+ try {
158
+ const files = fs.readdirSync(tokenDir);
159
+ const jsonFiles = files.filter((f) => f.endsWith('.json') || f.endsWith('.token') || f === 'credentials');
160
+ // Strategy 1: Check by filename prefix (fast path for antigravity, codex)
161
+ const prefixMatch = jsonFiles.some((f) => {
162
+ const lowerFile = f.toLowerCase();
163
+ return validPrefixes.some((prefix) => lowerFile.startsWith(prefix));
164
+ });
165
+ if (prefixMatch)
166
+ return true;
167
+ // Strategy 2: Check JSON content for "type" field (needed for Gemini)
168
+ for (const f of jsonFiles) {
169
+ const filePath = path.join(tokenDir, f);
170
+ if (isTokenFileForProvider(filePath, provider)) {
171
+ return true;
172
+ }
173
+ }
174
+ return false;
175
+ }
176
+ catch {
177
+ return false;
178
+ }
179
+ }
180
+ exports.isAuthenticated = isAuthenticated;
181
+ /**
182
+ * Get detailed auth status for provider
183
+ * Uses same detection strategy as isAuthenticated: prefix first, then content
184
+ */
185
+ function getAuthStatus(provider) {
186
+ const tokenDir = getProviderTokenDir(provider);
187
+ let tokenFiles = [];
188
+ let lastAuth;
189
+ const validPrefixes = PROVIDER_AUTH_PREFIXES[provider] || [];
190
+ if (fs.existsSync(tokenDir)) {
191
+ const files = fs.readdirSync(tokenDir);
192
+ const jsonFiles = files.filter((f) => f.endsWith('.json') || f.endsWith('.token') || f === 'credentials');
193
+ // Check each file: by prefix OR by content
194
+ tokenFiles = jsonFiles.filter((f) => {
195
+ const lowerFile = f.toLowerCase();
196
+ // Strategy 1: prefix match
197
+ if (validPrefixes.some((prefix) => lowerFile.startsWith(prefix))) {
198
+ return true;
199
+ }
200
+ // Strategy 2: content match (for Gemini tokens without prefix)
201
+ const filePath = path.join(tokenDir, f);
202
+ return isTokenFileForProvider(filePath, provider);
203
+ });
204
+ // Get most recent modification time
205
+ for (const file of tokenFiles) {
206
+ const filePath = path.join(tokenDir, file);
207
+ try {
208
+ const stats = fs.statSync(filePath);
209
+ if (!lastAuth || stats.mtime > lastAuth) {
210
+ lastAuth = stats.mtime;
211
+ }
212
+ }
213
+ catch {
214
+ // Skip if can't stat file
215
+ }
216
+ }
217
+ }
218
+ return {
219
+ provider,
220
+ authenticated: tokenFiles.length > 0,
221
+ tokenDir,
222
+ tokenFiles,
223
+ lastAuth,
224
+ };
225
+ }
226
+ exports.getAuthStatus = getAuthStatus;
227
+ /**
228
+ * Get auth status for all providers
229
+ */
230
+ function getAllAuthStatus() {
231
+ const providers = ['gemini', 'codex', 'agy'];
232
+ return providers.map(getAuthStatus);
233
+ }
234
+ exports.getAllAuthStatus = getAllAuthStatus;
235
+ /**
236
+ * Clear authentication for provider
237
+ */
238
+ function clearAuth(provider) {
239
+ const tokenDir = getProviderTokenDir(provider);
240
+ if (!fs.existsSync(tokenDir)) {
241
+ return false;
242
+ }
243
+ // Remove all files in token directory
244
+ const files = fs.readdirSync(tokenDir);
245
+ for (const file of files) {
246
+ fs.unlinkSync(path.join(tokenDir, file));
247
+ }
248
+ // Remove directory
249
+ fs.rmdirSync(tokenDir);
250
+ return true;
251
+ }
252
+ exports.clearAuth = clearAuth;
253
+ /**
254
+ * Trigger OAuth flow for provider
255
+ * Auto-detects headless environment and uses -no-browser flag accordingly
256
+ */
257
+ async function triggerOAuth(provider, options = {}) {
258
+ const oauthConfig = getOAuthConfig(provider);
259
+ const { verbose = false } = options;
260
+ // Auto-detect headless if not explicitly set
261
+ const headless = options.headless ?? isHeadlessEnvironment();
262
+ const log = (msg) => {
263
+ if (verbose) {
264
+ console.error(`[auth] ${msg}`);
265
+ }
266
+ };
267
+ // Ensure binary exists
268
+ let binaryPath;
269
+ try {
270
+ binaryPath = await (0, binary_manager_1.ensureCLIProxyBinary)(verbose);
271
+ }
272
+ catch (error) {
273
+ console.error('[X] Failed to prepare CLIProxy binary');
274
+ throw error;
275
+ }
276
+ // Ensure auth directory exists
277
+ const tokenDir = getProviderTokenDir(provider);
278
+ fs.mkdirSync(tokenDir, { recursive: true, mode: 0o700 });
279
+ // Generate config file (CLIProxyAPI requires it even for auth)
280
+ const configPath = (0, config_generator_1.generateConfig)(provider);
281
+ log(`Config generated: ${configPath}`);
282
+ // Build args: config + auth flag + optional -no-browser for headless
283
+ const args = ['-config', configPath, oauthConfig.authFlag];
284
+ if (headless) {
285
+ args.push('-no-browser');
286
+ }
287
+ // Show appropriate message
288
+ console.log('');
289
+ if (headless) {
290
+ console.log(`[i] Headless mode detected - manual authentication required`);
291
+ console.log(`[i] ${oauthConfig.displayName} will display an OAuth URL below`);
292
+ console.log('');
293
+ }
294
+ else {
295
+ console.log(`[i] Opening browser for ${oauthConfig.displayName} authentication...`);
296
+ console.log('[i] Complete the login in your browser.');
297
+ console.log('');
298
+ }
299
+ const spinner = new progress_indicator_1.ProgressIndicator(`Authenticating with ${oauthConfig.displayName}`);
300
+ if (!headless) {
301
+ spinner.start();
302
+ }
303
+ return new Promise((resolve) => {
304
+ // Spawn CLIProxyAPI with auth flag (and -no-browser if headless)
305
+ const authProcess = (0, child_process_1.spawn)(binaryPath, args, {
306
+ stdio: ['ignore', 'pipe', 'pipe'],
307
+ env: {
308
+ ...process.env,
309
+ CLI_PROXY_AUTH_DIR: tokenDir,
310
+ },
311
+ });
312
+ let stderrData = '';
313
+ let urlDisplayed = false;
314
+ authProcess.stdout?.on('data', (data) => {
315
+ const output = data.toString();
316
+ log(`stdout: ${output.trim()}`);
317
+ // In headless mode, display OAuth URLs prominently
318
+ if (headless) {
319
+ const lines = output.split('\n');
320
+ for (const line of lines) {
321
+ // Look for URLs in the output
322
+ const urlMatch = line.match(/https?:\/\/[^\s]+/);
323
+ if (urlMatch && !urlDisplayed) {
324
+ console.log(` ${urlMatch[0]}`);
325
+ console.log('');
326
+ console.log('[i] Waiting for authentication... (press Ctrl+C to cancel)');
327
+ urlDisplayed = true;
328
+ }
329
+ }
330
+ }
331
+ });
332
+ authProcess.stderr?.on('data', (data) => {
333
+ const output = data.toString();
334
+ stderrData += output;
335
+ log(`stderr: ${output.trim()}`);
336
+ // Also check stderr for URLs (some tools output there)
337
+ if (headless && !urlDisplayed) {
338
+ const urlMatch = output.match(/https?:\/\/[^\s]+/);
339
+ if (urlMatch) {
340
+ console.log(` ${urlMatch[0]}`);
341
+ console.log('');
342
+ console.log('[i] Waiting for authentication... (press Ctrl+C to cancel)');
343
+ urlDisplayed = true;
344
+ }
345
+ }
346
+ });
347
+ // Timeout after 5 minutes for headless (user needs time to copy URL)
348
+ const timeoutMs = headless ? 300000 : 120000;
349
+ const timeout = setTimeout(() => {
350
+ if (!headless)
351
+ spinner.fail('Authentication timeout');
352
+ authProcess.kill();
353
+ console.error(`[X] OAuth timed out after ${headless ? 5 : 2} minutes`);
354
+ console.error('');
355
+ if (!headless) {
356
+ console.error('Troubleshooting:');
357
+ console.error(' - Make sure a browser is available');
358
+ console.error(' - Try running with --verbose for details');
359
+ }
360
+ resolve(false);
361
+ }, timeoutMs);
362
+ authProcess.on('exit', (code) => {
363
+ clearTimeout(timeout);
364
+ if (code === 0) {
365
+ // Verify token was created BEFORE showing success
366
+ if (isAuthenticated(provider)) {
367
+ if (!headless)
368
+ spinner.succeed(`Authenticated with ${oauthConfig.displayName}`);
369
+ console.log('[OK] Authentication successful');
370
+ resolve(true);
371
+ }
372
+ else {
373
+ if (!headless)
374
+ spinner.fail('Authentication incomplete');
375
+ console.error('[X] Token not found after authentication');
376
+ console.error(' The OAuth flow may have been cancelled or port 8085 was in use');
377
+ console.error(' Try: pkill -f cli-proxy-api && ccs gemini --auth');
378
+ resolve(false);
379
+ }
380
+ }
381
+ else {
382
+ if (!headless)
383
+ spinner.fail('Authentication failed');
384
+ console.error(`[X] CLIProxyAPI auth exited with code ${code}`);
385
+ if (stderrData && !urlDisplayed) {
386
+ console.error(` ${stderrData.trim().split('\n')[0]}`);
387
+ }
388
+ // Show headless hint if we detected headless environment
389
+ if (headless && !urlDisplayed) {
390
+ console.error('');
391
+ console.error('[i] No OAuth URL was displayed. Try with --verbose for details.');
392
+ }
393
+ resolve(false);
394
+ }
395
+ });
396
+ authProcess.on('error', (error) => {
397
+ clearTimeout(timeout);
398
+ if (!headless)
399
+ spinner.fail('Authentication error');
400
+ console.error(`[X] Failed to start auth process: ${error.message}`);
401
+ resolve(false);
402
+ });
403
+ });
404
+ }
405
+ exports.triggerOAuth = triggerOAuth;
406
+ /**
407
+ * Ensure provider is authenticated
408
+ * Triggers OAuth flow if not authenticated
409
+ */
410
+ async function ensureAuth(provider, options = {}) {
411
+ // Check if already authenticated
412
+ if (isAuthenticated(provider)) {
413
+ if (options.verbose) {
414
+ console.error(`[auth] ${provider} already authenticated`);
415
+ }
416
+ return true;
417
+ }
418
+ // Not authenticated - trigger OAuth
419
+ const oauthConfig = getOAuthConfig(provider);
420
+ console.log(`[i] ${oauthConfig.displayName} authentication required`);
421
+ return triggerOAuth(provider, options);
422
+ }
423
+ exports.ensureAuth = ensureAuth;
424
+ /**
425
+ * Display auth status for all providers
426
+ */
427
+ function displayAuthStatus() {
428
+ console.log('CLIProxy Authentication Status:');
429
+ console.log('');
430
+ const statuses = getAllAuthStatus();
431
+ for (const status of statuses) {
432
+ const oauthConfig = getOAuthConfig(status.provider);
433
+ const icon = status.authenticated ? '[OK]' : '[!]';
434
+ const authStatus = status.authenticated ? 'Authenticated' : 'Not authenticated';
435
+ const lastAuthStr = status.lastAuth ? ` (last: ${status.lastAuth.toLocaleDateString()})` : '';
436
+ console.log(`${icon} ${oauthConfig.displayName}: ${authStatus}${lastAuthStr}`);
437
+ }
438
+ console.log('');
439
+ console.log('To authenticate: ccs <provider> --auth');
440
+ console.log('To logout: ccs <provider> --logout');
441
+ }
442
+ exports.displayAuthStatus = displayAuthStatus;
443
+ //# 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":";AAAA;;;;;;;GAOG;;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,uCAAyB;AACzB,2CAA6B;AAe7B,kDAAkD;AAClD,MAAM,WAAW,GAAwC,IAAI,GAAG,EAAE,CAAC;AAEnE;;;GAGG;AACH,SAAS,iBAAiB,CAAC,QAA0B;IACnD,+CAA+C;IAC/C,+CAA+C;IAC/C,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC7D,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,QAAQ,gBAAgB,CAAC,CAAC;AAChE,CAAC;AAED;;;GAGG;AACH,SAAgB,cAAc,CAAC,QAA0B;IACvD,oBAAoB;IACpB,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACzC,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,MAAM,UAAU,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IAE/C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CACb,uCAAuC,QAAQ,MAAM,UAAU,IAAI;YACjE,8BAA8B,QAAQ,gBAAgB,CACzD,CAAC;IACJ,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QACrD,MAAM,QAAQ,GAAiB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAEnD,2BAA2B;QAC3B,IAAI,CAAC,QAAQ,CAAC,GAAG,IAAI,OAAO,QAAQ,CAAC,GAAG,KAAK,QAAQ,EAAE,CAAC;YACtD,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;QACrD,CAAC;QAED,MAAM,QAAQ,GAAG;YACf,iBAAiB;YACjB,8BAA8B;YAC9B,gCAAgC;YAChC,+BAA+B;SAChC,CAAC;QAEF,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;YAC7B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAkC,CAAC,EAAE,CAAC;gBACtD,MAAM,IAAI,KAAK,CAAC,+BAA+B,KAAK,EAAE,CAAC,CAAC;YAC1D,CAAC;QACH,CAAC;QAED,mBAAmB;QACnB,WAAW,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QACpC,OAAO,QAAQ,CAAC;IAClB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,GAAG,GAAG,KAAc,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,mCAAmC,QAAQ,MAAM,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;IAClF,CAAC;AACH,CAAC;AA7CD,wCA6CC;AAED;;;GAGG;AACH,SAAgB,yBAAyB,CAAC,QAA0B;IAClE,MAAM,MAAM,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;IAExC,OAAO;QACL,YAAY,EAAE,MAAM,CAAC,GAAG,CAAC,eAAe;QACxC,WAAW,EAAE,MAAM,CAAC,GAAG,CAAC,eAAe;QACvC,SAAS,EAAE,MAAM,CAAC,GAAG,CAAC,4BAA4B;QAClD,WAAW,EAAE,MAAM,CAAC,GAAG,CAAC,8BAA8B;QACtD,UAAU,EAAE,MAAM,CAAC,GAAG,CAAC,6BAA6B;KACrD,CAAC;AACJ,CAAC;AAVD,8DAUC;AAED;;;GAGG;AACH,SAAgB,oBAAoB,CAAC,QAA0B;IAC7D,MAAM,MAAM,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;IACxC,OAAO,MAAM,CAAC,GAAmC,CAAC;AACpD,CAAC;AAHD,oDAGC;AAED;;GAEG;AACH,SAAgB,gBAAgB;IAC9B,WAAW,CAAC,KAAK,EAAE,CAAC;AACtB,CAAC;AAFD,4CAEC"}