saros-proxy 0.3.0 → 0.5.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/README.md +27 -4
- package/dist/cli/autostart.d.ts +10 -0
- package/dist/cli/autostart.js +74 -0
- package/dist/cli/autostart.js.map +1 -0
- package/dist/cli/daemon.d.ts +16 -0
- package/dist/cli/daemon.js +188 -0
- package/dist/cli/daemon.js.map +1 -0
- package/dist/cli/opencode-config.d.ts +10 -0
- package/dist/cli/opencode-config.js +53 -0
- package/dist/cli/opencode-config.js.map +1 -1
- package/dist/constants.js +67 -42
- package/dist/constants.js.map +1 -1
- package/dist/index.js +121 -68
- package/dist/index.js.map +1 -1
- package/dist/logger.js +27 -12
- package/dist/logger.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -134,8 +134,6 @@ Install Saros Proxy for my opencode. (https://github.com/vitorvilaca3011/saros-p
|
|
|
134
134
|
Follow the instructions on LLM_INSTRUCTIONS.md.
|
|
135
135
|
```
|
|
136
136
|
|
|
137
|
-
Your AI will take it from there. For a more detailed reference your assistant can read: [`LLM_INSTRUCTIONS.md`](LLM_INSTRUCTIONS.md).
|
|
138
|
-
|
|
139
137
|
---
|
|
140
138
|
|
|
141
139
|
### Quick Install (npm)
|
|
@@ -386,12 +384,37 @@ npx tsx src/index.ts
|
|
|
386
384
|
npx tsx src/index.ts --config /etc/saros/config.yaml
|
|
387
385
|
```
|
|
388
386
|
|
|
389
|
-
### Run as background
|
|
387
|
+
### Run as background daemon (all platforms)
|
|
388
|
+
|
|
389
|
+
The proxy ships with a built-in daemon. Once installed globally (`npm install -g saros-proxy`):
|
|
390
390
|
|
|
391
391
|
```bash
|
|
392
|
-
|
|
392
|
+
# Start the daemon (background)
|
|
393
|
+
saros-proxy start --port 3000
|
|
394
|
+
|
|
395
|
+
# Check status
|
|
396
|
+
saros-proxy status
|
|
397
|
+
|
|
398
|
+
# Stop it
|
|
399
|
+
saros-proxy stop
|
|
400
|
+
|
|
401
|
+
# Sync models from src/constants.ts to opencode.json
|
|
402
|
+
saros-proxy sync-models
|
|
393
403
|
```
|
|
394
404
|
|
|
405
|
+
The `start` command automatically syncs model definitions to `~/.config/opencode/opencode.json`.
|
|
406
|
+
|
|
407
|
+
**Daemon config path:** By default the daemon looks for `config.yaml` at:
|
|
408
|
+
- Linux/macOS: `~/.config/saros/config.yaml`
|
|
409
|
+
- Windows: `%LOCALAPPDATA%\saros\config.yaml`
|
|
410
|
+
|
|
411
|
+
Override with `--config`:
|
|
412
|
+
```bash
|
|
413
|
+
saros-proxy start --port 3000 --config /path/to/config.yaml
|
|
414
|
+
```
|
|
415
|
+
|
|
416
|
+
The PID file is stored at `~/.config/saros/daemon.pid`. The child process runs with `NODE_ENV=production` (JSON logging).
|
|
417
|
+
|
|
395
418
|
---
|
|
396
419
|
|
|
397
420
|
## OpenCode Integration
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* autostart.ts — Register/unregister the daemon to start on user login.
|
|
3
|
+
*
|
|
4
|
+
* Windows: creates a silent VBScript in the Startup folder
|
|
5
|
+
* macOS: creates a launchd agent plist (TODO)
|
|
6
|
+
* Linux: creates a systemd --user service (TODO)
|
|
7
|
+
*/
|
|
8
|
+
export declare function autostartInstall(port?: number): void;
|
|
9
|
+
export declare function autostartUninstall(): void;
|
|
10
|
+
export declare function autostartStatus(): void;
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* autostart.ts — Register/unregister the daemon to start on user login.
|
|
3
|
+
*
|
|
4
|
+
* Windows: creates a silent VBScript in the Startup folder
|
|
5
|
+
* macOS: creates a launchd agent plist (TODO)
|
|
6
|
+
* Linux: creates a systemd --user service (TODO)
|
|
7
|
+
*/
|
|
8
|
+
import { existsSync, writeFileSync, rmSync, readFileSync } from 'node:fs';
|
|
9
|
+
import { join } from 'node:path';
|
|
10
|
+
import { homedir } from 'node:os';
|
|
11
|
+
// ---------------------------------------------------------------------------
|
|
12
|
+
// Helpers
|
|
13
|
+
// ---------------------------------------------------------------------------
|
|
14
|
+
/** Windows Startup folder (%APPDATA%\Microsoft\Windows\Start Menu\Programs\Startup) */
|
|
15
|
+
function windowsStartupDir() {
|
|
16
|
+
const appData = process.env.APPDATA || join(homedir(), 'AppData', 'Roaming');
|
|
17
|
+
return join(appData, 'Microsoft', 'Windows', 'Start Menu', 'Programs', 'Startup');
|
|
18
|
+
}
|
|
19
|
+
function vbsPath() {
|
|
20
|
+
return join(windowsStartupDir(), 'saros-proxy-daemon.vbs');
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Resolve the saros-proxy command path.
|
|
24
|
+
* On Windows with a global install this is typically %APPDATA%\npm\saros-proxy.cmd.
|
|
25
|
+
* Falls back to the bare command name which works if the npm bin directory is on PATH.
|
|
26
|
+
*/
|
|
27
|
+
function resolveCommand() {
|
|
28
|
+
// When running via `node dist/cli/autostart.js`, use the sibling dist/index.js
|
|
29
|
+
// so we don't depend on PATH resolution.
|
|
30
|
+
const viaDist = join(import.meta.dirname, '..', '..', 'dist', 'index.js');
|
|
31
|
+
if (existsSync(viaDist)) {
|
|
32
|
+
return `"${process.execPath}" "${viaDist}"`;
|
|
33
|
+
}
|
|
34
|
+
// Fallback: assume `saros-proxy` is on PATH
|
|
35
|
+
return 'saros-proxy';
|
|
36
|
+
}
|
|
37
|
+
// ---------------------------------------------------------------------------
|
|
38
|
+
// Public API
|
|
39
|
+
// ---------------------------------------------------------------------------
|
|
40
|
+
export function autostartInstall(port) {
|
|
41
|
+
const command = resolveCommand();
|
|
42
|
+
const portArg = port ? ` --port ${port}` : '';
|
|
43
|
+
const vbs = [
|
|
44
|
+
"' Saros proxy auto-start (generated by `saros-proxy autostart install`)",
|
|
45
|
+
'Dim shell',
|
|
46
|
+
'Set shell = CreateObject("WScript.Shell")',
|
|
47
|
+
`shell.Run "${command} start${portArg}", 0, False`,
|
|
48
|
+
'Set shell = Nothing',
|
|
49
|
+
].join('\n');
|
|
50
|
+
writeFileSync(vbsPath(), vbs, 'utf-8');
|
|
51
|
+
console.log(`Auto-start installed: ${vbsPath()}`);
|
|
52
|
+
}
|
|
53
|
+
export function autostartUninstall() {
|
|
54
|
+
const path = vbsPath();
|
|
55
|
+
if (!existsSync(path)) {
|
|
56
|
+
console.log('No auto-start entry found.');
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
rmSync(path);
|
|
60
|
+
console.log(`Auto-start removed: ${path}`);
|
|
61
|
+
}
|
|
62
|
+
export function autostartStatus() {
|
|
63
|
+
const path = vbsPath();
|
|
64
|
+
if (existsSync(path)) {
|
|
65
|
+
const content = readFileSync(path, 'utf-8').trim();
|
|
66
|
+
const match = content.match(/start(--port (\d+))?/);
|
|
67
|
+
const portInfo = match?.[2] ? ` on port ${match[2]}` : '';
|
|
68
|
+
console.log(`Auto-start is enabled${portInfo}. File: ${path}`);
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
console.log('Auto-start is not installed.');
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=autostart.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"autostart.js","sourceRoot":"","sources":["../../src/cli/autostart.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAC1E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,8EAA8E;AAC9E,UAAU;AACV,8EAA8E;AAE9E,uFAAuF;AACvF,SAAS,iBAAiB;IACxB,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;IAC7E,OAAO,IAAI,CAAC,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,YAAY,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;AACpF,CAAC;AAED,SAAS,OAAO;IACd,OAAO,IAAI,CAAC,iBAAiB,EAAE,EAAE,wBAAwB,CAAC,CAAC;AAC7D,CAAC;AAED;;;;GAIG;AACH,SAAS,cAAc;IACrB,+EAA+E;IAC/E,yCAAyC;IACzC,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;IAC3E,IAAI,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACxB,OAAO,IAAI,OAAO,CAAC,QAAQ,MAAM,OAAO,GAAG,CAAC;IAC9C,CAAC;IACD,4CAA4C;IAC5C,OAAO,aAAa,CAAC;AACvB,CAAC;AAED,8EAA8E;AAC9E,aAAa;AACb,8EAA8E;AAE9E,MAAM,UAAU,gBAAgB,CAAC,IAAa;IAC5C,MAAM,OAAO,GAAG,cAAc,EAAE,CAAC;IACjC,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC9C,MAAM,GAAG,GAAG;QACV,yEAAyE;QACzE,WAAW;QACX,2CAA2C;QAC3C,cAAc,OAAO,SAAS,OAAO,aAAa;QAClD,qBAAqB;KACtB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEb,aAAa,CAAC,OAAO,EAAE,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;IACvC,OAAO,CAAC,GAAG,CAAC,yBAAyB,OAAO,EAAE,EAAE,CAAC,CAAC;AACpD,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IACvB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACtB,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;QAC1C,OAAO;IACT,CAAC;IACD,MAAM,CAAC,IAAI,CAAC,CAAC;IACb,OAAO,CAAC,GAAG,CAAC,uBAAuB,IAAI,EAAE,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IACvB,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACrB,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;QACnD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;QACpD,MAAM,QAAQ,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1D,OAAO,CAAC,GAAG,CAAC,wBAAwB,QAAQ,WAAW,IAAI,EAAE,CAAC,CAAC;IACjE,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;IAC9C,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* daemon.ts — Start/stop the proxy as a background process.
|
|
3
|
+
*
|
|
4
|
+
* Usage:
|
|
5
|
+
* saros-proxy start [--port <port>] [--config <path>]
|
|
6
|
+
* saros-proxy stop
|
|
7
|
+
* saros-proxy status
|
|
8
|
+
*
|
|
9
|
+
* Daemon lifecycle:
|
|
10
|
+
* start → spawns detached `node dist/index.js` process, saves PID
|
|
11
|
+
* stop → kills the process (taskkill /T /F on Windows), removes PID file
|
|
12
|
+
* status → checks if the process is still alive
|
|
13
|
+
*/
|
|
14
|
+
export declare function daemonStart(port?: number, configPath?: string): void;
|
|
15
|
+
export declare function daemonStop(): void;
|
|
16
|
+
export declare function daemonStatus(): void;
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* daemon.ts — Start/stop the proxy as a background process.
|
|
3
|
+
*
|
|
4
|
+
* Usage:
|
|
5
|
+
* saros-proxy start [--port <port>] [--config <path>]
|
|
6
|
+
* saros-proxy stop
|
|
7
|
+
* saros-proxy status
|
|
8
|
+
*
|
|
9
|
+
* Daemon lifecycle:
|
|
10
|
+
* start → spawns detached `node dist/index.js` process, saves PID
|
|
11
|
+
* stop → kills the process (taskkill /T /F on Windows), removes PID file
|
|
12
|
+
* status → checks if the process is still alive
|
|
13
|
+
*/
|
|
14
|
+
import { spawn, execFileSync } from 'node:child_process';
|
|
15
|
+
import { existsSync, writeFileSync, readFileSync, rmSync, mkdirSync } from 'node:fs';
|
|
16
|
+
import { resolve as pathResolve, join as pathJoin } from 'node:path';
|
|
17
|
+
import { homedir } from 'node:os';
|
|
18
|
+
import { fileURLToPath } from 'node:url';
|
|
19
|
+
import { syncModelsToOpencodeConfig } from './opencode-config.js';
|
|
20
|
+
// ---------------------------------------------------------------------------
|
|
21
|
+
// Constants
|
|
22
|
+
// ---------------------------------------------------------------------------
|
|
23
|
+
const PID_DIR = pathJoin(homedir(), '.config', 'saros');
|
|
24
|
+
const PID_FILE = pathJoin(PID_DIR, 'daemon.pid');
|
|
25
|
+
const PACKAGE_ROOT = pathResolve(fileURLToPath(import.meta.url), '..', '..', '..');
|
|
26
|
+
const ENTRY_POINT = pathResolve(PACKAGE_ROOT, 'dist', 'index.js');
|
|
27
|
+
// ---------------------------------------------------------------------------
|
|
28
|
+
// PID file management
|
|
29
|
+
// ---------------------------------------------------------------------------
|
|
30
|
+
function ensurePidDir() {
|
|
31
|
+
if (!existsSync(PID_DIR)) {
|
|
32
|
+
mkdirSync(PID_DIR, { recursive: true });
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
function readPid() {
|
|
36
|
+
try {
|
|
37
|
+
return readFileSync(PID_FILE, 'utf-8').trim();
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
return null;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
function writePid(pid) {
|
|
44
|
+
ensurePidDir();
|
|
45
|
+
writeFileSync(PID_FILE, String(pid), 'utf-8');
|
|
46
|
+
}
|
|
47
|
+
function deletePid() {
|
|
48
|
+
try {
|
|
49
|
+
rmSync(PID_FILE);
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
// ignore
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
// ---------------------------------------------------------------------------
|
|
56
|
+
// Process management
|
|
57
|
+
// ---------------------------------------------------------------------------
|
|
58
|
+
/** Check if a process is alive by PID. Cross-platform. */
|
|
59
|
+
function isProcessAlive(pid) {
|
|
60
|
+
try {
|
|
61
|
+
if (process.platform === 'win32') {
|
|
62
|
+
execFileSync('tasklist', ['/FI', `PID eq ${pid}`, '/NH'], {
|
|
63
|
+
windowsHide: true,
|
|
64
|
+
timeout: 5000,
|
|
65
|
+
stdio: 'pipe',
|
|
66
|
+
});
|
|
67
|
+
return true;
|
|
68
|
+
}
|
|
69
|
+
process.kill(pid, 0);
|
|
70
|
+
return true;
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
return false;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
/** Kill a process and all its children. Cross-platform. */
|
|
77
|
+
function killProcess(pid) {
|
|
78
|
+
if (process.platform === 'win32') {
|
|
79
|
+
try {
|
|
80
|
+
execFileSync('taskkill', ['/T', '/F', '/PID', String(pid)], {
|
|
81
|
+
windowsHide: true,
|
|
82
|
+
timeout: 10000,
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
// Process may already be dead — ignore
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
try {
|
|
91
|
+
process.kill(pid, 'SIGKILL');
|
|
92
|
+
}
|
|
93
|
+
catch {
|
|
94
|
+
// Process may already be dead — ignore
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
// ---------------------------------------------------------------------------
|
|
99
|
+
// Public API
|
|
100
|
+
// ---------------------------------------------------------------------------
|
|
101
|
+
export function daemonStart(port, configPath) {
|
|
102
|
+
ensurePidDir();
|
|
103
|
+
// Build args for the child process — pass through any overrides
|
|
104
|
+
const args = [ENTRY_POINT];
|
|
105
|
+
if (port)
|
|
106
|
+
args.push('--port', String(port));
|
|
107
|
+
if (configPath)
|
|
108
|
+
args.push('--config', configPath);
|
|
109
|
+
// Spawn detached child (no console window on Windows)
|
|
110
|
+
const child = spawn('node', args, {
|
|
111
|
+
cwd: PACKAGE_ROOT,
|
|
112
|
+
stdio: ['ignore', 'ignore', 'ignore'], // child logs to its own stderr via pino
|
|
113
|
+
detached: true,
|
|
114
|
+
windowsHide: true,
|
|
115
|
+
env: {
|
|
116
|
+
...process.env,
|
|
117
|
+
NODE_ENV: 'production',
|
|
118
|
+
},
|
|
119
|
+
});
|
|
120
|
+
// Allow parent to exit independently while child continues
|
|
121
|
+
child.unref();
|
|
122
|
+
const pid = child.pid;
|
|
123
|
+
writePid(pid);
|
|
124
|
+
// Wait briefly then verify the process is alive
|
|
125
|
+
setTimeout(() => {
|
|
126
|
+
if (isProcessAlive(pid)) {
|
|
127
|
+
console.log(`Proxy started (PID ${pid}) on port ${port ?? 3000}`);
|
|
128
|
+
// Sync models to opencode.json — log warning on failure, don't block
|
|
129
|
+
const syncResult = syncModelsToOpencodeConfig();
|
|
130
|
+
if (syncResult.success) {
|
|
131
|
+
console.log(`Models synced to ${syncResult.path}`);
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
134
|
+
console.warn(`Model sync skipped: ${syncResult.error}`);
|
|
135
|
+
}
|
|
136
|
+
process.exit(0);
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
console.error('Proxy exited shortly after starting. Check your config.');
|
|
140
|
+
deletePid();
|
|
141
|
+
process.exit(1);
|
|
142
|
+
}
|
|
143
|
+
}, 2000);
|
|
144
|
+
}
|
|
145
|
+
export function daemonStop() {
|
|
146
|
+
const pid = readPid();
|
|
147
|
+
if (!pid) {
|
|
148
|
+
console.log('No running proxy daemon found.');
|
|
149
|
+
process.exit(0);
|
|
150
|
+
}
|
|
151
|
+
const pidNum = Number(pid);
|
|
152
|
+
if (!isProcessAlive(pidNum)) {
|
|
153
|
+
console.log(`Daemon process (PID ${pid}) is not running. Cleaning up PID file.`);
|
|
154
|
+
deletePid();
|
|
155
|
+
process.exit(0);
|
|
156
|
+
}
|
|
157
|
+
killProcess(pidNum);
|
|
158
|
+
deletePid();
|
|
159
|
+
// Wait a moment to confirm it's gone
|
|
160
|
+
setTimeout(() => {
|
|
161
|
+
if (isProcessAlive(pidNum)) {
|
|
162
|
+
console.error(`Failed to stop daemon (PID ${pid}). Try: taskkill /F /PID ${pid}`);
|
|
163
|
+
process.exit(1);
|
|
164
|
+
}
|
|
165
|
+
else {
|
|
166
|
+
console.log(`Proxy (PID ${pid}) stopped.`);
|
|
167
|
+
process.exit(0);
|
|
168
|
+
}
|
|
169
|
+
}, 1000);
|
|
170
|
+
}
|
|
171
|
+
export function daemonStatus() {
|
|
172
|
+
const pid = readPid();
|
|
173
|
+
if (!pid) {
|
|
174
|
+
console.log('Daemon is not running.');
|
|
175
|
+
process.exit(0);
|
|
176
|
+
}
|
|
177
|
+
const pidNum = Number(pid);
|
|
178
|
+
if (isProcessAlive(pidNum)) {
|
|
179
|
+
console.log(`Proxy is running (PID ${pid}).`);
|
|
180
|
+
process.exit(0);
|
|
181
|
+
}
|
|
182
|
+
else {
|
|
183
|
+
console.log(`Stale PID file (PID ${pid} is gone). Cleaning up.`);
|
|
184
|
+
deletePid();
|
|
185
|
+
process.exit(1);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
//# sourceMappingURL=daemon.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"daemon.js","sourceRoot":"","sources":["../../src/cli/daemon.ts"],"names":[],"mappings":"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"}
|
|
@@ -22,6 +22,16 @@ export interface OpencodeConfigResult {
|
|
|
22
22
|
export declare function updateOpencodeConfig(port: number, options?: {
|
|
23
23
|
configPath?: string;
|
|
24
24
|
}): OpencodeConfigResult;
|
|
25
|
+
/**
|
|
26
|
+
* Sync models from OPENCODE_MODELS into an existing opencode.json.
|
|
27
|
+
* Only replaces the `saros-proxy.models` field — preserves everything else.
|
|
28
|
+
*
|
|
29
|
+
* @param options.configPath — Explicit path to opencode.json (optional, for testing)
|
|
30
|
+
* @returns Result object with success status and path
|
|
31
|
+
*/
|
|
32
|
+
export declare function syncModelsToOpencodeConfig(options?: {
|
|
33
|
+
configPath?: string;
|
|
34
|
+
}): OpencodeConfigResult;
|
|
25
35
|
/**
|
|
26
36
|
* Generate a manual configuration snippet that users can paste.
|
|
27
37
|
*/
|
|
@@ -104,6 +104,59 @@ export function updateOpencodeConfig(port, options = {}) {
|
|
|
104
104
|
// ---------------------------------------------------------------------------
|
|
105
105
|
// Manual config snippet (for users who decline automatic setup)
|
|
106
106
|
// ---------------------------------------------------------------------------
|
|
107
|
+
/**
|
|
108
|
+
* Sync models from OPENCODE_MODELS into an existing opencode.json.
|
|
109
|
+
* Only replaces the `saros-proxy.models` field — preserves everything else.
|
|
110
|
+
*
|
|
111
|
+
* @param options.configPath — Explicit path to opencode.json (optional, for testing)
|
|
112
|
+
* @returns Result object with success status and path
|
|
113
|
+
*/
|
|
114
|
+
export function syncModelsToOpencodeConfig(options = {}) {
|
|
115
|
+
const configPath = options.configPath ?? getDefaultOpencodeConfigPath();
|
|
116
|
+
if (!existsSync(configPath)) {
|
|
117
|
+
return { success: false, error: 'opencode.json not found at ' + configPath };
|
|
118
|
+
}
|
|
119
|
+
try {
|
|
120
|
+
const raw = readFileSync(configPath, 'utf-8');
|
|
121
|
+
const config = JSON.parse(raw);
|
|
122
|
+
const provider = config.provider;
|
|
123
|
+
if (!provider) {
|
|
124
|
+
return { success: false, error: 'Config has no "provider" section' };
|
|
125
|
+
}
|
|
126
|
+
const sarosProvider = provider['saros-proxy'];
|
|
127
|
+
if (!sarosProvider || typeof sarosProvider !== 'object' || Array.isArray(sarosProvider)) {
|
|
128
|
+
return { success: false, error: 'saros-proxy provider config is missing or malformed' };
|
|
129
|
+
}
|
|
130
|
+
// Backup before modifying
|
|
131
|
+
const backupPath = `${configPath}.backup`;
|
|
132
|
+
copyFileSync(configPath, backupPath);
|
|
133
|
+
// Only replace models — preserve everything else
|
|
134
|
+
sarosProvider.models = OPENCODE_MODELS;
|
|
135
|
+
// Write
|
|
136
|
+
const json = JSON.stringify(config, null, 2);
|
|
137
|
+
writeFileSync(configPath, json, 'utf-8');
|
|
138
|
+
// Validate: re-read to ensure we didn't corrupt it
|
|
139
|
+
try {
|
|
140
|
+
const verifyRaw = readFileSync(configPath, 'utf-8');
|
|
141
|
+
JSON.parse(verifyRaw);
|
|
142
|
+
}
|
|
143
|
+
catch {
|
|
144
|
+
if (existsSync(backupPath)) {
|
|
145
|
+
copyFileSync(backupPath, configPath);
|
|
146
|
+
}
|
|
147
|
+
return {
|
|
148
|
+
success: false,
|
|
149
|
+
path: configPath,
|
|
150
|
+
error: 'Failed to write valid JSON after sync. Restored from backup.',
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
return { success: true, path: configPath };
|
|
154
|
+
}
|
|
155
|
+
catch (err) {
|
|
156
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
157
|
+
return { success: false, path: configPath, error: message };
|
|
158
|
+
}
|
|
159
|
+
}
|
|
107
160
|
/**
|
|
108
161
|
* Generate a manual configuration snippet that users can paste.
|
|
109
162
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"opencode-config.js","sourceRoot":"","sources":["../../src/cli/opencode-config.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"opencode-config.js","sourceRoot":"","sources":["../../src/cli/opencode-config.ts"],"names":[],"mappings":"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"}
|
package/dist/constants.js
CHANGED
|
@@ -25,137 +25,162 @@ export const WORKSPACE_ID_REGEX = /^wrk_[A-Za-z0-9]+$/;
|
|
|
25
25
|
// OpenCode client model definitions for proxy provider configuration
|
|
26
26
|
// Source: https://opencode.ai/zen/go/v1/models (18 models as of 2026-06-06)
|
|
27
27
|
export const OPENCODE_MODELS = {
|
|
28
|
-
// GLM series (
|
|
28
|
+
// GLM series (Z.AI/Zhipu - 202K context, 32K output, text-only)
|
|
29
|
+
// Blocklisted in OpenCode — no auto variants; reasoning via interleaved reasoning_content only
|
|
29
30
|
'glm-5': {
|
|
30
31
|
id: 'glm-5',
|
|
31
32
|
name: 'GLM-5',
|
|
32
33
|
tool_call: true,
|
|
33
|
-
|
|
34
|
-
|
|
34
|
+
reasoning: true,
|
|
35
|
+
limit: { context: 202752, output: 32768 },
|
|
36
|
+
modalities: { input: ['text'], output: ['text'] },
|
|
35
37
|
},
|
|
36
38
|
'glm-5.1': {
|
|
37
39
|
id: 'glm-5.1',
|
|
38
40
|
name: 'GLM-5.1',
|
|
39
41
|
tool_call: true,
|
|
40
|
-
|
|
41
|
-
|
|
42
|
+
reasoning: true,
|
|
43
|
+
limit: { context: 202752, output: 32768 },
|
|
44
|
+
modalities: { input: ['text'], output: ['text'] },
|
|
42
45
|
},
|
|
43
|
-
// Kimi series (
|
|
46
|
+
// Kimi series (Moonshot - 262K context, 65K output, multimodal)
|
|
47
|
+
// Blocklisted in OpenCode — no reasoning_effort support via opencode-go
|
|
44
48
|
'kimi-k2.5': {
|
|
45
49
|
id: 'kimi-k2.5',
|
|
46
50
|
name: 'Kimi K2.5',
|
|
47
51
|
tool_call: true,
|
|
48
|
-
|
|
49
|
-
|
|
52
|
+
reasoning: true,
|
|
53
|
+
limit: { context: 262144, output: 65536 },
|
|
54
|
+
modalities: { input: ['text', 'image', 'video'], output: ['text'] },
|
|
50
55
|
},
|
|
51
56
|
'kimi-k2.6': {
|
|
52
57
|
id: 'kimi-k2.6',
|
|
53
58
|
name: 'Kimi K2.6',
|
|
54
59
|
tool_call: true,
|
|
55
|
-
|
|
56
|
-
|
|
60
|
+
reasoning: true,
|
|
61
|
+
limit: { context: 262144, output: 65536 },
|
|
62
|
+
modalities: { input: ['text', 'image', 'video'], output: ['text'] },
|
|
57
63
|
},
|
|
58
|
-
// DeepSeek V4 series
|
|
64
|
+
// DeepSeek V4 series (1M context, 384K output, text-only)
|
|
65
|
+
// NOT blocklisted - OpenCode auto-generates low/medium/high/max variants
|
|
59
66
|
'deepseek-v4-pro': {
|
|
60
67
|
id: 'deepseek-v4-pro',
|
|
61
68
|
name: 'DeepSeek V4 Pro',
|
|
62
69
|
tool_call: true,
|
|
63
|
-
|
|
64
|
-
|
|
70
|
+
reasoning: true,
|
|
71
|
+
limit: { context: 1000000, output: 384000 },
|
|
72
|
+
modalities: { input: ['text'], output: ['text'] },
|
|
65
73
|
},
|
|
66
74
|
'deepseek-v4-flash': {
|
|
67
75
|
id: 'deepseek-v4-flash',
|
|
68
76
|
name: 'DeepSeek V4 Flash',
|
|
69
77
|
tool_call: true,
|
|
70
|
-
|
|
71
|
-
|
|
78
|
+
reasoning: true,
|
|
79
|
+
limit: { context: 1000000, output: 384000 },
|
|
80
|
+
modalities: { input: ['text'], output: ['text'] },
|
|
72
81
|
},
|
|
73
|
-
// MiMo series (
|
|
82
|
+
// MiMo series (Xiaomi - 1M context except V2 Omni 262K)
|
|
83
|
+
// NOT blocklisted - OpenCode auto-generates low/medium/high variants (reasoning_effort supported)
|
|
74
84
|
'mimo-v2.5': {
|
|
75
85
|
id: 'mimo-v2.5',
|
|
76
86
|
name: 'MiMo V2.5',
|
|
77
87
|
tool_call: true,
|
|
78
|
-
|
|
79
|
-
|
|
88
|
+
reasoning: true,
|
|
89
|
+
limit: { context: 1000000, output: 128000 },
|
|
90
|
+
modalities: { input: ['text', 'image', 'audio', 'video'], output: ['text'] },
|
|
80
91
|
},
|
|
81
92
|
'mimo-v2.5-pro': {
|
|
82
93
|
id: 'mimo-v2.5-pro',
|
|
83
94
|
name: 'MiMo V2.5 Pro',
|
|
84
95
|
tool_call: true,
|
|
85
|
-
|
|
86
|
-
|
|
96
|
+
reasoning: true,
|
|
97
|
+
limit: { context: 1048576, output: 128000 },
|
|
98
|
+
modalities: { input: ['text'], output: ['text'] },
|
|
87
99
|
},
|
|
88
100
|
'mimo-v2-pro': {
|
|
89
101
|
id: 'mimo-v2-pro',
|
|
90
102
|
name: 'MiMo V2 Pro',
|
|
91
103
|
tool_call: true,
|
|
92
|
-
|
|
93
|
-
|
|
104
|
+
reasoning: true,
|
|
105
|
+
limit: { context: 1048576, output: 128000 },
|
|
106
|
+
modalities: { input: ['text'], output: ['text'] },
|
|
94
107
|
},
|
|
95
108
|
'mimo-v2-omni': {
|
|
96
109
|
id: 'mimo-v2-omni',
|
|
97
110
|
name: 'MiMo V2 Omni',
|
|
98
111
|
tool_call: true,
|
|
99
|
-
|
|
100
|
-
|
|
112
|
+
reasoning: true,
|
|
113
|
+
limit: { context: 262144, output: 128000 },
|
|
114
|
+
modalities: { input: ['text', 'image', 'audio', 'pdf'], output: ['text'] },
|
|
101
115
|
},
|
|
102
|
-
// MiniMax series (Anthropic-compatible
|
|
116
|
+
// MiniMax series (Anthropic-compatible - 512K context for M3, 204K for M2.x)
|
|
117
|
+
// Blocklisted in OpenCode — no auto variants; uses Anthropic thinking blocks, not reasoning_effort
|
|
103
118
|
'minimax-m3': {
|
|
104
119
|
id: 'minimax-m3',
|
|
105
120
|
name: 'MiniMax M3',
|
|
106
121
|
tool_call: true,
|
|
107
|
-
|
|
108
|
-
|
|
122
|
+
reasoning: true,
|
|
123
|
+
limit: { context: 512000, output: 131072 },
|
|
124
|
+
modalities: { input: ['text', 'image', 'video'], output: ['text'] },
|
|
109
125
|
},
|
|
110
126
|
'minimax-m2.7': {
|
|
111
127
|
id: 'minimax-m2.7',
|
|
112
128
|
name: 'MiniMax M2.7',
|
|
113
129
|
tool_call: true,
|
|
114
|
-
|
|
115
|
-
|
|
130
|
+
reasoning: true,
|
|
131
|
+
limit: { context: 204800, output: 131072 },
|
|
132
|
+
modalities: { input: ['text'], output: ['text'] },
|
|
116
133
|
},
|
|
117
134
|
'minimax-m2.5': {
|
|
118
135
|
id: 'minimax-m2.5',
|
|
119
136
|
name: 'MiniMax M2.5',
|
|
120
137
|
tool_call: true,
|
|
121
|
-
|
|
122
|
-
|
|
138
|
+
reasoning: true,
|
|
139
|
+
limit: { context: 204800, output: 65536 },
|
|
140
|
+
modalities: { input: ['text'], output: ['text'] },
|
|
123
141
|
},
|
|
124
|
-
// Qwen series (1M context
|
|
142
|
+
// Qwen series (Alibaba - Anthropic-compatible, 1M context except 3.5 Plus 262K)
|
|
143
|
+
// Blocklisted in OpenCode — no auto variants; uses Anthropic thinking blocks, not reasoning_effort
|
|
125
144
|
'qwen3.7-max': {
|
|
126
145
|
id: 'qwen3.7-max',
|
|
127
146
|
name: 'Qwen 3.7 Max',
|
|
128
147
|
tool_call: true,
|
|
129
|
-
|
|
130
|
-
|
|
148
|
+
reasoning: true,
|
|
149
|
+
limit: { context: 1000000, output: 65536 },
|
|
150
|
+
modalities: { input: ['text'], output: ['text'] },
|
|
131
151
|
},
|
|
132
152
|
'qwen3.7-plus': {
|
|
133
153
|
id: 'qwen3.7-plus',
|
|
134
154
|
name: 'Qwen 3.7 Plus',
|
|
135
155
|
tool_call: true,
|
|
136
|
-
|
|
137
|
-
|
|
156
|
+
reasoning: true,
|
|
157
|
+
limit: { context: 1000000, output: 65536 },
|
|
158
|
+
modalities: { input: ['text', 'image', 'video'], output: ['text'] },
|
|
138
159
|
},
|
|
139
160
|
'qwen3.6-plus': {
|
|
140
161
|
id: 'qwen3.6-plus',
|
|
141
162
|
name: 'Qwen 3.6 Plus',
|
|
142
163
|
tool_call: true,
|
|
164
|
+
reasoning: true,
|
|
143
165
|
limit: { context: 1000000, output: 65536 },
|
|
144
|
-
modalities: { input: ['text', 'image'], output: ['text'] },
|
|
166
|
+
modalities: { input: ['text', 'image', 'video'], output: ['text'] },
|
|
145
167
|
},
|
|
146
168
|
'qwen3.5-plus': {
|
|
147
169
|
id: 'qwen3.5-plus',
|
|
148
170
|
name: 'Qwen 3.5 Plus',
|
|
149
171
|
tool_call: true,
|
|
150
|
-
|
|
151
|
-
|
|
172
|
+
reasoning: true,
|
|
173
|
+
limit: { context: 262144, output: 65536 },
|
|
174
|
+
modalities: { input: ['text', 'image', 'video'], output: ['text'] },
|
|
152
175
|
},
|
|
153
|
-
// HY3 Preview
|
|
176
|
+
// HY3 Preview (Tencent - 256K context, 64K output, text-only)
|
|
177
|
+
// NOT blocklisted - OpenCode auto-generates low/medium/high variants (reasoning_effort supported)
|
|
154
178
|
'hy3-preview': {
|
|
155
179
|
id: 'hy3-preview',
|
|
156
180
|
name: 'HY3 Preview',
|
|
157
|
-
tool_call:
|
|
158
|
-
|
|
181
|
+
tool_call: true,
|
|
182
|
+
reasoning: true,
|
|
183
|
+
limit: { context: 256000, output: 64000 },
|
|
159
184
|
modalities: { input: ['text'], output: ['text'] },
|
|
160
185
|
},
|
|
161
186
|
};
|
package/dist/constants.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,CAAC;AACjC,MAAM,CAAC,MAAM,YAAY,GAAG,WAAW,CAAC;AACxC,MAAM,CAAC,MAAM,mCAAmC,GAAG,MAAM,CAAC;AAC1D,MAAM,CAAC,MAAM,0BAA0B,GAAG,MAAM,CAAC;AACjD,MAAM,CAAC,MAAM,0BAA0B,GAAG,MAAM,CAAC;AACjD,MAAM,CAAC,MAAM,sBAAsB,GAAG,MAAM,CAAC;AAC7C,MAAM,CAAC,MAAM,sBAAsB,GAAG,SAAS,CAAC;AAChD,MAAM,CAAC,MAAM,cAAc,GAAG,EAAE,CAAC;AACjC,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,CAAC;AACpC,MAAM,CAAC,MAAM,oBAAoB,GAAG,qBAAqB,CAAC;AAC1D,MAAM,CAAC,MAAM,aAAa,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AAC9C,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,CAAC;AAC7B,MAAM,CAAC,MAAM,oBAAoB,GAAG,MAAM,CAAC;AAC3C,MAAM,CAAC,MAAM,cAAc,GAAG,GAAG,CAAC;AAClC,MAAM,CAAC,MAAM,yBAAyB,GAAG,KAAK,CAAC;AAC/C,MAAM,CAAC,MAAM,oBAAoB,GAAG,MAAM,CAAC;AAC3C,MAAM,CAAC,MAAM,uBAAuB,GAAG,EAAE,CAAC;AAC1C,MAAM,CAAC,MAAM,kBAAkB,GAAG,oBAAoB,CAAC;AAEvD,qEAAqE;AACrE,4EAA4E;AAC5E,MAAM,CAAC,MAAM,eAAe,GAA4B;IACtD,
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -15,87 +15,140 @@ import { createProxyApp } from './proxy.js';
|
|
|
15
15
|
import { logger, maskKey } from './logger.js';
|
|
16
16
|
import { startScraper, stopScraper } from './scraper.js';
|
|
17
17
|
import { FORCE_SHUTDOWN_TIMEOUT_MS } from './constants.js';
|
|
18
|
+
import { daemonStart, daemonStop, daemonStatus } from './cli/daemon.js';
|
|
19
|
+
import { syncModelsToOpencodeConfig } from './cli/opencode-config.js';
|
|
20
|
+
import { autostartInstall, autostartUninstall, autostartStatus } from './cli/autostart.js';
|
|
18
21
|
// ---------------------------------------------------------------------------
|
|
19
|
-
// Subcommand
|
|
22
|
+
// Subcommand dispatch — if/else if prevents fallthrough to server code
|
|
20
23
|
// ---------------------------------------------------------------------------
|
|
21
|
-
|
|
24
|
+
const subcommand = process.argv[2];
|
|
25
|
+
if (subcommand === 'start') {
|
|
26
|
+
const args = process.argv.slice(3);
|
|
27
|
+
let port;
|
|
28
|
+
let configPath;
|
|
29
|
+
for (let i = 0; i < args.length; i++) {
|
|
30
|
+
if (args[i] === '--port' && args[i + 1]) {
|
|
31
|
+
port = Number(args[++i]);
|
|
32
|
+
}
|
|
33
|
+
else if (args[i] === '--config' && args[i + 1]) {
|
|
34
|
+
configPath = args[++i];
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
daemonStart(port, configPath);
|
|
38
|
+
// daemonStart owns its own exit path via setTimeout
|
|
39
|
+
}
|
|
40
|
+
else if (subcommand === 'stop') {
|
|
41
|
+
daemonStop();
|
|
42
|
+
}
|
|
43
|
+
else if (subcommand === 'status') {
|
|
44
|
+
daemonStatus();
|
|
45
|
+
}
|
|
46
|
+
else if (subcommand === 'sync-models') {
|
|
47
|
+
const result = syncModelsToOpencodeConfig();
|
|
48
|
+
if (result.success) {
|
|
49
|
+
console.log(`Models synced to ${result.path}`);
|
|
50
|
+
process.exit(0);
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
console.error(`Failed: ${result.error}`);
|
|
54
|
+
process.exit(1);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
else if (process.argv[2] === 'setup') {
|
|
22
58
|
const { setup } = await import('./cli/setup.js');
|
|
23
59
|
const { getDefaultConfigPath } = await import('./config.js');
|
|
24
60
|
await setup(dirname(getDefaultConfigPath()));
|
|
25
61
|
process.exit(0);
|
|
26
62
|
}
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
for (const k of config.keys) {
|
|
40
|
-
logger.info(' - %s: %s', k.label, maskKey(k.key));
|
|
41
|
-
}
|
|
42
|
-
// ---------------------------------------------------------------------------
|
|
43
|
-
// Security startup banner
|
|
44
|
-
// ---------------------------------------------------------------------------
|
|
45
|
-
function logSecurityWarnings(cfg) {
|
|
46
|
-
// Not binding to localhost — warn about exposure
|
|
47
|
-
if (cfg.host !== '127.0.0.1' && cfg.host !== 'localhost') {
|
|
48
|
-
logger.warn('Proxy binding to "%s" — not localhost. Ensure firewall rules are set.', cfg.host);
|
|
63
|
+
else if (subcommand === 'autostart') {
|
|
64
|
+
const action = process.argv[3];
|
|
65
|
+
if (action === 'install') {
|
|
66
|
+
const args = process.argv.slice(4);
|
|
67
|
+
let port;
|
|
68
|
+
for (let i = 0; i < args.length; i++) {
|
|
69
|
+
if (args[i] === '--port' && args[i + 1]) {
|
|
70
|
+
port = Number(args[++i]);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
autostartInstall(port);
|
|
74
|
+
process.exit(0);
|
|
49
75
|
}
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
76
|
+
else if (action === 'uninstall') {
|
|
77
|
+
autostartUninstall();
|
|
78
|
+
process.exit(0);
|
|
53
79
|
}
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
80
|
+
else {
|
|
81
|
+
autostartStatus();
|
|
82
|
+
process.exit(0);
|
|
57
83
|
}
|
|
58
|
-
logger.info('Security: %d API keys loaded (all masked in logs)', cfg.keys.length);
|
|
59
84
|
}
|
|
60
|
-
|
|
61
|
-
//
|
|
62
|
-
//
|
|
63
|
-
//
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
logger.info('Upstream: %s', config.upstreamBaseUrl);
|
|
68
|
-
logger.info('API keys loaded: %d', config.keys.length);
|
|
69
|
-
// Start usage-based scraper if configured
|
|
70
|
-
if (config.scraping?.enabled && config.scraping.accounts.length > 0) {
|
|
71
|
-
startScraper(config.scraping.accounts, config.scraping.intervalMs);
|
|
85
|
+
else {
|
|
86
|
+
// -----------------------------------------------------------------------
|
|
87
|
+
// No subcommand — start proxy in foreground (original behavior)
|
|
88
|
+
// -----------------------------------------------------------------------
|
|
89
|
+
let config;
|
|
90
|
+
try {
|
|
91
|
+
config = loadConfig();
|
|
72
92
|
}
|
|
73
|
-
|
|
74
|
-
logger.
|
|
93
|
+
catch (err) {
|
|
94
|
+
logger.error({ err }, 'Failed to load configuration');
|
|
95
|
+
process.exit(1);
|
|
75
96
|
}
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
97
|
+
logger.info('Loaded %d API key(s):', config.keys.length);
|
|
98
|
+
for (const k of config.keys) {
|
|
99
|
+
logger.info(' - %s: %s', k.label, maskKey(k.key));
|
|
100
|
+
}
|
|
101
|
+
// -----------------------------------------------------------------------
|
|
102
|
+
// Security startup banner
|
|
103
|
+
// -----------------------------------------------------------------------
|
|
104
|
+
function logSecurityWarnings(cfg) {
|
|
105
|
+
if (cfg.host !== '127.0.0.1' && cfg.host !== 'localhost') {
|
|
106
|
+
logger.warn('Proxy binding to "%s" — not localhost. Ensure firewall rules are set.', cfg.host);
|
|
107
|
+
}
|
|
108
|
+
if (cfg.requestTimeoutMs > 60_000) {
|
|
109
|
+
logger.warn('Request timeout is %dms (>60s) — may cause resource exhaustion', cfg.requestTimeoutMs);
|
|
110
|
+
}
|
|
111
|
+
if (cfg.allowedOrigins.length === 0) {
|
|
112
|
+
logger.warn('CORS allows all origins — restrict in production');
|
|
113
|
+
}
|
|
114
|
+
logger.info('Security: %d API keys loaded (all masked in logs)', cfg.keys.length);
|
|
115
|
+
}
|
|
116
|
+
logSecurityWarnings(config);
|
|
117
|
+
// -----------------------------------------------------------------------
|
|
118
|
+
// Server
|
|
119
|
+
// -----------------------------------------------------------------------
|
|
120
|
+
const app = createProxyApp(config);
|
|
121
|
+
const server = serve({ fetch: app.fetch, port: config.port, hostname: config.host }, (info) => {
|
|
122
|
+
logger.info('Proxy listening on http://%s:%d', info.address, info.port);
|
|
123
|
+
logger.info('Upstream: %s', config.upstreamBaseUrl);
|
|
124
|
+
logger.info('API keys loaded: %d', config.keys.length);
|
|
125
|
+
if (config.scraping?.enabled && config.scraping.accounts.length > 0) {
|
|
126
|
+
startScraper(config.scraping.accounts, config.scraping.intervalMs);
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
logger.info('Usage-based scraping disabled (not configured or no accounts)');
|
|
130
|
+
}
|
|
92
131
|
});
|
|
93
|
-
//
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
132
|
+
// -----------------------------------------------------------------------
|
|
133
|
+
// Graceful shutdown
|
|
134
|
+
// -----------------------------------------------------------------------
|
|
135
|
+
let isShuttingDown = false;
|
|
136
|
+
function gracefulShutdown(signal) {
|
|
137
|
+
if (isShuttingDown)
|
|
138
|
+
return;
|
|
139
|
+
isShuttingDown = true;
|
|
140
|
+
logger.info('Received %s, starting graceful shutdown...', signal);
|
|
141
|
+
stopScraper();
|
|
142
|
+
server.close(() => {
|
|
143
|
+
logger.info('Server closed');
|
|
144
|
+
process.exit(0);
|
|
145
|
+
});
|
|
146
|
+
setTimeout(() => {
|
|
147
|
+
logger.error('Forced shutdown after timeout');
|
|
148
|
+
process.exit(1);
|
|
149
|
+
}, FORCE_SHUTDOWN_TIMEOUT_MS);
|
|
150
|
+
}
|
|
151
|
+
process.on('SIGINT', () => gracefulShutdown('SIGINT'));
|
|
152
|
+
process.on('SIGTERM', () => gracefulShutdown('SIGTERM'));
|
|
98
153
|
}
|
|
99
|
-
process.on('SIGINT', () => gracefulShutdown('SIGINT'));
|
|
100
|
-
process.on('SIGTERM', () => gracefulShutdown('SIGTERM'));
|
|
101
154
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;;;;;GAQG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAE1C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAoB,MAAM,aAAa,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AACzD,OAAO,EAAE,yBAAyB,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/logger.js
CHANGED
|
@@ -20,16 +20,31 @@ export function maskKey(key) {
|
|
|
20
20
|
return key.slice(0, 4) + '****';
|
|
21
21
|
return key.slice(0, 4) + '...' + key.slice(-4);
|
|
22
22
|
}
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
},
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
23
|
+
function createLogger() {
|
|
24
|
+
const isDev = process.env.NODE_ENV !== 'production';
|
|
25
|
+
return pino({
|
|
26
|
+
level: process.env.LOG_LEVEL || 'info',
|
|
27
|
+
...(isDev
|
|
28
|
+
? {
|
|
29
|
+
transport: tryTransport('pino-pretty', { colorize: true }),
|
|
30
|
+
}
|
|
31
|
+
: {}),
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Try to load a pino transport; return undefined if the target package
|
|
36
|
+
* is not available. This lets the CLI work from a `npm install -g` that
|
|
37
|
+
* only ships production dependencies.
|
|
38
|
+
*/
|
|
39
|
+
function tryTransport(target, options) {
|
|
40
|
+
try {
|
|
41
|
+
// pino.transport throws at runtime if the target package is missing
|
|
42
|
+
pino.transport({ target, options });
|
|
43
|
+
return { target, options };
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
return undefined; // fall back to JSON logging
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
export const logger = createLogger();
|
|
35
50
|
//# sourceMappingURL=logger.js.map
|
package/dist/logger.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB;;;;GAIG;AACH,MAAM,UAAU,OAAO,CAAC,GAAW;IACjC,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,MAAM,CAAC;IAE1C,gCAAgC;IAChC,MAAM,QAAQ,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;IACvD,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC;IAEtE,IAAI,CAAC,QAAQ;QAAE,OAAO,GAAG,CAAC,CAAC,yCAAyC;IAEpE,sCAAsC;IACtC,IAAI,GAAG,CAAC,MAAM,IAAI,EAAE;QAAE,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC;IACtD,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AACjD,CAAC;AAED,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB;;;;GAIG;AACH,MAAM,UAAU,OAAO,CAAC,GAAW;IACjC,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,MAAM,CAAC;IAE1C,gCAAgC;IAChC,MAAM,QAAQ,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;IACvD,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC;IAEtE,IAAI,CAAC,QAAQ;QAAE,OAAO,GAAG,CAAC,CAAC,yCAAyC;IAEpE,sCAAsC;IACtC,IAAI,GAAG,CAAC,MAAM,IAAI,EAAE;QAAE,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC;IACtD,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AACjD,CAAC;AAED,SAAS,YAAY;IACnB,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,CAAC;IAEpD,OAAO,IAAI,CAAC;QACV,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,MAAM;QACtC,GAAG,CAAC,KAAK;YACP,CAAC,CAAC;gBACE,SAAS,EAAE,YAAY,CAAC,aAAa,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;aAC3D;YACH,CAAC,CAAC,EAAE,CAAC;KACR,CAAC,CAAC;AACL,CAAC;AAED;;;;GAIG;AACH,SAAS,YAAY,CACnB,MAAc,EACd,OAAgC;IAEhC,IAAI,CAAC;QACH,oEAAoE;QACpE,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;QACpC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC,CAAC,4BAA4B;IAChD,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC"}
|