@agenticprimitives/model-gateway 0.0.0-alpha.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 (48) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +29 -0
  3. package/dist/adapters/anthropic.d.ts +13 -0
  4. package/dist/adapters/anthropic.d.ts.map +1 -0
  5. package/dist/adapters/anthropic.js +59 -0
  6. package/dist/adapters/anthropic.js.map +1 -0
  7. package/dist/adapters/openai-compat.d.ts +17 -0
  8. package/dist/adapters/openai-compat.d.ts.map +1 -0
  9. package/dist/adapters/openai-compat.js +66 -0
  10. package/dist/adapters/openai-compat.js.map +1 -0
  11. package/dist/budget.d.ts +86 -0
  12. package/dist/budget.d.ts.map +1 -0
  13. package/dist/budget.js +98 -0
  14. package/dist/budget.js.map +1 -0
  15. package/dist/contract.d.ts +268 -0
  16. package/dist/contract.d.ts.map +1 -0
  17. package/dist/contract.js +128 -0
  18. package/dist/contract.js.map +1 -0
  19. package/dist/handler.d.ts +24 -0
  20. package/dist/handler.d.ts.map +1 -0
  21. package/dist/handler.js +124 -0
  22. package/dist/handler.js.map +1 -0
  23. package/dist/index.d.ts +20 -0
  24. package/dist/index.d.ts.map +1 -0
  25. package/dist/index.js +13 -0
  26. package/dist/index.js.map +1 -0
  27. package/dist/openai-compat/translate.d.ts +122 -0
  28. package/dist/openai-compat/translate.d.ts.map +1 -0
  29. package/dist/openai-compat/translate.js +72 -0
  30. package/dist/openai-compat/translate.js.map +1 -0
  31. package/dist/ops.d.ts +6 -0
  32. package/dist/ops.d.ts.map +1 -0
  33. package/dist/ops.js +38 -0
  34. package/dist/ops.js.map +1 -0
  35. package/dist/policy.d.ts +26 -0
  36. package/dist/policy.d.ts.map +1 -0
  37. package/dist/policy.js +83 -0
  38. package/dist/policy.js.map +1 -0
  39. package/dist/ports.d.ts +95 -0
  40. package/dist/ports.d.ts.map +1 -0
  41. package/dist/ports.js +43 -0
  42. package/dist/ports.js.map +1 -0
  43. package/dist/usage.d.ts +23 -0
  44. package/dist/usage.d.ts.map +1 -0
  45. package/dist/usage.js +16 -0
  46. package/dist/usage.js.map +1 -0
  47. package/package.json +32 -0
  48. package/spec.md +7 -0
