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
@@ -0,0 +1,12 @@
1
+ /**
2
+ * usage.ts — `saros-proxy usage` command.
3
+ *
4
+ * Shows per-key quota usage (rolling 5h / weekly / monthly windows) fetched
5
+ * live from the upstream usage API, plus the most-used models recorded by
6
+ * the proxy in model-stats.json (only counts requests forwarded while a
7
+ * proxy process was running).
8
+ */
9
+ /**
10
+ * Run the usage command. Returns the process exit code.
11
+ */
12
+ export declare function runUsageCommand(): Promise<number>;
@@ -0,0 +1,116 @@
1
+ /**
2
+ * usage.ts — `saros-proxy usage` command.
3
+ *
4
+ * Shows per-key quota usage (rolling 5h / weekly / monthly windows) fetched
5
+ * live from the upstream usage API, plus the most-used models recorded by
6
+ * the proxy in model-stats.json (only counts requests forwarded while a
7
+ * proxy process was running).
8
+ */
9
+ import chalk from 'chalk';
10
+ import { existsSync, readFileSync } from 'node:fs';
11
+ import { loadConfig } from '../config.js';
12
+ import { fetchKeyUsage } from '../usage-client.js';
13
+ import { getProvider, inferProvider } from '../providers/index.js';
14
+ import { getModelStatsPath } from '../model-stats.js';
15
+ function formatWindow(percent) {
16
+ if (percent >= 90)
17
+ return chalk.red(`${percent}%`);
18
+ if (percent >= 70)
19
+ return chalk.yellow(`${percent}%`);
20
+ return chalk.green(`${percent}%`);
21
+ }
22
+ function formatResetsAt(resetsAt) {
23
+ if (!resetsAt)
24
+ return '-';
25
+ const at = Date.parse(resetsAt);
26
+ if (!Number.isFinite(at))
27
+ return '-';
28
+ const minutes = Math.max(0, Math.round((at - Date.now()) / 60_000));
29
+ if (minutes < 60)
30
+ return `in ${minutes}m`;
31
+ const hours = Math.round(minutes / 60);
32
+ if (hours < 48)
33
+ return `in ${hours}h`;
34
+ return `in ${Math.round(hours / 24)}d`;
35
+ }
36
+ /** Earliest reset among the three windows — when the tightest quota frees up. */
37
+ function earliestReset(usage) {
38
+ const times = [usage.rollingResetsAt, usage.weeklyResetsAt, usage.monthlyResetsAt]
39
+ .map((r) => (r ? Date.parse(r) : NaN))
40
+ .filter((t) => Number.isFinite(t));
41
+ if (times.length === 0)
42
+ return '-';
43
+ return formatResetsAt(new Date(Math.min(...times)).toISOString());
44
+ }
45
+ function printModelStats() {
46
+ const path = getModelStatsPath();
47
+ if (!existsSync(path))
48
+ return;
49
+ try {
50
+ const parsed = JSON.parse(readFileSync(path, 'utf-8'));
51
+ const entries = Object.entries(parsed.counts ?? {})
52
+ .filter(([, count]) => typeof count === 'number' && count > 0)
53
+ .sort((a, b) => b[1] - a[1])
54
+ .slice(0, 10);
55
+ if (entries.length === 0)
56
+ return;
57
+ const since = typeof parsed.since === 'number' ? new Date(parsed.since) : null;
58
+ console.log('');
59
+ console.log(chalk.bold('Most used models')
60
+ + chalk.dim(since ? ` (since ${since.toISOString().slice(0, 10)})` : ''));
61
+ for (const [model, count] of entries) {
62
+ console.log(` ${model.padEnd(32)} ${String(count).padStart(8)} reqs`);
63
+ }
64
+ }
65
+ catch {
66
+ // Corrupt stats file — skip the section silently
67
+ }
68
+ }
69
+ /**
70
+ * Run the usage command. Returns the process exit code.
71
+ */
72
+ export async function runUsageCommand() {
73
+ let config;
74
+ try {
75
+ config = loadConfig();
76
+ }
77
+ catch (err) {
78
+ console.error('Failed to load config:', err instanceof Error ? err.message : String(err));
79
+ return 1;
80
+ }
81
+ if (config.keys.length === 0) {
82
+ console.error(chalk.red('✗ No API keys configured'));
83
+ return 1;
84
+ }
85
+ console.log(chalk.bold('Key usage') + chalk.dim(` (${config.upstreamBaseUrl})`));
86
+ const results = await Promise.all(config.keys.map(async ({ label, key, provider }) => {
87
+ const providerId = provider ?? inferProvider({ label, key });
88
+ const p = getProvider(providerId);
89
+ // Providers without a queryable usage API report 'n/a' instead of an error.
90
+ if (!p || !p.usagePath()) {
91
+ return { label, provider: providerId, usage: null, noUsageApi: true };
92
+ }
93
+ const base = config.upstreams?.[p.id] ?? (p.id === 'opencode-go' ? config.upstreamBaseUrl : p.baseUrl);
94
+ return { label, provider: providerId, usage: await fetchKeyUsage(base, key, p.usagePath()), noUsageApi: false };
95
+ }));
96
+ let failures = 0;
97
+ for (const { label, provider, usage, noUsageApi } of results) {
98
+ if (noUsageApi) {
99
+ console.log(` ${chalk.yellow('·')} ${label.padEnd(16)}${chalk.dim(` (${provider})`)}`
100
+ + chalk.dim(' usage: n/a — provider has no queryable usage API'));
101
+ continue;
102
+ }
103
+ if (!usage) {
104
+ failures++;
105
+ console.log(` ${chalk.red('✗')} ${label.padEnd(16)}${chalk.dim(` (${provider})`)} failed to fetch usage`);
106
+ continue;
107
+ }
108
+ console.log(` ${chalk.green('•')} ${label.padEnd(16)}${chalk.dim(` (${provider})`)} 5h: ${formatWindow(usage.rollingPercent)}`
109
+ + ` Weekly: ${formatWindow(usage.weeklyPercent)}`
110
+ + ` Monthly: ${formatWindow(usage.monthlyPercent)}`
111
+ + chalk.dim(` (tightest resets ${earliestReset(usage)})`));
112
+ }
113
+ printModelStats();
114
+ return failures > 0 && failures === results.length ? 1 : 0;
115
+ }
116
+ //# sourceMappingURL=usage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usage.js","sourceRoot":"","sources":["../../src/cli/usage.ts"],"names":[],"mappings":"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"}
package/dist/config.d.ts CHANGED
@@ -1,35 +1,31 @@
1
1
  /**
2
2
  * config.ts — Configuration loading from YAML file or environment variables.
3
3
  */
