saros-proxy 0.5.7 → 0.6.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 +55 -8
- package/dist/cli/daemon.js +27 -14
- package/dist/cli/daemon.js.map +1 -1
- package/dist/cli/help.d.ts +7 -0
- package/dist/cli/help.js +26 -0
- package/dist/cli/help.js.map +1 -0
- package/dist/cli/opencode-config.js +20 -7
- package/dist/cli/opencode-config.js.map +1 -1
- package/dist/constants.d.ts +13 -0
- package/dist/constants.js +21 -11
- package/dist/constants.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +133 -5
- package/dist/index.js.map +1 -1
- package/dist/model-probe.d.ts +48 -0
- package/dist/model-probe.js +234 -0
- package/dist/model-probe.js.map +1 -0
- package/dist/models-fetcher.d.ts +42 -0
- package/dist/models-fetcher.js +137 -0
- package/dist/models-fetcher.js.map +1 -0
- package/dist/models-sync.d.ts +104 -0
- package/dist/models-sync.js +413 -0
- package/dist/models-sync.js.map +1 -0
- package/dist/probe-cache.d.ts +58 -0
- package/dist/probe-cache.js +99 -0
- package/dist/probe-cache.js.map +1 -0
- package/dist/proxy.d.ts +0 -10
- package/dist/proxy.js +4 -33
- package/dist/proxy.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -237,6 +237,7 @@ The wizard will:
|
|
|
237
237
|
2. Ask for your API keys (name + key)
|
|
238
238
|
3. Generate `config.yaml` automatically
|
|
239
239
|
4. Run a smoke test to verify everything works
|
|
240
|
+
5. Configure opencode.json with provider settings and model definitions
|
|
240
241
|
|
|
241
242
|
Want to run manually instead? Skip the wizard and just create a `config.yaml`:
|
|
242
243
|
|
|
@@ -400,10 +401,47 @@ saros-proxy stop
|
|
|
400
401
|
|
|
401
402
|
# Sync models from src/constants.ts to opencode.json
|
|
402
403
|
saros-proxy sync-models
|
|
404
|
+
|
|
405
|
+
# Probe model capabilities (liveness, reasoning, tool calling)
|
|
406
|
+
saros-proxy probe [model-id]
|
|
407
|
+
|
|
408
|
+
# Probe all models
|
|
409
|
+
saros-proxy probe
|
|
410
|
+
|
|
411
|
+
# Install autostart (Windows: VBS script or Registry)
|
|
412
|
+
saros-proxy autostart install [--port <port>] [--method vbs|registry|auto]
|
|
413
|
+
|
|
414
|
+
# Uninstall autostart
|
|
415
|
+
saros-proxy autostart uninstall [--method vbs|registry|auto]
|
|
416
|
+
|
|
417
|
+
# Check autostart status
|
|
418
|
+
saros-proxy autostart status [--method vbs|registry|auto]
|
|
403
419
|
```
|
|
404
420
|
|
|
405
421
|
The `start` command automatically syncs model definitions to `~/.config/opencode/opencode.json`.
|
|
406
422
|
|
|
423
|
+
### Model Sync Commands
|
|
424
|
+
|
|
425
|
+
Saros keeps your opencode.json in sync with the upstream API.
|
|
426
|
+
|
|
427
|
+
```bash
|
|
428
|
+
# Sync models from bundled models.json to opencode.json
|
|
429
|
+
saros-proxy sync-models
|
|
430
|
+
|
|
431
|
+
# Sync new models from upstream into opencode.json (adds missing models)
|
|
432
|
+
saros-proxy sync-upstream
|
|
433
|
+
|
|
434
|
+
# Probe model capabilities
|
|
435
|
+
saros-proxy probe [model-id]
|
|
436
|
+
|
|
437
|
+
# Probe all configured models
|
|
438
|
+
saros-proxy probe
|
|
439
|
+
```
|
|
440
|
+
|
|
441
|
+
`sync-models` writes the bundled model definitions to your opencode.json provider config.
|
|
442
|
+
`sync-upstream` fetches the live model list from upstream and adds any missing models with metadata from models.dev.
|
|
443
|
+
`probe` tests each model's liveness, reasoning, and tool-calling capabilities via the proxy.
|
|
444
|
+
|
|
407
445
|
**Daemon config path:** By default the daemon looks for `config.yaml` at:
|
|
408
446
|
- Linux/macOS: `~/.config/saros/config.yaml`
|
|
409
447
|
- Windows: `%LOCALAPPDATA%\saros\config.yaml`
|
|
@@ -560,16 +598,25 @@ Output goes to `dist/`.
|
|
|
560
598
|
|
|
561
599
|
```
|
|
562
600
|
src/
|
|
563
|
-
index.ts
|
|
564
|
-
proxy.ts
|
|
565
|
-
proxy-logic.ts
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
logger.ts
|
|
601
|
+
index.ts — Entry point, CLI dispatch, server startup
|
|
602
|
+
proxy.ts — Hono app, routing, streaming, failover
|
|
603
|
+
proxy-logic.ts — Pure logic: key selection, circuit breaker
|
|
604
|
+
config.ts — Config loading from YAML, env vars, CLI
|
|
605
|
+
constants.ts — All defaults and configuration values
|
|
606
|
+
logger.ts — Structured logging with Pino + key masking
|
|
607
|
+
models-fetcher.ts — Upstream model list fetching + caching
|
|
608
|
+
models-sync.ts — Auto-sync models from upstream to opencode.json
|
|
569
609
|
cli/
|
|
570
|
-
setup.ts
|
|
610
|
+
setup.ts — Interactive setup wizard
|
|
611
|
+
daemon.ts — Background process management
|
|
612
|
+
opencode-config.ts — opencode.json read/write/sync
|
|
613
|
+
autostart.ts — Windows/Linux autostart install/uninstall
|
|
614
|
+
ui.ts — CLI UI abstraction (@clack/prompts wrapper)
|
|
615
|
+
help.ts — Help text
|
|
616
|
+
update-check.ts — Version update check
|
|
571
617
|
test/
|
|
572
|
-
e2e.test.ts
|
|
618
|
+
e2e.test.ts — End-to-end tests with mock upstream
|
|
619
|
+
cli-setup.test.ts — CLI setup wizard tests
|
|
573
620
|
```
|
|
574
621
|
|
|
575
622
|
### Contributing
|
package/dist/cli/daemon.js
CHANGED
|
@@ -12,12 +12,16 @@
|
|
|
12
12
|
* status → checks if the process is still alive
|
|
13
13
|
*/
|
|
14
14
|
import { spawn, execFileSync } from 'node:child_process';
|
|
15
|
+
import chalk from 'chalk';
|
|
15
16
|
import { existsSync, writeFileSync, readFileSync, rmSync, mkdirSync, copyFileSync } from 'node:fs';
|
|
16
17
|
import { resolve as pathResolve, join as pathJoin } from 'node:path';
|
|
17
18
|
import { homedir } from 'node:os';
|
|
18
19
|
import { fileURLToPath } from 'node:url';
|
|
19
20
|
import { syncModelsToOpencodeConfig, getModelsJsonPath } from './opencode-config.js';
|
|
20
21
|
import { checkForUpdate } from './update-check.js';
|
|
22
|
+
import { loadConfig } from '../config.js';
|
|
23
|
+
import { syncOpencodeModelsWithUpstream } from '../models-sync.js';
|
|
24
|
+
import { DAEMON_SYNC_TIMEOUT_MS } from '../constants.js';
|
|
21
25
|
// ---------------------------------------------------------------------------
|
|
22
26
|
// Constants
|
|
23
27
|
// ---------------------------------------------------------------------------
|
|
@@ -94,17 +98,15 @@ function deletePid() {
|
|
|
94
98
|
}
|
|
95
99
|
/**
|
|
96
100
|
* Ensure models.json exists at ~/.config/saros/models.json.
|
|
97
|
-
*
|
|
101
|
+
* Always overwrites with the bundled copy on every daemon start.
|
|
98
102
|
*/
|
|
99
103
|
function ensureModelsJson() {
|
|
100
104
|
const modelsPath = getModelsJsonPath();
|
|
101
|
-
if (existsSync(modelsPath))
|
|
102
|
-
return;
|
|
103
105
|
const dir = pathJoin(homedir(), '.config', 'saros');
|
|
104
106
|
if (!existsSync(dir)) {
|
|
105
107
|
mkdirSync(dir, { recursive: true });
|
|
106
108
|
}
|
|
107
|
-
// Copy bundled models.json to default location
|
|
109
|
+
// Copy bundled models.json to default location (always overwrite)
|
|
108
110
|
const bundledPath = pathJoin(PACKAGE_ROOT, 'models.json');
|
|
109
111
|
if (existsSync(bundledPath)) {
|
|
110
112
|
copyFileSync(bundledPath, modelsPath);
|
|
@@ -182,18 +184,29 @@ export function daemonStart(port, configPath) {
|
|
|
182
184
|
const pid = child.pid;
|
|
183
185
|
writePid(pid);
|
|
184
186
|
// Wait briefly then verify the process is alive
|
|
185
|
-
setTimeout(() => {
|
|
187
|
+
setTimeout(async () => {
|
|
186
188
|
if (isProcessAlive(pid)) {
|
|
187
|
-
console.log(
|
|
189
|
+
console.log(chalk.green(`✓ Proxy started (PID ${pid}) on port ${port ?? 3000}`));
|
|
188
190
|
// Sync models from models.json to opencode.json
|
|
189
191
|
ensureModelsJson();
|
|
190
192
|
syncModelsToOpencodeConfig();
|
|
193
|
+
// Auto-sync models from upstream — await with timeout before exit
|
|
194
|
+
try {
|
|
195
|
+
const cfg = loadConfig();
|
|
196
|
+
await Promise.race([
|
|
197
|
+
syncOpencodeModelsWithUpstream(cfg),
|
|
198
|
+
new Promise((resolve) => setTimeout(resolve, DAEMON_SYNC_TIMEOUT_MS)),
|
|
199
|
+
]);
|
|
200
|
+
}
|
|
201
|
+
catch {
|
|
202
|
+
/* silent — daemon exits regardless */
|
|
203
|
+
}
|
|
191
204
|
// Check for newer version — fire-and-forget
|
|
192
205
|
checkForUpdate();
|
|
193
206
|
process.exit(0);
|
|
194
207
|
}
|
|
195
208
|
else {
|
|
196
|
-
console.error('Proxy exited shortly after starting. Check your config.');
|
|
209
|
+
console.error(chalk.red('✗ Proxy exited shortly after starting. Check your config.'));
|
|
197
210
|
deletePid();
|
|
198
211
|
process.exit(1);
|
|
199
212
|
}
|
|
@@ -202,12 +215,12 @@ export function daemonStart(port, configPath) {
|
|
|
202
215
|
export function daemonStop() {
|
|
203
216
|
const pid = readPid();
|
|
204
217
|
if (!pid) {
|
|
205
|
-
console.log('No running proxy daemon found.');
|
|
218
|
+
console.log(chalk.yellow('No running proxy daemon found.'));
|
|
206
219
|
process.exit(0);
|
|
207
220
|
}
|
|
208
221
|
const pidNum = Number(pid);
|
|
209
222
|
if (!isProcessAlive(pidNum)) {
|
|
210
|
-
console.log(`Daemon process (PID ${pid}) is not running. Cleaning up PID file.`);
|
|
223
|
+
console.log(chalk.yellow(`Daemon process (PID ${pid}) is not running. Cleaning up PID file.`));
|
|
211
224
|
deletePid();
|
|
212
225
|
process.exit(0);
|
|
213
226
|
}
|
|
@@ -216,11 +229,11 @@ export function daemonStop() {
|
|
|
216
229
|
// Wait a moment to confirm it's gone
|
|
217
230
|
setTimeout(() => {
|
|
218
231
|
if (isProcessAlive(pidNum)) {
|
|
219
|
-
console.error(
|
|
232
|
+
console.error(chalk.red(`✗ Failed to stop daemon (PID ${pid}). Try: taskkill /F /PID ${pid}`));
|
|
220
233
|
process.exit(1);
|
|
221
234
|
}
|
|
222
235
|
else {
|
|
223
|
-
console.log(
|
|
236
|
+
console.log(chalk.green(`✓ Proxy (PID ${pid}) stopped.`));
|
|
224
237
|
process.exit(0);
|
|
225
238
|
}
|
|
226
239
|
}, 1000);
|
|
@@ -228,16 +241,16 @@ export function daemonStop() {
|
|
|
228
241
|
export function daemonStatus() {
|
|
229
242
|
const pid = readPid();
|
|
230
243
|
if (!pid) {
|
|
231
|
-
console.log('Daemon is not running.');
|
|
244
|
+
console.log(chalk.yellow('Daemon is not running.'));
|
|
232
245
|
process.exit(0);
|
|
233
246
|
}
|
|
234
247
|
const pidNum = Number(pid);
|
|
235
248
|
if (isProcessAlive(pidNum)) {
|
|
236
|
-
console.log(
|
|
249
|
+
console.log(chalk.green(`✓ Proxy is running (PID ${pid}).`));
|
|
237
250
|
process.exit(0);
|
|
238
251
|
}
|
|
239
252
|
else {
|
|
240
|
-
console.log(`Stale PID file (PID ${pid} is gone). Cleaning up.`);
|
|
253
|
+
console.log(chalk.yellow(`Stale PID file (PID ${pid} is gone). Cleaning up.`));
|
|
241
254
|
deletePid();
|
|
242
255
|
process.exit(1);
|
|
243
256
|
}
|
package/dist/cli/daemon.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"daemon.js","sourceRoot":"","sources":["../../src/cli/daemon.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnG,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,IAAI,IAAI,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrE,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,0BAA0B,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACrF,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"daemon.js","sourceRoot":"","sources":["../../src/cli/daemon.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/help.js
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* help.ts — Help text for the Saros proxy CLI.
|
|
3
|
+
*
|
|
4
|
+
* Extracted from index.ts so importing it does not trigger the
|
|
5
|
+
* entire module graph (config loading, server setup, etc.).
|
|
6
|
+
*/
|
|
7
|
+
export function printHelp() {
|
|
8
|
+
console.log(`Usage: saros-proxy [command] [options]
|
|
9
|
+
|
|
10
|
+
Commands:
|
|
11
|
+
start [--port <port>] [--config <path>] Start the proxy daemon
|
|
12
|
+
stop Stop the proxy daemon
|
|
13
|
+
status Check daemon status
|
|
14
|
+
setup Run interactive setup wizard
|
|
15
|
+
sync-models Sync models from models.json to opencode.json
|
|
16
|
+
sync-upstream Sync new models from upstream into opencode.json
|
|
17
|
+
probe [model-id] Test model capabilities (liveness, reasoning, tools)
|
|
18
|
+
autostart install [--method <method>] Install autostart
|
|
19
|
+
autostart uninstall [--method <method>] Uninstall autostart
|
|
20
|
+
autostart status [--method <method>] Check autostart status
|
|
21
|
+
help Show this help message
|
|
22
|
+
|
|
23
|
+
Options:
|
|
24
|
+
--version, -v Show version number`);
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=help.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"help.js","sourceRoot":"","sources":["../../src/cli/help.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,UAAU,SAAS;IACvB,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;iEAgBmD,CAAC,CAAC;AACnE,CAAC"}
|
|
@@ -67,9 +67,11 @@ export function updateOpencodeConfig(port, options = {}) {
|
|
|
67
67
|
error: 'Existing opencode.json contains invalid JSON. Please fix it manually.',
|
|
68
68
|
};
|
|
69
69
|
}
|
|
70
|
-
// Create backup before modifying
|
|
70
|
+
// Create backup before modifying (never overwrite existing backup)
|
|
71
71
|
const backupPath = `${configPath}.backup`;
|
|
72
|
-
|
|
72
|
+
if (!existsSync(backupPath)) {
|
|
73
|
+
copyFileSync(configPath, backupPath);
|
|
74
|
+
}
|
|
73
75
|
}
|
|
74
76
|
else {
|
|
75
77
|
// Create new config
|
|
@@ -81,7 +83,7 @@ export function updateOpencodeConfig(port, options = {}) {
|
|
|
81
83
|
mkdirSync(dir, { recursive: true });
|
|
82
84
|
}
|
|
83
85
|
}
|
|
84
|
-
// Build provider configuration (models
|
|
86
|
+
// Build provider configuration (models from bundled models.json)
|
|
85
87
|
const providerConfig = {
|
|
86
88
|
npm: '@ai-sdk/openai-compatible',
|
|
87
89
|
name: 'Saros',
|
|
@@ -89,12 +91,21 @@ export function updateOpencodeConfig(port, options = {}) {
|
|
|
89
91
|
baseURL: `http://127.0.0.1:${port}/zen/go/v1`,
|
|
90
92
|
apiKey: 'not-used',
|
|
91
93
|
},
|
|
94
|
+
models: loadModelsFromJson(),
|
|
92
95
|
};
|
|
93
|
-
// Merge into existing config
|
|
96
|
+
// Merge into existing config, preserving any user customizations
|
|
94
97
|
const existingProvider = config.provider ?? {};
|
|
98
|
+
const rawSaros = existingProvider['saros-proxy'];
|
|
99
|
+
const existingSaros = (rawSaros && typeof rawSaros === 'object' && !Array.isArray(rawSaros))
|
|
100
|
+
? rawSaros
|
|
101
|
+
: {};
|
|
95
102
|
config.provider = {
|
|
96
103
|
...existingProvider,
|
|
97
|
-
'saros-proxy':
|
|
104
|
+
'saros-proxy': {
|
|
105
|
+
...providerConfig,
|
|
106
|
+
...existingSaros, // user wins for non-models fields; models always synced from bundled source
|
|
107
|
+
models: providerConfig.models, // always sync models from bundled source
|
|
108
|
+
},
|
|
98
109
|
};
|
|
99
110
|
// Write updated config
|
|
100
111
|
const json = JSON.stringify(config, null, 2);
|
|
@@ -150,9 +161,11 @@ export function syncModelsToOpencodeConfig(options = {}) {
|
|
|
150
161
|
if (!sarosProvider || typeof sarosProvider !== 'object' || Array.isArray(sarosProvider)) {
|
|
151
162
|
return { success: false, error: 'saros-proxy provider config is missing or malformed' };
|
|
152
163
|
}
|
|
153
|
-
// Backup before modifying
|
|
164
|
+
// Backup before modifying (never overwrite existing backup)
|
|
154
165
|
const backupPath = `${configPath}.backup`;
|
|
155
|
-
|
|
166
|
+
if (!existsSync(backupPath)) {
|
|
167
|
+
copyFileSync(configPath, backupPath);
|
|
168
|
+
}
|
|
156
169
|
// Load models from models.json (source of truth)
|
|
157
170
|
const models = loadModelsFromJson(options.modelsPath);
|
|
158
171
|
sarosProvider.models = models;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"opencode-config.js","sourceRoot":"","sources":["../../src/cli/opencode-config.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAC3F,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAElD,8EAA8E;AAC9E,iBAAiB;AACjB,8EAA8E;AAE9E,sEAAsE;AACtE,MAAM,UAAU,4BAA4B;IAC1C,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IACvB,OAAO,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,eAAe,CAAC,CAAC;AAC5D,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,iBAAiB;IAC/B,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IACvB,OAAO,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,aAAa,CAAC,CAAC;AACvD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,UAAmB;IACpD,MAAM,IAAI,GAAG,UAAU,IAAI,iBAAiB,EAAE,CAAC;IAC/C,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACrB,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YACxC,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAA4B,CAAC;QACpD,CAAC;QAAC,MAAM,CAAC;YACP,mCAAmC;QACrC,CAAC;IACH,CAAC;IACD,kCAAkC;IAClC,OAAO,eAAe,CAAC;AACzB,CAAC;AAaD,8EAA8E;AAC9E,uBAAuB;AACvB,8EAA8E;AAE9E;;;;;;GAMG;AACH,MAAM,UAAU,oBAAoB,CAClC,IAAY,EACZ,UAAmC,EAAE;IAErC,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,4BAA4B,EAAE,CAAC;IAExE,IAAI,CAAC;QACH,IAAI,MAA+B,CAAC;QACpC,IAAI,OAAO,GAAG,KAAK,CAAC;QAEpB,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC3B,iCAAiC;YACjC,MAAM,GAAG,GAAG,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YAC9C,IAAI,CAAC;gBACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAA4B,CAAC;YACtD,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,IAAI,EAAE,UAAU;oBAChB,KAAK,EAAE,uEAAuE;iBAC/E,CAAC;YACJ,CAAC;YAED,
|
|
1
|
+
{"version":3,"file":"opencode-config.js","sourceRoot":"","sources":["../../src/cli/opencode-config.ts"],"names":[],"mappings":"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"}
|
package/dist/constants.d.ts
CHANGED
|
@@ -22,4 +22,17 @@ export declare const FORCE_SHUTDOWN_TIMEOUT_MS = 5000;
|
|
|
22
22
|
export declare const MAX_STREAMING_BUFFER = 10000;
|
|
23
23
|
export declare const DEFAULT_USAGE_THRESHOLD = 50;
|
|
24
24
|
export declare const WORKSPACE_ID_REGEX: RegExp;
|
|
25
|
+
export declare const MODELS_FETCH_TIMEOUT_MS = 5000;
|
|
26
|
+
export declare const MODELS_WARM_BUFFER_MS = 60000;
|
|
27
|
+
export declare const MODELS_DEV_URL = "https://models.dev/api.json";
|
|
28
|
+
export declare const MODELS_DEV_CACHE_TTL_MS: number;
|
|
29
|
+
export declare const MODELS_DEV_TIMEOUT_MS = 10000;
|
|
30
|
+
export declare const MODELS_DEV_PROVIDER_ID = "opencode-go";
|
|
31
|
+
export declare const MODELS_DEV_SAFE_FIELDS: readonly ["id", "name", "tool_call", "reasoning", "limit", "modalities", "cost", "reasoning_options", "interleaved", "structured_output"];
|
|
32
|
+
export declare const PROBE_CACHE_TTL_MS: number;
|
|
33
|
+
export declare const PROBE_REQUEST_TIMEOUT_MS = 30000;
|
|
34
|
+
export declare const PROBE_LIVENESS_PROMPT = "Reply with the word 'pong' and nothing else.";
|
|
35
|
+
export declare const PROBE_REASONING_PROMPT = "What is 2+2? Think step by step.";
|
|
36
|
+
export declare const PROBE_TOOL_CALLING_PROMPT = "What is the weather in Paris?";
|
|
37
|
+
export declare const DAEMON_SYNC_TIMEOUT_MS = 30000;
|
|
25
38
|
export declare const OPENCODE_MODELS: Record<string, unknown>;
|
package/dist/constants.js
CHANGED
|
@@ -22,6 +22,26 @@ export const FORCE_SHUTDOWN_TIMEOUT_MS = 5_000;
|
|
|
22
22
|
export const MAX_STREAMING_BUFFER = 10_000;
|
|
23
23
|
export const DEFAULT_USAGE_THRESHOLD = 50;
|
|
24
24
|
export const WORKSPACE_ID_REGEX = /^wrk_[A-Za-z0-9]+$/;
|
|
25
|
+
export const MODELS_FETCH_TIMEOUT_MS = 5_000;
|
|
26
|
+
export const MODELS_WARM_BUFFER_MS = 60_000;
|
|
27
|
+
// models.dev canonical metadata
|
|
28
|
+
export const MODELS_DEV_URL = 'https://models.dev/api.json';
|
|
29
|
+
export const MODELS_DEV_CACHE_TTL_MS = 5 * 60 * 1000; // 5 minutes
|
|
30
|
+
export const MODELS_DEV_TIMEOUT_MS = 10_000;
|
|
31
|
+
export const MODELS_DEV_PROVIDER_ID = 'opencode-go';
|
|
32
|
+
export const MODELS_DEV_SAFE_FIELDS = [
|
|
33
|
+
'id', 'name', 'tool_call', 'reasoning', 'limit',
|
|
34
|
+
'modalities', 'cost', 'reasoning_options',
|
|
35
|
+
'interleaved', 'structured_output',
|
|
36
|
+
];
|
|
37
|
+
// Probe cache & request constants
|
|
38
|
+
export const PROBE_CACHE_TTL_MS = 7 * 24 * 60 * 60 * 1000; // 7 days
|
|
39
|
+
export const PROBE_REQUEST_TIMEOUT_MS = 30_000;
|
|
40
|
+
export const PROBE_LIVENESS_PROMPT = "Reply with the word 'pong' and nothing else.";
|
|
41
|
+
export const PROBE_REASONING_PROMPT = 'What is 2+2? Think step by step.';
|
|
42
|
+
export const PROBE_TOOL_CALLING_PROMPT = 'What is the weather in Paris?';
|
|
43
|
+
// Daemon auto-sync timeout (how long to wait for upstream sync before exiting)
|
|
44
|
+
export const DAEMON_SYNC_TIMEOUT_MS = 30_000;
|
|
25
45
|
// OpenCode client model definitions for proxy provider configuration
|
|
26
46
|
// Source: https://opencode.ai/zen/go/v1/models (18 models as of 2026-06-06)
|
|
27
47
|
export const OPENCODE_MODELS = {
|
|
@@ -172,16 +192,6 @@ export const OPENCODE_MODELS = {
|
|
|
172
192
|
reasoning: true,
|
|
173
193
|
limit: { context: 262144, output: 65536 },
|
|
174
194
|
modalities: { input: ['text', 'image', 'video'], output: ['text'] },
|
|
175
|
-
}
|
|
176
|
-
// HY3 Preview (Tencent - 256K context, 64K output, text-only)
|
|
177
|
-
// NOT blocklisted - OpenCode auto-generates low/medium/high variants (reasoning_effort supported)
|
|
178
|
-
'hy3-preview': {
|
|
179
|
-
id: 'hy3-preview',
|
|
180
|
-
name: 'HY3 Preview',
|
|
181
|
-
tool_call: true,
|
|
182
|
-
reasoning: true,
|
|
183
|
-
limit: { context: 256000, output: 64000 },
|
|
184
|
-
modalities: { input: ['text'], output: ['text'] },
|
|
185
|
-
},
|
|
195
|
+
}
|
|
186
196
|
};
|
|
187
197
|
//# sourceMappingURL=constants.js.map
|
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;
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
package/dist/index.js
CHANGED
|
@@ -9,16 +9,47 @@
|
|
|
9
9
|
* tsx src/index.ts setup # Run the interactive setup wizard
|
|
10
10
|
*/
|
|
11
11
|
import { serve } from '@hono/node-server';
|
|
12
|
-
import { dirname } from 'node:path';
|
|
12
|
+
import { dirname, resolve } from 'node:path';
|
|
13
|
+
import { fileURLToPath } from 'node:url';
|
|
13
14
|
import { loadConfig } from './config.js';
|
|
14
15
|
import { createProxyApp } from './proxy.js';
|
|
15
16
|
import { logger, maskKey } from './logger.js';
|
|
16
17
|
import { startScraper, stopScraper } from './scraper.js';
|
|
17
18
|
import { FORCE_SHUTDOWN_TIMEOUT_MS } from './constants.js';
|
|
18
19
|
import { daemonStart, daemonStop, daemonStatus } from './cli/daemon.js';
|
|
19
|
-
import { syncModelsToOpencodeConfig } from './cli/opencode-config.js';
|
|
20
|
+
import { syncModelsToOpencodeConfig, getDefaultOpencodeConfigPath } from './cli/opencode-config.js';
|
|
20
21
|
import { autostartInstall, autostartUninstall, autostartStatus } from './cli/autostart.js';
|
|
21
22
|
import { checkForUpdate } from './cli/update-check.js';
|
|
23
|
+
import { syncOpencodeModelsWithUpstream, getModelsFromOpencodeConfig } from './models-sync.js';
|
|
24
|
+
import { probeModel } from './model-probe.js';
|
|
25
|
+
import { getCachedProbe, setCachedProbe } from './probe-cache.js';
|
|
26
|
+
import chalk from 'chalk';
|
|
27
|
+
import { printHelp } from './cli/help.js';
|
|
28
|
+
import { readFileSync } from 'node:fs';
|
|
29
|
+
// ---------------------------------------------------------------------------
|
|
30
|
+
// Help text (re-exported for testing)
|
|
31
|
+
// ---------------------------------------------------------------------------
|
|
32
|
+
export { printHelp } from './cli/help.js';
|
|
33
|
+
// ---------------------------------------------------------------------------
|
|
34
|
+
// Probe result formatter
|
|
35
|
+
// ---------------------------------------------------------------------------
|
|
36
|
+
function formatProbeStatus(status) {
|
|
37
|
+
switch (status) {
|
|
38
|
+
case 'ok': return chalk.green('✓ ok');
|
|
39
|
+
case 'unsupported': return chalk.yellow('? unsupported');
|
|
40
|
+
case 'error': return chalk.red('✗ error');
|
|
41
|
+
case 'rate_limited': return chalk.yellow('! rate_limited');
|
|
42
|
+
default: return status;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
function printProbeResult(probe) {
|
|
46
|
+
const livenessDetail = probe.liveness.details ? ` (${probe.liveness.details})` : '';
|
|
47
|
+
const reasoningDetail = probe.reasoning.details ? ` (${probe.reasoning.details})` : '';
|
|
48
|
+
const toolDetail = probe.toolCalling.details ? ` (${probe.toolCalling.details})` : '';
|
|
49
|
+
console.log(` Liveness: ${formatProbeStatus(probe.liveness.status)}${livenessDetail}`);
|
|
50
|
+
console.log(` Reasoning: ${formatProbeStatus(probe.reasoning.status)}${reasoningDetail}`);
|
|
51
|
+
console.log(` Tool Calling: ${formatProbeStatus(probe.toolCalling.status)}${toolDetail}`);
|
|
52
|
+
}
|
|
22
53
|
// ---------------------------------------------------------------------------
|
|
23
54
|
// Subcommand dispatch — if/else if prevents fallthrough to server code
|
|
24
55
|
// ---------------------------------------------------------------------------
|
|
@@ -47,15 +78,15 @@ else if (subcommand === 'status') {
|
|
|
47
78
|
else if (subcommand === 'sync-models') {
|
|
48
79
|
const result = syncModelsToOpencodeConfig();
|
|
49
80
|
if (result.success) {
|
|
50
|
-
console.log(
|
|
81
|
+
console.log(chalk.green(`✓ Models synced to ${result.path}`));
|
|
51
82
|
process.exit(0);
|
|
52
83
|
}
|
|
53
84
|
else {
|
|
54
|
-
console.error(
|
|
85
|
+
console.error(chalk.red(`✗ Failed: ${result.error}`));
|
|
55
86
|
process.exit(1);
|
|
56
87
|
}
|
|
57
88
|
}
|
|
58
|
-
else if (
|
|
89
|
+
else if (subcommand === 'setup') {
|
|
59
90
|
const { setup } = await import('./cli/setup.js');
|
|
60
91
|
const { getDefaultConfigPath } = await import('./config.js');
|
|
61
92
|
await setup(dirname(getDefaultConfigPath()));
|
|
@@ -110,6 +141,103 @@ else if (subcommand === 'autostart') {
|
|
|
110
141
|
process.exit(0);
|
|
111
142
|
}
|
|
112
143
|
}
|
|
144
|
+
else if (subcommand === '--version' || subcommand === '-v') {
|
|
145
|
+
const packageRoot = resolve(dirname(fileURLToPath(import.meta.url)), '..');
|
|
146
|
+
const pkg = JSON.parse(readFileSync(resolve(packageRoot, 'package.json'), 'utf-8'));
|
|
147
|
+
console.log(pkg.version);
|
|
148
|
+
process.exit(0);
|
|
149
|
+
}
|
|
150
|
+
else if (subcommand === 'help' || subcommand === '--help' || subcommand === '-h') {
|
|
151
|
+
printHelp();
|
|
152
|
+
process.exit(0);
|
|
153
|
+
}
|
|
154
|
+
else if (subcommand === 'sync-upstream') {
|
|
155
|
+
let syncConfig;
|
|
156
|
+
try {
|
|
157
|
+
syncConfig = loadConfig();
|
|
158
|
+
}
|
|
159
|
+
catch (err) {
|
|
160
|
+
console.error(chalk.red('Failed to load config:'), err instanceof Error ? err.message : String(err));
|
|
161
|
+
process.exit(1);
|
|
162
|
+
}
|
|
163
|
+
const result = await syncOpencodeModelsWithUpstream(syncConfig);
|
|
164
|
+
if (result.success) {
|
|
165
|
+
console.log(chalk.green(`✓ Models synced to ${result.path}`));
|
|
166
|
+
process.exit(0);
|
|
167
|
+
}
|
|
168
|
+
else {
|
|
169
|
+
console.error(chalk.red(`✗ Failed: ${result.error}`));
|
|
170
|
+
process.exit(1);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
else if (subcommand === 'probe') {
|
|
174
|
+
let probeConfig;
|
|
175
|
+
try {
|
|
176
|
+
probeConfig = loadConfig();
|
|
177
|
+
}
|
|
178
|
+
catch (err) {
|
|
179
|
+
console.error('Failed to load config:', err instanceof Error ? err.message : String(err));
|
|
180
|
+
process.exit(1);
|
|
181
|
+
}
|
|
182
|
+
const configPath = getDefaultOpencodeConfigPath();
|
|
183
|
+
const allModelIds = getModelsFromOpencodeConfig(configPath);
|
|
184
|
+
if (allModelIds.length === 0) {
|
|
185
|
+
console.error(chalk.red('✗ No models found in opencode.json'));
|
|
186
|
+
process.exit(1);
|
|
187
|
+
}
|
|
188
|
+
const targetModelId = process.argv[3];
|
|
189
|
+
let modelsToProbe;
|
|
190
|
+
if (targetModelId) {
|
|
191
|
+
if (!allModelIds.includes(targetModelId)) {
|
|
192
|
+
console.error(chalk.red(`✗ Model "${targetModelId}" not found in opencode.json`));
|
|
193
|
+
process.exit(1);
|
|
194
|
+
}
|
|
195
|
+
modelsToProbe = [targetModelId];
|
|
196
|
+
}
|
|
197
|
+
else {
|
|
198
|
+
modelsToProbe = allModelIds;
|
|
199
|
+
}
|
|
200
|
+
// Check cache for each model
|
|
201
|
+
const toProbe = [];
|
|
202
|
+
const cached = [];
|
|
203
|
+
for (const id of modelsToProbe) {
|
|
204
|
+
if (getCachedProbe(id)) {
|
|
205
|
+
cached.push(id);
|
|
206
|
+
}
|
|
207
|
+
else {
|
|
208
|
+
toProbe.push(id);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
// Probe uncached models sequentially
|
|
212
|
+
for (const id of toProbe) {
|
|
213
|
+
console.log(chalk.cyan(`Probing ${id}...`));
|
|
214
|
+
try {
|
|
215
|
+
const result = await probeModel(probeConfig, id);
|
|
216
|
+
// Only cache results where at least one probe succeeded.
|
|
217
|
+
// Don't cache error or rate_limited — those may be transient (e.g.
|
|
218
|
+
// proxy was down on first run). An 'ok' result definitively
|
|
219
|
+
// confirms a capability, so it's safe to cache for the TTL.
|
|
220
|
+
if (result.liveness.status === 'ok' || result.reasoning.status === 'ok' || result.toolCalling.status === 'ok') {
|
|
221
|
+
setCachedProbe(id, result);
|
|
222
|
+
}
|
|
223
|
+
printProbeResult(result);
|
|
224
|
+
}
|
|
225
|
+
catch (err) {
|
|
226
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
227
|
+
console.log(` Error: ${message}`);
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
// Print cached results
|
|
231
|
+
for (const id of cached) {
|
|
232
|
+
const cachedResult = getCachedProbe(id);
|
|
233
|
+
if (cachedResult) {
|
|
234
|
+
console.log(chalk.dim(`${id} (cached)`));
|
|
235
|
+
printProbeResult(cachedResult);
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
console.log(chalk.dim(`\nSummary: ${toProbe.length + cached.length}/${modelsToProbe.length} models probed, ${cached.length} skipped (cached)`));
|
|
239
|
+
process.exit(0);
|
|
240
|
+
}
|
|
113
241
|
else {
|
|
114
242
|
// -----------------------------------------------------------------------
|
|
115
243
|
// No subcommand — start proxy in foreground (original behavior)
|