codefree-proxy 0.1.0 → 0.1.2
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/README.md +55 -4
- package/dist/auth/browser-login.d.ts +19 -6
- package/dist/auth/browser-login.js +63 -37
- package/dist/auth/browser-login.js.map +1 -1
- package/dist/cli.d.ts +18 -1
- package/dist/cli.js +76 -6
- package/dist/cli.js.map +1 -1
- package/package.json +6 -2
package/README.md
CHANGED
|
@@ -2,22 +2,33 @@
|
|
|
2
2
|
|
|
3
3
|
OpenAI-compatible local proxy for SRD Cloud CodeFree.
|
|
4
4
|
|
|
5
|
-
##
|
|
5
|
+
## Quick start
|
|
6
6
|
|
|
7
7
|
Run without installation:
|
|
8
8
|
|
|
9
9
|
```bash
|
|
10
|
-
npx codefree-proxy
|
|
10
|
+
npx codefree-proxy --port 8788 --host 127.0.0.1
|
|
11
11
|
```
|
|
12
12
|
|
|
13
13
|
Or install globally:
|
|
14
14
|
|
|
15
15
|
```bash
|
|
16
16
|
npm install -g codefree-proxy
|
|
17
|
-
codefree-proxy
|
|
17
|
+
codefree-proxy --port 8788 --host 127.0.0.1
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
The server prints the local base URL and endpoints after it starts.
|
|
21
|
+
|
|
22
|
+
```text
|
|
23
|
+
Server running at: http://127.0.0.1:8788
|
|
24
|
+
OpenAI Base URL: http://127.0.0.1:8788/v1
|
|
25
|
+
Chat endpoint: POST http://127.0.0.1:8788/v1/chat/completions
|
|
26
|
+
Models endpoint: GET http://127.0.0.1:8788/v1/models
|
|
27
|
+
Health check: GET http://127.0.0.1:8788/health
|
|
28
|
+
Stop command: codefree-proxy stop --port 8788
|
|
18
29
|
```
|
|
19
30
|
|
|
20
|
-
|
|
31
|
+
Use this OpenAI-compatible base URL in clients:
|
|
21
32
|
|
|
22
33
|
```text
|
|
23
34
|
http://127.0.0.1:8788/v1
|
|
@@ -25,6 +36,42 @@ http://127.0.0.1:8788/v1
|
|
|
25
36
|
|
|
26
37
|
Use any API key value in OpenAI-compatible clients, or omit it if the client allows.
|
|
27
38
|
|
|
39
|
+
## Login
|
|
40
|
+
|
|
41
|
+
The proxy first tries existing local credentials. If credentials are missing, run:
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
npx codefree-proxy login
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
The login flow matches CodeFree-O: it opens SRD Cloud OAuth in a browser, waits for the local callback, fetches `encryptedApiKey`, decrypts it, and saves credentials locally.
|
|
48
|
+
|
|
49
|
+
Check current credential status:
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
npx codefree-proxy status
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
Remove saved credentials:
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
npx codefree-proxy logout
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
## Stop the server
|
|
62
|
+
|
|
63
|
+
Default port:
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
npx codefree-proxy stop
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
Custom port:
|
|
70
|
+
|
|
71
|
+
```bash
|
|
72
|
+
npx codefree-proxy stop --port 8788
|
|
73
|
+
```
|
|
74
|
+
|
|
28
75
|
## Commands
|
|
29
76
|
|
|
30
77
|
```bash
|
|
@@ -32,6 +79,8 @@ codefree-proxy --port 8788 --host 127.0.0.1
|
|
|
32
79
|
codefree-proxy login
|
|
33
80
|
codefree-proxy logout
|
|
34
81
|
codefree-proxy status
|
|
82
|
+
codefree-proxy stop
|
|
83
|
+
codefree-proxy stop --port 8788
|
|
35
84
|
```
|
|
36
85
|
|
|
37
86
|
## Endpoints
|
|
@@ -56,3 +105,5 @@ Credentials are stored at:
|
|
|
56
105
|
|
|
57
106
|
- macOS/Linux: `~/.codefree-proxy/config.json`
|
|
58
107
|
- Windows: `%USERPROFILE%\.codefree-proxy\config.json`
|
|
108
|
+
|
|
109
|
+
The proxy can also import CodeFree-O credentials from `~/.codefree-o/.local/share/codefree.json` when available.
|
|
@@ -3,15 +3,28 @@ export interface BrowserLoginOptions {
|
|
|
3
3
|
openBrowser?: (url: string) => void;
|
|
4
4
|
timeoutMs?: number;
|
|
5
5
|
fetchImpl?: typeof fetch;
|
|
6
|
+
codeVerifier?: string;
|
|
7
|
+
randomCode?: string;
|
|
8
|
+
baseUrl?: string;
|
|
6
9
|
}
|
|
7
|
-
export
|
|
10
|
+
export interface PkcePair {
|
|
11
|
+
codeVerifier: string;
|
|
12
|
+
codeChallenge: string;
|
|
13
|
+
}
|
|
14
|
+
export interface AuthorizeUrlOptions {
|
|
15
|
+
codeVerifier?: string;
|
|
16
|
+
randomCode?: string;
|
|
17
|
+
baseUrl?: string;
|
|
18
|
+
}
|
|
19
|
+
export declare function createPkcePair(codeVerifier?: string): PkcePair;
|
|
20
|
+
export declare function buildAuthorizeUrl(port: number, options?: AuthorizeUrlOptions): {
|
|
8
21
|
url: string;
|
|
9
22
|
state: string;
|
|
23
|
+
codeVerifier: string;
|
|
10
24
|
};
|
|
11
|
-
export declare function exchangeCodeForToken(code: string, fetchImpl?: typeof fetch): Promise<{
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
tokenType: string;
|
|
25
|
+
export declare function exchangeCodeForToken(code: string, codeVerifier: string, fetchImpl?: typeof fetch, baseUrl?: string): Promise<{
|
|
26
|
+
sessionId: string;
|
|
27
|
+
userId: string;
|
|
15
28
|
}>;
|
|
16
|
-
export declare function fetchEncryptedApiKey(
|
|
29
|
+
export declare function fetchEncryptedApiKey(sessionId: string, userId: string, fetchImpl?: typeof fetch, baseUrl?: string): Promise<string>;
|
|
17
30
|
export declare function authorizeWithBrowser(options?: BrowserLoginOptions): Promise<StoredCredentials>;
|
|
@@ -1,60 +1,85 @@
|
|
|
1
|
+
import { createHash, randomBytes } from 'node:crypto';
|
|
1
2
|
import { spawn } from 'node:child_process';
|
|
2
3
|
import { createServer } from 'node:http';
|
|
3
4
|
import { URLSearchParams } from 'node:url';
|
|
4
5
|
import { decryptApiKey } from './codefree-o.js';
|
|
5
6
|
const BASE_URL = 'https://www.srdcloud.cn';
|
|
6
|
-
const
|
|
7
|
-
const
|
|
8
|
-
const
|
|
9
|
-
|
|
10
|
-
|
|
7
|
+
const REDIRECT_PATH = '/login/oauth-srdcloud-redirect';
|
|
8
|
+
const AUTHORIZE_PATH = '/login/oauth/authorize';
|
|
9
|
+
const ACCESS_TOKEN_PATH = '/login/oauth/access_token';
|
|
10
|
+
const API_KEY_PATH = '/api/acbackend/usermanager/v1/users/apikey';
|
|
11
|
+
const PKCE_CHARS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~';
|
|
12
|
+
function clientIdForBaseUrl(baseUrl) {
|
|
13
|
+
if (baseUrl.includes('dev'))
|
|
14
|
+
return '2510a379050azejezeas';
|
|
15
|
+
if (baseUrl.includes('test'))
|
|
16
|
+
return '2512525649b2unrogn26';
|
|
17
|
+
return '251384680635inwsxjcm';
|
|
18
|
+
}
|
|
19
|
+
function randomPkceVerifier() {
|
|
20
|
+
return Array.from(randomBytes(64)).map((byte) => PKCE_CHARS[byte % PKCE_CHARS.length]).join('');
|
|
21
|
+
}
|
|
22
|
+
function base64Url(buffer) {
|
|
23
|
+
return buffer.toString('base64').replaceAll('+', '-').replaceAll('/', '_').replace(/=+$/, '');
|
|
24
|
+
}
|
|
25
|
+
export function createPkcePair(codeVerifier = randomPkceVerifier()) {
|
|
26
|
+
return {
|
|
27
|
+
codeVerifier,
|
|
28
|
+
codeChallenge: base64Url(createHash('sha256').update(codeVerifier).digest())
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
export function buildAuthorizeUrl(port, options = {}) {
|
|
32
|
+
const baseUrl = options.baseUrl ?? BASE_URL;
|
|
33
|
+
const randomCode = options.randomCode ?? String(Math.floor(1000 + Math.random() * 9000));
|
|
34
|
+
const { codeVerifier, codeChallenge } = createPkcePair(options.codeVerifier);
|
|
35
|
+
const callbackUrl = `http://127.0.0.1:${port}/oauth2callback?from=codefree-o&randomCode=${randomCode}`;
|
|
11
36
|
const state = Buffer.from(callbackUrl, 'utf8').toString('base64');
|
|
12
37
|
const params = new URLSearchParams({
|
|
13
|
-
client_id:
|
|
14
|
-
redirect_uri:
|
|
38
|
+
client_id: clientIdForBaseUrl(baseUrl),
|
|
39
|
+
redirect_uri: `${baseUrl}${REDIRECT_PATH}`,
|
|
15
40
|
response_type: 'code',
|
|
16
|
-
state
|
|
41
|
+
state,
|
|
42
|
+
code_challenge: codeChallenge,
|
|
43
|
+
code_challenge_method: 'S256'
|
|
17
44
|
});
|
|
18
|
-
return { url: `${
|
|
45
|
+
return { url: `${baseUrl}${AUTHORIZE_PATH}?${params.toString()}`, state, codeVerifier };
|
|
19
46
|
}
|
|
20
|
-
export async function exchangeCodeForToken(code, fetchImpl = fetch) {
|
|
21
|
-
const
|
|
22
|
-
|
|
23
|
-
|
|
47
|
+
export async function exchangeCodeForToken(code, codeVerifier, fetchImpl = fetch, baseUrl = BASE_URL) {
|
|
48
|
+
const params = new URLSearchParams({
|
|
49
|
+
grant_type: 'authorization_code',
|
|
50
|
+
client_id: clientIdForBaseUrl(baseUrl),
|
|
24
51
|
code,
|
|
25
|
-
redirect_uri:
|
|
26
|
-
|
|
27
|
-
const response = await fetchImpl(`${BASE_URL}/login/oauth/access_token`, {
|
|
28
|
-
method: 'POST',
|
|
29
|
-
headers: { Accept: '*/*', 'User-Agent': 'node' },
|
|
30
|
-
body
|
|
52
|
+
redirect_uri: `${baseUrl}${REDIRECT_PATH}`,
|
|
53
|
+
code_verifier: codeVerifier
|
|
31
54
|
});
|
|
55
|
+
const response = await fetchImpl(`${baseUrl}${ACCESS_TOKEN_PATH}?${params.toString()}`, { method: 'GET' });
|
|
32
56
|
if (!response.ok)
|
|
33
57
|
throw new Error(`token exchange failed: ${response.status} ${await response.text()}`);
|
|
34
58
|
const parsed = new URLSearchParams(await response.text());
|
|
35
|
-
const
|
|
36
|
-
const
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
return { accessToken, idToken, tokenType };
|
|
59
|
+
const sessionId = parsed.get('ori_session_id') ?? '';
|
|
60
|
+
const userId = parsed.get('uid') ?? '';
|
|
61
|
+
if (!sessionId || !userId)
|
|
62
|
+
throw new Error('token exchange response missing ori_session_id or uid');
|
|
63
|
+
return { sessionId, userId };
|
|
41
64
|
}
|
|
42
|
-
export async function fetchEncryptedApiKey(
|
|
43
|
-
const response = await fetchImpl(`${
|
|
65
|
+
export async function fetchEncryptedApiKey(sessionId, userId, fetchImpl = fetch, baseUrl = BASE_URL) {
|
|
66
|
+
const response = await fetchImpl(`${baseUrl}${API_KEY_PATH}`, {
|
|
44
67
|
method: 'GET',
|
|
45
68
|
headers: {
|
|
46
69
|
Accept: '*/*',
|
|
47
70
|
'User-Agent': 'node',
|
|
48
|
-
|
|
49
|
-
userId
|
|
71
|
+
sessionId,
|
|
72
|
+
userId,
|
|
73
|
+
projectId: '0'
|
|
50
74
|
}
|
|
51
75
|
});
|
|
52
76
|
if (!response.ok)
|
|
53
77
|
throw new Error(`apikey fetch failed: ${response.status} ${await response.text()}`);
|
|
54
78
|
const data = await response.json();
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
79
|
+
const encryptedApiKey = data.encryptedApiKey ?? data.apikey;
|
|
80
|
+
if (!encryptedApiKey)
|
|
81
|
+
throw new Error('apikey response missing encryptedApiKey');
|
|
82
|
+
return encryptedApiKey;
|
|
58
83
|
}
|
|
59
84
|
function defaultOpenBrowser(url) {
|
|
60
85
|
const command = process.platform === 'darwin' ? 'open' : process.platform === 'win32' ? 'cmd' : 'xdg-open';
|
|
@@ -132,19 +157,20 @@ function startCallbackServer(timeoutMs) {
|
|
|
132
157
|
}
|
|
133
158
|
export async function authorizeWithBrowser(options = {}) {
|
|
134
159
|
const timeoutMs = options.timeoutMs ?? 300_000;
|
|
160
|
+
const baseUrl = options.baseUrl ?? BASE_URL;
|
|
135
161
|
const callback = await startCallbackServer(timeoutMs);
|
|
136
162
|
const codePromise = callback.codePromise;
|
|
137
|
-
const { url } = buildAuthorizeUrl(callback.port);
|
|
163
|
+
const { url, codeVerifier } = buildAuthorizeUrl(callback.port, { codeVerifier: options.codeVerifier, randomCode: options.randomCode, baseUrl });
|
|
138
164
|
try {
|
|
139
165
|
;
|
|
140
166
|
(options.openBrowser ?? defaultOpenBrowser)(url);
|
|
141
167
|
const code = await codePromise;
|
|
142
|
-
const token = await exchangeCodeForToken(code, options.fetchImpl ?? fetch);
|
|
143
|
-
const encryptedApiKey = await fetchEncryptedApiKey(token.
|
|
168
|
+
const token = await exchangeCodeForToken(code, codeVerifier, options.fetchImpl ?? fetch, baseUrl);
|
|
169
|
+
const encryptedApiKey = await fetchEncryptedApiKey(token.sessionId, token.userId, options.fetchImpl ?? fetch, baseUrl);
|
|
144
170
|
return {
|
|
145
|
-
userId: token.
|
|
171
|
+
userId: token.userId,
|
|
146
172
|
apiKey: decryptApiKey(encryptedApiKey),
|
|
147
|
-
sessionId: token.
|
|
173
|
+
sessionId: token.sessionId,
|
|
148
174
|
updatedAt: Date.now()
|
|
149
175
|
};
|
|
150
176
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser-login.js","sourceRoot":"","sources":["../../src/auth/browser-login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAA;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAExC,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAA;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAG/C,MAAM,QAAQ,GAAG,yBAAyB,CAAA;AAC1C,MAAM,
|
|
1
|
+
{"version":3,"file":"browser-login.js","sourceRoot":"","sources":["../../src/auth/browser-login.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.d.ts
CHANGED
|
@@ -1,9 +1,26 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
|
|
2
|
+
type Platform = NodeJS.Platform;
|
|
3
|
+
export type CliCommand = 'serve' | 'login' | 'logout' | 'status' | 'stop';
|
|
4
|
+
export type CommandRunner = (command: string, args: string[]) => Promise<string>;
|
|
3
5
|
export interface CliOptions {
|
|
4
6
|
command: CliCommand;
|
|
5
7
|
host: string;
|
|
6
8
|
port: number;
|
|
7
9
|
timeoutMs: number;
|
|
8
10
|
}
|
|
11
|
+
export interface StopResult {
|
|
12
|
+
port: number;
|
|
13
|
+
pids: number[];
|
|
14
|
+
stopped: boolean;
|
|
15
|
+
}
|
|
16
|
+
export interface StartupInfoOptions {
|
|
17
|
+
host: string;
|
|
18
|
+
port: number;
|
|
19
|
+
userId: string;
|
|
20
|
+
models: readonly string[];
|
|
21
|
+
}
|
|
22
|
+
export declare function formatStartupInfo(options: StartupInfoOptions): string;
|
|
9
23
|
export declare function parseArgs(argv: string[]): CliOptions;
|
|
24
|
+
export declare function findListeningPids(port: number, platform?: Platform, run?: CommandRunner): Promise<number[]>;
|
|
25
|
+
export declare function stopByPort(port: number, platform?: Platform, run?: CommandRunner): Promise<StopResult>;
|
|
26
|
+
export {};
|
package/dist/cli.js
CHANGED
|
@@ -1,11 +1,32 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
+
import { execFile } from 'node:child_process';
|
|
3
|
+
import { realpathSync } from 'node:fs';
|
|
4
|
+
import { promisify } from 'node:util';
|
|
5
|
+
import { fileURLToPath } from 'node:url';
|
|
2
6
|
import { buildServer } from './server.js';
|
|
3
7
|
import { AuthManager } from './auth/auth-manager.js';
|
|
4
8
|
import { SUPPORTED_MODELS } from './proxy/model-map.js';
|
|
9
|
+
const execFileAsync = promisify(execFile);
|
|
10
|
+
export function formatStartupInfo(options) {
|
|
11
|
+
const origin = `http://${options.host}:${options.port}`;
|
|
12
|
+
return [
|
|
13
|
+
`Server running at: ${origin}`,
|
|
14
|
+
`OpenAI Base URL: ${origin}/v1`,
|
|
15
|
+
`Chat endpoint: POST ${origin}/v1/chat/completions`,
|
|
16
|
+
`Models endpoint: GET ${origin}/v1/models`,
|
|
17
|
+
`Health check: GET ${origin}/health`,
|
|
18
|
+
`Auth status: GET ${origin}/auth/status`,
|
|
19
|
+
`Auth refresh: POST ${origin}/auth/refresh`,
|
|
20
|
+
`Stop command: codefree-proxy stop --port ${options.port}`,
|
|
21
|
+
'API Key: any value or omit',
|
|
22
|
+
`Authorized user: ${options.userId}`,
|
|
23
|
+
`Models: ${options.models.join(', ')}`
|
|
24
|
+
].join('\n');
|
|
25
|
+
}
|
|
5
26
|
export function parseArgs(argv) {
|
|
6
27
|
const options = { command: 'serve', host: '127.0.0.1', port: 8788, timeoutMs: 120_000 };
|
|
7
28
|
const args = [...argv];
|
|
8
|
-
if (args[0] === 'login' || args[0] === 'logout' || args[0] === 'status') {
|
|
29
|
+
if (args[0] === 'login' || args[0] === 'logout' || args[0] === 'status' || args[0] === 'stop') {
|
|
9
30
|
options.command = args.shift();
|
|
10
31
|
}
|
|
11
32
|
while (args.length > 0) {
|
|
@@ -21,8 +42,49 @@ export function parseArgs(argv) {
|
|
|
21
42
|
}
|
|
22
43
|
return options;
|
|
23
44
|
}
|
|
45
|
+
async function runCommand(command, args) {
|
|
46
|
+
const { stdout } = await execFileAsync(command, args);
|
|
47
|
+
return stdout;
|
|
48
|
+
}
|
|
49
|
+
function uniquePids(values) {
|
|
50
|
+
return [...new Set(values.filter((pid) => Number.isInteger(pid) && pid > 0))];
|
|
51
|
+
}
|
|
52
|
+
export async function findListeningPids(port, platform = process.platform, run = runCommand) {
|
|
53
|
+
if (platform === 'win32') {
|
|
54
|
+
const output = await run('netstat', ['-ano', '-p', 'tcp']);
|
|
55
|
+
const pids = output
|
|
56
|
+
.split('\n')
|
|
57
|
+
.map((line) => line.trim().split(/\s+/))
|
|
58
|
+
.filter((parts) => parts.length >= 5 && parts[1]?.endsWith(`:${port}`) && parts[3] === 'LISTENING')
|
|
59
|
+
.map((parts) => Number(parts[4]));
|
|
60
|
+
return uniquePids(pids);
|
|
61
|
+
}
|
|
62
|
+
const output = await run('lsof', [`-tiTCP:${port}`, '-sTCP:LISTEN']);
|
|
63
|
+
return uniquePids(output.split('\n').map((line) => Number(line.trim())));
|
|
64
|
+
}
|
|
65
|
+
export async function stopByPort(port, platform = process.platform, run = runCommand) {
|
|
66
|
+
const pids = await findListeningPids(port, platform, run);
|
|
67
|
+
if (pids.length === 0)
|
|
68
|
+
return { port, pids, stopped: false };
|
|
69
|
+
if (platform === 'win32') {
|
|
70
|
+
for (const pid of pids)
|
|
71
|
+
await run('taskkill', ['/PID', String(pid), '/F']);
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
await run('kill', pids.map(String));
|
|
75
|
+
}
|
|
76
|
+
return { port, pids, stopped: true };
|
|
77
|
+
}
|
|
24
78
|
async function main() {
|
|
25
79
|
const options = parseArgs(process.argv.slice(2));
|
|
80
|
+
if (options.command === 'stop') {
|
|
81
|
+
const result = await stopByPort(options.port);
|
|
82
|
+
if (result.stopped)
|
|
83
|
+
console.log(`Stopped codefree-proxy on port ${result.port}: ${result.pids.join(', ')}`);
|
|
84
|
+
else
|
|
85
|
+
console.log(`No codefree-proxy process listening on port ${result.port}`);
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
26
88
|
const auth = new AuthManager();
|
|
27
89
|
if (options.command === 'login') {
|
|
28
90
|
const credentials = await auth.login();
|
|
@@ -41,12 +103,20 @@ async function main() {
|
|
|
41
103
|
const credentials = await auth.getCredentials();
|
|
42
104
|
const app = buildServer({ auth, timeoutMs: options.timeoutMs });
|
|
43
105
|
await app.listen({ host: options.host, port: options.port });
|
|
44
|
-
console.log(
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
106
|
+
console.log(formatStartupInfo({ host: options.host, port: options.port, userId: credentials.userId, models: SUPPORTED_MODELS }));
|
|
107
|
+
}
|
|
108
|
+
function isSelf() {
|
|
109
|
+
const argPath = process.argv[1];
|
|
110
|
+
if (!argPath)
|
|
111
|
+
return false;
|
|
112
|
+
try {
|
|
113
|
+
return realpathSync(fileURLToPath(import.meta.url)) === realpathSync(argPath);
|
|
114
|
+
}
|
|
115
|
+
catch {
|
|
116
|
+
return import.meta.url.endsWith(argPath.replace(/\\/g, '/'));
|
|
117
|
+
}
|
|
48
118
|
}
|
|
49
|
-
if (
|
|
119
|
+
if (isSelf()) {
|
|
50
120
|
main().catch((error) => {
|
|
51
121
|
console.error(error instanceof Error ? error.message : String(error));
|
|
52
122
|
process.exit(1);
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAA;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "codefree-proxy",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.2",
|
|
4
4
|
"description": "OpenAI-compatible local proxy for SRD Cloud CodeFree",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Maxwell",
|
|
@@ -17,7 +17,11 @@
|
|
|
17
17
|
"bin": {
|
|
18
18
|
"codefree-proxy": "dist/cli.js"
|
|
19
19
|
},
|
|
20
|
-
"files": [
|
|
20
|
+
"files": [
|
|
21
|
+
"dist",
|
|
22
|
+
"README.md",
|
|
23
|
+
"LICENSE"
|
|
24
|
+
],
|
|
21
25
|
"engines": {
|
|
22
26
|
"node": ">=18"
|
|
23
27
|
},
|