@theelena/sdk 0.1.2 → 0.1.3
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/agent.d.ts +165 -3
- package/dist/agent.js +60 -6
- package/dist/agent.js.map +1 -1
- package/dist/index.d.ts +42 -2
- package/dist/index.js +10 -6
- package/dist/index.js.map +1 -1
- package/dist/{key-transport.d-Bopgxw9r.d.ts → key-transport.d-DlF2RqPm.d.ts} +13 -0
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/errors.ts","../src/resources/orders.ts","../src/resources/catalog.ts","../src/resources/realtime.ts","../src/resources/receipts.ts","../src/resources/discovery.ts","../src/business.ts","../src/http-client.ts","../src/client.ts","../src/checkout.ts","../../shared/src/agent-contracts/access.ts","../../shared/src/agent-contracts/common.ts","../../shared/src/agent-contracts/catalog.ts","../src/key-transport.ts","../src/client-key.ts","../../shared/src/agent-contracts/public-connection.ts","../src/public-connection.ts"],"sourcesContent":["export interface ElenaApiErrorDetails {\n status: number;\n code?: string;\n details?: unknown;\n retryAfter?: string;\n}\n\n/** Backend HTTP failure. Preserves status, business code and raw payload. */\nexport class ElenaApiError extends Error {\n readonly status: number;\n readonly code?: string;\n readonly details?: unknown;\n readonly retryAfter?: string;\n\n constructor(message: string, details: ElenaApiErrorDetails) {\n super(message);\n this.name = 'ElenaApiError';\n this.status = details.status;\n this.code = details.code;\n this.details = details.details;\n this.retryAfter = details.retryAfter;\n }\n}\n\n/** Transport failure before any HTTP response (DNS, refused, TLS). */\nexport class ElenaNetworkError extends Error {\n constructor(message = 'Error de red desconocido') {\n super(message);\n this.name = 'ElenaNetworkError';\n }\n}\n\n/** Configured timeout elapsed before the complete response body was consumed. */\nexport class ElenaTimeoutError extends Error {\n readonly timeoutMs: number;\n\n constructor(timeoutMs: number) {\n super(`Elena no respondió en ${timeoutMs} ms.`);\n this.name = 'ElenaTimeoutError';\n this.timeoutMs = timeoutMs;\n }\n}\n\n/** Caller-provided AbortSignal fired before completion. */\nexport class ElenaRequestAbortedError extends Error {\n constructor(message = 'La solicitud a Elena fue cancelada.') {\n super(message);\n this.name = 'ElenaRequestAbortedError';\n }\n}\n\n/** Unusable API response: a redirect or a successful body that is not JSON. */\nexport class ElenaResponseError extends Error {\n readonly status: number;\n readonly bodyText?: string;\n\n constructor(message: string, details: { status: number; bodyText?: string }) {\n super(message);\n this.name = 'ElenaResponseError';\n this.status = details.status;\n this.bodyText = details.bodyText;\n }\n}\n\nexport type ElenaCheckoutValidationCode =\n | 'PRODUCT_NOT_FOUND'\n | 'PRODUCT_UNAVAILABLE'\n | 'INVALID_QUANTITY'\n | 'UNKNOWN_GROUP'\n | 'UNKNOWN_OPTION'\n | 'DUPLICATE_OPTION'\n | 'REQUIRED_OPTIONS'\n | 'MIN_SELECTIONS'\n | 'MAX_SELECTIONS'\n | 'AMBIGUOUS_SELECTION';\n\n/** Local catalog-snapshot validation only; the backend remains authoritative. */\nexport class ElenaCheckoutValidationError extends Error {\n readonly code: ElenaCheckoutValidationCode;\n /** Selection path, e.g. selections[0].quantity or selections[0].selectedOptions. */\n readonly field: string;\n\n constructor(message: string, details: { code: ElenaCheckoutValidationCode; field: string }) {\n super(message);\n this.name = 'ElenaCheckoutValidationError';\n this.code = details.code;\n this.field = details.field;\n }\n}\n","import type { CatalogAccessResolution } from '../../../shared/src/catalog-access/types';\nimport type { ElenaHttpClient } from '../http-client';\nimport { ElenaApiError } from '../errors';\nimport type {\n CreateOrderInput,\n CreateOrderOptions,\n OrderCreationResult,\n PaymentClaimInput,\n PaymentClaimResult,\n PublicOrderDetail,\n} from '../models/orders';\n\nexport class AccessResource {\n constructor(\n private readonly http: ElenaHttpClient,\n private readonly businessSlug: string,\n ) {}\n\n resolve(publicKey: string): Promise<CatalogAccessResolution> {\n return this.http.request<CatalogAccessResolution>(\n `/api/v1/public/catalog/${encodeURIComponent(this.businessSlug)}/access/${encodeURIComponent(publicKey)}`,\n );\n }\n\n createOrder(\n publicKey: string,\n input: CreateOrderInput,\n options: CreateOrderOptions = {},\n ): Promise<OrderCreationResult> {\n const body =\n options.idempotencyKey && !input.idempotencyKey\n ? { ...input, idempotencyKey: options.idempotencyKey }\n : input;\n return this.http.request<OrderCreationResult>(\n `/api/v1/public/catalog/${encodeURIComponent(this.businessSlug)}/access/${encodeURIComponent(publicKey)}/orders`,\n { method: 'POST', body, signal: options.signal },\n );\n }\n}\n\nexport class OrdersResource {\n constructor(\n private readonly http: ElenaHttpClient,\n private readonly businessSlug: string,\n ) {}\n\n create(input: CreateOrderInput, options: CreateOrderOptions = {}): Promise<OrderCreationResult> {\n const body =\n options.idempotencyKey && !input.idempotencyKey\n ? { ...input, idempotencyKey: options.idempotencyKey }\n : input;\n return this.http.request<OrderCreationResult>(\n `/api/v1/public/catalog/${encodeURIComponent(this.businessSlug)}/orders`,\n { method: 'POST', body, signal: options.signal },\n );\n }\n\n async getById(orderId: string): Promise<PublicOrderDetail> {\n if (!this.http.visitorId) {\n throw new ElenaApiError('Consultar un pedido requiere visitorId.', { status: 0 });\n }\n return this.http.request<PublicOrderDetail>(\n `/api/v1/public/catalog/${encodeURIComponent(this.businessSlug)}/orders/${encodeURIComponent(orderId)}`,\n );\n }\n\n getTracking(trackingToken: string): Promise<PublicOrderDetail> {\n return this.http.request<PublicOrderDetail>(\n `/api/v1/public/catalog/${encodeURIComponent(this.businessSlug)}/tracking/${encodeURIComponent(trackingToken)}`,\n );\n }\n\n submitPaymentClaim(trackingToken: string, input: PaymentClaimInput): Promise<PaymentClaimResult> {\n const form = new FormData();\n form.set('referenceNumber', input.referenceNumber);\n if (input.proofImage) form.set('proofImage', input.proofImage);\n return this.http.request<PaymentClaimResult>(\n `/api/v1/public/catalog/${encodeURIComponent(this.businessSlug)}/tracking/${encodeURIComponent(trackingToken)}/payment-claims`,\n { method: 'POST', body: form },\n );\n }\n}\n","import type { ElenaHttpClient } from '../http-client';\nimport type {\n BusinessInfo,\n BusinessTable,\n CatalogMenu,\n HeroSlide,\n MenuQuery,\n} from '../models/business';\n\nexport class CatalogResource {\n constructor(\n private readonly http: ElenaHttpClient,\n private readonly businessSlug: string,\n ) {}\n\n getInfo(): Promise<BusinessInfo> {\n return this.http.request<BusinessInfo>(\n `/api/v1/public/catalog/${encodeURIComponent(this.businessSlug)}`,\n );\n }\n\n getMenu(query?: MenuQuery): Promise<CatalogMenu> {\n return this.http.request<CatalogMenu>(\n `/api/v1/public/catalog/${encodeURIComponent(this.businessSlug)}/menu`,\n { query: { search: query?.search } },\n );\n }\n\n listHeroSlides(): Promise<HeroSlide[]> {\n return this.http.request<HeroSlide[]>(\n `/api/v1/public/catalog/${encodeURIComponent(this.businessSlug)}/hero-slides`,\n );\n }\n}\n\nexport class TablesResource {\n constructor(\n private readonly http: ElenaHttpClient,\n private readonly businessSlug: string,\n ) {}\n\n listAvailable(): Promise<BusinessTable[]> {\n return this.http.request<BusinessTable[]>(\n `/api/v1/public/catalog/${encodeURIComponent(this.businessSlug)}/tables/available`,\n );\n }\n\n get(tableId: string): Promise<BusinessTable> {\n return this.http.request<BusinessTable>(\n `/api/v1/public/catalog/${encodeURIComponent(this.businessSlug)}/tables/${encodeURIComponent(tableId)}`,\n );\n }\n}\n","import type { ElenaHttpClient } from '../http-client';\nimport { ElenaApiError } from '../errors';\nimport type {\n ContinuationExchangeResult,\n JourneyActionRequired,\n JourneyConfirmInput,\n JourneyConfirmationResult,\n JourneyEventInput,\n JourneySnapshot,\n JourneyStateResult,\n} from '../models/journeys';\n\nexport interface RealtimeConnection {\n url: string;\n}\n\nexport interface ChatConnection {\n apiUrl: string;\n businessSlug: string;\n visitorId?: string;\n}\n\nexport class RealtimeResource {\n constructor(\n private readonly http: ElenaHttpClient,\n private readonly businessSlug: string,\n ) {}\n\n /** SSE stream URL. EventSource-compatible: identity travels in query, not headers. */\n getConnection(visitorId?: string): RealtimeConnection {\n const resolvedVisitorId = visitorId ?? this.http.visitorId;\n if (!resolvedVisitorId) {\n throw new ElenaApiError('El stream de eventos requiere visitorId.', { status: 0 });\n }\n return {\n url: this.http.url('/api/v1/public/events/stream', {\n visitorId: resolvedVisitorId,\n restaurantSlug: this.businessSlug,\n }),\n };\n }\n}\n\nexport class ChatResource {\n constructor(\n private readonly http: ElenaHttpClient,\n private readonly businessSlug: string,\n ) {}\n\n /** Connection descriptor for the existing Tari chat runtime. No HTTP call. */\n getConnection(): ChatConnection {\n return {\n apiUrl: this.http.url('/api/v1'),\n businessSlug: this.businessSlug,\n ...(this.http.visitorId ? { visitorId: this.http.visitorId } : {}),\n };\n }\n}\n\nexport class ContinuationsResource {\n constructor(\n private readonly http: ElenaHttpClient,\n private readonly businessSlug: string,\n ) {}\n\n exchange<TState = unknown>(token: string): Promise<ContinuationExchangeResult<TState>> {\n return this.http.request<ContinuationExchangeResult<TState>>(\n `/api/v1/public/journeys/${encodeURIComponent(this.businessSlug)}/exchange`,\n { method: 'POST', body: { token } },\n );\n }\n}\n\nexport class JourneyConflictError<TState = unknown> extends ElenaApiError {\n readonly journey: JourneySnapshot<TState>;\n\n constructor(journey: JourneySnapshot<TState>) {\n super('La journey cambió en el servidor; recarga el estado.', {\n status: 409,\n code: 'journey_conflict',\n details: { journey },\n });\n this.name = 'JourneyConflictError';\n this.journey = journey;\n }\n}\n\nexport class JourneyResource {\n constructor(\n private readonly http: ElenaHttpClient,\n private readonly businessSlug: string,\n ) {}\n\n getState<TState = unknown>(): Promise<JourneyStateResult<TState>> {\n return this.http.request<JourneyStateResult<TState>>(\n `/api/v1/public/journeys/${encodeURIComponent(this.businessSlug)}/state`,\n );\n }\n\n async dispatch<TState = unknown, TData extends Record<string, unknown> = Record<string, unknown>>(\n input: JourneyEventInput,\n ): Promise<TData & { journey: JourneySnapshot<TState> }> {\n try {\n return await this.http.request<TData & { journey: JourneySnapshot<TState> }>(\n `/api/v1/public/journeys/${encodeURIComponent(this.businessSlug)}/events`,\n {\n method: 'POST',\n body: {\n eventId: input.eventId,\n expectedVersion: input.expectedVersion,\n event: input.event,\n },\n },\n );\n } catch (error) {\n throw JourneyResource.withConflict<TState>(error);\n }\n }\n\n async confirm<TState = unknown>(\n input: JourneyConfirmInput,\n ): Promise<JourneyConfirmationResult<TState> | JourneyActionRequired<TState>> {\n try {\n return await this.http.request<\n JourneyConfirmationResult<TState> | JourneyActionRequired<TState>\n >(`/api/v1/public/journeys/${encodeURIComponent(this.businessSlug)}/confirm`, {\n method: 'POST',\n body: {\n eventId: input.eventId,\n expectedVersion: input.expectedVersion,\n fingerprint: input.fingerprint,\n },\n });\n } catch (error) {\n throw JourneyResource.withConflict<TState>(error);\n }\n }\n\n private static withConflict<TState>(error: unknown): unknown {\n if (\n error instanceof ElenaApiError &&\n error.status === 409 &&\n typeof error.details === 'object' &&\n error.details !== null &&\n 'journey' in error.details\n ) {\n // Server contract: journey_conflict carries the authoritative snapshot.\n const journey = error.details.journey as JourneySnapshot<TState>;\n return new JourneyConflictError<TState>(journey);\n }\n return error;\n }\n}\n","import type { ElenaHttpClient } from '../http-client';\nimport type { LiveSessionBeacon, LiveSessionInput, LiveSessionResult } from '../models/presence';\nimport type { SaleReceipt } from '../models/receipts';\n\nexport class ReceiptsResource {\n constructor(\n private readonly http: ElenaHttpClient,\n private readonly businessSlug: string,\n ) {}\n\n async get(receiptToken: string): Promise<SaleReceipt> {\n const receipt = await this.http.request<SaleReceipt>(\n `/api/v1/public/catalog/${encodeURIComponent(this.businessSlug)}/sales/${encodeURIComponent(receiptToken)}`,\n );\n const url = receipt.receipt?.url;\n if (!url || !url.startsWith('/')) return receipt;\n if (!receipt.receipt) return receipt;\n return { ...receipt, receipt: { ...receipt.receipt, url: this.http.url(url) } };\n }\n\n /** PDF endpoint answers 302; callers open/download the URL, never JSON-fetch it. */\n getPdfUrl(receiptToken: string): string {\n return this.http.url(\n `/api/v1/public/catalog/${encodeURIComponent(this.businessSlug)}/sales/${encodeURIComponent(receiptToken)}/pdf`,\n );\n }\n}\n\nexport class PresenceResource {\n constructor(\n private readonly http: ElenaHttpClient,\n private readonly businessSlug: string,\n ) {}\n\n report(\n input: LiveSessionInput,\n options: { signal?: AbortSignal } = {},\n ): Promise<LiveSessionResult> {\n return this.http.request<LiveSessionResult>(\n `/api/v1/public/catalog/${encodeURIComponent(this.businessSlug)}/live-session`,\n { method: 'POST', body: input, signal: options.signal },\n );\n }\n\n /** Beacon payload for pagehide/unload, where fetch cannot be awaited. */\n getBeaconRequest(input: LiveSessionInput): LiveSessionBeacon {\n return {\n url: this.http.url(\n `/api/v1/public/catalog/${encodeURIComponent(this.businessSlug)}/live-session`,\n ),\n body: new Blob([JSON.stringify(input)], { type: 'application/json' }),\n };\n }\n}\n","import type { ElenaHttpClient } from '../http-client';\nimport type {\n EventDetail,\n TicketEmissionInput,\n TicketEmissionResult,\n TicketStatus,\n} from '../models/events';\n\nexport class EventsResource {\n constructor(private readonly http: ElenaHttpClient) {}\n\n get(businessSlug: string, eventSlug: string): Promise<EventDetail> {\n return this.http.request<EventDetail>('/api/v1/public/events/detail', {\n query: { restaurantSlug: businessSlug, eventSlug },\n });\n }\n}\n\nexport class TicketsResource {\n constructor(private readonly http: ElenaHttpClient) {}\n\n emit(input: TicketEmissionInput): Promise<TicketEmissionResult> {\n return this.http.request<TicketEmissionResult>('/api/v1/public/tickets/emissions', {\n method: 'POST',\n body: input,\n });\n }\n\n getStatus(token: string): Promise<TicketStatus> {\n return this.http.request<TicketStatus>(`/api/v1/public/tickets/${encodeURIComponent(token)}`);\n }\n}\n\nexport class AssetsResource {\n constructor(private readonly http: ElenaHttpClient) {}\n\n /** Render endpoint serves binary content; callers use the URL, never JSON-fetch it. */\n getRenderUrl(assetId: string): string {\n return this.http.url(`/api/v1/public/assets/${encodeURIComponent(assetId)}/render`);\n }\n}\n","import type { ElenaHttpClient } from './http-client';\nimport type { EventDetail, TicketEmissionInput, TicketEmissionResult } from './models/events';\nimport type { BusinessInfo } from './models/business';\nimport { AccessResource, OrdersResource } from './resources/orders';\nimport { CatalogResource, TablesResource } from './resources/catalog';\nimport { ChatResource, ContinuationsResource, RealtimeResource } from './resources/realtime';\nimport { PresenceResource, ReceiptsResource } from './resources/receipts';\nimport { EventsResource, TicketsResource } from './resources/discovery';\n\n/**\n * Business-scoped public surface. The slug selects the business once;\n * resources own the endpoints. Backend wire names (restaurantSlug) stay\n * inside the SDK: consumers speak business everywhere.\n */\nexport class BusinessScope {\n readonly slug: string;\n readonly catalog: CatalogResource;\n readonly tables: TablesResource;\n readonly access: AccessResource;\n readonly orders: OrdersResource;\n readonly receipts: ReceiptsResource;\n readonly presence: PresenceResource;\n readonly continuations: ContinuationsResource;\n readonly realtime: RealtimeResource;\n readonly chat: ChatResource;\n private readonly eventsResource: EventsResource;\n private readonly ticketsResource: TicketsResource;\n\n constructor(\n private readonly http: ElenaHttpClient,\n slug: string,\n ) {\n const normalized = slug.trim();\n if (!normalized) {\n throw new TypeError('BusinessScope necesita un slug.');\n }\n this.slug = normalized;\n this.catalog = new CatalogResource(http, normalized);\n this.tables = new TablesResource(http, normalized);\n this.access = new AccessResource(http, normalized);\n this.orders = new OrdersResource(http, normalized);\n this.receipts = new ReceiptsResource(http, normalized);\n this.presence = new PresenceResource(http, normalized);\n this.continuations = new ContinuationsResource(http, normalized);\n this.realtime = new RealtimeResource(http, normalized);\n this.chat = new ChatResource(http, normalized);\n this.eventsResource = new EventsResource(http);\n this.ticketsResource = new TicketsResource(http);\n }\n\n getInfo(): Promise<BusinessInfo> {\n return this.catalog.getInfo();\n }\n\n getEvent(eventSlug: string): Promise<EventDetail> {\n return this.eventsResource.get(this.slug, eventSlug);\n }\n\n emitTickets(input: Omit<TicketEmissionInput, 'restaurantSlug'>): Promise<TicketEmissionResult> {\n return this.ticketsResource.emit({ ...input, restaurantSlug: this.slug });\n }\n}\n","import {\n ElenaApiError,\n ElenaNetworkError,\n ElenaRequestAbortedError,\n ElenaResponseError,\n ElenaTimeoutError,\n} from './errors';\n\nexport type ElenaHttpMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';\n\n/** Minimal fetch shape the SDK needs. Callers may pass global fetch. */\nexport type ElenaFetch = (input: string | URL | Request, init?: RequestInit) => Promise<Response>;\n\nexport interface ElenaClientOptions {\n baseUrl: string;\n visitorId?: string;\n fetch?: ElenaFetch;\n timeoutMs?: number;\n}\n\nexport interface ElenaRequestOptions {\n method?: ElenaHttpMethod;\n body?: unknown;\n headers?: HeadersInit;\n query?: Record<string, string | number | boolean | undefined>;\n signal?: AbortSignal;\n keepalive?: boolean;\n}\n\nconst DEFAULT_TIMEOUT_MS = 15_000;\n\nfunction isFormDataBody(body: unknown): body is FormData {\n return typeof FormData !== 'undefined' && body instanceof FormData;\n}\n\nfunction isPlainJsonBody(body: unknown): body is Record<string, unknown> | unknown[] {\n if (body === null || body === undefined) return false;\n if (typeof body !== 'object') return false;\n if (isFormDataBody(body)) return false;\n if (body instanceof Blob) return false;\n if (body instanceof ArrayBuffer) return false;\n if (ArrayBuffer.isView(body)) return false;\n if (body instanceof URLSearchParams) return false;\n return true;\n}\n\n/**\n * Shared transport for Elena product clients. Owns origin composition,\n * JSON/multipart bodies, visitor identity, bearer injection, timeout and\n * typed failures. Resources own paths, never the origin.\n */\nexport class ElenaHttpClient {\n readonly baseUrl: string;\n readonly visitorId?: string;\n private readonly fetchImpl: ElenaFetch;\n private readonly timeoutMs: number;\n private readonly accessToken?: string;\n\n constructor(options: ElenaClientOptions, accessToken?: string) {\n const normalizedBaseUrl = options.baseUrl.trim().replace(/\\/+$/, '');\n if (!normalizedBaseUrl) {\n throw new TypeError('Elena SDK necesita un baseUrl.');\n }\n try {\n const base = new URL(normalizedBaseUrl);\n if (\n !/^https?:\\/\\//i.test(normalizedBaseUrl) ||\n /[?#\\\\\\s]/.test(normalizedBaseUrl) ||\n base.username ||\n base.password\n ) {\n throw new TypeError();\n }\n } catch {\n throw new TypeError(\n 'El baseUrl de Elena debe ser una URL HTTP(S) sin credenciales, query ni fragmento.',\n );\n }\n this.baseUrl = normalizedBaseUrl;\n const visitorId = options.visitorId?.trim();\n this.visitorId = visitorId ? visitorId : undefined;\n const fetchImpl = options.fetch ?? globalThis.fetch;\n if (typeof fetchImpl !== 'function') {\n throw new TypeError('Elena SDK necesita una implementación de fetch.');\n }\n this.fetchImpl = fetchImpl.bind(globalThis);\n const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n if (!Number.isFinite(timeoutMs) || timeoutMs <= 0) {\n throw new TypeError('El timeout del SDK de Elena debe ser mayor que cero.');\n }\n this.timeoutMs = timeoutMs;\n const token = accessToken?.trim();\n this.accessToken = token ? token : undefined;\n }\n\n url(path: string, query?: Record<string, string | number | boolean | undefined>): string {\n if (\n /^[a-z][a-z\\d+.-]*:/i.test(path) ||\n path.startsWith('//') ||\n // eslint-disable-next-line no-control-regex -- Intentional: reject control chars and whitespace in paths.\n /[\\\\\\s\\u0000-\\u001f\\u007f]/.test(path) ||\n path.split(/[/?#]/).some((segment) => /^(?:\\.|%2e){1,2}$/i.test(segment))\n ) {\n throw new TypeError(\n 'Las rutas del SDK de Elena deben ser relativas al baseUrl y no escapar de él.',\n );\n }\n const normalizedPath = path.startsWith('/') ? path : `/${path}`;\n const url = `${this.baseUrl}${normalizedPath}`;\n if (!query) return url;\n const params = new URLSearchParams();\n for (const [key, value] of Object.entries(query)) {\n if (value === undefined) continue;\n params.set(key, String(value));\n }\n const qs = params.toString();\n return qs ? `${url}?${qs}` : url;\n }\n\n async request<T>(path: string, options: ElenaRequestOptions = {}): Promise<T> {\n if (options.signal?.aborted) {\n throw new ElenaRequestAbortedError();\n }\n const headers = new Headers();\n headers.set('Accept', 'application/json');\n let body: BodyInit | undefined;\n if (options.body !== undefined) {\n if (isPlainJsonBody(options.body)) {\n headers.set('Content-Type', 'application/json');\n body = JSON.stringify(options.body);\n } else {\n body = options.body as BodyInit;\n }\n }\n if (this.visitorId) headers.set('x-visitor-id', this.visitorId);\n if (options.headers) {\n new Headers(options.headers).forEach((value, key) => {\n headers.set(key, value);\n });\n }\n if (this.accessToken) headers.set('Authorization', `Bearer ${this.accessToken}`);\n\n const controller = new AbortController();\n let timedOut = false;\n const timeout = setTimeout(() => {\n timedOut = true;\n controller.abort();\n }, this.timeoutMs);\n const onCallerAbort = (): void => {\n controller.abort();\n };\n options.signal?.addEventListener('abort', onCallerAbort, { once: true });\n if (options.signal?.aborted) onCallerAbort();\n\n // Bound both fetch and body consumption, including injected fetches that\n // ignore AbortSignal. No request (especially POST) is retried here.\n // Executor form keeps this compatible with the package's Node 18 floor.\n const bounded = <V>(promise: Promise<V>): Promise<V> =>\n new Promise((resolve, reject) => {\n const onAbort = (): void => {\n cleanup();\n reject(timedOut ? new ElenaTimeoutError(this.timeoutMs) : new ElenaRequestAbortedError());\n };\n const cleanup = (): void => controller.signal.removeEventListener('abort', onAbort);\n controller.signal.addEventListener('abort', onAbort, { once: true });\n promise.then(\n (value) => {\n cleanup();\n resolve(value);\n },\n (error: unknown) => {\n cleanup();\n reject(error);\n },\n );\n if (controller.signal.aborted) onAbort();\n });\n\n let response: Response;\n let text: string;\n try {\n response = await bounded(\n Promise.resolve().then(() => {\n if (controller.signal.aborted) throw new ElenaRequestAbortedError();\n return this.fetchImpl(this.url(path, options.query), {\n method: options.method ?? 'GET',\n headers,\n body,\n credentials: 'omit',\n redirect: 'error',\n referrerPolicy: 'no-referrer',\n signal: controller.signal,\n ...(options.keepalive ? { keepalive: true } : {}),\n });\n }),\n );\n if (\n response.redirected ||\n (response.status >= 300 && response.status < 400) ||\n response.type === 'opaqueredirect' ||\n (response.url && new URL(response.url).origin !== new URL(this.baseUrl).origin)\n ) {\n throw new ElenaResponseError('El SDK de Elena no sigue redirecciones de la API.', {\n status: response.status,\n });\n }\n text = await bounded(Promise.resolve().then(() => response.text()));\n } catch (error) {\n if (timedOut) throw new ElenaTimeoutError(this.timeoutMs);\n if (options.signal?.aborted) throw new ElenaRequestAbortedError();\n if (error instanceof ElenaResponseError) throw error;\n if (error instanceof Error && error.name === 'AbortError') {\n throw new ElenaRequestAbortedError();\n }\n throw new ElenaNetworkError(error instanceof Error ? error.message : undefined);\n } finally {\n clearTimeout(timeout);\n options.signal?.removeEventListener('abort', onCallerAbort);\n }\n\n const retryAfter = response.headers.get('retry-after') ?? undefined;\n let payload: unknown = null;\n if (text) {\n try {\n payload = JSON.parse(text) as unknown;\n } catch {\n if (!response.ok) {\n throw new ElenaApiError(`Elena respondió ${response.status}: ${response.statusText}`, {\n status: response.status,\n details: text,\n retryAfter,\n });\n }\n throw new ElenaResponseError('Respuesta inválida del servidor de Elena.', {\n status: response.status,\n bodyText: text,\n });\n }\n }\n\n if (!response.ok) {\n let code: string | undefined;\n let message: string | undefined;\n if (typeof payload === 'object' && payload !== null) {\n if ('code' in payload && typeof payload.code === 'string' && payload.code) {\n code = payload.code;\n } else if ('error' in payload && typeof payload.error === 'string' && payload.error) {\n code = payload.error;\n }\n if (\n !code &&\n 'details' in payload &&\n typeof payload.details === 'object' &&\n payload.details !== null &&\n 'code' in payload.details &&\n typeof payload.details.code === 'string' &&\n payload.details.code\n ) {\n code = payload.details.code;\n }\n if ('message' in payload && typeof payload.message === 'string' && payload.message) {\n message = payload.message;\n }\n }\n throw new ElenaApiError(\n message ?? `Elena respondió ${response.status}: ${response.statusText}`,\n { status: response.status, code, details: payload, retryAfter },\n );\n }\n\n return payload as T;\n }\n}\n","import { BusinessScope } from './business';\nimport { ElenaHttpClient, type ElenaClientOptions, type ElenaFetch } from './http-client';\nimport { AssetsResource } from './resources/discovery';\nimport { TicketsResource } from './resources/discovery';\nimport { JourneyResource } from './resources/realtime';\n\nexport type { ElenaClientOptions };\n\nexport interface ElenaPublicClient {\n business(slug: string): BusinessScope;\n readonly tickets: TicketsResource;\n readonly assets: AssetsResource;\n}\n\nexport function createElenaPublicClient(options: ElenaClientOptions): ElenaPublicClient {\n const http = new ElenaHttpClient(options);\n return {\n business: (slug: string) => new BusinessScope(http, slug),\n tickets: new TicketsResource(http),\n assets: new AssetsResource(http),\n };\n}\n\nexport interface ElenaJourneyClientOptions {\n baseUrl: string;\n businessSlug: string;\n accessToken: string;\n fetch?: ElenaFetch;\n timeoutMs?: number;\n}\n\nexport interface ElenaJourneyClient {\n readonly businessSlug: string;\n readonly journeys: JourneyResource;\n}\n\nexport function createElenaJourneyClient(options: ElenaJourneyClientOptions): ElenaJourneyClient {\n if (!options.accessToken?.trim()) {\n throw new TypeError('El cliente journey de Elena necesita un accessToken.');\n }\n const businessSlug = options.businessSlug.trim();\n if (!businessSlug) {\n throw new TypeError('El cliente journey de Elena necesita un businessSlug.');\n }\n const http = new ElenaHttpClient(\n {\n baseUrl: options.baseUrl,\n fetch: options.fetch,\n timeoutMs: options.timeoutMs,\n },\n options.accessToken,\n );\n return { businessSlug, journeys: new JourneyResource(http, businessSlug) };\n}\n","import { ElenaCheckoutValidationError, type ElenaCheckoutValidationCode } from './errors';\nimport type { CatalogMenu } from './models/business';\nimport type { PublicCatalogOrderItem } from './models/orders';\n\n/** Product/option IDs from one public catalog snapshot; no caller-supplied prices. */\nexport interface OrderItemSelection {\n productId: string;\n quantity: number;\n selectedOptions?: readonly { groupId: string; optionId: string }[];\n notes?: string;\n}\n\nconst catalogName = (name: string): string => name.trim().toLocaleLowerCase();\n\nfunction invalid(code: ElenaCheckoutValidationCode, field: string, message: string): never {\n throw new ElenaCheckoutValidationError(message, { code, field });\n}\n\n/**\n * Build the public order wire items without changing the snapshot or selections.\n * Prices remain decimal strings: unitPrice is the base price, extras are separate.\n * This is early snapshot validation, not a quote, reservation or server guarantee.\n */\nexport function buildOrderItems(\n menu: CatalogMenu,\n selections: readonly OrderItemSelection[],\n): PublicCatalogOrderItem[] {\n return selections.map((selection, itemIndex) => {\n const field = `selections[${itemIndex}]`;\n const products = menu.products.filter((product) => product.id === selection.productId);\n const product = products[0];\n if (!product) {\n return invalid(\n 'PRODUCT_NOT_FOUND',\n `${field}.productId`,\n 'El producto no existe en el catálogo.',\n );\n }\n if (products.length !== 1) {\n return invalid('AMBIGUOUS_SELECTION', `${field}.productId`, 'El ID del producto es ambiguo.');\n }\n if (!product.available) {\n return invalid(\n 'PRODUCT_UNAVAILABLE',\n `${field}.productId`,\n 'El producto no está disponible.',\n );\n }\n if (\n !Number.isInteger(selection.quantity) ||\n selection.quantity < 1 ||\n selection.quantity > 100\n ) {\n return invalid(\n 'INVALID_QUANTITY',\n `${field}.quantity`,\n 'La cantidad debe ser un entero entre 1 y 100.',\n );\n }\n\n const counts = new Map<string, number>();\n const selected = new Map<string, Set<string>>();\n const extras = (selection.selectedOptions ?? []).map((selectionOption, optionIndex) => {\n const optionField = `${field}.selectedOptions[${optionIndex}]`;\n const groups = product.customizationGroups.filter(\n (group) => group.id === selectionOption.groupId,\n );\n const group = groups[0];\n if (!group) {\n return invalid(\n 'UNKNOWN_GROUP',\n `${optionField}.groupId`,\n 'El grupo no pertenece al producto.',\n );\n }\n // The public wire identifies extras by names. Match the backend's name\n // normalization and fail rather than silently selecting another ID/price.\n if (\n groups.length !== 1 ||\n !catalogName(group.name) ||\n product.customizationGroups.filter(\n (candidate) => catalogName(candidate.name) === catalogName(group.name),\n ).length !== 1\n ) {\n return invalid(\n 'AMBIGUOUS_SELECTION',\n `${optionField}.groupId`,\n 'El nombre o ID del grupo es ambiguo.',\n );\n }\n const options = group.options.filter((option) => option.id === selectionOption.optionId);\n const option = options[0];\n if (!option) {\n return invalid(\n 'UNKNOWN_OPTION',\n `${optionField}.optionId`,\n 'La opción no pertenece al grupo.',\n );\n }\n if (\n options.length !== 1 ||\n !catalogName(option.name) ||\n group.options.filter(\n (candidate) => catalogName(candidate.name) === catalogName(option.name),\n ).length !== 1\n ) {\n return invalid(\n 'AMBIGUOUS_SELECTION',\n `${optionField}.optionId`,\n 'El nombre o ID de la opción es ambiguo.',\n );\n }\n const groupSelections = selected.get(group.id) ?? new Set<string>();\n if (groupSelections.has(option.id)) {\n return invalid(\n 'DUPLICATE_OPTION',\n `${optionField}.optionId`,\n 'Una opción no puede seleccionarse más de una vez por artículo.',\n );\n }\n groupSelections.add(option.id);\n selected.set(group.id, groupSelections);\n counts.set(group.id, (counts.get(group.id) ?? 0) + 1);\n return {\n groupName: group.name,\n optionName: option.name,\n additionalPrice: option.additionalPrice,\n };\n });\n\n for (const group of product.customizationGroups) {\n const count = counts.get(group.id) ?? 0;\n if (group.required && count === 0) {\n return invalid(\n 'REQUIRED_OPTIONS',\n `${field}.selectedOptions`,\n `El grupo \"${group.name}\" requiere una opción.`,\n );\n }\n if (count < group.minSelections) {\n return invalid(\n 'MIN_SELECTIONS',\n `${field}.selectedOptions`,\n `El grupo \"${group.name}\" requiere al menos ${group.minSelections} opción(es).`,\n );\n }\n if (count > group.maxSelections) {\n return invalid(\n 'MAX_SELECTIONS',\n `${field}.selectedOptions`,\n `El grupo \"${group.name}\" permite como máximo ${group.maxSelections} opción(es).`,\n );\n }\n }\n\n return {\n productId: product.id,\n cantidad: selection.quantity,\n unitPrice: product.basePrice,\n ...(selection.notes !== undefined ? { specialNotes: selection.notes } : {}),\n ...(extras.length ? { extras } : {}),\n };\n });\n}\n","import { z } from 'zod';\nimport {\n ELENA_AGENT_LIMITS,\n elenaAgentCurrencySchema,\n elenaAgentIdSchema,\n elenaAgentNameSchema,\n elenaAgentRevisionSchema,\n elenaAgentTimestampSchema,\n elenaAgentVersionSchema,\n} from './common';\n\nexport const ELENA_AGENT_TRANSPORT = Object.freeze({\n agentPrefix: 'elena_sk_',\n agentHeader: 'x-elena-agent-key',\n agentPath: '/api/v1/agent',\n clientPrefix: 'elena_pk_',\n clientHeader: 'x-elena-client-key',\n clientPath: '/api/v1/public/sdk',\n ownerPath: '/api/v1/agent-access',\n} as const);\nexport const elenaAgentSecretSchema = z.string().regex(/^elena_sk_[A-Za-z0-9_-]{43}$/);\n// Public role, two unambiguous issuance representations. Manual values remain unchanged.\nexport const elenaManualClientKeySchema = z.string().regex(/^elena_pk_[A-Za-z0-9_-]{43}$/);\nexport const elenaManagedClientKeySchema = z\n .string()\n .max(160)\n .regex(\n /^elena_pk_m_[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}\\.[1-9]\\d{0,15}\\.[A-Za-z0-9_-]{43}$/,\n );\nexport const elenaClientKeySchema = z.union([\n elenaManualClientKeySchema,\n elenaManagedClientKeySchema,\n]);\nexport const elenaAgentDeviceCodeSchema = z.string().regex(/^[A-Za-z0-9_-]{43}$/);\nexport const elenaAgentUserCodeSchema = z.string().regex(/^[A-HJ-NP-Z2-9]{4}-[A-HJ-NP-Z2-9]{4}$/);\nexport const elenaAgentModeSchema = z.enum(['read', 'mutate']);\nexport const elenaAgentScopeSchema = z.enum([\n 'catalog:read',\n 'catalog:write',\n 'catalog:publish',\n 'assets:read',\n 'assets:write',\n]);\nexport const elenaAgentScopesSchema = z\n .array(elenaAgentScopeSchema)\n .min(1)\n .max(5)\n .refine((scopes) => new Set(scopes).size === scopes.length, 'Duplicate scope')\n .refine((scopes) => scopes.includes('catalog:read'), 'catalog:read is mandatory');\nexport const elenaAgentActionSchema = z.enum([\n 'context.read',\n 'catalog.read',\n 'assets.read',\n 'assets.stage',\n 'operations.read',\n 'operations.propose',\n 'operations.apply',\n 'catalog.publish',\n]);\nexport const elenaAgentRestaurantSchema = z.strictObject({\n id: elenaAgentIdSchema,\n name: elenaAgentNameSchema,\n slug: z\n .string()\n .regex(/^[a-z0-9]+(?:-[a-z0-9]+)*$/)\n .max(100),\n currency: elenaAgentCurrencySchema,\n});\nconst keyTtl = z\n .number()\n .int()\n .min(3600)\n .max(ELENA_AGENT_LIMITS.keyMaxTtlSeconds)\n .default(ELENA_AGENT_LIMITS.keyDefaultTtlSeconds);\nexport const elenaAgentKeyCreateRequestSchema = z.discriminatedUnion('kind', [\n z.strictObject({\n version: elenaAgentVersionSchema,\n kind: z.literal('agent'),\n label: elenaAgentNameSchema,\n mode: elenaAgentModeSchema.default('read'),\n scopes: elenaAgentScopesSchema.default(['catalog:read', 'assets:read']),\n ttlSeconds: keyTtl,\n }),\n z.strictObject({\n version: elenaAgentVersionSchema,\n kind: z.literal('client'),\n label: elenaAgentNameSchema,\n ttlSeconds: keyTtl,\n }),\n]);\nexport const elenaAgentKeyPolicyRequestSchema = z.strictObject({\n version: elenaAgentVersionSchema,\n expectedRevision: elenaAgentRevisionSchema,\n mode: elenaAgentModeSchema,\n scopes: elenaAgentScopesSchema,\n});\nexport const elenaAgentKeyRevokeRequestSchema = z.strictObject({\n version: elenaAgentVersionSchema,\n expectedRevision: elenaAgentRevisionSchema,\n});\nexport const elenaAgentKeyReplaceRequestSchema = z.strictObject({\n version: elenaAgentVersionSchema,\n expectedRevision: elenaAgentRevisionSchema,\n ttlSeconds: keyTtl,\n});\nconst keyMetadata = {\n id: elenaAgentIdSchema,\n label: elenaAgentNameSchema,\n displaySuffix: z.string().regex(/^[A-Za-z0-9_-]{6}$/),\n revision: elenaAgentRevisionSchema,\n status: z.enum(['active', 'revoked', 'expired']),\n createdAt: elenaAgentTimestampSchema,\n expiresAt: elenaAgentTimestampSchema,\n revokedAt: elenaAgentTimestampSchema.nullable(),\n lastUsedAt: elenaAgentTimestampSchema.nullable(),\n};\nexport const elenaAgentKeyMetadataSchema = z.discriminatedUnion('kind', [\n z.strictObject({\n ...keyMetadata,\n kind: z.literal('agent'),\n mode: elenaAgentModeSchema,\n scopes: elenaAgentScopesSchema,\n }),\n z.strictObject({ ...keyMetadata, kind: z.literal('client') }),\n]);\nexport const elenaAgentKeyListSchema = z.strictObject({\n version: elenaAgentVersionSchema,\n keys: z.array(elenaAgentKeyMetadataSchema).max(20),\n});\nexport const elenaAgentKeyReceiptSchema = z.discriminatedUnion('kind', [\n z.strictObject({\n version: elenaAgentVersionSchema,\n kind: z.literal('agent'),\n key: elenaAgentKeyMetadataSchema.options[0],\n secret: elenaAgentSecretSchema,\n }),\n z.strictObject({\n version: elenaAgentVersionSchema,\n kind: z.literal('client'),\n key: elenaAgentKeyMetadataSchema.options[1],\n clientKey: elenaManualClientKeySchema,\n }),\n]);\nexport const elenaAgentKeyResponseSchema = z.strictObject({\n version: elenaAgentVersionSchema,\n key: elenaAgentKeyMetadataSchema,\n});\n\n// Hosts must additionally pin these returned URLs to the explicitly configured origins.\nexport const elenaAgentHttpsUrlSchema = z\n .url({ protocol: /^https$/ })\n .max(2048)\n .refine(\n (value) => /^https:\\/\\/[^/?#@\\\\\\s]+(?:[/?#]|$)/.test(value),\n 'URL must not contain userinfo',\n );\n// Portable wire shape; consuming hosts enforce HTTPS outside development.\nexport const elenaAgentConnectionUrlSchema = z\n .url({ protocol: /^https?$/ })\n .max(2048)\n .refine(\n (value) => /^https?:\\/\\/[^/?#@\\\\\\s]+(?:[/?#]|$)/.test(value),\n 'URL must not contain userinfo',\n );\nexport const elenaAgentBaseUrlSchema = elenaAgentHttpsUrlSchema.refine(\n (value) => /^https:\\/\\/[^/?#@\\\\\\s]+\\/?$/.test(value),\n 'Base URL must be an explicit origin',\n);\nexport const elenaAgentConnectionOriginSchema = elenaAgentConnectionUrlSchema.refine(\n (value) => /^https?:\\/\\/[^/?#@\\\\\\s]+\\/?$/.test(value),\n 'Base URL must be an explicit origin',\n);\nexport const elenaAgentPairingStartRequestSchema = z.strictObject({\n version: elenaAgentVersionSchema,\n label: elenaAgentNameSchema,\n});\nexport const elenaAgentPairingStartResponseSchema = z.strictObject({\n version: elenaAgentVersionSchema,\n pairingId: elenaAgentIdSchema,\n deviceCode: elenaAgentDeviceCodeSchema,\n userCode: elenaAgentUserCodeSchema,\n verificationUrl: elenaAgentConnectionUrlSchema,\n expiresAt: elenaAgentTimestampSchema,\n intervalSeconds: z.literal(ELENA_AGENT_LIMITS.pairingPollSeconds),\n});\nexport const elenaAgentPairingPollRequestSchema = z.strictObject({\n version: elenaAgentVersionSchema,\n deviceCode: elenaAgentDeviceCodeSchema,\n});\nexport const elenaAgentPairingReviewSchema = z.strictObject({\n version: elenaAgentVersionSchema,\n label: elenaAgentNameSchema,\n userCode: elenaAgentUserCodeSchema,\n state: z.enum(['pending', 'approved', 'rejected', 'expired', 'consumed']),\n expiresAt: elenaAgentTimestampSchema,\n});\nexport const elenaAgentPairingDecisionRequestSchema = z.discriminatedUnion('decision', [\n z.strictObject({\n version: elenaAgentVersionSchema,\n userCode: elenaAgentUserCodeSchema,\n decision: z.literal('approve'),\n mode: elenaAgentModeSchema.default('read'),\n scopes: elenaAgentScopesSchema.default(['catalog:read', 'assets:read']),\n ttlSeconds: keyTtl,\n }),\n z.strictObject({\n version: elenaAgentVersionSchema,\n userCode: elenaAgentUserCodeSchema,\n decision: z.literal('reject'),\n }),\n]);\nexport const elenaAgentPairingPollResponseSchema = z.discriminatedUnion('status', [\n z.strictObject({\n version: elenaAgentVersionSchema,\n status: z.literal('pending'),\n expiresAt: elenaAgentTimestampSchema,\n intervalSeconds: z.literal(ELENA_AGENT_LIMITS.pairingPollSeconds),\n }),\n z.strictObject({\n version: elenaAgentVersionSchema,\n status: z.literal('delivered'),\n restaurant: elenaAgentRestaurantSchema,\n credential: elenaAgentKeyReceiptSchema.options[0],\n }),\n]);\nexport const elenaAgentContextSchema = z\n .strictObject({\n version: elenaAgentVersionSchema,\n restaurant: elenaAgentRestaurantSchema,\n principal: z.strictObject({\n kind: z.literal('agent'),\n credentialId: elenaAgentIdSchema,\n credentialRevision: elenaAgentRevisionSchema,\n mode: elenaAgentModeSchema,\n scopes: elenaAgentScopesSchema,\n expiresAt: elenaAgentTimestampSchema,\n }),\n capabilities: z.strictObject({\n apiAccess: z.literal(true),\n menu: z.literal(true),\n imports: z.boolean(),\n media: z.boolean(),\n publication: z.boolean(),\n }),\n actions: z\n .array(elenaAgentActionSchema)\n .min(1)\n .max(8)\n .refine((actions) => new Set(actions).size === actions.length, 'Duplicate action'),\n })\n .superRefine((value, ctx) => {\n const requiredScopes = {\n 'catalog.read': 'catalog:read',\n 'assets.read': 'assets:read',\n 'assets.stage': 'assets:write',\n 'operations.propose': 'catalog:write',\n 'operations.apply': 'catalog:write',\n 'catalog.publish': 'catalog:publish',\n } as const;\n const writes: Partial<Record<z.infer<typeof elenaAgentActionSchema>, true>> = {\n 'assets.stage': true,\n 'operations.propose': true,\n 'operations.apply': true,\n 'catalog.publish': true,\n };\n for (const action of value.actions) {\n if (value.principal.mode === 'read' && writes[action]) {\n ctx.addIssue({\n code: 'custom',\n path: ['actions'],\n message: 'Read mode cannot expose mutation actions',\n });\n }\n const scope = requiredScopes[action as keyof typeof requiredScopes];\n if (scope && !value.principal.scopes.includes(scope)) {\n ctx.addIssue({\n code: 'custom',\n path: ['actions'],\n message: 'Action exceeds granted scopes',\n });\n }\n }\n if (\n value.actions.includes('catalog.publish') &&\n !value.principal.scopes.includes('catalog:write')\n ) {\n ctx.addIssue({\n code: 'custom',\n path: ['actions'],\n message: 'Publication also requires catalog:write',\n });\n }\n const expectedCapabilities = {\n imports:\n value.actions.includes('operations.propose') && value.actions.includes('operations.apply'),\n media: value.actions.includes('assets.stage'),\n publication: value.actions.includes('catalog.publish'),\n };\n for (const capability of ['imports', 'media', 'publication'] as const) {\n if (value.capabilities[capability] !== expectedCapabilities[capability]) {\n ctx.addIssue({\n code: 'custom',\n path: ['capabilities', capability],\n message: 'Capability must match effective actions',\n });\n }\n }\n });\nexport const elenaClientContextSchema = z.strictObject({\n version: elenaAgentVersionSchema,\n restaurant: elenaAgentRestaurantSchema,\n capabilities: z.strictObject({ menu: z.literal(true), assets: z.literal(true) }),\n});\n\nexport const elenaAgentCliAuthStatusSchema = z.strictObject({\n version: elenaAgentVersionSchema,\n authenticated: z.boolean(),\n source: z.enum(['store', 'environment', 'none']),\n baseUrl: elenaAgentBaseUrlSchema.nullable(),\n credentialId: elenaAgentIdSchema.nullable(),\n restaurantId: elenaAgentIdSchema.nullable(),\n expiresAt: elenaAgentTimestampSchema.nullable(),\n});\nexport const elenaAgentCliLogoutSchema = z.strictObject({\n version: elenaAgentVersionSchema,\n loggedOut: z.literal(true),\n remoteRevoked: z.literal(false),\n environmentCredentialPresent: z.boolean(),\n});\n\nexport type ElenaAgentScopeV1 = z.infer<typeof elenaAgentScopeSchema>;\nexport type ElenaAgentActionV1 = z.infer<typeof elenaAgentActionSchema>;\nexport type ElenaAgentKeyCreateRequestV1 = z.infer<typeof elenaAgentKeyCreateRequestSchema>;\nexport type ElenaAgentKeyPolicyRequestV1 = z.infer<typeof elenaAgentKeyPolicyRequestSchema>;\nexport type ElenaAgentKeyMetadataV1 = z.infer<typeof elenaAgentKeyMetadataSchema>;\nexport type ElenaAgentKeyReceiptV1 = z.infer<typeof elenaAgentKeyReceiptSchema>;\nexport type ElenaAgentPairingStartRequestV1 = z.infer<typeof elenaAgentPairingStartRequestSchema>;\nexport type ElenaAgentPairingStartResponseV1 = z.infer<typeof elenaAgentPairingStartResponseSchema>;\nexport type ElenaAgentPairingPollRequestV1 = z.infer<typeof elenaAgentPairingPollRequestSchema>;\nexport type ElenaAgentPairingPollResponseV1 = z.infer<typeof elenaAgentPairingPollResponseSchema>;\nexport type ElenaAgentPairingDecisionRequestV1 = z.infer<\n typeof elenaAgentPairingDecisionRequestSchema\n>;\nexport type ElenaAgentContextV1 = z.infer<typeof elenaAgentContextSchema>;\nexport type ElenaClientContextV1 = z.infer<typeof elenaClientContextSchema>;\nexport type ElenaAgentPairingReviewV1 = z.infer<typeof elenaAgentPairingReviewSchema>;\nexport type ElenaAgentKeyRevokeRequestV1 = z.infer<typeof elenaAgentKeyRevokeRequestSchema>;\nexport type ElenaAgentKeyReplaceRequestV1 = z.infer<typeof elenaAgentKeyReplaceRequestSchema>;\nexport type ElenaAgentKeyResponseV1 = z.infer<typeof elenaAgentKeyResponseSchema>;\nexport type ElenaAgentKeyListV1 = z.infer<typeof elenaAgentKeyListSchema>;\nexport type ElenaAgentCliAuthStatusV1 = z.infer<typeof elenaAgentCliAuthStatusSchema>;\nexport type ElenaAgentCliLogoutV1 = z.infer<typeof elenaAgentCliLogoutSchema>;\n","import { z } from 'zod';\n\nexport const ELENA_AGENT_CONTRACT_VERSION = '1' as const;\nexport const elenaAgentVersionSchema = z.literal(ELENA_AGENT_CONTRACT_VERSION);\nexport const elenaAgentIdSchema = z.uuid();\nexport const elenaAgentRevisionSchema = z.number().int().min(1).max(Number.MAX_SAFE_INTEGER);\nexport const elenaAgentTimestampSchema = z.iso.datetime();\nexport const elenaAgentHashSchema = z.string().regex(/^[a-f0-9]{64}$/);\nexport const elenaAgentRefSchema = z.string().regex(/^[a-zA-Z0-9][a-zA-Z0-9._:-]{0,99}$/);\nexport const elenaAgentNameSchema = z.string().trim().min(1).max(160);\nexport const elenaAgentTextSchema = z.string().trim().min(1).max(2000);\nexport const elenaAgentCurrencySchema = z.literal('PEN');\n\n// Exact decimal(10,2) wire strings; never round, coerce, or pass through floats.\nexport const elenaAgentNonnegativeMoneySchema = z.string().regex(/^(0|[1-9]\\d{0,7})\\.\\d{2}$/);\nexport const elenaAgentMoneySchema = elenaAgentNonnegativeMoneySchema.refine(\n (value) => value !== '0.00',\n 'Product price must be greater than zero',\n);\n\nexport const ELENA_AGENT_LIMITS = Object.freeze({\n categoriesPerImport: 50,\n productsPerImport: 200,\n changesPerOperation: 200,\n publicationProducts: 200,\n galleryImages: 8,\n extraGroups: 10,\n optionsPerGroup: 30,\n jsonBytes: 1024 * 1024,\n mediaBytes: 10 * 1024 * 1024,\n stagedBytesPerRestaurant: 100 * 1024 * 1024,\n stagedFilesPerRestaurant: 20,\n openOperationsPerRestaurant: 20,\n openPreviewsPerRestaurant: 20,\n activeKeysPerFamily: 10,\n keyDefaultTtlSeconds: 30 * 24 * 60 * 60,\n keyMaxTtlSeconds: 90 * 24 * 60 * 60,\n pairingTtlSeconds: 600,\n pairingPollSeconds: 5,\n proposalTtlSeconds: 24 * 60 * 60,\n previewTtlSeconds: 24 * 60 * 60,\n stagingTtlSeconds: 48 * 60 * 60,\n applyWindowSeconds: 60 * 60,\n workerLeaseSeconds: 30,\n workerHeartbeatSeconds: 10,\n maxWorkerAttempts: 5,\n resultRetentionDays: 90,\n pageSize: 100,\n} as const);\n\nexport const elenaAgentErrorCodeSchema = z.enum([\n 'INVALID_REQUEST',\n 'UNSUPPORTED_VERSION',\n 'CREDENTIAL_REQUIRED',\n 'CREDENTIAL_INVALID',\n 'CREDENTIAL_EXPIRED',\n 'CREDENTIAL_REVOKED',\n 'CREDENTIAL_MIXED',\n 'CREDENTIAL_WRONG_FAMILY',\n 'OWNER_REQUIRED',\n 'ORIGIN_REJECTED',\n 'APPROVAL_REQUIRED',\n 'APPROVAL_REJECTED',\n 'APPROVAL_EXPIRED',\n 'APPROVAL_MISMATCH',\n 'SCOPE_REQUIRED',\n 'MODE_READ_ONLY',\n 'API_ACCESS_DISABLED',\n 'RESTAURANT_NOT_APPROVED',\n 'NOT_FOUND',\n 'VERSION_CONFLICT',\n 'IDEMPOTENCY_CONFLICT',\n 'INVALID_PRICE',\n 'UNCONFIRMED_DATA',\n 'REFERENCE_CONFLICT',\n 'MEDIA_INVALID',\n 'MEDIA_EXPIRED',\n 'QUOTA_EXCEEDED',\n 'RATE_LIMITED',\n 'PAIRING_PENDING',\n 'PAIRING_DENIED',\n 'PAIRING_EXPIRED',\n 'PAIRING_CONSUMED',\n 'OPERATION_TERMINAL',\n 'APPLY_WINDOW_EXPIRED',\n 'DEPENDENCY_FAILED',\n 'TEMPORARY_UNAVAILABLE',\n 'INTERNAL_ERROR',\n]);\nexport const elenaAgentErrorSchema = z.strictObject({\n version: elenaAgentVersionSchema,\n error: z.strictObject({\n code: elenaAgentErrorCodeSchema,\n message: z.string().max(500),\n retryable: z.boolean(),\n requestId: elenaAgentRefSchema,\n retryAfterSeconds: z.number().int().min(1).max(3600).optional(),\n issues: z\n .array(\n z.strictObject({\n path: z.string().max(200),\n code: elenaAgentErrorCodeSchema,\n message: z.string().max(200),\n }),\n )\n .max(250)\n .optional(),\n }),\n});\nexport const elenaAgentPageQuerySchema = z.strictObject({\n version: elenaAgentVersionSchema,\n cursor: z\n .string()\n .regex(/^[a-zA-Z0-9_-]{1,512}$/)\n .optional(),\n limit: z.number().int().min(1).max(ELENA_AGENT_LIMITS.pageSize).default(50),\n});\nexport const elenaAgentEmptyRequestSchema = z.strictObject({ version: elenaAgentVersionSchema });\nexport const elenaAgentAckSchema = z.strictObject({\n version: elenaAgentVersionSchema,\n ok: z.literal(true),\n});\n\nexport type ElenaAgentErrorCodeV1 = z.infer<typeof elenaAgentErrorCodeSchema>;\nexport type ElenaAgentErrorV1 = z.infer<typeof elenaAgentErrorSchema>;\nexport type ElenaAgentPageQueryV1 = z.infer<typeof elenaAgentPageQuerySchema>;\n","import { z } from 'zod';\nimport {\n ELENA_AGENT_LIMITS,\n elenaAgentHashSchema,\n elenaAgentIdSchema,\n elenaAgentMoneySchema,\n elenaAgentNameSchema,\n elenaAgentNonnegativeMoneySchema,\n elenaAgentRefSchema,\n elenaAgentRevisionSchema,\n elenaAgentTextSchema,\n elenaAgentTimestampSchema,\n elenaAgentVersionSchema,\n} from './common';\nimport { elenaAgentHttpsUrlSchema } from './access';\n\nexport const elenaAgentExistingTargetSchema = z.strictObject({\n kind: z.literal('id'),\n id: elenaAgentIdSchema,\n expectedVersion: elenaAgentRevisionSchema,\n});\nexport const elenaAgentExternalTargetSchema = z.strictObject({\n kind: z.literal('external'),\n namespace: elenaAgentRefSchema,\n key: elenaAgentRefSchema,\n expectedVersion: elenaAgentRevisionSchema.nullable(),\n});\nexport const elenaAgentTargetSchema = z.discriminatedUnion('kind', [\n elenaAgentExistingTargetSchema,\n elenaAgentExternalTargetSchema,\n]);\nexport const elenaAgentCategoryReferenceSchema = z.discriminatedUnion('kind', [\n elenaAgentExistingTargetSchema,\n z.strictObject({ kind: z.literal('ref'), ref: elenaAgentRefSchema }),\n]);\nexport const elenaAgentDescriptionSchema = z.discriminatedUnion('status', [\n z.strictObject({ status: z.literal('transcribed'), text: elenaAgentTextSchema }),\n z.strictObject({ status: z.literal('proposed'), text: elenaAgentTextSchema }),\n]);\nexport const elenaAgentConfirmedPriceSchema = z.strictObject({\n status: z.literal('confirmed'),\n amount: elenaAgentMoneySchema,\n basis: z.literal('operator'),\n});\nexport const elenaAgentDraftPriceSchema = z.discriminatedUnion('status', [\n elenaAgentConfirmedPriceSchema,\n z.strictObject({\n status: z.literal('unconfirmed'),\n reason: z.enum(['missing', 'illegible']),\n rawText: z.string().max(100).nullable(),\n }),\n]);\nexport const elenaAgentMediaReferenceSchema = z.discriminatedUnion('kind', [\n z.strictObject({\n kind: z.literal('existing'),\n assetId: elenaAgentIdSchema,\n sha256: elenaAgentHashSchema,\n }),\n z.strictObject({\n kind: z.literal('staged'),\n stagingId: elenaAgentIdSchema,\n sha256: elenaAgentHashSchema,\n }),\n]);\nexport const elenaAgentGallerySchema = z\n .array(elenaAgentMediaReferenceSchema)\n .max(ELENA_AGENT_LIMITS.galleryImages)\n .refine(\n (images) =>\n new Set(images.map((image) => (image.kind === 'existing' ? image.assetId : image.stagingId)))\n .size === images.length,\n 'Duplicate media reference',\n );\nexport const elenaAgentExtraOptionSchema = z.strictObject({\n name: elenaAgentNameSchema,\n additionalPrice: elenaAgentNonnegativeMoneySchema,\n order: z.number().int().min(0).max(1000),\n});\nexport const elenaAgentExtraGroupSchema = z\n .strictObject({\n name: elenaAgentNameSchema,\n required: z.boolean(),\n minSelections: z.number().int().min(0).max(ELENA_AGENT_LIMITS.optionsPerGroup),\n maxSelections: z.number().int().min(1).max(ELENA_AGENT_LIMITS.optionsPerGroup),\n order: z.number().int().min(0).max(1000),\n options: z.array(elenaAgentExtraOptionSchema).min(1).max(ELENA_AGENT_LIMITS.optionsPerGroup),\n })\n .superRefine((group, ctx) => {\n if (group.minSelections > group.maxSelections || group.maxSelections > group.options.length) {\n ctx.addIssue({\n code: 'custom',\n path: ['maxSelections'],\n message: 'Invalid selection bounds',\n });\n }\n if (\n (group.required && group.minSelections < 1) ||\n (!group.required && group.minSelections !== 0)\n ) {\n ctx.addIssue({\n code: 'custom',\n path: ['minSelections'],\n message: 'Required must match minimum selection count',\n });\n }\n if (\n new Set(\n group.options.map((option) => option.name.normalize('NFKC').trim().toLocaleLowerCase('es')),\n ).size !== group.options.length\n ) {\n ctx.addIssue({ code: 'custom', path: ['options'], message: 'Duplicate option name' });\n }\n });\nexport const elenaAgentExtrasSchema = z\n .strictObject({\n confirmed: z.literal(true),\n groups: z.array(elenaAgentExtraGroupSchema).max(ELENA_AGENT_LIMITS.extraGroups),\n })\n .refine(\n (extras) =>\n new Set(\n extras.groups.map((group) => group.name.normalize('NFKC').trim().toLocaleLowerCase('es')),\n ).size === extras.groups.length,\n 'Duplicate group name',\n );\nexport const elenaAgentCategoryDataSchema = z.strictObject({\n name: elenaAgentNameSchema,\n description: elenaAgentDescriptionSchema.nullable(),\n order: z.number().int().min(0).max(10000),\n});\nconst productFields = {\n type: z.literal('menu'),\n name: elenaAgentNameSchema,\n description: elenaAgentDescriptionSchema.nullable(),\n category: elenaAgentCategoryReferenceSchema,\n available: z.boolean(),\n images: elenaAgentGallerySchema,\n extras: elenaAgentExtrasSchema,\n};\nexport const elenaAgentProductDataSchema = z.strictObject({\n ...productFields,\n price: elenaAgentConfirmedPriceSchema,\n});\nexport const elenaAgentDraftProductDataSchema = z.strictObject({\n ...productFields,\n price: elenaAgentDraftPriceSchema,\n});\nexport const elenaAgentCategoryChangeSchema = z.strictObject({\n kind: z.literal('category.upsert'),\n ref: elenaAgentRefSchema,\n target: elenaAgentTargetSchema,\n data: elenaAgentCategoryDataSchema,\n});\nexport const elenaAgentProductChangeSchema = z.strictObject({\n kind: z.literal('product.upsert'),\n ref: elenaAgentRefSchema,\n target: elenaAgentTargetSchema,\n data: elenaAgentProductDataSchema,\n});\nexport const elenaAgentChangeSchema = z.discriminatedUnion('kind', [\n elenaAgentCategoryChangeSchema,\n elenaAgentProductChangeSchema,\n]);\n\nexport const elenaAgentCategorySchema = z.strictObject({\n id: elenaAgentIdSchema,\n revision: elenaAgentRevisionSchema,\n name: elenaAgentNameSchema,\n description: elenaAgentTextSchema.nullable(),\n order: z.number().int().min(0).max(10000),\n});\nexport const elenaAgentProductSchema = z.strictObject({\n id: elenaAgentIdSchema,\n revision: elenaAgentRevisionSchema,\n type: z.literal('menu'),\n name: elenaAgentNameSchema,\n basePrice: elenaAgentMoneySchema,\n description: elenaAgentTextSchema.nullable(),\n categoryId: elenaAgentIdSchema,\n available: z.boolean(),\n publishedToMenu: z.boolean(),\n isDraft: z.boolean(),\n images: z\n .array(z.strictObject({ assetId: elenaAgentIdSchema, sha256: elenaAgentHashSchema }))\n .max(ELENA_AGENT_LIMITS.galleryImages),\n /** Present on current native reads; optional only for retained v1 snapshots. */\n primaryImageId: elenaAgentIdSchema.nullable().optional(),\n extraGroups: z.array(elenaAgentExtraGroupSchema).max(ELENA_AGENT_LIMITS.extraGroups),\n});\nexport const elenaAgentCategoryListSchema = z.strictObject({\n version: elenaAgentVersionSchema,\n categories: z.array(elenaAgentCategorySchema).max(ELENA_AGENT_LIMITS.pageSize),\n nextCursor: z\n .string()\n .regex(/^[a-zA-Z0-9_-]{1,512}$/)\n .nullable(),\n});\nexport const elenaAgentProductListSchema = z.strictObject({\n version: elenaAgentVersionSchema,\n products: z.array(elenaAgentProductSchema).max(ELENA_AGENT_LIMITS.pageSize),\n nextCursor: z\n .string()\n .regex(/^[a-zA-Z0-9_-]{1,512}$/)\n .nullable(),\n});\nexport const elenaAgentProductResponseSchema = z.strictObject({\n version: elenaAgentVersionSchema,\n product: elenaAgentProductSchema,\n /** Authoritative editing metadata; never infer primary image from gallery order. */\n editable: z.strictObject({\n restaurantId: elenaAgentIdSchema,\n productId: elenaAgentIdSchema,\n imageId: elenaAgentIdSchema.nullable(),\n categoryRevision: elenaAgentRevisionSchema,\n primaryImage: z.strictObject({ assetId: elenaAgentIdSchema, sha256: elenaAgentHashSchema }).nullable().optional(),\n imageEditorUrl: elenaAgentHttpsUrlSchema.optional(),\n }).optional(),\n});\nexport const elenaAgentCategoryResponseSchema = z.strictObject({\n version: elenaAgentVersionSchema,\n category: elenaAgentCategorySchema,\n});\nexport const elenaAgentMediaStageRequestSchema = z.strictObject({\n version: elenaAgentVersionSchema,\n idempotencyKey: elenaAgentRefSchema,\n fileName: z.string().regex(/^[a-zA-Z0-9][a-zA-Z0-9._-]{0,119}\\.(?:jpg|jpeg|png|webp)$/),\n mimeType: z.enum(['image/jpeg', 'image/png', 'image/webp']),\n bytes: z.number().int().min(1).max(ELENA_AGENT_LIMITS.mediaBytes),\n sha256: elenaAgentHashSchema,\n});\nexport const elenaAgentMediaStagedSchema = z.strictObject({\n version: elenaAgentVersionSchema,\n stagingId: elenaAgentIdSchema,\n sha256: elenaAgentHashSchema,\n mimeType: z.enum(['image/jpeg', 'image/png', 'image/webp']),\n bytes: z.number().int().min(1).max(ELENA_AGENT_LIMITS.mediaBytes),\n expiresAt: elenaAgentTimestampSchema,\n});\nexport const elenaAgentAssetSchema = z.strictObject({\n version: elenaAgentVersionSchema,\n assetId: elenaAgentIdSchema,\n sha256: elenaAgentHashSchema,\n mimeType: z.enum(['image/jpeg', 'image/png', 'image/webp']),\n bytes: z.number().int().min(1).max(ELENA_AGENT_LIMITS.mediaBytes),\n});\n\n// Deliberately distinct from private product DTOs and from the unchanged slug API.\nexport const elenaClientAssetSchema = z.strictObject({\n assetId: elenaAgentIdSchema,\n url: elenaAgentHttpsUrlSchema,\n});\nexport const elenaClientCategorySchema = z.strictObject({\n id: elenaAgentIdSchema,\n name: elenaAgentNameSchema,\n description: elenaAgentTextSchema.nullable(),\n order: z.number().int().min(0).max(10000),\n});\nexport const elenaClientProductSchema = z.strictObject({\n id: elenaAgentIdSchema,\n type: z.literal('menu'),\n name: elenaAgentNameSchema,\n basePrice: elenaAgentMoneySchema,\n description: elenaAgentTextSchema.nullable(),\n categoryId: elenaAgentIdSchema,\n available: z.boolean(),\n images: z.array(elenaClientAssetSchema).max(ELENA_AGENT_LIMITS.galleryImages),\n extraGroups: z.array(elenaAgentExtraGroupSchema).max(ELENA_AGENT_LIMITS.extraGroups),\n});\nexport const elenaClientCatalogSchema = z.strictObject({\n version: elenaAgentVersionSchema,\n categories: z.array(elenaClientCategorySchema).max(ELENA_AGENT_LIMITS.pageSize),\n products: z.array(elenaClientProductSchema).max(ELENA_AGENT_LIMITS.pageSize),\n nextCursor: z\n .string()\n .regex(/^[a-zA-Z0-9_-]{1,512}$/)\n .nullable(),\n});\nexport const elenaClientProductResponseSchema = z.strictObject({\n version: elenaAgentVersionSchema,\n product: elenaClientProductSchema,\n});\nexport const elenaClientAssetResponseSchema = z.strictObject({\n version: elenaAgentVersionSchema,\n asset: elenaClientAssetSchema,\n});\n\nexport type ElenaAgentTargetV1 = z.infer<typeof elenaAgentTargetSchema>;\nexport type ElenaAgentProductDataV1 = z.infer<typeof elenaAgentProductDataSchema>;\nexport type ElenaAgentCategoryDataV1 = z.infer<typeof elenaAgentCategoryDataSchema>;\nexport type ElenaAgentChangeV1 = z.infer<typeof elenaAgentChangeSchema>;\nexport type ElenaAgentProductV1 = z.infer<typeof elenaAgentProductSchema>;\nexport type ElenaAgentCategoryV1 = z.infer<typeof elenaAgentCategorySchema>;\nexport type ElenaAgentMediaStageRequestV1 = z.infer<typeof elenaAgentMediaStageRequestSchema>;\nexport type ElenaAgentMediaStagedV1 = z.infer<typeof elenaAgentMediaStagedSchema>;\nexport type ElenaAgentAssetV1 = z.infer<typeof elenaAgentAssetSchema>;\nexport type ElenaClientCatalogV1 = z.infer<typeof elenaClientCatalogSchema>;\nexport type ElenaClientProductV1 = z.infer<typeof elenaClientProductSchema>;\nexport type ElenaAgentCategoryListV1 = z.infer<typeof elenaAgentCategoryListSchema>;\nexport type ElenaAgentCategoryResponseV1 = z.infer<typeof elenaAgentCategoryResponseSchema>;\nexport type ElenaAgentProductListV1 = z.infer<typeof elenaAgentProductListSchema>;\nexport type ElenaAgentProductResponseV1 = z.infer<typeof elenaAgentProductResponseSchema>;\nexport type ElenaAgentMediaReferenceV1 = z.infer<typeof elenaAgentMediaReferenceSchema>;\nexport type ElenaAgentExtraGroupV1 = z.infer<typeof elenaAgentExtraGroupSchema>;\nexport type ElenaClientProductResponseV1 = z.infer<typeof elenaClientProductResponseSchema>;\nexport type ElenaClientAssetV1 = z.infer<typeof elenaClientAssetSchema>;\nexport type ElenaClientAssetResponseV1 = z.infer<typeof elenaClientAssetResponseSchema>;\n","import {\n ELENA_AGENT_LIMITS,\n elenaAgentErrorSchema,\n elenaAgentIdSchema,\n elenaAgentPageQuerySchema,\n type ElenaAgentErrorCodeV1,\n type ElenaAgentPageQueryV1,\n} from '../../shared/src/agent-contracts/common';\nimport type { ElenaFetch } from './http-client';\n\nexport type ElenaKeyTransportErrorCode =\n | ElenaAgentErrorCodeV1\n | 'INVALID_RESPONSE'\n | 'NETWORK_ERROR'\n | 'TIMEOUT'\n | 'ABORTED'\n | 'REDIRECT_REJECTED';\n\n/** Intentionally never retains a raw response, request, rejected value, or cause. */\nexport class ElenaAgentTransportError extends Error {\n readonly name = 'ElenaAgentTransportError';\n constructor(\n readonly code: ElenaKeyTransportErrorCode,\n readonly status = 0,\n readonly retryable = false,\n readonly requestId: string | null = null,\n readonly retryAfterSeconds?: number,\n ) {\n super(`Elena request failed (${code}).`);\n }\n}\n\nexport interface ElenaKeyRequestOptions {\n signal?: AbortSignal;\n /** Total request budget, including response consumption and retry delays. */\n timeoutMs?: number;\n}\n\nexport interface ElenaKeyTransportOptions {\n baseUrl: string;\n fetch?: ElenaFetch;\n timeoutMs?: number;\n /** Zero, one, or two additional attempts; default two. */\n maxRetries?: number;\n /** Only loopback HTTP with an explicitly injected test fetch is accepted. */\n testing?: { allowHttp: true };\n}\n\nexport type ElenaKeyPageQuery = Omit<ElenaAgentPageQueryV1, 'limit'> & { limit?: number };\n\ntype Schema<T> = { safeParse: (value: unknown) => { success: true; data: T } | { success: false } };\n\nexport function parseWire<T>(schema: Schema<T>, value: unknown, response = false): T {\n let unsupportedVersion = false;\n try {\n if (value !== null && typeof value === 'object' && 'version' in value) {\n unsupportedVersion = value.version !== undefined && value.version !== '1';\n }\n const parsed = schema.safeParse(value);\n if (parsed.success) return parsed.data;\n } catch {\n /* Do not surface Zod input, getters, or exception messages. */\n }\n throw new ElenaAgentTransportError(\n unsupportedVersion ? 'UNSUPPORTED_VERSION' : response ? 'INVALID_RESPONSE' : 'INVALID_REQUEST',\n );\n}\n\nexport function assertOptionKeys(value: object, keys: readonly string[]): void {\n if (\n !value ||\n typeof value !== 'object' ||\n Object.keys(value).some((key) => !keys.includes(key))\n ) {\n throw new ElenaAgentTransportError('INVALID_REQUEST');\n }\n}\n\nexport function explicitOrigin(value: string, allowTestHttp = false): string {\n try {\n if (typeof value !== 'string' || !/^https?:\\/\\/[^/?#@\\\\\\s]+\\/?$/.test(value)) throw 0;\n if (/elena_(?:sk|pk)_/i.test(value)) throw 0;\n const url = new URL(value);\n const loopback = ['localhost', '127.0.0.1', '[::1]'].includes(url.hostname);\n if (\n url.protocol !== 'https:' &&\n !(\n url.protocol === 'http:' &&\n ((typeof process !== 'undefined' && process.env.NODE_ENV === 'development') ||\n (allowTestHttp && loopback))\n )\n )\n throw 0;\n if (url.username || url.password || url.search || url.hash || url.pathname !== '/') throw 0;\n return url.origin;\n } catch {\n throw new ElenaAgentTransportError('ORIGIN_REJECTED');\n }\n}\n\nexport function resourceId(value: string): string {\n return parseWire(elenaAgentIdSchema, value);\n}\n\nexport function pageQuery(value: ElenaKeyPageQuery = { version: '1' }): string {\n const query = parseWire(elenaAgentPageQuerySchema, value);\n const params = new URLSearchParams({ version: query.version, limit: String(query.limit) });\n if (query.cursor !== undefined) params.set('cursor', query.cursor);\n return `?${params}`;\n}\n\nexport function jsonBody<T>(schema: Schema<T>, value: unknown): string {\n const text = JSON.stringify(parseWire(schema, value));\n if (new TextEncoder().encode(text).byteLength > ELENA_AGENT_LIMITS.jsonBytes) {\n throw new ElenaAgentTransportError('INVALID_REQUEST');\n }\n return text;\n}\n\nfunction timeoutValue(value: number): number {\n if (!Number.isInteger(value) || value < 1 || value > 300_000) {\n throw new ElenaAgentTransportError('INVALID_REQUEST');\n }\n return value;\n}\n\nconst privateCredential = /elena_sk_[A-Za-z0-9_-]{43}/;\nconst retryCodes: Partial<Record<ElenaAgentErrorCodeV1, true>> = {\n RATE_LIMITED: true,\n TEMPORARY_UNAVAILABLE: true,\n};\n\n/** Internal only: clients close over this transport; no credential-bearing fields are exported. */\nexport function createKeyTransport(\n options: ElenaKeyTransportOptions,\n header: 'x-elena-client-key' | 'x-elena-agent-key' | null,\n credential: string,\n) {\n if (options.testing !== undefined) {\n assertOptionKeys(options.testing, ['allowHttp']);\n if (options.testing.allowHttp !== true || !options.fetch) {\n throw new ElenaAgentTransportError('INVALID_REQUEST');\n }\n }\n const baseUrl = explicitOrigin(options.baseUrl, options.testing?.allowHttp === true);\n const fetchImpl = options.fetch ?? globalThis.fetch;\n if (typeof fetchImpl !== 'function') throw new ElenaAgentTransportError('INVALID_REQUEST');\n const defaultTimeout = timeoutValue(options.timeoutMs ?? 30_000);\n const retries = options.maxRetries ?? 2;\n if (!Number.isInteger(retries) || retries < 0 || retries > 2) {\n throw new ElenaAgentTransportError('INVALID_REQUEST');\n }\n\n async function request<T>(\n path: string,\n schema: Schema<T>,\n requestOptions: ElenaKeyRequestOptions = {},\n body?: string | (() => FormData),\n stage = false,\n retryAmbiguous = true,\n ): Promise<T> {\n assertOptionKeys(requestOptions, ['signal', 'timeoutMs']);\n if (\n privateCredential.test(path) ||\n (credential && path.includes(credential)) ||\n (typeof body === 'string' &&\n (privateCredential.test(body) || (credential && body.includes(credential))))\n ) {\n throw new ElenaAgentTransportError('INVALID_REQUEST');\n }\n if (requestOptions.signal !== undefined && !(requestOptions.signal instanceof AbortSignal)) {\n throw new ElenaAgentTransportError('INVALID_REQUEST');\n }\n const timeoutMs = timeoutValue(requestOptions.timeoutMs ?? (stage ? 120_000 : defaultTimeout));\n if (requestOptions.signal?.aborted) throw new ElenaAgentTransportError('ABORTED');\n const controller = new AbortController();\n let timedOut = false;\n const timer = setTimeout(() => {\n timedOut = true;\n controller.abort();\n }, timeoutMs);\n const onAbort = () => controller.abort();\n requestOptions.signal?.addEventListener('abort', onAbort, { once: true });\n const abortError = () => new ElenaAgentTransportError(timedOut ? 'TIMEOUT' : 'ABORTED');\n const deadline = Date.now() + timeoutMs;\n // Node 18 supports neither Promise.withResolvers nor a cancellation primitive for arbitrary fetches.\n // Race also bounds injected fetch implementations that ignore AbortSignal.\n const bounded = <V>(promise: Promise<V>): Promise<V> =>\n new Promise((resolve, reject) => {\n const abort = () => {\n cleanup();\n reject(abortError());\n };\n const cleanup = () => controller.signal.removeEventListener('abort', abort);\n if (controller.signal.aborted) {\n reject(abortError());\n return;\n }\n controller.signal.addEventListener('abort', abort, { once: true });\n promise.then(\n (value) => {\n cleanup();\n resolve(value);\n },\n (error: unknown) => {\n cleanup();\n reject(error);\n },\n );\n });\n const delay = (ms: number) =>\n new Promise<void>((resolve, reject) => {\n const abort = () => {\n clearTimeout(wait);\n controller.signal.removeEventListener('abort', abort);\n reject(abortError());\n };\n const wait = setTimeout(() => {\n controller.signal.removeEventListener('abort', abort);\n resolve();\n }, ms);\n controller.signal.addEventListener('abort', abort, { once: true });\n if (controller.signal.aborted) abort();\n });\n try {\n for (let attempt = 0; ; attempt++) {\n let failure: ElenaAgentTransportError;\n let retryDelay = 100 * 2 ** attempt;\n try {\n const headers = new Headers({ Accept: 'application/json' });\n if (header) headers.set(header, credential);\n if (typeof body === 'string') headers.set('Content-Type', 'application/json');\n const response = await bounded(\n Promise.resolve()\n .then(() => {\n if (controller.signal.aborted) throw abortError();\n return fetchImpl(`${baseUrl}${path}`, {\n method: body === undefined ? 'GET' : 'POST',\n headers,\n body: typeof body === 'function' ? body() : body,\n credentials: 'omit',\n redirect: 'error',\n referrerPolicy: 'no-referrer',\n cache: 'no-store',\n signal: controller.signal,\n });\n })\n .catch(() => {\n // The injected transport is an external boundary, even if it throws our error class.\n throw new ElenaAgentTransportError('NETWORK_ERROR', 0, retryAmbiguous);\n }),\n );\n if (response.redirected || (response.status >= 300 && response.status < 400)) {\n throw new ElenaAgentTransportError('REDIRECT_REJECTED', response.status);\n }\n if (response.url && new URL(response.url).origin !== baseUrl) {\n throw new ElenaAgentTransportError('ORIGIN_REJECTED');\n }\n const text = await bounded(\n Promise.resolve()\n .then(() => response.text())\n .catch(() => {\n throw new ElenaAgentTransportError('NETWORK_ERROR', 0, retryAmbiguous);\n }),\n );\n // Successful schemas contain human text too. Never return echoed credentials.\n if (privateCredential.test(text) || (credential && text.includes(credential))) {\n throw new ElenaAgentTransportError('INVALID_RESPONSE', response.status);\n }\n let payload: unknown;\n try {\n payload = JSON.parse(text);\n } catch {\n throw new ElenaAgentTransportError('INVALID_RESPONSE', response.status);\n }\n const decodedText = JSON.stringify(payload);\n if (\n privateCredential.test(decodedText) ||\n (credential && decodedText.includes(credential))\n ) {\n throw new ElenaAgentTransportError('INVALID_RESPONSE', response.status);\n }\n if (response.ok) return parseWire(schema, payload, true);\n const wire = parseWire(elenaAgentErrorSchema, payload, true).error;\n const retryable =\n retryCodes[wire.code] === true &&\n wire.retryable &&\n ((wire.code === 'RATE_LIMITED' && response.status === 429) ||\n (wire.code === 'TEMPORARY_UNAVAILABLE' && response.status === 503));\n failure = new ElenaAgentTransportError(\n wire.code,\n response.status,\n retryable,\n wire.requestId,\n wire.retryAfterSeconds,\n );\n const retryAfter = response.headers.get('retry-after');\n let headerDelay = 0;\n if (retryAfter !== null) {\n const seconds = /^\\d+$/.test(retryAfter)\n ? Number(retryAfter)\n : (Date.parse(retryAfter) - Date.now()) / 1000;\n // Never retry sooner when a server delay cannot be interpreted safely.\n if (!Number.isFinite(seconds) || seconds < 0 || seconds > 3600) {\n throw new ElenaAgentTransportError(\n wire.code,\n response.status,\n false,\n wire.requestId,\n wire.retryAfterSeconds,\n );\n }\n headerDelay = Math.ceil(seconds * 1000);\n }\n retryDelay = Math.max(retryDelay, headerDelay, (wire.retryAfterSeconds ?? 0) * 1000);\n } catch (error) {\n if (controller.signal.aborted) throw abortError();\n failure =\n error instanceof ElenaAgentTransportError\n ? error\n : new ElenaAgentTransportError('NETWORK_ERROR', 0, retryAmbiguous);\n }\n if (!failure.retryable || attempt >= retries || Date.now() + retryDelay >= deadline)\n throw failure;\n await delay(retryDelay);\n }\n } finally {\n clearTimeout(timer);\n requestOptions.signal?.removeEventListener('abort', onAbort);\n }\n }\n return { request };\n}\n","import type { ElenaClientContextV1 } from '../../shared/src/agent-contracts/access';\nimport type {\n ElenaClientCatalogV1,\n ElenaClientProductResponseV1,\n ElenaClientAssetResponseV1,\n} from '../../shared/src/agent-contracts/catalog';\nimport {\n elenaClientContextSchema,\n elenaClientKeySchema,\n} from '../../shared/src/agent-contracts/access';\nimport {\n elenaClientAssetResponseSchema,\n elenaClientCatalogSchema,\n elenaClientProductResponseSchema,\n} from '../../shared/src/agent-contracts/catalog';\nimport {\n assertOptionKeys,\n createKeyTransport,\n ElenaAgentTransportError,\n pageQuery,\n resourceId,\n type ElenaKeyPageQuery,\n type ElenaKeyRequestOptions,\n type ElenaKeyTransportOptions,\n} from './key-transport';\n\nexport interface ElenaClientKeyClientOptions extends ElenaKeyTransportOptions {\n clientKey: string;\n}\n\nexport interface ElenaClientKeyClient {\n context: { get(options?: ElenaKeyRequestOptions): Promise<ElenaClientContextV1> };\n catalog: {\n list(\n query?: ElenaKeyPageQuery,\n options?: ElenaKeyRequestOptions,\n ): Promise<ElenaClientCatalogV1>;\n getProduct(id: string, options?: ElenaKeyRequestOptions): Promise<ElenaClientProductResponseV1>;\n };\n assets: {\n get(id: string, options?: ElenaKeyRequestOptions): Promise<ElenaClientAssetResponseV1>;\n };\n}\n\n/** Published menu only. This client never accepts an agent secret or bearer token. */\nexport function createElenaClientKeyClient(\n options: ElenaClientKeyClientOptions,\n): ElenaClientKeyClient {\n assertOptionKeys(options, [\n 'baseUrl',\n 'clientKey',\n 'fetch',\n 'timeoutMs',\n 'maxRetries',\n 'testing',\n ]);\n if (!elenaClientKeySchema.safeParse(options.clientKey).success) {\n throw new ElenaAgentTransportError('CREDENTIAL_WRONG_FAMILY');\n }\n const { request } = createKeyTransport(options, 'x-elena-client-key', options.clientKey);\n const root = '/api/v1/public/sdk';\n return Object.freeze({\n context: Object.freeze({\n get: (options?: ElenaKeyRequestOptions) =>\n request(`${root}/context`, elenaClientContextSchema, options),\n }),\n catalog: Object.freeze({\n list: (query?: ElenaKeyPageQuery, options?: ElenaKeyRequestOptions) =>\n request(`${root}/catalog${pageQuery(query)}`, elenaClientCatalogSchema, options),\n getProduct: async (id: string, options?: ElenaKeyRequestOptions) => {\n const expectedId = resourceId(id);\n const result = await request(\n `${root}/catalog/products/${expectedId}`,\n elenaClientProductResponseSchema,\n options,\n );\n if (result.product.id !== expectedId)\n throw new ElenaAgentTransportError('INVALID_RESPONSE');\n return result;\n },\n }),\n assets: Object.freeze({\n get: async (id: string, options?: ElenaKeyRequestOptions) => {\n const expectedId = resourceId(id);\n const result = await request(\n `${root}/assets/${expectedId}`,\n elenaClientAssetResponseSchema,\n options,\n );\n if (result.asset.assetId !== expectedId)\n throw new ElenaAgentTransportError('INVALID_RESPONSE');\n return result;\n },\n }),\n });\n}\n","import { z } from 'zod';\nimport {\n elenaAgentBaseUrlSchema,\n elenaClientContextSchema,\n elenaManagedClientKeySchema,\n} from './access';\nimport {\n ELENA_AGENT_LIMITS,\n elenaAgentRevisionSchema,\n elenaAgentTimestampSchema,\n elenaAgentVersionSchema,\n} from './common';\n\nexport const ELENA_PUBLIC_CONNECTION_DISCOVERY_ROOT = '/api/v1/public/catalog-connections';\nexport const elenaPublicConnectionSlugSchema = z\n .string()\n .min(1)\n .max(120)\n .regex(/^[a-z0-9]+(?:-[a-z0-9]+)*$/);\nconst ttl = z\n .number()\n .int()\n .min(3600)\n .max(ELENA_AGENT_LIMITS.keyMaxTtlSeconds)\n .default(ELENA_AGENT_LIMITS.keyDefaultTtlSeconds);\nconst mutation = {\n version: elenaAgentVersionSchema,\n // Zero asserts that no connection has ever been created for this restaurant.\n expectedRevision: z\n .number()\n .int()\n .min(0)\n .max(Number.MAX_SAFE_INTEGER - 1),\n};\nexport const elenaPublicConnectionMutationSchema = z.discriminatedUnion('action', [\n z.strictObject({ ...mutation, action: z.literal('enable'), ttlSeconds: ttl }),\n z.strictObject({ ...mutation, action: z.literal('renew'), ttlSeconds: ttl }),\n z.strictObject({ ...mutation, action: z.literal('disable') }),\n z.strictObject({ ...mutation, action: z.literal('revoke') }),\n]);\nexport const elenaPublicConnectionMetadataSchema = z.strictObject({\n revision: elenaAgentRevisionSchema,\n status: z.enum(['published', 'disabled', 'revoked']),\n expiresAt: elenaAgentTimestampSchema,\n});\nexport const elenaPublicConnectionManagementSchema = z.strictObject({\n version: elenaAgentVersionSchema,\n publication: elenaPublicConnectionMetadataSchema.nullable(),\n});\nexport const elenaPublicConnectionSchema = z.strictObject({\n version: elenaAgentVersionSchema,\n apiOrigin: elenaAgentBaseUrlSchema,\n clientKey: elenaManagedClientKeySchema,\n publication: z.strictObject({\n revision: elenaAgentRevisionSchema,\n expiresAt: elenaAgentTimestampSchema,\n }),\n context: elenaClientContextSchema,\n});\nexport type ElenaPublicConnectionV1 = z.infer<typeof elenaPublicConnectionSchema>;\nexport type ElenaPublicConnectionMutationV1 = z.infer<typeof elenaPublicConnectionMutationSchema>;\nexport type ElenaPublicConnectionManagementV1 = z.infer<\n typeof elenaPublicConnectionManagementSchema\n>;\n","import {\n ELENA_PUBLIC_CONNECTION_DISCOVERY_ROOT,\n elenaPublicConnectionSchema,\n elenaPublicConnectionSlugSchema,\n} from '../../shared/src/agent-contracts/public-connection';\nimport {\n assertOptionKeys,\n createKeyTransport,\n explicitOrigin,\n parseWire,\n ElenaAgentTransportError,\n type ElenaKeyRequestOptions,\n type ElenaKeyTransportOptions,\n} from './key-transport';\n\n/** The explicit origin is pinned: discovery cannot redirect credentials to another API. */\nexport async function discoverElenaPublicConnection(\n options: ElenaKeyTransportOptions,\n slug: string,\n requestOptions?: ElenaKeyRequestOptions,\n) {\n assertOptionKeys(options, ['baseUrl', 'fetch', 'timeoutMs', 'maxRetries', 'testing']);\n const identifier = parseWire(elenaPublicConnectionSlugSchema, slug);\n const result = await createKeyTransport(options, null, '').request(\n `${ELENA_PUBLIC_CONNECTION_DISCOVERY_ROOT}/${identifier}`,\n elenaPublicConnectionSchema,\n requestOptions,\n );\n if (\n explicitOrigin(result.apiOrigin) !==\n explicitOrigin(options.baseUrl, options.testing?.allowHttp) ||\n result.context.restaurant.slug !== identifier\n )\n throw new ElenaAgentTransportError('ORIGIN_REJECTED');\n return result;\n}\n"],"mappings":";AAQO,IAAM,gBAAN,cAA4B,MAAM;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAET,YAAY,SAAiB,SAA+B;AAC1D,UAAM,OAAO;AACb,SAAK,OAAO;AACZ,SAAK,SAAS,QAAQ;AACtB,SAAK,OAAO,QAAQ;AACpB,SAAK,UAAU,QAAQ;AACvB,SAAK,aAAa,QAAQ;AAAA,EAC5B;AACF;AAGO,IAAM,oBAAN,cAAgC,MAAM;AAAA,EAC3C,YAAY,UAAU,4BAA4B;AAChD,UAAM,OAAO;AACb,SAAK,OAAO;AAAA,EACd;AACF;AAGO,IAAM,oBAAN,cAAgC,MAAM;AAAA,EAClC;AAAA,EAET,YAAY,WAAmB;AAC7B,UAAM,4BAAyB,SAAS,MAAM;AAC9C,SAAK,OAAO;AACZ,SAAK,YAAY;AAAA,EACnB;AACF;AAGO,IAAM,2BAAN,cAAuC,MAAM;AAAA,EAClD,YAAY,UAAU,uCAAuC;AAC3D,UAAM,OAAO;AACb,SAAK,OAAO;AAAA,EACd;AACF;AAGO,IAAM,qBAAN,cAAiC,MAAM;AAAA,EACnC;AAAA,EACA;AAAA,EAET,YAAY,SAAiB,SAAgD;AAC3E,UAAM,OAAO;AACb,SAAK,OAAO;AACZ,SAAK,SAAS,QAAQ;AACtB,SAAK,WAAW,QAAQ;AAAA,EAC1B;AACF;AAeO,IAAM,+BAAN,cAA2C,MAAM;AAAA,EAC7C;AAAA;AAAA,EAEA;AAAA,EAET,YAAY,SAAiB,SAA+D;AAC1F,UAAM,OAAO;AACb,SAAK,OAAO;AACZ,SAAK,OAAO,QAAQ;AACpB,SAAK,QAAQ,QAAQ;AAAA,EACvB;AACF;;;AC5EO,IAAM,iBAAN,MAAqB;AAAA,EAC1B,YACmB,MACA,cACjB;AAFiB;AACA;AAAA,EAChB;AAAA,EAFgB;AAAA,EACA;AAAA,EAGnB,QAAQ,WAAqD;AAC3D,WAAO,KAAK,KAAK;AAAA,MACf,0BAA0B,mBAAmB,KAAK,YAAY,CAAC,WAAW,mBAAmB,SAAS,CAAC;AAAA,IACzG;AAAA,EACF;AAAA,EAEA,YACE,WACA,OACA,UAA8B,CAAC,GACD;AAC9B,UAAM,OACJ,QAAQ,kBAAkB,CAAC,MAAM,iBAC7B,EAAE,GAAG,OAAO,gBAAgB,QAAQ,eAAe,IACnD;AACN,WAAO,KAAK,KAAK;AAAA,MACf,0BAA0B,mBAAmB,KAAK,YAAY,CAAC,WAAW,mBAAmB,SAAS,CAAC;AAAA,MACvG,EAAE,QAAQ,QAAQ,MAAM,QAAQ,QAAQ,OAAO;AAAA,IACjD;AAAA,EACF;AACF;AAEO,IAAM,iBAAN,MAAqB;AAAA,EAC1B,YACmB,MACA,cACjB;AAFiB;AACA;AAAA,EAChB;AAAA,EAFgB;AAAA,EACA;AAAA,EAGnB,OAAO,OAAyB,UAA8B,CAAC,GAAiC;AAC9F,UAAM,OACJ,QAAQ,kBAAkB,CAAC,MAAM,iBAC7B,EAAE,GAAG,OAAO,gBAAgB,QAAQ,eAAe,IACnD;AACN,WAAO,KAAK,KAAK;AAAA,MACf,0BAA0B,mBAAmB,KAAK,YAAY,CAAC;AAAA,MAC/D,EAAE,QAAQ,QAAQ,MAAM,QAAQ,QAAQ,OAAO;AAAA,IACjD;AAAA,EACF;AAAA,EAEA,MAAM,QAAQ,SAA6C;AACzD,QAAI,CAAC,KAAK,KAAK,WAAW;AACxB,YAAM,IAAI,cAAc,2CAA2C,EAAE,QAAQ,EAAE,CAAC;AAAA,IAClF;AACA,WAAO,KAAK,KAAK;AAAA,MACf,0BAA0B,mBAAmB,KAAK,YAAY,CAAC,WAAW,mBAAmB,OAAO,CAAC;AAAA,IACvG;AAAA,EACF;AAAA,EAEA,YAAY,eAAmD;AAC7D,WAAO,KAAK,KAAK;AAAA,MACf,0BAA0B,mBAAmB,KAAK,YAAY,CAAC,aAAa,mBAAmB,aAAa,CAAC;AAAA,IAC/G;AAAA,EACF;AAAA,EAEA,mBAAmB,eAAuB,OAAuD;AAC/F,UAAM,OAAO,IAAI,SAAS;AAC1B,SAAK,IAAI,mBAAmB,MAAM,eAAe;AACjD,QAAI,MAAM,WAAY,MAAK,IAAI,cAAc,MAAM,UAAU;AAC7D,WAAO,KAAK,KAAK;AAAA,MACf,0BAA0B,mBAAmB,KAAK,YAAY,CAAC,aAAa,mBAAmB,aAAa,CAAC;AAAA,MAC7G,EAAE,QAAQ,QAAQ,MAAM,KAAK;AAAA,IAC/B;AAAA,EACF;AACF;;;ACxEO,IAAM,kBAAN,MAAsB;AAAA,EAC3B,YACmB,MACA,cACjB;AAFiB;AACA;AAAA,EAChB;AAAA,EAFgB;AAAA,EACA;AAAA,EAGnB,UAAiC;AAC/B,WAAO,KAAK,KAAK;AAAA,MACf,0BAA0B,mBAAmB,KAAK,YAAY,CAAC;AAAA,IACjE;AAAA,EACF;AAAA,EAEA,QAAQ,OAAyC;AAC/C,WAAO,KAAK,KAAK;AAAA,MACf,0BAA0B,mBAAmB,KAAK,YAAY,CAAC;AAAA,MAC/D,EAAE,OAAO,EAAE,QAAQ,OAAO,OAAO,EAAE;AAAA,IACrC;AAAA,EACF;AAAA,EAEA,iBAAuC;AACrC,WAAO,KAAK,KAAK;AAAA,MACf,0BAA0B,mBAAmB,KAAK,YAAY,CAAC;AAAA,IACjE;AAAA,EACF;AACF;AAEO,IAAM,iBAAN,MAAqB;AAAA,EAC1B,YACmB,MACA,cACjB;AAFiB;AACA;AAAA,EAChB;AAAA,EAFgB;AAAA,EACA;AAAA,EAGnB,gBAA0C;AACxC,WAAO,KAAK,KAAK;AAAA,MACf,0BAA0B,mBAAmB,KAAK,YAAY,CAAC;AAAA,IACjE;AAAA,EACF;AAAA,EAEA,IAAI,SAAyC;AAC3C,WAAO,KAAK,KAAK;AAAA,MACf,0BAA0B,mBAAmB,KAAK,YAAY,CAAC,WAAW,mBAAmB,OAAO,CAAC;AAAA,IACvG;AAAA,EACF;AACF;;;AC9BO,IAAM,mBAAN,MAAuB;AAAA,EAC5B,YACmB,MACA,cACjB;AAFiB;AACA;AAAA,EAChB;AAAA,EAFgB;AAAA,EACA;AAAA;AAAA,EAInB,cAAc,WAAwC;AACpD,UAAM,oBAAoB,aAAa,KAAK,KAAK;AACjD,QAAI,CAAC,mBAAmB;AACtB,YAAM,IAAI,cAAc,4CAA4C,EAAE,QAAQ,EAAE,CAAC;AAAA,IACnF;AACA,WAAO;AAAA,MACL,KAAK,KAAK,KAAK,IAAI,gCAAgC;AAAA,QACjD,WAAW;AAAA,QACX,gBAAgB,KAAK;AAAA,MACvB,CAAC;AAAA,IACH;AAAA,EACF;AACF;AAEO,IAAM,eAAN,MAAmB;AAAA,EACxB,YACmB,MACA,cACjB;AAFiB;AACA;AAAA,EAChB;AAAA,EAFgB;AAAA,EACA;AAAA;AAAA,EAInB,gBAAgC;AAC9B,WAAO;AAAA,MACL,QAAQ,KAAK,KAAK,IAAI,SAAS;AAAA,MAC/B,cAAc,KAAK;AAAA,MACnB,GAAI,KAAK,KAAK,YAAY,EAAE,WAAW,KAAK,KAAK,UAAU,IAAI,CAAC;AAAA,IAClE;AAAA,EACF;AACF;AAEO,IAAM,wBAAN,MAA4B;AAAA,EACjC,YACmB,MACA,cACjB;AAFiB;AACA;AAAA,EAChB;AAAA,EAFgB;AAAA,EACA;AAAA,EAGnB,SAA2B,OAA4D;AACrF,WAAO,KAAK,KAAK;AAAA,MACf,2BAA2B,mBAAmB,KAAK,YAAY,CAAC;AAAA,MAChE,EAAE,QAAQ,QAAQ,MAAM,EAAE,MAAM,EAAE;AAAA,IACpC;AAAA,EACF;AACF;AAEO,IAAM,uBAAN,cAAqD,cAAc;AAAA,EAC/D;AAAA,EAET,YAAY,SAAkC;AAC5C,UAAM,2DAAwD;AAAA,MAC5D,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,SAAS,EAAE,QAAQ;AAAA,IACrB,CAAC;AACD,SAAK,OAAO;AACZ,SAAK,UAAU;AAAA,EACjB;AACF;AAEO,IAAM,kBAAN,MAAM,iBAAgB;AAAA,EAC3B,YACmB,MACA,cACjB;AAFiB;AACA;AAAA,EAChB;AAAA,EAFgB;AAAA,EACA;AAAA,EAGnB,WAAkE;AAChE,WAAO,KAAK,KAAK;AAAA,MACf,2BAA2B,mBAAmB,KAAK,YAAY,CAAC;AAAA,IAClE;AAAA,EACF;AAAA,EAEA,MAAM,SACJ,OACuD;AACvD,QAAI;AACF,aAAO,MAAM,KAAK,KAAK;AAAA,QACrB,2BAA2B,mBAAmB,KAAK,YAAY,CAAC;AAAA,QAChE;AAAA,UACE,QAAQ;AAAA,UACR,MAAM;AAAA,YACJ,SAAS,MAAM;AAAA,YACf,iBAAiB,MAAM;AAAA,YACvB,OAAO,MAAM;AAAA,UACf;AAAA,QACF;AAAA,MACF;AAAA,IACF,SAAS,OAAO;AACd,YAAM,iBAAgB,aAAqB,KAAK;AAAA,IAClD;AAAA,EACF;AAAA,EAEA,MAAM,QACJ,OAC4E;AAC5E,QAAI;AACF,aAAO,MAAM,KAAK,KAAK,QAErB,2BAA2B,mBAAmB,KAAK,YAAY,CAAC,YAAY;AAAA,QAC5E,QAAQ;AAAA,QACR,MAAM;AAAA,UACJ,SAAS,MAAM;AAAA,UACf,iBAAiB,MAAM;AAAA,UACvB,aAAa,MAAM;AAAA,QACrB;AAAA,MACF,CAAC;AAAA,IACH,SAAS,OAAO;AACd,YAAM,iBAAgB,aAAqB,KAAK;AAAA,IAClD;AAAA,EACF;AAAA,EAEA,OAAe,aAAqB,OAAyB;AAC3D,QACE,iBAAiB,iBACjB,MAAM,WAAW,OACjB,OAAO,MAAM,YAAY,YACzB,MAAM,YAAY,QAClB,aAAa,MAAM,SACnB;AAEA,YAAM,UAAU,MAAM,QAAQ;AAC9B,aAAO,IAAI,qBAA6B,OAAO;AAAA,IACjD;AACA,WAAO;AAAA,EACT;AACF;;;ACpJO,IAAM,mBAAN,MAAuB;AAAA,EAC5B,YACmB,MACA,cACjB;AAFiB;AACA;AAAA,EAChB;AAAA,EAFgB;AAAA,EACA;AAAA,EAGnB,MAAM,IAAI,cAA4C;AACpD,UAAM,UAAU,MAAM,KAAK,KAAK;AAAA,MAC9B,0BAA0B,mBAAmB,KAAK,YAAY,CAAC,UAAU,mBAAmB,YAAY,CAAC;AAAA,IAC3G;AACA,UAAM,MAAM,QAAQ,SAAS;AAC7B,QAAI,CAAC,OAAO,CAAC,IAAI,WAAW,GAAG,EAAG,QAAO;AACzC,QAAI,CAAC,QAAQ,QAAS,QAAO;AAC7B,WAAO,EAAE,GAAG,SAAS,SAAS,EAAE,GAAG,QAAQ,SAAS,KAAK,KAAK,KAAK,IAAI,GAAG,EAAE,EAAE;AAAA,EAChF;AAAA;AAAA,EAGA,UAAU,cAA8B;AACtC,WAAO,KAAK,KAAK;AAAA,MACf,0BAA0B,mBAAmB,KAAK,YAAY,CAAC,UAAU,mBAAmB,YAAY,CAAC;AAAA,IAC3G;AAAA,EACF;AACF;AAEO,IAAM,mBAAN,MAAuB;AAAA,EAC5B,YACmB,MACA,cACjB;AAFiB;AACA;AAAA,EAChB;AAAA,EAFgB;AAAA,EACA;AAAA,EAGnB,OACE,OACA,UAAoC,CAAC,GACT;AAC5B,WAAO,KAAK,KAAK;AAAA,MACf,0BAA0B,mBAAmB,KAAK,YAAY,CAAC;AAAA,MAC/D,EAAE,QAAQ,QAAQ,MAAM,OAAO,QAAQ,QAAQ,OAAO;AAAA,IACxD;AAAA,EACF;AAAA;AAAA,EAGA,iBAAiB,OAA4C;AAC3D,WAAO;AAAA,MACL,KAAK,KAAK,KAAK;AAAA,QACb,0BAA0B,mBAAmB,KAAK,YAAY,CAAC;AAAA,MACjE;AAAA,MACA,MAAM,IAAI,KAAK,CAAC,KAAK,UAAU,KAAK,CAAC,GAAG,EAAE,MAAM,mBAAmB,CAAC;AAAA,IACtE;AAAA,EACF;AACF;;;AC7CO,IAAM,iBAAN,MAAqB;AAAA,EAC1B,YAA6B,MAAuB;AAAvB;AAAA,EAAwB;AAAA,EAAxB;AAAA,EAE7B,IAAI,cAAsB,WAAyC;AACjE,WAAO,KAAK,KAAK,QAAqB,gCAAgC;AAAA,MACpE,OAAO,EAAE,gBAAgB,cAAc,UAAU;AAAA,IACnD,CAAC;AAAA,EACH;AACF;AAEO,IAAM,kBAAN,MAAsB;AAAA,EAC3B,YAA6B,MAAuB;AAAvB;AAAA,EAAwB;AAAA,EAAxB;AAAA,EAE7B,KAAK,OAA2D;AAC9D,WAAO,KAAK,KAAK,QAA8B,oCAAoC;AAAA,MACjF,QAAQ;AAAA,MACR,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AAAA,EAEA,UAAU,OAAsC;AAC9C,WAAO,KAAK,KAAK,QAAsB,0BAA0B,mBAAmB,KAAK,CAAC,EAAE;AAAA,EAC9F;AACF;AAEO,IAAM,iBAAN,MAAqB;AAAA,EAC1B,YAA6B,MAAuB;AAAvB;AAAA,EAAwB;AAAA,EAAxB;AAAA;AAAA,EAG7B,aAAa,SAAyB;AACpC,WAAO,KAAK,KAAK,IAAI,yBAAyB,mBAAmB,OAAO,CAAC,SAAS;AAAA,EACpF;AACF;;;AC1BO,IAAM,gBAAN,MAAoB;AAAA,EAczB,YACmB,MACjB,MACA;AAFiB;AAGjB,UAAM,aAAa,KAAK,KAAK;AAC7B,QAAI,CAAC,YAAY;AACf,YAAM,IAAI,UAAU,iCAAiC;AAAA,IACvD;AACA,SAAK,OAAO;AACZ,SAAK,UAAU,IAAI,gBAAgB,MAAM,UAAU;AACnD,SAAK,SAAS,IAAI,eAAe,MAAM,UAAU;AACjD,SAAK,SAAS,IAAI,eAAe,MAAM,UAAU;AACjD,SAAK,SAAS,IAAI,eAAe,MAAM,UAAU;AACjD,SAAK,WAAW,IAAI,iBAAiB,MAAM,UAAU;AACrD,SAAK,WAAW,IAAI,iBAAiB,MAAM,UAAU;AACrD,SAAK,gBAAgB,IAAI,sBAAsB,MAAM,UAAU;AAC/D,SAAK,WAAW,IAAI,iBAAiB,MAAM,UAAU;AACrD,SAAK,OAAO,IAAI,aAAa,MAAM,UAAU;AAC7C,SAAK,iBAAiB,IAAI,eAAe,IAAI;AAC7C,SAAK,kBAAkB,IAAI,gBAAgB,IAAI;AAAA,EACjD;AAAA,EAnBmB;AAAA,EAdV;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACQ;AAAA,EACA;AAAA,EAwBjB,UAAiC;AAC/B,WAAO,KAAK,QAAQ,QAAQ;AAAA,EAC9B;AAAA,EAEA,SAAS,WAAyC;AAChD,WAAO,KAAK,eAAe,IAAI,KAAK,MAAM,SAAS;AAAA,EACrD;AAAA,EAEA,YAAY,OAAmF;AAC7F,WAAO,KAAK,gBAAgB,KAAK,EAAE,GAAG,OAAO,gBAAgB,KAAK,KAAK,CAAC;AAAA,EAC1E;AACF;;;AChCA,IAAM,qBAAqB;AAE3B,SAAS,eAAe,MAAiC;AACvD,SAAO,OAAO,aAAa,eAAe,gBAAgB;AAC5D;AAEA,SAAS,gBAAgB,MAA4D;AACnF,MAAI,SAAS,QAAQ,SAAS,OAAW,QAAO;AAChD,MAAI,OAAO,SAAS,SAAU,QAAO;AACrC,MAAI,eAAe,IAAI,EAAG,QAAO;AACjC,MAAI,gBAAgB,KAAM,QAAO;AACjC,MAAI,gBAAgB,YAAa,QAAO;AACxC,MAAI,YAAY,OAAO,IAAI,EAAG,QAAO;AACrC,MAAI,gBAAgB,gBAAiB,QAAO;AAC5C,SAAO;AACT;AAOO,IAAM,kBAAN,MAAsB;AAAA,EAClB;AAAA,EACA;AAAA,EACQ;AAAA,EACA;AAAA,EACA;AAAA,EAEjB,YAAY,SAA6B,aAAsB;AAC7D,UAAM,oBAAoB,QAAQ,QAAQ,KAAK,EAAE,QAAQ,QAAQ,EAAE;AACnE,QAAI,CAAC,mBAAmB;AACtB,YAAM,IAAI,UAAU,gCAAgC;AAAA,IACtD;AACA,QAAI;AACF,YAAM,OAAO,IAAI,IAAI,iBAAiB;AACtC,UACE,CAAC,gBAAgB,KAAK,iBAAiB,KACvC,WAAW,KAAK,iBAAiB,KACjC,KAAK,YACL,KAAK,UACL;AACA,cAAM,IAAI,UAAU;AAAA,MACtB;AAAA,IACF,QAAQ;AACN,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AACA,SAAK,UAAU;AACf,UAAM,YAAY,QAAQ,WAAW,KAAK;AAC1C,SAAK,YAAY,YAAY,YAAY;AACzC,UAAM,YAAY,QAAQ,SAAS,WAAW;AAC9C,QAAI,OAAO,cAAc,YAAY;AACnC,YAAM,IAAI,UAAU,oDAAiD;AAAA,IACvE;AACA,SAAK,YAAY,UAAU,KAAK,UAAU;AAC1C,UAAM,YAAY,QAAQ,aAAa;AACvC,QAAI,CAAC,OAAO,SAAS,SAAS,KAAK,aAAa,GAAG;AACjD,YAAM,IAAI,UAAU,sDAAsD;AAAA,IAC5E;AACA,SAAK,YAAY;AACjB,UAAM,QAAQ,aAAa,KAAK;AAChC,SAAK,cAAc,QAAQ,QAAQ;AAAA,EACrC;AAAA,EAEA,IAAI,MAAc,OAAuE;AACvF,QACE,sBAAsB,KAAK,IAAI,KAC/B,KAAK,WAAW,IAAI;AAAA,IAEpB,4BAA4B,KAAK,IAAI,KACrC,KAAK,MAAM,OAAO,EAAE,KAAK,CAAC,YAAY,qBAAqB,KAAK,OAAO,CAAC,GACxE;AACA,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AACA,UAAM,iBAAiB,KAAK,WAAW,GAAG,IAAI,OAAO,IAAI,IAAI;AAC7D,UAAM,MAAM,GAAG,KAAK,OAAO,GAAG,cAAc;AAC5C,QAAI,CAAC,MAAO,QAAO;AACnB,UAAM,SAAS,IAAI,gBAAgB;AACnC,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,KAAK,GAAG;AAChD,UAAI,UAAU,OAAW;AACzB,aAAO,IAAI,KAAK,OAAO,KAAK,CAAC;AAAA,IAC/B;AACA,UAAM,KAAK,OAAO,SAAS;AAC3B,WAAO,KAAK,GAAG,GAAG,IAAI,EAAE,KAAK;AAAA,EAC/B;AAAA,EAEA,MAAM,QAAW,MAAc,UAA+B,CAAC,GAAe;AAC5E,QAAI,QAAQ,QAAQ,SAAS;AAC3B,YAAM,IAAI,yBAAyB;AAAA,IACrC;AACA,UAAM,UAAU,IAAI,QAAQ;AAC5B,YAAQ,IAAI,UAAU,kBAAkB;AACxC,QAAI;AACJ,QAAI,QAAQ,SAAS,QAAW;AAC9B,UAAI,gBAAgB,QAAQ,IAAI,GAAG;AACjC,gBAAQ,IAAI,gBAAgB,kBAAkB;AAC9C,eAAO,KAAK,UAAU,QAAQ,IAAI;AAAA,MACpC,OAAO;AACL,eAAO,QAAQ;AAAA,MACjB;AAAA,IACF;AACA,QAAI,KAAK,UAAW,SAAQ,IAAI,gBAAgB,KAAK,SAAS;AAC9D,QAAI,QAAQ,SAAS;AACnB,UAAI,QAAQ,QAAQ,OAAO,EAAE,QAAQ,CAAC,OAAO,QAAQ;AACnD,gBAAQ,IAAI,KAAK,KAAK;AAAA,MACxB,CAAC;AAAA,IACH;AACA,QAAI,KAAK,YAAa,SAAQ,IAAI,iBAAiB,UAAU,KAAK,WAAW,EAAE;AAE/E,UAAM,aAAa,IAAI,gBAAgB;AACvC,QAAI,WAAW;AACf,UAAM,UAAU,WAAW,MAAM;AAC/B,iBAAW;AACX,iBAAW,MAAM;AAAA,IACnB,GAAG,KAAK,SAAS;AACjB,UAAM,gBAAgB,MAAY;AAChC,iBAAW,MAAM;AAAA,IACnB;AACA,YAAQ,QAAQ,iBAAiB,SAAS,eAAe,EAAE,MAAM,KAAK,CAAC;AACvE,QAAI,QAAQ,QAAQ,QAAS,eAAc;AAK3C,UAAM,UAAU,CAAI,YAClB,IAAI,QAAQ,CAAC,SAAS,WAAW;AAC/B,YAAM,UAAU,MAAY;AAC1B,gBAAQ;AACR,eAAO,WAAW,IAAI,kBAAkB,KAAK,SAAS,IAAI,IAAI,yBAAyB,CAAC;AAAA,MAC1F;AACA,YAAM,UAAU,MAAY,WAAW,OAAO,oBAAoB,SAAS,OAAO;AAClF,iBAAW,OAAO,iBAAiB,SAAS,SAAS,EAAE,MAAM,KAAK,CAAC;AACnE,cAAQ;AAAA,QACN,CAAC,UAAU;AACT,kBAAQ;AACR,kBAAQ,KAAK;AAAA,QACf;AAAA,QACA,CAAC,UAAmB;AAClB,kBAAQ;AACR,iBAAO,KAAK;AAAA,QACd;AAAA,MACF;AACA,UAAI,WAAW,OAAO,QAAS,SAAQ;AAAA,IACzC,CAAC;AAEH,QAAI;AACJ,QAAI;AACJ,QAAI;AACF,iBAAW,MAAM;AAAA,QACf,QAAQ,QAAQ,EAAE,KAAK,MAAM;AAC3B,cAAI,WAAW,OAAO,QAAS,OAAM,IAAI,yBAAyB;AAClE,iBAAO,KAAK,UAAU,KAAK,IAAI,MAAM,QAAQ,KAAK,GAAG;AAAA,YACnD,QAAQ,QAAQ,UAAU;AAAA,YAC1B;AAAA,YACA;AAAA,YACA,aAAa;AAAA,YACb,UAAU;AAAA,YACV,gBAAgB;AAAA,YAChB,QAAQ,WAAW;AAAA,YACnB,GAAI,QAAQ,YAAY,EAAE,WAAW,KAAK,IAAI,CAAC;AAAA,UACjD,CAAC;AAAA,QACH,CAAC;AAAA,MACH;AACA,UACE,SAAS,cACR,SAAS,UAAU,OAAO,SAAS,SAAS,OAC7C,SAAS,SAAS,oBACjB,SAAS,OAAO,IAAI,IAAI,SAAS,GAAG,EAAE,WAAW,IAAI,IAAI,KAAK,OAAO,EAAE,QACxE;AACA,cAAM,IAAI,mBAAmB,qDAAqD;AAAA,UAChF,QAAQ,SAAS;AAAA,QACnB,CAAC;AAAA,MACH;AACA,aAAO,MAAM,QAAQ,QAAQ,QAAQ,EAAE,KAAK,MAAM,SAAS,KAAK,CAAC,CAAC;AAAA,IACpE,SAAS,OAAO;AACd,UAAI,SAAU,OAAM,IAAI,kBAAkB,KAAK,SAAS;AACxD,UAAI,QAAQ,QAAQ,QAAS,OAAM,IAAI,yBAAyB;AAChE,UAAI,iBAAiB,mBAAoB,OAAM;AAC/C,UAAI,iBAAiB,SAAS,MAAM,SAAS,cAAc;AACzD,cAAM,IAAI,yBAAyB;AAAA,MACrC;AACA,YAAM,IAAI,kBAAkB,iBAAiB,QAAQ,MAAM,UAAU,MAAS;AAAA,IAChF,UAAE;AACA,mBAAa,OAAO;AACpB,cAAQ,QAAQ,oBAAoB,SAAS,aAAa;AAAA,IAC5D;AAEA,UAAM,aAAa,SAAS,QAAQ,IAAI,aAAa,KAAK;AAC1D,QAAI,UAAmB;AACvB,QAAI,MAAM;AACR,UAAI;AACF,kBAAU,KAAK,MAAM,IAAI;AAAA,MAC3B,QAAQ;AACN,YAAI,CAAC,SAAS,IAAI;AAChB,gBAAM,IAAI,cAAc,sBAAmB,SAAS,MAAM,KAAK,SAAS,UAAU,IAAI;AAAA,YACpF,QAAQ,SAAS;AAAA,YACjB,SAAS;AAAA,YACT;AAAA,UACF,CAAC;AAAA,QACH;AACA,cAAM,IAAI,mBAAmB,gDAA6C;AAAA,UACxE,QAAQ,SAAS;AAAA,UACjB,UAAU;AAAA,QACZ,CAAC;AAAA,MACH;AAAA,IACF;AAEA,QAAI,CAAC,SAAS,IAAI;AAChB,UAAI;AACJ,UAAI;AACJ,UAAI,OAAO,YAAY,YAAY,YAAY,MAAM;AACnD,YAAI,UAAU,WAAW,OAAO,QAAQ,SAAS,YAAY,QAAQ,MAAM;AACzE,iBAAO,QAAQ;AAAA,QACjB,WAAW,WAAW,WAAW,OAAO,QAAQ,UAAU,YAAY,QAAQ,OAAO;AACnF,iBAAO,QAAQ;AAAA,QACjB;AACA,YACE,CAAC,QACD,aAAa,WACb,OAAO,QAAQ,YAAY,YAC3B,QAAQ,YAAY,QACpB,UAAU,QAAQ,WAClB,OAAO,QAAQ,QAAQ,SAAS,YAChC,QAAQ,QAAQ,MAChB;AACA,iBAAO,QAAQ,QAAQ;AAAA,QACzB;AACA,YAAI,aAAa,WAAW,OAAO,QAAQ,YAAY,YAAY,QAAQ,SAAS;AAClF,oBAAU,QAAQ;AAAA,QACpB;AAAA,MACF;AACA,YAAM,IAAI;AAAA,QACR,WAAW,sBAAmB,SAAS,MAAM,KAAK,SAAS,UAAU;AAAA,QACrE,EAAE,QAAQ,SAAS,QAAQ,MAAM,SAAS,SAAS,WAAW;AAAA,MAChE;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AACF;;;AClQO,SAAS,wBAAwB,SAAgD;AACtF,QAAM,OAAO,IAAI,gBAAgB,OAAO;AACxC,SAAO;AAAA,IACL,UAAU,CAAC,SAAiB,IAAI,cAAc,MAAM,IAAI;AAAA,IACxD,SAAS,IAAI,gBAAgB,IAAI;AAAA,IACjC,QAAQ,IAAI,eAAe,IAAI;AAAA,EACjC;AACF;AAeO,SAAS,yBAAyB,SAAwD;AAC/F,MAAI,CAAC,QAAQ,aAAa,KAAK,GAAG;AAChC,UAAM,IAAI,UAAU,sDAAsD;AAAA,EAC5E;AACA,QAAM,eAAe,QAAQ,aAAa,KAAK;AAC/C,MAAI,CAAC,cAAc;AACjB,UAAM,IAAI,UAAU,uDAAuD;AAAA,EAC7E;AACA,QAAM,OAAO,IAAI;AAAA,IACf;AAAA,MACE,SAAS,QAAQ;AAAA,MACjB,OAAO,QAAQ;AAAA,MACf,WAAW,QAAQ;AAAA,IACrB;AAAA,IACA,QAAQ;AAAA,EACV;AACA,SAAO,EAAE,cAAc,UAAU,IAAI,gBAAgB,MAAM,YAAY,EAAE;AAC3E;;;ACzCA,IAAM,cAAc,CAAC,SAAyB,KAAK,KAAK,EAAE,kBAAkB;AAE5E,SAAS,QAAQ,MAAmC,OAAe,SAAwB;AACzF,QAAM,IAAI,6BAA6B,SAAS,EAAE,MAAM,MAAM,CAAC;AACjE;AAOO,SAAS,gBACd,MACA,YAC0B;AAC1B,SAAO,WAAW,IAAI,CAAC,WAAW,cAAc;AAC9C,UAAM,QAAQ,cAAc,SAAS;AACrC,UAAM,WAAW,KAAK,SAAS,OAAO,CAACA,aAAYA,SAAQ,OAAO,UAAU,SAAS;AACrF,UAAM,UAAU,SAAS,CAAC;AAC1B,QAAI,CAAC,SAAS;AACZ,aAAO;AAAA,QACL;AAAA,QACA,GAAG,KAAK;AAAA,QACR;AAAA,MACF;AAAA,IACF;AACA,QAAI,SAAS,WAAW,GAAG;AACzB,aAAO,QAAQ,uBAAuB,GAAG,KAAK,cAAc,gCAAgC;AAAA,IAC9F;AACA,QAAI,CAAC,QAAQ,WAAW;AACtB,aAAO;AAAA,QACL;AAAA,QACA,GAAG,KAAK;AAAA,QACR;AAAA,MACF;AAAA,IACF;AACA,QACE,CAAC,OAAO,UAAU,UAAU,QAAQ,KACpC,UAAU,WAAW,KACrB,UAAU,WAAW,KACrB;AACA,aAAO;AAAA,QACL;AAAA,QACA,GAAG,KAAK;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAEA,UAAM,SAAS,oBAAI,IAAoB;AACvC,UAAM,WAAW,oBAAI,IAAyB;AAC9C,UAAM,UAAU,UAAU,mBAAmB,CAAC,GAAG,IAAI,CAAC,iBAAiB,gBAAgB;AACrF,YAAM,cAAc,GAAG,KAAK,oBAAoB,WAAW;AAC3D,YAAM,SAAS,QAAQ,oBAAoB;AAAA,QACzC,CAACC,WAAUA,OAAM,OAAO,gBAAgB;AAAA,MAC1C;AACA,YAAM,QAAQ,OAAO,CAAC;AACtB,UAAI,CAAC,OAAO;AACV,eAAO;AAAA,UACL;AAAA,UACA,GAAG,WAAW;AAAA,UACd;AAAA,QACF;AAAA,MACF;AAGA,UACE,OAAO,WAAW,KAClB,CAAC,YAAY,MAAM,IAAI,KACvB,QAAQ,oBAAoB;AAAA,QAC1B,CAAC,cAAc,YAAY,UAAU,IAAI,MAAM,YAAY,MAAM,IAAI;AAAA,MACvE,EAAE,WAAW,GACb;AACA,eAAO;AAAA,UACL;AAAA,UACA,GAAG,WAAW;AAAA,UACd;AAAA,QACF;AAAA,MACF;AACA,YAAM,UAAU,MAAM,QAAQ,OAAO,CAACC,YAAWA,QAAO,OAAO,gBAAgB,QAAQ;AACvF,YAAM,SAAS,QAAQ,CAAC;AACxB,UAAI,CAAC,QAAQ;AACX,eAAO;AAAA,UACL;AAAA,UACA,GAAG,WAAW;AAAA,UACd;AAAA,QACF;AAAA,MACF;AACA,UACE,QAAQ,WAAW,KACnB,CAAC,YAAY,OAAO,IAAI,KACxB,MAAM,QAAQ;AAAA,QACZ,CAAC,cAAc,YAAY,UAAU,IAAI,MAAM,YAAY,OAAO,IAAI;AAAA,MACxE,EAAE,WAAW,GACb;AACA,eAAO;AAAA,UACL;AAAA,UACA,GAAG,WAAW;AAAA,UACd;AAAA,QACF;AAAA,MACF;AACA,YAAM,kBAAkB,SAAS,IAAI,MAAM,EAAE,KAAK,oBAAI,IAAY;AAClE,UAAI,gBAAgB,IAAI,OAAO,EAAE,GAAG;AAClC,eAAO;AAAA,UACL;AAAA,UACA,GAAG,WAAW;AAAA,UACd;AAAA,QACF;AAAA,MACF;AACA,sBAAgB,IAAI,OAAO,EAAE;AAC7B,eAAS,IAAI,MAAM,IAAI,eAAe;AACtC,aAAO,IAAI,MAAM,KAAK,OAAO,IAAI,MAAM,EAAE,KAAK,KAAK,CAAC;AACpD,aAAO;AAAA,QACL,WAAW,MAAM;AAAA,QACjB,YAAY,OAAO;AAAA,QACnB,iBAAiB,OAAO;AAAA,MAC1B;AAAA,IACF,CAAC;AAED,eAAW,SAAS,QAAQ,qBAAqB;AAC/C,YAAM,QAAQ,OAAO,IAAI,MAAM,EAAE,KAAK;AACtC,UAAI,MAAM,YAAY,UAAU,GAAG;AACjC,eAAO;AAAA,UACL;AAAA,UACA,GAAG,KAAK;AAAA,UACR,aAAa,MAAM,IAAI;AAAA,QACzB;AAAA,MACF;AACA,UAAI,QAAQ,MAAM,eAAe;AAC/B,eAAO;AAAA,UACL;AAAA,UACA,GAAG,KAAK;AAAA,UACR,aAAa,MAAM,IAAI,uBAAuB,MAAM,aAAa;AAAA,QACnE;AAAA,MACF;AACA,UAAI,QAAQ,MAAM,eAAe;AAC/B,eAAO;AAAA,UACL;AAAA,UACA,GAAG,KAAK;AAAA,UACR,aAAa,MAAM,IAAI,4BAAyB,MAAM,aAAa;AAAA,QACrE;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,MACL,WAAW,QAAQ;AAAA,MACnB,UAAU,UAAU;AAAA,MACpB,WAAW,QAAQ;AAAA,MACnB,GAAI,UAAU,UAAU,SAAY,EAAE,cAAc,UAAU,MAAM,IAAI,CAAC;AAAA,MACzE,GAAI,OAAO,SAAS,EAAE,OAAO,IAAI,CAAC;AAAA,IACpC;AAAA,EACF,CAAC;AACH;;;ACnKA,SAAS,KAAAC,UAAS;;;ACAlB,SAAS,SAAS;AAEX,IAAM,+BAA+B;AACrC,IAAM,0BAA0B,EAAE,QAAQ,4BAA4B;AACtE,IAAM,qBAAqB,EAAE,KAAK;AAClC,IAAM,2BAA2B,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,OAAO,gBAAgB;AACpF,IAAM,4BAA4B,EAAE,IAAI,SAAS;AACjD,IAAM,uBAAuB,EAAE,OAAO,EAAE,MAAM,gBAAgB;AAC9D,IAAM,sBAAsB,EAAE,OAAO,EAAE,MAAM,oCAAoC;AACjF,IAAM,uBAAuB,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAC7D,IAAM,uBAAuB,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,GAAI;AAC9D,IAAM,2BAA2B,EAAE,QAAQ,KAAK;AAGhD,IAAM,mCAAmC,EAAE,OAAO,EAAE,MAAM,2BAA2B;AACrF,IAAM,wBAAwB,iCAAiC;AAAA,EACpE,CAAC,UAAU,UAAU;AAAA,EACrB;AACF;AAEO,IAAM,qBAAqB,OAAO,OAAO;AAAA,EAC9C,qBAAqB;AAAA,EACrB,mBAAmB;AAAA,EACnB,qBAAqB;AAAA,EACrB,qBAAqB;AAAA,EACrB,eAAe;AAAA,EACf,aAAa;AAAA,EACb,iBAAiB;AAAA,EACjB,WAAW,OAAO;AAAA,EAClB,YAAY,KAAK,OAAO;AAAA,EACxB,0BAA0B,MAAM,OAAO;AAAA,EACvC,0BAA0B;AAAA,EAC1B,6BAA6B;AAAA,EAC7B,2BAA2B;AAAA,EAC3B,qBAAqB;AAAA,EACrB,sBAAsB,KAAK,KAAK,KAAK;AAAA,EACrC,kBAAkB,KAAK,KAAK,KAAK;AAAA,EACjC,mBAAmB;AAAA,EACnB,oBAAoB;AAAA,EACpB,oBAAoB,KAAK,KAAK;AAAA,EAC9B,mBAAmB,KAAK,KAAK;AAAA,EAC7B,mBAAmB,KAAK,KAAK;AAAA,EAC7B,oBAAoB,KAAK;AAAA,EACzB,oBAAoB;AAAA,EACpB,wBAAwB;AAAA,EACxB,mBAAmB;AAAA,EACnB,qBAAqB;AAAA,EACrB,UAAU;AACZ,CAAU;AAEH,IAAM,4BAA4B,EAAE,KAAK;AAAA,EAC9C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AACM,IAAM,wBAAwB,EAAE,aAAa;AAAA,EAClD,SAAS;AAAA,EACT,OAAO,EAAE,aAAa;AAAA,IACpB,MAAM;AAAA,IACN,SAAS,EAAE,OAAO,EAAE,IAAI,GAAG;AAAA,IAC3B,WAAW,EAAE,QAAQ;AAAA,IACrB,WAAW;AAAA,IACX,mBAAmB,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,SAAS;AAAA,IAC9D,QAAQ,EACL;AAAA,MACC,EAAE,aAAa;AAAA,QACb,MAAM,EAAE,OAAO,EAAE,IAAI,GAAG;AAAA,QACxB,MAAM;AAAA,QACN,SAAS,EAAE,OAAO,EAAE,IAAI,GAAG;AAAA,MAC7B,CAAC;AAAA,IACH,EACC,IAAI,GAAG,EACP,SAAS;AAAA,EACd,CAAC;AACH,CAAC;AACM,IAAM,4BAA4B,EAAE,aAAa;AAAA,EACtD,SAAS;AAAA,EACT,QAAQ,EACL,OAAO,EACP,MAAM,wBAAwB,EAC9B,SAAS;AAAA,EACZ,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,mBAAmB,QAAQ,EAAE,QAAQ,EAAE;AAC5E,CAAC;AACM,IAAM,+BAA+B,EAAE,aAAa,EAAE,SAAS,wBAAwB,CAAC;AACxF,IAAM,sBAAsB,EAAE,aAAa;AAAA,EAChD,SAAS;AAAA,EACT,IAAI,EAAE,QAAQ,IAAI;AACpB,CAAC;;;AD9GM,IAAM,wBAAwB,OAAO,OAAO;AAAA,EACjD,aAAa;AAAA,EACb,aAAa;AAAA,EACb,WAAW;AAAA,EACX,cAAc;AAAA,EACd,cAAc;AAAA,EACd,YAAY;AAAA,EACZ,WAAW;AACb,CAAU;AACH,IAAM,yBAAyBC,GAAE,OAAO,EAAE,MAAM,8BAA8B;AAE9E,IAAM,6BAA6BA,GAAE,OAAO,EAAE,MAAM,8BAA8B;AAClF,IAAM,8BAA8BA,GACxC,OAAO,EACP,IAAI,GAAG,EACP;AAAA,EACC;AACF;AACK,IAAM,uBAAuBA,GAAE,MAAM;AAAA,EAC1C;AAAA,EACA;AACF,CAAC;AACM,IAAM,6BAA6BA,GAAE,OAAO,EAAE,MAAM,qBAAqB;AACzE,IAAM,2BAA2BA,GAAE,OAAO,EAAE,MAAM,uCAAuC;AACzF,IAAM,uBAAuBA,GAAE,KAAK,CAAC,QAAQ,QAAQ,CAAC;AACtD,IAAM,wBAAwBA,GAAE,KAAK;AAAA,EAC1C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AACM,IAAM,yBAAyBA,GACnC,MAAM,qBAAqB,EAC3B,IAAI,CAAC,EACL,IAAI,CAAC,EACL,OAAO,CAAC,WAAW,IAAI,IAAI,MAAM,EAAE,SAAS,OAAO,QAAQ,iBAAiB,EAC5E,OAAO,CAAC,WAAW,OAAO,SAAS,cAAc,GAAG,2BAA2B;AAC3E,IAAM,yBAAyBA,GAAE,KAAK;AAAA,EAC3C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AACM,IAAM,6BAA6BA,GAAE,aAAa;AAAA,EACvD,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,MAAMA,GACH,OAAO,EACP,MAAM,4BAA4B,EAClC,IAAI,GAAG;AAAA,EACV,UAAU;AACZ,CAAC;AACD,IAAM,SAASA,GACZ,OAAO,EACP,IAAI,EACJ,IAAI,IAAI,EACR,IAAI,mBAAmB,gBAAgB,EACvC,QAAQ,mBAAmB,oBAAoB;AAC3C,IAAM,mCAAmCA,GAAE,mBAAmB,QAAQ;AAAA,EAC3EA,GAAE,aAAa;AAAA,IACb,SAAS;AAAA,IACT,MAAMA,GAAE,QAAQ,OAAO;AAAA,IACvB,OAAO;AAAA,IACP,MAAM,qBAAqB,QAAQ,MAAM;AAAA,IACzC,QAAQ,uBAAuB,QAAQ,CAAC,gBAAgB,aAAa,CAAC;AAAA,IACtE,YAAY;AAAA,EACd,CAAC;AAAA,EACDA,GAAE,aAAa;AAAA,IACb,SAAS;AAAA,IACT,MAAMA,GAAE,QAAQ,QAAQ;AAAA,IACxB,OAAO;AAAA,IACP,YAAY;AAAA,EACd,CAAC;AACH,CAAC;AACM,IAAM,mCAAmCA,GAAE,aAAa;AAAA,EAC7D,SAAS;AAAA,EACT,kBAAkB;AAAA,EAClB,MAAM;AAAA,EACN,QAAQ;AACV,CAAC;AACM,IAAM,mCAAmCA,GAAE,aAAa;AAAA,EAC7D,SAAS;AAAA,EACT,kBAAkB;AACpB,CAAC;AACM,IAAM,oCAAoCA,GAAE,aAAa;AAAA,EAC9D,SAAS;AAAA,EACT,kBAAkB;AAAA,EAClB,YAAY;AACd,CAAC;AACD,IAAM,cAAc;AAAA,EAClB,IAAI;AAAA,EACJ,OAAO;AAAA,EACP,eAAeA,GAAE,OAAO,EAAE,MAAM,oBAAoB;AAAA,EACpD,UAAU;AAAA,EACV,QAAQA,GAAE,KAAK,CAAC,UAAU,WAAW,SAAS,CAAC;AAAA,EAC/C,WAAW;AAAA,EACX,WAAW;AAAA,EACX,WAAW,0BAA0B,SAAS;AAAA,EAC9C,YAAY,0BAA0B,SAAS;AACjD;AACO,IAAM,8BAA8BA,GAAE,mBAAmB,QAAQ;AAAA,EACtEA,GAAE,aAAa;AAAA,IACb,GAAG;AAAA,IACH,MAAMA,GAAE,QAAQ,OAAO;AAAA,IACvB,MAAM;AAAA,IACN,QAAQ;AAAA,EACV,CAAC;AAAA,EACDA,GAAE,aAAa,EAAE,GAAG,aAAa,MAAMA,GAAE,QAAQ,QAAQ,EAAE,CAAC;AAC9D,CAAC;AACM,IAAM,0BAA0BA,GAAE,aAAa;AAAA,EACpD,SAAS;AAAA,EACT,MAAMA,GAAE,MAAM,2BAA2B,EAAE,IAAI,EAAE;AACnD,CAAC;AACM,IAAM,6BAA6BA,GAAE,mBAAmB,QAAQ;AAAA,EACrEA,GAAE,aAAa;AAAA,IACb,SAAS;AAAA,IACT,MAAMA,GAAE,QAAQ,OAAO;AAAA,IACvB,KAAK,4BAA4B,QAAQ,CAAC;AAAA,IAC1C,QAAQ;AAAA,EACV,CAAC;AAAA,EACDA,GAAE,aAAa;AAAA,IACb,SAAS;AAAA,IACT,MAAMA,GAAE,QAAQ,QAAQ;AAAA,IACxB,KAAK,4BAA4B,QAAQ,CAAC;AAAA,IAC1C,WAAW;AAAA,EACb,CAAC;AACH,CAAC;AACM,IAAM,8BAA8BA,GAAE,aAAa;AAAA,EACxD,SAAS;AAAA,EACT,KAAK;AACP,CAAC;AAGM,IAAM,2BAA2BA,GACrC,IAAI,EAAE,UAAU,UAAU,CAAC,EAC3B,IAAI,IAAI,EACR;AAAA,EACC,CAAC,UAAU,qCAAqC,KAAK,KAAK;AAAA,EAC1D;AACF;AAEK,IAAM,gCAAgCA,GAC1C,IAAI,EAAE,UAAU,WAAW,CAAC,EAC5B,IAAI,IAAI,EACR;AAAA,EACC,CAAC,UAAU,sCAAsC,KAAK,KAAK;AAAA,EAC3D;AACF;AACK,IAAM,0BAA0B,yBAAyB;AAAA,EAC9D,CAAC,UAAU,8BAA8B,KAAK,KAAK;AAAA,EACnD;AACF;AACO,IAAM,mCAAmC,8BAA8B;AAAA,EAC5E,CAAC,UAAU,+BAA+B,KAAK,KAAK;AAAA,EACpD;AACF;AACO,IAAM,sCAAsCA,GAAE,aAAa;AAAA,EAChE,SAAS;AAAA,EACT,OAAO;AACT,CAAC;AACM,IAAM,uCAAuCA,GAAE,aAAa;AAAA,EACjE,SAAS;AAAA,EACT,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,iBAAiB;AAAA,EACjB,WAAW;AAAA,EACX,iBAAiBA,GAAE,QAAQ,mBAAmB,kBAAkB;AAClE,CAAC;AACM,IAAM,qCAAqCA,GAAE,aAAa;AAAA,EAC/D,SAAS;AAAA,EACT,YAAY;AACd,CAAC;AACM,IAAM,gCAAgCA,GAAE,aAAa;AAAA,EAC1D,SAAS;AAAA,EACT,OAAO;AAAA,EACP,UAAU;AAAA,EACV,OAAOA,GAAE,KAAK,CAAC,WAAW,YAAY,YAAY,WAAW,UAAU,CAAC;AAAA,EACxE,WAAW;AACb,CAAC;AACM,IAAM,yCAAyCA,GAAE,mBAAmB,YAAY;AAAA,EACrFA,GAAE,aAAa;AAAA,IACb,SAAS;AAAA,IACT,UAAU;AAAA,IACV,UAAUA,GAAE,QAAQ,SAAS;AAAA,IAC7B,MAAM,qBAAqB,QAAQ,MAAM;AAAA,IACzC,QAAQ,uBAAuB,QAAQ,CAAC,gBAAgB,aAAa,CAAC;AAAA,IACtE,YAAY;AAAA,EACd,CAAC;AAAA,EACDA,GAAE,aAAa;AAAA,IACb,SAAS;AAAA,IACT,UAAU;AAAA,IACV,UAAUA,GAAE,QAAQ,QAAQ;AAAA,EAC9B,CAAC;AACH,CAAC;AACM,IAAM,sCAAsCA,GAAE,mBAAmB,UAAU;AAAA,EAChFA,GAAE,aAAa;AAAA,IACb,SAAS;AAAA,IACT,QAAQA,GAAE,QAAQ,SAAS;AAAA,IAC3B,WAAW;AAAA,IACX,iBAAiBA,GAAE,QAAQ,mBAAmB,kBAAkB;AAAA,EAClE,CAAC;AAAA,EACDA,GAAE,aAAa;AAAA,IACb,SAAS;AAAA,IACT,QAAQA,GAAE,QAAQ,WAAW;AAAA,IAC7B,YAAY;AAAA,IACZ,YAAY,2BAA2B,QAAQ,CAAC;AAAA,EAClD,CAAC;AACH,CAAC;AACM,IAAM,0BAA0BA,GACpC,aAAa;AAAA,EACZ,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,WAAWA,GAAE,aAAa;AAAA,IACxB,MAAMA,GAAE,QAAQ,OAAO;AAAA,IACvB,cAAc;AAAA,IACd,oBAAoB;AAAA,IACpB,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,WAAW;AAAA,EACb,CAAC;AAAA,EACD,cAAcA,GAAE,aAAa;AAAA,IAC3B,WAAWA,GAAE,QAAQ,IAAI;AAAA,IACzB,MAAMA,GAAE,QAAQ,IAAI;AAAA,IACpB,SAASA,GAAE,QAAQ;AAAA,IACnB,OAAOA,GAAE,QAAQ;AAAA,IACjB,aAAaA,GAAE,QAAQ;AAAA,EACzB,CAAC;AAAA,EACD,SAASA,GACN,MAAM,sBAAsB,EAC5B,IAAI,CAAC,EACL,IAAI,CAAC,EACL,OAAO,CAAC,YAAY,IAAI,IAAI,OAAO,EAAE,SAAS,QAAQ,QAAQ,kBAAkB;AACrF,CAAC,EACA,YAAY,CAAC,OAAO,QAAQ;AAC3B,QAAM,iBAAiB;AAAA,IACrB,gBAAgB;AAAA,IAChB,eAAe;AAAA,IACf,gBAAgB;AAAA,IAChB,sBAAsB;AAAA,IACtB,oBAAoB;AAAA,IACpB,mBAAmB;AAAA,EACrB;AACA,QAAM,SAAwE;AAAA,IAC5E,gBAAgB;AAAA,IAChB,sBAAsB;AAAA,IACtB,oBAAoB;AAAA,IACpB,mBAAmB;AAAA,EACrB;AACA,aAAW,UAAU,MAAM,SAAS;AAClC,QAAI,MAAM,UAAU,SAAS,UAAU,OAAO,MAAM,GAAG;AACrD,UAAI,SAAS;AAAA,QACX,MAAM;AAAA,QACN,MAAM,CAAC,SAAS;AAAA,QAChB,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AACA,UAAM,QAAQ,eAAe,MAAqC;AAClE,QAAI,SAAS,CAAC,MAAM,UAAU,OAAO,SAAS,KAAK,GAAG;AACpD,UAAI,SAAS;AAAA,QACX,MAAM;AAAA,QACN,MAAM,CAAC,SAAS;AAAA,QAChB,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAAA,EACF;AACA,MACE,MAAM,QAAQ,SAAS,iBAAiB,KACxC,CAAC,MAAM,UAAU,OAAO,SAAS,eAAe,GAChD;AACA,QAAI,SAAS;AAAA,MACX,MAAM;AAAA,MACN,MAAM,CAAC,SAAS;AAAA,MAChB,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AACA,QAAM,uBAAuB;AAAA,IAC3B,SACE,MAAM,QAAQ,SAAS,oBAAoB,KAAK,MAAM,QAAQ,SAAS,kBAAkB;AAAA,IAC3F,OAAO,MAAM,QAAQ,SAAS,cAAc;AAAA,IAC5C,aAAa,MAAM,QAAQ,SAAS,iBAAiB;AAAA,EACvD;AACA,aAAW,cAAc,CAAC,WAAW,SAAS,aAAa,GAAY;AACrE,QAAI,MAAM,aAAa,UAAU,MAAM,qBAAqB,UAAU,GAAG;AACvE,UAAI,SAAS;AAAA,QACX,MAAM;AAAA,QACN,MAAM,CAAC,gBAAgB,UAAU;AAAA,QACjC,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAAA,EACF;AACF,CAAC;AACI,IAAM,2BAA2BA,GAAE,aAAa;AAAA,EACrD,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,cAAcA,GAAE,aAAa,EAAE,MAAMA,GAAE,QAAQ,IAAI,GAAG,QAAQA,GAAE,QAAQ,IAAI,EAAE,CAAC;AACjF,CAAC;AAEM,IAAM,gCAAgCA,GAAE,aAAa;AAAA,EAC1D,SAAS;AAAA,EACT,eAAeA,GAAE,QAAQ;AAAA,EACzB,QAAQA,GAAE,KAAK,CAAC,SAAS,eAAe,MAAM,CAAC;AAAA,EAC/C,SAAS,wBAAwB,SAAS;AAAA,EAC1C,cAAc,mBAAmB,SAAS;AAAA,EAC1C,cAAc,mBAAmB,SAAS;AAAA,EAC1C,WAAW,0BAA0B,SAAS;AAChD,CAAC;AACM,IAAM,4BAA4BA,GAAE,aAAa;AAAA,EACtD,SAAS;AAAA,EACT,WAAWA,GAAE,QAAQ,IAAI;AAAA,EACzB,eAAeA,GAAE,QAAQ,KAAK;AAAA,EAC9B,8BAA8BA,GAAE,QAAQ;AAC1C,CAAC;;;AExUD,SAAS,KAAAC,UAAS;AAgBX,IAAM,iCAAiCC,GAAE,aAAa;AAAA,EAC3D,MAAMA,GAAE,QAAQ,IAAI;AAAA,EACpB,IAAI;AAAA,EACJ,iBAAiB;AACnB,CAAC;AACM,IAAM,iCAAiCA,GAAE,aAAa;AAAA,EAC3D,MAAMA,GAAE,QAAQ,UAAU;AAAA,EAC1B,WAAW;AAAA,EACX,KAAK;AAAA,EACL,iBAAiB,yBAAyB,SAAS;AACrD,CAAC;AACM,IAAM,yBAAyBA,GAAE,mBAAmB,QAAQ;AAAA,EACjE;AAAA,EACA;AACF,CAAC;AACM,IAAM,oCAAoCA,GAAE,mBAAmB,QAAQ;AAAA,EAC5E;AAAA,EACAA,GAAE,aAAa,EAAE,MAAMA,GAAE,QAAQ,KAAK,GAAG,KAAK,oBAAoB,CAAC;AACrE,CAAC;AACM,IAAM,8BAA8BA,GAAE,mBAAmB,UAAU;AAAA,EACxEA,GAAE,aAAa,EAAE,QAAQA,GAAE,QAAQ,aAAa,GAAG,MAAM,qBAAqB,CAAC;AAAA,EAC/EA,GAAE,aAAa,EAAE,QAAQA,GAAE,QAAQ,UAAU,GAAG,MAAM,qBAAqB,CAAC;AAC9E,CAAC;AACM,IAAM,iCAAiCA,GAAE,aAAa;AAAA,EAC3D,QAAQA,GAAE,QAAQ,WAAW;AAAA,EAC7B,QAAQ;AAAA,EACR,OAAOA,GAAE,QAAQ,UAAU;AAC7B,CAAC;AACM,IAAM,6BAA6BA,GAAE,mBAAmB,UAAU;AAAA,EACvE;AAAA,EACAA,GAAE,aAAa;AAAA,IACb,QAAQA,GAAE,QAAQ,aAAa;AAAA,IAC/B,QAAQA,GAAE,KAAK,CAAC,WAAW,WAAW,CAAC;AAAA,IACvC,SAASA,GAAE,OAAO,EAAE,IAAI,GAAG,EAAE,SAAS;AAAA,EACxC,CAAC;AACH,CAAC;AACM,IAAM,iCAAiCA,GAAE,mBAAmB,QAAQ;AAAA,EACzEA,GAAE,aAAa;AAAA,IACb,MAAMA,GAAE,QAAQ,UAAU;AAAA,IAC1B,SAAS;AAAA,IACT,QAAQ;AAAA,EACV,CAAC;AAAA,EACDA,GAAE,aAAa;AAAA,IACb,MAAMA,GAAE,QAAQ,QAAQ;AAAA,IACxB,WAAW;AAAA,IACX,QAAQ;AAAA,EACV,CAAC;AACH,CAAC;AACM,IAAM,0BAA0BA,GACpC,MAAM,8BAA8B,EACpC,IAAI,mBAAmB,aAAa,EACpC;AAAA,EACC,CAAC,WACC,IAAI,IAAI,OAAO,IAAI,CAAC,UAAW,MAAM,SAAS,aAAa,MAAM,UAAU,MAAM,SAAU,CAAC,EACzF,SAAS,OAAO;AAAA,EACrB;AACF;AACK,IAAM,8BAA8BA,GAAE,aAAa;AAAA,EACxD,MAAM;AAAA,EACN,iBAAiB;AAAA,EACjB,OAAOA,GAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,GAAI;AACzC,CAAC;AACM,IAAM,6BAA6BA,GACvC,aAAa;AAAA,EACZ,MAAM;AAAA,EACN,UAAUA,GAAE,QAAQ;AAAA,EACpB,eAAeA,GAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,mBAAmB,eAAe;AAAA,EAC7E,eAAeA,GAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,mBAAmB,eAAe;AAAA,EAC7E,OAAOA,GAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,GAAI;AAAA,EACvC,SAASA,GAAE,MAAM,2BAA2B,EAAE,IAAI,CAAC,EAAE,IAAI,mBAAmB,eAAe;AAC7F,CAAC,EACA,YAAY,CAAC,OAAO,QAAQ;AAC3B,MAAI,MAAM,gBAAgB,MAAM,iBAAiB,MAAM,gBAAgB,MAAM,QAAQ,QAAQ;AAC3F,QAAI,SAAS;AAAA,MACX,MAAM;AAAA,MACN,MAAM,CAAC,eAAe;AAAA,MACtB,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AACA,MACG,MAAM,YAAY,MAAM,gBAAgB,KACxC,CAAC,MAAM,YAAY,MAAM,kBAAkB,GAC5C;AACA,QAAI,SAAS;AAAA,MACX,MAAM;AAAA,MACN,MAAM,CAAC,eAAe;AAAA,MACtB,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AACA,MACE,IAAI;AAAA,IACF,MAAM,QAAQ,IAAI,CAAC,WAAW,OAAO,KAAK,UAAU,MAAM,EAAE,KAAK,EAAE,kBAAkB,IAAI,CAAC;AAAA,EAC5F,EAAE,SAAS,MAAM,QAAQ,QACzB;AACA,QAAI,SAAS,EAAE,MAAM,UAAU,MAAM,CAAC,SAAS,GAAG,SAAS,wBAAwB,CAAC;AAAA,EACtF;AACF,CAAC;AACI,IAAM,yBAAyBA,GACnC,aAAa;AAAA,EACZ,WAAWA,GAAE,QAAQ,IAAI;AAAA,EACzB,QAAQA,GAAE,MAAM,0BAA0B,EAAE,IAAI,mBAAmB,WAAW;AAChF,CAAC,EACA;AAAA,EACC,CAAC,WACC,IAAI;AAAA,IACF,OAAO,OAAO,IAAI,CAAC,UAAU,MAAM,KAAK,UAAU,MAAM,EAAE,KAAK,EAAE,kBAAkB,IAAI,CAAC;AAAA,EAC1F,EAAE,SAAS,OAAO,OAAO;AAAA,EAC3B;AACF;AACK,IAAM,+BAA+BA,GAAE,aAAa;AAAA,EACzD,MAAM;AAAA,EACN,aAAa,4BAA4B,SAAS;AAAA,EAClD,OAAOA,GAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,GAAK;AAC1C,CAAC;AACD,IAAM,gBAAgB;AAAA,EACpB,MAAMA,GAAE,QAAQ,MAAM;AAAA,EACtB,MAAM;AAAA,EACN,aAAa,4BAA4B,SAAS;AAAA,EAClD,UAAU;AAAA,EACV,WAAWA,GAAE,QAAQ;AAAA,EACrB,QAAQ;AAAA,EACR,QAAQ;AACV;AACO,IAAM,8BAA8BA,GAAE,aAAa;AAAA,EACxD,GAAG;AAAA,EACH,OAAO;AACT,CAAC;AACM,IAAM,mCAAmCA,GAAE,aAAa;AAAA,EAC7D,GAAG;AAAA,EACH,OAAO;AACT,CAAC;AACM,IAAM,iCAAiCA,GAAE,aAAa;AAAA,EAC3D,MAAMA,GAAE,QAAQ,iBAAiB;AAAA,EACjC,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,MAAM;AACR,CAAC;AACM,IAAM,gCAAgCA,GAAE,aAAa;AAAA,EAC1D,MAAMA,GAAE,QAAQ,gBAAgB;AAAA,EAChC,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,MAAM;AACR,CAAC;AACM,IAAM,yBAAyBA,GAAE,mBAAmB,QAAQ;AAAA,EACjE;AAAA,EACA;AACF,CAAC;AAEM,IAAM,2BAA2BA,GAAE,aAAa;AAAA,EACrD,IAAI;AAAA,EACJ,UAAU;AAAA,EACV,MAAM;AAAA,EACN,aAAa,qBAAqB,SAAS;AAAA,EAC3C,OAAOA,GAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,GAAK;AAC1C,CAAC;AACM,IAAM,0BAA0BA,GAAE,aAAa;AAAA,EACpD,IAAI;AAAA,EACJ,UAAU;AAAA,EACV,MAAMA,GAAE,QAAQ,MAAM;AAAA,EACtB,MAAM;AAAA,EACN,WAAW;AAAA,EACX,aAAa,qBAAqB,SAAS;AAAA,EAC3C,YAAY;AAAA,EACZ,WAAWA,GAAE,QAAQ;AAAA,EACrB,iBAAiBA,GAAE,QAAQ;AAAA,EAC3B,SAASA,GAAE,QAAQ;AAAA,EACnB,QAAQA,GACL,MAAMA,GAAE,aAAa,EAAE,SAAS,oBAAoB,QAAQ,qBAAqB,CAAC,CAAC,EACnF,IAAI,mBAAmB,aAAa;AAAA;AAAA,EAEvC,gBAAgB,mBAAmB,SAAS,EAAE,SAAS;AAAA,EACvD,aAAaA,GAAE,MAAM,0BAA0B,EAAE,IAAI,mBAAmB,WAAW;AACrF,CAAC;AACM,IAAM,+BAA+BA,GAAE,aAAa;AAAA,EACzD,SAAS;AAAA,EACT,YAAYA,GAAE,MAAM,wBAAwB,EAAE,IAAI,mBAAmB,QAAQ;AAAA,EAC7E,YAAYA,GACT,OAAO,EACP,MAAM,wBAAwB,EAC9B,SAAS;AACd,CAAC;AACM,IAAM,8BAA8BA,GAAE,aAAa;AAAA,EACxD,SAAS;AAAA,EACT,UAAUA,GAAE,MAAM,uBAAuB,EAAE,IAAI,mBAAmB,QAAQ;AAAA,EAC1E,YAAYA,GACT,OAAO,EACP,MAAM,wBAAwB,EAC9B,SAAS;AACd,CAAC;AACM,IAAM,kCAAkCA,GAAE,aAAa;AAAA,EAC5D,SAAS;AAAA,EACT,SAAS;AAAA;AAAA,EAET,UAAUA,GAAE,aAAa;AAAA,IACvB,cAAc;AAAA,IACd,WAAW;AAAA,IACX,SAAS,mBAAmB,SAAS;AAAA,IACrC,kBAAkB;AAAA,IAClB,cAAcA,GAAE,aAAa,EAAE,SAAS,oBAAoB,QAAQ,qBAAqB,CAAC,EAAE,SAAS,EAAE,SAAS;AAAA,IAChH,gBAAgB,yBAAyB,SAAS;AAAA,EACpD,CAAC,EAAE,SAAS;AACd,CAAC;AACM,IAAM,mCAAmCA,GAAE,aAAa;AAAA,EAC7D,SAAS;AAAA,EACT,UAAU;AACZ,CAAC;AACM,IAAM,oCAAoCA,GAAE,aAAa;AAAA,EAC9D,SAAS;AAAA,EACT,gBAAgB;AAAA,EAChB,UAAUA,GAAE,OAAO,EAAE,MAAM,2DAA2D;AAAA,EACtF,UAAUA,GAAE,KAAK,CAAC,cAAc,aAAa,YAAY,CAAC;AAAA,EAC1D,OAAOA,GAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,mBAAmB,UAAU;AAAA,EAChE,QAAQ;AACV,CAAC;AACM,IAAM,8BAA8BA,GAAE,aAAa;AAAA,EACxD,SAAS;AAAA,EACT,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,UAAUA,GAAE,KAAK,CAAC,cAAc,aAAa,YAAY,CAAC;AAAA,EAC1D,OAAOA,GAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,mBAAmB,UAAU;AAAA,EAChE,WAAW;AACb,CAAC;AACM,IAAM,wBAAwBA,GAAE,aAAa;AAAA,EAClD,SAAS;AAAA,EACT,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,UAAUA,GAAE,KAAK,CAAC,cAAc,aAAa,YAAY,CAAC;AAAA,EAC1D,OAAOA,GAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,mBAAmB,UAAU;AAClE,CAAC;AAGM,IAAM,yBAAyBA,GAAE,aAAa;AAAA,EACnD,SAAS;AAAA,EACT,KAAK;AACP,CAAC;AACM,IAAM,4BAA4BA,GAAE,aAAa;AAAA,EACtD,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,aAAa,qBAAqB,SAAS;AAAA,EAC3C,OAAOA,GAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,GAAK;AAC1C,CAAC;AACM,IAAM,2BAA2BA,GAAE,aAAa;AAAA,EACrD,IAAI;AAAA,EACJ,MAAMA,GAAE,QAAQ,MAAM;AAAA,EACtB,MAAM;AAAA,EACN,WAAW;AAAA,EACX,aAAa,qBAAqB,SAAS;AAAA,EAC3C,YAAY;AAAA,EACZ,WAAWA,GAAE,QAAQ;AAAA,EACrB,QAAQA,GAAE,MAAM,sBAAsB,EAAE,IAAI,mBAAmB,aAAa;AAAA,EAC5E,aAAaA,GAAE,MAAM,0BAA0B,EAAE,IAAI,mBAAmB,WAAW;AACrF,CAAC;AACM,IAAM,2BAA2BA,GAAE,aAAa;AAAA,EACrD,SAAS;AAAA,EACT,YAAYA,GAAE,MAAM,yBAAyB,EAAE,IAAI,mBAAmB,QAAQ;AAAA,EAC9E,UAAUA,GAAE,MAAM,wBAAwB,EAAE,IAAI,mBAAmB,QAAQ;AAAA,EAC3E,YAAYA,GACT,OAAO,EACP,MAAM,wBAAwB,EAC9B,SAAS;AACd,CAAC;AACM,IAAM,mCAAmCA,GAAE,aAAa;AAAA,EAC7D,SAAS;AAAA,EACT,SAAS;AACX,CAAC;AACM,IAAM,iCAAiCA,GAAE,aAAa;AAAA,EAC3D,SAAS;AAAA,EACT,OAAO;AACT,CAAC;;;ACzQM,IAAM,2BAAN,cAAuC,MAAM;AAAA,EAElD,YACW,MACA,SAAS,GACT,YAAY,OACZ,YAA2B,MAC3B,mBACT;AACA,UAAM,yBAAyB,IAAI,IAAI;AAN9B;AACA;AACA;AACA;AACA;AAAA,EAGX;AAAA,EAPW;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EANF,OAAO;AAUlB;AAsBO,SAAS,UAAa,QAAmB,OAAgB,WAAW,OAAU;AACnF,MAAI,qBAAqB;AACzB,MAAI;AACF,QAAI,UAAU,QAAQ,OAAO,UAAU,YAAY,aAAa,OAAO;AACrE,2BAAqB,MAAM,YAAY,UAAa,MAAM,YAAY;AAAA,IACxE;AACA,UAAM,SAAS,OAAO,UAAU,KAAK;AACrC,QAAI,OAAO,QAAS,QAAO,OAAO;AAAA,EACpC,QAAQ;AAAA,EAER;AACA,QAAM,IAAI;AAAA,IACR,qBAAqB,wBAAwB,WAAW,qBAAqB;AAAA,EAC/E;AACF;AAEO,SAAS,iBAAiB,OAAe,MAA+B;AAC7E,MACE,CAAC,SACD,OAAO,UAAU,YACjB,OAAO,KAAK,KAAK,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,SAAS,GAAG,CAAC,GACpD;AACA,UAAM,IAAI,yBAAyB,iBAAiB;AAAA,EACtD;AACF;AAEO,SAAS,eAAe,OAAe,gBAAgB,OAAe;AAC3E,MAAI;AACF,QAAI,OAAO,UAAU,YAAY,CAAC,+BAA+B,KAAK,KAAK,EAAG,OAAM;AACpF,QAAI,oBAAoB,KAAK,KAAK,EAAG,OAAM;AAC3C,UAAM,MAAM,IAAI,IAAI,KAAK;AACzB,UAAM,WAAW,CAAC,aAAa,aAAa,OAAO,EAAE,SAAS,IAAI,QAAQ;AAC1E,QACE,IAAI,aAAa,YACjB,EACE,IAAI,aAAa,YACf,OAAO,YAAY,eAAe,QAAQ,IAAI,aAAa,iBAC1D,iBAAiB;AAGtB,YAAM;AACR,QAAI,IAAI,YAAY,IAAI,YAAY,IAAI,UAAU,IAAI,QAAQ,IAAI,aAAa,IAAK,OAAM;AAC1F,WAAO,IAAI;AAAA,EACb,QAAQ;AACN,UAAM,IAAI,yBAAyB,iBAAiB;AAAA,EACtD;AACF;AAEO,SAAS,WAAW,OAAuB;AAChD,SAAO,UAAU,oBAAoB,KAAK;AAC5C;AAEO,SAAS,UAAU,QAA2B,EAAE,SAAS,IAAI,GAAW;AAC7E,QAAM,QAAQ,UAAU,2BAA2B,KAAK;AACxD,QAAM,SAAS,IAAI,gBAAgB,EAAE,SAAS,MAAM,SAAS,OAAO,OAAO,MAAM,KAAK,EAAE,CAAC;AACzF,MAAI,MAAM,WAAW,OAAW,QAAO,IAAI,UAAU,MAAM,MAAM;AACjE,SAAO,IAAI,MAAM;AACnB;AAUA,SAAS,aAAa,OAAuB;AAC3C,MAAI,CAAC,OAAO,UAAU,KAAK,KAAK,QAAQ,KAAK,QAAQ,KAAS;AAC5D,UAAM,IAAI,yBAAyB,iBAAiB;AAAA,EACtD;AACA,SAAO;AACT;AAEA,IAAM,oBAAoB;AAC1B,IAAM,aAA2D;AAAA,EAC/D,cAAc;AAAA,EACd,uBAAuB;AACzB;AAGO,SAAS,mBACd,SACA,QACA,YACA;AACA,MAAI,QAAQ,YAAY,QAAW;AACjC,qBAAiB,QAAQ,SAAS,CAAC,WAAW,CAAC;AAC/C,QAAI,QAAQ,QAAQ,cAAc,QAAQ,CAAC,QAAQ,OAAO;AACxD,YAAM,IAAI,yBAAyB,iBAAiB;AAAA,IACtD;AAAA,EACF;AACA,QAAM,UAAU,eAAe,QAAQ,SAAS,QAAQ,SAAS,cAAc,IAAI;AACnF,QAAM,YAAY,QAAQ,SAAS,WAAW;AAC9C,MAAI,OAAO,cAAc,WAAY,OAAM,IAAI,yBAAyB,iBAAiB;AACzF,QAAM,iBAAiB,aAAa,QAAQ,aAAa,GAAM;AAC/D,QAAM,UAAU,QAAQ,cAAc;AACtC,MAAI,CAAC,OAAO,UAAU,OAAO,KAAK,UAAU,KAAK,UAAU,GAAG;AAC5D,UAAM,IAAI,yBAAyB,iBAAiB;AAAA,EACtD;AAEA,iBAAe,QACb,MACA,QACA,iBAAyC,CAAC,GAC1C,MACA,QAAQ,OACR,iBAAiB,MACL;AACZ,qBAAiB,gBAAgB,CAAC,UAAU,WAAW,CAAC;AACxD,QACE,kBAAkB,KAAK,IAAI,KAC1B,cAAc,KAAK,SAAS,UAAU,KACtC,OAAO,SAAS,aACd,kBAAkB,KAAK,IAAI,KAAM,cAAc,KAAK,SAAS,UAAU,IAC1E;AACA,YAAM,IAAI,yBAAyB,iBAAiB;AAAA,IACtD;AACA,QAAI,eAAe,WAAW,UAAa,EAAE,eAAe,kBAAkB,cAAc;AAC1F,YAAM,IAAI,yBAAyB,iBAAiB;AAAA,IACtD;AACA,UAAM,YAAY,aAAa,eAAe,cAAc,QAAQ,OAAU,eAAe;AAC7F,QAAI,eAAe,QAAQ,QAAS,OAAM,IAAI,yBAAyB,SAAS;AAChF,UAAM,aAAa,IAAI,gBAAgB;AACvC,QAAI,WAAW;AACf,UAAM,QAAQ,WAAW,MAAM;AAC7B,iBAAW;AACX,iBAAW,MAAM;AAAA,IACnB,GAAG,SAAS;AACZ,UAAM,UAAU,MAAM,WAAW,MAAM;AACvC,mBAAe,QAAQ,iBAAiB,SAAS,SAAS,EAAE,MAAM,KAAK,CAAC;AACxE,UAAM,aAAa,MAAM,IAAI,yBAAyB,WAAW,YAAY,SAAS;AACtF,UAAM,WAAW,KAAK,IAAI,IAAI;AAG9B,UAAM,UAAU,CAAI,YAClB,IAAI,QAAQ,CAAC,SAAS,WAAW;AAC/B,YAAM,QAAQ,MAAM;AAClB,gBAAQ;AACR,eAAO,WAAW,CAAC;AAAA,MACrB;AACA,YAAM,UAAU,MAAM,WAAW,OAAO,oBAAoB,SAAS,KAAK;AAC1E,UAAI,WAAW,OAAO,SAAS;AAC7B,eAAO,WAAW,CAAC;AACnB;AAAA,MACF;AACA,iBAAW,OAAO,iBAAiB,SAAS,OAAO,EAAE,MAAM,KAAK,CAAC;AACjE,cAAQ;AAAA,QACN,CAAC,UAAU;AACT,kBAAQ;AACR,kBAAQ,KAAK;AAAA,QACf;AAAA,QACA,CAAC,UAAmB;AAClB,kBAAQ;AACR,iBAAO,KAAK;AAAA,QACd;AAAA,MACF;AAAA,IACF,CAAC;AACH,UAAM,QAAQ,CAAC,OACb,IAAI,QAAc,CAAC,SAAS,WAAW;AACrC,YAAM,QAAQ,MAAM;AAClB,qBAAa,IAAI;AACjB,mBAAW,OAAO,oBAAoB,SAAS,KAAK;AACpD,eAAO,WAAW,CAAC;AAAA,MACrB;AACA,YAAM,OAAO,WAAW,MAAM;AAC5B,mBAAW,OAAO,oBAAoB,SAAS,KAAK;AACpD,gBAAQ;AAAA,MACV,GAAG,EAAE;AACL,iBAAW,OAAO,iBAAiB,SAAS,OAAO,EAAE,MAAM,KAAK,CAAC;AACjE,UAAI,WAAW,OAAO,QAAS,OAAM;AAAA,IACvC,CAAC;AACH,QAAI;AACF,eAAS,UAAU,KAAK,WAAW;AACjC,YAAI;AACJ,YAAI,aAAa,MAAM,KAAK;AAC5B,YAAI;AACF,gBAAM,UAAU,IAAI,QAAQ,EAAE,QAAQ,mBAAmB,CAAC;AAC1D,cAAI,OAAQ,SAAQ,IAAI,QAAQ,UAAU;AAC1C,cAAI,OAAO,SAAS,SAAU,SAAQ,IAAI,gBAAgB,kBAAkB;AAC5E,gBAAM,WAAW,MAAM;AAAA,YACrB,QAAQ,QAAQ,EACb,KAAK,MAAM;AACV,kBAAI,WAAW,OAAO,QAAS,OAAM,WAAW;AAChD,qBAAO,UAAU,GAAG,OAAO,GAAG,IAAI,IAAI;AAAA,gBACpC,QAAQ,SAAS,SAAY,QAAQ;AAAA,gBACrC;AAAA,gBACA,MAAM,OAAO,SAAS,aAAa,KAAK,IAAI;AAAA,gBAC5C,aAAa;AAAA,gBACb,UAAU;AAAA,gBACV,gBAAgB;AAAA,gBAChB,OAAO;AAAA,gBACP,QAAQ,WAAW;AAAA,cACrB,CAAC;AAAA,YACH,CAAC,EACA,MAAM,MAAM;AAEX,oBAAM,IAAI,yBAAyB,iBAAiB,GAAG,cAAc;AAAA,YACvE,CAAC;AAAA,UACL;AACA,cAAI,SAAS,cAAe,SAAS,UAAU,OAAO,SAAS,SAAS,KAAM;AAC5E,kBAAM,IAAI,yBAAyB,qBAAqB,SAAS,MAAM;AAAA,UACzE;AACA,cAAI,SAAS,OAAO,IAAI,IAAI,SAAS,GAAG,EAAE,WAAW,SAAS;AAC5D,kBAAM,IAAI,yBAAyB,iBAAiB;AAAA,UACtD;AACA,gBAAM,OAAO,MAAM;AAAA,YACjB,QAAQ,QAAQ,EACb,KAAK,MAAM,SAAS,KAAK,CAAC,EAC1B,MAAM,MAAM;AACX,oBAAM,IAAI,yBAAyB,iBAAiB,GAAG,cAAc;AAAA,YACvE,CAAC;AAAA,UACL;AAEA,cAAI,kBAAkB,KAAK,IAAI,KAAM,cAAc,KAAK,SAAS,UAAU,GAAI;AAC7E,kBAAM,IAAI,yBAAyB,oBAAoB,SAAS,MAAM;AAAA,UACxE;AACA,cAAI;AACJ,cAAI;AACF,sBAAU,KAAK,MAAM,IAAI;AAAA,UAC3B,QAAQ;AACN,kBAAM,IAAI,yBAAyB,oBAAoB,SAAS,MAAM;AAAA,UACxE;AACA,gBAAM,cAAc,KAAK,UAAU,OAAO;AAC1C,cACE,kBAAkB,KAAK,WAAW,KACjC,cAAc,YAAY,SAAS,UAAU,GAC9C;AACA,kBAAM,IAAI,yBAAyB,oBAAoB,SAAS,MAAM;AAAA,UACxE;AACA,cAAI,SAAS,GAAI,QAAO,UAAU,QAAQ,SAAS,IAAI;AACvD,gBAAM,OAAO,UAAU,uBAAuB,SAAS,IAAI,EAAE;AAC7D,gBAAM,YACJ,WAAW,KAAK,IAAI,MAAM,QAC1B,KAAK,cACH,KAAK,SAAS,kBAAkB,SAAS,WAAW,OACnD,KAAK,SAAS,2BAA2B,SAAS,WAAW;AAClE,oBAAU,IAAI;AAAA,YACZ,KAAK;AAAA,YACL,SAAS;AAAA,YACT;AAAA,YACA,KAAK;AAAA,YACL,KAAK;AAAA,UACP;AACA,gBAAM,aAAa,SAAS,QAAQ,IAAI,aAAa;AACrD,cAAI,cAAc;AAClB,cAAI,eAAe,MAAM;AACvB,kBAAM,UAAU,QAAQ,KAAK,UAAU,IACnC,OAAO,UAAU,KAChB,KAAK,MAAM,UAAU,IAAI,KAAK,IAAI,KAAK;AAE5C,gBAAI,CAAC,OAAO,SAAS,OAAO,KAAK,UAAU,KAAK,UAAU,MAAM;AAC9D,oBAAM,IAAI;AAAA,gBACR,KAAK;AAAA,gBACL,SAAS;AAAA,gBACT;AAAA,gBACA,KAAK;AAAA,gBACL,KAAK;AAAA,cACP;AAAA,YACF;AACA,0BAAc,KAAK,KAAK,UAAU,GAAI;AAAA,UACxC;AACA,uBAAa,KAAK,IAAI,YAAY,cAAc,KAAK,qBAAqB,KAAK,GAAI;AAAA,QACrF,SAAS,OAAO;AACd,cAAI,WAAW,OAAO,QAAS,OAAM,WAAW;AAChD,oBACE,iBAAiB,2BACb,QACA,IAAI,yBAAyB,iBAAiB,GAAG,cAAc;AAAA,QACvE;AACA,YAAI,CAAC,QAAQ,aAAa,WAAW,WAAW,KAAK,IAAI,IAAI,cAAc;AACzE,gBAAM;AACR,cAAM,MAAM,UAAU;AAAA,MACxB;AAAA,IACF,UAAE;AACA,mBAAa,KAAK;AAClB,qBAAe,QAAQ,oBAAoB,SAAS,OAAO;AAAA,IAC7D;AAAA,EACF;AACA,SAAO,EAAE,QAAQ;AACnB;;;AC/RO,SAAS,2BACd,SACsB;AACtB,mBAAiB,SAAS;AAAA,IACxB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACD,MAAI,CAAC,qBAAqB,UAAU,QAAQ,SAAS,EAAE,SAAS;AAC9D,UAAM,IAAI,yBAAyB,yBAAyB;AAAA,EAC9D;AACA,QAAM,EAAE,QAAQ,IAAI,mBAAmB,SAAS,sBAAsB,QAAQ,SAAS;AACvF,QAAM,OAAO;AACb,SAAO,OAAO,OAAO;AAAA,IACnB,SAAS,OAAO,OAAO;AAAA,MACrB,KAAK,CAACC,aACJ,QAAQ,GAAG,IAAI,YAAY,0BAA0BA,QAAO;AAAA,IAChE,CAAC;AAAA,IACD,SAAS,OAAO,OAAO;AAAA,MACrB,MAAM,CAAC,OAA2BA,aAChC,QAAQ,GAAG,IAAI,WAAW,UAAU,KAAK,CAAC,IAAI,0BAA0BA,QAAO;AAAA,MACjF,YAAY,OAAO,IAAYA,aAAqC;AAClE,cAAM,aAAa,WAAW,EAAE;AAChC,cAAM,SAAS,MAAM;AAAA,UACnB,GAAG,IAAI,qBAAqB,UAAU;AAAA,UACtC;AAAA,UACAA;AAAA,QACF;AACA,YAAI,OAAO,QAAQ,OAAO;AACxB,gBAAM,IAAI,yBAAyB,kBAAkB;AACvD,eAAO;AAAA,MACT;AAAA,IACF,CAAC;AAAA,IACD,QAAQ,OAAO,OAAO;AAAA,MACpB,KAAK,OAAO,IAAYA,aAAqC;AAC3D,cAAM,aAAa,WAAW,EAAE;AAChC,cAAM,SAAS,MAAM;AAAA,UACnB,GAAG,IAAI,WAAW,UAAU;AAAA,UAC5B;AAAA,UACAA;AAAA,QACF;AACA,YAAI,OAAO,MAAM,YAAY;AAC3B,gBAAM,IAAI,yBAAyB,kBAAkB;AACvD,eAAO;AAAA,MACT;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AACH;;;AC/FA,SAAS,KAAAC,UAAS;AAaX,IAAM,yCAAyC;AAC/C,IAAM,kCAAkCC,GAC5C,OAAO,EACP,IAAI,CAAC,EACL,IAAI,GAAG,EACP,MAAM,4BAA4B;AACrC,IAAM,MAAMA,GACT,OAAO,EACP,IAAI,EACJ,IAAI,IAAI,EACR,IAAI,mBAAmB,gBAAgB,EACvC,QAAQ,mBAAmB,oBAAoB;AAClD,IAAM,WAAW;AAAA,EACf,SAAS;AAAA;AAAA,EAET,kBAAkBA,GACf,OAAO,EACP,IAAI,EACJ,IAAI,CAAC,EACL,IAAI,OAAO,mBAAmB,CAAC;AACpC;AACO,IAAM,sCAAsCA,GAAE,mBAAmB,UAAU;AAAA,EAChFA,GAAE,aAAa,EAAE,GAAG,UAAU,QAAQA,GAAE,QAAQ,QAAQ,GAAG,YAAY,IAAI,CAAC;AAAA,EAC5EA,GAAE,aAAa,EAAE,GAAG,UAAU,QAAQA,GAAE,QAAQ,OAAO,GAAG,YAAY,IAAI,CAAC;AAAA,EAC3EA,GAAE,aAAa,EAAE,GAAG,UAAU,QAAQA,GAAE,QAAQ,SAAS,EAAE,CAAC;AAAA,EAC5DA,GAAE,aAAa,EAAE,GAAG,UAAU,QAAQA,GAAE,QAAQ,QAAQ,EAAE,CAAC;AAC7D,CAAC;AACM,IAAM,sCAAsCA,GAAE,aAAa;AAAA,EAChE,UAAU;AAAA,EACV,QAAQA,GAAE,KAAK,CAAC,aAAa,YAAY,SAAS,CAAC;AAAA,EACnD,WAAW;AACb,CAAC;AACM,IAAM,wCAAwCA,GAAE,aAAa;AAAA,EAClE,SAAS;AAAA,EACT,aAAa,oCAAoC,SAAS;AAC5D,CAAC;AACM,IAAM,8BAA8BA,GAAE,aAAa;AAAA,EACxD,SAAS;AAAA,EACT,WAAW;AAAA,EACX,WAAW;AAAA,EACX,aAAaA,GAAE,aAAa;AAAA,IAC1B,UAAU;AAAA,IACV,WAAW;AAAA,EACb,CAAC;AAAA,EACD,SAAS;AACX,CAAC;;;AC1CD,eAAsB,8BACpB,SACA,MACA,gBACA;AACA,mBAAiB,SAAS,CAAC,WAAW,SAAS,aAAa,cAAc,SAAS,CAAC;AACpF,QAAM,aAAa,UAAU,iCAAiC,IAAI;AAClE,QAAM,SAAS,MAAM,mBAAmB,SAAS,MAAM,EAAE,EAAE;AAAA,IACzD,GAAG,sCAAsC,IAAI,UAAU;AAAA,IACvD;AAAA,IACA;AAAA,EACF;AACA,MACE,eAAe,OAAO,SAAS,MAC7B,eAAe,QAAQ,SAAS,QAAQ,SAAS,SAAS,KAC5D,OAAO,QAAQ,WAAW,SAAS;AAEnC,UAAM,IAAI,yBAAyB,iBAAiB;AACtD,SAAO;AACT;","names":["product","group","option","z","z","z","z","options","z","z"]}
|
|
1
|
+
{"version":3,"sources":["../src/errors.ts","../src/resources/orders.ts","../src/resources/catalog.ts","../src/resources/realtime.ts","../src/resources/receipts.ts","../src/resources/discovery.ts","../src/business.ts","../src/http-client.ts","../src/client.ts","../src/checkout.ts","../../shared/src/agent-contracts/access.ts","../../shared/src/agent-contracts/common.ts","../../shared/src/agent-contracts/catalog.ts","../src/key-transport.ts","../src/client-key.ts","../../shared/src/agent-contracts/public-connection.ts","../src/public-connection.ts"],"sourcesContent":["export interface ElenaApiErrorDetails {\n status: number;\n code?: string;\n details?: unknown;\n retryAfter?: string;\n}\n\n/** Backend HTTP failure. Preserves status, business code and raw payload. */\nexport class ElenaApiError extends Error {\n readonly status: number;\n readonly code?: string;\n readonly details?: unknown;\n readonly retryAfter?: string;\n\n constructor(message: string, details: ElenaApiErrorDetails) {\n super(message);\n this.name = 'ElenaApiError';\n this.status = details.status;\n this.code = details.code;\n this.details = details.details;\n this.retryAfter = details.retryAfter;\n }\n}\n\n/** Transport failure before any HTTP response (DNS, refused, TLS). */\nexport class ElenaNetworkError extends Error {\n constructor(message = 'Error de red desconocido') {\n super(message);\n this.name = 'ElenaNetworkError';\n }\n}\n\n/** Configured timeout elapsed before the complete response body was consumed. */\nexport class ElenaTimeoutError extends Error {\n readonly timeoutMs: number;\n\n constructor(timeoutMs: number) {\n super(`Elena no respondió en ${timeoutMs} ms.`);\n this.name = 'ElenaTimeoutError';\n this.timeoutMs = timeoutMs;\n }\n}\n\n/** Caller-provided AbortSignal fired before completion. */\nexport class ElenaRequestAbortedError extends Error {\n constructor(message = 'La solicitud a Elena fue cancelada.') {\n super(message);\n this.name = 'ElenaRequestAbortedError';\n }\n}\n\n/** Unusable API response: a redirect or a successful body that is not JSON. */\nexport class ElenaResponseError extends Error {\n readonly status: number;\n readonly bodyText?: string;\n\n constructor(message: string, details: { status: number; bodyText?: string }) {\n super(message);\n this.name = 'ElenaResponseError';\n this.status = details.status;\n this.bodyText = details.bodyText;\n }\n}\n\nexport type ElenaCheckoutValidationCode =\n | 'PRODUCT_NOT_FOUND'\n | 'PRODUCT_UNAVAILABLE'\n | 'INVALID_QUANTITY'\n | 'UNKNOWN_GROUP'\n | 'UNKNOWN_OPTION'\n | 'DUPLICATE_OPTION'\n | 'REQUIRED_OPTIONS'\n | 'MIN_SELECTIONS'\n | 'MAX_SELECTIONS'\n | 'AMBIGUOUS_SELECTION';\n\n/** Local catalog-snapshot validation only; the backend remains authoritative. */\nexport class ElenaCheckoutValidationError extends Error {\n readonly code: ElenaCheckoutValidationCode;\n /** Selection path, e.g. selections[0].quantity or selections[0].selectedOptions. */\n readonly field: string;\n\n constructor(message: string, details: { code: ElenaCheckoutValidationCode; field: string }) {\n super(message);\n this.name = 'ElenaCheckoutValidationError';\n this.code = details.code;\n this.field = details.field;\n }\n}\n","import type { CatalogAccessResolution } from '../../../shared/src/catalog-access/types';\nimport type { ElenaHttpClient } from '../http-client';\nimport { ElenaApiError } from '../errors';\nimport type {\n CreateOrderInput,\n CreateOrderOptions,\n OrderCreationResult,\n PaymentClaimInput,\n PaymentClaimResult,\n PublicOrderDetail,\n} from '../models/orders';\n\nexport class AccessResource {\n constructor(\n private readonly http: ElenaHttpClient,\n private readonly businessSlug: string,\n ) {}\n\n resolve(publicKey: string): Promise<CatalogAccessResolution> {\n return this.http.request<CatalogAccessResolution>(\n `/api/v1/public/catalog/${encodeURIComponent(this.businessSlug)}/access/${encodeURIComponent(publicKey)}`,\n );\n }\n\n createOrder(\n publicKey: string,\n input: CreateOrderInput,\n options: CreateOrderOptions = {},\n ): Promise<OrderCreationResult> {\n const body =\n options.idempotencyKey && !input.idempotencyKey\n ? { ...input, idempotencyKey: options.idempotencyKey }\n : input;\n return this.http.request<OrderCreationResult>(\n `/api/v1/public/catalog/${encodeURIComponent(this.businessSlug)}/access/${encodeURIComponent(publicKey)}/orders`,\n { method: 'POST', body, signal: options.signal },\n );\n }\n}\n\nexport class OrdersResource {\n constructor(\n private readonly http: ElenaHttpClient,\n private readonly businessSlug: string,\n ) {}\n\n create(input: CreateOrderInput, options: CreateOrderOptions = {}): Promise<OrderCreationResult> {\n const body =\n options.idempotencyKey && !input.idempotencyKey\n ? { ...input, idempotencyKey: options.idempotencyKey }\n : input;\n return this.http.request<OrderCreationResult>(\n `/api/v1/public/catalog/${encodeURIComponent(this.businessSlug)}/orders`,\n { method: 'POST', body, signal: options.signal },\n );\n }\n\n async getById(orderId: string): Promise<PublicOrderDetail> {\n if (!this.http.visitorId) {\n throw new ElenaApiError('Consultar un pedido requiere visitorId.', { status: 0 });\n }\n return this.http.request<PublicOrderDetail>(\n `/api/v1/public/catalog/${encodeURIComponent(this.businessSlug)}/orders/${encodeURIComponent(orderId)}`,\n );\n }\n\n getTracking(trackingToken: string): Promise<PublicOrderDetail> {\n return this.http.request<PublicOrderDetail>(\n `/api/v1/public/catalog/${encodeURIComponent(this.businessSlug)}/tracking/${encodeURIComponent(trackingToken)}`,\n );\n }\n\n submitPaymentClaim(trackingToken: string, input: PaymentClaimInput): Promise<PaymentClaimResult> {\n const form = new FormData();\n form.set('referenceNumber', input.referenceNumber);\n if (input.proofImage) form.set('proofImage', input.proofImage);\n return this.http.request<PaymentClaimResult>(\n `/api/v1/public/catalog/${encodeURIComponent(this.businessSlug)}/tracking/${encodeURIComponent(trackingToken)}/payment-claims`,\n { method: 'POST', body: form },\n );\n }\n}\n","import type { ElenaHttpClient } from '../http-client';\nimport type {\n BusinessInfo,\n BusinessTable,\n CatalogMenu,\n HeroSlide,\n MenuQuery,\n} from '../models/business';\n\nexport class CatalogResource {\n constructor(\n private readonly http: ElenaHttpClient,\n private readonly businessSlug: string,\n ) {}\n\n getInfo(): Promise<BusinessInfo> {\n return this.http.request<BusinessInfo>(\n `/api/v1/public/catalog/${encodeURIComponent(this.businessSlug)}`,\n );\n }\n\n getMenu(query?: MenuQuery): Promise<CatalogMenu> {\n return this.http.request<CatalogMenu>(\n `/api/v1/public/catalog/${encodeURIComponent(this.businessSlug)}/menu`,\n { query: { search: query?.search } },\n );\n }\n\n listHeroSlides(): Promise<HeroSlide[]> {\n return this.http.request<HeroSlide[]>(\n `/api/v1/public/catalog/${encodeURIComponent(this.businessSlug)}/hero-slides`,\n );\n }\n}\n\nexport class TablesResource {\n constructor(\n private readonly http: ElenaHttpClient,\n private readonly businessSlug: string,\n ) {}\n\n listAvailable(): Promise<BusinessTable[]> {\n return this.http.request<BusinessTable[]>(\n `/api/v1/public/catalog/${encodeURIComponent(this.businessSlug)}/tables/available`,\n );\n }\n\n get(tableId: string): Promise<BusinessTable> {\n return this.http.request<BusinessTable>(\n `/api/v1/public/catalog/${encodeURIComponent(this.businessSlug)}/tables/${encodeURIComponent(tableId)}`,\n );\n }\n}\n","import type { ElenaHttpClient } from '../http-client';\nimport { ElenaApiError } from '../errors';\nimport type {\n ContinuationExchangeResult,\n JourneyActionRequired,\n JourneyConfirmInput,\n JourneyConfirmationResult,\n JourneyEventInput,\n JourneySnapshot,\n JourneyStateResult,\n} from '../models/journeys';\n\nexport interface RealtimeConnection {\n url: string;\n}\n\nexport interface ChatConnection {\n apiUrl: string;\n businessSlug: string;\n visitorId?: string;\n}\n\nexport class RealtimeResource {\n constructor(\n private readonly http: ElenaHttpClient,\n private readonly businessSlug: string,\n ) {}\n\n /** SSE stream URL. EventSource-compatible: identity travels in query, not headers. */\n getConnection(visitorId?: string): RealtimeConnection {\n const resolvedVisitorId = visitorId ?? this.http.visitorId;\n if (!resolvedVisitorId) {\n throw new ElenaApiError('El stream de eventos requiere visitorId.', { status: 0 });\n }\n return {\n url: this.http.url('/api/v1/public/events/stream', {\n visitorId: resolvedVisitorId,\n restaurantSlug: this.businessSlug,\n }),\n };\n }\n}\n\nexport class ChatResource {\n constructor(\n private readonly http: ElenaHttpClient,\n private readonly businessSlug: string,\n ) {}\n\n /** Connection descriptor for the existing Tari chat runtime. No HTTP call. */\n getConnection(): ChatConnection {\n return {\n apiUrl: this.http.url('/api/v1'),\n businessSlug: this.businessSlug,\n ...(this.http.visitorId ? { visitorId: this.http.visitorId } : {}),\n };\n }\n}\n\nexport class ContinuationsResource {\n constructor(\n private readonly http: ElenaHttpClient,\n private readonly businessSlug: string,\n ) {}\n\n exchange<TState = unknown>(token: string): Promise<ContinuationExchangeResult<TState>> {\n return this.http.request<ContinuationExchangeResult<TState>>(\n `/api/v1/public/journeys/${encodeURIComponent(this.businessSlug)}/exchange`,\n { method: 'POST', body: { token } },\n );\n }\n}\n\nexport class JourneyConflictError<TState = unknown> extends ElenaApiError {\n readonly journey: JourneySnapshot<TState>;\n\n constructor(journey: JourneySnapshot<TState>) {\n super('La journey cambió en el servidor; recarga el estado.', {\n status: 409,\n code: 'journey_conflict',\n details: { journey },\n });\n this.name = 'JourneyConflictError';\n this.journey = journey;\n }\n}\n\nexport class JourneyResource {\n constructor(\n private readonly http: ElenaHttpClient,\n private readonly businessSlug: string,\n ) {}\n\n getState<TState = unknown>(): Promise<JourneyStateResult<TState>> {\n return this.http.request<JourneyStateResult<TState>>(\n `/api/v1/public/journeys/${encodeURIComponent(this.businessSlug)}/state`,\n );\n }\n\n async dispatch<TState = unknown, TData extends Record<string, unknown> = Record<string, unknown>>(\n input: JourneyEventInput,\n ): Promise<TData & { journey: JourneySnapshot<TState> }> {\n try {\n return await this.http.request<TData & { journey: JourneySnapshot<TState> }>(\n `/api/v1/public/journeys/${encodeURIComponent(this.businessSlug)}/events`,\n {\n method: 'POST',\n body: {\n eventId: input.eventId,\n expectedVersion: input.expectedVersion,\n event: input.event,\n },\n },\n );\n } catch (error) {\n throw JourneyResource.withConflict<TState>(error);\n }\n }\n\n async confirm<TState = unknown>(\n input: JourneyConfirmInput,\n ): Promise<JourneyConfirmationResult<TState> | JourneyActionRequired<TState>> {\n try {\n return await this.http.request<\n JourneyConfirmationResult<TState> | JourneyActionRequired<TState>\n >(`/api/v1/public/journeys/${encodeURIComponent(this.businessSlug)}/confirm`, {\n method: 'POST',\n body: {\n eventId: input.eventId,\n expectedVersion: input.expectedVersion,\n fingerprint: input.fingerprint,\n },\n });\n } catch (error) {\n throw JourneyResource.withConflict<TState>(error);\n }\n }\n\n private static withConflict<TState>(error: unknown): unknown {\n if (\n error instanceof ElenaApiError &&\n error.status === 409 &&\n typeof error.details === 'object' &&\n error.details !== null &&\n 'journey' in error.details\n ) {\n // Server contract: journey_conflict carries the authoritative snapshot.\n const journey = error.details.journey as JourneySnapshot<TState>;\n return new JourneyConflictError<TState>(journey);\n }\n return error;\n }\n}\n","import type { ElenaHttpClient } from '../http-client';\nimport type { LiveSessionBeacon, LiveSessionInput, LiveSessionResult } from '../models/presence';\nimport type { SaleReceipt } from '../models/receipts';\n\nexport class ReceiptsResource {\n constructor(\n private readonly http: ElenaHttpClient,\n private readonly businessSlug: string,\n ) {}\n\n async get(receiptToken: string): Promise<SaleReceipt> {\n const receipt = await this.http.request<SaleReceipt>(\n `/api/v1/public/catalog/${encodeURIComponent(this.businessSlug)}/sales/${encodeURIComponent(receiptToken)}`,\n );\n const url = receipt.receipt?.url;\n if (!url || !url.startsWith('/')) return receipt;\n if (!receipt.receipt) return receipt;\n return { ...receipt, receipt: { ...receipt.receipt, url: this.http.url(url) } };\n }\n\n /** PDF endpoint answers 302; callers open/download the URL, never JSON-fetch it. */\n getPdfUrl(receiptToken: string): string {\n return this.http.url(\n `/api/v1/public/catalog/${encodeURIComponent(this.businessSlug)}/sales/${encodeURIComponent(receiptToken)}/pdf`,\n );\n }\n}\n\nexport class PresenceResource {\n constructor(\n private readonly http: ElenaHttpClient,\n private readonly businessSlug: string,\n ) {}\n\n report(\n input: LiveSessionInput,\n options: { signal?: AbortSignal } = {},\n ): Promise<LiveSessionResult> {\n return this.http.request<LiveSessionResult>(\n `/api/v1/public/catalog/${encodeURIComponent(this.businessSlug)}/live-session`,\n { method: 'POST', body: input, signal: options.signal },\n );\n }\n\n /** Beacon payload for pagehide/unload, where fetch cannot be awaited. */\n getBeaconRequest(input: LiveSessionInput): LiveSessionBeacon {\n return {\n url: this.http.url(\n `/api/v1/public/catalog/${encodeURIComponent(this.businessSlug)}/live-session`,\n ),\n body: new Blob([JSON.stringify(input)], { type: 'application/json' }),\n };\n }\n}\n","import type { ElenaHttpClient } from '../http-client';\nimport type {\n EventDetail,\n TicketEmissionInput,\n TicketEmissionResult,\n TicketStatus,\n} from '../models/events';\n\nexport class EventsResource {\n constructor(private readonly http: ElenaHttpClient) {}\n\n get(businessSlug: string, eventSlug: string): Promise<EventDetail> {\n return this.http.request<EventDetail>('/api/v1/public/events/detail', {\n query: { restaurantSlug: businessSlug, eventSlug },\n });\n }\n}\n\nexport class TicketsResource {\n constructor(private readonly http: ElenaHttpClient) {}\n\n emit(input: TicketEmissionInput): Promise<TicketEmissionResult> {\n return this.http.request<TicketEmissionResult>('/api/v1/public/tickets/emissions', {\n method: 'POST',\n body: input,\n });\n }\n\n getStatus(token: string): Promise<TicketStatus> {\n return this.http.request<TicketStatus>(`/api/v1/public/tickets/${encodeURIComponent(token)}`);\n }\n}\n\nexport class AssetsResource {\n constructor(private readonly http: ElenaHttpClient) {}\n\n /** Render endpoint serves binary content; callers use the URL, never JSON-fetch it. */\n getRenderUrl(assetId: string): string {\n return this.http.url(`/api/v1/public/assets/${encodeURIComponent(assetId)}/render`);\n }\n}\n","import type { ElenaHttpClient } from './http-client';\nimport type { EventDetail, TicketEmissionInput, TicketEmissionResult } from './models/events';\nimport type { BusinessInfo } from './models/business';\nimport { AccessResource, OrdersResource } from './resources/orders';\nimport { CatalogResource, TablesResource } from './resources/catalog';\nimport { ChatResource, ContinuationsResource, RealtimeResource } from './resources/realtime';\nimport { PresenceResource, ReceiptsResource } from './resources/receipts';\nimport { EventsResource, TicketsResource } from './resources/discovery';\n\n/**\n * Business-scoped public surface. The slug selects the business once;\n * resources own the endpoints. Backend wire names (restaurantSlug) stay\n * inside the SDK: consumers speak business everywhere.\n */\nexport class BusinessScope {\n readonly slug: string;\n readonly catalog: CatalogResource;\n readonly tables: TablesResource;\n readonly access: AccessResource;\n readonly orders: OrdersResource;\n readonly receipts: ReceiptsResource;\n readonly presence: PresenceResource;\n readonly continuations: ContinuationsResource;\n readonly realtime: RealtimeResource;\n readonly chat: ChatResource;\n private readonly eventsResource: EventsResource;\n private readonly ticketsResource: TicketsResource;\n\n constructor(\n private readonly http: ElenaHttpClient,\n slug: string,\n ) {\n const normalized = slug.trim();\n if (!normalized) {\n throw new TypeError('BusinessScope necesita un slug.');\n }\n this.slug = normalized;\n this.catalog = new CatalogResource(http, normalized);\n this.tables = new TablesResource(http, normalized);\n this.access = new AccessResource(http, normalized);\n this.orders = new OrdersResource(http, normalized);\n this.receipts = new ReceiptsResource(http, normalized);\n this.presence = new PresenceResource(http, normalized);\n this.continuations = new ContinuationsResource(http, normalized);\n this.realtime = new RealtimeResource(http, normalized);\n this.chat = new ChatResource(http, normalized);\n this.eventsResource = new EventsResource(http);\n this.ticketsResource = new TicketsResource(http);\n }\n\n getInfo(): Promise<BusinessInfo> {\n return this.catalog.getInfo();\n }\n\n getEvent(eventSlug: string): Promise<EventDetail> {\n return this.eventsResource.get(this.slug, eventSlug);\n }\n\n emitTickets(input: Omit<TicketEmissionInput, 'restaurantSlug'>): Promise<TicketEmissionResult> {\n return this.ticketsResource.emit({ ...input, restaurantSlug: this.slug });\n }\n}\n","import {\n ElenaApiError,\n ElenaNetworkError,\n ElenaRequestAbortedError,\n ElenaResponseError,\n ElenaTimeoutError,\n} from './errors';\n\nexport type ElenaHttpMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';\n\n/** Minimal fetch shape the SDK needs. Callers may pass global fetch. */\nexport type ElenaFetch = (input: string | URL | Request, init?: RequestInit) => Promise<Response>;\n\nexport interface ElenaClientOptions {\n baseUrl: string;\n visitorId?: string;\n fetch?: ElenaFetch;\n timeoutMs?: number;\n}\n\nexport interface ElenaRequestOptions {\n method?: ElenaHttpMethod;\n body?: unknown;\n headers?: HeadersInit;\n query?: Record<string, string | number | boolean | undefined>;\n signal?: AbortSignal;\n keepalive?: boolean;\n}\n\nconst DEFAULT_TIMEOUT_MS = 15_000;\n\nfunction isFormDataBody(body: unknown): body is FormData {\n return typeof FormData !== 'undefined' && body instanceof FormData;\n}\n\nfunction isPlainJsonBody(body: unknown): body is Record<string, unknown> | unknown[] {\n if (body === null || body === undefined) return false;\n if (typeof body !== 'object') return false;\n if (isFormDataBody(body)) return false;\n if (body instanceof Blob) return false;\n if (body instanceof ArrayBuffer) return false;\n if (ArrayBuffer.isView(body)) return false;\n if (body instanceof URLSearchParams) return false;\n return true;\n}\n\n/**\n * Shared transport for Elena product clients. Owns origin composition,\n * JSON/multipart bodies, visitor identity, bearer injection, timeout and\n * typed failures. Resources own paths, never the origin.\n */\nexport class ElenaHttpClient {\n readonly baseUrl: string;\n readonly visitorId?: string;\n private readonly fetchImpl: ElenaFetch;\n private readonly timeoutMs: number;\n private readonly accessToken?: string;\n\n constructor(options: ElenaClientOptions, accessToken?: string) {\n const normalizedBaseUrl = options.baseUrl.trim().replace(/\\/+$/, '');\n if (!normalizedBaseUrl) {\n throw new TypeError('Elena SDK necesita un baseUrl.');\n }\n try {\n const base = new URL(normalizedBaseUrl);\n if (\n !/^https?:\\/\\//i.test(normalizedBaseUrl) ||\n /[?#\\\\\\s]/.test(normalizedBaseUrl) ||\n base.username ||\n base.password\n ) {\n throw new TypeError();\n }\n } catch {\n throw new TypeError(\n 'El baseUrl de Elena debe ser una URL HTTP(S) sin credenciales, query ni fragmento.',\n );\n }\n this.baseUrl = normalizedBaseUrl;\n const visitorId = options.visitorId?.trim();\n this.visitorId = visitorId ? visitorId : undefined;\n const fetchImpl = options.fetch ?? globalThis.fetch;\n if (typeof fetchImpl !== 'function') {\n throw new TypeError('Elena SDK necesita una implementación de fetch.');\n }\n this.fetchImpl = fetchImpl.bind(globalThis);\n const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n if (!Number.isFinite(timeoutMs) || timeoutMs <= 0) {\n throw new TypeError('El timeout del SDK de Elena debe ser mayor que cero.');\n }\n this.timeoutMs = timeoutMs;\n const token = accessToken?.trim();\n this.accessToken = token ? token : undefined;\n }\n\n url(path: string, query?: Record<string, string | number | boolean | undefined>): string {\n if (\n /^[a-z][a-z\\d+.-]*:/i.test(path) ||\n path.startsWith('//') ||\n // eslint-disable-next-line no-control-regex -- Intentional: reject control chars and whitespace in paths.\n /[\\\\\\s\\u0000-\\u001f\\u007f]/.test(path) ||\n path.split(/[/?#]/).some((segment) => /^(?:\\.|%2e){1,2}$/i.test(segment))\n ) {\n throw new TypeError(\n 'Las rutas del SDK de Elena deben ser relativas al baseUrl y no escapar de él.',\n );\n }\n const normalizedPath = path.startsWith('/') ? path : `/${path}`;\n const url = `${this.baseUrl}${normalizedPath}`;\n if (!query) return url;\n const params = new URLSearchParams();\n for (const [key, value] of Object.entries(query)) {\n if (value === undefined) continue;\n params.set(key, String(value));\n }\n const qs = params.toString();\n return qs ? `${url}?${qs}` : url;\n }\n\n async request<T>(path: string, options: ElenaRequestOptions = {}): Promise<T> {\n if (options.signal?.aborted) {\n throw new ElenaRequestAbortedError();\n }\n const headers = new Headers();\n headers.set('Accept', 'application/json');\n let body: BodyInit | undefined;\n if (options.body !== undefined) {\n if (isPlainJsonBody(options.body)) {\n headers.set('Content-Type', 'application/json');\n body = JSON.stringify(options.body);\n } else {\n body = options.body as BodyInit;\n }\n }\n if (this.visitorId) headers.set('x-visitor-id', this.visitorId);\n if (options.headers) {\n new Headers(options.headers).forEach((value, key) => {\n headers.set(key, value);\n });\n }\n if (this.accessToken) headers.set('Authorization', `Bearer ${this.accessToken}`);\n\n const controller = new AbortController();\n let timedOut = false;\n const timeout = setTimeout(() => {\n timedOut = true;\n controller.abort();\n }, this.timeoutMs);\n const onCallerAbort = (): void => {\n controller.abort();\n };\n options.signal?.addEventListener('abort', onCallerAbort, { once: true });\n if (options.signal?.aborted) onCallerAbort();\n\n // Bound both fetch and body consumption, including injected fetches that\n // ignore AbortSignal. No request (especially POST) is retried here.\n // Executor form keeps this compatible with the package's Node 18 floor.\n const bounded = <V>(promise: Promise<V>): Promise<V> =>\n new Promise((resolve, reject) => {\n const onAbort = (): void => {\n cleanup();\n reject(timedOut ? new ElenaTimeoutError(this.timeoutMs) : new ElenaRequestAbortedError());\n };\n const cleanup = (): void => controller.signal.removeEventListener('abort', onAbort);\n controller.signal.addEventListener('abort', onAbort, { once: true });\n promise.then(\n (value) => {\n cleanup();\n resolve(value);\n },\n (error: unknown) => {\n cleanup();\n reject(error);\n },\n );\n if (controller.signal.aborted) onAbort();\n });\n\n let response: Response;\n let text: string;\n try {\n response = await bounded(\n Promise.resolve().then(() => {\n if (controller.signal.aborted) throw new ElenaRequestAbortedError();\n return this.fetchImpl(this.url(path, options.query), {\n method: options.method ?? 'GET',\n headers,\n body,\n credentials: 'omit',\n redirect: 'error',\n referrerPolicy: 'no-referrer',\n signal: controller.signal,\n ...(options.keepalive ? { keepalive: true } : {}),\n });\n }),\n );\n if (\n response.redirected ||\n (response.status >= 300 && response.status < 400) ||\n response.type === 'opaqueredirect' ||\n (response.url && new URL(response.url).origin !== new URL(this.baseUrl).origin)\n ) {\n throw new ElenaResponseError('El SDK de Elena no sigue redirecciones de la API.', {\n status: response.status,\n });\n }\n text = await bounded(Promise.resolve().then(() => response.text()));\n } catch (error) {\n if (timedOut) throw new ElenaTimeoutError(this.timeoutMs);\n if (options.signal?.aborted) throw new ElenaRequestAbortedError();\n if (error instanceof ElenaResponseError) throw error;\n if (error instanceof Error && error.name === 'AbortError') {\n throw new ElenaRequestAbortedError();\n }\n throw new ElenaNetworkError(error instanceof Error ? error.message : undefined);\n } finally {\n clearTimeout(timeout);\n options.signal?.removeEventListener('abort', onCallerAbort);\n }\n\n const retryAfter = response.headers.get('retry-after') ?? undefined;\n let payload: unknown = null;\n if (text) {\n try {\n payload = JSON.parse(text) as unknown;\n } catch {\n if (!response.ok) {\n throw new ElenaApiError(`Elena respondió ${response.status}: ${response.statusText}`, {\n status: response.status,\n details: text,\n retryAfter,\n });\n }\n throw new ElenaResponseError('Respuesta inválida del servidor de Elena.', {\n status: response.status,\n bodyText: text,\n });\n }\n }\n\n if (!response.ok) {\n let code: string | undefined;\n let message: string | undefined;\n if (typeof payload === 'object' && payload !== null) {\n if ('code' in payload && typeof payload.code === 'string' && payload.code) {\n code = payload.code;\n } else if ('error' in payload && typeof payload.error === 'string' && payload.error) {\n code = payload.error;\n }\n if (\n !code &&\n 'details' in payload &&\n typeof payload.details === 'object' &&\n payload.details !== null &&\n 'code' in payload.details &&\n typeof payload.details.code === 'string' &&\n payload.details.code\n ) {\n code = payload.details.code;\n }\n if ('message' in payload && typeof payload.message === 'string' && payload.message) {\n message = payload.message;\n }\n }\n throw new ElenaApiError(\n message ?? `Elena respondió ${response.status}: ${response.statusText}`,\n { status: response.status, code, details: payload, retryAfter },\n );\n }\n\n return payload as T;\n }\n}\n","import { BusinessScope } from './business';\nimport { ElenaHttpClient, type ElenaClientOptions, type ElenaFetch } from './http-client';\nimport { AssetsResource } from './resources/discovery';\nimport { TicketsResource } from './resources/discovery';\nimport { JourneyResource } from './resources/realtime';\n\nexport type { ElenaClientOptions };\n\nexport interface ElenaPublicClient {\n business(slug: string): BusinessScope;\n readonly tickets: TicketsResource;\n readonly assets: AssetsResource;\n}\n\nexport function createElenaPublicClient(options: ElenaClientOptions): ElenaPublicClient {\n const http = new ElenaHttpClient(options);\n return {\n business: (slug: string) => new BusinessScope(http, slug),\n tickets: new TicketsResource(http),\n assets: new AssetsResource(http),\n };\n}\n\nexport interface ElenaJourneyClientOptions {\n baseUrl: string;\n businessSlug: string;\n accessToken: string;\n fetch?: ElenaFetch;\n timeoutMs?: number;\n}\n\nexport interface ElenaJourneyClient {\n readonly businessSlug: string;\n readonly journeys: JourneyResource;\n}\n\nexport function createElenaJourneyClient(options: ElenaJourneyClientOptions): ElenaJourneyClient {\n if (!options.accessToken?.trim()) {\n throw new TypeError('El cliente journey de Elena necesita un accessToken.');\n }\n const businessSlug = options.businessSlug.trim();\n if (!businessSlug) {\n throw new TypeError('El cliente journey de Elena necesita un businessSlug.');\n }\n const http = new ElenaHttpClient(\n {\n baseUrl: options.baseUrl,\n fetch: options.fetch,\n timeoutMs: options.timeoutMs,\n },\n options.accessToken,\n );\n return { businessSlug, journeys: new JourneyResource(http, businessSlug) };\n}\n","import { ElenaCheckoutValidationError, type ElenaCheckoutValidationCode } from './errors';\nimport type { CatalogMenu } from './models/business';\nimport type { PublicCatalogOrderItem } from './models/orders';\n\n/** Product/option IDs from one public catalog snapshot; no caller-supplied prices. */\nexport interface OrderItemSelection {\n productId: string;\n quantity: number;\n selectedOptions?: readonly { groupId: string; optionId: string }[];\n notes?: string;\n}\n\nconst catalogName = (name: string): string => name.trim().toLocaleLowerCase();\n\nfunction invalid(code: ElenaCheckoutValidationCode, field: string, message: string): never {\n throw new ElenaCheckoutValidationError(message, { code, field });\n}\n\n/**\n * Build the public order wire items without changing the snapshot or selections.\n * Prices remain decimal strings: unitPrice is the base price, extras are separate.\n * This is early snapshot validation, not a quote, reservation or server guarantee.\n */\nexport function buildOrderItems(\n menu: CatalogMenu,\n selections: readonly OrderItemSelection[],\n): PublicCatalogOrderItem[] {\n return selections.map((selection, itemIndex) => {\n const field = `selections[${itemIndex}]`;\n const products = menu.products.filter((product) => product.id === selection.productId);\n const product = products[0];\n if (!product) {\n return invalid(\n 'PRODUCT_NOT_FOUND',\n `${field}.productId`,\n 'El producto no existe en el catálogo.',\n );\n }\n if (products.length !== 1) {\n return invalid('AMBIGUOUS_SELECTION', `${field}.productId`, 'El ID del producto es ambiguo.');\n }\n if (!product.available) {\n return invalid(\n 'PRODUCT_UNAVAILABLE',\n `${field}.productId`,\n 'El producto no está disponible.',\n );\n }\n if (\n !Number.isInteger(selection.quantity) ||\n selection.quantity < 1 ||\n selection.quantity > 100\n ) {\n return invalid(\n 'INVALID_QUANTITY',\n `${field}.quantity`,\n 'La cantidad debe ser un entero entre 1 y 100.',\n );\n }\n\n const counts = new Map<string, number>();\n const selected = new Map<string, Set<string>>();\n const extras = (selection.selectedOptions ?? []).map((selectionOption, optionIndex) => {\n const optionField = `${field}.selectedOptions[${optionIndex}]`;\n const groups = product.customizationGroups.filter(\n (group) => group.id === selectionOption.groupId,\n );\n const group = groups[0];\n if (!group) {\n return invalid(\n 'UNKNOWN_GROUP',\n `${optionField}.groupId`,\n 'El grupo no pertenece al producto.',\n );\n }\n // The public wire identifies extras by names. Match the backend's name\n // normalization and fail rather than silently selecting another ID/price.\n if (\n groups.length !== 1 ||\n !catalogName(group.name) ||\n product.customizationGroups.filter(\n (candidate) => catalogName(candidate.name) === catalogName(group.name),\n ).length !== 1\n ) {\n return invalid(\n 'AMBIGUOUS_SELECTION',\n `${optionField}.groupId`,\n 'El nombre o ID del grupo es ambiguo.',\n );\n }\n const options = group.options.filter((option) => option.id === selectionOption.optionId);\n const option = options[0];\n if (!option) {\n return invalid(\n 'UNKNOWN_OPTION',\n `${optionField}.optionId`,\n 'La opción no pertenece al grupo.',\n );\n }\n if (\n options.length !== 1 ||\n !catalogName(option.name) ||\n group.options.filter(\n (candidate) => catalogName(candidate.name) === catalogName(option.name),\n ).length !== 1\n ) {\n return invalid(\n 'AMBIGUOUS_SELECTION',\n `${optionField}.optionId`,\n 'El nombre o ID de la opción es ambiguo.',\n );\n }\n const groupSelections = selected.get(group.id) ?? new Set<string>();\n if (groupSelections.has(option.id)) {\n return invalid(\n 'DUPLICATE_OPTION',\n `${optionField}.optionId`,\n 'Una opción no puede seleccionarse más de una vez por artículo.',\n );\n }\n groupSelections.add(option.id);\n selected.set(group.id, groupSelections);\n counts.set(group.id, (counts.get(group.id) ?? 0) + 1);\n return {\n groupName: group.name,\n optionName: option.name,\n additionalPrice: option.additionalPrice,\n };\n });\n\n for (const group of product.customizationGroups) {\n const count = counts.get(group.id) ?? 0;\n if (group.required && count === 0) {\n return invalid(\n 'REQUIRED_OPTIONS',\n `${field}.selectedOptions`,\n `El grupo \"${group.name}\" requiere una opción.`,\n );\n }\n if (count < group.minSelections) {\n return invalid(\n 'MIN_SELECTIONS',\n `${field}.selectedOptions`,\n `El grupo \"${group.name}\" requiere al menos ${group.minSelections} opción(es).`,\n );\n }\n if (count > group.maxSelections) {\n return invalid(\n 'MAX_SELECTIONS',\n `${field}.selectedOptions`,\n `El grupo \"${group.name}\" permite como máximo ${group.maxSelections} opción(es).`,\n );\n }\n }\n\n return {\n productId: product.id,\n cantidad: selection.quantity,\n unitPrice: product.basePrice,\n ...(selection.notes !== undefined ? { specialNotes: selection.notes } : {}),\n ...(extras.length ? { extras } : {}),\n };\n });\n}\n","import { z } from 'zod';\nimport {\n ELENA_AGENT_LIMITS,\n elenaAgentCurrencySchema,\n elenaAgentIdSchema,\n elenaAgentNameSchema,\n elenaAgentRevisionSchema,\n elenaAgentTimestampSchema,\n elenaAgentVersionSchema,\n} from './common';\n\nexport const ELENA_AGENT_TRANSPORT = Object.freeze({\n agentPrefix: 'elena_sk_',\n agentHeader: 'x-elena-agent-key',\n agentPath: '/api/v1/agent',\n clientPrefix: 'elena_pk_',\n clientHeader: 'x-elena-client-key',\n clientPath: '/api/v1/public/sdk',\n ownerPath: '/api/v1/agent-access',\n} as const);\nexport const elenaAgentSecretSchema = z.string().regex(/^elena_sk_[A-Za-z0-9_-]{43}$/);\n// Public role, two unambiguous issuance representations. Manual values remain unchanged.\nexport const elenaManualClientKeySchema = z.string().regex(/^elena_pk_[A-Za-z0-9_-]{43}$/);\nexport const elenaManagedClientKeySchema = z\n .string()\n .max(160)\n .regex(\n /^elena_pk_m_[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}\\.[1-9]\\d{0,15}\\.[A-Za-z0-9_-]{43}$/,\n );\nexport const elenaClientKeySchema = z.union([\n elenaManualClientKeySchema,\n elenaManagedClientKeySchema,\n]);\nexport const elenaAgentDeviceCodeSchema = z.string().regex(/^[A-Za-z0-9_-]{43}$/);\nexport const elenaAgentUserCodeSchema = z.string().regex(/^[A-HJ-NP-Z2-9]{4}-[A-HJ-NP-Z2-9]{4}$/);\nexport const elenaAgentModeSchema = z.enum(['read', 'mutate']);\nexport const elenaAgentScopeSchema = z.enum([\n 'catalog:read',\n 'catalog:write',\n 'catalog:publish',\n 'assets:read',\n 'assets:write',\n 'appearance:write',\n]);\nexport const elenaAgentScopesSchema = z\n .array(elenaAgentScopeSchema)\n .min(1)\n .max(6)\n .refine((scopes) => new Set(scopes).size === scopes.length, 'Duplicate scope')\n .refine((scopes) => scopes.includes('catalog:read'), 'catalog:read is mandatory');\nexport const elenaAgentActionSchema = z.enum([\n 'context.read',\n 'catalog.read',\n 'assets.read',\n 'assets.stage',\n 'operations.read',\n 'operations.propose',\n 'operations.apply',\n 'catalog.publish',\n 'appearance.write',\n]);\nexport const elenaAgentRestaurantSchema = z.strictObject({\n id: elenaAgentIdSchema,\n name: elenaAgentNameSchema,\n slug: z\n .string()\n .regex(/^[a-z0-9]+(?:-[a-z0-9]+)*$/)\n .max(100),\n currency: elenaAgentCurrencySchema,\n});\nconst keyTtl = z\n .number()\n .int()\n .min(3600)\n .max(ELENA_AGENT_LIMITS.keyMaxTtlSeconds)\n .default(ELENA_AGENT_LIMITS.keyDefaultTtlSeconds);\nexport const elenaAgentKeyCreateRequestSchema = z.discriminatedUnion('kind', [\n z.strictObject({\n version: elenaAgentVersionSchema,\n kind: z.literal('agent'),\n label: elenaAgentNameSchema,\n mode: elenaAgentModeSchema.default('read'),\n scopes: elenaAgentScopesSchema.default(['catalog:read', 'assets:read']),\n ttlSeconds: keyTtl,\n }),\n z.strictObject({\n version: elenaAgentVersionSchema,\n kind: z.literal('client'),\n label: elenaAgentNameSchema,\n ttlSeconds: keyTtl,\n }),\n]);\nexport const elenaAgentKeyPolicyRequestSchema = z.strictObject({\n version: elenaAgentVersionSchema,\n expectedRevision: elenaAgentRevisionSchema,\n mode: elenaAgentModeSchema,\n scopes: elenaAgentScopesSchema,\n});\nexport const elenaAgentKeyRevokeRequestSchema = z.strictObject({\n version: elenaAgentVersionSchema,\n expectedRevision: elenaAgentRevisionSchema,\n});\nexport const elenaAgentKeyReplaceRequestSchema = z.strictObject({\n version: elenaAgentVersionSchema,\n expectedRevision: elenaAgentRevisionSchema,\n ttlSeconds: keyTtl,\n});\nconst keyMetadata = {\n id: elenaAgentIdSchema,\n label: elenaAgentNameSchema,\n displaySuffix: z.string().regex(/^[A-Za-z0-9_-]{6}$/),\n revision: elenaAgentRevisionSchema,\n status: z.enum(['active', 'revoked', 'expired']),\n createdAt: elenaAgentTimestampSchema,\n expiresAt: elenaAgentTimestampSchema,\n revokedAt: elenaAgentTimestampSchema.nullable(),\n lastUsedAt: elenaAgentTimestampSchema.nullable(),\n};\nexport const elenaAgentKeyMetadataSchema = z.discriminatedUnion('kind', [\n z.strictObject({\n ...keyMetadata,\n kind: z.literal('agent'),\n mode: elenaAgentModeSchema,\n scopes: elenaAgentScopesSchema,\n }),\n z.strictObject({ ...keyMetadata, kind: z.literal('client') }),\n]);\nexport const elenaAgentKeyListSchema = z.strictObject({\n version: elenaAgentVersionSchema,\n keys: z.array(elenaAgentKeyMetadataSchema).max(20),\n});\nexport const elenaAgentKeyReceiptSchema = z.discriminatedUnion('kind', [\n z.strictObject({\n version: elenaAgentVersionSchema,\n kind: z.literal('agent'),\n key: elenaAgentKeyMetadataSchema.options[0],\n secret: elenaAgentSecretSchema,\n }),\n z.strictObject({\n version: elenaAgentVersionSchema,\n kind: z.literal('client'),\n key: elenaAgentKeyMetadataSchema.options[1],\n clientKey: elenaManualClientKeySchema,\n }),\n]);\nexport const elenaAgentKeyResponseSchema = z.strictObject({\n version: elenaAgentVersionSchema,\n key: elenaAgentKeyMetadataSchema,\n});\n\n// Hosts must additionally pin these returned URLs to the explicitly configured origins.\nexport const elenaAgentHttpsUrlSchema = z\n .url({ protocol: /^https$/ })\n .max(2048)\n .refine(\n (value) => /^https:\\/\\/[^/?#@\\\\\\s]+(?:[/?#]|$)/.test(value),\n 'URL must not contain userinfo',\n );\n// Portable wire shape; consuming hosts enforce HTTPS outside development.\nexport const elenaAgentConnectionUrlSchema = z\n .url({ protocol: /^https?$/ })\n .max(2048)\n .refine(\n (value) => /^https?:\\/\\/[^/?#@\\\\\\s]+(?:[/?#]|$)/.test(value),\n 'URL must not contain userinfo',\n );\nexport const elenaAgentBaseUrlSchema = elenaAgentHttpsUrlSchema.refine(\n (value) => /^https:\\/\\/[^/?#@\\\\\\s]+\\/?$/.test(value),\n 'Base URL must be an explicit origin',\n);\nexport const elenaAgentConnectionOriginSchema = elenaAgentConnectionUrlSchema.refine(\n (value) => /^https?:\\/\\/[^/?#@\\\\\\s]+\\/?$/.test(value),\n 'Base URL must be an explicit origin',\n);\nexport const elenaAgentPairingStartRequestSchema = z.strictObject({\n version: elenaAgentVersionSchema,\n label: elenaAgentNameSchema,\n});\nexport const elenaAgentPairingStartResponseSchema = z.strictObject({\n version: elenaAgentVersionSchema,\n pairingId: elenaAgentIdSchema,\n deviceCode: elenaAgentDeviceCodeSchema,\n userCode: elenaAgentUserCodeSchema,\n verificationUrl: elenaAgentConnectionUrlSchema,\n expiresAt: elenaAgentTimestampSchema,\n intervalSeconds: z.literal(ELENA_AGENT_LIMITS.pairingPollSeconds),\n});\nexport const elenaAgentPairingPollRequestSchema = z.strictObject({\n version: elenaAgentVersionSchema,\n deviceCode: elenaAgentDeviceCodeSchema,\n});\nexport const elenaAgentPairingReviewSchema = z.strictObject({\n version: elenaAgentVersionSchema,\n label: elenaAgentNameSchema,\n userCode: elenaAgentUserCodeSchema,\n state: z.enum(['pending', 'approved', 'rejected', 'expired', 'consumed']),\n expiresAt: elenaAgentTimestampSchema,\n});\nexport const elenaAgentPairingDecisionRequestSchema = z.discriminatedUnion('decision', [\n z.strictObject({\n version: elenaAgentVersionSchema,\n userCode: elenaAgentUserCodeSchema,\n decision: z.literal('approve'),\n mode: elenaAgentModeSchema.default('read'),\n scopes: elenaAgentScopesSchema.default(['catalog:read', 'assets:read']),\n ttlSeconds: keyTtl,\n }),\n z.strictObject({\n version: elenaAgentVersionSchema,\n userCode: elenaAgentUserCodeSchema,\n decision: z.literal('reject'),\n }),\n]);\nexport const elenaAgentPairingPollResponseSchema = z.discriminatedUnion('status', [\n z.strictObject({\n version: elenaAgentVersionSchema,\n status: z.literal('pending'),\n expiresAt: elenaAgentTimestampSchema,\n intervalSeconds: z.literal(ELENA_AGENT_LIMITS.pairingPollSeconds),\n }),\n z.strictObject({\n version: elenaAgentVersionSchema,\n status: z.literal('delivered'),\n restaurant: elenaAgentRestaurantSchema,\n credential: elenaAgentKeyReceiptSchema.options[0],\n }),\n]);\nexport const elenaAgentContextSchema = z\n .strictObject({\n version: elenaAgentVersionSchema,\n restaurant: elenaAgentRestaurantSchema,\n principal: z.strictObject({\n kind: z.literal('agent'),\n credentialId: elenaAgentIdSchema,\n credentialRevision: elenaAgentRevisionSchema,\n mode: elenaAgentModeSchema,\n scopes: elenaAgentScopesSchema,\n expiresAt: elenaAgentTimestampSchema,\n }),\n capabilities: z.strictObject({\n apiAccess: z.literal(true),\n menu: z.literal(true),\n imports: z.boolean(),\n media: z.boolean(),\n publication: z.boolean(),\n }),\n actions: z\n .array(elenaAgentActionSchema)\n .min(1)\n .max(9)\n .refine((actions) => new Set(actions).size === actions.length, 'Duplicate action'),\n })\n .superRefine((value, ctx) => {\n const requiredScopes = {\n 'catalog.read': 'catalog:read',\n 'assets.read': 'assets:read',\n 'assets.stage': 'assets:write',\n 'operations.propose': 'catalog:write',\n 'operations.apply': 'catalog:write',\n 'catalog.publish': 'catalog:publish',\n 'appearance.write': 'appearance:write',\n } as const;\n const writes: Partial<Record<z.infer<typeof elenaAgentActionSchema>, true>> = {\n 'assets.stage': true,\n 'operations.propose': true,\n 'operations.apply': true,\n 'catalog.publish': true,\n 'appearance.write': true,\n };\n for (const action of value.actions) {\n if (value.principal.mode === 'read' && writes[action]) {\n ctx.addIssue({\n code: 'custom',\n path: ['actions'],\n message: 'Read mode cannot expose mutation actions',\n });\n }\n const scope = requiredScopes[action as keyof typeof requiredScopes];\n if (scope && !value.principal.scopes.includes(scope)) {\n ctx.addIssue({\n code: 'custom',\n path: ['actions'],\n message: 'Action exceeds granted scopes',\n });\n }\n }\n if (\n value.actions.includes('catalog.publish') &&\n !value.principal.scopes.includes('catalog:write')\n ) {\n ctx.addIssue({\n code: 'custom',\n path: ['actions'],\n message: 'Publication also requires catalog:write',\n });\n }\n const expectedCapabilities = {\n imports:\n value.actions.includes('operations.propose') && value.actions.includes('operations.apply'),\n media: value.actions.includes('assets.stage'),\n publication: value.actions.includes('catalog.publish'),\n };\n for (const capability of ['imports', 'media', 'publication'] as const) {\n if (value.capabilities[capability] !== expectedCapabilities[capability]) {\n ctx.addIssue({\n code: 'custom',\n path: ['capabilities', capability],\n message: 'Capability must match effective actions',\n });\n }\n }\n });\nexport const elenaClientContextSchema = z.strictObject({\n version: elenaAgentVersionSchema,\n restaurant: elenaAgentRestaurantSchema,\n capabilities: z.strictObject({ menu: z.literal(true), assets: z.literal(true) }),\n});\n\nexport const elenaAgentCliAuthStatusSchema = z.strictObject({\n version: elenaAgentVersionSchema,\n authenticated: z.boolean(),\n source: z.enum(['store', 'environment', 'none']),\n baseUrl: elenaAgentBaseUrlSchema.nullable(),\n credentialId: elenaAgentIdSchema.nullable(),\n restaurantId: elenaAgentIdSchema.nullable(),\n expiresAt: elenaAgentTimestampSchema.nullable(),\n});\nexport const elenaAgentCliLogoutSchema = z.strictObject({\n version: elenaAgentVersionSchema,\n loggedOut: z.literal(true),\n remoteRevoked: z.literal(false),\n environmentCredentialPresent: z.boolean(),\n});\n\nexport type ElenaAgentScopeV1 = z.infer<typeof elenaAgentScopeSchema>;\nexport type ElenaAgentActionV1 = z.infer<typeof elenaAgentActionSchema>;\nexport type ElenaAgentKeyCreateRequestV1 = z.infer<typeof elenaAgentKeyCreateRequestSchema>;\nexport type ElenaAgentKeyPolicyRequestV1 = z.infer<typeof elenaAgentKeyPolicyRequestSchema>;\nexport type ElenaAgentKeyMetadataV1 = z.infer<typeof elenaAgentKeyMetadataSchema>;\nexport type ElenaAgentKeyReceiptV1 = z.infer<typeof elenaAgentKeyReceiptSchema>;\nexport type ElenaAgentPairingStartRequestV1 = z.infer<typeof elenaAgentPairingStartRequestSchema>;\nexport type ElenaAgentPairingStartResponseV1 = z.infer<typeof elenaAgentPairingStartResponseSchema>;\nexport type ElenaAgentPairingPollRequestV1 = z.infer<typeof elenaAgentPairingPollRequestSchema>;\nexport type ElenaAgentPairingPollResponseV1 = z.infer<typeof elenaAgentPairingPollResponseSchema>;\nexport type ElenaAgentPairingDecisionRequestV1 = z.infer<\n typeof elenaAgentPairingDecisionRequestSchema\n>;\nexport type ElenaAgentContextV1 = z.infer<typeof elenaAgentContextSchema>;\nexport type ElenaClientContextV1 = z.infer<typeof elenaClientContextSchema>;\nexport type ElenaAgentPairingReviewV1 = z.infer<typeof elenaAgentPairingReviewSchema>;\nexport type ElenaAgentKeyRevokeRequestV1 = z.infer<typeof elenaAgentKeyRevokeRequestSchema>;\nexport type ElenaAgentKeyReplaceRequestV1 = z.infer<typeof elenaAgentKeyReplaceRequestSchema>;\nexport type ElenaAgentKeyResponseV1 = z.infer<typeof elenaAgentKeyResponseSchema>;\nexport type ElenaAgentKeyListV1 = z.infer<typeof elenaAgentKeyListSchema>;\nexport type ElenaAgentCliAuthStatusV1 = z.infer<typeof elenaAgentCliAuthStatusSchema>;\nexport type ElenaAgentCliLogoutV1 = z.infer<typeof elenaAgentCliLogoutSchema>;\n","import { z } from 'zod';\n\nexport const ELENA_AGENT_CONTRACT_VERSION = '1' as const;\nexport const elenaAgentVersionSchema = z.literal(ELENA_AGENT_CONTRACT_VERSION);\nexport const elenaAgentIdSchema = z.uuid();\nexport const elenaAgentRevisionSchema = z.number().int().min(1).max(Number.MAX_SAFE_INTEGER);\nexport const elenaAgentTimestampSchema = z.iso.datetime();\nexport const elenaAgentHashSchema = z.string().regex(/^[a-f0-9]{64}$/);\nexport const elenaAgentRefSchema = z.string().regex(/^[a-zA-Z0-9][a-zA-Z0-9._:-]{0,99}$/);\nexport const elenaAgentNameSchema = z.string().trim().min(1).max(160);\nexport const elenaAgentTextSchema = z.string().trim().min(1).max(2000);\nexport const elenaAgentCurrencySchema = z.literal('PEN');\n\n// Exact decimal(10,2) wire strings; never round, coerce, or pass through floats.\nexport const elenaAgentNonnegativeMoneySchema = z.string().regex(/^(0|[1-9]\\d{0,7})\\.\\d{2}$/);\nexport const elenaAgentMoneySchema = elenaAgentNonnegativeMoneySchema.refine(\n (value) => value !== '0.00',\n 'Product price must be greater than zero',\n);\n\nexport const ELENA_AGENT_LIMITS = Object.freeze({\n categoriesPerImport: 50,\n productsPerImport: 200,\n changesPerOperation: 200,\n publicationProducts: 200,\n galleryImages: 8,\n extraGroups: 10,\n optionsPerGroup: 30,\n jsonBytes: 1024 * 1024,\n mediaBytes: 10 * 1024 * 1024,\n stagedBytesPerRestaurant: 100 * 1024 * 1024,\n stagedFilesPerRestaurant: 20,\n openOperationsPerRestaurant: 20,\n openPreviewsPerRestaurant: 20,\n activeKeysPerFamily: 10,\n keyDefaultTtlSeconds: 30 * 24 * 60 * 60,\n keyMaxTtlSeconds: 90 * 24 * 60 * 60,\n pairingTtlSeconds: 600,\n pairingPollSeconds: 5,\n proposalTtlSeconds: 24 * 60 * 60,\n previewTtlSeconds: 24 * 60 * 60,\n stagingTtlSeconds: 48 * 60 * 60,\n applyWindowSeconds: 60 * 60,\n workerLeaseSeconds: 30,\n workerHeartbeatSeconds: 10,\n maxWorkerAttempts: 5,\n resultRetentionDays: 90,\n pageSize: 100,\n} as const);\n\nexport const elenaAgentErrorCodeSchema = z.enum([\n 'INVALID_REQUEST',\n 'UNSUPPORTED_VERSION',\n 'CREDENTIAL_REQUIRED',\n 'CREDENTIAL_INVALID',\n 'CREDENTIAL_EXPIRED',\n 'CREDENTIAL_REVOKED',\n 'CREDENTIAL_MIXED',\n 'CREDENTIAL_WRONG_FAMILY',\n 'OWNER_REQUIRED',\n 'ORIGIN_REJECTED',\n 'APPROVAL_REQUIRED',\n 'APPROVAL_REJECTED',\n 'APPROVAL_EXPIRED',\n 'APPROVAL_MISMATCH',\n 'SCOPE_REQUIRED',\n 'MODE_READ_ONLY',\n 'API_ACCESS_DISABLED',\n 'RESTAURANT_NOT_APPROVED',\n 'NOT_FOUND',\n 'VERSION_CONFLICT',\n 'IDEMPOTENCY_CONFLICT',\n 'INVALID_PRICE',\n 'UNCONFIRMED_DATA',\n 'REFERENCE_CONFLICT',\n 'MEDIA_INVALID',\n 'MEDIA_EXPIRED',\n 'QUOTA_EXCEEDED',\n 'RATE_LIMITED',\n 'PAIRING_PENDING',\n 'PAIRING_DENIED',\n 'PAIRING_EXPIRED',\n 'PAIRING_CONSUMED',\n 'OPERATION_TERMINAL',\n 'APPLY_WINDOW_EXPIRED',\n 'DEPENDENCY_FAILED',\n 'TEMPORARY_UNAVAILABLE',\n 'INTERNAL_ERROR',\n]);\nexport const elenaAgentErrorSchema = z.strictObject({\n version: elenaAgentVersionSchema,\n error: z.strictObject({\n code: elenaAgentErrorCodeSchema,\n message: z.string().max(500),\n retryable: z.boolean(),\n requestId: elenaAgentRefSchema,\n retryAfterSeconds: z.number().int().min(1).max(3600).optional(),\n issues: z\n .array(\n z.strictObject({\n path: z.string().max(200),\n code: elenaAgentErrorCodeSchema,\n message: z.string().max(200),\n }),\n )\n .max(250)\n .optional(),\n }),\n});\nexport const elenaAgentPageQuerySchema = z.strictObject({\n version: elenaAgentVersionSchema,\n cursor: z\n .string()\n .regex(/^[a-zA-Z0-9_-]{1,512}$/)\n .optional(),\n limit: z.number().int().min(1).max(ELENA_AGENT_LIMITS.pageSize).default(50),\n});\nexport const elenaAgentEmptyRequestSchema = z.strictObject({ version: elenaAgentVersionSchema });\nexport const elenaAgentAckSchema = z.strictObject({\n version: elenaAgentVersionSchema,\n ok: z.literal(true),\n});\n\nexport type ElenaAgentErrorCodeV1 = z.infer<typeof elenaAgentErrorCodeSchema>;\nexport type ElenaAgentErrorV1 = z.infer<typeof elenaAgentErrorSchema>;\nexport type ElenaAgentPageQueryV1 = z.infer<typeof elenaAgentPageQuerySchema>;\n","import { z } from 'zod';\nimport {\n ELENA_AGENT_LIMITS,\n elenaAgentHashSchema,\n elenaAgentIdSchema,\n elenaAgentMoneySchema,\n elenaAgentNameSchema,\n elenaAgentNonnegativeMoneySchema,\n elenaAgentRefSchema,\n elenaAgentRevisionSchema,\n elenaAgentTextSchema,\n elenaAgentTimestampSchema,\n elenaAgentVersionSchema,\n} from './common';\nimport { elenaAgentHttpsUrlSchema } from './access';\n\nexport const elenaAgentExistingTargetSchema = z.strictObject({\n kind: z.literal('id'),\n id: elenaAgentIdSchema,\n expectedVersion: elenaAgentRevisionSchema,\n});\nexport const elenaAgentExternalTargetSchema = z.strictObject({\n kind: z.literal('external'),\n namespace: elenaAgentRefSchema,\n key: elenaAgentRefSchema,\n expectedVersion: elenaAgentRevisionSchema.nullable(),\n});\nexport const elenaAgentTargetSchema = z.discriminatedUnion('kind', [\n elenaAgentExistingTargetSchema,\n elenaAgentExternalTargetSchema,\n]);\nexport const elenaAgentCategoryReferenceSchema = z.discriminatedUnion('kind', [\n elenaAgentExistingTargetSchema,\n z.strictObject({ kind: z.literal('ref'), ref: elenaAgentRefSchema }),\n]);\nexport const elenaAgentDescriptionSchema = z.discriminatedUnion('status', [\n z.strictObject({ status: z.literal('transcribed'), text: elenaAgentTextSchema }),\n z.strictObject({ status: z.literal('proposed'), text: elenaAgentTextSchema }),\n]);\nexport const elenaAgentConfirmedPriceSchema = z.strictObject({\n status: z.literal('confirmed'),\n amount: elenaAgentMoneySchema,\n basis: z.literal('operator'),\n});\nexport const elenaAgentDraftPriceSchema = z.discriminatedUnion('status', [\n elenaAgentConfirmedPriceSchema,\n z.strictObject({\n status: z.literal('unconfirmed'),\n reason: z.enum(['missing', 'illegible']),\n rawText: z.string().max(100).nullable(),\n }),\n]);\nexport const elenaAgentMediaReferenceSchema = z.discriminatedUnion('kind', [\n z.strictObject({\n kind: z.literal('existing'),\n assetId: elenaAgentIdSchema,\n sha256: elenaAgentHashSchema,\n }),\n z.strictObject({\n kind: z.literal('staged'),\n stagingId: elenaAgentIdSchema,\n sha256: elenaAgentHashSchema,\n }),\n]);\nexport const elenaAgentGallerySchema = z\n .array(elenaAgentMediaReferenceSchema)\n .max(ELENA_AGENT_LIMITS.galleryImages)\n .refine(\n (images) =>\n new Set(images.map((image) => (image.kind === 'existing' ? image.assetId : image.stagingId)))\n .size === images.length,\n 'Duplicate media reference',\n );\nexport const elenaAgentExtraOptionSchema = z.strictObject({\n name: elenaAgentNameSchema,\n additionalPrice: elenaAgentNonnegativeMoneySchema,\n order: z.number().int().min(0).max(1000),\n});\nexport const elenaAgentExtraGroupSchema = z\n .strictObject({\n name: elenaAgentNameSchema,\n required: z.boolean(),\n minSelections: z.number().int().min(0).max(ELENA_AGENT_LIMITS.optionsPerGroup),\n maxSelections: z.number().int().min(1).max(ELENA_AGENT_LIMITS.optionsPerGroup),\n order: z.number().int().min(0).max(1000),\n options: z.array(elenaAgentExtraOptionSchema).min(1).max(ELENA_AGENT_LIMITS.optionsPerGroup),\n })\n .superRefine((group, ctx) => {\n if (group.minSelections > group.maxSelections || group.maxSelections > group.options.length) {\n ctx.addIssue({\n code: 'custom',\n path: ['maxSelections'],\n message: 'Invalid selection bounds',\n });\n }\n if (\n (group.required && group.minSelections < 1) ||\n (!group.required && group.minSelections !== 0)\n ) {\n ctx.addIssue({\n code: 'custom',\n path: ['minSelections'],\n message: 'Required must match minimum selection count',\n });\n }\n if (\n new Set(\n group.options.map((option) => option.name.normalize('NFKC').trim().toLocaleLowerCase('es')),\n ).size !== group.options.length\n ) {\n ctx.addIssue({ code: 'custom', path: ['options'], message: 'Duplicate option name' });\n }\n });\nexport const elenaAgentExtrasSchema = z\n .strictObject({\n confirmed: z.literal(true),\n groups: z.array(elenaAgentExtraGroupSchema).max(ELENA_AGENT_LIMITS.extraGroups),\n })\n .refine(\n (extras) =>\n new Set(\n extras.groups.map((group) => group.name.normalize('NFKC').trim().toLocaleLowerCase('es')),\n ).size === extras.groups.length,\n 'Duplicate group name',\n );\nexport const elenaAgentCategoryDataSchema = z.strictObject({\n name: elenaAgentNameSchema,\n description: elenaAgentDescriptionSchema.nullable(),\n order: z.number().int().min(0).max(10000),\n});\nconst productFields = {\n type: z.literal('menu'),\n name: elenaAgentNameSchema,\n description: elenaAgentDescriptionSchema.nullable(),\n category: elenaAgentCategoryReferenceSchema,\n available: z.boolean(),\n images: elenaAgentGallerySchema,\n extras: elenaAgentExtrasSchema,\n};\nexport const elenaAgentProductDataSchema = z.strictObject({\n ...productFields,\n price: elenaAgentConfirmedPriceSchema,\n});\nexport const elenaAgentDraftProductDataSchema = z.strictObject({\n ...productFields,\n price: elenaAgentDraftPriceSchema,\n});\nexport const elenaAgentCategoryChangeSchema = z.strictObject({\n kind: z.literal('category.upsert'),\n ref: elenaAgentRefSchema,\n target: elenaAgentTargetSchema,\n data: elenaAgentCategoryDataSchema,\n});\nexport const elenaAgentProductChangeSchema = z.strictObject({\n kind: z.literal('product.upsert'),\n ref: elenaAgentRefSchema,\n target: elenaAgentTargetSchema,\n data: elenaAgentProductDataSchema,\n});\nexport const elenaAgentChangeSchema = z.discriminatedUnion('kind', [\n elenaAgentCategoryChangeSchema,\n elenaAgentProductChangeSchema,\n]);\n\nexport const elenaAgentCategorySchema = z.strictObject({\n id: elenaAgentIdSchema,\n revision: elenaAgentRevisionSchema,\n name: elenaAgentNameSchema,\n description: elenaAgentTextSchema.nullable(),\n order: z.number().int().min(0).max(10000),\n});\nexport const elenaAgentProductSchema = z.strictObject({\n id: elenaAgentIdSchema,\n revision: elenaAgentRevisionSchema,\n type: z.literal('menu'),\n name: elenaAgentNameSchema,\n basePrice: elenaAgentMoneySchema,\n description: elenaAgentTextSchema.nullable(),\n categoryId: elenaAgentIdSchema,\n available: z.boolean(),\n publishedToMenu: z.boolean(),\n isDraft: z.boolean(),\n images: z\n .array(z.strictObject({ assetId: elenaAgentIdSchema, sha256: elenaAgentHashSchema }))\n .max(ELENA_AGENT_LIMITS.galleryImages),\n /** Present on current native reads; optional only for retained v1 snapshots. */\n primaryImageId: elenaAgentIdSchema.nullable().optional(),\n extraGroups: z.array(elenaAgentExtraGroupSchema).max(ELENA_AGENT_LIMITS.extraGroups),\n});\nexport const elenaAgentCategoryListSchema = z.strictObject({\n version: elenaAgentVersionSchema,\n categories: z.array(elenaAgentCategorySchema).max(ELENA_AGENT_LIMITS.pageSize),\n nextCursor: z\n .string()\n .regex(/^[a-zA-Z0-9_-]{1,512}$/)\n .nullable(),\n});\nexport const elenaAgentProductListSchema = z.strictObject({\n version: elenaAgentVersionSchema,\n products: z.array(elenaAgentProductSchema).max(ELENA_AGENT_LIMITS.pageSize),\n nextCursor: z\n .string()\n .regex(/^[a-zA-Z0-9_-]{1,512}$/)\n .nullable(),\n});\nexport const elenaAgentProductResponseSchema = z.strictObject({\n version: elenaAgentVersionSchema,\n product: elenaAgentProductSchema,\n /** Authoritative editing metadata; never infer primary image from gallery order. */\n editable: z.strictObject({\n restaurantId: elenaAgentIdSchema,\n productId: elenaAgentIdSchema,\n imageId: elenaAgentIdSchema.nullable(),\n categoryRevision: elenaAgentRevisionSchema,\n primaryImage: z.strictObject({ assetId: elenaAgentIdSchema, sha256: elenaAgentHashSchema }).nullable().optional(),\n imageEditorUrl: elenaAgentHttpsUrlSchema.optional(),\n }).optional(),\n});\nexport const elenaAgentCategoryResponseSchema = z.strictObject({\n version: elenaAgentVersionSchema,\n category: elenaAgentCategorySchema,\n});\nexport const elenaAgentMediaStageRequestSchema = z.strictObject({\n version: elenaAgentVersionSchema,\n idempotencyKey: elenaAgentRefSchema,\n fileName: z.string().regex(/^[a-zA-Z0-9][a-zA-Z0-9._-]{0,119}\\.(?:jpg|jpeg|png|webp)$/),\n mimeType: z.enum(['image/jpeg', 'image/png', 'image/webp']),\n bytes: z.number().int().min(1).max(ELENA_AGENT_LIMITS.mediaBytes),\n sha256: elenaAgentHashSchema,\n});\nexport const elenaAgentMediaStagedSchema = z.strictObject({\n version: elenaAgentVersionSchema,\n stagingId: elenaAgentIdSchema,\n sha256: elenaAgentHashSchema,\n mimeType: z.enum(['image/jpeg', 'image/png', 'image/webp']),\n bytes: z.number().int().min(1).max(ELENA_AGENT_LIMITS.mediaBytes),\n expiresAt: elenaAgentTimestampSchema,\n});\nexport const elenaAgentAssetSchema = z.strictObject({\n version: elenaAgentVersionSchema,\n assetId: elenaAgentIdSchema,\n sha256: elenaAgentHashSchema,\n mimeType: z.enum(['image/jpeg', 'image/png', 'image/webp']),\n bytes: z.number().int().min(1).max(ELENA_AGENT_LIMITS.mediaBytes),\n});\n\n// Deliberately distinct from private product DTOs and from the unchanged slug API.\nexport const elenaClientAssetSchema = z.strictObject({\n assetId: elenaAgentIdSchema,\n url: elenaAgentHttpsUrlSchema,\n});\nexport const elenaClientCategorySchema = z.strictObject({\n id: elenaAgentIdSchema,\n name: elenaAgentNameSchema,\n description: elenaAgentTextSchema.nullable(),\n order: z.number().int().min(0).max(10000),\n});\nexport const elenaClientProductSchema = z.strictObject({\n id: elenaAgentIdSchema,\n type: z.literal('menu'),\n name: elenaAgentNameSchema,\n basePrice: elenaAgentMoneySchema,\n description: elenaAgentTextSchema.nullable(),\n categoryId: elenaAgentIdSchema,\n available: z.boolean(),\n images: z.array(elenaClientAssetSchema).max(ELENA_AGENT_LIMITS.galleryImages),\n extraGroups: z.array(elenaAgentExtraGroupSchema).max(ELENA_AGENT_LIMITS.extraGroups),\n});\nexport const elenaClientCatalogSchema = z.strictObject({\n version: elenaAgentVersionSchema,\n categories: z.array(elenaClientCategorySchema).max(ELENA_AGENT_LIMITS.pageSize),\n products: z.array(elenaClientProductSchema).max(ELENA_AGENT_LIMITS.pageSize),\n nextCursor: z\n .string()\n .regex(/^[a-zA-Z0-9_-]{1,512}$/)\n .nullable(),\n});\nexport const elenaClientProductResponseSchema = z.strictObject({\n version: elenaAgentVersionSchema,\n product: elenaClientProductSchema,\n});\nexport const elenaClientAssetResponseSchema = z.strictObject({\n version: elenaAgentVersionSchema,\n asset: elenaClientAssetSchema,\n});\n\nexport type ElenaAgentTargetV1 = z.infer<typeof elenaAgentTargetSchema>;\nexport type ElenaAgentProductDataV1 = z.infer<typeof elenaAgentProductDataSchema>;\nexport type ElenaAgentCategoryDataV1 = z.infer<typeof elenaAgentCategoryDataSchema>;\nexport type ElenaAgentChangeV1 = z.infer<typeof elenaAgentChangeSchema>;\nexport type ElenaAgentProductV1 = z.infer<typeof elenaAgentProductSchema>;\nexport type ElenaAgentCategoryV1 = z.infer<typeof elenaAgentCategorySchema>;\nexport type ElenaAgentMediaStageRequestV1 = z.infer<typeof elenaAgentMediaStageRequestSchema>;\nexport type ElenaAgentMediaStagedV1 = z.infer<typeof elenaAgentMediaStagedSchema>;\nexport type ElenaAgentAssetV1 = z.infer<typeof elenaAgentAssetSchema>;\nexport type ElenaClientCatalogV1 = z.infer<typeof elenaClientCatalogSchema>;\nexport type ElenaClientProductV1 = z.infer<typeof elenaClientProductSchema>;\nexport type ElenaAgentCategoryListV1 = z.infer<typeof elenaAgentCategoryListSchema>;\nexport type ElenaAgentCategoryResponseV1 = z.infer<typeof elenaAgentCategoryResponseSchema>;\nexport type ElenaAgentProductListV1 = z.infer<typeof elenaAgentProductListSchema>;\nexport type ElenaAgentProductResponseV1 = z.infer<typeof elenaAgentProductResponseSchema>;\nexport type ElenaAgentMediaReferenceV1 = z.infer<typeof elenaAgentMediaReferenceSchema>;\nexport type ElenaAgentExtraGroupV1 = z.infer<typeof elenaAgentExtraGroupSchema>;\nexport type ElenaClientProductResponseV1 = z.infer<typeof elenaClientProductResponseSchema>;\nexport type ElenaClientAssetV1 = z.infer<typeof elenaClientAssetSchema>;\nexport type ElenaClientAssetResponseV1 = z.infer<typeof elenaClientAssetResponseSchema>;\n","import {\n ELENA_AGENT_LIMITS,\n elenaAgentErrorSchema,\n elenaAgentIdSchema,\n elenaAgentPageQuerySchema,\n type ElenaAgentErrorCodeV1,\n type ElenaAgentPageQueryV1,\n} from '../../shared/src/agent-contracts/common';\nimport type { ElenaFetch } from './http-client';\n\nexport type ElenaKeyTransportErrorCode =\n | ElenaAgentErrorCodeV1\n | 'INVALID_RESPONSE'\n | 'NETWORK_ERROR'\n | 'TIMEOUT'\n | 'ABORTED'\n | 'REDIRECT_REJECTED';\n\n/** Intentionally never retains a raw response, request, rejected value, or cause. */\nexport class ElenaAgentTransportError extends Error {\n readonly name = 'ElenaAgentTransportError';\n constructor(\n readonly code: ElenaKeyTransportErrorCode,\n readonly status = 0,\n readonly retryable = false,\n readonly requestId: string | null = null,\n readonly retryAfterSeconds?: number,\n ) {\n super(`Elena request failed (${code}).`);\n }\n}\n\nexport interface ElenaKeyRequestOptions {\n signal?: AbortSignal;\n /** Total request budget, including response consumption and retry delays. */\n timeoutMs?: number;\n}\n\nexport interface ElenaKeyTransportOptions {\n baseUrl: string;\n fetch?: ElenaFetch;\n timeoutMs?: number;\n /** Zero, one, or two additional attempts; default two. */\n maxRetries?: number;\n /** Only loopback HTTP with an explicitly injected test fetch is accepted. */\n testing?: { allowHttp: true };\n}\n\nexport type ElenaKeyPageQuery = Omit<ElenaAgentPageQueryV1, 'limit'> & { limit?: number };\n\ntype Schema<T> = { safeParse: (value: unknown) => { success: true; data: T } | { success: false } };\n\nexport function parseWire<T>(schema: Schema<T>, value: unknown, response = false): T {\n let unsupportedVersion = false;\n try {\n if (value !== null && typeof value === 'object' && 'version' in value) {\n unsupportedVersion = value.version !== undefined && value.version !== '1';\n }\n const parsed = schema.safeParse(value);\n if (parsed.success) return parsed.data;\n } catch {\n /* Do not surface Zod input, getters, or exception messages. */\n }\n throw new ElenaAgentTransportError(\n unsupportedVersion ? 'UNSUPPORTED_VERSION' : response ? 'INVALID_RESPONSE' : 'INVALID_REQUEST',\n );\n}\n\nexport function assertOptionKeys(value: object, keys: readonly string[]): void {\n if (\n !value ||\n typeof value !== 'object' ||\n Object.keys(value).some((key) => !keys.includes(key))\n ) {\n throw new ElenaAgentTransportError('INVALID_REQUEST');\n }\n}\n\nexport function explicitOrigin(value: string, allowTestHttp = false): string {\n try {\n if (typeof value !== 'string' || !/^https?:\\/\\/[^/?#@\\\\\\s]+\\/?$/.test(value)) throw 0;\n if (/elena_(?:sk|pk)_/i.test(value)) throw 0;\n const url = new URL(value);\n const loopback = ['localhost', '127.0.0.1', '[::1]'].includes(url.hostname);\n if (\n url.protocol !== 'https:' &&\n !(\n url.protocol === 'http:' &&\n ((typeof process !== 'undefined' && process.env.NODE_ENV === 'development') ||\n (allowTestHttp && loopback))\n )\n )\n throw 0;\n if (url.username || url.password || url.search || url.hash || url.pathname !== '/') throw 0;\n return url.origin;\n } catch {\n throw new ElenaAgentTransportError('ORIGIN_REJECTED');\n }\n}\n\nexport function resourceId(value: string): string {\n return parseWire(elenaAgentIdSchema, value);\n}\n\nexport function pageQuery(value: ElenaKeyPageQuery = { version: '1' }): string {\n const query = parseWire(elenaAgentPageQuerySchema, value);\n const params = new URLSearchParams({ version: query.version, limit: String(query.limit) });\n if (query.cursor !== undefined) params.set('cursor', query.cursor);\n return `?${params}`;\n}\n\nexport function jsonBody<T>(schema: Schema<T>, value: unknown): string {\n const text = JSON.stringify(parseWire(schema, value));\n if (new TextEncoder().encode(text).byteLength > ELENA_AGENT_LIMITS.jsonBytes) {\n throw new ElenaAgentTransportError('INVALID_REQUEST');\n }\n return text;\n}\n\nfunction timeoutValue(value: number): number {\n if (!Number.isInteger(value) || value < 1 || value > 300_000) {\n throw new ElenaAgentTransportError('INVALID_REQUEST');\n }\n return value;\n}\n\nconst privateCredential = /elena_sk_[A-Za-z0-9_-]{43}/;\nconst retryCodes: Partial<Record<ElenaAgentErrorCodeV1, true>> = {\n RATE_LIMITED: true,\n TEMPORARY_UNAVAILABLE: true,\n};\n\n/** Internal only: clients close over this transport; no credential-bearing fields are exported. */\nexport function createKeyTransport(\n options: ElenaKeyTransportOptions,\n header: 'x-elena-client-key' | 'x-elena-agent-key' | null,\n credential: string,\n) {\n if (options.testing !== undefined) {\n assertOptionKeys(options.testing, ['allowHttp']);\n if (options.testing.allowHttp !== true || !options.fetch) {\n throw new ElenaAgentTransportError('INVALID_REQUEST');\n }\n }\n const baseUrl = explicitOrigin(options.baseUrl, options.testing?.allowHttp === true);\n const fetchImpl = options.fetch ?? globalThis.fetch;\n if (typeof fetchImpl !== 'function') throw new ElenaAgentTransportError('INVALID_REQUEST');\n const defaultTimeout = timeoutValue(options.timeoutMs ?? 30_000);\n const retries = options.maxRetries ?? 2;\n if (!Number.isInteger(retries) || retries < 0 || retries > 2) {\n throw new ElenaAgentTransportError('INVALID_REQUEST');\n }\n\n async function request<T>(\n path: string,\n schema: Schema<T>,\n requestOptions: ElenaKeyRequestOptions = {},\n body?: string | (() => FormData),\n stage = false,\n retryAmbiguous = true,\n ): Promise<T> {\n assertOptionKeys(requestOptions, ['signal', 'timeoutMs']);\n if (\n privateCredential.test(path) ||\n (credential && path.includes(credential)) ||\n (typeof body === 'string' &&\n (privateCredential.test(body) || (credential && body.includes(credential))))\n ) {\n throw new ElenaAgentTransportError('INVALID_REQUEST');\n }\n if (requestOptions.signal !== undefined && !(requestOptions.signal instanceof AbortSignal)) {\n throw new ElenaAgentTransportError('INVALID_REQUEST');\n }\n const timeoutMs = timeoutValue(requestOptions.timeoutMs ?? (stage ? 120_000 : defaultTimeout));\n if (requestOptions.signal?.aborted) throw new ElenaAgentTransportError('ABORTED');\n const controller = new AbortController();\n let timedOut = false;\n const timer = setTimeout(() => {\n timedOut = true;\n controller.abort();\n }, timeoutMs);\n const onAbort = () => controller.abort();\n requestOptions.signal?.addEventListener('abort', onAbort, { once: true });\n const abortError = () => new ElenaAgentTransportError(timedOut ? 'TIMEOUT' : 'ABORTED');\n const deadline = Date.now() + timeoutMs;\n // Node 18 supports neither Promise.withResolvers nor a cancellation primitive for arbitrary fetches.\n // Race also bounds injected fetch implementations that ignore AbortSignal.\n const bounded = <V>(promise: Promise<V>): Promise<V> =>\n new Promise((resolve, reject) => {\n const abort = () => {\n cleanup();\n reject(abortError());\n };\n const cleanup = () => controller.signal.removeEventListener('abort', abort);\n if (controller.signal.aborted) {\n reject(abortError());\n return;\n }\n controller.signal.addEventListener('abort', abort, { once: true });\n promise.then(\n (value) => {\n cleanup();\n resolve(value);\n },\n (error: unknown) => {\n cleanup();\n reject(error);\n },\n );\n });\n const delay = (ms: number) =>\n new Promise<void>((resolve, reject) => {\n const abort = () => {\n clearTimeout(wait);\n controller.signal.removeEventListener('abort', abort);\n reject(abortError());\n };\n const wait = setTimeout(() => {\n controller.signal.removeEventListener('abort', abort);\n resolve();\n }, ms);\n controller.signal.addEventListener('abort', abort, { once: true });\n if (controller.signal.aborted) abort();\n });\n try {\n for (let attempt = 0; ; attempt++) {\n let failure: ElenaAgentTransportError;\n let retryDelay = 100 * 2 ** attempt;\n try {\n const headers = new Headers({ Accept: 'application/json' });\n if (header) headers.set(header, credential);\n if (typeof body === 'string') headers.set('Content-Type', 'application/json');\n const response = await bounded(\n Promise.resolve()\n .then(() => {\n if (controller.signal.aborted) throw abortError();\n return fetchImpl(`${baseUrl}${path}`, {\n method: body === undefined ? 'GET' : 'POST',\n headers,\n body: typeof body === 'function' ? body() : body,\n credentials: 'omit',\n redirect: 'error',\n referrerPolicy: 'no-referrer',\n cache: 'no-store',\n signal: controller.signal,\n });\n })\n .catch(() => {\n // The injected transport is an external boundary, even if it throws our error class.\n throw new ElenaAgentTransportError('NETWORK_ERROR', 0, retryAmbiguous);\n }),\n );\n if (response.redirected || (response.status >= 300 && response.status < 400)) {\n throw new ElenaAgentTransportError('REDIRECT_REJECTED', response.status);\n }\n if (response.url && new URL(response.url).origin !== baseUrl) {\n throw new ElenaAgentTransportError('ORIGIN_REJECTED');\n }\n const text = await bounded(\n Promise.resolve()\n .then(() => response.text())\n .catch(() => {\n throw new ElenaAgentTransportError('NETWORK_ERROR', 0, retryAmbiguous);\n }),\n );\n // Successful schemas contain human text too. Never return echoed credentials.\n if (privateCredential.test(text) || (credential && text.includes(credential))) {\n throw new ElenaAgentTransportError('INVALID_RESPONSE', response.status);\n }\n let payload: unknown;\n try {\n payload = JSON.parse(text);\n } catch {\n throw new ElenaAgentTransportError('INVALID_RESPONSE', response.status);\n }\n const decodedText = JSON.stringify(payload);\n if (\n privateCredential.test(decodedText) ||\n (credential && decodedText.includes(credential))\n ) {\n throw new ElenaAgentTransportError('INVALID_RESPONSE', response.status);\n }\n if (response.ok) return parseWire(schema, payload, true);\n const wire = parseWire(elenaAgentErrorSchema, payload, true).error;\n const retryable =\n retryCodes[wire.code] === true &&\n wire.retryable &&\n ((wire.code === 'RATE_LIMITED' && response.status === 429) ||\n (wire.code === 'TEMPORARY_UNAVAILABLE' && response.status === 503));\n failure = new ElenaAgentTransportError(\n wire.code,\n response.status,\n retryable,\n wire.requestId,\n wire.retryAfterSeconds,\n );\n const retryAfter = response.headers.get('retry-after');\n let headerDelay = 0;\n if (retryAfter !== null) {\n const seconds = /^\\d+$/.test(retryAfter)\n ? Number(retryAfter)\n : (Date.parse(retryAfter) - Date.now()) / 1000;\n // Never retry sooner when a server delay cannot be interpreted safely.\n if (!Number.isFinite(seconds) || seconds < 0 || seconds > 3600) {\n throw new ElenaAgentTransportError(\n wire.code,\n response.status,\n false,\n wire.requestId,\n wire.retryAfterSeconds,\n );\n }\n headerDelay = Math.ceil(seconds * 1000);\n }\n retryDelay = Math.max(retryDelay, headerDelay, (wire.retryAfterSeconds ?? 0) * 1000);\n } catch (error) {\n if (controller.signal.aborted) throw abortError();\n failure =\n error instanceof ElenaAgentTransportError\n ? error\n : new ElenaAgentTransportError('NETWORK_ERROR', 0, retryAmbiguous);\n }\n if (!failure.retryable || attempt >= retries || Date.now() + retryDelay >= deadline)\n throw failure;\n await delay(retryDelay);\n }\n } finally {\n clearTimeout(timer);\n requestOptions.signal?.removeEventListener('abort', onAbort);\n }\n }\n return { request };\n}\n","import type { ElenaClientContextV1 } from '../../shared/src/agent-contracts/access';\nimport type {\n ElenaClientCatalogV1,\n ElenaClientProductResponseV1,\n ElenaClientAssetResponseV1,\n} from '../../shared/src/agent-contracts/catalog';\nimport {\n elenaClientContextSchema,\n elenaClientKeySchema,\n} from '../../shared/src/agent-contracts/access';\nimport {\n elenaClientAssetResponseSchema,\n elenaClientCatalogSchema,\n elenaClientProductResponseSchema,\n} from '../../shared/src/agent-contracts/catalog';\nimport {\n assertOptionKeys,\n createKeyTransport,\n ElenaAgentTransportError,\n pageQuery,\n resourceId,\n type ElenaKeyPageQuery,\n type ElenaKeyRequestOptions,\n type ElenaKeyTransportOptions,\n} from './key-transport';\n\nexport interface ElenaClientKeyClientOptions extends ElenaKeyTransportOptions {\n clientKey: string;\n}\n\nexport interface ElenaClientKeyClient {\n context: { get(options?: ElenaKeyRequestOptions): Promise<ElenaClientContextV1> };\n catalog: {\n list(\n query?: ElenaKeyPageQuery,\n options?: ElenaKeyRequestOptions,\n ): Promise<ElenaClientCatalogV1>;\n getProduct(id: string, options?: ElenaKeyRequestOptions): Promise<ElenaClientProductResponseV1>;\n };\n assets: {\n get(id: string, options?: ElenaKeyRequestOptions): Promise<ElenaClientAssetResponseV1>;\n };\n}\n\n/** Published menu only. This client never accepts an agent secret or bearer token. */\nexport function createElenaClientKeyClient(\n options: ElenaClientKeyClientOptions,\n): ElenaClientKeyClient {\n assertOptionKeys(options, [\n 'baseUrl',\n 'clientKey',\n 'fetch',\n 'timeoutMs',\n 'maxRetries',\n 'testing',\n ]);\n if (!elenaClientKeySchema.safeParse(options.clientKey).success) {\n throw new ElenaAgentTransportError('CREDENTIAL_WRONG_FAMILY');\n }\n const { request } = createKeyTransport(options, 'x-elena-client-key', options.clientKey);\n const root = '/api/v1/public/sdk';\n return Object.freeze({\n context: Object.freeze({\n get: (options?: ElenaKeyRequestOptions) =>\n request(`${root}/context`, elenaClientContextSchema, options),\n }),\n catalog: Object.freeze({\n list: (query?: ElenaKeyPageQuery, options?: ElenaKeyRequestOptions) =>\n request(`${root}/catalog${pageQuery(query)}`, elenaClientCatalogSchema, options),\n getProduct: async (id: string, options?: ElenaKeyRequestOptions) => {\n const expectedId = resourceId(id);\n const result = await request(\n `${root}/catalog/products/${expectedId}`,\n elenaClientProductResponseSchema,\n options,\n );\n if (result.product.id !== expectedId)\n throw new ElenaAgentTransportError('INVALID_RESPONSE');\n return result;\n },\n }),\n assets: Object.freeze({\n get: async (id: string, options?: ElenaKeyRequestOptions) => {\n const expectedId = resourceId(id);\n const result = await request(\n `${root}/assets/${expectedId}`,\n elenaClientAssetResponseSchema,\n options,\n );\n if (result.asset.assetId !== expectedId)\n throw new ElenaAgentTransportError('INVALID_RESPONSE');\n return result;\n },\n }),\n });\n}\n","import { z } from 'zod';\nimport {\n elenaAgentBaseUrlSchema,\n elenaClientContextSchema,\n elenaManagedClientKeySchema,\n} from './access';\nimport {\n ELENA_AGENT_LIMITS,\n elenaAgentRevisionSchema,\n elenaAgentTimestampSchema,\n elenaAgentVersionSchema,\n} from './common';\n\nexport const ELENA_PUBLIC_CONNECTION_DISCOVERY_ROOT = '/api/v1/public/catalog-connections';\nexport const elenaPublicConnectionSlugSchema = z\n .string()\n .min(1)\n .max(120)\n .regex(/^[a-z0-9]+(?:-[a-z0-9]+)*$/);\nconst ttl = z\n .number()\n .int()\n .min(3600)\n .max(ELENA_AGENT_LIMITS.keyMaxTtlSeconds)\n .default(ELENA_AGENT_LIMITS.keyDefaultTtlSeconds);\nconst mutation = {\n version: elenaAgentVersionSchema,\n // Zero asserts that no connection has ever been created for this restaurant.\n expectedRevision: z\n .number()\n .int()\n .min(0)\n .max(Number.MAX_SAFE_INTEGER - 1),\n};\nexport const elenaPublicConnectionMutationSchema = z.discriminatedUnion('action', [\n z.strictObject({ ...mutation, action: z.literal('enable'), ttlSeconds: ttl }),\n z.strictObject({ ...mutation, action: z.literal('renew'), ttlSeconds: ttl }),\n z.strictObject({ ...mutation, action: z.literal('disable') }),\n z.strictObject({ ...mutation, action: z.literal('revoke') }),\n]);\nexport const elenaPublicConnectionMetadataSchema = z.strictObject({\n revision: elenaAgentRevisionSchema,\n status: z.enum(['published', 'disabled', 'revoked']),\n expiresAt: elenaAgentTimestampSchema,\n});\nexport const elenaPublicConnectionManagementSchema = z.strictObject({\n version: elenaAgentVersionSchema,\n publication: elenaPublicConnectionMetadataSchema.nullable(),\n});\nexport const elenaPublicConnectionSchema = z.strictObject({\n version: elenaAgentVersionSchema,\n apiOrigin: elenaAgentBaseUrlSchema,\n clientKey: elenaManagedClientKeySchema,\n publication: z.strictObject({\n revision: elenaAgentRevisionSchema,\n expiresAt: elenaAgentTimestampSchema,\n }),\n context: elenaClientContextSchema,\n});\nexport type ElenaPublicConnectionV1 = z.infer<typeof elenaPublicConnectionSchema>;\nexport type ElenaPublicConnectionMutationV1 = z.infer<typeof elenaPublicConnectionMutationSchema>;\nexport type ElenaPublicConnectionManagementV1 = z.infer<\n typeof elenaPublicConnectionManagementSchema\n>;\n","import {\n ELENA_PUBLIC_CONNECTION_DISCOVERY_ROOT,\n elenaPublicConnectionSchema,\n elenaPublicConnectionSlugSchema,\n} from '../../shared/src/agent-contracts/public-connection';\nimport {\n assertOptionKeys,\n createKeyTransport,\n explicitOrigin,\n parseWire,\n ElenaAgentTransportError,\n type ElenaKeyRequestOptions,\n type ElenaKeyTransportOptions,\n} from './key-transport';\n\n/** The explicit origin is pinned: discovery cannot redirect credentials to another API. */\nexport async function discoverElenaPublicConnection(\n options: ElenaKeyTransportOptions,\n slug: string,\n requestOptions?: ElenaKeyRequestOptions,\n) {\n assertOptionKeys(options, ['baseUrl', 'fetch', 'timeoutMs', 'maxRetries', 'testing']);\n const identifier = parseWire(elenaPublicConnectionSlugSchema, slug);\n const result = await createKeyTransport(options, null, '').request(\n `${ELENA_PUBLIC_CONNECTION_DISCOVERY_ROOT}/${identifier}`,\n elenaPublicConnectionSchema,\n requestOptions,\n );\n if (\n explicitOrigin(result.apiOrigin) !==\n explicitOrigin(options.baseUrl, options.testing?.allowHttp) ||\n result.context.restaurant.slug !== identifier\n )\n throw new ElenaAgentTransportError('ORIGIN_REJECTED');\n return result;\n}\n"],"mappings":"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","names":["product","group","option","z","z","z","z","options","z","z"]}
|