@kaitranntt/ccs 7.79.1-dev.5 → 7.79.1-dev.6

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 (149) hide show
  1. package/README.md +29 -11
  2. package/dist/bin/ccsxp-runtime.d.ts.map +1 -1
  3. package/dist/bin/ccsxp-runtime.js +8 -0
  4. package/dist/bin/ccsxp-runtime.js.map +1 -1
  5. package/dist/bin/codex-runtime-router.d.ts +24 -0
  6. package/dist/bin/codex-runtime-router.d.ts.map +1 -0
  7. package/dist/bin/codex-runtime-router.js +91 -0
  8. package/dist/bin/codex-runtime-router.js.map +1 -0
  9. package/dist/bin/codex-runtime.d.ts +1 -0
  10. package/dist/bin/codex-runtime.js +7 -2
  11. package/dist/bin/codex-runtime.js.map +1 -1
  12. package/dist/codex-auth/codex-account-identity.d.ts +8 -0
  13. package/dist/codex-auth/codex-account-identity.d.ts.map +1 -0
  14. package/dist/codex-auth/codex-account-identity.js +53 -0
  15. package/dist/codex-auth/codex-account-identity.js.map +1 -0
  16. package/dist/codex-auth/codex-auth-dashboard-service.d.ts +46 -0
  17. package/dist/codex-auth/codex-auth-dashboard-service.d.ts.map +1 -0
  18. package/dist/codex-auth/codex-auth-dashboard-service.js +228 -0
  19. package/dist/codex-auth/codex-auth-dashboard-service.js.map +1 -0
  20. package/dist/codex-auth/codex-auth-help.d.ts +7 -0
  21. package/dist/codex-auth/codex-auth-help.d.ts.map +1 -0
  22. package/dist/codex-auth/codex-auth-help.js +87 -0
  23. package/dist/codex-auth/codex-auth-help.js.map +1 -0
  24. package/dist/codex-auth/codex-auth-router.d.ts +16 -0
  25. package/dist/codex-auth/codex-auth-router.d.ts.map +1 -0
  26. package/dist/codex-auth/codex-auth-router.js +77 -0
  27. package/dist/codex-auth/codex-auth-router.js.map +1 -0
  28. package/dist/codex-auth/codex-config-symlink.d.ts +14 -0
  29. package/dist/codex-auth/codex-config-symlink.d.ts.map +1 -0
  30. package/dist/codex-auth/codex-config-symlink.js +128 -0
  31. package/dist/codex-auth/codex-config-symlink.js.map +1 -0
  32. package/dist/codex-auth/codex-profile-paths.d.ts +5 -0
  33. package/dist/codex-auth/codex-profile-paths.d.ts.map +1 -0
  34. package/dist/codex-auth/codex-profile-paths.js +58 -0
  35. package/dist/codex-auth/codex-profile-paths.js.map +1 -0
  36. package/dist/codex-auth/codex-profile-registry.d.ts +34 -0
  37. package/dist/codex-auth/codex-profile-registry.d.ts.map +1 -0
  38. package/dist/codex-auth/codex-profile-registry.js +360 -0
  39. package/dist/codex-auth/codex-profile-registry.js.map +1 -0
  40. package/dist/codex-auth/commands/create-command.d.ts +9 -0
  41. package/dist/codex-auth/commands/create-command.d.ts.map +1 -0
  42. package/dist/codex-auth/commands/create-command.js +189 -0
  43. package/dist/codex-auth/commands/create-command.js.map +1 -0
  44. package/dist/codex-auth/commands/import-default-command.d.ts +18 -0
  45. package/dist/codex-auth/commands/import-default-command.d.ts.map +1 -0
  46. package/dist/codex-auth/commands/import-default-command.js +385 -0
  47. package/dist/codex-auth/commands/import-default-command.js.map +1 -0
  48. package/dist/codex-auth/commands/index.d.ts +13 -0
  49. package/dist/codex-auth/commands/index.d.ts.map +1 -0
  50. package/dist/codex-auth/commands/index.js +27 -0
  51. package/dist/codex-auth/commands/index.js.map +1 -0
  52. package/dist/codex-auth/commands/login-command.d.ts +9 -0
  53. package/dist/codex-auth/commands/login-command.d.ts.map +1 -0
  54. package/dist/codex-auth/commands/login-command.js +152 -0
  55. package/dist/codex-auth/commands/login-command.js.map +1 -0
  56. package/dist/codex-auth/commands/remove-command.d.ts +10 -0
  57. package/dist/codex-auth/commands/remove-command.d.ts.map +1 -0
  58. package/dist/codex-auth/commands/remove-command.js +230 -0
  59. package/dist/codex-auth/commands/remove-command.js.map +1 -0
  60. package/dist/codex-auth/commands/show-command.d.ts +10 -0
  61. package/dist/codex-auth/commands/show-command.d.ts.map +1 -0
  62. package/dist/codex-auth/commands/show-command.js +127 -0
  63. package/dist/codex-auth/commands/show-command.js.map +1 -0
  64. package/dist/codex-auth/commands/show-detail-view.d.ts +7 -0
  65. package/dist/codex-auth/commands/show-detail-view.d.ts.map +1 -0
  66. package/dist/codex-auth/commands/show-detail-view.js +134 -0
  67. package/dist/codex-auth/commands/show-detail-view.js.map +1 -0
  68. package/dist/codex-auth/commands/switch-command.d.ts +7 -0
  69. package/dist/codex-auth/commands/switch-command.d.ts.map +1 -0
  70. package/dist/codex-auth/commands/switch-command.js +48 -0
  71. package/dist/codex-auth/commands/switch-command.js.map +1 -0
  72. package/dist/codex-auth/commands/types.d.ts +45 -0
  73. package/dist/codex-auth/commands/types.d.ts.map +1 -0
  74. package/dist/codex-auth/commands/types.js +85 -0
  75. package/dist/codex-auth/commands/types.js.map +1 -0
  76. package/dist/codex-auth/commands/use-command.d.ts +16 -0
  77. package/dist/codex-auth/commands/use-command.d.ts.map +1 -0
  78. package/dist/codex-auth/commands/use-command.js +86 -0
  79. package/dist/codex-auth/commands/use-command.js.map +1 -0
  80. package/dist/codex-auth/decode-id-token.d.ts +12 -0
  81. package/dist/codex-auth/decode-id-token.d.ts.map +1 -0
  82. package/dist/codex-auth/decode-id-token.js +83 -0
  83. package/dist/codex-auth/decode-id-token.js.map +1 -0
  84. package/dist/codex-auth/index.d.ts +8 -0
  85. package/dist/codex-auth/index.d.ts.map +1 -0
  86. package/dist/codex-auth/index.js +19 -0
  87. package/dist/codex-auth/index.js.map +1 -0
  88. package/dist/codex-auth/resolve-active-profile.d.ts +13 -0
  89. package/dist/codex-auth/resolve-active-profile.d.ts.map +1 -0
  90. package/dist/codex-auth/resolve-active-profile.js +161 -0
  91. package/dist/codex-auth/resolve-active-profile.js.map +1 -0
  92. package/dist/codex-auth/shell-detect.d.ts +19 -0
  93. package/dist/codex-auth/shell-detect.d.ts.map +1 -0
  94. package/dist/codex-auth/shell-detect.js +129 -0
  95. package/dist/codex-auth/shell-detect.js.map +1 -0
  96. package/dist/codex-auth/types.d.ts +26 -0
  97. package/dist/codex-auth/types.d.ts.map +1 -0
  98. package/dist/codex-auth/types.js +34 -0
  99. package/dist/codex-auth/types.js.map +1 -0
  100. package/dist/dispatcher/pre-dispatch.d.ts.map +1 -1
  101. package/dist/dispatcher/pre-dispatch.js +7 -0
  102. package/dist/dispatcher/pre-dispatch.js.map +1 -1
  103. package/dist/ui/assets/Trans-J6qQqjkU.js +1 -0
  104. package/dist/ui/assets/{accounts-C-sOjvWS.js → accounts-B9Y9uOFl.js} +1 -1
  105. package/dist/ui/assets/{alert-dialog-BrOo6Lh3.js → alert-dialog-B7gsksZn.js} +1 -1
  106. package/dist/ui/assets/{api-CXdC3ABc.js → api-Cz8U6P7R.js} +1 -1
  107. package/dist/ui/assets/{auth-section-XJ5PohAT.js → auth-section-C8dzvYje.js} +1 -1
  108. package/dist/ui/assets/{backups-section-DjMi9NN5.js → backups-section-D0dn59k8.js} +1 -1
  109. package/dist/ui/assets/{channels-dD6o7KFj.js → channels-BEmwDrRW.js} +1 -1
  110. package/dist/ui/assets/{checkbox-CVS69doq.js → checkbox-DD0s2D_O.js} +1 -1
  111. package/dist/ui/assets/{claude-extension-D47wkgfq.js → claude-extension-DHVBsw6b.js} +1 -1
  112. package/dist/ui/assets/{cliproxy-CXgzAe6X.js → cliproxy-BMlbpAIO.js} +2 -2
  113. package/dist/ui/assets/{cliproxy-ai-providers-POOrpQVc.js → cliproxy-ai-providers-B440rPlH.js} +2 -2
  114. package/dist/ui/assets/{cliproxy-control-panel-BWa_KiNM.js → cliproxy-control-panel-Bo-Y41B_.js} +1 -1
  115. package/dist/ui/assets/codex-DPe04ol4.js +30 -0
  116. package/dist/ui/assets/{confirm-dialog-BuxHs897.js → confirm-dialog-MQNmqmha.js} +1 -1
  117. package/dist/ui/assets/{copilot-BQ4Cltbo.js → copilot-COZj29YU.js} +1 -1
  118. package/dist/ui/assets/{cursor-BVUNUVux.js → cursor-D0occhsH.js} +1 -1
  119. package/dist/ui/assets/{droid-Bw34FF6c.js → droid-CSaYFApd.js} +1 -1
  120. package/dist/ui/assets/{globalenv-section-B4UDGHiP.js → globalenv-section-BwuNrdbO.js} +1 -1
  121. package/dist/ui/assets/{health-30TwUdp_.js → health-DjNOO9K-.js} +1 -1
  122. package/dist/ui/assets/{index-BUBCzEHD.js → index-Bm_0r3qk.js} +1 -1
  123. package/dist/ui/assets/{index-BxIFAuoV.js → index-Bnzie_zG.js} +1 -1
  124. package/dist/ui/assets/{index-C6j8gpEb.js → index-CSlgRg0s.js} +27 -27
  125. package/dist/ui/assets/index-CjM3Ehb8.js +1 -0
  126. package/dist/ui/assets/{index-BjQ5PWH7.js → index-CmOBelFi.js} +1 -1
  127. package/dist/ui/assets/{index-DtiygQmg.js → index-D9HfyuQr.js} +1 -1
  128. package/dist/ui/assets/index-G3mgTfgR.css +1 -0
  129. package/dist/ui/assets/{index-ByGCSVsI.js → index-i2MPNni3.js} +1 -1
  130. package/dist/ui/assets/{logs-CDD_WQvt.js → logs-7bWvuc1l.js} +1 -1
  131. package/dist/ui/assets/{masked-input-DpM1vKP_.js → masked-input-D_amxi96.js} +1 -1
  132. package/dist/ui/assets/proxy-status-widget-BkC-wCtI.js +1 -0
  133. package/dist/ui/assets/{raw-json-settings-editor-panel-D-zQkcvr.js → raw-json-settings-editor-panel-CVP5Bjfm.js} +1 -1
  134. package/dist/ui/assets/{searchable-select-B8Kp0x8p.js → searchable-select-e5sY7o6g.js} +1 -1
  135. package/dist/ui/assets/{separator-DlXQBF83.js → separator-BR5bmtI7.js} +1 -1
  136. package/dist/ui/assets/{shared-D_h3QKy6.js → shared-CsqW2cFN.js} +1 -1
  137. package/dist/ui/assets/{table-Dyt0FuBK.js → table-DPheAd4c.js} +1 -1
  138. package/dist/ui/assets/{updates-DfIV0IC0.js → updates-D07RjKLJ.js} +1 -1
  139. package/dist/ui/assets/{use-accounts-Dy2ogHT-.js → use-accounts-CWVR2NXQ.js} +1 -1
  140. package/dist/ui/index.html +2 -2
  141. package/dist/web-server/routes/codex-routes.d.ts.map +1 -1
  142. package/dist/web-server/routes/codex-routes.js +14 -0
  143. package/dist/web-server/routes/codex-routes.js.map +1 -1
  144. package/package.json +1 -1
  145. package/scripts/run-test-bucket.js +1 -0
  146. package/dist/ui/assets/codex-CYyPdHS4.js +0 -30
  147. package/dist/ui/assets/index-nSsKQx8t.css +0 -1
  148. package/dist/ui/assets/index-s94_IKNx.js +0 -1
  149. package/dist/ui/assets/proxy-status-widget-7iMiOpQe.js +0 -1
