@amigo-ai/platform-sdk 0.24.0 → 0.26.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/api.md +6 -3
  2. package/dist/core/errors.js +155 -9
  3. package/dist/core/errors.js.map +1 -1
  4. package/dist/core/reconnecting-websocket.js +371 -0
  5. package/dist/core/reconnecting-websocket.js.map +1 -0
  6. package/dist/index.cjs +711 -13
  7. package/dist/index.cjs.map +4 -4
  8. package/dist/index.js +18 -1
  9. package/dist/index.js.map +1 -1
  10. package/dist/index.mjs +711 -13
  11. package/dist/index.mjs.map +4 -4
  12. package/dist/resources/events.js +139 -3
  13. package/dist/resources/events.js.map +1 -1
  14. package/dist/resources/integrations.js +25 -0
  15. package/dist/resources/integrations.js.map +1 -1
  16. package/dist/resources/observers.js +238 -0
  17. package/dist/resources/observers.js.map +1 -0
  18. package/dist/types/core/errors.d.ts +93 -1
  19. package/dist/types/core/errors.d.ts.map +1 -1
  20. package/dist/types/core/reconnecting-websocket.d.ts +156 -0
  21. package/dist/types/core/reconnecting-websocket.d.ts.map +1 -0
  22. package/dist/types/generated/api.d.ts +686 -113
  23. package/dist/types/generated/api.d.ts.map +1 -1
  24. package/dist/types/index.d.cts +42 -2
  25. package/dist/types/index.d.cts.map +1 -1
  26. package/dist/types/index.d.ts +42 -2
  27. package/dist/types/index.d.ts.map +1 -1
  28. package/dist/types/resources/events.d.ts +33 -0
  29. package/dist/types/resources/events.d.ts.map +1 -1
  30. package/dist/types/resources/functions.d.ts.map +1 -1
  31. package/dist/types/resources/integrations.d.ts +33 -0
  32. package/dist/types/resources/integrations.d.ts.map +1 -1
  33. package/dist/types/resources/metrics.d.ts.map +1 -1
  34. package/dist/types/resources/observers.d.ts +148 -0
  35. package/dist/types/resources/observers.d.ts.map +1 -0
  36. package/dist/types/resources/operators.d.ts.map +1 -1
  37. package/dist/types/resources/settings.d.ts.map +1 -1
  38. package/package.json +1 -1
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../src/index.ts", "../src/core/errors.ts", "../src/core/openapi-client.ts", "../src/core/auth.ts", "../src/core/rate-limit.ts", "../src/core/request-options.ts", "../src/core/retry.ts", "../src/core/utils.ts", "../src/resources/base.ts", "../src/resources/workspaces.ts", "../src/resources/api-keys.ts", "../src/resources/agents.ts", "../src/resources/skills.ts", "../src/resources/actions.ts", "../src/resources/operators.ts", "../src/resources/triggers.ts", "../src/resources/services.ts", "../src/resources/context-graphs.ts", "../src/resources/data-sources.ts", "../src/resources/world.ts", "../src/resources/calls.ts", "../src/resources/conversations.ts", "../src/resources/phone-numbers.ts", "../src/resources/integrations.ts", "../src/resources/analytics.ts", "../src/resources/simulations.ts", "../src/resources/metrics.ts", "../src/resources/settings.ts", "../src/resources/billing.ts", "../src/resources/memory.ts", "../src/resources/personas.ts", "../src/resources/review-queue.ts", "../src/resources/recordings.ts", "../src/resources/audit.ts", "../src/resources/webhook-destinations.ts", "../src/resources/safety.ts", "../src/resources/compliance.ts", "../src/resources/events.ts", "../src/resources/functions.ts", "../src/core/branded-types.ts", "../src/core/webhooks.ts", "../src/core/device-code.ts"],
4
- "sourcesContent": ["/**\n * @amigo-ai/platform-sdk\n *\n * Official TypeScript SDK for the Amigo Platform API.\n *\n * @example\n * ```typescript\n * import { AmigoClient } from '@amigo-ai/platform-sdk'\n *\n * const client = new AmigoClient({\n * apiKey: 'your-api-key',\n * workspaceId: 'your-workspace-id',\n * })\n *\n * const agents = await client.agents.list()\n * console.log(agents.items)\n * ```\n */\n\nimport type { FetchResponse, HeadersOptions } from 'openapi-fetch'\nimport type { MediaType, PathsWithMethod } from 'openapi-typescript-helpers'\nimport { ConfigurationError } from './core/errors.js'\nimport {\n applyPlatformRequestOptions,\n createPlatformClient,\n type ClientHooks,\n type PlatformFetch,\n} from './core/openapi-client.js'\nimport {\n mergeRequestOptions,\n type AmigoRequestOptions,\n type InitParam,\n type OperationFor,\n type ScopedRequestOptions,\n} from './core/request-options.js'\nimport type { RetryOptions } from './core/retry.js'\nimport { WorkspacesResource } from './resources/workspaces.js'\nimport { ApiKeysResource } from './resources/api-keys.js'\nimport { AgentsResource } from './resources/agents.js'\nimport { SkillsResource } from './resources/skills.js'\nimport { ActionsResource } from './resources/actions.js'\nimport { OperatorsResource } from './resources/operators.js'\nimport { TriggersResource } from './resources/triggers.js'\nimport { ServicesResource } from './resources/services.js'\nimport { ContextGraphsResource } from './resources/context-graphs.js'\nimport { DataSourcesResource } from './resources/data-sources.js'\nimport { WorldResource } from './resources/world.js'\nimport { CallsResource } from './resources/calls.js'\nimport { ConversationsResource } from './resources/conversations.js'\nimport { PhoneNumbersResource } from './resources/phone-numbers.js'\nimport { IntegrationsResource } from './resources/integrations.js'\nimport { AnalyticsResource } from './resources/analytics.js'\nimport { SimulationsResource } from './resources/simulations.js'\nimport { MetricsResource } from './resources/metrics.js'\nimport { SettingsResource } from './resources/settings.js'\nimport { BillingResource } from './resources/billing.js'\nimport { MemoryResource } from './resources/memory.js'\nimport { PersonasResource } from './resources/personas.js'\nimport { ReviewQueueResource } from './resources/review-queue.js'\nimport { RecordingsResource } from './resources/recordings.js'\nimport { AuditResource } from './resources/audit.js'\nimport { WebhookDestinationsResource } from './resources/webhook-destinations.js'\nimport { SafetyResource } from './resources/safety.js'\nimport { ComplianceResource } from './resources/compliance.js'\nimport { EventsResource } from './resources/events.js'\nimport { FunctionsResource } from './resources/functions.js'\nimport { resolveScopedPlatformClient, scopePlatformClient } from './resources/base.js'\nimport type { components, paths } from './generated/api.js'\nimport type { MetricValue as MetricValueAlias } from './resources/metrics.js'\nimport { withResponse, type AmigoResponse } from './core/utils.js'\n\nexport const DEFAULT_BASE_URL = 'https://api.platform.amigo.ai'\n\ntype Mutable<T> = { -readonly [K in keyof T]: T[K] }\n// The generated client exposes TRACE, but the SDK only publishes helpers for\n// platform methods that exist in the committed OpenAPI snapshot.\ntype PlatformMethod = 'get' | 'put' | 'post' | 'delete' | 'options' | 'head' | 'patch'\ntype EmptyOptions = Record<never, never>\ntype PathForMethod<Method extends PlatformMethod> = Extract<PathsWithMethod<paths, Method>, string>\ntype SuccessData<Operation extends Record<string | number, unknown>> = Extract<\n FetchResponse<Operation, EmptyOptions, MediaType>,\n { error?: never }\n>['data']\ntype IsNever<Value> = [Value] extends [never] ? true : false\ntype DefinedSuccessData<Operation extends Record<string | number, unknown>> = Exclude<\n SuccessData<Operation>,\n undefined\n>\n// Success data preserves nullable response bodies. Endpoints with no success\n// body resolve to undefined so low-level helpers can represent 204/205 results.\ntype OperationResponse<\n Path extends keyof paths & string,\n Method extends PlatformMethod,\n> = Method extends keyof paths[Path]\n ? paths[Path][Method] extends infer Operation extends Record<string | number, unknown>\n ? IsNever<SuccessData<Operation>> extends true\n ? never\n : // Preserve nullable success bodies; only no-content operations collapse to undefined.\n [DefinedSuccessData<Operation>] extends [never]\n ? undefined\n : DefinedSuccessData<Operation>\n : never\n : never\n\nexport interface AmigoClientConfig {\n /** API key created via POST /v1/{workspace_id}/api-keys */\n apiKey: string\n\n /** Workspace ID \u2014 all resource operations are scoped to this workspace */\n workspaceId: string\n\n /**\n * Override the base URL. Defaults to https://api.platform.amigo.ai\n *\n * For BFF proxy patterns (e.g., Next.js), point this at your proxy:\n * ```ts\n * new AmigoClient({ baseUrl: '/api/platform', ... })\n * ```\n */\n baseUrl?: string\n\n /** Retry configuration for failed requests */\n retry?: RetryOptions\n\n /** Convenience alias for retry count (same semantics as \"number of retries\") */\n maxRetries?: number\n\n /** Default request timeout in milliseconds */\n timeout?: number\n\n /** Additional headers sent with every request */\n headers?: HeadersOptions\n\n /** Request lifecycle hooks for logging, tracing, or metrics */\n hooks?: ClientHooks\n\n /**\n * Custom fetch implementation.\n *\n * Use for BFF proxy routing, server-side cookie forwarding,\n * or test mocking. When provided, all HTTP requests flow\n * through this function instead of globalThis.fetch.\n */\n fetch?: typeof globalThis.fetch\n\n /**\n * Base URL for the agent engine (voice-agent) WebSocket endpoints.\n *\n * Required when `baseUrl` points to a BFF proxy or a different host\n * than the agent engine \u2014 WebSockets cannot traverse HTTP proxies.\n * Used by `conversations.textStreamUrl()` to build the `ws://` URL.\n *\n * Accepts `http://` or `https://` (auto-mapped to `ws://` / `wss://`)\n * or direct `ws://` / `wss://` URLs.\n *\n * Defaults to deriving from `baseUrl` (works when REST API and agent\n * engine share the same origin).\n *\n * ```ts\n * new AmigoClient({\n * baseUrl: '/api/platform', // BFF proxy for REST\n * agentBaseUrl: 'wss://api.platform.amigo.ai', // direct for WS\n * ...\n * })\n * ```\n */\n agentBaseUrl?: string\n}\n\nexport class AmigoClient {\n readonly workspaceId!: string\n readonly baseUrl!: string\n readonly agentBaseUrl!: string | undefined\n readonly workspaces!: WorkspacesResource\n readonly apiKeys!: ApiKeysResource\n readonly agents!: AgentsResource\n /** @deprecated Use `actions` instead */\n readonly skills!: SkillsResource\n readonly actions!: ActionsResource\n readonly operators!: OperatorsResource\n readonly triggers!: TriggersResource\n readonly services!: ServicesResource\n readonly contextGraphs!: ContextGraphsResource\n readonly dataSources!: DataSourcesResource\n readonly world!: WorldResource\n readonly calls!: CallsResource\n readonly conversations!: ConversationsResource\n readonly phoneNumbers!: PhoneNumbersResource\n readonly integrations!: IntegrationsResource\n readonly analytics!: AnalyticsResource\n readonly simulations!: SimulationsResource\n readonly metrics!: MetricsResource\n readonly settings!: SettingsResource\n readonly billing!: BillingResource\n readonly memory!: MemoryResource\n readonly personas!: PersonasResource\n readonly reviewQueue!: ReviewQueueResource\n readonly recordings!: RecordingsResource\n readonly audit!: AuditResource\n readonly webhookDestinations!: WebhookDestinationsResource\n readonly safety!: SafetyResource\n readonly compliance!: ComplianceResource\n readonly events!: EventsResource\n readonly functions!: FunctionsResource\n /** @internal \u2014 exposed for path-level type inference in GET/POST/PUT/etc. */\n readonly api!: PlatformFetch\n\n constructor(config: AmigoClientConfig) {\n if (!config.apiKey || typeof config.apiKey !== 'string') {\n throw new ConfigurationError('apiKey is required and must be a non-empty string')\n }\n if (!config.workspaceId || typeof config.workspaceId !== 'string') {\n throw new ConfigurationError('workspaceId is required and must be a non-empty string')\n }\n\n const baseUrl = (config.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/$/, '')\n\n const client = createPlatformClient({\n apiKey: config.apiKey,\n baseUrl,\n retry: config.retry,\n maxRetries: config.maxRetries,\n timeout: config.timeout,\n headers: config.headers,\n hooks: config.hooks,\n fetch: config.fetch,\n })\n\n AmigoClient.hydrate(this, client, config.workspaceId, baseUrl, config.agentBaseUrl)\n }\n\n withOptions(options: ScopedRequestOptions): AmigoClient {\n return AmigoClient.fromPlatformClient(\n scopePlatformClient(this.api, options),\n this.workspaceId,\n this.baseUrl,\n this.agentBaseUrl,\n )\n }\n\n async GET<Path extends PathForMethod<'get'>>(\n path: Path,\n ...[init]: InitParam<AmigoRequestOptions<OperationFor<Path, 'get'>>>\n ): Promise<AmigoResponse<OperationResponse<Path, 'get'>>> {\n return withResponse(await this.resolveApiRequest(path, 'GET', init)) as AmigoResponse<\n OperationResponse<Path, 'get'>\n >\n }\n\n async POST<Path extends PathForMethod<'post'>>(\n path: Path,\n ...[init]: InitParam<AmigoRequestOptions<OperationFor<Path, 'post'>>>\n ): Promise<AmigoResponse<OperationResponse<Path, 'post'>>> {\n return withResponse(await this.resolveApiRequest(path, 'POST', init)) as AmigoResponse<\n OperationResponse<Path, 'post'>\n >\n }\n\n async PUT<Path extends PathForMethod<'put'>>(\n path: Path,\n ...[init]: InitParam<AmigoRequestOptions<OperationFor<Path, 'put'>>>\n ): Promise<AmigoResponse<OperationResponse<Path, 'put'>>> {\n return withResponse(await this.resolveApiRequest(path, 'PUT', init)) as AmigoResponse<\n OperationResponse<Path, 'put'>\n >\n }\n\n async PATCH<Path extends PathForMethod<'patch'>>(\n path: Path,\n ...[init]: InitParam<AmigoRequestOptions<OperationFor<Path, 'patch'>>>\n ): Promise<AmigoResponse<OperationResponse<Path, 'patch'>>> {\n return withResponse(await this.resolveApiRequest(path, 'PATCH', init)) as AmigoResponse<\n OperationResponse<Path, 'patch'>\n >\n }\n\n async DELETE<Path extends PathForMethod<'delete'>>(\n path: Path,\n ...[init]: InitParam<AmigoRequestOptions<OperationFor<Path, 'delete'>>>\n ): Promise<AmigoResponse<OperationResponse<Path, 'delete'>>> {\n return withResponse(await this.resolveApiRequest(path, 'DELETE', init)) as AmigoResponse<\n OperationResponse<Path, 'delete'>\n >\n }\n\n async HEAD<Path extends PathForMethod<'head'>>(\n path: Path,\n ...[init]: InitParam<AmigoRequestOptions<OperationFor<Path, 'head'>>>\n ): Promise<AmigoResponse<OperationResponse<Path, 'head'>>> {\n return withResponse(await this.resolveApiRequest(path, 'HEAD', init), {\n allowEmptyBody: true,\n }) as AmigoResponse<OperationResponse<Path, 'head'>>\n }\n\n async OPTIONS<Path extends PathForMethod<'options'>>(\n path: Path,\n ...[init]: InitParam<AmigoRequestOptions<OperationFor<Path, 'options'>>>\n ): Promise<AmigoResponse<OperationResponse<Path, 'options'>>> {\n return withResponse(await this.resolveApiRequest(path, 'OPTIONS', init), {\n allowEmptyBody: true,\n }) as AmigoResponse<OperationResponse<Path, 'options'>>\n }\n\n private static fromPlatformClient(\n client: PlatformFetch,\n workspaceId: string,\n baseUrl: string,\n agentBaseUrl?: string,\n ): AmigoClient {\n const instance = Object.create(AmigoClient.prototype) as AmigoClient\n AmigoClient.hydrate(instance, client, workspaceId, baseUrl, agentBaseUrl)\n return instance\n }\n\n private static hydrate(\n target: AmigoClient,\n client: PlatformFetch,\n workspaceId: string,\n baseUrl: string,\n agentBaseUrl?: string,\n ): void {\n const mutable = target as Mutable<AmigoClient>\n\n mutable.workspaceId = workspaceId\n mutable.baseUrl = baseUrl\n mutable.agentBaseUrl = agentBaseUrl\n ;(target as unknown as { api: PlatformFetch }).api = client\n\n mutable.workspaces = new WorkspacesResource(client, workspaceId)\n mutable.apiKeys = new ApiKeysResource(client, workspaceId)\n mutable.agents = new AgentsResource(client, workspaceId)\n mutable.skills = new SkillsResource(client, workspaceId)\n mutable.actions = new ActionsResource(client, workspaceId)\n mutable.operators = new OperatorsResource(client, workspaceId)\n mutable.triggers = new TriggersResource(client, workspaceId)\n mutable.services = new ServicesResource(client, workspaceId)\n mutable.contextGraphs = new ContextGraphsResource(client, workspaceId)\n mutable.dataSources = new DataSourcesResource(client, workspaceId)\n mutable.world = new WorldResource(client, workspaceId)\n mutable.calls = new CallsResource(client, workspaceId)\n mutable.conversations = new ConversationsResource(client, workspaceId, agentBaseUrl)\n mutable.phoneNumbers = new PhoneNumbersResource(client, workspaceId)\n mutable.integrations = new IntegrationsResource(client, workspaceId)\n mutable.analytics = new AnalyticsResource(client, workspaceId)\n mutable.simulations = new SimulationsResource(client, workspaceId)\n mutable.metrics = new MetricsResource(client, workspaceId)\n mutable.settings = new SettingsResource(client, workspaceId)\n mutable.billing = new BillingResource(client, workspaceId)\n mutable.memory = new MemoryResource(client, workspaceId)\n mutable.personas = new PersonasResource(client, workspaceId)\n mutable.reviewQueue = new ReviewQueueResource(client, workspaceId)\n mutable.recordings = new RecordingsResource(client, workspaceId)\n mutable.audit = new AuditResource(client, workspaceId)\n mutable.webhookDestinations = new WebhookDestinationsResource(client, workspaceId)\n mutable.safety = new SafetyResource(client, workspaceId)\n mutable.compliance = new ComplianceResource(client, workspaceId)\n mutable.events = new EventsResource(client, workspaceId)\n mutable.functions = new FunctionsResource(client, workspaceId)\n }\n\n private async resolveApiRequest<\n Path extends keyof paths & string,\n Method extends 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE' | 'HEAD' | 'OPTIONS',\n >(\n path: Path,\n method: Method,\n init: AmigoRequestOptions<OperationFor<Path, Lowercase<Method>>> | undefined,\n ): Promise<{ data?: unknown; error?: unknown; response: Response }> {\n const { baseClient, options } = resolveScopedPlatformClient(this.api)\n const mergedInit = mergeRequestOptions(options, withWorkspaceId(path, init, this.workspaceId))\n const requestInit = applyPlatformRequestOptions(\n baseClient,\n mergedInit as AmigoRequestOptions<OperationFor<Path, Lowercase<Method>>> | undefined,\n )\n\n switch (method) {\n case 'GET':\n return await baseClient.GET(path as never, requestInit as never)\n case 'POST':\n return await baseClient.POST(path as never, requestInit as never)\n case 'PUT':\n return await baseClient.PUT(path as never, requestInit as never)\n case 'PATCH':\n return await baseClient.PATCH(path as never, requestInit as never)\n case 'DELETE':\n return await baseClient.DELETE(path as never, requestInit as never)\n case 'HEAD':\n return await baseClient.HEAD(path as never, requestInit as never)\n case 'OPTIONS':\n return await baseClient.OPTIONS(path as never, requestInit as never)\n }\n }\n}\n\n// --- Public exports ---\n\nexport type { AmigoClientConfig as AmigoConfig }\n\nexport {\n AmigoError,\n BadRequestError,\n AuthenticationError,\n PermissionError,\n NotFoundError,\n ConflictError,\n ValidationError,\n RateLimitError,\n ServerError,\n ServiceUnavailableError,\n NetworkError,\n RequestTimeoutError,\n ParseError,\n ConfigurationError,\n isAmigoError,\n isNotFoundError,\n isRateLimitError,\n isAuthenticationError,\n isRequestTimeoutError,\n} from './core/errors.js'\n\nexport type {\n WorkspaceId,\n ApiKeyId,\n AgentId,\n PersonaId,\n SkillId,\n ActionId,\n ServiceId,\n ContextGraphId,\n CallId,\n PhoneNumberId,\n IntegrationId,\n EntityId,\n EventId,\n SimulationRunId,\n SimulationSessionId,\n FunctionId,\n DataSourceId,\n} from './core/branded-types.js'\n\nexport {\n workspaceId,\n apiKeyId,\n agentId,\n personaId,\n skillId,\n actionId,\n serviceId,\n contextGraphId,\n callId,\n phoneNumberId,\n integrationId,\n entityId,\n eventId,\n simulationRunId,\n simulationSessionId,\n functionId,\n dataSourceId,\n} from './core/branded-types.js'\n\nexport { paginate } from './core/utils.js'\nexport { buildLastResponse, extractRequestId } from './core/utils.js'\nexport type {\n PaginatedList,\n ListParams,\n LastResponseInfo,\n ResponseMetadata,\n WithResponseMetadata,\n AmigoResponse,\n} from './core/utils.js'\nexport type { AmigoRequestOptions, ScopedRequestOptions } from './core/request-options.js'\nexport type { RetryOptions } from './core/retry.js'\n\nexport { parseRateLimitHeaders } from './core/rate-limit.js'\nexport type { RateLimitInfo } from './core/rate-limit.js'\n\nexport {\n verifyWebhookSignature,\n parseWebhookEvent,\n WebhookVerificationError,\n} from './core/webhooks.js'\nexport type {\n WebhookEvent,\n WebhookVerificationOptions,\n ParseWebhookEventOptions,\n} from './core/webhooks.js'\nexport type {\n ClientHooks,\n RequestHookContext,\n ResponseHookContext,\n ErrorHookContext,\n} from './core/openapi-client.js'\n\nexport type {\n MetricCatalogEntry,\n MetricCatalogResponse,\n MetricListResponse,\n MetricValue,\n NumericalMetricValue,\n CategoricalMetricValue,\n BooleanMetricValue,\n MetricValuesParams,\n MetricTrendParams,\n} from './resources/metrics.js'\n/** @deprecated Use `MetricValue` instead. */\nexport type MetricValueResponse = MetricValueAlias\n\nexport type CallSummary = components['schemas']['CallSummary']\nexport type CallDetail = components['schemas']['CallDetailResponse']\nexport type CallTurn = components['schemas']['Turn']\nexport type CallToolCall = components['schemas']['ToolCall']\nexport type PlaybackTimeline = components['schemas']['PlaybackTimeline']\nexport type TimelineActor = components['schemas']['TimelineActor']\nexport type TimelineLaneDefinition = components['schemas']['TimelineLaneDefinition']\nexport type TimelineSegment = components['schemas']['TimelineSegment']\nexport type TimelineTimebase = components['schemas']['TimelineTimebase']\nexport type TurnTimeline = components['schemas']['TurnTimeline']\nexport type TimelineSegmentType = TimelineSegment['type']\nexport type TimelineLane = TimelineSegment['lane']\nexport type TimelineTrack = NonNullable<TimelineSegment['track']>\nexport type TimelineActorKind = TimelineActor['kind']\nexport type TimelineActorRole = TimelineActor['role']\n\nexport type {\n SubscribeToWorkspaceOptions,\n SubscriptionHandle,\n WorkspaceSSEEvent,\n WorkspaceSSEEventType,\n} from './resources/events.js'\n\nexport { sessionConnectAuthProtocols, textStreamAuthProtocols } from './resources/conversations.js'\nexport type {\n ConversationDetail,\n ConversationListResponse,\n ConversationSummary,\n ConversationTurn,\n CreateConversationRequest,\n ListConversationsParams,\n SessionConnectUrlParams,\n TextStreamAuthProtocols,\n TextStreamUrlParams,\n TurnDoneEvent,\n TurnErrorEvent,\n TurnMessageEvent,\n TurnRequest,\n TurnResponse,\n TurnStreamEvent,\n TurnThinkingEvent,\n TurnTokenEvent,\n TurnToolCallCompletedEvent,\n TurnToolCallStartedEvent,\n} from './resources/conversations.js'\n\n// Device code auth (desktop / CLI login)\nexport {\n loginWithDeviceCode,\n TokenManager,\n FileTokenStorage,\n MemoryTokenStorage,\n DeviceCodeExpiredError,\n DeviceCodeDeniedError,\n RefreshTokenExpiredError,\n LoginCancelledError,\n formatDeviceCodeInstructions,\n formatDeviceCodeLink,\n formatWorkspaceList,\n openBrowser,\n} from './core/device-code.js'\nexport type {\n DeviceCodeIssuance,\n IdentityTokenResponse,\n WorkspaceChoice,\n MultiWorkspaceResponse,\n DeviceCodeLoginOptions,\n DeviceCodeStatus,\n AuthResult,\n StoredCredentials,\n TokenStorage,\n TokenManagerConfig,\n} from './core/device-code.js'\n\n// Generated OpenAPI types \u2014 consumers can import specific schemas\nexport type { paths, components, operations } from './generated/api.js'\n\nfunction withWorkspaceId<Path extends keyof paths & string, Init>(\n path: Path,\n init: Init | undefined,\n workspaceId: string,\n): Init | { params: { path: { workspace_id: string } } } {\n if (!path.includes('{workspace_id}')) {\n return (init ?? {}) as Init\n }\n\n const current = (init ?? {}) as {\n params?: {\n path?: Record<string, unknown>\n }\n }\n\n return {\n ...current,\n params: {\n ...(current.params ?? {}),\n path: {\n ...(current.params?.path ?? {}),\n workspace_id: workspaceId,\n },\n },\n }\n}\n", "/**\n * Error hierarchy for the Amigo Platform SDK.\n * All errors extend AmigoError which can be caught with a single catch.\n */\n\nexport interface ErrorContext {\n statusCode?: number\n errorCode?: string\n requestId?: string\n detail?: string\n context?: Record<string, unknown>\n}\n\nconst SENSITIVE_FIELDS = new Set([\n 'id_token',\n 'access_token',\n 'refresh_token',\n 'authorization',\n 'api_key',\n 'apikey',\n 'token',\n 'secret',\n 'password',\n 'x-api-key',\n 'cookie',\n 'set-cookie',\n])\n\nfunction sanitizeErrorContext(obj: unknown): unknown {\n if (typeof obj !== 'object' || !obj) return obj\n if (Array.isArray(obj)) return obj.map(sanitizeErrorContext)\n\n const result: Record<string, unknown> = {}\n for (const [key, value] of Object.entries(obj as Record<string, unknown>)) {\n if (SENSITIVE_FIELDS.has(key.toLowerCase())) {\n result[key] = '[REDACTED]'\n } else if (typeof value === 'object' && value !== null) {\n result[key] = sanitizeErrorContext(value)\n } else {\n result[key] = value\n }\n }\n return result\n}\n\n/** Base class for all Amigo Platform SDK errors */\nexport class AmigoError extends Error {\n readonly statusCode?: number\n readonly errorCode?: string\n readonly requestId?: string\n readonly detail?: string\n readonly context?: Record<string, unknown>\n\n constructor(message: string, ctx: ErrorContext = {}) {\n super(message)\n this.name = this.constructor.name\n this.statusCode = ctx.statusCode\n this.errorCode = ctx.errorCode\n this.requestId = ctx.requestId\n this.detail = ctx.detail\n this.context = ctx.context\n ? (sanitizeErrorContext(ctx.context) as Record<string, unknown>)\n : undefined\n Object.setPrototypeOf(this, new.target.prototype)\n if (typeof Error.captureStackTrace === 'function') {\n Error.captureStackTrace(this, this.constructor)\n }\n }\n\n toJSON(): Record<string, unknown> {\n return {\n name: this.name,\n message: this.message,\n statusCode: this.statusCode,\n errorCode: this.errorCode,\n requestId: this.requestId,\n detail: this.detail,\n context: this.context,\n stack: this.stack,\n }\n }\n}\n\n/** 400 Bad Request */\nexport class BadRequestError extends AmigoError {\n constructor(message: string, ctx: ErrorContext = {}) {\n super(message, { ...ctx, statusCode: 400 })\n }\n}\n\n/** 401 Unauthorized \u2014 invalid or missing API key */\nexport class AuthenticationError extends AmigoError {\n constructor(message: string, ctx: ErrorContext = {}) {\n super(message, { ...ctx, statusCode: 401 })\n }\n}\n\n/** 403 Forbidden \u2014 insufficient permissions */\nexport class PermissionError extends AmigoError {\n constructor(message: string, ctx: ErrorContext = {}) {\n super(message, { ...ctx, statusCode: 403 })\n }\n}\n\n/** 404 Not Found */\nexport class NotFoundError extends AmigoError {\n constructor(message: string, ctx: ErrorContext = {}) {\n super(message, { ...ctx, statusCode: 404 })\n }\n}\n\n/** 409 Conflict \u2014 duplicate slug or resource version conflict */\nexport class ConflictError extends AmigoError {\n constructor(message: string, ctx: ErrorContext = {}) {\n super(message, { ...ctx, statusCode: 409 })\n }\n}\n\n/** 422 Unprocessable Entity \u2014 validation failure */\nexport class ValidationError extends AmigoError {\n constructor(message: string, ctx: ErrorContext = {}) {\n super(message, { ...ctx, statusCode: 422 })\n }\n}\n\n/** 429 Too Many Requests */\nexport class RateLimitError extends AmigoError {\n readonly retryAfter?: number\n\n constructor(message: string, ctx: ErrorContext & { retryAfter?: number } = {}) {\n super(message, { ...ctx, statusCode: 429 })\n this.retryAfter = ctx.retryAfter\n }\n}\n\n/** 5xx Server Error */\nexport class ServerError extends AmigoError {\n constructor(message: string, ctx: ErrorContext = {}) {\n super(message, { ...ctx, statusCode: ctx.statusCode ?? 500 })\n }\n}\n\n/** 503 Service Unavailable */\nexport class ServiceUnavailableError extends ServerError {\n constructor(message: string, ctx: ErrorContext = {}) {\n super(message, { ...ctx, statusCode: 503 })\n }\n}\n\n/** Network or fetch failure (no HTTP status available) */\nexport class NetworkError extends AmigoError {\n constructor(message: string, cause?: unknown) {\n super(message)\n if (cause !== undefined) {\n Object.defineProperty(this, 'cause', { value: cause, writable: false, enumerable: true })\n }\n }\n}\n\n/** Request timed out before receiving a response */\nexport class RequestTimeoutError extends NetworkError {\n readonly timeoutMs?: number\n\n constructor(message: string, timeoutMs?: number, cause?: unknown) {\n super(message, cause)\n this.timeoutMs = timeoutMs\n }\n}\n\n/** Failed to parse response body */\nexport class ParseError extends AmigoError {\n readonly body?: string\n\n constructor(message: string, body?: string) {\n super(message)\n this.body = body\n }\n}\n\n/** SDK misconfiguration */\nexport class ConfigurationError extends AmigoError {\n constructor(message: string) {\n super(message)\n }\n}\n\n// --- Factory ---\n\ninterface ApiErrorBody {\n message?: string\n detail?: string\n error_code?: string\n request_id?: string\n}\n\nexport async function createApiError(response: Response): Promise<AmigoError> {\n let body: ApiErrorBody = {}\n try {\n const rawBody = await response.text()\n body = JSON.parse(rawBody) as ApiErrorBody\n } catch {\n // ignore parse failure\n }\n\n const ctx: ErrorContext = {\n statusCode: response.status,\n errorCode: body.error_code,\n requestId: body.request_id ?? response.headers.get('x-request-id') ?? undefined,\n detail: body.detail,\n context: { url: response.url, response: body },\n }\n const message = body.message ?? body.detail ?? response.statusText ?? `HTTP ${response.status}`\n\n switch (response.status) {\n case 400:\n return new BadRequestError(message, ctx)\n case 401:\n return new AuthenticationError(message, ctx)\n case 403:\n return new PermissionError(message, ctx)\n case 404:\n return new NotFoundError(message, ctx)\n case 409:\n return new ConflictError(message, ctx)\n case 422:\n return new ValidationError(message, ctx)\n case 429: {\n const retryAfter = parseRetryAfter(response)\n return new RateLimitError(message, { ...ctx, retryAfter })\n }\n case 503:\n return new ServiceUnavailableError(message, ctx)\n default:\n return new ServerError(message, ctx)\n }\n}\n\nfunction parseRetryAfter(response: Response): number | undefined {\n const header = response.headers.get('Retry-After')\n if (!header) return undefined\n const seconds = Number(header)\n if (!isNaN(seconds)) return seconds\n const date = new Date(header)\n if (!isNaN(date.getTime())) {\n return Math.max(0, Math.ceil((date.getTime() - Date.now()) / 1000))\n }\n return undefined\n}\n\n// --- Type guards ---\n\nexport function isAmigoError(err: unknown): err is AmigoError {\n return err instanceof AmigoError\n}\n\nexport function isNotFoundError(err: unknown): err is NotFoundError {\n return err instanceof NotFoundError\n}\n\nexport function isRateLimitError(err: unknown): err is RateLimitError {\n return err instanceof RateLimitError\n}\n\nexport function isAuthenticationError(err: unknown): err is AuthenticationError {\n return err instanceof AuthenticationError\n}\n\nexport function isRequestTimeoutError(err: unknown): err is RequestTimeoutError {\n return err instanceof RequestTimeoutError\n}\n", "/**\n * Creates a configured openapi-fetch client with auth, error handling,\n * and retry middleware.\n *\n * Supports custom `fetch` for BFF proxy patterns (e.g., developer-console\n * routing through Next.js API routes).\n */\n\nimport createClientImport, { type HeadersOptions, type Middleware } from 'openapi-fetch'\nimport type { paths } from '../generated/api.js'\nimport { createAuthMiddleware } from './auth.js'\nimport { createApiError, ConfigurationError, NetworkError, RequestTimeoutError } from './errors.js'\nimport { parseRateLimitHeaders } from './rate-limit.js'\nimport {\n stripRequestControls,\n type AmigoRequestOptions,\n type RequestControlOptions,\n} from './request-options.js'\nimport { shouldRetry, computeDelay, resolveRetryOptions, type RetryOptions } from './retry.js'\nimport { extractRequestId } from './utils.js'\n\n// Handle ESM/CJS interop for openapi-fetch (esbuild __toESM wrapper)\nconst createClient: typeof createClientImport =\n typeof createClientImport === 'function'\n ? createClientImport\n : (createClientImport as unknown as { default: typeof createClientImport }).default\n\nexport type PlatformFetch = ReturnType<typeof createClient<paths>>\n\nexport interface RequestHookContext {\n id: string\n request: Request\n schemaPath: string\n}\n\nexport interface ResponseHookContext extends RequestHookContext {\n response: Response\n requestId: string | null\n rateLimit: ReturnType<typeof parseRateLimitHeaders>\n}\n\nexport interface ErrorHookContext extends RequestHookContext {\n error: unknown\n}\n\nexport interface ClientHooks {\n onRequest?: (context: RequestHookContext) => void | Promise<void>\n onResponse?: (context: ResponseHookContext) => void | Promise<void>\n onError?: (context: ErrorHookContext) => void | Promise<void>\n}\n\nexport interface ClientConfig {\n apiKey: string\n baseUrl: string\n retry?: RetryOptions\n maxRetries?: number\n timeout?: number\n headers?: HeadersOptions\n hooks?: ClientHooks\n /** Custom fetch implementation \u2014 use for BFF proxy routing or test mocking. */\n fetch?: typeof globalThis.fetch\n}\n\ntype RequestTransport = (input: Request) => Promise<Response>\n\ninterface PlatformClientContext {\n transport: RequestTransport\n defaults: RequestControlOptions\n baseUrl: string\n}\n\nconst platformClientContext = new WeakMap<PlatformFetch, PlatformClientContext>()\n\nexport function createPlatformClient(config: ClientConfig): PlatformFetch {\n const transport = toRequestTransport(config.fetch ?? globalThis.fetch)\n const defaults = {\n retry: config.retry,\n maxRetries: config.maxRetries,\n timeout: config.timeout,\n } satisfies RequestControlOptions\n\n const client = createClient<paths>({\n baseUrl: config.baseUrl,\n fetch: createRetryingFetch(transport, defaults),\n headers: config.headers,\n })\n\n platformClientContext.set(client, { transport, defaults, baseUrl: config.baseUrl })\n\n // Error middleware \u2014 convert HTTP errors to typed AmigoError subclasses\n const errorMiddleware: Middleware = {\n async onResponse({ response }) {\n if (!response.ok) {\n throw await createApiError(response)\n }\n return response\n },\n }\n\n // Auth middleware \u2014 attach Bearer token\n const authMiddleware = createAuthMiddleware({ apiKey: config.apiKey })\n const hookMiddleware: Middleware | undefined = config.hooks\n ? {\n async onRequest({ request, schemaPath, id }) {\n await config.hooks?.onRequest?.({ request, schemaPath, id })\n return request\n },\n async onResponse({ request, response, schemaPath, id }) {\n await config.hooks?.onResponse?.({\n id,\n request,\n response,\n schemaPath,\n requestId: extractRequestId(response),\n rateLimit: parseRateLimitHeaders(response.headers),\n })\n return response\n },\n async onError({ request, error, schemaPath, id }) {\n await config.hooks?.onError?.({ id, request, error, schemaPath })\n },\n }\n : undefined\n\n // Order: auth first (adds header), then error (converts failures)\n client.use(authMiddleware)\n client.use(errorMiddleware)\n if (hookMiddleware) {\n client.use(hookMiddleware)\n }\n\n return client\n}\n\nexport function applyPlatformRequestOptions<Operation>(\n client: PlatformFetch,\n init: AmigoRequestOptions<Operation> | undefined,\n): AmigoRequestOptions<Operation> | undefined {\n if (!init) {\n return undefined\n }\n\n const context = platformClientContext.get(client)\n const stripped = stripRequestControls(init)\n\n if (!context) {\n return stripped as AmigoRequestOptions<Operation> | undefined\n }\n\n const overrideFetch = stripped?.fetch\n const hasControlOverride =\n overrideFetch !== undefined ||\n init.timeout !== undefined ||\n init.maxRetries !== undefined ||\n init.retry !== undefined\n\n if (!hasControlOverride) {\n return stripped as AmigoRequestOptions<Operation> | undefined\n }\n\n const transport = toRequestTransport(\n (overrideFetch ?? context.transport) as typeof globalThis.fetch,\n )\n const fetch = createRetryingFetch(transport, {\n timeout: init.timeout ?? context.defaults.timeout,\n maxRetries: init.maxRetries ?? context.defaults.maxRetries,\n retry: init.retry ?? context.defaults.retry,\n })\n\n return {\n ...stripped,\n fetch,\n } as AmigoRequestOptions<Operation>\n}\n\n/** @internal */\nexport function getPlatformClientBaseUrl(client: PlatformFetch): string {\n const context = platformClientContext.get(client)\n if (!context) {\n throw new ConfigurationError('Platform client baseUrl is unavailable')\n }\n return context.baseUrl\n}\n\nfunction createRetryingFetch(\n transport: RequestTransport,\n defaults: RequestControlOptions,\n): typeof globalThis.fetch {\n return async (input, init) => {\n const baseRequest = input instanceof Request ? input : new Request(input, init)\n const method = baseRequest.method.toUpperCase()\n const retryOpts = resolveRetryOptions(defaults.retry, defaults.maxRetries)\n const timeoutMs = defaults.timeout\n const isIdempotent = method === 'GET' || method === 'HEAD' || method === 'OPTIONS'\n\n for (let attempt = 0; attempt < retryOpts.maxAttempts; attempt++) {\n let response: Response | undefined\n let error: unknown\n let timedOut = false\n\n try {\n const prepared = prepareRequestForAttempt(baseRequest, timeoutMs)\n\n try {\n response = await transport(prepared.request)\n } finally {\n timedOut = prepared.timedOut\n prepared.cleanup()\n }\n } catch (err) {\n error = err\n }\n\n if (!error && response && response.ok) return response\n\n const ctx = { method, attempt, response: response!, options: retryOpts }\n const attemptsRemain = attempt + 1 < retryOpts.maxAttempts\n\n if (error) {\n if (timedOut) {\n throw new RequestTimeoutError(`Request timed out after ${timeoutMs}ms`, timeoutMs, error)\n }\n if (isIdempotent && attemptsRemain) {\n await sleep(computeDelay(attempt, new Response(), retryOpts))\n continue\n }\n throw new NetworkError(\n `Network error: ${error instanceof Error ? error.message : String(error)}`,\n error,\n )\n }\n\n if (response && attemptsRemain && shouldRetry(ctx)) {\n const delay = computeDelay(attempt, response, retryOpts)\n if (baseRequest.signal.aborted) return response\n await sleep(delay)\n continue\n }\n\n return response!\n }\n\n throw new NetworkError('Retry loop exhausted')\n }\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms))\n}\n\nfunction toRequestTransport(fetcher: typeof globalThis.fetch | RequestTransport): RequestTransport {\n return async (input) => fetcher(input)\n}\n\nfunction prepareRequestForAttempt(\n request: Request,\n timeoutMs?: number,\n): {\n request: Request\n readonly timedOut: boolean\n cleanup: () => void\n} {\n const attemptRequest = request.clone()\n const timeout = createTimeoutSignal(attemptRequest.signal, timeoutMs)\n\n if (!timeout.signal) {\n return {\n request: attemptRequest,\n timedOut: false,\n cleanup: timeout.cleanup,\n }\n }\n\n return {\n request: new Request(attemptRequest, { signal: timeout.signal }),\n get timedOut() {\n return timeout.didTimeout\n },\n cleanup: timeout.cleanup,\n }\n}\n\nfunction createTimeoutSignal(\n upstream: AbortSignal | null,\n timeoutMs?: number,\n): {\n signal?: AbortSignal\n didTimeout: boolean\n cleanup: () => void\n} {\n if (!timeoutMs || !Number.isFinite(timeoutMs) || timeoutMs <= 0) {\n return {\n signal: upstream ?? undefined,\n didTimeout: false,\n cleanup: () => {},\n }\n }\n\n const controller = new AbortController()\n let didTimeout = false\n const cleanups: Array<() => void> = []\n\n const onAbort = () => controller.abort(upstream?.reason)\n if (upstream) {\n if (upstream.aborted) {\n controller.abort(upstream.reason)\n } else {\n upstream.addEventListener('abort', onAbort, { once: true })\n cleanups.push(() => upstream.removeEventListener('abort', onAbort))\n }\n }\n\n const timer = setTimeout(() => {\n didTimeout = true\n controller.abort()\n }, timeoutMs)\n cleanups.push(() => clearTimeout(timer))\n\n return {\n signal: controller.signal,\n get didTimeout() {\n return didTimeout\n },\n cleanup: () => {\n for (const cleanup of cleanups) {\n cleanup()\n }\n },\n }\n}\n", "/**\n * Auth middleware for the Amigo Platform SDK.\n *\n * The platform-api accepts Bearer tokens in two forms:\n * 1. RS256 JWT issued by the Identity service\n * 2. Legacy API keys (created via POST /v1/{workspace_id}/api-keys)\n *\n * This SDK accepts an API key string and attaches it directly as\n * `Authorization: Bearer {apiKey}`. No token exchange is required.\n */\n\nimport type { Middleware } from 'openapi-fetch'\nimport { AuthenticationError } from './errors.js'\n\nexport interface AuthConfig {\n apiKey: string\n}\n\n/**\n * Creates openapi-fetch middleware that attaches the Bearer token\n * to every outgoing request and converts 401 responses to AuthenticationError.\n */\nexport function createAuthMiddleware(config: AuthConfig): Middleware {\n return {\n async onRequest({ request }) {\n request.headers.set('Authorization', `Bearer ${config.apiKey}`)\n return request\n },\n\n async onResponse({ response }) {\n if (response.status === 401) {\n throw new AuthenticationError('Invalid or expired API key. Check your credentials.', {\n statusCode: 401,\n })\n }\n return response\n },\n }\n}\n", "export interface RateLimitInfo {\n limit: number | null\n remaining: number | null\n reset: Date | null\n retryAfter: number | null\n}\n\nexport function parseRateLimitHeaders(headers: Headers): RateLimitInfo {\n const limit = headers.get('x-ratelimit-limit')\n const remaining = headers.get('x-ratelimit-remaining')\n const reset = headers.get('x-ratelimit-reset')\n const retryAfter = headers.get('retry-after')\n\n return {\n limit: limit ? parseInt(limit, 10) : null,\n remaining: remaining ? parseInt(remaining, 10) : null,\n reset: reset ? new Date(parseInt(reset, 10) * 1000) : null,\n retryAfter: retryAfter ? parseInt(retryAfter, 10) : null,\n }\n}\n", "import type { FetchOptions, HeadersOptions } from 'openapi-fetch'\nimport type { paths } from '../generated/api.js'\nimport type { RetryOptions } from './retry.js'\n\nexport type OperationFor<\n Path extends keyof paths & string,\n Method extends keyof paths[Path] & string,\n> = paths[Path][Method]\n\ntype OptionalizeWorkspacePath<PathParams> = PathParams extends { workspace_id: infer WorkspaceId }\n ? Omit<PathParams, 'workspace_id'> & { workspace_id?: WorkspaceId }\n : PathParams\n\ntype EmptyShape = Record<never, never>\n\ntype RewriteParams<Options> = Options extends { params: infer Params }\n ? RewriteParamShape<Params> extends infer RewrittenParams\n ? RewrittenParams extends object\n ? RequiredKeysOf<RewrittenParams> extends never\n ? Omit<Options, 'params'> & { params?: RewrittenParams }\n : Omit<Options, 'params'> & { params: RewrittenParams }\n : Omit<Options, 'params'> & { params: RewrittenParams }\n : Options\n : Options extends { params?: infer Params }\n ? Omit<Options, 'params'> & { params?: RewriteParamShape<Params> }\n : Options\n\ntype RewriteParamShape<Params> = Params extends object\n ? Omit<Params, 'path'> & RewritePathParam<Params>\n : Params\n\ntype RewritePathParam<Params> = Params extends { path: infer PathParams }\n ? OptionalizeWorkspacePath<PathParams> extends infer RewrittenPath\n ? RewrittenPath extends object\n ? RequiredKeysOf<RewrittenPath> extends never\n ? { path?: RewrittenPath }\n : { path: RewrittenPath }\n : { path: RewrittenPath }\n : EmptyShape\n : EmptyShape\n\ntype RequiredKeysOf<T extends object> = Exclude<\n {\n [K in keyof T]-?: EmptyShape extends Pick<T, K> ? never : K\n }[keyof T],\n undefined\n>\n\nexport type InitParam<Init extends object> =\n RequiredKeysOf<Init> extends never ? [init?: Init] : [init: Init]\n\nexport type AmigoRequestOptions<Operation = unknown> = Omit<\n RewriteParams<FetchOptions<Operation>>,\n 'timeout' | 'maxRetries' | 'retry'\n> & {\n timeout?: number\n maxRetries?: number\n retry?: RetryOptions\n}\n\nexport type ScopedRequestOptions = Omit<RequestInit, 'body' | 'headers' | 'method'> & {\n headers?: HeadersOptions\n timeout?: number\n maxRetries?: number\n retry?: RetryOptions\n}\n\nexport interface RequestControlOptions {\n timeout?: number\n maxRetries?: number\n retry?: RetryOptions\n}\n\ntype MergeableRequestOptions = object & {\n headers?: HeadersOptions\n signal?: AbortSignal | null\n timeout?: number\n maxRetries?: number\n retry?: RetryOptions\n}\n\nexport function stripRequestControls<Options extends RequestControlOptions>(\n options: Options | undefined,\n): Omit<Options, keyof RequestControlOptions> | undefined {\n if (!options) {\n return undefined\n }\n\n const rest = { ...options } as Partial<Options & RequestControlOptions>\n delete rest.timeout\n delete rest.maxRetries\n delete rest.retry\n return rest as Omit<Options, keyof RequestControlOptions>\n}\n\nexport function mergeRequestOptions<Options extends object>(\n base: ScopedRequestOptions | undefined,\n override: Options | undefined,\n): (Options & MergeableRequestOptions) | undefined {\n if (!base) {\n return override as (Options & MergeableRequestOptions) | undefined\n }\n\n if (!override) {\n return base as Options & MergeableRequestOptions\n }\n\n const mergeableOverride = override as Options & Partial<MergeableRequestOptions>\n\n return {\n ...base,\n ...override,\n headers: mergeHeaders(base.headers, mergeableOverride.headers),\n signal: mergeableOverride.signal ?? base.signal,\n timeout: mergeableOverride.timeout ?? base.timeout,\n maxRetries: mergeableOverride.maxRetries ?? base.maxRetries,\n retry: mergeableOverride.retry ?? base.retry,\n } as Options & MergeableRequestOptions\n}\n\nexport function mergeScopedRequestOptions(\n base: ScopedRequestOptions | undefined,\n override: ScopedRequestOptions,\n): ScopedRequestOptions {\n return mergeRequestOptions(base, override) ?? override\n}\n\nexport function mergeHeaders(\n base: HeadersOptions | undefined,\n override: HeadersOptions | undefined,\n): Headers | undefined {\n if (!base && !override) {\n return undefined\n }\n\n const headers = new Headers()\n let hasEntries = false\n\n applyHeaders(headers, base, () => {\n hasEntries = true\n })\n applyHeaders(headers, override, () => {\n hasEntries = true\n })\n\n return hasEntries ? headers : undefined\n}\n\nfunction applyHeaders(\n target: Headers,\n source: HeadersOptions | undefined,\n onSet: () => void,\n): void {\n if (!source) {\n return\n }\n\n if (source instanceof Headers) {\n source.forEach((value, key) => {\n target.set(key, value)\n onSet()\n })\n return\n }\n\n if (Array.isArray(source)) {\n for (const [key, value] of source) {\n if (!key) {\n continue\n }\n\n if (value === null || value === undefined) {\n target.delete(key)\n continue\n }\n\n target.set(key, String(value))\n onSet()\n }\n return\n }\n\n for (const [key, value] of Object.entries(source)) {\n if (value === null || value === undefined) {\n target.delete(key)\n continue\n }\n\n target.set(\n key,\n Array.isArray(value) ? value.map((item) => String(item)).join(', ') : String(value),\n )\n onSet()\n }\n}\n", "/**\n * Exponential backoff with full jitter and Retry-After header support.\n */\n\nexport interface RetryOptions {\n /** Maximum number of attempts (including the first). Default: 3 */\n maxAttempts?: number\n /** Base delay in milliseconds. Default: 250 */\n baseDelayMs?: number\n /** Maximum delay cap in milliseconds. Default: 30_000 */\n maxDelayMs?: number\n}\n\nconst RETRYABLE_STATUS_CODES = new Set([408, 429, 500, 502, 503, 504])\n// POST is only retried on 429 with a Retry-After header (idempotency concern)\nconst POST_RETRYABLE_STATUS_CODES = new Set([429])\nlet jitterCounter = 0\ntype CryptoLike = {\n getRandomValues<T extends Uint32Array>(array: T): T\n}\n\nexport interface RetryContext {\n method: string\n attempt: number\n response: Response\n options: Required<RetryOptions>\n}\n\nexport function shouldRetry(ctx: RetryContext): boolean {\n const { method, attempt, response, options } = ctx\n if (attempt >= options.maxAttempts) return false\n\n const status = response.status\n if (method === 'GET' || method === 'HEAD') {\n return RETRYABLE_STATUS_CODES.has(status)\n }\n if (method === 'POST' && POST_RETRYABLE_STATUS_CODES.has(status)) {\n return response.headers.has('Retry-After')\n }\n return false\n}\n\nexport function computeDelay(\n attempt: number,\n response: Response,\n options: Required<RetryOptions>,\n): number {\n const retryAfterHeader = response.headers.get('Retry-After')\n if (retryAfterHeader) {\n const seconds = parseRetryAfterHeader(retryAfterHeader)\n if (seconds !== undefined) return seconds * 1000\n }\n\n // Exponential backoff with full jitter: random value in [0, min(maxDelay, base * 2^attempt)]\n const exponential = Math.min(options.maxDelayMs, options.baseDelayMs * Math.pow(2, attempt))\n return jitterFraction() * exponential\n}\n\nfunction parseRetryAfterHeader(header: string): number | undefined {\n const seconds = Number(header)\n if (!isNaN(seconds)) return seconds\n const date = new Date(header)\n if (!isNaN(date.getTime())) {\n return Math.max(0, Math.ceil((date.getTime() - Date.now()) / 1000))\n }\n return undefined\n}\n\nexport function resolveRetryOptions(\n opts?: RetryOptions,\n maxRetries?: number,\n): Required<RetryOptions> {\n const maxAttempts =\n typeof maxRetries === 'number' && Number.isFinite(maxRetries)\n ? Math.max(1, Math.floor(maxRetries) + 1)\n : (opts?.maxAttempts ?? 3)\n\n return {\n maxAttempts,\n baseDelayMs: opts?.baseDelayMs ?? 250,\n maxDelayMs: opts?.maxDelayMs ?? 30_000,\n }\n}\n\nfunction jitterFraction(): number {\n const cryptoApi = getCryptoApi()\n if (cryptoApi) {\n const value = new Uint32Array(1)\n cryptoApi.getRandomValues(value)\n return (value[0] ?? 0) / 0x1_0000_0000\n }\n\n // Retry jitter is not a security primitive, but we still want a stable\n // spread for runtimes that do not expose Web Crypto.\n jitterCounter = (jitterCounter + 1) >>> 0\n const mixed = mixUint32((Date.now() ^ Math.imul(jitterCounter, 0x9e37_79b9)) >>> 0)\n return mixed / 0x1_0000_0000\n}\n\nfunction getCryptoApi(): CryptoLike | undefined {\n const cryptoApi = globalThis.crypto as CryptoLike | undefined\n if (cryptoApi && typeof cryptoApi.getRandomValues === 'function') {\n return cryptoApi\n }\n\n return undefined\n}\n\nfunction mixUint32(value: number): number {\n let mixed = (value ^ (value >>> 16)) >>> 0\n mixed = Math.imul(mixed, 0x7feb_352d) >>> 0\n mixed = (mixed ^ (mixed >>> 15)) >>> 0\n mixed = Math.imul(mixed, 0x846c_a68b) >>> 0\n return (mixed ^ (mixed >>> 16)) >>> 0\n}\n", "/**\n * Shared utilities: response extraction and pagination helpers.\n */\n\nimport { ParseError } from './errors.js'\nimport { parseRateLimitHeaders, type RateLimitInfo } from './rate-limit.js'\n\nexport interface LastResponseInfo {\n requestId: string | null\n statusCode: number\n headers: Headers\n rateLimit: RateLimitInfo\n}\n\nexport interface ResponseMetadata {\n _request_id: string | null\n lastResponse: LastResponseInfo\n}\n\nexport interface AmigoResponse<T> {\n data: WithResponseMetadata<T>\n response: Response\n requestId: string | null\n rateLimit: RateLimitInfo\n}\n\nexport type WithResponseMetadata<T> = T extends object ? T & ResponseMetadata : T\n\nexport function extractRequestId(response: Response): string | null {\n return response.headers.get('x-request-id')\n}\n\nexport function buildLastResponse(response: Response): LastResponseInfo {\n return {\n requestId: extractRequestId(response),\n statusCode: response.status,\n headers: response.headers,\n rateLimit: parseRateLimitHeaders(response.headers),\n }\n}\n\ninterface OpenApiResult<T> {\n data?: T\n error?: unknown\n response?: Response\n}\n\ninterface ExtractDataOptions {\n allowEmptyBody?: boolean\n}\n\n/**\n * Extracts the data payload from an openapi-fetch response.\n * Empty-body success responses return undefined; other empty responses throw.\n */\nexport function extractData<T>(\n result: OpenApiResult<T>,\n options: ExtractDataOptions = {},\n): WithResponseMetadata<T> {\n if (result.data !== undefined) {\n return attachResponseMetadata(result.data, result.response) as WithResponseMetadata<T>\n }\n\n if (isEmptyBodySuccess(result.response) || options.allowEmptyBody) {\n return undefined as WithResponseMetadata<T>\n }\n\n // Degenerate openapi-fetch results with both data and error keep the SDK's\n // original data-first behavior; without data, errors stay fatal.\n if (result.error !== undefined) {\n throw new ParseError('Unexpected error response from API', JSON.stringify(result.error))\n }\n\n throw new ParseError(\n 'Unexpected empty response from API',\n result.response ? `status=${result.response.status}` : undefined,\n )\n}\n\nexport function withResponse<T>(\n result: OpenApiResult<T> & { response: Response },\n options: ExtractDataOptions = {},\n): AmigoResponse<T> {\n const data = extractData(result, options)\n const lastResponse = buildLastResponse(result.response)\n\n return {\n data,\n response: result.response,\n requestId: lastResponse.requestId,\n rateLimit: lastResponse.rateLimit,\n }\n}\n\n/**\n * Standard paginated list response shape.\n */\nexport interface PaginatedList<T> {\n items: T[]\n has_more: boolean\n continuation_token: number | null\n}\n\n/**\n * Standard query params for paginated list endpoints.\n */\nexport interface ListParams {\n /** Max items per page. Default varies by endpoint. */\n limit?: number\n /** Opaque token from previous response for next page. */\n continuation_token?: number\n}\n\n/**\n * Async iterator that auto-paginates through all pages.\n * Yields one item at a time.\n *\n * @example\n * for await (const agent of paginate((token) => client.agents.list({ continuation_token: token }))) {\n * console.log(agent)\n * }\n */\nexport async function* paginate<T>(\n fetcher: (continuationToken?: number) => Promise<PaginatedList<T>>,\n): AsyncGenerator<T> {\n let token: number | undefined = undefined\n while (true) {\n const page = await fetcher(token)\n for (const item of page.items) {\n yield item\n }\n if (!page.has_more || page.continuation_token === null) break\n token = page.continuation_token\n }\n}\n\nfunction attachResponseMetadata<T>(data: T, response?: Response): WithResponseMetadata<T> {\n if (!response || typeof data !== 'object' || data === null) {\n return data as WithResponseMetadata<T>\n }\n\n const target = data as T & Partial<ResponseMetadata>\n const lastResponse = buildLastResponse(response)\n\n defineHiddenMetadata(target, '_request_id', lastResponse.requestId)\n defineHiddenMetadata(target, 'lastResponse', lastResponse)\n\n return target as WithResponseMetadata<T>\n}\n\nfunction isEmptyBodySuccess(response?: Response): boolean {\n return response?.status === 204 || response?.status === 205\n}\n\nfunction defineHiddenMetadata<T extends object, K extends keyof ResponseMetadata>(\n target: T,\n key: K,\n value: ResponseMetadata[K],\n): void {\n try {\n Object.defineProperty(target, key, {\n value,\n enumerable: false,\n configurable: true,\n writable: false,\n })\n } catch {\n // Ignore non-extensible return values.\n }\n}\n", "/**\n * Base class for workspace-scoped resources.\n *\n * Uses the openapi-fetch client (with auth + error + retry middleware)\n * injected from AmigoClient. Resources call typed HTTP methods that\n * flow through the middleware chain automatically.\n */\n\nimport type { Middleware } from 'openapi-fetch'\nimport {\n applyPlatformRequestOptions,\n getPlatformClientBaseUrl,\n type PlatformFetch,\n} from '../core/openapi-client.js'\nimport {\n mergeRequestOptions,\n mergeScopedRequestOptions,\n type ScopedRequestOptions,\n} from '../core/request-options.js'\nimport { extractData } from '../core/utils.js'\n\nconst scopedClientState = new WeakMap<\n PlatformFetch,\n { baseClient: PlatformFetch; options: ScopedRequestOptions }\n>()\n\nexport abstract class WorkspaceScopedResource {\n constructor(\n protected readonly client: PlatformFetch,\n protected readonly workspaceId: string,\n ) {}\n\n protected get platformBaseUrl(): string {\n const { baseClient } = resolveScopedPlatformClient(this.client)\n return getPlatformClientBaseUrl(baseClient)\n }\n\n withOptions(options: ScopedRequestOptions): this {\n const ResourceCtor = this.constructor as new (\n client: PlatformFetch,\n workspaceId: string,\n ) => this\n return new ResourceCtor(scopePlatformClient(this.client, options), this.workspaceId)\n }\n\n protected async *iteratePaginatedList<\n TPage extends {\n items?: readonly unknown[]\n has_more?: boolean\n continuation_token?: number | null\n },\n TParams,\n >(\n fetchPage: (params: TParams) => Promise<TPage>,\n params: TParams,\n ): AsyncGenerator<TPage extends { items?: readonly (infer TItem)[] } ? TItem : never> {\n type Item = TPage extends { items?: readonly (infer TItem)[] } ? TItem : never\n let nextParams = params\n\n while (true) {\n const page = await fetchPage(nextParams)\n\n for (const item of page.items ?? []) {\n yield item as Item\n }\n\n if (\n !page.has_more ||\n page.continuation_token === null ||\n page.continuation_token === undefined\n ) {\n break\n }\n\n nextParams = {\n ...(nextParams as object | undefined),\n continuation_token: page.continuation_token,\n } as TParams\n }\n }\n\n protected async *iterateOffsetPaginatedList<\n TPage extends { has_more?: boolean; next_offset?: number | null },\n TItem,\n TParams,\n >(\n fetchPage: (params: TParams) => Promise<TPage>,\n selectItems: (page: TPage) => readonly TItem[],\n params: TParams,\n ): AsyncGenerator<TItem> {\n let nextParams = params\n\n while (true) {\n const page = await fetchPage(nextParams)\n\n for (const item of selectItems(page)) {\n yield item\n }\n\n if (!page.has_more || page.next_offset === null || page.next_offset === undefined) {\n break\n }\n\n nextParams = { ...(nextParams as object | undefined), offset: page.next_offset } as TParams\n }\n }\n}\n\nexport function scopePlatformClient(\n client: PlatformFetch,\n options: ScopedRequestOptions,\n): PlatformFetch {\n const { baseClient, options: existingOptions } = resolveScopedPlatformClient(client)\n const mergedOptions = mergeScopedRequestOptions(existingOptions, options)\n\n const scopedClient = {\n request: (method: string, path: string, init?: object) =>\n baseClient.request(\n method as never,\n path as never,\n applyPlatformRequestOptions(\n baseClient,\n mergeRequestOptions(mergedOptions, init as never),\n ) as never,\n ),\n GET: (path: string, init?: object) =>\n baseClient.GET(\n path as never,\n applyPlatformRequestOptions(\n baseClient,\n mergeRequestOptions(mergedOptions, init as never),\n ) as never,\n ),\n PUT: (path: string, init?: object) =>\n baseClient.PUT(\n path as never,\n applyPlatformRequestOptions(\n baseClient,\n mergeRequestOptions(mergedOptions, init as never),\n ) as never,\n ),\n POST: (path: string, init?: object) =>\n baseClient.POST(\n path as never,\n applyPlatformRequestOptions(\n baseClient,\n mergeRequestOptions(mergedOptions, init as never),\n ) as never,\n ),\n DELETE: (path: string, init?: object) =>\n baseClient.DELETE(\n path as never,\n applyPlatformRequestOptions(\n baseClient,\n mergeRequestOptions(mergedOptions, init as never),\n ) as never,\n ),\n OPTIONS: (path: string, init?: object) =>\n baseClient.OPTIONS(\n path as never,\n applyPlatformRequestOptions(\n baseClient,\n mergeRequestOptions(mergedOptions, init as never),\n ) as never,\n ),\n HEAD: (path: string, init?: object) =>\n baseClient.HEAD(\n path as never,\n applyPlatformRequestOptions(\n baseClient,\n mergeRequestOptions(mergedOptions, init as never),\n ) as never,\n ),\n PATCH: (path: string, init?: object) =>\n baseClient.PATCH(\n path as never,\n applyPlatformRequestOptions(\n baseClient,\n mergeRequestOptions(mergedOptions, init as never),\n ) as never,\n ),\n TRACE: (path: string, init?: object) =>\n baseClient.TRACE(\n path as never,\n applyPlatformRequestOptions(\n baseClient,\n mergeRequestOptions(mergedOptions, init as never),\n ) as never,\n ),\n use: (...middleware: Middleware[]) => baseClient.use(...middleware),\n eject: (...middleware: Middleware[]) => baseClient.eject(...middleware),\n } as PlatformFetch\n\n scopedClientState.set(scopedClient, { baseClient, options: mergedOptions })\n return scopedClient\n}\n\nexport function resolveScopedPlatformClient(client: PlatformFetch): {\n baseClient: PlatformFetch\n options: ScopedRequestOptions | undefined\n} {\n const existing = scopedClientState.get(client)\n return {\n baseClient: existing?.baseClient ?? client,\n options: existing?.options,\n }\n}\n\nexport { extractData }\n", "import type { components } from '../generated/api.js'\nimport type { WorkspaceId } from '../core/branded-types.js'\nimport { WorkspaceScopedResource, extractData } from './base.js'\nimport type { ListParams } from '../core/utils.js'\n\n/**\n * Manage Amigo Platform workspaces.\n * Workspaces are the top-level tenancy boundary for all resources.\n *\n * Note: list operates at account level (/v1/workspaces); creation goes\n * through the authenticated self-service flow. The unauthenticated\n * ``POST /v1/workspaces`` was removed in platform-api PR #2378 (orphan-\n * maker). Get/update/archive/provision operate on a specific workspace.\n */\nexport class WorkspacesResource extends WorkspaceScopedResource {\n /** Create a workspace for the authenticated user and attach owner access */\n async createSelfService(body: components['schemas']['CreateWorkspaceRequest']) {\n return extractData(\n await this.client.POST('/v1/workspaces/self-service', {\n body,\n }),\n )\n }\n\n /** List workspaces accessible to the current API key */\n async list(params?: ListParams) {\n return extractData(\n await this.client.GET('/v1/workspaces', {\n params: { query: params },\n }),\n )\n }\n\n listAutoPaging(params?: ListParams) {\n return this.iteratePaginatedList((pageParams) => this.list(pageParams), params)\n }\n\n /** Get a single workspace by ID */\n async get(id?: WorkspaceId | string) {\n return extractData(\n await this.client.GET('/v1/workspaces/{workspace_id}', {\n params: { path: { workspace_id: id ?? this.workspaceId } },\n }),\n )\n }\n\n /** Update workspace metadata */\n async update(body: components['schemas']['UpdateWorkspaceRequest'], id?: WorkspaceId | string) {\n return extractData(\n await this.client.PATCH('/v1/workspaces/{workspace_id}', {\n params: { path: { workspace_id: id ?? this.workspaceId } },\n body,\n }),\n )\n }\n\n /** Archive (soft-delete) a workspace */\n async archive(body: components['schemas']['ArchiveWorkspaceRequest'], id?: WorkspaceId | string) {\n return extractData(\n await this.client.POST('/v1/workspaces/{workspace_id}/archive', {\n params: { path: { workspace_id: id ?? this.workspaceId } },\n body,\n }),\n )\n }\n\n /** Provision a workspace (seed integrations, mark as provisioned) */\n async provision(id?: WorkspaceId | string) {\n return extractData(\n await this.client.POST('/v1/workspaces/{workspace_id}/provision', {\n params: { path: { workspace_id: id ?? this.workspaceId } },\n }),\n )\n }\n\n /** Pre-check environment conversion warnings */\n async checkEnvironment(target?: 'production' | 'staging', id?: WorkspaceId | string) {\n return extractData(\n await this.client.GET('/v1/workspaces/{workspace_id}/environment-check', {\n params: {\n path: { workspace_id: id ?? this.workspaceId },\n query: target ? { target } : undefined,\n },\n }),\n )\n }\n\n /** Convert workspace between staging and production */\n async convertEnvironment(\n body: components['schemas']['ConvertEnvironmentRequest'],\n id?: WorkspaceId | string,\n ) {\n return extractData(\n await this.client.POST('/v1/workspaces/{workspace_id}/convert-environment', {\n params: { path: { workspace_id: id ?? this.workspaceId } },\n body,\n }),\n )\n }\n}\n", "import type { components } from '../generated/api.js'\nimport type { ApiKeyId } from '../core/branded-types.js'\nimport { WorkspaceScopedResource, extractData } from './base.js'\nimport type { ListParams } from '../core/utils.js'\n\n/**\n * Manage API keys for a workspace.\n *\n * API keys are used to authenticate SDK/API requests. Each key has a role\n * and a set of permissions. Keys expire after 1-90 days.\n */\nexport class ApiKeysResource extends WorkspaceScopedResource {\n /**\n * Get info about the currently authenticated API key.\n * Does not require a workspace ID in the path.\n */\n async me() {\n return extractData(await this.client.GET('/v1/auth/me', {}))\n }\n\n /** Create a new API key */\n async create(body: components['schemas']['CreateApiKeyRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/api-keys', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n )\n }\n\n /** List API keys in the workspace */\n async list(params?: ListParams & { mine_only?: boolean }) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/api-keys', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n listAutoPaging(params?: ListParams & { mine_only?: boolean }) {\n return this.iteratePaginatedList((pageParams) => this.list(pageParams), params)\n }\n\n /** Revoke an API key */\n async revoke(keyId: ApiKeyId | string): Promise<void> {\n await this.client.DELETE('/v1/{workspace_id}/api-keys/{key_id}', {\n params: { path: { workspace_id: this.workspaceId, key_id: keyId } },\n })\n }\n\n /** Rotate an API key \u2014 invalidates the old key and issues a new one */\n async rotate(keyId: ApiKeyId | string, body: components['schemas']['RotateApiKeyRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/api-keys/{key_id}/rotate', {\n params: { path: { workspace_id: this.workspaceId, key_id: keyId } },\n body,\n }),\n )\n }\n}\n", "import type { components } from '../generated/api.js'\nimport type { AgentId } from '../core/branded-types.js'\nimport { WorkspaceScopedResource, extractData } from './base.js'\nimport type { ListParams } from '../core/utils.js'\n\nexport interface ListAgentsParams extends ListParams {\n search?: string\n}\n\nexport class AgentsResource extends WorkspaceScopedResource {\n async create(body: components['schemas']['CreateAgentRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/agents', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n )\n }\n\n async list(params?: ListAgentsParams) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/agents', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n listAutoPaging(params?: ListAgentsParams) {\n return this.iteratePaginatedList((pageParams) => this.list(pageParams), params)\n }\n\n async get(agentId: AgentId | string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/agents/{agent_id}', {\n params: { path: { workspace_id: this.workspaceId, agent_id: agentId } },\n }),\n )\n }\n\n async update(agentId: AgentId | string, body: components['schemas']['UpdateAgentRequest']) {\n return extractData(\n await this.client.PUT('/v1/{workspace_id}/agents/{agent_id}', {\n params: { path: { workspace_id: this.workspaceId, agent_id: agentId } },\n body,\n }),\n )\n }\n\n async delete(agentId: AgentId | string): Promise<void> {\n await this.client.DELETE('/v1/{workspace_id}/agents/{agent_id}', {\n params: { path: { workspace_id: this.workspaceId, agent_id: agentId } },\n })\n }\n\n async listVersions(agentId: AgentId | string, params?: ListParams) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/agents/{agent_id}/versions', {\n params: { path: { workspace_id: this.workspaceId, agent_id: agentId }, query: params },\n }),\n )\n }\n\n listVersionsAutoPaging(agentId: AgentId | string, params?: ListParams) {\n return this.iteratePaginatedList((pageParams) => this.listVersions(agentId, pageParams), params)\n }\n\n async getVersion(agentId: AgentId | string, version: number | 'latest') {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/agents/{agent_id}/versions/{version}', {\n params: {\n path: { workspace_id: this.workspaceId, agent_id: agentId, version: String(version) },\n },\n }),\n )\n }\n\n async createVersion(\n agentId: AgentId | string,\n body: components['schemas']['CreateAgentVersionRequest'],\n ) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/agents/{agent_id}/versions', {\n params: { path: { workspace_id: this.workspaceId, agent_id: agentId } },\n body,\n }),\n )\n }\n}\n", "import type { components } from '../generated/api.js'\nimport type { SkillId } from '../core/branded-types.js'\nimport { WorkspaceScopedResource, extractData } from './base.js'\nimport type { ListParams } from '../core/utils.js'\n\nexport interface ListSkillsParams extends ListParams {\n search?: string\n enabled?: boolean\n execution_tier?: string\n}\n\n/**\n * Manage skills \u2014 reusable AI capabilities that agents can call.\n * Skills define a structured input/output schema and an execution tier.\n */\nexport class SkillsResource extends WorkspaceScopedResource {\n /** Create a new skill */\n async create(body: components['schemas']['CreateSkillRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/skills', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n )\n }\n\n /** List skills in the workspace */\n async list(params?: ListSkillsParams) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/skills', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n listAutoPaging(params?: ListSkillsParams) {\n return this.iteratePaginatedList((pageParams) => this.list(pageParams), params)\n }\n\n /** Get a single skill */\n async get(skillId: SkillId | string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/skills/{skill_id}', {\n params: { path: { workspace_id: this.workspaceId, skill_id: skillId } },\n }),\n )\n }\n\n /** Update a skill */\n async update(skillId: SkillId | string, body: components['schemas']['UpdateSkillRequest']) {\n return extractData(\n await this.client.PUT('/v1/{workspace_id}/skills/{skill_id}', {\n params: { path: { workspace_id: this.workspaceId, skill_id: skillId } },\n body,\n }),\n )\n }\n\n /** Delete a skill */\n async delete(skillId: SkillId | string): Promise<void> {\n await this.client.DELETE('/v1/{workspace_id}/skills/{skill_id}', {\n params: { path: { workspace_id: this.workspaceId, skill_id: skillId } },\n })\n }\n\n /**\n * Test a skill with a sample input.\n * Executes the skill in a sandbox and returns the result.\n */\n async test(skillId: SkillId | string, body: components['schemas']['TestSkillRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/skills/{skill_id}/test', {\n params: { path: { workspace_id: this.workspaceId, skill_id: skillId } },\n body,\n }),\n )\n }\n}\n", "import type { components } from '../generated/api.js'\nimport type { ActionId } from '../core/branded-types.js'\nimport { WorkspaceScopedResource, extractData } from './base.js'\nimport type { ListParams } from '../core/utils.js'\n\nexport interface ListActionsParams extends ListParams {\n search?: string\n enabled?: boolean\n execution_tier?: string\n}\n\n/**\n * Manage actions \u2014 reusable AI capabilities that agents can call.\n * Actions define a structured input/output schema and an execution tier.\n *\n * Note: The underlying API paths use `/skills/` for backward compatibility.\n */\nexport class ActionsResource extends WorkspaceScopedResource {\n /** Create a new action */\n async create(body: components['schemas']['CreateSkillRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/skills', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n )\n }\n\n /** List actions in the workspace */\n async list(params?: ListActionsParams) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/skills', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n listAutoPaging(params?: ListActionsParams) {\n return this.iteratePaginatedList((pageParams) => this.list(pageParams), params)\n }\n\n /** Get a single action */\n async get(actionId: ActionId | string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/skills/{skill_id}', {\n params: { path: { workspace_id: this.workspaceId, skill_id: actionId } },\n }),\n )\n }\n\n /** Update an action */\n async update(actionId: ActionId | string, body: components['schemas']['UpdateSkillRequest']) {\n return extractData(\n await this.client.PUT('/v1/{workspace_id}/skills/{skill_id}', {\n params: { path: { workspace_id: this.workspaceId, skill_id: actionId } },\n body,\n }),\n )\n }\n\n /** Delete an action */\n async delete(actionId: ActionId | string): Promise<void> {\n await this.client.DELETE('/v1/{workspace_id}/skills/{skill_id}', {\n params: { path: { workspace_id: this.workspaceId, skill_id: actionId } },\n })\n }\n\n /** Get all context graphs and services that reference this action */\n async getReferences(actionId: ActionId | string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/skills/{skill_id}/references', {\n params: { path: { workspace_id: this.workspaceId, skill_id: actionId } },\n }),\n )\n }\n\n /**\n * Test an action with a sample input.\n * Executes the action in a sandbox and returns the result.\n */\n async test(actionId: ActionId | string, body: components['schemas']['TestSkillRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/skills/{skill_id}/test', {\n params: { path: { workspace_id: this.workspaceId, skill_id: actionId } },\n body,\n }),\n )\n }\n}\n", "import type { components, operations } from '../generated/api.js'\nimport { WorkspaceScopedResource, extractData } from './base.js'\n\nexport type EscalationStatsParams = NonNullable<\n operations['escalation-stats']['parameters']['query']\n>\n\nexport class OperatorsResource extends WorkspaceScopedResource {\n async list(params?: { status?: string; limit?: number; offset?: number }) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/operators', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n listAutoPaging(params?: { status?: string; limit?: number; offset?: number }) {\n return this.iterateOffsetPaginatedList(\n (pageParams) => this.list(pageParams),\n (page) => page.items,\n params,\n )\n }\n\n async create(body: components['schemas']['CreateOperatorRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/operators', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n )\n }\n\n async get(operatorId: string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/operators/{operator_id}', {\n params: { path: { workspace_id: this.workspaceId, operator_id: operatorId } },\n }),\n )\n }\n\n /** Update an operator (name, role, status, etc.) */\n async update(operatorId: string, body: components['schemas']['UpdateOperatorRequest']) {\n return extractData(\n await this.client.PATCH('/v1/{workspace_id}/operators/{operator_id}', {\n params: { path: { workspace_id: this.workspaceId, operator_id: operatorId } },\n body,\n }),\n )\n }\n\n async getDashboard() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/operators/dashboard', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n\n async getQueue() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/operators/queue', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n\n async getEscalations(params?: { status?: string; limit?: number; offset?: number }) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/operators/escalations', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n getEscalationsAutoPaging(params?: { status?: string; limit?: number; offset?: number }) {\n return this.iterateOffsetPaginatedList(\n (pageParams) => this.getEscalations(pageParams),\n (page) => page.items,\n params,\n )\n }\n\n async getActiveEscalations() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/operators/escalations/active', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n\n async getEscalationStats(params?: EscalationStatsParams) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/operators/escalations/stats', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n async getPerformance(params?: {\n days?: number\n date_from?: string | null\n date_to?: string | null\n interval?: '1h' | '1d' | '1w'\n service_id?: string | null\n }) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/operators/performance', {\n params: { path: { workspace_id: this.workspaceId }, query: params as never },\n }),\n )\n }\n\n async getAccessToken(operatorId: string, body: components['schemas']['AccessTokenRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/operators/{operator_id}/access-token', {\n params: { path: { workspace_id: this.workspaceId, operator_id: operatorId } },\n body,\n }),\n )\n }\n\n async joinCall(operatorId: string, body: components['schemas']['JoinCallRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/operators/{operator_id}/join-call', {\n params: { path: { workspace_id: this.workspaceId, operator_id: operatorId } },\n body,\n }),\n )\n }\n\n async leaveCall(operatorId: string, body: components['schemas']['LeaveCallRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/operators/{operator_id}/leave-call', {\n params: { path: { workspace_id: this.workspaceId, operator_id: operatorId } },\n body,\n }),\n )\n }\n\n async switchMode(operatorId: string, body: components['schemas']['SwitchModeRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/operators/{operator_id}/switch-mode', {\n params: { path: { workspace_id: this.workspaceId, operator_id: operatorId } },\n body,\n }),\n )\n }\n\n async sendGuidance(operatorId: string, body: components['schemas']['SendGuidanceRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/operators/{operator_id}/send-guidance', {\n params: { path: { workspace_id: this.workspaceId, operator_id: operatorId } },\n body,\n }),\n )\n }\n\n async createBriefing(operatorId: string, body: { call_sid: string }) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/operators/{operator_id}/briefing', {\n params: { path: { workspace_id: this.workspaceId, operator_id: operatorId } },\n body,\n }),\n )\n }\n\n async wrapUp(operatorId: string, body: components['schemas']['WrapUpRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/operators/{operator_id}/wrap-up', {\n params: { path: { workspace_id: this.workspaceId, operator_id: operatorId } },\n body,\n }),\n )\n }\n\n async getCallTranscript(callSid: string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/operators/calls/{call_sid}/transcript', {\n params: { path: { workspace_id: this.workspaceId, call_sid: callSid } },\n }),\n )\n }\n\n async getAuditLog(params?: { limit?: number; offset?: number }) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/operators/audit-log', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n getAuditLogAutoPaging(params?: { limit?: number; offset?: number }) {\n return this.iterateOffsetPaginatedList(\n (pageParams) => this.getAuditLog(pageParams),\n (page) => page.items,\n params,\n )\n }\n}\n", "import type { components } from '../generated/api.js'\nimport { WorkspaceScopedResource, extractData } from './base.js'\nimport type { ListParams } from '../core/utils.js'\n\nexport class TriggersResource extends WorkspaceScopedResource {\n async list(params?: ListParams) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/triggers', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n listAutoPaging(params?: ListParams) {\n return this.iteratePaginatedList((pageParams) => this.list(pageParams), params)\n }\n\n async create(body: components['schemas']['CreateTriggerRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/triggers', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n )\n }\n\n async get(triggerId: string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/triggers/{trigger_id}', {\n params: { path: { workspace_id: this.workspaceId, trigger_id: triggerId } },\n }),\n )\n }\n\n async update(triggerId: string, body: components['schemas']['UpdateTriggerRequest']) {\n return extractData(\n await this.client.PUT('/v1/{workspace_id}/triggers/{trigger_id}', {\n params: { path: { workspace_id: this.workspaceId, trigger_id: triggerId } },\n body,\n }),\n )\n }\n\n async delete(triggerId: string): Promise<void> {\n await this.client.DELETE('/v1/{workspace_id}/triggers/{trigger_id}', {\n params: { path: { workspace_id: this.workspaceId, trigger_id: triggerId } },\n })\n }\n\n async fire(triggerId: string) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/triggers/{trigger_id}/fire', {\n params: { path: { workspace_id: this.workspaceId, trigger_id: triggerId } },\n }),\n )\n }\n\n async pause(triggerId: string) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/triggers/{trigger_id}/pause', {\n params: { path: { workspace_id: this.workspaceId, trigger_id: triggerId } },\n }),\n )\n }\n\n async resume(triggerId: string) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/triggers/{trigger_id}/resume', {\n params: { path: { workspace_id: this.workspaceId, trigger_id: triggerId } },\n }),\n )\n }\n\n async listRuns(triggerId: string, params?: ListParams) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/triggers/{trigger_id}/runs', {\n params: { path: { workspace_id: this.workspaceId, trigger_id: triggerId }, query: params },\n }),\n )\n }\n\n listRunsAutoPaging(triggerId: string, params?: ListParams) {\n return this.iteratePaginatedList((pageParams) => this.listRuns(triggerId, pageParams), params)\n }\n}\n", "import type { components } from '../generated/api.js'\nimport type { ServiceId } from '../core/branded-types.js'\nimport { WorkspaceScopedResource, extractData } from './base.js'\nimport type { ListParams } from '../core/utils.js'\n\nexport interface ListServicesParams extends ListParams {\n search?: string\n type?: string\n}\n\n/**\n * Manage services \u2014 external service configurations that agents can call.\n * Services represent integrations like scheduling systems, EHRs, or CRMs\n * that skills can interact with via their tool definitions.\n */\nexport class ServicesResource extends WorkspaceScopedResource {\n async create(body: components['schemas']['CreateServiceRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/services', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n )\n }\n\n async list(params?: ListServicesParams) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/services', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n listAutoPaging(params?: ListServicesParams) {\n return this.iteratePaginatedList((pageParams) => this.list(pageParams), params)\n }\n\n async get(serviceId: ServiceId | string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/services/{service_id}', {\n params: { path: { workspace_id: this.workspaceId, service_id: serviceId } },\n }),\n )\n }\n\n async update(serviceId: ServiceId | string, body: components['schemas']['UpdateServiceRequest']) {\n return extractData(\n await this.client.PUT('/v1/{workspace_id}/services/{service_id}', {\n params: { path: { workspace_id: this.workspaceId, service_id: serviceId } },\n body,\n }),\n )\n }\n\n async delete(serviceId: ServiceId | string): Promise<void> {\n await this.client.DELETE('/v1/{workspace_id}/services/{service_id}', {\n params: { path: { workspace_id: this.workspaceId, service_id: serviceId } },\n })\n }\n}\n", "import type { components } from '../generated/api.js'\nimport type { ContextGraphId } from '../core/branded-types.js'\nimport { WorkspaceScopedResource, extractData } from './base.js'\nimport type { ListParams } from '../core/utils.js'\n\nexport interface ListContextGraphsParams extends ListParams {\n search?: string\n}\n\n/**\n * Manage context graphs \u2014 structured conversation flow definitions (HSM).\n * Context graphs define the states, transitions, and conditions that\n * govern how an agent moves through a conversation.\n */\nexport class ContextGraphsResource extends WorkspaceScopedResource {\n async create(body: components['schemas']['CreateContextGraphRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/context-graphs', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n )\n }\n\n async list(params?: ListContextGraphsParams) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/context-graphs', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n listAutoPaging(params?: ListContextGraphsParams) {\n return this.iteratePaginatedList((pageParams) => this.list(pageParams), params)\n }\n\n async get(contextGraphId: ContextGraphId | string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/context-graphs/{context_graph_id}', {\n params: {\n path: { workspace_id: this.workspaceId, context_graph_id: contextGraphId },\n },\n }),\n )\n }\n\n async update(\n contextGraphId: ContextGraphId | string,\n body: components['schemas']['UpdateContextGraphRequest'],\n ) {\n return extractData(\n await this.client.PUT('/v1/{workspace_id}/context-graphs/{context_graph_id}', {\n params: {\n path: { workspace_id: this.workspaceId, context_graph_id: contextGraphId },\n },\n body,\n }),\n )\n }\n\n async delete(contextGraphId: ContextGraphId | string): Promise<void> {\n await this.client.DELETE('/v1/{workspace_id}/context-graphs/{context_graph_id}', {\n params: {\n path: { workspace_id: this.workspaceId, context_graph_id: contextGraphId },\n },\n })\n }\n\n /** Create a version snapshot of the current context graph */\n async createVersion(\n contextGraphId: ContextGraphId | string,\n body: components['schemas']['CreateContextGraphVersionRequest'],\n ) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/context-graphs/{context_graph_id}/versions', {\n params: {\n path: { workspace_id: this.workspaceId, context_graph_id: contextGraphId },\n },\n body,\n }),\n )\n }\n\n /** List all versions of a context graph */\n async listVersions(contextGraphId: ContextGraphId | string, params?: ListParams) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/context-graphs/{context_graph_id}/versions', {\n params: {\n path: { workspace_id: this.workspaceId, context_graph_id: contextGraphId },\n query: params,\n },\n }),\n )\n }\n\n listVersionsAutoPaging(contextGraphId: ContextGraphId | string, params?: ListParams) {\n return this.iteratePaginatedList(\n (pageParams) => this.listVersions(contextGraphId, pageParams),\n params,\n )\n }\n\n /** Get a specific version by number, or pass \"latest\" for the most recent */\n async getVersion(contextGraphId: ContextGraphId | string, version: number | 'latest') {\n return extractData(\n await this.client.GET(\n '/v1/{workspace_id}/context-graphs/{context_graph_id}/versions/{version}',\n {\n params: {\n path: {\n workspace_id: this.workspaceId,\n context_graph_id: contextGraphId,\n version,\n },\n },\n },\n ),\n )\n }\n}\n", "import type { components } from '../generated/api.js'\nimport type { DataSourceId } from '../core/branded-types.js'\nimport { WorkspaceScopedResource, extractData } from './base.js'\nimport type { ListParams } from '../core/utils.js'\n\nexport interface ListDataSourcesParams extends ListParams {\n type?: string\n status?: string\n}\n\n/**\n * Manage data sources \u2014 connections to external databases, warehouses,\n * or data feeds that the platform can query and sync from.\n */\nexport class DataSourcesResource extends WorkspaceScopedResource {\n async create(body: components['schemas']['CreateDataSourceRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/data-sources', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n )\n }\n\n async list(params?: ListDataSourcesParams) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/data-sources', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n listAutoPaging(params?: ListDataSourcesParams) {\n return this.iteratePaginatedList((pageParams) => this.list(pageParams), params)\n }\n\n async get(dataSourceId: DataSourceId | string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/data-sources/{data_source_id}', {\n params: { path: { workspace_id: this.workspaceId, data_source_id: dataSourceId } },\n }),\n )\n }\n\n async update(\n dataSourceId: DataSourceId | string,\n body: components['schemas']['UpdateDataSourceRequest'],\n ) {\n return extractData(\n await this.client.PATCH('/v1/{workspace_id}/data-sources/{data_source_id}', {\n params: { path: { workspace_id: this.workspaceId, data_source_id: dataSourceId } },\n body,\n }),\n )\n }\n\n async delete(dataSourceId: DataSourceId | string): Promise<void> {\n await this.client.DELETE('/v1/{workspace_id}/data-sources/{data_source_id}', {\n params: { path: { workspace_id: this.workspaceId, data_source_id: dataSourceId } },\n })\n }\n\n /** Get event counts, sync status, and health for a data source */\n async getStatus(dataSourceId: DataSourceId | string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/data-sources/{data_source_id}/status', {\n params: { path: { workspace_id: this.workspaceId, data_source_id: dataSourceId } },\n }),\n )\n }\n\n /** Get daily event timeline + recent sync failures for a data source */\n async getSyncHistory(dataSourceId: DataSourceId | string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/data-sources/{data_source_id}/sync-history', {\n params: { path: { workspace_id: this.workspaceId, data_source_id: dataSourceId } },\n }),\n )\n }\n\n /**\n * Trigger a one-off manual sync of a data source.\n *\n * Bypasses the business-hours gate and per-resource cadence counter on\n * connector-runner. Resolves with `{ status: \"started\", ... }` once the\n * request is queued \u2014 the poll itself runs asynchronously. Platform-api\n * returns 409 if the source is already mid-sync (see\n * `TriggerSyncConflictResponse` for the body shape), 503 if\n * connector-runner is unreachable.\n */\n async triggerSync(dataSourceId: DataSourceId | string) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/data-sources/{data_source_id}/sync', {\n params: { path: { workspace_id: this.workspaceId, data_source_id: dataSourceId } },\n }),\n )\n }\n}\n", "import type { EntityId } from '../core/branded-types.js'\nimport { WorkspaceScopedResource, extractData } from './base.js'\n\n/**\n * World Model \u2014 entities, events, relationships, and the entity timeline.\n *\n * The world model is the core knowledge graph of the platform. Entities\n * represent real-world objects (patients, contacts, calls). Events record\n * observations about entities over time.\n */\nexport class WorldResource extends WorkspaceScopedResource {\n // ---- Entities ----\n\n /** List entities with optional filtering */\n async listEntities(params?: {\n entity_type?: string[] | null\n q?: string | null\n limit?: number\n offset?: number\n has_projection?: boolean | null\n source?: string | null\n source_system?: string | null\n semantic?: string | null\n tags?: string[] | null\n }) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/world/entities', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n listEntitiesAutoPaging(params?: {\n entity_type?: string[] | null\n q?: string | null\n limit?: number\n offset?: number\n has_projection?: boolean | null\n source?: string | null\n source_system?: string | null\n semantic?: string | null\n tags?: string[] | null\n }) {\n return this.iterateOffsetPaginatedList(\n (pageParams) => this.listEntities(pageParams),\n (page) => page.entities,\n params,\n )\n }\n\n /** Get a single entity */\n async getEntity(entityId: EntityId | string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/world/entities/{entity_id}', {\n params: { path: { workspace_id: this.workspaceId, entity_id: entityId } },\n }),\n )\n }\n\n /** Get all relationships for an entity */\n async getRelationships(entityId: EntityId | string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/world/entities/{entity_id}/relationships', {\n params: { path: { workspace_id: this.workspaceId, entity_id: entityId } },\n }),\n )\n }\n\n /** Get the knowledge graph centered on an entity (entity + neighbors + edges) */\n async getGraph(entityId: EntityId | string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/world/entities/{entity_id}/graph', {\n params: { path: { workspace_id: this.workspaceId, entity_id: entityId } },\n }),\n )\n }\n\n /** Get provenance \u2014 which source systems contributed data for an entity */\n async getProvenance(entityId: EntityId | string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/world/entities/{entity_id}/provenance', {\n params: { path: { workspace_id: this.workspaceId, entity_id: entityId } },\n }),\n )\n }\n\n /** Get lineage \u2014 merge history and canonical identity for an entity */\n async getLineage(entityId: EntityId | string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/world/entities/{entity_id}/lineage', {\n params: { path: { workspace_id: this.workspaceId, entity_id: entityId } },\n }),\n )\n }\n\n /** Get merged entities for a canonical entity */\n async getMerged(entityId: EntityId | string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/world/entities/{entity_id}/merged', {\n params: { path: { workspace_id: this.workspaceId, entity_id: entityId } },\n }),\n )\n }\n\n // ---- Connectors ----\n\n /** Get connected data sources overview with entity counts and sync status */\n async getConnectors() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/world/connectors', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n\n /** List entities from a specific connector / data source */\n async getConnectorEntities(\n dataSourceId: string,\n params?: {\n entity_type?: string | null\n q?: string | null\n limit?: number\n offset?: number\n },\n ) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/world/connectors/{data_source_id}/entities', {\n params: {\n path: { workspace_id: this.workspaceId, data_source_id: dataSourceId },\n query: params,\n },\n }),\n )\n }\n\n /** Search FHIR resources from a specific data source */\n async getConnectorResources(\n dataSourceId: string,\n params: {\n resource_type: string\n _count?: number\n _offset?: number\n },\n ) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/world/connectors/{data_source_id}/resources', {\n params: {\n path: { workspace_id: this.workspaceId, data_source_id: dataSourceId },\n query: params,\n },\n }),\n )\n }\n\n // ---- Entity Types ----\n\n /** List registered entity types with counts and schemas */\n async listEntityTypes() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/world/entity-types', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n\n // ---- Duplicate Detection ----\n\n /** List potential duplicate entity pairs for review or merging */\n async listDuplicates(params?: { entity_type?: string | null; confidence_max?: number }) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/world/entities/duplicates', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n // ---- Semantic Search ----\n\n /** Semantic (vector) search over entities */\n async search(params: {\n q: string\n entity_type?: string | null\n source?: string | null\n confidence_min?: number | null\n limit?: number\n offset?: number\n }) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/world/search', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n // ---- Timeline ----\n\n /** Get the event timeline for an entity (reverse-chronological) */\n async getTimeline(\n entityId: EntityId | string,\n params?: {\n domain?: string | null\n limit?: number\n offset?: number\n },\n ) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/world/entities/{entity_id}/timeline', {\n params: {\n path: { workspace_id: this.workspaceId, entity_id: entityId },\n query: params,\n },\n }),\n )\n }\n\n getTimelineAutoPaging(\n entityId: EntityId | string,\n params?: {\n domain?: string | null\n limit?: number\n offset?: number\n },\n ) {\n return this.iterateOffsetPaginatedList(\n (pageParams) => this.getTimeline(entityId, pageParams),\n (page) => page.events,\n params,\n )\n }\n\n // ---- Sync ----\n\n /** Get sync status grouped by sink (Lakebase, Delta, etc.) */\n async getSyncStatusBySink() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/world/sync/by-sink', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n\n /** List sync events with status filtering */\n async listSyncEvents(params: {\n status: 'pending' | 'failed'\n data_source_id?: string | null\n source_system?: string | null\n fhir_resource_type?: string | null\n fhir_resource_id?: string | null\n limit?: number\n offset?: number\n }) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/world/sync/events', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n listSyncEventsAutoPaging(params: {\n status: 'pending' | 'failed'\n data_source_id?: string | null\n source_system?: string | null\n fhir_resource_type?: string | null\n fhir_resource_id?: string | null\n limit?: number\n offset?: number\n }) {\n return this.iterateOffsetPaginatedList(\n (pageParams) => this.listSyncEvents(pageParams),\n (page) => page.events,\n params,\n )\n }\n\n /** Get current sync queue depth */\n async getSyncQueueDepth() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/world/sync/queue', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n\n /** Retry a single failed sync event */\n async retrySyncEvent(eventId: string) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/world/sync/retry/{event_id}', {\n params: { path: { workspace_id: this.workspaceId, event_id: eventId } },\n }),\n )\n }\n\n /** Retry all failed sync events */\n async retryAllSyncEvents() {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/world/sync/retry-all', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n\n // ---- Statistics ----\n\n /** Get aggregate entity and event statistics */\n async getStats() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/world/entity-stats', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n\n /** Get entity counts broken down by source system */\n async getSourceBreakdown() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/world/source-breakdown', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n}\n", "import { WorkspaceScopedResource, extractData } from './base.js'\nimport type { ListParams } from '../core/utils.js'\n\nexport interface ListCallsParams extends ListParams {\n status?: string\n agent_id?: string\n start_date?: string\n end_date?: string\n phone_number?: string\n direction?: string\n min_duration?: number\n max_duration?: number\n search?: string\n include_simulated?: boolean\n service_id?: string\n}\n\n/**\n * Access call records and intelligence.\n * Calls are read-only in the SDK \u2014 they are created by the voice pipeline.\n */\nexport class CallsResource extends WorkspaceScopedResource {\n /** List calls with optional filtering */\n async list(params?: ListCallsParams) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/calls', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n listAutoPaging(params?: ListCallsParams) {\n return this.iteratePaginatedList((pageParams) => this.list(pageParams), params)\n }\n\n /** Get full call detail including turns, escalation, safety, and recording info */\n async get(callId: string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/calls/{call_id}', {\n params: { path: { workspace_id: this.workspaceId, call_id: callId } },\n }),\n )\n }\n\n /** Get the canonical playback timeline for a call */\n async getTimeline(callId: string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/calls/{call_id}/timeline', {\n params: { path: { workspace_id: this.workspaceId, call_id: callId } },\n }),\n )\n }\n\n /** Get AI intelligence for a call */\n async getIntelligence(callId: string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/calls/{call_id}/intelligence', {\n params: { path: { workspace_id: this.workspaceId, call_id: callId } },\n }),\n )\n }\n\n /** Get active intelligence across all in-progress calls */\n async getActiveIntelligence() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/calls/active/intelligence', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n\n /** Get performance benchmarks for a time period */\n async getBenchmarks(params?: { days?: number }) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/calls/benchmarks', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n /** Get phone number call volume breakdown */\n async getPhoneVolume(params?: { days?: number }) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/calls/phone-volume', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n /** Get deep call trace analysis */\n async getTraceAnalysis(callId: string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/calls/{call_id}/trace-analysis', {\n params: { path: { workspace_id: this.workspaceId, call_id: callId } },\n }),\n )\n }\n}\n", "import { ConfigurationError } from '../core/errors.js'\nimport { type PlatformFetch } from '../core/openapi-client.js'\nimport type { components, operations } from '../generated/api.js'\nimport { WorkspaceScopedResource, extractData } from './base.js'\n\nexport type ConversationDetail = components['schemas']['ConversationDetail']\nexport type ConversationListResponse = components['schemas']['ConversationListResponse']\nexport type ConversationSummary =\n components['schemas']['src__routes__conversations__ConversationSummary']\nexport type ConversationTurn = components['schemas']['ConversationTurn']\nexport type CreateConversationRequest = components['schemas']['CreateConversationRequest']\nexport type TurnRequest = components['schemas']['TurnRequest']\nexport type TurnResponse = components['schemas']['TurnResponse']\nexport type TurnStreamEvent = components['schemas']['TurnStreamEvent']\nexport type TurnTokenEvent = components['schemas']['TurnTokenEvent']\nexport type TurnToolCallStartedEvent = components['schemas']['TurnToolCallStartedEvent']\nexport type TurnToolCallCompletedEvent = components['schemas']['TurnToolCallCompletedEvent']\nexport type TurnThinkingEvent = components['schemas']['TurnThinkingEvent']\nexport type TurnMessageEvent = components['schemas']['TurnMessageEvent']\nexport type TurnDoneEvent = components['schemas']['TurnDoneEvent']\nexport type TurnErrorEvent = components['schemas']['TurnErrorEvent']\n\n/**\n * Hand-authored because the text-stream WebSocket endpoint is intentionally\n * outside the generated OpenAPI REST snapshot.\n * TODO: replace with generated types when `/agent/text-stream` is added to\n * openapi.json.\n *\n * @beta The text-stream WebSocket contract may evolve independently of the REST API.\n */\nexport interface TextStreamUrlParams {\n serviceId: string\n conversationId?: string\n entityId?: string\n /**\n * Enable `tool_call_started` and `tool_call_completed` frames on the\n * text-stream WebSocket so the client can render tool invocations in\n * real time.\n */\n toolEvents?: boolean\n /**\n * Bearer token query-param fallback for clients whose API key cannot be sent\n * as a WebSocket subprotocol token. Prefer textStreamAuthProtocols() when\n * the token is subprotocol-safe so secrets do not appear in URLs. The SDK\n * intentionally accepts only the server-supported text-stream token alphabet\n * (letters, digits, `.`, `_`, `+`, `=`, `/`, `:`, `-`) even though\n * URLSearchParams can percent-encode additional characters.\n */\n token?: string\n /**\n * Full text-stream URL override for preview/custom ingress.\n * Defaults to `${baseUrl origin}/agent/text-stream` with\n * `http` mapped to `ws` and `https` mapped to `wss`.\n */\n textStreamUrl?: string\n}\n\n/** @beta The text-stream WebSocket contract may evolve independently of the REST API. */\nexport type TextStreamAuthProtocols = readonly ['auth', string]\n\n/**\n * Hand-authored because the workspace-scoped session-connect WebSocket is\n * intentionally outside the generated OpenAPI REST snapshot.\n *\n * Path: ``WS /v1/{workspace_id}/sessions/connect``. Authentication is delivered\n * via the ``Sec-WebSocket-Protocol: auth, <token>`` subprotocol header \u2014 the\n * server rejects query-param tokens to keep credentials out of URLs and proxy\n * logs. ``serviceId`` and ``entityId`` are required path/query inputs.\n *\n * @beta The session-connect WebSocket contract may evolve independently of the REST API.\n */\nexport interface SessionConnectUrlParams {\n serviceId: string\n entityId: string\n conversationId?: string\n /**\n * Emit ``tool_call_started`` and ``tool_call_completed`` frames so the client\n * can render tool invocations in real time. Server defaults to ``true`` when\n * the param is omitted; the SDK only sets it explicitly when the caller asks\n * to disable tool events.\n */\n toolEvents?: boolean\n /**\n * Full session-connect URL override for preview/custom ingress. Defaults to\n * ``${baseUrl origin}/v1/{workspace_id}/sessions/connect`` with ``http`` mapped\n * to ``ws`` and ``https`` mapped to ``wss``. The override must be an\n * absolute ws/wss URL with no query string or fragment \u2014 SDK-managed query\n * params are appended by the helper.\n */\n sessionConnectUrl?: string\n}\n\nconst MAX_AUTH_TOKEN_CHARS = 4096\nconst TEXT_STREAM_AUTH_TOKEN_RE = /^[-A-Za-z0-9._+=/:]+$/\nconst WEB_SOCKET_PROTOCOL_TOKEN_RE = /^[!#$%&'*+\\-.^_`|~A-Za-z0-9]+$/\n\nexport type ListConversationsParams = NonNullable<\n operations['list_conversations_v1__workspace_id__conversations_get']['parameters']['query']\n>\n\n/** Access text conversation APIs and text-stream URL helpers. */\nexport class ConversationsResource extends WorkspaceScopedResource {\n private readonly agentBaseUrl: string | undefined\n\n constructor(client: PlatformFetch, workspaceId: string, agentBaseUrl?: string) {\n super(client, workspaceId)\n this.agentBaseUrl = agentBaseUrl\n }\n\n async list(params?: ListConversationsParams): Promise<ConversationListResponse> {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/conversations', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n async create(request: CreateConversationRequest): Promise<ConversationDetail> {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/conversations', {\n params: { path: { workspace_id: this.workspaceId } },\n body: request,\n }),\n )\n }\n\n async get(conversationId: string): Promise<ConversationDetail> {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/conversations/{conversation_id}', {\n params: {\n path: { workspace_id: this.workspaceId, conversation_id: conversationId },\n },\n }),\n )\n }\n\n async close(conversationId: string): Promise<void> {\n await this.client.DELETE('/v1/{workspace_id}/conversations/{conversation_id}', {\n params: {\n path: { workspace_id: this.workspaceId, conversation_id: conversationId },\n },\n })\n }\n\n /**\n * Send a user message and receive the agent's synchronous JSON response.\n *\n * Pass `options.includeToolCalls: true` to request tool-call metadata\n * alongside the response turns. Server-side default is `false` \u2014 without\n * this opt-in the `tool_calls` array on the `TurnResponse` will be empty\n * even when the agent invoked tools during the turn.\n */\n async createTurn(\n conversationId: string,\n request: TurnRequest,\n options?: { includeToolCalls?: boolean },\n ): Promise<TurnResponse> {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/conversations/{conversation_id}/turns', {\n params: {\n path: { workspace_id: this.workspaceId, conversation_id: conversationId },\n ...(options?.includeToolCalls !== undefined && {\n query: { include_tool_calls: options.includeToolCalls },\n }),\n },\n body: request,\n headers: { Accept: 'application/json' },\n }),\n ) as TurnResponse\n }\n\n /**\n * Send a message and receive the agent's response as an SSE stream.\n *\n * Returns a `ReadableStream` of SSE bytes. Use `EventSourceParserStream`\n * (from `eventsource-parser/stream`) to parse into typed `TurnStreamEvent`.\n *\n * @example\n * ```ts\n * const stream = await client.conversations.createTurnStream(convId, { message: \"Hello\" });\n * const events = stream\n * .pipeThrough(new TextDecoderStream())\n * .pipeThrough(new EventSourceParserStream());\n * for await (const event of events) {\n * const parsed = JSON.parse(event.data) as TurnStreamEvent;\n * if (parsed.event === \"token\") console.log(parsed.text);\n * }\n * ```\n */\n async createTurnStream(\n conversationId: string,\n request: TurnRequest,\n options?: { signal?: AbortSignal; includeToolCalls?: boolean },\n ): Promise<ReadableStream<Uint8Array>> {\n const result = await this.client.POST(\n '/v1/{workspace_id}/conversations/{conversation_id}/turns',\n {\n params: {\n path: { workspace_id: this.workspaceId, conversation_id: conversationId },\n ...(options?.includeToolCalls !== undefined && {\n query: { include_tool_calls: options.includeToolCalls },\n }),\n },\n body: request,\n headers: { Accept: 'text/event-stream' },\n parseAs: 'stream',\n signal: options?.signal,\n },\n )\n if (result.error !== undefined) {\n throw new Error(`API error: ${JSON.stringify(result.error)}`)\n }\n return result.data as ReadableStream<Uint8Array>\n }\n\n /**\n * Send a message and receive the agent's response as a typed\n * `TurnStreamEvent` async iterable.\n *\n * The bytes-and-parser dance from `createTurnStream` is now hidden inside\n * the SDK \u2014 consumers iterate strongly typed events directly. Each yielded\n * value is a member of the `TurnStreamEvent` discriminated union (`token`,\n * `thinking`, `tool_call_started`, `tool_call_completed`, `message`,\n * `done`, `error`), validated as a record with a known `event`\n * discriminator. Unknown / malformed frames are dropped silently \u2014 this\n * matches the wire-format-drift behavior of the lower-level\n * `createTurnStream` while keeping the strict `TurnStreamEvent` static\n * contract intact for consumers.\n *\n * @example\n * ```ts\n * for await (const event of client.conversations.streamTurn(convId, { message: \"Hello\" })) {\n * if (event.event === \"token\") process.stdout.write(event.text);\n * else if (event.event === \"done\") break;\n * }\n * ```\n */\n async *streamTurn(\n conversationId: string,\n request: TurnRequest,\n options?: { signal?: AbortSignal; includeToolCalls?: boolean },\n ): AsyncGenerator<TurnStreamEvent> {\n const byteStream = await this.createTurnStream(conversationId, request, options)\n for await (const frame of parseSSEFrames(byteStream)) {\n const event = parseTurnStreamFrame(frame.event, frame.data)\n if (event) yield event\n }\n }\n\n /** Build the real-time text WebSocket URL for browser or custom clients. */\n textStreamUrl(params: TextStreamUrlParams): string {\n const url = buildTextStreamUrl({\n baseUrl: this.agentBaseUrl ?? this.platformBaseUrl,\n workspaceId: this.workspaceId,\n ...params,\n })\n return url.toString()\n }\n\n /**\n * Build the URL for the workspace-scoped session-connect WebSocket\n * (``WS /v1/{workspace_id}/sessions/connect``).\n *\n * Pair the returned URL with {@link sessionConnectAuthProtocols} so the\n * bearer token is delivered via the ``Sec-WebSocket-Protocol`` header \u2014 the\n * endpoint rejects query-param tokens to keep credentials out of URLs.\n *\n * @example\n * ```ts\n * const url = client.conversations.sessionConnectUrl({\n * serviceId: SERVICE_ID,\n * entityId: ENTITY_ID,\n * conversationId: existingConversationId, // optional resume\n * });\n * const ws = new WebSocket(url, sessionConnectAuthProtocols(apiKey));\n * ```\n */\n sessionConnectUrl(params: SessionConnectUrlParams): string {\n const url = buildSessionConnectUrl({\n baseUrl: this.platformBaseUrl,\n workspaceId: this.workspaceId,\n ...params,\n })\n return url.toString()\n }\n}\n\n/**\n * Build browser WebSocket subprotocols for text-stream authentication.\n *\n * @remarks The returned tuple contains the raw API key. Do not log, persist,\n * serialize, or otherwise expose this value.\n *\n * @security The second subprotocol entry is the bearer secret.\n */\nexport function textStreamAuthProtocols(apiKey: string): TextStreamAuthProtocols {\n const token = validateTextStreamAuthToken(apiKey, 'apiKey')\n if (!WEB_SOCKET_PROTOCOL_TOKEN_RE.test(token)) {\n const invalidChars = describeInvalidSubprotocolChars(token)\n throw new ConfigurationError(\n `apiKey contains characters browsers reject in WebSocket subprotocols (${invalidChars}); use the token option on client.conversations.textStreamUrl() instead for keys containing these characters, only in trusted contexts where URLs are not logged in browser history, server access logs, HTTP proxy logs, or referrer headers`,\n )\n }\n return ['auth', token] as const\n}\n\n/**\n * Build browser WebSocket subprotocols for the workspace-scoped session-connect\n * endpoint (``WS /v1/{workspace_id}/sessions/connect``).\n *\n * The wire format is identical to {@link textStreamAuthProtocols} \u2014 both\n * endpoints expect ``Sec-WebSocket-Protocol: auth, <token>`` \u2014 but the\n * session-connect endpoint has no query-param token fallback, so the API key\n * MUST round-trip through this subprotocol pair. Keys containing characters\n * browsers reject in subprotocols (e.g. ``:``, ``/``, ``=``) cannot be used\n * with the session-connect endpoint and must instead use the legacy\n * ``textStreamUrl`` path.\n *\n * @remarks The returned tuple contains the raw API key. Do not log, persist,\n * serialize, or otherwise expose this value.\n *\n * @security The second subprotocol entry is the bearer secret.\n */\nexport function sessionConnectAuthProtocols(apiKey: string): TextStreamAuthProtocols {\n return textStreamAuthProtocols(apiKey)\n}\n\nfunction buildTextStreamUrl({\n baseUrl,\n workspaceId,\n serviceId,\n conversationId,\n entityId,\n toolEvents,\n token,\n textStreamUrl: textStreamUrlOverride,\n}: TextStreamUrlParams & { baseUrl: string; workspaceId: string }): URL {\n const url = textStreamUrlOverride\n ? parseTextStreamUrlOverride(textStreamUrlOverride)\n : deriveTextStreamUrl(baseUrl)\n url.searchParams.set('workspace_id', workspaceId)\n url.searchParams.set('service_id', serviceId)\n if (conversationId) url.searchParams.set('conversation_id', conversationId)\n if (entityId) url.searchParams.set('entity_id', entityId)\n if (toolEvents) url.searchParams.set('tool_events', 'true')\n if (token !== undefined)\n url.searchParams.set('token', validateTextStreamAuthToken(token, 'token'))\n return url\n}\n\nfunction validateTextStreamAuthToken(token: string, label: string): string {\n if (!token.trim()) {\n throw new ConfigurationError(`${label} is required for text-stream authentication`)\n }\n if (token.length > MAX_AUTH_TOKEN_CHARS || !TEXT_STREAM_AUTH_TOKEN_RE.test(token)) {\n throw new ConfigurationError(\n `${label} contains characters rejected by text-stream authentication`,\n )\n }\n return token\n}\n\nfunction parseTextStreamUrlOverride(textStreamUrl: string): URL {\n try {\n const url = new URL(textStreamUrl)\n if (url.protocol !== 'ws:' && url.protocol !== 'wss:') {\n throw new ConfigurationError('textStreamUrl overrides must use ws: or wss: URLs')\n }\n // Fragment rejection is defensive; WHATWG URL parsing normalizes most\n // WebSocket fragments away, but callers should never rely on fragments here.\n if (url.search || url.hash) {\n throw new ConfigurationError(\n 'textStreamUrl overrides must not include query parameters or fragments; pass SDK-managed fields through textStreamUrl() options',\n )\n }\n return url\n } catch (cause) {\n if (cause instanceof ConfigurationError) throw cause\n throw new ConfigurationError(\n `textStreamUrl must be an absolute URL for text-stream overrides: ${String(cause)}`,\n )\n }\n}\n\nfunction deriveTextStreamUrl(baseUrl: string): URL {\n if (!/^[a-z][a-z\\d+.-]*:\\/\\//i.test(baseUrl)) {\n throw new ConfigurationError(\n 'textStreamUrl cannot be derived from a relative baseUrl; pass agentBaseUrl or textStreamUrl explicitly',\n )\n }\n\n const url = new URL(baseUrl)\n if (url.protocol === 'ws:' || url.protocol === 'wss:') {\n // Already a WebSocket URL (e.g. from agentBaseUrl) \u2014 use directly\n } else if (url.protocol === 'http:' || url.protocol === 'https:') {\n url.protocol = url.protocol === 'https:' ? 'wss:' : 'ws:'\n } else {\n throw new ConfigurationError(\n 'textStreamUrl can only be derived from an http, https, ws, or wss baseUrl; pass textStreamUrl explicitly',\n )\n }\n if (url.pathname !== '/' && url.pathname !== '') {\n throw new ConfigurationError(\n 'textStreamUrl can only be derived from an origin-only baseUrl; pass agentBaseUrl as an origin or textStreamUrl explicitly when using path-prefixed gateways',\n )\n }\n // Text streaming is served by agent-engine ingress, regardless of any REST\n // API path segments on the configured base URL.\n url.pathname = '/agent/text-stream'\n url.search = ''\n url.hash = ''\n return url\n}\n\nfunction buildSessionConnectUrl({\n baseUrl,\n workspaceId,\n serviceId,\n entityId,\n conversationId,\n toolEvents,\n sessionConnectUrl: sessionConnectUrlOverride,\n}: SessionConnectUrlParams & { baseUrl: string; workspaceId: string }): URL {\n const url = sessionConnectUrlOverride\n ? parseSessionConnectUrlOverride(sessionConnectUrlOverride)\n : deriveSessionConnectUrl(baseUrl, workspaceId)\n url.searchParams.set('service_id', serviceId)\n url.searchParams.set('entity_id', entityId)\n if (conversationId) url.searchParams.set('conversation_id', conversationId)\n // Server defaults tool_events to true. Only emit the param when the caller\n // explicitly disables it, so default URLs stay minimal and existing tests\n // can assert exact URLs without incidental query keys.\n if (toolEvents === false) url.searchParams.set('tool_events', 'false')\n return url\n}\n\nfunction parseSessionConnectUrlOverride(sessionConnectUrl: string): URL {\n try {\n const url = new URL(sessionConnectUrl)\n if (url.protocol !== 'ws:' && url.protocol !== 'wss:') {\n throw new ConfigurationError('sessionConnectUrl overrides must use ws: or wss: URLs')\n }\n if (url.search || url.hash) {\n throw new ConfigurationError(\n 'sessionConnectUrl overrides must not include query parameters or fragments; pass SDK-managed fields through sessionConnectUrl() options',\n )\n }\n return url\n } catch (cause) {\n if (cause instanceof ConfigurationError) throw cause\n throw new ConfigurationError(\n `sessionConnectUrl must be an absolute URL for session-connect overrides: ${String(cause)}`,\n )\n }\n}\n\nfunction deriveSessionConnectUrl(baseUrl: string, workspaceId: string): URL {\n if (!/^[a-z][a-z\\d+.-]*:\\/\\//i.test(baseUrl)) {\n throw new ConfigurationError(\n 'sessionConnectUrl cannot be derived from a relative baseUrl; pass sessionConnectUrl explicitly',\n )\n }\n\n const url = new URL(baseUrl)\n if (url.protocol === 'ws:' || url.protocol === 'wss:') {\n // Already a WebSocket URL \u2014 use directly.\n } else if (url.protocol === 'http:' || url.protocol === 'https:') {\n url.protocol = url.protocol === 'https:' ? 'wss:' : 'ws:'\n } else {\n throw new ConfigurationError(\n 'sessionConnectUrl can only be derived from an http, https, ws, or wss baseUrl; pass sessionConnectUrl explicitly',\n )\n }\n if (url.pathname !== '/' && url.pathname !== '') {\n throw new ConfigurationError(\n 'sessionConnectUrl can only be derived from an origin-only baseUrl; pass sessionConnectUrl explicitly when using path-prefixed gateways',\n )\n }\n url.pathname = `/v1/${workspaceId}/sessions/connect`\n url.search = ''\n url.hash = ''\n return url\n}\n\nfunction describeInvalidSubprotocolChars(token: string): string {\n const chars = new Set<string>()\n for (const char of token) {\n // Single-character regex checks are intentional: the regex is anchored for\n // full-token validation, and here we need only the offending characters.\n if (!WEB_SOCKET_PROTOCOL_TOKEN_RE.test(char)) chars.add(char)\n }\n return [...chars].map((char) => JSON.stringify(char)).join(', ')\n}\n\n// ---------------------------------------------------------------------------\n// Inline SSE parser\n//\n// Implemented inline rather than depending on `eventsource-parser` so the SDK\n// stays at two runtime deps (`openapi-fetch`, `openapi-typescript-helpers`).\n// SSE is simple enough that a ~30-line state machine reads cleaner than a\n// transitive bundle increase. Spec: https://html.spec.whatwg.org/multipage/server-sent-events.html\n// (handled fields: `event`, `data`; comments and `id`/`retry` are ignored).\n// ---------------------------------------------------------------------------\n\ninterface SSEFrame {\n event: string\n data: string\n}\n\nasync function* parseSSEFrames(\n stream: ReadableStream<Uint8Array>,\n): AsyncGenerator<SSEFrame> {\n const reader = stream.getReader()\n const decoder = new TextDecoder()\n let buffer = ''\n\n function* drain(text: string): Generator<SSEFrame> {\n buffer += text\n // Frames are terminated by a blank line (\\n\\n or \\r\\n\\r\\n).\n while (true) {\n const idx = findFrameTerminator(buffer)\n if (idx === null) break\n const block = buffer.slice(0, idx.terminatorStart)\n buffer = buffer.slice(idx.terminatorEnd)\n const frame = parseSSEBlock(block)\n if (frame) yield frame\n }\n }\n\n try {\n while (true) {\n const { done, value } = await reader.read()\n if (done) break\n yield* drain(decoder.decode(value, { stream: true }))\n }\n // Flush any partial decode + handle a final frame missing the trailing\n // blank line (defensive \u2014 well-behaved servers always terminate).\n yield* drain(decoder.decode())\n if (buffer.trim().length > 0) {\n const frame = parseSSEBlock(buffer)\n if (frame) yield frame\n buffer = ''\n }\n } finally {\n reader.releaseLock()\n }\n}\n\nfunction findFrameTerminator(\n s: string,\n): { terminatorStart: number; terminatorEnd: number } | null {\n // Prefer LF-LF; fall back to CRLF-CRLF if the server is using CRLF\n // line endings end-to-end.\n const lf = s.indexOf('\\n\\n')\n const crlf = s.indexOf('\\r\\n\\r\\n')\n if (lf < 0 && crlf < 0) return null\n if (lf < 0) return { terminatorStart: crlf, terminatorEnd: crlf + 4 }\n if (crlf < 0) return { terminatorStart: lf, terminatorEnd: lf + 2 }\n return lf < crlf\n ? { terminatorStart: lf, terminatorEnd: lf + 2 }\n : { terminatorStart: crlf, terminatorEnd: crlf + 4 }\n}\n\nfunction parseSSEBlock(block: string): SSEFrame | null {\n let event = ''\n const dataLines: string[] = []\n for (const line of block.split(/\\r?\\n/)) {\n if (line === '' || line.startsWith(':')) continue\n const colon = line.indexOf(':')\n const field = colon < 0 ? line : line.slice(0, colon)\n let value = colon < 0 ? '' : line.slice(colon + 1)\n if (value.startsWith(' ')) value = value.slice(1)\n if (field === 'event') event = value\n else if (field === 'data') dataLines.push(value)\n // `id`, `retry`, and unknown fields are ignored \u2014 we only need the\n // discriminator + payload for the typed event surface.\n }\n if (!event || dataLines.length === 0) return null\n return { event, data: dataLines.join('\\n') }\n}\n\n// ---------------------------------------------------------------------------\n// TurnStreamEvent frame validator\n//\n// Drift-tolerant: an unknown `event` discriminator or a non-object payload\n// is dropped silently (matches the behavior of the lower-level\n// `createTurnStream` plus consumer-side parsing). The strict\n// `TurnStreamEvent` static contract is preserved for downstream callers\n// because we only yield values whose `event` discriminator is one of the\n// known union members.\n// ---------------------------------------------------------------------------\n\nconst KNOWN_TURN_STREAM_EVENTS: ReadonlySet<TurnStreamEvent['event']> = new Set([\n 'token',\n 'thinking',\n 'tool_call_started',\n 'tool_call_completed',\n 'message',\n 'done',\n 'error',\n])\n\nfunction parseTurnStreamFrame(eventName: string, dataJson: string): TurnStreamEvent | null {\n if (!(KNOWN_TURN_STREAM_EVENTS as ReadonlySet<string>).has(eventName)) return null\n let payload: unknown\n try {\n payload = JSON.parse(dataJson)\n } catch {\n return null\n }\n if (typeof payload !== 'object' || payload === null || Array.isArray(payload)) return null\n // Server omits the discriminator from the JSON body (it lives in the SSE\n // `event:` line). Reattach it so the union member is well-formed.\n return { ...(payload as Record<string, unknown>), event: eventName } as TurnStreamEvent\n}\n\n", "import type { components } from '../generated/api.js'\nimport type { PhoneNumberId } from '../core/branded-types.js'\nimport { WorkspaceScopedResource, extractData } from './base.js'\nimport type { ListParams } from '../core/utils.js'\n\n/**\n * Manage phone numbers \u2014 provision, configure, and release Twilio numbers\n * that are attached to agents for inbound/outbound calling.\n */\nexport class PhoneNumbersResource extends WorkspaceScopedResource {\n /** Create a new phone number */\n async provision(body: components['schemas']['CreatePhoneNumberRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/phone-numbers', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n )\n }\n\n /** List phone numbers in the workspace */\n async list(params?: ListParams) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/phone-numbers', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n listAutoPaging(params?: ListParams) {\n return this.iteratePaginatedList((pageParams) => this.list(pageParams), params)\n }\n\n /** Get a phone number */\n async get(phoneNumberId: PhoneNumberId | string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/phone-numbers/{phone_number_id}', {\n params: { path: { workspace_id: this.workspaceId, phone_number_id: phoneNumberId } },\n }),\n )\n }\n\n /** Update a phone number (assign to agent, rename) */\n async update(\n phoneNumberId: PhoneNumberId | string,\n body: components['schemas']['UpdatePhoneNumberRequest'],\n ) {\n return extractData(\n await this.client.PUT('/v1/{workspace_id}/phone-numbers/{phone_number_id}', {\n params: { path: { workspace_id: this.workspaceId, phone_number_id: phoneNumberId } },\n body,\n }),\n )\n }\n\n /** Release a phone number back to the carrier */\n async release(phoneNumberId: PhoneNumberId | string): Promise<void> {\n await this.client.DELETE('/v1/{workspace_id}/phone-numbers/{phone_number_id}', {\n params: { path: { workspace_id: this.workspaceId, phone_number_id: phoneNumberId } },\n })\n }\n\n /** Set call forwarding for a phone number */\n async setForwarding(\n phoneNumberId: PhoneNumberId | string,\n body: components['schemas']['ForwardingConfigRequest'],\n ) {\n return extractData(\n await this.client.PUT('/v1/{workspace_id}/phone-numbers/{phone_number_id}/forwarding', {\n params: { path: { workspace_id: this.workspaceId, phone_number_id: phoneNumberId } },\n body,\n }),\n )\n }\n\n /** Clear call forwarding for a phone number */\n async clearForwarding(phoneNumberId: PhoneNumberId | string): Promise<void> {\n await this.client.DELETE('/v1/{workspace_id}/phone-numbers/{phone_number_id}/forwarding', {\n params: { path: { workspace_id: this.workspaceId, phone_number_id: phoneNumberId } },\n })\n }\n}\n", "import type { components } from '../generated/api.js'\nimport type { IntegrationId } from '../core/branded-types.js'\nimport { WorkspaceScopedResource, extractData } from './base.js'\nimport type { ListParams } from '../core/utils.js'\n\nexport interface ListIntegrationsParams extends ListParams {\n protocol?: string\n enabled?: boolean\n search?: string\n}\n\n/**\n * Manage integrations \u2014 connections to external systems (EHRs, CRMs, etc.).\n * Integrations power connector data acquisition and skill tool calls.\n */\nexport class IntegrationsResource extends WorkspaceScopedResource {\n /** Create a new integration */\n async create(body: components['schemas']['CreateIntegrationRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/integrations', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n )\n }\n\n /** List integrations */\n async list(params?: ListIntegrationsParams) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/integrations', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n listAutoPaging(params?: ListIntegrationsParams) {\n return this.iteratePaginatedList((pageParams) => this.list(pageParams), params)\n }\n\n /** Get a single integration */\n async get(integrationId: IntegrationId | string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/integrations/{integration_id}', {\n params: { path: { workspace_id: this.workspaceId, integration_id: integrationId } },\n }),\n )\n }\n\n /** Update integration configuration */\n async update(\n integrationId: IntegrationId | string,\n body: components['schemas']['UpdateIntegrationRequest'],\n ) {\n return extractData(\n await this.client.PUT('/v1/{workspace_id}/integrations/{integration_id}', {\n params: { path: { workspace_id: this.workspaceId, integration_id: integrationId } },\n body,\n }),\n )\n }\n\n /** Delete an integration */\n async delete(integrationId: IntegrationId | string): Promise<void> {\n await this.client.DELETE('/v1/{workspace_id}/integrations/{integration_id}', {\n params: { path: { workspace_id: this.workspaceId, integration_id: integrationId } },\n })\n }\n\n /**\n * Test a specific endpoint on an integration with given params.\n * Used in the developer console to validate integration config.\n */\n async testEndpoint(\n integrationId: IntegrationId | string,\n endpointName: string,\n body: components['schemas']['TestEndpointRequest'],\n ) {\n return extractData(\n await this.client.POST(\n '/v1/{workspace_id}/integrations/{integration_id}/endpoints/{endpoint_name}/test',\n {\n params: {\n path: {\n workspace_id: this.workspaceId,\n integration_id: integrationId,\n endpoint_name: endpointName,\n },\n },\n body,\n },\n ),\n )\n }\n\n /** Check health of all integrations in the workspace */\n async getHealthCheck() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/integrations/health-check', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n}\n", "import { WorkspaceScopedResource, extractData } from './base.js'\n\n/**\n * Analytics \u2014 aggregate metrics about calls, agents, quality, and usage.\n */\nexport class AnalyticsResource extends WorkspaceScopedResource {\n /** High-level dashboard summary \u2014 pass `days` (default: 7) for the lookback window */\n async getDashboard(params?: { days?: number }) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/analytics/dashboard', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n /** Call volume and duration metrics */\n async getCalls(params?: {\n days?: number\n date_from?: string | null\n date_to?: string | null\n interval?: '1h' | '1d' | '1w'\n service_id?: string | null\n }) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/analytics/calls', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n /** Per-agent performance breakdown */\n async getAgents(params?: { period?: string }) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/analytics/agents', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n /** Call quality \u2014 sentiment, transcription confidence, flagged calls */\n async getCallQuality(params?: {\n days?: number\n date_from?: string | null\n date_to?: string | null\n interval?: '1h' | '1d' | '1w'\n service_id?: string | null\n }) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/analytics/call-quality', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n /** Emotion trend data over time */\n async getEmotionTrends(params?: {\n days?: number\n date_from?: string | null\n date_to?: string | null\n interval?: '1h' | '1d' | '1w'\n service_id?: string | null\n }) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/analytics/emotion-trends', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n /** Voice pipeline latency metrics (TTFB, response time) */\n async getLatency(params?: {\n days?: number\n date_from?: string | null\n date_to?: string | null\n interval?: '1h' | '1d' | '1w'\n service_id?: string | null\n }) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/analytics/latency', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n /** Tool call performance \u2014 success rates and latency per tool */\n async getToolPerformance(params?: { days?: number }) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/analytics/tool-performance', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n /** Data quality metrics for the workspace world model */\n async getDataQuality(params?: { days?: number }) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/analytics/data-quality', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n /** Usage summary \u2014 API requests, call minutes, storage */\n async getUsage(params?: {\n days?: number\n date_from?: string | null\n date_to?: string | null\n interval?: '1h' | '1d' | '1w'\n service_id?: string | null\n direction?: string | null\n }) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/analytics/usage', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n /** Event type breakdown \u2014 counts and trends per event type */\n async getEventBreakdown(params?: { days?: number }) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/analytics/events', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n /** Safety and escalation trends \u2014 risk distribution and time-series data */\n async getSafetyTrends(params?: {\n days?: number\n date_from?: string | null\n date_to?: string | null\n interval?: '1h' | '1d' | '1w'\n service_id?: string | null\n }) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/analytics/safety-trends', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n /** Operator escalation performance and quality comparison */\n async getOperatorPerformance(params?: {\n days?: number\n date_from?: string | null\n date_to?: string | null\n interval?: '1h' | '1d' | '1w'\n service_id?: string | null\n }) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/analytics/operator-performance', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n /** Advanced call statistics (abandonment, transfers, silence, hour-of-day) */\n async getAdvancedCallStats(params?: {\n days?: number\n date_from?: string | null\n date_to?: string | null\n interval?: '1h' | '1d' | '1w'\n service_id?: string | null\n }) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/analytics/calls/advanced', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n /** Compare two time periods side by side */\n async compareCallPeriods(params: {\n current_from: string\n current_to: string\n previous_from: string\n previous_to: string\n service_id?: string\n }) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/analytics/calls/comparison', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n}\n", "import type { components } from '../generated/api.js'\nimport type { SimulationSessionId } from '../core/branded-types.js'\nimport { WorkspaceScopedResource, extractData } from './base.js'\n\n/**\n * Simulations \u2014 interactive agent testing via the Playground.\n *\n * Create a session to get the agent's greeting, then step through the\n * conversation turn by turn. Get LLM-generated caller suggestions to\n * guide exploratory testing.\n */\nexport class SimulationsResource extends WorkspaceScopedResource {\n /** Start a simulation session \u2014 returns the agent's greeting and initial snapshot */\n async createSession(\n body: components['schemas']['src__routes__simulations__CreateSessionRequest'],\n ) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/simulations/sessions', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n )\n }\n\n /** Get the current snapshot of a session */\n async getSession(sessionId: SimulationSessionId | string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/simulations/sessions/{session_id}', {\n params: { path: { workspace_id: this.workspaceId, session_id: sessionId } },\n }),\n )\n }\n\n /** Delete a simulation session */\n async deleteSession(sessionId: SimulationSessionId | string) {\n return extractData(\n await this.client.DELETE('/v1/{workspace_id}/simulations/sessions/{session_id}', {\n params: { path: { workspace_id: this.workspaceId, session_id: sessionId } },\n }),\n )\n }\n\n /**\n * Send a caller utterance and advance the session by one turn.\n * Returns the agent's response observation and updated snapshot.\n */\n async step(body: components['schemas']['StepRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/simulations/sessions/step', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n )\n }\n\n /**\n * Get LLM-generated caller message suggestions for the current session state.\n * Helps exploratory testing by suggesting realistic next caller turns.\n */\n async recommend(body: components['schemas']['RecommendRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/simulations/sessions/recommend', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n )\n }\n\n /** Get AI-generated call intelligence for a completed session */\n async getIntelligence(sessionId: SimulationSessionId | string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/simulations/sessions/{session_id}/intelligence', {\n params: { path: { workspace_id: this.workspaceId, session_id: sessionId } },\n }),\n )\n }\n}\n", "import type { components, operations } from '../generated/api.js'\nimport { WorkspaceScopedResource, extractData } from './base.js'\n\nexport type MetricCatalogEntry = components['schemas']['MetricCatalogEntry']\nexport type MetricCatalogResponse = components['schemas']['MetricCatalogResponse']\nexport type MetricListResponse = components['schemas']['MetricListResponse']\nexport type NumericalMetricValue = components['schemas']['NumericalMetricValueResponse']\nexport type CategoricalMetricValue = components['schemas']['CategoricalMetricValueResponse']\nexport type BooleanMetricValue = components['schemas']['BooleanMetricValueResponse']\nexport type MetricValue = NumericalMetricValue | CategoricalMetricValue | BooleanMetricValue\n/** @deprecated Use `MetricValue` instead. */\nexport type MetricValueResponse = MetricValue\nexport type MetricValuesParams = NonNullable<operations['get-metric-values']['parameters']['query']>\nexport type MetricTrendParams = NonNullable<operations['get-metric-trend']['parameters']['query']>\n\n/**\n * Metrics \u2014 computed metric catalog and typed metric values.\n */\nexport class MetricsResource extends WorkspaceScopedResource {\n /** List the latest value for each metric in the workspace */\n async listLatest() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/metrics', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n\n /** List available built-in and custom metric definitions */\n async getCatalog() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/metrics/catalog', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n\n /** Get stored values for one metric key, optionally bounded by time range */\n async getValues(metricKey: string, params?: MetricValuesParams) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/metrics/{metric_key}', {\n params: {\n path: { workspace_id: this.workspaceId, metric_key: metricKey },\n query: params,\n },\n }),\n )\n }\n\n /** Get a recent time-series trend for one metric key */\n async getTrend(metricKey: string, params?: MetricTrendParams) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/metrics/{metric_key}/trend', {\n params: {\n path: { workspace_id: this.workspaceId, metric_key: metricKey },\n query: params,\n },\n }),\n )\n }\n}\n", "import type { components } from '../generated/api.js'\nimport { WorkspaceScopedResource, extractData } from './base.js'\n\n/**\n * Workspace-level settings \u2014 configure voice behavior, branding, security\n * policies, data retention, outreach rules, and more.\n *\n * Each sub-resource has `get()` and `update()`.\n */\nexport class SettingsResource extends WorkspaceScopedResource {\n readonly voice = {\n get: async () =>\n extractData(\n await this.client.GET('/v1/{workspace_id}/settings/voice', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n ),\n update: async (body: components['schemas']['VoiceSettingsRequest']) =>\n extractData(\n await this.client.PUT('/v1/{workspace_id}/settings/voice', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n ),\n }\n\n readonly branding = {\n get: async () =>\n extractData(\n await this.client.GET('/v1/{workspace_id}/settings/branding', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n ),\n update: async (body: components['schemas']['BrandingSettingsRequest']) =>\n extractData(\n await this.client.PUT('/v1/{workspace_id}/settings/branding', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n ),\n }\n\n readonly outreach = {\n get: async () =>\n extractData(\n await this.client.GET('/v1/{workspace_id}/settings/outreach', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n ),\n update: async (body: components['schemas']['OutreachSettingsRequest']) =>\n extractData(\n await this.client.PUT('/v1/{workspace_id}/settings/outreach', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n ),\n }\n\n readonly memory = {\n get: async () =>\n extractData(\n await this.client.GET('/v1/{workspace_id}/settings/memory', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n ),\n update: async (body: components['schemas']['MemorySettingsRequest']) =>\n extractData(\n await this.client.PUT('/v1/{workspace_id}/settings/memory', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n ),\n }\n\n readonly security = {\n get: async () =>\n extractData(\n await this.client.GET('/v1/{workspace_id}/settings/security', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n ),\n update: async (body: components['schemas']['SecuritySettingsRequest']) =>\n extractData(\n await this.client.PUT('/v1/{workspace_id}/settings/security', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n ),\n }\n\n readonly retention = {\n get: async () =>\n extractData(\n await this.client.GET('/v1/{workspace_id}/settings/retention', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n ),\n update: async (body: components['schemas']['RetentionPolicyRequest']) =>\n extractData(\n await this.client.PUT('/v1/{workspace_id}/settings/retention', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n ),\n }\n\n readonly behaviors = {\n get: async () =>\n extractData(\n await this.client.GET('/v1/{workspace_id}/settings/behaviors', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n ),\n update: async (body: components['schemas']['BehaviorSettingsRequest']) =>\n extractData(\n await this.client.PUT('/v1/{workspace_id}/settings/behaviors', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n ),\n }\n\n readonly gapScanner = {\n get: async () =>\n extractData(\n await this.client.GET('/v1/{workspace_id}/settings/gap-scanner', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n ),\n update: async (body: components['schemas']['GapScannerSettingsRequest']) =>\n extractData(\n await this.client.PUT('/v1/{workspace_id}/settings/gap-scanner', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n ),\n }\n\n readonly scribe = {\n get: async () =>\n extractData(\n await this.client.GET('/v1/{workspace_id}/settings/scribe', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n ),\n update: async (body: components['schemas']['ScribeSettingsRequest']) =>\n extractData(\n await this.client.PUT('/v1/{workspace_id}/settings/scribe', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n ),\n }\n\n readonly metrics = {\n get: async () =>\n extractData(\n await this.client.GET('/v1/{workspace_id}/settings/metrics', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n ),\n update: async (body: components['schemas']['MetricSettingsRequest']) =>\n extractData(\n await this.client.PUT('/v1/{workspace_id}/settings/metrics', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n ),\n }\n\n readonly environments = {\n get: async () =>\n extractData(\n await this.client.GET('/v1/{workspace_id}/settings/environments', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n ),\n update: async (body: components['schemas']['EnvironmentSettingsRequest']) =>\n extractData(\n await this.client.PUT('/v1/{workspace_id}/settings/environments', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n ),\n }\n\n readonly workflows = {\n get: async () =>\n extractData(\n await this.client.GET('/v1/{workspace_id}/settings/workflows', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n ),\n update: async (body: components['schemas']['WorkflowSettingsRequest']) =>\n extractData(\n await this.client.PUT('/v1/{workspace_id}/settings/workflows', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n ),\n }\n}\n", "import { WorkspaceScopedResource, extractData } from './base.js'\nimport type { ListParams } from '../core/utils.js'\n\nexport interface ListInvoicesParams extends ListParams {\n status?: 'draft' | 'sent' | 'paid' | 'void'\n date_from?: string\n date_to?: string\n}\n\nexport interface UsageTrendsParams {\n days?: number\n date_from?: string\n date_to?: string\n meter_key?: string\n}\n\n/**\n * Billing \u2014 dashboard, usage summaries, invoices, and usage trends.\n */\nexport class BillingResource extends WorkspaceScopedResource {\n /** Get composite billing dashboard \u2014 KPIs, period comparison, top meters, invoice summary */\n async getDashboard() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/billing/dashboard', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n\n /** Get usage summary for the workspace */\n async getUsage() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/billing/usage', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n\n /** Get usage time-series per meter for trend charts */\n async getUsageTrends(params?: UsageTrendsParams) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/billing/usage/trends', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n /** List invoices for the workspace */\n async listInvoices(params?: ListInvoicesParams) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/billing/invoices', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n listInvoicesAutoPaging(params?: ListInvoicesParams) {\n return this.iteratePaginatedList((pageParams) => this.listInvoices(pageParams), params)\n }\n\n /** Get invoice detail */\n async getInvoice(invoiceId: string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/billing/invoices/{invoice_id}', {\n params: { path: { workspace_id: this.workspaceId, invoice_id: invoiceId } },\n }),\n )\n }\n\n /** Get presigned S3 URL for invoice PDF download */\n async getInvoicePdf(invoiceId: string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/billing/invoices/{invoice_id}/pdf', {\n params: { path: { workspace_id: this.workspaceId, invoice_id: invoiceId } },\n }),\n )\n }\n}\n", "import type { EntityId } from '../core/branded-types.js'\nimport { WorkspaceScopedResource, extractData } from './base.js'\n\n/**\n * Agent Memory \u2014 structured long-term memory for entities.\n *\n * Memory is organised into dimensions (e.g. \"preferences\", \"health_history\").\n * Each dimension accumulates facts extracted from calls and events over time.\n * This powers the \"Agent Memory\" view in the console.\n */\nexport class MemoryResource extends WorkspaceScopedResource {\n /**\n * Get all memory dimension scores for an entity.\n * Scores reflect how complete and confident each dimension's facts are.\n */\n async getEntityDimensions(entityId: EntityId | string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/memory/{entity_id}/dimensions', {\n params: { path: { workspace_id: this.workspaceId, entity_id: entityId } },\n }),\n )\n }\n\n /**\n * Get individual memory facts for an entity, optionally filtered by dimension.\n */\n async getEntityFacts(\n entityId: EntityId | string,\n params?: { dimension?: string; limit?: number },\n ) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/memory/{entity_id}/facts', {\n params: {\n path: { workspace_id: this.workspaceId, entity_id: entityId },\n query: params,\n },\n }),\n )\n }\n\n /**\n * Get workspace-level memory analytics \u2014 coverage rates, dimension health,\n * and fact ingestion trends.\n */\n async getAnalytics() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/memory/analytics', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n}\n", "import type { components } from '../generated/api.js'\nimport type { PersonaId } from '../core/branded-types.js'\nimport { WorkspaceScopedResource, extractData } from './base.js'\nimport type { ListParams } from '../core/utils.js'\n\nexport interface ListPersonasParams extends ListParams {\n search?: string | null\n sort_by?: string | null\n}\n\nexport class PersonasResource extends WorkspaceScopedResource {\n async list(params?: ListPersonasParams) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/personas', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n listAutoPaging(params?: ListPersonasParams) {\n return this.iteratePaginatedList((pageParams) => this.list(pageParams), params)\n }\n\n async create(body: components['schemas']['CreatePersonaRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/personas', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n )\n }\n\n async get(personaId: PersonaId | string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/personas/{persona_id}', {\n params: { path: { workspace_id: this.workspaceId, persona_id: personaId } },\n }),\n )\n }\n\n async update(personaId: PersonaId | string, body: components['schemas']['UpdatePersonaRequest']) {\n return extractData(\n await this.client.PATCH('/v1/{workspace_id}/personas/{persona_id}', {\n params: { path: { workspace_id: this.workspaceId, persona_id: personaId } },\n body,\n }),\n )\n }\n\n async delete(personaId: PersonaId | string): Promise<void> {\n await this.client.DELETE('/v1/{workspace_id}/personas/{persona_id}', {\n params: { path: { workspace_id: this.workspaceId, persona_id: personaId } },\n })\n }\n}\n", "import type { components } from '../generated/api.js'\nimport { WorkspaceScopedResource, extractData } from './base.js'\nimport type { ListParams } from '../core/utils.js'\n\nexport interface ListReviewItemsParams extends ListParams {\n status?: string | null\n entity_type?: string | null\n priority?: number | null\n reason?: string | null\n assigned_to?: string | null\n created_after?: string | null\n created_before?: string | null\n sort_by?: string | null\n sort_order?: string\n}\n\nexport interface ReviewHistoryParams extends ListParams {\n action?: string | null\n reviewed_by?: string | null\n completed_after?: string | null\n completed_before?: string | null\n}\n\nexport class ReviewQueueResource extends WorkspaceScopedResource {\n async list(params?: ListReviewItemsParams) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/review-queue', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n listAutoPaging(params?: ListReviewItemsParams) {\n return this.iteratePaginatedList((pageParams) => this.list(pageParams), params)\n }\n\n async get(itemId: string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/review-queue/{item_id}', {\n params: { path: { workspace_id: this.workspaceId, item_id: itemId } },\n }),\n )\n }\n\n async getStats() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/review-queue/stats', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n\n async getDashboard() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/review-queue/dashboard', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n\n async getMyQueue(params?: ListParams) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/review-queue/my-queue', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n getMyQueueAutoPaging(params?: ListParams) {\n return this.iteratePaginatedList((pageParams) => this.getMyQueue(pageParams), params)\n }\n\n async approve(itemId: string, body: components['schemas']['ApproveRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/review-queue/{item_id}/approve', {\n params: { path: { workspace_id: this.workspaceId, item_id: itemId } },\n body,\n }),\n )\n }\n\n async reject(itemId: string, body: components['schemas']['RejectRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/review-queue/{item_id}/reject', {\n params: { path: { workspace_id: this.workspaceId, item_id: itemId } },\n body,\n }),\n )\n }\n\n async claim(itemId: string) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/review-queue/{item_id}/claim', {\n params: { path: { workspace_id: this.workspaceId, item_id: itemId } },\n }),\n )\n }\n\n async unclaim(itemId: string) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/review-queue/{item_id}/unclaim', {\n params: { path: { workspace_id: this.workspaceId, item_id: itemId } },\n }),\n )\n }\n\n async correct(itemId: string, body: components['schemas']['CorrectRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/review-queue/{item_id}/correct', {\n params: { path: { workspace_id: this.workspaceId, item_id: itemId } },\n body,\n }),\n )\n }\n\n async batchApprove(body: components['schemas']['BatchApproveRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/review-queue/batch-approve', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n )\n }\n\n async batchReject(body: components['schemas']['BatchRejectRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/review-queue/batch-reject', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n )\n }\n\n async getHistory(params?: ReviewHistoryParams) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/review-queue/history', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n getHistoryAutoPaging(params?: ReviewHistoryParams) {\n return this.iteratePaginatedList((pageParams) => this.getHistory(pageParams), params)\n }\n\n async getTrends(params?: { days?: number }) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/review-queue/trends', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n async getPerformance(params?: { days?: number }) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/review-queue/performance', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n async getCorrectionSchema(itemId: string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/review-queue/{item_id}/correction-schema', {\n params: { path: { workspace_id: this.workspaceId, item_id: itemId } },\n }),\n )\n }\n\n async getDiff(itemId: string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/review-queue/{item_id}/diff', {\n params: { path: { workspace_id: this.workspaceId, item_id: itemId } },\n }),\n )\n }\n}\n", "import { WorkspaceScopedResource, extractData } from './base.js'\n\nexport class RecordingsResource extends WorkspaceScopedResource {\n async getUrls(callSid: string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/recordings/{call_sid}/urls', {\n params: { path: { workspace_id: this.workspaceId, call_sid: callSid } },\n }),\n )\n }\n\n async getMetadata(callSid: string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/recordings/{call_sid}/metadata', {\n params: { path: { workspace_id: this.workspaceId, call_sid: callSid } },\n }),\n )\n }\n\n async download(callSid: string, filename: string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/recordings/{call_sid}/download/{filename}', {\n params: { path: { workspace_id: this.workspaceId, call_sid: callSid, filename } },\n }),\n )\n }\n}\n", "import type { components } from '../generated/api.js'\nimport { WorkspaceScopedResource, extractData } from './base.js'\n\nexport interface ListAuditParams {\n service?: string | null\n action?: string | null\n actor_entity_id?: string | null\n resource_type?: string | null\n resource_id?: string | null\n phi_only?: boolean\n date_from?: string | null\n date_to?: string | null\n limit?: number\n offset?: number\n}\n\nexport interface PhiAccessParams {\n entity_id?: string | null\n date_from?: string | null\n date_to?: string | null\n limit?: number\n offset?: number\n}\n\nexport interface EntityAccessLogParams {\n date_from?: string | null\n date_to?: string | null\n limit?: number\n offset?: number\n}\n\nexport class AuditResource extends WorkspaceScopedResource {\n async list(params?: ListAuditParams) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/audit', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n listAutoPaging(params?: ListAuditParams) {\n return this.iterateOffsetPaginatedList(\n (pageParams) => this.list(pageParams),\n (page) => page.events,\n params,\n )\n }\n\n async getSummary(params?: { date_from?: string | null; date_to?: string | null }) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/audit/summary', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n async getPhiAccess(params?: PhiAccessParams) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/audit/phi-access', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n getPhiAccessAutoPaging(params?: PhiAccessParams) {\n return this.iterateOffsetPaginatedList(\n (pageParams) => this.getPhiAccess(pageParams),\n (page) => page.events,\n params,\n )\n }\n\n async createExport(body: components['schemas']['AuditExportRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/audit/export', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n )\n }\n\n async listExports() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/audit/exports', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n\n async getEntityAccessLog(entityId: string, params?: EntityAccessLogParams) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/audit/entity/{entity_id}/access-log', {\n params: { path: { workspace_id: this.workspaceId, entity_id: entityId }, query: params },\n }),\n )\n }\n\n getEntityAccessLogAutoPaging(entityId: string, params?: EntityAccessLogParams) {\n return this.iterateOffsetPaginatedList(\n (pageParams) => this.getEntityAccessLog(entityId, pageParams),\n (page) => page.events,\n params,\n )\n }\n}\n", "import type { components } from '../generated/api.js'\nimport { WorkspaceScopedResource, extractData } from './base.js'\nimport type { ListParams } from '../core/utils.js'\n\nexport class WebhookDestinationsResource extends WorkspaceScopedResource {\n async list(params?: ListParams) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/webhook-destinations', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n listAutoPaging(params?: ListParams) {\n return this.iteratePaginatedList((pageParams) => this.list(pageParams), params)\n }\n\n async create(body: components['schemas']['CreateWebhookDestinationRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/webhook-destinations', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n )\n }\n\n async get(destinationId: string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/webhook-destinations/{destination_id}', {\n params: { path: { workspace_id: this.workspaceId, destination_id: destinationId } },\n }),\n )\n }\n\n async update(\n destinationId: string,\n body: components['schemas']['UpdateWebhookDestinationRequest'],\n ) {\n return extractData(\n await this.client.PUT('/v1/{workspace_id}/webhook-destinations/{destination_id}', {\n params: { path: { workspace_id: this.workspaceId, destination_id: destinationId } },\n body,\n }),\n )\n }\n\n async delete(destinationId: string): Promise<void> {\n await this.client.DELETE('/v1/{workspace_id}/webhook-destinations/{destination_id}', {\n params: { path: { workspace_id: this.workspaceId, destination_id: destinationId } },\n })\n }\n\n async listDeliveries(destinationId: string, params?: ListParams) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/webhook-destinations/{destination_id}/deliveries', {\n params: {\n path: { workspace_id: this.workspaceId, destination_id: destinationId },\n query: params,\n },\n }),\n )\n }\n\n listDeliveriesAutoPaging(destinationId: string, params?: ListParams) {\n return this.iteratePaginatedList(\n (pageParams) => this.listDeliveries(destinationId, pageParams),\n params,\n )\n }\n\n async rotateSecret(destinationId: string) {\n return extractData(\n await this.client.POST(\n '/v1/{workspace_id}/webhook-destinations/{destination_id}/rotate-secret',\n {\n params: { path: { workspace_id: this.workspaceId, destination_id: destinationId } },\n },\n ),\n )\n }\n}\n", "import type { components } from '../generated/api.js'\nimport { WorkspaceScopedResource, extractData } from './base.js'\n\nexport class SafetyResource extends WorkspaceScopedResource {\n async getConfig() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/safety/config', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n\n async updateConfig(body: components['schemas']['UpdateSafetyConfigRequest']) {\n return extractData(\n await this.client.PUT('/v1/{workspace_id}/safety/config', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n )\n }\n\n async listTemplates() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/safety/templates', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n\n async getTemplate(templateId: string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/safety/templates/{template_id}', {\n params: { path: { workspace_id: this.workspaceId, template_id: templateId } },\n }),\n )\n }\n\n async applyTemplate(templateId: string, body: components['schemas']['ApplyTemplateRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/safety/templates/{template_id}/apply', {\n params: { path: { workspace_id: this.workspaceId, template_id: templateId } },\n body,\n }),\n )\n }\n}\n", "import { WorkspaceScopedResource, extractData } from './base.js'\n\nexport class ComplianceResource extends WorkspaceScopedResource {\n async getDashboard() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/compliance/dashboard', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n\n async getHipaa(params?: { report_period_days?: number }) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/compliance/hipaa', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n async getAccessReview() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/compliance/access-review', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n}\n", "/**\n * Real-time workspace event streaming via Server-Sent Events.\n *\n * Subscribes to ``GET /v1/{workspace_id}/events/stream`` and yields typed\n * {@link WorkspaceSSEEvent} values. The platform-api endpoint:\n *\n * - Streams ``text/event-stream`` over HTTP/1.1\n * - Sends ``retry: 3000`` directive as the first frame\n * - Tags every event with ``id: <millisecond-timestamp>`` for replay\n * - Buffers the last 5 minutes of events in Valkey for gapless reconnect\n * - Pops the discriminator (``event_type``) out of the JSON ``data:``\n * payload and into the SSE ``event:`` line \u2014 this helper reattaches\n * it before yielding the typed union member\n *\n * Implementation choice: this helper uses the SDK's own fetch transport\n * (with auth + retry middleware applied) rather than the WHATWG\n * ``EventSource`` API or the ``eventsource`` polyfill. The reasons are:\n *\n * 1. ``EventSource`` cannot send ``Authorization`` headers \u2014 the polyfill\n * can, but adds a runtime dep and bypasses the SDK's BFF-proxy /\n * custom-fetch / mock-fetch composition.\n * 2. Reusing the existing ``createTurnStream`` pattern keeps a single\n * SSE parser in the SDK and shares the auth middleware that already\n * attaches the bearer token on every request.\n * 3. The SDK ships with two runtime deps (``openapi-fetch`` +\n * ``openapi-typescript-helpers``); adding ``eventsource`` would inflate\n * bundle size for a feature that fetch streaming handles cleanly.\n *\n * The trade-off is that we reimplement the reconnect loop. The platform-api\n * advertises ``retry: 3000`` and we honor that as the initial backoff,\n * doubling with full jitter on each successive failure up to ``maxDelayMs``.\n *\n * @see ConversationsResource.streamTurn for the analogous turn-stream helper.\n */\n\nimport type { components } from '../generated/api.js'\nimport { type PlatformFetch } from '../core/openapi-client.js'\nimport { WorkspaceScopedResource } from './base.js'\n\n/**\n * Discriminated union of every workspace SSE event variant exposed by\n * platform-api. Members carry their own ``event_type`` literal \u2014 narrow\n * with ``switch (event.event_type)`` to access typed payload fields.\n */\nexport type WorkspaceSSEEvent = components['schemas']['WorkspaceSSEEvent']\n\n/** Discriminator literal for {@link WorkspaceSSEEvent} members. */\nexport type WorkspaceSSEEventType = WorkspaceSSEEvent['event_type']\n\n/**\n * Options for {@link EventsResource.subscribeToWorkspace}.\n */\nexport interface SubscribeToWorkspaceOptions {\n /**\n * Resume from a previously seen event id. Forwarded as the\n * ``Last-Event-ID`` request header on the first connect; the server\n * replays buffered events with id > ``lastEventId`` before switching to\n * live pub/sub. The SDK automatically tracks the most recent id during\n * the stream and re-sends it on every reconnect.\n *\n * Event ids are millisecond Unix timestamps; pass them as raw numeric\n * strings.\n */\n lastEventId?: string\n\n /**\n * Cancellation signal. Aborting the signal closes the underlying fetch\n * stream and stops the reconnect loop.\n */\n signal?: AbortSignal\n\n /** Invoked once per parsed, typed event. */\n onEvent: (event: WorkspaceSSEEvent) => void\n\n /**\n * Invoked on a terminal error (e.g., 401 / 403, abort, or reconnect\n * budget exhausted). Will not be called more than once per\n * ``subscribeToWorkspace`` invocation.\n */\n onError?: (error: Error) => void\n\n /**\n * Invoked just before each reconnect attempt with the 1-based attempt\n * number. The first connection (attempt 0) does not fire this.\n */\n onReconnect?: (attempt: number) => void\n\n /**\n * Initial reconnect delay in milliseconds. Defaults to 3000 to match\n * the platform-api ``retry:`` directive. The actual delay grows\n * exponentially (with jitter) up to ``maxDelayMs`` per failure.\n */\n initialDelayMs?: number\n\n /** Cap on the reconnect backoff delay in milliseconds. Defaults to 30s. */\n maxDelayMs?: number\n\n /**\n * Maximum number of reconnect attempts before giving up and calling\n * ``onError``. Defaults to 10. Set to ``Infinity`` to retry forever\n * (the consumer is then responsible for aborting via ``signal``).\n */\n maxReconnects?: number\n}\n\n/**\n * Handle returned by {@link EventsResource.subscribeToWorkspace}.\n *\n * Resolves when the stream terminates \u2014 either because the consumer\n * aborted via ``signal``, an unrecoverable error fired ``onError``, or\n * the reconnect budget was exhausted. The promise never rejects; consume\n * errors via ``onError``.\n */\nexport interface SubscriptionHandle {\n /**\n * Returns a promise that resolves once the subscription has fully\n * stopped (post-abort cleanup complete, no further callbacks pending).\n */\n done: Promise<void>\n\n /**\n * Stop the subscription. Equivalent to aborting the caller-supplied\n * ``AbortSignal``. Idempotent.\n */\n unsubscribe(): void\n}\n\nconst DEFAULT_INITIAL_DELAY_MS = 3000\nconst DEFAULT_MAX_DELAY_MS = 30000\nconst DEFAULT_MAX_RECONNECTS = 10\n// Hard ceiling on a single SSE field value to defend against a misbehaving\n// upstream that streams without ever emitting a frame terminator. 1 MiB is\n// far above any legitimate platform event payload (most are <2 KiB).\nconst MAX_FRAME_BYTES = 1_048_576\n\n/**\n * Real-time event stream resource.\n *\n * @example\n * ```ts\n * const handle = client.events.subscribeToWorkspace({\n * onEvent: (event) => {\n * switch (event.event_type) {\n * case 'call.started':\n * console.log('Call started:', event.call_sid)\n * break\n * case 'pipeline.error':\n * console.error('Pipeline error:', event)\n * break\n * }\n * },\n * onError: (err) => console.error('Stream error:', err),\n * onReconnect: (attempt) => console.warn(`Reconnect #${attempt}`),\n * })\n *\n * // Later, to stop:\n * handle.unsubscribe()\n * await handle.done\n * ```\n */\nexport class EventsResource extends WorkspaceScopedResource {\n constructor(client: PlatformFetch, workspaceId: string) {\n super(client, workspaceId)\n }\n\n /**\n * Subscribe to the workspace event stream.\n *\n * Establishes an SSE connection to ``/v1/{workspace_id}/events/stream``\n * and invokes ``onEvent`` once per typed {@link WorkspaceSSEEvent}.\n * Unrecoverable failures (auth errors, exhausted reconnect budget,\n * caller abort) surface through ``onError``.\n *\n * Reconnection is automatic: on a network drop or 5xx, the helper\n * backs off (initial delay derived from the ``retry:`` directive,\n * default 3s, doubling with full jitter up to ``maxDelayMs``) and\n * resumes with the most recently seen ``Last-Event-ID``. The platform\n * buffers 5 minutes of events for gapless replay.\n *\n * @returns a {@link SubscriptionHandle} for cleanup. Aborting the\n * caller's ``signal`` is equivalent to calling ``unsubscribe()``.\n */\n subscribeToWorkspace(options: SubscribeToWorkspaceOptions): SubscriptionHandle {\n const localController = new AbortController()\n const cleanups: Array<() => void> = []\n\n if (options.signal) {\n if (options.signal.aborted) {\n localController.abort(options.signal.reason)\n } else {\n const onAbort = (): void => localController.abort(options.signal?.reason)\n options.signal.addEventListener('abort', onAbort, { once: true })\n cleanups.push(() => options.signal?.removeEventListener('abort', onAbort))\n }\n }\n\n const done = runSubscription(\n this.client,\n this.workspaceId,\n options,\n localController.signal,\n ).finally(() => {\n for (const cleanup of cleanups) cleanup()\n })\n\n return {\n done,\n unsubscribe: () => localController.abort(),\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Internal helpers\n// ---------------------------------------------------------------------------\n\ntype StreamOutcome =\n | { kind: 'aborted' }\n | { kind: 'auth-error'; error: Error }\n | { kind: 'transport-error'; reason: string }\n\nasync function runSubscription(\n client: PlatformFetch,\n workspaceId: string,\n options: SubscribeToWorkspaceOptions,\n signal: AbortSignal,\n): Promise<void> {\n let lastEventId = options.lastEventId\n let attempt = 0\n let delayMs = options.initialDelayMs ?? DEFAULT_INITIAL_DELAY_MS\n const maxDelayMs = options.maxDelayMs ?? DEFAULT_MAX_DELAY_MS\n const maxReconnects = options.maxReconnects ?? DEFAULT_MAX_RECONNECTS\n let errorReported = false\n\n const reportError = (error: Error): void => {\n if (errorReported) return\n errorReported = true\n try {\n options.onError?.(error)\n } catch {\n // Consumer-supplied callback raised \u2014 swallow to keep teardown clean.\n }\n }\n\n while (!signal.aborted) {\n if (attempt > 0) {\n try {\n options.onReconnect?.(attempt)\n } catch {\n // Consumer-supplied callback raised \u2014 swallow to keep teardown clean.\n }\n }\n\n let outcome: StreamOutcome\n try {\n outcome = await runOneConnection({\n client,\n workspaceId,\n lastEventId,\n signal,\n onEvent: options.onEvent,\n onIdAdvance: (id) => {\n lastEventId = id\n },\n onRetryDirective: (ms) => {\n // Server-sent retry directive resets the backoff floor.\n delayMs = clampDelay(ms, options.initialDelayMs, maxDelayMs)\n },\n })\n } catch (err) {\n // runOneConnection surfaces only terminal auth errors via throw;\n // everything else is a StreamOutcome.\n reportError(err instanceof Error ? err : new Error(String(err)))\n return\n }\n\n if (signal.aborted || outcome.kind === 'aborted') {\n return\n }\n\n if (outcome.kind === 'auth-error') {\n // 401 / 403 \u2014 never auto-retry. The token is invalid and the\n // stream cannot succeed without operator intervention.\n reportError(outcome.error)\n return\n }\n\n if (attempt >= maxReconnects) {\n reportError(\n new Error(\n `SSE subscription exhausted reconnect budget (${maxReconnects}): ${outcome.reason}`,\n ),\n )\n return\n }\n\n attempt += 1\n const sleepMs = jitter(delayMs)\n delayMs = Math.min(delayMs * 2, maxDelayMs)\n const slept = await abortableSleep(sleepMs, signal)\n if (!slept) return\n }\n}\n\ninterface RunOneConnectionArgs {\n client: PlatformFetch\n workspaceId: string\n lastEventId: string | undefined\n signal: AbortSignal\n onEvent: (event: WorkspaceSSEEvent) => void\n onIdAdvance: (id: string) => void\n onRetryDirective: (ms: number) => void\n}\n\nasync function runOneConnection(args: RunOneConnectionArgs): Promise<StreamOutcome> {\n const headers: Record<string, string> = { Accept: 'text/event-stream' }\n if (args.lastEventId !== undefined) {\n headers['Last-Event-ID'] = args.lastEventId\n }\n\n let result: { data?: unknown; error?: unknown; response?: Response }\n try {\n result = await args.client.GET('/v1/{workspace_id}/events/stream', {\n params: { path: { workspace_id: args.workspaceId } },\n headers,\n parseAs: 'stream',\n signal: args.signal,\n })\n } catch (err) {\n if (args.signal.aborted) return { kind: 'aborted' }\n const error = err instanceof Error ? err : new Error(String(err))\n // 4xx (including 401 / 403) are surfaced as thrown AmigoErrors by the\n // SDK error middleware. Distinguish those from transport failures.\n const status = readStatus(error)\n if (status === 401 || status === 403) {\n return { kind: 'auth-error', error }\n }\n return { kind: 'transport-error', reason: error.message }\n }\n\n if (result.error !== undefined) {\n // openapi-fetch surfaces non-OK responses as `error`. The SDK error\n // middleware should have thrown \u2014 fall through defensively.\n return { kind: 'transport-error', reason: `API error: ${safeStringify(result.error)}` }\n }\n\n const body = result.data\n if (!(body instanceof ReadableStream)) {\n return { kind: 'transport-error', reason: 'Expected ReadableStream body for SSE' }\n }\n\n try {\n for await (const frame of parseSSEFrames(body, args.signal)) {\n if (args.signal.aborted) return { kind: 'aborted' }\n if (frame.retry !== undefined) {\n args.onRetryDirective(frame.retry)\n }\n if (frame.id !== undefined) {\n args.onIdAdvance(frame.id)\n }\n if (frame.event && frame.data !== undefined) {\n const event = parseWorkspaceFrame(frame.event, frame.data)\n if (event) {\n try {\n args.onEvent(event)\n } catch {\n // Consumer threw during onEvent; do not let it kill the\n // subscription. The stream is still healthy.\n }\n }\n }\n }\n } catch (err) {\n if (args.signal.aborted) return { kind: 'aborted' }\n const reason = err instanceof Error ? err.message : String(err)\n return { kind: 'transport-error', reason }\n }\n\n if (args.signal.aborted) return { kind: 'aborted' }\n // Reader closed cleanly \u2014 server EOF. Treat as recoverable; reconnect\n // with whatever Last-Event-ID we have.\n return { kind: 'transport-error', reason: 'Stream closed by server' }\n}\n\ninterface SSEFrame {\n event: string\n data: string | undefined\n id: string | undefined\n retry: number | undefined\n}\n\n/**\n * Parses an SSE byte stream into structured frames.\n *\n * Forks the parser in {@link ConversationsResource.streamTurn} to also\n * surface ``id:`` and ``retry:`` lines that the workspace event stream\n * relies on for gapless reconnect.\n */\nasync function* parseSSEFrames(\n stream: ReadableStream<Uint8Array>,\n signal: AbortSignal,\n): AsyncGenerator<SSEFrame> {\n const reader = stream.getReader()\n const decoder = new TextDecoder()\n let buffer = ''\n\n // When the caller aborts, cancel the reader so any in-flight\n // ``reader.read()`` resolves immediately with ``{done: true}`` (or rejects\n // with ``AbortError``, which we trap in the consumer). Without this, an\n // idle SSE stream keeps the read pending indefinitely after abort.\n let cancelled = false\n const onAbort = (): void => {\n if (cancelled) return\n cancelled = true\n void reader.cancel().catch(() => {\n // Already cancelled or locked elsewhere; safe to ignore.\n })\n }\n let removeAbortHandler: (() => void) | undefined\n if (signal.aborted) {\n onAbort()\n } else {\n signal.addEventListener('abort', onAbort, { once: true })\n removeAbortHandler = () => signal.removeEventListener('abort', onAbort)\n }\n\n function* drain(text: string): Generator<SSEFrame> {\n buffer += text\n if (buffer.length > MAX_FRAME_BYTES) {\n throw new Error(`SSE frame buffer exceeded ${MAX_FRAME_BYTES} bytes without terminator`)\n }\n while (true) {\n const idx = findFrameTerminator(buffer)\n if (idx === null) break\n const block = buffer.slice(0, idx.terminatorStart)\n buffer = buffer.slice(idx.terminatorEnd)\n const frame = parseSSEBlock(block)\n if (frame) yield frame\n }\n }\n\n try {\n while (true) {\n const { done, value } = await reader.read()\n if (done) break\n yield* drain(decoder.decode(value, { stream: true }))\n }\n yield* drain(decoder.decode())\n if (buffer.trim().length > 0) {\n const frame = parseSSEBlock(buffer)\n if (frame) yield frame\n buffer = ''\n }\n } finally {\n removeAbortHandler?.()\n try {\n reader.releaseLock()\n } catch {\n // releaseLock can throw if the reader is already detached; ignore.\n }\n }\n}\n\nfunction findFrameTerminator(s: string): { terminatorStart: number; terminatorEnd: number } | null {\n const lf = s.indexOf('\\n\\n')\n const crlf = s.indexOf('\\r\\n\\r\\n')\n if (lf < 0 && crlf < 0) return null\n if (lf < 0) return { terminatorStart: crlf, terminatorEnd: crlf + 4 }\n if (crlf < 0) return { terminatorStart: lf, terminatorEnd: lf + 2 }\n return lf < crlf\n ? { terminatorStart: lf, terminatorEnd: lf + 2 }\n : { terminatorStart: crlf, terminatorEnd: crlf + 4 }\n}\n\nfunction parseSSEBlock(block: string): SSEFrame | null {\n let event = ''\n let id: string | undefined\n let retry: number | undefined\n const dataLines: string[] = []\n for (const line of block.split(/\\r?\\n/)) {\n if (line === '' || line.startsWith(':')) continue\n const colon = line.indexOf(':')\n const field = colon < 0 ? line : line.slice(0, colon)\n let value = colon < 0 ? '' : line.slice(colon + 1)\n if (value.startsWith(' ')) value = value.slice(1)\n if (field === 'event') {\n event = value\n } else if (field === 'data') {\n dataLines.push(value)\n } else if (field === 'id') {\n id = value\n } else if (field === 'retry') {\n const parsed = Number.parseInt(value, 10)\n if (Number.isFinite(parsed) && parsed >= 0) retry = parsed\n }\n // Unknown fields are ignored per the SSE spec.\n }\n // Surface metadata-only frames (id-only or retry-only) so the reconnect\n // loop can observe ``Last-Event-ID`` advances and server-sent retry hints\n // even on heartbeats / replay-position markers.\n if (!event && dataLines.length === 0 && id === undefined && retry === undefined) {\n return null\n }\n return {\n event,\n data: dataLines.length > 0 ? dataLines.join('\\n') : undefined,\n id,\n retry,\n }\n}\n\n/**\n * Validate and reattach the discriminator to a frame's JSON payload.\n *\n * The platform-api SSE serializer pops ``event_type`` out of the JSON body\n * (it lives in the SSE ``event:`` line). Reattach it so the resulting\n * value is a well-formed {@link WorkspaceSSEEvent} union member.\n *\n * Drift-tolerant: an unparseable payload, non-object payload, or unknown\n * ``event:`` discriminator is silently dropped (returns ``null``), matching\n * the behavior of the analogous turn-stream parser.\n */\nfunction parseWorkspaceFrame(eventName: string, dataJson: string): WorkspaceSSEEvent | null {\n let payload: unknown\n try {\n payload = JSON.parse(dataJson)\n } catch {\n return null\n }\n if (typeof payload !== 'object' || payload === null || Array.isArray(payload)) return null\n // The discriminator is whatever the server's `event:` line says. We trust\n // the platform-api union: anything outside the generated literal type is\n // dropped at the static-type boundary by the consumer's `switch`.\n return {\n ...(payload as Record<string, unknown>),\n event_type: eventName,\n } as WorkspaceSSEEvent\n}\n\nfunction readStatus(error: unknown): number | undefined {\n if (typeof error !== 'object' || error === null) return undefined\n const status = (error as { statusCode?: unknown }).statusCode\n return typeof status === 'number' ? status : undefined\n}\n\nfunction safeStringify(value: unknown): string {\n try {\n return JSON.stringify(value)\n } catch {\n return String(value)\n }\n}\n\nfunction jitter(ms: number): number {\n // Full jitter: pick a random delay in [0, ms]. Avoids reconnect stampedes\n // when many clients reconnect simultaneously after a deploy.\n return Math.floor(Math.random() * Math.max(1, ms))\n}\n\nfunction clampDelay(ms: number, floor: number | undefined, ceiling: number): number {\n const lo = floor ?? DEFAULT_INITIAL_DELAY_MS\n if (!Number.isFinite(ms) || ms <= 0) return lo\n return Math.min(Math.max(ms, lo), ceiling)\n}\n\nasync function abortableSleep(ms: number, signal: AbortSignal): Promise<boolean> {\n if (signal.aborted) return false\n return new Promise<boolean>((resolve) => {\n const timer = setTimeout(() => {\n signal.removeEventListener('abort', onAbort)\n resolve(true)\n }, ms)\n const onAbort = (): void => {\n clearTimeout(timer)\n signal.removeEventListener('abort', onAbort)\n resolve(false)\n }\n signal.addEventListener('abort', onAbort, { once: true })\n })\n}\n", "import type { components } from '../generated/api.js'\nimport { WorkspaceScopedResource, extractData } from './base.js'\n\nexport class FunctionsResource extends WorkspaceScopedResource {\n async list() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/functions', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n\n async create(body: components['schemas']['FunctionCreateRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/functions', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n )\n }\n\n async delete(functionName: string): Promise<void> {\n await this.client.DELETE('/v1/{workspace_id}/functions/{function_name}', {\n params: { path: { workspace_id: this.workspaceId, function_name: functionName } },\n })\n }\n\n async test(functionName: string, body: components['schemas']['FunctionTestRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/functions/{function_name}/test', {\n params: { path: { workspace_id: this.workspaceId, function_name: functionName } },\n body,\n }),\n )\n }\n\n async getCatalog() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/functions/catalog', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n\n async query(body: components['schemas']['QueryRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/functions/query', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n )\n }\n\n async sync() {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/functions/sync', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n}\n", "/**\n * Branded types provide compile-time type safety for string IDs.\n * At runtime they are plain strings, but the type system prevents mixing them.\n */\ndeclare const brand: unique symbol\n\ntype Brand<T, B> = T & { readonly [brand]: B }\n\n// --- ID types ---\nexport type WorkspaceId = Brand<string, 'WorkspaceId'>\nexport type ApiKeyId = Brand<string, 'ApiKeyId'>\nexport type AgentId = Brand<string, 'AgentId'>\nexport type PersonaId = Brand<string, 'PersonaId'>\nexport type SkillId = Brand<string, 'SkillId'>\n/** @deprecated Use ActionId instead */\nexport type ActionId = Brand<string, 'ActionId'>\nexport type ServiceId = Brand<string, 'ServiceId'>\nexport type ContextGraphId = Brand<string, 'ContextGraphId'>\nexport type CallId = Brand<string, 'CallId'>\nexport type PhoneNumberId = Brand<string, 'PhoneNumberId'>\nexport type IntegrationId = Brand<string, 'IntegrationId'>\nexport type EntityId = Brand<string, 'EntityId'>\nexport type EventId = Brand<string, 'EventId'>\nexport type SurfaceId = Brand<string, 'SurfaceId'>\nexport type OperatorId = Brand<string, 'OperatorId'>\nexport type TriggerId = Brand<string, 'TriggerId'>\nexport type SimulationRunId = Brand<string, 'SimulationRunId'>\nexport type SimulationSessionId = Brand<string, 'SimulationSessionId'>\nexport type ScribeSessionId = Brand<string, 'ScribeSessionId'>\nexport type FunctionId = Brand<string, 'FunctionId'>\nexport type DataSourceId = Brand<string, 'DataSourceId'>\n\n// --- Constructors ---\nexport const workspaceId = (id: string): WorkspaceId => id as WorkspaceId\nexport const apiKeyId = (id: string): ApiKeyId => id as ApiKeyId\nexport const agentId = (id: string): AgentId => id as AgentId\nexport const personaId = (id: string): PersonaId => id as PersonaId\nexport const skillId = (id: string): SkillId => id as SkillId\nexport const actionId = (id: string): ActionId => id as ActionId\nexport const serviceId = (id: string): ServiceId => id as ServiceId\nexport const contextGraphId = (id: string): ContextGraphId => id as ContextGraphId\nexport const callId = (id: string): CallId => id as CallId\nexport const phoneNumberId = (id: string): PhoneNumberId => id as PhoneNumberId\nexport const integrationId = (id: string): IntegrationId => id as IntegrationId\nexport const entityId = (id: string): EntityId => id as EntityId\nexport const eventId = (id: string): EventId => id as EventId\nexport const surfaceId = (id: string): SurfaceId => id as SurfaceId\nexport const operatorId = (id: string): OperatorId => id as OperatorId\nexport const triggerId = (id: string): TriggerId => id as TriggerId\nexport const simulationRunId = (id: string): SimulationRunId => id as SimulationRunId\nexport const simulationSessionId = (id: string): SimulationSessionId => id as SimulationSessionId\nexport const scribeSessionId = (id: string): ScribeSessionId => id as ScribeSessionId\nexport const functionId = (id: string): FunctionId => id as FunctionId\nexport const dataSourceId = (id: string): DataSourceId => id as DataSourceId\n", "const textEncoder = new TextEncoder()\nconst MAX_TIMESTAMP_SKEW_MS = 5 * 60 * 1000\ntype WebCryptoLike = { subtle: NonNullable<typeof globalThis.crypto>['subtle'] }\n\nlet webCryptoPromise: Promise<WebCryptoLike> | undefined\n\nexport interface WebhookEvent<T = unknown> {\n id: string\n type: string\n timestamp: string\n data: T\n}\n\nexport interface WebhookVerificationOptions {\n payload: string | Uint8Array | ArrayBuffer\n signature: string\n secret: string\n timestamp?: string\n maxAgeMs?: number\n}\n\nexport interface ParseWebhookEventOptions<T = unknown> extends WebhookVerificationOptions {\n payload: string | Uint8Array | ArrayBuffer\n expectedType?: string\n reviver?: Parameters<typeof JSON.parse>[1]\n validate?: (event: WebhookEvent<T>) => void\n}\n\nexport class WebhookVerificationError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'WebhookVerificationError'\n Object.setPrototypeOf(this, new.target.prototype)\n }\n}\n\nexport async function verifyWebhookSignature(\n payload: string | Uint8Array | ArrayBuffer,\n signature: string,\n secret: string,\n): Promise<boolean>\nexport async function verifyWebhookSignature(options: WebhookVerificationOptions): Promise<boolean>\nexport async function verifyWebhookSignature(\n payloadOrOptions: string | Uint8Array | ArrayBuffer | WebhookVerificationOptions,\n signature?: string,\n secret?: string,\n): Promise<boolean> {\n const options = normalizeVerificationOptions(payloadOrOptions, signature, secret)\n const payloadBytes = toUint8Array(options.payload)\n const expectedSignature = await signWebhookPayload(\n payloadBytes,\n options.secret,\n options.timestamp,\n )\n const actualSignature = normalizeSignature(options.signature)\n\n if (!actualSignature || !constantTimeEqual(expectedSignature, actualSignature)) {\n return false\n }\n\n if (options.timestamp) {\n const timestampMs = parseTimestamp(options.timestamp)\n if (timestampMs === undefined) return false\n\n const maxAgeMs = options.maxAgeMs ?? MAX_TIMESTAMP_SKEW_MS\n const now = Date.now()\n if (timestampMs > now + maxAgeMs || now - timestampMs > maxAgeMs) {\n return false\n }\n }\n\n return true\n}\n\nexport async function parseWebhookEvent<T = unknown>(\n payload: string,\n signature: string,\n secret: string,\n): Promise<WebhookEvent<T>>\nexport async function parseWebhookEvent<T = unknown>(\n options: ParseWebhookEventOptions<T>,\n): Promise<WebhookEvent<T>>\nexport async function parseWebhookEvent<T = unknown>(\n payloadOrOptions: string | ParseWebhookEventOptions<T>,\n signature?: string,\n secret?: string,\n): Promise<WebhookEvent<T>> {\n const options = normalizeParseOptions(payloadOrOptions, signature, secret)\n const valid = await verifyWebhookSignature(options)\n\n if (!valid) {\n throw new WebhookVerificationError('Invalid or expired webhook signature')\n }\n\n const payloadText = decodePayload(options.payload)\n\n let event: WebhookEvent<T>\n try {\n event = JSON.parse(payloadText, options.reviver) as WebhookEvent<T>\n } catch {\n throw new WebhookVerificationError('Invalid JSON webhook payload')\n }\n\n if (options.expectedType && event.type !== options.expectedType) {\n throw new WebhookVerificationError(\n `Unexpected webhook event type: expected ${options.expectedType}, received ${event.type}`,\n )\n }\n\n options.validate?.(event)\n return event\n}\n\nfunction normalizeVerificationOptions(\n payloadOrOptions: string | Uint8Array | ArrayBuffer | WebhookVerificationOptions,\n signature?: string,\n secret?: string,\n): WebhookVerificationOptions {\n if (\n typeof payloadOrOptions === 'object' &&\n payloadOrOptions !== null &&\n 'payload' in payloadOrOptions\n ) {\n return payloadOrOptions\n }\n\n if (!signature || !secret) {\n throw new TypeError('signature and secret are required')\n }\n\n return {\n payload: payloadOrOptions,\n signature,\n secret,\n }\n}\n\nfunction normalizeParseOptions<T>(\n payloadOrOptions: string | ParseWebhookEventOptions<T>,\n signature?: string,\n secret?: string,\n): ParseWebhookEventOptions<T> {\n if (\n typeof payloadOrOptions === 'object' &&\n payloadOrOptions !== null &&\n 'payload' in payloadOrOptions\n ) {\n return payloadOrOptions\n }\n\n if (!signature || !secret) {\n throw new TypeError('signature and secret are required')\n }\n\n return {\n payload: payloadOrOptions,\n signature,\n secret,\n }\n}\n\nfunction decodePayload(payload: string | Uint8Array | ArrayBuffer): string {\n if (typeof payload === 'string') return payload\n return new TextDecoder().decode(toUint8Array(payload))\n}\n\nfunction toUint8Array(payload: string | Uint8Array | ArrayBuffer): Uint8Array {\n if (typeof payload === 'string') return textEncoder.encode(payload)\n if (payload instanceof Uint8Array) return payload\n return new Uint8Array(payload)\n}\n\nasync function signWebhookPayload(\n payload: Uint8Array,\n secret: string,\n timestamp?: string,\n): Promise<Uint8Array> {\n const crypto = await resolveWebCrypto()\n const key = await crypto.subtle.importKey(\n 'raw',\n textEncoder.encode(secret),\n { name: 'HMAC', hash: 'SHA-256' },\n false,\n ['sign'],\n )\n\n const message = timestamp\n ? concatUint8Arrays(textEncoder.encode(`v1:${timestamp}:`), payload)\n : payload\n\n const mac = await crypto.subtle.sign('HMAC', key, toCryptoBuffer(message))\n return new Uint8Array(mac)\n}\n\nasync function resolveWebCrypto(): Promise<WebCryptoLike> {\n if (globalThis.crypto?.subtle) {\n return globalThis.crypto\n }\n\n webCryptoPromise ??= import('node:crypto').then(({ webcrypto }) => webcrypto as WebCryptoLike)\n return await webCryptoPromise\n}\n\nfunction normalizeSignature(signature: string): Uint8Array | undefined {\n const normalized = signature.startsWith('sha256=') ? signature.slice(7) : signature\n if (!/^[a-fA-F0-9]+$/.test(normalized) || normalized.length % 2 !== 0) {\n return undefined\n }\n\n const bytes = new Uint8Array(normalized.length / 2)\n for (let index = 0; index < normalized.length; index += 2) {\n bytes[index / 2] = Number.parseInt(normalized.slice(index, index + 2), 16)\n }\n return bytes\n}\n\nfunction constantTimeEqual(expected: Uint8Array, actual: Uint8Array): boolean {\n const maxLength = Math.max(expected.length, actual.length)\n let diff = expected.length ^ actual.length\n\n for (let index = 0; index < maxLength; index += 1) {\n diff |= (expected[index] ?? 0) ^ (actual[index] ?? 0)\n }\n\n return diff === 0\n}\n\nfunction parseTimestamp(timestamp: string): number | undefined {\n const numeric = Number(timestamp)\n if (Number.isFinite(numeric)) {\n return numeric < 1_000_000_000_000 ? numeric * 1000 : numeric\n }\n\n const parsed = Date.parse(timestamp)\n return Number.isNaN(parsed) ? undefined : parsed\n}\n\nfunction concatUint8Arrays(left: Uint8Array, right: Uint8Array): Uint8Array {\n const combined = new Uint8Array(left.length + right.length)\n combined.set(left, 0)\n combined.set(right, left.length)\n return combined\n}\n\nfunction toCryptoBuffer(bytes: Uint8Array): ArrayBuffer {\n const copy = Uint8Array.from(bytes)\n return copy.buffer\n}\n", "/**\n * RFC 8628 Device Authorization Grant for desktop and CLI apps.\n *\n * Authenticates users via the identity service's device code flow:\n * the app displays a code, the user approves in their browser,\n * and the app receives a workspace-scoped JWT.\n */\n\nimport { AmigoError, AuthenticationError, NetworkError, RateLimitError } from './errors.js'\n\n// --- Types ---\n\nexport interface DeviceCodeIssuance {\n device_code: string\n user_code: string\n verification_uri: string\n verification_uri_complete: string\n expires_in: number\n interval: number\n}\n\nexport interface IdentityTokenResponse {\n access_token: string\n token_type: 'Bearer' | 'DPoP'\n expires_in: number\n scope: string\n session_id?: string\n refresh_token?: string\n}\n\nexport interface WorkspaceChoice {\n workspace_id: string\n role?: string\n name?: string\n}\n\nexport interface MultiWorkspaceResponse {\n error: 'workspace_selection_required'\n workspaces: WorkspaceChoice[]\n access_token?: string\n token_type?: string\n expires_in?: number\n scope?: string\n refresh_token?: string\n}\n\nexport type DeviceCodeStatus =\n | 'authorization_pending'\n | 'polling'\n | 'approved'\n | 'expired'\n | 'denied'\n | 'slow_down'\n\nexport interface DeviceCodeLoginOptions {\n /** Identity service base URL. Default: https://api.platform.amigo.ai */\n identityBaseUrl?: string\n /** Pre-select workspace (skips workspace selection prompt) */\n workspaceId?: string\n /** Client description for audit logs */\n clientDescription?: string\n /** OAuth scope to request */\n scope?: string\n /** Called when device code is issued \u2014 display instructions to user */\n onCode: (issuance: DeviceCodeIssuance) => void | Promise<void>\n /** Called with polling status updates */\n onStatus?: (status: DeviceCodeStatus) => void\n /** Called when user must select a workspace \u2014 return the chosen workspace_id */\n onWorkspaceRequired: (workspaces: WorkspaceChoice[]) => Promise<string>\n /** AbortSignal to cancel the login flow */\n signal?: AbortSignal\n /** Custom fetch implementation */\n fetch?: typeof globalThis.fetch\n}\n\nexport interface AuthResult {\n accessToken: string\n refreshToken: string\n workspaceId: string\n expiresAt: number\n scope?: string\n}\n\nexport interface StoredCredentials {\n access_token: string\n refresh_token: string\n workspace_id: string\n expires_at: number\n scope?: string\n identity_base_url?: string\n}\n\nexport interface TokenStorage {\n load(): Promise<StoredCredentials | null>\n save(credentials: StoredCredentials): Promise<void>\n clear(): Promise<void>\n}\n\n// --- Errors ---\n\nexport class DeviceCodeExpiredError extends AmigoError {\n constructor(message = 'Device code expired. Please restart the login flow.') {\n super(message, { errorCode: 'device_code_expired' })\n }\n}\n\nexport class DeviceCodeDeniedError extends AmigoError {\n constructor(message = 'Authorization request was denied.') {\n super(message, { errorCode: 'device_code_denied' })\n }\n}\n\nexport class RefreshTokenExpiredError extends AuthenticationError {\n constructor(message = 'Refresh token expired. Please log in again.') {\n super(message, { errorCode: 'refresh_token_expired' })\n }\n}\n\nexport class LoginCancelledError extends AmigoError {\n constructor() {\n super('Login cancelled', { errorCode: 'login_cancelled' })\n }\n}\n\n// --- Identity Client ---\n\nconst DEFAULT_IDENTITY_URL = 'https://api.platform.amigo.ai'\n\nasync function identityPost(\n baseUrl: string,\n path: string,\n body: URLSearchParams,\n fetchFn: typeof globalThis.fetch,\n): Promise<Response> {\n try {\n // redirect: 'manual' is required because the identity service uses HTTP 300\n // (non-standard) for multi-workspace selection. Without it, fetch follows\n // the redirect automatically and the caller never sees the 300.\n return await fetchFn(`${baseUrl}${path}`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\n body: body.toString(),\n redirect: 'manual',\n })\n } catch (err) {\n throw new NetworkError('Network error contacting identity service', err)\n }\n}\n\nasync function requestDeviceCode(\n baseUrl: string,\n params: { clientDescription?: string; scope?: string },\n fetchFn: typeof globalThis.fetch,\n): Promise<DeviceCodeIssuance> {\n const body = new URLSearchParams()\n if (params.clientDescription) body.set('client_description', params.clientDescription)\n if (params.scope) body.set('scope', params.scope)\n\n const res = await identityPost(baseUrl, '/device/code', body, fetchFn)\n\n if (res.status === 429) {\n const retryAfter = parseInt(res.headers.get('Retry-After') ?? '', 10)\n throw new RateLimitError('Rate limited', {\n retryAfter: isNaN(retryAfter) ? undefined : retryAfter,\n })\n }\n if (!res.ok) {\n const err = (await res.json().catch(() => ({}))) as Record<string, string>\n throw new AmigoError(err.error_description ?? `Identity error (${res.status})`, {\n statusCode: res.status,\n errorCode: err.error,\n })\n }\n return (await res.json()) as DeviceCodeIssuance\n}\n\ntype PollResult =\n | { type: 'token'; data: IdentityTokenResponse }\n | { type: 'multi_workspace'; data: MultiWorkspaceResponse }\n | { type: 'pending' }\n | { type: 'slow_down' }\n\nasync function pollDeviceCode(\n baseUrl: string,\n deviceCode: string,\n scope: string | undefined,\n workspaceId: string | undefined,\n fetchFn: typeof globalThis.fetch,\n): Promise<PollResult> {\n const body = new URLSearchParams({ grant_type: 'device_code', device_code: deviceCode })\n if (scope) body.set('scope', scope)\n if (workspaceId) body.set('workspace_id', workspaceId)\n\n const res = await identityPost(baseUrl, '/token', body, fetchFn)\n\n if (res.status === 300)\n return { type: 'multi_workspace', data: (await res.json()) as MultiWorkspaceResponse }\n if (res.status === 200)\n return { type: 'token', data: (await res.json()) as IdentityTokenResponse }\n\n if (res.status === 400) {\n const err = (await res.json().catch(() => ({ error: 'unknown' }))) as Record<string, string>\n if (err.error === 'authorization_pending') return { type: 'pending' }\n if (err.error === 'slow_down') return { type: 'slow_down' }\n throw new AmigoError(err.error_description ?? err.error ?? `Identity error (400)`, {\n statusCode: 400,\n errorCode: err.error,\n })\n }\n\n throw new AmigoError(`Identity error (${res.status})`, { statusCode: res.status })\n}\n\nasync function doRefreshToken(\n baseUrl: string,\n params: { refreshToken: string; workspaceId?: string; scope?: string },\n fetchFn: typeof globalThis.fetch,\n): Promise<IdentityTokenResponse> {\n const body = new URLSearchParams({\n grant_type: 'refresh_token',\n refresh_token: params.refreshToken,\n })\n if (params.workspaceId) body.set('workspace_id', params.workspaceId)\n if (params.scope) body.set('scope', params.scope)\n\n const res = await identityPost(baseUrl, '/token', body, fetchFn)\n\n if (!res.ok) {\n const err = (await res.json().catch(() => ({}))) as Record<string, string>\n throw new AmigoError(err.error_description ?? `Identity error (${res.status})`, {\n statusCode: res.status,\n errorCode: err.error,\n })\n }\n return (await res.json()) as IdentityTokenResponse\n}\n\n// --- JWT decode (no verification \u2014 server validates) ---\n\nexport function decodeJwtPayload(jwt: string): Record<string, unknown> | null {\n try {\n const parts = jwt.split('.')\n if (parts.length !== 3 || !parts[1]) return null\n const payload = Buffer.from(parts[1], 'base64url').toString()\n return JSON.parse(payload) as Record<string, unknown>\n } catch {\n return null\n }\n}\n\n// --- Device Code Login ---\n\nfunction sleep(ms: number, signal?: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n if (signal?.aborted) {\n reject(new LoginCancelledError())\n return\n }\n const timer = setTimeout(resolve, ms)\n signal?.addEventListener(\n 'abort',\n () => {\n clearTimeout(timer)\n reject(new LoginCancelledError())\n },\n { once: true },\n )\n })\n}\n\nfunction toAuthResult(token: IdentityTokenResponse, workspaceIdOverride?: string): AuthResult {\n const claims = decodeJwtPayload(token.access_token)\n const workspaceId = workspaceIdOverride ?? (claims?.workspace_id as string) ?? ''\n if (!workspaceId) {\n throw new AmigoError('Token does not contain a workspace_id claim', {\n errorCode: 'missing_workspace',\n })\n }\n return {\n accessToken: token.access_token,\n refreshToken: token.refresh_token ?? '',\n workspaceId,\n expiresAt:\n (claims?.exp as number) ??\n (token.expires_in\n ? Math.floor(Date.now() / 1000) + token.expires_in\n : Math.floor(Date.now() / 1000) + 900),\n scope: token.scope,\n }\n}\n\nasync function fetchWorkspaces(\n baseUrl: string,\n accessToken: string,\n fetchFn: typeof globalThis.fetch,\n): Promise<WorkspaceChoice[]> {\n // Try /self/profile first (identity service direct route)\n for (const path of ['/self/profile', '/self']) {\n const res = await fetchFn(`${baseUrl}${path}`, {\n headers: { Authorization: `Bearer ${accessToken}` },\n })\n if (res.ok) {\n const data = (await res.json()) as {\n workspaces?: Array<{ workspace_id: string; role?: string; name?: string }>\n }\n return (data.workspaces ?? []).map((ws) => ({\n workspace_id: ws.workspace_id,\n role: ws.role,\n name: ws.name,\n }))\n }\n if (res.status !== 404) {\n throw new AmigoError(`Failed to fetch workspaces (${res.status})`, { statusCode: res.status })\n }\n }\n return []\n}\n\nasync function resolveWorkspaceFromBootstrap(\n baseUrl: string,\n token: IdentityTokenResponse,\n options: DeviceCodeLoginOptions,\n fetchFn: typeof globalThis.fetch,\n): Promise<AuthResult> {\n if (!token.refresh_token) {\n throw new AmigoError('Bootstrap token missing refresh_token', { errorCode: 'server_error' })\n }\n\n const workspaces = await fetchWorkspaces(baseUrl, token.access_token, fetchFn)\n\n if (workspaces.length === 0) {\n throw new AmigoError(\n 'No workspace memberships found. Create a workspace or request an invitation.',\n { errorCode: 'no_workspaces' },\n )\n }\n\n if (workspaces.length === 1 && workspaces[0]) {\n const scoped = await doRefreshToken(\n baseUrl,\n {\n refreshToken: token.refresh_token,\n workspaceId: workspaces[0].workspace_id,\n scope: options.scope,\n },\n fetchFn,\n )\n return toAuthResult(scoped, workspaces[0].workspace_id)\n }\n\n const workspaceId = await options.onWorkspaceRequired(workspaces)\n const scoped = await doRefreshToken(\n baseUrl,\n { refreshToken: token.refresh_token, workspaceId, scope: options.scope },\n fetchFn,\n )\n return toAuthResult(scoped, workspaceId)\n}\n\nasync function resolveWorkspaceFromMulti(\n baseUrl: string,\n multi: MultiWorkspaceResponse,\n options: DeviceCodeLoginOptions,\n fetchFn: typeof globalThis.fetch,\n): Promise<AuthResult> {\n if (!multi.refresh_token) {\n throw new AmigoError('Multi-workspace response missing refresh_token', {\n errorCode: 'server_error',\n })\n }\n\n const workspaceId = await options.onWorkspaceRequired(multi.workspaces)\n const scoped = await doRefreshToken(\n baseUrl,\n { refreshToken: multi.refresh_token, workspaceId, scope: options.scope },\n fetchFn,\n )\n return toAuthResult(scoped, workspaceId)\n}\n\nexport async function loginWithDeviceCode(options: DeviceCodeLoginOptions): Promise<AuthResult> {\n const baseUrl = (options.identityBaseUrl ?? DEFAULT_IDENTITY_URL).replace(/\\/+$/, '')\n const fetchFn = options.fetch ?? globalThis.fetch\n\n const issuance = await requestDeviceCode(\n baseUrl,\n { clientDescription: options.clientDescription, scope: options.scope },\n fetchFn,\n )\n\n await options.onCode(issuance)\n\n // Poll loop\n let interval = issuance.interval * 1000\n const deadline = Date.now() + issuance.expires_in * 1000\n\n while (Date.now() < deadline) {\n if (options.signal?.aborted) throw new LoginCancelledError()\n\n await sleep(interval, options.signal)\n\n if (options.signal?.aborted) throw new LoginCancelledError()\n\n options.onStatus?.('polling')\n\n try {\n const result = await pollDeviceCode(\n baseUrl,\n issuance.device_code,\n options.scope,\n options.workspaceId,\n fetchFn,\n )\n\n if (result.type === 'pending') {\n options.onStatus?.('authorization_pending')\n continue\n }\n\n // RFC 8628 \u00A73.5: increase interval by 5 seconds on slow_down\n if (result.type === 'slow_down') {\n interval += 5000\n options.onStatus?.('slow_down')\n continue\n }\n\n options.onStatus?.('approved')\n\n if (result.type === 'token') {\n const claims = decodeJwtPayload(result.data.access_token)\n const isBootstrap = claims?.workspace_bootstrap || !claims?.workspace_id\n if (isBootstrap && result.data.refresh_token) {\n // Bootstrap token \u2014 need workspace selection via refresh_token exchange\n if (options.workspaceId) {\n const scoped = await doRefreshToken(\n baseUrl,\n {\n refreshToken: result.data.refresh_token,\n workspaceId: options.workspaceId,\n scope: options.scope,\n },\n fetchFn,\n )\n return toAuthResult(scoped, options.workspaceId)\n }\n return await resolveWorkspaceFromBootstrap(baseUrl, result.data, options, fetchFn)\n }\n return toAuthResult(result.data)\n }\n\n // multi_workspace (HTTP 300) \u2014 workspace list included in response\n return await resolveWorkspaceFromMulti(baseUrl, result.data, options, fetchFn)\n } catch (err) {\n if (err instanceof AmigoError && err.errorCode === 'expired_token') {\n options.onStatus?.('expired')\n throw new DeviceCodeExpiredError()\n }\n if (err instanceof AmigoError && err.errorCode === 'access_denied') {\n options.onStatus?.('denied')\n throw new DeviceCodeDeniedError()\n }\n throw err\n }\n }\n\n options.onStatus?.('expired')\n throw new DeviceCodeExpiredError()\n}\n\n// --- Token Manager ---\n\nconst REFRESH_BUFFER_SECONDS = 60\n\nexport interface TokenManagerConfig {\n storage?: TokenStorage\n identityBaseUrl?: string\n fetch?: typeof globalThis.fetch\n}\n\nexport class TokenManager {\n private readonly _storage: TokenStorage\n private readonly _baseUrl: string\n private readonly _fetch: typeof globalThis.fetch\n private _cached: StoredCredentials | null = null\n private _refreshPromise: Promise<StoredCredentials> | null = null\n\n constructor(config: TokenManagerConfig = {}) {\n this._storage = config.storage ?? new FileTokenStorage()\n this._baseUrl = (config.identityBaseUrl ?? DEFAULT_IDENTITY_URL).replace(/\\/+$/, '')\n this._fetch = config.fetch ?? globalThis.fetch\n }\n\n async store(result: AuthResult): Promise<void> {\n const creds: StoredCredentials = {\n access_token: result.accessToken,\n refresh_token: result.refreshToken,\n workspace_id: result.workspaceId,\n expires_at: result.expiresAt,\n scope: result.scope,\n }\n this._cached = creds\n await this._storage.save(creds)\n }\n\n async getAccessToken(): Promise<{ token: string; workspaceId: string } | null> {\n const creds = await this._loadCached()\n if (!creds) return null\n if (creds.expires_at - Math.floor(Date.now() / 1000) >= REFRESH_BUFFER_SECONDS) {\n return { token: creds.access_token, workspaceId: creds.workspace_id }\n }\n const refreshed = await this._refresh(creds)\n return { token: refreshed.access_token, workspaceId: refreshed.workspace_id }\n }\n\n async hasCredentials(): Promise<boolean> {\n return (await this._loadCached()) !== null\n }\n\n async clear(): Promise<void> {\n this._cached = null\n this._refreshPromise = null\n await this._storage.clear()\n }\n\n private async _loadCached(): Promise<StoredCredentials | null> {\n if (this._cached) return this._cached\n const loaded = await this._storage.load()\n if (loaded) this._cached = loaded\n return loaded\n }\n\n private async _refresh(current: StoredCredentials): Promise<StoredCredentials> {\n if (this._refreshPromise) return this._refreshPromise\n this._refreshPromise = this._doRefresh(current).finally(() => {\n this._refreshPromise = null\n })\n return this._refreshPromise\n }\n\n private async _doRefresh(current: StoredCredentials): Promise<StoredCredentials> {\n if (!current.refresh_token) throw new RefreshTokenExpiredError('No refresh token available')\n\n try {\n const response = await doRefreshToken(\n this._baseUrl,\n {\n refreshToken: current.refresh_token,\n workspaceId: current.workspace_id,\n scope: current.scope,\n },\n this._fetch,\n )\n const claims = decodeJwtPayload(response.access_token)\n const refreshed: StoredCredentials = {\n access_token: response.access_token,\n refresh_token: response.refresh_token ?? current.refresh_token,\n workspace_id: current.workspace_id,\n expires_at: (claims?.exp as number) ?? Math.floor(Date.now() / 1000) + response.expires_in,\n scope: response.scope ?? current.scope,\n }\n this._cached = refreshed\n await this._storage.save(refreshed)\n return refreshed\n } catch (err) {\n if (\n err instanceof AmigoError &&\n (err.statusCode === 401 || err.errorCode === 'invalid_grant')\n ) {\n await this.clear()\n throw new RefreshTokenExpiredError()\n }\n throw err\n }\n }\n}\n\n// --- Token Storage ---\n\nexport class FileTokenStorage implements TokenStorage {\n private readonly _explicitPath: string | undefined\n private _resolvedPath: string | undefined\n\n constructor(filePath?: string) {\n this._explicitPath = filePath\n }\n\n private async _filePath(): Promise<string> {\n if (this._explicitPath) return this._explicitPath\n if (this._resolvedPath) return this._resolvedPath\n const os = await import('node:os')\n const path = await import('node:path')\n this._resolvedPath = path.join(os.homedir(), '.amigo', 'credentials.json')\n return this._resolvedPath\n }\n\n async load(): Promise<StoredCredentials | null> {\n const fs = await import('node:fs/promises')\n const filePath = await this._filePath()\n try {\n const raw = await fs.readFile(filePath, 'utf-8')\n const data = JSON.parse(raw)\n if (\n typeof data.access_token === 'string' &&\n typeof data.refresh_token === 'string' &&\n typeof data.workspace_id === 'string' &&\n typeof data.expires_at === 'number'\n ) {\n return data as StoredCredentials\n }\n return null\n } catch (err: unknown) {\n if (err && typeof err === 'object' && 'code' in err && err.code === 'ENOENT') return null\n throw err\n }\n }\n\n async save(credentials: StoredCredentials): Promise<void> {\n const fs = await import('node:fs/promises')\n const path = await import('node:path')\n const filePath = await this._filePath()\n await fs.mkdir(path.dirname(filePath), { recursive: true, mode: 0o700 })\n await fs.writeFile(filePath, JSON.stringify(credentials, null, 2) + '\\n', { mode: 0o600 })\n await fs.chmod(filePath, 0o600)\n }\n\n async clear(): Promise<void> {\n const fs = await import('node:fs/promises')\n const filePath = await this._filePath()\n try {\n await fs.unlink(filePath)\n } catch (err: unknown) {\n if (err && typeof err === 'object' && 'code' in err && err.code === 'ENOENT') return\n throw err\n }\n }\n}\n\nexport class MemoryTokenStorage implements TokenStorage {\n private _credentials: StoredCredentials | null = null\n async load(): Promise<StoredCredentials | null> {\n return this._credentials\n }\n async save(credentials: StoredCredentials): Promise<void> {\n this._credentials = { ...credentials }\n }\n async clear(): Promise<void> {\n this._credentials = null\n }\n}\n\n// --- CLI Helpers ---\n\nexport function formatDeviceCodeInstructions(issuance: DeviceCodeIssuance): string {\n return [\n '',\n ' To sign in, open your browser and visit:',\n '',\n ` ${issuance.verification_uri}`,\n '',\n ' Then enter this code:',\n '',\n ` ${issuance.user_code}`,\n '',\n ` This code expires in ${Math.floor(issuance.expires_in / 60)} minutes.`,\n '',\n ].join('\\n')\n}\n\nexport function formatDeviceCodeLink(issuance: DeviceCodeIssuance): string {\n return `\\x1b]8;;${issuance.verification_uri_complete}\\x07Open browser to approve\\x1b]8;;\\x07`\n}\n\nexport async function openBrowser(url: string): Promise<boolean> {\n const { spawn } = await import('node:child_process')\n\n const openers: Record<string, { cmd: string; args: string[] }> = {\n darwin: { cmd: 'open', args: [url] },\n win32: { cmd: 'cmd', args: ['/c', 'start', '', url] },\n linux: { cmd: 'xdg-open', args: [url] },\n }\n\n const opener = openers[process.platform]\n if (!opener) return false\n\n return new Promise((resolve) => {\n // shell: false prevents command injection from malformed URLs\n const child = spawn(opener.cmd, opener.args, { stdio: 'ignore', shell: false, detached: true })\n child.on('error', () => resolve(false))\n child.on('close', (code) => resolve(code === 0))\n child.unref()\n })\n}\n\nexport function formatWorkspaceList(workspaces: WorkspaceChoice[]): string {\n const lines = ['', ' Available workspaces:', '']\n workspaces.forEach((ws, i) => {\n const name = ws.name ?? ws.workspace_id\n const role = ws.role ? ` (${ws.role})` : ''\n lines.push(` ${i + 1}. ${name}${role}`)\n if (ws.name) lines.push(` ${ws.workspace_id}`)\n })\n lines.push('')\n return lines.join('\\n')\n}\n"],
5
- "mappings": "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",
6
- "names": ["createClientImport", "workspaceId", "agentId", "skillId", "actionId", "serviceId", "contextGraphId", "dataSourceId", "entityId", "dataSourceId", "eventId", "callId", "workspaceId", "serviceId", "entityId", "phoneNumberId", "integrationId", "entityId", "personaId", "entityId", "workspaceId", "parseSSEFrames", "findFrameTerminator", "parseSSEBlock", "workspaceId", "sleep", "scoped", "workspaceId"]
3
+ "sources": ["../src/index.ts", "../src/core/errors.ts", "../src/core/openapi-client.ts", "../src/core/auth.ts", "../src/core/rate-limit.ts", "../src/core/request-options.ts", "../src/core/retry.ts", "../src/core/utils.ts", "../src/resources/base.ts", "../src/resources/workspaces.ts", "../src/resources/api-keys.ts", "../src/resources/agents.ts", "../src/resources/skills.ts", "../src/resources/actions.ts", "../src/resources/operators.ts", "../src/resources/triggers.ts", "../src/resources/services.ts", "../src/resources/context-graphs.ts", "../src/resources/data-sources.ts", "../src/resources/world.ts", "../src/resources/calls.ts", "../src/resources/conversations.ts", "../src/resources/phone-numbers.ts", "../src/resources/integrations.ts", "../src/resources/analytics.ts", "../src/resources/simulations.ts", "../src/resources/metrics.ts", "../src/resources/settings.ts", "../src/resources/billing.ts", "../src/resources/memory.ts", "../src/resources/personas.ts", "../src/resources/review-queue.ts", "../src/resources/recordings.ts", "../src/resources/audit.ts", "../src/resources/webhook-destinations.ts", "../src/resources/safety.ts", "../src/resources/compliance.ts", "../src/resources/events.ts", "../src/resources/functions.ts", "../src/core/reconnecting-websocket.ts", "../src/resources/observers.ts", "../src/core/branded-types.ts", "../src/core/webhooks.ts", "../src/core/device-code.ts"],
4
+ "sourcesContent": ["/**\n * @amigo-ai/platform-sdk\n *\n * Official TypeScript SDK for the Amigo Platform API.\n *\n * @example\n * ```typescript\n * import { AmigoClient } from '@amigo-ai/platform-sdk'\n *\n * const client = new AmigoClient({\n * apiKey: 'your-api-key',\n * workspaceId: 'your-workspace-id',\n * })\n *\n * const agents = await client.agents.list()\n * console.log(agents.items)\n * ```\n */\n\nimport type { FetchResponse, HeadersOptions } from 'openapi-fetch'\nimport type { MediaType, PathsWithMethod } from 'openapi-typescript-helpers'\nimport { ConfigurationError } from './core/errors.js'\nimport {\n applyPlatformRequestOptions,\n createPlatformClient,\n type ClientHooks,\n type PlatformFetch,\n} from './core/openapi-client.js'\nimport {\n mergeRequestOptions,\n type AmigoRequestOptions,\n type InitParam,\n type OperationFor,\n type ScopedRequestOptions,\n} from './core/request-options.js'\nimport type { RetryOptions } from './core/retry.js'\nimport { WorkspacesResource } from './resources/workspaces.js'\nimport { ApiKeysResource } from './resources/api-keys.js'\nimport { AgentsResource } from './resources/agents.js'\nimport { SkillsResource } from './resources/skills.js'\nimport { ActionsResource } from './resources/actions.js'\nimport { OperatorsResource } from './resources/operators.js'\nimport { TriggersResource } from './resources/triggers.js'\nimport { ServicesResource } from './resources/services.js'\nimport { ContextGraphsResource } from './resources/context-graphs.js'\nimport { DataSourcesResource } from './resources/data-sources.js'\nimport { WorldResource } from './resources/world.js'\nimport { CallsResource } from './resources/calls.js'\nimport { ConversationsResource } from './resources/conversations.js'\nimport { PhoneNumbersResource } from './resources/phone-numbers.js'\nimport { IntegrationsResource } from './resources/integrations.js'\nimport { AnalyticsResource } from './resources/analytics.js'\nimport { SimulationsResource } from './resources/simulations.js'\nimport { MetricsResource } from './resources/metrics.js'\nimport { SettingsResource } from './resources/settings.js'\nimport { BillingResource } from './resources/billing.js'\nimport { MemoryResource } from './resources/memory.js'\nimport { PersonasResource } from './resources/personas.js'\nimport { ReviewQueueResource } from './resources/review-queue.js'\nimport { RecordingsResource } from './resources/recordings.js'\nimport { AuditResource } from './resources/audit.js'\nimport { WebhookDestinationsResource } from './resources/webhook-destinations.js'\nimport { SafetyResource } from './resources/safety.js'\nimport { ComplianceResource } from './resources/compliance.js'\nimport { EventsResource } from './resources/events.js'\nimport { FunctionsResource } from './resources/functions.js'\nimport { ObserversResource } from './resources/observers.js'\nimport { resolveScopedPlatformClient, scopePlatformClient } from './resources/base.js'\nimport type { components, paths } from './generated/api.js'\nimport type { MetricValue as MetricValueAlias } from './resources/metrics.js'\nimport { withResponse, type AmigoResponse } from './core/utils.js'\n\nexport const DEFAULT_BASE_URL = 'https://api.platform.amigo.ai'\n\ntype Mutable<T> = { -readonly [K in keyof T]: T[K] }\n// The generated client exposes TRACE, but the SDK only publishes helpers for\n// platform methods that exist in the committed OpenAPI snapshot.\ntype PlatformMethod = 'get' | 'put' | 'post' | 'delete' | 'options' | 'head' | 'patch'\ntype EmptyOptions = Record<never, never>\ntype PathForMethod<Method extends PlatformMethod> = Extract<PathsWithMethod<paths, Method>, string>\ntype SuccessData<Operation extends Record<string | number, unknown>> = Extract<\n FetchResponse<Operation, EmptyOptions, MediaType>,\n { error?: never }\n>['data']\ntype IsNever<Value> = [Value] extends [never] ? true : false\ntype DefinedSuccessData<Operation extends Record<string | number, unknown>> = Exclude<\n SuccessData<Operation>,\n undefined\n>\n// Success data preserves nullable response bodies. Endpoints with no success\n// body resolve to undefined so low-level helpers can represent 204/205 results.\ntype OperationResponse<\n Path extends keyof paths & string,\n Method extends PlatformMethod,\n> = Method extends keyof paths[Path]\n ? paths[Path][Method] extends infer Operation extends Record<string | number, unknown>\n ? IsNever<SuccessData<Operation>> extends true\n ? never\n : // Preserve nullable success bodies; only no-content operations collapse to undefined.\n [DefinedSuccessData<Operation>] extends [never]\n ? undefined\n : DefinedSuccessData<Operation>\n : never\n : never\n\nexport interface AmigoClientConfig {\n /** API key created via POST /v1/{workspace_id}/api-keys */\n apiKey: string\n\n /** Workspace ID \u2014 all resource operations are scoped to this workspace */\n workspaceId: string\n\n /**\n * Override the base URL. Defaults to https://api.platform.amigo.ai\n *\n * For BFF proxy patterns (e.g., Next.js), point this at your proxy:\n * ```ts\n * new AmigoClient({ baseUrl: '/api/platform', ... })\n * ```\n */\n baseUrl?: string\n\n /** Retry configuration for failed requests */\n retry?: RetryOptions\n\n /** Convenience alias for retry count (same semantics as \"number of retries\") */\n maxRetries?: number\n\n /** Default request timeout in milliseconds */\n timeout?: number\n\n /** Additional headers sent with every request */\n headers?: HeadersOptions\n\n /** Request lifecycle hooks for logging, tracing, or metrics */\n hooks?: ClientHooks\n\n /**\n * Custom fetch implementation.\n *\n * Use for BFF proxy routing, server-side cookie forwarding,\n * or test mocking. When provided, all HTTP requests flow\n * through this function instead of globalThis.fetch.\n */\n fetch?: typeof globalThis.fetch\n\n /**\n * Base URL for the agent engine (voice-agent) WebSocket endpoints.\n *\n * Required when `baseUrl` points to a BFF proxy or a different host\n * than the agent engine \u2014 WebSockets cannot traverse HTTP proxies.\n * Used by `conversations.textStreamUrl()` to build the `ws://` URL.\n *\n * Accepts `http://` or `https://` (auto-mapped to `ws://` / `wss://`)\n * or direct `ws://` / `wss://` URLs.\n *\n * Defaults to deriving from `baseUrl` (works when REST API and agent\n * engine share the same origin).\n *\n * ```ts\n * new AmigoClient({\n * baseUrl: '/api/platform', // BFF proxy for REST\n * agentBaseUrl: 'wss://api.platform.amigo.ai', // direct for WS\n * ...\n * })\n * ```\n */\n agentBaseUrl?: string\n}\n\nexport class AmigoClient {\n readonly workspaceId!: string\n readonly baseUrl!: string\n readonly agentBaseUrl!: string | undefined\n readonly workspaces!: WorkspacesResource\n readonly apiKeys!: ApiKeysResource\n readonly agents!: AgentsResource\n /** @deprecated Use `actions` instead */\n readonly skills!: SkillsResource\n readonly actions!: ActionsResource\n readonly operators!: OperatorsResource\n readonly triggers!: TriggersResource\n readonly services!: ServicesResource\n readonly contextGraphs!: ContextGraphsResource\n readonly dataSources!: DataSourcesResource\n readonly world!: WorldResource\n readonly calls!: CallsResource\n readonly conversations!: ConversationsResource\n readonly phoneNumbers!: PhoneNumbersResource\n readonly integrations!: IntegrationsResource\n readonly analytics!: AnalyticsResource\n readonly simulations!: SimulationsResource\n readonly metrics!: MetricsResource\n readonly settings!: SettingsResource\n readonly billing!: BillingResource\n readonly memory!: MemoryResource\n readonly personas!: PersonasResource\n readonly reviewQueue!: ReviewQueueResource\n readonly recordings!: RecordingsResource\n readonly audit!: AuditResource\n readonly webhookDestinations!: WebhookDestinationsResource\n readonly safety!: SafetyResource\n readonly compliance!: ComplianceResource\n readonly events!: EventsResource\n readonly functions!: FunctionsResource\n /**\n * Voice-call observer real-time stream. Subscribe with\n * ``client.observers.subscribe({ callSid, token, onEvent })``. See\n * {@link ObserversResource}.\n */\n readonly observers!: ObserversResource\n /** @internal \u2014 exposed for path-level type inference in GET/POST/PUT/etc. */\n readonly api!: PlatformFetch\n\n constructor(config: AmigoClientConfig) {\n if (!config.apiKey || typeof config.apiKey !== 'string') {\n throw new ConfigurationError('apiKey is required and must be a non-empty string')\n }\n if (!config.workspaceId || typeof config.workspaceId !== 'string') {\n throw new ConfigurationError('workspaceId is required and must be a non-empty string')\n }\n\n const baseUrl = (config.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/$/, '')\n\n const client = createPlatformClient({\n apiKey: config.apiKey,\n baseUrl,\n retry: config.retry,\n maxRetries: config.maxRetries,\n timeout: config.timeout,\n headers: config.headers,\n hooks: config.hooks,\n fetch: config.fetch,\n })\n\n AmigoClient.hydrate(this, client, config.workspaceId, baseUrl, config.agentBaseUrl)\n }\n\n withOptions(options: ScopedRequestOptions): AmigoClient {\n return AmigoClient.fromPlatformClient(\n scopePlatformClient(this.api, options),\n this.workspaceId,\n this.baseUrl,\n this.agentBaseUrl,\n )\n }\n\n async GET<Path extends PathForMethod<'get'>>(\n path: Path,\n ...[init]: InitParam<AmigoRequestOptions<OperationFor<Path, 'get'>>>\n ): Promise<AmigoResponse<OperationResponse<Path, 'get'>>> {\n return withResponse(await this.resolveApiRequest(path, 'GET', init)) as AmigoResponse<\n OperationResponse<Path, 'get'>\n >\n }\n\n async POST<Path extends PathForMethod<'post'>>(\n path: Path,\n ...[init]: InitParam<AmigoRequestOptions<OperationFor<Path, 'post'>>>\n ): Promise<AmigoResponse<OperationResponse<Path, 'post'>>> {\n return withResponse(await this.resolveApiRequest(path, 'POST', init)) as AmigoResponse<\n OperationResponse<Path, 'post'>\n >\n }\n\n async PUT<Path extends PathForMethod<'put'>>(\n path: Path,\n ...[init]: InitParam<AmigoRequestOptions<OperationFor<Path, 'put'>>>\n ): Promise<AmigoResponse<OperationResponse<Path, 'put'>>> {\n return withResponse(await this.resolveApiRequest(path, 'PUT', init)) as AmigoResponse<\n OperationResponse<Path, 'put'>\n >\n }\n\n async PATCH<Path extends PathForMethod<'patch'>>(\n path: Path,\n ...[init]: InitParam<AmigoRequestOptions<OperationFor<Path, 'patch'>>>\n ): Promise<AmigoResponse<OperationResponse<Path, 'patch'>>> {\n return withResponse(await this.resolveApiRequest(path, 'PATCH', init)) as AmigoResponse<\n OperationResponse<Path, 'patch'>\n >\n }\n\n async DELETE<Path extends PathForMethod<'delete'>>(\n path: Path,\n ...[init]: InitParam<AmigoRequestOptions<OperationFor<Path, 'delete'>>>\n ): Promise<AmigoResponse<OperationResponse<Path, 'delete'>>> {\n return withResponse(await this.resolveApiRequest(path, 'DELETE', init)) as AmigoResponse<\n OperationResponse<Path, 'delete'>\n >\n }\n\n async HEAD<Path extends PathForMethod<'head'>>(\n path: Path,\n ...[init]: InitParam<AmigoRequestOptions<OperationFor<Path, 'head'>>>\n ): Promise<AmigoResponse<OperationResponse<Path, 'head'>>> {\n return withResponse(await this.resolveApiRequest(path, 'HEAD', init), {\n allowEmptyBody: true,\n }) as AmigoResponse<OperationResponse<Path, 'head'>>\n }\n\n async OPTIONS<Path extends PathForMethod<'options'>>(\n path: Path,\n ...[init]: InitParam<AmigoRequestOptions<OperationFor<Path, 'options'>>>\n ): Promise<AmigoResponse<OperationResponse<Path, 'options'>>> {\n return withResponse(await this.resolveApiRequest(path, 'OPTIONS', init), {\n allowEmptyBody: true,\n }) as AmigoResponse<OperationResponse<Path, 'options'>>\n }\n\n /**\n * Bind a path literal + method to a fully-typed callable.\n *\n * Captures the path as a literal type at definition time, so the returned\n * callable keeps full request/response inference even when stored,\n * exported, or composed across modules. Solves the \"explicit `as const` on\n * path params\" footgun: consumers who store a path in a `string` variable\n * lose path inference and the SDK collapses to `unknown`.\n *\n * ```ts\n * const getCall = client.defineRoute('GET', '/v1/{workspace_id}/calls/{call_id}')\n * const call = await getCall({ params: { path: { call_id } } })\n * // call.data: CallDetailResponse | undefined (fully typed)\n * ```\n *\n * Workspace IDs are still auto-injected by the underlying dispatchers \u2014 the\n * helper is purely a type-level convenience. Runtime behavior is identical\n * to calling the matching method directly, so retries, hooks, error\n * conversion, and timeout handling all apply.\n */\n defineRoute<Path extends PathForMethod<'get'>>(\n method: 'GET',\n path: Path,\n ): (\n ...args: InitParam<AmigoRequestOptions<OperationFor<Path, 'get'>>>\n ) => Promise<AmigoResponse<OperationResponse<Path, 'get'>>>\n defineRoute<Path extends PathForMethod<'post'>>(\n method: 'POST',\n path: Path,\n ): (\n ...args: InitParam<AmigoRequestOptions<OperationFor<Path, 'post'>>>\n ) => Promise<AmigoResponse<OperationResponse<Path, 'post'>>>\n defineRoute<Path extends PathForMethod<'put'>>(\n method: 'PUT',\n path: Path,\n ): (\n ...args: InitParam<AmigoRequestOptions<OperationFor<Path, 'put'>>>\n ) => Promise<AmigoResponse<OperationResponse<Path, 'put'>>>\n defineRoute<Path extends PathForMethod<'patch'>>(\n method: 'PATCH',\n path: Path,\n ): (\n ...args: InitParam<AmigoRequestOptions<OperationFor<Path, 'patch'>>>\n ) => Promise<AmigoResponse<OperationResponse<Path, 'patch'>>>\n defineRoute<Path extends PathForMethod<'delete'>>(\n method: 'DELETE',\n path: Path,\n ): (\n ...args: InitParam<AmigoRequestOptions<OperationFor<Path, 'delete'>>>\n ) => Promise<AmigoResponse<OperationResponse<Path, 'delete'>>>\n defineRoute<Path extends PathForMethod<'head'>>(\n method: 'HEAD',\n path: Path,\n ): (\n ...args: InitParam<AmigoRequestOptions<OperationFor<Path, 'head'>>>\n ) => Promise<AmigoResponse<OperationResponse<Path, 'head'>>>\n defineRoute<Path extends PathForMethod<'options'>>(\n method: 'OPTIONS',\n path: Path,\n ): (\n ...args: InitParam<AmigoRequestOptions<OperationFor<Path, 'options'>>>\n ) => Promise<AmigoResponse<OperationResponse<Path, 'options'>>>\n defineRoute(\n method: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE' | 'HEAD' | 'OPTIONS',\n path: string,\n ): (init?: AmigoRequestOptions<unknown>) => Promise<AmigoResponse<unknown>> {\n type AnyDispatcher = (p: string, i?: unknown) => Promise<AmigoResponse<unknown>>\n const dispatcher = this[method] as unknown as AnyDispatcher\n return (init?: AmigoRequestOptions<unknown>) => dispatcher.call(this, path, init)\n }\n\n private static fromPlatformClient(\n client: PlatformFetch,\n workspaceId: string,\n baseUrl: string,\n agentBaseUrl?: string,\n ): AmigoClient {\n const instance = Object.create(AmigoClient.prototype) as AmigoClient\n AmigoClient.hydrate(instance, client, workspaceId, baseUrl, agentBaseUrl)\n return instance\n }\n\n private static hydrate(\n target: AmigoClient,\n client: PlatformFetch,\n workspaceId: string,\n baseUrl: string,\n agentBaseUrl?: string,\n ): void {\n const mutable = target as Mutable<AmigoClient>\n\n mutable.workspaceId = workspaceId\n mutable.baseUrl = baseUrl\n mutable.agentBaseUrl = agentBaseUrl\n ;(target as unknown as { api: PlatformFetch }).api = client\n\n mutable.workspaces = new WorkspacesResource(client, workspaceId)\n mutable.apiKeys = new ApiKeysResource(client, workspaceId)\n mutable.agents = new AgentsResource(client, workspaceId)\n mutable.skills = new SkillsResource(client, workspaceId)\n mutable.actions = new ActionsResource(client, workspaceId)\n mutable.operators = new OperatorsResource(client, workspaceId)\n mutable.triggers = new TriggersResource(client, workspaceId)\n mutable.services = new ServicesResource(client, workspaceId)\n mutable.contextGraphs = new ContextGraphsResource(client, workspaceId)\n mutable.dataSources = new DataSourcesResource(client, workspaceId)\n mutable.world = new WorldResource(client, workspaceId)\n mutable.calls = new CallsResource(client, workspaceId)\n mutable.conversations = new ConversationsResource(client, workspaceId, agentBaseUrl)\n mutable.phoneNumbers = new PhoneNumbersResource(client, workspaceId)\n mutable.integrations = new IntegrationsResource(client, workspaceId)\n mutable.analytics = new AnalyticsResource(client, workspaceId)\n mutable.simulations = new SimulationsResource(client, workspaceId)\n mutable.metrics = new MetricsResource(client, workspaceId)\n mutable.settings = new SettingsResource(client, workspaceId)\n mutable.billing = new BillingResource(client, workspaceId)\n mutable.memory = new MemoryResource(client, workspaceId)\n mutable.personas = new PersonasResource(client, workspaceId)\n mutable.reviewQueue = new ReviewQueueResource(client, workspaceId)\n mutable.recordings = new RecordingsResource(client, workspaceId)\n mutable.audit = new AuditResource(client, workspaceId)\n mutable.webhookDestinations = new WebhookDestinationsResource(client, workspaceId)\n mutable.safety = new SafetyResource(client, workspaceId)\n mutable.compliance = new ComplianceResource(client, workspaceId)\n mutable.events = new EventsResource(client, workspaceId)\n mutable.functions = new FunctionsResource(client, workspaceId)\n mutable.observers = new ObserversResource(client, workspaceId, agentBaseUrl)\n }\n\n private async resolveApiRequest<\n Path extends keyof paths & string,\n Method extends 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE' | 'HEAD' | 'OPTIONS',\n >(\n path: Path,\n method: Method,\n init: AmigoRequestOptions<OperationFor<Path, Lowercase<Method>>> | undefined,\n ): Promise<{ data?: unknown; error?: unknown; response: Response }> {\n const { baseClient, options } = resolveScopedPlatformClient(this.api)\n const mergedInit = mergeRequestOptions(options, withWorkspaceId(path, init, this.workspaceId))\n const requestInit = applyPlatformRequestOptions(\n baseClient,\n mergedInit as AmigoRequestOptions<OperationFor<Path, Lowercase<Method>>> | undefined,\n )\n\n switch (method) {\n case 'GET':\n return await baseClient.GET(path as never, requestInit as never)\n case 'POST':\n return await baseClient.POST(path as never, requestInit as never)\n case 'PUT':\n return await baseClient.PUT(path as never, requestInit as never)\n case 'PATCH':\n return await baseClient.PATCH(path as never, requestInit as never)\n case 'DELETE':\n return await baseClient.DELETE(path as never, requestInit as never)\n case 'HEAD':\n return await baseClient.HEAD(path as never, requestInit as never)\n case 'OPTIONS':\n return await baseClient.OPTIONS(path as never, requestInit as never)\n }\n }\n}\n\n// --- Public exports ---\n\nexport type { AmigoClientConfig as AmigoConfig }\n\nexport {\n AmigoError,\n BadRequestError,\n AuthenticationError,\n PermissionError,\n NotFoundError,\n ConflictError,\n ValidationError,\n RateLimitError,\n ServerError,\n ServiceUnavailableError,\n NetworkError,\n RequestTimeoutError,\n ParseError,\n ConfigurationError,\n isAmigoError,\n isNotFoundError,\n isRateLimitError,\n isAuthenticationError,\n isRequestTimeoutError,\n isPermissionError,\n isConflictError,\n isValidationError,\n isServerError,\n isNetworkError,\n isHttpException,\n isHttpValidationError,\n isUnparseableErrorBody,\n} from './core/errors.js'\n\nexport type {\n ErrorContext,\n PlatformErrorBody,\n HttpExceptionBody,\n HttpValidationErrorBody,\n UnparseableErrorBody,\n AmigoErrorWithBody,\n} from './core/errors.js'\n\nexport type {\n WorkspaceId,\n ApiKeyId,\n AgentId,\n PersonaId,\n SkillId,\n ActionId,\n ServiceId,\n ContextGraphId,\n CallId,\n PhoneNumberId,\n IntegrationId,\n EntityId,\n EventId,\n SimulationRunId,\n SimulationSessionId,\n FunctionId,\n DataSourceId,\n} from './core/branded-types.js'\n\nexport {\n workspaceId,\n apiKeyId,\n agentId,\n personaId,\n skillId,\n actionId,\n serviceId,\n contextGraphId,\n callId,\n phoneNumberId,\n integrationId,\n entityId,\n eventId,\n simulationRunId,\n simulationSessionId,\n functionId,\n dataSourceId,\n} from './core/branded-types.js'\n\nexport { paginate } from './core/utils.js'\nexport { buildLastResponse, extractRequestId } from './core/utils.js'\nexport type {\n PaginatedList,\n ListParams,\n LastResponseInfo,\n ResponseMetadata,\n WithResponseMetadata,\n AmigoResponse,\n} from './core/utils.js'\nexport type { AmigoRequestOptions, ScopedRequestOptions } from './core/request-options.js'\nexport type { RetryOptions } from './core/retry.js'\n\nexport { parseRateLimitHeaders } from './core/rate-limit.js'\nexport type { RateLimitInfo } from './core/rate-limit.js'\n\nexport {\n verifyWebhookSignature,\n parseWebhookEvent,\n WebhookVerificationError,\n} from './core/webhooks.js'\nexport type {\n WebhookEvent,\n WebhookVerificationOptions,\n ParseWebhookEventOptions,\n} from './core/webhooks.js'\nexport type {\n ClientHooks,\n RequestHookContext,\n ResponseHookContext,\n ErrorHookContext,\n} from './core/openapi-client.js'\n\nexport type {\n MetricCatalogEntry,\n MetricCatalogResponse,\n MetricListResponse,\n MetricValue,\n NumericalMetricValue,\n CategoricalMetricValue,\n BooleanMetricValue,\n MetricValuesParams,\n MetricTrendParams,\n} from './resources/metrics.js'\n/** @deprecated Use `MetricValue` instead. */\nexport type MetricValueResponse = MetricValueAlias\n\nexport type CallSummary = components['schemas']['CallSummary']\nexport type CallDetail = components['schemas']['CallDetailResponse']\nexport type CallTurn = components['schemas']['Turn']\nexport type CallToolCall = components['schemas']['ToolCall']\nexport type PlaybackTimeline = components['schemas']['PlaybackTimeline']\nexport type TimelineActor = components['schemas']['TimelineActor']\nexport type TimelineLaneDefinition = components['schemas']['TimelineLaneDefinition']\nexport type TimelineSegment = components['schemas']['TimelineSegment']\nexport type TimelineTimebase = components['schemas']['TimelineTimebase']\nexport type TurnTimeline = components['schemas']['TurnTimeline']\nexport type TimelineSegmentType = TimelineSegment['type']\nexport type TimelineLane = TimelineSegment['lane']\nexport type TimelineTrack = NonNullable<TimelineSegment['track']>\nexport type TimelineActorKind = TimelineActor['kind']\nexport type TimelineActorRole = TimelineActor['role']\n\nexport type {\n SubscribeToWorkspaceOptions,\n SubscriptionHandle,\n WorkspaceSSEEvent,\n WorkspaceSSEEventType,\n WorkspaceEventStreamErrorCode,\n} from './resources/events.js'\nexport {\n WorkspaceEventStreamError,\n isWorkspaceEventStreamError,\n} from './resources/events.js'\n\nexport { sessionConnectAuthProtocols, textStreamAuthProtocols } from './resources/conversations.js'\nexport type {\n ConversationDetail,\n ConversationListResponse,\n ConversationSummary,\n ConversationTurn,\n CreateConversationRequest,\n ListConversationsParams,\n SessionConnectUrlParams,\n TextStreamAuthProtocols,\n TextStreamUrlParams,\n TurnDoneEvent,\n TurnErrorEvent,\n TurnMessageEvent,\n TurnRequest,\n TurnResponse,\n TurnStreamEvent,\n TurnThinkingEvent,\n TurnTokenEvent,\n TurnToolCallCompletedEvent,\n TurnToolCallStartedEvent,\n} from './resources/conversations.js'\n\n// Voice-call observer real-time stream\nexport { ObserversResource, observerAuthProtocols } from './resources/observers.js'\nexport type {\n ObserverAuthProtocols,\n ObserverSSEEvent,\n ObserverSSEEventType,\n ObserverSubscribeOptions,\n} from './resources/observers.js'\n\n// Reconnecting WebSocket primitive (compose for custom realtime surfaces)\nexport {\n createReconnectingWebSocket,\n ReconnectingWebSocketError,\n} from './core/reconnecting-websocket.js'\nexport type {\n ReconnectingWebSocketErrorReason,\n ReconnectingWebSocketHandle,\n ReconnectingWebSocketOptions,\n ReconnectingWebSocketState,\n WebSocketFactory,\n} from './core/reconnecting-websocket.js'\n\n// Device code auth (desktop / CLI login)\nexport {\n loginWithDeviceCode,\n TokenManager,\n FileTokenStorage,\n MemoryTokenStorage,\n DeviceCodeExpiredError,\n DeviceCodeDeniedError,\n RefreshTokenExpiredError,\n LoginCancelledError,\n formatDeviceCodeInstructions,\n formatDeviceCodeLink,\n formatWorkspaceList,\n openBrowser,\n} from './core/device-code.js'\nexport type {\n DeviceCodeIssuance,\n IdentityTokenResponse,\n WorkspaceChoice,\n MultiWorkspaceResponse,\n DeviceCodeLoginOptions,\n DeviceCodeStatus,\n AuthResult,\n StoredCredentials,\n TokenStorage,\n TokenManagerConfig,\n} from './core/device-code.js'\n\n// Generated OpenAPI types \u2014 consumers can import specific schemas\nexport type { paths, components, operations } from './generated/api.js'\n\nfunction withWorkspaceId<Path extends keyof paths & string, Init>(\n path: Path,\n init: Init | undefined,\n workspaceId: string,\n): Init | { params: { path: { workspace_id: string } } } {\n if (!path.includes('{workspace_id}')) {\n return (init ?? {}) as Init\n }\n\n const current = (init ?? {}) as {\n params?: {\n path?: Record<string, unknown>\n }\n }\n\n return {\n ...current,\n params: {\n ...(current.params ?? {}),\n path: {\n ...(current.params?.path ?? {}),\n workspace_id: workspaceId,\n },\n },\n }\n}\n", "/**\n * Error hierarchy for the Amigo Platform SDK.\n * All errors extend AmigoError which can be caught with a single catch.\n */\n\nimport type { components } from '../generated/api.js'\n\nexport interface ErrorContext {\n statusCode?: number\n errorCode?: string\n requestId?: string\n detail?: string\n context?: Record<string, unknown>\n /** Parsed error body (typed when recognized) */\n errorBody?: PlatformErrorBody\n /** Raw body string for diagnostic logging \u2014 populated even on parse failure */\n rawBody?: string\n}\n\n// --- Typed error body shapes ---\n\n/**\n * FastAPI 422 validation-error body.\n * Surfaces from openapi-typescript so consumers can read field-level errors.\n */\nexport type HttpValidationErrorBody = components['schemas']['HTTPValidationError']\n\n/**\n * Default FastAPI HTTPException shape (`raise HTTPException(status_code, detail=...)`).\n *\n * Most platform-api routes that don't define an explicit error model return\n * this shape. `detail` may be a free-form string or a JSON-serializable object.\n */\nexport interface HttpExceptionBody {\n detail: string | Record<string, unknown> | unknown[]\n /** Populated by request-id middleware on bounded routes */\n request_id?: string\n /** Populated by typed error responses (e.g. Surface lifecycle errors) */\n error_code?: string\n}\n\n/**\n * Fallback shape used when the response body fails to parse or is empty.\n * `rawBody` is the verbatim text (truncated to 8 KB to avoid log bloat).\n */\nexport interface UnparseableErrorBody {\n detail: string\n raw_body: string\n}\n\n/**\n * Discriminated union of all error body shapes the platform API emits.\n *\n * Consumers should use the type guards (`isHttpException`,\n * `isHttpValidationError`, `isUnparseableErrorBody`) rather than checking\n * fields directly \u2014 both `HttpExceptionBody` and `HttpValidationErrorBody`\n * have a `detail` field but it is shaped differently.\n */\nexport type PlatformErrorBody = HttpExceptionBody | HttpValidationErrorBody | UnparseableErrorBody\n\nconst RAW_BODY_LIMIT = 8 * 1024 // 8 KB\n\nconst SENSITIVE_FIELDS = new Set([\n 'id_token',\n 'access_token',\n 'refresh_token',\n 'authorization',\n 'api_key',\n 'apikey',\n 'token',\n 'secret',\n 'password',\n 'x-api-key',\n 'cookie',\n 'set-cookie',\n])\n\nfunction sanitizeErrorContext(obj: unknown): unknown {\n if (typeof obj !== 'object' || !obj) return obj\n if (Array.isArray(obj)) return obj.map(sanitizeErrorContext)\n\n const result: Record<string, unknown> = {}\n for (const [key, value] of Object.entries(obj as Record<string, unknown>)) {\n if (SENSITIVE_FIELDS.has(key.toLowerCase())) {\n result[key] = '[REDACTED]'\n } else if (typeof value === 'object' && value !== null) {\n result[key] = sanitizeErrorContext(value)\n } else {\n result[key] = value\n }\n }\n return result\n}\n\n/** Base class for all Amigo Platform SDK errors */\nexport class AmigoError<TBody extends PlatformErrorBody = PlatformErrorBody> extends Error {\n readonly statusCode?: number\n readonly errorCode?: string\n readonly requestId?: string\n readonly detail?: string\n readonly context?: Record<string, unknown>\n /**\n * Typed body of the error response, when one was returned and successfully\n * parsed. Use the `isHttpException` / `isHttpValidationError` /\n * `isUnparseableErrorBody` type guards to narrow the discriminated union.\n *\n * Named `errorBody` (not `body`) to avoid colliding with the legacy\n * `ParseError.body: string` field.\n */\n readonly errorBody?: TBody\n /**\n * Raw response body (truncated to 8 KB). Populated even when parsing fails,\n * so callers always have something to log when debugging server errors.\n */\n readonly rawBody?: string\n\n constructor(message: string, ctx: ErrorContext = {}) {\n super(message)\n this.name = this.constructor.name\n this.statusCode = ctx.statusCode\n this.errorCode = ctx.errorCode\n this.requestId = ctx.requestId\n this.detail = ctx.detail\n this.context = ctx.context\n ? (sanitizeErrorContext(ctx.context) as Record<string, unknown>)\n : undefined\n this.errorBody = ctx.errorBody as TBody | undefined\n this.rawBody = ctx.rawBody\n Object.setPrototypeOf(this, new.target.prototype)\n if (typeof Error.captureStackTrace === 'function') {\n Error.captureStackTrace(this, this.constructor)\n }\n }\n\n toJSON(): Record<string, unknown> {\n return {\n name: this.name,\n message: this.message,\n statusCode: this.statusCode,\n errorCode: this.errorCode,\n requestId: this.requestId,\n detail: this.detail,\n context: this.context,\n stack: this.stack,\n }\n }\n}\n\n/** 400 Bad Request */\nexport class BadRequestError extends AmigoError {\n constructor(message: string, ctx: ErrorContext = {}) {\n super(message, { ...ctx, statusCode: 400 })\n }\n}\n\n/** 401 Unauthorized \u2014 invalid or missing API key */\nexport class AuthenticationError extends AmigoError {\n constructor(message: string, ctx: ErrorContext = {}) {\n super(message, { ...ctx, statusCode: 401 })\n }\n}\n\n/** 403 Forbidden \u2014 insufficient permissions */\nexport class PermissionError extends AmigoError {\n constructor(message: string, ctx: ErrorContext = {}) {\n super(message, { ...ctx, statusCode: 403 })\n }\n}\n\n/** 404 Not Found */\nexport class NotFoundError extends AmigoError {\n constructor(message: string, ctx: ErrorContext = {}) {\n super(message, { ...ctx, statusCode: 404 })\n }\n}\n\n/** 409 Conflict \u2014 duplicate slug or resource version conflict */\nexport class ConflictError extends AmigoError {\n constructor(message: string, ctx: ErrorContext = {}) {\n super(message, { ...ctx, statusCode: 409 })\n }\n}\n\n/** 422 Unprocessable Entity \u2014 validation failure */\nexport class ValidationError extends AmigoError {\n constructor(message: string, ctx: ErrorContext = {}) {\n super(message, { ...ctx, statusCode: 422 })\n }\n}\n\n/** 429 Too Many Requests */\nexport class RateLimitError extends AmigoError {\n readonly retryAfter?: number\n\n constructor(message: string, ctx: ErrorContext & { retryAfter?: number } = {}) {\n super(message, { ...ctx, statusCode: 429 })\n this.retryAfter = ctx.retryAfter\n }\n}\n\n/** 5xx Server Error */\nexport class ServerError extends AmigoError {\n constructor(message: string, ctx: ErrorContext = {}) {\n super(message, { ...ctx, statusCode: ctx.statusCode ?? 500 })\n }\n}\n\n/** 503 Service Unavailable */\nexport class ServiceUnavailableError extends ServerError {\n constructor(message: string, ctx: ErrorContext = {}) {\n super(message, { ...ctx, statusCode: 503 })\n }\n}\n\n/** Network or fetch failure (no HTTP status available) */\nexport class NetworkError extends AmigoError {\n constructor(message: string, cause?: unknown) {\n super(message)\n if (cause !== undefined) {\n Object.defineProperty(this, 'cause', { value: cause, writable: false, enumerable: true })\n }\n }\n}\n\n/** Request timed out before receiving a response */\nexport class RequestTimeoutError extends NetworkError {\n readonly timeoutMs?: number\n\n constructor(message: string, timeoutMs?: number, cause?: unknown) {\n super(message, cause)\n this.timeoutMs = timeoutMs\n }\n}\n\n/** Failed to parse response body */\nexport class ParseError extends AmigoError {\n readonly body?: string\n\n constructor(message: string, body?: string) {\n super(message)\n this.body = body\n }\n}\n\n/** SDK misconfiguration */\nexport class ConfigurationError extends AmigoError {\n constructor(message: string) {\n super(message)\n }\n}\n\n// --- Factory ---\n\n/**\n * Internal: legacy flat-shape probe of the parsed JSON body. Used to surface\n * `error_code` / `request_id` / `message` fields that older platform-api\n * routes return alongside the canonical `detail` field.\n */\ninterface LegacyFlatBody {\n message?: unknown\n detail?: unknown\n error_code?: unknown\n request_id?: unknown\n}\n\n/**\n * Best-effort body reader. Always returns *something* \u2014 never throws.\n *\n * - On successful JSON parse: returns the typed body (HttpException or\n * HTTPValidationError shape) plus the raw text for logging.\n * - On parse failure or empty body: returns an UnparseableErrorBody with\n * `detail` set to `response.statusText` and the raw text preserved.\n * - On network read failure (connection drop mid-read): returns an\n * UnparseableErrorBody with empty `raw_body`.\n */\nasync function readErrorBody(response: Response): Promise<{\n body: PlatformErrorBody\n rawBody: string\n}> {\n let rawBody = ''\n try {\n rawBody = await response.text()\n } catch {\n // Connection dropped mid-read or body already consumed \u2014 fall through.\n return {\n body: { detail: response.statusText || `HTTP ${response.status}`, raw_body: '' },\n rawBody: '',\n }\n }\n\n const truncatedRaw = rawBody.length > RAW_BODY_LIMIT ? rawBody.slice(0, RAW_BODY_LIMIT) : rawBody\n\n if (rawBody.length === 0) {\n return {\n body: { detail: response.statusText || `HTTP ${response.status}`, raw_body: '' },\n rawBody: '',\n }\n }\n\n try {\n const parsed = JSON.parse(rawBody) as unknown\n if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {\n // Recognized shapes: HTTPValidationError (detail is array) or HttpException.\n return { body: parsed as PlatformErrorBody, rawBody: truncatedRaw }\n }\n // JSON parsed but isn't an object (e.g. null, string literal) \u2014 surface as\n // unparseable so consumers don't have to guard against weird shapes.\n return {\n body: {\n detail: response.statusText || `HTTP ${response.status}`,\n raw_body: truncatedRaw,\n },\n rawBody: truncatedRaw,\n }\n } catch {\n return {\n body: {\n detail: response.statusText || `HTTP ${response.status}`,\n raw_body: truncatedRaw,\n },\n rawBody: truncatedRaw,\n }\n }\n}\n\nfunction safeStringify(value: unknown): string {\n try {\n return JSON.stringify(value)\n } catch {\n return String(value)\n }\n}\n\nexport async function createApiError(response: Response): Promise<AmigoError> {\n const { body, rawBody } = await readErrorBody(response)\n const flat = body as LegacyFlatBody\n\n const detailString =\n typeof flat.detail === 'string'\n ? flat.detail\n : flat.detail !== undefined\n ? safeStringify(flat.detail)\n : undefined\n\n const errorCode = typeof flat.error_code === 'string' ? flat.error_code : undefined\n const requestIdFromBody = typeof flat.request_id === 'string' ? flat.request_id : undefined\n const messageFromBody = typeof flat.message === 'string' ? flat.message : undefined\n\n const ctx: ErrorContext = {\n statusCode: response.status,\n errorCode,\n requestId: requestIdFromBody ?? response.headers.get('x-request-id') ?? undefined,\n detail: detailString,\n context: { url: response.url, response: body },\n errorBody: body,\n rawBody,\n }\n const message =\n messageFromBody ?? detailString ?? response.statusText ?? `HTTP ${response.status}`\n\n switch (response.status) {\n case 400:\n return new BadRequestError(message, ctx)\n case 401:\n return new AuthenticationError(message, ctx)\n case 403:\n return new PermissionError(message, ctx)\n case 404:\n return new NotFoundError(message, ctx)\n case 409:\n return new ConflictError(message, ctx)\n case 422:\n return new ValidationError(message, ctx)\n case 429: {\n const retryAfter = parseRetryAfter(response)\n return new RateLimitError(message, { ...ctx, retryAfter })\n }\n case 503:\n return new ServiceUnavailableError(message, ctx)\n default:\n return new ServerError(message, ctx)\n }\n}\n\nfunction parseRetryAfter(response: Response): number | undefined {\n const header = response.headers.get('Retry-After')\n if (!header) return undefined\n const seconds = Number(header)\n if (!isNaN(seconds)) return seconds\n const date = new Date(header)\n if (!isNaN(date.getTime())) {\n return Math.max(0, Math.ceil((date.getTime() - Date.now()) / 1000))\n }\n return undefined\n}\n\n// --- Type guards ---\n\nexport function isAmigoError(err: unknown): err is AmigoError {\n return err instanceof AmigoError\n}\n\nexport function isNotFoundError(err: unknown): err is NotFoundError {\n return err instanceof NotFoundError\n}\n\nexport function isRateLimitError(err: unknown): err is RateLimitError {\n return err instanceof RateLimitError\n}\n\nexport function isAuthenticationError(err: unknown): err is AuthenticationError {\n return err instanceof AuthenticationError\n}\n\nexport function isRequestTimeoutError(err: unknown): err is RequestTimeoutError {\n return err instanceof RequestTimeoutError\n}\n\nexport function isPermissionError(err: unknown): err is PermissionError {\n return err instanceof PermissionError\n}\n\nexport function isConflictError(err: unknown): err is ConflictError {\n return err instanceof ConflictError\n}\n\nexport function isValidationError(err: unknown): err is ValidationError {\n return err instanceof ValidationError\n}\n\nexport function isServerError(err: unknown): err is ServerError {\n return err instanceof ServerError\n}\n\nexport function isNetworkError(err: unknown): err is NetworkError {\n return err instanceof NetworkError\n}\n\n// --- Body type guards ---\n\n/**\n * Narrowed AmigoError where `errorBody` is guaranteed non-undefined.\n * Used as the return-type for body type guards so consumers don't need to\n * re-assert `errorBody !== undefined` after the guard.\n */\nexport type AmigoErrorWithBody<TBody extends PlatformErrorBody> = AmigoError<TBody> & {\n readonly errorBody: TBody\n}\n\n/**\n * True when `err.errorBody` is the FastAPI 422 validation-error shape (an\n * object with `detail: ValidationError[]`). Lets consumers iterate\n * field-level errors without `as any`:\n *\n * ```ts\n * if (isHttpValidationError(err)) {\n * for (const issue of err.errorBody.detail ?? []) {\n * console.log(issue.loc, issue.msg)\n * }\n * }\n * ```\n */\nexport function isHttpValidationError(\n err: unknown,\n): err is AmigoErrorWithBody<HttpValidationErrorBody> {\n if (!(err instanceof AmigoError)) return false\n const body = err.errorBody as { detail?: unknown } | undefined\n return Array.isArray(body?.detail)\n}\n\n/**\n * True when `err.errorBody` is the default FastAPI HTTPException shape\n * (`{ detail: string | object | array }`, possibly with `error_code` /\n * `request_id`). This is the most common error body across platform-api.\n */\nexport function isHttpException(err: unknown): err is AmigoErrorWithBody<HttpExceptionBody> {\n if (!(err instanceof AmigoError)) return false\n const body = err.errorBody\n if (!body) return false\n if (Array.isArray((body as { detail?: unknown }).detail)) {\n // HTTPValidationError, not a plain HTTPException\n return false\n }\n // Has detail (string/object) and no `raw_body` discriminator from the unparseable fallback\n return 'detail' in body && !('raw_body' in body)\n}\n\n/**\n * True when the response body could not be parsed as JSON (or was empty).\n * `err.errorBody.raw_body` is the verbatim text (truncated to 8 KB).\n */\nexport function isUnparseableErrorBody(\n err: unknown,\n): err is AmigoErrorWithBody<UnparseableErrorBody> {\n if (!(err instanceof AmigoError)) return false\n const body = err.errorBody as { raw_body?: unknown } | undefined\n return typeof body?.raw_body === 'string'\n}\n", "/**\n * Creates a configured openapi-fetch client with auth, error handling,\n * and retry middleware.\n *\n * Supports custom `fetch` for BFF proxy patterns (e.g., developer-console\n * routing through Next.js API routes).\n */\n\nimport createClientImport, { type HeadersOptions, type Middleware } from 'openapi-fetch'\nimport type { paths } from '../generated/api.js'\nimport { createAuthMiddleware } from './auth.js'\nimport { createApiError, ConfigurationError, NetworkError, RequestTimeoutError } from './errors.js'\nimport { parseRateLimitHeaders } from './rate-limit.js'\nimport {\n stripRequestControls,\n type AmigoRequestOptions,\n type RequestControlOptions,\n} from './request-options.js'\nimport { shouldRetry, computeDelay, resolveRetryOptions, type RetryOptions } from './retry.js'\nimport { extractRequestId } from './utils.js'\n\n// Handle ESM/CJS interop for openapi-fetch (esbuild __toESM wrapper)\nconst createClient: typeof createClientImport =\n typeof createClientImport === 'function'\n ? createClientImport\n : (createClientImport as unknown as { default: typeof createClientImport }).default\n\nexport type PlatformFetch = ReturnType<typeof createClient<paths>>\n\nexport interface RequestHookContext {\n id: string\n request: Request\n schemaPath: string\n}\n\nexport interface ResponseHookContext extends RequestHookContext {\n response: Response\n requestId: string | null\n rateLimit: ReturnType<typeof parseRateLimitHeaders>\n}\n\nexport interface ErrorHookContext extends RequestHookContext {\n error: unknown\n}\n\nexport interface ClientHooks {\n onRequest?: (context: RequestHookContext) => void | Promise<void>\n onResponse?: (context: ResponseHookContext) => void | Promise<void>\n onError?: (context: ErrorHookContext) => void | Promise<void>\n}\n\nexport interface ClientConfig {\n apiKey: string\n baseUrl: string\n retry?: RetryOptions\n maxRetries?: number\n timeout?: number\n headers?: HeadersOptions\n hooks?: ClientHooks\n /** Custom fetch implementation \u2014 use for BFF proxy routing or test mocking. */\n fetch?: typeof globalThis.fetch\n}\n\ntype RequestTransport = (input: Request) => Promise<Response>\n\ninterface PlatformClientContext {\n transport: RequestTransport\n defaults: RequestControlOptions\n baseUrl: string\n}\n\nconst platformClientContext = new WeakMap<PlatformFetch, PlatformClientContext>()\n\nexport function createPlatformClient(config: ClientConfig): PlatformFetch {\n const transport = toRequestTransport(config.fetch ?? globalThis.fetch)\n const defaults = {\n retry: config.retry,\n maxRetries: config.maxRetries,\n timeout: config.timeout,\n } satisfies RequestControlOptions\n\n const client = createClient<paths>({\n baseUrl: config.baseUrl,\n fetch: createRetryingFetch(transport, defaults),\n headers: config.headers,\n })\n\n platformClientContext.set(client, { transport, defaults, baseUrl: config.baseUrl })\n\n // Error middleware \u2014 convert HTTP errors to typed AmigoError subclasses\n const errorMiddleware: Middleware = {\n async onResponse({ response }) {\n if (!response.ok) {\n throw await createApiError(response)\n }\n return response\n },\n }\n\n // Auth middleware \u2014 attach Bearer token\n const authMiddleware = createAuthMiddleware({ apiKey: config.apiKey })\n const hookMiddleware: Middleware | undefined = config.hooks\n ? {\n async onRequest({ request, schemaPath, id }) {\n await config.hooks?.onRequest?.({ request, schemaPath, id })\n return request\n },\n async onResponse({ request, response, schemaPath, id }) {\n await config.hooks?.onResponse?.({\n id,\n request,\n response,\n schemaPath,\n requestId: extractRequestId(response),\n rateLimit: parseRateLimitHeaders(response.headers),\n })\n return response\n },\n async onError({ request, error, schemaPath, id }) {\n await config.hooks?.onError?.({ id, request, error, schemaPath })\n },\n }\n : undefined\n\n // Order: auth first (adds header), then error (converts failures)\n client.use(authMiddleware)\n client.use(errorMiddleware)\n if (hookMiddleware) {\n client.use(hookMiddleware)\n }\n\n return client\n}\n\nexport function applyPlatformRequestOptions<Operation>(\n client: PlatformFetch,\n init: AmigoRequestOptions<Operation> | undefined,\n): AmigoRequestOptions<Operation> | undefined {\n if (!init) {\n return undefined\n }\n\n const context = platformClientContext.get(client)\n const stripped = stripRequestControls(init)\n\n if (!context) {\n return stripped as AmigoRequestOptions<Operation> | undefined\n }\n\n const overrideFetch = stripped?.fetch\n const hasControlOverride =\n overrideFetch !== undefined ||\n init.timeout !== undefined ||\n init.maxRetries !== undefined ||\n init.retry !== undefined\n\n if (!hasControlOverride) {\n return stripped as AmigoRequestOptions<Operation> | undefined\n }\n\n const transport = toRequestTransport(\n (overrideFetch ?? context.transport) as typeof globalThis.fetch,\n )\n const fetch = createRetryingFetch(transport, {\n timeout: init.timeout ?? context.defaults.timeout,\n maxRetries: init.maxRetries ?? context.defaults.maxRetries,\n retry: init.retry ?? context.defaults.retry,\n })\n\n return {\n ...stripped,\n fetch,\n } as AmigoRequestOptions<Operation>\n}\n\n/** @internal */\nexport function getPlatformClientBaseUrl(client: PlatformFetch): string {\n const context = platformClientContext.get(client)\n if (!context) {\n throw new ConfigurationError('Platform client baseUrl is unavailable')\n }\n return context.baseUrl\n}\n\nfunction createRetryingFetch(\n transport: RequestTransport,\n defaults: RequestControlOptions,\n): typeof globalThis.fetch {\n return async (input, init) => {\n const baseRequest = input instanceof Request ? input : new Request(input, init)\n const method = baseRequest.method.toUpperCase()\n const retryOpts = resolveRetryOptions(defaults.retry, defaults.maxRetries)\n const timeoutMs = defaults.timeout\n const isIdempotent = method === 'GET' || method === 'HEAD' || method === 'OPTIONS'\n\n for (let attempt = 0; attempt < retryOpts.maxAttempts; attempt++) {\n let response: Response | undefined\n let error: unknown\n let timedOut = false\n\n try {\n const prepared = prepareRequestForAttempt(baseRequest, timeoutMs)\n\n try {\n response = await transport(prepared.request)\n } finally {\n timedOut = prepared.timedOut\n prepared.cleanup()\n }\n } catch (err) {\n error = err\n }\n\n if (!error && response && response.ok) return response\n\n const ctx = { method, attempt, response: response!, options: retryOpts }\n const attemptsRemain = attempt + 1 < retryOpts.maxAttempts\n\n if (error) {\n if (timedOut) {\n throw new RequestTimeoutError(`Request timed out after ${timeoutMs}ms`, timeoutMs, error)\n }\n if (isIdempotent && attemptsRemain) {\n await sleep(computeDelay(attempt, new Response(), retryOpts))\n continue\n }\n throw new NetworkError(\n `Network error: ${error instanceof Error ? error.message : String(error)}`,\n error,\n )\n }\n\n if (response && attemptsRemain && shouldRetry(ctx)) {\n const delay = computeDelay(attempt, response, retryOpts)\n if (baseRequest.signal.aborted) return response\n await sleep(delay)\n continue\n }\n\n return response!\n }\n\n throw new NetworkError('Retry loop exhausted')\n }\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms))\n}\n\nfunction toRequestTransport(fetcher: typeof globalThis.fetch | RequestTransport): RequestTransport {\n return async (input) => fetcher(input)\n}\n\nfunction prepareRequestForAttempt(\n request: Request,\n timeoutMs?: number,\n): {\n request: Request\n readonly timedOut: boolean\n cleanup: () => void\n} {\n const attemptRequest = request.clone()\n const timeout = createTimeoutSignal(attemptRequest.signal, timeoutMs)\n\n if (!timeout.signal) {\n return {\n request: attemptRequest,\n timedOut: false,\n cleanup: timeout.cleanup,\n }\n }\n\n return {\n request: new Request(attemptRequest, { signal: timeout.signal }),\n get timedOut() {\n return timeout.didTimeout\n },\n cleanup: timeout.cleanup,\n }\n}\n\nfunction createTimeoutSignal(\n upstream: AbortSignal | null,\n timeoutMs?: number,\n): {\n signal?: AbortSignal\n didTimeout: boolean\n cleanup: () => void\n} {\n if (!timeoutMs || !Number.isFinite(timeoutMs) || timeoutMs <= 0) {\n return {\n signal: upstream ?? undefined,\n didTimeout: false,\n cleanup: () => {},\n }\n }\n\n const controller = new AbortController()\n let didTimeout = false\n const cleanups: Array<() => void> = []\n\n const onAbort = () => controller.abort(upstream?.reason)\n if (upstream) {\n if (upstream.aborted) {\n controller.abort(upstream.reason)\n } else {\n upstream.addEventListener('abort', onAbort, { once: true })\n cleanups.push(() => upstream.removeEventListener('abort', onAbort))\n }\n }\n\n const timer = setTimeout(() => {\n didTimeout = true\n controller.abort()\n }, timeoutMs)\n cleanups.push(() => clearTimeout(timer))\n\n return {\n signal: controller.signal,\n get didTimeout() {\n return didTimeout\n },\n cleanup: () => {\n for (const cleanup of cleanups) {\n cleanup()\n }\n },\n }\n}\n", "/**\n * Auth middleware for the Amigo Platform SDK.\n *\n * The platform-api accepts Bearer tokens in two forms:\n * 1. RS256 JWT issued by the Identity service\n * 2. Legacy API keys (created via POST /v1/{workspace_id}/api-keys)\n *\n * This SDK accepts an API key string and attaches it directly as\n * `Authorization: Bearer {apiKey}`. No token exchange is required.\n */\n\nimport type { Middleware } from 'openapi-fetch'\nimport { AuthenticationError } from './errors.js'\n\nexport interface AuthConfig {\n apiKey: string\n}\n\n/**\n * Creates openapi-fetch middleware that attaches the Bearer token\n * to every outgoing request and converts 401 responses to AuthenticationError.\n */\nexport function createAuthMiddleware(config: AuthConfig): Middleware {\n return {\n async onRequest({ request }) {\n request.headers.set('Authorization', `Bearer ${config.apiKey}`)\n return request\n },\n\n async onResponse({ response }) {\n if (response.status === 401) {\n throw new AuthenticationError('Invalid or expired API key. Check your credentials.', {\n statusCode: 401,\n })\n }\n return response\n },\n }\n}\n", "export interface RateLimitInfo {\n limit: number | null\n remaining: number | null\n reset: Date | null\n retryAfter: number | null\n}\n\nexport function parseRateLimitHeaders(headers: Headers): RateLimitInfo {\n const limit = headers.get('x-ratelimit-limit')\n const remaining = headers.get('x-ratelimit-remaining')\n const reset = headers.get('x-ratelimit-reset')\n const retryAfter = headers.get('retry-after')\n\n return {\n limit: limit ? parseInt(limit, 10) : null,\n remaining: remaining ? parseInt(remaining, 10) : null,\n reset: reset ? new Date(parseInt(reset, 10) * 1000) : null,\n retryAfter: retryAfter ? parseInt(retryAfter, 10) : null,\n }\n}\n", "import type { FetchOptions, HeadersOptions } from 'openapi-fetch'\nimport type { paths } from '../generated/api.js'\nimport type { RetryOptions } from './retry.js'\n\nexport type OperationFor<\n Path extends keyof paths & string,\n Method extends keyof paths[Path] & string,\n> = paths[Path][Method]\n\ntype OptionalizeWorkspacePath<PathParams> = PathParams extends { workspace_id: infer WorkspaceId }\n ? Omit<PathParams, 'workspace_id'> & { workspace_id?: WorkspaceId }\n : PathParams\n\ntype EmptyShape = Record<never, never>\n\ntype RewriteParams<Options> = Options extends { params: infer Params }\n ? RewriteParamShape<Params> extends infer RewrittenParams\n ? RewrittenParams extends object\n ? RequiredKeysOf<RewrittenParams> extends never\n ? Omit<Options, 'params'> & { params?: RewrittenParams }\n : Omit<Options, 'params'> & { params: RewrittenParams }\n : Omit<Options, 'params'> & { params: RewrittenParams }\n : Options\n : Options extends { params?: infer Params }\n ? Omit<Options, 'params'> & { params?: RewriteParamShape<Params> }\n : Options\n\ntype RewriteParamShape<Params> = Params extends object\n ? Omit<Params, 'path'> & RewritePathParam<Params>\n : Params\n\ntype RewritePathParam<Params> = Params extends { path: infer PathParams }\n ? OptionalizeWorkspacePath<PathParams> extends infer RewrittenPath\n ? RewrittenPath extends object\n ? RequiredKeysOf<RewrittenPath> extends never\n ? { path?: RewrittenPath }\n : { path: RewrittenPath }\n : { path: RewrittenPath }\n : EmptyShape\n : EmptyShape\n\ntype RequiredKeysOf<T extends object> = Exclude<\n {\n [K in keyof T]-?: EmptyShape extends Pick<T, K> ? never : K\n }[keyof T],\n undefined\n>\n\nexport type InitParam<Init extends object> =\n RequiredKeysOf<Init> extends never ? [init?: Init] : [init: Init]\n\nexport type AmigoRequestOptions<Operation = unknown> = Omit<\n RewriteParams<FetchOptions<Operation>>,\n 'timeout' | 'maxRetries' | 'retry'\n> & {\n timeout?: number\n maxRetries?: number\n retry?: RetryOptions\n}\n\nexport type ScopedRequestOptions = Omit<RequestInit, 'body' | 'headers' | 'method'> & {\n headers?: HeadersOptions\n timeout?: number\n maxRetries?: number\n retry?: RetryOptions\n}\n\nexport interface RequestControlOptions {\n timeout?: number\n maxRetries?: number\n retry?: RetryOptions\n}\n\ntype MergeableRequestOptions = object & {\n headers?: HeadersOptions\n signal?: AbortSignal | null\n timeout?: number\n maxRetries?: number\n retry?: RetryOptions\n}\n\nexport function stripRequestControls<Options extends RequestControlOptions>(\n options: Options | undefined,\n): Omit<Options, keyof RequestControlOptions> | undefined {\n if (!options) {\n return undefined\n }\n\n const rest = { ...options } as Partial<Options & RequestControlOptions>\n delete rest.timeout\n delete rest.maxRetries\n delete rest.retry\n return rest as Omit<Options, keyof RequestControlOptions>\n}\n\nexport function mergeRequestOptions<Options extends object>(\n base: ScopedRequestOptions | undefined,\n override: Options | undefined,\n): (Options & MergeableRequestOptions) | undefined {\n if (!base) {\n return override as (Options & MergeableRequestOptions) | undefined\n }\n\n if (!override) {\n return base as Options & MergeableRequestOptions\n }\n\n const mergeableOverride = override as Options & Partial<MergeableRequestOptions>\n\n return {\n ...base,\n ...override,\n headers: mergeHeaders(base.headers, mergeableOverride.headers),\n signal: mergeableOverride.signal ?? base.signal,\n timeout: mergeableOverride.timeout ?? base.timeout,\n maxRetries: mergeableOverride.maxRetries ?? base.maxRetries,\n retry: mergeableOverride.retry ?? base.retry,\n } as Options & MergeableRequestOptions\n}\n\nexport function mergeScopedRequestOptions(\n base: ScopedRequestOptions | undefined,\n override: ScopedRequestOptions,\n): ScopedRequestOptions {\n return mergeRequestOptions(base, override) ?? override\n}\n\nexport function mergeHeaders(\n base: HeadersOptions | undefined,\n override: HeadersOptions | undefined,\n): Headers | undefined {\n if (!base && !override) {\n return undefined\n }\n\n const headers = new Headers()\n let hasEntries = false\n\n applyHeaders(headers, base, () => {\n hasEntries = true\n })\n applyHeaders(headers, override, () => {\n hasEntries = true\n })\n\n return hasEntries ? headers : undefined\n}\n\nfunction applyHeaders(\n target: Headers,\n source: HeadersOptions | undefined,\n onSet: () => void,\n): void {\n if (!source) {\n return\n }\n\n if (source instanceof Headers) {\n source.forEach((value, key) => {\n target.set(key, value)\n onSet()\n })\n return\n }\n\n if (Array.isArray(source)) {\n for (const [key, value] of source) {\n if (!key) {\n continue\n }\n\n if (value === null || value === undefined) {\n target.delete(key)\n continue\n }\n\n target.set(key, String(value))\n onSet()\n }\n return\n }\n\n for (const [key, value] of Object.entries(source)) {\n if (value === null || value === undefined) {\n target.delete(key)\n continue\n }\n\n target.set(\n key,\n Array.isArray(value) ? value.map((item) => String(item)).join(', ') : String(value),\n )\n onSet()\n }\n}\n", "/**\n * Exponential backoff with full jitter and Retry-After header support.\n */\n\nexport interface RetryOptions {\n /** Maximum number of attempts (including the first). Default: 3 */\n maxAttempts?: number\n /** Base delay in milliseconds. Default: 250 */\n baseDelayMs?: number\n /** Maximum delay cap in milliseconds. Default: 30_000 */\n maxDelayMs?: number\n}\n\nconst RETRYABLE_STATUS_CODES = new Set([408, 429, 500, 502, 503, 504])\n// POST is only retried on 429 with a Retry-After header (idempotency concern)\nconst POST_RETRYABLE_STATUS_CODES = new Set([429])\nlet jitterCounter = 0\ntype CryptoLike = {\n getRandomValues<T extends Uint32Array>(array: T): T\n}\n\nexport interface RetryContext {\n method: string\n attempt: number\n response: Response\n options: Required<RetryOptions>\n}\n\nexport function shouldRetry(ctx: RetryContext): boolean {\n const { method, attempt, response, options } = ctx\n if (attempt >= options.maxAttempts) return false\n\n const status = response.status\n if (method === 'GET' || method === 'HEAD') {\n return RETRYABLE_STATUS_CODES.has(status)\n }\n if (method === 'POST' && POST_RETRYABLE_STATUS_CODES.has(status)) {\n return response.headers.has('Retry-After')\n }\n return false\n}\n\nexport function computeDelay(\n attempt: number,\n response: Response,\n options: Required<RetryOptions>,\n): number {\n const retryAfterHeader = response.headers.get('Retry-After')\n if (retryAfterHeader) {\n const seconds = parseRetryAfterHeader(retryAfterHeader)\n if (seconds !== undefined) return seconds * 1000\n }\n\n // Exponential backoff with full jitter: random value in [0, min(maxDelay, base * 2^attempt)]\n const exponential = Math.min(options.maxDelayMs, options.baseDelayMs * Math.pow(2, attempt))\n return jitterFraction() * exponential\n}\n\nfunction parseRetryAfterHeader(header: string): number | undefined {\n const seconds = Number(header)\n if (!isNaN(seconds)) return seconds\n const date = new Date(header)\n if (!isNaN(date.getTime())) {\n return Math.max(0, Math.ceil((date.getTime() - Date.now()) / 1000))\n }\n return undefined\n}\n\nexport function resolveRetryOptions(\n opts?: RetryOptions,\n maxRetries?: number,\n): Required<RetryOptions> {\n const maxAttempts =\n typeof maxRetries === 'number' && Number.isFinite(maxRetries)\n ? Math.max(1, Math.floor(maxRetries) + 1)\n : (opts?.maxAttempts ?? 3)\n\n return {\n maxAttempts,\n baseDelayMs: opts?.baseDelayMs ?? 250,\n maxDelayMs: opts?.maxDelayMs ?? 30_000,\n }\n}\n\nfunction jitterFraction(): number {\n const cryptoApi = getCryptoApi()\n if (cryptoApi) {\n const value = new Uint32Array(1)\n cryptoApi.getRandomValues(value)\n return (value[0] ?? 0) / 0x1_0000_0000\n }\n\n // Retry jitter is not a security primitive, but we still want a stable\n // spread for runtimes that do not expose Web Crypto.\n jitterCounter = (jitterCounter + 1) >>> 0\n const mixed = mixUint32((Date.now() ^ Math.imul(jitterCounter, 0x9e37_79b9)) >>> 0)\n return mixed / 0x1_0000_0000\n}\n\nfunction getCryptoApi(): CryptoLike | undefined {\n const cryptoApi = globalThis.crypto as CryptoLike | undefined\n if (cryptoApi && typeof cryptoApi.getRandomValues === 'function') {\n return cryptoApi\n }\n\n return undefined\n}\n\nfunction mixUint32(value: number): number {\n let mixed = (value ^ (value >>> 16)) >>> 0\n mixed = Math.imul(mixed, 0x7feb_352d) >>> 0\n mixed = (mixed ^ (mixed >>> 15)) >>> 0\n mixed = Math.imul(mixed, 0x846c_a68b) >>> 0\n return (mixed ^ (mixed >>> 16)) >>> 0\n}\n", "/**\n * Shared utilities: response extraction and pagination helpers.\n */\n\nimport { ParseError } from './errors.js'\nimport { parseRateLimitHeaders, type RateLimitInfo } from './rate-limit.js'\n\nexport interface LastResponseInfo {\n requestId: string | null\n statusCode: number\n headers: Headers\n rateLimit: RateLimitInfo\n}\n\nexport interface ResponseMetadata {\n _request_id: string | null\n lastResponse: LastResponseInfo\n}\n\nexport interface AmigoResponse<T> {\n data: WithResponseMetadata<T>\n response: Response\n requestId: string | null\n rateLimit: RateLimitInfo\n}\n\nexport type WithResponseMetadata<T> = T extends object ? T & ResponseMetadata : T\n\nexport function extractRequestId(response: Response): string | null {\n return response.headers.get('x-request-id')\n}\n\nexport function buildLastResponse(response: Response): LastResponseInfo {\n return {\n requestId: extractRequestId(response),\n statusCode: response.status,\n headers: response.headers,\n rateLimit: parseRateLimitHeaders(response.headers),\n }\n}\n\ninterface OpenApiResult<T> {\n data?: T\n error?: unknown\n response?: Response\n}\n\ninterface ExtractDataOptions {\n allowEmptyBody?: boolean\n}\n\n/**\n * Extracts the data payload from an openapi-fetch response.\n * Empty-body success responses return undefined; other empty responses throw.\n */\nexport function extractData<T>(\n result: OpenApiResult<T>,\n options: ExtractDataOptions = {},\n): WithResponseMetadata<T> {\n if (result.data !== undefined) {\n return attachResponseMetadata(result.data, result.response) as WithResponseMetadata<T>\n }\n\n if (isEmptyBodySuccess(result.response) || options.allowEmptyBody) {\n return undefined as WithResponseMetadata<T>\n }\n\n // Degenerate openapi-fetch results with both data and error keep the SDK's\n // original data-first behavior; without data, errors stay fatal.\n if (result.error !== undefined) {\n throw new ParseError('Unexpected error response from API', JSON.stringify(result.error))\n }\n\n throw new ParseError(\n 'Unexpected empty response from API',\n result.response ? `status=${result.response.status}` : undefined,\n )\n}\n\nexport function withResponse<T>(\n result: OpenApiResult<T> & { response: Response },\n options: ExtractDataOptions = {},\n): AmigoResponse<T> {\n const data = extractData(result, options)\n const lastResponse = buildLastResponse(result.response)\n\n return {\n data,\n response: result.response,\n requestId: lastResponse.requestId,\n rateLimit: lastResponse.rateLimit,\n }\n}\n\n/**\n * Standard paginated list response shape.\n */\nexport interface PaginatedList<T> {\n items: T[]\n has_more: boolean\n continuation_token: number | null\n}\n\n/**\n * Standard query params for paginated list endpoints.\n */\nexport interface ListParams {\n /** Max items per page. Default varies by endpoint. */\n limit?: number\n /** Opaque token from previous response for next page. */\n continuation_token?: number\n}\n\n/**\n * Async iterator that auto-paginates through all pages.\n * Yields one item at a time.\n *\n * @example\n * for await (const agent of paginate((token) => client.agents.list({ continuation_token: token }))) {\n * console.log(agent)\n * }\n */\nexport async function* paginate<T>(\n fetcher: (continuationToken?: number) => Promise<PaginatedList<T>>,\n): AsyncGenerator<T> {\n let token: number | undefined = undefined\n while (true) {\n const page = await fetcher(token)\n for (const item of page.items) {\n yield item\n }\n if (!page.has_more || page.continuation_token === null) break\n token = page.continuation_token\n }\n}\n\nfunction attachResponseMetadata<T>(data: T, response?: Response): WithResponseMetadata<T> {\n if (!response || typeof data !== 'object' || data === null) {\n return data as WithResponseMetadata<T>\n }\n\n const target = data as T & Partial<ResponseMetadata>\n const lastResponse = buildLastResponse(response)\n\n defineHiddenMetadata(target, '_request_id', lastResponse.requestId)\n defineHiddenMetadata(target, 'lastResponse', lastResponse)\n\n return target as WithResponseMetadata<T>\n}\n\nfunction isEmptyBodySuccess(response?: Response): boolean {\n return response?.status === 204 || response?.status === 205\n}\n\nfunction defineHiddenMetadata<T extends object, K extends keyof ResponseMetadata>(\n target: T,\n key: K,\n value: ResponseMetadata[K],\n): void {\n try {\n Object.defineProperty(target, key, {\n value,\n enumerable: false,\n configurable: true,\n writable: false,\n })\n } catch {\n // Ignore non-extensible return values.\n }\n}\n", "/**\n * Base class for workspace-scoped resources.\n *\n * Uses the openapi-fetch client (with auth + error + retry middleware)\n * injected from AmigoClient. Resources call typed HTTP methods that\n * flow through the middleware chain automatically.\n */\n\nimport type { Middleware } from 'openapi-fetch'\nimport {\n applyPlatformRequestOptions,\n getPlatformClientBaseUrl,\n type PlatformFetch,\n} from '../core/openapi-client.js'\nimport {\n mergeRequestOptions,\n mergeScopedRequestOptions,\n type ScopedRequestOptions,\n} from '../core/request-options.js'\nimport { extractData } from '../core/utils.js'\n\nconst scopedClientState = new WeakMap<\n PlatformFetch,\n { baseClient: PlatformFetch; options: ScopedRequestOptions }\n>()\n\nexport abstract class WorkspaceScopedResource {\n constructor(\n protected readonly client: PlatformFetch,\n protected readonly workspaceId: string,\n ) {}\n\n protected get platformBaseUrl(): string {\n const { baseClient } = resolveScopedPlatformClient(this.client)\n return getPlatformClientBaseUrl(baseClient)\n }\n\n withOptions(options: ScopedRequestOptions): this {\n const ResourceCtor = this.constructor as new (\n client: PlatformFetch,\n workspaceId: string,\n ) => this\n return new ResourceCtor(scopePlatformClient(this.client, options), this.workspaceId)\n }\n\n protected async *iteratePaginatedList<\n TPage extends {\n items?: readonly unknown[]\n has_more?: boolean\n continuation_token?: number | null\n },\n TParams,\n >(\n fetchPage: (params: TParams) => Promise<TPage>,\n params: TParams,\n ): AsyncGenerator<TPage extends { items?: readonly (infer TItem)[] } ? TItem : never> {\n type Item = TPage extends { items?: readonly (infer TItem)[] } ? TItem : never\n let nextParams = params\n\n while (true) {\n const page = await fetchPage(nextParams)\n\n for (const item of page.items ?? []) {\n yield item as Item\n }\n\n if (\n !page.has_more ||\n page.continuation_token === null ||\n page.continuation_token === undefined\n ) {\n break\n }\n\n nextParams = {\n ...(nextParams as object | undefined),\n continuation_token: page.continuation_token,\n } as TParams\n }\n }\n\n protected async *iterateOffsetPaginatedList<\n TPage extends { has_more?: boolean; next_offset?: number | null },\n TItem,\n TParams,\n >(\n fetchPage: (params: TParams) => Promise<TPage>,\n selectItems: (page: TPage) => readonly TItem[],\n params: TParams,\n ): AsyncGenerator<TItem> {\n let nextParams = params\n\n while (true) {\n const page = await fetchPage(nextParams)\n\n for (const item of selectItems(page)) {\n yield item\n }\n\n if (!page.has_more || page.next_offset === null || page.next_offset === undefined) {\n break\n }\n\n nextParams = { ...(nextParams as object | undefined), offset: page.next_offset } as TParams\n }\n }\n}\n\nexport function scopePlatformClient(\n client: PlatformFetch,\n options: ScopedRequestOptions,\n): PlatformFetch {\n const { baseClient, options: existingOptions } = resolveScopedPlatformClient(client)\n const mergedOptions = mergeScopedRequestOptions(existingOptions, options)\n\n const scopedClient = {\n request: (method: string, path: string, init?: object) =>\n baseClient.request(\n method as never,\n path as never,\n applyPlatformRequestOptions(\n baseClient,\n mergeRequestOptions(mergedOptions, init as never),\n ) as never,\n ),\n GET: (path: string, init?: object) =>\n baseClient.GET(\n path as never,\n applyPlatformRequestOptions(\n baseClient,\n mergeRequestOptions(mergedOptions, init as never),\n ) as never,\n ),\n PUT: (path: string, init?: object) =>\n baseClient.PUT(\n path as never,\n applyPlatformRequestOptions(\n baseClient,\n mergeRequestOptions(mergedOptions, init as never),\n ) as never,\n ),\n POST: (path: string, init?: object) =>\n baseClient.POST(\n path as never,\n applyPlatformRequestOptions(\n baseClient,\n mergeRequestOptions(mergedOptions, init as never),\n ) as never,\n ),\n DELETE: (path: string, init?: object) =>\n baseClient.DELETE(\n path as never,\n applyPlatformRequestOptions(\n baseClient,\n mergeRequestOptions(mergedOptions, init as never),\n ) as never,\n ),\n OPTIONS: (path: string, init?: object) =>\n baseClient.OPTIONS(\n path as never,\n applyPlatformRequestOptions(\n baseClient,\n mergeRequestOptions(mergedOptions, init as never),\n ) as never,\n ),\n HEAD: (path: string, init?: object) =>\n baseClient.HEAD(\n path as never,\n applyPlatformRequestOptions(\n baseClient,\n mergeRequestOptions(mergedOptions, init as never),\n ) as never,\n ),\n PATCH: (path: string, init?: object) =>\n baseClient.PATCH(\n path as never,\n applyPlatformRequestOptions(\n baseClient,\n mergeRequestOptions(mergedOptions, init as never),\n ) as never,\n ),\n TRACE: (path: string, init?: object) =>\n baseClient.TRACE(\n path as never,\n applyPlatformRequestOptions(\n baseClient,\n mergeRequestOptions(mergedOptions, init as never),\n ) as never,\n ),\n use: (...middleware: Middleware[]) => baseClient.use(...middleware),\n eject: (...middleware: Middleware[]) => baseClient.eject(...middleware),\n } as PlatformFetch\n\n scopedClientState.set(scopedClient, { baseClient, options: mergedOptions })\n return scopedClient\n}\n\nexport function resolveScopedPlatformClient(client: PlatformFetch): {\n baseClient: PlatformFetch\n options: ScopedRequestOptions | undefined\n} {\n const existing = scopedClientState.get(client)\n return {\n baseClient: existing?.baseClient ?? client,\n options: existing?.options,\n }\n}\n\nexport { extractData }\n", "import type { components } from '../generated/api.js'\nimport type { WorkspaceId } from '../core/branded-types.js'\nimport { WorkspaceScopedResource, extractData } from './base.js'\nimport type { ListParams } from '../core/utils.js'\n\n/**\n * Manage Amigo Platform workspaces.\n * Workspaces are the top-level tenancy boundary for all resources.\n *\n * Note: list operates at account level (/v1/workspaces); creation goes\n * through the authenticated self-service flow. The unauthenticated\n * ``POST /v1/workspaces`` was removed in platform-api PR #2378 (orphan-\n * maker). Get/update/archive/provision operate on a specific workspace.\n */\nexport class WorkspacesResource extends WorkspaceScopedResource {\n /** Create a workspace for the authenticated user and attach owner access */\n async createSelfService(body: components['schemas']['CreateWorkspaceRequest']) {\n return extractData(\n await this.client.POST('/v1/workspaces/self-service', {\n body,\n }),\n )\n }\n\n /** List workspaces accessible to the current API key */\n async list(params?: ListParams) {\n return extractData(\n await this.client.GET('/v1/workspaces', {\n params: { query: params },\n }),\n )\n }\n\n listAutoPaging(params?: ListParams) {\n return this.iteratePaginatedList((pageParams) => this.list(pageParams), params)\n }\n\n /** Get a single workspace by ID */\n async get(id?: WorkspaceId | string) {\n return extractData(\n await this.client.GET('/v1/workspaces/{workspace_id}', {\n params: { path: { workspace_id: id ?? this.workspaceId } },\n }),\n )\n }\n\n /** Update workspace metadata */\n async update(body: components['schemas']['UpdateWorkspaceRequest'], id?: WorkspaceId | string) {\n return extractData(\n await this.client.PATCH('/v1/workspaces/{workspace_id}', {\n params: { path: { workspace_id: id ?? this.workspaceId } },\n body,\n }),\n )\n }\n\n /** Archive (soft-delete) a workspace */\n async archive(body: components['schemas']['ArchiveWorkspaceRequest'], id?: WorkspaceId | string) {\n return extractData(\n await this.client.POST('/v1/workspaces/{workspace_id}/archive', {\n params: { path: { workspace_id: id ?? this.workspaceId } },\n body,\n }),\n )\n }\n\n /** Provision a workspace (seed integrations, mark as provisioned) */\n async provision(id?: WorkspaceId | string) {\n return extractData(\n await this.client.POST('/v1/workspaces/{workspace_id}/provision', {\n params: { path: { workspace_id: id ?? this.workspaceId } },\n }),\n )\n }\n\n /** Pre-check environment conversion warnings */\n async checkEnvironment(target?: 'production' | 'staging', id?: WorkspaceId | string) {\n return extractData(\n await this.client.GET('/v1/workspaces/{workspace_id}/environment-check', {\n params: {\n path: { workspace_id: id ?? this.workspaceId },\n query: target ? { target } : undefined,\n },\n }),\n )\n }\n\n /** Convert workspace between staging and production */\n async convertEnvironment(\n body: components['schemas']['ConvertEnvironmentRequest'],\n id?: WorkspaceId | string,\n ) {\n return extractData(\n await this.client.POST('/v1/workspaces/{workspace_id}/convert-environment', {\n params: { path: { workspace_id: id ?? this.workspaceId } },\n body,\n }),\n )\n }\n}\n", "import type { components } from '../generated/api.js'\nimport type { ApiKeyId } from '../core/branded-types.js'\nimport { WorkspaceScopedResource, extractData } from './base.js'\nimport type { ListParams } from '../core/utils.js'\n\n/**\n * Manage API keys for a workspace.\n *\n * API keys are used to authenticate SDK/API requests. Each key has a role\n * and a set of permissions. Keys expire after 1-90 days.\n */\nexport class ApiKeysResource extends WorkspaceScopedResource {\n /**\n * Get info about the currently authenticated API key.\n * Does not require a workspace ID in the path.\n */\n async me() {\n return extractData(await this.client.GET('/v1/auth/me', {}))\n }\n\n /** Create a new API key */\n async create(body: components['schemas']['CreateApiKeyRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/api-keys', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n )\n }\n\n /** List API keys in the workspace */\n async list(params?: ListParams & { mine_only?: boolean }) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/api-keys', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n listAutoPaging(params?: ListParams & { mine_only?: boolean }) {\n return this.iteratePaginatedList((pageParams) => this.list(pageParams), params)\n }\n\n /** Revoke an API key */\n async revoke(keyId: ApiKeyId | string): Promise<void> {\n await this.client.DELETE('/v1/{workspace_id}/api-keys/{key_id}', {\n params: { path: { workspace_id: this.workspaceId, key_id: keyId } },\n })\n }\n\n /** Rotate an API key \u2014 invalidates the old key and issues a new one */\n async rotate(keyId: ApiKeyId | string, body: components['schemas']['RotateApiKeyRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/api-keys/{key_id}/rotate', {\n params: { path: { workspace_id: this.workspaceId, key_id: keyId } },\n body,\n }),\n )\n }\n}\n", "import type { components } from '../generated/api.js'\nimport type { AgentId } from '../core/branded-types.js'\nimport { WorkspaceScopedResource, extractData } from './base.js'\nimport type { ListParams } from '../core/utils.js'\n\nexport interface ListAgentsParams extends ListParams {\n search?: string\n}\n\nexport class AgentsResource extends WorkspaceScopedResource {\n async create(body: components['schemas']['CreateAgentRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/agents', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n )\n }\n\n async list(params?: ListAgentsParams) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/agents', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n listAutoPaging(params?: ListAgentsParams) {\n return this.iteratePaginatedList((pageParams) => this.list(pageParams), params)\n }\n\n async get(agentId: AgentId | string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/agents/{agent_id}', {\n params: { path: { workspace_id: this.workspaceId, agent_id: agentId } },\n }),\n )\n }\n\n async update(agentId: AgentId | string, body: components['schemas']['UpdateAgentRequest']) {\n return extractData(\n await this.client.PUT('/v1/{workspace_id}/agents/{agent_id}', {\n params: { path: { workspace_id: this.workspaceId, agent_id: agentId } },\n body,\n }),\n )\n }\n\n async delete(agentId: AgentId | string): Promise<void> {\n await this.client.DELETE('/v1/{workspace_id}/agents/{agent_id}', {\n params: { path: { workspace_id: this.workspaceId, agent_id: agentId } },\n })\n }\n\n async listVersions(agentId: AgentId | string, params?: ListParams) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/agents/{agent_id}/versions', {\n params: { path: { workspace_id: this.workspaceId, agent_id: agentId }, query: params },\n }),\n )\n }\n\n listVersionsAutoPaging(agentId: AgentId | string, params?: ListParams) {\n return this.iteratePaginatedList((pageParams) => this.listVersions(agentId, pageParams), params)\n }\n\n async getVersion(agentId: AgentId | string, version: number | 'latest') {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/agents/{agent_id}/versions/{version}', {\n params: {\n path: { workspace_id: this.workspaceId, agent_id: agentId, version: String(version) },\n },\n }),\n )\n }\n\n async createVersion(\n agentId: AgentId | string,\n body: components['schemas']['CreateAgentVersionRequest'],\n ) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/agents/{agent_id}/versions', {\n params: { path: { workspace_id: this.workspaceId, agent_id: agentId } },\n body,\n }),\n )\n }\n}\n", "import type { components } from '../generated/api.js'\nimport type { SkillId } from '../core/branded-types.js'\nimport { WorkspaceScopedResource, extractData } from './base.js'\nimport type { ListParams } from '../core/utils.js'\n\nexport interface ListSkillsParams extends ListParams {\n search?: string\n enabled?: boolean\n execution_tier?: string\n}\n\n/**\n * Manage skills \u2014 reusable AI capabilities that agents can call.\n * Skills define a structured input/output schema and an execution tier.\n */\nexport class SkillsResource extends WorkspaceScopedResource {\n /** Create a new skill */\n async create(body: components['schemas']['CreateSkillRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/skills', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n )\n }\n\n /** List skills in the workspace */\n async list(params?: ListSkillsParams) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/skills', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n listAutoPaging(params?: ListSkillsParams) {\n return this.iteratePaginatedList((pageParams) => this.list(pageParams), params)\n }\n\n /** Get a single skill */\n async get(skillId: SkillId | string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/skills/{skill_id}', {\n params: { path: { workspace_id: this.workspaceId, skill_id: skillId } },\n }),\n )\n }\n\n /** Update a skill */\n async update(skillId: SkillId | string, body: components['schemas']['UpdateSkillRequest']) {\n return extractData(\n await this.client.PUT('/v1/{workspace_id}/skills/{skill_id}', {\n params: { path: { workspace_id: this.workspaceId, skill_id: skillId } },\n body,\n }),\n )\n }\n\n /** Delete a skill */\n async delete(skillId: SkillId | string): Promise<void> {\n await this.client.DELETE('/v1/{workspace_id}/skills/{skill_id}', {\n params: { path: { workspace_id: this.workspaceId, skill_id: skillId } },\n })\n }\n\n /**\n * Test a skill with a sample input.\n * Executes the skill in a sandbox and returns the result.\n */\n async test(skillId: SkillId | string, body: components['schemas']['TestSkillRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/skills/{skill_id}/test', {\n params: { path: { workspace_id: this.workspaceId, skill_id: skillId } },\n body,\n }),\n )\n }\n}\n", "import type { components } from '../generated/api.js'\nimport type { ActionId } from '../core/branded-types.js'\nimport { WorkspaceScopedResource, extractData } from './base.js'\nimport type { ListParams } from '../core/utils.js'\n\nexport interface ListActionsParams extends ListParams {\n search?: string\n enabled?: boolean\n execution_tier?: string\n}\n\n/**\n * Manage actions \u2014 reusable AI capabilities that agents can call.\n * Actions define a structured input/output schema and an execution tier.\n *\n * Note: The underlying API paths use `/skills/` for backward compatibility.\n */\nexport class ActionsResource extends WorkspaceScopedResource {\n /** Create a new action */\n async create(body: components['schemas']['CreateSkillRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/skills', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n )\n }\n\n /** List actions in the workspace */\n async list(params?: ListActionsParams) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/skills', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n listAutoPaging(params?: ListActionsParams) {\n return this.iteratePaginatedList((pageParams) => this.list(pageParams), params)\n }\n\n /** Get a single action */\n async get(actionId: ActionId | string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/skills/{skill_id}', {\n params: { path: { workspace_id: this.workspaceId, skill_id: actionId } },\n }),\n )\n }\n\n /** Update an action */\n async update(actionId: ActionId | string, body: components['schemas']['UpdateSkillRequest']) {\n return extractData(\n await this.client.PUT('/v1/{workspace_id}/skills/{skill_id}', {\n params: { path: { workspace_id: this.workspaceId, skill_id: actionId } },\n body,\n }),\n )\n }\n\n /** Delete an action */\n async delete(actionId: ActionId | string): Promise<void> {\n await this.client.DELETE('/v1/{workspace_id}/skills/{skill_id}', {\n params: { path: { workspace_id: this.workspaceId, skill_id: actionId } },\n })\n }\n\n /** Get all context graphs and services that reference this action */\n async getReferences(actionId: ActionId | string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/skills/{skill_id}/references', {\n params: { path: { workspace_id: this.workspaceId, skill_id: actionId } },\n }),\n )\n }\n\n /**\n * Test an action with a sample input.\n * Executes the action in a sandbox and returns the result.\n */\n async test(actionId: ActionId | string, body: components['schemas']['TestSkillRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/skills/{skill_id}/test', {\n params: { path: { workspace_id: this.workspaceId, skill_id: actionId } },\n body,\n }),\n )\n }\n}\n", "import type { components, operations } from '../generated/api.js'\nimport { WorkspaceScopedResource, extractData } from './base.js'\n\nexport type EscalationStatsParams = NonNullable<\n operations['escalation-stats']['parameters']['query']\n>\n\nexport class OperatorsResource extends WorkspaceScopedResource {\n async list(params?: { status?: string; limit?: number; offset?: number }) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/operators', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n listAutoPaging(params?: { status?: string; limit?: number; offset?: number }) {\n return this.iterateOffsetPaginatedList(\n (pageParams) => this.list(pageParams),\n (page) => page.items,\n params,\n )\n }\n\n async create(body: components['schemas']['CreateOperatorRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/operators', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n )\n }\n\n async get(operatorId: string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/operators/{operator_id}', {\n params: { path: { workspace_id: this.workspaceId, operator_id: operatorId } },\n }),\n )\n }\n\n /** Update an operator (name, role, status, etc.) */\n async update(operatorId: string, body: components['schemas']['UpdateOperatorRequest']) {\n return extractData(\n await this.client.PATCH('/v1/{workspace_id}/operators/{operator_id}', {\n params: { path: { workspace_id: this.workspaceId, operator_id: operatorId } },\n body,\n }),\n )\n }\n\n async getDashboard() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/operators/dashboard', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n\n async getQueue() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/operators/queue', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n\n async getEscalations(params?: { status?: string; limit?: number; offset?: number }) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/operators/escalations', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n getEscalationsAutoPaging(params?: { status?: string; limit?: number; offset?: number }) {\n return this.iterateOffsetPaginatedList(\n (pageParams) => this.getEscalations(pageParams),\n (page) => page.items,\n params,\n )\n }\n\n async getActiveEscalations() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/operators/escalations/active', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n\n async getEscalationStats(params?: EscalationStatsParams) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/operators/escalations/stats', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n async getPerformance(params?: {\n days?: number\n date_from?: string | null\n date_to?: string | null\n interval?: '1h' | '1d' | '1w'\n service_id?: string | null\n }) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/operators/performance', {\n params: { path: { workspace_id: this.workspaceId }, query: params as never },\n }),\n )\n }\n\n async getAccessToken(operatorId: string, body: components['schemas']['AccessTokenRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/operators/{operator_id}/access-token', {\n params: { path: { workspace_id: this.workspaceId, operator_id: operatorId } },\n body,\n }),\n )\n }\n\n async joinCall(operatorId: string, body: components['schemas']['JoinCallRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/operators/{operator_id}/join-call', {\n params: { path: { workspace_id: this.workspaceId, operator_id: operatorId } },\n body,\n }),\n )\n }\n\n async leaveCall(operatorId: string, body: components['schemas']['LeaveCallRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/operators/{operator_id}/leave-call', {\n params: { path: { workspace_id: this.workspaceId, operator_id: operatorId } },\n body,\n }),\n )\n }\n\n async switchMode(operatorId: string, body: components['schemas']['SwitchModeRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/operators/{operator_id}/switch-mode', {\n params: { path: { workspace_id: this.workspaceId, operator_id: operatorId } },\n body,\n }),\n )\n }\n\n async sendGuidance(operatorId: string, body: components['schemas']['SendGuidanceRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/operators/{operator_id}/send-guidance', {\n params: { path: { workspace_id: this.workspaceId, operator_id: operatorId } },\n body,\n }),\n )\n }\n\n async createBriefing(operatorId: string, body: { call_sid: string }) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/operators/{operator_id}/briefing', {\n params: { path: { workspace_id: this.workspaceId, operator_id: operatorId } },\n body,\n }),\n )\n }\n\n async wrapUp(operatorId: string, body: components['schemas']['WrapUpRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/operators/{operator_id}/wrap-up', {\n params: { path: { workspace_id: this.workspaceId, operator_id: operatorId } },\n body,\n }),\n )\n }\n\n async getCallTranscript(callSid: string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/operators/calls/{call_sid}/transcript', {\n params: { path: { workspace_id: this.workspaceId, call_sid: callSid } },\n }),\n )\n }\n\n async getAuditLog(params?: { limit?: number; offset?: number }) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/operators/audit-log', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n getAuditLogAutoPaging(params?: { limit?: number; offset?: number }) {\n return this.iterateOffsetPaginatedList(\n (pageParams) => this.getAuditLog(pageParams),\n (page) => page.items,\n params,\n )\n }\n}\n", "import type { components } from '../generated/api.js'\nimport { WorkspaceScopedResource, extractData } from './base.js'\nimport type { ListParams } from '../core/utils.js'\n\nexport class TriggersResource extends WorkspaceScopedResource {\n async list(params?: ListParams) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/triggers', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n listAutoPaging(params?: ListParams) {\n return this.iteratePaginatedList((pageParams) => this.list(pageParams), params)\n }\n\n async create(body: components['schemas']['CreateTriggerRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/triggers', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n )\n }\n\n async get(triggerId: string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/triggers/{trigger_id}', {\n params: { path: { workspace_id: this.workspaceId, trigger_id: triggerId } },\n }),\n )\n }\n\n async update(triggerId: string, body: components['schemas']['UpdateTriggerRequest']) {\n return extractData(\n await this.client.PUT('/v1/{workspace_id}/triggers/{trigger_id}', {\n params: { path: { workspace_id: this.workspaceId, trigger_id: triggerId } },\n body,\n }),\n )\n }\n\n async delete(triggerId: string): Promise<void> {\n await this.client.DELETE('/v1/{workspace_id}/triggers/{trigger_id}', {\n params: { path: { workspace_id: this.workspaceId, trigger_id: triggerId } },\n })\n }\n\n async fire(triggerId: string) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/triggers/{trigger_id}/fire', {\n params: { path: { workspace_id: this.workspaceId, trigger_id: triggerId } },\n }),\n )\n }\n\n async pause(triggerId: string) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/triggers/{trigger_id}/pause', {\n params: { path: { workspace_id: this.workspaceId, trigger_id: triggerId } },\n }),\n )\n }\n\n async resume(triggerId: string) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/triggers/{trigger_id}/resume', {\n params: { path: { workspace_id: this.workspaceId, trigger_id: triggerId } },\n }),\n )\n }\n\n async listRuns(triggerId: string, params?: ListParams) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/triggers/{trigger_id}/runs', {\n params: { path: { workspace_id: this.workspaceId, trigger_id: triggerId }, query: params },\n }),\n )\n }\n\n listRunsAutoPaging(triggerId: string, params?: ListParams) {\n return this.iteratePaginatedList((pageParams) => this.listRuns(triggerId, pageParams), params)\n }\n}\n", "import type { components } from '../generated/api.js'\nimport type { ServiceId } from '../core/branded-types.js'\nimport { WorkspaceScopedResource, extractData } from './base.js'\nimport type { ListParams } from '../core/utils.js'\n\nexport interface ListServicesParams extends ListParams {\n search?: string\n type?: string\n}\n\n/**\n * Manage services \u2014 external service configurations that agents can call.\n * Services represent integrations like scheduling systems, EHRs, or CRMs\n * that skills can interact with via their tool definitions.\n */\nexport class ServicesResource extends WorkspaceScopedResource {\n async create(body: components['schemas']['CreateServiceRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/services', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n )\n }\n\n async list(params?: ListServicesParams) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/services', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n listAutoPaging(params?: ListServicesParams) {\n return this.iteratePaginatedList((pageParams) => this.list(pageParams), params)\n }\n\n async get(serviceId: ServiceId | string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/services/{service_id}', {\n params: { path: { workspace_id: this.workspaceId, service_id: serviceId } },\n }),\n )\n }\n\n async update(serviceId: ServiceId | string, body: components['schemas']['UpdateServiceRequest']) {\n return extractData(\n await this.client.PUT('/v1/{workspace_id}/services/{service_id}', {\n params: { path: { workspace_id: this.workspaceId, service_id: serviceId } },\n body,\n }),\n )\n }\n\n async delete(serviceId: ServiceId | string): Promise<void> {\n await this.client.DELETE('/v1/{workspace_id}/services/{service_id}', {\n params: { path: { workspace_id: this.workspaceId, service_id: serviceId } },\n })\n }\n}\n", "import type { components } from '../generated/api.js'\nimport type { ContextGraphId } from '../core/branded-types.js'\nimport { WorkspaceScopedResource, extractData } from './base.js'\nimport type { ListParams } from '../core/utils.js'\n\nexport interface ListContextGraphsParams extends ListParams {\n search?: string\n}\n\n/**\n * Manage context graphs \u2014 structured conversation flow definitions (HSM).\n * Context graphs define the states, transitions, and conditions that\n * govern how an agent moves through a conversation.\n */\nexport class ContextGraphsResource extends WorkspaceScopedResource {\n async create(body: components['schemas']['CreateContextGraphRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/context-graphs', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n )\n }\n\n async list(params?: ListContextGraphsParams) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/context-graphs', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n listAutoPaging(params?: ListContextGraphsParams) {\n return this.iteratePaginatedList((pageParams) => this.list(pageParams), params)\n }\n\n async get(contextGraphId: ContextGraphId | string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/context-graphs/{context_graph_id}', {\n params: {\n path: { workspace_id: this.workspaceId, context_graph_id: contextGraphId },\n },\n }),\n )\n }\n\n async update(\n contextGraphId: ContextGraphId | string,\n body: components['schemas']['UpdateContextGraphRequest'],\n ) {\n return extractData(\n await this.client.PUT('/v1/{workspace_id}/context-graphs/{context_graph_id}', {\n params: {\n path: { workspace_id: this.workspaceId, context_graph_id: contextGraphId },\n },\n body,\n }),\n )\n }\n\n async delete(contextGraphId: ContextGraphId | string): Promise<void> {\n await this.client.DELETE('/v1/{workspace_id}/context-graphs/{context_graph_id}', {\n params: {\n path: { workspace_id: this.workspaceId, context_graph_id: contextGraphId },\n },\n })\n }\n\n /** Create a version snapshot of the current context graph */\n async createVersion(\n contextGraphId: ContextGraphId | string,\n body: components['schemas']['CreateContextGraphVersionRequest'],\n ) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/context-graphs/{context_graph_id}/versions', {\n params: {\n path: { workspace_id: this.workspaceId, context_graph_id: contextGraphId },\n },\n body,\n }),\n )\n }\n\n /** List all versions of a context graph */\n async listVersions(contextGraphId: ContextGraphId | string, params?: ListParams) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/context-graphs/{context_graph_id}/versions', {\n params: {\n path: { workspace_id: this.workspaceId, context_graph_id: contextGraphId },\n query: params,\n },\n }),\n )\n }\n\n listVersionsAutoPaging(contextGraphId: ContextGraphId | string, params?: ListParams) {\n return this.iteratePaginatedList(\n (pageParams) => this.listVersions(contextGraphId, pageParams),\n params,\n )\n }\n\n /** Get a specific version by number, or pass \"latest\" for the most recent */\n async getVersion(contextGraphId: ContextGraphId | string, version: number | 'latest') {\n return extractData(\n await this.client.GET(\n '/v1/{workspace_id}/context-graphs/{context_graph_id}/versions/{version}',\n {\n params: {\n path: {\n workspace_id: this.workspaceId,\n context_graph_id: contextGraphId,\n version,\n },\n },\n },\n ),\n )\n }\n}\n", "import type { components } from '../generated/api.js'\nimport type { DataSourceId } from '../core/branded-types.js'\nimport { WorkspaceScopedResource, extractData } from './base.js'\nimport type { ListParams } from '../core/utils.js'\n\nexport interface ListDataSourcesParams extends ListParams {\n type?: string\n status?: string\n}\n\n/**\n * Manage data sources \u2014 connections to external databases, warehouses,\n * or data feeds that the platform can query and sync from.\n */\nexport class DataSourcesResource extends WorkspaceScopedResource {\n async create(body: components['schemas']['CreateDataSourceRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/data-sources', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n )\n }\n\n async list(params?: ListDataSourcesParams) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/data-sources', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n listAutoPaging(params?: ListDataSourcesParams) {\n return this.iteratePaginatedList((pageParams) => this.list(pageParams), params)\n }\n\n async get(dataSourceId: DataSourceId | string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/data-sources/{data_source_id}', {\n params: { path: { workspace_id: this.workspaceId, data_source_id: dataSourceId } },\n }),\n )\n }\n\n async update(\n dataSourceId: DataSourceId | string,\n body: components['schemas']['UpdateDataSourceRequest'],\n ) {\n return extractData(\n await this.client.PATCH('/v1/{workspace_id}/data-sources/{data_source_id}', {\n params: { path: { workspace_id: this.workspaceId, data_source_id: dataSourceId } },\n body,\n }),\n )\n }\n\n async delete(dataSourceId: DataSourceId | string): Promise<void> {\n await this.client.DELETE('/v1/{workspace_id}/data-sources/{data_source_id}', {\n params: { path: { workspace_id: this.workspaceId, data_source_id: dataSourceId } },\n })\n }\n\n /** Get event counts, sync status, and health for a data source */\n async getStatus(dataSourceId: DataSourceId | string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/data-sources/{data_source_id}/status', {\n params: { path: { workspace_id: this.workspaceId, data_source_id: dataSourceId } },\n }),\n )\n }\n\n /** Get daily event timeline + recent sync failures for a data source */\n async getSyncHistory(dataSourceId: DataSourceId | string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/data-sources/{data_source_id}/sync-history', {\n params: { path: { workspace_id: this.workspaceId, data_source_id: dataSourceId } },\n }),\n )\n }\n\n /**\n * Trigger a one-off manual sync of a data source.\n *\n * Bypasses the business-hours gate and per-resource cadence counter on\n * connector-runner. Resolves with `{ status: \"started\", ... }` once the\n * request is queued \u2014 the poll itself runs asynchronously. Platform-api\n * returns 409 if the source is already mid-sync (see\n * `TriggerSyncConflictResponse` for the body shape), 503 if\n * connector-runner is unreachable.\n */\n async triggerSync(dataSourceId: DataSourceId | string) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/data-sources/{data_source_id}/sync', {\n params: { path: { workspace_id: this.workspaceId, data_source_id: dataSourceId } },\n }),\n )\n }\n}\n", "import type { EntityId } from '../core/branded-types.js'\nimport { WorkspaceScopedResource, extractData } from './base.js'\n\n/**\n * World Model \u2014 entities, events, relationships, and the entity timeline.\n *\n * The world model is the core knowledge graph of the platform. Entities\n * represent real-world objects (patients, contacts, calls). Events record\n * observations about entities over time.\n */\nexport class WorldResource extends WorkspaceScopedResource {\n // ---- Entities ----\n\n /** List entities with optional filtering */\n async listEntities(params?: {\n entity_type?: string[] | null\n q?: string | null\n limit?: number\n offset?: number\n has_projection?: boolean | null\n source?: string | null\n source_system?: string | null\n semantic?: string | null\n tags?: string[] | null\n }) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/world/entities', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n listEntitiesAutoPaging(params?: {\n entity_type?: string[] | null\n q?: string | null\n limit?: number\n offset?: number\n has_projection?: boolean | null\n source?: string | null\n source_system?: string | null\n semantic?: string | null\n tags?: string[] | null\n }) {\n return this.iterateOffsetPaginatedList(\n (pageParams) => this.listEntities(pageParams),\n (page) => page.entities,\n params,\n )\n }\n\n /** Get a single entity */\n async getEntity(entityId: EntityId | string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/world/entities/{entity_id}', {\n params: { path: { workspace_id: this.workspaceId, entity_id: entityId } },\n }),\n )\n }\n\n /** Get all relationships for an entity */\n async getRelationships(entityId: EntityId | string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/world/entities/{entity_id}/relationships', {\n params: { path: { workspace_id: this.workspaceId, entity_id: entityId } },\n }),\n )\n }\n\n /** Get the knowledge graph centered on an entity (entity + neighbors + edges) */\n async getGraph(entityId: EntityId | string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/world/entities/{entity_id}/graph', {\n params: { path: { workspace_id: this.workspaceId, entity_id: entityId } },\n }),\n )\n }\n\n /** Get provenance \u2014 which source systems contributed data for an entity */\n async getProvenance(entityId: EntityId | string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/world/entities/{entity_id}/provenance', {\n params: { path: { workspace_id: this.workspaceId, entity_id: entityId } },\n }),\n )\n }\n\n /** Get lineage \u2014 merge history and canonical identity for an entity */\n async getLineage(entityId: EntityId | string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/world/entities/{entity_id}/lineage', {\n params: { path: { workspace_id: this.workspaceId, entity_id: entityId } },\n }),\n )\n }\n\n /** Get merged entities for a canonical entity */\n async getMerged(entityId: EntityId | string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/world/entities/{entity_id}/merged', {\n params: { path: { workspace_id: this.workspaceId, entity_id: entityId } },\n }),\n )\n }\n\n // ---- Connectors ----\n\n /** Get connected data sources overview with entity counts and sync status */\n async getConnectors() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/world/connectors', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n\n /** List entities from a specific connector / data source */\n async getConnectorEntities(\n dataSourceId: string,\n params?: {\n entity_type?: string | null\n q?: string | null\n limit?: number\n offset?: number\n },\n ) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/world/connectors/{data_source_id}/entities', {\n params: {\n path: { workspace_id: this.workspaceId, data_source_id: dataSourceId },\n query: params,\n },\n }),\n )\n }\n\n /** Search FHIR resources from a specific data source */\n async getConnectorResources(\n dataSourceId: string,\n params: {\n resource_type: string\n _count?: number\n _offset?: number\n },\n ) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/world/connectors/{data_source_id}/resources', {\n params: {\n path: { workspace_id: this.workspaceId, data_source_id: dataSourceId },\n query: params,\n },\n }),\n )\n }\n\n // ---- Entity Types ----\n\n /** List registered entity types with counts and schemas */\n async listEntityTypes() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/world/entity-types', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n\n // ---- Duplicate Detection ----\n\n /** List potential duplicate entity pairs for review or merging */\n async listDuplicates(params?: { entity_type?: string | null; confidence_max?: number }) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/world/entities/duplicates', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n // ---- Semantic Search ----\n\n /** Semantic (vector) search over entities */\n async search(params: {\n q: string\n entity_type?: string | null\n source?: string | null\n confidence_min?: number | null\n limit?: number\n offset?: number\n }) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/world/search', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n // ---- Timeline ----\n\n /** Get the event timeline for an entity (reverse-chronological) */\n async getTimeline(\n entityId: EntityId | string,\n params?: {\n domain?: string | null\n limit?: number\n offset?: number\n },\n ) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/world/entities/{entity_id}/timeline', {\n params: {\n path: { workspace_id: this.workspaceId, entity_id: entityId },\n query: params,\n },\n }),\n )\n }\n\n getTimelineAutoPaging(\n entityId: EntityId | string,\n params?: {\n domain?: string | null\n limit?: number\n offset?: number\n },\n ) {\n return this.iterateOffsetPaginatedList(\n (pageParams) => this.getTimeline(entityId, pageParams),\n (page) => page.events,\n params,\n )\n }\n\n // ---- Sync ----\n\n /** Get sync status grouped by sink (Lakebase, Delta, etc.) */\n async getSyncStatusBySink() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/world/sync/by-sink', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n\n /** List sync events with status filtering */\n async listSyncEvents(params: {\n status: 'pending' | 'failed'\n data_source_id?: string | null\n source_system?: string | null\n fhir_resource_type?: string | null\n fhir_resource_id?: string | null\n limit?: number\n offset?: number\n }) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/world/sync/events', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n listSyncEventsAutoPaging(params: {\n status: 'pending' | 'failed'\n data_source_id?: string | null\n source_system?: string | null\n fhir_resource_type?: string | null\n fhir_resource_id?: string | null\n limit?: number\n offset?: number\n }) {\n return this.iterateOffsetPaginatedList(\n (pageParams) => this.listSyncEvents(pageParams),\n (page) => page.events,\n params,\n )\n }\n\n /** Get current sync queue depth */\n async getSyncQueueDepth() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/world/sync/queue', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n\n /** Retry a single failed sync event */\n async retrySyncEvent(eventId: string) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/world/sync/retry/{event_id}', {\n params: { path: { workspace_id: this.workspaceId, event_id: eventId } },\n }),\n )\n }\n\n /** Retry all failed sync events */\n async retryAllSyncEvents() {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/world/sync/retry-all', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n\n // ---- Statistics ----\n\n /** Get aggregate entity and event statistics */\n async getStats() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/world/entity-stats', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n\n /** Get entity counts broken down by source system */\n async getSourceBreakdown() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/world/source-breakdown', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n}\n", "import { WorkspaceScopedResource, extractData } from './base.js'\nimport type { ListParams } from '../core/utils.js'\n\nexport interface ListCallsParams extends ListParams {\n status?: string\n agent_id?: string\n start_date?: string\n end_date?: string\n phone_number?: string\n direction?: string\n min_duration?: number\n max_duration?: number\n search?: string\n include_simulated?: boolean\n service_id?: string\n}\n\n/**\n * Access call records and intelligence.\n * Calls are read-only in the SDK \u2014 they are created by the voice pipeline.\n */\nexport class CallsResource extends WorkspaceScopedResource {\n /** List calls with optional filtering */\n async list(params?: ListCallsParams) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/calls', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n listAutoPaging(params?: ListCallsParams) {\n return this.iteratePaginatedList((pageParams) => this.list(pageParams), params)\n }\n\n /** Get full call detail including turns, escalation, safety, and recording info */\n async get(callId: string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/calls/{call_id}', {\n params: { path: { workspace_id: this.workspaceId, call_id: callId } },\n }),\n )\n }\n\n /** Get the canonical playback timeline for a call */\n async getTimeline(callId: string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/calls/{call_id}/timeline', {\n params: { path: { workspace_id: this.workspaceId, call_id: callId } },\n }),\n )\n }\n\n /** Get AI intelligence for a call */\n async getIntelligence(callId: string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/calls/{call_id}/intelligence', {\n params: { path: { workspace_id: this.workspaceId, call_id: callId } },\n }),\n )\n }\n\n /** Get active intelligence across all in-progress calls */\n async getActiveIntelligence() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/calls/active/intelligence', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n\n /** Get performance benchmarks for a time period */\n async getBenchmarks(params?: { days?: number }) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/calls/benchmarks', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n /** Get phone number call volume breakdown */\n async getPhoneVolume(params?: { days?: number }) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/calls/phone-volume', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n /** Get deep call trace analysis */\n async getTraceAnalysis(callId: string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/calls/{call_id}/trace-analysis', {\n params: { path: { workspace_id: this.workspaceId, call_id: callId } },\n }),\n )\n }\n}\n", "import { ConfigurationError } from '../core/errors.js'\nimport { type PlatformFetch } from '../core/openapi-client.js'\nimport type { components, operations } from '../generated/api.js'\nimport { WorkspaceScopedResource, extractData } from './base.js'\n\nexport type ConversationDetail = components['schemas']['ConversationDetail']\nexport type ConversationListResponse = components['schemas']['ConversationListResponse']\nexport type ConversationSummary =\n components['schemas']['src__routes__conversations__ConversationSummary']\nexport type ConversationTurn = components['schemas']['ConversationTurn']\nexport type CreateConversationRequest = components['schemas']['CreateConversationRequest']\nexport type TurnRequest = components['schemas']['TurnRequest']\nexport type TurnResponse = components['schemas']['TurnResponse']\nexport type TurnStreamEvent = components['schemas']['TurnStreamEvent']\nexport type TurnTokenEvent = components['schemas']['TurnTokenEvent']\nexport type TurnToolCallStartedEvent = components['schemas']['TurnToolCallStartedEvent']\nexport type TurnToolCallCompletedEvent = components['schemas']['TurnToolCallCompletedEvent']\nexport type TurnThinkingEvent = components['schemas']['TurnThinkingEvent']\nexport type TurnMessageEvent = components['schemas']['TurnMessageEvent']\nexport type TurnDoneEvent = components['schemas']['TurnDoneEvent']\nexport type TurnErrorEvent = components['schemas']['TurnErrorEvent']\n\n/**\n * Hand-authored because the text-stream WebSocket endpoint is intentionally\n * outside the generated OpenAPI REST snapshot.\n * TODO: replace with generated types when `/agent/text-stream` is added to\n * openapi.json.\n *\n * @beta The text-stream WebSocket contract may evolve independently of the REST API.\n */\nexport interface TextStreamUrlParams {\n serviceId: string\n conversationId?: string\n entityId?: string\n /**\n * Enable `tool_call_started` and `tool_call_completed` frames on the\n * text-stream WebSocket so the client can render tool invocations in\n * real time.\n */\n toolEvents?: boolean\n /**\n * Bearer token query-param fallback for clients whose API key cannot be sent\n * as a WebSocket subprotocol token. Prefer textStreamAuthProtocols() when\n * the token is subprotocol-safe so secrets do not appear in URLs. The SDK\n * intentionally accepts only the server-supported text-stream token alphabet\n * (letters, digits, `.`, `_`, `+`, `=`, `/`, `:`, `-`) even though\n * URLSearchParams can percent-encode additional characters.\n */\n token?: string\n /**\n * Full text-stream URL override for preview/custom ingress.\n * Defaults to `${baseUrl origin}/agent/text-stream` with\n * `http` mapped to `ws` and `https` mapped to `wss`.\n */\n textStreamUrl?: string\n}\n\n/** @beta The text-stream WebSocket contract may evolve independently of the REST API. */\nexport type TextStreamAuthProtocols = readonly ['auth', string]\n\n/**\n * Hand-authored because the workspace-scoped session-connect WebSocket is\n * intentionally outside the generated OpenAPI REST snapshot.\n *\n * Path: ``WS /v1/{workspace_id}/sessions/connect``. Authentication is delivered\n * via the ``Sec-WebSocket-Protocol: auth, <token>`` subprotocol header \u2014 the\n * server rejects query-param tokens to keep credentials out of URLs and proxy\n * logs. ``serviceId`` and ``entityId`` are required path/query inputs.\n *\n * @beta The session-connect WebSocket contract may evolve independently of the REST API.\n */\nexport interface SessionConnectUrlParams {\n serviceId: string\n entityId: string\n conversationId?: string\n /**\n * Emit ``tool_call_started`` and ``tool_call_completed`` frames so the client\n * can render tool invocations in real time. Server defaults to ``true`` when\n * the param is omitted; the SDK only sets it explicitly when the caller asks\n * to disable tool events.\n */\n toolEvents?: boolean\n /**\n * Full session-connect URL override for preview/custom ingress. Defaults to\n * ``${baseUrl origin}/v1/{workspace_id}/sessions/connect`` with ``http`` mapped\n * to ``ws`` and ``https`` mapped to ``wss``. The override must be an\n * absolute ws/wss URL with no query string or fragment \u2014 SDK-managed query\n * params are appended by the helper.\n */\n sessionConnectUrl?: string\n}\n\nconst MAX_AUTH_TOKEN_CHARS = 4096\nconst TEXT_STREAM_AUTH_TOKEN_RE = /^[-A-Za-z0-9._+=/:]+$/\nconst WEB_SOCKET_PROTOCOL_TOKEN_RE = /^[!#$%&'*+\\-.^_`|~A-Za-z0-9]+$/\n\nexport type ListConversationsParams = NonNullable<\n operations['list_conversations_v1__workspace_id__conversations_get']['parameters']['query']\n>\n\n/** Access text conversation APIs and text-stream URL helpers. */\nexport class ConversationsResource extends WorkspaceScopedResource {\n private readonly agentBaseUrl: string | undefined\n\n constructor(client: PlatformFetch, workspaceId: string, agentBaseUrl?: string) {\n super(client, workspaceId)\n this.agentBaseUrl = agentBaseUrl\n }\n\n async list(params?: ListConversationsParams): Promise<ConversationListResponse> {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/conversations', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n async create(request: CreateConversationRequest): Promise<ConversationDetail> {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/conversations', {\n params: { path: { workspace_id: this.workspaceId } },\n body: request,\n }),\n )\n }\n\n async get(conversationId: string): Promise<ConversationDetail> {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/conversations/{conversation_id}', {\n params: {\n path: { workspace_id: this.workspaceId, conversation_id: conversationId },\n },\n }),\n )\n }\n\n async close(conversationId: string): Promise<void> {\n await this.client.DELETE('/v1/{workspace_id}/conversations/{conversation_id}', {\n params: {\n path: { workspace_id: this.workspaceId, conversation_id: conversationId },\n },\n })\n }\n\n /**\n * Send a user message and receive the agent's synchronous JSON response.\n *\n * Pass `options.includeToolCalls: true` to request tool-call metadata\n * alongside the response turns. Server-side default is `false` \u2014 without\n * this opt-in the `tool_calls` array on the `TurnResponse` will be empty\n * even when the agent invoked tools during the turn.\n */\n async createTurn(\n conversationId: string,\n request: TurnRequest,\n options?: { includeToolCalls?: boolean },\n ): Promise<TurnResponse> {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/conversations/{conversation_id}/turns', {\n params: {\n path: { workspace_id: this.workspaceId, conversation_id: conversationId },\n ...(options?.includeToolCalls !== undefined && {\n query: { include_tool_calls: options.includeToolCalls },\n }),\n },\n body: request,\n headers: { Accept: 'application/json' },\n }),\n ) as TurnResponse\n }\n\n /**\n * Send a message and receive the agent's response as an SSE stream.\n *\n * Returns a `ReadableStream` of SSE bytes. Use `EventSourceParserStream`\n * (from `eventsource-parser/stream`) to parse into typed `TurnStreamEvent`.\n *\n * @example\n * ```ts\n * const stream = await client.conversations.createTurnStream(convId, { message: \"Hello\" });\n * const events = stream\n * .pipeThrough(new TextDecoderStream())\n * .pipeThrough(new EventSourceParserStream());\n * for await (const event of events) {\n * const parsed = JSON.parse(event.data) as TurnStreamEvent;\n * if (parsed.event === \"token\") console.log(parsed.text);\n * }\n * ```\n */\n async createTurnStream(\n conversationId: string,\n request: TurnRequest,\n options?: { signal?: AbortSignal; includeToolCalls?: boolean },\n ): Promise<ReadableStream<Uint8Array>> {\n const result = await this.client.POST(\n '/v1/{workspace_id}/conversations/{conversation_id}/turns',\n {\n params: {\n path: { workspace_id: this.workspaceId, conversation_id: conversationId },\n ...(options?.includeToolCalls !== undefined && {\n query: { include_tool_calls: options.includeToolCalls },\n }),\n },\n body: request,\n headers: { Accept: 'text/event-stream' },\n parseAs: 'stream',\n signal: options?.signal,\n },\n )\n if (result.error !== undefined) {\n throw new Error(`API error: ${JSON.stringify(result.error)}`)\n }\n return result.data as ReadableStream<Uint8Array>\n }\n\n /**\n * Send a message and receive the agent's response as a typed\n * `TurnStreamEvent` async iterable.\n *\n * The bytes-and-parser dance from `createTurnStream` is now hidden inside\n * the SDK \u2014 consumers iterate strongly typed events directly. Each yielded\n * value is a member of the `TurnStreamEvent` discriminated union (`token`,\n * `thinking`, `tool_call_started`, `tool_call_completed`, `message`,\n * `done`, `error`), validated as a record with a known `event`\n * discriminator. Unknown / malformed frames are dropped silently \u2014 this\n * matches the wire-format-drift behavior of the lower-level\n * `createTurnStream` while keeping the strict `TurnStreamEvent` static\n * contract intact for consumers.\n *\n * @example\n * ```ts\n * for await (const event of client.conversations.streamTurn(convId, { message: \"Hello\" })) {\n * if (event.event === \"token\") process.stdout.write(event.text);\n * else if (event.event === \"done\") break;\n * }\n * ```\n */\n async *streamTurn(\n conversationId: string,\n request: TurnRequest,\n options?: { signal?: AbortSignal; includeToolCalls?: boolean },\n ): AsyncGenerator<TurnStreamEvent> {\n const byteStream = await this.createTurnStream(conversationId, request, options)\n for await (const frame of parseSSEFrames(byteStream)) {\n const event = parseTurnStreamFrame(frame.event, frame.data)\n if (event) yield event\n }\n }\n\n /** Build the real-time text WebSocket URL for browser or custom clients. */\n textStreamUrl(params: TextStreamUrlParams): string {\n const url = buildTextStreamUrl({\n baseUrl: this.agentBaseUrl ?? this.platformBaseUrl,\n workspaceId: this.workspaceId,\n ...params,\n })\n return url.toString()\n }\n\n /**\n * Build the URL for the workspace-scoped session-connect WebSocket\n * (``WS /v1/{workspace_id}/sessions/connect``).\n *\n * Pair the returned URL with {@link sessionConnectAuthProtocols} so the\n * bearer token is delivered via the ``Sec-WebSocket-Protocol`` header \u2014 the\n * endpoint rejects query-param tokens to keep credentials out of URLs.\n *\n * @example\n * ```ts\n * const url = client.conversations.sessionConnectUrl({\n * serviceId: SERVICE_ID,\n * entityId: ENTITY_ID,\n * conversationId: existingConversationId, // optional resume\n * });\n * const ws = new WebSocket(url, sessionConnectAuthProtocols(apiKey));\n * ```\n */\n sessionConnectUrl(params: SessionConnectUrlParams): string {\n const url = buildSessionConnectUrl({\n baseUrl: this.platformBaseUrl,\n workspaceId: this.workspaceId,\n ...params,\n })\n return url.toString()\n }\n}\n\n/**\n * Build browser WebSocket subprotocols for text-stream authentication.\n *\n * @remarks The returned tuple contains the raw API key. Do not log, persist,\n * serialize, or otherwise expose this value.\n *\n * @security The second subprotocol entry is the bearer secret.\n */\nexport function textStreamAuthProtocols(apiKey: string): TextStreamAuthProtocols {\n const token = validateTextStreamAuthToken(apiKey, 'apiKey')\n if (!WEB_SOCKET_PROTOCOL_TOKEN_RE.test(token)) {\n const invalidChars = describeInvalidSubprotocolChars(token)\n throw new ConfigurationError(\n `apiKey contains characters browsers reject in WebSocket subprotocols (${invalidChars}); use the token option on client.conversations.textStreamUrl() instead for keys containing these characters, only in trusted contexts where URLs are not logged in browser history, server access logs, HTTP proxy logs, or referrer headers`,\n )\n }\n return ['auth', token] as const\n}\n\n/**\n * Build browser WebSocket subprotocols for the workspace-scoped session-connect\n * endpoint (``WS /v1/{workspace_id}/sessions/connect``).\n *\n * The wire format is identical to {@link textStreamAuthProtocols} \u2014 both\n * endpoints expect ``Sec-WebSocket-Protocol: auth, <token>`` \u2014 but the\n * session-connect endpoint has no query-param token fallback, so the API key\n * MUST round-trip through this subprotocol pair. Keys containing characters\n * browsers reject in subprotocols (e.g. ``:``, ``/``, ``=``) cannot be used\n * with the session-connect endpoint and must instead use the legacy\n * ``textStreamUrl`` path.\n *\n * @remarks The returned tuple contains the raw API key. Do not log, persist,\n * serialize, or otherwise expose this value.\n *\n * @security The second subprotocol entry is the bearer secret.\n */\nexport function sessionConnectAuthProtocols(apiKey: string): TextStreamAuthProtocols {\n return textStreamAuthProtocols(apiKey)\n}\n\nfunction buildTextStreamUrl({\n baseUrl,\n workspaceId,\n serviceId,\n conversationId,\n entityId,\n toolEvents,\n token,\n textStreamUrl: textStreamUrlOverride,\n}: TextStreamUrlParams & { baseUrl: string; workspaceId: string }): URL {\n const url = textStreamUrlOverride\n ? parseTextStreamUrlOverride(textStreamUrlOverride)\n : deriveTextStreamUrl(baseUrl)\n url.searchParams.set('workspace_id', workspaceId)\n url.searchParams.set('service_id', serviceId)\n if (conversationId) url.searchParams.set('conversation_id', conversationId)\n if (entityId) url.searchParams.set('entity_id', entityId)\n if (toolEvents) url.searchParams.set('tool_events', 'true')\n if (token !== undefined)\n url.searchParams.set('token', validateTextStreamAuthToken(token, 'token'))\n return url\n}\n\nfunction validateTextStreamAuthToken(token: string, label: string): string {\n if (!token.trim()) {\n throw new ConfigurationError(`${label} is required for text-stream authentication`)\n }\n if (token.length > MAX_AUTH_TOKEN_CHARS || !TEXT_STREAM_AUTH_TOKEN_RE.test(token)) {\n throw new ConfigurationError(\n `${label} contains characters rejected by text-stream authentication`,\n )\n }\n return token\n}\n\nfunction parseTextStreamUrlOverride(textStreamUrl: string): URL {\n try {\n const url = new URL(textStreamUrl)\n if (url.protocol !== 'ws:' && url.protocol !== 'wss:') {\n throw new ConfigurationError('textStreamUrl overrides must use ws: or wss: URLs')\n }\n // Fragment rejection is defensive; WHATWG URL parsing normalizes most\n // WebSocket fragments away, but callers should never rely on fragments here.\n if (url.search || url.hash) {\n throw new ConfigurationError(\n 'textStreamUrl overrides must not include query parameters or fragments; pass SDK-managed fields through textStreamUrl() options',\n )\n }\n return url\n } catch (cause) {\n if (cause instanceof ConfigurationError) throw cause\n throw new ConfigurationError(\n `textStreamUrl must be an absolute URL for text-stream overrides: ${String(cause)}`,\n )\n }\n}\n\nfunction deriveTextStreamUrl(baseUrl: string): URL {\n if (!/^[a-z][a-z\\d+.-]*:\\/\\//i.test(baseUrl)) {\n throw new ConfigurationError(\n 'textStreamUrl cannot be derived from a relative baseUrl; pass agentBaseUrl or textStreamUrl explicitly',\n )\n }\n\n const url = new URL(baseUrl)\n if (url.protocol === 'ws:' || url.protocol === 'wss:') {\n // Already a WebSocket URL (e.g. from agentBaseUrl) \u2014 use directly\n } else if (url.protocol === 'http:' || url.protocol === 'https:') {\n url.protocol = url.protocol === 'https:' ? 'wss:' : 'ws:'\n } else {\n throw new ConfigurationError(\n 'textStreamUrl can only be derived from an http, https, ws, or wss baseUrl; pass textStreamUrl explicitly',\n )\n }\n if (url.pathname !== '/' && url.pathname !== '') {\n throw new ConfigurationError(\n 'textStreamUrl can only be derived from an origin-only baseUrl; pass agentBaseUrl as an origin or textStreamUrl explicitly when using path-prefixed gateways',\n )\n }\n // Text streaming is served by agent-engine ingress, regardless of any REST\n // API path segments on the configured base URL.\n url.pathname = '/agent/text-stream'\n url.search = ''\n url.hash = ''\n return url\n}\n\nfunction buildSessionConnectUrl({\n baseUrl,\n workspaceId,\n serviceId,\n entityId,\n conversationId,\n toolEvents,\n sessionConnectUrl: sessionConnectUrlOverride,\n}: SessionConnectUrlParams & { baseUrl: string; workspaceId: string }): URL {\n const url = sessionConnectUrlOverride\n ? parseSessionConnectUrlOverride(sessionConnectUrlOverride)\n : deriveSessionConnectUrl(baseUrl, workspaceId)\n url.searchParams.set('service_id', serviceId)\n url.searchParams.set('entity_id', entityId)\n if (conversationId) url.searchParams.set('conversation_id', conversationId)\n // Server defaults tool_events to true. Only emit the param when the caller\n // explicitly disables it, so default URLs stay minimal and existing tests\n // can assert exact URLs without incidental query keys.\n if (toolEvents === false) url.searchParams.set('tool_events', 'false')\n return url\n}\n\nfunction parseSessionConnectUrlOverride(sessionConnectUrl: string): URL {\n try {\n const url = new URL(sessionConnectUrl)\n if (url.protocol !== 'ws:' && url.protocol !== 'wss:') {\n throw new ConfigurationError('sessionConnectUrl overrides must use ws: or wss: URLs')\n }\n if (url.search || url.hash) {\n throw new ConfigurationError(\n 'sessionConnectUrl overrides must not include query parameters or fragments; pass SDK-managed fields through sessionConnectUrl() options',\n )\n }\n return url\n } catch (cause) {\n if (cause instanceof ConfigurationError) throw cause\n throw new ConfigurationError(\n `sessionConnectUrl must be an absolute URL for session-connect overrides: ${String(cause)}`,\n )\n }\n}\n\nfunction deriveSessionConnectUrl(baseUrl: string, workspaceId: string): URL {\n if (!/^[a-z][a-z\\d+.-]*:\\/\\//i.test(baseUrl)) {\n throw new ConfigurationError(\n 'sessionConnectUrl cannot be derived from a relative baseUrl; pass sessionConnectUrl explicitly',\n )\n }\n\n const url = new URL(baseUrl)\n if (url.protocol === 'ws:' || url.protocol === 'wss:') {\n // Already a WebSocket URL \u2014 use directly.\n } else if (url.protocol === 'http:' || url.protocol === 'https:') {\n url.protocol = url.protocol === 'https:' ? 'wss:' : 'ws:'\n } else {\n throw new ConfigurationError(\n 'sessionConnectUrl can only be derived from an http, https, ws, or wss baseUrl; pass sessionConnectUrl explicitly',\n )\n }\n if (url.pathname !== '/' && url.pathname !== '') {\n throw new ConfigurationError(\n 'sessionConnectUrl can only be derived from an origin-only baseUrl; pass sessionConnectUrl explicitly when using path-prefixed gateways',\n )\n }\n url.pathname = `/v1/${workspaceId}/sessions/connect`\n url.search = ''\n url.hash = ''\n return url\n}\n\nfunction describeInvalidSubprotocolChars(token: string): string {\n const chars = new Set<string>()\n for (const char of token) {\n // Single-character regex checks are intentional: the regex is anchored for\n // full-token validation, and here we need only the offending characters.\n if (!WEB_SOCKET_PROTOCOL_TOKEN_RE.test(char)) chars.add(char)\n }\n return [...chars].map((char) => JSON.stringify(char)).join(', ')\n}\n\n// ---------------------------------------------------------------------------\n// Inline SSE parser\n//\n// Implemented inline rather than depending on `eventsource-parser` so the SDK\n// stays at two runtime deps (`openapi-fetch`, `openapi-typescript-helpers`).\n// SSE is simple enough that a ~30-line state machine reads cleaner than a\n// transitive bundle increase. Spec: https://html.spec.whatwg.org/multipage/server-sent-events.html\n// (handled fields: `event`, `data`; comments and `id`/`retry` are ignored).\n// ---------------------------------------------------------------------------\n\ninterface SSEFrame {\n event: string\n data: string\n}\n\nasync function* parseSSEFrames(\n stream: ReadableStream<Uint8Array>,\n): AsyncGenerator<SSEFrame> {\n const reader = stream.getReader()\n const decoder = new TextDecoder()\n let buffer = ''\n\n function* drain(text: string): Generator<SSEFrame> {\n buffer += text\n // Frames are terminated by a blank line (\\n\\n or \\r\\n\\r\\n).\n while (true) {\n const idx = findFrameTerminator(buffer)\n if (idx === null) break\n const block = buffer.slice(0, idx.terminatorStart)\n buffer = buffer.slice(idx.terminatorEnd)\n const frame = parseSSEBlock(block)\n if (frame) yield frame\n }\n }\n\n try {\n while (true) {\n const { done, value } = await reader.read()\n if (done) break\n yield* drain(decoder.decode(value, { stream: true }))\n }\n // Flush any partial decode + handle a final frame missing the trailing\n // blank line (defensive \u2014 well-behaved servers always terminate).\n yield* drain(decoder.decode())\n if (buffer.trim().length > 0) {\n const frame = parseSSEBlock(buffer)\n if (frame) yield frame\n buffer = ''\n }\n } finally {\n reader.releaseLock()\n }\n}\n\nfunction findFrameTerminator(\n s: string,\n): { terminatorStart: number; terminatorEnd: number } | null {\n // Prefer LF-LF; fall back to CRLF-CRLF if the server is using CRLF\n // line endings end-to-end.\n const lf = s.indexOf('\\n\\n')\n const crlf = s.indexOf('\\r\\n\\r\\n')\n if (lf < 0 && crlf < 0) return null\n if (lf < 0) return { terminatorStart: crlf, terminatorEnd: crlf + 4 }\n if (crlf < 0) return { terminatorStart: lf, terminatorEnd: lf + 2 }\n return lf < crlf\n ? { terminatorStart: lf, terminatorEnd: lf + 2 }\n : { terminatorStart: crlf, terminatorEnd: crlf + 4 }\n}\n\nfunction parseSSEBlock(block: string): SSEFrame | null {\n let event = ''\n const dataLines: string[] = []\n for (const line of block.split(/\\r?\\n/)) {\n if (line === '' || line.startsWith(':')) continue\n const colon = line.indexOf(':')\n const field = colon < 0 ? line : line.slice(0, colon)\n let value = colon < 0 ? '' : line.slice(colon + 1)\n if (value.startsWith(' ')) value = value.slice(1)\n if (field === 'event') event = value\n else if (field === 'data') dataLines.push(value)\n // `id`, `retry`, and unknown fields are ignored \u2014 we only need the\n // discriminator + payload for the typed event surface.\n }\n if (!event || dataLines.length === 0) return null\n return { event, data: dataLines.join('\\n') }\n}\n\n// ---------------------------------------------------------------------------\n// TurnStreamEvent frame validator\n//\n// Drift-tolerant: an unknown `event` discriminator or a non-object payload\n// is dropped silently (matches the behavior of the lower-level\n// `createTurnStream` plus consumer-side parsing). The strict\n// `TurnStreamEvent` static contract is preserved for downstream callers\n// because we only yield values whose `event` discriminator is one of the\n// known union members.\n// ---------------------------------------------------------------------------\n\nconst KNOWN_TURN_STREAM_EVENTS: ReadonlySet<TurnStreamEvent['event']> = new Set([\n 'token',\n 'thinking',\n 'tool_call_started',\n 'tool_call_completed',\n 'message',\n 'done',\n 'error',\n])\n\nfunction parseTurnStreamFrame(eventName: string, dataJson: string): TurnStreamEvent | null {\n if (!(KNOWN_TURN_STREAM_EVENTS as ReadonlySet<string>).has(eventName)) return null\n let payload: unknown\n try {\n payload = JSON.parse(dataJson)\n } catch {\n return null\n }\n if (typeof payload !== 'object' || payload === null || Array.isArray(payload)) return null\n // Server omits the discriminator from the JSON body (it lives in the SSE\n // `event:` line). Reattach it so the union member is well-formed.\n return { ...(payload as Record<string, unknown>), event: eventName } as TurnStreamEvent\n}\n\n", "import type { components } from '../generated/api.js'\nimport type { PhoneNumberId } from '../core/branded-types.js'\nimport { WorkspaceScopedResource, extractData } from './base.js'\nimport type { ListParams } from '../core/utils.js'\n\n/**\n * Manage phone numbers \u2014 provision, configure, and release Twilio numbers\n * that are attached to agents for inbound/outbound calling.\n */\nexport class PhoneNumbersResource extends WorkspaceScopedResource {\n /** Create a new phone number */\n async provision(body: components['schemas']['CreatePhoneNumberRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/phone-numbers', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n )\n }\n\n /** List phone numbers in the workspace */\n async list(params?: ListParams) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/phone-numbers', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n listAutoPaging(params?: ListParams) {\n return this.iteratePaginatedList((pageParams) => this.list(pageParams), params)\n }\n\n /** Get a phone number */\n async get(phoneNumberId: PhoneNumberId | string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/phone-numbers/{phone_number_id}', {\n params: { path: { workspace_id: this.workspaceId, phone_number_id: phoneNumberId } },\n }),\n )\n }\n\n /** Update a phone number (assign to agent, rename) */\n async update(\n phoneNumberId: PhoneNumberId | string,\n body: components['schemas']['UpdatePhoneNumberRequest'],\n ) {\n return extractData(\n await this.client.PUT('/v1/{workspace_id}/phone-numbers/{phone_number_id}', {\n params: { path: { workspace_id: this.workspaceId, phone_number_id: phoneNumberId } },\n body,\n }),\n )\n }\n\n /** Release a phone number back to the carrier */\n async release(phoneNumberId: PhoneNumberId | string): Promise<void> {\n await this.client.DELETE('/v1/{workspace_id}/phone-numbers/{phone_number_id}', {\n params: { path: { workspace_id: this.workspaceId, phone_number_id: phoneNumberId } },\n })\n }\n\n /** Set call forwarding for a phone number */\n async setForwarding(\n phoneNumberId: PhoneNumberId | string,\n body: components['schemas']['ForwardingConfigRequest'],\n ) {\n return extractData(\n await this.client.PUT('/v1/{workspace_id}/phone-numbers/{phone_number_id}/forwarding', {\n params: { path: { workspace_id: this.workspaceId, phone_number_id: phoneNumberId } },\n body,\n }),\n )\n }\n\n /** Clear call forwarding for a phone number */\n async clearForwarding(phoneNumberId: PhoneNumberId | string): Promise<void> {\n await this.client.DELETE('/v1/{workspace_id}/phone-numbers/{phone_number_id}/forwarding', {\n params: { path: { workspace_id: this.workspaceId, phone_number_id: phoneNumberId } },\n })\n }\n}\n", "import type { components } from '../generated/api.js'\nimport type { IntegrationId } from '../core/branded-types.js'\nimport { WorkspaceScopedResource, extractData } from './base.js'\nimport type { ListParams } from '../core/utils.js'\n\nexport interface ListIntegrationsParams extends ListParams {\n protocol?: string\n enabled?: boolean\n search?: string\n}\n\n/**\n * Manage integrations \u2014 connections to external systems (EHRs, CRMs, etc.).\n * Integrations power connector data acquisition and skill tool calls.\n */\nexport class IntegrationsResource extends WorkspaceScopedResource {\n /** Create a new integration */\n async create(body: components['schemas']['CreateIntegrationRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/integrations', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n )\n }\n\n /** List integrations */\n async list(params?: ListIntegrationsParams) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/integrations', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n listAutoPaging(params?: ListIntegrationsParams) {\n return this.iteratePaginatedList((pageParams) => this.list(pageParams), params)\n }\n\n /** Get a single integration */\n async get(integrationId: IntegrationId | string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/integrations/{integration_id}', {\n params: { path: { workspace_id: this.workspaceId, integration_id: integrationId } },\n }),\n )\n }\n\n /** Update integration configuration */\n async update(\n integrationId: IntegrationId | string,\n body: components['schemas']['UpdateIntegrationRequest'],\n ) {\n return extractData(\n await this.client.PUT('/v1/{workspace_id}/integrations/{integration_id}', {\n params: { path: { workspace_id: this.workspaceId, integration_id: integrationId } },\n body,\n }),\n )\n }\n\n /** Delete an integration */\n async delete(integrationId: IntegrationId | string): Promise<void> {\n await this.client.DELETE('/v1/{workspace_id}/integrations/{integration_id}', {\n params: { path: { workspace_id: this.workspaceId, integration_id: integrationId } },\n })\n }\n\n /**\n * Test a specific endpoint on an integration with given params.\n * Used in the developer console to validate integration config.\n */\n async testEndpoint(\n integrationId: IntegrationId | string,\n endpointName: string,\n body: components['schemas']['TestEndpointRequest'],\n ) {\n return extractData(\n await this.client.POST(\n '/v1/{workspace_id}/integrations/{integration_id}/endpoints/{endpoint_name}/test',\n {\n params: {\n path: {\n workspace_id: this.workspaceId,\n integration_id: integrationId,\n endpoint_name: endpointName,\n },\n },\n body,\n },\n ),\n )\n }\n\n\n /**\n * Probe an integration's connection + auth without invoking any specific\n * endpoint. Exercises auth resolution end-to-end (SSM lookups, OAuth2 token\n * mints, JWT signing) and sends a HEAD request to ``base_url`` (REST/FHIR)\n * or ``mcp_url`` (MCP). Safe on production integrations \u2014 HEAD carries no\n * side effects.\n *\n * The most recent probe outcome is persisted on the integration so\n * subsequent ``get`` / ``list`` responses surface ``last_tested_at`` +\n * ``last_test_status`` without re-probing.\n *\n * @returns ``status`` is one of ``healthy`` / ``auth_failed`` /\n * ``unreachable`` / ``timeout`` / ``ssl_error`` / ``misconfigured``,\n * each mapping to a distinct, actionable user message.\n */\n async testConnection(integrationId: IntegrationId | string) {\n return extractData(\n await this.client.POST(\n '/v1/{workspace_id}/integrations/{integration_id}/test-connection',\n {\n params: {\n path: {\n workspace_id: this.workspaceId,\n integration_id: integrationId,\n },\n },\n },\n ),\n )\n }\n\n /** Check health of all integrations in the workspace */\n async getHealthCheck() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/integrations/health-check', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n}\n", "import { WorkspaceScopedResource, extractData } from './base.js'\n\n/**\n * Analytics \u2014 aggregate metrics about calls, agents, quality, and usage.\n */\nexport class AnalyticsResource extends WorkspaceScopedResource {\n /** High-level dashboard summary \u2014 pass `days` (default: 7) for the lookback window */\n async getDashboard(params?: { days?: number }) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/analytics/dashboard', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n /** Call volume and duration metrics */\n async getCalls(params?: {\n days?: number\n date_from?: string | null\n date_to?: string | null\n interval?: '1h' | '1d' | '1w'\n service_id?: string | null\n }) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/analytics/calls', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n /** Per-agent performance breakdown */\n async getAgents(params?: { period?: string }) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/analytics/agents', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n /** Call quality \u2014 sentiment, transcription confidence, flagged calls */\n async getCallQuality(params?: {\n days?: number\n date_from?: string | null\n date_to?: string | null\n interval?: '1h' | '1d' | '1w'\n service_id?: string | null\n }) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/analytics/call-quality', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n /** Emotion trend data over time */\n async getEmotionTrends(params?: {\n days?: number\n date_from?: string | null\n date_to?: string | null\n interval?: '1h' | '1d' | '1w'\n service_id?: string | null\n }) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/analytics/emotion-trends', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n /** Voice pipeline latency metrics (TTFB, response time) */\n async getLatency(params?: {\n days?: number\n date_from?: string | null\n date_to?: string | null\n interval?: '1h' | '1d' | '1w'\n service_id?: string | null\n }) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/analytics/latency', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n /** Tool call performance \u2014 success rates and latency per tool */\n async getToolPerformance(params?: { days?: number }) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/analytics/tool-performance', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n /** Data quality metrics for the workspace world model */\n async getDataQuality(params?: { days?: number }) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/analytics/data-quality', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n /** Usage summary \u2014 API requests, call minutes, storage */\n async getUsage(params?: {\n days?: number\n date_from?: string | null\n date_to?: string | null\n interval?: '1h' | '1d' | '1w'\n service_id?: string | null\n direction?: string | null\n }) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/analytics/usage', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n /** Event type breakdown \u2014 counts and trends per event type */\n async getEventBreakdown(params?: { days?: number }) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/analytics/events', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n /** Safety and escalation trends \u2014 risk distribution and time-series data */\n async getSafetyTrends(params?: {\n days?: number\n date_from?: string | null\n date_to?: string | null\n interval?: '1h' | '1d' | '1w'\n service_id?: string | null\n }) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/analytics/safety-trends', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n /** Operator escalation performance and quality comparison */\n async getOperatorPerformance(params?: {\n days?: number\n date_from?: string | null\n date_to?: string | null\n interval?: '1h' | '1d' | '1w'\n service_id?: string | null\n }) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/analytics/operator-performance', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n /** Advanced call statistics (abandonment, transfers, silence, hour-of-day) */\n async getAdvancedCallStats(params?: {\n days?: number\n date_from?: string | null\n date_to?: string | null\n interval?: '1h' | '1d' | '1w'\n service_id?: string | null\n }) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/analytics/calls/advanced', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n /** Compare two time periods side by side */\n async compareCallPeriods(params: {\n current_from: string\n current_to: string\n previous_from: string\n previous_to: string\n service_id?: string\n }) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/analytics/calls/comparison', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n}\n", "import type { components } from '../generated/api.js'\nimport type { SimulationSessionId } from '../core/branded-types.js'\nimport { WorkspaceScopedResource, extractData } from './base.js'\n\n/**\n * Simulations \u2014 interactive agent testing via the Playground.\n *\n * Create a session to get the agent's greeting, then step through the\n * conversation turn by turn. Get LLM-generated caller suggestions to\n * guide exploratory testing.\n */\nexport class SimulationsResource extends WorkspaceScopedResource {\n /** Start a simulation session \u2014 returns the agent's greeting and initial snapshot */\n async createSession(\n body: components['schemas']['src__routes__simulations__CreateSessionRequest'],\n ) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/simulations/sessions', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n )\n }\n\n /** Get the current snapshot of a session */\n async getSession(sessionId: SimulationSessionId | string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/simulations/sessions/{session_id}', {\n params: { path: { workspace_id: this.workspaceId, session_id: sessionId } },\n }),\n )\n }\n\n /** Delete a simulation session */\n async deleteSession(sessionId: SimulationSessionId | string) {\n return extractData(\n await this.client.DELETE('/v1/{workspace_id}/simulations/sessions/{session_id}', {\n params: { path: { workspace_id: this.workspaceId, session_id: sessionId } },\n }),\n )\n }\n\n /**\n * Send a caller utterance and advance the session by one turn.\n * Returns the agent's response observation and updated snapshot.\n */\n async step(body: components['schemas']['StepRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/simulations/sessions/step', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n )\n }\n\n /**\n * Get LLM-generated caller message suggestions for the current session state.\n * Helps exploratory testing by suggesting realistic next caller turns.\n */\n async recommend(body: components['schemas']['RecommendRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/simulations/sessions/recommend', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n )\n }\n\n /** Get AI-generated call intelligence for a completed session */\n async getIntelligence(sessionId: SimulationSessionId | string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/simulations/sessions/{session_id}/intelligence', {\n params: { path: { workspace_id: this.workspaceId, session_id: sessionId } },\n }),\n )\n }\n}\n", "import type { components, operations } from '../generated/api.js'\nimport { WorkspaceScopedResource, extractData } from './base.js'\n\nexport type MetricCatalogEntry = components['schemas']['MetricCatalogEntry']\nexport type MetricCatalogResponse = components['schemas']['MetricCatalogResponse']\nexport type MetricListResponse = components['schemas']['MetricListResponse']\nexport type NumericalMetricValue = components['schemas']['NumericalMetricValueResponse']\nexport type CategoricalMetricValue = components['schemas']['CategoricalMetricValueResponse']\nexport type BooleanMetricValue = components['schemas']['BooleanMetricValueResponse']\nexport type MetricValue = NumericalMetricValue | CategoricalMetricValue | BooleanMetricValue\n/** @deprecated Use `MetricValue` instead. */\nexport type MetricValueResponse = MetricValue\nexport type MetricValuesParams = NonNullable<operations['get-metric-values']['parameters']['query']>\nexport type MetricTrendParams = NonNullable<operations['get-metric-trend']['parameters']['query']>\n\n/**\n * Metrics \u2014 computed metric catalog and typed metric values.\n */\nexport class MetricsResource extends WorkspaceScopedResource {\n /** List the latest value for each metric in the workspace */\n async listLatest() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/metrics', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n\n /** List available built-in and custom metric definitions */\n async getCatalog() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/metrics/catalog', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n\n /** Get stored values for one metric key, optionally bounded by time range */\n async getValues(metricKey: string, params?: MetricValuesParams) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/metrics/{metric_key}', {\n params: {\n path: { workspace_id: this.workspaceId, metric_key: metricKey },\n query: params,\n },\n }),\n )\n }\n\n /** Get a recent time-series trend for one metric key */\n async getTrend(metricKey: string, params?: MetricTrendParams) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/metrics/{metric_key}/trend', {\n params: {\n path: { workspace_id: this.workspaceId, metric_key: metricKey },\n query: params,\n },\n }),\n )\n }\n}\n", "import type { components } from '../generated/api.js'\nimport { WorkspaceScopedResource, extractData } from './base.js'\n\n/**\n * Workspace-level settings \u2014 configure voice behavior, branding, security\n * policies, data retention, outreach rules, and more.\n *\n * Each sub-resource has `get()` and `update()`.\n */\nexport class SettingsResource extends WorkspaceScopedResource {\n readonly voice = {\n get: async () =>\n extractData(\n await this.client.GET('/v1/{workspace_id}/settings/voice', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n ),\n update: async (body: components['schemas']['VoiceSettingsRequest']) =>\n extractData(\n await this.client.PUT('/v1/{workspace_id}/settings/voice', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n ),\n }\n\n readonly branding = {\n get: async () =>\n extractData(\n await this.client.GET('/v1/{workspace_id}/settings/branding', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n ),\n update: async (body: components['schemas']['BrandingSettingsRequest']) =>\n extractData(\n await this.client.PUT('/v1/{workspace_id}/settings/branding', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n ),\n }\n\n readonly outreach = {\n get: async () =>\n extractData(\n await this.client.GET('/v1/{workspace_id}/settings/outreach', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n ),\n update: async (body: components['schemas']['OutreachSettingsRequest']) =>\n extractData(\n await this.client.PUT('/v1/{workspace_id}/settings/outreach', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n ),\n }\n\n readonly memory = {\n get: async () =>\n extractData(\n await this.client.GET('/v1/{workspace_id}/settings/memory', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n ),\n update: async (body: components['schemas']['MemorySettingsRequest']) =>\n extractData(\n await this.client.PUT('/v1/{workspace_id}/settings/memory', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n ),\n }\n\n readonly security = {\n get: async () =>\n extractData(\n await this.client.GET('/v1/{workspace_id}/settings/security', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n ),\n update: async (body: components['schemas']['SecuritySettingsRequest']) =>\n extractData(\n await this.client.PUT('/v1/{workspace_id}/settings/security', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n ),\n }\n\n readonly retention = {\n get: async () =>\n extractData(\n await this.client.GET('/v1/{workspace_id}/settings/retention', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n ),\n update: async (body: components['schemas']['RetentionPolicyRequest']) =>\n extractData(\n await this.client.PUT('/v1/{workspace_id}/settings/retention', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n ),\n }\n\n readonly behaviors = {\n get: async () =>\n extractData(\n await this.client.GET('/v1/{workspace_id}/settings/behaviors', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n ),\n update: async (body: components['schemas']['BehaviorSettingsRequest']) =>\n extractData(\n await this.client.PUT('/v1/{workspace_id}/settings/behaviors', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n ),\n }\n\n readonly gapScanner = {\n get: async () =>\n extractData(\n await this.client.GET('/v1/{workspace_id}/settings/gap-scanner', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n ),\n update: async (body: components['schemas']['GapScannerSettingsRequest']) =>\n extractData(\n await this.client.PUT('/v1/{workspace_id}/settings/gap-scanner', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n ),\n }\n\n readonly scribe = {\n get: async () =>\n extractData(\n await this.client.GET('/v1/{workspace_id}/settings/scribe', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n ),\n update: async (body: components['schemas']['ScribeSettingsRequest']) =>\n extractData(\n await this.client.PUT('/v1/{workspace_id}/settings/scribe', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n ),\n }\n\n readonly metrics = {\n get: async () =>\n extractData(\n await this.client.GET('/v1/{workspace_id}/settings/metrics', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n ),\n update: async (body: components['schemas']['MetricSettingsRequest']) =>\n extractData(\n await this.client.PUT('/v1/{workspace_id}/settings/metrics', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n ),\n }\n\n readonly environments = {\n get: async () =>\n extractData(\n await this.client.GET('/v1/{workspace_id}/settings/environments', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n ),\n update: async (body: components['schemas']['EnvironmentSettingsRequest']) =>\n extractData(\n await this.client.PUT('/v1/{workspace_id}/settings/environments', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n ),\n }\n\n readonly workflows = {\n get: async () =>\n extractData(\n await this.client.GET('/v1/{workspace_id}/settings/workflows', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n ),\n update: async (body: components['schemas']['WorkflowSettingsRequest']) =>\n extractData(\n await this.client.PUT('/v1/{workspace_id}/settings/workflows', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n ),\n }\n}\n", "import { WorkspaceScopedResource, extractData } from './base.js'\nimport type { ListParams } from '../core/utils.js'\n\nexport interface ListInvoicesParams extends ListParams {\n status?: 'draft' | 'sent' | 'paid' | 'void'\n date_from?: string\n date_to?: string\n}\n\nexport interface UsageTrendsParams {\n days?: number\n date_from?: string\n date_to?: string\n meter_key?: string\n}\n\n/**\n * Billing \u2014 dashboard, usage summaries, invoices, and usage trends.\n */\nexport class BillingResource extends WorkspaceScopedResource {\n /** Get composite billing dashboard \u2014 KPIs, period comparison, top meters, invoice summary */\n async getDashboard() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/billing/dashboard', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n\n /** Get usage summary for the workspace */\n async getUsage() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/billing/usage', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n\n /** Get usage time-series per meter for trend charts */\n async getUsageTrends(params?: UsageTrendsParams) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/billing/usage/trends', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n /** List invoices for the workspace */\n async listInvoices(params?: ListInvoicesParams) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/billing/invoices', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n listInvoicesAutoPaging(params?: ListInvoicesParams) {\n return this.iteratePaginatedList((pageParams) => this.listInvoices(pageParams), params)\n }\n\n /** Get invoice detail */\n async getInvoice(invoiceId: string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/billing/invoices/{invoice_id}', {\n params: { path: { workspace_id: this.workspaceId, invoice_id: invoiceId } },\n }),\n )\n }\n\n /** Get presigned S3 URL for invoice PDF download */\n async getInvoicePdf(invoiceId: string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/billing/invoices/{invoice_id}/pdf', {\n params: { path: { workspace_id: this.workspaceId, invoice_id: invoiceId } },\n }),\n )\n }\n}\n", "import type { EntityId } from '../core/branded-types.js'\nimport { WorkspaceScopedResource, extractData } from './base.js'\n\n/**\n * Agent Memory \u2014 structured long-term memory for entities.\n *\n * Memory is organised into dimensions (e.g. \"preferences\", \"health_history\").\n * Each dimension accumulates facts extracted from calls and events over time.\n * This powers the \"Agent Memory\" view in the console.\n */\nexport class MemoryResource extends WorkspaceScopedResource {\n /**\n * Get all memory dimension scores for an entity.\n * Scores reflect how complete and confident each dimension's facts are.\n */\n async getEntityDimensions(entityId: EntityId | string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/memory/{entity_id}/dimensions', {\n params: { path: { workspace_id: this.workspaceId, entity_id: entityId } },\n }),\n )\n }\n\n /**\n * Get individual memory facts for an entity, optionally filtered by dimension.\n */\n async getEntityFacts(\n entityId: EntityId | string,\n params?: { dimension?: string; limit?: number },\n ) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/memory/{entity_id}/facts', {\n params: {\n path: { workspace_id: this.workspaceId, entity_id: entityId },\n query: params,\n },\n }),\n )\n }\n\n /**\n * Get workspace-level memory analytics \u2014 coverage rates, dimension health,\n * and fact ingestion trends.\n */\n async getAnalytics() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/memory/analytics', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n}\n", "import type { components } from '../generated/api.js'\nimport type { PersonaId } from '../core/branded-types.js'\nimport { WorkspaceScopedResource, extractData } from './base.js'\nimport type { ListParams } from '../core/utils.js'\n\nexport interface ListPersonasParams extends ListParams {\n search?: string | null\n sort_by?: string | null\n}\n\nexport class PersonasResource extends WorkspaceScopedResource {\n async list(params?: ListPersonasParams) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/personas', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n listAutoPaging(params?: ListPersonasParams) {\n return this.iteratePaginatedList((pageParams) => this.list(pageParams), params)\n }\n\n async create(body: components['schemas']['CreatePersonaRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/personas', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n )\n }\n\n async get(personaId: PersonaId | string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/personas/{persona_id}', {\n params: { path: { workspace_id: this.workspaceId, persona_id: personaId } },\n }),\n )\n }\n\n async update(personaId: PersonaId | string, body: components['schemas']['UpdatePersonaRequest']) {\n return extractData(\n await this.client.PATCH('/v1/{workspace_id}/personas/{persona_id}', {\n params: { path: { workspace_id: this.workspaceId, persona_id: personaId } },\n body,\n }),\n )\n }\n\n async delete(personaId: PersonaId | string): Promise<void> {\n await this.client.DELETE('/v1/{workspace_id}/personas/{persona_id}', {\n params: { path: { workspace_id: this.workspaceId, persona_id: personaId } },\n })\n }\n}\n", "import type { components } from '../generated/api.js'\nimport { WorkspaceScopedResource, extractData } from './base.js'\nimport type { ListParams } from '../core/utils.js'\n\nexport interface ListReviewItemsParams extends ListParams {\n status?: string | null\n entity_type?: string | null\n priority?: number | null\n reason?: string | null\n assigned_to?: string | null\n created_after?: string | null\n created_before?: string | null\n sort_by?: string | null\n sort_order?: string\n}\n\nexport interface ReviewHistoryParams extends ListParams {\n action?: string | null\n reviewed_by?: string | null\n completed_after?: string | null\n completed_before?: string | null\n}\n\nexport class ReviewQueueResource extends WorkspaceScopedResource {\n async list(params?: ListReviewItemsParams) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/review-queue', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n listAutoPaging(params?: ListReviewItemsParams) {\n return this.iteratePaginatedList((pageParams) => this.list(pageParams), params)\n }\n\n async get(itemId: string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/review-queue/{item_id}', {\n params: { path: { workspace_id: this.workspaceId, item_id: itemId } },\n }),\n )\n }\n\n async getStats() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/review-queue/stats', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n\n async getDashboard() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/review-queue/dashboard', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n\n async getMyQueue(params?: ListParams) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/review-queue/my-queue', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n getMyQueueAutoPaging(params?: ListParams) {\n return this.iteratePaginatedList((pageParams) => this.getMyQueue(pageParams), params)\n }\n\n async approve(itemId: string, body: components['schemas']['ApproveRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/review-queue/{item_id}/approve', {\n params: { path: { workspace_id: this.workspaceId, item_id: itemId } },\n body,\n }),\n )\n }\n\n async reject(itemId: string, body: components['schemas']['RejectRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/review-queue/{item_id}/reject', {\n params: { path: { workspace_id: this.workspaceId, item_id: itemId } },\n body,\n }),\n )\n }\n\n async claim(itemId: string) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/review-queue/{item_id}/claim', {\n params: { path: { workspace_id: this.workspaceId, item_id: itemId } },\n }),\n )\n }\n\n async unclaim(itemId: string) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/review-queue/{item_id}/unclaim', {\n params: { path: { workspace_id: this.workspaceId, item_id: itemId } },\n }),\n )\n }\n\n async correct(itemId: string, body: components['schemas']['CorrectRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/review-queue/{item_id}/correct', {\n params: { path: { workspace_id: this.workspaceId, item_id: itemId } },\n body,\n }),\n )\n }\n\n async batchApprove(body: components['schemas']['BatchApproveRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/review-queue/batch-approve', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n )\n }\n\n async batchReject(body: components['schemas']['BatchRejectRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/review-queue/batch-reject', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n )\n }\n\n async getHistory(params?: ReviewHistoryParams) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/review-queue/history', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n getHistoryAutoPaging(params?: ReviewHistoryParams) {\n return this.iteratePaginatedList((pageParams) => this.getHistory(pageParams), params)\n }\n\n async getTrends(params?: { days?: number }) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/review-queue/trends', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n async getPerformance(params?: { days?: number }) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/review-queue/performance', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n async getCorrectionSchema(itemId: string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/review-queue/{item_id}/correction-schema', {\n params: { path: { workspace_id: this.workspaceId, item_id: itemId } },\n }),\n )\n }\n\n async getDiff(itemId: string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/review-queue/{item_id}/diff', {\n params: { path: { workspace_id: this.workspaceId, item_id: itemId } },\n }),\n )\n }\n}\n", "import { WorkspaceScopedResource, extractData } from './base.js'\n\nexport class RecordingsResource extends WorkspaceScopedResource {\n async getUrls(callSid: string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/recordings/{call_sid}/urls', {\n params: { path: { workspace_id: this.workspaceId, call_sid: callSid } },\n }),\n )\n }\n\n async getMetadata(callSid: string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/recordings/{call_sid}/metadata', {\n params: { path: { workspace_id: this.workspaceId, call_sid: callSid } },\n }),\n )\n }\n\n async download(callSid: string, filename: string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/recordings/{call_sid}/download/{filename}', {\n params: { path: { workspace_id: this.workspaceId, call_sid: callSid, filename } },\n }),\n )\n }\n}\n", "import type { components } from '../generated/api.js'\nimport { WorkspaceScopedResource, extractData } from './base.js'\n\nexport interface ListAuditParams {\n service?: string | null\n action?: string | null\n actor_entity_id?: string | null\n resource_type?: string | null\n resource_id?: string | null\n phi_only?: boolean\n date_from?: string | null\n date_to?: string | null\n limit?: number\n offset?: number\n}\n\nexport interface PhiAccessParams {\n entity_id?: string | null\n date_from?: string | null\n date_to?: string | null\n limit?: number\n offset?: number\n}\n\nexport interface EntityAccessLogParams {\n date_from?: string | null\n date_to?: string | null\n limit?: number\n offset?: number\n}\n\nexport class AuditResource extends WorkspaceScopedResource {\n async list(params?: ListAuditParams) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/audit', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n listAutoPaging(params?: ListAuditParams) {\n return this.iterateOffsetPaginatedList(\n (pageParams) => this.list(pageParams),\n (page) => page.events,\n params,\n )\n }\n\n async getSummary(params?: { date_from?: string | null; date_to?: string | null }) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/audit/summary', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n async getPhiAccess(params?: PhiAccessParams) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/audit/phi-access', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n getPhiAccessAutoPaging(params?: PhiAccessParams) {\n return this.iterateOffsetPaginatedList(\n (pageParams) => this.getPhiAccess(pageParams),\n (page) => page.events,\n params,\n )\n }\n\n async createExport(body: components['schemas']['AuditExportRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/audit/export', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n )\n }\n\n async listExports() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/audit/exports', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n\n async getEntityAccessLog(entityId: string, params?: EntityAccessLogParams) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/audit/entity/{entity_id}/access-log', {\n params: { path: { workspace_id: this.workspaceId, entity_id: entityId }, query: params },\n }),\n )\n }\n\n getEntityAccessLogAutoPaging(entityId: string, params?: EntityAccessLogParams) {\n return this.iterateOffsetPaginatedList(\n (pageParams) => this.getEntityAccessLog(entityId, pageParams),\n (page) => page.events,\n params,\n )\n }\n}\n", "import type { components } from '../generated/api.js'\nimport { WorkspaceScopedResource, extractData } from './base.js'\nimport type { ListParams } from '../core/utils.js'\n\nexport class WebhookDestinationsResource extends WorkspaceScopedResource {\n async list(params?: ListParams) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/webhook-destinations', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n listAutoPaging(params?: ListParams) {\n return this.iteratePaginatedList((pageParams) => this.list(pageParams), params)\n }\n\n async create(body: components['schemas']['CreateWebhookDestinationRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/webhook-destinations', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n )\n }\n\n async get(destinationId: string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/webhook-destinations/{destination_id}', {\n params: { path: { workspace_id: this.workspaceId, destination_id: destinationId } },\n }),\n )\n }\n\n async update(\n destinationId: string,\n body: components['schemas']['UpdateWebhookDestinationRequest'],\n ) {\n return extractData(\n await this.client.PUT('/v1/{workspace_id}/webhook-destinations/{destination_id}', {\n params: { path: { workspace_id: this.workspaceId, destination_id: destinationId } },\n body,\n }),\n )\n }\n\n async delete(destinationId: string): Promise<void> {\n await this.client.DELETE('/v1/{workspace_id}/webhook-destinations/{destination_id}', {\n params: { path: { workspace_id: this.workspaceId, destination_id: destinationId } },\n })\n }\n\n async listDeliveries(destinationId: string, params?: ListParams) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/webhook-destinations/{destination_id}/deliveries', {\n params: {\n path: { workspace_id: this.workspaceId, destination_id: destinationId },\n query: params,\n },\n }),\n )\n }\n\n listDeliveriesAutoPaging(destinationId: string, params?: ListParams) {\n return this.iteratePaginatedList(\n (pageParams) => this.listDeliveries(destinationId, pageParams),\n params,\n )\n }\n\n async rotateSecret(destinationId: string) {\n return extractData(\n await this.client.POST(\n '/v1/{workspace_id}/webhook-destinations/{destination_id}/rotate-secret',\n {\n params: { path: { workspace_id: this.workspaceId, destination_id: destinationId } },\n },\n ),\n )\n }\n}\n", "import type { components } from '../generated/api.js'\nimport { WorkspaceScopedResource, extractData } from './base.js'\n\nexport class SafetyResource extends WorkspaceScopedResource {\n async getConfig() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/safety/config', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n\n async updateConfig(body: components['schemas']['UpdateSafetyConfigRequest']) {\n return extractData(\n await this.client.PUT('/v1/{workspace_id}/safety/config', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n )\n }\n\n async listTemplates() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/safety/templates', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n\n async getTemplate(templateId: string) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/safety/templates/{template_id}', {\n params: { path: { workspace_id: this.workspaceId, template_id: templateId } },\n }),\n )\n }\n\n async applyTemplate(templateId: string, body: components['schemas']['ApplyTemplateRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/safety/templates/{template_id}/apply', {\n params: { path: { workspace_id: this.workspaceId, template_id: templateId } },\n body,\n }),\n )\n }\n}\n", "import { WorkspaceScopedResource, extractData } from './base.js'\n\nexport class ComplianceResource extends WorkspaceScopedResource {\n async getDashboard() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/compliance/dashboard', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n\n async getHipaa(params?: { report_period_days?: number }) {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/compliance/hipaa', {\n params: { path: { workspace_id: this.workspaceId }, query: params },\n }),\n )\n }\n\n async getAccessReview() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/compliance/access-review', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n}\n", "/**\n * Real-time workspace event streaming via Server-Sent Events.\n *\n * Subscribes to ``GET /v1/{workspace_id}/events/stream`` and yields typed\n * {@link WorkspaceSSEEvent} values. The platform-api endpoint:\n *\n * - Streams ``text/event-stream`` over HTTP/1.1\n * - Sends ``retry: 3000`` directive as the first frame\n * - Tags every event with ``id: <millisecond-timestamp>`` for replay\n * - Buffers the last 5 minutes of events in Valkey for gapless reconnect\n * - Pops the discriminator (``event_type``) out of the JSON ``data:``\n * payload and into the SSE ``event:`` line \u2014 this helper reattaches\n * it before yielding the typed union member\n *\n * Implementation choice: this helper uses the SDK's own fetch transport\n * (with auth + retry middleware applied) rather than the WHATWG\n * ``EventSource`` API or the ``eventsource`` polyfill. The reasons are:\n *\n * 1. ``EventSource`` cannot send ``Authorization`` headers \u2014 the polyfill\n * can, but adds a runtime dep and bypasses the SDK's BFF-proxy /\n * custom-fetch / mock-fetch composition.\n * 2. Reusing the existing ``createTurnStream`` pattern keeps a single\n * SSE parser in the SDK and shares the auth middleware that already\n * attaches the bearer token on every request.\n * 3. The SDK ships with two runtime deps (``openapi-fetch`` +\n * ``openapi-typescript-helpers``); adding ``eventsource`` would inflate\n * bundle size for a feature that fetch streaming handles cleanly.\n *\n * The trade-off is that we reimplement the reconnect loop. The platform-api\n * advertises ``retry: 3000`` and we honor that as the initial backoff,\n * doubling with full jitter on each successive failure up to ``maxDelayMs``.\n *\n * @see ConversationsResource.streamTurn for the analogous turn-stream helper.\n */\n\nimport type { components } from '../generated/api.js'\nimport { type PlatformFetch } from '../core/openapi-client.js'\nimport { WorkspaceScopedResource } from './base.js'\n\n/**\n * Discriminated union of every workspace SSE event variant exposed by\n * platform-api. Members carry their own ``event_type`` literal \u2014 narrow\n * with ``switch (event.event_type)`` to access typed payload fields.\n */\nexport type WorkspaceSSEEvent = components['schemas']['WorkspaceSSEEvent']\n\n/** Discriminator literal for {@link WorkspaceSSEEvent} members. */\nexport type WorkspaceSSEEventType = WorkspaceSSEEvent['event_type']\n\n/**\n * Reason taxonomy for {@link WorkspaceEventStreamError}. The platform-api\n * stream encodes a stable ``code`` in every error / control frame so\n * consumers can branch deterministically without parsing free-form text.\n *\n * * ``too_many_streams`` \u2014 workspace exceeded its concurrent-stream cap\n * (``error`` frame with ``code=too_many_streams``). Do NOT auto-retry \u2014\n * close another tab first.\n * * ``stream_unavailable`` \u2014 Valkey or downstream pubsub is unreachable.\n * Retryable, but not until the platform recovers.\n * * ``stream_error`` \u2014 generic server-side stream failure.\n * * ``auth`` \u2014 401/403 returned at connect time. Terminal.\n * * ``transport_exhausted`` \u2014 reconnect budget exhausted.\n * * ``aborted`` \u2014 caller aborted via signal / ``unsubscribe()``.\n * * ``unknown`` \u2014 fallback when the server returns an error frame the SDK\n * does not recognize.\n */\nexport type WorkspaceEventStreamErrorCode =\n | 'too_many_streams'\n | 'stream_unavailable'\n | 'stream_error'\n | 'auth'\n | 'transport_exhausted'\n | 'aborted'\n | 'unknown'\n\n/**\n * Structured error surfaced through {@link SubscribeToWorkspaceOptions.onError}.\n *\n * Subclasses ``Error`` so existing consumers using ``err.message`` continue\n * to work, while adding ``code`` + ``retryable`` + raw ``frame`` for\n * deterministic branching. Inspect with ``isWorkspaceEventStreamError``.\n */\nexport class WorkspaceEventStreamError extends Error {\n readonly code: WorkspaceEventStreamErrorCode\n readonly retryable: boolean\n /** Raw decoded ``error`` frame body (or ``undefined`` for transport errors). */\n readonly frame: Record<string, unknown> | undefined\n\n constructor(\n message: string,\n code: WorkspaceEventStreamErrorCode,\n retryable: boolean,\n frame?: Record<string, unknown>,\n ) {\n super(message)\n this.name = 'WorkspaceEventStreamError'\n this.code = code\n this.retryable = retryable\n this.frame = frame\n }\n}\n\nexport function isWorkspaceEventStreamError(\n value: unknown,\n): value is WorkspaceEventStreamError {\n return value instanceof WorkspaceEventStreamError\n}\n\n/**\n * Options for {@link EventsResource.subscribeToWorkspace}.\n */\nexport interface SubscribeToWorkspaceOptions {\n /**\n * Resume from a previously seen event id. Forwarded as the\n * ``Last-Event-ID`` request header on the first connect; the server\n * replays buffered events with id > ``lastEventId`` before switching to\n * live pub/sub. The SDK automatically tracks the most recent id during\n * the stream and re-sends it on every reconnect.\n *\n * Event ids are millisecond Unix timestamps; pass them as raw numeric\n * strings.\n */\n lastEventId?: string\n\n /**\n * Cancellation signal. Aborting the signal closes the underlying fetch\n * stream and stops the reconnect loop.\n */\n signal?: AbortSignal\n\n /** Invoked once per parsed, typed event. */\n onEvent: (event: WorkspaceSSEEvent) => void\n\n /**\n * Invoked on a terminal error (e.g., 401 / 403, abort, or reconnect\n * budget exhausted). Will not be called more than once per\n * ``subscribeToWorkspace`` invocation.\n */\n onError?: (error: Error) => void\n\n /**\n * Invoked just before each reconnect attempt with the 1-based attempt\n * number. The first connection (attempt 0) does not fire this.\n */\n onReconnect?: (attempt: number) => void\n\n /**\n * Initial reconnect delay in milliseconds. Defaults to 3000 to match\n * the platform-api ``retry:`` directive. The actual delay grows\n * exponentially (with jitter) up to ``maxDelayMs`` per failure.\n */\n initialDelayMs?: number\n\n /** Cap on the reconnect backoff delay in milliseconds. Defaults to 30s. */\n maxDelayMs?: number\n\n /**\n * Maximum number of reconnect attempts before giving up and calling\n * ``onError``. Defaults to 10. Set to ``Infinity`` to retry forever\n * (the consumer is then responsible for aborting via ``signal``).\n */\n maxReconnects?: number\n}\n\n/**\n * Handle returned by {@link EventsResource.subscribeToWorkspace}.\n *\n * Resolves when the stream terminates \u2014 either because the consumer\n * aborted via ``signal``, an unrecoverable error fired ``onError``, or\n * the reconnect budget was exhausted. The promise never rejects; consume\n * errors via ``onError``.\n */\nexport interface SubscriptionHandle {\n /**\n * Returns a promise that resolves once the subscription has fully\n * stopped (post-abort cleanup complete, no further callbacks pending).\n */\n done: Promise<void>\n\n /**\n * Stop the subscription. Equivalent to aborting the caller-supplied\n * ``AbortSignal``. Idempotent.\n */\n unsubscribe(): void\n}\n\nconst DEFAULT_INITIAL_DELAY_MS = 3000\nconst DEFAULT_MAX_DELAY_MS = 30000\nconst DEFAULT_MAX_RECONNECTS = 10\n// Hard ceiling on a single SSE field value to defend against a misbehaving\n// upstream that streams without ever emitting a frame terminator. 1 MiB is\n// far above any legitimate platform event payload (most are <2 KiB).\nconst MAX_FRAME_BYTES = 1_048_576\n\n/**\n * Real-time event stream resource.\n *\n * @example\n * ```ts\n * const handle = client.events.subscribeToWorkspace({\n * onEvent: (event) => {\n * switch (event.event_type) {\n * case 'call.started':\n * console.log('Call started:', event.call_sid)\n * break\n * case 'pipeline.error':\n * console.error('Pipeline error:', event)\n * break\n * }\n * },\n * onError: (err) => console.error('Stream error:', err),\n * onReconnect: (attempt) => console.warn(`Reconnect #${attempt}`),\n * })\n *\n * // Later, to stop:\n * handle.unsubscribe()\n * await handle.done\n * ```\n */\nexport class EventsResource extends WorkspaceScopedResource {\n constructor(client: PlatformFetch, workspaceId: string) {\n super(client, workspaceId)\n }\n\n /**\n * Subscribe to the workspace event stream.\n *\n * Establishes an SSE connection to ``/v1/{workspace_id}/events/stream``\n * and invokes ``onEvent`` once per typed {@link WorkspaceSSEEvent}.\n * Unrecoverable failures (auth errors, exhausted reconnect budget,\n * caller abort) surface through ``onError``.\n *\n * Reconnection is automatic: on a network drop or 5xx, the helper\n * backs off (initial delay derived from the ``retry:`` directive,\n * default 3s, doubling with full jitter up to ``maxDelayMs``) and\n * resumes with the most recently seen ``Last-Event-ID``. The platform\n * buffers 5 minutes of events for gapless replay.\n *\n * @returns a {@link SubscriptionHandle} for cleanup. Aborting the\n * caller's ``signal`` is equivalent to calling ``unsubscribe()``.\n */\n subscribeToWorkspace(options: SubscribeToWorkspaceOptions): SubscriptionHandle {\n const localController = new AbortController()\n const cleanups: Array<() => void> = []\n\n if (options.signal) {\n if (options.signal.aborted) {\n localController.abort(options.signal.reason)\n } else {\n const onAbort = (): void => localController.abort(options.signal?.reason)\n options.signal.addEventListener('abort', onAbort, { once: true })\n cleanups.push(() => options.signal?.removeEventListener('abort', onAbort))\n }\n }\n\n const done = runSubscription(\n this.client,\n this.workspaceId,\n options,\n localController.signal,\n ).finally(() => {\n for (const cleanup of cleanups) cleanup()\n })\n\n return {\n done,\n unsubscribe: () => localController.abort(),\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Internal helpers\n// ---------------------------------------------------------------------------\n\ntype StreamOutcome =\n | { kind: 'aborted' }\n | { kind: 'auth-error'; error: Error }\n | { kind: 'transport-error'; reason: string }\n | {\n kind: 'terminal-server-error'\n code: WorkspaceEventStreamErrorCode\n message: string\n retryable: boolean\n frame: Record<string, unknown>\n }\n\n/**\n * Server-sent ``error`` event frames that the SDK should treat as terminal\n * (do NOT auto-retry). Mirror the ``code`` taxonomy emitted by\n * ``platform-api/src/routes/event_stream.py``.\n */\nconst TERMINAL_SERVER_ERROR_CODES: Record<string, WorkspaceEventStreamErrorCode> = {\n too_many_streams: 'too_many_streams',\n}\n\n/**\n * Server-sent ``error`` event frames that are recoverable \u2014 surface them as\n * transport errors so the reconnect loop kicks in. ``stream_unavailable``\n * fires when Valkey is down; ``stream_error`` is the generic catch-all from\n * the server-side ``except Exception`` branch.\n */\nconst RECOVERABLE_SERVER_ERROR_CODES: Record<string, WorkspaceEventStreamErrorCode> = {\n stream_unavailable: 'stream_unavailable',\n stream_error: 'stream_error',\n}\n\nasync function runSubscription(\n client: PlatformFetch,\n workspaceId: string,\n options: SubscribeToWorkspaceOptions,\n signal: AbortSignal,\n): Promise<void> {\n let lastEventId = options.lastEventId\n let attempt = 0\n let delayMs = options.initialDelayMs ?? DEFAULT_INITIAL_DELAY_MS\n const maxDelayMs = options.maxDelayMs ?? DEFAULT_MAX_DELAY_MS\n const maxReconnects = options.maxReconnects ?? DEFAULT_MAX_RECONNECTS\n let errorReported = false\n\n const reportError = (error: Error): void => {\n if (errorReported) return\n errorReported = true\n try {\n options.onError?.(error)\n } catch {\n // Consumer-supplied callback raised \u2014 swallow to keep teardown clean.\n }\n }\n\n while (!signal.aborted) {\n if (attempt > 0) {\n try {\n options.onReconnect?.(attempt)\n } catch {\n // Consumer-supplied callback raised \u2014 swallow to keep teardown clean.\n }\n }\n\n let outcome: StreamOutcome\n try {\n outcome = await runOneConnection({\n client,\n workspaceId,\n lastEventId,\n signal,\n onEvent: options.onEvent,\n onIdAdvance: (id) => {\n lastEventId = id\n },\n onRetryDirective: (ms) => {\n // Server-sent retry directive resets the backoff floor.\n delayMs = clampDelay(ms, options.initialDelayMs, maxDelayMs)\n },\n })\n } catch (err) {\n // runOneConnection surfaces only terminal auth errors via throw;\n // everything else is a StreamOutcome. Preserve the original Error\n // (typically ``AuthenticationError`` with ``statusCode``) so consumers\n // that branch on ``err.statusCode`` keep working.\n reportError(err instanceof Error ? err : new Error(String(err)))\n return\n }\n\n if (signal.aborted || outcome.kind === 'aborted') {\n return\n }\n\n if (outcome.kind === 'auth-error') {\n // 401 / 403 \u2014 never auto-retry. The token is invalid and the\n // stream cannot succeed without operator intervention. Surface the\n // original ``AuthenticationError`` so consumers checking\n // ``err.statusCode`` keep working.\n reportError(outcome.error)\n return\n }\n\n if (outcome.kind === 'terminal-server-error') {\n // Server emitted a structured ``error`` frame with a code that the\n // SDK recognizes as terminal (e.g., ``too_many_streams``). Surface\n // it as a typed ``WorkspaceEventStreamError`` so consumers can branch\n // on ``error.code`` without parsing free-form text.\n reportError(\n new WorkspaceEventStreamError(\n outcome.message,\n outcome.code,\n outcome.retryable,\n outcome.frame,\n ),\n )\n return\n }\n\n if (attempt >= maxReconnects) {\n reportError(\n new WorkspaceEventStreamError(\n `SSE subscription exhausted reconnect budget (${maxReconnects}): ${outcome.reason}`,\n 'transport_exhausted',\n true,\n ),\n )\n return\n }\n\n attempt += 1\n const sleepMs = jitter(delayMs)\n delayMs = Math.min(delayMs * 2, maxDelayMs)\n const slept = await abortableSleep(sleepMs, signal)\n if (!slept) return\n }\n}\n\ninterface RunOneConnectionArgs {\n client: PlatformFetch\n workspaceId: string\n lastEventId: string | undefined\n signal: AbortSignal\n onEvent: (event: WorkspaceSSEEvent) => void\n onIdAdvance: (id: string) => void\n onRetryDirective: (ms: number) => void\n}\n\nasync function runOneConnection(args: RunOneConnectionArgs): Promise<StreamOutcome> {\n const headers: Record<string, string> = { Accept: 'text/event-stream' }\n if (args.lastEventId !== undefined) {\n headers['Last-Event-ID'] = args.lastEventId\n }\n\n let result: { data?: unknown; error?: unknown; response?: Response }\n try {\n result = await args.client.GET('/v1/{workspace_id}/events/stream', {\n params: { path: { workspace_id: args.workspaceId } },\n headers,\n parseAs: 'stream',\n signal: args.signal,\n })\n } catch (err) {\n if (args.signal.aborted) return { kind: 'aborted' }\n const error = err instanceof Error ? err : new Error(String(err))\n // 4xx (including 401 / 403) are surfaced as thrown AmigoErrors by the\n // SDK error middleware. Distinguish those from transport failures.\n const status = readStatus(error)\n if (status === 401 || status === 403) {\n return { kind: 'auth-error', error }\n }\n return { kind: 'transport-error', reason: error.message }\n }\n\n if (result.error !== undefined) {\n // openapi-fetch surfaces non-OK responses as `error`. The SDK error\n // middleware should have thrown \u2014 fall through defensively.\n return { kind: 'transport-error', reason: `API error: ${safeStringify(result.error)}` }\n }\n\n const body = result.data\n if (!(body instanceof ReadableStream)) {\n return { kind: 'transport-error', reason: 'Expected ReadableStream body for SSE' }\n }\n\n try {\n for await (const frame of parseSSEFrames(body, args.signal)) {\n if (args.signal.aborted) return { kind: 'aborted' }\n if (frame.retry !== undefined) {\n args.onRetryDirective(frame.retry)\n }\n if (frame.id !== undefined) {\n args.onIdAdvance(frame.id)\n }\n if (frame.event === 'error' && frame.data !== undefined) {\n // Structured error frame \u2014 branch on ``code`` from the server. We\n // distinguish three buckets: terminal (don't retry), recoverable\n // (let the reconnect loop run), and unknown (default to recoverable\n // so a future server code does not strand consumers without auto-\n // retry).\n const errOutcome = interpretServerErrorFrame(frame.data)\n if (errOutcome.terminal) {\n return {\n kind: 'terminal-server-error',\n code: errOutcome.code,\n message: errOutcome.message,\n retryable: errOutcome.retryable,\n frame: errOutcome.frame,\n }\n }\n return { kind: 'transport-error', reason: errOutcome.message }\n }\n if (frame.event && frame.data !== undefined) {\n const event = parseWorkspaceFrame(frame.event, frame.data)\n if (event) {\n try {\n args.onEvent(event)\n } catch {\n // Consumer threw during onEvent; do not let it kill the\n // subscription. The stream is still healthy.\n }\n }\n }\n }\n } catch (err) {\n if (args.signal.aborted) return { kind: 'aborted' }\n const reason = err instanceof Error ? err.message : String(err)\n return { kind: 'transport-error', reason }\n }\n\n if (args.signal.aborted) return { kind: 'aborted' }\n // Reader closed cleanly \u2014 server EOF. Treat as recoverable; reconnect\n // with whatever Last-Event-ID we have.\n return { kind: 'transport-error', reason: 'Stream closed by server' }\n}\n\ninterface SSEFrame {\n event: string\n data: string | undefined\n id: string | undefined\n retry: number | undefined\n}\n\n/**\n * Parses an SSE byte stream into structured frames.\n *\n * Forks the parser in {@link ConversationsResource.streamTurn} to also\n * surface ``id:`` and ``retry:`` lines that the workspace event stream\n * relies on for gapless reconnect.\n */\nasync function* parseSSEFrames(\n stream: ReadableStream<Uint8Array>,\n signal: AbortSignal,\n): AsyncGenerator<SSEFrame> {\n const reader = stream.getReader()\n const decoder = new TextDecoder()\n let buffer = ''\n\n // When the caller aborts, cancel the reader so any in-flight\n // ``reader.read()`` resolves immediately with ``{done: true}`` (or rejects\n // with ``AbortError``, which we trap in the consumer). Without this, an\n // idle SSE stream keeps the read pending indefinitely after abort.\n let cancelled = false\n const onAbort = (): void => {\n if (cancelled) return\n cancelled = true\n void reader.cancel().catch(() => {\n // Already cancelled or locked elsewhere; safe to ignore.\n })\n }\n let removeAbortHandler: (() => void) | undefined\n if (signal.aborted) {\n onAbort()\n } else {\n signal.addEventListener('abort', onAbort, { once: true })\n removeAbortHandler = () => signal.removeEventListener('abort', onAbort)\n }\n\n function* drain(text: string): Generator<SSEFrame> {\n buffer += text\n if (buffer.length > MAX_FRAME_BYTES) {\n throw new Error(`SSE frame buffer exceeded ${MAX_FRAME_BYTES} bytes without terminator`)\n }\n while (true) {\n const idx = findFrameTerminator(buffer)\n if (idx === null) break\n const block = buffer.slice(0, idx.terminatorStart)\n buffer = buffer.slice(idx.terminatorEnd)\n const frame = parseSSEBlock(block)\n if (frame) yield frame\n }\n }\n\n try {\n while (true) {\n const { done, value } = await reader.read()\n if (done) break\n yield* drain(decoder.decode(value, { stream: true }))\n }\n yield* drain(decoder.decode())\n if (buffer.trim().length > 0) {\n const frame = parseSSEBlock(buffer)\n if (frame) yield frame\n buffer = ''\n }\n } finally {\n removeAbortHandler?.()\n try {\n reader.releaseLock()\n } catch {\n // releaseLock can throw if the reader is already detached; ignore.\n }\n }\n}\n\nfunction findFrameTerminator(s: string): { terminatorStart: number; terminatorEnd: number } | null {\n const lf = s.indexOf('\\n\\n')\n const crlf = s.indexOf('\\r\\n\\r\\n')\n if (lf < 0 && crlf < 0) return null\n if (lf < 0) return { terminatorStart: crlf, terminatorEnd: crlf + 4 }\n if (crlf < 0) return { terminatorStart: lf, terminatorEnd: lf + 2 }\n return lf < crlf\n ? { terminatorStart: lf, terminatorEnd: lf + 2 }\n : { terminatorStart: crlf, terminatorEnd: crlf + 4 }\n}\n\nfunction parseSSEBlock(block: string): SSEFrame | null {\n let event = ''\n let id: string | undefined\n let retry: number | undefined\n const dataLines: string[] = []\n for (const line of block.split(/\\r?\\n/)) {\n if (line === '' || line.startsWith(':')) continue\n const colon = line.indexOf(':')\n const field = colon < 0 ? line : line.slice(0, colon)\n let value = colon < 0 ? '' : line.slice(colon + 1)\n if (value.startsWith(' ')) value = value.slice(1)\n if (field === 'event') {\n event = value\n } else if (field === 'data') {\n dataLines.push(value)\n } else if (field === 'id') {\n id = value\n } else if (field === 'retry') {\n const parsed = Number.parseInt(value, 10)\n if (Number.isFinite(parsed) && parsed >= 0) retry = parsed\n }\n // Unknown fields are ignored per the SSE spec.\n }\n // Surface metadata-only frames (id-only or retry-only) so the reconnect\n // loop can observe ``Last-Event-ID`` advances and server-sent retry hints\n // even on heartbeats / replay-position markers.\n if (!event && dataLines.length === 0 && id === undefined && retry === undefined) {\n return null\n }\n return {\n event,\n data: dataLines.length > 0 ? dataLines.join('\\n') : undefined,\n id,\n retry,\n }\n}\n\n/**\n * Validate and reattach the discriminator to a frame's JSON payload.\n *\n * The platform-api SSE serializer pops ``event_type`` out of the JSON body\n * (it lives in the SSE ``event:`` line). Reattach it so the resulting\n * value is a well-formed {@link WorkspaceSSEEvent} union member.\n *\n * Drift-tolerant: an unparseable payload, non-object payload, or unknown\n * ``event:`` discriminator is silently dropped (returns ``null``), matching\n * the behavior of the analogous turn-stream parser.\n */\nfunction parseWorkspaceFrame(eventName: string, dataJson: string): WorkspaceSSEEvent | null {\n let payload: unknown\n try {\n payload = JSON.parse(dataJson)\n } catch {\n return null\n }\n if (typeof payload !== 'object' || payload === null || Array.isArray(payload)) return null\n // The discriminator is whatever the server's `event:` line says. We trust\n // the platform-api union: anything outside the generated literal type is\n // dropped at the static-type boundary by the consumer's `switch`.\n return {\n ...(payload as Record<string, unknown>),\n event_type: eventName,\n } as WorkspaceSSEEvent\n}\n\n/**\n * Decode a server-sent ``error`` frame body into either a terminal or\n * recoverable outcome.\n *\n * The platform-api event stream emits these shapes:\n *\n * { code: \"too_many_streams\", message: \"...\", max_streams: 50 }\n * { code: \"stream_unavailable\", message: \"Event streaming unavailable\" }\n * { code: \"stream_error\", message: \"Stream error, please reconnect\" }\n *\n * Unknown codes default to recoverable so a server-side addition does not\n * strand SDK consumers without auto-retry.\n */\nfunction interpretServerErrorFrame(dataJson: string): {\n terminal: boolean\n code: WorkspaceEventStreamErrorCode\n message: string\n retryable: boolean\n frame: Record<string, unknown>\n} {\n let payload: unknown\n try {\n payload = JSON.parse(dataJson)\n } catch {\n return {\n terminal: false,\n code: 'stream_error',\n message: 'Server sent malformed error frame',\n retryable: true,\n frame: {},\n }\n }\n if (typeof payload !== 'object' || payload === null || Array.isArray(payload)) {\n return {\n terminal: false,\n code: 'stream_error',\n message: 'Server sent non-object error frame',\n retryable: true,\n frame: {},\n }\n }\n const obj = payload as Record<string, unknown>\n const rawCode = typeof obj['code'] === 'string' ? (obj['code'] as string) : ''\n const message =\n typeof obj['message'] === 'string' ? (obj['message'] as string) : 'Stream error'\n\n if (rawCode in TERMINAL_SERVER_ERROR_CODES) {\n return {\n terminal: true,\n code: TERMINAL_SERVER_ERROR_CODES[rawCode]!,\n message,\n retryable: false,\n frame: obj,\n }\n }\n if (rawCode in RECOVERABLE_SERVER_ERROR_CODES) {\n return {\n terminal: false,\n code: RECOVERABLE_SERVER_ERROR_CODES[rawCode]!,\n message,\n retryable: true,\n frame: obj,\n }\n }\n return {\n terminal: false,\n code: 'unknown',\n message: rawCode ? `${message} (code=${rawCode})` : message,\n retryable: true,\n frame: obj,\n }\n}\n\nfunction readStatus(error: unknown): number | undefined {\n if (typeof error !== 'object' || error === null) return undefined\n const status = (error as { statusCode?: unknown }).statusCode\n return typeof status === 'number' ? status : undefined\n}\n\nfunction safeStringify(value: unknown): string {\n try {\n return JSON.stringify(value)\n } catch {\n return String(value)\n }\n}\n\nfunction jitter(ms: number): number {\n // Full jitter: pick a random delay in [0, ms]. Avoids reconnect stampedes\n // when many clients reconnect simultaneously after a deploy.\n return Math.floor(Math.random() * Math.max(1, ms))\n}\n\nfunction clampDelay(ms: number, floor: number | undefined, ceiling: number): number {\n const lo = floor ?? DEFAULT_INITIAL_DELAY_MS\n if (!Number.isFinite(ms) || ms <= 0) return lo\n return Math.min(Math.max(ms, lo), ceiling)\n}\n\nasync function abortableSleep(ms: number, signal: AbortSignal): Promise<boolean> {\n if (signal.aborted) return false\n return new Promise<boolean>((resolve) => {\n const timer = setTimeout(() => {\n signal.removeEventListener('abort', onAbort)\n resolve(true)\n }, ms)\n const onAbort = (): void => {\n clearTimeout(timer)\n signal.removeEventListener('abort', onAbort)\n resolve(false)\n }\n signal.addEventListener('abort', onAbort, { once: true })\n })\n}\n", "import type { components } from '../generated/api.js'\nimport { WorkspaceScopedResource, extractData } from './base.js'\n\nexport class FunctionsResource extends WorkspaceScopedResource {\n async list() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/functions', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n\n async create(body: components['schemas']['FunctionCreateRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/functions', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n )\n }\n\n async delete(functionName: string): Promise<void> {\n await this.client.DELETE('/v1/{workspace_id}/functions/{function_name}', {\n params: { path: { workspace_id: this.workspaceId, function_name: functionName } },\n })\n }\n\n async test(functionName: string, body: components['schemas']['FunctionTestRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/functions/{function_name}/test', {\n params: { path: { workspace_id: this.workspaceId, function_name: functionName } },\n body,\n }),\n )\n }\n\n async getCatalog() {\n return extractData(\n await this.client.GET('/v1/{workspace_id}/functions/catalog', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n\n async query(body: components['schemas']['QueryRequest']) {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/functions/query', {\n params: { path: { workspace_id: this.workspaceId } },\n body,\n }),\n )\n }\n\n async sync() {\n return extractData(\n await this.client.POST('/v1/{workspace_id}/functions/sync', {\n params: { path: { workspace_id: this.workspaceId } },\n }),\n )\n }\n}\n", "/**\n * Reconnecting WebSocket primitive shared by the SDK's WS-based realtime\n * helpers (text-stream, session-connect, observer).\n *\n * The platform exposes three workspace-scoped WebSocket surfaces with similar\n * lifecycle requirements:\n *\n * * Resume on transient drops with exponential backoff + full jitter\n * * Treat 4001 (client error) and 4403 (auth) close codes as terminal\n * * Treat 4029 (rate limit / cap) as terminal-but-retryable on a slow timer\n * * Watchdog the connection: if no message arrives within an idle window,\n * the upstream is dead even if the TCP socket has not closed; force a\n * reconnect\n * * Surface every typed message through ``onMessage`` and every state\n * transition through ``onStateChange``\n *\n * Before this primitive existed, every consumer (developer-console\n * useStreamSession, useCallObserver, agent-engineering scripts) re-implemented\n * the loop with subtle bugs (different idle thresholds, missing retry budget,\n * no terminal-code handling). This module is the single canonical\n * implementation; resource helpers compose it with their own message parsers\n * and protocol details.\n *\n * @see ReconnectingWebSocket\n * @see EventsResource for the analogous SSE-based helper\n */\n\n/** Lifecycle states reported via {@link ReconnectingWebSocketOptions.onStateChange}. */\nexport type ReconnectingWebSocketState =\n | 'connecting'\n | 'open'\n | 'closing'\n | 'closed'\n | 'reconnecting'\n | 'terminal'\n\n/** Reasons surfaced to {@link ReconnectingWebSocketOptions.onError} on a terminal close. */\nexport type ReconnectingWebSocketErrorReason =\n | 'auth'\n | 'rate_limited'\n | 'client_error'\n | 'server_error'\n | 'reconnect_budget_exhausted'\n | 'aborted'\n | 'idle_watchdog'\n | 'open_failed'\n | 'unknown'\n\n/** Structured terminal error surfaced to consumers. */\nexport class ReconnectingWebSocketError extends Error {\n readonly reason: ReconnectingWebSocketErrorReason\n readonly closeCode: number | undefined\n readonly closeReason: string | undefined\n readonly attempts: number\n\n constructor(\n message: string,\n reason: ReconnectingWebSocketErrorReason,\n closeCode: number | undefined,\n closeReason: string | undefined,\n attempts: number,\n ) {\n super(message)\n this.name = 'ReconnectingWebSocketError'\n this.reason = reason\n this.closeCode = closeCode\n this.closeReason = closeReason\n this.attempts = attempts\n }\n}\n\n/**\n * Constructor for the underlying WebSocket. Defaults to the global\n * ``WebSocket`` (browsers, Bun, Deno, Node 22+ via global) if available.\n *\n * Pass an explicit factory in environments without a global (older Node) or\n * for tests that swap in a mock.\n */\nexport type WebSocketFactory = (url: string, protocols?: string | string[]) => WebSocket\n\n/** Options for {@link ReconnectingWebSocket}. */\nexport interface ReconnectingWebSocketOptions {\n /** Target ws:// or wss:// URL. */\n url: string\n\n /**\n * Optional WebSocket subprotocols. The platform's auth scheme passes the\n * bearer token here (``['auth', token]``) so it never appears in the URL.\n */\n protocols?: string | string[]\n\n /**\n * Initial backoff delay (ms). Doubles with full jitter on each successive\n * failure up to ``maxDelayMs``. Default ``1_000``.\n */\n initialDelayMs?: number\n\n /** Cap on the reconnect backoff delay (ms). Default ``30_000``. */\n maxDelayMs?: number\n\n /**\n * Maximum number of reconnect attempts before giving up. Default ``10``.\n * Set to ``Infinity`` to retry forever (rely on AbortSignal for shutdown).\n */\n maxReconnects?: number\n\n /**\n * Idle watchdog (ms). If no message arrives within this window the\n * connection is considered dead and is force-closed; the reconnect loop\n * then handles the rebuild. Default ``45_000`` (matches the longest\n * platform endpoint heartbeat). Set to ``0`` to disable.\n */\n idleTimeoutMs?: number\n\n /**\n * Cancellation signal. Aborting the signal closes the underlying socket\n * and stops the reconnect loop. The ``done`` promise resolves once the\n * teardown completes.\n */\n signal?: AbortSignal\n\n /**\n * Optional WebSocket factory. Defaults to ``globalThis.WebSocket`` if\n * available; throws at first connect attempt otherwise.\n */\n webSocketFactory?: WebSocketFactory\n\n /**\n * Invoked when the underlying socket transitions states. Mostly useful\n * for surfacing reconnects to the UI (e.g., \"Reconnecting\u2026\" banner).\n */\n onStateChange?: (state: ReconnectingWebSocketState) => void\n\n /**\n * Invoked once per inbound frame. ``MessageEvent.data`` is delivered raw\n * \u2014 consumers parse JSON / binary themselves.\n */\n onMessage: (event: MessageEvent) => void\n\n /**\n * Invoked just before each reconnect attempt with the 1-based attempt\n * number, the planned delay (ms), and the close code that triggered the\n * reconnect.\n */\n onReconnect?: (info: { attempt: number; delayMs: number; closeCode: number | undefined }) => void\n\n /**\n * Invoked exactly once per ``ReconnectingWebSocket`` instance on a\n * terminal failure (consumer-aborted, reconnect budget exhausted, or a\n * close code in the terminal set: 4001 / 4003 / 4403 / 4100 / 1008).\n */\n onError?: (error: ReconnectingWebSocketError) => void\n}\n\n/** Handle returned by {@link createReconnectingWebSocket}. */\nexport interface ReconnectingWebSocketHandle {\n /**\n * Resolves when the loop has fully stopped (post-abort cleanup complete).\n * Never rejects; consume errors via ``onError``.\n */\n done: Promise<void>\n\n /**\n * Send a frame on the currently open socket. Throws if no socket is\n * currently open. Use ``onStateChange`` to gate sends, or buffer in\n * caller code.\n */\n send(data: string | ArrayBufferLike | Blob | ArrayBufferView): void\n\n /**\n * Close the connection and stop reconnecting. Equivalent to aborting the\n * caller-supplied signal. Idempotent.\n */\n close(code?: number, reason?: string): void\n\n /** Latest known lifecycle state. */\n readonly state: ReconnectingWebSocketState\n}\n\n/**\n * Close codes that should NEVER be retried. The server is telling us the\n * connection cannot succeed regardless of how many times we try.\n *\n * 1008 (policy violation), 4001 (client error / bad params), 4003\n * (forbidden), 4100 (auth / not authenticated, used by some platform\n * endpoints), 4403 (forbidden \u2014 used by platform-api session-connect for\n * auth and origin rejection).\n */\nconst TERMINAL_CLOSE_CODES = new Set([1008, 4001, 4003, 4100, 4403])\n\n/**\n * Close codes that are terminal-but-rate-limited. The reconnect loop honors\n * a longer floor (``RATE_LIMITED_FLOOR_MS``) before retrying so the client\n * does not amplify the problem it just hit.\n *\n * 4029 (custom platform code for \"too many connections / burst exceeded\").\n * 1013 (try again later, RFC 6455 standard hint).\n */\nconst RATE_LIMITED_CLOSE_CODES = new Set([1013, 4029])\n\nconst RATE_LIMITED_FLOOR_MS = 5_000\n\nconst DEFAULT_INITIAL_DELAY_MS = 1_000\nconst DEFAULT_MAX_DELAY_MS = 30_000\nconst DEFAULT_MAX_RECONNECTS = 10\nconst DEFAULT_IDLE_TIMEOUT_MS = 45_000\n\n/**\n * Build a managed reconnecting WebSocket.\n *\n * The returned handle is the only public surface; the underlying\n * ``WebSocket`` is held privately so consumers cannot bypass the lifecycle\n * machinery (which would defeat the watchdog and reconnect loop).\n *\n * @example\n * ```ts\n * const handle = createReconnectingWebSocket({\n * url: client.conversations.sessionConnectUrl({ serviceId, entityId }),\n * protocols: sessionConnectAuthProtocols(apiKey),\n * onMessage: (e) => console.log('frame', e.data),\n * onStateChange: (s) => console.log('state', s),\n * onError: (err) => console.error('terminal:', err.reason, err.closeCode),\n * });\n *\n * handle.send(JSON.stringify({ type: 'user_text', text: 'hi' }));\n * await handle.done; // resolves after handle.close() or terminal error\n * ```\n */\nexport function createReconnectingWebSocket(\n options: ReconnectingWebSocketOptions,\n): ReconnectingWebSocketHandle {\n const factory = resolveWebSocketFactory(options.webSocketFactory)\n const initialDelayMs = options.initialDelayMs ?? DEFAULT_INITIAL_DELAY_MS\n const maxDelayMs = options.maxDelayMs ?? DEFAULT_MAX_DELAY_MS\n const maxReconnects = options.maxReconnects ?? DEFAULT_MAX_RECONNECTS\n const idleTimeoutMs = options.idleTimeoutMs ?? DEFAULT_IDLE_TIMEOUT_MS\n\n const localController = new AbortController()\n if (options.signal) {\n if (options.signal.aborted) {\n localController.abort(options.signal.reason)\n } else {\n const onAbort = (): void => localController.abort(options.signal?.reason)\n options.signal.addEventListener('abort', onAbort, { once: true })\n }\n }\n\n let currentSocket: WebSocket | null = null\n let state: ReconnectingWebSocketState = 'connecting'\n let errorReported = false\n\n function setState(next: ReconnectingWebSocketState): void {\n if (state === next) return\n state = next\n try {\n options.onStateChange?.(next)\n } catch {\n // Consumer-thrown error in onStateChange must not kill the loop.\n }\n }\n\n function reportError(err: ReconnectingWebSocketError): void {\n if (errorReported) return\n errorReported = true\n setState('terminal')\n try {\n options.onError?.(err)\n } catch {\n // Consumer-thrown error must not leak.\n }\n }\n\n const handle: ReconnectingWebSocketHandle = {\n get state() {\n return state\n },\n get done() {\n return done\n },\n send(data) {\n if (!currentSocket || currentSocket.readyState !== 1 /* OPEN */) {\n throw new Error(`Cannot send on socket in state ${state}`)\n }\n currentSocket.send(data)\n },\n close(code, reason) {\n localController.abort(new Error(reason ?? 'closed'))\n try {\n currentSocket?.close(code, reason)\n } catch {\n // Already closed; ignore.\n }\n },\n }\n\n const done = runLoop({\n factory,\n options,\n initialDelayMs,\n maxDelayMs,\n maxReconnects,\n idleTimeoutMs,\n signal: localController.signal,\n setState,\n reportError,\n setSocket: (s) => {\n currentSocket = s\n },\n })\n\n return handle\n}\n\ninterface RunLoopArgs {\n factory: WebSocketFactory\n options: ReconnectingWebSocketOptions\n initialDelayMs: number\n maxDelayMs: number\n maxReconnects: number\n idleTimeoutMs: number\n signal: AbortSignal\n setState: (s: ReconnectingWebSocketState) => void\n reportError: (e: ReconnectingWebSocketError) => void\n setSocket: (s: WebSocket | null) => void\n}\n\ninterface ConnectionOutcome {\n closeCode: number | undefined\n closeReason: string | undefined\n /** Set when the watchdog forced a close. */\n watchdogTriggered: boolean\n /** Set when the consumer explicitly aborted. */\n aborted: boolean\n}\n\nasync function runLoop(args: RunLoopArgs): Promise<void> {\n const { options, signal, setState, reportError, setSocket } = args\n let attempt = 0\n let delayMs = args.initialDelayMs\n\n while (!signal.aborted) {\n if (attempt > 0) {\n setState('reconnecting')\n const sleepMs = jitter(delayMs)\n try {\n options.onReconnect?.({ attempt, delayMs: sleepMs, closeCode: undefined })\n } catch {\n // ignore\n }\n const slept = await abortableSleep(sleepMs, signal)\n if (!slept) break\n delayMs = Math.min(delayMs * 2, args.maxDelayMs)\n }\n\n setState(attempt === 0 ? 'connecting' : 'connecting')\n\n let outcome: ConnectionOutcome\n try {\n outcome = await runOneConnection(args)\n } catch (err) {\n // Synchronous open failure (e.g., factory threw, invalid URL).\n reportError(\n new ReconnectingWebSocketError(\n err instanceof Error ? err.message : 'Failed to open WebSocket',\n 'open_failed',\n undefined,\n undefined,\n attempt,\n ),\n )\n return\n } finally {\n setSocket(null)\n }\n\n // Terminal close codes are reported BEFORE the abort check because the\n // close arrived from the wire \u2014 the consumer's subsequent ``close()``\n // call (which flips signal.aborted true) must not suppress the diagnostic.\n if (outcome.closeCode !== undefined && TERMINAL_CLOSE_CODES.has(outcome.closeCode)) {\n reportError(\n new ReconnectingWebSocketError(\n `Server closed with terminal code ${outcome.closeCode}: ${outcome.closeReason ?? ''}`,\n outcome.closeCode === 4403 ? 'auth' : 'client_error',\n outcome.closeCode,\n outcome.closeReason,\n attempt,\n ),\n )\n return\n }\n\n if (outcome.aborted || signal.aborted) {\n setState('closed')\n return\n }\n\n if (attempt >= args.maxReconnects) {\n reportError(\n new ReconnectingWebSocketError(\n `Reconnect budget exhausted (${args.maxReconnects} attempts)`,\n 'reconnect_budget_exhausted',\n outcome.closeCode,\n outcome.closeReason,\n attempt,\n ),\n )\n return\n }\n\n if (outcome.closeCode !== undefined && RATE_LIMITED_CLOSE_CODES.has(outcome.closeCode)) {\n // Pin the floor up so we do not hammer the server we just got\n // throttled by. Honor whichever is larger between the current\n // exponential delay and the rate-limited floor.\n delayMs = Math.max(delayMs, RATE_LIMITED_FLOOR_MS)\n }\n\n attempt += 1\n }\n\n setState('closed')\n}\n\nasync function runOneConnection(args: RunLoopArgs): Promise<ConnectionOutcome> {\n const { options, factory, signal, setState, setSocket, idleTimeoutMs } = args\n\n let socket: WebSocket\n try {\n socket = factory(options.url, options.protocols)\n } catch (err) {\n throw err instanceof Error ? err : new Error(String(err))\n }\n setSocket(socket)\n\n return new Promise<ConnectionOutcome>((resolve) => {\n let watchdogTimer: ReturnType<typeof setTimeout> | null = null\n let resolved = false\n\n function clearWatchdog(): void {\n if (watchdogTimer !== null) {\n clearTimeout(watchdogTimer)\n watchdogTimer = null\n }\n }\n\n function armWatchdog(): void {\n if (idleTimeoutMs <= 0) return\n clearWatchdog()\n watchdogTimer = setTimeout(() => {\n if (resolved) return\n try {\n socket.close(4001, 'idle timeout')\n } catch {\n // already closed\n }\n finalize({\n closeCode: 4001,\n closeReason: 'idle timeout',\n watchdogTriggered: true,\n aborted: false,\n })\n }, idleTimeoutMs)\n }\n\n function finalize(outcome: ConnectionOutcome): void {\n if (resolved) return\n resolved = true\n clearWatchdog()\n signal.removeEventListener('abort', onAbort)\n try {\n socket.removeEventListener('open', onOpen)\n socket.removeEventListener('message', onMessage)\n socket.removeEventListener('close', onClose as unknown as Parameters<WebSocket['removeEventListener']>[1])\n socket.removeEventListener('error', onSocketError)\n } catch {\n // best effort\n }\n resolve(outcome)\n }\n\n function onOpen(): void {\n setState('open')\n armWatchdog()\n }\n\n function onMessage(ev: MessageEvent): void {\n armWatchdog()\n try {\n options.onMessage(ev)\n } catch {\n // Consumer-thrown error in onMessage must not kill the loop;\n // the connection is still healthy.\n }\n }\n\n // CloseEvent is not in lib: ESNext + @types/node \u2014 accept a structural\n // shape with just the fields we read so this works in browser, Bun,\n // Deno, Node ws library, and the WHATWG ws polyfill alike.\n function onClose(ev: { code?: number; reason?: string }): void {\n setState('closed')\n finalize({\n closeCode: ev.code,\n closeReason: ev.reason,\n watchdogTriggered: false,\n aborted: false,\n })\n }\n\n function onSocketError(): void {\n // The browser/Node WebSocket fires 'error' before 'close' on transport\n // failures. We don't terminate here \u2014 the close handler will run with\n // a meaningful close code and we want one resolution path.\n }\n\n function onAbort(): void {\n try {\n socket.close(1000, 'client aborted')\n } catch {\n // already closed\n }\n finalize({\n closeCode: undefined,\n closeReason: undefined,\n watchdogTriggered: false,\n aborted: true,\n })\n }\n\n if (signal.aborted) {\n onAbort()\n return\n }\n\n socket.addEventListener('open', onOpen)\n socket.addEventListener('message', onMessage)\n // ``addEventListener`` accepts a ``CloseEvent``-shaped handler; we cast\n // through ``unknown`` because lib: ESNext + @types/node doesn't expose\n // a global ``CloseEvent`` / ``EventListener`` in every supported runtime.\n socket.addEventListener(\n 'close',\n onClose as unknown as Parameters<WebSocket['addEventListener']>[1],\n )\n socket.addEventListener('error', onSocketError)\n signal.addEventListener('abort', onAbort, { once: true })\n })\n}\n\nfunction resolveWebSocketFactory(\n factory: WebSocketFactory | undefined,\n): WebSocketFactory {\n if (factory) return factory\n const globalWs = (globalThis as { WebSocket?: typeof WebSocket }).WebSocket\n if (!globalWs) {\n return () => {\n throw new Error(\n 'No global WebSocket available; pass webSocketFactory to createReconnectingWebSocket',\n )\n }\n }\n return (url, protocols) => new globalWs(url, protocols)\n}\n\nfunction jitter(ms: number): number {\n return Math.floor(Math.random() * Math.max(1, ms))\n}\n\nasync function abortableSleep(ms: number, signal: AbortSignal): Promise<boolean> {\n if (signal.aborted) return false\n return new Promise<boolean>((resolve) => {\n const timer = setTimeout(() => {\n signal.removeEventListener('abort', onAbort)\n resolve(true)\n }, ms)\n const onAbort = (): void => {\n clearTimeout(timer)\n signal.removeEventListener('abort', onAbort)\n resolve(false)\n }\n signal.addEventListener('abort', onAbort, { once: true })\n })\n}\n", "/**\n * Voice-call observer real-time stream.\n *\n * The voice agent (\"agent-engine\") exposes a per-call WebSocket that emits\n * the live timeline of a call: transcripts (user + agent), emotion / empathy\n * frames, latency markers, tool invocations, navigation timing, and lifecycle\n * events (start / end / participant join / leave).\n *\n * This resource is the canonical SDK consumer for that stream. Before it\n * existed, every developer-console-style app re-implemented the loop by hand\n * \u2014 different idle thresholds, missing close-code handling for the long list\n * of voice-specific 4xxx codes (4001 unauthorized, 4003 forbidden, 4029 rate\n * limit, 4100 token expired), and inconsistent reconnect backoff.\n *\n * The implementation composes {@link createReconnectingWebSocket} with a\n * lightweight ``ObserverSSEEvent`` parser. Frames that don't deserialize or\n * lack a recognized ``type`` discriminator are dropped \u2014 the stream remains\n * forward-compatible with new event types added on the server before the SDK\n * spec snapshot picks them up.\n *\n * @see ConversationsResource.subscribeTextStream for the analogous text-stream\n * helper.\n */\n\nimport { ConfigurationError } from '../core/errors.js'\nimport {\n createReconnectingWebSocket,\n type ReconnectingWebSocketError,\n type ReconnectingWebSocketHandle,\n type ReconnectingWebSocketState,\n type WebSocketFactory,\n} from '../core/reconnecting-websocket.js'\nimport { type PlatformFetch } from '../core/openapi-client.js'\nimport type { components } from '../generated/api.js'\nimport { WorkspaceScopedResource } from './base.js'\n\n/**\n * Discriminated union of every observer stream event variant. Members carry\n * their own ``type`` literal \u2014 narrow with ``switch (event.type)``.\n */\nexport type ObserverSSEEvent = components['schemas']['ObserverSSEEvent']\n\n/** Discriminator literal for {@link ObserverSSEEvent} members. */\nexport type ObserverSSEEventType = ObserverSSEEvent['type']\n\n/** Auth subprotocol pair for the observer WebSocket. */\nexport type ObserverAuthProtocols = readonly ['auth', string]\n\n/** Token grammar accepted in WebSocket subprotocols (RFC 6455). */\nconst WEB_SOCKET_PROTOCOL_TOKEN_RE = /^[!#$%&'*+\\-.^_`|~A-Za-z0-9]+$/\nconst MAX_AUTH_TOKEN_CHARS = 4096\n\n/** Options for {@link ObserversResource.subscribe}. */\nexport interface ObserverSubscribeOptions {\n /**\n * The Twilio Call SID (``CA\u2026``) identifying the call to observe. The\n * server returns 4004 if the call is unknown \u2014 most often a race in test\n * suites where the call hasn't been registered yet.\n */\n callSid: string\n\n /**\n * Bearer token for ``Sec-WebSocket-Protocol: auth, <token>``. If the\n * token contains characters that aren't valid in a WebSocket subprotocol\n * the helper throws ``ConfigurationError`` synchronously \u2014 the wire\n * protocol cannot carry it and a runtime failure mid-call would be much\n * harder to diagnose.\n */\n token: string\n\n /**\n * Full observer URL override. Defaults to\n * ``${agentBaseUrl}/v1/{workspace_id}/observers/{call_sid}/ws`` with\n * ``http`` mapped to ``ws`` and ``https`` mapped to ``wss``. The override\n * must be an absolute ws/wss URL with no query string or fragment \u2014 SDK-\n * managed query params are appended by the helper.\n */\n observerUrl?: string\n\n /** Cancellation signal \u2014 aborting closes the connection. */\n signal?: AbortSignal\n\n /** Fired once per typed event delivered by the server. */\n onEvent: (event: ObserverSSEEvent) => void\n\n /** Fired on each lifecycle transition. */\n onStateChange?: (state: ReconnectingWebSocketState) => void\n\n /**\n * Fired just before each reconnect attempt with the planned delay and\n * the close code that triggered the reconnect (or ``undefined`` for the\n * first attempt after a watchdog-driven close).\n */\n onReconnect?: (info: { attempt: number; delayMs: number; closeCode: number | undefined }) => void\n\n /**\n * Fired exactly once on terminal failure (auth rejected, reconnect\n * budget exhausted, abort, or one of the terminal close codes 4001 /\n * 4003 / 4100 / 4403). Will not fire on ordinary disconnect-and-reconnect.\n */\n onError?: (error: ReconnectingWebSocketError) => void\n\n /** Idle watchdog (ms). Defaults to 60s for voice-call streams. */\n idleTimeoutMs?: number\n\n /** Initial reconnect backoff (ms). Defaults to 1000. */\n initialDelayMs?: number\n\n /** Cap on reconnect backoff (ms). Defaults to 30_000. */\n maxDelayMs?: number\n\n /** Reconnect budget. Defaults to 10. */\n maxReconnects?: number\n\n /** Custom WebSocket factory \u2014 primarily for tests. */\n webSocketFactory?: WebSocketFactory\n}\n\n/**\n * Build browser WebSocket subprotocols for the observer stream.\n *\n * Identical wire format to the text-stream subprotocol pair \u2014\n * ``Sec-WebSocket-Protocol: auth, <token>`` \u2014 but exposed as its own\n * function so consumers do not have to reason about cross-resource sharing\n * and so the SDK can evolve the auth scheme independently per stream.\n *\n * @security The returned tuple contains the raw bearer token. Do not log,\n * persist, serialize, or otherwise expose this value.\n */\nexport function observerAuthProtocols(token: string): ObserverAuthProtocols {\n if (!token) {\n throw new ConfigurationError('observerAuthProtocols requires a non-empty token')\n }\n if (token.length > MAX_AUTH_TOKEN_CHARS) {\n throw new ConfigurationError(\n `observer token exceeds the ${MAX_AUTH_TOKEN_CHARS}-character WebSocket subprotocol limit`,\n )\n }\n if (!WEB_SOCKET_PROTOCOL_TOKEN_RE.test(token)) {\n throw new ConfigurationError(\n 'observer token contains characters browsers reject in WebSocket subprotocols',\n )\n }\n return ['auth', token] as const\n}\n\n/**\n * Voice-call observer resource.\n *\n * @example\n * ```ts\n * const handle = client.observers.subscribe({\n * callSid: 'CAxxx',\n * token: bearerToken,\n * onEvent: (event) => {\n * switch (event.type) {\n * case 'agent_transcript_delta':\n * renderAgentDelta(event.text)\n * break\n * case 'user_transcript':\n * renderUserTurn(event.text)\n * break\n * case 'session_end':\n * showSummary(event)\n * break\n * }\n * },\n * onError: (err) => console.error('observer terminal:', err.reason),\n * })\n *\n * // Later, to stop:\n * handle.close()\n * await handle.done\n * ```\n */\nexport class ObserversResource extends WorkspaceScopedResource {\n private readonly agentBaseUrl: string | undefined\n\n constructor(client: PlatformFetch, workspaceId: string, agentBaseUrl?: string) {\n super(client, workspaceId)\n this.agentBaseUrl = agentBaseUrl\n }\n\n /**\n * Subscribe to the live observer stream for a call.\n *\n * Returns a {@link ReconnectingWebSocketHandle} that resolves\n * ``handle.done`` when the stream terminates (consumer-aborted, terminal\n * close code, or reconnect budget exhausted). Errors are surfaced through\n * ``onError``; the promise never rejects.\n */\n subscribe(options: ObserverSubscribeOptions): ReconnectingWebSocketHandle {\n const url = buildObserverUrl({\n baseUrl: this.agentBaseUrl ?? this.platformBaseUrl,\n workspaceId: this.workspaceId,\n callSid: options.callSid,\n observerUrl: options.observerUrl,\n })\n\n const protocols = observerAuthProtocols(options.token)\n\n return createReconnectingWebSocket({\n url,\n protocols: [...protocols],\n onMessage: (ev) => {\n const parsed = parseObserverFrame(ev.data)\n if (parsed) {\n try {\n options.onEvent(parsed)\n } catch {\n // Consumer threw in onEvent \u2014 do not let it kill the loop.\n }\n }\n },\n onStateChange: options.onStateChange,\n onReconnect: options.onReconnect,\n onError: options.onError,\n signal: options.signal,\n idleTimeoutMs: options.idleTimeoutMs ?? 60_000,\n initialDelayMs: options.initialDelayMs ?? 1_000,\n maxDelayMs: options.maxDelayMs ?? 30_000,\n maxReconnects: options.maxReconnects ?? 10,\n webSocketFactory: options.webSocketFactory,\n })\n }\n}\n\n// ---------------------------------------------------------------------------\n// URL builder\n// ---------------------------------------------------------------------------\n\ninterface BuildObserverUrlArgs {\n baseUrl: string\n workspaceId: string\n callSid: string\n observerUrl?: string | undefined\n}\n\nconst CALL_SID_RE = /^CA[a-zA-Z0-9]{32}$/\n\nfunction buildObserverUrl(args: BuildObserverUrlArgs): string {\n if (!args.workspaceId) {\n throw new ConfigurationError('workspaceId is required to build the observer URL')\n }\n if (!args.callSid) {\n throw new ConfigurationError('callSid is required to subscribe to the observer stream')\n }\n if (args.observerUrl) {\n // Override path \u2014 the consumer has already constructed the full URL\n // (e.g. via a custom voice-agent gateway helper). Skip the Twilio CA\n // SID grammar check; the override owns the URL shape.\n return parseOverride(args.observerUrl).toString()\n }\n // Default path \u2014 derive ``/v1/{ws}/observers/{callSid}/ws`` and validate\n // the CA SID grammar so a typo fails at the function boundary instead of\n // mid-reconnect-loop with an opaque 4001.\n if (!CALL_SID_RE.test(args.callSid)) {\n throw new ConfigurationError(\n `callSid does not match Twilio CA SID format (CA + 32 hex chars): ${args.callSid}`,\n )\n }\n return deriveFromBase(args.baseUrl, args.workspaceId, args.callSid).toString()\n}\n\nfunction parseOverride(observerUrl: string): URL {\n let url: URL\n try {\n url = new URL(observerUrl)\n } catch (cause) {\n throw new ConfigurationError(\n `observerUrl must be an absolute URL: ${String(cause)}`,\n )\n }\n if (url.protocol !== 'ws:' && url.protocol !== 'wss:') {\n throw new ConfigurationError('observerUrl overrides must use ws: or wss: URLs')\n }\n if (url.search || url.hash) {\n throw new ConfigurationError(\n 'observerUrl overrides must not include query parameters or fragments',\n )\n }\n return url\n}\n\nfunction deriveFromBase(baseUrl: string, workspaceId: string, callSid: string): URL {\n let parsed: URL\n try {\n parsed = new URL(baseUrl)\n } catch (cause) {\n throw new ConfigurationError(\n `observerUrl cannot be derived from baseUrl: ${String(cause)}`,\n )\n }\n // Map http(s) to ws(s) \u2014 the agent-engine ALB serves both on the same host.\n let scheme: string\n if (parsed.protocol === 'https:' || parsed.protocol === 'wss:') scheme = 'wss:'\n else if (parsed.protocol === 'http:' || parsed.protocol === 'ws:') scheme = 'ws:'\n else {\n throw new ConfigurationError(\n `observerUrl can only be derived from an http, https, ws, or wss baseUrl: ${baseUrl}`,\n )\n }\n // The pathname must be '/' \u2014 observer paths are owned by this helper,\n // not the consumer's baseUrl gateway.\n if (parsed.pathname !== '/' && parsed.pathname !== '') {\n throw new ConfigurationError(\n 'observerUrl can only be derived from an origin-only baseUrl; pass observerUrl explicitly when using path-prefixed gateways',\n )\n }\n const out = new URL(`${scheme}//${parsed.host}/v1/${encodeURIComponent(workspaceId)}/observers/${encodeURIComponent(callSid)}/ws`)\n return out\n}\n\n// ---------------------------------------------------------------------------\n// Frame parser\n// ---------------------------------------------------------------------------\n\n/**\n * Parse a raw WebSocket frame into a typed {@link ObserverSSEEvent}.\n *\n * Drift-tolerant: returns ``null`` on JSON decode errors, non-object\n * payloads, missing ``type`` discriminator, or unknown discriminator\n * values. The static type of ``ObserverSSEEvent`` is the contract \u2014 the\n * server may add new event types ahead of an SDK release and the consumer's\n * exhaustive ``switch`` will simply not match them, leaving the unknown\n * frame on the floor.\n */\nfunction parseObserverFrame(data: unknown): ObserverSSEEvent | null {\n let text: string\n if (typeof data === 'string') {\n text = data\n } else if (data instanceof ArrayBuffer) {\n text = new TextDecoder().decode(data)\n } else if (ArrayBuffer.isView(data)) {\n // ``data`` is some TypedArray; @types/node TextDecoder.decode wants\n // ``BufferSource``. Pass through as ``Uint8Array`` over the underlying\n // buffer so every TypedArray variant decodes consistently.\n const view = data as ArrayBufferView\n text = new TextDecoder().decode(\n new Uint8Array(view.buffer, view.byteOffset, view.byteLength),\n )\n } else {\n return null\n }\n\n let payload: unknown\n try {\n payload = JSON.parse(text)\n } catch {\n return null\n }\n if (typeof payload !== 'object' || payload === null || Array.isArray(payload)) return null\n const obj = payload as Record<string, unknown>\n if (typeof obj['type'] !== 'string') return null\n return obj as ObserverSSEEvent\n}\n", "/**\n * Branded types provide compile-time type safety for string IDs.\n * At runtime they are plain strings, but the type system prevents mixing them.\n */\ndeclare const brand: unique symbol\n\ntype Brand<T, B> = T & { readonly [brand]: B }\n\n// --- ID types ---\nexport type WorkspaceId = Brand<string, 'WorkspaceId'>\nexport type ApiKeyId = Brand<string, 'ApiKeyId'>\nexport type AgentId = Brand<string, 'AgentId'>\nexport type PersonaId = Brand<string, 'PersonaId'>\nexport type SkillId = Brand<string, 'SkillId'>\n/** @deprecated Use ActionId instead */\nexport type ActionId = Brand<string, 'ActionId'>\nexport type ServiceId = Brand<string, 'ServiceId'>\nexport type ContextGraphId = Brand<string, 'ContextGraphId'>\nexport type CallId = Brand<string, 'CallId'>\nexport type PhoneNumberId = Brand<string, 'PhoneNumberId'>\nexport type IntegrationId = Brand<string, 'IntegrationId'>\nexport type EntityId = Brand<string, 'EntityId'>\nexport type EventId = Brand<string, 'EventId'>\nexport type SurfaceId = Brand<string, 'SurfaceId'>\nexport type OperatorId = Brand<string, 'OperatorId'>\nexport type TriggerId = Brand<string, 'TriggerId'>\nexport type SimulationRunId = Brand<string, 'SimulationRunId'>\nexport type SimulationSessionId = Brand<string, 'SimulationSessionId'>\nexport type ScribeSessionId = Brand<string, 'ScribeSessionId'>\nexport type FunctionId = Brand<string, 'FunctionId'>\nexport type DataSourceId = Brand<string, 'DataSourceId'>\n\n// --- Constructors ---\nexport const workspaceId = (id: string): WorkspaceId => id as WorkspaceId\nexport const apiKeyId = (id: string): ApiKeyId => id as ApiKeyId\nexport const agentId = (id: string): AgentId => id as AgentId\nexport const personaId = (id: string): PersonaId => id as PersonaId\nexport const skillId = (id: string): SkillId => id as SkillId\nexport const actionId = (id: string): ActionId => id as ActionId\nexport const serviceId = (id: string): ServiceId => id as ServiceId\nexport const contextGraphId = (id: string): ContextGraphId => id as ContextGraphId\nexport const callId = (id: string): CallId => id as CallId\nexport const phoneNumberId = (id: string): PhoneNumberId => id as PhoneNumberId\nexport const integrationId = (id: string): IntegrationId => id as IntegrationId\nexport const entityId = (id: string): EntityId => id as EntityId\nexport const eventId = (id: string): EventId => id as EventId\nexport const surfaceId = (id: string): SurfaceId => id as SurfaceId\nexport const operatorId = (id: string): OperatorId => id as OperatorId\nexport const triggerId = (id: string): TriggerId => id as TriggerId\nexport const simulationRunId = (id: string): SimulationRunId => id as SimulationRunId\nexport const simulationSessionId = (id: string): SimulationSessionId => id as SimulationSessionId\nexport const scribeSessionId = (id: string): ScribeSessionId => id as ScribeSessionId\nexport const functionId = (id: string): FunctionId => id as FunctionId\nexport const dataSourceId = (id: string): DataSourceId => id as DataSourceId\n", "const textEncoder = new TextEncoder()\nconst MAX_TIMESTAMP_SKEW_MS = 5 * 60 * 1000\ntype WebCryptoLike = { subtle: NonNullable<typeof globalThis.crypto>['subtle'] }\n\nlet webCryptoPromise: Promise<WebCryptoLike> | undefined\n\nexport interface WebhookEvent<T = unknown> {\n id: string\n type: string\n timestamp: string\n data: T\n}\n\nexport interface WebhookVerificationOptions {\n payload: string | Uint8Array | ArrayBuffer\n signature: string\n secret: string\n timestamp?: string\n maxAgeMs?: number\n}\n\nexport interface ParseWebhookEventOptions<T = unknown> extends WebhookVerificationOptions {\n payload: string | Uint8Array | ArrayBuffer\n expectedType?: string\n reviver?: Parameters<typeof JSON.parse>[1]\n validate?: (event: WebhookEvent<T>) => void\n}\n\nexport class WebhookVerificationError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'WebhookVerificationError'\n Object.setPrototypeOf(this, new.target.prototype)\n }\n}\n\nexport async function verifyWebhookSignature(\n payload: string | Uint8Array | ArrayBuffer,\n signature: string,\n secret: string,\n): Promise<boolean>\nexport async function verifyWebhookSignature(options: WebhookVerificationOptions): Promise<boolean>\nexport async function verifyWebhookSignature(\n payloadOrOptions: string | Uint8Array | ArrayBuffer | WebhookVerificationOptions,\n signature?: string,\n secret?: string,\n): Promise<boolean> {\n const options = normalizeVerificationOptions(payloadOrOptions, signature, secret)\n const payloadBytes = toUint8Array(options.payload)\n const expectedSignature = await signWebhookPayload(\n payloadBytes,\n options.secret,\n options.timestamp,\n )\n const actualSignature = normalizeSignature(options.signature)\n\n if (!actualSignature || !constantTimeEqual(expectedSignature, actualSignature)) {\n return false\n }\n\n if (options.timestamp) {\n const timestampMs = parseTimestamp(options.timestamp)\n if (timestampMs === undefined) return false\n\n const maxAgeMs = options.maxAgeMs ?? MAX_TIMESTAMP_SKEW_MS\n const now = Date.now()\n if (timestampMs > now + maxAgeMs || now - timestampMs > maxAgeMs) {\n return false\n }\n }\n\n return true\n}\n\nexport async function parseWebhookEvent<T = unknown>(\n payload: string,\n signature: string,\n secret: string,\n): Promise<WebhookEvent<T>>\nexport async function parseWebhookEvent<T = unknown>(\n options: ParseWebhookEventOptions<T>,\n): Promise<WebhookEvent<T>>\nexport async function parseWebhookEvent<T = unknown>(\n payloadOrOptions: string | ParseWebhookEventOptions<T>,\n signature?: string,\n secret?: string,\n): Promise<WebhookEvent<T>> {\n const options = normalizeParseOptions(payloadOrOptions, signature, secret)\n const valid = await verifyWebhookSignature(options)\n\n if (!valid) {\n throw new WebhookVerificationError('Invalid or expired webhook signature')\n }\n\n const payloadText = decodePayload(options.payload)\n\n let event: WebhookEvent<T>\n try {\n event = JSON.parse(payloadText, options.reviver) as WebhookEvent<T>\n } catch {\n throw new WebhookVerificationError('Invalid JSON webhook payload')\n }\n\n if (options.expectedType && event.type !== options.expectedType) {\n throw new WebhookVerificationError(\n `Unexpected webhook event type: expected ${options.expectedType}, received ${event.type}`,\n )\n }\n\n options.validate?.(event)\n return event\n}\n\nfunction normalizeVerificationOptions(\n payloadOrOptions: string | Uint8Array | ArrayBuffer | WebhookVerificationOptions,\n signature?: string,\n secret?: string,\n): WebhookVerificationOptions {\n if (\n typeof payloadOrOptions === 'object' &&\n payloadOrOptions !== null &&\n 'payload' in payloadOrOptions\n ) {\n return payloadOrOptions\n }\n\n if (!signature || !secret) {\n throw new TypeError('signature and secret are required')\n }\n\n return {\n payload: payloadOrOptions,\n signature,\n secret,\n }\n}\n\nfunction normalizeParseOptions<T>(\n payloadOrOptions: string | ParseWebhookEventOptions<T>,\n signature?: string,\n secret?: string,\n): ParseWebhookEventOptions<T> {\n if (\n typeof payloadOrOptions === 'object' &&\n payloadOrOptions !== null &&\n 'payload' in payloadOrOptions\n ) {\n return payloadOrOptions\n }\n\n if (!signature || !secret) {\n throw new TypeError('signature and secret are required')\n }\n\n return {\n payload: payloadOrOptions,\n signature,\n secret,\n }\n}\n\nfunction decodePayload(payload: string | Uint8Array | ArrayBuffer): string {\n if (typeof payload === 'string') return payload\n return new TextDecoder().decode(toUint8Array(payload))\n}\n\nfunction toUint8Array(payload: string | Uint8Array | ArrayBuffer): Uint8Array {\n if (typeof payload === 'string') return textEncoder.encode(payload)\n if (payload instanceof Uint8Array) return payload\n return new Uint8Array(payload)\n}\n\nasync function signWebhookPayload(\n payload: Uint8Array,\n secret: string,\n timestamp?: string,\n): Promise<Uint8Array> {\n const crypto = await resolveWebCrypto()\n const key = await crypto.subtle.importKey(\n 'raw',\n textEncoder.encode(secret),\n { name: 'HMAC', hash: 'SHA-256' },\n false,\n ['sign'],\n )\n\n const message = timestamp\n ? concatUint8Arrays(textEncoder.encode(`v1:${timestamp}:`), payload)\n : payload\n\n const mac = await crypto.subtle.sign('HMAC', key, toCryptoBuffer(message))\n return new Uint8Array(mac)\n}\n\nasync function resolveWebCrypto(): Promise<WebCryptoLike> {\n if (globalThis.crypto?.subtle) {\n return globalThis.crypto\n }\n\n webCryptoPromise ??= import('node:crypto').then(({ webcrypto }) => webcrypto as WebCryptoLike)\n return await webCryptoPromise\n}\n\nfunction normalizeSignature(signature: string): Uint8Array | undefined {\n const normalized = signature.startsWith('sha256=') ? signature.slice(7) : signature\n if (!/^[a-fA-F0-9]+$/.test(normalized) || normalized.length % 2 !== 0) {\n return undefined\n }\n\n const bytes = new Uint8Array(normalized.length / 2)\n for (let index = 0; index < normalized.length; index += 2) {\n bytes[index / 2] = Number.parseInt(normalized.slice(index, index + 2), 16)\n }\n return bytes\n}\n\nfunction constantTimeEqual(expected: Uint8Array, actual: Uint8Array): boolean {\n const maxLength = Math.max(expected.length, actual.length)\n let diff = expected.length ^ actual.length\n\n for (let index = 0; index < maxLength; index += 1) {\n diff |= (expected[index] ?? 0) ^ (actual[index] ?? 0)\n }\n\n return diff === 0\n}\n\nfunction parseTimestamp(timestamp: string): number | undefined {\n const numeric = Number(timestamp)\n if (Number.isFinite(numeric)) {\n return numeric < 1_000_000_000_000 ? numeric * 1000 : numeric\n }\n\n const parsed = Date.parse(timestamp)\n return Number.isNaN(parsed) ? undefined : parsed\n}\n\nfunction concatUint8Arrays(left: Uint8Array, right: Uint8Array): Uint8Array {\n const combined = new Uint8Array(left.length + right.length)\n combined.set(left, 0)\n combined.set(right, left.length)\n return combined\n}\n\nfunction toCryptoBuffer(bytes: Uint8Array): ArrayBuffer {\n const copy = Uint8Array.from(bytes)\n return copy.buffer\n}\n", "/**\n * RFC 8628 Device Authorization Grant for desktop and CLI apps.\n *\n * Authenticates users via the identity service's device code flow:\n * the app displays a code, the user approves in their browser,\n * and the app receives a workspace-scoped JWT.\n */\n\nimport { AmigoError, AuthenticationError, NetworkError, RateLimitError } from './errors.js'\n\n// --- Types ---\n\nexport interface DeviceCodeIssuance {\n device_code: string\n user_code: string\n verification_uri: string\n verification_uri_complete: string\n expires_in: number\n interval: number\n}\n\nexport interface IdentityTokenResponse {\n access_token: string\n token_type: 'Bearer' | 'DPoP'\n expires_in: number\n scope: string\n session_id?: string\n refresh_token?: string\n}\n\nexport interface WorkspaceChoice {\n workspace_id: string\n role?: string\n name?: string\n}\n\nexport interface MultiWorkspaceResponse {\n error: 'workspace_selection_required'\n workspaces: WorkspaceChoice[]\n access_token?: string\n token_type?: string\n expires_in?: number\n scope?: string\n refresh_token?: string\n}\n\nexport type DeviceCodeStatus =\n | 'authorization_pending'\n | 'polling'\n | 'approved'\n | 'expired'\n | 'denied'\n | 'slow_down'\n\nexport interface DeviceCodeLoginOptions {\n /** Identity service base URL. Default: https://api.platform.amigo.ai */\n identityBaseUrl?: string\n /** Pre-select workspace (skips workspace selection prompt) */\n workspaceId?: string\n /** Client description for audit logs */\n clientDescription?: string\n /** OAuth scope to request */\n scope?: string\n /** Called when device code is issued \u2014 display instructions to user */\n onCode: (issuance: DeviceCodeIssuance) => void | Promise<void>\n /** Called with polling status updates */\n onStatus?: (status: DeviceCodeStatus) => void\n /** Called when user must select a workspace \u2014 return the chosen workspace_id */\n onWorkspaceRequired: (workspaces: WorkspaceChoice[]) => Promise<string>\n /** AbortSignal to cancel the login flow */\n signal?: AbortSignal\n /** Custom fetch implementation */\n fetch?: typeof globalThis.fetch\n}\n\nexport interface AuthResult {\n accessToken: string\n refreshToken: string\n workspaceId: string\n expiresAt: number\n scope?: string\n}\n\nexport interface StoredCredentials {\n access_token: string\n refresh_token: string\n workspace_id: string\n expires_at: number\n scope?: string\n identity_base_url?: string\n}\n\nexport interface TokenStorage {\n load(): Promise<StoredCredentials | null>\n save(credentials: StoredCredentials): Promise<void>\n clear(): Promise<void>\n}\n\n// --- Errors ---\n\nexport class DeviceCodeExpiredError extends AmigoError {\n constructor(message = 'Device code expired. Please restart the login flow.') {\n super(message, { errorCode: 'device_code_expired' })\n }\n}\n\nexport class DeviceCodeDeniedError extends AmigoError {\n constructor(message = 'Authorization request was denied.') {\n super(message, { errorCode: 'device_code_denied' })\n }\n}\n\nexport class RefreshTokenExpiredError extends AuthenticationError {\n constructor(message = 'Refresh token expired. Please log in again.') {\n super(message, { errorCode: 'refresh_token_expired' })\n }\n}\n\nexport class LoginCancelledError extends AmigoError {\n constructor() {\n super('Login cancelled', { errorCode: 'login_cancelled' })\n }\n}\n\n// --- Identity Client ---\n\nconst DEFAULT_IDENTITY_URL = 'https://api.platform.amigo.ai'\n\nasync function identityPost(\n baseUrl: string,\n path: string,\n body: URLSearchParams,\n fetchFn: typeof globalThis.fetch,\n): Promise<Response> {\n try {\n // redirect: 'manual' is required because the identity service uses HTTP 300\n // (non-standard) for multi-workspace selection. Without it, fetch follows\n // the redirect automatically and the caller never sees the 300.\n return await fetchFn(`${baseUrl}${path}`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\n body: body.toString(),\n redirect: 'manual',\n })\n } catch (err) {\n throw new NetworkError('Network error contacting identity service', err)\n }\n}\n\nasync function requestDeviceCode(\n baseUrl: string,\n params: { clientDescription?: string; scope?: string },\n fetchFn: typeof globalThis.fetch,\n): Promise<DeviceCodeIssuance> {\n const body = new URLSearchParams()\n if (params.clientDescription) body.set('client_description', params.clientDescription)\n if (params.scope) body.set('scope', params.scope)\n\n const res = await identityPost(baseUrl, '/device/code', body, fetchFn)\n\n if (res.status === 429) {\n const retryAfter = parseInt(res.headers.get('Retry-After') ?? '', 10)\n throw new RateLimitError('Rate limited', {\n retryAfter: isNaN(retryAfter) ? undefined : retryAfter,\n })\n }\n if (!res.ok) {\n const err = (await res.json().catch(() => ({}))) as Record<string, string>\n throw new AmigoError(err.error_description ?? `Identity error (${res.status})`, {\n statusCode: res.status,\n errorCode: err.error,\n })\n }\n return (await res.json()) as DeviceCodeIssuance\n}\n\ntype PollResult =\n | { type: 'token'; data: IdentityTokenResponse }\n | { type: 'multi_workspace'; data: MultiWorkspaceResponse }\n | { type: 'pending' }\n | { type: 'slow_down' }\n\nasync function pollDeviceCode(\n baseUrl: string,\n deviceCode: string,\n scope: string | undefined,\n workspaceId: string | undefined,\n fetchFn: typeof globalThis.fetch,\n): Promise<PollResult> {\n const body = new URLSearchParams({ grant_type: 'device_code', device_code: deviceCode })\n if (scope) body.set('scope', scope)\n if (workspaceId) body.set('workspace_id', workspaceId)\n\n const res = await identityPost(baseUrl, '/token', body, fetchFn)\n\n if (res.status === 300)\n return { type: 'multi_workspace', data: (await res.json()) as MultiWorkspaceResponse }\n if (res.status === 200)\n return { type: 'token', data: (await res.json()) as IdentityTokenResponse }\n\n if (res.status === 400) {\n const err = (await res.json().catch(() => ({ error: 'unknown' }))) as Record<string, string>\n if (err.error === 'authorization_pending') return { type: 'pending' }\n if (err.error === 'slow_down') return { type: 'slow_down' }\n throw new AmigoError(err.error_description ?? err.error ?? `Identity error (400)`, {\n statusCode: 400,\n errorCode: err.error,\n })\n }\n\n throw new AmigoError(`Identity error (${res.status})`, { statusCode: res.status })\n}\n\nasync function doRefreshToken(\n baseUrl: string,\n params: { refreshToken: string; workspaceId?: string; scope?: string },\n fetchFn: typeof globalThis.fetch,\n): Promise<IdentityTokenResponse> {\n const body = new URLSearchParams({\n grant_type: 'refresh_token',\n refresh_token: params.refreshToken,\n })\n if (params.workspaceId) body.set('workspace_id', params.workspaceId)\n if (params.scope) body.set('scope', params.scope)\n\n const res = await identityPost(baseUrl, '/token', body, fetchFn)\n\n if (!res.ok) {\n const err = (await res.json().catch(() => ({}))) as Record<string, string>\n throw new AmigoError(err.error_description ?? `Identity error (${res.status})`, {\n statusCode: res.status,\n errorCode: err.error,\n })\n }\n return (await res.json()) as IdentityTokenResponse\n}\n\n// --- JWT decode (no verification \u2014 server validates) ---\n\nexport function decodeJwtPayload(jwt: string): Record<string, unknown> | null {\n try {\n const parts = jwt.split('.')\n if (parts.length !== 3 || !parts[1]) return null\n const payload = Buffer.from(parts[1], 'base64url').toString()\n return JSON.parse(payload) as Record<string, unknown>\n } catch {\n return null\n }\n}\n\n// --- Device Code Login ---\n\nfunction sleep(ms: number, signal?: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n if (signal?.aborted) {\n reject(new LoginCancelledError())\n return\n }\n const timer = setTimeout(resolve, ms)\n signal?.addEventListener(\n 'abort',\n () => {\n clearTimeout(timer)\n reject(new LoginCancelledError())\n },\n { once: true },\n )\n })\n}\n\nfunction toAuthResult(token: IdentityTokenResponse, workspaceIdOverride?: string): AuthResult {\n const claims = decodeJwtPayload(token.access_token)\n const workspaceId = workspaceIdOverride ?? (claims?.workspace_id as string) ?? ''\n if (!workspaceId) {\n throw new AmigoError('Token does not contain a workspace_id claim', {\n errorCode: 'missing_workspace',\n })\n }\n return {\n accessToken: token.access_token,\n refreshToken: token.refresh_token ?? '',\n workspaceId,\n expiresAt:\n (claims?.exp as number) ??\n (token.expires_in\n ? Math.floor(Date.now() / 1000) + token.expires_in\n : Math.floor(Date.now() / 1000) + 900),\n scope: token.scope,\n }\n}\n\nasync function fetchWorkspaces(\n baseUrl: string,\n accessToken: string,\n fetchFn: typeof globalThis.fetch,\n): Promise<WorkspaceChoice[]> {\n // Try /self/profile first (identity service direct route)\n for (const path of ['/self/profile', '/self']) {\n const res = await fetchFn(`${baseUrl}${path}`, {\n headers: { Authorization: `Bearer ${accessToken}` },\n })\n if (res.ok) {\n const data = (await res.json()) as {\n workspaces?: Array<{ workspace_id: string; role?: string; name?: string }>\n }\n return (data.workspaces ?? []).map((ws) => ({\n workspace_id: ws.workspace_id,\n role: ws.role,\n name: ws.name,\n }))\n }\n if (res.status !== 404) {\n throw new AmigoError(`Failed to fetch workspaces (${res.status})`, { statusCode: res.status })\n }\n }\n return []\n}\n\nasync function resolveWorkspaceFromBootstrap(\n baseUrl: string,\n token: IdentityTokenResponse,\n options: DeviceCodeLoginOptions,\n fetchFn: typeof globalThis.fetch,\n): Promise<AuthResult> {\n if (!token.refresh_token) {\n throw new AmigoError('Bootstrap token missing refresh_token', { errorCode: 'server_error' })\n }\n\n const workspaces = await fetchWorkspaces(baseUrl, token.access_token, fetchFn)\n\n if (workspaces.length === 0) {\n throw new AmigoError(\n 'No workspace memberships found. Create a workspace or request an invitation.',\n { errorCode: 'no_workspaces' },\n )\n }\n\n if (workspaces.length === 1 && workspaces[0]) {\n const scoped = await doRefreshToken(\n baseUrl,\n {\n refreshToken: token.refresh_token,\n workspaceId: workspaces[0].workspace_id,\n scope: options.scope,\n },\n fetchFn,\n )\n return toAuthResult(scoped, workspaces[0].workspace_id)\n }\n\n const workspaceId = await options.onWorkspaceRequired(workspaces)\n const scoped = await doRefreshToken(\n baseUrl,\n { refreshToken: token.refresh_token, workspaceId, scope: options.scope },\n fetchFn,\n )\n return toAuthResult(scoped, workspaceId)\n}\n\nasync function resolveWorkspaceFromMulti(\n baseUrl: string,\n multi: MultiWorkspaceResponse,\n options: DeviceCodeLoginOptions,\n fetchFn: typeof globalThis.fetch,\n): Promise<AuthResult> {\n if (!multi.refresh_token) {\n throw new AmigoError('Multi-workspace response missing refresh_token', {\n errorCode: 'server_error',\n })\n }\n\n const workspaceId = await options.onWorkspaceRequired(multi.workspaces)\n const scoped = await doRefreshToken(\n baseUrl,\n { refreshToken: multi.refresh_token, workspaceId, scope: options.scope },\n fetchFn,\n )\n return toAuthResult(scoped, workspaceId)\n}\n\nexport async function loginWithDeviceCode(options: DeviceCodeLoginOptions): Promise<AuthResult> {\n const baseUrl = (options.identityBaseUrl ?? DEFAULT_IDENTITY_URL).replace(/\\/+$/, '')\n const fetchFn = options.fetch ?? globalThis.fetch\n\n const issuance = await requestDeviceCode(\n baseUrl,\n { clientDescription: options.clientDescription, scope: options.scope },\n fetchFn,\n )\n\n await options.onCode(issuance)\n\n // Poll loop\n let interval = issuance.interval * 1000\n const deadline = Date.now() + issuance.expires_in * 1000\n\n while (Date.now() < deadline) {\n if (options.signal?.aborted) throw new LoginCancelledError()\n\n await sleep(interval, options.signal)\n\n if (options.signal?.aborted) throw new LoginCancelledError()\n\n options.onStatus?.('polling')\n\n try {\n const result = await pollDeviceCode(\n baseUrl,\n issuance.device_code,\n options.scope,\n options.workspaceId,\n fetchFn,\n )\n\n if (result.type === 'pending') {\n options.onStatus?.('authorization_pending')\n continue\n }\n\n // RFC 8628 \u00A73.5: increase interval by 5 seconds on slow_down\n if (result.type === 'slow_down') {\n interval += 5000\n options.onStatus?.('slow_down')\n continue\n }\n\n options.onStatus?.('approved')\n\n if (result.type === 'token') {\n const claims = decodeJwtPayload(result.data.access_token)\n const isBootstrap = claims?.workspace_bootstrap || !claims?.workspace_id\n if (isBootstrap && result.data.refresh_token) {\n // Bootstrap token \u2014 need workspace selection via refresh_token exchange\n if (options.workspaceId) {\n const scoped = await doRefreshToken(\n baseUrl,\n {\n refreshToken: result.data.refresh_token,\n workspaceId: options.workspaceId,\n scope: options.scope,\n },\n fetchFn,\n )\n return toAuthResult(scoped, options.workspaceId)\n }\n return await resolveWorkspaceFromBootstrap(baseUrl, result.data, options, fetchFn)\n }\n return toAuthResult(result.data)\n }\n\n // multi_workspace (HTTP 300) \u2014 workspace list included in response\n return await resolveWorkspaceFromMulti(baseUrl, result.data, options, fetchFn)\n } catch (err) {\n if (err instanceof AmigoError && err.errorCode === 'expired_token') {\n options.onStatus?.('expired')\n throw new DeviceCodeExpiredError()\n }\n if (err instanceof AmigoError && err.errorCode === 'access_denied') {\n options.onStatus?.('denied')\n throw new DeviceCodeDeniedError()\n }\n throw err\n }\n }\n\n options.onStatus?.('expired')\n throw new DeviceCodeExpiredError()\n}\n\n// --- Token Manager ---\n\nconst REFRESH_BUFFER_SECONDS = 60\n\nexport interface TokenManagerConfig {\n storage?: TokenStorage\n identityBaseUrl?: string\n fetch?: typeof globalThis.fetch\n}\n\nexport class TokenManager {\n private readonly _storage: TokenStorage\n private readonly _baseUrl: string\n private readonly _fetch: typeof globalThis.fetch\n private _cached: StoredCredentials | null = null\n private _refreshPromise: Promise<StoredCredentials> | null = null\n\n constructor(config: TokenManagerConfig = {}) {\n this._storage = config.storage ?? new FileTokenStorage()\n this._baseUrl = (config.identityBaseUrl ?? DEFAULT_IDENTITY_URL).replace(/\\/+$/, '')\n this._fetch = config.fetch ?? globalThis.fetch\n }\n\n async store(result: AuthResult): Promise<void> {\n const creds: StoredCredentials = {\n access_token: result.accessToken,\n refresh_token: result.refreshToken,\n workspace_id: result.workspaceId,\n expires_at: result.expiresAt,\n scope: result.scope,\n }\n this._cached = creds\n await this._storage.save(creds)\n }\n\n async getAccessToken(): Promise<{ token: string; workspaceId: string } | null> {\n const creds = await this._loadCached()\n if (!creds) return null\n if (creds.expires_at - Math.floor(Date.now() / 1000) >= REFRESH_BUFFER_SECONDS) {\n return { token: creds.access_token, workspaceId: creds.workspace_id }\n }\n const refreshed = await this._refresh(creds)\n return { token: refreshed.access_token, workspaceId: refreshed.workspace_id }\n }\n\n async hasCredentials(): Promise<boolean> {\n return (await this._loadCached()) !== null\n }\n\n async clear(): Promise<void> {\n this._cached = null\n this._refreshPromise = null\n await this._storage.clear()\n }\n\n private async _loadCached(): Promise<StoredCredentials | null> {\n if (this._cached) return this._cached\n const loaded = await this._storage.load()\n if (loaded) this._cached = loaded\n return loaded\n }\n\n private async _refresh(current: StoredCredentials): Promise<StoredCredentials> {\n if (this._refreshPromise) return this._refreshPromise\n this._refreshPromise = this._doRefresh(current).finally(() => {\n this._refreshPromise = null\n })\n return this._refreshPromise\n }\n\n private async _doRefresh(current: StoredCredentials): Promise<StoredCredentials> {\n if (!current.refresh_token) throw new RefreshTokenExpiredError('No refresh token available')\n\n try {\n const response = await doRefreshToken(\n this._baseUrl,\n {\n refreshToken: current.refresh_token,\n workspaceId: current.workspace_id,\n scope: current.scope,\n },\n this._fetch,\n )\n const claims = decodeJwtPayload(response.access_token)\n const refreshed: StoredCredentials = {\n access_token: response.access_token,\n refresh_token: response.refresh_token ?? current.refresh_token,\n workspace_id: current.workspace_id,\n expires_at: (claims?.exp as number) ?? Math.floor(Date.now() / 1000) + response.expires_in,\n scope: response.scope ?? current.scope,\n }\n this._cached = refreshed\n await this._storage.save(refreshed)\n return refreshed\n } catch (err) {\n if (\n err instanceof AmigoError &&\n (err.statusCode === 401 || err.errorCode === 'invalid_grant')\n ) {\n await this.clear()\n throw new RefreshTokenExpiredError()\n }\n throw err\n }\n }\n}\n\n// --- Token Storage ---\n\nexport class FileTokenStorage implements TokenStorage {\n private readonly _explicitPath: string | undefined\n private _resolvedPath: string | undefined\n\n constructor(filePath?: string) {\n this._explicitPath = filePath\n }\n\n private async _filePath(): Promise<string> {\n if (this._explicitPath) return this._explicitPath\n if (this._resolvedPath) return this._resolvedPath\n const os = await import('node:os')\n const path = await import('node:path')\n this._resolvedPath = path.join(os.homedir(), '.amigo', 'credentials.json')\n return this._resolvedPath\n }\n\n async load(): Promise<StoredCredentials | null> {\n const fs = await import('node:fs/promises')\n const filePath = await this._filePath()\n try {\n const raw = await fs.readFile(filePath, 'utf-8')\n const data = JSON.parse(raw)\n if (\n typeof data.access_token === 'string' &&\n typeof data.refresh_token === 'string' &&\n typeof data.workspace_id === 'string' &&\n typeof data.expires_at === 'number'\n ) {\n return data as StoredCredentials\n }\n return null\n } catch (err: unknown) {\n if (err && typeof err === 'object' && 'code' in err && err.code === 'ENOENT') return null\n throw err\n }\n }\n\n async save(credentials: StoredCredentials): Promise<void> {\n const fs = await import('node:fs/promises')\n const path = await import('node:path')\n const filePath = await this._filePath()\n await fs.mkdir(path.dirname(filePath), { recursive: true, mode: 0o700 })\n await fs.writeFile(filePath, JSON.stringify(credentials, null, 2) + '\\n', { mode: 0o600 })\n await fs.chmod(filePath, 0o600)\n }\n\n async clear(): Promise<void> {\n const fs = await import('node:fs/promises')\n const filePath = await this._filePath()\n try {\n await fs.unlink(filePath)\n } catch (err: unknown) {\n if (err && typeof err === 'object' && 'code' in err && err.code === 'ENOENT') return\n throw err\n }\n }\n}\n\nexport class MemoryTokenStorage implements TokenStorage {\n private _credentials: StoredCredentials | null = null\n async load(): Promise<StoredCredentials | null> {\n return this._credentials\n }\n async save(credentials: StoredCredentials): Promise<void> {\n this._credentials = { ...credentials }\n }\n async clear(): Promise<void> {\n this._credentials = null\n }\n}\n\n// --- CLI Helpers ---\n\nexport function formatDeviceCodeInstructions(issuance: DeviceCodeIssuance): string {\n return [\n '',\n ' To sign in, open your browser and visit:',\n '',\n ` ${issuance.verification_uri}`,\n '',\n ' Then enter this code:',\n '',\n ` ${issuance.user_code}`,\n '',\n ` This code expires in ${Math.floor(issuance.expires_in / 60)} minutes.`,\n '',\n ].join('\\n')\n}\n\nexport function formatDeviceCodeLink(issuance: DeviceCodeIssuance): string {\n return `\\x1b]8;;${issuance.verification_uri_complete}\\x07Open browser to approve\\x1b]8;;\\x07`\n}\n\nexport async function openBrowser(url: string): Promise<boolean> {\n const { spawn } = await import('node:child_process')\n\n const openers: Record<string, { cmd: string; args: string[] }> = {\n darwin: { cmd: 'open', args: [url] },\n win32: { cmd: 'cmd', args: ['/c', 'start', '', url] },\n linux: { cmd: 'xdg-open', args: [url] },\n }\n\n const opener = openers[process.platform]\n if (!opener) return false\n\n return new Promise((resolve) => {\n // shell: false prevents command injection from malformed URLs\n const child = spawn(opener.cmd, opener.args, { stdio: 'ignore', shell: false, detached: true })\n child.on('error', () => resolve(false))\n child.on('close', (code) => resolve(code === 0))\n child.unref()\n })\n}\n\nexport function formatWorkspaceList(workspaces: WorkspaceChoice[]): string {\n const lines = ['', ' Available workspaces:', '']\n workspaces.forEach((ws, i) => {\n const name = ws.name ?? ws.workspace_id\n const role = ws.role ? ` (${ws.role})` : ''\n lines.push(` ${i + 1}. ${name}${role}`)\n if (ws.name) lines.push(` ${ws.workspace_id}`)\n })\n lines.push('')\n return lines.join('\\n')\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AC4DA,IAAM,iBAAiB,IAAI;AAE3B,IAAM,mBAAmB,oBAAI,IAAI;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,SAAS,qBAAqB,KAAuB;AACnD,MAAI,OAAO,QAAQ,YAAY,CAAC,IAAK,QAAO;AAC5C,MAAI,MAAM,QAAQ,GAAG,EAAG,QAAO,IAAI,IAAI,oBAAoB;AAE3D,QAAM,SAAkC,CAAC;AACzC,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,GAA8B,GAAG;AACzE,QAAI,iBAAiB,IAAI,IAAI,YAAY,CAAC,GAAG;AAC3C,aAAO,GAAG,IAAI;AAAA,IAChB,WAAW,OAAO,UAAU,YAAY,UAAU,MAAM;AACtD,aAAO,GAAG,IAAI,qBAAqB,KAAK;AAAA,IAC1C,OAAO;AACL,aAAO,GAAG,IAAI;AAAA,IAChB;AAAA,EACF;AACA,SAAO;AACT;AAGO,IAAM,aAAN,cAA8E,MAAM;AAAA,EAChF;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA;AAAA,EAET,YAAY,SAAiB,MAAoB,CAAC,GAAG;AACnD,UAAM,OAAO;AACb,SAAK,OAAO,KAAK,YAAY;AAC7B,SAAK,aAAa,IAAI;AACtB,SAAK,YAAY,IAAI;AACrB,SAAK,YAAY,IAAI;AACrB,SAAK,SAAS,IAAI;AAClB,SAAK,UAAU,IAAI,UACd,qBAAqB,IAAI,OAAO,IACjC;AACJ,SAAK,YAAY,IAAI;AACrB,SAAK,UAAU,IAAI;AACnB,WAAO,eAAe,MAAM,WAAW,SAAS;AAChD,QAAI,OAAO,MAAM,sBAAsB,YAAY;AACjD,YAAM,kBAAkB,MAAM,KAAK,WAAW;AAAA,IAChD;AAAA,EACF;AAAA,EAEA,SAAkC;AAChC,WAAO;AAAA,MACL,MAAM,KAAK;AAAA,MACX,SAAS,KAAK;AAAA,MACd,YAAY,KAAK;AAAA,MACjB,WAAW,KAAK;AAAA,MAChB,WAAW,KAAK;AAAA,MAChB,QAAQ,KAAK;AAAA,MACb,SAAS,KAAK;AAAA,MACd,OAAO,KAAK;AAAA,IACd;AAAA,EACF;AACF;AAGO,IAAM,kBAAN,cAA8B,WAAW;AAAA,EAC9C,YAAY,SAAiB,MAAoB,CAAC,GAAG;AACnD,UAAM,SAAS,EAAE,GAAG,KAAK,YAAY,IAAI,CAAC;AAAA,EAC5C;AACF;AAGO,IAAM,sBAAN,cAAkC,WAAW;AAAA,EAClD,YAAY,SAAiB,MAAoB,CAAC,GAAG;AACnD,UAAM,SAAS,EAAE,GAAG,KAAK,YAAY,IAAI,CAAC;AAAA,EAC5C;AACF;AAGO,IAAM,kBAAN,cAA8B,WAAW;AAAA,EAC9C,YAAY,SAAiB,MAAoB,CAAC,GAAG;AACnD,UAAM,SAAS,EAAE,GAAG,KAAK,YAAY,IAAI,CAAC;AAAA,EAC5C;AACF;AAGO,IAAM,gBAAN,cAA4B,WAAW;AAAA,EAC5C,YAAY,SAAiB,MAAoB,CAAC,GAAG;AACnD,UAAM,SAAS,EAAE,GAAG,KAAK,YAAY,IAAI,CAAC;AAAA,EAC5C;AACF;AAGO,IAAM,gBAAN,cAA4B,WAAW;AAAA,EAC5C,YAAY,SAAiB,MAAoB,CAAC,GAAG;AACnD,UAAM,SAAS,EAAE,GAAG,KAAK,YAAY,IAAI,CAAC;AAAA,EAC5C;AACF;AAGO,IAAM,kBAAN,cAA8B,WAAW;AAAA,EAC9C,YAAY,SAAiB,MAAoB,CAAC,GAAG;AACnD,UAAM,SAAS,EAAE,GAAG,KAAK,YAAY,IAAI,CAAC;AAAA,EAC5C;AACF;AAGO,IAAM,iBAAN,cAA6B,WAAW;AAAA,EACpC;AAAA,EAET,YAAY,SAAiB,MAA8C,CAAC,GAAG;AAC7E,UAAM,SAAS,EAAE,GAAG,KAAK,YAAY,IAAI,CAAC;AAC1C,SAAK,aAAa,IAAI;AAAA,EACxB;AACF;AAGO,IAAM,cAAN,cAA0B,WAAW;AAAA,EAC1C,YAAY,SAAiB,MAAoB,CAAC,GAAG;AACnD,UAAM,SAAS,EAAE,GAAG,KAAK,YAAY,IAAI,cAAc,IAAI,CAAC;AAAA,EAC9D;AACF;AAGO,IAAM,0BAAN,cAAsC,YAAY;AAAA,EACvD,YAAY,SAAiB,MAAoB,CAAC,GAAG;AACnD,UAAM,SAAS,EAAE,GAAG,KAAK,YAAY,IAAI,CAAC;AAAA,EAC5C;AACF;AAGO,IAAM,eAAN,cAA2B,WAAW;AAAA,EAC3C,YAAY,SAAiB,OAAiB;AAC5C,UAAM,OAAO;AACb,QAAI,UAAU,QAAW;AACvB,aAAO,eAAe,MAAM,SAAS,EAAE,OAAO,OAAO,UAAU,OAAO,YAAY,KAAK,CAAC;AAAA,IAC1F;AAAA,EACF;AACF;AAGO,IAAM,sBAAN,cAAkC,aAAa;AAAA,EAC3C;AAAA,EAET,YAAY,SAAiB,WAAoB,OAAiB;AAChE,UAAM,SAAS,KAAK;AACpB,SAAK,YAAY;AAAA,EACnB;AACF;AAGO,IAAM,aAAN,cAAyB,WAAW;AAAA,EAChC;AAAA,EAET,YAAY,SAAiB,MAAe;AAC1C,UAAM,OAAO;AACb,SAAK,OAAO;AAAA,EACd;AACF;AAGO,IAAM,qBAAN,cAAiC,WAAW;AAAA,EACjD,YAAY,SAAiB;AAC3B,UAAM,OAAO;AAAA,EACf;AACF;AA0BA,eAAe,cAAc,UAG1B;AACD,MAAI,UAAU;AACd,MAAI;AACF,cAAU,MAAM,SAAS,KAAK;AAAA,EAChC,QAAQ;AAEN,WAAO;AAAA,MACL,MAAM,EAAE,QAAQ,SAAS,cAAc,QAAQ,SAAS,MAAM,IAAI,UAAU,GAAG;AAAA,MAC/E,SAAS;AAAA,IACX;AAAA,EACF;AAEA,QAAM,eAAe,QAAQ,SAAS,iBAAiB,QAAQ,MAAM,GAAG,cAAc,IAAI;AAE1F,MAAI,QAAQ,WAAW,GAAG;AACxB,WAAO;AAAA,MACL,MAAM,EAAE,QAAQ,SAAS,cAAc,QAAQ,SAAS,MAAM,IAAI,UAAU,GAAG;AAAA,MAC/E,SAAS;AAAA,IACX;AAAA,EACF;AAEA,MAAI;AACF,UAAM,SAAS,KAAK,MAAM,OAAO;AACjC,QAAI,UAAU,OAAO,WAAW,YAAY,CAAC,MAAM,QAAQ,MAAM,GAAG;AAElE,aAAO,EAAE,MAAM,QAA6B,SAAS,aAAa;AAAA,IACpE;AAGA,WAAO;AAAA,MACL,MAAM;AAAA,QACJ,QAAQ,SAAS,cAAc,QAAQ,SAAS,MAAM;AAAA,QACtD,UAAU;AAAA,MACZ;AAAA,MACA,SAAS;AAAA,IACX;AAAA,EACF,QAAQ;AACN,WAAO;AAAA,MACL,MAAM;AAAA,QACJ,QAAQ,SAAS,cAAc,QAAQ,SAAS,MAAM;AAAA,QACtD,UAAU;AAAA,MACZ;AAAA,MACA,SAAS;AAAA,IACX;AAAA,EACF;AACF;AAEA,SAAS,cAAc,OAAwB;AAC7C,MAAI;AACF,WAAO,KAAK,UAAU,KAAK;AAAA,EAC7B,QAAQ;AACN,WAAO,OAAO,KAAK;AAAA,EACrB;AACF;AAEA,eAAsB,eAAe,UAAyC;AAC5E,QAAM,EAAE,MAAM,QAAQ,IAAI,MAAM,cAAc,QAAQ;AACtD,QAAM,OAAO;AAEb,QAAM,eACJ,OAAO,KAAK,WAAW,WACnB,KAAK,SACL,KAAK,WAAW,SACd,cAAc,KAAK,MAAM,IACzB;AAER,QAAM,YAAY,OAAO,KAAK,eAAe,WAAW,KAAK,aAAa;AAC1E,QAAM,oBAAoB,OAAO,KAAK,eAAe,WAAW,KAAK,aAAa;AAClF,QAAM,kBAAkB,OAAO,KAAK,YAAY,WAAW,KAAK,UAAU;AAE1E,QAAM,MAAoB;AAAA,IACxB,YAAY,SAAS;AAAA,IACrB;AAAA,IACA,WAAW,qBAAqB,SAAS,QAAQ,IAAI,cAAc,KAAK;AAAA,IACxE,QAAQ;AAAA,IACR,SAAS,EAAE,KAAK,SAAS,KAAK,UAAU,KAAK;AAAA,IAC7C,WAAW;AAAA,IACX;AAAA,EACF;AACA,QAAM,UACJ,mBAAmB,gBAAgB,SAAS,cAAc,QAAQ,SAAS,MAAM;AAEnF,UAAQ,SAAS,QAAQ;AAAA,IACvB,KAAK;AACH,aAAO,IAAI,gBAAgB,SAAS,GAAG;AAAA,IACzC,KAAK;AACH,aAAO,IAAI,oBAAoB,SAAS,GAAG;AAAA,IAC7C,KAAK;AACH,aAAO,IAAI,gBAAgB,SAAS,GAAG;AAAA,IACzC,KAAK;AACH,aAAO,IAAI,cAAc,SAAS,GAAG;AAAA,IACvC,KAAK;AACH,aAAO,IAAI,cAAc,SAAS,GAAG;AAAA,IACvC,KAAK;AACH,aAAO,IAAI,gBAAgB,SAAS,GAAG;AAAA,IACzC,KAAK,KAAK;AACR,YAAM,aAAa,gBAAgB,QAAQ;AAC3C,aAAO,IAAI,eAAe,SAAS,EAAE,GAAG,KAAK,WAAW,CAAC;AAAA,IAC3D;AAAA,IACA,KAAK;AACH,aAAO,IAAI,wBAAwB,SAAS,GAAG;AAAA,IACjD;AACE,aAAO,IAAI,YAAY,SAAS,GAAG;AAAA,EACvC;AACF;AAEA,SAAS,gBAAgB,UAAwC;AAC/D,QAAM,SAAS,SAAS,QAAQ,IAAI,aAAa;AACjD,MAAI,CAAC,OAAQ,QAAO;AACpB,QAAM,UAAU,OAAO,MAAM;AAC7B,MAAI,CAAC,MAAM,OAAO,EAAG,QAAO;AAC5B,QAAM,OAAO,IAAI,KAAK,MAAM;AAC5B,MAAI,CAAC,MAAM,KAAK,QAAQ,CAAC,GAAG;AAC1B,WAAO,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,QAAQ,IAAI,KAAK,IAAI,KAAK,GAAI,CAAC;AAAA,EACpE;AACA,SAAO;AACT;AAIO,SAAS,aAAa,KAAiC;AAC5D,SAAO,eAAe;AACxB;AAEO,SAAS,gBAAgB,KAAoC;AAClE,SAAO,eAAe;AACxB;AAEO,SAAS,iBAAiB,KAAqC;AACpE,SAAO,eAAe;AACxB;AAEO,SAAS,sBAAsB,KAA0C;AAC9E,SAAO,eAAe;AACxB;AAEO,SAAS,sBAAsB,KAA0C;AAC9E,SAAO,eAAe;AACxB;AAEO,SAAS,kBAAkB,KAAsC;AACtE,SAAO,eAAe;AACxB;AAEO,SAAS,gBAAgB,KAAoC;AAClE,SAAO,eAAe;AACxB;AAEO,SAAS,kBAAkB,KAAsC;AACtE,SAAO,eAAe;AACxB;AAEO,SAAS,cAAc,KAAkC;AAC9D,SAAO,eAAe;AACxB;AAEO,SAAS,eAAe,KAAmC;AAChE,SAAO,eAAe;AACxB;AA0BO,SAAS,sBACd,KACoD;AACpD,MAAI,EAAE,eAAe,YAAa,QAAO;AACzC,QAAM,OAAO,IAAI;AACjB,SAAO,MAAM,QAAQ,MAAM,MAAM;AACnC;AAOO,SAAS,gBAAgB,KAA4D;AAC1F,MAAI,EAAE,eAAe,YAAa,QAAO;AACzC,QAAM,OAAO,IAAI;AACjB,MAAI,CAAC,KAAM,QAAO;AAClB,MAAI,MAAM,QAAS,KAA8B,MAAM,GAAG;AAExD,WAAO;AAAA,EACT;AAEA,SAAO,YAAY,QAAQ,EAAE,cAAc;AAC7C;AAMO,SAAS,uBACd,KACiD;AACjD,MAAI,EAAE,eAAe,YAAa,QAAO;AACzC,QAAM,OAAO,IAAI;AACjB,SAAO,OAAO,MAAM,aAAa;AACnC;;;ACzeA,2BAAyE;;;ACclE,SAAS,qBAAqB,QAAgC;AACnE,SAAO;AAAA,IACL,MAAM,UAAU,EAAE,QAAQ,GAAG;AAC3B,cAAQ,QAAQ,IAAI,iBAAiB,UAAU,OAAO,MAAM,EAAE;AAC9D,aAAO;AAAA,IACT;AAAA,IAEA,MAAM,WAAW,EAAE,SAAS,GAAG;AAC7B,UAAI,SAAS,WAAW,KAAK;AAC3B,cAAM,IAAI,oBAAoB,uDAAuD;AAAA,UACnF,YAAY;AAAA,QACd,CAAC;AAAA,MACH;AACA,aAAO;AAAA,IACT;AAAA,EACF;AACF;;;AC/BO,SAAS,sBAAsB,SAAiC;AACrE,QAAM,QAAQ,QAAQ,IAAI,mBAAmB;AAC7C,QAAM,YAAY,QAAQ,IAAI,uBAAuB;AACrD,QAAM,QAAQ,QAAQ,IAAI,mBAAmB;AAC7C,QAAM,aAAa,QAAQ,IAAI,aAAa;AAE5C,SAAO;AAAA,IACL,OAAO,QAAQ,SAAS,OAAO,EAAE,IAAI;AAAA,IACrC,WAAW,YAAY,SAAS,WAAW,EAAE,IAAI;AAAA,IACjD,OAAO,QAAQ,IAAI,KAAK,SAAS,OAAO,EAAE,IAAI,GAAI,IAAI;AAAA,IACtD,YAAY,aAAa,SAAS,YAAY,EAAE,IAAI;AAAA,EACtD;AACF;;;AC8DO,SAAS,qBACd,SACwD;AACxD,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AAEA,QAAM,OAAO,EAAE,GAAG,QAAQ;AAC1B,SAAO,KAAK;AACZ,SAAO,KAAK;AACZ,SAAO,KAAK;AACZ,SAAO;AACT;AAEO,SAAS,oBACd,MACA,UACiD;AACjD,MAAI,CAAC,MAAM;AACT,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,UAAU;AACb,WAAO;AAAA,EACT;AAEA,QAAM,oBAAoB;AAE1B,SAAO;AAAA,IACL,GAAG;AAAA,IACH,GAAG;AAAA,IACH,SAAS,aAAa,KAAK,SAAS,kBAAkB,OAAO;AAAA,IAC7D,QAAQ,kBAAkB,UAAU,KAAK;AAAA,IACzC,SAAS,kBAAkB,WAAW,KAAK;AAAA,IAC3C,YAAY,kBAAkB,cAAc,KAAK;AAAA,IACjD,OAAO,kBAAkB,SAAS,KAAK;AAAA,EACzC;AACF;AAEO,SAAS,0BACd,MACA,UACsB;AACtB,SAAO,oBAAoB,MAAM,QAAQ,KAAK;AAChD;AAEO,SAAS,aACd,MACA,UACqB;AACrB,MAAI,CAAC,QAAQ,CAAC,UAAU;AACtB,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,IAAI,QAAQ;AAC5B,MAAI,aAAa;AAEjB,eAAa,SAAS,MAAM,MAAM;AAChC,iBAAa;AAAA,EACf,CAAC;AACD,eAAa,SAAS,UAAU,MAAM;AACpC,iBAAa;AAAA,EACf,CAAC;AAED,SAAO,aAAa,UAAU;AAChC;AAEA,SAAS,aACP,QACA,QACA,OACM;AACN,MAAI,CAAC,QAAQ;AACX;AAAA,EACF;AAEA,MAAI,kBAAkB,SAAS;AAC7B,WAAO,QAAQ,CAAC,OAAO,QAAQ;AAC7B,aAAO,IAAI,KAAK,KAAK;AACrB,YAAM;AAAA,IACR,CAAC;AACD;AAAA,EACF;AAEA,MAAI,MAAM,QAAQ,MAAM,GAAG;AACzB,eAAW,CAAC,KAAK,KAAK,KAAK,QAAQ;AACjC,UAAI,CAAC,KAAK;AACR;AAAA,MACF;AAEA,UAAI,UAAU,QAAQ,UAAU,QAAW;AACzC,eAAO,OAAO,GAAG;AACjB;AAAA,MACF;AAEA,aAAO,IAAI,KAAK,OAAO,KAAK,CAAC;AAC7B,YAAM;AAAA,IACR;AACA;AAAA,EACF;AAEA,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,MAAM,GAAG;AACjD,QAAI,UAAU,QAAQ,UAAU,QAAW;AACzC,aAAO,OAAO,GAAG;AACjB;AAAA,IACF;AAEA,WAAO;AAAA,MACL;AAAA,MACA,MAAM,QAAQ,KAAK,IAAI,MAAM,IAAI,CAAC,SAAS,OAAO,IAAI,CAAC,EAAE,KAAK,IAAI,IAAI,OAAO,KAAK;AAAA,IACpF;AACA,UAAM;AAAA,EACR;AACF;;;ACrLA,IAAM,yBAAyB,oBAAI,IAAI,CAAC,KAAK,KAAK,KAAK,KAAK,KAAK,GAAG,CAAC;AAErE,IAAM,8BAA8B,oBAAI,IAAI,CAAC,GAAG,CAAC;AACjD,IAAI,gBAAgB;AAYb,SAAS,YAAY,KAA4B;AACtD,QAAM,EAAE,QAAQ,SAAS,UAAU,QAAQ,IAAI;AAC/C,MAAI,WAAW,QAAQ,YAAa,QAAO;AAE3C,QAAM,SAAS,SAAS;AACxB,MAAI,WAAW,SAAS,WAAW,QAAQ;AACzC,WAAO,uBAAuB,IAAI,MAAM;AAAA,EAC1C;AACA,MAAI,WAAW,UAAU,4BAA4B,IAAI,MAAM,GAAG;AAChE,WAAO,SAAS,QAAQ,IAAI,aAAa;AAAA,EAC3C;AACA,SAAO;AACT;AAEO,SAAS,aACd,SACA,UACA,SACQ;AACR,QAAM,mBAAmB,SAAS,QAAQ,IAAI,aAAa;AAC3D,MAAI,kBAAkB;AACpB,UAAM,UAAU,sBAAsB,gBAAgB;AACtD,QAAI,YAAY,OAAW,QAAO,UAAU;AAAA,EAC9C;AAGA,QAAM,cAAc,KAAK,IAAI,QAAQ,YAAY,QAAQ,cAAc,KAAK,IAAI,GAAG,OAAO,CAAC;AAC3F,SAAO,eAAe,IAAI;AAC5B;AAEA,SAAS,sBAAsB,QAAoC;AACjE,QAAM,UAAU,OAAO,MAAM;AAC7B,MAAI,CAAC,MAAM,OAAO,EAAG,QAAO;AAC5B,QAAM,OAAO,IAAI,KAAK,MAAM;AAC5B,MAAI,CAAC,MAAM,KAAK,QAAQ,CAAC,GAAG;AAC1B,WAAO,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,QAAQ,IAAI,KAAK,IAAI,KAAK,GAAI,CAAC;AAAA,EACpE;AACA,SAAO;AACT;AAEO,SAAS,oBACd,MACA,YACwB;AACxB,QAAM,cACJ,OAAO,eAAe,YAAY,OAAO,SAAS,UAAU,IACxD,KAAK,IAAI,GAAG,KAAK,MAAM,UAAU,IAAI,CAAC,IACrC,MAAM,eAAe;AAE5B,SAAO;AAAA,IACL;AAAA,IACA,aAAa,MAAM,eAAe;AAAA,IAClC,YAAY,MAAM,cAAc;AAAA,EAClC;AACF;AAEA,SAAS,iBAAyB;AAChC,QAAM,YAAY,aAAa;AAC/B,MAAI,WAAW;AACb,UAAM,QAAQ,IAAI,YAAY,CAAC;AAC/B,cAAU,gBAAgB,KAAK;AAC/B,YAAQ,MAAM,CAAC,KAAK,KAAK;AAAA,EAC3B;AAIA,kBAAiB,gBAAgB,MAAO;AACxC,QAAM,QAAQ,WAAW,KAAK,IAAI,IAAI,KAAK,KAAK,eAAe,UAAW,OAAO,CAAC;AAClF,SAAO,QAAQ;AACjB;AAEA,SAAS,eAAuC;AAC9C,QAAM,YAAY,WAAW;AAC7B,MAAI,aAAa,OAAO,UAAU,oBAAoB,YAAY;AAChE,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAAS,UAAU,OAAuB;AACxC,MAAI,SAAS,QAAS,UAAU,QAAS;AACzC,UAAQ,KAAK,KAAK,OAAO,UAAW,MAAM;AAC1C,WAAS,QAAS,UAAU,QAAS;AACrC,UAAQ,KAAK,KAAK,OAAO,UAAW,MAAM;AAC1C,UAAQ,QAAS,UAAU,QAAS;AACtC;;;ACtFO,SAAS,iBAAiB,UAAmC;AAClE,SAAO,SAAS,QAAQ,IAAI,cAAc;AAC5C;AAEO,SAAS,kBAAkB,UAAsC;AACtE,SAAO;AAAA,IACL,WAAW,iBAAiB,QAAQ;AAAA,IACpC,YAAY,SAAS;AAAA,IACrB,SAAS,SAAS;AAAA,IAClB,WAAW,sBAAsB,SAAS,OAAO;AAAA,EACnD;AACF;AAgBO,SAAS,YACd,QACA,UAA8B,CAAC,GACN;AACzB,MAAI,OAAO,SAAS,QAAW;AAC7B,WAAO,uBAAuB,OAAO,MAAM,OAAO,QAAQ;AAAA,EAC5D;AAEA,MAAI,mBAAmB,OAAO,QAAQ,KAAK,QAAQ,gBAAgB;AACjE,WAAO;AAAA,EACT;AAIA,MAAI,OAAO,UAAU,QAAW;AAC9B,UAAM,IAAI,WAAW,sCAAsC,KAAK,UAAU,OAAO,KAAK,CAAC;AAAA,EACzF;AAEA,QAAM,IAAI;AAAA,IACR;AAAA,IACA,OAAO,WAAW,UAAU,OAAO,SAAS,MAAM,KAAK;AAAA,EACzD;AACF;AAEO,SAAS,aACd,QACA,UAA8B,CAAC,GACb;AAClB,QAAM,OAAO,YAAY,QAAQ,OAAO;AACxC,QAAM,eAAe,kBAAkB,OAAO,QAAQ;AAEtD,SAAO;AAAA,IACL;AAAA,IACA,UAAU,OAAO;AAAA,IACjB,WAAW,aAAa;AAAA,IACxB,WAAW,aAAa;AAAA,EAC1B;AACF;AA8BA,gBAAuB,SACrB,SACmB;AACnB,MAAI,QAA4B;AAChC,SAAO,MAAM;AACX,UAAM,OAAO,MAAM,QAAQ,KAAK;AAChC,eAAW,QAAQ,KAAK,OAAO;AAC7B,YAAM;AAAA,IACR;AACA,QAAI,CAAC,KAAK,YAAY,KAAK,uBAAuB,KAAM;AACxD,YAAQ,KAAK;AAAA,EACf;AACF;AAEA,SAAS,uBAA0B,MAAS,UAA8C;AACxF,MAAI,CAAC,YAAY,OAAO,SAAS,YAAY,SAAS,MAAM;AAC1D,WAAO;AAAA,EACT;AAEA,QAAM,SAAS;AACf,QAAM,eAAe,kBAAkB,QAAQ;AAE/C,uBAAqB,QAAQ,eAAe,aAAa,SAAS;AAClE,uBAAqB,QAAQ,gBAAgB,YAAY;AAEzD,SAAO;AACT;AAEA,SAAS,mBAAmB,UAA8B;AACxD,SAAO,UAAU,WAAW,OAAO,UAAU,WAAW;AAC1D;AAEA,SAAS,qBACP,QACA,KACA,OACM;AACN,MAAI;AACF,WAAO,eAAe,QAAQ,KAAK;AAAA,MACjC;AAAA,MACA,YAAY;AAAA,MACZ,cAAc;AAAA,MACd,UAAU;AAAA,IACZ,CAAC;AAAA,EACH,QAAQ;AAAA,EAER;AACF;;;ALnJA,IAAM,eACJ,OAAO,qBAAAA,YAAuB,aAC1B,qBAAAA,UACC,qBAAAA,QAAyE;AA8ChF,IAAM,wBAAwB,oBAAI,QAA8C;AAEzE,SAAS,qBAAqB,QAAqC;AACxE,QAAM,YAAY,mBAAmB,OAAO,SAAS,WAAW,KAAK;AACrE,QAAM,WAAW;AAAA,IACf,OAAO,OAAO;AAAA,IACd,YAAY,OAAO;AAAA,IACnB,SAAS,OAAO;AAAA,EAClB;AAEA,QAAM,SAAS,aAAoB;AAAA,IACjC,SAAS,OAAO;AAAA,IAChB,OAAO,oBAAoB,WAAW,QAAQ;AAAA,IAC9C,SAAS,OAAO;AAAA,EAClB,CAAC;AAED,wBAAsB,IAAI,QAAQ,EAAE,WAAW,UAAU,SAAS,OAAO,QAAQ,CAAC;AAGlF,QAAM,kBAA8B;AAAA,IAClC,MAAM,WAAW,EAAE,SAAS,GAAG;AAC7B,UAAI,CAAC,SAAS,IAAI;AAChB,cAAM,MAAM,eAAe,QAAQ;AAAA,MACrC;AACA,aAAO;AAAA,IACT;AAAA,EACF;AAGA,QAAM,iBAAiB,qBAAqB,EAAE,QAAQ,OAAO,OAAO,CAAC;AACrE,QAAM,iBAAyC,OAAO,QAClD;AAAA,IACE,MAAM,UAAU,EAAE,SAAS,YAAY,GAAG,GAAG;AAC3C,YAAM,OAAO,OAAO,YAAY,EAAE,SAAS,YAAY,GAAG,CAAC;AAC3D,aAAO;AAAA,IACT;AAAA,IACA,MAAM,WAAW,EAAE,SAAS,UAAU,YAAY,GAAG,GAAG;AACtD,YAAM,OAAO,OAAO,aAAa;AAAA,QAC/B;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,WAAW,iBAAiB,QAAQ;AAAA,QACpC,WAAW,sBAAsB,SAAS,OAAO;AAAA,MACnD,CAAC;AACD,aAAO;AAAA,IACT;AAAA,IACA,MAAM,QAAQ,EAAE,SAAS,OAAO,YAAY,GAAG,GAAG;AAChD,YAAM,OAAO,OAAO,UAAU,EAAE,IAAI,SAAS,OAAO,WAAW,CAAC;AAAA,IAClE;AAAA,EACF,IACA;AAGJ,SAAO,IAAI,cAAc;AACzB,SAAO,IAAI,eAAe;AAC1B,MAAI,gBAAgB;AAClB,WAAO,IAAI,cAAc;AAAA,EAC3B;AAEA,SAAO;AACT;AAEO,SAAS,4BACd,QACA,MAC4C;AAC5C,MAAI,CAAC,MAAM;AACT,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,sBAAsB,IAAI,MAAM;AAChD,QAAM,WAAW,qBAAqB,IAAI;AAE1C,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AAEA,QAAM,gBAAgB,UAAU;AAChC,QAAM,qBACJ,kBAAkB,UAClB,KAAK,YAAY,UACjB,KAAK,eAAe,UACpB,KAAK,UAAU;AAEjB,MAAI,CAAC,oBAAoB;AACvB,WAAO;AAAA,EACT;AAEA,QAAM,YAAY;AAAA,IACf,iBAAiB,QAAQ;AAAA,EAC5B;AACA,QAAM,QAAQ,oBAAoB,WAAW;AAAA,IAC3C,SAAS,KAAK,WAAW,QAAQ,SAAS;AAAA,IAC1C,YAAY,KAAK,cAAc,QAAQ,SAAS;AAAA,IAChD,OAAO,KAAK,SAAS,QAAQ,SAAS;AAAA,EACxC,CAAC;AAED,SAAO;AAAA,IACL,GAAG;AAAA,IACH;AAAA,EACF;AACF;AAGO,SAAS,yBAAyB,QAA+B;AACtE,QAAM,UAAU,sBAAsB,IAAI,MAAM;AAChD,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,mBAAmB,wCAAwC;AAAA,EACvE;AACA,SAAO,QAAQ;AACjB;AAEA,SAAS,oBACP,WACA,UACyB;AACzB,SAAO,OAAO,OAAO,SAAS;AAC5B,UAAM,cAAc,iBAAiB,UAAU,QAAQ,IAAI,QAAQ,OAAO,IAAI;AAC9E,UAAM,SAAS,YAAY,OAAO,YAAY;AAC9C,UAAM,YAAY,oBAAoB,SAAS,OAAO,SAAS,UAAU;AACzE,UAAM,YAAY,SAAS;AAC3B,UAAM,eAAe,WAAW,SAAS,WAAW,UAAU,WAAW;AAEzE,aAAS,UAAU,GAAG,UAAU,UAAU,aAAa,WAAW;AAChE,UAAI;AACJ,UAAI;AACJ,UAAI,WAAW;AAEf,UAAI;AACF,cAAM,WAAW,yBAAyB,aAAa,SAAS;AAEhE,YAAI;AACF,qBAAW,MAAM,UAAU,SAAS,OAAO;AAAA,QAC7C,UAAE;AACA,qBAAW,SAAS;AACpB,mBAAS,QAAQ;AAAA,QACnB;AAAA,MACF,SAAS,KAAK;AACZ,gBAAQ;AAAA,MACV;AAEA,UAAI,CAAC,SAAS,YAAY,SAAS,GAAI,QAAO;AAE9C,YAAM,MAAM,EAAE,QAAQ,SAAS,UAAqB,SAAS,UAAU;AACvE,YAAM,iBAAiB,UAAU,IAAI,UAAU;AAE/C,UAAI,OAAO;AACT,YAAI,UAAU;AACZ,gBAAM,IAAI,oBAAoB,2BAA2B,SAAS,MAAM,WAAW,KAAK;AAAA,QAC1F;AACA,YAAI,gBAAgB,gBAAgB;AAClC,gBAAM,MAAM,aAAa,SAAS,IAAI,SAAS,GAAG,SAAS,CAAC;AAC5D;AAAA,QACF;AACA,cAAM,IAAI;AAAA,UACR,kBAAkB,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,UACxE;AAAA,QACF;AAAA,MACF;AAEA,UAAI,YAAY,kBAAkB,YAAY,GAAG,GAAG;AAClD,cAAM,QAAQ,aAAa,SAAS,UAAU,SAAS;AACvD,YAAI,YAAY,OAAO,QAAS,QAAO;AACvC,cAAM,MAAM,KAAK;AACjB;AAAA,MACF;AAEA,aAAO;AAAA,IACT;AAEA,UAAM,IAAI,aAAa,sBAAsB;AAAA,EAC/C;AACF;AAEA,SAAS,MAAM,IAA2B;AACxC,SAAO,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,EAAE,CAAC;AACzD;AAEA,SAAS,mBAAmB,SAAuE;AACjG,SAAO,OAAO,UAAU,QAAQ,KAAK;AACvC;AAEA,SAAS,yBACP,SACA,WAKA;AACA,QAAM,iBAAiB,QAAQ,MAAM;AACrC,QAAM,UAAU,oBAAoB,eAAe,QAAQ,SAAS;AAEpE,MAAI,CAAC,QAAQ,QAAQ;AACnB,WAAO;AAAA,MACL,SAAS;AAAA,MACT,UAAU;AAAA,MACV,SAAS,QAAQ;AAAA,IACnB;AAAA,EACF;AAEA,SAAO;AAAA,IACL,SAAS,IAAI,QAAQ,gBAAgB,EAAE,QAAQ,QAAQ,OAAO,CAAC;AAAA,IAC/D,IAAI,WAAW;AACb,aAAO,QAAQ;AAAA,IACjB;AAAA,IACA,SAAS,QAAQ;AAAA,EACnB;AACF;AAEA,SAAS,oBACP,UACA,WAKA;AACA,MAAI,CAAC,aAAa,CAAC,OAAO,SAAS,SAAS,KAAK,aAAa,GAAG;AAC/D,WAAO;AAAA,MACL,QAAQ,YAAY;AAAA,MACpB,YAAY;AAAA,MACZ,SAAS,MAAM;AAAA,MAAC;AAAA,IAClB;AAAA,EACF;AAEA,QAAM,aAAa,IAAI,gBAAgB;AACvC,MAAI,aAAa;AACjB,QAAM,WAA8B,CAAC;AAErC,QAAM,UAAU,MAAM,WAAW,MAAM,UAAU,MAAM;AACvD,MAAI,UAAU;AACZ,QAAI,SAAS,SAAS;AACpB,iBAAW,MAAM,SAAS,MAAM;AAAA,IAClC,OAAO;AACL,eAAS,iBAAiB,SAAS,SAAS,EAAE,MAAM,KAAK,CAAC;AAC1D,eAAS,KAAK,MAAM,SAAS,oBAAoB,SAAS,OAAO,CAAC;AAAA,IACpE;AAAA,EACF;AAEA,QAAM,QAAQ,WAAW,MAAM;AAC7B,iBAAa;AACb,eAAW,MAAM;AAAA,EACnB,GAAG,SAAS;AACZ,WAAS,KAAK,MAAM,aAAa,KAAK,CAAC;AAEvC,SAAO;AAAA,IACL,QAAQ,WAAW;AAAA,IACnB,IAAI,aAAa;AACf,aAAO;AAAA,IACT;AAAA,IACA,SAAS,MAAM;AACb,iBAAW,WAAW,UAAU;AAC9B,gBAAQ;AAAA,MACV;AAAA,IACF;AAAA,EACF;AACF;;;AMpTA,IAAM,oBAAoB,oBAAI,QAG5B;AAEK,IAAe,0BAAf,MAAuC;AAAA,EAC5C,YACqB,QACAC,cACnB;AAFmB;AACA,uBAAAA;AAAA,EAClB;AAAA,EAFkB;AAAA,EACA;AAAA,EAGrB,IAAc,kBAA0B;AACtC,UAAM,EAAE,WAAW,IAAI,4BAA4B,KAAK,MAAM;AAC9D,WAAO,yBAAyB,UAAU;AAAA,EAC5C;AAAA,EAEA,YAAY,SAAqC;AAC/C,UAAM,eAAe,KAAK;AAI1B,WAAO,IAAI,aAAa,oBAAoB,KAAK,QAAQ,OAAO,GAAG,KAAK,WAAW;AAAA,EACrF;AAAA,EAEA,OAAiB,qBAQf,WACA,QACoF;AAEpF,QAAI,aAAa;AAEjB,WAAO,MAAM;AACX,YAAM,OAAO,MAAM,UAAU,UAAU;AAEvC,iBAAW,QAAQ,KAAK,SAAS,CAAC,GAAG;AACnC,cAAM;AAAA,MACR;AAEA,UACE,CAAC,KAAK,YACN,KAAK,uBAAuB,QAC5B,KAAK,uBAAuB,QAC5B;AACA;AAAA,MACF;AAEA,mBAAa;AAAA,QACX,GAAI;AAAA,QACJ,oBAAoB,KAAK;AAAA,MAC3B;AAAA,IACF;AAAA,EACF;AAAA,EAEA,OAAiB,2BAKf,WACA,aACA,QACuB;AACvB,QAAI,aAAa;AAEjB,WAAO,MAAM;AACX,YAAM,OAAO,MAAM,UAAU,UAAU;AAEvC,iBAAW,QAAQ,YAAY,IAAI,GAAG;AACpC,cAAM;AAAA,MACR;AAEA,UAAI,CAAC,KAAK,YAAY,KAAK,gBAAgB,QAAQ,KAAK,gBAAgB,QAAW;AACjF;AAAA,MACF;AAEA,mBAAa,EAAE,GAAI,YAAmC,QAAQ,KAAK,YAAY;AAAA,IACjF;AAAA,EACF;AACF;AAEO,SAAS,oBACd,QACA,SACe;AACf,QAAM,EAAE,YAAY,SAAS,gBAAgB,IAAI,4BAA4B,MAAM;AACnF,QAAM,gBAAgB,0BAA0B,iBAAiB,OAAO;AAExE,QAAM,eAAe;AAAA,IACnB,SAAS,CAAC,QAAgB,MAAc,SACtC,WAAW;AAAA,MACT;AAAA,MACA;AAAA,MACA;AAAA,QACE;AAAA,QACA,oBAAoB,eAAe,IAAa;AAAA,MAClD;AAAA,IACF;AAAA,IACF,KAAK,CAAC,MAAc,SAClB,WAAW;AAAA,MACT;AAAA,MACA;AAAA,QACE;AAAA,QACA,oBAAoB,eAAe,IAAa;AAAA,MAClD;AAAA,IACF;AAAA,IACF,KAAK,CAAC,MAAc,SAClB,WAAW;AAAA,MACT;AAAA,MACA;AAAA,QACE;AAAA,QACA,oBAAoB,eAAe,IAAa;AAAA,MAClD;AAAA,IACF;AAAA,IACF,MAAM,CAAC,MAAc,SACnB,WAAW;AAAA,MACT;AAAA,MACA;AAAA,QACE;AAAA,QACA,oBAAoB,eAAe,IAAa;AAAA,MAClD;AAAA,IACF;AAAA,IACF,QAAQ,CAAC,MAAc,SACrB,WAAW;AAAA,MACT;AAAA,MACA;AAAA,QACE;AAAA,QACA,oBAAoB,eAAe,IAAa;AAAA,MAClD;AAAA,IACF;AAAA,IACF,SAAS,CAAC,MAAc,SACtB,WAAW;AAAA,MACT;AAAA,MACA;AAAA,QACE;AAAA,QACA,oBAAoB,eAAe,IAAa;AAAA,MAClD;AAAA,IACF;AAAA,IACF,MAAM,CAAC,MAAc,SACnB,WAAW;AAAA,MACT;AAAA,MACA;AAAA,QACE;AAAA,QACA,oBAAoB,eAAe,IAAa;AAAA,MAClD;AAAA,IACF;AAAA,IACF,OAAO,CAAC,MAAc,SACpB,WAAW;AAAA,MACT;AAAA,MACA;AAAA,QACE;AAAA,QACA,oBAAoB,eAAe,IAAa;AAAA,MAClD;AAAA,IACF;AAAA,IACF,OAAO,CAAC,MAAc,SACpB,WAAW;AAAA,MACT;AAAA,MACA;AAAA,QACE;AAAA,QACA,oBAAoB,eAAe,IAAa;AAAA,MAClD;AAAA,IACF;AAAA,IACF,KAAK,IAAI,eAA6B,WAAW,IAAI,GAAG,UAAU;AAAA,IAClE,OAAO,IAAI,eAA6B,WAAW,MAAM,GAAG,UAAU;AAAA,EACxE;AAEA,oBAAkB,IAAI,cAAc,EAAE,YAAY,SAAS,cAAc,CAAC;AAC1E,SAAO;AACT;AAEO,SAAS,4BAA4B,QAG1C;AACA,QAAM,WAAW,kBAAkB,IAAI,MAAM;AAC7C,SAAO;AAAA,IACL,YAAY,UAAU,cAAc;AAAA,IACpC,SAAS,UAAU;AAAA,EACrB;AACF;;;AChMO,IAAM,qBAAN,cAAiC,wBAAwB;AAAA;AAAA,EAE9D,MAAM,kBAAkB,MAAuD;AAC7E,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,KAAK,+BAA+B;AAAA,QACpD;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,KAAK,QAAqB;AAC9B,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,kBAAkB;AAAA,QACtC,QAAQ,EAAE,OAAO,OAAO;AAAA,MAC1B,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,eAAe,QAAqB;AAClC,WAAO,KAAK,qBAAqB,CAAC,eAAe,KAAK,KAAK,UAAU,GAAG,MAAM;AAAA,EAChF;AAAA;AAAA,EAGA,MAAM,IAAI,IAA2B;AACnC,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,iCAAiC;AAAA,QACrD,QAAQ,EAAE,MAAM,EAAE,cAAc,MAAM,KAAK,YAAY,EAAE;AAAA,MAC3D,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,OAAO,MAAuD,IAA2B;AAC7F,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,MAAM,iCAAiC;AAAA,QACvD,QAAQ,EAAE,MAAM,EAAE,cAAc,MAAM,KAAK,YAAY,EAAE;AAAA,QACzD;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,QAAQ,MAAwD,IAA2B;AAC/F,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,KAAK,yCAAyC;AAAA,QAC9D,QAAQ,EAAE,MAAM,EAAE,cAAc,MAAM,KAAK,YAAY,EAAE;AAAA,QACzD;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,UAAU,IAA2B;AACzC,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,KAAK,2CAA2C;AAAA,QAChE,QAAQ,EAAE,MAAM,EAAE,cAAc,MAAM,KAAK,YAAY,EAAE;AAAA,MAC3D,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,iBAAiB,QAAmC,IAA2B;AACnF,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,mDAAmD;AAAA,QACvE,QAAQ;AAAA,UACN,MAAM,EAAE,cAAc,MAAM,KAAK,YAAY;AAAA,UAC7C,OAAO,SAAS,EAAE,OAAO,IAAI;AAAA,QAC/B;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,mBACJ,MACA,IACA;AACA,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,KAAK,qDAAqD;AAAA,QAC1E,QAAQ,EAAE,MAAM,EAAE,cAAc,MAAM,KAAK,YAAY,EAAE;AAAA,QACzD;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AACF;;;ACxFO,IAAM,kBAAN,cAA8B,wBAAwB;AAAA;AAAA;AAAA;AAAA;AAAA,EAK3D,MAAM,KAAK;AACT,WAAO,YAAY,MAAM,KAAK,OAAO,IAAI,eAAe,CAAC,CAAC,CAAC;AAAA,EAC7D;AAAA;AAAA,EAGA,MAAM,OAAO,MAAoD;AAC/D,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,KAAK,+BAA+B;AAAA,QACpD,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,YAAY,EAAE;AAAA,QACnD;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,KAAK,QAA+C;AACxD,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,+BAA+B;AAAA,QACnD,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,YAAY,GAAG,OAAO,OAAO;AAAA,MACpE,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,eAAe,QAA+C;AAC5D,WAAO,KAAK,qBAAqB,CAAC,eAAe,KAAK,KAAK,UAAU,GAAG,MAAM;AAAA,EAChF;AAAA;AAAA,EAGA,MAAM,OAAO,OAAyC;AACpD,UAAM,KAAK,OAAO,OAAO,wCAAwC;AAAA,MAC/D,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,aAAa,QAAQ,MAAM,EAAE;AAAA,IACpE,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,OAAO,OAA0B,MAAoD;AACzF,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,KAAK,+CAA+C;AAAA,QACpE,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,aAAa,QAAQ,MAAM,EAAE;AAAA,QAClE;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AACF;;;AClDO,IAAM,iBAAN,cAA6B,wBAAwB;AAAA,EAC1D,MAAM,OAAO,MAAmD;AAC9D,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,KAAK,6BAA6B;AAAA,QAClD,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,YAAY,EAAE;AAAA,QACnD;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAM,KAAK,QAA2B;AACpC,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,6BAA6B;AAAA,QACjD,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,YAAY,GAAG,OAAO,OAAO;AAAA,MACpE,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,eAAe,QAA2B;AACxC,WAAO,KAAK,qBAAqB,CAAC,eAAe,KAAK,KAAK,UAAU,GAAG,MAAM;AAAA,EAChF;AAAA,EAEA,MAAM,IAAIC,UAA2B;AACnC,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,wCAAwC;AAAA,QAC5D,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,aAAa,UAAUA,SAAQ,EAAE;AAAA,MACxE,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAM,OAAOA,UAA2B,MAAmD;AACzF,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,wCAAwC;AAAA,QAC5D,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,aAAa,UAAUA,SAAQ,EAAE;AAAA,QACtE;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAM,OAAOA,UAA0C;AACrD,UAAM,KAAK,OAAO,OAAO,wCAAwC;AAAA,MAC/D,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,aAAa,UAAUA,SAAQ,EAAE;AAAA,IACxE,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,aAAaA,UAA2B,QAAqB;AACjE,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,iDAAiD;AAAA,QACrE,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,aAAa,UAAUA,SAAQ,GAAG,OAAO,OAAO;AAAA,MACvF,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,uBAAuBA,UAA2B,QAAqB;AACrE,WAAO,KAAK,qBAAqB,CAAC,eAAe,KAAK,aAAaA,UAAS,UAAU,GAAG,MAAM;AAAA,EACjG;AAAA,EAEA,MAAM,WAAWA,UAA2B,SAA4B;AACtE,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,2DAA2D;AAAA,QAC/E,QAAQ;AAAA,UACN,MAAM,EAAE,cAAc,KAAK,aAAa,UAAUA,UAAS,SAAS,OAAO,OAAO,EAAE;AAAA,QACtF;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAM,cACJA,UACA,MACA;AACA,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,KAAK,iDAAiD;AAAA,QACtE,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,aAAa,UAAUA,SAAQ,EAAE;AAAA,QACtE;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AACF;;;ACxEO,IAAM,iBAAN,cAA6B,wBAAwB;AAAA;AAAA,EAE1D,MAAM,OAAO,MAAmD;AAC9D,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,KAAK,6BAA6B;AAAA,QAClD,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,YAAY,EAAE;AAAA,QACnD;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,KAAK,QAA2B;AACpC,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,6BAA6B;AAAA,QACjD,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,YAAY,GAAG,OAAO,OAAO;AAAA,MACpE,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,eAAe,QAA2B;AACxC,WAAO,KAAK,qBAAqB,CAAC,eAAe,KAAK,KAAK,UAAU,GAAG,MAAM;AAAA,EAChF;AAAA;AAAA,EAGA,MAAM,IAAIC,UAA2B;AACnC,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,wCAAwC;AAAA,QAC5D,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,aAAa,UAAUA,SAAQ,EAAE;AAAA,MACxE,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,OAAOA,UAA2B,MAAmD;AACzF,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,wCAAwC;AAAA,QAC5D,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,aAAa,UAAUA,SAAQ,EAAE;AAAA,QACtE;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,OAAOA,UAA0C;AACrD,UAAM,KAAK,OAAO,OAAO,wCAAwC;AAAA,MAC/D,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,aAAa,UAAUA,SAAQ,EAAE;AAAA,IACxE,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,KAAKA,UAA2B,MAAiD;AACrF,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,KAAK,6CAA6C;AAAA,QAClE,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,aAAa,UAAUA,SAAQ,EAAE;AAAA,QACtE;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AACF;;;AC5DO,IAAM,kBAAN,cAA8B,wBAAwB;AAAA;AAAA,EAE3D,MAAM,OAAO,MAAmD;AAC9D,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,KAAK,6BAA6B;AAAA,QAClD,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,YAAY,EAAE;AAAA,QACnD;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,KAAK,QAA4B;AACrC,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,6BAA6B;AAAA,QACjD,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,YAAY,GAAG,OAAO,OAAO;AAAA,MACpE,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,eAAe,QAA4B;AACzC,WAAO,KAAK,qBAAqB,CAAC,eAAe,KAAK,KAAK,UAAU,GAAG,MAAM;AAAA,EAChF;AAAA;AAAA,EAGA,MAAM,IAAIC,WAA6B;AACrC,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,wCAAwC;AAAA,QAC5D,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,aAAa,UAAUA,UAAS,EAAE;AAAA,MACzE,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,OAAOA,WAA6B,MAAmD;AAC3F,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,wCAAwC;AAAA,QAC5D,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,aAAa,UAAUA,UAAS,EAAE;AAAA,QACvE;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,OAAOA,WAA4C;AACvD,UAAM,KAAK,OAAO,OAAO,wCAAwC;AAAA,MAC/D,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,aAAa,UAAUA,UAAS,EAAE;AAAA,IACzE,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,cAAcA,WAA6B;AAC/C,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,mDAAmD;AAAA,QACvE,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,aAAa,UAAUA,UAAS,EAAE;AAAA,MACzE,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,KAAKA,WAA6B,MAAiD;AACvF,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,KAAK,6CAA6C;AAAA,QAClE,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,aAAa,UAAUA,UAAS,EAAE;AAAA,QACvE;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AACF;;;ACjFO,IAAM,oBAAN,cAAgC,wBAAwB;AAAA,EAC7D,MAAM,KAAK,QAA+D;AACxE,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,gCAAgC;AAAA,QACpD,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,YAAY,GAAG,OAAO,OAAO;AAAA,MACpE,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,eAAe,QAA+D;AAC5E,WAAO,KAAK;AAAA,MACV,CAAC,eAAe,KAAK,KAAK,UAAU;AAAA,MACpC,CAAC,SAAS,KAAK;AAAA,MACf;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,OAAO,MAAsD;AACjE,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,KAAK,gCAAgC;AAAA,QACrD,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,YAAY,EAAE;AAAA,QACnD;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAM,IAAI,YAAoB;AAC5B,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,8CAA8C;AAAA,QAClE,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,aAAa,aAAa,WAAW,EAAE;AAAA,MAC9E,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,OAAO,YAAoB,MAAsD;AACrF,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,MAAM,8CAA8C;AAAA,QACpE,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,aAAa,aAAa,WAAW,EAAE;AAAA,QAC5E;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAM,eAAe;AACnB,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,0CAA0C;AAAA,QAC9D,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,YAAY,EAAE;AAAA,MACrD,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAM,WAAW;AACf,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,sCAAsC;AAAA,QAC1D,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,YAAY,EAAE;AAAA,MACrD,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAM,eAAe,QAA+D;AAClF,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,4CAA4C;AAAA,QAChE,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,YAAY,GAAG,OAAO,OAAO;AAAA,MACpE,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,yBAAyB,QAA+D;AACtF,WAAO,KAAK;AAAA,MACV,CAAC,eAAe,KAAK,eAAe,UAAU;AAAA,MAC9C,CAAC,SAAS,KAAK;AAAA,MACf;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,uBAAuB;AAC3B,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,mDAAmD;AAAA,QACvE,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,YAAY,EAAE;AAAA,MACrD,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAM,mBAAmB,QAAgC;AACvD,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,kDAAkD;AAAA,QACtE,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,YAAY,GAAG,OAAO,OAAO;AAAA,MACpE,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAM,eAAe,QAMlB;AACD,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,4CAA4C;AAAA,QAChE,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,YAAY,GAAG,OAAO,OAAgB;AAAA,MAC7E,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAM,eAAe,YAAoB,MAAmD;AAC1F,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,KAAK,2DAA2D;AAAA,QAChF,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,aAAa,aAAa,WAAW,EAAE;AAAA,QAC5E;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAM,SAAS,YAAoB,MAAgD;AACjF,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,KAAK,wDAAwD;AAAA,QAC7E,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,aAAa,aAAa,WAAW,EAAE;AAAA,QAC5E;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAM,UAAU,YAAoB,MAAiD;AACnF,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,KAAK,yDAAyD;AAAA,QAC9E,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,aAAa,aAAa,WAAW,EAAE;AAAA,QAC5E;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAM,WAAW,YAAoB,MAAkD;AACrF,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,KAAK,0DAA0D;AAAA,QAC/E,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,aAAa,aAAa,WAAW,EAAE;AAAA,QAC5E;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAM,aAAa,YAAoB,MAAoD;AACzF,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,KAAK,4DAA4D;AAAA,QACjF,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,aAAa,aAAa,WAAW,EAAE;AAAA,QAC5E;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAM,eAAe,YAAoB,MAA4B;AACnE,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,KAAK,uDAAuD;AAAA,QAC5E,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,aAAa,aAAa,WAAW,EAAE;AAAA,QAC5E;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAM,OAAO,YAAoB,MAA8C;AAC7E,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,KAAK,sDAAsD;AAAA,QAC3E,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,aAAa,aAAa,WAAW,EAAE;AAAA,QAC5E;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAM,kBAAkB,SAAiB;AACvC,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,4DAA4D;AAAA,QAChF,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,aAAa,UAAU,QAAQ,EAAE;AAAA,MACxE,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAM,YAAY,QAA8C;AAC9D,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,0CAA0C;AAAA,QAC9D,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,YAAY,GAAG,OAAO,OAAO;AAAA,MACpE,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,sBAAsB,QAA8C;AAClE,WAAO,KAAK;AAAA,MACV,CAAC,eAAe,KAAK,YAAY,UAAU;AAAA,MAC3C,CAAC,SAAS,KAAK;AAAA,MACf;AAAA,IACF;AAAA,EACF;AACF;;;ACnMO,IAAM,mBAAN,cAA+B,wBAAwB;AAAA,EAC5D,MAAM,KAAK,QAAqB;AAC9B,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,+BAA+B;AAAA,QACnD,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,YAAY,GAAG,OAAO,OAAO;AAAA,MACpE,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,eAAe,QAAqB;AAClC,WAAO,KAAK,qBAAqB,CAAC,eAAe,KAAK,KAAK,UAAU,GAAG,MAAM;AAAA,EAChF;AAAA,EAEA,MAAM,OAAO,MAAqD;AAChE,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,KAAK,+BAA+B;AAAA,QACpD,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,YAAY,EAAE;AAAA,QACnD;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAM,IAAI,WAAmB;AAC3B,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,4CAA4C;AAAA,QAChE,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,aAAa,YAAY,UAAU,EAAE;AAAA,MAC5E,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAM,OAAO,WAAmB,MAAqD;AACnF,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,4CAA4C;AAAA,QAChE,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,aAAa,YAAY,UAAU,EAAE;AAAA,QAC1E;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAM,OAAO,WAAkC;AAC7C,UAAM,KAAK,OAAO,OAAO,4CAA4C;AAAA,MACnE,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,aAAa,YAAY,UAAU,EAAE;AAAA,IAC5E,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,KAAK,WAAmB;AAC5B,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,KAAK,iDAAiD;AAAA,QACtE,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,aAAa,YAAY,UAAU,EAAE;AAAA,MAC5E,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAM,MAAM,WAAmB;AAC7B,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,KAAK,kDAAkD;AAAA,QACvE,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,aAAa,YAAY,UAAU,EAAE;AAAA,MAC5E,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAM,OAAO,WAAmB;AAC9B,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,KAAK,mDAAmD;AAAA,QACxE,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,aAAa,YAAY,UAAU,EAAE;AAAA,MAC5E,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAM,SAAS,WAAmB,QAAqB;AACrD,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,iDAAiD;AAAA,QACrE,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,aAAa,YAAY,UAAU,GAAG,OAAO,OAAO;AAAA,MAC3F,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,mBAAmB,WAAmB,QAAqB;AACzD,WAAO,KAAK,qBAAqB,CAAC,eAAe,KAAK,SAAS,WAAW,UAAU,GAAG,MAAM;AAAA,EAC/F;AACF;;;ACrEO,IAAM,mBAAN,cAA+B,wBAAwB;AAAA,EAC5D,MAAM,OAAO,MAAqD;AAChE,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,KAAK,+BAA+B;AAAA,QACpD,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,YAAY,EAAE;AAAA,QACnD;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAM,KAAK,QAA6B;AACtC,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,+BAA+B;AAAA,QACnD,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,YAAY,GAAG,OAAO,OAAO;AAAA,MACpE,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,eAAe,QAA6B;AAC1C,WAAO,KAAK,qBAAqB,CAAC,eAAe,KAAK,KAAK,UAAU,GAAG,MAAM;AAAA,EAChF;AAAA,EAEA,MAAM,IAAIC,YAA+B;AACvC,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,4CAA4C;AAAA,QAChE,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,aAAa,YAAYA,WAAU,EAAE;AAAA,MAC5E,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAM,OAAOA,YAA+B,MAAqD;AAC/F,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,4CAA4C;AAAA,QAChE,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,aAAa,YAAYA,WAAU,EAAE;AAAA,QAC1E;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAM,OAAOA,YAA8C;AACzD,UAAM,KAAK,OAAO,OAAO,4CAA4C;AAAA,MACnE,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,aAAa,YAAYA,WAAU,EAAE;AAAA,IAC5E,CAAC;AAAA,EACH;AACF;;;AC7CO,IAAM,wBAAN,cAAoC,wBAAwB;AAAA,EACjE,MAAM,OAAO,MAA0D;AACrE,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,KAAK,qCAAqC;AAAA,QAC1D,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,YAAY,EAAE;AAAA,QACnD;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAM,KAAK,QAAkC;AAC3C,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,qCAAqC;AAAA,QACzD,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,YAAY,GAAG,OAAO,OAAO;AAAA,MACpE,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,eAAe,QAAkC;AAC/C,WAAO,KAAK,qBAAqB,CAAC,eAAe,KAAK,KAAK,UAAU,GAAG,MAAM;AAAA,EAChF;AAAA,EAEA,MAAM,IAAIC,iBAAyC;AACjD,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,wDAAwD;AAAA,QAC5E,QAAQ;AAAA,UACN,MAAM,EAAE,cAAc,KAAK,aAAa,kBAAkBA,gBAAe;AAAA,QAC3E;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAM,OACJA,iBACA,MACA;AACA,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,wDAAwD;AAAA,QAC5E,QAAQ;AAAA,UACN,MAAM,EAAE,cAAc,KAAK,aAAa,kBAAkBA,gBAAe;AAAA,QAC3E;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAM,OAAOA,iBAAwD;AACnE,UAAM,KAAK,OAAO,OAAO,wDAAwD;AAAA,MAC/E,QAAQ;AAAA,QACN,MAAM,EAAE,cAAc,KAAK,aAAa,kBAAkBA,gBAAe;AAAA,MAC3E;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,cACJA,iBACA,MACA;AACA,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,KAAK,iEAAiE;AAAA,QACtF,QAAQ;AAAA,UACN,MAAM,EAAE,cAAc,KAAK,aAAa,kBAAkBA,gBAAe;AAAA,QAC3E;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,aAAaA,iBAAyC,QAAqB;AAC/E,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,iEAAiE;AAAA,QACrF,QAAQ;AAAA,UACN,MAAM,EAAE,cAAc,KAAK,aAAa,kBAAkBA,gBAAe;AAAA,UACzE,OAAO;AAAA,QACT;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,uBAAuBA,iBAAyC,QAAqB;AACnF,WAAO,KAAK;AAAA,MACV,CAAC,eAAe,KAAK,aAAaA,iBAAgB,UAAU;AAAA,MAC5D;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,WAAWA,iBAAyC,SAA4B;AACpF,WAAO;AAAA,MACL,MAAM,KAAK,OAAO;AAAA,QAChB;AAAA,QACA;AAAA,UACE,QAAQ;AAAA,YACN,MAAM;AAAA,cACJ,cAAc,KAAK;AAAA,cACnB,kBAAkBA;AAAA,cAClB;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;;;ACzGO,IAAM,sBAAN,cAAkC,wBAAwB;AAAA,EAC/D,MAAM,OAAO,MAAwD;AACnE,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,KAAK,mCAAmC;AAAA,QACxD,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,YAAY,EAAE;AAAA,QACnD;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAM,KAAK,QAAgC;AACzC,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,mCAAmC;AAAA,QACvD,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,YAAY,GAAG,OAAO,OAAO;AAAA,MACpE,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,eAAe,QAAgC;AAC7C,WAAO,KAAK,qBAAqB,CAAC,eAAe,KAAK,KAAK,UAAU,GAAG,MAAM;AAAA,EAChF;AAAA,EAEA,MAAM,IAAIC,eAAqC;AAC7C,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,oDAAoD;AAAA,QACxE,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,aAAa,gBAAgBA,cAAa,EAAE;AAAA,MACnF,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAM,OACJA,eACA,MACA;AACA,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,MAAM,oDAAoD;AAAA,QAC1E,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,aAAa,gBAAgBA,cAAa,EAAE;AAAA,QACjF;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAM,OAAOA,eAAoD;AAC/D,UAAM,KAAK,OAAO,OAAO,oDAAoD;AAAA,MAC3E,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,aAAa,gBAAgBA,cAAa,EAAE;AAAA,IACnF,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,UAAUA,eAAqC;AACnD,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,2DAA2D;AAAA,QAC/E,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,aAAa,gBAAgBA,cAAa,EAAE;AAAA,MACnF,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,eAAeA,eAAqC;AACxD,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,iEAAiE;AAAA,QACrF,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,aAAa,gBAAgBA,cAAa,EAAE;AAAA,MACnF,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,MAAM,YAAYA,eAAqC;AACrD,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,KAAK,yDAAyD;AAAA,QAC9E,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,aAAa,gBAAgBA,cAAa,EAAE;AAAA,MACnF,CAAC;AAAA,IACH;AAAA,EACF;AACF;;;ACvFO,IAAM,gBAAN,cAA4B,wBAAwB;AAAA;AAAA;AAAA,EAIzD,MAAM,aAAa,QAUhB;AACD,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,qCAAqC;AAAA,QACzD,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,YAAY,GAAG,OAAO,OAAO;AAAA,MACpE,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,uBAAuB,QAUpB;AACD,WAAO,KAAK;AAAA,MACV,CAAC,eAAe,KAAK,aAAa,UAAU;AAAA,MAC5C,CAAC,SAAS,KAAK;AAAA,MACf;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,UAAUC,WAA6B;AAC3C,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,iDAAiD;AAAA,QACrE,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,aAAa,WAAWA,UAAS,EAAE;AAAA,MAC1E,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,iBAAiBA,WAA6B;AAClD,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,+DAA+D;AAAA,QACnF,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,aAAa,WAAWA,UAAS,EAAE;AAAA,MAC1E,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,SAASA,WAA6B;AAC1C,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,uDAAuD;AAAA,QAC3E,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,aAAa,WAAWA,UAAS,EAAE;AAAA,MAC1E,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,cAAcA,WAA6B;AAC/C,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,4DAA4D;AAAA,QAChF,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,aAAa,WAAWA,UAAS,EAAE;AAAA,MAC1E,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,WAAWA,WAA6B;AAC5C,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,yDAAyD;AAAA,QAC7E,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,aAAa,WAAWA,UAAS,EAAE;AAAA,MAC1E,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,UAAUA,WAA6B;AAC3C,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,wDAAwD;AAAA,QAC5E,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,aAAa,WAAWA,UAAS,EAAE;AAAA,MAC1E,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAAA;AAAA,EAKA,MAAM,gBAAgB;AACpB,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,uCAAuC;AAAA,QAC3D,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,YAAY,EAAE;AAAA,MACrD,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,qBACJC,eACA,QAMA;AACA,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,iEAAiE;AAAA,QACrF,QAAQ;AAAA,UACN,MAAM,EAAE,cAAc,KAAK,aAAa,gBAAgBA,cAAa;AAAA,UACrE,OAAO;AAAA,QACT;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,sBACJA,eACA,QAKA;AACA,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,kEAAkE;AAAA,QACtF,QAAQ;AAAA,UACN,MAAM,EAAE,cAAc,KAAK,aAAa,gBAAgBA,cAAa;AAAA,UACrE,OAAO;AAAA,QACT;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAAA;AAAA,EAKA,MAAM,kBAAkB;AACtB,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,yCAAyC;AAAA,QAC7D,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,YAAY,EAAE;AAAA,MACrD,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAAA;AAAA,EAKA,MAAM,eAAe,QAAmE;AACtF,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,gDAAgD;AAAA,QACpE,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,YAAY,GAAG,OAAO,OAAO;AAAA,MACpE,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAAA;AAAA,EAKA,MAAM,OAAO,QAOV;AACD,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,mCAAmC;AAAA,QACvD,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,YAAY,GAAG,OAAO,OAAO;AAAA,MACpE,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAAA;AAAA,EAKA,MAAM,YACJD,WACA,QAKA;AACA,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,0DAA0D;AAAA,QAC9E,QAAQ;AAAA,UACN,MAAM,EAAE,cAAc,KAAK,aAAa,WAAWA,UAAS;AAAA,UAC5D,OAAO;AAAA,QACT;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,sBACEA,WACA,QAKA;AACA,WAAO,KAAK;AAAA,MACV,CAAC,eAAe,KAAK,YAAYA,WAAU,UAAU;AAAA,MACrD,CAAC,SAAS,KAAK;AAAA,MACf;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA,EAKA,MAAM,sBAAsB;AAC1B,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,yCAAyC;AAAA,QAC7D,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,YAAY,EAAE;AAAA,MACrD,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,eAAe,QAQlB;AACD,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,wCAAwC;AAAA,QAC5D,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,YAAY,GAAG,OAAO,OAAO;AAAA,MACpE,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,yBAAyB,QAQtB;AACD,WAAO,KAAK;AAAA,MACV,CAAC,eAAe,KAAK,eAAe,UAAU;AAAA,MAC9C,CAAC,SAAS,KAAK;AAAA,MACf;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,oBAAoB;AACxB,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,uCAAuC;AAAA,QAC3D,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,YAAY,EAAE;AAAA,MACrD,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,eAAeE,UAAiB;AACpC,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,KAAK,kDAAkD;AAAA,QACvE,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,aAAa,UAAUA,SAAQ,EAAE;AAAA,MACxE,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,qBAAqB;AACzB,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,KAAK,2CAA2C;AAAA,QAChE,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,YAAY,EAAE;AAAA,MACrD,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAAA;AAAA,EAKA,MAAM,WAAW;AACf,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,yCAAyC;AAAA,QAC7D,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,YAAY,EAAE;AAAA,MACrD,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,qBAAqB;AACzB,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,6CAA6C;AAAA,QACjE,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,YAAY,EAAE;AAAA,MACrD,CAAC;AAAA,IACH;AAAA,EACF;AACF;;;AC3SO,IAAM,gBAAN,cAA4B,wBAAwB;AAAA;AAAA,EAEzD,MAAM,KAAK,QAA0B;AACnC,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,4BAA4B;AAAA,QAChD,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,YAAY,GAAG,OAAO,OAAO;AAAA,MACpE,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,eAAe,QAA0B;AACvC,WAAO,KAAK,qBAAqB,CAAC,eAAe,KAAK,KAAK,UAAU,GAAG,MAAM;AAAA,EAChF;AAAA;AAAA,EAGA,MAAM,IAAIC,SAAgB;AACxB,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,sCAAsC;AAAA,QAC1D,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,aAAa,SAASA,QAAO,EAAE;AAAA,MACtE,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,YAAYA,SAAgB;AAChC,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,+CAA+C;AAAA,QACnE,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,aAAa,SAASA,QAAO,EAAE;AAAA,MACtE,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,gBAAgBA,SAAgB;AACpC,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,mDAAmD;AAAA,QACvE,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,aAAa,SAASA,QAAO,EAAE;AAAA,MACtE,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,wBAAwB;AAC5B,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,gDAAgD;AAAA,QACpE,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,YAAY,EAAE;AAAA,MACrD,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,cAAc,QAA4B;AAC9C,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,uCAAuC;AAAA,QAC3D,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,YAAY,GAAG,OAAO,OAAO;AAAA,MACpE,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,eAAe,QAA4B;AAC/C,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,yCAAyC;AAAA,QAC7D,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,YAAY,GAAG,OAAO,OAAO;AAAA,MACpE,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,iBAAiBA,SAAgB;AACrC,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,qDAAqD;AAAA,QACzE,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,aAAa,SAASA,QAAO,EAAE;AAAA,MACtE,CAAC;AAAA,IACH;AAAA,EACF;AACF;;;ACLA,IAAM,uBAAuB;AAC7B,IAAM,4BAA4B;AAClC,IAAM,+BAA+B;AAO9B,IAAM,wBAAN,cAAoC,wBAAwB;AAAA,EAChD;AAAA,EAEjB,YAAY,QAAuBC,cAAqB,cAAuB;AAC7E,UAAM,QAAQA,YAAW;AACzB,SAAK,eAAe;AAAA,EACtB;AAAA,EAEA,MAAM,KAAK,QAAqE;AAC9E,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,oCAAoC;AAAA,QACxD,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,YAAY,GAAG,OAAO,OAAO;AAAA,MACpE,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAM,OAAO,SAAiE;AAC5E,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,KAAK,oCAAoC;AAAA,QACzD,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,YAAY,EAAE;AAAA,QACnD,MAAM;AAAA,MACR,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAM,IAAI,gBAAqD;AAC7D,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,sDAAsD;AAAA,QAC1E,QAAQ;AAAA,UACN,MAAM,EAAE,cAAc,KAAK,aAAa,iBAAiB,eAAe;AAAA,QAC1E;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAM,MAAM,gBAAuC;AACjD,UAAM,KAAK,OAAO,OAAO,sDAAsD;AAAA,MAC7E,QAAQ;AAAA,QACN,MAAM,EAAE,cAAc,KAAK,aAAa,iBAAiB,eAAe;AAAA,MAC1E;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,WACJ,gBACA,SACA,SACuB;AACvB,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,KAAK,4DAA4D;AAAA,QACjF,QAAQ;AAAA,UACN,MAAM,EAAE,cAAc,KAAK,aAAa,iBAAiB,eAAe;AAAA,UACxE,GAAI,SAAS,qBAAqB,UAAa;AAAA,YAC7C,OAAO,EAAE,oBAAoB,QAAQ,iBAAiB;AAAA,UACxD;AAAA,QACF;AAAA,QACA,MAAM;AAAA,QACN,SAAS,EAAE,QAAQ,mBAAmB;AAAA,MACxC,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAoBA,MAAM,iBACJ,gBACA,SACA,SACqC;AACrC,UAAM,SAAS,MAAM,KAAK,OAAO;AAAA,MAC/B;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,UACN,MAAM,EAAE,cAAc,KAAK,aAAa,iBAAiB,eAAe;AAAA,UACxE,GAAI,SAAS,qBAAqB,UAAa;AAAA,YAC7C,OAAO,EAAE,oBAAoB,QAAQ,iBAAiB;AAAA,UACxD;AAAA,QACF;AAAA,QACA,MAAM;AAAA,QACN,SAAS,EAAE,QAAQ,oBAAoB;AAAA,QACvC,SAAS;AAAA,QACT,QAAQ,SAAS;AAAA,MACnB;AAAA,IACF;AACA,QAAI,OAAO,UAAU,QAAW;AAC9B,YAAM,IAAI,MAAM,cAAc,KAAK,UAAU,OAAO,KAAK,CAAC,EAAE;AAAA,IAC9D;AACA,WAAO,OAAO;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAwBA,OAAO,WACL,gBACA,SACA,SACiC;AACjC,UAAM,aAAa,MAAM,KAAK,iBAAiB,gBAAgB,SAAS,OAAO;AAC/E,qBAAiB,SAAS,eAAe,UAAU,GAAG;AACpD,YAAM,QAAQ,qBAAqB,MAAM,OAAO,MAAM,IAAI;AAC1D,UAAI,MAAO,OAAM;AAAA,IACnB;AAAA,EACF;AAAA;AAAA,EAGA,cAAc,QAAqC;AACjD,UAAM,MAAM,mBAAmB;AAAA,MAC7B,SAAS,KAAK,gBAAgB,KAAK;AAAA,MACnC,aAAa,KAAK;AAAA,MAClB,GAAG;AAAA,IACL,CAAC;AACD,WAAO,IAAI,SAAS;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAoBA,kBAAkB,QAAyC;AACzD,UAAM,MAAM,uBAAuB;AAAA,MACjC,SAAS,KAAK;AAAA,MACd,aAAa,KAAK;AAAA,MAClB,GAAG;AAAA,IACL,CAAC;AACD,WAAO,IAAI,SAAS;AAAA,EACtB;AACF;AAUO,SAAS,wBAAwB,QAAyC;AAC/E,QAAM,QAAQ,4BAA4B,QAAQ,QAAQ;AAC1D,MAAI,CAAC,6BAA6B,KAAK,KAAK,GAAG;AAC7C,UAAM,eAAe,gCAAgC,KAAK;AAC1D,UAAM,IAAI;AAAA,MACR,yEAAyE,YAAY;AAAA,IACvF;AAAA,EACF;AACA,SAAO,CAAC,QAAQ,KAAK;AACvB;AAmBO,SAAS,4BAA4B,QAAyC;AACnF,SAAO,wBAAwB,MAAM;AACvC;AAEA,SAAS,mBAAmB;AAAA,EAC1B;AAAA,EACA,aAAAA;AAAA,EACA,WAAAC;AAAA,EACA;AAAA,EACA,UAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA,eAAe;AACjB,GAAwE;AACtE,QAAM,MAAM,wBACR,2BAA2B,qBAAqB,IAChD,oBAAoB,OAAO;AAC/B,MAAI,aAAa,IAAI,gBAAgBF,YAAW;AAChD,MAAI,aAAa,IAAI,cAAcC,UAAS;AAC5C,MAAI,eAAgB,KAAI,aAAa,IAAI,mBAAmB,cAAc;AAC1E,MAAIC,UAAU,KAAI,aAAa,IAAI,aAAaA,SAAQ;AACxD,MAAI,WAAY,KAAI,aAAa,IAAI,eAAe,MAAM;AAC1D,MAAI,UAAU;AACZ,QAAI,aAAa,IAAI,SAAS,4BAA4B,OAAO,OAAO,CAAC;AAC3E,SAAO;AACT;AAEA,SAAS,4BAA4B,OAAe,OAAuB;AACzE,MAAI,CAAC,MAAM,KAAK,GAAG;AACjB,UAAM,IAAI,mBAAmB,GAAG,KAAK,6CAA6C;AAAA,EACpF;AACA,MAAI,MAAM,SAAS,wBAAwB,CAAC,0BAA0B,KAAK,KAAK,GAAG;AACjF,UAAM,IAAI;AAAA,MACR,GAAG,KAAK;AAAA,IACV;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,2BAA2B,eAA4B;AAC9D,MAAI;AACF,UAAM,MAAM,IAAI,IAAI,aAAa;AACjC,QAAI,IAAI,aAAa,SAAS,IAAI,aAAa,QAAQ;AACrD,YAAM,IAAI,mBAAmB,mDAAmD;AAAA,IAClF;AAGA,QAAI,IAAI,UAAU,IAAI,MAAM;AAC1B,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,EACT,SAAS,OAAO;AACd,QAAI,iBAAiB,mBAAoB,OAAM;AAC/C,UAAM,IAAI;AAAA,MACR,oEAAoE,OAAO,KAAK,CAAC;AAAA,IACnF;AAAA,EACF;AACF;AAEA,SAAS,oBAAoB,SAAsB;AACjD,MAAI,CAAC,0BAA0B,KAAK,OAAO,GAAG;AAC5C,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,QAAM,MAAM,IAAI,IAAI,OAAO;AAC3B,MAAI,IAAI,aAAa,SAAS,IAAI,aAAa,QAAQ;AAAA,EAEvD,WAAW,IAAI,aAAa,WAAW,IAAI,aAAa,UAAU;AAChE,QAAI,WAAW,IAAI,aAAa,WAAW,SAAS;AAAA,EACtD,OAAO;AACL,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACA,MAAI,IAAI,aAAa,OAAO,IAAI,aAAa,IAAI;AAC/C,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAGA,MAAI,WAAW;AACf,MAAI,SAAS;AACb,MAAI,OAAO;AACX,SAAO;AACT;AAEA,SAAS,uBAAuB;AAAA,EAC9B;AAAA,EACA,aAAAF;AAAA,EACA,WAAAC;AAAA,EACA,UAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA,mBAAmB;AACrB,GAA4E;AAC1E,QAAM,MAAM,4BACR,+BAA+B,yBAAyB,IACxD,wBAAwB,SAASF,YAAW;AAChD,MAAI,aAAa,IAAI,cAAcC,UAAS;AAC5C,MAAI,aAAa,IAAI,aAAaC,SAAQ;AAC1C,MAAI,eAAgB,KAAI,aAAa,IAAI,mBAAmB,cAAc;AAI1E,MAAI,eAAe,MAAO,KAAI,aAAa,IAAI,eAAe,OAAO;AACrE,SAAO;AACT;AAEA,SAAS,+BAA+B,mBAAgC;AACtE,MAAI;AACF,UAAM,MAAM,IAAI,IAAI,iBAAiB;AACrC,QAAI,IAAI,aAAa,SAAS,IAAI,aAAa,QAAQ;AACrD,YAAM,IAAI,mBAAmB,uDAAuD;AAAA,IACtF;AACA,QAAI,IAAI,UAAU,IAAI,MAAM;AAC1B,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,EACT,SAAS,OAAO;AACd,QAAI,iBAAiB,mBAAoB,OAAM;AAC/C,UAAM,IAAI;AAAA,MACR,4EAA4E,OAAO,KAAK,CAAC;AAAA,IAC3F;AAAA,EACF;AACF;AAEA,SAAS,wBAAwB,SAAiBF,cAA0B;AAC1E,MAAI,CAAC,0BAA0B,KAAK,OAAO,GAAG;AAC5C,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,QAAM,MAAM,IAAI,IAAI,OAAO;AAC3B,MAAI,IAAI,aAAa,SAAS,IAAI,aAAa,QAAQ;AAAA,EAEvD,WAAW,IAAI,aAAa,WAAW,IAAI,aAAa,UAAU;AAChE,QAAI,WAAW,IAAI,aAAa,WAAW,SAAS;AAAA,EACtD,OAAO;AACL,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACA,MAAI,IAAI,aAAa,OAAO,IAAI,aAAa,IAAI;AAC/C,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACA,MAAI,WAAW,OAAOA,YAAW;AACjC,MAAI,SAAS;AACb,MAAI,OAAO;AACX,SAAO;AACT;AAEA,SAAS,gCAAgC,OAAuB;AAC9D,QAAM,QAAQ,oBAAI,IAAY;AAC9B,aAAW,QAAQ,OAAO;AAGxB,QAAI,CAAC,6BAA6B,KAAK,IAAI,EAAG,OAAM,IAAI,IAAI;AAAA,EAC9D;AACA,SAAO,CAAC,GAAG,KAAK,EAAE,IAAI,CAAC,SAAS,KAAK,UAAU,IAAI,CAAC,EAAE,KAAK,IAAI;AACjE;AAiBA,gBAAgB,eACd,QAC0B;AAC1B,QAAM,SAAS,OAAO,UAAU;AAChC,QAAM,UAAU,IAAI,YAAY;AAChC,MAAI,SAAS;AAEb,YAAU,MAAM,MAAmC;AACjD,cAAU;AAEV,WAAO,MAAM;AACX,YAAM,MAAM,oBAAoB,MAAM;AACtC,UAAI,QAAQ,KAAM;AAClB,YAAM,QAAQ,OAAO,MAAM,GAAG,IAAI,eAAe;AACjD,eAAS,OAAO,MAAM,IAAI,aAAa;AACvC,YAAM,QAAQ,cAAc,KAAK;AACjC,UAAI,MAAO,OAAM;AAAA,IACnB;AAAA,EACF;AAEA,MAAI;AACF,WAAO,MAAM;AACX,YAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO,KAAK;AAC1C,UAAI,KAAM;AACV,aAAO,MAAM,QAAQ,OAAO,OAAO,EAAE,QAAQ,KAAK,CAAC,CAAC;AAAA,IACtD;AAGA,WAAO,MAAM,QAAQ,OAAO,CAAC;AAC7B,QAAI,OAAO,KAAK,EAAE,SAAS,GAAG;AAC5B,YAAM,QAAQ,cAAc,MAAM;AAClC,UAAI,MAAO,OAAM;AACjB,eAAS;AAAA,IACX;AAAA,EACF,UAAE;AACA,WAAO,YAAY;AAAA,EACrB;AACF;AAEA,SAAS,oBACP,GAC2D;AAG3D,QAAM,KAAK,EAAE,QAAQ,MAAM;AAC3B,QAAM,OAAO,EAAE,QAAQ,UAAU;AACjC,MAAI,KAAK,KAAK,OAAO,EAAG,QAAO;AAC/B,MAAI,KAAK,EAAG,QAAO,EAAE,iBAAiB,MAAM,eAAe,OAAO,EAAE;AACpE,MAAI,OAAO,EAAG,QAAO,EAAE,iBAAiB,IAAI,eAAe,KAAK,EAAE;AAClE,SAAO,KAAK,OACR,EAAE,iBAAiB,IAAI,eAAe,KAAK,EAAE,IAC7C,EAAE,iBAAiB,MAAM,eAAe,OAAO,EAAE;AACvD;AAEA,SAAS,cAAc,OAAgC;AACrD,MAAI,QAAQ;AACZ,QAAM,YAAsB,CAAC;AAC7B,aAAW,QAAQ,MAAM,MAAM,OAAO,GAAG;AACvC,QAAI,SAAS,MAAM,KAAK,WAAW,GAAG,EAAG;AACzC,UAAM,QAAQ,KAAK,QAAQ,GAAG;AAC9B,UAAM,QAAQ,QAAQ,IAAI,OAAO,KAAK,MAAM,GAAG,KAAK;AACpD,QAAI,QAAQ,QAAQ,IAAI,KAAK,KAAK,MAAM,QAAQ,CAAC;AACjD,QAAI,MAAM,WAAW,GAAG,EAAG,SAAQ,MAAM,MAAM,CAAC;AAChD,QAAI,UAAU,QAAS,SAAQ;AAAA,aACtB,UAAU,OAAQ,WAAU,KAAK,KAAK;AAAA,EAGjD;AACA,MAAI,CAAC,SAAS,UAAU,WAAW,EAAG,QAAO;AAC7C,SAAO,EAAE,OAAO,MAAM,UAAU,KAAK,IAAI,EAAE;AAC7C;AAaA,IAAM,2BAAkE,oBAAI,IAAI;AAAA,EAC9E;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,SAAS,qBAAqB,WAAmB,UAA0C;AACzF,MAAI,CAAE,yBAAiD,IAAI,SAAS,EAAG,QAAO;AAC9E,MAAI;AACJ,MAAI;AACF,cAAU,KAAK,MAAM,QAAQ;AAAA,EAC/B,QAAQ;AACN,WAAO;AAAA,EACT;AACA,MAAI,OAAO,YAAY,YAAY,YAAY,QAAQ,MAAM,QAAQ,OAAO,EAAG,QAAO;AAGtF,SAAO,EAAE,GAAI,SAAqC,OAAO,UAAU;AACrE;;;AC7lBO,IAAM,uBAAN,cAAmC,wBAAwB;AAAA;AAAA,EAEhE,MAAM,UAAU,MAAyD;AACvE,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,KAAK,oCAAoC;AAAA,QACzD,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,YAAY,EAAE;AAAA,QACnD;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,KAAK,QAAqB;AAC9B,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,oCAAoC;AAAA,QACxD,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,YAAY,GAAG,OAAO,OAAO;AAAA,MACpE,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,eAAe,QAAqB;AAClC,WAAO,KAAK,qBAAqB,CAAC,eAAe,KAAK,KAAK,UAAU,GAAG,MAAM;AAAA,EAChF;AAAA;AAAA,EAGA,MAAM,IAAIG,gBAAuC;AAC/C,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,sDAAsD;AAAA,QAC1E,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,aAAa,iBAAiBA,eAAc,EAAE;AAAA,MACrF,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,OACJA,gBACA,MACA;AACA,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,sDAAsD;AAAA,QAC1E,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,aAAa,iBAAiBA,eAAc,EAAE;AAAA,QACnF;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,QAAQA,gBAAsD;AAClE,UAAM,KAAK,OAAO,OAAO,sDAAsD;AAAA,MAC7E,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,aAAa,iBAAiBA,eAAc,EAAE;AAAA,IACrF,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,cACJA,gBACA,MACA;AACA,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,iEAAiE;AAAA,QACrF,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,aAAa,iBAAiBA,eAAc,EAAE;AAAA,QACnF;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,gBAAgBA,gBAAsD;AAC1E,UAAM,KAAK,OAAO,OAAO,iEAAiE;AAAA,MACxF,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,aAAa,iBAAiBA,eAAc,EAAE;AAAA,IACrF,CAAC;AAAA,EACH;AACF;;;AClEO,IAAM,uBAAN,cAAmC,wBAAwB;AAAA;AAAA,EAEhE,MAAM,OAAO,MAAyD;AACpE,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,KAAK,mCAAmC;AAAA,QACxD,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,YAAY,EAAE;AAAA,QACnD;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,KAAK,QAAiC;AAC1C,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,mCAAmC;AAAA,QACvD,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,YAAY,GAAG,OAAO,OAAO;AAAA,MACpE,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,eAAe,QAAiC;AAC9C,WAAO,KAAK,qBAAqB,CAAC,eAAe,KAAK,KAAK,UAAU,GAAG,MAAM;AAAA,EAChF;AAAA;AAAA,EAGA,MAAM,IAAIC,gBAAuC;AAC/C,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,oDAAoD;AAAA,QACxE,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,aAAa,gBAAgBA,eAAc,EAAE;AAAA,MACpF,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,OACJA,gBACA,MACA;AACA,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,oDAAoD;AAAA,QACxE,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,aAAa,gBAAgBA,eAAc,EAAE;AAAA,QAClF;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,OAAOA,gBAAsD;AACjE,UAAM,KAAK,OAAO,OAAO,oDAAoD;AAAA,MAC3E,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,aAAa,gBAAgBA,eAAc,EAAE;AAAA,IACpF,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,aACJA,gBACA,cACA,MACA;AACA,WAAO;AAAA,MACL,MAAM,KAAK,OAAO;AAAA,QAChB;AAAA,QACA;AAAA,UACE,QAAQ;AAAA,YACN,MAAM;AAAA,cACJ,cAAc,KAAK;AAAA,cACnB,gBAAgBA;AAAA,cAChB,eAAe;AAAA,YACjB;AAAA,UACF;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkBA,MAAM,eAAeA,gBAAuC;AAC1D,WAAO;AAAA,MACL,MAAM,KAAK,OAAO;AAAA,QAChB;AAAA,QACA;AAAA,UACE,QAAQ;AAAA,YACN,MAAM;AAAA,cACJ,cAAc,KAAK;AAAA,cACnB,gBAAgBA;AAAA,YAClB;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,iBAAiB;AACrB,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,gDAAgD;AAAA,QACpE,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,YAAY,EAAE;AAAA,MACrD,CAAC;AAAA,IACH;AAAA,EACF;AACF;;;ACjIO,IAAM,oBAAN,cAAgC,wBAAwB;AAAA;AAAA,EAE7D,MAAM,aAAa,QAA4B;AAC7C,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,0CAA0C;AAAA,QAC9D,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,YAAY,GAAG,OAAO,OAAO;AAAA,MACpE,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,SAAS,QAMZ;AACD,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,sCAAsC;AAAA,QAC1D,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,YAAY,GAAG,OAAO,OAAO;AAAA,MACpE,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,UAAU,QAA8B;AAC5C,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,uCAAuC;AAAA,QAC3D,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,YAAY,GAAG,OAAO,OAAO;AAAA,MACpE,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,eAAe,QAMlB;AACD,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,6CAA6C;AAAA,QACjE,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,YAAY,GAAG,OAAO,OAAO;AAAA,MACpE,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,iBAAiB,QAMpB;AACD,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,+CAA+C;AAAA,QACnE,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,YAAY,GAAG,OAAO,OAAO;AAAA,MACpE,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,WAAW,QAMd;AACD,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,wCAAwC;AAAA,QAC5D,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,YAAY,GAAG,OAAO,OAAO;AAAA,MACpE,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,mBAAmB,QAA4B;AACnD,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,iDAAiD;AAAA,QACrE,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,YAAY,GAAG,OAAO,OAAO;AAAA,MACpE,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,eAAe,QAA4B;AAC/C,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,6CAA6C;AAAA,QACjE,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,YAAY,GAAG,OAAO,OAAO;AAAA,MACpE,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,SAAS,QAOZ;AACD,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,sCAAsC;AAAA,QAC1D,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,YAAY,GAAG,OAAO,OAAO;AAAA,MACpE,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,kBAAkB,QAA4B;AAClD,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,uCAAuC;AAAA,QAC3D,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,YAAY,GAAG,OAAO,OAAO;AAAA,MACpE,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,gBAAgB,QAMnB;AACD,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,8CAA8C;AAAA,QAClE,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,YAAY,GAAG,OAAO,OAAO;AAAA,MACpE,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,uBAAuB,QAM1B;AACD,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,qDAAqD;AAAA,QACzE,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,YAAY,GAAG,OAAO,OAAO;AAAA,MACpE,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,qBAAqB,QAMxB;AACD,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,+CAA+C;AAAA,QACnE,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,YAAY,GAAG,OAAO,OAAO;AAAA,MACpE,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,mBAAmB,QAMtB;AACD,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,iDAAiD;AAAA,QACrE,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,YAAY,GAAG,OAAO,OAAO;AAAA,MACpE,CAAC;AAAA,IACH;AAAA,EACF;AACF;;;AC/KO,IAAM,sBAAN,cAAkC,wBAAwB;AAAA;AAAA,EAE/D,MAAM,cACJ,MACA;AACA,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,KAAK,2CAA2C;AAAA,QAChE,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,YAAY,EAAE;AAAA,QACnD;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,WAAW,WAAyC;AACxD,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,wDAAwD;AAAA,QAC5E,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,aAAa,YAAY,UAAU,EAAE;AAAA,MAC5E,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,cAAc,WAAyC;AAC3D,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,OAAO,wDAAwD;AAAA,QAC/E,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,aAAa,YAAY,UAAU,EAAE;AAAA,MAC5E,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,KAAK,MAA4C;AACrD,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,KAAK,gDAAgD;AAAA,QACrE,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,YAAY,EAAE;AAAA,QACnD;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,UAAU,MAAiD;AAC/D,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,KAAK,qDAAqD;AAAA,QAC1E,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,YAAY,EAAE;AAAA,QACnD;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,gBAAgB,WAAyC;AAC7D,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,qEAAqE;AAAA,QACzF,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,aAAa,YAAY,UAAU,EAAE;AAAA,MAC5E,CAAC;AAAA,IACH;AAAA,EACF;AACF;;;AC1DO,IAAM,kBAAN,cAA8B,wBAAwB;AAAA;AAAA,EAE3D,MAAM,aAAa;AACjB,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,8BAA8B;AAAA,QAClD,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,YAAY,EAAE;AAAA,MACrD,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,aAAa;AACjB,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,sCAAsC;AAAA,QAC1D,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,YAAY,EAAE;AAAA,MACrD,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,UAAU,WAAmB,QAA6B;AAC9D,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,2CAA2C;AAAA,QAC/D,QAAQ;AAAA,UACN,MAAM,EAAE,cAAc,KAAK,aAAa,YAAY,UAAU;AAAA,UAC9D,OAAO;AAAA,QACT;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,SAAS,WAAmB,QAA4B;AAC5D,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,iDAAiD;AAAA,QACrE,QAAQ;AAAA,UACN,MAAM,EAAE,cAAc,KAAK,aAAa,YAAY,UAAU;AAAA,UAC9D,OAAO;AAAA,QACT;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AACF;;;ACnDO,IAAM,mBAAN,cAA+B,wBAAwB;AAAA,EACnD,QAAQ;AAAA,IACf,KAAK,YACH;AAAA,MACE,MAAM,KAAK,OAAO,IAAI,qCAAqC;AAAA,QACzD,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,YAAY,EAAE;AAAA,MACrD,CAAC;AAAA,IACH;AAAA,IACF,QAAQ,OAAO,SACb;AAAA,MACE,MAAM,KAAK,OAAO,IAAI,qCAAqC;AAAA,QACzD,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,YAAY,EAAE;AAAA,QACnD;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACJ;AAAA,EAES,WAAW;AAAA,IAClB,KAAK,YACH;AAAA,MACE,MAAM,KAAK,OAAO,IAAI,wCAAwC;AAAA,QAC5D,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,YAAY,EAAE;AAAA,MACrD,CAAC;AAAA,IACH;AAAA,IACF,QAAQ,OAAO,SACb;AAAA,MACE,MAAM,KAAK,OAAO,IAAI,wCAAwC;AAAA,QAC5D,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,YAAY,EAAE;AAAA,QACnD;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACJ;AAAA,EAES,WAAW;AAAA,IAClB,KAAK,YACH;AAAA,MACE,MAAM,KAAK,OAAO,IAAI,wCAAwC;AAAA,QAC5D,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,YAAY,EAAE;AAAA,MACrD,CAAC;AAAA,IACH;AAAA,IACF,QAAQ,OAAO,SACb;AAAA,MACE,MAAM,KAAK,OAAO,IAAI,wCAAwC;AAAA,QAC5D,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,YAAY,EAAE;AAAA,QACnD;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACJ;AAAA,EAES,SAAS;AAAA,IAChB,KAAK,YACH;AAAA,MACE,MAAM,KAAK,OAAO,IAAI,sCAAsC;AAAA,QAC1D,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,YAAY,EAAE;AAAA,MACrD,CAAC;AAAA,IACH;AAAA,IACF,QAAQ,OAAO,SACb;AAAA,MACE,MAAM,KAAK,OAAO,IAAI,sCAAsC;AAAA,QAC1D,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,YAAY,EAAE;AAAA,QACnD;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACJ;AAAA,EAES,WAAW;AAAA,IAClB,KAAK,YACH;AAAA,MACE,MAAM,KAAK,OAAO,IAAI,wCAAwC;AAAA,QAC5D,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,YAAY,EAAE;AAAA,MACrD,CAAC;AAAA,IACH;AAAA,IACF,QAAQ,OAAO,SACb;AAAA,MACE,MAAM,KAAK,OAAO,IAAI,wCAAwC;AAAA,QAC5D,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,YAAY,EAAE;AAAA,QACnD;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACJ;AAAA,EAES,YAAY;AAAA,IACnB,KAAK,YACH;AAAA,MACE,MAAM,KAAK,OAAO,IAAI,yCAAyC;AAAA,QAC7D,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,YAAY,EAAE;AAAA,MACrD,CAAC;AAAA,IACH;AAAA,IACF,QAAQ,OAAO,SACb;AAAA,MACE,MAAM,KAAK,OAAO,IAAI,yCAAyC;AAAA,QAC7D,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,YAAY,EAAE;AAAA,QACnD;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACJ;AAAA,EAES,YAAY;AAAA,IACnB,KAAK,YACH;AAAA,MACE,MAAM,KAAK,OAAO,IAAI,yCAAyC;AAAA,QAC7D,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,YAAY,EAAE;AAAA,MACrD,CAAC;AAAA,IACH;AAAA,IACF,QAAQ,OAAO,SACb;AAAA,MACE,MAAM,KAAK,OAAO,IAAI,yCAAyC;AAAA,QAC7D,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,YAAY,EAAE;AAAA,QACnD;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACJ;AAAA,EAES,aAAa;AAAA,IACpB,KAAK,YACH;AAAA,MACE,MAAM,KAAK,OAAO,IAAI,2CAA2C;AAAA,QAC/D,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,YAAY,EAAE;AAAA,MACrD,CAAC;AAAA,IACH;AAAA,IACF,QAAQ,OAAO,SACb;AAAA,MACE,MAAM,KAAK,OAAO,IAAI,2CAA2C;AAAA,QAC/D,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,YAAY,EAAE;AAAA,QACnD;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACJ;AAAA,EAES,SAAS;AAAA,IAChB,KAAK,YACH;AAAA,MACE,MAAM,KAAK,OAAO,IAAI,sCAAsC;AAAA,QAC1D,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,YAAY,EAAE;AAAA,MACrD,CAAC;AAAA,IACH;AAAA,IACF,QAAQ,OAAO,SACb;AAAA,MACE,MAAM,KAAK,OAAO,IAAI,sCAAsC;AAAA,QAC1D,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,YAAY,EAAE;AAAA,QACnD;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACJ;AAAA,EAES,UAAU;AAAA,IACjB,KAAK,YACH;AAAA,MACE,MAAM,KAAK,OAAO,IAAI,uCAAuC;AAAA,QAC3D,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,YAAY,EAAE;AAAA,MACrD,CAAC;AAAA,IACH;AAAA,IACF,QAAQ,OAAO,SACb;AAAA,MACE,MAAM,KAAK,OAAO,IAAI,uCAAuC;AAAA,QAC3D,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,YAAY,EAAE;AAAA,QACnD;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACJ;AAAA,EAES,eAAe;AAAA,IACtB,KAAK,YACH;AAAA,MACE,MAAM,KAAK,OAAO,IAAI,4CAA4C;AAAA,QAChE,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,YAAY,EAAE;AAAA,MACrD,CAAC;AAAA,IACH;AAAA,IACF,QAAQ,OAAO,SACb;AAAA,MACE,MAAM,KAAK,OAAO,IAAI,4CAA4C;AAAA,QAChE,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,YAAY,EAAE;AAAA,QACnD;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACJ;AAAA,EAES,YAAY;AAAA,IACnB,KAAK,YACH;AAAA,MACE,MAAM,KAAK,OAAO,IAAI,yCAAyC;AAAA,QAC7D,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,YAAY,EAAE;AAAA,MACrD,CAAC;AAAA,IACH;AAAA,IACF,QAAQ,OAAO,SACb;AAAA,MACE,MAAM,KAAK,OAAO,IAAI,yCAAyC;AAAA,QAC7D,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,YAAY,EAAE;AAAA,QACnD;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACJ;AACF;;;ACtLO,IAAM,kBAAN,cAA8B,wBAAwB;AAAA;AAAA,EAE3D,MAAM,eAAe;AACnB,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,wCAAwC;AAAA,QAC5D,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,YAAY,EAAE;AAAA,MACrD,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,WAAW;AACf,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,oCAAoC;AAAA,QACxD,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,YAAY,EAAE;AAAA,MACrD,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,eAAe,QAA4B;AAC/C,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,2CAA2C;AAAA,QAC/D,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,YAAY,GAAG,OAAO,OAAO;AAAA,MACpE,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,aAAa,QAA6B;AAC9C,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,uCAAuC;AAAA,QAC3D,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,YAAY,GAAG,OAAO,OAAO;AAAA,MACpE,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,uBAAuB,QAA6B;AAClD,WAAO,KAAK,qBAAqB,CAAC,eAAe,KAAK,aAAa,UAAU,GAAG,MAAM;AAAA,EACxF;AAAA;AAAA,EAGA,MAAM,WAAW,WAAmB;AAClC,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,oDAAoD;AAAA,QACxE,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,aAAa,YAAY,UAAU,EAAE;AAAA,MAC5E,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,cAAc,WAAmB;AACrC,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,wDAAwD;AAAA,QAC5E,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,aAAa,YAAY,UAAU,EAAE;AAAA,MAC5E,CAAC;AAAA,IACH;AAAA,EACF;AACF;;;ACnEO,IAAM,iBAAN,cAA6B,wBAAwB;AAAA;AAAA;AAAA;AAAA;AAAA,EAK1D,MAAM,oBAAoBC,WAA6B;AACrD,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,oDAAoD;AAAA,QACxE,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,aAAa,WAAWA,UAAS,EAAE;AAAA,MAC1E,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eACJA,WACA,QACA;AACA,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,+CAA+C;AAAA,QACnE,QAAQ;AAAA,UACN,MAAM,EAAE,cAAc,KAAK,aAAa,WAAWA,UAAS;AAAA,UAC5D,OAAO;AAAA,QACT;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,eAAe;AACnB,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,uCAAuC;AAAA,QAC3D,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,YAAY,EAAE;AAAA,MACrD,CAAC;AAAA,IACH;AAAA,EACF;AACF;;;ACzCO,IAAM,mBAAN,cAA+B,wBAAwB;AAAA,EAC5D,MAAM,KAAK,QAA6B;AACtC,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,+BAA+B;AAAA,QACnD,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,YAAY,GAAG,OAAO,OAAO;AAAA,MACpE,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,eAAe,QAA6B;AAC1C,WAAO,KAAK,qBAAqB,CAAC,eAAe,KAAK,KAAK,UAAU,GAAG,MAAM;AAAA,EAChF;AAAA,EAEA,MAAM,OAAO,MAAqD;AAChE,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,KAAK,+BAA+B;AAAA,QACpD,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,YAAY,EAAE;AAAA,QACnD;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAM,IAAIC,YAA+B;AACvC,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,4CAA4C;AAAA,QAChE,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,aAAa,YAAYA,WAAU,EAAE;AAAA,MAC5E,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAM,OAAOA,YAA+B,MAAqD;AAC/F,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,MAAM,4CAA4C;AAAA,QAClE,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,aAAa,YAAYA,WAAU,EAAE;AAAA,QAC1E;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAM,OAAOA,YAA8C;AACzD,UAAM,KAAK,OAAO,OAAO,4CAA4C;AAAA,MACnE,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,aAAa,YAAYA,WAAU,EAAE;AAAA,IAC5E,CAAC;AAAA,EACH;AACF;;;AC/BO,IAAM,sBAAN,cAAkC,wBAAwB;AAAA,EAC/D,MAAM,KAAK,QAAgC;AACzC,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,mCAAmC;AAAA,QACvD,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,YAAY,GAAG,OAAO,OAAO;AAAA,MACpE,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,eAAe,QAAgC;AAC7C,WAAO,KAAK,qBAAqB,CAAC,eAAe,KAAK,KAAK,UAAU,GAAG,MAAM;AAAA,EAChF;AAAA,EAEA,MAAM,IAAI,QAAgB;AACxB,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,6CAA6C;AAAA,QACjE,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,aAAa,SAAS,OAAO,EAAE;AAAA,MACtE,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAM,WAAW;AACf,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,yCAAyC;AAAA,QAC7D,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,YAAY,EAAE;AAAA,MACrD,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAM,eAAe;AACnB,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,6CAA6C;AAAA,QACjE,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,YAAY,EAAE;AAAA,MACrD,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAM,WAAW,QAAqB;AACpC,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,4CAA4C;AAAA,QAChE,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,YAAY,GAAG,OAAO,OAAO;AAAA,MACpE,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,qBAAqB,QAAqB;AACxC,WAAO,KAAK,qBAAqB,CAAC,eAAe,KAAK,WAAW,UAAU,GAAG,MAAM;AAAA,EACtF;AAAA,EAEA,MAAM,QAAQ,QAAgB,MAA+C;AAC3E,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,KAAK,qDAAqD;AAAA,QAC1E,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,aAAa,SAAS,OAAO,EAAE;AAAA,QACpE;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAM,OAAO,QAAgB,MAA8C;AACzE,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,KAAK,oDAAoD;AAAA,QACzE,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,aAAa,SAAS,OAAO,EAAE;AAAA,QACpE;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAM,MAAM,QAAgB;AAC1B,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,KAAK,mDAAmD;AAAA,QACxE,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,aAAa,SAAS,OAAO,EAAE;AAAA,MACtE,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAM,QAAQ,QAAgB;AAC5B,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,KAAK,qDAAqD;AAAA,QAC1E,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,aAAa,SAAS,OAAO,EAAE;AAAA,MACtE,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAM,QAAQ,QAAgB,MAA+C;AAC3E,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,KAAK,qDAAqD;AAAA,QAC1E,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,aAAa,SAAS,OAAO,EAAE;AAAA,QACpE;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAM,aAAa,MAAoD;AACrE,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,KAAK,iDAAiD;AAAA,QACtE,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,YAAY,EAAE;AAAA,QACnD;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAM,YAAY,MAAmD;AACnE,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,KAAK,gDAAgD;AAAA,QACrE,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,YAAY,EAAE;AAAA,QACnD;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAM,WAAW,QAA8B;AAC7C,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,2CAA2C;AAAA,QAC/D,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,YAAY,GAAG,OAAO,OAAO;AAAA,MACpE,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,qBAAqB,QAA8B;AACjD,WAAO,KAAK,qBAAqB,CAAC,eAAe,KAAK,WAAW,UAAU,GAAG,MAAM;AAAA,EACtF;AAAA,EAEA,MAAM,UAAU,QAA4B;AAC1C,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,0CAA0C;AAAA,QAC9D,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,YAAY,GAAG,OAAO,OAAO;AAAA,MACpE,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAM,eAAe,QAA4B;AAC/C,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,+CAA+C;AAAA,QACnE,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,YAAY,GAAG,OAAO,OAAO;AAAA,MACpE,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAM,oBAAoB,QAAgB;AACxC,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,+DAA+D;AAAA,QACnF,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,aAAa,SAAS,OAAO,EAAE;AAAA,MACtE,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAM,QAAQ,QAAgB;AAC5B,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,kDAAkD;AAAA,QACtE,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,aAAa,SAAS,OAAO,EAAE;AAAA,MACtE,CAAC;AAAA,IACH;AAAA,EACF;AACF;;;AC9KO,IAAM,qBAAN,cAAiC,wBAAwB;AAAA,EAC9D,MAAM,QAAQ,SAAiB;AAC7B,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,iDAAiD;AAAA,QACrE,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,aAAa,UAAU,QAAQ,EAAE;AAAA,MACxE,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAM,YAAY,SAAiB;AACjC,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,qDAAqD;AAAA,QACzE,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,aAAa,UAAU,QAAQ,EAAE;AAAA,MACxE,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAM,SAAS,SAAiB,UAAkB;AAChD,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,gEAAgE;AAAA,QACpF,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,aAAa,UAAU,SAAS,SAAS,EAAE;AAAA,MAClF,CAAC;AAAA,IACH;AAAA,EACF;AACF;;;ACKO,IAAM,gBAAN,cAA4B,wBAAwB;AAAA,EACzD,MAAM,KAAK,QAA0B;AACnC,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,4BAA4B;AAAA,QAChD,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,YAAY,GAAG,OAAO,OAAO;AAAA,MACpE,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,eAAe,QAA0B;AACvC,WAAO,KAAK;AAAA,MACV,CAAC,eAAe,KAAK,KAAK,UAAU;AAAA,MACpC,CAAC,SAAS,KAAK;AAAA,MACf;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,WAAW,QAAiE;AAChF,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,oCAAoC;AAAA,QACxD,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,YAAY,GAAG,OAAO,OAAO;AAAA,MACpE,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAM,aAAa,QAA0B;AAC3C,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,uCAAuC;AAAA,QAC3D,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,YAAY,GAAG,OAAO,OAAO;AAAA,MACpE,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,uBAAuB,QAA0B;AAC/C,WAAO,KAAK;AAAA,MACV,CAAC,eAAe,KAAK,aAAa,UAAU;AAAA,MAC5C,CAAC,SAAS,KAAK;AAAA,MACf;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,aAAa,MAAmD;AACpE,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,KAAK,mCAAmC;AAAA,QACxD,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,YAAY,EAAE;AAAA,QACnD;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAM,cAAc;AAClB,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,oCAAoC;AAAA,QACxD,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,YAAY,EAAE;AAAA,MACrD,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAM,mBAAmBC,WAAkB,QAAgC;AACzE,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,0DAA0D;AAAA,QAC9E,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,aAAa,WAAWA,UAAS,GAAG,OAAO,OAAO;AAAA,MACzF,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,6BAA6BA,WAAkB,QAAgC;AAC7E,WAAO,KAAK;AAAA,MACV,CAAC,eAAe,KAAK,mBAAmBA,WAAU,UAAU;AAAA,MAC5D,CAAC,SAAS,KAAK;AAAA,MACf;AAAA,IACF;AAAA,EACF;AACF;;;ACpGO,IAAM,8BAAN,cAA0C,wBAAwB;AAAA,EACvE,MAAM,KAAK,QAAqB;AAC9B,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,2CAA2C;AAAA,QAC/D,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,YAAY,GAAG,OAAO,OAAO;AAAA,MACpE,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,eAAe,QAAqB;AAClC,WAAO,KAAK,qBAAqB,CAAC,eAAe,KAAK,KAAK,UAAU,GAAG,MAAM;AAAA,EAChF;AAAA,EAEA,MAAM,OAAO,MAAgE;AAC3E,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,KAAK,2CAA2C;AAAA,QAChE,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,YAAY,EAAE;AAAA,QACnD;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAM,IAAI,eAAuB;AAC/B,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,4DAA4D;AAAA,QAChF,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,aAAa,gBAAgB,cAAc,EAAE;AAAA,MACpF,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAM,OACJ,eACA,MACA;AACA,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,4DAA4D;AAAA,QAChF,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,aAAa,gBAAgB,cAAc,EAAE;AAAA,QAClF;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAM,OAAO,eAAsC;AACjD,UAAM,KAAK,OAAO,OAAO,4DAA4D;AAAA,MACnF,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,aAAa,gBAAgB,cAAc,EAAE;AAAA,IACpF,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,eAAe,eAAuB,QAAqB;AAC/D,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,uEAAuE;AAAA,QAC3F,QAAQ;AAAA,UACN,MAAM,EAAE,cAAc,KAAK,aAAa,gBAAgB,cAAc;AAAA,UACtE,OAAO;AAAA,QACT;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,yBAAyB,eAAuB,QAAqB;AACnE,WAAO,KAAK;AAAA,MACV,CAAC,eAAe,KAAK,eAAe,eAAe,UAAU;AAAA,MAC7D;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,aAAa,eAAuB;AACxC,WAAO;AAAA,MACL,MAAM,KAAK,OAAO;AAAA,QAChB;AAAA,QACA;AAAA,UACE,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,aAAa,gBAAgB,cAAc,EAAE;AAAA,QACpF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;;;AC7EO,IAAM,iBAAN,cAA6B,wBAAwB;AAAA,EAC1D,MAAM,YAAY;AAChB,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,oCAAoC;AAAA,QACxD,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,YAAY,EAAE;AAAA,MACrD,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAM,aAAa,MAA0D;AAC3E,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,oCAAoC;AAAA,QACxD,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,YAAY,EAAE;AAAA,QACnD;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAM,gBAAgB;AACpB,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,uCAAuC;AAAA,QAC3D,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,YAAY,EAAE;AAAA,MACrD,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAM,YAAY,YAAoB;AACpC,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,qDAAqD;AAAA,QACzE,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,aAAa,aAAa,WAAW,EAAE;AAAA,MAC9E,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAM,cAAc,YAAoB,MAAqD;AAC3F,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,KAAK,2DAA2D;AAAA,QAChF,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,aAAa,aAAa,WAAW,EAAE;AAAA,QAC5E;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AACF;;;AC3CO,IAAM,qBAAN,cAAiC,wBAAwB;AAAA,EAC9D,MAAM,eAAe;AACnB,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,2CAA2C;AAAA,QAC/D,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,YAAY,EAAE;AAAA,MACrD,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAM,SAAS,QAA0C;AACvD,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,uCAAuC;AAAA,QAC3D,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,YAAY,GAAG,OAAO,OAAO;AAAA,MACpE,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAM,kBAAkB;AACtB,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,+CAA+C;AAAA,QACnE,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,YAAY,EAAE;AAAA,MACrD,CAAC;AAAA,IACH;AAAA,EACF;AACF;;;ACwDO,IAAM,4BAAN,cAAwC,MAAM;AAAA,EAC1C;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EAET,YACE,SACA,MACA,WACA,OACA;AACA,UAAM,OAAO;AACb,SAAK,OAAO;AACZ,SAAK,OAAO;AACZ,SAAK,YAAY;AACjB,SAAK,QAAQ;AAAA,EACf;AACF;AAEO,SAAS,4BACd,OACoC;AACpC,SAAO,iBAAiB;AAC1B;AAgFA,IAAM,2BAA2B;AACjC,IAAM,uBAAuB;AAC7B,IAAM,yBAAyB;AAI/B,IAAM,kBAAkB;AA2BjB,IAAM,iBAAN,cAA6B,wBAAwB;AAAA,EAC1D,YAAY,QAAuBC,cAAqB;AACtD,UAAM,QAAQA,YAAW;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBA,qBAAqB,SAA0D;AAC7E,UAAM,kBAAkB,IAAI,gBAAgB;AAC5C,UAAM,WAA8B,CAAC;AAErC,QAAI,QAAQ,QAAQ;AAClB,UAAI,QAAQ,OAAO,SAAS;AAC1B,wBAAgB,MAAM,QAAQ,OAAO,MAAM;AAAA,MAC7C,OAAO;AACL,cAAM,UAAU,MAAY,gBAAgB,MAAM,QAAQ,QAAQ,MAAM;AACxE,gBAAQ,OAAO,iBAAiB,SAAS,SAAS,EAAE,MAAM,KAAK,CAAC;AAChE,iBAAS,KAAK,MAAM,QAAQ,QAAQ,oBAAoB,SAAS,OAAO,CAAC;AAAA,MAC3E;AAAA,IACF;AAEA,UAAM,OAAO;AAAA,MACX,KAAK;AAAA,MACL,KAAK;AAAA,MACL;AAAA,MACA,gBAAgB;AAAA,IAClB,EAAE,QAAQ,MAAM;AACd,iBAAW,WAAW,SAAU,SAAQ;AAAA,IAC1C,CAAC;AAED,WAAO;AAAA,MACL;AAAA,MACA,aAAa,MAAM,gBAAgB,MAAM;AAAA,IAC3C;AAAA,EACF;AACF;AAuBA,IAAM,8BAA6E;AAAA,EACjF,kBAAkB;AACpB;AAQA,IAAM,iCAAgF;AAAA,EACpF,oBAAoB;AAAA,EACpB,cAAc;AAChB;AAEA,eAAe,gBACb,QACAA,cACA,SACA,QACe;AACf,MAAI,cAAc,QAAQ;AAC1B,MAAI,UAAU;AACd,MAAI,UAAU,QAAQ,kBAAkB;AACxC,QAAM,aAAa,QAAQ,cAAc;AACzC,QAAM,gBAAgB,QAAQ,iBAAiB;AAC/C,MAAI,gBAAgB;AAEpB,QAAM,cAAc,CAAC,UAAuB;AAC1C,QAAI,cAAe;AACnB,oBAAgB;AAChB,QAAI;AACF,cAAQ,UAAU,KAAK;AAAA,IACzB,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,SAAO,CAAC,OAAO,SAAS;AACtB,QAAI,UAAU,GAAG;AACf,UAAI;AACF,gBAAQ,cAAc,OAAO;AAAA,MAC/B,QAAQ;AAAA,MAER;AAAA,IACF;AAEA,QAAI;AACJ,QAAI;AACF,gBAAU,MAAM,iBAAiB;AAAA,QAC/B;AAAA,QACA,aAAAA;AAAA,QACA;AAAA,QACA;AAAA,QACA,SAAS,QAAQ;AAAA,QACjB,aAAa,CAAC,OAAO;AACnB,wBAAc;AAAA,QAChB;AAAA,QACA,kBAAkB,CAAC,OAAO;AAExB,oBAAU,WAAW,IAAI,QAAQ,gBAAgB,UAAU;AAAA,QAC7D;AAAA,MACF,CAAC;AAAA,IACH,SAAS,KAAK;AAKZ,kBAAY,eAAe,QAAQ,MAAM,IAAI,MAAM,OAAO,GAAG,CAAC,CAAC;AAC/D;AAAA,IACF;AAEA,QAAI,OAAO,WAAW,QAAQ,SAAS,WAAW;AAChD;AAAA,IACF;AAEA,QAAI,QAAQ,SAAS,cAAc;AAKjC,kBAAY,QAAQ,KAAK;AACzB;AAAA,IACF;AAEA,QAAI,QAAQ,SAAS,yBAAyB;AAK5C;AAAA,QACE,IAAI;AAAA,UACF,QAAQ;AAAA,UACR,QAAQ;AAAA,UACR,QAAQ;AAAA,UACR,QAAQ;AAAA,QACV;AAAA,MACF;AACA;AAAA,IACF;AAEA,QAAI,WAAW,eAAe;AAC5B;AAAA,QACE,IAAI;AAAA,UACF,gDAAgD,aAAa,MAAM,QAAQ,MAAM;AAAA,UACjF;AAAA,UACA;AAAA,QACF;AAAA,MACF;AACA;AAAA,IACF;AAEA,eAAW;AACX,UAAM,UAAU,OAAO,OAAO;AAC9B,cAAU,KAAK,IAAI,UAAU,GAAG,UAAU;AAC1C,UAAM,QAAQ,MAAM,eAAe,SAAS,MAAM;AAClD,QAAI,CAAC,MAAO;AAAA,EACd;AACF;AAYA,eAAe,iBAAiB,MAAoD;AAClF,QAAM,UAAkC,EAAE,QAAQ,oBAAoB;AACtE,MAAI,KAAK,gBAAgB,QAAW;AAClC,YAAQ,eAAe,IAAI,KAAK;AAAA,EAClC;AAEA,MAAI;AACJ,MAAI;AACF,aAAS,MAAM,KAAK,OAAO,IAAI,oCAAoC;AAAA,MACjE,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,YAAY,EAAE;AAAA,MACnD;AAAA,MACA,SAAS;AAAA,MACT,QAAQ,KAAK;AAAA,IACf,CAAC;AAAA,EACH,SAAS,KAAK;AACZ,QAAI,KAAK,OAAO,QAAS,QAAO,EAAE,MAAM,UAAU;AAClD,UAAM,QAAQ,eAAe,QAAQ,MAAM,IAAI,MAAM,OAAO,GAAG,CAAC;AAGhE,UAAM,SAAS,WAAW,KAAK;AAC/B,QAAI,WAAW,OAAO,WAAW,KAAK;AACpC,aAAO,EAAE,MAAM,cAAc,MAAM;AAAA,IACrC;AACA,WAAO,EAAE,MAAM,mBAAmB,QAAQ,MAAM,QAAQ;AAAA,EAC1D;AAEA,MAAI,OAAO,UAAU,QAAW;AAG9B,WAAO,EAAE,MAAM,mBAAmB,QAAQ,cAAcC,eAAc,OAAO,KAAK,CAAC,GAAG;AAAA,EACxF;AAEA,QAAM,OAAO,OAAO;AACpB,MAAI,EAAE,gBAAgB,iBAAiB;AACrC,WAAO,EAAE,MAAM,mBAAmB,QAAQ,uCAAuC;AAAA,EACnF;AAEA,MAAI;AACF,qBAAiB,SAASC,gBAAe,MAAM,KAAK,MAAM,GAAG;AAC3D,UAAI,KAAK,OAAO,QAAS,QAAO,EAAE,MAAM,UAAU;AAClD,UAAI,MAAM,UAAU,QAAW;AAC7B,aAAK,iBAAiB,MAAM,KAAK;AAAA,MACnC;AACA,UAAI,MAAM,OAAO,QAAW;AAC1B,aAAK,YAAY,MAAM,EAAE;AAAA,MAC3B;AACA,UAAI,MAAM,UAAU,WAAW,MAAM,SAAS,QAAW;AAMvD,cAAM,aAAa,0BAA0B,MAAM,IAAI;AACvD,YAAI,WAAW,UAAU;AACvB,iBAAO;AAAA,YACL,MAAM;AAAA,YACN,MAAM,WAAW;AAAA,YACjB,SAAS,WAAW;AAAA,YACpB,WAAW,WAAW;AAAA,YACtB,OAAO,WAAW;AAAA,UACpB;AAAA,QACF;AACA,eAAO,EAAE,MAAM,mBAAmB,QAAQ,WAAW,QAAQ;AAAA,MAC/D;AACA,UAAI,MAAM,SAAS,MAAM,SAAS,QAAW;AAC3C,cAAM,QAAQ,oBAAoB,MAAM,OAAO,MAAM,IAAI;AACzD,YAAI,OAAO;AACT,cAAI;AACF,iBAAK,QAAQ,KAAK;AAAA,UACpB,QAAQ;AAAA,UAGR;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF,SAAS,KAAK;AACZ,QAAI,KAAK,OAAO,QAAS,QAAO,EAAE,MAAM,UAAU;AAClD,UAAM,SAAS,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC9D,WAAO,EAAE,MAAM,mBAAmB,OAAO;AAAA,EAC3C;AAEA,MAAI,KAAK,OAAO,QAAS,QAAO,EAAE,MAAM,UAAU;AAGlD,SAAO,EAAE,MAAM,mBAAmB,QAAQ,0BAA0B;AACtE;AAgBA,gBAAgBA,gBACd,QACA,QAC0B;AAC1B,QAAM,SAAS,OAAO,UAAU;AAChC,QAAM,UAAU,IAAI,YAAY;AAChC,MAAI,SAAS;AAMb,MAAI,YAAY;AAChB,QAAM,UAAU,MAAY;AAC1B,QAAI,UAAW;AACf,gBAAY;AACZ,SAAK,OAAO,OAAO,EAAE,MAAM,MAAM;AAAA,IAEjC,CAAC;AAAA,EACH;AACA,MAAI;AACJ,MAAI,OAAO,SAAS;AAClB,YAAQ;AAAA,EACV,OAAO;AACL,WAAO,iBAAiB,SAAS,SAAS,EAAE,MAAM,KAAK,CAAC;AACxD,yBAAqB,MAAM,OAAO,oBAAoB,SAAS,OAAO;AAAA,EACxE;AAEA,YAAU,MAAM,MAAmC;AACjD,cAAU;AACV,QAAI,OAAO,SAAS,iBAAiB;AACnC,YAAM,IAAI,MAAM,6BAA6B,eAAe,2BAA2B;AAAA,IACzF;AACA,WAAO,MAAM;AACX,YAAM,MAAMC,qBAAoB,MAAM;AACtC,UAAI,QAAQ,KAAM;AAClB,YAAM,QAAQ,OAAO,MAAM,GAAG,IAAI,eAAe;AACjD,eAAS,OAAO,MAAM,IAAI,aAAa;AACvC,YAAM,QAAQC,eAAc,KAAK;AACjC,UAAI,MAAO,OAAM;AAAA,IACnB;AAAA,EACF;AAEA,MAAI;AACF,WAAO,MAAM;AACX,YAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO,KAAK;AAC1C,UAAI,KAAM;AACV,aAAO,MAAM,QAAQ,OAAO,OAAO,EAAE,QAAQ,KAAK,CAAC,CAAC;AAAA,IACtD;AACA,WAAO,MAAM,QAAQ,OAAO,CAAC;AAC7B,QAAI,OAAO,KAAK,EAAE,SAAS,GAAG;AAC5B,YAAM,QAAQA,eAAc,MAAM;AAClC,UAAI,MAAO,OAAM;AACjB,eAAS;AAAA,IACX;AAAA,EACF,UAAE;AACA,yBAAqB;AACrB,QAAI;AACF,aAAO,YAAY;AAAA,IACrB,QAAQ;AAAA,IAER;AAAA,EACF;AACF;AAEA,SAASD,qBAAoB,GAAsE;AACjG,QAAM,KAAK,EAAE,QAAQ,MAAM;AAC3B,QAAM,OAAO,EAAE,QAAQ,UAAU;AACjC,MAAI,KAAK,KAAK,OAAO,EAAG,QAAO;AAC/B,MAAI,KAAK,EAAG,QAAO,EAAE,iBAAiB,MAAM,eAAe,OAAO,EAAE;AACpE,MAAI,OAAO,EAAG,QAAO,EAAE,iBAAiB,IAAI,eAAe,KAAK,EAAE;AAClE,SAAO,KAAK,OACR,EAAE,iBAAiB,IAAI,eAAe,KAAK,EAAE,IAC7C,EAAE,iBAAiB,MAAM,eAAe,OAAO,EAAE;AACvD;AAEA,SAASC,eAAc,OAAgC;AACrD,MAAI,QAAQ;AACZ,MAAI;AACJ,MAAI;AACJ,QAAM,YAAsB,CAAC;AAC7B,aAAW,QAAQ,MAAM,MAAM,OAAO,GAAG;AACvC,QAAI,SAAS,MAAM,KAAK,WAAW,GAAG,EAAG;AACzC,UAAM,QAAQ,KAAK,QAAQ,GAAG;AAC9B,UAAM,QAAQ,QAAQ,IAAI,OAAO,KAAK,MAAM,GAAG,KAAK;AACpD,QAAI,QAAQ,QAAQ,IAAI,KAAK,KAAK,MAAM,QAAQ,CAAC;AACjD,QAAI,MAAM,WAAW,GAAG,EAAG,SAAQ,MAAM,MAAM,CAAC;AAChD,QAAI,UAAU,SAAS;AACrB,cAAQ;AAAA,IACV,WAAW,UAAU,QAAQ;AAC3B,gBAAU,KAAK,KAAK;AAAA,IACtB,WAAW,UAAU,MAAM;AACzB,WAAK;AAAA,IACP,WAAW,UAAU,SAAS;AAC5B,YAAM,SAAS,OAAO,SAAS,OAAO,EAAE;AACxC,UAAI,OAAO,SAAS,MAAM,KAAK,UAAU,EAAG,SAAQ;AAAA,IACtD;AAAA,EAEF;AAIA,MAAI,CAAC,SAAS,UAAU,WAAW,KAAK,OAAO,UAAa,UAAU,QAAW;AAC/E,WAAO;AAAA,EACT;AACA,SAAO;AAAA,IACL;AAAA,IACA,MAAM,UAAU,SAAS,IAAI,UAAU,KAAK,IAAI,IAAI;AAAA,IACpD;AAAA,IACA;AAAA,EACF;AACF;AAaA,SAAS,oBAAoB,WAAmB,UAA4C;AAC1F,MAAI;AACJ,MAAI;AACF,cAAU,KAAK,MAAM,QAAQ;AAAA,EAC/B,QAAQ;AACN,WAAO;AAAA,EACT;AACA,MAAI,OAAO,YAAY,YAAY,YAAY,QAAQ,MAAM,QAAQ,OAAO,EAAG,QAAO;AAItF,SAAO;AAAA,IACL,GAAI;AAAA,IACJ,YAAY;AAAA,EACd;AACF;AAeA,SAAS,0BAA0B,UAMjC;AACA,MAAI;AACJ,MAAI;AACF,cAAU,KAAK,MAAM,QAAQ;AAAA,EAC/B,QAAQ;AACN,WAAO;AAAA,MACL,UAAU;AAAA,MACV,MAAM;AAAA,MACN,SAAS;AAAA,MACT,WAAW;AAAA,MACX,OAAO,CAAC;AAAA,IACV;AAAA,EACF;AACA,MAAI,OAAO,YAAY,YAAY,YAAY,QAAQ,MAAM,QAAQ,OAAO,GAAG;AAC7E,WAAO;AAAA,MACL,UAAU;AAAA,MACV,MAAM;AAAA,MACN,SAAS;AAAA,MACT,WAAW;AAAA,MACX,OAAO,CAAC;AAAA,IACV;AAAA,EACF;AACA,QAAM,MAAM;AACZ,QAAM,UAAU,OAAO,IAAI,MAAM,MAAM,WAAY,IAAI,MAAM,IAAe;AAC5E,QAAM,UACJ,OAAO,IAAI,SAAS,MAAM,WAAY,IAAI,SAAS,IAAe;AAEpE,MAAI,WAAW,6BAA6B;AAC1C,WAAO;AAAA,MACL,UAAU;AAAA,MACV,MAAM,4BAA4B,OAAO;AAAA,MACzC;AAAA,MACA,WAAW;AAAA,MACX,OAAO;AAAA,IACT;AAAA,EACF;AACA,MAAI,WAAW,gCAAgC;AAC7C,WAAO;AAAA,MACL,UAAU;AAAA,MACV,MAAM,+BAA+B,OAAO;AAAA,MAC5C;AAAA,MACA,WAAW;AAAA,MACX,OAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AAAA,IACL,UAAU;AAAA,IACV,MAAM;AAAA,IACN,SAAS,UAAU,GAAG,OAAO,UAAU,OAAO,MAAM;AAAA,IACpD,WAAW;AAAA,IACX,OAAO;AAAA,EACT;AACF;AAEA,SAAS,WAAW,OAAoC;AACtD,MAAI,OAAO,UAAU,YAAY,UAAU,KAAM,QAAO;AACxD,QAAM,SAAU,MAAmC;AACnD,SAAO,OAAO,WAAW,WAAW,SAAS;AAC/C;AAEA,SAASH,eAAc,OAAwB;AAC7C,MAAI;AACF,WAAO,KAAK,UAAU,KAAK;AAAA,EAC7B,QAAQ;AACN,WAAO,OAAO,KAAK;AAAA,EACrB;AACF;AAEA,SAAS,OAAO,IAAoB;AAGlC,SAAO,KAAK,MAAM,KAAK,OAAO,IAAI,KAAK,IAAI,GAAG,EAAE,CAAC;AACnD;AAEA,SAAS,WAAW,IAAY,OAA2B,SAAyB;AAClF,QAAM,KAAK,SAAS;AACpB,MAAI,CAAC,OAAO,SAAS,EAAE,KAAK,MAAM,EAAG,QAAO;AAC5C,SAAO,KAAK,IAAI,KAAK,IAAI,IAAI,EAAE,GAAG,OAAO;AAC3C;AAEA,eAAe,eAAe,IAAY,QAAuC;AAC/E,MAAI,OAAO,QAAS,QAAO;AAC3B,SAAO,IAAI,QAAiB,CAAC,YAAY;AACvC,UAAM,QAAQ,WAAW,MAAM;AAC7B,aAAO,oBAAoB,SAAS,OAAO;AAC3C,cAAQ,IAAI;AAAA,IACd,GAAG,EAAE;AACL,UAAM,UAAU,MAAY;AAC1B,mBAAa,KAAK;AAClB,aAAO,oBAAoB,SAAS,OAAO;AAC3C,cAAQ,KAAK;AAAA,IACf;AACA,WAAO,iBAAiB,SAAS,SAAS,EAAE,MAAM,KAAK,CAAC;AAAA,EAC1D,CAAC;AACH;;;ACvwBO,IAAM,oBAAN,cAAgC,wBAAwB;AAAA,EAC7D,MAAM,OAAO;AACX,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,gCAAgC;AAAA,QACpD,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,YAAY,EAAE;AAAA,MACrD,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAM,OAAO,MAAsD;AACjE,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,KAAK,gCAAgC;AAAA,QACrD,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,YAAY,EAAE;AAAA,QACnD;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAM,OAAO,cAAqC;AAChD,UAAM,KAAK,OAAO,OAAO,gDAAgD;AAAA,MACvE,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,aAAa,eAAe,aAAa,EAAE;AAAA,IAClF,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,KAAK,cAAsB,MAAoD;AACnF,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,KAAK,qDAAqD;AAAA,QAC1E,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,aAAa,eAAe,aAAa,EAAE;AAAA,QAChF;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAM,aAAa;AACjB,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,IAAI,wCAAwC;AAAA,QAC5D,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,YAAY,EAAE;AAAA,MACrD,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAM,MAAM,MAA6C;AACvD,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,KAAK,sCAAsC;AAAA,QAC3D,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,YAAY,EAAE;AAAA,QACnD;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAM,OAAO;AACX,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,KAAK,qCAAqC;AAAA,QAC1D,QAAQ,EAAE,MAAM,EAAE,cAAc,KAAK,YAAY,EAAE;AAAA,MACrD,CAAC;AAAA,IACH;AAAA,EACF;AACF;;;ACXO,IAAM,6BAAN,cAAyC,MAAM;AAAA,EAC3C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAET,YACE,SACA,QACA,WACA,aACA,UACA;AACA,UAAM,OAAO;AACb,SAAK,OAAO;AACZ,SAAK,SAAS;AACd,SAAK,YAAY;AACjB,SAAK,cAAc;AACnB,SAAK,WAAW;AAAA,EAClB;AACF;AAuHA,IAAM,uBAAuB,oBAAI,IAAI,CAAC,MAAM,MAAM,MAAM,MAAM,IAAI,CAAC;AAUnE,IAAM,2BAA2B,oBAAI,IAAI,CAAC,MAAM,IAAI,CAAC;AAErD,IAAM,wBAAwB;AAE9B,IAAMI,4BAA2B;AACjC,IAAMC,wBAAuB;AAC7B,IAAMC,0BAAyB;AAC/B,IAAM,0BAA0B;AAuBzB,SAAS,4BACd,SAC6B;AAC7B,QAAM,UAAU,wBAAwB,QAAQ,gBAAgB;AAChE,QAAM,iBAAiB,QAAQ,kBAAkBF;AACjD,QAAM,aAAa,QAAQ,cAAcC;AACzC,QAAM,gBAAgB,QAAQ,iBAAiBC;AAC/C,QAAM,gBAAgB,QAAQ,iBAAiB;AAE/C,QAAM,kBAAkB,IAAI,gBAAgB;AAC5C,MAAI,QAAQ,QAAQ;AAClB,QAAI,QAAQ,OAAO,SAAS;AAC1B,sBAAgB,MAAM,QAAQ,OAAO,MAAM;AAAA,IAC7C,OAAO;AACL,YAAM,UAAU,MAAY,gBAAgB,MAAM,QAAQ,QAAQ,MAAM;AACxE,cAAQ,OAAO,iBAAiB,SAAS,SAAS,EAAE,MAAM,KAAK,CAAC;AAAA,IAClE;AAAA,EACF;AAEA,MAAI,gBAAkC;AACtC,MAAI,QAAoC;AACxC,MAAI,gBAAgB;AAEpB,WAAS,SAAS,MAAwC;AACxD,QAAI,UAAU,KAAM;AACpB,YAAQ;AACR,QAAI;AACF,cAAQ,gBAAgB,IAAI;AAAA,IAC9B,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,WAAS,YAAY,KAAuC;AAC1D,QAAI,cAAe;AACnB,oBAAgB;AAChB,aAAS,UAAU;AACnB,QAAI;AACF,cAAQ,UAAU,GAAG;AAAA,IACvB,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,QAAM,SAAsC;AAAA,IAC1C,IAAI,QAAQ;AACV,aAAO;AAAA,IACT;AAAA,IACA,IAAI,OAAO;AACT,aAAO;AAAA,IACT;AAAA,IACA,KAAK,MAAM;AACT,UAAI,CAAC,iBAAiB,cAAc,eAAe,GAAc;AAC/D,cAAM,IAAI,MAAM,kCAAkC,KAAK,EAAE;AAAA,MAC3D;AACA,oBAAc,KAAK,IAAI;AAAA,IACzB;AAAA,IACA,MAAM,MAAM,QAAQ;AAClB,sBAAgB,MAAM,IAAI,MAAM,UAAU,QAAQ,CAAC;AACnD,UAAI;AACF,uBAAe,MAAM,MAAM,MAAM;AAAA,MACnC,QAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AAEA,QAAM,OAAO,QAAQ;AAAA,IACnB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ,gBAAgB;AAAA,IACxB;AAAA,IACA;AAAA,IACA,WAAW,CAAC,MAAM;AAChB,sBAAgB;AAAA,IAClB;AAAA,EACF,CAAC;AAED,SAAO;AACT;AAwBA,eAAe,QAAQ,MAAkC;AACvD,QAAM,EAAE,SAAS,QAAQ,UAAU,aAAa,UAAU,IAAI;AAC9D,MAAI,UAAU;AACd,MAAI,UAAU,KAAK;AAEnB,SAAO,CAAC,OAAO,SAAS;AACtB,QAAI,UAAU,GAAG;AACf,eAAS,cAAc;AACvB,YAAM,UAAUC,QAAO,OAAO;AAC9B,UAAI;AACF,gBAAQ,cAAc,EAAE,SAAS,SAAS,SAAS,WAAW,OAAU,CAAC;AAAA,MAC3E,QAAQ;AAAA,MAER;AACA,YAAM,QAAQ,MAAMC,gBAAe,SAAS,MAAM;AAClD,UAAI,CAAC,MAAO;AACZ,gBAAU,KAAK,IAAI,UAAU,GAAG,KAAK,UAAU;AAAA,IACjD;AAEA,aAAS,YAAY,IAAI,eAAe,YAAY;AAEpD,QAAI;AACJ,QAAI;AACF,gBAAU,MAAMC,kBAAiB,IAAI;AAAA,IACvC,SAAS,KAAK;AAEZ;AAAA,QACE,IAAI;AAAA,UACF,eAAe,QAAQ,IAAI,UAAU;AAAA,UACrC;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AACA;AAAA,IACF,UAAE;AACA,gBAAU,IAAI;AAAA,IAChB;AAKA,QAAI,QAAQ,cAAc,UAAa,qBAAqB,IAAI,QAAQ,SAAS,GAAG;AAClF;AAAA,QACE,IAAI;AAAA,UACF,oCAAoC,QAAQ,SAAS,KAAK,QAAQ,eAAe,EAAE;AAAA,UACnF,QAAQ,cAAc,OAAO,SAAS;AAAA,UACtC,QAAQ;AAAA,UACR,QAAQ;AAAA,UACR;AAAA,QACF;AAAA,MACF;AACA;AAAA,IACF;AAEA,QAAI,QAAQ,WAAW,OAAO,SAAS;AACrC,eAAS,QAAQ;AACjB;AAAA,IACF;AAEA,QAAI,WAAW,KAAK,eAAe;AACjC;AAAA,QACE,IAAI;AAAA,UACF,+BAA+B,KAAK,aAAa;AAAA,UACjD;AAAA,UACA,QAAQ;AAAA,UACR,QAAQ;AAAA,UACR;AAAA,QACF;AAAA,MACF;AACA;AAAA,IACF;AAEA,QAAI,QAAQ,cAAc,UAAa,yBAAyB,IAAI,QAAQ,SAAS,GAAG;AAItF,gBAAU,KAAK,IAAI,SAAS,qBAAqB;AAAA,IACnD;AAEA,eAAW;AAAA,EACb;AAEA,WAAS,QAAQ;AACnB;AAEA,eAAeA,kBAAiB,MAA+C;AAC7E,QAAM,EAAE,SAAS,SAAS,QAAQ,UAAU,WAAW,cAAc,IAAI;AAEzE,MAAI;AACJ,MAAI;AACF,aAAS,QAAQ,QAAQ,KAAK,QAAQ,SAAS;AAAA,EACjD,SAAS,KAAK;AACZ,UAAM,eAAe,QAAQ,MAAM,IAAI,MAAM,OAAO,GAAG,CAAC;AAAA,EAC1D;AACA,YAAU,MAAM;AAEhB,SAAO,IAAI,QAA2B,CAAC,YAAY;AACjD,QAAI,gBAAsD;AAC1D,QAAI,WAAW;AAEf,aAAS,gBAAsB;AAC7B,UAAI,kBAAkB,MAAM;AAC1B,qBAAa,aAAa;AAC1B,wBAAgB;AAAA,MAClB;AAAA,IACF;AAEA,aAAS,cAAoB;AAC3B,UAAI,iBAAiB,EAAG;AACxB,oBAAc;AACd,sBAAgB,WAAW,MAAM;AAC/B,YAAI,SAAU;AACd,YAAI;AACF,iBAAO,MAAM,MAAM,cAAc;AAAA,QACnC,QAAQ;AAAA,QAER;AACA,iBAAS;AAAA,UACP,WAAW;AAAA,UACX,aAAa;AAAA,UACb,mBAAmB;AAAA,UACnB,SAAS;AAAA,QACX,CAAC;AAAA,MACH,GAAG,aAAa;AAAA,IAClB;AAEA,aAAS,SAAS,SAAkC;AAClD,UAAI,SAAU;AACd,iBAAW;AACX,oBAAc;AACd,aAAO,oBAAoB,SAAS,OAAO;AAC3C,UAAI;AACF,eAAO,oBAAoB,QAAQ,MAAM;AACzC,eAAO,oBAAoB,WAAW,SAAS;AAC/C,eAAO,oBAAoB,SAAS,OAAqE;AACzG,eAAO,oBAAoB,SAAS,aAAa;AAAA,MACnD,QAAQ;AAAA,MAER;AACA,cAAQ,OAAO;AAAA,IACjB;AAEA,aAAS,SAAe;AACtB,eAAS,MAAM;AACf,kBAAY;AAAA,IACd;AAEA,aAAS,UAAU,IAAwB;AACzC,kBAAY;AACZ,UAAI;AACF,gBAAQ,UAAU,EAAE;AAAA,MACtB,QAAQ;AAAA,MAGR;AAAA,IACF;AAKA,aAAS,QAAQ,IAA8C;AAC7D,eAAS,QAAQ;AACjB,eAAS;AAAA,QACP,WAAW,GAAG;AAAA,QACd,aAAa,GAAG;AAAA,QAChB,mBAAmB;AAAA,QACnB,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAEA,aAAS,gBAAsB;AAAA,IAI/B;AAEA,aAAS,UAAgB;AACvB,UAAI;AACF,eAAO,MAAM,KAAM,gBAAgB;AAAA,MACrC,QAAQ;AAAA,MAER;AACA,eAAS;AAAA,QACP,WAAW;AAAA,QACX,aAAa;AAAA,QACb,mBAAmB;AAAA,QACnB,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAEA,QAAI,OAAO,SAAS;AAClB,cAAQ;AACR;AAAA,IACF;AAEA,WAAO,iBAAiB,QAAQ,MAAM;AACtC,WAAO,iBAAiB,WAAW,SAAS;AAI5C,WAAO;AAAA,MACL;AAAA,MACA;AAAA,IACF;AACA,WAAO,iBAAiB,SAAS,aAAa;AAC9C,WAAO,iBAAiB,SAAS,SAAS,EAAE,MAAM,KAAK,CAAC;AAAA,EAC1D,CAAC;AACH;AAEA,SAAS,wBACP,SACkB;AAClB,MAAI,QAAS,QAAO;AACpB,QAAM,WAAY,WAAgD;AAClE,MAAI,CAAC,UAAU;AACb,WAAO,MAAM;AACX,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,SAAO,CAAC,KAAK,cAAc,IAAI,SAAS,KAAK,SAAS;AACxD;AAEA,SAASF,QAAO,IAAoB;AAClC,SAAO,KAAK,MAAM,KAAK,OAAO,IAAI,KAAK,IAAI,GAAG,EAAE,CAAC;AACnD;AAEA,eAAeC,gBAAe,IAAY,QAAuC;AAC/E,MAAI,OAAO,QAAS,QAAO;AAC3B,SAAO,IAAI,QAAiB,CAAC,YAAY;AACvC,UAAM,QAAQ,WAAW,MAAM;AAC7B,aAAO,oBAAoB,SAAS,OAAO;AAC3C,cAAQ,IAAI;AAAA,IACd,GAAG,EAAE;AACL,UAAM,UAAU,MAAY;AAC1B,mBAAa,KAAK;AAClB,aAAO,oBAAoB,SAAS,OAAO;AAC3C,cAAQ,KAAK;AAAA,IACf;AACA,WAAO,iBAAiB,SAAS,SAAS,EAAE,MAAM,KAAK,CAAC;AAAA,EAC1D,CAAC;AACH;;;AClhBA,IAAME,gCAA+B;AACrC,IAAMC,wBAAuB;AA+EtB,SAAS,sBAAsB,OAAsC;AAC1E,MAAI,CAAC,OAAO;AACV,UAAM,IAAI,mBAAmB,kDAAkD;AAAA,EACjF;AACA,MAAI,MAAM,SAASA,uBAAsB;AACvC,UAAM,IAAI;AAAA,MACR,8BAA8BA,qBAAoB;AAAA,IACpD;AAAA,EACF;AACA,MAAI,CAACD,8BAA6B,KAAK,KAAK,GAAG;AAC7C,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACA,SAAO,CAAC,QAAQ,KAAK;AACvB;AA+BO,IAAM,oBAAN,cAAgC,wBAAwB;AAAA,EAC5C;AAAA,EAEjB,YAAY,QAAuBE,cAAqB,cAAuB;AAC7E,UAAM,QAAQA,YAAW;AACzB,SAAK,eAAe;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,UAAU,SAAgE;AACxE,UAAM,MAAM,iBAAiB;AAAA,MAC3B,SAAS,KAAK,gBAAgB,KAAK;AAAA,MACnC,aAAa,KAAK;AAAA,MAClB,SAAS,QAAQ;AAAA,MACjB,aAAa,QAAQ;AAAA,IACvB,CAAC;AAED,UAAM,YAAY,sBAAsB,QAAQ,KAAK;AAErD,WAAO,4BAA4B;AAAA,MACjC;AAAA,MACA,WAAW,CAAC,GAAG,SAAS;AAAA,MACxB,WAAW,CAAC,OAAO;AACjB,cAAM,SAAS,mBAAmB,GAAG,IAAI;AACzC,YAAI,QAAQ;AACV,cAAI;AACF,oBAAQ,QAAQ,MAAM;AAAA,UACxB,QAAQ;AAAA,UAER;AAAA,QACF;AAAA,MACF;AAAA,MACA,eAAe,QAAQ;AAAA,MACvB,aAAa,QAAQ;AAAA,MACrB,SAAS,QAAQ;AAAA,MACjB,QAAQ,QAAQ;AAAA,MAChB,eAAe,QAAQ,iBAAiB;AAAA,MACxC,gBAAgB,QAAQ,kBAAkB;AAAA,MAC1C,YAAY,QAAQ,cAAc;AAAA,MAClC,eAAe,QAAQ,iBAAiB;AAAA,MACxC,kBAAkB,QAAQ;AAAA,IAC5B,CAAC;AAAA,EACH;AACF;AAaA,IAAM,cAAc;AAEpB,SAAS,iBAAiB,MAAoC;AAC5D,MAAI,CAAC,KAAK,aAAa;AACrB,UAAM,IAAI,mBAAmB,mDAAmD;AAAA,EAClF;AACA,MAAI,CAAC,KAAK,SAAS;AACjB,UAAM,IAAI,mBAAmB,yDAAyD;AAAA,EACxF;AACA,MAAI,KAAK,aAAa;AAIpB,WAAO,cAAc,KAAK,WAAW,EAAE,SAAS;AAAA,EAClD;AAIA,MAAI,CAAC,YAAY,KAAK,KAAK,OAAO,GAAG;AACnC,UAAM,IAAI;AAAA,MACR,oEAAoE,KAAK,OAAO;AAAA,IAClF;AAAA,EACF;AACA,SAAO,eAAe,KAAK,SAAS,KAAK,aAAa,KAAK,OAAO,EAAE,SAAS;AAC/E;AAEA,SAAS,cAAc,aAA0B;AAC/C,MAAI;AACJ,MAAI;AACF,UAAM,IAAI,IAAI,WAAW;AAAA,EAC3B,SAAS,OAAO;AACd,UAAM,IAAI;AAAA,MACR,wCAAwC,OAAO,KAAK,CAAC;AAAA,IACvD;AAAA,EACF;AACA,MAAI,IAAI,aAAa,SAAS,IAAI,aAAa,QAAQ;AACrD,UAAM,IAAI,mBAAmB,iDAAiD;AAAA,EAChF;AACA,MAAI,IAAI,UAAU,IAAI,MAAM;AAC1B,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,eAAe,SAAiBA,cAAqB,SAAsB;AAClF,MAAI;AACJ,MAAI;AACF,aAAS,IAAI,IAAI,OAAO;AAAA,EAC1B,SAAS,OAAO;AACd,UAAM,IAAI;AAAA,MACR,+CAA+C,OAAO,KAAK,CAAC;AAAA,IAC9D;AAAA,EACF;AAEA,MAAI;AACJ,MAAI,OAAO,aAAa,YAAY,OAAO,aAAa,OAAQ,UAAS;AAAA,WAChE,OAAO,aAAa,WAAW,OAAO,aAAa,MAAO,UAAS;AAAA,OACvE;AACH,UAAM,IAAI;AAAA,MACR,4EAA4E,OAAO;AAAA,IACrF;AAAA,EACF;AAGA,MAAI,OAAO,aAAa,OAAO,OAAO,aAAa,IAAI;AACrD,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACA,QAAM,MAAM,IAAI,IAAI,GAAG,MAAM,KAAK,OAAO,IAAI,OAAO,mBAAmBA,YAAW,CAAC,cAAc,mBAAmB,OAAO,CAAC,KAAK;AACjI,SAAO;AACT;AAgBA,SAAS,mBAAmB,MAAwC;AAClE,MAAI;AACJ,MAAI,OAAO,SAAS,UAAU;AAC5B,WAAO;AAAA,EACT,WAAW,gBAAgB,aAAa;AACtC,WAAO,IAAI,YAAY,EAAE,OAAO,IAAI;AAAA,EACtC,WAAW,YAAY,OAAO,IAAI,GAAG;AAInC,UAAM,OAAO;AACb,WAAO,IAAI,YAAY,EAAE;AAAA,MACvB,IAAI,WAAW,KAAK,QAAQ,KAAK,YAAY,KAAK,UAAU;AAAA,IAC9D;AAAA,EACF,OAAO;AACL,WAAO;AAAA,EACT;AAEA,MAAI;AACJ,MAAI;AACF,cAAU,KAAK,MAAM,IAAI;AAAA,EAC3B,QAAQ;AACN,WAAO;AAAA,EACT;AACA,MAAI,OAAO,YAAY,YAAY,YAAY,QAAQ,MAAM,QAAQ,OAAO,EAAG,QAAO;AACtF,QAAM,MAAM;AACZ,MAAI,OAAO,IAAI,MAAM,MAAM,SAAU,QAAO;AAC5C,SAAO;AACT;;;AClUO,IAAM,cAAc,CAAC,OAA4B;AACjD,IAAM,WAAW,CAAC,OAAyB;AAC3C,IAAM,UAAU,CAAC,OAAwB;AACzC,IAAM,YAAY,CAAC,OAA0B;AAC7C,IAAM,UAAU,CAAC,OAAwB;AACzC,IAAM,WAAW,CAAC,OAAyB;AAC3C,IAAM,YAAY,CAAC,OAA0B;AAC7C,IAAM,iBAAiB,CAAC,OAA+B;AACvD,IAAM,SAAS,CAAC,OAAuB;AACvC,IAAM,gBAAgB,CAAC,OAA8B;AACrD,IAAM,gBAAgB,CAAC,OAA8B;AACrD,IAAM,WAAW,CAAC,OAAyB;AAC3C,IAAM,UAAU,CAAC,OAAwB;AAIzC,IAAM,kBAAkB,CAAC,OAAgC;AACzD,IAAM,sBAAsB,CAAC,OAAoC;AAEjE,IAAM,aAAa,CAAC,OAA2B;AAC/C,IAAM,eAAe,CAAC,OAA6B;;;ACrD1D,IAAM,cAAc,IAAI,YAAY;AACpC,IAAM,wBAAwB,IAAI,KAAK;AAGvC,IAAI;AAwBG,IAAM,2BAAN,cAAuC,MAAM;AAAA,EAClD,YAAY,SAAiB;AAC3B,UAAM,OAAO;AACb,SAAK,OAAO;AACZ,WAAO,eAAe,MAAM,WAAW,SAAS;AAAA,EAClD;AACF;AAQA,eAAsB,uBACpB,kBACA,WACA,QACkB;AAClB,QAAM,UAAU,6BAA6B,kBAAkB,WAAW,MAAM;AAChF,QAAM,eAAe,aAAa,QAAQ,OAAO;AACjD,QAAM,oBAAoB,MAAM;AAAA,IAC9B;AAAA,IACA,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AACA,QAAM,kBAAkB,mBAAmB,QAAQ,SAAS;AAE5D,MAAI,CAAC,mBAAmB,CAAC,kBAAkB,mBAAmB,eAAe,GAAG;AAC9E,WAAO;AAAA,EACT;AAEA,MAAI,QAAQ,WAAW;AACrB,UAAM,cAAc,eAAe,QAAQ,SAAS;AACpD,QAAI,gBAAgB,OAAW,QAAO;AAEtC,UAAM,WAAW,QAAQ,YAAY;AACrC,UAAM,MAAM,KAAK,IAAI;AACrB,QAAI,cAAc,MAAM,YAAY,MAAM,cAAc,UAAU;AAChE,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;AAUA,eAAsB,kBACpB,kBACA,WACA,QAC0B;AAC1B,QAAM,UAAU,sBAAsB,kBAAkB,WAAW,MAAM;AACzE,QAAM,QAAQ,MAAM,uBAAuB,OAAO;AAElD,MAAI,CAAC,OAAO;AACV,UAAM,IAAI,yBAAyB,sCAAsC;AAAA,EAC3E;AAEA,QAAM,cAAc,cAAc,QAAQ,OAAO;AAEjD,MAAI;AACJ,MAAI;AACF,YAAQ,KAAK,MAAM,aAAa,QAAQ,OAAO;AAAA,EACjD,QAAQ;AACN,UAAM,IAAI,yBAAyB,8BAA8B;AAAA,EACnE;AAEA,MAAI,QAAQ,gBAAgB,MAAM,SAAS,QAAQ,cAAc;AAC/D,UAAM,IAAI;AAAA,MACR,2CAA2C,QAAQ,YAAY,cAAc,MAAM,IAAI;AAAA,IACzF;AAAA,EACF;AAEA,UAAQ,WAAW,KAAK;AACxB,SAAO;AACT;AAEA,SAAS,6BACP,kBACA,WACA,QAC4B;AAC5B,MACE,OAAO,qBAAqB,YAC5B,qBAAqB,QACrB,aAAa,kBACb;AACA,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,aAAa,CAAC,QAAQ;AACzB,UAAM,IAAI,UAAU,mCAAmC;AAAA,EACzD;AAEA,SAAO;AAAA,IACL,SAAS;AAAA,IACT;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,sBACP,kBACA,WACA,QAC6B;AAC7B,MACE,OAAO,qBAAqB,YAC5B,qBAAqB,QACrB,aAAa,kBACb;AACA,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,aAAa,CAAC,QAAQ;AACzB,UAAM,IAAI,UAAU,mCAAmC;AAAA,EACzD;AAEA,SAAO;AAAA,IACL,SAAS;AAAA,IACT;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,cAAc,SAAoD;AACzE,MAAI,OAAO,YAAY,SAAU,QAAO;AACxC,SAAO,IAAI,YAAY,EAAE,OAAO,aAAa,OAAO,CAAC;AACvD;AAEA,SAAS,aAAa,SAAwD;AAC5E,MAAI,OAAO,YAAY,SAAU,QAAO,YAAY,OAAO,OAAO;AAClE,MAAI,mBAAmB,WAAY,QAAO;AAC1C,SAAO,IAAI,WAAW,OAAO;AAC/B;AAEA,eAAe,mBACb,SACA,QACA,WACqB;AACrB,QAAM,SAAS,MAAM,iBAAiB;AACtC,QAAM,MAAM,MAAM,OAAO,OAAO;AAAA,IAC9B;AAAA,IACA,YAAY,OAAO,MAAM;AAAA,IACzB,EAAE,MAAM,QAAQ,MAAM,UAAU;AAAA,IAChC;AAAA,IACA,CAAC,MAAM;AAAA,EACT;AAEA,QAAM,UAAU,YACZ,kBAAkB,YAAY,OAAO,MAAM,SAAS,GAAG,GAAG,OAAO,IACjE;AAEJ,QAAM,MAAM,MAAM,OAAO,OAAO,KAAK,QAAQ,KAAK,eAAe,OAAO,CAAC;AACzE,SAAO,IAAI,WAAW,GAAG;AAC3B;AAEA,eAAe,mBAA2C;AACxD,MAAI,WAAW,QAAQ,QAAQ;AAC7B,WAAO,WAAW;AAAA,EACpB;AAEA,uBAAqB,OAAO,aAAa,EAAE,KAAK,CAAC,EAAE,UAAU,MAAM,SAA0B;AAC7F,SAAO,MAAM;AACf;AAEA,SAAS,mBAAmB,WAA2C;AACrE,QAAM,aAAa,UAAU,WAAW,SAAS,IAAI,UAAU,MAAM,CAAC,IAAI;AAC1E,MAAI,CAAC,iBAAiB,KAAK,UAAU,KAAK,WAAW,SAAS,MAAM,GAAG;AACrE,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,IAAI,WAAW,WAAW,SAAS,CAAC;AAClD,WAAS,QAAQ,GAAG,QAAQ,WAAW,QAAQ,SAAS,GAAG;AACzD,UAAM,QAAQ,CAAC,IAAI,OAAO,SAAS,WAAW,MAAM,OAAO,QAAQ,CAAC,GAAG,EAAE;AAAA,EAC3E;AACA,SAAO;AACT;AAEA,SAAS,kBAAkB,UAAsB,QAA6B;AAC5E,QAAM,YAAY,KAAK,IAAI,SAAS,QAAQ,OAAO,MAAM;AACzD,MAAI,OAAO,SAAS,SAAS,OAAO;AAEpC,WAAS,QAAQ,GAAG,QAAQ,WAAW,SAAS,GAAG;AACjD,aAAS,SAAS,KAAK,KAAK,MAAM,OAAO,KAAK,KAAK;AAAA,EACrD;AAEA,SAAO,SAAS;AAClB;AAEA,SAAS,eAAe,WAAuC;AAC7D,QAAM,UAAU,OAAO,SAAS;AAChC,MAAI,OAAO,SAAS,OAAO,GAAG;AAC5B,WAAO,UAAU,OAAoB,UAAU,MAAO;AAAA,EACxD;AAEA,QAAM,SAAS,KAAK,MAAM,SAAS;AACnC,SAAO,OAAO,MAAM,MAAM,IAAI,SAAY;AAC5C;AAEA,SAAS,kBAAkB,MAAkB,OAA+B;AAC1E,QAAM,WAAW,IAAI,WAAW,KAAK,SAAS,MAAM,MAAM;AAC1D,WAAS,IAAI,MAAM,CAAC;AACpB,WAAS,IAAI,OAAO,KAAK,MAAM;AAC/B,SAAO;AACT;AAEA,SAAS,eAAe,OAAgC;AACtD,QAAM,OAAO,WAAW,KAAK,KAAK;AAClC,SAAO,KAAK;AACd;;;ACnJO,IAAM,yBAAN,cAAqC,WAAW;AAAA,EACrD,YAAY,UAAU,uDAAuD;AAC3E,UAAM,SAAS,EAAE,WAAW,sBAAsB,CAAC;AAAA,EACrD;AACF;AAEO,IAAM,wBAAN,cAAoC,WAAW;AAAA,EACpD,YAAY,UAAU,qCAAqC;AACzD,UAAM,SAAS,EAAE,WAAW,qBAAqB,CAAC;AAAA,EACpD;AACF;AAEO,IAAM,2BAAN,cAAuC,oBAAoB;AAAA,EAChE,YAAY,UAAU,+CAA+C;AACnE,UAAM,SAAS,EAAE,WAAW,wBAAwB,CAAC;AAAA,EACvD;AACF;AAEO,IAAM,sBAAN,cAAkC,WAAW;AAAA,EAClD,cAAc;AACZ,UAAM,mBAAmB,EAAE,WAAW,kBAAkB,CAAC;AAAA,EAC3D;AACF;AAIA,IAAM,uBAAuB;AAE7B,eAAe,aACb,SACA,MACA,MACA,SACmB;AACnB,MAAI;AAIF,WAAO,MAAM,QAAQ,GAAG,OAAO,GAAG,IAAI,IAAI;AAAA,MACxC,QAAQ;AAAA,MACR,SAAS,EAAE,gBAAgB,oCAAoC;AAAA,MAC/D,MAAM,KAAK,SAAS;AAAA,MACpB,UAAU;AAAA,IACZ,CAAC;AAAA,EACH,SAAS,KAAK;AACZ,UAAM,IAAI,aAAa,6CAA6C,GAAG;AAAA,EACzE;AACF;AAEA,eAAe,kBACb,SACA,QACA,SAC6B;AAC7B,QAAM,OAAO,IAAI,gBAAgB;AACjC,MAAI,OAAO,kBAAmB,MAAK,IAAI,sBAAsB,OAAO,iBAAiB;AACrF,MAAI,OAAO,MAAO,MAAK,IAAI,SAAS,OAAO,KAAK;AAEhD,QAAM,MAAM,MAAM,aAAa,SAAS,gBAAgB,MAAM,OAAO;AAErE,MAAI,IAAI,WAAW,KAAK;AACtB,UAAM,aAAa,SAAS,IAAI,QAAQ,IAAI,aAAa,KAAK,IAAI,EAAE;AACpE,UAAM,IAAI,eAAe,gBAAgB;AAAA,MACvC,YAAY,MAAM,UAAU,IAAI,SAAY;AAAA,IAC9C,CAAC;AAAA,EACH;AACA,MAAI,CAAC,IAAI,IAAI;AACX,UAAM,MAAO,MAAM,IAAI,KAAK,EAAE,MAAM,OAAO,CAAC,EAAE;AAC9C,UAAM,IAAI,WAAW,IAAI,qBAAqB,mBAAmB,IAAI,MAAM,KAAK;AAAA,MAC9E,YAAY,IAAI;AAAA,MAChB,WAAW,IAAI;AAAA,IACjB,CAAC;AAAA,EACH;AACA,SAAQ,MAAM,IAAI,KAAK;AACzB;AAQA,eAAe,eACb,SACA,YACA,OACAC,cACA,SACqB;AACrB,QAAM,OAAO,IAAI,gBAAgB,EAAE,YAAY,eAAe,aAAa,WAAW,CAAC;AACvF,MAAI,MAAO,MAAK,IAAI,SAAS,KAAK;AAClC,MAAIA,aAAa,MAAK,IAAI,gBAAgBA,YAAW;AAErD,QAAM,MAAM,MAAM,aAAa,SAAS,UAAU,MAAM,OAAO;AAE/D,MAAI,IAAI,WAAW;AACjB,WAAO,EAAE,MAAM,mBAAmB,MAAO,MAAM,IAAI,KAAK,EAA6B;AACvF,MAAI,IAAI,WAAW;AACjB,WAAO,EAAE,MAAM,SAAS,MAAO,MAAM,IAAI,KAAK,EAA4B;AAE5E,MAAI,IAAI,WAAW,KAAK;AACtB,UAAM,MAAO,MAAM,IAAI,KAAK,EAAE,MAAM,OAAO,EAAE,OAAO,UAAU,EAAE;AAChE,QAAI,IAAI,UAAU,wBAAyB,QAAO,EAAE,MAAM,UAAU;AACpE,QAAI,IAAI,UAAU,YAAa,QAAO,EAAE,MAAM,YAAY;AAC1D,UAAM,IAAI,WAAW,IAAI,qBAAqB,IAAI,SAAS,wBAAwB;AAAA,MACjF,YAAY;AAAA,MACZ,WAAW,IAAI;AAAA,IACjB,CAAC;AAAA,EACH;AAEA,QAAM,IAAI,WAAW,mBAAmB,IAAI,MAAM,KAAK,EAAE,YAAY,IAAI,OAAO,CAAC;AACnF;AAEA,eAAe,eACb,SACA,QACA,SACgC;AAChC,QAAM,OAAO,IAAI,gBAAgB;AAAA,IAC/B,YAAY;AAAA,IACZ,eAAe,OAAO;AAAA,EACxB,CAAC;AACD,MAAI,OAAO,YAAa,MAAK,IAAI,gBAAgB,OAAO,WAAW;AACnE,MAAI,OAAO,MAAO,MAAK,IAAI,SAAS,OAAO,KAAK;AAEhD,QAAM,MAAM,MAAM,aAAa,SAAS,UAAU,MAAM,OAAO;AAE/D,MAAI,CAAC,IAAI,IAAI;AACX,UAAM,MAAO,MAAM,IAAI,KAAK,EAAE,MAAM,OAAO,CAAC,EAAE;AAC9C,UAAM,IAAI,WAAW,IAAI,qBAAqB,mBAAmB,IAAI,MAAM,KAAK;AAAA,MAC9E,YAAY,IAAI;AAAA,MAChB,WAAW,IAAI;AAAA,IACjB,CAAC;AAAA,EACH;AACA,SAAQ,MAAM,IAAI,KAAK;AACzB;AAIO,SAAS,iBAAiB,KAA6C;AAC5E,MAAI;AACF,UAAM,QAAQ,IAAI,MAAM,GAAG;AAC3B,QAAI,MAAM,WAAW,KAAK,CAAC,MAAM,CAAC,EAAG,QAAO;AAC5C,UAAM,UAAU,OAAO,KAAK,MAAM,CAAC,GAAG,WAAW,EAAE,SAAS;AAC5D,WAAO,KAAK,MAAM,OAAO;AAAA,EAC3B,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAIA,SAASC,OAAM,IAAY,QAAqC;AAC9D,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,QAAI,QAAQ,SAAS;AACnB,aAAO,IAAI,oBAAoB,CAAC;AAChC;AAAA,IACF;AACA,UAAM,QAAQ,WAAW,SAAS,EAAE;AACpC,YAAQ;AAAA,MACN;AAAA,MACA,MAAM;AACJ,qBAAa,KAAK;AAClB,eAAO,IAAI,oBAAoB,CAAC;AAAA,MAClC;AAAA,MACA,EAAE,MAAM,KAAK;AAAA,IACf;AAAA,EACF,CAAC;AACH;AAEA,SAAS,aAAa,OAA8B,qBAA0C;AAC5F,QAAM,SAAS,iBAAiB,MAAM,YAAY;AAClD,QAAMD,eAAc,uBAAwB,QAAQ,gBAA2B;AAC/E,MAAI,CAACA,cAAa;AAChB,UAAM,IAAI,WAAW,+CAA+C;AAAA,MAClE,WAAW;AAAA,IACb,CAAC;AAAA,EACH;AACA,SAAO;AAAA,IACL,aAAa,MAAM;AAAA,IACnB,cAAc,MAAM,iBAAiB;AAAA,IACrC,aAAAA;AAAA,IACA,WACG,QAAQ,QACR,MAAM,aACH,KAAK,MAAM,KAAK,IAAI,IAAI,GAAI,IAAI,MAAM,aACtC,KAAK,MAAM,KAAK,IAAI,IAAI,GAAI,IAAI;AAAA,IACtC,OAAO,MAAM;AAAA,EACf;AACF;AAEA,eAAe,gBACb,SACA,aACA,SAC4B;AAE5B,aAAW,QAAQ,CAAC,iBAAiB,OAAO,GAAG;AAC7C,UAAM,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,IAAI,IAAI;AAAA,MAC7C,SAAS,EAAE,eAAe,UAAU,WAAW,GAAG;AAAA,IACpD,CAAC;AACD,QAAI,IAAI,IAAI;AACV,YAAM,OAAQ,MAAM,IAAI,KAAK;AAG7B,cAAQ,KAAK,cAAc,CAAC,GAAG,IAAI,CAAC,QAAQ;AAAA,QAC1C,cAAc,GAAG;AAAA,QACjB,MAAM,GAAG;AAAA,QACT,MAAM,GAAG;AAAA,MACX,EAAE;AAAA,IACJ;AACA,QAAI,IAAI,WAAW,KAAK;AACtB,YAAM,IAAI,WAAW,+BAA+B,IAAI,MAAM,KAAK,EAAE,YAAY,IAAI,OAAO,CAAC;AAAA,IAC/F;AAAA,EACF;AACA,SAAO,CAAC;AACV;AAEA,eAAe,8BACb,SACA,OACA,SACA,SACqB;AACrB,MAAI,CAAC,MAAM,eAAe;AACxB,UAAM,IAAI,WAAW,yCAAyC,EAAE,WAAW,eAAe,CAAC;AAAA,EAC7F;AAEA,QAAM,aAAa,MAAM,gBAAgB,SAAS,MAAM,cAAc,OAAO;AAE7E,MAAI,WAAW,WAAW,GAAG;AAC3B,UAAM,IAAI;AAAA,MACR;AAAA,MACA,EAAE,WAAW,gBAAgB;AAAA,IAC/B;AAAA,EACF;AAEA,MAAI,WAAW,WAAW,KAAK,WAAW,CAAC,GAAG;AAC5C,UAAME,UAAS,MAAM;AAAA,MACnB;AAAA,MACA;AAAA,QACE,cAAc,MAAM;AAAA,QACpB,aAAa,WAAW,CAAC,EAAE;AAAA,QAC3B,OAAO,QAAQ;AAAA,MACjB;AAAA,MACA;AAAA,IACF;AACA,WAAO,aAAaA,SAAQ,WAAW,CAAC,EAAE,YAAY;AAAA,EACxD;AAEA,QAAMF,eAAc,MAAM,QAAQ,oBAAoB,UAAU;AAChE,QAAM,SAAS,MAAM;AAAA,IACnB;AAAA,IACA,EAAE,cAAc,MAAM,eAAe,aAAAA,cAAa,OAAO,QAAQ,MAAM;AAAA,IACvE;AAAA,EACF;AACA,SAAO,aAAa,QAAQA,YAAW;AACzC;AAEA,eAAe,0BACb,SACA,OACA,SACA,SACqB;AACrB,MAAI,CAAC,MAAM,eAAe;AACxB,UAAM,IAAI,WAAW,kDAAkD;AAAA,MACrE,WAAW;AAAA,IACb,CAAC;AAAA,EACH;AAEA,QAAMA,eAAc,MAAM,QAAQ,oBAAoB,MAAM,UAAU;AACtE,QAAM,SAAS,MAAM;AAAA,IACnB;AAAA,IACA,EAAE,cAAc,MAAM,eAAe,aAAAA,cAAa,OAAO,QAAQ,MAAM;AAAA,IACvE;AAAA,EACF;AACA,SAAO,aAAa,QAAQA,YAAW;AACzC;AAEA,eAAsB,oBAAoB,SAAsD;AAC9F,QAAM,WAAW,QAAQ,mBAAmB,sBAAsB,QAAQ,QAAQ,EAAE;AACpF,QAAM,UAAU,QAAQ,SAAS,WAAW;AAE5C,QAAM,WAAW,MAAM;AAAA,IACrB;AAAA,IACA,EAAE,mBAAmB,QAAQ,mBAAmB,OAAO,QAAQ,MAAM;AAAA,IACrE;AAAA,EACF;AAEA,QAAM,QAAQ,OAAO,QAAQ;AAG7B,MAAI,WAAW,SAAS,WAAW;AACnC,QAAM,WAAW,KAAK,IAAI,IAAI,SAAS,aAAa;AAEpD,SAAO,KAAK,IAAI,IAAI,UAAU;AAC5B,QAAI,QAAQ,QAAQ,QAAS,OAAM,IAAI,oBAAoB;AAE3D,UAAMC,OAAM,UAAU,QAAQ,MAAM;AAEpC,QAAI,QAAQ,QAAQ,QAAS,OAAM,IAAI,oBAAoB;AAE3D,YAAQ,WAAW,SAAS;AAE5B,QAAI;AACF,YAAM,SAAS,MAAM;AAAA,QACnB;AAAA,QACA,SAAS;AAAA,QACT,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR;AAAA,MACF;AAEA,UAAI,OAAO,SAAS,WAAW;AAC7B,gBAAQ,WAAW,uBAAuB;AAC1C;AAAA,MACF;AAGA,UAAI,OAAO,SAAS,aAAa;AAC/B,oBAAY;AACZ,gBAAQ,WAAW,WAAW;AAC9B;AAAA,MACF;AAEA,cAAQ,WAAW,UAAU;AAE7B,UAAI,OAAO,SAAS,SAAS;AAC3B,cAAM,SAAS,iBAAiB,OAAO,KAAK,YAAY;AACxD,cAAM,cAAc,QAAQ,uBAAuB,CAAC,QAAQ;AAC5D,YAAI,eAAe,OAAO,KAAK,eAAe;AAE5C,cAAI,QAAQ,aAAa;AACvB,kBAAM,SAAS,MAAM;AAAA,cACnB;AAAA,cACA;AAAA,gBACE,cAAc,OAAO,KAAK;AAAA,gBAC1B,aAAa,QAAQ;AAAA,gBACrB,OAAO,QAAQ;AAAA,cACjB;AAAA,cACA;AAAA,YACF;AACA,mBAAO,aAAa,QAAQ,QAAQ,WAAW;AAAA,UACjD;AACA,iBAAO,MAAM,8BAA8B,SAAS,OAAO,MAAM,SAAS,OAAO;AAAA,QACnF;AACA,eAAO,aAAa,OAAO,IAAI;AAAA,MACjC;AAGA,aAAO,MAAM,0BAA0B,SAAS,OAAO,MAAM,SAAS,OAAO;AAAA,IAC/E,SAAS,KAAK;AACZ,UAAI,eAAe,cAAc,IAAI,cAAc,iBAAiB;AAClE,gBAAQ,WAAW,SAAS;AAC5B,cAAM,IAAI,uBAAuB;AAAA,MACnC;AACA,UAAI,eAAe,cAAc,IAAI,cAAc,iBAAiB;AAClE,gBAAQ,WAAW,QAAQ;AAC3B,cAAM,IAAI,sBAAsB;AAAA,MAClC;AACA,YAAM;AAAA,IACR;AAAA,EACF;AAEA,UAAQ,WAAW,SAAS;AAC5B,QAAM,IAAI,uBAAuB;AACnC;AAIA,IAAM,yBAAyB;AAQxB,IAAM,eAAN,MAAmB;AAAA,EACP;AAAA,EACA;AAAA,EACA;AAAA,EACT,UAAoC;AAAA,EACpC,kBAAqD;AAAA,EAE7D,YAAY,SAA6B,CAAC,GAAG;AAC3C,SAAK,WAAW,OAAO,WAAW,IAAI,iBAAiB;AACvD,SAAK,YAAY,OAAO,mBAAmB,sBAAsB,QAAQ,QAAQ,EAAE;AACnF,SAAK,SAAS,OAAO,SAAS,WAAW;AAAA,EAC3C;AAAA,EAEA,MAAM,MAAM,QAAmC;AAC7C,UAAM,QAA2B;AAAA,MAC/B,cAAc,OAAO;AAAA,MACrB,eAAe,OAAO;AAAA,MACtB,cAAc,OAAO;AAAA,MACrB,YAAY,OAAO;AAAA,MACnB,OAAO,OAAO;AAAA,IAChB;AACA,SAAK,UAAU;AACf,UAAM,KAAK,SAAS,KAAK,KAAK;AAAA,EAChC;AAAA,EAEA,MAAM,iBAAyE;AAC7E,UAAM,QAAQ,MAAM,KAAK,YAAY;AACrC,QAAI,CAAC,MAAO,QAAO;AACnB,QAAI,MAAM,aAAa,KAAK,MAAM,KAAK,IAAI,IAAI,GAAI,KAAK,wBAAwB;AAC9E,aAAO,EAAE,OAAO,MAAM,cAAc,aAAa,MAAM,aAAa;AAAA,IACtE;AACA,UAAM,YAAY,MAAM,KAAK,SAAS,KAAK;AAC3C,WAAO,EAAE,OAAO,UAAU,cAAc,aAAa,UAAU,aAAa;AAAA,EAC9E;AAAA,EAEA,MAAM,iBAAmC;AACvC,WAAQ,MAAM,KAAK,YAAY,MAAO;AAAA,EACxC;AAAA,EAEA,MAAM,QAAuB;AAC3B,SAAK,UAAU;AACf,SAAK,kBAAkB;AACvB,UAAM,KAAK,SAAS,MAAM;AAAA,EAC5B;AAAA,EAEA,MAAc,cAAiD;AAC7D,QAAI,KAAK,QAAS,QAAO,KAAK;AAC9B,UAAM,SAAS,MAAM,KAAK,SAAS,KAAK;AACxC,QAAI,OAAQ,MAAK,UAAU;AAC3B,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,SAAS,SAAwD;AAC7E,QAAI,KAAK,gBAAiB,QAAO,KAAK;AACtC,SAAK,kBAAkB,KAAK,WAAW,OAAO,EAAE,QAAQ,MAAM;AAC5D,WAAK,kBAAkB;AAAA,IACzB,CAAC;AACD,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAc,WAAW,SAAwD;AAC/E,QAAI,CAAC,QAAQ,cAAe,OAAM,IAAI,yBAAyB,4BAA4B;AAE3F,QAAI;AACF,YAAM,WAAW,MAAM;AAAA,QACrB,KAAK;AAAA,QACL;AAAA,UACE,cAAc,QAAQ;AAAA,UACtB,aAAa,QAAQ;AAAA,UACrB,OAAO,QAAQ;AAAA,QACjB;AAAA,QACA,KAAK;AAAA,MACP;AACA,YAAM,SAAS,iBAAiB,SAAS,YAAY;AACrD,YAAM,YAA+B;AAAA,QACnC,cAAc,SAAS;AAAA,QACvB,eAAe,SAAS,iBAAiB,QAAQ;AAAA,QACjD,cAAc,QAAQ;AAAA,QACtB,YAAa,QAAQ,OAAkB,KAAK,MAAM,KAAK,IAAI,IAAI,GAAI,IAAI,SAAS;AAAA,QAChF,OAAO,SAAS,SAAS,QAAQ;AAAA,MACnC;AACA,WAAK,UAAU;AACf,YAAM,KAAK,SAAS,KAAK,SAAS;AAClC,aAAO;AAAA,IACT,SAAS,KAAK;AACZ,UACE,eAAe,eACd,IAAI,eAAe,OAAO,IAAI,cAAc,kBAC7C;AACA,cAAM,KAAK,MAAM;AACjB,cAAM,IAAI,yBAAyB;AAAA,MACrC;AACA,YAAM;AAAA,IACR;AAAA,EACF;AACF;AAIO,IAAM,mBAAN,MAA+C;AAAA,EACnC;AAAA,EACT;AAAA,EAER,YAAY,UAAmB;AAC7B,SAAK,gBAAgB;AAAA,EACvB;AAAA,EAEA,MAAc,YAA6B;AACzC,QAAI,KAAK,cAAe,QAAO,KAAK;AACpC,QAAI,KAAK,cAAe,QAAO,KAAK;AACpC,UAAM,KAAK,MAAM,OAAO,SAAS;AACjC,UAAM,OAAO,MAAM,OAAO,WAAW;AACrC,SAAK,gBAAgB,KAAK,KAAK,GAAG,QAAQ,GAAG,UAAU,kBAAkB;AACzE,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAM,OAA0C;AAC9C,UAAM,KAAK,MAAM,OAAO,kBAAkB;AAC1C,UAAM,WAAW,MAAM,KAAK,UAAU;AACtC,QAAI;AACF,YAAM,MAAM,MAAM,GAAG,SAAS,UAAU,OAAO;AAC/C,YAAM,OAAO,KAAK,MAAM,GAAG;AAC3B,UACE,OAAO,KAAK,iBAAiB,YAC7B,OAAO,KAAK,kBAAkB,YAC9B,OAAO,KAAK,iBAAiB,YAC7B,OAAO,KAAK,eAAe,UAC3B;AACA,eAAO;AAAA,MACT;AACA,aAAO;AAAA,IACT,SAAS,KAAc;AACrB,UAAI,OAAO,OAAO,QAAQ,YAAY,UAAU,OAAO,IAAI,SAAS,SAAU,QAAO;AACrF,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAM,KAAK,aAA+C;AACxD,UAAM,KAAK,MAAM,OAAO,kBAAkB;AAC1C,UAAM,OAAO,MAAM,OAAO,WAAW;AACrC,UAAM,WAAW,MAAM,KAAK,UAAU;AACtC,UAAM,GAAG,MAAM,KAAK,QAAQ,QAAQ,GAAG,EAAE,WAAW,MAAM,MAAM,IAAM,CAAC;AACvE,UAAM,GAAG,UAAU,UAAU,KAAK,UAAU,aAAa,MAAM,CAAC,IAAI,MAAM,EAAE,MAAM,IAAM,CAAC;AACzF,UAAM,GAAG,MAAM,UAAU,GAAK;AAAA,EAChC;AAAA,EAEA,MAAM,QAAuB;AAC3B,UAAM,KAAK,MAAM,OAAO,kBAAkB;AAC1C,UAAM,WAAW,MAAM,KAAK,UAAU;AACtC,QAAI;AACF,YAAM,GAAG,OAAO,QAAQ;AAAA,IAC1B,SAAS,KAAc;AACrB,UAAI,OAAO,OAAO,QAAQ,YAAY,UAAU,OAAO,IAAI,SAAS,SAAU;AAC9E,YAAM;AAAA,IACR;AAAA,EACF;AACF;AAEO,IAAM,qBAAN,MAAiD;AAAA,EAC9C,eAAyC;AAAA,EACjD,MAAM,OAA0C;AAC9C,WAAO,KAAK;AAAA,EACd;AAAA,EACA,MAAM,KAAK,aAA+C;AACxD,SAAK,eAAe,EAAE,GAAG,YAAY;AAAA,EACvC;AAAA,EACA,MAAM,QAAuB;AAC3B,SAAK,eAAe;AAAA,EACtB;AACF;AAIO,SAAS,6BAA6B,UAAsC;AACjF,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO,SAAS,gBAAgB;AAAA,IAChC;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO,SAAS,SAAS;AAAA,IACzB;AAAA,IACA,0BAA0B,KAAK,MAAM,SAAS,aAAa,EAAE,CAAC;AAAA,IAC9D;AAAA,EACF,EAAE,KAAK,IAAI;AACb;AAEO,SAAS,qBAAqB,UAAsC;AACzE,SAAO,WAAW,SAAS,yBAAyB;AACtD;AAEA,eAAsB,YAAY,KAA+B;AAC/D,QAAM,EAAE,MAAM,IAAI,MAAM,OAAO,oBAAoB;AAEnD,QAAM,UAA2D;AAAA,IAC/D,QAAQ,EAAE,KAAK,QAAQ,MAAM,CAAC,GAAG,EAAE;AAAA,IACnC,OAAO,EAAE,KAAK,OAAO,MAAM,CAAC,MAAM,SAAS,IAAI,GAAG,EAAE;AAAA,IACpD,OAAO,EAAE,KAAK,YAAY,MAAM,CAAC,GAAG,EAAE;AAAA,EACxC;AAEA,QAAM,SAAS,QAAQ,QAAQ,QAAQ;AACvC,MAAI,CAAC,OAAQ,QAAO;AAEpB,SAAO,IAAI,QAAQ,CAAC,YAAY;AAE9B,UAAM,QAAQ,MAAM,OAAO,KAAK,OAAO,MAAM,EAAE,OAAO,UAAU,OAAO,OAAO,UAAU,KAAK,CAAC;AAC9F,UAAM,GAAG,SAAS,MAAM,QAAQ,KAAK,CAAC;AACtC,UAAM,GAAG,SAAS,CAAC,SAAS,QAAQ,SAAS,CAAC,CAAC;AAC/C,UAAM,MAAM;AAAA,EACd,CAAC;AACH;AAEO,SAAS,oBAAoB,YAAuC;AACzE,QAAM,QAAQ,CAAC,IAAI,2BAA2B,EAAE;AAChD,aAAW,QAAQ,CAAC,IAAI,MAAM;AAC5B,UAAM,OAAO,GAAG,QAAQ,GAAG;AAC3B,UAAM,OAAO,GAAG,OAAO,KAAK,GAAG,IAAI,MAAM;AACzC,UAAM,KAAK,OAAO,IAAI,CAAC,KAAK,IAAI,GAAG,IAAI,EAAE;AACzC,QAAI,GAAG,KAAM,OAAM,KAAK,UAAU,GAAG,YAAY,EAAE;AAAA,EACrD,CAAC;AACD,QAAM,KAAK,EAAE;AACb,SAAO,MAAM,KAAK,IAAI;AACxB;;;A3CvnBO,IAAM,mBAAmB;AAkGzB,IAAM,cAAN,MAAM,aAAY;AAAA,EACd;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;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;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA;AAAA;AAAA,EAEA;AAAA,EAET,YAAY,QAA2B;AACrC,QAAI,CAAC,OAAO,UAAU,OAAO,OAAO,WAAW,UAAU;AACvD,YAAM,IAAI,mBAAmB,mDAAmD;AAAA,IAClF;AACA,QAAI,CAAC,OAAO,eAAe,OAAO,OAAO,gBAAgB,UAAU;AACjE,YAAM,IAAI,mBAAmB,wDAAwD;AAAA,IACvF;AAEA,UAAM,WAAW,OAAO,WAAW,kBAAkB,QAAQ,OAAO,EAAE;AAEtE,UAAM,SAAS,qBAAqB;AAAA,MAClC,QAAQ,OAAO;AAAA,MACf;AAAA,MACA,OAAO,OAAO;AAAA,MACd,YAAY,OAAO;AAAA,MACnB,SAAS,OAAO;AAAA,MAChB,SAAS,OAAO;AAAA,MAChB,OAAO,OAAO;AAAA,MACd,OAAO,OAAO;AAAA,IAChB,CAAC;AAED,iBAAY,QAAQ,MAAM,QAAQ,OAAO,aAAa,SAAS,OAAO,YAAY;AAAA,EACpF;AAAA,EAEA,YAAY,SAA4C;AACtD,WAAO,aAAY;AAAA,MACjB,oBAAoB,KAAK,KAAK,OAAO;AAAA,MACrC,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,IACP;AAAA,EACF;AAAA,EAEA,MAAM,IACJ,SACG,CAAC,IAAI,GACgD;AACxD,WAAO,aAAa,MAAM,KAAK,kBAAkB,MAAM,OAAO,IAAI,CAAC;AAAA,EAGrE;AAAA,EAEA,MAAM,KACJ,SACG,CAAC,IAAI,GACiD;AACzD,WAAO,aAAa,MAAM,KAAK,kBAAkB,MAAM,QAAQ,IAAI,CAAC;AAAA,EAGtE;AAAA,EAEA,MAAM,IACJ,SACG,CAAC,IAAI,GACgD;AACxD,WAAO,aAAa,MAAM,KAAK,kBAAkB,MAAM,OAAO,IAAI,CAAC;AAAA,EAGrE;AAAA,EAEA,MAAM,MACJ,SACG,CAAC,IAAI,GACkD;AAC1D,WAAO,aAAa,MAAM,KAAK,kBAAkB,MAAM,SAAS,IAAI,CAAC;AAAA,EAGvE;AAAA,EAEA,MAAM,OACJ,SACG,CAAC,IAAI,GACmD;AAC3D,WAAO,aAAa,MAAM,KAAK,kBAAkB,MAAM,UAAU,IAAI,CAAC;AAAA,EAGxE;AAAA,EAEA,MAAM,KACJ,SACG,CAAC,IAAI,GACiD;AACzD,WAAO,aAAa,MAAM,KAAK,kBAAkB,MAAM,QAAQ,IAAI,GAAG;AAAA,MACpE,gBAAgB;AAAA,IAClB,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,QACJ,SACG,CAAC,IAAI,GACoD;AAC5D,WAAO,aAAa,MAAM,KAAK,kBAAkB,MAAM,WAAW,IAAI,GAAG;AAAA,MACvE,gBAAgB;AAAA,IAClB,CAAC;AAAA,EACH;AAAA,EAgEA,YACE,QACA,MAC0E;AAE1E,UAAM,aAAa,KAAK,MAAM;AAC9B,WAAO,CAAC,SAAwC,WAAW,KAAK,MAAM,MAAM,IAAI;AAAA,EAClF;AAAA,EAEA,OAAe,mBACb,QACAE,cACA,SACA,cACa;AACb,UAAM,WAAW,OAAO,OAAO,aAAY,SAAS;AACpD,iBAAY,QAAQ,UAAU,QAAQA,cAAa,SAAS,YAAY;AACxE,WAAO;AAAA,EACT;AAAA,EAEA,OAAe,QACb,QACA,QACAA,cACA,SACA,cACM;AACN,UAAM,UAAU;AAEhB,YAAQ,cAAcA;AACtB,YAAQ,UAAU;AAClB,YAAQ,eAAe;AACtB,IAAC,OAA6C,MAAM;AAErD,YAAQ,aAAa,IAAI,mBAAmB,QAAQA,YAAW;AAC/D,YAAQ,UAAU,IAAI,gBAAgB,QAAQA,YAAW;AACzD,YAAQ,SAAS,IAAI,eAAe,QAAQA,YAAW;AACvD,YAAQ,SAAS,IAAI,eAAe,QAAQA,YAAW;AACvD,YAAQ,UAAU,IAAI,gBAAgB,QAAQA,YAAW;AACzD,YAAQ,YAAY,IAAI,kBAAkB,QAAQA,YAAW;AAC7D,YAAQ,WAAW,IAAI,iBAAiB,QAAQA,YAAW;AAC3D,YAAQ,WAAW,IAAI,iBAAiB,QAAQA,YAAW;AAC3D,YAAQ,gBAAgB,IAAI,sBAAsB,QAAQA,YAAW;AACrE,YAAQ,cAAc,IAAI,oBAAoB,QAAQA,YAAW;AACjE,YAAQ,QAAQ,IAAI,cAAc,QAAQA,YAAW;AACrD,YAAQ,QAAQ,IAAI,cAAc,QAAQA,YAAW;AACrD,YAAQ,gBAAgB,IAAI,sBAAsB,QAAQA,cAAa,YAAY;AACnF,YAAQ,eAAe,IAAI,qBAAqB,QAAQA,YAAW;AACnE,YAAQ,eAAe,IAAI,qBAAqB,QAAQA,YAAW;AACnE,YAAQ,YAAY,IAAI,kBAAkB,QAAQA,YAAW;AAC7D,YAAQ,cAAc,IAAI,oBAAoB,QAAQA,YAAW;AACjE,YAAQ,UAAU,IAAI,gBAAgB,QAAQA,YAAW;AACzD,YAAQ,WAAW,IAAI,iBAAiB,QAAQA,YAAW;AAC3D,YAAQ,UAAU,IAAI,gBAAgB,QAAQA,YAAW;AACzD,YAAQ,SAAS,IAAI,eAAe,QAAQA,YAAW;AACvD,YAAQ,WAAW,IAAI,iBAAiB,QAAQA,YAAW;AAC3D,YAAQ,cAAc,IAAI,oBAAoB,QAAQA,YAAW;AACjE,YAAQ,aAAa,IAAI,mBAAmB,QAAQA,YAAW;AAC/D,YAAQ,QAAQ,IAAI,cAAc,QAAQA,YAAW;AACrD,YAAQ,sBAAsB,IAAI,4BAA4B,QAAQA,YAAW;AACjF,YAAQ,SAAS,IAAI,eAAe,QAAQA,YAAW;AACvD,YAAQ,aAAa,IAAI,mBAAmB,QAAQA,YAAW;AAC/D,YAAQ,SAAS,IAAI,eAAe,QAAQA,YAAW;AACvD,YAAQ,YAAY,IAAI,kBAAkB,QAAQA,YAAW;AAC7D,YAAQ,YAAY,IAAI,kBAAkB,QAAQA,cAAa,YAAY;AAAA,EAC7E;AAAA,EAEA,MAAc,kBAIZ,MACA,QACA,MACkE;AAClE,UAAM,EAAE,YAAY,QAAQ,IAAI,4BAA4B,KAAK,GAAG;AACpE,UAAM,aAAa,oBAAoB,SAAS,gBAAgB,MAAM,MAAM,KAAK,WAAW,CAAC;AAC7F,UAAM,cAAc;AAAA,MAClB;AAAA,MACA;AAAA,IACF;AAEA,YAAQ,QAAQ;AAAA,MACd,KAAK;AACH,eAAO,MAAM,WAAW,IAAI,MAAe,WAAoB;AAAA,MACjE,KAAK;AACH,eAAO,MAAM,WAAW,KAAK,MAAe,WAAoB;AAAA,MAClE,KAAK;AACH,eAAO,MAAM,WAAW,IAAI,MAAe,WAAoB;AAAA,MACjE,KAAK;AACH,eAAO,MAAM,WAAW,MAAM,MAAe,WAAoB;AAAA,MACnE,KAAK;AACH,eAAO,MAAM,WAAW,OAAO,MAAe,WAAoB;AAAA,MACpE,KAAK;AACH,eAAO,MAAM,WAAW,KAAK,MAAe,WAAoB;AAAA,MAClE,KAAK;AACH,eAAO,MAAM,WAAW,QAAQ,MAAe,WAAoB;AAAA,IACvE;AAAA,EACF;AACF;AA4OA,SAAS,gBACP,MACA,MACAA,cACuD;AACvD,MAAI,CAAC,KAAK,SAAS,gBAAgB,GAAG;AACpC,WAAQ,QAAQ,CAAC;AAAA,EACnB;AAEA,QAAM,UAAW,QAAQ,CAAC;AAM1B,SAAO;AAAA,IACL,GAAG;AAAA,IACH,QAAQ;AAAA,MACN,GAAI,QAAQ,UAAU,CAAC;AAAA,MACvB,MAAM;AAAA,QACJ,GAAI,QAAQ,QAAQ,QAAQ,CAAC;AAAA,QAC7B,cAAcA;AAAA,MAChB;AAAA,IACF;AAAA,EACF;AACF;",
6
+ "names": ["createClientImport", "workspaceId", "agentId", "skillId", "actionId", "serviceId", "contextGraphId", "dataSourceId", "entityId", "dataSourceId", "eventId", "callId", "workspaceId", "serviceId", "entityId", "phoneNumberId", "integrationId", "entityId", "personaId", "entityId", "workspaceId", "safeStringify", "parseSSEFrames", "findFrameTerminator", "parseSSEBlock", "DEFAULT_INITIAL_DELAY_MS", "DEFAULT_MAX_DELAY_MS", "DEFAULT_MAX_RECONNECTS", "jitter", "abortableSleep", "runOneConnection", "WEB_SOCKET_PROTOCOL_TOKEN_RE", "MAX_AUTH_TOKEN_CHARS", "workspaceId", "workspaceId", "sleep", "scoped", "workspaceId"]
7
7
  }