4
+ import type { ProviderId } from './providers/index.js';
5
+ import { type KeyEntry } from './providers/infer.js';
6
+ export type { KeyEntry };
4
7
  export interface ProxyConfig {
5
8
  port: number;
6
9
  host: string;
7
- keys: Array<{
8
- label: string;
9
- key: string;
10
- }>;
10
+ keys: KeyEntry[];
11
11
  circuitBreakerThreshold: number;
12
12
  circuitBreakerCooldownMs: number;
13
+ /** Default upstream (opencode-go). Per-provider overrides in upstreams. */
13
14
  upstreamBaseUrl: string;
15
+ /** Per-provider upstream override map, e.g. { commandcode: 'https://…' }. */
16
+ upstreams?: Partial<Record<ProviderId, string>>;
14
17
  requestTimeoutMs: number;
15
18
  allowedOrigins: string[];
16
- scraping?: ScrapingConfig;
17
- }
18
- export interface ScrapingAccount {
19
- workspaceId: string;
20
- authCookie: string;
21
- }
22
- export interface ScrapingConfig {
23
- enabled: boolean;
24
- intervalMs: number;
25
- usageThreshold: number;
26
- accounts: ScrapingAccount[];
27
19
  }
28
20
  /**
29
21
  * Return the OS-native user config directory path for saros.
30
22
  *
31
- * Windows: %LOCALAPPDATA%\saros\config.yaml
32
- * macOS/Linux: ~/.config/saros/config.yaml (XDG)
23
+ * Windows: %LOCALAPPDATA%\saros\
24
+ * macOS/Linux: ~/.config/saros/ (XDG)
25
+ */
26
+ export declare function getSarosDir(): string;
27
+ /**
28
+ * Return the OS-native user config file path for saros.
33
29
  */
34
30
  export declare function getDefaultConfigPath(): string;
35
31
  /**
package/dist/config.js CHANGED
@@ -3,17 +3,24 @@
3
3
  */
4
4
  import { readFileSync, existsSync } from 'node:fs';
5
5
  import { homedir } from 'node:os';
6
- import { join } from 'node:path';
6
+ import { join, dirname } from 'node:path';
7
7
  import { parse as parseYaml } from 'yaml';
8
8
  import { logger, maskKey } from './logger.js';
9
9
  import { decryptKey, isEncryptedKey } from './key-encryption.js';
10
- import { DEFAULT_PORT, DEFAULT_HOST, DEFAULT_UPSTREAM_URL, DEFAULT_CIRCUIT_BREAKER_COOLDOWN_MS, DEFAULT_REQUEST_TIMEOUT_MS, MIN_SCRAPE_INTERVAL_MS, MAX_SCRAPE_INTERVAL_MS, DEFAULT_SCRAPE_INTERVAL_MS, DEFAULT_USAGE_THRESHOLD, } from './constants.js';
11
- import { isValidPort, isValidHttpsUrl, isValidApiKey, isValidWorkspaceId } from './validation.js';
10
+ import { DEFAULT_PORT, DEFAULT_HOST, DEFAULT_UPSTREAM_URL, DEFAULT_CIRCUIT_BREAKER_COOLDOWN_MS, DEFAULT_REQUEST_TIMEOUT_MS, } from './constants.js';
11
+ import { isValidPort, isValidHttpsUrl, isValidApiKey } from './validation.js';
12
+ import { inferProvider } from './providers/infer.js';
12
13
  /**
13
14
  * Return the OS-native user config directory path for saros.
14
15
  *
15
- * Windows: %LOCALAPPDATA%\saros\config.yaml
16
- * macOS/Linux: ~/.config/saros/config.yaml (XDG)
16
+ * Windows: %LOCALAPPDATA%\saros\
17
+ * macOS/Linux: ~/.config/saros/ (XDG)
18
+ */
19
+ export function getSarosDir() {
20
+ return dirname(getDefaultConfigPath());
21
+ }
22
+ /**
23
+ * Return the OS-native user config file path for saros.
17
24
  */
