offrouter-core 0.5.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (90) hide show
  1. package/dist/audit.d.ts +51 -2
  2. package/dist/audit.d.ts.map +1 -1
  3. package/dist/audit.js +60 -3
  4. package/dist/audit.js.map +1 -1
  5. package/dist/config.d.ts +26 -0
  6. package/dist/config.d.ts.map +1 -1
  7. package/dist/config.js +160 -1
  8. package/dist/config.js.map +1 -1
  9. package/dist/delegation.d.ts +40 -0
  10. package/dist/delegation.d.ts.map +1 -1
  11. package/dist/delegation.js +169 -8
  12. package/dist/delegation.js.map +1 -1
  13. package/dist/index.d.ts +27 -13
  14. package/dist/index.d.ts.map +1 -1
  15. package/dist/index.js +15 -7
  16. package/dist/index.js.map +1 -1
  17. package/dist/llm-judge.d.ts +41 -0
  18. package/dist/llm-judge.d.ts.map +1 -0
  19. package/dist/llm-judge.js +159 -0
  20. package/dist/llm-judge.js.map +1 -0
  21. package/dist/policy.d.ts +77 -0
  22. package/dist/policy.d.ts.map +1 -1
  23. package/dist/policy.js +81 -0
  24. package/dist/policy.js.map +1 -1
  25. package/dist/provider-health.d.ts +129 -0
  26. package/dist/provider-health.d.ts.map +1 -0
  27. package/dist/provider-health.js +423 -0
  28. package/dist/provider-health.js.map +1 -0
  29. package/dist/providers/catalog-data.d.ts +7 -0
  30. package/dist/providers/catalog-data.d.ts.map +1 -1
  31. package/dist/providers/catalog-data.js +140 -53
  32. package/dist/providers/catalog-data.js.map +1 -1
  33. package/dist/providers/catalog.d.ts +3 -3
  34. package/dist/providers/catalog.d.ts.map +1 -1
  35. package/dist/providers/catalog.js +1 -0
  36. package/dist/providers/catalog.js.map +1 -1
  37. package/dist/proxy/anthropic-mapper.d.ts +585 -0
  38. package/dist/proxy/anthropic-mapper.d.ts.map +1 -0
  39. package/dist/proxy/anthropic-mapper.js +539 -0
  40. package/dist/proxy/anthropic-mapper.js.map +1 -0
  41. package/dist/proxy/anthropic-server.d.ts +24 -0
  42. package/dist/proxy/anthropic-server.d.ts.map +1 -0
  43. package/dist/proxy/anthropic-server.js +606 -0
  44. package/dist/proxy/anthropic-server.js.map +1 -0
  45. package/dist/proxy/classify.d.ts +17 -0
  46. package/dist/proxy/classify.d.ts.map +1 -0
  47. package/dist/proxy/classify.js +65 -0
  48. package/dist/proxy/classify.js.map +1 -0
  49. package/dist/proxy/responses-mapper.d.ts +15 -0
  50. package/dist/proxy/responses-mapper.d.ts.map +1 -1
  51. package/dist/proxy/responses-mapper.js +9 -2
  52. package/dist/proxy/responses-mapper.js.map +1 -1
  53. package/dist/proxy/responses-server.d.ts.map +1 -1
  54. package/dist/proxy/responses-server.js +14 -1
  55. package/dist/proxy/responses-server.js.map +1 -1
  56. package/dist/router.d.ts +36 -2
  57. package/dist/router.d.ts.map +1 -1
  58. package/dist/router.js +158 -23
  59. package/dist/router.js.map +1 -1
  60. package/dist/schemas.d.ts +115 -34
  61. package/dist/schemas.d.ts.map +1 -1
  62. package/dist/schemas.js +35 -0
  63. package/dist/schemas.js.map +1 -1
  64. package/dist/secret-scan.d.ts +40 -0
  65. package/dist/secret-scan.d.ts.map +1 -0
  66. package/dist/secret-scan.js +125 -0
  67. package/dist/secret-scan.js.map +1 -0
  68. package/dist/secrets.d.ts +77 -6
  69. package/dist/secrets.d.ts.map +1 -1
  70. package/dist/secrets.js +356 -32
  71. package/dist/secrets.js.map +1 -1
  72. package/dist/spend.d.ts +122 -0
  73. package/dist/spend.d.ts.map +1 -0
  74. package/dist/spend.js +279 -0
  75. package/dist/spend.js.map +1 -0
  76. package/dist/task-classifier.d.ts +45 -0
  77. package/dist/task-classifier.d.ts.map +1 -0
  78. package/dist/task-classifier.js +153 -0
  79. package/dist/task-classifier.js.map +1 -0
  80. package/dist/types.d.ts +46 -1
  81. package/dist/types.d.ts.map +1 -1
  82. package/dist/usage-file.d.ts +2 -6
  83. package/dist/usage-file.d.ts.map +1 -1
  84. package/dist/usage-file.js +64 -6
  85. package/dist/usage-file.js.map +1 -1
  86. package/dist/usage.d.ts +64 -10
  87. package/dist/usage.d.ts.map +1 -1
  88. package/dist/usage.js +79 -5
  89. package/dist/usage.js.map +1 -1
  90. package/package.json +1 -1
