saros-proxy 0.7.4 → 0.10.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.
Files changed (114) hide show
  1. package/LICENSE +0 -0
  2. package/README.md +116 -64
  3. package/dist/cli/autostart.d.ts +0 -0
  4. package/dist/cli/autostart.js +0 -0
  5. package/dist/cli/autostart.js.map +0 -0
  6. package/dist/cli/daemon.d.ts +0 -0
  7. package/dist/cli/daemon.js +4 -0
  8. package/dist/cli/daemon.js.map +1 -1
  9. package/dist/cli/dsh-config.d.ts +32 -0
  10. package/dist/cli/dsh-config.js +122 -0
  11. package/dist/cli/dsh-config.js.map +1 -0
  12. package/dist/cli/harness-models.d.ts +26 -2
  13. package/dist/cli/harness-models.js +192 -2
  14. package/dist/cli/harness-models.js.map +1 -1
  15. package/dist/cli/harness-sync.d.ts +3 -6
  16. package/dist/cli/harness-sync.js +14 -7
  17. package/dist/cli/harness-sync.js.map +1 -1
  18. package/dist/cli/help.d.ts +0 -0
  19. package/dist/cli/help.js +2 -2
  20. package/dist/cli/help.js.map +0 -0
  21. package/dist/cli/omp-config.d.ts +0 -0
  22. package/dist/cli/omp-config.js +11 -1
  23. package/dist/cli/omp-config.js.map +1 -1
  24. package/dist/cli/opencode-config.d.ts +0 -0
  25. package/dist/cli/opencode-config.js +0 -0
  26. package/dist/cli/opencode-config.js.map +0 -0
  27. package/dist/cli/overview.d.ts +0 -0
  28. package/dist/cli/overview.js +2 -1
  29. package/dist/cli/overview.js.map +1 -1
  30. package/dist/cli/pi-config.d.ts +0 -0
  31. package/dist/cli/pi-config.js +11 -1
  32. package/dist/cli/pi-config.js.map +1 -1
  33. package/dist/cli/setup.d.ts +6 -10
  34. package/dist/cli/setup.js +100 -232
  35. package/dist/cli/setup.js.map +1 -1
  36. package/dist/cli/ui.d.ts +1 -2
  37. package/dist/cli/ui.js +0 -16
  38. package/dist/cli/ui.js.map +1 -1
  39. package/dist/cli/update-check.d.ts +0 -0
  40. package/dist/cli/update-check.js +0 -0
  41. package/dist/cli/update-check.js.map +0 -0
  42. package/dist/cli/usage.d.ts +12 -0
  43. package/dist/cli/usage.js +182 -0
  44. package/dist/cli/usage.js.map +1 -0
  45. package/dist/config.d.ts +13 -17
  46. package/dist/config.js +29 -78
  47. package/dist/config.js.map +1 -1
  48. package/dist/constants.d.ts +9 -5
  49. package/dist/constants.js +14 -5
  50. package/dist/constants.js.map +1 -1
  51. package/dist/index.d.ts +0 -0
  52. package/dist/index.js +9 -25
  53. package/dist/index.js.map +1 -1
  54. package/dist/key-encryption.d.ts +0 -0
  55. package/dist/key-encryption.js +0 -0
  56. package/dist/key-encryption.js.map +0 -0
  57. package/dist/logger.d.ts +0 -0
  58. package/dist/logger.js +0 -0
  59. package/dist/logger.js.map +0 -0
  60. package/dist/model-probe.d.ts +0 -0
  61. package/dist/model-probe.js +0 -0
  62. package/dist/model-probe.js.map +0 -0
  63. package/dist/model-stats.d.ts +20 -0
  64. package/dist/model-stats.js +135 -0
  65. package/dist/model-stats.js.map +1 -0
  66. package/dist/models-fetcher.d.ts +0 -0
  67. package/dist/models-fetcher.js +0 -0
  68. package/dist/models-fetcher.js.map +0 -0
  69. package/dist/models-sync.d.ts +0 -0
  70. package/dist/models-sync.js +0 -0
  71. package/dist/models-sync.js.map +0 -0
  72. package/dist/probe-cache.d.ts +0 -0
  73. package/dist/probe-cache.js +0 -0
  74. package/dist/probe-cache.js.map +0 -0
  75. package/dist/providers/commandcode.d.ts +17 -0
  76. package/dist/providers/commandcode.js +237 -0
  77. package/dist/providers/commandcode.js.map +1 -0
  78. package/dist/providers/index.d.ts +43 -0
  79. package/dist/providers/index.js +75 -0
  80. package/dist/providers/index.js.map +1 -0
  81. package/dist/providers/infer.d.ts +23 -0
  82. package/dist/providers/infer.js +13 -0
  83. package/dist/providers/infer.js.map +1 -0
  84. package/dist/providers/opencode-go.d.ts +4 -0
  85. package/dist/providers/opencode-go.js +190 -0
  86. package/dist/providers/opencode-go.js.map +1 -0
  87. package/dist/providers/types.d.ts +135 -0
  88. package/dist/providers/types.js +10 -0
  89. package/dist/providers/types.js.map +1 -0
  90. package/dist/proxy-logic.d.ts +61 -22
  91. package/dist/proxy-logic.js +163 -106
  92. package/dist/proxy-logic.js.map +1 -1
  93. package/dist/proxy.d.ts +43 -2
  94. package/dist/proxy.js +327 -62
  95. package/dist/proxy.js.map +1 -1
  96. package/dist/token-usage.d.ts +53 -0
  97. package/dist/token-usage.js +198 -0
  98. package/dist/token-usage.js.map +1 -0
  99. package/dist/usage-client.d.ts +62 -0
  100. package/dist/usage-client.js +155 -0
  101. package/dist/usage-client.js.map +1 -0
  102. package/dist/validation.d.ts +5 -5
  103. package/dist/validation.js +7 -9
  104. package/dist/validation.js.map +1 -1
  105. package/package.json +11 -7
  106. package/dist/dashboard-parser.d.ts +0 -47
  107. package/dist/dashboard-parser.js +0 -88
  108. package/dist/dashboard-parser.js.map +0 -1
  109. package/dist/firefox-cookies.d.ts +0 -42
  110. package/dist/firefox-cookies.js +0 -170
  111. package/dist/firefox-cookies.js.map +0 -1
  112. package/dist/scraper.d.ts +0 -70
  113. package/dist/scraper.js +0 -239
  114. package/dist/scraper.js.map +0 -1