@@ -0,0 +1,385 @@
1
+ "use strict";
2
+ /**
3
+ * codex-auth import-default command.
4
+ *
5
+ * Migrates legacy ~/.codex/auth.json into a named profile (non-destructive).
6
+ * Implements C3 torn-write protection: read-with-retry + JWT-shape validation
7
+ * + pgrep Codex-running detection + atomic write.
8
+ *
9
+ * Usage: ccsx auth import-default <name> [--with-history] [--force] [--force-while-running]
10
+ */
11
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
12
+ if (k2 === undefined) k2 = k;
13
+ var desc = Object.getOwnPropertyDescriptor(m, k);
14
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
15
+ desc = { enumerable: true, get: function() { return m[k]; } };
16
+ }
17
+ Object.defineProperty(o, k2, desc);
18
+ }) : (function(o, m, k, k2) {
19
+ if (k2 === undefined) k2 = k;
20
+ o[k2] = m[k];
21
+ }));
22
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
23
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
24
+ }) : function(o, v) {
25
+ o["default"] = v;
26
+ });
27
+ var __importStar = (this && this.__importStar) || function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ Object.defineProperty(exports, "__esModule", { value: true });
35
+ exports.handleImportDefaultCodex = void 0;
36
+ const fs = __importStar(require("fs"));
37
+ const path = __importStar(require("path"));
38
+ const os = __importStar(require("os"));
39
+ const childProcess = __importStar(require("child_process"));
40
+ const logging_1 = require("../../services/logging");
41
+ const ui_1 = require("../../utils/ui");
42
+ const ui_2 = require("../../utils/ui");
43
+ const errors_1 = require("../../errors");
44
+ const exit_codes_1 = require("../../errors/exit-codes");
45
+ const index_1 = require("../index");
46
+ const decode_id_token_1 = require("../decode-id-token");
47
+ const types_1 = require("./types");
48
+ const logger = (0, logging_1.createLogger)('codex-auth:cmd:import-default');
49
+ // Maximum retries for torn-write detection (C3)
50
+ const MAX_READ_RETRIES = 3;
51
+ const RETRY_DELAY_MS = 100;
52
+ // CLIProxy format marker (reject these with a clear message)
53
+ const CLIPROXY_TYPE_MARKER = 'type';
54
+ const IMPORT_DEFAULT_USAGE = 'ccsx auth import-default <name> [--with-history] [--force] [--force-while-running]';
55
+ // ── helpers ──────────────────────────────────────────────────────────────────
56
+ function sleep(ms) {
57
+ return new Promise((resolve) => setTimeout(resolve, ms));
58
+ }
59
+ /**
60
+ * Detect a running `codex` process via pgrep + ps validation (best-effort, never throws).
61
+ * Returns the PID string if found, null otherwise.
62
+ */
63
+ function detectCodexRunning() {
64
+ try {
65
+ const result = childProcess.spawnSync('pgrep', ['-f', 'codex'], {
66
+ encoding: 'utf8',
67
+ timeout: 2000,
68
+ });
69
+ if (result.status !== 0 || !result.stdout || result.stdout.trim().length === 0) {
70
+ return null;
71
+ }
72
+ const pids = parsePgrepPids(result.stdout);
73
+ if (pids.length === 0)
74
+ return null;
75
+ const psResult = childProcess.spawnSync('ps', ['-p', pids.join(','), '-o', 'pid=', '-o', 'command='], {
76
+ encoding: 'utf8',
77
+ timeout: 2000,
78
+ });
79
+ if (psResult.status !== 0 || !psResult.stdout)
80
+ return null;
81
+ return selectCodexPidFromPsOutput(psResult.stdout, pids);
82
+ }
83
+ catch {
84
+ return null;
85
+ }
86
+ }
87
+ function parsePgrepPids(stdout) {
88
+ return stdout
89
+ .split(/\r?\n/)
90
+ .map((line) => line.trim())
91
+ .filter((pid) => /^\d+$/.test(pid) && pid !== String(process.pid));
92
+ }
93
+ function selectCodexPidFromPsOutput(stdout, candidatePids) {
94
+ const candidates = new Set(candidatePids);
95
+ for (const line of stdout.split(/\r?\n/)) {
96
+ const match = line.match(/^\s*(\d+)\s+(.+?)\s*$/);
97
+ if (!match)
98
+ continue;
99
+ const [, pid, command] = match;
100
+ if (!pid || !command || !candidates.has(pid))
101
+ continue;
102
+ if (isLikelyCodexProcessCommand(command))
103
+ return pid;
104
+ }
105
+ return null;
106
+ }
107
+ function isLikelyCodexProcessCommand(command) {
108
+ const executable = firstCommandToken(command);
109
+ if (isCodexExecutableToken(executable)) {
110
+ return true;
111
+ }
112
+ const normalized = command.replace(/\\/g, '/').toLowerCase();
113
+ if (normalized.includes('/@openai/codex/')) {
114
+ return true;
115
+ }
116
+ return command.split(/\s+/).some((token) => {
117
+ const tokenName = executableTokenBasename(token);
118
+ return tokenName === 'codex.js' || isCodexExecutableName(tokenName);
119
+ });
120
+ }
121
+ function firstCommandToken(command) {
122
+ const trimmed = command.trim();
123
+ const quoted = trimmed.match(/^"([^"]+)"/);
124
+ if (quoted?.[1])
125
+ return quoted[1];
126
+ return trimmed.split(/\s+/)[0] ?? '';
127
+ }
128
+ function isCodexExecutableToken(token) {
129
+ return isCodexExecutableName(executableTokenBasename(token));
130
+ }
131
+ function executableTokenBasename(token) {
132
+ return path.basename(token.replace(/^["']|["']$/g, '').replace(/\\/g, '/')).toLowerCase();
133
+ }
134
+ function isCodexExecutableName(name) {
135
+ return ['codex', 'codex.exe', 'codex.cmd', 'codex.ps1'].includes(name);
136
+ }
137
+ /**
138
+ * Read and validate auth.json with retry on torn-write (C3).
139
+ * Returns parsed auth JSON or throws on persistent failure.
140
+ */
141
+ async function readAuthJsonSafe(authSrcPath) {
142
+ let lastErr = null;
143
+ for (let attempt = 0; attempt < MAX_READ_RETRIES; attempt++) {
144
+ try {
145
+ const buf = fs.readFileSync(authSrcPath, 'utf8');
146
+ const parsed = JSON.parse(buf);
147
+ // Reject cliproxy-format auth files
148
+ if (typeof parsed[CLIPROXY_TYPE_MARKER] === 'string' &&
149
+ (parsed[CLIPROXY_TYPE_MARKER] === 'codex' ||
150
+ parsed[CLIPROXY_TYPE_MARKER] === 'anthropic' ||
151
+ parsed[CLIPROXY_TYPE_MARKER] === 'gemini')) {
152
+ throw new Error(`CLIPROXY_FORMAT: Source is a CLIProxy auth file (type="${parsed[CLIPROXY_TYPE_MARKER]}"); use \`ccs cliproxy ...\` instead.`);
153
+ }
154
+ // Validate JWT shape: must have tokens.id_token with a parseable JWT payload.
155
+ const tokens = parsed['tokens'];
156
+ if (tokens) {
157
+ const idToken = tokens['id_token'];
158
+ if (typeof idToken === 'string' && idToken.length > 0) {
159
+ if (!(0, decode_id_token_1.hasStructurallyValidIdToken)(idToken)) {
160
+ // Torn write mid-JWT — retry
161
+ throw new Error('TORN_JWT: id_token payload is not parseable');
162
+ }
163
+ }
164
+ }
165
+ return parsed;
166
+ }
167
+ catch (err) {
168
+ if (err instanceof Error && err.message.startsWith('CLIPROXY_FORMAT:')) {
169
+ throw err; // never retry CLIProxy format rejection
170
+ }
171
+ lastErr = err instanceof Error ? err : new Error(String(err));
172
+ logger.warn('codex-auth.import-default.torn-read', `Read attempt ${attempt + 1}/${MAX_READ_RETRIES} failed: ${lastErr.message}`);
173
+ if (attempt < MAX_READ_RETRIES - 1) {
174
+ await sleep(RETRY_DELAY_MS);
175
+ }
176
+ }
177
+ }
178
+ throw new Error(`Failed to read a valid auth.json after ${MAX_READ_RETRIES} attempts: ${lastErr?.message ?? 'unknown'}`);
179
+ }
180
+ /**
181
+ * Atomic copy: write to tmp.<pid>.<rand>, fsync, rename to dest.
182
+ * Preserves 0600 permissions.
183
+ */
184
+ function atomicWriteFile(dest, content) {
185
+ const tmpPath = `${dest}.tmp.${process.pid}.${Math.random().toString(36).slice(2)}`;
186
+ try {
187
+ fs.writeFileSync(tmpPath, content, { mode: 0o600 });
188
+ // fsync via close-and-reopen pattern (Bun/Node doesn't expose fd fsync easily)
189
+ const fd = fs.openSync(tmpPath, 'r');
190
+ fs.fsyncSync(fd);
191
+ fs.closeSync(fd);
192
+ fs.renameSync(tmpPath, dest);
193
+ }
194
+ catch (err) {
195
+ try {
196
+ fs.unlinkSync(tmpPath);
197
+ }
198
+ catch {
199
+ // best-effort cleanup
200
+ }
201
+ throw err;
202
+ }
203
+ }
204
+ /**
205
+ * Copy a file if it exists; silently skip if not.
206
+ * Returns 'copied' | 'missing'.
207
+ */
208
+ function copyIfPresent(src, dest) {
209
+ if (!fs.existsSync(src))
210
+ return 'missing';
211
+ const content = fs.readFileSync(src, 'utf8');
212
+ atomicWriteFile(dest, content);
213
+ return 'copied';
214
+ }
215
+ /**
216
+ * Recursively copy a directory if it exists.
217
+ * Returns count of files copied, or -1 if dir missing.
218
+ */
219
+ function copyDirIfPresent(srcDir, destDir) {
220
+ if (!fs.existsSync(srcDir))
221
+ return -1;
222
+ fs.mkdirSync(destDir, { recursive: true, mode: 0o700 });
223
+ let count = 0;
224
+ for (const entry of fs.readdirSync(srcDir)) {
225
+ const srcEntry = path.join(srcDir, entry);
226
+ const destEntry = path.join(destDir, entry);
227
+ const stat = fs.lstatSync(srcEntry);
228
+ if (stat.isDirectory()) {
229
+ count += copyDirIfPresent(srcEntry, destEntry);
230
+ }
231
+ else if (stat.isFile()) {
232
+ fs.copyFileSync(srcEntry, destEntry);
233
+ count++;
234
+ }
235
+ }
236
+ return count;
237
+ }
238
+ function parseImportDefaultArgs(rawArgs) {
239
+ // --with-history, --force, --force-while-running are distinct flags
240
+ const parsed = (0, types_1.parseArgs)(rawArgs);
241
+ const unknownFlags = parsed.unknownFlags?.filter((flag) => flag !== '--with-history' && flag !== '--force-while-running');
242
+ (0, types_1.rejectUnsupportedOptions)({ ...parsed, unknownFlags }, IMPORT_DEFAULT_USAGE, { force: true });
243
+ const withHistory = rawArgs.includes('--with-history');
244
+ const forceWhileRunning = rawArgs.includes('--force-while-running');
245
+ if (!parsed.profileName)
246
+ return null;
247
+ return {
248
+ name: parsed.profileName,
249
+ withHistory,
250
+ force: parsed.force ?? false,
251
+ forceWhileRunning,
252
+ };
253
+ }
254
+ async function handleImportDefaultCodex(ctx, rawArgs) {
255
+ await (0, ui_2.initUI)();
256
+ const args = parseImportDefaultArgs(rawArgs);
257
+ if (!args) {
258
+ console.log(`Usage: ${IMPORT_DEFAULT_USAGE}`);
259
+ (0, errors_1.exitWithError)('Profile name required', exit_codes_1.ExitCode.PROFILE_ERROR);
260
+ return;
261
+ }
262
+ const nameError = (0, types_1.getProfileNameError)(args.name);
263
+ if (nameError) {
264
+ (0, errors_1.exitWithError)(nameError, exit_codes_1.ExitCode.PROFILE_ERROR);
265
+ return;
266
+ }
267
+ // Resolve legacy Codex home — LEGACY_CODEX_HOME env allows test hermeticity (D decision)
268
+ const legacyCodexHome = process.env['LEGACY_CODEX_HOME'] ?? path.join(os.homedir(), '.codex');
269
+ const legacyAuthPath = path.join(legacyCodexHome, 'auth.json');
270
+ // Check legacy auth.json exists
271
+ if (!fs.existsSync(legacyAuthPath)) {
272
+ console.log(` Use \`ccsx auth login ${args.name}\` to authenticate a new profile instead.`);
273
+ (0, errors_1.exitWithError)('No legacy auth.json', exit_codes_1.ExitCode.PROFILE_ERROR);
274
+ return;
275
+ }
276
+ const { registry } = ctx;
277
+ // Profile collision check
278
+ if (registry.hasProfile(args.name) && !args.force) {
279
+ console.log(` Use --force to overwrite (a .bak-<ts> backup will be created).`);
280
+ (0, errors_1.exitWithError)('Profile already exists', exit_codes_1.ExitCode.PROFILE_ERROR);
281
+ return;
282
+ }
283
+ // Detect Codex running (C3)
284
+ const codexPid = detectCodexRunning();
285
+ if (codexPid && !args.forceWhileRunning) {
286
+ process.stderr.write(`[!] Codex appears to be running (PID ${codexPid}). A token refresh may be in flight.\n`);
287
+ process.stderr.write(` Quit Codex first, then re-run import-default. Or pass --force-while-running to proceed anyway.\n`);
288
+ (0, errors_1.exitWithError)('Codex is running', exit_codes_1.ExitCode.PROFILE_ERROR);
289
+ return;
290
+ }
291
+ if (codexPid && args.forceWhileRunning) {
292
+ process.stderr.write(`[!] Proceeding with Codex running (--force-while-running). Be aware a refresh may race.\n`);
293
+ }
294
+ // Read + validate source (C3 torn-write protection)
295
+ let authData;
296
+ try {
297
+ authData = await readAuthJsonSafe(legacyAuthPath);
298
+ }
299
+ catch (err) {
300
+ if (err instanceof Error && err.message.startsWith('CLIPROXY_FORMAT:')) {
301
+ (0, errors_1.exitWithError)(err.message, exit_codes_1.ExitCode.PROFILE_ERROR);
302
+ return;
303
+ }
304
+ const msg = err instanceof Error ? err.message : String(err);
305
+ (0, errors_1.exitWithError)(msg, exit_codes_1.ExitCode.GENERAL_ERROR);
306
+ return;
307
+ }
308
+ const profileDir = (0, index_1.resolveCodexProfileDir)(args.name);
309
+ // Create dir
310
+ fs.mkdirSync(profileDir, { recursive: true, mode: 0o700 });
311
+ const destAuthPath = path.join(profileDir, 'auth.json');
312
+ // Backup existing auth.json if --force overwrite
313
+ if (args.force && fs.existsSync(destAuthPath)) {
314
+ const bakPath = `${destAuthPath}.bak-${Date.now()}`;
315
+ fs.copyFileSync(destAuthPath, bakPath);
316
+ process.stderr.write(`[i] Backed up existing auth.json to ${path.basename(bakPath)}\n`);
317
+ }
318
+ // Atomic write (C3)
319
+ atomicWriteFile(destAuthPath, JSON.stringify(authData, null, 2));
320
+ logger.stage('dispatch', 'codex-auth.import-default.copied', 'Copied auth.json to profile', {
321
+ name: args.name,
322
+ dest: destAuthPath,
323
+ });
324
+ // Optional: copy history + sessions (D8 default false)
325
+ let historyStatus;
326
+ let sessionsStatus;
327
+ if (args.withHistory) {
328
+ const legacyHistoryPath = path.join(legacyCodexHome, 'history.jsonl');
329
+ const destHistoryPath = path.join(profileDir, 'history.jsonl');
330
+ const historyCopied = copyIfPresent(legacyHistoryPath, destHistoryPath);
331
+ historyStatus = historyCopied === 'copied' ? 'copied' : 'not present';
332
+ const legacySessionsDir = path.join(legacyCodexHome, 'sessions');
333
+ const destSessionsDir = path.join(profileDir, 'sessions');
334
+ const sessionCount = copyDirIfPresent(legacySessionsDir, destSessionsDir);
335
+ sessionsStatus = sessionCount >= 0 ? `copied ${sessionCount} files` : 'not present';
336
+ }
337
+ else {
338
+ historyStatus = 'not requested';
339
+ sessionsStatus = 'not requested';
340
+ }
341
+ // Ensure shared config symlink (reuse Phase 1 helper)
342
+ try {
343
+ (0, index_1.ensureSharedConfigSymlink)(profileDir);
344
+ }
345
+ catch (err) {
346
+ const msg = err instanceof Error ? err.message : String(err);
347
+ logger.warn('codex-auth.import-default.symlink-failed', 'Symlink creation failed', {
348
+ profileDir,
349
+ error: msg,
350
+ });
351
+ (0, errors_1.exitWithError)(`Failed to prepare profile config.toml: ${msg}`, exit_codes_1.ExitCode.CONFIG_ERROR);
352
+ return;
353
+ }
354
+ // Decode email for display (best-effort)
355
+ const tokens = authData['tokens'];
356
+ const idToken = typeof tokens?.['id_token'] === 'string' ? tokens['id_token'] : null;
357
+ const identity = idToken ? (0, index_1.decodeIdToken)(idToken) : {};
358
+ const emailDisplay = identity.email ?? '(unknown)';
359
+ // Register in registry
360
+ if (registry.hasProfile(args.name)) {
361
+ registry.updateProfile(args.name, {
362
+ last_used: new Date().toISOString(),
363
+ email: identity.email,
364
+ plan_type: identity.plan_type ?? null,
365
+ account_id: identity.account_id,
366
+ });
367
+ }
368
+ else {
369
+ registry.createProfile(args.name, {
370
+ created: new Date().toISOString(),
371
+ last_used: new Date().toISOString(),
372
+ email: identity.email,
373
+ plan_type: identity.plan_type ?? null,
374
+ account_id: identity.account_id,
375
+ });
376
+ }
377
+ // Print summary
378
+ console.log((0, ui_1.ok)(`Imported legacy ${legacyAuthPath} -> profile '${args.name}'`));
379
+ console.log(` Email : ${emailDisplay}`);
380
+ console.log(` History : ${historyStatus}`);
381
+ console.log(` Sessions: ${sessionsStatus}`);
382
+ console.log(` Next : ccsx auth switch ${args.name}`);
383
+ }
384
+ exports.handleImportDefaultCodex = handleImportDefaultCodex;
385
+ //# sourceMappingURL=import-default-command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"import-default-command.js","sourceRoot":"","sources":["../../../src/codex-auth/commands/import-default-command.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Barrel export for codex-auth command handlers.
3
+ */
4
+ export { handleCreateCodex } from './create-command';
5
+ export { handleLoginCodex } from './login-command';
6
+ export { handleSwitchCodex } from './switch-command';
7
+ export { handleUseCodex } from './use-command';
8
+ export { handleShowCodex } from './show-command';
9
+ export { handleRemoveCodex } from './remove-command';
10
+ export { handleImportDefaultCodex } from './import-default-command';
11
+ export type { CodexCommandContext, CodexAuthArgs, CodexProfileOutput } from './types';
12
+ export { parseArgs, rejectUnsupportedOptions, isValidCodexProfileName, getProfileNameError, formatRelativeTime, } from './types';
13
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/codex-auth/commands/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AACpE,YAAY,EAAE,mBAAmB,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AACtF,OAAO,EACL,SAAS,EACT,wBAAwB,EACxB,uBAAuB,EACvB,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,SAAS,CAAC"}
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ /**
3
+ * Barrel export for codex-auth command handlers.
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.formatRelativeTime = exports.getProfileNameError = exports.isValidCodexProfileName = exports.rejectUnsupportedOptions = exports.parseArgs = exports.handleImportDefaultCodex = exports.handleRemoveCodex = exports.handleShowCodex = exports.handleUseCodex = exports.handleSwitchCodex = exports.handleLoginCodex = exports.handleCreateCodex = void 0;
7
+ var create_command_1 = require("./create-command");
8
+ Object.defineProperty(exports, "handleCreateCodex", { enumerable: true, get: function () { return create_command_1.handleCreateCodex; } });
9
+ var login_command_1 = require("./login-command");
10
+ Object.defineProperty(exports, "handleLoginCodex", { enumerable: true, get: function () { return login_command_1.handleLoginCodex; } });
11
+ var switch_command_1 = require("./switch-command");
12
+ Object.defineProperty(exports, "handleSwitchCodex", { enumerable: true, get: function () { return switch_command_1.handleSwitchCodex; } });
13
+ var use_command_1 = require("./use-command");
14
+ Object.defineProperty(exports, "handleUseCodex", { enumerable: true, get: function () { return use_command_1.handleUseCodex; } });
15
+ var show_command_1 = require("./show-command");
16
+ Object.defineProperty(exports, "handleShowCodex", { enumerable: true, get: function () { return show_command_1.handleShowCodex; } });
17
+ var remove_command_1 = require("./remove-command");
18
+ Object.defineProperty(exports, "handleRemoveCodex", { enumerable: true, get: function () { return remove_command_1.handleRemoveCodex; } });
19
+ var import_default_command_1 = require("./import-default-command");
20
+ Object.defineProperty(exports, "handleImportDefaultCodex", { enumerable: true, get: function () { return import_default_command_1.handleImportDefaultCodex; } });
21
+ var types_1 = require("./types");
22
+ Object.defineProperty(exports, "parseArgs", { enumerable: true, get: function () { return types_1.parseArgs; } });
23
+ Object.defineProperty(exports, "rejectUnsupportedOptions", { enumerable: true, get: function () { return types_1.rejectUnsupportedOptions; } });
24
+ Object.defineProperty(exports, "isValidCodexProfileName", { enumerable: true, get: function () { return types_1.isValidCodexProfileName; } });
25
+ Object.defineProperty(exports, "getProfileNameError", { enumerable: true, get: function () { return types_1.getProfileNameError; } });
26
+ Object.defineProperty(exports, "formatRelativeTime", { enumerable: true, get: function () { return types_1.formatRelativeTime; } });
27
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/codex-auth/commands/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEH,mDAAqD;AAA5C,mHAAA,iBAAiB,OAAA;AAC1B,iDAAmD;AAA1C,iHAAA,gBAAgB,OAAA;AACzB,mDAAqD;AAA5C,mHAAA,iBAAiB,OAAA;AAC1B,6CAA+C;AAAtC,6GAAA,cAAc,OAAA;AACvB,+CAAiD;AAAxC,+GAAA,eAAe,OAAA;AACxB,mDAAqD;AAA5C,mHAAA,iBAAiB,OAAA;AAC1B,mEAAoE;AAA3D,kIAAA,wBAAwB,OAAA;AAEjC,iCAMiB;AALf,kGAAA,SAAS,OAAA;AACT,iHAAA,wBAAwB,OAAA;AACxB,gHAAA,uBAAuB,OAAA;AACvB,4GAAA,mBAAmB,OAAA;AACnB,2GAAA,kBAAkB,OAAA"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * codex-auth login command.
3
+ * Spawns `codex login` with CODEX_HOME pinned to the profile dir.
4
+ * Auto-creates profile if it doesn't exist yet.
5
+ * Updates registry with email/plan from JWT after successful login.
6
+ */
7
+ import type { CodexCommandContext } from './types';
8
+ export declare function handleLoginCodex(ctx: CodexCommandContext, args: string[]): Promise<void>;
9
+ //# sourceMappingURL=login-command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login-command.d.ts","sourceRoot":"","sources":["../../../src/codex-auth/commands/login-command.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAcH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAInD,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,mBAAmB,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAsG9F"}
@@ -0,0 +1,152 @@
1
+ "use strict";
2
+ /**
3
+ * codex-auth login command.
4
+ * Spawns `codex login` with CODEX_HOME pinned to the profile dir.
5
+ * Auto-creates profile if it doesn't exist yet.
6
+ * Updates registry with email/plan from JWT after successful login.
7
+ */
8
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
9
+ if (k2 === undefined) k2 = k;
10
+ var desc = Object.getOwnPropertyDescriptor(m, k);
11
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
12
+ desc = { enumerable: true, get: function() { return m[k]; } };
13
+ }
14
+ Object.defineProperty(o, k2, desc);
15
+ }) : (function(o, m, k, k2) {
16
+ if (k2 === undefined) k2 = k;
17
+ o[k2] = m[k];
18
+ }));
19
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
20
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
21
+ }) : function(o, v) {
22
+ o["default"] = v;
23
+ });
24
+ var __importStar = (this && this.__importStar) || function (mod) {
25
+ if (mod && mod.__esModule) return mod;
26
+ var result = {};
27
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
28
+ __setModuleDefault(result, mod);
29
+ return result;
30
+ };
31
+ Object.defineProperty(exports, "__esModule", { value: true });
32
+ exports.handleLoginCodex = void 0;
33
+ const fs = __importStar(require("fs"));
34
+ const path = __importStar(require("path"));
35
+ const childProcess = __importStar(require("child_process"));
36
+ const logging_1 = require("../../services/logging");
37
+ const ui_1 = require("../../utils/ui");
38
+ const errors_1 = require("../../errors");
39
+ const exit_codes_1 = require("../../errors/exit-codes");
40
+ const index_1 = require("../index");
41
+ const codex_account_identity_1 = require("../codex-account-identity");
42
+ const codex_detector_1 = require("../../targets/codex-detector");
43
+ const types_1 = require("./types");
44
+ const logger = (0, logging_1.createLogger)('codex-auth:cmd:login');
45
+ async function handleLoginCodex(ctx, args) {
46
+ await (0, ui_1.initUI)();
47
+ const parsed = (0, types_1.parseArgs)(args);
48
+ (0, types_1.rejectUnsupportedOptions)(parsed, 'ccsx auth login <name>');
49
+ const { profileName } = parsed;
50
+ if (!profileName) {
51
+ console.log('Usage: ccsx auth login <name>');
52
+ (0, errors_1.exitWithError)('Profile name required', exit_codes_1.ExitCode.PROFILE_ERROR);
53
+ return;
54
+ }
55
+ const nameError = (0, types_1.getProfileNameError)(profileName);
56
+ if (nameError) {
57
+ (0, errors_1.exitWithError)(nameError, exit_codes_1.ExitCode.PROFILE_ERROR);
58
+ return;
59
+ }
60
+ const { registry } = ctx;
61
+ const profileDir = (0, index_1.resolveCodexProfileDir)(profileName);
62
+ // Auto-create profile if missing
63
+ if (!registry.hasProfile(profileName)) {
64
+ console.log((0, ui_1.info)(`Auto-creating profile ${profileName}`));
65
+ ensureProfileDirReady(profileDir);
66
+ registry.createProfile(profileName, {
67
+ created: new Date().toISOString(),
68
+ last_used: null,
69
+ });
70
+ }
71
+ const codexCli = (0, codex_detector_1.detectCodexCli)();
72
+ if (!codexCli) {
73
+ console.log('');
74
+ console.log('Install:');
75
+ console.log(' npm i -g @openai/codex');
76
+ console.log(' # or follow https://github.com/openai/codex#install');
77
+ console.log('');
78
+ console.log(`After installing, re-run:`);
79
+ console.log(` ccsx auth login ${profileName}`);
80
+ (0, errors_1.exitWithError)('codex CLI not found', exit_codes_1.ExitCode.BINARY_ERROR);
81
+ return;
82
+ }
83
+ // Ensure profile dir exists (may have been deleted)
84
+ if (!fs.existsSync(profileDir)) {
85
+ ensureProfileDirReady(profileDir);
86
+ }
87
+ const authJsonPath = path.join(profileDir, 'auth.json');
88
+ const authJsonExisted = fs.existsSync(authJsonPath);
89
+ console.log((0, ui_1.info)(`Launching codex login for profile: ${profileName}`));
90
+ console.log(` CODEX_HOME=${profileDir}`);
91
+ console.log('');
92
+ const exitCode = await new Promise((resolve) => {
93
+ const child = childProcess.spawn(codexCli, ['login'], {
94
+ stdio: 'inherit',
95
+ env: { ...process.env, CODEX_HOME: profileDir },
96
+ windowsHide: true,
97
+ });
98
+ child.on('error', (err) => {
99
+ process.stderr.write(`[X] Failed to execute codex: ${err.message}\n`);
100
+ logger.warn('codex-auth.login.spawn-error', 'Spawn failed', { error: err.message });
101
+ resolve(exit_codes_1.ExitCode.BINARY_ERROR);
102
+ });
103
+ child.on('exit', (code) => {
104
+ resolve(code ?? 1);
105
+ });
106
+ });
107
+ if (exitCode === 0 && fs.existsSync(authJsonPath)) {
108
+ const identity = (0, codex_account_identity_1.decodeAccountIdentity)(authJsonPath);
109
+ const now = new Date().toISOString();
110
+ const metadataUpdate = { last_used: now };
111
+ if (identity.email !== undefined)
112
+ metadataUpdate.email = identity.email;
113
+ if (identity.plan_type !== undefined)
114
+ metadataUpdate.plan_type = identity.plan_type;
115
+ if (identity.account_id !== undefined)
116
+ metadataUpdate.account_id = identity.account_id;
117
+ registry.updateProfile(profileName, metadataUpdate);
118
+ const emailStr = identity.email ?? '<unknown>';
119
+ const planStr = identity.plan_type ? ` (plan: ${identity.plan_type})` : '';
120
+ console.log((0, ui_1.ok)(`Logged in as ${emailStr}${planStr}`));
121
+ console.log(` Profile: ${profileName}`);
122
+ console.log(` Updated: ${now}`);
123
+ }
124
+ else if (exitCode === 0) {
125
+ process.stderr.write('[!] codex login exited cleanly but no auth.json. Skipping registry update.\n');
126
+ }
127
+ else {
128
+ if (!authJsonExisted) {
129
+ process.stderr.write(`[!] Login cancelled or failed. Profile ${profileName} remains unauthenticated.\n`);
130
+ }
131
+ else {
132
+ process.stderr.write('[!] Login failed. Previous credentials may still be valid.\n');
133
+ }
134
+ process.exit(exit_codes_1.ExitCode.AUTH_ERROR);
135
+ }
136
+ }
137
+ exports.handleLoginCodex = handleLoginCodex;
138
+ function ensureProfileDirReady(profileDir) {
139
+ try {
140
+ fs.mkdirSync(profileDir, { recursive: true, mode: 0o700 });
141
+ (0, index_1.ensureSharedConfigSymlink)(profileDir);
142
+ }
143
+ catch (err) {
144
+ const msg = err instanceof Error ? err.message : String(err);
145
+ logger.warn('codex-auth.login.config-repair-failed', 'Config repair failed', {
146
+ profileDir,
147
+ error: msg,
148
+ });
149
+ (0, errors_1.exitWithError)(`Failed to prepare profile config.toml: ${msg}`, exit_codes_1.ExitCode.CONFIG_ERROR);
150
+ }
151
+ }
152
+ //# sourceMappingURL=login-command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login-command.js","sourceRoot":"","sources":["../../../src/codex-auth/commands/login-command.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * codex-auth remove command.
3
+ * Deletes profile dir + registry entry.
4
+ * Guards: refuses to remove the default when others exist (unless --force).
5
+ * Best-effort warning if CCS_CODEX_PROFILE points to it.
6
+ * --yes skips confirmation prompt.
7
+ */
8
+ import type { CodexCommandContext } from './types';
9
+ export declare function handleRemoveCodex(ctx: CodexCommandContext, args: string[]): Promise<void>;
10
+ //# sourceMappingURL=remove-command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remove-command.d.ts","sourceRoot":"","sources":["../../../src/codex-auth/commands/remove-command.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAWH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAGnD,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,mBAAmB,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA6K/F"}