codefree-proxy 0.1.1 → 0.1.3

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,39 @@
2
2
 
3
3
  OpenAI-compatible local proxy for SRD Cloud CodeFree.
4
4
 
5
- ## Usage
5
+ ## Quick start
6
6
 
7
- Run without installation:
7
+ Run in the background:
8
8
 
9
9
  ```bash
10
- npx codefree-proxy
10
+ npx codefree-proxy start --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 start --port 8788 --host 127.0.0.1
18
18
  ```
19
19
 
20
- Default server:
20
+ Foreground mode is also available when you want logs printed in the current terminal:
21
+
22
+ ```bash
23
+ npx codefree-proxy --port 8788 --host 127.0.0.1
24
+ ```
25
+
26
+ The server prints the local base URL and endpoints after it starts.
27
+
28
+ ```text
29
+ Server running at: http://127.0.0.1:8788
30
+ OpenAI Base URL: http://127.0.0.1:8788/v1
31
+ Chat endpoint: POST http://127.0.0.1:8788/v1/chat/completions
32
+ Models endpoint: GET http://127.0.0.1:8788/v1/models
33
+ Health check: GET http://127.0.0.1:8788/health
34
+ Stop command: codefree-proxy stop --port 8788
35
+ ```
36
+
37
+ Use this OpenAI-compatible base URL in clients:
21
38
 
22
39
  ```text
23
40
  http://127.0.0.1:8788/v1
@@ -25,13 +42,74 @@ http://127.0.0.1:8788/v1
25
42
 
26
43
  Use any API key value in OpenAI-compatible clients, or omit it if the client allows.
27
44
 
45
+ ## Login
46
+
47
+ The proxy first tries existing local credentials. If credentials are missing, run:
48
+
49
+ ```bash
50
+ npx codefree-proxy login
51
+ ```
52
+
53
+ 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.
54
+
55
+ Check current credential status:
56
+
57
+ ```bash
58
+ npx codefree-proxy status
59
+ ```
60
+
61
+ Remove saved credentials:
62
+
63
+ ```bash
64
+ npx codefree-proxy logout
65
+ ```
66
+
67
+ ## Background mode
68
+
69
+ Start the server in the background:
70
+
71
+ ```bash
72
+ npx codefree-proxy start
73
+ npx codefree-proxy start --port 8788 --host 127.0.0.1
74
+ ```
75
+
76
+ Background logs are written to:
77
+
78
+ ```text
79
+ ~/.codefree-proxy/logs/proxy.log
80
+ ```
81
+
82
+ The process id is written to:
83
+
84
+ ```text
85
+ ~/.codefree-proxy/proxy.pid
86
+ ```
87
+
88
+ ## Stop the server
89
+
90
+ Default port:
91
+
92
+ ```bash
93
+ npx codefree-proxy stop
94
+ ```
95
+
96
+ Custom port:
97
+
98
+ ```bash
99
+ npx codefree-proxy stop --port 8788
100
+ ```
101
+
28
102
  ## Commands
29
103
 
30
104
  ```bash
31
105
  codefree-proxy --port 8788 --host 127.0.0.1
106
+ codefree-proxy start
107
+ codefree-proxy start --port 8788 --host 127.0.0.1
32
108
  codefree-proxy login
33
109
  codefree-proxy logout
34
110
  codefree-proxy status