package/LICENSE CHANGED
File without changes
package/README.md CHANGED
@@ -5,9 +5,9 @@
5
5
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
6
6
  [![Node.js Version](https://img.shields.io/badge/node-%3E%3D%2022.0.0-brightgreen.svg)](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 OpenCode-Go API keys behind a single endpoint. When one key gets rate-limited, revoked, or returns server errors, the proxy automatically fails over to the next healthy key — zero downtime.
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
 
@@ -24,7 +24,7 @@ Manage multiple OpenCode-Go API keys behind a single endpoint. When one key gets
24
24
  - [Configuration Reference](#configuration-reference)
25
25
  - [Usage Examples](#usage-examples)
26
26
  - [OpenCode Integration](#opencode-integration)
27
- - [Multi-Harness Integration (pi & oh-my-pi)](#multi-harness-integration-pi--oh-my-pi)
27
+ - [Multi-Harness Integration (pi, oh-my-pi & dsh)](#multi-harness-integration-pi-oh-my-pi--dsh)
28
28
  - [Troubleshooting](#troubleshooting)
29
29
  - [Development](#development)
30
30
  - [Security](#security)
@@ -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 (`oc_sk_…` / legacy `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.
@@ -76,54 +78,61 @@ Manage multiple OpenCode-Go API keys behind a single endpoint. When one key gets
76
78
  ▼ ▼ ▼
77
79
  ┌──────────┐ ┌──────────┐ ┌──────────┐
78
80
  │ Key A │ │ Key B │ │ Key C │
79
- │ sk-abc… │ │ sk-def… │ │ sk-ghi… │
81
+ │ sk-abc… │ │ sk-def… │ │ user_… │
80
82
  └────┬─────┘ └────┬─────┘ └────┬─────┘
81
83
  │ │ │
82
84
  └────────────┼────────────┘
83
- ▼
84
- ┌──────────────────────────┐
85
- │ OpenCode-Go API │
86
- │ https://opencode.ai │
87
- └──────────────────────────┘
85
+ │
86
+ ┌─────────────────────┴─────────────────────┐
87
+ ▼ ▼
88
+ ┌───────────────────────┐ ┌──────────────────────────┐
89
+ │ OpenCode-Go API │ │ CommandCode API │
90
+ │ https://opencode.ai│ │ https://api.commandcode.ai│
91
+ └───────────────────────┘ └──────────────────────────┘
88
92
  ```
89
93
 
90
94
  ### How Request Distribution Works
91
95
 
92
- Here's how Saros picks which API key to use — it runs on two levels:
96
+ Here's how Saros picks which API key to use:
93
97
 
94
- #### Layer 1: Round-Robin (always on)
98
+ #### Usage-Weighted Rotation
95
99
 
96
- Every new request cycles to the next key in order:
100
+ Saros polls the upstream usage API for each key (5h / weekly / monthly windows)
101
+ and weights rotation by **remaining** quota. If key X is 30% used and key Y is
102
+ 70% used, 10 requests are distributed 7 → X and 3 → Y — proportional balancing,
103
+ not hard cutoffs, so neither key absorbs the full load when the other runs low.
97
104
 
98
- ```
99
- Request 1 → Key A
100
- Request 2 → Key B
101
- Request 3 → Key C
102
- Request 4 → Key A (wraps around)
103
- ```
105
+ - Refreshed in the background every 60s (stale data keeps working).
106
+ - Without usage data, falls back to even round-robin.
107
+ - A key whose account has no plan for its provider (403 `EntitlementError` /
108
+ `upgrade_required` from the usage endpoint) is dropped from rotation without
109
+ tripping the circuit breaker, and returns as soon as a later refresh sees it
110
+ working. `/health` reports `entitledCount`.
104
111
 
105
- Even distribution by default. Got 2 accounts? Odd requests go to account 1, even to account 2. Simple.
112
+ #### Token Accounting
106
113
 
107
- #### Layer 2: Usage-Based Gating (optional)
114
+ Every forwarded response's token usage is recorded per key: streaming requests
115
+ get `stream_options: {"include_usage": true}` injected (unless the client set
116
+ the option itself), and the final `usage` chunk — or the top-level `usage`
117
+ object for non-streaming bodies — is booked against the key that served the
118
+ request. Totals are persisted to `~/.config/saros/token-usage.json` (debounced
119
+ atomic writes) and shown by `saros-proxy usage`.
108
120
 
109
- If you enable dashboard scraping, Saros checks each account's quota before picking a key:
121
+ This is the only consumption signal available for providers without a
122
+ queryable quota API (CommandCode): their keys report no percentages, but
123
+ `saros-proxy usage` shows absolute token totals and request counts per key.
110
124
 
111
- - Usage **≥ threshold** (default 70%) → that key gets skipped
112
- - **All** keys over threshold → falls back to the lowest-usage key
113
- - No usage data available → pure round-robin, no change
125
+ #### Circuit Breaker
114
126
 
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 |
127
+ Keys that return auth/quota errors (`401`, quota `4xx/5xx`) enter a cooldown
128
+ and are lazily re-enabled after it expires. Timeouts and connection errors do
129
+ **not** disable keys — they are shared-upstream failures, so Saros keeps
130
+ cycling instead of locking up with "all keys unavailable".
120
131
 
121
132
  #### Concurrent Request Safety
122
133
 
123
134
  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
135
 
125
- ---
126
-
127
136
  ## Installation
128
137
 
129
138
  ### Prompt Install(for the lazy ones)
@@ -235,22 +244,25 @@ npx saros-proxy setup
235
244
 
236
245
  The wizard will:
237
246
  1. Ask for your proxy port (default: 3000)
238
- 2. Ask for your API keys (name + key)
239
- 3. Generate `config.yaml` automatically
240
- 4. Run a smoke test to verify everything works
241
- 5. Configure opencode.json with provider settings and model definitions
247
+ 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
248
+ 3. Ask for your API keys manually if you prefer (typed input also auto-detects `user_` CommandCode tokens)
249
+ 4. Generate `config.yaml` automatically
250
+ 5. Run a smoke test to verify everything works
251
+ 6. Configure opencode.json with provider settings and model definitions
242
252
 
243
253
  Want to run manually instead? Skip the wizard and just create a `config.yaml`:
244
254
 
245
255
  ```yaml
246
256
  port: 3000
247
257
  host: 127.0.0.1
248
- upstreamBaseUrl: https://opencode.ai
258
+ upstreamBaseUrl: https://opencode.ai # default upstream for opencode-go (sk-) keys
249
259
  keys:
250
260
  - label: primary
251
- key: sk-your-primary-key-here-12345678
261
+ key: sk-your-primary-key-here-12345678 # opencode-go
252
262
  - label: secondary
253
- key: sk-your-secondary-key-here-87654321
263
+ key: sk-your-secondary-key-here-87654321 # opencode-go
264
+ - label: commandcode
265
+ key: user_your-commandcode-token-here # commandcode (user_ token)
254
266
  circuitBreakerThreshold: 3
255
267
  circuitBreakerCooldownMs: 60000
256
268
  requestTimeoutMs: 30000
@@ -299,23 +311,63 @@ Every option can be set via YAML (`config.yaml`), environment variables, or CLI
299
311
  | `circuitBreakerCooldownMs` | — | `CIRCUIT_BREAKER_COOLDOWN_MS` | `60000` | Cooldown before re-enabling (1000–3600000) |
300
312
  | `requestTimeoutMs` | — | `REQUEST_TIMEOUT_MS` | `30000` | Upstream timeout (1000–300000) |
301
313
  | `allowedOrigins` | — | — | `["http://localhost:*", "http://127.0.0.1:*"]` | CORS origins (`[]` = allow all) |
302
- | `keys` | — | `OPENCODE_GO_KEYS` | — | Array of `{label, key}` |
314
+ | `keys` | — | `OPENCODE_GO_KEYS` | — | Array of `{label, key, provider?}` |
315
+ | `upstreams` | — | — | provider defaults | Per-provider upstream URL overrides (HTTPS only) |
303
316
  | `config` | `--config` | — | `config.yaml` | Path to YAML config |
304
317
 
305
318
  ### API Key Format
306
319
 
307
- Keys must start with `sk-` and be at least 20 characters.
320
+ Saros accepts keys from multiple providers. A key must be at least 20 characters and match one of these formats:
321
+
322
+ | Prefix | Provider | Notes |
323
+ |---|---|---|
324
+ | `oc_sk_…` | OpenCode-Go | Minted only by OpenCode since the 2026-10 key rotation — definitive |
325
+ | `sk-…` | OpenCode-Go or CommandCode | `sk-` is shared by both providers; Saros infers OpenCode-Go unless an explicit `provider` is set |
326
+ | `user_…` | CommandCode | Always detected as CommandCode |
308
327
 
309
328
  **YAML:**
310
329
  ```yaml
311
330
  keys:
312
331
  - label: my-account
313
- key: sk-your-key-here...
332
+ key: sk-your-key-here... # opencode-go (default inference)
333
+ - label: cc-account
334
+ key: user_your-token-here... # commandcode (inferred from prefix)
335
+ - label: cc-console-key
336
+ key: sk-your-console-key-here... # ambiguous prefix → set provider explicitly
337
+ provider: commandcode
338
+ ```
339
+
340
+ 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.
341
+
342
+ **Per-provider upstream override (optional):**
343
+
344
+ ```yaml
345
+ upstreams:
346
+ commandcode: https://api.commandcode.ai # default
347
+ opencode-go: https://opencode.ai # default
314
348
  ```
315
349
 
316
350
  **Environment variable:**
317
351
  ```bash
318
- OPENCODE_GO_KEYS="account1:sk-xxx,account2:sk-yyy"
352
+ OPENCODE_GO_KEYS="account1:sk-xxx,cc:user_yyy"
353
+ ```
354
+
355
+ #### How multi-provider routing works
356
+
357
+ - Clients always speak the canonical OpenCode-Go shapes (`/zen/go/v1/...` or the `/v1/...` alias).
358
+ - 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.
359
+ - 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.
360
+ - Synced harness configs may list provider-specific models as `model@commandcode`; the suffix selects the provider and is stripped before forwarding.
361
+ - The `/health` endpoint reports per-provider key counts under `providers`.
362
+ - OpenCode-Go requires a stable per-conversation session id (`x-opencode-session`, used for routing and prompt caching). Saros forwards a client-supplied value untouched and derives one from the conversation (model + first user turn) when the client sends none — harnesses that only attach the header on some request paths would otherwise get `400 MissingSessionID`.
363
+ - Usage-based weighted rotation applies to providers with a queryable usage API (OpenCode-Go). CommandCode keys participate in rotation without usage data, but their token consumption is tracked per key and shown by `saros-proxy usage` (see [Token Accounting](#token-accounting)).
364
+
365
+ #### Smoke test (key identification)
366
+
367
+ `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:
368
+
369
+ ```bash
370
+ CC_KEY=user_your-token npx tsx scripts/live-identify-check.ts
319
371
  ```
320
372
 
321
373
  ### API Key Encryption
@@ -403,11 +455,8 @@ saros-proxy status
403
455
  # Stop it
404
456
  saros-proxy stop
405
457
 
406
- # Sync bundled models to all enabled harnesses
407
- saros-proxy sync-models
408
-
409
- # Add harnesses to the model-sync selection (omp|ohmypi, pi, oc|opencode)
410
- saros-proxy configharness omp pi oc
458
+ # Add harnesses to the model-sync selection (omp|ohmypi, pi, oc|opencode, dsh)
459
+ saros-proxy configharness omp pi oc dsh
411
460
 
412
461
  # Remove a harness, or disable sync entirely
413
462
  saros-proxy configharness --remove pi
@@ -422,6 +471,9 @@ saros-proxy probe [model-id]
422
471
  # Probe all models
423
472
  saros-proxy probe
424
473
 
474
+ # Show per-key quota usage, token totals and most-used models
475
+ saros-proxy usage
476
+
425
477
  # Install autostart (Windows: VBS script or Registry)
426
478
  saros-proxy autostart install [--port <port>] [--method vbs|registry|auto]
427
479
 
@@ -432,26 +484,23 @@ saros-proxy autostart uninstall [--method vbs|registry|auto]
432
484
  saros-proxy autostart status [--method vbs|registry|auto]
433
485
  ```
434
486
 
435
- The `start` command automatically syncs model definitions to all enabled harnesses (see [Multi-Harness Integration](#multi-harness-integration-pi--oh-my-pi)).
487
+ The `start` command automatically syncs model definitions to all enabled harnesses (see [Multi-Harness Integration](#multi-harness-integration-pi-oh-my-pi--dsh)).
436
488
 
437
489
  ### Model Sync Commands
438
490
 
439
- Saros keeps your harness configs in sync with the upstream API. Which harnesses are synced is opt-in via the harness selection (see [Multi-Harness Integration](#multi-harness-integration-pi--oh-my-pi)).
491
+ Saros keeps your harness configs in sync with the provider APIs. Which harnesses are synced is opt-in via the harness selection (see [Multi-Harness Integration](#multi-harness-integration-pi-oh-my-pi--dsh)).
440
492
 
441
493
  ```bash
442
494
  # List which harnesses are enabled for model sync
443
495
  saros-proxy configharness
444
496
 
445
- # Add oh-my-pi, pi, and OpenCode to the sync selection (additive)
446
- saros-proxy configharness omp pi oc
497
+ # Add oh-my-pi, pi, OpenCode, and dsh to the sync selection (additive)
498
+ saros-proxy configharness omp pi oc dsh
447
499
 
448
500
  # Remove a harness, or disable sync entirely
449
501
  saros-proxy configharness --remove pi
450
502
  saros-proxy configharness --clear
451
503
 
452
- # Sync bundled models to all enabled harnesses
453
- saros-proxy sync-models
454
-
455
504
  # Sync the live model list from upstream into all enabled harnesses
456
505
  saros-proxy sync-upstream
457
506
 
@@ -460,11 +509,12 @@ saros-proxy probe [model-id]
460
509
 
461
510
  # Probe all configured models
462
511
  saros-proxy probe
463
- ```
464
512
 
465
- `sync-models` writes the bundled model definitions to each enabled harness's provider config.
513
+ # Show per-key quota usage, token totals and most-used models
514
+ saros-proxy usage
515
+ ```
466
516
  `sync-upstream` fetches the live model list from upstream and writes it to each enabled harness, with metadata from models.dev.
467
- Both only touch `providers["saros-proxy"].models` in the target configs and skip harnesses whose config file does not exist.
517
+ It only touches `providers["saros-proxy"].models` in the target configs and skips harnesses whose config file does not exist.
468
518
  `probe` tests each model's liveness, reasoning, and tool-calling capabilities via the proxy.
469
519
 
470
520
  **Daemon config path:** By default the daemon looks for `config.yaml` at:
@@ -547,21 +597,22 @@ Select the proxy provider in OpenCode's model picker, or set it as default:
547
597
 
548
598
  ---
549
599
 
550
- ## Multi-Harness Integration (pi & oh-my-pi)
600
+ ## Multi-Harness Integration (pi, oh-my-pi & dsh)
551
601
 
552
- Besides OpenCode, Saros can keep its provider + model config in sync for the `pi` and `oh-my-pi` (`omp`) harnesses. Both belong to the pi-coding-agent family but use different config files:
602
+ Besides OpenCode, Saros can keep its provider + model config in sync for the `pi`, `oh-my-pi` (`omp`), and DeepSeek Harness (`dsh`) harnesses. They use different config files:
553
603
 
554
604
  | Harness | Config file | Format |
555
605
  |---|---|---|
556
606
  | OpenCode | `~/.config/opencode/opencode.json[.jsonc]` | JSON/JSONC |
557
607
  | pi | `~/.pi/agent/models.json` | JSON |
558
608
  | oh-my-pi (`omp`) | `~/.omp/agent/models.yml` | YAML |
609
+ | DeepSeek Harness (`dsh`) | `~/.dsh/profiles/web/cordis.patch.yml` | YAML (patch layer) |
559
610
 
560
611
  Sync is opt-in per harness, configured with the `configharness` command. The selection is stored in `~/.config/saros/harnesses.json`:
561
612
 
562
613
  ```bash
563
- # Add omp + pi + opencode to the sync selection (additive)
564
- saros-proxy configharness omp pi oc
614
+ # Add omp + pi + opencode + dsh to the sync selection (additive)
615
+ saros-proxy configharness omp pi oc dsh
565
616
 
566
617
  # Remove a harness, or disable sync entirely
567
618
  saros-proxy configharness --remove pi
@@ -570,7 +621,7 @@ saros-proxy configharness --clear
570
621
  # See the current selection
571
622
  saros-proxy configharness
572
623
 
573
- # Accepted names: omp | ohmypi, pi, oc | opencode
624
+ # Accepted names: omp | ohmypi, pi, oc | opencode, dsh
574
625
  ```
575
626
 
576
627
  `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.
@@ -582,9 +633,9 @@ Behavior:
582
633
  - Sync never creates a harness config: harnesses whose config file is missing are skipped.
583
634
  - Only `providers["saros-proxy"].models` is replaced; all other providers, fields, and settings are preserved, and a `<file>.backup` is created before the first write.
584
635
 
585
- The model list written to each harness comes from the live upstream catalog enriched with models.dev metadata (falling back to bundled models when offline), so pi/omp stay current alongside OpenCode.
636
+ The model list written to each harness comes from the live provider catalogs (opencode-go) enriched with models.dev metadata, merged with any CommandCode-only models — falling back to bundled models when offline — so every harness stays current alongside OpenCode.
586
637
 
587
- > **Why a static model list?** Both harnesses use a static `models` list on purpose. `pi` has no `/v1/models` discovery for custom providers, and `oh-my-pi`'s discovery cannot recover reasoning/context/output metadata for OpenCode-Go model IDs — dynamic discovery would silently break thinking-level (`:max`/`:high`) role configs in `~/.omp/agent/config.yml`.
638
+ > **Why a static model list?** The harnesses use a static `models` list on purpose. `pi` has no `/v1/models` discovery for custom providers, and `oh-my-pi`'s discovery cannot recover reasoning/context/output metadata for provider model IDs. `dsh` replaces only `providers["saros-proxy"].models` in its patch layer (`cordis.patch.yml`), which dsh rewrites at every boot — a static, explicitly-managed list is the only reliable source. Dynamic discovery would silently break thinking-level (`:max`/`:high`) role configs.
588
639
 
589
640
  ---
590
641
 
@@ -674,6 +725,7 @@ src/
674
725
  config.ts — Config loading from YAML, env vars, CLI
675
726
  constants.ts — All defaults and configuration values
676
727
  logger.ts — Structured logging with Pino + key masking
728
+ providers/ — Multi-provider key abstraction (KeyProvider, adapters, identifyKey)
677
729
  models-fetcher.ts — Upstream model list fetching + caching
678
730
  models-sync.ts — Auto-sync models from upstream to opencode config
679
731
  cli/
File without changes
File without changes
File without changes
File without changes
@@ -250,7 +250,11 @@ export async function daemonStart(port, configPath) {
250
250
  env.OPENCODE_GO_ENCRYPTION_KEY = encKey;
251
251
  // Capture child stderr (also appended to daemon.log) so startup failures
252
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.
253
256
  const logStream = createWriteStream(DAEMON_LOG, { flags: 'a' });
257
+ logStream.on('error', () => { });
254
258
  let stderrBuf = '';
255
259
  const child = spawn('node', args, {
256
260
  cwd: PACKAGE_ROOT,
@@ -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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"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * dsh-config.ts — DeepSeek Harness (dsh) sync target.
3
+ *
4
+ * Updates the saros-proxy provider's model list inside the dsh profile's
5
+ * patch layer (~/.dsh/profiles/web/cordis.patch.yml), row id `llm-pi-ai`.
6
+ * dsh model entries use the pi/omp field names plus a `reasoningEfforts`
7
+ * map ({ 'off': null, high: 'high', … }) instead of pi/omp's `thinking`
8
+ * object — the transformer here converts the canonical entries.
9
+ *
10
+ * Only `providers["saros-proxy"].models` is replaced; every other provider
11
+ * row (commandcode, commandcode-anthropic, agent-default-model, MCP inserts)
12
+ * and all user fields are preserved. Leading comment lines are re-emitted
13
+ * verbatim (the patch file documents its `!!js` allowance in a comment).
14
+ * cordis.yml is NEVER touched (dsh rewrites it empty at every boot).
15
+ */
16
+ import { type PiOmpModel } from './harness-models.js';
17
+ import type { OpencodeConfigResult } from './opencode-config.js';
18
+ /** Default dsh patch layer path for the web profile. */
19
+ export declare function getDefaultDshConfigPath(): string;
20
+ /** Convert a pi/omp model entry into the dsh patch entry shape. */
21
+ export declare function toDshModel(model: PiOmpModel): Record<string, unknown>;
22
+ /**
23
+ * Sync the saros-proxy provider model list into the dsh patch layer.
24
+ *
25
+ * @param modelsMap — Canonical model map (id → opencode-shaped entry)
26
+ * @param port — Proxy port (unused today; kept for harness-sync parity)
27
+ * @param options.configPath — Explicit config path (for testing)
28
+ * @returns Result with success status and path
29
+ */
30
+ export declare function syncModelsToDshConfig(modelsMap: Record<string, unknown>, port: number, options?: {
31
+ configPath?: string;
32
+ }): OpencodeConfigResult;
@@ -0,0 +1,122 @@
1
+ /**
2
+ * dsh-config.ts — DeepSeek Harness (dsh) sync target.
3
+ *
4
+ * Updates the saros-proxy provider's model list inside the dsh profile's
5
+ * patch layer (~/.dsh/profiles/web/cordis.patch.yml), row id `llm-pi-ai`.
6
+ * dsh model entries use the pi/omp field names plus a `reasoningEfforts`
7
+ * map ({ 'off': null, high: 'high', … }) instead of pi/omp's `thinking`
8
+ * object — the transformer here converts the canonical entries.
9
+ *
10
+ * Only `providers["saros-proxy"].models` is replaced; every other provider
11
+ * row (commandcode, commandcode-anthropic, agent-default-model, MCP inserts)
12
+ * and all user fields are preserved. Leading comment lines are re-emitted
13
+ * verbatim (the patch file documents its `!!js` allowance in a comment).
14
+ * cordis.yml is NEVER touched (dsh rewrites it empty at every boot).
15
+ */
16
+ import { existsSync, readFileSync, writeFileSync, copyFileSync } from 'node:fs';
17
+ import { join } from 'node:path';
18
+ import { homedir } from 'node:os';
19
+ import { parse as parseYaml, stringify as stringifyYaml } from 'yaml';
20
+ import { toPiOmpModelArray } from './harness-models.js';
21
+ /** Default dsh patch layer path for the web profile. */
22
+ export function getDefaultDshConfigPath() {
23
+ return join(homedir(), '.dsh', 'profiles', 'web', 'cordis.patch.yml');
24
+ }
25
+ const DSH_ROW_ID = 'llm-pi-ai';
26
+ const SAROS_PROVIDER_KEY = 'saros-proxy';
27
+ /** Convert a pi/omp model entry into the dsh patch entry shape. */
28
+ export function toDshModel(model) {
29
+ const entry = {
30
+ id: model.id,
31
+ name: model.name,
32
+ input: model.input,
33
+ contextWindow: model.contextWindow,
34
+ maxTokens: model.maxTokens,
35
+ };
36
+ if (model.thinking && model.thinking.efforts.length > 0) {
37
+ const efforts = { off: null };
38
+ for (const effort of model.thinking.efforts) {
39
+ efforts[effort] = effort;
40
+ }
41
+ entry.reasoningEfforts = efforts;
42
+ }
43
+ if (model.cost) {
44
+ entry.cost = model.cost;
45
+ }
46
+ return entry;
47
+ }
48
+ /**
49
+ * Split leading comment lines from the raw YAML text so they can be
50
+ * re-emitted after stringify (the yaml package drops comments).
51
+ */
52
+ function splitLeadingComments(raw) {
53
+ const lines = raw.split('\n');
54
+ const comments = [];
55
+ let i = 0;
56
+ while (i < lines.length && (lines[i].trimStart().startsWith('#') || lines[i].trim() === '')) {
57
+ comments.push(lines[i]);
58
+ i++;
59
+ }
60
+ return { comments: comments.join('\n'), body: lines.slice(i).join('\n') };
61
+ }
62
+ /**
63
+ * Sync the saros-proxy provider model list into the dsh patch layer.
64
+ *
65
+ * @param modelsMap — Canonical model map (id → opencode-shaped entry)
66
+ * @param port — Proxy port (unused today; kept for harness-sync parity)
67
+ * @param options.configPath — Explicit config path (for testing)
68
+ * @returns Result with success status and path
69
+ */
70
+ export function syncModelsToDshConfig(modelsMap, port, options = {}) {
71
+ void port;
72
+ const configPath = options.configPath ?? getDefaultDshConfigPath();
73
+ if (!existsSync(configPath)) {
74
+ return { success: false, error: 'config not found at ' + configPath };
75
+ }
76
+ try {
77
+ const raw = readFileSync(configPath, 'utf-8');
78
+ const { comments, body } = splitLeadingComments(raw);
79
+ let doc;
80
+ try {
81
+ doc = parseYaml(body);
82
+ }
83
+ catch {
84
+ return { success: false, path: configPath, error: 'dsh patch contains invalid YAML' };
85
+ }
86
+ if (!Array.isArray(doc)) {
87
+ return { success: false, path: configPath, error: 'dsh patch is not a top-level array' };
88
+ }
89
+ // Locate the llm-pi-ai row and its saros-proxy provider entry.
90
+ const row = doc.find((r) => r && typeof r === 'object' && !Array.isArray(r) &&
91
+ r.id === DSH_ROW_ID);
92
+ if (!row) {
93
+ return { success: false, path: configPath, error: `dsh patch has no ${DSH_ROW_ID} row` };
94
+ }
95
+ const config = row.config;
96
+ const providers = config?.providers;
97
+ const provider = providers?.[SAROS_PROVIDER_KEY];
98
+ if (!provider) {
99
+ return {
100
+ success: false,
101
+ path: configPath,
102
+ error: `dsh patch ${DSH_ROW_ID} row has no ${SAROS_PROVIDER_KEY} provider`,
103
+ };
104
+ }
105
+ // Replace ONLY the models key.
106
+ provider.models = toPiOmpModelArray(modelsMap).map(toDshModel);
107
+ const backupPath = configPath + '.backup';
108
+ if (existsSync(configPath)) {
109
+ copyFileSync(configPath, backupPath);
110
+ }
111
+ writeFileSync(configPath, comments ? comments + '\n' + stringifyYaml(doc) : stringifyYaml(doc), 'utf-8');
112
+ return { success: true, path: configPath, created: false };
113
+ }
114
+ catch (err) {
115
+ return {
116
+ success: false,
117
+ path: configPath,
118
+ error: err instanceof Error ? err.message : String(err),
119
+ };
120
+ }
121
+ }
122
+ //# sourceMappingURL=dsh-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dsh-config.js","sourceRoot":"","sources":["../../src/cli/dsh-config.ts"],"names":[],"mappings":"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"}
@@ -8,6 +8,12 @@
8
8
  * upstream + models.dev metadata (falling back to bundled models.json).
9
9
  */
10
10
  import type { ProxyConfig } from '../config.js';
11
+ /**
12
+ * Suffix for provider-specific model ids in synced harness configs.
13
+ * Commandcode-only models (claude-*, vendor/model) are exposed to harnesses
14
+ * as `<id>@commandcode`; the proxy strips the suffix on the way upstream.
15
+ */
16
+ export declare const PROVIDER_MODEL_SUFFIX = "@";
11
17
  export interface PiOmpModel {
12
18
  id: string;
13
19
  name: string;
@@ -21,6 +27,11 @@ export interface PiOmpModel {
21
27
  cacheRead: number;
22
28
  cacheWrite: number;
23
29
  };
30
+ /** Explicit thinking surface (pi/omp schema). Absent → harness infers one. */
31
+ thinking?: {
32
+ mode: 'effort';
33
+ efforts: string[];
34
+ };
24
35
  }
25
36
  /**
26
37
  * Transform one canonical (opencode-shaped) model entry into the
@@ -30,12 +41,25 @@ export interface PiOmpModel {
30
41
  export declare function toPiOmpModel(entry: Record<string, unknown>): PiOmpModel;
31
42
  /** Transform the canonical model map into a pi/omp `models` array. */
32
43
  export declare function toPiOmpModelArray(models: Record<string, unknown>): PiOmpModel[];
44
+ /**
45
+ * Normalize a provider model id to its bare name for cross-provider
46
+ * matching: 'deepseek/deepseek-v4-flash' → 'deepseek-v4-flash';
47
+ * 'glm-5' → 'glm-5'. Case- and separator-insensitive.
48
+ */
49
+ export declare function bareModelName(modelId: string): string;
50
+ /**
51
+ * Annotate a display name with how many keys can serve the model,
52
+ * e.g. "DeepSeek V4 Flash (3)". Communicates rotation width: '(3)' rotates
53
+ * across 3 accounts (possibly cross-provider), '(1)' is a single key.
54
+ */
55
+ export declare function annotateName(name: string, keyCount: number): string;
33
56
  /**
34
57
  * Build the canonical model map (id → opencode-shaped entry).
35
58
  *
36
59
  * Live path (config provided, not offline): fetch upstream model IDs and
37
- * enrich each with models.dev metadata via buildMinimalStub. Falls back to
38
- * the bundled models.json when the upstream fetch yields nothing.
60
+ * enrich each with models.dev metadata via buildMinimalStub, then append
61
+ * provider-specific catalog models (@commandcode etc.). Falls back to the
62
+ * bundled models.json when the upstream fetch yields nothing.
39
63
  * Offline path (or no config): bundled models.json only.
40
64
  */
41
65
  export declare function buildCanonicalModels(config?: ProxyConfig, opts?: {