@modelcost/sdk 0.1.0 → 0.2.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/dist/index.d.mts +2 -3
- package/dist/index.d.ts +2 -3
- package/dist/index.js +7 -17
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +7 -17
- package/dist/index.mjs.map +1 -1
- package/package.json +21 -8
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/models/common.ts","../src/config.ts","../src/version.ts","../src/errors.ts","../src/models/track.ts","../src/models/session.ts","../src/models/budget.ts","../src/models/governance.ts","../src/client.ts","../src/budget.ts","../src/tracking.ts","../src/pii.ts","../src/rate-limiter.ts","../src/providers/openai.ts","../src/providers/anthropic.ts","../src/providers/google.ts","../src/providers/index.ts","../src/session.ts","../src/index.ts"],"names":["z"],"mappings":"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","file":"index.mjs","sourcesContent":["import { z } from \"zod\";\n\n/** Actions that can be taken when a budget threshold is reached. */\nexport const BudgetAction = z.enum([\"alert\", \"throttle\", \"block\"]);\nexport type BudgetAction = z.infer<typeof BudgetAction>;\n\n/** Scope levels for budget policies. */\nexport const BudgetScope = z.enum([\n \"organization\",\n \"feature\",\n \"environment\",\n \"custom\",\n]);\nexport type BudgetScope = z.infer<typeof BudgetScope>;\n\n/** Time periods for budget policies. */\nexport const BudgetPeriod = z.enum([\"daily\", \"weekly\", \"monthly\", \"custom\"]);\nexport type BudgetPeriod = z.infer<typeof BudgetPeriod>;\n\n/** Supported AI providers. */\nexport const Provider = z.enum([\n \"openai\",\n \"anthropic\",\n \"google\",\n \"aws_bedrock\",\n \"cohere\",\n \"mistral\",\n]);\nexport type Provider = z.infer<typeof Provider>;\n","import { z } from \"zod\";\nimport { BudgetAction } from \"./models/common.js\";\n\n/**\n * Zod schema for ModelCost initialization options.\n * Validates all configuration fields and applies defaults.\n */\nexport const ModelCostInitOptionsSchema = z.object({\n apiKey: z\n .string()\n .startsWith(\"mc_\", { message: \"API key must start with 'mc_'\" })\n .describe(\"ModelCost API key\"),\n orgId: z.string().min(1, { message: \"Organization ID is required\" }),\n environment: z.string().default(\"production\"),\n baseUrl: z.string().url().default(\"https://api.modelcost.ai\"),\n monthlyBudget: z.number().positive().optional(),\n budgetAction: BudgetAction.default(\"alert\"),\n failOpen: z.boolean().default(true),\n flushIntervalMs: z.number().int().positive().default(5000),\n flushBatchSize: z.number().int().positive().default(100),\n syncIntervalMs: z.number().int().positive().default(10000),\n contentPrivacy: z.boolean().default(false),\n});\n\nexport type ModelCostInitOptions = z.input<typeof ModelCostInitOptionsSchema>;\n\n/**\n * Resolved configuration after validation and env-var fallback.\n */\nexport type ModelCostResolvedConfig = z.output<typeof ModelCostInitOptionsSchema>;\n\n/**\n * Configuration manager that validates init options and reads\n * environment variables as fallbacks.\n */\nexport class ModelCostConfig {\n public readonly apiKey: string;\n public readonly orgId: string;\n public readonly environment: string;\n public readonly baseUrl: string;\n public readonly monthlyBudget: number | undefined;\n public readonly budgetAction: z.infer<typeof BudgetAction>;\n public readonly failOpen: boolean;\n public readonly flushIntervalMs: number;\n public readonly flushBatchSize: number;\n public readonly syncIntervalMs: number;\n public readonly contentPrivacy: boolean;\n\n constructor(options: ModelCostInitOptions) {\n const merged = {\n apiKey: options.apiKey ?? process.env[\"MODELCOST_API_KEY\"],\n orgId: options.orgId ?? process.env[\"MODELCOST_ORG_ID\"],\n environment:\n options.environment ?? process.env[\"MODELCOST_ENV\"] ?? \"production\",\n baseUrl:\n options.baseUrl ??\n process.env[\"MODELCOST_BASE_URL\"] ??\n \"https://api.modelcost.ai\",\n monthlyBudget: options.monthlyBudget,\n budgetAction: options.budgetAction ?? \"alert\",\n failOpen: options.failOpen ?? true,\n flushIntervalMs: options.flushIntervalMs ?? 5000,\n flushBatchSize: options.flushBatchSize ?? 100,\n syncIntervalMs: options.syncIntervalMs ?? 10000,\n contentPrivacy:\n options.contentPrivacy ??\n (process.env[\"MODELCOST_CONTENT_PRIVACY\"] === \"true\" || false),\n };\n\n const parsed = ModelCostInitOptionsSchema.parse(merged);\n\n this.apiKey = parsed.apiKey;\n this.orgId = parsed.orgId;\n this.environment = parsed.environment;\n this.baseUrl = parsed.baseUrl;\n this.monthlyBudget = parsed.monthlyBudget;\n this.budgetAction = parsed.budgetAction;\n this.failOpen = parsed.failOpen;\n this.flushIntervalMs = parsed.flushIntervalMs;\n this.flushBatchSize = parsed.flushBatchSize;\n this.syncIntervalMs = parsed.syncIntervalMs;\n this.contentPrivacy = parsed.contentPrivacy;\n }\n}\n","export const VERSION = \"0.1.0\";\n","import type { DetectedViolation } from \"./models/governance.js\";\n\n/**\n * Base error class for all ModelCost SDK errors.\n */\nexport class ModelCostError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"ModelCostError\";\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/**\n * Thrown when the SDK is misconfigured (invalid API key, missing org ID, etc.).\n */\nexport class ConfigurationError extends ModelCostError {\n constructor(message: string) {\n super(message);\n this.name = \"ConfigurationError\";\n }\n}\n\n/**\n * Thrown when a request is blocked because the budget has been exceeded.\n */\nexport class BudgetExceededError extends ModelCostError {\n public readonly remainingBudget: number;\n public readonly scope: string;\n public readonly overrideUrl?: string;\n\n constructor(\n message: string,\n remainingBudget: number,\n scope: string,\n overrideUrl?: string,\n ) {\n super(message);\n this.name = \"BudgetExceededError\";\n this.remainingBudget = remainingBudget;\n this.scope = scope;\n this.overrideUrl = overrideUrl;\n }\n}\n\n/**\n * Thrown when the client is rate-limited by the ModelCost API.\n */\nexport class RateLimitedError extends ModelCostError {\n public readonly retryAfterSeconds: number;\n public readonly limitDimension: string;\n\n constructor(\n message: string,\n retryAfterSeconds: number,\n limitDimension: string,\n ) {\n super(message);\n this.name = \"RateLimitedError\";\n this.retryAfterSeconds = retryAfterSeconds;\n this.limitDimension = limitDimension;\n }\n}\n\n/**\n * Thrown when PII is detected in scanned text and the policy requires blocking.\n */\nexport class PiiDetectedError extends ModelCostError {\n public readonly detectedEntities: DetectedViolation[];\n public readonly redactedText: string;\n\n constructor(\n message: string,\n detectedEntities: DetectedViolation[],\n redactedText: string,\n ) {\n super(message);\n this.name = \"PiiDetectedError\";\n this.detectedEntities = detectedEntities;\n this.redactedText = redactedText;\n }\n}\n\n/**\n * Thrown when a session's spend budget has been exceeded.\n */\nexport class SessionBudgetExceededError extends ModelCostError {\n public readonly sessionId: string;\n public readonly currentSpend: number;\n public readonly maxSpend: number;\n\n constructor(\n message: string,\n sessionId: string,\n currentSpend: number,\n maxSpend: number,\n ) {\n super(message);\n this.name = \"SessionBudgetExceededError\";\n this.sessionId = sessionId;\n this.currentSpend = currentSpend;\n this.maxSpend = maxSpend;\n }\n}\n\n/**\n * Thrown when a session's iteration limit has been exceeded.\n */\nexport class SessionIterationLimitExceededError extends ModelCostError {\n public readonly sessionId: string;\n public readonly currentIterations: number;\n public readonly maxIterations: number;\n\n constructor(\n message: string,\n sessionId: string,\n currentIterations: number,\n maxIterations: number,\n ) {\n super(message);\n this.name = \"SessionIterationLimitExceededError\";\n this.sessionId = sessionId;\n this.currentIterations = currentIterations;\n this.maxIterations = maxIterations;\n }\n}\n\n/**\n * Thrown when the ModelCost API returns an error response.\n */\nexport class ModelCostApiError extends ModelCostError {\n public readonly statusCode: number;\n public readonly errorCode: string;\n\n constructor(message: string, statusCode: number, errorCode: string) {\n super(message);\n this.name = \"ModelCostApiError\";\n this.statusCode = statusCode;\n this.errorCode = errorCode;\n }\n}\n","import { z } from \"zod\";\nimport { Provider } from \"./common.js\";\n\n/**\n * Schema for tracking an AI API call.\n * API uses snake_case; we transform to camelCase for SDK consumers.\n */\nexport const TrackRequestSchema = z.object({\n apiKey: z.string().min(1),\n timestamp: z.string().datetime(),\n provider: Provider,\n model: z.string().min(1),\n feature: z.string().optional(),\n customerId: z.string().optional(),\n inputTokens: z.number().int().min(0),\n outputTokens: z.number().int().min(0),\n latencyMs: z.number().int().optional(),\n metadata: z.record(z.unknown()).optional(),\n});\n\nexport type TrackRequest = z.infer<typeof TrackRequestSchema>;\n\n/**\n * Converts a camelCase TrackRequest into the snake_case body the API expects.\n */\nexport function trackRequestToApi(request: TrackRequest): Record<string, unknown> {\n return {\n api_key: request.apiKey,\n timestamp: request.timestamp,\n provider: request.provider,\n model: request.model,\n feature: request.feature ?? null,\n customer_id: request.customerId ?? null,\n input_tokens: request.inputTokens,\n output_tokens: request.outputTokens,\n latency_ms: request.latencyMs ?? null,\n metadata: request.metadata ?? null,\n };\n}\n\n/** Schema for the track API response. */\nexport const TrackResponseSchema = z.object({\n status: z.literal(\"ok\"),\n});\n\nexport type TrackResponse = z.infer<typeof TrackResponseSchema>;\n","import { z } from \"zod\";\n\n// ─── Request types ────────────────────────────────────────────────────\n\nexport interface CreateSessionRequest {\n apiKey: string;\n sessionId: string;\n feature?: string;\n userId?: string;\n maxSpendUsd?: number;\n maxIterations?: number;\n}\n\nexport interface RecordSessionCallRequest {\n apiKey: string;\n callSequence: number;\n callType: string;\n toolName?: string;\n inputTokens: number;\n outputTokens: number;\n cumulativeInputTokens: number;\n costUsd: number;\n cumulativeCostUsd: number;\n piiDetected: boolean;\n}\n\nexport interface CloseSessionRequest {\n apiKey: string;\n status: string;\n terminationReason?: string;\n finalSpendUsd: number;\n finalIterationCount: number;\n}\n\n// ─── Response types ───────────────────────────────────────────────────\n\nexport interface CreateSessionResponse {\n id: string;\n sessionId: string;\n status: string;\n maxSpendUsd?: number;\n maxIterations?: number;\n}\n\n/** Schema for the create-session API response (snake_case -> camelCase). */\nexport const CreateSessionResponseSchema = z\n .object({\n id: z.string(),\n session_id: z.string(),\n status: z.string(),\n max_spend_usd: z.number().nullable().optional(),\n max_iterations: z.number().nullable().optional(),\n })\n .transform((raw) => ({\n id: raw.id,\n sessionId: raw.session_id,\n status: raw.status,\n maxSpendUsd: raw.max_spend_usd ?? undefined,\n maxIterations: raw.max_iterations ?? undefined,\n }));\n\n// ─── Conversion functions (camelCase -> snake_case for API) ───────────\n\nexport function createSessionRequestToApi(\n req: CreateSessionRequest,\n): Record<string, unknown> {\n return {\n api_key: req.apiKey,\n session_id: req.sessionId,\n feature: req.feature,\n user_id: req.userId,\n max_spend_usd: req.maxSpendUsd,\n max_iterations: req.maxIterations,\n };\n}\n\nexport function recordSessionCallRequestToApi(\n req: RecordSessionCallRequest,\n): Record<string, unknown> {\n return {\n api_key: req.apiKey,\n call_sequence: req.callSequence,\n call_type: req.callType,\n tool_name: req.toolName,\n input_tokens: req.inputTokens,\n output_tokens: req.outputTokens,\n cumulative_input_tokens: req.cumulativeInputTokens,\n cost_usd: req.costUsd,\n cumulative_cost_usd: req.cumulativeCostUsd,\n pii_detected: req.piiDetected,\n };\n}\n\nexport function closeSessionRequestToApi(\n req: CloseSessionRequest,\n): Record<string, unknown> {\n return {\n api_key: req.apiKey,\n status: req.status,\n termination_reason: req.terminationReason,\n final_spend_usd: req.finalSpendUsd,\n final_iteration_count: req.finalIterationCount,\n };\n}\n","import { z } from \"zod\";\nimport { BudgetAction, BudgetPeriod, BudgetScope } from \"./common.js\";\n\n/**\n * Schema for budget check API response (snake_case from API -> camelCase).\n */\nexport const BudgetCheckResponseSchema = z\n .object({\n allowed: z.boolean(),\n action: z.string().nullable(),\n throttle_percentage: z.number().nullable(),\n reason: z.string().nullable(),\n })\n .transform((data) => ({\n allowed: data.allowed,\n action: data.action,\n throttlePercentage: data.throttle_percentage,\n reason: data.reason,\n }));\n\nexport type BudgetCheckResponse = z.output<typeof BudgetCheckResponseSchema>;\n\n/**\n * Schema for a single budget policy (snake_case from API -> camelCase).\n */\nexport const BudgetPolicySchema = z\n .object({\n id: z.string(),\n name: z.string(),\n scope: BudgetScope,\n scope_identifier: z.string().nullable(),\n budget_amount_usd: z.number(),\n period: BudgetPeriod,\n custom_period_days: z.number().int().nullable(),\n action: BudgetAction,\n throttle_percentage: z.number().nullable(),\n alert_thresholds: z.array(z.number().int()).nullable(),\n current_spend_usd: z.number(),\n spend_percentage: z.number(),\n period_start: z.string(),\n is_active: z.boolean(),\n created_at: z.string(),\n updated_at: z.string(),\n })\n .transform((data) => ({\n id: data.id,\n name: data.name,\n scope: data.scope,\n scopeIdentifier: data.scope_identifier,\n budgetAmountUsd: data.budget_amount_usd,\n period: data.period,\n customPeriodDays: data.custom_period_days,\n action: data.action,\n throttlePercentage: data.throttle_percentage,\n alertThresholds: data.alert_thresholds,\n currentSpendUsd: data.current_spend_usd,\n spendPercentage: data.spend_percentage,\n periodStart: data.period_start,\n isActive: data.is_active,\n createdAt: data.created_at,\n updatedAt: data.updated_at,\n }));\n\nexport type BudgetPolicy = z.output<typeof BudgetPolicySchema>;\n\n/**\n * Schema for the budget status API response (snake_case from API -> camelCase).\n */\nexport const BudgetStatusResponseSchema = z\n .object({\n policies: z.array(BudgetPolicySchema),\n total_budget_usd: z.number(),\n total_spend_usd: z.number(),\n policies_at_risk: z.number().int(),\n })\n .transform((data) => ({\n policies: data.policies,\n totalBudgetUsd: data.total_budget_usd,\n totalSpendUsd: data.total_spend_usd,\n policiesAtRisk: data.policies_at_risk,\n }));\n\nexport type BudgetStatusResponse = z.output<typeof BudgetStatusResponseSchema>;\n","import { z } from \"zod\";\n\n/**\n * Schema for a governance scan request (camelCase -> snake_case for API).\n */\nexport const GovernanceScanRequestSchema = z.object({\n orgId: z.string().min(1),\n text: z.string().min(1),\n feature: z.string().optional(),\n environment: z.string().optional(),\n});\n\nexport type GovernanceScanRequest = z.infer<typeof GovernanceScanRequestSchema>;\n\n/**\n * Converts a camelCase GovernanceScanRequest to the snake_case body the API expects.\n */\nexport function governanceScanRequestToApi(\n request: GovernanceScanRequest,\n): Record<string, unknown> {\n return {\n org_id: request.orgId,\n text: request.text,\n feature: request.feature ?? null,\n environment: request.environment ?? null,\n };\n}\n\n/**\n * Schema for a detected violation (snake_case from API -> camelCase).\n */\nexport const DetectedViolationSchema = z.object({\n type: z.string(),\n subtype: z.string(),\n severity: z.enum([\"low\", \"medium\", \"high\"]),\n start: z.number().int(),\n end: z.number().int(),\n});\n\nexport type DetectedViolation = z.infer<typeof DetectedViolationSchema>;\n\n/**\n * Schema for the governance scan API response (snake_case from API -> camelCase).\n */\nexport const GovernanceScanResponseSchema = z\n .object({\n is_allowed: z.boolean(),\n action: z.string().nullable(),\n violations: z.array(DetectedViolationSchema),\n redacted_text: z.string().nullable(),\n })\n .transform((data) => ({\n isAllowed: data.is_allowed,\n action: data.action,\n violations: data.violations,\n redactedText: data.redacted_text,\n }));\n\nexport type GovernanceScanResponse = z.output<\n typeof GovernanceScanResponseSchema\n>;\n\n/**\n * Request to report a governance signal in metadata-only mode.\n * No raw content is included — only classification signals.\n */\nexport interface GovernanceSignalRequest {\n organizationId: string;\n violationType: string;\n violationSubtype?: string;\n severity: string;\n userId?: string;\n feature?: string;\n environment?: string;\n actionTaken: string;\n wasAllowed: boolean;\n detectedAt?: string;\n source: string;\n violationCount?: number;\n}\n\n/**\n * Converts a GovernanceSignalRequest to the snake_case body the API expects.\n */\nexport function governanceSignalRequestToApi(\n request: GovernanceSignalRequest,\n): Record<string, unknown> {\n return {\n organization_id: request.organizationId,\n violation_type: request.violationType,\n violation_subtype: request.violationSubtype ?? null,\n severity: request.severity,\n user_id: request.userId ?? null,\n feature: request.feature ?? null,\n environment: request.environment ?? null,\n action_taken: request.actionTaken,\n was_allowed: request.wasAllowed,\n detected_at: request.detectedAt ?? null,\n source: request.source,\n violation_count: request.violationCount ?? 1,\n };\n}\n","import { VERSION } from \"./version.js\";\nimport type { ModelCostConfig } from \"./config.js\";\nimport { ModelCostApiError, ModelCostError } from \"./errors.js\";\nimport {\n type TrackRequest,\n type TrackResponse,\n TrackResponseSchema,\n trackRequestToApi,\n} from \"./models/track.js\";\nimport {\n type CreateSessionRequest,\n type CreateSessionResponse,\n CreateSessionResponseSchema,\n createSessionRequestToApi,\n type RecordSessionCallRequest,\n recordSessionCallRequestToApi,\n type CloseSessionRequest,\n closeSessionRequestToApi,\n} from \"./models/session.js\";\nimport {\n type BudgetCheckResponse,\n BudgetCheckResponseSchema,\n type BudgetStatusResponse,\n BudgetStatusResponseSchema,\n} from \"./models/budget.js\";\nimport {\n type GovernanceScanRequest,\n type GovernanceScanResponse,\n GovernanceScanResponseSchema,\n governanceScanRequestToApi,\n type GovernanceSignalRequest,\n governanceSignalRequestToApi,\n} from \"./models/governance.js\";\n\nconst CIRCUIT_BREAKER_THRESHOLD = 3;\nconst CIRCUIT_BREAKER_COOLDOWN_MS = 60_000;\n\n/**\n * Low-level HTTP client for the ModelCost API.\n * Uses native fetch, implements circuit breaker, and supports fail-open semantics.\n */\nexport class ModelCostClient {\n private readonly _baseUrl: string;\n private readonly _apiKey: string;\n private readonly _headers: Record<string, string>;\n private readonly _failOpen: boolean;\n\n /** Circuit breaker state */\n private _consecutiveFailures = 0;\n private _circuitOpenUntil = 0;\n\n constructor(config: ModelCostConfig) {\n this._baseUrl = config.baseUrl.replace(/\\/+$/, \"\");\n this._apiKey = config.apiKey;\n this._failOpen = config.failOpen;\n this._headers = {\n \"Content-Type\": \"application/json\",\n \"X-API-Key\": this._apiKey,\n \"User-Agent\": `modelcost-node/${VERSION}`,\n };\n }\n\n /**\n * Record a tracked AI API call.\n */\n async track(request: TrackRequest): Promise<TrackResponse> {\n const body = trackRequestToApi(request);\n const data = await this._post(\"/api/v1/track\", body);\n return TrackResponseSchema.parse(data);\n }\n\n /**\n * Pre-flight budget check before making an AI call.\n */\n async checkBudget(\n orgId: string,\n feature: string,\n estimatedCost: number,\n ): Promise<BudgetCheckResponse> {\n const params = new URLSearchParams({\n org_id: orgId,\n feature,\n estimated_cost: estimatedCost.toString(),\n });\n const data = await this._post(`/api/v1/budgets/check?${params.toString()}`, {});\n return BudgetCheckResponseSchema.parse(data);\n }\n\n /**\n * Scan text for PII and governance violations.\n */\n async scanText(\n request: GovernanceScanRequest,\n ): Promise<GovernanceScanResponse> {\n const body = governanceScanRequestToApi(request);\n const data = await this._post(\"/api/v1/governance/scan\", body);\n return GovernanceScanResponseSchema.parse(data);\n }\n\n /**\n * Report a governance signal (metadata-only mode).\n * Sends classification signals without raw content.\n */\n async reportSignal(request: GovernanceSignalRequest): Promise<void> {\n const body = governanceSignalRequestToApi(request);\n await this._post(\"/api/v1/governance/signals\", body);\n }\n\n /**\n * Get current budget status for an organization.\n */\n async getBudgetStatus(orgId: string): Promise<BudgetStatusResponse> {\n const params = new URLSearchParams({ org_id: orgId });\n const data = await this._get(`/api/v1/budgets/status?${params.toString()}`);\n return BudgetStatusResponseSchema.parse(data);\n }\n\n /**\n * Create a new agent session on the server.\n */\n async createSession(\n request: CreateSessionRequest,\n ): Promise<CreateSessionResponse> {\n const body = createSessionRequestToApi(request);\n const data = await this._post(\"/api/v1/sessions\", body);\n return CreateSessionResponseSchema.parse(data);\n }\n\n /**\n * Record a call within an existing session.\n */\n async recordSessionCall(\n sessionId: string,\n request: RecordSessionCallRequest,\n ): Promise<void> {\n const body = recordSessionCallRequestToApi(request);\n await this._post(`/api/v1/sessions/${sessionId}/calls`, body);\n }\n\n /**\n * Close an existing session on the server.\n */\n async closeSession(\n sessionId: string,\n request: CloseSessionRequest,\n ): Promise<void> {\n const body = closeSessionRequestToApi(request);\n await this._post(`/api/v1/sessions/${sessionId}/close`, body);\n }\n\n /**\n * Close the client (cleanup resources).\n */\n close(): void {\n this._consecutiveFailures = 0;\n this._circuitOpenUntil = 0;\n }\n\n // ─── Private helpers ───────────────────────────────────────────────\n\n private _isCircuitOpen(): boolean {\n if (this._consecutiveFailures < CIRCUIT_BREAKER_THRESHOLD) {\n return false;\n }\n if (Date.now() >= this._circuitOpenUntil) {\n // Cooldown has elapsed; allow a probe request\n this._consecutiveFailures = 0;\n return false;\n }\n return true;\n }\n\n private _recordSuccess(): void {\n this._consecutiveFailures = 0;\n }\n\n private _recordFailure(): void {\n this._consecutiveFailures++;\n if (this._consecutiveFailures >= CIRCUIT_BREAKER_THRESHOLD) {\n this._circuitOpenUntil = Date.now() + CIRCUIT_BREAKER_COOLDOWN_MS;\n }\n }\n\n private async _post(\n path: string,\n body: Record<string, unknown>,\n ): Promise<unknown> {\n return this._request(\"POST\", path, body);\n }\n\n private async _get(path: string): Promise<unknown> {\n return this._request(\"GET\", path);\n }\n\n private async _request(\n method: string,\n path: string,\n body?: Record<string, unknown>,\n ): Promise<unknown> {\n if (this._isCircuitOpen()) {\n if (this._failOpen) {\n console.warn(\n `[ModelCost] Circuit breaker open — skipping ${method} ${path}`,\n );\n return this._failOpenDefault(path);\n }\n throw new ModelCostError(\n `Circuit breaker is open after ${CIRCUIT_BREAKER_THRESHOLD} consecutive failures`,\n );\n }\n\n try {\n const url = `${this._baseUrl}${path}`;\n const init: RequestInit = {\n method,\n headers: this._headers,\n };\n if (body !== undefined && method !== \"GET\") {\n init.body = JSON.stringify(body);\n }\n\n const response = await fetch(url, init);\n\n if (!response.ok) {\n const errorBody = (await response.json().catch(() => ({\n error: \"unknown\",\n message: response.statusText,\n }))) as { error?: string; message?: string };\n this._recordFailure();\n\n const err = new ModelCostApiError(\n errorBody.message ?? `HTTP ${response.status}`,\n response.status,\n errorBody.error ?? \"unknown\",\n );\n\n if (this._failOpen) {\n console.warn(\n `[ModelCost] API error (fail-open): ${err.message}`,\n );\n return this._failOpenDefault(path);\n }\n throw err;\n }\n\n const data: unknown = await response.json();\n this._recordSuccess();\n return data;\n } catch (error) {\n if (error instanceof ModelCostApiError) {\n throw error;\n }\n\n this._recordFailure();\n\n if (this._failOpen) {\n console.warn(\n `[ModelCost] Request failed (fail-open): ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n return this._failOpenDefault(path);\n }\n\n throw new ModelCostError(\n `Request to ${path} failed: ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n }\n\n /**\n * Returns a safe default response when operating in fail-open mode.\n */\n private _failOpenDefault(path: string): unknown {\n if (path.includes(\"/budgets/check\")) {\n return {\n allowed: true,\n action: null,\n throttle_percentage: null,\n reason: \"fail-open: API unavailable\",\n };\n }\n if (path.includes(\"/budgets/status\")) {\n return {\n policies: [],\n total_budget_usd: 0,\n total_spend_usd: 0,\n policies_at_risk: 0,\n };\n }\n if (path.includes(\"/governance/scan\")) {\n return {\n is_allowed: true,\n action: null,\n violations: [],\n redacted_text: null,\n };\n }\n if (path.includes(\"/sessions\")) {\n return { id: \"fail-open\", session_id: \"fail-open\", status: \"active\" };\n }\n // Default for /track\n return { status: \"ok\" };\n }\n}\n","import type { ModelCostClient } from \"./client.js\";\nimport type {\n BudgetCheckResponse,\n BudgetStatusResponse,\n} from \"./models/budget.js\";\n\n/**\n * Manages budget state with local caching and periodic sync.\n * Keeps an in-memory cache of budget status to avoid hitting the API\n * on every call, while still staying in sync with the server.\n */\nexport class BudgetManager {\n private _cache: Map<string, BudgetStatusResponse> = new Map();\n private _lastSync: number = 0;\n private readonly _syncIntervalMs: number;\n\n constructor(syncIntervalMs: number) {\n this._syncIntervalMs = syncIntervalMs;\n }\n\n /**\n * Check whether a request with the given estimated cost is allowed.\n * Uses the local cache if fresh, otherwise syncs from the API first.\n */\n async check(\n client: ModelCostClient,\n orgId: string,\n feature: string,\n estimatedCost: number,\n ): Promise<BudgetCheckResponse> {\n if (this._isStale()) {\n await this.sync(client, orgId);\n }\n\n // Always defer to the server for the authoritative check\n return client.checkBudget(orgId, feature, estimatedCost);\n }\n\n /**\n * Sync the budget status from the server and populate the local cache.\n */\n async sync(client: ModelCostClient, orgId: string): Promise<void> {\n const status = await client.getBudgetStatus(orgId);\n this._cache.set(orgId, status);\n this._lastSync = Date.now();\n }\n\n /**\n * Optimistically update local spend after a tracked call,\n * so subsequent budget checks reflect the estimated spend\n * without waiting for the next server sync.\n */\n updateLocalSpend(orgId: string, _feature: string, cost: number): void {\n const cached = this._cache.get(orgId);\n if (!cached) {\n return;\n }\n\n // Update aggregate spend\n const updated: BudgetStatusResponse = {\n ...cached,\n totalSpendUsd: cached.totalSpendUsd + cost,\n policies: cached.policies.map((policy) => ({\n ...policy,\n currentSpendUsd: policy.currentSpendUsd + cost,\n spendPercentage:\n policy.budgetAmountUsd > 0\n ? ((policy.currentSpendUsd + cost) / policy.budgetAmountUsd) * 100\n : policy.spendPercentage,\n })),\n };\n\n this._cache.set(orgId, updated);\n }\n\n /**\n * Get the cached budget status for an org, if available.\n */\n getCached(orgId: string): BudgetStatusResponse | undefined {\n return this._cache.get(orgId);\n }\n\n /**\n * Clear all cached state.\n */\n clear(): void {\n this._cache.clear();\n this._lastSync = 0;\n }\n\n private _isStale(): boolean {\n return Date.now() - this._lastSync > this._syncIntervalMs;\n }\n}\n","import type { ModelCostClient } from \"./client.js\";\nimport type { TrackRequest } from \"./models/track.js\";\nimport type { ModelPricing } from \"./models/cost.js\";\n\n// ---------------------------------------------------------------------------\n// Pricing table — populated at runtime via GET /api/v1/pricing/models.\n// Falls back to a small set of well-known models if server is unreachable.\n// ---------------------------------------------------------------------------\n\nfunction _loadBundledPricing(): Map<string, ModelPricing> {\n // Hardcoded fallback pricing — refreshed at runtime via syncPricingFromApi().\n return new Map<string, ModelPricing>([\n [\"gpt-4\", { provider: \"openai\", model: \"gpt-4\", inputCostPer1k: 0.03, outputCostPer1k: 0.06 }],\n [\"gpt-4-turbo\", { provider: \"openai\", model: \"gpt-4-turbo\", inputCostPer1k: 0.01, outputCostPer1k: 0.03 }],\n [\"gpt-4o\", { provider: \"openai\", model: \"gpt-4o\", inputCostPer1k: 0.005, outputCostPer1k: 0.015 }],\n [\"gpt-4o-mini\", { provider: \"openai\", model: \"gpt-4o-mini\", inputCostPer1k: 0.00015, outputCostPer1k: 0.0006 }],\n [\"gpt-3.5-turbo\", { provider: \"openai\", model: \"gpt-3.5-turbo\", inputCostPer1k: 0.0015, outputCostPer1k: 0.002 }],\n [\"claude-opus-4\", { provider: \"anthropic\", model: \"claude-opus-4\", inputCostPer1k: 0.015, outputCostPer1k: 0.075 }],\n [\"claude-sonnet-4\", { provider: \"anthropic\", model: \"claude-sonnet-4\", inputCostPer1k: 0.003, outputCostPer1k: 0.015 }],\n [\"claude-haiku-4\", { provider: \"anthropic\", model: \"claude-haiku-4\", inputCostPer1k: 0.00025, outputCostPer1k: 0.00125 }],\n [\"gemini-1.5-pro\", { provider: \"google\", model: \"gemini-1.5-pro\", inputCostPer1k: 0.00125, outputCostPer1k: 0.005 }],\n [\"gemini-1.5-flash\", { provider: \"google\", model: \"gemini-1.5-flash\", inputCostPer1k: 0.000075, outputCostPer1k: 0.0003 }],\n [\"gemini-2.0-flash\", { provider: \"google\", model: \"gemini-2.0-flash\", inputCostPer1k: 0.0001, outputCostPer1k: 0.0004 }],\n ]);\n}\n\n/** Mutable internal map; rewritten by syncPricingFromApi. */\nconst _modelPricing: Map<string, ModelPricing> = _loadBundledPricing();\n\n/**\n * Known model pricing table (cost per 1,000 tokens in USD).\n * Loaded from sdk/common/model_pricing.json at import time,\n * refreshed at runtime via syncPricingFromApi().\n */\nexport const MODEL_PRICING: ReadonlyMap<string, ModelPricing> = _modelPricing;\n\n/**\n * Fetch the latest pricing table from the server and update the local cache.\n * Called on SDK init and periodically by the background sync timer.\n */\nexport async function syncPricingFromApi(\n baseUrl: string,\n apiKey: string,\n): Promise<void> {\n try {\n const url = `${baseUrl.replace(/\\/+$/, \"\")}/api/v1/pricing/models`;\n const response = await fetch(url, {\n headers: { \"X-API-Key\": apiKey },\n });\n if (!response.ok) {\n return;\n }\n const data = (await response.json()) as {\n models?: Array<{\n model: string;\n provider: string;\n input_cost_per_1k: number;\n output_cost_per_1k: number;\n }>;\n };\n const models = data.models ?? [];\n if (models.length === 0) {\n return;\n }\n _modelPricing.clear();\n for (const entry of models) {\n _modelPricing.set(entry.model, {\n provider: entry.provider,\n model: entry.model,\n inputCostPer1k: entry.input_cost_per_1k,\n outputCostPer1k: entry.output_cost_per_1k,\n });\n }\n } catch {\n // Silently fall back to local table\n }\n}\n\n/**\n * Calculate the cost of an AI call based on token counts and known pricing.\n * Returns 0 if the model is not found in the pricing table.\n */\nexport function calculateCost(\n model: string,\n inputTokens: number,\n outputTokens: number,\n): number {\n const pricing = MODEL_PRICING.get(model);\n if (!pricing) {\n return 0;\n }\n\n const inputCost = (inputTokens / 1000) * pricing.inputCostPer1k;\n const outputCost = (outputTokens / 1000) * pricing.outputCostPer1k;\n return inputCost + outputCost;\n}\n\n/**\n * Buffers track requests and periodically flushes them to the API.\n */\nexport class CostTracker {\n private _buffer: TrackRequest[] = [];\n private _flushTimer: ReturnType<typeof setInterval> | null = null;\n private _pricingSyncTimer: ReturnType<typeof setInterval> | null = null;\n private readonly _batchSize: number;\n\n constructor(batchSize: number) {\n this._batchSize = batchSize;\n }\n\n /**\n * Add a track request to the buffer.\n * Automatically flushes when buffer reaches batch size.\n */\n record(request: TrackRequest, client?: ModelCostClient): void {\n this._buffer.push(request);\n if (this._buffer.length >= this._batchSize && client) {\n void this.flush(client);\n }\n }\n\n /**\n * Flush all buffered track requests to the API.\n */\n async flush(client: ModelCostClient): Promise<void> {\n if (this._buffer.length === 0) {\n return;\n }\n\n const batch = this._buffer.splice(0, this._buffer.length);\n\n const promises = batch.map((request) =>\n client.track(request).catch((error: unknown) => {\n console.warn(\n `[ModelCost] Failed to track request: ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }),\n );\n\n await Promise.allSettled(promises);\n }\n\n /**\n * Start automatic periodic flushing.\n */\n startAutoFlush(client: ModelCostClient, intervalMs: number): void {\n this.stopAutoFlush();\n this._flushTimer = setInterval(() => {\n void this.flush(client);\n }, intervalMs);\n\n // Ensure the timer doesn't prevent process exit\n if (this._flushTimer && typeof this._flushTimer === \"object\" && \"unref\" in this._flushTimer) {\n this._flushTimer.unref();\n }\n }\n\n /**\n * Stop automatic periodic flushing.\n */\n stopAutoFlush(): void {\n if (this._flushTimer !== null) {\n clearInterval(this._flushTimer);\n this._flushTimer = null;\n }\n }\n\n private static readonly _PRICING_SYNC_INTERVAL_MS = 300_000; // 5 minutes\n\n /**\n * Start periodic pricing sync from the server.\n */\n startPricingSync(baseUrl: string, apiKey: string): void {\n this.stopPricingSync();\n this._pricingSyncTimer = setInterval(() => {\n void syncPricingFromApi(baseUrl, apiKey);\n }, CostTracker._PRICING_SYNC_INTERVAL_MS);\n\n if (this._pricingSyncTimer && typeof this._pricingSyncTimer === \"object\" && \"unref\" in this._pricingSyncTimer) {\n this._pricingSyncTimer.unref();\n }\n }\n\n /**\n * Stop periodic pricing sync.\n */\n stopPricingSync(): void {\n if (this._pricingSyncTimer !== null) {\n clearInterval(this._pricingSyncTimer);\n this._pricingSyncTimer = null;\n }\n }\n\n /**\n * Get the current number of buffered requests.\n */\n get bufferSize(): number {\n return this._buffer.length;\n }\n}\n","/**\n * Result of a PII scan on a text string.\n */\nexport interface PiiEntity {\n type: string;\n value: string;\n start: number;\n end: number;\n}\n\nexport interface PiiResult {\n detected: boolean;\n entities: PiiEntity[];\n redactedText: string;\n}\n\n/**\n * A governance violation detected by the full scanner.\n */\nexport interface GovernanceViolation {\n category: string;\n type: string;\n severity: string;\n start: number;\n end: number;\n}\n\n/**\n * Result of a full governance scan across all categories.\n */\nexport interface FullScanResult {\n detected: boolean;\n violations: GovernanceViolation[];\n categories: string[];\n}\n\n/**\n * Pre-compiled regex patterns for common PII types.\n */\nconst PII_PATTERNS: ReadonlyArray<{ type: string; pattern: RegExp }> = [\n {\n type: \"ssn\",\n pattern: /\\b\\d{3}-\\d{2}-\\d{4}\\b/g,\n },\n {\n type: \"credit_card_visa\",\n pattern: /\\b4\\d{3}[- ]?\\d{4}[- ]?\\d{4}[- ]?\\d{4}\\b/g,\n },\n {\n type: \"credit_card_mastercard\",\n pattern: /\\b5[1-5]\\d{2}[- ]?\\d{4}[- ]?\\d{4}[- ]?\\d{4}\\b/g,\n },\n {\n type: \"credit_card_amex\",\n pattern: /\\b3[47]\\d{2}[- ]?\\d{6}[- ]?\\d{5}\\b/g,\n },\n {\n type: \"credit_card_discover\",\n pattern: /\\b6(?:011|5\\d{2})[- ]?\\d{4}[- ]?\\d{4}[- ]?\\d{4}\\b/g,\n },\n {\n type: \"email\",\n pattern: /\\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}\\b/g,\n },\n {\n type: \"phone_us\",\n pattern:\n /\\b(?:\\+?1[-.\\s]?)?(?:\\(?\\d{3}\\)?[-.\\s]?)\\d{3}[-.\\s]?\\d{4}\\b/g,\n },\n];\n\n/**\n * Credit card pattern for Luhn-validated matching (all card types).\n */\nconst CREDIT_CARD_GENERIC_PATTERN =\n /\\b\\d{4}[\\s-]?\\d{4}[\\s-]?\\d{4}[\\s-]?\\d{4}\\b/g;\n\n/**\n * Secrets detection patterns.\n */\nconst SECRETS_PATTERNS: ReadonlyArray<{\n type: string;\n pattern: RegExp;\n severity: string;\n}> = [\n {\n type: \"api_key_openai\",\n pattern: /sk-[a-zA-Z0-9]{20,}/g,\n severity: \"critical\",\n },\n {\n type: \"api_key_aws\",\n pattern: /AKIA[0-9A-Z]{16}/g,\n severity: \"critical\",\n },\n {\n type: \"private_key\",\n pattern: /-----BEGIN (?:RSA |EC |DSA )?PRIVATE KEY-----/g,\n severity: \"critical\",\n },\n {\n type: \"jwt_token\",\n pattern:\n /eyJ[A-Za-z0-9_-]{10,}\\.eyJ[A-Za-z0-9_-]{10,}\\.[A-Za-z0-9_-]{10,}/g,\n severity: \"high\",\n },\n {\n type: \"generic_secret\",\n pattern:\n /(?:password|api_key|apikey|secret|token|bearer)\\s*[:=]\\s*[\"']?([A-Za-z0-9_\\-/.]{8,})[\"']?/gi,\n severity: \"critical\",\n },\n];\n\n/**\n * Financial detection patterns.\n */\nconst FINANCIAL_PATTERNS: ReadonlyArray<{\n type: string;\n pattern: RegExp;\n severity: string;\n}> = [\n {\n type: \"iban\",\n pattern: /\\b[A-Z]{2}\\d{2}[A-Z0-9]{4}\\d{7}([A-Z0-9]?){0,16}\\b/g,\n severity: \"high\",\n },\n];\n\n/**\n * Medical terms used to identify PHI context.\n * When these appear alongside PII, the combination is classified as PHI.\n */\nconst MEDICAL_TERMS: ReadonlySet<string> = new Set([\n \"diabetes\",\n \"hiv\",\n \"aids\",\n \"cancer\",\n \"tumor\",\n \"disease\",\n \"medication\",\n \"diagnosis\",\n \"treatment\",\n \"surgery\",\n \"prescription\",\n \"patient\",\n \"doctor\",\n \"hospital\",\n \"clinic\",\n \"medical record\",\n \"insulin\",\n \"prozac\",\n \"chemotherapy\",\n \"depression\",\n \"anxiety\",\n \"bipolar\",\n \"schizophrenia\",\n \"hepatitis\",\n \"tuberculosis\",\n \"epilepsy\",\n \"asthma\",\n \"arthritis\",\n \"alzheimer\",\n]);\n\n/**\n * Local PII scanner using regex pattern matching.\n *\n * Provides a fast, offline first-pass for PII detection before\n * optionally deferring to the server-side governance scan.\n *\n * Also provides full governance scanning (PII, PHI, secrets, financial)\n * for metadata-only mode where content never leaves the customer's environment.\n */\nexport class PiiScanner {\n /**\n * Scan text and return all detected PII entities, plus a redacted version.\n */\n scan(text: string): PiiResult {\n const entities: PiiEntity[] = [];\n\n for (const { type, pattern } of PII_PATTERNS) {\n // Reset regex state for each scan\n const regex = new RegExp(pattern.source, pattern.flags);\n let match: RegExpExecArray | null;\n\n while ((match = regex.exec(text)) !== null) {\n // Luhn-validate credit card matches\n if (type.startsWith(\"credit_card_\")) {\n const digits = match[0].replace(/[\\s-]/g, \"\");\n if (!PiiScanner._isValidLuhn(digits)) continue;\n }\n\n entities.push({\n type,\n value: match[0],\n start: match.index,\n end: match.index + match[0].length,\n });\n }\n }\n\n // Sort by start position for deterministic output\n entities.sort((a, b) => a.start - b.start);\n\n // Remove overlapping matches (keep the first/longest at each position)\n const deduped = this._removeOverlaps(entities);\n\n const redactedText = this._redactText(text, deduped);\n\n return {\n detected: deduped.length > 0,\n entities: deduped,\n redactedText,\n };\n }\n\n /**\n * Full governance scan across multiple categories.\n * Used in metadata-only mode where content never leaves the customer's environment.\n */\n fullScan(\n text: string,\n categories: string[] = [\"pii\", \"phi\", \"secrets\", \"financial\"],\n ): FullScanResult {\n const violations: GovernanceViolation[] = [];\n const detectedCategories = new Set<string>();\n\n if (categories.includes(\"pii\")) {\n const piiViolations = this._scanPiiViolations(text);\n for (const v of piiViolations) {\n violations.push(v);\n detectedCategories.add(\"pii\");\n }\n }\n\n if (categories.includes(\"phi\")) {\n const phiViolations = this._scanPhi(text);\n for (const v of phiViolations) {\n violations.push(v);\n detectedCategories.add(\"phi\");\n }\n }\n\n if (categories.includes(\"secrets\")) {\n const secretViolations = this._scanSecrets(text);\n for (const v of secretViolations) {\n violations.push(v);\n detectedCategories.add(\"secrets\");\n }\n }\n\n if (categories.includes(\"financial\")) {\n const financialViolations = this._scanFinancial(text);\n for (const v of financialViolations) {\n violations.push(v);\n detectedCategories.add(\"financial\");\n }\n }\n\n return {\n detected: violations.length > 0,\n violations,\n categories: [...detectedCategories],\n };\n }\n\n /**\n * Convenience method: return only the redacted text.\n */\n redact(text: string): string {\n return this.scan(text).redactedText;\n }\n\n // ─── Category Scanners ──────────────────────────────────────────────\n\n private _scanPiiViolations(text: string): GovernanceViolation[] {\n const violations: GovernanceViolation[] = [];\n\n // SSN\n for (const match of text.matchAll(/\\b\\d{3}-\\d{2}-\\d{4}\\b/g)) {\n violations.push({\n category: \"pii\",\n type: \"ssn\",\n severity: \"critical\",\n start: match.index!,\n end: match.index! + match[0].length,\n });\n }\n\n // Email\n for (const match of text.matchAll(\n /\\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}\\b/g,\n )) {\n violations.push({\n category: \"pii\",\n type: \"email\",\n severity: \"high\",\n start: match.index!,\n end: match.index! + match[0].length,\n });\n }\n\n // Credit card (Luhn-validated)\n for (const match of text.matchAll(CREDIT_CARD_GENERIC_PATTERN)) {\n const digits = match[0].replace(/[\\s-]/g, \"\");\n if (PiiScanner._isValidLuhn(digits)) {\n violations.push({\n category: \"pii\",\n type: \"credit_card\",\n severity: \"critical\",\n start: match.index!,\n end: match.index! + match[0].length,\n });\n }\n }\n\n // Phone\n for (const match of text.matchAll(\n /\\b(?:\\+?1[-.\\s]?)?(?:\\(?\\d{3}\\)?[-.\\s]?)\\d{3}[-.\\s]?\\d{4}\\b/g,\n )) {\n violations.push({\n category: \"pii\",\n type: \"phone\",\n severity: \"medium\",\n start: match.index!,\n end: match.index! + match[0].length,\n });\n }\n\n return violations;\n }\n\n private _scanPhi(text: string): GovernanceViolation[] {\n const textLower = text.toLowerCase();\n let hasMedicalContext = false;\n\n for (const term of MEDICAL_TERMS) {\n if (textLower.includes(term)) {\n hasMedicalContext = true;\n break;\n }\n }\n\n if (!hasMedicalContext) return [];\n\n // Medical context + PII = PHI violation\n const piiViolations = this._scanPiiViolations(text);\n return piiViolations.map((v) => ({\n ...v,\n category: \"phi\",\n type: `phi_${v.type}`,\n severity: \"critical\",\n }));\n }\n\n private _scanSecrets(text: string): GovernanceViolation[] {\n const violations: GovernanceViolation[] = [];\n\n for (const { type, pattern, severity } of SECRETS_PATTERNS) {\n const regex = new RegExp(pattern.source, pattern.flags);\n let match: RegExpExecArray | null;\n\n while ((match = regex.exec(text)) !== null) {\n violations.push({\n category: \"secrets\",\n type,\n severity,\n start: match.index,\n end: match.index + match[0].length,\n });\n }\n }\n\n return violations;\n }\n\n private _scanFinancial(text: string): GovernanceViolation[] {\n const violations: GovernanceViolation[] = [];\n\n // Credit card (Luhn-validated)\n for (const match of text.matchAll(CREDIT_CARD_GENERIC_PATTERN)) {\n const digits = match[0].replace(/[\\s-]/g, \"\");\n if (PiiScanner._isValidLuhn(digits)) {\n violations.push({\n category: \"financial\",\n type: \"credit_card\",\n severity: \"critical\",\n start: match.index!,\n end: match.index! + match[0].length,\n });\n }\n }\n\n // IBAN\n for (const { type, pattern, severity } of FINANCIAL_PATTERNS) {\n const regex = new RegExp(pattern.source, pattern.flags);\n let match: RegExpExecArray | null;\n\n while ((match = regex.exec(text)) !== null) {\n violations.push({\n category: \"financial\",\n type,\n severity,\n start: match.index,\n end: match.index + match[0].length,\n });\n }\n }\n\n return violations;\n }\n\n // ─── Utilities ──────────────────────────────────────────────────────\n\n /**\n * Remove overlapping entities, preferring the one that starts first\n * (and is longest in case of a tie).\n */\n private _removeOverlaps(entities: PiiEntity[]): PiiEntity[] {\n if (entities.length === 0) return entities;\n\n const result: PiiEntity[] = [entities[0]!];\n\n for (let i = 1; i < entities.length; i++) {\n const current = entities[i]!;\n const last = result[result.length - 1]!;\n\n if (current.start >= last.end) {\n result.push(current);\n } else if (\n current.start === last.start &&\n current.end > last.end\n ) {\n result[result.length - 1] = current;\n }\n }\n\n return result;\n }\n\n /**\n * Replace detected entities with [REDACTED] markers.\n */\n private _redactText(text: string, entities: PiiEntity[]): string {\n if (entities.length === 0) return text;\n\n let result = \"\";\n let cursor = 0;\n\n for (const entity of entities) {\n result += text.slice(cursor, entity.start);\n result += `[${entity.type.toUpperCase()}]`;\n cursor = entity.end;\n }\n\n result += text.slice(cursor);\n return result;\n }\n\n /**\n * Luhn algorithm for credit card validation.\n */\n static _isValidLuhn(number: string): boolean {\n if (number.length < 13 || number.length > 19) return false;\n\n let sum = 0;\n let alternate = false;\n\n for (let i = number.length - 1; i >= 0; i--) {\n const char = number[i]!;\n if (char < \"0\" || char > \"9\") return false;\n\n let n = parseInt(char, 10);\n if (alternate) {\n n *= 2;\n if (n > 9) n -= 9;\n }\n sum += n;\n alternate = !alternate;\n }\n\n return sum % 10 === 0;\n }\n}\n","import { RateLimitedError } from \"./errors.js\";\n\n/**\n * Token-bucket rate limiter.\n *\n * Allows `burst` tokens to be consumed immediately, and refills at `rate`\n * tokens per second. Useful for throttling outbound API calls.\n */\nexport class TokenBucketRateLimiter {\n private _tokens: number;\n private _lastRefill: number;\n private readonly _rate: number;\n private readonly _burst: number;\n private readonly _strict: boolean;\n\n /**\n * @param rate - Tokens refilled per second\n * @param burst - Maximum tokens (bucket capacity)\n * @param strict - If true, `allow()` throws RateLimitedError instead of returning false\n */\n constructor(rate: number, burst: number, strict = false) {\n this._rate = rate;\n this._burst = burst;\n this._tokens = burst;\n this._lastRefill = Date.now();\n this._strict = strict;\n }\n\n /**\n * Attempt to consume one token.\n * Returns true if allowed, false if rate-limited.\n * In strict mode, throws RateLimitedError instead of returning false.\n */\n allow(): boolean {\n this._refill();\n\n if (this._tokens >= 1) {\n this._tokens -= 1;\n return true;\n }\n\n if (this._strict) {\n const retryAfter = Math.ceil((1 - this._tokens) / this._rate);\n throw new RateLimitedError(\n `Rate limit exceeded. Retry after ${retryAfter}s.`,\n retryAfter,\n \"token_bucket\",\n );\n }\n\n return false;\n }\n\n /**\n * Wait until a token is available, then consume it.\n * Resolves immediately if a token is available now.\n */\n async wait(): Promise<void> {\n this._refill();\n\n if (this._tokens >= 1) {\n this._tokens -= 1;\n return;\n }\n\n // Calculate how long until 1 token is available\n const deficit = 1 - this._tokens;\n const waitMs = Math.ceil((deficit / this._rate) * 1000);\n\n await new Promise<void>((resolve) => setTimeout(resolve, waitMs));\n this._refill();\n this._tokens -= 1;\n }\n\n /**\n * Get the current number of available tokens (for inspection/testing).\n */\n get availableTokens(): number {\n this._refill();\n return this._tokens;\n }\n\n private _refill(): void {\n const now = Date.now();\n const elapsed = (now - this._lastRefill) / 1000;\n this._tokens = Math.min(this._burst, this._tokens + elapsed * this._rate);\n this._lastRefill = now;\n }\n}\n","import type { BaseProvider, ExtractedUsage } from \"./base.js\";\nimport type { ModelCostClient } from \"../client.js\";\nimport type { ModelCostConfig } from \"../config.js\";\nimport { BudgetExceededError, PiiDetectedError } from \"../errors.js\";\nimport { BudgetManager } from \"../budget.js\";\nimport { CostTracker, calculateCost } from \"../tracking.js\";\nimport { PiiScanner } from \"../pii.js\";\nimport { TokenBucketRateLimiter } from \"../rate-limiter.js\";\nimport type { Provider } from \"../models/common.js\";\nimport type { SessionContext } from \"../session.js\";\n\n/**\n * Typings for the subset of the OpenAI client we interact with.\n * We use structural typing so the SDK does not depend on the openai package.\n */\ninterface OpenAIUsage {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens?: number;\n}\n\ninterface OpenAIChatResponse {\n usage?: OpenAIUsage;\n model?: string;\n [key: string]: unknown;\n}\n\ninterface OpenAIChatCompletions {\n create: (...args: unknown[]) => Promise<OpenAIChatResponse>;\n}\n\ninterface OpenAIChat {\n completions: OpenAIChatCompletions;\n}\n\ninterface OpenAILikeClient {\n chat: OpenAIChat;\n [key: string]: unknown;\n}\n\n/**\n * Provider wrapper for OpenAI-compatible clients.\n *\n * Intercepts `client.chat.completions.create()` calls to:\n * 1. Run a budget pre-check\n * 2. Scan prompt messages for PII\n * 3. Enforce rate limits\n * 4. Extract usage from the response and record the cost\n */\nexport class OpenAIProvider implements BaseProvider {\n private readonly _client: ModelCostClient;\n private readonly _config: ModelCostConfig;\n private readonly _budgetManager: BudgetManager;\n private readonly _costTracker: CostTracker;\n private readonly _piiScanner: PiiScanner;\n private readonly _rateLimiter: TokenBucketRateLimiter;\n private readonly _session?: SessionContext;\n\n constructor(\n apiClient: ModelCostClient,\n config: ModelCostConfig,\n budgetManager: BudgetManager,\n costTracker: CostTracker,\n piiScanner: PiiScanner,\n rateLimiter: TokenBucketRateLimiter,\n session?: SessionContext,\n ) {\n this._client = apiClient;\n this._config = config;\n this._budgetManager = budgetManager;\n this._costTracker = costTracker;\n this._piiScanner = piiScanner;\n this._rateLimiter = rateLimiter;\n this._session = session;\n }\n\n getProviderName(): string {\n return \"openai\";\n }\n\n extractUsage(response: unknown): ExtractedUsage {\n const res = response as OpenAIChatResponse;\n return {\n inputTokens: res.usage?.prompt_tokens ?? 0,\n outputTokens: res.usage?.completion_tokens ?? 0,\n };\n }\n\n wrap(client: unknown): unknown {\n const openaiClient = client as OpenAILikeClient;\n const self = this;\n\n // Create a proxy for the chat.completions object\n const completionsProxy = new Proxy(openaiClient.chat.completions, {\n get(target, prop, receiver) {\n if (prop === \"create\") {\n return async (...args: unknown[]) => {\n const params = (args[0] ?? {}) as Record<string, unknown>;\n const model = (params[\"model\"] as string) ?? \"unknown\";\n\n // 1. Rate limit check\n await self._rateLimiter.wait();\n\n // 2. PII / governance scan on messages\n const messages = params[\"messages\"] as\n | Array<{ content?: string }>\n | undefined;\n if (messages) {\n for (const msg of messages) {\n if (typeof msg.content === \"string\") {\n const scanResult = self._piiScanner.scan(msg.content);\n if (scanResult.detected) {\n if (self._config.contentPrivacy) {\n // Metadata-only mode: full local classification, never send raw content\n const fullResult = self._piiScanner.fullScan(msg.content);\n\n if (fullResult.detected) {\n // Report signals asynchronously (fire-and-forget)\n for (const violation of fullResult.violations) {\n self._client\n .reportSignal({\n organizationId: self._config.orgId,\n violationType: violation.category,\n violationSubtype: violation.type,\n severity: violation.severity,\n environment: self._config.environment,\n actionTaken: \"block\",\n wasAllowed: false,\n detectedAt: new Date().toISOString(),\n source: \"metadata_only\",\n violationCount: 1,\n })\n .catch(() => {}); // fire-and-forget\n }\n\n throw new PiiDetectedError(\n \"Sensitive content detected and blocked locally (metadata-only mode)\",\n fullResult.violations.map((v) => ({\n type: v.category,\n subtype: v.type,\n severity: v.severity as \"low\" | \"medium\" | \"high\",\n start: v.start,\n end: v.end,\n })),\n self._piiScanner.redact(msg.content),\n );\n }\n } else {\n // Standard mode: check governance policy server-side\n const govResult = await self._client.scanText({\n orgId: self._config.orgId,\n text: msg.content,\n environment: self._config.environment,\n });\n\n if (!govResult.isAllowed) {\n throw new PiiDetectedError(\n \"PII detected in request and blocked by policy\",\n govResult.violations,\n govResult.redactedText ?? scanResult.redactedText,\n );\n }\n }\n }\n }\n }\n }\n\n // 3. Budget pre-check\n const estimatedCost = calculateCost(model, 500, 500); // estimate\n const budgetCheck = await self._budgetManager.check(\n self._client,\n self._config.orgId,\n (params[\"feature\"] as string) ?? \"default\",\n estimatedCost,\n );\n\n if (!budgetCheck.allowed && budgetCheck.action === \"block\") {\n throw new BudgetExceededError(\n budgetCheck.reason ?? \"Budget exceeded\",\n 0,\n \"organization\",\n );\n }\n\n // 3b. Session pre-check\n if (self._session) {\n self._session.preCallCheck(estimatedCost);\n }\n\n // 4. Execute the actual API call\n const startTime = Date.now();\n const response = await target.create.apply(target, args as never);\n const latencyMs = Date.now() - startTime;\n\n // 5. Extract usage and record\n const usage = self.extractUsage(response);\n const cost = calculateCost(\n model,\n usage.inputTokens,\n usage.outputTokens,\n );\n\n self._costTracker.record(\n {\n apiKey: self._config.apiKey,\n timestamp: new Date().toISOString(),\n provider: \"openai\" as Provider,\n model,\n inputTokens: usage.inputTokens,\n outputTokens: usage.outputTokens,\n latencyMs,\n metadata: {},\n },\n self._client,\n );\n\n // 6. Update local budget spend\n self._budgetManager.updateLocalSpend(\n self._config.orgId,\n (params[\"feature\"] as string) ?? \"default\",\n cost,\n );\n\n // 7. Session call recording\n if (self._session) {\n self._session.recordCall({\n callType: \"llm\",\n inputTokens: usage.inputTokens,\n outputTokens: usage.outputTokens,\n costUsd: cost,\n });\n }\n\n return response;\n };\n }\n return Reflect.get(target, prop, receiver);\n },\n });\n\n // Create a proxy for the chat object\n const chatProxy = new Proxy(openaiClient.chat, {\n get(target, prop, receiver) {\n if (prop === \"completions\") {\n return completionsProxy;\n }\n return Reflect.get(target, prop, receiver);\n },\n });\n\n // Create a proxy for the top-level client\n return new Proxy(openaiClient, {\n get(target, prop, receiver) {\n if (prop === \"chat\") {\n return chatProxy;\n }\n return Reflect.get(target, prop, receiver);\n },\n });\n }\n}\n","import type { BaseProvider, ExtractedUsage } from \"./base.js\";\nimport type { ModelCostClient } from \"../client.js\";\nimport type { ModelCostConfig } from \"../config.js\";\nimport { BudgetExceededError, PiiDetectedError } from \"../errors.js\";\nimport { BudgetManager } from \"../budget.js\";\nimport { CostTracker, calculateCost } from \"../tracking.js\";\nimport { PiiScanner } from \"../pii.js\";\nimport { TokenBucketRateLimiter } from \"../rate-limiter.js\";\nimport type { Provider } from \"../models/common.js\";\nimport type { SessionContext } from \"../session.js\";\n\n/**\n * Typings for the subset of the Anthropic client we interact with.\n */\ninterface AnthropicUsage {\n input_tokens: number;\n output_tokens: number;\n}\n\ninterface AnthropicMessageResponse {\n usage?: AnthropicUsage;\n model?: string;\n [key: string]: unknown;\n}\n\ninterface AnthropicMessages {\n create: (...args: unknown[]) => Promise<AnthropicMessageResponse>;\n}\n\ninterface AnthropicLikeClient {\n messages: AnthropicMessages;\n [key: string]: unknown;\n}\n\n/**\n * Provider wrapper for Anthropic clients.\n *\n * Intercepts `client.messages.create()` calls to add budget enforcement,\n * PII scanning, rate limiting, and cost tracking.\n */\nexport class AnthropicProvider implements BaseProvider {\n private readonly _client: ModelCostClient;\n private readonly _config: ModelCostConfig;\n private readonly _budgetManager: BudgetManager;\n private readonly _costTracker: CostTracker;\n private readonly _piiScanner: PiiScanner;\n private readonly _rateLimiter: TokenBucketRateLimiter;\n private readonly _session?: SessionContext;\n\n constructor(\n apiClient: ModelCostClient,\n config: ModelCostConfig,\n budgetManager: BudgetManager,\n costTracker: CostTracker,\n piiScanner: PiiScanner,\n rateLimiter: TokenBucketRateLimiter,\n session?: SessionContext,\n ) {\n this._client = apiClient;\n this._config = config;\n this._budgetManager = budgetManager;\n this._costTracker = costTracker;\n this._piiScanner = piiScanner;\n this._rateLimiter = rateLimiter;\n this._session = session;\n }\n\n getProviderName(): string {\n return \"anthropic\";\n }\n\n extractUsage(response: unknown): ExtractedUsage {\n const res = response as AnthropicMessageResponse;\n return {\n inputTokens: res.usage?.input_tokens ?? 0,\n outputTokens: res.usage?.output_tokens ?? 0,\n };\n }\n\n wrap(client: unknown): unknown {\n const anthropicClient = client as AnthropicLikeClient;\n const self = this;\n\n // Create a proxy for the messages object\n const messagesProxy = new Proxy(anthropicClient.messages, {\n get(target, prop, receiver) {\n if (prop === \"create\") {\n return async (...args: unknown[]) => {\n const params = (args[0] ?? {}) as Record<string, unknown>;\n const model = (params[\"model\"] as string) ?? \"unknown\";\n\n // 1. Rate limit\n await self._rateLimiter.wait();\n\n // 2. PII scan\n const messages = params[\"messages\"] as\n | Array<{ content?: string | Array<{ text?: string }> }>\n | undefined;\n if (messages) {\n for (const msg of messages) {\n const textContent =\n typeof msg.content === \"string\"\n ? msg.content\n : Array.isArray(msg.content)\n ? msg.content\n .map((block) => block.text ?? \"\")\n .join(\" \")\n : \"\";\n\n if (textContent) {\n const scanResult = self._piiScanner.scan(textContent);\n if (scanResult.detected) {\n if (self._config.contentPrivacy) {\n // Metadata-only mode: full local classification, never send raw content\n const fullResult = self._piiScanner.fullScan(textContent);\n\n if (fullResult.detected) {\n // Report signals asynchronously (fire-and-forget)\n for (const violation of fullResult.violations) {\n self._client\n .reportSignal({\n organizationId: self._config.orgId,\n violationType: violation.category,\n violationSubtype: violation.type,\n severity: violation.severity,\n environment: self._config.environment,\n actionTaken: \"block\",\n wasAllowed: false,\n detectedAt: new Date().toISOString(),\n source: \"metadata_only\",\n violationCount: 1,\n })\n .catch(() => {}); // fire-and-forget\n }\n\n throw new PiiDetectedError(\n \"Sensitive content detected and blocked locally (metadata-only mode)\",\n fullResult.violations.map((v) => ({\n type: v.category,\n subtype: v.type,\n severity: v.severity as \"low\" | \"medium\" | \"high\",\n start: v.start,\n end: v.end,\n })),\n self._piiScanner.redact(textContent),\n );\n }\n } else {\n // Standard mode: check governance policy server-side\n const govResult = await self._client.scanText({\n orgId: self._config.orgId,\n text: textContent,\n environment: self._config.environment,\n });\n if (!govResult.isAllowed) {\n throw new PiiDetectedError(\n \"PII detected in request and blocked by policy\",\n govResult.violations,\n govResult.redactedText ?? scanResult.redactedText,\n );\n }\n }\n }\n }\n }\n }\n\n // 3. Budget pre-check\n const estimatedCost = calculateCost(model, 500, 500);\n const budgetCheck = await self._budgetManager.check(\n self._client,\n self._config.orgId,\n (params[\"feature\"] as string) ?? \"default\",\n estimatedCost,\n );\n\n if (!budgetCheck.allowed && budgetCheck.action === \"block\") {\n throw new BudgetExceededError(\n budgetCheck.reason ?? \"Budget exceeded\",\n 0,\n \"organization\",\n );\n }\n\n // 3b. Session pre-check\n if (self._session) {\n self._session.preCallCheck(estimatedCost);\n }\n\n // 4. Execute\n const startTime = Date.now();\n const response = await target.create.apply(target, args as never);\n const latencyMs = Date.now() - startTime;\n\n // 5. Extract usage and record\n const usage = self.extractUsage(response);\n const cost = calculateCost(\n model,\n usage.inputTokens,\n usage.outputTokens,\n );\n\n self._costTracker.record(\n {\n apiKey: self._config.apiKey,\n timestamp: new Date().toISOString(),\n provider: \"anthropic\" as Provider,\n model,\n inputTokens: usage.inputTokens,\n outputTokens: usage.outputTokens,\n latencyMs,\n metadata: {},\n },\n self._client,\n );\n\n self._budgetManager.updateLocalSpend(\n self._config.orgId,\n (params[\"feature\"] as string) ?? \"default\",\n cost,\n );\n\n // 7. Session call recording\n if (self._session) {\n self._session.recordCall({\n callType: \"llm\",\n inputTokens: usage.inputTokens,\n outputTokens: usage.outputTokens,\n costUsd: cost,\n });\n }\n\n return response;\n };\n }\n return Reflect.get(target, prop, receiver);\n },\n });\n\n // Create a proxy for the top-level client\n return new Proxy(anthropicClient, {\n get(target, prop, receiver) {\n if (prop === \"messages\") {\n return messagesProxy;\n }\n return Reflect.get(target, prop, receiver);\n },\n });\n }\n}\n","import type { BaseProvider, ExtractedUsage } from \"./base.js\";\nimport type { ModelCostClient } from \"../client.js\";\nimport type { ModelCostConfig } from \"../config.js\";\nimport { BudgetExceededError, PiiDetectedError } from \"../errors.js\";\nimport { BudgetManager } from \"../budget.js\";\nimport { CostTracker, calculateCost } from \"../tracking.js\";\nimport { PiiScanner } from \"../pii.js\";\nimport { TokenBucketRateLimiter } from \"../rate-limiter.js\";\nimport type { Provider } from \"../models/common.js\";\nimport type { SessionContext } from \"../session.js\";\n\n/**\n * Typings for the subset of the Google Generative AI client we interact with.\n */\ninterface GoogleUsageMetadata {\n promptTokenCount?: number;\n candidatesTokenCount?: number;\n totalTokenCount?: number;\n}\n\ninterface GoogleGenerateContentResponse {\n response: {\n usageMetadata?: GoogleUsageMetadata;\n [key: string]: unknown;\n };\n}\n\ninterface GoogleGenerativeModel {\n generateContent: (...args: unknown[]) => Promise<GoogleGenerateContentResponse>;\n model?: string;\n [key: string]: unknown;\n}\n\ninterface GoogleAILikeClient {\n getGenerativeModel: (params: { model: string }) => GoogleGenerativeModel;\n [key: string]: unknown;\n}\n\n/**\n * Provider wrapper for Google Generative AI clients.\n *\n * Intercepts `model.generateContent()` calls returned from\n * `client.getGenerativeModel()`.\n */\nexport class GoogleProvider implements BaseProvider {\n private readonly _client: ModelCostClient;\n private readonly _config: ModelCostConfig;\n private readonly _budgetManager: BudgetManager;\n private readonly _costTracker: CostTracker;\n private readonly _piiScanner: PiiScanner;\n private readonly _rateLimiter: TokenBucketRateLimiter;\n private readonly _session?: SessionContext;\n\n constructor(\n apiClient: ModelCostClient,\n config: ModelCostConfig,\n budgetManager: BudgetManager,\n costTracker: CostTracker,\n piiScanner: PiiScanner,\n rateLimiter: TokenBucketRateLimiter,\n session?: SessionContext,\n ) {\n this._client = apiClient;\n this._config = config;\n this._budgetManager = budgetManager;\n this._costTracker = costTracker;\n this._piiScanner = piiScanner;\n this._rateLimiter = rateLimiter;\n this._session = session;\n }\n\n getProviderName(): string {\n return \"google\";\n }\n\n extractUsage(response: unknown): ExtractedUsage {\n const res = response as GoogleGenerateContentResponse;\n const metadata = res.response?.usageMetadata;\n return {\n inputTokens: metadata?.promptTokenCount ?? 0,\n outputTokens: metadata?.candidatesTokenCount ?? 0,\n };\n }\n\n wrap(client: unknown): unknown {\n const googleClient = client as GoogleAILikeClient;\n const self = this;\n\n return new Proxy(googleClient, {\n get(target, prop, receiver) {\n if (prop === \"getGenerativeModel\") {\n return (params: { model: string }) => {\n const model = target.getGenerativeModel(params);\n return self._wrapModel(model, params.model);\n };\n }\n return Reflect.get(target, prop, receiver);\n },\n });\n }\n\n private _wrapModel(\n model: GoogleGenerativeModel,\n modelName: string,\n ): GoogleGenerativeModel {\n const self = this;\n\n return new Proxy(model, {\n get(target, prop, receiver) {\n if (prop === \"generateContent\") {\n return async (...args: unknown[]) => {\n // 1. Rate limit\n await self._rateLimiter.wait();\n\n // 2. PII scan on string content\n if (typeof args[0] === \"string\") {\n const scanResult = self._piiScanner.scan(args[0]);\n if (scanResult.detected) {\n if (self._config.contentPrivacy) {\n // Metadata-only mode: full local classification, never send raw content\n const fullResult = self._piiScanner.fullScan(args[0]);\n\n if (fullResult.detected) {\n // Report signals asynchronously (fire-and-forget)\n for (const violation of fullResult.violations) {\n self._client\n .reportSignal({\n organizationId: self._config.orgId,\n violationType: violation.category,\n violationSubtype: violation.type,\n severity: violation.severity,\n environment: self._config.environment,\n actionTaken: \"block\",\n wasAllowed: false,\n detectedAt: new Date().toISOString(),\n source: \"metadata_only\",\n violationCount: 1,\n })\n .catch(() => {}); // fire-and-forget\n }\n\n throw new PiiDetectedError(\n \"Sensitive content detected and blocked locally (metadata-only mode)\",\n fullResult.violations.map((v) => ({\n type: v.category,\n subtype: v.type,\n severity: v.severity as \"low\" | \"medium\" | \"high\",\n start: v.start,\n end: v.end,\n })),\n self._piiScanner.redact(args[0]),\n );\n }\n } else {\n // Standard mode: check governance policy server-side\n const govResult = await self._client.scanText({\n orgId: self._config.orgId,\n text: args[0],\n environment: self._config.environment,\n });\n if (!govResult.isAllowed) {\n throw new PiiDetectedError(\n \"PII detected in request and blocked by policy\",\n govResult.violations,\n govResult.redactedText ?? scanResult.redactedText,\n );\n }\n }\n }\n }\n\n // 3. Budget pre-check\n const estimatedCost = calculateCost(modelName, 500, 500);\n const budgetCheck = await self._budgetManager.check(\n self._client,\n self._config.orgId,\n \"default\",\n estimatedCost,\n );\n\n if (!budgetCheck.allowed && budgetCheck.action === \"block\") {\n throw new BudgetExceededError(\n budgetCheck.reason ?? \"Budget exceeded\",\n 0,\n \"organization\",\n );\n }\n\n // 3b. Session pre-check\n if (self._session) {\n self._session.preCallCheck(estimatedCost);\n }\n\n // 4. Execute\n const startTime = Date.now();\n const response = await target.generateContent.apply(\n target,\n args as never,\n );\n const latencyMs = Date.now() - startTime;\n\n // 5. Extract and record\n const usage = self.extractUsage(response);\n const cost = calculateCost(\n modelName,\n usage.inputTokens,\n usage.outputTokens,\n );\n\n self._costTracker.record(\n {\n apiKey: self._config.apiKey,\n timestamp: new Date().toISOString(),\n provider: \"google\" as Provider,\n model: modelName,\n inputTokens: usage.inputTokens,\n outputTokens: usage.outputTokens,\n latencyMs,\n metadata: {},\n },\n self._client,\n );\n\n self._budgetManager.updateLocalSpend(\n self._config.orgId,\n \"default\",\n cost,\n );\n\n // 7. Session call recording\n if (self._session) {\n self._session.recordCall({\n callType: \"llm\",\n inputTokens: usage.inputTokens,\n outputTokens: usage.outputTokens,\n costUsd: cost,\n });\n }\n\n return response;\n };\n }\n return Reflect.get(target, prop, receiver);\n },\n });\n }\n}\n","export type { BaseProvider, ExtractedUsage } from \"./base.js\";\nexport { OpenAIProvider } from \"./openai.js\";\nexport { AnthropicProvider } from \"./anthropic.js\";\nexport { GoogleProvider } from \"./google.js\";\n\nimport type { ModelCostClient } from \"../client.js\";\nimport type { ModelCostConfig } from \"../config.js\";\nimport { BudgetManager } from \"../budget.js\";\nimport { CostTracker } from \"../tracking.js\";\nimport { PiiScanner } from \"../pii.js\";\nimport { TokenBucketRateLimiter } from \"../rate-limiter.js\";\nimport type { SessionContext } from \"../session.js\";\nimport { OpenAIProvider } from \"./openai.js\";\nimport { AnthropicProvider } from \"./anthropic.js\";\nimport { GoogleProvider } from \"./google.js\";\nimport type { BaseProvider } from \"./base.js\";\n\n/**\n * Detect the provider from a client object by duck-typing.\n */\nfunction detectProvider(client: unknown): string | null {\n const obj = client as Record<string, unknown>;\n if (obj[\"chat\"] && typeof obj[\"chat\"] === \"object\") {\n const chat = obj[\"chat\"] as Record<string, unknown>;\n if (chat[\"completions\"]) return \"openai\";\n }\n if (obj[\"messages\"] && typeof obj[\"messages\"] === \"object\") {\n return \"anthropic\";\n }\n if (typeof obj[\"getGenerativeModel\"] === \"function\") {\n return \"google\";\n }\n return null;\n}\n\n/**\n * Create the appropriate provider wrapper for a given AI client.\n */\nexport function createProviderForClient(\n client: unknown,\n apiClient: ModelCostClient,\n config: ModelCostConfig,\n budgetManager: BudgetManager,\n costTracker: CostTracker,\n piiScanner: PiiScanner,\n rateLimiter: TokenBucketRateLimiter,\n session?: SessionContext,\n): BaseProvider {\n const providerName = detectProvider(client);\n\n switch (providerName) {\n case \"openai\":\n return new OpenAIProvider(\n apiClient,\n config,\n budgetManager,\n costTracker,\n piiScanner,\n rateLimiter,\n session,\n );\n case \"anthropic\":\n return new AnthropicProvider(\n apiClient,\n config,\n budgetManager,\n costTracker,\n piiScanner,\n rateLimiter,\n session,\n );\n case \"google\":\n return new GoogleProvider(\n apiClient,\n config,\n budgetManager,\n costTracker,\n piiScanner,\n rateLimiter,\n session,\n );\n default:\n throw new Error(\n `Unsupported AI client. Could not detect provider from client object. ` +\n `Supported providers: openai, anthropic, google.`,\n );\n }\n}\n","import {\n SessionBudgetExceededError,\n SessionIterationLimitExceededError,\n} from \"./errors.js\";\n\n/**\n * A single recorded call within a session.\n */\nexport interface SessionCallRecord {\n callSequence: number;\n callType: string;\n toolName?: string;\n inputTokens: number;\n outputTokens: number;\n cumulativeInputTokens: number;\n costUsd: number;\n cumulativeCostUsd: number;\n createdAt: Date;\n}\n\n/**\n * Options for creating a new SessionContext.\n */\nexport interface SessionOptions {\n sessionId: string;\n serverSessionId?: string;\n feature?: string;\n userId?: string;\n maxSpendUsd?: number;\n maxIterations?: number;\n}\n\n/**\n * Local session governance context.\n *\n * Tracks cumulative spend, iteration count, and call history for an\n * agent session. Enforces budget and iteration limits before each call\n * via `preCallCheck()`.\n */\nexport class SessionContext {\n readonly sessionId: string;\n serverSessionId?: string;\n readonly feature?: string;\n readonly userId?: string;\n readonly maxSpendUsd?: number;\n readonly maxIterations?: number;\n\n private _currentSpendUsd = 0;\n private _iterationCount = 0;\n private _cumulativeInputTokens = 0;\n private _status: \"active\" | \"completed\" | \"terminated\" = \"active\";\n private _terminationReason?: string;\n private _calls: SessionCallRecord[] = [];\n\n constructor(options: SessionOptions) {\n this.sessionId = options.sessionId;\n this.serverSessionId = options.serverSessionId;\n this.feature = options.feature;\n this.userId = options.userId;\n this.maxSpendUsd = options.maxSpendUsd;\n this.maxIterations = options.maxIterations;\n }\n\n // ─── Read-only accessors ──────────────────────────────────────────\n\n get currentSpendUsd(): number {\n return this._currentSpendUsd;\n }\n\n get iterationCount(): number {\n return this._iterationCount;\n }\n\n get status(): string {\n return this._status;\n }\n\n get terminationReason(): string | undefined {\n return this._terminationReason;\n }\n\n get calls(): readonly SessionCallRecord[] {\n return this._calls;\n }\n\n get remainingBudget(): number | undefined {\n if (this.maxSpendUsd === undefined) return undefined;\n return Math.max(0, this.maxSpendUsd - this._currentSpendUsd);\n }\n\n get remainingIterations(): number | undefined {\n if (this.maxIterations === undefined) return undefined;\n return Math.max(0, this.maxIterations - this._iterationCount);\n }\n\n // ─── Lifecycle methods ────────────────────────────────────────────\n\n /**\n * Pre-flight check before making an AI call.\n * Throws if budget or iteration limits would be exceeded.\n */\n preCallCheck(estimatedCost: number): void {\n if (this.maxSpendUsd !== undefined) {\n if (this._currentSpendUsd + estimatedCost > this.maxSpendUsd) {\n this._status = \"terminated\";\n this._terminationReason = \"budget_exceeded\";\n throw new SessionBudgetExceededError(\n `Session budget exceeded: current spend $${this._currentSpendUsd.toFixed(4)} + estimated $${estimatedCost.toFixed(4)} > limit $${this.maxSpendUsd.toFixed(4)}`,\n this.sessionId,\n this._currentSpendUsd,\n this.maxSpendUsd,\n );\n }\n }\n\n if (this.maxIterations !== undefined) {\n if (this._iterationCount + 1 > this.maxIterations) {\n this._status = \"terminated\";\n this._terminationReason = \"iteration_limit_exceeded\";\n throw new SessionIterationLimitExceededError(\n `Session iteration limit exceeded: ${this._iterationCount + 1} > ${this.maxIterations}`,\n this.sessionId,\n this._iterationCount,\n this.maxIterations,\n );\n }\n }\n }\n\n /**\n * Record a completed call, updating cumulative counters.\n */\n recordCall(options: {\n callType: string;\n inputTokens: number;\n outputTokens: number;\n costUsd: number;\n toolName?: string;\n }): SessionCallRecord {\n this._iterationCount++;\n this._currentSpendUsd += options.costUsd;\n this._cumulativeInputTokens += options.inputTokens;\n\n const record: SessionCallRecord = {\n callSequence: this._iterationCount,\n callType: options.callType,\n toolName: options.toolName,\n inputTokens: options.inputTokens,\n outputTokens: options.outputTokens,\n cumulativeInputTokens: this._cumulativeInputTokens,\n costUsd: options.costUsd,\n cumulativeCostUsd: this._currentSpendUsd,\n createdAt: new Date(),\n };\n\n this._calls.push(record);\n return record;\n }\n\n /**\n * Close the session with a terminal status.\n */\n close(reason = \"completed\"): void {\n this._status = reason === \"completed\" ? \"completed\" : \"terminated\";\n this._terminationReason = reason;\n }\n}\n","import { ModelCostConfig } from \"./config.js\";\nimport type { ModelCostInitOptions } from \"./config.js\";\nimport { ModelCostClient } from \"./client.js\";\nimport { BudgetManager } from \"./budget.js\";\nimport { CostTracker, calculateCost } from \"./tracking.js\";\nimport { PiiScanner } from \"./pii.js\";\nimport type { PiiResult } from \"./pii.js\";\nimport { TokenBucketRateLimiter } from \"./rate-limiter.js\";\nimport { createProviderForClient } from \"./providers/index.js\";\nimport { ConfigurationError } from \"./errors.js\";\nimport { SessionContext } from \"./session.js\";\nimport type { BudgetCheckResponse, BudgetStatusResponse } from \"./models/budget.js\";\n\n// ─── Re-exports ──────────────────────────────────────────────────────\n\nexport { VERSION } from \"./version.js\";\nexport { ModelCostConfig } from \"./config.js\";\nexport type { ModelCostInitOptions, ModelCostResolvedConfig } from \"./config.js\";\nexport { ModelCostClient } from \"./client.js\";\nexport { BudgetManager } from \"./budget.js\";\nexport { CostTracker, calculateCost, MODEL_PRICING } from \"./tracking.js\";\nexport { PiiScanner } from \"./pii.js\";\nexport type { PiiResult, PiiEntity, GovernanceViolation, FullScanResult } from \"./pii.js\";\nexport { TokenBucketRateLimiter } from \"./rate-limiter.js\";\n\nexport {\n ModelCostError,\n ConfigurationError,\n BudgetExceededError,\n RateLimitedError,\n PiiDetectedError,\n ModelCostApiError,\n SessionBudgetExceededError,\n SessionIterationLimitExceededError,\n} from \"./errors.js\";\n\nexport { SessionContext } from \"./session.js\";\nexport type { SessionOptions, SessionCallRecord } from \"./session.js\";\n\nexport type {\n BudgetAction,\n BudgetScope,\n BudgetPeriod,\n Provider,\n TrackRequest,\n TrackResponse,\n BudgetCheckResponse,\n BudgetPolicy,\n BudgetStatusResponse,\n GovernanceScanRequest,\n GovernanceScanResponse,\n DetectedViolation,\n ModelPricing,\n CreateSessionRequest,\n CreateSessionResponse,\n RecordSessionCallRequest,\n CloseSessionRequest,\n} from \"./models/index.js\";\n\nexport type { BaseProvider, ExtractedUsage } from \"./providers/base.js\";\nexport { OpenAIProvider } from \"./providers/openai.js\";\nexport { AnthropicProvider } from \"./providers/anthropic.js\";\nexport { GoogleProvider } from \"./providers/google.js\";\n\n// ─── Track cost decorator options ────────────────────────────────────\n\nexport interface TrackCostOptions {\n model: string;\n feature?: string;\n provider?: string;\n session?: SessionContext;\n}\n\n// ─── Usage report (returned by getUsage) ─────────────────────────────\n\nexport interface UsageReport {\n totalSpendUsd: number;\n totalBudgetUsd: number;\n policiesAtRisk: number;\n policies: BudgetStatusResponse[\"policies\"];\n}\n\n// ─── Internal singleton state ────────────────────────────────────────\n\ninterface ModelCostInstance {\n config: ModelCostConfig;\n client: ModelCostClient;\n budgetManager: BudgetManager;\n costTracker: CostTracker;\n piiScanner: PiiScanner;\n rateLimiter: TokenBucketRateLimiter;\n}\n\n// ─── Main SDK class ──────────────────────────────────────────────────\n\n/**\n * Main entry point for the ModelCost Node.js SDK.\n *\n * Uses a static singleton pattern -- call `ModelCost.init()` once,\n * then use the static methods from anywhere in your application.\n *\n * @example\n * ```ts\n * import { ModelCost } from \"@modelcost/sdk\";\n * import OpenAI from \"openai\";\n *\n * ModelCost.init({ apiKey: \"mc_...\", orgId: \"org-123\" });\n * const openai = ModelCost.wrap(new OpenAI());\n * ```\n */\nexport class ModelCost {\n private static _instance: ModelCostInstance | null = null;\n\n /** Prevent direct instantiation. */\n private constructor() {}\n\n /**\n * Initialize the ModelCost SDK. Must be called before any other method.\n * Subsequent calls will re-initialize (shutting down the previous instance).\n */\n static init(options: ModelCostInitOptions): void {\n if (ModelCost._instance) {\n // Gracefully shut down existing instance\n ModelCost._instance.costTracker.stopAutoFlush();\n ModelCost._instance.costTracker.stopPricingSync();\n ModelCost._instance.client.close();\n }\n\n const config = new ModelCostConfig(options);\n const client = new ModelCostClient(config);\n const budgetManager = new BudgetManager(config.syncIntervalMs);\n const costTracker = new CostTracker(config.flushBatchSize);\n const piiScanner = new PiiScanner();\n const rateLimiter = new TokenBucketRateLimiter(10, 50);\n\n // Start auto-flushing tracked events\n costTracker.startAutoFlush(client, config.flushIntervalMs);\n\n // Start periodic pricing sync from server\n costTracker.startPricingSync(config.baseUrl, config.apiKey);\n\n ModelCost._instance = {\n config,\n client,\n budgetManager,\n costTracker,\n piiScanner,\n rateLimiter,\n };\n }\n\n /**\n * Wrap an AI provider client with cost tracking, budget enforcement,\n * and PII scanning. Returns a proxied version of the same client.\n *\n * Supports: OpenAI, Anthropic, Google Generative AI.\n */\n static wrap<T>(client: T, session?: SessionContext): T {\n const inst = ModelCost._requireInstance();\n const provider = createProviderForClient(\n client,\n inst.client,\n inst.config,\n inst.budgetManager,\n inst.costTracker,\n inst.piiScanner,\n inst.rateLimiter,\n session,\n );\n return provider.wrap(client) as T;\n }\n\n /**\n * Decorator factory for tracking costs on individual functions.\n *\n * @example\n * ```ts\n * const trackedFn = ModelCost.trackCost({ model: \"gpt-4o\" })(myFunction);\n * ```\n */\n static trackCost(\n options: TrackCostOptions,\n ): <TFn extends (...args: unknown[]) => unknown>(fn: TFn) => TFn {\n const inst = ModelCost._requireInstance();\n\n return <TFn extends (...args: unknown[]) => unknown>(fn: TFn): TFn => {\n const wrapped = async (...args: unknown[]): Promise<unknown> => {\n // Session pre-check\n if (options.session) {\n const estimatedCost = calculateCost(options.model, 500, 500);\n options.session.preCallCheck(estimatedCost);\n }\n\n const startTime = Date.now();\n const result = await fn(...args);\n const latencyMs = Date.now() - startTime;\n\n // Record with zero tokens (caller is responsible for real usage)\n inst.costTracker.record(\n {\n apiKey: inst.config.apiKey,\n timestamp: new Date().toISOString(),\n provider: (options.provider ?? \"openai\") as \"openai\",\n model: options.model,\n feature: options.feature,\n inputTokens: 0,\n outputTokens: 0,\n latencyMs,\n metadata: {},\n },\n inst.client,\n );\n\n // Session post-recording\n if (options.session) {\n options.session.recordCall({\n callType: \"llm\",\n inputTokens: 0,\n outputTokens: 0,\n costUsd: 0,\n });\n }\n\n return result;\n };\n\n return wrapped as unknown as TFn;\n };\n }\n\n /**\n * Check whether a request is allowed under current budget policies.\n */\n static async checkBudget(\n scope: string,\n id: string,\n ): Promise<BudgetCheckResponse> {\n const inst = ModelCost._requireInstance();\n return inst.budgetManager.check(inst.client, inst.config.orgId, `${scope}:${id}`, 0);\n }\n\n /**\n * Get usage/spend information for a scope and period.\n */\n static async getUsage(\n scope: string,\n _period: string,\n ): Promise<UsageReport> {\n const inst = ModelCost._requireInstance();\n const status = await inst.client.getBudgetStatus(\n scope === \"organization\" ? inst.config.orgId : scope,\n );\n return {\n totalSpendUsd: status.totalSpendUsd,\n totalBudgetUsd: status.totalBudgetUsd,\n policiesAtRisk: status.policiesAtRisk,\n policies: status.policies,\n };\n }\n\n /**\n * Start a new agent session with optional budget and iteration limits.\n * Registers the session with the server (fail-open if unavailable)\n * and returns a local SessionContext for tracking.\n */\n static async startSession(options: {\n feature?: string;\n maxSpendUsd?: number;\n maxIterations?: number;\n userId?: string;\n sessionId?: string;\n } = {}): Promise<SessionContext> {\n const inst = ModelCost._requireInstance();\n const sessionId = options.sessionId ?? crypto.randomUUID();\n\n let serverSessionId: string | undefined;\n try {\n const response = await inst.client.createSession({\n apiKey: inst.config.apiKey,\n sessionId,\n feature: options.feature,\n userId: options.userId,\n maxSpendUsd: options.maxSpendUsd,\n maxIterations: options.maxIterations,\n });\n serverSessionId = response.id;\n } catch {\n console.warn(\"[ModelCost] Failed to create server session (fail-open)\");\n }\n\n return new SessionContext({\n sessionId,\n serverSessionId,\n feature: options.feature,\n userId: options.userId,\n maxSpendUsd: options.maxSpendUsd,\n maxIterations: options.maxIterations,\n });\n }\n\n /**\n * Close an active session, recording final state on the server.\n */\n static async closeSession(\n session: SessionContext,\n reason = \"completed\",\n ): Promise<void> {\n const inst = ModelCost._requireInstance();\n session.close(reason);\n\n if (session.serverSessionId) {\n try {\n await inst.client.closeSession(session.serverSessionId, {\n apiKey: inst.config.apiKey,\n status: session.status,\n terminationReason: session.terminationReason,\n finalSpendUsd: session.currentSpendUsd,\n finalIterationCount: session.iterationCount,\n });\n } catch {\n console.warn(\"[ModelCost] Failed to close server session (fail-open)\");\n }\n }\n }\n\n /**\n * Scan text for PII using the local scanner.\n */\n static async scanPii(text: string): Promise<PiiResult> {\n const inst = ModelCost._requireInstance();\n return inst.piiScanner.scan(text);\n }\n\n /**\n * Flush all buffered tracking events to the API.\n */\n static async flush(): Promise<void> {\n const inst = ModelCost._requireInstance();\n await inst.costTracker.flush(inst.client);\n }\n\n /**\n * Gracefully shut down the SDK: flush remaining events, stop timers, close client.\n */\n static async shutdown(): Promise<void> {\n if (!ModelCost._instance) return;\n\n const inst = ModelCost._instance;\n inst.costTracker.stopAutoFlush();\n inst.costTracker.stopPricingSync();\n await inst.costTracker.flush(inst.client);\n inst.budgetManager.clear();\n inst.client.close();\n ModelCost._instance = null;\n }\n\n /**\n * Assert the SDK has been initialized and return the instance.\n */\n private static _requireInstance(): ModelCostInstance {\n if (!ModelCost._instance) {\n throw new ConfigurationError(\n \"ModelCost SDK is not initialized. Call ModelCost.init() first.\",\n );\n }\n return ModelCost._instance;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/models/common.ts","../src/config.ts","../src/version.ts","../src/errors.ts","../src/models/track.ts","../src/models/session.ts","../src/models/budget.ts","../src/models/governance.ts","../src/client.ts","../src/budget.ts","../src/tracking.ts","../src/pii.ts","../src/rate-limiter.ts","../src/providers/openai.ts","../src/providers/anthropic.ts","../src/providers/google.ts","../src/providers/index.ts","../src/session.ts","../src/index.ts"],"names":["z"],"mappings":";;;AAGO,IAAM,eAAe,CAAA,CAAE,IAAA,CAAK,CAAC,OAAA,EAAS,UAAA,EAAY,OAAO,CAAC,CAAA;AAI1D,IAAM,WAAA,GAAc,EAAE,IAAA,CAAK;AAAA,EAChC,cAAA;AAAA,EACA,SAAA;AAAA,EACA,aAAA;AAAA,EACA;AACF,CAAC,CAAA;AAIM,IAAM,YAAA,GAAe,EAAE,IAAA,CAAK,CAAC,SAAS,QAAA,EAAU,SAAA,EAAW,QAAQ,CAAC,CAAA;AAIpE,IAAM,QAAA,GAAW,EAAE,IAAA,CAAK;AAAA,EAC7B,QAAA;AAAA,EACA,WAAA;AAAA,EACA,QAAA;AAAA,EACA,aAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAC,CAAA;;;ACpBM,IAAM,0BAAA,GAA6BA,EAAE,MAAA,CAAO;AAAA,EACjD,MAAA,EAAQA,CAAAA,CACL,MAAA,EAAO,CACP,UAAA,CAAW,KAAA,EAAO,EAAE,OAAA,EAAS,+BAAA,EAAiC,CAAA,CAC9D,QAAA,CAAS,mBAAmB,CAAA;AAAA,EAC/B,KAAA,EAAOA,EAAE,MAAA,EAAO,CAAE,IAAI,CAAA,EAAG,EAAE,OAAA,EAAS,6BAAA,EAA+B,CAAA;AAAA,EACnE,WAAA,EAAaA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAQ,YAAY,CAAA;AAAA,EAC5C,SAASA,CAAAA,CAAE,MAAA,GAAS,GAAA,EAAI,CAAE,QAAQ,0BAA0B,CAAA;AAAA,EAC5D,eAAeA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,GAAW,QAAA,EAAS;AAAA,EAC9C,YAAA,EAAc,YAAA,CAAa,OAAA,CAAQ,OAAO,CAAA;AAAA,EAC1C,QAAA,EAAUA,CAAAA,CAAE,OAAA,EAAQ,CAAE,QAAQ,IAAI,CAAA;AAAA,EAClC,eAAA,EAAiBA,EAAE,MAAA,EAAO,CAAE,KAAI,CAAE,QAAA,EAAS,CAAE,OAAA,CAAQ,GAAI,CAAA;AAAA,EACzD,cAAA,EAAgBA,EAAE,MAAA,EAAO,CAAE,KAAI,CAAE,QAAA,EAAS,CAAE,OAAA,CAAQ,GAAG,CAAA;AAAA,EACvD,cAAA,EAAgBA,EAAE,MAAA,EAAO,CAAE,KAAI,CAAE,QAAA,EAAS,CAAE,OAAA,CAAQ,GAAK,CAAA;AAAA,EACzD,cAAA,EAAgBA,CAAAA,CAAE,OAAA,EAAQ,CAAE,QAAQ,KAAK;AAC3C,CAAC,CAAA;AAaM,IAAM,kBAAN,MAAsB;AAAA,EACX,MAAA;AAAA,EACA,KAAA;AAAA,EACA,WAAA;AAAA,EACA,OAAA;AAAA,EACA,aAAA;AAAA,EACA,YAAA;AAAA,EACA,QAAA;AAAA,EACA,eAAA;AAAA,EACA,cAAA;AAAA,EACA,cAAA;AAAA,EACA,cAAA;AAAA,EAEhB,YAAY,OAAA,EAA+B;AACzC,IAAA,MAAM,MAAA,GAAS;AAAA,MACb,MAAA,EAAQ,OAAA,CAAQ,MAAA,IAAU,OAAA,CAAQ,IAAI,mBAAmB,CAAA;AAAA,MACzD,KAAA,EAAO,OAAA,CAAQ,KAAA,IAAS,OAAA,CAAQ,IAAI,kBAAkB,CAAA;AAAA,MACtD,aACE,OAAA,CAAQ,WAAA,IAAe,OAAA,CAAQ,GAAA,CAAI,eAAe,CAAA,IAAK,YAAA;AAAA,MACzD,SACE,OAAA,CAAQ,OAAA,IACR,OAAA,CAAQ,GAAA,CAAI,oBAAoB,CAAA,IAChC,0BAAA;AAAA,MACF,eAAe,OAAA,CAAQ,aAAA;AAAA,MACvB,YAAA,EAAc,QAAQ,YAAA,IAAgB,OAAA;AAAA,MACtC,QAAA,EAAU,QAAQ,QAAA,IAAY,IAAA;AAAA,MAC9B,eAAA,EAAiB,QAAQ,eAAA,IAAmB,GAAA;AAAA,MAC5C,cAAA,EAAgB,QAAQ,cAAA,IAAkB,GAAA;AAAA,MAC1C,cAAA,EAAgB,QAAQ,cAAA,IAAkB,GAAA;AAAA,MAC1C,gBACE,OAAA,CAAQ,cAAA,KACP,QAAQ,GAAA,CAAI,2BAA2B,MAAM,MAAA,IAAU,KAAA;AAAA,KAC5D;AAEA,IAAA,MAAM,MAAA,GAAS,0BAAA,CAA2B,KAAA,CAAM,MAAM,CAAA;AAEtD,IAAA,IAAA,CAAK,SAAS,MAAA,CAAO,MAAA;AACrB,IAAA,IAAA,CAAK,QAAQ,MAAA,CAAO,KAAA;AACpB,IAAA,IAAA,CAAK,cAAc,MAAA,CAAO,WAAA;AAC1B,IAAA,IAAA,CAAK,UAAU,MAAA,CAAO,OAAA;AACtB,IAAA,IAAA,CAAK,gBAAgB,MAAA,CAAO,aAAA;AAC5B,IAAA,IAAA,CAAK,eAAe,MAAA,CAAO,YAAA;AAC3B,IAAA,IAAA,CAAK,WAAW,MAAA,CAAO,QAAA;AACvB,IAAA,IAAA,CAAK,kBAAkB,MAAA,CAAO,eAAA;AAC9B,IAAA,IAAA,CAAK,iBAAiB,MAAA,CAAO,cAAA;AAC7B,IAAA,IAAA,CAAK,iBAAiB,MAAA,CAAO,cAAA;AAC7B,IAAA,IAAA,CAAK,iBAAiB,MAAA,CAAO,cAAA;AAAA,EAC/B;AACF;;;ACnFO,IAAM,OAAA,GAAU;;;ACKhB,IAAM,cAAA,GAAN,cAA6B,KAAA,CAAM;AAAA,EACxC,YAAY,OAAA,EAAiB;AAC3B,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,gBAAA;AACZ,IAAA,MAAA,CAAO,cAAA,CAAe,IAAA,EAAM,GAAA,CAAA,MAAA,CAAW,SAAS,CAAA;AAAA,EAClD;AACF;AAKO,IAAM,kBAAA,GAAN,cAAiC,cAAA,CAAe;AAAA,EACrD,YAAY,OAAA,EAAiB;AAC3B,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,oBAAA;AAAA,EACd;AACF;AAKO,IAAM,mBAAA,GAAN,cAAkC,cAAA,CAAe;AAAA,EACtC,eAAA;AAAA,EACA,KAAA;AAAA,EACA,WAAA;AAAA,EAEhB,WAAA,CACE,OAAA,EACA,eAAA,EACA,KAAA,EACA,WAAA,EACA;AACA,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,qBAAA;AACZ,IAAA,IAAA,CAAK,eAAA,GAAkB,eAAA;AACvB,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,IAAA,IAAA,CAAK,WAAA,GAAc,WAAA;AAAA,EACrB;AACF;AAKO,IAAM,gBAAA,GAAN,cAA+B,cAAA,CAAe;AAAA,EACnC,iBAAA;AAAA,EACA,cAAA;AAAA,EAEhB,WAAA,CACE,OAAA,EACA,iBAAA,EACA,cAAA,EACA;AACA,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,kBAAA;AACZ,IAAA,IAAA,CAAK,iBAAA,GAAoB,iBAAA;AACzB,IAAA,IAAA,CAAK,cAAA,GAAiB,cAAA;AAAA,EACxB;AACF;AAKO,IAAM,gBAAA,GAAN,cAA+B,cAAA,CAAe;AAAA,EACnC,gBAAA;AAAA,EACA,YAAA;AAAA,EAEhB,WAAA,CACE,OAAA,EACA,gBAAA,EACA,YAAA,EACA;AACA,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,kBAAA;AACZ,IAAA,IAAA,CAAK,gBAAA,GAAmB,gBAAA;AACxB,IAAA,IAAA,CAAK,YAAA,GAAe,YAAA;AAAA,EACtB;AACF;AAKO,IAAM,0BAAA,GAAN,cAAyC,cAAA,CAAe;AAAA,EAC7C,SAAA;AAAA,EACA,YAAA;AAAA,EACA,QAAA;AAAA,EAEhB,WAAA,CACE,OAAA,EACA,SAAA,EACA,YAAA,EACA,QAAA,EACA;AACA,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,4BAAA;AACZ,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AACjB,IAAA,IAAA,CAAK,YAAA,GAAe,YAAA;AACpB,IAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAAA,EAClB;AACF;AAKO,IAAM,kCAAA,GAAN,cAAiD,cAAA,CAAe;AAAA,EACrD,SAAA;AAAA,EACA,iBAAA;AAAA,EACA,aAAA;AAAA,EAEhB,WAAA,CACE,OAAA,EACA,SAAA,EACA,iBAAA,EACA,aAAA,EACA;AACA,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,oCAAA;AACZ,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AACjB,IAAA,IAAA,CAAK,iBAAA,GAAoB,iBAAA;AACzB,IAAA,IAAA,CAAK,aAAA,GAAgB,aAAA;AAAA,EACvB;AACF;AAKO,IAAM,iBAAA,GAAN,cAAgC,cAAA,CAAe;AAAA,EACpC,UAAA;AAAA,EACA,SAAA;AAAA,EAEhB,WAAA,CAAY,OAAA,EAAiB,UAAA,EAAoB,SAAA,EAAmB;AAClE,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,mBAAA;AACZ,IAAA,IAAA,CAAK,UAAA,GAAa,UAAA;AAClB,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AAAA,EACnB;AACF;ACrIkCA,EAAE,MAAA,CAAO;AAAA,EACzC,MAAA,EAAQA,CAAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,EACxB,SAAA,EAAWA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC/B,QAAA,EAAU,QAAA;AAAA,EACV,KAAA,EAAOA,CAAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,EACvB,OAAA,EAASA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC7B,UAAA,EAAYA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAChC,aAAaA,CAAAA,CAAE,MAAA,GAAS,GAAA,EAAI,CAAE,IAAI,CAAC,CAAA;AAAA,EACnC,cAAcA,CAAAA,CAAE,MAAA,GAAS,GAAA,EAAI,CAAE,IAAI,CAAC,CAAA;AAAA,EACpC,WAAWA,CAAAA,CAAE,MAAA,EAAO,CAAE,GAAA,GAAM,QAAA,EAAS;AAAA,EACrC,UAAUA,CAAAA,CAAE,MAAA,CAAOA,EAAE,OAAA,EAAS,EAAE,QAAA;AAClC,CAAC;AAOM,SAAS,kBAAkB,OAAA,EAAgD;AAChF,EAAA,OAAO;AAAA,IACL,SAAS,OAAA,CAAQ,MAAA;AAAA,IACjB,WAAW,OAAA,CAAQ,SAAA;AAAA,IACnB,UAAU,OAAA,CAAQ,QAAA;AAAA,IAClB,OAAO,OAAA,CAAQ,KAAA;AAAA,IACf,OAAA,EAAS,QAAQ,OAAA,IAAW,IAAA;AAAA,IAC5B,WAAA,EAAa,QAAQ,UAAA,IAAc,IAAA;AAAA,IACnC,cAAc,OAAA,CAAQ,WAAA;AAAA,IACtB,eAAe,OAAA,CAAQ,YAAA;AAAA,IACvB,UAAA,EAAY,QAAQ,SAAA,IAAa,IAAA;AAAA,IACjC,QAAA,EAAU,QAAQ,QAAA,IAAY;AAAA,GAChC;AACF;AAGO,IAAM,mBAAA,GAAsBA,EAAE,MAAA,CAAO;AAAA,EAC1C,MAAA,EAAQA,CAAAA,CAAE,OAAA,CAAQ,IAAI;AACxB,CAAC,CAAA;ACEM,IAAM,2BAAA,GAA8BA,EACxC,MAAA,CAAO;AAAA,EACN,EAAA,EAAIA,EAAE,MAAA,EAAO;AAAA,EACb,UAAA,EAAYA,EAAE,MAAA,EAAO;AAAA,EACrB,MAAA,EAAQA,EAAE,MAAA,EAAO;AAAA,EACjB,eAAeA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,GAAW,QAAA,EAAS;AAAA,EAC9C,gBAAgBA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,GAAW,QAAA;AACxC,CAAC,CAAA,CACA,SAAA,CAAU,CAAC,GAAA,MAAS;AAAA,EACnB,IAAI,GAAA,CAAI,EAAA;AAAA,EACR,WAAW,GAAA,CAAI,UAAA;AAAA,EACf,QAAQ,GAAA,CAAI,MAAA;AAAA,EACZ,WAAA,EAAa,IAAI,aAAA,IAAiB,MAAA;AAAA,EAClC,aAAA,EAAe,IAAI,cAAA,IAAkB;AACvC,CAAA,CAAE,CAAA;AAIG,SAAS,0BACd,GAAA,EACyB;AACzB,EAAA,OAAO;AAAA,IACL,SAAS,GAAA,CAAI,MAAA;AAAA,IACb,YAAY,GAAA,CAAI,SAAA;AAAA,IAChB,SAAS,GAAA,CAAI,OAAA;AAAA,IACb,SAAS,GAAA,CAAI,MAAA;AAAA,IACb,eAAe,GAAA,CAAI,WAAA;AAAA,IACnB,gBAAgB,GAAA,CAAI;AAAA,GACtB;AACF;AAEO,SAAS,8BACd,GAAA,EACyB;AACzB,EAAA,OAAO;AAAA,IACL,SAAS,GAAA,CAAI,MAAA;AAAA,IACb,eAAe,GAAA,CAAI,YAAA;AAAA,IACnB,WAAW,GAAA,CAAI,QAAA;AAAA,IACf,WAAW,GAAA,CAAI,QAAA;AAAA,IACf,cAAc,GAAA,CAAI,WAAA;AAAA,IAClB,eAAe,GAAA,CAAI,YAAA;AAAA,IACnB,yBAAyB,GAAA,CAAI,qBAAA;AAAA,IAC7B,UAAU,GAAA,CAAI,OAAA;AAAA,IACd,qBAAqB,GAAA,CAAI,iBAAA;AAAA,IACzB,cAAc,GAAA,CAAI;AAAA,GACpB;AACF;AAEO,SAAS,yBACd,GAAA,EACyB;AACzB,EAAA,OAAO;AAAA,IACL,SAAS,GAAA,CAAI,MAAA;AAAA,IACb,QAAQ,GAAA,CAAI,MAAA;AAAA,IACZ,oBAAoB,GAAA,CAAI,iBAAA;AAAA,IACxB,iBAAiB,GAAA,CAAI,aAAA;AAAA,IACrB,uBAAuB,GAAA,CAAI;AAAA,GAC7B;AACF;ACjGO,IAAM,yBAAA,GAA4BA,EACtC,MAAA,CAAO;AAAA,EACN,OAAA,EAASA,EAAE,OAAA,EAAQ;AAAA,EACnB,MAAA,EAAQA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC5B,mBAAA,EAAqBA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EACzC,MAAA,EAAQA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AACrB,CAAC,CAAA,CACA,SAAA,CAAU,CAAC,IAAA,MAAU;AAAA,EACpB,SAAS,IAAA,CAAK,OAAA;AAAA,EACd,QAAQ,IAAA,CAAK,MAAA;AAAA,EACb,oBAAoB,IAAA,CAAK,mBAAA;AAAA,EACzB,QAAQ,IAAA,CAAK;AACf,CAAA,CAAE,CAAA;AAOG,IAAM,kBAAA,GAAqBA,EAC/B,MAAA,CAAO;AAAA,EACN,EAAA,EAAIA,EAAE,MAAA,EAAO;AAAA,EACb,IAAA,EAAMA,EAAE,MAAA,EAAO;AAAA,EACf,KAAA,EAAO,WAAA;AAAA,EACP,gBAAA,EAAkBA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EACtC,iBAAA,EAAmBA,EAAE,MAAA,EAAO;AAAA,EAC5B,MAAA,EAAQ,YAAA;AAAA,EACR,oBAAoBA,CAAAA,CAAE,MAAA,EAAO,CAAE,GAAA,GAAM,QAAA,EAAS;AAAA,EAC9C,MAAA,EAAQ,YAAA;AAAA,EACR,mBAAA,EAAqBA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EACzC,gBAAA,EAAkBA,EAAE,KAAA,CAAMA,CAAAA,CAAE,QAAO,CAAE,GAAA,EAAK,CAAA,CAAE,QAAA,EAAS;AAAA,EACrD,iBAAA,EAAmBA,EAAE,MAAA,EAAO;AAAA,EAC5B,gBAAA,EAAkBA,EAAE,MAAA,EAAO;AAAA,EAC3B,YAAA,EAAcA,EAAE,MAAA,EAAO;AAAA,EACvB,SAAA,EAAWA,EAAE,OAAA,EAAQ;AAAA,EACrB,UAAA,EAAYA,EAAE,MAAA,EAAO;AAAA,EACrB,UAAA,EAAYA,EAAE,MAAA;AAChB,CAAC,CAAA,CACA,SAAA,CAAU,CAAC,IAAA,MAAU;AAAA,EACpB,IAAI,IAAA,CAAK,EAAA;AAAA,EACT,MAAM,IAAA,CAAK,IAAA;AAAA,EACX,OAAO,IAAA,CAAK,KAAA;AAAA,EACZ,iBAAiB,IAAA,CAAK,gBAAA;AAAA,EACtB,iBAAiB,IAAA,CAAK,iBAAA;AAAA,EACtB,QAAQ,IAAA,CAAK,MAAA;AAAA,EACb,kBAAkB,IAAA,CAAK,kBAAA;AAAA,EACvB,QAAQ,IAAA,CAAK,MAAA;AAAA,EACb,oBAAoB,IAAA,CAAK,mBAAA;AAAA,EACzB,iBAAiB,IAAA,CAAK,gBAAA;AAAA,EACtB,iBAAiB,IAAA,CAAK,iBAAA;AAAA,EACtB,iBAAiB,IAAA,CAAK,gBAAA;AAAA,EACtB,aAAa,IAAA,CAAK,YAAA;AAAA,EAClB,UAAU,IAAA,CAAK,SAAA;AAAA,EACf,WAAW,IAAA,CAAK,UAAA;AAAA,EAChB,WAAW,IAAA,CAAK;AAClB,CAAA,CAAE,CAAA;AAOG,IAAM,0BAAA,GAA6BA,EACvC,MAAA,CAAO;AAAA,EACN,QAAA,EAAUA,CAAAA,CAAE,KAAA,CAAM,kBAAkB,CAAA;AAAA,EACpC,gBAAA,EAAkBA,EAAE,MAAA,EAAO;AAAA,EAC3B,eAAA,EAAiBA,EAAE,MAAA,EAAO;AAAA,EAC1B,gBAAA,EAAkBA,CAAAA,CAAE,MAAA,EAAO,CAAE,GAAA;AAC/B,CAAC,CAAA,CACA,SAAA,CAAU,CAAC,IAAA,MAAU;AAAA,EACpB,UAAU,IAAA,CAAK,QAAA;AAAA,EACf,gBAAgB,IAAA,CAAK,gBAAA;AAAA,EACrB,eAAe,IAAA,CAAK,eAAA;AAAA,EACpB,gBAAgB,IAAA,CAAK;AACvB,CAAA,CAAE,CAAA;AC3EuCA,EAAE,MAAA,CAAO;AAAA,EAClD,KAAA,EAAOA,CAAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,EACvB,IAAA,EAAMA,CAAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,EACtB,OAAA,EAASA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC7B,WAAA,EAAaA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AAC1B,CAAC;AAOM,SAAS,2BACd,OAAA,EACyB;AACzB,EAAA,OAAO;AAAA,IACL,QAAQ,OAAA,CAAQ,KAAA;AAAA,IAChB,MAAM,OAAA,CAAQ,IAAA;AAAA,IACd,OAAA,EAAS,QAAQ,OAAA,IAAW,IAAA;AAAA,IAC5B,WAAA,EAAa,QAAQ,WAAA,IAAe;AAAA,GACtC;AACF;AAKO,IAAM,uBAAA,GAA0BA,EAAE,MAAA,CAAO;AAAA,EAC9C,IAAA,EAAMA,EAAE,MAAA,EAAO;AAAA,EACf,OAAA,EAASA,EAAE,MAAA,EAAO;AAAA,EAClB,UAAUA,CAAAA,CAAE,IAAA,CAAK,CAAC,KAAA,EAAO,QAAA,EAAU,MAAM,CAAC,CAAA;AAAA,EAC1C,KAAA,EAAOA,CAAAA,CAAE,MAAA,EAAO,CAAE,GAAA,EAAI;AAAA,EACtB,GAAA,EAAKA,CAAAA,CAAE,MAAA,EAAO,CAAE,GAAA;AAClB,CAAC,CAAA;AAOM,IAAM,4BAAA,GAA+BA,EACzC,MAAA,CAAO;AAAA,EACN,UAAA,EAAYA,EAAE,OAAA,EAAQ;AAAA,EACtB,MAAA,EAAQA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC5B,UAAA,EAAYA,CAAAA,CAAE,KAAA,CAAM,uBAAuB,CAAA;AAAA,EAC3C,aAAA,EAAeA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AAC5B,CAAC,CAAA,CACA,SAAA,CAAU,CAAC,IAAA,MAAU;AAAA,EACpB,WAAW,IAAA,CAAK,UAAA;AAAA,EAChB,QAAQ,IAAA,CAAK,MAAA;AAAA,EACb,YAAY,IAAA,CAAK,UAAA;AAAA,EACjB,cAAc,IAAA,CAAK;AACrB,CAAA,CAAE,CAAA;AA4BG,SAAS,6BACd,OAAA,EACyB;AACzB,EAAA,OAAO;AAAA,IACL,iBAAiB,OAAA,CAAQ,cAAA;AAAA,IACzB,gBAAgB,OAAA,CAAQ,aAAA;AAAA,IACxB,iBAAA,EAAmB,QAAQ,gBAAA,IAAoB,IAAA;AAAA,IAC/C,UAAU,OAAA,CAAQ,QAAA;AAAA,IAClB,OAAA,EAAS,QAAQ,MAAA,IAAU,IAAA;AAAA,IAC3B,OAAA,EAAS,QAAQ,OAAA,IAAW,IAAA;AAAA,IAC5B,WAAA,EAAa,QAAQ,WAAA,IAAe,IAAA;AAAA,IACpC,cAAc,OAAA,CAAQ,WAAA;AAAA,IACtB,aAAa,OAAA,CAAQ,UAAA;AAAA,IACrB,WAAA,EAAa,QAAQ,UAAA,IAAc,IAAA;AAAA,IACnC,QAAQ,OAAA,CAAQ,MAAA;AAAA,IAChB,eAAA,EAAiB,QAAQ,cAAA,IAAkB;AAAA,GAC7C;AACF;;;ACnEA,IAAM,yBAAA,GAA4B,CAAA;AAClC,IAAM,2BAAA,GAA8B,GAAA;AAM7B,IAAM,kBAAN,MAAsB;AAAA,EACV,QAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA;AAAA,EAGT,oBAAA,GAAuB,CAAA;AAAA,EACvB,iBAAA,GAAoB,CAAA;AAAA,EAE5B,YAAY,MAAA,EAAyB;AACnC,IAAA,IAAA,CAAK,QAAA,GAAW,MAAA,CAAO,OAAA,CAAQ,OAAA,CAAQ,QAAQ,EAAE,CAAA;AACjD,IAAA,IAAA,CAAK,UAAU,MAAA,CAAO,MAAA;AACtB,IAAA,IAAA,CAAK,YAAY,MAAA,CAAO,QAAA;AACxB,IAAA,IAAA,CAAK,QAAA,GAAW;AAAA,MACd,cAAA,EAAgB,kBAAA;AAAA,MAChB,aAAa,IAAA,CAAK,OAAA;AAAA,MAClB,YAAA,EAAc,kBAAkB,OAAO,CAAA;AAAA,KACzC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,MAAM,OAAA,EAA+C;AACzD,IAAA,MAAM,IAAA,GAAO,kBAAkB,OAAO,CAAA;AACtC,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,KAAA,CAAM,iBAAiB,IAAI,CAAA;AACnD,IAAA,OAAO,mBAAA,CAAoB,MAAM,IAAI,CAAA;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAA,CACJ,KAAA,EACA,OAAA,EACA,aAAA,EAC8B;AAC9B,IAAA,MAAM,MAAA,GAAS,IAAI,eAAA,CAAgB;AAAA,MACjC,MAAA,EAAQ,KAAA;AAAA,MACR,OAAA;AAAA,MACA,cAAA,EAAgB,cAAc,QAAA;AAAS,KACxC,CAAA;AACD,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,KAAA,CAAM,CAAA,sBAAA,EAAyB,OAAO,QAAA,EAAU,CAAA,CAAA,EAAI,EAAE,CAAA;AAC9E,IAAA,OAAO,yBAAA,CAA0B,MAAM,IAAI,CAAA;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SACJ,OAAA,EACiC;AACjC,IAAA,MAAM,IAAA,GAAO,2BAA2B,OAAO,CAAA;AAC/C,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,KAAA,CAAM,2BAA2B,IAAI,CAAA;AAC7D,IAAA,OAAO,4BAAA,CAA6B,MAAM,IAAI,CAAA;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,aAAa,OAAA,EAAiD;AAClE,IAAA,MAAM,IAAA,GAAO,6BAA6B,OAAO,CAAA;AACjD,IAAA,MAAM,IAAA,CAAK,KAAA,CAAM,4BAAA,EAA8B,IAAI,CAAA;AAAA,EACrD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBAAgB,KAAA,EAA8C;AAClE,IAAA,MAAM,SAAS,IAAI,eAAA,CAAgB,EAAE,MAAA,EAAQ,OAAO,CAAA;AACpD,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,IAAA,CAAK,0BAA0B,MAAA,CAAO,QAAA,EAAU,CAAA,CAAE,CAAA;AAC1E,IAAA,OAAO,0BAAA,CAA2B,MAAM,IAAI,CAAA;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cACJ,OAAA,EACgC;AAChC,IAAA,MAAM,IAAA,GAAO,0BAA0B,OAAO,CAAA;AAC9C,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,KAAA,CAAM,oBAAoB,IAAI,CAAA;AACtD,IAAA,OAAO,2BAAA,CAA4B,MAAM,IAAI,CAAA;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,iBAAA,CACJ,SAAA,EACA,OAAA,EACe;AACf,IAAA,MAAM,IAAA,GAAO,8BAA8B,OAAO,CAAA;AAClD,IAAA,MAAM,IAAA,CAAK,KAAA,CAAM,CAAA,iBAAA,EAAoB,SAAS,UAAU,IAAI,CAAA;AAAA,EAC9D;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAA,CACJ,SAAA,EACA,OAAA,EACe;AACf,IAAA,MAAM,IAAA,GAAO,yBAAyB,OAAO,CAAA;AAC7C,IAAA,MAAM,IAAA,CAAK,KAAA,CAAM,CAAA,iBAAA,EAAoB,SAAS,UAAU,IAAI,CAAA;AAAA,EAC9D;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,oBAAA,GAAuB,CAAA;AAC5B,IAAA,IAAA,CAAK,iBAAA,GAAoB,CAAA;AAAA,EAC3B;AAAA;AAAA,EAIQ,cAAA,GAA0B;AAChC,IAAA,IAAI,IAAA,CAAK,uBAAuB,yBAAA,EAA2B;AACzD,MAAA,OAAO,KAAA;AAAA,IACT;AACA,IAAA,IAAI,IAAA,CAAK,GAAA,EAAI,IAAK,IAAA,CAAK,iBAAA,EAAmB;AAExC,MAAA,IAAA,CAAK,oBAAA,GAAuB,CAAA;AAC5B,MAAA,OAAO,KAAA;AAAA,IACT;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEQ,cAAA,GAAuB;AAC7B,IAAA,IAAA,CAAK,oBAAA,GAAuB,CAAA;AAAA,EAC9B;AAAA,EAEQ,cAAA,GAAuB;AAC7B,IAAA,IAAA,CAAK,oBAAA,EAAA;AACL,IAAA,IAAI,IAAA,CAAK,wBAAwB,yBAAA,EAA2B;AAC1D,MAAA,IAAA,CAAK,iBAAA,GAAoB,IAAA,CAAK,GAAA,EAAI,GAAI,2BAAA;AAAA,IACxC;AAAA,EACF;AAAA,EAEA,MAAc,KAAA,CACZ,IAAA,EACA,IAAA,EACkB;AAClB,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,MAAA,EAAQ,IAAA,EAAM,IAAI,CAAA;AAAA,EACzC;AAAA,EAEA,MAAc,KAAK,IAAA,EAAgC;AACjD,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,KAAA,EAAO,IAAI,CAAA;AAAA,EAClC;AAAA,EAEA,MAAc,QAAA,CACZ,MAAA,EACA,IAAA,EACA,IAAA,EACkB;AAClB,IAAA,IAAI,IAAA,CAAK,gBAAe,EAAG;AACzB,MAAA,IAAI,KAAK,SAAA,EAAW;AAClB,QAAA,OAAA,CAAQ,IAAA;AAAA,UACN,CAAA,iDAAA,EAA+C,MAAM,CAAA,CAAA,EAAI,IAAI,CAAA;AAAA,SAC/D;AACA,QAAA,OAAO,IAAA,CAAK,iBAAiB,IAAI,CAAA;AAAA,MACnC;AACA,MAAA,MAAM,IAAI,cAAA;AAAA,QACR,iCAAiC,yBAAyB,CAAA,qBAAA;AAAA,OAC5D;AAAA,IACF;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,CAAA,EAAG,IAAA,CAAK,QAAQ,GAAG,IAAI,CAAA,CAAA;AACnC,MAAA,MAAM,IAAA,GAAoB;AAAA,QACxB,MAAA;AAAA,QACA,SAAS,IAAA,CAAK;AAAA,OAChB;AACA,MAAA,IAAI,IAAA,KAAS,KAAA,CAAA,IAAa,MAAA,KAAW,KAAA,EAAO;AAC1C,QAAA,IAAA,CAAK,IAAA,GAAO,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA;AAAA,MACjC;AAEA,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,EAAK,IAAI,CAAA;AAEtC,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,MAAM,YAAa,MAAM,QAAA,CAAS,IAAA,EAAK,CAAE,MAAM,OAAO;AAAA,UACpD,KAAA,EAAO,SAAA;AAAA,UACP,SAAS,QAAA,CAAS;AAAA,SACpB,CAAE,CAAA;AACF,QAAA,IAAA,CAAK,cAAA,EAAe;AAEpB,QAAA,MAAM,MAAM,IAAI,iBAAA;AAAA,UACd,SAAA,CAAU,OAAA,IAAW,CAAA,KAAA,EAAQ,QAAA,CAAS,MAAM,CAAA,CAAA;AAAA,UAC5C,QAAA,CAAS,MAAA;AAAA,UACT,UAAU,KAAA,IAAS;AAAA,SACrB;AAEA,QAAA,IAAI,KAAK,SAAA,EAAW;AAClB,UAAA,OAAA,CAAQ,IAAA;AAAA,YACN,CAAA,mCAAA,EAAsC,IAAI,OAAO,CAAA;AAAA,WACnD;AACA,UAAA,OAAO,IAAA,CAAK,iBAAiB,IAAI,CAAA;AAAA,QACnC;AACA,QAAA,MAAM,GAAA;AAAA,MACR;AAEA,MAAA,MAAM,IAAA,GAAgB,MAAM,QAAA,CAAS,IAAA,EAAK;AAC1C,MAAA,IAAA,CAAK,cAAA,EAAe;AACpB,MAAA,OAAO,IAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,IAAI,iBAAiB,iBAAA,EAAmB;AACtC,QAAA,MAAM,KAAA;AAAA,MACR;AAEA,MAAA,IAAA,CAAK,cAAA,EAAe;AAEpB,MAAA,IAAI,KAAK,SAAA,EAAW;AAClB,QAAA,OAAA,CAAQ,IAAA;AAAA,UACN,2CACE,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CACvD,CAAA;AAAA,SACF;AACA,QAAA,OAAO,IAAA,CAAK,iBAAiB,IAAI,CAAA;AAAA,MACnC;AAEA,MAAA,MAAM,IAAI,cAAA;AAAA,QACR,CAAA,WAAA,EAAc,IAAI,CAAA,SAAA,EAChB,KAAA,YAAiB,QAAQ,KAAA,CAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CACvD,CAAA;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,iBAAiB,IAAA,EAAuB;AAC9C,IAAA,IAAI,IAAA,CAAK,QAAA,CAAS,gBAAgB,CAAA,EAAG;AACnC,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,IAAA;AAAA,QACT,MAAA,EAAQ,IAAA;AAAA,QACR,mBAAA,EAAqB,IAAA;AAAA,QACrB,MAAA,EAAQ;AAAA,OACV;AAAA,IACF;AACA,IAAA,IAAI,IAAA,CAAK,QAAA,CAAS,iBAAiB,CAAA,EAAG;AACpC,MAAA,OAAO;AAAA,QACL,UAAU,EAAC;AAAA,QACX,gBAAA,EAAkB,CAAA;AAAA,QAClB,eAAA,EAAiB,CAAA;AAAA,QACjB,gBAAA,EAAkB;AAAA,OACpB;AAAA,IACF;AACA,IAAA,IAAI,IAAA,CAAK,QAAA,CAAS,kBAAkB,CAAA,EAAG;AACrC,MAAA,OAAO;AAAA,QACL,UAAA,EAAY,IAAA;AAAA,QACZ,MAAA,EAAQ,IAAA;AAAA,QACR,YAAY,EAAC;AAAA,QACb,aAAA,EAAe;AAAA,OACjB;AAAA,IACF;AACA,IAAA,IAAI,IAAA,CAAK,QAAA,CAAS,WAAW,CAAA,EAAG;AAC9B,MAAA,OAAO,EAAE,EAAA,EAAI,WAAA,EAAa,UAAA,EAAY,WAAA,EAAa,QAAQ,QAAA,EAAS;AAAA,IACtE;AAEA,IAAA,OAAO,EAAE,QAAQ,IAAA,EAAK;AAAA,EACxB;AACF;;;ACvSO,IAAM,gBAAN,MAAoB;AAAA,EACjB,MAAA,uBAAgD,GAAA,EAAI;AAAA,EACpD,SAAA,GAAoB,CAAA;AAAA,EACX,eAAA;AAAA,EAEjB,YAAY,cAAA,EAAwB;AAClC,IAAA,IAAA,CAAK,eAAA,GAAkB,cAAA;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,KAAA,CACJ,MAAA,EACA,KAAA,EACA,SACA,aAAA,EAC8B;AAC9B,IAAA,IAAI,IAAA,CAAK,UAAS,EAAG;AACnB,MAAA,MAAM,IAAA,CAAK,IAAA,CAAK,MAAA,EAAQ,KAAK,CAAA;AAAA,IAC/B;AAGA,IAAA,OAAO,MAAA,CAAO,WAAA,CAAY,KAAA,EAAO,OAAA,EAAS,aAAa,CAAA;AAAA,EACzD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,IAAA,CAAK,MAAA,EAAyB,KAAA,EAA8B;AAChE,IAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,eAAA,CAAgB,KAAK,CAAA;AACjD,IAAA,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,KAAA,EAAO,MAAM,CAAA;AAC7B,IAAA,IAAA,CAAK,SAAA,GAAY,KAAK,GAAA,EAAI;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,gBAAA,CAAiB,KAAA,EAAe,QAAA,EAAkB,IAAA,EAAoB;AACpE,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,KAAK,CAAA;AACpC,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,OAAA,GAAgC;AAAA,MACpC,GAAG,MAAA;AAAA,MACH,aAAA,EAAe,OAAO,aAAA,GAAgB,IAAA;AAAA,MACtC,QAAA,EAAU,MAAA,CAAO,QAAA,CAAS,GAAA,CAAI,CAAC,MAAA,MAAY;AAAA,QACzC,GAAG,MAAA;AAAA,QACH,eAAA,EAAiB,OAAO,eAAA,GAAkB,IAAA;AAAA,QAC1C,eAAA,EACE,MAAA,CAAO,eAAA,GAAkB,CAAA,GAAA,CACnB,MAAA,CAAO,kBAAkB,IAAA,IAAQ,MAAA,CAAO,eAAA,GAAmB,GAAA,GAC7D,MAAA,CAAO;AAAA,OACf,CAAE;AAAA,KACJ;AAEA,IAAA,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,KAAA,EAAO,OAAO,CAAA;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU,KAAA,EAAiD;AACzD,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,KAAK,CAAA;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,OAAO,KAAA,EAAM;AAClB,IAAA,IAAA,CAAK,SAAA,GAAY,CAAA;AAAA,EACnB;AAAA,EAEQ,QAAA,GAAoB;AAC1B,IAAA,OAAO,IAAA,CAAK,GAAA,EAAI,GAAI,IAAA,CAAK,YAAY,IAAA,CAAK,eAAA;AAAA,EAC5C;AACF;;;ACpFA,IAAM,aAAA,uBAA+C,GAAA,EAAI;AAMlD,IAAM,aAAA,GAAmD;AAMhE,eAAsB,kBAAA,CACpB,SACA,MAAA,EACe;AACf,EAAA,IAAI;AACF,IAAA,MAAM,MAAM,CAAA,EAAG,OAAA,CAAQ,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAC,CAAA,sBAAA,CAAA;AAC1C,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,EAAK;AAAA,MAChC,OAAA,EAAS,EAAE,WAAA,EAAa,MAAA;AAAO,KAChC,CAAA;AACD,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA;AAAA,IACF;AACA,IAAA,MAAM,IAAA,GAAQ,MAAM,QAAA,CAAS,IAAA,EAAK;AAQlC,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,IAAU,EAAC;AAC/B,IAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACvB,MAAA;AAAA,IACF;AACA,IAAA,aAAA,CAAc,KAAA,EAAM;AACpB,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,MAAA,aAAA,CAAc,GAAA,CAAI,MAAM,KAAA,EAAO;AAAA,QAC7B,UAAU,KAAA,CAAM,QAAA;AAAA,QAChB,OAAO,KAAA,CAAM,KAAA;AAAA,QACb,gBAAgB,KAAA,CAAM,iBAAA;AAAA,QACtB,iBAAiB,KAAA,CAAM;AAAA,OACxB,CAAA;AAAA,IACH;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAER;AACF;AAMO,SAAS,aAAA,CACd,KAAA,EACA,WAAA,EACA,YAAA,EACQ;AACR,EAAA,MAAM,OAAA,GAAU,aAAA,CAAc,GAAA,CAAI,KAAK,CAAA;AACvC,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,OAAO,CAAA;AAAA,EACT;AAEA,EAAA,MAAM,SAAA,GAAa,WAAA,GAAc,GAAA,GAAQ,OAAA,CAAQ,cAAA;AACjD,EAAA,MAAM,UAAA,GAAc,YAAA,GAAe,GAAA,GAAQ,OAAA,CAAQ,eAAA;AACnD,EAAA,OAAO,SAAA,GAAY,UAAA;AACrB;AAKO,IAAM,WAAA,GAAN,MAAM,YAAA,CAAY;AAAA,EACf,UAA0B,EAAC;AAAA,EAC3B,WAAA,GAAqD,IAAA;AAAA,EACrD,iBAAA,GAA2D,IAAA;AAAA,EAClD,UAAA;AAAA,EAEjB,YAAY,SAAA,EAAmB;AAC7B,IAAA,IAAA,CAAK,UAAA,GAAa,SAAA;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAA,CAAO,SAAuB,MAAA,EAAgC;AAC5D,IAAA,IAAA,CAAK,OAAA,CAAQ,KAAK,OAAO,CAAA;AACzB,IAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,MAAA,IAAU,IAAA,CAAK,cAAc,MAAA,EAAQ;AACpD,MAAA,KAAK,IAAA,CAAK,MAAM,MAAM,CAAA;AAAA,IACxB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,MAAM,MAAA,EAAwC;AAClD,IAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG;AAC7B,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,QAAQ,IAAA,CAAK,OAAA,CAAQ,OAAO,CAAA,EAAG,IAAA,CAAK,QAAQ,MAAM,CAAA;AAExD,IAAA,MAAM,WAAW,KAAA,CAAM,GAAA;AAAA,MAAI,CAAC,YAC1B,MAAA,CAAO,KAAA,CAAM,OAAO,CAAA,CAAE,KAAA,CAAM,CAAC,KAAA,KAAmB;AAC9C,QAAA,OAAA,CAAQ,IAAA;AAAA,UACN,wCACE,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CACvD,CAAA;AAAA,SACF;AAAA,MACF,CAAC;AAAA,KACH;AAEA,IAAA,MAAM,OAAA,CAAQ,WAAW,QAAQ,CAAA;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA,EAKA,cAAA,CAAe,QAAyB,UAAA,EAA0B;AAChE,IAAA,IAAA,CAAK,aAAA,EAAc;AACnB,IAAA,IAAA,CAAK,WAAA,GAAc,YAAY,MAAM;AACnC,MAAA,KAAK,IAAA,CAAK,MAAM,MAAM,CAAA;AAAA,IACxB,GAAG,UAAU,CAAA;AAGb,IAAA,IAAI,IAAA,CAAK,eAAe,OAAO,IAAA,CAAK,gBAAgB,QAAA,IAAY,OAAA,IAAW,KAAK,WAAA,EAAa;AAC3F,MAAA,IAAA,CAAK,YAAY,KAAA,EAAM;AAAA,IACzB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,aAAA,GAAsB;AACpB,IAAA,IAAI,IAAA,CAAK,gBAAgB,IAAA,EAAM;AAC7B,MAAA,aAAA,CAAc,KAAK,WAAW,CAAA;AAC9B,MAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AAAA,IACrB;AAAA,EACF;AAAA,EAEA,OAAwB,yBAAA,GAA4B,GAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAKpD,gBAAA,CAAiB,SAAiB,MAAA,EAAsB;AACtD,IAAA,IAAA,CAAK,eAAA,EAAgB;AACrB,IAAA,IAAA,CAAK,iBAAA,GAAoB,YAAY,MAAM;AACzC,MAAA,KAAK,kBAAA,CAAmB,SAAS,MAAM,CAAA;AAAA,IACzC,CAAA,EAAG,aAAY,yBAAyB,CAAA;AAExC,IAAA,IAAI,IAAA,CAAK,qBAAqB,OAAO,IAAA,CAAK,sBAAsB,QAAA,IAAY,OAAA,IAAW,KAAK,iBAAA,EAAmB;AAC7G,MAAA,IAAA,CAAK,kBAAkB,KAAA,EAAM;AAAA,IAC/B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,eAAA,GAAwB;AACtB,IAAA,IAAI,IAAA,CAAK,sBAAsB,IAAA,EAAM;AACnC,MAAA,aAAA,CAAc,KAAK,iBAAiB,CAAA;AACpC,MAAA,IAAA,CAAK,iBAAA,GAAoB,IAAA;AAAA,IAC3B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,UAAA,GAAqB;AACvB,IAAA,OAAO,KAAK,OAAA,CAAQ,MAAA;AAAA,EACtB;AACF;;;AC/IA,IAAM,YAAA,GAAiE;AAAA,EACrE;AAAA,IACE,IAAA,EAAM,KAAA;AAAA,IACN,OAAA,EAAS;AAAA,GACX;AAAA,EACA;AAAA,IACE,IAAA,EAAM,kBAAA;AAAA,IACN,OAAA,EAAS;AAAA,GACX;AAAA,EACA;AAAA,IACE,IAAA,EAAM,wBAAA;AAAA,IACN,OAAA,EAAS;AAAA,GACX;AAAA,EACA;AAAA,IACE,IAAA,EAAM,kBAAA;AAAA,IACN,OAAA,EAAS;AAAA,GACX;AAAA,EACA;AAAA,IACE,IAAA,EAAM,sBAAA;AAAA,IACN,OAAA,EAAS;AAAA,GACX;AAAA,EACA;AAAA,IACE,IAAA,EAAM,OAAA;AAAA,IACN,OAAA,EAAS;AAAA,GACX;AAAA,EACA;AAAA,IACE,IAAA,EAAM,UAAA;AAAA,IACN,OAAA,EACE;AAAA;AAEN,CAAA;AAKA,IAAM,2BAAA,GACJ,6CAAA;AAKF,IAAM,gBAAA,GAID;AAAA,EACH;AAAA,IACE,IAAA,EAAM,gBAAA;AAAA,IACN,OAAA,EAAS,sBAAA;AAAA,IACT,QAAA,EAAU;AAAA,GACZ;AAAA,EACA;AAAA,IACE,IAAA,EAAM,aAAA;AAAA,IACN,OAAA,EAAS,mBAAA;AAAA,IACT,QAAA,EAAU;AAAA,GACZ;AAAA,EACA;AAAA,IACE,IAAA,EAAM,aAAA;AAAA,IACN,OAAA,EAAS,gDAAA;AAAA,IACT,QAAA,EAAU;AAAA,GACZ;AAAA,EACA;AAAA,IACE,IAAA,EAAM,WAAA;AAAA,IACN,OAAA,EACE,mEAAA;AAAA,IACF,QAAA,EAAU;AAAA,GACZ;AAAA,EACA;AAAA,IACE,IAAA,EAAM,gBAAA;AAAA,IACN,OAAA,EACE,6FAAA;AAAA,IACF,QAAA,EAAU;AAAA;AAEd,CAAA;AAKA,IAAM,kBAAA,GAID;AAAA,EACH;AAAA,IACE,IAAA,EAAM,MAAA;AAAA,IACN,OAAA,EAAS,qDAAA;AAAA,IACT,QAAA,EAAU;AAAA;AAEd,CAAA;AAMA,IAAM,aAAA,uBAAyC,GAAA,CAAI;AAAA,EACjD,UAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA,YAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA,SAAA;AAAA,EACA,cAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA,EACA,QAAA;AAAA,EACA,gBAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,cAAA;AAAA,EACA,YAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,eAAA;AAAA,EACA,WAAA;AAAA,EACA,cAAA;AAAA,EACA,UAAA;AAAA,EACA,QAAA;AAAA,EACA,WAAA;AAAA,EACA;AACF,CAAC,CAAA;AAWM,IAAM,UAAA,GAAN,MAAM,WAAA,CAAW;AAAA;AAAA;AAAA;AAAA,EAItB,KAAK,IAAA,EAAyB;AAC5B,IAAA,MAAM,WAAwB,EAAC;AAE/B,IAAA,KAAA,MAAW,EAAE,IAAA,EAAM,OAAA,EAAQ,IAAK,YAAA,EAAc;AAE5C,MAAA,MAAM,QAAQ,IAAI,MAAA,CAAO,OAAA,CAAQ,MAAA,EAAQ,QAAQ,KAAK,CAAA;AACtD,MAAA,IAAI,KAAA;AAEJ,MAAA,OAAA,CAAQ,KAAA,GAAQ,KAAA,CAAM,IAAA,CAAK,IAAI,OAAO,IAAA,EAAM;AAE1C,QAAA,IAAI,IAAA,CAAK,UAAA,CAAW,cAAc,CAAA,EAAG;AACnC,UAAA,MAAM,SAAS,KAAA,CAAM,CAAC,CAAA,CAAE,OAAA,CAAQ,UAAU,EAAE,CAAA;AAC5C,UAAA,IAAI,CAAC,WAAA,CAAW,YAAA,CAAa,MAAM,CAAA,EAAG;AAAA,QACxC;AAEA,QAAA,QAAA,CAAS,IAAA,CAAK;AAAA,UACZ,IAAA;AAAA,UACA,KAAA,EAAO,MAAM,CAAC,CAAA;AAAA,UACd,OAAO,KAAA,CAAM,KAAA;AAAA,UACb,GAAA,EAAK,KAAA,CAAM,KAAA,GAAQ,KAAA,CAAM,CAAC,CAAA,CAAE;AAAA,SAC7B,CAAA;AAAA,MACH;AAAA,IACF;AAGA,IAAA,QAAA,CAAS,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,KAAA,GAAQ,EAAE,KAAK,CAAA;AAGzC,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,eAAA,CAAgB,QAAQ,CAAA;AAE7C,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,WAAA,CAAY,IAAA,EAAM,OAAO,CAAA;AAEnD,IAAA,OAAO;AAAA,MACL,QAAA,EAAU,QAAQ,MAAA,GAAS,CAAA;AAAA,MAC3B,QAAA,EAAU,OAAA;AAAA,MACV;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,QAAA,CACE,MACA,UAAA,GAAuB,CAAC,OAAO,KAAA,EAAO,SAAA,EAAW,WAAW,CAAA,EAC5C;AAChB,IAAA,MAAM,aAAoC,EAAC;AAC3C,IAAA,MAAM,kBAAA,uBAAyB,GAAA,EAAY;AAE3C,IAAA,IAAI,UAAA,CAAW,QAAA,CAAS,KAAK,CAAA,EAAG;AAC9B,MAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,kBAAA,CAAmB,IAAI,CAAA;AAClD,MAAA,KAAA,MAAW,KAAK,aAAA,EAAe;AAC7B,QAAA,UAAA,CAAW,KAAK,CAAC,CAAA;AACjB,QAAA,kBAAA,CAAmB,IAAI,KAAK,CAAA;AAAA,MAC9B;AAAA,IACF;AAEA,IAAA,IAAI,UAAA,CAAW,QAAA,CAAS,KAAK,CAAA,EAAG;AAC9B,MAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,QAAA,CAAS,IAAI,CAAA;AACxC,MAAA,KAAA,MAAW,KAAK,aAAA,EAAe;AAC7B,QAAA,UAAA,CAAW,KAAK,CAAC,CAAA;AACjB,QAAA,kBAAA,CAAmB,IAAI,KAAK,CAAA;AAAA,MAC9B;AAAA,IACF;AAEA,IAAA,IAAI,UAAA,CAAW,QAAA,CAAS,SAAS,CAAA,EAAG;AAClC,MAAA,MAAM,gBAAA,GAAmB,IAAA,CAAK,YAAA,CAAa,IAAI,CAAA;AAC/C,MAAA,KAAA,MAAW,KAAK,gBAAA,EAAkB;AAChC,QAAA,UAAA,CAAW,KAAK,CAAC,CAAA;AACjB,QAAA,kBAAA,CAAmB,IAAI,SAAS,CAAA;AAAA,MAClC;AAAA,IACF;AAEA,IAAA,IAAI,UAAA,CAAW,QAAA,CAAS,WAAW,CAAA,EAAG;AACpC,MAAA,MAAM,mBAAA,GAAsB,IAAA,CAAK,cAAA,CAAe,IAAI,CAAA;AACpD,MAAA,KAAA,MAAW,KAAK,mBAAA,EAAqB;AACnC,QAAA,UAAA,CAAW,KAAK,CAAC,CAAA;AACjB,QAAA,kBAAA,CAAmB,IAAI,WAAW,CAAA;AAAA,MACpC;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,QAAA,EAAU,WAAW,MAAA,GAAS,CAAA;AAAA,MAC9B,UAAA;AAAA,MACA,UAAA,EAAY,CAAC,GAAG,kBAAkB;AAAA,KACpC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,IAAA,EAAsB;AAC3B,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,IAAI,CAAA,CAAE,YAAA;AAAA,EACzB;AAAA;AAAA,EAIQ,mBAAmB,IAAA,EAAqC;AAC9D,IAAA,MAAM,aAAoC,EAAC;AAG3C,IAAA,KAAA,MAAW,KAAA,IAAS,IAAA,CAAK,QAAA,CAAS,wBAAwB,CAAA,EAAG;AAC3D,MAAA,UAAA,CAAW,IAAA,CAAK;AAAA,QACd,QAAA,EAAU,KAAA;AAAA,QACV,IAAA,EAAM,KAAA;AAAA,QACN,QAAA,EAAU,UAAA;AAAA,QACV,OAAO,KAAA,CAAM,KAAA;AAAA,QACb,GAAA,EAAK,KAAA,CAAM,KAAA,GAAS,KAAA,CAAM,CAAC,CAAA,CAAE;AAAA,OAC9B,CAAA;AAAA,IACH;AAGA,IAAA,KAAA,MAAW,SAAS,IAAA,CAAK,QAAA;AAAA,MACvB;AAAA,KACF,EAAG;AACD,MAAA,UAAA,CAAW,IAAA,CAAK;AAAA,QACd,QAAA,EAAU,KAAA;AAAA,QACV,IAAA,EAAM,OAAA;AAAA,QACN,QAAA,EAAU,MAAA;AAAA,QACV,OAAO,KAAA,CAAM,KAAA;AAAA,QACb,GAAA,EAAK,KAAA,CAAM,KAAA,GAAS,KAAA,CAAM,CAAC,CAAA,CAAE;AAAA,OAC9B,CAAA;AAAA,IACH;AAGA,IAAA,KAAA,MAAW,KAAA,IAAS,IAAA,CAAK,QAAA,CAAS,2BAA2B,CAAA,EAAG;AAC9D,MAAA,MAAM,SAAS,KAAA,CAAM,CAAC,CAAA,CAAE,OAAA,CAAQ,UAAU,EAAE,CAAA;AAC5C,MAAA,IAAI,WAAA,CAAW,YAAA,CAAa,MAAM,CAAA,EAAG;AACnC,QAAA,UAAA,CAAW,IAAA,CAAK;AAAA,UACd,QAAA,EAAU,KAAA;AAAA,UACV,IAAA,EAAM,aAAA;AAAA,UACN,QAAA,EAAU,UAAA;AAAA,UACV,OAAO,KAAA,CAAM,KAAA;AAAA,UACb,GAAA,EAAK,KAAA,CAAM,KAAA,GAAS,KAAA,CAAM,CAAC,CAAA,CAAE;AAAA,SAC9B,CAAA;AAAA,MACH;AAAA,IACF;AAGA,IAAA,KAAA,MAAW,SAAS,IAAA,CAAK,QAAA;AAAA,MACvB;AAAA,KACF,EAAG;AACD,MAAA,UAAA,CAAW,IAAA,CAAK;AAAA,QACd,QAAA,EAAU,KAAA;AAAA,QACV,IAAA,EAAM,OAAA;AAAA,QACN,QAAA,EAAU,QAAA;AAAA,QACV,OAAO,KAAA,CAAM,KAAA;AAAA,QACb,GAAA,EAAK,KAAA,CAAM,KAAA,GAAS,KAAA,CAAM,CAAC,CAAA,CAAE;AAAA,OAC9B,CAAA;AAAA,IACH;AAEA,IAAA,OAAO,UAAA;AAAA,EACT;AAAA,EAEQ,SAAS,IAAA,EAAqC;AACpD,IAAA,MAAM,SAAA,GAAY,KAAK,WAAA,EAAY;AACnC,IAAA,IAAI,iBAAA,GAAoB,KAAA;AAExB,IAAA,KAAA,MAAW,QAAQ,aAAA,EAAe;AAChC,MAAA,IAAI,SAAA,CAAU,QAAA,CAAS,IAAI,CAAA,EAAG;AAC5B,QAAA,iBAAA,GAAoB,IAAA;AACpB,QAAA;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,iBAAA,EAAmB,OAAO,EAAC;AAGhC,IAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,kBAAA,CAAmB,IAAI,CAAA;AAClD,IAAA,OAAO,aAAA,CAAc,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,MAC/B,GAAG,CAAA;AAAA,MACH,QAAA,EAAU,KAAA;AAAA,MACV,IAAA,EAAM,CAAA,IAAA,EAAO,CAAA,CAAE,IAAI,CAAA,CAAA;AAAA,MACnB,QAAA,EAAU;AAAA,KACZ,CAAE,CAAA;AAAA,EACJ;AAAA,EAEQ,aAAa,IAAA,EAAqC;AACxD,IAAA,MAAM,aAAoC,EAAC;AAE3C,IAAA,KAAA,MAAW,EAAE,IAAA,EAAM,OAAA,EAAS,QAAA,MAAc,gBAAA,EAAkB;AAC1D,MAAA,MAAM,QAAQ,IAAI,MAAA,CAAO,OAAA,CAAQ,MAAA,EAAQ,QAAQ,KAAK,CAAA;AACtD,MAAA,IAAI,KAAA;AAEJ,MAAA,OAAA,CAAQ,KAAA,GAAQ,KAAA,CAAM,IAAA,CAAK,IAAI,OAAO,IAAA,EAAM;AAC1C,QAAA,UAAA,CAAW,IAAA,CAAK;AAAA,UACd,QAAA,EAAU,SAAA;AAAA,UACV,IAAA;AAAA,UACA,QAAA;AAAA,UACA,OAAO,KAAA,CAAM,KAAA;AAAA,UACb,GAAA,EAAK,KAAA,CAAM,KAAA,GAAQ,KAAA,CAAM,CAAC,CAAA,CAAE;AAAA,SAC7B,CAAA;AAAA,MACH;AAAA,IACF;AAEA,IAAA,OAAO,UAAA;AAAA,EACT;AAAA,EAEQ,eAAe,IAAA,EAAqC;AAC1D,IAAA,MAAM,aAAoC,EAAC;AAG3C,IAAA,KAAA,MAAW,KAAA,IAAS,IAAA,CAAK,QAAA,CAAS,2BAA2B,CAAA,EAAG;AAC9D,MAAA,MAAM,SAAS,KAAA,CAAM,CAAC,CAAA,CAAE,OAAA,CAAQ,UAAU,EAAE,CAAA;AAC5C,MAAA,IAAI,WAAA,CAAW,YAAA,CAAa,MAAM,CAAA,EAAG;AACnC,QAAA,UAAA,CAAW,IAAA,CAAK;AAAA,UACd,QAAA,EAAU,WAAA;AAAA,UACV,IAAA,EAAM,aAAA;AAAA,UACN,QAAA,EAAU,UAAA;AAAA,UACV,OAAO,KAAA,CAAM,KAAA;AAAA,UACb,GAAA,EAAK,KAAA,CAAM,KAAA,GAAS,KAAA,CAAM,CAAC,CAAA,CAAE;AAAA,SAC9B,CAAA;AAAA,MACH;AAAA,IACF;AAGA,IAAA,KAAA,MAAW,EAAE,IAAA,EAAM,OAAA,EAAS,QAAA,MAAc,kBAAA,EAAoB;AAC5D,MAAA,MAAM,QAAQ,IAAI,MAAA,CAAO,OAAA,CAAQ,MAAA,EAAQ,QAAQ,KAAK,CAAA;AACtD,MAAA,IAAI,KAAA;AAEJ,MAAA,OAAA,CAAQ,KAAA,GAAQ,KAAA,CAAM,IAAA,CAAK,IAAI,OAAO,IAAA,EAAM;AAC1C,QAAA,UAAA,CAAW,IAAA,CAAK;AAAA,UACd,QAAA,EAAU,WAAA;AAAA,UACV,IAAA;AAAA,UACA,QAAA;AAAA,UACA,OAAO,KAAA,CAAM,KAAA;AAAA,UACb,GAAA,EAAK,KAAA,CAAM,KAAA,GAAQ,KAAA,CAAM,CAAC,CAAA,CAAE;AAAA,SAC7B,CAAA;AAAA,MACH;AAAA,IACF;AAEA,IAAA,OAAO,UAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,gBAAgB,QAAA,EAAoC;AAC1D,IAAA,IAAI,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG,OAAO,QAAA;AAElC,IAAA,MAAM,MAAA,GAAsB,CAAC,QAAA,CAAS,CAAC,CAAE,CAAA;AAEzC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,QAAA,CAAS,QAAQ,CAAA,EAAA,EAAK;AACxC,MAAA,MAAM,OAAA,GAAU,SAAS,CAAC,CAAA;AAC1B,MAAA,MAAM,IAAA,GAAO,MAAA,CAAO,MAAA,CAAO,MAAA,GAAS,CAAC,CAAA;AAErC,MAAA,IAAI,OAAA,CAAQ,KAAA,IAAS,IAAA,CAAK,GAAA,EAAK;AAC7B,QAAA,MAAA,CAAO,KAAK,OAAO,CAAA;AAAA,MACrB,CAAA,MAAA,IACE,QAAQ,KAAA,KAAU,IAAA,CAAK,SACvB,OAAA,CAAQ,GAAA,GAAM,KAAK,GAAA,EACnB;AACA,QAAA,MAAA,CAAO,MAAA,CAAO,MAAA,GAAS,CAAC,CAAA,GAAI,OAAA;AAAA,MAC9B;AAAA,IACF;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,WAAA,CAAY,MAAc,QAAA,EAA+B;AAC/D,IAAA,IAAI,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAElC,IAAA,IAAI,MAAA,GAAS,EAAA;AACb,IAAA,IAAI,MAAA,GAAS,CAAA;AAEb,IAAA,KAAA,MAAW,UAAU,QAAA,EAAU;AAC7B,MAAA,MAAA,IAAU,IAAA,CAAK,KAAA,CAAM,MAAA,EAAQ,MAAA,CAAO,KAAK,CAAA;AACzC,MAAA,MAAA,IAAU,CAAA,CAAA,EAAI,MAAA,CAAO,IAAA,CAAK,WAAA,EAAa,CAAA,CAAA,CAAA;AACvC,MAAA,MAAA,GAAS,MAAA,CAAO,GAAA;AAAA,IAClB;AAEA,IAAA,MAAA,IAAU,IAAA,CAAK,MAAM,MAAM,CAAA;AAC3B,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,aAAa,MAAA,EAAyB;AAC3C,IAAA,IAAI,OAAO,MAAA,GAAS,EAAA,IAAM,MAAA,CAAO,MAAA,GAAS,IAAI,OAAO,KAAA;AAErD,IAAA,IAAI,GAAA,GAAM,CAAA;AACV,IAAA,IAAI,SAAA,GAAY,KAAA;AAEhB,IAAA,KAAA,IAAS,IAAI,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AAC3C,MAAA,MAAM,IAAA,GAAO,OAAO,CAAC,CAAA;AACrB,MAAA,IAAI,IAAA,GAAO,GAAA,IAAO,IAAA,GAAO,GAAA,EAAK,OAAO,KAAA;AAErC,MAAA,IAAI,CAAA,GAAI,QAAA,CAAS,IAAA,EAAM,EAAE,CAAA;AACzB,MAAA,IAAI,SAAA,EAAW;AACb,QAAA,CAAA,IAAK,CAAA;AACL,QAAA,IAAI,CAAA,GAAI,GAAG,CAAA,IAAK,CAAA;AAAA,MAClB;AACA,MAAA,GAAA,IAAO,CAAA;AACP,MAAA,SAAA,GAAY,CAAC,SAAA;AAAA,IACf;AAEA,IAAA,OAAO,MAAM,EAAA,KAAO,CAAA;AAAA,EACtB;AACF;;;AC5dO,IAAM,yBAAN,MAA6B;AAAA,EAC1B,OAAA;AAAA,EACA,WAAA;AAAA,EACS,KAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOjB,WAAA,CAAY,IAAA,EAAc,KAAA,EAAe,MAAA,GAAS,KAAA,EAAO;AACvD,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAA;AACb,IAAA,IAAA,CAAK,MAAA,GAAS,KAAA;AACd,IAAA,IAAA,CAAK,OAAA,GAAU,KAAA;AACf,IAAA,IAAA,CAAK,WAAA,GAAc,KAAK,GAAA,EAAI;AAC5B,IAAA,IAAA,CAAK,OAAA,GAAU,MAAA;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,KAAA,GAAiB;AACf,IAAA,IAAA,CAAK,OAAA,EAAQ;AAEb,IAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACrB,MAAA,IAAA,CAAK,OAAA,IAAW,CAAA;AAChB,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,IAAI,KAAK,OAAA,EAAS;AAChB,MAAA,MAAM,aAAa,IAAA,CAAK,IAAA,CAAA,CAAM,IAAI,IAAA,CAAK,OAAA,IAAW,KAAK,KAAK,CAAA;AAC5D,MAAA,MAAM,IAAI,gBAAA;AAAA,QACR,oCAAoC,UAAU,CAAA,EAAA,CAAA;AAAA,QAC9C,UAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAEA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,IAAA,GAAsB;AAC1B,IAAA,IAAA,CAAK,OAAA,EAAQ;AAEb,IAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACrB,MAAA,IAAA,CAAK,OAAA,IAAW,CAAA;AAChB,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,OAAA,GAAU,IAAI,IAAA,CAAK,OAAA;AACzB,IAAA,MAAM,SAAS,IAAA,CAAK,IAAA,CAAM,OAAA,GAAU,IAAA,CAAK,QAAS,GAAI,CAAA;AAEtD,IAAA,MAAM,IAAI,OAAA,CAAc,CAAC,YAAY,UAAA,CAAW,OAAA,EAAS,MAAM,CAAC,CAAA;AAChE,IAAA,IAAA,CAAK,OAAA,EAAQ;AACb,IAAA,IAAA,CAAK,OAAA,IAAW,CAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,eAAA,GAA0B;AAC5B,IAAA,IAAA,CAAK,OAAA,EAAQ;AACb,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EACd;AAAA,EAEQ,OAAA,GAAgB;AACtB,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,MAAM,OAAA,GAAA,CAAW,GAAA,GAAM,IAAA,CAAK,WAAA,IAAe,GAAA;AAC3C,IAAA,IAAA,CAAK,OAAA,GAAU,KAAK,GAAA,CAAI,IAAA,CAAK,QAAQ,IAAA,CAAK,OAAA,GAAU,OAAA,GAAU,IAAA,CAAK,KAAK,CAAA;AACxE,IAAA,IAAA,CAAK,WAAA,GAAc,GAAA;AAAA,EACrB;AACF;;;ACvCO,IAAM,iBAAN,MAA6C;AAAA,EACjC,OAAA;AAAA,EACA,OAAA;AAAA,EACA,cAAA;AAAA,EACA,YAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA;AAAA,EACA,QAAA;AAAA,EAEjB,YACE,SAAA,EACA,MAAA,EACA,eACA,WAAA,EACA,UAAA,EACA,aACA,OAAA,EACA;AACA,IAAA,IAAA,CAAK,OAAA,GAAU,SAAA;AACf,IAAA,IAAA,CAAK,OAAA,GAAU,MAAA;AACf,IAAA,IAAA,CAAK,cAAA,GAAiB,aAAA;AACtB,IAAA,IAAA,CAAK,YAAA,GAAe,WAAA;AACpB,IAAA,IAAA,CAAK,WAAA,GAAc,UAAA;AACnB,IAAA,IAAA,CAAK,YAAA,GAAe,WAAA;AACpB,IAAA,IAAA,CAAK,QAAA,GAAW,OAAA;AAAA,EAClB;AAAA,EAEA,eAAA,GAA0B;AACxB,IAAA,OAAO,QAAA;AAAA,EACT;AAAA,EAEA,aAAa,QAAA,EAAmC;AAC9C,IAAA,MAAM,GAAA,GAAM,QAAA;AACZ,IAAA,OAAO;AAAA,MACL,WAAA,EAAa,GAAA,CAAI,KAAA,EAAO,aAAA,IAAiB,CAAA;AAAA,MACzC,YAAA,EAAc,GAAA,CAAI,KAAA,EAAO,iBAAA,IAAqB;AAAA,KAChD;AAAA,EACF;AAAA,EAEA,KAAK,MAAA,EAA0B;AAC7B,IAAA,MAAM,YAAA,GAAe,MAAA;AACrB,IAAA,MAAM,IAAA,GAAO,IAAA;AAGb,IAAA,MAAM,gBAAA,GAAmB,IAAI,KAAA,CAAM,YAAA,CAAa,KAAK,WAAA,EAAa;AAAA,MAChE,GAAA,CAAI,MAAA,EAAQ,IAAA,EAAM,QAAA,EAAU;AAC1B,QAAA,IAAI,SAAS,QAAA,EAAU;AACrB,UAAA,OAAO,UAAU,IAAA,KAAoB;AACnC,YAAA,MAAM,MAAA,GAAU,IAAA,CAAK,CAAC,CAAA,IAAK,EAAC;AAC5B,YAAA,MAAM,KAAA,GAAS,MAAA,CAAO,OAAO,CAAA,IAAgB,SAAA;AAG7C,YAAA,MAAM,IAAA,CAAK,aAAa,IAAA,EAAK;AAG7B,YAAA,MAAM,QAAA,GAAW,OAAO,UAAU,CAAA;AAGlC,YAAA,IAAI,QAAA,EAAU;AACZ,cAAA,KAAA,MAAW,OAAO,QAAA,EAAU;AAC1B,gBAAA,IAAI,OAAO,GAAA,CAAI,OAAA,KAAY,QAAA,EAAU;AACnC,kBAAA,MAAM,UAAA,GAAa,IAAA,CAAK,WAAA,CAAY,IAAA,CAAK,IAAI,OAAO,CAAA;AACpD,kBAAA,IAAI,WAAW,QAAA,EAAU;AACvB,oBAAA,IAAI,IAAA,CAAK,QAAQ,cAAA,EAAgB;AAE/B,sBAAA,MAAM,UAAA,GAAa,IAAA,CAAK,WAAA,CAAY,QAAA,CAAS,IAAI,OAAO,CAAA;AAExD,sBAAA,IAAI,WAAW,QAAA,EAAU;AAEvB,wBAAA,KAAA,MAAW,SAAA,IAAa,WAAW,UAAA,EAAY;AAC7C,0BAAA,IAAA,CAAK,QACF,YAAA,CAAa;AAAA,4BACZ,cAAA,EAAgB,KAAK,OAAA,CAAQ,KAAA;AAAA,4BAC7B,eAAe,SAAA,CAAU,QAAA;AAAA,4BACzB,kBAAkB,SAAA,CAAU,IAAA;AAAA,4BAC5B,UAAU,SAAA,CAAU,QAAA;AAAA,4BACpB,WAAA,EAAa,KAAK,OAAA,CAAQ,WAAA;AAAA,4BAC1B,WAAA,EAAa,OAAA;AAAA,4BACb,UAAA,EAAY,KAAA;AAAA,4BACZ,UAAA,EAAA,iBAAY,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,4BACnC,MAAA,EAAQ,eAAA;AAAA,4BACR,cAAA,EAAgB;AAAA,2BACjB,CAAA,CACA,KAAA,CAAM,MAAM;AAAA,0BAAC,CAAC,CAAA;AAAA,wBACnB;AAEA,wBAAA,MAAM,IAAI,gBAAA;AAAA,0BACR,qEAAA;AAAA,0BACA,UAAA,CAAW,UAAA,CAAW,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,4BAChC,MAAM,CAAA,CAAE,QAAA;AAAA,4BACR,SAAS,CAAA,CAAE,IAAA;AAAA,4BACX,UAAU,CAAA,CAAE,QAAA;AAAA,4BACZ,OAAO,CAAA,CAAE,KAAA;AAAA,4BACT,KAAK,CAAA,CAAE;AAAA,2BACT,CAAE,CAAA;AAAA,0BACF,IAAA,CAAK,WAAA,CAAY,MAAA,CAAO,GAAA,CAAI,OAAO;AAAA,yBACrC;AAAA,sBACF;AAAA,oBACF,CAAA,MAAO;AAEL,sBAAA,MAAM,SAAA,GAAY,MAAM,IAAA,CAAK,OAAA,CAAQ,QAAA,CAAS;AAAA,wBAC5C,KAAA,EAAO,KAAK,OAAA,CAAQ,KAAA;AAAA,wBACpB,MAAM,GAAA,CAAI,OAAA;AAAA,wBACV,WAAA,EAAa,KAAK,OAAA,CAAQ;AAAA,uBAC3B,CAAA;AAED,sBAAA,IAAI,CAAC,UAAU,SAAA,EAAW;AACxB,wBAAA,MAAM,IAAI,gBAAA;AAAA,0BACR,+CAAA;AAAA,0BACA,SAAA,CAAU,UAAA;AAAA,0BACV,SAAA,CAAU,gBAAgB,UAAA,CAAW;AAAA,yBACvC;AAAA,sBACF;AAAA,oBACF;AAAA,kBACF;AAAA,gBACF;AAAA,cACF;AAAA,YACF;AAGA,YAAA,MAAM,aAAA,GAAgB,aAAA,CAAc,KAAA,EAAO,GAAA,EAAK,GAAG,CAAA;AACnD,YAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,cAAA,CAAe,KAAA;AAAA,cAC5C,IAAA,CAAK,OAAA;AAAA,cACL,KAAK,OAAA,CAAQ,KAAA;AAAA,cACZ,MAAA,CAAO,SAAS,CAAA,IAAgB,SAAA;AAAA,cACjC;AAAA,aACF;AAEA,YAAA,IAAI,CAAC,WAAA,CAAY,OAAA,IAAW,WAAA,CAAY,WAAW,OAAA,EAAS;AAC1D,cAAA,MAAM,IAAI,mBAAA;AAAA,gBACR,YAAY,MAAA,IAAU,iBAAA;AAAA,gBACtB,CAAA;AAAA,gBACA;AAAA,eACF;AAAA,YACF;AAGA,YAAA,IAAI,KAAK,QAAA,EAAU;AACjB,cAAA,IAAA,CAAK,QAAA,CAAS,aAAa,aAAa,CAAA;AAAA,YAC1C;AAGA,YAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,YAAA,MAAM,WAAW,MAAM,MAAA,CAAO,MAAA,CAAO,KAAA,CAAM,QAAQ,IAAa,CAAA;AAChE,YAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAG/B,YAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,YAAA,CAAa,QAAQ,CAAA;AACxC,YAAA,MAAM,IAAA,GAAO,aAAA;AAAA,cACX,KAAA;AAAA,cACA,KAAA,CAAM,WAAA;AAAA,cACN,KAAA,CAAM;AAAA,aACR;AAEA,YAAA,IAAA,CAAK,YAAA,CAAa,MAAA;AAAA,cAChB;AAAA,gBACE,MAAA,EAAQ,KAAK,OAAA,CAAQ,MAAA;AAAA,gBACrB,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,gBAClC,QAAA,EAAU,QAAA;AAAA,gBACV,KAAA;AAAA,gBACA,aAAa,KAAA,CAAM,WAAA;AAAA,gBACnB,cAAc,KAAA,CAAM,YAAA;AAAA,gBACpB,SAAA;AAAA,gBACA,UAAU;AAAC,eACb;AAAA,cACA,IAAA,CAAK;AAAA,aACP;AAGA,YAAA,IAAA,CAAK,cAAA,CAAe,gBAAA;AAAA,cAClB,KAAK,OAAA,CAAQ,KAAA;AAAA,cACZ,MAAA,CAAO,SAAS,CAAA,IAAgB,SAAA;AAAA,cACjC;AAAA,aACF;AAGA,YAAA,IAAI,KAAK,QAAA,EAAU;AACjB,cAAA,IAAA,CAAK,SAAS,UAAA,CAAW;AAAA,gBACvB,QAAA,EAAU,KAAA;AAAA,gBACV,aAAa,KAAA,CAAM,WAAA;AAAA,gBACnB,cAAc,KAAA,CAAM,YAAA;AAAA,gBACpB,OAAA,EAAS;AAAA,eACV,CAAA;AAAA,YACH;AAEA,YAAA,OAAO,QAAA;AAAA,UACT,CAAA;AAAA,QACF;AACA,QAAA,OAAO,OAAA,CAAQ,GAAA,CAAI,MAAA,EAAQ,IAAA,EAAM,QAAQ,CAAA;AAAA,MAC3C;AAAA,KACD,CAAA;AAGD,IAAA,MAAM,SAAA,GAAY,IAAI,KAAA,CAAM,YAAA,CAAa,IAAA,EAAM;AAAA,MAC7C,GAAA,CAAI,MAAA,EAAQ,IAAA,EAAM,QAAA,EAAU;AAC1B,QAAA,IAAI,SAAS,aAAA,EAAe;AAC1B,UAAA,OAAO,gBAAA;AAAA,QACT;AACA,QAAA,OAAO,OAAA,CAAQ,GAAA,CAAI,MAAA,EAAQ,IAAA,EAAM,QAAQ,CAAA;AAAA,MAC3C;AAAA,KACD,CAAA;AAGD,IAAA,OAAO,IAAI,MAAM,YAAA,EAAc;AAAA,MAC7B,GAAA,CAAI,MAAA,EAAQ,IAAA,EAAM,QAAA,EAAU;AAC1B,QAAA,IAAI,SAAS,MAAA,EAAQ;AACnB,UAAA,OAAO,SAAA;AAAA,QACT;AACA,QAAA,OAAO,OAAA,CAAQ,GAAA,CAAI,MAAA,EAAQ,IAAA,EAAM,QAAQ,CAAA;AAAA,MAC3C;AAAA,KACD,CAAA;AAAA,EACH;AACF;;;AC7NO,IAAM,oBAAN,MAAgD;AAAA,EACpC,OAAA;AAAA,EACA,OAAA;AAAA,EACA,cAAA;AAAA,EACA,YAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA;AAAA,EACA,QAAA;AAAA,EAEjB,YACE,SAAA,EACA,MAAA,EACA,eACA,WAAA,EACA,UAAA,EACA,aACA,OAAA,EACA;AACA,IAAA,IAAA,CAAK,OAAA,GAAU,SAAA;AACf,IAAA,IAAA,CAAK,OAAA,GAAU,MAAA;AACf,IAAA,IAAA,CAAK,cAAA,GAAiB,aAAA;AACtB,IAAA,IAAA,CAAK,YAAA,GAAe,WAAA;AACpB,IAAA,IAAA,CAAK,WAAA,GAAc,UAAA;AACnB,IAAA,IAAA,CAAK,YAAA,GAAe,WAAA;AACpB,IAAA,IAAA,CAAK,QAAA,GAAW,OAAA;AAAA,EAClB;AAAA,EAEA,eAAA,GAA0B;AACxB,IAAA,OAAO,WAAA;AAAA,EACT;AAAA,EAEA,aAAa,QAAA,EAAmC;AAC9C,IAAA,MAAM,GAAA,GAAM,QAAA;AACZ,IAAA,OAAO;AAAA,MACL,WAAA,EAAa,GAAA,CAAI,KAAA,EAAO,YAAA,IAAgB,CAAA;AAAA,MACxC,YAAA,EAAc,GAAA,CAAI,KAAA,EAAO,aAAA,IAAiB;AAAA,KAC5C;AAAA,EACF;AAAA,EAEA,KAAK,MAAA,EAA0B;AAC7B,IAAA,MAAM,eAAA,GAAkB,MAAA;AACxB,IAAA,MAAM,IAAA,GAAO,IAAA;AAGb,IAAA,MAAM,aAAA,GAAgB,IAAI,KAAA,CAAM,eAAA,CAAgB,QAAA,EAAU;AAAA,MACxD,GAAA,CAAI,MAAA,EAAQ,IAAA,EAAM,QAAA,EAAU;AAC1B,QAAA,IAAI,SAAS,QAAA,EAAU;AACrB,UAAA,OAAO,UAAU,IAAA,KAAoB;AACnC,YAAA,MAAM,MAAA,GAAU,IAAA,CAAK,CAAC,CAAA,IAAK,EAAC;AAC5B,YAAA,MAAM,KAAA,GAAS,MAAA,CAAO,OAAO,CAAA,IAAgB,SAAA;AAG7C,YAAA,MAAM,IAAA,CAAK,aAAa,IAAA,EAAK;AAG7B,YAAA,MAAM,QAAA,GAAW,OAAO,UAAU,CAAA;AAGlC,YAAA,IAAI,QAAA,EAAU;AACZ,cAAA,KAAA,MAAW,OAAO,QAAA,EAAU;AAC1B,gBAAA,MAAM,WAAA,GACJ,OAAO,GAAA,CAAI,OAAA,KAAY,WACnB,GAAA,CAAI,OAAA,GACJ,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,OAAO,IACvB,GAAA,CAAI,OAAA,CACD,GAAA,CAAI,CAAC,KAAA,KAAU,KAAA,CAAM,QAAQ,EAAE,CAAA,CAC/B,IAAA,CAAK,GAAG,CAAA,GACX,EAAA;AAER,gBAAA,IAAI,WAAA,EAAa;AACf,kBAAA,MAAM,UAAA,GAAa,IAAA,CAAK,WAAA,CAAY,IAAA,CAAK,WAAW,CAAA;AACpD,kBAAA,IAAI,WAAW,QAAA,EAAU;AACvB,oBAAA,IAAI,IAAA,CAAK,QAAQ,cAAA,EAAgB;AAE/B,sBAAA,MAAM,UAAA,GAAa,IAAA,CAAK,WAAA,CAAY,QAAA,CAAS,WAAW,CAAA;AAExD,sBAAA,IAAI,WAAW,QAAA,EAAU;AAEvB,wBAAA,KAAA,MAAW,SAAA,IAAa,WAAW,UAAA,EAAY;AAC7C,0BAAA,IAAA,CAAK,QACF,YAAA,CAAa;AAAA,4BACZ,cAAA,EAAgB,KAAK,OAAA,CAAQ,KAAA;AAAA,4BAC7B,eAAe,SAAA,CAAU,QAAA;AAAA,4BACzB,kBAAkB,SAAA,CAAU,IAAA;AAAA,4BAC5B,UAAU,SAAA,CAAU,QAAA;AAAA,4BACpB,WAAA,EAAa,KAAK,OAAA,CAAQ,WAAA;AAAA,4BAC1B,WAAA,EAAa,OAAA;AAAA,4BACb,UAAA,EAAY,KAAA;AAAA,4BACZ,UAAA,EAAA,iBAAY,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,4BACnC,MAAA,EAAQ,eAAA;AAAA,4BACR,cAAA,EAAgB;AAAA,2BACjB,CAAA,CACA,KAAA,CAAM,MAAM;AAAA,0BAAC,CAAC,CAAA;AAAA,wBACnB;AAEA,wBAAA,MAAM,IAAI,gBAAA;AAAA,0BACR,qEAAA;AAAA,0BACA,UAAA,CAAW,UAAA,CAAW,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,4BAChC,MAAM,CAAA,CAAE,QAAA;AAAA,4BACR,SAAS,CAAA,CAAE,IAAA;AAAA,4BACX,UAAU,CAAA,CAAE,QAAA;AAAA,4BACZ,OAAO,CAAA,CAAE,KAAA;AAAA,4BACT,KAAK,CAAA,CAAE;AAAA,2BACT,CAAE,CAAA;AAAA,0BACF,IAAA,CAAK,WAAA,CAAY,MAAA,CAAO,WAAW;AAAA,yBACrC;AAAA,sBACF;AAAA,oBACF,CAAA,MAAO;AAEL,sBAAA,MAAM,SAAA,GAAY,MAAM,IAAA,CAAK,OAAA,CAAQ,QAAA,CAAS;AAAA,wBAC5C,KAAA,EAAO,KAAK,OAAA,CAAQ,KAAA;AAAA,wBACpB,IAAA,EAAM,WAAA;AAAA,wBACN,WAAA,EAAa,KAAK,OAAA,CAAQ;AAAA,uBAC3B,CAAA;AACD,sBAAA,IAAI,CAAC,UAAU,SAAA,EAAW;AACxB,wBAAA,MAAM,IAAI,gBAAA;AAAA,0BACR,+CAAA;AAAA,0BACA,SAAA,CAAU,UAAA;AAAA,0BACV,SAAA,CAAU,gBAAgB,UAAA,CAAW;AAAA,yBACvC;AAAA,sBACF;AAAA,oBACF;AAAA,kBACF;AAAA,gBACF;AAAA,cACF;AAAA,YACF;AAGA,YAAA,MAAM,aAAA,GAAgB,aAAA,CAAc,KAAA,EAAO,GAAA,EAAK,GAAG,CAAA;AACnD,YAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,cAAA,CAAe,KAAA;AAAA,cAC5C,IAAA,CAAK,OAAA;AAAA,cACL,KAAK,OAAA,CAAQ,KAAA;AAAA,cACZ,MAAA,CAAO,SAAS,CAAA,IAAgB,SAAA;AAAA,cACjC;AAAA,aACF;AAEA,YAAA,IAAI,CAAC,WAAA,CAAY,OAAA,IAAW,WAAA,CAAY,WAAW,OAAA,EAAS;AAC1D,cAAA,MAAM,IAAI,mBAAA;AAAA,gBACR,YAAY,MAAA,IAAU,iBAAA;AAAA,gBACtB,CAAA;AAAA,gBACA;AAAA,eACF;AAAA,YACF;AAGA,YAAA,IAAI,KAAK,QAAA,EAAU;AACjB,cAAA,IAAA,CAAK,QAAA,CAAS,aAAa,aAAa,CAAA;AAAA,YAC1C;AAGA,YAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,YAAA,MAAM,WAAW,MAAM,MAAA,CAAO,MAAA,CAAO,KAAA,CAAM,QAAQ,IAAa,CAAA;AAChE,YAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAG/B,YAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,YAAA,CAAa,QAAQ,CAAA;AACxC,YAAA,MAAM,IAAA,GAAO,aAAA;AAAA,cACX,KAAA;AAAA,cACA,KAAA,CAAM,WAAA;AAAA,cACN,KAAA,CAAM;AAAA,aACR;AAEA,YAAA,IAAA,CAAK,YAAA,CAAa,MAAA;AAAA,cAChB;AAAA,gBACE,MAAA,EAAQ,KAAK,OAAA,CAAQ,MAAA;AAAA,gBACrB,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,gBAClC,QAAA,EAAU,WAAA;AAAA,gBACV,KAAA;AAAA,gBACA,aAAa,KAAA,CAAM,WAAA;AAAA,gBACnB,cAAc,KAAA,CAAM,YAAA;AAAA,gBACpB,SAAA;AAAA,gBACA,UAAU;AAAC,eACb;AAAA,cACA,IAAA,CAAK;AAAA,aACP;AAEA,YAAA,IAAA,CAAK,cAAA,CAAe,gBAAA;AAAA,cAClB,KAAK,OAAA,CAAQ,KAAA;AAAA,cACZ,MAAA,CAAO,SAAS,CAAA,IAAgB,SAAA;AAAA,cACjC;AAAA,aACF;AAGA,YAAA,IAAI,KAAK,QAAA,EAAU;AACjB,cAAA,IAAA,CAAK,SAAS,UAAA,CAAW;AAAA,gBACvB,QAAA,EAAU,KAAA;AAAA,gBACV,aAAa,KAAA,CAAM,WAAA;AAAA,gBACnB,cAAc,KAAA,CAAM,YAAA;AAAA,gBACpB,OAAA,EAAS;AAAA,eACV,CAAA;AAAA,YACH;AAEA,YAAA,OAAO,QAAA;AAAA,UACT,CAAA;AAAA,QACF;AACA,QAAA,OAAO,OAAA,CAAQ,GAAA,CAAI,MAAA,EAAQ,IAAA,EAAM,QAAQ,CAAA;AAAA,MAC3C;AAAA,KACD,CAAA;AAGD,IAAA,OAAO,IAAI,MAAM,eAAA,EAAiB;AAAA,MAChC,GAAA,CAAI,MAAA,EAAQ,IAAA,EAAM,QAAA,EAAU;AAC1B,QAAA,IAAI,SAAS,UAAA,EAAY;AACvB,UAAA,OAAO,aAAA;AAAA,QACT;AACA,QAAA,OAAO,OAAA,CAAQ,GAAA,CAAI,MAAA,EAAQ,IAAA,EAAM,QAAQ,CAAA;AAAA,MAC3C;AAAA,KACD,CAAA;AAAA,EACH;AACF;;;AC7MO,IAAM,iBAAN,MAA6C;AAAA,EACjC,OAAA;AAAA,EACA,OAAA;AAAA,EACA,cAAA;AAAA,EACA,YAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA;AAAA,EACA,QAAA;AAAA,EAEjB,YACE,SAAA,EACA,MAAA,EACA,eACA,WAAA,EACA,UAAA,EACA,aACA,OAAA,EACA;AACA,IAAA,IAAA,CAAK,OAAA,GAAU,SAAA;AACf,IAAA,IAAA,CAAK,OAAA,GAAU,MAAA;AACf,IAAA,IAAA,CAAK,cAAA,GAAiB,aAAA;AACtB,IAAA,IAAA,CAAK,YAAA,GAAe,WAAA;AACpB,IAAA,IAAA,CAAK,WAAA,GAAc,UAAA;AACnB,IAAA,IAAA,CAAK,YAAA,GAAe,WAAA;AACpB,IAAA,IAAA,CAAK,QAAA,GAAW,OAAA;AAAA,EAClB;AAAA,EAEA,eAAA,GAA0B;AACxB,IAAA,OAAO,QAAA;AAAA,EACT;AAAA,EAEA,aAAa,QAAA,EAAmC;AAC9C,IAAA,MAAM,GAAA,GAAM,QAAA;AACZ,IAAA,MAAM,QAAA,GAAW,IAAI,QAAA,EAAU,aAAA;AAC/B,IAAA,OAAO;AAAA,MACL,WAAA,EAAa,UAAU,gBAAA,IAAoB,CAAA;AAAA,MAC3C,YAAA,EAAc,UAAU,oBAAA,IAAwB;AAAA,KAClD;AAAA,EACF;AAAA,EAEA,KAAK,MAAA,EAA0B;AAC7B,IAAA,MAAM,YAAA,GAAe,MAAA;AACrB,IAAA,MAAM,IAAA,GAAO,IAAA;AAEb,IAAA,OAAO,IAAI,MAAM,YAAA,EAAc;AAAA,MAC7B,GAAA,CAAI,MAAA,EAAQ,IAAA,EAAM,QAAA,EAAU;AAC1B,QAAA,IAAI,SAAS,oBAAA,EAAsB;AACjC,UAAA,OAAO,CAAC,MAAA,KAA8B;AACpC,YAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,kBAAA,CAAmB,MAAM,CAAA;AAC9C,YAAA,OAAO,IAAA,CAAK,UAAA,CAAW,KAAA,EAAO,MAAA,CAAO,KAAK,CAAA;AAAA,UAC5C,CAAA;AAAA,QACF;AACA,QAAA,OAAO,OAAA,CAAQ,GAAA,CAAI,MAAA,EAAQ,IAAA,EAAM,QAAQ,CAAA;AAAA,MAC3C;AAAA,KACD,CAAA;AAAA,EACH;AAAA,EAEQ,UAAA,CACN,OACA,SAAA,EACuB;AACvB,IAAA,MAAM,IAAA,GAAO,IAAA;AAEb,IAAA,OAAO,IAAI,MAAM,KAAA,EAAO;AAAA,MACtB,GAAA,CAAI,MAAA,EAAQ,IAAA,EAAM,QAAA,EAAU;AAC1B,QAAA,IAAI,SAAS,iBAAA,EAAmB;AAC9B,UAAA,OAAO,UAAU,IAAA,KAAoB;AAEnC,YAAA,MAAM,IAAA,CAAK,aAAa,IAAA,EAAK;AAG7B,YAAA,IAAI,OAAO,IAAA,CAAK,CAAC,CAAA,KAAM,QAAA,EAAU;AAC/B,cAAA,MAAM,aAAa,IAAA,CAAK,WAAA,CAAY,IAAA,CAAK,IAAA,CAAK,CAAC,CAAC,CAAA;AAChD,cAAA,IAAI,WAAW,QAAA,EAAU;AACvB,gBAAA,IAAI,IAAA,CAAK,QAAQ,cAAA,EAAgB;AAE/B,kBAAA,MAAM,aAAa,IAAA,CAAK,WAAA,CAAY,QAAA,CAAS,IAAA,CAAK,CAAC,CAAC,CAAA;AAEpD,kBAAA,IAAI,WAAW,QAAA,EAAU;AAEvB,oBAAA,KAAA,MAAW,SAAA,IAAa,WAAW,UAAA,EAAY;AAC7C,sBAAA,IAAA,CAAK,QACF,YAAA,CAAa;AAAA,wBACZ,cAAA,EAAgB,KAAK,OAAA,CAAQ,KAAA;AAAA,wBAC7B,eAAe,SAAA,CAAU,QAAA;AAAA,wBACzB,kBAAkB,SAAA,CAAU,IAAA;AAAA,wBAC5B,UAAU,SAAA,CAAU,QAAA;AAAA,wBACpB,WAAA,EAAa,KAAK,OAAA,CAAQ,WAAA;AAAA,wBAC1B,WAAA,EAAa,OAAA;AAAA,wBACb,UAAA,EAAY,KAAA;AAAA,wBACZ,UAAA,EAAA,iBAAY,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,wBACnC,MAAA,EAAQ,eAAA;AAAA,wBACR,cAAA,EAAgB;AAAA,uBACjB,CAAA,CACA,KAAA,CAAM,MAAM;AAAA,sBAAC,CAAC,CAAA;AAAA,oBACnB;AAEA,oBAAA,MAAM,IAAI,gBAAA;AAAA,sBACR,qEAAA;AAAA,sBACA,UAAA,CAAW,UAAA,CAAW,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,wBAChC,MAAM,CAAA,CAAE,QAAA;AAAA,wBACR,SAAS,CAAA,CAAE,IAAA;AAAA,wBACX,UAAU,CAAA,CAAE,QAAA;AAAA,wBACZ,OAAO,CAAA,CAAE,KAAA;AAAA,wBACT,KAAK,CAAA,CAAE;AAAA,uBACT,CAAE,CAAA;AAAA,sBACF,IAAA,CAAK,WAAA,CAAY,MAAA,CAAO,IAAA,CAAK,CAAC,CAAC;AAAA,qBACjC;AAAA,kBACF;AAAA,gBACF,CAAA,MAAO;AAEL,kBAAA,MAAM,SAAA,GAAY,MAAM,IAAA,CAAK,OAAA,CAAQ,QAAA,CAAS;AAAA,oBAC5C,KAAA,EAAO,KAAK,OAAA,CAAQ,KAAA;AAAA,oBACpB,IAAA,EAAM,KAAK,CAAC,CAAA;AAAA,oBACZ,WAAA,EAAa,KAAK,OAAA,CAAQ;AAAA,mBAC3B,CAAA;AACD,kBAAA,IAAI,CAAC,UAAU,SAAA,EAAW;AACxB,oBAAA,MAAM,IAAI,gBAAA;AAAA,sBACR,+CAAA;AAAA,sBACA,SAAA,CAAU,UAAA;AAAA,sBACV,SAAA,CAAU,gBAAgB,UAAA,CAAW;AAAA,qBACvC;AAAA,kBACF;AAAA,gBACF;AAAA,cACF;AAAA,YACF;AAGA,YAAA,MAAM,aAAA,GAAgB,aAAA,CAAc,SAAA,EAAW,GAAA,EAAK,GAAG,CAAA;AACvD,YAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,cAAA,CAAe,KAAA;AAAA,cAC5C,IAAA,CAAK,OAAA;AAAA,cACL,KAAK,OAAA,CAAQ,KAAA;AAAA,cACb,SAAA;AAAA,cACA;AAAA,aACF;AAEA,YAAA,IAAI,CAAC,WAAA,CAAY,OAAA,IAAW,WAAA,CAAY,WAAW,OAAA,EAAS;AAC1D,cAAA,MAAM,IAAI,mBAAA;AAAA,gBACR,YAAY,MAAA,IAAU,iBAAA;AAAA,gBACtB,CAAA;AAAA,gBACA;AAAA,eACF;AAAA,YACF;AAGA,YAAA,IAAI,KAAK,QAAA,EAAU;AACjB,cAAA,IAAA,CAAK,QAAA,CAAS,aAAa,aAAa,CAAA;AAAA,YAC1C;AAGA,YAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,YAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,eAAA,CAAgB,KAAA;AAAA,cAC5C,MAAA;AAAA,cACA;AAAA,aACF;AACA,YAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAG/B,YAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,YAAA,CAAa,QAAQ,CAAA;AACxC,YAAA,MAAM,IAAA,GAAO,aAAA;AAAA,cACX,SAAA;AAAA,cACA,KAAA,CAAM,WAAA;AAAA,cACN,KAAA,CAAM;AAAA,aACR;AAEA,YAAA,IAAA,CAAK,YAAA,CAAa,MAAA;AAAA,cAChB;AAAA,gBACE,MAAA,EAAQ,KAAK,OAAA,CAAQ,MAAA;AAAA,gBACrB,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,gBAClC,QAAA,EAAU,QAAA;AAAA,gBACV,KAAA,EAAO,SAAA;AAAA,gBACP,aAAa,KAAA,CAAM,WAAA;AAAA,gBACnB,cAAc,KAAA,CAAM,YAAA;AAAA,gBACpB,SAAA;AAAA,gBACA,UAAU;AAAC,eACb;AAAA,cACA,IAAA,CAAK;AAAA,aACP;AAEA,YAAA,IAAA,CAAK,cAAA,CAAe,gBAAA;AAAA,cAClB,KAAK,OAAA,CAAQ,KAAA;AAAA,cACb,SAAA;AAAA,cACA;AAAA,aACF;AAGA,YAAA,IAAI,KAAK,QAAA,EAAU;AACjB,cAAA,IAAA,CAAK,SAAS,UAAA,CAAW;AAAA,gBACvB,QAAA,EAAU,KAAA;AAAA,gBACV,aAAa,KAAA,CAAM,WAAA;AAAA,gBACnB,cAAc,KAAA,CAAM,YAAA;AAAA,gBACpB,OAAA,EAAS;AAAA,eACV,CAAA;AAAA,YACH;AAEA,YAAA,OAAO,QAAA;AAAA,UACT,CAAA;AAAA,QACF;AACA,QAAA,OAAO,OAAA,CAAQ,GAAA,CAAI,MAAA,EAAQ,IAAA,EAAM,QAAQ,CAAA;AAAA,MAC3C;AAAA,KACD,CAAA;AAAA,EACH;AACF;;;AClOA,SAAS,eAAe,MAAA,EAAgC;AACtD,EAAA,MAAM,GAAA,GAAM,MAAA;AACZ,EAAA,IAAI,IAAI,MAAM,CAAA,IAAK,OAAO,GAAA,CAAI,MAAM,MAAM,QAAA,EAAU;AAClD,IAAA,MAAM,IAAA,GAAO,IAAI,MAAM,CAAA;AACvB,IAAA,IAAI,IAAA,CAAK,aAAa,CAAA,EAAG,OAAO,QAAA;AAAA,EAClC;AACA,EAAA,IAAI,IAAI,UAAU,CAAA,IAAK,OAAO,GAAA,CAAI,UAAU,MAAM,QAAA,EAAU;AAC1D,IAAA,OAAO,WAAA;AAAA,EACT;AACA,EAAA,IAAI,OAAO,GAAA,CAAI,oBAAoB,CAAA,KAAM,UAAA,EAAY;AACnD,IAAA,OAAO,QAAA;AAAA,EACT;AACA,EAAA,OAAO,IAAA;AACT;AAKO,SAAS,uBAAA,CACd,QACA,SAAA,EACA,MAAA,EACA,eACA,WAAA,EACA,UAAA,EACA,aACA,OAAA,EACc;AACd,EAAA,MAAM,YAAA,GAAe,eAAe,MAAM,CAAA;AAE1C,EAAA,QAAQ,YAAA;AAAc,IACpB,KAAK,QAAA;AACH,MAAA,OAAO,IAAI,cAAA;AAAA,QACT,SAAA;AAAA,QACA,MAAA;AAAA,QACA,aAAA;AAAA,QACA,WAAA;AAAA,QACA,UAAA;AAAA,QACA,WAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF,KAAK,WAAA;AACH,MAAA,OAAO,IAAI,iBAAA;AAAA,QACT,SAAA;AAAA,QACA,MAAA;AAAA,QACA,aAAA;AAAA,QACA,WAAA;AAAA,QACA,UAAA;AAAA,QACA,WAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF,KAAK,QAAA;AACH,MAAA,OAAO,IAAI,cAAA;AAAA,QACT,SAAA;AAAA,QACA,MAAA;AAAA,QACA,aAAA;AAAA,QACA,WAAA;AAAA,QACA,UAAA;AAAA,QACA,WAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AACE,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,oHAAA;AAAA,OAEF;AAAA;AAEN;;;AChDO,IAAM,iBAAN,MAAqB;AAAA,EACjB,SAAA;AAAA,EACT,eAAA;AAAA,EACS,OAAA;AAAA,EACA,MAAA;AAAA,EACA,WAAA;AAAA,EACA,aAAA;AAAA,EAED,gBAAA,GAAmB,CAAA;AAAA,EACnB,eAAA,GAAkB,CAAA;AAAA,EAClB,sBAAA,GAAyB,CAAA;AAAA,EACzB,OAAA,GAAiD,QAAA;AAAA,EACjD,kBAAA;AAAA,EACA,SAA8B,EAAC;AAAA,EAEvC,YAAY,OAAA,EAAyB;AACnC,IAAA,IAAA,CAAK,YAAY,OAAA,CAAQ,SAAA;AACzB,IAAA,IAAA,CAAK,kBAAkB,OAAA,CAAQ,eAAA;AAC/B,IAAA,IAAA,CAAK,UAAU,OAAA,CAAQ,OAAA;AACvB,IAAA,IAAA,CAAK,SAAS,OAAA,CAAQ,MAAA;AACtB,IAAA,IAAA,CAAK,cAAc,OAAA,CAAQ,WAAA;AAC3B,IAAA,IAAA,CAAK,gBAAgB,OAAA,CAAQ,aAAA;AAAA,EAC/B;AAAA;AAAA,EAIA,IAAI,eAAA,GAA0B;AAC5B,IAAA,OAAO,IAAA,CAAK,gBAAA;AAAA,EACd;AAAA,EAEA,IAAI,cAAA,GAAyB;AAC3B,IAAA,OAAO,IAAA,CAAK,eAAA;AAAA,EACd;AAAA,EAEA,IAAI,MAAA,GAAiB;AACnB,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EACd;AAAA,EAEA,IAAI,iBAAA,GAAwC;AAC1C,IAAA,OAAO,IAAA,CAAK,kBAAA;AAAA,EACd;AAAA,EAEA,IAAI,KAAA,GAAsC;AACxC,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACd;AAAA,EAEA,IAAI,eAAA,GAAsC;AACxC,IAAA,IAAI,IAAA,CAAK,WAAA,KAAgB,MAAA,EAAW,OAAO,MAAA;AAC3C,IAAA,OAAO,KAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,WAAA,GAAc,KAAK,gBAAgB,CAAA;AAAA,EAC7D;AAAA,EAEA,IAAI,mBAAA,GAA0C;AAC5C,IAAA,IAAI,IAAA,CAAK,aAAA,KAAkB,MAAA,EAAW,OAAO,MAAA;AAC7C,IAAA,OAAO,KAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,aAAA,GAAgB,KAAK,eAAe,CAAA;AAAA,EAC9D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,aAAa,aAAA,EAA6B;AACxC,IAAA,IAAI,IAAA,CAAK,gBAAgB,MAAA,EAAW;AAClC,MAAA,IAAI,IAAA,CAAK,gBAAA,GAAmB,aAAA,GAAgB,IAAA,CAAK,WAAA,EAAa;AAC5D,QAAA,IAAA,CAAK,OAAA,GAAU,YAAA;AACf,QAAA,IAAA,CAAK,kBAAA,GAAqB,iBAAA;AAC1B,QAAA,MAAM,IAAI,0BAAA;AAAA,UACR,2CAA2C,IAAA,CAAK,gBAAA,CAAiB,OAAA,CAAQ,CAAC,CAAC,CAAA,cAAA,EAAiB,aAAA,CAAc,OAAA,CAAQ,CAAC,CAAC,CAAA,UAAA,EAAa,IAAA,CAAK,WAAA,CAAY,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA;AAAA,UAC5J,IAAA,CAAK,SAAA;AAAA,UACL,IAAA,CAAK,gBAAA;AAAA,UACL,IAAA,CAAK;AAAA,SACP;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAI,IAAA,CAAK,kBAAkB,MAAA,EAAW;AACpC,MAAA,IAAI,IAAA,CAAK,eAAA,GAAkB,CAAA,GAAI,IAAA,CAAK,aAAA,EAAe;AACjD,QAAA,IAAA,CAAK,OAAA,GAAU,YAAA;AACf,QAAA,IAAA,CAAK,kBAAA,GAAqB,0BAAA;AAC1B,QAAA,MAAM,IAAI,kCAAA;AAAA,UACR,qCAAqC,IAAA,CAAK,eAAA,GAAkB,CAAC,CAAA,GAAA,EAAM,KAAK,aAAa,CAAA,CAAA;AAAA,UACrF,IAAA,CAAK,SAAA;AAAA,UACL,IAAA,CAAK,eAAA;AAAA,UACL,IAAA,CAAK;AAAA,SACP;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,OAAA,EAMW;AACpB,IAAA,IAAA,CAAK,eAAA,EAAA;AACL,IAAA,IAAA,CAAK,oBAAoB,OAAA,CAAQ,OAAA;AACjC,IAAA,IAAA,CAAK,0BAA0B,OAAA,CAAQ,WAAA;AAEvC,IAAA,MAAM,MAAA,GAA4B;AAAA,MAChC,cAAc,IAAA,CAAK,eAAA;AAAA,MACnB,UAAU,OAAA,CAAQ,QAAA;AAAA,MAClB,UAAU,OAAA,CAAQ,QAAA;AAAA,MAClB,aAAa,OAAA,CAAQ,WAAA;AAAA,MACrB,cAAc,OAAA,CAAQ,YAAA;AAAA,MACtB,uBAAuB,IAAA,CAAK,sBAAA;AAAA,MAC5B,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,mBAAmB,IAAA,CAAK,gBAAA;AAAA,MACxB,SAAA,sBAAe,IAAA;AAAK,KACtB;AAEA,IAAA,IAAA,CAAK,MAAA,CAAO,KAAK,MAAM,CAAA;AACvB,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,CAAM,SAAS,WAAA,EAAmB;AAChC,IAAA,IAAA,CAAK,OAAA,GAAU,MAAA,KAAW,WAAA,GAAc,WAAA,GAAc,YAAA;AACtD,IAAA,IAAA,CAAK,kBAAA,GAAqB,MAAA;AAAA,EAC5B;AACF;;;ACxDO,IAAM,SAAA,GAAN,MAAM,UAAA,CAAU;AAAA,EACrB,OAAe,SAAA,GAAsC,IAAA;AAAA;AAAA,EAG7C,WAAA,GAAc;AAAA,EAAC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMvB,aAAa,KAAK,OAAA,EAA8C;AAC9D,IAAA,IAAI,WAAU,SAAA,EAAW;AAEvB,MAAA,UAAA,CAAU,SAAA,CAAU,YAAY,aAAA,EAAc;AAC9C,MAAA,UAAA,CAAU,SAAA,CAAU,YAAY,eAAA,EAAgB;AAChD,MAAA,UAAA,CAAU,SAAA,CAAU,OAAO,KAAA,EAAM;AAAA,IACnC;AAEA,IAAA,MAAM,MAAA,GAAS,IAAI,eAAA,CAAgB,OAAO,CAAA;AAC1C,IAAA,MAAM,MAAA,GAAS,IAAI,eAAA,CAAgB,MAAM,CAAA;AAGzC,IAAA,IAAI;AACF,MAAA,MAAM,kBAAA,CAAmB,MAAA,CAAO,OAAA,EAAS,MAAA,CAAO,MAAM,CAAA;AAAA,IACxD,CAAA,CAAA,MAAQ;AACN,MAAA,OAAA,CAAQ,KAAK,wFAAwF,CAAA;AAAA,IACvG;AAEA,IAAA,MAAM,aAAA,GAAgB,IAAI,aAAA,CAAc,MAAA,CAAO,cAAc,CAAA;AAC7D,IAAA,MAAM,WAAA,GAAc,IAAI,WAAA,CAAY,MAAA,CAAO,cAAc,CAAA;AACzD,IAAA,MAAM,UAAA,GAAa,IAAI,UAAA,EAAW;AAClC,IAAA,MAAM,WAAA,GAAc,IAAI,sBAAA,CAAuB,EAAA,EAAI,EAAE,CAAA;AAGrD,IAAA,WAAA,CAAY,cAAA,CAAe,MAAA,EAAQ,MAAA,CAAO,eAAe,CAAA;AAGzD,IAAA,WAAA,CAAY,gBAAA,CAAiB,MAAA,CAAO,OAAA,EAAS,MAAA,CAAO,MAAM,CAAA;AAE1D,IAAA,UAAA,CAAU,SAAA,GAAY;AAAA,MACpB,MAAA;AAAA,MACA,MAAA;AAAA,MACA,aAAA;AAAA,MACA,WAAA;AAAA,MACA,UAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,IAAA,CAAQ,MAAA,EAAW,OAAA,EAA6B;AACrD,IAAA,MAAM,IAAA,GAAO,WAAU,gBAAA,EAAiB;AACxC,IAAA,MAAM,QAAA,GAAW,uBAAA;AAAA,MACf,MAAA;AAAA,MACA,IAAA,CAAK,MAAA;AAAA,MACL,IAAA,CAAK,MAAA;AAAA,MACL,IAAA,CAAK,aAAA;AAAA,MACL,IAAA,CAAK,WAAA;AAAA,MACL,IAAA,CAAK,UAAA;AAAA,MACL,IAAA,CAAK,WAAA;AAAA,MACL;AAAA,KACF;AACA,IAAA,OAAO,QAAA,CAAS,KAAK,MAAM,CAAA;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,OAAO,UACL,OAAA,EAC+D;AAC/D,IAAA,MAAM,IAAA,GAAO,WAAU,gBAAA,EAAiB;AAExC,IAAA,OAAO,CAA8C,EAAA,KAAiB;AACpE,MAAA,MAAM,OAAA,GAAU,UAAU,IAAA,KAAsC;AAE9D,QAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,UAAA,MAAM,aAAA,GAAgB,aAAA,CAAc,OAAA,CAAQ,KAAA,EAAO,KAAK,GAAG,CAAA;AAC3D,UAAA,OAAA,CAAQ,OAAA,CAAQ,aAAa,aAAa,CAAA;AAAA,QAC5C;AAEA,QAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,QAAA,MAAM,MAAA,GAAS,MAAM,EAAA,CAAG,GAAG,IAAI,CAAA;AAC/B,QAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAG/B,QAAA,IAAA,CAAK,WAAA,CAAY,MAAA;AAAA,UACf;AAAA,YACE,MAAA,EAAQ,KAAK,MAAA,CAAO,MAAA;AAAA,YACpB,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,YAClC,QAAA,EAAW,QAAQ,QAAA,IAAY,QAAA;AAAA,YAC/B,OAAO,OAAA,CAAQ,KAAA;AAAA,YACf,SAAS,OAAA,CAAQ,OAAA;AAAA,YACjB,WAAA,EAAa,CAAA;AAAA,YACb,YAAA,EAAc,CAAA;AAAA,YACd,SAAA;AAAA,YACA,UAAU;AAAC,WACb;AAAA,UACA,IAAA,CAAK;AAAA,SACP;AAGA,QAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,UAAA,OAAA,CAAQ,QAAQ,UAAA,CAAW;AAAA,YACzB,QAAA,EAAU,KAAA;AAAA,YACV,WAAA,EAAa,CAAA;AAAA,YACb,YAAA,EAAc,CAAA;AAAA,YACd,OAAA,EAAS;AAAA,WACV,CAAA;AAAA,QACH;AAEA,QAAA,OAAO,MAAA;AAAA,MACT,CAAA;AAEA,MAAA,OAAO,OAAA;AAAA,IACT,CAAA;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,WAAA,CACX,KAAA,EACA,EAAA,EAC8B;AAC9B,IAAA,MAAM,IAAA,GAAO,WAAU,gBAAA,EAAiB;AACxC,IAAA,OAAO,IAAA,CAAK,aAAA,CAAc,KAAA,CAAM,IAAA,CAAK,MAAA,EAAQ,IAAA,CAAK,MAAA,CAAO,KAAA,EAAO,CAAA,EAAG,KAAK,CAAA,CAAA,EAAI,EAAE,IAAI,CAAC,CAAA;AAAA,EACrF;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,QAAA,CACX,KAAA,EACA,OAAA,EACsB;AACtB,IAAA,MAAM,IAAA,GAAO,WAAU,gBAAA,EAAiB;AACxC,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,MAAA,CAAO,eAAA;AAAA,MAC/B,KAAA,KAAU,cAAA,GAAiB,IAAA,CAAK,MAAA,CAAO,KAAA,GAAQ;AAAA,KACjD;AACA,IAAA,OAAO;AAAA,MACL,eAAe,MAAA,CAAO,aAAA;AAAA,MACtB,gBAAgB,MAAA,CAAO,cAAA;AAAA,MACvB,gBAAgB,MAAA,CAAO,cAAA;AAAA,MACvB,UAAU,MAAA,CAAO;AAAA,KACnB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,aAAa,YAAA,CAAa,OAAA,GAMtB,EAAC,EAA4B;AAC/B,IAAA,MAAM,IAAA,GAAO,WAAU,gBAAA,EAAiB;AACxC,IAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,SAAA,IAAa,MAAA,CAAO,UAAA,EAAW;AAEzD,IAAA,IAAI,eAAA;AACJ,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,MAAA,CAAO,aAAA,CAAc;AAAA,QAC/C,MAAA,EAAQ,KAAK,MAAA,CAAO,MAAA;AAAA,QACpB,SAAA;AAAA,QACA,SAAS,OAAA,CAAQ,OAAA;AAAA,QACjB,QAAQ,OAAA,CAAQ,MAAA;AAAA,QAChB,aAAa,OAAA,CAAQ,WAAA;AAAA,QACrB,eAAe,OAAA,CAAQ;AAAA,OACxB,CAAA;AACD,MAAA,eAAA,GAAkB,QAAA,CAAS,EAAA;AAAA,IAC7B,CAAA,CAAA,MAAQ;AACN,MAAA,OAAA,CAAQ,KAAK,yDAAyD,CAAA;AAAA,IACxE;AAEA,IAAA,OAAO,IAAI,cAAA,CAAe;AAAA,MACxB,SAAA;AAAA,MACA,eAAA;AAAA,MACA,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,QAAQ,OAAA,CAAQ,MAAA;AAAA,MAChB,aAAa,OAAA,CAAQ,WAAA;AAAA,MACrB,eAAe,OAAA,CAAQ;AAAA,KACxB,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,YAAA,CACX,OAAA,EACA,MAAA,GAAS,WAAA,EACM;AACf,IAAA,MAAM,IAAA,GAAO,WAAU,gBAAA,EAAiB;AACxC,IAAA,OAAA,CAAQ,MAAM,MAAM,CAAA;AAEpB,IAAA,IAAI,QAAQ,eAAA,EAAiB;AAC3B,MAAA,IAAI;AACF,QAAA,MAAM,IAAA,CAAK,MAAA,CAAO,YAAA,CAAa,OAAA,CAAQ,eAAA,EAAiB;AAAA,UACtD,MAAA,EAAQ,KAAK,MAAA,CAAO,MAAA;AAAA,UACpB,QAAQ,OAAA,CAAQ,MAAA;AAAA,UAChB,mBAAmB,OAAA,CAAQ,iBAAA;AAAA,UAC3B,eAAe,OAAA,CAAQ,eAAA;AAAA,UACvB,qBAAqB,OAAA,CAAQ;AAAA,SAC9B,CAAA;AAAA,MACH,CAAA,CAAA,MAAQ;AACN,QAAA,OAAA,CAAQ,KAAK,wDAAwD,CAAA;AAAA,MACvE;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,QAAQ,IAAA,EAAkC;AACrD,IAAA,MAAM,IAAA,GAAO,WAAU,gBAAA,EAAiB;AACxC,IAAA,OAAO,IAAA,CAAK,UAAA,CAAW,IAAA,CAAK,IAAI,CAAA;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,KAAA,GAAuB;AAClC,IAAA,MAAM,IAAA,GAAO,WAAU,gBAAA,EAAiB;AACxC,IAAA,MAAM,IAAA,CAAK,WAAA,CAAY,KAAA,CAAM,IAAA,CAAK,MAAM,CAAA;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,QAAA,GAA0B;AACrC,IAAA,IAAI,CAAC,WAAU,SAAA,EAAW;AAE1B,IAAA,MAAM,OAAO,UAAA,CAAU,SAAA;AACvB,IAAA,IAAA,CAAK,YAAY,aAAA,EAAc;AAC/B,IAAA,IAAA,CAAK,YAAY,eAAA,EAAgB;AACjC,IAAA,MAAM,IAAA,CAAK,WAAA,CAAY,KAAA,CAAM,IAAA,CAAK,MAAM,CAAA;AACxC,IAAA,IAAA,CAAK,cAAc,KAAA,EAAM;AACzB,IAAA,IAAA,CAAK,OAAO,KAAA,EAAM;AAClB,IAAA,UAAA,CAAU,SAAA,GAAY,IAAA;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAKA,OAAe,gBAAA,GAAsC;AACnD,IAAA,IAAI,CAAC,WAAU,SAAA,EAAW;AACxB,MAAA,MAAM,IAAI,kBAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AACA,IAAA,OAAO,UAAA,CAAU,SAAA;AAAA,EACnB;AACF","file":"index.mjs","sourcesContent":["import { z } from \"zod\";\n\n/** Actions that can be taken when a budget threshold is reached. */\nexport const BudgetAction = z.enum([\"alert\", \"throttle\", \"block\"]);\nexport type BudgetAction = z.infer<typeof BudgetAction>;\n\n/** Scope levels for budget policies. */\nexport const BudgetScope = z.enum([\n \"organization\",\n \"feature\",\n \"environment\",\n \"custom\",\n]);\nexport type BudgetScope = z.infer<typeof BudgetScope>;\n\n/** Time periods for budget policies. */\nexport const BudgetPeriod = z.enum([\"daily\", \"weekly\", \"monthly\", \"custom\"]);\nexport type BudgetPeriod = z.infer<typeof BudgetPeriod>;\n\n/** Supported AI providers. */\nexport const Provider = z.enum([\n \"openai\",\n \"anthropic\",\n \"google\",\n \"aws_bedrock\",\n \"cohere\",\n \"mistral\",\n]);\nexport type Provider = z.infer<typeof Provider>;\n","import { z } from \"zod\";\nimport { BudgetAction } from \"./models/common.js\";\n\n/**\n * Zod schema for ModelCost initialization options.\n * Validates all configuration fields and applies defaults.\n */\nexport const ModelCostInitOptionsSchema = z.object({\n apiKey: z\n .string()\n .startsWith(\"mc_\", { message: \"API key must start with 'mc_'\" })\n .describe(\"ModelCost API key\"),\n orgId: z.string().min(1, { message: \"Organization ID is required\" }),\n environment: z.string().default(\"production\"),\n baseUrl: z.string().url().default(\"https://api.modelcost.ai\"),\n monthlyBudget: z.number().positive().optional(),\n budgetAction: BudgetAction.default(\"alert\"),\n failOpen: z.boolean().default(true),\n flushIntervalMs: z.number().int().positive().default(5000),\n flushBatchSize: z.number().int().positive().default(100),\n syncIntervalMs: z.number().int().positive().default(10000),\n contentPrivacy: z.boolean().default(false),\n});\n\nexport type ModelCostInitOptions = z.input<typeof ModelCostInitOptionsSchema>;\n\n/**\n * Resolved configuration after validation and env-var fallback.\n */\nexport type ModelCostResolvedConfig = z.output<typeof ModelCostInitOptionsSchema>;\n\n/**\n * Configuration manager that validates init options and reads\n * environment variables as fallbacks.\n */\nexport class ModelCostConfig {\n public readonly apiKey: string;\n public readonly orgId: string;\n public readonly environment: string;\n public readonly baseUrl: string;\n public readonly monthlyBudget: number | undefined;\n public readonly budgetAction: z.infer<typeof BudgetAction>;\n public readonly failOpen: boolean;\n public readonly flushIntervalMs: number;\n public readonly flushBatchSize: number;\n public readonly syncIntervalMs: number;\n public readonly contentPrivacy: boolean;\n\n constructor(options: ModelCostInitOptions) {\n const merged = {\n apiKey: options.apiKey ?? process.env[\"MODELCOST_API_KEY\"],\n orgId: options.orgId ?? process.env[\"MODELCOST_ORG_ID\"],\n environment:\n options.environment ?? process.env[\"MODELCOST_ENV\"] ?? \"production\",\n baseUrl:\n options.baseUrl ??\n process.env[\"MODELCOST_BASE_URL\"] ??\n \"https://api.modelcost.ai\",\n monthlyBudget: options.monthlyBudget,\n budgetAction: options.budgetAction ?? \"alert\",\n failOpen: options.failOpen ?? true,\n flushIntervalMs: options.flushIntervalMs ?? 5000,\n flushBatchSize: options.flushBatchSize ?? 100,\n syncIntervalMs: options.syncIntervalMs ?? 10000,\n contentPrivacy:\n options.contentPrivacy ??\n (process.env[\"MODELCOST_CONTENT_PRIVACY\"] === \"true\" || false),\n };\n\n const parsed = ModelCostInitOptionsSchema.parse(merged);\n\n this.apiKey = parsed.apiKey;\n this.orgId = parsed.orgId;\n this.environment = parsed.environment;\n this.baseUrl = parsed.baseUrl;\n this.monthlyBudget = parsed.monthlyBudget;\n this.budgetAction = parsed.budgetAction;\n this.failOpen = parsed.failOpen;\n this.flushIntervalMs = parsed.flushIntervalMs;\n this.flushBatchSize = parsed.flushBatchSize;\n this.syncIntervalMs = parsed.syncIntervalMs;\n this.contentPrivacy = parsed.contentPrivacy;\n }\n}\n","export const VERSION = \"0.1.0\";\n","import type { DetectedViolation } from \"./models/governance.js\";\n\n/**\n * Base error class for all ModelCost SDK errors.\n */\nexport class ModelCostError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"ModelCostError\";\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/**\n * Thrown when the SDK is misconfigured (invalid API key, missing org ID, etc.).\n */\nexport class ConfigurationError extends ModelCostError {\n constructor(message: string) {\n super(message);\n this.name = \"ConfigurationError\";\n }\n}\n\n/**\n * Thrown when a request is blocked because the budget has been exceeded.\n */\nexport class BudgetExceededError extends ModelCostError {\n public readonly remainingBudget: number;\n public readonly scope: string;\n public readonly overrideUrl?: string;\n\n constructor(\n message: string,\n remainingBudget: number,\n scope: string,\n overrideUrl?: string,\n ) {\n super(message);\n this.name = \"BudgetExceededError\";\n this.remainingBudget = remainingBudget;\n this.scope = scope;\n this.overrideUrl = overrideUrl;\n }\n}\n\n/**\n * Thrown when the client is rate-limited by the ModelCost API.\n */\nexport class RateLimitedError extends ModelCostError {\n public readonly retryAfterSeconds: number;\n public readonly limitDimension: string;\n\n constructor(\n message: string,\n retryAfterSeconds: number,\n limitDimension: string,\n ) {\n super(message);\n this.name = \"RateLimitedError\";\n this.retryAfterSeconds = retryAfterSeconds;\n this.limitDimension = limitDimension;\n }\n}\n\n/**\n * Thrown when PII is detected in scanned text and the policy requires blocking.\n */\nexport class PiiDetectedError extends ModelCostError {\n public readonly detectedEntities: DetectedViolation[];\n public readonly redactedText: string;\n\n constructor(\n message: string,\n detectedEntities: DetectedViolation[],\n redactedText: string,\n ) {\n super(message);\n this.name = \"PiiDetectedError\";\n this.detectedEntities = detectedEntities;\n this.redactedText = redactedText;\n }\n}\n\n/**\n * Thrown when a session's spend budget has been exceeded.\n */\nexport class SessionBudgetExceededError extends ModelCostError {\n public readonly sessionId: string;\n public readonly currentSpend: number;\n public readonly maxSpend: number;\n\n constructor(\n message: string,\n sessionId: string,\n currentSpend: number,\n maxSpend: number,\n ) {\n super(message);\n this.name = \"SessionBudgetExceededError\";\n this.sessionId = sessionId;\n this.currentSpend = currentSpend;\n this.maxSpend = maxSpend;\n }\n}\n\n/**\n * Thrown when a session's iteration limit has been exceeded.\n */\nexport class SessionIterationLimitExceededError extends ModelCostError {\n public readonly sessionId: string;\n public readonly currentIterations: number;\n public readonly maxIterations: number;\n\n constructor(\n message: string,\n sessionId: string,\n currentIterations: number,\n maxIterations: number,\n ) {\n super(message);\n this.name = \"SessionIterationLimitExceededError\";\n this.sessionId = sessionId;\n this.currentIterations = currentIterations;\n this.maxIterations = maxIterations;\n }\n}\n\n/**\n * Thrown when the ModelCost API returns an error response.\n */\nexport class ModelCostApiError extends ModelCostError {\n public readonly statusCode: number;\n public readonly errorCode: string;\n\n constructor(message: string, statusCode: number, errorCode: string) {\n super(message);\n this.name = \"ModelCostApiError\";\n this.statusCode = statusCode;\n this.errorCode = errorCode;\n }\n}\n","import { z } from \"zod\";\nimport { Provider } from \"./common.js\";\n\n/**\n * Schema for tracking an AI API call.\n * API uses snake_case; we transform to camelCase for SDK consumers.\n */\nexport const TrackRequestSchema = z.object({\n apiKey: z.string().min(1),\n timestamp: z.string().datetime(),\n provider: Provider,\n model: z.string().min(1),\n feature: z.string().optional(),\n customerId: z.string().optional(),\n inputTokens: z.number().int().min(0),\n outputTokens: z.number().int().min(0),\n latencyMs: z.number().int().optional(),\n metadata: z.record(z.unknown()).optional(),\n});\n\nexport type TrackRequest = z.infer<typeof TrackRequestSchema>;\n\n/**\n * Converts a camelCase TrackRequest into the snake_case body the API expects.\n */\nexport function trackRequestToApi(request: TrackRequest): Record<string, unknown> {\n return {\n api_key: request.apiKey,\n timestamp: request.timestamp,\n provider: request.provider,\n model: request.model,\n feature: request.feature ?? null,\n customer_id: request.customerId ?? null,\n input_tokens: request.inputTokens,\n output_tokens: request.outputTokens,\n latency_ms: request.latencyMs ?? null,\n metadata: request.metadata ?? null,\n };\n}\n\n/** Schema for the track API response. */\nexport const TrackResponseSchema = z.object({\n status: z.literal(\"ok\"),\n});\n\nexport type TrackResponse = z.infer<typeof TrackResponseSchema>;\n","import { z } from \"zod\";\n\n// ─── Request types ────────────────────────────────────────────────────\n\nexport interface CreateSessionRequest {\n apiKey: string;\n sessionId: string;\n feature?: string;\n userId?: string;\n maxSpendUsd?: number;\n maxIterations?: number;\n}\n\nexport interface RecordSessionCallRequest {\n apiKey: string;\n callSequence: number;\n callType: string;\n toolName?: string;\n inputTokens: number;\n outputTokens: number;\n cumulativeInputTokens: number;\n costUsd: number;\n cumulativeCostUsd: number;\n piiDetected: boolean;\n}\n\nexport interface CloseSessionRequest {\n apiKey: string;\n status: string;\n terminationReason?: string;\n finalSpendUsd: number;\n finalIterationCount: number;\n}\n\n// ─── Response types ───────────────────────────────────────────────────\n\nexport interface CreateSessionResponse {\n id: string;\n sessionId: string;\n status: string;\n maxSpendUsd?: number;\n maxIterations?: number;\n}\n\n/** Schema for the create-session API response (snake_case -> camelCase). */\nexport const CreateSessionResponseSchema = z\n .object({\n id: z.string(),\n session_id: z.string(),\n status: z.string(),\n max_spend_usd: z.number().nullable().optional(),\n max_iterations: z.number().nullable().optional(),\n })\n .transform((raw) => ({\n id: raw.id,\n sessionId: raw.session_id,\n status: raw.status,\n maxSpendUsd: raw.max_spend_usd ?? undefined,\n maxIterations: raw.max_iterations ?? undefined,\n }));\n\n// ─── Conversion functions (camelCase -> snake_case for API) ───────────\n\nexport function createSessionRequestToApi(\n req: CreateSessionRequest,\n): Record<string, unknown> {\n return {\n api_key: req.apiKey,\n session_id: req.sessionId,\n feature: req.feature,\n user_id: req.userId,\n max_spend_usd: req.maxSpendUsd,\n max_iterations: req.maxIterations,\n };\n}\n\nexport function recordSessionCallRequestToApi(\n req: RecordSessionCallRequest,\n): Record<string, unknown> {\n return {\n api_key: req.apiKey,\n call_sequence: req.callSequence,\n call_type: req.callType,\n tool_name: req.toolName,\n input_tokens: req.inputTokens,\n output_tokens: req.outputTokens,\n cumulative_input_tokens: req.cumulativeInputTokens,\n cost_usd: req.costUsd,\n cumulative_cost_usd: req.cumulativeCostUsd,\n pii_detected: req.piiDetected,\n };\n}\n\nexport function closeSessionRequestToApi(\n req: CloseSessionRequest,\n): Record<string, unknown> {\n return {\n api_key: req.apiKey,\n status: req.status,\n termination_reason: req.terminationReason,\n final_spend_usd: req.finalSpendUsd,\n final_iteration_count: req.finalIterationCount,\n };\n}\n","import { z } from \"zod\";\nimport { BudgetAction, BudgetPeriod, BudgetScope } from \"./common.js\";\n\n/**\n * Schema for budget check API response (snake_case from API -> camelCase).\n */\nexport const BudgetCheckResponseSchema = z\n .object({\n allowed: z.boolean(),\n action: z.string().nullable(),\n throttle_percentage: z.number().nullable(),\n reason: z.string().nullable(),\n })\n .transform((data) => ({\n allowed: data.allowed,\n action: data.action,\n throttlePercentage: data.throttle_percentage,\n reason: data.reason,\n }));\n\nexport type BudgetCheckResponse = z.output<typeof BudgetCheckResponseSchema>;\n\n/**\n * Schema for a single budget policy (snake_case from API -> camelCase).\n */\nexport const BudgetPolicySchema = z\n .object({\n id: z.string(),\n name: z.string(),\n scope: BudgetScope,\n scope_identifier: z.string().nullable(),\n budget_amount_usd: z.number(),\n period: BudgetPeriod,\n custom_period_days: z.number().int().nullable(),\n action: BudgetAction,\n throttle_percentage: z.number().nullable(),\n alert_thresholds: z.array(z.number().int()).nullable(),\n current_spend_usd: z.number(),\n spend_percentage: z.number(),\n period_start: z.string(),\n is_active: z.boolean(),\n created_at: z.string(),\n updated_at: z.string(),\n })\n .transform((data) => ({\n id: data.id,\n name: data.name,\n scope: data.scope,\n scopeIdentifier: data.scope_identifier,\n budgetAmountUsd: data.budget_amount_usd,\n period: data.period,\n customPeriodDays: data.custom_period_days,\n action: data.action,\n throttlePercentage: data.throttle_percentage,\n alertThresholds: data.alert_thresholds,\n currentSpendUsd: data.current_spend_usd,\n spendPercentage: data.spend_percentage,\n periodStart: data.period_start,\n isActive: data.is_active,\n createdAt: data.created_at,\n updatedAt: data.updated_at,\n }));\n\nexport type BudgetPolicy = z.output<typeof BudgetPolicySchema>;\n\n/**\n * Schema for the budget status API response (snake_case from API -> camelCase).\n */\nexport const BudgetStatusResponseSchema = z\n .object({\n policies: z.array(BudgetPolicySchema),\n total_budget_usd: z.number(),\n total_spend_usd: z.number(),\n policies_at_risk: z.number().int(),\n })\n .transform((data) => ({\n policies: data.policies,\n totalBudgetUsd: data.total_budget_usd,\n totalSpendUsd: data.total_spend_usd,\n policiesAtRisk: data.policies_at_risk,\n }));\n\nexport type BudgetStatusResponse = z.output<typeof BudgetStatusResponseSchema>;\n","import { z } from \"zod\";\n\n/**\n * Schema for a governance scan request (camelCase -> snake_case for API).\n */\nexport const GovernanceScanRequestSchema = z.object({\n orgId: z.string().min(1),\n text: z.string().min(1),\n feature: z.string().optional(),\n environment: z.string().optional(),\n});\n\nexport type GovernanceScanRequest = z.infer<typeof GovernanceScanRequestSchema>;\n\n/**\n * Converts a camelCase GovernanceScanRequest to the snake_case body the API expects.\n */\nexport function governanceScanRequestToApi(\n request: GovernanceScanRequest,\n): Record<string, unknown> {\n return {\n org_id: request.orgId,\n text: request.text,\n feature: request.feature ?? null,\n environment: request.environment ?? null,\n };\n}\n\n/**\n * Schema for a detected violation (snake_case from API -> camelCase).\n */\nexport const DetectedViolationSchema = z.object({\n type: z.string(),\n subtype: z.string(),\n severity: z.enum([\"low\", \"medium\", \"high\"]),\n start: z.number().int(),\n end: z.number().int(),\n});\n\nexport type DetectedViolation = z.infer<typeof DetectedViolationSchema>;\n\n/**\n * Schema for the governance scan API response (snake_case from API -> camelCase).\n */\nexport const GovernanceScanResponseSchema = z\n .object({\n is_allowed: z.boolean(),\n action: z.string().nullable(),\n violations: z.array(DetectedViolationSchema),\n redacted_text: z.string().nullable(),\n })\n .transform((data) => ({\n isAllowed: data.is_allowed,\n action: data.action,\n violations: data.violations,\n redactedText: data.redacted_text,\n }));\n\nexport type GovernanceScanResponse = z.output<\n typeof GovernanceScanResponseSchema\n>;\n\n/**\n * Request to report a governance signal in metadata-only mode.\n * No raw content is included — only classification signals.\n */\nexport interface GovernanceSignalRequest {\n organizationId: string;\n violationType: string;\n violationSubtype?: string;\n severity: string;\n userId?: string;\n feature?: string;\n environment?: string;\n actionTaken: string;\n wasAllowed: boolean;\n detectedAt?: string;\n source: string;\n violationCount?: number;\n}\n\n/**\n * Converts a GovernanceSignalRequest to the snake_case body the API expects.\n */\nexport function governanceSignalRequestToApi(\n request: GovernanceSignalRequest,\n): Record<string, unknown> {\n return {\n organization_id: request.organizationId,\n violation_type: request.violationType,\n violation_subtype: request.violationSubtype ?? null,\n severity: request.severity,\n user_id: request.userId ?? null,\n feature: request.feature ?? null,\n environment: request.environment ?? null,\n action_taken: request.actionTaken,\n was_allowed: request.wasAllowed,\n detected_at: request.detectedAt ?? null,\n source: request.source,\n violation_count: request.violationCount ?? 1,\n };\n}\n","import { VERSION } from \"./version.js\";\nimport type { ModelCostConfig } from \"./config.js\";\nimport { ModelCostApiError, ModelCostError } from \"./errors.js\";\nimport {\n type TrackRequest,\n type TrackResponse,\n TrackResponseSchema,\n trackRequestToApi,\n} from \"./models/track.js\";\nimport {\n type CreateSessionRequest,\n type CreateSessionResponse,\n CreateSessionResponseSchema,\n createSessionRequestToApi,\n type RecordSessionCallRequest,\n recordSessionCallRequestToApi,\n type CloseSessionRequest,\n closeSessionRequestToApi,\n} from \"./models/session.js\";\nimport {\n type BudgetCheckResponse,\n BudgetCheckResponseSchema,\n type BudgetStatusResponse,\n BudgetStatusResponseSchema,\n} from \"./models/budget.js\";\nimport {\n type GovernanceScanRequest,\n type GovernanceScanResponse,\n GovernanceScanResponseSchema,\n governanceScanRequestToApi,\n type GovernanceSignalRequest,\n governanceSignalRequestToApi,\n} from \"./models/governance.js\";\n\nconst CIRCUIT_BREAKER_THRESHOLD = 3;\nconst CIRCUIT_BREAKER_COOLDOWN_MS = 60_000;\n\n/**\n * Low-level HTTP client for the ModelCost API.\n * Uses native fetch, implements circuit breaker, and supports fail-open semantics.\n */\nexport class ModelCostClient {\n private readonly _baseUrl: string;\n private readonly _apiKey: string;\n private readonly _headers: Record<string, string>;\n private readonly _failOpen: boolean;\n\n /** Circuit breaker state */\n private _consecutiveFailures = 0;\n private _circuitOpenUntil = 0;\n\n constructor(config: ModelCostConfig) {\n this._baseUrl = config.baseUrl.replace(/\\/+$/, \"\");\n this._apiKey = config.apiKey;\n this._failOpen = config.failOpen;\n this._headers = {\n \"Content-Type\": \"application/json\",\n \"X-API-Key\": this._apiKey,\n \"User-Agent\": `modelcost-node/${VERSION}`,\n };\n }\n\n /**\n * Record a tracked AI API call.\n */\n async track(request: TrackRequest): Promise<TrackResponse> {\n const body = trackRequestToApi(request);\n const data = await this._post(\"/api/v1/track\", body);\n return TrackResponseSchema.parse(data);\n }\n\n /**\n * Pre-flight budget check before making an AI call.\n */\n async checkBudget(\n orgId: string,\n feature: string,\n estimatedCost: number,\n ): Promise<BudgetCheckResponse> {\n const params = new URLSearchParams({\n org_id: orgId,\n feature,\n estimated_cost: estimatedCost.toString(),\n });\n const data = await this._post(`/api/v1/budgets/check?${params.toString()}`, {});\n return BudgetCheckResponseSchema.parse(data);\n }\n\n /**\n * Scan text for PII and governance violations.\n */\n async scanText(\n request: GovernanceScanRequest,\n ): Promise<GovernanceScanResponse> {\n const body = governanceScanRequestToApi(request);\n const data = await this._post(\"/api/v1/governance/scan\", body);\n return GovernanceScanResponseSchema.parse(data);\n }\n\n /**\n * Report a governance signal (metadata-only mode).\n * Sends classification signals without raw content.\n */\n async reportSignal(request: GovernanceSignalRequest): Promise<void> {\n const body = governanceSignalRequestToApi(request);\n await this._post(\"/api/v1/governance/signals\", body);\n }\n\n /**\n * Get current budget status for an organization.\n */\n async getBudgetStatus(orgId: string): Promise<BudgetStatusResponse> {\n const params = new URLSearchParams({ org_id: orgId });\n const data = await this._get(`/api/v1/budgets/status?${params.toString()}`);\n return BudgetStatusResponseSchema.parse(data);\n }\n\n /**\n * Create a new agent session on the server.\n */\n async createSession(\n request: CreateSessionRequest,\n ): Promise<CreateSessionResponse> {\n const body = createSessionRequestToApi(request);\n const data = await this._post(\"/api/v1/sessions\", body);\n return CreateSessionResponseSchema.parse(data);\n }\n\n /**\n * Record a call within an existing session.\n */\n async recordSessionCall(\n sessionId: string,\n request: RecordSessionCallRequest,\n ): Promise<void> {\n const body = recordSessionCallRequestToApi(request);\n await this._post(`/api/v1/sessions/${sessionId}/calls`, body);\n }\n\n /**\n * Close an existing session on the server.\n */\n async closeSession(\n sessionId: string,\n request: CloseSessionRequest,\n ): Promise<void> {\n const body = closeSessionRequestToApi(request);\n await this._post(`/api/v1/sessions/${sessionId}/close`, body);\n }\n\n /**\n * Close the client (cleanup resources).\n */\n close(): void {\n this._consecutiveFailures = 0;\n this._circuitOpenUntil = 0;\n }\n\n // ─── Private helpers ───────────────────────────────────────────────\n\n private _isCircuitOpen(): boolean {\n if (this._consecutiveFailures < CIRCUIT_BREAKER_THRESHOLD) {\n return false;\n }\n if (Date.now() >= this._circuitOpenUntil) {\n // Cooldown has elapsed; allow a probe request\n this._consecutiveFailures = 0;\n return false;\n }\n return true;\n }\n\n private _recordSuccess(): void {\n this._consecutiveFailures = 0;\n }\n\n private _recordFailure(): void {\n this._consecutiveFailures++;\n if (this._consecutiveFailures >= CIRCUIT_BREAKER_THRESHOLD) {\n this._circuitOpenUntil = Date.now() + CIRCUIT_BREAKER_COOLDOWN_MS;\n }\n }\n\n private async _post(\n path: string,\n body: Record<string, unknown>,\n ): Promise<unknown> {\n return this._request(\"POST\", path, body);\n }\n\n private async _get(path: string): Promise<unknown> {\n return this._request(\"GET\", path);\n }\n\n private async _request(\n method: string,\n path: string,\n body?: Record<string, unknown>,\n ): Promise<unknown> {\n if (this._isCircuitOpen()) {\n if (this._failOpen) {\n console.warn(\n `[ModelCost] Circuit breaker open — skipping ${method} ${path}`,\n );\n return this._failOpenDefault(path);\n }\n throw new ModelCostError(\n `Circuit breaker is open after ${CIRCUIT_BREAKER_THRESHOLD} consecutive failures`,\n );\n }\n\n try {\n const url = `${this._baseUrl}${path}`;\n const init: RequestInit = {\n method,\n headers: this._headers,\n };\n if (body !== undefined && method !== \"GET\") {\n init.body = JSON.stringify(body);\n }\n\n const response = await fetch(url, init);\n\n if (!response.ok) {\n const errorBody = (await response.json().catch(() => ({\n error: \"unknown\",\n message: response.statusText,\n }))) as { error?: string; message?: string };\n this._recordFailure();\n\n const err = new ModelCostApiError(\n errorBody.message ?? `HTTP ${response.status}`,\n response.status,\n errorBody.error ?? \"unknown\",\n );\n\n if (this._failOpen) {\n console.warn(\n `[ModelCost] API error (fail-open): ${err.message}`,\n );\n return this._failOpenDefault(path);\n }\n throw err;\n }\n\n const data: unknown = await response.json();\n this._recordSuccess();\n return data;\n } catch (error) {\n if (error instanceof ModelCostApiError) {\n throw error;\n }\n\n this._recordFailure();\n\n if (this._failOpen) {\n console.warn(\n `[ModelCost] Request failed (fail-open): ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n return this._failOpenDefault(path);\n }\n\n throw new ModelCostError(\n `Request to ${path} failed: ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n }\n\n /**\n * Returns a safe default response when operating in fail-open mode.\n */\n private _failOpenDefault(path: string): unknown {\n if (path.includes(\"/budgets/check\")) {\n return {\n allowed: true,\n action: null,\n throttle_percentage: null,\n reason: \"fail-open: API unavailable\",\n };\n }\n if (path.includes(\"/budgets/status\")) {\n return {\n policies: [],\n total_budget_usd: 0,\n total_spend_usd: 0,\n policies_at_risk: 0,\n };\n }\n if (path.includes(\"/governance/scan\")) {\n return {\n is_allowed: true,\n action: null,\n violations: [],\n redacted_text: null,\n };\n }\n if (path.includes(\"/sessions\")) {\n return { id: \"fail-open\", session_id: \"fail-open\", status: \"active\" };\n }\n // Default for /track\n return { status: \"ok\" };\n }\n}\n","import type { ModelCostClient } from \"./client.js\";\nimport type {\n BudgetCheckResponse,\n BudgetStatusResponse,\n} from \"./models/budget.js\";\n\n/**\n * Manages budget state with local caching and periodic sync.\n * Keeps an in-memory cache of budget status to avoid hitting the API\n * on every call, while still staying in sync with the server.\n */\nexport class BudgetManager {\n private _cache: Map<string, BudgetStatusResponse> = new Map();\n private _lastSync: number = 0;\n private readonly _syncIntervalMs: number;\n\n constructor(syncIntervalMs: number) {\n this._syncIntervalMs = syncIntervalMs;\n }\n\n /**\n * Check whether a request with the given estimated cost is allowed.\n * Uses the local cache if fresh, otherwise syncs from the API first.\n */\n async check(\n client: ModelCostClient,\n orgId: string,\n feature: string,\n estimatedCost: number,\n ): Promise<BudgetCheckResponse> {\n if (this._isStale()) {\n await this.sync(client, orgId);\n }\n\n // Always defer to the server for the authoritative check\n return client.checkBudget(orgId, feature, estimatedCost);\n }\n\n /**\n * Sync the budget status from the server and populate the local cache.\n */\n async sync(client: ModelCostClient, orgId: string): Promise<void> {\n const status = await client.getBudgetStatus(orgId);\n this._cache.set(orgId, status);\n this._lastSync = Date.now();\n }\n\n /**\n * Optimistically update local spend after a tracked call,\n * so subsequent budget checks reflect the estimated spend\n * without waiting for the next server sync.\n */\n updateLocalSpend(orgId: string, _feature: string, cost: number): void {\n const cached = this._cache.get(orgId);\n if (!cached) {\n return;\n }\n\n // Update aggregate spend\n const updated: BudgetStatusResponse = {\n ...cached,\n totalSpendUsd: cached.totalSpendUsd + cost,\n policies: cached.policies.map((policy) => ({\n ...policy,\n currentSpendUsd: policy.currentSpendUsd + cost,\n spendPercentage:\n policy.budgetAmountUsd > 0\n ? ((policy.currentSpendUsd + cost) / policy.budgetAmountUsd) * 100\n : policy.spendPercentage,\n })),\n };\n\n this._cache.set(orgId, updated);\n }\n\n /**\n * Get the cached budget status for an org, if available.\n */\n getCached(orgId: string): BudgetStatusResponse | undefined {\n return this._cache.get(orgId);\n }\n\n /**\n * Clear all cached state.\n */\n clear(): void {\n this._cache.clear();\n this._lastSync = 0;\n }\n\n private _isStale(): boolean {\n return Date.now() - this._lastSync > this._syncIntervalMs;\n }\n}\n","import type { ModelCostClient } from \"./client.js\";\nimport type { TrackRequest } from \"./models/track.js\";\nimport type { ModelPricing } from \"./models/cost.js\";\n\n// ---------------------------------------------------------------------------\n// Pricing table — starts empty, populated from server API on init.\n// ---------------------------------------------------------------------------\n\n/** Mutable internal map; rewritten by syncPricingFromApi. */\nconst _modelPricing: Map<string, ModelPricing> = new Map();\n\n/**\n * Known model pricing table (cost per 1,000 tokens in USD).\n * Starts empty, populated from server API on init.\n */\nexport const MODEL_PRICING: ReadonlyMap<string, ModelPricing> = _modelPricing;\n\n/**\n * Fetch the latest pricing table from the server and update the local cache.\n * Called on SDK init and periodically by the background sync timer.\n */\nexport async function syncPricingFromApi(\n baseUrl: string,\n apiKey: string,\n): Promise<void> {\n try {\n const url = `${baseUrl.replace(/\\/+$/, \"\")}/api/v1/pricing/models`;\n const response = await fetch(url, {\n headers: { \"X-API-Key\": apiKey },\n });\n if (!response.ok) {\n return;\n }\n const data = (await response.json()) as {\n models?: Array<{\n model: string;\n provider: string;\n input_cost_per_1k: number;\n output_cost_per_1k: number;\n }>;\n };\n const models = data.models ?? [];\n if (models.length === 0) {\n return;\n }\n _modelPricing.clear();\n for (const entry of models) {\n _modelPricing.set(entry.model, {\n provider: entry.provider,\n model: entry.model,\n inputCostPer1k: entry.input_cost_per_1k,\n outputCostPer1k: entry.output_cost_per_1k,\n });\n }\n } catch {\n // Silently fall back to local table\n }\n}\n\n/**\n * Calculate the cost of an AI call based on token counts and known pricing.\n * Returns 0 if the model is not found in the pricing table.\n */\nexport function calculateCost(\n model: string,\n inputTokens: number,\n outputTokens: number,\n): number {\n const pricing = MODEL_PRICING.get(model);\n if (!pricing) {\n return 0;\n }\n\n const inputCost = (inputTokens / 1000) * pricing.inputCostPer1k;\n const outputCost = (outputTokens / 1000) * pricing.outputCostPer1k;\n return inputCost + outputCost;\n}\n\n/**\n * Buffers track requests and periodically flushes them to the API.\n */\nexport class CostTracker {\n private _buffer: TrackRequest[] = [];\n private _flushTimer: ReturnType<typeof setInterval> | null = null;\n private _pricingSyncTimer: ReturnType<typeof setInterval> | null = null;\n private readonly _batchSize: number;\n\n constructor(batchSize: number) {\n this._batchSize = batchSize;\n }\n\n /**\n * Add a track request to the buffer.\n * Automatically flushes when buffer reaches batch size.\n */\n record(request: TrackRequest, client?: ModelCostClient): void {\n this._buffer.push(request);\n if (this._buffer.length >= this._batchSize && client) {\n void this.flush(client);\n }\n }\n\n /**\n * Flush all buffered track requests to the API.\n */\n async flush(client: ModelCostClient): Promise<void> {\n if (this._buffer.length === 0) {\n return;\n }\n\n const batch = this._buffer.splice(0, this._buffer.length);\n\n const promises = batch.map((request) =>\n client.track(request).catch((error: unknown) => {\n console.warn(\n `[ModelCost] Failed to track request: ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }),\n );\n\n await Promise.allSettled(promises);\n }\n\n /**\n * Start automatic periodic flushing.\n */\n startAutoFlush(client: ModelCostClient, intervalMs: number): void {\n this.stopAutoFlush();\n this._flushTimer = setInterval(() => {\n void this.flush(client);\n }, intervalMs);\n\n // Ensure the timer doesn't prevent process exit\n if (this._flushTimer && typeof this._flushTimer === \"object\" && \"unref\" in this._flushTimer) {\n this._flushTimer.unref();\n }\n }\n\n /**\n * Stop automatic periodic flushing.\n */\n stopAutoFlush(): void {\n if (this._flushTimer !== null) {\n clearInterval(this._flushTimer);\n this._flushTimer = null;\n }\n }\n\n private static readonly _PRICING_SYNC_INTERVAL_MS = 300_000; // 5 minutes\n\n /**\n * Start periodic pricing sync from the server.\n */\n startPricingSync(baseUrl: string, apiKey: string): void {\n this.stopPricingSync();\n this._pricingSyncTimer = setInterval(() => {\n void syncPricingFromApi(baseUrl, apiKey);\n }, CostTracker._PRICING_SYNC_INTERVAL_MS);\n\n if (this._pricingSyncTimer && typeof this._pricingSyncTimer === \"object\" && \"unref\" in this._pricingSyncTimer) {\n this._pricingSyncTimer.unref();\n }\n }\n\n /**\n * Stop periodic pricing sync.\n */\n stopPricingSync(): void {\n if (this._pricingSyncTimer !== null) {\n clearInterval(this._pricingSyncTimer);\n this._pricingSyncTimer = null;\n }\n }\n\n /**\n * Get the current number of buffered requests.\n */\n get bufferSize(): number {\n return this._buffer.length;\n }\n}\n","/**\n * Result of a PII scan on a text string.\n */\nexport interface PiiEntity {\n type: string;\n value: string;\n start: number;\n end: number;\n}\n\nexport interface PiiResult {\n detected: boolean;\n entities: PiiEntity[];\n redactedText: string;\n}\n\n/**\n * A governance violation detected by the full scanner.\n */\nexport interface GovernanceViolation {\n category: string;\n type: string;\n severity: string;\n start: number;\n end: number;\n}\n\n/**\n * Result of a full governance scan across all categories.\n */\nexport interface FullScanResult {\n detected: boolean;\n violations: GovernanceViolation[];\n categories: string[];\n}\n\n/**\n * Pre-compiled regex patterns for common PII types.\n */\nconst PII_PATTERNS: ReadonlyArray<{ type: string; pattern: RegExp }> = [\n {\n type: \"ssn\",\n pattern: /\\b\\d{3}-\\d{2}-\\d{4}\\b/g,\n },\n {\n type: \"credit_card_visa\",\n pattern: /\\b4\\d{3}[- ]?\\d{4}[- ]?\\d{4}[- ]?\\d{4}\\b/g,\n },\n {\n type: \"credit_card_mastercard\",\n pattern: /\\b5[1-5]\\d{2}[- ]?\\d{4}[- ]?\\d{4}[- ]?\\d{4}\\b/g,\n },\n {\n type: \"credit_card_amex\",\n pattern: /\\b3[47]\\d{2}[- ]?\\d{6}[- ]?\\d{5}\\b/g,\n },\n {\n type: \"credit_card_discover\",\n pattern: /\\b6(?:011|5\\d{2})[- ]?\\d{4}[- ]?\\d{4}[- ]?\\d{4}\\b/g,\n },\n {\n type: \"email\",\n pattern: /\\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}\\b/g,\n },\n {\n type: \"phone_us\",\n pattern:\n /\\b(?:\\+?1[-.\\s]?)?(?:\\(?\\d{3}\\)?[-.\\s]?)\\d{3}[-.\\s]?\\d{4}\\b/g,\n },\n];\n\n/**\n * Credit card pattern for Luhn-validated matching (all card types).\n */\nconst CREDIT_CARD_GENERIC_PATTERN =\n /\\b\\d{4}[\\s-]?\\d{4}[\\s-]?\\d{4}[\\s-]?\\d{4}\\b/g;\n\n/**\n * Secrets detection patterns.\n */\nconst SECRETS_PATTERNS: ReadonlyArray<{\n type: string;\n pattern: RegExp;\n severity: string;\n}> = [\n {\n type: \"api_key_openai\",\n pattern: /sk-[a-zA-Z0-9]{20,}/g,\n severity: \"critical\",\n },\n {\n type: \"api_key_aws\",\n pattern: /AKIA[0-9A-Z]{16}/g,\n severity: \"critical\",\n },\n {\n type: \"private_key\",\n pattern: /-----BEGIN (?:RSA |EC |DSA )?PRIVATE KEY-----/g,\n severity: \"critical\",\n },\n {\n type: \"jwt_token\",\n pattern:\n /eyJ[A-Za-z0-9_-]{10,}\\.eyJ[A-Za-z0-9_-]{10,}\\.[A-Za-z0-9_-]{10,}/g,\n severity: \"high\",\n },\n {\n type: \"generic_secret\",\n pattern:\n /(?:password|api_key|apikey|secret|token|bearer)\\s*[:=]\\s*[\"']?([A-Za-z0-9_\\-/.]{8,})[\"']?/gi,\n severity: \"critical\",\n },\n];\n\n/**\n * Financial detection patterns.\n */\nconst FINANCIAL_PATTERNS: ReadonlyArray<{\n type: string;\n pattern: RegExp;\n severity: string;\n}> = [\n {\n type: \"iban\",\n pattern: /\\b[A-Z]{2}\\d{2}[A-Z0-9]{4}\\d{7}([A-Z0-9]?){0,16}\\b/g,\n severity: \"high\",\n },\n];\n\n/**\n * Medical terms used to identify PHI context.\n * When these appear alongside PII, the combination is classified as PHI.\n */\nconst MEDICAL_TERMS: ReadonlySet<string> = new Set([\n \"diabetes\",\n \"hiv\",\n \"aids\",\n \"cancer\",\n \"tumor\",\n \"disease\",\n \"medication\",\n \"diagnosis\",\n \"treatment\",\n \"surgery\",\n \"prescription\",\n \"patient\",\n \"doctor\",\n \"hospital\",\n \"clinic\",\n \"medical record\",\n \"insulin\",\n \"prozac\",\n \"chemotherapy\",\n \"depression\",\n \"anxiety\",\n \"bipolar\",\n \"schizophrenia\",\n \"hepatitis\",\n \"tuberculosis\",\n \"epilepsy\",\n \"asthma\",\n \"arthritis\",\n \"alzheimer\",\n]);\n\n/**\n * Local PII scanner using regex pattern matching.\n *\n * Provides a fast, offline first-pass for PII detection before\n * optionally deferring to the server-side governance scan.\n *\n * Also provides full governance scanning (PII, PHI, secrets, financial)\n * for metadata-only mode where content never leaves the customer's environment.\n */\nexport class PiiScanner {\n /**\n * Scan text and return all detected PII entities, plus a redacted version.\n */\n scan(text: string): PiiResult {\n const entities: PiiEntity[] = [];\n\n for (const { type, pattern } of PII_PATTERNS) {\n // Reset regex state for each scan\n const regex = new RegExp(pattern.source, pattern.flags);\n let match: RegExpExecArray | null;\n\n while ((match = regex.exec(text)) !== null) {\n // Luhn-validate credit card matches\n if (type.startsWith(\"credit_card_\")) {\n const digits = match[0].replace(/[\\s-]/g, \"\");\n if (!PiiScanner._isValidLuhn(digits)) continue;\n }\n\n entities.push({\n type,\n value: match[0],\n start: match.index,\n end: match.index + match[0].length,\n });\n }\n }\n\n // Sort by start position for deterministic output\n entities.sort((a, b) => a.start - b.start);\n\n // Remove overlapping matches (keep the first/longest at each position)\n const deduped = this._removeOverlaps(entities);\n\n const redactedText = this._redactText(text, deduped);\n\n return {\n detected: deduped.length > 0,\n entities: deduped,\n redactedText,\n };\n }\n\n /**\n * Full governance scan across multiple categories.\n * Used in metadata-only mode where content never leaves the customer's environment.\n */\n fullScan(\n text: string,\n categories: string[] = [\"pii\", \"phi\", \"secrets\", \"financial\"],\n ): FullScanResult {\n const violations: GovernanceViolation[] = [];\n const detectedCategories = new Set<string>();\n\n if (categories.includes(\"pii\")) {\n const piiViolations = this._scanPiiViolations(text);\n for (const v of piiViolations) {\n violations.push(v);\n detectedCategories.add(\"pii\");\n }\n }\n\n if (categories.includes(\"phi\")) {\n const phiViolations = this._scanPhi(text);\n for (const v of phiViolations) {\n violations.push(v);\n detectedCategories.add(\"phi\");\n }\n }\n\n if (categories.includes(\"secrets\")) {\n const secretViolations = this._scanSecrets(text);\n for (const v of secretViolations) {\n violations.push(v);\n detectedCategories.add(\"secrets\");\n }\n }\n\n if (categories.includes(\"financial\")) {\n const financialViolations = this._scanFinancial(text);\n for (const v of financialViolations) {\n violations.push(v);\n detectedCategories.add(\"financial\");\n }\n }\n\n return {\n detected: violations.length > 0,\n violations,\n categories: [...detectedCategories],\n };\n }\n\n /**\n * Convenience method: return only the redacted text.\n */\n redact(text: string): string {\n return this.scan(text).redactedText;\n }\n\n // ─── Category Scanners ──────────────────────────────────────────────\n\n private _scanPiiViolations(text: string): GovernanceViolation[] {\n const violations: GovernanceViolation[] = [];\n\n // SSN\n for (const match of text.matchAll(/\\b\\d{3}-\\d{2}-\\d{4}\\b/g)) {\n violations.push({\n category: \"pii\",\n type: \"ssn\",\n severity: \"critical\",\n start: match.index!,\n end: match.index! + match[0].length,\n });\n }\n\n // Email\n for (const match of text.matchAll(\n /\\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}\\b/g,\n )) {\n violations.push({\n category: \"pii\",\n type: \"email\",\n severity: \"high\",\n start: match.index!,\n end: match.index! + match[0].length,\n });\n }\n\n // Credit card (Luhn-validated)\n for (const match of text.matchAll(CREDIT_CARD_GENERIC_PATTERN)) {\n const digits = match[0].replace(/[\\s-]/g, \"\");\n if (PiiScanner._isValidLuhn(digits)) {\n violations.push({\n category: \"pii\",\n type: \"credit_card\",\n severity: \"critical\",\n start: match.index!,\n end: match.index! + match[0].length,\n });\n }\n }\n\n // Phone\n for (const match of text.matchAll(\n /\\b(?:\\+?1[-.\\s]?)?(?:\\(?\\d{3}\\)?[-.\\s]?)\\d{3}[-.\\s]?\\d{4}\\b/g,\n )) {\n violations.push({\n category: \"pii\",\n type: \"phone\",\n severity: \"medium\",\n start: match.index!,\n end: match.index! + match[0].length,\n });\n }\n\n return violations;\n }\n\n private _scanPhi(text: string): GovernanceViolation[] {\n const textLower = text.toLowerCase();\n let hasMedicalContext = false;\n\n for (const term of MEDICAL_TERMS) {\n if (textLower.includes(term)) {\n hasMedicalContext = true;\n break;\n }\n }\n\n if (!hasMedicalContext) return [];\n\n // Medical context + PII = PHI violation\n const piiViolations = this._scanPiiViolations(text);\n return piiViolations.map((v) => ({\n ...v,\n category: \"phi\",\n type: `phi_${v.type}`,\n severity: \"critical\",\n }));\n }\n\n private _scanSecrets(text: string): GovernanceViolation[] {\n const violations: GovernanceViolation[] = [];\n\n for (const { type, pattern, severity } of SECRETS_PATTERNS) {\n const regex = new RegExp(pattern.source, pattern.flags);\n let match: RegExpExecArray | null;\n\n while ((match = regex.exec(text)) !== null) {\n violations.push({\n category: \"secrets\",\n type,\n severity,\n start: match.index,\n end: match.index + match[0].length,\n });\n }\n }\n\n return violations;\n }\n\n private _scanFinancial(text: string): GovernanceViolation[] {\n const violations: GovernanceViolation[] = [];\n\n // Credit card (Luhn-validated)\n for (const match of text.matchAll(CREDIT_CARD_GENERIC_PATTERN)) {\n const digits = match[0].replace(/[\\s-]/g, \"\");\n if (PiiScanner._isValidLuhn(digits)) {\n violations.push({\n category: \"financial\",\n type: \"credit_card\",\n severity: \"critical\",\n start: match.index!,\n end: match.index! + match[0].length,\n });\n }\n }\n\n // IBAN\n for (const { type, pattern, severity } of FINANCIAL_PATTERNS) {\n const regex = new RegExp(pattern.source, pattern.flags);\n let match: RegExpExecArray | null;\n\n while ((match = regex.exec(text)) !== null) {\n violations.push({\n category: \"financial\",\n type,\n severity,\n start: match.index,\n end: match.index + match[0].length,\n });\n }\n }\n\n return violations;\n }\n\n // ─── Utilities ──────────────────────────────────────────────────────\n\n /**\n * Remove overlapping entities, preferring the one that starts first\n * (and is longest in case of a tie).\n */\n private _removeOverlaps(entities: PiiEntity[]): PiiEntity[] {\n if (entities.length === 0) return entities;\n\n const result: PiiEntity[] = [entities[0]!];\n\n for (let i = 1; i < entities.length; i++) {\n const current = entities[i]!;\n const last = result[result.length - 1]!;\n\n if (current.start >= last.end) {\n result.push(current);\n } else if (\n current.start === last.start &&\n current.end > last.end\n ) {\n result[result.length - 1] = current;\n }\n }\n\n return result;\n }\n\n /**\n * Replace detected entities with [REDACTED] markers.\n */\n private _redactText(text: string, entities: PiiEntity[]): string {\n if (entities.length === 0) return text;\n\n let result = \"\";\n let cursor = 0;\n\n for (const entity of entities) {\n result += text.slice(cursor, entity.start);\n result += `[${entity.type.toUpperCase()}]`;\n cursor = entity.end;\n }\n\n result += text.slice(cursor);\n return result;\n }\n\n /**\n * Luhn algorithm for credit card validation.\n */\n static _isValidLuhn(number: string): boolean {\n if (number.length < 13 || number.length > 19) return false;\n\n let sum = 0;\n let alternate = false;\n\n for (let i = number.length - 1; i >= 0; i--) {\n const char = number[i]!;\n if (char < \"0\" || char > \"9\") return false;\n\n let n = parseInt(char, 10);\n if (alternate) {\n n *= 2;\n if (n > 9) n -= 9;\n }\n sum += n;\n alternate = !alternate;\n }\n\n return sum % 10 === 0;\n }\n}\n","import { RateLimitedError } from \"./errors.js\";\n\n/**\n * Token-bucket rate limiter.\n *\n * Allows `burst` tokens to be consumed immediately, and refills at `rate`\n * tokens per second. Useful for throttling outbound API calls.\n */\nexport class TokenBucketRateLimiter {\n private _tokens: number;\n private _lastRefill: number;\n private readonly _rate: number;\n private readonly _burst: number;\n private readonly _strict: boolean;\n\n /**\n * @param rate - Tokens refilled per second\n * @param burst - Maximum tokens (bucket capacity)\n * @param strict - If true, `allow()` throws RateLimitedError instead of returning false\n */\n constructor(rate: number, burst: number, strict = false) {\n this._rate = rate;\n this._burst = burst;\n this._tokens = burst;\n this._lastRefill = Date.now();\n this._strict = strict;\n }\n\n /**\n * Attempt to consume one token.\n * Returns true if allowed, false if rate-limited.\n * In strict mode, throws RateLimitedError instead of returning false.\n */\n allow(): boolean {\n this._refill();\n\n if (this._tokens >= 1) {\n this._tokens -= 1;\n return true;\n }\n\n if (this._strict) {\n const retryAfter = Math.ceil((1 - this._tokens) / this._rate);\n throw new RateLimitedError(\n `Rate limit exceeded. Retry after ${retryAfter}s.`,\n retryAfter,\n \"token_bucket\",\n );\n }\n\n return false;\n }\n\n /**\n * Wait until a token is available, then consume it.\n * Resolves immediately if a token is available now.\n */\n async wait(): Promise<void> {\n this._refill();\n\n if (this._tokens >= 1) {\n this._tokens -= 1;\n return;\n }\n\n // Calculate how long until 1 token is available\n const deficit = 1 - this._tokens;\n const waitMs = Math.ceil((deficit / this._rate) * 1000);\n\n await new Promise<void>((resolve) => setTimeout(resolve, waitMs));\n this._refill();\n this._tokens -= 1;\n }\n\n /**\n * Get the current number of available tokens (for inspection/testing).\n */\n get availableTokens(): number {\n this._refill();\n return this._tokens;\n }\n\n private _refill(): void {\n const now = Date.now();\n const elapsed = (now - this._lastRefill) / 1000;\n this._tokens = Math.min(this._burst, this._tokens + elapsed * this._rate);\n this._lastRefill = now;\n }\n}\n","import type { BaseProvider, ExtractedUsage } from \"./base.js\";\nimport type { ModelCostClient } from \"../client.js\";\nimport type { ModelCostConfig } from \"../config.js\";\nimport { BudgetExceededError, PiiDetectedError } from \"../errors.js\";\nimport { BudgetManager } from \"../budget.js\";\nimport { CostTracker, calculateCost } from \"../tracking.js\";\nimport { PiiScanner } from \"../pii.js\";\nimport { TokenBucketRateLimiter } from \"../rate-limiter.js\";\nimport type { Provider } from \"../models/common.js\";\nimport type { SessionContext } from \"../session.js\";\n\n/**\n * Typings for the subset of the OpenAI client we interact with.\n * We use structural typing so the SDK does not depend on the openai package.\n */\ninterface OpenAIUsage {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens?: number;\n}\n\ninterface OpenAIChatResponse {\n usage?: OpenAIUsage;\n model?: string;\n [key: string]: unknown;\n}\n\ninterface OpenAIChatCompletions {\n create: (...args: unknown[]) => Promise<OpenAIChatResponse>;\n}\n\ninterface OpenAIChat {\n completions: OpenAIChatCompletions;\n}\n\ninterface OpenAILikeClient {\n chat: OpenAIChat;\n [key: string]: unknown;\n}\n\n/**\n * Provider wrapper for OpenAI-compatible clients.\n *\n * Intercepts `client.chat.completions.create()` calls to:\n * 1. Run a budget pre-check\n * 2. Scan prompt messages for PII\n * 3. Enforce rate limits\n * 4. Extract usage from the response and record the cost\n */\nexport class OpenAIProvider implements BaseProvider {\n private readonly _client: ModelCostClient;\n private readonly _config: ModelCostConfig;\n private readonly _budgetManager: BudgetManager;\n private readonly _costTracker: CostTracker;\n private readonly _piiScanner: PiiScanner;\n private readonly _rateLimiter: TokenBucketRateLimiter;\n private readonly _session?: SessionContext;\n\n constructor(\n apiClient: ModelCostClient,\n config: ModelCostConfig,\n budgetManager: BudgetManager,\n costTracker: CostTracker,\n piiScanner: PiiScanner,\n rateLimiter: TokenBucketRateLimiter,\n session?: SessionContext,\n ) {\n this._client = apiClient;\n this._config = config;\n this._budgetManager = budgetManager;\n this._costTracker = costTracker;\n this._piiScanner = piiScanner;\n this._rateLimiter = rateLimiter;\n this._session = session;\n }\n\n getProviderName(): string {\n return \"openai\";\n }\n\n extractUsage(response: unknown): ExtractedUsage {\n const res = response as OpenAIChatResponse;\n return {\n inputTokens: res.usage?.prompt_tokens ?? 0,\n outputTokens: res.usage?.completion_tokens ?? 0,\n };\n }\n\n wrap(client: unknown): unknown {\n const openaiClient = client as OpenAILikeClient;\n const self = this;\n\n // Create a proxy for the chat.completions object\n const completionsProxy = new Proxy(openaiClient.chat.completions, {\n get(target, prop, receiver) {\n if (prop === \"create\") {\n return async (...args: unknown[]) => {\n const params = (args[0] ?? {}) as Record<string, unknown>;\n const model = (params[\"model\"] as string) ?? \"unknown\";\n\n // 1. Rate limit check\n await self._rateLimiter.wait();\n\n // 2. PII / governance scan on messages\n const messages = params[\"messages\"] as\n | Array<{ content?: string }>\n | undefined;\n if (messages) {\n for (const msg of messages) {\n if (typeof msg.content === \"string\") {\n const scanResult = self._piiScanner.scan(msg.content);\n if (scanResult.detected) {\n if (self._config.contentPrivacy) {\n // Metadata-only mode: full local classification, never send raw content\n const fullResult = self._piiScanner.fullScan(msg.content);\n\n if (fullResult.detected) {\n // Report signals asynchronously (fire-and-forget)\n for (const violation of fullResult.violations) {\n self._client\n .reportSignal({\n organizationId: self._config.orgId,\n violationType: violation.category,\n violationSubtype: violation.type,\n severity: violation.severity,\n environment: self._config.environment,\n actionTaken: \"block\",\n wasAllowed: false,\n detectedAt: new Date().toISOString(),\n source: \"metadata_only\",\n violationCount: 1,\n })\n .catch(() => {}); // fire-and-forget\n }\n\n throw new PiiDetectedError(\n \"Sensitive content detected and blocked locally (metadata-only mode)\",\n fullResult.violations.map((v) => ({\n type: v.category,\n subtype: v.type,\n severity: v.severity as \"low\" | \"medium\" | \"high\",\n start: v.start,\n end: v.end,\n })),\n self._piiScanner.redact(msg.content),\n );\n }\n } else {\n // Standard mode: check governance policy server-side\n const govResult = await self._client.scanText({\n orgId: self._config.orgId,\n text: msg.content,\n environment: self._config.environment,\n });\n\n if (!govResult.isAllowed) {\n throw new PiiDetectedError(\n \"PII detected in request and blocked by policy\",\n govResult.violations,\n govResult.redactedText ?? scanResult.redactedText,\n );\n }\n }\n }\n }\n }\n }\n\n // 3. Budget pre-check\n const estimatedCost = calculateCost(model, 500, 500); // estimate\n const budgetCheck = await self._budgetManager.check(\n self._client,\n self._config.orgId,\n (params[\"feature\"] as string) ?? \"default\",\n estimatedCost,\n );\n\n if (!budgetCheck.allowed && budgetCheck.action === \"block\") {\n throw new BudgetExceededError(\n budgetCheck.reason ?? \"Budget exceeded\",\n 0,\n \"organization\",\n );\n }\n\n // 3b. Session pre-check\n if (self._session) {\n self._session.preCallCheck(estimatedCost);\n }\n\n // 4. Execute the actual API call\n const startTime = Date.now();\n const response = await target.create.apply(target, args as never);\n const latencyMs = Date.now() - startTime;\n\n // 5. Extract usage and record\n const usage = self.extractUsage(response);\n const cost = calculateCost(\n model,\n usage.inputTokens,\n usage.outputTokens,\n );\n\n self._costTracker.record(\n {\n apiKey: self._config.apiKey,\n timestamp: new Date().toISOString(),\n provider: \"openai\" as Provider,\n model,\n inputTokens: usage.inputTokens,\n outputTokens: usage.outputTokens,\n latencyMs,\n metadata: {},\n },\n self._client,\n );\n\n // 6. Update local budget spend\n self._budgetManager.updateLocalSpend(\n self._config.orgId,\n (params[\"feature\"] as string) ?? \"default\",\n cost,\n );\n\n // 7. Session call recording\n if (self._session) {\n self._session.recordCall({\n callType: \"llm\",\n inputTokens: usage.inputTokens,\n outputTokens: usage.outputTokens,\n costUsd: cost,\n });\n }\n\n return response;\n };\n }\n return Reflect.get(target, prop, receiver);\n },\n });\n\n // Create a proxy for the chat object\n const chatProxy = new Proxy(openaiClient.chat, {\n get(target, prop, receiver) {\n if (prop === \"completions\") {\n return completionsProxy;\n }\n return Reflect.get(target, prop, receiver);\n },\n });\n\n // Create a proxy for the top-level client\n return new Proxy(openaiClient, {\n get(target, prop, receiver) {\n if (prop === \"chat\") {\n return chatProxy;\n }\n return Reflect.get(target, prop, receiver);\n },\n });\n }\n}\n","import type { BaseProvider, ExtractedUsage } from \"./base.js\";\nimport type { ModelCostClient } from \"../client.js\";\nimport type { ModelCostConfig } from \"../config.js\";\nimport { BudgetExceededError, PiiDetectedError } from \"../errors.js\";\nimport { BudgetManager } from \"../budget.js\";\nimport { CostTracker, calculateCost } from \"../tracking.js\";\nimport { PiiScanner } from \"../pii.js\";\nimport { TokenBucketRateLimiter } from \"../rate-limiter.js\";\nimport type { Provider } from \"../models/common.js\";\nimport type { SessionContext } from \"../session.js\";\n\n/**\n * Typings for the subset of the Anthropic client we interact with.\n */\ninterface AnthropicUsage {\n input_tokens: number;\n output_tokens: number;\n}\n\ninterface AnthropicMessageResponse {\n usage?: AnthropicUsage;\n model?: string;\n [key: string]: unknown;\n}\n\ninterface AnthropicMessages {\n create: (...args: unknown[]) => Promise<AnthropicMessageResponse>;\n}\n\ninterface AnthropicLikeClient {\n messages: AnthropicMessages;\n [key: string]: unknown;\n}\n\n/**\n * Provider wrapper for Anthropic clients.\n *\n * Intercepts `client.messages.create()` calls to add budget enforcement,\n * PII scanning, rate limiting, and cost tracking.\n */\nexport class AnthropicProvider implements BaseProvider {\n private readonly _client: ModelCostClient;\n private readonly _config: ModelCostConfig;\n private readonly _budgetManager: BudgetManager;\n private readonly _costTracker: CostTracker;\n private readonly _piiScanner: PiiScanner;\n private readonly _rateLimiter: TokenBucketRateLimiter;\n private readonly _session?: SessionContext;\n\n constructor(\n apiClient: ModelCostClient,\n config: ModelCostConfig,\n budgetManager: BudgetManager,\n costTracker: CostTracker,\n piiScanner: PiiScanner,\n rateLimiter: TokenBucketRateLimiter,\n session?: SessionContext,\n ) {\n this._client = apiClient;\n this._config = config;\n this._budgetManager = budgetManager;\n this._costTracker = costTracker;\n this._piiScanner = piiScanner;\n this._rateLimiter = rateLimiter;\n this._session = session;\n }\n\n getProviderName(): string {\n return \"anthropic\";\n }\n\n extractUsage(response: unknown): ExtractedUsage {\n const res = response as AnthropicMessageResponse;\n return {\n inputTokens: res.usage?.input_tokens ?? 0,\n outputTokens: res.usage?.output_tokens ?? 0,\n };\n }\n\n wrap(client: unknown): unknown {\n const anthropicClient = client as AnthropicLikeClient;\n const self = this;\n\n // Create a proxy for the messages object\n const messagesProxy = new Proxy(anthropicClient.messages, {\n get(target, prop, receiver) {\n if (prop === \"create\") {\n return async (...args: unknown[]) => {\n const params = (args[0] ?? {}) as Record<string, unknown>;\n const model = (params[\"model\"] as string) ?? \"unknown\";\n\n // 1. Rate limit\n await self._rateLimiter.wait();\n\n // 2. PII scan\n const messages = params[\"messages\"] as\n | Array<{ content?: string | Array<{ text?: string }> }>\n | undefined;\n if (messages) {\n for (const msg of messages) {\n const textContent =\n typeof msg.content === \"string\"\n ? msg.content\n : Array.isArray(msg.content)\n ? msg.content\n .map((block) => block.text ?? \"\")\n .join(\" \")\n : \"\";\n\n if (textContent) {\n const scanResult = self._piiScanner.scan(textContent);\n if (scanResult.detected) {\n if (self._config.contentPrivacy) {\n // Metadata-only mode: full local classification, never send raw content\n const fullResult = self._piiScanner.fullScan(textContent);\n\n if (fullResult.detected) {\n // Report signals asynchronously (fire-and-forget)\n for (const violation of fullResult.violations) {\n self._client\n .reportSignal({\n organizationId: self._config.orgId,\n violationType: violation.category,\n violationSubtype: violation.type,\n severity: violation.severity,\n environment: self._config.environment,\n actionTaken: \"block\",\n wasAllowed: false,\n detectedAt: new Date().toISOString(),\n source: \"metadata_only\",\n violationCount: 1,\n })\n .catch(() => {}); // fire-and-forget\n }\n\n throw new PiiDetectedError(\n \"Sensitive content detected and blocked locally (metadata-only mode)\",\n fullResult.violations.map((v) => ({\n type: v.category,\n subtype: v.type,\n severity: v.severity as \"low\" | \"medium\" | \"high\",\n start: v.start,\n end: v.end,\n })),\n self._piiScanner.redact(textContent),\n );\n }\n } else {\n // Standard mode: check governance policy server-side\n const govResult = await self._client.scanText({\n orgId: self._config.orgId,\n text: textContent,\n environment: self._config.environment,\n });\n if (!govResult.isAllowed) {\n throw new PiiDetectedError(\n \"PII detected in request and blocked by policy\",\n govResult.violations,\n govResult.redactedText ?? scanResult.redactedText,\n );\n }\n }\n }\n }\n }\n }\n\n // 3. Budget pre-check\n const estimatedCost = calculateCost(model, 500, 500);\n const budgetCheck = await self._budgetManager.check(\n self._client,\n self._config.orgId,\n (params[\"feature\"] as string) ?? \"default\",\n estimatedCost,\n );\n\n if (!budgetCheck.allowed && budgetCheck.action === \"block\") {\n throw new BudgetExceededError(\n budgetCheck.reason ?? \"Budget exceeded\",\n 0,\n \"organization\",\n );\n }\n\n // 3b. Session pre-check\n if (self._session) {\n self._session.preCallCheck(estimatedCost);\n }\n\n // 4. Execute\n const startTime = Date.now();\n const response = await target.create.apply(target, args as never);\n const latencyMs = Date.now() - startTime;\n\n // 5. Extract usage and record\n const usage = self.extractUsage(response);\n const cost = calculateCost(\n model,\n usage.inputTokens,\n usage.outputTokens,\n );\n\n self._costTracker.record(\n {\n apiKey: self._config.apiKey,\n timestamp: new Date().toISOString(),\n provider: \"anthropic\" as Provider,\n model,\n inputTokens: usage.inputTokens,\n outputTokens: usage.outputTokens,\n latencyMs,\n metadata: {},\n },\n self._client,\n );\n\n self._budgetManager.updateLocalSpend(\n self._config.orgId,\n (params[\"feature\"] as string) ?? \"default\",\n cost,\n );\n\n // 7. Session call recording\n if (self._session) {\n self._session.recordCall({\n callType: \"llm\",\n inputTokens: usage.inputTokens,\n outputTokens: usage.outputTokens,\n costUsd: cost,\n });\n }\n\n return response;\n };\n }\n return Reflect.get(target, prop, receiver);\n },\n });\n\n // Create a proxy for the top-level client\n return new Proxy(anthropicClient, {\n get(target, prop, receiver) {\n if (prop === \"messages\") {\n return messagesProxy;\n }\n return Reflect.get(target, prop, receiver);\n },\n });\n }\n}\n","import type { BaseProvider, ExtractedUsage } from \"./base.js\";\nimport type { ModelCostClient } from \"../client.js\";\nimport type { ModelCostConfig } from \"../config.js\";\nimport { BudgetExceededError, PiiDetectedError } from \"../errors.js\";\nimport { BudgetManager } from \"../budget.js\";\nimport { CostTracker, calculateCost } from \"../tracking.js\";\nimport { PiiScanner } from \"../pii.js\";\nimport { TokenBucketRateLimiter } from \"../rate-limiter.js\";\nimport type { Provider } from \"../models/common.js\";\nimport type { SessionContext } from \"../session.js\";\n\n/**\n * Typings for the subset of the Google Generative AI client we interact with.\n */\ninterface GoogleUsageMetadata {\n promptTokenCount?: number;\n candidatesTokenCount?: number;\n totalTokenCount?: number;\n}\n\ninterface GoogleGenerateContentResponse {\n response: {\n usageMetadata?: GoogleUsageMetadata;\n [key: string]: unknown;\n };\n}\n\ninterface GoogleGenerativeModel {\n generateContent: (...args: unknown[]) => Promise<GoogleGenerateContentResponse>;\n model?: string;\n [key: string]: unknown;\n}\n\ninterface GoogleAILikeClient {\n getGenerativeModel: (params: { model: string }) => GoogleGenerativeModel;\n [key: string]: unknown;\n}\n\n/**\n * Provider wrapper for Google Generative AI clients.\n *\n * Intercepts `model.generateContent()` calls returned from\n * `client.getGenerativeModel()`.\n */\nexport class GoogleProvider implements BaseProvider {\n private readonly _client: ModelCostClient;\n private readonly _config: ModelCostConfig;\n private readonly _budgetManager: BudgetManager;\n private readonly _costTracker: CostTracker;\n private readonly _piiScanner: PiiScanner;\n private readonly _rateLimiter: TokenBucketRateLimiter;\n private readonly _session?: SessionContext;\n\n constructor(\n apiClient: ModelCostClient,\n config: ModelCostConfig,\n budgetManager: BudgetManager,\n costTracker: CostTracker,\n piiScanner: PiiScanner,\n rateLimiter: TokenBucketRateLimiter,\n session?: SessionContext,\n ) {\n this._client = apiClient;\n this._config = config;\n this._budgetManager = budgetManager;\n this._costTracker = costTracker;\n this._piiScanner = piiScanner;\n this._rateLimiter = rateLimiter;\n this._session = session;\n }\n\n getProviderName(): string {\n return \"google\";\n }\n\n extractUsage(response: unknown): ExtractedUsage {\n const res = response as GoogleGenerateContentResponse;\n const metadata = res.response?.usageMetadata;\n return {\n inputTokens: metadata?.promptTokenCount ?? 0,\n outputTokens: metadata?.candidatesTokenCount ?? 0,\n };\n }\n\n wrap(client: unknown): unknown {\n const googleClient = client as GoogleAILikeClient;\n const self = this;\n\n return new Proxy(googleClient, {\n get(target, prop, receiver) {\n if (prop === \"getGenerativeModel\") {\n return (params: { model: string }) => {\n const model = target.getGenerativeModel(params);\n return self._wrapModel(model, params.model);\n };\n }\n return Reflect.get(target, prop, receiver);\n },\n });\n }\n\n private _wrapModel(\n model: GoogleGenerativeModel,\n modelName: string,\n ): GoogleGenerativeModel {\n const self = this;\n\n return new Proxy(model, {\n get(target, prop, receiver) {\n if (prop === \"generateContent\") {\n return async (...args: unknown[]) => {\n // 1. Rate limit\n await self._rateLimiter.wait();\n\n // 2. PII scan on string content\n if (typeof args[0] === \"string\") {\n const scanResult = self._piiScanner.scan(args[0]);\n if (scanResult.detected) {\n if (self._config.contentPrivacy) {\n // Metadata-only mode: full local classification, never send raw content\n const fullResult = self._piiScanner.fullScan(args[0]);\n\n if (fullResult.detected) {\n // Report signals asynchronously (fire-and-forget)\n for (const violation of fullResult.violations) {\n self._client\n .reportSignal({\n organizationId: self._config.orgId,\n violationType: violation.category,\n violationSubtype: violation.type,\n severity: violation.severity,\n environment: self._config.environment,\n actionTaken: \"block\",\n wasAllowed: false,\n detectedAt: new Date().toISOString(),\n source: \"metadata_only\",\n violationCount: 1,\n })\n .catch(() => {}); // fire-and-forget\n }\n\n throw new PiiDetectedError(\n \"Sensitive content detected and blocked locally (metadata-only mode)\",\n fullResult.violations.map((v) => ({\n type: v.category,\n subtype: v.type,\n severity: v.severity as \"low\" | \"medium\" | \"high\",\n start: v.start,\n end: v.end,\n })),\n self._piiScanner.redact(args[0]),\n );\n }\n } else {\n // Standard mode: check governance policy server-side\n const govResult = await self._client.scanText({\n orgId: self._config.orgId,\n text: args[0],\n environment: self._config.environment,\n });\n if (!govResult.isAllowed) {\n throw new PiiDetectedError(\n \"PII detected in request and blocked by policy\",\n govResult.violations,\n govResult.redactedText ?? scanResult.redactedText,\n );\n }\n }\n }\n }\n\n // 3. Budget pre-check\n const estimatedCost = calculateCost(modelName, 500, 500);\n const budgetCheck = await self._budgetManager.check(\n self._client,\n self._config.orgId,\n \"default\",\n estimatedCost,\n );\n\n if (!budgetCheck.allowed && budgetCheck.action === \"block\") {\n throw new BudgetExceededError(\n budgetCheck.reason ?? \"Budget exceeded\",\n 0,\n \"organization\",\n );\n }\n\n // 3b. Session pre-check\n if (self._session) {\n self._session.preCallCheck(estimatedCost);\n }\n\n // 4. Execute\n const startTime = Date.now();\n const response = await target.generateContent.apply(\n target,\n args as never,\n );\n const latencyMs = Date.now() - startTime;\n\n // 5. Extract and record\n const usage = self.extractUsage(response);\n const cost = calculateCost(\n modelName,\n usage.inputTokens,\n usage.outputTokens,\n );\n\n self._costTracker.record(\n {\n apiKey: self._config.apiKey,\n timestamp: new Date().toISOString(),\n provider: \"google\" as Provider,\n model: modelName,\n inputTokens: usage.inputTokens,\n outputTokens: usage.outputTokens,\n latencyMs,\n metadata: {},\n },\n self._client,\n );\n\n self._budgetManager.updateLocalSpend(\n self._config.orgId,\n \"default\",\n cost,\n );\n\n // 7. Session call recording\n if (self._session) {\n self._session.recordCall({\n callType: \"llm\",\n inputTokens: usage.inputTokens,\n outputTokens: usage.outputTokens,\n costUsd: cost,\n });\n }\n\n return response;\n };\n }\n return Reflect.get(target, prop, receiver);\n },\n });\n }\n}\n","export type { BaseProvider, ExtractedUsage } from \"./base.js\";\nexport { OpenAIProvider } from \"./openai.js\";\nexport { AnthropicProvider } from \"./anthropic.js\";\nexport { GoogleProvider } from \"./google.js\";\n\nimport type { ModelCostClient } from \"../client.js\";\nimport type { ModelCostConfig } from \"../config.js\";\nimport { BudgetManager } from \"../budget.js\";\nimport { CostTracker } from \"../tracking.js\";\nimport { PiiScanner } from \"../pii.js\";\nimport { TokenBucketRateLimiter } from \"../rate-limiter.js\";\nimport type { SessionContext } from \"../session.js\";\nimport { OpenAIProvider } from \"./openai.js\";\nimport { AnthropicProvider } from \"./anthropic.js\";\nimport { GoogleProvider } from \"./google.js\";\nimport type { BaseProvider } from \"./base.js\";\n\n/**\n * Detect the provider from a client object by duck-typing.\n */\nfunction detectProvider(client: unknown): string | null {\n const obj = client as Record<string, unknown>;\n if (obj[\"chat\"] && typeof obj[\"chat\"] === \"object\") {\n const chat = obj[\"chat\"] as Record<string, unknown>;\n if (chat[\"completions\"]) return \"openai\";\n }\n if (obj[\"messages\"] && typeof obj[\"messages\"] === \"object\") {\n return \"anthropic\";\n }\n if (typeof obj[\"getGenerativeModel\"] === \"function\") {\n return \"google\";\n }\n return null;\n}\n\n/**\n * Create the appropriate provider wrapper for a given AI client.\n */\nexport function createProviderForClient(\n client: unknown,\n apiClient: ModelCostClient,\n config: ModelCostConfig,\n budgetManager: BudgetManager,\n costTracker: CostTracker,\n piiScanner: PiiScanner,\n rateLimiter: TokenBucketRateLimiter,\n session?: SessionContext,\n): BaseProvider {\n const providerName = detectProvider(client);\n\n switch (providerName) {\n case \"openai\":\n return new OpenAIProvider(\n apiClient,\n config,\n budgetManager,\n costTracker,\n piiScanner,\n rateLimiter,\n session,\n );\n case \"anthropic\":\n return new AnthropicProvider(\n apiClient,\n config,\n budgetManager,\n costTracker,\n piiScanner,\n rateLimiter,\n session,\n );\n case \"google\":\n return new GoogleProvider(\n apiClient,\n config,\n budgetManager,\n costTracker,\n piiScanner,\n rateLimiter,\n session,\n );\n default:\n throw new Error(\n `Unsupported AI client. Could not detect provider from client object. ` +\n `Supported providers: openai, anthropic, google.`,\n );\n }\n}\n","import {\n SessionBudgetExceededError,\n SessionIterationLimitExceededError,\n} from \"./errors.js\";\n\n/**\n * A single recorded call within a session.\n */\nexport interface SessionCallRecord {\n callSequence: number;\n callType: string;\n toolName?: string;\n inputTokens: number;\n outputTokens: number;\n cumulativeInputTokens: number;\n costUsd: number;\n cumulativeCostUsd: number;\n createdAt: Date;\n}\n\n/**\n * Options for creating a new SessionContext.\n */\nexport interface SessionOptions {\n sessionId: string;\n serverSessionId?: string;\n feature?: string;\n userId?: string;\n maxSpendUsd?: number;\n maxIterations?: number;\n}\n\n/**\n * Local session governance context.\n *\n * Tracks cumulative spend, iteration count, and call history for an\n * agent session. Enforces budget and iteration limits before each call\n * via `preCallCheck()`.\n */\nexport class SessionContext {\n readonly sessionId: string;\n serverSessionId?: string;\n readonly feature?: string;\n readonly userId?: string;\n readonly maxSpendUsd?: number;\n readonly maxIterations?: number;\n\n private _currentSpendUsd = 0;\n private _iterationCount = 0;\n private _cumulativeInputTokens = 0;\n private _status: \"active\" | \"completed\" | \"terminated\" = \"active\";\n private _terminationReason?: string;\n private _calls: SessionCallRecord[] = [];\n\n constructor(options: SessionOptions) {\n this.sessionId = options.sessionId;\n this.serverSessionId = options.serverSessionId;\n this.feature = options.feature;\n this.userId = options.userId;\n this.maxSpendUsd = options.maxSpendUsd;\n this.maxIterations = options.maxIterations;\n }\n\n // ─── Read-only accessors ──────────────────────────────────────────\n\n get currentSpendUsd(): number {\n return this._currentSpendUsd;\n }\n\n get iterationCount(): number {\n return this._iterationCount;\n }\n\n get status(): string {\n return this._status;\n }\n\n get terminationReason(): string | undefined {\n return this._terminationReason;\n }\n\n get calls(): readonly SessionCallRecord[] {\n return this._calls;\n }\n\n get remainingBudget(): number | undefined {\n if (this.maxSpendUsd === undefined) return undefined;\n return Math.max(0, this.maxSpendUsd - this._currentSpendUsd);\n }\n\n get remainingIterations(): number | undefined {\n if (this.maxIterations === undefined) return undefined;\n return Math.max(0, this.maxIterations - this._iterationCount);\n }\n\n // ─── Lifecycle methods ────────────────────────────────────────────\n\n /**\n * Pre-flight check before making an AI call.\n * Throws if budget or iteration limits would be exceeded.\n */\n preCallCheck(estimatedCost: number): void {\n if (this.maxSpendUsd !== undefined) {\n if (this._currentSpendUsd + estimatedCost > this.maxSpendUsd) {\n this._status = \"terminated\";\n this._terminationReason = \"budget_exceeded\";\n throw new SessionBudgetExceededError(\n `Session budget exceeded: current spend $${this._currentSpendUsd.toFixed(4)} + estimated $${estimatedCost.toFixed(4)} > limit $${this.maxSpendUsd.toFixed(4)}`,\n this.sessionId,\n this._currentSpendUsd,\n this.maxSpendUsd,\n );\n }\n }\n\n if (this.maxIterations !== undefined) {\n if (this._iterationCount + 1 > this.maxIterations) {\n this._status = \"terminated\";\n this._terminationReason = \"iteration_limit_exceeded\";\n throw new SessionIterationLimitExceededError(\n `Session iteration limit exceeded: ${this._iterationCount + 1} > ${this.maxIterations}`,\n this.sessionId,\n this._iterationCount,\n this.maxIterations,\n );\n }\n }\n }\n\n /**\n * Record a completed call, updating cumulative counters.\n */\n recordCall(options: {\n callType: string;\n inputTokens: number;\n outputTokens: number;\n costUsd: number;\n toolName?: string;\n }): SessionCallRecord {\n this._iterationCount++;\n this._currentSpendUsd += options.costUsd;\n this._cumulativeInputTokens += options.inputTokens;\n\n const record: SessionCallRecord = {\n callSequence: this._iterationCount,\n callType: options.callType,\n toolName: options.toolName,\n inputTokens: options.inputTokens,\n outputTokens: options.outputTokens,\n cumulativeInputTokens: this._cumulativeInputTokens,\n costUsd: options.costUsd,\n cumulativeCostUsd: this._currentSpendUsd,\n createdAt: new Date(),\n };\n\n this._calls.push(record);\n return record;\n }\n\n /**\n * Close the session with a terminal status.\n */\n close(reason = \"completed\"): void {\n this._status = reason === \"completed\" ? \"completed\" : \"terminated\";\n this._terminationReason = reason;\n }\n}\n","import { ModelCostConfig } from \"./config.js\";\nimport type { ModelCostInitOptions } from \"./config.js\";\nimport { ModelCostClient } from \"./client.js\";\nimport { BudgetManager } from \"./budget.js\";\nimport { CostTracker, calculateCost, syncPricingFromApi } from \"./tracking.js\";\nimport { PiiScanner } from \"./pii.js\";\nimport type { PiiResult } from \"./pii.js\";\nimport { TokenBucketRateLimiter } from \"./rate-limiter.js\";\nimport { createProviderForClient } from \"./providers/index.js\";\nimport { ConfigurationError } from \"./errors.js\";\nimport { SessionContext } from \"./session.js\";\nimport type { BudgetCheckResponse, BudgetStatusResponse } from \"./models/budget.js\";\n\n// ─── Re-exports ──────────────────────────────────────────────────────\n\nexport { VERSION } from \"./version.js\";\nexport { ModelCostConfig } from \"./config.js\";\nexport type { ModelCostInitOptions, ModelCostResolvedConfig } from \"./config.js\";\nexport { ModelCostClient } from \"./client.js\";\nexport { BudgetManager } from \"./budget.js\";\nexport { CostTracker, calculateCost, MODEL_PRICING } from \"./tracking.js\";\nexport { PiiScanner } from \"./pii.js\";\nexport type { PiiResult, PiiEntity, GovernanceViolation, FullScanResult } from \"./pii.js\";\nexport { TokenBucketRateLimiter } from \"./rate-limiter.js\";\n\nexport {\n ModelCostError,\n ConfigurationError,\n BudgetExceededError,\n RateLimitedError,\n PiiDetectedError,\n ModelCostApiError,\n SessionBudgetExceededError,\n SessionIterationLimitExceededError,\n} from \"./errors.js\";\n\nexport { SessionContext } from \"./session.js\";\nexport type { SessionOptions, SessionCallRecord } from \"./session.js\";\n\nexport type {\n BudgetAction,\n BudgetScope,\n BudgetPeriod,\n Provider,\n TrackRequest,\n TrackResponse,\n BudgetCheckResponse,\n BudgetPolicy,\n BudgetStatusResponse,\n GovernanceScanRequest,\n GovernanceScanResponse,\n DetectedViolation,\n ModelPricing,\n CreateSessionRequest,\n CreateSessionResponse,\n RecordSessionCallRequest,\n CloseSessionRequest,\n} from \"./models/index.js\";\n\nexport type { BaseProvider, ExtractedUsage } from \"./providers/base.js\";\nexport { OpenAIProvider } from \"./providers/openai.js\";\nexport { AnthropicProvider } from \"./providers/anthropic.js\";\nexport { GoogleProvider } from \"./providers/google.js\";\n\n// ─── Track cost decorator options ────────────────────────────────────\n\nexport interface TrackCostOptions {\n model: string;\n feature?: string;\n provider?: string;\n session?: SessionContext;\n}\n\n// ─── Usage report (returned by getUsage) ─────────────────────────────\n\nexport interface UsageReport {\n totalSpendUsd: number;\n totalBudgetUsd: number;\n policiesAtRisk: number;\n policies: BudgetStatusResponse[\"policies\"];\n}\n\n// ─── Internal singleton state ────────────────────────────────────────\n\ninterface ModelCostInstance {\n config: ModelCostConfig;\n client: ModelCostClient;\n budgetManager: BudgetManager;\n costTracker: CostTracker;\n piiScanner: PiiScanner;\n rateLimiter: TokenBucketRateLimiter;\n}\n\n// ─── Main SDK class ──────────────────────────────────────────────────\n\n/**\n * Main entry point for the ModelCost Node.js SDK.\n *\n * Uses a static singleton pattern -- call `ModelCost.init()` once,\n * then use the static methods from anywhere in your application.\n *\n * @example\n * ```ts\n * import { ModelCost } from \"@modelcost/sdk\";\n * import OpenAI from \"openai\";\n *\n * ModelCost.init({ apiKey: \"mc_...\", orgId: \"org-123\" });\n * const openai = ModelCost.wrap(new OpenAI());\n * ```\n */\nexport class ModelCost {\n private static _instance: ModelCostInstance | null = null;\n\n /** Prevent direct instantiation. */\n private constructor() {}\n\n /**\n * Initialize the ModelCost SDK. Must be called before any other method.\n * Subsequent calls will re-initialize (shutting down the previous instance).\n */\n static async init(options: ModelCostInitOptions): Promise<void> {\n if (ModelCost._instance) {\n // Gracefully shut down existing instance\n ModelCost._instance.costTracker.stopAutoFlush();\n ModelCost._instance.costTracker.stopPricingSync();\n ModelCost._instance.client.close();\n }\n\n const config = new ModelCostConfig(options);\n const client = new ModelCostClient(config);\n\n // Synchronous pricing sync before anything uses calculateCost\n try {\n await syncPricingFromApi(config.baseUrl, config.apiKey);\n } catch {\n console.warn(\"[ModelCost] Failed to sync pricing on init; cost estimates unavailable until next sync\");\n }\n\n const budgetManager = new BudgetManager(config.syncIntervalMs);\n const costTracker = new CostTracker(config.flushBatchSize);\n const piiScanner = new PiiScanner();\n const rateLimiter = new TokenBucketRateLimiter(10, 50);\n\n // Start auto-flushing tracked events\n costTracker.startAutoFlush(client, config.flushIntervalMs);\n\n // Start periodic pricing sync from server\n costTracker.startPricingSync(config.baseUrl, config.apiKey);\n\n ModelCost._instance = {\n config,\n client,\n budgetManager,\n costTracker,\n piiScanner,\n rateLimiter,\n };\n }\n\n /**\n * Wrap an AI provider client with cost tracking, budget enforcement,\n * and PII scanning. Returns a proxied version of the same client.\n *\n * Supports: OpenAI, Anthropic, Google Generative AI.\n */\n static wrap<T>(client: T, session?: SessionContext): T {\n const inst = ModelCost._requireInstance();\n const provider = createProviderForClient(\n client,\n inst.client,\n inst.config,\n inst.budgetManager,\n inst.costTracker,\n inst.piiScanner,\n inst.rateLimiter,\n session,\n );\n return provider.wrap(client) as T;\n }\n\n /**\n * Decorator factory for tracking costs on individual functions.\n *\n * @example\n * ```ts\n * const trackedFn = ModelCost.trackCost({ model: \"gpt-4o\" })(myFunction);\n * ```\n */\n static trackCost(\n options: TrackCostOptions,\n ): <TFn extends (...args: unknown[]) => unknown>(fn: TFn) => TFn {\n const inst = ModelCost._requireInstance();\n\n return <TFn extends (...args: unknown[]) => unknown>(fn: TFn): TFn => {\n const wrapped = async (...args: unknown[]): Promise<unknown> => {\n // Session pre-check\n if (options.session) {\n const estimatedCost = calculateCost(options.model, 500, 500);\n options.session.preCallCheck(estimatedCost);\n }\n\n const startTime = Date.now();\n const result = await fn(...args);\n const latencyMs = Date.now() - startTime;\n\n // Record with zero tokens (caller is responsible for real usage)\n inst.costTracker.record(\n {\n apiKey: inst.config.apiKey,\n timestamp: new Date().toISOString(),\n provider: (options.provider ?? \"openai\") as \"openai\",\n model: options.model,\n feature: options.feature,\n inputTokens: 0,\n outputTokens: 0,\n latencyMs,\n metadata: {},\n },\n inst.client,\n );\n\n // Session post-recording\n if (options.session) {\n options.session.recordCall({\n callType: \"llm\",\n inputTokens: 0,\n outputTokens: 0,\n costUsd: 0,\n });\n }\n\n return result;\n };\n\n return wrapped as unknown as TFn;\n };\n }\n\n /**\n * Check whether a request is allowed under current budget policies.\n */\n static async checkBudget(\n scope: string,\n id: string,\n ): Promise<BudgetCheckResponse> {\n const inst = ModelCost._requireInstance();\n return inst.budgetManager.check(inst.client, inst.config.orgId, `${scope}:${id}`, 0);\n }\n\n /**\n * Get usage/spend information for a scope and period.\n */\n static async getUsage(\n scope: string,\n _period: string,\n ): Promise<UsageReport> {\n const inst = ModelCost._requireInstance();\n const status = await inst.client.getBudgetStatus(\n scope === \"organization\" ? inst.config.orgId : scope,\n );\n return {\n totalSpendUsd: status.totalSpendUsd,\n totalBudgetUsd: status.totalBudgetUsd,\n policiesAtRisk: status.policiesAtRisk,\n policies: status.policies,\n };\n }\n\n /**\n * Start a new agent session with optional budget and iteration limits.\n * Registers the session with the server (fail-open if unavailable)\n * and returns a local SessionContext for tracking.\n */\n static async startSession(options: {\n feature?: string;\n maxSpendUsd?: number;\n maxIterations?: number;\n userId?: string;\n sessionId?: string;\n } = {}): Promise<SessionContext> {\n const inst = ModelCost._requireInstance();\n const sessionId = options.sessionId ?? crypto.randomUUID();\n\n let serverSessionId: string | undefined;\n try {\n const response = await inst.client.createSession({\n apiKey: inst.config.apiKey,\n sessionId,\n feature: options.feature,\n userId: options.userId,\n maxSpendUsd: options.maxSpendUsd,\n maxIterations: options.maxIterations,\n });\n serverSessionId = response.id;\n } catch {\n console.warn(\"[ModelCost] Failed to create server session (fail-open)\");\n }\n\n return new SessionContext({\n sessionId,\n serverSessionId,\n feature: options.feature,\n userId: options.userId,\n maxSpendUsd: options.maxSpendUsd,\n maxIterations: options.maxIterations,\n });\n }\n\n /**\n * Close an active session, recording final state on the server.\n */\n static async closeSession(\n session: SessionContext,\n reason = \"completed\",\n ): Promise<void> {\n const inst = ModelCost._requireInstance();\n session.close(reason);\n\n if (session.serverSessionId) {\n try {\n await inst.client.closeSession(session.serverSessionId, {\n apiKey: inst.config.apiKey,\n status: session.status,\n terminationReason: session.terminationReason,\n finalSpendUsd: session.currentSpendUsd,\n finalIterationCount: session.iterationCount,\n });\n } catch {\n console.warn(\"[ModelCost] Failed to close server session (fail-open)\");\n }\n }\n }\n\n /**\n * Scan text for PII using the local scanner.\n */\n static async scanPii(text: string): Promise<PiiResult> {\n const inst = ModelCost._requireInstance();\n return inst.piiScanner.scan(text);\n }\n\n /**\n * Flush all buffered tracking events to the API.\n */\n static async flush(): Promise<void> {\n const inst = ModelCost._requireInstance();\n await inst.costTracker.flush(inst.client);\n }\n\n /**\n * Gracefully shut down the SDK: flush remaining events, stop timers, close client.\n */\n static async shutdown(): Promise<void> {\n if (!ModelCost._instance) return;\n\n const inst = ModelCost._instance;\n inst.costTracker.stopAutoFlush();\n inst.costTracker.stopPricingSync();\n await inst.costTracker.flush(inst.client);\n inst.budgetManager.clear();\n inst.client.close();\n ModelCost._instance = null;\n }\n\n /**\n * Assert the SDK has been initialized and return the instance.\n */\n private static _requireInstance(): ModelCostInstance {\n if (!ModelCost._instance) {\n throw new ConfigurationError(\n \"ModelCost SDK is not initialized. Call ModelCost.init() first.\",\n );\n }\n return ModelCost._instance;\n }\n}\n"]}
|