@tuannvm/ccodex 0.1.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.
package/dist/config.js ADDED
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Runtime configuration constants
3
+ */
4
+ import { join } from 'path';
5
+ import { homedir } from 'os';
6
+ export const CONFIG = {
7
+ // Proxy configuration
8
+ PROXY_HOST: '127.0.0.1',
9
+ PROXY_PORT: 8317,
10
+ PROXY_STARTUP_MAX_RETRIES: 10,
11
+ PROXY_STARTUP_RETRY_DELAY_MS: 1000,
12
+ AUTH_WAIT_MAX_RETRIES: 30,
13
+ AUTH_WAIT_RETRY_DELAY_MS: 1000,
14
+ // Paths
15
+ AUTH_DIR_NAME: '.cli-proxy-api',
16
+ CACHE_DIR_NAME: '.cache',
17
+ LOG_FILE_NAME: 'ccodex-cliproxy.log',
18
+ ALIAS_FILE_NAME: 'ccodex-alias.zsh',
19
+ ALIAS_DIR: '.oh-my-zsh/custom',
20
+ LOCAL_BIN_DIR: '.local/bin',
21
+ CLAUDE_CONFIG_DIR: '.claude-openai',
22
+ // Timeouts (in milliseconds)
23
+ API_TIMEOUT_MS: 120000,
24
+ };
25
+ /**
26
+ * Get proxy URL
27
+ */
28
+ export function getProxyUrl() {
29
+ return `http://${CONFIG.PROXY_HOST}:${CONFIG.PROXY_PORT}`;
30
+ }
31
+ /**
32
+ * Get auth directory path
33
+ */
34
+ export function getAuthDir() {
35
+ return join(homedir(), CONFIG.AUTH_DIR_NAME);
36
+ }
37
+ /**
38
+ * Get log file path
39
+ */
40
+ export function getLogFilePath() {
41
+ return join(homedir(), CONFIG.CACHE_DIR_NAME, CONFIG.LOG_FILE_NAME);
42
+ }
43
+ /**
44
+ * Get alias file path
45
+ */
46
+ export function getAliasFilePath() {
47
+ return join(homedir(), CONFIG.ALIAS_DIR, CONFIG.ALIAS_FILE_NAME);
48
+ }
49
+ /**
50
+ * Get local bin path
51
+ */
52
+ export function getLocalBinPath() {
53
+ return join(homedir(), CONFIG.LOCAL_BIN_DIR);
54
+ }
55
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAE7B,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,sBAAsB;IACtB,UAAU,EAAE,WAAW;IACvB,UAAU,EAAE,IAAI;IAChB,yBAAyB,EAAE,EAAE;IAC7B,4BAA4B,EAAE,IAAI;IAClC,qBAAqB,EAAE,EAAE;IACzB,wBAAwB,EAAE,IAAI;IAE9B,QAAQ;IACR,aAAa,EAAE,gBAAgB;IAC/B,cAAc,EAAE,QAAQ;IACxB,aAAa,EAAE,qBAAqB;IACpC,eAAe,EAAE,kBAAkB;IACnC,SAAS,EAAE,mBAAmB;IAC9B,aAAa,EAAE,YAAY;IAC3B,iBAAiB,EAAE,gBAAgB;IAEnC,6BAA6B;IAC7B,cAAc,EAAE,MAAM;CACd,CAAC;AAEX;;GAEG;AACH,MAAM,UAAU,WAAW;IACzB,OAAO,UAAU,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;AAC5D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU;IACxB,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC;AAC/C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc;IAC5B,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,MAAM,CAAC,cAAc,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC;AACtE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB;IAC9B,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,eAAe,CAAC,CAAC;AACnE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe;IAC7B,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC;AAC/C,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * claudex - TypeScript reimplementation of ccodex
3
+ *
4
+ * Drop-in replacement for ccodex that runs Claude Code CLI with
5
+ * OpenAI GPT models via CLIProxyAPI.
6
+ */
7
+ export { runClaude } from './claude.js';
8
+ export { detectProxyCommand, isProxyRunning, checkAuthConfigured, installProxyApi, startProxy, launchLogin, waitForAuth } from './proxy.js';
9
+ export { installAliases, configureShellIntegration, hasAliasFile, isShellIntegrationConfigured } from './aliases.js';
10
+ export { printStatus, readyCheck, getStatus } from './status.js';
11
+ export type { Platform, ProxyCommand, AuthStatus, StatusResult, CliOptions, ShellConfig } from './types.js';
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,mBAAmB,EAAE,eAAe,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC5I,OAAO,EAAE,cAAc,EAAE,yBAAyB,EAAE,YAAY,EAAE,4BAA4B,EAAE,MAAM,cAAc,CAAC;AACrH,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAGjE,YAAY,EAAE,QAAQ,EAAE,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,12 @@
1
+ /**
2
+ * claudex - TypeScript reimplementation of ccodex
3
+ *
4
+ * Drop-in replacement for ccodex that runs Claude Code CLI with
5
+ * OpenAI GPT models via CLIProxyAPI.
6
+ */
7
+ // Re-export main functions
8
+ export { runClaude } from './claude.js';
9
+ export { detectProxyCommand, isProxyRunning, checkAuthConfigured, installProxyApi, startProxy, launchLogin, waitForAuth } from './proxy.js';
10
+ export { installAliases, configureShellIntegration, hasAliasFile, isShellIntegrationConfigured } from './aliases.js';
11
+ export { printStatus, readyCheck, getStatus } from './status.js';
12
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,2BAA2B;AAC3B,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,mBAAmB,EAAE,eAAe,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC5I,OAAO,EAAE,cAAc,EAAE,yBAAyB,EAAE,YAAY,EAAE,4BAA4B,EAAE,MAAM,cAAc,CAAC;AACrH,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * PowerShell-specific utilities for Windows support
3
+ */
4
+ /**
5
+ * Get PowerShell profile path
6
+ * Prefers PowerShell 7 (pwsh) profile, falls back to WindowsPowerShell
7
+ */
8
+ export declare function getPowerShellProfilePath(): string | null;
9
+ /**
10
+ * Generate PowerShell alias content
11
+ */
12
+ export declare function generatePowerShellAlias(): Promise<string>;
13
+ /**
14
+ * Install PowerShell aliases
15
+ */
16
+ export declare function installPowerShellAliases(): Promise<boolean>;
17
+ /**
18
+ * Check if PowerShell integration is configured
19
+ */
20
+ export declare function isPowerShellIntegrationConfigured(): Promise<boolean>;
21
+ //# sourceMappingURL=powershell.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"powershell.d.ts","sourceRoot":"","sources":["../src/powershell.ts"],"names":[],"mappings":"AAAA;;GAEG;AASH;;;GAGG;AACH,wBAAgB,wBAAwB,IAAI,MAAM,GAAG,IAAI,CA4BxD;AAED;;GAEG;AACH,wBAAsB,uBAAuB,IAAI,OAAO,CAAC,MAAM,CAAC,CAc/D;AAED;;GAEG;AACH,wBAAsB,wBAAwB,IAAI,OAAO,CAAC,OAAO,CAAC,CA6BjE;AAUD;;GAEG;AACH,wBAAsB,iCAAiC,IAAI,OAAO,CAAC,OAAO,CAAC,CAY1E"}
@@ -0,0 +1,106 @@
1
+ /**
2
+ * PowerShell-specific utilities for Windows support
3
+ */
4
+ import { join } from 'path';
5
+ import { homedir } from 'os';
6
+ import { fileExists, ensureDir, appendFile, debugLog } from './utils.js';
7
+ // Use npx directly - no local bin installation
8
+ const CCODEX_NPX_CMD = 'npx -y ccodex';
9
+ /**
10
+ * Get PowerShell profile path
11
+ * Prefers PowerShell 7 (pwsh) profile, falls back to WindowsPowerShell
12
+ */
13
+ export function getPowerShellProfilePath() {
14
+ const home = homedir();
15
+ // Try different PowerShell profile locations
16
+ // Prefer PowerShell 7 profile, fall back to WindowsPowerShell
17
+ const candidates = [
18
+ join(home, 'Documents', 'PowerShell', 'Microsoft.PowerShell_profile.ps1'), // PowerShell 7 (pwsh)
19
+ join(home, 'Documents', 'WindowsPowerShell', 'Microsoft.PowerShell_profile.ps1'), // WindowsPowerShell 5.x
20
+ ];
21
+ // If a profile file exists, use it
22
+ for (const candidate of candidates) {
23
+ if (fileExists(candidate)) {
24
+ return candidate;
25
+ }
26
+ }
27
+ // If using pwsh (PowerShell 7), default to its profile location
28
+ // Check for pwsh by looking for the executable or PSModulePath pattern
29
+ const isPwsh = process.env.PSModulePath?.includes('PowerShell') &&
30
+ !process.env.PSModulePath?.includes('WindowsPowerShell');
31
+ if (isPwsh) {
32
+ return candidates[0]; // PowerShell 7 profile
33
+ }
34
+ // Default to WindowsPowerShell path
35
+ return candidates[1];
36
+ }
37
+ /**
38
+ * Generate PowerShell alias content
39
+ */
40
+ export async function generatePowerShellAlias() {
41
+ return `# ccodex aliases - generated by npx ccodex
42
+ function ccodex {
43
+ npx -y ccodex $args
44
+ }
45
+
46
+ function co {
47
+ npx -y ccodex $args
48
+ }
49
+
50
+ function claude-openai {
51
+ npx -y ccodex $args
52
+ }
53
+ `;
54
+ }
55
+ /**
56
+ * Install PowerShell aliases
57
+ */
58
+ export async function installPowerShellAliases() {
59
+ const profilePath = getPowerShellProfilePath();
60
+ if (!profilePath) {
61
+ debugLog('Could not determine PowerShell profile path');
62
+ return false;
63
+ }
64
+ // Ensure profile directory exists
65
+ await ensureDir(join(profilePath, '..'));
66
+ // Check if already configured with our aliases
67
+ if (fileExists(profilePath)) {
68
+ const content = await readFile(profilePath);
69
+ // Check for all three expected functions to be present
70
+ const hasCcodex = /\bccodex\s*\{[\s\S]*?npx -y ccodex/.test(content);
71
+ const hasCo = /\bco\s*\{[\s\S]*?npx -y ccodex/.test(content);
72
+ const hasClaudeOpenai = /\bclaude-openai\s*\{[\s\S]*?npx -y ccodex/.test(content);
73
+ if (hasCcodex && hasCo && hasClaudeOpenai) {
74
+ console.log('PowerShell aliases already installed');
75
+ return true;
76
+ }
77
+ }
78
+ // Append aliases to profile
79
+ const aliasContent = await generatePowerShellAlias();
80
+ await appendFile(profilePath, aliasContent);
81
+ console.log(`Installed PowerShell aliases: ${profilePath}`);
82
+ return true;
83
+ }
84
+ /**
85
+ * Read file content (internal helper)
86
+ */
87
+ async function readFile(path) {
88
+ const fs = await import('fs/promises');
89
+ return await fs.readFile(path, 'utf-8');
90
+ }
91
+ /**
92
+ * Check if PowerShell integration is configured
93
+ */
94
+ export async function isPowerShellIntegrationConfigured() {
95
+ const profilePath = getPowerShellProfilePath();
96
+ if (!profilePath || !fileExists(profilePath)) {
97
+ return false;
98
+ }
99
+ const content = await readFile(profilePath);
100
+ // Check for all three expected functions with proper syntax
101
+ const hasCcodex = /\bccodex\s*\{[\s\S]*?npx -y ccodex/.test(content);
102
+ const hasCo = /\bco\s*\{[\s\S]*?npx -y ccodex/.test(content);
103
+ const hasClaudeOpenai = /\bclaude-openai\s*\{[\s\S]*?npx -y ccodex/.test(content);
104
+ return hasCcodex && hasCo && hasClaudeOpenai;
105
+ }
106
+ //# sourceMappingURL=powershell.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"powershell.js","sourceRoot":"","sources":["../src/powershell.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import type { ProxyCommand, AuthStatus } from './types.js';
2
+ /**
3
+ * Detect CLIProxyAPI command
4
+ */
5
+ export declare function detectProxyCommand(): Promise<ProxyCommand>;
6
+ /**
7
+ * Check if proxy is running
8
+ */
9
+ export declare function isProxyRunning(): Promise<boolean>;
10
+ /**
11
+ * Check auth configuration
12
+ */
13
+ export declare function checkAuthConfigured(): Promise<AuthStatus>;
14
+ /**
15
+ * Install CLIProxyAPI via Homebrew (macOS/Linux only)
16
+ */
17
+ export declare function installProxyApi(): Promise<void>;
18
+ /**
19
+ * Start proxy in background
20
+ */
21
+ export declare function startProxy(): Promise<void>;
22
+ /**
23
+ * Launch OAuth login
24
+ */
25
+ export declare function launchLogin(): Promise<void>;
26
+ /**
27
+ * Wait for auth to be configured after login
28
+ */
29
+ export declare function waitForAuth(): Promise<void>;
30
+ //# sourceMappingURL=proxy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proxy.d.ts","sourceRoot":"","sources":["../src/proxy.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE3D;;GAEG;AACH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,YAAY,CAAC,CAmBhE;AAED;;GAEG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC,CAQvD;AAED;;GAEG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,UAAU,CAAC,CAqD/D;AAED;;GAEG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAsCrD;AAED;;GAEG;AACH,wBAAsB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAgEhD;AAED;;GAEG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAyBjD;AAED;;GAEG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAajD"}
package/dist/proxy.js ADDED
@@ -0,0 +1,231 @@
1
+ import { join } from 'path';
2
+ import { hasCommand, execCommand, httpGet, sleep, ensureDir, safeJsonParse, debugLog } from './utils.js';
3
+ import { CONFIG, getProxyUrl, getAuthDir, getLogFilePath } from './config.js';
4
+ /**
5
+ * Detect CLIProxyAPI command
6
+ */
7
+ export async function detectProxyCommand() {
8
+ if (await hasCommand('cliproxyapi')) {
9
+ try {
10
+ const path = await execCommand('which', ['cliproxyapi']);
11
+ return { cmd: 'cliproxyapi', path };
12
+ }
13
+ catch {
14
+ // which might fail, continue anyway
15
+ return { cmd: 'cliproxyapi', path: null };
16
+ }
17
+ }
18
+ if (await hasCommand('cliproxy')) {
19
+ try {
20
+ const path = await execCommand('which', ['cliproxy']);
21
+ return { cmd: 'cliproxy', path };
22
+ }
23
+ catch {
24
+ return { cmd: 'cliproxy', path: null };
25
+ }
26
+ }
27
+ return { cmd: null, path: null };
28
+ }
29
+ /**
30
+ * Check if proxy is running
31
+ */
32
+ export async function isProxyRunning() {
33
+ try {
34
+ const proxyUrl = getProxyUrl();
35
+ const { status } = await httpGet(`${proxyUrl}/v1/models`);
36
+ return status === 200 || status === 401;
37
+ }
38
+ catch {
39
+ return false;
40
+ }
41
+ }
42
+ /**
43
+ * Check auth configuration
44
+ */
45
+ export async function checkAuthConfigured() {
46
+ const authDir = getAuthDir();
47
+ // Check for auth files
48
+ const fs = await import('fs/promises');
49
+ let hasAuthFiles = false;
50
+ try {
51
+ const files = await fs.readdir(authDir);
52
+ hasAuthFiles = files.some(f => f.startsWith('codex-') && f.endsWith('.json'));
53
+ }
54
+ catch {
55
+ // Directory doesn't exist
56
+ debugLog('Auth directory does not exist:', authDir);
57
+ }
58
+ // Check auth via proxy status
59
+ let hasAuthEntries = false;
60
+ const cmdResult = await detectProxyCommand();
61
+ if (cmdResult.cmd) {
62
+ try {
63
+ const output = await execCommand(cmdResult.cmd, ['status']);
64
+ // Match "N auth entries" or "N auth files" where N > 0
65
+ const match = output.match(/(\d+)\s+(auth entries|auth files)/);
66
+ if (match) {
67
+ const count = parseInt(match[1], 10);
68
+ hasAuthEntries = count > 0;
69
+ }
70
+ }
71
+ catch (error) {
72
+ debugLog('Failed to check proxy status:', error);
73
+ }
74
+ }
75
+ // Check via API
76
+ let hasModels = false;
77
+ try {
78
+ const proxyUrl = getProxyUrl();
79
+ const response = await httpGet(`${proxyUrl}/v1/models`);
80
+ if (response.status === 200) {
81
+ const data = safeJsonParse(response.body);
82
+ hasModels = data?.object === 'list' && Array.isArray(data.data) && data.data.length > 0;
83
+ }
84
+ }
85
+ catch {
86
+ // Proxy not running or not authenticated
87
+ debugLog('Failed to check models via API');
88
+ }
89
+ return {
90
+ hasAuthFiles,
91
+ hasAuthEntries,
92
+ hasModels,
93
+ // Prioritize live API checks over cached files
94
+ // Only consider configured if we can actually list models OR have confirmed auth entries
95
+ configured: hasModels || (hasAuthEntries && hasAuthFiles),
96
+ };
97
+ }
98
+ /**
99
+ * Install CLIProxyAPI via Homebrew (macOS/Linux only)
100
+ */
101
+ export async function installProxyApi() {
102
+ // Check platform
103
+ const platform = process.platform;
104
+ if (platform === 'win32') {
105
+ throw new Error('CLIProxyAPI installation on Windows requires manual setup.\n' +
106
+ 'Please install CLIProxyAPI manually and ensure it\'s in your PATH.\n' +
107
+ 'See CLIProxyAPI documentation for Windows installation instructions.');
108
+ }
109
+ if (!(await hasCommand('brew'))) {
110
+ throw new Error('Homebrew not found. CLIProxyAPI requires Homebrew for installation on macOS/Linux.\n' +
111
+ 'Install Homebrew from https://brew.sh/ or install CLIProxyAPI manually.');
112
+ }
113
+ console.log('Installing CLIProxyAPI via Homebrew...');
114
+ const spawnCmd = (await import('cross-spawn')).default;
115
+ return new Promise((resolve, reject) => {
116
+ const child = spawnCmd('brew', ['install', 'cliproxyapi'], {
117
+ stdio: 'inherit',
118
+ });
119
+ child.on('close', (code) => {
120
+ if (code === 0) {
121
+ console.log('CLIProxyAPI installed successfully');
122
+ resolve();
123
+ }
124
+ else {
125
+ reject(new Error('Failed to install CLIProxyAPI via Homebrew'));
126
+ }
127
+ });
128
+ child.on('error', (error) => reject(error));
129
+ });
130
+ }
131
+ /**
132
+ * Start proxy in background
133
+ */
134
+ export async function startProxy() {
135
+ if (await isProxyRunning()) {
136
+ return;
137
+ }
138
+ const cmdResult = await detectProxyCommand();
139
+ const proxyCmd = cmdResult.cmd;
140
+ if (!proxyCmd) {
141
+ throw new Error('CLIProxyAPI not found. Run: npx -y ccodex');
142
+ }
143
+ console.log('Starting CLIProxyAPI in background...');
144
+ const logFile = getLogFilePath();
145
+ await ensureDir(join(logFile, '..'));
146
+ const { spawn } = await import('child_process');
147
+ const fs = await import('fs/promises');
148
+ let out = null;
149
+ try {
150
+ // Create log with restrictive permissions (user read/write only)
151
+ out = await fs.open(logFile, 'a');
152
+ // Set restrictive permissions on Unix/macOS (0600 = user read/write only)
153
+ if (process.platform !== 'win32') {
154
+ try {
155
+ await fs.chmod(logFile, 0o600);
156
+ }
157
+ catch {
158
+ // If chmod fails, continue anyway - the file was created successfully
159
+ debugLog('Warning: Could not set restrictive permissions on log file');
160
+ }
161
+ }
162
+ const child = spawn(proxyCmd, [], {
163
+ detached: true,
164
+ stdio: ['ignore', out.fd, out.fd],
165
+ });
166
+ // Handle spawn errors immediately (fail-fast)
167
+ await new Promise((resolve, reject) => {
168
+ child.once('error', (error) => {
169
+ reject(new Error(`Failed to start CLIProxyAPI: ${error.message}`));
170
+ });
171
+ child.once('spawn', () => resolve());
172
+ });
173
+ child.unref();
174
+ // Wait for proxy to be ready
175
+ for (let i = 0; i < CONFIG.PROXY_STARTUP_MAX_RETRIES; i++) {
176
+ await sleep(CONFIG.PROXY_STARTUP_RETRY_DELAY_MS);
177
+ if (await isProxyRunning()) {
178
+ console.log('CLIProxyAPI is running.');
179
+ return;
180
+ }
181
+ }
182
+ throw new Error(`CLIProxyAPI did not become ready. Check logs: ${logFile}`);
183
+ }
184
+ finally {
185
+ if (out) {
186
+ await out.close();
187
+ }
188
+ }
189
+ }
190
+ /**
191
+ * Launch OAuth login
192
+ */
193
+ export async function launchLogin() {
194
+ const cmdResult = await detectProxyCommand();
195
+ const proxyCmd = cmdResult.cmd;
196
+ if (!proxyCmd) {
197
+ throw new Error('CLIProxyAPI not found. Run: npx -y ccodex');
198
+ }
199
+ console.log('Launching ChatGPT/Codex OAuth login in browser...');
200
+ const spawnCmd = (await import('cross-spawn')).default;
201
+ return new Promise((resolve, reject) => {
202
+ const child = spawnCmd(proxyCmd, ['-codex-login'], {
203
+ stdio: 'inherit',
204
+ });
205
+ child.on('close', (code) => {
206
+ if (code === 0) {
207
+ resolve();
208
+ }
209
+ else {
210
+ reject(new Error('Login failed'));
211
+ }
212
+ });
213
+ child.on('error', (error) => reject(error));
214
+ });
215
+ }
216
+ /**
217
+ * Wait for auth to be configured after login
218
+ */
219
+ export async function waitForAuth() {
220
+ console.log('Waiting for authentication...');
221
+ for (let i = 0; i < CONFIG.AUTH_WAIT_MAX_RETRIES; i++) {
222
+ await sleep(CONFIG.AUTH_WAIT_RETRY_DELAY_MS);
223
+ const auth = await checkAuthConfigured();
224
+ if (auth.configured) {
225
+ console.log('Authentication configured.');
226
+ return;
227
+ }
228
+ }
229
+ throw new Error('Authentication still not configured after login.');
230
+ }
231
+ //# sourceMappingURL=proxy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proxy.js","sourceRoot":"","sources":["../src/proxy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { StatusResult } from './types.js';
2
+ /**
3
+ * Print full status
4
+ */
5
+ export declare function printStatus(): Promise<void>;
6
+ /**
7
+ * Get status result
8
+ */
9
+ export declare function getStatus(): Promise<StatusResult>;
10
+ /**
11
+ * Ready check with exit code
12
+ */
13
+ export declare function readyCheck(): Promise<boolean>;
14
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../src/status.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAa/C;;GAEG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAYjD;AAED;;GAEG;AACH,wBAAsB,SAAS,IAAI,OAAO,CAAC,YAAY,CAAC,CAuBvD;AAED;;GAEG;AACH,wBAAsB,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC,CAmBnD"}
package/dist/status.js ADDED
@@ -0,0 +1,73 @@
1
+ import chalk from 'chalk';
2
+ import { hasCommand } from './utils.js';
3
+ import { detectProxyCommand, isProxyRunning, checkAuthConfigured } from './proxy.js';
4
+ import { hasAliasFile, isShellIntegrationConfigured } from './aliases.js';
5
+ /**
6
+ * Print status line
7
+ */
8
+ function statusLine(label, ok) {
9
+ if (ok) {
10
+ console.log(chalk.green(' [OK]') + ' ' + label);
11
+ }
12
+ else {
13
+ console.log(chalk.red(' [MISSING]') + ' ' + label);
14
+ }
15
+ }
16
+ /**
17
+ * Print full status
18
+ */
19
+ export async function printStatus() {
20
+ console.log('');
21
+ console.log(chalk.bold('ccodex status'));
22
+ const result = await getStatus();
23
+ statusLine('CLIProxyAPI command available', result.proxyCommand);
24
+ statusLine('CLIProxyAPI running on 127.0.0.1:8317', result.proxyRunning);
25
+ statusLine('ChatGPT/Codex auth configured', result.authConfigured);
26
+ statusLine('ccodex/co/claude-openai aliases installed', result.aliasesInstalled);
27
+ statusLine('Shell rc integration configured', result.shellIntegration);
28
+ statusLine('Claude CLI available', result.claudeCliAvailable);
29
+ }
30
+ /**
31
+ * Get status result
32
+ */
33
+ export async function getStatus() {
34
+ const proxyCmd = await detectProxyCommand();
35
+ const proxyRunning = await isProxyRunning();
36
+ const auth = await checkAuthConfigured();
37
+ const aliasFile = await hasAliasFile();
38
+ const shellIntegration = await isShellIntegrationConfigured();
39
+ const claudeCli = await hasCommand('claude');
40
+ return {
41
+ proxyCommand: proxyCmd.cmd !== null,
42
+ proxyRunning,
43
+ authConfigured: auth.configured,
44
+ aliasesInstalled: aliasFile,
45
+ shellIntegration,
46
+ claudeCliAvailable: claudeCli,
47
+ ready: proxyCmd.cmd !== null &&
48
+ proxyRunning &&
49
+ auth.configured &&
50
+ aliasFile &&
51
+ shellIntegration &&
52
+ claudeCli,
53
+ };
54
+ }
55
+ /**
56
+ * Ready check with exit code
57
+ */
58
+ export async function readyCheck() {
59
+ await printStatus();
60
+ const result = await getStatus();
61
+ if (result.ready) {
62
+ console.log('');
63
+ console.log(chalk.green('Ready: run') + ' ' + chalk.bold('ccodex') + ', ' + chalk.bold('co') + ', or ' + chalk.bold('claude-openai') + '.');
64
+ return true;
65
+ }
66
+ console.log('');
67
+ console.log(chalk.yellow('Not ready: run') +
68
+ ' ' +
69
+ chalk.bold('npx -y ccodex') +
70
+ ' again to complete setup.');
71
+ return false;
72
+ }
73
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../src/status.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACrF,OAAO,EAAE,YAAY,EAAE,4BAA4B,EAAE,MAAM,cAAc,CAAC;AAG1E;;GAEG;AACH,SAAS,UAAU,CAAC,KAAa,EAAE,EAAW;IAC5C,IAAI,EAAE,EAAE,CAAC;QACP,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,QAAQ,GAAG,KAAK,CAAC,CAAC;IACxD,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,CAAC,GAAG,GAAG,GAAG,KAAK,CAAC,CAAC;IACtD,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC;IAEzC,MAAM,MAAM,GAAG,MAAM,SAAS,EAAE,CAAC;IAEjC,UAAU,CAAC,+BAA+B,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC;IACjE,UAAU,CAAC,uCAAuC,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC;IACzE,UAAU,CAAC,+BAA+B,EAAE,MAAM,CAAC,cAAc,CAAC,CAAC;IACnE,UAAU,CAAC,2CAA2C,EAAE,MAAM,CAAC,gBAAgB,CAAC,CAAC;IACjF,UAAU,CAAC,iCAAiC,EAAE,MAAM,CAAC,gBAAgB,CAAC,CAAC;IACvE,UAAU,CAAC,sBAAsB,EAAE,MAAM,CAAC,kBAAkB,CAAC,CAAC;AAChE,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS;IAC7B,MAAM,QAAQ,GAAG,MAAM,kBAAkB,EAAE,CAAC;IAC5C,MAAM,YAAY,GAAG,MAAM,cAAc,EAAE,CAAC;IAC5C,MAAM,IAAI,GAAG,MAAM,mBAAmB,EAAE,CAAC;IACzC,MAAM,SAAS,GAAG,MAAM,YAAY,EAAE,CAAC;IACvC,MAAM,gBAAgB,GAAG,MAAM,4BAA4B,EAAE,CAAC;IAC9D,MAAM,SAAS,GAAG,MAAM,UAAU,CAAC,QAAQ,CAAC,CAAC;IAE7C,OAAO;QACL,YAAY,EAAE,QAAQ,CAAC,GAAG,KAAK,IAAI;QACnC,YAAY;QACZ,cAAc,EAAE,IAAI,CAAC,UAAU;QAC/B,gBAAgB,EAAE,SAAS;QAC3B,gBAAgB;QAChB,kBAAkB,EAAE,SAAS;QAC7B,KAAK,EACH,QAAQ,CAAC,GAAG,KAAK,IAAI;YACrB,YAAY;YACZ,IAAI,CAAC,UAAU;YACf,SAAS;YACT,gBAAgB;YAChB,SAAS;KACZ,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU;IAC9B,MAAM,WAAW,EAAE,CAAC;IAEpB,MAAM,MAAM,GAAG,MAAM,SAAS,EAAE,CAAC;IAEjC,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,YAAY,CAAC,GAAG,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,GAAG,CAAC,CAAC;QAC5I,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,MAAM,CAAC,gBAAgB,CAAC;QAC5B,GAAG;QACH,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC;QAC3B,2BAA2B,CAC9B,CAAC;IACF,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Platform detection results
3
+ */
4
+ export interface Platform {
5
+ os: 'darwin' | 'linux' | 'windows';
6
+ shell: 'zsh' | 'bash' | 'cmd' | 'powershell' | null;
7
+ home: string;
8
+ }
9
+ /**
10
+ * CLIProxyAPI command detection
11
+ */
12
+ export interface ProxyCommand {
13
+ cmd: 'cliproxyapi' | 'cliproxy' | null;
14
+ path: string | null;
15
+ }
16
+ /**
17
+ * Auth configuration status
18
+ */
19
+ export interface AuthStatus {
20
+ hasAuthFiles: boolean;
21
+ hasAuthEntries: boolean;
22
+ hasModels: boolean;
23
+ configured: boolean;
24
+ }
25
+ /**
26
+ * Status check results
27
+ */
28
+ export interface StatusResult {
29
+ proxyCommand: boolean;
30
+ proxyRunning: boolean;
31
+ authConfigured: boolean;
32
+ aliasesInstalled: boolean;
33
+ shellIntegration: boolean;
34
+ claudeCliAvailable: boolean;
35
+ ready: boolean;
36
+ }
37
+ /**
38
+ * CLI options
39
+ */
40
+ export interface CliOptions {
41
+ login?: boolean;
42
+ status?: boolean;
43
+ }
44
+ /**
45
+ * Shell configuration
46
+ */
47
+ export interface ShellConfig {
48
+ rcFile: string;
49
+ aliasFile: string;
50
+ sourceLine: string;
51
+ }
52
+ //# sourceMappingURL=types.d.ts.map