@gravity-rail/sdk 0.1.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../../client/src/api/base.ts","../../client/src/api/apps.ts","../../client/src/api/builders.ts","../../client/src/api/cel.ts","../../client/src/api/org.ts","../../client/src/api/supervisors.ts","../../client/src/api/templates.ts","../../client/src/api/abilities.ts","../../client/src/api/accessGrants.ts","../../client/src/api/admin.ts","../../client/src/api/agents.ts","../../client/src/api/aiModels.ts","../../client/src/api/apiKeys.ts","../../client/src/api/assignments.ts","../../client/src/api/assistants.ts","../../client/src/api/auth.ts","../../client/src/api/calendars.ts","../../client/src/api/calls.ts","../../client/src/api/chats.ts","../../client/src/api/customToolkits.ts","../../client/src/api/dataTypes.ts","../../client/src/api/discord-bots.ts","../../client/src/api/slack-apps.ts","../../client/src/api/events.ts","../../client/src/api/features.ts","../../client/src/api/fhir-connections.ts","../../client/src/api/files.ts","../../client/src/api/inboxes.ts","../../client/src/api/inquiries.ts","../../client/src/api/appConnections.ts","../../client/src/api/mcpServers.ts","../../client/src/api/members.ts","../../client/src/api/milestones.ts","../../client/src/api/monday.ts","../../client/src/api/notificationRules.ts","../../client/src/api/operator-groups.ts","../../client/src/api/oauth.ts","../../client/src/api/phoneNumbers.ts","../../client/src/api/pronunciations.ts","../../client/src/api/qualifications.ts","../../client/src/api/reports.ts","../../client/src/api/sites.ts","../../client/src/api/subscriptions.ts","../../client/src/api/tasks.ts","../../client/src/api/toolkits.ts","../../client/src/api/workflows.ts","../../client/src/api/workspaceInvitations.ts","../../client/src/api/workspaces.ts","../../client/src/app-context.ts","../../client/src/api/workflow-notes.ts","../../client/src/client/api-modules.ts","../../client/src/client/bindings/access-grants.ts","../../client/src/client/bindings/agents.ts","../../client/src/client/bindings/tasks.ts","../../client/src/client/bindings/chats.ts","../../client/src/client/bindings/calls.ts","../../client/src/client/bindings/data-types.ts","../../client/src/client/bindings/members.ts","../../client/src/client/bindings/admin.ts","../../client/src/client/bindings/workspaces.ts","../../client/src/client/bindings/auth.ts","../../client/src/client/bindings/sites.ts","../../client/src/client/bindings/files.ts","../../client/src/client/bindings/events.ts","../../client/src/client/bindings/workflows.ts","../../client/src/client/bindings/calendars.ts","../../client/src/client/bindings/communications.ts","../../client/src/client/bindings/toolkits.ts","../../client/src/client/bindings/billing.ts","../../client/src/client/bindings/apps.ts","../../client/src/client/bindings/integrations.ts","../../client/src/client/bindings/operator-groups.ts","../../client/src/client/bindings/pronunciations.ts","../../client/src/client/bindings/qualifications.ts","../../client/src/client/client.ts","../../client/src/types/abilityTypes.ts","../../client/src/types/assistantTypes.ts","../../client/src/features/registry.ts","../../client/src/constants/chatTypes.ts","../../client/src/constants/models.ts","../../client/src/types/resourceMetadata.ts","../../client/src/scopes.ts","../../client/src/types/coreTypes.ts","../../client/src/types/memberTypes.ts","../../client/src/types/mcpServerTypes.ts","../../client/src/types/toolkitTypes.ts","../../client/src/types/eventTypes.ts","../../client/src/types/billingTypes.ts","../../client/src/types/workspaceTypes.ts","../../client/src/types/invitationTypes.ts","../../client/src/types/aiModelTypes.ts","../../client/src/types/fhirConnectionTypes.ts","../../client/src/types/qualificationTypes.ts","../../client/src/types/accessGrantTypes.ts"],"sourcesContent":["// Utility function to read a specific cookie value\nexport function getCookieValue(name: string): string | undefined {\n if (typeof document === 'undefined') return undefined;\n\n const cookies = document.cookie.split(';');\n for (const cookie of cookies) {\n const trimmedCookie = cookie.trim();\n const eqIndex = trimmedCookie.indexOf('=');\n if (eqIndex === -1) continue;\n\n const cookieName = trimmedCookie.substring(0, eqIndex);\n const cookieValue = trimmedCookie.substring(eqIndex + 1);\n\n if (cookieName === name) {\n return cookieValue;\n }\n }\n\n return undefined;\n}\n\nexport class ApiError extends Error {\n statusCode: number;\n errors?: string[];\n\n constructor(message: string, statusCode: number, errors?: string[]) {\n super(message);\n this.statusCode = statusCode;\n this.errors = errors;\n }\n}\n\n/**\n * Handler for enhanced authentication requirement (RFC 9470 Step-Up Authentication).\n * Called when a 401 response includes WWW-Authenticate header with\n * error=\"insufficient_user_authentication\".\n * Should return a promise that resolves with the new auth token after re-auth.\n */\nexport type EnhancedAuthHandler = () => Promise<string>;\n\n/**\n * Info parsed from WWW-Authenticate header for org auth requirement.\n */\nexport interface OrgAuthInfo {\n orgUuid: string;\n cookieName: string;\n authUrl: string;\n}\n\n/**\n * Handler for organization authentication requirement.\n * Called when a 401 response includes WWW-Authenticate header with realm=\"org\".\n * The handler should redirect the user to the auth URL for consent/SSO.\n * Returns a promise that resolves when the user should retry (after page reload with cookie).\n */\nexport type OrgAuthHandler = (info: OrgAuthInfo) => Promise<void>;\n\n/**\n * Check if a WWW-Authenticate header indicates step-up authentication is required.\n * Per RFC 9470, this is indicated by error=\"insufficient_user_authentication\".\n */\nfunction requiresStepUpAuth(wwwAuthenticate: string | null): boolean {\n if (!wwwAuthenticate) return false;\n return wwwAuthenticate.includes('error=\"insufficient_user_authentication\"');\n}\n\n/**\n * Parse org auth info from WWW-Authenticate header.\n * Returns null if this is not an org auth challenge.\n * Expected format: Bearer realm=\"org\", org_uuid=\"...\", cookie_name=\"...\", auth_url=\"...\"\n */\nfunction parseOrgAuthChallenge(wwwAuthenticate: string | null): OrgAuthInfo | null {\n if (!wwwAuthenticate) return null;\n if (!wwwAuthenticate.includes('realm=\"org\"')) return null;\n\n // Parse the key-value pairs from the header\n const orgUuidMatch = wwwAuthenticate.match(/org_uuid=\"([^\"]+)\"/);\n const cookieNameMatch = wwwAuthenticate.match(/cookie_name=\"([^\"]+)\"/);\n const authUrlMatch = wwwAuthenticate.match(/auth_url=\"([^\"]+)\"/);\n\n if (!orgUuidMatch?.[1] || !cookieNameMatch?.[1] || !authUrlMatch?.[1]) {\n console.warn('Invalid org auth challenge header:', wwwAuthenticate);\n return null;\n }\n\n return {\n orgUuid: orgUuidMatch[1],\n cookieName: cookieNameMatch[1],\n authUrl: authUrlMatch[1],\n };\n}\n\nexport class BaseApiClient {\n protected baseUrl: string;\n protected apiKey: string | undefined;\n protected isCrossDomain: boolean;\n protected fetchFunction: typeof fetch;\n private enhancedAuthHandler?: EnhancedAuthHandler;\n private enhancedAuthInProgress: Promise<string> | null = null;\n private orgAuthHandler?: OrgAuthHandler;\n private actingMemberUuid?: string;\n private orgToken?: string;\n\n constructor(apiKey: string | undefined, baseUrl: string, customFetch?: typeof fetch) {\n this.baseUrl = baseUrl;\n this.apiKey = apiKey;\n // console.log('[BaseApiClient] constructor - baseUrl:', baseUrl);\n // Bind fetch to its proper context (window in browser, global in Node)\n this.fetchFunction =\n customFetch || (typeof window !== 'undefined' ? fetch.bind(window) : fetch);\n\n // Determine if we're making cross-domain requests by comparing current origin to API origin\n const apiUrlParsed = new URL(baseUrl);\n const currentOrigin = typeof window !== 'undefined' ? window.location.origin : '';\n this.isCrossDomain = currentOrigin !== '' && currentOrigin !== apiUrlParsed.origin;\n // console.log('[BaseApiClient] isCrossDomain:', this.isCrossDomain, 'currentOrigin:', currentOrigin, 'apiOrigin:', apiUrlParsed.origin);\n }\n\n /**\n * Set the handler for enhanced authentication requirements (RFC 9470 Step-Up Auth).\n * This handler is called when a 401 response includes WWW-Authenticate header\n * with error=\"insufficient_user_authentication\".\n */\n setEnhancedAuthHandler(handler: EnhancedAuthHandler | undefined) {\n this.enhancedAuthHandler = handler;\n }\n\n /**\n * Set the handler for organization authentication requirements.\n * This handler is called when a 401 response includes WWW-Authenticate header\n * with realm=\"org\". The handler should redirect the user to complete org auth.\n */\n setOrgAuthHandler(handler: OrgAuthHandler | undefined) {\n this.orgAuthHandler = handler;\n }\n\n /**\n * Update the API key (used after successful re-authentication).\n */\n updateApiKey(newApiKey: string) {\n this.apiKey = newApiKey;\n }\n\n /**\n * Set the acting member UUID for member identity switching.\n * When set, all API requests will include the X-Acting-Member header.\n * The backend will validate that the authenticated account owns this member\n * and use it as the effective identity for the request.\n */\n setActingMember(memberUuid: string | undefined) {\n this.actingMemberUuid = memberUuid;\n }\n\n /**\n * Get the current acting member UUID.\n */\n getActingMember(): string | undefined {\n return this.actingMemberUuid;\n }\n\n /**\n * Set the org token for cross-domain requests.\n * When set, all API requests will include the X-Org-Token header,\n * allowing org-level SSO verification without cookies.\n */\n setOrgToken(token: string | undefined) {\n this.orgToken = token;\n }\n\n protected async fetch<T>(endpoint: string, options?: RequestInit): Promise<T> {\n try {\n const headers = new Headers({\n 'Content-Type': 'application/json',\n ...((options?.headers as Record<string, string>) || {}),\n });\n\n if (this.apiKey) {\n headers.set('Authorization', `Bearer ${this.apiKey}`);\n } else if (this.isCrossDomain) {\n // For cross-domain requests, try to use the requestToken cookie\n const requestToken = getCookieValue('requestToken');\n if (requestToken) {\n headers.set('Authorization', `Bearer ${requestToken}`);\n }\n }\n\n // Include X-Acting-Member header for member identity switching\n if (this.actingMemberUuid) {\n headers.set('X-Acting-Member', this.actingMemberUuid);\n }\n\n // Include X-Org-Token header for cross-domain org auth\n if (this.orgToken) {\n headers.set('X-Org-Token', this.orgToken);\n }\n\n // console.warn(\"Calling with apiKey:\", this.apiKey)\n const fullUrl = `${this.baseUrl}/api/v2/${endpoint}`;\n // console.log('[BaseApiClient] fetch - URL:', fullUrl, 'baseUrl:', this.baseUrl, 'endpoint:', endpoint);\n\n const response = await this.fetchFunction(fullUrl, {\n ...options,\n ...(this.apiKey ? {} : { credentials: 'include' }),\n ...(this.isCrossDomain ? { mode: 'cors' } : {}),\n headers,\n });\n\n if (!response.ok) {\n // Check for step-up auth requirement per RFC 9470 (superuser 2FA re-auth needed)\n if (\n response.status === 401 &&\n requiresStepUpAuth(response.headers.get('WWW-Authenticate')) &&\n this.enhancedAuthHandler\n ) {\n // If re-auth is already in progress, wait for it\n if (this.enhancedAuthInProgress) {\n await this.enhancedAuthInProgress;\n } else {\n // Trigger re-auth and wait for completion\n this.enhancedAuthInProgress = this.enhancedAuthHandler();\n try {\n const newToken = await this.enhancedAuthInProgress;\n this.apiKey = newToken;\n } finally {\n this.enhancedAuthInProgress = null;\n }\n }\n // Retry the request with the new token\n try {\n return await this.fetch<T>(endpoint, options);\n } catch (retryError) {\n this.orgToken = undefined;\n throw retryError;\n }\n }\n\n // Check for org auth requirement (realm=\"org\" in WWW-Authenticate)\n if (response.status === 401) {\n const orgAuthInfo = parseOrgAuthChallenge(response.headers.get('WWW-Authenticate'));\n if (orgAuthInfo && !this.orgToken) {\n // Try to read the client-readable mirror cookie (requestOrgToken{hash})\n const requestCookieName = orgAuthInfo.cookieName.replace(\n 'orgToken',\n 'requestOrgToken'\n );\n const cachedOrgToken = getCookieValue(requestCookieName);\n if (cachedOrgToken) {\n // Set the org token and retry the request\n this.orgToken = cachedOrgToken;\n try {\n return await this.fetch<T>(endpoint, options);\n } catch (retryError) {\n this.orgToken = undefined;\n throw retryError;\n }\n }\n\n // No cached token - fall through to org auth handler\n if (this.orgAuthHandler) {\n await this.orgAuthHandler(orgAuthInfo);\n throw new ApiError('Organization authentication required', 401);\n }\n }\n }\n\n const errorData = await response.json().catch(() => ({}));\n\n // Handle unauthorized errors for account endpoint\n if (response.status === 401 && endpoint === 'account') {\n throw new Error('unauthorized');\n }\n\n // Handle structured validation errors (Pydantic array format)\n if (Array.isArray(errorData.detail)) {\n const formattedErrors = errorData.detail\n .map((error: any) => {\n const location = error.loc.join(' > ');\n return `${location}: ${error.msg}`;\n })\n .join('\\n');\n throw new Error(`Validation Error:\\n${formattedErrors}`);\n }\n\n // Handle validation errors with errors array (new format)\n if (errorData.errors && Array.isArray(errorData.errors)) {\n const message = errorData.detail || 'Validation failed';\n throw new ApiError(message, response.status, errorData.errors);\n }\n\n // Handle structured errors (with error: true or with code property)\n const structuredError = errorData.detail || errorData;\n if (\n structuredError &&\n typeof structuredError === 'object' &&\n (structuredError.error === true || structuredError.code)\n ) {\n const message = structuredError.message || structuredError.code || 'Unknown error';\n const error = new ApiError(message, response.status);\n // Attach the full error data for frontend handling\n (error as any).errorData = structuredError;\n throw error;\n }\n\n // Handle simple error messages\n const errorMessage =\n typeof errorData.detail === 'string'\n ? errorData.detail\n : errorData.message || response.statusText;\n throw new ApiError(errorMessage, response.status);\n }\n\n // Handle 204 No Content - no JSON body to parse\n if (response.status === 204) {\n return undefined as any;\n }\n\n return response.json();\n } catch (error) {\n console.warn(error);\n throw error;\n }\n }\n\n protected async fetchRaw(endpoint: string, options?: RequestInit): Promise<Response> {\n try {\n const headers = new Headers({\n ...((options?.headers as Record<string, string>) || {}),\n });\n\n if (this.apiKey) {\n headers.set('Authorization', `Bearer ${this.apiKey}`);\n } else if (this.isCrossDomain) {\n // For cross-domain requests, try to use the requestToken cookie\n const requestToken = getCookieValue('requestToken');\n if (requestToken) {\n headers.set('Authorization', `Bearer ${requestToken}`);\n }\n }\n\n // Include X-Acting-Member header for member identity switching\n if (this.actingMemberUuid) {\n headers.set('X-Acting-Member', this.actingMemberUuid);\n }\n\n // Include X-Org-Token header for cross-domain org auth\n if (this.orgToken) {\n headers.set('X-Org-Token', this.orgToken);\n }\n\n const response = await this.fetchFunction(`${this.baseUrl}/api/v2/${endpoint}`, {\n ...options,\n ...(this.apiKey ? {} : { credentials: 'include' }),\n ...(this.isCrossDomain ? { mode: 'cors' } : {}),\n headers,\n });\n\n if (!response.ok) {\n // Check for step-up auth requirement per RFC 9470 (superuser 2FA re-auth needed)\n if (\n response.status === 401 &&\n requiresStepUpAuth(response.headers.get('WWW-Authenticate')) &&\n this.enhancedAuthHandler\n ) {\n // If re-auth is already in progress, wait for it\n if (this.enhancedAuthInProgress) {\n await this.enhancedAuthInProgress;\n } else {\n // Trigger re-auth and wait for completion\n this.enhancedAuthInProgress = this.enhancedAuthHandler();\n try {\n const newToken = await this.enhancedAuthInProgress;\n this.apiKey = newToken;\n } finally {\n this.enhancedAuthInProgress = null;\n }\n }\n // Retry the request with the new token\n try {\n return await this.fetchRaw(endpoint, options);\n } catch (retryError) {\n this.orgToken = undefined;\n throw retryError;\n }\n }\n\n // Check for org auth requirement (realm=\"org\" in WWW-Authenticate)\n if (response.status === 401) {\n const orgAuthInfo = parseOrgAuthChallenge(response.headers.get('WWW-Authenticate'));\n if (orgAuthInfo && !this.orgToken) {\n const requestCookieName = orgAuthInfo.cookieName.replace(\n 'orgToken',\n 'requestOrgToken'\n );\n const cachedOrgToken = getCookieValue(requestCookieName);\n if (cachedOrgToken) {\n this.orgToken = cachedOrgToken;\n try {\n return await this.fetchRaw(endpoint, options);\n } catch (retryError) {\n this.orgToken = undefined;\n throw retryError;\n }\n }\n\n if (this.orgAuthHandler) {\n await this.orgAuthHandler(orgAuthInfo);\n throw new ApiError('Organization authentication required', 401);\n }\n }\n }\n\n const errorText = await response.text().catch(() => '');\n throw new ApiError(errorText || response.statusText, response.status);\n }\n\n return response;\n } catch (error) {\n console.warn(error);\n throw error;\n }\n }\n\n /**\n * Fetch from root path (not prefixed with /api/v2/)\n * Used for OAuth and other non-API endpoints\n */\n protected async fetchRoot<T>(path: string, options?: RequestInit): Promise<T> {\n try {\n const headers = new Headers({\n 'Content-Type': 'application/json',\n ...((options?.headers as Record<string, string>) || {}),\n });\n\n if (this.apiKey) {\n headers.set('Authorization', `Bearer ${this.apiKey}`);\n } else if (this.isCrossDomain) {\n const requestToken = getCookieValue('requestToken');\n if (requestToken) {\n headers.set('Authorization', `Bearer ${requestToken}`);\n }\n }\n\n // Include X-Acting-Member header for member identity switching\n if (this.actingMemberUuid) {\n headers.set('X-Acting-Member', this.actingMemberUuid);\n }\n\n // Include X-Org-Token header for cross-domain org auth\n if (this.orgToken) {\n headers.set('X-Org-Token', this.orgToken);\n }\n\n const fullUrl = `${this.baseUrl}/${path}`;\n\n const response = await this.fetchFunction(fullUrl, {\n ...options,\n ...(this.apiKey ? {} : { credentials: 'include' }),\n ...(this.isCrossDomain ? { mode: 'cors' } : {}),\n headers,\n });\n\n if (!response.ok) {\n if (response.status === 404) {\n return null as T;\n }\n const errorData = await response.json().catch(() => ({}));\n const errorMessage = errorData.detail || errorData.message || response.statusText;\n throw new ApiError(errorMessage, response.status);\n }\n\n if (response.status === 204) {\n return undefined as T;\n }\n\n return response.json();\n } catch (error) {\n console.warn(error);\n throw error;\n }\n }\n}\n","import {\n App,\n AppCredentialResponse,\n AppListResponse,\n CreateAppRequest,\n UpdateAppRequest,\n} from '../types';\nimport { BaseApiClient } from './base';\n\nexport class AppsApi extends BaseApiClient {\n /**\n * List apps - either public apps, account's apps, or all apps visible to a workspace\n */\n async listApps(params?: { public?: boolean; workspaceUuid?: string; builderId?: number }): Promise<AppListResponse> {\n const queryParams = new URLSearchParams();\n if (params?.public) queryParams.append('public', 'true');\n if (params?.workspaceUuid !== undefined) queryParams.append('workspace_uuid', params.workspaceUuid);\n if (params?.builderId !== undefined) queryParams.append('builder_id', params.builderId.toString());\n const queryString = queryParams.toString();\n return this.fetch<AppListResponse>(`apps${queryString ? `?${queryString}` : ''}`);\n }\n\n /**\n * Create a new app\n */\n async createApp(request: CreateAppRequest): Promise<App> {\n return this.fetch<App>('apps', {\n method: 'POST',\n body: JSON.stringify(request),\n });\n }\n\n /**\n * Get details of a specific app\n */\n async getApp(appId: string): Promise<App> {\n return this.fetch<App>(`apps/${appId}`);\n }\n\n /**\n * Get app by client ID (for OAuth flows)\n */\n async getAppByClientId(clientId: string): Promise<App> {\n return this.fetch<App>(`apps/by-client-id/${clientId}`);\n }\n\n /**\n * Update an app\n */\n async updateApp(appId: string, request: UpdateAppRequest): Promise<App> {\n return this.fetch<App>(`apps/${appId}`, {\n method: 'PUT',\n body: JSON.stringify(request),\n });\n }\n\n /**\n * Delete an app\n */\n async deleteApp(appId: string): Promise<{ message: string }> {\n return this.fetch<{ message: string }>(`apps/${appId}`, {\n method: 'DELETE',\n });\n }\n\n /**\n * Regenerate client secret for an app\n */\n async regenerateClientSecret(appId: string): Promise<AppCredentialResponse> {\n return this.fetch<AppCredentialResponse>(`apps/${appId}/regenerate-secret`, {\n method: 'POST',\n });\n }\n}","import type { AppListResponse } from '../types/appTypes';\nimport type {\n Builder,\n BuilderListResponse,\n CreateBuilderRequest,\n UpdateBuilderRequest\n} from '../types/builderTypes';\nimport { BaseApiClient } from './base';\n\n/**\n * Builders API client\n */\nexport class BuildersApi extends BaseApiClient {\n /**\n * List all builders\n * @param all - If true, return all (superuser access required)\n */\n async listBuilders(\n all?: boolean,\n ): Promise<BuilderListResponse> {\n const params = new URLSearchParams();\n if (all !== undefined) params.append('all', String(all));\n \n const queryString = params.toString();\n const url = `builders${queryString ? `?${queryString}` : ''}`;\n \n return this.fetch<BuilderListResponse>(url);\n }\n\n /**\n * Get a specific builder by UUID\n * @param builderId - Builder UUID\n */\n async getBuilder(\n builderId: string,\n ): Promise<Builder> {\n return this.fetch<Builder>(`builders/${builderId}`);\n }\n\n /**\n * Create a new builder\n */\n async createBuilder(request: CreateBuilderRequest): Promise<Builder> {\n return this.fetch<Builder>('builders', {\n method: 'POST',\n body: JSON.stringify(request),\n });\n }\n\n /**\n * Update an existing builder\n */\n async updateBuilder(\n builderId: string,\n request: UpdateBuilderRequest\n ): Promise<Builder> {\n return this.fetch<Builder>(`builders/${builderId}`, {\n method: 'PUT',\n body: JSON.stringify(request),\n });\n }\n\n /**\n * Delete a builder\n */\n async deleteBuilder(builderId: string): Promise<{ message: string }> {\n return this.fetch<{ message: string }>(`builders/${builderId}`, {\n method: 'DELETE',\n });\n }\n\n /**\n * Get apps for a specific builder\n */\n async getBuilderApps(builderId: string): Promise<AppListResponse> {\n return this.fetch<AppListResponse>(`builders/${builderId}/apps`);\n }\n}","import { BaseApiClient } from './base';\nimport type { CELContextRequest, CELContextResponse } from '../types/celTypes';\n\nexport class CELApi extends BaseApiClient {\n /**\n * Get available CEL context for expression editing.\n *\n * Returns variables, custom functions, and operators appropriate for the given context\n * (event type, data type, context type, etc.).\n */\n async getCelContext(wid: string, request: CELContextRequest): Promise<CELContextResponse> {\n return this.fetch<CELContextResponse>(`w/${wid}/cel/context`, {\n method: 'POST',\n body: JSON.stringify(request),\n });\n }\n}\n","/**\n * Organization API client for /api/v2/o/{org_uuid}/ routes.\n *\n * This client handles organization-scoped operations using the new org routes\n * that support both numeric IDs and UUIDs (auto-detected on the backend).\n */\nimport {\n AddAccountToOrgRequest,\n AdminOrganization,\n CreateOrganizationInvitationFormData,\n CurrentOrgMember,\n Invitation,\n InvitationListResponse,\n InvitationStatus,\n MemberOrgView,\n OrgMember,\n OrgMemberListResponse,\n UpdateInvitationFormData,\n UpdateOrgMemberRequest,\n} from '../types';\nimport { BaseApiClient } from './base';\n\n/** Union type for organization response - admin view or member view */\nexport type OrganizationResponse = AdminOrganization | MemberOrgView;\n\nexport class OrgApi extends BaseApiClient {\n /**\n * Get organization by ID or UUID.\n * Returns different response based on user's role:\n * - Admins/Owners: AdminOrganization with full details\n * - Members: MemberOrgView with basic info and workspace list\n *\n * Use `viewType` field to determine the response type:\n * - 'admin': AdminOrganization\n * - 'member': MemberOrgView\n */\n async getOrganization(idOrUuid: number | string): Promise<OrganizationResponse> {\n return this.fetch<OrganizationResponse>(`o/${idOrUuid}`);\n }\n\n /**\n * Get the current user's membership in an organization.\n * Returns the user's org membership details including their role and scopes.\n */\n async getCurrentOrgMember(orgIdOrUuid: number | string): Promise<CurrentOrgMember> {\n return this.fetch<CurrentOrgMember>(`o/${orgIdOrUuid}/me`);\n }\n\n /**\n * List members of an organization.\n */\n async getOrganizationMembers(\n orgIdOrUuid: number | string,\n options?: {\n search?: string;\n page?: number;\n pageSize?: number;\n }\n ): Promise<OrgMemberListResponse> {\n const params = new URLSearchParams();\n if (options?.search) params.append('search', options.search);\n if (options?.page) params.append('page', options.page.toString());\n if (options?.pageSize) params.append('pageSize', options.pageSize.toString());\n\n return this.fetch<OrgMemberListResponse>(`o/${orgIdOrUuid}/members?${params.toString()}`);\n }\n\n /**\n * Add an account to an organization.\n */\n async addAccountToOrganization(\n orgIdOrUuid: number | string,\n data: AddAccountToOrgRequest\n ): Promise<OrgMember> {\n return this.fetch<OrgMember>(`o/${orgIdOrUuid}/members`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n /**\n * Check if an account is already a member of an organization.\n */\n async checkAccountMembership(\n orgUuid: string,\n accountUuid: string\n ): Promise<{ isMember: boolean }> {\n return this.fetch<{ isMember: boolean }>(`o/${orgUuid}/members/check/${accountUuid}`);\n }\n\n /**\n * Update an organization member's role.\n */\n async updateOrganizationMember(\n orgIdOrUuid: number | string,\n memberId: number,\n data: UpdateOrgMemberRequest\n ): Promise<OrgMember> {\n return this.fetch<OrgMember>(`o/${orgIdOrUuid}/members/${memberId}`, {\n method: 'PATCH',\n body: JSON.stringify(data),\n });\n }\n\n /**\n * Remove a member from an organization.\n */\n async removeOrganizationMember(orgIdOrUuid: number | string, memberId: number): Promise<void> {\n return this.fetch<void>(`o/${orgIdOrUuid}/members/${memberId}`, {\n method: 'DELETE',\n });\n }\n\n // ============================================================================\n // Organization Invitations API\n // ============================================================================\n\n /**\n * List invitations for an organization.\n */\n async listOrganizationInvitations(\n orgIdOrUuid: number | string,\n options?: {\n status?: InvitationStatus;\n page?: number;\n pageSize?: number;\n }\n ): Promise<InvitationListResponse> {\n const params = new URLSearchParams();\n if (options?.status) params.append('status', options.status);\n if (options?.page) params.append('page', options.page.toString());\n if (options?.pageSize) params.append('pageSize', options.pageSize.toString());\n\n return this.fetch<InvitationListResponse>(\n `o/${orgIdOrUuid}/invitations?${params.toString()}`\n );\n }\n\n /**\n * Create a new invitation to join the organization.\n */\n async createOrganizationInvitation(\n orgIdOrUuid: number | string,\n data: CreateOrganizationInvitationFormData\n ): Promise<Invitation> {\n return this.fetch<Invitation>(`o/${orgIdOrUuid}/invitations`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n /**\n * Get a specific organization invitation.\n */\n async getOrganizationInvitation(\n orgIdOrUuid: number | string,\n invitationId: number\n ): Promise<Invitation> {\n return this.fetch<Invitation>(`o/${orgIdOrUuid}/invitations/${invitationId}`);\n }\n\n /**\n * Update an organization invitation.\n */\n async updateOrganizationInvitation(\n orgIdOrUuid: number | string,\n invitationId: number,\n data: UpdateInvitationFormData\n ): Promise<Invitation> {\n return this.fetch<Invitation>(`o/${orgIdOrUuid}/invitations/${invitationId}`, {\n method: 'PUT',\n body: JSON.stringify(data),\n });\n }\n\n /**\n * Delete (cancel) an organization invitation.\n */\n async deleteOrganizationInvitation(\n orgIdOrUuid: number | string,\n invitationId: number\n ): Promise<void> {\n return this.fetch<void>(`o/${orgIdOrUuid}/invitations/${invitationId}`, {\n method: 'DELETE',\n });\n }\n\n /**\n * Resend an organization invitation email.\n */\n async resendOrganizationInvitation(\n orgIdOrUuid: number | string,\n invitationId: number\n ): Promise<{ message: string }> {\n return this.fetch<{ message: string }>(\n `o/${orgIdOrUuid}/invitations/${invitationId}/resend`,\n {\n method: 'POST',\n }\n );\n }\n}\n","import { BaseApiClient } from './base';\nimport { CustomTool } from '../types';\n\nexport interface SupervisorFormData {\n name: string;\n displayName?: string;\n description?: string;\n prompt: string;\n chatModel?: string;\n tools?: string[];\n files?: Array<{\n id: number;\n accessMode: string;\n choicePrompt?: string;\n }>;\n dataTypes?: Array<{\n id: number;\n accessMode: string;\n }>;\n}\n\nexport class SupervisorsApi extends BaseApiClient {\n async getSupervisors(wid: string): Promise<CustomTool[]> {\n return this.fetch<CustomTool[]>(`w/${wid}/supervisors`);\n }\n\n async getSupervisor(wid: string, id: number): Promise<CustomTool> {\n return this.fetch<CustomTool>(`w/${wid}/supervisors/${id}`);\n }\n\n async createSupervisor(wid: string, supervisor: SupervisorFormData): Promise<CustomTool> {\n return this.fetch<CustomTool>(`w/${wid}/supervisors`, {\n method: 'POST',\n body: JSON.stringify(supervisor),\n });\n }\n\n async updateSupervisor(\n wid: string,\n id: number,\n supervisor: Partial<SupervisorFormData>\n ): Promise<CustomTool> {\n return this.fetch<CustomTool>(`w/${wid}/supervisors/${id}`, {\n method: 'PUT',\n body: JSON.stringify(supervisor),\n });\n }\n\n async deleteSupervisor(wid: string, id: number): Promise<void> {\n return this.fetch(`w/${wid}/supervisors/${id}`, {\n method: 'DELETE',\n });\n }\n}\n","import { BaseApiClient } from './base';\n\n/**\n * A template variable available for autocomplete.\n */\nexport interface TemplateVariable {\n path: string; // e.g., \"record.data.title\"\n type: string; // e.g., \"string\", \"number\", \"date\"\n description: string; // e.g., \"Title field from the data record\"\n sampleValue: any; // e.g., \"a-title\" for string fields\n}\n\n/**\n * Parameters for requesting template context.\n */\nexport interface TemplateContextRequest {\n workflowId?: number;\n taskId?: number;\n dataTypeId?: number;\n eventType?: string; // e.g., \"data_record:created\"\n objectType?: string; // e.g., \"data_record\"\n}\n\n/**\n * Response containing available template variables and namespaces.\n */\nexport interface TemplateContextResponse {\n variables: TemplateVariable[];\n namespaces: string[]; // Available top-level namespaces\n sampleContext: Record<string, any>; // Full sample context for preview rendering\n}\n\n/**\n * Parameters for requesting a template preview.\n */\nexport interface TemplatePreviewRequest {\n template: string;\n workflowId?: number;\n taskId?: number;\n dataTypeId?: number;\n eventType?: string;\n objectType?: string;\n}\n\n/**\n * Response containing rendered template and any errors.\n */\nexport interface TemplatePreviewResponse {\n rendered: string;\n errors: string[];\n}\n\n/**\n * A variable from the central registry with extended metadata.\n */\nexport interface RegistryVariable {\n path: string; // e.g., \"member.name\"\n type: string; // e.g., \"string\", \"number\"\n description: string;\n example: any;\n namespace: string;\n deprecated: boolean;\n deprecatedFor?: string | null;\n permissionScope?: string | null;\n}\n\n/**\n * Parameters for requesting variables from the registry.\n */\nexport interface VariableRegistryRequest {\n eventType?: string;\n includeDeprecated?: boolean;\n}\n\n/**\n * Response containing variables from the central registry.\n */\nexport interface VariableRegistryResponse {\n variables: RegistryVariable[];\n namespaces: string[];\n sampleContext: Record<string, any>;\n}\n\nexport class TemplatesApi extends BaseApiClient {\n /**\n * Get available template variables and sample context for template editing.\n *\n * Returns variables appropriate for the given context (event type, data type, etc.)\n * with sample values for live preview.\n */\n async getTemplateContext(\n wid: string,\n request: TemplateContextRequest\n ): Promise<TemplateContextResponse> {\n return this.fetch<TemplateContextResponse>(`w/${wid}/templates/context`, {\n method: 'POST',\n body: JSON.stringify(request),\n });\n }\n\n /**\n * Render a template with sample data for preview.\n *\n * Uses the same Jinja2 renderer as the actual template system,\n * but with sample data instead of real data.\n */\n async previewTemplate(\n wid: string,\n request: TemplatePreviewRequest\n ): Promise<TemplatePreviewResponse> {\n return this.fetch<TemplatePreviewResponse>(`w/${wid}/templates/preview`, {\n method: 'POST',\n body: JSON.stringify(request),\n });\n }\n\n /**\n * Get variables from the central variable registry.\n *\n * This provides variables defined in the single source of truth registry\n * with extended metadata including deprecation info and permission scopes.\n */\n async getVariableRegistry(\n wid: string,\n request: VariableRegistryRequest = {}\n ): Promise<VariableRegistryResponse> {\n const params = new URLSearchParams();\n if (request.eventType) {\n params.append('event_type', request.eventType);\n }\n if (request.includeDeprecated) {\n params.append('include_deprecated', 'true');\n }\n const queryString = params.toString();\n const url = queryString\n ? `w/${wid}/templates/variables/registry?${queryString}`\n : `w/${wid}/templates/variables/registry`;\n return this.fetch<VariableRegistryResponse>(url, { method: 'GET' });\n }\n}\n","import type { AbilityTypesResponse } from '../types/abilityTypes';\nimport { BaseApiClient } from './base';\n\n/**\n * API client for ability types.\n * Abilities are now managed inline with their parent objects (workflows, tasks).\n */\nexport class AbilitiesApi extends BaseApiClient {\n /**\n * List all available ability types from the registry.\n */\n async getAbilityTypes(wid: string): Promise<AbilityTypesResponse> {\n return this.fetch<AbilityTypesResponse>(`w/${wid}/abilities/types`);\n }\n}\n","import { BaseApiClient } from './base';\nimport type {\n AccessGrant,\n CreateAccessGrantRequest,\n PaginatedResponse,\n ResolveGrantRequest,\n RevokeGrantRequest,\n} from '../types';\n\nexport class AccessGrantsApi extends BaseApiClient {\n async getMyReceivedGrants(\n wid: string,\n params?: { status?: string; page?: number; pageSize?: number }\n ): Promise<PaginatedResponse<AccessGrant>> {\n const searchParams = new URLSearchParams();\n if (params?.status) searchParams.set('status', params.status);\n if (params?.page) searchParams.set('page', params.page.toString());\n if (params?.pageSize) searchParams.set('page_size', params.pageSize.toString());\n const qs = searchParams.toString();\n return this.fetch<PaginatedResponse<AccessGrant>>(\n `w/${wid}/access-grants/my/received${qs ? `?${qs}` : ''}`\n );\n }\n\n async getMyGivenGrants(\n wid: string,\n params?: { status?: string; page?: number; pageSize?: number }\n ): Promise<PaginatedResponse<AccessGrant>> {\n const searchParams = new URLSearchParams();\n if (params?.status) searchParams.set('status', params.status);\n if (params?.page) searchParams.set('page', params.page.toString());\n if (params?.pageSize) searchParams.set('page_size', params.pageSize.toString());\n const qs = searchParams.toString();\n return this.fetch<PaginatedResponse<AccessGrant>>(\n `w/${wid}/access-grants/my/given${qs ? `?${qs}` : ''}`\n );\n }\n\n async getAccessGrant(wid: string, uuid: string): Promise<AccessGrant> {\n return this.fetch<AccessGrant>(`w/${wid}/access-grants/${uuid}`);\n }\n\n async createAccessGrant(wid: string, data: CreateAccessGrantRequest): Promise<AccessGrant> {\n return this.fetch<AccessGrant>(`w/${wid}/access-grants`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n async resolveAccessGrant(\n wid: string,\n uuid: string,\n data: ResolveGrantRequest\n ): Promise<AccessGrant> {\n return this.fetch<AccessGrant>(`w/${wid}/access-grants/${uuid}/resolve`, {\n method: 'PUT',\n body: JSON.stringify(data),\n });\n }\n\n async revokeAccessGrant(\n wid: string,\n uuid: string,\n data: RevokeGrantRequest\n ): Promise<AccessGrant> {\n return this.fetch<AccessGrant>(`w/${wid}/access-grants/${uuid}/revoke`, {\n method: 'PUT',\n body: JSON.stringify(data),\n });\n }\n\n async getAccessGrants(\n wid: string,\n params?: {\n status?: string;\n resourceType?: string;\n resourceId?: number;\n page?: number;\n pageSize?: number;\n }\n ): Promise<PaginatedResponse<AccessGrant>> {\n const searchParams = new URLSearchParams();\n if (params?.status) searchParams.set('status', params.status);\n if (params?.resourceType) searchParams.set('resource_type', params.resourceType);\n if (params?.resourceId) searchParams.set('resource_id', params.resourceId.toString());\n if (params?.page) searchParams.set('page', params.page.toString());\n if (params?.pageSize) searchParams.set('pageSize', params.pageSize.toString());\n const qs = searchParams.toString();\n return this.fetch<PaginatedResponse<AccessGrant>>(\n `w/${wid}/access-grants${qs ? `?${qs}` : ''}`\n );\n }\n\n async getMemberGrants(wid: string, memberId: number): Promise<AccessGrant[]> {\n const resp = await this.fetch<PaginatedResponse<AccessGrant>>(\n `w/${wid}/access-grants/member/${memberId}`\n );\n return resp.items;\n }\n}\n","import {\n Account,\n AccountLookupResponse,\n AccountSortField,\n AdminAccount,\n HealthMetricsRequest,\n HealthMetricsResponse,\n AdminAccountFormData,\n AdminAccountMembership,\n AdminAccountOrgMembership,\n AdminOrganization,\n AdminPhoneNumberMappingRequest,\n AdminUpdateProductRequest,\n MemberOrgView,\n AdminWorkspace,\n AdminWorkspaceFormData,\n AdminWorkspaceMemberFormData,\n BillingDashboardResponse,\n CompareWithStripeResponse,\n UsageReport,\n UsageReportRequest,\n VoiceMetricsResponse,\n CreateOrganizationRequest,\n CreateProductRequest,\n GenerateSummariesResponse,\n InboxMappingDetailResponse,\n LogoUploadRequest,\n LogoUploadResponse,\n Member,\n MemberRole,\n MergeMembersRequest,\n MergeMembersResponse,\n MissingMembershipItem,\n PaginatedResponse,\n PaginatedSubscriptionsResponse,\n PhoneNumber,\n UnmappedPhoneNumber,\n PhoneNumberMappingFormData,\n PhoneNumberMappingResponse,\n Product,\n ProvisionPlanRequest,\n ProvisionPlanResponse,\n SiteMapping,\n SiteMappingFormData,\n SortOrder,\n StripeCustomer,\n StripeCustomerCreateRequest,\n StripeCustomerUpdateRequest,\n StripePaymentMethod,\n StripeSubscriptionCreateRequest,\n StripeSubscriptionUpdateRequest,\n Subscription,\n SyncProductToStripeRequest,\n SyncProductToStripeResponse,\n SyncUsageRequest,\n SyncUsageResponse,\n ThemesListResponse,\n ProviderPhoneNumber,\n PhoneNumberStatus,\n UpdateOrganizationRequest,\n Workspace,\n WorkspaceHealthResponse,\n WorkspaceSortField,\n} from '../types';\nimport { BaseApiClient } from './base';\n\nexport class AdminApi extends BaseApiClient {\n // Admin Accounts API\n async getAccounts(options: {\n search?: string;\n createdAfter?: string;\n createdBefore?: string;\n isActive?: boolean;\n organizationId?: number;\n sortBy?: AccountSortField;\n sortOrder?: SortOrder;\n page?: number;\n pageSize?: number;\n }): Promise<PaginatedResponse<Account>> {\n const params = new URLSearchParams();\n if (options.search) params.append('search', options.search);\n if (options.createdAfter) params.append('created_after', options.createdAfter);\n if (options.createdBefore) params.append('created_before', options.createdBefore);\n if (options.sortBy) params.append('sortBy', options.sortBy);\n if (options.sortOrder) params.append('sortOrder', options.sortOrder);\n if (options.page) params.append('page', options.page.toString());\n if (options.pageSize) params.append('pageSize', options.pageSize.toString());\n if (options.isActive !== undefined) params.append('isActive', options.isActive.toString());\n if (options.organizationId !== undefined)\n params.append('organizationId', options.organizationId.toString());\n\n return this.fetch<PaginatedResponse<Account>>(`admin/accounts?${params.toString()}`);\n }\n\n async getAccountDetails(id: string | number): Promise<AdminAccount> {\n return this.fetch<AdminAccount>(`admin/accounts/${id}`);\n }\n\n async getAccountByUuid(uuid: string): Promise<AdminAccount> {\n return this.fetch<AdminAccount>(`admin/accounts/${uuid}`);\n }\n\n async getAccountMemberships(accountId: number): Promise<AdminAccountMembership[]> {\n return this.fetch<AdminAccountMembership[]>(`admin/accounts/${accountId}/memberships`);\n }\n\n async getAccountOrgMemberships(accountId: number): Promise<AdminAccountOrgMembership[]> {\n return this.fetch<AdminAccountOrgMembership[]>(`admin/accounts/${accountId}/org-memberships`);\n }\n\n async createAccountOrgMembership(\n accountId: number,\n organizationId: number,\n role: 'member' | 'admin' | 'owner' = 'member'\n ): Promise<{\n accountId: number;\n organizationId: number;\n organizationUuid: string;\n organizationName: string;\n role: string;\n message: string;\n }> {\n return this.fetch(`admin/accounts/${accountId}/org-memberships`, {\n method: 'POST',\n body: JSON.stringify({ organizationId, role }),\n });\n }\n\n async deleteAccountOrgMembership(\n accountId: number,\n organizationId: number\n ): Promise<{\n status: string;\n message: string;\n workspaceMembershipsRemoved: number;\n }> {\n return this.fetch(`admin/accounts/${accountId}/org-memberships/${organizationId}`, {\n method: 'DELETE',\n });\n }\n\n async getAccountMembership(\n accountId: number,\n workspaceId: string\n ): Promise<AdminAccountMembership> {\n return this.fetch<AdminAccountMembership>(\n `admin/accounts/${accountId}/memberships/${workspaceId}`\n );\n }\n\n async updateAccountMembership(\n accountId: number,\n workspaceId: string,\n updates: AdminWorkspaceMemberFormData\n ): Promise<AdminAccountMembership> {\n return this.fetch<AdminAccountMembership>(\n `admin/accounts/${accountId}/memberships/${workspaceId}`,\n {\n method: 'PUT',\n body: JSON.stringify(updates),\n }\n );\n }\n\n async createAccountMembership(\n accountId: number,\n workspaceId: string,\n data: { memberRoleId: number }\n ): Promise<AdminAccountMembership> {\n return this.fetch<AdminAccountMembership>(\n `admin/accounts/${accountId}/memberships/${workspaceId}`,\n {\n method: 'POST',\n body: JSON.stringify(data),\n }\n );\n }\n\n async deleteAccountMembership(accountId: number, workspaceId: string): Promise<void> {\n return this.fetch<void>(`admin/accounts/${accountId}/memberships/${workspaceId}`, {\n method: 'DELETE',\n });\n }\n\n async updateAccountAsAdmin(\n id: string | number,\n updates: AdminAccountFormData\n ): Promise<AdminAccount> {\n return this.fetch<AdminAccount>(`admin/accounts/${id}`, {\n method: 'PUT',\n body: JSON.stringify(updates),\n });\n }\n\n async createAccountAsAdmin(data: AdminAccountFormData): Promise<AdminAccount> {\n return this.fetch<AdminAccount>('admin/accounts', {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n async deleteAccountAsAdmin(id: number): Promise<void> {\n return this.fetch(`admin/accounts/${id}`, {\n method: 'DELETE',\n });\n }\n\n /**\n * Look up an account by email or phone. Returns verification status.\n * Used to check if a verified account exists before creating a new one.\n */\n async lookupAccount(options: {\n email?: string;\n phone?: string;\n }): Promise<AccountLookupResponse> {\n const params = new URLSearchParams();\n if (options.email) params.append('email', options.email);\n if (options.phone) params.append('phone', options.phone);\n\n return this.fetch<AccountLookupResponse>(`admin/accounts/lookup?${params.toString()}`);\n }\n\n // Admin Organizations API\n async getOrganizations(options?: {\n search?: string;\n page?: number;\n pageSize?: number;\n }): Promise<PaginatedResponse<AdminOrganization>> {\n const params = new URLSearchParams();\n if (options?.search) params.append('search', options.search);\n if (options?.page) params.append('page', options.page.toString());\n if (options?.pageSize) params.append('pageSize', options.pageSize.toString());\n\n return this.fetch<PaginatedResponse<AdminOrganization>>(\n `admin/organizations?${params.toString()}`\n );\n }\n\n /**\n * Get organization by ID or UUID.\n * Returns different response based on user's role:\n * - Admins/Owners: AdminOrganization with full details\n * - Members: MemberOrgView with basic info and workspace list\n *\n * Use `viewType` field to determine the response type:\n * - 'admin': AdminOrganization\n * - 'member': MemberOrgView\n */\n async getOrganization(idOrUuid: number | string): Promise<AdminOrganization | MemberOrgView> {\n return this.fetch<AdminOrganization | MemberOrgView>(`o/${idOrUuid}`);\n }\n\n async createOrganization(data: CreateOrganizationRequest): Promise<AdminOrganization> {\n return this.fetch<AdminOrganization>('admin/organizations', {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n async updateOrganization(\n id: number,\n data: UpdateOrganizationRequest\n ): Promise<AdminOrganization> {\n return this.fetch<AdminOrganization>(`admin/organizations/${id}`, {\n method: 'PUT',\n body: JSON.stringify(data),\n });\n }\n\n async deleteOrganization(id: number): Promise<void> {\n return this.fetch(`admin/organizations/${id}`, {\n method: 'DELETE',\n });\n }\n\n /**\n * Join an organization with a specified role (superuser only).\n * Creates or updates membership in the target org.\n * @param orgUuid - Organization UUID or numeric ID as string\n */\n async joinOrganization(\n orgUuid: string,\n role: 'member' | 'admin' | 'owner' = 'owner'\n ): Promise<{\n accountId: number;\n organizationId: number;\n organizationUuid: string;\n email: string | null;\n role: string;\n message: string;\n }> {\n return this.fetch(`admin/organizations/${orgUuid}/join`, {\n method: 'POST',\n body: JSON.stringify({ role }),\n });\n }\n\n /**\n * Leave an organization (superuser only).\n * @param orgUuid - Organization UUID or numeric ID as string\n */\n async leaveOrganization(orgUuid: string): Promise<{ status: string; message: string }> {\n return this.fetch(`admin/organizations/${orgUuid}/join`, {\n method: 'DELETE',\n });\n }\n\n async generateLogoUploadUrl(\n organizationUuid: string,\n data: LogoUploadRequest\n ): Promise<LogoUploadResponse> {\n return this.fetch<LogoUploadResponse>(`o/${organizationUuid}/logo-upload-url`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n // Organization Members API - moved to OrgApi at /api/v2/o/{org_uuid}/members\n // See packages/client/src/api/org.ts\n\n // Organization Invitations API - moved to OrgApi at /api/v2/o/{org_uuid}/invitations\n // See packages/client/src/api/org.ts\n\n // Admin Products API\n async importProducts(workspaceId: number): Promise<void> {\n return this.fetch('admin/import-products', {\n method: 'POST',\n body: JSON.stringify({ workspaceId }),\n });\n }\n\n // ===== Product CRUD =====\n\n async createProductAsAdmin(product: CreateProductRequest): Promise<Product> {\n return this.fetch<Product>('admin/products', {\n method: 'POST',\n body: JSON.stringify(product),\n });\n }\n\n async getProductsAsAdmin(workspaceUuid?: string, productTypes?: string[]): Promise<Product[]> {\n const params = new URLSearchParams();\n if (workspaceUuid) {\n params.append('workspace_uuid', workspaceUuid);\n }\n if (productTypes && productTypes.length > 0) {\n productTypes.forEach((type) => params.append('product_types', type));\n }\n const queryString = params.toString();\n return this.fetch<Product[]>(`admin/products${queryString ? `?${queryString}` : ''}`);\n }\n\n async getProductAsAdmin(productId: number): Promise<Product> {\n return this.fetch<Product>(`admin/products/${productId}`);\n }\n\n async updateProductAsAdmin(\n product_id: number,\n product: AdminUpdateProductRequest\n ): Promise<Product> {\n return this.fetch<Product>(`admin/products/${product_id}`, {\n method: 'PUT',\n body: JSON.stringify(product),\n });\n }\n\n async deleteProductAsAdmin(productId: number): Promise<{ message: string }> {\n return this.fetch<{ message: string }>(`admin/products/${productId}`, {\n method: 'DELETE',\n });\n }\n\n // Admin Workspace API\n async getWorkspacesAsAdmin(\n options: {\n page?: number;\n pageSize?: number;\n sortBy?: WorkspaceSortField;\n sortOrder?: SortOrder;\n search?: string;\n isReseller?: boolean;\n organizationId?: number;\n } = {}\n ): Promise<PaginatedResponse<AdminWorkspace>> {\n const params = new URLSearchParams();\n if (options.page !== undefined) params.append('page', options.page.toString());\n if (options.pageSize !== undefined) params.append('pageSize', options.pageSize.toString());\n if (options.sortBy) params.append('sortBy', options.sortBy);\n if (options.sortOrder) params.append('sortOrder', options.sortOrder);\n if (options.search) params.append('search', options.search);\n if (options.isReseller !== undefined)\n params.append('isReseller', options.isReseller.toString());\n if (options.organizationId !== undefined)\n params.append('organizationId', options.organizationId.toString());\n\n return this.fetch<PaginatedResponse<AdminWorkspace>>(`admin/workspaces?${params.toString()}`);\n }\n\n async getWorkspaceAsAdmin(wid: string): Promise<AdminWorkspace> {\n return this.fetch<AdminWorkspace>(`admin/workspaces/${wid}`);\n }\n\n async getWorkspaceByNumericIdAsAdmin(workspace_id: number): Promise<AdminWorkspace> {\n return this.fetch<AdminWorkspace>(`admin/workspaces/id/${workspace_id}`);\n }\n\n async createWorkspaceAsAdmin(ws: AdminWorkspaceFormData): Promise<Workspace> {\n return this.fetch<Workspace>('admin/workspaces', {\n method: 'POST',\n body: JSON.stringify(ws),\n });\n }\n\n async updateWorkspaceAsAdmin(wid: string, ws: AdminWorkspaceFormData): Promise<Workspace> {\n return this.fetch<Workspace>(`admin/workspaces/${wid}`, {\n method: 'PUT',\n body: JSON.stringify(ws),\n });\n }\n\n async deleteWorkspaceAsAdmin(wid: string): Promise<void> {\n return this.fetch(`admin/workspaces/${wid}`, {\n method: 'DELETE',\n });\n }\n\n async createSchemaAsAdmin(wid: string): Promise<AdminWorkspace> {\n return this.fetch(`admin/workspaces/${wid}/provision/create`, {\n method: 'POST',\n });\n }\n\n async migrateSchemaAsAdmin(wid: string): Promise<AdminWorkspace> {\n return this.fetch(`admin/workspaces/${wid}/provision/migrate`, {\n method: 'POST',\n });\n }\n\n async provisionWorkspaceAsAdmin(wid: string): Promise<AdminWorkspace> {\n return this.fetch(`admin/workspaces/${wid}/provision`, {\n method: 'POST',\n });\n }\n\n async refreshProvisionStatusAsAdmin(wid: string): Promise<AdminWorkspace> {\n return this.fetch(`admin/workspaces/${wid}/provision/refresh`, {\n method: 'POST',\n });\n }\n\n async enableMaintenanceMode(wid: string): Promise<AdminWorkspace> {\n return this.fetch(`admin/workspaces/${wid}/maintenance`, {\n method: 'PUT',\n });\n }\n\n async disableMaintenanceMode(wid: string): Promise<AdminWorkspace> {\n return this.fetch(`admin/workspaces/${wid}/maintenance`, {\n method: 'DELETE',\n });\n }\n\n // ===== Workspace Health Check =====\n\n async getWorkspaceHealth(workspaceUuid: string): Promise<WorkspaceHealthResponse> {\n return this.fetch<WorkspaceHealthResponse>(`admin/workspaces/${workspaceUuid}/health`);\n }\n\n async provisionPlanFeatures(\n workspaceUuid: string,\n request?: ProvisionPlanRequest\n ): Promise<ProvisionPlanResponse> {\n return this.fetch<ProvisionPlanResponse>(`admin/workspaces/${workspaceUuid}/provision-plan`, {\n method: 'POST',\n body: JSON.stringify(request || {}),\n });\n }\n\n async mergeMembers(wid: string, request: MergeMembersRequest): Promise<MergeMembersResponse> {\n return this.fetch<MergeMembersResponse>(`admin/workspaces/${wid}/merge-members`, {\n method: 'POST',\n body: JSON.stringify(request),\n });\n }\n\n async createPhoneNumberMapping(\n wid: string,\n mapping: PhoneNumberMappingFormData\n ): Promise<PhoneNumberMappingResponse> {\n return this.fetch<PhoneNumberMappingResponse>(\n `admin/workspaces/${wid}/phone-number-mappings`,\n {\n method: 'POST',\n body: JSON.stringify(mapping),\n }\n );\n }\n\n async deletePhoneNumberMapping(wid: string, phoneNumber: string): Promise<void> {\n return this.fetch(`admin/workspaces/${wid}/phone-number-mappings/${phoneNumber}`, {\n method: 'DELETE',\n });\n }\n\n async getAdminWorkspaceMember(wid: string): Promise<Member> {\n return this.fetch(`admin/workspaces/${wid}/me`, {\n method: 'GET',\n });\n }\n\n async createAdminWorkspaceMember(\n wid: string,\n data: AdminWorkspaceMemberFormData\n ): Promise<void> {\n return this.fetch(`admin/workspaces/${wid}/me`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n async updateAdminWorkspaceMember(\n wid: string,\n data: AdminWorkspaceMemberFormData\n ): Promise<void> {\n return this.fetch(`admin/workspaces/${wid}/me`, {\n method: 'PUT',\n body: JSON.stringify(data),\n });\n }\n\n async getAdminWorkspaceMemberRoles(wid: string): Promise<MemberRole[]> {\n return this.fetch<MemberRole[]>(`admin/workspaces/${wid}/member-roles`);\n }\n\n // Admin Phone Number Mappings API\n async getPhoneNumberMappings(\n options: {\n page?: number;\n pageSize?: number;\n search?: string;\n workspaceId?: number;\n sortBy?: string;\n sortDirection?: string;\n } = {}\n ): Promise<PaginatedResponse<PhoneNumberMappingResponse>> {\n const params = new URLSearchParams();\n if (options.page) params.append('page', options.page.toString());\n if (options.pageSize) params.append('pageSize', options.pageSize.toString());\n if (options.search) params.append('search', options.search);\n if (options.workspaceId) params.append('workspaceId', options.workspaceId.toString());\n if (options.sortBy) params.append('sortBy', options.sortBy);\n if (options.sortDirection) params.append('sortDirection', options.sortDirection);\n\n return this.fetch<PaginatedResponse<PhoneNumberMappingResponse>>(\n `admin/phone-mappings${params.toString() ? `?${params.toString()}` : ''}`\n );\n }\n\n async getPhoneNumberMapping(id: number): Promise<PhoneNumberMappingResponse> {\n return this.fetch<PhoneNumberMappingResponse>(`admin/phone-mappings/${id}`);\n }\n\n async createAdminPhoneNumberMapping(\n data: AdminPhoneNumberMappingRequest\n ): Promise<PhoneNumberMappingResponse> {\n return this.fetch<PhoneNumberMappingResponse>(`admin/phone-mappings`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n async deleteAdminPhoneNumberMapping(id: number): Promise<void> {\n return this.fetch<void>(`admin/phone-mappings/${id}`, {\n method: 'DELETE',\n });\n }\n\n async getAvailableWorkspacesForPhone(\n mappingId: number\n ): Promise<Array<{ id: number; uuid: string; name: string }>> {\n return this.fetch<Array<{ id: number; uuid: string; name: string }>>(\n `admin/phone-mappings/${mappingId}/available-workspaces`\n );\n }\n\n async remapPhoneNumber(\n mappingId: number,\n newWorkspaceId: number\n ): Promise<PhoneNumberMappingResponse> {\n return this.fetch<PhoneNumberMappingResponse>(`admin/phone-mappings/${mappingId}/remap`, {\n method: 'PUT',\n body: JSON.stringify({ newWorkspaceId }),\n });\n }\n\n async getUnmappedPhoneNumbers(): Promise<UnmappedPhoneNumber[]> {\n return this.fetch<UnmappedPhoneNumber[]>(`admin/phone-numbers/unmapped`);\n }\n\n async getWorkspaceUnmappedPhoneNumbers(workspaceId: number): Promise<UnmappedPhoneNumber[]> {\n return this.fetch<UnmappedPhoneNumber[]>(\n `admin/phone-numbers/workspace/${workspaceId}/unmapped`\n );\n }\n\n async getWorkspacePhoneNumbersAsAdmin(workspaceId: number): Promise<PhoneNumber[]> {\n return this.fetch<PhoneNumber[]>(`admin/workspace/${workspaceId}/phone-numbers`);\n }\n\n // Phone Numbers API (Provider phone numbers from Twilio, AWS, etc.)\n async getProviderPhoneNumbers(\n options: {\n search?: string;\n status?: PhoneNumberStatus;\n provider?: string;\n sortBy?: string;\n sortDirection?: string;\n page?: number;\n pageSize?: number;\n } = {}\n ): Promise<PaginatedResponse<ProviderPhoneNumber>> {\n const params = new URLSearchParams();\n if (options.page) params.append('page', options.page.toString());\n if (options.pageSize) params.append('pageSize', options.pageSize.toString());\n if (options.search) params.append('search', options.search);\n if (options.status) params.append('status', options.status);\n if (options.provider) params.append('provider', options.provider);\n if (options.sortBy) params.append('sortBy', options.sortBy);\n if (options.sortDirection) params.append('sortDirection', options.sortDirection);\n\n return this.fetch<PaginatedResponse<ProviderPhoneNumber>>(\n `admin/phone-numbers${params.toString() ? `?${params.toString()}` : ''}`\n );\n }\n\n async getProviderPhoneNumber(id: number): Promise<ProviderPhoneNumber> {\n return this.fetch<ProviderPhoneNumber>(`admin/phone-numbers/${id}`);\n }\n\n async updatePhoneNumberStatus(\n id: number,\n status: PhoneNumberStatus\n ): Promise<ProviderPhoneNumber> {\n return this.fetch<ProviderPhoneNumber>(`admin/phone-numbers/${id}/status`, {\n method: 'PUT',\n body: JSON.stringify({ status }),\n });\n }\n\n async syncPhoneNumbersFromProviders(): Promise<{\n status: string;\n message: string;\n syncedCount: number;\n allocatedCount: number;\n fixedCount: number;\n }> {\n return this.fetch<{\n status: string;\n message: string;\n syncedCount: number;\n allocatedCount: number;\n fixedCount: number;\n }>(`admin/phone-numbers/sync-from-providers`, {\n method: 'POST',\n });\n }\n\n async approvePhoneNumberRequest(phoneNumberId: number): Promise<ProviderPhoneNumber> {\n return this.fetch<ProviderPhoneNumber>(`admin/phone-numbers/${phoneNumberId}/approve`, {\n method: 'POST',\n });\n }\n\n async rejectPhoneNumberRequest(phoneNumberId: number): Promise<ProviderPhoneNumber> {\n return this.fetch<ProviderPhoneNumber>(`admin/phone-numbers/${phoneNumberId}/reject`, {\n method: 'POST',\n });\n }\n\n // Site Mappings API\n async getSiteMappings(options?: {\n search?: string;\n page?: number;\n pageSize?: number;\n }): Promise<PaginatedResponse<SiteMapping>> {\n const queryParams = new URLSearchParams();\n if (options?.search) queryParams.append('search', options.search);\n if (options?.page) queryParams.append('page', options.page.toString());\n if (options?.pageSize) queryParams.append('pageSize', options.pageSize.toString());\n\n const queryString = queryParams.toString();\n const url = `admin/site-mappings${queryString ? `?${queryString}` : ''}`;\n\n return this.fetch<PaginatedResponse<SiteMapping>>(url);\n }\n\n async getSiteMapping(siteId: number): Promise<SiteMapping> {\n return this.fetch<SiteMapping>(`admin/site-mappings/${siteId}`);\n }\n\n async updateSiteMapping(siteId: number, data: SiteMappingFormData): Promise<SiteMapping> {\n return this.fetch<SiteMapping>(`admin/site-mappings/${siteId}`, {\n method: 'PUT',\n body: JSON.stringify(data),\n });\n }\n\n async updateSiteMappingWorkspace(siteId: number, workspaceId: number): Promise<SiteMapping> {\n return this.updateSiteMapping(siteId, {\n workspaceId,\n siteUuid: '', // These fields are required by the type but will be ignored on the server\n });\n }\n\n async adminDeleteSiteMapping(siteId: number): Promise<void> {\n return this.fetch<void>(`admin/site-mappings/${siteId}`, {\n method: 'DELETE',\n });\n }\n\n async createSiteMapping(mapping: SiteMappingFormData): Promise<SiteMapping> {\n return this.fetch<SiteMapping>(`admin/site-mappings`, {\n method: 'POST',\n body: JSON.stringify(mapping),\n });\n }\n\n // Keep for backward compatibility\n async createOrUpdateSiteMapping(\n wid: string,\n mapping: SiteMappingFormData\n ): Promise<SiteMapping> {\n return this.fetch<SiteMapping>(`admin/workspaces/${wid}/site-mappings`, {\n method: 'POST',\n body: JSON.stringify(mapping),\n });\n }\n\n async deleteSiteMapping(wid: string, siteUuid: string): Promise<void> {\n return this.fetch(`admin/workspaces/${wid}/site-mappings/${siteUuid}`, {\n method: 'DELETE',\n });\n }\n\n // Admin Inbox Mappings API\n async getInboxMappings(\n options: {\n page?: number;\n pageSize?: number;\n search?: string;\n workspaceId?: number;\n } = {}\n ): Promise<PaginatedResponse<InboxMappingDetailResponse>> {\n const params = new URLSearchParams();\n if (options.page) params.append('page', options.page.toString());\n if (options.pageSize) params.append('pageSize', options.pageSize.toString());\n if (options.search) params.append('search', options.search);\n if (options.workspaceId) params.append('workspaceId', options.workspaceId.toString());\n\n return this.fetch<PaginatedResponse<InboxMappingDetailResponse>>(\n `admin/inbox-mappings${params.toString() ? `?${params.toString()}` : ''}`\n );\n }\n\n async getInboxMapping(id: number): Promise<InboxMappingDetailResponse> {\n return this.fetch<InboxMappingDetailResponse>(`admin/inbox-mappings/${id}`);\n }\n\n async updateInboxMapping(id: number, workspaceId: number): Promise<InboxMappingDetailResponse> {\n return this.fetch<InboxMappingDetailResponse>(`admin/inbox-mappings/${id}`, {\n method: 'PUT',\n body: JSON.stringify({ workspaceId }),\n });\n }\n\n async deleteAdminInboxMapping(id: number): Promise<void> {\n return this.fetch(`admin/inbox-mappings/${id}`, {\n method: 'DELETE',\n });\n }\n\n // Evaluation API\n async generateChatSummaries(options: {\n afterDate?: Date;\n onlyWithoutSummaries?: boolean;\n }): Promise<GenerateSummariesResponse> {\n return this.fetch<GenerateSummariesResponse>('admin/generate-summaries', {\n method: 'POST',\n body: JSON.stringify({\n after_date: options.afterDate\n ? options.afterDate.toISOString().split('T')[0] +\n 'T' +\n options.afterDate.toTimeString().split(' ')[0]\n : undefined,\n only_without_summaries: options.onlyWithoutSummaries ?? true,\n }),\n });\n }\n\n async executeQuery(options: { query: string; workspaceUuid?: string }): Promise<{\n columns: string[];\n rows: any[][];\n rowCount: number;\n }> {\n return this.fetch<{\n columns: string[];\n rows: any[][];\n rowCount: number;\n }>('admin/execute-query', {\n method: 'POST',\n body: JSON.stringify({\n query: options.query,\n workspace_uuid: options.workspaceUuid,\n }),\n });\n }\n\n async triggerPeriodicJob(jobName: string): Promise<{\n success: boolean;\n message: string;\n jobName: string;\n }> {\n return this.fetch<{\n success: boolean;\n message: string;\n jobName: string;\n }>('admin/trigger-periodic-job', {\n method: 'POST',\n body: JSON.stringify({\n job_name: jobName,\n }),\n });\n }\n\n // Admin Themes API\n async listAllThemes(): Promise<ThemesListResponse> {\n return this.fetch<ThemesListResponse>('admin/themes/list');\n }\n\n // Missing Memberships API\n async getMissingMemberships(workspaceId: string): Promise<MissingMembershipItem[]> {\n return this.fetch<MissingMembershipItem[]>(\n `admin/workspaces/${workspaceId}/missing-memberships`\n );\n }\n\n async linkMissingMembership(\n workspaceId: string,\n memberId: number,\n accountId: number\n ): Promise<{ success: boolean; message: string }> {\n return this.fetch<{ success: boolean; message: string }>(\n `admin/workspaces/${workspaceId}/link-membership?member_id=${memberId}&account_id=${accountId}`,\n {\n method: 'POST',\n }\n );\n }\n\n // Bulk Phone Classification API\n async startBulkPhoneClassification(\n workspaceUuid: string,\n includeUnknown: boolean = false\n ): Promise<{\n success: boolean;\n message: string;\n job_id: string;\n workspace_uuid: string;\n include_unknown: boolean;\n }> {\n const params = new URLSearchParams();\n params.append('include_unknown', includeUnknown.toString());\n\n return this.fetch<{\n success: boolean;\n message: string;\n job_id: string;\n workspace_uuid: string;\n include_unknown: boolean;\n }>(`admin/workspaces/${workspaceUuid}/bulk-classify-phones?${params.toString()}`, {\n method: 'POST',\n });\n }\n\n // Bulk TOS Acceptance API\n async startBulkTOSAcceptance(workspaceUuid: string): Promise<{\n success: boolean;\n message: string;\n updated_count: number;\n workspace_uuid: string;\n }> {\n return this.fetch<{\n success: boolean;\n message: string;\n updated_count: number;\n workspace_uuid: string;\n }>(`admin/workspaces/${workspaceUuid}/bulk-accept-tos`, {\n method: 'POST',\n });\n }\n\n // Token Usage Backfill API\n async startTokenUsageBackfill(workspaceUuid: string): Promise<{\n success: boolean;\n message: string;\n job_id: string;\n workspace_uuid: string;\n }> {\n return this.fetch<{\n success: boolean;\n message: string;\n job_id: string;\n workspace_uuid: string;\n }>(`admin/workspaces/${workspaceUuid}/backfill-token-usage`, {\n method: 'POST',\n });\n }\n\n // Update chat message content\n async updateChatMessage(\n workspaceUuid: string,\n chatId: number,\n messageId: string,\n content: string\n ): Promise<{\n success: boolean;\n message: string;\n messageId: string;\n chatId: number;\n workspaceUuid: string;\n }> {\n return this.fetch<{\n success: boolean;\n message: string;\n messageId: string;\n chatId: number;\n workspaceUuid: string;\n }>(`admin/workspaces/${workspaceUuid}/chats/${chatId}/messages/${messageId}`, {\n method: 'POST',\n body: JSON.stringify({ content }),\n });\n }\n\n // ===== Stripe Customer Management =====\n\n async getStripeCustomer(accountId: number): Promise<StripeCustomer> {\n return this.fetch<StripeCustomer>(`admin/accounts/${accountId}/stripe/customer`);\n }\n\n async createStripeCustomer(\n accountId: number,\n data: StripeCustomerCreateRequest\n ): Promise<StripeCustomer> {\n return this.fetch<StripeCustomer>(`admin/accounts/${accountId}/stripe/customer`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n async updateStripeCustomer(\n accountId: number,\n data: StripeCustomerUpdateRequest\n ): Promise<StripeCustomer> {\n return this.fetch<StripeCustomer>(`admin/accounts/${accountId}/stripe/customer`, {\n method: 'PUT',\n body: JSON.stringify(data),\n });\n }\n\n // ===== Stripe Subscription Management =====\n\n async getStripeSubscriptions(accountId: number): Promise<Subscription[]> {\n return this.fetch<Subscription[]>(`admin/accounts/${accountId}/stripe/subscriptions`);\n }\n\n async createStripeSubscription(\n accountId: number,\n data: StripeSubscriptionCreateRequest\n ): Promise<Subscription> {\n return this.fetch<Subscription>(`admin/accounts/${accountId}/stripe/subscriptions`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n async updateStripeSubscription(\n accountId: number,\n subscriptionId: string,\n data: StripeSubscriptionUpdateRequest\n ): Promise<Subscription> {\n return this.fetch<Subscription>(\n `admin/accounts/${accountId}/stripe/subscriptions/${subscriptionId}`,\n {\n method: 'PUT',\n body: JSON.stringify(data),\n }\n );\n }\n\n async cancelStripeSubscription(\n accountId: number,\n subscriptionId: string\n ): Promise<{ message: string; status: string }> {\n return this.fetch<{ message: string; status: string }>(\n `admin/accounts/${accountId}/stripe/subscriptions/${subscriptionId}`,\n {\n method: 'DELETE',\n }\n );\n }\n\n async provisionWorkspaceForSubscription(\n accountId: number,\n subscriptionId: string\n ): Promise<AdminWorkspace> {\n return this.fetch<AdminWorkspace>(\n `admin/accounts/${accountId}/stripe/subscriptions/${subscriptionId}/provision`,\n {\n method: 'POST',\n }\n );\n }\n\n async associateWorkspaceWithSubscription(\n accountId: number,\n subscriptionId: string,\n workspaceId: number\n ): Promise<Subscription> {\n return this.fetch<Subscription>(\n `admin/accounts/${accountId}/stripe/subscriptions/${subscriptionId}/associate?workspace_id=${workspaceId}`,\n {\n method: 'POST',\n }\n );\n }\n\n async createSubscriptionPaymentLink(\n accountId: number,\n subscriptionId: string\n ): Promise<{\n needsPayment: boolean;\n paymentUrl?: string;\n amountDue?: number;\n currency?: string;\n status: string;\n invoiceId?: string;\n invoiceStatus?: string;\n dueDate?: number;\n message?: string;\n }> {\n return this.fetch<{\n needsPayment: boolean;\n paymentUrl?: string;\n amountDue?: number;\n currency?: string;\n status: string;\n invoiceId?: string;\n invoiceStatus?: string;\n dueDate?: number;\n message?: string;\n }>(`admin/accounts/${accountId}/stripe/subscriptions/${subscriptionId}/payment-link`, {\n method: 'POST',\n });\n }\n\n // ===== Stripe Payment Methods Management =====\n\n async createSetupIntent(accountId: number): Promise<{\n clientSecret: string;\n setupIntentId: string;\n status: string;\n }> {\n return this.fetch<{\n clientSecret: string;\n setupIntentId: string;\n status: string;\n }>(`admin/accounts/${accountId}/stripe/setup-intent`, {\n method: 'POST',\n });\n }\n\n async getStripePaymentMethods(accountId: number): Promise<StripePaymentMethod[]> {\n return this.fetch<StripePaymentMethod[]>(\n `admin/accounts/${accountId}/stripe/payment-methods`\n );\n }\n\n async attachStripePaymentMethod(\n accountId: number,\n paymentMethodId: string,\n setAsDefault: boolean = false\n ): Promise<{\n success: boolean;\n message: string;\n paymentMethodId: string;\n type: string;\n }> {\n return this.fetch<{\n success: boolean;\n message: string;\n paymentMethodId: string;\n type: string;\n }>(`admin/accounts/${accountId}/stripe/payment-methods/${paymentMethodId}/attach`, {\n method: 'POST',\n body: JSON.stringify({ setAsDefault }),\n });\n }\n\n async detachStripePaymentMethod(\n accountId: number,\n paymentMethodId: string\n ): Promise<{ success: string; message: string }> {\n return this.fetch<{ success: string; message: string }>(\n `admin/accounts/${accountId}/stripe/payment-methods/${paymentMethodId}`,\n {\n method: 'DELETE',\n }\n );\n }\n\n async setDefaultStripePaymentMethod(\n accountId: number,\n paymentMethodId: string\n ): Promise<{ success: string; message: string }> {\n return this.fetch<{ success: string; message: string }>(\n `admin/accounts/${accountId}/stripe/payment-methods/${paymentMethodId}/set-default`,\n {\n method: 'PUT',\n }\n );\n }\n\n // ===== Workspace Organization Migration =====\n\n async previewWorkspaceOrganizationChange(\n workspaceUuid: string,\n targetOrganizationId: number,\n newCreatorId: number\n ): Promise<{\n targetOrganization: { id: number; name: string };\n newCreator: { id: number; name: string; email: string };\n currentOrganization: { id: number | null; name: string | null };\n impact: {\n accountsToMove: number;\n accountsToDuplicate: number;\n accountsToRemap: number;\n totalMembers: number;\n };\n details: {\n movableAccounts: Array<{\n id: number;\n uuid: string;\n name: string;\n email: string | null;\n phone: string | null;\n }>;\n duplicateAccounts: Array<{\n id: number;\n uuid: string;\n name: string;\n email: string | null;\n phone: string | null;\n }>;\n remappableAccounts: Array<{\n currentAccount: {\n id: number;\n uuid: string;\n name: string;\n email: string | null;\n phone: string | null;\n };\n targetAccount: {\n id: number;\n uuid: string;\n name: string;\n email: string | null;\n phone: string | null;\n };\n }>;\n };\n }> {\n return this.fetch<{\n targetOrganization: { id: number; name: string };\n newCreator: { id: number; name: string; email: string };\n currentOrganization: { id: number | null; name: string | null };\n impact: {\n accountsToMove: number;\n accountsToDuplicate: number;\n accountsToRemap: number;\n totalMembers: number;\n };\n details: {\n movableAccounts: Array<{\n id: number;\n uuid: string;\n name: string;\n email: string | null;\n phone: string | null;\n }>;\n duplicateAccounts: Array<{\n id: number;\n uuid: string;\n name: string;\n email: string | null;\n phone: string | null;\n }>;\n remappableAccounts: Array<{\n currentAccount: {\n id: number;\n uuid: string;\n name: string;\n email: string | null;\n phone: string | null;\n };\n targetAccount: {\n id: number;\n uuid: string;\n name: string;\n email: string | null;\n phone: string | null;\n };\n }>;\n };\n }>(`admin/workspaces/${workspaceUuid}/change-org/preview`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n targetOrganizationId,\n newCreatorId,\n }),\n });\n }\n\n async changeWorkspaceOrganization(\n workspaceUuid: string,\n targetOrganizationId: number,\n newCreatorId: number\n ): Promise<{\n success: boolean;\n workspace: {\n uuid: string;\n name: string;\n organizationId: number;\n creatorId: number;\n };\n migration: {\n accountsMoved: number;\n accountsCreated: number;\n accountsRemapped: number;\n };\n }> {\n return this.fetch<{\n success: boolean;\n workspace: {\n uuid: string;\n name: string;\n organizationId: number;\n creatorId: number;\n };\n migration: {\n accountsMoved: number;\n accountsCreated: number;\n accountsRemapped: number;\n };\n }>(`admin/workspaces/${workspaceUuid}/change-org`, {\n method: 'POST',\n body: JSON.stringify({\n targetOrganizationId,\n newCreatorId,\n }),\n });\n }\n\n // ===== Stripe Invoice Management =====\n\n async createStripeInvoice(\n accountId: number,\n data: {\n customer: string;\n description?: string;\n collectionMethod: 'charge_automatically' | 'send_invoice';\n daysUntilDue?: number;\n autoAdvance?: boolean;\n metadata?: Record<string, string>;\n }\n ): Promise<{\n id: string;\n number: string;\n status: string;\n collectionMethod: string;\n amountDue: number;\n amountPaid: number;\n amountRemaining: number;\n currency: string;\n created: number;\n dueDate: number | null;\n paid: boolean;\n hostedInvoiceUrl: string | null;\n invoicePdf: string | null;\n customerEmail: string | null;\n description: string | null;\n }> {\n return this.fetch<{\n id: string;\n number: string;\n status: string;\n collectionMethod: string;\n amountDue: number;\n amountPaid: number;\n amountRemaining: number;\n currency: string;\n created: number;\n dueDate: number | null;\n paid: boolean;\n hostedInvoiceUrl: string | null;\n invoicePdf: string | null;\n customerEmail: string | null;\n description: string | null;\n }>(`admin/accounts/${accountId}/stripe/invoices`, {\n method: 'POST',\n body: JSON.stringify({\n customer: data.customer,\n description: data.description,\n collection_method: data.collectionMethod,\n days_until_due: data.daysUntilDue,\n auto_advance: data.autoAdvance,\n metadata: data.metadata,\n }),\n });\n }\n\n async getStripeInvoices(\n accountId: number,\n options?: { limit?: number; startingAfter?: string }\n ): Promise<\n Array<{\n id: string;\n number: string;\n status: string;\n collectionMethod: string;\n amountDue: number;\n amountPaid: number;\n amountRemaining: number;\n currency: string;\n created: number;\n dueDate: number | null;\n paid: boolean;\n hostedInvoiceUrl: string | null;\n invoicePdf: string | null;\n description: string | null;\n periodStart: number | null;\n periodEnd: number | null;\n }>\n > {\n const params = new URLSearchParams();\n if (options?.limit) params.append('limit', options.limit.toString());\n if (options?.startingAfter) params.append('starting_after', options.startingAfter);\n\n return this.fetch<\n Array<{\n id: string;\n number: string;\n status: string;\n collectionMethod: string;\n amountDue: number;\n amountPaid: number;\n amountRemaining: number;\n currency: string;\n created: number;\n dueDate: number | null;\n paid: boolean;\n hostedInvoiceUrl: string | null;\n invoicePdf: string | null;\n description: string | null;\n periodStart: number | null;\n periodEnd: number | null;\n }>\n >(`admin/accounts/${accountId}/stripe/invoices?${params.toString()}`);\n }\n\n async getStripeUpcomingInvoice(\n accountId: number,\n subscriptionId?: string\n ): Promise<{\n amountDue: number;\n amountPaid: number;\n amountRemaining: number;\n currency: string;\n periodStart: number;\n periodEnd: number;\n subtotal: number;\n tax: number;\n total: number;\n lineItems: Array<{\n id: string;\n description: string | null;\n amount: number;\n currency: string;\n quantity: number;\n unitAmount: number;\n productName: string | null;\n productDescription: string | null;\n period: {\n start: number;\n end: number;\n };\n }>;\n customer: string;\n subscription: string | null;\n }> {\n const params = new URLSearchParams();\n if (subscriptionId) params.append('subscription_id', subscriptionId);\n\n return this.fetch<{\n amountDue: number;\n amountPaid: number;\n amountRemaining: number;\n currency: string;\n periodStart: number;\n periodEnd: number;\n subtotal: number;\n tax: number;\n total: number;\n lineItems: Array<{\n id: string;\n description: string | null;\n amount: number;\n currency: string;\n quantity: number;\n unitAmount: number;\n productName: string | null;\n productDescription: string | null;\n period: {\n start: number;\n end: number;\n };\n }>;\n customer: string;\n subscription: string | null;\n }>(`admin/accounts/${accountId}/stripe/upcoming-invoice?${params.toString()}`);\n }\n\n // Billing Dashboard API\n async getWorkspaceBillingDashboard(workspaceUuid: string): Promise<BillingDashboardResponse> {\n return this.fetch<BillingDashboardResponse>(\n `admin/workspaces/${workspaceUuid}/billing-dashboard`\n );\n }\n\n async syncWorkspaceUsageToStripe(\n workspaceUuid: string,\n request?: SyncUsageRequest\n ): Promise<SyncUsageResponse> {\n return this.fetch<SyncUsageResponse>(`admin/workspaces/${workspaceUuid}/usage/sync`, {\n method: 'POST',\n body: JSON.stringify(request || {}),\n });\n }\n\n // Product Stripe Sync API\n async compareProductsWithStripe(workspaceUuid?: string): Promise<CompareWithStripeResponse> {\n const params = workspaceUuid ? `?workspace_uuid=${encodeURIComponent(workspaceUuid)}` : '';\n return this.fetch<CompareWithStripeResponse>(`admin/products/compare-stripe${params}`);\n }\n\n async syncProductToStripe(\n productId: number,\n request?: SyncProductToStripeRequest\n ): Promise<SyncProductToStripeResponse> {\n return this.fetch<SyncProductToStripeResponse>(`admin/products/${productId}/sync-stripe`, {\n method: 'POST',\n body: JSON.stringify({ ...request, productId }),\n });\n }\n\n // Search Stripe products\n async searchStripeProducts(\n query: string,\n limit: number = 10\n ): Promise<\n Array<{\n id: string;\n name: string;\n description: string | null;\n active: boolean;\n created: number;\n metadata: Record<string, string>;\n }>\n > {\n const params = new URLSearchParams({ query, limit: limit.toString() });\n return this.fetch<\n Array<{\n id: string;\n name: string;\n description: string | null;\n active: boolean;\n created: number;\n metadata: Record<string, string>;\n }>\n >(`admin/products/stripe/search?${params.toString()}`);\n }\n\n // ===== Subscriptions API =====\n\n async getSubscriptionsAsAdmin(options?: {\n productId?: number;\n page?: number;\n pageSize?: number;\n }): Promise<PaginatedSubscriptionsResponse> {\n const params = new URLSearchParams();\n if (options?.productId) params.append('product_id', options.productId.toString());\n if (options?.page) params.append('page', options.page.toString());\n if (options?.pageSize) params.append('page_size', options.pageSize.toString());\n const queryString = params.toString();\n return this.fetch<PaginatedSubscriptionsResponse>(\n `admin/subscriptions${queryString ? `?${queryString}` : ''}`\n );\n }\n\n // ===== Usage API =====\n\n async getUsageReport(request: UsageReportRequest): Promise<UsageReport> {\n return this.fetch<UsageReport>('admin/usage', {\n method: 'POST',\n body: JSON.stringify(request),\n });\n }\n\n // Voice Metrics API\n async getVoiceMetrics(options?: {\n hours?: number;\n period?: number;\n workspace_uuid?: string;\n organization_id?: number;\n engine?: string;\n channel?: string;\n }): Promise<VoiceMetricsResponse> {\n const params = new URLSearchParams();\n if (options?.hours) params.append('hours', options.hours.toString());\n if (options?.period) params.append('period', options.period.toString());\n if (options?.workspace_uuid) params.append('workspace_uuid', options.workspace_uuid);\n if (options?.organization_id != null)\n params.append('organization_id', options.organization_id.toString());\n if (options?.engine) params.append('engine', options.engine);\n if (options?.channel) params.append('channel', options.channel);\n const qs = params.toString();\n return this.fetch<VoiceMetricsResponse>(`admin/voice-metrics${qs ? `?${qs}` : ''}`);\n }\n\n // Health Dashboard API\n async getHealthMetrics(request: HealthMetricsRequest): Promise<HealthMetricsResponse> {\n return this.fetch<HealthMetricsResponse>('admin/health/metrics', {\n method: 'POST',\n body: JSON.stringify(request),\n });\n }\n}\n","import { BaseApiClient } from './base';\nimport {\n Agent,\n CreateAgentRequest,\n UpdateAgentRequest,\n PaginatedResponse,\n SortOrder,\n} from '../types';\n\nexport type AgentSortField = 'createdAt' | 'updatedAt' | 'name';\n\nexport class AgentsApi extends BaseApiClient {\n async getAgents(\n wid: string,\n options: {\n page?: number;\n pageSize?: number;\n sortBy?: AgentSortField;\n sortOrder?: SortOrder;\n search?: string;\n includeArchived?: boolean;\n } = {}\n ): Promise<PaginatedResponse<Agent>> {\n const params = new URLSearchParams();\n if (options.page) params.append('page', options.page.toString());\n if (options.pageSize) params.append('pageSize', options.pageSize.toString());\n if (options.sortBy) params.append('sortBy', options.sortBy);\n if (options.sortOrder) params.append('sortOrder', options.sortOrder);\n if (options.search) params.append('search', options.search);\n if (options.includeArchived)\n params.append('includeArchived', options.includeArchived.toString());\n\n return this.fetch<PaginatedResponse<Agent>>(\n `w/${wid}/agents${params.toString() ? `?${params.toString()}` : ''}`\n );\n }\n\n async getAgent(wid: string, id: number): Promise<Agent> {\n return this.fetch<Agent>(`w/${wid}/agents/${id}`);\n }\n\n async createAgent(wid: string, agent: CreateAgentRequest): Promise<Agent> {\n return this.fetch<Agent>(`w/${wid}/agents`, {\n method: 'POST',\n body: JSON.stringify(agent),\n });\n }\n\n async updateAgent(wid: string, id: number, agent: UpdateAgentRequest): Promise<Agent> {\n return this.fetch<Agent>(`w/${wid}/agents/${id}`, {\n method: 'PUT',\n body: JSON.stringify(agent),\n });\n }\n\n async deleteAgent(wid: string, id: number, force?: boolean): Promise<void> {\n const params = force ? '?force=true' : '';\n return this.fetch(`w/${wid}/agents/${id}${params}`, {\n method: 'DELETE',\n });\n }\n\n async archiveAgent(wid: string, id: number): Promise<Agent> {\n return this.fetch<Agent>(`w/${wid}/agents/${id}/archive`, {\n method: 'POST',\n });\n }\n\n async unarchiveAgent(wid: string, id: number): Promise<Agent> {\n return this.fetch<Agent>(`w/${wid}/agents/${id}/unarchive`, {\n method: 'POST',\n });\n }\n}\n","import type {\n AIModelsResponse,\n AllModelsResponse,\n VoiceModelsResponse,\n} from '../types/aiModelTypes';\nimport { BaseApiClient } from './base';\n\n/**\n * API client for AI model-related operations.\n */\nexport class AIModelsApi extends BaseApiClient {\n /**\n * Get available chat AI models\n */\n async getChatModels(provider?: string): Promise<AIModelsResponse> {\n const searchParams = new URLSearchParams();\n if (provider) searchParams.append('provider', provider);\n\n const queryString = searchParams.toString();\n const url = queryString ? `ai-models/chat?${queryString}` : 'ai-models/chat';\n\n return this.fetch<AIModelsResponse>(url);\n }\n\n /**\n * Get available realtime AI models\n */\n async getRealtimeModels(provider?: string): Promise<AIModelsResponse> {\n const searchParams = new URLSearchParams();\n if (provider) searchParams.append('provider', provider);\n\n const queryString = searchParams.toString();\n const url = queryString ? `ai-models/realtime?${queryString}` : 'ai-models/realtime';\n\n return this.fetch<AIModelsResponse>(url);\n }\n\n /**\n * Get available voice models with metadata\n */\n async getVoiceModels(provider?: string): Promise<VoiceModelsResponse> {\n const searchParams = new URLSearchParams();\n if (provider) searchParams.append('provider', provider);\n\n const queryString = searchParams.toString();\n const url = queryString ? `ai-models/voices?${queryString}` : 'ai-models/voices';\n\n return this.fetch<VoiceModelsResponse>(url);\n }\n\n /**\n * Get all AI models with full metadata including multipliers\n * Returns models grouped by type (chat, realtime, image, stt, tts)\n */\n async getAllModels(provider?: string, includeUnavailable = false): Promise<AllModelsResponse> {\n const searchParams = new URLSearchParams();\n if (provider) searchParams.append('provider', provider);\n if (includeUnavailable) searchParams.append('include_unavailable', 'true');\n\n const queryString = searchParams.toString();\n const url = queryString ? `ai-models/all?${queryString}` : 'ai-models/all';\n\n return this.fetch<AllModelsResponse>(url);\n }\n\n /**\n * Get available image generation models\n */\n async getImageModels(provider?: string): Promise<AIModelsResponse> {\n const searchParams = new URLSearchParams();\n if (provider) searchParams.append('provider', provider);\n\n const queryString = searchParams.toString();\n const url = queryString ? `ai-models/image?${queryString}` : 'ai-models/image';\n\n return this.fetch<AIModelsResponse>(url);\n }\n\n /**\n * Get available speech-to-text models\n */\n async getSTTModels(provider?: string): Promise<AIModelsResponse> {\n const searchParams = new URLSearchParams();\n if (provider) searchParams.append('provider', provider);\n\n const queryString = searchParams.toString();\n const url = queryString ? `ai-models/stt?${queryString}` : 'ai-models/stt';\n\n return this.fetch<AIModelsResponse>(url);\n }\n\n /**\n * Get available text-to-speech models\n */\n async getTTSModels(provider?: string): Promise<AIModelsResponse> {\n const searchParams = new URLSearchParams();\n if (provider) searchParams.append('provider', provider);\n\n const queryString = searchParams.toString();\n const url = queryString ? `ai-models/tts?${queryString}` : 'ai-models/tts';\n\n return this.fetch<AIModelsResponse>(url);\n }\n}\n","import { ApiKey, ApiKeyCreated, ApiKeyFormData } from '../types';\nimport { BaseApiClient } from './base';\n\nexport class ApiKeysApi extends BaseApiClient {\n // Workspace-specific API key methods\n async getApiKeys(wid: string): Promise<ApiKey[]> {\n return this.fetch<ApiKey[]>(`w/${wid}/api-keys`);\n }\n\n async createApiKey(wid: string, apiKey: ApiKeyFormData): Promise<ApiKeyCreated> {\n return this.fetch<ApiKeyCreated>(`w/${wid}/api-keys`, {\n method: 'POST',\n body: JSON.stringify(apiKey),\n });\n }\n\n async revokeApiKey(wid: string, id: number): Promise<void> {\n return this.fetch(`w/${wid}/api-keys/${id}`, {\n method: 'DELETE',\n });\n }\n\n // Global (account-level) API key methods\n async getGlobalApiKeys(): Promise<ApiKey[]> {\n return this.fetch<ApiKey[]>(`account/api-keys`);\n }\n\n async createGlobalApiKey(apiKey: ApiKeyFormData): Promise<ApiKeyCreated> {\n return this.fetch<ApiKeyCreated>(`account/api-keys`, {\n method: 'POST',\n body: JSON.stringify(apiKey),\n });\n }\n\n async revokeGlobalApiKey(id: number): Promise<void> {\n return this.fetch(`account/api-keys/${id}`, {\n method: 'DELETE',\n });\n }\n}","import {\n Assignment,\n AssignmentsQueryParams,\n AssignmentTask,\n ChatMessage,\n CreateAssignmentFormData,\n ExecuteToolResponse,\n OperatorTaskDetailResponse,\n PaginatedResponse,\n ToolsResponse,\n UpdateAssignmentFormData,\n} from '../types';\nimport { BaseApiClient } from './base';\n\nexport class AssignmentsApi extends BaseApiClient {\n async getAssignments(\n wid: string,\n options: AssignmentsQueryParams = {}\n ): Promise<PaginatedResponse<Assignment>> {\n const params = new URLSearchParams();\n if (options.page) params.append('page', options.page.toString());\n if (options.pageSize) params.append('pageSize', options.pageSize.toString());\n if (options.sortBy) params.append('sortBy', options.sortBy);\n if (options.sortOrder) params.append('sortOrder', options.sortOrder);\n if (options.mine) params.append('mine', options.mine.toString());\n if (options.taskId) params.append('taskId', options.taskId.toString());\n if (options.memberId) params.append('memberId', options.memberId.toString());\n if (options.status) params.append('status', options.status);\n\n return this.fetch<PaginatedResponse<Assignment>>(\n `w/${wid}/assignments${params.toString() ? `?${params.toString()}` : ''}`\n );\n }\n\n async getAssignment(wid: string, id: number): Promise<Assignment> {\n return this.fetch<Assignment>(`w/${wid}/assignments/${id}`);\n }\n\n async getAssignmentMessages(wid: string, id: number): Promise<ChatMessage[]> {\n return this.fetch<ChatMessage[]>(`w/${wid}/assignments/${id}/messages`);\n }\n\n async updateAssignment(\n wid: string,\n id: number,\n assignment: UpdateAssignmentFormData\n ): Promise<Assignment> {\n return this.fetch<Assignment>(`w/${wid}/assignments/${id}`, {\n method: 'PUT',\n body: JSON.stringify(assignment),\n });\n }\n\n async deleteAssignment(wid: string, id: number): Promise<void> {\n return this.fetch(`w/${wid}/assignments/${id}`, {\n method: 'DELETE',\n });\n }\n\n async getAssignmentTask(\n wid: string,\n id: number,\n assignmentTaskId: number\n ): Promise<AssignmentTask> {\n return this.fetch<AssignmentTask>(`w/${wid}/assignments/${id}/tasks/${assignmentTaskId}`);\n }\n\n async selectCurrentAssignmentTask(\n wid: string,\n id: number,\n assignmentTaskId: number\n ): Promise<void> {\n return this.fetch(`w/${wid}/assignments/${id}/tasks/${assignmentTaskId}/select`, {\n method: 'PUT',\n });\n }\n\n async createAssignment(wid: string, data: CreateAssignmentFormData): Promise<Assignment> {\n return this.fetch<Assignment>(`w/${wid}/assignments`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n async getAssignmentTaskDetail(\n wid: string,\n assignmentId: number\n ): Promise<OperatorTaskDetailResponse> {\n return this.fetch<OperatorTaskDetailResponse>(\n `w/${wid}/assignments/${assignmentId}/current-task-detail`\n );\n }\n\n async getAssignmentCelContext(\n wid: string,\n assignmentId: number\n ): Promise<Record<string, unknown>> {\n return this.fetch<Record<string, unknown>>(\n `w/${wid}/assignments/${assignmentId}/cel-context`\n );\n }\n\n async cancelAssignment(\n wid: string,\n id: number,\n data?: { reason?: string }\n ): Promise<Assignment> {\n return this.fetch<Assignment>(`w/${wid}/assignments/${id}/cancel`, {\n method: 'POST',\n body: JSON.stringify(data ?? {}),\n });\n }\n\n async getAssignmentTools(wid: string, assignmentId: number): Promise<ToolsResponse> {\n return this.fetch<ToolsResponse>(`w/${wid}/assignments/${assignmentId}/tools`);\n }\n\n async executeAssignmentTool(\n wid: string,\n assignmentId: number,\n toolName: string,\n parameters: Record<string, unknown> = {}\n ): Promise<ExecuteToolResponse> {\n return this.fetch<ExecuteToolResponse>(`w/${wid}/assignments/${assignmentId}/execute-tool`, {\n method: 'POST',\n body: JSON.stringify({ toolName, parameters }),\n });\n }\n}\n","import { BaseApiClient } from './base';\nimport {\n Assistant,\n AssistantFormData,\n PaginatedResponse,\n AssistantSortField,\n SortOrder,\n} from '../types';\n\nexport interface TTSPreviewRequest {\n voiceModel: string; // Canonical voice model ID (e.g., \"openai:voice:ash\", \"elevenlabs:voice:dan\")\n phrase?: string;\n}\n\nexport class AssistantsApi extends BaseApiClient {\n async getAssistants(\n wid: string,\n options: {\n page?: number;\n pageSize?: number;\n sortBy?: AssistantSortField;\n sortOrder?: SortOrder;\n mine?: boolean;\n search?: string;\n } = {}\n ): Promise<PaginatedResponse<Assistant>> {\n const params = new URLSearchParams();\n if (options.page) params.append('page', options.page.toString());\n if (options.pageSize) params.append('pageSize', options.pageSize.toString());\n if (options.sortBy) params.append('sortBy', options.sortBy);\n if (options.sortOrder) params.append('sortOrder', options.sortOrder);\n if (options.mine) params.append('mine', options.mine.toString());\n if (options.search) {\n params.append('search', options.search);\n }\n\n return this.fetch<PaginatedResponse<Assistant>>(\n `w/${wid}/assistants${params.toString() ? `?${params.toString()}` : ''}`\n );\n }\n\n async getAssistant(wid: string, id: number): Promise<Assistant> {\n return this.fetch<Assistant>(`w/${wid}/assistants/${id}`);\n }\n\n async createAssistant(wid: string, assistant: AssistantFormData): Promise<Assistant> {\n const assistantData = { ...assistant };\n return this.fetch<Assistant>(`w/${wid}/assistants`, {\n method: 'POST',\n body: JSON.stringify(assistantData),\n });\n }\n\n async updateAssistant(\n wid: string,\n id: number,\n assistant: Partial<AssistantFormData>\n ): Promise<Assistant> {\n return this.fetch<Assistant>(`w/${wid}/assistants/${id}`, {\n method: 'PUT',\n body: JSON.stringify(assistant),\n });\n }\n\n async deleteAssistant(wid: string, id: number): Promise<void> {\n return this.fetch(`w/${wid}/assistants/${id}`, {\n method: 'DELETE',\n });\n }\n\n async previewTTS(wid: string, request: TTSPreviewRequest): Promise<ArrayBuffer> {\n const response = await this.fetchRaw(`w/${wid}/assistants/tts-preview`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(request),\n });\n return response.arrayBuffer();\n }\n}\n","import {\n Account,\n AccountFormData,\n CreateSignupResponse,\n DomainMapping,\n VerifyCodeResponse,\n RequestMagicLinkResponse,\n ValidateMagicLinkResponse,\n} from '../types';\nimport {\n AdminAccountOrgMembership,\n SMSLoginResponse,\n TwoFactorStatus,\n TOTPSetupResponse,\n TwoFactorOperationResponse,\n RecoveryCodesResponse,\n SetupTOTPRequest,\n VerifyTOTPSetupRequest,\n SetupWebAuthnRequest,\n VerifyWebAuthnSetupRequest,\n GenerateRecoveryCodesRequest,\n UpdateTwoFactorMethodRequest,\n CredentialType,\n CredentialChangeRequestResponse,\n CredentialChangeVerifyResponse,\n PendingCredentialChange,\n CancelCredentialChangeResponse,\n CredentialChangeInviteDetails,\n CredentialChangeInviteConfirmResponse,\n} from '../types/accountTypes';\nimport { BaseApiClient } from './base';\nimport { parsePhoneNumberFromString } from 'libphonenumber-js';\n\n/**\n * Sanitize phone number to E164 format for backend API calls\n * Converts user-friendly formats like \"+1 207 299 0551\" to \"+12072990551\"\n */\nfunction sanitizePhoneForBackend(phoneNumber: string): string {\n try {\n // Try parsing with explicit country first\n let parsed = parsePhoneNumberFromString(phoneNumber);\n\n // If no country code detected, try with US (+1) as default\n if (!parsed) {\n parsed = parsePhoneNumberFromString(phoneNumber, 'US');\n }\n\n if (parsed && parsed.isValid()) {\n return parsed.format('E.164');\n }\n } catch (error) {\n // If parsing fails, return original (backend will handle validation)\n }\n\n return phoneNumber;\n}\n\nexport class AuthApi extends BaseApiClient {\n async getUserAccount(): Promise<Account> {\n return this.fetch<Account>('account');\n }\n\n async updateUserAccount(info: AccountFormData): Promise<Account> {\n return this.fetch('account', {\n method: 'POST',\n body: JSON.stringify(info),\n });\n }\n\n async login(\n phoneNumber: string,\n wid?: string,\n organizationUuid?: string\n ): Promise<SMSLoginResponse> {\n const params = new URLSearchParams();\n if (wid) params.append('wid', wid);\n const body: any = { phoneNumber: sanitizePhoneForBackend(phoneNumber) };\n if (organizationUuid) body.organizationUuid = organizationUuid;\n return await this.fetch<SMSLoginResponse>(`auth/login?${params.toString()}`, {\n method: 'POST',\n body: JSON.stringify(body),\n });\n }\n\n async resendCode(phoneNumber: string, organizationUuid?: string): Promise<SMSLoginResponse> {\n const body: any = { phoneNumber: sanitizePhoneForBackend(phoneNumber) };\n if (organizationUuid) body.organizationUuid = organizationUuid;\n return await this.fetch<SMSLoginResponse>('auth/resend-code', {\n method: 'POST',\n body: JSON.stringify(body),\n });\n }\n\n async verifyCodeWith2FA(\n phoneNumber: string,\n code: string,\n organizationUuid?: string\n ): Promise<VerifyCodeResponse> {\n // Verify code with backend API then complete auth locally if no 2FA required\n const verifyResponse = await this.fetch<VerifyCodeResponse>('auth/verify-with-2fa', {\n method: 'POST',\n body: JSON.stringify({\n phoneNumber: sanitizePhoneForBackend(phoneNumber),\n code,\n organizationUuid,\n }),\n });\n\n // If 2FA is not required, set the auth cookies using the local complete endpoint\n if (!verifyResponse.requiresTwoFactor && verifyResponse.token) {\n const completeResponse = await fetch(`/api/auth/complete`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n token: verifyResponse.token,\n orgUuid: organizationUuid, // Pass org UUID for per-org cookie\n }),\n });\n\n if (!completeResponse.ok) {\n const output = await completeResponse.text();\n console.error(`Error completing auth: ${output}`);\n throw new Error('Failed to complete authentication');\n }\n }\n\n return verifyResponse;\n }\n\n async emailPasswordLogin(\n email: string,\n password: string,\n organizationUuid?: string\n ): Promise<VerifyCodeResponse> {\n return await this.fetch<VerifyCodeResponse>(`auth/email-password-login`, {\n method: 'POST',\n body: JSON.stringify({ email, password, organizationUuid }),\n });\n }\n\n async emailPasswordSignup(\n email: string,\n password: string,\n name?: string,\n organizationUuid?: string\n ): Promise<VerifyCodeResponse> {\n return await this.fetch<VerifyCodeResponse>(`auth/email-password-signup`, {\n method: 'POST',\n body: JSON.stringify({ email, password, name, organizationUuid }),\n });\n }\n\n async changePassword(\n currentPassword: string,\n newPassword: string\n ): Promise<{ success: boolean; message: string }> {\n return await this.fetch<{ success: boolean; message: string }>(`auth/change-password`, {\n method: 'POST',\n body: JSON.stringify({ currentPassword, newPassword }),\n });\n }\n\n async setPassword(newPassword: string): Promise<{ success: boolean; message: string }> {\n return await this.fetch<{ success: boolean; message: string }>(`auth/set-password`, {\n method: 'POST',\n body: JSON.stringify({ newPassword }),\n });\n }\n\n async getPasswordStatus(): Promise<{ hasPassword: boolean }> {\n return await this.fetch<{ hasPassword: boolean }>(`auth/password-status`);\n }\n\n async logout(): Promise<{ success: boolean }> {\n // this is fetched locally in order to clear the cookie\n const response = await fetch(`/api/auth/logout`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n });\n\n if (!response.ok) {\n throw new Error('Failed to logout');\n }\n\n return await response.json();\n }\n\n // request a token from auth/cross-domain-token\n async requestCrossDomainToken(): Promise<{ token: string }> {\n return this.fetch<{ token: string }>('auth/cross-domain-token', {\n method: 'POST',\n });\n }\n\n async exchangeToken(token: string): Promise<{ token: string }> {\n return this.fetch<{ token: string }>('auth/exchange-token', {\n method: 'POST',\n body: JSON.stringify({ token }),\n });\n }\n\n async getDomainMapping(customDomain: string): Promise<DomainMapping> {\n return this.fetch<DomainMapping>(`s/mapping/${customDomain}`);\n }\n\n // Signup API (used by eval scripts)\n async createSignup(\n wid: string,\n data: {\n member?: {\n email?: string;\n phone?: string;\n role?: string;\n name?: string;\n description?: string;\n tosAccepted?: boolean;\n };\n data?: Record<\n string,\n {\n externalId?: string;\n values: Record<string, any>;\n }\n >;\n origin?: string;\n }\n ): Promise<CreateSignupResponse> {\n return this.fetch<CreateSignupResponse>(`w/${wid}/create-signup`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n // ===== MAGIC LINK AUTHENTICATION METHODS =====\n\n async requestMagicLink(\n email: string,\n organizationUuid?: string,\n redirectUrl?: string\n ): Promise<RequestMagicLinkResponse> {\n return await this.fetch<RequestMagicLinkResponse>(`auth/request-magic-link`, {\n method: 'POST',\n body: JSON.stringify({ email, organizationUuid, redirectUrl }),\n });\n }\n\n async validateMagicLink(token: string, otp?: string): Promise<ValidateMagicLinkResponse> {\n const body: { token: string; otp?: string } = { token };\n if (otp) {\n body.otp = otp;\n }\n return await this.fetch<ValidateMagicLinkResponse>(`auth/validate-magic-link`, {\n method: 'POST',\n body: JSON.stringify(body),\n });\n }\n\n // ===== EMAIL VERIFICATION METHODS =====\n\n async sendEmailVerification(\n email: string,\n organizationUuid?: string\n ): Promise<SMSLoginResponse> {\n return await this.fetch<SMSLoginResponse>(`auth/send-email-verification`, {\n method: 'POST',\n body: JSON.stringify({ email, organizationUuid }),\n });\n }\n\n async verifyEmail(\n email: string,\n code: string,\n organizationUuid?: string\n ): Promise<VerifyCodeResponse> {\n // Verify email with backend API then complete auth locally if no 2FA required\n const verifyResponse = await this.fetch<VerifyCodeResponse>(`auth/verify-email`, {\n method: 'POST',\n body: JSON.stringify({ email, code, organizationUuid }),\n });\n\n // If 2FA is not required, set the auth cookies using the local complete endpoint\n if (!verifyResponse.requiresTwoFactor && verifyResponse.token) {\n const completeResponse = await fetch(`/api/auth/complete`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n token: verifyResponse.token,\n orgUuid: organizationUuid, // Pass org UUID for per-org cookie\n }),\n });\n\n if (!completeResponse.ok) {\n throw new Error('Failed to complete authentication');\n }\n }\n\n return verifyResponse;\n }\n\n // ===== TWO-FACTOR AUTHENTICATION METHODS =====\n\n async getTwoFactorStatus(): Promise<TwoFactorStatus> {\n return this.fetch<TwoFactorStatus>('auth/2fa/status');\n }\n\n async setupTOTP(data: SetupTOTPRequest): Promise<TOTPSetupResponse> {\n return this.fetch<TOTPSetupResponse>('auth/2fa/totp/setup', {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n async verifyTOTPSetup(data: VerifyTOTPSetupRequest): Promise<TwoFactorOperationResponse> {\n return this.fetch<TwoFactorOperationResponse>('auth/2fa/totp/verify', {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n async setupWebAuthn(data: SetupWebAuthnRequest): Promise<any> {\n return this.fetch<any>('auth/2fa/webauthn/setup', {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n async verifyWebAuthnSetup(\n data: VerifyWebAuthnSetupRequest\n ): Promise<TwoFactorOperationResponse> {\n return this.fetch<TwoFactorOperationResponse>('auth/2fa/webauthn/verify', {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n async generateRecoveryCodes(\n data: GenerateRecoveryCodesRequest = {}\n ): Promise<RecoveryCodesResponse> {\n return this.fetch<RecoveryCodesResponse>('auth/2fa/recovery-codes/generate', {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n async disableTwoFactorMethod(methodId: number): Promise<TwoFactorOperationResponse> {\n return this.fetch<TwoFactorOperationResponse>(`auth/2fa/methods/${methodId}`, {\n method: 'DELETE',\n });\n }\n\n async updateTwoFactorMethod(\n data: UpdateTwoFactorMethodRequest\n ): Promise<TwoFactorOperationResponse> {\n return this.fetch<TwoFactorOperationResponse>(`auth/2fa/methods/${data.methodId}`, {\n method: 'PUT',\n body: JSON.stringify(data),\n });\n }\n\n // ===== TWO-FACTOR AUTHENTICATION LOGIN METHODS =====\n\n async verifyTOTPAuth(\n tempToken: string,\n code: string\n ): Promise<{ token: string; accountId: number }> {\n return this.fetch<{ token: string; accountId: number }>('auth/2fa/auth/totp', {\n method: 'POST',\n body: JSON.stringify({\n temp_token: tempToken,\n code,\n }),\n });\n }\n\n async verifyRecoveryCodeAuth(\n tempToken: string,\n code: string\n ): Promise<{ token: string; accountId: number }> {\n return this.fetch<{ token: string; accountId: number }>('auth/2fa/auth/recovery', {\n method: 'POST',\n body: JSON.stringify({\n temp_token: tempToken,\n code,\n }),\n });\n }\n\n async getWebAuthnAuthOptions(tempToken: string): Promise<{\n credentialRequestOptions: {\n challenge: string;\n timeout: number;\n rpId: string;\n allowCredentials: Array<{ id: string; type: string }>;\n userVerification: string;\n };\n }> {\n return this.fetch<{\n credentialRequestOptions: {\n challenge: string;\n timeout: number;\n rpId: string;\n allowCredentials: Array<{ id: string; type: string }>;\n userVerification: string;\n };\n }>('auth/2fa/webauthn/options', {\n method: 'POST',\n body: JSON.stringify({\n temp_token: tempToken,\n }),\n });\n }\n\n async verifyWebAuthnAuth(\n tempToken: string,\n assertionResponse: any\n ): Promise<{ token: string; accountId: number }> {\n return this.fetch<{ token: string; accountId: number }>('auth/2fa/webauthn', {\n method: 'POST',\n body: JSON.stringify({\n temp_token: tempToken,\n assertion_response: assertionResponse,\n }),\n });\n }\n\n // ===== ORGANIZATION MEMBERSHIP METHODS =====\n\n async getMyOrganizations(): Promise<AdminAccountOrgMembership[]> {\n return this.fetch<AdminAccountOrgMembership[]>('o/mine');\n }\n\n // ===== CREDENTIAL CHANGE METHODS =====\n\n /**\n * Request to change email or phone credential.\n * Sends an OTP to the NEW credential to verify ownership.\n */\n async requestCredentialChange(\n credentialType: CredentialType,\n newValue: string\n ): Promise<CredentialChangeRequestResponse> {\n return this.fetch<CredentialChangeRequestResponse>('account/request-credential-change', {\n method: 'POST',\n body: JSON.stringify({\n credential_type: credentialType,\n new_value: newValue,\n }),\n });\n }\n\n /**\n * Verify a credential change request with OTP code.\n * On success, applies the credential change to the account.\n */\n async verifyCredentialChange(\n requestId: number,\n otpCode: string\n ): Promise<CredentialChangeVerifyResponse> {\n return this.fetch<CredentialChangeVerifyResponse>('account/verify-credential-change', {\n method: 'POST',\n body: JSON.stringify({\n request_id: requestId,\n otp_code: otpCode,\n }),\n });\n }\n\n /**\n * Get all pending (non-applied) credential change requests.\n */\n async getPendingCredentialChanges(): Promise<PendingCredentialChange[]> {\n return this.fetch<PendingCredentialChange[]>('account/pending-credential-changes');\n }\n\n /**\n * Cancel a pending credential change request.\n */\n async cancelCredentialChange(requestId: number): Promise<CancelCredentialChangeResponse> {\n return this.fetch<CancelCredentialChangeResponse>(\n `account/cancel-credential-change/${requestId}`,\n { method: 'DELETE' }\n );\n }\n\n // ===== CREDENTIAL CHANGE INVITE METHODS =====\n\n /**\n * Get details of a credential change invitation.\n * The user must be logged in and be the target of the invitation.\n */\n async getCredentialChangeInviteDetails(token: string): Promise<CredentialChangeInviteDetails> {\n return this.fetch<CredentialChangeInviteDetails>(`account/credential-change-invite/${token}`);\n }\n\n /**\n * Confirm a credential change invitation.\n * The user must be logged in and be the target of the invitation.\n */\n async confirmCredentialChangeInvite(\n token: string\n ): Promise<CredentialChangeInviteConfirmResponse> {\n return this.fetch<CredentialChangeInviteConfirmResponse>(\n `account/credential-change-invite/${token}/confirm`,\n { method: 'POST' }\n );\n }\n}\n","import type {\n AvailabilityCheck,\n AvailabilityResponse,\n AvailableSlotsRequest,\n AvailableSlotsResponse,\n Calendar,\n CalendarEvent,\n CalendarEventFormData,\n CalendarEventType,\n CalendarEventTypeFormData,\n CalendarEventsQueryParams,\n CalendarFormData,\n CalendarSchedule,\n CalendarScheduleFormData,\n GoogleCalendarInfo,\n GoogleCalendarInsufficientScopesResponse,\n GoogleCalendarStatusResponse,\n ICalFeedTokenResponse,\n ICalFeedUrlResponse,\n LinkCalendarRequest,\n LinkCalendarResponse,\n PaginatedResponse,\n SyncCalendarResponse,\n UnlinkCalendarResponse,\n UpdateAttendeeRequest,\n} from '../types';\nimport { BaseApiClient } from './base';\n\nexport class CalendarsApi extends BaseApiClient {\n // Calendar CRUD\n async getCalendars(\n wid: string,\n params?: { page?: number; pageSize?: number; includeSchedules?: boolean }\n ): Promise<PaginatedResponse<Calendar>> {\n const queryParams = new URLSearchParams();\n if (params?.page) queryParams.append('page', params.page.toString());\n if (params?.pageSize) queryParams.append('pageSize', params.pageSize.toString());\n if (params?.includeSchedules) queryParams.append('includeSchedules', 'true');\n\n const queryString = queryParams.toString();\n return this.fetch<PaginatedResponse<Calendar>>(\n `w/${wid}/calendars${queryString ? `?${queryString}` : ''}`\n );\n }\n\n async getCalendar(wid: string, id: number, includeSchedules?: boolean): Promise<Calendar> {\n const params = new URLSearchParams();\n if (includeSchedules) params.append('include_schedules', 'true');\n return this.fetch<Calendar>(\n `w/${wid}/calendars/${id}${params.toString() ? `?${params.toString()}` : ''}`\n );\n }\n\n async createCalendar(wid: string, calendar: CalendarFormData): Promise<Calendar> {\n return this.fetch<Calendar>(`w/${wid}/calendars`, {\n method: 'POST',\n body: JSON.stringify(calendar),\n });\n }\n\n async updateCalendar(\n wid: string,\n id: number,\n calendar: Partial<CalendarFormData>\n ): Promise<Calendar> {\n return this.fetch<Calendar>(`w/${wid}/calendars/${id}`, {\n method: 'PUT',\n body: JSON.stringify(calendar),\n });\n }\n\n async deleteCalendar(wid: string, id: number): Promise<void> {\n return this.fetch(`w/${wid}/calendars/${id}`, {\n method: 'DELETE',\n });\n }\n\n // Calendar Schedules\n async getCalendarSchedules(wid: string, calendarId: number): Promise<CalendarSchedule[]> {\n return this.fetch<CalendarSchedule[]>(`w/${wid}/calendars/${calendarId}/schedules`);\n }\n\n async createCalendarSchedule(\n wid: string,\n calendarId: number,\n schedule: CalendarScheduleFormData\n ): Promise<CalendarSchedule> {\n return this.fetch<CalendarSchedule>(`w/${wid}/calendars/${calendarId}/schedules`, {\n method: 'POST',\n body: JSON.stringify(schedule),\n });\n }\n\n async updateCalendarSchedule(\n wid: string,\n calendarId: number,\n scheduleId: number,\n schedule: Partial<CalendarScheduleFormData>\n ): Promise<CalendarSchedule> {\n return this.fetch<CalendarSchedule>(\n `w/${wid}/calendars/${calendarId}/schedules/${scheduleId}`,\n {\n method: 'PUT',\n body: JSON.stringify(schedule),\n }\n );\n }\n\n async deleteCalendarSchedule(\n wid: string,\n calendarId: number,\n scheduleId: number\n ): Promise<void> {\n return this.fetch(`w/${wid}/calendars/${calendarId}/schedules/${scheduleId}`, {\n method: 'DELETE',\n });\n }\n\n // Availability\n async checkAvailability(\n wid: string,\n calendarId: number,\n check: AvailabilityCheck\n ): Promise<AvailabilityResponse> {\n return this.fetch<AvailabilityResponse>(`w/${wid}/calendars/${calendarId}/availability`, {\n method: 'POST',\n body: JSON.stringify(check),\n });\n }\n\n async getAvailableSlots(\n wid: string,\n calendarId: number,\n request: AvailableSlotsRequest\n ): Promise<AvailableSlotsResponse> {\n return this.fetch<AvailableSlotsResponse>(\n `w/${wid}/calendars/${calendarId}/available-slots`,\n {\n method: 'POST',\n body: JSON.stringify(request),\n }\n );\n }\n\n // Calendar Events\n async getCalendarEvents(\n wid: string,\n options: CalendarEventsQueryParams = {}\n ): Promise<PaginatedResponse<CalendarEvent>> {\n const params = new URLSearchParams();\n if (options.calendarId) params.append('calendarId', options.calendarId.toString());\n if (options.startDate) params.append('startDate', options.startDate);\n if (options.endDate) params.append('endDate', options.endDate);\n if (options.status) params.append('status', options.status);\n if (options.memberId) params.append('memberId', options.memberId.toString());\n if (options.limit) params.append('limit', options.limit.toString());\n if (options.offset) params.append('offset', options.offset.toString());\n\n return this.fetch<PaginatedResponse<CalendarEvent>>(\n `w/${wid}/calendar-events${params.toString() ? `?${params.toString()}` : ''}`\n );\n }\n\n async getCalendarEvent(wid: string, eventId: number): Promise<CalendarEvent> {\n return this.fetch<CalendarEvent>(`w/${wid}/calendar-events/${eventId}`);\n }\n\n async createCalendarEvent(wid: string, event: CalendarEventFormData): Promise<CalendarEvent> {\n return this.fetch<CalendarEvent>(`w/${wid}/calendar-events`, {\n method: 'POST',\n body: JSON.stringify(event),\n });\n }\n\n async updateCalendarEvent(\n wid: string,\n eventId: number,\n event: Partial<CalendarEventFormData>\n ): Promise<CalendarEvent> {\n return this.fetch<CalendarEvent>(`w/${wid}/calendar-events/${eventId}`, {\n method: 'PUT',\n body: JSON.stringify(event),\n });\n }\n\n async cancelCalendarEvent(\n wid: string,\n eventId: number,\n reason?: string\n ): Promise<CalendarEvent> {\n return this.fetch<CalendarEvent>(`w/${wid}/calendar-events/${eventId}/cancel`, {\n method: 'POST',\n body: JSON.stringify({ cancellationReason: reason }),\n });\n }\n\n async deleteCalendarEvent(wid: string, eventId: number): Promise<void> {\n return this.fetch(`w/${wid}/calendar-events/${eventId}`, {\n method: 'DELETE',\n });\n }\n\n // Event attendees\n async updateEventAttendee(\n wid: string,\n eventId: number,\n attendeeId: number,\n update: UpdateAttendeeRequest\n ): Promise<void> {\n return this.fetch(`w/${wid}/calendar-events/${eventId}/attendees/${attendeeId}`, {\n method: 'PUT',\n body: JSON.stringify(update),\n });\n }\n\n // Event Types\n async getEventTypes(wid: string): Promise<PaginatedResponse<CalendarEventType>> {\n return this.fetch<PaginatedResponse<CalendarEventType>>(`w/${wid}/calendar-event-types`);\n }\n\n async getEventType(wid: string, id: number): Promise<CalendarEventType> {\n return this.fetch<CalendarEventType>(`w/${wid}/calendar-event-types/${id}`);\n }\n\n async createEventType(\n wid: string,\n eventType: CalendarEventTypeFormData\n ): Promise<CalendarEventType> {\n return this.fetch<CalendarEventType>(`w/${wid}/calendar-event-types`, {\n method: 'POST',\n body: JSON.stringify(eventType),\n });\n }\n\n async updateEventType(\n wid: string,\n id: number,\n eventType: Partial<CalendarEventTypeFormData>\n ): Promise<CalendarEventType> {\n return this.fetch<CalendarEventType>(`w/${wid}/calendar-event-types/${id}`, {\n method: 'PUT',\n body: JSON.stringify(eventType),\n });\n }\n\n async deleteEventType(wid: string, id: number): Promise<void> {\n return this.fetch(`w/${wid}/calendar-event-types/${id}`, {\n method: 'DELETE',\n });\n }\n\n // iCal Feed Management\n async generateICalToken(\n wid: string,\n calendarId: number,\n regenerate: boolean = false\n ): Promise<ICalFeedTokenResponse> {\n return this.fetch<ICalFeedTokenResponse>(`w/${wid}/calendars/${calendarId}/ical-token`, {\n method: 'POST',\n body: JSON.stringify({ regenerate }),\n });\n }\n\n async revokeICalToken(\n wid: string,\n calendarId: number\n ): Promise<{ success: boolean; message: string }> {\n return this.fetch<{ success: boolean; message: string }>(\n `w/${wid}/calendars/${calendarId}/ical-token`,\n {\n method: 'DELETE',\n }\n );\n }\n\n async getICalFeedUrl(wid: string, calendarId: number): Promise<ICalFeedUrlResponse> {\n return this.fetch<ICalFeedUrlResponse>(`w/${wid}/calendars/${calendarId}/ical-url`);\n }\n\n // Google Calendar Integration\n async listGoogleCalendars(wid: string): Promise<GoogleCalendarInfo[]> {\n return this.fetch<GoogleCalendarInfo[]>(`w/${wid}/calendars/google/list`);\n }\n\n async getGoogleCalendarStatus(\n wid: string\n ): Promise<GoogleCalendarStatusResponse | GoogleCalendarInsufficientScopesResponse> {\n return this.fetch<GoogleCalendarStatusResponse | GoogleCalendarInsufficientScopesResponse>(\n `w/${wid}/calendars/google/status`\n );\n }\n\n async linkCalendarToGoogle(\n wid: string,\n calendarId: number,\n request: LinkCalendarRequest\n ): Promise<LinkCalendarResponse> {\n return this.fetch<LinkCalendarResponse>(`w/${wid}/calendars/${calendarId}/google/link`, {\n method: 'POST',\n body: JSON.stringify(request),\n });\n }\n\n async unlinkCalendarFromGoogle(\n wid: string,\n calendarId: number\n ): Promise<UnlinkCalendarResponse> {\n return this.fetch<UnlinkCalendarResponse>(`w/${wid}/calendars/${calendarId}/google/link`, {\n method: 'DELETE',\n });\n }\n\n async syncCalendarWithGoogle(wid: string, calendarId: number): Promise<SyncCalendarResponse> {\n return this.fetch<SyncCalendarResponse>(`w/${wid}/calendars/${calendarId}/google/sync`, {\n method: 'POST',\n });\n }\n}\n","import {\n InitiateCallRequest,\n InitiateCallResponse,\n MessageTimingResponse,\n VoiceTokenResponse,\n} from '../types';\nimport { BaseApiClient } from './base';\n\nexport class CallsApi extends BaseApiClient {\n async initiateCall(wid: string, request: InitiateCallRequest): Promise<InitiateCallResponse> {\n return this.fetch<InitiateCallResponse>(`w/${wid}/call`, {\n method: 'POST',\n body: JSON.stringify(request),\n });\n }\n\n async getVoiceToken(wid: string): Promise<VoiceTokenResponse> {\n return this.fetch<VoiceTokenResponse>(`w/${wid}/voice/token`);\n }\n\n async getMessageTiming(wid: string, chatId: number): Promise<MessageTimingResponse> {\n return this.fetch<MessageTimingResponse>(`w/${wid}/recordings/chat/${chatId}/message-timing`);\n }\n}\n","import {\n Chat,\n ChatFilter,\n ChatFilterFormData,\n ChatFormData,\n ChatLabel,\n ChatLabelFormData,\n ChatMessage,\n ChatTokenUsage,\n GetChatsOptions,\n OutboundCallResponse,\n PaginatedResponse,\n TodoItem,\n ToolsResponse,\n} from '../types';\nimport { BaseApiClient } from './base';\n\nexport class ChatsApi extends BaseApiClient {\n /**\n * Build URLSearchParams from GetChatsOptions.\n * Excludes pagination params when includePagination is false.\n */\n private buildChatsQueryParams(\n options: GetChatsOptions,\n includePagination: boolean = true\n ): URLSearchParams {\n const params = new URLSearchParams();\n\n if (options.sortBy) params.append('sortBy', options.sortBy);\n if (options.sortOrder) params.append('sortOrder', options.sortOrder);\n\n if (includePagination) {\n if (options.page) params.append('page', options.page.toString());\n if (options.pageSize) params.append('pageSize', options.pageSize.toString());\n }\n\n if (options.mine !== undefined) params.append('mine', options.mine.toString());\n if (options.needsResponse !== undefined)\n params.append('needsResponse', options.needsResponse.toString());\n if (options.paused !== undefined) params.append('paused', options.paused.toString());\n if (options.archived !== undefined) params.append('archived', options.archived.toString());\n if (options.channel) params.append('channel', options.channel);\n\n // Default chatType to \"assignment\" if not specified\n const chatType = options.chatType ?? 'assignment';\n params.append('chatType', chatType);\n\n if (options.memberId !== undefined) params.append('memberId', options.memberId.toString());\n if (options.assistantMemberId !== undefined)\n params.append('assistantMemberId', options.assistantMemberId.toString());\n if (options.search) params.append('search', options.search);\n if (options.isTest !== undefined) params.append('isTest', options.isTest.toString());\n if (options.isAnonymous !== undefined)\n params.append('isAnonymous', options.isAnonymous.toString());\n if (options.filters && options.filters.length > 0) {\n params.append('filters', JSON.stringify(options.filters));\n }\n\n return params;\n }\n\n async getChats(wid: string, options: GetChatsOptions = {}): Promise<PaginatedResponse<Chat>> {\n const params = this.buildChatsQueryParams(options, true);\n const queryString = params.toString();\n return this.fetch<PaginatedResponse<Chat>>(\n `w/${wid}/chats${queryString ? `?${queryString}` : ''}`\n );\n }\n\n async exportChats(wid: string, options: GetChatsOptions = {}): Promise<Blob> {\n const params = this.buildChatsQueryParams(options, false);\n const queryString = params.toString();\n const response = await this.fetchRaw(\n `w/${wid}/chats/export${queryString ? `?${queryString}` : ''}`\n );\n return response.blob();\n }\n\n async exportChat(wid: string, chatId: number, format: 'jsonl' = 'jsonl'): Promise<Blob> {\n const response = await this.fetchRaw(`w/${wid}/chats/${chatId}/export?format=${format}`);\n return response.blob();\n }\n\n async getChat(wid: string, id: number): Promise<Chat> {\n return this.fetch<Chat>(`w/${wid}/chats/${id}`);\n }\n\n async getChatTokenUsage(wid: string, chatId: number): Promise<ChatTokenUsage> {\n return this.fetch<ChatTokenUsage>(`w/${wid}/chats/${chatId}/token-usage`);\n }\n\n async getChatTodos(wid: string, chatId: number): Promise<{ todos: TodoItem[] }> {\n return this.fetch<{ todos: TodoItem[] }>(`w/${wid}/chats/${chatId}/todos`);\n }\n\n async getChatSkills(\n wid: string,\n chatId: number\n ): Promise<{ loadedSkills: string[]; revealedSkills: string[] }> {\n return this.fetch<{ loadedSkills: string[]; revealedSkills: string[] }>(\n `w/${wid}/chats/${chatId}/skills`\n );\n }\n\n async getChatsNeedsResponse(wid: string): Promise<number[]> {\n return this.fetch<number[]>(`w/${wid}/chats/needs-response`);\n }\n\n async getChatsDailyCreationStats(\n wid: string,\n options?: {\n archived?: boolean;\n isTest?: boolean;\n }\n ): Promise<{\n dailyStats: Array<{\n date: string;\n count: number;\n assignment?: number;\n manager?: number;\n developer?: number;\n testing?: number;\n }>;\n }> {\n const params = new URLSearchParams();\n if (options?.archived !== undefined) params.append('archived', options.archived.toString());\n if (options?.isTest !== undefined) params.append('isTest', options.isTest.toString());\n\n const queryString = params.toString();\n return this.fetch(\n `w/${wid}/chats/stats/daily-creation${queryString ? `?${queryString}` : ''}`\n );\n }\n\n async archiveChat(wid: string, id: number): Promise<void> {\n return this.fetch(`w/${wid}/chats/${id}/archive`, {\n method: 'PUT',\n });\n }\n\n async unarchiveChat(wid: string, id: number): Promise<void> {\n return this.fetch(`w/${wid}/chats/${id}/unarchive`, {\n method: 'PUT',\n });\n }\n\n async createChat(wid: string, chat: ChatFormData): Promise<Chat> {\n return this.fetch<Chat>(`w/${wid}/chats`, {\n method: 'POST',\n body: JSON.stringify(chat),\n });\n }\n\n async deleteChat(wid: string, id: number, reason?: string): Promise<void> {\n return this.fetch(`w/${wid}/chats/${id}`, {\n method: 'DELETE',\n body: reason ? JSON.stringify({ reason }) : undefined,\n });\n }\n\n async updateChat(wid: string, id: number, chat: Partial<ChatFormData>): Promise<Chat> {\n return this.fetch<Chat>(`w/${wid}/chats/${id}`, {\n method: 'PUT',\n body: JSON.stringify(chat),\n });\n }\n\n async updateChatMute(\n wid: string,\n id: number,\n muted: boolean\n ): Promise<{ id: number; muted: boolean }> {\n return this.fetch<{ id: number; muted: boolean }>(`w/${wid}/chats/${id}/mute`, {\n method: 'PUT',\n body: JSON.stringify({ muted }),\n });\n }\n\n async updateChatNeedsResponse(\n wid: string,\n id: number,\n needsResponse: boolean\n ): Promise<{ id: number; needsResponse: boolean }> {\n return this.fetch<{ id: number; needsResponse: boolean }>(\n `w/${wid}/chats/${id}/needs-response`,\n {\n method: 'PUT',\n body: JSON.stringify({ needsResponse }),\n }\n );\n }\n\n async summarizeChat(wid: string, id: number, updateLabels?: boolean): Promise<Chat> {\n const params = new URLSearchParams();\n if (updateLabels !== undefined) {\n params.append('update_labels', updateLabels.toString());\n }\n return this.fetch<Chat>(\n `w/${wid}/chats/${id}/summarize${params.toString() ? `?${params.toString()}` : ''}`,\n {\n method: 'POST',\n }\n );\n }\n\n async getChatMessages(\n wid: string,\n id: number,\n limit?: number,\n offset?: number\n ): Promise<ChatMessage[]> {\n const params = new URLSearchParams();\n if (limit) params.append('limit', limit.toString());\n if (offset) params.append('offset', offset.toString());\n return this.fetch<ChatMessage[]>(\n `w/${wid}/chats/${id}/messages${params.toString() ? `?${params.toString()}` : ''}`\n );\n }\n\n async getChatToolCallMessages(\n wid: string,\n chatId: number,\n callId: string,\n limit: number = 100,\n offset: number = 0\n ): Promise<ChatMessage[]> {\n const params = new URLSearchParams();\n params.append('limit', limit.toString());\n params.append('offset', offset.toString());\n return this.fetch<ChatMessage[]>(\n `w/${wid}/chats/${chatId}/tool-calls/${callId}/messages?${params.toString()}`\n );\n }\n\n async getChatTools(wid: string, chatId: number): Promise<ToolsResponse> {\n return this.fetch<ToolsResponse>(`w/${wid}/chats/${chatId}/tools`);\n }\n\n async initiateOutboundCall(\n wid: string,\n chatId: number,\n phoneNumberId: number\n ): Promise<OutboundCallResponse> {\n return this.fetch(`w/${wid}/chats/${chatId}/outbound-call`, {\n method: 'POST',\n body: JSON.stringify({ phoneNumberId, chatId }),\n });\n }\n\n async sendAssistantMessage(\n wid: string,\n chatId: number,\n message: string,\n toolCalls?: Array<{\n type: 'function';\n id: string;\n function: {\n name: string;\n arguments: string;\n };\n }>\n ): Promise<{\n success: boolean;\n message: string;\n message_id: string;\n message_uuid: string;\n role: string;\n content: string;\n received_at: string | null;\n }> {\n return this.fetch(`w/${wid}/chats/${chatId}/send-assistant-message`, {\n method: 'POST',\n body: JSON.stringify({\n message,\n tool_calls: toolCalls,\n }),\n });\n }\n\n async rateMessage(\n wid: string,\n chatId: number,\n messageUuid: string,\n rating: number\n ): Promise<{ status: string; detail?: string }> {\n return this.fetch<{ status: string; detail?: string }>(\n `w/${wid}/chats/${chatId}/messages/${messageUuid}/rate`,\n {\n method: 'POST',\n body: JSON.stringify({ rating }),\n }\n );\n }\n\n /**\n * Find or create a DM chat with a specific member.\n * Returns the Chat object for the DM conversation.\n */\n async findOrCreateDMChat(wid: string, memberId: number): Promise<Chat> {\n return this.fetch<Chat>(`w/${wid}/chats/dm`, {\n method: 'POST',\n body: JSON.stringify({ memberId }),\n });\n }\n\n /**\n * Send a user message in a chat (works for DM and regular chats).\n */\n async sendChatMessage(wid: string, chatId: number, content: string): Promise<ChatMessage> {\n return this.fetch<ChatMessage>(`w/${wid}/chats/${chatId}/messages`, {\n method: 'POST',\n body: JSON.stringify({ content }),\n });\n }\n\n async getChatAssignmentTasks(\n wid: string,\n chatId: number\n ): Promise<\n Array<{\n id: number;\n name: string;\n isCurrent: boolean;\n }>\n > {\n return this.fetch(`w/${wid}/chats/${chatId}/assignment-tasks`);\n }\n\n // Chat Completion API (used by eval scripts)\n async createChatCompletion(\n wid: string,\n chatId: number,\n data: {\n model?: string;\n messages: Array<{ role: string; content: string }>;\n }\n ): Promise<{\n id: string;\n object: string;\n created: number;\n model: string;\n choices: Array<{\n index: number;\n message: {\n role: string;\n content: string;\n };\n finish_reason: string;\n }>;\n usage?: {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n };\n }> {\n return this.fetch(`w/${wid}/web-chat/${chatId}/chat/completions?stream=false`, {\n method: 'POST',\n body: JSON.stringify({\n model: data.model || 'gpt-4',\n messages: data.messages,\n }),\n });\n }\n\n // Chat Labels API\n async getChatLabels(wid: string): Promise<ChatLabel[]> {\n return this.fetch<ChatLabel[]>(`w/${wid}/chat-labels`);\n }\n\n async getChatLabel(wid: string, id: number): Promise<ChatLabel> {\n return this.fetch<ChatLabel>(`w/${wid}/chat-labels/${id}`);\n }\n\n async getChatLabelByUuid(wid: string, uuid: string): Promise<ChatLabel> {\n return this.fetch<ChatLabel>(`w/${wid}/chat-labels/${uuid}`);\n }\n\n async createChatLabel(wid: string, label: ChatLabelFormData): Promise<ChatLabel> {\n return this.fetch<ChatLabel>(`w/${wid}/chat-labels`, {\n method: 'POST',\n body: JSON.stringify(label),\n });\n }\n\n async updateChatLabel(\n wid: string,\n id: number,\n label: Partial<ChatLabelFormData>\n ): Promise<ChatLabel> {\n return this.fetch<ChatLabel>(`w/${wid}/chat-labels/${id}`, {\n method: 'PUT',\n body: JSON.stringify(label),\n });\n }\n\n async deleteChatLabel(wid: string, id: number): Promise<void> {\n return this.fetch<void>(`w/${wid}/chat-labels/${id}`, {\n method: 'DELETE',\n });\n }\n\n // Chat Filters\n async getChatFilters(wid: string): Promise<ChatFilter[]> {\n return this.fetch<ChatFilter[]>(`w/${wid}/chat-filters`);\n }\n\n async getChatFilter(wid: string, id: number): Promise<ChatFilter> {\n return this.fetch<ChatFilter>(`w/${wid}/chat-filters/${id}`);\n }\n\n async getChatFilterByUuid(wid: string, uuid: string): Promise<ChatFilter> {\n return this.fetch<ChatFilter>(`w/${wid}/chat-filters/by-uuid/${uuid}`);\n }\n\n async createChatFilter(wid: string, filter: ChatFilterFormData): Promise<ChatFilter> {\n return this.fetch<ChatFilter>(`w/${wid}/chat-filters`, {\n method: 'POST',\n body: JSON.stringify(filter),\n });\n }\n\n async updateChatFilter(\n wid: string,\n id: number,\n filter: Partial<ChatFilterFormData>\n ): Promise<ChatFilter> {\n return this.fetch<ChatFilter>(`w/${wid}/chat-filters/${id}`, {\n method: 'PUT',\n body: JSON.stringify(filter),\n });\n }\n\n async deleteChatFilter(wid: string, id: number): Promise<void> {\n return this.fetch<void>(`w/${wid}/chat-filters/${id}`, {\n method: 'DELETE',\n });\n }\n}\n","import { BaseApiClient } from './base';\nimport {\n CustomToolkit,\n CustomToolkitFormData,\n CustomToolkitUpdateFormData,\n CustomTool,\n CustomToolFormData,\n CustomToolUpdateFormData,\n} from '../types';\n\nexport class CustomToolkitsApi extends BaseApiClient {\n /**\n * List all custom toolkits in a workspace\n */\n async getCustomToolkits(wid: string): Promise<CustomToolkit[]> {\n return this.fetch<CustomToolkit[]>(`w/${wid}/custom-toolkits`);\n }\n\n /**\n * Get a specific custom toolkit\n */\n async getCustomToolkit(wid: string, toolkitId: number): Promise<CustomToolkit> {\n return this.fetch<CustomToolkit>(`w/${wid}/custom-toolkits/${toolkitId}`);\n }\n\n /**\n * Create a new custom toolkit\n */\n async createCustomToolkit(wid: string, data: CustomToolkitFormData): Promise<CustomToolkit> {\n return this.fetch<CustomToolkit>(`w/${wid}/custom-toolkits`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n /**\n * Update an existing custom toolkit\n */\n async updateCustomToolkit(\n wid: string,\n toolkitId: number,\n data: CustomToolkitUpdateFormData\n ): Promise<CustomToolkit> {\n return this.fetch<CustomToolkit>(`w/${wid}/custom-toolkits/${toolkitId}`, {\n method: 'PUT',\n body: JSON.stringify(data),\n });\n }\n\n /**\n * Delete a custom toolkit\n */\n async deleteCustomToolkit(wid: string, toolkitId: number): Promise<{ status: string }> {\n return this.fetch<{ status: string }>(`w/${wid}/custom-toolkits/${toolkitId}`, {\n method: 'DELETE',\n });\n }\n\n /**\n * Enable a custom toolkit\n */\n async enableCustomToolkit(wid: string, toolkitId: number): Promise<CustomToolkit> {\n return this.fetch<CustomToolkit>(`w/${wid}/custom-toolkits/${toolkitId}/enable`, {\n method: 'POST',\n });\n }\n\n /**\n * Disable a custom toolkit\n */\n async disableCustomToolkit(wid: string, toolkitId: number): Promise<CustomToolkit> {\n return this.fetch<CustomToolkit>(`w/${wid}/custom-toolkits/${toolkitId}/disable`, {\n method: 'POST',\n });\n }\n\n /**\n * Create a new custom tool in a toolkit\n */\n async createCustomTool(\n wid: string,\n toolkitId: number,\n data: CustomToolFormData\n ): Promise<CustomTool> {\n return this.fetch<CustomTool>(`w/${wid}/custom-toolkits/${toolkitId}/tools`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n /**\n * Update an existing custom tool\n */\n async updateCustomTool(\n wid: string,\n toolkitId: number,\n toolId: number,\n data: CustomToolUpdateFormData\n ): Promise<CustomTool> {\n return this.fetch<CustomTool>(`w/${wid}/custom-toolkits/${toolkitId}/tools/${toolId}`, {\n method: 'PUT',\n body: JSON.stringify(data),\n });\n }\n\n /**\n * Delete a custom tool\n */\n async deleteCustomTool(\n wid: string,\n toolkitId: number,\n toolId: number\n ): Promise<{ status: string }> {\n return this.fetch<{ status: string }>(\n `w/${wid}/custom-toolkits/${toolkitId}/tools/${toolId}`,\n {\n method: 'DELETE',\n }\n );\n }\n}\n","import {\n DataRecord,\n DataRecordFormData,\n DataRecordsPaginatedResponse,\n DataRecordUpdate,\n DataType,\n DataTypeFormData,\n} from '../types';\nimport { BaseApiClient } from './base';\n\nexport class DataTypesApi extends BaseApiClient {\n async getDataTypes(wid: string, options?: { archived?: boolean }): Promise<DataType[]> {\n const params = new URLSearchParams();\n if (options?.archived !== undefined) {\n params.append('archived', options.archived.toString());\n }\n const queryString = params.toString();\n return this.fetch<DataType[]>(`w/${wid}/data-types${queryString ? `?${queryString}` : ''}`);\n }\n\n async getDataType(wid: string, id: number): Promise<DataType> {\n return this.fetch<DataType>(`w/${wid}/data-types/${id}`);\n }\n\n async getDataTypeBySlug(wid: string, slug: string): Promise<DataType> {\n return this.fetch<DataType>(`w/${wid}/data-types/slug/${slug}`);\n }\n\n async createDataType(wid: string, dataType: DataTypeFormData): Promise<DataType> {\n return this.fetch<DataType>(`w/${wid}/data-types`, {\n method: 'POST',\n body: JSON.stringify(dataType),\n });\n }\n\n async updateDataType(\n wid: string,\n id: number,\n dataType: Partial<DataTypeFormData>\n ): Promise<DataType> {\n return this.fetch<DataType>(`w/${wid}/data-types/${id}`, {\n method: 'PUT',\n body: JSON.stringify(dataType),\n });\n }\n\n async deleteDataType(wid: string, id: number): Promise<void> {\n return this.fetch(`w/${wid}/data-types/${id}`, {\n method: 'DELETE',\n });\n }\n\n async archiveDataType(wid: string, id: number): Promise<{ status: string }> {\n return this.fetch<{ status: string }>(`w/${wid}/data-types/${id}/archive`, {\n method: 'POST',\n });\n }\n\n async unarchiveDataType(wid: string, id: number): Promise<{ status: string }> {\n return this.fetch<{ status: string }>(`w/${wid}/data-types/${id}/unarchive`, {\n method: 'POST',\n });\n }\n\n async cloneDataType(\n wid: string,\n id: number,\n data: { name: string; slug: string }\n ): Promise<DataType> {\n return this.fetch<DataType>(`w/${wid}/data-types/${id}/clone`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n async getDataRecords(\n wid: string,\n dataTypeId: number,\n options?: {\n memberId?: number;\n search?: string;\n searchField?: string;\n page?: number;\n pageSize?: number;\n }\n ): Promise<DataRecordsPaginatedResponse> {\n const params = new URLSearchParams();\n if (options?.memberId) params.append('member_id', options.memberId.toString());\n if (options?.search) params.append('search', options.search);\n if (options?.searchField) params.append('search_field', options.searchField);\n if (options?.page) params.append('page', options.page.toString());\n if (options?.pageSize) params.append('page_size', options.pageSize.toString());\n\n return this.fetch<DataRecordsPaginatedResponse>(\n `w/${wid}/data-types/${dataTypeId}/records${params?.toString() ? `?${params.toString()}` : ''}`\n );\n }\n\n async getDataRecord(wid: string, recordId: number): Promise<DataRecord> {\n return this.fetch<DataRecord>(`w/${wid}/data-types/records/${recordId}`);\n }\n\n async createDataRecord(\n wid: string,\n dataTypeId: number,\n record: DataRecordFormData\n ): Promise<DataRecord> {\n return this.fetch<DataRecord>(`w/${wid}/data-types/${dataTypeId}/records`, {\n method: 'POST',\n body: JSON.stringify(record),\n });\n }\n\n async updateDataRecord(\n wid: string,\n dataTypeId: number,\n recordId: number,\n record: DataRecordFormData\n ): Promise<DataRecord> {\n return this.fetch<DataRecord>(`w/${wid}/data-types/${dataTypeId}/records/${recordId}`, {\n method: 'PUT',\n body: JSON.stringify(record),\n });\n }\n\n async deleteDataRecord(wid: string, dataTypeId: number, recordId: number): Promise<void> {\n return this.fetch(`w/${wid}/data-types/${dataTypeId}/records/${recordId}`, {\n method: 'DELETE',\n });\n }\n\n async getDataRecordChanges(\n wid: string,\n dataTypeId: number,\n recordId: number\n ): Promise<DataRecordUpdate[]> {\n return this.fetch<DataRecordUpdate[]>(\n `w/${wid}/data-types/${dataTypeId}/records/${recordId}/changes`\n );\n }\n\n // Upsert Data Record API (used by eval scripts)\n async upsertDataRecord(\n wid: string,\n dataTypeId: number,\n externalId: string | number,\n data: {\n fieldValues: Record<string, any>;\n }\n ): Promise<DataRecord> {\n return this.fetch<DataRecord>(`w/${wid}/data-types/${dataTypeId}/upsert/${externalId}`, {\n method: 'POST',\n body: JSON.stringify({\n externalId,\n fieldValues: data.fieldValues,\n }),\n });\n }\n\n // Toggle field indexing for faster search\n async toggleFieldIndex(\n wid: string,\n dataTypeId: number,\n fieldSlug: string,\n shouldIndex: boolean\n ): Promise<{ status: string; message: string; indexStatus?: string }> {\n return this.fetch(`w/${wid}/data-types/${dataTypeId}/fields/${fieldSlug}/toggle-index`, {\n method: 'POST',\n body: JSON.stringify({ shouldIndex: shouldIndex }),\n });\n }\n\n // Get field index status\n async getFieldIndexStatus(\n wid: string,\n dataTypeId: number,\n fieldSlug: string\n ): Promise<{\n fieldSlug: string;\n fieldName: string;\n shouldIndex: string;\n indexStatus: string;\n }> {\n return this.fetch(`w/${wid}/data-types/${dataTypeId}/fields/${fieldSlug}/index-status`);\n }\n\n /**\n * Validate if a data type slug is available.\n * Returns availability and a suggested alternative if taken.\n */\n async validateDataTypeSlug(\n wid: string,\n slug: string,\n excludeId?: number\n ): Promise<{ available: boolean; suggestedSlug?: string }> {\n return this.fetch(`w/${wid}/data-types/validate-slug`, {\n method: 'POST',\n body: JSON.stringify({ slug, excludeId }),\n });\n }\n\n /**\n * Get record counts per data type for a specific member.\n * Returns a mapping of data type ID to record count.\n */\n async getMemberRecordCounts(\n wid: string,\n memberId: number\n ): Promise<{ counts: Record<number, number> }> {\n return this.fetch(`w/${wid}/data-types/member-record-counts?member_id=${memberId}`);\n }\n}\n","import { BaseApiClient } from './base';\nimport {\n DiscordBot,\n CreateDiscordBotRequest,\n UpdateDiscordBotRequest,\n DiscordThread,\n DiscordGuild,\n DiscordBotAccount,\n MemberCredential,\n PaginatedResponse,\n DiscordBotSortField,\n SortOrder,\n} from '../types';\n\nexport class DiscordBotsApi extends BaseApiClient {\n /**\n * List all Discord bots configured for a workspace.\n */\n async getDiscordBots(\n wid: string,\n options: {\n page?: number;\n pageSize?: number;\n sortBy?: DiscordBotSortField;\n sortOrder?: SortOrder;\n search?: string;\n } = {}\n ): Promise<PaginatedResponse<DiscordBot>> {\n const params = new URLSearchParams();\n if (options.page) params.append('page', options.page.toString());\n if (options.pageSize) params.append('pageSize', options.pageSize.toString());\n if (options.sortBy) params.append('sortBy', options.sortBy);\n if (options.sortOrder) params.append('sortOrder', options.sortOrder);\n if (options.search) params.append('search', options.search);\n\n return this.fetch<PaginatedResponse<DiscordBot>>(\n `w/${wid}/app-connections/discord/bots${params.toString() ? `?${params.toString()}` : ''}`\n );\n }\n\n /**\n * Get a specific Discord bot by ID.\n */\n async getDiscordBot(wid: string, botId: number): Promise<DiscordBot> {\n return this.fetch<DiscordBot>(`w/${wid}/app-connections/discord/bots/${botId}`);\n }\n\n /**\n * Get a Discord bot by UUID.\n */\n async getDiscordBotByUuid(wid: string, uuid: string): Promise<DiscordBot> {\n return this.fetch<DiscordBot>(`w/${wid}/app-connections/discord/bots/uuid/${uuid}`);\n }\n\n /**\n * Create a new Discord bot configuration.\n */\n async createDiscordBot(wid: string, data: CreateDiscordBotRequest): Promise<DiscordBot> {\n return this.fetch<DiscordBot>(`w/${wid}/app-connections/discord/bots`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n /**\n * Update an existing Discord bot configuration.\n */\n async updateDiscordBot(\n wid: string,\n botId: number,\n data: UpdateDiscordBotRequest\n ): Promise<DiscordBot> {\n return this.fetch<DiscordBot>(`w/${wid}/app-connections/discord/bots/${botId}`, {\n method: 'PUT',\n body: JSON.stringify(data),\n });\n }\n\n /**\n * Delete a Discord bot configuration.\n */\n async deleteDiscordBot(wid: string, botId: number): Promise<void> {\n return this.fetch(`w/${wid}/app-connections/discord/bots/${botId}`, {\n method: 'DELETE',\n });\n }\n\n /**\n * Register slash commands for a Discord bot.\n */\n async registerSlashCommands(wid: string, botId: number): Promise<void> {\n return this.fetch(`w/${wid}/app-connections/discord/bots/${botId}/register-commands`, {\n method: 'POST',\n });\n }\n\n /**\n * Register role connection metadata schema for Discord Linked Roles.\n * This defines what metadata fields are available for linked roles.\n */\n async registerLinkedRolesMetadata(\n wid: string,\n botId: number\n ): Promise<{ registered: number; fields: string[] }> {\n return this.fetch(\n `w/${wid}/app-connections/discord/bots/${botId}/linked-roles/register-metadata`,\n {\n method: 'POST',\n }\n );\n }\n\n /**\n * Get Discord threads for a bot.\n */\n async getDiscordThreads(\n wid: string,\n botId: number,\n options: {\n page?: number;\n pageSize?: number;\n } = {}\n ): Promise<PaginatedResponse<DiscordThread>> {\n const params = new URLSearchParams();\n if (options.page) params.append('page', options.page.toString());\n if (options.pageSize) params.append('pageSize', options.pageSize.toString());\n\n return this.fetch<PaginatedResponse<DiscordThread>>(\n `w/${wid}/app-connections/discord/bots/${botId}/threads${params.toString() ? `?${params.toString()}` : ''}`\n );\n }\n\n /**\n * Get the current member's credentials (connected accounts).\n */\n async getMyCredentials(wid: string): Promise<MemberCredential[]> {\n return this.fetch<MemberCredential[]>(`w/${wid}/me/credentials`);\n }\n\n /**\n * Unlink a credential from the current member's account.\n */\n async unlinkCredential(wid: string, credentialId: number): Promise<void> {\n return this.fetch(`w/${wid}/me/credentials/${credentialId}`, {\n method: 'DELETE',\n });\n }\n\n /**\n * Get Discord guilds (servers) that have interacted with a bot.\n */\n async getDiscordGuilds(\n wid: string,\n botId: number,\n options: {\n page?: number;\n pageSize?: number;\n } = {}\n ): Promise<PaginatedResponse<DiscordGuild>> {\n const params = new URLSearchParams();\n if (options.page) params.append('page', options.page.toString());\n if (options.pageSize) params.append('pageSize', options.pageSize.toString());\n\n return this.fetch<PaginatedResponse<DiscordGuild>>(\n `w/${wid}/app-connections/discord/bots/${botId}/guilds${params.toString() ? `?${params.toString()}` : ''}`\n );\n }\n\n /**\n * Get Discord account links for a bot (members linked to Discord users).\n */\n async getDiscordBotAccounts(\n wid: string,\n botId: number,\n options: {\n page?: number;\n pageSize?: number;\n } = {}\n ): Promise<PaginatedResponse<DiscordBotAccount>> {\n const params = new URLSearchParams();\n if (options.page) params.append('page', options.page.toString());\n if (options.pageSize) params.append('pageSize', options.pageSize.toString());\n\n return this.fetch<PaginatedResponse<DiscordBotAccount>>(\n `w/${wid}/app-connections/discord/bots/${botId}/accounts${params.toString() ? `?${params.toString()}` : ''}`\n );\n }\n}\n","import { BaseApiClient } from './base';\nimport {\n SlackApp,\n SlackAppInstallation,\n SlackAccount,\n CreateSlackAppRequest,\n UpdateSlackAppRequest,\n SlackThread,\n PaginatedResponse,\n SlackAppSortField,\n SortOrder,\n} from '../types';\n\nexport class SlackAppsApi extends BaseApiClient {\n /**\n * List all Slack apps configured for a workspace.\n */\n async getSlackApps(\n wid: string,\n options: {\n page?: number;\n pageSize?: number;\n sortBy?: SlackAppSortField;\n sortOrder?: SortOrder;\n search?: string;\n } = {}\n ): Promise<PaginatedResponse<SlackApp>> {\n const params = new URLSearchParams();\n if (options.page) params.append('page', options.page.toString());\n if (options.pageSize) params.append('pageSize', options.pageSize.toString());\n if (options.sortBy) params.append('sortBy', options.sortBy);\n if (options.sortOrder) params.append('sortOrder', options.sortOrder);\n if (options.search) params.append('search', options.search);\n\n return this.fetch<PaginatedResponse<SlackApp>>(\n `w/${wid}/app-connections/slack/apps${params.toString() ? `?${params.toString()}` : ''}`\n );\n }\n\n /**\n * Get a specific Slack app by ID.\n */\n async getSlackApp(wid: string, appId: number): Promise<SlackApp> {\n return this.fetch<SlackApp>(`w/${wid}/app-connections/slack/apps/${appId}`);\n }\n\n /**\n * Create a new Slack app configuration.\n */\n async createSlackApp(wid: string, data: CreateSlackAppRequest): Promise<SlackApp> {\n return this.fetch<SlackApp>(`w/${wid}/app-connections/slack/apps`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n /**\n * Update an existing Slack app configuration.\n */\n async updateSlackApp(\n wid: string,\n appId: number,\n data: UpdateSlackAppRequest\n ): Promise<SlackApp> {\n return this.fetch<SlackApp>(`w/${wid}/app-connections/slack/apps/${appId}`, {\n method: 'PUT',\n body: JSON.stringify(data),\n });\n }\n\n /**\n * Delete a Slack app configuration.\n */\n async deleteSlackApp(wid: string, appId: number): Promise<void> {\n return this.fetch(`w/${wid}/app-connections/slack/apps/${appId}`, {\n method: 'DELETE',\n });\n }\n\n /**\n * Get Slack threads for an app.\n */\n async getSlackThreads(\n wid: string,\n appId: number,\n options: {\n page?: number;\n pageSize?: number;\n } = {}\n ): Promise<PaginatedResponse<SlackThread>> {\n const params = new URLSearchParams();\n if (options.page) params.append('page', options.page.toString());\n if (options.pageSize) params.append('pageSize', options.pageSize.toString());\n\n return this.fetch<PaginatedResponse<SlackThread>>(\n `w/${wid}/app-connections/slack/apps/${appId}/threads${params.toString() ? `?${params.toString()}` : ''}`\n );\n }\n\n /**\n * Get Slack workspace installations for an app.\n */\n async getSlackInstallations(\n wid: string,\n appId: number,\n options: {\n page?: number;\n pageSize?: number;\n } = {}\n ): Promise<PaginatedResponse<SlackAppInstallation>> {\n const params = new URLSearchParams();\n if (options.page) params.append('page', options.page.toString());\n if (options.pageSize) params.append('pageSize', options.pageSize.toString());\n\n return this.fetch<PaginatedResponse<SlackAppInstallation>>(\n `w/${wid}/app-connections/slack/apps/${appId}/installations${params.toString() ? `?${params.toString()}` : ''}`\n );\n }\n\n /**\n * Get Slack account links for an app (members linked to Slack users).\n */\n async getSlackAppAccounts(\n wid: string,\n appId: number,\n options: {\n page?: number;\n pageSize?: number;\n } = {}\n ): Promise<PaginatedResponse<SlackAccount>> {\n const params = new URLSearchParams();\n if (options.page) params.append('page', options.page.toString());\n if (options.pageSize) params.append('pageSize', options.pageSize.toString());\n\n return this.fetch<PaginatedResponse<SlackAccount>>(\n `w/${wid}/app-connections/slack/apps/${appId}/accounts${params.toString() ? `?${params.toString()}` : ''}`\n );\n }\n}\n","import { BaseApiClient } from './base';\nimport {\n Event,\n EventRun,\n EventRule,\n EventRuleActionType,\n EventRuleEventType,\n EventRuleFormData,\n EventRuleObjectType,\n EventsQueryParams,\n CreateEventRequest,\n UpdateEventRequest,\n UpdateEventRuleFormData,\n WebhookLog,\n WebhookLogsQueryParams,\n RuleExecution,\n RuleExecutionsQueryParams,\n PaginatedResponse,\n EventRunSortField,\n SortOrder,\n} from '../types';\nimport type { CursorPaginatedResponse } from '../types/coreTypes';\nimport { EventActionMappingsResponse } from '../types/eventRuleTypes';\n\nexport class EventsApi extends BaseApiClient {\n // Event Rules API\n async getEventRules(wid: string): Promise<EventRule[]> {\n return this.fetch<EventRule[]>(`w/${wid}/event-rules`);\n }\n\n async getAvailableActions(wid: string): Promise<EventActionMappingsResponse> {\n return this.fetch<EventActionMappingsResponse>(`w/${wid}/event-rules/actions/available`);\n }\n\n async searchEventRules(\n wid: string,\n params: {\n objectType?: EventRuleObjectType;\n eventType?: EventRuleEventType;\n actionType?: EventRuleActionType;\n taskId?: number;\n dataTypeId?: number;\n scheduledEventId?: number;\n workflowId?: number;\n includeDisabled?: boolean;\n }\n ): Promise<EventRule[]> {\n const searchParams = new URLSearchParams();\n if (params.objectType) searchParams.append('objectType', params.objectType);\n if (params.eventType) searchParams.append('eventType', params.eventType);\n if (params.actionType) searchParams.append('actionType', params.actionType);\n if (params.taskId) searchParams.append('taskId', params.taskId.toString());\n if (params.dataTypeId) searchParams.append('dataTypeId', params.dataTypeId.toString());\n if (params.scheduledEventId)\n searchParams.append('scheduledEventId', params.scheduledEventId.toString());\n if (params.workflowId) searchParams.append('workflowId', params.workflowId.toString());\n if (params.includeDisabled) searchParams.append('includeDisabled', 'true');\n return this.fetch<EventRule[]>(`w/${wid}/event-rules/search?${searchParams.toString()}`);\n }\n\n async getEventRule(wid: string, id: number): Promise<EventRule> {\n return this.fetch<EventRule>(`w/${wid}/event-rules/${id}`);\n }\n\n async createEventRule(wid: string, rule: EventRuleFormData): Promise<EventRule> {\n return this.fetch<EventRule>(`w/${wid}/event-rules`, {\n method: 'POST',\n body: JSON.stringify(rule),\n });\n }\n\n async updateEventRule(\n wid: string,\n id: number,\n rule: UpdateEventRuleFormData\n ): Promise<EventRule> {\n return this.fetch<EventRule>(`w/${wid}/event-rules/${id}`, {\n method: 'PUT',\n body: JSON.stringify(rule),\n });\n }\n\n async deleteEventRule(wid: string, id: number): Promise<void> {\n return this.fetch(`w/${wid}/event-rules/${id}`, {\n method: 'DELETE',\n });\n }\n\n async reorderEventRules(wid: string, ruleIds: number[]): Promise<{ status: string }> {\n return this.fetch<{ status: string }>(`w/${wid}/event-rules/reorder`, {\n method: 'POST',\n body: JSON.stringify(ruleIds),\n });\n }\n\n // Webhook Logs API\n async getWebhookLogs(\n wid: string,\n options: WebhookLogsQueryParams = {}\n ): Promise<PaginatedResponse<WebhookLog>> {\n const params = new URLSearchParams();\n if (options.page) params.append('page', options.page.toString());\n if (options.pageSize) params.append('pageSize', options.pageSize.toString());\n if (options.sortBy) params.append('sortBy', options.sortBy);\n if (options.sortOrder) params.append('sortOrder', options.sortOrder);\n if (options.eventType) params.append('eventType', options.eventType);\n if (options.success !== undefined) params.append('success', options.success.toString());\n\n return this.fetch<PaginatedResponse<WebhookLog>>(\n `w/${wid}/webhook-logs${params.toString() ? `?${params.toString()}` : ''}`\n );\n }\n\n async getRuleExecutions(\n wid: string,\n options: RuleExecutionsQueryParams = {}\n ): Promise<CursorPaginatedResponse<RuleExecution>> {\n const params = new URLSearchParams();\n if (options.cursor) params.append('cursor', options.cursor);\n if (options.pageSize) params.append('pageSize', options.pageSize.toString());\n if (options.sortBy) params.append('sortBy', options.sortBy);\n if (options.sortOrder) params.append('sortOrder', options.sortOrder);\n if (options.ruleId) params.append('ruleId', options.ruleId.toString());\n if (options.status) params.append('status', options.status);\n if (options.triggerType) params.append('triggerType', options.triggerType);\n if (options.actionSlug) params.append('actionSlug', options.actionSlug);\n if (options.objectType) params.append('objectType', options.objectType);\n if (options.eventType) params.append('eventType', options.eventType);\n if (options.actionType) params.append('actionType', options.actionType);\n if (options.workflowId) params.append('workflowId', options.workflowId.toString());\n\n return this.fetch<CursorPaginatedResponse<RuleExecution>>(\n `w/${wid}/event-rules/executions${params.toString() ? `?${params.toString()}` : ''}`\n );\n }\n\n // Events API\n async getEvents(\n wid: string,\n options: EventsQueryParams = {}\n ): Promise<PaginatedResponse<Event>> {\n const params = new URLSearchParams();\n if (options.page) params.append('page', options.page.toString());\n if (options.pageSize) params.append('pageSize', options.pageSize.toString());\n if (options.sortBy) params.append('sortBy', options.sortBy);\n if (options.sortOrder) params.append('sortOrder', options.sortOrder);\n if (options.active !== undefined) params.append('active', options.active.toString());\n\n return this.fetch<PaginatedResponse<Event>>(\n `w/${wid}/events${params.toString() ? `?${params.toString()}` : ''}`\n );\n }\n\n async getEvent(wid: string, id: number): Promise<Event> {\n return this.fetch<Event>(`w/${wid}/events/${id}`);\n }\n\n async createEvent(wid: string, event: CreateEventRequest): Promise<Event> {\n return this.fetch<Event>(`w/${wid}/events`, {\n method: 'POST',\n body: JSON.stringify(event),\n });\n }\n\n async updateEvent(wid: string, id: number, event: UpdateEventRequest): Promise<Event> {\n return this.fetch<Event>(`w/${wid}/events/${id}`, {\n method: 'PUT',\n body: JSON.stringify(event),\n });\n }\n\n async deleteEvent(wid: string, id: number): Promise<void> {\n return this.fetch(`w/${wid}/events/${id}`, {\n method: 'DELETE',\n });\n }\n\n async runEvent(\n wid: string,\n id: number,\n params: {\n memberId?: number;\n memberFilterId?: number;\n }\n ): Promise<{ status: string; message: string }> {\n const searchParams = new URLSearchParams();\n if (params.memberId) searchParams.append('member_id', params.memberId.toString());\n if (params.memberFilterId)\n searchParams.append('member_filter_id', params.memberFilterId.toString());\n\n return this.fetch(`w/${wid}/events/${id}/run?${searchParams.toString()}`, {\n method: 'POST',\n });\n }\n\n async getEventRuns(\n wid: string,\n options: {\n page?: number;\n pageSize?: number;\n sortBy?: EventRunSortField;\n sortOrder?: SortOrder;\n eventId?: number;\n status?: string;\n } = {}\n ): Promise<PaginatedResponse<EventRun>> {\n const params = new URLSearchParams();\n if (options.page) params.append('page', options.page.toString());\n if (options.pageSize) params.append('pageSize', options.pageSize.toString());\n if (options.sortBy) params.append('sortBy', options.sortBy);\n if (options.sortOrder) params.append('sortOrder', options.sortOrder);\n if (options.eventId) params.append('eventId', options.eventId.toString());\n if (options.status) params.append('status', options.status);\n\n return this.fetch<PaginatedResponse<EventRun>>(`w/${wid}/events/runs?${params.toString()}`);\n }\n\n async resetEventRuns(\n wid: string,\n eventId: number\n ): Promise<{ status: string; message: string; deletedRunsCount: number }> {\n return this.fetch(`w/${wid}/events/${eventId}/runs`, {\n method: 'DELETE',\n });\n }\n}\n","import { FeatureDefinition } from '../features/registry';\nimport { BaseApiClient } from './base';\n\nexport interface FeaturesRegistryResponse {\n features: FeatureDefinition[];\n}\n\nexport class FeaturesApi extends BaseApiClient {\n /**\n * Get the full feature registry with all metadata.\n *\n * Returns all feature definitions including:\n * - Dependencies between features\n * - Visibility settings for upgrade prompts\n * - Associated abilities, tools, routes, and event types\n * - UI configuration (icons, sidebar groups)\n *\n * @returns Feature registry response with all feature definitions\n */\n async getFeatureRegistry(): Promise<FeaturesRegistryResponse> {\n return this.fetch<FeaturesRegistryResponse>('features/registry');\n }\n\n /**\n * Get a specific feature definition by slug.\n *\n * @param slug - The feature slug (e.g., \"calendar\", \"gmail\")\n * @returns The full feature definition\n */\n async getFeatureBySlug(slug: string): Promise<FeatureDefinition> {\n return this.fetch<FeatureDefinition>(`features/${slug}`);\n }\n}\n","import { BaseApiClient } from './base';\nimport {\n FhirConnection,\n FhirMethodResponse,\n CreateFhirConnectionRequest,\n UpdateFhirConnectionRequest,\n FhirFetchEncountersRequest,\n FhirSearchPatientsRequest,\n FhirSearchPractitionersRequest,\n FhirSearchLocationsRequest,\n FhirFetchCareTeamRequest,\n FhirCreateEncounterRequest,\n FhirConnectionSortField,\n PaginatedResponse,\n SortOrder,\n} from '../types';\n\nexport class FhirConnectionsApi extends BaseApiClient {\n /**\n * List all FHIR connections configured for a workspace.\n */\n async getFhirConnections(\n wid: string,\n options: {\n page?: number;\n pageSize?: number;\n sortBy?: FhirConnectionSortField;\n sortOrder?: SortOrder;\n search?: string;\n } = {}\n ): Promise<PaginatedResponse<FhirConnection>> {\n const params = new URLSearchParams();\n if (options.page) params.append('page', options.page.toString());\n if (options.pageSize) params.append('pageSize', options.pageSize.toString());\n if (options.sortBy) params.append('sortBy', options.sortBy);\n if (options.sortOrder) params.append('sortOrder', options.sortOrder);\n if (options.search) params.append('search', options.search);\n\n return this.fetch<PaginatedResponse<FhirConnection>>(\n `w/${wid}/app-connections/fhir/connections${params.toString() ? `?${params.toString()}` : ''}`\n );\n }\n\n /**\n * Get a specific FHIR connection by ID.\n */\n async getFhirConnection(wid: string, connectionId: number): Promise<FhirConnection> {\n return this.fetch<FhirConnection>(\n `w/${wid}/app-connections/fhir/connections/${connectionId}`\n );\n }\n\n /**\n * Get a FHIR connection by UUID.\n */\n async getFhirConnectionByUuid(wid: string, uuid: string): Promise<FhirConnection> {\n return this.fetch<FhirConnection>(`w/${wid}/app-connections/fhir/connections/uuid/${uuid}`);\n }\n\n /**\n * Create a new FHIR connection configuration.\n */\n async createFhirConnection(\n wid: string,\n data: CreateFhirConnectionRequest\n ): Promise<FhirConnection> {\n return this.fetch<FhirConnection>(`w/${wid}/app-connections/fhir/connections`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n /**\n * Update an existing FHIR connection configuration.\n */\n async updateFhirConnection(\n wid: string,\n connectionId: number,\n data: UpdateFhirConnectionRequest\n ): Promise<FhirConnection> {\n return this.fetch<FhirConnection>(\n `w/${wid}/app-connections/fhir/connections/${connectionId}`,\n {\n method: 'PUT',\n body: JSON.stringify(data),\n }\n );\n }\n\n /**\n * Delete a FHIR connection configuration.\n */\n async deleteFhirConnection(wid: string, connectionId: number): Promise<void> {\n return this.fetch(`w/${wid}/app-connections/fhir/connections/${connectionId}`, {\n method: 'DELETE',\n });\n }\n\n /**\n * Test a FHIR connection.\n */\n async testFhirConnection(\n wid: string,\n connectionId: number\n ): Promise<{ success: boolean; message: string }> {\n return this.fetch(`w/${wid}/app-connections/fhir/connections/${connectionId}/test`, {\n method: 'POST',\n });\n }\n\n /**\n * Search for patients via the FHIR connection.\n */\n async fhirSearchPatients(\n wid: string,\n connectionId: number,\n data: FhirSearchPatientsRequest\n ): Promise<FhirMethodResponse> {\n return this.fetch(\n `w/${wid}/app-connections/fhir/connections/${connectionId}/patients/search`,\n {\n method: 'POST',\n body: JSON.stringify(data),\n }\n );\n }\n\n /**\n * Search for practitioners via the FHIR connection.\n */\n async fhirSearchPractitioners(\n wid: string,\n connectionId: number,\n data: FhirSearchPractitionersRequest\n ): Promise<FhirMethodResponse> {\n return this.fetch(\n `w/${wid}/app-connections/fhir/connections/${connectionId}/practitioners/search`,\n {\n method: 'POST',\n body: JSON.stringify(data),\n }\n );\n }\n\n /**\n * Search for locations via the FHIR connection.\n */\n async fhirSearchLocations(\n wid: string,\n connectionId: number,\n data: FhirSearchLocationsRequest\n ): Promise<FhirMethodResponse> {\n return this.fetch(\n `w/${wid}/app-connections/fhir/connections/${connectionId}/locations/search`,\n {\n method: 'POST',\n body: JSON.stringify(data),\n }\n );\n }\n\n /**\n * Fetch care team for a patient via the FHIR connection.\n */\n async fhirFetchCareTeam(\n wid: string,\n connectionId: number,\n data: FhirFetchCareTeamRequest\n ): Promise<FhirMethodResponse> {\n return this.fetch(`w/${wid}/app-connections/fhir/connections/${connectionId}/careteam`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n /**\n * Fetch encounters for a patient via the FHIR connection.\n */\n async fhirFetchEncounters(\n wid: string,\n connectionId: number,\n data: FhirFetchEncountersRequest\n ): Promise<FhirMethodResponse> {\n return this.fetch(`w/${wid}/app-connections/fhir/connections/${connectionId}/encounters`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n /**\n * Create a telephone encounter for a patient via the FHIR connection.\n */\n async fhirCreateEncounter(\n wid: string,\n connectionId: number,\n data: FhirCreateEncounterRequest\n ): Promise<FhirMethodResponse> {\n return this.fetch(\n `w/${wid}/app-connections/fhir/connections/${connectionId}/encounters/create`,\n {\n method: 'POST',\n body: JSON.stringify(data),\n }\n );\n }\n}\n","import { BaseApiClient } from './base';\nimport { PaginatedResponse } from '../types';\nimport {\n File,\n FileFormData,\n FileFolder,\n FileFolderFormData,\n FileSortField,\n SortOrder,\n FileLabel,\n FileLabelFormData,\n FileConversionResponse,\n FileUploadRequest,\n FileUploadResponse,\n FolderSearchResult,\n FolderSearchParams,\n FileSharingResponse,\n FolderSharingResponse,\n FileRoleAssociationResponse,\n UpdateFileRoleAssociationsRequest,\n UpdateFileSharingRequest,\n PublicFileMetadata,\n PublicFolderContents,\n} from '../types/fileTypes';\n\nexport class FilesApi extends BaseApiClient {\n async getFiles(\n wid: string,\n options: {\n folderId?: number;\n page?: number;\n pageSize?: number;\n sortBy?: FileSortField;\n sortOrder?: SortOrder;\n search?: string;\n } = {}\n ): Promise<PaginatedResponse<File>> {\n const params = new URLSearchParams();\n if (options.folderId) params.append('folder_id', options.folderId.toString());\n if (options.page) params.append('page', options.page.toString());\n if (options.pageSize) params.append('pageSize', options.pageSize.toString());\n if (options.sortBy) params.append('sortBy', options.sortBy);\n if (options.sortOrder) params.append('sortOrder', options.sortOrder);\n if (options.search) params.append('search', options.search);\n return this.fetch<PaginatedResponse<File>>(\n `w/${wid}/files${params.toString() ? `?${params.toString()}` : ''}`\n );\n }\n\n async getFile(wid: string, id: number): Promise<File> {\n return this.fetch<File>(`w/${wid}/files/${id}`);\n }\n\n async createFile(wid: string, file: FileFormData): Promise<File> {\n return this.fetch<File>(`w/${wid}/files`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(file),\n });\n }\n\n async updateFile(wid: string, id: number, file: Partial<FileFormData>): Promise<File> {\n return this.fetch<File>(`w/${wid}/files/${id}`, {\n method: 'PUT',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(file),\n });\n }\n\n async deleteFile(wid: string, id: number): Promise<void> {\n return this.fetch(`w/${wid}/files/${id}`, {\n method: 'DELETE',\n });\n }\n\n async convertFile(\n wid: string,\n fileId: number,\n format: 'text' | 'markdown' | 'pdf' = 'pdf'\n ): Promise<FileConversionResponse> {\n return this.fetch<FileConversionResponse>(\n `w/${wid}/files/${fileId}/convert?format=${format}`,\n {\n method: 'POST',\n }\n );\n }\n\n async generateFileUploadUrl(\n wid: string,\n request: FileUploadRequest\n ): Promise<FileUploadResponse> {\n return this.fetch<FileUploadResponse>(`w/${wid}/files/upload-url`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(request),\n });\n }\n\n // Directories API\n async getFolders(wid: string, parentId?: number): Promise<FileFolder[]> {\n const params = new URLSearchParams();\n if (parentId) params.append('parent_id', parentId.toString());\n return this.fetch<FileFolder[]>(\n `w/${wid}/folders${params.toString() ? `?${params.toString()}` : ''}`\n );\n }\n\n async getFolder(wid: string, id: number): Promise<FileFolder> {\n return this.fetch<FileFolder>(`w/${wid}/folders/${id}`);\n }\n\n async createFolder(wid: string, directory: FileFolderFormData): Promise<FileFolder> {\n return this.fetch<FileFolder>(`w/${wid}/folders`, {\n method: 'POST',\n body: JSON.stringify(directory),\n });\n }\n\n async updateFolder(\n wid: string,\n id: number,\n directory: Partial<FileFolderFormData>\n ): Promise<FileFolder> {\n return this.fetch<FileFolder>(`w/${wid}/folders/${id}`, {\n method: 'PUT',\n body: JSON.stringify(directory),\n });\n }\n\n async deleteFolder(wid: string, id: number): Promise<void> {\n return this.fetch(`w/${wid}/folders/${id}`, {\n method: 'DELETE',\n });\n }\n\n async reindexFolder(wid: string, id: number): Promise<{ status: string; message: string }> {\n return this.fetch<{ status: string; message: string }>(`w/${wid}/folders/${id}/reindex`, {\n method: 'POST',\n });\n }\n\n async searchFolder(\n wid: string,\n id: number,\n params: FolderSearchParams\n ): Promise<FolderSearchResult[]> {\n const searchParams = new URLSearchParams();\n searchParams.append('query', params.query);\n if (params.topK) searchParams.append('top_k', params.topK.toString());\n\n return this.fetch<FolderSearchResult[]>(\n `w/${wid}/folders/${id}/search?${searchParams.toString()}`\n );\n }\n\n // File Labels API\n async getFileLabels(wid: string): Promise<FileLabel[]> {\n return this.fetch<FileLabel[]>(`w/${wid}/file-labels`);\n }\n\n async getFileLabel(wid: string, id: number): Promise<FileLabel> {\n return this.fetch<FileLabel>(`w/${wid}/file-labels/${id}`);\n }\n\n async getFileLabelByUuid(wid: string, uuid: string): Promise<FileLabel> {\n return this.fetch<FileLabel>(`w/${wid}/file-labels/${uuid}`);\n }\n\n async createFileLabel(wid: string, label: FileLabelFormData): Promise<FileLabel> {\n return this.fetch<FileLabel>(`w/${wid}/file-labels`, {\n method: 'POST',\n body: JSON.stringify(label),\n });\n }\n\n async updateFileLabel(\n wid: string,\n id: number,\n label: Partial<FileLabelFormData>\n ): Promise<FileLabel> {\n return this.fetch<FileLabel>(`w/${wid}/file-labels/${id}`, {\n method: 'PUT',\n body: JSON.stringify(label),\n });\n }\n\n async deleteFileLabel(wid: string, id: number): Promise<void> {\n return this.fetch(`w/${wid}/file-labels/${id}`, {\n method: 'DELETE',\n });\n }\n\n // File Sharing API\n async getFileSharing(wid: string, fileId: number): Promise<FileSharingResponse> {\n return this.fetch<FileSharingResponse>(`w/${wid}/files/${fileId}/sharing`);\n }\n\n async updateFileRoles(\n wid: string,\n fileId: number,\n data: UpdateFileRoleAssociationsRequest\n ): Promise<FileRoleAssociationResponse[]> {\n return this.fetch<FileRoleAssociationResponse[]>(`w/${wid}/files/${fileId}/sharing/roles`, {\n method: 'PUT',\n body: JSON.stringify(data),\n });\n }\n\n async removeFileRole(wid: string, fileId: number, roleId: number): Promise<void> {\n return this.fetch(`w/${wid}/files/${fileId}/sharing/roles/${roleId}`, {\n method: 'DELETE',\n });\n }\n\n // Folder Sharing API\n async getFolderSharing(wid: string, folderId: number): Promise<FolderSharingResponse> {\n return this.fetch<FolderSharingResponse>(`w/${wid}/folders/${folderId}/sharing`);\n }\n\n async updateFolderRoles(\n wid: string,\n folderId: number,\n data: UpdateFileRoleAssociationsRequest\n ): Promise<FileRoleAssociationResponse[]> {\n return this.fetch<FileRoleAssociationResponse[]>(\n `w/${wid}/folders/${folderId}/sharing/roles`,\n {\n method: 'PUT',\n body: JSON.stringify(data),\n }\n );\n }\n\n async removeFolderRole(wid: string, folderId: number, roleId: number): Promise<void> {\n return this.fetch(`w/${wid}/folders/${folderId}/sharing/roles/${roleId}`, {\n method: 'DELETE',\n });\n }\n\n // Batch Sharing API\n async updateFileSharing(\n wid: string,\n fileId: number,\n data: UpdateFileSharingRequest\n ): Promise<FileSharingResponse> {\n return this.fetch<FileSharingResponse>(`w/${wid}/files/${fileId}/sharing`, {\n method: 'PUT',\n body: JSON.stringify(data),\n });\n }\n\n async updateFolderSharing(\n wid: string,\n folderId: number,\n data: UpdateFileSharingRequest\n ): Promise<FolderSharingResponse> {\n return this.fetch<FolderSharingResponse>(`w/${wid}/folders/${folderId}/sharing`, {\n method: 'PUT',\n body: JSON.stringify(data),\n });\n }\n\n // Public Sharing API (unauthenticated access to public files/folders)\n async getPublicFile(wid: string, fileId: number): Promise<PublicFileMetadata> {\n return this.fetch<PublicFileMetadata>(`w/${wid}/sharing/files/${fileId}`);\n }\n\n async getPublicFolder(\n wid: string,\n folderId: number,\n page = 1,\n pageSize = 100\n ): Promise<PublicFolderContents> {\n return this.fetch<PublicFolderContents>(\n `w/${wid}/sharing/folders/${folderId}?page=${page}&pageSize=${pageSize}`\n );\n }\n\n async getPublicFolderFiles(\n wid: string,\n folderId: number,\n page = 1,\n pageSize = 100\n ): Promise<{ files: PublicFileMetadata[]; pagination?: any }> {\n return this.fetch<{ files: PublicFileMetadata[]; pagination?: any }>(\n `w/${wid}/sharing/folders/${folderId}/files?page=${page}&pageSize=${pageSize}`\n );\n }\n}\n","import { Email, Inbox, InboxCreateRequest, InboxUpdateRequest, PaginatedResponse } from '../types';\nimport { EmailConversionResponse } from '../types/communicationTypes';\nimport { BaseApiClient } from './base';\n\nexport class InboxesApi extends BaseApiClient {\n async getInboxes(wid: string): Promise<PaginatedResponse<Inbox>> {\n return this.fetch<PaginatedResponse<Inbox>>(`w/${wid}/inboxes`);\n }\n\n async getInbox(wid: string, id: number): Promise<Inbox> {\n return this.fetch<Inbox>(`w/${wid}/inboxes/${id}`);\n }\n\n async createInbox(wid: string, inbox: InboxCreateRequest): Promise<Inbox> {\n return this.fetch<Inbox>(`w/${wid}/inboxes`, {\n method: 'POST',\n body: JSON.stringify(inbox),\n });\n }\n\n async updateInbox(wid: string, id: number, inbox: InboxUpdateRequest): Promise<Inbox> {\n return this.fetch<Inbox>(`w/${wid}/inboxes/${id}`, {\n method: 'PUT',\n body: JSON.stringify(inbox),\n });\n }\n\n async deleteInbox(wid: string, id: number): Promise<void> {\n return this.fetch(`w/${wid}/inboxes/${id}`, {\n method: 'DELETE',\n });\n }\n\n async getInboxEmails(\n wid: string,\n inboxId: number,\n options: {\n limit?: number;\n offset?: number;\n includeAttachments?: boolean;\n } = {}\n ): Promise<PaginatedResponse<Email>> {\n const params = new URLSearchParams();\n if (options.limit) params.append('limit', options.limit.toString());\n if (options.offset) params.append('offset', options.offset.toString());\n if (options.includeAttachments)\n params.append('include_attachments', options.includeAttachments.toString());\n\n return this.fetch<PaginatedResponse<Email>>(\n `w/${wid}/inboxes/${inboxId}/emails${params.toString() ? `?${params.toString()}` : ''}`\n );\n }\n\n async getInboxEmail(wid: string, inboxId: number, emailId: number): Promise<Email> {\n return this.fetch<Email>(`w/${wid}/inboxes/${inboxId}/emails/${emailId}`);\n }\n\n async markEmailAsRead(wid: string, inboxId: number, emailId: number): Promise<Email> {\n return this.fetch<Email>(`w/${wid}/inboxes/${inboxId}/emails/${emailId}/mark-read`, {\n method: 'POST',\n });\n }\n\n async markEmailAsUnread(wid: string, inboxId: number, emailId: number): Promise<Email> {\n return this.fetch<Email>(`w/${wid}/inboxes/${inboxId}/emails/${emailId}/unread`, {\n method: 'POST',\n });\n }\n\n async convertEmail(\n wid: string,\n emailId: number,\n format: 'text' | 'markdown' | 'pdf' = 'pdf'\n ): Promise<EmailConversionResponse> {\n return this.fetch<EmailConversionResponse>(\n `w/${wid}/inboxes/emails/${emailId}/convert?format=${format}`,\n {\n method: 'POST',\n }\n );\n }\n\n async downloadEmailAttachment(\n wid: string,\n inboxId: number,\n emailId: number,\n attachmentId: string\n ): Promise<ArrayBuffer> {\n const response = await this.fetchRaw(\n `w/${wid}/inboxes/${inboxId}/emails/${emailId}/attachments/${attachmentId}`\n );\n return response.arrayBuffer();\n }\n\n async getInboxThreads(wid: string, inboxId: number): Promise<any> {\n return this.fetch(`w/${wid}/inboxes/${inboxId}/threads`);\n }\n\n async getThreadEmails(wid: string, inboxId: number, assignmentId: number): Promise<any> {\n return this.fetch(`w/${wid}/inboxes/${inboxId}/assignments/${assignmentId}/emails`);\n }\n\n async getChatEmails(wid: string, inboxId: number, chatId: number): Promise<any> {\n return this.fetch(`w/${wid}/inboxes/${inboxId}/chats/${chatId}/emails`);\n }\n}\n","import type {\n CreateInquiryRequest,\n Inquiry,\n InquiryListResponse,\n UpdateInquiryRequest,\n} from '../types/inquiryTypes';\nimport { BaseApiClient } from './base';\n\nexport class InquiriesApi extends BaseApiClient {\n /**\n * Create a new inquiry (public endpoint)\n */\n async createInquiry(data: CreateInquiryRequest): Promise<Inquiry> {\n return this.fetch<Inquiry>('inquiries', {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n /**\n * List all inquiries (superuser only)\n */\n async listInquiries(params?: {\n page?: number;\n pageSize?: number;\n inquiryType?: string;\n }): Promise<InquiryListResponse> {\n const searchParams = new URLSearchParams();\n if (params?.page) searchParams.append('page', params.page.toString());\n if (params?.pageSize) searchParams.append('page_size', params.pageSize.toString());\n if (params?.inquiryType) searchParams.append('inquiry_type', params.inquiryType);\n\n const queryString = searchParams.toString();\n const url = queryString ? `inquiries?${queryString}` : 'inquiries';\n\n return this.fetch<InquiryListResponse>(url);\n }\n\n /**\n * Get a specific inquiry (superuser only)\n */\n async getInquiry(inquiryId: number): Promise<Inquiry> {\n return this.fetch<Inquiry>(`inquiries/${inquiryId}`);\n }\n\n /**\n * Update an inquiry (superuser only)\n */\n async updateInquiry(inquiryId: number, data: UpdateInquiryRequest): Promise<Inquiry> {\n return this.fetch<Inquiry>(`inquiries/${inquiryId}`, {\n method: 'PATCH',\n body: JSON.stringify(data),\n });\n }\n\n /**\n * Delete an inquiry (superuser only)\n */\n async deleteInquiry(inquiryId: number): Promise<void> {\n await this.fetch(`inquiries/${inquiryId}`, {\n method: 'DELETE',\n });\n }\n\n /**\n * Export inquiries to CSV (superuser only)\n * @param statusFilter Optional status filter: 'new', 'in_progress', 'done', or undefined for all\n * @returns A Blob containing the CSV data\n */\n async exportInquiriesCsv(statusFilter?: string): Promise<Blob> {\n const params = new URLSearchParams();\n if (statusFilter) {\n params.append('status_filter', statusFilter);\n }\n\n const queryString = params.toString();\n const url = queryString ? `inquiries/export/csv?${queryString}` : 'inquiries/export/csv';\n\n const response = await fetch(`${this.baseUrl}/api/v2/${url}`, {\n method: 'GET',\n credentials: 'include',\n });\n\n if (!response.ok) {\n const error = await response.json();\n throw new Error(error.detail || 'Export failed');\n }\n\n return response.blob();\n }\n}\n","import {\n AppConnectionDirectoryResponse,\n AppConnectionItem,\n CreateAppConnectionRequest,\n PlatformAppConnectionResponse,\n UpdateAppConnectionRequest,\n} from '../types/appConnectionTypes';\nimport { BaseApiClient } from './base';\n\nexport class AppConnectionsApi extends BaseApiClient {\n /**\n * List all app connection definitions the workspace can access.\n * Returns static metadata only (no instance counts or active data).\n */\n async listAvailableAppConnections(wid: string): Promise<AppConnectionDirectoryResponse> {\n return this.fetch<AppConnectionDirectoryResponse>(`w/${wid}/app-connections/available`);\n }\n\n /**\n * List all active app connections across all types.\n * Returns a union of platform apps, MCP servers, Discord bots,\n * Slack apps, and FHIR connections.\n */\n async listAppConnections(wid: string): Promise<AppConnectionItem[]> {\n return this.fetch<AppConnectionItem[]>(`w/${wid}/app-connections`);\n }\n\n /**\n * Enable a platform app connection in the workspace.\n */\n async enablePlatformApp(\n wid: string,\n data: CreateAppConnectionRequest\n ): Promise<PlatformAppConnectionResponse> {\n return this.fetch<PlatformAppConnectionResponse>(`w/${wid}/app-connections/platform-apps`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n /**\n * Get platform app connection details by UUID.\n */\n async getPlatformApp(wid: string, appUuid: string): Promise<PlatformAppConnectionResponse> {\n return this.fetch<PlatformAppConnectionResponse>(\n `w/${wid}/app-connections/platform-apps/${appUuid}`\n );\n }\n\n /**\n * Update platform app config, enabled status, or name.\n */\n async updatePlatformApp(\n wid: string,\n appUuid: string,\n data: UpdateAppConnectionRequest\n ): Promise<PlatformAppConnectionResponse> {\n return this.fetch<PlatformAppConnectionResponse>(\n `w/${wid}/app-connections/platform-apps/${appUuid}`,\n {\n method: 'PATCH',\n body: JSON.stringify(data),\n }\n );\n }\n\n /**\n * Disable (soft) or delete (hard) a platform app connection.\n */\n async deletePlatformApp(\n wid: string,\n appUuid: string,\n hard: boolean = false\n ): Promise<{ disabled?: boolean; deleted?: boolean; uuid: string }> {\n const params = hard ? '?hard=true' : '';\n return this.fetch<{ disabled?: boolean; deleted?: boolean; uuid: string }>(\n `w/${wid}/app-connections/platform-apps/${appUuid}${params}`,\n { method: 'DELETE' }\n );\n }\n}\n","import type {\n McpServerToolsResponse,\n McpServerResourcesResponse,\n McpServerPromptsResponse,\n McpTestConnectionResponse,\n} from '../types/appConnectionTypes';\nimport { McpServer, McpServerFormData, McpServerUpdateFormData } from '../types';\nimport { BaseApiClient } from './base';\n\nexport class McpServersApi extends BaseApiClient {\n /**\n * List all MCP servers in a workspace\n */\n async getMcpServers(wid: string): Promise<McpServer[]> {\n return this.fetch<McpServer[]>(`w/${wid}/app-connections/mcp-servers`);\n }\n\n /**\n * Get a specific MCP server\n */\n async getMcpServer(wid: string, serverId: number): Promise<McpServer> {\n return this.fetch<McpServer>(`w/${wid}/app-connections/mcp-servers/${serverId}`);\n }\n\n /**\n * Create a new MCP server\n */\n async createMcpServer(wid: string, data: McpServerFormData): Promise<McpServer> {\n return this.fetch<McpServer>(`w/${wid}/app-connections/mcp-servers`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n /**\n * Update an existing MCP server\n */\n async updateMcpServer(\n wid: string,\n serverId: number,\n data: McpServerUpdateFormData\n ): Promise<McpServer> {\n return this.fetch<McpServer>(`w/${wid}/app-connections/mcp-servers/${serverId}`, {\n method: 'PUT',\n body: JSON.stringify(data),\n });\n }\n\n /**\n * Delete an MCP server\n */\n async deleteMcpServer(wid: string, serverId: number): Promise<{ message: string }> {\n return this.fetch<{ message: string }>(`w/${wid}/app-connections/mcp-servers/${serverId}`, {\n method: 'DELETE',\n });\n }\n\n /**\n * Enable an MCP server\n */\n async enableMcpServer(wid: string, serverId: number): Promise<McpServer> {\n return this.fetch<McpServer>(`w/${wid}/app-connections/mcp-servers/${serverId}/enable`, {\n method: 'POST',\n });\n }\n\n /**\n * Disable an MCP server\n */\n async disableMcpServer(wid: string, serverId: number): Promise<McpServer> {\n return this.fetch<McpServer>(`w/${wid}/app-connections/mcp-servers/${serverId}/disable`, {\n method: 'POST',\n });\n }\n\n /**\n * Get tools for an MCP server.\n *\n * Returns 403 with `detail.code === 'auth_required'` when the\n * current user needs to authenticate first.\n */\n async getMcpServerTools(wid: string, serverId: number): Promise<McpServerToolsResponse> {\n return this.fetch<McpServerToolsResponse>(\n `w/${wid}/app-connections/mcp-servers/${serverId}/tools`\n );\n }\n\n /**\n * Get resources for an MCP server.\n *\n * Returns 403 with `detail.code === 'auth_required'` when the\n * current user needs to authenticate first.\n */\n async getMcpServerResources(wid: string, serverId: number): Promise<McpServerResourcesResponse> {\n return this.fetch<McpServerResourcesResponse>(\n `w/${wid}/app-connections/mcp-servers/${serverId}/resources`\n );\n }\n\n /**\n * Get prompts for an MCP server.\n *\n * Returns 403 with `detail.code === 'auth_required'` when the\n * current user needs to authenticate first.\n */\n async getMcpServerPrompts(wid: string, serverId: number): Promise<McpServerPromptsResponse> {\n return this.fetch<McpServerPromptsResponse>(\n `w/${wid}/app-connections/mcp-servers/${serverId}/prompts`\n );\n }\n\n /**\n * Test connection to an MCP server.\n */\n async testMcpServerConnection(\n wid: string,\n serverId: number\n ): Promise<McpTestConnectionResponse> {\n return this.fetch<McpTestConnectionResponse>(\n `w/${wid}/app-connections/mcp-servers/${serverId}/test`,\n { method: 'POST' }\n );\n }\n\n /**\n * Discover OAuth metadata for an authorization server\n */\n async discoverOAuthMetadata(\n wid: string,\n data: { oauthServerUrl: string }\n ): Promise<{ success: boolean; metadata?: any; error?: string }> {\n return this.fetch<{ success: boolean; metadata?: any; error?: string }>(\n `w/${wid}/app-connections/mcp-servers/oauth-discovery`,\n {\n method: 'POST',\n body: JSON.stringify(data),\n }\n );\n }\n}\n","import {\n CreateWorkspaceMemberRequest,\n Member,\n MemberFilter,\n MemberFilterFormData,\n MemberFormData,\n MemberLabel,\n MemberLabelFormData,\n MemberRole,\n MemberRoleFormData,\n MemberSortField,\n PaginatedResponse,\n SortOrder,\n UpdateWorkspaceMemberRequest,\n} from '../types';\nimport type {\n CancelCredentialChangeInviteResponse,\n CredentialChangeInviteResponse,\n CredentialType,\n PendingCredentialChangeInvite,\n} from '../types/accountTypes';\nimport type {\n CreateMemberFieldRequest,\n MemberField,\n MemberFieldDefinitionListResponse,\n MemberFieldListResponse,\n UpdateMemberFieldRequest,\n} from '../types/memberFieldTypes';\nimport type {\n AnonymousMemberResolution,\n CurrentMember,\n ExpireAnonymousMemberRequest,\n PendingAnonymousMembersResponse,\n ResolveAnonymousMemberRequest,\n} from '../types/memberTypes';\nimport { BaseApiClient } from './base';\n\nexport class MembersApi extends BaseApiClient {\n async getCurrentMember(wid: string): Promise<CurrentMember> {\n return this.fetch<CurrentMember>(`w/${wid}/me`);\n }\n\n /**\n * Get all members owned by the current member in this workspace.\n * Returns the authenticated member plus any members they own (via owner_id).\n * Used by the member switcher to show available identities.\n */\n async getOwnedMembers(wid: string): Promise<Member[]> {\n return this.fetch<Member[]>(`w/${wid}/members/owned`);\n }\n\n /**\n * Switch to a different member identity owned by the current member.\n * Sets the actingAsMemberUuid cookie for subsequent requests.\n * Uses UUID (not ID) to prevent cross-workspace identity confusion.\n */\n async switchMember(wid: string, memberUuid: string): Promise<Member> {\n return this.fetch<Member>(`w/${wid}/members/switch`, {\n method: 'POST',\n body: JSON.stringify({ memberUuid }),\n });\n }\n\n /**\n * Clear the member switch and return to the authenticated member.\n */\n async clearMemberSwitch(wid: string): Promise<Member> {\n return this.fetch<Member>(`w/${wid}/members/switch`, {\n method: 'DELETE',\n });\n }\n\n async updateCurrentMember(wid: string, member: Partial<MemberFormData>): Promise<Member> {\n return this.fetch<Member>(`w/${wid}/me`, {\n method: 'PUT',\n body: JSON.stringify(member),\n });\n }\n\n async getWorkspaceMembers(\n wid: string,\n page: number = 1,\n pageSize: number = 10,\n filters?: { query?: string; role?: string } | any[],\n search?: string,\n role?: string,\n sortBy?: MemberSortField,\n sortOrder?: SortOrder,\n memberType?: 'member' | 'test' | 'anonymous' | 'agent',\n isArchived: boolean = false,\n isManager?: boolean,\n memberTypes?: ('member' | 'test' | 'anonymous' | 'agent')[],\n hasAccount?: boolean,\n excludeIds?: number[]\n ): Promise<PaginatedResponse<Member>> {\n const params = new URLSearchParams();\n if (page) params.append('page', page.toString());\n if (pageSize) params.append('pageSize', pageSize.toString());\n if (sortBy) params.append('sortBy', sortBy);\n if (sortOrder) params.append('sortOrder', sortOrder);\n\n // Handle both old and new filter formats\n if (filters) {\n if (Array.isArray(filters)) {\n // New format: array of filter rules\n params.append('filters', JSON.stringify(filters));\n } else {\n // Old format: simple query/role object\n params.append('filters', JSON.stringify(filters));\n }\n }\n\n // Handle individual search and role parameters\n if (search) params.append('search', search);\n if (role) params.append('role', role);\n // Filter by multiple member types (takes precedence on server)\n if (memberTypes && memberTypes.length > 0) {\n params.append('member_types', memberTypes.join(','));\n } else if (memberType) {\n // Deprecated: Filter by single member type\n params.append('member_type', memberType);\n }\n // Filter by archived status (defaults to false for non-archived members)\n params.append('is_archived', isArchived.toString());\n // Filter by manage_workspace permission\n if (isManager !== undefined) {\n params.append('is_manager', isManager.toString());\n }\n // Filter by account association\n if (hasAccount !== undefined) {\n params.append('has_account', hasAccount.toString());\n }\n // Exclude specific member IDs\n if (excludeIds && excludeIds.length > 0) {\n params.append('exclude_ids', excludeIds.join(','));\n }\n\n return this.fetch<PaginatedResponse<Member>>(`w/${wid}/members?${params.toString()}`);\n }\n\n async getWorkspaceMember(wid: string, memberId: number): Promise<Member> {\n return this.fetch<Member>(`w/${wid}/members/${memberId}`);\n }\n\n async createWorkspaceMember(wid: string, data: CreateWorkspaceMemberRequest): Promise<Member> {\n return this.fetch<Member>(`w/${wid}/members`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n async updateMember(\n wid: string,\n memberId: number,\n data: UpdateWorkspaceMemberRequest\n ): Promise<Member> {\n return this.fetch<Member>(`w/${wid}/members/${memberId}`, {\n method: 'PUT',\n body: JSON.stringify(data),\n });\n }\n\n async deleteMember(wid: string, memberId: number, options?: { force?: boolean }): Promise<void> {\n const params = new URLSearchParams();\n if (options?.force) {\n params.append('force', 'true');\n }\n const queryString = params.toString();\n const url = `w/${wid}/members/${memberId}${queryString ? `?${queryString}` : ''}`;\n return this.fetch(url, {\n method: 'DELETE',\n });\n }\n\n async archiveMember(wid: string, memberId: number): Promise<Member> {\n return this.fetch<Member>(`w/${wid}/members/${memberId}/archive`, {\n method: 'POST',\n });\n }\n\n async unarchiveMember(wid: string, memberId: number): Promise<Member> {\n return this.fetch<Member>(`w/${wid}/members/${memberId}/unarchive`, {\n method: 'POST',\n });\n }\n\n // Member Filter APIs\n async getMemberFilters(wid: string): Promise<MemberFilter[]> {\n return this.fetch<MemberFilter[]>(`w/${wid}/member-filters`);\n }\n\n async getMemberFilter(wid: string, filterId: number): Promise<MemberFilter> {\n return this.fetch<MemberFilter>(`w/${wid}/member-filters/${filterId}`);\n }\n\n async createMemberFilter(wid: string, data: MemberFilterFormData): Promise<MemberFilter> {\n return this.fetch<MemberFilter>(`w/${wid}/member-filters`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n async updateMemberFilter(\n wid: string,\n filterId: number,\n data: Partial<MemberFilterFormData>\n ): Promise<MemberFilter> {\n return this.fetch<MemberFilter>(`w/${wid}/member-filters/${filterId}`, {\n method: 'PUT',\n body: JSON.stringify(data),\n });\n }\n\n async deleteMemberFilter(wid: string, filterId: number): Promise<void> {\n return this.fetch(`w/${wid}/member-filters/${filterId}`, {\n method: 'DELETE',\n });\n }\n\n async getMemberFilterCount(wid: string, filterId: number): Promise<{ count: number }> {\n return this.fetch<{ count: number }>(`w/${wid}/member-filters/${filterId}/count`);\n }\n\n // Member Labels API\n async getMemberLabels(wid: string): Promise<MemberLabel[]> {\n return this.fetch<MemberLabel[]>(`w/${wid}/member-labels`);\n }\n\n async getMemberLabel(wid: string, id: number): Promise<MemberLabel> {\n return this.fetch<MemberLabel>(`w/${wid}/member-labels/${id}`);\n }\n\n async getMemberLabelByUuid(wid: string, uuid: string): Promise<MemberLabel> {\n return this.fetch<MemberLabel>(`w/${wid}/member-labels/${uuid}`);\n }\n\n async createMemberLabel(wid: string, label: MemberLabelFormData): Promise<MemberLabel> {\n return this.fetch<MemberLabel>(`w/${wid}/member-labels`, {\n method: 'POST',\n body: JSON.stringify(label),\n });\n }\n\n async updateMemberLabel(\n wid: string,\n id: number,\n label: Partial<MemberLabelFormData>\n ): Promise<MemberLabel> {\n return this.fetch<MemberLabel>(`w/${wid}/member-labels/${id}`, {\n method: 'PUT',\n body: JSON.stringify(label),\n });\n }\n\n async deleteMemberLabel(wid: string, id: number): Promise<void> {\n return this.fetch(`w/${wid}/member-labels/${id}`, {\n method: 'DELETE',\n });\n }\n\n // Member Roles API\n async getMemberRoles(wid: string): Promise<MemberRole[]> {\n return this.fetch<MemberRole[]>(`w/${wid}/member-roles`);\n }\n\n async getMemberRole(wid: string, id: number): Promise<MemberRole> {\n return this.fetch<MemberRole>(`w/${wid}/member-roles/${id}`);\n }\n\n async getMemberRoleByUuid(wid: string, uuid: string): Promise<MemberRole> {\n return this.fetch<MemberRole>(`w/${wid}/member-roles/${uuid}`);\n }\n\n async createMemberRole(wid: string, memberRole: MemberRoleFormData): Promise<MemberRole> {\n return this.fetch<MemberRole>(`w/${wid}/member-roles`, {\n method: 'POST',\n body: JSON.stringify(memberRole),\n });\n }\n\n async updateMemberRole(\n wid: string,\n id: number,\n memberRole: MemberRoleFormData\n ): Promise<MemberRole> {\n return this.fetch<MemberRole>(`w/${wid}/member-roles/${id}`, {\n method: 'PUT',\n body: JSON.stringify(memberRole),\n });\n }\n\n async deleteMemberRole(wid: string, id: number): Promise<void> {\n return this.fetch(`w/${wid}/member-roles/${id}`, {\n method: 'DELETE',\n });\n }\n\n // Import/Export Members API\n async importMembers(\n wid: string,\n file: File,\n newMemberRoleId: number,\n onProgress?: (progress: any) => void\n ): Promise<any> {\n const formData = new FormData();\n formData.append('file', file);\n\n const params = new URLSearchParams();\n params.append('new_member_role_id', newMemberRoleId.toString());\n\n const response = await fetch(\n `${this.baseUrl}/api/v2/w/${wid}/members/import?${params.toString()}`,\n {\n method: 'POST',\n body: formData,\n credentials: 'include',\n }\n );\n\n if (!response.ok) {\n const error = await response.json();\n\n // Handle structured error response with validation errors\n if (error.detail && typeof error.detail === 'object') {\n const { message, errors } = error.detail;\n if (errors && Array.isArray(errors)) {\n // Create a custom error object with both message and errors\n const importError = new Error(message || 'Import validation failed');\n (importError as any).validationErrors = errors;\n throw importError;\n }\n }\n\n // Handle simple string error\n throw new Error(error.detail || 'Import failed');\n }\n\n if (onProgress && response.body) {\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n const chunk = decoder.decode(value);\n const lines = chunk.split('\\n').filter((line) => line.trim());\n\n for (const line of lines) {\n try {\n const progress = JSON.parse(line);\n onProgress(progress);\n } catch (e) {\n // Skip invalid JSON lines\n }\n }\n }\n }\n\n return { success: true };\n }\n\n async exportMembers(\n wid: string,\n selectedFields: string[],\n selectedDataTypes: number[],\n memberType?: 'member' | 'test' | 'anonymous'\n ): Promise<Blob> {\n const params = new URLSearchParams();\n selectedFields.forEach((field) => params.append('selected_fields', field));\n selectedDataTypes.forEach((id) => params.append('selected_data_types', id.toString()));\n if (memberType) params.append('member_type', memberType);\n\n const response = await fetch(\n `${this.baseUrl}/api/v2/w/${wid}/members/export?${params.toString()}`,\n {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n credentials: 'include',\n }\n );\n\n if (!response.ok) {\n const error = await response.json();\n throw new Error(error.detail || 'Export failed');\n }\n\n return response.blob();\n }\n\n async getMembersMessageActivity(\n wid: string,\n memberIds: number[],\n days: number = 30\n ): Promise<Record<number, number[]>> {\n const memberIdsStr = memberIds.join(',');\n const params = new URLSearchParams();\n params.append('member_ids', memberIdsStr);\n params.append('days', days.toString());\n\n return this.fetch<Record<number, number[]>>(\n `w/${wid}/members/message-activity?${params.toString()}`\n );\n }\n\n // ============================================================================\n // Member Fields API\n // ============================================================================\n\n /**\n * Get all fields for a member.\n * Returns key-value fields including service-owned fields (which are read-only).\n */\n async getMemberFields(wid: string, memberId: number): Promise<MemberFieldListResponse> {\n return this.fetch<MemberFieldListResponse>(`w/${wid}/members/${memberId}/fields`);\n }\n\n /**\n * Get available field definitions for this workspace.\n * Returns field keys/labels from active app connections and user-created fields.\n */\n async getMemberFieldDefinitions(wid: string): Promise<MemberFieldDefinitionListResponse> {\n return this.fetch<MemberFieldDefinitionListResponse>(`w/${wid}/member-field-definitions`);\n }\n\n /**\n * Create a new field for a member.\n * User-created fields have no service and can be modified/deleted.\n */\n async createMemberField(\n wid: string,\n memberId: number,\n request: CreateMemberFieldRequest\n ): Promise<MemberField> {\n return this.fetch<MemberField>(`w/${wid}/members/${memberId}/fields`, {\n method: 'POST',\n body: JSON.stringify(request),\n });\n }\n\n /**\n * Update a member field value.\n * Only user-created fields (no service_id) can be modified.\n */\n async updateMemberField(\n wid: string,\n memberId: number,\n fieldId: number,\n request: UpdateMemberFieldRequest\n ): Promise<MemberField> {\n return this.fetch<MemberField>(`w/${wid}/members/${memberId}/fields/${fieldId}`, {\n method: 'PUT',\n body: JSON.stringify(request),\n });\n }\n\n /**\n * Delete a member field.\n * Only user-created fields (no service_id) can be deleted.\n */\n async deleteMemberField(wid: string, memberId: number, fieldId: number): Promise<void> {\n await this.fetch(`w/${wid}/members/${memberId}/fields/${fieldId}`, {\n method: 'DELETE',\n });\n }\n\n // ============================================================================\n // Credential Change Invitations API\n // ============================================================================\n\n /**\n * Invite a member to update their credential (email or phone).\n * Admin-only. Sends invitation to member's current contact method.\n */\n async inviteMemberCredentialUpdate(\n wid: string,\n memberId: number,\n credentialType: CredentialType,\n newValue: string\n ): Promise<CredentialChangeInviteResponse> {\n return this.fetch<CredentialChangeInviteResponse>(\n `w/${wid}/members/${memberId}/invite-credential-update`,\n {\n method: 'POST',\n body: JSON.stringify({\n credential_type: credentialType,\n new_value: newValue,\n }),\n }\n );\n }\n\n /**\n * Cancel a pending credential update invitation.\n * Admin-only.\n */\n async cancelCredentialUpdateInvite(\n wid: string,\n inviteId: number\n ): Promise<CancelCredentialChangeInviteResponse> {\n return this.fetch<CancelCredentialChangeInviteResponse>(\n `w/${wid}/credential-update-invites/${inviteId}`,\n { method: 'DELETE' }\n );\n }\n\n /**\n * List pending credential update invitations for the workspace.\n * Admin-only. Optionally filter by member.\n */\n async getCredentialUpdateInvites(\n wid: string,\n memberId?: number\n ): Promise<PendingCredentialChangeInvite[]> {\n const params = new URLSearchParams();\n if (memberId) params.append('member_id', memberId.toString());\n return this.fetch<PendingCredentialChangeInvite[]>(\n `w/${wid}/credential-update-invites?${params.toString()}`\n );\n }\n\n // ============================================================================\n // Anonymous Member Resolution API\n // ============================================================================\n\n /**\n * List anonymous member resolutions with filtering and pagination.\n * Returns pending resolutions by default.\n */\n async getAnonymousResolutions(\n wid: string,\n options?: {\n status?: 'pending' | 'resolved' | 'expired';\n page?: number;\n pageSize?: number;\n }\n ): Promise<PendingAnonymousMembersResponse> {\n const params = new URLSearchParams();\n if (options?.status) params.append('status', options.status);\n if (options?.page) params.append('page', options.page.toString());\n if (options?.pageSize) params.append('pageSize', options.pageSize.toString());\n\n const queryString = params.toString();\n const url = `w/${wid}/members/anonymous-resolutions${queryString ? `?${queryString}` : ''}`;\n return this.fetch<PendingAnonymousMembersResponse>(url);\n }\n\n /**\n * Get a single anonymous member resolution by ID.\n */\n async getAnonymousResolution(\n wid: string,\n resolutionId: number\n ): Promise<AnonymousMemberResolution> {\n return this.fetch<AnonymousMemberResolution>(\n `w/${wid}/members/anonymous-resolutions/${resolutionId}`\n );\n }\n\n /**\n * Resolve an anonymous member to an existing member.\n * This merges the anonymous member's data into the target member\n * and archives the anonymous member.\n */\n async resolveAnonymousMember(\n wid: string,\n resolutionId: number,\n request: ResolveAnonymousMemberRequest\n ): Promise<AnonymousMemberResolution> {\n return this.fetch<AnonymousMemberResolution>(\n `w/${wid}/members/anonymous-resolutions/${resolutionId}/resolve`,\n {\n method: 'POST',\n body: JSON.stringify(request),\n }\n );\n }\n\n /**\n * Expire an anonymous member without resolving to a real member.\n * This archives the anonymous member without merging their data.\n */\n async expireAnonymousMember(\n wid: string,\n resolutionId: number,\n request?: ExpireAnonymousMemberRequest\n ): Promise<AnonymousMemberResolution> {\n return this.fetch<AnonymousMemberResolution>(\n `w/${wid}/members/anonymous-resolutions/${resolutionId}/expire`,\n {\n method: 'POST',\n body: JSON.stringify(request || {}),\n }\n );\n }\n}\n","import { BaseApiClient } from './base';\nimport {\n Milestone,\n MilestoneFormData,\n PaginatedResponse,\n MilestoneSortField,\n SortOrder,\n} from '../types';\n\nexport class MilestonesApi extends BaseApiClient {\n async getMilestones(\n wid: string,\n options: {\n page?: number;\n pageSize?: number;\n sortBy?: MilestoneSortField;\n sortOrder?: SortOrder;\n } = {}\n ): Promise<PaginatedResponse<Milestone>> {\n const params = new URLSearchParams();\n if (options.page) params.append('page', options.page.toString());\n if (options.pageSize) params.append('pageSize', options.pageSize.toString());\n if (options.sortBy) params.append('sortBy', options.sortBy);\n if (options.sortOrder) params.append('sortOrder', options.sortOrder);\n\n return this.fetch<PaginatedResponse<Milestone>>(\n `w/${wid}/milestones${params.toString() ? `?${params.toString()}` : ''}`\n );\n }\n\n async getMilestone(wid: string, id: number): Promise<Milestone> {\n return this.fetch<Milestone>(`w/${wid}/milestones/${id}`);\n }\n\n async createMilestone(wid: string, milestone: MilestoneFormData): Promise<Milestone> {\n return this.fetch<Milestone>(`w/${wid}/milestones`, {\n method: 'POST',\n body: JSON.stringify(milestone),\n });\n }\n\n async updateMilestone(\n wid: string,\n id: number,\n milestone: Partial<MilestoneFormData>\n ): Promise<Milestone> {\n return this.fetch<Milestone>(`w/${wid}/milestones/${id}`, {\n method: 'PUT',\n body: JSON.stringify(milestone),\n });\n }\n\n async deleteMilestone(wid: string, id: number): Promise<void> {\n return this.fetch(`w/${wid}/milestones/${id}`, {\n method: 'DELETE',\n });\n }\n}","import { BaseApiClient } from './base';\n\nexport interface MondayBoard {\n id: string;\n name: string;\n}\n\n/** Status label from Monday.com column settings */\nexport interface MondayStatusLabel {\n /** The display text of the status */\n label?: string;\n /** The color of the status (CSS color name or hex) */\n color?: string;\n /** The index used when creating webhooks for specific status changes */\n index?: number;\n /** Whether this status is deactivated */\n is_deactivated?: boolean;\n}\n\n/** Column settings - contains labels for status columns */\nexport interface MondayColumnSettings {\n /** Labels for status columns, keyed by index */\n labels?: Record<string, MondayStatusLabel | string>;\n /** Label colors for status columns */\n labels_colors?: Record<string, { color: string; border: string; var_name: string }>;\n}\n\nexport interface MondayColumn {\n id: string;\n title: string;\n type: string;\n /** Column settings - contains labels for status columns */\n settings?: MondayColumnSettings | null;\n}\n\nexport interface BoardsResponse {\n boards: MondayBoard[];\n}\n\nexport interface ColumnsResponse {\n columns: MondayColumn[];\n}\n\nexport interface WebhookResponse {\n id: string;\n board_id?: string;\n event?: string;\n}\n\nexport interface MondayGroup {\n id: string;\n title: string;\n}\n\nexport interface GroupsResponse {\n groups: MondayGroup[];\n}\n\n/** Configuration for webhook event types that require additional parameters */\nexport interface WebhookConfig {\n /** Column ID - required for change_specific_column_value and change_status_column_value */\n columnId?: string;\n /** Column value filter - for change_status_column_value, use {\"index\": N} */\n columnValue?: { index: number } | Record<string, unknown>;\n /** Group ID - required for item_moved_to_specific_group */\n groupId?: string;\n}\n\nexport interface CreateWebhookParams {\n board_id: string;\n url: string;\n event: string;\n /** Optional config for event types that support filtering */\n config?: WebhookConfig;\n}\n\nexport interface CurrentUserInfoResponse {\n connected: boolean;\n user_name?: string;\n user_email?: string;\n account_name?: string;\n}\n\n/** Detailed webhook info fetched from Monday.com */\nexport interface WebhookDetails {\n id: string;\n board_id?: string;\n event?: string;\n config?: WebhookConfig;\n}\n\n/**\n * API for Monday.com integration operations\n */\nexport class MondayIntegrationApi extends BaseApiClient {\n /**\n * Get list of boards from the user's Monday.com account\n */\n async getBoards(): Promise<BoardsResponse> {\n return this.fetch<BoardsResponse>('integrations/monday/boards');\n }\n\n /**\n * Get columns for a specific Monday.com board\n */\n async getBoardColumns(boardId: string): Promise<ColumnsResponse> {\n return this.fetch<ColumnsResponse>(`integrations/monday/boards/${boardId}/columns`);\n }\n\n /**\n * Create a webhook in Monday.com\n */\n async createWebhook(params: CreateWebhookParams): Promise<WebhookResponse> {\n return this.fetch<WebhookResponse>('integrations/monday/webhooks', {\n method: 'POST',\n body: JSON.stringify(params),\n });\n }\n\n /**\n * Delete a webhook from Monday.com\n */\n async deleteWebhook(webhookId: string): Promise<{ status: string; webhook_id: string }> {\n return this.fetch<{ status: string; webhook_id: string }>(\n `integrations/monday/webhooks/${webhookId}`,\n { method: 'DELETE' }\n );\n }\n\n /**\n * Get details of a specific webhook from Monday.com\n * Returns 404 if the webhook no longer exists\n */\n async getWebhook(boardId: string, webhookId: string): Promise<WebhookDetails> {\n return this.fetch<WebhookDetails>(\n `integrations/monday/boards/${boardId}/webhooks/${webhookId}`\n );\n }\n\n /**\n * Get groups for a specific Monday.com board\n */\n async getBoardGroups(boardId: string): Promise<GroupsResponse> {\n return this.fetch<GroupsResponse>(`integrations/monday/boards/${boardId}/groups`);\n }\n\n /**\n * Get info about the current user's Monday.com connection\n */\n async getCurrentUserInfo(): Promise<CurrentUserInfoResponse> {\n return this.fetch<CurrentUserInfoResponse>('integrations/monday/current-user');\n }\n}\n","import { BaseApiClient } from './base';\n\nexport interface NotificationRule {\n id?: number;\n noticeType: string;\n memberId: number;\n workflowId?: number | null;\n prompt?: string | null;\n notifySms: boolean;\n notifyEmail: boolean;\n notifyVoice: boolean;\n}\n\nexport interface NotificationRuleCreate {\n noticeType: string;\n memberId: number;\n workflowId?: number | null;\n prompt?: string | null;\n notifySms: boolean;\n notifyEmail: boolean;\n notifyVoice: boolean;\n}\n\nexport interface NotificationRuleUpdate {\n noticeType?: string;\n memberId?: number;\n workflowId?: number | null;\n prompt?: string | null;\n notifySms?: boolean;\n notifyEmail?: boolean;\n notifyVoice?: boolean;\n}\n\nexport class NotificationRulesApi extends BaseApiClient {\n async getNotificationRules(wid: string): Promise<NotificationRule[]> {\n return this.fetch<NotificationRule[]>(`w/${wid}/notification-rules`);\n }\n\n async createNotificationRule(\n wid: string,\n rule: NotificationRuleCreate\n ): Promise<NotificationRule> {\n return this.fetch<NotificationRule>(`w/${wid}/notification-rules`, {\n method: 'POST',\n body: JSON.stringify(rule),\n });\n }\n\n async updateNotificationRule(\n wid: string,\n ruleId: number,\n rule: NotificationRuleUpdate\n ): Promise<NotificationRule> {\n return this.fetch<NotificationRule>(`w/${wid}/notification-rules/${ruleId}`, {\n method: 'PUT',\n body: JSON.stringify(rule),\n });\n }\n\n async deleteNotificationRule(wid: string, ruleId: number): Promise<{ message: string }> {\n return this.fetch<{ message: string }>(`w/${wid}/notification-rules/${ruleId}`, {\n method: 'DELETE',\n });\n }\n}\n","import { BaseApiClient } from './base';\nimport type {\n AddGroupMemberRequest,\n ChatMessage,\n CreateOperatorGroupRequest,\n LiveOperatorsResponse,\n OperatorGroup,\n OperatorGroupMember,\n PresenceStatusResponse,\n UpdateOperatorGroupRequest,\n} from '../types';\n\nexport class OperatorApi extends BaseApiClient {\n async getOperatorGroups(wid: string): Promise<OperatorGroup[]> {\n return this.fetch<OperatorGroup[]>(`w/${wid}/operator/groups`);\n }\n\n async getOperatorGroup(wid: string, groupId: number): Promise<OperatorGroup> {\n return this.fetch<OperatorGroup>(`w/${wid}/operator/groups/${groupId}`);\n }\n\n async createOperatorGroup(\n wid: string,\n data: CreateOperatorGroupRequest\n ): Promise<OperatorGroup> {\n return this.fetch<OperatorGroup>(`w/${wid}/operator/groups`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n async updateOperatorGroup(\n wid: string,\n groupId: number,\n data: UpdateOperatorGroupRequest\n ): Promise<OperatorGroup> {\n return this.fetch<OperatorGroup>(`w/${wid}/operator/groups/${groupId}`, {\n method: 'PUT',\n body: JSON.stringify(data),\n });\n }\n\n async deleteOperatorGroup(wid: string, groupId: number): Promise<void> {\n return this.fetch(`w/${wid}/operator/groups/${groupId}`, {\n method: 'DELETE',\n });\n }\n\n async addGroupMember(\n wid: string,\n groupId: number,\n data: AddGroupMemberRequest\n ): Promise<OperatorGroupMember> {\n return this.fetch<OperatorGroupMember>(`w/${wid}/operator/groups/${groupId}/members`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n async removeGroupMember(wid: string, groupId: number, memberId: number): Promise<void> {\n return this.fetch(`w/${wid}/operator/groups/${groupId}/members/${memberId}`, {\n method: 'DELETE',\n });\n }\n\n async getLiveOperators(wid: string): Promise<LiveOperatorsResponse> {\n return this.fetch<LiveOperatorsResponse>(`w/${wid}/presence/live`);\n }\n\n async getPresenceStatus(wid: string): Promise<PresenceStatusResponse> {\n return this.fetch<PresenceStatusResponse>(`w/${wid}/presence/me`);\n }\n\n async disconnectPresence(wid: string): Promise<{ ok: boolean }> {\n return this.fetch<{ ok: boolean }>(`w/${wid}/presence/disconnect-self`, {\n method: 'POST',\n });\n }\n\n // Operator chat message methods\n\n async getOperatorChatMessages(\n wid: string,\n chatId: number,\n limit = 50,\n offset = 0\n ): Promise<ChatMessage[]> {\n return this.fetch<ChatMessage[]>(\n `w/${wid}/operator/chats/${chatId}/messages?limit=${limit}&offset=${offset}`\n );\n }\n\n async sendOperatorMessage(\n wid: string,\n chatId: number,\n content: string\n ): Promise<{\n id: number;\n uuid: string | null;\n role: string;\n content: string;\n createdAt: string | null;\n }> {\n return this.fetch(`w/${wid}/operator/chats/${chatId}/messages`, {\n method: 'POST',\n body: JSON.stringify({ content }),\n });\n }\n}\n","import { BaseApiClient } from './base';\n\n// Third-party OAuth connection types\nexport type OAuthProviderSlug = 'google_calendar' | 'gmail' | 'monday' | 'google' | 'tesla';\n\nexport interface OAuthConnectionStatus {\n connected: boolean;\n email?: string;\n}\n\nexport interface OAuthAuthorizeResponse {\n authorization_url: string;\n}\n\n/**\n * Build the OAuth endpoint path for a provider\n */\nfunction getOAuthPath(\n providerSlug: OAuthProviderSlug,\n action: 'status' | 'authorize' | 'disconnect'\n): string {\n // google_calendar uses /oauth/google/calendar/{action}\n // gmail uses /oauth/google/gmail/{action}\n // monday uses /oauth/monday/{action}\n // google uses /oauth/google/{action}\n if (providerSlug === 'google_calendar') {\n return `oauth/google/calendar/${action}`;\n } else if (providerSlug === 'gmail') {\n return `oauth/google/gmail/${action}`;\n } else if (providerSlug === 'monday') {\n return `oauth/monday/${action}`;\n } else {\n return `oauth/${providerSlug}/${action}`;\n }\n}\n\n/**\n * API for managing third-party OAuth connections (Google Calendar, Gmail, Monday, etc.)\n */\nexport class OAuthConnectionsApi extends BaseApiClient {\n /**\n * Get the connection status for an OAuth provider\n */\n async getConnectionStatus(\n providerSlug: OAuthProviderSlug\n ): Promise<OAuthConnectionStatus | null> {\n const path = getOAuthPath(providerSlug, 'status');\n return this.fetchRoot<OAuthConnectionStatus | null>(path);\n }\n\n /**\n * Get the authorization URL to start OAuth flow\n */\n async getAuthorizationUrl(providerSlug: OAuthProviderSlug): Promise<OAuthAuthorizeResponse> {\n const path = getOAuthPath(providerSlug, 'authorize');\n return this.fetchRoot<OAuthAuthorizeResponse>(path);\n }\n\n /**\n * Disconnect an OAuth provider\n */\n async disconnect(providerSlug: OAuthProviderSlug): Promise<void> {\n const path = getOAuthPath(providerSlug, 'disconnect');\n return this.fetchRoot<void>(path, { method: 'DELETE' });\n }\n}\n\n// Internal OAuth flow types (when Gravity Rail is the OAuth provider)\nexport interface AuthorizeRequest {\n clientId: string;\n workspaceUuid?: string | null;\n scopes: string[];\n redirectUri: string;\n state?: string;\n codeChallenge?: string;\n codeChallengeMethod?: string;\n}\n\nexport interface AuthorizeResponse {\n code: string;\n state?: string;\n}\n\nexport interface TokenRequest {\n grant_type: 'authorization_code' | 'refresh_token';\n code?: string;\n refresh_token?: string;\n client_id: string;\n client_secret: string;\n redirect_uri?: string;\n code_verifier?: string;\n}\n\nexport interface TokenResponse {\n access_token: string;\n token_type: string;\n expires_in: number;\n refresh_token?: string;\n scope: string;\n}\n\n/**\n * Individual scope metadata from the API\n */\nexport interface ApiScope {\n name: string;\n category: string;\n description: string;\n implies: string[];\n dangerous: boolean;\n}\n\n/**\n * Response from the scopes endpoint\n */\nexport interface ScopesListResponse {\n scopes: ApiScope[];\n categories: string[];\n}\n\nexport class OAuthApi extends BaseApiClient {\n /**\n * Get all available OAuth/API key scopes with metadata.\n *\n * This returns the full scope definitions from the backend,\n * ensuring the UI always shows the correct scopes.\n */\n async getAvailableScopes(): Promise<ScopesListResponse> {\n return this.fetch<ScopesListResponse>('oauth/scopes');\n }\n\n /**\n * Create an authorization code for OAuth flow\n * This is called after the user approves the authorization request\n */\n async authorize(request: AuthorizeRequest): Promise<AuthorizeResponse> {\n return this.fetch<AuthorizeResponse>('oauth/authorize', {\n method: 'POST',\n body: JSON.stringify(request),\n });\n }\n\n /**\n * Exchange authorization code for access token\n */\n async exchangeOAuthToken(request: TokenRequest): Promise<TokenResponse> {\n // OAuth token endpoint expects form-encoded data\n const formData = new URLSearchParams();\n formData.append('grant_type', request.grant_type);\n if (request.code) formData.append('code', request.code);\n if (request.refresh_token) formData.append('refresh_token', request.refresh_token);\n formData.append('client_id', request.client_id);\n formData.append('client_secret', request.client_secret);\n if (request.redirect_uri) formData.append('redirect_uri', request.redirect_uri);\n if (request.code_verifier) formData.append('code_verifier', request.code_verifier);\n\n return this.fetch<TokenResponse>('oauth/token', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n body: formData.toString(),\n });\n }\n}\n","import { BaseApiClient } from './base';\nimport {\n PhoneNumber,\n PhoneNumberFormData,\n PhoneCall,\n SMSMessage,\n PaginatedResponse,\n} from '../types';\n\nexport class PhoneNumbersApi extends BaseApiClient {\n async getPhoneNumbers(wid: string): Promise<PhoneNumber[]> {\n return this.fetch<PhoneNumber[]>(`w/${wid}/phone-numbers`);\n }\n\n async getAvailablePhoneNumbers(\n wid: string\n ): Promise<Array<{ phoneNumber: string; friendlyName: string }>> {\n return this.fetch<Array<{ phoneNumber: string; friendlyName: string }>>(\n `w/${wid}/phone-numbers/available-numbers`\n );\n }\n\n async requestPhoneNumber(\n wid: string,\n phoneNumber: string\n ): Promise<{ status: string; message: string }> {\n return this.fetch<{ status: string; message: string }>(`w/${wid}/phone-numbers/request`, {\n method: 'POST',\n body: JSON.stringify({ phone_number: phoneNumber }),\n });\n }\n\n async getPhoneNumber(wid: string, id: number): Promise<PhoneNumber> {\n return this.fetch<PhoneNumber>(`w/${wid}/phone-numbers/${id}`);\n }\n\n async createPhoneNumber(wid: string, phoneNumber: PhoneNumberFormData): Promise<PhoneNumber> {\n return this.fetch<PhoneNumber>(`w/${wid}/phone-numbers`, {\n method: 'POST',\n body: JSON.stringify(phoneNumber),\n });\n }\n\n async updatePhoneNumber(\n wid: string,\n id: number,\n phoneNumber: PhoneNumberFormData\n ): Promise<PhoneNumber> {\n return this.fetch<PhoneNumber>(`w/${wid}/phone-numbers/${id}`, {\n method: 'PUT',\n body: JSON.stringify(phoneNumber),\n });\n }\n\n async deletePhoneNumber(wid: string, id: number): Promise<void> {\n return this.fetch(`w/${wid}/phone-numbers/${id}`, {\n method: 'DELETE',\n });\n }\n\n async getPhoneNumberCalls(\n wid: string,\n id: number,\n page: number = 1,\n pageSize: number = 10\n ): Promise<PaginatedResponse<PhoneCall>> {\n return this.fetch<PaginatedResponse<PhoneCall>>(\n `w/${wid}/phone-numbers/${id}/calls?page=${page}&pageSize=${pageSize}`\n );\n }\n\n async getPhoneNumberMessages(\n wid: string,\n id: number,\n page: number = 1,\n pageSize: number = 10\n ): Promise<PaginatedResponse<SMSMessage>> {\n return this.fetch<PaginatedResponse<SMSMessage>>(\n `w/${wid}/phone-numbers/${id}/messages?page=${page}&pageSize=${pageSize}`\n );\n }\n}\n","import { BaseApiClient } from './base';\nimport type {\n PronunciationEntry,\n CreatePronunciationEntryFormData,\n UpdatePronunciationEntryFormData,\n PronunciationImportEntry,\n PronunciationImportResult,\n RecommendedVoice,\n} from '../types';\n\nexport class PronunciationsApi extends BaseApiClient {\n async getPronunciationEntries(\n orgUuid: string,\n options: { scope?: 'org' | 'account'; accountId?: number } = {}\n ): Promise<PronunciationEntry[]> {\n const params = new URLSearchParams();\n if (options.scope) params.append('scope', options.scope);\n if (options.accountId) params.append('accountId', options.accountId.toString());\n const response = await this.fetch<{ items: PronunciationEntry[]; total: number }>(\n `o/${orgUuid}/pronunciations${params.toString() ? `?${params.toString()}` : ''}`\n );\n return response.items;\n }\n\n async createPronunciationEntry(\n orgUuid: string,\n data: CreatePronunciationEntryFormData\n ): Promise<PronunciationEntry> {\n return this.fetch<PronunciationEntry>(`o/${orgUuid}/pronunciations`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n async updatePronunciationEntry(\n orgUuid: string,\n id: number,\n data: UpdatePronunciationEntryFormData\n ): Promise<PronunciationEntry> {\n return this.fetch<PronunciationEntry>(`o/${orgUuid}/pronunciations/${id}`, {\n method: 'PUT',\n body: JSON.stringify(data),\n });\n }\n\n async deletePronunciationEntry(orgUuid: string, id: number): Promise<void> {\n return this.fetch(`o/${orgUuid}/pronunciations/${id}`, {\n method: 'DELETE',\n });\n }\n\n async exportPronunciationEntries(\n orgUuid: string\n ): Promise<Array<{ term: string; respelling: string }>> {\n return this.fetch(`o/${orgUuid}/pronunciations/export`);\n }\n\n async importPronunciationEntries(\n orgUuid: string,\n entries: PronunciationImportEntry[]\n ): Promise<PronunciationImportResult> {\n return this.fetch<PronunciationImportResult>(`o/${orgUuid}/pronunciations/import`, {\n method: 'POST',\n body: JSON.stringify({ entries }),\n });\n }\n\n async getMyPronunciations(): Promise<PronunciationEntry[]> {\n const response = await this.fetch<{ items: PronunciationEntry[]; total: number }>(\n 'account/pronunciations'\n );\n return response.items;\n }\n\n async createMyPronunciation(\n data: Pick<CreatePronunciationEntryFormData, 'term' | 'respelling'>\n ): Promise<PronunciationEntry> {\n return this.fetch<PronunciationEntry>('account/pronunciations', {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n async updateMyPronunciation(\n id: number,\n data: UpdatePronunciationEntryFormData\n ): Promise<PronunciationEntry> {\n return this.fetch<PronunciationEntry>(`account/pronunciations/${id}`, {\n method: 'PUT',\n body: JSON.stringify(data),\n });\n }\n\n async deleteMyPronunciation(id: number): Promise<void> {\n return this.fetch(`account/pronunciations/${id}`, {\n method: 'DELETE',\n });\n }\n\n async suggestPronunciations(term: string, language?: string): Promise<string[]> {\n const response = await this.fetch<{ suggestions: string[] }>(\n 'account/pronunciations/suggest',\n {\n method: 'POST',\n body: JSON.stringify({ term, ...(language && { language }) }),\n }\n );\n return response.suggestions;\n }\n\n async getRecommendedVoices(): Promise<RecommendedVoice[]> {\n const response = await this.fetch<{ voices: RecommendedVoice[] }>(\n 'account/pronunciations/voices'\n );\n return response.voices;\n }\n\n async previewPronunciation(data: {\n respelling: string;\n voiceModel: string;\n }): Promise<ArrayBuffer> {\n const response = await this.fetchRaw('account/pronunciations/preview', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n respelling: data.respelling,\n voice_model: data.voiceModel,\n }),\n });\n return response.arrayBuffer();\n }\n}\n","import { BaseApiClient } from './base';\nimport type {\n AssignQualificationRequest,\n CreateQualificationRequest,\n CreateRequirementRequest,\n MemberQualification,\n OverrideCriterionRequest,\n PaginatedResponse,\n Qualification,\n QualificationMemberEntry,\n QualificationRequirement,\n QualificationStatusLogEntry,\n QualificationSubmission,\n ReviewSubmissionRequest,\n SubmitAnswerRequest,\n UpdateMemberQualificationRequest,\n UpdateQualificationRequest,\n UpdateRequirementRequest,\n} from '../types';\n\nexport class QualificationsApi extends BaseApiClient {\n async getQualifications(wid: string): Promise<Qualification[]> {\n return this.fetch<Qualification[]>(`w/${wid}/qualifications`);\n }\n\n async getQualification(wid: string, id: number): Promise<Qualification> {\n return this.fetch<Qualification>(`w/${wid}/qualifications/${id}`);\n }\n\n async createQualification(\n wid: string,\n data: CreateQualificationRequest\n ): Promise<Qualification> {\n return this.fetch<Qualification>(`w/${wid}/qualifications`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n async updateQualification(\n wid: string,\n id: number,\n data: UpdateQualificationRequest\n ): Promise<Qualification> {\n return this.fetch<Qualification>(`w/${wid}/qualifications/${id}`, {\n method: 'PUT',\n body: JSON.stringify(data),\n });\n }\n\n async getQualificationMembers(\n wid: string,\n id: number,\n params?: { status?: string; memberType?: string; page?: number; pageSize?: number }\n ): Promise<PaginatedResponse<QualificationMemberEntry>> {\n const searchParams = new URLSearchParams();\n if (params?.status) searchParams.set('status', params.status);\n if (params?.memberType) searchParams.set('memberType', params.memberType);\n if (params?.page) searchParams.set('page', params.page.toString());\n if (params?.pageSize) searchParams.set('pageSize', params.pageSize.toString());\n const qs = searchParams.toString();\n return this.fetch<PaginatedResponse<QualificationMemberEntry>>(\n `w/${wid}/qualifications/${id}/members${qs ? `?${qs}` : ''}`\n );\n }\n\n async archiveQualification(wid: string, id: number): Promise<void> {\n return this.fetch(`w/${wid}/qualifications/${id}`, {\n method: 'DELETE',\n });\n }\n\n async getMemberQualifications(wid: string, memberId: number): Promise<MemberQualification[]> {\n return this.fetch<MemberQualification[]>(\n `w/${wid}/qualifications/members/${memberId}/qualifications`\n );\n }\n\n async assignQualification(\n wid: string,\n memberId: number,\n data: AssignQualificationRequest\n ): Promise<MemberQualification> {\n return this.fetch<MemberQualification>(\n `w/${wid}/qualifications/members/${memberId}/qualifications`,\n {\n method: 'POST',\n body: JSON.stringify(data),\n }\n );\n }\n\n async updateMemberQualification(\n wid: string,\n memberId: number,\n qualificationId: number,\n data: UpdateMemberQualificationRequest\n ): Promise<MemberQualification> {\n return this.fetch<MemberQualification>(\n `w/${wid}/qualifications/members/${memberId}/qualifications/${qualificationId}`,\n {\n method: 'PUT',\n body: JSON.stringify(data),\n }\n );\n }\n\n async removeMemberQualification(\n wid: string,\n memberId: number,\n qualificationId: number\n ): Promise<void> {\n return this.fetch(\n `w/${wid}/qualifications/members/${memberId}/qualifications/${qualificationId}`,\n {\n method: 'DELETE',\n }\n );\n }\n\n async getMemberQualificationLog(\n wid: string,\n memberId: number,\n qualificationId: number\n ): Promise<QualificationStatusLogEntry[]> {\n return this.fetch<QualificationStatusLogEntry[]>(\n `w/${wid}/qualifications/members/${memberId}/qualifications/${qualificationId}/log`\n );\n }\n\n // ===== Requirements =====\n\n async listRequirements(\n wid: string,\n qualificationId: number\n ): Promise<QualificationRequirement[]> {\n return this.fetch<QualificationRequirement[]>(\n `w/${wid}/qualifications/${qualificationId}/requirements`\n );\n }\n\n async createRequirement(\n wid: string,\n qualificationId: number,\n data: CreateRequirementRequest\n ): Promise<QualificationRequirement> {\n return this.fetch<QualificationRequirement>(\n `w/${wid}/qualifications/${qualificationId}/requirements`,\n {\n method: 'POST',\n body: JSON.stringify(data),\n }\n );\n }\n\n async getRequirement(wid: string, requirementId: number): Promise<QualificationRequirement> {\n return this.fetch<QualificationRequirement>(\n `w/${wid}/qualifications/requirements/${requirementId}`\n );\n }\n\n async updateRequirement(\n wid: string,\n requirementId: number,\n data: UpdateRequirementRequest\n ): Promise<QualificationRequirement> {\n return this.fetch<QualificationRequirement>(\n `w/${wid}/qualifications/requirements/${requirementId}`,\n {\n method: 'PUT',\n body: JSON.stringify(data),\n }\n );\n }\n\n async deleteRequirement(wid: string, requirementId: number): Promise<void> {\n return this.fetch(`w/${wid}/qualifications/requirements/${requirementId}`, {\n method: 'DELETE',\n });\n }\n\n // ===== Submissions =====\n\n async listSubmissions(\n wid: string,\n qualificationId: number,\n params?: { status?: string; memberId?: number }\n ): Promise<QualificationSubmission[]> {\n const searchParams = new URLSearchParams();\n if (params?.status) searchParams.set('status', params.status);\n if (params?.memberId) searchParams.set('memberId', params.memberId.toString());\n const qs = searchParams.toString();\n return this.fetch<QualificationSubmission[]>(\n `w/${wid}/qualifications/${qualificationId}/submissions${qs ? `?${qs}` : ''}`\n );\n }\n\n async getSubmission(wid: string, submissionId: number): Promise<QualificationSubmission> {\n return this.fetch<QualificationSubmission>(\n `w/${wid}/qualifications/submissions/${submissionId}`\n );\n }\n\n async submitAnswer(\n wid: string,\n requirementId: number,\n data: SubmitAnswerRequest\n ): Promise<QualificationSubmission> {\n return this.fetch<QualificationSubmission>(\n `w/${wid}/qualifications/requirements/${requirementId}/submit`,\n {\n method: 'POST',\n body: JSON.stringify(data),\n }\n );\n }\n\n async startScenario(wid: string, requirementId: number): Promise<QualificationSubmission> {\n return this.fetch<QualificationSubmission>(\n `w/${wid}/qualifications/requirements/${requirementId}/start-scenario`,\n {\n method: 'POST',\n }\n );\n }\n\n async retrySubmission(wid: string, submissionId: number): Promise<void> {\n await this.fetch(`w/${wid}/qualifications/submissions/${submissionId}/retry`, {\n method: 'DELETE',\n });\n }\n\n async submitForReview(wid: string, qualificationId: number): Promise<MemberQualification> {\n return this.fetch<MemberQualification>(\n `w/${wid}/qualifications/members/me/qualifications/${qualificationId}/submit`,\n {\n method: 'POST',\n }\n );\n }\n\n async reviewSubmission(\n wid: string,\n submissionId: number,\n data: ReviewSubmissionRequest\n ): Promise<QualificationSubmission> {\n return this.fetch<QualificationSubmission>(\n `w/${wid}/qualifications/submissions/${submissionId}/review`,\n {\n method: 'PUT',\n body: JSON.stringify(data),\n }\n );\n }\n\n async overrideCriterionScore(\n wid: string,\n submissionId: number,\n criterionId: number,\n data: OverrideCriterionRequest\n ): Promise<QualificationSubmission> {\n return this.fetch<QualificationSubmission>(\n `w/${wid}/qualifications/submissions/${submissionId}/criteria/${criterionId}`,\n {\n method: 'PUT',\n body: JSON.stringify(data),\n }\n );\n }\n}\n","import { BaseApiClient } from './base';\n\nexport interface ModelUsageStats {\n model: string;\n provider: string;\n type: string;\n message_count: number;\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n cached_tokens: number;\n audio_input_tokens: number;\n audio_output_tokens: number;\n total_cost: number;\n average_tokens_per_message: number;\n average_cost_per_message: number;\n ai_units: number;\n multiplier: number;\n}\n\nexport interface ProviderUsageSummary {\n provider: string;\n total_messages: number;\n total_tokens: number;\n total_cached_tokens: number;\n total_audio_input_tokens: number;\n total_audio_output_tokens: number;\n total_cost: number;\n total_ai_units: number;\n models: ModelUsageStats[];\n}\n\nexport interface AIUsageReport {\n workspace_id: string;\n workspace_name: string;\n report_period_start: string;\n report_period_end: string;\n total_messages: number;\n total_tokens: number;\n total_cached_tokens: number;\n total_audio_input_tokens: number;\n total_audio_output_tokens: number;\n total_cost: number;\n total_ai_units: number;\n by_provider: ProviderUsageSummary[];\n by_type: Record<\n string,\n { messages: number; tokens: number; cached_tokens: number; cost: number; ai_units: number }\n >;\n top_models: ModelUsageStats[];\n}\n\nexport interface AIUsageReportParams {\n start_date?: string;\n end_date?: string;\n}\n\nexport interface SMSUsageRow {\n date: string;\n phoneNumberId: number;\n phoneNumber: string;\n phoneName?: string;\n inbound: number;\n outbound: number;\n totalChars: number;\n}\n\nexport interface PhoneAggregatedData {\n phoneNumberId: number;\n phoneNumber: string;\n phoneName?: string;\n totalMessages: number;\n inbound: number;\n outbound: number;\n totalChars: number;\n}\n\nexport interface DayAggregatedData {\n date: string;\n totalMessages: number;\n inbound: number;\n outbound: number;\n totalChars: number;\n}\n\nexport interface SMSUsageReport {\n workspaceId: string;\n workspaceUuid: string;\n workspaceName: string;\n reportPeriodStart: string;\n reportPeriodEnd: string;\n totalMessages: number;\n totalInbound: number;\n totalOutbound: number;\n totalCharacters: number;\n rows: SMSUsageRow[];\n}\n\nexport interface SMSUsageReportParams {\n start_date?: string;\n end_date?: string;\n}\n\nexport interface PhoneUsageRow {\n date: string;\n phoneNumberId: number;\n phoneNumber: string;\n phoneName?: string;\n inbound: number;\n outbound: number;\n totalDurationSeconds: number;\n}\n\nexport interface PhoneCallAggregatedData {\n phoneNumberId: number;\n phoneNumber: string;\n phoneName?: string;\n totalCalls: number;\n inbound: number;\n outbound: number;\n totalDurationSeconds: number;\n}\n\nexport interface DayCallAggregatedData {\n date: string;\n totalCalls: number;\n inbound: number;\n outbound: number;\n totalDurationSeconds: number;\n}\n\nexport interface PhoneUsageReport {\n workspaceId: string;\n workspaceUuid: string;\n workspaceName: string;\n reportPeriodStart: string;\n reportPeriodEnd: string;\n totalCalls: number;\n totalInbound: number;\n totalOutbound: number;\n totalDurationSeconds: number;\n rows: PhoneUsageRow[];\n}\n\nexport interface PhoneUsageReportParams {\n start_date?: string;\n end_date?: string;\n}\n\nexport interface MemberUsageReport {\n memberId: number;\n periodStart: string;\n periodEnd: string;\n totalChats: number;\n totalMessages: number;\n totalAiUnits: number;\n totalCost: number;\n}\n\nexport interface MemberUsageReportParams {\n start_date?: string;\n end_date?: string;\n}\n\n// Voice Usage Report Types\nexport interface STTUsageRow {\n date: string;\n provider: string;\n model: string;\n messageCount: number;\n totalDurationSeconds: number;\n cost: number;\n}\n\nexport interface TTSUsageRow {\n date: string;\n provider: string;\n model: string;\n messageCount: number;\n totalCharacters: number;\n cost: number;\n}\n\nexport interface STTProviderSummary {\n provider: string;\n model: string;\n totalDurationSeconds: number;\n totalMessages: number;\n cost: number;\n}\n\nexport interface TTSProviderSummary {\n provider: string;\n model: string;\n totalCharacters: number;\n totalMessages: number;\n cost: number;\n}\n\nexport interface VoiceUsageReport {\n workspaceId: string;\n workspaceUuid: string;\n workspaceName: string;\n reportPeriodStart: string;\n reportPeriodEnd: string;\n totalSttDurationSeconds: number;\n totalSttMessages: number;\n totalSttCost: number;\n totalTtsCharacters: number;\n totalTtsMessages: number;\n totalTtsCost: number;\n totalCost: number;\n sttByProvider: STTProviderSummary[];\n ttsByProvider: TTSProviderSummary[];\n sttRows: STTUsageRow[];\n ttsRows: TTSUsageRow[];\n}\n\nexport interface VoiceUsageReportParams {\n start_date?: string;\n end_date?: string;\n}\n\nexport class ReportsApi extends BaseApiClient {\n async getAIUsageReport(wid: string, params?: AIUsageReportParams): Promise<AIUsageReport> {\n const queryParams = new URLSearchParams();\n if (params?.start_date) {\n queryParams.append('start_date', params.start_date);\n }\n if (params?.end_date) {\n queryParams.append('end_date', params.end_date);\n }\n\n const queryString = queryParams.toString();\n const url = `w/${wid}/reports/ai-usage${queryString ? `?${queryString}` : ''}`;\n\n return this.fetch<AIUsageReport>(url);\n }\n\n async getSMSUsageReport(wid: string, params?: SMSUsageReportParams): Promise<SMSUsageReport> {\n const queryParams = new URLSearchParams();\n if (params?.start_date) {\n queryParams.append('start_date', params.start_date);\n }\n if (params?.end_date) {\n queryParams.append('end_date', params.end_date);\n }\n\n const queryString = queryParams.toString();\n const url = `w/${wid}/reports/sms-usage${queryString ? `?${queryString}` : ''}`;\n\n return this.fetch<SMSUsageReport>(url);\n }\n\n async getPhoneUsageReport(\n wid: string,\n params?: PhoneUsageReportParams\n ): Promise<PhoneUsageReport> {\n const queryParams = new URLSearchParams();\n if (params?.start_date) {\n queryParams.append('start_date', params.start_date);\n }\n if (params?.end_date) {\n queryParams.append('end_date', params.end_date);\n }\n\n const queryString = queryParams.toString();\n const url = `w/${wid}/reports/phone-usage${queryString ? `?${queryString}` : ''}`;\n\n return this.fetch<PhoneUsageReport>(url);\n }\n\n async getMemberUsage(\n wid: string,\n memberId: number,\n params?: MemberUsageReportParams\n ): Promise<MemberUsageReport> {\n const queryParams = new URLSearchParams();\n if (params?.start_date) {\n queryParams.append('start_date', params.start_date);\n }\n if (params?.end_date) {\n queryParams.append('end_date', params.end_date);\n }\n\n const queryString = queryParams.toString();\n const url = `w/${wid}/reports/member-usage/${memberId}${queryString ? `?${queryString}` : ''}`;\n\n return this.fetch<MemberUsageReport>(url);\n }\n\n async getVoiceUsageReport(\n wid: string,\n params?: VoiceUsageReportParams\n ): Promise<VoiceUsageReport> {\n const queryParams = new URLSearchParams();\n if (params?.start_date) {\n queryParams.append('start_date', params.start_date);\n }\n if (params?.end_date) {\n queryParams.append('end_date', params.end_date);\n }\n\n const queryString = queryParams.toString();\n const url = `w/${wid}/reports/voice-usage${queryString ? `?${queryString}` : ''}`;\n\n return this.fetch<VoiceUsageReport>(url);\n }\n}\n","import {\n FileUploadRequest,\n FileUploadResponse,\n MenuItem,\n MenuItemFormData,\n MenuTree,\n Page,\n PageFormData,\n PagesQueryParams,\n PaginatedResponse,\n RenderedPage,\n ReorderMenuItemsData,\n Site,\n SiteCountsResponse,\n SiteFormData,\n SiteSignupResponse,\n SiteSlugAvailability,\n} from '../types';\nimport { BaseApiClient } from './base';\n\nexport class SitesApi extends BaseApiClient {\n async getSites(wid: string): Promise<Site[]> {\n return this.fetch<Site[]>(`w/${wid}/sites`);\n }\n\n async checkSiteSlugAvailability(\n wid: string,\n slug: string,\n siteUuid: string | null = null\n ): Promise<SiteSlugAvailability> {\n const params = new URLSearchParams();\n if (siteUuid) params.append('site_uuid', siteUuid);\n return this.fetch<SiteSlugAvailability>(\n `w/${wid}/sites/available/${slug}?${params.toString()}`\n );\n }\n\n async checkSiteDomainAvailability(\n wid: string,\n domain: string,\n siteUuid: string | null = null\n ): Promise<{ result: boolean }> {\n const params = new URLSearchParams();\n if (siteUuid) params.append('site_uuid', siteUuid);\n return this.fetch<{ result: boolean }>(\n `w/${wid}/sites/domain-available/${domain}?${params.toString()}`\n );\n }\n\n async getSite(wid: string, id: number): Promise<Site> {\n return this.fetch<Site>(`w/${wid}/sites/${id}`);\n }\n\n async getSiteByUuid(wid: string, uuid: string): Promise<Site> {\n return this.fetch<Site>(`s/${wid}/${uuid}`);\n }\n\n async getSiteRenderedPage(\n wid: string,\n siteUuid: string,\n pageSlugOrId: string | number\n ): Promise<RenderedPage> {\n return this.fetch<RenderedPage>(`s/${wid}/${siteUuid}/pages/${pageSlugOrId}`);\n }\n\n async getSiteRenderedMenu(wid: string, siteUuid: string): Promise<MenuTree> {\n // Menu always includes all translations - client picks the right one\n return this.fetch<MenuTree>(`s/${wid}/${siteUuid}/menu`);\n }\n\n async siteSignup(wid: string, siteUuid: string): Promise<SiteSignupResponse> {\n return this.fetch<SiteSignupResponse>(`s/${wid}/${siteUuid}/signup`, {\n method: 'POST',\n });\n }\n\n // ===== SITE-SPECIFIC AUTHENTICATION METHODS =====\n async siteSendPhoneCode(\n wid: string,\n siteUuid: string,\n phoneNumber: string\n ): Promise<{ success: boolean; message: string }> {\n return this.fetch<{ success: boolean; message: string }>(\n `s/${wid}/${siteUuid}/auth/send-phone-code`,\n {\n method: 'POST',\n body: JSON.stringify({ phoneNumber }),\n }\n );\n }\n\n async siteSendEmailCode(\n wid: string,\n siteUuid: string,\n email: string\n ): Promise<{ success: boolean; message: string }> {\n return this.fetch<{ success: boolean; message: string }>(\n `s/${wid}/${siteUuid}/auth/send-email-code`,\n {\n method: 'POST',\n body: JSON.stringify({ email }),\n }\n );\n }\n\n async siteVerifyCode(\n wid: string,\n siteUuid: string,\n code: string,\n phoneNumber?: string,\n email?: string\n ): Promise<{ token: string; accountId: number; memberId?: number }> {\n // Verify code and auto-create account+member if needed\n const verifyResponse = await this.fetch<{\n token: string;\n accountId: number;\n memberId?: number;\n }>(`s/${wid}/${siteUuid}/auth/verify`, {\n method: 'POST',\n body: JSON.stringify({ code, phoneNumber, email }),\n });\n\n // Set the auth cookies using the local complete endpoint\n const completeResponse = await fetch(`/api/auth/complete`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ token: verifyResponse.token }),\n });\n\n if (!completeResponse.ok) {\n throw new Error('Failed to complete authentication');\n }\n\n return verifyResponse;\n }\n\n async crawlSite(wid: string, siteId: number): Promise<Site> {\n return this.fetch<Site>(`w/${wid}/sites/${siteId}/crawl`, {\n method: 'POST',\n });\n }\n\n async createSite(wid: string, site: SiteFormData): Promise<Site> {\n return this.fetch<Site>(`w/${wid}/sites`, {\n method: 'POST',\n body: JSON.stringify(site),\n });\n }\n\n async updateSite(wid: string, id: number, site: Partial<SiteFormData>): Promise<Site> {\n return this.fetch<Site>(`w/${wid}/sites/${id}`, {\n method: 'PUT',\n body: JSON.stringify(site),\n });\n }\n\n async deleteSite(wid: string, id: number): Promise<void> {\n return this.fetch(`w/${wid}/sites/${id}`, {\n method: 'DELETE',\n });\n }\n\n async getSitePages(\n wid: string,\n siteId: number,\n options: PagesQueryParams = {}\n ): Promise<PaginatedResponse<Page>> {\n const params = new URLSearchParams();\n if (options.page) params.append('page', options.page.toString());\n if (options.pageSize) params.append('pageSize', options.pageSize.toString());\n if (options.sortBy) params.append('sortBy', options.sortBy);\n if (options.sortOrder) params.append('sortOrder', options.sortOrder);\n if (options.search) params.append('search', options.search);\n\n return this.fetch<PaginatedResponse<Page>>(\n `w/${wid}/sites/${siteId}/pages${params.toString() ? `?${params.toString()}` : ''}`\n );\n }\n\n async getPage(wid: string, siteId: number, pageId: number): Promise<Page> {\n return this.fetch<Page>(`w/${wid}/sites/${siteId}/pages/${pageId}`);\n }\n\n async getPageBySlug(wid: string, siteId: number, slug: string): Promise<Page> {\n return this.fetch<Page>(`w/${wid}/sites/${siteId}/pages/by-slug/${slug}`);\n }\n\n async createPage(wid: string, siteId: number, page: PageFormData): Promise<Page> {\n return this.fetch<Page>(`w/${wid}/sites/${siteId}/pages`, {\n method: 'POST',\n body: JSON.stringify(page),\n });\n }\n\n async updatePage(\n wid: string,\n siteId: number,\n pageId: number,\n page: Partial<PageFormData>\n ): Promise<Page> {\n return this.fetch<Page>(`w/${wid}/sites/${siteId}/pages/${pageId}`, {\n method: 'PUT',\n body: JSON.stringify(page),\n });\n }\n\n async deletePage(wid: string, siteId: number, pageId: number): Promise<void> {\n return this.fetch(`w/${wid}/sites/${siteId}/pages/${pageId}`, {\n method: 'DELETE',\n });\n }\n\n async getSiteCounts(wid: string, siteId: number): Promise<SiteCountsResponse> {\n return this.fetch<SiteCountsResponse>(`w/${wid}/sites/${siteId}/counts`);\n }\n\n // Menu management methods\n async getSiteMenu(wid: string, siteId: number): Promise<MenuTree> {\n return this.fetch<MenuTree>(`w/${wid}/sites/${siteId}/menu`);\n }\n\n async getMenuItems(wid: string, siteId: number, parentId?: number | null): Promise<MenuItem[]> {\n const params = new URLSearchParams();\n if (parentId !== undefined && parentId !== null) {\n params.append('parent_id', parentId.toString());\n }\n const query = params.toString();\n return this.fetch<MenuItem[]>(\n `w/${wid}/sites/${siteId}/menu/items${query ? `?${query}` : ''}`\n );\n }\n\n async createMenuItem(wid: string, siteId: number, item: MenuItemFormData): Promise<MenuItem> {\n return this.fetch<MenuItem>(`w/${wid}/sites/${siteId}/menu/items`, {\n method: 'POST',\n body: JSON.stringify(item),\n });\n }\n\n async updateMenuItem(\n wid: string,\n siteId: number,\n itemId: number,\n item: Partial<MenuItemFormData>\n ): Promise<MenuItem> {\n return this.fetch<MenuItem>(`w/${wid}/sites/${siteId}/menu/items/${itemId}`, {\n method: 'PUT',\n body: JSON.stringify(item),\n });\n }\n\n async deleteMenuItem(wid: string, siteId: number, itemId: number): Promise<void> {\n return this.fetch(`w/${wid}/sites/${siteId}/menu/items/${itemId}`, {\n method: 'DELETE',\n });\n }\n\n async reorderMenuItems(wid: string, siteId: number, data: ReorderMenuItemsData): Promise<void> {\n return this.fetch(`w/${wid}/sites/${siteId}/menu/reorder`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n // Site media upload method\n async generateSiteMediaUploadUrl(\n wid: string,\n siteId: number,\n uploadRequest: FileUploadRequest\n ): Promise<FileUploadResponse> {\n return this.fetch<FileUploadResponse>(`w/${wid}/sites/${siteId}/media/upload-url`, {\n method: 'POST',\n body: JSON.stringify(uploadRequest),\n });\n }\n\n async siteGoogleOAuthInitiate(\n wid: string,\n siteUuid: string,\n origin: string\n ): Promise<{ authorizationUrl: string }> {\n const params = new URLSearchParams({ origin });\n return this.fetch<{ authorizationUrl: string }>(\n `s/${wid}/${siteUuid}/auth/google/initiate?${params.toString()}`\n );\n }\n}\n","import { BaseApiClient } from './base';\nimport { Subscription } from '../types';\n\nexport class SubscriptionsApi extends BaseApiClient {\n async getSubscriptions(): Promise<Subscription[]> {\n return this.fetch<Subscription[]>('subscriptions');\n }\n\n async getWorkspaceSubscriptions(wid: string): Promise<Subscription[]> {\n return this.fetch<Subscription[]>(`w/${wid}/subscriptions`);\n }\n\n async cancelSubscription(subscriptionId: number): Promise<void> {\n return this.fetch(`subscriptions/${subscriptionId}/cancel`, {\n method: 'POST',\n credentials: 'include',\n });\n }\n\n async reactivateSubscription(subscriptionId: number): Promise<{ message: string }> {\n return this.fetch(`subscriptions/${subscriptionId}/reactivate`, {\n method: 'POST',\n credentials: 'include',\n });\n }\n\n async updateSubscription(\n subscriptionId: number,\n updates: {\n paygBudget?: number | null; // null = unlimited, 0 = disabled, positive = capped\n planPeriod?: string; // Plan period (e.g., \"month\", \"year\")\n }\n ): Promise<{ message: string }> {\n return this.fetch(`subscriptions/${subscriptionId}`, {\n method: 'PUT',\n credentials: 'include',\n body: JSON.stringify(updates),\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n }\n\n async provisionMemberRole(subscriptionId: number): Promise<{ message: string }> {\n return this.fetch(`subscriptions/${subscriptionId}/provision-role`, {\n method: 'POST',\n credentials: 'include',\n });\n }\n}\n","import { BaseApiClient } from './base';\nimport { Task, TaskFormData } from '../types';\n\nexport class TasksApi extends BaseApiClient {\n async getTasks(\n wid: string,\n options: {\n includeArchived?: boolean;\n workflowId?: number;\n } = {}\n ): Promise<Task[]> {\n const params = new URLSearchParams();\n if (options.includeArchived) {\n params.append('include_archived', 'true');\n }\n if (options.workflowId) {\n params.append('workflow_id', options.workflowId.toString());\n }\n return this.fetch<Task[]>(\n `w/${wid}/tasks${params.toString() ? `?${params.toString()}` : ''}`\n );\n }\n\n async getTask(wid: string, id: number | string): Promise<Task> {\n return this.fetch<Task>(`w/${wid}/tasks/${id}`);\n }\n\n async createTask(wid: string, task: TaskFormData): Promise<Task> {\n return this.fetch<Task>(`w/${wid}/tasks`, {\n method: 'POST',\n body: JSON.stringify(task),\n });\n }\n\n async updateTask(wid: string, id: number, task: Partial<TaskFormData>): Promise<Task> {\n return this.fetch<Task>(`w/${wid}/tasks/${id}`, {\n method: 'PUT',\n body: JSON.stringify(task),\n });\n }\n\n async deleteTask(wid: string, id: number): Promise<void> {\n return this.fetch(`w/${wid}/tasks/${id}`, {\n method: 'DELETE',\n });\n }\n\n async archiveTask(wid: string, id: number): Promise<Task> {\n return this.fetch<Task>(`w/${wid}/tasks/${id}/archive`, {\n method: 'PUT',\n });\n }\n\n async unarchiveTask(wid: string, id: number): Promise<Task> {\n return this.fetch<Task>(`w/${wid}/tasks/${id}/unarchive`, {\n method: 'PUT',\n });\n }\n\n /**\n * Convert legacy task relations (files, folders, data types, calendars, tools)\n * to the new abilities system.\n *\n * This migrates a task from the legacy relation-based configuration to abilities.\n * After conversion, the legacy relations are cleared to prevent duplicate functionality.\n */\n async convertToAbilities(\n wid: string,\n taskId: number\n ): Promise<{ converted: boolean; message: string; abilitiesCreated: number }> {\n return this.fetch<{ converted: boolean; message: string; abilitiesCreated: number }>(\n `w/${wid}/tasks/${taskId}/convert-to-abilities`,\n { method: 'POST' }\n );\n }\n\n /**\n * Clone a task with all its dependencies including abilities.\n *\n * This creates a complete copy of the task on the backend, including:\n * - Task properties (name, description, prompt, etc.)\n * - File associations\n * - Data type associations\n * - Event rules\n * - Abilities (task-scoped)\n */\n async cloneTask(wid: string, taskId: number, name: string, slug?: string): Promise<Task> {\n return this.fetch<Task>(`w/${wid}/tasks/${taskId}/clone`, {\n method: 'POST',\n body: JSON.stringify({ name, slug }),\n });\n }\n}\n","import type { ToolkitsResponse, ToolResponse } from '../types/toolkitTypes';\nimport { BaseApiClient } from './base';\n\n/**\n * API client for toolkit-related operations.\n */\nexport class ToolkitsApi extends BaseApiClient {\n /**\n * Get available toolkits for the workspace\n */\n async getToolkits(wid: string): Promise<ToolkitsResponse> {\n return this.fetch<ToolkitsResponse>(`w/${wid}/toolkits`);\n }\n\n /**\n * Get details for a specific tool by name within a chat context.\n * Searches tools available to the chat's assistant.\n */\n async getTool(wid: string, chatId: number, toolName: string): Promise<ToolResponse> {\n return this.fetch<ToolResponse>(\n `w/${wid}/chats/${chatId}/tool/${encodeURIComponent(toolName)}`\n );\n }\n}\n","import { BaseApiClient } from './base';\nimport type { Workflow, WorkflowFormData } from '../types';\nimport type {\n WorkflowTemplate,\n CreateWorkflowFromTemplateFormData,\n WorkflowActivity,\n TaskAssignmentStats,\n TaskChatsListResponse,\n WorkflowContributor,\n CreateWorkflowContributorRequest,\n UpdateWorkflowContributorRequest,\n} from '../types/taskTypes';\nimport type {\n WorkspaceBuilderInfo,\n BuildWorkspaceResponse,\n ValidateWorkflowNameResponse,\n} from '../types/workspaceBuilderTypes';\n\nexport class WorkflowsApi extends BaseApiClient {\n async getWorkflows(wid: string, archived: boolean = false): Promise<Workflow[]> {\n const url = archived ? `w/${wid}/workflows?archived=true` : `w/${wid}/workflows`;\n return this.fetch<Workflow[]>(url);\n }\n\n async getWorkflow(wid: string, id: number | string): Promise<Workflow> {\n return this.fetch<Workflow>(`w/${wid}/workflows/${id}`);\n }\n\n async getWorkflowActivity(\n wid: string,\n id: number,\n options?: { days?: number }\n ): Promise<WorkflowActivity> {\n const params = options?.days ? `?days=${options.days}` : '';\n return this.fetch<WorkflowActivity>(`w/${wid}/workflows/${id}/activity${params}`);\n }\n\n async getWorkflowsActivityBatch(\n wid: string,\n workflowIds: number[],\n options?: { days?: number }\n ): Promise<Record<string, WorkflowActivity>> {\n const params = new URLSearchParams();\n params.set('workflow_ids', workflowIds.join(','));\n if (options?.days) params.set('days', String(options.days));\n return this.fetch<Record<string, WorkflowActivity>>(\n `w/${wid}/workflows/activity/batch?${params.toString()}`\n );\n }\n\n async getWorkflowDiagram(\n wid: string,\n id: number\n ): Promise<{ mermaid: string; taskCount: number }> {\n return this.fetch<{ mermaid: string; taskCount: number }>(`w/${wid}/workflows/${id}/diagram`);\n }\n\n /**\n * Get workflow thumbnail URL.\n * For cross-domain setups, returns a same-origin proxy URL to ensure cookies are sent.\n * For same-origin setups, returns the direct API URL.\n */\n getWorkflowThumbnailUrl(wid: string, id: number): string {\n if (this.isCrossDomain) {\n // Use same-origin proxy route to ensure cookies are sent with the request\n return `/api/v2/w/${wid}/workflows/${id}/thumbnail`;\n }\n // Same-origin: use direct API URL\n return `${this.baseUrl}/api/v2/w/${wid}/workflows/${id}/thumbnail`;\n }\n\n async createWorkflow(wid: string, workflow: WorkflowFormData): Promise<Workflow> {\n return this.fetch<Workflow>(`w/${wid}/workflows`, {\n method: 'POST',\n body: JSON.stringify(workflow),\n });\n }\n\n async updateWorkflow(\n wid: string,\n id: number,\n workflow: Partial<WorkflowFormData>\n ): Promise<Workflow> {\n return this.fetch<Workflow>(`w/${wid}/workflows/${id}`, {\n method: 'PUT',\n body: JSON.stringify(workflow),\n });\n }\n\n async getWorkflowDeletionPreview(\n wid: string,\n id: number\n ): Promise<{\n taskCount: number;\n tasks: Array<{ id: number; name: string; description: string | null }>;\n hasAssignments: boolean;\n }> {\n return this.fetch(`w/${wid}/workflows/${id}/deletion-preview`);\n }\n\n async deleteWorkflow(\n wid: string,\n id: number,\n cascade: boolean = false\n ): Promise<{ status: string; deletedTaskCount: number }> {\n const url = cascade ? `w/${wid}/workflows/${id}?cascade=true` : `w/${wid}/workflows/${id}`;\n return this.fetch(url, {\n method: 'DELETE',\n });\n }\n\n async archiveWorkflow(wid: string, id: number): Promise<{ status: string }> {\n return this.fetch(`w/${wid}/workflows/${id}/archive`, {\n method: 'POST',\n });\n }\n\n async unarchiveWorkflow(wid: string, id: number): Promise<{ status: string }> {\n return this.fetch(`w/${wid}/workflows/${id}/unarchive`, {\n method: 'POST',\n });\n }\n\n async cloneWorkflow(wid: string, id: number, data: { name: string }): Promise<Workflow> {\n return this.fetch<Workflow>(`w/${wid}/workflows/${id}/clone`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n async getWorkflowTemplates(wid: string): Promise<WorkflowTemplate[]> {\n return this.fetch<WorkflowTemplate[]>(`w/${wid}/workflows/templates`);\n }\n\n async createWorkflowFromTemplate(\n wid: string,\n templateUuid: string,\n data: CreateWorkflowFromTemplateFormData\n ): Promise<Workflow> {\n return this.fetch<Workflow>(`w/${wid}/workflows/templates/${templateUuid}/create-workflow`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n async getWorkflowTaskAssignmentStats(\n wid: string,\n id: number,\n fromDate?: string,\n toDate?: string\n ): Promise<Record<number, TaskAssignmentStats>> {\n const params = new URLSearchParams();\n if (fromDate) params.append('from_date', fromDate);\n if (toDate) params.append('to_date', toDate);\n\n return this.fetch<Record<number, TaskAssignmentStats>>(\n `w/${wid}/workflows/${id}/task-assignment-stats?${params.toString()}`\n );\n }\n\n async getTaskChats(\n wid: string,\n workflowId: number,\n taskId: number,\n fromDate?: string,\n toDate?: string,\n limit: number = 100,\n offset: number = 0\n ): Promise<TaskChatsListResponse> {\n const params = new URLSearchParams();\n if (fromDate) params.append('from_date', fromDate);\n if (toDate) params.append('to_date', toDate);\n params.append('limit', limit.toString());\n params.append('offset', offset.toString());\n\n return this.fetch<TaskChatsListResponse>(\n `w/${wid}/workflows/${workflowId}/tasks/${taskId}/chats?${params.toString()}`\n );\n }\n\n // Workflow Contributors API\n async getWorkflowContributors(wid: string, workflowId: number): Promise<WorkflowContributor[]> {\n return this.fetch<WorkflowContributor[]>(`w/${wid}/workflows/${workflowId}/contributors`);\n }\n\n async createWorkflowContributor(\n wid: string,\n workflowId: number,\n data: CreateWorkflowContributorRequest\n ): Promise<WorkflowContributor> {\n return this.fetch<WorkflowContributor>(`w/${wid}/workflows/${workflowId}/contributors`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n async updateWorkflowContributor(\n wid: string,\n workflowId: number,\n contributorId: number,\n data: UpdateWorkflowContributorRequest\n ): Promise<WorkflowContributor> {\n return this.fetch<WorkflowContributor>(\n `w/${wid}/workflows/${workflowId}/contributors/${contributorId}`,\n {\n method: 'PATCH',\n body: JSON.stringify(data),\n }\n );\n }\n\n async deleteWorkflowContributor(\n wid: string,\n workflowId: number,\n contributorId: number\n ): Promise<{ success: boolean }> {\n return this.fetch<{ success: boolean }>(\n `w/${wid}/workflows/${workflowId}/contributors/${contributorId}`,\n {\n method: 'DELETE',\n }\n );\n }\n\n // Workspace Builders API\n\n /**\n * Get list of available workspace builders.\n */\n async getWorkspaceBuilders(wid: string): Promise<WorkspaceBuilderInfo[]> {\n const response = await this.fetch<{ builders: WorkspaceBuilderInfo[] }>(`w/${wid}/builders`);\n return response.builders;\n }\n\n /**\n * Get information about a specific workspace builder.\n */\n async getWorkspaceBuilder(wid: string, builderId: string): Promise<WorkspaceBuilderInfo> {\n return this.fetch<WorkspaceBuilderInfo>(`w/${wid}/builders/${builderId}`);\n }\n\n /**\n * Build and import a workflow from a builder template in one step.\n * Returns the created workflow ID and UUID.\n */\n async buildWorkspace(\n wid: string,\n builderId: string,\n params: Record<string, unknown>\n ): Promise<BuildWorkspaceResponse> {\n return this.fetch<BuildWorkspaceResponse>(`w/${wid}/builders/build`, {\n method: 'POST',\n body: JSON.stringify({ builderId, params }),\n });\n }\n\n /**\n * Validate if a workflow name is available.\n * Returns availability and a suggested alternative if taken.\n */\n async validateWorkflowName(wid: string, name: string): Promise<ValidateWorkflowNameResponse> {\n return this.fetch<ValidateWorkflowNameResponse>(`w/${wid}/builders/validate-name`, {\n method: 'POST',\n body: JSON.stringify({ name }),\n });\n }\n}\n","import {\n Invitation,\n InvitationListResponse,\n InvitationStatus,\n ListInvitationsParams,\n UpdateInvitationFormData,\n} from '../types';\nimport { BaseApiClient } from './base';\n\nexport class WorkspaceInvitationsApi extends BaseApiClient {\n /**\n * List user's own invitations (both org and workspace).\n * For admin listing of a specific workspace's invitations, use listWorkspaceInvitationsAdmin.\n */\n async listWorkspaceInvitations(params?: ListInvitationsParams): Promise<InvitationListResponse> {\n const queryParams = new URLSearchParams();\n\n if (params?.status) queryParams.append('status', params.status);\n if (params?.page) queryParams.append('page', params.page.toString());\n if (params?.pageSize) queryParams.append('page_size', params.pageSize.toString());\n\n const queryString = queryParams.toString();\n const url = `invitations${queryString ? `?${queryString}` : ''}`;\n\n return this.fetch<InvitationListResponse>(url);\n }\n\n async getWorkspaceInvitation(requestId: number): Promise<Invitation> {\n return this.fetch<Invitation>(`invitations/${requestId}`);\n }\n\n async deleteWorkspaceInvitation(requestId: number): Promise<{ message: string }> {\n return this.fetch<{ message: string }>(`invitations/${requestId}`, {\n method: 'DELETE',\n });\n }\n\n /**\n * Request membership to a public workspace.\n * Creates a membership request that workspace admins can approve or deny.\n */\n async requestWorkspaceMembership(workspaceUuid: string, message?: string): Promise<Invitation> {\n return this.fetch<Invitation>(`invitations/workspaces/${workspaceUuid}/request-membership`, {\n method: 'POST',\n body: JSON.stringify({ message }),\n });\n }\n\n // ============================================\n // Workspace-scoped admin methods\n // These require the user to be a workspace member with admin permissions\n // ============================================\n\n /**\n * List invitations for a specific workspace (requires workspace admin permission).\n * Uses the workspace-scoped route: /api/v2/w/{workspaceUuid}/invitations\n */\n async listWorkspaceInvitationsAdmin(\n workspaceUuid: string,\n params?: {\n accountId?: number;\n status?: InvitationStatus;\n page?: number;\n pageSize?: number;\n }\n ): Promise<InvitationListResponse> {\n const queryParams = new URLSearchParams();\n if (params?.accountId) queryParams.append('accountId', params.accountId.toString());\n if (params?.status) queryParams.append('status', params.status);\n if (params?.page) queryParams.append('page', params.page.toString());\n if (params?.pageSize) queryParams.append('page_size', params.pageSize.toString());\n\n const queryString = queryParams.toString();\n const url = `w/${workspaceUuid}/invitations${queryString ? `?${queryString}` : ''}`;\n\n return this.fetch<InvitationListResponse>(url);\n }\n\n /**\n * Invite someone to a workspace (requires workspace admin permission).\n * Uses the workspace-scoped route: POST /api/v2/w/{workspaceUuid}/invitations\n */\n async inviteToWorkspace(\n workspaceUuid: string,\n emailOrAccountId: number | string,\n message?: string,\n memberRoleId?: number,\n name?: string\n ): Promise<Invitation> {\n const body: Record<string, unknown> = {\n message,\n memberRoleId,\n name,\n };\n\n // Check if it's an email (string) or accountId (number)\n if (typeof emailOrAccountId === 'string') {\n body.email = emailOrAccountId;\n } else {\n body.accountId = emailOrAccountId;\n }\n\n return this.fetch<Invitation>(`w/${workspaceUuid}/invitations`, {\n method: 'POST',\n body: JSON.stringify(body),\n });\n }\n\n /**\n * Update an invitation status (requires workspace admin permission).\n * Uses the workspace-scoped route: PUT /api/v2/w/{workspaceUuid}/invitations/{id}\n */\n async updateWorkspaceInvitationAdmin(\n workspaceUuid: string,\n invitationId: number,\n data: UpdateInvitationFormData\n ): Promise<Invitation> {\n return this.fetch<Invitation>(`w/${workspaceUuid}/invitations/${invitationId}`, {\n method: 'PUT',\n body: JSON.stringify(data),\n });\n }\n\n /**\n * Delete an invitation (requires workspace admin permission).\n * Uses the workspace-scoped route: DELETE /api/v2/w/{workspaceUuid}/invitations/{id}\n */\n async deleteWorkspaceInvitationAdmin(\n workspaceUuid: string,\n invitationId: number\n ): Promise<{ message: string }> {\n return this.fetch<{ message: string }>(`w/${workspaceUuid}/invitations/${invitationId}`, {\n method: 'DELETE',\n });\n }\n\n /**\n * Approve an invitation (grant access) - requires workspace admin permission.\n */\n async approveWorkspaceInvitation(\n workspaceUuid: string,\n invitationId: number\n ): Promise<Invitation> {\n return this.updateWorkspaceInvitationAdmin(workspaceUuid, invitationId, {\n status: InvitationStatus.GRANTED,\n });\n }\n\n /**\n * Deny an invitation - requires workspace admin permission.\n */\n async denyWorkspaceInvitation(workspaceUuid: string, invitationId: number): Promise<Invitation> {\n return this.updateWorkspaceInvitationAdmin(workspaceUuid, invitationId, {\n status: InvitationStatus.DENIED,\n });\n }\n\n /**\n * Block an invitation - requires workspace admin permission.\n */\n async blockWorkspaceInvitation(\n workspaceUuid: string,\n invitationId: number\n ): Promise<Invitation> {\n return this.updateWorkspaceInvitationAdmin(workspaceUuid, invitationId, {\n status: InvitationStatus.BLOCKED,\n });\n }\n\n /**\n * Accept an invitation by ID (for invitees accepting their own invitations)\n * Works for both organization and workspace invitations.\n */\n async acceptInvitation(requestId: number): Promise<Invitation> {\n return this.fetch<Invitation>(`invitations/${requestId}/accept`, {\n method: 'POST',\n });\n }\n\n /**\n * Decline an invitation by ID (for invitees declining their own invitations)\n * Works for both organization and workspace invitations.\n */\n async declineInvitation(requestId: number): Promise<Invitation> {\n return this.fetch<Invitation>(`invitations/${requestId}/decline`, {\n method: 'POST',\n });\n }\n}\n","import {\n BillingDashboardResponse,\n ClientWorkspace,\n NoticesResponse,\n Notification,\n PaginatedResponse,\n Product,\n PublicWorkspace,\n SyncUsageRequest,\n SyncUsageResponse,\n ThemesListResponse,\n Workspace,\n WorkspaceCounts,\n WorkspaceDefaults,\n WorkspaceDefaultsFormData,\n WorkspaceFeatureInfo,\n WorkspaceFormData,\n} from '../types';\nimport {\n WorkspaceAutoMapEntities,\n WorkspaceCreateNewEntities,\n WorkspaceExportData,\n WorkspaceImportMapping,\n WorkspaceImportPreviewResponse,\n} from '../types_workspace_transfer';\nimport { BaseApiClient } from './base';\n\n/**\n * Workspace-grantable scope metadata.\n * These are scopes that can be assigned to member roles.\n */\nexport interface WorkspaceScope {\n name: string;\n category: string;\n description: string;\n implies: string[];\n dangerous: boolean;\n}\n\n/**\n * Response containing all workspace-grantable scopes.\n */\nexport interface WorkspaceScopesResponse {\n scopes: WorkspaceScope[];\n categories: string[];\n}\n\nexport class WorkspacesApi extends BaseApiClient {\n async getWorkspaces(): Promise<Workspace[]> {\n return this.fetch<Workspace[]>('w/');\n }\n\n async getPublicWorkspaces(): Promise<PublicWorkspace[]> {\n return this.fetch<PublicWorkspace[]>('w/public');\n }\n\n async getWorkspace(wid: string): Promise<Workspace> {\n return this.fetch<Workspace>(`w/${wid}`);\n }\n\n async createWorkspace(workspace: WorkspaceFormData): Promise<Workspace> {\n return this.fetch<Workspace>('w/', {\n method: 'POST',\n body: JSON.stringify(workspace),\n });\n }\n\n async updateWorkspace(wid: string, workspace: Partial<WorkspaceFormData>): Promise<Workspace> {\n return this.fetch<Workspace>(`w/${wid}`, {\n method: 'PUT',\n body: JSON.stringify(workspace),\n });\n }\n\n async deleteWorkspace(wid: string): Promise<void> {\n return this.fetch(`w/${wid}`, {\n method: 'DELETE',\n });\n }\n\n async leaveWorkspace(wid: string): Promise<{ message: string }> {\n return this.fetch<{ message: string }>(`w/${wid}/me`, {\n method: 'DELETE',\n });\n }\n\n async getWorkspaceDefaults(wid: string): Promise<WorkspaceDefaults> {\n return this.fetch<WorkspaceDefaults>(`w/${wid}/defaults`);\n }\n\n async updateWorkspaceDefaults(\n wid: string,\n defaults: WorkspaceDefaultsFormData\n ): Promise<WorkspaceDefaults> {\n return this.fetch<WorkspaceDefaults>(`w/${wid}/defaults`, {\n method: 'PUT',\n body: JSON.stringify(defaults),\n });\n }\n\n async getWorkspaceCounts(wid: string): Promise<WorkspaceCounts> {\n return this.fetch<WorkspaceCounts>(`w/${wid}/counts`);\n }\n\n async getBusinessHoursStatus(wid: string): Promise<{ isBusinessHours: boolean }> {\n return this.fetch<{ isBusinessHours: boolean }>(`w/${wid}/business-hours-status`);\n }\n\n async getAvailableWorkspaceFeatures(): Promise<WorkspaceFeatureInfo[]> {\n const result = await this.fetch<{ features: WorkspaceFeatureInfo[] }>(`features/registry`);\n return result.features;\n }\n\n async getWorkspaceNotices(wid: string): Promise<NoticesResponse> {\n return this.fetch<NoticesResponse>(`w/${wid}/notices`);\n }\n\n async getNotifications(\n wid: string,\n options: {\n page?: number;\n pageSize?: number;\n } = {}\n ): Promise<PaginatedResponse<Notification>> {\n const params = new URLSearchParams();\n if (options.page) params.append('page', options.page.toString());\n if (options.pageSize) params.append('pageSize', options.pageSize.toString());\n\n const queryString = params.toString();\n const url = `w/${wid}/notifications${queryString ? `?${queryString}` : ''}`;\n\n return this.fetch<PaginatedResponse<Notification>>(url);\n }\n\n async getNotification(wid: string, id: number): Promise<Notification> {\n return this.fetch<Notification>(`w/${wid}/notifications/${id}`);\n }\n\n async getUnreadNotificationCount(wid: string): Promise<number> {\n return this.fetch<number>(`w/${wid}/notifications/unread-count`);\n }\n\n async markNotificationAsRead(wid: string, id: number): Promise<Notification> {\n return this.fetch<Notification>(`w/${wid}/notifications/${id}/read`, {\n method: 'POST',\n });\n }\n\n async dismissNotification(wid: string, id: number): Promise<Notification> {\n return this.fetch<Notification>(`w/${wid}/notifications/${id}/dismiss`, {\n method: 'POST',\n });\n }\n\n async dismissAllNotifications(wid: string): Promise<{ dismissedCount: number }> {\n return this.fetch<{ dismissedCount: number }>(`w/${wid}/notifications/dismiss-all`, {\n method: 'POST',\n });\n }\n\n // ===== Push Notifications =====\n\n async getVapidPublicKey(): Promise<string | null> {\n const response = await this.fetch<{ publicKey: string | null }>('push/vapid-public-key');\n return response.publicKey;\n }\n\n async registerPushSubscription(\n wid: string,\n subscription: { endpoint: string; p256dhKey: string; authKey: string; userAgent?: string }\n ): Promise<{ id: number; endpoint: string; createdAt: string }> {\n return this.fetch<{ id: number; endpoint: string; createdAt: string }>(\n `w/${wid}/push-subscriptions`,\n {\n method: 'POST',\n body: JSON.stringify(subscription),\n }\n );\n }\n\n async unregisterPushSubscription(wid: string, endpoint: string): Promise<{ deleted: boolean }> {\n return this.fetch<{ deleted: boolean }>(\n `w/${wid}/push-subscriptions?endpoint=${encodeURIComponent(endpoint)}`,\n {\n method: 'DELETE',\n }\n );\n }\n\n async listPushSubscriptions(\n wid: string\n ): Promise<{ id: number; endpoint: string; createdAt: string; userAgent: string | null }[]> {\n return this.fetch<\n { id: number; endpoint: string; createdAt: string; userAgent: string | null }[]\n >(`w/${wid}/push-subscriptions`);\n }\n\n async getResellerWorkspaces(wid: string): Promise<ClientWorkspace[]> {\n return this.fetch<ClientWorkspace[]>(`w/${wid}/reseller/workspaces`);\n }\n\n async createClientWorkspace(\n wid: string,\n data: { name: string; slug?: string }\n ): Promise<ClientWorkspace> {\n return this.fetch<ClientWorkspace>(`w/${wid}/reseller/workspaces`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n async getClientWorkspace(wid: string, workspaceId: number): Promise<ClientWorkspace> {\n return this.fetch<ClientWorkspace>(`w/${wid}/reseller/workspaces/${workspaceId}`);\n }\n\n async updateClientWorkspace(\n wid: string,\n workspaceId: number,\n data: { name?: string; slug?: string }\n ): Promise<ClientWorkspace> {\n return this.fetch<ClientWorkspace>(`w/${wid}/reseller/workspaces/${workspaceId}`, {\n method: 'PUT',\n body: JSON.stringify(data),\n });\n }\n\n async deleteClientWorkspace(wid: string, workspaceId: number): Promise<{ message: string }> {\n return this.fetch<{ message: string }>(`w/${wid}/reseller/workspaces/${workspaceId}`, {\n method: 'DELETE',\n });\n }\n\n async provisionClientWorkspace(\n wid: string,\n workspaceId: number\n ): Promise<{ message: string; status: string }> {\n return this.fetch<{ message: string; status: string }>(\n `w/${wid}/reseller/workspaces/${workspaceId}/provision`,\n {\n method: 'POST',\n }\n );\n }\n\n async getProducts(wid: string, featured?: boolean): Promise<Product[]> {\n const params = featured !== undefined ? `?featured=${featured}` : '';\n return this.fetch<Product[]>(`w/${wid}/reseller/products${params}`);\n }\n\n async getProduct(id: number): Promise<Product> {\n // Use global endpoint - access control is handled server-side based on\n // public flag, superuser status, or subscription membership\n return this.fetch<Product>(`products/${id}`);\n }\n\n async getPublicProduct(id: number): Promise<Product> {\n return this.fetch<Product>(`products/${id}`);\n }\n\n async createProduct(wid: string, product: any): Promise<Product> {\n return this.fetch<Product>(`w/${wid}/reseller/products`, {\n method: 'POST',\n body: JSON.stringify(product),\n });\n }\n\n async updateProduct(wid: string, id: number, updates: any): Promise<Product> {\n return this.fetch<Product>(`w/${wid}/reseller/products/${id}`, {\n method: 'PUT',\n body: JSON.stringify(updates),\n });\n }\n\n async deleteProduct(wid: string, id: number): Promise<{ message: string }> {\n return this.fetch<{ message: string }>(`w/${wid}/reseller/products/${id}`, {\n method: 'DELETE',\n });\n }\n\n // Workspace Secret Key\n async resetWorkspaceSecretKey(wid: string): Promise<{ secret: string }> {\n return this.fetch<{ secret: string }>(`w/${wid}/defaults/reset-secret-key`, {\n method: 'POST',\n });\n }\n\n // Workspace Export/Import API\n async exportWorkspace(wid: string, workflowId?: number): Promise<WorkspaceExportData> {\n const params = workflowId ? `?workflow_id=${workflowId}` : '';\n return this.fetch<WorkspaceExportData>(`w/${wid}/export${params}`);\n }\n\n async previewWorkspaceImport(\n wid: string,\n exportData: WorkspaceExportData,\n importMappings: WorkspaceImportMapping,\n createNew: WorkspaceCreateNewEntities,\n autoMap?: WorkspaceAutoMapEntities\n ): Promise<WorkspaceImportPreviewResponse> {\n return this.fetch<WorkspaceImportPreviewResponse>(`w/${wid}/preview-import`, {\n method: 'POST',\n body: JSON.stringify({\n exportData,\n importMappings,\n createNew,\n autoMap,\n }),\n });\n }\n\n async importWorkspace(\n wid: string,\n exportData: WorkspaceExportData,\n importMappings: WorkspaceImportMapping,\n createNew: WorkspaceCreateNewEntities\n ): Promise<WorkspaceImportPreviewResponse> {\n return this.fetch<WorkspaceImportPreviewResponse>(`w/${wid}/import`, {\n method: 'POST',\n body: JSON.stringify({\n exportData,\n importMappings,\n createNew,\n }),\n });\n }\n\n // Legacy method for backward compatibility\n async previewImportWorkspace(\n wid: string,\n exportData: any,\n importMappings: any = {},\n createNew: any = {}\n ): Promise<any> {\n return this.fetch<any>(`w/${wid}/preview-import`, {\n method: 'POST',\n body: JSON.stringify({\n exportData,\n importMappings,\n createNew,\n }),\n });\n }\n\n async getWorkspaceThemes(wid: string): Promise<ThemesListResponse> {\n return this.fetch<ThemesListResponse>(`w/${wid}/themes`);\n }\n\n async updateWorkspaceThemes(wid: string, themes: string[]): Promise<Workspace> {\n return this.fetch<Workspace>(`w/${wid}/themes`, {\n method: 'PUT',\n body: JSON.stringify({ themes }),\n });\n }\n\n /**\n * Get all workspace-grantable scopes that can be assigned to member roles.\n *\n * Returns the full metadata for all scopes including name, category,\n * description, implied scopes, and whether it's a dangerous scope.\n *\n * Note: This does NOT include organization-level scopes (org:read, org:write, org:admin).\n * Org-level permissions come from OrgMember roles, not workspace member roles.\n */\n async getWorkspaceScopes(): Promise<WorkspaceScopesResponse> {\n return this.fetch<WorkspaceScopesResponse>('w/scopes');\n }\n\n /**\n * Get billing dashboard data for a workspace.\n *\n * This endpoint is available to organization owners (with org:billing scope).\n * Superusers should use the admin endpoint via getWorkspaceBillingDashboard.\n *\n * Returns comprehensive billing information including:\n * - Subscription status and plan details\n * - Current period usage metrics\n * - Overage configurations and amounts\n * - Budget tracking status\n */\n async getBillingDashboard(wid: string): Promise<BillingDashboardResponse> {\n return this.fetch<BillingDashboardResponse>(`w/${wid}/billing/dashboard`);\n }\n\n /**\n * Sync workspace usage to Stripe.\n *\n * Note: This is only available via the admin endpoint for superusers.\n * Org owners cannot sync usage - they can only view the billing dashboard.\n */\n async syncUsageToStripe(wid: string, request?: SyncUsageRequest): Promise<SyncUsageResponse> {\n // This still uses the admin endpoint since only superusers can sync\n return this.fetch<SyncUsageResponse>(`admin/workspaces/${wid}/usage/sync`, {\n method: 'POST',\n body: JSON.stringify(request || {}),\n });\n }\n}\n","/**\n * App context types - shared between client and server\n *\n * These types represent the current state of the user's interaction with the app,\n * providing context to AI assistants about what the user is viewing/editing.\n */\n\n/**\n * Information about a site in the context\n */\nexport interface SiteContext {\n id: number;\n name?: string;\n slug?: string;\n}\n\n/**\n * Information about a page in the context\n */\nexport interface PageContext {\n id: number;\n name?: string;\n slug?: string;\n}\n\n/**\n * Information about a workflow in the context\n */\nexport interface WorkflowContext {\n id: number;\n name?: string;\n selectedTask?: TaskContext;\n}\n\n/**\n * Information about a task in the context\n */\nexport interface TaskContext {\n id: number;\n name?: string;\n}\n\n/**\n * Information about a data record in the context\n */\nexport interface DataRecordContext {\n id: number;\n type?: string;\n name?: string;\n}\n\n/**\n * Information about a toolkit in the context\n */\nexport interface ToolkitContext {\n id: string;\n name?: string;\n}\n\n/**\n * App context provided to AI assistants\n *\n * This represents the current page/state the user is in,\n * allowing the AI to provide context-aware assistance.\n */\nexport interface AppContext {\n /** Current page URI (e.g., 'app:page:workflows/123') */\n appUri?: string;\n\n /** Current browser URL for linking back to this page */\n pageUrl?: string;\n\n /** Auto-approve all tool calls without HITL interruption */\n autoApprove?: boolean;\n\n /** Additional structured page state */\n pageState?: {\n /** Route parameters from Next.js */\n routeParams?: Record<string, string | string[]>;\n\n /** Site being viewed/edited */\n site?: SiteContext;\n\n /** Page being viewed/edited */\n page?: PageContext;\n\n /** Workflow being viewed/edited */\n workflow?: WorkflowContext;\n\n /** Data record being viewed/edited */\n dataRecord?: DataRecordContext;\n\n /** Toolkit being viewed */\n toolkit?: ToolkitContext;\n\n /** Open drawers/modals */\n openDrawers?: string[];\n\n /** Selected tabs */\n selectedTabs?: string[];\n\n /** Any other page-specific state */\n [key: string]: any;\n };\n}\n\n/**\n * Format app context as markdown for display in bug reports, etc.\n */\nexport function formatAppContextAsMarkdown(context: AppContext | undefined): string {\n if (!context) {\n return '';\n }\n\n const lines: string[] = [];\n\n // Add page URL as clickable link if available\n if (context.pageUrl) {\n lines.push(`**Page**: [View in App](${context.pageUrl})`);\n } else if (context.appUri) {\n // Fallback to app URI if no pageUrl available\n lines.push(`**Page**: \\`${context.appUri}\\``);\n }\n\n // Add structured context\n if (context.pageState) {\n const { site, page, workflow, dataRecord, toolkit } = context.pageState;\n\n // Site info\n if (site) {\n const siteName = site.name || site.slug;\n lines.push(\n siteName ? `**Site**: ${siteName} (ID: \\`${site.id}\\`)` : `**Site ID**: \\`${site.id}\\``\n );\n }\n\n // Page info\n if (page) {\n const pageName = page.name || page.slug;\n lines.push(\n pageName ? `**Page**: ${pageName} (ID: \\`${page.id}\\`)` : `**Page ID**: \\`${page.id}\\``\n );\n }\n\n // Workflow info\n if (workflow) {\n const workflowName = workflow.name;\n lines.push(\n workflowName\n ? `**Workflow**: ${workflowName} (ID: \\`${workflow.id}\\`)`\n : `**Workflow ID**: \\`${workflow.id}\\``\n );\n\n // Selected task\n if (workflow.selectedTask) {\n const taskName = workflow.selectedTask.name;\n lines.push(\n taskName\n ? `**Selected Task**: ${taskName} (ID: \\`${workflow.selectedTask.id}\\`)`\n : `**Selected Task ID**: \\`${workflow.selectedTask.id}\\``\n );\n }\n }\n\n // Data record info\n if (dataRecord) {\n const recordName = dataRecord.name || dataRecord.type;\n lines.push(\n recordName\n ? `**Data Record**: ${recordName} (ID: \\`${dataRecord.id}\\`)`\n : `**Data Record ID**: \\`${dataRecord.id}\\``\n );\n }\n\n // Toolkit info\n if (toolkit) {\n lines.push(\n toolkit.name\n ? `**Toolkit**: ${toolkit.name} (ID: \\`${toolkit.id}\\`)`\n : `**Toolkit ID**: \\`${toolkit.id}\\``\n );\n }\n\n // Open drawers\n if (context.pageState.openDrawers && context.pageState.openDrawers.length > 0) {\n lines.push(`**Open Drawers**: ${context.pageState.openDrawers.join(', ')}`);\n }\n\n // Selected tabs\n if (context.pageState.selectedTabs && context.pageState.selectedTabs.length > 0) {\n lines.push(`**Selected Tabs**: ${context.pageState.selectedTabs.join(', ')}`);\n }\n }\n\n if (lines.length === 0) {\n return '';\n }\n\n return `### Context\\n\\n${lines.join('\\n')}`;\n}\n","import { BaseApiClient } from './base';\nimport type { WorkflowNote, WorkflowNoteFormData } from '../types/taskTypes';\n\nexport class WorkflowNotesApi extends BaseApiClient {\n async getWorkflowNotes(wid: string, workflowId: number): Promise<WorkflowNote[]> {\n return this.fetch<WorkflowNote[]>(`w/${wid}/workflow-notes?workflow_id=${workflowId}`);\n }\n\n async getWorkflowNote(wid: string, id: number): Promise<WorkflowNote> {\n return this.fetch<WorkflowNote>(`w/${wid}/workflow-notes/${id}`);\n }\n\n async createWorkflowNote(wid: string, note: WorkflowNoteFormData): Promise<WorkflowNote> {\n return this.fetch<WorkflowNote>(`w/${wid}/workflow-notes`, {\n method: 'POST',\n body: JSON.stringify(note),\n });\n }\n\n async updateWorkflowNote(\n wid: string,\n id: number,\n note: Partial<WorkflowNoteFormData>\n ): Promise<WorkflowNote> {\n return this.fetch<WorkflowNote>(`w/${wid}/workflow-notes/${id}`, {\n method: 'PUT',\n body: JSON.stringify(note),\n });\n }\n\n async deleteWorkflowNote(wid: string, id: number): Promise<void> {\n return this.fetch<void>(`w/${wid}/workflow-notes/${id}`, {\n method: 'DELETE',\n });\n }\n}\n","import {\n AbilitiesApi,\n AccessGrantsApi,\n AdminApi,\n AgentsApi,\n AIModelsApi,\n ApiKeysApi,\n AppsApi,\n AssignmentsApi,\n AssistantsApi,\n AuthApi,\n BuildersApi,\n CalendarsApi,\n CallsApi,\n CELApi,\n ChatsApi,\n CustomToolkitsApi,\n DataTypesApi,\n DiscordBotsApi,\n SlackAppsApi,\n EventsApi,\n FeaturesApi,\n FhirConnectionsApi,\n FilesApi,\n InboxesApi,\n InquiriesApi,\n AppConnectionsApi,\n McpServersApi,\n MembersApi,\n MilestonesApi,\n MondayIntegrationApi,\n NotificationRulesApi,\n OAuthApi,\n OperatorApi,\n OAuthConnectionsApi,\n PhoneNumbersApi,\n PronunciationsApi,\n QualificationsApi,\n ReportsApi,\n SitesApi,\n SubscriptionsApi,\n SupervisorsApi,\n TasksApi,\n TemplatesApi,\n ToolkitsApi,\n WorkflowsApi,\n WorkspaceInvitationsApi,\n WorkspacesApi,\n} from '../api';\nimport { WorkflowNotesApi } from '../api/workflow-notes';\n\nexport interface ApiModules {\n abilities: AbilitiesApi;\n accessGrants: AccessGrantsApi;\n admin: AdminApi;\n agents: AgentsApi;\n aiModels: AIModelsApi;\n apiKeys: ApiKeysApi;\n apps: AppsApi;\n assignments: AssignmentsApi;\n assistants: AssistantsApi;\n auth: AuthApi;\n builders: BuildersApi;\n calendars: CalendarsApi;\n calls: CallsApi;\n cel: CELApi;\n chats: ChatsApi;\n customToolkits: CustomToolkitsApi;\n dataTypes: DataTypesApi;\n discordBots: DiscordBotsApi;\n slackApps: SlackAppsApi;\n events: EventsApi;\n fhirConnections: FhirConnectionsApi;\n features: FeaturesApi;\n files: FilesApi;\n inboxes: InboxesApi;\n inquiries: InquiriesApi;\n appConnections: AppConnectionsApi;\n mcpServers: McpServersApi;\n members: MembersApi;\n milestones: MilestonesApi;\n mondayIntegration: MondayIntegrationApi;\n notificationRules: NotificationRulesApi;\n oauth: OAuthApi;\n operatorGroups: OperatorApi;\n oauthConnections: OAuthConnectionsApi;\n phoneNumbers: PhoneNumbersApi;\n pronunciations: PronunciationsApi;\n qualifications: QualificationsApi;\n reports: ReportsApi;\n sites: SitesApi;\n subscriptions: SubscriptionsApi;\n supervisors: SupervisorsApi;\n tasks: TasksApi;\n templates: TemplatesApi;\n toolkits: ToolkitsApi;\n workflows: WorkflowsApi;\n workflowNotes: WorkflowNotesApi;\n workspaceInvitations: WorkspaceInvitationsApi;\n workspaces: WorkspacesApi;\n}\n\nexport function createApiModules(\n apiKey: string | undefined,\n baseUrl: string,\n customFetch?: typeof fetch\n): ApiModules {\n return {\n abilities: new AbilitiesApi(apiKey, baseUrl, customFetch),\n accessGrants: new AccessGrantsApi(apiKey, baseUrl, customFetch),\n admin: new AdminApi(apiKey, baseUrl, customFetch),\n agents: new AgentsApi(apiKey, baseUrl, customFetch),\n aiModels: new AIModelsApi(apiKey, baseUrl, customFetch),\n apiKeys: new ApiKeysApi(apiKey, baseUrl, customFetch),\n apps: new AppsApi(apiKey, baseUrl, customFetch),\n assignments: new AssignmentsApi(apiKey, baseUrl, customFetch),\n assistants: new AssistantsApi(apiKey, baseUrl, customFetch),\n auth: new AuthApi(apiKey, baseUrl, customFetch),\n builders: new BuildersApi(apiKey, baseUrl, customFetch),\n calendars: new CalendarsApi(apiKey, baseUrl, customFetch),\n calls: new CallsApi(apiKey, baseUrl, customFetch),\n cel: new CELApi(apiKey, baseUrl, customFetch),\n chats: new ChatsApi(apiKey, baseUrl, customFetch),\n customToolkits: new CustomToolkitsApi(apiKey, baseUrl, customFetch),\n dataTypes: new DataTypesApi(apiKey, baseUrl, customFetch),\n discordBots: new DiscordBotsApi(apiKey, baseUrl, customFetch),\n slackApps: new SlackAppsApi(apiKey, baseUrl, customFetch),\n events: new EventsApi(apiKey, baseUrl, customFetch),\n fhirConnections: new FhirConnectionsApi(apiKey, baseUrl, customFetch),\n features: new FeaturesApi(apiKey, baseUrl, customFetch),\n files: new FilesApi(apiKey, baseUrl, customFetch),\n inboxes: new InboxesApi(apiKey, baseUrl, customFetch),\n inquiries: new InquiriesApi(apiKey, baseUrl, customFetch),\n appConnections: new AppConnectionsApi(apiKey, baseUrl, customFetch),\n mcpServers: new McpServersApi(apiKey, baseUrl, customFetch),\n members: new MembersApi(apiKey, baseUrl, customFetch),\n milestones: new MilestonesApi(apiKey, baseUrl, customFetch),\n mondayIntegration: new MondayIntegrationApi(apiKey, baseUrl, customFetch),\n notificationRules: new NotificationRulesApi(apiKey, baseUrl, customFetch),\n oauth: new OAuthApi(apiKey, baseUrl, customFetch),\n operatorGroups: new OperatorApi(apiKey, baseUrl, customFetch),\n oauthConnections: new OAuthConnectionsApi(apiKey, baseUrl, customFetch),\n phoneNumbers: new PhoneNumbersApi(apiKey, baseUrl, customFetch),\n pronunciations: new PronunciationsApi(apiKey, baseUrl, customFetch),\n qualifications: new QualificationsApi(apiKey, baseUrl, customFetch),\n reports: new ReportsApi(apiKey, baseUrl, customFetch),\n sites: new SitesApi(apiKey, baseUrl, customFetch),\n subscriptions: new SubscriptionsApi(apiKey, baseUrl, customFetch),\n supervisors: new SupervisorsApi(apiKey, baseUrl, customFetch),\n tasks: new TasksApi(apiKey, baseUrl, customFetch),\n templates: new TemplatesApi(apiKey, baseUrl, customFetch),\n toolkits: new ToolkitsApi(apiKey, baseUrl, customFetch),\n workflows: new WorkflowsApi(apiKey, baseUrl, customFetch),\n workflowNotes: new WorkflowNotesApi(apiKey, baseUrl, customFetch),\n workspaceInvitations: new WorkspaceInvitationsApi(apiKey, baseUrl, customFetch),\n workspaces: new WorkspacesApi(apiKey, baseUrl, customFetch),\n };\n}\n","import { AccessGrantsApi } from '../../api';\n\nexport interface AccessGrantsBindings {\n getMyReceivedGrants: AccessGrantsApi['getMyReceivedGrants'];\n getMyGivenGrants: AccessGrantsApi['getMyGivenGrants'];\n getAccessGrant: AccessGrantsApi['getAccessGrant'];\n createAccessGrant: AccessGrantsApi['createAccessGrant'];\n resolveAccessGrant: AccessGrantsApi['resolveAccessGrant'];\n revokeAccessGrant: AccessGrantsApi['revokeAccessGrant'];\n getAccessGrants: AccessGrantsApi['getAccessGrants'];\n getMemberGrants: AccessGrantsApi['getMemberGrants'];\n}\n\nexport function bindAccessGrantsMethods(\n target: AccessGrantsBindings,\n accessGrants: AccessGrantsApi\n): void {\n target.getMyReceivedGrants = accessGrants.getMyReceivedGrants.bind(accessGrants);\n target.getMyGivenGrants = accessGrants.getMyGivenGrants.bind(accessGrants);\n target.getAccessGrant = accessGrants.getAccessGrant.bind(accessGrants);\n target.createAccessGrant = accessGrants.createAccessGrant.bind(accessGrants);\n target.resolveAccessGrant = accessGrants.resolveAccessGrant.bind(accessGrants);\n target.revokeAccessGrant = accessGrants.revokeAccessGrant.bind(accessGrants);\n target.getAccessGrants = accessGrants.getAccessGrants.bind(accessGrants);\n target.getMemberGrants = accessGrants.getMemberGrants.bind(accessGrants);\n}\n","import { AgentsApi } from '../../api';\n\nexport interface AgentsBindings {\n getAgents: AgentsApi['getAgents'];\n getAgent: AgentsApi['getAgent'];\n createAgent: AgentsApi['createAgent'];\n updateAgent: AgentsApi['updateAgent'];\n deleteAgent: AgentsApi['deleteAgent'];\n archiveAgent: AgentsApi['archiveAgent'];\n unarchiveAgent: AgentsApi['unarchiveAgent'];\n}\n\nexport function bindAgentsMethods(target: AgentsBindings, agents: AgentsApi): void {\n target.getAgents = agents.getAgents.bind(agents);\n target.getAgent = agents.getAgent.bind(agents);\n target.createAgent = agents.createAgent.bind(agents);\n target.updateAgent = agents.updateAgent.bind(agents);\n target.deleteAgent = agents.deleteAgent.bind(agents);\n target.archiveAgent = agents.archiveAgent.bind(agents);\n target.unarchiveAgent = agents.unarchiveAgent.bind(agents);\n}\n","import { TasksApi } from '../../api';\nimport { AbilitiesApi } from '../../api';\n\nexport interface TasksBindings {\n // Tasks API\n getTasks: TasksApi['getTasks'];\n getTask: TasksApi['getTask'];\n createTask: TasksApi['createTask'];\n updateTask: TasksApi['updateTask'];\n deleteTask: TasksApi['deleteTask'];\n archiveTask: TasksApi['archiveTask'];\n unarchiveTask: TasksApi['unarchiveTask'];\n convertTaskToAbilities: TasksApi['convertToAbilities'];\n cloneTask: TasksApi['cloneTask'];\n\n // Abilities API (only types lookup - abilities are managed inline with parent objects)\n getAbilityTypes: AbilitiesApi['getAbilityTypes'];\n}\n\nexport function bindTasksMethods(\n target: TasksBindings,\n tasks: TasksApi,\n abilities: AbilitiesApi\n): void {\n // Tasks API\n target.getTasks = tasks.getTasks.bind(tasks);\n target.getTask = tasks.getTask.bind(tasks);\n target.createTask = tasks.createTask.bind(tasks);\n target.updateTask = tasks.updateTask.bind(tasks);\n target.deleteTask = tasks.deleteTask.bind(tasks);\n target.archiveTask = tasks.archiveTask.bind(tasks);\n target.unarchiveTask = tasks.unarchiveTask.bind(tasks);\n target.convertTaskToAbilities = tasks.convertToAbilities.bind(tasks);\n target.cloneTask = tasks.cloneTask.bind(tasks);\n\n // Abilities API (only types lookup)\n target.getAbilityTypes = abilities.getAbilityTypes.bind(abilities);\n}\n","import { ChatsApi } from '../../api';\n\nexport interface ChatsBindings {\n // Chats API\n getChats: ChatsApi['getChats'];\n getChat: ChatsApi['getChat'];\n getChatTokenUsage: ChatsApi['getChatTokenUsage'];\n getChatTodos: ChatsApi['getChatTodos'];\n getChatSkills: ChatsApi['getChatSkills'];\n getChatsNeedsResponse: ChatsApi['getChatsNeedsResponse'];\n getChatsDailyCreationStats: ChatsApi['getChatsDailyCreationStats'];\n archiveChat: ChatsApi['archiveChat'];\n unarchiveChat: ChatsApi['unarchiveChat'];\n createChat: ChatsApi['createChat'];\n deleteChat: ChatsApi['deleteChat'];\n updateChat: ChatsApi['updateChat'];\n updateChatMute: ChatsApi['updateChatMute'];\n updateChatNeedsResponse: ChatsApi['updateChatNeedsResponse'];\n summarizeChat: ChatsApi['summarizeChat'];\n getChatMessages: ChatsApi['getChatMessages'];\n getChatToolCallMessages: ChatsApi['getChatToolCallMessages'];\n getChatTools: ChatsApi['getChatTools'];\n initiateOutboundCall: ChatsApi['initiateOutboundCall'];\n sendAssistantMessage: ChatsApi['sendAssistantMessage'];\n rateMessage: ChatsApi['rateMessage'];\n getChatAssignmentTasks: ChatsApi['getChatAssignmentTasks'];\n createChatCompletion: ChatsApi['createChatCompletion'];\n exportChats: ChatsApi['exportChats'];\n exportChat: ChatsApi['exportChat'];\n findOrCreateDMChat: ChatsApi['findOrCreateDMChat'];\n sendChatMessage: ChatsApi['sendChatMessage'];\n // Chat Labels API\n getChatLabels: ChatsApi['getChatLabels'];\n getChatLabel: ChatsApi['getChatLabel'];\n getChatLabelByUuid: ChatsApi['getChatLabelByUuid'];\n createChatLabel: ChatsApi['createChatLabel'];\n updateChatLabel: ChatsApi['updateChatLabel'];\n deleteChatLabel: ChatsApi['deleteChatLabel'];\n // Chat Filters API\n getChatFilters: ChatsApi['getChatFilters'];\n getChatFilter: ChatsApi['getChatFilter'];\n getChatFilterByUuid: ChatsApi['getChatFilterByUuid'];\n createChatFilter: ChatsApi['createChatFilter'];\n updateChatFilter: ChatsApi['updateChatFilter'];\n deleteChatFilter: ChatsApi['deleteChatFilter'];\n}\n\nexport function bindChatsMethods(target: ChatsBindings, chats: ChatsApi): void {\n // Chats API\n target.getChats = chats.getChats.bind(chats);\n target.getChat = chats.getChat.bind(chats);\n target.getChatTokenUsage = chats.getChatTokenUsage.bind(chats);\n target.getChatTodos = chats.getChatTodos.bind(chats);\n target.getChatSkills = chats.getChatSkills.bind(chats);\n target.getChatsNeedsResponse = chats.getChatsNeedsResponse.bind(chats);\n target.getChatsDailyCreationStats = chats.getChatsDailyCreationStats.bind(chats);\n target.archiveChat = chats.archiveChat.bind(chats);\n target.unarchiveChat = chats.unarchiveChat.bind(chats);\n target.createChat = chats.createChat.bind(chats);\n target.deleteChat = chats.deleteChat.bind(chats);\n target.updateChat = chats.updateChat.bind(chats);\n target.updateChatMute = chats.updateChatMute.bind(chats);\n target.updateChatNeedsResponse = chats.updateChatNeedsResponse.bind(chats);\n target.summarizeChat = chats.summarizeChat.bind(chats);\n target.getChatMessages = chats.getChatMessages.bind(chats);\n target.getChatToolCallMessages = chats.getChatToolCallMessages.bind(chats);\n target.getChatTools = chats.getChatTools.bind(chats);\n target.initiateOutboundCall = chats.initiateOutboundCall.bind(chats);\n target.sendAssistantMessage = chats.sendAssistantMessage.bind(chats);\n target.rateMessage = chats.rateMessage.bind(chats);\n target.getChatAssignmentTasks = chats.getChatAssignmentTasks.bind(chats);\n target.createChatCompletion = chats.createChatCompletion.bind(chats);\n target.exportChats = chats.exportChats.bind(chats);\n target.exportChat = chats.exportChat.bind(chats);\n target.findOrCreateDMChat = chats.findOrCreateDMChat.bind(chats);\n target.sendChatMessage = chats.sendChatMessage.bind(chats);\n // Chat Labels API\n target.getChatLabels = chats.getChatLabels.bind(chats);\n target.getChatLabel = chats.getChatLabel.bind(chats);\n target.getChatLabelByUuid = chats.getChatLabelByUuid.bind(chats);\n target.createChatLabel = chats.createChatLabel.bind(chats);\n target.updateChatLabel = chats.updateChatLabel.bind(chats);\n target.deleteChatLabel = chats.deleteChatLabel.bind(chats);\n // Chat Filters API\n target.getChatFilters = chats.getChatFilters.bind(chats);\n target.getChatFilter = chats.getChatFilter.bind(chats);\n target.getChatFilterByUuid = chats.getChatFilterByUuid.bind(chats);\n target.createChatFilter = chats.createChatFilter.bind(chats);\n target.updateChatFilter = chats.updateChatFilter.bind(chats);\n target.deleteChatFilter = chats.deleteChatFilter.bind(chats);\n}\n","import { CallsApi } from '../../api';\nimport { CELApi } from '../../api';\n\nexport interface CallsBindings {\n // Calls API\n initiateCall: CallsApi['initiateCall'];\n getVoiceToken: CallsApi['getVoiceToken'];\n getMessageTiming: CallsApi['getMessageTiming'];\n\n // CEL API\n getCelContext: CELApi['getCelContext'];\n}\n\nexport function bindCallsMethods(target: CallsBindings, calls: CallsApi, cel: CELApi): void {\n // Calls API\n target.initiateCall = calls.initiateCall.bind(calls);\n target.getVoiceToken = calls.getVoiceToken.bind(calls);\n target.getMessageTiming = calls.getMessageTiming.bind(calls);\n\n // CEL API\n target.getCelContext = cel.getCelContext.bind(cel);\n}\n","import { DataTypesApi } from '../../api';\n\nexport interface DataTypesBindings {\n // Data Types API\n getDataTypes: DataTypesApi['getDataTypes'];\n getDataType: DataTypesApi['getDataType'];\n getDataTypeBySlug: DataTypesApi['getDataTypeBySlug'];\n createDataType: DataTypesApi['createDataType'];\n updateDataType: DataTypesApi['updateDataType'];\n deleteDataType: DataTypesApi['deleteDataType'];\n archiveDataType: DataTypesApi['archiveDataType'];\n unarchiveDataType: DataTypesApi['unarchiveDataType'];\n cloneDataType: DataTypesApi['cloneDataType'];\n getDataRecords: DataTypesApi['getDataRecords'];\n getDataRecord: DataTypesApi['getDataRecord'];\n createDataRecord: DataTypesApi['createDataRecord'];\n updateDataRecord: DataTypesApi['updateDataRecord'];\n deleteDataRecord: DataTypesApi['deleteDataRecord'];\n getDataRecordChanges: DataTypesApi['getDataRecordChanges'];\n upsertDataRecord: DataTypesApi['upsertDataRecord'];\n toggleFieldIndex: DataTypesApi['toggleFieldIndex'];\n getFieldIndexStatus: DataTypesApi['getFieldIndexStatus'];\n validateDataTypeSlug: DataTypesApi['validateDataTypeSlug'];\n getMemberRecordCounts: DataTypesApi['getMemberRecordCounts'];\n}\n\nexport function bindDataTypesMethods(target: DataTypesBindings, dataTypes: DataTypesApi): void {\n target.getDataTypes = dataTypes.getDataTypes.bind(dataTypes);\n target.getDataType = dataTypes.getDataType.bind(dataTypes);\n target.getDataTypeBySlug = dataTypes.getDataTypeBySlug.bind(dataTypes);\n target.createDataType = dataTypes.createDataType.bind(dataTypes);\n target.updateDataType = dataTypes.updateDataType.bind(dataTypes);\n target.deleteDataType = dataTypes.deleteDataType.bind(dataTypes);\n target.archiveDataType = dataTypes.archiveDataType.bind(dataTypes);\n target.unarchiveDataType = dataTypes.unarchiveDataType.bind(dataTypes);\n target.cloneDataType = dataTypes.cloneDataType.bind(dataTypes);\n target.getDataRecords = dataTypes.getDataRecords.bind(dataTypes);\n target.getDataRecord = dataTypes.getDataRecord.bind(dataTypes);\n target.createDataRecord = dataTypes.createDataRecord.bind(dataTypes);\n target.updateDataRecord = dataTypes.updateDataRecord.bind(dataTypes);\n target.deleteDataRecord = dataTypes.deleteDataRecord.bind(dataTypes);\n target.getDataRecordChanges = dataTypes.getDataRecordChanges.bind(dataTypes);\n target.upsertDataRecord = dataTypes.upsertDataRecord.bind(dataTypes);\n target.toggleFieldIndex = dataTypes.toggleFieldIndex.bind(dataTypes);\n target.getFieldIndexStatus = dataTypes.getFieldIndexStatus.bind(dataTypes);\n target.validateDataTypeSlug = dataTypes.validateDataTypeSlug.bind(dataTypes);\n target.getMemberRecordCounts = dataTypes.getMemberRecordCounts.bind(dataTypes);\n}\n","import { MembersApi } from '../../api';\n\nexport interface MembersBindings {\n // Members API\n getCurrentMember: MembersApi['getCurrentMember'];\n getOwnedMembers: MembersApi['getOwnedMembers'];\n switchMember: MembersApi['switchMember'];\n clearMemberSwitch: MembersApi['clearMemberSwitch'];\n updateCurrentMember: MembersApi['updateCurrentMember'];\n getWorkspaceMembers: MembersApi['getWorkspaceMembers'];\n getWorkspaceMember: MembersApi['getWorkspaceMember'];\n createWorkspaceMember: MembersApi['createWorkspaceMember'];\n updateMember: MembersApi['updateMember'];\n deleteMember: MembersApi['deleteMember'];\n archiveMember: MembersApi['archiveMember'];\n unarchiveMember: MembersApi['unarchiveMember'];\n importMembers: MembersApi['importMembers'];\n exportMembers: MembersApi['exportMembers'];\n getMembersMessageActivity: MembersApi['getMembersMessageActivity'];\n getMemberFilters: MembersApi['getMemberFilters'];\n getMemberFilter: MembersApi['getMemberFilter'];\n createMemberFilter: MembersApi['createMemberFilter'];\n updateMemberFilter: MembersApi['updateMemberFilter'];\n deleteMemberFilter: MembersApi['deleteMemberFilter'];\n getMemberFilterCount: MembersApi['getMemberFilterCount'];\n getMemberLabels: MembersApi['getMemberLabels'];\n getMemberLabel: MembersApi['getMemberLabel'];\n getMemberLabelByUuid: MembersApi['getMemberLabelByUuid'];\n createMemberLabel: MembersApi['createMemberLabel'];\n updateMemberLabel: MembersApi['updateMemberLabel'];\n deleteMemberLabel: MembersApi['deleteMemberLabel'];\n getMemberRoles: MembersApi['getMemberRoles'];\n getMemberRole: MembersApi['getMemberRole'];\n getMemberRoleByUuid: MembersApi['getMemberRoleByUuid'];\n createMemberRole: MembersApi['createMemberRole'];\n updateMemberRole: MembersApi['updateMemberRole'];\n deleteMemberRole: MembersApi['deleteMemberRole'];\n // Member Fields\n getMemberFields: MembersApi['getMemberFields'];\n getMemberFieldDefinitions: MembersApi['getMemberFieldDefinitions'];\n createMemberField: MembersApi['createMemberField'];\n updateMemberField: MembersApi['updateMemberField'];\n deleteMemberField: MembersApi['deleteMemberField'];\n // Credential Change Invites (Admin-initiated)\n inviteMemberCredentialUpdate: MembersApi['inviteMemberCredentialUpdate'];\n cancelCredentialUpdateInvite: MembersApi['cancelCredentialUpdateInvite'];\n getCredentialUpdateInvites: MembersApi['getCredentialUpdateInvites'];\n // Anonymous Member Resolutions\n getAnonymousResolutions: MembersApi['getAnonymousResolutions'];\n getAnonymousResolution: MembersApi['getAnonymousResolution'];\n resolveAnonymousMember: MembersApi['resolveAnonymousMember'];\n expireAnonymousMember: MembersApi['expireAnonymousMember'];\n}\n\nexport function bindMembersMethods(target: MembersBindings, members: MembersApi): void {\n target.getCurrentMember = members.getCurrentMember.bind(members);\n target.getOwnedMembers = members.getOwnedMembers.bind(members);\n target.switchMember = members.switchMember.bind(members);\n target.clearMemberSwitch = members.clearMemberSwitch.bind(members);\n target.updateCurrentMember = members.updateCurrentMember.bind(members);\n target.getWorkspaceMembers = members.getWorkspaceMembers.bind(members);\n target.getWorkspaceMember = members.getWorkspaceMember.bind(members);\n target.createWorkspaceMember = members.createWorkspaceMember.bind(members);\n target.updateMember = members.updateMember.bind(members);\n target.deleteMember = members.deleteMember.bind(members);\n target.archiveMember = members.archiveMember.bind(members);\n target.unarchiveMember = members.unarchiveMember.bind(members);\n target.importMembers = members.importMembers.bind(members);\n target.exportMembers = members.exportMembers.bind(members);\n target.getMembersMessageActivity = members.getMembersMessageActivity.bind(members);\n target.getMemberFilters = members.getMemberFilters.bind(members);\n target.getMemberFilter = members.getMemberFilter.bind(members);\n target.createMemberFilter = members.createMemberFilter.bind(members);\n target.updateMemberFilter = members.updateMemberFilter.bind(members);\n target.deleteMemberFilter = members.deleteMemberFilter.bind(members);\n target.getMemberFilterCount = members.getMemberFilterCount.bind(members);\n target.getMemberLabels = members.getMemberLabels.bind(members);\n target.getMemberLabel = members.getMemberLabel.bind(members);\n target.getMemberLabelByUuid = members.getMemberLabelByUuid.bind(members);\n target.createMemberLabel = members.createMemberLabel.bind(members);\n target.updateMemberLabel = members.updateMemberLabel.bind(members);\n target.deleteMemberLabel = members.deleteMemberLabel.bind(members);\n target.getMemberRoles = members.getMemberRoles.bind(members);\n target.getMemberRole = members.getMemberRole.bind(members);\n target.getMemberRoleByUuid = members.getMemberRoleByUuid.bind(members);\n target.createMemberRole = members.createMemberRole.bind(members);\n target.updateMemberRole = members.updateMemberRole.bind(members);\n target.deleteMemberRole = members.deleteMemberRole.bind(members);\n // Member Fields\n target.getMemberFields = members.getMemberFields.bind(members);\n target.getMemberFieldDefinitions = members.getMemberFieldDefinitions.bind(members);\n target.createMemberField = members.createMemberField.bind(members);\n target.updateMemberField = members.updateMemberField.bind(members);\n target.deleteMemberField = members.deleteMemberField.bind(members);\n // Credential Change Invites (Admin-initiated)\n target.inviteMemberCredentialUpdate = members.inviteMemberCredentialUpdate.bind(members);\n target.cancelCredentialUpdateInvite = members.cancelCredentialUpdateInvite.bind(members);\n target.getCredentialUpdateInvites = members.getCredentialUpdateInvites.bind(members);\n // Anonymous Member Resolutions\n target.getAnonymousResolutions = members.getAnonymousResolutions.bind(members);\n target.getAnonymousResolution = members.getAnonymousResolution.bind(members);\n target.resolveAnonymousMember = members.resolveAnonymousMember.bind(members);\n target.expireAnonymousMember = members.expireAnonymousMember.bind(members);\n}\n","import { AdminApi } from '../../api';\n\nexport interface AdminBindings {\n // Accounts\n getAccounts: AdminApi['getAccounts'];\n getAccountDetails: AdminApi['getAccountDetails'];\n getAccountByUuid: AdminApi['getAccountByUuid'];\n getAccountMemberships: AdminApi['getAccountMemberships'];\n getAccountOrgMemberships: AdminApi['getAccountOrgMemberships'];\n createAccountOrgMembership: AdminApi['createAccountOrgMembership'];\n deleteAccountOrgMembership: AdminApi['deleteAccountOrgMembership'];\n getAccountMembership: AdminApi['getAccountMembership'];\n updateAccountMembership: AdminApi['updateAccountMembership'];\n createAccountMembership: AdminApi['createAccountMembership'];\n deleteAccountMembership: AdminApi['deleteAccountMembership'];\n updateAccountAsAdmin: AdminApi['updateAccountAsAdmin'];\n createAccountAsAdmin: AdminApi['createAccountAsAdmin'];\n deleteAccountAsAdmin: AdminApi['deleteAccountAsAdmin'];\n lookupAccount: AdminApi['lookupAccount'];\n\n // Organizations\n getOrganizations: AdminApi['getOrganizations'];\n getOrganization: AdminApi['getOrganization'];\n createOrganization: AdminApi['createOrganization'];\n updateOrganization: AdminApi['updateOrganization'];\n deleteOrganization: AdminApi['deleteOrganization'];\n joinOrganization: AdminApi['joinOrganization'];\n leaveOrganization: AdminApi['leaveOrganization'];\n generateLogoUploadUrl: AdminApi['generateLogoUploadUrl'];\n\n // Products\n importProducts: AdminApi['importProducts'];\n createProductAsAdmin: AdminApi['createProductAsAdmin'];\n getProductsAsAdmin: AdminApi['getProductsAsAdmin'];\n getProductAsAdmin: AdminApi['getProductAsAdmin'];\n updateProductAsAdmin: AdminApi['updateProductAsAdmin'];\n deleteProductAsAdmin: AdminApi['deleteProductAsAdmin'];\n\n // Workspaces\n getWorkspacesAsAdmin: AdminApi['getWorkspacesAsAdmin'];\n getWorkspaceAsAdmin: AdminApi['getWorkspaceAsAdmin'];\n getWorkspaceByNumericIdAsAdmin: AdminApi['getWorkspaceByNumericIdAsAdmin'];\n createWorkspaceAsAdmin: AdminApi['createWorkspaceAsAdmin'];\n updateWorkspaceAsAdmin: AdminApi['updateWorkspaceAsAdmin'];\n deleteWorkspaceAsAdmin: AdminApi['deleteWorkspaceAsAdmin'];\n createSchemaAsAdmin: AdminApi['createSchemaAsAdmin'];\n migrateSchemaAsAdmin: AdminApi['migrateSchemaAsAdmin'];\n provisionWorkspaceAsAdmin: AdminApi['provisionWorkspaceAsAdmin'];\n refreshProvisionStatusAsAdmin: AdminApi['refreshProvisionStatusAsAdmin'];\n enableMaintenanceMode: AdminApi['enableMaintenanceMode'];\n disableMaintenanceMode: AdminApi['disableMaintenanceMode'];\n getWorkspaceHealth: AdminApi['getWorkspaceHealth'];\n provisionPlanFeatures: AdminApi['provisionPlanFeatures'];\n\n // Members\n mergeMembers: AdminApi['mergeMembers'];\n getAdminWorkspaceMember: AdminApi['getAdminWorkspaceMember'];\n createAdminWorkspaceMember: AdminApi['createAdminWorkspaceMember'];\n updateAdminWorkspaceMember: AdminApi['updateAdminWorkspaceMember'];\n getAdminWorkspaceMemberRoles: AdminApi['getAdminWorkspaceMemberRoles'];\n getMissingMemberships: AdminApi['getMissingMemberships'];\n linkMissingMembership: AdminApi['linkMissingMembership'];\n\n // Phone Numbers\n createPhoneNumberMapping: AdminApi['createPhoneNumberMapping'];\n deletePhoneNumberMapping: AdminApi['deletePhoneNumberMapping'];\n getPhoneNumberMappings: AdminApi['getPhoneNumberMappings'];\n getPhoneNumberMapping: AdminApi['getPhoneNumberMapping'];\n createAdminPhoneNumberMapping: AdminApi['createAdminPhoneNumberMapping'];\n deleteAdminPhoneNumberMapping: AdminApi['deleteAdminPhoneNumberMapping'];\n getAvailableWorkspacesForPhone: AdminApi['getAvailableWorkspacesForPhone'];\n remapPhoneNumber: AdminApi['remapPhoneNumber'];\n getUnmappedPhoneNumbers: AdminApi['getUnmappedPhoneNumbers'];\n getWorkspaceUnmappedPhoneNumbers: AdminApi['getWorkspaceUnmappedPhoneNumbers'];\n getWorkspacePhoneNumbersAsAdmin: AdminApi['getWorkspacePhoneNumbersAsAdmin'];\n getProviderPhoneNumbers: AdminApi['getProviderPhoneNumbers'];\n getProviderPhoneNumber: AdminApi['getProviderPhoneNumber'];\n updatePhoneNumberStatus: AdminApi['updatePhoneNumberStatus'];\n syncPhoneNumbersFromProviders: AdminApi['syncPhoneNumbersFromProviders'];\n approvePhoneNumberRequest: AdminApi['approvePhoneNumberRequest'];\n rejectPhoneNumberRequest: AdminApi['rejectPhoneNumberRequest'];\n startBulkPhoneClassification: AdminApi['startBulkPhoneClassification'];\n\n // Site Mappings\n getSiteMappings: AdminApi['getSiteMappings'];\n getSiteMapping: AdminApi['getSiteMapping'];\n updateSiteMapping: AdminApi['updateSiteMapping'];\n updateSiteMappingWorkspace: AdminApi['updateSiteMappingWorkspace'];\n adminDeleteSiteMapping: AdminApi['adminDeleteSiteMapping'];\n createSiteMapping: AdminApi['createSiteMapping'];\n createOrUpdateSiteMapping: AdminApi['createOrUpdateSiteMapping'];\n deleteSiteMapping: AdminApi['deleteSiteMapping'];\n\n // Inbox Mappings\n getInboxMappings: AdminApi['getInboxMappings'];\n getInboxMapping: AdminApi['getInboxMapping'];\n updateInboxMapping: AdminApi['updateInboxMapping'];\n deleteAdminInboxMapping: AdminApi['deleteAdminInboxMapping'];\n\n // Utilities\n generateChatSummaries: AdminApi['generateChatSummaries'];\n executeQuery: AdminApi['executeQuery'];\n triggerPeriodicJob: AdminApi['triggerPeriodicJob'];\n listAllThemes: AdminApi['listAllThemes'];\n startBulkTOSAcceptance: AdminApi['startBulkTOSAcceptance'];\n startTokenUsageBackfill: AdminApi['startTokenUsageBackfill'];\n updateChatMessage: AdminApi['updateChatMessage'];\n\n // Stripe Customer Management\n getStripeCustomer: AdminApi['getStripeCustomer'];\n createStripeCustomer: AdminApi['createStripeCustomer'];\n updateStripeCustomer: AdminApi['updateStripeCustomer'];\n\n // Stripe Subscription Management\n getStripeSubscriptions: AdminApi['getStripeSubscriptions'];\n createStripeSubscription: AdminApi['createStripeSubscription'];\n updateStripeSubscription: AdminApi['updateStripeSubscription'];\n cancelStripeSubscription: AdminApi['cancelStripeSubscription'];\n provisionWorkspaceForSubscription: AdminApi['provisionWorkspaceForSubscription'];\n associateWorkspaceWithSubscription: AdminApi['associateWorkspaceWithSubscription'];\n createSubscriptionPaymentLink: AdminApi['createSubscriptionPaymentLink'];\n\n // Stripe Payment Methods\n createSetupIntent: AdminApi['createSetupIntent'];\n getStripePaymentMethods: AdminApi['getStripePaymentMethods'];\n attachStripePaymentMethod: AdminApi['attachStripePaymentMethod'];\n detachStripePaymentMethod: AdminApi['detachStripePaymentMethod'];\n setDefaultStripePaymentMethod: AdminApi['setDefaultStripePaymentMethod'];\n previewWorkspaceOrganizationChange: AdminApi['previewWorkspaceOrganizationChange'];\n changeWorkspaceOrganization: AdminApi['changeWorkspaceOrganization'];\n\n // Stripe Invoices\n createStripeInvoice: AdminApi['createStripeInvoice'];\n getStripeInvoices: AdminApi['getStripeInvoices'];\n getStripeUpcomingInvoice: AdminApi['getStripeUpcomingInvoice'];\n\n // Billing Dashboard\n getWorkspaceBillingDashboard: AdminApi['getWorkspaceBillingDashboard'];\n syncWorkspaceUsageToStripe: AdminApi['syncWorkspaceUsageToStripe'];\n\n // Product Stripe Sync\n compareProductsWithStripe: AdminApi['compareProductsWithStripe'];\n syncProductToStripe: AdminApi['syncProductToStripe'];\n searchStripeProducts: AdminApi['searchStripeProducts'];\n\n // Usage API\n getUsageReport: AdminApi['getUsageReport'];\n\n // Subscriptions Admin API\n getSubscriptionsAsAdmin: AdminApi['getSubscriptionsAsAdmin'];\n\n // Voice Metrics API\n getVoiceMetrics: AdminApi['getVoiceMetrics'];\n\n // Health Dashboard API\n getHealthMetrics: AdminApi['getHealthMetrics'];\n}\n\nexport function bindAdminMethods(target: AdminBindings, admin: AdminApi): void {\n // Accounts\n target.getAccounts = admin.getAccounts.bind(admin);\n target.getAccountDetails = admin.getAccountDetails.bind(admin);\n target.getAccountByUuid = admin.getAccountByUuid.bind(admin);\n target.getAccountMemberships = admin.getAccountMemberships.bind(admin);\n target.getAccountOrgMemberships = admin.getAccountOrgMemberships.bind(admin);\n target.createAccountOrgMembership = admin.createAccountOrgMembership.bind(admin);\n target.deleteAccountOrgMembership = admin.deleteAccountOrgMembership.bind(admin);\n target.getAccountMembership = admin.getAccountMembership.bind(admin);\n target.updateAccountMembership = admin.updateAccountMembership.bind(admin);\n target.createAccountMembership = admin.createAccountMembership.bind(admin);\n target.deleteAccountMembership = admin.deleteAccountMembership.bind(admin);\n target.updateAccountAsAdmin = admin.updateAccountAsAdmin.bind(admin);\n target.createAccountAsAdmin = admin.createAccountAsAdmin.bind(admin);\n target.deleteAccountAsAdmin = admin.deleteAccountAsAdmin.bind(admin);\n target.lookupAccount = admin.lookupAccount.bind(admin);\n\n // Organizations\n target.getOrganizations = admin.getOrganizations.bind(admin);\n target.getOrganization = admin.getOrganization.bind(admin);\n target.createOrganization = admin.createOrganization.bind(admin);\n target.updateOrganization = admin.updateOrganization.bind(admin);\n target.deleteOrganization = admin.deleteOrganization.bind(admin);\n target.joinOrganization = admin.joinOrganization.bind(admin);\n target.leaveOrganization = admin.leaveOrganization.bind(admin);\n target.generateLogoUploadUrl = admin.generateLogoUploadUrl.bind(admin);\n\n // Products\n target.importProducts = admin.importProducts.bind(admin);\n target.createProductAsAdmin = admin.createProductAsAdmin.bind(admin);\n target.getProductsAsAdmin = admin.getProductsAsAdmin.bind(admin);\n target.getProductAsAdmin = admin.getProductAsAdmin.bind(admin);\n target.updateProductAsAdmin = admin.updateProductAsAdmin.bind(admin);\n target.deleteProductAsAdmin = admin.deleteProductAsAdmin.bind(admin);\n\n // Workspaces\n target.getWorkspacesAsAdmin = admin.getWorkspacesAsAdmin.bind(admin);\n target.getWorkspaceAsAdmin = admin.getWorkspaceAsAdmin.bind(admin);\n target.getWorkspaceByNumericIdAsAdmin = admin.getWorkspaceByNumericIdAsAdmin.bind(admin);\n target.createWorkspaceAsAdmin = admin.createWorkspaceAsAdmin.bind(admin);\n target.updateWorkspaceAsAdmin = admin.updateWorkspaceAsAdmin.bind(admin);\n target.deleteWorkspaceAsAdmin = admin.deleteWorkspaceAsAdmin.bind(admin);\n target.createSchemaAsAdmin = admin.createSchemaAsAdmin.bind(admin);\n target.migrateSchemaAsAdmin = admin.migrateSchemaAsAdmin.bind(admin);\n target.provisionWorkspaceAsAdmin = admin.provisionWorkspaceAsAdmin.bind(admin);\n target.refreshProvisionStatusAsAdmin = admin.refreshProvisionStatusAsAdmin.bind(admin);\n target.enableMaintenanceMode = admin.enableMaintenanceMode.bind(admin);\n target.disableMaintenanceMode = admin.disableMaintenanceMode.bind(admin);\n target.getWorkspaceHealth = admin.getWorkspaceHealth.bind(admin);\n target.provisionPlanFeatures = admin.provisionPlanFeatures.bind(admin);\n\n // Members\n target.mergeMembers = admin.mergeMembers.bind(admin);\n target.getAdminWorkspaceMember = admin.getAdminWorkspaceMember.bind(admin);\n target.createAdminWorkspaceMember = admin.createAdminWorkspaceMember.bind(admin);\n target.updateAdminWorkspaceMember = admin.updateAdminWorkspaceMember.bind(admin);\n target.getAdminWorkspaceMemberRoles = admin.getAdminWorkspaceMemberRoles.bind(admin);\n target.getMissingMemberships = admin.getMissingMemberships.bind(admin);\n target.linkMissingMembership = admin.linkMissingMembership.bind(admin);\n\n // Phone Numbers\n target.createPhoneNumberMapping = admin.createPhoneNumberMapping.bind(admin);\n target.deletePhoneNumberMapping = admin.deletePhoneNumberMapping.bind(admin);\n target.getPhoneNumberMappings = admin.getPhoneNumberMappings.bind(admin);\n target.getPhoneNumberMapping = admin.getPhoneNumberMapping.bind(admin);\n target.createAdminPhoneNumberMapping = admin.createAdminPhoneNumberMapping.bind(admin);\n target.deleteAdminPhoneNumberMapping = admin.deleteAdminPhoneNumberMapping.bind(admin);\n target.getAvailableWorkspacesForPhone = admin.getAvailableWorkspacesForPhone.bind(admin);\n target.remapPhoneNumber = admin.remapPhoneNumber.bind(admin);\n target.getUnmappedPhoneNumbers = admin.getUnmappedPhoneNumbers.bind(admin);\n target.getWorkspaceUnmappedPhoneNumbers = admin.getWorkspaceUnmappedPhoneNumbers.bind(admin);\n target.getWorkspacePhoneNumbersAsAdmin = admin.getWorkspacePhoneNumbersAsAdmin.bind(admin);\n target.getProviderPhoneNumbers = admin.getProviderPhoneNumbers.bind(admin);\n target.getProviderPhoneNumber = admin.getProviderPhoneNumber.bind(admin);\n target.updatePhoneNumberStatus = admin.updatePhoneNumberStatus.bind(admin);\n target.syncPhoneNumbersFromProviders = admin.syncPhoneNumbersFromProviders.bind(admin);\n target.approvePhoneNumberRequest = admin.approvePhoneNumberRequest.bind(admin);\n target.rejectPhoneNumberRequest = admin.rejectPhoneNumberRequest.bind(admin);\n target.startBulkPhoneClassification = admin.startBulkPhoneClassification.bind(admin);\n\n // Site Mappings\n target.getSiteMappings = admin.getSiteMappings.bind(admin);\n target.getSiteMapping = admin.getSiteMapping.bind(admin);\n target.updateSiteMapping = admin.updateSiteMapping.bind(admin);\n target.updateSiteMappingWorkspace = admin.updateSiteMappingWorkspace.bind(admin);\n target.adminDeleteSiteMapping = admin.adminDeleteSiteMapping.bind(admin);\n target.createSiteMapping = admin.createSiteMapping.bind(admin);\n target.createOrUpdateSiteMapping = admin.createOrUpdateSiteMapping.bind(admin);\n target.deleteSiteMapping = admin.deleteSiteMapping.bind(admin);\n\n // Inbox Mappings\n target.getInboxMappings = admin.getInboxMappings.bind(admin);\n target.getInboxMapping = admin.getInboxMapping.bind(admin);\n target.updateInboxMapping = admin.updateInboxMapping.bind(admin);\n target.deleteAdminInboxMapping = admin.deleteAdminInboxMapping.bind(admin);\n\n // Utilities\n target.generateChatSummaries = admin.generateChatSummaries.bind(admin);\n target.executeQuery = admin.executeQuery.bind(admin);\n target.triggerPeriodicJob = admin.triggerPeriodicJob.bind(admin);\n target.listAllThemes = admin.listAllThemes.bind(admin);\n target.startBulkTOSAcceptance = admin.startBulkTOSAcceptance.bind(admin);\n target.startTokenUsageBackfill = admin.startTokenUsageBackfill.bind(admin);\n target.updateChatMessage = admin.updateChatMessage.bind(admin);\n\n // Stripe Customer Management\n target.getStripeCustomer = admin.getStripeCustomer.bind(admin);\n target.createStripeCustomer = admin.createStripeCustomer.bind(admin);\n target.updateStripeCustomer = admin.updateStripeCustomer.bind(admin);\n\n // Stripe Subscription Management\n target.getStripeSubscriptions = admin.getStripeSubscriptions.bind(admin);\n target.createStripeSubscription = admin.createStripeSubscription.bind(admin);\n target.updateStripeSubscription = admin.updateStripeSubscription.bind(admin);\n target.cancelStripeSubscription = admin.cancelStripeSubscription.bind(admin);\n target.provisionWorkspaceForSubscription = admin.provisionWorkspaceForSubscription.bind(admin);\n target.associateWorkspaceWithSubscription = admin.associateWorkspaceWithSubscription.bind(admin);\n target.createSubscriptionPaymentLink = admin.createSubscriptionPaymentLink.bind(admin);\n\n // Stripe Payment Methods\n target.createSetupIntent = admin.createSetupIntent.bind(admin);\n target.getStripePaymentMethods = admin.getStripePaymentMethods.bind(admin);\n target.attachStripePaymentMethod = admin.attachStripePaymentMethod.bind(admin);\n target.detachStripePaymentMethod = admin.detachStripePaymentMethod.bind(admin);\n target.setDefaultStripePaymentMethod = admin.setDefaultStripePaymentMethod.bind(admin);\n target.previewWorkspaceOrganizationChange = admin.previewWorkspaceOrganizationChange.bind(admin);\n target.changeWorkspaceOrganization = admin.changeWorkspaceOrganization.bind(admin);\n\n // Stripe Invoices\n target.createStripeInvoice = admin.createStripeInvoice.bind(admin);\n target.getStripeInvoices = admin.getStripeInvoices.bind(admin);\n target.getStripeUpcomingInvoice = admin.getStripeUpcomingInvoice.bind(admin);\n\n // Billing Dashboard\n target.getWorkspaceBillingDashboard = admin.getWorkspaceBillingDashboard.bind(admin);\n target.syncWorkspaceUsageToStripe = admin.syncWorkspaceUsageToStripe.bind(admin);\n\n // Product Stripe Sync\n target.compareProductsWithStripe = admin.compareProductsWithStripe.bind(admin);\n target.syncProductToStripe = admin.syncProductToStripe.bind(admin);\n target.searchStripeProducts = admin.searchStripeProducts.bind(admin);\n\n // Usage API\n target.getUsageReport = admin.getUsageReport.bind(admin);\n\n // Subscriptions Admin API\n target.getSubscriptionsAsAdmin = admin.getSubscriptionsAsAdmin.bind(admin);\n\n // Voice Metrics API\n target.getVoiceMetrics = admin.getVoiceMetrics.bind(admin);\n\n // Health Dashboard API\n target.getHealthMetrics = admin.getHealthMetrics.bind(admin);\n}\n","import { WorkspacesApi, WorkspaceInvitationsApi } from '../../api';\n\nexport interface WorkspacesBindings {\n // Workspaces API\n getWorkspaces: WorkspacesApi['getWorkspaces'];\n getPublicWorkspaces: WorkspacesApi['getPublicWorkspaces'];\n getWorkspace: WorkspacesApi['getWorkspace'];\n createWorkspace: WorkspacesApi['createWorkspace'];\n updateWorkspace: WorkspacesApi['updateWorkspace'];\n deleteWorkspace: WorkspacesApi['deleteWorkspace'];\n leaveWorkspace: WorkspacesApi['leaveWorkspace'];\n getWorkspaceDefaults: WorkspacesApi['getWorkspaceDefaults'];\n updateWorkspaceDefaults: WorkspacesApi['updateWorkspaceDefaults'];\n getWorkspaceCounts: WorkspacesApi['getWorkspaceCounts'];\n getBusinessHoursStatus: WorkspacesApi['getBusinessHoursStatus'];\n getAvailableWorkspaceFeatures: WorkspacesApi['getAvailableWorkspaceFeatures'];\n getWorkspaceNotices: WorkspacesApi['getWorkspaceNotices'];\n getNotifications: WorkspacesApi['getNotifications'];\n getNotification: WorkspacesApi['getNotification'];\n getUnreadNotificationCount: WorkspacesApi['getUnreadNotificationCount'];\n markNotificationAsRead: WorkspacesApi['markNotificationAsRead'];\n dismissNotification: WorkspacesApi['dismissNotification'];\n dismissAllNotifications: WorkspacesApi['dismissAllNotifications'];\n getResellerWorkspaces: WorkspacesApi['getResellerWorkspaces'];\n createClientWorkspace: WorkspacesApi['createClientWorkspace'];\n getClientWorkspace: WorkspacesApi['getClientWorkspace'];\n updateClientWorkspace: WorkspacesApi['updateClientWorkspace'];\n deleteClientWorkspace: WorkspacesApi['deleteClientWorkspace'];\n provisionClientWorkspace: WorkspacesApi['provisionClientWorkspace'];\n getProducts: WorkspacesApi['getProducts'];\n getProduct: WorkspacesApi['getProduct'];\n getPublicProduct: WorkspacesApi['getPublicProduct'];\n createProduct: WorkspacesApi['createProduct'];\n updateProduct: WorkspacesApi['updateProduct'];\n deleteProduct: WorkspacesApi['deleteProduct'];\n resetWorkspaceSecretKey: WorkspacesApi['resetWorkspaceSecretKey'];\n exportWorkspace: WorkspacesApi['exportWorkspace'];\n previewWorkspaceImport: WorkspacesApi['previewWorkspaceImport'];\n importWorkspace: WorkspacesApi['importWorkspace'];\n previewImportWorkspace: WorkspacesApi['previewImportWorkspace'];\n getWorkspaceThemes: WorkspacesApi['getWorkspaceThemes'];\n updateWorkspaceThemes: WorkspacesApi['updateWorkspaceThemes'];\n getWorkspaceBySlug: WorkspacesApi['getWorkspace'];\n getWorkspaceScopes: WorkspacesApi['getWorkspaceScopes'];\n getBillingDashboard: WorkspacesApi['getBillingDashboard'];\n syncUsageToStripe: WorkspacesApi['syncUsageToStripe'];\n\n // Push Notifications API\n getVapidPublicKey: WorkspacesApi['getVapidPublicKey'];\n registerPushSubscription: WorkspacesApi['registerPushSubscription'];\n unregisterPushSubscription: WorkspacesApi['unregisterPushSubscription'];\n listPushSubscriptions: WorkspacesApi['listPushSubscriptions'];\n\n // WorkspaceInvitations API\n listWorkspaceInvitations: WorkspaceInvitationsApi['listWorkspaceInvitations'];\n listWorkspaceInvitationsAdmin: WorkspaceInvitationsApi['listWorkspaceInvitationsAdmin'];\n getWorkspaceInvitation: WorkspaceInvitationsApi['getWorkspaceInvitation'];\n updateWorkspaceInvitationAdmin: WorkspaceInvitationsApi['updateWorkspaceInvitationAdmin'];\n deleteWorkspaceInvitation: WorkspaceInvitationsApi['deleteWorkspaceInvitation'];\n deleteWorkspaceInvitationAdmin: WorkspaceInvitationsApi['deleteWorkspaceInvitationAdmin'];\n requestWorkspaceMembership: WorkspaceInvitationsApi['requestWorkspaceMembership'];\n approveWorkspaceInvitation: WorkspaceInvitationsApi['approveWorkspaceInvitation'];\n denyWorkspaceInvitation: WorkspaceInvitationsApi['denyWorkspaceInvitation'];\n blockWorkspaceInvitation: WorkspaceInvitationsApi['blockWorkspaceInvitation'];\n inviteToWorkspace: WorkspaceInvitationsApi['inviteToWorkspace'];\n acceptInvitation: WorkspaceInvitationsApi['acceptInvitation'];\n declineInvitation: WorkspaceInvitationsApi['declineInvitation'];\n}\n\nexport function bindWorkspacesMethods(\n target: WorkspacesBindings,\n workspaces: WorkspacesApi,\n signupRequests: WorkspaceInvitationsApi\n): void {\n // Workspaces API\n target.getWorkspaces = workspaces.getWorkspaces.bind(workspaces);\n target.getPublicWorkspaces = workspaces.getPublicWorkspaces.bind(workspaces);\n target.getWorkspace = workspaces.getWorkspace.bind(workspaces);\n target.createWorkspace = workspaces.createWorkspace.bind(workspaces);\n target.updateWorkspace = workspaces.updateWorkspace.bind(workspaces);\n target.deleteWorkspace = workspaces.deleteWorkspace.bind(workspaces);\n target.leaveWorkspace = workspaces.leaveWorkspace.bind(workspaces);\n target.getWorkspaceDefaults = workspaces.getWorkspaceDefaults.bind(workspaces);\n target.updateWorkspaceDefaults = workspaces.updateWorkspaceDefaults.bind(workspaces);\n target.getWorkspaceCounts = workspaces.getWorkspaceCounts.bind(workspaces);\n target.getBusinessHoursStatus = workspaces.getBusinessHoursStatus.bind(workspaces);\n target.getAvailableWorkspaceFeatures = workspaces.getAvailableWorkspaceFeatures.bind(workspaces);\n target.getWorkspaceNotices = workspaces.getWorkspaceNotices.bind(workspaces);\n target.getNotifications = workspaces.getNotifications.bind(workspaces);\n target.getNotification = workspaces.getNotification.bind(workspaces);\n target.getUnreadNotificationCount = workspaces.getUnreadNotificationCount.bind(workspaces);\n target.markNotificationAsRead = workspaces.markNotificationAsRead.bind(workspaces);\n target.dismissNotification = workspaces.dismissNotification.bind(workspaces);\n target.dismissAllNotifications = workspaces.dismissAllNotifications.bind(workspaces);\n target.getResellerWorkspaces = workspaces.getResellerWorkspaces.bind(workspaces);\n target.createClientWorkspace = workspaces.createClientWorkspace.bind(workspaces);\n target.getClientWorkspace = workspaces.getClientWorkspace.bind(workspaces);\n target.updateClientWorkspace = workspaces.updateClientWorkspace.bind(workspaces);\n target.deleteClientWorkspace = workspaces.deleteClientWorkspace.bind(workspaces);\n target.provisionClientWorkspace = workspaces.provisionClientWorkspace.bind(workspaces);\n target.getProducts = workspaces.getProducts.bind(workspaces);\n target.getProduct = workspaces.getProduct.bind(workspaces);\n target.getPublicProduct = workspaces.getPublicProduct.bind(workspaces);\n target.createProduct = workspaces.createProduct.bind(workspaces);\n target.updateProduct = workspaces.updateProduct.bind(workspaces);\n target.deleteProduct = workspaces.deleteProduct.bind(workspaces);\n target.resetWorkspaceSecretKey = workspaces.resetWorkspaceSecretKey.bind(workspaces);\n target.exportWorkspace = workspaces.exportWorkspace.bind(workspaces);\n target.previewWorkspaceImport = workspaces.previewWorkspaceImport.bind(workspaces);\n target.importWorkspace = workspaces.importWorkspace.bind(workspaces);\n target.previewImportWorkspace = workspaces.previewImportWorkspace.bind(workspaces);\n target.getWorkspaceThemes = workspaces.getWorkspaceThemes.bind(workspaces);\n target.updateWorkspaceThemes = workspaces.updateWorkspaceThemes.bind(workspaces);\n target.getWorkspaceBySlug = workspaces.getWorkspace.bind(workspaces);\n target.getWorkspaceScopes = workspaces.getWorkspaceScopes.bind(workspaces);\n target.getBillingDashboard = workspaces.getBillingDashboard.bind(workspaces);\n target.syncUsageToStripe = workspaces.syncUsageToStripe.bind(workspaces);\n\n // Push Notifications API\n target.getVapidPublicKey = workspaces.getVapidPublicKey.bind(workspaces);\n target.registerPushSubscription = workspaces.registerPushSubscription.bind(workspaces);\n target.unregisterPushSubscription = workspaces.unregisterPushSubscription.bind(workspaces);\n target.listPushSubscriptions = workspaces.listPushSubscriptions.bind(workspaces);\n\n // WorkspaceInvitations API\n target.listWorkspaceInvitations = signupRequests.listWorkspaceInvitations.bind(signupRequests);\n target.listWorkspaceInvitationsAdmin =\n signupRequests.listWorkspaceInvitationsAdmin.bind(signupRequests);\n target.getWorkspaceInvitation = signupRequests.getWorkspaceInvitation.bind(signupRequests);\n target.updateWorkspaceInvitationAdmin =\n signupRequests.updateWorkspaceInvitationAdmin.bind(signupRequests);\n target.deleteWorkspaceInvitation = signupRequests.deleteWorkspaceInvitation.bind(signupRequests);\n target.deleteWorkspaceInvitationAdmin =\n signupRequests.deleteWorkspaceInvitationAdmin.bind(signupRequests);\n target.requestWorkspaceMembership =\n signupRequests.requestWorkspaceMembership.bind(signupRequests);\n target.approveWorkspaceInvitation =\n signupRequests.approveWorkspaceInvitation.bind(signupRequests);\n target.denyWorkspaceInvitation = signupRequests.denyWorkspaceInvitation.bind(signupRequests);\n target.blockWorkspaceInvitation = signupRequests.blockWorkspaceInvitation.bind(signupRequests);\n target.inviteToWorkspace = signupRequests.inviteToWorkspace.bind(signupRequests);\n target.acceptInvitation = signupRequests.acceptInvitation.bind(signupRequests);\n target.declineInvitation = signupRequests.declineInvitation.bind(signupRequests);\n}\n","import { AuthApi } from '../../api';\nimport { AssignmentsApi } from '../../api';\n\nexport interface AuthBindings {\n // Auth API\n getUserAccount: AuthApi['getUserAccount'];\n updateUserAccount: AuthApi['updateUserAccount'];\n login: AuthApi['login'];\n resendCode: AuthApi['resendCode'];\n verifyCodeWith2FA: AuthApi['verifyCodeWith2FA'];\n emailPasswordLogin: AuthApi['emailPasswordLogin'];\n emailPasswordSignup: AuthApi['emailPasswordSignup'];\n requestMagicLink: AuthApi['requestMagicLink'];\n validateMagicLink: AuthApi['validateMagicLink'];\n sendEmailVerification: AuthApi['sendEmailVerification'];\n verifyEmail: AuthApi['verifyEmail'];\n changePassword: AuthApi['changePassword'];\n setPassword: AuthApi['setPassword'];\n getPasswordStatus: AuthApi['getPasswordStatus'];\n logout: AuthApi['logout'];\n requestCrossDomainToken: AuthApi['requestCrossDomainToken'];\n exchangeToken: AuthApi['exchangeToken'];\n getDomainMapping: AuthApi['getDomainMapping'];\n createSignup: AuthApi['createSignup'];\n createAccount: AuthApi['emailPasswordSignup'];\n\n // Two-Factor Authentication methods\n getTwoFactorStatus: AuthApi['getTwoFactorStatus'];\n setupTOTP: AuthApi['setupTOTP'];\n verifyTOTPSetup: AuthApi['verifyTOTPSetup'];\n setupWebAuthn: AuthApi['setupWebAuthn'];\n verifyWebAuthnSetup: AuthApi['verifyWebAuthnSetup'];\n verifyTOTPAuth: AuthApi['verifyTOTPAuth'];\n verifyRecoveryCodeAuth: AuthApi['verifyRecoveryCodeAuth'];\n getWebAuthnAuthOptions: AuthApi['getWebAuthnAuthOptions'];\n verifyWebAuthnAuth: AuthApi['verifyWebAuthnAuth'];\n generateRecoveryCodes: AuthApi['generateRecoveryCodes'];\n disableTwoFactorMethod: AuthApi['disableTwoFactorMethod'];\n updateTwoFactorMethod: AuthApi['updateTwoFactorMethod'];\n\n // Organization membership methods\n getMyOrganizations: AuthApi['getMyOrganizations'];\n\n // Credential change methods (Verified Credential Architecture)\n requestCredentialChange: AuthApi['requestCredentialChange'];\n verifyCredentialChange: AuthApi['verifyCredentialChange'];\n getPendingCredentialChanges: AuthApi['getPendingCredentialChanges'];\n cancelCredentialChange: AuthApi['cancelCredentialChange'];\n // Credential change invite methods (for members to view/confirm admin-initiated invites)\n getCredentialChangeInviteDetails: AuthApi['getCredentialChangeInviteDetails'];\n confirmCredentialChangeInvite: AuthApi['confirmCredentialChangeInvite'];\n\n // Assignments API\n getAssignments: AssignmentsApi['getAssignments'];\n getAssignment: AssignmentsApi['getAssignment'];\n getAssignmentMessages: AssignmentsApi['getAssignmentMessages'];\n updateAssignment: AssignmentsApi['updateAssignment'];\n deleteAssignment: AssignmentsApi['deleteAssignment'];\n getAssignmentTask: AssignmentsApi['getAssignmentTask'];\n selectCurrentAssignmentTask: AssignmentsApi['selectCurrentAssignmentTask'];\n createAssignment: AssignmentsApi['createAssignment'];\n getAssignmentTaskDetail: AssignmentsApi['getAssignmentTaskDetail'];\n getAssignmentCelContext: AssignmentsApi['getAssignmentCelContext'];\n cancelAssignment: AssignmentsApi['cancelAssignment'];\n getAssignmentTools: AssignmentsApi['getAssignmentTools'];\n executeAssignmentTool: AssignmentsApi['executeAssignmentTool'];\n}\n\nexport function bindAuthMethods(\n target: AuthBindings,\n auth: AuthApi,\n assignments: AssignmentsApi\n): void {\n // Auth API\n target.getUserAccount = auth.getUserAccount.bind(auth);\n target.updateUserAccount = auth.updateUserAccount.bind(auth);\n target.login = auth.login.bind(auth);\n target.resendCode = auth.resendCode.bind(auth);\n target.verifyCodeWith2FA = auth.verifyCodeWith2FA.bind(auth);\n target.emailPasswordLogin = auth.emailPasswordLogin.bind(auth);\n target.emailPasswordSignup = auth.emailPasswordSignup.bind(auth);\n target.requestMagicLink = auth.requestMagicLink.bind(auth);\n target.validateMagicLink = auth.validateMagicLink.bind(auth);\n target.sendEmailVerification = auth.sendEmailVerification.bind(auth);\n target.verifyEmail = auth.verifyEmail.bind(auth);\n target.changePassword = auth.changePassword.bind(auth);\n target.setPassword = auth.setPassword.bind(auth);\n target.getPasswordStatus = auth.getPasswordStatus.bind(auth);\n target.logout = auth.logout.bind(auth);\n target.requestCrossDomainToken = auth.requestCrossDomainToken.bind(auth);\n target.exchangeToken = auth.exchangeToken.bind(auth);\n target.getDomainMapping = auth.getDomainMapping.bind(auth);\n target.createSignup = auth.createSignup.bind(auth);\n target.createAccount = auth.emailPasswordSignup.bind(auth);\n\n // Two-Factor Authentication API\n target.getTwoFactorStatus = auth.getTwoFactorStatus.bind(auth);\n target.setupTOTP = auth.setupTOTP.bind(auth);\n target.verifyTOTPSetup = auth.verifyTOTPSetup.bind(auth);\n target.setupWebAuthn = auth.setupWebAuthn.bind(auth);\n target.verifyWebAuthnSetup = auth.verifyWebAuthnSetup.bind(auth);\n target.verifyTOTPAuth = auth.verifyTOTPAuth.bind(auth);\n target.verifyRecoveryCodeAuth = auth.verifyRecoveryCodeAuth.bind(auth);\n target.getWebAuthnAuthOptions = auth.getWebAuthnAuthOptions.bind(auth);\n target.verifyWebAuthnAuth = auth.verifyWebAuthnAuth.bind(auth);\n target.generateRecoveryCodes = auth.generateRecoveryCodes.bind(auth);\n target.disableTwoFactorMethod = auth.disableTwoFactorMethod.bind(auth);\n target.updateTwoFactorMethod = auth.updateTwoFactorMethod.bind(auth);\n\n // Organization membership methods\n target.getMyOrganizations = auth.getMyOrganizations.bind(auth);\n\n // Credential change methods (Verified Credential Architecture)\n target.requestCredentialChange = auth.requestCredentialChange.bind(auth);\n target.verifyCredentialChange = auth.verifyCredentialChange.bind(auth);\n target.getPendingCredentialChanges = auth.getPendingCredentialChanges.bind(auth);\n target.cancelCredentialChange = auth.cancelCredentialChange.bind(auth);\n // Credential change invite methods (for members to view/confirm admin-initiated invites)\n target.getCredentialChangeInviteDetails = auth.getCredentialChangeInviteDetails.bind(auth);\n target.confirmCredentialChangeInvite = auth.confirmCredentialChangeInvite.bind(auth);\n\n // Assignments API\n target.getAssignments = assignments.getAssignments.bind(assignments);\n target.getAssignment = assignments.getAssignment.bind(assignments);\n target.getAssignmentMessages = assignments.getAssignmentMessages.bind(assignments);\n target.updateAssignment = assignments.updateAssignment.bind(assignments);\n target.deleteAssignment = assignments.deleteAssignment.bind(assignments);\n target.getAssignmentTask = assignments.getAssignmentTask.bind(assignments);\n target.selectCurrentAssignmentTask = assignments.selectCurrentAssignmentTask.bind(assignments);\n target.createAssignment = assignments.createAssignment.bind(assignments);\n target.getAssignmentTaskDetail = assignments.getAssignmentTaskDetail.bind(assignments);\n target.getAssignmentCelContext = assignments.getAssignmentCelContext.bind(assignments);\n target.cancelAssignment = assignments.cancelAssignment.bind(assignments);\n target.getAssignmentTools = assignments.getAssignmentTools.bind(assignments);\n target.executeAssignmentTool = assignments.executeAssignmentTool.bind(assignments);\n}\n","import { SitesApi } from '../../api';\n\nexport interface SitesBindings {\n // Sites API\n getSites: SitesApi['getSites'];\n checkSiteSlugAvailability: SitesApi['checkSiteSlugAvailability'];\n checkSiteDomainAvailability: SitesApi['checkSiteDomainAvailability'];\n getSite: SitesApi['getSite'];\n getSiteByUuid: SitesApi['getSiteByUuid'];\n getSiteRenderedPage: SitesApi['getSiteRenderedPage'];\n getSiteRenderedMenu: SitesApi['getSiteRenderedMenu'];\n siteSignup: SitesApi['siteSignup'];\n siteSendPhoneCode: SitesApi['siteSendPhoneCode'];\n siteSendEmailCode: SitesApi['siteSendEmailCode'];\n siteVerifyCode: SitesApi['siteVerifyCode'];\n siteGoogleOAuthInitiate: SitesApi['siteGoogleOAuthInitiate'];\n crawlSite: SitesApi['crawlSite'];\n createSite: SitesApi['createSite'];\n updateSite: SitesApi['updateSite'];\n deleteSite: SitesApi['deleteSite'];\n getSitePages: SitesApi['getSitePages'];\n getPage: SitesApi['getPage'];\n getPageBySlug: SitesApi['getPageBySlug'];\n createPage: SitesApi['createPage'];\n updatePage: SitesApi['updatePage'];\n deletePage: SitesApi['deletePage'];\n getSiteCounts: SitesApi['getSiteCounts'];\n getSiteMenu: SitesApi['getSiteMenu'];\n getMenuItems: SitesApi['getMenuItems'];\n createMenuItem: SitesApi['createMenuItem'];\n updateMenuItem: SitesApi['updateMenuItem'];\n deleteMenuItem: SitesApi['deleteMenuItem'];\n reorderMenuItems: SitesApi['reorderMenuItems'];\n generateSiteMediaUploadUrl: SitesApi['generateSiteMediaUploadUrl'];\n}\n\nexport function bindSitesMethods(target: SitesBindings, sites: SitesApi): void {\n target.getSites = sites.getSites.bind(sites);\n target.checkSiteSlugAvailability = sites.checkSiteSlugAvailability.bind(sites);\n target.checkSiteDomainAvailability = sites.checkSiteDomainAvailability.bind(sites);\n target.getSite = sites.getSite.bind(sites);\n target.getSiteByUuid = sites.getSiteByUuid.bind(sites);\n target.getSiteRenderedPage = sites.getSiteRenderedPage.bind(sites);\n target.getSiteRenderedMenu = sites.getSiteRenderedMenu.bind(sites);\n target.siteSignup = sites.siteSignup.bind(sites);\n target.siteSendPhoneCode = sites.siteSendPhoneCode.bind(sites);\n target.siteSendEmailCode = sites.siteSendEmailCode.bind(sites);\n target.siteVerifyCode = sites.siteVerifyCode.bind(sites);\n target.siteGoogleOAuthInitiate = sites.siteGoogleOAuthInitiate.bind(sites);\n target.crawlSite = sites.crawlSite.bind(sites);\n target.createSite = sites.createSite.bind(sites);\n target.updateSite = sites.updateSite.bind(sites);\n target.deleteSite = sites.deleteSite.bind(sites);\n target.getSitePages = sites.getSitePages.bind(sites);\n target.getPage = sites.getPage.bind(sites);\n target.getPageBySlug = sites.getPageBySlug.bind(sites);\n target.createPage = sites.createPage.bind(sites);\n target.updatePage = sites.updatePage.bind(sites);\n target.deletePage = sites.deletePage.bind(sites);\n target.getSiteCounts = sites.getSiteCounts.bind(sites);\n target.getSiteMenu = sites.getSiteMenu.bind(sites);\n target.getMenuItems = sites.getMenuItems.bind(sites);\n target.createMenuItem = sites.createMenuItem.bind(sites);\n target.updateMenuItem = sites.updateMenuItem.bind(sites);\n target.deleteMenuItem = sites.deleteMenuItem.bind(sites);\n target.reorderMenuItems = sites.reorderMenuItems.bind(sites);\n target.generateSiteMediaUploadUrl = sites.generateSiteMediaUploadUrl.bind(sites);\n}\n","import { FilesApi } from '../../api';\n\nexport interface FilesBindings {\n // Files API\n getFiles: FilesApi['getFiles'];\n getFile: FilesApi['getFile'];\n createFile: FilesApi['createFile'];\n updateFile: FilesApi['updateFile'];\n deleteFile: FilesApi['deleteFile'];\n convertFile: FilesApi['convertFile'];\n generateFileUploadUrl: FilesApi['generateFileUploadUrl'];\n getFolders: FilesApi['getFolders'];\n getFolder: FilesApi['getFolder'];\n createFolder: FilesApi['createFolder'];\n updateFolder: FilesApi['updateFolder'];\n deleteFolder: FilesApi['deleteFolder'];\n reindexFolder: FilesApi['reindexFolder'];\n searchFolder: FilesApi['searchFolder'];\n // File Labels API\n getFileLabels: FilesApi['getFileLabels'];\n getFileLabel: FilesApi['getFileLabel'];\n getFileLabelByUuid: FilesApi['getFileLabelByUuid'];\n createFileLabel: FilesApi['createFileLabel'];\n updateFileLabel: FilesApi['updateFileLabel'];\n deleteFileLabel: FilesApi['deleteFileLabel'];\n // File/Folder Sharing API\n getFileSharing: FilesApi['getFileSharing'];\n updateFileRoles: FilesApi['updateFileRoles'];\n removeFileRole: FilesApi['removeFileRole'];\n getFolderSharing: FilesApi['getFolderSharing'];\n updateFolderRoles: FilesApi['updateFolderRoles'];\n removeFolderRole: FilesApi['removeFolderRole'];\n // Batch Sharing API\n updateFileSharing: FilesApi['updateFileSharing'];\n updateFolderSharing: FilesApi['updateFolderSharing'];\n // Public Sharing API\n getPublicFile: FilesApi['getPublicFile'];\n getPublicFolder: FilesApi['getPublicFolder'];\n getPublicFolderFiles: FilesApi['getPublicFolderFiles'];\n}\n\nexport function bindFilesMethods(target: FilesBindings, files: FilesApi): void {\n target.getFiles = files.getFiles.bind(files);\n target.getFile = files.getFile.bind(files);\n target.createFile = files.createFile.bind(files);\n target.updateFile = files.updateFile.bind(files);\n target.deleteFile = files.deleteFile.bind(files);\n target.convertFile = files.convertFile.bind(files);\n target.generateFileUploadUrl = files.generateFileUploadUrl.bind(files);\n target.getFolders = files.getFolders.bind(files);\n target.getFolder = files.getFolder.bind(files);\n target.createFolder = files.createFolder.bind(files);\n target.updateFolder = files.updateFolder.bind(files);\n target.deleteFolder = files.deleteFolder.bind(files);\n target.reindexFolder = files.reindexFolder.bind(files);\n target.searchFolder = files.searchFolder.bind(files);\n // File Labels API\n target.getFileLabels = files.getFileLabels.bind(files);\n target.getFileLabel = files.getFileLabel.bind(files);\n target.getFileLabelByUuid = files.getFileLabelByUuid.bind(files);\n target.createFileLabel = files.createFileLabel.bind(files);\n target.updateFileLabel = files.updateFileLabel.bind(files);\n target.deleteFileLabel = files.deleteFileLabel.bind(files);\n // File/Folder Sharing API\n target.getFileSharing = files.getFileSharing.bind(files);\n target.updateFileRoles = files.updateFileRoles.bind(files);\n target.removeFileRole = files.removeFileRole.bind(files);\n target.getFolderSharing = files.getFolderSharing.bind(files);\n target.updateFolderRoles = files.updateFolderRoles.bind(files);\n target.removeFolderRole = files.removeFolderRole.bind(files);\n // Batch Sharing API\n target.updateFileSharing = files.updateFileSharing.bind(files);\n target.updateFolderSharing = files.updateFolderSharing.bind(files);\n // Public Sharing API\n target.getPublicFile = files.getPublicFile.bind(files);\n target.getPublicFolder = files.getPublicFolder.bind(files);\n target.getPublicFolderFiles = files.getPublicFolderFiles.bind(files);\n}\n","import { EventsApi } from '../../api';\n\nexport interface EventsBindings {\n // Event Rules API\n getEventRules: EventsApi['getEventRules'];\n getAvailableActions: EventsApi['getAvailableActions'];\n searchEventRules: EventsApi['searchEventRules'];\n getEventRule: EventsApi['getEventRule'];\n createEventRule: EventsApi['createEventRule'];\n updateEventRule: EventsApi['updateEventRule'];\n deleteEventRule: EventsApi['deleteEventRule'];\n reorderEventRules: EventsApi['reorderEventRules'];\n getWebhookLogs: EventsApi['getWebhookLogs'];\n getRuleExecutions: EventsApi['getRuleExecutions'];\n\n // Events API\n getEvents: EventsApi['getEvents'];\n getEvent: EventsApi['getEvent'];\n createEvent: EventsApi['createEvent'];\n updateEvent: EventsApi['updateEvent'];\n deleteEvent: EventsApi['deleteEvent'];\n runEvent: EventsApi['runEvent'];\n getEventRuns: EventsApi['getEventRuns'];\n resetEventRuns: EventsApi['resetEventRuns'];\n}\n\nexport function bindEventsMethods(target: EventsBindings, events: EventsApi): void {\n // Event Rules API\n target.getEventRules = events.getEventRules.bind(events);\n target.getAvailableActions = events.getAvailableActions.bind(events);\n target.searchEventRules = events.searchEventRules.bind(events);\n target.getEventRule = events.getEventRule.bind(events);\n target.createEventRule = events.createEventRule.bind(events);\n target.updateEventRule = events.updateEventRule.bind(events);\n target.deleteEventRule = events.deleteEventRule.bind(events);\n target.reorderEventRules = events.reorderEventRules.bind(events);\n target.getWebhookLogs = events.getWebhookLogs.bind(events);\n target.getRuleExecutions = events.getRuleExecutions.bind(events);\n\n // Events API\n target.getEvents = events.getEvents.bind(events);\n target.getEvent = events.getEvent.bind(events);\n target.createEvent = events.createEvent.bind(events);\n target.updateEvent = events.updateEvent.bind(events);\n target.deleteEvent = events.deleteEvent.bind(events);\n target.runEvent = events.runEvent.bind(events);\n target.getEventRuns = events.getEventRuns.bind(events);\n target.resetEventRuns = events.resetEventRuns.bind(events);\n}\n","import { WorkflowsApi } from '../../api';\nimport { WorkflowNotesApi } from '../../api/workflow-notes';\nimport { AssistantsApi, SupervisorsApi } from '../../api';\n\nexport interface WorkflowsBindings {\n // Workflows API\n getWorkflows: WorkflowsApi['getWorkflows'];\n getWorkflow: WorkflowsApi['getWorkflow'];\n getWorkflowActivity: WorkflowsApi['getWorkflowActivity'];\n getWorkflowsActivityBatch: WorkflowsApi['getWorkflowsActivityBatch'];\n getWorkflowDiagram: WorkflowsApi['getWorkflowDiagram'];\n getWorkflowThumbnailUrl: WorkflowsApi['getWorkflowThumbnailUrl'];\n createWorkflow: WorkflowsApi['createWorkflow'];\n updateWorkflow: WorkflowsApi['updateWorkflow'];\n getWorkflowDeletionPreview: WorkflowsApi['getWorkflowDeletionPreview'];\n deleteWorkflow: WorkflowsApi['deleteWorkflow'];\n archiveWorkflow: WorkflowsApi['archiveWorkflow'];\n unarchiveWorkflow: WorkflowsApi['unarchiveWorkflow'];\n cloneWorkflow: WorkflowsApi['cloneWorkflow'];\n getWorkflowTemplates: WorkflowsApi['getWorkflowTemplates'];\n createWorkflowFromTemplate: WorkflowsApi['createWorkflowFromTemplate'];\n getWorkflowTaskAssignmentStats: WorkflowsApi['getWorkflowTaskAssignmentStats'];\n getTaskChats: WorkflowsApi['getTaskChats'];\n\n // Workflow Notes API\n getWorkflowNotes: WorkflowNotesApi['getWorkflowNotes'];\n getWorkflowNote: WorkflowNotesApi['getWorkflowNote'];\n createWorkflowNote: WorkflowNotesApi['createWorkflowNote'];\n updateWorkflowNote: WorkflowNotesApi['updateWorkflowNote'];\n deleteWorkflowNote: WorkflowNotesApi['deleteWorkflowNote'];\n\n // Workflow Contributors API\n getWorkflowContributors: WorkflowsApi['getWorkflowContributors'];\n createWorkflowContributor: WorkflowsApi['createWorkflowContributor'];\n updateWorkflowContributor: WorkflowsApi['updateWorkflowContributor'];\n deleteWorkflowContributor: WorkflowsApi['deleteWorkflowContributor'];\n\n // Workspace Builders API\n getWorkspaceBuilders: WorkflowsApi['getWorkspaceBuilders'];\n getWorkspaceBuilder: WorkflowsApi['getWorkspaceBuilder'];\n buildWorkspace: WorkflowsApi['buildWorkspace'];\n validateWorkflowName: WorkflowsApi['validateWorkflowName'];\n\n // Assistants API\n getAssistants: AssistantsApi['getAssistants'];\n getAssistant: AssistantsApi['getAssistant'];\n createAssistant: AssistantsApi['createAssistant'];\n updateAssistant: AssistantsApi['updateAssistant'];\n deleteAssistant: AssistantsApi['deleteAssistant'];\n previewTTS: AssistantsApi['previewTTS'];\n\n // Supervisors API\n getSupervisors: SupervisorsApi['getSupervisors'];\n getSupervisor: SupervisorsApi['getSupervisor'];\n createSupervisor: SupervisorsApi['createSupervisor'];\n updateSupervisor: SupervisorsApi['updateSupervisor'];\n deleteSupervisor: SupervisorsApi['deleteSupervisor'];\n}\n\nexport function bindWorkflowsMethods(\n target: WorkflowsBindings,\n workflows: WorkflowsApi,\n workflowNotes: WorkflowNotesApi,\n assistants: AssistantsApi,\n supervisors: SupervisorsApi\n): void {\n // Workflows API\n target.getWorkflows = workflows.getWorkflows.bind(workflows);\n target.getWorkflow = workflows.getWorkflow.bind(workflows);\n target.getWorkflowActivity = workflows.getWorkflowActivity.bind(workflows);\n target.getWorkflowsActivityBatch = workflows.getWorkflowsActivityBatch.bind(workflows);\n target.getWorkflowDiagram = workflows.getWorkflowDiagram.bind(workflows);\n target.getWorkflowThumbnailUrl = workflows.getWorkflowThumbnailUrl.bind(workflows);\n target.createWorkflow = workflows.createWorkflow.bind(workflows);\n target.updateWorkflow = workflows.updateWorkflow.bind(workflows);\n target.getWorkflowDeletionPreview = workflows.getWorkflowDeletionPreview.bind(workflows);\n target.deleteWorkflow = workflows.deleteWorkflow.bind(workflows);\n target.archiveWorkflow = workflows.archiveWorkflow.bind(workflows);\n target.unarchiveWorkflow = workflows.unarchiveWorkflow.bind(workflows);\n target.cloneWorkflow = workflows.cloneWorkflow.bind(workflows);\n target.getWorkflowTemplates = workflows.getWorkflowTemplates.bind(workflows);\n target.createWorkflowFromTemplate = workflows.createWorkflowFromTemplate.bind(workflows);\n target.getWorkflowTaskAssignmentStats = workflows.getWorkflowTaskAssignmentStats.bind(workflows);\n target.getTaskChats = workflows.getTaskChats.bind(workflows);\n\n // Workflow Notes API\n target.getWorkflowNotes = workflowNotes.getWorkflowNotes.bind(workflowNotes);\n target.getWorkflowNote = workflowNotes.getWorkflowNote.bind(workflowNotes);\n target.createWorkflowNote = workflowNotes.createWorkflowNote.bind(workflowNotes);\n target.updateWorkflowNote = workflowNotes.updateWorkflowNote.bind(workflowNotes);\n target.deleteWorkflowNote = workflowNotes.deleteWorkflowNote.bind(workflowNotes);\n\n // Workflow Contributors API\n target.getWorkflowContributors = workflows.getWorkflowContributors.bind(workflows);\n target.createWorkflowContributor = workflows.createWorkflowContributor.bind(workflows);\n target.updateWorkflowContributor = workflows.updateWorkflowContributor.bind(workflows);\n target.deleteWorkflowContributor = workflows.deleteWorkflowContributor.bind(workflows);\n\n // Workspace Builders API\n target.getWorkspaceBuilders = workflows.getWorkspaceBuilders.bind(workflows);\n target.getWorkspaceBuilder = workflows.getWorkspaceBuilder.bind(workflows);\n target.buildWorkspace = workflows.buildWorkspace.bind(workflows);\n target.validateWorkflowName = workflows.validateWorkflowName.bind(workflows);\n\n // Assistants API\n target.getAssistants = assistants.getAssistants.bind(assistants);\n target.getAssistant = assistants.getAssistant.bind(assistants);\n target.createAssistant = assistants.createAssistant.bind(assistants);\n target.updateAssistant = assistants.updateAssistant.bind(assistants);\n target.deleteAssistant = assistants.deleteAssistant.bind(assistants);\n target.previewTTS = assistants.previewTTS.bind(assistants);\n\n // Supervisors API\n target.getSupervisors = supervisors.getSupervisors.bind(supervisors);\n target.getSupervisor = supervisors.getSupervisor.bind(supervisors);\n target.createSupervisor = supervisors.createSupervisor.bind(supervisors);\n target.updateSupervisor = supervisors.updateSupervisor.bind(supervisors);\n target.deleteSupervisor = supervisors.deleteSupervisor.bind(supervisors);\n}\n","import { CalendarsApi, MilestonesApi } from '../../api';\n\nexport interface CalendarsBindings {\n // Calendars API\n getCalendars: CalendarsApi['getCalendars'];\n getCalendar: CalendarsApi['getCalendar'];\n createCalendar: CalendarsApi['createCalendar'];\n updateCalendar: CalendarsApi['updateCalendar'];\n deleteCalendar: CalendarsApi['deleteCalendar'];\n getCalendarSchedules: CalendarsApi['getCalendarSchedules'];\n createCalendarSchedule: CalendarsApi['createCalendarSchedule'];\n updateCalendarSchedule: CalendarsApi['updateCalendarSchedule'];\n deleteCalendarSchedule: CalendarsApi['deleteCalendarSchedule'];\n checkAvailability: CalendarsApi['checkAvailability'];\n getAvailableSlots: CalendarsApi['getAvailableSlots'];\n getCalendarEvents: CalendarsApi['getCalendarEvents'];\n getCalendarEvent: CalendarsApi['getCalendarEvent'];\n createCalendarEvent: CalendarsApi['createCalendarEvent'];\n updateCalendarEvent: CalendarsApi['updateCalendarEvent'];\n cancelCalendarEvent: CalendarsApi['cancelCalendarEvent'];\n deleteCalendarEvent: CalendarsApi['deleteCalendarEvent'];\n updateEventAttendee: CalendarsApi['updateEventAttendee'];\n getCalendarEventTypes: CalendarsApi['getEventTypes'];\n getCalendarEventType: CalendarsApi['getEventType'];\n createCalendarEventType: CalendarsApi['createEventType'];\n updateCalendarEventType: CalendarsApi['updateEventType'];\n deleteCalendarEventType: CalendarsApi['deleteEventType'];\n generateICalToken: CalendarsApi['generateICalToken'];\n revokeICalToken: CalendarsApi['revokeICalToken'];\n getICalFeedUrl: CalendarsApi['getICalFeedUrl'];\n getGoogleCalendarStatus: CalendarsApi['getGoogleCalendarStatus'];\n listGoogleCalendars: CalendarsApi['listGoogleCalendars'];\n linkCalendarToGoogle: CalendarsApi['linkCalendarToGoogle'];\n unlinkCalendarFromGoogle: CalendarsApi['unlinkCalendarFromGoogle'];\n syncCalendarWithGoogle: CalendarsApi['syncCalendarWithGoogle'];\n\n // Milestones API\n getMilestones: MilestonesApi['getMilestones'];\n getMilestone: MilestonesApi['getMilestone'];\n createMilestone: MilestonesApi['createMilestone'];\n updateMilestone: MilestonesApi['updateMilestone'];\n deleteMilestone: MilestonesApi['deleteMilestone'];\n}\n\nexport function bindCalendarsMethods(\n target: CalendarsBindings,\n calendars: CalendarsApi,\n milestones: MilestonesApi\n): void {\n // Calendars API\n target.getCalendars = calendars.getCalendars.bind(calendars);\n target.getCalendar = calendars.getCalendar.bind(calendars);\n target.createCalendar = calendars.createCalendar.bind(calendars);\n target.updateCalendar = calendars.updateCalendar.bind(calendars);\n target.deleteCalendar = calendars.deleteCalendar.bind(calendars);\n target.getCalendarSchedules = calendars.getCalendarSchedules.bind(calendars);\n target.createCalendarSchedule = calendars.createCalendarSchedule.bind(calendars);\n target.updateCalendarSchedule = calendars.updateCalendarSchedule.bind(calendars);\n target.deleteCalendarSchedule = calendars.deleteCalendarSchedule.bind(calendars);\n target.checkAvailability = calendars.checkAvailability.bind(calendars);\n target.getAvailableSlots = calendars.getAvailableSlots.bind(calendars);\n target.getCalendarEvents = calendars.getCalendarEvents.bind(calendars);\n target.getCalendarEvent = calendars.getCalendarEvent.bind(calendars);\n target.createCalendarEvent = calendars.createCalendarEvent.bind(calendars);\n target.updateCalendarEvent = calendars.updateCalendarEvent.bind(calendars);\n target.cancelCalendarEvent = calendars.cancelCalendarEvent.bind(calendars);\n target.deleteCalendarEvent = calendars.deleteCalendarEvent.bind(calendars);\n target.updateEventAttendee = calendars.updateEventAttendee.bind(calendars);\n target.getCalendarEventTypes = calendars.getEventTypes.bind(calendars);\n target.getCalendarEventType = calendars.getEventType.bind(calendars);\n target.createCalendarEventType = calendars.createEventType.bind(calendars);\n target.updateCalendarEventType = calendars.updateEventType.bind(calendars);\n target.deleteCalendarEventType = calendars.deleteEventType.bind(calendars);\n target.generateICalToken = calendars.generateICalToken.bind(calendars);\n target.revokeICalToken = calendars.revokeICalToken.bind(calendars);\n target.getICalFeedUrl = calendars.getICalFeedUrl.bind(calendars);\n target.getGoogleCalendarStatus = calendars.getGoogleCalendarStatus.bind(calendars);\n target.listGoogleCalendars = calendars.listGoogleCalendars.bind(calendars);\n target.linkCalendarToGoogle = calendars.linkCalendarToGoogle.bind(calendars);\n target.unlinkCalendarFromGoogle = calendars.unlinkCalendarFromGoogle.bind(calendars);\n target.syncCalendarWithGoogle = calendars.syncCalendarWithGoogle.bind(calendars);\n\n // Milestones API\n target.getMilestones = milestones.getMilestones.bind(milestones);\n target.getMilestone = milestones.getMilestone.bind(milestones);\n target.createMilestone = milestones.createMilestone.bind(milestones);\n target.updateMilestone = milestones.updateMilestone.bind(milestones);\n target.deleteMilestone = milestones.deleteMilestone.bind(milestones);\n}\n","import { PhoneNumbersApi, InboxesApi, NotificationRulesApi } from '../../api';\n\nexport interface CommunicationsBindings {\n // Phone Numbers API\n getPhoneNumbers: PhoneNumbersApi['getPhoneNumbers'];\n getAvailablePhoneNumbers: PhoneNumbersApi['getAvailablePhoneNumbers'];\n requestPhoneNumber: PhoneNumbersApi['requestPhoneNumber'];\n getPhoneNumber: PhoneNumbersApi['getPhoneNumber'];\n createPhoneNumber: PhoneNumbersApi['createPhoneNumber'];\n updatePhoneNumber: PhoneNumbersApi['updatePhoneNumber'];\n deletePhoneNumber: PhoneNumbersApi['deletePhoneNumber'];\n getPhoneNumberCalls: PhoneNumbersApi['getPhoneNumberCalls'];\n getPhoneNumberMessages: PhoneNumbersApi['getPhoneNumberMessages'];\n\n // Inboxes API\n getInboxes: InboxesApi['getInboxes'];\n getInbox: InboxesApi['getInbox'];\n createInbox: InboxesApi['createInbox'];\n updateInbox: InboxesApi['updateInbox'];\n deleteInbox: InboxesApi['deleteInbox'];\n getInboxEmails: InboxesApi['getInboxEmails'];\n getInboxEmail: InboxesApi['getInboxEmail'];\n markEmailAsRead: InboxesApi['markEmailAsRead'];\n markEmailAsUnread: InboxesApi['markEmailAsUnread'];\n convertEmail: InboxesApi['convertEmail'];\n downloadEmailAttachment: InboxesApi['downloadEmailAttachment'];\n getInboxThreads: InboxesApi['getInboxThreads'];\n getThreadEmails: InboxesApi['getThreadEmails'];\n getChatEmails: InboxesApi['getChatEmails'];\n\n // Notification Rules API\n getNotificationRules: NotificationRulesApi['getNotificationRules'];\n createNotificationRule: NotificationRulesApi['createNotificationRule'];\n updateNotificationRule: NotificationRulesApi['updateNotificationRule'];\n deleteNotificationRule: NotificationRulesApi['deleteNotificationRule'];\n}\n\nexport function bindCommunicationsMethods(\n target: CommunicationsBindings,\n phoneNumbers: PhoneNumbersApi,\n inboxes: InboxesApi,\n notificationRules: NotificationRulesApi\n): void {\n // Phone Numbers API\n target.getPhoneNumbers = phoneNumbers.getPhoneNumbers.bind(phoneNumbers);\n target.getAvailablePhoneNumbers = phoneNumbers.getAvailablePhoneNumbers.bind(phoneNumbers);\n target.requestPhoneNumber = phoneNumbers.requestPhoneNumber.bind(phoneNumbers);\n target.getPhoneNumber = phoneNumbers.getPhoneNumber.bind(phoneNumbers);\n target.createPhoneNumber = phoneNumbers.createPhoneNumber.bind(phoneNumbers);\n target.updatePhoneNumber = phoneNumbers.updatePhoneNumber.bind(phoneNumbers);\n target.deletePhoneNumber = phoneNumbers.deletePhoneNumber.bind(phoneNumbers);\n target.getPhoneNumberCalls = phoneNumbers.getPhoneNumberCalls.bind(phoneNumbers);\n target.getPhoneNumberMessages = phoneNumbers.getPhoneNumberMessages.bind(phoneNumbers);\n\n // Inboxes API\n target.getInboxes = inboxes.getInboxes.bind(inboxes);\n target.getInbox = inboxes.getInbox.bind(inboxes);\n target.createInbox = inboxes.createInbox.bind(inboxes);\n target.updateInbox = inboxes.updateInbox.bind(inboxes);\n target.deleteInbox = inboxes.deleteInbox.bind(inboxes);\n target.getInboxEmails = inboxes.getInboxEmails.bind(inboxes);\n target.getInboxEmail = inboxes.getInboxEmail.bind(inboxes);\n target.markEmailAsRead = inboxes.markEmailAsRead.bind(inboxes);\n target.markEmailAsUnread = inboxes.markEmailAsUnread.bind(inboxes);\n target.convertEmail = inboxes.convertEmail.bind(inboxes);\n target.downloadEmailAttachment = inboxes.downloadEmailAttachment.bind(inboxes);\n target.getInboxThreads = inboxes.getInboxThreads.bind(inboxes);\n target.getThreadEmails = inboxes.getThreadEmails.bind(inboxes);\n target.getChatEmails = inboxes.getChatEmails.bind(inboxes);\n\n // Notification Rules API\n target.getNotificationRules = notificationRules.getNotificationRules.bind(notificationRules);\n target.createNotificationRule = notificationRules.createNotificationRule.bind(notificationRules);\n target.updateNotificationRule = notificationRules.updateNotificationRule.bind(notificationRules);\n target.deleteNotificationRule = notificationRules.deleteNotificationRule.bind(notificationRules);\n}\n","import {\n ToolkitsApi,\n CustomToolkitsApi,\n McpServersApi,\n TemplatesApi,\n FeaturesApi,\n AIModelsApi,\n} from '../../api';\n\nexport interface ToolkitsBindings {\n // Toolkits API\n getToolkits: ToolkitsApi['getToolkits'];\n getTool: ToolkitsApi['getTool'];\n\n // Templates API\n getTemplateContext: TemplatesApi['getTemplateContext'];\n previewTemplate: TemplatesApi['previewTemplate'];\n getVariableRegistry: TemplatesApi['getVariableRegistry'];\n\n // AI Models API\n getChatModels: AIModelsApi['getChatModels'];\n getRealtimeModels: AIModelsApi['getRealtimeModels'];\n getVoiceModels: AIModelsApi['getVoiceModels'];\n getAllModels: AIModelsApi['getAllModels'];\n\n // Custom Toolkits API\n getCustomToolkits: CustomToolkitsApi['getCustomToolkits'];\n getCustomToolkit: CustomToolkitsApi['getCustomToolkit'];\n createCustomToolkit: CustomToolkitsApi['createCustomToolkit'];\n updateCustomToolkit: CustomToolkitsApi['updateCustomToolkit'];\n deleteCustomToolkit: CustomToolkitsApi['deleteCustomToolkit'];\n enableCustomToolkit: CustomToolkitsApi['enableCustomToolkit'];\n disableCustomToolkit: CustomToolkitsApi['disableCustomToolkit'];\n createCustomTool: CustomToolkitsApi['createCustomTool'];\n updateCustomTool: CustomToolkitsApi['updateCustomTool'];\n deleteCustomTool: CustomToolkitsApi['deleteCustomTool'];\n\n // MCP Servers API\n getMcpServers: McpServersApi['getMcpServers'];\n getMcpServer: McpServersApi['getMcpServer'];\n createMcpServer: McpServersApi['createMcpServer'];\n updateMcpServer: McpServersApi['updateMcpServer'];\n deleteMcpServer: McpServersApi['deleteMcpServer'];\n enableMcpServer: McpServersApi['enableMcpServer'];\n disableMcpServer: McpServersApi['disableMcpServer'];\n getMcpServerTools: McpServersApi['getMcpServerTools'];\n getMcpServerResources: McpServersApi['getMcpServerResources'];\n getMcpServerPrompts: McpServersApi['getMcpServerPrompts'];\n testMcpServerConnection: McpServersApi['testMcpServerConnection'];\n discoverOAuthMetadata: McpServersApi['discoverOAuthMetadata'];\n\n // Features API\n getFeatureRegistry: FeaturesApi['getFeatureRegistry'];\n getFeatureBySlug: FeaturesApi['getFeatureBySlug'];\n}\n\nexport function bindToolkitsMethods(\n target: ToolkitsBindings,\n toolkits: ToolkitsApi,\n templates: TemplatesApi,\n aiModels: AIModelsApi,\n customToolkits: CustomToolkitsApi,\n mcpServers: McpServersApi,\n features: FeaturesApi\n): void {\n // Toolkits API\n target.getToolkits = toolkits.getToolkits.bind(toolkits);\n target.getTool = toolkits.getTool.bind(toolkits);\n\n // Templates API\n target.getTemplateContext = templates.getTemplateContext.bind(templates);\n target.previewTemplate = templates.previewTemplate.bind(templates);\n target.getVariableRegistry = templates.getVariableRegistry.bind(templates);\n\n // AI Models API\n target.getChatModels = aiModels.getChatModels.bind(aiModels);\n target.getRealtimeModels = aiModels.getRealtimeModels.bind(aiModels);\n target.getVoiceModels = aiModels.getVoiceModels.bind(aiModels);\n target.getAllModels = aiModels.getAllModels.bind(aiModels);\n\n // Custom Toolkits API\n target.getCustomToolkits = customToolkits.getCustomToolkits.bind(customToolkits);\n target.getCustomToolkit = customToolkits.getCustomToolkit.bind(customToolkits);\n target.createCustomToolkit = customToolkits.createCustomToolkit.bind(customToolkits);\n target.updateCustomToolkit = customToolkits.updateCustomToolkit.bind(customToolkits);\n target.deleteCustomToolkit = customToolkits.deleteCustomToolkit.bind(customToolkits);\n target.enableCustomToolkit = customToolkits.enableCustomToolkit.bind(customToolkits);\n target.disableCustomToolkit = customToolkits.disableCustomToolkit.bind(customToolkits);\n target.createCustomTool = customToolkits.createCustomTool.bind(customToolkits);\n target.updateCustomTool = customToolkits.updateCustomTool.bind(customToolkits);\n target.deleteCustomTool = customToolkits.deleteCustomTool.bind(customToolkits);\n\n // MCP Servers API\n target.getMcpServers = mcpServers.getMcpServers.bind(mcpServers);\n target.getMcpServer = mcpServers.getMcpServer.bind(mcpServers);\n target.createMcpServer = mcpServers.createMcpServer.bind(mcpServers);\n target.updateMcpServer = mcpServers.updateMcpServer.bind(mcpServers);\n target.deleteMcpServer = mcpServers.deleteMcpServer.bind(mcpServers);\n target.enableMcpServer = mcpServers.enableMcpServer.bind(mcpServers);\n target.disableMcpServer = mcpServers.disableMcpServer.bind(mcpServers);\n target.getMcpServerTools = mcpServers.getMcpServerTools.bind(mcpServers);\n target.getMcpServerResources = mcpServers.getMcpServerResources.bind(mcpServers);\n target.getMcpServerPrompts = mcpServers.getMcpServerPrompts.bind(mcpServers);\n target.testMcpServerConnection = mcpServers.testMcpServerConnection.bind(mcpServers);\n target.discoverOAuthMetadata = mcpServers.discoverOAuthMetadata.bind(mcpServers);\n\n // Features API\n target.getFeatureRegistry = features.getFeatureRegistry.bind(features);\n target.getFeatureBySlug = features.getFeatureBySlug.bind(features);\n}\n","import { ApiKeysApi, SubscriptionsApi, ReportsApi } from '../../api';\n\nexport interface BillingBindings {\n // API Keys API (Workspace-level)\n getApiKeys: ApiKeysApi['getApiKeys'];\n createApiKey: ApiKeysApi['createApiKey'];\n revokeApiKey: ApiKeysApi['revokeApiKey'];\n\n // API Keys API (Global/Account-level)\n getGlobalApiKeys: ApiKeysApi['getGlobalApiKeys'];\n createGlobalApiKey: ApiKeysApi['createGlobalApiKey'];\n revokeGlobalApiKey: ApiKeysApi['revokeGlobalApiKey'];\n\n // Subscriptions API\n getSubscriptions: SubscriptionsApi['getSubscriptions'];\n getWorkspaceSubscriptions: SubscriptionsApi['getWorkspaceSubscriptions'];\n cancelSubscription: SubscriptionsApi['cancelSubscription'];\n reactivateSubscription: SubscriptionsApi['reactivateSubscription'];\n updateSubscription: SubscriptionsApi['updateSubscription'];\n provisionMemberRole: SubscriptionsApi['provisionMemberRole'];\n\n // Reports API\n getAIUsageReport: ReportsApi['getAIUsageReport'];\n getSMSUsageReport: ReportsApi['getSMSUsageReport'];\n getPhoneUsageReport: ReportsApi['getPhoneUsageReport'];\n getVoiceUsageReport: ReportsApi['getVoiceUsageReport'];\n getMemberUsage: ReportsApi['getMemberUsage'];\n}\n\nexport function bindBillingMethods(\n target: BillingBindings,\n apiKeys: ApiKeysApi,\n subscriptions: SubscriptionsApi,\n reports: ReportsApi\n): void {\n // API Keys API (Workspace-level)\n target.getApiKeys = apiKeys.getApiKeys.bind(apiKeys);\n target.createApiKey = apiKeys.createApiKey.bind(apiKeys);\n target.revokeApiKey = apiKeys.revokeApiKey.bind(apiKeys);\n\n // API Keys API (Global/Account-level)\n target.getGlobalApiKeys = apiKeys.getGlobalApiKeys.bind(apiKeys);\n target.createGlobalApiKey = apiKeys.createGlobalApiKey.bind(apiKeys);\n target.revokeGlobalApiKey = apiKeys.revokeGlobalApiKey.bind(apiKeys);\n\n // Subscriptions API\n target.getSubscriptions = subscriptions.getSubscriptions.bind(subscriptions);\n target.getWorkspaceSubscriptions = subscriptions.getWorkspaceSubscriptions.bind(subscriptions);\n target.cancelSubscription = subscriptions.cancelSubscription.bind(subscriptions);\n target.reactivateSubscription = subscriptions.reactivateSubscription.bind(subscriptions);\n target.updateSubscription = subscriptions.updateSubscription.bind(subscriptions);\n target.provisionMemberRole = subscriptions.provisionMemberRole.bind(subscriptions);\n\n // Reports API\n target.getAIUsageReport = reports.getAIUsageReport.bind(reports);\n target.getSMSUsageReport = reports.getSMSUsageReport.bind(reports);\n target.getPhoneUsageReport = reports.getPhoneUsageReport.bind(reports);\n target.getVoiceUsageReport = reports.getVoiceUsageReport.bind(reports);\n target.getMemberUsage = reports.getMemberUsage.bind(reports);\n}\n","import { AppsApi, BuildersApi, InquiriesApi, OAuthApi, OAuthConnectionsApi } from '../../api';\n\nexport interface AppsBindings {\n // Apps API\n listApps: AppsApi['listApps'];\n createApp: AppsApi['createApp'];\n getApp: AppsApi['getApp'];\n getAppByClientId: AppsApi['getAppByClientId'];\n updateApp: AppsApi['updateApp'];\n deleteApp: AppsApi['deleteApp'];\n regenerateClientSecret: AppsApi['regenerateClientSecret'];\n\n // Builders API\n listBuilders: BuildersApi['listBuilders'];\n getBuilder: BuildersApi['getBuilder'];\n getBuilderApps: BuildersApi['getBuilderApps'];\n createBuilder: BuildersApi['createBuilder'];\n updateBuilder: BuildersApi['updateBuilder'];\n deleteBuilder: BuildersApi['deleteBuilder'];\n\n // Inquiries API\n createInquiry: InquiriesApi['createInquiry'];\n listInquiries: InquiriesApi['listInquiries'];\n getInquiry: InquiriesApi['getInquiry'];\n updateInquiry: InquiriesApi['updateInquiry'];\n deleteInquiry: InquiriesApi['deleteInquiry'];\n exportInquiriesCsv: InquiriesApi['exportInquiriesCsv'];\n\n // OAuth API (internal OAuth flow)\n authorize: OAuthApi['authorize'];\n exchangeOAuthToken: OAuthApi['exchangeOAuthToken'];\n getAvailableScopes: OAuthApi['getAvailableScopes'];\n\n // OAuth Connections API (third-party providers)\n getOAuthConnectionStatus: OAuthConnectionsApi['getConnectionStatus'];\n getOAuthAuthorizationUrl: OAuthConnectionsApi['getAuthorizationUrl'];\n disconnectOAuthProvider: OAuthConnectionsApi['disconnect'];\n}\n\nexport function bindAppsMethods(\n target: AppsBindings,\n apps: AppsApi,\n builders: BuildersApi,\n inquiries: InquiriesApi,\n oauth: OAuthApi,\n oauthConnections: OAuthConnectionsApi\n): void {\n // Apps API\n target.listApps = apps.listApps.bind(apps);\n target.createApp = apps.createApp.bind(apps);\n target.getApp = apps.getApp.bind(apps);\n target.getAppByClientId = apps.getAppByClientId.bind(apps);\n target.updateApp = apps.updateApp.bind(apps);\n target.deleteApp = apps.deleteApp.bind(apps);\n target.regenerateClientSecret = apps.regenerateClientSecret.bind(apps);\n\n // Builders API\n target.listBuilders = builders.listBuilders.bind(builders);\n target.getBuilder = builders.getBuilder.bind(builders);\n target.getBuilderApps = builders.getBuilderApps.bind(builders);\n target.createBuilder = builders.createBuilder.bind(builders);\n target.updateBuilder = builders.updateBuilder.bind(builders);\n target.deleteBuilder = builders.deleteBuilder.bind(builders);\n\n // Inquiries API\n target.createInquiry = inquiries.createInquiry.bind(inquiries);\n target.listInquiries = inquiries.listInquiries.bind(inquiries);\n target.getInquiry = inquiries.getInquiry.bind(inquiries);\n target.updateInquiry = inquiries.updateInquiry.bind(inquiries);\n target.deleteInquiry = inquiries.deleteInquiry.bind(inquiries);\n target.exportInquiriesCsv = inquiries.exportInquiriesCsv.bind(inquiries);\n\n // OAuth API (internal OAuth flow)\n target.authorize = oauth.authorize.bind(oauth);\n target.exchangeOAuthToken = oauth.exchangeOAuthToken.bind(oauth);\n target.getAvailableScopes = oauth.getAvailableScopes.bind(oauth);\n\n // OAuth Connections API (third-party providers)\n target.getOAuthConnectionStatus = oauthConnections.getConnectionStatus.bind(oauthConnections);\n target.getOAuthAuthorizationUrl = oauthConnections.getAuthorizationUrl.bind(oauthConnections);\n target.disconnectOAuthProvider = oauthConnections.disconnect.bind(oauthConnections);\n}\n","import {\n DiscordBotsApi,\n FhirConnectionsApi,\n AppConnectionsApi,\n MondayIntegrationApi,\n SlackAppsApi,\n} from '../../api';\n\nexport interface IntegrationsBindings {\n // Monday.com Integration API\n getMondayBoards: MondayIntegrationApi['getBoards'];\n getMondayBoardColumns: MondayIntegrationApi['getBoardColumns'];\n getMondayBoardGroups: MondayIntegrationApi['getBoardGroups'];\n createMondayWebhook: MondayIntegrationApi['createWebhook'];\n deleteMondayWebhook: MondayIntegrationApi['deleteWebhook'];\n getMondayWebhook: MondayIntegrationApi['getWebhook'];\n getMondayCurrentUserInfo: MondayIntegrationApi['getCurrentUserInfo'];\n\n // Discord Bots API\n getDiscordBots: DiscordBotsApi['getDiscordBots'];\n getDiscordBot: DiscordBotsApi['getDiscordBot'];\n getDiscordBotByUuid: DiscordBotsApi['getDiscordBotByUuid'];\n createDiscordBot: DiscordBotsApi['createDiscordBot'];\n updateDiscordBot: DiscordBotsApi['updateDiscordBot'];\n deleteDiscordBot: DiscordBotsApi['deleteDiscordBot'];\n registerDiscordSlashCommands: DiscordBotsApi['registerSlashCommands'];\n registerLinkedRolesMetadata: DiscordBotsApi['registerLinkedRolesMetadata'];\n getDiscordThreads: DiscordBotsApi['getDiscordThreads'];\n getDiscordGuilds: DiscordBotsApi['getDiscordGuilds'];\n getDiscordBotAccounts: DiscordBotsApi['getDiscordBotAccounts'];\n getMyCredentials: DiscordBotsApi['getMyCredentials'];\n unlinkCredential: DiscordBotsApi['unlinkCredential'];\n\n // Slack Apps API\n getSlackApps: SlackAppsApi['getSlackApps'];\n getSlackApp: SlackAppsApi['getSlackApp'];\n createSlackApp: SlackAppsApi['createSlackApp'];\n updateSlackApp: SlackAppsApi['updateSlackApp'];\n deleteSlackApp: SlackAppsApi['deleteSlackApp'];\n getSlackThreads: SlackAppsApi['getSlackThreads'];\n getSlackInstallations: SlackAppsApi['getSlackInstallations'];\n getSlackAppAccounts: SlackAppsApi['getSlackAppAccounts'];\n\n // FHIR Connections API\n getFhirConnections: FhirConnectionsApi['getFhirConnections'];\n getFhirConnection: FhirConnectionsApi['getFhirConnection'];\n getFhirConnectionByUuid: FhirConnectionsApi['getFhirConnectionByUuid'];\n createFhirConnection: FhirConnectionsApi['createFhirConnection'];\n updateFhirConnection: FhirConnectionsApi['updateFhirConnection'];\n deleteFhirConnection: FhirConnectionsApi['deleteFhirConnection'];\n testFhirConnection: FhirConnectionsApi['testFhirConnection'];\n fhirSearchPatients: FhirConnectionsApi['fhirSearchPatients'];\n fhirSearchPractitioners: FhirConnectionsApi['fhirSearchPractitioners'];\n fhirSearchLocations: FhirConnectionsApi['fhirSearchLocations'];\n fhirFetchCareTeam: FhirConnectionsApi['fhirFetchCareTeam'];\n fhirFetchEncounters: FhirConnectionsApi['fhirFetchEncounters'];\n fhirCreateEncounter: FhirConnectionsApi['fhirCreateEncounter'];\n\n // App Connections API\n listAvailableAppConnections: AppConnectionsApi['listAvailableAppConnections'];\n listAppConnections: AppConnectionsApi['listAppConnections'];\n enablePlatformApp: AppConnectionsApi['enablePlatformApp'];\n getPlatformApp: AppConnectionsApi['getPlatformApp'];\n updatePlatformApp: AppConnectionsApi['updatePlatformApp'];\n deletePlatformApp: AppConnectionsApi['deletePlatformApp'];\n}\n\nexport function bindIntegrationsMethods(\n target: IntegrationsBindings,\n mondayIntegration: MondayIntegrationApi,\n discordBots: DiscordBotsApi,\n slackApps: SlackAppsApi,\n fhirConnections: FhirConnectionsApi,\n appConnections: AppConnectionsApi\n): void {\n // Monday.com Integration API\n target.getMondayBoards = mondayIntegration.getBoards.bind(mondayIntegration);\n target.getMondayBoardColumns = mondayIntegration.getBoardColumns.bind(mondayIntegration);\n target.getMondayBoardGroups = mondayIntegration.getBoardGroups.bind(mondayIntegration);\n target.createMondayWebhook = mondayIntegration.createWebhook.bind(mondayIntegration);\n target.deleteMondayWebhook = mondayIntegration.deleteWebhook.bind(mondayIntegration);\n target.getMondayWebhook = mondayIntegration.getWebhook.bind(mondayIntegration);\n target.getMondayCurrentUserInfo = mondayIntegration.getCurrentUserInfo.bind(mondayIntegration);\n\n // Discord Bots API\n target.getDiscordBots = discordBots.getDiscordBots.bind(discordBots);\n target.getDiscordBot = discordBots.getDiscordBot.bind(discordBots);\n target.getDiscordBotByUuid = discordBots.getDiscordBotByUuid.bind(discordBots);\n target.createDiscordBot = discordBots.createDiscordBot.bind(discordBots);\n target.updateDiscordBot = discordBots.updateDiscordBot.bind(discordBots);\n target.deleteDiscordBot = discordBots.deleteDiscordBot.bind(discordBots);\n target.registerDiscordSlashCommands = discordBots.registerSlashCommands.bind(discordBots);\n target.registerLinkedRolesMetadata = discordBots.registerLinkedRolesMetadata.bind(discordBots);\n target.getDiscordThreads = discordBots.getDiscordThreads.bind(discordBots);\n target.getDiscordGuilds = discordBots.getDiscordGuilds.bind(discordBots);\n target.getDiscordBotAccounts = discordBots.getDiscordBotAccounts.bind(discordBots);\n target.getMyCredentials = discordBots.getMyCredentials.bind(discordBots);\n target.unlinkCredential = discordBots.unlinkCredential.bind(discordBots);\n\n // Slack Apps API\n target.getSlackApps = slackApps.getSlackApps.bind(slackApps);\n target.getSlackApp = slackApps.getSlackApp.bind(slackApps);\n target.createSlackApp = slackApps.createSlackApp.bind(slackApps);\n target.updateSlackApp = slackApps.updateSlackApp.bind(slackApps);\n target.deleteSlackApp = slackApps.deleteSlackApp.bind(slackApps);\n target.getSlackThreads = slackApps.getSlackThreads.bind(slackApps);\n target.getSlackInstallations = slackApps.getSlackInstallations.bind(slackApps);\n target.getSlackAppAccounts = slackApps.getSlackAppAccounts.bind(slackApps);\n\n // FHIR Connections API\n target.getFhirConnections = fhirConnections.getFhirConnections.bind(fhirConnections);\n target.getFhirConnection = fhirConnections.getFhirConnection.bind(fhirConnections);\n target.getFhirConnectionByUuid = fhirConnections.getFhirConnectionByUuid.bind(fhirConnections);\n target.createFhirConnection = fhirConnections.createFhirConnection.bind(fhirConnections);\n target.updateFhirConnection = fhirConnections.updateFhirConnection.bind(fhirConnections);\n target.deleteFhirConnection = fhirConnections.deleteFhirConnection.bind(fhirConnections);\n target.testFhirConnection = fhirConnections.testFhirConnection.bind(fhirConnections);\n target.fhirSearchPatients = fhirConnections.fhirSearchPatients.bind(fhirConnections);\n target.fhirSearchPractitioners = fhirConnections.fhirSearchPractitioners.bind(fhirConnections);\n target.fhirSearchLocations = fhirConnections.fhirSearchLocations.bind(fhirConnections);\n target.fhirFetchCareTeam = fhirConnections.fhirFetchCareTeam.bind(fhirConnections);\n target.fhirFetchEncounters = fhirConnections.fhirFetchEncounters.bind(fhirConnections);\n target.fhirCreateEncounter = fhirConnections.fhirCreateEncounter.bind(fhirConnections);\n\n // App Connections API\n target.listAvailableAppConnections =\n appConnections.listAvailableAppConnections.bind(appConnections);\n target.listAppConnections = appConnections.listAppConnections.bind(appConnections);\n target.enablePlatformApp = appConnections.enablePlatformApp.bind(appConnections);\n target.getPlatformApp = appConnections.getPlatformApp.bind(appConnections);\n target.updatePlatformApp = appConnections.updatePlatformApp.bind(appConnections);\n target.deletePlatformApp = appConnections.deletePlatformApp.bind(appConnections);\n}\n","import { OperatorApi } from '../../api';\n\nexport interface OperatorBindings {\n getOperatorGroups: OperatorApi['getOperatorGroups'];\n getOperatorGroup: OperatorApi['getOperatorGroup'];\n createOperatorGroup: OperatorApi['createOperatorGroup'];\n updateOperatorGroup: OperatorApi['updateOperatorGroup'];\n deleteOperatorGroup: OperatorApi['deleteOperatorGroup'];\n addGroupMember: OperatorApi['addGroupMember'];\n removeGroupMember: OperatorApi['removeGroupMember'];\n getLiveOperators: OperatorApi['getLiveOperators'];\n getPresenceStatus: OperatorApi['getPresenceStatus'];\n disconnectPresence: OperatorApi['disconnectPresence'];\n getOperatorChatMessages: OperatorApi['getOperatorChatMessages'];\n sendOperatorMessage: OperatorApi['sendOperatorMessage'];\n}\n\nexport function bindOperatorMethods(target: OperatorBindings, operatorGroups: OperatorApi): void {\n target.getOperatorGroups = operatorGroups.getOperatorGroups.bind(operatorGroups);\n target.getOperatorGroup = operatorGroups.getOperatorGroup.bind(operatorGroups);\n target.createOperatorGroup = operatorGroups.createOperatorGroup.bind(operatorGroups);\n target.updateOperatorGroup = operatorGroups.updateOperatorGroup.bind(operatorGroups);\n target.deleteOperatorGroup = operatorGroups.deleteOperatorGroup.bind(operatorGroups);\n target.addGroupMember = operatorGroups.addGroupMember.bind(operatorGroups);\n target.removeGroupMember = operatorGroups.removeGroupMember.bind(operatorGroups);\n target.getLiveOperators = operatorGroups.getLiveOperators.bind(operatorGroups);\n target.getPresenceStatus = operatorGroups.getPresenceStatus.bind(operatorGroups);\n target.disconnectPresence = operatorGroups.disconnectPresence.bind(operatorGroups);\n target.getOperatorChatMessages = operatorGroups.getOperatorChatMessages.bind(operatorGroups);\n target.sendOperatorMessage = operatorGroups.sendOperatorMessage.bind(operatorGroups);\n}\n","import { PronunciationsApi } from '../../api';\n\nexport interface PronunciationsBindings {\n getPronunciationEntries: PronunciationsApi['getPronunciationEntries'];\n createPronunciationEntry: PronunciationsApi['createPronunciationEntry'];\n updatePronunciationEntry: PronunciationsApi['updatePronunciationEntry'];\n deletePronunciationEntry: PronunciationsApi['deletePronunciationEntry'];\n exportPronunciationEntries: PronunciationsApi['exportPronunciationEntries'];\n importPronunciationEntries: PronunciationsApi['importPronunciationEntries'];\n getMyPronunciations: PronunciationsApi['getMyPronunciations'];\n createMyPronunciation: PronunciationsApi['createMyPronunciation'];\n updateMyPronunciation: PronunciationsApi['updateMyPronunciation'];\n deleteMyPronunciation: PronunciationsApi['deleteMyPronunciation'];\n suggestPronunciations: PronunciationsApi['suggestPronunciations'];\n getRecommendedVoices: PronunciationsApi['getRecommendedVoices'];\n previewPronunciation: PronunciationsApi['previewPronunciation'];\n}\n\nexport function bindPronunciationsMethods(\n target: PronunciationsBindings,\n pronunciations: PronunciationsApi\n) {\n target.getPronunciationEntries = pronunciations.getPronunciationEntries.bind(pronunciations);\n target.createPronunciationEntry = pronunciations.createPronunciationEntry.bind(pronunciations);\n target.updatePronunciationEntry = pronunciations.updatePronunciationEntry.bind(pronunciations);\n target.deletePronunciationEntry = pronunciations.deletePronunciationEntry.bind(pronunciations);\n target.exportPronunciationEntries =\n pronunciations.exportPronunciationEntries.bind(pronunciations);\n target.importPronunciationEntries =\n pronunciations.importPronunciationEntries.bind(pronunciations);\n target.getMyPronunciations = pronunciations.getMyPronunciations.bind(pronunciations);\n target.createMyPronunciation = pronunciations.createMyPronunciation.bind(pronunciations);\n target.updateMyPronunciation = pronunciations.updateMyPronunciation.bind(pronunciations);\n target.deleteMyPronunciation = pronunciations.deleteMyPronunciation.bind(pronunciations);\n target.suggestPronunciations = pronunciations.suggestPronunciations.bind(pronunciations);\n target.getRecommendedVoices = pronunciations.getRecommendedVoices.bind(pronunciations);\n target.previewPronunciation = pronunciations.previewPronunciation.bind(pronunciations);\n}\n","import { QualificationsApi } from '../../api';\n\nexport interface QualificationsBindings {\n getQualifications: QualificationsApi['getQualifications'];\n getQualification: QualificationsApi['getQualification'];\n createQualification: QualificationsApi['createQualification'];\n updateQualification: QualificationsApi['updateQualification'];\n archiveQualification: QualificationsApi['archiveQualification'];\n getQualificationMembers: QualificationsApi['getQualificationMembers'];\n getMemberQualifications: QualificationsApi['getMemberQualifications'];\n assignQualification: QualificationsApi['assignQualification'];\n updateMemberQualification: QualificationsApi['updateMemberQualification'];\n removeMemberQualification: QualificationsApi['removeMemberQualification'];\n getMemberQualificationLog: QualificationsApi['getMemberQualificationLog'];\n // Requirements\n listRequirements: QualificationsApi['listRequirements'];\n createRequirement: QualificationsApi['createRequirement'];\n getRequirement: QualificationsApi['getRequirement'];\n updateRequirement: QualificationsApi['updateRequirement'];\n deleteRequirement: QualificationsApi['deleteRequirement'];\n // Submissions\n listSubmissions: QualificationsApi['listSubmissions'];\n getSubmission: QualificationsApi['getSubmission'];\n submitAnswer: QualificationsApi['submitAnswer'];\n startScenario: QualificationsApi['startScenario'];\n retrySubmission: QualificationsApi['retrySubmission'];\n submitForReview: QualificationsApi['submitForReview'];\n reviewSubmission: QualificationsApi['reviewSubmission'];\n overrideCriterionScore: QualificationsApi['overrideCriterionScore'];\n}\n\nexport function bindQualificationsMethods(\n target: QualificationsBindings,\n qualifications: QualificationsApi\n): void {\n target.getQualifications = qualifications.getQualifications.bind(qualifications);\n target.getQualification = qualifications.getQualification.bind(qualifications);\n target.createQualification = qualifications.createQualification.bind(qualifications);\n target.updateQualification = qualifications.updateQualification.bind(qualifications);\n target.archiveQualification = qualifications.archiveQualification.bind(qualifications);\n target.getQualificationMembers = qualifications.getQualificationMembers.bind(qualifications);\n target.getMemberQualifications = qualifications.getMemberQualifications.bind(qualifications);\n target.assignQualification = qualifications.assignQualification.bind(qualifications);\n target.updateMemberQualification = qualifications.updateMemberQualification.bind(qualifications);\n target.removeMemberQualification = qualifications.removeMemberQualification.bind(qualifications);\n target.getMemberQualificationLog = qualifications.getMemberQualificationLog.bind(qualifications);\n // Requirements\n target.listRequirements = qualifications.listRequirements.bind(qualifications);\n target.createRequirement = qualifications.createRequirement.bind(qualifications);\n target.getRequirement = qualifications.getRequirement.bind(qualifications);\n target.updateRequirement = qualifications.updateRequirement.bind(qualifications);\n target.deleteRequirement = qualifications.deleteRequirement.bind(qualifications);\n // Submissions\n target.listSubmissions = qualifications.listSubmissions.bind(qualifications);\n target.getSubmission = qualifications.getSubmission.bind(qualifications);\n target.submitAnswer = qualifications.submitAnswer.bind(qualifications);\n target.startScenario = qualifications.startScenario.bind(qualifications);\n target.retrySubmission = qualifications.retrySubmission.bind(qualifications);\n target.submitForReview = qualifications.submitForReview.bind(qualifications);\n target.reviewSubmission = qualifications.reviewSubmission.bind(qualifications);\n target.overrideCriterionScore = qualifications.overrideCriterionScore.bind(qualifications);\n}\n","import { WorkspaceInvitationsApi } from '../api';\nimport { EnhancedAuthHandler, OrgAuthHandler } from '../api/base';\nimport { ApiModules, createApiModules } from './api-modules';\nimport {\n AccessGrantsBindings,\n AdminBindings,\n AgentsBindings,\n AppsBindings,\n AuthBindings,\n BillingBindings,\n CalendarsBindings,\n CallsBindings,\n ChatsBindings,\n CommunicationsBindings,\n DataTypesBindings,\n EventsBindings,\n FilesBindings,\n IntegrationsBindings,\n MembersBindings,\n OperatorBindings,\n PronunciationsBindings,\n QualificationsBindings,\n bindPronunciationsMethods,\n SitesBindings,\n TasksBindings,\n ToolkitsBindings,\n WorkflowsBindings,\n WorkspacesBindings,\n bindAccessGrantsMethods,\n bindAdminMethods,\n bindAgentsMethods,\n bindAppsMethods,\n bindAuthMethods,\n bindBillingMethods,\n bindCalendarsMethods,\n bindCallsMethods,\n bindChatsMethods,\n bindCommunicationsMethods,\n bindDataTypesMethods,\n bindEventsMethods,\n bindFilesMethods,\n bindIntegrationsMethods,\n bindMembersMethods,\n bindOperatorMethods,\n bindQualificationsMethods,\n bindSitesMethods,\n bindTasksMethods,\n bindToolkitsMethods,\n bindWorkflowsMethods,\n bindWorkspacesMethods,\n} from './bindings';\n\n/**\n * GravityRailClient provides a unified interface to all public Gravity Rail API endpoints.\n *\n * Methods are organized by domain and bound to their respective API modules.\n * See the bindings directory for the organization of methods by domain.\n *\n * This class excludes admin/superuser methods. For the full client including\n * admin functionality, use {@link ApiClient} instead.\n */\nexport class GravityRailClient\n implements\n TasksBindings,\n ChatsBindings,\n CallsBindings,\n DataTypesBindings,\n MembersBindings,\n WorkspacesBindings,\n AuthBindings,\n SitesBindings,\n FilesBindings,\n EventsBindings,\n WorkflowsBindings,\n CalendarsBindings,\n CommunicationsBindings,\n ToolkitsBindings,\n BillingBindings,\n AppsBindings,\n IntegrationsBindings,\n AgentsBindings,\n PronunciationsBindings,\n QualificationsBindings,\n OperatorBindings,\n AccessGrantsBindings\n{\n // WorkspaceInvitations is exposed publicly for backward compatibility\n public workspaceInvitations: WorkspaceInvitationsApi;\n\n // Store all API modules for cross-cutting operations\n protected apis: ApiModules;\n\n // Tasks API\n getTasks!: TasksBindings['getTasks'];\n getTask!: TasksBindings['getTask'];\n createTask!: TasksBindings['createTask'];\n updateTask!: TasksBindings['updateTask'];\n deleteTask!: TasksBindings['deleteTask'];\n archiveTask!: TasksBindings['archiveTask'];\n unarchiveTask!: TasksBindings['unarchiveTask'];\n convertTaskToAbilities!: TasksBindings['convertTaskToAbilities'];\n cloneTask!: TasksBindings['cloneTask'];\n getAbilityTypes!: TasksBindings['getAbilityTypes'];\n\n // Chats API\n getChats!: ChatsBindings['getChats'];\n getChat!: ChatsBindings['getChat'];\n getChatTokenUsage!: ChatsBindings['getChatTokenUsage'];\n getChatTodos!: ChatsBindings['getChatTodos'];\n getChatSkills!: ChatsBindings['getChatSkills'];\n getChatsNeedsResponse!: ChatsBindings['getChatsNeedsResponse'];\n getChatsDailyCreationStats!: ChatsBindings['getChatsDailyCreationStats'];\n archiveChat!: ChatsBindings['archiveChat'];\n unarchiveChat!: ChatsBindings['unarchiveChat'];\n createChat!: ChatsBindings['createChat'];\n deleteChat!: ChatsBindings['deleteChat'];\n updateChat!: ChatsBindings['updateChat'];\n updateChatMute!: ChatsBindings['updateChatMute'];\n updateChatNeedsResponse!: ChatsBindings['updateChatNeedsResponse'];\n summarizeChat!: ChatsBindings['summarizeChat'];\n getChatMessages!: ChatsBindings['getChatMessages'];\n getChatToolCallMessages!: ChatsBindings['getChatToolCallMessages'];\n getChatTools!: ChatsBindings['getChatTools'];\n initiateOutboundCall!: ChatsBindings['initiateOutboundCall'];\n sendAssistantMessage!: ChatsBindings['sendAssistantMessage'];\n rateMessage!: ChatsBindings['rateMessage'];\n getChatAssignmentTasks!: ChatsBindings['getChatAssignmentTasks'];\n createChatCompletion!: ChatsBindings['createChatCompletion'];\n exportChats!: ChatsBindings['exportChats'];\n exportChat!: ChatsBindings['exportChat'];\n findOrCreateDMChat!: ChatsBindings['findOrCreateDMChat'];\n sendChatMessage!: ChatsBindings['sendChatMessage'];\n getChatLabels!: ChatsBindings['getChatLabels'];\n getChatLabel!: ChatsBindings['getChatLabel'];\n getChatLabelByUuid!: ChatsBindings['getChatLabelByUuid'];\n createChatLabel!: ChatsBindings['createChatLabel'];\n updateChatLabel!: ChatsBindings['updateChatLabel'];\n deleteChatLabel!: ChatsBindings['deleteChatLabel'];\n getChatFilters!: ChatsBindings['getChatFilters'];\n getChatFilter!: ChatsBindings['getChatFilter'];\n getChatFilterByUuid!: ChatsBindings['getChatFilterByUuid'];\n createChatFilter!: ChatsBindings['createChatFilter'];\n updateChatFilter!: ChatsBindings['updateChatFilter'];\n deleteChatFilter!: ChatsBindings['deleteChatFilter'];\n\n // Calls API\n initiateCall!: CallsBindings['initiateCall'];\n getVoiceToken!: CallsBindings['getVoiceToken'];\n getMessageTiming!: CallsBindings['getMessageTiming'];\n getCelContext!: CallsBindings['getCelContext'];\n\n // Data Types API\n getDataTypes!: DataTypesBindings['getDataTypes'];\n getDataType!: DataTypesBindings['getDataType'];\n getDataTypeBySlug!: DataTypesBindings['getDataTypeBySlug'];\n createDataType!: DataTypesBindings['createDataType'];\n updateDataType!: DataTypesBindings['updateDataType'];\n deleteDataType!: DataTypesBindings['deleteDataType'];\n archiveDataType!: DataTypesBindings['archiveDataType'];\n unarchiveDataType!: DataTypesBindings['unarchiveDataType'];\n cloneDataType!: DataTypesBindings['cloneDataType'];\n getDataRecords!: DataTypesBindings['getDataRecords'];\n getDataRecord!: DataTypesBindings['getDataRecord'];\n createDataRecord!: DataTypesBindings['createDataRecord'];\n updateDataRecord!: DataTypesBindings['updateDataRecord'];\n deleteDataRecord!: DataTypesBindings['deleteDataRecord'];\n getDataRecordChanges!: DataTypesBindings['getDataRecordChanges'];\n upsertDataRecord!: DataTypesBindings['upsertDataRecord'];\n toggleFieldIndex!: DataTypesBindings['toggleFieldIndex'];\n getFieldIndexStatus!: DataTypesBindings['getFieldIndexStatus'];\n validateDataTypeSlug!: DataTypesBindings['validateDataTypeSlug'];\n getMemberRecordCounts!: DataTypesBindings['getMemberRecordCounts'];\n\n // Members API\n getCurrentMember!: MembersBindings['getCurrentMember'];\n getOwnedMembers!: MembersBindings['getOwnedMembers'];\n switchMember!: MembersBindings['switchMember'];\n clearMemberSwitch!: MembersBindings['clearMemberSwitch'];\n updateCurrentMember!: MembersBindings['updateCurrentMember'];\n getWorkspaceMembers!: MembersBindings['getWorkspaceMembers'];\n getWorkspaceMember!: MembersBindings['getWorkspaceMember'];\n createWorkspaceMember!: MembersBindings['createWorkspaceMember'];\n updateMember!: MembersBindings['updateMember'];\n deleteMember!: MembersBindings['deleteMember'];\n archiveMember!: MembersBindings['archiveMember'];\n unarchiveMember!: MembersBindings['unarchiveMember'];\n importMembers!: MembersBindings['importMembers'];\n exportMembers!: MembersBindings['exportMembers'];\n getMembersMessageActivity!: MembersBindings['getMembersMessageActivity'];\n getMemberFilters!: MembersBindings['getMemberFilters'];\n getMemberFilter!: MembersBindings['getMemberFilter'];\n createMemberFilter!: MembersBindings['createMemberFilter'];\n updateMemberFilter!: MembersBindings['updateMemberFilter'];\n deleteMemberFilter!: MembersBindings['deleteMemberFilter'];\n getMemberFilterCount!: MembersBindings['getMemberFilterCount'];\n getMemberLabels!: MembersBindings['getMemberLabels'];\n getMemberLabel!: MembersBindings['getMemberLabel'];\n getMemberLabelByUuid!: MembersBindings['getMemberLabelByUuid'];\n createMemberLabel!: MembersBindings['createMemberLabel'];\n updateMemberLabel!: MembersBindings['updateMemberLabel'];\n deleteMemberLabel!: MembersBindings['deleteMemberLabel'];\n getMemberRoles!: MembersBindings['getMemberRoles'];\n getMemberRole!: MembersBindings['getMemberRole'];\n getMemberRoleByUuid!: MembersBindings['getMemberRoleByUuid'];\n createMemberRole!: MembersBindings['createMemberRole'];\n updateMemberRole!: MembersBindings['updateMemberRole'];\n deleteMemberRole!: MembersBindings['deleteMemberRole'];\n // Member Fields\n getMemberFields!: MembersBindings['getMemberFields'];\n getMemberFieldDefinitions!: MembersBindings['getMemberFieldDefinitions'];\n createMemberField!: MembersBindings['createMemberField'];\n updateMemberField!: MembersBindings['updateMemberField'];\n deleteMemberField!: MembersBindings['deleteMemberField'];\n // Credential Change Invites (Admin-initiated)\n inviteMemberCredentialUpdate!: MembersBindings['inviteMemberCredentialUpdate'];\n cancelCredentialUpdateInvite!: MembersBindings['cancelCredentialUpdateInvite'];\n getCredentialUpdateInvites!: MembersBindings['getCredentialUpdateInvites'];\n // Anonymous Member Resolutions\n getAnonymousResolutions!: MembersBindings['getAnonymousResolutions'];\n getAnonymousResolution!: MembersBindings['getAnonymousResolution'];\n resolveAnonymousMember!: MembersBindings['resolveAnonymousMember'];\n expireAnonymousMember!: MembersBindings['expireAnonymousMember'];\n\n // Agents API\n getAgents!: AgentsBindings['getAgents'];\n getAgent!: AgentsBindings['getAgent'];\n createAgent!: AgentsBindings['createAgent'];\n updateAgent!: AgentsBindings['updateAgent'];\n deleteAgent!: AgentsBindings['deleteAgent'];\n archiveAgent!: AgentsBindings['archiveAgent'];\n unarchiveAgent!: AgentsBindings['unarchiveAgent'];\n\n // Qualifications API\n getQualifications!: QualificationsBindings['getQualifications'];\n getQualification!: QualificationsBindings['getQualification'];\n createQualification!: QualificationsBindings['createQualification'];\n updateQualification!: QualificationsBindings['updateQualification'];\n archiveQualification!: QualificationsBindings['archiveQualification'];\n getQualificationMembers!: QualificationsBindings['getQualificationMembers'];\n getMemberQualifications!: QualificationsBindings['getMemberQualifications'];\n assignQualification!: QualificationsBindings['assignQualification'];\n updateMemberQualification!: QualificationsBindings['updateMemberQualification'];\n removeMemberQualification!: QualificationsBindings['removeMemberQualification'];\n getMemberQualificationLog!: QualificationsBindings['getMemberQualificationLog'];\n listRequirements!: QualificationsBindings['listRequirements'];\n createRequirement!: QualificationsBindings['createRequirement'];\n getRequirement!: QualificationsBindings['getRequirement'];\n updateRequirement!: QualificationsBindings['updateRequirement'];\n deleteRequirement!: QualificationsBindings['deleteRequirement'];\n listSubmissions!: QualificationsBindings['listSubmissions'];\n getSubmission!: QualificationsBindings['getSubmission'];\n submitAnswer!: QualificationsBindings['submitAnswer'];\n startScenario!: QualificationsBindings['startScenario'];\n retrySubmission!: QualificationsBindings['retrySubmission'];\n submitForReview!: QualificationsBindings['submitForReview'];\n reviewSubmission!: QualificationsBindings['reviewSubmission'];\n overrideCriterionScore!: QualificationsBindings['overrideCriterionScore'];\n\n // Operator Groups API\n getOperatorGroups!: OperatorBindings['getOperatorGroups'];\n getOperatorGroup!: OperatorBindings['getOperatorGroup'];\n createOperatorGroup!: OperatorBindings['createOperatorGroup'];\n updateOperatorGroup!: OperatorBindings['updateOperatorGroup'];\n deleteOperatorGroup!: OperatorBindings['deleteOperatorGroup'];\n addGroupMember!: OperatorBindings['addGroupMember'];\n removeGroupMember!: OperatorBindings['removeGroupMember'];\n getLiveOperators!: OperatorBindings['getLiveOperators'];\n getPresenceStatus!: OperatorBindings['getPresenceStatus'];\n disconnectPresence!: OperatorBindings['disconnectPresence'];\n getOperatorChatMessages!: OperatorBindings['getOperatorChatMessages'];\n sendOperatorMessage!: OperatorBindings['sendOperatorMessage'];\n\n // Access Grants API\n getMyReceivedGrants!: AccessGrantsBindings['getMyReceivedGrants'];\n getMyGivenGrants!: AccessGrantsBindings['getMyGivenGrants'];\n getAccessGrant!: AccessGrantsBindings['getAccessGrant'];\n createAccessGrant!: AccessGrantsBindings['createAccessGrant'];\n resolveAccessGrant!: AccessGrantsBindings['resolveAccessGrant'];\n revokeAccessGrant!: AccessGrantsBindings['revokeAccessGrant'];\n getAccessGrants!: AccessGrantsBindings['getAccessGrants'];\n getMemberGrants!: AccessGrantsBindings['getMemberGrants'];\n\n // Workspaces API\n getWorkspaces!: WorkspacesBindings['getWorkspaces'];\n getPublicWorkspaces!: WorkspacesBindings['getPublicWorkspaces'];\n getWorkspace!: WorkspacesBindings['getWorkspace'];\n createWorkspace!: WorkspacesBindings['createWorkspace'];\n updateWorkspace!: WorkspacesBindings['updateWorkspace'];\n deleteWorkspace!: WorkspacesBindings['deleteWorkspace'];\n leaveWorkspace!: WorkspacesBindings['leaveWorkspace'];\n getWorkspaceDefaults!: WorkspacesBindings['getWorkspaceDefaults'];\n updateWorkspaceDefaults!: WorkspacesBindings['updateWorkspaceDefaults'];\n getWorkspaceCounts!: WorkspacesBindings['getWorkspaceCounts'];\n getBusinessHoursStatus!: WorkspacesBindings['getBusinessHoursStatus'];\n getAvailableWorkspaceFeatures!: WorkspacesBindings['getAvailableWorkspaceFeatures'];\n getWorkspaceNotices!: WorkspacesBindings['getWorkspaceNotices'];\n getNotifications!: WorkspacesBindings['getNotifications'];\n getNotification!: WorkspacesBindings['getNotification'];\n getUnreadNotificationCount!: WorkspacesBindings['getUnreadNotificationCount'];\n markNotificationAsRead!: WorkspacesBindings['markNotificationAsRead'];\n dismissNotification!: WorkspacesBindings['dismissNotification'];\n dismissAllNotifications!: WorkspacesBindings['dismissAllNotifications'];\n getResellerWorkspaces!: WorkspacesBindings['getResellerWorkspaces'];\n createClientWorkspace!: WorkspacesBindings['createClientWorkspace'];\n getClientWorkspace!: WorkspacesBindings['getClientWorkspace'];\n updateClientWorkspace!: WorkspacesBindings['updateClientWorkspace'];\n deleteClientWorkspace!: WorkspacesBindings['deleteClientWorkspace'];\n provisionClientWorkspace!: WorkspacesBindings['provisionClientWorkspace'];\n getProducts!: WorkspacesBindings['getProducts'];\n getProduct!: WorkspacesBindings['getProduct'];\n getPublicProduct!: WorkspacesBindings['getPublicProduct'];\n createProduct!: WorkspacesBindings['createProduct'];\n updateProduct!: WorkspacesBindings['updateProduct'];\n deleteProduct!: WorkspacesBindings['deleteProduct'];\n resetWorkspaceSecretKey!: WorkspacesBindings['resetWorkspaceSecretKey'];\n exportWorkspace!: WorkspacesBindings['exportWorkspace'];\n previewWorkspaceImport!: WorkspacesBindings['previewWorkspaceImport'];\n importWorkspace!: WorkspacesBindings['importWorkspace'];\n previewImportWorkspace!: WorkspacesBindings['previewImportWorkspace'];\n getWorkspaceThemes!: WorkspacesBindings['getWorkspaceThemes'];\n updateWorkspaceThemes!: WorkspacesBindings['updateWorkspaceThemes'];\n getWorkspaceBySlug!: WorkspacesBindings['getWorkspaceBySlug'];\n getWorkspaceScopes!: WorkspacesBindings['getWorkspaceScopes'];\n getBillingDashboard!: WorkspacesBindings['getBillingDashboard'];\n syncUsageToStripe!: WorkspacesBindings['syncUsageToStripe'];\n getVapidPublicKey!: WorkspacesBindings['getVapidPublicKey'];\n registerPushSubscription!: WorkspacesBindings['registerPushSubscription'];\n unregisterPushSubscription!: WorkspacesBindings['unregisterPushSubscription'];\n listPushSubscriptions!: WorkspacesBindings['listPushSubscriptions'];\n listWorkspaceInvitations!: WorkspacesBindings['listWorkspaceInvitations'];\n listWorkspaceInvitationsAdmin!: WorkspacesBindings['listWorkspaceInvitationsAdmin'];\n getWorkspaceInvitation!: WorkspacesBindings['getWorkspaceInvitation'];\n updateWorkspaceInvitationAdmin!: WorkspacesBindings['updateWorkspaceInvitationAdmin'];\n deleteWorkspaceInvitation!: WorkspacesBindings['deleteWorkspaceInvitation'];\n deleteWorkspaceInvitationAdmin!: WorkspacesBindings['deleteWorkspaceInvitationAdmin'];\n requestWorkspaceMembership!: WorkspacesBindings['requestWorkspaceMembership'];\n approveWorkspaceInvitation!: WorkspacesBindings['approveWorkspaceInvitation'];\n denyWorkspaceInvitation!: WorkspacesBindings['denyWorkspaceInvitation'];\n blockWorkspaceInvitation!: WorkspacesBindings['blockWorkspaceInvitation'];\n inviteToWorkspace!: WorkspacesBindings['inviteToWorkspace'];\n acceptInvitation!: WorkspacesBindings['acceptInvitation'];\n declineInvitation!: WorkspacesBindings['declineInvitation'];\n\n // Auth API\n getUserAccount!: AuthBindings['getUserAccount'];\n updateUserAccount!: AuthBindings['updateUserAccount'];\n login!: AuthBindings['login'];\n resendCode!: AuthBindings['resendCode'];\n verifyCodeWith2FA!: AuthBindings['verifyCodeWith2FA'];\n emailPasswordLogin!: AuthBindings['emailPasswordLogin'];\n emailPasswordSignup!: AuthBindings['emailPasswordSignup'];\n requestMagicLink!: AuthBindings['requestMagicLink'];\n validateMagicLink!: AuthBindings['validateMagicLink'];\n sendEmailVerification!: AuthBindings['sendEmailVerification'];\n verifyEmail!: AuthBindings['verifyEmail'];\n changePassword!: AuthBindings['changePassword'];\n setPassword!: AuthBindings['setPassword'];\n getPasswordStatus!: AuthBindings['getPasswordStatus'];\n logout!: AuthBindings['logout'];\n requestCrossDomainToken!: AuthBindings['requestCrossDomainToken'];\n exchangeToken!: AuthBindings['exchangeToken'];\n getDomainMapping!: AuthBindings['getDomainMapping'];\n createSignup!: AuthBindings['createSignup'];\n createAccount!: AuthBindings['createAccount'];\n getTwoFactorStatus!: AuthBindings['getTwoFactorStatus'];\n setupTOTP!: AuthBindings['setupTOTP'];\n verifyTOTPSetup!: AuthBindings['verifyTOTPSetup'];\n setupWebAuthn!: AuthBindings['setupWebAuthn'];\n verifyWebAuthnSetup!: AuthBindings['verifyWebAuthnSetup'];\n verifyTOTPAuth!: AuthBindings['verifyTOTPAuth'];\n verifyRecoveryCodeAuth!: AuthBindings['verifyRecoveryCodeAuth'];\n getWebAuthnAuthOptions!: AuthBindings['getWebAuthnAuthOptions'];\n verifyWebAuthnAuth!: AuthBindings['verifyWebAuthnAuth'];\n generateRecoveryCodes!: AuthBindings['generateRecoveryCodes'];\n disableTwoFactorMethod!: AuthBindings['disableTwoFactorMethod'];\n updateTwoFactorMethod!: AuthBindings['updateTwoFactorMethod'];\n getMyOrganizations!: AuthBindings['getMyOrganizations'];\n requestCredentialChange!: AuthBindings['requestCredentialChange'];\n verifyCredentialChange!: AuthBindings['verifyCredentialChange'];\n getPendingCredentialChanges!: AuthBindings['getPendingCredentialChanges'];\n cancelCredentialChange!: AuthBindings['cancelCredentialChange'];\n getCredentialChangeInviteDetails!: AuthBindings['getCredentialChangeInviteDetails'];\n confirmCredentialChangeInvite!: AuthBindings['confirmCredentialChangeInvite'];\n getAssignments!: AuthBindings['getAssignments'];\n getAssignment!: AuthBindings['getAssignment'];\n getAssignmentMessages!: AuthBindings['getAssignmentMessages'];\n updateAssignment!: AuthBindings['updateAssignment'];\n deleteAssignment!: AuthBindings['deleteAssignment'];\n getAssignmentTask!: AuthBindings['getAssignmentTask'];\n selectCurrentAssignmentTask!: AuthBindings['selectCurrentAssignmentTask'];\n createAssignment!: AuthBindings['createAssignment'];\n getAssignmentTaskDetail!: AuthBindings['getAssignmentTaskDetail'];\n getAssignmentCelContext!: AuthBindings['getAssignmentCelContext'];\n cancelAssignment!: AuthBindings['cancelAssignment'];\n getAssignmentTools!: AuthBindings['getAssignmentTools'];\n executeAssignmentTool!: AuthBindings['executeAssignmentTool'];\n\n // Sites API\n getSites!: SitesBindings['getSites'];\n checkSiteSlugAvailability!: SitesBindings['checkSiteSlugAvailability'];\n checkSiteDomainAvailability!: SitesBindings['checkSiteDomainAvailability'];\n getSite!: SitesBindings['getSite'];\n getSiteByUuid!: SitesBindings['getSiteByUuid'];\n getSiteRenderedPage!: SitesBindings['getSiteRenderedPage'];\n getSiteRenderedMenu!: SitesBindings['getSiteRenderedMenu'];\n siteSignup!: SitesBindings['siteSignup'];\n siteSendPhoneCode!: SitesBindings['siteSendPhoneCode'];\n siteSendEmailCode!: SitesBindings['siteSendEmailCode'];\n siteVerifyCode!: SitesBindings['siteVerifyCode'];\n siteGoogleOAuthInitiate!: SitesBindings['siteGoogleOAuthInitiate'];\n crawlSite!: SitesBindings['crawlSite'];\n createSite!: SitesBindings['createSite'];\n updateSite!: SitesBindings['updateSite'];\n deleteSite!: SitesBindings['deleteSite'];\n getSitePages!: SitesBindings['getSitePages'];\n getPage!: SitesBindings['getPage'];\n getPageBySlug!: SitesBindings['getPageBySlug'];\n createPage!: SitesBindings['createPage'];\n updatePage!: SitesBindings['updatePage'];\n deletePage!: SitesBindings['deletePage'];\n getSiteCounts!: SitesBindings['getSiteCounts'];\n getSiteMenu!: SitesBindings['getSiteMenu'];\n getMenuItems!: SitesBindings['getMenuItems'];\n createMenuItem!: SitesBindings['createMenuItem'];\n updateMenuItem!: SitesBindings['updateMenuItem'];\n deleteMenuItem!: SitesBindings['deleteMenuItem'];\n reorderMenuItems!: SitesBindings['reorderMenuItems'];\n generateSiteMediaUploadUrl!: SitesBindings['generateSiteMediaUploadUrl'];\n\n // Files API\n getFiles!: FilesBindings['getFiles'];\n getFile!: FilesBindings['getFile'];\n createFile!: FilesBindings['createFile'];\n updateFile!: FilesBindings['updateFile'];\n deleteFile!: FilesBindings['deleteFile'];\n convertFile!: FilesBindings['convertFile'];\n generateFileUploadUrl!: FilesBindings['generateFileUploadUrl'];\n getFolders!: FilesBindings['getFolders'];\n getFolder!: FilesBindings['getFolder'];\n createFolder!: FilesBindings['createFolder'];\n updateFolder!: FilesBindings['updateFolder'];\n deleteFolder!: FilesBindings['deleteFolder'];\n reindexFolder!: FilesBindings['reindexFolder'];\n searchFolder!: FilesBindings['searchFolder'];\n getFileLabels!: FilesBindings['getFileLabels'];\n getFileLabel!: FilesBindings['getFileLabel'];\n getFileLabelByUuid!: FilesBindings['getFileLabelByUuid'];\n createFileLabel!: FilesBindings['createFileLabel'];\n updateFileLabel!: FilesBindings['updateFileLabel'];\n deleteFileLabel!: FilesBindings['deleteFileLabel'];\n getFileSharing!: FilesBindings['getFileSharing'];\n updateFileRoles!: FilesBindings['updateFileRoles'];\n removeFileRole!: FilesBindings['removeFileRole'];\n getFolderSharing!: FilesBindings['getFolderSharing'];\n updateFolderRoles!: FilesBindings['updateFolderRoles'];\n removeFolderRole!: FilesBindings['removeFolderRole'];\n updateFileSharing!: FilesBindings['updateFileSharing'];\n updateFolderSharing!: FilesBindings['updateFolderSharing'];\n // Public Sharing API\n getPublicFile!: FilesBindings['getPublicFile'];\n getPublicFolder!: FilesBindings['getPublicFolder'];\n getPublicFolderFiles!: FilesBindings['getPublicFolderFiles'];\n\n // Events API\n getEventRules!: EventsBindings['getEventRules'];\n getAvailableActions!: EventsBindings['getAvailableActions'];\n searchEventRules!: EventsBindings['searchEventRules'];\n getEventRule!: EventsBindings['getEventRule'];\n createEventRule!: EventsBindings['createEventRule'];\n updateEventRule!: EventsBindings['updateEventRule'];\n deleteEventRule!: EventsBindings['deleteEventRule'];\n reorderEventRules!: EventsBindings['reorderEventRules'];\n getWebhookLogs!: EventsBindings['getWebhookLogs'];\n getRuleExecutions!: EventsBindings['getRuleExecutions'];\n getEvents!: EventsBindings['getEvents'];\n getEvent!: EventsBindings['getEvent'];\n createEvent!: EventsBindings['createEvent'];\n updateEvent!: EventsBindings['updateEvent'];\n deleteEvent!: EventsBindings['deleteEvent'];\n runEvent!: EventsBindings['runEvent'];\n getEventRuns!: EventsBindings['getEventRuns'];\n resetEventRuns!: EventsBindings['resetEventRuns'];\n\n // Workflows API\n getWorkflows!: WorkflowsBindings['getWorkflows'];\n getWorkflow!: WorkflowsBindings['getWorkflow'];\n getWorkflowActivity!: WorkflowsBindings['getWorkflowActivity'];\n getWorkflowsActivityBatch!: WorkflowsBindings['getWorkflowsActivityBatch'];\n getWorkflowDiagram!: WorkflowsBindings['getWorkflowDiagram'];\n getWorkflowThumbnailUrl!: WorkflowsBindings['getWorkflowThumbnailUrl'];\n createWorkflow!: WorkflowsBindings['createWorkflow'];\n updateWorkflow!: WorkflowsBindings['updateWorkflow'];\n getWorkflowDeletionPreview!: WorkflowsBindings['getWorkflowDeletionPreview'];\n deleteWorkflow!: WorkflowsBindings['deleteWorkflow'];\n archiveWorkflow!: WorkflowsBindings['archiveWorkflow'];\n unarchiveWorkflow!: WorkflowsBindings['unarchiveWorkflow'];\n cloneWorkflow!: WorkflowsBindings['cloneWorkflow'];\n getWorkflowTemplates!: WorkflowsBindings['getWorkflowTemplates'];\n createWorkflowFromTemplate!: WorkflowsBindings['createWorkflowFromTemplate'];\n getWorkflowTaskAssignmentStats!: WorkflowsBindings['getWorkflowTaskAssignmentStats'];\n getTaskChats!: WorkflowsBindings['getTaskChats'];\n getWorkflowNotes!: WorkflowsBindings['getWorkflowNotes'];\n getWorkflowNote!: WorkflowsBindings['getWorkflowNote'];\n createWorkflowNote!: WorkflowsBindings['createWorkflowNote'];\n updateWorkflowNote!: WorkflowsBindings['updateWorkflowNote'];\n deleteWorkflowNote!: WorkflowsBindings['deleteWorkflowNote'];\n getWorkflowContributors!: WorkflowsBindings['getWorkflowContributors'];\n createWorkflowContributor!: WorkflowsBindings['createWorkflowContributor'];\n updateWorkflowContributor!: WorkflowsBindings['updateWorkflowContributor'];\n deleteWorkflowContributor!: WorkflowsBindings['deleteWorkflowContributor'];\n getWorkspaceBuilders!: WorkflowsBindings['getWorkspaceBuilders'];\n getWorkspaceBuilder!: WorkflowsBindings['getWorkspaceBuilder'];\n buildWorkspace!: WorkflowsBindings['buildWorkspace'];\n validateWorkflowName!: WorkflowsBindings['validateWorkflowName'];\n getAssistants!: WorkflowsBindings['getAssistants'];\n getAssistant!: WorkflowsBindings['getAssistant'];\n createAssistant!: WorkflowsBindings['createAssistant'];\n updateAssistant!: WorkflowsBindings['updateAssistant'];\n deleteAssistant!: WorkflowsBindings['deleteAssistant'];\n previewTTS!: WorkflowsBindings['previewTTS'];\n getSupervisors!: WorkflowsBindings['getSupervisors'];\n getSupervisor!: WorkflowsBindings['getSupervisor'];\n createSupervisor!: WorkflowsBindings['createSupervisor'];\n updateSupervisor!: WorkflowsBindings['updateSupervisor'];\n deleteSupervisor!: WorkflowsBindings['deleteSupervisor'];\n\n // Calendars API\n getCalendars!: CalendarsBindings['getCalendars'];\n getCalendar!: CalendarsBindings['getCalendar'];\n createCalendar!: CalendarsBindings['createCalendar'];\n updateCalendar!: CalendarsBindings['updateCalendar'];\n deleteCalendar!: CalendarsBindings['deleteCalendar'];\n getCalendarSchedules!: CalendarsBindings['getCalendarSchedules'];\n createCalendarSchedule!: CalendarsBindings['createCalendarSchedule'];\n updateCalendarSchedule!: CalendarsBindings['updateCalendarSchedule'];\n deleteCalendarSchedule!: CalendarsBindings['deleteCalendarSchedule'];\n checkAvailability!: CalendarsBindings['checkAvailability'];\n getAvailableSlots!: CalendarsBindings['getAvailableSlots'];\n getCalendarEvents!: CalendarsBindings['getCalendarEvents'];\n getCalendarEvent!: CalendarsBindings['getCalendarEvent'];\n createCalendarEvent!: CalendarsBindings['createCalendarEvent'];\n updateCalendarEvent!: CalendarsBindings['updateCalendarEvent'];\n cancelCalendarEvent!: CalendarsBindings['cancelCalendarEvent'];\n deleteCalendarEvent!: CalendarsBindings['deleteCalendarEvent'];\n updateEventAttendee!: CalendarsBindings['updateEventAttendee'];\n getCalendarEventTypes!: CalendarsBindings['getCalendarEventTypes'];\n getCalendarEventType!: CalendarsBindings['getCalendarEventType'];\n createCalendarEventType!: CalendarsBindings['createCalendarEventType'];\n updateCalendarEventType!: CalendarsBindings['updateCalendarEventType'];\n deleteCalendarEventType!: CalendarsBindings['deleteCalendarEventType'];\n generateICalToken!: CalendarsBindings['generateICalToken'];\n revokeICalToken!: CalendarsBindings['revokeICalToken'];\n getICalFeedUrl!: CalendarsBindings['getICalFeedUrl'];\n getGoogleCalendarStatus!: CalendarsBindings['getGoogleCalendarStatus'];\n listGoogleCalendars!: CalendarsBindings['listGoogleCalendars'];\n linkCalendarToGoogle!: CalendarsBindings['linkCalendarToGoogle'];\n unlinkCalendarFromGoogle!: CalendarsBindings['unlinkCalendarFromGoogle'];\n syncCalendarWithGoogle!: CalendarsBindings['syncCalendarWithGoogle'];\n getMilestones!: CalendarsBindings['getMilestones'];\n getMilestone!: CalendarsBindings['getMilestone'];\n createMilestone!: CalendarsBindings['createMilestone'];\n updateMilestone!: CalendarsBindings['updateMilestone'];\n deleteMilestone!: CalendarsBindings['deleteMilestone'];\n\n // Communications API\n getPhoneNumbers!: CommunicationsBindings['getPhoneNumbers'];\n getAvailablePhoneNumbers!: CommunicationsBindings['getAvailablePhoneNumbers'];\n requestPhoneNumber!: CommunicationsBindings['requestPhoneNumber'];\n getPhoneNumber!: CommunicationsBindings['getPhoneNumber'];\n createPhoneNumber!: CommunicationsBindings['createPhoneNumber'];\n updatePhoneNumber!: CommunicationsBindings['updatePhoneNumber'];\n deletePhoneNumber!: CommunicationsBindings['deletePhoneNumber'];\n getPhoneNumberCalls!: CommunicationsBindings['getPhoneNumberCalls'];\n getPhoneNumberMessages!: CommunicationsBindings['getPhoneNumberMessages'];\n getInboxes!: CommunicationsBindings['getInboxes'];\n getInbox!: CommunicationsBindings['getInbox'];\n createInbox!: CommunicationsBindings['createInbox'];\n updateInbox!: CommunicationsBindings['updateInbox'];\n deleteInbox!: CommunicationsBindings['deleteInbox'];\n getInboxEmails!: CommunicationsBindings['getInboxEmails'];\n getInboxEmail!: CommunicationsBindings['getInboxEmail'];\n markEmailAsRead!: CommunicationsBindings['markEmailAsRead'];\n markEmailAsUnread!: CommunicationsBindings['markEmailAsUnread'];\n convertEmail!: CommunicationsBindings['convertEmail'];\n downloadEmailAttachment!: CommunicationsBindings['downloadEmailAttachment'];\n getInboxThreads!: CommunicationsBindings['getInboxThreads'];\n getThreadEmails!: CommunicationsBindings['getThreadEmails'];\n getChatEmails!: CommunicationsBindings['getChatEmails'];\n getNotificationRules!: CommunicationsBindings['getNotificationRules'];\n createNotificationRule!: CommunicationsBindings['createNotificationRule'];\n updateNotificationRule!: CommunicationsBindings['updateNotificationRule'];\n deleteNotificationRule!: CommunicationsBindings['deleteNotificationRule'];\n\n // Toolkits API\n getToolkits!: ToolkitsBindings['getToolkits'];\n getTool!: ToolkitsBindings['getTool'];\n getTemplateContext!: ToolkitsBindings['getTemplateContext'];\n previewTemplate!: ToolkitsBindings['previewTemplate'];\n getVariableRegistry!: ToolkitsBindings['getVariableRegistry'];\n getChatModels!: ToolkitsBindings['getChatModels'];\n getRealtimeModels!: ToolkitsBindings['getRealtimeModels'];\n getVoiceModels!: ToolkitsBindings['getVoiceModels'];\n getAllModels!: ToolkitsBindings['getAllModels'];\n getCustomToolkits!: ToolkitsBindings['getCustomToolkits'];\n getCustomToolkit!: ToolkitsBindings['getCustomToolkit'];\n createCustomToolkit!: ToolkitsBindings['createCustomToolkit'];\n updateCustomToolkit!: ToolkitsBindings['updateCustomToolkit'];\n deleteCustomToolkit!: ToolkitsBindings['deleteCustomToolkit'];\n enableCustomToolkit!: ToolkitsBindings['enableCustomToolkit'];\n disableCustomToolkit!: ToolkitsBindings['disableCustomToolkit'];\n createCustomTool!: ToolkitsBindings['createCustomTool'];\n updateCustomTool!: ToolkitsBindings['updateCustomTool'];\n deleteCustomTool!: ToolkitsBindings['deleteCustomTool'];\n getMcpServers!: ToolkitsBindings['getMcpServers'];\n getMcpServer!: ToolkitsBindings['getMcpServer'];\n createMcpServer!: ToolkitsBindings['createMcpServer'];\n updateMcpServer!: ToolkitsBindings['updateMcpServer'];\n deleteMcpServer!: ToolkitsBindings['deleteMcpServer'];\n enableMcpServer!: ToolkitsBindings['enableMcpServer'];\n disableMcpServer!: ToolkitsBindings['disableMcpServer'];\n getMcpServerTools!: ToolkitsBindings['getMcpServerTools'];\n getMcpServerResources!: ToolkitsBindings['getMcpServerResources'];\n getMcpServerPrompts!: ToolkitsBindings['getMcpServerPrompts'];\n testMcpServerConnection!: ToolkitsBindings['testMcpServerConnection'];\n discoverOAuthMetadata!: ToolkitsBindings['discoverOAuthMetadata'];\n getFeatureRegistry!: ToolkitsBindings['getFeatureRegistry'];\n getFeatureBySlug!: ToolkitsBindings['getFeatureBySlug'];\n\n // Billing API\n getApiKeys!: BillingBindings['getApiKeys'];\n createApiKey!: BillingBindings['createApiKey'];\n revokeApiKey!: BillingBindings['revokeApiKey'];\n getGlobalApiKeys!: BillingBindings['getGlobalApiKeys'];\n createGlobalApiKey!: BillingBindings['createGlobalApiKey'];\n revokeGlobalApiKey!: BillingBindings['revokeGlobalApiKey'];\n getSubscriptions!: BillingBindings['getSubscriptions'];\n getWorkspaceSubscriptions!: BillingBindings['getWorkspaceSubscriptions'];\n cancelSubscription!: BillingBindings['cancelSubscription'];\n reactivateSubscription!: BillingBindings['reactivateSubscription'];\n updateSubscription!: BillingBindings['updateSubscription'];\n provisionMemberRole!: BillingBindings['provisionMemberRole'];\n getAIUsageReport!: BillingBindings['getAIUsageReport'];\n getSMSUsageReport!: BillingBindings['getSMSUsageReport'];\n getPhoneUsageReport!: BillingBindings['getPhoneUsageReport'];\n getVoiceUsageReport!: BillingBindings['getVoiceUsageReport'];\n getMemberUsage!: BillingBindings['getMemberUsage'];\n\n // Apps API\n listApps!: AppsBindings['listApps'];\n createApp!: AppsBindings['createApp'];\n getApp!: AppsBindings['getApp'];\n getAppByClientId!: AppsBindings['getAppByClientId'];\n updateApp!: AppsBindings['updateApp'];\n deleteApp!: AppsBindings['deleteApp'];\n regenerateClientSecret!: AppsBindings['regenerateClientSecret'];\n listBuilders!: AppsBindings['listBuilders'];\n getBuilder!: AppsBindings['getBuilder'];\n getBuilderApps!: AppsBindings['getBuilderApps'];\n createBuilder!: AppsBindings['createBuilder'];\n updateBuilder!: AppsBindings['updateBuilder'];\n deleteBuilder!: AppsBindings['deleteBuilder'];\n createInquiry!: AppsBindings['createInquiry'];\n listInquiries!: AppsBindings['listInquiries'];\n getInquiry!: AppsBindings['getInquiry'];\n updateInquiry!: AppsBindings['updateInquiry'];\n deleteInquiry!: AppsBindings['deleteInquiry'];\n exportInquiriesCsv!: AppsBindings['exportInquiriesCsv'];\n authorize!: AppsBindings['authorize'];\n exchangeOAuthToken!: AppsBindings['exchangeOAuthToken'];\n getAvailableScopes!: AppsBindings['getAvailableScopes'];\n getOAuthConnectionStatus!: AppsBindings['getOAuthConnectionStatus'];\n getOAuthAuthorizationUrl!: AppsBindings['getOAuthAuthorizationUrl'];\n disconnectOAuthProvider!: AppsBindings['disconnectOAuthProvider'];\n\n // Integrations API\n getMondayBoards!: IntegrationsBindings['getMondayBoards'];\n getMondayBoardColumns!: IntegrationsBindings['getMondayBoardColumns'];\n getMondayBoardGroups!: IntegrationsBindings['getMondayBoardGroups'];\n createMondayWebhook!: IntegrationsBindings['createMondayWebhook'];\n deleteMondayWebhook!: IntegrationsBindings['deleteMondayWebhook'];\n getMondayWebhook!: IntegrationsBindings['getMondayWebhook'];\n getMondayCurrentUserInfo!: IntegrationsBindings['getMondayCurrentUserInfo'];\n\n // Discord Bots API\n getDiscordBots!: IntegrationsBindings['getDiscordBots'];\n getDiscordBot!: IntegrationsBindings['getDiscordBot'];\n getDiscordBotByUuid!: IntegrationsBindings['getDiscordBotByUuid'];\n createDiscordBot!: IntegrationsBindings['createDiscordBot'];\n updateDiscordBot!: IntegrationsBindings['updateDiscordBot'];\n deleteDiscordBot!: IntegrationsBindings['deleteDiscordBot'];\n registerDiscordSlashCommands!: IntegrationsBindings['registerDiscordSlashCommands'];\n registerLinkedRolesMetadata!: IntegrationsBindings['registerLinkedRolesMetadata'];\n getDiscordThreads!: IntegrationsBindings['getDiscordThreads'];\n getDiscordGuilds!: IntegrationsBindings['getDiscordGuilds'];\n getDiscordBotAccounts!: IntegrationsBindings['getDiscordBotAccounts'];\n getMyCredentials!: IntegrationsBindings['getMyCredentials'];\n unlinkCredential!: IntegrationsBindings['unlinkCredential'];\n\n // Slack Apps API\n getSlackApps!: IntegrationsBindings['getSlackApps'];\n getSlackApp!: IntegrationsBindings['getSlackApp'];\n createSlackApp!: IntegrationsBindings['createSlackApp'];\n updateSlackApp!: IntegrationsBindings['updateSlackApp'];\n deleteSlackApp!: IntegrationsBindings['deleteSlackApp'];\n getSlackThreads!: IntegrationsBindings['getSlackThreads'];\n getSlackInstallations!: IntegrationsBindings['getSlackInstallations'];\n getSlackAppAccounts!: IntegrationsBindings['getSlackAppAccounts'];\n\n // FHIR Connections API\n getFhirConnections!: IntegrationsBindings['getFhirConnections'];\n getFhirConnection!: IntegrationsBindings['getFhirConnection'];\n getFhirConnectionByUuid!: IntegrationsBindings['getFhirConnectionByUuid'];\n createFhirConnection!: IntegrationsBindings['createFhirConnection'];\n updateFhirConnection!: IntegrationsBindings['updateFhirConnection'];\n deleteFhirConnection!: IntegrationsBindings['deleteFhirConnection'];\n testFhirConnection!: IntegrationsBindings['testFhirConnection'];\n fhirSearchPatients!: IntegrationsBindings['fhirSearchPatients'];\n fhirSearchPractitioners!: IntegrationsBindings['fhirSearchPractitioners'];\n fhirSearchLocations!: IntegrationsBindings['fhirSearchLocations'];\n fhirFetchCareTeam!: IntegrationsBindings['fhirFetchCareTeam'];\n fhirFetchEncounters!: IntegrationsBindings['fhirFetchEncounters'];\n fhirCreateEncounter!: IntegrationsBindings['fhirCreateEncounter'];\n\n // App Connections API\n listAvailableAppConnections!: IntegrationsBindings['listAvailableAppConnections'];\n listAppConnections!: IntegrationsBindings['listAppConnections'];\n enablePlatformApp!: IntegrationsBindings['enablePlatformApp'];\n getPlatformApp!: IntegrationsBindings['getPlatformApp'];\n updatePlatformApp!: IntegrationsBindings['updatePlatformApp'];\n deletePlatformApp!: IntegrationsBindings['deletePlatformApp'];\n\n // Pronunciations API\n getPronunciationEntries!: PronunciationsBindings['getPronunciationEntries'];\n createPronunciationEntry!: PronunciationsBindings['createPronunciationEntry'];\n updatePronunciationEntry!: PronunciationsBindings['updatePronunciationEntry'];\n deletePronunciationEntry!: PronunciationsBindings['deletePronunciationEntry'];\n exportPronunciationEntries!: PronunciationsBindings['exportPronunciationEntries'];\n importPronunciationEntries!: PronunciationsBindings['importPronunciationEntries'];\n getMyPronunciations!: PronunciationsBindings['getMyPronunciations'];\n createMyPronunciation!: PronunciationsBindings['createMyPronunciation'];\n updateMyPronunciation!: PronunciationsBindings['updateMyPronunciation'];\n deleteMyPronunciation!: PronunciationsBindings['deleteMyPronunciation'];\n suggestPronunciations!: PronunciationsBindings['suggestPronunciations'];\n getRecommendedVoices!: PronunciationsBindings['getRecommendedVoices'];\n previewPronunciation!: PronunciationsBindings['previewPronunciation'];\n\n constructor(apiKey: string | undefined, baseUrl: string, customFetch?: typeof fetch) {\n // Create all API modules\n const apis = createApiModules(apiKey, baseUrl, customFetch);\n\n // Store all modules for cross-cutting operations\n this.apis = apis;\n\n // Store workspace invitations for public access\n this.workspaceInvitations = apis.workspaceInvitations;\n\n // Bind all public methods from each domain\n bindTasksMethods(this, apis.tasks, apis.abilities);\n bindChatsMethods(this, apis.chats);\n bindCallsMethods(this, apis.calls, apis.cel);\n bindDataTypesMethods(this, apis.dataTypes);\n bindMembersMethods(this, apis.members);\n bindAgentsMethods(this, apis.agents);\n bindQualificationsMethods(this, apis.qualifications);\n bindOperatorMethods(this, apis.operatorGroups);\n bindAccessGrantsMethods(this, apis.accessGrants);\n bindWorkspacesMethods(this, apis.workspaces, apis.workspaceInvitations);\n bindAuthMethods(this, apis.auth, apis.assignments);\n bindSitesMethods(this, apis.sites);\n bindFilesMethods(this, apis.files);\n bindEventsMethods(this, apis.events);\n bindWorkflowsMethods(\n this,\n apis.workflows,\n apis.workflowNotes,\n apis.assistants,\n apis.supervisors\n );\n bindCalendarsMethods(this, apis.calendars, apis.milestones);\n bindCommunicationsMethods(this, apis.phoneNumbers, apis.inboxes, apis.notificationRules);\n bindToolkitsMethods(\n this,\n apis.toolkits,\n apis.templates,\n apis.aiModels,\n apis.customToolkits,\n apis.mcpServers,\n apis.features\n );\n bindBillingMethods(this, apis.apiKeys, apis.subscriptions, apis.reports);\n bindAppsMethods(\n this,\n apis.apps,\n apis.builders,\n apis.inquiries,\n apis.oauth,\n apis.oauthConnections\n );\n bindIntegrationsMethods(\n this,\n apis.mondayIntegration,\n apis.discordBots,\n apis.slackApps,\n apis.fhirConnections,\n apis.appConnections\n );\n bindPronunciationsMethods(this, apis.pronunciations);\n }\n\n /**\n * Set the handler for enhanced authentication requirements (RFC 9470 Step-Up Auth).\n * This handler is called when a 401 response includes WWW-Authenticate header\n * with error=\"insufficient_user_authentication\".\n * Propagates to all API modules.\n */\n setEnhancedAuthHandler(handler: EnhancedAuthHandler | undefined) {\n // Propagate to all API modules\n Object.values(this.apis).forEach((api) => {\n if (typeof api.setEnhancedAuthHandler === 'function') {\n api.setEnhancedAuthHandler(handler);\n }\n });\n }\n\n /**\n * Set the handler for organization authentication requirements.\n * This handler is called when a 401 response includes WWW-Authenticate header\n * with realm=\"org\".\n * Propagates to all API modules.\n */\n setOrgAuthHandler(handler: OrgAuthHandler | undefined) {\n // Propagate to all API modules\n Object.values(this.apis).forEach((api) => {\n if (typeof api.setOrgAuthHandler === 'function') {\n api.setOrgAuthHandler(handler);\n }\n });\n }\n\n /**\n * Update the API key across all modules.\n * Used after successful re-authentication.\n */\n updateApiKey(newApiKey: string) {\n Object.values(this.apis).forEach((api) => {\n if (typeof api.updateApiKey === 'function') {\n api.updateApiKey(newApiKey);\n }\n });\n }\n\n /**\n * Set the acting member UUID for member identity switching.\n * When set, all API requests will include the X-Acting-Member header.\n * The backend will validate that the authenticated account owns this member\n * and use it as the effective identity for the request.\n * Propagates to all API modules.\n */\n setActingMember(memberUuid: string | undefined) {\n Object.values(this.apis).forEach((api) => {\n if (typeof api.setActingMember === 'function') {\n api.setActingMember(memberUuid);\n }\n });\n }\n\n /**\n * Get the current acting member UUID.\n * Returns undefined if no member switch is active.\n */\n getActingMember(): string | undefined {\n // Get from the first API module that has this method\n for (const api of Object.values(this.apis)) {\n if (typeof api.getActingMember === 'function') {\n return api.getActingMember();\n }\n }\n return undefined;\n }\n}\n\n/**\n * ApiClient extends GravityRailClient with admin/superuser methods.\n *\n * This is the full-featured client used internally. For the public SDK,\n * use {@link GravityRailClient} which excludes admin functionality.\n */\nexport class ApiClient extends GravityRailClient implements AdminBindings {\n // Admin API\n getAccounts!: AdminBindings['getAccounts'];\n getAccountDetails!: AdminBindings['getAccountDetails'];\n getAccountByUuid!: AdminBindings['getAccountByUuid'];\n getAccountMemberships!: AdminBindings['getAccountMemberships'];\n getAccountOrgMemberships!: AdminBindings['getAccountOrgMemberships'];\n createAccountOrgMembership!: AdminBindings['createAccountOrgMembership'];\n deleteAccountOrgMembership!: AdminBindings['deleteAccountOrgMembership'];\n getAccountMembership!: AdminBindings['getAccountMembership'];\n updateAccountMembership!: AdminBindings['updateAccountMembership'];\n createAccountMembership!: AdminBindings['createAccountMembership'];\n deleteAccountMembership!: AdminBindings['deleteAccountMembership'];\n updateAccountAsAdmin!: AdminBindings['updateAccountAsAdmin'];\n createAccountAsAdmin!: AdminBindings['createAccountAsAdmin'];\n deleteAccountAsAdmin!: AdminBindings['deleteAccountAsAdmin'];\n lookupAccount!: AdminBindings['lookupAccount'];\n getOrganizations!: AdminBindings['getOrganizations'];\n getOrganization!: AdminBindings['getOrganization'];\n createOrganization!: AdminBindings['createOrganization'];\n updateOrganization!: AdminBindings['updateOrganization'];\n deleteOrganization!: AdminBindings['deleteOrganization'];\n joinOrganization!: AdminBindings['joinOrganization'];\n leaveOrganization!: AdminBindings['leaveOrganization'];\n generateLogoUploadUrl!: AdminBindings['generateLogoUploadUrl'];\n importProducts!: AdminBindings['importProducts'];\n createProductAsAdmin!: AdminBindings['createProductAsAdmin'];\n getProductsAsAdmin!: AdminBindings['getProductsAsAdmin'];\n getProductAsAdmin!: AdminBindings['getProductAsAdmin'];\n updateProductAsAdmin!: AdminBindings['updateProductAsAdmin'];\n deleteProductAsAdmin!: AdminBindings['deleteProductAsAdmin'];\n getWorkspacesAsAdmin!: AdminBindings['getWorkspacesAsAdmin'];\n getWorkspaceAsAdmin!: AdminBindings['getWorkspaceAsAdmin'];\n getWorkspaceByNumericIdAsAdmin!: AdminBindings['getWorkspaceByNumericIdAsAdmin'];\n createWorkspaceAsAdmin!: AdminBindings['createWorkspaceAsAdmin'];\n updateWorkspaceAsAdmin!: AdminBindings['updateWorkspaceAsAdmin'];\n deleteWorkspaceAsAdmin!: AdminBindings['deleteWorkspaceAsAdmin'];\n createSchemaAsAdmin!: AdminBindings['createSchemaAsAdmin'];\n migrateSchemaAsAdmin!: AdminBindings['migrateSchemaAsAdmin'];\n provisionWorkspaceAsAdmin!: AdminBindings['provisionWorkspaceAsAdmin'];\n refreshProvisionStatusAsAdmin!: AdminBindings['refreshProvisionStatusAsAdmin'];\n enableMaintenanceMode!: AdminBindings['enableMaintenanceMode'];\n disableMaintenanceMode!: AdminBindings['disableMaintenanceMode'];\n getWorkspaceHealth!: AdminBindings['getWorkspaceHealth'];\n provisionPlanFeatures!: AdminBindings['provisionPlanFeatures'];\n mergeMembers!: AdminBindings['mergeMembers'];\n getAdminWorkspaceMember!: AdminBindings['getAdminWorkspaceMember'];\n createAdminWorkspaceMember!: AdminBindings['createAdminWorkspaceMember'];\n updateAdminWorkspaceMember!: AdminBindings['updateAdminWorkspaceMember'];\n getAdminWorkspaceMemberRoles!: AdminBindings['getAdminWorkspaceMemberRoles'];\n getMissingMemberships!: AdminBindings['getMissingMemberships'];\n linkMissingMembership!: AdminBindings['linkMissingMembership'];\n createPhoneNumberMapping!: AdminBindings['createPhoneNumberMapping'];\n deletePhoneNumberMapping!: AdminBindings['deletePhoneNumberMapping'];\n getPhoneNumberMappings!: AdminBindings['getPhoneNumberMappings'];\n getPhoneNumberMapping!: AdminBindings['getPhoneNumberMapping'];\n createAdminPhoneNumberMapping!: AdminBindings['createAdminPhoneNumberMapping'];\n deleteAdminPhoneNumberMapping!: AdminBindings['deleteAdminPhoneNumberMapping'];\n getAvailableWorkspacesForPhone!: AdminBindings['getAvailableWorkspacesForPhone'];\n remapPhoneNumber!: AdminBindings['remapPhoneNumber'];\n getUnmappedPhoneNumbers!: AdminBindings['getUnmappedPhoneNumbers'];\n getWorkspaceUnmappedPhoneNumbers!: AdminBindings['getWorkspaceUnmappedPhoneNumbers'];\n getWorkspacePhoneNumbersAsAdmin!: AdminBindings['getWorkspacePhoneNumbersAsAdmin'];\n getProviderPhoneNumbers!: AdminBindings['getProviderPhoneNumbers'];\n getProviderPhoneNumber!: AdminBindings['getProviderPhoneNumber'];\n updatePhoneNumberStatus!: AdminBindings['updatePhoneNumberStatus'];\n syncPhoneNumbersFromProviders!: AdminBindings['syncPhoneNumbersFromProviders'];\n approvePhoneNumberRequest!: AdminBindings['approvePhoneNumberRequest'];\n rejectPhoneNumberRequest!: AdminBindings['rejectPhoneNumberRequest'];\n startBulkPhoneClassification!: AdminBindings['startBulkPhoneClassification'];\n getSiteMappings!: AdminBindings['getSiteMappings'];\n getSiteMapping!: AdminBindings['getSiteMapping'];\n updateSiteMapping!: AdminBindings['updateSiteMapping'];\n updateSiteMappingWorkspace!: AdminBindings['updateSiteMappingWorkspace'];\n adminDeleteSiteMapping!: AdminBindings['adminDeleteSiteMapping'];\n createSiteMapping!: AdminBindings['createSiteMapping'];\n createOrUpdateSiteMapping!: AdminBindings['createOrUpdateSiteMapping'];\n deleteSiteMapping!: AdminBindings['deleteSiteMapping'];\n getInboxMappings!: AdminBindings['getInboxMappings'];\n getInboxMapping!: AdminBindings['getInboxMapping'];\n updateInboxMapping!: AdminBindings['updateInboxMapping'];\n deleteAdminInboxMapping!: AdminBindings['deleteAdminInboxMapping'];\n generateChatSummaries!: AdminBindings['generateChatSummaries'];\n executeQuery!: AdminBindings['executeQuery'];\n triggerPeriodicJob!: AdminBindings['triggerPeriodicJob'];\n listAllThemes!: AdminBindings['listAllThemes'];\n startBulkTOSAcceptance!: AdminBindings['startBulkTOSAcceptance'];\n startTokenUsageBackfill!: AdminBindings['startTokenUsageBackfill'];\n updateChatMessage!: AdminBindings['updateChatMessage'];\n getStripeCustomer!: AdminBindings['getStripeCustomer'];\n createStripeCustomer!: AdminBindings['createStripeCustomer'];\n updateStripeCustomer!: AdminBindings['updateStripeCustomer'];\n getStripeSubscriptions!: AdminBindings['getStripeSubscriptions'];\n createStripeSubscription!: AdminBindings['createStripeSubscription'];\n updateStripeSubscription!: AdminBindings['updateStripeSubscription'];\n cancelStripeSubscription!: AdminBindings['cancelStripeSubscription'];\n provisionWorkspaceForSubscription!: AdminBindings['provisionWorkspaceForSubscription'];\n associateWorkspaceWithSubscription!: AdminBindings['associateWorkspaceWithSubscription'];\n createSubscriptionPaymentLink!: AdminBindings['createSubscriptionPaymentLink'];\n createSetupIntent!: AdminBindings['createSetupIntent'];\n getStripePaymentMethods!: AdminBindings['getStripePaymentMethods'];\n attachStripePaymentMethod!: AdminBindings['attachStripePaymentMethod'];\n detachStripePaymentMethod!: AdminBindings['detachStripePaymentMethod'];\n setDefaultStripePaymentMethod!: AdminBindings['setDefaultStripePaymentMethod'];\n previewWorkspaceOrganizationChange!: AdminBindings['previewWorkspaceOrganizationChange'];\n changeWorkspaceOrganization!: AdminBindings['changeWorkspaceOrganization'];\n createStripeInvoice!: AdminBindings['createStripeInvoice'];\n getStripeInvoices!: AdminBindings['getStripeInvoices'];\n getStripeUpcomingInvoice!: AdminBindings['getStripeUpcomingInvoice'];\n getWorkspaceBillingDashboard!: AdminBindings['getWorkspaceBillingDashboard'];\n syncWorkspaceUsageToStripe!: AdminBindings['syncWorkspaceUsageToStripe'];\n compareProductsWithStripe!: AdminBindings['compareProductsWithStripe'];\n syncProductToStripe!: AdminBindings['syncProductToStripe'];\n searchStripeProducts!: AdminBindings['searchStripeProducts'];\n getUsageReport!: AdminBindings['getUsageReport'];\n getSubscriptionsAsAdmin!: AdminBindings['getSubscriptionsAsAdmin'];\n getVoiceMetrics!: AdminBindings['getVoiceMetrics'];\n getHealthMetrics!: AdminBindings['getHealthMetrics'];\n\n constructor(apiKey: string | undefined, baseUrl: string, customFetch?: typeof fetch) {\n super(apiKey, baseUrl, customFetch);\n bindAdminMethods(this, this.apis.admin);\n }\n}\n","/**\n * Ability types for the Agent Abilities system.\n *\n * Abilities are composable units of agent behavior that can be attached\n * to workflows or tasks.\n */\n\n// ============================================================\n// Ability Type Slugs\n// ============================================================\n\n/** Known ability type slugs */\nexport const AbilityTypeSlugs = {\n // Tools\n TOOLKITS: 'tools:toolkits',\n WEB_SEARCH: 'tools:web_search',\n CONVERSATION_HISTORY: 'tools:conversation_history',\n\n // Integration\n CALENDAR_BOOKING: 'integration:calendar_booking',\n FILE_ACCESS: 'integration:file_access',\n DATA_ACCESS: 'integration:data_access',\n GMAIL: 'integration:gmail',\n\n // Communication\n PHONE_CALL_TOOLS: 'communication:phone_call_tools',\n\n // Oversight\n SUPERVISOR: 'oversight:supervisor',\n SUPERVISOR_ACTIONS: 'oversight:supervisor_actions',\n ESCALATION: 'oversight:escalation',\n\n // System (auto-injected, hidden from users)\n USER_MESSAGE_RULES: 'system:user_message_rules',\n ASSISTANT_MESSAGE_RULES: 'chat:assistant_message_rules',\n CEL_ROUTING: 'system:cel_routing',\n} as const;\n\n/** Type for ability type slug values */\nexport type AbilityTypeSlug = (typeof AbilityTypeSlugs)[keyof typeof AbilityTypeSlugs];\n\n// ============================================================\n// Ability Config Types\n// ============================================================\n\n/** Config for calendar_booking ability */\nexport interface CalendarBookingAbilityConfig {\n calendarUuid: string;\n /** Optional: specific event type UUID, or undefined to allow all event types */\n eventTypeUuid?: string;\n canEditBookings?: boolean;\n}\n\n/** Config for a single folder access entry */\nexport interface FolderAccessEntry {\n /** ID of the folder to provide access to */\n folderId: number;\n /** Allow reading file contents (default: true) */\n canRead?: boolean;\n /** Allow listing folder contents (default: true) */\n canList?: boolean;\n /** Allow searching files (requires folder to be indexed, default: false) */\n canSearch?: boolean;\n /** Allow creating new files in the folder (default: false) */\n canCreate?: boolean;\n /** Optional hint for the LLM about when/how to use this folder */\n hint?: string;\n}\n\n/** Config for a single file access entry */\nexport interface FileAccessEntry {\n /** ID of the file to provide access to */\n fileId: number;\n /** Allow reading file contents (default: true) */\n canRead?: boolean;\n /** Allow writing/editing file contents (default: false) */\n canWrite?: boolean;\n /** Optional hint for the LLM about when/how to use this file */\n hint?: string;\n}\n\n/** Config for file_access ability - supports multiple folders and files */\nexport interface FileAccessAbilityConfig {\n /** List of folders with their access permissions */\n folders?: FolderAccessEntry[];\n /** List of individual files with their access permissions */\n files?: FileAccessEntry[];\n}\n\n/** Config for supervisor ability - matches InvokeSupervisorActionParams */\nexport interface SupervisorAbilityConfig {\n /** ID of the supervisor CustomTool (must have tool_type='supervisor') */\n customToolId: number;\n /** Whether to include full conversation history when invoking the supervisor */\n includeHistory?: boolean;\n}\n\n/** Config for supervisor_actions ability - defines what actions a supervisor can take */\nexport interface SupervisorActionsAbilityConfig {\n /** Allow supervisor to provide suggestions to the main assistant (not visible to user) */\n suggestResponse?: boolean;\n /** Allow supervisor to send messages directly to the user */\n overrideResponse?: boolean;\n /** Allow supervisor to pause the conversation */\n pauseChat?: boolean;\n}\n\n/** Config for toolkits ability */\nexport interface ToolkitsAbilityConfig {\n /** List of tool names to add to the agent */\n tools: string[];\n}\n\n/** Config for data_access ability */\nexport interface DataAccessAbilityConfig {\n /** UUID of the data type to provide tools for */\n dataTypeUuid: string;\n /** Whether the agent can create new records (default: false) */\n canCreate?: boolean;\n /** Whether the agent can list and search records (default: true) */\n canRead?: boolean;\n /** Whether the agent can update existing records (default: false) */\n canEdit?: boolean;\n /** Whether the agent can verify record data (default: false) */\n canVerify?: boolean;\n /** Whether the agent can list all members' records (default: false) */\n canListAll?: boolean;\n /** Whether the agent can search records by geographic location (default: false) */\n canGeolocate?: boolean;\n /** Whether the agent can delete records (default: false) */\n canDelete?: boolean;\n}\n\n/** Config for phone_call_tools ability */\nexport interface PhoneCallToolsAbilityConfig {\n /** Allow the agent to forward the call to another number (phone-voice and web-voice) */\n canForward?: boolean;\n}\n\n/** Config for escalation ability */\nexport interface EscalationAbilityConfig {\n /** Message shown when chat is paused for escalation. If not set, uses workspace default. */\n pausedMessage?: string | null;\n /** Message shown when agents are notified. If not set, uses workspace default. */\n notifiedMessage?: string | null;\n /** Message shown during business hours. If not set, uses workspace default. */\n onlineMessage?: string | null;\n /** Message shown outside business hours. If not set, uses workspace default. */\n offlineMessage?: string | null;\n /** Whether to pause the chat on escalation. If not set, uses workspace default. */\n pauseOnEscalate?: boolean | null;\n /** List of member IDs to notify first for this workflow/task escalations. */\n priorityMemberIds?: number[] | null;\n}\n\n/** Config for web_search ability */\nexport interface WebSearchAbilityConfig {\n /** Enable web search capability (default: true) */\n web?: boolean;\n /** Enable local search for businesses, restaurants, and POIs (default: false) */\n local?: boolean;\n}\n\n/** Config for conversation_history ability */\nexport interface ConversationHistoryAbilityConfig {\n /** Enable listing prior chat conversations (default: true) */\n list_chats?: boolean;\n /** Enable reading messages from prior chats (default: true) */\n read_messages?: boolean;\n}\n\n/** Config for gmail ability - no configuration needed (feature flag controlled) */\nexport type GmailAbilityConfig = EmptyAbilityConfig;\n\n/** Config for abilities with no configuration */\nexport type EmptyAbilityConfig = Record<string, never>;\n\n/** Union type of all ability configs */\nexport type AbilityConfig =\n | CalendarBookingAbilityConfig\n | FileAccessAbilityConfig\n | SupervisorAbilityConfig\n | SupervisorActionsAbilityConfig\n | ToolkitsAbilityConfig\n | DataAccessAbilityConfig\n | PhoneCallToolsAbilityConfig\n | EscalationAbilityConfig\n | WebSearchAbilityConfig\n | ConversationHistoryAbilityConfig\n | GmailAbilityConfig\n | EmptyAbilityConfig\n | Record<string, unknown>; // Fallback for unknown ability types\n\n/**\n * Represents an ability type from the code registry.\n * This describes what an ability does, not an instance of it.\n */\nexport interface AbilityType {\n slug: string;\n title: string;\n category: string | null;\n description: string | null;\n configSchema: Record<string, unknown>;\n /** If true, only one instance of this ability can exist per scope */\n singleton: boolean;\n}\n\n/**\n * Response containing available ability types.\n */\nexport interface AbilityTypesResponse {\n types: AbilityType[];\n}\n\n/**\n * A configured ability instance attached to a workflow, task, toolkit, or tool.\n * UUID is the primary identifier for matching and creating abilities.\n * Scope (workflow/task/toolkit/tool) is implicit from the parent object.\n * Title/category are looked up client-side from the ability type registry.\n * Order is computed from array position on the server.\n */\nexport interface Ability {\n uuid: string;\n abilityType: string;\n config: AbilityConfig;\n enabled: boolean;\n celCondition: string | null;\n}\n","// Assistant-related types extracted from main types.ts file\n// This file contains all types related to AI assistants, models, engines, and assistant management\n\nimport type { AssistantSortField } from './sortTypes';\n\n// Realtime Model Configuration Types\n\nexport type OpenAITurnDetectionType = 'semantic_vad' | 'server_vad';\nexport type OpenAISemanticVADEagerness = 'low' | 'medium' | 'high' | 'auto';\n\nexport interface OpenAISemanticVADTurnDetection {\n type: 'semantic_vad';\n eagerness?: OpenAISemanticVADEagerness;\n create_response?: boolean; // automatically create response when user turn ends\n interrupt_response?: boolean; // allow user to interrupt the response\n}\n\nexport interface OpenAIServerVADTurnDetection {\n type: 'server_vad';\n threshold?: number; // 0.0 to 1.0\n prefix_padding_ms?: number; // milliseconds\n silence_duration_ms?: number; // milliseconds\n create_response?: boolean; // automatically create response when user turn ends\n interrupt_response?: boolean; // allow user to interrupt the response\n}\n\nexport type OpenAITurnDetection = OpenAISemanticVADTurnDetection | OpenAIServerVADTurnDetection;\n\nexport type ThinkingSound = 'none' | 'typing' | 'strumming';\nexport type TTSModel =\n | 'native'\n | 'elevenlabs:tts:eleven_turbo_v2'\n | 'elevenlabs:tts:eleven_turbo_v2_5'\n | 'elevenlabs:tts:eleven_multilingual_v2'\n | 'elevenlabs:tts:eleven_flash_v2_5'\n | 'openai:tts:tts-1'\n | 'openai:tts:tts-1-hd'\n | 'aws:tts:polly-generative'\n | 'aws:tts:polly-neural'\n | 'google:tts:chirp';\n\n/** Extract the provider from a TTSModel ID (e.g. \"elevenlabs:tts:eleven_flash_v2_5\" → \"elevenlabs\"). */\nexport function getTTSProvider(ttsModel: string | null | undefined): string | null {\n if (!ttsModel || ttsModel === 'native') return ttsModel ?? null;\n return ttsModel.split(':')[0] ?? null;\n}\n\n/**\n * Base configuration for all realtime models.\n * Contains common fields that apply to all realtime model providers.\n */\nexport interface BaseRealtimeModelConfig {\n /** Sound to play while the assistant is processing tool calls. */\n thinkingSound?: ThinkingSound | null;\n /** TTS model ID in provider:tts:model format (e.g. 'elevenlabs:tts:eleven_flash_v2_5'), or 'native'. */\n ttsModel?: TTSModel | null;\n /** Canonical voice identifier (e.g., elevenlabs:voice:catt) that selects the specific assistant voice. */\n voiceModel?: string | null;\n}\n\nexport interface OpenAIRealtimeModelConfig extends BaseRealtimeModelConfig {\n turnDetection?: OpenAITurnDetection | null;\n}\n\nexport interface GeminiRealtimeModelConfig extends BaseRealtimeModelConfig {}\n\nexport interface CustomRealtimeModelConfig extends BaseRealtimeModelConfig {\n sttModel?: string | null;\n sttConfig?: Record<string, unknown> | null;\n // Required: model and config for voice inference (no fallback to chatModel)\n inferenceModel: string;\n inferenceModelConfig?: ChatModelConfig | null;\n}\n\nexport interface AWSRealtimeModelConfig extends BaseRealtimeModelConfig {}\n\nexport type RealtimeModelConfig =\n | OpenAIRealtimeModelConfig\n | GeminiRealtimeModelConfig\n | CustomRealtimeModelConfig\n | AWSRealtimeModelConfig;\n\n// Chat Model Configuration Types (for thinking/reasoning)\n\nexport type GeminiThinkingLevel = 'minimal' | 'low' | 'medium' | 'high';\nexport type OpenAIReasoningEffort = 'minimal' | 'low' | 'medium' | 'high';\n\n/**\n * Base configuration for all chat models.\n * Can be extended for provider-specific options.\n */\nexport interface BaseChatModelConfig {}\n\nexport interface GeminiChatModelConfig extends BaseChatModelConfig {\n thinkingLevel?: GeminiThinkingLevel | null;\n includeThoughts?: boolean | null;\n}\n\nexport interface ClaudeChatModelConfig extends BaseChatModelConfig {\n thinkingEnabled?: boolean | null;\n thinkingBudgetTokens?: number | null; // 1024-50000\n}\n\nexport interface OpenAIChatModelConfig extends BaseChatModelConfig {\n reasoningEffort?: OpenAIReasoningEffort | null;\n}\n\nexport type ChatModelConfig = GeminiChatModelConfig | ClaudeChatModelConfig | OpenAIChatModelConfig;\n\nexport interface Assistant {\n id: number;\n name: string;\n uuid: string;\n externalId?: string;\n identity?: string;\n description?: string;\n chatModel?: string;\n realtimeModel?: string;\n realtimeModelConfig?: RealtimeModelConfig | null;\n chatModelConfig?: ChatModelConfig | null;\n createdAt: string;\n updatedAt: string;\n ownerId: number;\n\n // SMS off-hours settings\n smsOffHoursMode?: 'no_reply' | 'message' | 'forward';\n smsOffHoursMessage?: string;\n smsForwardNumber?: string;\n\n // Voice off-hours settings\n voiceOffHoursMode?: 'no_reply' | 'message' | 'forward';\n voiceOffHoursMessage?: string;\n voiceForwardNumber?: string;\n}\n\nexport interface AssistantFormData {\n name: string;\n identity?: string;\n description?: string;\n externalId?: string;\n labelIds?: number[];\n chatModel?: string | null;\n realtimeModel?: string | null;\n realtimeModelConfig?: RealtimeModelConfig | null;\n chatModelConfig?: ChatModelConfig | null;\n ownerId?: number | null;\n\n // SMS off-hours settings\n smsOffHoursMode?: 'no_reply' | 'message' | 'forward' | null;\n smsOffHoursMessage?: string | null;\n smsForwardNumber?: string | null;\n\n // Voice off-hours settings\n voiceOffHoursMode?: 'no_reply' | 'message' | 'forward' | null;\n voiceOffHoursMessage?: string | null;\n voiceForwardNumber?: string | null;\n}\n\n// ===== ASSISTANT EXPORT/IMPORT TYPES =====\n\nexport interface AssistantExportItem {\n uuid: string;\n name: string;\n description: string | null;\n}\n\n// ===== ASSISTANT CHAT PARTICIPANT TYPES =====\n\nexport interface AIChatParticipant {\n name: string;\n assistantId?: number;\n memberId?: number;\n memberType?: string;\n role: 'assistant';\n additionalInstructions?: string;\n chatModel?: string;\n realtimeModel?: string;\n}\n\n// ===== ASSISTANT SORT TYPES =====\n\nexport type { AssistantSortField };\n\n// ===== VOICE MODEL UTILITIES =====\n\n/**\n * Supported TTS preview providers.\n * These are the voice providers that support TTS preview in the UI.\n */\nexport const TTS_PREVIEW_PROVIDERS = ['openai', 'elevenlabs', 'google', 'aws'] as const;\nexport type TTSPreviewProvider = (typeof TTS_PREVIEW_PROVIDERS)[number];\n\n/**\n * Get the canonical voice model ID for an assistant.\n *\n * Voice model IDs follow the format: `{provider}:voice:{voiceName}`\n * Examples:\n * - `openai:voice:ash`\n * - `elevenlabs:voice:catt`\n * - `google:voice:puck`\n *\n * @param assistant - The assistant to get the voice model ID for\n * @returns The canonical voice model ID, or null if no voice is configured\n */\nexport function getVoiceModelId(assistant: Assistant): string | null {\n // Voice is now always in realtimeModelConfig.voiceModel\n const config = assistant.realtimeModelConfig as BaseRealtimeModelConfig | null;\n return config?.voiceModel ?? null;\n}\n\n/**\n * Check if an assistant's voice can be previewed.\n *\n * @param assistant - The assistant to check\n * @returns True if the assistant's voice supports TTS preview\n */\nexport function canPreviewVoice(assistant: Assistant): boolean {\n const voiceModel = getVoiceModelId(assistant);\n if (!voiceModel) return false;\n const provider = voiceModel.split(':')[0];\n return TTS_PREVIEW_PROVIDERS.includes(provider as TTSPreviewProvider);\n}\n","/**\n * Centralized Feature Registry for Gravity Rail (Frontend)\n *\n * This module provides TypeScript types and utilities for the feature system.\n * Feature definitions are loaded from the backend API at runtime.\n *\n * Usage:\n * import { getFeature, FeatureVisibility, FeatureCategory } from '@gravity-rail/client/features';\n *\n * // Get a feature definition\n * const calendar = getFeature('calendar');\n * if (calendar?.dependsOn.length) {\n * console.log('Calendar depends on:', calendar.dependsOn);\n * }\n */\n\n/**\n * Categories for organizing features in UI.\n */\nexport enum FeatureCategory {\n COMMUNICATION = 'communication',\n PLATFORM = 'platform',\n INTEGRATION = 'integration',\n COMPLIANCE = 'compliance',\n DEVELOPER = 'developer',\n RESELLER = 'reseller',\n SPECIAL = 'special',\n}\n\n/**\n * Controls how disabled features appear in the UI.\n */\nexport enum FeatureVisibility {\n /** Not shown when disabled */\n HIDDEN = 'hidden',\n /** Shown with upgrade call-to-action */\n UPGRADE_PROMPT = 'upgrade',\n /** Shown with \"contact admin\" call-to-action */\n CONTACT_ADMIN = 'contact',\n}\n\n/**\n * Complete definition of a workspace feature.\n */\nexport interface FeatureDefinition {\n /** Machine identifier matching WorkspaceFeature enum value */\n slug: string;\n /** Human-readable display name */\n name: string;\n /** Feature description for UI/docs */\n description: string;\n /** Feature category for grouping */\n category: FeatureCategory;\n /** Searchable tags for filtering */\n tags: string[];\n /** List of feature slugs this feature requires */\n dependsOn: string[];\n /** How to display when feature is disabled */\n visibility: FeatureVisibility;\n /** Custom upgrade call-to-action text */\n upgradeCta?: string;\n /** Whether this is a beta/early access feature */\n beta: boolean;\n /** Whether this feature is recommended for new workspaces */\n recommended: boolean;\n /** Icon name from the icon library */\n icon?: string;\n}\n\n/**\n * Response from the features API endpoint.\n */\nexport interface FeaturesResponse {\n features: FeatureDefinition[];\n}\n\n// Global feature registry (populated from API or build-time generation)\nlet _features: Record<string, FeatureDefinition> = {};\n\n/**\n * Initialize the feature registry with definitions from the API.\n *\n * @param features - Array of feature definitions from the API\n */\nexport function initializeFeatures(features: FeatureDefinition[]): void {\n _features = {};\n for (const feature of features) {\n _features[feature.slug] = feature;\n }\n}\n\n/**\n * Get a feature definition by slug.\n *\n * @param slug - The feature slug (e.g., \"calendar\", \"gmail\")\n * @returns The feature definition, or undefined if not found\n */\nexport function getFeature(slug: string): FeatureDefinition | undefined {\n return _features[slug];\n}\n\n/**\n * Get all registered features.\n *\n * @returns Record mapping slugs to feature definitions\n */\nexport function getAllFeatures(): Record<string, FeatureDefinition> {\n return { ..._features };\n}\n\n/**\n * Get all features in a specific category.\n *\n * @param category - The category to filter by\n * @returns Array of features in the category\n */\nexport function getFeaturesByCategory(category: FeatureCategory): FeatureDefinition[] {\n return Object.values(_features).filter((f) => f.category === category);\n}\n\n/**\n * Get all features with a specific visibility setting.\n *\n * @param visibility - The visibility type to filter by\n * @returns Array of features with the specified visibility\n */\nexport function getFeaturesByVisibility(visibility: FeatureVisibility): FeatureDefinition[] {\n return Object.values(_features).filter((f) => f.visibility === visibility);\n}\n\n/**\n * Check if a feature is available (enabled and dependencies met).\n *\n * @param slug - The feature slug to check\n * @param enabledFeatures - Array of currently enabled feature slugs\n * @returns True if the feature is enabled and all dependencies are met\n */\nexport function isFeatureAvailable(slug: string, enabledFeatures: string[]): boolean {\n if (!enabledFeatures.includes(slug)) {\n return false;\n }\n\n const feature = _features[slug];\n if (!feature) {\n return true; // Unknown feature, assume available\n }\n\n return feature.dependsOn.every((dep) => enabledFeatures.includes(dep));\n}\n\n/**\n * Check if all dependencies for a feature are satisfied.\n *\n * @param slug - The feature slug to check\n * @param enabledFeatures - Array of currently enabled feature slugs\n * @returns True if all dependencies are satisfied\n */\nexport function areDependenciesSatisfied(slug: string, enabledFeatures: string[]): boolean {\n const feature = _features[slug];\n if (!feature) {\n return true;\n }\n\n return feature.dependsOn.every((dep) => enabledFeatures.includes(dep));\n}\n\n/**\n * Get the list of missing dependencies for a feature.\n *\n * @param slug - The feature slug to check\n * @param enabledFeatures - Array of currently enabled feature slugs\n * @returns Array of missing dependency slugs\n */\nexport function getMissingDependencies(slug: string, enabledFeatures: string[]): string[] {\n const feature = _features[slug];\n if (!feature) {\n return [];\n }\n\n return feature.dependsOn.filter((dep) => !enabledFeatures.includes(dep));\n}\n\n/**\n * Validate that all feature dependencies are satisfied.\n *\n * @param enabledFeatures - Array of enabled feature slugs\n * @returns Array of error messages for unsatisfied dependencies\n */\nexport function validateFeatureDependencies(enabledFeatures: string[]): string[] {\n const errors: string[] = [];\n\n for (const slug of enabledFeatures) {\n const feature = _features[slug];\n if (feature) {\n for (const dep of feature.dependsOn) {\n if (!enabledFeatures.includes(dep)) {\n errors.push(`Feature '${slug}' requires '${dep}' to be enabled`);\n }\n }\n }\n }\n\n return errors;\n}\n\n/**\n * Get features that can be shown as upgrade options.\n *\n * @param enabledFeatures - Array of currently enabled feature slugs\n * @returns Array of features available for upgrade\n */\nexport function getAvailableFeaturesForUpgrade(enabledFeatures: string[]): FeatureDefinition[] {\n const available: FeatureDefinition[] = [];\n\n for (const feature of Object.values(_features)) {\n // Skip already enabled features\n if (enabledFeatures.includes(feature.slug)) {\n continue;\n }\n\n // Skip hidden features\n if (feature.visibility === FeatureVisibility.HIDDEN) {\n continue;\n }\n\n // Check if dependencies would be satisfied\n const depsSatisfied = feature.dependsOn.every((dep) => enabledFeatures.includes(dep));\n\n if (depsSatisfied || feature.visibility === FeatureVisibility.CONTACT_ADMIN) {\n available.push(feature);\n }\n }\n\n return available;\n}\n\n/**\n * Check if the feature registry has been initialized.\n *\n * @returns True if features have been loaded\n */\nexport function isRegistryInitialized(): boolean {\n return Object.keys(_features).length > 0;\n}\n\n/**\n * Clear the feature registry.\n *\n * This is primarily useful for testing.\n */\nexport function clearRegistry(): void {\n _features = {};\n}\n","/**\n * Chat type constants for frontend use.\n *\n * These constants mirror the backend ChatType enum in lib/constants.py\n * and should be kept in sync.\n */\n\n/**\n * Available chat types in the system.\n *\n * @property ASSIGNMENT - Standard workflow-based chats with DB assistants\n * @property MANAGER - Workspace management chats using builtin manager assistant\n * @property CONTRIBUTOR - Contributor input chats using builtin contributor assistant\n * @property DEVELOPER - Developer/debugging chats using builtin developer assistant\n * @property AGENT - Agent response generation from DM/email/SMS/voice triggers\n */\nexport const CHAT_TYPES = {\n ASSIGNMENT: 'assignment',\n MANAGER: 'manager',\n CONTRIBUTOR: 'contributor',\n DEVELOPER: 'developer',\n AGENT: 'agent',\n DM: 'dm',\n} as const;\n\n/**\n * Type for valid chat type values.\n */\nexport type ChatType = (typeof CHAT_TYPES)[keyof typeof CHAT_TYPES];\n\n/**\n * Chat types that use builtin (virtual) assistants instead of DB assistants.\n * These chat types don't have an assistant record in the database.\n */\nexport const BUILTIN_ASSISTANT_CHAT_TYPES = new Set<ChatType>([\n CHAT_TYPES.MANAGER,\n CHAT_TYPES.CONTRIBUTOR,\n CHAT_TYPES.DEVELOPER,\n]);\n\n/**\n * Chat types that don't require assistant participant records.\n * Includes builtin assistant types plus DM chats.\n */\nexport const NO_ASSISTANT_PARTICIPANT_CHAT_TYPES = new Set<ChatType>([\n ...BUILTIN_ASSISTANT_CHAT_TYPES,\n CHAT_TYPES.DM,\n]);\n\n/**\n * Check if a chat type uses a builtin assistant.\n *\n * @param chatType - The chat type to check\n * @returns true if the chat type uses a builtin assistant\n */\nexport function usesBuiltinAssistant(chatType: string): boolean {\n return BUILTIN_ASSISTANT_CHAT_TYPES.has(chatType as ChatType);\n}\n\n/**\n * Check if a chat type requires an assistant participant record.\n *\n * @param chatType - The chat type to check\n * @returns true if the chat type requires an assistant participant record\n */\nexport function requiresAssistantParticipant(chatType: string): boolean {\n return !NO_ASSISTANT_PARTICIPANT_CHAT_TYPES.has(chatType as ChatType);\n}\n\n/**\n * Type guard to check if a string is a valid ChatType.\n *\n * @param value - The value to check\n * @returns true if the value is a valid ChatType\n */\nexport function isChatType(value: string): value is ChatType {\n return Object.values(CHAT_TYPES).includes(value as ChatType);\n}\n","/**\n * Default AI model constants shared across the frontend.\n *\n * These are used as fallback defaults when creating new agents, assistants,\n * and other entities that require a model selection.\n */\n\n/** Default chat/inference model for new agents and assistants. */\nexport const DEFAULT_CHAT_MODEL = 'aws:bedrock:claude-4-5-haiku';\n\n/** Default voice model for custom realtime configurations. */\nexport const DEFAULT_CUSTOM_VOICE_MODEL = 'elevenlabs:voice:river';\n","/**\n * Resource metadata for products\n *\n * Defines labels, units, and descriptions for each resource type\n */\n\nimport { ProductType, Resource, WorkspaceFeature } from './billingTypes';\n\n/** Scope defines where a resource can be configured */\nexport type ResourceScope = 'workspace' | 'org' | 'any';\n\nexport interface ResourceMetadata {\n label: string;\n unit: string;\n unitPlural: string;\n description: string;\n /** Feature required to use this resource (null means always available) */\n requiresFeature: WorkspaceFeature | null;\n /** Where this resource can be configured */\n scope: ResourceScope;\n}\n\nconst RESOURCE_METADATA: Record<Resource, ResourceMetadata> = {\n [Resource.AI_UNIT]: {\n label: 'AI Units',\n unit: '1,000 tokens',\n unitPlural: '1,000 tokens',\n description: 'AI model usage billed in lots of 1,000 tokens with model-specific multipliers',\n requiresFeature: null,\n scope: 'any',\n },\n [Resource.STT]: {\n label: 'Speech-to-Text',\n unit: 'minute',\n unitPlural: 'minutes',\n description: 'Audio transcription in minutes',\n requiresFeature: null,\n scope: 'any',\n },\n [Resource.TTS]: {\n label: 'Text-to-Speech',\n unit: '1,000 characters',\n unitPlural: '1,000 characters',\n description: 'Text synthesized to audio, billed in lots of 1,000 characters',\n requiresFeature: null,\n scope: 'any',\n },\n [Resource.SMS]: {\n label: 'SMS Messages',\n unit: 'message',\n unitPlural: 'messages',\n description: 'Text messages sent via phone number',\n requiresFeature: WorkspaceFeature.PHONE_SMS,\n scope: 'any',\n },\n [Resource.EMAIL]: {\n label: 'Emails',\n unit: 'message',\n unitPlural: 'messages',\n description: 'Email messages sent or received',\n requiresFeature: WorkspaceFeature.EMAIL,\n scope: 'any',\n },\n [Resource.PHONE_CALL]: {\n label: 'Phone Calls',\n unit: 'minute',\n unitPlural: 'minutes',\n description: 'Phone call duration in minutes',\n requiresFeature: WorkspaceFeature.PHONE_VOICE,\n scope: 'any',\n },\n [Resource.PHONE_NUMBER]: {\n label: 'Phone Numbers',\n unit: 'number',\n unitPlural: 'numbers',\n description: 'Active phone numbers for calling and SMS',\n requiresFeature: WorkspaceFeature.PHONE,\n scope: 'any',\n },\n [Resource.INBOX]: {\n label: 'Email Inboxes',\n unit: 'inbox',\n unitPlural: 'inboxes',\n description: 'Email inboxes for receiving messages',\n requiresFeature: WorkspaceFeature.EMAIL,\n scope: 'any',\n },\n [Resource.SITE]: {\n label: 'Sites',\n unit: 'site',\n unitPlural: 'sites',\n description: 'Published websites',\n requiresFeature: WorkspaceFeature.SITES,\n scope: 'any',\n },\n [Resource.MEMBER]: {\n label: 'Members',\n unit: 'member',\n unitPlural: 'members',\n description: 'Total workspace members',\n requiresFeature: null,\n scope: 'workspace',\n },\n [Resource.WORKSPACE]: {\n label: 'Workspaces',\n unit: 'workspace',\n unitPlural: 'workspaces',\n description: 'Workspaces in the organization',\n requiresFeature: null,\n scope: 'org',\n },\n [Resource.ORG_ADMIN]: {\n label: 'Organization Admins',\n unit: 'admin',\n unitPlural: 'admins',\n description: 'Organization administrators',\n requiresFeature: null,\n scope: 'org',\n },\n [Resource.STORAGE_MB]: {\n label: 'Storage',\n unit: 'MB',\n unitPlural: 'MB',\n description: 'File storage in megabytes',\n requiresFeature: null,\n scope: 'any',\n },\n};\n\n/**\n * Get metadata for a specific resource\n */\nexport function getResourceMetadata(resource: Resource): ResourceMetadata | undefined {\n return RESOURCE_METADATA[resource];\n}\n\n/**\n * Get all available resource slugs\n */\nexport function getAllResourceSlugs(): Resource[] {\n return Object.keys(RESOURCE_METADATA) as Resource[];\n}\n\n/**\n * Get the scope ('workspace' or 'org') for a product type.\n */\nexport function getScopeFromProductType(productType: ProductType): ResourceScope {\n const isOrgProduct = productType === ProductType.ORG || productType === ProductType.ORG_ADDON;\n return isOrgProduct ? 'org' : 'workspace';\n}\n\n/**\n * Get resources applicable to a given scope and optional feature set.\n *\n * @param scope - 'workspace', 'org', or 'any' to filter by where resources can be configured\n * @param enabledFeatures - Optional list of enabled features. If provided, resources requiring\n * features not in this list will be excluded. If null/undefined,\n * all resources matching the scope are returned.\n */\nexport function getApplicableResources(\n scope: ResourceScope,\n enabledFeatures?: WorkspaceFeature[] | null\n): Resource[] {\n const enabledSet = enabledFeatures ? new Set(enabledFeatures) : null;\n\n return (Object.entries(RESOURCE_METADATA) as [Resource, ResourceMetadata][])\n .filter(([_slug, metadata]) => {\n // Check scope compatibility\n if (scope === 'workspace' && metadata.scope === 'org') {\n return false;\n }\n if (scope === 'org' && metadata.scope === 'workspace') {\n return false;\n }\n\n // Check feature requirement (if features provided)\n if (enabledSet !== null && metadata.requiresFeature !== null) {\n if (!enabledSet.has(metadata.requiresFeature)) {\n return false;\n }\n }\n\n return true;\n })\n .map(([slug]) => slug)\n .sort((a, b) => {\n const metaA = RESOURCE_METADATA[a];\n const metaB = RESOURCE_METADATA[b];\n return metaA.label.localeCompare(metaB.label);\n });\n}\n\n/**\n * Get resources applicable to a product type.\n * This is a convenience wrapper around getApplicableResources that derives scope from product type.\n * Does not filter by features - use getApplicableResources directly for feature-based filtering.\n */\nexport function getApplicableResourceSlugs(productType: ProductType): Resource[] {\n const scope = getScopeFromProductType(productType);\n return getApplicableResources(scope);\n}\n","/**\n * Centralized OAuth and API scope management for TypeScript/JavaScript clients.\n *\n * This module provides all available scopes for Applications and API keys,\n * serving as a single source of truth for permission management across frontend\n * and TypeScript-based services (like MCP servers).\n *\n * IMPORTANT: Keep in sync with lib/context/scopes.py\n */\n\n/**\n * Categories of scopes for organization\n * Must match namespaces used in Python Scope enum\n */\nexport enum ScopeCategory {\n WORKSPACE = 'workspace',\n MEMBERS = 'members',\n MEMBER_FILTERS = 'member_filters',\n MEMBER_ROLES = 'member_roles',\n CHATS = 'chats',\n DM = 'dm',\n ASSISTANTS = 'assistants',\n WORKFLOWS = 'workflows',\n ASSIGNMENTS = 'assignments',\n AUTOMATIONS = 'automations',\n DATATYPES = 'datatypes',\n RECORDS = 'records',\n FILES = 'files',\n SITES = 'sites',\n AGENTS = 'agents',\n CALENDARS = 'calendars',\n INBOXES = 'inboxes',\n PHONES = 'phones',\n WEBHOOKS = 'webhooks',\n APPS = 'apps',\n LABELS = 'labels',\n ANALYTICS = 'analytics',\n OPERATOR = 'operator',\n ORG = 'org',\n}\n\n/**\n * Individual scope definition\n */\nexport interface ScopeDefinition {\n /** The scope identifier (e.g., \"workspace:read\") */\n name: string;\n /** The category this scope belongs to */\n category: ScopeCategory;\n /** Human-readable description of what this scope allows */\n description: string;\n /** List of other scopes this scope automatically includes */\n implies?: readonly string[];\n /** Whether this scope should be highlighted as dangerous */\n dangerous?: boolean;\n}\n\n/**\n * All available OAuth scopes\n * Must match Python Scope enum in lib/context/scopes.py\n */\nexport const SCOPES = {\n // =========================================================================\n // WORKSPACE\n // =========================================================================\n 'workspace:read': {\n name: 'workspace:read',\n category: ScopeCategory.WORKSPACE,\n description: 'View workspace settings',\n },\n 'workspace:write': {\n name: 'workspace:write',\n category: ScopeCategory.WORKSPACE,\n description: 'Modify workspace settings',\n implies: ['workspace:read'],\n },\n 'workspace:admin': {\n name: 'workspace:admin',\n category: ScopeCategory.WORKSPACE,\n description: 'Full workspace control',\n implies: ['workspace:write'],\n dangerous: true,\n },\n\n // =========================================================================\n // MEMBERS\n // =========================================================================\n 'members:read': {\n name: 'members:read',\n category: ScopeCategory.MEMBERS,\n description: 'View all members',\n },\n 'members:write': {\n name: 'members:write',\n category: ScopeCategory.MEMBERS,\n description: 'Create and update members',\n implies: ['members:read'],\n },\n 'members:admin': {\n name: 'members:admin',\n category: ScopeCategory.MEMBERS,\n description: 'Delete members, manage permissions',\n implies: ['members:write'],\n dangerous: true,\n },\n\n // =========================================================================\n // MEMBER FILTERS\n // =========================================================================\n 'member_filters:read': {\n name: 'member_filters:read',\n category: ScopeCategory.MEMBER_FILTERS,\n description: 'View saved filters',\n },\n 'member_filters:write': {\n name: 'member_filters:write',\n category: ScopeCategory.MEMBER_FILTERS,\n description: 'Create and edit filters',\n implies: ['member_filters:read'],\n },\n 'member_filters:admin': {\n name: 'member_filters:admin',\n category: ScopeCategory.MEMBER_FILTERS,\n description: 'Delete filters',\n implies: ['member_filters:write'],\n },\n\n // =========================================================================\n // MEMBER ROLES\n // =========================================================================\n 'member_roles:read': {\n name: 'member_roles:read',\n category: ScopeCategory.MEMBER_ROLES,\n description: 'View role definitions',\n },\n 'member_roles:write': {\n name: 'member_roles:write',\n category: ScopeCategory.MEMBER_ROLES,\n description: 'Create and edit roles',\n implies: ['member_roles:read'],\n },\n 'member_roles:admin': {\n name: 'member_roles:admin',\n category: ScopeCategory.MEMBER_ROLES,\n description: 'Delete roles',\n implies: ['member_roles:write'],\n dangerous: true,\n },\n\n // =========================================================================\n // CHATS\n // =========================================================================\n 'chats:read': {\n name: 'chats:read',\n category: ScopeCategory.CHATS,\n description: 'View all conversations',\n },\n 'chats:write': {\n name: 'chats:write',\n category: ScopeCategory.CHATS,\n description: 'Send messages in conversations',\n implies: ['chats:read'],\n },\n 'chats:admin': {\n name: 'chats:admin',\n category: ScopeCategory.CHATS,\n description: 'Delete conversations',\n implies: ['chats:write'],\n },\n\n // =========================================================================\n // DIRECT MESSAGES\n // =========================================================================\n 'dm:read': {\n name: 'dm:read',\n category: ScopeCategory.DM,\n description: 'View direct messages',\n },\n 'dm:write': {\n name: 'dm:write',\n category: ScopeCategory.DM,\n description: 'Send direct messages',\n implies: ['dm:read'],\n },\n 'dm:admin': {\n name: 'dm:admin',\n category: ScopeCategory.DM,\n description: 'Delete direct messages',\n implies: ['dm:write'],\n },\n\n // =========================================================================\n // ASSISTANTS\n // =========================================================================\n 'assistants:read': {\n name: 'assistants:read',\n category: ScopeCategory.ASSISTANTS,\n description: 'View assistant configurations',\n },\n 'assistants:write': {\n name: 'assistants:write',\n category: ScopeCategory.ASSISTANTS,\n description: 'Configure assistants',\n implies: ['assistants:read'],\n },\n 'assistants:admin': {\n name: 'assistants:admin',\n category: ScopeCategory.ASSISTANTS,\n description: 'Delete assistants',\n implies: ['assistants:write'],\n },\n\n // =========================================================================\n // WORKFLOWS\n // =========================================================================\n 'workflows:read': {\n name: 'workflows:read',\n category: ScopeCategory.WORKFLOWS,\n description: 'View workflow definitions',\n },\n 'workflows:write': {\n name: 'workflows:write',\n category: ScopeCategory.WORKFLOWS,\n description: 'Create and edit workflows',\n implies: ['workflows:read'],\n },\n 'workflows:admin': {\n name: 'workflows:admin',\n category: ScopeCategory.WORKFLOWS,\n description: 'Delete workflows',\n implies: ['workflows:write'],\n },\n\n // =========================================================================\n // ASSIGNMENTS\n // =========================================================================\n 'assignments:read': {\n name: 'assignments:read',\n category: ScopeCategory.ASSIGNMENTS,\n description: 'View all assignments',\n },\n 'assignments:write': {\n name: 'assignments:write',\n category: ScopeCategory.ASSIGNMENTS,\n description: 'Create and modify assignments',\n implies: ['assignments:read'],\n },\n 'assignments:admin': {\n name: 'assignments:admin',\n category: ScopeCategory.ASSIGNMENTS,\n description: 'Delete assignments',\n implies: ['assignments:write'],\n },\n\n // =========================================================================\n // AUTOMATIONS\n // =========================================================================\n 'automations:read': {\n name: 'automations:read',\n category: ScopeCategory.AUTOMATIONS,\n description: 'View scheduled tasks and rules',\n },\n 'automations:write': {\n name: 'automations:write',\n category: ScopeCategory.AUTOMATIONS,\n description: 'Create and edit automations',\n implies: ['automations:read'],\n },\n 'automations:admin': {\n name: 'automations:admin',\n category: ScopeCategory.AUTOMATIONS,\n description: 'Delete automations',\n implies: ['automations:write'],\n },\n\n // =========================================================================\n // DATATYPES (Schema definitions)\n // =========================================================================\n 'datatypes:read': {\n name: 'datatypes:read',\n category: ScopeCategory.DATATYPES,\n description: 'View data type schemas',\n },\n 'datatypes:write': {\n name: 'datatypes:write',\n category: ScopeCategory.DATATYPES,\n description: 'Create and edit data types',\n implies: ['datatypes:read'],\n },\n 'datatypes:admin': {\n name: 'datatypes:admin',\n category: ScopeCategory.DATATYPES,\n description: 'Delete data types',\n implies: ['datatypes:write'],\n },\n\n // =========================================================================\n // RECORDS (Data instances)\n // =========================================================================\n 'records:read': {\n name: 'records:read',\n category: ScopeCategory.RECORDS,\n description: 'View all data records',\n },\n 'records:write': {\n name: 'records:write',\n category: ScopeCategory.RECORDS,\n description: 'Create and modify records',\n implies: ['records:read'],\n },\n 'records:admin': {\n name: 'records:admin',\n category: ScopeCategory.RECORDS,\n description: 'Delete records',\n implies: ['records:write'],\n },\n\n // =========================================================================\n // FILES\n // =========================================================================\n 'files:read': {\n name: 'files:read',\n category: ScopeCategory.FILES,\n description: 'View all files',\n },\n 'files:write': {\n name: 'files:write',\n category: ScopeCategory.FILES,\n description: 'Upload and modify files',\n implies: ['files:read'],\n },\n 'files:admin': {\n name: 'files:admin',\n category: ScopeCategory.FILES,\n description: 'Delete files',\n implies: ['files:write'],\n },\n\n // =========================================================================\n // SITES\n // =========================================================================\n 'sites:read': {\n name: 'sites:read',\n category: ScopeCategory.SITES,\n description: 'View site configurations',\n },\n 'sites:write': {\n name: 'sites:write',\n category: ScopeCategory.SITES,\n description: 'Create and edit sites',\n implies: ['sites:read'],\n },\n 'sites:admin': {\n name: 'sites:admin',\n category: ScopeCategory.SITES,\n description: 'Delete sites',\n implies: ['sites:write'],\n },\n\n // =========================================================================\n // AGENTS\n // =========================================================================\n 'agents:read': {\n name: 'agents:read',\n category: ScopeCategory.AGENTS,\n description: 'View agent members',\n },\n 'agents:write': {\n name: 'agents:write',\n category: ScopeCategory.AGENTS,\n description: 'Create and configure agents',\n implies: ['agents:read'],\n },\n 'agents:admin': {\n name: 'agents:admin',\n category: ScopeCategory.AGENTS,\n description: 'Delete agents',\n implies: ['agents:write'],\n },\n\n // =========================================================================\n // CALENDARS\n // =========================================================================\n 'calendars:read': {\n name: 'calendars:read',\n category: ScopeCategory.CALENDARS,\n description: 'View calendars',\n },\n 'calendars:write': {\n name: 'calendars:write',\n category: ScopeCategory.CALENDARS,\n description: 'Create and edit calendar events',\n implies: ['calendars:read'],\n },\n 'calendars:admin': {\n name: 'calendars:admin',\n category: ScopeCategory.CALENDARS,\n description: 'Delete calendars',\n implies: ['calendars:write'],\n },\n\n // =========================================================================\n // INBOXES\n // =========================================================================\n 'inboxes:read': {\n name: 'inboxes:read',\n category: ScopeCategory.INBOXES,\n description: 'View inbox configurations',\n },\n 'inboxes:write': {\n name: 'inboxes:write',\n category: ScopeCategory.INBOXES,\n description: 'Configure inboxes',\n implies: ['inboxes:read'],\n },\n 'inboxes:admin': {\n name: 'inboxes:admin',\n category: ScopeCategory.INBOXES,\n description: 'Delete inboxes',\n implies: ['inboxes:write'],\n },\n\n // =========================================================================\n // PHONES\n // =========================================================================\n 'phones:read': {\n name: 'phones:read',\n category: ScopeCategory.PHONES,\n description: 'View phone numbers',\n },\n 'phones:write': {\n name: 'phones:write',\n category: ScopeCategory.PHONES,\n description: 'Configure phone numbers',\n implies: ['phones:read'],\n },\n 'phones:admin': {\n name: 'phones:admin',\n category: ScopeCategory.PHONES,\n description: 'Delete phone numbers',\n implies: ['phones:write'],\n },\n\n // =========================================================================\n // WEBHOOKS\n // =========================================================================\n 'webhooks:read': {\n name: 'webhooks:read',\n category: ScopeCategory.WEBHOOKS,\n description: 'View webhook logs',\n },\n 'webhooks:write': {\n name: 'webhooks:write',\n category: ScopeCategory.WEBHOOKS,\n description: 'Configure webhooks',\n implies: ['webhooks:read'],\n },\n 'webhooks:admin': {\n name: 'webhooks:admin',\n category: ScopeCategory.WEBHOOKS,\n description: 'Delete webhooks',\n implies: ['webhooks:write'],\n },\n 'webhooks:raw': {\n name: 'webhooks:raw',\n category: ScopeCategory.WEBHOOKS,\n description: 'Access raw webhook payloads',\n },\n\n // =========================================================================\n // APPS (OAuth grants, integrations)\n // =========================================================================\n 'apps:read': {\n name: 'apps:read',\n category: ScopeCategory.APPS,\n description: 'View app integrations',\n },\n 'apps:write': {\n name: 'apps:write',\n category: ScopeCategory.APPS,\n description: 'Configure app integrations',\n implies: ['apps:read'],\n },\n 'apps:admin': {\n name: 'apps:admin',\n category: ScopeCategory.APPS,\n description: 'Delete app integrations',\n implies: ['apps:write'],\n },\n\n // =========================================================================\n // LABELS\n // =========================================================================\n 'labels:read': {\n name: 'labels:read',\n category: ScopeCategory.LABELS,\n description: 'View labels',\n },\n 'labels:write': {\n name: 'labels:write',\n category: ScopeCategory.LABELS,\n description: 'Create and edit labels',\n implies: ['labels:read'],\n },\n\n // =========================================================================\n // ANALYTICS\n // =========================================================================\n 'analytics:read': {\n name: 'analytics:read',\n category: ScopeCategory.ANALYTICS,\n description: 'View analytics and reports',\n },\n\n // =========================================================================\n // ORGANIZATION\n // =========================================================================\n 'org:info': {\n name: 'org:info',\n category: ScopeCategory.ORG,\n description: 'View basic org info and own workspaces',\n },\n 'org:read': {\n name: 'org:read',\n category: ScopeCategory.ORG,\n description: 'View org info',\n implies: ['org:info'],\n },\n 'org:write': {\n name: 'org:write',\n category: ScopeCategory.ORG,\n description: 'Update org settings',\n implies: ['org:read'],\n },\n 'org:admin': {\n name: 'org:admin',\n category: ScopeCategory.ORG,\n description: 'Full org management',\n implies: ['org:write'],\n dangerous: true,\n },\n 'operator:read': {\n name: 'operator:read',\n category: ScopeCategory.OPERATOR,\n description: 'View operator dashboard and listen in',\n },\n 'operator:write': {\n name: 'operator:write',\n category: ScopeCategory.OPERATOR,\n description: 'Go Live and handle interactions as an operator',\n implies: ['operator:read'],\n },\n 'org:billing': {\n name: 'org:billing',\n category: ScopeCategory.ORG,\n description: 'Billing management (owner only)',\n implies: ['org:admin'],\n dangerous: true,\n },\n 'org:delete': {\n name: 'org:delete',\n category: ScopeCategory.ORG,\n description: 'Delete organization (owner only)',\n implies: ['org:admin'],\n dangerous: true,\n },\n} as const;\n\n/**\n * Type-safe scope name. Use this instead of raw strings for scope checks.\n */\nexport type ScopeName = keyof typeof SCOPES;\n\n/**\n * Manager for scope operations and validations\n */\nexport class ScopeManager {\n /**\n * Get a scope by name\n */\n static getScope(name: ScopeName): ScopeDefinition {\n return SCOPES[name] as ScopeDefinition;\n }\n\n /**\n * Get all available scopes\n */\n static getAllScopes(): Record<ScopeName, ScopeDefinition> {\n return { ...SCOPES } as Record<ScopeName, ScopeDefinition>;\n }\n\n /**\n * Get all scopes in a specific category\n */\n static getScopesByCategory(category: ScopeCategory): ScopeDefinition[] {\n return (Object.values(SCOPES) as ScopeDefinition[]).filter(\n (scope) => scope.category === category\n );\n }\n\n /**\n * Expand a list of scope names to include all implied scopes\n */\n static expandScopes(scopeNames: string[]): Set<string> {\n const expanded = new Set<string>();\n const toProcess = [...scopeNames];\n\n while (toProcess.length > 0) {\n const scopeName = toProcess.pop()!;\n if (expanded.has(scopeName)) {\n continue;\n }\n\n expanded.add(scopeName);\n const scope = SCOPES[scopeName as ScopeName] as ScopeDefinition | undefined;\n if (scope?.implies) {\n toProcess.push(...scope.implies);\n }\n }\n\n return expanded;\n }\n\n /**\n * Validate that all scope names are valid\n * @returns List of invalid scope names, or empty array if all valid\n * @throws Error if any scope names are invalid\n */\n static validateScopes(scopeNames: string[]): string[] {\n const invalid = scopeNames.filter((s) => !(s in SCOPES));\n if (invalid.length > 0) {\n throw new Error(`Invalid scopes: ${invalid.join(', ')}`);\n }\n return [];\n }\n\n /**\n * Get all dangerous scopes from a list of scope names\n */\n static getDangerousScopes(scopeNames: string[]): ScopeDefinition[] {\n const expanded = ScopeManager.expandScopes(scopeNames);\n return Array.from(expanded)\n .map((s) => SCOPES[s as ScopeName] as ScopeDefinition | undefined)\n .filter((scope): scope is ScopeDefinition => scope?.dangerous === true);\n }\n\n /**\n * Format scope descriptions grouped by category\n */\n static formatScopeDescription(scopeNames: string[]): Record<\n ScopeCategory,\n Array<{\n name: string;\n description: string;\n dangerous?: boolean;\n implied: boolean;\n }>\n > {\n const expanded = ScopeManager.expandScopes(scopeNames);\n const result: Partial<\n Record<\n ScopeCategory,\n Array<{\n name: string;\n description: string;\n dangerous?: boolean;\n implied: boolean;\n }>\n >\n > = {};\n\n Array.from(expanded)\n .sort()\n .forEach((scopeName) => {\n const scope = SCOPES[scopeName as ScopeName] as ScopeDefinition | undefined;\n if (!scope) return;\n\n if (!result[scope.category]) {\n result[scope.category] = [];\n }\n\n result[scope.category]!.push({\n name: scope.name,\n description: scope.description,\n dangerous: scope.dangerous,\n implied: !scopeNames.includes(scopeName), // Was this scope implied?\n });\n });\n\n return result as Record<\n ScopeCategory,\n Array<{\n name: string;\n description: string;\n dangerous?: boolean;\n implied: boolean;\n }>\n >;\n }\n\n /**\n * Parse a space-separated scope string into an array\n */\n static parseScopeString(scopeString: string): string[] {\n return scopeString.split(/\\s+/).filter((s) => s.length > 0);\n }\n\n /**\n * Convert scope array to space-separated string\n */\n static formatScopeString(scopes: string[]): string {\n return scopes.join(' ');\n }\n}\n\n/**\n * Common scope combinations for convenience\n */\nexport const SCOPE_PRESETS = {\n /** Data access - members and records management */\n DATA: ['members:read', 'members:write', 'records:read', 'records:write'] as ScopeName[],\n\n /** Chat access - members and chat management */\n CHATS: ['members:read', 'chats:read', 'chats:write'] as ScopeName[],\n\n /** Full access - all available scopes */\n ALL: Object.keys(SCOPES) as ScopeName[],\n};\n","// Core shared types that are used across multiple domains in the application\n\n// Generic pagination interface\nexport interface PaginatedResponse<T> {\n items: T[];\n total: number;\n page: number;\n pageSize: number;\n totalPages: number;\n}\n\n// Cursor-based pagination interface\nexport interface CursorPaginatedResponse<T> {\n items: T[];\n nextCursor: string | null;\n hasMore: boolean;\n pageSize: number;\n}\n\n// Basic sort order type\nexport type SortOrder = 'asc' | 'desc';\n\n// Access level enum for general access control\nexport enum AccessLevel {\n PRIVATE = 'private',\n PUBLIC = 'public',\n WORKSPACE = 'workspace',\n}\n\n// Permission constants - bitwise flags\nexport const PERMISSION_NONE = 0; // 0000 0000 - No permissions\nexport const PERMISSION_USE = 1; // 0000 0001 - Can use/read the object\nexport const PERMISSION_EDIT = 2; // 0000 0010 - Can edit/modify the object\nexport const PERMISSION_CREATE = 4; // 0000 0100 - Can create new entries\nexport const PERMISSION_LIST = 8; // 0000 1000 - Can list/browse objects\nexport const PERMISSION_ADMIN = 16; // 0001 0000 - Admin-level access\nexport const PERMISSION_VERIFY = 32; // 0010 0000 - Can verify record validity without seeing contents\nexport const PERMISSION_GEOLOCATE = 128; // 1000 0000 - Can search records by geographic distance\nexport const PERMISSION_LIST_ALL = 256; // 1 0000 0000 - Can list all records regardless of member access\nexport const PERMISSION_DELETE = 512; // 10 0000 0000 - Can delete records\n\n// Permission flags interface\nexport interface ObjectPermissionFlags {\n use: boolean;\n edit: boolean;\n create: boolean;\n list: boolean;\n verify: boolean;\n geolocate: boolean;\n listAll: boolean;\n delete: boolean;\n}\n\n// Utility functions for permission handling\nexport function decodePermissions(accessMode: number): ObjectPermissionFlags {\n return {\n use: (accessMode & PERMISSION_USE) !== 0,\n edit: (accessMode & PERMISSION_EDIT) !== 0,\n create: (accessMode & PERMISSION_CREATE) !== 0,\n list: (accessMode & PERMISSION_LIST) !== 0,\n verify: (accessMode & PERMISSION_VERIFY) !== 0,\n geolocate: (accessMode & PERMISSION_GEOLOCATE) !== 0,\n listAll: (accessMode & PERMISSION_LIST_ALL) !== 0,\n delete: (accessMode & PERMISSION_DELETE) !== 0,\n };\n}\n\nexport function encodePermissions(permissions: ObjectPermissionFlags): number {\n let accessMode = PERMISSION_NONE;\n if (permissions.use) accessMode |= PERMISSION_USE;\n if (permissions.edit) accessMode |= PERMISSION_EDIT;\n if (permissions.create) accessMode |= PERMISSION_CREATE;\n if (permissions.list) accessMode |= PERMISSION_LIST;\n if (permissions.verify) accessMode |= PERMISSION_VERIFY;\n if (permissions.geolocate) accessMode |= PERMISSION_GEOLOCATE;\n if (permissions.listAll) accessMode |= PERMISSION_LIST_ALL;\n if (permissions.delete) accessMode |= PERMISSION_DELETE;\n return accessMode;\n}\n\n// Individual permission type for type safety\nexport type ObjectPermission =\n | 'use'\n | 'edit'\n | 'create'\n | 'list'\n | 'verify'\n | 'geolocate'\n | 'listAll'\n | 'delete';\n\n/**\n * Permission scopes for workspace access control.\n * Maps to lib/context/scopes.py - keep in sync.\n *\n * Naming convention: NAMESPACE_ACTION\n * Actions: READ, WRITE, ADMIN\n */\nexport enum Scope {\n // Workspace\n WORKSPACE_READ = 'workspace:read',\n WORKSPACE_WRITE = 'workspace:write',\n WORKSPACE_ADMIN = 'workspace:admin',\n\n // Members\n MEMBERS_READ = 'members:read',\n MEMBERS_WRITE = 'members:write',\n MEMBERS_ADMIN = 'members:admin',\n\n // Member Filters (separate resource from members)\n MEMBER_FILTERS_READ = 'member_filters:read',\n MEMBER_FILTERS_WRITE = 'member_filters:write',\n MEMBER_FILTERS_ADMIN = 'member_filters:admin',\n\n // Member Roles\n MEMBER_ROLES_READ = 'member_roles:read',\n MEMBER_ROLES_WRITE = 'member_roles:write',\n MEMBER_ROLES_ADMIN = 'member_roles:admin',\n\n // Chat\n CHATS_READ = 'chats:read',\n CHATS_WRITE = 'chats:write',\n CHATS_ADMIN = 'chats:admin',\n\n // Direct Messages\n DIRECT_MESSAGES_READ = 'dm:read',\n DIRECT_MESSAGES_WRITE = 'dm:write',\n DIRECT_MESSAGES_ADMIN = 'dm:admin',\n\n // Assistant\n ASSISTANTS_READ = 'assistants:read',\n ASSISTANTS_WRITE = 'assistants:write',\n ASSISTANTS_ADMIN = 'assistants:admin',\n\n // Workflow\n WORKFLOWS_READ = 'workflows:read',\n WORKFLOWS_WRITE = 'workflows:write',\n WORKFLOWS_ADMIN = 'workflows:admin',\n\n // Assignment\n ASSIGNMENTS_READ = 'assignments:read',\n ASSIGNMENTS_WRITE = 'assignments:write',\n ASSIGNMENTS_ADMIN = 'assignments:admin',\n\n // Automation\n AUTOMATIONS_READ = 'automations:read',\n AUTOMATIONS_WRITE = 'automations:write',\n AUTOMATIONS_ADMIN = 'automations:admin',\n\n // Data Types\n DATATYPES_READ = 'datatypes:read',\n DATATYPES_WRITE = 'datatypes:write',\n DATATYPES_ADMIN = 'datatypes:admin',\n\n // Records (Data instances)\n RECORDS_READ = 'records:read',\n RECORDS_WRITE = 'records:write',\n RECORDS_ADMIN = 'records:admin',\n\n // Files\n FILES_READ = 'files:read',\n FILES_WRITE = 'files:write',\n FILES_ADMIN = 'files:admin',\n\n // Sites\n SITES_READ = 'sites:read',\n SITES_WRITE = 'sites:write',\n SITES_ADMIN = 'sites:admin',\n\n // Agents\n AGENTS_READ = 'agents:read',\n AGENTS_WRITE = 'agents:write',\n AGENTS_ADMIN = 'agents:admin',\n\n // Calendar\n CALENDARS_READ = 'calendars:read',\n CALENDARS_WRITE = 'calendars:write',\n CALENDARS_ADMIN = 'calendars:admin',\n\n // Inbox\n INBOXES_READ = 'inboxes:read',\n INBOXES_WRITE = 'inboxes:write',\n INBOXES_ADMIN = 'inboxes:admin',\n\n // Phone\n PHONES_READ = 'phones:read',\n PHONES_WRITE = 'phones:write',\n PHONES_ADMIN = 'phones:admin',\n\n // Webhooks\n WEBHOOKS_READ = 'webhooks:read',\n WEBHOOKS_WRITE = 'webhooks:write',\n WEBHOOKS_ADMIN = 'webhooks:admin',\n WEBHOOKS_RAW = 'webhooks:raw', // Access to raw webhook payloads\n\n // Apps\n APPS_READ = 'apps:read',\n APPS_WRITE = 'apps:write',\n APPS_ADMIN = 'apps:admin',\n\n // Labels\n LABELS_READ = 'labels:read',\n LABELS_WRITE = 'labels:write',\n\n // Analytics\n ANALYTICS_READ = 'analytics:read',\n\n // Operator\n OPERATOR_READ = 'operator:read',\n OPERATOR_WRITE = 'operator:write',\n\n // Organization\n ORG_INFO = 'org:info',\n ORG_READ = 'org:read',\n ORG_WRITE = 'org:write',\n ORG_ADMIN = 'org:admin',\n ORG_BILLING = 'org:billing',\n ORG_DELETE = 'org:delete', // Delete organization (owner only)\n}\n","// Member-related types extracted from main types.ts file\n// This file contains all types related to workspace members, roles, labels, and member management\n\n// ===== MEMBER TYPE ENUM =====\n/**\n * Member lifecycle states with increasing levels of permanence.\n * Matches the Python MemberType enum in lib/constants.py\n */\nexport enum MemberType {\n /** Temporary, unverified caller (e.g., unknown phone number). Does not require an account. */\n ANONYMOUS = 'anonymous',\n /** Sandbox account for testing. Does not require an account. Excluded from billing/analytics. */\n TEST = 'test',\n /** Real, verified user. Requires an account. Counted in billing and analytics. */\n MEMBER = 'member',\n /** AI agent that can communicate via DMs, email, SMS, voice. Has an AgentConfig. */\n AGENT = 'agent',\n}\n\nimport type {\n Milestone,\n MilestoneFormData,\n MilestoneGoal,\n MilestoneGoalFormData,\n} from './milestoneTypes';\nimport type { MemberSortField, SortOrder } from './sortTypes';\n\n// ===== AGENT CONFIG TYPES =====\n/**\n * Agent-specific configuration for members with member_type='agent'.\n * Stores AI model configuration and behavior settings.\n */\nexport interface AgentConfig {\n id: number;\n memberId: number;\n chatModelId: string;\n chatModelConfig?: Record<string, unknown>;\n realtimeModelId?: string;\n realtimeModelConfig?: Record<string, unknown>;\n systemPrompt: string;\n heartbeatEnabled: boolean;\n heartbeatCron?: string;\n heartbeatPrompt?: string;\n maxDailyActions?: number;\n tools?: string[];\n codeInterpreterEnabled?: boolean;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface AgentConfigFormData {\n chatModelId: string;\n chatModelConfig?: Record<string, unknown>;\n realtimeModelId?: string;\n realtimeModelConfig?: Record<string, unknown>;\n systemPrompt: string;\n heartbeatEnabled?: boolean;\n heartbeatCron?: string;\n heartbeatPrompt?: string;\n maxDailyActions?: number;\n tools?: string[];\n codeInterpreterEnabled?: boolean;\n}\n\n// ===== MEMBER LABEL TYPES =====\nexport interface MemberLabel {\n id: number;\n uuid: string;\n name: string;\n slug: string;\n color: string;\n description?: string;\n}\n\nexport interface MemberLabelFormData {\n name: string;\n slug?: string;\n description?: string;\n color: string;\n}\n\n// ===== MEMBER FILTER TYPES =====\nexport type MemberFilterObjectType =\n | 'label'\n | 'dataType'\n | 'member'\n | 'memberRole'\n | 'name'\n | 'email'\n | 'phone'\n | 'phoneType'\n | 'workflow'\n | 'tosAccepted'\n | 'notifySms'\n | 'notifyEmail'\n | 'calendarEvent'\n | 'chatEngagement'\n | 'lastMessageActivity'\n | 'memberCreated'\n | 'isDefault'\n | 'memberType'\n | 'memberField';\nexport type MemberFilterFilterType =\n | 'any'\n | 'all'\n | 'none'\n | 'partial'\n | 'notPartial'\n | 'exact'\n | 'equals'\n | 'notEquals'\n | 'notContains'\n | 'atLeast'\n | 'atMost'\n | 'field'\n | 'dateFilter'\n | 'greaterThan'\n | 'greaterThanOrEqual'\n | 'lessThan'\n | 'lessThanOrEqual'\n | 'within'\n | 'olderThan'\n | 'never'\n | 'isEmpty'\n | 'notEmpty'\n | 'before'\n | 'after'\n | 'between'\n | 'daysAgo'\n | 'hasKey'\n | 'hasKeyValue';\n\nexport interface MemberFilterRule {\n id: number;\n uuid: string;\n objectType: MemberFilterObjectType;\n filterType: MemberFilterFilterType;\n objectIds?: number[];\n query?: string;\n}\n\nexport interface MemberFilterRuleFormData {\n objectType: MemberFilterObjectType;\n filterType: MemberFilterFilterType;\n objectIds?: number[];\n query?: string;\n}\n\nexport interface MemberFilter {\n id: number;\n name: string;\n uuid: string;\n description?: string;\n pinned?: boolean;\n createdAt: string;\n updatedAt: string;\n rules: MemberFilterRule[];\n}\n\nexport interface MemberFilterFormData {\n name: string;\n description?: string;\n pinned?: boolean;\n rules: MemberFilterRuleFormData[];\n}\n\n// ===== MEMBER ROLE TYPES =====\nexport interface MemberRoleTaskAccess {\n taskId: number;\n accessMode: number;\n}\n\nexport interface MemberRoleSiteAccess {\n siteId: number;\n accessMode: number;\n}\n\nexport interface MemberRoleDataTypeAccess {\n dataTypeId: number;\n accessMode: number;\n}\n\nexport interface MemberRoleWorkflowAccess {\n workflowId: number;\n accessMode: number;\n}\n\nexport interface MemberRoleInboxAccess {\n inboxId: number;\n accessMode: number;\n}\n\nexport interface MemberRoleFileAccess {\n fileId: number;\n accessMode: number;\n}\n\nexport interface MemberRoleFolderAccess {\n folderId: number;\n accessMode: number;\n}\n\nexport interface MemberRoleCalendarAccess {\n calendarId: number;\n accessMode: number;\n}\n\nexport interface MemberRole {\n id: number;\n uuid: string;\n name: string;\n grantedScopes: string[];\n taskAccess: MemberRoleTaskAccess[];\n siteAccess: MemberRoleSiteAccess[];\n dataTypeAccess: MemberRoleDataTypeAccess[];\n workflowAccess: MemberRoleWorkflowAccess[];\n inboxAccess: MemberRoleInboxAccess[];\n fileAccess: MemberRoleFileAccess[];\n folderAccess: MemberRoleFolderAccess[];\n calendarAccess: MemberRoleCalendarAccess[];\n memberCount: number;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface MemberRoleFormData {\n name?: string;\n grantedScopes?: string[];\n taskAccess?: MemberRoleTaskAccess[];\n siteAccess?: MemberRoleSiteAccess[];\n dataTypeAccess?: MemberRoleDataTypeAccess[];\n workflowAccess?: MemberRoleWorkflowAccess[];\n inboxAccess?: MemberRoleInboxAccess[];\n fileAccess?: MemberRoleFileAccess[];\n folderAccess?: MemberRoleFolderAccess[];\n calendarAccess?: MemberRoleCalendarAccess[];\n}\n\n// ===== MEMBER TYPES =====\nexport interface Member {\n id: number;\n // Unique identifier for this member (used for cookies, cross-workspace references)\n uuid: string;\n // Nullable for test/anonymous members (they don't have accounts)\n accountUuid?: string | null;\n memberRoleId: number;\n\n // Consolidated member fields (from personas consolidation migration)\n name?: string;\n description?: string;\n phone?: string;\n phoneType?: string;\n email?: string;\n externalId?: string;\n\n // Trust flags - admin has authorized direct access via this credential\n // See: docs/projects/active/verified-credentials-fix.md\n emailTrusted?: boolean;\n phoneTrusted?: boolean;\n\n tosAccepted?: boolean;\n accountTosAccepted?: boolean;\n memberRoleName?: string;\n\n notifySms?: boolean;\n notifyEmail?: boolean;\n notifyVoice?: boolean;\n\n accountEnabled?: boolean;\n isOrgOwner?: boolean;\n isSuperuser?: boolean;\n\n // Organization role: 'owner', 'admin', 'member', or null\n orgRole?: 'owner' | 'admin' | 'member' | null;\n\n // Member type (member, test, anonymous, agent)\n memberType?: MemberType;\n isArchived?: boolean;\n\n // For agent members: their AI configuration (eagerly loaded when available)\n agentConfig?: AgentConfig | null;\n\n // Owner member ID - if set, this member is owned by another member\n // Owned members cannot log in directly; the owner \"acts as\" them via X-Acting-As-Member header\n ownerId?: number | null;\n ownerName?: string | null;\n\n // Whether this member can log in directly (has account_uuid)\n // Members with canLogin=true have their contact info synced bidirectionally with the Account\n canLogin?: boolean;\n\n locale: string | null; // BCP 47 locale from account (e.g., en-US, en-GB, es-MX), null = workspace default\n timezone?: string; // IANA timezone from account (e.g., America/Los_Angeles)\n\n // Timestamps\n createdAt?: string;\n updatedAt?: string;\n\n // Labels\n labels?: MemberLabel[];\n}\n\n/**\n * Response for the current user's member profile (/me endpoint).\n * Extends Member with scopes and org role - the effective permissions the API honors.\n */\nexport interface CurrentMember extends Member {\n // Effective scopes for the current user in this workspace.\n // These are what the API actually honors for permission checks.\n scopes: string[];\n\n // The user's role in the organization: 'owner', 'admin', or 'member'\n orgRole: 'owner' | 'admin' | 'member' | null;\n}\n\nexport interface MemberFormData {\n tosAccepted?: boolean;\n memberRoleId?: number;\n notifySms?: boolean;\n notifyEmail?: boolean;\n notifyVoice?: boolean;\n\n // Consolidated member fields (from personas consolidation migration)\n name?: string;\n description?: string;\n phone?: string;\n email?: string;\n externalId?: string;\n}\n\n// ===== WORKSPACE MEMBER TYPES =====\nexport interface CreateWorkspaceMemberRequest {\n // Account identification - one of these is required for creation\n email?: string;\n phone?: string;\n accountUuid?: string;\n\n // Trust flags - admin has authorized direct access via this credential\n // See: docs/projects/active/verified-credentials-fix.md\n emailTrusted?: boolean;\n phoneTrusted?: boolean;\n\n // Member details\n name?: string;\n description?: string;\n externalId?: string;\n\n // Role and permissions\n memberRoleId: number;\n\n // Notification preferences\n notifySms?: boolean;\n notifyEmail?: boolean;\n notifyVoice?: boolean;\n\n // Locale preference (BCP 47 format, stored in account.locale)\n locale?: string;\n\n // Timezone preference (IANA timezone identifier, stored in account.timezone)\n timezone?: string;\n\n // Label assignments\n labelIds?: number[];\n\n // Member terms\n tosAccepted?: boolean;\n\n // Account-specific fields (only used by orgOwners/superusers)\n accountEnabled?: boolean;\n isOrgOwner?: boolean;\n accountTosAccepted?: boolean;\n\n // Member type (member, test, anonymous)\n memberType?: MemberType;\n\n // Owner member ID - for creating owned identities (persona switching)\n // When set, the created member will be owned by this member\n ownerId?: number;\n}\n\nexport interface UpdateWorkspaceMemberRequest {\n // Member details (null = clear field, undefined = don't update)\n name?: string | null;\n description?: string | null;\n phone?: string | null;\n email?: string | null;\n externalId?: string | null;\n\n // Role and permissions\n memberRoleId?: number;\n labelIds?: number[];\n\n // Notification preferences\n notifySms?: boolean;\n notifyEmail?: boolean;\n notifyVoice?: boolean;\n\n // Trust flags for direct workspace access without account verification\n // If phone/email changes and these aren't set, they auto-clear to false\n // See: docs/projects/active/verified-credentials-fix.md\n emailTrusted?: boolean;\n phoneTrusted?: boolean;\n\n // Locale preference (BCP 47 format, stored in account.locale)\n // null = clear to use workspace default\n locale?: string | null;\n\n // Timezone preference (IANA timezone identifier, stored in account.timezone)\n // null = clear to use workspace default\n timezone?: string | null;\n\n // Other settings\n tosAccepted?: boolean;\n\n // Account-specific fields (only used by orgOwners/superusers)\n accountEnabled?: boolean;\n isOrgOwner?: boolean;\n isSuperuser?: boolean;\n accountTosAccepted?: boolean;\n\n // Member type (member, test, anonymous)\n memberType?: MemberType;\n}\n\n// ===== MEMBER MANAGEMENT TYPES =====\nexport interface MergeMembersRequest {\n targetMemberId: number;\n sourceMemberIds: number[];\n}\n\nexport interface MergeMembersResponse {\n member: Member;\n mergedCount: number;\n dataRecordsTransferred: number;\n}\n\nexport interface NormalizeMemberRequest {\n memberId: number;\n}\n\nexport interface NormalizeMemberResponse {\n member: Member;\n changes: Record<string, { old: string; new: string }>;\n}\n\n// ===== MEMBER REPORTING TYPES =====\nexport interface MemberReportItem {\n id: number;\n account_uuid: string;\n email?: string | null;\n phone?: string | null;\n name?: string | null;\n external_id?: string | null;\n created_at: string;\n updated_at: string;\n member_role_id: number;\n member_role_name: string;\n}\n\n// ===== SIGNUP MEMBER TYPES =====\nexport interface SignupMemberResponse {\n id: number;\n name?: string;\n description?: string;\n phone?: string;\n email?: string;\n labels: string[];\n externalId?: string;\n memberRoleId: number;\n createdAt: string;\n tosAccepted: boolean;\n}\n\nexport interface SignupAccountResponse {\n id: number;\n uuid: string;\n email?: string;\n phone?: string;\n name?: string;\n createdAt: Date;\n}\n\nexport interface CreateSignupResponse {\n token: string;\n account: SignupAccountResponse;\n member: SignupMemberResponse;\n wasCreated: boolean;\n}\n\n// ===== MEMBER QUERY TYPES =====\nexport interface MembersQueryParams {\n page?: number;\n pageSize?: number;\n sortBy?: MemberSortField;\n sortOrder?: SortOrder;\n search?: string;\n labelIds?: number[];\n memberRoleId?: number;\n memberType?: string;\n hasAccount?: boolean;\n}\n\n// ===== MEMBER NOTIFICATION TYPES =====\n// Member notification types have been moved to notificationTypes.ts\n\n// ===== MESSAGE ACTIVITY TYPES =====\nexport interface MemberMessageActivity {\n [memberId: number]: number[]; // Array of daily message counts (oldest to most recent)\n}\n\n// ===== MILESTONE TYPES RE-EXPORTS =====\n// Milestone types have been moved to milestoneTypes.ts but are re-exported here for backward compatibility\nexport type { Milestone, MilestoneFormData, MilestoneGoal, MilestoneGoalFormData };\n\n// ===== ANONYMOUS MEMBER RESOLUTION TYPES =====\nexport type AnonymousMemberResolutionStatus = 'pending' | 'resolved' | 'expired';\n\n/** Summary of the anonymous member's interaction (usually a single call). */\nexport interface AnonymousInteraction {\n chatId?: number;\n chatTitle?: string;\n chatSummary?: string;\n callId?: number;\n callStatus?: string;\n callCreatedAt?: string;\n callDurationSeconds?: number;\n}\n\nexport interface AnonymousMemberResolution {\n id: number;\n anonymousMemberId?: number; // undefined if anonymous member was merged/deleted\n anonymousMemberName?: string;\n identifierType: string; // 'phone', 'email', 'external_id'\n identifierValue: string;\n status: AnonymousMemberResolutionStatus;\n resolvedToMemberId?: number;\n resolvedToMemberName?: string;\n resolvedByMemberId?: number;\n resolvedByMemberName?: string;\n resolutionNotes?: string;\n createdAt: string;\n resolvedAt?: string;\n /** The call/chat that created this anonymous member */\n interaction?: AnonymousInteraction;\n}\n\nexport interface ResolveAnonymousMemberRequest {\n targetMemberId: number;\n notes?: string;\n}\n\nexport interface ExpireAnonymousMemberRequest {\n notes?: string;\n}\n\nexport interface CreateAnonymousMemberRequest {\n identifierType: string;\n identifierValue: string;\n name?: string;\n memberRoleId?: number;\n}\n\nexport interface PendingAnonymousMembersResponse {\n items: AnonymousMemberResolution[];\n total: number;\n}\n\n// ===== AGENT TYPES =====\n/**\n * Agent response model - represents a Member with member_type='agent' and its AgentConfig.\n * Agents are AI personas that can communicate via DMs, email, SMS, and voice.\n */\nexport interface Agent {\n // Member fields\n id: number;\n uuid: string;\n name?: string;\n description?: string;\n email?: string;\n phone?: string;\n externalId?: string;\n memberRoleId: number;\n memberRoleName: string;\n memberType: MemberType.AGENT;\n isArchived: boolean;\n // Owner member - if set, this is a personal agent owned by another member\n ownerId?: number | null;\n ownerName?: string | null;\n createdAt: string;\n updatedAt: string;\n\n // Labels\n labels: MemberLabel[];\n\n // Agent configuration\n config: AgentConfig;\n}\n\nexport interface CreateAgentRequest {\n // Member fields\n name: string;\n description?: string;\n email?: string;\n phone?: string;\n externalId?: string;\n memberRoleId: number;\n labelIds?: number[];\n // Owner member ID - if set, the agent is owned by this member (personal agent)\n // and can be switched to via identity switching\n ownerId?: number;\n\n // Agent configuration\n chatModelId: string;\n chatModelConfig?: Record<string, unknown>;\n realtimeModelId?: string;\n realtimeModelConfig?: Record<string, unknown>;\n systemPrompt: string;\n heartbeatEnabled?: boolean;\n heartbeatCron?: string;\n heartbeatPrompt?: string;\n maxDailyActions?: number;\n tools?: string[];\n codeInterpreterEnabled?: boolean;\n}\n\nexport interface UpdateAgentRequest {\n // Member fields (all optional for partial updates)\n name?: string;\n description?: string;\n email?: string;\n phone?: string;\n externalId?: string;\n memberRoleId?: number;\n labelIds?: number[];\n archived?: boolean;\n\n // Agent configuration (all optional for partial updates)\n chatModelId?: string;\n chatModelConfig?: Record<string, unknown>;\n realtimeModelId?: string;\n realtimeModelConfig?: Record<string, unknown>;\n systemPrompt?: string;\n heartbeatEnabled?: boolean;\n heartbeatCron?: string;\n heartbeatPrompt?: string;\n maxDailyActions?: number;\n tools?: string[];\n codeInterpreterEnabled?: boolean;\n}\n","// MCP Server related types\n\nexport enum McpServerState {\n REGISTER = 'register',\n AUTHORIZE = 'authorize',\n READY = 'ready',\n}\n\nexport interface McpTool {\n name: string;\n description?: string;\n inputSchema?: Record<string, any>;\n}\n\nexport interface McpServer {\n id: number;\n uuid: string;\n name: string;\n slug: string;\n enabled: boolean;\n description?: string;\n mcpUrl: string;\n appUuid?: string;\n credentialId?: number;\n state: McpServerState;\n creatorId?: number | null;\n creatorName?: string | null;\n supportsDirectAuth: boolean;\n serverName?: string;\n serverVersion?: string;\n serverInstructions?: string;\n createdAt: string;\n updatedAt: string;\n lastConnectedAt?: string;\n tools: McpTool[];\n permissions: number;\n authorizationUrl?: string;\n oauthClientId?: string; // OAuth client ID (populated after registration)\n authMetadata?: Record<string, any>; // OAuth authorization server metadata\n registrationUrl?: string; // URL for manual OAuth client registration\n iconUrl?: string; // URL to fetch the MCP server icon\n}\n\nexport interface McpServerFormData {\n name: string;\n slug?: string;\n description?: string;\n mcpUrl: string;\n appUuid?: string;\n authToken?: string;\n oauthAccessToken?: string;\n oauthClientId?: string; // For manual OAuth registration\n oauthClientSecret?: string; // For manual OAuth registration\n authMetadata?: Record<string, any>; // OAuth authorization server metadata\n supportsDirectAuth?: boolean;\n}\n\nexport interface McpServerUpdateFormData {\n name?: string;\n slug?: string;\n description?: string;\n mcpUrl?: string;\n authToken?: string;\n oauthAccessToken?: string;\n oauthClientId?: string; // For manual OAuth registration\n oauthClientSecret?: string; // For manual OAuth registration\n authMetadata?: Record<string, any>; // OAuth authorization server metadata\n supportsDirectAuth?: boolean;\n}\n","// Toolkit and Tool related types\n\nexport enum ToolkitState {\n DISABLED = 'disabled',\n ENABLED = 'enabled',\n AUTH = 'auth',\n}\n\nexport interface ToolParameter {\n name: string;\n type: string;\n description: string;\n required?: boolean;\n enum?: string[];\n default?: any;\n}\n\nexport interface ToolInputSchema {\n type: string;\n properties: Record<string, Record<string, any>>;\n required: string[];\n additionalProperties?: boolean;\n}\n\nexport interface Tool {\n name: string;\n displayName: string;\n description: string;\n autoEnabled?: boolean;\n inputSchema: ToolInputSchema;\n uri?: string; // Tool URI (e.g., \"builtin:talk_to_human\", \"custom:4:create_user\")\n llmName?: string; // LLM-facing name (e.g., \"ct__my_tools__create_user\")\n requiresChat?: boolean; // If true, tool requires a chat context and can't be executed standalone\n toolType?: string; // Category for dynamic tools (e.g., \"data_create\", \"data_update\")\n toolMeta?: Record<string, unknown>; // Additional metadata (e.g., { dataTypeId: 42 })\n loaded?: boolean; // False if deferred (requires tool_search to activate)\n}\n\nexport interface Toolkit {\n name: string;\n displayName: string;\n description?: string;\n state: ToolkitState;\n tools: Tool[];\n}\n\nexport interface ToolkitsResponse {\n toolkits: Toolkit[];\n}\n\n/**\n * Response from the tool lookup endpoint.\n * Contains details for a single tool including its parent toolkit.\n */\nexport interface ToolResponse {\n name: string;\n displayName: string;\n description?: string;\n toolkit: string; // Toolkit slug\n toolkitDisplayName: string;\n toolType?: string; // Category for dynamic tools (e.g., \"calendar_book\", \"data_create\")\n}\n\n// Deprecated - use ToolkitsResponse instead\nexport interface ToolsResponse {\n tools: Tool[];\n}\n\nexport interface ExecuteToolResponse {\n toolName: string;\n result: string;\n success: boolean;\n chatId?: number | null;\n}\n","// Event-related types extracted from main types.ts file\n// This file contains all types related to event rules, webhooks, scheduled events, and automation\n\nimport type { SortOrder } from './coreTypes';\nimport type { DataRecord } from './dataTypes';\nimport type { Member } from './memberTypes';\nimport type { MemberNotifyActionParams } from './notificationTypes';\nimport type {\n EventRunSortField,\n EventSortField,\n RuleExecutionSortField,\n WebhookLogSortField,\n} from './sortTypes';\n\n// ===== EVENT RULE CORE TYPES =====\n\nexport enum EventRuleObjectType {\n TASK = 'task',\n WORKSPACE = 'workspace',\n CHAT = 'chat',\n DATA_RECORD = 'data_record',\n MEMBER = 'member',\n EVENT = 'scheduled_event',\n SUBSCRIPTION = 'subscription',\n WORKFLOW = 'workflow',\n CALENDAR = 'calendar',\n CALENDAR_EVENT_TYPE = 'calendar_event_type',\n MONDAY = 'monday',\n}\n\nexport enum EventRuleEventType {\n ASSIGNMENT_ENTERED = 'task:entered',\n ASSIGNMENT_EXITED = 'task:exited',\n\n MEMBER_JOINED = 'workspace:member_joined',\n MEMBER_LEFT = 'workspace:member_left',\n\n DATA_RECORD_CREATED = 'data_record:created',\n DATA_RECORD_UPDATED = 'data_record:updated',\n\n CHAT_CREATED = 'chat:created',\n CHAT_CALLBACK = 'chat:callback',\n\n MEMBER_UPDATED = 'member:updated',\n\n EVENT_TRIGGERED = 'scheduled_event:triggered',\n\n SUBSCRIPTION_CREATED = 'subscription:created',\n\n ASSISTANT_MESSAGE = 'workflow:assistant_message',\n USER_MESSAGE = 'workflow:user_message',\n\n CALENDAR_EVENT_CREATED = 'calendar_event:created',\n CALENDAR_EVENT_UPDATED = 'calendar_event:updated',\n CALENDAR_EVENT_CANCELLED = 'calendar_event:cancelled',\n CALENDAR_EVENT_STARTING = 'calendar_event:starting',\n CALENDAR_EVENT_ENDED = 'calendar_event:ended',\n\n // Monday.com event types\n MONDAY_WEBHOOK = 'monday:webhook',\n}\n\nexport enum EventRuleActionType {\n MEMBER_NOTIFY_ACTION = 'member:notify',\n MEMBER_LABEL_ACTION = 'member:label',\n MEMBER_UPSERT = 'member:upsert',\n SEND_WEBHOOK = 'webhook:send',\n SWITCH_TASK_ACTION = 'task:switch',\n ASSISTANT_MESSAGE = 'assistant:message',\n FORM_FIELD_UPDATE = 'form:update_field',\n MESSAGE_VALIDATION = 'message:validation',\n CHAT_CREATE = 'chat:create',\n CHAT_CONTINUE = 'chat:continue',\n CHAT_SUMMARIZE = 'chat:summarize',\n EMAIL_SEND = 'email:send',\n INVOKE_CUSTOM_TOOL = 'custom_tool:invoke',\n INVOKE_SUPERVISOR = 'supervisor:invoke',\n MONDAY_UPSERT_ITEM = 'monday:upsert_item',\n MONDAY_REFRESH = 'monday:refresh',\n // Legacy - will be migrated to MONDAY_UPSERT_ITEM\n MONDAY_CREATE_ITEM = 'monday:create_item',\n ASSIGNMENT_CONCLUDE = 'assignment:conclude',\n}\n\n// ===== SECRET HANDLING =====\n\n/**\n * Sentinel value returned by the API when a secret field (like apiToken) is set.\n * The client should detect this value and show a \"secret is set\" state instead\n * of the actual value. When sending updates, if the user hasn't changed the\n * secret, either omit the field or don't include it in the request.\n */\nexport const MASKED_SECRET_SENTINEL = '__SECRET_SET__';\n\n// ===== EVENT RULE ACTION PARAMETERS =====\n\n// Re-export MemberNotifyActionParams for backward compatibility\nexport type { MemberNotifyActionParams };\n\nexport interface MemberLabelActionParams {\n addLabelIds?: string[];\n removeLabelIds?: string[];\n}\n\nexport type MemberUpsertBehavior = 'upsert' | 'create_only' | 'update_only';\n\nexport interface MemberUpsertActionParams {\n /** Controls create/update behavior: 'upsert' (default), 'create_only', or 'update_only' */\n behavior?: MemberUpsertBehavior;\n /** If true and member exists, skip instead of failing (only for create_only) */\n skipIfExists?: boolean;\n /** If true and member not found, skip instead of failing (only for update_only) */\n skipIfNotFound?: boolean;\n}\n\nexport interface WebhookActionParams {\n webhookUrl: string;\n}\n\nexport interface SwitchTaskActionParams {\n taskUUID: string;\n}\n\nexport interface AssistantMessageActionParams {\n message: string;\n suggestions?: string[];\n // Translation support - maps locale to translated message/suggestions\n messageTranslations?: Record<string, string>;\n suggestionTranslations?: Record<string, string[]>;\n}\n\nexport interface FormFieldUpdateActionParams {\n fieldPath?: string; // Format: \"datatype.field\"\n value: any;\n updateType?: 'newest' | 'oldest' | 'create'; // For collection data types\n}\n\nexport interface MessageValidationActionParams {\n condition?: string; // CEL expression that determines if the message is invalid\n reason?: string; // Custom rejection reason\n}\n\nexport interface ChatCreateActionParams {\n workflowUUID?: string; // New workflow-based approach\n taskUUID?: string; // Legacy task-based approach (for backward compatibility)\n channel?: string; // Single channel: 'phone-sms' | 'phone-voice' | 'email' | 'web-chat'\n channels?: string[]; // Legacy array of channels (for backward compatibility)\n phoneNumberUUID?: string; // Required when phone-sms or phone-voice is selected\n inboxUUID?: string; // Required when email is selected\n initialUserMessage?: string; // Optional initial message to send from user\n}\n\nexport interface ChatContinueActionParams {\n assistantPrompt?: string; // Optional prompt to determine if continuation is needed (e.g., \"if the chat has not yet been continued\")\n updateType?: string; // Optional update type\n}\n\nexport interface ChatSummarizeActionParams {\n summarizationPrompt?: string; // Optional prompt to focus the summarization\n chatModel?: string; // Optional chat model to use for summarization\n}\n\nexport interface InvokeCustomToolActionParams {\n customToolId: number;\n outputMode?: 'none' | 'tool_output' | 'assistant_message';\n}\n\nexport interface InvokeSupervisorActionParams {\n customToolId: number; // Must be a supervisor (tool_type='supervisor')\n includeHistory?: boolean; // Include full chat history vs current message only (default: true)\n // Note: Capabilities are now configured on the supervisor itself, not in the event rule\n}\n\nexport interface ConcludeAssignmentActionParams {\n outcome: string; // 'success' | 'failed' | 'referred'\n reason?: string; // Optional reason for conclusion\n}\n\nexport interface EmailSendActionParams {\n subjectTemplate: string; // Template for email subject (supports template variables)\n bodyTemplate: string; // Template for email body (supports template variables)\n inboxUUID: string; // Required: UUID of the inbox to send from\n toEmail?: string; // Optional: Override recipient email (defaults to member's email)\n contentType?: 'text' | 'html'; // Content type: 'text' for plain text, 'html' for HTML (default: 'text')\n}\n\n/**\n * Column mapping for Monday.com create item action.\n * Stores the column slug (e.g., 'text_abc123') and the user-friendly label\n * along with the Jinja template value.\n */\nexport interface MondayColumnMapping {\n columnId: string; // Monday.com column slug (e.g., 'text_abc123', 'status')\n columnTitle: string; // User-friendly column label (e.g., 'Description', 'Status')\n columnType: string; // Column type (e.g., 'text', 'status', 'date')\n template: string; // Jinja template string for the value\n}\n\n/**\n * Upsert mode for Monday.com item action.\n * Controls whether to create new items, update existing items, or both.\n */\nexport type MondayUpsertMode = 'create_only' | 'update_only' | 'upsert';\n\n/**\n * Lookup type for Monday.com item action.\n * Controls how to find existing items to update.\n */\nexport type MondayLookupType = 'column_value' | 'item_id';\n\n/**\n * Behavior when multiple items match the lookup criteria.\n */\nexport type MultiMatchBehavior = 'fail' | 'update_first' | 'update_all';\n\n/**\n * Parameters for upserting (create or update) a Monday.com item.\n * This is the primary action for Monday.com item operations.\n */\nexport interface MondayUpsertItemActionParams {\n boardId: string; // Monday.com board ID\n groupId?: string; // Optional: Group ID within the board (for new items)\n itemNameTemplate?: string; // Template for item name when creating (required for create modes)\n columnMappings?: MondayColumnMapping[]; // Column mappings with templates\n\n // Lookup configuration - used to find existing items to update\n lookupType?: MondayLookupType; // 'column_value' (default) or 'item_id'\n lookupColumnId?: string; // Column ID to search by (only for column_value lookup)\n lookupValueTemplate?: string; // Template for lookup value or Item ID\n\n // Upsert mode controls the action behavior\n upsertMode?: MondayUpsertMode; // 'create_only' | 'update_only' | 'upsert' (default: 'upsert')\n\n // Behavior flags\n multiMatchBehavior?: MultiMatchBehavior; // Behavior when multiple items match (default: 'fail')\n\n // OAuth token is copied from user's connection at rule creation time\n apiToken?: string; // Monday.com API token (auto-populated from OAuth, encrypted at rest)\n}\n\n/**\n * Column mapping for Monday.com refresh action.\n * Maps Monday.com columns to member or data fields.\n */\nexport interface MondayRefreshColumnMapping {\n columnId: string; // Monday.com column slug (e.g., 'text_abc123')\n columnType: string; // Column type (e.g., 'text', 'email', 'phone', 'status')\n}\n\n/**\n * Parameters for refreshing member data from Monday.com.\n * Fetches data from a Monday.com item and updates the local member record.\n */\nexport interface MondayRefreshActionParams {\n boardId: string; // Monday.com board ID containing the item\n itemIdSource?: string; // Template to get Monday item ID (default: '{{member.external_id}}')\n skipIfNoItemId?: boolean; // Skip if item ID cannot be determined (default: true)\n\n // Member field mappings: field_name -> {columnId, columnType}\n memberFieldMappings?: Record<string, MondayRefreshColumnMapping>;\n\n // Data field mappings for form data\n dataFieldMappings?: Record<string, any>;\n\n // OAuth token is copied from user's connection at rule creation time\n apiToken?: string; // Monday.com API token (auto-populated from OAuth, encrypted at rest)\n}\n\n// ===== EVENT RULE INTERFACE =====\n\nexport interface EventRule {\n id: number;\n uuid: string;\n objectType: EventRuleObjectType;\n name: string | null;\n eventType: EventRuleEventType;\n conditions: string | null;\n actionType: EventRuleActionType;\n actionParams: Record<string, any> | null;\n triggerParams: Record<string, any> | null;\n active: boolean;\n taskId?: number | null;\n dataTypeId?: number | null;\n scheduledEventId?: number | null;\n workflowId?: number | null;\n calendarId?: number | null;\n calendarEventTypeId?: number | null;\n delay: number; // Delay in seconds\n order: number; // Order of execution\n createdAt: string;\n updatedAt: string;\n error: string | null;\n errorMessage: string | null;\n failedAt: string | null;\n}\n\nexport interface EventRuleFormData {\n name?: string | null;\n uuid?: string; // Optional - if provided, will be used instead of auto-generated\n // can only set object type on create\n objectType: EventRuleObjectType;\n eventType: EventRuleEventType;\n conditions?: string | null;\n actionType: EventRuleActionType;\n actionParams?: Record<string, any>;\n triggerParams?: Record<string, any>;\n active?: boolean;\n taskId?: number | null;\n dataTypeId?: number | null;\n scheduledEventId?: number | null;\n workflowId?: number | null;\n calendarId?: number | null;\n calendarEventTypeId?: number | null;\n delay?: number; // Delay in seconds\n order?: number; // Order of execution\n}\n\nexport interface UpdateEventRuleFormData {\n // Only allow updating these fields after creation\n name?: string | null;\n conditions?: string | null;\n actionParams?: Record<string, any>;\n triggerParams?: Record<string, any>;\n active?: boolean;\n delay?: number; // Delay in seconds\n order?: number; // Order of execution\n // NOTE: objectType, eventType, actionType, and source object fields (taskId, etc.)\n // cannot be updated after creation\n}\n\n/**\n * Input type for batch event rule operations (create/update with parent object).\n * Used when syncing event rules as part of a task or workflow update.\n * UUID is required and used for matching existing rules.\n */\nexport interface EventRuleInput {\n uuid: string; // Required - used for matching/creating rules\n name?: string | null;\n objectType?: EventRuleObjectType; // Optional - inferred from parent object when used inline\n eventType: EventRuleEventType;\n actionType: EventRuleActionType;\n actionParams?: Record<string, any> | null;\n triggerParams?: Record<string, any> | null;\n conditions?: string | null;\n active?: boolean;\n delay?: number; // Delay in seconds (default 0)\n}\n\n// ===== WEBHOOK MANAGEMENT TYPES =====\n\nexport interface WebhookLog {\n id: number;\n ruleId: number;\n recordId: number;\n url: string;\n eventType: EventRuleEventType;\n statusCode: number | null;\n success: boolean;\n errorMessage: string | null;\n createdAt: string;\n rule?: EventRule;\n record?: DataRecord;\n}\n\nexport interface WebhookLogsQueryParams {\n page?: number;\n pageSize?: number;\n sortBy?: WebhookLogSortField;\n sortOrder?: SortOrder;\n eventType?: EventRuleEventType;\n success?: boolean;\n}\n\n// ===== RULE EXECUTION TYPES =====\n\nexport interface RuleExecution {\n id: number;\n ruleId: number | null;\n triggerType: string;\n actionSlug: string;\n status: 'running' | 'success' | 'failed' | 'skipped';\n messagesEmitted: number;\n taskSwitched: boolean;\n validationErrors: string[];\n errorCode?: string | null;\n errorMessage?: string | null;\n triggerFingerprint?: string | null;\n details?: Record<string, any> | null;\n createdAt: string;\n completedAt?: string | null;\n durationMs?: number | null;\n rule?: EventRule | null;\n}\n\nexport interface RuleExecutionsQueryParams {\n cursor?: string;\n pageSize?: number;\n sortBy?: RuleExecutionSortField;\n sortOrder?: SortOrder;\n ruleId?: number;\n status?: string;\n triggerType?: string;\n actionSlug?: string;\n objectType?: string;\n eventType?: string;\n actionType?: string;\n workflowId?: number;\n}\n\n// ===== SCHEDULED EVENTS TYPES =====\n\nexport interface Event {\n id: number;\n uuid: string;\n name: string;\n description?: string;\n scheduleMode: 'ONCE' | 'CRON' | 'INTERVAL';\n scheduledTime?: string;\n intervalSeconds?: number;\n repeatCount?: number;\n cronString?: string;\n memberFilterId?: number;\n targetMemberId?: number;\n limit: number;\n status: 'PENDING' | 'SCHEDULED' | 'CANCELLED' | 'PAUSED';\n active: boolean;\n ownerId: number;\n createdAt: string;\n updatedAt: string;\n eventRules?: EventRule[];\n lastRun?: EventRun;\n nextRun?: string;\n}\n\nexport interface EventRun {\n id: number;\n uuid: string;\n scheduledEventId: number;\n parentRunId?: number;\n memberId?: number;\n startedAt: string;\n completedAt?: string;\n status: 'PENDING' | 'RUNNING' | 'COMPLETED' | 'FAILED';\n errorMessage?: string;\n jobId?: string;\n member?: Member;\n}\n\nexport interface CreateEventRequest {\n name: string;\n description?: string;\n scheduleMode: 'ONCE' | 'CRON' | 'INTERVAL';\n scheduledTime?: string;\n intervalSeconds?: number;\n repeatCount?: number;\n cronString?: string;\n memberFilterId?: number;\n targetMemberId?: number;\n limit?: number;\n active?: boolean;\n}\n\nexport interface UpdateEventRequest {\n name?: string;\n description?: string;\n scheduleMode?: 'ONCE' | 'CRON' | 'INTERVAL';\n scheduledTime?: string;\n intervalSeconds?: number;\n repeatCount?: number;\n cronString?: string;\n memberFilterId?: number;\n targetMemberId?: number;\n limit?: number;\n active?: boolean;\n}\n\nexport interface EventsQueryParams {\n page?: number;\n pageSize?: number;\n sortBy?: EventSortField;\n sortOrder?: SortOrder;\n active?: boolean;\n}\n\nexport interface EventRunsQueryParams {\n page?: number;\n pageSize?: number;\n sortBy?: EventRunSortField;\n sortOrder?: SortOrder;\n eventId?: number;\n memberId?: number;\n status?: 'PENDING' | 'RUNNING' | 'COMPLETED' | 'FAILED';\n}\n\n// ===== TASK EXPORT EVENT RULE RELATIONSHIP =====\n\nexport interface TaskExportEventRuleRelation {\n taskUuid: string;\n eventRuleUuid: string;\n ruleType: string;\n}\n\nexport interface EventRuleExportItem {\n uuid: string;\n name: string;\n eventType: string;\n objectType: string;\n conditions: string | null;\n actionType: string;\n actionParams: Record<string, any>;\n}\n","// Billing and subscription-related types\n// This file contains all types related to billing, subscriptions, products, and pricing\n\n// ===== SUBSCRIPTION TYPES =====\n\nexport interface Subscription {\n id: number;\n accountId: number;\n stripeSubscriptionId: string;\n stripeProductId: string | null;\n productId: number;\n planPeriod: string; // e.g., \"month\", \"year\"\n productName: string;\n planCostPerPeriod: number | null;\n subscriptionStatus: string;\n customerWorkspaceProvisioningStatus: number | null;\n createdAt: string;\n updatedAt: string;\n customerWorkspaceUuid: string | null;\n customerWorkspaceName: string | null;\n resellerWorkspaceUuid: string | null;\n resellerWorkspaceName: string | null;\n paygBudget: number | null;\n cancelAtPeriodEnd: boolean;\n cancelAt: string | null;\n canceledAt: string | null;\n}\n\n// ===== PRODUCT TYPES =====\n\n// Product image interface\nexport interface ProductImage {\n url: string;\n caption?: string;\n}\n\n// Product link interface\nexport interface ProductLink {\n url: string;\n title: string;\n}\n\n// Product metadata interface\nexport interface ProductMetadata {\n images?: ProductImage[];\n links?: ProductLink[];\n [key: string]: any; // Allow additional fields for extensibility\n}\n\n// Product feature interface\nexport interface ProductFeature {\n id: number;\n productId: number;\n featureKey: string;\n createdAt: string;\n}\n\n// Product plan interface - used for checkout and display\n// This extends PlanConfiguration with the period key\nexport interface ProductPlan {\n period: 'month' | 'year' | 'quarter';\n stripePriceId: string;\n upfrontFeeStripePriceId?: string;\n costPerPeriod: number;\n upfrontFee: number | null;\n isTest: boolean;\n}\n\n// ===== PRODUCT FEATURE TYPES =====\n\n/**\n * Workspace product feature flags.\n * Matches the Python WorkspaceFeature enum in lib/constants.py\n */\nexport enum WorkspaceFeature {\n // Communication features\n WEB_CHAT = 'web_chat',\n WEB_VOICE = 'web_voice',\n PHONE = 'phone',\n PHONE_SMS = 'phone_sms',\n PHONE_VOICE = 'phone_voice',\n EMAIL = 'email',\n WHATSAPP = 'whatsapp',\n DISCORD = 'discord',\n SLACK = 'slack',\n\n // Platform features\n SITES = 'sites',\n WORKFLOWS = 'workflows',\n FORMS = 'forms',\n FILES = 'files',\n MAPS = 'maps',\n BROWSER = 'browser',\n WEB_SEARCH = 'web_search',\n CALENDAR = 'calendar',\n AGENTS = 'agents',\n DIRECT_MESSAGES = 'direct_messages',\n QUALIFICATIONS = 'qualifications',\n OPERATOR = 'operator',\n PRESENCE = 'presence',\n\n // Integration features\n GMAIL = 'gmail',\n GCALENDAR = 'gcalendar',\n MONDAY = 'monday',\n WORKSPACE_MANAGER = 'workspace_manager',\n DEVELOPER = 'developer',\n\n // Reseller features\n RESELL_PRODUCTS = 'resell_products',\n\n // Compliance features\n HIPAA_COMPLIANCE = 'hipaa_compliance',\n SOC2_COMPLIANCE = 'soc2_compliance',\n\n // Special/promotional features\n EARLY_ACCESS = 'early_access',\n ZOOM_OFFICE_HOURS = 'zoom_office_hours',\n\n // EHR Integration features\n EHR_FHIR = 'ehr_fhir', // Base feature for FHIR/EHR integration UI\n EHR_ECLINICALWORKS = 'ehr_eclinicalworks', // Requires EHR_FHIR\n}\n\n/**\n * Member product feature flags.\n * Matches the Python MemberFeature enum in lib/constants.py\n */\nexport enum MemberFeature {\n WEB_CHAT = 'web_chat',\n WEB_VOICE = 'web_voice',\n PHONE_SMS = 'phone_sms',\n PHONE_VOICE = 'phone_voice',\n WHATSAPP = 'whatsapp',\n EMAIL = 'email',\n}\n\n/**\n * Organization product feature flags.\n * These features apply at the organization level, affecting all workspaces.\n * Matches the Python OrgFeature enum in lib/constants.py\n */\nexport enum OrgFeature {\n // Authentication & Security\n SSO = 'sso',\n AUDIT_LOGS = 'audit_logs',\n\n // Compliance\n HIPAA_COMPLIANCE = 'hipaa_compliance',\n SOC2_COMPLIANCE = 'soc2_compliance',\n\n // Organization management\n CUSTOM_BRANDING = 'custom_branding',\n PRIORITY_SUPPORT = 'priority_support',\n}\n\n/**\n * ProductFeatureKey is the union of all possible product features.\n * It combines WorkspaceFeature, MemberFeature, and OrgFeature.\n * Matches the Python ProductFeatureKey type in lib/constants.py\n */\nexport type ProductFeatureKey = WorkspaceFeature | MemberFeature | OrgFeature;\n\n// ===== RESOURCE ENUM (UNIFIED) =====\n\n/**\n * Unified resource identifiers for products, limits, inclusions, and overages.\n * Matches the Python Resource enum in lib/constants.py\n * All values use snake_case for consistency with backend.\n */\nexport enum Resource {\n // AI usage\n AI_UNIT = 'ai_unit',\n STT = 'stt', // Speech-to-text (billed per minute)\n TTS = 'tts', // Text-to-speech (billed per character)\n\n // Communication\n SMS = 'sms',\n EMAIL = 'email',\n PHONE_CALL = 'phone_call', // Twilio phone calls (billed per minute)\n\n // Infrastructure resources\n PHONE_NUMBER = 'phone_number',\n INBOX = 'inbox',\n SITE = 'site',\n MEMBER = 'member', // All members (total workspace members)\n WORKSPACE = 'workspace', // Workspaces (for ORG-level products)\n ORG_ADMIN = 'org_admin', // Organization admins (account.org_admin == True, for ORG products)\n\n // Storage\n STORAGE_MB = 'storage_mb',\n}\n\n/**\n * Overage details for a specific resource.\n * Shows how much was included, used, and the overage cost.\n */\nexport interface ResourceOverage {\n included: number;\n used: number;\n overageAmount: number;\n overageCostCents: number;\n}\n\n/**\n * Simplified platform usage data for display components.\n * This is the shared interface used by PlatformUsageCard across all views:\n * - Workspace billing dashboard (/w/$wid/settings/billing)\n * - Admin workspace billing tab (/admin/workspaces/$wid)\n */\nexport interface PlatformUsageData {\n periodStart: string;\n periodEnd: string;\n usage: Partial<Record<Resource, number>>;\n included: Partial<Record<Resource, number>>;\n overages: Partial<Record<Resource, ResourceOverage>>;\n}\n\n// Product type enum\nexport enum ProductType {\n WORKSPACE = 'workspace', // Base workspace subscription\n MEMBER = 'member', // Per-member subscription\n ORG = 'org', // Organization-level subscription\n WORKSPACE_ADDON = 'workspace_addon', // Feature add-on for workspace subscriptions\n MEMBER_ADDON = 'member_addon', // Feature add-on for member subscriptions\n ORG_ADDON = 'org_addon', // Feature add-on for organization subscriptions\n}\n\n// ===== RESOURCE-TO-FEATURE MAPPING =====\n\n/**\n * Maps each Resource to the WorkspaceFeature that must be enabled for it to be available.\n * null means the resource is always available (no feature required).\n * Matches the Python RESOURCE_TO_FEATURE_MAP in lib/constants.py\n */\nexport const RESOURCE_TO_FEATURE_MAP: Record<Resource, WorkspaceFeature | null> = {\n // Always enabled - no feature required\n [Resource.AI_UNIT]: null,\n [Resource.STT]: null, // STT is usage-based and always available\n [Resource.TTS]: null, // TTS is usage-based and always available\n [Resource.MEMBER]: null,\n [Resource.STORAGE_MB]: null,\n\n // Feature-gated resources\n [Resource.SMS]: WorkspaceFeature.PHONE_SMS,\n [Resource.EMAIL]: WorkspaceFeature.EMAIL,\n [Resource.PHONE_CALL]: WorkspaceFeature.PHONE_VOICE,\n [Resource.PHONE_NUMBER]: WorkspaceFeature.PHONE,\n [Resource.INBOX]: WorkspaceFeature.EMAIL, // Inboxes are for email\n [Resource.SITE]: WorkspaceFeature.SITES,\n\n // ORG-only resources - always enabled for ORG products (feature check not applicable)\n [Resource.WORKSPACE]: null,\n [Resource.ORG_ADMIN]: null,\n};\n\n/**\n * Resources that are only valid for ORG-level products.\n * Matches the Python ORG_ONLY_RESOURCES in lib/constants.py\n */\nexport const ORG_ONLY_RESOURCES: Set<Resource> = new Set([Resource.WORKSPACE, Resource.ORG_ADMIN]);\n\n/**\n * Get the required feature for a resource.\n * Returns null if the resource is always available.\n */\nexport function getRequiredFeatureForResource(resource: Resource): WorkspaceFeature | null {\n return RESOURCE_TO_FEATURE_MAP[resource];\n}\n\n/**\n * Check if a resource is available given the enabled features and product type.\n * @param resource The resource to check\n * @param enabledFeatures Array of enabled feature keys (as strings)\n * @param productType The product type (for ORG-only resource validation)\n * @returns Object with isAvailable boolean and optional reason string\n */\nexport function isResourceAvailable(\n resource: Resource,\n enabledFeatures: string[],\n productType: ProductType\n): { isAvailable: boolean; reason?: string } {\n // Check ORG-only resources\n if (ORG_ONLY_RESOURCES.has(resource) && productType !== ProductType.ORG) {\n return {\n isAvailable: false,\n reason: 'Only available for Organization products',\n };\n }\n\n const requiredFeature = getRequiredFeatureForResource(resource);\n if (requiredFeature === null) {\n return { isAvailable: true };\n }\n\n if (!enabledFeatures.includes(requiredFeature)) {\n return {\n isAvailable: false,\n reason: `Requires \"${requiredFeature}\" feature`,\n };\n }\n\n return { isAvailable: true };\n}\n\n// ===== PRODUCT LIMIT & INCLUSION TYPES =====\n\n// Type definitions for product limits and inclusions (now using unified Resource enum)\nexport type ProductLimits = {\n [key in Resource]?: number | null;\n};\n\nexport type ProductInclusions = {\n [key in Resource]?: number | null;\n};\n\n// ===== RESOURCE CONFIGURATION TYPE =====\n\n/**\n * Configuration for a single resource type.\n * Defines inclusion amounts, limits, and overage pricing.\n */\nexport interface ResourceConfiguration {\n /** Number of units included in the base price */\n inclusion?: number;\n /** Optional hard cap on usage (null = unlimited) */\n limit?: number | null;\n /** Cost in cents per unit over inclusion */\n overageUnitCost?: number;\n /** Stripe product ID for this resource (each resource is its own Stripe Product) */\n stripeProductId?: string;\n /** Stripe metered price ID for overage billing */\n overageStripePriceId?: string;\n}\n\n/**\n * Map of resource types to their configurations.\n * Used for defining product resource inclusions, limits, and overages.\n */\nexport type ProductResources = Partial<Record<Resource, ResourceConfiguration>>;\n\n// ===== PLAN CONFIGURATION TYPE =====\n\n/**\n * Configuration for a single billing period plan.\n * Defines pricing and Stripe integration for a specific billing cycle.\n */\nexport interface PlanConfiguration {\n /** Stripe price ID for the recurring charge */\n stripePriceId?: string;\n /** Cost per billing period in cents */\n costPerPeriod?: number;\n /** One-time upfront fee in cents */\n upfrontFee?: number;\n /** Stripe price ID for the upfront fee */\n upfrontFeeStripePriceId?: string;\n /** Whether this is a test plan */\n isTest?: boolean;\n}\n\n/**\n * Map of billing periods to their plan configurations.\n * Used for defining product pricing across different billing cycles.\n */\nexport type ProductPlans = Partial<Record<'month' | 'year' | 'quarter', PlanConfiguration>>;\n\n// ===== MAIN PRODUCT INTERFACE =====\n\n// Main product interface\nexport interface Product {\n id: number;\n name: string;\n tagline?: string;\n description: string;\n audience: string;\n stripeProductId?: string;\n workspaceId: number;\n workspaceUuid?: string;\n productType: ProductType;\n trialPeriodDays: number;\n memberRoleUuid?: string;\n templateWorkspaceUuid?: string;\n\n icon: string;\n color: string;\n publicUrl?: string;\n subscriberUrl?: string;\n\n metadata?: ProductMetadata;\n\n isPopular: boolean;\n isRecommended: boolean;\n isFeatured: boolean;\n isPublic: boolean;\n\n supportLevels: string[];\n selfService: boolean;\n\n // Resource configurations (for base products: WORKSPACE, MEMBER, ORG)\n resources?: ProductResources;\n\n // Feature dependencies and provisions\n requiresFeatures: string[]; // Features required to enable this product\n providesFeatures: string[]; // Features this product enables\n\n // Pricing plans keyed by period\n plans?: ProductPlans;\n\n createdAt: string;\n updatedAt: string;\n}\n\n// ===== PRODUCT MANAGEMENT TYPES =====\n\n// Admin product create request\nexport interface CreateProductRequest {\n workspaceId?: number | null;\n workspaceUuid: string;\n stripeProductId?: string;\n name: string;\n tagline?: string;\n description: string;\n audience: string;\n productType?: ProductType;\n trialPeriodDays?: number;\n icon?: string;\n color?: string;\n publicUrl?: string | null;\n subscriberUrl?: string | null;\n supportLevels?: string[];\n selfService?: boolean;\n isPopular?: boolean;\n isRecommended?: boolean;\n isFeatured?: boolean;\n isPublic?: boolean;\n memberRoleUuid?: string;\n templateWorkspaceUuid?: string;\n metadata?: ProductMetadata;\n\n // Feature dependencies and provisions\n requiresFeatures?: string[]; // Features required to enable this product\n providesFeatures?: string[]; // Features this product enables\n\n // Resource configurations (for base products: WORKSPACE, MEMBER, ORG)\n resources?: ProductResources;\n\n // Pricing plans keyed by period\n plans?: ProductPlans;\n}\n\n// Admin product update request\nexport interface AdminUpdateProductRequest {\n id: number;\n name?: string;\n tagline?: string;\n description?: string;\n stripeProductId?: string | null;\n workspaceId?: number;\n selfService?: boolean;\n audience?: string;\n productType?: string;\n trialPeriodDays?: number;\n icon?: string;\n color?: string;\n publicUrl?: string | null;\n subscriberUrl?: string | null;\n isPopular?: boolean;\n isRecommended?: boolean;\n isFeatured?: boolean;\n isPublic?: boolean;\n supportLevels?: string[];\n memberRoleUuid?: string;\n templateWorkspaceUuid?: string;\n metadata?: ProductMetadata;\n\n // Feature dependencies and provisions\n requiresFeatures?: string[]; // Features required to enable this product\n providesFeatures?: string[]; // Features this product enables\n\n // Resource configurations (for base products: WORKSPACE, MEMBER, ORG)\n resources?: ProductResources;\n\n // Pricing plans keyed by period\n plans?: ProductPlans;\n}\n\n// ===== STRIPE ADDRESS TYPES =====\n\nexport interface StripeAddress {\n line1?: string;\n line2?: string;\n city?: string;\n state?: string;\n postal_code?: string;\n country?: string; // Two-letter country code (ISO 3166-1 alpha-2)\n}\n\nexport interface StripeShipping {\n name: string;\n phone?: string;\n address: StripeAddress;\n}\n\nexport interface StripeTax {\n automatic_tax?: string;\n ip_address?: string;\n location?: string;\n}\n\n// ===== STRIPE CUSTOMER TYPES =====\n\nexport interface StripeCustomer {\n id: string;\n object: string;\n name: string | null;\n email: string | null;\n phone: string | null;\n description: string | null;\n metadata: Record<string, string>;\n address: StripeAddress | null;\n shipping: StripeShipping | null;\n balance: number;\n currency: string | null;\n delinquent: boolean;\n taxExempt: string;\n created: number;\n livemode: boolean;\n}\n\nexport interface StripeCustomerCreateRequest {\n name?: string;\n email?: string;\n phone?: string;\n description?: string;\n metadata?: Record<string, string>;\n address?: StripeAddress;\n shipping?: StripeShipping;\n tax?: StripeTax;\n taxExempt?: string; // Customer's tax exemption status: none, exempt, or reverse\n}\n\nexport interface StripeCustomerUpdateRequest {\n name?: string;\n email?: string;\n phone?: string;\n description?: string;\n metadata?: Record<string, string>;\n address?: StripeAddress;\n shipping?: StripeShipping;\n tax?: StripeTax;\n taxExempt?: string; // Customer's tax exemption status: none, exempt, or reverse\n}\n\n// ===== STRIPE PAYMENT METHOD TYPES =====\n\nexport interface StripeCardDetails {\n brand: string;\n last4: string;\n expMonth: number;\n expYear: number;\n funding?: string;\n country?: string;\n}\n\nexport interface StripeUSBankAccountDetails {\n accountHolderType?: string;\n bankName?: string;\n last4: string;\n routingNumber?: string;\n}\n\nexport interface StripePaymentMethod {\n id: string;\n type: string;\n created: number;\n isDefault?: boolean;\n card?: StripeCardDetails;\n usBankAccount?: StripeUSBankAccountDetails;\n}\n\n// ===== STRIPE SUBSCRIPTION TYPES =====\n\nexport interface StripeSubscriptionCreateRequest {\n customer: string;\n items: Array<Record<string, any>>;\n workspaceId?: number;\n trialPeriodDays?: number;\n metadata?: Record<string, string>;\n cancelAtPeriodEnd?: boolean;\n collectionMethod?: string;\n}\n\nexport interface SubscriptionUpdateRequest {\n productId?: number; // Internal product ID to switch to\n planPeriod?: string; // Plan period to switch to (e.g., \"month\", \"year\")\n cancelAtPeriodEnd?: boolean; // Whether to cancel subscription at period end\n metadata?: Record<string, string>; // Additional metadata for the subscription\n trialEnd?: string; // Trial end date (unix timestamp or 'now')\n}\n\n// Legacy - kept for backwards compatibility\nexport interface StripeSubscriptionUpdateRequest {\n metadata?: Record<string, string>;\n cancelAtPeriodEnd?: boolean;\n items?: Array<Record<string, any>>;\n trialEnd?: string;\n}\n\n// ===== LEGACY PRODUCT INFO TYPES =====\n\n// Legacy product info interface (kept for backward compatibility)\nexport interface ProductInfo {\n id: string;\n name: string;\n audience: string;\n admins: number;\n includedPhoneNumbers: number;\n includedWebsites: number;\n includedVoiceChatMinutes: number;\n includedStorageMb: number;\n includedAssignments: number;\n support: string[];\n features: string[];\n selfService: boolean;\n available: boolean;\n price: number;\n stripeProductId?: string;\n trialPeriodDays: number;\n}\n\n// Legacy plan info interface (kept for backward compatibility)\nexport interface PlanInfo {\n id: string;\n name: string;\n productIds: string[];\n costPerPeriod: number;\n costPerExtraPhone: number;\n costPerExtraSite: number;\n costPerExtraAssignments: number;\n period: 'month' | 'year';\n stripeProductId?: string;\n test?: boolean;\n}\n\n// ===== BILLING DASHBOARD TYPES =====\n\nexport interface StripePlanDetail {\n name?: string;\n productName?: string;\n interval?: string;\n amount?: number;\n currency?: string;\n features: string[];\n limits: Record<string, any>;\n inclusions: Record<string, any>;\n quantity?: number;\n}\n\nexport interface BillingPlanInfo {\n hasSubscription: boolean;\n subscriptionId?: string;\n subscriptionStatus?: string;\n productName?: string;\n planName?: string;\n planPeriod?: string;\n billingCycleStart?: string;\n billingCycleEnd?: string;\n features: string[];\n limits: Record<string, any>;\n inclusions: Record<string, any>;\n plans: StripePlanDetail[];\n}\n\nexport interface UsageDiscrepancy {\n platform: number;\n stripe: number;\n difference: number;\n}\n\nexport interface BillingUsageInfo {\n periodStart: string;\n periodEnd: string;\n platformUsage: Record<string, number>;\n cachedUsage: Record<string, number>; // Cached/last synced usage values\n stripeOverage: Record<string, number>;\n discrepancies: Record<string, UsageDiscrepancy>;\n lastSynced?: string;\n syncStatus: 'pending' | 'synced' | 'out_of_sync' | 'error';\n syncError?: string;\n}\n\nexport interface BillingResourceCounts {\n member: number;\n phone_number: number;\n site: number;\n inbox: number;\n org_admin?: number; // Only for ORG products\n}\n\nexport interface OverageConfig {\n billingCycle: string;\n unitCost: number;\n unitType: string;\n stripePriceId: string | null;\n}\n\nexport interface BillingDashboardResponse {\n workspaceId: number;\n workspaceUuid: string;\n workspaceName: string;\n plan: BillingPlanInfo;\n usage: BillingUsageInfo;\n resources: BillingResourceCounts;\n // Keyed by Resource enum values (singular forms like 'member', 'site', 'sms', 'email', etc.)\n overageConfigs: Partial<Record<Resource, OverageConfig>>;\n overageAmounts: Partial<Record<Resource, number>>;\n paygBudgetCents?: number | null; // PAYG budget in cents (null = unlimited, 0 = disabled)\n currentSpendCents?: number | null; // Current spend for this billing period in cents\n budgetStatus?: string | null; // Budget status (active, warning_50, warning_80, etc.)\n}\n\nexport interface SyncUsageRequest {\n usageType?: string;\n}\n\nexport interface SyncUsageResponse {\n success: boolean;\n syncedMetrics: string[];\n errors: string[];\n syncTime: string;\n}\n\n// ===== STRIPE SYNC TYPES =====\n\nexport interface StripeProduct {\n id: string;\n name: string;\n description: string;\n metadata: Record<string, string>;\n features: string[];\n created: number;\n updated: number;\n}\n\nexport interface StripePrice {\n id: string;\n product: string;\n currency: string;\n unit_amount: number | null;\n nickname: string | null;\n recurring: {\n interval: string;\n interval_count: number;\n usage_type: string;\n } | null;\n metadata: Record<string, string>;\n active: boolean;\n}\n\nexport interface LocalResourceData {\n resourceKey: string;\n inclusion?: number;\n limit?: number | null;\n overageUnitCost?: number;\n stripeProductId?: string;\n overageStripePriceId?: string;\n}\n\nexport interface ResourceComparisonResult {\n localResource: LocalResourceData;\n stripeProduct?: StripeProduct;\n stripePrice?: StripePrice;\n status: 'synced' | 'mismatch' | 'missing_stripe_product' | 'missing_stripe_price';\n differences: string[];\n}\n\nexport interface StripeComparisonResult {\n localProduct: Product;\n stripeProduct?: StripeProduct;\n status: 'synced' | 'mismatch' | 'missing_stripe' | 'missing_local';\n differences: string[];\n planComparisons: PlanComparisonResult[];\n resourceComparisons: ResourceComparisonResult[];\n}\n\nexport interface PlanComparisonResult {\n localPlan: ProductPlan;\n stripePrice?: StripePrice;\n status: 'synced' | 'mismatch' | 'missing_stripe' | 'missing_local';\n differences: string[];\n}\n\nexport interface CompareWithStripeResponse {\n workspaceUuid: string;\n comparisonResults: StripeComparisonResult[];\n lastCompared: string;\n}\n\nexport interface SyncProductToStripeRequest {\n productId: number;\n syncPlans?: boolean;\n syncOverages?: boolean;\n syncFeatures?: boolean;\n}\n\nexport interface SyncProductToStripeResponse {\n success: boolean;\n productId: number;\n stripeProductId: string;\n syncedPlans: string[];\n syncedOverages: string[];\n syncedFeatures: string[];\n errors: string[];\n syncTime: string;\n}\n\nexport interface PaginatedSubscriptionsResponse {\n items: Subscription[];\n total: number;\n page: number;\n pageSize: number;\n totalPages: number;\n}\n","// Workspace-related types extracted from the main types.ts file\n// This file contains all types related to workspace management, workspace settings,\n// workspace features, and workspace lifecycle management\n\nimport { WorkspaceFeature } from './billingTypes';\nimport type { SortOrder } from './coreTypes';\nimport type { WorkspaceSortField } from './sortTypes';\n\n// Re-export WorkspaceFeature for convenience\nexport { WorkspaceFeature };\n\n// ===== WORKSPACE CORE TYPES =====\n\n// Feature status values for workspace.featureStatus map\n// Matches FeatureVisibility enum values: 'hidden', 'upgrade', 'contact' plus 'enabled'\nexport type FeatureStatusValue = 'enabled' | 'hidden' | 'upgrade' | 'contact';\n\n// Workspace feature info interface\nexport interface WorkspaceFeatureInfo {\n name: string;\n slug: WorkspaceFeature;\n}\n\n// Basic workspace interface\nexport interface Workspace {\n id: number;\n uuid: string;\n name: string;\n slug: string;\n organizationId: number;\n organizationUuid?: string | null;\n organizationName?: string | null;\n organizationLogoUrl?: string | null;\n signupCode: string | null;\n createdAt: string;\n isReseller: boolean;\n isPublic: boolean;\n allowSignup: boolean;\n resellerId: number | null;\n features?: WorkspaceFeature[] | null;\n /** Map of feature slug to status: 'enabled', 'hidden', 'upgrade_prompt', 'contact_admin' */\n featureStatus?: Record<string, FeatureStatusValue> | null;\n themes?: string[] | null;\n userRole?: string | null;\n signupRequestStatus?: string | null;\n locale?: string | null; // BCP 47 locale (e.g., en-US, en-GB, es-MX)\n timezone?: string | null; // IANA timezone identifier (e.g., America/Los_Angeles)\n}\n\n// Workspace provision status enum\nexport enum WorkspaceProvisionStatus {\n UNPROVISIONED = 0,\n PROVISIONING = 1,\n AVAILABLE = 2,\n MAINTENANCE = 3,\n DISABLED = 4,\n SCHEMA_MISSING = 5,\n SCHEMA_CREATED = 6,\n DELETED = 7,\n ERROR = 8,\n NEEDS_MIGRATION = 9,\n}\n\n// Extended workspace interface for admin views\nexport interface AdminWorkspace extends Workspace {\n creatorId: number;\n creatorName: string;\n ownerId: number | null;\n ownerName: string | null;\n dbId: number;\n status: number;\n features?: WorkspaceFeature[];\n billingOwnerId?: number | null;\n billingOwnerName?: string | null;\n subscriptionProductId?: number | null;\n subscriptionProductName?: string | null;\n locale?: string | null; // BCP 47 locale (e.g., en-US, en-GB, es-MX)\n timezone?: string | null; // IANA timezone identifier (e.g., America/Los_Angeles)\n}\n\n// ===== WORKSPACE MANAGEMENT TYPES =====\n\n// Workspace form data for creating/updating workspaces\nexport interface WorkspaceFormData {\n name: string;\n slug?: string;\n signupCode?: string;\n isPublic?: boolean;\n allowSignup?: boolean;\n locale?: string;\n timezone?: string;\n}\n\n// Admin workspace form data with additional fields\nexport interface AdminWorkspaceFormData {\n organizationId?: number;\n name?: string;\n slug?: string;\n signupCode?: string;\n isReseller?: boolean;\n isPublic?: boolean;\n allowSignup?: boolean;\n resellerId?: number;\n ownerId?: number;\n features?: WorkspaceFeature[];\n templateWorkspaceUuid?: string;\n locale?: string;\n timezone?: string;\n}\n\n// Client workspace interface for reduced data\nexport interface ClientWorkspace {\n id: number;\n name: string;\n uuid: string;\n createdAt: string;\n status: number; // WorkspaceProvisionStatus\n slug: string;\n}\n\n// Public workspace interface for public listing\nexport interface PublicWorkspace {\n id: number;\n uuid: string;\n slug: string;\n name: string;\n createdAt: string;\n isReseller: boolean;\n allowSignup: boolean;\n resellerId: number | null;\n memberRole?: string | null; // If user is a member, shows their role name\n signupRequestStatus?: string | null; // Status of user's signup request if any\n}\n\n// ===== WORKSPACE ANALYTICS & STATISTICS =====\n\n// Workspace counts interface\nexport interface WorkspaceCounts {\n humans: number;\n assistants: number;\n tasks: number;\n phoneNumbers: number;\n chats: number;\n files: number;\n sites: number;\n forms: number;\n}\n\n// Workspace statistics response\nexport interface WorkspaceStatsResponse {\n sites: number;\n pages: number;\n}\n\n// ===== WORKSPACE CONFIGURATION =====\n\n// Workspace defaults configuration\nexport interface WorkspaceDefaults {\n taskEnteredTemplate: string | null;\n taskExitedTemplate: string | null;\n defaultTaskEnteredTemplate: string | null;\n defaultTaskExitedTemplate: string | null;\n\n // Event rule notification templates\n memberJoinedTemplate: string | null;\n defaultMemberJoinedTemplate: string | null;\n memberLeftTemplate: string | null;\n defaultMemberLeftTemplate: string | null;\n memberUpdatedTemplate: string | null;\n defaultMemberUpdatedTemplate: string | null;\n dataRecordCreatedTemplate: string | null;\n defaultDataRecordCreatedTemplate: string | null;\n dataRecordUpdatedTemplate: string | null;\n defaultDataRecordUpdatedTemplate: string | null;\n chatCreatedTemplate: string | null;\n defaultChatCreatedTemplate: string | null;\n subscriptionCreatedTemplate: string | null;\n defaultSubscriptionCreatedTemplate: string | null;\n assistantMessageTemplate: string | null;\n defaultAssistantMessageTemplate: string | null;\n userMessageTemplate: string | null;\n defaultUserMessageTemplate: string | null;\n calendarEventCreatedTemplate: string | null;\n defaultCalendarEventCreatedTemplate: string | null;\n calendarEventUpdatedTemplate: string | null;\n defaultCalendarEventUpdatedTemplate: string | null;\n calendarEventCancelledTemplate: string | null;\n defaultCalendarEventCancelledTemplate: string | null;\n calendarEventStartingTemplate: string | null;\n defaultCalendarEventStartingTemplate: string | null;\n calendarEventEndedTemplate: string | null;\n defaultCalendarEventEndedTemplate: string | null;\n scheduledEventTriggeredTemplate: string | null;\n defaultScheduledEventTriggeredTemplate: string | null;\n\n defaultPhoneNumberId: number | null;\n defaultAssistantId: number | null;\n escalationBusinessHours: string | null;\n escalationOnlineMessageTemplate: string | null;\n defaultEscalationOnlineMessageTemplate: string | null;\n escalationOfflineMessageTemplate: string | null;\n defaultEscalationOfflineMessageTemplate: string | null;\n escalationNotifiedMessageTemplate: string | null;\n defaultEscalationNotifiedTemplate: string | null;\n escalationPausedMessageTemplate: string | null;\n defaultEscalationPausedTemplate: string | null;\n emailFooter: string | null;\n defaultEmailFooter: string | null;\n pauseOnEscalate: boolean;\n sesDomain: string;\n enableAudioRecording: boolean;\n // Default model settings for new assistants\n defaultChatModel: string;\n defaultRealtimeModel: string;\n defaultInferenceModel: string;\n defaultVoiceModel: string;\n}\n\n// Business hours configuration for workspace\nexport interface BusinessHoursDay {\n day: 'monday' | 'tuesday' | 'wednesday' | 'thursday' | 'friday' | 'saturday' | 'sunday';\n enabled: boolean;\n start: string | null; // Format: \"HH:MM\"\n end: string | null; // Format: \"HH:MM\"\n}\n\n// Workspace defaults form data\nexport interface WorkspaceDefaultsFormData {\n taskEnteredTemplate?: string | null;\n taskExitedTemplate?: string | null;\n defaultPhoneNumberId?: number | null;\n defaultAssistantId?: number | null;\n escalationBusinessHours?: string | null;\n escalationOnlineMessageTemplate?: string | null;\n escalationOfflineMessageTemplate?: string | null;\n escalationNotifiedMessageTemplate?: string | null;\n escalationPausedMessageTemplate?: string | null;\n emailFooter?: string | null;\n pauseOnEscalate?: boolean;\n enableAudioRecording?: boolean;\n}\n\n// ===== WORKSPACE MAPPINGS & EXTERNAL INTEGRATIONS =====\n// Communication mapping types (DomainMapping, PhoneNumberMappingResponse, etc.)\n// are now in communicationTypes.ts\n\n// Site mapping interface\nexport interface SiteMapping {\n id: number;\n siteId: number;\n siteUuid: string;\n siteName: string;\n siteSlug: string;\n externalDomain: string | null;\n workspaceId: number;\n workspaceUuid: string;\n workspaceName: string;\n workspaceSlug: string;\n createdAt: string;\n updatedAt: string;\n}\n\n// Site mapping form data\nexport interface SiteMappingFormData {\n siteUuid?: string;\n workspaceId?: number;\n externalDomain?: string;\n}\n\n// ===== WORKSPACE PRODUCT & BILLING TYPES =====\n// Product and billing types have been moved to billingTypes.ts\n\n// ===== WORKSPACE EXPORT TYPES =====\n\n// Re-export WorkspaceSortField for convenience\nexport type { WorkspaceSortField };\n\n// Re-export SortOrder for convenience\nexport type { SortOrder };\n\n// ===== WORKSPACE ACCESS TYPES =====\n\n// Available member role for workspace join UI\nexport interface AvailableMemberRole {\n id: number;\n uuid: string;\n name: string;\n}\n\n// Grant reason for workspace self-grant\nexport type WorkspaceGrantReason = 'superuser' | 'org_owner' | 'org_admin';\n\n// Structured 403 error data from GET /api/v2/w/{uuid}\nexport interface WorkspaceAccessDeniedData {\n error: true;\n message: string;\n code: 'WORKSPACE_MEMBERSHIP_REQUIRED';\n canSelfGrant: true;\n grantReason: WorkspaceGrantReason;\n workspaceUuid: string;\n workspaceName: string;\n organizationUuid: string | null;\n organizationName: string | null;\n availableRoles: AvailableMemberRole[];\n}\n\n// Request body for POST /api/v2/w/{uuid}/join\nexport interface WorkspaceJoinRequest {\n memberRoleId: number;\n}\n\n// Response from POST /api/v2/w/{uuid}/join\nexport interface WorkspaceJoinResponse {\n success: boolean;\n memberUuid: string;\n memberId: number;\n workspaceUuid: string;\n workspaceName: string;\n memberRoleName: string;\n message: string;\n}\n","// Invitation-related types for workspace and organization membership\n\n// Import and re-export OrgMemberRole from accountTypes\n// This is re-exported for backwards compatibility with code importing from invitationTypes\nimport type { OrgMemberRole } from './accountTypes';\nexport type { OrgMemberRole };\n\n// Invitation status enum\nexport enum InvitationStatus {\n REQUESTED = 'requested', // User requested to join\n INVITED = 'invited', // User was invited to join\n GRANTED = 'granted', // Request/invitation accepted\n DENIED = 'denied', // Request denied by admin\n DECLINED = 'declined', // Invitation declined by user\n BLOCKED = 'blocked', // User blocked from workspace/organization\n}\n\n// Unified Invitation interface\nexport interface Invitation {\n id: number;\n // Account info (optional for org invitations)\n accountId?: number | null;\n accountName?: string | null;\n accountEmail?: string | null;\n // Workspace info (optional for org-only invitations)\n workspaceId?: number | null;\n workspaceName?: string | null;\n workspaceSlug?: string | null;\n // Organization info (optional for workspace-only invitations)\n organizationId?: number | null;\n organizationName?: string | null;\n // Credential verification for org invitations\n invitedEmail?: string | null;\n invitedPhone?: string | null;\n orgMemberRole?: OrgMemberRole | null;\n // Common fields\n requestedAt: string; // ISO date string\n message?: string | null;\n name?: string | null; // Invited person's name\n status: InvitationStatus;\n actorAccountId?: number | null;\n actorAccountName?: string | null;\n updatedAt?: string | null; // ISO date string\n siteUuid?: string | null; // UUID of site where request originated\n memberRoleId?: number | null; // Desired member role for the invitation\n expiresAt?: string | null; // ISO date string\n isExpired?: boolean;\n}\n\n// Create workspace invitation form data (user-initiated membership request)\n// The workspace is determined from the route path parameter\nexport interface CreateWorkspaceInvitationFormData {\n message?: string;\n siteUuid?: string;\n}\n\n// Create organization invitation form data\nexport interface CreateOrganizationInvitationFormData {\n email: string;\n name?: string;\n role?: OrgMemberRole;\n message?: string;\n}\n\n// Update invitation form data (admin action)\nexport interface UpdateInvitationFormData {\n status?: InvitationStatus;\n role?: OrgMemberRole;\n}\n\n// List invitations query params\nexport interface ListInvitationsParams {\n workspaceId?: number;\n organizationId?: number;\n accountId?: number;\n status?: InvitationStatus;\n page?: number;\n pageSize?: number;\n}\n\n// Invitation list response\nexport interface InvitationListResponse {\n items: Invitation[];\n total: number;\n page: number;\n pageSize: number;\n}\n\n// Invitation details for public view (no auth required)\nexport interface InvitationDetails {\n workspace?: {\n id: number;\n uuid: string;\n name: string;\n } | null;\n organization?: {\n id: number;\n uuid: string;\n name: string;\n } | null;\n invitedAccount?: {\n email: string;\n name?: string | null;\n } | null;\n invitedEmail?: string | null;\n inviter: {\n name?: string | null;\n };\n message?: string | null;\n expiresAt?: string | null;\n role?: OrgMemberRole | null;\n}\n\n// Invitation accepted response\nexport interface InvitationAcceptedResponse {\n message: string;\n workspace?: {\n id: number;\n uuid: string;\n name: string;\n } | null;\n organization?: {\n id: number;\n uuid: string;\n name: string;\n } | null;\n authToken?: string | null;\n}\n","/**\n * AI Model Types\n */\n\nexport type ModelState = 'enabled' | 'disabled' | 'deprecated';\n\nexport interface AIModelResponse {\n id: string; // Globally unique ID like \"google:vertex:claude:37sonnet\"\n name: string;\n provider: string; // \"openai\", \"google\", \"anthropic\", \"aws\", \"elevenlabs\", \"deepgram\"\n type: string; // \"chat\", \"realtime\", \"image\", \"stt\", \"tts\", \"video\"\n description?: string;\n tagline?: string; // Short use-case description (e.g., \"Fast and reliable • Balanced cost\")\n state: ModelState; // \"enabled\", \"disabled\", \"deprecated\"\n available: boolean; // Derived from state: true if state != \"disabled\"\n recommended: boolean; // Whether this model is recommended for new assistants\n replacement?: string; // Model ID to upgrade to if deprecated\n multiplier: number; // AI units multiplier for billing (1.0 = standard, fallback)\n inputMultiplier?: number; // Per 1K input tokens (overrides multiplier)\n outputMultiplier?: number; // Per 1K output tokens (overrides multiplier)\n cachedMultiplier?: number; // Per 1K cached tokens (overrides multiplier)\n voices?: string[]; // Native voices for realtime models\n serverVad?: boolean; // Whether server-side VAD is supported\n clientVad?: boolean; // Whether client-side VAD is supported\n}\n\nexport interface AIModelsResponse {\n models: AIModelResponse[];\n}\n\n// Helper types for easier usage\nexport type ChatAIModel = AIModelResponse & { type: 'chat' };\nexport type RealtimeAIModel = Omit<AIModelResponse, 'serverVad' | 'clientVad'> & {\n type: 'realtime';\n serverVad: boolean;\n clientVad: boolean;\n};\n\nexport type ModelProvider =\n | 'openai'\n | 'google'\n | 'anthropic'\n | 'aws'\n | 'elevenlabs'\n | 'deepgram'\n | 'custom';\nexport type ModelType = 'chat' | 'realtime' | 'image' | 'stt' | 'tts' | 'video' | 'voice';\n\n// Response type for /all endpoint with models grouped by type\nexport interface AllModelsResponse {\n chat: AIModelResponse[];\n realtime: AIModelResponse[];\n image: AIModelResponse[];\n stt: AIModelResponse[];\n tts: AIModelResponse[];\n}\n\n// Voice Model types\nexport interface VoiceModel {\n id: string; // Full voice model ID: provider:voice:name (e.g., openai:voice:alloy)\n name: string; // Human-readable display name\n provider: string; // Provider (openai, google, aws, elevenlabs, deepgram)\n description?: string; // Voice description/characteristics\n}\n\nexport interface VoiceModelsResponse {\n voices: VoiceModel[];\n}\n\n// Realtime Model Constants\nexport const REALTIME_MODEL_OPENAI = 'openai:realtime:gpt-realtime';\nexport const REALTIME_MODEL_OPENAI_MINI = 'openai:realtime:gpt-realtime-mini';\nexport const REALTIME_MODEL_GEMINI = 'google:vertex:gemini-flash-live-2.0';\nexport const REALTIME_MODEL_NOVA_SONIC = 'aws:bedrock:nova-sonic-1';\nexport const REALTIME_MODEL_CUSTOM = 'custom:realtime:composable';\n\n// STT (Speech-to-Text) Model IDs\nexport const STT_MODEL_DEEPGRAM_FLUX = 'deepgram:stt:flux-general-en';\nexport const STT_MODEL_DEEPGRAM_NOVA_2 = 'deepgram:stt:nova-2';\nexport const STT_MODEL_ELEVENLABS_SCRIBE = 'elevenlabs:stt:scribe_v2_realtime';\n\n// TTS (Text-to-Speech) Model IDs\nexport const TTS_MODEL_ELEVENLABS_FLASH = 'elevenlabs:tts:eleven_flash_v2_5';\nexport const TTS_MODEL_ELEVENLABS_TURBO = 'elevenlabs:tts:eleven_turbo_v2_5';\nexport const TTS_MODEL_ELEVENLABS_MULTILINGUAL = 'elevenlabs:tts:eleven_multilingual_v2';\nexport const TTS_MODEL_AWS_POLLY_GENERATIVE = 'aws:tts:polly-generative';\nexport const TTS_MODEL_AWS_POLLY_NEURAL = 'aws:tts:polly-neural';\n","/**\n * FHIR Connection types for the Gravity Rail API.\n *\n * FhirConnection represents per-workspace FHIR/EHR integration configurations.\n * Supports vendors like eClinicalWorks, Epic, Cerner, and Athena.\n */\n\n/**\n * Supported FHIR/EHR vendors.\n */\nexport enum FhirVendor {\n ECLINICALWORKS = 'eclinicalworks',\n EPIC = 'epic',\n CERNER = 'cerner',\n ATHENA = 'athena',\n}\n\n/**\n * State of a FHIR connection.\n */\nexport enum FhirConnectionState {\n CONFIGURING = 'configuring',\n CONFIGURED = 'configured',\n ERROR = 'error',\n}\n\n/**\n * Client type for FHIR connections (eCW Backend Services).\n * - backend_bulk: Two-legged auth for bulk data operations\n * - backend_single_patient: Two-legged auth with full patient data access\n */\nexport enum FhirClientType {\n BACKEND_BULK = 'backend_bulk',\n BACKEND_SINGLE_PATIENT = 'backend_single_patient',\n}\n\n/**\n * FHIR Connection response from the API.\n */\nexport interface FhirConnection {\n id: number;\n uuid: string;\n name: string;\n enabled: boolean;\n templateUuid: string | null;\n vendor: FhirVendor;\n clientType: FhirClientType;\n fhirBaseUrl: string;\n practiceId: string | null;\n clientId: string;\n tokenEndpoint: string | null;\n smartMetadata: Record<string, unknown> | null;\n approvedScopes: string[] | null;\n state: FhirConnectionState;\n errorMessage: string | null;\n lastConnectedAt: string | null;\n rateLimitPerMinute: number;\n vendorConfig: Record<string, unknown> | null;\n createdAt: string;\n updatedAt: string;\n}\n\n/**\n * Form data for creating a FHIR connection.\n */\nexport interface CreateFhirConnectionRequest {\n name: string;\n vendor: FhirVendor;\n clientType?: FhirClientType;\n fhirBaseUrl: string;\n practiceId?: string;\n clientId: string;\n clientSecret?: string;\n tokenEndpoint?: string;\n rateLimitPerMinute?: number;\n vendorConfig?: Record<string, unknown>;\n}\n\n/**\n * Form data for updating a FHIR connection.\n */\nexport interface UpdateFhirConnectionRequest {\n name?: string;\n fhirBaseUrl?: string;\n practiceId?: string;\n clientId?: string;\n clientSecret?: string;\n tokenEndpoint?: string;\n state?: FhirConnectionState;\n enabled?: boolean;\n rateLimitPerMinute?: number;\n vendorConfig?: Record<string, unknown>;\n}\n\n/**\n * Sort fields for FHIR connections.\n */\nexport type FhirConnectionSortField = 'createdAt' | 'updatedAt' | 'name' | 'vendor' | 'state';\n\n/**\n * Request to fetch encounters for a patient.\n */\nexport interface FhirFetchEncountersRequest {\n patientId: string;\n}\n\n/**\n * Request to search for patients.\n */\nexport interface FhirSearchPatientsRequest {\n name?: string;\n family?: string;\n given?: string;\n identifier?: string;\n birthdate?: string;\n}\n\n/**\n * Request to search for practitioners.\n */\nexport interface FhirSearchPractitionersRequest {\n name?: string;\n identifier?: string;\n}\n\n/**\n * Request to search for locations.\n */\nexport interface FhirSearchLocationsRequest {\n name?: string;\n address?: string;\n}\n\n/**\n * Request to fetch care team for a patient.\n */\nexport interface FhirFetchCareTeamRequest {\n patientId: string;\n}\n\n/**\n * Request to create a telephone encounter.\n */\nexport interface FhirCreateEncounterRequest {\n patientId: string;\n reason: string;\n practitionerId?: string;\n locationId?: string;\n notes?: string;\n}\n\n/**\n * Response from FHIR API operations.\n */\nexport interface FhirMethodResponse {\n success: boolean;\n message: string;\n data?: unknown;\n}\n","export enum QualificationType {\n WORKFLOW = 'workflow',\n}\n\nexport enum QualificationStatus {\n ENROLLED = 'enrolled',\n SUBMITTED = 'submitted',\n PROVISIONAL = 'provisional',\n QUALIFIED = 'qualified',\n SUSPENDED = 'suspended',\n}\n\nexport enum RequirementType {\n QUESTION = 'question',\n CHAT = 'chat',\n}\n\nexport enum CriterionType {\n EXPRESSION = 'expression',\n RUBRIC = 'rubric',\n}\n\nexport enum SubmissionStatus {\n EVALUATING = 'evaluating',\n PENDING_REVIEW = 'pending_review',\n APPROVED = 'approved',\n REJECTED = 'rejected',\n AUTO_PASSED = 'auto_passed',\n AUTO_FAILED = 'auto_failed',\n}\n\n// ===== Core types =====\n\nexport interface Qualification {\n id: number;\n uuid: string;\n name: string;\n description?: string | null;\n qualificationType: QualificationType;\n workflowId?: number | null;\n workflowName?: string | null;\n color: string;\n autoAdvanceEnabled: boolean;\n archived: boolean;\n memberCount: number;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface MemberQualification {\n id: number;\n uuid: string;\n memberId: number;\n qualificationId: number;\n qualification: Qualification;\n status: QualificationStatus;\n statusChangedAt: string;\n statusChangedById?: number | null;\n statusChangedByName?: string | null;\n notes?: string | null;\n submissionSummary?: SubmissionSummary;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface SubmissionSummary {\n total: number;\n submitted: number;\n passed: number;\n failed: number;\n pending: number;\n}\n\nexport interface QualificationStatusLogEntry {\n id: number;\n fromStatus?: QualificationStatus | null;\n toStatus: QualificationStatus;\n changedById?: number | null;\n changedByName?: string | null;\n reason?: string | null;\n createdAt: string;\n}\n\nexport interface QualificationMemberEntry {\n id: number;\n memberId: number;\n memberType?: string | null;\n status: QualificationStatus;\n statusChangedAt: string;\n statusChangedByName?: string | null;\n statusReason?: string | null;\n notes?: string | null;\n createdAt: string;\n}\n\n// ===== Scenario definition types =====\n\nexport interface ScenarioPersona {\n name?: string;\n hasPhone?: boolean;\n hasEmail?: boolean;\n memberRoleUuid?: string;\n description?: string;\n identity?: string;\n}\n\nexport interface ScenarioDataRecord {\n externalId?: string;\n fieldValues: Record<string, any>;\n}\n\nexport interface ScenarioDefinition {\n persona?: ScenarioPersona;\n dataRecords?: Record<string, ScenarioDataRecord>;\n labels?: string[];\n}\n\n// ===== Requirement types =====\n\nexport interface QualificationRequirement {\n id: number;\n uuid: string;\n qualificationId: number;\n order: number;\n slug: string;\n name: string;\n description?: string | null;\n requirementType: RequirementType;\n questionText?: string | null;\n scenario?: ScenarioDefinition | null;\n criteria: QualificationCriterion[];\n archived: boolean;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface QualificationCriterion {\n id: number;\n uuid: string;\n requirementId: number;\n order: number;\n name: string;\n description?: string | null;\n criterionType: CriterionType;\n weight: number;\n celExpression?: string | null;\n evaluationPrompt?: string | null;\n passingThreshold: number;\n archived: boolean;\n createdAt: string;\n updatedAt: string;\n}\n\n// ===== Submission types =====\n\nexport interface QualificationSubmission {\n id: number;\n uuid: string;\n memberQualificationId: number;\n requirementId: number;\n memberId: number;\n qualificationId: number;\n requirementSlug: string;\n requirementName: string;\n requirementType: RequirementType;\n answerText?: string | null;\n assignmentId?: number | null;\n assignmentStatus?: string | null;\n assignmentOutcome?: string | null;\n status: SubmissionStatus;\n overallScore?: number | null;\n passed?: boolean | null;\n reviewedById?: number | null;\n reviewedByName?: string | null;\n reviewNotes?: string | null;\n reviewedAt?: string | null;\n criterionResults: CriterionResult[];\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface CriterionResult {\n id: number;\n submissionId: number;\n criterionId: number;\n criterionName: string;\n criterionType: CriterionType;\n passingThreshold?: number | null;\n score?: number | null;\n passed?: boolean | null;\n evaluatorType: 'cel' | 'llm' | 'human';\n evaluatorId?: number | null;\n evaluationData?: Record<string, unknown> | null;\n evaluatedAt?: string | null;\n createdAt: string;\n}\n\n// ===== Request types =====\n\nexport interface CreateQualificationRequest {\n name: string;\n description?: string;\n qualificationType: QualificationType;\n workflowId?: number;\n color?: string;\n}\n\nexport interface UpdateQualificationRequest {\n name?: string;\n description?: string;\n color?: string;\n autoAdvanceEnabled?: boolean;\n archived?: boolean;\n}\n\nexport interface AssignQualificationRequest {\n qualificationId: number;\n status?: QualificationStatus;\n notes?: string;\n}\n\nexport interface UpdateMemberQualificationRequest {\n status: QualificationStatus;\n reason?: string;\n notes?: string;\n}\n\nexport interface CriterionInput {\n id?: number;\n name: string;\n description?: string;\n criterionType: CriterionType;\n weight?: number;\n celExpression?: string;\n evaluationPrompt?: string;\n passingThreshold?: number;\n}\n\nexport interface CreateRequirementRequest {\n slug: string;\n name: string;\n description?: string;\n requirementType: RequirementType;\n questionText?: string;\n scenario?: ScenarioDefinition;\n order?: number;\n criteria?: CriterionInput[];\n}\n\nexport interface UpdateRequirementRequest {\n name?: string;\n description?: string;\n questionText?: string;\n scenario?: ScenarioDefinition;\n order?: number;\n archived?: boolean;\n criteria?: CriterionInput[];\n}\n\nexport interface SubmitAnswerRequest {\n answerText: string;\n}\n\nexport interface ReviewSubmissionRequest {\n approved: boolean;\n notes?: string;\n}\n\nexport interface OverrideCriterionRequest {\n score: number;\n passed: boolean;\n notes?: string;\n}\n","export enum AccessGrantResourceType {\n DATA_RECORD = 'data_record',\n DATA_TYPE = 'data_type',\n FILE = 'file',\n FOLDER = 'folder',\n CALENDAR = 'calendar',\n ASSIGNMENT = 'assignment',\n APP_CONNECTION = 'app_connection',\n}\n\nexport enum AccessGrantStatus {\n PENDING = 'pending',\n ACTIVE = 'active',\n DENIED = 'denied',\n EXPIRED = 'expired',\n REVOKED = 'revoked',\n}\n\nexport enum AccessGrantTrigger {\n WORKFLOW_AUTO = 'workflow_auto',\n OPERATOR_REQUEST = 'operator_request',\n ADMIN_OVERRIDE = 'admin_override',\n MEMBER_SELF = 'member_self',\n}\n\nexport enum ConsentMethod {\n AUTO_POLICY = 'auto_policy',\n VERBAL = 'verbal',\n DTMF = 'dtmf',\n TEXT_CONFIRM = 'text_confirm',\n UI_BUTTON = 'ui_button',\n ADMIN_OVERRIDE = 'admin_override',\n}\n\nexport interface AccessGrant {\n id: number;\n uuid: string;\n grantorMemberId: number;\n grantorMemberName?: string;\n granteeMemberId: number;\n granteeMemberName?: string;\n resourceType: AccessGrantResourceType;\n resourceId?: number | null;\n resourceLabel?: string | null;\n dataTypeId?: number | null;\n dataTypeName?: string | null;\n accessMode: number;\n trigger: AccessGrantTrigger;\n memberCredentialId?: number | null;\n assignmentId?: number | null;\n chatId?: number | null;\n status: AccessGrantStatus;\n consentMethod?: ConsentMethod | null;\n expiresAt?: string | null;\n revokedAt?: string | null;\n revokedByMemberId?: number | null;\n revokedByMemberName?: string | null;\n revocationReason?: string | null;\n createdAt: string;\n resolvedAt?: string | null;\n}\n\nexport interface CreateAccessGrantRequest {\n granteeMemberId: number;\n resourceType: AccessGrantResourceType;\n resourceId?: number;\n dataTypeId?: number;\n accessMode?: number;\n trigger: AccessGrantTrigger;\n assignmentId?: number;\n chatId?: number;\n expiresAt?: string;\n consentMethod?: ConsentMethod;\n autoApprove?: boolean;\n}\n\nexport interface ResolveGrantRequest {\n approve: boolean;\n consentMethod?: ConsentMethod;\n expiresAt?: string;\n}\n\nexport interface RevokeGrantRequest {\n reason?: string;\n}\n"],"mappings":";;;;;;;;;;;;;Ae+BA,SAAS,kCAAkC;Af9BpC,SAAS,eAAe,MAAkC;AAC9D,MAAI,OAAO,aAAa,YAAa,QAAO;AAE5C,QAAM,UAAU,SAAS,OAAO,MAAM,GAAG;AACzC,aAAW,UAAU,SAAS;AAC3B,UAAM,gBAAgB,OAAO,KAAK;AAClC,UAAM,UAAU,cAAc,QAAQ,GAAG;AACzC,QAAI,YAAY,GAAI;AAEpB,UAAM,aAAa,cAAc,UAAU,GAAG,OAAO;AACrD,UAAM,cAAc,cAAc,UAAU,UAAU,CAAC;AAEvD,QAAI,eAAe,MAAM;AACtB,aAAO;IACV;EACH;AAEA,SAAO;AACV;AAEO,IAAM,WAAN,cAAuB,MAAM;EACjC;EACA;EAEA,YAAY,SAAiB,YAAoB,QAAmB;AACjE,UAAM,OAAO;AACb,SAAK,aAAa;AAClB,SAAK,SAAS;EACjB;AACH;AA+BA,SAAS,mBAAmB,iBAAyC;AAClE,MAAI,CAAC,gBAAiB,QAAO;AAC7B,SAAO,gBAAgB,SAAS,0CAA0C;AAC7E;AAOA,SAAS,sBAAsB,iBAAoD;AAChF,MAAI,CAAC,gBAAiB,QAAO;AAC7B,MAAI,CAAC,gBAAgB,SAAS,aAAa,EAAG,QAAO;AAGrD,QAAM,eAAe,gBAAgB,MAAM,oBAAoB;AAC/D,QAAM,kBAAkB,gBAAgB,MAAM,uBAAuB;AACrE,QAAM,eAAe,gBAAgB,MAAM,oBAAoB;AAE/D,MAAI,CAAC,eAAe,CAAC,KAAK,CAAC,kBAAkB,CAAC,KAAK,CAAC,eAAe,CAAC,GAAG;AACpE,YAAQ,KAAK,sCAAsC,eAAe;AAClE,WAAO;EACV;AAEA,SAAO;IACJ,SAAS,aAAa,CAAC;IACvB,YAAY,gBAAgB,CAAC;IAC7B,SAAS,aAAa,CAAC;EAC1B;AACH;AAEO,IAAM,gBAAN,MAAoB;EACd;EACA;EACA;EACA;EACF;EACA,yBAAiD;EACjD;EACA;EACA;EAER,YAAY,QAA4B,SAAiB,aAA4B;AAClF,SAAK,UAAU;AACf,SAAK,SAAS;AAGd,SAAK,gBACF,gBAAgB,OAAO,WAAW,cAAc,MAAM,KAAK,MAAM,IAAI;AAGxE,UAAM,eAAe,IAAI,IAAI,OAAO;AACpC,UAAM,gBAAgB,OAAO,WAAW,cAAc,OAAO,SAAS,SAAS;AAC/E,SAAK,gBAAgB,kBAAkB,MAAM,kBAAkB,aAAa;EAE/E;;;;;;EAOA,uBAAuB,SAA0C;AAC9D,SAAK,sBAAsB;EAC9B;;;;;;EAOA,kBAAkB,SAAqC;AACpD,SAAK,iBAAiB;EACzB;;;;EAKA,aAAa,WAAmB;AAC7B,SAAK,SAAS;EACjB;;;;;;;EAQA,gBAAgB,YAAgC;AAC7C,SAAK,mBAAmB;EAC3B;;;;EAKA,kBAAsC;AACnC,WAAO,KAAK;EACf;;;;;;EAOA,YAAY,OAA2B;AACpC,SAAK,WAAW;EACnB;EAEA,MAAgB,MAAS,UAAkB,SAAmC;AAC3E,QAAI;AACD,YAAM,UAAU,IAAI,QAAQ;QACzB,gBAAgB;QAChB,GAAK,SAAS,WAAsC,CAAC;MACxD,CAAC;AAED,UAAI,KAAK,QAAQ;AACd,gBAAQ,IAAI,iBAAiB,UAAU,KAAK,MAAM,EAAE;MACvD,WAAW,KAAK,eAAe;AAE5B,cAAM,eAAe,eAAe,cAAc;AAClD,YAAI,cAAc;AACf,kBAAQ,IAAI,iBAAiB,UAAU,YAAY,EAAE;QACxD;MACH;AAGA,UAAI,KAAK,kBAAkB;AACxB,gBAAQ,IAAI,mBAAmB,KAAK,gBAAgB;MACvD;AAGA,UAAI,KAAK,UAAU;AAChB,gBAAQ,IAAI,eAAe,KAAK,QAAQ;MAC3C;AAGA,YAAM,UAAU,GAAG,KAAK,OAAO,WAAW,QAAQ;AAGlD,YAAM,WAAW,MAAM,KAAK,cAAc,SAAS;QAChD,GAAG;QACH,GAAI,KAAK,SAAS,CAAC,IAAI,EAAE,aAAa,UAAU;QAChD,GAAI,KAAK,gBAAgB,EAAE,MAAM,OAAO,IAAI,CAAC;QAC7C;MACH,CAAC;AAED,UAAI,CAAC,SAAS,IAAI;AAEf,YACG,SAAS,WAAW,OACpB,mBAAmB,SAAS,QAAQ,IAAI,kBAAkB,CAAC,KAC3D,KAAK,qBACN;AAEC,cAAI,KAAK,wBAAwB;AAC9B,kBAAM,KAAK;UACd,OAAO;AAEJ,iBAAK,yBAAyB,KAAK,oBAAoB;AACvD,gBAAI;AACD,oBAAM,WAAW,MAAM,KAAK;AAC5B,mBAAK,SAAS;YACjB,UAAA;AACG,mBAAK,yBAAyB;YACjC;UACH;AAEA,cAAI;AACD,mBAAO,MAAM,KAAK,MAAS,UAAU,OAAO;UAC/C,SAAS,YAAY;AAClB,iBAAK,WAAW;AAChB,kBAAM;UACT;QACH;AAGA,YAAI,SAAS,WAAW,KAAK;AAC1B,gBAAM,cAAc,sBAAsB,SAAS,QAAQ,IAAI,kBAAkB,CAAC;AAClF,cAAI,eAAe,CAAC,KAAK,UAAU;AAEhC,kBAAM,oBAAoB,YAAY,WAAW;cAC9C;cACA;YACH;AACA,kBAAM,iBAAiB,eAAe,iBAAiB;AACvD,gBAAI,gBAAgB;AAEjB,mBAAK,WAAW;AAChB,kBAAI;AACD,uBAAO,MAAM,KAAK,MAAS,UAAU,OAAO;cAC/C,SAAS,YAAY;AAClB,qBAAK,WAAW;AAChB,sBAAM;cACT;YACH;AAGA,gBAAI,KAAK,gBAAgB;AACtB,oBAAM,KAAK,eAAe,WAAW;AACrC,oBAAM,IAAI,SAAS,wCAAwC,GAAG;YACjE;UACH;QACH;AAEA,cAAM,YAAY,MAAM,SAAS,KAAK,EAAE,MAAM,OAAO,CAAC,EAAE;AAGxD,YAAI,SAAS,WAAW,OAAO,aAAa,WAAW;AACpD,gBAAM,IAAI,MAAM,cAAc;QACjC;AAGA,YAAI,MAAM,QAAQ,UAAU,MAAM,GAAG;AAClC,gBAAM,kBAAkB,UAAU,OAC9B,IAAI,CAAC,UAAe;AAClB,kBAAM,WAAW,MAAM,IAAI,KAAK,KAAK;AACrC,mBAAO,GAAG,QAAQ,KAAK,MAAM,GAAG;UACnC,CAAC,EACA,KAAK,IAAI;AACb,gBAAM,IAAI,MAAM;EAAsB,eAAe,EAAE;QAC1D;AAGA,YAAI,UAAU,UAAU,MAAM,QAAQ,UAAU,MAAM,GAAG;AACtD,gBAAM,UAAU,UAAU,UAAU;AACpC,gBAAM,IAAI,SAAS,SAAS,SAAS,QAAQ,UAAU,MAAM;QAChE;AAGA,cAAM,kBAAkB,UAAU,UAAU;AAC5C,YACG,mBACA,OAAO,oBAAoB,aAC1B,gBAAgB,UAAU,QAAQ,gBAAgB,OACpD;AACC,gBAAM,UAAU,gBAAgB,WAAW,gBAAgB,QAAQ;AACnE,gBAAM,QAAQ,IAAI,SAAS,SAAS,SAAS,MAAM;AAElD,gBAAc,YAAY;AAC3B,gBAAM;QACT;AAGA,cAAM,eACH,OAAO,UAAU,WAAW,WACvB,UAAU,SACV,UAAU,WAAW,SAAS;AACtC,cAAM,IAAI,SAAS,cAAc,SAAS,MAAM;MACnD;AAGA,UAAI,SAAS,WAAW,KAAK;AAC1B,eAAO;MACV;AAEA,aAAO,SAAS,KAAK;IACxB,SAAS,OAAO;AACb,cAAQ,KAAK,KAAK;AAClB,YAAM;IACT;EACH;EAEA,MAAgB,SAAS,UAAkB,SAA0C;AAClF,QAAI;AACD,YAAM,UAAU,IAAI,QAAQ;QACzB,GAAK,SAAS,WAAsC,CAAC;MACxD,CAAC;AAED,UAAI,KAAK,QAAQ;AACd,gBAAQ,IAAI,iBAAiB,UAAU,KAAK,MAAM,EAAE;MACvD,WAAW,KAAK,eAAe;AAE5B,cAAM,eAAe,eAAe,cAAc;AAClD,YAAI,cAAc;AACf,kBAAQ,IAAI,iBAAiB,UAAU,YAAY,EAAE;QACxD;MACH;AAGA,UAAI,KAAK,kBAAkB;AACxB,gBAAQ,IAAI,mBAAmB,KAAK,gBAAgB;MACvD;AAGA,UAAI,KAAK,UAAU;AAChB,gBAAQ,IAAI,eAAe,KAAK,QAAQ;MAC3C;AAEA,YAAM,WAAW,MAAM,KAAK,cAAc,GAAG,KAAK,OAAO,WAAW,QAAQ,IAAI;QAC7E,GAAG;QACH,GAAI,KAAK,SAAS,CAAC,IAAI,EAAE,aAAa,UAAU;QAChD,GAAI,KAAK,gBAAgB,EAAE,MAAM,OAAO,IAAI,CAAC;QAC7C;MACH,CAAC;AAED,UAAI,CAAC,SAAS,IAAI;AAEf,YACG,SAAS,WAAW,OACpB,mBAAmB,SAAS,QAAQ,IAAI,kBAAkB,CAAC,KAC3D,KAAK,qBACN;AAEC,cAAI,KAAK,wBAAwB;AAC9B,kBAAM,KAAK;UACd,OAAO;AAEJ,iBAAK,yBAAyB,KAAK,oBAAoB;AACvD,gBAAI;AACD,oBAAM,WAAW,MAAM,KAAK;AAC5B,mBAAK,SAAS;YACjB,UAAA;AACG,mBAAK,yBAAyB;YACjC;UACH;AAEA,cAAI;AACD,mBAAO,MAAM,KAAK,SAAS,UAAU,OAAO;UAC/C,SAAS,YAAY;AAClB,iBAAK,WAAW;AAChB,kBAAM;UACT;QACH;AAGA,YAAI,SAAS,WAAW,KAAK;AAC1B,gBAAM,cAAc,sBAAsB,SAAS,QAAQ,IAAI,kBAAkB,CAAC;AAClF,cAAI,eAAe,CAAC,KAAK,UAAU;AAChC,kBAAM,oBAAoB,YAAY,WAAW;cAC9C;cACA;YACH;AACA,kBAAM,iBAAiB,eAAe,iBAAiB;AACvD,gBAAI,gBAAgB;AACjB,mBAAK,WAAW;AAChB,kBAAI;AACD,uBAAO,MAAM,KAAK,SAAS,UAAU,OAAO;cAC/C,SAAS,YAAY;AAClB,qBAAK,WAAW;AAChB,sBAAM;cACT;YACH;AAEA,gBAAI,KAAK,gBAAgB;AACtB,oBAAM,KAAK,eAAe,WAAW;AACrC,oBAAM,IAAI,SAAS,wCAAwC,GAAG;YACjE;UACH;QACH;AAEA,cAAM,YAAY,MAAM,SAAS,KAAK,EAAE,MAAM,MAAM,EAAE;AACtD,cAAM,IAAI,SAAS,aAAa,SAAS,YAAY,SAAS,MAAM;MACvE;AAEA,aAAO;IACV,SAAS,OAAO;AACb,cAAQ,KAAK,KAAK;AAClB,YAAM;IACT;EACH;;;;;EAMA,MAAgB,UAAa,MAAc,SAAmC;AAC3E,QAAI;AACD,YAAM,UAAU,IAAI,QAAQ;QACzB,gBAAgB;QAChB,GAAK,SAAS,WAAsC,CAAC;MACxD,CAAC;AAED,UAAI,KAAK,QAAQ;AACd,gBAAQ,IAAI,iBAAiB,UAAU,KAAK,MAAM,EAAE;MACvD,WAAW,KAAK,eAAe;AAC5B,cAAM,eAAe,eAAe,cAAc;AAClD,YAAI,cAAc;AACf,kBAAQ,IAAI,iBAAiB,UAAU,YAAY,EAAE;QACxD;MACH;AAGA,UAAI,KAAK,kBAAkB;AACxB,gBAAQ,IAAI,mBAAmB,KAAK,gBAAgB;MACvD;AAGA,UAAI,KAAK,UAAU;AAChB,gBAAQ,IAAI,eAAe,KAAK,QAAQ;MAC3C;AAEA,YAAM,UAAU,GAAG,KAAK,OAAO,IAAI,IAAI;AAEvC,YAAM,WAAW,MAAM,KAAK,cAAc,SAAS;QAChD,GAAG;QACH,GAAI,KAAK,SAAS,CAAC,IAAI,EAAE,aAAa,UAAU;QAChD,GAAI,KAAK,gBAAgB,EAAE,MAAM,OAAO,IAAI,CAAC;QAC7C;MACH,CAAC;AAED,UAAI,CAAC,SAAS,IAAI;AACf,YAAI,SAAS,WAAW,KAAK;AAC1B,iBAAO;QACV;AACA,cAAM,YAAY,MAAM,SAAS,KAAK,EAAE,MAAM,OAAO,CAAC,EAAE;AACxD,cAAM,eAAe,UAAU,UAAU,UAAU,WAAW,SAAS;AACvE,cAAM,IAAI,SAAS,cAAc,SAAS,MAAM;MACnD;AAEA,UAAI,SAAS,WAAW,KAAK;AAC1B,eAAO;MACV;AAEA,aAAO,SAAS,KAAK;IACxB,SAAS,OAAO;AACb,cAAQ,KAAK,KAAK;AAClB,YAAM;IACT;EACH;AACH;ACvdO,IAAM,UAAN,cAAsB,cAAc;;;;EAIzC,MAAM,SAAS,QAAqG;AAClH,UAAM,cAAc,IAAI,gBAAgB;AACxC,QAAI,QAAQ,OAAQ,aAAY,OAAO,UAAU,MAAM;AACvD,QAAI,QAAQ,kBAAkB,OAAW,aAAY,OAAO,kBAAkB,OAAO,aAAa;AAClG,QAAI,QAAQ,cAAc,OAAW,aAAY,OAAO,cAAc,OAAO,UAAU,SAAS,CAAC;AACjG,UAAM,cAAc,YAAY,SAAS;AACzC,WAAO,KAAK,MAAuB,OAAO,cAAc,IAAI,WAAW,KAAK,EAAE,EAAE;EAClF;;;;EAKA,MAAM,UAAU,SAAyC;AACvD,WAAO,KAAK,MAAW,QAAQ;MAC7B,QAAQ;MACR,MAAM,KAAK,UAAU,OAAO;IAC9B,CAAC;EACH;;;;EAKA,MAAM,OAAO,OAA6B;AACxC,WAAO,KAAK,MAAW,QAAQ,KAAK,EAAE;EACxC;;;;EAKA,MAAM,iBAAiB,UAAgC;AACrD,WAAO,KAAK,MAAW,qBAAqB,QAAQ,EAAE;EACxD;;;;EAKA,MAAM,UAAU,OAAe,SAAyC;AACtE,WAAO,KAAK,MAAW,QAAQ,KAAK,IAAI;MACtC,QAAQ;MACR,MAAM,KAAK,UAAU,OAAO;IAC9B,CAAC;EACH;;;;EAKA,MAAM,UAAU,OAA6C;AAC3D,WAAO,KAAK,MAA2B,QAAQ,KAAK,IAAI;MACtD,QAAQ;IACV,CAAC;EACH;;;;EAKA,MAAM,uBAAuB,OAA+C;AAC1E,WAAO,KAAK,MAA6B,QAAQ,KAAK,sBAAsB;MAC1E,QAAQ;IACV,CAAC;EACH;AACF;AC7DO,IAAM,cAAN,cAA0B,cAAc;;;;;EAK7C,MAAM,aACJ,KAC8B;AAC9B,UAAM,SAAS,IAAI,gBAAgB;AACnC,QAAI,QAAQ,OAAW,QAAO,OAAO,OAAO,OAAO,GAAG,CAAC;AAEvD,UAAM,cAAc,OAAO,SAAS;AACpC,UAAM,MAAM,WAAW,cAAc,IAAI,WAAW,KAAK,EAAE;AAE3D,WAAO,KAAK,MAA2B,GAAG;EAC5C;;;;;EAMA,MAAM,WACJ,WACkB;AAClB,WAAO,KAAK,MAAe,YAAY,SAAS,EAAE;EACpD;;;;EAKA,MAAM,cAAc,SAAiD;AACnE,WAAO,KAAK,MAAe,YAAY;MACrC,QAAQ;MACR,MAAM,KAAK,UAAU,OAAO;IAC9B,CAAC;EACH;;;;EAKA,MAAM,cACJ,WACA,SACkB;AAClB,WAAO,KAAK,MAAe,YAAY,SAAS,IAAI;MAClD,QAAQ;MACR,MAAM,KAAK,UAAU,OAAO;IAC9B,CAAC;EACH;;;;EAKA,MAAM,cAAc,WAAiD;AACnE,WAAO,KAAK,MAA2B,YAAY,SAAS,IAAI;MAC9D,QAAQ;IACV,CAAC;EACH;;;;EAKA,MAAM,eAAe,WAA6C;AAChE,WAAO,KAAK,MAAuB,YAAY,SAAS,OAAO;EACjE;AACF;AC1EO,IAAM,SAAN,cAAqB,cAAc;;;;;;;EAOvC,MAAM,cAAc,KAAa,SAAyD;AACvF,WAAO,KAAK,MAA0B,KAAK,GAAG,gBAAgB;MAC3D,QAAQ;MACR,MAAM,KAAK,UAAU,OAAO;IAC/B,CAAC;EACJ;AACH;ACSO,IAAM,SAAN,cAAqB,cAAc;;;;;;;;;;;EAWvC,MAAM,gBAAgB,UAA0D;AAC7E,WAAO,KAAK,MAA4B,KAAK,QAAQ,EAAE;EAC1D;;;;;EAMA,MAAM,oBAAoB,aAAyD;AAChF,WAAO,KAAK,MAAwB,KAAK,WAAW,KAAK;EAC5D;;;;EAKA,MAAM,uBACH,aACA,SAK+B;AAC/B,UAAM,SAAS,IAAI,gBAAgB;AACnC,QAAI,SAAS,OAAQ,QAAO,OAAO,UAAU,QAAQ,MAAM;AAC3D,QAAI,SAAS,KAAM,QAAO,OAAO,QAAQ,QAAQ,KAAK,SAAS,CAAC;AAChE,QAAI,SAAS,SAAU,QAAO,OAAO,YAAY,QAAQ,SAAS,SAAS,CAAC;AAE5E,WAAO,KAAK,MAA6B,KAAK,WAAW,YAAY,OAAO,SAAS,CAAC,EAAE;EAC3F;;;;EAKA,MAAM,yBACH,aACA,MACmB;AACnB,WAAO,KAAK,MAAiB,KAAK,WAAW,YAAY;MACtD,QAAQ;MACR,MAAM,KAAK,UAAU,IAAI;IAC5B,CAAC;EACJ;;;;EAKA,MAAM,uBACH,SACA,aAC+B;AAC/B,WAAO,KAAK,MAA6B,KAAK,OAAO,kBAAkB,WAAW,EAAE;EACvF;;;;EAKA,MAAM,yBACH,aACA,UACA,MACmB;AACnB,WAAO,KAAK,MAAiB,KAAK,WAAW,YAAY,QAAQ,IAAI;MAClE,QAAQ;MACR,MAAM,KAAK,UAAU,IAAI;IAC5B,CAAC;EACJ;;;;EAKA,MAAM,yBAAyB,aAA8B,UAAiC;AAC3F,WAAO,KAAK,MAAY,KAAK,WAAW,YAAY,QAAQ,IAAI;MAC7D,QAAQ;IACX,CAAC;EACJ;;;;;;;EASA,MAAM,4BACH,aACA,SAKgC;AAChC,UAAM,SAAS,IAAI,gBAAgB;AACnC,QAAI,SAAS,OAAQ,QAAO,OAAO,UAAU,QAAQ,MAAM;AAC3D,QAAI,SAAS,KAAM,QAAO,OAAO,QAAQ,QAAQ,KAAK,SAAS,CAAC;AAChE,QAAI,SAAS,SAAU,QAAO,OAAO,YAAY,QAAQ,SAAS,SAAS,CAAC;AAE5E,WAAO,KAAK;MACT,KAAK,WAAW,gBAAgB,OAAO,SAAS,CAAC;IACpD;EACH;;;;EAKA,MAAM,6BACH,aACA,MACoB;AACpB,WAAO,KAAK,MAAkB,KAAK,WAAW,gBAAgB;MAC3D,QAAQ;MACR,MAAM,KAAK,UAAU,IAAI;IAC5B,CAAC;EACJ;;;;EAKA,MAAM,0BACH,aACA,cACoB;AACpB,WAAO,KAAK,MAAkB,KAAK,WAAW,gBAAgB,YAAY,EAAE;EAC/E;;;;EAKA,MAAM,6BACH,aACA,cACA,MACoB;AACpB,WAAO,KAAK,MAAkB,KAAK,WAAW,gBAAgB,YAAY,IAAI;MAC3E,QAAQ;MACR,MAAM,KAAK,UAAU,IAAI;IAC5B,CAAC;EACJ;;;;EAKA,MAAM,6BACH,aACA,cACc;AACd,WAAO,KAAK,MAAY,KAAK,WAAW,gBAAgB,YAAY,IAAI;MACrE,QAAQ;IACX,CAAC;EACJ;;;;EAKA,MAAM,6BACH,aACA,cAC6B;AAC7B,WAAO,KAAK;MACT,KAAK,WAAW,gBAAgB,YAAY;MAC5C;QACG,QAAQ;MACX;IACH;EACH;AACH;ACpLO,IAAM,iBAAN,cAA6B,cAAc;EAC/C,MAAM,eAAe,KAAoC;AACtD,WAAO,KAAK,MAAoB,KAAK,GAAG,cAAc;EACzD;EAEA,MAAM,cAAc,KAAa,IAAiC;AAC/D,WAAO,KAAK,MAAkB,KAAK,GAAG,gBAAgB,EAAE,EAAE;EAC7D;EAEA,MAAM,iBAAiB,KAAa,YAAqD;AACtF,WAAO,KAAK,MAAkB,KAAK,GAAG,gBAAgB;MACnD,QAAQ;MACR,MAAM,KAAK,UAAU,UAAU;IAClC,CAAC;EACJ;EAEA,MAAM,iBACH,KACA,IACA,YACoB;AACpB,WAAO,KAAK,MAAkB,KAAK,GAAG,gBAAgB,EAAE,IAAI;MACzD,QAAQ;MACR,MAAM,KAAK,UAAU,UAAU;IAClC,CAAC;EACJ;EAEA,MAAM,iBAAiB,KAAa,IAA2B;AAC5D,WAAO,KAAK,MAAM,KAAK,GAAG,gBAAgB,EAAE,IAAI;MAC7C,QAAQ;IACX,CAAC;EACJ;AACH;AC8BO,IAAM,eAAN,cAA2B,cAAc;;;;;;;EAO7C,MAAM,mBACH,KACA,SACiC;AACjC,WAAO,KAAK,MAA+B,KAAK,GAAG,sBAAsB;MACtE,QAAQ;MACR,MAAM,KAAK,UAAU,OAAO;IAC/B,CAAC;EACJ;;;;;;;EAQA,MAAM,gBACH,KACA,SACiC;AACjC,WAAO,KAAK,MAA+B,KAAK,GAAG,sBAAsB;MACtE,QAAQ;MACR,MAAM,KAAK,UAAU,OAAO;IAC/B,CAAC;EACJ;;;;;;;EAQA,MAAM,oBACH,KACA,UAAmC,CAAC,GACF;AAClC,UAAM,SAAS,IAAI,gBAAgB;AACnC,QAAI,QAAQ,WAAW;AACpB,aAAO,OAAO,cAAc,QAAQ,SAAS;IAChD;AACA,QAAI,QAAQ,mBAAmB;AAC5B,aAAO,OAAO,sBAAsB,MAAM;IAC7C;AACA,UAAM,cAAc,OAAO,SAAS;AACpC,UAAM,MAAM,cACP,KAAK,GAAG,iCAAiC,WAAW,KACpD,KAAK,GAAG;AACb,WAAO,KAAK,MAAgC,KAAK,EAAE,QAAQ,MAAM,CAAC;EACrE;AACH;ACpIO,IAAM,eAAN,cAA2B,cAAc;;;;EAI7C,MAAM,gBAAgB,KAA4C;AAC/D,WAAO,KAAK,MAA4B,KAAK,GAAG,kBAAkB;EACrE;AACH;ACLO,IAAM,kBAAN,cAA8B,cAAc;EAChD,MAAM,oBACH,KACA,QACwC;AACxC,UAAM,eAAe,IAAI,gBAAgB;AACzC,QAAI,QAAQ,OAAQ,cAAa,IAAI,UAAU,OAAO,MAAM;AAC5D,QAAI,QAAQ,KAAM,cAAa,IAAI,QAAQ,OAAO,KAAK,SAAS,CAAC;AACjE,QAAI,QAAQ,SAAU,cAAa,IAAI,aAAa,OAAO,SAAS,SAAS,CAAC;AAC9E,UAAM,KAAK,aAAa,SAAS;AACjC,WAAO,KAAK;MACT,KAAK,GAAG,6BAA6B,KAAK,IAAI,EAAE,KAAK,EAAE;IAC1D;EACH;EAEA,MAAM,iBACH,KACA,QACwC;AACxC,UAAM,eAAe,IAAI,gBAAgB;AACzC,QAAI,QAAQ,OAAQ,cAAa,IAAI,UAAU,OAAO,MAAM;AAC5D,QAAI,QAAQ,KAAM,cAAa,IAAI,QAAQ,OAAO,KAAK,SAAS,CAAC;AACjE,QAAI,QAAQ,SAAU,cAAa,IAAI,aAAa,OAAO,SAAS,SAAS,CAAC;AAC9E,UAAM,KAAK,aAAa,SAAS;AACjC,WAAO,KAAK;MACT,KAAK,GAAG,0BAA0B,KAAK,IAAI,EAAE,KAAK,EAAE;IACvD;EACH;EAEA,MAAM,eAAe,KAAa,MAAoC;AACnE,WAAO,KAAK,MAAmB,KAAK,GAAG,kBAAkB,IAAI,EAAE;EAClE;EAEA,MAAM,kBAAkB,KAAa,MAAsD;AACxF,WAAO,KAAK,MAAmB,KAAK,GAAG,kBAAkB;MACtD,QAAQ;MACR,MAAM,KAAK,UAAU,IAAI;IAC5B,CAAC;EACJ;EAEA,MAAM,mBACH,KACA,MACA,MACqB;AACrB,WAAO,KAAK,MAAmB,KAAK,GAAG,kBAAkB,IAAI,YAAY;MACtE,QAAQ;MACR,MAAM,KAAK,UAAU,IAAI;IAC5B,CAAC;EACJ;EAEA,MAAM,kBACH,KACA,MACA,MACqB;AACrB,WAAO,KAAK,MAAmB,KAAK,GAAG,kBAAkB,IAAI,WAAW;MACrE,QAAQ;MACR,MAAM,KAAK,UAAU,IAAI;IAC5B,CAAC;EACJ;EAEA,MAAM,gBACH,KACA,QAOwC;AACxC,UAAM,eAAe,IAAI,gBAAgB;AACzC,QAAI,QAAQ,OAAQ,cAAa,IAAI,UAAU,OAAO,MAAM;AAC5D,QAAI,QAAQ,aAAc,cAAa,IAAI,iBAAiB,OAAO,YAAY;AAC/E,QAAI,QAAQ,WAAY,cAAa,IAAI,eAAe,OAAO,WAAW,SAAS,CAAC;AACpF,QAAI,QAAQ,KAAM,cAAa,IAAI,QAAQ,OAAO,KAAK,SAAS,CAAC;AACjE,QAAI,QAAQ,SAAU,cAAa,IAAI,YAAY,OAAO,SAAS,SAAS,CAAC;AAC7E,UAAM,KAAK,aAAa,SAAS;AACjC,WAAO,KAAK;MACT,KAAK,GAAG,iBAAiB,KAAK,IAAI,EAAE,KAAK,EAAE;IAC9C;EACH;EAEA,MAAM,gBAAgB,KAAa,UAA0C;AAC1E,UAAM,OAAO,MAAM,KAAK;MACrB,KAAK,GAAG,yBAAyB,QAAQ;IAC5C;AACA,WAAO,KAAK;EACf;AACH;ACjCO,IAAM,WAAN,cAAuB,cAAc;;EAEzC,MAAM,YAAY,SAUsB;AACrC,UAAM,SAAS,IAAI,gBAAgB;AACnC,QAAI,QAAQ,OAAQ,QAAO,OAAO,UAAU,QAAQ,MAAM;AAC1D,QAAI,QAAQ,aAAc,QAAO,OAAO,iBAAiB,QAAQ,YAAY;AAC7E,QAAI,QAAQ,cAAe,QAAO,OAAO,kBAAkB,QAAQ,aAAa;AAChF,QAAI,QAAQ,OAAQ,QAAO,OAAO,UAAU,QAAQ,MAAM;AAC1D,QAAI,QAAQ,UAAW,QAAO,OAAO,aAAa,QAAQ,SAAS;AACnE,QAAI,QAAQ,KAAM,QAAO,OAAO,QAAQ,QAAQ,KAAK,SAAS,CAAC;AAC/D,QAAI,QAAQ,SAAU,QAAO,OAAO,YAAY,QAAQ,SAAS,SAAS,CAAC;AAC3E,QAAI,QAAQ,aAAa,OAAW,QAAO,OAAO,YAAY,QAAQ,SAAS,SAAS,CAAC;AACzF,QAAI,QAAQ,mBAAmB;AAC5B,aAAO,OAAO,kBAAkB,QAAQ,eAAe,SAAS,CAAC;AAEpE,WAAO,KAAK,MAAkC,kBAAkB,OAAO,SAAS,CAAC,EAAE;EACtF;EAEA,MAAM,kBAAkB,IAA4C;AACjE,WAAO,KAAK,MAAoB,kBAAkB,EAAE,EAAE;EACzD;EAEA,MAAM,iBAAiB,MAAqC;AACzD,WAAO,KAAK,MAAoB,kBAAkB,IAAI,EAAE;EAC3D;EAEA,MAAM,sBAAsB,WAAsD;AAC/E,WAAO,KAAK,MAAgC,kBAAkB,SAAS,cAAc;EACxF;EAEA,MAAM,yBAAyB,WAAyD;AACrF,WAAO,KAAK,MAAmC,kBAAkB,SAAS,kBAAkB;EAC/F;EAEA,MAAM,2BACH,WACA,gBACA,OAAqC,UAQrC;AACA,WAAO,KAAK,MAAM,kBAAkB,SAAS,oBAAoB;MAC9D,QAAQ;MACR,MAAM,KAAK,UAAU,EAAE,gBAAgB,KAAK,CAAC;IAChD,CAAC;EACJ;EAEA,MAAM,2BACH,WACA,gBAKA;AACA,WAAO,KAAK,MAAM,kBAAkB,SAAS,oBAAoB,cAAc,IAAI;MAChF,QAAQ;IACX,CAAC;EACJ;EAEA,MAAM,qBACH,WACA,aACgC;AAChC,WAAO,KAAK;MACT,kBAAkB,SAAS,gBAAgB,WAAW;IACzD;EACH;EAEA,MAAM,wBACH,WACA,aACA,SACgC;AAChC,WAAO,KAAK;MACT,kBAAkB,SAAS,gBAAgB,WAAW;MACtD;QACG,QAAQ;QACR,MAAM,KAAK,UAAU,OAAO;MAC/B;IACH;EACH;EAEA,MAAM,wBACH,WACA,aACA,MACgC;AAChC,WAAO,KAAK;MACT,kBAAkB,SAAS,gBAAgB,WAAW;MACtD;QACG,QAAQ;QACR,MAAM,KAAK,UAAU,IAAI;MAC5B;IACH;EACH;EAEA,MAAM,wBAAwB,WAAmB,aAAoC;AAClF,WAAO,KAAK,MAAY,kBAAkB,SAAS,gBAAgB,WAAW,IAAI;MAC/E,QAAQ;IACX,CAAC;EACJ;EAEA,MAAM,qBACH,IACA,SACsB;AACtB,WAAO,KAAK,MAAoB,kBAAkB,EAAE,IAAI;MACrD,QAAQ;MACR,MAAM,KAAK,UAAU,OAAO;IAC/B,CAAC;EACJ;EAEA,MAAM,qBAAqB,MAAmD;AAC3E,WAAO,KAAK,MAAoB,kBAAkB;MAC/C,QAAQ;MACR,MAAM,KAAK,UAAU,IAAI;IAC5B,CAAC;EACJ;EAEA,MAAM,qBAAqB,IAA2B;AACnD,WAAO,KAAK,MAAM,kBAAkB,EAAE,IAAI;MACvC,QAAQ;IACX,CAAC;EACJ;;;;;EAMA,MAAM,cAAc,SAGe;AAChC,UAAM,SAAS,IAAI,gBAAgB;AACnC,QAAI,QAAQ,MAAO,QAAO,OAAO,SAAS,QAAQ,KAAK;AACvD,QAAI,QAAQ,MAAO,QAAO,OAAO,SAAS,QAAQ,KAAK;AAEvD,WAAO,KAAK,MAA6B,yBAAyB,OAAO,SAAS,CAAC,EAAE;EACxF;;EAGA,MAAM,iBAAiB,SAI2B;AAC/C,UAAM,SAAS,IAAI,gBAAgB;AACnC,QAAI,SAAS,OAAQ,QAAO,OAAO,UAAU,QAAQ,MAAM;AAC3D,QAAI,SAAS,KAAM,QAAO,OAAO,QAAQ,QAAQ,KAAK,SAAS,CAAC;AAChE,QAAI,SAAS,SAAU,QAAO,OAAO,YAAY,QAAQ,SAAS,SAAS,CAAC;AAE5E,WAAO,KAAK;MACT,uBAAuB,OAAO,SAAS,CAAC;IAC3C;EACH;;;;;;;;;;;EAYA,MAAM,gBAAgB,UAAuE;AAC1F,WAAO,KAAK,MAAyC,KAAK,QAAQ,EAAE;EACvE;EAEA,MAAM,mBAAmB,MAA6D;AACnF,WAAO,KAAK,MAAyB,uBAAuB;MACzD,QAAQ;MACR,MAAM,KAAK,UAAU,IAAI;IAC5B,CAAC;EACJ;EAEA,MAAM,mBACH,IACA,MAC2B;AAC3B,WAAO,KAAK,MAAyB,uBAAuB,EAAE,IAAI;MAC/D,QAAQ;MACR,MAAM,KAAK,UAAU,IAAI;IAC5B,CAAC;EACJ;EAEA,MAAM,mBAAmB,IAA2B;AACjD,WAAO,KAAK,MAAM,uBAAuB,EAAE,IAAI;MAC5C,QAAQ;IACX,CAAC;EACJ;;;;;;EAOA,MAAM,iBACH,SACA,OAAqC,SAQrC;AACA,WAAO,KAAK,MAAM,uBAAuB,OAAO,SAAS;MACtD,QAAQ;MACR,MAAM,KAAK,UAAU,EAAE,KAAK,CAAC;IAChC,CAAC;EACJ;;;;;EAMA,MAAM,kBAAkB,SAA+D;AACpF,WAAO,KAAK,MAAM,uBAAuB,OAAO,SAAS;MACtD,QAAQ;IACX,CAAC;EACJ;EAEA,MAAM,sBACH,kBACA,MAC4B;AAC5B,WAAO,KAAK,MAA0B,KAAK,gBAAgB,oBAAoB;MAC5E,QAAQ;MACR,MAAM,KAAK,UAAU,IAAI;IAC5B,CAAC;EACJ;;;;;;EASA,MAAM,eAAe,aAAoC;AACtD,WAAO,KAAK,MAAM,yBAAyB;MACxC,QAAQ;MACR,MAAM,KAAK,UAAU,EAAE,YAAY,CAAC;IACvC,CAAC;EACJ;;EAIA,MAAM,qBAAqB,SAAiD;AACzE,WAAO,KAAK,MAAe,kBAAkB;MAC1C,QAAQ;MACR,MAAM,KAAK,UAAU,OAAO;IAC/B,CAAC;EACJ;EAEA,MAAM,mBAAmB,eAAwB,cAA6C;AAC3F,UAAM,SAAS,IAAI,gBAAgB;AACnC,QAAI,eAAe;AAChB,aAAO,OAAO,kBAAkB,aAAa;IAChD;AACA,QAAI,gBAAgB,aAAa,SAAS,GAAG;AAC1C,mBAAa,QAAQ,CAAC,SAAS,OAAO,OAAO,iBAAiB,IAAI,CAAC;IACtE;AACA,UAAM,cAAc,OAAO,SAAS;AACpC,WAAO,KAAK,MAAiB,iBAAiB,cAAc,IAAI,WAAW,KAAK,EAAE,EAAE;EACvF;EAEA,MAAM,kBAAkB,WAAqC;AAC1D,WAAO,KAAK,MAAe,kBAAkB,SAAS,EAAE;EAC3D;EAEA,MAAM,qBACH,YACA,SACiB;AACjB,WAAO,KAAK,MAAe,kBAAkB,UAAU,IAAI;MACxD,QAAQ;MACR,MAAM,KAAK,UAAU,OAAO;IAC/B,CAAC;EACJ;EAEA,MAAM,qBAAqB,WAAiD;AACzE,WAAO,KAAK,MAA2B,kBAAkB,SAAS,IAAI;MACnE,QAAQ;IACX,CAAC;EACJ;;EAGA,MAAM,qBACH,UAQI,CAAC,GACsC;AAC3C,UAAM,SAAS,IAAI,gBAAgB;AACnC,QAAI,QAAQ,SAAS,OAAW,QAAO,OAAO,QAAQ,QAAQ,KAAK,SAAS,CAAC;AAC7E,QAAI,QAAQ,aAAa,OAAW,QAAO,OAAO,YAAY,QAAQ,SAAS,SAAS,CAAC;AACzF,QAAI,QAAQ,OAAQ,QAAO,OAAO,UAAU,QAAQ,MAAM;AAC1D,QAAI,QAAQ,UAAW,QAAO,OAAO,aAAa,QAAQ,SAAS;AACnE,QAAI,QAAQ,OAAQ,QAAO,OAAO,UAAU,QAAQ,MAAM;AAC1D,QAAI,QAAQ,eAAe;AACxB,aAAO,OAAO,cAAc,QAAQ,WAAW,SAAS,CAAC;AAC5D,QAAI,QAAQ,mBAAmB;AAC5B,aAAO,OAAO,kBAAkB,QAAQ,eAAe,SAAS,CAAC;AAEpE,WAAO,KAAK,MAAyC,oBAAoB,OAAO,SAAS,CAAC,EAAE;EAC/F;EAEA,MAAM,oBAAoB,KAAsC;AAC7D,WAAO,KAAK,MAAsB,oBAAoB,GAAG,EAAE;EAC9D;EAEA,MAAM,+BAA+B,cAA+C;AACjF,WAAO,KAAK,MAAsB,uBAAuB,YAAY,EAAE;EAC1E;EAEA,MAAM,uBAAuB,IAAgD;AAC1E,WAAO,KAAK,MAAiB,oBAAoB;MAC9C,QAAQ;MACR,MAAM,KAAK,UAAU,EAAE;IAC1B,CAAC;EACJ;EAEA,MAAM,uBAAuB,KAAa,IAAgD;AACvF,WAAO,KAAK,MAAiB,oBAAoB,GAAG,IAAI;MACrD,QAAQ;MACR,MAAM,KAAK,UAAU,EAAE;IAC1B,CAAC;EACJ;EAEA,MAAM,uBAAuB,KAA4B;AACtD,WAAO,KAAK,MAAM,oBAAoB,GAAG,IAAI;MAC1C,QAAQ;IACX,CAAC;EACJ;EAEA,MAAM,oBAAoB,KAAsC;AAC7D,WAAO,KAAK,MAAM,oBAAoB,GAAG,qBAAqB;MAC3D,QAAQ;IACX,CAAC;EACJ;EAEA,MAAM,qBAAqB,KAAsC;AAC9D,WAAO,KAAK,MAAM,oBAAoB,GAAG,sBAAsB;MAC5D,QAAQ;IACX,CAAC;EACJ;EAEA,MAAM,0BAA0B,KAAsC;AACnE,WAAO,KAAK,MAAM,oBAAoB,GAAG,cAAc;MACpD,QAAQ;IACX,CAAC;EACJ;EAEA,MAAM,8BAA8B,KAAsC;AACvE,WAAO,KAAK,MAAM,oBAAoB,GAAG,sBAAsB;MAC5D,QAAQ;IACX,CAAC;EACJ;EAEA,MAAM,sBAAsB,KAAsC;AAC/D,WAAO,KAAK,MAAM,oBAAoB,GAAG,gBAAgB;MACtD,QAAQ;IACX,CAAC;EACJ;EAEA,MAAM,uBAAuB,KAAsC;AAChE,WAAO,KAAK,MAAM,oBAAoB,GAAG,gBAAgB;MACtD,QAAQ;IACX,CAAC;EACJ;;EAIA,MAAM,mBAAmB,eAAyD;AAC/E,WAAO,KAAK,MAA+B,oBAAoB,aAAa,SAAS;EACxF;EAEA,MAAM,sBACH,eACA,SAC+B;AAC/B,WAAO,KAAK,MAA6B,oBAAoB,aAAa,mBAAmB;MAC1F,QAAQ;MACR,MAAM,KAAK,UAAU,WAAW,CAAC,CAAC;IACrC,CAAC;EACJ;EAEA,MAAM,aAAa,KAAa,SAA6D;AAC1F,WAAO,KAAK,MAA4B,oBAAoB,GAAG,kBAAkB;MAC9E,QAAQ;MACR,MAAM,KAAK,UAAU,OAAO;IAC/B,CAAC;EACJ;EAEA,MAAM,yBACH,KACA,SACoC;AACpC,WAAO,KAAK;MACT,oBAAoB,GAAG;MACvB;QACG,QAAQ;QACR,MAAM,KAAK,UAAU,OAAO;MAC/B;IACH;EACH;EAEA,MAAM,yBAAyB,KAAa,aAAoC;AAC7E,WAAO,KAAK,MAAM,oBAAoB,GAAG,0BAA0B,WAAW,IAAI;MAC/E,QAAQ;IACX,CAAC;EACJ;EAEA,MAAM,wBAAwB,KAA8B;AACzD,WAAO,KAAK,MAAM,oBAAoB,GAAG,OAAO;MAC7C,QAAQ;IACX,CAAC;EACJ;EAEA,MAAM,2BACH,KACA,MACc;AACd,WAAO,KAAK,MAAM,oBAAoB,GAAG,OAAO;MAC7C,QAAQ;MACR,MAAM,KAAK,UAAU,IAAI;IAC5B,CAAC;EACJ;EAEA,MAAM,2BACH,KACA,MACc;AACd,WAAO,KAAK,MAAM,oBAAoB,GAAG,OAAO;MAC7C,QAAQ;MACR,MAAM,KAAK,UAAU,IAAI;IAC5B,CAAC;EACJ;EAEA,MAAM,6BAA6B,KAAoC;AACpE,WAAO,KAAK,MAAoB,oBAAoB,GAAG,eAAe;EACzE;;EAGA,MAAM,uBACH,UAOI,CAAC,GACkD;AACvD,UAAM,SAAS,IAAI,gBAAgB;AACnC,QAAI,QAAQ,KAAM,QAAO,OAAO,QAAQ,QAAQ,KAAK,SAAS,CAAC;AAC/D,QAAI,QAAQ,SAAU,QAAO,OAAO,YAAY,QAAQ,SAAS,SAAS,CAAC;AAC3E,QAAI,QAAQ,OAAQ,QAAO,OAAO,UAAU,QAAQ,MAAM;AAC1D,QAAI,QAAQ,YAAa,QAAO,OAAO,eAAe,QAAQ,YAAY,SAAS,CAAC;AACpF,QAAI,QAAQ,OAAQ,QAAO,OAAO,UAAU,QAAQ,MAAM;AAC1D,QAAI,QAAQ,cAAe,QAAO,OAAO,iBAAiB,QAAQ,aAAa;AAE/E,WAAO,KAAK;MACT,uBAAuB,OAAO,SAAS,IAAI,IAAI,OAAO,SAAS,CAAC,KAAK,EAAE;IAC1E;EACH;EAEA,MAAM,sBAAsB,IAAiD;AAC1E,WAAO,KAAK,MAAkC,wBAAwB,EAAE,EAAE;EAC7E;EAEA,MAAM,8BACH,MACoC;AACpC,WAAO,KAAK,MAAkC,wBAAwB;MACnE,QAAQ;MACR,MAAM,KAAK,UAAU,IAAI;IAC5B,CAAC;EACJ;EAEA,MAAM,8BAA8B,IAA2B;AAC5D,WAAO,KAAK,MAAY,wBAAwB,EAAE,IAAI;MACnD,QAAQ;IACX,CAAC;EACJ;EAEA,MAAM,+BACH,WAC2D;AAC3D,WAAO,KAAK;MACT,wBAAwB,SAAS;IACpC;EACH;EAEA,MAAM,iBACH,WACA,gBACoC;AACpC,WAAO,KAAK,MAAkC,wBAAwB,SAAS,UAAU;MACtF,QAAQ;MACR,MAAM,KAAK,UAAU,EAAE,eAAe,CAAC;IAC1C,CAAC;EACJ;EAEA,MAAM,0BAA0D;AAC7D,WAAO,KAAK,MAA6B,8BAA8B;EAC1E;EAEA,MAAM,iCAAiC,aAAqD;AACzF,WAAO,KAAK;MACT,iCAAiC,WAAW;IAC/C;EACH;EAEA,MAAM,gCAAgC,aAA6C;AAChF,WAAO,KAAK,MAAqB,mBAAmB,WAAW,gBAAgB;EAClF;;EAGA,MAAM,wBACH,UAQI,CAAC,GAC2C;AAChD,UAAM,SAAS,IAAI,gBAAgB;AACnC,QAAI,QAAQ,KAAM,QAAO,OAAO,QAAQ,QAAQ,KAAK,SAAS,CAAC;AAC/D,QAAI,QAAQ,SAAU,QAAO,OAAO,YAAY,QAAQ,SAAS,SAAS,CAAC;AAC3E,QAAI,QAAQ,OAAQ,QAAO,OAAO,UAAU,QAAQ,MAAM;AAC1D,QAAI,QAAQ,OAAQ,QAAO,OAAO,UAAU,QAAQ,MAAM;AAC1D,QAAI,QAAQ,SAAU,QAAO,OAAO,YAAY,QAAQ,QAAQ;AAChE,QAAI,QAAQ,OAAQ,QAAO,OAAO,UAAU,QAAQ,MAAM;AAC1D,QAAI,QAAQ,cAAe,QAAO,OAAO,iBAAiB,QAAQ,aAAa;AAE/E,WAAO,KAAK;MACT,sBAAsB,OAAO,SAAS,IAAI,IAAI,OAAO,SAAS,CAAC,KAAK,EAAE;IACzE;EACH;EAEA,MAAM,uBAAuB,IAA0C;AACpE,WAAO,KAAK,MAA2B,uBAAuB,EAAE,EAAE;EACrE;EAEA,MAAM,wBACH,IACA,QAC6B;AAC7B,WAAO,KAAK,MAA2B,uBAAuB,EAAE,WAAW;MACxE,QAAQ;MACR,MAAM,KAAK,UAAU,EAAE,OAAO,CAAC;IAClC,CAAC;EACJ;EAEA,MAAM,gCAMH;AACA,WAAO,KAAK,MAMT,2CAA2C;MAC3C,QAAQ;IACX,CAAC;EACJ;EAEA,MAAM,0BAA0B,eAAqD;AAClF,WAAO,KAAK,MAA2B,uBAAuB,aAAa,YAAY;MACpF,QAAQ;IACX,CAAC;EACJ;EAEA,MAAM,yBAAyB,eAAqD;AACjF,WAAO,KAAK,MAA2B,uBAAuB,aAAa,WAAW;MACnF,QAAQ;IACX,CAAC;EACJ;;EAGA,MAAM,gBAAgB,SAIsB;AACzC,UAAM,cAAc,IAAI,gBAAgB;AACxC,QAAI,SAAS,OAAQ,aAAY,OAAO,UAAU,QAAQ,MAAM;AAChE,QAAI,SAAS,KAAM,aAAY,OAAO,QAAQ,QAAQ,KAAK,SAAS,CAAC;AACrE,QAAI,SAAS,SAAU,aAAY,OAAO,YAAY,QAAQ,SAAS,SAAS,CAAC;AAEjF,UAAM,cAAc,YAAY,SAAS;AACzC,UAAM,MAAM,sBAAsB,cAAc,IAAI,WAAW,KAAK,EAAE;AAEtE,WAAO,KAAK,MAAsC,GAAG;EACxD;EAEA,MAAM,eAAe,QAAsC;AACxD,WAAO,KAAK,MAAmB,uBAAuB,MAAM,EAAE;EACjE;EAEA,MAAM,kBAAkB,QAAgB,MAAiD;AACtF,WAAO,KAAK,MAAmB,uBAAuB,MAAM,IAAI;MAC7D,QAAQ;MACR,MAAM,KAAK,UAAU,IAAI;IAC5B,CAAC;EACJ;EAEA,MAAM,2BAA2B,QAAgB,aAA2C;AACzF,WAAO,KAAK,kBAAkB,QAAQ;MACnC;MACA,UAAU;;IACb,CAAC;EACJ;EAEA,MAAM,uBAAuB,QAA+B;AACzD,WAAO,KAAK,MAAY,uBAAuB,MAAM,IAAI;MACtD,QAAQ;IACX,CAAC;EACJ;EAEA,MAAM,kBAAkB,SAAoD;AACzE,WAAO,KAAK,MAAmB,uBAAuB;MACnD,QAAQ;MACR,MAAM,KAAK,UAAU,OAAO;IAC/B,CAAC;EACJ;;EAGA,MAAM,0BACH,KACA,SACqB;AACrB,WAAO,KAAK,MAAmB,oBAAoB,GAAG,kBAAkB;MACrE,QAAQ;MACR,MAAM,KAAK,UAAU,OAAO;IAC/B,CAAC;EACJ;EAEA,MAAM,kBAAkB,KAAa,UAAiC;AACnE,WAAO,KAAK,MAAM,oBAAoB,GAAG,kBAAkB,QAAQ,IAAI;MACpE,QAAQ;IACX,CAAC;EACJ;;EAGA,MAAM,iBACH,UAKI,CAAC,GACkD;AACvD,UAAM,SAAS,IAAI,gBAAgB;AACnC,QAAI,QAAQ,KAAM,QAAO,OAAO,QAAQ,QAAQ,KAAK,SAAS,CAAC;AAC/D,QAAI,QAAQ,SAAU,QAAO,OAAO,YAAY,QAAQ,SAAS,SAAS,CAAC;AAC3E,QAAI,QAAQ,OAAQ,QAAO,OAAO,UAAU,QAAQ,MAAM;AAC1D,QAAI,QAAQ,YAAa,QAAO,OAAO,eAAe,QAAQ,YAAY,SAAS,CAAC;AAEpF,WAAO,KAAK;MACT,uBAAuB,OAAO,SAAS,IAAI,IAAI,OAAO,SAAS,CAAC,KAAK,EAAE;IAC1E;EACH;EAEA,MAAM,gBAAgB,IAAiD;AACpE,WAAO,KAAK,MAAkC,wBAAwB,EAAE,EAAE;EAC7E;EAEA,MAAM,mBAAmB,IAAY,aAA0D;AAC5F,WAAO,KAAK,MAAkC,wBAAwB,EAAE,IAAI;MACzE,QAAQ;MACR,MAAM,KAAK,UAAU,EAAE,YAAY,CAAC;IACvC,CAAC;EACJ;EAEA,MAAM,wBAAwB,IAA2B;AACtD,WAAO,KAAK,MAAM,wBAAwB,EAAE,IAAI;MAC7C,QAAQ;IACX,CAAC;EACJ;;EAGA,MAAM,sBAAsB,SAGW;AACpC,WAAO,KAAK,MAAiC,4BAA4B;MACtE,QAAQ;MACR,MAAM,KAAK,UAAU;QAClB,YAAY,QAAQ,YACf,QAAQ,UAAU,YAAY,EAAE,MAAM,GAAG,EAAE,CAAC,IAC5C,MACA,QAAQ,UAAU,aAAa,EAAE,MAAM,GAAG,EAAE,CAAC,IAC7C;QACL,wBAAwB,QAAQ,wBAAwB;MAC3D,CAAC;IACJ,CAAC;EACJ;EAEA,MAAM,aAAa,SAIhB;AACA,WAAO,KAAK,MAIT,uBAAuB;MACvB,QAAQ;MACR,MAAM,KAAK,UAAU;QAClB,OAAO,QAAQ;QACf,gBAAgB,QAAQ;MAC3B,CAAC;IACJ,CAAC;EACJ;EAEA,MAAM,mBAAmB,SAItB;AACA,WAAO,KAAK,MAIT,8BAA8B;MAC9B,QAAQ;MACR,MAAM,KAAK,UAAU;QAClB,UAAU;MACb,CAAC;IACJ,CAAC;EACJ;;EAGA,MAAM,gBAA6C;AAChD,WAAO,KAAK,MAA0B,mBAAmB;EAC5D;;EAGA,MAAM,sBAAsB,aAAuD;AAChF,WAAO,KAAK;MACT,oBAAoB,WAAW;IAClC;EACH;EAEA,MAAM,sBACH,aACA,UACA,WAC+C;AAC/C,WAAO,KAAK;MACT,oBAAoB,WAAW,8BAA8B,QAAQ,eAAe,SAAS;MAC7F;QACG,QAAQ;MACX;IACH;EACH;;EAGA,MAAM,6BACH,eACA,iBAA0B,OAO1B;AACA,UAAM,SAAS,IAAI,gBAAgB;AACnC,WAAO,OAAO,mBAAmB,eAAe,SAAS,CAAC;AAE1D,WAAO,KAAK,MAMT,oBAAoB,aAAa,yBAAyB,OAAO,SAAS,CAAC,IAAI;MAC/E,QAAQ;IACX,CAAC;EACJ;;EAGA,MAAM,uBAAuB,eAK1B;AACA,WAAO,KAAK,MAKT,oBAAoB,aAAa,oBAAoB;MACrD,QAAQ;IACX,CAAC;EACJ;;EAGA,MAAM,wBAAwB,eAK3B;AACA,WAAO,KAAK,MAKT,oBAAoB,aAAa,yBAAyB;MAC1D,QAAQ;IACX,CAAC;EACJ;;EAGA,MAAM,kBACH,eACA,QACA,WACA,SAOA;AACA,WAAO,KAAK,MAMT,oBAAoB,aAAa,UAAU,MAAM,aAAa,SAAS,IAAI;MAC3E,QAAQ;MACR,MAAM,KAAK,UAAU,EAAE,QAAQ,CAAC;IACnC,CAAC;EACJ;;EAIA,MAAM,kBAAkB,WAA4C;AACjE,WAAO,KAAK,MAAsB,kBAAkB,SAAS,kBAAkB;EAClF;EAEA,MAAM,qBACH,WACA,MACwB;AACxB,WAAO,KAAK,MAAsB,kBAAkB,SAAS,oBAAoB;MAC9E,QAAQ;MACR,MAAM,KAAK,UAAU,IAAI;IAC5B,CAAC;EACJ;EAEA,MAAM,qBACH,WACA,MACwB;AACxB,WAAO,KAAK,MAAsB,kBAAkB,SAAS,oBAAoB;MAC9E,QAAQ;MACR,MAAM,KAAK,UAAU,IAAI;IAC5B,CAAC;EACJ;;EAIA,MAAM,uBAAuB,WAA4C;AACtE,WAAO,KAAK,MAAsB,kBAAkB,SAAS,uBAAuB;EACvF;EAEA,MAAM,yBACH,WACA,MACsB;AACtB,WAAO,KAAK,MAAoB,kBAAkB,SAAS,yBAAyB;MACjF,QAAQ;MACR,MAAM,KAAK,UAAU,IAAI;IAC5B,CAAC;EACJ;EAEA,MAAM,yBACH,WACA,gBACA,MACsB;AACtB,WAAO,KAAK;MACT,kBAAkB,SAAS,yBAAyB,cAAc;MAClE;QACG,QAAQ;QACR,MAAM,KAAK,UAAU,IAAI;MAC5B;IACH;EACH;EAEA,MAAM,yBACH,WACA,gBAC6C;AAC7C,WAAO,KAAK;MACT,kBAAkB,SAAS,yBAAyB,cAAc;MAClE;QACG,QAAQ;MACX;IACH;EACH;EAEA,MAAM,kCACH,WACA,gBACwB;AACxB,WAAO,KAAK;MACT,kBAAkB,SAAS,yBAAyB,cAAc;MAClE;QACG,QAAQ;MACX;IACH;EACH;EAEA,MAAM,mCACH,WACA,gBACA,aACsB;AACtB,WAAO,KAAK;MACT,kBAAkB,SAAS,yBAAyB,cAAc,2BAA2B,WAAW;MACxG;QACG,QAAQ;MACX;IACH;EACH;EAEA,MAAM,8BACH,WACA,gBAWA;AACA,WAAO,KAAK,MAUT,kBAAkB,SAAS,yBAAyB,cAAc,iBAAiB;MACnF,QAAQ;IACX,CAAC;EACJ;;EAIA,MAAM,kBAAkB,WAIrB;AACA,WAAO,KAAK,MAIT,kBAAkB,SAAS,wBAAwB;MACnD,QAAQ;IACX,CAAC;EACJ;EAEA,MAAM,wBAAwB,WAAmD;AAC9E,WAAO,KAAK;MACT,kBAAkB,SAAS;IAC9B;EACH;EAEA,MAAM,0BACH,WACA,iBACA,eAAwB,OAMxB;AACA,WAAO,KAAK,MAKT,kBAAkB,SAAS,2BAA2B,eAAe,WAAW;MAChF,QAAQ;MACR,MAAM,KAAK,UAAU,EAAE,aAAa,CAAC;IACxC,CAAC;EACJ;EAEA,MAAM,0BACH,WACA,iBAC8C;AAC9C,WAAO,KAAK;MACT,kBAAkB,SAAS,2BAA2B,eAAe;MACrE;QACG,QAAQ;MACX;IACH;EACH;EAEA,MAAM,8BACH,WACA,iBAC8C;AAC9C,WAAO,KAAK;MACT,kBAAkB,SAAS,2BAA2B,eAAe;MACrE;QACG,QAAQ;MACX;IACH;EACH;;EAIA,MAAM,mCACH,eACA,sBACA,cA2CA;AACA,WAAO,KAAK,MA0CT,oBAAoB,aAAa,uBAAuB;MACxD,QAAQ;MACR,SAAS;QACN,gBAAgB;MACnB;MACA,MAAM,KAAK,UAAU;QAClB;QACA;MACH,CAAC;IACJ,CAAC;EACJ;EAEA,MAAM,4BACH,eACA,sBACA,cAcA;AACA,WAAO,KAAK,MAaT,oBAAoB,aAAa,eAAe;MAChD,QAAQ;MACR,MAAM,KAAK,UAAU;QAClB;QACA;MACH,CAAC;IACJ,CAAC;EACJ;;EAIA,MAAM,oBACH,WACA,MAwBA;AACA,WAAO,KAAK,MAgBT,kBAAkB,SAAS,oBAAoB;MAC/C,QAAQ;MACR,MAAM,KAAK,UAAU;QAClB,UAAU,KAAK;QACf,aAAa,KAAK;QAClB,mBAAmB,KAAK;QACxB,gBAAgB,KAAK;QACrB,cAAc,KAAK;QACnB,UAAU,KAAK;MAClB,CAAC;IACJ,CAAC;EACJ;EAEA,MAAM,kBACH,WACA,SAoBD;AACC,UAAM,SAAS,IAAI,gBAAgB;AACnC,QAAI,SAAS,MAAO,QAAO,OAAO,SAAS,QAAQ,MAAM,SAAS,CAAC;AACnE,QAAI,SAAS,cAAe,QAAO,OAAO,kBAAkB,QAAQ,aAAa;AAEjF,WAAO,KAAK,MAmBV,kBAAkB,SAAS,oBAAoB,OAAO,SAAS,CAAC,EAAE;EACvE;EAEA,MAAM,yBACH,WACA,gBA2BA;AACA,UAAM,SAAS,IAAI,gBAAgB;AACnC,QAAI,eAAgB,QAAO,OAAO,mBAAmB,cAAc;AAEnE,WAAO,KAAK,MA0BT,kBAAkB,SAAS,4BAA4B,OAAO,SAAS,CAAC,EAAE;EAChF;;EAGA,MAAM,6BAA6B,eAA0D;AAC1F,WAAO,KAAK;MACT,oBAAoB,aAAa;IACpC;EACH;EAEA,MAAM,2BACH,eACA,SAC2B;AAC3B,WAAO,KAAK,MAAyB,oBAAoB,aAAa,eAAe;MAClF,QAAQ;MACR,MAAM,KAAK,UAAU,WAAW,CAAC,CAAC;IACrC,CAAC;EACJ;;EAGA,MAAM,0BAA0B,eAA4D;AACzF,UAAM,SAAS,gBAAgB,mBAAmB,mBAAmB,aAAa,CAAC,KAAK;AACxF,WAAO,KAAK,MAAiC,gCAAgC,MAAM,EAAE;EACxF;EAEA,MAAM,oBACH,WACA,SACqC;AACrC,WAAO,KAAK,MAAmC,kBAAkB,SAAS,gBAAgB;MACvF,QAAQ;MACR,MAAM,KAAK,UAAU,EAAE,GAAG,SAAS,UAAU,CAAC;IACjD,CAAC;EACJ;;EAGA,MAAM,qBACH,OACA,QAAgB,IAUjB;AACC,UAAM,SAAS,IAAI,gBAAgB,EAAE,OAAO,OAAO,MAAM,SAAS,EAAE,CAAC;AACrE,WAAO,KAAK,MASV,gCAAgC,OAAO,SAAS,CAAC,EAAE;EACxD;;EAIA,MAAM,wBAAwB,SAIc;AACzC,UAAM,SAAS,IAAI,gBAAgB;AACnC,QAAI,SAAS,UAAW,QAAO,OAAO,cAAc,QAAQ,UAAU,SAAS,CAAC;AAChF,QAAI,SAAS,KAAM,QAAO,OAAO,QAAQ,QAAQ,KAAK,SAAS,CAAC;AAChE,QAAI,SAAS,SAAU,QAAO,OAAO,aAAa,QAAQ,SAAS,SAAS,CAAC;AAC7E,UAAM,cAAc,OAAO,SAAS;AACpC,WAAO,KAAK;MACT,sBAAsB,cAAc,IAAI,WAAW,KAAK,EAAE;IAC7D;EACH;;EAIA,MAAM,eAAe,SAAmD;AACrE,WAAO,KAAK,MAAmB,eAAe;MAC3C,QAAQ;MACR,MAAM,KAAK,UAAU,OAAO;IAC/B,CAAC;EACJ;;EAGA,MAAM,gBAAgB,SAOY;AAC/B,UAAM,SAAS,IAAI,gBAAgB;AACnC,QAAI,SAAS,MAAO,QAAO,OAAO,SAAS,QAAQ,MAAM,SAAS,CAAC;AACnE,QAAI,SAAS,OAAQ,QAAO,OAAO,UAAU,QAAQ,OAAO,SAAS,CAAC;AACtE,QAAI,SAAS,eAAgB,QAAO,OAAO,kBAAkB,QAAQ,cAAc;AACnF,QAAI,SAAS,mBAAmB;AAC7B,aAAO,OAAO,mBAAmB,QAAQ,gBAAgB,SAAS,CAAC;AACtE,QAAI,SAAS,OAAQ,QAAO,OAAO,UAAU,QAAQ,MAAM;AAC3D,QAAI,SAAS,QAAS,QAAO,OAAO,WAAW,QAAQ,OAAO;AAC9D,UAAM,KAAK,OAAO,SAAS;AAC3B,WAAO,KAAK,MAA4B,sBAAsB,KAAK,IAAI,EAAE,KAAK,EAAE,EAAE;EACrF;;EAGA,MAAM,iBAAiB,SAA+D;AACnF,WAAO,KAAK,MAA6B,wBAAwB;MAC9D,QAAQ;MACR,MAAM,KAAK,UAAU,OAAO;IAC/B,CAAC;EACJ;AACH;AC3gDO,IAAM,YAAN,cAAwB,cAAc;EAC1C,MAAM,UACH,KACA,UAOI,CAAC,GAC6B;AAClC,UAAM,SAAS,IAAI,gBAAgB;AACnC,QAAI,QAAQ,KAAM,QAAO,OAAO,QAAQ,QAAQ,KAAK,SAAS,CAAC;AAC/D,QAAI,QAAQ,SAAU,QAAO,OAAO,YAAY,QAAQ,SAAS,SAAS,CAAC;AAC3E,QAAI,QAAQ,OAAQ,QAAO,OAAO,UAAU,QAAQ,MAAM;AAC1D,QAAI,QAAQ,UAAW,QAAO,OAAO,aAAa,QAAQ,SAAS;AACnE,QAAI,QAAQ,OAAQ,QAAO,OAAO,UAAU,QAAQ,MAAM;AAC1D,QAAI,QAAQ;AACT,aAAO,OAAO,mBAAmB,QAAQ,gBAAgB,SAAS,CAAC;AAEtE,WAAO,KAAK;MACT,KAAK,GAAG,UAAU,OAAO,SAAS,IAAI,IAAI,OAAO,SAAS,CAAC,KAAK,EAAE;IACrE;EACH;EAEA,MAAM,SAAS,KAAa,IAA4B;AACrD,WAAO,KAAK,MAAa,KAAK,GAAG,WAAW,EAAE,EAAE;EACnD;EAEA,MAAM,YAAY,KAAa,OAA2C;AACvE,WAAO,KAAK,MAAa,KAAK,GAAG,WAAW;MACzC,QAAQ;MACR,MAAM,KAAK,UAAU,KAAK;IAC7B,CAAC;EACJ;EAEA,MAAM,YAAY,KAAa,IAAY,OAA2C;AACnF,WAAO,KAAK,MAAa,KAAK,GAAG,WAAW,EAAE,IAAI;MAC/C,QAAQ;MACR,MAAM,KAAK,UAAU,KAAK;IAC7B,CAAC;EACJ;EAEA,MAAM,YAAY,KAAa,IAAY,OAAgC;AACxE,UAAM,SAAS,QAAQ,gBAAgB;AACvC,WAAO,KAAK,MAAM,KAAK,GAAG,WAAW,EAAE,GAAG,MAAM,IAAI;MACjD,QAAQ;IACX,CAAC;EACJ;EAEA,MAAM,aAAa,KAAa,IAA4B;AACzD,WAAO,KAAK,MAAa,KAAK,GAAG,WAAW,EAAE,YAAY;MACvD,QAAQ;IACX,CAAC;EACJ;EAEA,MAAM,eAAe,KAAa,IAA4B;AAC3D,WAAO,KAAK,MAAa,KAAK,GAAG,WAAW,EAAE,cAAc;MACzD,QAAQ;IACX,CAAC;EACJ;AACH;AC/DO,IAAM,cAAN,cAA0B,cAAc;;;;EAI5C,MAAM,cAAc,UAA8C;AAC/D,UAAM,eAAe,IAAI,gBAAgB;AACzC,QAAI,SAAU,cAAa,OAAO,YAAY,QAAQ;AAEtD,UAAM,cAAc,aAAa,SAAS;AAC1C,UAAM,MAAM,cAAc,kBAAkB,WAAW,KAAK;AAE5D,WAAO,KAAK,MAAwB,GAAG;EAC1C;;;;EAKA,MAAM,kBAAkB,UAA8C;AACnE,UAAM,eAAe,IAAI,gBAAgB;AACzC,QAAI,SAAU,cAAa,OAAO,YAAY,QAAQ;AAEtD,UAAM,cAAc,aAAa,SAAS;AAC1C,UAAM,MAAM,cAAc,sBAAsB,WAAW,KAAK;AAEhE,WAAO,KAAK,MAAwB,GAAG;EAC1C;;;;EAKA,MAAM,eAAe,UAAiD;AACnE,UAAM,eAAe,IAAI,gBAAgB;AACzC,QAAI,SAAU,cAAa,OAAO,YAAY,QAAQ;AAEtD,UAAM,cAAc,aAAa,SAAS;AAC1C,UAAM,MAAM,cAAc,oBAAoB,WAAW,KAAK;AAE9D,WAAO,KAAK,MAA2B,GAAG;EAC7C;;;;;EAMA,MAAM,aAAa,UAAmB,qBAAqB,OAAmC;AAC3F,UAAM,eAAe,IAAI,gBAAgB;AACzC,QAAI,SAAU,cAAa,OAAO,YAAY,QAAQ;AACtD,QAAI,mBAAoB,cAAa,OAAO,uBAAuB,MAAM;AAEzE,UAAM,cAAc,aAAa,SAAS;AAC1C,UAAM,MAAM,cAAc,iBAAiB,WAAW,KAAK;AAE3D,WAAO,KAAK,MAAyB,GAAG;EAC3C;;;;EAKA,MAAM,eAAe,UAA8C;AAChE,UAAM,eAAe,IAAI,gBAAgB;AACzC,QAAI,SAAU,cAAa,OAAO,YAAY,QAAQ;AAEtD,UAAM,cAAc,aAAa,SAAS;AAC1C,UAAM,MAAM,cAAc,mBAAmB,WAAW,KAAK;AAE7D,WAAO,KAAK,MAAwB,GAAG;EAC1C;;;;EAKA,MAAM,aAAa,UAA8C;AAC9D,UAAM,eAAe,IAAI,gBAAgB;AACzC,QAAI,SAAU,cAAa,OAAO,YAAY,QAAQ;AAEtD,UAAM,cAAc,aAAa,SAAS;AAC1C,UAAM,MAAM,cAAc,iBAAiB,WAAW,KAAK;AAE3D,WAAO,KAAK,MAAwB,GAAG;EAC1C;;;;EAKA,MAAM,aAAa,UAA8C;AAC9D,UAAM,eAAe,IAAI,gBAAgB;AACzC,QAAI,SAAU,cAAa,OAAO,YAAY,QAAQ;AAEtD,UAAM,cAAc,aAAa,SAAS;AAC1C,UAAM,MAAM,cAAc,iBAAiB,WAAW,KAAK;AAE3D,WAAO,KAAK,MAAwB,GAAG;EAC1C;AACH;ACpGO,IAAM,aAAN,cAAyB,cAAc;;EAE3C,MAAM,WAAW,KAAgC;AAC9C,WAAO,KAAK,MAAgB,KAAK,GAAG,WAAW;EAClD;EAEA,MAAM,aAAa,KAAa,QAAgD;AAC7E,WAAO,KAAK,MAAqB,KAAK,GAAG,aAAa;MACnD,QAAQ;MACR,MAAM,KAAK,UAAU,MAAM;IAC9B,CAAC;EACJ;EAEA,MAAM,aAAa,KAAa,IAA2B;AACxD,WAAO,KAAK,MAAM,KAAK,GAAG,aAAa,EAAE,IAAI;MAC1C,QAAQ;IACX,CAAC;EACJ;;EAGA,MAAM,mBAAsC;AACzC,WAAO,KAAK,MAAgB,kBAAkB;EACjD;EAEA,MAAM,mBAAmB,QAAgD;AACtE,WAAO,KAAK,MAAqB,oBAAoB;MAClD,QAAQ;MACR,MAAM,KAAK,UAAU,MAAM;IAC9B,CAAC;EACJ;EAEA,MAAM,mBAAmB,IAA2B;AACjD,WAAO,KAAK,MAAM,oBAAoB,EAAE,IAAI;MACzC,QAAQ;IACX,CAAC;EACJ;AACH;ACzBO,IAAM,iBAAN,cAA6B,cAAc;EAC/C,MAAM,eACH,KACA,UAAkC,CAAC,GACI;AACvC,UAAM,SAAS,IAAI,gBAAgB;AACnC,QAAI,QAAQ,KAAM,QAAO,OAAO,QAAQ,QAAQ,KAAK,SAAS,CAAC;AAC/D,QAAI,QAAQ,SAAU,QAAO,OAAO,YAAY,QAAQ,SAAS,SAAS,CAAC;AAC3E,QAAI,QAAQ,OAAQ,QAAO,OAAO,UAAU,QAAQ,MAAM;AAC1D,QAAI,QAAQ,UAAW,QAAO,OAAO,aAAa,QAAQ,SAAS;AACnE,QAAI,QAAQ,KAAM,QAAO,OAAO,QAAQ,QAAQ,KAAK,SAAS,CAAC;AAC/D,QAAI,QAAQ,OAAQ,QAAO,OAAO,UAAU,QAAQ,OAAO,SAAS,CAAC;AACrE,QAAI,QAAQ,SAAU,QAAO,OAAO,YAAY,QAAQ,SAAS,SAAS,CAAC;AAC3E,QAAI,QAAQ,OAAQ,QAAO,OAAO,UAAU,QAAQ,MAAM;AAE1D,WAAO,KAAK;MACT,KAAK,GAAG,eAAe,OAAO,SAAS,IAAI,IAAI,OAAO,SAAS,CAAC,KAAK,EAAE;IAC1E;EACH;EAEA,MAAM,cAAc,KAAa,IAAiC;AAC/D,WAAO,KAAK,MAAkB,KAAK,GAAG,gBAAgB,EAAE,EAAE;EAC7D;EAEA,MAAM,sBAAsB,KAAa,IAAoC;AAC1E,WAAO,KAAK,MAAqB,KAAK,GAAG,gBAAgB,EAAE,WAAW;EACzE;EAEA,MAAM,iBACH,KACA,IACA,YACoB;AACpB,WAAO,KAAK,MAAkB,KAAK,GAAG,gBAAgB,EAAE,IAAI;MACzD,QAAQ;MACR,MAAM,KAAK,UAAU,UAAU;IAClC,CAAC;EACJ;EAEA,MAAM,iBAAiB,KAAa,IAA2B;AAC5D,WAAO,KAAK,MAAM,KAAK,GAAG,gBAAgB,EAAE,IAAI;MAC7C,QAAQ;IACX,CAAC;EACJ;EAEA,MAAM,kBACH,KACA,IACA,kBACwB;AACxB,WAAO,KAAK,MAAsB,KAAK,GAAG,gBAAgB,EAAE,UAAU,gBAAgB,EAAE;EAC3F;EAEA,MAAM,4BACH,KACA,IACA,kBACc;AACd,WAAO,KAAK,MAAM,KAAK,GAAG,gBAAgB,EAAE,UAAU,gBAAgB,WAAW;MAC9E,QAAQ;IACX,CAAC;EACJ;EAEA,MAAM,iBAAiB,KAAa,MAAqD;AACtF,WAAO,KAAK,MAAkB,KAAK,GAAG,gBAAgB;MACnD,QAAQ;MACR,MAAM,KAAK,UAAU,IAAI;IAC5B,CAAC;EACJ;EAEA,MAAM,wBACH,KACA,cACoC;AACpC,WAAO,KAAK;MACT,KAAK,GAAG,gBAAgB,YAAY;IACvC;EACH;EAEA,MAAM,wBACH,KACA,cACiC;AACjC,WAAO,KAAK;MACT,KAAK,GAAG,gBAAgB,YAAY;IACvC;EACH;EAEA,MAAM,iBACH,KACA,IACA,MACoB;AACpB,WAAO,KAAK,MAAkB,KAAK,GAAG,gBAAgB,EAAE,WAAW;MAChE,QAAQ;MACR,MAAM,KAAK,UAAU,QAAQ,CAAC,CAAC;IAClC,CAAC;EACJ;EAEA,MAAM,mBAAmB,KAAa,cAA8C;AACjF,WAAO,KAAK,MAAqB,KAAK,GAAG,gBAAgB,YAAY,QAAQ;EAChF;EAEA,MAAM,sBACH,KACA,cACA,UACA,aAAsC,CAAC,GACV;AAC7B,WAAO,KAAK,MAA2B,KAAK,GAAG,gBAAgB,YAAY,iBAAiB;MACzF,QAAQ;MACR,MAAM,KAAK,UAAU,EAAE,UAAU,WAAW,CAAC;IAChD,CAAC;EACJ;AACH;AClHO,IAAM,gBAAN,cAA4B,cAAc;EAC9C,MAAM,cACH,KACA,UAOI,CAAC,GACiC;AACtC,UAAM,SAAS,IAAI,gBAAgB;AACnC,QAAI,QAAQ,KAAM,QAAO,OAAO,QAAQ,QAAQ,KAAK,SAAS,CAAC;AAC/D,QAAI,QAAQ,SAAU,QAAO,OAAO,YAAY,QAAQ,SAAS,SAAS,CAAC;AAC3E,QAAI,QAAQ,OAAQ,QAAO,OAAO,UAAU,QAAQ,MAAM;AAC1D,QAAI,QAAQ,UAAW,QAAO,OAAO,aAAa,QAAQ,SAAS;AACnE,QAAI,QAAQ,KAAM,QAAO,OAAO,QAAQ,QAAQ,KAAK,SAAS,CAAC;AAC/D,QAAI,QAAQ,QAAQ;AACjB,aAAO,OAAO,UAAU,QAAQ,MAAM;IACzC;AAEA,WAAO,KAAK;MACT,KAAK,GAAG,cAAc,OAAO,SAAS,IAAI,IAAI,OAAO,SAAS,CAAC,KAAK,EAAE;IACzE;EACH;EAEA,MAAM,aAAa,KAAa,IAAgC;AAC7D,WAAO,KAAK,MAAiB,KAAK,GAAG,eAAe,EAAE,EAAE;EAC3D;EAEA,MAAM,gBAAgB,KAAa,WAAkD;AAClF,UAAM,gBAAgB,EAAE,GAAG,UAAU;AACrC,WAAO,KAAK,MAAiB,KAAK,GAAG,eAAe;MACjD,QAAQ;MACR,MAAM,KAAK,UAAU,aAAa;IACrC,CAAC;EACJ;EAEA,MAAM,gBACH,KACA,IACA,WACmB;AACnB,WAAO,KAAK,MAAiB,KAAK,GAAG,eAAe,EAAE,IAAI;MACvD,QAAQ;MACR,MAAM,KAAK,UAAU,SAAS;IACjC,CAAC;EACJ;EAEA,MAAM,gBAAgB,KAAa,IAA2B;AAC3D,WAAO,KAAK,MAAM,KAAK,GAAG,eAAe,EAAE,IAAI;MAC5C,QAAQ;IACX,CAAC;EACJ;EAEA,MAAM,WAAW,KAAa,SAAkD;AAC7E,UAAM,WAAW,MAAM,KAAK,SAAS,KAAK,GAAG,2BAA2B;MACrE,QAAQ;MACR,SAAS;QACN,gBAAgB;MACnB;MACA,MAAM,KAAK,UAAU,OAAO;IAC/B,CAAC;AACD,WAAO,SAAS,YAAY;EAC/B;AACH;AC3CA,SAAS,wBAAwB,aAA6B;AAC3D,MAAI;AAED,QAAI,SAAS,2BAA2B,WAAW;AAGnD,QAAI,CAAC,QAAQ;AACV,eAAS,2BAA2B,aAAa,IAAI;IACxD;AAEA,QAAI,UAAU,OAAO,QAAQ,GAAG;AAC7B,aAAO,OAAO,OAAO,OAAO;IAC/B;EACH,SAAS,OAAO;EAEhB;AAEA,SAAO;AACV;AAEO,IAAM,UAAN,cAAsB,cAAc;EACxC,MAAM,iBAAmC;AACtC,WAAO,KAAK,MAAe,SAAS;EACvC;EAEA,MAAM,kBAAkB,MAAyC;AAC9D,WAAO,KAAK,MAAM,WAAW;MAC1B,QAAQ;MACR,MAAM,KAAK,UAAU,IAAI;IAC5B,CAAC;EACJ;EAEA,MAAM,MACH,aACA,KACA,kBAC0B;AAC1B,UAAM,SAAS,IAAI,gBAAgB;AACnC,QAAI,IAAK,QAAO,OAAO,OAAO,GAAG;AACjC,UAAM,OAAY,EAAE,aAAa,wBAAwB,WAAW,EAAE;AACtE,QAAI,iBAAkB,MAAK,mBAAmB;AAC9C,WAAO,MAAM,KAAK,MAAwB,cAAc,OAAO,SAAS,CAAC,IAAI;MAC1E,QAAQ;MACR,MAAM,KAAK,UAAU,IAAI;IAC5B,CAAC;EACJ;EAEA,MAAM,WAAW,aAAqB,kBAAsD;AACzF,UAAM,OAAY,EAAE,aAAa,wBAAwB,WAAW,EAAE;AACtE,QAAI,iBAAkB,MAAK,mBAAmB;AAC9C,WAAO,MAAM,KAAK,MAAwB,oBAAoB;MAC3D,QAAQ;MACR,MAAM,KAAK,UAAU,IAAI;IAC5B,CAAC;EACJ;EAEA,MAAM,kBACH,aACA,MACA,kBAC4B;AAE5B,UAAM,iBAAiB,MAAM,KAAK,MAA0B,wBAAwB;MACjF,QAAQ;MACR,MAAM,KAAK,UAAU;QAClB,aAAa,wBAAwB,WAAW;QAChD;QACA;MACH,CAAC;IACJ,CAAC;AAGD,QAAI,CAAC,eAAe,qBAAqB,eAAe,OAAO;AAC5D,YAAM,mBAAmB,MAAM,MAAM,sBAAsB;QACxD,QAAQ;QACR,SAAS,EAAE,gBAAgB,mBAAmB;QAC9C,MAAM,KAAK,UAAU;UAClB,OAAO,eAAe;UACtB,SAAS;;QACZ,CAAC;MACJ,CAAC;AAED,UAAI,CAAC,iBAAiB,IAAI;AACvB,cAAM,SAAS,MAAM,iBAAiB,KAAK;AAC3C,gBAAQ,MAAM,0BAA0B,MAAM,EAAE;AAChD,cAAM,IAAI,MAAM,mCAAmC;MACtD;IACH;AAEA,WAAO;EACV;EAEA,MAAM,mBACH,OACA,UACA,kBAC4B;AAC5B,WAAO,MAAM,KAAK,MAA0B,6BAA6B;MACtE,QAAQ;MACR,MAAM,KAAK,UAAU,EAAE,OAAO,UAAU,iBAAiB,CAAC;IAC7D,CAAC;EACJ;EAEA,MAAM,oBACH,OACA,UACA,MACA,kBAC4B;AAC5B,WAAO,MAAM,KAAK,MAA0B,8BAA8B;MACvE,QAAQ;MACR,MAAM,KAAK,UAAU,EAAE,OAAO,UAAU,MAAM,iBAAiB,CAAC;IACnE,CAAC;EACJ;EAEA,MAAM,eACH,iBACA,aAC+C;AAC/C,WAAO,MAAM,KAAK,MAA6C,wBAAwB;MACpF,QAAQ;MACR,MAAM,KAAK,UAAU,EAAE,iBAAiB,YAAY,CAAC;IACxD,CAAC;EACJ;EAEA,MAAM,YAAY,aAAqE;AACpF,WAAO,MAAM,KAAK,MAA6C,qBAAqB;MACjF,QAAQ;MACR,MAAM,KAAK,UAAU,EAAE,YAAY,CAAC;IACvC,CAAC;EACJ;EAEA,MAAM,oBAAuD;AAC1D,WAAO,MAAM,KAAK,MAAgC,sBAAsB;EAC3E;EAEA,MAAM,SAAwC;AAE3C,UAAM,WAAW,MAAM,MAAM,oBAAoB;MAC9C,QAAQ;MACR,SAAS,EAAE,gBAAgB,mBAAmB;IACjD,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AACf,YAAM,IAAI,MAAM,kBAAkB;IACrC;AAEA,WAAO,MAAM,SAAS,KAAK;EAC9B;;EAGA,MAAM,0BAAsD;AACzD,WAAO,KAAK,MAAyB,2BAA2B;MAC7D,QAAQ;IACX,CAAC;EACJ;EAEA,MAAM,cAAc,OAA2C;AAC5D,WAAO,KAAK,MAAyB,uBAAuB;MACzD,QAAQ;MACR,MAAM,KAAK,UAAU,EAAE,MAAM,CAAC;IACjC,CAAC;EACJ;EAEA,MAAM,iBAAiB,cAA8C;AAClE,WAAO,KAAK,MAAqB,aAAa,YAAY,EAAE;EAC/D;;EAGA,MAAM,aACH,KACA,MAkB8B;AAC9B,WAAO,KAAK,MAA4B,KAAK,GAAG,kBAAkB;MAC/D,QAAQ;MACR,MAAM,KAAK,UAAU,IAAI;IAC5B,CAAC;EACJ;;EAIA,MAAM,iBACH,OACA,kBACA,aACkC;AAClC,WAAO,MAAM,KAAK,MAAgC,2BAA2B;MAC1E,QAAQ;MACR,MAAM,KAAK,UAAU,EAAE,OAAO,kBAAkB,YAAY,CAAC;IAChE,CAAC;EACJ;EAEA,MAAM,kBAAkB,OAAe,KAAkD;AACtF,UAAM,OAAwC,EAAE,MAAM;AACtD,QAAI,KAAK;AACN,WAAK,MAAM;IACd;AACA,WAAO,MAAM,KAAK,MAAiC,4BAA4B;MAC5E,QAAQ;MACR,MAAM,KAAK,UAAU,IAAI;IAC5B,CAAC;EACJ;;EAIA,MAAM,sBACH,OACA,kBAC0B;AAC1B,WAAO,MAAM,KAAK,MAAwB,gCAAgC;MACvE,QAAQ;MACR,MAAM,KAAK,UAAU,EAAE,OAAO,iBAAiB,CAAC;IACnD,CAAC;EACJ;EAEA,MAAM,YACH,OACA,MACA,kBAC4B;AAE5B,UAAM,iBAAiB,MAAM,KAAK,MAA0B,qBAAqB;MAC9E,QAAQ;MACR,MAAM,KAAK,UAAU,EAAE,OAAO,MAAM,iBAAiB,CAAC;IACzD,CAAC;AAGD,QAAI,CAAC,eAAe,qBAAqB,eAAe,OAAO;AAC5D,YAAM,mBAAmB,MAAM,MAAM,sBAAsB;QACxD,QAAQ;QACR,SAAS,EAAE,gBAAgB,mBAAmB;QAC9C,MAAM,KAAK,UAAU;UAClB,OAAO,eAAe;UACtB,SAAS;;QACZ,CAAC;MACJ,CAAC;AAED,UAAI,CAAC,iBAAiB,IAAI;AACvB,cAAM,IAAI,MAAM,mCAAmC;MACtD;IACH;AAEA,WAAO;EACV;;EAIA,MAAM,qBAA+C;AAClD,WAAO,KAAK,MAAuB,iBAAiB;EACvD;EAEA,MAAM,UAAU,MAAoD;AACjE,WAAO,KAAK,MAAyB,uBAAuB;MACzD,QAAQ;MACR,MAAM,KAAK,UAAU,IAAI;IAC5B,CAAC;EACJ;EAEA,MAAM,gBAAgB,MAAmE;AACtF,WAAO,KAAK,MAAkC,wBAAwB;MACnE,QAAQ;MACR,MAAM,KAAK,UAAU,IAAI;IAC5B,CAAC;EACJ;EAEA,MAAM,cAAc,MAA0C;AAC3D,WAAO,KAAK,MAAW,2BAA2B;MAC/C,QAAQ;MACR,MAAM,KAAK,UAAU,IAAI;IAC5B,CAAC;EACJ;EAEA,MAAM,oBACH,MACoC;AACpC,WAAO,KAAK,MAAkC,4BAA4B;MACvE,QAAQ;MACR,MAAM,KAAK,UAAU,IAAI;IAC5B,CAAC;EACJ;EAEA,MAAM,sBACH,OAAqC,CAAC,GACP;AAC/B,WAAO,KAAK,MAA6B,oCAAoC;MAC1E,QAAQ;MACR,MAAM,KAAK,UAAU,IAAI;IAC5B,CAAC;EACJ;EAEA,MAAM,uBAAuB,UAAuD;AACjF,WAAO,KAAK,MAAkC,oBAAoB,QAAQ,IAAI;MAC3E,QAAQ;IACX,CAAC;EACJ;EAEA,MAAM,sBACH,MACoC;AACpC,WAAO,KAAK,MAAkC,oBAAoB,KAAK,QAAQ,IAAI;MAChF,QAAQ;MACR,MAAM,KAAK,UAAU,IAAI;IAC5B,CAAC;EACJ;;EAIA,MAAM,eACH,WACA,MAC8C;AAC9C,WAAO,KAAK,MAA4C,sBAAsB;MAC3E,QAAQ;MACR,MAAM,KAAK,UAAU;QAClB,YAAY;QACZ;MACH,CAAC;IACJ,CAAC;EACJ;EAEA,MAAM,uBACH,WACA,MAC8C;AAC9C,WAAO,KAAK,MAA4C,0BAA0B;MAC/E,QAAQ;MACR,MAAM,KAAK,UAAU;QAClB,YAAY;QACZ;MACH,CAAC;IACJ,CAAC;EACJ;EAEA,MAAM,uBAAuB,WAQ1B;AACA,WAAO,KAAK,MAQT,6BAA6B;MAC7B,QAAQ;MACR,MAAM,KAAK,UAAU;QAClB,YAAY;MACf,CAAC;IACJ,CAAC;EACJ;EAEA,MAAM,mBACH,WACA,mBAC8C;AAC9C,WAAO,KAAK,MAA4C,qBAAqB;MAC1E,QAAQ;MACR,MAAM,KAAK,UAAU;QAClB,YAAY;QACZ,oBAAoB;MACvB,CAAC;IACJ,CAAC;EACJ;;EAIA,MAAM,qBAA2D;AAC9D,WAAO,KAAK,MAAmC,QAAQ;EAC1D;;;;;;EAQA,MAAM,wBACH,gBACA,UACyC;AACzC,WAAO,KAAK,MAAuC,qCAAqC;MACrF,QAAQ;MACR,MAAM,KAAK,UAAU;QAClB,iBAAiB;QACjB,WAAW;MACd,CAAC;IACJ,CAAC;EACJ;;;;;EAMA,MAAM,uBACH,WACA,SACwC;AACxC,WAAO,KAAK,MAAsC,oCAAoC;MACnF,QAAQ;MACR,MAAM,KAAK,UAAU;QAClB,YAAY;QACZ,UAAU;MACb,CAAC;IACJ,CAAC;EACJ;;;;EAKA,MAAM,8BAAkE;AACrE,WAAO,KAAK,MAAiC,oCAAoC;EACpF;;;;EAKA,MAAM,uBAAuB,WAA4D;AACtF,WAAO,KAAK;MACT,oCAAoC,SAAS;MAC7C,EAAE,QAAQ,SAAS;IACtB;EACH;;;;;;EAQA,MAAM,iCAAiC,OAAuD;AAC3F,WAAO,KAAK,MAAqC,oCAAoC,KAAK,EAAE;EAC/F;;;;;EAMA,MAAM,8BACH,OAC+C;AAC/C,WAAO,KAAK;MACT,oCAAoC,KAAK;MACzC,EAAE,QAAQ,OAAO;IACpB;EACH;AACH;AC9dO,IAAM,eAAN,cAA2B,cAAc;;EAE7C,MAAM,aACH,KACA,QACqC;AACrC,UAAM,cAAc,IAAI,gBAAgB;AACxC,QAAI,QAAQ,KAAM,aAAY,OAAO,QAAQ,OAAO,KAAK,SAAS,CAAC;AACnE,QAAI,QAAQ,SAAU,aAAY,OAAO,YAAY,OAAO,SAAS,SAAS,CAAC;AAC/E,QAAI,QAAQ,iBAAkB,aAAY,OAAO,oBAAoB,MAAM;AAE3E,UAAM,cAAc,YAAY,SAAS;AACzC,WAAO,KAAK;MACT,KAAK,GAAG,aAAa,cAAc,IAAI,WAAW,KAAK,EAAE;IAC5D;EACH;EAEA,MAAM,YAAY,KAAa,IAAY,kBAA+C;AACvF,UAAM,SAAS,IAAI,gBAAgB;AACnC,QAAI,iBAAkB,QAAO,OAAO,qBAAqB,MAAM;AAC/D,WAAO,KAAK;MACT,KAAK,GAAG,cAAc,EAAE,GAAG,OAAO,SAAS,IAAI,IAAI,OAAO,SAAS,CAAC,KAAK,EAAE;IAC9E;EACH;EAEA,MAAM,eAAe,KAAa,UAA+C;AAC9E,WAAO,KAAK,MAAgB,KAAK,GAAG,cAAc;MAC/C,QAAQ;MACR,MAAM,KAAK,UAAU,QAAQ;IAChC,CAAC;EACJ;EAEA,MAAM,eACH,KACA,IACA,UACkB;AAClB,WAAO,KAAK,MAAgB,KAAK,GAAG,cAAc,EAAE,IAAI;MACrD,QAAQ;MACR,MAAM,KAAK,UAAU,QAAQ;IAChC,CAAC;EACJ;EAEA,MAAM,eAAe,KAAa,IAA2B;AAC1D,WAAO,KAAK,MAAM,KAAK,GAAG,cAAc,EAAE,IAAI;MAC3C,QAAQ;IACX,CAAC;EACJ;;EAGA,MAAM,qBAAqB,KAAa,YAAiD;AACtF,WAAO,KAAK,MAA0B,KAAK,GAAG,cAAc,UAAU,YAAY;EACrF;EAEA,MAAM,uBACH,KACA,YACA,UAC0B;AAC1B,WAAO,KAAK,MAAwB,KAAK,GAAG,cAAc,UAAU,cAAc;MAC/E,QAAQ;MACR,MAAM,KAAK,UAAU,QAAQ;IAChC,CAAC;EACJ;EAEA,MAAM,uBACH,KACA,YACA,YACA,UAC0B;AAC1B,WAAO,KAAK;MACT,KAAK,GAAG,cAAc,UAAU,cAAc,UAAU;MACxD;QACG,QAAQ;QACR,MAAM,KAAK,UAAU,QAAQ;MAChC;IACH;EACH;EAEA,MAAM,uBACH,KACA,YACA,YACc;AACd,WAAO,KAAK,MAAM,KAAK,GAAG,cAAc,UAAU,cAAc,UAAU,IAAI;MAC3E,QAAQ;IACX,CAAC;EACJ;;EAGA,MAAM,kBACH,KACA,YACA,OAC8B;AAC9B,WAAO,KAAK,MAA4B,KAAK,GAAG,cAAc,UAAU,iBAAiB;MACtF,QAAQ;MACR,MAAM,KAAK,UAAU,KAAK;IAC7B,CAAC;EACJ;EAEA,MAAM,kBACH,KACA,YACA,SACgC;AAChC,WAAO,KAAK;MACT,KAAK,GAAG,cAAc,UAAU;MAChC;QACG,QAAQ;QACR,MAAM,KAAK,UAAU,OAAO;MAC/B;IACH;EACH;;EAGA,MAAM,kBACH,KACA,UAAqC,CAAC,GACI;AAC1C,UAAM,SAAS,IAAI,gBAAgB;AACnC,QAAI,QAAQ,WAAY,QAAO,OAAO,cAAc,QAAQ,WAAW,SAAS,CAAC;AACjF,QAAI,QAAQ,UAAW,QAAO,OAAO,aAAa,QAAQ,SAAS;AACnE,QAAI,QAAQ,QAAS,QAAO,OAAO,WAAW,QAAQ,OAAO;AAC7D,QAAI,QAAQ,OAAQ,QAAO,OAAO,UAAU,QAAQ,MAAM;AAC1D,QAAI,QAAQ,SAAU,QAAO,OAAO,YAAY,QAAQ,SAAS,SAAS,CAAC;AAC3E,QAAI,QAAQ,MAAO,QAAO,OAAO,SAAS,QAAQ,MAAM,SAAS,CAAC;AAClE,QAAI,QAAQ,OAAQ,QAAO,OAAO,UAAU,QAAQ,OAAO,SAAS,CAAC;AAErE,WAAO,KAAK;MACT,KAAK,GAAG,mBAAmB,OAAO,SAAS,IAAI,IAAI,OAAO,SAAS,CAAC,KAAK,EAAE;IAC9E;EACH;EAEA,MAAM,iBAAiB,KAAa,SAAyC;AAC1E,WAAO,KAAK,MAAqB,KAAK,GAAG,oBAAoB,OAAO,EAAE;EACzE;EAEA,MAAM,oBAAoB,KAAa,OAAsD;AAC1F,WAAO,KAAK,MAAqB,KAAK,GAAG,oBAAoB;MAC1D,QAAQ;MACR,MAAM,KAAK,UAAU,KAAK;IAC7B,CAAC;EACJ;EAEA,MAAM,oBACH,KACA,SACA,OACuB;AACvB,WAAO,KAAK,MAAqB,KAAK,GAAG,oBAAoB,OAAO,IAAI;MACrE,QAAQ;MACR,MAAM,KAAK,UAAU,KAAK;IAC7B,CAAC;EACJ;EAEA,MAAM,oBACH,KACA,SACA,QACuB;AACvB,WAAO,KAAK,MAAqB,KAAK,GAAG,oBAAoB,OAAO,WAAW;MAC5E,QAAQ;MACR,MAAM,KAAK,UAAU,EAAE,oBAAoB,OAAO,CAAC;IACtD,CAAC;EACJ;EAEA,MAAM,oBAAoB,KAAa,SAAgC;AACpE,WAAO,KAAK,MAAM,KAAK,GAAG,oBAAoB,OAAO,IAAI;MACtD,QAAQ;IACX,CAAC;EACJ;;EAGA,MAAM,oBACH,KACA,SACA,YACA,QACc;AACd,WAAO,KAAK,MAAM,KAAK,GAAG,oBAAoB,OAAO,cAAc,UAAU,IAAI;MAC9E,QAAQ;MACR,MAAM,KAAK,UAAU,MAAM;IAC9B,CAAC;EACJ;;EAGA,MAAM,cAAc,KAA4D;AAC7E,WAAO,KAAK,MAA4C,KAAK,GAAG,uBAAuB;EAC1F;EAEA,MAAM,aAAa,KAAa,IAAwC;AACrE,WAAO,KAAK,MAAyB,KAAK,GAAG,yBAAyB,EAAE,EAAE;EAC7E;EAEA,MAAM,gBACH,KACA,WAC2B;AAC3B,WAAO,KAAK,MAAyB,KAAK,GAAG,yBAAyB;MACnE,QAAQ;MACR,MAAM,KAAK,UAAU,SAAS;IACjC,CAAC;EACJ;EAEA,MAAM,gBACH,KACA,IACA,WAC2B;AAC3B,WAAO,KAAK,MAAyB,KAAK,GAAG,yBAAyB,EAAE,IAAI;MACzE,QAAQ;MACR,MAAM,KAAK,UAAU,SAAS;IACjC,CAAC;EACJ;EAEA,MAAM,gBAAgB,KAAa,IAA2B;AAC3D,WAAO,KAAK,MAAM,KAAK,GAAG,yBAAyB,EAAE,IAAI;MACtD,QAAQ;IACX,CAAC;EACJ;;EAGA,MAAM,kBACH,KACA,YACA,aAAsB,OACS;AAC/B,WAAO,KAAK,MAA6B,KAAK,GAAG,cAAc,UAAU,eAAe;MACrF,QAAQ;MACR,MAAM,KAAK,UAAU,EAAE,WAAW,CAAC;IACtC,CAAC;EACJ;EAEA,MAAM,gBACH,KACA,YAC+C;AAC/C,WAAO,KAAK;MACT,KAAK,GAAG,cAAc,UAAU;MAChC;QACG,QAAQ;MACX;IACH;EACH;EAEA,MAAM,eAAe,KAAa,YAAkD;AACjF,WAAO,KAAK,MAA2B,KAAK,GAAG,cAAc,UAAU,WAAW;EACrF;;EAGA,MAAM,oBAAoB,KAA4C;AACnE,WAAO,KAAK,MAA4B,KAAK,GAAG,wBAAwB;EAC3E;EAEA,MAAM,wBACH,KACiF;AACjF,WAAO,KAAK;MACT,KAAK,GAAG;IACX;EACH;EAEA,MAAM,qBACH,KACA,YACA,SAC8B;AAC9B,WAAO,KAAK,MAA4B,KAAK,GAAG,cAAc,UAAU,gBAAgB;MACrF,QAAQ;MACR,MAAM,KAAK,UAAU,OAAO;IAC/B,CAAC;EACJ;EAEA,MAAM,yBACH,KACA,YACgC;AAChC,WAAO,KAAK,MAA8B,KAAK,GAAG,cAAc,UAAU,gBAAgB;MACvF,QAAQ;IACX,CAAC;EACJ;EAEA,MAAM,uBAAuB,KAAa,YAAmD;AAC1F,WAAO,KAAK,MAA4B,KAAK,GAAG,cAAc,UAAU,gBAAgB;MACrF,QAAQ;IACX,CAAC;EACJ;AACH;ACrTO,IAAM,WAAN,cAAuB,cAAc;EACzC,MAAM,aAAa,KAAa,SAA6D;AAC1F,WAAO,KAAK,MAA4B,KAAK,GAAG,SAAS;MACtD,QAAQ;MACR,MAAM,KAAK,UAAU,OAAO;IAC/B,CAAC;EACJ;EAEA,MAAM,cAAc,KAA0C;AAC3D,WAAO,KAAK,MAA0B,KAAK,GAAG,cAAc;EAC/D;EAEA,MAAM,iBAAiB,KAAa,QAAgD;AACjF,WAAO,KAAK,MAA6B,KAAK,GAAG,oBAAoB,MAAM,iBAAiB;EAC/F;AACH;ACNO,IAAM,WAAN,cAAuB,cAAc;;;;;EAKjC,sBACL,SACA,oBAA6B,MACb;AAChB,UAAM,SAAS,IAAI,gBAAgB;AAEnC,QAAI,QAAQ,OAAQ,QAAO,OAAO,UAAU,QAAQ,MAAM;AAC1D,QAAI,QAAQ,UAAW,QAAO,OAAO,aAAa,QAAQ,SAAS;AAEnE,QAAI,mBAAmB;AACpB,UAAI,QAAQ,KAAM,QAAO,OAAO,QAAQ,QAAQ,KAAK,SAAS,CAAC;AAC/D,UAAI,QAAQ,SAAU,QAAO,OAAO,YAAY,QAAQ,SAAS,SAAS,CAAC;IAC9E;AAEA,QAAI,QAAQ,SAAS,OAAW,QAAO,OAAO,QAAQ,QAAQ,KAAK,SAAS,CAAC;AAC7E,QAAI,QAAQ,kBAAkB;AAC3B,aAAO,OAAO,iBAAiB,QAAQ,cAAc,SAAS,CAAC;AAClE,QAAI,QAAQ,WAAW,OAAW,QAAO,OAAO,UAAU,QAAQ,OAAO,SAAS,CAAC;AACnF,QAAI,QAAQ,aAAa,OAAW,QAAO,OAAO,YAAY,QAAQ,SAAS,SAAS,CAAC;AACzF,QAAI,QAAQ,QAAS,QAAO,OAAO,WAAW,QAAQ,OAAO;AAG7D,UAAM,WAAW,QAAQ,YAAY;AACrC,WAAO,OAAO,YAAY,QAAQ;AAElC,QAAI,QAAQ,aAAa,OAAW,QAAO,OAAO,YAAY,QAAQ,SAAS,SAAS,CAAC;AACzF,QAAI,QAAQ,sBAAsB;AAC/B,aAAO,OAAO,qBAAqB,QAAQ,kBAAkB,SAAS,CAAC;AAC1E,QAAI,QAAQ,OAAQ,QAAO,OAAO,UAAU,QAAQ,MAAM;AAC1D,QAAI,QAAQ,WAAW,OAAW,QAAO,OAAO,UAAU,QAAQ,OAAO,SAAS,CAAC;AACnF,QAAI,QAAQ,gBAAgB;AACzB,aAAO,OAAO,eAAe,QAAQ,YAAY,SAAS,CAAC;AAC9D,QAAI,QAAQ,WAAW,QAAQ,QAAQ,SAAS,GAAG;AAChD,aAAO,OAAO,WAAW,KAAK,UAAU,QAAQ,OAAO,CAAC;IAC3D;AAEA,WAAO;EACV;EAEA,MAAM,SAAS,KAAa,UAA2B,CAAC,GAAqC;AAC1F,UAAM,SAAS,KAAK,sBAAsB,SAAS,IAAI;AACvD,UAAM,cAAc,OAAO,SAAS;AACpC,WAAO,KAAK;MACT,KAAK,GAAG,SAAS,cAAc,IAAI,WAAW,KAAK,EAAE;IACxD;EACH;EAEA,MAAM,YAAY,KAAa,UAA2B,CAAC,GAAkB;AAC1E,UAAM,SAAS,KAAK,sBAAsB,SAAS,KAAK;AACxD,UAAM,cAAc,OAAO,SAAS;AACpC,UAAM,WAAW,MAAM,KAAK;MACzB,KAAK,GAAG,gBAAgB,cAAc,IAAI,WAAW,KAAK,EAAE;IAC/D;AACA,WAAO,SAAS,KAAK;EACxB;EAEA,MAAM,WAAW,KAAa,QAAgB,SAAkB,SAAwB;AACrF,UAAM,WAAW,MAAM,KAAK,SAAS,KAAK,GAAG,UAAU,MAAM,kBAAkB,MAAM,EAAE;AACvF,WAAO,SAAS,KAAK;EACxB;EAEA,MAAM,QAAQ,KAAa,IAA2B;AACnD,WAAO,KAAK,MAAY,KAAK,GAAG,UAAU,EAAE,EAAE;EACjD;EAEA,MAAM,kBAAkB,KAAa,QAAyC;AAC3E,WAAO,KAAK,MAAsB,KAAK,GAAG,UAAU,MAAM,cAAc;EAC3E;EAEA,MAAM,aAAa,KAAa,QAAgD;AAC7E,WAAO,KAAK,MAA6B,KAAK,GAAG,UAAU,MAAM,QAAQ;EAC5E;EAEA,MAAM,cACH,KACA,QAC8D;AAC9D,WAAO,KAAK;MACT,KAAK,GAAG,UAAU,MAAM;IAC3B;EACH;EAEA,MAAM,sBAAsB,KAAgC;AACzD,WAAO,KAAK,MAAgB,KAAK,GAAG,uBAAuB;EAC9D;EAEA,MAAM,2BACH,KACA,SAaA;AACA,UAAM,SAAS,IAAI,gBAAgB;AACnC,QAAI,SAAS,aAAa,OAAW,QAAO,OAAO,YAAY,QAAQ,SAAS,SAAS,CAAC;AAC1F,QAAI,SAAS,WAAW,OAAW,QAAO,OAAO,UAAU,QAAQ,OAAO,SAAS,CAAC;AAEpF,UAAM,cAAc,OAAO,SAAS;AACpC,WAAO,KAAK;MACT,KAAK,GAAG,8BAA8B,cAAc,IAAI,WAAW,KAAK,EAAE;IAC7E;EACH;EAEA,MAAM,YAAY,KAAa,IAA2B;AACvD,WAAO,KAAK,MAAM,KAAK,GAAG,UAAU,EAAE,YAAY;MAC/C,QAAQ;IACX,CAAC;EACJ;EAEA,MAAM,cAAc,KAAa,IAA2B;AACzD,WAAO,KAAK,MAAM,KAAK,GAAG,UAAU,EAAE,cAAc;MACjD,QAAQ;IACX,CAAC;EACJ;EAEA,MAAM,WAAW,KAAa,MAAmC;AAC9D,WAAO,KAAK,MAAY,KAAK,GAAG,UAAU;MACvC,QAAQ;MACR,MAAM,KAAK,UAAU,IAAI;IAC5B,CAAC;EACJ;EAEA,MAAM,WAAW,KAAa,IAAY,QAAgC;AACvE,WAAO,KAAK,MAAM,KAAK,GAAG,UAAU,EAAE,IAAI;MACvC,QAAQ;MACR,MAAM,SAAS,KAAK,UAAU,EAAE,OAAO,CAAC,IAAI;IAC/C,CAAC;EACJ;EAEA,MAAM,WAAW,KAAa,IAAY,MAA4C;AACnF,WAAO,KAAK,MAAY,KAAK,GAAG,UAAU,EAAE,IAAI;MAC7C,QAAQ;MACR,MAAM,KAAK,UAAU,IAAI;IAC5B,CAAC;EACJ;EAEA,MAAM,eACH,KACA,IACA,OACwC;AACxC,WAAO,KAAK,MAAsC,KAAK,GAAG,UAAU,EAAE,SAAS;MAC5E,QAAQ;MACR,MAAM,KAAK,UAAU,EAAE,MAAM,CAAC;IACjC,CAAC;EACJ;EAEA,MAAM,wBACH,KACA,IACA,eACgD;AAChD,WAAO,KAAK;MACT,KAAK,GAAG,UAAU,EAAE;MACpB;QACG,QAAQ;QACR,MAAM,KAAK,UAAU,EAAE,cAAc,CAAC;MACzC;IACH;EACH;EAEA,MAAM,cAAc,KAAa,IAAY,cAAuC;AACjF,UAAM,SAAS,IAAI,gBAAgB;AACnC,QAAI,iBAAiB,QAAW;AAC7B,aAAO,OAAO,iBAAiB,aAAa,SAAS,CAAC;IACzD;AACA,WAAO,KAAK;MACT,KAAK,GAAG,UAAU,EAAE,aAAa,OAAO,SAAS,IAAI,IAAI,OAAO,SAAS,CAAC,KAAK,EAAE;MACjF;QACG,QAAQ;MACX;IACH;EACH;EAEA,MAAM,gBACH,KACA,IACA,OACA,QACuB;AACvB,UAAM,SAAS,IAAI,gBAAgB;AACnC,QAAI,MAAO,QAAO,OAAO,SAAS,MAAM,SAAS,CAAC;AAClD,QAAI,OAAQ,QAAO,OAAO,UAAU,OAAO,SAAS,CAAC;AACrD,WAAO,KAAK;MACT,KAAK,GAAG,UAAU,EAAE,YAAY,OAAO,SAAS,IAAI,IAAI,OAAO,SAAS,CAAC,KAAK,EAAE;IACnF;EACH;EAEA,MAAM,wBACH,KACA,QACA,QACA,QAAgB,KAChB,SAAiB,GACM;AACvB,UAAM,SAAS,IAAI,gBAAgB;AACnC,WAAO,OAAO,SAAS,MAAM,SAAS,CAAC;AACvC,WAAO,OAAO,UAAU,OAAO,SAAS,CAAC;AACzC,WAAO,KAAK;MACT,KAAK,GAAG,UAAU,MAAM,eAAe,MAAM,aAAa,OAAO,SAAS,CAAC;IAC9E;EACH;EAEA,MAAM,aAAa,KAAa,QAAwC;AACrE,WAAO,KAAK,MAAqB,KAAK,GAAG,UAAU,MAAM,QAAQ;EACpE;EAEA,MAAM,qBACH,KACA,QACA,eAC8B;AAC9B,WAAO,KAAK,MAAM,KAAK,GAAG,UAAU,MAAM,kBAAkB;MACzD,QAAQ;MACR,MAAM,KAAK,UAAU,EAAE,eAAe,OAAO,CAAC;IACjD,CAAC;EACJ;EAEA,MAAM,qBACH,KACA,QACA,SACA,WAgBA;AACA,WAAO,KAAK,MAAM,KAAK,GAAG,UAAU,MAAM,2BAA2B;MAClE,QAAQ;MACR,MAAM,KAAK,UAAU;QAClB;QACA,YAAY;MACf,CAAC;IACJ,CAAC;EACJ;EAEA,MAAM,YACH,KACA,QACA,aACA,QAC6C;AAC7C,WAAO,KAAK;MACT,KAAK,GAAG,UAAU,MAAM,aAAa,WAAW;MAChD;QACG,QAAQ;QACR,MAAM,KAAK,UAAU,EAAE,OAAO,CAAC;MAClC;IACH;EACH;;;;;EAMA,MAAM,mBAAmB,KAAa,UAAiC;AACpE,WAAO,KAAK,MAAY,KAAK,GAAG,aAAa;MAC1C,QAAQ;MACR,MAAM,KAAK,UAAU,EAAE,SAAS,CAAC;IACpC,CAAC;EACJ;;;;EAKA,MAAM,gBAAgB,KAAa,QAAgB,SAAuC;AACvF,WAAO,KAAK,MAAmB,KAAK,GAAG,UAAU,MAAM,aAAa;MACjE,QAAQ;MACR,MAAM,KAAK,UAAU,EAAE,QAAQ,CAAC;IACnC,CAAC;EACJ;EAEA,MAAM,uBACH,KACA,QAOD;AACC,WAAO,KAAK,MAAM,KAAK,GAAG,UAAU,MAAM,mBAAmB;EAChE;;EAGA,MAAM,qBACH,KACA,QACA,MAsBA;AACA,WAAO,KAAK,MAAM,KAAK,GAAG,aAAa,MAAM,kCAAkC;MAC5E,QAAQ;MACR,MAAM,KAAK,UAAU;QAClB,OAAO,KAAK,SAAS;QACrB,UAAU,KAAK;MAClB,CAAC;IACJ,CAAC;EACJ;;EAGA,MAAM,cAAc,KAAmC;AACpD,WAAO,KAAK,MAAmB,KAAK,GAAG,cAAc;EACxD;EAEA,MAAM,aAAa,KAAa,IAAgC;AAC7D,WAAO,KAAK,MAAiB,KAAK,GAAG,gBAAgB,EAAE,EAAE;EAC5D;EAEA,MAAM,mBAAmB,KAAa,MAAkC;AACrE,WAAO,KAAK,MAAiB,KAAK,GAAG,gBAAgB,IAAI,EAAE;EAC9D;EAEA,MAAM,gBAAgB,KAAa,OAA8C;AAC9E,WAAO,KAAK,MAAiB,KAAK,GAAG,gBAAgB;MAClD,QAAQ;MACR,MAAM,KAAK,UAAU,KAAK;IAC7B,CAAC;EACJ;EAEA,MAAM,gBACH,KACA,IACA,OACmB;AACnB,WAAO,KAAK,MAAiB,KAAK,GAAG,gBAAgB,EAAE,IAAI;MACxD,QAAQ;MACR,MAAM,KAAK,UAAU,KAAK;IAC7B,CAAC;EACJ;EAEA,MAAM,gBAAgB,KAAa,IAA2B;AAC3D,WAAO,KAAK,MAAY,KAAK,GAAG,gBAAgB,EAAE,IAAI;MACnD,QAAQ;IACX,CAAC;EACJ;;EAGA,MAAM,eAAe,KAAoC;AACtD,WAAO,KAAK,MAAoB,KAAK,GAAG,eAAe;EAC1D;EAEA,MAAM,cAAc,KAAa,IAAiC;AAC/D,WAAO,KAAK,MAAkB,KAAK,GAAG,iBAAiB,EAAE,EAAE;EAC9D;EAEA,MAAM,oBAAoB,KAAa,MAAmC;AACvE,WAAO,KAAK,MAAkB,KAAK,GAAG,yBAAyB,IAAI,EAAE;EACxE;EAEA,MAAM,iBAAiB,KAAa,QAAiD;AAClF,WAAO,KAAK,MAAkB,KAAK,GAAG,iBAAiB;MACpD,QAAQ;MACR,MAAM,KAAK,UAAU,MAAM;IAC9B,CAAC;EACJ;EAEA,MAAM,iBACH,KACA,IACA,QACoB;AACpB,WAAO,KAAK,MAAkB,KAAK,GAAG,iBAAiB,EAAE,IAAI;MAC1D,QAAQ;MACR,MAAM,KAAK,UAAU,MAAM;IAC9B,CAAC;EACJ;EAEA,MAAM,iBAAiB,KAAa,IAA2B;AAC5D,WAAO,KAAK,MAAY,KAAK,GAAG,iBAAiB,EAAE,IAAI;MACpD,QAAQ;IACX,CAAC;EACJ;AACH;AC3aO,IAAM,oBAAN,cAAgC,cAAc;;;;EAIlD,MAAM,kBAAkB,KAAuC;AAC5D,WAAO,KAAK,MAAuB,KAAK,GAAG,kBAAkB;EAChE;;;;EAKA,MAAM,iBAAiB,KAAa,WAA2C;AAC5E,WAAO,KAAK,MAAqB,KAAK,GAAG,oBAAoB,SAAS,EAAE;EAC3E;;;;EAKA,MAAM,oBAAoB,KAAa,MAAqD;AACzF,WAAO,KAAK,MAAqB,KAAK,GAAG,oBAAoB;MAC1D,QAAQ;MACR,MAAM,KAAK,UAAU,IAAI;IAC5B,CAAC;EACJ;;;;EAKA,MAAM,oBACH,KACA,WACA,MACuB;AACvB,WAAO,KAAK,MAAqB,KAAK,GAAG,oBAAoB,SAAS,IAAI;MACvE,QAAQ;MACR,MAAM,KAAK,UAAU,IAAI;IAC5B,CAAC;EACJ;;;;EAKA,MAAM,oBAAoB,KAAa,WAAgD;AACpF,WAAO,KAAK,MAA0B,KAAK,GAAG,oBAAoB,SAAS,IAAI;MAC5E,QAAQ;IACX,CAAC;EACJ;;;;EAKA,MAAM,oBAAoB,KAAa,WAA2C;AAC/E,WAAO,KAAK,MAAqB,KAAK,GAAG,oBAAoB,SAAS,WAAW;MAC9E,QAAQ;IACX,CAAC;EACJ;;;;EAKA,MAAM,qBAAqB,KAAa,WAA2C;AAChF,WAAO,KAAK,MAAqB,KAAK,GAAG,oBAAoB,SAAS,YAAY;MAC/E,QAAQ;IACX,CAAC;EACJ;;;;EAKA,MAAM,iBACH,KACA,WACA,MACoB;AACpB,WAAO,KAAK,MAAkB,KAAK,GAAG,oBAAoB,SAAS,UAAU;MAC1E,QAAQ;MACR,MAAM,KAAK,UAAU,IAAI;IAC5B,CAAC;EACJ;;;;EAKA,MAAM,iBACH,KACA,WACA,QACA,MACoB;AACpB,WAAO,KAAK,MAAkB,KAAK,GAAG,oBAAoB,SAAS,UAAU,MAAM,IAAI;MACpF,QAAQ;MACR,MAAM,KAAK,UAAU,IAAI;IAC5B,CAAC;EACJ;;;;EAKA,MAAM,iBACH,KACA,WACA,QAC4B;AAC5B,WAAO,KAAK;MACT,KAAK,GAAG,oBAAoB,SAAS,UAAU,MAAM;MACrD;QACG,QAAQ;MACX;IACH;EACH;AACH;AC9GO,IAAM,eAAN,cAA2B,cAAc;EAC7C,MAAM,aAAa,KAAa,SAAuD;AACpF,UAAM,SAAS,IAAI,gBAAgB;AACnC,QAAI,SAAS,aAAa,QAAW;AAClC,aAAO,OAAO,YAAY,QAAQ,SAAS,SAAS,CAAC;IACxD;AACA,UAAM,cAAc,OAAO,SAAS;AACpC,WAAO,KAAK,MAAkB,KAAK,GAAG,cAAc,cAAc,IAAI,WAAW,KAAK,EAAE,EAAE;EAC7F;EAEA,MAAM,YAAY,KAAa,IAA+B;AAC3D,WAAO,KAAK,MAAgB,KAAK,GAAG,eAAe,EAAE,EAAE;EAC1D;EAEA,MAAM,kBAAkB,KAAa,MAAiC;AACnE,WAAO,KAAK,MAAgB,KAAK,GAAG,oBAAoB,IAAI,EAAE;EACjE;EAEA,MAAM,eAAe,KAAa,UAA+C;AAC9E,WAAO,KAAK,MAAgB,KAAK,GAAG,eAAe;MAChD,QAAQ;MACR,MAAM,KAAK,UAAU,QAAQ;IAChC,CAAC;EACJ;EAEA,MAAM,eACH,KACA,IACA,UACkB;AAClB,WAAO,KAAK,MAAgB,KAAK,GAAG,eAAe,EAAE,IAAI;MACtD,QAAQ;MACR,MAAM,KAAK,UAAU,QAAQ;IAChC,CAAC;EACJ;EAEA,MAAM,eAAe,KAAa,IAA2B;AAC1D,WAAO,KAAK,MAAM,KAAK,GAAG,eAAe,EAAE,IAAI;MAC5C,QAAQ;IACX,CAAC;EACJ;EAEA,MAAM,gBAAgB,KAAa,IAAyC;AACzE,WAAO,KAAK,MAA0B,KAAK,GAAG,eAAe,EAAE,YAAY;MACxE,QAAQ;IACX,CAAC;EACJ;EAEA,MAAM,kBAAkB,KAAa,IAAyC;AAC3E,WAAO,KAAK,MAA0B,KAAK,GAAG,eAAe,EAAE,cAAc;MAC1E,QAAQ;IACX,CAAC;EACJ;EAEA,MAAM,cACH,KACA,IACA,MACkB;AAClB,WAAO,KAAK,MAAgB,KAAK,GAAG,eAAe,EAAE,UAAU;MAC5D,QAAQ;MACR,MAAM,KAAK,UAAU,IAAI;IAC5B,CAAC;EACJ;EAEA,MAAM,eACH,KACA,YACA,SAOsC;AACtC,UAAM,SAAS,IAAI,gBAAgB;AACnC,QAAI,SAAS,SAAU,QAAO,OAAO,aAAa,QAAQ,SAAS,SAAS,CAAC;AAC7E,QAAI,SAAS,OAAQ,QAAO,OAAO,UAAU,QAAQ,MAAM;AAC3D,QAAI,SAAS,YAAa,QAAO,OAAO,gBAAgB,QAAQ,WAAW;AAC3E,QAAI,SAAS,KAAM,QAAO,OAAO,QAAQ,QAAQ,KAAK,SAAS,CAAC;AAChE,QAAI,SAAS,SAAU,QAAO,OAAO,aAAa,QAAQ,SAAS,SAAS,CAAC;AAE7E,WAAO,KAAK;MACT,KAAK,GAAG,eAAe,UAAU,WAAW,QAAQ,SAAS,IAAI,IAAI,OAAO,SAAS,CAAC,KAAK,EAAE;IAChG;EACH;EAEA,MAAM,cAAc,KAAa,UAAuC;AACrE,WAAO,KAAK,MAAkB,KAAK,GAAG,uBAAuB,QAAQ,EAAE;EAC1E;EAEA,MAAM,iBACH,KACA,YACA,QACoB;AACpB,WAAO,KAAK,MAAkB,KAAK,GAAG,eAAe,UAAU,YAAY;MACxE,QAAQ;MACR,MAAM,KAAK,UAAU,MAAM;IAC9B,CAAC;EACJ;EAEA,MAAM,iBACH,KACA,YACA,UACA,QACoB;AACpB,WAAO,KAAK,MAAkB,KAAK,GAAG,eAAe,UAAU,YAAY,QAAQ,IAAI;MACpF,QAAQ;MACR,MAAM,KAAK,UAAU,MAAM;IAC9B,CAAC;EACJ;EAEA,MAAM,iBAAiB,KAAa,YAAoB,UAAiC;AACtF,WAAO,KAAK,MAAM,KAAK,GAAG,eAAe,UAAU,YAAY,QAAQ,IAAI;MACxE,QAAQ;IACX,CAAC;EACJ;EAEA,MAAM,qBACH,KACA,YACA,UAC4B;AAC5B,WAAO,KAAK;MACT,KAAK,GAAG,eAAe,UAAU,YAAY,QAAQ;IACxD;EACH;;EAGA,MAAM,iBACH,KACA,YACA,YACA,MAGoB;AACpB,WAAO,KAAK,MAAkB,KAAK,GAAG,eAAe,UAAU,WAAW,UAAU,IAAI;MACrF,QAAQ;MACR,MAAM,KAAK,UAAU;QAClB;QACA,aAAa,KAAK;MACrB,CAAC;IACJ,CAAC;EACJ;;EAGA,MAAM,iBACH,KACA,YACA,WACA,aACmE;AACnE,WAAO,KAAK,MAAM,KAAK,GAAG,eAAe,UAAU,WAAW,SAAS,iBAAiB;MACrF,QAAQ;MACR,MAAM,KAAK,UAAU,EAAE,YAAyB,CAAC;IACpD,CAAC;EACJ;;EAGA,MAAM,oBACH,KACA,YACA,WAMA;AACA,WAAO,KAAK,MAAM,KAAK,GAAG,eAAe,UAAU,WAAW,SAAS,eAAe;EACzF;;;;;EAMA,MAAM,qBACH,KACA,MACA,WACwD;AACxD,WAAO,KAAK,MAAM,KAAK,GAAG,6BAA6B;MACpD,QAAQ;MACR,MAAM,KAAK,UAAU,EAAE,MAAM,UAAU,CAAC;IAC3C,CAAC;EACJ;;;;;EAMA,MAAM,sBACH,KACA,UAC4C;AAC5C,WAAO,KAAK,MAAM,KAAK,GAAG,8CAA8C,QAAQ,EAAE;EACrF;AACH;ACrMO,IAAM,iBAAN,cAA6B,cAAc;;;;EAI/C,MAAM,eACH,KACA,UAMI,CAAC,GACkC;AACvC,UAAM,SAAS,IAAI,gBAAgB;AACnC,QAAI,QAAQ,KAAM,QAAO,OAAO,QAAQ,QAAQ,KAAK,SAAS,CAAC;AAC/D,QAAI,QAAQ,SAAU,QAAO,OAAO,YAAY,QAAQ,SAAS,SAAS,CAAC;AAC3E,QAAI,QAAQ,OAAQ,QAAO,OAAO,UAAU,QAAQ,MAAM;AAC1D,QAAI,QAAQ,UAAW,QAAO,OAAO,aAAa,QAAQ,SAAS;AACnE,QAAI,QAAQ,OAAQ,QAAO,OAAO,UAAU,QAAQ,MAAM;AAE1D,WAAO,KAAK;MACT,KAAK,GAAG,gCAAgC,OAAO,SAAS,IAAI,IAAI,OAAO,SAAS,CAAC,KAAK,EAAE;IAC3F;EACH;;;;EAKA,MAAM,cAAc,KAAa,OAAoC;AAClE,WAAO,KAAK,MAAkB,KAAK,GAAG,iCAAiC,KAAK,EAAE;EACjF;;;;EAKA,MAAM,oBAAoB,KAAa,MAAmC;AACvE,WAAO,KAAK,MAAkB,KAAK,GAAG,sCAAsC,IAAI,EAAE;EACrF;;;;EAKA,MAAM,iBAAiB,KAAa,MAAoD;AACrF,WAAO,KAAK,MAAkB,KAAK,GAAG,iCAAiC;MACpE,QAAQ;MACR,MAAM,KAAK,UAAU,IAAI;IAC5B,CAAC;EACJ;;;;EAKA,MAAM,iBACH,KACA,OACA,MACoB;AACpB,WAAO,KAAK,MAAkB,KAAK,GAAG,iCAAiC,KAAK,IAAI;MAC7E,QAAQ;MACR,MAAM,KAAK,UAAU,IAAI;IAC5B,CAAC;EACJ;;;;EAKA,MAAM,iBAAiB,KAAa,OAA8B;AAC/D,WAAO,KAAK,MAAM,KAAK,GAAG,iCAAiC,KAAK,IAAI;MACjE,QAAQ;IACX,CAAC;EACJ;;;;EAKA,MAAM,sBAAsB,KAAa,OAA8B;AACpE,WAAO,KAAK,MAAM,KAAK,GAAG,iCAAiC,KAAK,sBAAsB;MACnF,QAAQ;IACX,CAAC;EACJ;;;;;EAMA,MAAM,4BACH,KACA,OACkD;AAClD,WAAO,KAAK;MACT,KAAK,GAAG,iCAAiC,KAAK;MAC9C;QACG,QAAQ;MACX;IACH;EACH;;;;EAKA,MAAM,kBACH,KACA,OACA,UAGI,CAAC,GACqC;AAC1C,UAAM,SAAS,IAAI,gBAAgB;AACnC,QAAI,QAAQ,KAAM,QAAO,OAAO,QAAQ,QAAQ,KAAK,SAAS,CAAC;AAC/D,QAAI,QAAQ,SAAU,QAAO,OAAO,YAAY,QAAQ,SAAS,SAAS,CAAC;AAE3E,WAAO,KAAK;MACT,KAAK,GAAG,iCAAiC,KAAK,WAAW,OAAO,SAAS,IAAI,IAAI,OAAO,SAAS,CAAC,KAAK,EAAE;IAC5G;EACH;;;;EAKA,MAAM,iBAAiB,KAA0C;AAC9D,WAAO,KAAK,MAA0B,KAAK,GAAG,iBAAiB;EAClE;;;;EAKA,MAAM,iBAAiB,KAAa,cAAqC;AACtE,WAAO,KAAK,MAAM,KAAK,GAAG,mBAAmB,YAAY,IAAI;MAC1D,QAAQ;IACX,CAAC;EACJ;;;;EAKA,MAAM,iBACH,KACA,OACA,UAGI,CAAC,GACoC;AACzC,UAAM,SAAS,IAAI,gBAAgB;AACnC,QAAI,QAAQ,KAAM,QAAO,OAAO,QAAQ,QAAQ,KAAK,SAAS,CAAC;AAC/D,QAAI,QAAQ,SAAU,QAAO,OAAO,YAAY,QAAQ,SAAS,SAAS,CAAC;AAE3E,WAAO,KAAK;MACT,KAAK,GAAG,iCAAiC,KAAK,UAAU,OAAO,SAAS,IAAI,IAAI,OAAO,SAAS,CAAC,KAAK,EAAE;IAC3G;EACH;;;;EAKA,MAAM,sBACH,KACA,OACA,UAGI,CAAC,GACyC;AAC9C,UAAM,SAAS,IAAI,gBAAgB;AACnC,QAAI,QAAQ,KAAM,QAAO,OAAO,QAAQ,QAAQ,KAAK,SAAS,CAAC;AAC/D,QAAI,QAAQ,SAAU,QAAO,OAAO,YAAY,QAAQ,SAAS,SAAS,CAAC;AAE3E,WAAO,KAAK;MACT,KAAK,GAAG,iCAAiC,KAAK,YAAY,OAAO,SAAS,IAAI,IAAI,OAAO,SAAS,CAAC,KAAK,EAAE;IAC7G;EACH;AACH;AC9KO,IAAM,eAAN,cAA2B,cAAc;;;;EAI7C,MAAM,aACH,KACA,UAMI,CAAC,GACgC;AACrC,UAAM,SAAS,IAAI,gBAAgB;AACnC,QAAI,QAAQ,KAAM,QAAO,OAAO,QAAQ,QAAQ,KAAK,SAAS,CAAC;AAC/D,QAAI,QAAQ,SAAU,QAAO,OAAO,YAAY,QAAQ,SAAS,SAAS,CAAC;AAC3E,QAAI,QAAQ,OAAQ,QAAO,OAAO,UAAU,QAAQ,MAAM;AAC1D,QAAI,QAAQ,UAAW,QAAO,OAAO,aAAa,QAAQ,SAAS;AACnE,QAAI,QAAQ,OAAQ,QAAO,OAAO,UAAU,QAAQ,MAAM;AAE1D,WAAO,KAAK;MACT,KAAK,GAAG,8BAA8B,OAAO,SAAS,IAAI,IAAI,OAAO,SAAS,CAAC,KAAK,EAAE;IACzF;EACH;;;;EAKA,MAAM,YAAY,KAAa,OAAkC;AAC9D,WAAO,KAAK,MAAgB,KAAK,GAAG,+BAA+B,KAAK,EAAE;EAC7E;;;;EAKA,MAAM,eAAe,KAAa,MAAgD;AAC/E,WAAO,KAAK,MAAgB,KAAK,GAAG,+BAA+B;MAChE,QAAQ;MACR,MAAM,KAAK,UAAU,IAAI;IAC5B,CAAC;EACJ;;;;EAKA,MAAM,eACH,KACA,OACA,MACkB;AAClB,WAAO,KAAK,MAAgB,KAAK,GAAG,+BAA+B,KAAK,IAAI;MACzE,QAAQ;MACR,MAAM,KAAK,UAAU,IAAI;IAC5B,CAAC;EACJ;;;;EAKA,MAAM,eAAe,KAAa,OAA8B;AAC7D,WAAO,KAAK,MAAM,KAAK,GAAG,+BAA+B,KAAK,IAAI;MAC/D,QAAQ;IACX,CAAC;EACJ;;;;EAKA,MAAM,gBACH,KACA,OACA,UAGI,CAAC,GACmC;AACxC,UAAM,SAAS,IAAI,gBAAgB;AACnC,QAAI,QAAQ,KAAM,QAAO,OAAO,QAAQ,QAAQ,KAAK,SAAS,CAAC;AAC/D,QAAI,QAAQ,SAAU,QAAO,OAAO,YAAY,QAAQ,SAAS,SAAS,CAAC;AAE3E,WAAO,KAAK;MACT,KAAK,GAAG,+BAA+B,KAAK,WAAW,OAAO,SAAS,IAAI,IAAI,OAAO,SAAS,CAAC,KAAK,EAAE;IAC1G;EACH;;;;EAKA,MAAM,sBACH,KACA,OACA,UAGI,CAAC,GAC4C;AACjD,UAAM,SAAS,IAAI,gBAAgB;AACnC,QAAI,QAAQ,KAAM,QAAO,OAAO,QAAQ,QAAQ,KAAK,SAAS,CAAC;AAC/D,QAAI,QAAQ,SAAU,QAAO,OAAO,YAAY,QAAQ,SAAS,SAAS,CAAC;AAE3E,WAAO,KAAK;MACT,KAAK,GAAG,+BAA+B,KAAK,iBAAiB,OAAO,SAAS,IAAI,IAAI,OAAO,SAAS,CAAC,KAAK,EAAE;IAChH;EACH;;;;EAKA,MAAM,oBACH,KACA,OACA,UAGI,CAAC,GACoC;AACzC,UAAM,SAAS,IAAI,gBAAgB;AACnC,QAAI,QAAQ,KAAM,QAAO,OAAO,QAAQ,QAAQ,KAAK,SAAS,CAAC;AAC/D,QAAI,QAAQ,SAAU,QAAO,OAAO,YAAY,QAAQ,SAAS,SAAS,CAAC;AAE3E,WAAO,KAAK;MACT,KAAK,GAAG,+BAA+B,KAAK,YAAY,OAAO,SAAS,IAAI,IAAI,OAAO,SAAS,CAAC,KAAK,EAAE;IAC3G;EACH;AACH;AClHO,IAAM,YAAN,cAAwB,cAAc;;EAE1C,MAAM,cAAc,KAAmC;AACpD,WAAO,KAAK,MAAmB,KAAK,GAAG,cAAc;EACxD;EAEA,MAAM,oBAAoB,KAAmD;AAC1E,WAAO,KAAK,MAAmC,KAAK,GAAG,gCAAgC;EAC1F;EAEA,MAAM,iBACH,KACA,QAUqB;AACrB,UAAM,eAAe,IAAI,gBAAgB;AACzC,QAAI,OAAO,WAAY,cAAa,OAAO,cAAc,OAAO,UAAU;AAC1E,QAAI,OAAO,UAAW,cAAa,OAAO,aAAa,OAAO,SAAS;AACvE,QAAI,OAAO,WAAY,cAAa,OAAO,cAAc,OAAO,UAAU;AAC1E,QAAI,OAAO,OAAQ,cAAa,OAAO,UAAU,OAAO,OAAO,SAAS,CAAC;AACzE,QAAI,OAAO,WAAY,cAAa,OAAO,cAAc,OAAO,WAAW,SAAS,CAAC;AACrF,QAAI,OAAO;AACR,mBAAa,OAAO,oBAAoB,OAAO,iBAAiB,SAAS,CAAC;AAC7E,QAAI,OAAO,WAAY,cAAa,OAAO,cAAc,OAAO,WAAW,SAAS,CAAC;AACrF,QAAI,OAAO,gBAAiB,cAAa,OAAO,mBAAmB,MAAM;AACzE,WAAO,KAAK,MAAmB,KAAK,GAAG,uBAAuB,aAAa,SAAS,CAAC,EAAE;EAC1F;EAEA,MAAM,aAAa,KAAa,IAAgC;AAC7D,WAAO,KAAK,MAAiB,KAAK,GAAG,gBAAgB,EAAE,EAAE;EAC5D;EAEA,MAAM,gBAAgB,KAAa,MAA6C;AAC7E,WAAO,KAAK,MAAiB,KAAK,GAAG,gBAAgB;MAClD,QAAQ;MACR,MAAM,KAAK,UAAU,IAAI;IAC5B,CAAC;EACJ;EAEA,MAAM,gBACH,KACA,IACA,MACmB;AACnB,WAAO,KAAK,MAAiB,KAAK,GAAG,gBAAgB,EAAE,IAAI;MACxD,QAAQ;MACR,MAAM,KAAK,UAAU,IAAI;IAC5B,CAAC;EACJ;EAEA,MAAM,gBAAgB,KAAa,IAA2B;AAC3D,WAAO,KAAK,MAAM,KAAK,GAAG,gBAAgB,EAAE,IAAI;MAC7C,QAAQ;IACX,CAAC;EACJ;EAEA,MAAM,kBAAkB,KAAa,SAAgD;AAClF,WAAO,KAAK,MAA0B,KAAK,GAAG,wBAAwB;MACnE,QAAQ;MACR,MAAM,KAAK,UAAU,OAAO;IAC/B,CAAC;EACJ;;EAGA,MAAM,eACH,KACA,UAAkC,CAAC,GACI;AACvC,UAAM,SAAS,IAAI,gBAAgB;AACnC,QAAI,QAAQ,KAAM,QAAO,OAAO,QAAQ,QAAQ,KAAK,SAAS,CAAC;AAC/D,QAAI,QAAQ,SAAU,QAAO,OAAO,YAAY,QAAQ,SAAS,SAAS,CAAC;AAC3E,QAAI,QAAQ,OAAQ,QAAO,OAAO,UAAU,QAAQ,MAAM;AAC1D,QAAI,QAAQ,UAAW,QAAO,OAAO,aAAa,QAAQ,SAAS;AACnE,QAAI,QAAQ,UAAW,QAAO,OAAO,aAAa,QAAQ,SAAS;AACnE,QAAI,QAAQ,YAAY,OAAW,QAAO,OAAO,WAAW,QAAQ,QAAQ,SAAS,CAAC;AAEtF,WAAO,KAAK;MACT,KAAK,GAAG,gBAAgB,OAAO,SAAS,IAAI,IAAI,OAAO,SAAS,CAAC,KAAK,EAAE;IAC3E;EACH;EAEA,MAAM,kBACH,KACA,UAAqC,CAAC,GACU;AAChD,UAAM,SAAS,IAAI,gBAAgB;AACnC,QAAI,QAAQ,OAAQ,QAAO,OAAO,UAAU,QAAQ,MAAM;AAC1D,QAAI,QAAQ,SAAU,QAAO,OAAO,YAAY,QAAQ,SAAS,SAAS,CAAC;AAC3E,QAAI,QAAQ,OAAQ,QAAO,OAAO,UAAU,QAAQ,MAAM;AAC1D,QAAI,QAAQ,UAAW,QAAO,OAAO,aAAa,QAAQ,SAAS;AACnE,QAAI,QAAQ,OAAQ,QAAO,OAAO,UAAU,QAAQ,OAAO,SAAS,CAAC;AACrE,QAAI,QAAQ,OAAQ,QAAO,OAAO,UAAU,QAAQ,MAAM;AAC1D,QAAI,QAAQ,YAAa,QAAO,OAAO,eAAe,QAAQ,WAAW;AACzE,QAAI,QAAQ,WAAY,QAAO,OAAO,cAAc,QAAQ,UAAU;AACtE,QAAI,QAAQ,WAAY,QAAO,OAAO,cAAc,QAAQ,UAAU;AACtE,QAAI,QAAQ,UAAW,QAAO,OAAO,aAAa,QAAQ,SAAS;AACnE,QAAI,QAAQ,WAAY,QAAO,OAAO,cAAc,QAAQ,UAAU;AACtE,QAAI,QAAQ,WAAY,QAAO,OAAO,cAAc,QAAQ,WAAW,SAAS,CAAC;AAEjF,WAAO,KAAK;MACT,KAAK,GAAG,0BAA0B,OAAO,SAAS,IAAI,IAAI,OAAO,SAAS,CAAC,KAAK,EAAE;IACrF;EACH;;EAGA,MAAM,UACH,KACA,UAA6B,CAAC,GACI;AAClC,UAAM,SAAS,IAAI,gBAAgB;AACnC,QAAI,QAAQ,KAAM,QAAO,OAAO,QAAQ,QAAQ,KAAK,SAAS,CAAC;AAC/D,QAAI,QAAQ,SAAU,QAAO,OAAO,YAAY,QAAQ,SAAS,SAAS,CAAC;AAC3E,QAAI,QAAQ,OAAQ,QAAO,OAAO,UAAU,QAAQ,MAAM;AAC1D,QAAI,QAAQ,UAAW,QAAO,OAAO,aAAa,QAAQ,SAAS;AACnE,QAAI,QAAQ,WAAW,OAAW,QAAO,OAAO,UAAU,QAAQ,OAAO,SAAS,CAAC;AAEnF,WAAO,KAAK;MACT,KAAK,GAAG,UAAU,OAAO,SAAS,IAAI,IAAI,OAAO,SAAS,CAAC,KAAK,EAAE;IACrE;EACH;EAEA,MAAM,SAAS,KAAa,IAA4B;AACrD,WAAO,KAAK,MAAa,KAAK,GAAG,WAAW,EAAE,EAAE;EACnD;EAEA,MAAM,YAAY,KAAa,OAA2C;AACvE,WAAO,KAAK,MAAa,KAAK,GAAG,WAAW;MACzC,QAAQ;MACR,MAAM,KAAK,UAAU,KAAK;IAC7B,CAAC;EACJ;EAEA,MAAM,YAAY,KAAa,IAAY,OAA2C;AACnF,WAAO,KAAK,MAAa,KAAK,GAAG,WAAW,EAAE,IAAI;MAC/C,QAAQ;MACR,MAAM,KAAK,UAAU,KAAK;IAC7B,CAAC;EACJ;EAEA,MAAM,YAAY,KAAa,IAA2B;AACvD,WAAO,KAAK,MAAM,KAAK,GAAG,WAAW,EAAE,IAAI;MACxC,QAAQ;IACX,CAAC;EACJ;EAEA,MAAM,SACH,KACA,IACA,QAI6C;AAC7C,UAAM,eAAe,IAAI,gBAAgB;AACzC,QAAI,OAAO,SAAU,cAAa,OAAO,aAAa,OAAO,SAAS,SAAS,CAAC;AAChF,QAAI,OAAO;AACR,mBAAa,OAAO,oBAAoB,OAAO,eAAe,SAAS,CAAC;AAE3E,WAAO,KAAK,MAAM,KAAK,GAAG,WAAW,EAAE,QAAQ,aAAa,SAAS,CAAC,IAAI;MACvE,QAAQ;IACX,CAAC;EACJ;EAEA,MAAM,aACH,KACA,UAOI,CAAC,GACgC;AACrC,UAAM,SAAS,IAAI,gBAAgB;AACnC,QAAI,QAAQ,KAAM,QAAO,OAAO,QAAQ,QAAQ,KAAK,SAAS,CAAC;AAC/D,QAAI,QAAQ,SAAU,QAAO,OAAO,YAAY,QAAQ,SAAS,SAAS,CAAC;AAC3E,QAAI,QAAQ,OAAQ,QAAO,OAAO,UAAU,QAAQ,MAAM;AAC1D,QAAI,QAAQ,UAAW,QAAO,OAAO,aAAa,QAAQ,SAAS;AACnE,QAAI,QAAQ,QAAS,QAAO,OAAO,WAAW,QAAQ,QAAQ,SAAS,CAAC;AACxE,QAAI,QAAQ,OAAQ,QAAO,OAAO,UAAU,QAAQ,MAAM;AAE1D,WAAO,KAAK,MAAmC,KAAK,GAAG,gBAAgB,OAAO,SAAS,CAAC,EAAE;EAC7F;EAEA,MAAM,eACH,KACA,SACuE;AACvE,WAAO,KAAK,MAAM,KAAK,GAAG,WAAW,OAAO,SAAS;MAClD,QAAQ;IACX,CAAC;EACJ;AACH;AC1NO,IAAM,cAAN,cAA0B,cAAc;;;;;;;;;;;;EAY5C,MAAM,qBAAwD;AAC3D,WAAO,KAAK,MAAgC,mBAAmB;EAClE;;;;;;;EAQA,MAAM,iBAAiB,MAA0C;AAC9D,WAAO,KAAK,MAAyB,YAAY,IAAI,EAAE;EAC1D;AACH;ACfO,IAAM,qBAAN,cAAiC,cAAc;;;;EAInD,MAAM,mBACH,KACA,UAMI,CAAC,GACsC;AAC3C,UAAM,SAAS,IAAI,gBAAgB;AACnC,QAAI,QAAQ,KAAM,QAAO,OAAO,QAAQ,QAAQ,KAAK,SAAS,CAAC;AAC/D,QAAI,QAAQ,SAAU,QAAO,OAAO,YAAY,QAAQ,SAAS,SAAS,CAAC;AAC3E,QAAI,QAAQ,OAAQ,QAAO,OAAO,UAAU,QAAQ,MAAM;AAC1D,QAAI,QAAQ,UAAW,QAAO,OAAO,aAAa,QAAQ,SAAS;AACnE,QAAI,QAAQ,OAAQ,QAAO,OAAO,UAAU,QAAQ,MAAM;AAE1D,WAAO,KAAK;MACT,KAAK,GAAG,oCAAoC,OAAO,SAAS,IAAI,IAAI,OAAO,SAAS,CAAC,KAAK,EAAE;IAC/F;EACH;;;;EAKA,MAAM,kBAAkB,KAAa,cAA+C;AACjF,WAAO,KAAK;MACT,KAAK,GAAG,qCAAqC,YAAY;IAC5D;EACH;;;;EAKA,MAAM,wBAAwB,KAAa,MAAuC;AAC/E,WAAO,KAAK,MAAsB,KAAK,GAAG,0CAA0C,IAAI,EAAE;EAC7F;;;;EAKA,MAAM,qBACH,KACA,MACwB;AACxB,WAAO,KAAK,MAAsB,KAAK,GAAG,qCAAqC;MAC5E,QAAQ;MACR,MAAM,KAAK,UAAU,IAAI;IAC5B,CAAC;EACJ;;;;EAKA,MAAM,qBACH,KACA,cACA,MACwB;AACxB,WAAO,KAAK;MACT,KAAK,GAAG,qCAAqC,YAAY;MACzD;QACG,QAAQ;QACR,MAAM,KAAK,UAAU,IAAI;MAC5B;IACH;EACH;;;;EAKA,MAAM,qBAAqB,KAAa,cAAqC;AAC1E,WAAO,KAAK,MAAM,KAAK,GAAG,qCAAqC,YAAY,IAAI;MAC5E,QAAQ;IACX,CAAC;EACJ;;;;EAKA,MAAM,mBACH,KACA,cAC+C;AAC/C,WAAO,KAAK,MAAM,KAAK,GAAG,qCAAqC,YAAY,SAAS;MACjF,QAAQ;IACX,CAAC;EACJ;;;;EAKA,MAAM,mBACH,KACA,cACA,MAC4B;AAC5B,WAAO,KAAK;MACT,KAAK,GAAG,qCAAqC,YAAY;MACzD;QACG,QAAQ;QACR,MAAM,KAAK,UAAU,IAAI;MAC5B;IACH;EACH;;;;EAKA,MAAM,wBACH,KACA,cACA,MAC4B;AAC5B,WAAO,KAAK;MACT,KAAK,GAAG,qCAAqC,YAAY;MACzD;QACG,QAAQ;QACR,MAAM,KAAK,UAAU,IAAI;MAC5B;IACH;EACH;;;;EAKA,MAAM,oBACH,KACA,cACA,MAC4B;AAC5B,WAAO,KAAK;MACT,KAAK,GAAG,qCAAqC,YAAY;MACzD;QACG,QAAQ;QACR,MAAM,KAAK,UAAU,IAAI;MAC5B;IACH;EACH;;;;EAKA,MAAM,kBACH,KACA,cACA,MAC4B;AAC5B,WAAO,KAAK,MAAM,KAAK,GAAG,qCAAqC,YAAY,aAAa;MACrF,QAAQ;MACR,MAAM,KAAK,UAAU,IAAI;IAC5B,CAAC;EACJ;;;;EAKA,MAAM,oBACH,KACA,cACA,MAC4B;AAC5B,WAAO,KAAK,MAAM,KAAK,GAAG,qCAAqC,YAAY,eAAe;MACvF,QAAQ;MACR,MAAM,KAAK,UAAU,IAAI;IAC5B,CAAC;EACJ;;;;EAKA,MAAM,oBACH,KACA,cACA,MAC4B;AAC5B,WAAO,KAAK;MACT,KAAK,GAAG,qCAAqC,YAAY;MACzD;QACG,QAAQ;QACR,MAAM,KAAK,UAAU,IAAI;MAC5B;IACH;EACH;AACH;ACpLO,IAAM,WAAN,cAAuB,cAAc;EACzC,MAAM,SACH,KACA,UAOI,CAAC,GAC4B;AACjC,UAAM,SAAS,IAAI,gBAAgB;AACnC,QAAI,QAAQ,SAAU,QAAO,OAAO,aAAa,QAAQ,SAAS,SAAS,CAAC;AAC5E,QAAI,QAAQ,KAAM,QAAO,OAAO,QAAQ,QAAQ,KAAK,SAAS,CAAC;AAC/D,QAAI,QAAQ,SAAU,QAAO,OAAO,YAAY,QAAQ,SAAS,SAAS,CAAC;AAC3E,QAAI,QAAQ,OAAQ,QAAO,OAAO,UAAU,QAAQ,MAAM;AAC1D,QAAI,QAAQ,UAAW,QAAO,OAAO,aAAa,QAAQ,SAAS;AACnE,QAAI,QAAQ,OAAQ,QAAO,OAAO,UAAU,QAAQ,MAAM;AAC1D,WAAO,KAAK;MACT,KAAK,GAAG,SAAS,OAAO,SAAS,IAAI,IAAI,OAAO,SAAS,CAAC,KAAK,EAAE;IACpE;EACH;EAEA,MAAM,QAAQ,KAAa,IAA2B;AACnD,WAAO,KAAK,MAAY,KAAK,GAAG,UAAU,EAAE,EAAE;EACjD;EAEA,MAAM,WAAW,KAAa,MAAmC;AAC9D,WAAO,KAAK,MAAY,KAAK,GAAG,UAAU;MACvC,QAAQ;MACR,SAAS,EAAE,gBAAgB,mBAAmB;MAC9C,MAAM,KAAK,UAAU,IAAI;IAC5B,CAAC;EACJ;EAEA,MAAM,WAAW,KAAa,IAAY,MAA4C;AACnF,WAAO,KAAK,MAAY,KAAK,GAAG,UAAU,EAAE,IAAI;MAC7C,QAAQ;MACR,SAAS,EAAE,gBAAgB,mBAAmB;MAC9C,MAAM,KAAK,UAAU,IAAI;IAC5B,CAAC;EACJ;EAEA,MAAM,WAAW,KAAa,IAA2B;AACtD,WAAO,KAAK,MAAM,KAAK,GAAG,UAAU,EAAE,IAAI;MACvC,QAAQ;IACX,CAAC;EACJ;EAEA,MAAM,YACH,KACA,QACA,SAAsC,OACN;AAChC,WAAO,KAAK;MACT,KAAK,GAAG,UAAU,MAAM,mBAAmB,MAAM;MACjD;QACG,QAAQ;MACX;IACH;EACH;EAEA,MAAM,sBACH,KACA,SAC4B;AAC5B,WAAO,KAAK,MAA0B,KAAK,GAAG,qBAAqB;MAChE,QAAQ;MACR,SAAS,EAAE,gBAAgB,mBAAmB;MAC9C,MAAM,KAAK,UAAU,OAAO;IAC/B,CAAC;EACJ;;EAGA,MAAM,WAAW,KAAa,UAA0C;AACrE,UAAM,SAAS,IAAI,gBAAgB;AACnC,QAAI,SAAU,QAAO,OAAO,aAAa,SAAS,SAAS,CAAC;AAC5D,WAAO,KAAK;MACT,KAAK,GAAG,WAAW,OAAO,SAAS,IAAI,IAAI,OAAO,SAAS,CAAC,KAAK,EAAE;IACtE;EACH;EAEA,MAAM,UAAU,KAAa,IAAiC;AAC3D,WAAO,KAAK,MAAkB,KAAK,GAAG,YAAY,EAAE,EAAE;EACzD;EAEA,MAAM,aAAa,KAAa,WAAoD;AACjF,WAAO,KAAK,MAAkB,KAAK,GAAG,YAAY;MAC/C,QAAQ;MACR,MAAM,KAAK,UAAU,SAAS;IACjC,CAAC;EACJ;EAEA,MAAM,aACH,KACA,IACA,WACoB;AACpB,WAAO,KAAK,MAAkB,KAAK,GAAG,YAAY,EAAE,IAAI;MACrD,QAAQ;MACR,MAAM,KAAK,UAAU,SAAS;IACjC,CAAC;EACJ;EAEA,MAAM,aAAa,KAAa,IAA2B;AACxD,WAAO,KAAK,MAAM,KAAK,GAAG,YAAY,EAAE,IAAI;MACzC,QAAQ;IACX,CAAC;EACJ;EAEA,MAAM,cAAc,KAAa,IAA0D;AACxF,WAAO,KAAK,MAA2C,KAAK,GAAG,YAAY,EAAE,YAAY;MACtF,QAAQ;IACX,CAAC;EACJ;EAEA,MAAM,aACH,KACA,IACA,QAC8B;AAC9B,UAAM,eAAe,IAAI,gBAAgB;AACzC,iBAAa,OAAO,SAAS,OAAO,KAAK;AACzC,QAAI,OAAO,KAAM,cAAa,OAAO,SAAS,OAAO,KAAK,SAAS,CAAC;AAEpE,WAAO,KAAK;MACT,KAAK,GAAG,YAAY,EAAE,WAAW,aAAa,SAAS,CAAC;IAC3D;EACH;;EAGA,MAAM,cAAc,KAAmC;AACpD,WAAO,KAAK,MAAmB,KAAK,GAAG,cAAc;EACxD;EAEA,MAAM,aAAa,KAAa,IAAgC;AAC7D,WAAO,KAAK,MAAiB,KAAK,GAAG,gBAAgB,EAAE,EAAE;EAC5D;EAEA,MAAM,mBAAmB,KAAa,MAAkC;AACrE,WAAO,KAAK,MAAiB,KAAK,GAAG,gBAAgB,IAAI,EAAE;EAC9D;EAEA,MAAM,gBAAgB,KAAa,OAA8C;AAC9E,WAAO,KAAK,MAAiB,KAAK,GAAG,gBAAgB;MAClD,QAAQ;MACR,MAAM,KAAK,UAAU,KAAK;IAC7B,CAAC;EACJ;EAEA,MAAM,gBACH,KACA,IACA,OACmB;AACnB,WAAO,KAAK,MAAiB,KAAK,GAAG,gBAAgB,EAAE,IAAI;MACxD,QAAQ;MACR,MAAM,KAAK,UAAU,KAAK;IAC7B,CAAC;EACJ;EAEA,MAAM,gBAAgB,KAAa,IAA2B;AAC3D,WAAO,KAAK,MAAM,KAAK,GAAG,gBAAgB,EAAE,IAAI;MAC7C,QAAQ;IACX,CAAC;EACJ;;EAGA,MAAM,eAAe,KAAa,QAA8C;AAC7E,WAAO,KAAK,MAA2B,KAAK,GAAG,UAAU,MAAM,UAAU;EAC5E;EAEA,MAAM,gBACH,KACA,QACA,MACuC;AACvC,WAAO,KAAK,MAAqC,KAAK,GAAG,UAAU,MAAM,kBAAkB;MACxF,QAAQ;MACR,MAAM,KAAK,UAAU,IAAI;IAC5B,CAAC;EACJ;EAEA,MAAM,eAAe,KAAa,QAAgB,QAA+B;AAC9E,WAAO,KAAK,MAAM,KAAK,GAAG,UAAU,MAAM,kBAAkB,MAAM,IAAI;MACnE,QAAQ;IACX,CAAC;EACJ;;EAGA,MAAM,iBAAiB,KAAa,UAAkD;AACnF,WAAO,KAAK,MAA6B,KAAK,GAAG,YAAY,QAAQ,UAAU;EAClF;EAEA,MAAM,kBACH,KACA,UACA,MACuC;AACvC,WAAO,KAAK;MACT,KAAK,GAAG,YAAY,QAAQ;MAC5B;QACG,QAAQ;QACR,MAAM,KAAK,UAAU,IAAI;MAC5B;IACH;EACH;EAEA,MAAM,iBAAiB,KAAa,UAAkB,QAA+B;AAClF,WAAO,KAAK,MAAM,KAAK,GAAG,YAAY,QAAQ,kBAAkB,MAAM,IAAI;MACvE,QAAQ;IACX,CAAC;EACJ;;EAGA,MAAM,kBACH,KACA,QACA,MAC6B;AAC7B,WAAO,KAAK,MAA2B,KAAK,GAAG,UAAU,MAAM,YAAY;MACxE,QAAQ;MACR,MAAM,KAAK,UAAU,IAAI;IAC5B,CAAC;EACJ;EAEA,MAAM,oBACH,KACA,UACA,MAC+B;AAC/B,WAAO,KAAK,MAA6B,KAAK,GAAG,YAAY,QAAQ,YAAY;MAC9E,QAAQ;MACR,MAAM,KAAK,UAAU,IAAI;IAC5B,CAAC;EACJ;;EAGA,MAAM,cAAc,KAAa,QAA6C;AAC3E,WAAO,KAAK,MAA0B,KAAK,GAAG,kBAAkB,MAAM,EAAE;EAC3E;EAEA,MAAM,gBACH,KACA,UACA,OAAO,GACP,WAAW,KACmB;AAC9B,WAAO,KAAK;MACT,KAAK,GAAG,oBAAoB,QAAQ,SAAS,IAAI,aAAa,QAAQ;IACzE;EACH;EAEA,MAAM,qBACH,KACA,UACA,OAAO,GACP,WAAW,KACgD;AAC3D,WAAO,KAAK;MACT,KAAK,GAAG,oBAAoB,QAAQ,eAAe,IAAI,aAAa,QAAQ;IAC/E;EACH;AACH;AC7RO,IAAM,aAAN,cAAyB,cAAc;EAC3C,MAAM,WAAW,KAAgD;AAC9D,WAAO,KAAK,MAAgC,KAAK,GAAG,UAAU;EACjE;EAEA,MAAM,SAAS,KAAa,IAA4B;AACrD,WAAO,KAAK,MAAa,KAAK,GAAG,YAAY,EAAE,EAAE;EACpD;EAEA,MAAM,YAAY,KAAa,OAA2C;AACvE,WAAO,KAAK,MAAa,KAAK,GAAG,YAAY;MAC1C,QAAQ;MACR,MAAM,KAAK,UAAU,KAAK;IAC7B,CAAC;EACJ;EAEA,MAAM,YAAY,KAAa,IAAY,OAA2C;AACnF,WAAO,KAAK,MAAa,KAAK,GAAG,YAAY,EAAE,IAAI;MAChD,QAAQ;MACR,MAAM,KAAK,UAAU,KAAK;IAC7B,CAAC;EACJ;EAEA,MAAM,YAAY,KAAa,IAA2B;AACvD,WAAO,KAAK,MAAM,KAAK,GAAG,YAAY,EAAE,IAAI;MACzC,QAAQ;IACX,CAAC;EACJ;EAEA,MAAM,eACH,KACA,SACA,UAII,CAAC,GAC6B;AAClC,UAAM,SAAS,IAAI,gBAAgB;AACnC,QAAI,QAAQ,MAAO,QAAO,OAAO,SAAS,QAAQ,MAAM,SAAS,CAAC;AAClE,QAAI,QAAQ,OAAQ,QAAO,OAAO,UAAU,QAAQ,OAAO,SAAS,CAAC;AACrE,QAAI,QAAQ;AACT,aAAO,OAAO,uBAAuB,QAAQ,mBAAmB,SAAS,CAAC;AAE7E,WAAO,KAAK;MACT,KAAK,GAAG,YAAY,OAAO,UAAU,OAAO,SAAS,IAAI,IAAI,OAAO,SAAS,CAAC,KAAK,EAAE;IACxF;EACH;EAEA,MAAM,cAAc,KAAa,SAAiB,SAAiC;AAChF,WAAO,KAAK,MAAa,KAAK,GAAG,YAAY,OAAO,WAAW,OAAO,EAAE;EAC3E;EAEA,MAAM,gBAAgB,KAAa,SAAiB,SAAiC;AAClF,WAAO,KAAK,MAAa,KAAK,GAAG,YAAY,OAAO,WAAW,OAAO,cAAc;MACjF,QAAQ;IACX,CAAC;EACJ;EAEA,MAAM,kBAAkB,KAAa,SAAiB,SAAiC;AACpF,WAAO,KAAK,MAAa,KAAK,GAAG,YAAY,OAAO,WAAW,OAAO,WAAW;MAC9E,QAAQ;IACX,CAAC;EACJ;EAEA,MAAM,aACH,KACA,SACA,SAAsC,OACL;AACjC,WAAO,KAAK;MACT,KAAK,GAAG,mBAAmB,OAAO,mBAAmB,MAAM;MAC3D;QACG,QAAQ;MACX;IACH;EACH;EAEA,MAAM,wBACH,KACA,SACA,SACA,cACqB;AACrB,UAAM,WAAW,MAAM,KAAK;MACzB,KAAK,GAAG,YAAY,OAAO,WAAW,OAAO,gBAAgB,YAAY;IAC5E;AACA,WAAO,SAAS,YAAY;EAC/B;EAEA,MAAM,gBAAgB,KAAa,SAA+B;AAC/D,WAAO,KAAK,MAAM,KAAK,GAAG,YAAY,OAAO,UAAU;EAC1D;EAEA,MAAM,gBAAgB,KAAa,SAAiB,cAAoC;AACrF,WAAO,KAAK,MAAM,KAAK,GAAG,YAAY,OAAO,gBAAgB,YAAY,SAAS;EACrF;EAEA,MAAM,cAAc,KAAa,SAAiB,QAA8B;AAC7E,WAAO,KAAK,MAAM,KAAK,GAAG,YAAY,OAAO,UAAU,MAAM,SAAS;EACzE;AACH;ACjGO,IAAM,eAAN,cAA2B,cAAc;;;;EAI7C,MAAM,cAAc,MAA8C;AAC/D,WAAO,KAAK,MAAe,aAAa;MACrC,QAAQ;MACR,MAAM,KAAK,UAAU,IAAI;IAC5B,CAAC;EACJ;;;;EAKA,MAAM,cAAc,QAIa;AAC9B,UAAM,eAAe,IAAI,gBAAgB;AACzC,QAAI,QAAQ,KAAM,cAAa,OAAO,QAAQ,OAAO,KAAK,SAAS,CAAC;AACpE,QAAI,QAAQ,SAAU,cAAa,OAAO,aAAa,OAAO,SAAS,SAAS,CAAC;AACjF,QAAI,QAAQ,YAAa,cAAa,OAAO,gBAAgB,OAAO,WAAW;AAE/E,UAAM,cAAc,aAAa,SAAS;AAC1C,UAAM,MAAM,cAAc,aAAa,WAAW,KAAK;AAEvD,WAAO,KAAK,MAA2B,GAAG;EAC7C;;;;EAKA,MAAM,WAAW,WAAqC;AACnD,WAAO,KAAK,MAAe,aAAa,SAAS,EAAE;EACtD;;;;EAKA,MAAM,cAAc,WAAmB,MAA8C;AAClF,WAAO,KAAK,MAAe,aAAa,SAAS,IAAI;MAClD,QAAQ;MACR,MAAM,KAAK,UAAU,IAAI;IAC5B,CAAC;EACJ;;;;EAKA,MAAM,cAAc,WAAkC;AACnD,UAAM,KAAK,MAAM,aAAa,SAAS,IAAI;MACxC,QAAQ;IACX,CAAC;EACJ;;;;;;EAOA,MAAM,mBAAmB,cAAsC;AAC5D,UAAM,SAAS,IAAI,gBAAgB;AACnC,QAAI,cAAc;AACf,aAAO,OAAO,iBAAiB,YAAY;IAC9C;AAEA,UAAM,cAAc,OAAO,SAAS;AACpC,UAAM,MAAM,cAAc,wBAAwB,WAAW,KAAK;AAElE,UAAM,WAAW,MAAM,MAAM,GAAG,KAAK,OAAO,WAAW,GAAG,IAAI;MAC3D,QAAQ;MACR,aAAa;IAChB,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AACf,YAAM,QAAQ,MAAM,SAAS,KAAK;AAClC,YAAM,IAAI,MAAM,MAAM,UAAU,eAAe;IAClD;AAEA,WAAO,SAAS,KAAK;EACxB;AACH;ACjFO,IAAM,oBAAN,cAAgC,cAAc;;;;;EAKlD,MAAM,4BAA4B,KAAsD;AACrF,WAAO,KAAK,MAAsC,KAAK,GAAG,4BAA4B;EACzF;;;;;;EAOA,MAAM,mBAAmB,KAA2C;AACjE,WAAO,KAAK,MAA2B,KAAK,GAAG,kBAAkB;EACpE;;;;EAKA,MAAM,kBACH,KACA,MACuC;AACvC,WAAO,KAAK,MAAqC,KAAK,GAAG,kCAAkC;MACxF,QAAQ;MACR,MAAM,KAAK,UAAU,IAAI;IAC5B,CAAC;EACJ;;;;EAKA,MAAM,eAAe,KAAa,SAAyD;AACxF,WAAO,KAAK;MACT,KAAK,GAAG,kCAAkC,OAAO;IACpD;EACH;;;;EAKA,MAAM,kBACH,KACA,SACA,MACuC;AACvC,WAAO,KAAK;MACT,KAAK,GAAG,kCAAkC,OAAO;MACjD;QACG,QAAQ;QACR,MAAM,KAAK,UAAU,IAAI;MAC5B;IACH;EACH;;;;EAKA,MAAM,kBACH,KACA,SACA,OAAgB,OACiD;AACjE,UAAM,SAAS,OAAO,eAAe;AACrC,WAAO,KAAK;MACT,KAAK,GAAG,kCAAkC,OAAO,GAAG,MAAM;MAC1D,EAAE,QAAQ,SAAS;IACtB;EACH;AACH;ACvEO,IAAM,gBAAN,cAA4B,cAAc;;;;EAI9C,MAAM,cAAc,KAAmC;AACpD,WAAO,KAAK,MAAmB,KAAK,GAAG,8BAA8B;EACxE;;;;EAKA,MAAM,aAAa,KAAa,UAAsC;AACnE,WAAO,KAAK,MAAiB,KAAK,GAAG,gCAAgC,QAAQ,EAAE;EAClF;;;;EAKA,MAAM,gBAAgB,KAAa,MAA6C;AAC7E,WAAO,KAAK,MAAiB,KAAK,GAAG,gCAAgC;MAClE,QAAQ;MACR,MAAM,KAAK,UAAU,IAAI;IAC5B,CAAC;EACJ;;;;EAKA,MAAM,gBACH,KACA,UACA,MACmB;AACnB,WAAO,KAAK,MAAiB,KAAK,GAAG,gCAAgC,QAAQ,IAAI;MAC9E,QAAQ;MACR,MAAM,KAAK,UAAU,IAAI;IAC5B,CAAC;EACJ;;;;EAKA,MAAM,gBAAgB,KAAa,UAAgD;AAChF,WAAO,KAAK,MAA2B,KAAK,GAAG,gCAAgC,QAAQ,IAAI;MACxF,QAAQ;IACX,CAAC;EACJ;;;;EAKA,MAAM,gBAAgB,KAAa,UAAsC;AACtE,WAAO,KAAK,MAAiB,KAAK,GAAG,gCAAgC,QAAQ,WAAW;MACrF,QAAQ;IACX,CAAC;EACJ;;;;EAKA,MAAM,iBAAiB,KAAa,UAAsC;AACvE,WAAO,KAAK,MAAiB,KAAK,GAAG,gCAAgC,QAAQ,YAAY;MACtF,QAAQ;IACX,CAAC;EACJ;;;;;;;EAQA,MAAM,kBAAkB,KAAa,UAAmD;AACrF,WAAO,KAAK;MACT,KAAK,GAAG,gCAAgC,QAAQ;IACnD;EACH;;;;;;;EAQA,MAAM,sBAAsB,KAAa,UAAuD;AAC7F,WAAO,KAAK;MACT,KAAK,GAAG,gCAAgC,QAAQ;IACnD;EACH;;;;;;;EAQA,MAAM,oBAAoB,KAAa,UAAqD;AACzF,WAAO,KAAK;MACT,KAAK,GAAG,gCAAgC,QAAQ;IACnD;EACH;;;;EAKA,MAAM,wBACH,KACA,UACmC;AACnC,WAAO,KAAK;MACT,KAAK,GAAG,gCAAgC,QAAQ;MAChD,EAAE,QAAQ,OAAO;IACpB;EACH;;;;EAKA,MAAM,sBACH,KACA,MAC8D;AAC9D,WAAO,KAAK;MACT,KAAK,GAAG;MACR;QACG,QAAQ;QACR,MAAM,KAAK,UAAU,IAAI;MAC5B;IACH;EACH;AACH;ACtGO,IAAM,aAAN,cAAyB,cAAc;EAC3C,MAAM,iBAAiB,KAAqC;AACzD,WAAO,KAAK,MAAqB,KAAK,GAAG,KAAK;EACjD;;;;;;EAOA,MAAM,gBAAgB,KAAgC;AACnD,WAAO,KAAK,MAAgB,KAAK,GAAG,gBAAgB;EACvD;;;;;;EAOA,MAAM,aAAa,KAAa,YAAqC;AAClE,WAAO,KAAK,MAAc,KAAK,GAAG,mBAAmB;MAClD,QAAQ;MACR,MAAM,KAAK,UAAU,EAAE,WAAW,CAAC;IACtC,CAAC;EACJ;;;;EAKA,MAAM,kBAAkB,KAA8B;AACnD,WAAO,KAAK,MAAc,KAAK,GAAG,mBAAmB;MAClD,QAAQ;IACX,CAAC;EACJ;EAEA,MAAM,oBAAoB,KAAa,QAAkD;AACtF,WAAO,KAAK,MAAc,KAAK,GAAG,OAAO;MACtC,QAAQ;MACR,MAAM,KAAK,UAAU,MAAM;IAC9B,CAAC;EACJ;EAEA,MAAM,oBACH,KACA,OAAe,GACf,WAAmB,IACnB,SACA,QACA,MACA,QACA,WACA,YACA,aAAsB,OACtB,WACA,aACA,YACA,YACmC;AACnC,UAAM,SAAS,IAAI,gBAAgB;AACnC,QAAI,KAAM,QAAO,OAAO,QAAQ,KAAK,SAAS,CAAC;AAC/C,QAAI,SAAU,QAAO,OAAO,YAAY,SAAS,SAAS,CAAC;AAC3D,QAAI,OAAQ,QAAO,OAAO,UAAU,MAAM;AAC1C,QAAI,UAAW,QAAO,OAAO,aAAa,SAAS;AAGnD,QAAI,SAAS;AACV,UAAI,MAAM,QAAQ,OAAO,GAAG;AAEzB,eAAO,OAAO,WAAW,KAAK,UAAU,OAAO,CAAC;MACnD,OAAO;AAEJ,eAAO,OAAO,WAAW,KAAK,UAAU,OAAO,CAAC;MACnD;IACH;AAGA,QAAI,OAAQ,QAAO,OAAO,UAAU,MAAM;AAC1C,QAAI,KAAM,QAAO,OAAO,QAAQ,IAAI;AAEpC,QAAI,eAAe,YAAY,SAAS,GAAG;AACxC,aAAO,OAAO,gBAAgB,YAAY,KAAK,GAAG,CAAC;IACtD,WAAW,YAAY;AAEpB,aAAO,OAAO,eAAe,UAAU;IAC1C;AAEA,WAAO,OAAO,eAAe,WAAW,SAAS,CAAC;AAElD,QAAI,cAAc,QAAW;AAC1B,aAAO,OAAO,cAAc,UAAU,SAAS,CAAC;IACnD;AAEA,QAAI,eAAe,QAAW;AAC3B,aAAO,OAAO,eAAe,WAAW,SAAS,CAAC;IACrD;AAEA,QAAI,cAAc,WAAW,SAAS,GAAG;AACtC,aAAO,OAAO,eAAe,WAAW,KAAK,GAAG,CAAC;IACpD;AAEA,WAAO,KAAK,MAAiC,KAAK,GAAG,YAAY,OAAO,SAAS,CAAC,EAAE;EACvF;EAEA,MAAM,mBAAmB,KAAa,UAAmC;AACtE,WAAO,KAAK,MAAc,KAAK,GAAG,YAAY,QAAQ,EAAE;EAC3D;EAEA,MAAM,sBAAsB,KAAa,MAAqD;AAC3F,WAAO,KAAK,MAAc,KAAK,GAAG,YAAY;MAC3C,QAAQ;MACR,MAAM,KAAK,UAAU,IAAI;IAC5B,CAAC;EACJ;EAEA,MAAM,aACH,KACA,UACA,MACgB;AAChB,WAAO,KAAK,MAAc,KAAK,GAAG,YAAY,QAAQ,IAAI;MACvD,QAAQ;MACR,MAAM,KAAK,UAAU,IAAI;IAC5B,CAAC;EACJ;EAEA,MAAM,aAAa,KAAa,UAAkB,SAA8C;AAC7F,UAAM,SAAS,IAAI,gBAAgB;AACnC,QAAI,SAAS,OAAO;AACjB,aAAO,OAAO,SAAS,MAAM;IAChC;AACA,UAAM,cAAc,OAAO,SAAS;AACpC,UAAM,MAAM,KAAK,GAAG,YAAY,QAAQ,GAAG,cAAc,IAAI,WAAW,KAAK,EAAE;AAC/E,WAAO,KAAK,MAAM,KAAK;MACpB,QAAQ;IACX,CAAC;EACJ;EAEA,MAAM,cAAc,KAAa,UAAmC;AACjE,WAAO,KAAK,MAAc,KAAK,GAAG,YAAY,QAAQ,YAAY;MAC/D,QAAQ;IACX,CAAC;EACJ;EAEA,MAAM,gBAAgB,KAAa,UAAmC;AACnE,WAAO,KAAK,MAAc,KAAK,GAAG,YAAY,QAAQ,cAAc;MACjE,QAAQ;IACX,CAAC;EACJ;;EAGA,MAAM,iBAAiB,KAAsC;AAC1D,WAAO,KAAK,MAAsB,KAAK,GAAG,iBAAiB;EAC9D;EAEA,MAAM,gBAAgB,KAAa,UAAyC;AACzE,WAAO,KAAK,MAAoB,KAAK,GAAG,mBAAmB,QAAQ,EAAE;EACxE;EAEA,MAAM,mBAAmB,KAAa,MAAmD;AACtF,WAAO,KAAK,MAAoB,KAAK,GAAG,mBAAmB;MACxD,QAAQ;MACR,MAAM,KAAK,UAAU,IAAI;IAC5B,CAAC;EACJ;EAEA,MAAM,mBACH,KACA,UACA,MACsB;AACtB,WAAO,KAAK,MAAoB,KAAK,GAAG,mBAAmB,QAAQ,IAAI;MACpE,QAAQ;MACR,MAAM,KAAK,UAAU,IAAI;IAC5B,CAAC;EACJ;EAEA,MAAM,mBAAmB,KAAa,UAAiC;AACpE,WAAO,KAAK,MAAM,KAAK,GAAG,mBAAmB,QAAQ,IAAI;MACtD,QAAQ;IACX,CAAC;EACJ;EAEA,MAAM,qBAAqB,KAAa,UAA8C;AACnF,WAAO,KAAK,MAAyB,KAAK,GAAG,mBAAmB,QAAQ,QAAQ;EACnF;;EAGA,MAAM,gBAAgB,KAAqC;AACxD,WAAO,KAAK,MAAqB,KAAK,GAAG,gBAAgB;EAC5D;EAEA,MAAM,eAAe,KAAa,IAAkC;AACjE,WAAO,KAAK,MAAmB,KAAK,GAAG,kBAAkB,EAAE,EAAE;EAChE;EAEA,MAAM,qBAAqB,KAAa,MAAoC;AACzE,WAAO,KAAK,MAAmB,KAAK,GAAG,kBAAkB,IAAI,EAAE;EAClE;EAEA,MAAM,kBAAkB,KAAa,OAAkD;AACpF,WAAO,KAAK,MAAmB,KAAK,GAAG,kBAAkB;MACtD,QAAQ;MACR,MAAM,KAAK,UAAU,KAAK;IAC7B,CAAC;EACJ;EAEA,MAAM,kBACH,KACA,IACA,OACqB;AACrB,WAAO,KAAK,MAAmB,KAAK,GAAG,kBAAkB,EAAE,IAAI;MAC5D,QAAQ;MACR,MAAM,KAAK,UAAU,KAAK;IAC7B,CAAC;EACJ;EAEA,MAAM,kBAAkB,KAAa,IAA2B;AAC7D,WAAO,KAAK,MAAM,KAAK,GAAG,kBAAkB,EAAE,IAAI;MAC/C,QAAQ;IACX,CAAC;EACJ;;EAGA,MAAM,eAAe,KAAoC;AACtD,WAAO,KAAK,MAAoB,KAAK,GAAG,eAAe;EAC1D;EAEA,MAAM,cAAc,KAAa,IAAiC;AAC/D,WAAO,KAAK,MAAkB,KAAK,GAAG,iBAAiB,EAAE,EAAE;EAC9D;EAEA,MAAM,oBAAoB,KAAa,MAAmC;AACvE,WAAO,KAAK,MAAkB,KAAK,GAAG,iBAAiB,IAAI,EAAE;EAChE;EAEA,MAAM,iBAAiB,KAAa,YAAqD;AACtF,WAAO,KAAK,MAAkB,KAAK,GAAG,iBAAiB;MACpD,QAAQ;MACR,MAAM,KAAK,UAAU,UAAU;IAClC,CAAC;EACJ;EAEA,MAAM,iBACH,KACA,IACA,YACoB;AACpB,WAAO,KAAK,MAAkB,KAAK,GAAG,iBAAiB,EAAE,IAAI;MAC1D,QAAQ;MACR,MAAM,KAAK,UAAU,UAAU;IAClC,CAAC;EACJ;EAEA,MAAM,iBAAiB,KAAa,IAA2B;AAC5D,WAAO,KAAK,MAAM,KAAK,GAAG,iBAAiB,EAAE,IAAI;MAC9C,QAAQ;IACX,CAAC;EACJ;;EAGA,MAAM,cACH,KACA,MACA,iBACA,YACa;AACb,UAAM,WAAW,IAAI,SAAS;AAC9B,aAAS,OAAO,QAAQ,IAAI;AAE5B,UAAM,SAAS,IAAI,gBAAgB;AACnC,WAAO,OAAO,sBAAsB,gBAAgB,SAAS,CAAC;AAE9D,UAAM,WAAW,MAAM;MACpB,GAAG,KAAK,OAAO,aAAa,GAAG,mBAAmB,OAAO,SAAS,CAAC;MACnE;QACG,QAAQ;QACR,MAAM;QACN,aAAa;MAChB;IACH;AAEA,QAAI,CAAC,SAAS,IAAI;AACf,YAAM,QAAQ,MAAM,SAAS,KAAK;AAGlC,UAAI,MAAM,UAAU,OAAO,MAAM,WAAW,UAAU;AACnD,cAAM,EAAE,SAAS,OAAO,IAAI,MAAM;AAClC,YAAI,UAAU,MAAM,QAAQ,MAAM,GAAG;AAElC,gBAAM,cAAc,IAAI,MAAM,WAAW,0BAA0B;AAClE,sBAAoB,mBAAmB;AACxC,gBAAM;QACT;MACH;AAGA,YAAM,IAAI,MAAM,MAAM,UAAU,eAAe;IAClD;AAEA,QAAI,cAAc,SAAS,MAAM;AAC9B,YAAM,SAAS,SAAS,KAAK,UAAU;AACvC,YAAM,UAAU,IAAI,YAAY;AAEhC,aAAO,MAAM;AACV,cAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO,KAAK;AAC1C,YAAI,KAAM;AAEV,cAAM,QAAQ,QAAQ,OAAO,KAAK;AAClC,cAAM,QAAQ,MAAM,MAAM,IAAI,EAAE,OAAO,CAAC,SAAS,KAAK,KAAK,CAAC;AAE5D,mBAAW,QAAQ,OAAO;AACvB,cAAI;AACD,kBAAM,WAAW,KAAK,MAAM,IAAI;AAChC,uBAAW,QAAQ;UACtB,SAAS,GAAG;UAEZ;QACH;MACH;IACH;AAEA,WAAO,EAAE,SAAS,KAAK;EAC1B;EAEA,MAAM,cACH,KACA,gBACA,mBACA,YACc;AACd,UAAM,SAAS,IAAI,gBAAgB;AACnC,mBAAe,QAAQ,CAAC,UAAU,OAAO,OAAO,mBAAmB,KAAK,CAAC;AACzE,sBAAkB,QAAQ,CAAC,OAAO,OAAO,OAAO,uBAAuB,GAAG,SAAS,CAAC,CAAC;AACrF,QAAI,WAAY,QAAO,OAAO,eAAe,UAAU;AAEvD,UAAM,WAAW,MAAM;MACpB,GAAG,KAAK,OAAO,aAAa,GAAG,mBAAmB,OAAO,SAAS,CAAC;MACnE;QACG,QAAQ;QACR,SAAS,EAAE,gBAAgB,mBAAmB;QAC9C,aAAa;MAChB;IACH;AAEA,QAAI,CAAC,SAAS,IAAI;AACf,YAAM,QAAQ,MAAM,SAAS,KAAK;AAClC,YAAM,IAAI,MAAM,MAAM,UAAU,eAAe;IAClD;AAEA,WAAO,SAAS,KAAK;EACxB;EAEA,MAAM,0BACH,KACA,WACA,OAAe,IACmB;AAClC,UAAM,eAAe,UAAU,KAAK,GAAG;AACvC,UAAM,SAAS,IAAI,gBAAgB;AACnC,WAAO,OAAO,cAAc,YAAY;AACxC,WAAO,OAAO,QAAQ,KAAK,SAAS,CAAC;AAErC,WAAO,KAAK;MACT,KAAK,GAAG,6BAA6B,OAAO,SAAS,CAAC;IACzD;EACH;;;;;;;;EAUA,MAAM,gBAAgB,KAAa,UAAoD;AACpF,WAAO,KAAK,MAA+B,KAAK,GAAG,YAAY,QAAQ,SAAS;EACnF;;;;;EAMA,MAAM,0BAA0B,KAAyD;AACtF,WAAO,KAAK,MAAyC,KAAK,GAAG,2BAA2B;EAC3F;;;;;EAMA,MAAM,kBACH,KACA,UACA,SACqB;AACrB,WAAO,KAAK,MAAmB,KAAK,GAAG,YAAY,QAAQ,WAAW;MACnE,QAAQ;MACR,MAAM,KAAK,UAAU,OAAO;IAC/B,CAAC;EACJ;;;;;EAMA,MAAM,kBACH,KACA,UACA,SACA,SACqB;AACrB,WAAO,KAAK,MAAmB,KAAK,GAAG,YAAY,QAAQ,WAAW,OAAO,IAAI;MAC9E,QAAQ;MACR,MAAM,KAAK,UAAU,OAAO;IAC/B,CAAC;EACJ;;;;;EAMA,MAAM,kBAAkB,KAAa,UAAkB,SAAgC;AACpF,UAAM,KAAK,MAAM,KAAK,GAAG,YAAY,QAAQ,WAAW,OAAO,IAAI;MAChE,QAAQ;IACX,CAAC;EACJ;;;;;;;;EAUA,MAAM,6BACH,KACA,UACA,gBACA,UACwC;AACxC,WAAO,KAAK;MACT,KAAK,GAAG,YAAY,QAAQ;MAC5B;QACG,QAAQ;QACR,MAAM,KAAK,UAAU;UAClB,iBAAiB;UACjB,WAAW;QACd,CAAC;MACJ;IACH;EACH;;;;;EAMA,MAAM,6BACH,KACA,UAC8C;AAC9C,WAAO,KAAK;MACT,KAAK,GAAG,8BAA8B,QAAQ;MAC9C,EAAE,QAAQ,SAAS;IACtB;EACH;;;;;EAMA,MAAM,2BACH,KACA,UACyC;AACzC,UAAM,SAAS,IAAI,gBAAgB;AACnC,QAAI,SAAU,QAAO,OAAO,aAAa,SAAS,SAAS,CAAC;AAC5D,WAAO,KAAK;MACT,KAAK,GAAG,8BAA8B,OAAO,SAAS,CAAC;IAC1D;EACH;;;;;;;;EAUA,MAAM,wBACH,KACA,SAKyC;AACzC,UAAM,SAAS,IAAI,gBAAgB;AACnC,QAAI,SAAS,OAAQ,QAAO,OAAO,UAAU,QAAQ,MAAM;AAC3D,QAAI,SAAS,KAAM,QAAO,OAAO,QAAQ,QAAQ,KAAK,SAAS,CAAC;AAChE,QAAI,SAAS,SAAU,QAAO,OAAO,YAAY,QAAQ,SAAS,SAAS,CAAC;AAE5E,UAAM,cAAc,OAAO,SAAS;AACpC,UAAM,MAAM,KAAK,GAAG,iCAAiC,cAAc,IAAI,WAAW,KAAK,EAAE;AACzF,WAAO,KAAK,MAAuC,GAAG;EACzD;;;;EAKA,MAAM,uBACH,KACA,cACmC;AACnC,WAAO,KAAK;MACT,KAAK,GAAG,kCAAkC,YAAY;IACzD;EACH;;;;;;EAOA,MAAM,uBACH,KACA,cACA,SACmC;AACnC,WAAO,KAAK;MACT,KAAK,GAAG,kCAAkC,YAAY;MACtD;QACG,QAAQ;QACR,MAAM,KAAK,UAAU,OAAO;MAC/B;IACH;EACH;;;;;EAMA,MAAM,sBACH,KACA,cACA,SACmC;AACnC,WAAO,KAAK;MACT,KAAK,GAAG,kCAAkC,YAAY;MACtD;QACG,QAAQ;QACR,MAAM,KAAK,UAAU,WAAW,CAAC,CAAC;MACrC;IACH;EACH;AACH;AC1kBO,IAAM,gBAAN,cAA4B,cAAc;EAC9C,MAAM,cACH,KACA,UAKI,CAAC,GACiC;AACtC,UAAM,SAAS,IAAI,gBAAgB;AACnC,QAAI,QAAQ,KAAM,QAAO,OAAO,QAAQ,QAAQ,KAAK,SAAS,CAAC;AAC/D,QAAI,QAAQ,SAAU,QAAO,OAAO,YAAY,QAAQ,SAAS,SAAS,CAAC;AAC3E,QAAI,QAAQ,OAAQ,QAAO,OAAO,UAAU,QAAQ,MAAM;AAC1D,QAAI,QAAQ,UAAW,QAAO,OAAO,aAAa,QAAQ,SAAS;AAEnE,WAAO,KAAK;MACT,KAAK,GAAG,cAAc,OAAO,SAAS,IAAI,IAAI,OAAO,SAAS,CAAC,KAAK,EAAE;IACzE;EACH;EAEA,MAAM,aAAa,KAAa,IAAgC;AAC7D,WAAO,KAAK,MAAiB,KAAK,GAAG,eAAe,EAAE,EAAE;EAC3D;EAEA,MAAM,gBAAgB,KAAa,WAAkD;AAClF,WAAO,KAAK,MAAiB,KAAK,GAAG,eAAe;MACjD,QAAQ;MACR,MAAM,KAAK,UAAU,SAAS;IACjC,CAAC;EACJ;EAEA,MAAM,gBACH,KACA,IACA,WACmB;AACnB,WAAO,KAAK,MAAiB,KAAK,GAAG,eAAe,EAAE,IAAI;MACvD,QAAQ;MACR,MAAM,KAAK,UAAU,SAAS;IACjC,CAAC;EACJ;EAEA,MAAM,gBAAgB,KAAa,IAA2B;AAC3D,WAAO,KAAK,MAAM,KAAK,GAAG,eAAe,EAAE,IAAI;MAC5C,QAAQ;IACX,CAAC;EACJ;AACH;ACqCO,IAAM,uBAAN,cAAmC,cAAc;;;;EAIrD,MAAM,YAAqC;AACxC,WAAO,KAAK,MAAsB,4BAA4B;EACjE;;;;EAKA,MAAM,gBAAgB,SAA2C;AAC9D,WAAO,KAAK,MAAuB,8BAA8B,OAAO,UAAU;EACrF;;;;EAKA,MAAM,cAAc,QAAuD;AACxE,WAAO,KAAK,MAAuB,gCAAgC;MAChE,QAAQ;MACR,MAAM,KAAK,UAAU,MAAM;IAC9B,CAAC;EACJ;;;;EAKA,MAAM,cAAc,WAAoE;AACrF,WAAO,KAAK;MACT,gCAAgC,SAAS;MACzC,EAAE,QAAQ,SAAS;IACtB;EACH;;;;;EAMA,MAAM,WAAW,SAAiB,WAA4C;AAC3E,WAAO,KAAK;MACT,8BAA8B,OAAO,aAAa,SAAS;IAC9D;EACH;;;;EAKA,MAAM,eAAe,SAA0C;AAC5D,WAAO,KAAK,MAAsB,8BAA8B,OAAO,SAAS;EACnF;;;;EAKA,MAAM,qBAAuD;AAC1D,WAAO,KAAK,MAA+B,kCAAkC;EAChF;AACH;ACvHO,IAAM,uBAAN,cAAmC,cAAc;EACrD,MAAM,qBAAqB,KAA0C;AAClE,WAAO,KAAK,MAA0B,KAAK,GAAG,qBAAqB;EACtE;EAEA,MAAM,uBACH,KACA,MAC0B;AAC1B,WAAO,KAAK,MAAwB,KAAK,GAAG,uBAAuB;MAChE,QAAQ;MACR,MAAM,KAAK,UAAU,IAAI;IAC5B,CAAC;EACJ;EAEA,MAAM,uBACH,KACA,QACA,MAC0B;AAC1B,WAAO,KAAK,MAAwB,KAAK,GAAG,uBAAuB,MAAM,IAAI;MAC1E,QAAQ;MACR,MAAM,KAAK,UAAU,IAAI;IAC5B,CAAC;EACJ;EAEA,MAAM,uBAAuB,KAAa,QAA8C;AACrF,WAAO,KAAK,MAA2B,KAAK,GAAG,uBAAuB,MAAM,IAAI;MAC7E,QAAQ;IACX,CAAC;EACJ;AACH;ACpDO,IAAM,cAAN,cAA0B,cAAc;EAC5C,MAAM,kBAAkB,KAAuC;AAC5D,WAAO,KAAK,MAAuB,KAAK,GAAG,kBAAkB;EAChE;EAEA,MAAM,iBAAiB,KAAa,SAAyC;AAC1E,WAAO,KAAK,MAAqB,KAAK,GAAG,oBAAoB,OAAO,EAAE;EACzE;EAEA,MAAM,oBACH,KACA,MACuB;AACvB,WAAO,KAAK,MAAqB,KAAK,GAAG,oBAAoB;MAC1D,QAAQ;MACR,MAAM,KAAK,UAAU,IAAI;IAC5B,CAAC;EACJ;EAEA,MAAM,oBACH,KACA,SACA,MACuB;AACvB,WAAO,KAAK,MAAqB,KAAK,GAAG,oBAAoB,OAAO,IAAI;MACrE,QAAQ;MACR,MAAM,KAAK,UAAU,IAAI;IAC5B,CAAC;EACJ;EAEA,MAAM,oBAAoB,KAAa,SAAgC;AACpE,WAAO,KAAK,MAAM,KAAK,GAAG,oBAAoB,OAAO,IAAI;MACtD,QAAQ;IACX,CAAC;EACJ;EAEA,MAAM,eACH,KACA,SACA,MAC6B;AAC7B,WAAO,KAAK,MAA2B,KAAK,GAAG,oBAAoB,OAAO,YAAY;MACnF,QAAQ;MACR,MAAM,KAAK,UAAU,IAAI;IAC5B,CAAC;EACJ;EAEA,MAAM,kBAAkB,KAAa,SAAiB,UAAiC;AACpF,WAAO,KAAK,MAAM,KAAK,GAAG,oBAAoB,OAAO,YAAY,QAAQ,IAAI;MAC1E,QAAQ;IACX,CAAC;EACJ;EAEA,MAAM,iBAAiB,KAA6C;AACjE,WAAO,KAAK,MAA6B,KAAK,GAAG,gBAAgB;EACpE;EAEA,MAAM,kBAAkB,KAA8C;AACnE,WAAO,KAAK,MAA8B,KAAK,GAAG,cAAc;EACnE;EAEA,MAAM,mBAAmB,KAAuC;AAC7D,WAAO,KAAK,MAAuB,KAAK,GAAG,6BAA6B;MACrE,QAAQ;IACX,CAAC;EACJ;;EAIA,MAAM,wBACH,KACA,QACA,QAAQ,IACR,SAAS,GACc;AACvB,WAAO,KAAK;MACT,KAAK,GAAG,mBAAmB,MAAM,mBAAmB,KAAK,WAAW,MAAM;IAC7E;EACH;EAEA,MAAM,oBACH,KACA,QACA,SAOA;AACA,WAAO,KAAK,MAAM,KAAK,GAAG,mBAAmB,MAAM,aAAa;MAC7D,QAAQ;MACR,MAAM,KAAK,UAAU,EAAE,QAAQ,CAAC;IACnC,CAAC;EACJ;AACH;AC3FA,SAAS,aACN,cACA,QACO;AAKP,MAAI,iBAAiB,mBAAmB;AACrC,WAAO,yBAAyB,MAAM;EACzC,WAAW,iBAAiB,SAAS;AAClC,WAAO,sBAAsB,MAAM;EACtC,WAAW,iBAAiB,UAAU;AACnC,WAAO,gBAAgB,MAAM;EAChC,OAAO;AACJ,WAAO,SAAS,YAAY,IAAI,MAAM;EACzC;AACH;AAKO,IAAM,sBAAN,cAAkC,cAAc;;;;EAIpD,MAAM,oBACH,cACsC;AACtC,UAAM,OAAO,aAAa,cAAc,QAAQ;AAChD,WAAO,KAAK,UAAwC,IAAI;EAC3D;;;;EAKA,MAAM,oBAAoB,cAAkE;AACzF,UAAM,OAAO,aAAa,cAAc,WAAW;AACnD,WAAO,KAAK,UAAkC,IAAI;EACrD;;;;EAKA,MAAM,WAAW,cAAgD;AAC9D,UAAM,OAAO,aAAa,cAAc,YAAY;AACpD,WAAO,KAAK,UAAgB,MAAM,EAAE,QAAQ,SAAS,CAAC;EACzD;AACH;AAuDO,IAAM,WAAN,cAAuB,cAAc;;;;;;;EAOzC,MAAM,qBAAkD;AACrD,WAAO,KAAK,MAA0B,cAAc;EACvD;;;;;EAMA,MAAM,UAAU,SAAuD;AACpE,WAAO,KAAK,MAAyB,mBAAmB;MACrD,QAAQ;MACR,MAAM,KAAK,UAAU,OAAO;IAC/B,CAAC;EACJ;;;;EAKA,MAAM,mBAAmB,SAA+C;AAErE,UAAM,WAAW,IAAI,gBAAgB;AACrC,aAAS,OAAO,cAAc,QAAQ,UAAU;AAChD,QAAI,QAAQ,KAAM,UAAS,OAAO,QAAQ,QAAQ,IAAI;AACtD,QAAI,QAAQ,cAAe,UAAS,OAAO,iBAAiB,QAAQ,aAAa;AACjF,aAAS,OAAO,aAAa,QAAQ,SAAS;AAC9C,aAAS,OAAO,iBAAiB,QAAQ,aAAa;AACtD,QAAI,QAAQ,aAAc,UAAS,OAAO,gBAAgB,QAAQ,YAAY;AAC9E,QAAI,QAAQ,cAAe,UAAS,OAAO,iBAAiB,QAAQ,aAAa;AAEjF,WAAO,KAAK,MAAqB,eAAe;MAC7C,QAAQ;MACR,SAAS;QACN,gBAAgB;MACnB;MACA,MAAM,SAAS,SAAS;IAC3B,CAAC;EACJ;AACH;AC3JO,IAAM,kBAAN,cAA8B,cAAc;EAChD,MAAM,gBAAgB,KAAqC;AACxD,WAAO,KAAK,MAAqB,KAAK,GAAG,gBAAgB;EAC5D;EAEA,MAAM,yBACH,KAC8D;AAC9D,WAAO,KAAK;MACT,KAAK,GAAG;IACX;EACH;EAEA,MAAM,mBACH,KACA,aAC6C;AAC7C,WAAO,KAAK,MAA2C,KAAK,GAAG,0BAA0B;MACtF,QAAQ;MACR,MAAM,KAAK,UAAU,EAAE,cAAc,YAAY,CAAC;IACrD,CAAC;EACJ;EAEA,MAAM,eAAe,KAAa,IAAkC;AACjE,WAAO,KAAK,MAAmB,KAAK,GAAG,kBAAkB,EAAE,EAAE;EAChE;EAEA,MAAM,kBAAkB,KAAa,aAAwD;AAC1F,WAAO,KAAK,MAAmB,KAAK,GAAG,kBAAkB;MACtD,QAAQ;MACR,MAAM,KAAK,UAAU,WAAW;IACnC,CAAC;EACJ;EAEA,MAAM,kBACH,KACA,IACA,aACqB;AACrB,WAAO,KAAK,MAAmB,KAAK,GAAG,kBAAkB,EAAE,IAAI;MAC5D,QAAQ;MACR,MAAM,KAAK,UAAU,WAAW;IACnC,CAAC;EACJ;EAEA,MAAM,kBAAkB,KAAa,IAA2B;AAC7D,WAAO,KAAK,MAAM,KAAK,GAAG,kBAAkB,EAAE,IAAI;MAC/C,QAAQ;IACX,CAAC;EACJ;EAEA,MAAM,oBACH,KACA,IACA,OAAe,GACf,WAAmB,IACmB;AACtC,WAAO,KAAK;MACT,KAAK,GAAG,kBAAkB,EAAE,eAAe,IAAI,aAAa,QAAQ;IACvE;EACH;EAEA,MAAM,uBACH,KACA,IACA,OAAe,GACf,WAAmB,IACoB;AACvC,WAAO,KAAK;MACT,KAAK,GAAG,kBAAkB,EAAE,kBAAkB,IAAI,aAAa,QAAQ;IAC1E;EACH;AACH;ACvEO,IAAM,oBAAN,cAAgC,cAAc;EAClD,MAAM,wBACH,SACA,UAA6D,CAAC,GAChC;AAC9B,UAAM,SAAS,IAAI,gBAAgB;AACnC,QAAI,QAAQ,MAAO,QAAO,OAAO,SAAS,QAAQ,KAAK;AACvD,QAAI,QAAQ,UAAW,QAAO,OAAO,aAAa,QAAQ,UAAU,SAAS,CAAC;AAC9E,UAAM,WAAW,MAAM,KAAK;MACzB,KAAK,OAAO,kBAAkB,OAAO,SAAS,IAAI,IAAI,OAAO,SAAS,CAAC,KAAK,EAAE;IACjF;AACA,WAAO,SAAS;EACnB;EAEA,MAAM,yBACH,SACA,MAC4B;AAC5B,WAAO,KAAK,MAA0B,KAAK,OAAO,mBAAmB;MAClE,QAAQ;MACR,MAAM,KAAK,UAAU,IAAI;IAC5B,CAAC;EACJ;EAEA,MAAM,yBACH,SACA,IACA,MAC4B;AAC5B,WAAO,KAAK,MAA0B,KAAK,OAAO,mBAAmB,EAAE,IAAI;MACxE,QAAQ;MACR,MAAM,KAAK,UAAU,IAAI;IAC5B,CAAC;EACJ;EAEA,MAAM,yBAAyB,SAAiB,IAA2B;AACxE,WAAO,KAAK,MAAM,KAAK,OAAO,mBAAmB,EAAE,IAAI;MACpD,QAAQ;IACX,CAAC;EACJ;EAEA,MAAM,2BACH,SACqD;AACrD,WAAO,KAAK,MAAM,KAAK,OAAO,wBAAwB;EACzD;EAEA,MAAM,2BACH,SACA,SACmC;AACnC,WAAO,KAAK,MAAiC,KAAK,OAAO,0BAA0B;MAChF,QAAQ;MACR,MAAM,KAAK,UAAU,EAAE,QAAQ,CAAC;IACnC,CAAC;EACJ;EAEA,MAAM,sBAAqD;AACxD,UAAM,WAAW,MAAM,KAAK;MACzB;IACH;AACA,WAAO,SAAS;EACnB;EAEA,MAAM,sBACH,MAC4B;AAC5B,WAAO,KAAK,MAA0B,0BAA0B;MAC7D,QAAQ;MACR,MAAM,KAAK,UAAU,IAAI;IAC5B,CAAC;EACJ;EAEA,MAAM,sBACH,IACA,MAC4B;AAC5B,WAAO,KAAK,MAA0B,0BAA0B,EAAE,IAAI;MACnE,QAAQ;MACR,MAAM,KAAK,UAAU,IAAI;IAC5B,CAAC;EACJ;EAEA,MAAM,sBAAsB,IAA2B;AACpD,WAAO,KAAK,MAAM,0BAA0B,EAAE,IAAI;MAC/C,QAAQ;IACX,CAAC;EACJ;EAEA,MAAM,sBAAsB,MAAc,UAAsC;AAC7E,UAAM,WAAW,MAAM,KAAK;MACzB;MACA;QACG,QAAQ;QACR,MAAM,KAAK,UAAU,EAAE,MAAM,GAAI,YAAY,EAAE,SAAS,EAAG,CAAC;MAC/D;IACH;AACA,WAAO,SAAS;EACnB;EAEA,MAAM,uBAAoD;AACvD,UAAM,WAAW,MAAM,KAAK;MACzB;IACH;AACA,WAAO,SAAS;EACnB;EAEA,MAAM,qBAAqB,MAGF;AACtB,UAAM,WAAW,MAAM,KAAK,SAAS,kCAAkC;MACpE,QAAQ;MACR,SAAS,EAAE,gBAAgB,mBAAmB;MAC9C,MAAM,KAAK,UAAU;QAClB,YAAY,KAAK;QACjB,aAAa,KAAK;MACrB,CAAC;IACJ,CAAC;AACD,WAAO,SAAS,YAAY;EAC/B;AACH;AC/GO,IAAM,oBAAN,cAAgC,cAAc;EAClD,MAAM,kBAAkB,KAAuC;AAC5D,WAAO,KAAK,MAAuB,KAAK,GAAG,iBAAiB;EAC/D;EAEA,MAAM,iBAAiB,KAAa,IAAoC;AACrE,WAAO,KAAK,MAAqB,KAAK,GAAG,mBAAmB,EAAE,EAAE;EACnE;EAEA,MAAM,oBACH,KACA,MACuB;AACvB,WAAO,KAAK,MAAqB,KAAK,GAAG,mBAAmB;MACzD,QAAQ;MACR,MAAM,KAAK,UAAU,IAAI;IAC5B,CAAC;EACJ;EAEA,MAAM,oBACH,KACA,IACA,MACuB;AACvB,WAAO,KAAK,MAAqB,KAAK,GAAG,mBAAmB,EAAE,IAAI;MAC/D,QAAQ;MACR,MAAM,KAAK,UAAU,IAAI;IAC5B,CAAC;EACJ;EAEA,MAAM,wBACH,KACA,IACA,QACqD;AACrD,UAAM,eAAe,IAAI,gBAAgB;AACzC,QAAI,QAAQ,OAAQ,cAAa,IAAI,UAAU,OAAO,MAAM;AAC5D,QAAI,QAAQ,WAAY,cAAa,IAAI,cAAc,OAAO,UAAU;AACxE,QAAI,QAAQ,KAAM,cAAa,IAAI,QAAQ,OAAO,KAAK,SAAS,CAAC;AACjE,QAAI,QAAQ,SAAU,cAAa,IAAI,YAAY,OAAO,SAAS,SAAS,CAAC;AAC7E,UAAM,KAAK,aAAa,SAAS;AACjC,WAAO,KAAK;MACT,KAAK,GAAG,mBAAmB,EAAE,WAAW,KAAK,IAAI,EAAE,KAAK,EAAE;IAC7D;EACH;EAEA,MAAM,qBAAqB,KAAa,IAA2B;AAChE,WAAO,KAAK,MAAM,KAAK,GAAG,mBAAmB,EAAE,IAAI;MAChD,QAAQ;IACX,CAAC;EACJ;EAEA,MAAM,wBAAwB,KAAa,UAAkD;AAC1F,WAAO,KAAK;MACT,KAAK,GAAG,2BAA2B,QAAQ;IAC9C;EACH;EAEA,MAAM,oBACH,KACA,UACA,MAC6B;AAC7B,WAAO,KAAK;MACT,KAAK,GAAG,2BAA2B,QAAQ;MAC3C;QACG,QAAQ;QACR,MAAM,KAAK,UAAU,IAAI;MAC5B;IACH;EACH;EAEA,MAAM,0BACH,KACA,UACA,iBACA,MAC6B;AAC7B,WAAO,KAAK;MACT,KAAK,GAAG,2BAA2B,QAAQ,mBAAmB,eAAe;MAC7E;QACG,QAAQ;QACR,MAAM,KAAK,UAAU,IAAI;MAC5B;IACH;EACH;EAEA,MAAM,0BACH,KACA,UACA,iBACc;AACd,WAAO,KAAK;MACT,KAAK,GAAG,2BAA2B,QAAQ,mBAAmB,eAAe;MAC7E;QACG,QAAQ;MACX;IACH;EACH;EAEA,MAAM,0BACH,KACA,UACA,iBACuC;AACvC,WAAO,KAAK;MACT,KAAK,GAAG,2BAA2B,QAAQ,mBAAmB,eAAe;IAChF;EACH;;EAIA,MAAM,iBACH,KACA,iBACoC;AACpC,WAAO,KAAK;MACT,KAAK,GAAG,mBAAmB,eAAe;IAC7C;EACH;EAEA,MAAM,kBACH,KACA,iBACA,MACkC;AAClC,WAAO,KAAK;MACT,KAAK,GAAG,mBAAmB,eAAe;MAC1C;QACG,QAAQ;QACR,MAAM,KAAK,UAAU,IAAI;MAC5B;IACH;EACH;EAEA,MAAM,eAAe,KAAa,eAA0D;AACzF,WAAO,KAAK;MACT,KAAK,GAAG,gCAAgC,aAAa;IACxD;EACH;EAEA,MAAM,kBACH,KACA,eACA,MACkC;AAClC,WAAO,KAAK;MACT,KAAK,GAAG,gCAAgC,aAAa;MACrD;QACG,QAAQ;QACR,MAAM,KAAK,UAAU,IAAI;MAC5B;IACH;EACH;EAEA,MAAM,kBAAkB,KAAa,eAAsC;AACxE,WAAO,KAAK,MAAM,KAAK,GAAG,gCAAgC,aAAa,IAAI;MACxE,QAAQ;IACX,CAAC;EACJ;;EAIA,MAAM,gBACH,KACA,iBACA,QACmC;AACnC,UAAM,eAAe,IAAI,gBAAgB;AACzC,QAAI,QAAQ,OAAQ,cAAa,IAAI,UAAU,OAAO,MAAM;AAC5D,QAAI,QAAQ,SAAU,cAAa,IAAI,YAAY,OAAO,SAAS,SAAS,CAAC;AAC7E,UAAM,KAAK,aAAa,SAAS;AACjC,WAAO,KAAK;MACT,KAAK,GAAG,mBAAmB,eAAe,eAAe,KAAK,IAAI,EAAE,KAAK,EAAE;IAC9E;EACH;EAEA,MAAM,cAAc,KAAa,cAAwD;AACtF,WAAO,KAAK;MACT,KAAK,GAAG,+BAA+B,YAAY;IACtD;EACH;EAEA,MAAM,aACH,KACA,eACA,MACiC;AACjC,WAAO,KAAK;MACT,KAAK,GAAG,gCAAgC,aAAa;MACrD;QACG,QAAQ;QACR,MAAM,KAAK,UAAU,IAAI;MAC5B;IACH;EACH;EAEA,MAAM,cAAc,KAAa,eAAyD;AACvF,WAAO,KAAK;MACT,KAAK,GAAG,gCAAgC,aAAa;MACrD;QACG,QAAQ;MACX;IACH;EACH;EAEA,MAAM,gBAAgB,KAAa,cAAqC;AACrE,UAAM,KAAK,MAAM,KAAK,GAAG,+BAA+B,YAAY,UAAU;MAC3E,QAAQ;IACX,CAAC;EACJ;EAEA,MAAM,gBAAgB,KAAa,iBAAuD;AACvF,WAAO,KAAK;MACT,KAAK,GAAG,6CAA6C,eAAe;MACpE;QACG,QAAQ;MACX;IACH;EACH;EAEA,MAAM,iBACH,KACA,cACA,MACiC;AACjC,WAAO,KAAK;MACT,KAAK,GAAG,+BAA+B,YAAY;MACnD;QACG,QAAQ;QACR,MAAM,KAAK,UAAU,IAAI;MAC5B;IACH;EACH;EAEA,MAAM,uBACH,KACA,cACA,aACA,MACiC;AACjC,WAAO,KAAK;MACT,KAAK,GAAG,+BAA+B,YAAY,aAAa,WAAW;MAC3E;QACG,QAAQ;QACR,MAAM,KAAK,UAAU,IAAI;MAC5B;IACH;EACH;AACH;AC9CO,IAAM,aAAN,cAAyB,cAAc;EAC3C,MAAM,iBAAiB,KAAa,QAAsD;AACvF,UAAM,cAAc,IAAI,gBAAgB;AACxC,QAAI,QAAQ,YAAY;AACrB,kBAAY,OAAO,cAAc,OAAO,UAAU;IACrD;AACA,QAAI,QAAQ,UAAU;AACnB,kBAAY,OAAO,YAAY,OAAO,QAAQ;IACjD;AAEA,UAAM,cAAc,YAAY,SAAS;AACzC,UAAM,MAAM,KAAK,GAAG,oBAAoB,cAAc,IAAI,WAAW,KAAK,EAAE;AAE5E,WAAO,KAAK,MAAqB,GAAG;EACvC;EAEA,MAAM,kBAAkB,KAAa,QAAwD;AAC1F,UAAM,cAAc,IAAI,gBAAgB;AACxC,QAAI,QAAQ,YAAY;AACrB,kBAAY,OAAO,cAAc,OAAO,UAAU;IACrD;AACA,QAAI,QAAQ,UAAU;AACnB,kBAAY,OAAO,YAAY,OAAO,QAAQ;IACjD;AAEA,UAAM,cAAc,YAAY,SAAS;AACzC,UAAM,MAAM,KAAK,GAAG,qBAAqB,cAAc,IAAI,WAAW,KAAK,EAAE;AAE7E,WAAO,KAAK,MAAsB,GAAG;EACxC;EAEA,MAAM,oBACH,KACA,QAC0B;AAC1B,UAAM,cAAc,IAAI,gBAAgB;AACxC,QAAI,QAAQ,YAAY;AACrB,kBAAY,OAAO,cAAc,OAAO,UAAU;IACrD;AACA,QAAI,QAAQ,UAAU;AACnB,kBAAY,OAAO,YAAY,OAAO,QAAQ;IACjD;AAEA,UAAM,cAAc,YAAY,SAAS;AACzC,UAAM,MAAM,KAAK,GAAG,uBAAuB,cAAc,IAAI,WAAW,KAAK,EAAE;AAE/E,WAAO,KAAK,MAAwB,GAAG;EAC1C;EAEA,MAAM,eACH,KACA,UACA,QAC2B;AAC3B,UAAM,cAAc,IAAI,gBAAgB;AACxC,QAAI,QAAQ,YAAY;AACrB,kBAAY,OAAO,cAAc,OAAO,UAAU;IACrD;AACA,QAAI,QAAQ,UAAU;AACnB,kBAAY,OAAO,YAAY,OAAO,QAAQ;IACjD;AAEA,UAAM,cAAc,YAAY,SAAS;AACzC,UAAM,MAAM,KAAK,GAAG,yBAAyB,QAAQ,GAAG,cAAc,IAAI,WAAW,KAAK,EAAE;AAE5F,WAAO,KAAK,MAAyB,GAAG;EAC3C;EAEA,MAAM,oBACH,KACA,QAC0B;AAC1B,UAAM,cAAc,IAAI,gBAAgB;AACxC,QAAI,QAAQ,YAAY;AACrB,kBAAY,OAAO,cAAc,OAAO,UAAU;IACrD;AACA,QAAI,QAAQ,UAAU;AACnB,kBAAY,OAAO,YAAY,OAAO,QAAQ;IACjD;AAEA,UAAM,cAAc,YAAY,SAAS;AACzC,UAAM,MAAM,KAAK,GAAG,uBAAuB,cAAc,IAAI,WAAW,KAAK,EAAE;AAE/E,WAAO,KAAK,MAAwB,GAAG;EAC1C;AACH;AChSO,IAAM,WAAN,cAAuB,cAAc;EACzC,MAAM,SAAS,KAA8B;AAC1C,WAAO,KAAK,MAAc,KAAK,GAAG,QAAQ;EAC7C;EAEA,MAAM,0BACH,KACA,MACA,WAA0B,MACI;AAC9B,UAAM,SAAS,IAAI,gBAAgB;AACnC,QAAI,SAAU,QAAO,OAAO,aAAa,QAAQ;AACjD,WAAO,KAAK;MACT,KAAK,GAAG,oBAAoB,IAAI,IAAI,OAAO,SAAS,CAAC;IACxD;EACH;EAEA,MAAM,4BACH,KACA,QACA,WAA0B,MACG;AAC7B,UAAM,SAAS,IAAI,gBAAgB;AACnC,QAAI,SAAU,QAAO,OAAO,aAAa,QAAQ;AACjD,WAAO,KAAK;MACT,KAAK,GAAG,2BAA2B,MAAM,IAAI,OAAO,SAAS,CAAC;IACjE;EACH;EAEA,MAAM,QAAQ,KAAa,IAA2B;AACnD,WAAO,KAAK,MAAY,KAAK,GAAG,UAAU,EAAE,EAAE;EACjD;EAEA,MAAM,cAAc,KAAa,MAA6B;AAC3D,WAAO,KAAK,MAAY,KAAK,GAAG,IAAI,IAAI,EAAE;EAC7C;EAEA,MAAM,oBACH,KACA,UACA,cACsB;AACtB,WAAO,KAAK,MAAoB,KAAK,GAAG,IAAI,QAAQ,UAAU,YAAY,EAAE;EAC/E;EAEA,MAAM,oBAAoB,KAAa,UAAqC;AAEzE,WAAO,KAAK,MAAgB,KAAK,GAAG,IAAI,QAAQ,OAAO;EAC1D;EAEA,MAAM,WAAW,KAAa,UAA+C;AAC1E,WAAO,KAAK,MAA0B,KAAK,GAAG,IAAI,QAAQ,WAAW;MAClE,QAAQ;IACX,CAAC;EACJ;;EAGA,MAAM,kBACH,KACA,UACA,aAC+C;AAC/C,WAAO,KAAK;MACT,KAAK,GAAG,IAAI,QAAQ;MACpB;QACG,QAAQ;QACR,MAAM,KAAK,UAAU,EAAE,YAAY,CAAC;MACvC;IACH;EACH;EAEA,MAAM,kBACH,KACA,UACA,OAC+C;AAC/C,WAAO,KAAK;MACT,KAAK,GAAG,IAAI,QAAQ;MACpB;QACG,QAAQ;QACR,MAAM,KAAK,UAAU,EAAE,MAAM,CAAC;MACjC;IACH;EACH;EAEA,MAAM,eACH,KACA,UACA,MACA,aACA,OACiE;AAEjE,UAAM,iBAAiB,MAAM,KAAK,MAI/B,KAAK,GAAG,IAAI,QAAQ,gBAAgB;MACpC,QAAQ;MACR,MAAM,KAAK,UAAU,EAAE,MAAM,aAAa,MAAM,CAAC;IACpD,CAAC;AAGD,UAAM,mBAAmB,MAAM,MAAM,sBAAsB;MACxD,QAAQ;MACR,SAAS,EAAE,gBAAgB,mBAAmB;MAC9C,MAAM,KAAK,UAAU,EAAE,OAAO,eAAe,MAAM,CAAC;IACvD,CAAC;AAED,QAAI,CAAC,iBAAiB,IAAI;AACvB,YAAM,IAAI,MAAM,mCAAmC;IACtD;AAEA,WAAO;EACV;EAEA,MAAM,UAAU,KAAa,QAA+B;AACzD,WAAO,KAAK,MAAY,KAAK,GAAG,UAAU,MAAM,UAAU;MACvD,QAAQ;IACX,CAAC;EACJ;EAEA,MAAM,WAAW,KAAa,MAAmC;AAC9D,WAAO,KAAK,MAAY,KAAK,GAAG,UAAU;MACvC,QAAQ;MACR,MAAM,KAAK,UAAU,IAAI;IAC5B,CAAC;EACJ;EAEA,MAAM,WAAW,KAAa,IAAY,MAA4C;AACnF,WAAO,KAAK,MAAY,KAAK,GAAG,UAAU,EAAE,IAAI;MAC7C,QAAQ;MACR,MAAM,KAAK,UAAU,IAAI;IAC5B,CAAC;EACJ;EAEA,MAAM,WAAW,KAAa,IAA2B;AACtD,WAAO,KAAK,MAAM,KAAK,GAAG,UAAU,EAAE,IAAI;MACvC,QAAQ;IACX,CAAC;EACJ;EAEA,MAAM,aACH,KACA,QACA,UAA4B,CAAC,GACI;AACjC,UAAM,SAAS,IAAI,gBAAgB;AACnC,QAAI,QAAQ,KAAM,QAAO,OAAO,QAAQ,QAAQ,KAAK,SAAS,CAAC;AAC/D,QAAI,QAAQ,SAAU,QAAO,OAAO,YAAY,QAAQ,SAAS,SAAS,CAAC;AAC3E,QAAI,QAAQ,OAAQ,QAAO,OAAO,UAAU,QAAQ,MAAM;AAC1D,QAAI,QAAQ,UAAW,QAAO,OAAO,aAAa,QAAQ,SAAS;AACnE,QAAI,QAAQ,OAAQ,QAAO,OAAO,UAAU,QAAQ,MAAM;AAE1D,WAAO,KAAK;MACT,KAAK,GAAG,UAAU,MAAM,SAAS,OAAO,SAAS,IAAI,IAAI,OAAO,SAAS,CAAC,KAAK,EAAE;IACpF;EACH;EAEA,MAAM,QAAQ,KAAa,QAAgB,QAA+B;AACvE,WAAO,KAAK,MAAY,KAAK,GAAG,UAAU,MAAM,UAAU,MAAM,EAAE;EACrE;EAEA,MAAM,cAAc,KAAa,QAAgB,MAA6B;AAC3E,WAAO,KAAK,MAAY,KAAK,GAAG,UAAU,MAAM,kBAAkB,IAAI,EAAE;EAC3E;EAEA,MAAM,WAAW,KAAa,QAAgB,MAAmC;AAC9E,WAAO,KAAK,MAAY,KAAK,GAAG,UAAU,MAAM,UAAU;MACvD,QAAQ;MACR,MAAM,KAAK,UAAU,IAAI;IAC5B,CAAC;EACJ;EAEA,MAAM,WACH,KACA,QACA,QACA,MACc;AACd,WAAO,KAAK,MAAY,KAAK,GAAG,UAAU,MAAM,UAAU,MAAM,IAAI;MACjE,QAAQ;MACR,MAAM,KAAK,UAAU,IAAI;IAC5B,CAAC;EACJ;EAEA,MAAM,WAAW,KAAa,QAAgB,QAA+B;AAC1E,WAAO,KAAK,MAAM,KAAK,GAAG,UAAU,MAAM,UAAU,MAAM,IAAI;MAC3D,QAAQ;IACX,CAAC;EACJ;EAEA,MAAM,cAAc,KAAa,QAA6C;AAC3E,WAAO,KAAK,MAA0B,KAAK,GAAG,UAAU,MAAM,SAAS;EAC1E;;EAGA,MAAM,YAAY,KAAa,QAAmC;AAC/D,WAAO,KAAK,MAAgB,KAAK,GAAG,UAAU,MAAM,OAAO;EAC9D;EAEA,MAAM,aAAa,KAAa,QAAgB,UAA+C;AAC5F,UAAM,SAAS,IAAI,gBAAgB;AACnC,QAAI,aAAa,UAAa,aAAa,MAAM;AAC9C,aAAO,OAAO,aAAa,SAAS,SAAS,CAAC;IACjD;AACA,UAAM,QAAQ,OAAO,SAAS;AAC9B,WAAO,KAAK;MACT,KAAK,GAAG,UAAU,MAAM,cAAc,QAAQ,IAAI,KAAK,KAAK,EAAE;IACjE;EACH;EAEA,MAAM,eAAe,KAAa,QAAgB,MAA2C;AAC1F,WAAO,KAAK,MAAgB,KAAK,GAAG,UAAU,MAAM,eAAe;MAChE,QAAQ;MACR,MAAM,KAAK,UAAU,IAAI;IAC5B,CAAC;EACJ;EAEA,MAAM,eACH,KACA,QACA,QACA,MACkB;AAClB,WAAO,KAAK,MAAgB,KAAK,GAAG,UAAU,MAAM,eAAe,MAAM,IAAI;MAC1E,QAAQ;MACR,MAAM,KAAK,UAAU,IAAI;IAC5B,CAAC;EACJ;EAEA,MAAM,eAAe,KAAa,QAAgB,QAA+B;AAC9E,WAAO,KAAK,MAAM,KAAK,GAAG,UAAU,MAAM,eAAe,MAAM,IAAI;MAChE,QAAQ;IACX,CAAC;EACJ;EAEA,MAAM,iBAAiB,KAAa,QAAgB,MAA2C;AAC5F,WAAO,KAAK,MAAM,KAAK,GAAG,UAAU,MAAM,iBAAiB;MACxD,QAAQ;MACR,MAAM,KAAK,UAAU,IAAI;IAC5B,CAAC;EACJ;;EAGA,MAAM,2BACH,KACA,QACA,eAC4B;AAC5B,WAAO,KAAK,MAA0B,KAAK,GAAG,UAAU,MAAM,qBAAqB;MAChF,QAAQ;MACR,MAAM,KAAK,UAAU,aAAa;IACrC,CAAC;EACJ;EAEA,MAAM,wBACH,KACA,UACA,QACsC;AACtC,UAAM,SAAS,IAAI,gBAAgB,EAAE,OAAO,CAAC;AAC7C,WAAO,KAAK;MACT,KAAK,GAAG,IAAI,QAAQ,yBAAyB,OAAO,SAAS,CAAC;IACjE;EACH;AACH;AC3RO,IAAM,mBAAN,cAA+B,cAAc;EACjD,MAAM,mBAA4C;AAC/C,WAAO,KAAK,MAAsB,eAAe;EACpD;EAEA,MAAM,0BAA0B,KAAsC;AACnE,WAAO,KAAK,MAAsB,KAAK,GAAG,gBAAgB;EAC7D;EAEA,MAAM,mBAAmB,gBAAuC;AAC7D,WAAO,KAAK,MAAM,iBAAiB,cAAc,WAAW;MACzD,QAAQ;MACR,aAAa;IAChB,CAAC;EACJ;EAEA,MAAM,uBAAuB,gBAAsD;AAChF,WAAO,KAAK,MAAM,iBAAiB,cAAc,eAAe;MAC7D,QAAQ;MACR,aAAa;IAChB,CAAC;EACJ;EAEA,MAAM,mBACH,gBACA,SAI6B;AAC7B,WAAO,KAAK,MAAM,iBAAiB,cAAc,IAAI;MAClD,QAAQ;MACR,aAAa;MACb,MAAM,KAAK,UAAU,OAAO;MAC5B,SAAS;QACN,gBAAgB;MACnB;IACH,CAAC;EACJ;EAEA,MAAM,oBAAoB,gBAAsD;AAC7E,WAAO,KAAK,MAAM,iBAAiB,cAAc,mBAAmB;MACjE,QAAQ;MACR,aAAa;IAChB,CAAC;EACJ;AACH;AC9CO,IAAM,WAAN,cAAuB,cAAc;EACzC,MAAM,SACH,KACA,UAGI,CAAC,GACW;AAChB,UAAM,SAAS,IAAI,gBAAgB;AACnC,QAAI,QAAQ,iBAAiB;AAC1B,aAAO,OAAO,oBAAoB,MAAM;IAC3C;AACA,QAAI,QAAQ,YAAY;AACrB,aAAO,OAAO,eAAe,QAAQ,WAAW,SAAS,CAAC;IAC7D;AACA,WAAO,KAAK;MACT,KAAK,GAAG,SAAS,OAAO,SAAS,IAAI,IAAI,OAAO,SAAS,CAAC,KAAK,EAAE;IACpE;EACH;EAEA,MAAM,QAAQ,KAAa,IAAoC;AAC5D,WAAO,KAAK,MAAY,KAAK,GAAG,UAAU,EAAE,EAAE;EACjD;EAEA,MAAM,WAAW,KAAa,MAAmC;AAC9D,WAAO,KAAK,MAAY,KAAK,GAAG,UAAU;MACvC,QAAQ;MACR,MAAM,KAAK,UAAU,IAAI;IAC5B,CAAC;EACJ;EAEA,MAAM,WAAW,KAAa,IAAY,MAA4C;AACnF,WAAO,KAAK,MAAY,KAAK,GAAG,UAAU,EAAE,IAAI;MAC7C,QAAQ;MACR,MAAM,KAAK,UAAU,IAAI;IAC5B,CAAC;EACJ;EAEA,MAAM,WAAW,KAAa,IAA2B;AACtD,WAAO,KAAK,MAAM,KAAK,GAAG,UAAU,EAAE,IAAI;MACvC,QAAQ;IACX,CAAC;EACJ;EAEA,MAAM,YAAY,KAAa,IAA2B;AACvD,WAAO,KAAK,MAAY,KAAK,GAAG,UAAU,EAAE,YAAY;MACrD,QAAQ;IACX,CAAC;EACJ;EAEA,MAAM,cAAc,KAAa,IAA2B;AACzD,WAAO,KAAK,MAAY,KAAK,GAAG,UAAU,EAAE,cAAc;MACvD,QAAQ;IACX,CAAC;EACJ;;;;;;;;EASA,MAAM,mBACH,KACA,QAC2E;AAC3E,WAAO,KAAK;MACT,KAAK,GAAG,UAAU,MAAM;MACxB,EAAE,QAAQ,OAAO;IACpB;EACH;;;;;;;;;;;EAYA,MAAM,UAAU,KAAa,QAAgB,MAAc,MAA8B;AACtF,WAAO,KAAK,MAAY,KAAK,GAAG,UAAU,MAAM,UAAU;MACvD,QAAQ;MACR,MAAM,KAAK,UAAU,EAAE,MAAM,KAAK,CAAC;IACtC,CAAC;EACJ;AACH;ACtFO,IAAM,cAAN,cAA0B,cAAc;;;;EAI5C,MAAM,YAAY,KAAwC;AACvD,WAAO,KAAK,MAAwB,KAAK,GAAG,WAAW;EAC1D;;;;;EAMA,MAAM,QAAQ,KAAa,QAAgB,UAAyC;AACjF,WAAO,KAAK;MACT,KAAK,GAAG,UAAU,MAAM,SAAS,mBAAmB,QAAQ,CAAC;IAChE;EACH;AACH;ACLO,IAAM,eAAN,cAA2B,cAAc;EAC7C,MAAM,aAAa,KAAa,WAAoB,OAA4B;AAC7E,UAAM,MAAM,WAAW,KAAK,GAAG,6BAA6B,KAAK,GAAG;AACpE,WAAO,KAAK,MAAkB,GAAG;EACpC;EAEA,MAAM,YAAY,KAAa,IAAwC;AACpE,WAAO,KAAK,MAAgB,KAAK,GAAG,cAAc,EAAE,EAAE;EACzD;EAEA,MAAM,oBACH,KACA,IACA,SAC0B;AAC1B,UAAM,SAAS,SAAS,OAAO,SAAS,QAAQ,IAAI,KAAK;AACzD,WAAO,KAAK,MAAwB,KAAK,GAAG,cAAc,EAAE,YAAY,MAAM,EAAE;EACnF;EAEA,MAAM,0BACH,KACA,aACA,SAC0C;AAC1C,UAAM,SAAS,IAAI,gBAAgB;AACnC,WAAO,IAAI,gBAAgB,YAAY,KAAK,GAAG,CAAC;AAChD,QAAI,SAAS,KAAM,QAAO,IAAI,QAAQ,OAAO,QAAQ,IAAI,CAAC;AAC1D,WAAO,KAAK;MACT,KAAK,GAAG,6BAA6B,OAAO,SAAS,CAAC;IACzD;EACH;EAEA,MAAM,mBACH,KACA,IACgD;AAChD,WAAO,KAAK,MAA8C,KAAK,GAAG,cAAc,EAAE,UAAU;EAC/F;;;;;;EAOA,wBAAwB,KAAa,IAAoB;AACtD,QAAI,KAAK,eAAe;AAErB,aAAO,aAAa,GAAG,cAAc,EAAE;IAC1C;AAEA,WAAO,GAAG,KAAK,OAAO,aAAa,GAAG,cAAc,EAAE;EACzD;EAEA,MAAM,eAAe,KAAa,UAA+C;AAC9E,WAAO,KAAK,MAAgB,KAAK,GAAG,cAAc;MAC/C,QAAQ;MACR,MAAM,KAAK,UAAU,QAAQ;IAChC,CAAC;EACJ;EAEA,MAAM,eACH,KACA,IACA,UACkB;AAClB,WAAO,KAAK,MAAgB,KAAK,GAAG,cAAc,EAAE,IAAI;MACrD,QAAQ;MACR,MAAM,KAAK,UAAU,QAAQ;IAChC,CAAC;EACJ;EAEA,MAAM,2BACH,KACA,IAKA;AACA,WAAO,KAAK,MAAM,KAAK,GAAG,cAAc,EAAE,mBAAmB;EAChE;EAEA,MAAM,eACH,KACA,IACA,UAAmB,OACmC;AACtD,UAAM,MAAM,UAAU,KAAK,GAAG,cAAc,EAAE,kBAAkB,KAAK,GAAG,cAAc,EAAE;AACxF,WAAO,KAAK,MAAM,KAAK;MACpB,QAAQ;IACX,CAAC;EACJ;EAEA,MAAM,gBAAgB,KAAa,IAAyC;AACzE,WAAO,KAAK,MAAM,KAAK,GAAG,cAAc,EAAE,YAAY;MACnD,QAAQ;IACX,CAAC;EACJ;EAEA,MAAM,kBAAkB,KAAa,IAAyC;AAC3E,WAAO,KAAK,MAAM,KAAK,GAAG,cAAc,EAAE,cAAc;MACrD,QAAQ;IACX,CAAC;EACJ;EAEA,MAAM,cAAc,KAAa,IAAY,MAA2C;AACrF,WAAO,KAAK,MAAgB,KAAK,GAAG,cAAc,EAAE,UAAU;MAC3D,QAAQ;MACR,MAAM,KAAK,UAAU,IAAI;IAC5B,CAAC;EACJ;EAEA,MAAM,qBAAqB,KAA0C;AAClE,WAAO,KAAK,MAA0B,KAAK,GAAG,sBAAsB;EACvE;EAEA,MAAM,2BACH,KACA,cACA,MACkB;AAClB,WAAO,KAAK,MAAgB,KAAK,GAAG,wBAAwB,YAAY,oBAAoB;MACzF,QAAQ;MACR,MAAM,KAAK,UAAU,IAAI;IAC5B,CAAC;EACJ;EAEA,MAAM,+BACH,KACA,IACA,UACA,QAC6C;AAC7C,UAAM,SAAS,IAAI,gBAAgB;AACnC,QAAI,SAAU,QAAO,OAAO,aAAa,QAAQ;AACjD,QAAI,OAAQ,QAAO,OAAO,WAAW,MAAM;AAE3C,WAAO,KAAK;MACT,KAAK,GAAG,cAAc,EAAE,0BAA0B,OAAO,SAAS,CAAC;IACtE;EACH;EAEA,MAAM,aACH,KACA,YACA,QACA,UACA,QACA,QAAgB,KAChB,SAAiB,GACc;AAC/B,UAAM,SAAS,IAAI,gBAAgB;AACnC,QAAI,SAAU,QAAO,OAAO,aAAa,QAAQ;AACjD,QAAI,OAAQ,QAAO,OAAO,WAAW,MAAM;AAC3C,WAAO,OAAO,SAAS,MAAM,SAAS,CAAC;AACvC,WAAO,OAAO,UAAU,OAAO,SAAS,CAAC;AAEzC,WAAO,KAAK;MACT,KAAK,GAAG,cAAc,UAAU,UAAU,MAAM,UAAU,OAAO,SAAS,CAAC;IAC9E;EACH;;EAGA,MAAM,wBAAwB,KAAa,YAAoD;AAC5F,WAAO,KAAK,MAA6B,KAAK,GAAG,cAAc,UAAU,eAAe;EAC3F;EAEA,MAAM,0BACH,KACA,YACA,MAC6B;AAC7B,WAAO,KAAK,MAA2B,KAAK,GAAG,cAAc,UAAU,iBAAiB;MACrF,QAAQ;MACR,MAAM,KAAK,UAAU,IAAI;IAC5B,CAAC;EACJ;EAEA,MAAM,0BACH,KACA,YACA,eACA,MAC6B;AAC7B,WAAO,KAAK;MACT,KAAK,GAAG,cAAc,UAAU,iBAAiB,aAAa;MAC9D;QACG,QAAQ;QACR,MAAM,KAAK,UAAU,IAAI;MAC5B;IACH;EACH;EAEA,MAAM,0BACH,KACA,YACA,eAC8B;AAC9B,WAAO,KAAK;MACT,KAAK,GAAG,cAAc,UAAU,iBAAiB,aAAa;MAC9D;QACG,QAAQ;MACX;IACH;EACH;;;;;EAOA,MAAM,qBAAqB,KAA8C;AACtE,UAAM,WAAW,MAAM,KAAK,MAA4C,KAAK,GAAG,WAAW;AAC3F,WAAO,SAAS;EACnB;;;;EAKA,MAAM,oBAAoB,KAAa,WAAkD;AACtF,WAAO,KAAK,MAA4B,KAAK,GAAG,aAAa,SAAS,EAAE;EAC3E;;;;;EAMA,MAAM,eACH,KACA,WACA,QACgC;AAChC,WAAO,KAAK,MAA8B,KAAK,GAAG,mBAAmB;MAClE,QAAQ;MACR,MAAM,KAAK,UAAU,EAAE,WAAW,OAAO,CAAC;IAC7C,CAAC;EACJ;;;;;EAMA,MAAM,qBAAqB,KAAa,MAAqD;AAC1F,WAAO,KAAK,MAAoC,KAAK,GAAG,2BAA2B;MAChF,QAAQ;MACR,MAAM,KAAK,UAAU,EAAE,KAAK,CAAC;IAChC,CAAC;EACJ;AACH;ACjQO,IAAM,0BAAN,cAAsC,cAAc;;;;;EAKxD,MAAM,yBAAyB,QAAiE;AAC7F,UAAM,cAAc,IAAI,gBAAgB;AAExC,QAAI,QAAQ,OAAQ,aAAY,OAAO,UAAU,OAAO,MAAM;AAC9D,QAAI,QAAQ,KAAM,aAAY,OAAO,QAAQ,OAAO,KAAK,SAAS,CAAC;AACnE,QAAI,QAAQ,SAAU,aAAY,OAAO,aAAa,OAAO,SAAS,SAAS,CAAC;AAEhF,UAAM,cAAc,YAAY,SAAS;AACzC,UAAM,MAAM,cAAc,cAAc,IAAI,WAAW,KAAK,EAAE;AAE9D,WAAO,KAAK,MAA8B,GAAG;EAChD;EAEA,MAAM,uBAAuB,WAAwC;AAClE,WAAO,KAAK,MAAkB,eAAe,SAAS,EAAE;EAC3D;EAEA,MAAM,0BAA0B,WAAiD;AAC9E,WAAO,KAAK,MAA2B,eAAe,SAAS,IAAI;MAChE,QAAQ;IACX,CAAC;EACJ;;;;;EAMA,MAAM,2BAA2B,eAAuB,SAAuC;AAC5F,WAAO,KAAK,MAAkB,0BAA0B,aAAa,uBAAuB;MACzF,QAAQ;MACR,MAAM,KAAK,UAAU,EAAE,QAAQ,CAAC;IACnC,CAAC;EACJ;;;;;;;;;EAWA,MAAM,8BACH,eACA,QAMgC;AAChC,UAAM,cAAc,IAAI,gBAAgB;AACxC,QAAI,QAAQ,UAAW,aAAY,OAAO,aAAa,OAAO,UAAU,SAAS,CAAC;AAClF,QAAI,QAAQ,OAAQ,aAAY,OAAO,UAAU,OAAO,MAAM;AAC9D,QAAI,QAAQ,KAAM,aAAY,OAAO,QAAQ,OAAO,KAAK,SAAS,CAAC;AACnE,QAAI,QAAQ,SAAU,aAAY,OAAO,aAAa,OAAO,SAAS,SAAS,CAAC;AAEhF,UAAM,cAAc,YAAY,SAAS;AACzC,UAAM,MAAM,KAAK,aAAa,eAAe,cAAc,IAAI,WAAW,KAAK,EAAE;AAEjF,WAAO,KAAK,MAA8B,GAAG;EAChD;;;;;EAMA,MAAM,kBACH,eACA,kBACA,SACA,cACA,MACoB;AACpB,UAAM,OAAgC;MACnC;MACA;MACA;IACH;AAGA,QAAI,OAAO,qBAAqB,UAAU;AACvC,WAAK,QAAQ;IAChB,OAAO;AACJ,WAAK,YAAY;IACpB;AAEA,WAAO,KAAK,MAAkB,KAAK,aAAa,gBAAgB;MAC7D,QAAQ;MACR,MAAM,KAAK,UAAU,IAAI;IAC5B,CAAC;EACJ;;;;;EAMA,MAAM,+BACH,eACA,cACA,MACoB;AACpB,WAAO,KAAK,MAAkB,KAAK,aAAa,gBAAgB,YAAY,IAAI;MAC7E,QAAQ;MACR,MAAM,KAAK,UAAU,IAAI;IAC5B,CAAC;EACJ;;;;;EAMA,MAAM,+BACH,eACA,cAC6B;AAC7B,WAAO,KAAK,MAA2B,KAAK,aAAa,gBAAgB,YAAY,IAAI;MACtF,QAAQ;IACX,CAAC;EACJ;;;;EAKA,MAAM,2BACH,eACA,cACoB;AACpB,WAAO,KAAK,+BAA+B,eAAe,cAAc;MACrE,QAAA;;IACH,CAAC;EACJ;;;;EAKA,MAAM,wBAAwB,eAAuB,cAA2C;AAC7F,WAAO,KAAK,+BAA+B,eAAe,cAAc;MACrE,QAAA;;IACH,CAAC;EACJ;;;;EAKA,MAAM,yBACH,eACA,cACoB;AACpB,WAAO,KAAK,+BAA+B,eAAe,cAAc;MACrE,QAAA;;IACH,CAAC;EACJ;;;;;EAMA,MAAM,iBAAiB,WAAwC;AAC5D,WAAO,KAAK,MAAkB,eAAe,SAAS,WAAW;MAC9D,QAAQ;IACX,CAAC;EACJ;;;;;EAMA,MAAM,kBAAkB,WAAwC;AAC7D,WAAO,KAAK,MAAkB,eAAe,SAAS,YAAY;MAC/D,QAAQ;IACX,CAAC;EACJ;AACH;AC7IO,IAAM,gBAAN,cAA4B,cAAc;EAC9C,MAAM,gBAAsC;AACzC,WAAO,KAAK,MAAmB,IAAI;EACtC;EAEA,MAAM,sBAAkD;AACrD,WAAO,KAAK,MAAyB,UAAU;EAClD;EAEA,MAAM,aAAa,KAAiC;AACjD,WAAO,KAAK,MAAiB,KAAK,GAAG,EAAE;EAC1C;EAEA,MAAM,gBAAgB,WAAkD;AACrE,WAAO,KAAK,MAAiB,MAAM;MAChC,QAAQ;MACR,MAAM,KAAK,UAAU,SAAS;IACjC,CAAC;EACJ;EAEA,MAAM,gBAAgB,KAAa,WAA2D;AAC3F,WAAO,KAAK,MAAiB,KAAK,GAAG,IAAI;MACtC,QAAQ;MACR,MAAM,KAAK,UAAU,SAAS;IACjC,CAAC;EACJ;EAEA,MAAM,gBAAgB,KAA4B;AAC/C,WAAO,KAAK,MAAM,KAAK,GAAG,IAAI;MAC3B,QAAQ;IACX,CAAC;EACJ;EAEA,MAAM,eAAe,KAA2C;AAC7D,WAAO,KAAK,MAA2B,KAAK,GAAG,OAAO;MACnD,QAAQ;IACX,CAAC;EACJ;EAEA,MAAM,qBAAqB,KAAyC;AACjE,WAAO,KAAK,MAAyB,KAAK,GAAG,WAAW;EAC3D;EAEA,MAAM,wBACH,KACA,UAC2B;AAC3B,WAAO,KAAK,MAAyB,KAAK,GAAG,aAAa;MACvD,QAAQ;MACR,MAAM,KAAK,UAAU,QAAQ;IAChC,CAAC;EACJ;EAEA,MAAM,mBAAmB,KAAuC;AAC7D,WAAO,KAAK,MAAuB,KAAK,GAAG,SAAS;EACvD;EAEA,MAAM,uBAAuB,KAAoD;AAC9E,WAAO,KAAK,MAAoC,KAAK,GAAG,wBAAwB;EACnF;EAEA,MAAM,gCAAiE;AACpE,UAAM,SAAS,MAAM,KAAK,MAA4C,mBAAmB;AACzF,WAAO,OAAO;EACjB;EAEA,MAAM,oBAAoB,KAAuC;AAC9D,WAAO,KAAK,MAAuB,KAAK,GAAG,UAAU;EACxD;EAEA,MAAM,iBACH,KACA,UAGI,CAAC,GACoC;AACzC,UAAM,SAAS,IAAI,gBAAgB;AACnC,QAAI,QAAQ,KAAM,QAAO,OAAO,QAAQ,QAAQ,KAAK,SAAS,CAAC;AAC/D,QAAI,QAAQ,SAAU,QAAO,OAAO,YAAY,QAAQ,SAAS,SAAS,CAAC;AAE3E,UAAM,cAAc,OAAO,SAAS;AACpC,UAAM,MAAM,KAAK,GAAG,iBAAiB,cAAc,IAAI,WAAW,KAAK,EAAE;AAEzE,WAAO,KAAK,MAAuC,GAAG;EACzD;EAEA,MAAM,gBAAgB,KAAa,IAAmC;AACnE,WAAO,KAAK,MAAoB,KAAK,GAAG,kBAAkB,EAAE,EAAE;EACjE;EAEA,MAAM,2BAA2B,KAA8B;AAC5D,WAAO,KAAK,MAAc,KAAK,GAAG,6BAA6B;EAClE;EAEA,MAAM,uBAAuB,KAAa,IAAmC;AAC1E,WAAO,KAAK,MAAoB,KAAK,GAAG,kBAAkB,EAAE,SAAS;MAClE,QAAQ;IACX,CAAC;EACJ;EAEA,MAAM,oBAAoB,KAAa,IAAmC;AACvE,WAAO,KAAK,MAAoB,KAAK,GAAG,kBAAkB,EAAE,YAAY;MACrE,QAAQ;IACX,CAAC;EACJ;EAEA,MAAM,wBAAwB,KAAkD;AAC7E,WAAO,KAAK,MAAkC,KAAK,GAAG,8BAA8B;MACjF,QAAQ;IACX,CAAC;EACJ;;EAIA,MAAM,oBAA4C;AAC/C,UAAM,WAAW,MAAM,KAAK,MAAoC,uBAAuB;AACvF,WAAO,SAAS;EACnB;EAEA,MAAM,yBACH,KACA,cAC6D;AAC7D,WAAO,KAAK;MACT,KAAK,GAAG;MACR;QACG,QAAQ;QACR,MAAM,KAAK,UAAU,YAAY;MACpC;IACH;EACH;EAEA,MAAM,2BAA2B,KAAa,UAAiD;AAC5F,WAAO,KAAK;MACT,KAAK,GAAG,gCAAgC,mBAAmB,QAAQ,CAAC;MACpE;QACG,QAAQ;MACX;IACH;EACH;EAEA,MAAM,sBACH,KACyF;AACzF,WAAO,KAAK,MAEV,KAAK,GAAG,qBAAqB;EAClC;EAEA,MAAM,sBAAsB,KAAyC;AAClE,WAAO,KAAK,MAAyB,KAAK,GAAG,sBAAsB;EACtE;EAEA,MAAM,sBACH,KACA,MACyB;AACzB,WAAO,KAAK,MAAuB,KAAK,GAAG,wBAAwB;MAChE,QAAQ;MACR,MAAM,KAAK,UAAU,IAAI;IAC5B,CAAC;EACJ;EAEA,MAAM,mBAAmB,KAAa,aAA+C;AAClF,WAAO,KAAK,MAAuB,KAAK,GAAG,wBAAwB,WAAW,EAAE;EACnF;EAEA,MAAM,sBACH,KACA,aACA,MACyB;AACzB,WAAO,KAAK,MAAuB,KAAK,GAAG,wBAAwB,WAAW,IAAI;MAC/E,QAAQ;MACR,MAAM,KAAK,UAAU,IAAI;IAC5B,CAAC;EACJ;EAEA,MAAM,sBAAsB,KAAa,aAAmD;AACzF,WAAO,KAAK,MAA2B,KAAK,GAAG,wBAAwB,WAAW,IAAI;MACnF,QAAQ;IACX,CAAC;EACJ;EAEA,MAAM,yBACH,KACA,aAC6C;AAC7C,WAAO,KAAK;MACT,KAAK,GAAG,wBAAwB,WAAW;MAC3C;QACG,QAAQ;MACX;IACH;EACH;EAEA,MAAM,YAAY,KAAa,UAAwC;AACpE,UAAM,SAAS,aAAa,SAAY,aAAa,QAAQ,KAAK;AAClE,WAAO,KAAK,MAAiB,KAAK,GAAG,qBAAqB,MAAM,EAAE;EACrE;EAEA,MAAM,WAAW,IAA8B;AAG5C,WAAO,KAAK,MAAe,YAAY,EAAE,EAAE;EAC9C;EAEA,MAAM,iBAAiB,IAA8B;AAClD,WAAO,KAAK,MAAe,YAAY,EAAE,EAAE;EAC9C;EAEA,MAAM,cAAc,KAAa,SAAgC;AAC9D,WAAO,KAAK,MAAe,KAAK,GAAG,sBAAsB;MACtD,QAAQ;MACR,MAAM,KAAK,UAAU,OAAO;IAC/B,CAAC;EACJ;EAEA,MAAM,cAAc,KAAa,IAAY,SAAgC;AAC1E,WAAO,KAAK,MAAe,KAAK,GAAG,sBAAsB,EAAE,IAAI;MAC5D,QAAQ;MACR,MAAM,KAAK,UAAU,OAAO;IAC/B,CAAC;EACJ;EAEA,MAAM,cAAc,KAAa,IAA0C;AACxE,WAAO,KAAK,MAA2B,KAAK,GAAG,sBAAsB,EAAE,IAAI;MACxE,QAAQ;IACX,CAAC;EACJ;;EAGA,MAAM,wBAAwB,KAA0C;AACrE,WAAO,KAAK,MAA0B,KAAK,GAAG,8BAA8B;MACzE,QAAQ;IACX,CAAC;EACJ;;EAGA,MAAM,gBAAgB,KAAa,YAAmD;AACnF,UAAM,SAAS,aAAa,gBAAgB,UAAU,KAAK;AAC3D,WAAO,KAAK,MAA2B,KAAK,GAAG,UAAU,MAAM,EAAE;EACpE;EAEA,MAAM,uBACH,KACA,YACA,gBACA,WACA,SACwC;AACxC,WAAO,KAAK,MAAsC,KAAK,GAAG,mBAAmB;MAC1E,QAAQ;MACR,MAAM,KAAK,UAAU;QAClB;QACA;QACA;QACA;MACH,CAAC;IACJ,CAAC;EACJ;EAEA,MAAM,gBACH,KACA,YACA,gBACA,WACwC;AACxC,WAAO,KAAK,MAAsC,KAAK,GAAG,WAAW;MAClE,QAAQ;MACR,MAAM,KAAK,UAAU;QAClB;QACA;QACA;MACH,CAAC;IACJ,CAAC;EACJ;;EAGA,MAAM,uBACH,KACA,YACA,iBAAsB,CAAC,GACvB,YAAiB,CAAC,GACL;AACb,WAAO,KAAK,MAAW,KAAK,GAAG,mBAAmB;MAC/C,QAAQ;MACR,MAAM,KAAK,UAAU;QAClB;QACA;QACA;MACH,CAAC;IACJ,CAAC;EACJ;EAEA,MAAM,mBAAmB,KAA0C;AAChE,WAAO,KAAK,MAA0B,KAAK,GAAG,SAAS;EAC1D;EAEA,MAAM,sBAAsB,KAAa,QAAsC;AAC5E,WAAO,KAAK,MAAiB,KAAK,GAAG,WAAW;MAC7C,QAAQ;MACR,MAAM,KAAK,UAAU,EAAE,OAAO,CAAC;IAClC,CAAC;EACJ;;;;;;;;;;EAWA,MAAM,qBAAuD;AAC1D,WAAO,KAAK,MAA+B,UAAU;EACxD;;;;;;;;;;;;;EAcA,MAAM,oBAAoB,KAAgD;AACvE,WAAO,KAAK,MAAgC,KAAK,GAAG,oBAAoB;EAC3E;;;;;;;EAQA,MAAM,kBAAkB,KAAa,SAAwD;AAE1F,WAAO,KAAK,MAAyB,oBAAoB,GAAG,eAAe;MACxE,QAAQ;MACR,MAAM,KAAK,UAAU,WAAW,CAAC,CAAC;IACrC,CAAC;EACJ;AACH;AC/RO,SAAS,2BAA2B,SAAyC;AACjF,MAAI,CAAC,SAAS;AACX,WAAO;EACV;AAEA,QAAM,QAAkB,CAAC;AAGzB,MAAI,QAAQ,SAAS;AAClB,UAAM,KAAK,2BAA2B,QAAQ,OAAO,GAAG;EAC3D,WAAW,QAAQ,QAAQ;AAExB,UAAM,KAAK,eAAe,QAAQ,MAAM,IAAI;EAC/C;AAGA,MAAI,QAAQ,WAAW;AACpB,UAAM,EAAE,MAAM,MAAM,UAAU,YAAY,QAAQ,IAAI,QAAQ;AAG9D,QAAI,MAAM;AACP,YAAM,WAAW,KAAK,QAAQ,KAAK;AACnC,YAAM;QACH,WAAW,aAAa,QAAQ,WAAW,KAAK,EAAE,QAAQ,kBAAkB,KAAK,EAAE;MACtF;IACH;AAGA,QAAI,MAAM;AACP,YAAM,WAAW,KAAK,QAAQ,KAAK;AACnC,YAAM;QACH,WAAW,aAAa,QAAQ,WAAW,KAAK,EAAE,QAAQ,kBAAkB,KAAK,EAAE;MACtF;IACH;AAGA,QAAI,UAAU;AACX,YAAM,eAAe,SAAS;AAC9B,YAAM;QACH,eACK,iBAAiB,YAAY,WAAW,SAAS,EAAE,QACnD,sBAAsB,SAAS,EAAE;MACzC;AAGA,UAAI,SAAS,cAAc;AACxB,cAAM,WAAW,SAAS,aAAa;AACvC,cAAM;UACH,WACK,sBAAsB,QAAQ,WAAW,SAAS,aAAa,EAAE,QACjE,2BAA2B,SAAS,aAAa,EAAE;QAC3D;MACH;IACH;AAGA,QAAI,YAAY;AACb,YAAM,aAAa,WAAW,QAAQ,WAAW;AACjD,YAAM;QACH,aACK,oBAAoB,UAAU,WAAW,WAAW,EAAE,QACtD,yBAAyB,WAAW,EAAE;MAC9C;IACH;AAGA,QAAI,SAAS;AACV,YAAM;QACH,QAAQ,OACH,gBAAgB,QAAQ,IAAI,WAAW,QAAQ,EAAE,QACjD,qBAAqB,QAAQ,EAAE;MACvC;IACH;AAGA,QAAI,QAAQ,UAAU,eAAe,QAAQ,UAAU,YAAY,SAAS,GAAG;AAC5E,YAAM,KAAK,qBAAqB,QAAQ,UAAU,YAAY,KAAK,IAAI,CAAC,EAAE;IAC7E;AAGA,QAAI,QAAQ,UAAU,gBAAgB,QAAQ,UAAU,aAAa,SAAS,GAAG;AAC9E,YAAM,KAAK,sBAAsB,QAAQ,UAAU,aAAa,KAAK,IAAI,CAAC,EAAE;IAC/E;EACH;AAEA,MAAI,MAAM,WAAW,GAAG;AACrB,WAAO;EACV;AAEA,SAAO;;EAAkB,MAAM,KAAK,IAAI,CAAC;AAC5C;ACpMO,IAAM,mBAAN,cAA+B,cAAc;EACjD,MAAM,iBAAiB,KAAa,YAA6C;AAC9E,WAAO,KAAK,MAAsB,KAAK,GAAG,+BAA+B,UAAU,EAAE;EACxF;EAEA,MAAM,gBAAgB,KAAa,IAAmC;AACnE,WAAO,KAAK,MAAoB,KAAK,GAAG,mBAAmB,EAAE,EAAE;EAClE;EAEA,MAAM,mBAAmB,KAAa,MAAmD;AACtF,WAAO,KAAK,MAAoB,KAAK,GAAG,mBAAmB;MACxD,QAAQ;MACR,MAAM,KAAK,UAAU,IAAI;IAC5B,CAAC;EACJ;EAEA,MAAM,mBACH,KACA,IACA,MACsB;AACtB,WAAO,KAAK,MAAoB,KAAK,GAAG,mBAAmB,EAAE,IAAI;MAC9D,QAAQ;MACR,MAAM,KAAK,UAAU,IAAI;IAC5B,CAAC;EACJ;EAEA,MAAM,mBAAmB,KAAa,IAA2B;AAC9D,WAAO,KAAK,MAAY,KAAK,GAAG,mBAAmB,EAAE,IAAI;MACtD,QAAQ;IACX,CAAC;EACJ;AACH;ACmEO,SAAS,iBACb,QACA,SACA,aACW;AACX,SAAO;IACJ,WAAW,IAAI,aAAa,QAAQ,SAAS,WAAW;IACxD,cAAc,IAAI,gBAAgB,QAAQ,SAAS,WAAW;IAC9D,OAAO,IAAI,SAAS,QAAQ,SAAS,WAAW;IAChD,QAAQ,IAAI,UAAU,QAAQ,SAAS,WAAW;IAClD,UAAU,IAAI,YAAY,QAAQ,SAAS,WAAW;IACtD,SAAS,IAAI,WAAW,QAAQ,SAAS,WAAW;IACpD,MAAM,IAAI,QAAQ,QAAQ,SAAS,WAAW;IAC9C,aAAa,IAAI,eAAe,QAAQ,SAAS,WAAW;IAC5D,YAAY,IAAI,cAAc,QAAQ,SAAS,WAAW;IAC1D,MAAM,IAAI,QAAQ,QAAQ,SAAS,WAAW;IAC9C,UAAU,IAAI,YAAY,QAAQ,SAAS,WAAW;IACtD,WAAW,IAAI,aAAa,QAAQ,SAAS,WAAW;IACxD,OAAO,IAAI,SAAS,QAAQ,SAAS,WAAW;IAChD,KAAK,IAAI,OAAO,QAAQ,SAAS,WAAW;IAC5C,OAAO,IAAI,SAAS,QAAQ,SAAS,WAAW;IAChD,gBAAgB,IAAI,kBAAkB,QAAQ,SAAS,WAAW;IAClE,WAAW,IAAI,aAAa,QAAQ,SAAS,WAAW;IACxD,aAAa,IAAI,eAAe,QAAQ,SAAS,WAAW;IAC5D,WAAW,IAAI,aAAa,QAAQ,SAAS,WAAW;IACxD,QAAQ,IAAI,UAAU,QAAQ,SAAS,WAAW;IAClD,iBAAiB,IAAI,mBAAmB,QAAQ,SAAS,WAAW;IACpE,UAAU,IAAI,YAAY,QAAQ,SAAS,WAAW;IACtD,OAAO,IAAI,SAAS,QAAQ,SAAS,WAAW;IAChD,SAAS,IAAI,WAAW,QAAQ,SAAS,WAAW;IACpD,WAAW,IAAI,aAAa,QAAQ,SAAS,WAAW;IACxD,gBAAgB,IAAI,kBAAkB,QAAQ,SAAS,WAAW;IAClE,YAAY,IAAI,cAAc,QAAQ,SAAS,WAAW;IAC1D,SAAS,IAAI,WAAW,QAAQ,SAAS,WAAW;IACpD,YAAY,IAAI,cAAc,QAAQ,SAAS,WAAW;IAC1D,mBAAmB,IAAI,qBAAqB,QAAQ,SAAS,WAAW;IACxE,mBAAmB,IAAI,qBAAqB,QAAQ,SAAS,WAAW;IACxE,OAAO,IAAI,SAAS,QAAQ,SAAS,WAAW;IAChD,gBAAgB,IAAI,YAAY,QAAQ,SAAS,WAAW;IAC5D,kBAAkB,IAAI,oBAAoB,QAAQ,SAAS,WAAW;IACtE,cAAc,IAAI,gBAAgB,QAAQ,SAAS,WAAW;IAC9D,gBAAgB,IAAI,kBAAkB,QAAQ,SAAS,WAAW;IAClE,gBAAgB,IAAI,kBAAkB,QAAQ,SAAS,WAAW;IAClE,SAAS,IAAI,WAAW,QAAQ,SAAS,WAAW;IACpD,OAAO,IAAI,SAAS,QAAQ,SAAS,WAAW;IAChD,eAAe,IAAI,iBAAiB,QAAQ,SAAS,WAAW;IAChE,aAAa,IAAI,eAAe,QAAQ,SAAS,WAAW;IAC5D,OAAO,IAAI,SAAS,QAAQ,SAAS,WAAW;IAChD,WAAW,IAAI,aAAa,QAAQ,SAAS,WAAW;IACxD,UAAU,IAAI,YAAY,QAAQ,SAAS,WAAW;IACtD,WAAW,IAAI,aAAa,QAAQ,SAAS,WAAW;IACxD,eAAe,IAAI,iBAAiB,QAAQ,SAAS,WAAW;IAChE,sBAAsB,IAAI,wBAAwB,QAAQ,SAAS,WAAW;IAC9E,YAAY,IAAI,cAAc,QAAQ,SAAS,WAAW;EAC7D;AACH;AChJO,SAAS,wBACb,QACA,cACK;AACL,SAAO,sBAAsB,aAAa,oBAAoB,KAAK,YAAY;AAC/E,SAAO,mBAAmB,aAAa,iBAAiB,KAAK,YAAY;AACzE,SAAO,iBAAiB,aAAa,eAAe,KAAK,YAAY;AACrE,SAAO,oBAAoB,aAAa,kBAAkB,KAAK,YAAY;AAC3E,SAAO,qBAAqB,aAAa,mBAAmB,KAAK,YAAY;AAC7E,SAAO,oBAAoB,aAAa,kBAAkB,KAAK,YAAY;AAC3E,SAAO,kBAAkB,aAAa,gBAAgB,KAAK,YAAY;AACvE,SAAO,kBAAkB,aAAa,gBAAgB,KAAK,YAAY;AAC1E;ACbO,SAAS,kBAAkB,QAAwB,QAAyB;AAChF,SAAO,YAAY,OAAO,UAAU,KAAK,MAAM;AAC/C,SAAO,WAAW,OAAO,SAAS,KAAK,MAAM;AAC7C,SAAO,cAAc,OAAO,YAAY,KAAK,MAAM;AACnD,SAAO,cAAc,OAAO,YAAY,KAAK,MAAM;AACnD,SAAO,cAAc,OAAO,YAAY,KAAK,MAAM;AACnD,SAAO,eAAe,OAAO,aAAa,KAAK,MAAM;AACrD,SAAO,iBAAiB,OAAO,eAAe,KAAK,MAAM;AAC5D;ACDO,SAAS,iBACb,QACA,OACA,WACK;AAEL,SAAO,WAAW,MAAM,SAAS,KAAK,KAAK;AAC3C,SAAO,UAAU,MAAM,QAAQ,KAAK,KAAK;AACzC,SAAO,aAAa,MAAM,WAAW,KAAK,KAAK;AAC/C,SAAO,aAAa,MAAM,WAAW,KAAK,KAAK;AAC/C,SAAO,aAAa,MAAM,WAAW,KAAK,KAAK;AAC/C,SAAO,cAAc,MAAM,YAAY,KAAK,KAAK;AACjD,SAAO,gBAAgB,MAAM,cAAc,KAAK,KAAK;AACrD,SAAO,yBAAyB,MAAM,mBAAmB,KAAK,KAAK;AACnE,SAAO,YAAY,MAAM,UAAU,KAAK,KAAK;AAG7C,SAAO,kBAAkB,UAAU,gBAAgB,KAAK,SAAS;AACpE;ACUO,SAAS,iBAAiB,QAAuB,OAAuB;AAE5E,SAAO,WAAW,MAAM,SAAS,KAAK,KAAK;AAC3C,SAAO,UAAU,MAAM,QAAQ,KAAK,KAAK;AACzC,SAAO,oBAAoB,MAAM,kBAAkB,KAAK,KAAK;AAC7D,SAAO,eAAe,MAAM,aAAa,KAAK,KAAK;AACnD,SAAO,gBAAgB,MAAM,cAAc,KAAK,KAAK;AACrD,SAAO,wBAAwB,MAAM,sBAAsB,KAAK,KAAK;AACrE,SAAO,6BAA6B,MAAM,2BAA2B,KAAK,KAAK;AAC/E,SAAO,cAAc,MAAM,YAAY,KAAK,KAAK;AACjD,SAAO,gBAAgB,MAAM,cAAc,KAAK,KAAK;AACrD,SAAO,aAAa,MAAM,WAAW,KAAK,KAAK;AAC/C,SAAO,aAAa,MAAM,WAAW,KAAK,KAAK;AAC/C,SAAO,aAAa,MAAM,WAAW,KAAK,KAAK;AAC/C,SAAO,iBAAiB,MAAM,eAAe,KAAK,KAAK;AACvD,SAAO,0BAA0B,MAAM,wBAAwB,KAAK,KAAK;AACzE,SAAO,gBAAgB,MAAM,cAAc,KAAK,KAAK;AACrD,SAAO,kBAAkB,MAAM,gBAAgB,KAAK,KAAK;AACzD,SAAO,0BAA0B,MAAM,wBAAwB,KAAK,KAAK;AACzE,SAAO,eAAe,MAAM,aAAa,KAAK,KAAK;AACnD,SAAO,uBAAuB,MAAM,qBAAqB,KAAK,KAAK;AACnE,SAAO,uBAAuB,MAAM,qBAAqB,KAAK,KAAK;AACnE,SAAO,cAAc,MAAM,YAAY,KAAK,KAAK;AACjD,SAAO,yBAAyB,MAAM,uBAAuB,KAAK,KAAK;AACvE,SAAO,uBAAuB,MAAM,qBAAqB,KAAK,KAAK;AACnE,SAAO,cAAc,MAAM,YAAY,KAAK,KAAK;AACjD,SAAO,aAAa,MAAM,WAAW,KAAK,KAAK;AAC/C,SAAO,qBAAqB,MAAM,mBAAmB,KAAK,KAAK;AAC/D,SAAO,kBAAkB,MAAM,gBAAgB,KAAK,KAAK;AAEzD,SAAO,gBAAgB,MAAM,cAAc,KAAK,KAAK;AACrD,SAAO,eAAe,MAAM,aAAa,KAAK,KAAK;AACnD,SAAO,qBAAqB,MAAM,mBAAmB,KAAK,KAAK;AAC/D,SAAO,kBAAkB,MAAM,gBAAgB,KAAK,KAAK;AACzD,SAAO,kBAAkB,MAAM,gBAAgB,KAAK,KAAK;AACzD,SAAO,kBAAkB,MAAM,gBAAgB,KAAK,KAAK;AAEzD,SAAO,iBAAiB,MAAM,eAAe,KAAK,KAAK;AACvD,SAAO,gBAAgB,MAAM,cAAc,KAAK,KAAK;AACrD,SAAO,sBAAsB,MAAM,oBAAoB,KAAK,KAAK;AACjE,SAAO,mBAAmB,MAAM,iBAAiB,KAAK,KAAK;AAC3D,SAAO,mBAAmB,MAAM,iBAAiB,KAAK,KAAK;AAC3D,SAAO,mBAAmB,MAAM,iBAAiB,KAAK,KAAK;AAC9D;AC7EO,SAAS,iBAAiB,QAAuB,OAAiB,KAAmB;AAEzF,SAAO,eAAe,MAAM,aAAa,KAAK,KAAK;AACnD,SAAO,gBAAgB,MAAM,cAAc,KAAK,KAAK;AACrD,SAAO,mBAAmB,MAAM,iBAAiB,KAAK,KAAK;AAG3D,SAAO,gBAAgB,IAAI,cAAc,KAAK,GAAG;AACpD;ACKO,SAAS,qBAAqB,QAA2B,WAA+B;AAC5F,SAAO,eAAe,UAAU,aAAa,KAAK,SAAS;AAC3D,SAAO,cAAc,UAAU,YAAY,KAAK,SAAS;AACzD,SAAO,oBAAoB,UAAU,kBAAkB,KAAK,SAAS;AACrE,SAAO,iBAAiB,UAAU,eAAe,KAAK,SAAS;AAC/D,SAAO,iBAAiB,UAAU,eAAe,KAAK,SAAS;AAC/D,SAAO,iBAAiB,UAAU,eAAe,KAAK,SAAS;AAC/D,SAAO,kBAAkB,UAAU,gBAAgB,KAAK,SAAS;AACjE,SAAO,oBAAoB,UAAU,kBAAkB,KAAK,SAAS;AACrE,SAAO,gBAAgB,UAAU,cAAc,KAAK,SAAS;AAC7D,SAAO,iBAAiB,UAAU,eAAe,KAAK,SAAS;AAC/D,SAAO,gBAAgB,UAAU,cAAc,KAAK,SAAS;AAC7D,SAAO,mBAAmB,UAAU,iBAAiB,KAAK,SAAS;AACnE,SAAO,mBAAmB,UAAU,iBAAiB,KAAK,SAAS;AACnE,SAAO,mBAAmB,UAAU,iBAAiB,KAAK,SAAS;AACnE,SAAO,uBAAuB,UAAU,qBAAqB,KAAK,SAAS;AAC3E,SAAO,mBAAmB,UAAU,iBAAiB,KAAK,SAAS;AACnE,SAAO,mBAAmB,UAAU,iBAAiB,KAAK,SAAS;AACnE,SAAO,sBAAsB,UAAU,oBAAoB,KAAK,SAAS;AACzE,SAAO,uBAAuB,UAAU,qBAAqB,KAAK,SAAS;AAC3E,SAAO,wBAAwB,UAAU,sBAAsB,KAAK,SAAS;AAChF;ACOO,SAAS,mBAAmB,QAAyB,SAA2B;AACpF,SAAO,mBAAmB,QAAQ,iBAAiB,KAAK,OAAO;AAC/D,SAAO,kBAAkB,QAAQ,gBAAgB,KAAK,OAAO;AAC7D,SAAO,eAAe,QAAQ,aAAa,KAAK,OAAO;AACvD,SAAO,oBAAoB,QAAQ,kBAAkB,KAAK,OAAO;AACjE,SAAO,sBAAsB,QAAQ,oBAAoB,KAAK,OAAO;AACrE,SAAO,sBAAsB,QAAQ,oBAAoB,KAAK,OAAO;AACrE,SAAO,qBAAqB,QAAQ,mBAAmB,KAAK,OAAO;AACnE,SAAO,wBAAwB,QAAQ,sBAAsB,KAAK,OAAO;AACzE,SAAO,eAAe,QAAQ,aAAa,KAAK,OAAO;AACvD,SAAO,eAAe,QAAQ,aAAa,KAAK,OAAO;AACvD,SAAO,gBAAgB,QAAQ,cAAc,KAAK,OAAO;AACzD,SAAO,kBAAkB,QAAQ,gBAAgB,KAAK,OAAO;AAC7D,SAAO,gBAAgB,QAAQ,cAAc,KAAK,OAAO;AACzD,SAAO,gBAAgB,QAAQ,cAAc,KAAK,OAAO;AACzD,SAAO,4BAA4B,QAAQ,0BAA0B,KAAK,OAAO;AACjF,SAAO,mBAAmB,QAAQ,iBAAiB,KAAK,OAAO;AAC/D,SAAO,kBAAkB,QAAQ,gBAAgB,KAAK,OAAO;AAC7D,SAAO,qBAAqB,QAAQ,mBAAmB,KAAK,OAAO;AACnE,SAAO,qBAAqB,QAAQ,mBAAmB,KAAK,OAAO;AACnE,SAAO,qBAAqB,QAAQ,mBAAmB,KAAK,OAAO;AACnE,SAAO,uBAAuB,QAAQ,qBAAqB,KAAK,OAAO;AACvE,SAAO,kBAAkB,QAAQ,gBAAgB,KAAK,OAAO;AAC7D,SAAO,iBAAiB,QAAQ,eAAe,KAAK,OAAO;AAC3D,SAAO,uBAAuB,QAAQ,qBAAqB,KAAK,OAAO;AACvE,SAAO,oBAAoB,QAAQ,kBAAkB,KAAK,OAAO;AACjE,SAAO,oBAAoB,QAAQ,kBAAkB,KAAK,OAAO;AACjE,SAAO,oBAAoB,QAAQ,kBAAkB,KAAK,OAAO;AACjE,SAAO,iBAAiB,QAAQ,eAAe,KAAK,OAAO;AAC3D,SAAO,gBAAgB,QAAQ,cAAc,KAAK,OAAO;AACzD,SAAO,sBAAsB,QAAQ,oBAAoB,KAAK,OAAO;AACrE,SAAO,mBAAmB,QAAQ,iBAAiB,KAAK,OAAO;AAC/D,SAAO,mBAAmB,QAAQ,iBAAiB,KAAK,OAAO;AAC/D,SAAO,mBAAmB,QAAQ,iBAAiB,KAAK,OAAO;AAE/D,SAAO,kBAAkB,QAAQ,gBAAgB,KAAK,OAAO;AAC7D,SAAO,4BAA4B,QAAQ,0BAA0B,KAAK,OAAO;AACjF,SAAO,oBAAoB,QAAQ,kBAAkB,KAAK,OAAO;AACjE,SAAO,oBAAoB,QAAQ,kBAAkB,KAAK,OAAO;AACjE,SAAO,oBAAoB,QAAQ,kBAAkB,KAAK,OAAO;AAEjE,SAAO,+BAA+B,QAAQ,6BAA6B,KAAK,OAAO;AACvF,SAAO,+BAA+B,QAAQ,6BAA6B,KAAK,OAAO;AACvF,SAAO,6BAA6B,QAAQ,2BAA2B,KAAK,OAAO;AAEnF,SAAO,0BAA0B,QAAQ,wBAAwB,KAAK,OAAO;AAC7E,SAAO,yBAAyB,QAAQ,uBAAuB,KAAK,OAAO;AAC3E,SAAO,yBAAyB,QAAQ,uBAAuB,KAAK,OAAO;AAC3E,SAAO,wBAAwB,QAAQ,sBAAsB,KAAK,OAAO;AAC5E;AElCO,SAAS,sBACb,QACA,YACA,gBACK;AAEL,SAAO,gBAAgB,WAAW,cAAc,KAAK,UAAU;AAC/D,SAAO,sBAAsB,WAAW,oBAAoB,KAAK,UAAU;AAC3E,SAAO,eAAe,WAAW,aAAa,KAAK,UAAU;AAC7D,SAAO,kBAAkB,WAAW,gBAAgB,KAAK,UAAU;AACnE,SAAO,kBAAkB,WAAW,gBAAgB,KAAK,UAAU;AACnE,SAAO,kBAAkB,WAAW,gBAAgB,KAAK,UAAU;AACnE,SAAO,iBAAiB,WAAW,eAAe,KAAK,UAAU;AACjE,SAAO,uBAAuB,WAAW,qBAAqB,KAAK,UAAU;AAC7E,SAAO,0BAA0B,WAAW,wBAAwB,KAAK,UAAU;AACnF,SAAO,qBAAqB,WAAW,mBAAmB,KAAK,UAAU;AACzE,SAAO,yBAAyB,WAAW,uBAAuB,KAAK,UAAU;AACjF,SAAO,gCAAgC,WAAW,8BAA8B,KAAK,UAAU;AAC/F,SAAO,sBAAsB,WAAW,oBAAoB,KAAK,UAAU;AAC3E,SAAO,mBAAmB,WAAW,iBAAiB,KAAK,UAAU;AACrE,SAAO,kBAAkB,WAAW,gBAAgB,KAAK,UAAU;AACnE,SAAO,6BAA6B,WAAW,2BAA2B,KAAK,UAAU;AACzF,SAAO,yBAAyB,WAAW,uBAAuB,KAAK,UAAU;AACjF,SAAO,sBAAsB,WAAW,oBAAoB,KAAK,UAAU;AAC3E,SAAO,0BAA0B,WAAW,wBAAwB,KAAK,UAAU;AACnF,SAAO,wBAAwB,WAAW,sBAAsB,KAAK,UAAU;AAC/E,SAAO,wBAAwB,WAAW,sBAAsB,KAAK,UAAU;AAC/E,SAAO,qBAAqB,WAAW,mBAAmB,KAAK,UAAU;AACzE,SAAO,wBAAwB,WAAW,sBAAsB,KAAK,UAAU;AAC/E,SAAO,wBAAwB,WAAW,sBAAsB,KAAK,UAAU;AAC/E,SAAO,2BAA2B,WAAW,yBAAyB,KAAK,UAAU;AACrF,SAAO,cAAc,WAAW,YAAY,KAAK,UAAU;AAC3D,SAAO,aAAa,WAAW,WAAW,KAAK,UAAU;AACzD,SAAO,mBAAmB,WAAW,iBAAiB,KAAK,UAAU;AACrE,SAAO,gBAAgB,WAAW,cAAc,KAAK,UAAU;AAC/D,SAAO,gBAAgB,WAAW,cAAc,KAAK,UAAU;AAC/D,SAAO,gBAAgB,WAAW,cAAc,KAAK,UAAU;AAC/D,SAAO,0BAA0B,WAAW,wBAAwB,KAAK,UAAU;AACnF,SAAO,kBAAkB,WAAW,gBAAgB,KAAK,UAAU;AACnE,SAAO,yBAAyB,WAAW,uBAAuB,KAAK,UAAU;AACjF,SAAO,kBAAkB,WAAW,gBAAgB,KAAK,UAAU;AACnE,SAAO,yBAAyB,WAAW,uBAAuB,KAAK,UAAU;AACjF,SAAO,qBAAqB,WAAW,mBAAmB,KAAK,UAAU;AACzE,SAAO,wBAAwB,WAAW,sBAAsB,KAAK,UAAU;AAC/E,SAAO,qBAAqB,WAAW,aAAa,KAAK,UAAU;AACnE,SAAO,qBAAqB,WAAW,mBAAmB,KAAK,UAAU;AACzE,SAAO,sBAAsB,WAAW,oBAAoB,KAAK,UAAU;AAC3E,SAAO,oBAAoB,WAAW,kBAAkB,KAAK,UAAU;AAGvE,SAAO,oBAAoB,WAAW,kBAAkB,KAAK,UAAU;AACvE,SAAO,2BAA2B,WAAW,yBAAyB,KAAK,UAAU;AACrF,SAAO,6BAA6B,WAAW,2BAA2B,KAAK,UAAU;AACzF,SAAO,wBAAwB,WAAW,sBAAsB,KAAK,UAAU;AAG/E,SAAO,2BAA2B,eAAe,yBAAyB,KAAK,cAAc;AAC7F,SAAO,gCACJ,eAAe,8BAA8B,KAAK,cAAc;AACnE,SAAO,yBAAyB,eAAe,uBAAuB,KAAK,cAAc;AACzF,SAAO,iCACJ,eAAe,+BAA+B,KAAK,cAAc;AACpE,SAAO,4BAA4B,eAAe,0BAA0B,KAAK,cAAc;AAC/F,SAAO,iCACJ,eAAe,+BAA+B,KAAK,cAAc;AACpE,SAAO,6BACJ,eAAe,2BAA2B,KAAK,cAAc;AAChE,SAAO,6BACJ,eAAe,2BAA2B,KAAK,cAAc;AAChE,SAAO,0BAA0B,eAAe,wBAAwB,KAAK,cAAc;AAC3F,SAAO,2BAA2B,eAAe,yBAAyB,KAAK,cAAc;AAC7F,SAAO,oBAAoB,eAAe,kBAAkB,KAAK,cAAc;AAC/E,SAAO,mBAAmB,eAAe,iBAAiB,KAAK,cAAc;AAC7E,SAAO,oBAAoB,eAAe,kBAAkB,KAAK,cAAc;AAClF;AC3EO,SAAS,gBACb,QACA,MACA,aACK;AAEL,SAAO,iBAAiB,KAAK,eAAe,KAAK,IAAI;AACrD,SAAO,oBAAoB,KAAK,kBAAkB,KAAK,IAAI;AAC3D,SAAO,QAAQ,KAAK,MAAM,KAAK,IAAI;AACnC,SAAO,aAAa,KAAK,WAAW,KAAK,IAAI;AAC7C,SAAO,oBAAoB,KAAK,kBAAkB,KAAK,IAAI;AAC3D,SAAO,qBAAqB,KAAK,mBAAmB,KAAK,IAAI;AAC7D,SAAO,sBAAsB,KAAK,oBAAoB,KAAK,IAAI;AAC/D,SAAO,mBAAmB,KAAK,iBAAiB,KAAK,IAAI;AACzD,SAAO,oBAAoB,KAAK,kBAAkB,KAAK,IAAI;AAC3D,SAAO,wBAAwB,KAAK,sBAAsB,KAAK,IAAI;AACnE,SAAO,cAAc,KAAK,YAAY,KAAK,IAAI;AAC/C,SAAO,iBAAiB,KAAK,eAAe,KAAK,IAAI;AACrD,SAAO,cAAc,KAAK,YAAY,KAAK,IAAI;AAC/C,SAAO,oBAAoB,KAAK,kBAAkB,KAAK,IAAI;AAC3D,SAAO,SAAS,KAAK,OAAO,KAAK,IAAI;AACrC,SAAO,0BAA0B,KAAK,wBAAwB,KAAK,IAAI;AACvE,SAAO,gBAAgB,KAAK,cAAc,KAAK,IAAI;AACnD,SAAO,mBAAmB,KAAK,iBAAiB,KAAK,IAAI;AACzD,SAAO,eAAe,KAAK,aAAa,KAAK,IAAI;AACjD,SAAO,gBAAgB,KAAK,oBAAoB,KAAK,IAAI;AAGzD,SAAO,qBAAqB,KAAK,mBAAmB,KAAK,IAAI;AAC7D,SAAO,YAAY,KAAK,UAAU,KAAK,IAAI;AAC3C,SAAO,kBAAkB,KAAK,gBAAgB,KAAK,IAAI;AACvD,SAAO,gBAAgB,KAAK,cAAc,KAAK,IAAI;AACnD,SAAO,sBAAsB,KAAK,oBAAoB,KAAK,IAAI;AAC/D,SAAO,iBAAiB,KAAK,eAAe,KAAK,IAAI;AACrD,SAAO,yBAAyB,KAAK,uBAAuB,KAAK,IAAI;AACrE,SAAO,yBAAyB,KAAK,uBAAuB,KAAK,IAAI;AACrE,SAAO,qBAAqB,KAAK,mBAAmB,KAAK,IAAI;AAC7D,SAAO,wBAAwB,KAAK,sBAAsB,KAAK,IAAI;AACnE,SAAO,yBAAyB,KAAK,uBAAuB,KAAK,IAAI;AACrE,SAAO,wBAAwB,KAAK,sBAAsB,KAAK,IAAI;AAGnE,SAAO,qBAAqB,KAAK,mBAAmB,KAAK,IAAI;AAG7D,SAAO,0BAA0B,KAAK,wBAAwB,KAAK,IAAI;AACvE,SAAO,yBAAyB,KAAK,uBAAuB,KAAK,IAAI;AACrE,SAAO,8BAA8B,KAAK,4BAA4B,KAAK,IAAI;AAC/E,SAAO,yBAAyB,KAAK,uBAAuB,KAAK,IAAI;AAErE,SAAO,mCAAmC,KAAK,iCAAiC,KAAK,IAAI;AACzF,SAAO,gCAAgC,KAAK,8BAA8B,KAAK,IAAI;AAGnF,SAAO,iBAAiB,YAAY,eAAe,KAAK,WAAW;AACnE,SAAO,gBAAgB,YAAY,cAAc,KAAK,WAAW;AACjE,SAAO,wBAAwB,YAAY,sBAAsB,KAAK,WAAW;AACjF,SAAO,mBAAmB,YAAY,iBAAiB,KAAK,WAAW;AACvE,SAAO,mBAAmB,YAAY,iBAAiB,KAAK,WAAW;AACvE,SAAO,oBAAoB,YAAY,kBAAkB,KAAK,WAAW;AACzE,SAAO,8BAA8B,YAAY,4BAA4B,KAAK,WAAW;AAC7F,SAAO,mBAAmB,YAAY,iBAAiB,KAAK,WAAW;AACvE,SAAO,0BAA0B,YAAY,wBAAwB,KAAK,WAAW;AACrF,SAAO,0BAA0B,YAAY,wBAAwB,KAAK,WAAW;AACrF,SAAO,mBAAmB,YAAY,iBAAiB,KAAK,WAAW;AACvE,SAAO,qBAAqB,YAAY,mBAAmB,KAAK,WAAW;AAC3E,SAAO,wBAAwB,YAAY,sBAAsB,KAAK,WAAW;AACpF;ACnGO,SAAS,iBAAiB,QAAuB,OAAuB;AAC5E,SAAO,WAAW,MAAM,SAAS,KAAK,KAAK;AAC3C,SAAO,4BAA4B,MAAM,0BAA0B,KAAK,KAAK;AAC7E,SAAO,8BAA8B,MAAM,4BAA4B,KAAK,KAAK;AACjF,SAAO,UAAU,MAAM,QAAQ,KAAK,KAAK;AACzC,SAAO,gBAAgB,MAAM,cAAc,KAAK,KAAK;AACrD,SAAO,sBAAsB,MAAM,oBAAoB,KAAK,KAAK;AACjE,SAAO,sBAAsB,MAAM,oBAAoB,KAAK,KAAK;AACjE,SAAO,aAAa,MAAM,WAAW,KAAK,KAAK;AAC/C,SAAO,oBAAoB,MAAM,kBAAkB,KAAK,KAAK;AAC7D,SAAO,oBAAoB,MAAM,kBAAkB,KAAK,KAAK;AAC7D,SAAO,iBAAiB,MAAM,eAAe,KAAK,KAAK;AACvD,SAAO,0BAA0B,MAAM,wBAAwB,KAAK,KAAK;AACzE,SAAO,YAAY,MAAM,UAAU,KAAK,KAAK;AAC7C,SAAO,aAAa,MAAM,WAAW,KAAK,KAAK;AAC/C,SAAO,aAAa,MAAM,WAAW,KAAK,KAAK;AAC/C,SAAO,aAAa,MAAM,WAAW,KAAK,KAAK;AAC/C,SAAO,eAAe,MAAM,aAAa,KAAK,KAAK;AACnD,SAAO,UAAU,MAAM,QAAQ,KAAK,KAAK;AACzC,SAAO,gBAAgB,MAAM,cAAc,KAAK,KAAK;AACrD,SAAO,aAAa,MAAM,WAAW,KAAK,KAAK;AAC/C,SAAO,aAAa,MAAM,WAAW,KAAK,KAAK;AAC/C,SAAO,aAAa,MAAM,WAAW,KAAK,KAAK;AAC/C,SAAO,gBAAgB,MAAM,cAAc,KAAK,KAAK;AACrD,SAAO,cAAc,MAAM,YAAY,KAAK,KAAK;AACjD,SAAO,eAAe,MAAM,aAAa,KAAK,KAAK;AACnD,SAAO,iBAAiB,MAAM,eAAe,KAAK,KAAK;AACvD,SAAO,iBAAiB,MAAM,eAAe,KAAK,KAAK;AACvD,SAAO,iBAAiB,MAAM,eAAe,KAAK,KAAK;AACvD,SAAO,mBAAmB,MAAM,iBAAiB,KAAK,KAAK;AAC3D,SAAO,6BAA6B,MAAM,2BAA2B,KAAK,KAAK;AAClF;AC1BO,SAAS,iBAAiB,QAAuB,OAAuB;AAC5E,SAAO,WAAW,MAAM,SAAS,KAAK,KAAK;AAC3C,SAAO,UAAU,MAAM,QAAQ,KAAK,KAAK;AACzC,SAAO,aAAa,MAAM,WAAW,KAAK,KAAK;AAC/C,SAAO,aAAa,MAAM,WAAW,KAAK,KAAK;AAC/C,SAAO,aAAa,MAAM,WAAW,KAAK,KAAK;AAC/C,SAAO,cAAc,MAAM,YAAY,KAAK,KAAK;AACjD,SAAO,wBAAwB,MAAM,sBAAsB,KAAK,KAAK;AACrE,SAAO,aAAa,MAAM,WAAW,KAAK,KAAK;AAC/C,SAAO,YAAY,MAAM,UAAU,KAAK,KAAK;AAC7C,SAAO,eAAe,MAAM,aAAa,KAAK,KAAK;AACnD,SAAO,eAAe,MAAM,aAAa,KAAK,KAAK;AACnD,SAAO,eAAe,MAAM,aAAa,KAAK,KAAK;AACnD,SAAO,gBAAgB,MAAM,cAAc,KAAK,KAAK;AACrD,SAAO,eAAe,MAAM,aAAa,KAAK,KAAK;AAEnD,SAAO,gBAAgB,MAAM,cAAc,KAAK,KAAK;AACrD,SAAO,eAAe,MAAM,aAAa,KAAK,KAAK;AACnD,SAAO,qBAAqB,MAAM,mBAAmB,KAAK,KAAK;AAC/D,SAAO,kBAAkB,MAAM,gBAAgB,KAAK,KAAK;AACzD,SAAO,kBAAkB,MAAM,gBAAgB,KAAK,KAAK;AACzD,SAAO,kBAAkB,MAAM,gBAAgB,KAAK,KAAK;AAEzD,SAAO,iBAAiB,MAAM,eAAe,KAAK,KAAK;AACvD,SAAO,kBAAkB,MAAM,gBAAgB,KAAK,KAAK;AACzD,SAAO,iBAAiB,MAAM,eAAe,KAAK,KAAK;AACvD,SAAO,mBAAmB,MAAM,iBAAiB,KAAK,KAAK;AAC3D,SAAO,oBAAoB,MAAM,kBAAkB,KAAK,KAAK;AAC7D,SAAO,mBAAmB,MAAM,iBAAiB,KAAK,KAAK;AAE3D,SAAO,oBAAoB,MAAM,kBAAkB,KAAK,KAAK;AAC7D,SAAO,sBAAsB,MAAM,oBAAoB,KAAK,KAAK;AAEjE,SAAO,gBAAgB,MAAM,cAAc,KAAK,KAAK;AACrD,SAAO,kBAAkB,MAAM,gBAAgB,KAAK,KAAK;AACzD,SAAO,uBAAuB,MAAM,qBAAqB,KAAK,KAAK;AACtE;ACnDO,SAAS,kBAAkB,QAAwB,QAAyB;AAEhF,SAAO,gBAAgB,OAAO,cAAc,KAAK,MAAM;AACvD,SAAO,sBAAsB,OAAO,oBAAoB,KAAK,MAAM;AACnE,SAAO,mBAAmB,OAAO,iBAAiB,KAAK,MAAM;AAC7D,SAAO,eAAe,OAAO,aAAa,KAAK,MAAM;AACrD,SAAO,kBAAkB,OAAO,gBAAgB,KAAK,MAAM;AAC3D,SAAO,kBAAkB,OAAO,gBAAgB,KAAK,MAAM;AAC3D,SAAO,kBAAkB,OAAO,gBAAgB,KAAK,MAAM;AAC3D,SAAO,oBAAoB,OAAO,kBAAkB,KAAK,MAAM;AAC/D,SAAO,iBAAiB,OAAO,eAAe,KAAK,MAAM;AACzD,SAAO,oBAAoB,OAAO,kBAAkB,KAAK,MAAM;AAG/D,SAAO,YAAY,OAAO,UAAU,KAAK,MAAM;AAC/C,SAAO,WAAW,OAAO,SAAS,KAAK,MAAM;AAC7C,SAAO,cAAc,OAAO,YAAY,KAAK,MAAM;AACnD,SAAO,cAAc,OAAO,YAAY,KAAK,MAAM;AACnD,SAAO,cAAc,OAAO,YAAY,KAAK,MAAM;AACnD,SAAO,WAAW,OAAO,SAAS,KAAK,MAAM;AAC7C,SAAO,eAAe,OAAO,aAAa,KAAK,MAAM;AACrD,SAAO,iBAAiB,OAAO,eAAe,KAAK,MAAM;AAC5D;ACWO,SAAS,qBACb,QACA,WACA,eACA,YACA,aACK;AAEL,SAAO,eAAe,UAAU,aAAa,KAAK,SAAS;AAC3D,SAAO,cAAc,UAAU,YAAY,KAAK,SAAS;AACzD,SAAO,sBAAsB,UAAU,oBAAoB,KAAK,SAAS;AACzE,SAAO,4BAA4B,UAAU,0BAA0B,KAAK,SAAS;AACrF,SAAO,qBAAqB,UAAU,mBAAmB,KAAK,SAAS;AACvE,SAAO,0BAA0B,UAAU,wBAAwB,KAAK,SAAS;AACjF,SAAO,iBAAiB,UAAU,eAAe,KAAK,SAAS;AAC/D,SAAO,iBAAiB,UAAU,eAAe,KAAK,SAAS;AAC/D,SAAO,6BAA6B,UAAU,2BAA2B,KAAK,SAAS;AACvF,SAAO,iBAAiB,UAAU,eAAe,KAAK,SAAS;AAC/D,SAAO,kBAAkB,UAAU,gBAAgB,KAAK,SAAS;AACjE,SAAO,oBAAoB,UAAU,kBAAkB,KAAK,SAAS;AACrE,SAAO,gBAAgB,UAAU,cAAc,KAAK,SAAS;AAC7D,SAAO,uBAAuB,UAAU,qBAAqB,KAAK,SAAS;AAC3E,SAAO,6BAA6B,UAAU,2BAA2B,KAAK,SAAS;AACvF,SAAO,iCAAiC,UAAU,+BAA+B,KAAK,SAAS;AAC/F,SAAO,eAAe,UAAU,aAAa,KAAK,SAAS;AAG3D,SAAO,mBAAmB,cAAc,iBAAiB,KAAK,aAAa;AAC3E,SAAO,kBAAkB,cAAc,gBAAgB,KAAK,aAAa;AACzE,SAAO,qBAAqB,cAAc,mBAAmB,KAAK,aAAa;AAC/E,SAAO,qBAAqB,cAAc,mBAAmB,KAAK,aAAa;AAC/E,SAAO,qBAAqB,cAAc,mBAAmB,KAAK,aAAa;AAG/E,SAAO,0BAA0B,UAAU,wBAAwB,KAAK,SAAS;AACjF,SAAO,4BAA4B,UAAU,0BAA0B,KAAK,SAAS;AACrF,SAAO,4BAA4B,UAAU,0BAA0B,KAAK,SAAS;AACrF,SAAO,4BAA4B,UAAU,0BAA0B,KAAK,SAAS;AAGrF,SAAO,uBAAuB,UAAU,qBAAqB,KAAK,SAAS;AAC3E,SAAO,sBAAsB,UAAU,oBAAoB,KAAK,SAAS;AACzE,SAAO,iBAAiB,UAAU,eAAe,KAAK,SAAS;AAC/D,SAAO,uBAAuB,UAAU,qBAAqB,KAAK,SAAS;AAG3E,SAAO,gBAAgB,WAAW,cAAc,KAAK,UAAU;AAC/D,SAAO,eAAe,WAAW,aAAa,KAAK,UAAU;AAC7D,SAAO,kBAAkB,WAAW,gBAAgB,KAAK,UAAU;AACnE,SAAO,kBAAkB,WAAW,gBAAgB,KAAK,UAAU;AACnE,SAAO,kBAAkB,WAAW,gBAAgB,KAAK,UAAU;AACnE,SAAO,aAAa,WAAW,WAAW,KAAK,UAAU;AAGzD,SAAO,iBAAiB,YAAY,eAAe,KAAK,WAAW;AACnE,SAAO,gBAAgB,YAAY,cAAc,KAAK,WAAW;AACjE,SAAO,mBAAmB,YAAY,iBAAiB,KAAK,WAAW;AACvE,SAAO,mBAAmB,YAAY,iBAAiB,KAAK,WAAW;AACvE,SAAO,mBAAmB,YAAY,iBAAiB,KAAK,WAAW;AAC1E;AC1EO,SAAS,qBACb,QACA,WACA,YACK;AAEL,SAAO,eAAe,UAAU,aAAa,KAAK,SAAS;AAC3D,SAAO,cAAc,UAAU,YAAY,KAAK,SAAS;AACzD,SAAO,iBAAiB,UAAU,eAAe,KAAK,SAAS;AAC/D,SAAO,iBAAiB,UAAU,eAAe,KAAK,SAAS;AAC/D,SAAO,iBAAiB,UAAU,eAAe,KAAK,SAAS;AAC/D,SAAO,uBAAuB,UAAU,qBAAqB,KAAK,SAAS;AAC3E,SAAO,yBAAyB,UAAU,uBAAuB,KAAK,SAAS;AAC/E,SAAO,yBAAyB,UAAU,uBAAuB,KAAK,SAAS;AAC/E,SAAO,yBAAyB,UAAU,uBAAuB,KAAK,SAAS;AAC/E,SAAO,oBAAoB,UAAU,kBAAkB,KAAK,SAAS;AACrE,SAAO,oBAAoB,UAAU,kBAAkB,KAAK,SAAS;AACrE,SAAO,oBAAoB,UAAU,kBAAkB,KAAK,SAAS;AACrE,SAAO,mBAAmB,UAAU,iBAAiB,KAAK,SAAS;AACnE,SAAO,sBAAsB,UAAU,oBAAoB,KAAK,SAAS;AACzE,SAAO,sBAAsB,UAAU,oBAAoB,KAAK,SAAS;AACzE,SAAO,sBAAsB,UAAU,oBAAoB,KAAK,SAAS;AACzE,SAAO,sBAAsB,UAAU,oBAAoB,KAAK,SAAS;AACzE,SAAO,sBAAsB,UAAU,oBAAoB,KAAK,SAAS;AACzE,SAAO,wBAAwB,UAAU,cAAc,KAAK,SAAS;AACrE,SAAO,uBAAuB,UAAU,aAAa,KAAK,SAAS;AACnE,SAAO,0BAA0B,UAAU,gBAAgB,KAAK,SAAS;AACzE,SAAO,0BAA0B,UAAU,gBAAgB,KAAK,SAAS;AACzE,SAAO,0BAA0B,UAAU,gBAAgB,KAAK,SAAS;AACzE,SAAO,oBAAoB,UAAU,kBAAkB,KAAK,SAAS;AACrE,SAAO,kBAAkB,UAAU,gBAAgB,KAAK,SAAS;AACjE,SAAO,iBAAiB,UAAU,eAAe,KAAK,SAAS;AAC/D,SAAO,0BAA0B,UAAU,wBAAwB,KAAK,SAAS;AACjF,SAAO,sBAAsB,UAAU,oBAAoB,KAAK,SAAS;AACzE,SAAO,uBAAuB,UAAU,qBAAqB,KAAK,SAAS;AAC3E,SAAO,2BAA2B,UAAU,yBAAyB,KAAK,SAAS;AACnF,SAAO,yBAAyB,UAAU,uBAAuB,KAAK,SAAS;AAG/E,SAAO,gBAAgB,WAAW,cAAc,KAAK,UAAU;AAC/D,SAAO,eAAe,WAAW,aAAa,KAAK,UAAU;AAC7D,SAAO,kBAAkB,WAAW,gBAAgB,KAAK,UAAU;AACnE,SAAO,kBAAkB,WAAW,gBAAgB,KAAK,UAAU;AACnE,SAAO,kBAAkB,WAAW,gBAAgB,KAAK,UAAU;AACtE;ACnDO,SAAS,0BACb,QACA,cACA,SACA,mBACK;AAEL,SAAO,kBAAkB,aAAa,gBAAgB,KAAK,YAAY;AACvE,SAAO,2BAA2B,aAAa,yBAAyB,KAAK,YAAY;AACzF,SAAO,qBAAqB,aAAa,mBAAmB,KAAK,YAAY;AAC7E,SAAO,iBAAiB,aAAa,eAAe,KAAK,YAAY;AACrE,SAAO,oBAAoB,aAAa,kBAAkB,KAAK,YAAY;AAC3E,SAAO,oBAAoB,aAAa,kBAAkB,KAAK,YAAY;AAC3E,SAAO,oBAAoB,aAAa,kBAAkB,KAAK,YAAY;AAC3E,SAAO,sBAAsB,aAAa,oBAAoB,KAAK,YAAY;AAC/E,SAAO,yBAAyB,aAAa,uBAAuB,KAAK,YAAY;AAGrF,SAAO,aAAa,QAAQ,WAAW,KAAK,OAAO;AACnD,SAAO,WAAW,QAAQ,SAAS,KAAK,OAAO;AAC/C,SAAO,cAAc,QAAQ,YAAY,KAAK,OAAO;AACrD,SAAO,cAAc,QAAQ,YAAY,KAAK,OAAO;AACrD,SAAO,cAAc,QAAQ,YAAY,KAAK,OAAO;AACrD,SAAO,iBAAiB,QAAQ,eAAe,KAAK,OAAO;AAC3D,SAAO,gBAAgB,QAAQ,cAAc,KAAK,OAAO;AACzD,SAAO,kBAAkB,QAAQ,gBAAgB,KAAK,OAAO;AAC7D,SAAO,oBAAoB,QAAQ,kBAAkB,KAAK,OAAO;AACjE,SAAO,eAAe,QAAQ,aAAa,KAAK,OAAO;AACvD,SAAO,0BAA0B,QAAQ,wBAAwB,KAAK,OAAO;AAC7E,SAAO,kBAAkB,QAAQ,gBAAgB,KAAK,OAAO;AAC7D,SAAO,kBAAkB,QAAQ,gBAAgB,KAAK,OAAO;AAC7D,SAAO,gBAAgB,QAAQ,cAAc,KAAK,OAAO;AAGzD,SAAO,uBAAuB,kBAAkB,qBAAqB,KAAK,iBAAiB;AAC3F,SAAO,yBAAyB,kBAAkB,uBAAuB,KAAK,iBAAiB;AAC/F,SAAO,yBAAyB,kBAAkB,uBAAuB,KAAK,iBAAiB;AAC/F,SAAO,yBAAyB,kBAAkB,uBAAuB,KAAK,iBAAiB;AAClG;ACnBO,SAAS,oBACb,QACA,UACA,WACA,UACA,gBACA,YACA,UACK;AAEL,SAAO,cAAc,SAAS,YAAY,KAAK,QAAQ;AACvD,SAAO,UAAU,SAAS,QAAQ,KAAK,QAAQ;AAG/C,SAAO,qBAAqB,UAAU,mBAAmB,KAAK,SAAS;AACvE,SAAO,kBAAkB,UAAU,gBAAgB,KAAK,SAAS;AACjE,SAAO,sBAAsB,UAAU,oBAAoB,KAAK,SAAS;AAGzE,SAAO,gBAAgB,SAAS,cAAc,KAAK,QAAQ;AAC3D,SAAO,oBAAoB,SAAS,kBAAkB,KAAK,QAAQ;AACnE,SAAO,iBAAiB,SAAS,eAAe,KAAK,QAAQ;AAC7D,SAAO,eAAe,SAAS,aAAa,KAAK,QAAQ;AAGzD,SAAO,oBAAoB,eAAe,kBAAkB,KAAK,cAAc;AAC/E,SAAO,mBAAmB,eAAe,iBAAiB,KAAK,cAAc;AAC7E,SAAO,sBAAsB,eAAe,oBAAoB,KAAK,cAAc;AACnF,SAAO,sBAAsB,eAAe,oBAAoB,KAAK,cAAc;AACnF,SAAO,sBAAsB,eAAe,oBAAoB,KAAK,cAAc;AACnF,SAAO,sBAAsB,eAAe,oBAAoB,KAAK,cAAc;AACnF,SAAO,uBAAuB,eAAe,qBAAqB,KAAK,cAAc;AACrF,SAAO,mBAAmB,eAAe,iBAAiB,KAAK,cAAc;AAC7E,SAAO,mBAAmB,eAAe,iBAAiB,KAAK,cAAc;AAC7E,SAAO,mBAAmB,eAAe,iBAAiB,KAAK,cAAc;AAG7E,SAAO,gBAAgB,WAAW,cAAc,KAAK,UAAU;AAC/D,SAAO,eAAe,WAAW,aAAa,KAAK,UAAU;AAC7D,SAAO,kBAAkB,WAAW,gBAAgB,KAAK,UAAU;AACnE,SAAO,kBAAkB,WAAW,gBAAgB,KAAK,UAAU;AACnE,SAAO,kBAAkB,WAAW,gBAAgB,KAAK,UAAU;AACnE,SAAO,kBAAkB,WAAW,gBAAgB,KAAK,UAAU;AACnE,SAAO,mBAAmB,WAAW,iBAAiB,KAAK,UAAU;AACrE,SAAO,oBAAoB,WAAW,kBAAkB,KAAK,UAAU;AACvE,SAAO,wBAAwB,WAAW,sBAAsB,KAAK,UAAU;AAC/E,SAAO,sBAAsB,WAAW,oBAAoB,KAAK,UAAU;AAC3E,SAAO,0BAA0B,WAAW,wBAAwB,KAAK,UAAU;AACnF,SAAO,wBAAwB,WAAW,sBAAsB,KAAK,UAAU;AAG/E,SAAO,qBAAqB,SAAS,mBAAmB,KAAK,QAAQ;AACrE,SAAO,mBAAmB,SAAS,iBAAiB,KAAK,QAAQ;AACpE;AChFO,SAAS,mBACb,QACA,SACA,eACA,SACK;AAEL,SAAO,aAAa,QAAQ,WAAW,KAAK,OAAO;AACnD,SAAO,eAAe,QAAQ,aAAa,KAAK,OAAO;AACvD,SAAO,eAAe,QAAQ,aAAa,KAAK,OAAO;AAGvD,SAAO,mBAAmB,QAAQ,iBAAiB,KAAK,OAAO;AAC/D,SAAO,qBAAqB,QAAQ,mBAAmB,KAAK,OAAO;AACnE,SAAO,qBAAqB,QAAQ,mBAAmB,KAAK,OAAO;AAGnE,SAAO,mBAAmB,cAAc,iBAAiB,KAAK,aAAa;AAC3E,SAAO,4BAA4B,cAAc,0BAA0B,KAAK,aAAa;AAC7F,SAAO,qBAAqB,cAAc,mBAAmB,KAAK,aAAa;AAC/E,SAAO,yBAAyB,cAAc,uBAAuB,KAAK,aAAa;AACvF,SAAO,qBAAqB,cAAc,mBAAmB,KAAK,aAAa;AAC/E,SAAO,sBAAsB,cAAc,oBAAoB,KAAK,aAAa;AAGjF,SAAO,mBAAmB,QAAQ,iBAAiB,KAAK,OAAO;AAC/D,SAAO,oBAAoB,QAAQ,kBAAkB,KAAK,OAAO;AACjE,SAAO,sBAAsB,QAAQ,oBAAoB,KAAK,OAAO;AACrE,SAAO,sBAAsB,QAAQ,oBAAoB,KAAK,OAAO;AACrE,SAAO,iBAAiB,QAAQ,eAAe,KAAK,OAAO;AAC9D;ACpBO,SAAS,gBACb,QACA,MACA,UACA,WACA,OACA,kBACK;AAEL,SAAO,WAAW,KAAK,SAAS,KAAK,IAAI;AACzC,SAAO,YAAY,KAAK,UAAU,KAAK,IAAI;AAC3C,SAAO,SAAS,KAAK,OAAO,KAAK,IAAI;AACrC,SAAO,mBAAmB,KAAK,iBAAiB,KAAK,IAAI;AACzD,SAAO,YAAY,KAAK,UAAU,KAAK,IAAI;AAC3C,SAAO,YAAY,KAAK,UAAU,KAAK,IAAI;AAC3C,SAAO,yBAAyB,KAAK,uBAAuB,KAAK,IAAI;AAGrE,SAAO,eAAe,SAAS,aAAa,KAAK,QAAQ;AACzD,SAAO,aAAa,SAAS,WAAW,KAAK,QAAQ;AACrD,SAAO,iBAAiB,SAAS,eAAe,KAAK,QAAQ;AAC7D,SAAO,gBAAgB,SAAS,cAAc,KAAK,QAAQ;AAC3D,SAAO,gBAAgB,SAAS,cAAc,KAAK,QAAQ;AAC3D,SAAO,gBAAgB,SAAS,cAAc,KAAK,QAAQ;AAG3D,SAAO,gBAAgB,UAAU,cAAc,KAAK,SAAS;AAC7D,SAAO,gBAAgB,UAAU,cAAc,KAAK,SAAS;AAC7D,SAAO,aAAa,UAAU,WAAW,KAAK,SAAS;AACvD,SAAO,gBAAgB,UAAU,cAAc,KAAK,SAAS;AAC7D,SAAO,gBAAgB,UAAU,cAAc,KAAK,SAAS;AAC7D,SAAO,qBAAqB,UAAU,mBAAmB,KAAK,SAAS;AAGvE,SAAO,YAAY,MAAM,UAAU,KAAK,KAAK;AAC7C,SAAO,qBAAqB,MAAM,mBAAmB,KAAK,KAAK;AAC/D,SAAO,qBAAqB,MAAM,mBAAmB,KAAK,KAAK;AAG/D,SAAO,2BAA2B,iBAAiB,oBAAoB,KAAK,gBAAgB;AAC5F,SAAO,2BAA2B,iBAAiB,oBAAoB,KAAK,gBAAgB;AAC5F,SAAO,0BAA0B,iBAAiB,WAAW,KAAK,gBAAgB;AACrF;ACdO,SAAS,wBACb,QACA,mBACA,aACA,WACA,iBACA,gBACK;AAEL,SAAO,kBAAkB,kBAAkB,UAAU,KAAK,iBAAiB;AAC3E,SAAO,wBAAwB,kBAAkB,gBAAgB,KAAK,iBAAiB;AACvF,SAAO,uBAAuB,kBAAkB,eAAe,KAAK,iBAAiB;AACrF,SAAO,sBAAsB,kBAAkB,cAAc,KAAK,iBAAiB;AACnF,SAAO,sBAAsB,kBAAkB,cAAc,KAAK,iBAAiB;AACnF,SAAO,mBAAmB,kBAAkB,WAAW,KAAK,iBAAiB;AAC7E,SAAO,2BAA2B,kBAAkB,mBAAmB,KAAK,iBAAiB;AAG7F,SAAO,iBAAiB,YAAY,eAAe,KAAK,WAAW;AACnE,SAAO,gBAAgB,YAAY,cAAc,KAAK,WAAW;AACjE,SAAO,sBAAsB,YAAY,oBAAoB,KAAK,WAAW;AAC7E,SAAO,mBAAmB,YAAY,iBAAiB,KAAK,WAAW;AACvE,SAAO,mBAAmB,YAAY,iBAAiB,KAAK,WAAW;AACvE,SAAO,mBAAmB,YAAY,iBAAiB,KAAK,WAAW;AACvE,SAAO,+BAA+B,YAAY,sBAAsB,KAAK,WAAW;AACxF,SAAO,8BAA8B,YAAY,4BAA4B,KAAK,WAAW;AAC7F,SAAO,oBAAoB,YAAY,kBAAkB,KAAK,WAAW;AACzE,SAAO,mBAAmB,YAAY,iBAAiB,KAAK,WAAW;AACvE,SAAO,wBAAwB,YAAY,sBAAsB,KAAK,WAAW;AACjF,SAAO,mBAAmB,YAAY,iBAAiB,KAAK,WAAW;AACvE,SAAO,mBAAmB,YAAY,iBAAiB,KAAK,WAAW;AAGvE,SAAO,eAAe,UAAU,aAAa,KAAK,SAAS;AAC3D,SAAO,cAAc,UAAU,YAAY,KAAK,SAAS;AACzD,SAAO,iBAAiB,UAAU,eAAe,KAAK,SAAS;AAC/D,SAAO,iBAAiB,UAAU,eAAe,KAAK,SAAS;AAC/D,SAAO,iBAAiB,UAAU,eAAe,KAAK,SAAS;AAC/D,SAAO,kBAAkB,UAAU,gBAAgB,KAAK,SAAS;AACjE,SAAO,wBAAwB,UAAU,sBAAsB,KAAK,SAAS;AAC7E,SAAO,sBAAsB,UAAU,oBAAoB,KAAK,SAAS;AAGzE,SAAO,qBAAqB,gBAAgB,mBAAmB,KAAK,eAAe;AACnF,SAAO,oBAAoB,gBAAgB,kBAAkB,KAAK,eAAe;AACjF,SAAO,0BAA0B,gBAAgB,wBAAwB,KAAK,eAAe;AAC7F,SAAO,uBAAuB,gBAAgB,qBAAqB,KAAK,eAAe;AACvF,SAAO,uBAAuB,gBAAgB,qBAAqB,KAAK,eAAe;AACvF,SAAO,uBAAuB,gBAAgB,qBAAqB,KAAK,eAAe;AACvF,SAAO,qBAAqB,gBAAgB,mBAAmB,KAAK,eAAe;AACnF,SAAO,qBAAqB,gBAAgB,mBAAmB,KAAK,eAAe;AACnF,SAAO,0BAA0B,gBAAgB,wBAAwB,KAAK,eAAe;AAC7F,SAAO,sBAAsB,gBAAgB,oBAAoB,KAAK,eAAe;AACrF,SAAO,oBAAoB,gBAAgB,kBAAkB,KAAK,eAAe;AACjF,SAAO,sBAAsB,gBAAgB,oBAAoB,KAAK,eAAe;AACrF,SAAO,sBAAsB,gBAAgB,oBAAoB,KAAK,eAAe;AAGrF,SAAO,8BACJ,eAAe,4BAA4B,KAAK,cAAc;AACjE,SAAO,qBAAqB,eAAe,mBAAmB,KAAK,cAAc;AACjF,SAAO,oBAAoB,eAAe,kBAAkB,KAAK,cAAc;AAC/E,SAAO,iBAAiB,eAAe,eAAe,KAAK,cAAc;AACzE,SAAO,oBAAoB,eAAe,kBAAkB,KAAK,cAAc;AAC/E,SAAO,oBAAoB,eAAe,kBAAkB,KAAK,cAAc;AAClF;ACnHO,SAAS,oBAAoB,QAA0B,gBAAmC;AAC9F,SAAO,oBAAoB,eAAe,kBAAkB,KAAK,cAAc;AAC/E,SAAO,mBAAmB,eAAe,iBAAiB,KAAK,cAAc;AAC7E,SAAO,sBAAsB,eAAe,oBAAoB,KAAK,cAAc;AACnF,SAAO,sBAAsB,eAAe,oBAAoB,KAAK,cAAc;AACnF,SAAO,sBAAsB,eAAe,oBAAoB,KAAK,cAAc;AACnF,SAAO,iBAAiB,eAAe,eAAe,KAAK,cAAc;AACzE,SAAO,oBAAoB,eAAe,kBAAkB,KAAK,cAAc;AAC/E,SAAO,mBAAmB,eAAe,iBAAiB,KAAK,cAAc;AAC7E,SAAO,oBAAoB,eAAe,kBAAkB,KAAK,cAAc;AAC/E,SAAO,qBAAqB,eAAe,mBAAmB,KAAK,cAAc;AACjF,SAAO,0BAA0B,eAAe,wBAAwB,KAAK,cAAc;AAC3F,SAAO,sBAAsB,eAAe,oBAAoB,KAAK,cAAc;AACtF;ACZO,SAAS,0BACb,QACA,gBACD;AACC,SAAO,0BAA0B,eAAe,wBAAwB,KAAK,cAAc;AAC3F,SAAO,2BAA2B,eAAe,yBAAyB,KAAK,cAAc;AAC7F,SAAO,2BAA2B,eAAe,yBAAyB,KAAK,cAAc;AAC7F,SAAO,2BAA2B,eAAe,yBAAyB,KAAK,cAAc;AAC7F,SAAO,6BACJ,eAAe,2BAA2B,KAAK,cAAc;AAChE,SAAO,6BACJ,eAAe,2BAA2B,KAAK,cAAc;AAChE,SAAO,sBAAsB,eAAe,oBAAoB,KAAK,cAAc;AACnF,SAAO,wBAAwB,eAAe,sBAAsB,KAAK,cAAc;AACvF,SAAO,wBAAwB,eAAe,sBAAsB,KAAK,cAAc;AACvF,SAAO,wBAAwB,eAAe,sBAAsB,KAAK,cAAc;AACvF,SAAO,wBAAwB,eAAe,sBAAsB,KAAK,cAAc;AACvF,SAAO,uBAAuB,eAAe,qBAAqB,KAAK,cAAc;AACrF,SAAO,uBAAuB,eAAe,qBAAqB,KAAK,cAAc;AACxF;ACNO,SAAS,0BACb,QACA,gBACK;AACL,SAAO,oBAAoB,eAAe,kBAAkB,KAAK,cAAc;AAC/E,SAAO,mBAAmB,eAAe,iBAAiB,KAAK,cAAc;AAC7E,SAAO,sBAAsB,eAAe,oBAAoB,KAAK,cAAc;AACnF,SAAO,sBAAsB,eAAe,oBAAoB,KAAK,cAAc;AACnF,SAAO,uBAAuB,eAAe,qBAAqB,KAAK,cAAc;AACrF,SAAO,0BAA0B,eAAe,wBAAwB,KAAK,cAAc;AAC3F,SAAO,0BAA0B,eAAe,wBAAwB,KAAK,cAAc;AAC3F,SAAO,sBAAsB,eAAe,oBAAoB,KAAK,cAAc;AACnF,SAAO,4BAA4B,eAAe,0BAA0B,KAAK,cAAc;AAC/F,SAAO,4BAA4B,eAAe,0BAA0B,KAAK,cAAc;AAC/F,SAAO,4BAA4B,eAAe,0BAA0B,KAAK,cAAc;AAE/F,SAAO,mBAAmB,eAAe,iBAAiB,KAAK,cAAc;AAC7E,SAAO,oBAAoB,eAAe,kBAAkB,KAAK,cAAc;AAC/E,SAAO,iBAAiB,eAAe,eAAe,KAAK,cAAc;AACzE,SAAO,oBAAoB,eAAe,kBAAkB,KAAK,cAAc;AAC/E,SAAO,oBAAoB,eAAe,kBAAkB,KAAK,cAAc;AAE/E,SAAO,kBAAkB,eAAe,gBAAgB,KAAK,cAAc;AAC3E,SAAO,gBAAgB,eAAe,cAAc,KAAK,cAAc;AACvE,SAAO,eAAe,eAAe,aAAa,KAAK,cAAc;AACrE,SAAO,gBAAgB,eAAe,cAAc,KAAK,cAAc;AACvE,SAAO,kBAAkB,eAAe,gBAAgB,KAAK,cAAc;AAC3E,SAAO,kBAAkB,eAAe,gBAAgB,KAAK,cAAc;AAC3E,SAAO,mBAAmB,eAAe,iBAAiB,KAAK,cAAc;AAC7E,SAAO,yBAAyB,eAAe,uBAAuB,KAAK,cAAc;AAC5F;ACAO,IAAM,oBAAN,MAwBP;;EAEU;;EAGG;;EAGV;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;EAGA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;EAGA;EACA;EACA;EACA;;EAGA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;EAGA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;EAEA;EACA;EACA;EACA;EACA;;EAEA;EACA;EACA;;EAEA;EACA;EACA;EACA;;EAGA;EACA;EACA;EACA;EACA;EACA;EACA;;EAGA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;EAGA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;EAGA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;EAGA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;EAGA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;EAGA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;EAGA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;EAEA;EACA;EACA;;EAGA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;EAGA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;EAGA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;EAGA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;EAGA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;EAGA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;EAGA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;EAGA;EACA;EACA;EACA;EACA;EACA;EACA;;EAGA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;EAGA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;EAGA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;EAGA;EACA;EACA;EACA;EACA;EACA;;EAGA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA,YAAY,QAA4B,SAAiB,aAA4B;AAElF,UAAM,OAAO,iBAAiB,QAAQ,SAAS,WAAW;AAG1D,SAAK,OAAO;AAGZ,SAAK,uBAAuB,KAAK;AAGjC,qBAAiB,MAAM,KAAK,OAAO,KAAK,SAAS;AACjD,qBAAiB,MAAM,KAAK,KAAK;AACjC,qBAAiB,MAAM,KAAK,OAAO,KAAK,GAAG;AAC3C,yBAAqB,MAAM,KAAK,SAAS;AACzC,uBAAmB,MAAM,KAAK,OAAO;AACrC,sBAAkB,MAAM,KAAK,MAAM;AACnC,8BAA0B,MAAM,KAAK,cAAc;AACnD,wBAAoB,MAAM,KAAK,cAAc;AAC7C,4BAAwB,MAAM,KAAK,YAAY;AAC/C,0BAAsB,MAAM,KAAK,YAAY,KAAK,oBAAoB;AACtE,oBAAgB,MAAM,KAAK,MAAM,KAAK,WAAW;AACjD,qBAAiB,MAAM,KAAK,KAAK;AACjC,qBAAiB,MAAM,KAAK,KAAK;AACjC,sBAAkB,MAAM,KAAK,MAAM;AACnC;MACG;MACA,KAAK;MACL,KAAK;MACL,KAAK;MACL,KAAK;IACR;AACA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","names":["FeatureCategory","FeatureVisibility","ScopeCategory","AccessLevel","Scope","MemberType","McpServerState","ToolkitState","EventRuleObjectType","EventRuleEventType","EventRuleActionType","WorkspaceFeature","MemberFeature","OrgFeature","Resource","ProductType","WorkspaceProvisionStatus","InvitationStatus","FhirVendor","FhirConnectionState","FhirClientType","QualificationType","QualificationStatus","RequirementType","CriterionType","SubmissionStatus","AccessGrantResourceType","AccessGrantStatus","AccessGrantTrigger","ConsentMethod"]}
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}