18
25
  export function getDefaultConfigPath() {
19
26
  const home = homedir();
@@ -75,7 +82,7 @@ export function validateConfig(config) {
75
82
  logger.warn('Upstream URL "%s" must use HTTPS, defaulting to %s', upstreamBaseUrl, DEFAULT_UPSTREAM_URL);
76
83
  upstreamBaseUrl = DEFAULT_UPSTREAM_URL;
77
84
  }
78
- // --- API keys (must start with sk- and be >= 20 chars) ---
85
+ // --- API keys (structurally valid for some provider, >= 20 chars) ---
79
86
  const rawKeys = config.keys ?? [];
80
87
  const validKeys = rawKeys.filter((k) => {
81
88
  if (!isValidApiKey(k.key)) {
@@ -99,7 +106,7 @@ export function validateConfig(config) {
99
106
  let circuitBreakerCooldownMs = config.circuitBreakerCooldownMs ?? DEFAULT_CIRCUIT_BREAKER_COOLDOWN_MS;
100
107
  if (!Number.isInteger(circuitBreakerCooldownMs) ||
101
108
  circuitBreakerCooldownMs < 1_000 ||
102
- circuitBreakerCooldownMs > MAX_SCRAPE_INTERVAL_MS) {
109
+ circuitBreakerCooldownMs > 3_600_000) {
103
110
  logger.warn('Invalid circuitBreakerCooldownMs %d, defaulting to %d', circuitBreakerCooldownMs, DEFAULT_CIRCUIT_BREAKER_COOLDOWN_MS);
104
111
  circuitBreakerCooldownMs = DEFAULT_CIRCUIT_BREAKER_COOLDOWN_MS;
105
112
  }
@@ -116,59 +123,27 @@ export function validateConfig(config) {
116
123
  'http://localhost:*',
117
124
  'http://127.0.0.1:*',
118
125
  ];
119
- // --- Scraping config (optional) ---
120
- let scraping;
121
- if (config.scraping) {
122
- const s = config.scraping;
123
- // enabled: default false
124
- const enabled = s.enabled ?? false;
125
- // intervalMs: default 90000, range 10000-3600000
126
- let intervalMs = s.intervalMs ?? DEFAULT_SCRAPE_INTERVAL_MS;
127
- if (!Number.isInteger(intervalMs) || intervalMs < MIN_SCRAPE_INTERVAL_MS || intervalMs > MAX_SCRAPE_INTERVAL_MS) {
128
- logger.warn('Invalid scraping.intervalMs %d, defaulting to %d', intervalMs, DEFAULT_SCRAPE_INTERVAL_MS);
129
- intervalMs = DEFAULT_SCRAPE_INTERVAL_MS;
130
- }
131
- // usageThreshold: default 50, range 1-100
132
- let usageThreshold = s.usageThreshold ?? DEFAULT_USAGE_THRESHOLD;
133
- if (!Number.isInteger(usageThreshold) || usageThreshold < 1 || usageThreshold > 100) {
134
- logger.warn('Invalid scraping.usageThreshold %d, defaulting to %d', usageThreshold, DEFAULT_USAGE_THRESHOLD);
135
- usageThreshold = DEFAULT_USAGE_THRESHOLD;
126
+ // --- Per-provider upstreams (SSRF: every value must be HTTPS) ---
127
+ const upstreams = {};
128
+ for (const [id, url] of Object.entries(config.upstreams ?? {})) {
129
+ if (!url)
130
+ continue;
131
+ if (!isValidHttpsUrl(url)) {
132
+ logger.warn('Upstream URL for provider "%s" must use HTTPS, ignoring', id);
133
+ continue;
136
134
  }
137
- // accounts: filter invalid entries
138
- const rawAccounts = Array.isArray(s.accounts) ? s.accounts : [];
139
- const validAccounts = rawAccounts.filter((acc) => {
140
- // null/not-object guard
141
- if (!acc || typeof acc !== 'object')
142
- return false;
143
- // workspaceId must match wrk_[A-Za-z0-9]+
144
- if (!isValidWorkspaceId(acc.workspaceId)) {
145
- logger.warn('Invalid scraping account workspaceId "%s", filtering out', acc.workspaceId);
146
- return false;
147
- }
148
- // authCookie must not be empty
149
- if (!acc.authCookie || acc.authCookie.trim() === '') {
150
- logger.warn('Invalid scraping account authCookie for "%s", filtering out', acc.workspaceId);
151
- return false;
152
- }
153
- return true;
154
- });
155
- scraping = {
156
- enabled,
157
- intervalMs,
158
- usageThreshold,
159
- accounts: validAccounts,
160
- };
135
+ upstreams[id] = url.replace(/\/$/, '');
161
136
  }
162
137
  return {
163
138
  port,
164
139
  host,
165
- keys: validKeys,
140
+ keys: validKeys.map((k) => ({ ...k, provider: inferProvider(k) })),
166
141
  circuitBreakerThreshold,
167
142
  circuitBreakerCooldownMs,
168
143
  upstreamBaseUrl,
144
+ upstreams,
169
145
  requestTimeoutMs,
170
146
  allowedOrigins,
171
- scraping,
172
147
  };
173
148
  }
174
149
  /**
@@ -206,9 +181,9 @@ function getBaseConfig() {
206
181
  circuitBreakerThreshold: 3,
207
182
  circuitBreakerCooldownMs: DEFAULT_CIRCUIT_BREAKER_COOLDOWN_MS,
208
183
  upstreamBaseUrl: DEFAULT_UPSTREAM_URL,
184
+ upstreams: {},
209
185
  requestTimeoutMs: DEFAULT_REQUEST_TIMEOUT_MS,
210
186
  allowedOrigins: ['http://localhost:*', 'http://127.0.0.1:*'],
211
- scraping: undefined,
212
187
  };
213
188
  }
214
189
  function applyEnvConfig(config) {
@@ -233,7 +208,7 @@ function applyEnvConfig(config) {
233
208
  label: pair.slice(0, colonIdx).trim(),
234
209
  key: pair.slice(colonIdx + 1).trim(),
235
210
  };
236
- }).filter((k) => k.key.startsWith('sk-'));
211
+ }).filter((k) => isValidApiKey(k.key));
237
212
  }
238
213
  }
239
214
  function resolveYamlPath(cliConfigArg, explicitPath) {
@@ -273,6 +248,8 @@ function applyYamlConfig(config, yaml) {
273
248
  config.host = yaml.host;
274
249
  if (yaml.upstreamBaseUrl !== undefined)
275
250
  config.upstreamBaseUrl = yaml.upstreamBaseUrl;
251
+ if (yaml.upstreams !== undefined)
252
+ config.upstreams = yaml.upstreams;
276
253
  if (yaml.circuitBreakerThreshold !== undefined)
277
254
  config.circuitBreakerThreshold = yaml.circuitBreakerThreshold;
278
255
  if (yaml.circuitBreakerCooldownMs !== undefined)
@@ -283,20 +260,9 @@ function applyYamlConfig(config, yaml) {
283
260
  config.allowedOrigins = yaml.allowedOrigins;
284
261
  if (yaml.keys && yaml.keys.length > 0)
285
262
  config.keys = yaml.keys;
286
- if (yaml.scraping !== undefined) {
287
- config.scraping = {
288
- enabled: yaml.scraping.enabled ?? false,
289
- intervalMs: yaml.scraping.intervalMs ?? DEFAULT_SCRAPE_INTERVAL_MS,
290
- usageThreshold: yaml.scraping.usageThreshold ?? DEFAULT_USAGE_THRESHOLD,
291
- accounts: yaml.scraping.accounts ?? [],
292
- };
293
- }
294
263
  }
295
264
  function decryptConfigSecrets(config, encryptionKey) {
296
265
  config.keys = config.keys.map((k) => decryptApiKeyIfNeeded(k, encryptionKey));
297
- if (config.scraping?.accounts) {
298
- config.scraping.accounts = config.scraping.accounts.map((acc) => decryptAuthCookieIfNeeded(acc, encryptionKey));
299
- }
300
266
  }
301
267
  function decryptApiKeyIfNeeded(entry, encryptionKey) {
302
268
  if (!isEncryptedKey(entry.key))
@@ -309,26 +275,11 @@ function decryptApiKeyIfNeeded(entry, encryptionKey) {
309
275
  throw new Error(`Failed to decrypt API key "${entry.label}" — check OPENCODE_GO_ENCRYPTION_KEY`);
310
276
  }
311
277
  }
312
- function decryptAuthCookieIfNeeded(acc, encryptionKey) {
313
- if (!isEncryptedKey(acc.authCookie))
314
- return acc;
315
- try {
316
- return { ...acc, authCookie: decryptKey(acc.authCookie, encryptionKey) };
317
- }
318
- catch (err) {
319
- logger.error('Failed to decrypt authCookie for workspace "%s": %s', acc.workspaceId, err instanceof Error ? err.message : String(err));
320
- throw new Error(`Failed to decrypt authCookie for workspace "${acc.workspaceId}" — check OPENCODE_GO_ENCRYPTION_KEY`);
321
- }
322
- }
323
278
  function assertNoEncryptedSecrets(config) {
324
279
  const encryptedKeys = config.keys.filter((k) => isEncryptedKey(k.key));
325
280
  if (encryptedKeys.length > 0) {
326
281
  throw new Error(`Found ${encryptedKeys.length} encrypted API key(s) but OPENCODE_GO_ENCRYPTION_KEY environment variable is not set`);
327
282
  }
328
- const encryptedCookies = config.scraping?.accounts?.filter((acc) => isEncryptedKey(acc.authCookie)) ?? [];
329
- if (encryptedCookies.length > 0) {
330
- throw new Error(`Found ${encryptedCookies.length} encrypted authCookie(s) but OPENCODE_GO_ENCRYPTION_KEY environment variable is not set`);
331
- }
332
283
  }
333
284
  function applyCliOverrides(config, cliArgs) {
334
285
  if (cliArgs.port) {
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,MAAM,CAAC;AAC1C,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACjE,OAAO,EACL,YAAY,EACZ,YAAY,EACZ,oBAAoB,EACpB,mCAAmC,EACnC,0BAA0B,EAC1B,sBAAsB,EACtB,sBAAsB,EACtB,0BAA0B,EAC1B,uBAAuB,GACxB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AA2ClG;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB;IAClC,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IACvB,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CACb,4FAA4F,CAC7F,CAAC;IACJ,CAAC;IAED,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACjC,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;QAChF,OAAO,IAAI,CAAC,YAAY,EAAE,OAAO,EAAE,aAAa,CAAC,CAAC;IACpD,CAAC;IAED,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IACvE,OAAO,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,aAAa,CAAC,CAAC;AACjD,CAAC;AAED;;GAEG;AACH,SAAS,YAAY;IACnB,MAAM,IAAI,GAA2B,EAAE,CAAC;IACxC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAC1B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACzB,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACzB,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YACzB,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;gBACnC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;gBACjB,CAAC,EAAE,CAAC;YACN,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC;YACrB,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,MAA4B;IACzD,eAAe;IACf,IAAI,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,YAAY,CAAC;IACvC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC;QACvB,MAAM,CAAC,IAAI,CAAC,mCAAmC,EAAE,IAAI,EAAE,YAAY,CAAC,CAAC;QACrE,IAAI,GAAG,YAAY,CAAC;IACtB,CAAC;IAED,eAAe;IACf,IAAI,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,YAAY,CAAC;IACvC,yFAAyF;IACzF,MAAM,SAAS,GAAG,wBAAwB,CAAC;IAC3C,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1B,MAAM,CAAC,IAAI,CAAC,qCAAqC,EAAE,IAAI,EAAE,YAAY,CAAC,CAAC;QACvE,IAAI,GAAG,YAAY,CAAC;IACtB,CAAC;IAED,yDAAyD;IACzD,IAAI,eAAe,GAAG,MAAM,CAAC,eAAe,IAAI,oBAAoB,CAAC;IACrE,IAAI,CAAC,eAAe,CAAC,eAAe,CAAC,EAAE,CAAC;QACtC,MAAM,CAAC,IAAI,CACT,oDAAoD,EACpD,eAAe,EACf,oBAAoB,CACrB,CAAC;QACF,eAAe,GAAG,oBAAoB,CAAC;IACzC,CAAC;IAED,4DAA4D;IAC5D,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;IAClC,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;QACrC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;YAC1B,MAAM,CAAC,IAAI,CAAC,iCAAiC,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAC/D,OAAO,KAAK,CAAC;QACf,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;IAEH,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAClD,CAAC;IAED,oCAAoC;IACpC,IAAI,uBAAuB,GAAG,MAAM,CAAC,uBAAuB,IAAI,CAAC,CAAC;IAClE,IACE,CAAC,MAAM,CAAC,SAAS,CAAC,uBAAuB,CAAC;QAC1C,uBAAuB,GAAG,CAAC;QAC3B,uBAAuB,GAAG,EAAE,EAC5B,CAAC;QACD,MAAM,CAAC,IAAI,CACT,qDAAqD,EACrD,uBAAuB,CACxB,CAAC;QACF,uBAAuB,GAAG,CAAC,CAAC;IAC9B,CAAC;IAED,mCAAmC;IACnC,IAAI,wBAAwB,GAAG,MAAM,CAAC,wBAAwB,IAAI,mCAAmC,CAAC;IACtG,IACE,CAAC,MAAM,CAAC,SAAS,CAAC,wBAAwB,CAAC;QAC3C,wBAAwB,GAAG,KAAK;QAChC,wBAAwB,GAAG,sBAAsB,EACjD,CAAC;QACD,MAAM,CAAC,IAAI,CACT,uDAAuD,EACvD,wBAAwB,EACxB,mCAAmC,CACpC,CAAC;QACF,wBAAwB,GAAG,mCAAmC,CAAC;IACjE,CAAC;IAED,0BAA0B;IAC1B,IAAI,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,IAAI,0BAA0B,CAAC;IAC7E,IACE,CAAC,MAAM,CAAC,SAAS,CAAC,gBAAgB,CAAC;QACnC,gBAAgB,GAAG,KAAK;QACxB,gBAAgB,GAAG,OAAO,EAC1B,CAAC;QACD,MAAM,CAAC,IAAI,CACT,+CAA+C,EAC/C,gBAAgB,EAChB,0BAA0B,CAC3B,CAAC;QACF,gBAAgB,GAAG,0BAA0B,CAAC;IAChD,CAAC;IAED,iCAAiC;IACjC,MAAM,cAAc,GAAG,MAAM,CAAC,cAAc,IAAI;QAC9C,oBAAoB;QACpB,oBAAoB;KACrB,CAAC;IAEF,qCAAqC;IACrC,IAAI,QAAoC,CAAC;IACzC,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACpB,MAAM,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC;QAE1B,yBAAyB;QACzB,MAAM,OAAO,GAAG,CAAC,CAAC,OAAO,IAAI,KAAK,CAAC;QAEnC,iDAAiD;QACjD,IAAI,UAAU,GAAG,CAAC,CAAC,UAAU,IAAI,0BAA0B,CAAC;QAC5D,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,UAAU,GAAG,sBAAsB,IAAI,UAAU,GAAG,sBAAsB,EAAE,CAAC;YAChH,MAAM,CAAC,IAAI,CAAC,kDAAkD,EAAE,UAAU,EAAE,0BAA0B,CAAC,CAAC;YACxG,UAAU,GAAG,0BAA0B,CAAC;QAC1C,CAAC;QAED,0CAA0C;QAC1C,IAAI,cAAc,GAAG,CAAC,CAAC,cAAc,IAAI,uBAAuB,CAAC;QACjE,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,cAAc,GAAG,CAAC,IAAI,cAAc,GAAG,GAAG,EAAE,CAAC;YACpF,MAAM,CAAC,IAAI,CAAC,sDAAsD,EAAE,cAAc,EAAE,uBAAuB,CAAC,CAAC;YAC7G,cAAc,GAAG,uBAAuB,CAAC;QAC3C,CAAC;QAED,mCAAmC;QACnC,MAAM,WAAW,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;QAChE,MAAM,aAAa,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE;YAC/C,wBAAwB;YACxB,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ;gBAAE,OAAO,KAAK,CAAC;YAClD,0CAA0C;YAC1C,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC;gBACzC,MAAM,CAAC,IAAI,CAAC,0DAA0D,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC;gBACzF,OAAO,KAAK,CAAC;YACf,CAAC;YACD,+BAA+B;YAC/B,IAAI,CAAC,GAAG,CAAC,UAAU,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;gBACpD,MAAM,CAAC,IAAI,CAAC,6DAA6D,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC;gBAC5F,OAAO,KAAK,CAAC;YACf,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;QAEH,QAAQ,GAAG;YACT,OAAO;YACP,UAAU;YACV,cAAc;YACd,QAAQ,EAAE,aAAa;SACxB,CAAC;IACJ,CAAC;IAED,OAAO;QACL,IAAI;QACJ,IAAI;QACJ,IAAI,EAAE,SAAS;QACf,uBAAuB;QACvB,wBAAwB;QACxB,eAAe;QACf,gBAAgB;QAChB,cAAc;QACd,QAAQ;KACT,CAAC;AACJ,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,UAAU,CAAC,UAAmB;IAC5C,MAAM,OAAO,GAAG,YAAY,EAAE,CAAC;IAC/B,MAAM,MAAM,GAAG,aAAa,EAAE,CAAC;IAE/B,cAAc,CAAC,MAAM,CAAC,CAAC;IAEvB,MAAM,QAAQ,GAAG,eAAe,CAAC,OAAO,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAC7D,MAAM,IAAI,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IACzC,IAAI,IAAI;QAAE,eAAe,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAExC,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC;IAC7D,IAAI,aAAa,EAAE,CAAC;QAClB,oBAAoB,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IAC9C,CAAC;SAAM,CAAC;QACN,wBAAwB,CAAC,MAAM,CAAC,CAAC;IACnC,CAAC;IAED,iBAAiB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAEnC,OAAO,cAAc,CAAC,MAAM,CAAC,CAAC;AAChC,CAAC;AAED,SAAS,aAAa;IACpB,OAAO;QACL,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE,EAAE;QACR,uBAAuB,EAAE,CAAC;QAC1B,wBAAwB,EAAE,mCAAmC;QAC7D,eAAe,EAAE,oBAAoB;QACrC,gBAAgB,EAAE,0BAA0B;QAC5C,cAAc,EAAE,CAAC,oBAAoB,EAAE,oBAAoB,CAAC;QAC5D,QAAQ,EAAE,SAAS;KACpB,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,MAAmB;IACzC,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC;QAC3B,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IAC5D,CAAC;IACD,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC;QAC3B,MAAM,CAAC,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC;IACvC,CAAC;IACD,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,CAAC;QAClC,MAAM,CAAC,eAAe,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;IACzD,CAAC;IACD,4EAA4E;IAC5E,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC;IAChD,IAAI,UAAU,EAAE,CAAC;QACf,MAAM,CAAC,IAAI,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;YAC/C,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACnC,IAAI,QAAQ,KAAK,CAAC,CAAC,EAAE,CAAC;gBACpB,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC;YACzC,CAAC;YACD,OAAO;gBACL,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,IAAI,EAAE;gBACrC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE;aACrC,CAAC;QACJ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC;IAC5C,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CAAC,YAAgC,EAAE,YAAgC;IACzF,IAAI,YAAY;QAAE,OAAO,YAAY,CAAC;IACtC,IAAI,YAAY;QAAE,OAAO,YAAY,CAAC;IAEtC,MAAM,WAAW,GAAG,oBAAoB,EAAE,CAAC;IAC3C,IAAI,UAAU,CAAC,WAAW,CAAC;QAAE,OAAO,WAAW,CAAC;IAEhD,IAAI,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;QAC9B,MAAM,CAAC,IAAI,CAAC,8EAA8E,EAAE,WAAW,CAAC,CAAC;QACzG,OAAO,aAAa,CAAC;IACvB,CAAC;IACD,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,SAAS,iBAAiB,CAAC,QAAgB;IACzC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1B,MAAM,CAAC,IAAI,CAAC,gDAAgD,EAAE,QAAQ,CAAC,CAAC;QACxE,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC5C,MAAM,IAAI,GAAG,SAAS,CAAC,GAAG,CAAe,CAAC;QAC1C,MAAM,CAAC,IAAI,CAAC,uBAAuB,EAAE,QAAQ,CAAC,CAAC;QAC/C,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,EAAE,gCAAgC,EAAE,QAAQ,CAAC,CAAC;QAClE,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CAAC,MAAmB,EAAE,IAAgB;IAC5D,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS;QAAE,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;IACrD,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS;QAAE,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;IACrD,IAAI,IAAI,CAAC,eAAe,KAAK,SAAS;QAAE,MAAM,CAAC,eAAe,GAAG,IAAI,CAAC,eAAe,CAAC;IACtF,IAAI,IAAI,CAAC,uBAAuB,KAAK,SAAS;QAAE,MAAM,CAAC,uBAAuB,GAAG,IAAI,CAAC,uBAAuB,CAAC;IAC9G,IAAI,IAAI,CAAC,wBAAwB,KAAK,SAAS;QAAE,MAAM,CAAC,wBAAwB,GAAG,IAAI,CAAC,wBAAwB,CAAC;IACjH,IAAI,IAAI,CAAC,gBAAgB,KAAK,SAAS;QAAE,MAAM,CAAC,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,CAAC;IACzF,IAAI,IAAI,CAAC,cAAc,KAAK,SAAS;QAAE,MAAM,CAAC,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC;IACnF,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC;QAAE,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;IAC/D,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QAChC,MAAM,CAAC,QAAQ,GAAG;YAChB,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,OAAO,IAAI,KAAK;YACvC,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,UAAU,IAAI,0BAA0B;YAClE,cAAc,EAAE,IAAI,CAAC,QAAQ,CAAC,cAAc,IAAI,uBAAuB;YACvE,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,QAAQ,IAAI,EAAE;SACvC,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAS,oBAAoB,CAAC,MAAmB,EAAE,aAAqB;IACtE,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,qBAAqB,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC;IAC9E,IAAI,MAAM,CAAC,QAAQ,EAAE,QAAQ,EAAE,CAAC;QAC9B,MAAM,CAAC,QAAQ,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAC9D,yBAAyB,CAAC,GAAG,EAAE,aAAa,CAAC,CAC9C,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAS,qBAAqB,CAC5B,KAAqC,EACrC,aAAqB;IAErB,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IAC7C,IAAI,CAAC;QACH,OAAO,EAAE,GAAG,KAAK,EAAE,GAAG,EAAE,UAAU,CAAC,KAAK,CAAC,GAAG,EAAE,aAAa,CAAC,EAAE,CAAC;IACjE,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,CAAC,KAAK,CACV,gCAAgC,EAChC,KAAK,CAAC,KAAK,EACX,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CACjD,CAAC;QACF,MAAM,IAAI,KAAK,CAAC,8BAA8B,KAAK,CAAC,KAAK,sCAAsC,CAAC,CAAC;IACnG,CAAC;AACH,CAAC;AAED,SAAS,yBAAyB,CAAC,GAAoB,EAAE,aAAqB;IAC5E,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,UAAU,CAAC;QAAE,OAAO,GAAG,CAAC;IAChD,IAAI,CAAC;QACH,OAAO,EAAE,GAAG,GAAG,EAAE,UAAU,EAAE,UAAU,CAAC,GAAG,CAAC,UAAU,EAAE,aAAa,CAAC,EAAE,CAAC;IAC3E,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,CAAC,KAAK,CACV,qDAAqD,EACrD,GAAG,CAAC,WAAW,EACf,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CACjD,CAAC;QACF,MAAM,IAAI,KAAK,CAAC,+CAA+C,GAAG,CAAC,WAAW,sCAAsC,CAAC,CAAC;IACxH,CAAC;AACH,CAAC;AAED,SAAS,wBAAwB,CAAC,MAAmB;IACnD,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACvE,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CACb,SAAS,aAAa,CAAC,MAAM,sFAAsF,CACpH,CAAC;IACJ,CAAC;IAED,MAAM,gBAAgB,GACpB,MAAM,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,cAAc,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,IAAI,EAAE,CAAC;IACnF,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CACb,SAAS,gBAAgB,CAAC,MAAM,yFAAyF,CAC1H,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAS,iBAAiB,CAAC,MAAmB,EAAE,OAA+B;IAC7E,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAClD,CAAC;IACD,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,MAAM,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAC7B,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,MAAM,CAAC;AAC1C,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACjE,OAAO,EACL,YAAY,EACZ,YAAY,EACZ,oBAAoB,EACpB,mCAAmC,EACnC,0BAA0B,GAC3B,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAE9E,OAAO,EAAE,aAAa,EAAiB,MAAM,sBAAsB,CAAC;AA8BpE;;;;;GAKG;AACH,MAAM,UAAU,WAAW;IACzB,OAAO,OAAO,CAAC,oBAAoB,EAAE,CAAC,CAAC;AACzC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB;IAClC,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IACvB,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CACb,4FAA4F,CAC7F,CAAC;IACJ,CAAC;IAED,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACjC,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;QAChF,OAAO,IAAI,CAAC,YAAY,EAAE,OAAO,EAAE,aAAa,CAAC,CAAC;IACpD,CAAC;IAED,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IACvE,OAAO,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,aAAa,CAAC,CAAC;AACjD,CAAC;AAED;;GAEG;AACH,SAAS,YAAY;IACnB,MAAM,IAAI,GAA2B,EAAE,CAAC;IACxC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAC1B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACzB,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACzB,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YACzB,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;gBACnC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;gBACjB,CAAC,EAAE,CAAC;YACN,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC;YACrB,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,MAA4B;IACzD,eAAe;IACf,IAAI,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,YAAY,CAAC;IACvC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC;QACvB,MAAM,CAAC,IAAI,CAAC,mCAAmC,EAAE,IAAI,EAAE,YAAY,CAAC,CAAC;QACrE,IAAI,GAAG,YAAY,CAAC;IACtB,CAAC;IAED,eAAe;IACf,IAAI,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,YAAY,CAAC;IACvC,yFAAyF;IACzF,MAAM,SAAS,GAAG,wBAAwB,CAAC;IAC3C,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1B,MAAM,CAAC,IAAI,CAAC,qCAAqC,EAAE,IAAI,EAAE,YAAY,CAAC,CAAC;QACvE,IAAI,GAAG,YAAY,CAAC;IACtB,CAAC;IAED,yDAAyD;IACzD,IAAI,eAAe,GAAG,MAAM,CAAC,eAAe,IAAI,oBAAoB,CAAC;IACrE,IAAI,CAAC,eAAe,CAAC,eAAe,CAAC,EAAE,CAAC;QACtC,MAAM,CAAC,IAAI,CACT,oDAAoD,EACpD,eAAe,EACf,oBAAoB,CACrB,CAAC;QACF,eAAe,GAAG,oBAAoB,CAAC;IACzC,CAAC;IAED,uEAAuE;IACvE,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;IAClC,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;QACrC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;YAC1B,MAAM,CAAC,IAAI,CAAC,iCAAiC,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAC/D,OAAO,KAAK,CAAC;QACf,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;IAEH,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAClD,CAAC;IAED,oCAAoC;IACpC,IAAI,uBAAuB,GAAG,MAAM,CAAC,uBAAuB,IAAI,CAAC,CAAC;IAClE,IACE,CAAC,MAAM,CAAC,SAAS,CAAC,uBAAuB,CAAC;QAC1C,uBAAuB,GAAG,CAAC;QAC3B,uBAAuB,GAAG,EAAE,EAC5B,CAAC;QACD,MAAM,CAAC,IAAI,CACT,qDAAqD,EACrD,uBAAuB,CACxB,CAAC;QACF,uBAAuB,GAAG,CAAC,CAAC;IAC9B,CAAC;IAED,mCAAmC;IACnC,IAAI,wBAAwB,GAAG,MAAM,CAAC,wBAAwB,IAAI,mCAAmC,CAAC;IACtG,IACE,CAAC,MAAM,CAAC,SAAS,CAAC,wBAAwB,CAAC;QAC3C,wBAAwB,GAAG,KAAK;QAChC,wBAAwB,GAAG,SAAS,EACpC,CAAC;QACD,MAAM,CAAC,IAAI,CACT,uDAAuD,EACvD,wBAAwB,EACxB,mCAAmC,CACpC,CAAC;QACF,wBAAwB,GAAG,mCAAmC,CAAC;IACjE,CAAC;IAED,0BAA0B;IAC1B,IAAI,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,IAAI,0BAA0B,CAAC;IAC7E,IACE,CAAC,MAAM,CAAC,SAAS,CAAC,gBAAgB,CAAC;QACnC,gBAAgB,GAAG,KAAK;QACxB,gBAAgB,GAAG,OAAO,EAC1B,CAAC;QACD,MAAM,CAAC,IAAI,CACT,+CAA+C,EAC/C,gBAAgB,EAChB,0BAA0B,CAC3B,CAAC;QACF,gBAAgB,GAAG,0BAA0B,CAAC;IAChD,CAAC;IAED,iCAAiC;IACjC,MAAM,cAAc,GAAG,MAAM,CAAC,cAAc,IAAI;QAC9C,oBAAoB;QACpB,oBAAoB;KACrB,CAAC;IAEF,mEAAmE;IACnE,MAAM,SAAS,GAAwC,EAAE,CAAC;IAC1D,KAAK,MAAM,CAAC,EAAE,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,IAAI,EAAE,CAAC,EAAE,CAAC;QAC/D,IAAI,CAAC,GAAG;YAAE,SAAS;QACnB,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC;YAC1B,MAAM,CAAC,IAAI,CAAC,yDAAyD,EAAE,EAAE,CAAC,CAAC;YAC3E,SAAS;QACX,CAAC;QACD,SAAS,CAAC,EAAgB,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACvD,CAAC;IAED,OAAO;QACL,IAAI;QACJ,IAAI;QACJ,IAAI,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAClE,uBAAuB;QACvB,wBAAwB;QACxB,eAAe;QACf,SAAS;QACT,gBAAgB;QAChB,cAAc;KACf,CAAC;AACJ,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,UAAU,CAAC,UAAmB;IAC5C,MAAM,OAAO,GAAG,YAAY,EAAE,CAAC;IAC/B,MAAM,MAAM,GAAG,aAAa,EAAE,CAAC;IAE/B,cAAc,CAAC,MAAM,CAAC,CAAC;IAEvB,MAAM,QAAQ,GAAG,eAAe,CAAC,OAAO,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAC7D,MAAM,IAAI,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IACzC,IAAI,IAAI;QAAE,eAAe,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAExC,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC;IAC7D,IAAI,aAAa,EAAE,CAAC;QAClB,oBAAoB,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IAC9C,CAAC;SAAM,CAAC;QACN,wBAAwB,CAAC,MAAM,CAAC,CAAC;IACnC,CAAC;IAED,iBAAiB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAEnC,OAAO,cAAc,CAAC,MAAM,CAAC,CAAC;AAChC,CAAC;AAED,SAAS,aAAa;IACpB,OAAO;QACL,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE,EAAE;QACR,uBAAuB,EAAE,CAAC;QAC1B,wBAAwB,EAAE,mCAAmC;QAC7D,eAAe,EAAE,oBAAoB;QACrC,SAAS,EAAE,EAAE;QACb,gBAAgB,EAAE,0BAA0B;QAC5C,cAAc,EAAE,CAAC,oBAAoB,EAAE,oBAAoB,CAAC;KAC7D,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,MAAmB;IACzC,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC;QAC3B,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IAC5D,CAAC;IACD,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC;QAC3B,MAAM,CAAC,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC;IACvC,CAAC;IACD,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,CAAC;QAClC,MAAM,CAAC,eAAe,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;IACzD,CAAC;IACD,4EAA4E;IAC5E,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC;IAChD,IAAI,UAAU,EAAE,CAAC;QACf,MAAM,CAAC,IAAI,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;YAC/C,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACnC,IAAI,QAAQ,KAAK,CAAC,CAAC,EAAE,CAAC;gBACpB,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC;YACzC,CAAC;YACD,OAAO;gBACL,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,IAAI,EAAE;gBACrC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE;aACrC,CAAC;QACJ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACzC,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CAAC,YAAgC,EAAE,YAAgC;IACzF,IAAI,YAAY;QAAE,OAAO,YAAY,CAAC;IACtC,IAAI,YAAY;QAAE,OAAO,YAAY,CAAC;IAEtC,MAAM,WAAW,GAAG,oBAAoB,EAAE,CAAC;IAC3C,IAAI,UAAU,CAAC,WAAW,CAAC;QAAE,OAAO,WAAW,CAAC;IAEhD,IAAI,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;QAC9B,MAAM,CAAC,IAAI,CAAC,8EAA8E,EAAE,WAAW,CAAC,CAAC;QACzG,OAAO,aAAa,CAAC;IACvB,CAAC;IACD,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,SAAS,iBAAiB,CAAC,QAAgB;IACzC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1B,MAAM,CAAC,IAAI,CAAC,gDAAgD,EAAE,QAAQ,CAAC,CAAC;QACxE,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC5C,MAAM,IAAI,GAAG,SAAS,CAAC,GAAG,CAAe,CAAC;QAC1C,MAAM,CAAC,IAAI,CAAC,uBAAuB,EAAE,QAAQ,CAAC,CAAC;QAC/C,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,EAAE,gCAAgC,EAAE,QAAQ,CAAC,CAAC;QAClE,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CAAC,MAAmB,EAAE,IAAgB;IAC5D,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS;QAAE,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;IACrD,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS;QAAE,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;IACrD,IAAI,IAAI,CAAC,eAAe,KAAK,SAAS;QAAE,MAAM,CAAC,eAAe,GAAG,IAAI,CAAC,eAAe,CAAC;IACtF,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS;QAAE,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;IACpE,IAAI,IAAI,CAAC,uBAAuB,KAAK,SAAS;QAAE,MAAM,CAAC,uBAAuB,GAAG,IAAI,CAAC,uBAAuB,CAAC;IAC9G,IAAI,IAAI,CAAC,wBAAwB,KAAK,SAAS;QAAE,MAAM,CAAC,wBAAwB,GAAG,IAAI,CAAC,wBAAwB,CAAC;IACjH,IAAI,IAAI,CAAC,gBAAgB,KAAK,SAAS;QAAE,MAAM,CAAC,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,CAAC;IACzF,IAAI,IAAI,CAAC,cAAc,KAAK,SAAS;QAAE,MAAM,CAAC,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC;IACnF,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC;QAAE,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;AACjE,CAAC;AAED,SAAS,oBAAoB,CAAC,MAAmB,EAAE,aAAqB;IACtE,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,qBAAqB,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC;AAChF,CAAC;AAED,SAAS,qBAAqB,CAC5B,KAAqC,EACrC,aAAqB;IAErB,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IAC7C,IAAI,CAAC;QACH,OAAO,EAAE,GAAG,KAAK,EAAE,GAAG,EAAE,UAAU,CAAC,KAAK,CAAC,GAAG,EAAE,aAAa,CAAC,EAAE,CAAC;IACjE,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,CAAC,KAAK,CACV,gCAAgC,EAChC,KAAK,CAAC,KAAK,EACX,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CACjD,CAAC;QACF,MAAM,IAAI,KAAK,CAAC,8BAA8B,KAAK,CAAC,KAAK,sCAAsC,CAAC,CAAC;IACnG,CAAC;AACH,CAAC;AAED,SAAS,wBAAwB,CAAC,MAAmB;IACnD,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACvE,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CACb,SAAS,aAAa,CAAC,MAAM,sFAAsF,CACpH,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAS,iBAAiB,CAAC,MAAmB,EAAE,OAA+B;IAC7E,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAClD,CAAC;IACD,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,MAAM,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAC7B,CAAC;AACH,CAAC"}
@@ -8,22 +8,23 @@ export declare const DEFAULT_PORT = 3000;
8
8
  export declare const DEFAULT_HOST = "127.0.0.1";
9
9
  export declare const DEFAULT_CIRCUIT_BREAKER_COOLDOWN_MS = 60000;
10
10
  export declare const DEFAULT_REQUEST_TIMEOUT_MS = 30000;
11
- export declare const DEFAULT_SCRAPE_INTERVAL_MS = 90000;
12
- export declare const MIN_SCRAPE_INTERVAL_MS = 10000;
13
- export declare const MAX_SCRAPE_INTERVAL_MS = 3600000;
14
11
  export declare const MIN_KEY_LENGTH = 20;
15
12
  export declare const API_KEY_PREFIX = "sk-";
16
13
  export declare const DEFAULT_UPSTREAM_URL = "https://opencode.ai";
14
+ export declare const DEFAULT_UPSTREAM_OPENCODE_GO = "https://opencode.ai";
15
+ export declare const DEFAULT_UPSTREAM_COMMANDCODE = "https://api.commandcode.ai";
17
16
  export declare const MAX_BODY_SIZE: number;
18
17
  export declare const MAX_RETRIES = 2;
19
18
  export declare const RATE_LIMIT_WINDOW_MS = 60000;
20
19
  export declare const RATE_LIMIT_MAX = 100;
21
20
  export declare const FORCE_SHUTDOWN_TIMEOUT_MS = 5000;
22
21
  export declare const MAX_STREAMING_BUFFER = 10000;
23
- export declare const DEFAULT_USAGE_THRESHOLD = 50;
24
- export declare const WORKSPACE_ID_REGEX: RegExp;
25
22
  export declare const MODELS_FETCH_TIMEOUT_MS = 5000;
26
23
  export declare const MODELS_WARM_BUFFER_MS = 60000;
24
+ export declare const USAGE_REFRESH_TTL_MS = 60000;
25
+ export declare const USAGE_FETCH_TIMEOUT_MS = 10000;
26
+ export declare const USAGE_PATH = "/zen/go/v1/usage";
27
+ export declare const MODEL_STATS_SAVE_DEBOUNCE_MS = 5000;
27
28
  export declare const MODELS_DEV_URL = "https://models.dev/api.json";
28
29
  export declare const MODELS_DEV_CACHE_TTL_MS: number;
29
30
  export declare const MODELS_DEV_TIMEOUT_MS = 10000;
package/dist/constants.js CHANGED
@@ -8,22 +8,27 @@ export const DEFAULT_PORT = 3000;
8
8
  export const DEFAULT_HOST = '127.0.0.1';
9
9
  export const DEFAULT_CIRCUIT_BREAKER_COOLDOWN_MS = 60_000;
10
10
  export const DEFAULT_REQUEST_TIMEOUT_MS = 30_000;
11
- export const DEFAULT_SCRAPE_INTERVAL_MS = 90_000;
12
- export const MIN_SCRAPE_INTERVAL_MS = 10_000;
13
- export const MAX_SCRAPE_INTERVAL_MS = 3_600_000;
14
11
  export const MIN_KEY_LENGTH = 20;
15
12
  export const API_KEY_PREFIX = 'sk-';
16
13
  export const DEFAULT_UPSTREAM_URL = 'https://opencode.ai';
14
+ // Multi-provider upstreams (overridable via config `upstreams:` map).
15
+ // Chat route prefixes live on the provider adapters (chatBasePath).
16
+ export const DEFAULT_UPSTREAM_OPENCODE_GO = DEFAULT_UPSTREAM_URL;
17
+ export const DEFAULT_UPSTREAM_COMMANDCODE = 'https://api.commandcode.ai';
17
18
  export const MAX_BODY_SIZE = 10 * 1024 * 1024;
18
19
  export const MAX_RETRIES = 2;
19
20
  export const RATE_LIMIT_WINDOW_MS = 60_000;
20
21
  export const RATE_LIMIT_MAX = 100;
21
22
  export const FORCE_SHUTDOWN_TIMEOUT_MS = 5_000;
22
23
  export const MAX_STREAMING_BUFFER = 10_000;
23
- export const DEFAULT_USAGE_THRESHOLD = 50;
24
- export const WORKSPACE_ID_REGEX = /^wrk_[A-Za-z0-9]+$/;
25
24
  export const MODELS_FETCH_TIMEOUT_MS = 5_000;
26
25
  export const MODELS_WARM_BUFFER_MS = 60_000;
26
+ // Per-key usage tracking (upstream usage API + weighted rotation)
27
+ export const USAGE_REFRESH_TTL_MS = 60_000; // min interval between upstream refreshes
28
+ export const USAGE_FETCH_TIMEOUT_MS = 10_000;
29
+ export const USAGE_PATH = '/zen/go/v1/usage';
30
+ // Model request counters (persisted for `saros-proxy usage`)
31
+ export const MODEL_STATS_SAVE_DEBOUNCE_MS = 5_000;
27
32
  // models.dev canonical metadata
28
33
  export const MODELS_DEV_URL = 'https://models.dev/api.json';
29
34
  export const MODELS_DEV_CACHE_TTL_MS = 5 * 60 * 1000; // 5 minutes
@@ -1 +1 @@
1
- {"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -13,10 +13,11 @@ import { dirname, resolve } from 'node:path';
13
13
  import { fileURLToPath } from 'node:url';
14
14
  import { loadConfig } from './config.js';
15
15
  import { createProxyApp } from './proxy.js';
16
+ import { flushModelStats } from './model-stats.js';
16
17
  import { logger, maskKey } from './logger.js';
17
- import { startScraper, stopScraper } from './scraper.js';
18
18
  import { FORCE_SHUTDOWN_TIMEOUT_MS } from './constants.js';
19
19
  import { daemonStart, daemonStop, daemonStatus, daemonRestart } from './cli/daemon.js';
20
+ import { runUsageCommand } from './cli/usage.js';
20
21
  import { getDefaultOpencodeConfigPath } from './cli/opencode-config.js';
21
22
  import { autostartInstall, autostartUninstall, autostartStatus } from './cli/autostart.js';
22
23
  import { checkForUpdate } from './cli/update-check.js';
@@ -91,22 +92,6 @@ else if (subcommand === 'restart') {
91
92
  daemonRestart(port, configPath);
92
93
  // daemonRestart owns its own exit path via setTimeout -> daemonStart
93
94
  }
94
- else if (subcommand === 'sync-models') {
95
- const results = await syncModelsInAllHarnesses(undefined, { offline: true });
96
- if (results.length === 0) {
97
- console.error(chalk.red('✗ No harnesses enabled. Run `saros-proxy configharness` first.'));
98
- process.exit(1);
99
- }
100
- for (const r of results) {
101
- if (r.result.success) {
102
- console.log(chalk.green(`✓ ${r.harness} synced to ${r.result.path}`));
103
- }
104
- else {
105
- console.error(chalk.red(`✗ ${r.harness}: ${r.result.error}`));
106
- }
107
- }
108
- process.exit(results.every((r) => r.result.success) ? 0 : 1);
109
- }
110
95
  else if (subcommand === 'setup') {
111
96
  const { setup } = await import('./cli/setup.js');
112
97
  const { getDefaultConfigPath } = await import('./config.js');
@@ -288,9 +273,11 @@ else if (subcommand === 'probe') {
288
273
  console.log(chalk.dim(`\nSummary: ${toProbe.length + cached.length}/${modelsToProbe.length} models probed, ${cached.length} skipped (cached)`));
289
274
  process.exit(0);
290
275
  }
276
+ else if (subcommand === 'usage') {
277
+ process.exit(await runUsageCommand());
278
+ }
291
279
  else if (subcommand === 'serve') {
292
280
  // -----------------------------------------------------------------------
293
- // `serve` — run proxy in foreground (also what the daemon child spawns).
294
281
  // --port/--config are picked up by loadConfig()'s CLI-arg parsing.
295
282
  // -----------------------------------------------------------------------
296
283
  let config;
@@ -331,12 +318,6 @@ else if (subcommand === 'serve') {
331
318
  logger.info('Proxy listening on http://%s:%d', info.address, info.port);
332
319
  logger.info('Upstream: %s', config.upstreamBaseUrl);
333
320
  logger.info('API keys loaded: %d', config.keys.length);
334
- if (config.scraping?.enabled && config.scraping.accounts.length > 0) {
335
- startScraper(config.scraping.accounts, config.scraping.intervalMs);
336
- }
337
- else {
338
- logger.info('Usage-based scraping disabled (not configured or no accounts)');
339
- }
340
321
  });
341
322
  // -----------------------------------------------------------------------
342
323
  // Graceful shutdown
@@ -347,7 +328,8 @@ else if (subcommand === 'serve') {
347
328
  return;
348
329
  isShuttingDown = true;
349
330
  logger.info('Received %s, starting graceful shutdown...', signal);
350
- stopScraper();
331
+ // Persist model counters that are still sitting in the debounce window
332
+ flushModelStats();
351
333
  server.close(() => {
352
334
  logger.info('Server closed');
353
335
  process.exit(0);