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/audit.d.ts CHANGED
@@ -1,10 +1,10 @@
1
- import type { FallbackChainEntry, FallbackReason, PolicyDenial, RouteDecision, RouteRequest, SelectedRoute } from "./types.js";
1
+ import type { ClassifierName, FallbackChainEntry, FallbackReason, PolicyDenial, RouteClassification, RouteDecision, RouteRequest, SelectedRoute } from "./types.js";
2
2
  /** Default max chars kept for an opt-in redacted prompt preview. */
3
3
  export declare const DEFAULT_PREVIEW_MAX_CHARS = 80;
4
4
  /** Cancellation lifecycle for an audited request/decision in-process. */
5
5
  export type CancellationState = "active" | "cancelled" | "completed";
6
6
  /** High-level audit event kind. */
7
- export type AuditRecordKind = "route_decision" | "api_key_fallback" | "cancellation";
7
+ export type AuditRecordKind = "route_decision" | "api_key_fallback" | "cancellation" | "outbound_secret_finding";
8
8
  /**
9
9
  * Append-only audit record. Intentionally omits raw prompt text.
10
10
  * `promptPreviewRedacted` appears only when explicitly requested at append.
@@ -32,11 +32,32 @@ export interface AuditRecord {
32
32
  fallbackChain?: FallbackChainEntry[];
33
33
  /** Explicit API-key fallback reason when paid capacity was used. */
34
34
  apiKeyFallbackReason?: FallbackReason | string;
35
+ /** True when an api-key route was used with explicit spend approval. */
36
+ apiSpendApproved?: boolean;
37
+ /** True when a subscription route was used with an explicit account-switch acknowledgment. */
38
+ switchApproved?: boolean;
35
39
  policyDenials?: PolicyDenial[];
36
40
  blocked?: boolean;
37
41
  needsConfiguration?: boolean;
42
+ /**
43
+ * Classifier signal copied from the route decision. Family / confidence /
44
+ * stable signal ids only — never prompt text.
45
+ */
46
+ classification?: RouteClassification;
47
+ /**
48
+ * Which classifier produced the recorded classification signal.
49
+ * Present when classification is recorded. Never prompt text.
50
+ */
51
+ classifierName?: ClassifierName;
38
52
  cancellationState?: CancellationState;
39
53
  cancelledAt?: string;
54
+ /**
55
+ * Credential pattern names matched in outbound content (outbound_secret_finding).
56
+ * Names only — never matched content, not even redacted excerpts.
57
+ */
58
+ secretPatternNames?: string[];
59
+ /** Enforcement mode in effect when findings were recorded. */
60
+ outboundSecretScanMode?: "block" | "warn" | "off";
40
61
  }
