offrouter-core 0.5.1 → 0.7.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 +37 -0
  6. package/dist/config.d.ts.map +1 -1
  7. package/dist/config.js +171 -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":"AAWA,OAAO,KAAK,EACV,cAAc,EACd,kBAAkB,EAClB,cAAc,EACd,YAAY,EACZ,mBAAmB,EACnB,aAAa,EACb,YAAY,EACZ,aAAa,EACd,MAAM,YAAY,CAAC;AAEpB,oEAAoE;AACpE,eAAO,MAAM,yBAAyB,KAAK,CAAC;AAE5C,yEAAyE;AACzE,MAAM,MAAM,iBAAiB,GAAG,QAAQ,GAAG,WAAW,GAAG,WAAW,CAAC;AAErE,mCAAmC;AACnC,MAAM,MAAM,eAAe,GACvB,gBAAgB,GAChB,kBAAkB,GAClB,cAAc,GACd,yBAAyB,CAAC;AAE9B;;;GAGG;AACH,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,eAAe,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,+EAA+E;IAC/E,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;OAGG;IACH,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,qDAAqD;IACrD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,aAAa,GAAG,IAAI,CAAC;IAC7B,aAAa,CAAC,EAAE,kBAAkB,EAAE,CAAC;IACrC,oEAAoE;IACpE,oBAAoB,CAAC,EAAE,cAAc,GAAG,MAAM,CAAC;IAC/C,wEAAwE;IACxE,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,8FAA8F;IAC9F,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,aAAa,CAAC,EAAE,YAAY,EAAE,CAAC;IAC/B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B;;;OAGG;IACH,cAAc,CAAC,EAAE,mBAAmB,CAAC;IACrC;;;OAGG;IACH,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;IACtC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC9B,8DAA8D;IAC9D,sBAAsB,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,KAAK,CAAC;CACnD;AAED,MAAM,WAAW,qBAAqB;IACpC;;;OAGG;IACH,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,uEAAuE;IACvE,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;;OAGG;IACH,YAAY,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IAChC,wEAAwE;IACxE,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,mGAAmG;IACnG,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,0EAA0E;IAC1E,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;IACtC,gCAAgC;IAChC,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;CAClB;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,eAAe,CAAC;IACvB,iDAAiD;IACjD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,oBAAoB;IACnC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;CAClB;AAED;;;GAGG;AACH,MAAM,WAAW,UAAU;IACzB,cAAc,CACZ,OAAO,EAAE,YAAY,EACrB,QAAQ,EAAE,aAAa,EACvB,OAAO,CAAC,EAAE,qBAAqB,GAC9B,OAAO,CAAC,WAAW,CAAC,CAAC;IAExB;;;OAGG;IACH,oBAAoB,CAAC,KAAK,EAAE;QAC1B,SAAS,EAAE,MAAM,CAAC;QAClB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,MAAM,EAAE,cAAc,GAAG,MAAM,CAAC;QAChC,WAAW,EAAE,MAAM,CAAC;QACpB,KAAK,CAAC,EAAE,aAAa,GAAG,IAAI,CAAC;QAC7B,qEAAqE;QACrE,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,YAAY,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;QAChC,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;KAClB,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IAEzB,aAAa,CACX,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,oBAAoB,GAC7B,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC,CAAC;IAEpC,aAAa,CACX,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE;QAAE,GAAG,CAAC,EAAE,MAAM,IAAI,CAAA;KAAE,GAC7B,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC,CAAC;IAEpC;;;OAGG;IACH,4BAA4B,CAAC,KAAK,EAAE;QAClC,SAAS,EAAE,MAAM,CAAC;QAClB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,YAAY,EAAE,MAAM,EAAE,CAAC;QACvB,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,KAAK,CAAC;QAC/B,qEAAqE;QACrE,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;KAClB,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IAEzB,oBAAoB,CAClB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,iBAAiB,GAAG,SAAS,CAAC,CAAC;IAE1C,IAAI,CAAC,OAAO,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IAEzD,GAAG,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC,CAAC;IAExD;;OAEG;IACH,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED,MAAM,WAAW,yBAAyB;IACxC,uEAAuE;IACvE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,2DAA2D;IAC3D,YAAY,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IAChC,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;CAClB;AAMD,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAGnE;AA4DD;;;GAGG;AACH,qBAAa,kBAAmB,YAAW,UAAU;;gBAUvC,OAAO,GAAE,yBAA8B;IAkB7C,cAAc,CAClB,OAAO,EAAE,YAAY,EACrB,QAAQ,EAAE,aAAa,EACvB,OAAO,GAAE,qBAA0B,GAClC,OAAO,CAAC,WAAW,CAAC;IAsGjB,oBAAoB,CAAC,KAAK,EAAE;QAChC,SAAS,EAAE,MAAM,CAAC;QAClB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,MAAM,EAAE,cAAc,GAAG,MAAM,CAAC;QAChC,WAAW,EAAE,MAAM,CAAC;QACpB,KAAK,CAAC,EAAE,aAAa,GAAG,IAAI,CAAC;QAC7B,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,YAAY,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;QAChC,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;KAClB,GAAG,OAAO,CAAC,WAAW,CAAC;IAyBlB,aAAa,CACjB,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC;IA4B7B,aAAa,CACjB,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE;QAAE,GAAG,CAAC,EAAE,MAAM,IAAI,CAAA;KAAO,GACjC,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC;IAuB7B,4BAA4B,CAAC,KAAK,EAAE;QACxC,SAAS,EAAE,MAAM,CAAC;QAClB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,YAAY,EAAE,MAAM,EAAE,CAAC;QACvB,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,KAAK,CAAC;QAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;KAClB,GAAG,OAAO,CAAC,WAAW,CAAC;IAqClB,oBAAoB,CACxB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,iBAAiB,GAAG,SAAS,CAAC;IAKnC,IAAI,CAAC,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAmB5D,GAAG,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC;IAK7D,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAoFlC"}
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,11 +30,37 @@ 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;
28
53
  message: string;
