@agentguard-run/spend 0.5.0 → 0.6.1

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 (48) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/index.d.ts +7 -1
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/index.js +25 -3
  5. package/dist/index.js.map +1 -1
  6. package/dist/license.d.ts +5 -1
  7. package/dist/license.d.ts.map +1 -1
  8. package/dist/license.js +19 -3
  9. package/dist/license.js.map +1 -1
  10. package/dist/middleware/provenance.d.ts +11 -0
  11. package/dist/middleware/provenance.d.ts.map +1 -0
  12. package/dist/middleware/provenance.js +17 -0
  13. package/dist/middleware/provenance.js.map +1 -0
  14. package/dist/middleware/provider-registry.d.ts +36 -0
  15. package/dist/middleware/provider-registry.d.ts.map +1 -0
  16. package/dist/middleware/provider-registry.js +292 -0
  17. package/dist/middleware/provider-registry.js.map +1 -0
  18. package/dist/openrouter/key-fetch.d.ts +28 -0
  19. package/dist/openrouter/key-fetch.d.ts.map +1 -0
  20. package/dist/openrouter/key-fetch.js +146 -0
  21. package/dist/openrouter/key-fetch.js.map +1 -0
  22. package/dist/posture/enforce.d.ts +19 -0
  23. package/dist/posture/enforce.d.ts.map +1 -0
  24. package/dist/posture/enforce.js +109 -0
  25. package/dist/posture/enforce.js.map +1 -0
  26. package/dist/receipts/schema.d.ts +55 -0
  27. package/dist/receipts/schema.d.ts.map +1 -0
  28. package/dist/receipts/schema.js +23 -0
  29. package/dist/receipts/schema.js.map +1 -0
  30. package/dist/spend-guard.d.ts +34 -0
  31. package/dist/spend-guard.d.ts.map +1 -1
  32. package/dist/spend-guard.js +69 -2
  33. package/dist/spend-guard.js.map +1 -1
  34. package/dist/types.d.ts +10 -0
  35. package/dist/types.d.ts.map +1 -1
  36. package/dist/workflow/receipt.d.ts +20 -2
  37. package/dist/workflow/receipt.d.ts.map +1 -1
  38. package/dist/workflow/receipt.js +16 -0
  39. package/dist/workflow/receipt.js.map +1 -1
  40. package/dist/workflow/types.d.ts +5 -0
  41. package/dist/workflow/types.d.ts.map +1 -1
  42. package/package.json +5 -2
  43. package/src/middleware/provenance.ts +31 -0
  44. package/src/middleware/provider-registry.ts +293 -0
  45. package/src/posture/enforce.ts +87 -0
  46. package/src/receipts/schema.ts +91 -0
  47. package/src/workflow/receipt.ts +36 -2
  48. package/src/workflow/types.ts +7 -0
