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 CHANGED
@@ -2,22 +2,33 @@
2
2
 
3
3
  OpenAI-compatible local proxy for SRD Cloud CodeFree.
4
4
 
5
- ## Usage
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
- Default server:
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 declare function buildAuthorizeUrl(port: number): {
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
- accessToken: string;
13
- idToken: string;
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(accessToken: string, idToken: string, fetchImpl?: typeof fetch): Promise<string>;
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 CLIENT_ID = '2220476020a3tfk6llee';
7
- const CLIENT_SECRET = '2220476020b1qOplkzHnKCsRJHPUjZldR5c9oxvY';
8
- const REDIRECT_URI = 'https://www.srdcloud.cn/login/oauth-srdcloud-redirect';
9
- export function buildAuthorizeUrl(port) {
10
- const callbackUrl = `http://127.0.0.1:${port}/oauth2callback?from=cli`;
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: CLIENT_ID,
14
- redirect_uri: 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: `${BASE_URL}/login/oauth/authorize?${params.toString()}`, state };
45
+ return { url: `${baseUrl}${AUTHORIZE_PATH}?${params.toString()}`, state, codeVerifier };
19
46
  }
20
- export async function exchangeCodeForToken(code, fetchImpl = fetch) {
21
- const body = new URLSearchParams({
22
- client_id: CLIENT_ID,
23
- client_secret: CLIENT_SECRET,
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: 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 accessToken = parsed.get('access_token') ?? '';
36
- const idToken = parsed.get('id_token') ?? '';
37
- const tokenType = parsed.get('token_type') ?? '';
38
- if (!accessToken || !idToken)
39
- throw new Error('token exchange response missing access_token or id_token');
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(accessToken, idToken, fetchImpl = fetch) {
43
- const response = await fetchImpl(`${BASE_URL}/api/acbackend/usermanager/v1/users/apikey`, {
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
- Authorization: `Bearer ${accessToken}`,
49
- userId: idToken
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
- if (!data.apikey)
56
- throw new Error('apikey response missing apikey');
57
- return data.apikey;
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.accessToken, token.idToken, options.fetchImpl ?? fetch);
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.idToken,
171
+ userId: token.userId,
146
172
  apiKey: decryptApiKey(encryptedApiKey),
147
- sessionId: token.idToken,
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":"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"}
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
- export type CliCommand = 'serve' | 'login' | 'logout' | 'status';
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(`OpenAI Base URL: http://${options.host}:${options.port}/v1`);
45
- console.log('API Key: any value or omit');
46
- console.log(`Authorized user: ${credentials.userId}`);
47
- console.log(`Models: ${SUPPORTED_MODELS.join(', ')}`);
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 (import.meta.url === `file://${process.argv[1]}`) {
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":"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"}
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.0",
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": ["dist", "README.md", "LICENSE"],
20
+ "files": [
21
+ "dist",
22
+ "README.md",
23
+ "LICENSE"
24
+ ],
21
25
  "engines": {
22
26
  "node": ">=18"
23
27
  },