29
54
  }
55
+ /** Optional top-level [telemetry] section. Consent still lives in telemetry.json. */
56
+ export interface TelemetryConfig {
57
+ /**
58
+ * Declared preference in config.toml. Does not by itself start sending —
59
+ * a real consent decision (telemetry.json) is always required so an anon id exists.
60
+ * Undefined means "not set in config".
61
+ */
62
+ enabled?: boolean;
63
+ }
30
64
  export interface OffRouterConfig {
31
65
  homeDir: string;
32
66
  sources: string[];
@@ -34,6 +68,9 @@ export interface OffRouterConfig {
34
68
  policyDefaults: PolicyDefaults;
35
69
  providers: Record<string, ConfiguredProvider>;
36
70
  profiles: Record<string, ConfiguredProfile>;
71
+ routingRules: RoutingRule[];
72
+ /** Optional [telemetry] block from config.toml. */
73
+ telemetry: TelemetryConfig;
37
74
  warnings: ConfigWarning[];
38
75
  }
39
76
  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":"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;IAC9B,6EAA6E;IAC7E,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,2EAA2E;IAC3E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iHAAiH;IACjH,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,sGAAsG;IACtG,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB;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;;;;;GAKG;AACH,eAAO,MAAM,yBAAyB,0CAG5B,CAAC;AAEX,+DAA+D;AAC/D,MAAM,WAAW,WAAW;IAC1B,uEAAuE;IACvE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,YAAY,GAAG,gBAAgB,CAAC;IACzC,oCAAoC;IACpC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,cAAc,GAAG,OAAO,GAAG,SAAS,CAAC;CAC7C;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,qFAAqF;AACrF,MAAM,WAAW,eAAe;IAC9B;;;;OAIG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;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,YAAY,EAAE,WAAW,EAAE,CAAC;IAC5B,mDAAmD;IACnD,SAAS,EAAE,eAAe,CAAC;IAC3B,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;AAuHD;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,SAAK,GAAG,eAAe,CAwB3D;AAED,wBAAgB,oBAAoB,CAClC,OAAO,GAAE,kBAAuB,GAC/B,MAAM,CAQR;AAkYD;;;;;;;;GAQG;AACH,wBAAsB,UAAU,CAC9B,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,eAAe,CAAC,CA2C1B"}
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,45 @@ 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(),
75
+ };
76
+ const TelemetrySectionShape = {
77
+ enabled: z.boolean().optional(),
39
78
  };