@@ -0,0 +1,268 @@
1
+ import type { Address } from '@agenticprimitives/types';
2
+ import type { ModelUsageV1 } from '@agenticprimitives/orchestration';
3
+ export declare const PACKAGE_NAME: "@agenticprimitives/model-gateway";
4
+ export declare const PACKAGE_STATUS: "w1-contract";
5
+ export declare const SPEC_REF: "ap-town/specs/434-ap-model-gateway-and-the-town-pulse.md";
6
+ export type { ModelUsageV1 };
7
+ export type MessageRoleV1 = 'system' | 'user' | 'assistant' | 'tool';
8
+ export interface MessageV1 {
9
+ role: MessageRoleV1;
10
+ content: string;
11
+ /** `tool` messages: which call this answers. */
12
+ toolCallId?: string;
13
+ /** `assistant` messages that carried tool calls (a prior turn), replayed for context. */
14
+ toolCalls?: ToolCallV1[];
15
+ }
16
+ export interface ToolDefinitionV1 {
17
+ name: string;
18
+ description?: string;
19
+ inputSchema: Record<string, unknown>;
20
+ }
21
+ export interface ToolCallV1 {
22
+ id?: string;
23
+ name: string;
24
+ args: Record<string, unknown>;
25
+ }
26
+ export type ToolChoiceV1 = 'auto' | 'none' | 'required' | {
27
+ name: string;
28
+ };
29
+ export interface GenerateContextV1 {
30
+ /** The caller's word for why (`plan`, `compose`, `answer-stream`, `judge`, `selection`, `author`, `evals`, …). */
31
+ purpose: string;
32
+ runRef?: string;
33
+ stepRef?: string;
34
+ /** ASSERTED by the caller. Recorded on the receipt as `assertedAgent`; never used for authority or budget. */
35
+ agent?: Address;
36
+ }
37
+ export interface GenerateRequestV1 {
38
+ profile: string;
39
+ messages: MessageV1[];
40
+ tools?: ToolDefinitionV1[];
41
+ toolChoice?: ToolChoiceV1;
42
+ /** Clamped to the profile's ceiling by policy. */
43
+ maxOutputTokens?: number;
44
+ temperature?: number;
45
+ stream?: boolean;
46
+ context: GenerateContextV1;
47
+ }
48
+ export type StopReasonV1 = 'end' | 'tool' | 'length' | 'filtered';
49
+ export type FailureClassV1 = 'rate-limited' | 'unavailable' | 'timeout' | 'content' | 'policy' | 'malformed' | 'auth';
50
+ /** The classes a profile MAY name as fallback triggers (G5). Content, policy, malformed and auth never are. */
51
+ export declare const FALLBACK_CLASSES: readonly FailureClassV1[];
52
+ export interface ReceiptSummaryV1 {
53
+ id: string;
54
+ profile: string;
55
+ profileVersion: string;
56
+ provider: string;
57
+ model: string;
58
+ attempt: number;
59
+ fallbackOf?: string;
60
+ policyDecision: PolicyDecisionV1;
61
+ costMicroUsd: number;
62
+ latencyMs: number;
63
+ reconciliation: 'settled' | 'pending';
64
+ }
65
+ export interface GenerateResponseV1 {
66
+ content: string;
67
+ toolCalls: ToolCallV1[];
68
+ stopReason: StopReasonV1;
69
+ usage: ModelUsageV1;
70
+ receipt: ReceiptSummaryV1;
71
+ }
72
+ /** A stream of a generation: deltas, then exactly one `done` (with the same response the blocking call returns) or `error`. */
73
+ export type StreamEventV1 = {
74
+ type: 'delta';
75
+ text: string;
76
+ } | {
77
+ type: 'tool_call';
78
+ call: ToolCallV1;
79
+ } | {
80
+ type: 'done';
81
+ response: GenerateResponseV1;
82
+ } | {
83
+ type: 'error';
84
+ message: string;
85
+ failureClass?: FailureClassV1;
86
+ receiptId?: string;
87
+ };
88
+ /** The handler's refusal: the request did not reach a provider, and the reason is the whole answer (ADR-0013). */
89
+ export interface GatewayRefusalV1 {
90
+ refused: true;
91
+ reason: 'unknown_caller' | 'not_entitled' | 'unknown_profile' | 'profile_unavailable' | 'over_budget' | 'invalid_request' | 'all_attempts_failed';
92
+ detail: string;
93
+ policyDecision?: PolicyDecisionV1;
94
+ /** Receipts of the attempts that were made before refusing (every attempt is receipted, G5). */
95
+ receiptIds?: string[];
96
+ /** The last provider failure's class, when attempts were made. */
97
+ failureClass?: FailureClassV1;
98
+ }
99
+ export declare const isRefusal: (x: unknown) => x is GatewayRefusalV1;
100
+ export type ProviderKindV1 = 'anthropic' | 'openai-compat';
101
+ export type ModelCapabilityV1 = 'tools' | 'json' | 'stream' | 'logprobs' | 'vision';
102
+ export type PrivacyV1 = 'standard' | 'no-retention';
103
+ export interface ProfileCandidateV1 {
104
+ provider: ProviderKindV1;
105
+ model: string;
106
+ endpoint?: string;
107
+ }
108
+ export interface ModelProfileV1 {
109
+ id: string;
110
+ /** The words a caller uses (`plan`, `compose`, …) — never a model name. */
111
+ servesCapability: string[];
112
+ /** ORDERED candidates: attempt 1 is `models[0]`; a declared fallback moves to the next. */
113
+ models: ProfileCandidateV1[];
114
+ requiredCapabilities: ModelCapabilityV1[];
115
+ maxOutputTokens: number;
116
+ privacy: PrivacyV1;
117
+ fallbackOn: FailureClassV1[];
118
+ timeoutMs: number;
119
+ description?: string;
120
+ }
121
+ export interface ModelPricingV1 {
122
+ inputMicroUsdPerMtok: number;
123
+ outputMicroUsdPerMtok: number;
124
+ cachedInputMicroUsdPerMtok?: number;
125
+ }
126
+ export interface ModelCatalogEntryV1 {
127
+ provider: ProviderKindV1;
128
+ model: string;
129
+ /** THE ONE SWITCH (G4): off removes the model from every profile's candidates at once. */
130
+ enabled: boolean;
131
+ capabilities: ModelCapabilityV1[];
132
+ pricing: ModelPricingV1;
133
+ contextWindow: number;
134
+ privacy: PrivacyV1;
135
+ endpoint?: string;
136
+ notes?: string;
137
+ }
138
+ export declare const catalogKey: (provider: string, model: string) => string;
139
+ export type ClientKindV1 = 'estate-app' | 'town-service' | 'application';
140
+ export interface BudgetLimitsV1 {
141
+ tokensPerDay?: number;
142
+ microUsdPerDay?: number;
143
+ requestsPerMinute?: number;
144
+ concurrency?: number;
145
+ maxAttempts?: number;
146
+ }
147
+ export interface ClientEntitlementV1 {
148
+ principal: Address;
149
+ /** Spec 436 C8 — which estate (and what kind of client) made the call, for attribution and the per-estate slice. */
150
+ estate?: string;
151
+ kind: ClientKindV1;
152
+ label?: string;
153
+ profiles: string[];
154
+ /** Per profile; `*` applies to every profile not named. */
155
+ limits: Record<string, BudgetLimitsV1>;
156
+ privacyFloor?: PrivacyV1;
157
+ validUntil?: string;
158
+ }
159
+ export interface PolicyCandidateV1 {
160
+ provider: ProviderKindV1;
161
+ model: string;
162
+ endpoint?: string;
163
+ pricing: ModelPricingV1;
164
+ privacy: PrivacyV1;
165
+ }
166
+ export type PolicyDecisionV1 = {
167
+ allowed: true;
168
+ profile: string;
169
+ profileVersion: string;
170
+ candidates: PolicyCandidateV1[];
171
+ skipped: Array<{
172
+ provider: string;
173
+ model: string;
174
+ why: string;
175
+ }>;
176
+ maxOutputTokens: number;
177
+ fallbackOn: FailureClassV1[];
178
+ timeoutMs: number;
179
+ maxAttempts: number;
180
+ } | {
181
+ allowed: false;
182
+ profile: string;
183
+ profileVersion?: string;
184
+ reason: 'unknown_profile' | 'not_entitled' | 'profile_unavailable' | 'entitlement_expired';
185
+ detail: string;
186
+ skipped?: Array<{
187
+ provider: string;
188
+ model: string;
189
+ why: string;
190
+ }>;
191
+ };
192
+ export interface InferenceReceiptV1 {
193
+ id: string;
194
+ at: string;
195
+ principal: Address;
196
+ principalClass: 'app' | 'wire';
197
+ estate?: string;
198
+ clientKind?: ClientKindV1;
199
+ assertedAgent?: Address;
200
+ runRef?: string;
201
+ stepRef?: string;
202
+ purpose: string;
203
+ profile: string;
204
+ profileVersion: string;
205
+ provider: string;
206
+ model: string;
207
+ attempt: number;
208
+ fallbackOf?: string;
209
+ policyDecision: PolicyDecisionV1;
210
+ usage: ModelUsageV1;
211
+ providerUsage?: unknown;
212
+ costMicroUsd: number;
213
+ latencyMs: number;
214
+ outcome: 'answered' | 'failed' | 'refused';
215
+ failureClass?: FailureClassV1;
216
+ failureDetail?: string;
217
+ reconciliation: 'settled' | 'pending' | 'expired';
218
+ reservationId?: string;
219
+ }
220
+ export interface PolicyChangeV1 {
221
+ id: string;
222
+ at: string;
223
+ actor: Address;
224
+ recordKey: string;
225
+ before?: string;
226
+ after: string;
227
+ reason: string;
228
+ }
229
+ export interface InferenceOpsSliceV1 {
230
+ key: string;
231
+ requests: number;
232
+ answered: number;
233
+ failed: number;
234
+ refused: number;
235
+ tokensIn: number;
236
+ tokensOut: number;
237
+ costMicroUsd: number;
238
+ fallbacks: number;
239
+ latencyP50Ms: number;
240
+ latencyP95Ms: number;
241
+ }
242
+ export interface InferenceOpsSummaryV1 {
243
+ window: {
244
+ from: string;
245
+ to: string;
246
+ };
247
+ totals: InferenceOpsSliceV1;
248
+ byClient: InferenceOpsSliceV1[];
249
+ byProfile: InferenceOpsSliceV1[];
250
+ byProvider: InferenceOpsSliceV1[];
251
+ byModel: InferenceOpsSliceV1[];
252
+ byEstate: InferenceOpsSliceV1[];
253
+ pendingReconciliation: number;
254
+ }
255
+ export interface ValidationV1 {
256
+ ok: boolean;
257
+ errors: string[];
258
+ }
259
+ export declare function validateProfile(p: unknown): ValidationV1;
260
+ export declare function validateCatalogEntry(c: unknown): ValidationV1;
261
+ export declare function validateEntitlement(c: unknown): ValidationV1;
262
+ export declare function validateGenerateRequest(r: unknown): ValidationV1;
263
+ /** Canonical JSON (sorted keys, no whitespace) — the one serialization every digest in this package hashes. */
264
+ export declare function canonicalJson(value: unknown): string;
265
+ /** sha256 over the canonical JSON, as `0x…` — the profile VERSION every receipt names (G7). Web Crypto, so it runs in a Worker and in Node. */
266
+ export declare function digestOf(value: unknown): Promise<string>;
267
+ export declare const profileVersion: (p: ModelProfileV1) => Promise<string>;
268
+ //# sourceMappingURL=contract.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contract.d.ts","sourceRoot":"","sources":["../src/contract.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,128 @@
1
+ export const PACKAGE_NAME = '@agenticprimitives/model-gateway';
2
+ export const PACKAGE_STATUS = 'w1-contract';
3
+ export const SPEC_REF = 'ap-town/specs/434-ap-model-gateway-and-the-town-pulse.md';
4
+ /** The classes a profile MAY name as fallback triggers (G5). Content, policy, malformed and auth never are. */
5
+ export const FALLBACK_CLASSES = ['rate-limited', 'unavailable', 'timeout'];
6
+ export const isRefusal = (x) => !!x && typeof x === 'object' && x.refused === true;
7
+ export const catalogKey = (provider, model) => `${provider}/${model}`;
8
+ const isStr = (x) => typeof x === 'string' && x.length > 0;
9
+ const isNum = (x) => typeof x === 'number' && Number.isFinite(x);
10
+ const PROVIDERS = ['anthropic', 'openai-compat'];
11
+ const CAPS = ['tools', 'json', 'stream', 'logprobs', 'vision'];
12
+ const PRIVACY = ['standard', 'no-retention'];
13
+ export function validateProfile(p) {
14
+ const e = [];
15
+ const x = (p ?? {});
16
+ if (!isStr(x.id) || !/^[a-z][a-z0-9-]{1,63}$/.test(x.id))
17
+ e.push('id: a lowercase slug');
18
+ if (!Array.isArray(x.servesCapability) || !x.servesCapability.every(isStr))
19
+ e.push('servesCapability: a list of words');
20
+ if (!Array.isArray(x.models) || x.models.length === 0)
21
+ e.push('models: at least one ordered candidate');
22
+ else
23
+ x.models.forEach((m, i) => { if (!PROVIDERS.includes(m?.provider))
24
+ e.push(`models[${i}].provider: one of ${PROVIDERS.join(', ')}`); if (!isStr(m?.model))
25
+ e.push(`models[${i}].model: required`); });
26
+ if (!Array.isArray(x.requiredCapabilities) || !x.requiredCapabilities.every((c) => CAPS.includes(c)))
27
+ e.push('requiredCapabilities: a list of known capabilities');
28
+ if (!isNum(x.maxOutputTokens) || x.maxOutputTokens <= 0)
29
+ e.push('maxOutputTokens: a positive number');
30
+ if (!PRIVACY.includes(x.privacy))
31
+ e.push('privacy: standard | no-retention');
32
+ if (!Array.isArray(x.fallbackOn) || !x.fallbackOn.every((c) => FALLBACK_CLASSES.includes(c)))
33
+ e.push(`fallbackOn: only ${FALLBACK_CLASSES.join(', ')} — a content or policy error is never a fallback trigger`);
34
+ if (!isNum(x.timeoutMs) || x.timeoutMs <= 0)
35
+ e.push('timeoutMs: a positive number');
36
+ return { ok: e.length === 0, errors: e };
37
+ }
38
+ export function validateCatalogEntry(c) {
39
+ const e = [];
40
+ const x = (c ?? {});
41
+ if (!PROVIDERS.includes(x.provider))
42
+ e.push(`provider: one of ${PROVIDERS.join(', ')}`);
43
+ if (!isStr(x.model))
44
+ e.push('model: required');
45
+ if (typeof x.enabled !== 'boolean')
46
+ e.push('enabled: true | false');
47
+ if (!Array.isArray(x.capabilities) || !x.capabilities.every((k) => CAPS.includes(k)))
48
+ e.push('capabilities: a list of known capabilities');
49
+ const pr = x.pricing;
50
+ if (!pr || !isNum(pr.inputMicroUsdPerMtok) || !isNum(pr.outputMicroUsdPerMtok) || pr.inputMicroUsdPerMtok < 0 || pr.outputMicroUsdPerMtok < 0)
51
+ e.push('pricing: inputMicroUsdPerMtok and outputMicroUsdPerMtok ≥ 0');
52
+ if (!isNum(x.contextWindow) || x.contextWindow <= 0)
53
+ e.push('contextWindow: a positive number');
54
+ if (!PRIVACY.includes(x.privacy))
55
+ e.push('privacy: standard | no-retention');
56
+ return { ok: e.length === 0, errors: e };
57
+ }
58
+ export function validateEntitlement(c) {
59
+ const e = [];
60
+ const x = (c ?? {});
61
+ if (!isStr(x.principal) || !/^0x[0-9a-fA-F]{40}$/.test(x.principal))
62
+ e.push('principal: an address');
63
+ if (!['estate-app', 'town-service', 'application'].includes(x.kind))
64
+ e.push('kind: estate-app | town-service | application');
65
+ if (!Array.isArray(x.profiles) || !x.profiles.every(isStr))
66
+ e.push('profiles: a list of profile ids');
67
+ if (!x.limits || typeof x.limits !== 'object')
68
+ e.push('limits: a map of profile → limits');
69
+ else
70
+ for (const [k, v] of Object.entries(x.limits))
71
+ for (const [f, n] of Object.entries(v ?? {}))
72
+ if (!isNum(n) || n < 0)
73
+ e.push(`limits.${k}.${f}: a number ≥ 0`);
74
+ if (x.privacyFloor !== undefined && !PRIVACY.includes(x.privacyFloor))
75
+ e.push('privacyFloor: standard | no-retention');
76
+ return { ok: e.length === 0, errors: e };
77
+ }
78
+ export function validateGenerateRequest(r) {
79
+ const e = [];
80
+ const x = (r ?? {});
81
+ if (!isStr(x.profile))
82
+ e.push('profile: required (a profile id, never a model name)');
83
+ if (!Array.isArray(x.messages) || x.messages.length === 0)
84
+ e.push('messages: at least one');
85
+ else
86
+ x.messages.forEach((m, i) => {
87
+ if (!['system', 'user', 'assistant', 'tool'].includes(m?.role))
88
+ e.push(`messages[${i}].role: system | user | assistant | tool`);
89
+ if (typeof m?.content !== 'string')
90
+ e.push(`messages[${i}].content: a string`);
91
+ if (m?.role === 'tool' && !isStr(m.toolCallId))
92
+ e.push(`messages[${i}].toolCallId: required for a tool message`);
93
+ });
94
+ if (x.tools !== undefined) {
95
+ if (!Array.isArray(x.tools))
96
+ e.push('tools: a list');
97
+ else
98
+ x.tools.forEach((t, i) => { if (!isStr(t?.name))
99
+ e.push(`tools[${i}].name: required`); if (!t?.inputSchema || typeof t.inputSchema !== 'object')
100
+ e.push(`tools[${i}].inputSchema: an object`); });
101
+ }
102
+ if (x.maxOutputTokens !== undefined && (!isNum(x.maxOutputTokens) || x.maxOutputTokens <= 0))
103
+ e.push('maxOutputTokens: a positive number');
104
+ if (!x.context || !isStr(x.context.purpose))
105
+ e.push('context.purpose: required');
106
+ if (x.context?.agent !== undefined && !/^0x[0-9a-fA-F]{40}$/.test(String(x.context.agent)))
107
+ e.push('context.agent: an address');
108
+ return { ok: e.length === 0, errors: e };
109
+ }
110
+ /** Canonical JSON (sorted keys, no whitespace) — the one serialization every digest in this package hashes. */
111
+ export function canonicalJson(value) {
112
+ const sort = (v) => {
113
+ if (Array.isArray(v))
114
+ return v.map(sort);
115
+ if (v && typeof v === 'object')
116
+ return Object.fromEntries(Object.keys(v).sort().map((k) => [k, sort(v[k])]));
117
+ return v;
118
+ };
119
+ return JSON.stringify(sort(value));
120
+ }
121
+ /** sha256 over the canonical JSON, as `0x…` — the profile VERSION every receipt names (G7). Web Crypto, so it runs in a Worker and in Node. */
122
+ export async function digestOf(value) {
123
+ const bytes = new TextEncoder().encode(canonicalJson(value));
124
+ const hash = await crypto.subtle.digest('SHA-256', bytes);
125
+ return `0x${Array.from(new Uint8Array(hash)).map((b) => b.toString(16).padStart(2, '0')).join('')}`;
126
+ }
127
+ export const profileVersion = (p) => digestOf(p);
128
+ //# sourceMappingURL=contract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contract.js","sourceRoot":"","sources":["../src/contract.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import type { Address } from '@agenticprimitives/types';
2
+ import { type GenerateRequestV1, type GenerateResponseV1, type GatewayRefusalV1, type PolicyDecisionV1, type StreamEventV1 } from './contract.js';
3
+ import { type CallerCredentialV1, type MeterPort, type PolicyStorePort, type PrincipalResolverPort, type ProviderAdapter, type ReceiptLedgerPort, type ResolvedPrincipalV1 } from './ports.js';
4
+ export interface GatewayPorts {
5
+ resolver: PrincipalResolverPort;
6
+ policy: PolicyStorePort;
7
+ meter: MeterPort;
8
+ ledger: ReceiptLedgerPort;
9
+ adapters: Record<string, ProviderAdapter>;
10
+ now?: () => number;
11
+ newId?: () => string;
12
+ /** Receipts are written in the background by the Worker (`waitUntil`); absent ⇒ awaited inline. */
13
+ waitUntil?: (p: Promise<unknown>) => void;
14
+ log?: (line: string) => void;
15
+ }
16
+ export interface GatewayHandler {
17
+ generate(req: GenerateRequestV1, caller: CallerCredentialV1): Promise<GenerateResponseV1 | GatewayRefusalV1>;
18
+ stream(req: GenerateRequestV1, caller: CallerCredentialV1, onEvent: (e: StreamEventV1) => void): Promise<GenerateResponseV1 | GatewayRefusalV1>;
19
+ /** The principal for a caller, for the Worker's other routes (`/v1/models`, ops) — the same resolver, never a second one. */
20
+ whoIs(caller: CallerCredentialV1): Promise<ResolvedPrincipalV1 | null>;
21
+ }
22
+ export declare function createGatewayHandler(ports: GatewayPorts): GatewayHandler;
23
+ export type { PolicyDecisionV1, Address };
24
+ //# sourceMappingURL=handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../src/handler.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EACgB,KAAK,iBAAiB,EAAE,KAAK,kBAAkB,EAAE,KAAK,gBAAgB,EAA8C,KAAK,gBAAgB,EAAE,KAAK,aAAa,EAEnL,MAAM,eAAe,CAAC;AAGvB,OAAO,EAAuC,KAAK,kBAAkB,EAAE,KAAK,SAAS,EAAE,KAAK,eAAe,EAAE,KAAK,qBAAqB,EAAE,KAAK,eAAe,EAAE,KAAK,iBAAiB,EAAE,KAAK,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAGpO,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,qBAAqB,CAAC;IAChC,MAAM,EAAE,eAAe,CAAC;IACxB,KAAK,EAAE,SAAS,CAAC;IACjB,MAAM,EAAE,iBAAiB,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IAC1C,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,MAAM,CAAC;IACrB,mGAAmG;IACnG,SAAS,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC;IAC1C,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9B;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,GAAG,EAAE,iBAAiB,EAAE,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,kBAAkB,GAAG,gBAAgB,CAAC,CAAC;IAC7G,MAAM,CAAC,GAAG,EAAE,iBAAiB,EAAE,MAAM,EAAE,kBAAkB,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,aAAa,KAAK,IAAI,GAAG,OAAO,CAAC,kBAAkB,GAAG,gBAAgB,CAAC,CAAC;IAChJ,6HAA6H;IAC7H,KAAK,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC,CAAC;CACxE;AAKD,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,YAAY,GAAG,cAAc,CAmGxE;AAED,YAAY,EAAE,gBAAgB,EAAE,OAAO,EAAE,CAAC"}
@@ -0,0 +1,124 @@
1
+ import { validateGenerateRequest, } from './contract.js';
2
+ import { costMicroUsd, estimateCostMicroUsd, estimateTokens } from './budget.js';
3
+ import { decidePolicy, limitsFor } from './policy.js';
4
+ import { classifyError } from './ports.js';
5
+ import { UNKNOWN_USAGE } from './usage.js';
6
+ const defaultId = () => (typeof globalThis.crypto?.randomUUID === "function" ? crypto.randomUUID() : `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 10)}`);
7
+ const promptChars = (req) => req.messages.reduce((n, m) => n + m.content.length, 0) + (req.tools ? JSON.stringify(req.tools).length : 0);
8
+ export function createGatewayHandler(ports) {
9
+ const now = ports.now ?? (() => Date.now());
10
+ const newId = ports.newId ?? defaultId;
11
+ const write = (r) => {
12
+ const p = ports.ledger.write(r).catch((e) => ports.log?.(`[ledger] receipt ${r.id} not written: ${e instanceof Error ? e.message : String(e)}`));
13
+ if (ports.waitUntil)
14
+ ports.waitUntil(p);
15
+ };
16
+ async function run(req, caller, onDelta) {
17
+ const v = validateGenerateRequest(req);
18
+ if (!v.ok)
19
+ return { refused: true, reason: 'invalid_request', detail: v.errors.join('; ') };
20
+ const who = await ports.resolver.resolve(caller);
21
+ if (!who)
22
+ return { refused: true, reason: 'unknown_caller', detail: 'no principal could be established for this credential' };
23
+ const [entitlement, stored, catalog] = await Promise.all([ports.policy.entitlement(who.principal), ports.policy.profile(req.profile), ports.policy.catalog()]);
24
+ const decision = await decidePolicy({ profile: stored?.profile ?? null, catalog, entitlement, request: req, now: new Date(now()), ...(stored ? { profileVersion: stored.version } : {}) });
25
+ const base = { principal: who.principal, principalClass: who.principalClass, ...(who.estate ? { estate: who.estate } : {}), ...(who.clientKind ? { clientKind: who.clientKind } : {}), ...(req.context.agent ? { assertedAgent: req.context.agent } : {}), ...(req.context.runRef ? { runRef: req.context.runRef } : {}), ...(req.context.stepRef ? { stepRef: req.context.stepRef } : {}), purpose: req.context.purpose, profile: req.profile };
26
+ if (!decision.allowed) {
27
+ const id = newId();
28
+ write({ id, at: new Date(now()).toISOString(), ...base, profileVersion: decision.profileVersion ?? '', provider: '', model: '', attempt: 0, policyDecision: decision, usage: UNKNOWN_USAGE, costMicroUsd: 0, latencyMs: 0, outcome: 'refused', failureClass: 'policy', failureDetail: decision.detail, reconciliation: 'settled' });
29
+ const reason = decision.reason === 'unknown_profile' ? 'unknown_profile' : decision.reason === 'profile_unavailable' ? 'profile_unavailable' : 'not_entitled';
30
+ return { refused: true, reason, detail: decision.detail, policyDecision: decision, receiptIds: [id] };
31
+ }
32
+ // Reserve against the FIRST candidate's price at the profile's ceiling; settle corrects it.
33
+ const first = decision.candidates[0];
34
+ const estTokensIn = estimateTokens(promptChars(req));
35
+ const estimate = { estimateTokens: estTokensIn + decision.maxOutputTokens, estimateMicroUsd: estimateCostMicroUsd(estTokensIn, decision.maxOutputTokens, first.pricing) };
36
+ const reserved = await ports.meter.reserve({ principal: who.principal, profile: req.profile, ...estimate, limits: limitsFor(entitlement, req.profile) });
37
+ if (!reserved.ok) {
38
+ const id = newId();
39
+ write({ id, at: new Date(now()).toISOString(), ...base, profileVersion: decision.profileVersion, provider: first.provider, model: first.model, attempt: 0, policyDecision: decision, usage: UNKNOWN_USAGE, costMicroUsd: 0, latencyMs: 0, outcome: 'refused', failureClass: 'policy', failureDetail: `${reserved.reason}: ${reserved.detail}`, reconciliation: 'settled' });
40
+ return { refused: true, reason: 'over_budget', detail: `${reserved.reason}: ${reserved.detail}`, policyDecision: decision, receiptIds: [id] };
41
+ }
42
+ const receiptIds = [];
43
+ let fallbackOf;
44
+ let lastClass;
45
+ let lastDetail = '';
46
+ /** An attempt timed out: its usage is unknown, so the reservation stays held for the sweep whatever happens next. */
47
+ let heldPending = false;
48
+ for (let attempt = 1; attempt <= decision.maxAttempts; attempt++) {
49
+ const cand = decision.candidates[attempt - 1];
50
+ const adapter = ports.adapters[cand.provider];
51
+ const id = newId();
52
+ receiptIds.push(id);
53
+ const t0 = now();
54
+ const receiptBase = { id, at: new Date(t0).toISOString(), ...base, profileVersion: decision.profileVersion, provider: cand.provider, model: cand.model, attempt, ...(fallbackOf ? { fallbackOf } : {}), policyDecision: decision, reservationId: reserved.reservationId };
55
+ if (!adapter) {
56
+ lastClass = 'unavailable';
57
+ lastDetail = `no adapter is bound for provider "${cand.provider}"`;
58
+ write({ ...receiptBase, usage: UNKNOWN_USAGE, costMicroUsd: 0, latencyMs: 0, outcome: 'failed', failureClass: lastClass, failureDetail: lastDetail, reconciliation: 'settled' });
59
+ if (!decision.fallbackOn.includes('unavailable'))
60
+ break;
61
+ fallbackOf = id;
62
+ continue;
63
+ }
64
+ const adapterReq = { model: cand.model, ...(cand.endpoint ? { endpoint: cand.endpoint } : {}), messages: req.messages, ...(req.tools ? { tools: req.tools } : {}), ...(req.toolChoice ? { toolChoice: req.toolChoice } : {}), maxOutputTokens: decision.maxOutputTokens, ...(req.temperature !== undefined ? { temperature: req.temperature } : {}), timeoutMs: decision.timeoutMs };
65
+ let result;
66
+ try {
67
+ result = onDelta && adapter.stream ? await adapter.stream(adapterReq, onDelta) : await adapter.generate(adapterReq);
68
+ if (onDelta && !adapter.stream)
69
+ onDelta(result.content);
70
+ }
71
+ catch (e) {
72
+ lastClass = classifyError(e);
73
+ lastDetail = e instanceof Error ? e.message : String(e);
74
+ const latencyMs = now() - t0;
75
+ // A timeout may have cost tokens we cannot see: the reservation is HELD for the reconciler, never released as zero.
76
+ const pending = lastClass === 'timeout';
77
+ if (pending)
78
+ heldPending = true;
79
+ write({ ...receiptBase, usage: UNKNOWN_USAGE, costMicroUsd: 0, latencyMs, outcome: 'failed', failureClass: lastClass, failureDetail: lastDetail, reconciliation: pending ? 'pending' : 'settled' });
80
+ if (pending && ports.meter.hold)
81
+ await ports.meter.hold({ principal: who.principal, reservationId: reserved.reservationId });
82
+ ports.log?.(`[attempt ${attempt}] ${cand.provider}/${cand.model} failed ${lastClass}: ${lastDetail.slice(0, 160)}`);
83
+ if (!decision.fallbackOn.includes(lastClass) || attempt === decision.maxAttempts)
84
+ break;
85
+ fallbackOf = id;
86
+ continue;
87
+ }
88
+ const latencyMs = now() - t0;
89
+ const usage = result.usage ?? UNKNOWN_USAGE;
90
+ const cost = costMicroUsd(usage, cand.pricing);
91
+ const reconciliation = result.usage ? 'settled' : 'pending';
92
+ if (result.usage)
93
+ await ports.meter.settle({ principal: who.principal, reservationId: reserved.reservationId, usage, costMicroUsd: cost });
94
+ else if (ports.meter.hold)
95
+ await ports.meter.hold({ principal: who.principal, reservationId: reserved.reservationId });
96
+ write({ ...receiptBase, usage, ...(result.providerUsage !== undefined ? { providerUsage: result.providerUsage } : {}), costMicroUsd: cost, latencyMs, outcome: 'answered', reconciliation });
97
+ return {
98
+ content: result.content, toolCalls: result.toolCalls, stopReason: result.stopReason, usage,
99
+ receipt: { id, profile: req.profile, profileVersion: decision.profileVersion, provider: cand.provider, model: cand.model, attempt, ...(fallbackOf ? { fallbackOf } : {}), policyDecision: decision, costMicroUsd: cost, latencyMs, reconciliation },
100
+ };
101
+ }
102
+ // Every attempt failed (or the class was not a fallback trigger): the reservation is settled at zero actual usage ONLY
103
+ // when every failure says nothing was consumed; one timeout anywhere keeps it pending for the sweep.
104
+ if (!heldPending)
105
+ await ports.meter.settle({ principal: who.principal, reservationId: reserved.reservationId, usage: UNKNOWN_USAGE, costMicroUsd: 0 });
106
+ return { refused: true, reason: 'all_attempts_failed', detail: lastDetail || 'no attempt answered', policyDecision: decision, receiptIds, ...(lastClass ? { failureClass: lastClass } : {}) };
107
+ }
108
+ return {
109
+ generate: (req, caller) => run(req, caller),
110
+ async stream(req, caller, onEvent) {
111
+ const out = await run(req, caller, (text) => onEvent({ type: 'delta', text }));
112
+ if ('refused' in out)
113
+ onEvent({ type: 'error', message: out.detail, ...(out.failureClass ? { failureClass: out.failureClass } : {}), ...(out.receiptIds?.length ? { receiptId: out.receiptIds[out.receiptIds.length - 1] } : {}) });
114
+ else {
115
+ for (const call of out.toolCalls)
116
+ onEvent({ type: 'tool_call', call });
117
+ onEvent({ type: 'done', response: out });
118
+ }
119
+ return out;
120
+ },
121
+ whoIs: (caller) => ports.resolver.resolve(caller),
122
+ };
123
+ }
124
+ //# sourceMappingURL=handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handler.js","sourceRoot":"","sources":["../src/handler.ts"],"names":[],"mappings":"AAIA,OAAO,EAEL,uBAAuB,GACxB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,YAAY,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AACjF,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,aAAa,EAA2L,MAAM,YAAY,CAAC;AACpO,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAsB3C,MAAM,SAAS,GAAG,GAAW,EAAE,CAAC,CAAC,OAAO,UAAU,CAAC,MAAM,EAAE,UAAU,KAAK,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;AACtL,MAAM,WAAW,GAAG,CAAC,GAAsB,EAAU,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAEpK,MAAM,UAAU,oBAAoB,CAAC,KAAmB;IACtD,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IAC5C,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,IAAI,SAAS,CAAC;IACvC,MAAM,KAAK,GAAG,CAAC,CAAqB,EAAQ,EAAE;QAC5C,MAAM,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,oBAAoB,CAAC,CAAC,EAAE,iBAAiB,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACjJ,IAAI,KAAK,CAAC,SAAS;YAAE,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IAC1C,CAAC,CAAC;IAEF,KAAK,UAAU,GAAG,CAAC,GAAsB,EAAE,MAA0B,EAAE,OAAgC;QACrG,MAAM,CAAC,GAAG,uBAAuB,CAAC,GAAG,CAAC,CAAC;QACvC,IAAI,CAAC,CAAC,CAAC,EAAE;YAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5F,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACjD,IAAI,CAAC,GAAG;YAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,EAAE,uDAAuD,EAAE,CAAC;QAC9H,MAAM,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAC/J,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,IAAI,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAC3L,MAAM,IAAI,GAAG,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,cAAc,EAAE,GAAG,CAAC,cAAc,EAAE,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAW,CAAC;QAE1b,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;YACtB,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC;YACnB,KAAK,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,WAAW,EAAE,EAAE,GAAG,IAAI,EAAE,cAAc,EAAE,QAAQ,CAAC,cAAc,IAAI,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,cAAc,EAAE,QAAQ,EAAE,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,QAAQ,EAAE,aAAa,EAAE,QAAQ,CAAC,MAAM,EAAE,cAAc,EAAE,SAAS,EAAE,CAAC,CAAC;YACpU,MAAM,MAAM,GAA+B,QAAQ,CAAC,MAAM,KAAK,iBAAiB,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,KAAK,qBAAqB,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,cAAc,CAAC;YAC1L,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,cAAc,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;QACxG,CAAC;QAED,4FAA4F;QAC5F,MAAM,KAAK,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAE,CAAC;QACtC,MAAM,WAAW,GAAG,cAAc,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;QACrD,MAAM,QAAQ,GAAG,EAAE,cAAc,EAAE,WAAW,GAAG,QAAQ,CAAC,eAAe,EAAE,gBAAgB,EAAE,oBAAoB,CAAC,WAAW,EAAE,QAAQ,CAAC,eAAe,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;QAC1K,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,GAAG,QAAQ,EAAE,MAAM,EAAE,SAAS,CAAC,WAAW,EAAE,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACzJ,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC;YACnB,KAAK,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,WAAW,EAAE,EAAE,GAAG,IAAI,EAAE,cAAc,EAAE,QAAQ,CAAC,cAAc,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC,EAAE,cAAc,EAAE,QAAQ,EAAE,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,QAAQ,EAAE,aAAa,EAAE,GAAG,QAAQ,CAAC,MAAM,KAAK,QAAQ,CAAC,MAAM,EAAE,EAAE,cAAc,EAAE,SAAS,EAAE,CAAC,CAAC;YAC5W,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,GAAG,QAAQ,CAAC,MAAM,KAAK,QAAQ,CAAC,MAAM,EAAE,EAAE,cAAc,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;QAChJ,CAAC;QAED,MAAM,UAAU,GAAa,EAAE,CAAC;QAChC,IAAI,UAA8B,CAAC;QACnC,IAAI,SAAqC,CAAC;QAC1C,IAAI,UAAU,GAAG,EAAE,CAAC;QACpB,qHAAqH;QACrH,IAAI,WAAW,GAAG,KAAK,CAAC;QACxB,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,QAAQ,CAAC,WAAW,EAAE,OAAO,EAAE,EAAE,CAAC;YACjE,MAAM,IAAI,GAAG,QAAQ,CAAC,UAAU,CAAC,OAAO,GAAG,CAAC,CAAE,CAAC;YAC/C,MAAM,OAAO,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC9C,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC;YACnB,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACpB,MAAM,EAAE,GAAG,GAAG,EAAE,CAAC;YACjB,MAAM,WAAW,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,EAAE,GAAG,IAAI,EAAE,cAAc,EAAE,QAAQ,CAAC,cAAc,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,cAAc,EAAE,QAAQ,EAAE,aAAa,EAAE,QAAQ,CAAC,aAAa,EAAW,CAAC;YACnR,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,SAAS,GAAG,aAAa,CAAC;gBAAC,UAAU,GAAG,qCAAqC,IAAI,CAAC,QAAQ,GAAG,CAAC;gBAC9F,KAAK,CAAC,EAAE,GAAG,WAAW,EAAE,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,SAAS,EAAE,aAAa,EAAE,UAAU,EAAE,cAAc,EAAE,SAAS,EAAE,CAAC,CAAC;gBACjL,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,aAAa,CAAC;oBAAE,MAAM;gBACxD,UAAU,GAAG,EAAE,CAAC;gBAAC,SAAS;YAC5B,CAAC;YACD,MAAM,UAAU,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,eAAe,EAAE,QAAQ,CAAC,eAAe,EAAE,GAAG,CAAC,GAAG,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,SAAS,EAAE,QAAQ,CAAC,SAAS,EAAE,CAAC;YACrX,IAAI,MAAuB,CAAC;YAC5B,IAAI,CAAC;gBACH,MAAM,GAAG,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;gBACpH,IAAI,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM;oBAAE,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAC1D,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,SAAS,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;gBAAC,UAAU,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;gBACtF,MAAM,SAAS,GAAG,GAAG,EAAE,GAAG,EAAE,CAAC;gBAC7B,oHAAoH;gBACpH,MAAM,OAAO,GAAG,SAAS,KAAK,SAAS,CAAC;gBACxC,IAAI,OAAO;oBAAE,WAAW,GAAG,IAAI,CAAC;gBAChC,KAAK,CAAC,EAAE,GAAG,WAAW,EAAE,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,SAAS,EAAE,aAAa,EAAE,UAAU,EAAE,cAAc,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;gBACpM,IAAI,OAAO,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI;oBAAE,MAAM,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,aAAa,EAAE,QAAQ,CAAC,aAAa,EAAE,CAAC,CAAC;gBAC7H,KAAK,CAAC,GAAG,EAAE,CAAC,YAAY,OAAO,KAAK,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,KAAK,WAAW,SAAS,KAAK,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;gBACpH,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,OAAO,KAAK,QAAQ,CAAC,WAAW;oBAAE,MAAM;gBACxF,UAAU,GAAG,EAAE,CAAC;gBAAC,SAAS;YAC5B,CAAC;YACD,MAAM,SAAS,GAAG,GAAG,EAAE,GAAG,EAAE,CAAC;YAC7B,MAAM,KAAK,GAAiB,MAAM,CAAC,KAAK,IAAI,aAAa,CAAC;YAC1D,MAAM,IAAI,GAAG,YAAY,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;YAC/C,MAAM,cAAc,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;YAC5D,IAAI,MAAM,CAAC,KAAK;gBAAE,MAAM,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,aAAa,EAAE,QAAQ,CAAC,aAAa,EAAE,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC;iBACtI,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI;gBAAE,MAAM,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,aAAa,EAAE,QAAQ,CAAC,aAAa,EAAE,CAAC,CAAC;YACvH,KAAK,CAAC,EAAE,GAAG,WAAW,EAAE,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,YAAY,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,CAAC,CAAC;YAC7L,OAAO;gBACL,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,KAAK;gBAC1F,OAAO,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,cAAc,EAAE,QAAQ,CAAC,cAAc,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,cAAc,EAAE,QAAQ,EAAE,YAAY,EAAE,IAAI,EAAE,SAAS,EAAE,cAAc,EAAE;aACpP,CAAC;QACJ,CAAC;QACD,uHAAuH;QACvH,qGAAqG;QACrG,IAAI,CAAC,WAAW;YAAE,MAAM,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,aAAa,EAAE,QAAQ,CAAC,aAAa,EAAE,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC,CAAC;QACvJ,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,qBAAqB,EAAE,MAAM,EAAE,UAAU,IAAI,qBAAqB,EAAE,cAAc,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IAChM,CAAC;IAED,OAAO;QACL,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC;QAC3C,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO;YAC/B,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;YAC/E,IAAI,SAAS,IAAI,GAAG;gBAAE,OAAO,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,GAAG,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;iBAC/N,CAAC;gBAAC,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,SAAS;oBAAE,OAAO,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;gBAAC,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC;YAAC,CAAC;YAC1H,OAAO,GAAG,CAAC;QACb,CAAC;QACD,KAAK,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC;KAClD,CAAC;AACJ,CAAC"}
@@ -0,0 +1,20 @@
1
+ export { PACKAGE_NAME, PACKAGE_STATUS, SPEC_REF, FALLBACK_CLASSES, isRefusal, catalogKey, canonicalJson, digestOf, profileVersion, validateProfile, validateCatalogEntry, validateEntitlement, validateGenerateRequest, } from './contract.js';
2
+ export type { MessageRoleV1, MessageV1, ToolDefinitionV1, ToolCallV1, ToolChoiceV1, GenerateContextV1, GenerateRequestV1, GenerateResponseV1, StreamEventV1, GatewayRefusalV1, StopReasonV1, FailureClassV1, ReceiptSummaryV1, ProviderKindV1, ModelCapabilityV1, PrivacyV1, ProfileCandidateV1, ModelProfileV1, ModelPricingV1, ModelCatalogEntryV1, ClientKindV1, BudgetLimitsV1, ClientEntitlementV1, PolicyCandidateV1, PolicyDecisionV1, InferenceReceiptV1, PolicyChangeV1, InferenceOpsSliceV1, InferenceOpsSummaryV1, ValidationV1, ModelUsageV1, } from './contract.js';
3
+ export { decidePolicy, limitsFor, profilesEmptiedBy, DEFAULT_MAX_ATTEMPTS } from './policy.js';
4
+ export type { PolicyInput } from './policy.js';
5
+ export { reserve, settle, expire, stale, rollDay, rebuildFromReceipts, utilisation, emptyBudget, estimateTokens, estimateCostMicroUsd, costMicroUsd, dayOf, minuteOf } from './budget.js';
6
+ export type { BudgetStateV1, ProfileCountersV1, ReservationV1, ReserveResult } from './budget.js';
7
+ export { normalizeAnthropicUsage, normalizeOpenAiUsage, UNKNOWN_USAGE } from './usage.js';
8
+ export type { AnthropicRawUsage, OpenAiRawUsage } from './usage.js';
9
+ export { ProviderFailure, classifyStatus, classifyError } from './ports.js';
10
+ export type { CallerCredentialV1, ResolvedPrincipalV1, PrincipalResolverPort, PolicyStorePort, MeterPort, ReceiptLedgerPort, AdapterRequestV1, AdapterResultV1, ProviderAdapter } from './ports.js';
11
+ export { createGatewayHandler } from './handler.js';
12
+ export type { GatewayPorts, GatewayHandler } from './handler.js';
13
+ export { anthropicAdapter, foldForAnthropic } from './adapters/anthropic.js';
14
+ export type { AnthropicAdapterOpts } from './adapters/anthropic.js';
15
+ export { openAiCompatAdapter, foldForOpenAi, parseToolCalls } from './adapters/openai-compat.js';
16
+ export type { OpenAiCompatAdapterOpts } from './adapters/openai-compat.js';
17
+ export { chatRequestToGenerate, generateToChatCompletion, refusalToChatError, streamEventToChatChunks } from './openai-compat/translate.js';
18
+ export type { ChatCompletionRequest, ChatCompletionResponse, TranslateResult } from './openai-compat/translate.js';
19
+ export { summarizeReceipts } from './ops.js';
20
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,YAAY,EAAE,cAAc,EAAE,QAAQ,EAAE,gBAAgB,EAAE,SAAS,EAAE,UAAU,EAAE,aAAa,EAAE,QAAQ,EAAE,cAAc,EACxH,eAAe,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,uBAAuB,GACpF,MAAM,eAAe,CAAC;AACvB,YAAY,EACV,aAAa,EAAE,SAAS,EAAE,gBAAgB,EAAE,UAAU,EAAE,YAAY,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,aAAa,EAAE,gBAAgB,EAC/J,YAAY,EAAE,cAAc,EAAE,gBAAgB,EAAE,cAAc,EAAE,iBAAiB,EAAE,SAAS,EAAE,kBAAkB,EAAE,cAAc,EAAE,cAAc,EAAE,mBAAmB,EACrK,YAAY,EAAE,cAAc,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,cAAc,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,YAAY,EAAE,YAAY,GACnM,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAC/F,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,mBAAmB,EAAE,WAAW,EAAE,WAAW,EAAE,cAAc,EAAE,oBAAoB,EAAE,YAAY,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC1L,YAAY,EAAE,aAAa,EAAE,iBAAiB,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAClG,OAAO,EAAE,uBAAuB,EAAE,oBAAoB,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC1F,YAAY,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC5E,YAAY,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,eAAe,EAAE,SAAS,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AACpM,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACpD,YAAY,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACjE,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC7E,YAAY,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AACpE,OAAO,EAAE,mBAAmB,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AACjG,YAAY,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AAC3E,OAAO,EAAE,qBAAqB,EAAE,wBAAwB,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AAC5I,YAAY,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AACnH,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC"}