@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.
- package/LICENSE +21 -0
- package/README.md +29 -0
- package/dist/adapters/anthropic.d.ts +13 -0
- package/dist/adapters/anthropic.d.ts.map +1 -0
- package/dist/adapters/anthropic.js +59 -0
- package/dist/adapters/anthropic.js.map +1 -0
- package/dist/adapters/openai-compat.d.ts +17 -0
- package/dist/adapters/openai-compat.d.ts.map +1 -0
- package/dist/adapters/openai-compat.js +66 -0
- package/dist/adapters/openai-compat.js.map +1 -0
- package/dist/budget.d.ts +86 -0
- package/dist/budget.d.ts.map +1 -0
- package/dist/budget.js +98 -0
- package/dist/budget.js.map +1 -0
- package/dist/contract.d.ts +268 -0
- package/dist/contract.d.ts.map +1 -0
- package/dist/contract.js +128 -0
- package/dist/contract.js.map +1 -0
- package/dist/handler.d.ts +24 -0
- package/dist/handler.d.ts.map +1 -0
- package/dist/handler.js +124 -0
- package/dist/handler.js.map +1 -0
- package/dist/index.d.ts +20 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +13 -0
- package/dist/index.js.map +1 -0
- package/dist/openai-compat/translate.d.ts +122 -0
- package/dist/openai-compat/translate.d.ts.map +1 -0
- package/dist/openai-compat/translate.js +72 -0
- package/dist/openai-compat/translate.js.map +1 -0
- package/dist/ops.d.ts +6 -0
- package/dist/ops.d.ts.map +1 -0
- package/dist/ops.js +38 -0
- package/dist/ops.js.map +1 -0
- package/dist/policy.d.ts +26 -0
- package/dist/policy.d.ts.map +1 -0
- package/dist/policy.js +83 -0
- package/dist/policy.js.map +1 -0
- package/dist/ports.d.ts +95 -0
- package/dist/ports.d.ts.map +1 -0
- package/dist/ports.js +43 -0
- package/dist/ports.js.map +1 -0
- package/dist/usage.d.ts +23 -0
- package/dist/usage.d.ts.map +1 -0
- package/dist/usage.js +16 -0
- package/dist/usage.js.map +1 -0
- package/package.json +32 -0
- 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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"}
|
package/dist/contract.js
ADDED
|
@@ -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"}
|
package/dist/handler.js
ADDED
|
@@ -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":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -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"}
|