@@ -0,0 +1,292 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PROVIDER_REGISTRY = void 0;
4
+ exports.isForeignOriginModel = isForeignOriginModel;
5
+ exports.inferProviderRoute = inferProviderRoute;
6
+ exports.inferModelIdentity = inferModelIdentity;
7
+ exports.inferHosting = inferHosting;
8
+ exports.inferCompliance = inferCompliance;
9
+ exports.PROVIDER_REGISTRY = {
10
+ 'anthropic-direct': {
11
+ provider: 'anthropic',
12
+ weights_origin_country: 'US',
13
+ available_jurisdictions: ['US'],
14
+ baa_path: 'Anthropic Enterprise Messages API with BAA eligible routing',
15
+ hipaa_eligible: true,
16
+ zdr_available: true,
17
+ default_retention_days: 0,
18
+ },
19
+ 'aws-bedrock': {
20
+ provider: 'anthropic',
21
+ weights_origin_country: 'US',
22
+ available_jurisdictions: ['us-east-1', 'us-east-2', 'us-west-2', 'eu-west-1', 'eu-central-1', 'ap-northeast-1'],
23
+ baa_path: 'AWS BAA for Bedrock HIPAA eligible services',
24
+ hipaa_eligible: true,
25
+ zdr_available: true,
26
+ default_retention_days: 0,
27
+ },
28
+ 'azure-openai': {
29
+ provider: 'openai',
30
+ weights_origin_country: 'US',
31
+ available_jurisdictions: ['eastus', 'westus', 'westeurope', 'francecentral', 'switzerlandnorth'],
32
+ baa_path: 'Microsoft Product Terms DPA',
33
+ hipaa_eligible: true,
34
+ zdr_available: true,
35
+ default_retention_days: 0,
36
+ },
37
+ 'openai-direct': {
38
+ provider: 'openai',
39
+ weights_origin_country: 'US',
40
+ available_jurisdictions: ['US'],
41
+ baa_path: 'OpenAI Enterprise BAA with eligible API configuration',
42
+ hipaa_eligible: true,
43
+ zdr_available: true,
44
+ default_retention_days: 30,
45
+ },
46
+ 'vertex-ai': {
47
+ provider: 'google',
48
+ weights_origin_country: 'US',
49
+ available_jurisdictions: ['us-central1', 'us-east4', 'europe-west4', 'europe-west1', 'asia-northeast1'],
50
+ baa_path: 'Google Cloud BAA',
51
+ hipaa_eligible: true,
52
+ zdr_available: true,
53
+ default_retention_days: 0,
54
+ },
55
+ fireworks: {
56
+ provider: 'fireworks',
57
+ weights_origin_country: 'unknown',
58
+ available_jurisdictions: ['US'],
59
+ baa_path: null,
60
+ hipaa_eligible: false,
61
+ zdr_available: false,
62
+ default_retention_days: 30,
63
+ },
64
+ baseten: {
65
+ provider: 'baseten',
66
+ weights_origin_country: 'unknown',
67
+ available_jurisdictions: ['US'],
68
+ baa_path: null,
69
+ hipaa_eligible: false,
70
+ zdr_available: false,
71
+ default_retention_days: 30,
72
+ },
73
+ together: {
74
+ provider: 'together',
75
+ weights_origin_country: 'unknown',
76
+ available_jurisdictions: ['US'],
77
+ baa_path: null,
78
+ hipaa_eligible: false,
79
+ zdr_available: false,
80
+ default_retention_days: 30,
81
+ },
82
+ 'moonshot-direct': {
83
+ provider: 'moonshot',
84
+ weights_origin_country: 'CN',
85
+ available_jurisdictions: ['CN'],
86
+ baa_path: null,
87
+ hipaa_eligible: false,
88
+ zdr_available: false,
89
+ default_retention_days: 30,
90
+ foreign_origin: true,
91
+ },
92
+ 'deepseek-direct': {
93
+ provider: 'deepseek',
94
+ weights_origin_country: 'CN',
95
+ available_jurisdictions: ['CN'],
96
+ baa_path: null,
97
+ hipaa_eligible: false,
98
+ zdr_available: false,
99
+ default_retention_days: 30,
100
+ foreign_origin: true,
101
+ },
102
+ 'alibaba-direct': {
103
+ provider: 'alibaba',
104
+ weights_origin_country: 'CN',
105
+ available_jurisdictions: ['CN'],
106
+ baa_path: null,
107
+ hipaa_eligible: false,
108
+ zdr_available: false,
109
+ default_retention_days: 30,
110
+ foreign_origin: true,
111
+ },
112
+ 'kimi-k2-on-baseten': {
113
+ provider: 'baseten',
114
+ weights_origin_country: 'CN',
115
+ available_jurisdictions: ['US'],
116
+ baa_path: null,
117
+ hipaa_eligible: false,
118
+ zdr_available: false,
119
+ default_retention_days: 30,
120
+ foreign_origin: true,
121
+ },
122
+ 'deepseek-on-together': {
123
+ provider: 'together',
124
+ weights_origin_country: 'CN',
125
+ available_jurisdictions: ['US'],
126
+ baa_path: null,
127
+ hipaa_eligible: false,
128
+ zdr_available: false,
129
+ default_retention_days: 30,
130
+ foreign_origin: true,
131
+ },
132
+ 'qwen-on-together': {
133
+ provider: 'together',
134
+ weights_origin_country: 'CN',
135
+ available_jurisdictions: ['US'],
136
+ baa_path: null,
137
+ hipaa_eligible: false,
138
+ zdr_available: false,
139
+ default_retention_days: 30,
140
+ foreign_origin: true,
141
+ },
142
+ 'self-hosted': {
143
+ provider: 'self_hosted',
144
+ weights_origin_country: 'unknown',
145
+ available_jurisdictions: ['self-hosted'],
146
+ baa_path: null,
147
+ hipaa_eligible: false,
148
+ zdr_available: true,
149
+ default_retention_days: 0,
150
+ },
151
+ };
152
+ const FOREIGN_ORIGIN_PATTERNS = [/kimi/i, /deepseek/i, /qwen/i, /yi[-_ ]/i, /baichuan/i, /glm/i, /moonshot/i];
153
+ function isForeignOriginModel(model) {
154
+ return FOREIGN_ORIGIN_PATTERNS.some((pattern) => pattern.test(model));
155
+ }
156
+ function inferProviderRoute(req) {
157
+ const model = String(req.model || '').toLowerCase();
158
+ const url = String(req.url || '').toLowerCase();
159
+ if ((req.providerRoute === 'baseten' || url.includes('baseten')) && /kimi/.test(model))
160
+ return 'kimi-k2-on-baseten';
161
+ if ((req.providerRoute === 'together' || url.includes('together')) && /deepseek/.test(model))
162
+ return 'deepseek-on-together';
163
+ if ((req.providerRoute === 'together' || url.includes('together')) && /qwen/.test(model))
164
+ return 'qwen-on-together';
165
+ if (req.providerRoute && exports.PROVIDER_REGISTRY[req.providerRoute])
166
+ return req.providerRoute;
167
+ if (url.includes('bedrock') || req.provider === 'bedrock')
168
+ return 'aws-bedrock';
169
+ if (url.includes('anthropic') || req.provider === 'anthropic')
170
+ return 'anthropic-direct';
171
+ if (url.includes('azure') || url.includes('openai.azure'))
172
+ return 'azure-openai';
173
+ if (url.includes('aiplatform.googleapis') || url.includes('vertex'))
174
+ return 'vertex-ai';
175
+ if (url.includes('fireworks') || req.providerRoute === 'fireworks')
176
+ return 'fireworks';
177
+ if (url.includes('baseten') || req.providerRoute === 'baseten')
178
+ return 'baseten';
179
+ if (url.includes('together') || req.providerRoute === 'together')
180
+ return 'together';
181
+ if (url.includes('moonshot') || /kimi/.test(model))
182
+ return 'moonshot-direct';
183
+ if (url.includes('deepseek') || /deepseek/.test(model))
184
+ return 'deepseek-direct';
185
+ if (url.includes('dashscope') || url.includes('alibaba') || /qwen/.test(model))
186
+ return 'alibaba-direct';
187
+ if (req.provider === 'openai')
188
+ return 'openai-direct';
189
+ if (req.provider === 'gemini')
190
+ return 'vertex-ai';
191
+ return 'self-hosted';
192
+ }
193
+ function inferModelIdentity(model, route) {
194
+ const info = exports.PROVIDER_REGISTRY[route] ?? exports.PROVIDER_REGISTRY['self-hosted'];
195
+ const modelId = model || 'unknown';
196
+ return {
197
+ provider: modelProvider(modelId, info.provider),
198
+ model_id: modelId,
199
+ model_version: modelVersion(modelId),
200
+ model_family: modelFamily(modelId),
201
+ weights_origin_country: isForeignOriginModel(modelId) || info.foreign_origin ? 'CN' : info.weights_origin_country,
202
+ };
203
+ }
204
+ function inferHosting(route, config = {}) {
205
+ const info = exports.PROVIDER_REGISTRY[route] ?? exports.PROVIDER_REGISTRY['self-hosted'];
206
+ const region = config.jurisdictionRegion || info.available_jurisdictions[0] || 'unknown';
207
+ return {
208
+ provider_route: route,
209
+ jurisdiction_country: config.jurisdictionCountry || countryFromRegion(region),
210
+ jurisdiction_region: region,
211
+ };
212
+ }
213
+ function inferCompliance(route, model, config = {}) {
214
+ const info = exports.PROVIDER_REGISTRY[route] ?? exports.PROVIDER_REGISTRY['self-hosted'];
215
+ const retention = config.dataRetentionDays !== undefined ? config.dataRetentionDays : info.default_retention_days;
216
+ return {
217
+ baa_in_force: config.baaInForce ?? false,
218
+ baa_vendor: config.baaVendor ?? info.baa_path,
219
+ hipaa_eligible: info.hipaa_eligible,
220
+ data_retention_days: retention,
221
+ data_residency_attested: config.dataResidencyAttested ?? false,
222
+ foreign_origin_weight_flag: model.weights_origin_country === 'CN' || info.foreign_origin === true,
223
+ foreign_origin_consent_receipt_id: config.foreignOriginConsentReceiptId ?? null,
224
+ inference_billing: config.inferenceBilling ?? 'customer_managed',
225
+ inference_billing_detail: config.inferenceBilling === 'agentguard_managed' ? config.inferenceBillingDetail ?? null : null,
226
+ };
227
+ }
228
+ function modelProvider(model, fallback) {
229
+ const lower = model.toLowerCase();
230
+ if (lower.includes('claude'))
231
+ return 'anthropic';
232
+ if (lower.includes('gpt') || lower.includes('openai'))
233
+ return 'openai';
234
+ if (lower.includes('gemini'))
235
+ return 'google';
236
+ if (lower.includes('mistral'))
237
+ return 'mistral';
238
+ if (lower.includes('llama'))
239
+ return 'meta';
240
+ if (lower.includes('command'))
241
+ return 'cohere';
242
+ if (lower.includes('deepseek'))
243
+ return 'deepseek';
244
+ if (lower.includes('kimi') || lower.includes('moonshot'))
245
+ return 'moonshot';
246
+ if (lower.includes('qwen') || lower.includes('yi') || lower.includes('baichuan') || lower.includes('glm'))
247
+ return 'alibaba';
248
+ return fallback;
249
+ }
250
+ function modelVersion(model) {
251
+ const match = model.match(/(?:^|[-_])(20\d{6}|\d{8})(?:$|[-_])/);
252
+ return match?.[1] ?? 'unknown';
253
+ }
254
+ function modelFamily(model) {
255
+ const lower = model.toLowerCase();
256
+ if (lower.includes('claude'))
257
+ return 'claude';
258
+ if (lower.includes('gpt'))
259
+ return 'gpt';
260
+ if (lower.includes('gemini'))
261
+ return 'gemini';
262
+ if (lower.includes('llama-4') || lower.includes('llama4'))
263
+ return 'llama-4';
264
+ if (lower.includes('mistral'))
265
+ return 'mistral';
266
+ if (lower.includes('kimi'))
267
+ return 'kimi';
268
+ if (lower.includes('deepseek'))
269
+ return 'deepseek';
270
+ if (lower.includes('qwen'))
271
+ return 'qwen';
272
+ return lower.split(/[/:_]/).pop()?.split('-').slice(0, 2).join('-') || 'unknown';
273
+ }
274
+ function countryFromRegion(region) {
275
+ const lower = region.toLowerCase();
276
+ if (lower.startsWith('us') || lower.includes('eastus') || lower.includes('westus'))
277
+ return 'US';
278
+ if (lower.startsWith('eu') || lower.includes('europe') || lower.includes('france') || lower.includes('switzerland'))
279
+ return 'EU';
280
+ if (lower.startsWith('uk'))
281
+ return 'UK';
282
+ if (lower.startsWith('ca'))
283
+ return 'CA';
284
+ if (lower.startsWith('cn'))
285
+ return 'CN';
286
+ if (lower.startsWith('ap-northeast') || lower.includes('tokyo') || lower.includes('japan'))
287
+ return 'JP';
288
+ if (lower.startsWith('ap-southeast-2') || lower.includes('australia'))
289
+ return 'AU';
290
+ return 'unknown';
291
+ }
292
+ //# sourceMappingURL=provider-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider-registry.js","sourceRoot":"","sources":["../../src/middleware/provider-registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * AgentGuard(TM) Spend: server-runtime OpenRouter managed-key fetcher.
3
+ *
4
+ * This never proxies inference traffic. It fetches a short-lived managed key
5
+ * for Pro tiers, then the customer's server runtime calls OpenRouter directly.
6
+ */
7
+ export interface ManagedOpenRouterKey {
8
+ key: string;
9
+ expiresAtMs: number;
10
+ tier?: string;
11
+ inferenceBilling?: 'agentguard_managed' | 'customer_managed';
12
+ }
13
+ export interface ManagedOpenRouterKeyOptions {
14
+ endpointBaseUrl?: string;
15
+ nowMs?: number;
16
+ home?: string;
17
+ machineFingerprint?: string;
18
+ processId?: string;
19
+ runtime?: 'server' | 'browser';
20
+ getJson?: (url: string, headers: Record<string, string>) => Promise<{
21
+ status: number;
22
+ body: unknown;
23
+ }>;
24
+ }
25
+ export declare function fetchManagedOpenRouterKey(licenseKey: string | null | undefined, opts?: ManagedOpenRouterKeyOptions): Promise<ManagedOpenRouterKey | null>;
26
+ export declare function clearManagedOpenRouterKeyCache(): void;
27
+ export declare function isOpenRouterHost(urlOrHost: string | undefined | null, configuredBaseUrl?: string): boolean;
28
+ //# sourceMappingURL=key-fetch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"key-fetch.d.ts","sourceRoot":"","sources":["../../src/openrouter/key-fetch.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,MAAM,WAAW,oBAAoB;IACnC,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,gBAAgB,CAAC,EAAE,oBAAoB,GAAG,kBAAkB,CAAC;CAC9D;AAED,MAAM,WAAW,2BAA2B;IAC1C,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;IAC/B,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;CACxG;AAMD,wBAAsB,yBAAyB,CAC7C,UAAU,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EACrC,IAAI,GAAE,2BAAgC,GACrC,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC,CAkCtC;AAED,wBAAgB,8BAA8B,IAAI,IAAI,CAErD;AAED,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,EAAE,iBAAiB,CAAC,EAAE,MAAM,GAAG,OAAO,CAM1G"}
@@ -0,0 +1,146 @@
1
+ "use strict";
2
+ /**
3
+ * AgentGuard(TM) Spend: server-runtime OpenRouter managed-key fetcher.
4
+ *
5
+ * This never proxies inference traffic. It fetches a short-lived managed key
6
+ * for Pro tiers, then the customer's server runtime calls OpenRouter directly.
7
+ */
8
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
9
+ if (k2 === undefined) k2 = k;
10
+ var desc = Object.getOwnPropertyDescriptor(m, k);
11
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
12
+ desc = { enumerable: true, get: function() { return m[k]; } };
13
+ }
14
+ Object.defineProperty(o, k2, desc);
15
+ }) : (function(o, m, k, k2) {
16
+ if (k2 === undefined) k2 = k;
17
+ o[k2] = m[k];
18
+ }));
19
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
20
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
21
+ }) : function(o, v) {
22
+ o["default"] = v;
23
+ });
24
+ var __importStar = (this && this.__importStar) || (function () {
25
+ var ownKeys = function(o) {
26
+ ownKeys = Object.getOwnPropertyNames || function (o) {
27
+ var ar = [];
28
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
29
+ return ar;
30
+ };
31
+ return ownKeys(o);
32
+ };
33
+ return function (mod) {
34
+ if (mod && mod.__esModule) return mod;
35
+ var result = {};
36
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
37
+ __setModuleDefault(result, mod);
38
+ return result;
39
+ };
40
+ })();
41
+ Object.defineProperty(exports, "__esModule", { value: true });
42
+ exports.fetchManagedOpenRouterKey = fetchManagedOpenRouterKey;
43
+ exports.clearManagedOpenRouterKeyCache = clearManagedOpenRouterKeyCache;
44
+ exports.isOpenRouterHost = isOpenRouterHost;
45
+ const http = __importStar(require("http"));
46
+ const https = __importStar(require("https"));
47
+ const license_1 = require("../license");
48
+ const DEFAULT_ENDPOINT = 'https://agentguard.run';
49
+ const DEFAULT_TTL_MS = 15 * 60 * 1000;
50
+ const cache = new Map();
51
+ async function fetchManagedOpenRouterKey(licenseKey, opts = {}) {
52
+ const key = licenseKey?.trim();
53
+ if (!key)
54
+ return null;
55
+ if (opts.runtime === 'browser' || isBrowserRuntime())
56
+ return null;
57
+ const now = opts.nowMs ?? Date.now();
58
+ const cached = cache.get(key);
59
+ if (cached && cached.expiresAtMs > now)
60
+ return cached;
61
+ const base = (opts.endpointBaseUrl || process.env.AGENTGUARD_LICENSE_ENDPOINT || DEFAULT_ENDPOINT).replace(/\/$/, '');
62
+ const machineFingerprint = opts.machineFingerprint || (0, license_1.anonymousMachineFingerprint)(opts.home);
63
+ const processId = opts.processId || (0, license_1.processUuid)(opts.home);
64
+ const headers = {
65
+ authorization: `Bearer ${key}`,
66
+ 'x-agentguard-runtime': 'server',
67
+ 'x-agentguard-machine-fingerprint': machineFingerprint,
68
+ 'x-agentguard-process-id': processId,
69
+ 'user-agent': 'agentguard-spend/managed-openrouter-key',
70
+ };
71
+ const result = await (opts.getJson ?? getJson)(`${base}/api/tenant/openrouter-key`, headers);
72
+ if (result.status === 404)
73
+ return null;
74
+ if (result.status >= 400)
75
+ throw new Error(`managed OpenRouter key fetch failed: ${result.status}`);
76
+ const body = result.body && typeof result.body === 'object' ? result.body : {};
77
+ if (typeof body.key !== 'string' || !body.key)
78
+ return null;
79
+ const ttlSeconds = typeof body.expires_in_seconds === 'number' && Number.isFinite(body.expires_in_seconds)
80
+ ? Math.max(30, Math.min(900, body.expires_in_seconds))
81
+ : 900;
82
+ const value = {
83
+ key: body.key,
84
+ expiresAtMs: now + Math.min(DEFAULT_TTL_MS, ttlSeconds * 1000),
85
+ tier: typeof body.tier === 'string' ? body.tier : undefined,
86
+ inferenceBilling: body.inference_billing === 'agentguard_managed' ? 'agentguard_managed' : undefined,
87
+ };
88
+ cache.set(key, value);
89
+ return value;
90
+ }
91
+ function clearManagedOpenRouterKeyCache() {
92
+ cache.clear();
93
+ }
94
+ function isOpenRouterHost(urlOrHost, configuredBaseUrl) {
95
+ const configuredHost = hostOf(configuredBaseUrl);
96
+ const host = hostOf(urlOrHost) || String(urlOrHost || '').toLowerCase();
97
+ if (!host)
98
+ return false;
99
+ if (configuredHost && host === configuredHost)
100
+ return true;
101
+ return host === 'openrouter.ai' || host === 'www.openrouter.ai';
102
+ }
103
+ function hostOf(value) {
104
+ if (!value)
105
+ return null;
106
+ try {
107
+ if (/^https?:\/\//i.test(value))
108
+ return new URL(value).hostname.toLowerCase();
109
+ return new URL(`https://${value}`).hostname.toLowerCase();
110
+ }
111
+ catch {
112
+ return null;
113
+ }
114
+ }
115
+ function isBrowserRuntime() {
116
+ return typeof globalThis === 'object'
117
+ && typeof globalThis.window !== 'undefined'
118
+ && typeof process === 'undefined';
119
+ }
120
+ function getJson(url, headers) {
121
+ if (url.startsWith('mock://'))
122
+ return Promise.resolve({ status: 404, body: {} });
123
+ return new Promise((resolve, reject) => {
124
+ const parsed = new URL(url);
125
+ const client = parsed.protocol === 'http:' ? http : https;
126
+ const req = client.request({ method: 'GET', hostname: parsed.hostname, port: parsed.port, path: parsed.pathname + parsed.search, headers, timeout: 5000 }, (res) => {
127
+ const chunks = [];
128
+ res.on('data', (chunk) => chunks.push(chunk));
129
+ res.on('end', () => {
130
+ const text = Buffer.concat(chunks).toString('utf8');
131
+ let body = {};
132
+ try {
133
+ body = text ? JSON.parse(text) : {};
134
+ }
135
+ catch {
136
+ body = {};
137
+ }
138
+ resolve({ status: res.statusCode ?? 0, body });
139
+ });
140
+ });
141
+ req.on('error', reject);
142
+ req.on('timeout', () => req.destroy(new Error('managed OpenRouter key endpoint timed out')));
143
+ req.end();
144
+ });
145
+ }
146
+ //# sourceMappingURL=key-fetch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"key-fetch.js","sourceRoot":"","sources":["../../src/openrouter/key-fetch.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { ProvenanceBlock } from '../receipts/schema';
2
+ export type GovernancePosture = 'velocity' | 'standard' | 'compliance';
3
+ export interface ComplianceEnforcementConfig {
4
+ posture?: GovernancePosture;
5
+ foreignOriginConsentReceiptId?: string | null;
6
+ consentEndpointBaseUrl?: string;
7
+ consentGetJson?: (url: string) => Promise<unknown>;
8
+ }
9
+ export declare class AgentGuardComplianceError extends Error {
10
+ code: string;
11
+ constructor(message: string);
12
+ }
13
+ export declare class AgentGuardConsentRequiredError extends Error {
14
+ code: string;
15
+ constructor(message: string);
16
+ }
17
+ export declare function enforceCompliance(provenance: ProvenanceBlock, config?: ComplianceEnforcementConfig): Promise<void>;
18
+ export declare function verifyConsentReceipt(consentId: string, config?: ComplianceEnforcementConfig): Promise<boolean>;
19
+ //# sourceMappingURL=enforce.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enforce.d.ts","sourceRoot":"","sources":["../../src/posture/enforce.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAE1D,MAAM,MAAM,iBAAiB,GAAG,UAAU,GAAG,UAAU,GAAG,YAAY,CAAC;AAEvE,MAAM,WAAW,2BAA2B;IAC1C,OAAO,CAAC,EAAE,iBAAiB,CAAC;IAC5B,6BAA6B,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9C,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,cAAc,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CACpD;AAED,qBAAa,yBAA0B,SAAQ,KAAK;IAClD,IAAI,SAAiC;gBACzB,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,8BAA+B,SAAQ,KAAK;IACvD,IAAI,SAAiC;gBACzB,OAAO,EAAE,MAAM;CAI5B;AAID,wBAAsB,iBAAiB,CACrC,UAAU,EAAE,eAAe,EAC3B,MAAM,GAAE,2BAAgC,GACvC,OAAO,CAAC,IAAI,CAAC,CAmBf;AAED,wBAAsB,oBAAoB,CACxC,SAAS,EAAE,MAAM,EACjB,MAAM,GAAE,2BAAgC,GACvC,OAAO,CAAC,OAAO,CAAC,CAKlB"}
@@ -0,0 +1,109 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.AgentGuardConsentRequiredError = exports.AgentGuardComplianceError = void 0;
37
+ exports.enforceCompliance = enforceCompliance;
38
+ exports.verifyConsentReceipt = verifyConsentReceipt;
39
+ const http = __importStar(require("http"));
40
+ const https = __importStar(require("https"));
41
+ class AgentGuardComplianceError extends Error {
42
+ code = 'AGENTGUARD_COMPLIANCE_BLOCK';
43
+ constructor(message) {
44
+ super(message);
45
+ this.name = 'AgentGuardComplianceError';
46
+ }
47
+ }
48
+ exports.AgentGuardComplianceError = AgentGuardComplianceError;
49
+ class AgentGuardConsentRequiredError extends Error {
50
+ code = 'AGENTGUARD_CONSENT_REQUIRED';
51
+ constructor(message) {
52
+ super(message);
53
+ this.name = 'AgentGuardConsentRequiredError';
54
+ }
55
+ }
56
+ exports.AgentGuardConsentRequiredError = AgentGuardConsentRequiredError;
57
+ const DEFAULT_CONSENT_BASE_URL = 'https://agentguard.run';
58
+ async function enforceCompliance(provenance, config = {}) {
59
+ if (!provenance.compliance.foreign_origin_weight_flag)
60
+ return;
61
+ const posture = config.posture ?? 'standard';
62
+ if (posture === 'compliance') {
63
+ throw new AgentGuardComplianceError('Foreign origin weights are blocked in compliance posture. Set posture to standard and provide foreign_origin_consent_receipt_id to use this model.');
64
+ }
65
+ if (posture !== 'standard')
66
+ return;
67
+ const consentId = config.foreignOriginConsentReceiptId || provenance.compliance.foreign_origin_consent_receipt_id;
68
+ if (!consentId) {
69
+ throw new AgentGuardConsentRequiredError('This call uses foreign origin weights. Generate a consent receipt at https://agentguard.run/dashboard/consent/foreign-origin-weights before using this model.');
70
+ }
71
+ const verified = await verifyConsentReceipt(consentId, config);
72
+ if (!verified) {
73
+ throw new AgentGuardConsentRequiredError(`Foreign origin consent receipt ${consentId} is invalid or expired.`);
74
+ }
75
+ }
76
+ async function verifyConsentReceipt(consentId, config = {}) {
77
+ if (!/^ag_consent_[A-Za-z0-9_-]+$/.test(consentId))
78
+ return false;
79
+ const base = (config.consentEndpointBaseUrl || DEFAULT_CONSENT_BASE_URL).replace(/\/$/, '');
80
+ const raw = await (config.consentGetJson ?? getJson)(`${base}/api/consent/verify/${encodeURIComponent(consentId)}`);
81
+ return Boolean(raw && typeof raw === 'object' && raw.valid === true);
82
+ }
83
+ function getJson(url) {
84
+ if (url.startsWith('mock://'))
85
+ return Promise.resolve({ valid: true });
86
+ return new Promise((resolve, reject) => {
87
+ const parsed = new URL(url);
88
+ const client = parsed.protocol === 'http:' ? http : https;
89
+ const req = client.request({ method: 'GET', hostname: parsed.hostname, port: parsed.port, path: parsed.pathname + parsed.search, timeout: 5000 }, (res) => {
90
+ const chunks = [];
91
+ res.on('data', (chunk) => chunks.push(chunk));
92
+ res.on('end', () => {
93
+ const text = Buffer.concat(chunks).toString('utf8');
94
+ if ((res.statusCode ?? 0) >= 400)
95
+ return reject(new Error(`consent endpoint failed: ${res.statusCode}`));
96
+ try {
97
+ resolve(text ? JSON.parse(text) : {});
98
+ }
99
+ catch {
100
+ resolve({});
101
+ }
102
+ });
103
+ });
104
+ req.on('error', reject);
105
+ req.on('timeout', () => req.destroy(new Error('consent endpoint timed out')));
106
+ req.end();
107
+ });
108
+ }
109
+ //# sourceMappingURL=enforce.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enforce.js","sourceRoot":"","sources":["../../src/posture/enforce.ts"],"names":[],"mappings":"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"}