saros-proxy 0.7.3 → 0.9.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 +98 -47
- package/dist/cli/autostart.js.map +1 -1
- package/dist/cli/daemon.d.ts +31 -4
- package/dist/cli/daemon.js +124 -22
- package/dist/cli/daemon.js.map +1 -1
- package/dist/cli/dsh-config.d.ts +32 -0
- package/dist/cli/dsh-config.js +122 -0
- package/dist/cli/dsh-config.js.map +1 -0
- package/dist/cli/harness-models.d.ts +26 -2
- package/dist/cli/harness-models.js +192 -2
- package/dist/cli/harness-models.js.map +1 -1
- package/dist/cli/harness-sync.d.ts +27 -10
- package/dist/cli/harness-sync.js +70 -16
- package/dist/cli/harness-sync.js.map +1 -1
- package/dist/cli/help.js +4 -2
- package/dist/cli/help.js.map +1 -1
- package/dist/cli/omp-config.js +22 -5
- package/dist/cli/omp-config.js.map +1 -1
- package/dist/cli/opencode-config.js +22 -15
- package/dist/cli/opencode-config.js.map +1 -1
- package/dist/cli/overview.d.ts +10 -0
- package/dist/cli/overview.js +61 -0
- package/dist/cli/overview.js.map +1 -0
- package/dist/cli/pi-config.js +21 -5
- package/dist/cli/pi-config.js.map +1 -1
- package/dist/cli/setup.d.ts +6 -10
- package/dist/cli/setup.js +107 -233
- package/dist/cli/setup.js.map +1 -1
- package/dist/cli/ui.d.ts +0 -1
- package/dist/cli/ui.js +0 -16
- package/dist/cli/ui.js.map +1 -1
- package/dist/cli/update-check.js.map +1 -1
- package/dist/cli/usage.d.ts +12 -0
- package/dist/cli/usage.js +116 -0
- package/dist/cli/usage.js.map +1 -0
- package/dist/config.d.ts +13 -17
- package/dist/config.js +29 -78
- package/dist/config.js.map +1 -1
- package/dist/constants.d.ts +7 -6
- package/dist/constants.js +10 -5
- package/dist/constants.js.map +1 -1
- package/dist/index.d.ts +4 -4
- package/dist/index.js +34 -34
- package/dist/index.js.map +1 -1
- package/dist/model-stats.d.ts +20 -0
- package/dist/model-stats.js +135 -0
- package/dist/model-stats.js.map +1 -0
- package/dist/models-sync.js +10 -4
- package/dist/models-sync.js.map +1 -1
- package/dist/probe-cache.js.map +1 -1
- package/dist/providers/commandcode.d.ts +17 -0
- package/dist/providers/commandcode.js +232 -0
- package/dist/providers/commandcode.js.map +1 -0
- package/dist/providers/index.d.ts +43 -0
- package/dist/providers/index.js +75 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/infer.d.ts +23 -0
- package/dist/providers/infer.js +13 -0
- package/dist/providers/infer.js.map +1 -0
- package/dist/providers/opencode-go.d.ts +4 -0
- package/dist/providers/opencode-go.js +179 -0
- package/dist/providers/opencode-go.js.map +1 -0
- package/dist/providers/types.d.ts +118 -0
- package/dist/providers/types.js +10 -0
- package/dist/providers/types.js.map +1 -0
- package/dist/proxy-logic.d.ts +46 -22
- package/dist/proxy-logic.js +146 -106
- package/dist/proxy-logic.js.map +1 -1
- package/dist/proxy.d.ts +20 -2
- package/dist/proxy.js +231 -57
- package/dist/proxy.js.map +1 -1
- package/dist/usage-client.d.ts +41 -0
- package/dist/usage-client.js +124 -0
- package/dist/usage-client.js.map +1 -0
- package/dist/validation.d.ts +5 -5
- package/dist/validation.js +7 -9
- package/dist/validation.js.map +1 -1
- package/package.json +75 -77
package/README.md
CHANGED
|
@@ -5,9 +5,9 @@
|
|
|
5
5
|
[](https://opensource.org/licenses/MIT)
|
|
6
6
|
[](https://nodejs.org/)
|
|
7
7
|
|
|
8
|
-
Saros — like the eclipse cycle, this proxy predicts exhaustion and rotates accounts before they run out. Built for the OpenCode-Go API.
|
|
8
|
+
Saros — like the eclipse cycle, this proxy predicts exhaustion and rotates accounts before they run out. Built for the OpenCode-Go API, now multi-provider.
|
|
9
9
|
|
|
10
|
-
Manage multiple
|
|
10
|
+
Manage multiple API keys behind a single endpoint — OpenCode-Go **and** CommandCode keys can live in the same pool. When one key gets rate-limited, revoked, or returns server errors, the proxy automatically fails over to the next healthy key — zero downtime.
|
|
11
11
|
|
|
12
12
|
---
|
|
13
13
|
|
|
@@ -34,6 +34,8 @@ Manage multiple OpenCode-Go API keys behind a single endpoint. When one key gets
|
|
|
34
34
|
|
|
35
35
|
## Features
|
|
36
36
|
|
|
37
|
+
- **Multi-provider keys** — Mix OpenCode-Go (`sk-…`) and CommandCode (`user_…` / `sk-…`) keys in one pool.
|
|
38
|
+
- **Paste-a-key setup** — Drop any text containing keys into the setup wizard; Saros extracts them and identifies the provider by pinging each provider's API (smoke test).
|
|
37
39
|
- **Multi-key rotation** — Round-robin across all your API keys.
|
|
38
40
|
- **Auto failover** — Retry failed requests with the next healthy key.
|
|
39
41
|
- **Circuit breaker** — Disable flaky keys after a configurable threshold, then lazily re-enable them after cooldown.
|
|
@@ -89,41 +91,29 @@ Manage multiple OpenCode-Go API keys behind a single endpoint. When one key gets
|
|
|
89
91
|
|
|
90
92
|
### How Request Distribution Works
|
|
91
93
|
|
|
92
|
-
Here's how Saros picks which API key to use
|
|
94
|
+
Here's how Saros picks which API key to use:
|
|
93
95
|
|
|
94
|
-
####
|
|
96
|
+
#### Usage-Weighted Rotation
|
|
95
97
|
|
|
96
|
-
|
|
98
|
+
Saros polls the upstream usage API for each key (5h / weekly / monthly windows)
|
|
99
|
+
and weights rotation by **remaining** quota. If key X is 30% used and key Y is
|
|
100
|
+
70% used, 10 requests are distributed 7 → X and 3 → Y — proportional balancing,
|
|
101
|
+
not hard cutoffs, so neither key absorbs the full load when the other runs low.
|
|
97
102
|
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
Request 2 → Key B
|
|
101
|
-
Request 3 → Key C
|
|
102
|
-
Request 4 → Key A (wraps around)
|
|
103
|
-
```
|
|
104
|
-
|
|
105
|
-
Even distribution by default. Got 2 accounts? Odd requests go to account 1, even to account 2. Simple.
|
|
106
|
-
|
|
107
|
-
#### Layer 2: Usage-Based Gating (optional)
|
|
103
|
+
- Refreshed in the background every 60s (stale data keeps working).
|
|
104
|
+
- Without usage data, falls back to even round-robin.
|
|
108
105
|
|
|
109
|
-
|
|
106
|
+
#### Circuit Breaker
|
|
110
107
|
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
| Scenario | Behavior |
|
|
116
|
-
|---|---|
|
|
117
|
-
| Scraping off | Pure round-robin across all keys |
|
|
118
|
-
| Scraping on + data available | Round-robin, skipping over-quota accounts |
|
|
119
|
-
| Scraping on + no data | Falls back to pure round-robin |
|
|
108
|
+
Keys that return auth/quota errors (`401`, quota `4xx/5xx`) enter a cooldown
|
|
109
|
+
and are lazily re-enabled after it expires. Timeouts and connection errors do
|
|
110
|
+
**not** disable keys — they are shared-upstream failures, so Saros keeps
|
|
111
|
+
cycling instead of locking up with "all keys unavailable".
|
|
120
112
|
|
|
121
113
|
#### Concurrent Request Safety
|
|
122
114
|
|
|
123
115
|
Saros tracks which keys are currently in use. A key handling a streaming request won't get assigned another one until it finishes. No double-booking.
|
|
124
116
|
|
|
125
|
-
---
|
|
126
|
-
|
|
127
117
|
## Installation
|
|
128
118
|
|
|
129
119
|
### Prompt Install(for the lazy ones)
|
|
@@ -235,10 +225,11 @@ npx saros-proxy setup
|
|
|
235
225
|
|
|
236
226
|
The wizard will:
|
|
237
227
|
1. Ask for your proxy port (default: 3000)
|
|
238
|
-
2.
|
|
239
|
-
3.
|
|
240
|
-
4.
|
|
241
|
-
5.
|
|
228
|
+
2. Offer a **paste-a-key mode**: drop any text containing your keys (a `.env` dump, chat message, notes file) — Saros extracts every key and identifies its provider with a live smoke test, showing the detected provider and plan
|
|
229
|
+
3. Ask for your API keys manually if you prefer (typed input also auto-detects `user_` CommandCode tokens)
|
|
230
|
+
4. Generate `config.yaml` automatically
|
|
231
|
+
5. Run a smoke test to verify everything works
|
|
232
|
+
6. Configure opencode.json with provider settings and model definitions
|
|
242
233
|
|
|
243
234
|
Want to run manually instead? Skip the wizard and just create a `config.yaml`:
|
|
244
235
|
|
|
@@ -251,6 +242,8 @@ keys:
|
|
|
251
242
|
key: sk-your-primary-key-here-12345678
|
|
252
243
|
- label: secondary
|
|
253
244
|
key: sk-your-secondary-key-here-87654321
|
|
245
|
+
- label: commandcode
|
|
246
|
+
key: user_your-commandcode-token-here
|
|
254
247
|
circuitBreakerThreshold: 3
|
|
255
248
|
circuitBreakerCooldownMs: 60000
|
|
256
249
|
requestTimeoutMs: 30000
|
|
@@ -299,23 +292,61 @@ Every option can be set via YAML (`config.yaml`), environment variables, or CLI
|
|
|
299
292
|
| `circuitBreakerCooldownMs` | — | `CIRCUIT_BREAKER_COOLDOWN_MS` | `60000` | Cooldown before re-enabling (1000–3600000) |
|
|
300
293
|
| `requestTimeoutMs` | — | `REQUEST_TIMEOUT_MS` | `30000` | Upstream timeout (1000–300000) |
|
|
301
294
|
| `allowedOrigins` | — | — | `["http://localhost:*", "http://127.0.0.1:*"]` | CORS origins (`[]` = allow all) |
|
|
302
|
-
| `keys` | — | `OPENCODE_GO_KEYS` | — | Array of `{label, key}` |
|
|
295
|
+
| `keys` | — | `OPENCODE_GO_KEYS` | — | Array of `{label, key, provider?}` |
|
|
296
|
+
| `upstreams` | — | — | provider defaults | Per-provider upstream URL overrides (HTTPS only) |
|
|
303
297
|
| `config` | `--config` | — | `config.yaml` | Path to YAML config |
|
|
304
298
|
|
|
305
299
|
### API Key Format
|
|
306
300
|
|
|
307
|
-
|
|
301
|
+
Saros accepts keys from multiple providers. A key must be at least 20 characters and match one of these formats:
|
|
302
|
+
|
|
303
|
+
| Prefix | Provider | Notes |
|
|
304
|
+
|---|---|---|
|
|
305
|
+
| `sk-…` | OpenCode-Go or CommandCode | `sk-` is shared by both providers; Saros infers OpenCode-Go unless an explicit `provider` is set |
|
|
306
|
+
| `user_…` | CommandCode | Always detected as CommandCode |
|
|
308
307
|
|
|
309
308
|
**YAML:**
|
|
310
309
|
```yaml
|
|
311
310
|
keys:
|
|
312
311
|
- label: my-account
|
|
313
|
-
key: sk-your-key-here...
|
|
312
|
+
key: sk-your-key-here... # opencode-go (default inference)
|
|
313
|
+
- label: cc-account
|
|
314
|
+
key: user_your-token-here... # commandcode (inferred from prefix)
|
|
315
|
+
- label: cc-console-key
|
|
316
|
+
key: sk-your-console-key-here... # ambiguous prefix → set provider explicitly
|
|
317
|
+
provider: commandcode
|
|
318
|
+
```
|
|
319
|
+
|
|
320
|
+
The `provider` field is optional — it wins over prefix inference and is required only when a CommandCode `sk-` console key must be distinguished from an OpenCode-Go key. When keys are encrypted at rest (prefix hidden), the provider from setup time is persisted alongside.
|
|
321
|
+
|
|
322
|
+
**Per-provider upstream override (optional):**
|
|
323
|
+
|
|
324
|
+
```yaml
|
|
325
|
+
upstreams:
|
|
326
|
+
commandcode: https://api.commandcode.ai # default
|
|
327
|
+
opencode-go: https://opencode.ai # default
|
|
314
328
|
```
|
|
315
329
|
|
|
316
330
|
**Environment variable:**
|
|
317
331
|
```bash
|
|
318
|
-
OPENCODE_GO_KEYS="account1:sk-xxx,
|
|
332
|
+
OPENCODE_GO_KEYS="account1:sk-xxx,cc:user_yyy"
|
|
333
|
+
```
|
|
334
|
+
|
|
335
|
+
#### How multi-provider routing works
|
|
336
|
+
|
|
337
|
+
- Clients always speak the canonical OpenCode-Go shapes (`/zen/go/v1/...` or the `/v1/...` alias).
|
|
338
|
+
- When a request is served by a CommandCode key, Saros remaps the route to CommandCode's OpenAI-compatible surface (`/provider/v1/...`) and injects the provider's identity headers — transparent to the client.
|
|
339
|
+
- Models uniquely named by a provider (e.g. `claude-*` or vendor-prefixed ids on CommandCode) are routed to a key of that provider first; other providers remain as fallback.
|
|
340
|
+
- Synced harness configs may list provider-specific models as `model@commandcode`; the suffix selects the provider and is stripped before forwarding.
|
|
341
|
+
- The `/health` endpoint reports per-provider key counts under `providers`.
|
|
342
|
+
- Usage-based weighted rotation applies to providers with a queryable usage API (OpenCode-Go). CommandCode keys participate in rotation without usage data.
|
|
343
|
+
|
|
344
|
+
#### Smoke test (key identification)
|
|
345
|
+
|
|
346
|
+
`identifyKey` verifies a key by pinging each candidate provider with a cheap, read-only request (no token spend): OpenCode-Go `GET /zen/go/v1/usage`, CommandCode `GET /alpha/billing/subscriptions` (which also reports the subscription plan). `200` = valid, `401/403` = rejected, network error = inconclusive. The setup wizard uses this to label pasted keys; you can run it yourself:
|
|
347
|
+
|
|
348
|
+
```bash
|
|
349
|
+
CC_KEY=user_your-token npx tsx scripts/live-identify-check.ts
|
|
319
350
|
```
|
|
320
351
|
|
|
321
352
|
### API Key Encryption
|
|
@@ -391,6 +422,9 @@ npx tsx src/index.ts --config /etc/saros/config.yaml
|
|
|
391
422
|
The proxy ships with a built-in daemon. Once installed globally (`npm install -g saros-proxy`):
|
|
392
423
|
|
|
393
424
|
```bash
|
|
425
|
+
# Show the overview (running state, harnesses, API keys, config path)
|
|
426
|
+
saros-proxy
|
|
427
|
+
|
|
394
428
|
# Start the daemon (background)
|
|
395
429
|
saros-proxy start --port 3000
|
|
396
430
|
|
|
@@ -400,12 +434,13 @@ saros-proxy status
|
|
|
400
434
|
# Stop it
|
|
401
435
|
saros-proxy stop
|
|
402
436
|
|
|
403
|
-
#
|
|
404
|
-
saros-proxy sync-models
|
|
405
|
-
|
|
406
|
-
# Set which harnesses get model sync (omp|ohmypi, pi, oc|opencode)
|
|
437
|
+
# Add harnesses to the model-sync selection (omp|ohmypi, pi, oc|opencode)
|
|
407
438
|
saros-proxy configharness omp pi oc
|
|
408
439
|
|
|
440
|
+
# Remove a harness, or disable sync entirely
|
|
441
|
+
saros-proxy configharness --remove pi
|
|
442
|
+
saros-proxy configharness --clear
|
|
443
|
+
|
|
409
444
|
# List the current harness selection
|
|
410
445
|
saros-proxy configharness
|
|
411
446
|
|
|
@@ -415,6 +450,9 @@ saros-proxy probe [model-id]
|
|
|
415
450
|
# Probe all models
|
|
416
451
|
saros-proxy probe
|
|
417
452
|
|
|
453
|
+
# Show per-key quota usage and most-used models
|
|
454
|
+
saros-proxy usage
|
|
455
|
+
|
|
418
456
|
# Install autostart (Windows: VBS script or Registry)
|
|
419
457
|
saros-proxy autostart install [--port <port>] [--method vbs|registry|auto]
|
|
420
458
|
|
|
@@ -435,11 +473,12 @@ Saros keeps your harness configs in sync with the upstream API. Which harnesses
|
|
|
435
473
|
# List which harnesses are enabled for model sync
|
|
436
474
|
saros-proxy configharness
|
|
437
475
|
|
|
438
|
-
#
|
|
476
|
+
# Add oh-my-pi, pi, and OpenCode to the sync selection (additive)
|
|
439
477
|
saros-proxy configharness omp pi oc
|
|
440
478
|
|
|
441
|
-
#
|
|
442
|
-
saros-proxy
|
|
479
|
+
# Remove a harness, or disable sync entirely
|
|
480
|
+
saros-proxy configharness --remove pi
|
|
481
|
+
saros-proxy configharness --clear
|
|
443
482
|
|
|
444
483
|
# Sync the live model list from upstream into all enabled harnesses
|
|
445
484
|
saros-proxy sync-upstream
|
|
@@ -449,11 +488,12 @@ saros-proxy probe [model-id]
|
|
|
449
488
|
|
|
450
489
|
# Probe all configured models
|
|
451
490
|
saros-proxy probe
|
|
452
|
-
```
|
|
453
491
|
|
|
454
|
-
|
|
492
|
+
# Show per-key quota usage and most-used models
|
|
493
|
+
saros-proxy usage
|
|
494
|
+
```
|
|
455
495
|
`sync-upstream` fetches the live model list from upstream and writes it to each enabled harness, with metadata from models.dev.
|
|
456
|
-
|
|
496
|
+
It only touches `providers["saros-proxy"].models` in the target configs and skips harnesses whose config file does not exist.
|
|
457
497
|
`probe` tests each model's liveness, reasoning, and tool-calling capabilities via the proxy.
|
|
458
498
|
|
|
459
499
|
**Daemon config path:** By default the daemon looks for `config.yaml` at:
|
|
@@ -465,7 +505,11 @@ Override with `--config`:
|
|
|
465
505
|
saros-proxy start --port 3000 --config /path/to/config.yaml
|
|
466
506
|
```
|
|
467
507
|
|
|
468
|
-
The PID file is stored at `~/.config/saros/daemon.pid`. The child process runs with `NODE_ENV=production` (JSON logging).
|
|
508
|
+
The PID file is stored at `~/.config/saros/daemon.pid`. The child process runs with `NODE_ENV=production` (JSON logging), and its stderr is appended to `~/.config/saros/daemon.log`.
|
|
509
|
+
|
|
510
|
+
`saros-proxy status` checks the PID file first, then falls back to an os-agnostic `GET /health` port probe — so it reports the truth even when the proxy was started outside the daemon (manually, via autostart, or in another session) and no PID file exists. It also prints the enabled harnesses (`configharness` selection). `saros-proxy start` refuses to start a second instance when the configured port is already serving.
|
|
511
|
+
|
|
512
|
+
Bare `saros-proxy` (no subcommand) prints the same overview without starting anything: running state, harnesses, masked API keys, and config path. To run the proxy in the foreground (e.g. for development or in a container), use `saros-proxy serve [--port <port>] [--config <path>]` — the daemon child and the Docker entrypoint run `serve` under the hood.
|
|
469
513
|
|
|
470
514
|
---
|
|
471
515
|
|
|
@@ -545,15 +589,21 @@ Besides OpenCode, Saros can keep its provider + model config in sync for the `pi
|
|
|
545
589
|
Sync is opt-in per harness, configured with the `configharness` command. The selection is stored in `~/.config/saros/harnesses.json`:
|
|
546
590
|
|
|
547
591
|
```bash
|
|
548
|
-
#
|
|
592
|
+
# Add omp + pi + opencode to the sync selection (additive)
|
|
549
593
|
saros-proxy configharness omp pi oc
|
|
550
594
|
|
|
595
|
+
# Remove a harness, or disable sync entirely
|
|
596
|
+
saros-proxy configharness --remove pi
|
|
597
|
+
saros-proxy configharness --clear
|
|
598
|
+
|
|
551
599
|
# See the current selection
|
|
552
600
|
saros-proxy configharness
|
|
553
601
|
|
|
554
602
|
# Accepted names: omp | ohmypi, pi, oc | opencode
|
|
555
603
|
```
|
|
556
604
|
|
|
605
|
+
`configharness` is additive: each command adds the named harnesses to the current selection (running `configharness omp` then `configharness pi` enables both). Use `--remove <h>...` to disable specific harnesses or `--clear` to disable sync for every harness.
|
|
606
|
+
|
|
557
607
|
Behavior:
|
|
558
608
|
|
|
559
609
|
- If `harnesses.json` does not exist, only OpenCode is synced (the default).
|
|
@@ -653,6 +703,7 @@ src/
|
|
|
653
703
|
config.ts — Config loading from YAML, env vars, CLI
|
|
654
704
|
constants.ts — All defaults and configuration values
|
|
655
705
|
logger.ts — Structured logging with Pino + key masking
|
|
706
|
+
providers/ — Multi-provider key abstraction (KeyProvider, adapters, identifyKey)
|
|
656
707
|
models-fetcher.ts — Upstream model list fetching + caching
|
|
657
708
|
models-sync.ts — Auto-sync models from upstream to opencode config
|
|
658
709
|
cli/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"autostart.js","sourceRoot":"","sources":["../../src/cli/autostart.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;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;AAClC,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAQ9B,8EAA8E;AAC9E,YAAY;AACZ,8EAA8E;AAE9E,MAAM,WAAW,GAAG,yDAAyD,CAAC;AAC9E,MAAM,cAAc,GAAG,aAAa,CAAC;AAErC,2EAA2E;AAC3E,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC;IAC/B,SAAS,EAAQ,cAAc;IAC/B,eAAe,EAAE,cAAc;IAC/B,QAAQ,EAAS,cAAc;IAC/B,UAAU,EAAO,SAAS;IAC1B,IAAI,EAAa,SAAS;IAC1B,KAAK,EAAY,YAAY;IAC7B,SAAS,EAAQ,QAAQ;IACzB,cAAc,EAAG,QAAQ;IACzB,QAAQ,EAAS,SAAS;IAC1B,OAAO,EAAU,SAAS;IAC1B,MAAM,EAAW,OAAO;IACxB,MAAM,EAAW,OAAO;IACxB,OAAO,EAAU,MAAM;IACvB,QAAQ,EAAS,MAAM;CACxB,CAAC,CAAC;AAEH,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,MAAM,OAAO,GAAG,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"autostart.js","sourceRoot":"","sources":["../../src/cli/autostart.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/daemon.d.ts
CHANGED
|
@@ -8,12 +8,25 @@
|
|
|
8
8
|
* saros-proxy status
|
|
9
9
|
*
|
|
10
10
|
* Daemon lifecycle:
|
|
11
|
-
* start →
|
|
11
|
+
* start → refuses if the port is already serving, then spawns detached
|
|
12
|
+
* `node dist/index.js` process, saves PID, logs child stderr
|
|
12
13
|
* stop → kills the process (taskkill /T /F on Windows), removes PID file
|
|
13
14
|
* restart → kills running instance (if any), waits, then starts fresh
|
|
14
|
-
* status → checks
|
|
15
|
+
* status → checks PID file, falls back to an os-agnostic /health port
|
|
16
|
+
* probe (instances started outside the daemon have no PID file),
|
|
17
|
+
* and prints the enabled harnesses
|
|
15
18
|
*/
|
|
16
|
-
|
|
19
|
+
/**
|
|
20
|
+
* Probe the proxy's /health endpoint on a port. Returns the parsed body when
|
|
21
|
+
* the endpoint answers with status ok — the strongest cross-platform signal
|
|
22
|
+
* that a saros-proxy instance is actually serving there (PID files can go
|
|
23
|
+
* stale, and instances started outside the daemon never write one).
|
|
24
|
+
*/
|
|
25
|
+
export declare function probeProxyHealth(port: number): Promise<{
|
|
26
|
+
ok: boolean;
|
|
27
|
+
body?: Record<string, unknown>;
|
|
28
|
+
}>;
|
|
29
|
+
export declare function daemonStart(port?: number, configPath?: string): Promise<void>;
|
|
17
30
|
export declare function daemonStop(): void;
|
|
18
31
|
/**
|
|
19
32
|
* Restart the proxy daemon: stop the running instance (if any), wait
|
|
@@ -21,4 +34,18 @@ export declare function daemonStop(): void;
|
|
|
21
34
|
* Reuses daemonStart which owns its own exit path via setTimeout.
|
|
22
35
|
*/
|
|
23
36
|
export declare function daemonRestart(port?: number, configPath?: string): void;
|
|
24
|
-
export
|
|
37
|
+
export interface DaemonState {
|
|
38
|
+
running: boolean;
|
|
39
|
+
pid: string | null;
|
|
40
|
+
port: number;
|
|
41
|
+
stalePid: boolean;
|
|
42
|
+
health?: Record<string, unknown>;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Resolve the daemon state os-agnostically: PID file first (cleaning up a
|
|
46
|
+
* stale one), then a /health port probe for instances started outside the
|
|
47
|
+
* daemon (no PID file). Shared by `status` and the bare `saros-proxy`
|
|
48
|
+
* overview.
|
|
49
|
+
*/
|
|
50
|
+
export declare function getDaemonState(): Promise<DaemonState>;
|
|
51
|
+
export declare function daemonStatus(): Promise<void>;
|
package/dist/cli/daemon.js
CHANGED
|
@@ -8,14 +8,17 @@
|
|
|
8
8
|
* saros-proxy status
|
|
9
9
|
*
|
|
10
10
|
* Daemon lifecycle:
|
|
11
|
-
* start →
|
|
11
|
+
* start → refuses if the port is already serving, then spawns detached
|
|
12
|
+
* `node dist/index.js` process, saves PID, logs child stderr
|
|
12
13
|
* stop → kills the process (taskkill /T /F on Windows), removes PID file
|
|
13
14
|
* restart → kills running instance (if any), waits, then starts fresh
|
|
14
|
-
* status → checks
|
|
15
|
+
* status → checks PID file, falls back to an os-agnostic /health port
|
|
16
|
+
* probe (instances started outside the daemon have no PID file),
|
|
17
|
+
* and prints the enabled harnesses
|
|
15
18
|
*/
|
|
16
19
|
import { spawn, execFileSync } from 'node:child_process';
|
|
17
20
|
import chalk from 'chalk';
|
|
18
|
-
import { existsSync, writeFileSync, readFileSync, rmSync, mkdirSync, copyFileSync } from 'node:fs';
|
|
21
|
+
import { existsSync, writeFileSync, readFileSync, rmSync, mkdirSync, copyFileSync, createWriteStream } from 'node:fs';
|
|
19
22
|
import { resolve as pathResolve, join as pathJoin } from 'node:path';
|
|
20
23
|
import { homedir } from 'node:os';
|
|
21
24
|
import { fileURLToPath } from 'node:url';
|
|
@@ -23,12 +26,13 @@ import { getModelsJsonPath } from './opencode-config.js';
|
|
|
23
26
|
import { checkForUpdate } from './update-check.js';
|
|
24
27
|
import { loadConfig } from '../config.js';
|
|
25
28
|
import { DAEMON_SYNC_TIMEOUT_MS } from '../constants.js';
|
|
26
|
-
import { syncModelsInAllHarnesses } from './harness-sync.js';
|
|
29
|
+
import { syncModelsInAllHarnesses, readHarnessSettings } from './harness-sync.js';
|
|
27
30
|
// ---------------------------------------------------------------------------
|
|
28
31
|
// Constants
|
|
29
32
|
// ---------------------------------------------------------------------------
|
|
30
33
|
const PID_DIR = pathJoin(homedir(), '.config', 'saros');
|
|
31
34
|
const PID_FILE = pathJoin(PID_DIR, 'daemon.pid');
|
|
35
|
+
const DAEMON_LOG = pathJoin(PID_DIR, 'daemon.log');
|
|
32
36
|
const PACKAGE_ROOT = pathResolve(fileURLToPath(import.meta.url), '..', '..', '..');
|
|
33
37
|
const ENTRY_POINT = pathResolve(PACKAGE_ROOT, 'dist', 'index.js');
|
|
34
38
|
// ---------------------------------------------------------------------------
|
|
@@ -158,6 +162,43 @@ function killProcess(pid) {
|
|
|
158
162
|
}
|
|
159
163
|
}
|
|
160
164
|
// ---------------------------------------------------------------------------
|
|
165
|
+
// Port probing (os-agnostic — no platform-specific process tools)
|
|
166
|
+
// ---------------------------------------------------------------------------
|
|
167
|
+
/**
|
|
168
|
+
* Probe the proxy's /health endpoint on a port. Returns the parsed body when
|
|
169
|
+
* the endpoint answers with status ok — the strongest cross-platform signal
|
|
170
|
+
* that a saros-proxy instance is actually serving there (PID files can go
|
|
171
|
+
* stale, and instances started outside the daemon never write one).
|
|
172
|
+
*/
|
|
173
|
+
export async function probeProxyHealth(port) {
|
|
174
|
+
try {
|
|
175
|
+
const res = await fetch(`http://127.0.0.1:${port}/health`, {
|
|
176
|
+
signal: AbortSignal.timeout(1500),
|
|
177
|
+
});
|
|
178
|
+
if (!res.ok)
|
|
179
|
+
return { ok: false };
|
|
180
|
+
const body = (await res.json());
|
|
181
|
+
return { ok: body?.status === 'ok', body };
|
|
182
|
+
}
|
|
183
|
+
catch {
|
|
184
|
+
return { ok: false };
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
/** The port the proxy binds by default: --port override, else config, else 3000. */
|
|
188
|
+
function getConfigPort(configPath) {
|
|
189
|
+
try {
|
|
190
|
+
return loadConfig(configPath)?.port ?? 3000;
|
|
191
|
+
}
|
|
192
|
+
catch {
|
|
193
|
+
return 3000;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
/** Print the harness selection (which harnesses saros-proxy syncs into). */
|
|
197
|
+
function printHarnesses() {
|
|
198
|
+
const enabled = readHarnessSettings();
|
|
199
|
+
console.log(chalk.cyan(`Enabled harnesses: ${enabled.join(', ') || '(none)'}`));
|
|
200
|
+
}
|
|
201
|
+
// ---------------------------------------------------------------------------
|
|
161
202
|
// Internal helpers
|
|
162
203
|
// ---------------------------------------------------------------------------
|
|
163
204
|
/**
|
|
@@ -183,10 +224,20 @@ function killRunningDaemon() {
|
|
|
183
224
|
// ---------------------------------------------------------------------------
|
|
184
225
|
// Public API
|
|
185
226
|
// ---------------------------------------------------------------------------
|
|
186
|
-
export function daemonStart(port, configPath) {
|
|
227
|
+
export async function daemonStart(port, configPath) {
|
|
187
228
|
ensurePidDir();
|
|
188
|
-
|
|
189
|
-
|
|
229
|
+
const effectivePort = port ?? getConfigPort(configPath);
|
|
230
|
+
// Refuse to start when the port is already serving: a second instance
|
|
231
|
+
// would die with EADDRINUSE, which the old code misreported as
|
|
232
|
+
// "exited shortly after starting. Check your config."
|
|
233
|
+
const probe = await probeProxyHealth(effectivePort);
|
|
234
|
+
if (probe.ok) {
|
|
235
|
+
console.error(chalk.red(`✗ Port ${effectivePort} is already in use — a proxy instance appears to be running. Run \`saros-proxy status\` to check.`));
|
|
236
|
+
process.exit(1);
|
|
237
|
+
}
|
|
238
|
+
// Build args for the child process — `serve` runs the foreground server,
|
|
239
|
+
// which bare `saros-proxy` (overview) must no longer do.
|
|
240
|
+
const args = [ENTRY_POINT, 'serve'];
|
|
190
241
|
if (port)
|
|
191
242
|
args.push('--port', String(port));
|
|
192
243
|
if (configPath)
|
|
@@ -197,13 +248,25 @@ export function daemonStart(port, configPath) {
|
|
|
197
248
|
const encKey = getEnv('OPENCODE_GO_ENCRYPTION_KEY');
|
|
198
249
|
if (encKey)
|
|
199
250
|
env.OPENCODE_GO_ENCRYPTION_KEY = encKey;
|
|
251
|
+
// Capture child stderr (also appended to daemon.log) so startup failures
|
|
252
|
+
// can be diagnosed instead of swallowed by stdio ignore.
|
|
253
|
+
// Best-effort: an unopenable log (dir deleted under us, permissions) must
|
|
254
|
+
// not crash the starter — the stream open is async and can lose the race
|
|
255
|
+
// with cleanup in tests.
|
|
256
|
+
const logStream = createWriteStream(DAEMON_LOG, { flags: 'a' });
|
|
257
|
+
logStream.on('error', () => { });
|
|
258
|
+
let stderrBuf = '';
|
|
200
259
|
const child = spawn('node', args, {
|
|
201
260
|
cwd: PACKAGE_ROOT,
|
|
202
|
-
stdio: ['ignore', 'ignore', '
|
|
261
|
+
stdio: ['ignore', 'ignore', 'pipe'],
|
|
203
262
|
detached: true,
|
|
204
263
|
windowsHide: true,
|
|
205
264
|
env,
|
|
206
265
|
});
|
|
266
|
+
child.stderr?.on('data', (chunk) => {
|
|
267
|
+
stderrBuf += chunk.toString();
|
|
268
|
+
logStream.write(chunk);
|
|
269
|
+
});
|
|
207
270
|
// Allow parent to exit independently while child continues
|
|
208
271
|
child.unref();
|
|
209
272
|
const pid = child.pid;
|
|
@@ -211,7 +274,7 @@ export function daemonStart(port, configPath) {
|
|
|
211
274
|
// Wait briefly then verify the process is alive
|
|
212
275
|
setTimeout(async () => {
|
|
213
276
|
if (isProcessAlive(pid)) {
|
|
214
|
-
console.log(chalk.green(`✓ Proxy started (PID ${pid}) on port ${
|
|
277
|
+
console.log(chalk.green(`✓ Proxy started (PID ${pid}) on port ${effectivePort}.`));
|
|
215
278
|
// Sync models to all enabled harnesses — await with timeout before exit
|
|
216
279
|
ensureModelsJson();
|
|
217
280
|
try {
|
|
@@ -229,14 +292,28 @@ export function daemonStart(port, configPath) {
|
|
|
229
292
|
process.exit(0);
|
|
230
293
|
}
|
|
231
294
|
else {
|
|
232
|
-
|
|
295
|
+
// Surface the real startup failure from the child's stderr.
|
|
296
|
+
if (stderrBuf.includes('EADDRINUSE')) {
|
|
297
|
+
console.error(chalk.red(`✗ Port ${effectivePort} is already in use. Choose a different port (\`--port <port>\`), or stop the running proxy first.`));
|
|
298
|
+
}
|
|
299
|
+
else if (stderrBuf.includes('No valid API keys')) {
|
|
300
|
+
console.error(chalk.red('✗ No valid API keys found. Ensure keys start with "sk-" and are at least 20 characters.'));
|
|
301
|
+
}
|
|
302
|
+
else if (stderrBuf.trim()) {
|
|
303
|
+
const tail = stderrBuf.trim().split('\n').slice(-6).join('\n');
|
|
304
|
+
console.error(chalk.red('✗ Proxy exited shortly after starting. Last output:'));
|
|
305
|
+
console.error(chalk.dim(tail));
|
|
306
|
+
}
|
|
307
|
+
else {
|
|
308
|
+
console.error(chalk.red('✗ Proxy exited shortly after starting. Check your config.'));
|
|
309
|
+
}
|
|
233
310
|
deletePid();
|
|
234
311
|
process.exit(1);
|
|
235
312
|
}
|
|
236
313
|
}, 2000);
|
|
237
314
|
}
|
|
238
315
|
export function daemonStop() {
|
|
239
|
-
const { pid,
|
|
316
|
+
const { pid, wasStale } = killRunningDaemon();
|
|
240
317
|
if (pid === null) {
|
|
241
318
|
console.log(chalk.yellow('No running proxy daemon found.'));
|
|
242
319
|
process.exit(0);
|
|
@@ -281,21 +358,46 @@ export function daemonRestart(port, configPath) {
|
|
|
281
358
|
daemonStart(port, configPath);
|
|
282
359
|
}
|
|
283
360
|
}
|
|
284
|
-
|
|
361
|
+
/**
|
|
362
|
+
* Resolve the daemon state os-agnostically: PID file first (cleaning up a
|
|
363
|
+
* stale one), then a /health port probe for instances started outside the
|
|
364
|
+
* daemon (no PID file). Shared by `status` and the bare `saros-proxy`
|
|
365
|
+
* overview.
|
|
366
|
+
*/
|
|
367
|
+
export async function getDaemonState() {
|
|
368
|
+
const port = getConfigPort();
|
|
285
369
|
const pid = readPid();
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
const
|
|
291
|
-
|
|
292
|
-
|
|
370
|
+
const pidAlive = pid !== null && isProcessAlive(Number(pid));
|
|
371
|
+
const stalePid = pid !== null && !pidAlive;
|
|
372
|
+
if (stalePid)
|
|
373
|
+
deletePid();
|
|
374
|
+
const probe = await probeProxyHealth(port);
|
|
375
|
+
return {
|
|
376
|
+
running: pidAlive || probe.ok,
|
|
377
|
+
pid: pidAlive ? pid : null,
|
|
378
|
+
port,
|
|
379
|
+
stalePid,
|
|
380
|
+
health: probe.ok ? probe.body : undefined,
|
|
381
|
+
};
|
|
382
|
+
}
|
|
383
|
+
export async function daemonStatus() {
|
|
384
|
+
const state = await getDaemonState();
|
|
385
|
+
if (state.running) {
|
|
386
|
+
if (state.pid) {
|
|
387
|
+
console.log(chalk.green(`✓ Proxy is running (PID ${state.pid}) on port ${state.port}.`));
|
|
388
|
+
}
|
|
389
|
+
else {
|
|
390
|
+
console.log(chalk.green(`✓ Proxy is running on port ${state.port} (no PID file — started outside \`saros-proxy start\`).`));
|
|
391
|
+
}
|
|
392
|
+
printHarnesses();
|
|
293
393
|
process.exit(0);
|
|
294
394
|
}
|
|
295
|
-
|
|
296
|
-
console.log(chalk.yellow(
|
|
297
|
-
deletePid();
|
|
395
|
+
if (state.stalePid) {
|
|
396
|
+
console.log(chalk.yellow('Daemon is not running (stale PID cleaned up).'));
|
|
298
397
|
process.exit(1);
|
|
299
398
|
}
|
|
399
|
+
console.log(chalk.yellow('Daemon is not running.'));
|
|
400
|
+
printHarnesses();
|
|
401
|
+
process.exit(0);
|
|
300
402
|
}
|
|
301
403
|
//# sourceMappingURL=daemon.js.map
|
package/dist/cli/daemon.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"daemon.js","sourceRoot":"","sources":["../../src/cli/daemon.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"daemon.js","sourceRoot":"","sources":["../../src/cli/daemon.ts"],"names":[],"mappings":"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"}
|