41
62
  export interface AppendDecisionOptions {
42
63
  /**
@@ -51,6 +72,10 @@ export interface AppendDecisionOptions {
51
72
  * Never stored; used only during redaction.
52
73
  */
53
74
  knownSecrets?: Iterable<string>;
75
+ /** Record that explicit api-spend approval accompanied this request. */
76
+ apiSpendApproved?: boolean;
77
+ /** Record that an explicit subscription account-switch acknowledgment accompanied this request. */
78
+ switchApproved?: boolean;
54
79
  /** Initial cancellation state; default "active" for successful routes. */
55
80
  cancellationState?: CancellationState;
56
81
  /** Override clock for tests. */
@@ -92,6 +117,20 @@ export interface AuditStore {
92
117
  markCompleted(requestId: string, options?: {
93
118
  now?: () => Date;
94
119
  }): Promise<AuditRecord | undefined>;
120
+ /**
121
+ * Record outbound secret-scan findings. Persists pattern names only —
122
+ * never matched content or redacted excerpts.
123
+ */
124
+ recordOutboundSecretFindings(input: {
125
+ requestId: string;
126
+ decisionId?: string;
127
+ promptDigest?: string;
128
+ patternNames: string[];
129
+ mode: "block" | "warn" | "off";
130
+ /** Free-text explanation; must not include matched secret values. */
131
+ explanation?: string;
132
+ now?: () => Date;
133
+ }): Promise<AuditRecord>;
95
134
  getCancellationState(requestId: string): Promise<CancellationState | undefined>;
96
135
  list(options?: ListAuditOptions): Promise<AuditRecord[]>;
97
136
  get(recordId: string): Promise<AuditRecord | undefined>;
@@ -107,6 +146,7 @@ export interface InMemoryAuditStoreOptions {
107
146
  knownSecrets?: Iterable<string>;
108
147
  now?: () => Date;
109
148
  }
149
+ export declare function clampPreview(text: string, maxChars: number): string;
110
150
  /**
111
151
  * In-memory audit store for tests and single-process V1 use.
112
152
  * Appends are serialized so concurrent writers cannot interleave corruptly.
@@ -129,6 +169,15 @@ export declare class InMemoryAuditStore implements AuditStore {
129
169
  markCompleted(requestId: string, options?: {
130
170
  now?: () => Date;
131
171
  }): Promise<AuditRecord | undefined>;
172
+ recordOutboundSecretFindings(input: {
173
+ requestId: string;
174
+ decisionId?: string;
175
+ promptDigest?: string;
176
+ patternNames: string[];
177
+ mode: "block" | "warn" | "off";
178
+ explanation?: string;
179
+ now?: () => Date;
180
+ }): Promise<AuditRecord>;
132
181
  getCancellationState(requestId: string): Promise<CancellationState | undefined>;
133
182
  list(options?: ListAuditOptions): Promise<AuditRecord[]>;
134
183
  get(recordId: string): Promise<AuditRecord | undefined>;
@@ -1 +1 @@
1
- {"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../src/audit.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../src/audit.ts"],"names":[],"mappings":"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"}
package/dist/audit.js CHANGED
@@ -14,7 +14,7 @@ export const DEFAULT_PREVIEW_MAX_CHARS = 80;
14
14
  function newId(prefix) {
15
15
  return `${prefix}_${randomBytes(8).toString("hex")}`;
16
16
  }
17
- function clampPreview(text, maxChars) {
17
+ export function clampPreview(text, maxChars) {
18
18
  if (text.length <= maxChars)
19
19
  return text;
20
20
  return `${text.slice(0, Math.max(0, maxChars - 1))}…`;
@@ -122,6 +122,14 @@ export class InMemoryAuditStore {
122
122
  auditSummary,
123
123
  reason,
124
124
  explanation,
125
+ ...(options.apiSpendApproved === true &&
126
+ decision.route?.authTier === "api-key"
127
+ ? { apiSpendApproved: true }
128
+ : {}),
129
+ ...(options.switchApproved === true &&
130
+ decision.route?.authTier === "subscription"
131
+ ? { switchApproved: true }
132
+ : {}),
125
133
  route: decision.route ?? null,
126
134
  fallbackChain: decision.fallbackChain
127
135
  ? decision.fallbackChain.map((e) => ({ ...e }))
@@ -135,6 +143,19 @@ export class InMemoryAuditStore {
135
143
  : undefined,
136
144
  blocked: decision.blocked,
137
145
  needsConfiguration: decision.needsConfiguration,
146
+ ...(decision.classification
147
+ ? {
148
+ classification: {
149
+ recommendedFamily: decision.classification.recommendedFamily,
150
+ confidence: decision.classification.confidence,
151
+ // signals are stable rule ids; still run through redaction defensively
152
+ signals: decision.classification.signals.map((s) => safeRedact(s, known)),
153
+ },
154
+ }
155
+ : {}),
156
+ ...(decision.classifierName
157
+ ? { classifierName: decision.classifierName }
158
+ : {}),
138
159
  cancellationState: initialCancellation,
139
160
  };
140
161
  if (redactedStoredPreview !== undefined) {
@@ -220,6 +241,36 @@ export class InMemoryAuditStore {
220
241
  return structuredClone(update);
221
242
  });
222
243
  }
244
+ async recordOutboundSecretFindings(input) {
245
+ return this.#exclusive(() => {
246
+ const now = (input.now ?? this.#now)();
247
+ // Names only — strip any free-text that might accidentally embed secrets.
248
+ const names = [
249
+ ...new Set((input.patternNames ?? []).filter((n) => typeof n === "string" && n.length > 0)),
250
+ ];
251
+ const explanation = input.explanation !== undefined
252
+ ? safeRedact(input.explanation, this.#defaultKnownSecrets)
253
+ : `Outbound content matched credential pattern(s): ${names.join(", ") || "(none)"}`;
254
+ const record = {
255
+ recordId: newId("aud"),
256
+ kind: "outbound_secret_finding",
257
+ timestamp: now.toISOString(),
258
+ requestId: input.requestId,
259
+ decisionId: input.decisionId,
260
+ promptDigest: input.promptDigest,
261
+ reason: input.mode === "block"
262
+ ? "outbound_secret_blocked"
263
+ : "outbound_secret_warning",
264
+ explanation,
265
+ secretPatternNames: names,
266
+ outboundSecretScanMode: input.mode,
267
+ blocked: input.mode === "block",
268
+ cancellationState: input.mode === "block" ? "completed" : "active",
269
+ };
270
+ this.#push(record, { trackAsLatest: false });
271
+ return structuredClone(record);
272
+ });
273
+ }
223
274
  async getCancellationState(requestId) {
224
275
  const latest = this.#latestByRequest.get(requestId);
225
276
  return latest?.cancellationState;
@@ -262,10 +313,16 @@ export class InMemoryAuditStore {
262
313
  }, {}),
263
314
  };
264
315
  }
265
- #push(record) {
316
+ #push(record, options = {}) {
266
317
  this.#records.push(record);
267
318
  this.#byId.set(record.recordId, record);
268
- this.#latestByRequest.set(record.requestId, record);
319
+ // Side-car findings (outbound secret scan) stay on the log but must not
320
+ // become the cancellation/completion base — otherwise markCompleted would
321
+ // clone them as a second "finding" row.
322
+ const trackAsLatest = options.trackAsLatest ?? true;
323
+ if (trackAsLatest) {
324
+ this.#latestByRequest.set(record.requestId, record);
325
+ }
269
326
  if (this.#maxRecords !== undefined &&
270
327
  this.#records.length > this.#maxRecords) {
271
328
  const overflow = this.#records.length - this.#maxRecords;
package/dist/audit.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"audit.js","sourceRoot":"","sources":["../src/audit.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"audit.js","sourceRoot":"","sources":["../src/audit.ts"],"names":[],"mappings":"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"}
package/dist/config.d.ts CHANGED
@@ -9,6 +9,14 @@ export interface ConfiguredProvider {
9
9
  id: string;
10
10
  enabled: boolean;
11
11
  accounts: ConfiguredAccount[];
12
+ /** Optional base URL override for an OpenAI-compatible provider endpoint. */
13
+ baseUrl?: string;
14
+ /** Per-provider hard spend cap in USD; overrides the global policy cap. */
15
+ spendCapUsd?: number;
16
+ /** When present, only these model ids (plus optional trailing `*` prefix glob) are allowed for this provider. */
17
+ allowedModels?: string[];
18
+ /** Listed model ids (plus optional trailing `*` prefix glob) are always blocked. Deny beats allow. */
19
+ deniedModels?: string[];
12
20
  }
13
21
  /** Named profile overlay loaded from profiles/*.toml. */
14
22
  export interface ConfiguredProfile {
@@ -22,6 +30,23 @@ export interface ConfiguredAccount {
22
30
  id: string;
23
31
  label?: string;
24
32
  }
33
+ /**
34
+ * Synthetic provider ids for OAuth subscription candidates (built at runtime
35
+ * from stored tokens, never declared under `[providers.<id>]`). Routing rules
36
+ * may target these without a matching config stanza; see
37
+ * validateRoutingRules.
38
+ */
39
+ export declare const SUBSCRIPTION_PROVIDER_IDS: readonly ["anthropic-sub", "openai-sub"];
40
+ /** Single user-defined routing rule from [[routing.rules]]. */
41
+ export interface RoutingRule {
42
+ /** Match keys (AND-ed). At least one of role or family is required. */
43
+ role?: string;
44
+ family?: "fast-coder" | "frontier-coder";
45
+ /** Target keys (exactly one of). */
46
+ model?: string;
47
+ provider?: string;
48
+ tier?: "subscription" | "local" | "api-key";
49
+ }
25
50
  export interface ConfigWarning {
26
51
  filePath: string;
27
52
  path: string;
@@ -34,6 +59,7 @@ export interface OffRouterConfig {
34
59
  policyDefaults: PolicyDefaults;
35
60
  providers: Record<string, ConfiguredProvider>;
36
61
  profiles: Record<string, ConfiguredProfile>;
62
+ routingRules: RoutingRule[];
37
63
  warnings: ConfigWarning[];
38
64
  }
39
65
  export interface LoadConfigOptions {
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,4DAA4D;AAC5D,MAAM,WAAW,cAAc;IAC7B,iBAAiB,EAAE,OAAO,CAAC;IAC3B,mBAAmB,EAAE,OAAO,CAAC;CAC9B;AAED,6DAA6D;AAC7D,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,iBAAiB,EAAE,CAAC;CAC/B;AAED,yDAAyD;AACzD,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,mDAAmD;AACnD,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,EAAE,YAAY,CAAC;IACrB,cAAc,EAAE,cAAc,CAAC;IAC/B,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;IAC9C,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;IAC5C,QAAQ,EAAE,aAAa,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,iBAAiB;IAChC,wCAAwC;IACxC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,uCAAuC;IACvC,OAAO,CAAC,EAAE,MAAM,MAAM,CAAC;IACvB,mEAAmE;IACnE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;OAGG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,MAAM,WAAW,kBAAkB;IACjC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,MAAM,CAAC;CACxB;AAED,qBAAa,WAAY,SAAQ,KAAK;IACpC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;gBAEd,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,KAAK,CAAC,EAAE,OAAO;CAUhE;AA+DD;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,SAAK,GAAG,eAAe,CAkB3D;AAED,wBAAgB,oBAAoB,CAClC,OAAO,GAAE,kBAAuB,GAC/B,MAAM,CAQR;AAsSD;;;;;;;;GAQG;AACH,wBAAsB,UAAU,CAC9B,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,eAAe,CAAC,CAe1B"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
package/dist/config.js CHANGED
@@ -8,6 +8,16 @@ import { homedir as osHomedir } from "node:os";
8
8
  import { join, resolve } from "node:path";
9
9
  import { parse as parseToml } from "smol-toml";
10
10
  import { z } from "zod";
11
+ /**
12
+ * Synthetic provider ids for OAuth subscription candidates (built at runtime
13
+ * from stored tokens, never declared under `[providers.<id>]`). Routing rules
14
+ * may target these without a matching config stanza; see
15
+ * validateRoutingRules.
16
+ */
17
+ export const SUBSCRIPTION_PROVIDER_IDS = [
18
+ "anthropic-sub",
19
+ "openai-sub",
20
+ ];
11
21
  export class ConfigError extends Error {
12
22
  filePath;
13
23
  issues;
@@ -26,16 +36,42 @@ function allowedFromZodShape(shape) {
26
36
  }
27
37
  const ProviderConfigShape = {
28
38
  enabled: z.boolean().optional(),
39
+ base_url: z.string().optional(),
40
+ spend_cap_usd: z.number().min(0).optional(),
29
41
  accounts: z
30
42
  .array(z.object({ id: z.string().min(1), label: z.string().optional() }).strict())
31
43
  .optional(),
44
+ allowed_models: z.array(z.string().min(1)).optional(),
45
+ denied_models: z.array(z.string().min(1)).optional(),
32
46
  };
47
+ const OutboundSecretScanSchema = z.enum(["block", "warn", "off"]);
48
+ const SubscriptionSwitchSchema = z.enum(["auto", "ask"]);
49
+ const RoutingRuleSchema = z
50
+ .object({
51
+ role: z.string().min(1).optional(),
52
+ family: z.enum(["fast-coder", "frontier-coder"]).optional(),
53
+ model: z.string().min(1).optional(),
54
+ provider: z.string().min(1).optional(),
55
+ tier: z.enum(["subscription", "local", "api-key"]).optional(),
56
+ })
57
+ .strict()
58
+ .refine((rule) => (rule.role !== undefined || rule.family !== undefined) &&
59
+ [rule.model, rule.provider, rule.tier].filter(Boolean).length === 1, {
60
+ message: "routing.rules entry must have at least one of role/family and exactly one of model/provider/tier",
61
+ });
33
62
  const PolicySectionShape = {
34
63
  subscription_first: z.boolean().optional(),
35
64
  allow_api_key_fallback: z.boolean().optional(),
36
65
  allow_third_party_subscription_adapters: z.boolean().optional(),
37
66
  denied_providers: z.array(z.string().min(1)).optional(),
38
67
  near_limit_threshold: z.number().min(0).max(1).optional(),
68
+ /** Scan outbound prompts for credential shapes: block | warn | off. Default warn. */
69
+ outbound_secret_scan: OutboundSecretScanSchema.optional(),
70
+ /** Consent mode for switching subscription accounts within a provider family: auto | ask. Default auto. */
71
+ subscription_switch: SubscriptionSwitchSchema.optional(),
72
+ spend_cap_usd: z.number().min(0).optional(),
73
+ require_api_spend_approval: z.boolean().optional(),
74
+ classifier: z.enum(["heuristic", "llm"]).optional(),
39
75
  };
40
76
  const RootConfigShape = {
41
77
  allowlisted_profiles: z.array(z.string().min(1)).optional(),
@@ -44,6 +80,12 @@ const RootConfigShape = {
44
80
  providers: z
45
81
  .record(z.string().min(1), z.object(ProviderConfigShape).strict())
46
82
  .optional(),
83
+ routing: z
84
+ .object({
85
+ rules: z.array(RoutingRuleSchema),
86
+ })
87
+ .strict()
88
+ .optional(),
47
89
  };
48
90
  const ProfileFileShape = {
49
91
  id: z.string().min(1).optional(),
@@ -57,10 +99,20 @@ const PROVIDER_ALLOWED = {
57
99
  ...allowedFromZodShape(ProviderConfigShape),
58
100
  accounts: "leaf",
59
101
  };
102
+ const ROUTING_ALLOWED = {
103
+ rules: {
104
+ role: "leaf",
105
+ family: "leaf",
106
+ model: "leaf",
107
+ provider: "leaf",
108
+ tier: "leaf",
109
+ },
110
+ };
60
111
  const ROOT_ALLOWED = {
61
112
  ...allowedFromZodShape(RootConfigShape),
62
113
  policy: allowedFromZodShape(PolicySectionShape),
63
114
  providers: "record",
115
+ routing: ROUTING_ALLOWED,
64
116
  };
65
117
  const PROFILE_ALLOWED = allowedFromZodShape(ProfileFileShape);
66
118
  const DEFAULT_DENIED_PROFILE_PATTERNS = ["*-work"];
@@ -76,6 +128,10 @@ export function defaultConfig(homeDir = "") {
76
128
  deniedProfilePatterns: [...DEFAULT_DENIED_PROFILE_PATTERNS],
77
129
  allowThirdPartySubscriptionAdapters: false,
78
130
  deniedProviders: [],
131
+ // Default warn: do not break existing users; blocking is opt-in.
132
+ outboundSecretScan: "warn",
133
+ // Default auto: current routing behavior; ask-before-switch is opt-in.
134
+ subscriptionSwitch: "auto",
79
135
  },
80
136
  policyDefaults: {
81
137
  subscriptionFirst: true,
@@ -83,6 +139,7 @@ export function defaultConfig(homeDir = "") {
83
139
  },
84
140
  providers: {},
85
141
  profiles: {},
142
+ routingRules: [],
86
143
  warnings: [],
87
144
  };
88
145
  }
@@ -109,6 +166,13 @@ function formatZodIssues(error) {
109
166
  * Uses Zod internals only as type-shape guidance via a parallel known-keys model.
110
167
  */
111
168
  function collectUnknownKeyWarnings(value, allowed, filePath, pathPrefix) {
169
+ if (Array.isArray(value)) {
170
+ const warnings = [];
171
+ for (let i = 0; i < value.length; i++) {
172
+ warnings.push(...collectUnknownKeyWarnings(value[i], allowed, filePath, `${pathPrefix}[${i}]`));
173
+ }
174
+ return warnings;
175
+ }
112
176
  if (!isPlainObject(value)) {
113
177
  return [];
114
178
  }
@@ -186,6 +250,9 @@ function validateProfile(raw, filePath, fallbackId) {
186
250
  };
187
251
  }
188
252
  function stripUnknown(value, allowed) {
253
+ if (Array.isArray(value)) {
254
+ return value.map((item) => stripUnknown(item, allowed));
255
+ }
189
256
  if (!isPlainObject(value)) {
190
257
  return value;
191
258
  }
@@ -246,6 +313,22 @@ function mergeRootInto(target, root, sourcePath) {
246
313
  if (root.policy.near_limit_threshold !== undefined) {
247
314
  target.policy.nearLimitThreshold = root.policy.near_limit_threshold;
248
315
  }
316
+ if (root.policy.outbound_secret_scan !== undefined) {
317
+ target.policy.outboundSecretScan = root.policy.outbound_secret_scan;
318
+ }
319
+ if (root.policy.subscription_switch !== undefined) {
320
+ target.policy.subscriptionSwitch = root.policy.subscription_switch;
321
+ }
322
+ if (root.policy.spend_cap_usd !== undefined) {
323
+ target.policy.spendCapUsd = root.policy.spend_cap_usd;
324
+ }
325
+ if (root.policy.require_api_spend_approval !== undefined) {
326
+ target.policy.requireApiSpendApproval =
327
+ root.policy.require_api_spend_approval;
328
+ }
329
+ if (root.policy.classifier !== undefined) {
330
+ target.policy.classifier = root.policy.classifier;
331
+ }
249
332
  if (root.policy.denied_providers) {
250
333
  target.policy.deniedProviders = uniqueStrings([
251
334
  ...(target.policy.deniedProviders ?? []),
@@ -253,22 +336,72 @@ function mergeRootInto(target, root, sourcePath) {
253
336
  ]);
254
337
  }
255
338
  }
339
+ if (root.routing?.rules) {
340
+ target.routingRules.push(...root.routing.rules);
341
+ }
256
342
  if (root.providers) {
257
343
  for (const [id, provider] of Object.entries(root.providers)) {
258
344
  const accounts = provider.accounts
259
345
  ? provider.accounts.map((a) => ({ id: a.id, label: a.label }))
260
346
  : [{ id }];
261
- target.providers[id] = {
347
+ const configured = {
262
348
  id,
263
349
  enabled: provider.enabled ?? true,
264
350
  accounts,
265
351
  };
352
+ if (provider.base_url !== undefined) {
353
+ configured.baseUrl = provider.base_url;
354
+ }
355
+ if (provider.spend_cap_usd !== undefined) {
356
+ configured.spendCapUsd = provider.spend_cap_usd;
357
+ }
358
+ if (provider.allowed_models !== undefined) {
359
+ configured.allowedModels = provider.allowed_models;
360
+ }
361
+ if (provider.denied_models !== undefined) {
362
+ configured.deniedModels = provider.denied_models;
363
+ }
364
+ target.providers[id] = configured;
266
365
  }
267
366
  }
268
367
  }
269
368
  function uniqueStrings(values) {
270
369
  return [...new Set(values)];
271
370
  }
371
+ function validateRoutingRules(config) {
372
+ const validRules = [];
373
+ for (let i = 0; i < config.routingRules.length; i++) {
374
+ const rule = config.routingRules[i];
375
+ let providerId;
376
+ if (rule.provider !== undefined) {
377
+ providerId = rule.provider;
378
+ }
379
+ else if (rule.model !== undefined) {
380
+ const slashIdx = rule.model.indexOf("/");
381
+ if (slashIdx <= 0 || slashIdx === rule.model.length - 1) {
382
+ config.warnings.push({
383
+ filePath: config.sources[0] ?? config.homeDir,
384
+ path: `routing.rules[${i}]`,
385
+ message: `Routing rule ${i} model "${rule.model}" is not in provider/model-id form; rule ignored.`,
386
+ });
387
+ continue;
388
+ }
389
+ providerId = rule.model.slice(0, slashIdx);
390
+ }
391
+ if (providerId !== undefined &&
392
+ !(providerId in config.providers) &&
393
+ !SUBSCRIPTION_PROVIDER_IDS.includes(providerId)) {
394
+ config.warnings.push({
395
+ filePath: config.sources[0] ?? config.homeDir,
396
+ path: `routing.rules[${i}]`,
397
+ message: `Routing rule ${i} references unconfigured provider "${providerId}"; rule ignored.`,
398
+ });
399
+ continue;
400
+ }
401
+ validRules.push(rule);
402
+ }
403
+ config.routingRules = validRules;
404
+ }
272
405
  async function readOptionalFile(path) {
273
406
  try {
274
407
  return await readFile(path, "utf8");
@@ -350,6 +483,32 @@ export async function loadConfig(options = {}) {
350
483
  if (options.workspaceDir && options.workspaceTrusted) {
351
484
  await loadRootFile(join(options.workspaceDir, ".offrouter", "config.toml"), config);
352
485
  }
486
+ validateRoutingRules(config);
487
+ // Derive per-provider spend cap overrides onto the policy config so every
488
+ // caller of loadConfig enforces the same caps without remapping providers.
489
+ const providerSpendCapsUsd = {};
490
+ const providerAllowedModels = {};
491
+ const providerDeniedModels = {};
492
+ for (const [id, provider] of Object.entries(config.providers)) {
493
+ if (provider.spendCapUsd !== undefined) {
494
+ providerSpendCapsUsd[id] = provider.spendCapUsd;
495
+ }
496
+ if (provider.allowedModels !== undefined && provider.allowedModels.length > 0) {
497
+ providerAllowedModels[id] = provider.allowedModels;
498
+ }
499
+ if (provider.deniedModels !== undefined && provider.deniedModels.length > 0) {
500
+ providerDeniedModels[id] = provider.deniedModels;
501
+ }
502
+ }
503
+ if (Object.keys(providerSpendCapsUsd).length > 0) {
504
+ config.policy.providerSpendCapsUsd = providerSpendCapsUsd;
505
+ }
506
+ if (Object.keys(providerAllowedModels).length > 0) {
507
+ config.policy.providerAllowedModels = providerAllowedModels;
508
+ }
509
+ if (Object.keys(providerDeniedModels).length > 0) {
510
+ config.policy.providerDeniedModels = providerDeniedModels;
511
+ }
353
512
  return config;
354
513
  }
355
514
  //# sourceMappingURL=config.js.map