package/dist/secrets.js CHANGED
@@ -3,37 +3,63 @@
3
3
  *
4
4
  * Secrets are stored only by OffRouter under user control:
5
5
  * - FileSecretStore: `secrets.json` fallback (chmod 0600 on POSIX)
6
- * - KeychainSecretStore: OS keychain boundary/stub for real runs
6
+ * - KeychainSecretStore: macOS Keychain via `/usr/bin/security` (darwin only)
7
7
  *
8
8
  * Never scrapes, copies, or reverse-engineers credentials from other CLIs.
9
9
  * No network access. No live credential discovery.
10
10
  */
11
11
  import { readFileSync } from "node:fs";
12
12
  import { mkdir, readFile, rename, unlink, writeFile, chmod, } from "node:fs/promises";
13
- import { dirname } from "node:path";
13
+ import { dirname, join } from "node:path";
14
14
  import { randomBytes } from "node:crypto";
15
- /** Placeholder substituted for secret material in log-safe strings. */
15
+ import { execFile as execFileCallback } from "node:child_process";
16
+ import { promisify } from "node:util";
17
+ import { homedir as osHomedir } from "node:os";
18
+ const execFileAsync = promisify(execFileCallback);
16
19
  /** Placeholder substituted for secret material in log-safe strings. */
17
20
  export const REDACTED = "[REDACTED]";
18
21
  const DEFAULT_KEYCHAIN_SERVICE = "offrouter";
22
+ const DEFAULT_KEYCHAIN_SCOPE = "default";
19
23
  const DEFAULT_ACCOUNT_PREFIX = "provider:";