111
+ codefree-proxy stop
112
+ codefree-proxy stop --port 8788
35
113
  ```
36
114
 
37
115
  ## Endpoints
@@ -56,3 +134,5 @@ Credentials are stored at:
56
134
 
57
135
  - macOS/Linux: `~/.codefree-proxy/config.json`
58
136
  - Windows: `%USERPROFILE%\.codefree-proxy\config.json`
137
+
138
+ 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,58 @@
1
1
  #!/usr/bin/env node
2
- export type CliCommand = 'serve' | 'login' | 'logout' | 'status';
2
+ type Platform = NodeJS.Platform;
3
+ export type CliCommand = 'serve' | 'start' | 'login' | 'logout' | 'status' | 'stop';
4
+ export type CommandRunner = (command: string, args: string[]) => Promise<string>;
5
+ type DaemonSpawnOptions = {
6
+ detached: true;
7
+ stdio: ['ignore', number, number];
8
+ };
9
+ type DaemonChild = {
10
+ pid?: number;
11
+ unref(): void;
12
+ };
13
+ export interface DaemonPaths {
14
+ dir: string;
15
+ logDir: string;
16
+ logFile: string;
17
+ pidFile: string;
18
+ }
19
+ export interface StartResult {
20
+ pid: number;
21
+ pidFile: string;
22
+ logFile: string;
23
+ }
24
+ export interface StartDaemonDeps {
25
+ nodePath?: string;
26
+ entryPath?: string;
27
+ homeDir?: string;
28
+ spawnDaemon?: (command: string, args: string[], options: DaemonSpawnOptions) => DaemonChild;
29
+ mkdirp?: (path: string) => void;
30
+ writeFile?: (path: string, value: string) => void;
31
+ openLog?: (path: string) => number;
32
+ closeLog?: (fd: number) => void;
33
+ }
3
34
  export interface CliOptions {
4
35
  command: CliCommand;
5
36
  host: string;
6
37
  port: number;
7
38
  timeoutMs: number;
8
39
  }
40
+ export interface StopResult {
41
+ port: number;
42
+ pids: number[];
43
+ stopped: boolean;
44
+ }
45
+ export interface StartupInfoOptions {
46
+ host: string;
47
+ port: number;
48
+ userId: string;
49
+ models: readonly string[];
50
+ }
51
+ export declare function daemonPaths(homeDir?: string): DaemonPaths;
52
+ export declare function startDaemon(options: CliOptions, deps?: StartDaemonDeps): Promise<StartResult>;
53
+ export declare function formatStartupInfo(options: StartupInfoOptions): string;
54
+ export declare function formatDaemonStartedInfo(options: StartupInfoOptions, result: StartResult): string;
9
55
  export declare function parseArgs(argv: string[]): CliOptions;
56
+ export declare function findListeningPids(port: number, platform?: Platform, run?: CommandRunner): Promise<number[]>;
57
+ export declare function stopByPort(port: number, platform?: Platform, run?: CommandRunner): Promise<StopResult>;
58
+ export {};
package/dist/cli.js CHANGED
@@ -1,13 +1,77 @@
1
1
  #!/usr/bin/env node
2
- import { realpathSync } from 'node:fs';
2
+ import { execFile, spawn } from 'node:child_process';
3
+ import { closeSync, mkdirSync, openSync, realpathSync, writeFileSync } from 'node:fs';
4
+ import { homedir } from 'node:os';
5
+ import { join } from 'node:path';
6
+ import { promisify } from 'node:util';
3
7
  import { fileURLToPath } from 'node:url';
4
8
  import { buildServer } from './server.js';
5
9
  import { AuthManager } from './auth/auth-manager.js';
6
10
  import { SUPPORTED_MODELS } from './proxy/model-map.js';
11
+ const execFileAsync = promisify(execFile);
12
+ export function daemonPaths(homeDir = homedir()) {
13
+ const dir = join(homeDir, '.codefree-proxy');
14
+ const logDir = join(dir, 'logs');
15
+ return {
16
+ dir,
17
+ logDir,
18
+ logFile: join(logDir, 'proxy.log'),
19
+ pidFile: join(dir, 'proxy.pid')
20
+ };
21
+ }
22
+ export async function startDaemon(options, deps = {}) {
23
+ const paths = daemonPaths(deps.homeDir);
24
+ const entryPath = deps.entryPath ?? process.argv[1];
25
+ if (!entryPath)
26
+ throw new Error('Cannot resolve CLI entry path');
27
+ const nodePath = deps.nodePath ?? process.execPath;
28
+ const mkdirp = deps.mkdirp ?? ((path) => mkdirSync(path, { recursive: true }));
29
+ const writeFile = deps.writeFile ?? writeFileSync;
30
+ const openLog = deps.openLog ?? ((path) => openSync(path, 'a'));
31
+ const closeLog = deps.closeLog ?? closeSync;
32
+ const spawnDaemon = deps.spawnDaemon ?? ((command, args, spawnOptions) => spawn(command, args, spawnOptions));
33
+ mkdirp(paths.logDir);
34
+ const logFd = openLog(paths.logFile);
35
+ try {
36
+ const child = spawnDaemon(nodePath, [entryPath, 'serve', '--host', options.host, '--port', String(options.port), '--timeout', String(options.timeoutMs / 1000)], { detached: true, stdio: ['ignore', logFd, logFd] });
37
+ if (!child.pid)
38
+ throw new Error('Failed to start daemon process');
39
+ child.unref();
40
+ writeFile(paths.pidFile, String(child.pid));
41
+ return { pid: child.pid, pidFile: paths.pidFile, logFile: paths.logFile };
42
+ }
43
+ finally {
44
+ closeLog(logFd);
45
+ }
46
+ }
47
+ export function formatStartupInfo(options) {
48
+ const origin = `http://${options.host}:${options.port}`;
49
+ return [
50
+ `Server running at: ${origin}`,
51
+ `OpenAI Base URL: ${origin}/v1`,
52
+ `Chat endpoint: POST ${origin}/v1/chat/completions`,
53
+ `Models endpoint: GET ${origin}/v1/models`,
54
+ `Health check: GET ${origin}/health`,
55
+ `Auth status: GET ${origin}/auth/status`,
56
+ `Auth refresh: POST ${origin}/auth/refresh`,
57
+ `Stop command: codefree-proxy stop --port ${options.port}`,
58
+ 'API Key: any value or omit',
59
+ `Authorized user: ${options.userId}`,
60
+ `Models: ${options.models.join(', ')}`
61
+ ].join('\n');
62
+ }
63
+ export function formatDaemonStartedInfo(options, result) {
64
+ return [
65
+ `Started codefree-proxy in background: ${result.pid}`,
66
+ formatStartupInfo(options),
67
+ `Log file: ${result.logFile}`,
68
+ `PID file: ${result.pidFile}`
69
+ ].join('\n');
70
+ }
7
71
  export function parseArgs(argv) {
8
72
  const options = { command: 'serve', host: '127.0.0.1', port: 8788, timeoutMs: 120_000 };
9
73
  const args = [...argv];
10
- if (args[0] === 'login' || args[0] === 'logout' || args[0] === 'status') {
74
+ if (args[0] === 'serve' || args[0] === 'start' || args[0] === 'login' || args[0] === 'logout' || args[0] === 'status' || args[0] === 'stop') {
11
75
  options.command = args.shift();
12
76
  }
13
77
  while (args.length > 0) {
@@ -23,8 +87,56 @@ export function parseArgs(argv) {
23
87
  }
24
88
  return options;
25
89
  }
90
+ async function runCommand(command, args) {
91
+ const { stdout } = await execFileAsync(command, args);
92
+ return stdout;
93
+ }
94
+ function uniquePids(values) {
95
+ return [...new Set(values.filter((pid) => Number.isInteger(pid) && pid > 0))];
96
+ }
97
+ export async function findListeningPids(port, platform = process.platform, run = runCommand) {
98
+ if (platform === 'win32') {
99
+ const output = await run('netstat', ['-ano', '-p', 'tcp']);
100
+ const pids = output
101
+ .split('\n')
102
+ .map((line) => line.trim().split(/\s+/))
103
+ .filter((parts) => parts.length >= 5 && parts[1]?.endsWith(`:${port}`) && parts[3] === 'LISTENING')
104
+ .map((parts) => Number(parts[4]));
105
+ return uniquePids(pids);
106
+ }
107
+ const output = await run('lsof', [`-tiTCP:${port}`, '-sTCP:LISTEN']);
108
+ return uniquePids(output.split('\n').map((line) => Number(line.trim())));
109
+ }
110
+ export async function stopByPort(port, platform = process.platform, run = runCommand) {
111
+ const pids = await findListeningPids(port, platform, run);
112
+ if (pids.length === 0)
113
+ return { port, pids, stopped: false };
114
+ if (platform === 'win32') {
115
+ for (const pid of pids)
116
+ await run('taskkill', ['/PID', String(pid), '/F']);
117
+ }
118
+ else {
119
+ await run('kill', pids.map(String));
120
+ }
121
+ return { port, pids, stopped: true };
122
+ }
26
123
  async function main() {
27
124
  const options = parseArgs(process.argv.slice(2));
125
+ if (options.command === 'stop') {
126
+ const result = await stopByPort(options.port);
127
+ if (result.stopped)
128
+ console.log(`Stopped codefree-proxy on port ${result.port}: ${result.pids.join(', ')}`);
129
+ else
130
+ console.log(`No codefree-proxy process listening on port ${result.port}`);
131
+ return;
132
+ }
133
+ if (options.command === 'start') {
134
+ const auth = new AuthManager();
135
+ const credentials = await auth.getCredentials();
136
+ const result = await startDaemon(options);
137
+ console.log(formatDaemonStartedInfo({ host: options.host, port: options.port, userId: credentials.userId, models: SUPPORTED_MODELS }, result));
138
+ return;
139
+ }
28
140
  const auth = new AuthManager();
29
141
  if (options.command === 'login') {
30
142
  const credentials = await auth.login();
@@ -43,10 +155,7 @@ async function main() {
43
155
  const credentials = await auth.getCredentials();
44
156
  const app = buildServer({ auth, timeoutMs: options.timeoutMs });
45
157
  await app.listen({ host: options.host, port: options.port });
46
- console.log(`OpenAI Base URL: http://${options.host}:${options.port}/v1`);
47
- console.log('API Key: any value or omit');
48
- console.log(`Authorized user: ${credentials.userId}`);
49
- console.log(`Models: ${SUPPORTED_MODELS.join(', ')}`);
158
+ console.log(formatStartupInfo({ host: options.host, port: options.port, userId: credentials.userId, models: SUPPORTED_MODELS }));
50
159
  }
51
160
  function isSelf() {
52
161
  const argPath = process.argv[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.1",
3
+ "version": "0.1.3",
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
  },