saros-proxy 0.7.4 → 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.
Files changed (67) hide show
  1. package/README.md +74 -44
  2. package/dist/cli/daemon.js +4 -0
  3. package/dist/cli/daemon.js.map +1 -1
  4. package/dist/cli/dsh-config.d.ts +32 -0
  5. package/dist/cli/dsh-config.js +122 -0
  6. package/dist/cli/dsh-config.js.map +1 -0
  7. package/dist/cli/harness-models.d.ts +26 -2
  8. package/dist/cli/harness-models.js +192 -2
  9. package/dist/cli/harness-models.js.map +1 -1
  10. package/dist/cli/harness-sync.d.ts +3 -6
  11. package/dist/cli/harness-sync.js +14 -7
  12. package/dist/cli/harness-sync.js.map +1 -1
  13. package/dist/cli/help.js +2 -2
  14. package/dist/cli/omp-config.js +11 -1
  15. package/dist/cli/omp-config.js.map +1 -1
  16. package/dist/cli/overview.js +2 -1
  17. package/dist/cli/overview.js.map +1 -1
  18. package/dist/cli/pi-config.js +11 -1
  19. package/dist/cli/pi-config.js.map +1 -1
  20. package/dist/cli/setup.d.ts +6 -10
  21. package/dist/cli/setup.js +100 -232
  22. package/dist/cli/setup.js.map +1 -1
  23. package/dist/cli/ui.d.ts +0 -1
  24. package/dist/cli/ui.js +0 -16
  25. package/dist/cli/ui.js.map +1 -1
  26. package/dist/cli/usage.d.ts +12 -0
  27. package/dist/cli/usage.js +116 -0
  28. package/dist/cli/usage.js.map +1 -0
  29. package/dist/config.d.ts +13 -17
  30. package/dist/config.js +29 -78
  31. package/dist/config.js.map +1 -1
  32. package/dist/constants.d.ts +6 -5
  33. package/dist/constants.js +10 -5
  34. package/dist/constants.js.map +1 -1
  35. package/dist/index.js +7 -25
  36. package/dist/index.js.map +1 -1
  37. package/dist/model-stats.d.ts +20 -0
  38. package/dist/model-stats.js +135 -0
  39. package/dist/model-stats.js.map +1 -0
  40. package/dist/providers/commandcode.d.ts +17 -0
  41. package/dist/providers/commandcode.js +232 -0
  42. package/dist/providers/commandcode.js.map +1 -0
  43. package/dist/providers/index.d.ts +43 -0
  44. package/dist/providers/index.js +75 -0
  45. package/dist/providers/index.js.map +1 -0
  46. package/dist/providers/infer.d.ts +23 -0
  47. package/dist/providers/infer.js +13 -0
  48. package/dist/providers/infer.js.map +1 -0
  49. package/dist/providers/opencode-go.d.ts +4 -0
  50. package/dist/providers/opencode-go.js +179 -0
  51. package/dist/providers/opencode-go.js.map +1 -0
  52. package/dist/providers/types.d.ts +118 -0
  53. package/dist/providers/types.js +10 -0
  54. package/dist/providers/types.js.map +1 -0
  55. package/dist/proxy-logic.d.ts +46 -22
  56. package/dist/proxy-logic.js +146 -106
  57. package/dist/proxy-logic.js.map +1 -1
  58. package/dist/proxy.d.ts +20 -2
  59. package/dist/proxy.js +231 -57
  60. package/dist/proxy.js.map +1 -1
  61. package/dist/usage-client.d.ts +41 -0
  62. package/dist/usage-client.js +124 -0
  63. package/dist/usage-client.js.map +1 -0
  64. package/dist/validation.d.ts +5 -5
  65. package/dist/validation.js +7 -9
  66. package/dist/validation.js.map +1 -1
  67. package/package.json +6 -2