20
- /**
21
- * Common API-key / token shapes seen in provider error messages.
22
- * Patterns are intentionally conservative (long alphabetic payload)
23
- * to avoid eating short unrelated tokens while still catching leaks.
24
- */
25
- const API_KEY_PATTERNS = [
24
+ const DEFAULT_SECURITY_PATH = "/usr/bin/security";
25
+ /** security(1) exit status when a generic-password item is not found. */
26
+ const SECURITY_ERR_SEC_ITEM_NOT_FOUND = 44;
27
+ const KEYCHAIN_UNAVAILABLE_MESSAGE = "OS keychain backend is not wired in this OffRouter build. " +
28
+ "OffRouter will not scrape other CLI credential stores. Use FileSecretStore for tests, or approve an " +
29
+ "explicit file fallback for real runs when keychain is unavailable.";
30
+ export const SECRET_PATTERNS = [
26
31
  // Anthropic: sk-ant-...
27
- /\bsk-ant-[a-zA-Z0-9_-]{16,}\b/g,
28
- // OpenAI / OpenRouter-style: sk-... (including sk-live-, sk-proj-, etc.)
29
- /\bsk-[a-zA-Z0-9_-]{16,}\b/g,
32
+ { name: "anthropic_api_key", pattern: /\bsk-ant-[a-zA-Z0-9_-]{16,}\b/g },
33
+ // OpenAI project / service-account style (before generic sk-)
34
+ { name: "openai_project_key", pattern: /\bsk-proj-[a-zA-Z0-9_-]{16,}\b/g },
35
+ // OpenAI / OpenRouter-style: sk-... (including sk-live-, etc.)
36
+ { name: "openai_api_key", pattern: /\bsk-[a-zA-Z0-9_-]{16,}\b/g },
30
37
  // Google API keys
31
- /\bAIza[0-9A-Za-z_-]{20,}\b/g,
38
+ { name: "google_api_key", pattern: /\bAIza[0-9A-Za-z_-]{20,}\b/g },
32
39
  // Bearer tokens in Authorization headers / log lines
33
- /\bBearer\s+[A-Za-z0-9._\-+=/]{16,}\b/gi,
34
- // OpenAI project / service-account style
35
- /\bsk-proj-[a-zA-Z0-9_-]{16,}\b/g,
40
+ {
41
+ name: "bearer_token",
42
+ pattern: /\bBearer\s+[A-Za-z0-9._\-+=/]{16,}\b/gi,
43
+ },
44
+ // Slack bot tokens
45
+ { name: "slack_bot_token", pattern: /\bxoxb-[0-9A-Za-z-]{10,}\b/g },
46
+ // GitHub personal access tokens (classic)
47
+ { name: "github_pat", pattern: /\bghp_[A-Za-z0-9]{20,}\b/g },
48
+ // AWS access key IDs
49
+ { name: "aws_access_key_id", pattern: /\bAKIA[0-9A-Z]{16}\b/g },
50
+ // PEM private key headers
51
+ {
52
+ name: "pem_private_key",
53
+ pattern: /-----BEGIN (?:RSA |EC |OPENSSH )?PRIVATE KEY-----/g,
54
+ },
55
+ // Generic key=value / key: value where the key name looks secret-ish
56
+ {
57
+ name: "generic_secret_assignment",
58
+ pattern: /\b(?:api[_-]?key|secret[_-]?key|access[_-]?token|auth[_-]?token|private[_-]?key|client[_-]?secret)\b\s*[=:]\s*["']?[^\s"']{8,}/gi,
59
+ },
36
60
  ];
61
+ /** Flat list used by redact() — same patterns, name discarded. */
62
+ const API_KEY_PATTERNS = SECRET_PATTERNS.map((p) => p.pattern);
37
63
  function assertProviderId(providerId) {
38
64
  if (typeof providerId !== "string" || providerId.trim() === "") {
39
65
  throw new TypeError("providerId must be a non-empty string");
@@ -216,57 +242,355 @@ export class KeychainUnavailableError extends Error {
216
242
  this.name = "KeychainUnavailableError";
217
243
  }
218
244
  }
245
+ function defaultKeychainIndexPath() {
246
+ const override = process.env.OFFROUTER_HOME?.trim();
247
+ const home = override && override.length > 0 ? override : join(osHomedir(), ".offrouter");
248
+ return join(home, "keychain-index.json");
249
+ }
250
+ function asExecError(err) {
251
+ if (err && typeof err === "object") {
252
+ return err;
253
+ }
254
+ return { message: String(err) };
255
+ }
256
+ function bufferToString(value) {
257
+ if (value == null)
258
+ return "";
259
+ return typeof value === "string" ? value : value.toString("utf8");
260
+ }
261
+ /** Encode utf8 bytes as lowercase hex for `security ... -X`. */
262
+ function toHexUtf8(value) {
263
+ return Buffer.from(value, "utf8").toString("hex");
264
+ }
265
+ /**
266
+ * Escape a token for a single-line `security -i` command so account/service
267
+ * ids with spaces or quotes cannot break the interactive command line.
268
+ * Hex passwords (`-X`) are [0-9a-f] only and need no further escaping.
269
+ */
270
+ function securityInteractiveToken(value) {
271
+ // Reject control chars / newlines that would break the -i command stream.
272
+ if (value.includes("\r") || value.includes("\n") || value.includes("\0")) {
273
+ throw new TypeError("keychain attribute must not contain CR, LF, or NUL");
274
+ }
275
+ if (/^[A-Za-z0-9_.:@/+-]+$/.test(value)) {
276
+ return value;
277
+ }
278
+ // Double-quote and escape embedded quotes/backslashes.
279
+ const escaped = value.replace(/\\/g, "\\\\").replace(/"/g, '\\"');
280
+ return `"${escaped}"`;
281
+ }
219
282
  /**
220
- * OS keychain boundary for real runs.
283
+ * macOS Keychain-backed secret store.
221
284
  *
222
- * V1 ships this as a typed stub: it never scrapes other CLIs and does not
223
- * perform network I/O. Get/set/delete/list reject with KeychainUnavailableError
224
- * until a platform backend is wired. Prefer this store at the seams of real
225
- * runs once keychain support lands; tests and dry runs use FileSecretStore.
285
+ * Uses `/usr/bin/security` via `child_process.execFile` (argv only never a
286
+ * shell). OffRouter only reads entries it wrote under the namespaced service
287
+ * `${service}:${scope}` (default `offrouter:default`). Account names are
288
+ * `${accountPrefix}${providerId}` (default `provider:<id>`).
289
+ *
290
+ * Secret values are written via `security -i` (interactive command mode):
291
+ * a single `add-generic-password ... -U -X <hex>` line is sent on stdin. The
292
+ * process argv is only `security -i`, so the secret never appears in `ps`.
293
+ * (Bare `security add-generic-password -w` without a value reads `/dev/tty`,
294
+ * not a pipe — that path is intentionally avoided.)
295
+ *
296
+ * Listing cannot be done safely via `security dump-keychain` (it dumps the
297
+ * entire keychain). Instead, a non-secret index of provider ids is maintained
298
+ * at `indexPath` (default `$OFFROUTER_HOME/keychain-index.json`). The index
299
+ * never contains secret values and is written with mode 0600.
300
+ *
301
+ * Non-darwin platforms throw KeychainUnavailableError with the same message
302
+ * shape historical callers expect (`OS keychain backend is not wired...`).
303
+ * Tests must inject `execFile` and must never touch the real keychain.
226
304
  */
227
305
  export class KeychainSecretStore {
228
306
  service;
229
307
  accountPrefix;
308
+ scope;
309
+ indexPath;
310
+ securityPath;
311
+ #platform;
312
+ #execFile;
313
+ #fs;
314
+ #available;
315
+ /** In-process cache of secrets known to this instance (for redact only). */
316
+ #knownSecrets = new Map();
230
317
  constructor(options = {}) {
231
318
  this.service = options.service?.trim() || DEFAULT_KEYCHAIN_SERVICE;
232
319
  this.accountPrefix =
233
320
  options.accountPrefix === undefined
234
321
  ? DEFAULT_ACCOUNT_PREFIX
235
322
  : options.accountPrefix;
323
+ this.scope = options.scope?.trim() || DEFAULT_KEYCHAIN_SCOPE;
324
+ this.indexPath = options.indexPath ?? defaultKeychainIndexPath();
325
+ this.securityPath = options.securityPath ?? DEFAULT_SECURITY_PATH;
326
+ this.#platform = options.platform ?? process.platform;
327
+ this.#execFile = options.execFile ?? execFileAsync;
328
+ this.#fs = {
329
+ mkdir,
330
+ readFile,
331
+ rename,
332
+ unlink,
333
+ writeFile,
334
+ chmod,
335
+ ...options.fileSystem,
336
+ };
337
+ this.#available = this.#platform === "darwin";
338
+ }
339
+ /** security(1) `-s` service string: `offrouter:<scope>`. */
340
+ get securityService() {
341
+ return `${this.service}:${this.scope}`;
236
342
  }
237
343
  async get(providerId) {
238
344
  assertProviderId(providerId);
239
- this.#reject("get");
345
+ this.#ensureAvailable("get");
346
+ const account = this.#accountName(providerId);
347
+ try {
348
+ const { stdout } = await this.#runSecurity(["find-generic-password", "-a", account, "-s", this.securityService, "-w"], { secretForScrub: undefined });
349
+ // security -w prints the password followed by a trailing newline.
350
+ const value = bufferToString(stdout).replace(/\r?\n$/, "");
351
+ if (value.length === 0) {
352
+ return undefined;
353
+ }
354
+ this.#knownSecrets.set(providerId, value);
355
+ return value;
356
+ }
357
+ catch (err) {
358
+ if (this.#isNotFound(err)) {
359
+ return undefined;
360
+ }
361
+ throw this.#wrapSecurityError("get", err);
362
+ }
240
363
  }
241
364
  async set(providerId, secret) {
242
365
  assertProviderId(providerId);
243
366
  assertSecret(secret);
244
- this.#reject("set");
367
+ this.#ensureAvailable("set");
368
+ const account = this.#accountName(providerId);
369
+ // security -i reads commands from stdin. Password is hex-encoded via -X so
370
+ // the raw secret never lands in process argv (visible to `ps`). Bare
371
+ // `add-generic-password -w` without a value reads /dev/tty, not a pipe.
372
+ const hex = toHexUtf8(secret);
373
+ const command = [
374
+ "add-generic-password",
375
+ "-a",
376
+ securityInteractiveToken(account),
377
+ "-s",
378
+ securityInteractiveToken(this.securityService),
379
+ "-U",
380
+ "-X",
381
+ hex,
382
+ ].join(" ") + "\n";
383
+ try {
384
+ await this.#runSecurity(["-i"], {
385
+ input: command,
386
+ secretForScrub: secret,
387
+ extraScrub: [hex],
388
+ });
389
+ }
390
+ catch (err) {
391
+ throw this.#wrapSecurityError("set", err, secret, [hex]);
392
+ }
393
+ this.#knownSecrets.set(providerId, secret);
394
+ await this.#indexAdd(providerId);
245
395
  }
246
396
  async delete(providerId) {
247
397
  assertProviderId(providerId);
248
- this.#reject("delete");
398
+ this.#ensureAvailable("delete");
399
+ const account = this.#accountName(providerId);
400
+ try {
401
+ await this.#runSecurity(["delete-generic-password", "-a", account, "-s", this.securityService], { secretForScrub: this.#knownSecrets.get(providerId) });
402
+ }
403
+ catch (err) {
404
+ if (this.#isNotFound(err)) {
405
+ // Match FileSecretStore: delete of missing id is a no-op.
406
+ this.#knownSecrets.delete(providerId);
407
+ await this.#indexRemove(providerId);
408
+ return;
409
+ }
410
+ throw this.#wrapSecurityError("delete", err, this.#knownSecrets.get(providerId));
411
+ }
412
+ this.#knownSecrets.delete(providerId);
413
+ await this.#indexRemove(providerId);
249
414
  }
250
415
  async listProviders() {
251
- this.#reject("listProviders");
416
+ this.#ensureAvailable("listProviders");
417
+ const doc = await this.#loadIndex();
418
+ return [...doc.providers].sort((a, b) => a.localeCompare(b));
252
419
  }
253
420
  redact(value) {
254
- // Stub holds no secrets in-process; still scrub common API key shapes.
255
- return redact(value);
421
+ return redact(value, this.#knownSecrets.values());
256
422
  }
257
423
  toJSON() {
258
424
  return {
259
425
  kind: "keychain",
260
426
  service: this.service,
261
427
  accountPrefix: this.accountPrefix,
262
- available: false,
428
+ scope: this.scope,
429
+ securityService: this.securityService,
430
+ indexPath: this.indexPath,
431
+ available: this.#available,
432
+ // Never include secret values. Provider ids come from the non-secret index
433
+ // only when already loaded into #knownSecrets keys + index is not re-read
434
+ // synchronously here (toJSON must not throw / hit the network/keychain).
435
+ providers: [...this.#knownSecrets.keys()].sort((a, b) => a.localeCompare(b)),
263
436
  };
264
437
  }
265
- #reject(operation) {
266
- throw new KeychainUnavailableError(`KeychainSecretStore.${operation} is unavailable: OS keychain backend is not wired in this OffRouter build. ` +
267
- `OffRouter will not scrape other CLI credential stores. Use FileSecretStore for tests, or approve an ` +
268
- `explicit file fallback for real runs when keychain is unavailable.`);
438
+ #accountName(providerId) {
439
+ return `${this.accountPrefix}${providerId}`;
440
+ }
441
+ #ensureAvailable(operation) {
442
+ if (!this.#available) {
443
+ throw new KeychainUnavailableError(`KeychainSecretStore.${operation} is unavailable: ${KEYCHAIN_UNAVAILABLE_MESSAGE}`);
444
+ }
445
+ }
446
+ #isNotFound(err) {
447
+ const e = asExecError(err);
448
+ // Node sets err.code to the numeric exit status for execFile failures.
449
+ const status = typeof e.code === "number"
450
+ ? e.code
451
+ : typeof e.status === "number"
452
+ ? e.status
453
+ : undefined;
454
+ return status === SECURITY_ERR_SEC_ITEM_NOT_FOUND;
455
+ }
456
+ async #runSecurity(args, options) {
457
+ const execOptions = {
458
+ // Never invoke via a shell — args stay as argv.
459
+ shell: false,
460
+ maxBuffer: 1024 * 1024,
461
+ encoding: "utf8",
462
+ };
463
+ if (options.input !== undefined) {
464
+ execOptions.input = options.input;
465
+ }
466
+ try {
467
+ return await this.#execFile(this.securityPath, args, execOptions);
468
+ }
469
+ catch (err) {
470
+ const scrubList = [
471
+ ...(options.secretForScrub ? [options.secretForScrub] : []),
472
+ ...(options.extraScrub ?? []),
473
+ ].filter((s) => s.length > 0);
474
+ if (scrubList.length === 0) {
475
+ throw err;
476
+ }
477
+ const e = asExecError(err);
478
+ const rawMessage = typeof e.message === "string" ? e.message : String(err);
479
+ const rawStderr = bufferToString(e.stderr);
480
+ const needsScrub = scrubList.some((s) => rawMessage.includes(s) || rawStderr.includes(s));
481
+ if (!needsScrub) {
482
+ throw err;
483
+ }
484
+ const scrubbed = new Error(redact(rawMessage, scrubList));
485
+ scrubbed.code = e.code;
486
+ scrubbed.status = e.status;
487
+ scrubbed.stdout = e.stdout;
488
+ scrubbed.stderr = redact(rawStderr, scrubList);
489
+ throw scrubbed;
490
+ }
491
+ }
492
+ #wrapSecurityError(operation, err, secret, extraScrub = []) {
493
+ const e = asExecError(err);
494
+ const rawStderr = bufferToString(e.stderr);
495
+ const rawMessage = typeof e.message === "string" ? e.message : String(err);
496
+ const known = [
497
+ ...(secret ? [secret] : []),
498
+ ...extraScrub,
499
+ ...this.#knownSecrets.values(),
500
+ ];
501
+ const safeStderr = redact(rawStderr, known);
502
+ const safeMessage = redact(rawMessage, known);
503
+ const detail = safeStderr.trim() || safeMessage;
504
+ const wrapped = new Error(`KeychainSecretStore.${operation} failed via security(1): ${detail}`);
505
+ // Never attach the original err as cause if it might embed the secret;
506
+ // preserve exit status only.
507
+ wrapped.exitCode =
508
+ typeof e.code === "number" || typeof e.code === "string" ? e.code : e.status;
509
+ return wrapped;
510
+ }
511
+ async #loadIndex() {
512
+ try {
513
+ const raw = await this.#fs.readFile(this.indexPath, "utf8");
514
+ return parseKeychainIndex(raw, this.indexPath);
515
+ }
516
+ catch (err) {
517
+ if (err &&
518
+ typeof err === "object" &&
519
+ "code" in err &&
520
+ err.code === "ENOENT") {
521
+ return { version: 1, providers: [] };
522
+ }
523
+ throw err;
524
+ }
525
+ }
526
+ async #persistIndex(doc) {
527
+ await this.#fs.mkdir(dirname(this.indexPath), { recursive: true });
528
+ const payload = `${JSON.stringify({
529
+ version: 1,
530
+ providers: [...doc.providers].sort((a, b) => a.localeCompare(b)),
531
+ }, null, 2)}\n`;
532
+ const tmp = `${this.indexPath}.${randomBytes(8).toString("hex")}.tmp`;
533
+ try {
534
+ await this.#fs.writeFile(tmp, payload, { encoding: "utf8", mode: 0o600 });
535
+ await this.#fs.chmod(tmp, 0o600);
536
+ await this.#fs.rename(tmp, this.indexPath);
537
+ await this.#fs.chmod(this.indexPath, 0o600);
538
+ }
539
+ catch (err) {
540
+ await this.#fs.unlink(tmp).catch((unlinkErr) => {
541
+ if (unlinkErr &&
542
+ typeof unlinkErr === "object" &&
543
+ "code" in unlinkErr &&
544
+ unlinkErr.code === "ENOENT") {
545
+ return;
546
+ }
547
+ throw unlinkErr;
548
+ });
549
+ throw err;
550
+ }
551
+ }
552
+ async #indexAdd(providerId) {
553
+ const doc = await this.#loadIndex();
554
+ if (!doc.providers.includes(providerId)) {
555
+ doc.providers.push(providerId);
556
+ await this.#persistIndex(doc);
557
+ }
558
+ }
559
+ async #indexRemove(providerId) {
560
+ const doc = await this.#loadIndex();
561
+ const next = doc.providers.filter((id) => id !== providerId);
562
+ if (next.length !== doc.providers.length) {
563
+ await this.#persistIndex({ version: 1, providers: next });
564
+ }
565
+ }
566
+ }
567
+ function parseKeychainIndex(raw, filePath) {
568
+ let parsed;
569
+ try {
570
+ parsed = JSON.parse(raw);
571
+ }
572
+ catch (err) {
573
+ const message = err instanceof Error ? err.message : String(err);
574
+ throw new Error(`Invalid keychain index ${filePath}: ${message}`, {
575
+ cause: err,
576
+ });
577
+ }
578
+ if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) {
579
+ throw new Error(`Invalid keychain index ${filePath}: expected a JSON object`);
580
+ }
581
+ const record = parsed;
582
+ const providersRaw = record.providers;
583
+ if (!Array.isArray(providersRaw)) {
584
+ throw new Error(`Invalid keychain index ${filePath}: missing array field "providers"`);
585
+ }
586
+ const providers = [];
587
+ for (const entry of providersRaw) {
588
+ if (typeof entry !== "string" || entry.trim() === "") {
589
+ throw new Error(`Invalid keychain index ${filePath}: providers must be non-empty strings`);
590
+ }
591
+ providers.push(entry);
269
592
  }