40
79
  const RootConfigShape = {
41
80
  allowlisted_profiles: z.array(z.string().min(1)).optional(),
@@ -44,6 +83,13 @@ const RootConfigShape = {
44
83
  providers: z
45
84
  .record(z.string().min(1), z.object(ProviderConfigShape).strict())
46
85
  .optional(),
86
+ routing: z
87
+ .object({
88
+ rules: z.array(RoutingRuleSchema),
89
+ })
90
+ .strict()
91
+ .optional(),
92
+ telemetry: z.object(TelemetrySectionShape).strict().optional(),
47
93
  };
48
94
  const ProfileFileShape = {
49
95
  id: z.string().min(1).optional(),
@@ -57,10 +103,21 @@ const PROVIDER_ALLOWED = {
57
103
  ...allowedFromZodShape(ProviderConfigShape),
58
104
  accounts: "leaf",
59
105
  };
106
+ const ROUTING_ALLOWED = {
107
+ rules: {
108
+ role: "leaf",
109
+ family: "leaf",
110
+ model: "leaf",
111
+ provider: "leaf",
112
+ tier: "leaf",
113
+ },
114
+ };
60
115
  const ROOT_ALLOWED = {
61
116
  ...allowedFromZodShape(RootConfigShape),
62
117
  policy: allowedFromZodShape(PolicySectionShape),
63
118
  providers: "record",
119
+ routing: ROUTING_ALLOWED,
120
+ telemetry: allowedFromZodShape(TelemetrySectionShape),
64
121
  };
65
122
  const PROFILE_ALLOWED = allowedFromZodShape(ProfileFileShape);
66
123
  const DEFAULT_DENIED_PROFILE_PATTERNS = ["*-work"];
@@ -76,6 +133,10 @@ export function defaultConfig(homeDir = "") {
76
133
  deniedProfilePatterns: [...DEFAULT_DENIED_PROFILE_PATTERNS],
77
134
  allowThirdPartySubscriptionAdapters: false,
78
135
  deniedProviders: [],
136
+ // Default warn: do not break existing users; blocking is opt-in.
137
+ outboundSecretScan: "warn",
138
+ // Default auto: current routing behavior; ask-before-switch is opt-in.
139
+ subscriptionSwitch: "auto",
79
140
  },
80
141
  policyDefaults: {
81
142
  subscriptionFirst: true,
@@ -83,6 +144,8 @@ export function defaultConfig(homeDir = "") {
83
144
  },
84
145
  providers: {},
85
146
  profiles: {},
147
+ routingRules: [],
148
+ telemetry: {},
86
149
  warnings: [],
87
150
  };
88
151
  }
@@ -109,6 +172,13 @@ function formatZodIssues(error) {
109
172
  * Uses Zod internals only as type-shape guidance via a parallel known-keys model.
110
173
  */
111
174
  function collectUnknownKeyWarnings(value, allowed, filePath, pathPrefix) {
175
+ if (Array.isArray(value)) {
176
+ const warnings = [];
177
+ for (let i = 0; i < value.length; i++) {
178
+ warnings.push(...collectUnknownKeyWarnings(value[i], allowed, filePath, `${pathPrefix}[${i}]`));
179
+ }
180
+ return warnings;
181
+ }
112
182
  if (!isPlainObject(value)) {
113
183
  return [];
114
184
  }
@@ -186,6 +256,9 @@ function validateProfile(raw, filePath, fallbackId) {
186
256
  };
187
257
  }
188
258
  function stripUnknown(value, allowed) {
259
+ if (Array.isArray(value)) {
260
+ return value.map((item) => stripUnknown(item, allowed));
261
+ }
189
262
  if (!isPlainObject(value)) {
190
263
  return value;
191
264
  }
@@ -246,6 +319,22 @@ function mergeRootInto(target, root, sourcePath) {
246
319
  if (root.policy.near_limit_threshold !== undefined) {
247
320
  target.policy.nearLimitThreshold = root.policy.near_limit_threshold;
248
321
  }
322
+ if (root.policy.outbound_secret_scan !== undefined) {
323
+ target.policy.outboundSecretScan = root.policy.outbound_secret_scan;
324
+ }
325
+ if (root.policy.subscription_switch !== undefined) {
326
+ target.policy.subscriptionSwitch = root.policy.subscription_switch;
327
+ }
328
+ if (root.policy.spend_cap_usd !== undefined) {
329
+ target.policy.spendCapUsd = root.policy.spend_cap_usd;
330
+ }
331
+ if (root.policy.require_api_spend_approval !== undefined) {
332
+ target.policy.requireApiSpendApproval =
333
+ root.policy.require_api_spend_approval;
334
+ }
335
+ if (root.policy.classifier !== undefined) {
336
+ target.policy.classifier = root.policy.classifier;
337
+ }
249
338
  if (root.policy.denied_providers) {
250
339
  target.policy.deniedProviders = uniqueStrings([
251
340
  ...(target.policy.deniedProviders ?? []),
@@ -253,22 +342,77 @@ function mergeRootInto(target, root, sourcePath) {
253
342
  ]);
254
343
  }
255
344
  }
345
+ if (root.routing?.rules) {
346
+ target.routingRules.push(...root.routing.rules);
347
+ }
348
+ if (root.telemetry) {
349
+ if (root.telemetry.enabled !== undefined) {
350
+ target.telemetry.enabled = root.telemetry.enabled;
351
+ }
352
+ }
256
353
  if (root.providers) {
257
354
  for (const [id, provider] of Object.entries(root.providers)) {
258
355
  const accounts = provider.accounts
259
356
  ? provider.accounts.map((a) => ({ id: a.id, label: a.label }))
260
357
  : [{ id }];
261
- target.providers[id] = {
358
+ const configured = {
262
359
  id,
263
360
  enabled: provider.enabled ?? true,
264
361
  accounts,
265
362
  };
363
+ if (provider.base_url !== undefined) {
364
+ configured.baseUrl = provider.base_url;
365
+ }
366
+ if (provider.spend_cap_usd !== undefined) {
367
+ configured.spendCapUsd = provider.spend_cap_usd;
368
+ }
369
+ if (provider.allowed_models !== undefined) {
370
+ configured.allowedModels = provider.allowed_models;
371
+ }
372
+ if (provider.denied_models !== undefined) {
373
+ configured.deniedModels = provider.denied_models;
374
+ }
375
+ target.providers[id] = configured;
266
376
  }
267
377
  }
268
378
  }
269
379
  function uniqueStrings(values) {
270
380
  return [...new Set(values)];
271
381
  }
382
+ function validateRoutingRules(config) {
383
+ const validRules = [];
384
+ for (let i = 0; i < config.routingRules.length; i++) {
385
+ const rule = config.routingRules[i];
386
+ let providerId;
387
+ if (rule.provider !== undefined) {
388
+ providerId = rule.provider;
389
+ }
390
+ else if (rule.model !== undefined) {
391
+ const slashIdx = rule.model.indexOf("/");
392
+ if (slashIdx <= 0 || slashIdx === rule.model.length - 1) {
393
+ config.warnings.push({
394
+ filePath: config.sources[0] ?? config.homeDir,
395
+ path: `routing.rules[${i}]`,
396
+ message: `Routing rule ${i} model "${rule.model}" is not in provider/model-id form; rule ignored.`,
397
+ });
398
+ continue;
399
+ }
400
+ providerId = rule.model.slice(0, slashIdx);
401
+ }
402
+ if (providerId !== undefined &&
403
+ !(providerId in config.providers) &&
404
+ !SUBSCRIPTION_PROVIDER_IDS.includes(providerId)) {
405
+ config.warnings.push({
406
+ filePath: config.sources[0] ?? config.homeDir,
407
+ path: `routing.rules[${i}]`,
408
+ message: `Routing rule ${i} references unconfigured provider "${providerId}"; rule ignored.`,
409
+ });
410
+ continue;
411
+ }
412
+ validRules.push(rule);
413
+ }
414
+ config.routingRules = validRules;
415
+ }
272
416
  async function readOptionalFile(path) {
273
417
  try {
274
418
  return await readFile(path, "utf8");
@@ -350,6 +494,32 @@ export async function loadConfig(options = {}) {
350
494
  if (options.workspaceDir && options.workspaceTrusted) {
351
495
  await loadRootFile(join(options.workspaceDir, ".offrouter", "config.toml"), config);
352
496
  }
497
+ validateRoutingRules(config);
498
+ // Derive per-provider spend cap overrides onto the policy config so every
499
+ // caller of loadConfig enforces the same caps without remapping providers.
500
+ const providerSpendCapsUsd = {};
501
+ const providerAllowedModels = {};
502
+ const providerDeniedModels = {};
503
+ for (const [id, provider] of Object.entries(config.providers)) {
504
+ if (provider.spendCapUsd !== undefined) {
505
+ providerSpendCapsUsd[id] = provider.spendCapUsd;
506
+ }
507
+ if (provider.allowedModels !== undefined && provider.allowedModels.length > 0) {
508
+ providerAllowedModels[id] = provider.allowedModels;
509
+ }
510
+ if (provider.deniedModels !== undefined && provider.deniedModels.length > 0) {
511
+ providerDeniedModels[id] = provider.deniedModels;
512
+ }
513
+ }
514
+ if (Object.keys(providerSpendCapsUsd).length > 0) {
515
+ config.policy.providerSpendCapsUsd = providerSpendCapsUsd;
516
+ }
517
+ if (Object.keys(providerAllowedModels).length > 0) {
518
+ config.policy.providerAllowedModels = providerAllowedModels;
519
+ }
520
+ if (Object.keys(providerDeniedModels).length > 0) {
521
+ config.policy.providerDeniedModels = providerDeniedModels;
522
+ }
353
523
  return config;
354
524
  }
355
525
  //# sourceMappingURL=config.js.map