@@ -18,10 +18,13 @@ export function createProxyState(keys, options) {
18
18
  keys: keys.map((k) => ({
19
19
  label: k.label,
20
20
  key: k.key,
21
+ provider: k.provider ?? 'opencode-go',
21
22
  enabled: true,
22
23
  consecutiveFailures: 0,
23
24
  lastUsed: null,
24
25
  disabledAt: null,
26
+ usagePercent: null,
27
+ currentWeight: 0,
25
28
  })),
26
29
  currentIndex: 0,
27
30
  circuitBreakerThreshold: options?.circuitBreakerThreshold ?? 3,
@@ -37,7 +40,7 @@ export function createProxyState(keys, options) {
37
40
  * (Keeps mutation paths through markKeyFailed / markKeySucceeded.)
38
41
  */
39
42
  function toSnapshot(key) {
40
- return { label: key.label, key: key.key };
43
+ return { label: key.label, key: key.key, provider: key.provider };
41
44
  }
42
45
  /**
43
46
  * Internal: check whether a key is available (enabled & under threshold).
@@ -60,86 +63,6 @@ function isKeyAvailable(state, key) {
60
63
  }
61
64
  return false;
62
65
  }
63
- /**
64
- * Check if a key is available based on usage data.
65
- * A key is unavailable if ANY of its usage windows >= threshold.
66
- *
67
- * @param usage - The usage data for this key's account (null = no data = available)
68
- * @param threshold - The usage threshold (1-100)
69
- * @returns true if the key is available (usage below threshold or no data)
70
- */
71
- function isKeyAvailableByUsage(usage, threshold) {
72
- if (usage === null)
73
- return true; // no data = don't block
74
- return ((usage.rolling === null || usage.rolling < threshold) &&
75
- (usage.weekly === null || usage.weekly < threshold) &&
76
- (usage.monthly === null || usage.monthly < threshold));
77
- }
78
- /**
79
- * Internal: when all circuit-breaker-available keys are over the usage
80
- * threshold, fall back to the key with the lowest maximum usage across
81
- * all windows. If a key has no usage data, it is preferred immediately.
82
- */
83
- function findFallbackKey(state, usageMap) {
84
- let best = null;
85
- let bestMaxUsage = Infinity;
86
- for (const key of state.keys) {
87
- if (!isKeyAvailable(state, key))
88
- continue;
89
- const usage = usageMap.get(key.label);
90
- if (!usage) {
91
- // No usage data = best possible – take it immediately
92
- key.lastUsed = Date.now();
93
- return toSnapshot(key);
94
- }
95
- const maxUsage = Math.max(usage.rolling ?? 0, usage.weekly ?? 0, usage.monthly ?? 0);
96
- if (maxUsage < bestMaxUsage) {
97
- bestMaxUsage = maxUsage;
98
- best = key;
99
- }
100
- }
101
- if (best) {
102
- best.lastUsed = Date.now();
103
- return toSnapshot(best);
104
- }
105
- return null;
106
- }
107
- /**
108
- * Internal: apply usage-gating to an exclusion set, then attempt to find
109
- * the next available key. Falls back to findFallbackKey if all
110
- * circuit-breaker-available keys are over the usage threshold.
111
- *
112
- * Shared by selectKeyForRequest and failoverRequest — extracts the ~90%
113
- * identical usage-gating logic that was previously copy-pasted (PR-5).
114
- *
115
- * @param excludeLabels Mutable set; usage-over-threshold labels are added.
116
- * @returns A key snapshot, or null if no key is available.
117
- */
118
- function selectKeyWithUsageFallback(state, excludeLabels, options) {
119
- // Exclude keys whose account usage exceeds the threshold
120
- if (options?.usageMap && options?.usageThreshold !== undefined) {
121
- const threshold = options.usageThreshold;
122
- for (const key of state.keys) {
123
- const usage = options.usageMap.get(key.label) ?? null;
124
- if (!isKeyAvailableByUsage(usage, threshold)) {
125
- excludeLabels.add(key.label);
126
- }
127
- }
128
- }
129
- let snapshot = findNextKey(state, excludeLabels);
130
- // Fallback: all circuit-breaker-available keys are over threshold
131
- if (!snapshot && options?.usageMap) {
132
- const fallback = findFallbackKey(state, options.usageMap);
133
- if (fallback) {
134
- const idx = state.keys.findIndex((k) => k.label === fallback.label);
135
- if (idx !== -1) {
136
- state.currentIndex = (idx + 1) % state.keys.length;
137
- }
138
- snapshot = fallback;
139
- }
140
- }
141
- return snapshot;
142
- }
143
66
  /**
144
67
  * Internal: return the set of key labels that are currently *in use* by
145
68
  * active requests (C4 double-booking avoidance).
@@ -163,36 +86,128 @@ function buildBookedLabels(state) {
163
86
  * Internal: find the next available key, skipping:
164
87
  * - disabled / under-cooldown keys
165
88
  * - labels in `excludeLabels`
166
- * Advances the round-robin index and returns a read-only snapshot.
89
+ *
90
+ * Selection strategy (smooth weighted round-robin, nginx-style):
91
+ * - When usage data is known for the candidates, keys with more remaining
92
+ * quota are proportionally preferred. E.g. key X at 30% used and key Y at
93
+ * 70% used receive ~70%/30% of requests — exact proportions over a cycle,
94
+ * not random sampling.
95
+ * - Without usage data (or when every candidate is exhausted), falls back to
96
+ * plain round-robin ordering.
167
97
  */
168
- function findNextKey(state, excludeLabels) {
98
+ function findNextKey(state, excludeLabels, providerFilter) {
169
99
  const n = state.keys.length;
170
100
  if (n === 0)
171
101
  return null;
102
+ const candidates = [];
172
103
  for (let i = 0; i < n; i++) {
173
- const idx = (state.currentIndex + i) % n;
174
- const key = state.keys[idx];
104
+ const key = state.keys[(state.currentIndex + i) % n];
175
105
  if (excludeLabels.has(key.label))
176
106
  continue;
107
+ if (providerFilter && !providerFilter(key.provider))
108
+ continue;
177
109
  if (!isKeyAvailable(state, key))
178
110
  continue;
179
- // Advance past the selected key
180
- state.currentIndex = (idx + 1) % n;
181
- key.lastUsed = Date.now();
182
- return toSnapshot(key);
111
+ candidates.push(key);
112
+ }
113
+ if (candidates.length === 0)
114
+ return null;
115
+ const picked = pickWeighted(state, candidates);
116
+ state.currentIndex = (state.keys.indexOf(picked) + 1) % n;
117
+ picked.lastUsed = Date.now();
118
+ return toSnapshot(picked);
119
+ }
120
+ /**
121
+ * Internal: smooth weighted round-robin over the candidates.
122
+ * Falls back to the first candidate (round-robin order) when usage data is
123
+ * missing for any candidate or when no candidate has remaining capacity.
124
+ */
125
+ function pickWeighted(state, candidates) {
126
+ const known = candidates.filter((k) => k.usagePercent !== null);
127
+ if (known.length === 0)
128
+ return candidates[0];
129
+ let weights = candidates.map((k) => Math.max(0, 100 - (k.usagePercent ?? 0)));
130
+ // Keys missing usage data get the median of the known weights — neutral,
131
+ // so one flaky key no longer disables weighting for the whole pool.
132
+ const sorted = known.map((k) => 100 - (k.usagePercent ?? 0)).sort((a, b) => a - b);
133
+ const median = sorted[Math.floor(sorted.length / 2)] ?? 0;
134
+ weights = weights.map((w, i) => (candidates[i].usagePercent === null ? median : w));
135
+ const totalWeight = weights.reduce((sum, w) => sum + w, 0);
136
+ if (totalWeight === 0)
137
+ return candidates[0];
138
+ let best = candidates[0];
139
+ let bestWeight = -Infinity;
140
+ for (let i = 0; i < candidates.length; i++) {
141
+ candidates[i].currentWeight += weights[i];
142
+ if (candidates[i].currentWeight > bestWeight) {
143
+ bestWeight = candidates[i].currentWeight;
144
+ best = candidates[i];
145
+ }
146
+ }
147
+ best.currentWeight -= totalWeight;
148
+ return best;
149
+ }
150
+ /**
151
+ * Update per-key usage data (worst-window used percent, 0-100).
152
+ * Keys absent from the map keep their previous value.
153
+ */
154
+ export function updateKeyUsage(state, usage) {
155
+ for (const key of state.keys) {
156
+ const percent = usage.get(key.label);
157
+ if (typeof percent === 'number')
158
+ key.usagePercent = percent;
183
159
  }
184
- return null;
185
160
  }
186
161
  // ---------------------------------------------------------------------------
187
162
  // Request-Scoped Key Tracking (C4)
188
163
  // ---------------------------------------------------------------------------
164
+ /** Parse a trailing '@provider' suffix from a model id ('x@cc' → 'cc'). */
165
+ function parseModelSuffix(modelId) {
166
+ if (!modelId)
167
+ return null;
168
+ const at = modelId.lastIndexOf('@');
169
+ if (at <= 0 || at === modelId.length - 1)
170
+ return null;
171
+ return modelId.slice(at + 1);
172
+ }
173
+ /**
174
+ * Resolve the provider-preference predicate for a request.
175
+ *
176
+ * Rule: exclude providers whose verdict is definitively 'no' for the model
177
+ * (e.g. claude-* on opencode-go). Everything else — 'yes' AND 'maybe' —
178
+ * serves the request, so genuinely shared models rotate across ALL their
179
+ * keys regardless of which catalog loaded first. When no provider says 'no'
180
+ * the filter is undefined (legacy any-key behavior).
181
+ */
182
+ function makeProviderFilter(state, modelId) {
183
+ if (!modelId)
184
+ return undefined;
185
+ const resolver = state.affinityResolver;
186
+ if (!resolver)
187
+ return undefined;
188
+ const excluded = new Set();
189
+ for (const key of state.keys) {
190
+ if (excluded.has(key.provider))
191
+ continue;
192
+ if (resolver(key.provider, modelId) === 'no') {
193
+ excluded.add(key.provider);
194
+ }
195
+ }
196
+ if (excluded.size === 0)
197
+ return undefined;
198
+ return (provider) => !excluded.has(provider);
199
+ }
189
200
  /**
190
201
  * Obtain a key for a new (or in-flight) request.
191
202
  * Creates a RequestContext if one does not already exist for this requestId.
192
203
  * Skips keys that have already been tried for this request AND keys booked
193
204
  * by any other active request.
205
+ *
206
+ * When a modelId is supplied and some providers claim it (modelAffinity
207
+ * 'yes'), keys of other providers are only used after the preferred pool is
208
+ * exhausted (including its booked-share tier).
194
209
  */
195
- export function selectKeyForRequest(state, requestId, options) {
210
+ export function selectKeyForRequest(state, requestId, modelId) {
196
211
  // If context already exists, return the already-assigned current key
197
212
  const existing = state.activeRequests.get(requestId);
198
213
  if (existing) {
@@ -201,18 +216,27 @@ export function selectKeyForRequest(state, requestId, options) {
201
216
  // Create new context and pick a fresh key
202
217
  const ctx = { requestId, triedKeys: [], currentKey: null };
203
218
  state.activeRequests.set(requestId, ctx);
219
+ const providerFilter = makeProviderFilter(state, modelId);
220
+ ctx.providerFilter = providerFilter;
221
+ ctx.pinned = Boolean(parseModelSuffix(modelId));
204
222
  // Tier 1: prefer a key not booked by another active request (spread load)
205
223
  const excludeLabels = new Set(ctx.triedKeys);
206
224
  const booked = buildBookedLabels(state);
207
225
  for (const label of booked) {
208
226
  excludeLabels.add(label);
209
227
  }
210
- let snapshot = selectKeyWithUsageFallback(state, excludeLabels, options);
211
- // Tier 2: all healthy keys are booked — share one via round-robin.
212
- // Better to share a key than return 503 when concurrent requests
213
- // outnumber the key pool.
228
+ let snapshot = findNextKey(state, excludeLabels, providerFilter);
229
+ // Tier 2: all healthy preferred keys are booked — share one via
230
+ // round-robin. Better to share a key than return 503 when concurrent
231
+ // requests outnumber the key pool.
214
232
  if (!snapshot) {
215
- snapshot = selectKeyWithUsageFallback(state, new Set(ctx.triedKeys), options);
233
+ snapshot = findNextKey(state, new Set(ctx.triedKeys), providerFilter);
234
+ }
235
+ // Tier 3: preferred providers exhausted → fall back to any provider
236
+ // (pinned requests exempt: a @provider suffix or messages-only model
237
+ // cannot be served by other providers at all).
238
+ if (!snapshot && providerFilter && !ctx.pinned) {
239
+ snapshot = findNextKey(state, new Set(ctx.triedKeys));
216
240
  }
217
241
  ctx.currentKey = snapshot;
218
242
  return snapshot;
@@ -223,7 +247,7 @@ export function selectKeyForRequest(state, requestId, options) {
223
247
  * appropriate ErrorType; this function only manages the request-context
224
248
  * tracking (adds the current key to triedKeys).
225
249
  */
226
- export function failoverRequest(state, requestId, options) {
250
+ export function failoverRequest(state, requestId) {
227
251
  const ctx = state.activeRequests.get(requestId);
228
252
  if (!ctx)
229
253
  return null;
@@ -231,18 +255,25 @@ export function failoverRequest(state, requestId, options) {
231
255
  if (ctx.currentKey) {
232
256
  ctx.triedKeys.push(ctx.currentKey.label);
233
257
  }
234
- // Tier 1: prefer a key not tried AND not booked by another request
258
+ // The provider preference was fixed when the request context was created;
259
+ // failover re-applies it so cross-provider failover can't pick a key that
260
+ // cannot serve the (possibly rewritten) model id.
261
+ const filter = ctx.providerFilter;
235
262
  const excludeLabels = new Set(ctx.triedKeys);
236
263
  const booked = buildBookedLabels(state);
237
264
  for (const label of booked) {
238
265
  excludeLabels.add(label);
239
266
  }
240
- let snapshot = selectKeyWithUsageFallback(state, excludeLabels, options);
241
- // Tier 2: all remaining healthy keys are booked — share one.
267
+ let snapshot = findNextKey(state, excludeLabels, filter);
268
+ // Tier 2: all remaining healthy preferred keys are booked — share one.
242
269
  // Still respects per-request triedKeys (don't re-use a key this
243
270
  // request already failed on).
244
271
  if (!snapshot) {
245
- snapshot = selectKeyWithUsageFallback(state, new Set(ctx.triedKeys), options);
272
+ snapshot = findNextKey(state, new Set(ctx.triedKeys), filter);
273
+ }
274
+ // Tier 3: exhausted → any provider, unless the model is provider-pinned.
275
+ if (!snapshot && !ctx.pinned) {
276
+ snapshot = findNextKey(state, new Set(ctx.triedKeys));
246
277
  }
247
278
  ctx.currentKey = snapshot;
248
279
  return snapshot;
@@ -266,10 +297,11 @@ export function completeRequest(state, requestId, success) {
266
297
  /**
267
298
  * Mark a key as failed according to the error type (C2).
268
299
  * - KeyFault / ServerFault: penalise the key (KeyFault disables immediately)
269
- * - RequestFault: no penalisation (bad request, not bad key)
300
+ * - RequestFault / NetworkFault: no penalisation (bad request, or network
301
+ * trouble that is not the key's fault)
270
302
  */
271
303
  export function markKeyFailed(state, keyLabel, errorType) {
272
- if (errorType === 'RequestFault')
304
+ if (errorType === 'RequestFault' || errorType === 'NetworkFault')
273
305
  return;
274
306
  const key = state.keys.find((k) => k.label === keyLabel);
275
307
  if (!key)
@@ -313,15 +345,23 @@ export function markKeySucceeded(state, keyLabel) {
313
345
  * 401 → KeyFault (invalid/revoked key — immediate disable)
314
346
  * 429 → ServerFault (transient rate-limit — incremental circuit breaker)
315
347
  * 500 / 502 / 503 → KeyFault if body mentions quota/balance, else ServerFault
316
- * 400 / 404 / 422 → RequestFault (bad request — don't penalise the key)
348
+ * 400 / 403 / 404 / 422 → RequestFault (bad request or permission denial —
349
+ * don't penalise the key; 403 MODEL_NOT_IN_PLAN is a plan
350
+ * restriction, found live on commandcode)
317
351
  * everything else → ServerFault
318
352
  */
319
353
  export function classifyHttpError(status, _body) {
320
- if (status === 401)
354
+ if (status === 401) {
355
+ // opencode-go returns 401 ModelError for UNKNOWN MODELS (verified live:
356
+ // a Model gpt-5.5 is not supported, with a valid key). That is a request
357
+ // fault — penalising it would disable every key as the pool rotates.
358
+ if (_body && /ModelError|not supported/i.test(_body))
359
+ return 'RequestFault';
321
360
  return 'KeyFault';
361
+ }
322
362
  if (status === 429)
323
363
  return 'ServerFault';
324
- if (status === 400 || status === 404 || status === 422)
364
+ if (status === 400 || status === 403 || status === 404 || status === 422)
325
365
  return 'RequestFault';
326
366
  if (status === 500 || status === 502 || status === 503) {
327
367
  // Server errors: if the body hints at a quota/balance issue treat as KeyFault
@@ -1 +1 @@
1
- {"version":3,"file":"proxy-logic.js","sourceRoot":"","sources":["../src/proxy-logic.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"proxy-logic.js","sourceRoot":"","sources":["../src/proxy-logic.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,mCAAmC,EAAE,MAAM,gBAAgB,CAAC;AAuErE,8EAA8E;AAC9E,gBAAgB;AAChB,8EAA8E;AAE9E,MAAM,UAAU,gBAAgB,CAC9B,IAA8D,EAC9D,OAGC;IAED,OAAO;QACL,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACrB,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,GAAG,EAAE,CAAC,CAAC,GAAG;YACV,QAAQ,EAAE,CAAC,CAAC,QAAQ,IAAI,aAAa;YACrC,OAAO,EAAE,IAAI;YACb,mBAAmB,EAAE,CAAC;YACtB,QAAQ,EAAE,IAAI;YACd,UAAU,EAAE,IAAI;YAChB,YAAY,EAAE,IAAI;YAClB,aAAa,EAAE,CAAC;SACjB,CAAC,CAAC;QACH,YAAY,EAAE,CAAC;QACf,uBAAuB,EAAE,OAAO,EAAE,uBAAuB,IAAI,CAAC;QAC9D,wBAAwB,EAAE,OAAO,EAAE,wBAAwB,IAAI,mCAAmC;QAClG,cAAc,EAAE,IAAI,GAAG,EAAE;KAC1B,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,mBAAmB;AACnB,8EAA8E;AAE9E;;;GAGG;AACH,SAAS,UAAU,CAAC,GAAW;IAC7B,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,CAAC;AACpE,CAAC;AAED;;;;GAIG;AACH,SAAS,cAAc,CAAC,KAAiB,EAAE,GAAW;IACpD,IAAI,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,mBAAmB,GAAG,KAAK,CAAC,uBAAuB,EAAE,CAAC;QAC3E,OAAO,IAAI,CAAC;IACd,CAAC;IAED,iDAAiD;IACjD,IAAI,CAAC,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,UAAU,KAAK,IAAI,EAAE,CAAC;QAC5C,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,GAAG,CAAC,UAAU,CAAC;QAC5C,IAAI,OAAO,IAAI,KAAK,CAAC,wBAAwB,EAAE,CAAC;YAC9C,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC;YACnB,GAAG,CAAC,mBAAmB,GAAG,CAAC,CAAC;YAC5B,GAAG,CAAC,UAAU,GAAG,IAAI,CAAC;YACtB,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;;;;GASG;AACH,SAAS,iBAAiB,CAAC,KAAiB;IAC1C,MAAM,MAAM,GAAG,IAAI,GAAG,EAAU,CAAC;IACjC,KAAK,MAAM,CAAC,EAAE,GAAG,CAAC,IAAI,KAAK,CAAC,cAAc,EAAE,CAAC;QAC3C,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC;YACnB,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,SAAS,WAAW,CAClB,KAAiB,EACjB,aAA0B,EAC1B,cAA8C;IAE9C,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC;IAC5B,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAEzB,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3B,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,YAAY,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACrD,IAAI,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC;YAAE,SAAS;QAC3C,IAAI,cAAc,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC;YAAE,SAAS;QAC9D,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,GAAG,CAAC;YAAE,SAAS;QAC1C,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACvB,CAAC;IACD,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAEzC,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;IAC/C,KAAK,CAAC,YAAY,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;IAC1D,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC7B,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC;AAC5B,CAAC;AAED;;;;GAIG;AACH,SAAS,YAAY,CAAC,KAAiB,EAAE,UAAoB;IAC3D,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,KAAK,IAAI,CAAC,CAAC;IAChE,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,UAAU,CAAC,CAAC,CAAC,CAAC;IAE7C,IAAI,OAAO,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,YAAY,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9E,yEAAyE;IACzE,oEAAoE;IACpE,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,YAAY,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACnF,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAC1D,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,YAAY,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpF,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IAC3D,IAAI,WAAW,KAAK,CAAC;QAAE,OAAO,UAAU,CAAC,CAAC,CAAC,CAAC;IAE5C,IAAI,IAAI,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;IACzB,IAAI,UAAU,GAAG,CAAC,QAAQ,CAAC;IAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3C,UAAU,CAAC,CAAC,CAAC,CAAC,aAAa,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC;QAC1C,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC,aAAa,GAAG,UAAU,EAAE,CAAC;YAC7C,UAAU,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC;YACzC,IAAI,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;IACD,IAAI,CAAC,aAAa,IAAI,WAAW,CAAC;IAClC,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,KAAiB,EAAE,KAA0B;IAC1E,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;QAC7B,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACrC,IAAI,OAAO,OAAO,KAAK,QAAQ;YAAE,GAAG,CAAC,YAAY,GAAG,OAAO,CAAC;IAC9D,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,mCAAmC;AACnC,8EAA8E;AAE9E,2EAA2E;AAC3E,SAAS,gBAAgB,CAAC,OAA2B;IACnD,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAC1B,MAAM,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACpC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,OAAO,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IACtD,OAAO,OAAO,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;AAC/B,CAAC;AAED;;;;;;;;GAQG;AACH,SAAS,kBAAkB,CACzB,KAAiB,EACjB,OAAgB;IAEhB,IAAI,CAAC,OAAO;QAAE,OAAO,SAAS,CAAC;IAC/B,MAAM,QAAQ,GAAG,KAAK,CAAC,gBAAgB,CAAC;IACxC,IAAI,CAAC,QAAQ;QAAE,OAAO,SAAS,CAAC;IAChC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;IACnC,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;QAC7B,IAAI,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC;YAAE,SAAS;QACzC,IAAI,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC;YAC7C,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;IACD,IAAI,QAAQ,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAC1C,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;AAC/C,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,mBAAmB,CACjC,KAAiB,EACjB,SAAiB,EACjB,OAAgB;IAEhB,qEAAqE;IACrE,MAAM,QAAQ,GAAG,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACrD,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,QAAQ,CAAC,UAAU,CAAC;IAC7B,CAAC;IAED,0CAA0C;IAC1C,MAAM,GAAG,GAAmB,EAAE,SAAS,EAAE,SAAS,EAAE,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;IAC3E,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;IAEzC,MAAM,cAAc,GAAG,kBAAkB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAC1D,GAAG,CAAC,cAAc,GAAG,cAAc,CAAC;IACpC,GAAG,CAAC,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC;IAEhD,0EAA0E;IAC1E,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IAC7C,MAAM,MAAM,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;IACxC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAC3B,CAAC;IAED,IAAI,QAAQ,GAAG,WAAW,CAAC,KAAK,EAAE,aAAa,EAAE,cAAc,CAAC,CAAC;IAEjE,gEAAgE;IAChE,qEAAqE;IACrE,mCAAmC;IACnC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,QAAQ,GAAG,WAAW,CAAC,KAAK,EAAE,IAAI,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,cAAc,CAAC,CAAC;IACxE,CAAC;IAED,oEAAoE;IACpE,qEAAqE;IACrE,+CAA+C;IAC/C,IAAI,CAAC,QAAQ,IAAI,cAAc,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;QAC/C,QAAQ,GAAG,WAAW,CAAC,KAAK,EAAE,IAAI,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;IACxD,CAAC;IAED,GAAG,CAAC,UAAU,GAAG,QAAQ,CAAC;IAC1B,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAC7B,KAAiB,EACjB,SAAiB;IAEjB,MAAM,GAAG,GAAG,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IAChD,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IAEtB,8BAA8B;IAC9B,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC;QACnB,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;IAC3C,CAAC;IAED,0EAA0E;IAC1E,0EAA0E;IAC1E,kDAAkD;IAClD,MAAM,MAAM,GAAG,GAAG,CAAC,cAAc,CAAC;IAClC,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IAC7C,MAAM,MAAM,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;IACxC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAC3B,CAAC;IAED,IAAI,QAAQ,GAAG,WAAW,CAAC,KAAK,EAAE,aAAa,EAAE,MAAM,CAAC,CAAC;IAEzD,uEAAuE;IACvE,gEAAgE;IAChE,8BAA8B;IAC9B,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,QAAQ,GAAG,WAAW,CAAC,KAAK,EAAE,IAAI,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC,CAAC;IAChE,CAAC;IAED,yEAAyE;IACzE,IAAI,CAAC,QAAQ,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;QAC7B,QAAQ,GAAG,WAAW,CAAC,KAAK,EAAE,IAAI,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;IACxD,CAAC;IAED,GAAG,CAAC,UAAU,GAAG,QAAQ,CAAC;IAC1B,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAC7B,KAAiB,EACjB,SAAiB,EACjB,OAAgB;IAEhB,MAAM,GAAG,GAAG,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IAChD,IAAI,CAAC,GAAG;QAAE,OAAO;IAEjB,IAAI,OAAO,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC;QAC9B,gBAAgB,CAAC,KAAK,EAAE,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;AACzC,CAAC;AAED,8EAA8E;AAC9E,uBAAuB;AACvB,8EAA8E;AAE9E;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAC3B,KAAiB,EACjB,QAAgB,EAChB,SAAoB;IAEpB,IAAI,SAAS,KAAK,cAAc,IAAI,SAAS,KAAK,cAAc;QAAE,OAAO;IAEzE,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC;IACzD,IAAI,CAAC,GAAG;QAAE,OAAO;IAEjB,IAAI,SAAS,KAAK,UAAU,EAAE,CAAC;QAC7B,8DAA8D;QAC9D,GAAG,CAAC,mBAAmB,GAAG,KAAK,CAAC,uBAAuB,CAAC;QACxD,GAAG,CAAC,OAAO,GAAG,KAAK,CAAC;QACpB,GAAG,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,2BAA2B;IAC1D,CAAC;SAAM,CAAC;QACN,gDAAgD;QAChD,GAAG,CAAC,mBAAmB,EAAE,CAAC;QAC1B,IAAI,GAAG,CAAC,mBAAmB,IAAI,KAAK,CAAC,uBAAuB,EAAE,CAAC;YAC7D,GAAG,CAAC,OAAO,GAAG,KAAK,CAAC;YACpB,GAAG,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,2BAA2B;QAC1D,CAAC;IACH,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAAiB,EAAE,QAAgB;IAClE,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC;IACzD,IAAI,CAAC,GAAG;QAAE,OAAO;IACjB,GAAG,CAAC,mBAAmB,GAAG,CAAC,CAAC;IAC5B,kEAAkE;IAClE,GAAG,CAAC,UAAU,GAAG,IAAI,CAAC;AACxB,CAAC;AAED,8EAA8E;AAC9E,iBAAiB;AACjB,8EAA8E;AAE9E,8EAA8E;AAC9E,4BAA4B;AAC5B,8EAA8E;AAE9E;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAc,EAAE,KAAc;IAC9D,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;QACnB,wEAAwE;QACxE,yEAAyE;QACzE,qEAAqE;QACrE,IAAI,KAAK,IAAI,2BAA2B,CAAC,IAAI,CAAC,KAAK,CAAC;YAAE,OAAO,cAAc,CAAC;QAC5E,OAAO,UAAU,CAAC;IACpB,CAAC;IACD,IAAI,MAAM,KAAK,GAAG;QAAE,OAAO,aAAa,CAAC;IACzC,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG;QAAE,OAAO,cAAc,CAAC;IAChG,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;QACvD,8EAA8E;QAC9E,IAAI,KAAK,IAAI,mCAAmC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YAC7D,OAAO,UAAU,CAAC;QACpB,CAAC;QACD,OAAO,aAAa,CAAC;IACvB,CAAC;IACD,OAAO,aAAa,CAAC;AACvB,CAAC"}
package/dist/proxy.d.ts CHANGED
@@ -6,6 +6,21 @@
6
6
  */
7
7
  import { Hono } from 'hono';
8
8
  import type { ProxyConfig } from './config.js';
9
+ import type { KeyProvider } from './providers/index.js';
10
+ /**
11
+ * Resolve the upstream URL for one attempt: per-provider base URL + path
12
+ * remapping. Clients always speak canonical saros routes (/zen/go/v1/<rest>,
13
+ * the opencode-go shape); requests routed to a provider with a different
14
+ * chat surface get the prefix remapped (e.g. /provider/v1 for commandcode).
15
+ */
16
+ export declare function resolveUpstreamUrl(config: ProxyConfig, provider: KeyProvider, path: string): string;
17
+ /**
18
+ * Extract a provider-suffix routing hint from a model id
19
+ * (e.g. 'claude-…@commandcode' → 'commandcode'). Returns null when absent.
20
+ */
21
+ export declare function parseProviderSuffix(modelId: string | undefined): string | null;
22
+ /** Strip the @provider routing suffix from a model id for upstream forwarding. */
23
+ export declare function stripProviderSuffix(modelId: string): string;
9
24
  declare module 'hono' {
10
25
  interface ContextVariableMap {
11
26
  remote: {
@@ -18,8 +33,11 @@ declare module 'hono' {
18
33
  */
19
34
  export declare function buildUpstreamUrl(base: string, path: string): string;
20
35
  /**
21
- * Clean headers for upstream forwarding: remove hop-by-hop headers
22
- * and any pre-existing Authorization.
36
+ * Clean headers for upstream forwarding: remove hop-by-hop headers,
37
+ * pre-existing Authorization, and content-length (the forwarded body may be
38
+ * rewritten — model-id aliasing / suffix strip — so a stale content-length
39
+ * makes the upstream wait for bytes that never arrive; undici recomputes it
40
+ * from the real body).
23
41
  */
24
42
  export declare function buildUpstreamHeaders(incoming: Headers, bearerToken: string): Headers;
25
43
  /**