593
+ return { version: 1, providers };
270
594
  }
271
595
  /**
272
596
  * Retrieve a provider token from the secret store.
@@ -1 +1 @@
1
- {"version":3,"file":"secrets.js","sourceRoot":"","sources":["../src/secrets.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"secrets.js","sourceRoot":"","sources":["../src/secrets.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,122 @@
1
+ /**
2
+ * Estimated paid API-key spend rollup for hard spend caps and `status --costs`.
3
+ *
4
+ * Extends the near-limit mechanism: near-limit warns on subscription quota,
5
+ * spend caps hard-block paid API-key candidates. Both read the same usage
6
+ * store; subscription and local tiers are never blocked by spend caps.
7
+ *
8
+ * Accounting window: the usage store today models a single cumulative window
9
+ * (per-account token totals persisted in usage.json; no time bucketing), so
10
+ * rollups cover everything recorded since the usage file was last reset.
11
+ *
12
+ * Spend estimation: per-account usage records (`used` = total tokens, keyed
13
+ * by providerId + accountId, which the delegation runtime sets to the model
14
+ * id) priced with the catalog PricingHint. When a per-model input/output
15
+ * breakdown is present, tokens are priced exactly (input rate × input +
16
+ * output rate × output). The unattributed remainder
17
+ * (`used - sum(model tokens)`) keeps the conservative max(input, output)
18
+ * rate treatment and flags costsIncomplete. Where pricing is unknown the
19
+ * contribution is not guessed: zero for cap math + costsIncomplete. Local
20
+ * runtimes are known-zero (no paid spend by definition).
21
+ */
22
+ import { type PricingHint } from "./providers/catalog-data.js";
23
+ import type { AccountUsageSnapshot, UsageStore } from "./usage.js";
24
+ /** Identifier for the accounting window the usage store currently models. */
25
+ export declare const SPEND_ACCOUNTING_WINDOW = "cumulative";
26
+ /** Hard spend caps in USD. Per-provider overrides beat the global cap. */
27
+ export interface SpendCaps {
28
+ globalUsd?: number;
29
+ perProviderUsd?: Record<string, number>;
30
+ }
31
+ export interface ModelSpendLine {
32
+ providerId: string;
33
+ /** Model id (the accountId dimension usage records are keyed by). */
34
+ modelId: string;
35
+ totalTokens: number;
36
+ /** Input tokens when a breakdown was recorded; undefined for legacy totals. */
37
+ inputTokens?: number;
38
+ /** Output tokens when a breakdown was recorded; undefined for legacy totals. */
39
+ outputTokens?: number;
40
+ /** Estimated USD; 0 when pricing is unknown (see costsIncomplete). */
41
+ estimatedUsd: number;
42
+ /** False when no pricing hint exists; estimate is then a lower bound of 0. */
43
+ pricingKnown: boolean;
44
+ /**
45
+ * True when this line was priced from an exact input/output split.
46
+ * False when the conservative max-rate treatment (or zero) was used.
47
+ */
48
+ exactPricing: boolean;
49
+ }
50
+ export interface ProviderSpendLine {
51
+ providerId: string;
52
+ totalTokens: number;
53
+ estimatedUsd: number;
54
+ /** True when any model usage for this provider had unknown pricing. */
55
+ costsIncomplete: boolean;
56
+ /** Applicable cap (per-provider override beats global), when configured. */
57
+ capUsd?: number;
58
+ /** max(0, cap - spend) when a cap is configured. */
59
+ remainingUsd?: number;
60
+ /** True when a cap is configured and spend meets/exceeds it. */
61
+ capExceeded: boolean;
62
+ models: ModelSpendLine[];
63
+ }
64
+ export interface SpendRollup {
65
+ /** Accounting window identifier (see SPEND_ACCOUNTING_WINDOW). */
66
+ window: string;
67
+ totalUsd: number;
68
+ /** True when any usage had unknown pricing; totals are then a lower bound. */
69
+ costsIncomplete: boolean;
70
+ /** Global cap, when configured. */
71
+ capUsd?: number;
72
+ /** max(0, global cap - total) when a global cap is configured. */
73
+ remainingUsd?: number;
74
+ /** True when a global cap is configured and the total meets/exceeds it. */
75
+ capExceeded: boolean;
76
+ providers: ProviderSpendLine[];
77
+ }
78
+ export interface BuildSpendRollupOptions {
79
+ caps?: SpendCaps;
80
+ /**
81
+ * Pricing lookup override for tests/custom catalogs. Defaults to the
82
+ * built-in catalog. Return undefined for unknown pricing.
83
+ */
84
+ pricing?: (providerId: string, modelId: string) => PricingHint | undefined;
85
+ }
86
+ /** Catalog pricing hint for a provider/model pair, when documented. */
87
+ export declare function pricingHintForModel(providerId: string, modelId: string): PricingHint | undefined;
88
+ /**
89
+ * Estimate USD for a token total under a pricing hint using the higher of
90
+ * the input/output rates (conservative upper bound). Used for unattributed
91
+ * remainder / legacy totals where the input/output split is unknown.
92
+ * Returns undefined when the hint carries no usable rate — unknown pricing
93
+ * is never guessed.
94
+ */
95
+ export declare function estimateTokensCostUsd(totalTokens: number, hint: PricingHint | undefined): number | undefined;
96
+ /**
97
+ * Estimate USD from an exact input/output split. Falls back to the
98
+ * single documented rate when only one side is known. Returns undefined
99
+ * when the hint carries no usable rate.
100
+ */
101
+ export declare function estimateSplitTokensCostUsd(inputTokens: number, outputTokens: number, hint: PricingHint | undefined): number | undefined;
102
+ /**
103
+ * Build a spend rollup from per-account usage records. Pure and
104
+ * deterministic; providers and models are sorted by id like the usage stores.
105
+ *
106
+ * Only API-key usage counts toward paid spend. Subscription and local tiers
107
+ * are recorded as known-zero. Legacy records with no authTier are counted
108
+ * conservatively (as paid) but always mark the rollup costsIncomplete.
109
+ *
110
+ * When a per-model input/output breakdown is present, those tokens are priced
111
+ * exactly. Any unattributed remainder (aggregate `used` minus attributed
112
+ * tokens) is priced at the conservative max rate under the accountId model
113
+ * and flags costsIncomplete for that remainder.
114
+ */
115
+ export declare function buildSpendRollup(accounts: readonly AccountUsageSnapshot[], options?: BuildSpendRollupOptions): SpendRollup;
116
+ /**
117
+ * Build the `currentSpendByProviderUsd` map that PolicyConfig expects from a
118
+ * usage store. Non-fatal on the caller side: this helper throws when the
119
+ * store cannot be read so the caller can decide whether to swallow the error.
120
+ */
121
+ export declare function buildCurrentSpendByProviderUsd(store: UsageStore, options?: Pick<BuildSpendRollupOptions, "pricing">): Promise<Record<string, number>>;
122
+ //# sourceMappingURL=spend.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spend.d.ts","sourceRoot":"","sources":["../src/spend.ts"],"names":[],"mappings":"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"}