@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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../../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","../../client/src/types/dataTypes.ts","../../client/src/types/calendarTypes.ts"],"sourcesContent":["/**\n * @gravity-rail/sdk — Public API surface\n *\n * Re-exports all public types and classes from the internal client package,\n * excluding admin/superuser functionality (AdminApi, Admin* types, ApiClient).\n */\nexport * from '@gravity-rail/client/public';\n","// 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","// Data-related types extracted from main types.ts file\n// This file contains all types related to data types, data records, data fields, and data integrity management\n\nimport type { AccountReportItem } from './accountTypes';\nimport type { MemberReportItem } from './memberTypes';\n\n// ===== DATA FIELD TYPES =====\n\nexport enum DataFieldType {\n ENUM = 'enum',\n EMAIL = 'email',\n PHONE = 'phone',\n TEXT = 'text',\n LONGTEXT = 'longtext',\n NUMBER = 'number',\n DATE = 'date',\n DATETIME = 'datetime',\n TIME_OF_DAY = 'time_of_day',\n US_ZIP_CODE = 'us_zip_code',\n INTEGER = 'integer',\n BOOLEAN = 'boolean',\n ARRAY = 'array',\n OBJECT = 'object',\n FUNCTION = 'function',\n}\n\nexport enum IndexStatus {\n NONE = 'none',\n PENDING = 'pending',\n CREATING = 'creating',\n REMOVING = 'removing',\n READY = 'ready',\n ERROR = 'error',\n}\n\nexport interface DataField {\n id?: number;\n name: string;\n slug: string;\n description?: string;\n required: boolean;\n fieldType: DataFieldType;\n options?: EnumOption[];\n referencedTypeId?: number;\n shouldIndex?: boolean;\n indexStatus?: IndexStatus;\n adminOnly?: boolean;\n defaultValue?: any;\n order: number;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface DataFieldFormData {\n name: string;\n slug: string;\n description?: string;\n required: boolean;\n fieldType: DataFieldType;\n options?: EnumOption[];\n referencedTypeId?: number;\n shouldIndex?: boolean;\n indexStatus?: IndexStatus;\n adminOnly?: boolean;\n defaultValue?: any;\n}\n\n// ===== SCHEMA FIELD TYPES =====\n// Strongly-typed field definitions (canonical representation)\n\n/**\n * Label-value pair for enum field options.\n * Allows enum fields to have user-friendly labels while storing clean values\n * (e.g., numbers for scoring calculations in CEL expressions).\n */\nexport interface EnumOption {\n /** Display label shown to users */\n label: string;\n /** Stored value (can be string or number) */\n value: string | number;\n /**\n * CEL expression that must return true for this option to be visible.\n * Uses record.data.<field_slug> syntax to reference other field values.\n * CONSTRAINT: Can only reference non-FUNCTION fields.\n */\n visibleWhen?: string;\n}\n\n/**\n * SchemaField is the canonical representation of a data type field.\n * This is the type returned by the API and stored in the database.\n * Display order is determined by array position, not the order field.\n */\nexport interface SchemaField {\n /** Unique field identifier */\n slug: string;\n /** Display name for the field */\n name: string;\n /** Optional field description */\n description?: string;\n /** Field type (text, email, enum, etc.) */\n fieldType: DataFieldType;\n /** Whether field is required */\n required: boolean;\n /** @deprecated Display order is now determined by array position */\n order?: number;\n /** Options for enum fields as {label, value} objects. */\n options?: EnumOption[];\n /** Referenced DataType ID for reference fields */\n referencedTypeId?: number;\n /** Whether to index this field */\n shouldIndex?: boolean;\n /** Whether only admins can see this field */\n adminOnly?: boolean;\n /** Default value for the field */\n defaultValue?: any;\n /** CEL expression that computes this field's value from other fields */\n celFunction?: string;\n /**\n * CEL expression for cross-field validation.\n * Context: 'value' (current field value), 'record.data.<field_slug>' (other fields).\n * Returns: true if valid, or a string error message if invalid.\n * CONSTRAINT: Can only reference non-FUNCTION fields.\n */\n validateCel?: string;\n}\n\n// ===== DATA TYPE TYPES =====\n\nexport interface DataType {\n id: number;\n name: string;\n slug: string;\n uuid: string;\n description?: string;\n prompt?: string;\n isCollection: boolean;\n pinned?: boolean;\n archived: boolean;\n ownerId: number | null;\n createdAt: string;\n updatedAt: string;\n /** Typed field definitions */\n fields: SchemaField[];\n}\n\nexport interface DataTypeFormData {\n name: string;\n slug: string;\n description?: string;\n prompt?: string;\n isCollection: boolean;\n pinned?: boolean;\n /** Typed field definitions */\n fields: SchemaField[];\n ownerId?: number | null;\n}\n\n// ===== DATA RECORD TYPES =====\n\nexport interface DataRecord {\n id: number;\n dataTypeId: number;\n memberId: number;\n fieldValues: Record<string, any>;\n externalId?: string;\n assignmentTaskId?: number;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface DataRecordFormData {\n memberId?: number;\n /** Member external ID (alternative to memberId). Cannot be used with memberId. */\n memberExternalId?: string;\n fieldValues: Record<string, any>;\n externalId?: string;\n assignmentTaskId?: number;\n}\n\n// ===== DATA RECORD AUDIT TRAIL =====\n\nexport interface DataRecordUpdate {\n id: number;\n dataRecordId: number;\n memberId: number;\n fieldName: string;\n oldValue?: string | null;\n newValue?: string | null;\n createdAt: string;\n updatedAt: string;\n assignmentTaskId?: number | null;\n memberName?: string | null;\n}\n\n// ===== DATA RECORD PAGINATION =====\n\nexport interface DataRecordsPaginatedResponse {\n records: DataRecord[];\n pagination: {\n page: number;\n page_size: number;\n total_count: number;\n total_pages: number;\n has_next: boolean;\n has_prev: boolean;\n };\n}\n\n// ===== DATA RECORD ACCESS MODE TYPES =====\n// Used by Assignment data record associations\n\nexport interface DataRecordWithAccessMode extends DataRecord {\n accessMode: number;\n}\n\nexport interface DataRecordAssociationFormData {\n id: number;\n accessMode: number;\n}\n\n// ===== DATA INTEGRITY TYPES =====\n\nexport interface DataRecordReportItem {\n id: number;\n data_type_id: number;\n data_type_name: string;\n data_type_slug: string;\n values: Record<string, any>;\n created_at: string;\n updated_at: string;\n external_id?: string | null;\n}\n\nexport interface DataIntegrityReportItem {\n member: MemberReportItem;\n account: AccountReportItem;\n data_records: DataRecordReportItem[];\n possible_matches: DataIntegrityReportItem[];\n issues: string[];\n normalized_phone?: string | null;\n}\n\n// ===== DATA EXPORT/IMPORT TYPES =====\n\nexport interface DataTypeExportItem {\n uuid: string;\n name: string;\n description: string | null;\n}\n\nexport interface TaskExportDataTypeRelation {\n taskUuid: string;\n dataTypeUuid: string;\n accessMode: number;\n}\n\n// ===== BULK IMPORT TYPES =====\n\n/**\n * Result for a single record in a bulk import operation.\n */\nexport interface BulkRecordResult {\n index: number;\n status: 'created' | 'updated' | 'failed';\n recordId?: number | null;\n externalId?: string | null;\n error?: string | null;\n}\n\n/**\n * Response for bulk create data records operation.\n */\nexport interface BulkCreateDataRecordResponse {\n importedCount: number;\n totalCount: number;\n success: boolean;\n results: BulkRecordResult[];\n errors?: string[] | null;\n}\n\n/**\n * Request body for bulk create data records.\n */\nexport interface BulkCreateDataRecordRequest {\n records: DataRecordFormData[];\n upsert?: boolean;\n}\n","/**\n * Calendar-related types for the Gravity Rail calendar and appointment booking system.\n */\n\n// Calendar Permission Types\nexport enum CalendarPermissionType {\n NONE = 'NONE',\n FREE_BUSY = 'FREE_BUSY',\n READ = 'READ',\n WRITE = 'WRITE',\n ADMIN = 'ADMIN',\n}\n\nexport enum CalendarSource {\n INTERNAL = 'internal',\n GOOGLE = 'google',\n OUTLOOK = 'outlook',\n}\n\n// Calendar types\nexport interface Calendar {\n id: number;\n uuid: string;\n templateUuid: string | null;\n name: string;\n slug: string;\n description: string | null;\n timezone: string;\n color: string | null;\n isPublic: boolean;\n ownerId: number;\n ownerName: string | null;\n remoteCalendarId?: string | null;\n syncStatus?: string | null;\n syncError?: string | null;\n lastSyncedAt?: string | null;\n calendarSource: CalendarSource;\n eventTypeIds: number[];\n schedules: CalendarSchedule[];\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface CalendarFormData {\n name: string;\n slug?: string;\n description?: string | null;\n timezone?: string;\n color?: string | null;\n isPublic?: boolean;\n eventTypeIds?: number[];\n}\n\nexport interface CalendarSchedule {\n id: number;\n uuid: string;\n name: string;\n description: string | null;\n availabilityType: CalendarScheduleAvailabilityType;\n recurrenceType: CalendarScheduleRecurrence;\n startTime: string;\n endTime: string;\n recurrenceRule: Record<string, any> | null;\n recurrenceEndDate: string | null;\n daysOfWeek: string[] | null;\n priority: number;\n eventTypeIds: number[];\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface CalendarScheduleFormData {\n name: string;\n description?: string | null;\n availabilityType: CalendarScheduleAvailabilityType;\n recurrenceType: CalendarScheduleRecurrence;\n startTime: string;\n endTime: string;\n recurrenceRule?: Record<string, any> | null;\n recurrenceEndDate?: string | null;\n daysOfWeek?: string[] | null;\n priority?: number;\n eventTypeIds?: number[] | null;\n}\n\nexport enum CalendarScheduleRecurrence {\n ONCE = 'ONCE',\n DAILY = 'DAILY',\n WEEKLY = 'WEEKLY',\n MONTHLY = 'MONTHLY',\n CUSTOM = 'CUSTOM',\n}\n\nexport enum CalendarScheduleAvailabilityType {\n AVAILABLE = 'AVAILABLE',\n UNAVAILABLE = 'UNAVAILABLE',\n}\n\n// Event type types\nexport interface CalendarEventType {\n id: number;\n uuid: string;\n templateUuid: string | null;\n name: string;\n slug: string;\n description: string | null;\n defaultDurationMinutes: number;\n bufferBeforeMinutes: number;\n bufferAfterMinutes: number;\n minAttendees: number;\n maxAttendees: number | null;\n color: string | null;\n active: boolean;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface CalendarEventTypeFormData {\n name: string;\n slug?: string;\n description?: string | null;\n defaultDurationMinutes: number;\n bufferBeforeMinutes?: number;\n bufferAfterMinutes?: number;\n minAttendees?: number;\n maxAttendees?: number | null;\n color?: string | null;\n active?: boolean;\n}\n\n// Event types\nexport interface CalendarEvent {\n id: number;\n uuid: string;\n calendarId: number;\n calendarName: string;\n eventTypeId: number;\n eventTypeName: string;\n eventTypeColor: string | null;\n title: string;\n description: string | null;\n location: string | null;\n startTime: string;\n endTime: string;\n status: CalendarEventStatus;\n creatorMemberId: number | null;\n creatorAssistantId: number | null;\n workflowId: number | null;\n taskId: number | null;\n assignmentId: number | null;\n chatId: number | null;\n messageId: number | null;\n cancelledAt: string | null;\n cancelledByMemberId: number | null;\n cancellationReason: string | null;\n recurrenceRule: string | null;\n recurringEventId: string | null;\n isRecurringInstance: boolean;\n originalStartTime: string | null;\n remoteEventId: string | null;\n attendees: CalendarEventAttendee[];\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface CalendarEventFormData {\n calendarId: number;\n eventTypeId: number;\n title: string;\n description?: string | null;\n location?: string | null;\n startTime: string;\n attendeeIds: number[];\n workflowId?: number | null;\n taskId?: number | null;\n assignmentId?: number | null;\n}\n\nexport enum CalendarEventStatus {\n TENTATIVE = 'TENTATIVE',\n CONFIRMED = 'CONFIRMED',\n CANCELLED = 'CANCELLED',\n NO_SHOW = 'NO_SHOW',\n COMPLETED = 'COMPLETED',\n}\n\nexport interface CalendarEventAttendee {\n id: number;\n memberId: number;\n status: AttendeeStatus;\n responseStatus: AttendeeResponseStatus;\n responseAt: string | null;\n note: string | null;\n}\n\nexport enum AttendeeStatus {\n REQUIRED = 'REQUIRED',\n OPTIONAL = 'OPTIONAL',\n}\n\nexport enum AttendeeResponseStatus {\n PENDING = 'PENDING',\n ACCEPTED = 'ACCEPTED',\n DECLINED = 'DECLINED',\n TENTATIVE = 'TENTATIVE',\n}\n\n// iCal Feed Types\nexport interface ICalFeedTokenResponse {\n feedUrl: string;\n tokenGeneratedAt: string; // ISO 8601 datetime\n calendarId: number;\n calendarUuid: string;\n}\n\nexport interface ICalFeedUrlResponse {\n feedUrl: string | null;\n hasToken: boolean;\n tokenGeneratedAt: string | null; // ISO 8601 datetime\n}\n\nexport interface UpdateAttendeeRequest {\n responseStatus: AttendeeResponseStatus;\n note?: string | null;\n}\n\n// Availability types\nexport interface AvailabilityCheck {\n eventTypeId: number;\n startTime: string;\n endTime?: string | null;\n}\n\nexport interface AvailabilityResponse {\n available: boolean;\n reason?: string | null;\n}\n\nexport interface AvailableSlotsRequest {\n eventTypeId: number;\n startDate: string;\n endDate: string;\n slotIntervalMinutes?: number;\n}\n\nexport interface AvailableSlotsResponse {\n slots: string[];\n eventTypeId: number;\n calendarId: number;\n}\n\n// Query params\nexport interface CalendarEventsQueryParams {\n calendarId?: number;\n startDate?: string;\n endDate?: string;\n status?: CalendarEventStatus;\n memberId?: number;\n limit?: number;\n offset?: number;\n}\n\n// Google Calendar Integration Types\nexport interface GoogleCalendarInfo {\n id: string;\n summary: string;\n description?: string;\n timeZone: string;\n backgroundColor?: string;\n accessRole: string;\n primary: boolean;\n}\n\nexport interface GoogleCalendarStatusResponse {\n connected: boolean;\n email?: string;\n calendars: GoogleCalendarInfo[];\n insufficientScopes?: boolean;\n}\n\nexport interface GoogleCalendarInsufficientScopesResponse {\n connected: boolean;\n insufficientScopes: true;\n email?: string;\n reAuthUrl: string;\n}\n\nexport interface LinkCalendarRequest {\n googleCalendarId: string;\n}\n\nexport interface LinkCalendarResponse {\n status: string;\n message: string;\n googleCalendarId: string;\n googleCalendarName?: string;\n}\n\nexport interface UnlinkCalendarResponse {\n status: string;\n message: string;\n}\n\nexport interface SyncCalendarResponse {\n status: string;\n message: string;\n created: number;\n updated: number;\n errors: Array<{ event_id: string; error: string }>;\n}\n"],"mappings":"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,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,QA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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","DataFieldType","IndexStatus","CalendarPermissionType","CalendarSource","CalendarScheduleRecurrence","CalendarScheduleAvailabilityType","CalendarEventStatus","AttendeeStatus","AttendeeResponseStatus"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/api/base.ts","../src/api/abilities.ts","../src/api/accessGrants.ts","../src/api/agent-jobs.ts","../src/api/agent-tasks.ts","../src/api/agents.ts","../src/api/aiModels.ts","../src/api/apiKeys.ts","../src/api/apps.ts","../src/api/assignments.ts","../src/api/voice.ts","../src/api/auth.ts","../src/api/builders.ts","../src/api/calendars.ts","../src/api/calls.ts","../src/api/cel.ts","../src/api/chats.ts","../src/api/confluence.ts","../src/api/customToolkits.ts","../src/api/dataTypes.ts","../src/api/discord-bots.ts","../src/api/slack-apps.ts","../src/api/events.ts","../src/api/features.ts","../src/api/fhir-connections.ts","../src/api/healthie.ts","../src/api/files.ts","../src/api/inboxes.ts","../src/api/inquiries.ts","../src/api/appConnections.ts","../src/api/mcpServers.ts","../src/api/members.ts","../src/api/milestones.ts","../src/api/monday.ts","../src/api/notificationRules.ts","../src/api/operator-groups.ts","../src/api/org.ts","../src/api/oauth.ts","../src/api/phoneNumbers.ts","../src/api/pronunciations.ts","../src/api/prompts.ts","../src/api/personas.ts","../src/api/qualifications.ts","../src/api/reports.ts","../src/api/salesforce.ts","../src/api/connection-sync.ts","../src/api/hubspot.ts","../src/api/sites.ts","../src/api/subscriptions.ts","../src/api/customers.ts","../src/api/resellers.ts","../src/api/supervisors.ts","../src/api/tasks.ts","../src/api/templates.ts","../src/api/toolkits.ts","../src/api/journeys.ts","../src/api/workflows.ts","../src/api/workflow-notes.ts","../src/types/coreTypes.ts","../src/types/memberTypes.ts","../src/types/mcpServerTypes.ts","../src/types/toolkitTypes.ts","../src/types/eventTypes.ts","../src/types/billingTypes.ts","../src/types/workspaceTypes.ts","../src/types/invitationTypes.ts","../src/types/dataTypes.ts","../src/types/aiModelTypes.ts","../src/types/calendarTypes.ts","../src/types/fhirConnectionTypes.ts","../src/types/qualificationTypes.ts","../src/types/accessGrantTypes.ts","../src/api/workspaceInvitations.ts","../src/api/workspaces.ts","../src/app-context.ts","../src/client/api-modules.ts","../src/client/bindings/access-grants.ts","../src/client/bindings/agent-jobs.ts","../src/client/bindings/agent-tasks.ts","../src/client/bindings/agents.ts","../src/client/bindings/tasks.ts","../src/client/bindings/chats.ts","../src/client/bindings/calls.ts","../src/client/bindings/data-types.ts","../src/client/bindings/members.ts","../src/client/bindings/workspaces.ts","../src/client/bindings/auth.ts","../src/client/bindings/sites.ts","../src/client/bindings/files.ts","../src/client/bindings/events.ts","../src/client/bindings/workflows.ts","../src/client/bindings/calendars.ts","../src/client/bindings/communications.ts","../src/client/bindings/toolkits.ts","../src/client/bindings/billing.ts","../src/client/bindings/apps.ts","../src/client/bindings/integrations.ts","../src/client/bindings/operator-groups.ts","../src/client/bindings/pronunciations.ts","../src/client/bindings/journeys.ts","../src/client/bindings/qualifications.ts","../src/client/bindings/personas.ts","../src/client/bindings/customers.ts","../src/client/bindings/resellers.ts","../src/client/bindings/prompts.ts","../src/client/client.ts","../src/types/abilityTypes.ts","../src/types/modelConfigTypes.ts","../src/features/registry.ts","../src/constants/chatTypes.ts","../src/constants/models.ts","../src/types/resourceMetadata.ts","../src/scopes.ts"],"sourcesContent":["/**\n * Public API surface — excludes admin/superuser types and classes.\n *\n * Used by @gravity-rail/sdk. Instead of re-exporting through the types.ts barrel\n * (which includes admin types via export *), this file exports from each type\n * sub-module individually. Admin-containing modules use selective exports.\n *\n * Admin types excluded: AdminAccount, AdminAccountFormData, AdminAccountMembership,\n * AdminAccountOrgMembership, AdminOrganization, AdminWorkspaceMemberFormData,\n * AdminInboxMappingRequest, AdminWorkspace,\n * AdminWorkspaceFormData, AdminUpdateProductRequest\n */\n\n// ===== API Classes and Types =====\nexport { AppsApi } from './api';\nexport type {\n AIUsageReport,\n AIUsageReportParams,\n ApiScope,\n AuthorizeRequest,\n AuthorizeResponse,\n BoardsResponse,\n ColumnsResponse,\n DayAggregatedData,\n DayCallAggregatedData,\n ModelUsageStats,\n MondayBoard,\n MondayColumn,\n MondayColumnSettings,\n MondayCreateWebhookParams,\n MondayStatusLabel,\n MondayWebhookConfig,\n MondayWebhookDetails,\n MondayWebhookResponse,\n OAuthAuthorizeResponse,\n OAuthConnectionStatus,\n OAuthProviderSlug,\n PhoneAggregatedData,\n PhoneCallAggregatedData,\n PhoneUsageReport,\n PhoneUsageReportParams,\n PhoneUsageRow,\n ProviderUsageSummary,\n SMSUsageReport,\n SMSUsageReportParams,\n SMSUsageRow,\n STTProviderSummary,\n STTUsageRow,\n ScopesListResponse,\n ThinkingSoundPreviewRequest,\n TTSPreviewRequest,\n TTSProviderSummary,\n TTSUsageRow,\n VoiceUsageReport,\n VoiceUsageReportParams,\n} from './api';\nexport { ApiError, BaseApiClient, getCookieValue } from './api/base';\nexport type {\n ApiValidationError,\n EnhancedAuthHandler,\n OrgAuthHandler,\n OrgAuthInfo,\n} from './api/base';\nexport { BuildersApi } from './api/builders';\nexport { CELApi } from './api/cel';\nexport { OrgApi } from './api/org';\nexport { SupervisorsApi } from './api/supervisors';\nexport type { SupervisorFormData } from './api/supervisors';\nexport { TemplatesApi } from './api/templates';\nexport type {\n RegistryVariable,\n TemplateContextRequest,\n TemplateContextResponse,\n TemplatePreviewRequest,\n TemplatePreviewResponse,\n TemplateVariable,\n VariableRegistryRequest,\n VariableRegistryResponse,\n} from './api/templates';\nexport type { WorkspaceScope, WorkspaceScopesResponse } from './api/workspaces';\nexport * from './app-context';\n\n// ===== Public client only — excludes ApiClient, bindings, api-modules =====\nexport { GravityRailClient } from './client/client';\n\n// ===== Types — individual sub-module exports (bypasses types.ts barrel to exclude admin types) =====\n\n// Non-admin modules: safe to export everything\nexport * from './types/abilityTypes';\nexport * from './types/accessGrantTypes';\nexport * from './types/aiModelTypes';\nexport * from './types/appConnectionTypes';\nexport * from './types/appTypes';\nexport * from './types/modelConfigTypes';\nexport * from './types/builderTypes';\nexport * from './types/calendarTypes';\nexport * from './types/celTypes';\nexport * from './types/chatTypes';\nexport * from './types/coreTypes';\nexport * from './types/customToolTypes';\nexport * from './types/dataTypes';\nexport * from './types/discordBotTypes';\nexport * from './types/eventRuleTypes';\nexport * from './types/eventTypes';\nexport * from './types/fhirConnectionTypes';\nexport * from './types/fileTypes';\nexport * from './types/healthDashboardTypes';\nexport * from './types/inquiryTypes';\nexport * from './types/invitationTypes';\nexport * from './types/mcpServerTypes';\nexport * from './types/memberFieldTypes';\nexport * from './types/memberTypes';\nexport * from './types/milestoneTypes';\nexport * from './types/notificationTypes';\nexport * from './types/operatorTypes';\nexport * from './types/pronunciationTypes';\nexport * from './types/qualificationTypes';\nexport * from './types/siteTypes';\nexport * from './types/slackAppTypes';\nexport * from './types/sortTypes';\nexport * from './types/statsTypes';\nexport * from './types/taskTypes';\nexport * from './types/themeTypes';\nexport * from './types/toolkitTypes';\nexport * from './types/usageReportingTypes';\nexport * from './types/voiceMetricsTypes';\nexport * from './types/workspaceHealthTypes';\n\n// Cross-module re-export disambiguation:\n// MemberCredential & CredentialProvider exist in both appConnectionTypes (defined)\n// and discordBotTypes (re-exported). Explicit export resolves the ambiguity.\nexport type { CredentialProvider, MemberCredential } from './types/appConnectionTypes';\n\n// API module re-exports that types.ts provides via import+re-export\nexport type {\n GroupsResponse,\n CurrentUserInfoResponse as MondayCurrentUserInfoResponse,\n MondayGroup,\n} from './api/monday';\nexport type {\n NotificationRule,\n NotificationRuleCreate,\n NotificationRuleUpdate,\n} from './api/notificationRules';\n\n// workspaceBuilderTypes — exports use Builder-prefixed names to avoid collision\n// with the canonical TaskExport/WorkflowExport/WorkspaceExportData defined in\n// types_workspace_transfer.\nexport type {\n BuildWorkspaceRequest,\n BuildWorkspaceResponse,\n WorkspaceBuildPreview,\n WorkspaceBuilderExportData,\n WorkspaceBuilderInfo,\n WorkspaceBuilderListResponse,\n WorkspaceBuilderTaskExport,\n WorkspaceBuilderWorkflowExport,\n} from './types/workspaceBuilderTypes';\n\n// ===== Admin-containing modules — selective exports (Admin* types excluded) =====\n\n// accountTypes (excludes: AdminAccount, AdminAccountFormData, AdminAccountMembership,\n// AdminAccountOrgMembership, AdminOrganization, AdminWorkspaceMemberFormData)\nexport type {\n Account,\n AccountFormData,\n AccountLookupResponse,\n AccountReportItem,\n AccountState,\n AddAccountToOrgRequest,\n ApiKey,\n ApiKeyCreated,\n ApiKeyFormData,\n ApiKeyScope,\n ApiKeyScopesResponse,\n CancelCredentialChangeInviteResponse,\n CancelCredentialChangeResponse,\n CreateAccountOrgMembershipRequest,\n CreateAccountOrgMembershipResponse,\n CreateCredentialChangeInviteRequest,\n CreateOrganizationRequest,\n CredentialChangeInviteConfirmResponse,\n CredentialChangeInviteDetails,\n CredentialChangeInviteResponse,\n CredentialChangeRequestResponse,\n CredentialChangeVerifyResponse,\n CredentialType,\n CurrentOrgMember,\n DeleteAccountOrgMembershipResponse,\n DetailedAccount,\n DuplicateAccountInfo,\n ErrorResponse,\n GenerateRecoveryCodesRequest,\n LoginRequest,\n LoginResponse,\n LogoUploadRequest,\n LogoUploadResponse,\n MemberOrgView,\n MemberWorkspaceInfo,\n MissingMembershipItem,\n OrgMember,\n OrgMemberListResponse,\n OrgMemberRole,\n Organization,\n PendingCredentialChange,\n PendingCredentialChangeInvite,\n RecoveryCodesResponse,\n RequestCredentialChangeRequest,\n RequestMagicLinkRequest,\n RequestMagicLinkResponse,\n SMSLoginResponse,\n SSOConfig,\n SSOConfigData,\n SendEmailVerificationRequest,\n SetupTOTPRequest,\n SetupWebAuthnRequest,\n TOTPSetupResponse,\n TwoFactorMethod,\n TwoFactorOperationResponse,\n TwoFactorStatus,\n UpdateOrgMemberRequest,\n UpdateOrganizationRequest,\n UpdateTwoFactorMethodRequest,\n ValidateMagicLinkRequest,\n ValidateMagicLinkResponse,\n VerifyCodeRequest,\n VerifyCodeResponse,\n VerifyCredentialChangeRequest,\n VerifyEmailRequest,\n VerifyTOTPSetupRequest,\n VerifyWebAuthnSetupRequest,\n} from './types/accountTypes';\n\n// communicationTypes (excludes: AdminInboxMappingRequest)\nexport type {\n Channel,\n ChatCompletionError,\n CleanupChatsResponse,\n DomainMapping,\n Email,\n EmailAttachment,\n EmailConversionResponse,\n GenerateSummariesResponse,\n Inbox,\n InboxCreateRequest,\n InboxMapping,\n InboxMappingDetailResponse,\n InboxUpdateRequest,\n InitiateCallRequest,\n InitiateCallResponse,\n LinkablePhone,\n MessageTimingResponse,\n OutboundCallRequest,\n OutboundCallResponse,\n PhoneCall,\n PhoneNumber,\n PhoneNumberFormData,\n ProviderPhoneNumber,\n RealtimeChatError,\n SMSMessage,\n SpamScore,\n UnmappedPhoneNumber,\n VoiceTokenResponse,\n} from './types/communicationTypes';\n\n// workspaceTypes (excludes: AdminWorkspace, AdminWorkspaceFormData)\n// NOTE: WorkspaceFeature is re-exported here from billingTypes — exported in billing section below\nexport { WorkspaceProvisionStatus } from './types/workspaceTypes';\nexport type {\n AvailableMemberRole,\n BusinessHoursDay,\n ClientWorkspace,\n FeatureStatusValue,\n PublicWorkspace,\n SiteMapping,\n SiteMappingFormData,\n Workspace,\n WorkspaceAccessDeniedData,\n WorkspaceCounts,\n WorkspaceDefaults,\n WorkspaceDefaultsFormData,\n WorkspaceFeatureInfo,\n WorkspaceFormData,\n WorkspaceGrantReason,\n WorkspaceJoinRequest,\n WorkspaceJoinResponse,\n WorkspaceStatsResponse,\n} from './types/workspaceTypes';\n\n// billingTypes (excludes: AdminUpdateProductRequest)\nexport {\n MemberFeature,\n ORG_ONLY_RESOURCES,\n OrgFeature,\n ProductType,\n Resource,\n WorkspaceFeature,\n} from './types/billingTypes';\nexport type {\n UsageDashboardResponse,\n BillingPlanInfo,\n BillingResourceCounts,\n BillingUsageInfo,\n CompareWithStripeResponse,\n CreateProductRequest,\n PaginatedSubscriptionsResponse,\n PlanComparisonResult,\n PlanConfiguration,\n PlatformUsageData,\n Product,\n ProductFeature,\n ProductFeatureKey,\n ProductImage,\n ProductLimits,\n ProductLink,\n ProductMetadata,\n ProductPlan,\n ProductPlans,\n ResourceOverage,\n StripeAddress,\n StripeCardDetails,\n StripeComparisonResult,\n StripeCustomer,\n StripeCustomerCreateRequest,\n StripeCustomerUpdateRequest,\n StripePaymentMethod,\n StripePlanDetail,\n StripePrice,\n StripeProduct,\n StripeShipping,\n StripeSubscriptionCreateRequest,\n StripeSubscriptionUpdateRequest,\n StripeTax,\n StripeUSBankAccountDetails,\n Subscription,\n SubscriptionUpdateRequest,\n SyncProductToStripeRequest,\n SyncProductToStripeResponse,\n UsageDiscrepancy,\n} from './types/billingTypes';\n\n// ===== Non-types exports =====\nexport * from './types_workspace_transfer';\n\n// Feature Registry\nexport * from './features';\n\n// Constants\nexport * from './constants';\n\n// Resource Metadata\nexport {\n getAllResourceSlugs,\n getApplicableResourceSlugs,\n getApplicableResources,\n getResourceMetadata,\n getScopeFromProductType,\n} from './types/resourceMetadata';\nexport type { ResourceMetadata, ResourceScope } from './types/resourceMetadata';\n\n// Scopes\nexport { SCOPES, SCOPE_PRESETS, ScopeCategory, ScopeManager } from './scopes';\nexport type { ScopeName } from './scopes';\n","// 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\n/**\n * Structured validation error returned by the backend's workflow-expression\n * validator (CEL / Jinja schema checks). See WorkflowValidationErrorResponse\n * in workflowValidationTypes.ts for the public-facing shape.\n */\nexport interface ApiValidationError {\n field: string;\n kind: 'cel_syntax' | 'cel_schema' | 'jinja_syntax' | 'jinja_schema';\n message: string;\n offendingPath: string | null;\n location: {\n start: number;\n end: number;\n line: number;\n column: number;\n length: number;\n } | null;\n suggestion: string | null;\n}\n\nfunction isApiValidationError(value: unknown): value is ApiValidationError {\n if (!value || typeof value !== 'object') return false;\n const v = value as Record<string, unknown>;\n return (\n typeof v.field === 'string' && typeof v.kind === 'string' && typeof v.message === 'string'\n );\n}\n\nexport class ApiError extends Error {\n statusCode: number;\n /** Legacy string-array errors — kept for non-validation callers. */\n errors?: string[];\n /**\n * Structured workflow-expression validation errors (CEL/Jinja).\n * Populated when the backend returns a WorkflowValidationErrorResponse.\n */\n validationErrors?: ApiValidationError[];\n\n constructor(\n message: string,\n statusCode: number,\n errors?: string[],\n validationErrors?: ApiValidationError[]\n ) {\n super(message);\n this.statusCode = statusCode;\n this.errors = errors;\n this.validationErrors = validationErrors;\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 // Don't set Content-Type for FormData — the browser must set it\n // with the multipart boundary automatically.\n ...(options?.body instanceof FormData ? {} : { '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 ApiError(`Validation Error:\\n${formattedErrors}`, response.status);\n }\n\n // Handle validation errors with errors array (new format)\n if (errorData.errors && Array.isArray(errorData.errors)) {\n // Structured workflow-expression validation errors — objects with\n // { field, kind, message, offendingPath, location }. Build a\n // readable message and preserve the structured payload.\n if (errorData.errors.length > 0 && isApiValidationError(errorData.errors[0])) {\n const validationErrors: ApiValidationError[] =\n errorData.errors.filter(isApiValidationError);\n const [first] = validationErrors;\n if (first) {\n const extra =\n validationErrors.length > 1\n ? ` (+${validationErrors.length - 1} more)`\n : '';\n const readable = `${first.field}: ${first.message}${extra}`;\n throw new ApiError(\n readable,\n response.status,\n validationErrors.map((e) => `${e.field}: ${e.message}`),\n validationErrors\n );\n }\n }\n\n // Legacy string-array errors.\n const stringErrors: string[] = errorData.errors.filter(\n (e: unknown): e is string => typeof e === 'string'\n );\n const details = stringErrors.join('; ');\n const message = errorData.detail\n ? `${errorData.detail}: ${details}`\n : `Validation failed: ${details}`;\n throw new ApiError(message, response.status, stringErrors);\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 ...(options?.body instanceof FormData ? {} : { '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 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 /** List access grants received by the current member. */\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 /** List access grants given by the current member. */\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 /** Get a single access grant by UUID. */\n async getAccessGrant(wid: string, uuid: string): Promise<AccessGrant> {\n return this.fetch<AccessGrant>(`w/${wid}/access-grants/${uuid}`);\n }\n\n /** Create a new access grant for a resource. */\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 /** Resolve a pending access grant by approving or denying it. */\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 /** Revoke a previously approved access grant. */\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 /** List all access grants with optional filtering by status, resource type, and resource ID. */\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('page_size', 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 /** Get all access grants for a specific member. */\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 { BaseApiClient } from './base';\nimport type { AgentJob, AgentJobRun, CreateAgentJobRequest, UpdateAgentJobRequest } from '../types';\n\nexport class AgentJobsApi extends BaseApiClient {\n async listAgentJobs(\n wid: string,\n params?: { jobType?: string; status?: string; chatId?: number }\n ): Promise<AgentJob[]> {\n const searchParams = new URLSearchParams();\n if (params?.jobType) searchParams.set('jobType', params.jobType);\n if (params?.status) searchParams.set('status', params.status);\n if (params?.chatId) searchParams.set('chatId', String(params.chatId));\n const qs = searchParams.toString();\n return this.fetch<AgentJob[]>(`w/${wid}/agent-jobs${qs ? `?${qs}` : ''}`);\n }\n\n async getAgentJob(wid: string, jobId: number): Promise<AgentJob> {\n return this.fetch<AgentJob>(`w/${wid}/agent-jobs/${jobId}`);\n }\n\n async createAgentJob(wid: string, data: CreateAgentJobRequest): Promise<AgentJob> {\n return this.fetch<AgentJob>(`w/${wid}/agent-jobs`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n async updateAgentJob(\n wid: string,\n jobId: number,\n data: UpdateAgentJobRequest\n ): Promise<AgentJob> {\n return this.fetch<AgentJob>(`w/${wid}/agent-jobs/${jobId}`, {\n method: 'PUT',\n body: JSON.stringify(data),\n });\n }\n\n async deleteAgentJob(wid: string, jobId: number): Promise<void> {\n await this.fetchRaw(`w/${wid}/agent-jobs/${jobId}`, { method: 'DELETE' });\n }\n\n async getAgentJobRuns(wid: string, jobId: number): Promise<AgentJobRun[]> {\n return this.fetch<AgentJobRun[]>(`w/${wid}/agent-jobs/${jobId}/runs`);\n }\n}\n","import { BaseApiClient } from './base';\nimport type {\n AgentTaskMessageResponse,\n AgentTaskResponse,\n CancelAgentTaskResponse,\n GetAgentTaskMessagesParams,\n ListAgentTasksParams,\n} from '../types';\n\nexport class AgentTasksApi extends BaseApiClient {\n async getAgentTasks(wid: string, params?: ListAgentTasksParams): Promise<AgentTaskResponse[]> {\n const searchParams = new URLSearchParams();\n if (params?.status) searchParams.set('status', params.status);\n if (params?.agentMemberId != null)\n searchParams.set('agent_member_id', String(params.agentMemberId));\n if (params?.parentTaskId != null)\n searchParams.set('parent_task_id', String(params.parentTaskId));\n if (params?.limit != null) searchParams.set('limit', String(params.limit));\n const qs = searchParams.toString();\n return this.fetch<AgentTaskResponse[]>(`w/${wid}/agent-tasks${qs ? `?${qs}` : ''}`);\n }\n\n async getAgentTask(wid: string, taskUuid: string): Promise<AgentTaskResponse> {\n return this.fetch<AgentTaskResponse>(`w/${wid}/agent-tasks/${taskUuid}`);\n }\n\n async cancelAgentTask(wid: string, taskUuid: string): Promise<CancelAgentTaskResponse> {\n return this.fetch<CancelAgentTaskResponse>(`w/${wid}/agent-tasks/${taskUuid}/cancel`, {\n method: 'POST',\n });\n }\n\n async getAgentTaskMessages(\n wid: string,\n taskUuid: string,\n params?: GetAgentTaskMessagesParams\n ): Promise<AgentTaskMessageResponse[]> {\n const searchParams = new URLSearchParams();\n if (params?.limit != null) searchParams.set('limit', String(params.limit));\n const qs = searchParams.toString();\n return this.fetch<AgentTaskMessageResponse[]>(\n `w/${wid}/agent-tasks/${taskUuid}/messages${qs ? `?${qs}` : ''}`\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 /** List agents in a workspace with optional pagination, sorting, and search. */\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 /** Get a single agent by ID. */\n async getAgent(wid: string, id: number): Promise<Agent> {\n return this.fetch<Agent>(`w/${wid}/agents/${id}`);\n }\n\n /** Create a new agent in a workspace. */\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 /** Update an existing agent. */\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 /** Delete an agent by ID, optionally forcing deletion of agents with active references. */\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 /** Archive an agent, hiding it from default listings. */\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 /** Restore an archived agent back to active status. */\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\n /** List all API keys for a workspace. */\n async getApiKeys(wid: string): Promise<ApiKey[]> {\n return this.fetch<ApiKey[]>(`w/${wid}/api-keys`);\n }\n\n /** Create a new API key for a workspace. */\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 /** Revoke a workspace API key. */\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\n /** List all account-level API keys. */\n async getGlobalApiKeys(): Promise<ApiKey[]> {\n return this.fetch<ApiKey[]>(`account/api-keys`);\n }\n\n /** Create a new account-level API key. */\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 /** Revoke an account-level API key. */\n async revokeGlobalApiKey(id: number): Promise<void> {\n return this.fetch(`account/api-keys/${id}`, {\n method: 'DELETE',\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?: {\n public?: boolean;\n workspaceUuid?: string;\n builderId?: number;\n }): Promise<AppListResponse> {\n const queryParams = new URLSearchParams();\n if (params?.public) queryParams.append('public', 'true');\n if (params?.workspaceUuid !== undefined)\n queryParams.append('workspace_uuid', params.workspaceUuid);\n if (params?.builderId !== undefined)\n 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}\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 /** List assignments with optional filtering, pagination, and sorting. */\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 /** Get a single assignment by ID. */\n async getAssignment(wid: string, id: number): Promise<Assignment> {\n return this.fetch<Assignment>(`w/${wid}/assignments/${id}`);\n }\n\n /** Get all chat messages for an assignment. */\n async getAssignmentMessages(wid: string, id: number): Promise<ChatMessage[]> {\n return this.fetch<ChatMessage[]>(`w/${wid}/assignments/${id}/messages`);\n }\n\n /** Update an assignment by ID. */\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 /** Delete an assignment by ID. */\n async deleteAssignment(wid: string, id: number): Promise<void> {\n return this.fetch(`w/${wid}/assignments/${id}`, {\n method: 'DELETE',\n });\n }\n\n /** Get a specific task within an assignment. */\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 /** Set the current active task for an assignment. */\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 /** Create a new assignment for a member. */\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 /** Get the current task detail for an assignment from the operator perspective. */\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 /** Get the CEL expression evaluation context for an assignment. */\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 /** Cancel an active assignment with an optional reason. */\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 /** List available tools for an assignment. */\n async getAssignmentTools(wid: string, assignmentId: number): Promise<ToolsResponse> {\n return this.fetch<ToolsResponse>(`w/${wid}/assignments/${assignmentId}/tools`);\n }\n\n /** Execute a tool within an assignment context. */\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';\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 interface ThinkingSoundPreviewRequest {\n sound: string; // Sound name (e.g., \"typing\", \"strumming\")\n volume?: number | null; // Volume level (0-100). Missing or null means full volume.\n}\n\nexport class VoiceApi extends BaseApiClient {\n /** Generate a text-to-speech audio preview for a given voice model. */\n async previewTTS(wid: string, request: TTSPreviewRequest): Promise<ArrayBuffer> {\n const response = await this.fetchRaw(`w/${wid}/agents/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 /** Generate a thinking sound audio preview. */\n async previewThinkingSound(\n wid: string,\n request: ThinkingSoundPreviewRequest\n ): Promise<ArrayBuffer> {\n const response = await this.fetchRaw(`w/${wid}/agents/thinking-sound-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 {\n // If parsing fails, return original (backend will handle validation)\n }\n\n return phoneNumber;\n}\n\nexport class AuthApi extends BaseApiClient {\n /** Get the authenticated user's account. */\n async getUserAccount(): Promise<Account> {\n return this.fetch<Account>('account');\n }\n\n /** Update the authenticated user's account information. */\n async updateUserAccount(info: AccountFormData): Promise<Account> {\n return this.fetch('account', {\n method: 'POST',\n body: JSON.stringify(info),\n });\n }\n\n /** Initiate SMS login by sending a verification code to the given phone number. */\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 /** Resend the SMS verification code to the given phone number. */\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 /** Verify an SMS code and complete authentication, handling 2FA if required. */\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 /** Log in with email and password credentials. */\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 /** Sign up a new account with email and password. */\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 /** Change the current account password by providing the existing password. */\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 /** Set a password for an account that does not yet have one. */\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 /** Check whether the current account has a password set. */\n async getPasswordStatus(): Promise<{ hasPassword: boolean }> {\n return await this.fetch<{ hasPassword: boolean }>(`auth/password-status`);\n }\n\n /** Log out the current session by clearing auth cookies. */\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 cross-domain authentication token for single sign-on across domains. */\n async requestCrossDomainToken(): Promise<{ token: string }> {\n return this.fetch<{ token: string }>('auth/cross-domain-token', {\n method: 'POST',\n });\n }\n\n /** Exchange a cross-domain token for an authenticated session token. */\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 /** Get the organization and workspace mapping for a custom domain. */\n async getDomainMapping(customDomain: string): Promise<DomainMapping> {\n return this.fetch<DomainMapping>(`s/mapping/${customDomain}`);\n }\n\n /** Create a new signup with member and data records for a workspace. */\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 /** Request a magic link to be sent to the given email address for passwordless login. */\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 /** Validate a magic link token and optional OTP to complete authentication. */\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 /** Send a verification code to the given email address for login. */\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 /** Verify an email code and complete authentication, handling 2FA if required. */\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 /** Get the current two-factor authentication status and configured methods. */\n async getTwoFactorStatus(): Promise<TwoFactorStatus> {\n return this.fetch<TwoFactorStatus>('auth/2fa/status');\n }\n\n /** Initiate TOTP two-factor setup and receive the secret and QR code URI. */\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 /** Verify a TOTP code to complete two-factor setup. */\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 /** Initiate WebAuthn (passkey/security key) two-factor setup. */\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 /** Verify a WebAuthn assertion to complete two-factor setup. */\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 /** Generate new two-factor recovery codes, invalidating any existing ones. */\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 /** Disable a specific two-factor authentication method. */\n async disableTwoFactorMethod(methodId: number): Promise<TwoFactorOperationResponse> {\n return this.fetch<TwoFactorOperationResponse>(`auth/2fa/methods/${methodId}`, {\n method: 'DELETE',\n });\n }\n\n /** Update settings for a two-factor authentication method. */\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 /** Verify a TOTP code during login to complete two-factor authentication. */\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 /** Verify a recovery code during login to complete two-factor authentication. */\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 /** Get WebAuthn credential request options for two-factor login verification. */\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 /** Verify a WebAuthn assertion during login to complete two-factor authentication. */\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 /** List all organizations the current account belongs to. */\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 /** Get current consent state for the authenticated account. */\n async getConsentState(): Promise<ConsentStateResponse> {\n return this.fetch<ConsentStateResponse>('account/consent');\n }\n\n /** Record consent decisions (batch). */\n async updateConsent(\n consents: Array<{ consent_type: string; granted: boolean; policy_version?: string }>\n ): Promise<ConsentStateResponse> {\n return this.fetch<ConsentStateResponse>('account/consent', {\n method: 'POST',\n body: JSON.stringify({ consents }),\n });\n }\n}\n\nexport interface ConsentStateItem {\n consent_type: string;\n granted: boolean;\n updated_at: string;\n policy_version: string | null;\n}\n\nexport interface ConsentStateResponse {\n consents: ConsentStateItem[];\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 (optionally all with superuser access)\n */\n async listBuilders(all?: boolean): 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 */\n async getBuilder(builderId: string): 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(builderId: string, request: UpdateBuilderRequest): 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}\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 /** List calendars in a workspace with optional pagination. */\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 /** Get a single calendar by ID, optionally including its schedules. */\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 /** Create a new calendar in the workspace. */\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 /** Update a calendar's configuration. */\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 /** Delete a calendar by ID. */\n async deleteCalendar(wid: string, id: number): Promise<void> {\n return this.fetch(`w/${wid}/calendars/${id}`, {\n method: 'DELETE',\n });\n }\n\n /** List all schedules for a calendar. */\n async getCalendarSchedules(wid: string, calendarId: number): Promise<CalendarSchedule[]> {\n return this.fetch<CalendarSchedule[]>(`w/${wid}/calendars/${calendarId}/schedules`);\n }\n\n /** Create a new schedule for a calendar. */\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 /** Update an existing calendar schedule. */\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 /** Delete a calendar schedule. */\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 /** Check availability for a time range on a calendar. */\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 /** Get available booking slots for a calendar within a date range. */\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 /** List calendar events with optional filtering by date range, status, and member. */\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 /** Get a single calendar event by ID. */\n async getCalendarEvent(wid: string, eventId: number): Promise<CalendarEvent> {\n return this.fetch<CalendarEvent>(`w/${wid}/calendar-events/${eventId}`);\n }\n\n /** Create a new calendar event. */\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 /** Update an existing calendar event. */\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 /** Cancel a calendar event with an optional reason. */\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 /** Delete a calendar event by ID. */\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 /** Update an attendee's details on a calendar event. */\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 /** List all calendar event types in the workspace. */\n async getEventTypes(wid: string): Promise<PaginatedResponse<CalendarEventType>> {\n return this.fetch<PaginatedResponse<CalendarEventType>>(`w/${wid}/calendar-event-types`);\n }\n\n /** Get a single calendar event type by ID. */\n async getEventType(wid: string, id: number): Promise<CalendarEventType> {\n return this.fetch<CalendarEventType>(`w/${wid}/calendar-event-types/${id}`);\n }\n\n /** Create a new calendar event type. */\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 /** Update an existing calendar event type. */\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 /** Delete a calendar event type by ID. */\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 /** Generate or regenerate an iCal feed token for a calendar. */\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 /** Revoke the iCal feed token for a calendar, disabling external feed access. */\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 /** Get the iCal feed URL for a calendar. */\n async getICalFeedUrl(wid: string, calendarId: number): Promise<ICalFeedUrlResponse> {\n return this.fetch<ICalFeedUrlResponse>(`w/${wid}/calendars/${calendarId}/ical-url`);\n }\n\n /** List Google Calendars available for linking. */\n async listGoogleCalendars(wid: string): Promise<GoogleCalendarInfo[]> {\n return this.fetch<GoogleCalendarInfo[]>(`w/${wid}/calendars/google/list`);\n }\n\n /** Get the Google Calendar integration status for the workspace. */\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 /** Link a calendar to a Google Calendar for two-way sync. */\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 /** Unlink a calendar from its connected Google Calendar. */\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 /** Trigger a manual sync between a calendar and its linked Google Calendar. */\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 /** Initiate a new outbound call. */\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 /** Get a voice authentication token for real-time audio. */\n async getVoiceToken(wid: string): Promise<VoiceTokenResponse> {\n return this.fetch<VoiceTokenResponse>(`w/${wid}/voice/token`);\n }\n\n /** Get message timing data for a chat recording. */\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 { 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","import {\n Chat,\n ChatFilter,\n ChatFilterFormData,\n ChatFormData,\n ChatLabel,\n ChatLabelFormData,\n ChatMessage,\n ChatTokenUsage,\n GetChatsOptions,\n OutboundCallResponse,\n PaginatedResponse,\n PhoneCall,\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 /** List chats with optional filtering, sorting, and pagination. */\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 /** Export multiple chats as a downloadable blob. */\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 /** Export a single chat in the specified format as a downloadable blob. */\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 /** Get a single chat by ID. */\n async getChat(wid: string, id: number): Promise<Chat> {\n return this.fetch<Chat>(`w/${wid}/chats/${id}`);\n }\n\n /** Get token usage statistics for a chat. */\n async getChatTokenUsage(wid: string, chatId: number): Promise<ChatTokenUsage> {\n return this.fetch<ChatTokenUsage>(`w/${wid}/chats/${chatId}/token-usage`);\n }\n\n /** Get todo items extracted from a chat. */\n async getChatTodos(wid: string, chatId: number): Promise<{ todos: TodoItem[] }> {\n return this.fetch<{ todos: TodoItem[] }>(`w/${wid}/chats/${chatId}/todos`);\n }\n\n /** Get loaded and revealed skills for a chat. */\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 /** List chat IDs that need a response. */\n async getChatsNeedsResponse(wid: string): Promise<number[]> {\n return this.fetch<number[]>(`w/${wid}/chats/needs-response`);\n }\n\n /** Get daily chat creation statistics with optional filtering. */\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 /** Archive a chat. */\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 /** Unarchive a chat. */\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 /** Create a new chat. */\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 /** Delete a chat, optionally providing a reason. */\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 /** Update a chat's properties. */\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 /** Update the mute status of a chat. */\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 /** Update the needs-response flag on a chat. */\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 /** Generate an AI summary for a chat, optionally updating its labels. */\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 /** List messages in a chat with optional pagination. */\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 /** List messages associated with a specific tool call in a chat. */\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 /** Get the tools available in a chat. */\n async getChatTools(wid: string, chatId: number): Promise<ToolsResponse> {\n return this.fetch<ToolsResponse>(`w/${wid}/chats/${chatId}/tools`);\n }\n\n /** Initiate an outbound phone call from a chat. */\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 /** Send a message as the assistant in a chat, optionally including tool calls. */\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 /** Rate a chat message by its UUID. */\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 /** Get assignment tasks linked to a chat. */\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 /** Create a chat completion using the OpenAI-compatible 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 /** List all chat labels in a workspace. */\n async getChatLabels(wid: string): Promise<ChatLabel[]> {\n return this.fetch<ChatLabel[]>(`w/${wid}/chat-labels`);\n }\n\n /** Get a chat label by ID. */\n async getChatLabel(wid: string, id: number): Promise<ChatLabel> {\n return this.fetch<ChatLabel>(`w/${wid}/chat-labels/${id}`);\n }\n\n /** Get a chat label by UUID. */\n async getChatLabelByUuid(wid: string, uuid: string): Promise<ChatLabel> {\n return this.fetch<ChatLabel>(`w/${wid}/chat-labels/${uuid}`);\n }\n\n /** Create a new chat label. */\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 /** Update a chat label. */\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 /** Delete a chat label. */\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 /** Get distinct tool call names used across workspace chats. */\n async getToolCallNames(wid: string): Promise<string[]> {\n return this.fetch<string[]>(`w/${wid}/chats/tool-call-names`);\n }\n\n /** List all chat filters in a workspace. */\n async getChatFilters(wid: string): Promise<ChatFilter[]> {\n return this.fetch<ChatFilter[]>(`w/${wid}/chat-filters`);\n }\n\n /** Get a chat filter by ID. */\n async getChatFilter(wid: string, id: number): Promise<ChatFilter> {\n return this.fetch<ChatFilter>(`w/${wid}/chat-filters/${id}`);\n }\n\n /** Get a chat filter by UUID. */\n async getChatFilterByUuid(wid: string, uuid: string): Promise<ChatFilter> {\n return this.fetch<ChatFilter>(`w/${wid}/chat-filters/by-uuid/${uuid}`);\n }\n\n /** Create a new chat filter. */\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 /** Update a chat filter. */\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 /** Delete a chat filter. */\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 /** Get phone calls associated with a chat. */\n async getChatPhoneCalls(wid: string, chatId: number): Promise<PhoneCall[]> {\n return this.fetch<PhoneCall[]>(`w/${wid}/chats/${chatId}/phone-calls`);\n }\n}\n","import { BaseApiClient } from './base';\n\nexport interface ConfluenceConnectionStatus {\n connectionId: number | null;\n configured: boolean;\n connected: boolean;\n enabled: boolean;\n state: string | null;\n siteUrl: string | null;\n cloudId: string | null;\n authorizeUrl: string | null;\n error: string | null;\n creatorId: number | null;\n authorizedByMemberId: number | null;\n authorizedAt: string | null;\n}\n\nexport interface ConfigureConfluenceRequest {\n clientId: string;\n clientSecret: string;\n}\n\nexport interface ConfluenceSpace {\n id: string;\n key: string;\n name: string;\n type: string;\n}\n\nexport interface ConfluenceSpacesResponse {\n results: ConfluenceSpace[];\n cursor: string | null;\n hasMore: boolean;\n}\n\nexport interface ConfluencePage {\n id: string;\n title: string;\n status: string;\n parentId: string | null;\n}\n\nexport interface ConfluencePagesResponse {\n results: ConfluencePage[];\n cursor: string | null;\n hasMore: boolean;\n}\n\nexport class ConfluenceApi extends BaseApiClient {\n async configureConfluence(\n wid: string,\n data: ConfigureConfluenceRequest\n ): Promise<ConfluenceConnectionStatus> {\n return this.fetch<ConfluenceConnectionStatus>(\n `w/${wid}/app-connections/confluence/configure`,\n {\n method: 'POST',\n body: JSON.stringify(data),\n }\n );\n }\n\n async startConfluenceOAuth(wid: string): Promise<ConfluenceConnectionStatus> {\n return this.fetch<ConfluenceConnectionStatus>(\n `w/${wid}/app-connections/confluence/oauth/start`,\n {\n method: 'POST',\n }\n );\n }\n\n async getConfluenceStatus(wid: string): Promise<ConfluenceConnectionStatus> {\n return this.fetch<ConfluenceConnectionStatus>(`w/${wid}/app-connections/confluence/status`);\n }\n\n async disconnectConfluence(wid: string): Promise<ConfluenceConnectionStatus> {\n return this.fetch<ConfluenceConnectionStatus>(\n `w/${wid}/app-connections/confluence/disconnect`,\n {\n method: 'DELETE',\n }\n );\n }\n\n async disableConfluence(wid: string): Promise<ConfluenceConnectionStatus> {\n return this.fetch<ConfluenceConnectionStatus>(`w/${wid}/app-connections/confluence/disable`, {\n method: 'POST',\n });\n }\n\n async enableConfluence(wid: string): Promise<ConfluenceConnectionStatus> {\n return this.fetch<ConfluenceConnectionStatus>(`w/${wid}/app-connections/confluence/enable`, {\n method: 'POST',\n });\n }\n\n async deleteConfluence(wid: string): Promise<{ status: string }> {\n return this.fetch<{ status: string }>(`w/${wid}/app-connections/confluence/delete`, {\n method: 'DELETE',\n });\n }\n\n async listConfluenceSpaces(\n wid: string,\n params?: { cursor?: string; limit?: number }\n ): Promise<ConfluenceSpacesResponse> {\n const qs = new URLSearchParams();\n if (params?.cursor) qs.set('cursor', params.cursor);\n if (params?.limit) qs.set('limit', String(params.limit));\n const query = qs.toString();\n return this.fetch<ConfluenceSpacesResponse>(\n `w/${wid}/app-connections/confluence/spaces${query ? `?${query}` : ''}`\n );\n }\n\n async listConfluencePages(\n wid: string,\n spaceId: string,\n params?: { cursor?: string; limit?: number }\n ): Promise<ConfluencePagesResponse> {\n const qs = new URLSearchParams({ space_id: spaceId });\n if (params?.cursor) qs.set('cursor', params.cursor);\n if (params?.limit) qs.set('limit', String(params.limit));\n return this.fetch<ConfluencePagesResponse>(\n `w/${wid}/app-connections/confluence/pages?${qs.toString()}`\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 /** List all data types for a workspace, optionally filtering by archived status. */\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 /** Get a single data type by ID. */\n async getDataType(wid: string, id: number): Promise<DataType> {\n return this.fetch<DataType>(`w/${wid}/data-types/${id}`);\n }\n\n /** Get a single data type by its slug. */\n async getDataTypeBySlug(wid: string, slug: string): Promise<DataType> {\n return this.fetch<DataType>(`w/${wid}/data-types/slug/${slug}`);\n }\n\n /** Create a new data type definition in the workspace. */\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 /** Update an existing data type definition. */\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 /** Delete a data type definition by ID. */\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 /** Archive a data type, hiding it from default listings. */\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 /** Restore an archived data type back to active status. */\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 /** Clone a data type with a new name and slug. */\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 /** List data records for a data type with optional filtering and pagination. */\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 /** Get a single data record by ID. */\n async getDataRecord(wid: string, recordId: number): Promise<DataRecord> {\n return this.fetch<DataRecord>(`w/${wid}/data-types/records/${recordId}`);\n }\n\n /** Create a new data record under the specified data type. */\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 /** Update an existing data record's field values. */\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 /** Delete a data record by ID. */\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 /** Get the change history for a data record. */\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 a data record by external ID, creating or updating as needed. */\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 search indexing for a data type field. */\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 the index status for a data type field. */\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 Routine,\n RoutineRun,\n EventRule,\n EventRuleActionType,\n EventRuleEventType,\n EventRuleFormData,\n EventRuleObjectType,\n RoutinesQueryParams,\n CreateRoutineRequest,\n UpdateRoutineRequest,\n UpdateEventRuleFormData,\n WebhookLog,\n WebhookLogsQueryParams,\n RuleExecution,\n RuleExecutionsQueryParams,\n PaginatedResponse,\n EventRunSortField,\n SchedulePreviewRequest,\n SchedulePreviewResponse,\n SortOrder,\n} from '../types';\nimport type { CursorPaginatedResponse } from '../types/coreTypes';\nimport { EventActionMappingsResponse } from '../types/eventRuleTypes';\n\nexport class EventsApi extends BaseApiClient {\n /** List event rules in the workspace, paginated. */\n async getEventRules(\n wid: string,\n params?: { page?: number; pageSize?: number }\n ): Promise<PaginatedResponse<EventRule>> {\n const query = new URLSearchParams();\n if (params?.page !== undefined) query.set('page', String(params.page));\n if (params?.pageSize !== undefined) query.set('pageSize', String(params.pageSize));\n const qs = query.toString() ? `?${query.toString()}` : '';\n return this.fetch<PaginatedResponse<EventRule>>(`w/${wid}/event-rules${qs}`);\n }\n\n /** Get the available action types that can be used in event rules. */\n async getAvailableActions(wid: string): Promise<EventActionMappingsResponse> {\n return this.fetch<EventActionMappingsResponse>(`w/${wid}/event-rules/actions/available`);\n }\n\n /** Search event rules by object type, event type, action type, and related entities. */\n async searchEventRules(\n wid: string,\n params: {\n objectType?: EventRuleObjectType;\n eventType?: EventRuleEventType;\n actionType?: EventRuleActionType;\n taskId?: number;\n dataTypeId?: number;\n routineId?: number;\n workflowId?: number;\n journeyStepId?: 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.routineId) searchParams.append('routineId', params.routineId.toString());\n if (params.workflowId) searchParams.append('workflowId', params.workflowId.toString());\n if (params.journeyStepId)\n searchParams.append('journeyStepId', params.journeyStepId.toString());\n if (params.includeDisabled) searchParams.append('includeDisabled', 'true');\n return this.fetch<EventRule[]>(`w/${wid}/event-rules/search?${searchParams.toString()}`);\n }\n\n /** Get a single event rule by ID. */\n async getEventRule(wid: string, id: number): Promise<EventRule> {\n return this.fetch<EventRule>(`w/${wid}/event-rules/${id}`);\n }\n\n /** Create a new event rule in the workspace. */\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 /** Update an existing event rule. */\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 /** Delete an event rule by ID. */\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 /** Reorder event rules by specifying the desired rule ID sequence. */\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 /** List webhook logs with optional filtering by event type and success status. */\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 /** List event rule executions with cursor-based pagination and filtering. */\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 /** Preview the next N run times for a cron expression. */\n async previewSchedule(\n wid: string,\n request: SchedulePreviewRequest\n ): Promise<SchedulePreviewResponse> {\n return this.fetch<SchedulePreviewResponse>(`w/${wid}/routines/preview-schedule`, {\n method: 'POST',\n body: JSON.stringify(request),\n });\n }\n\n /** List routines with optional pagination and active status filtering. */\n async getRoutines(\n wid: string,\n options: RoutinesQueryParams = {}\n ): Promise<PaginatedResponse<Routine>> {\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.owner) params.append('owner', options.owner);\n\n return this.fetch<PaginatedResponse<Routine>>(\n `w/${wid}/routines${params.toString() ? `?${params.toString()}` : ''}`\n );\n }\n\n /** Get a single routine by ID. */\n async getRoutine(wid: string, id: number): Promise<Routine> {\n return this.fetch<Routine>(`w/${wid}/routines/${id}`);\n }\n\n /** Create a new routine. */\n async createRoutine(wid: string, routine: CreateRoutineRequest): Promise<Routine> {\n return this.fetch<Routine>(`w/${wid}/routines`, {\n method: 'POST',\n body: JSON.stringify(routine),\n });\n }\n\n /** Update an existing routine. */\n async updateRoutine(wid: string, id: number, routine: UpdateRoutineRequest): Promise<Routine> {\n return this.fetch<Routine>(`w/${wid}/routines/${id}`, {\n method: 'PUT',\n body: JSON.stringify(routine),\n });\n }\n\n /** Delete a routine by ID. */\n async deleteRoutine(wid: string, id: number): Promise<void> {\n return this.fetch(`w/${wid}/routines/${id}`, {\n method: 'DELETE',\n });\n }\n\n /** Manually trigger a routine for a specific member or member filter. */\n async runRoutine(\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}/routines/${id}/run?${searchParams.toString()}`, {\n method: 'POST',\n });\n }\n\n /** List routine run history with optional filtering by routine and status. */\n async getRoutineRuns(\n wid: string,\n options: {\n page?: number;\n pageSize?: number;\n sortBy?: EventRunSortField;\n sortOrder?: SortOrder;\n routineId?: number;\n status?: string;\n } = {}\n ): Promise<PaginatedResponse<RoutineRun>> {\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.routineId) params.append('routineId', options.routineId.toString());\n if (options.status) params.append('status', options.status);\n\n return this.fetch<PaginatedResponse<RoutineRun>>(\n `w/${wid}/routines/runs?${params.toString()}`\n );\n }\n\n /** Delete all run history for a routine. */\n async resetRoutineRuns(\n wid: string,\n routineId: number\n ): Promise<{ status: string; message: string; deletedRunsCount: number }> {\n return this.fetch(`w/${wid}/routines/${routineId}/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 async getFeatureRegistry(): Promise<FeaturesRegistryResponse> {\n return this.fetch<FeaturesRegistryResponse>('features/registry');\n }\n\n /**\n * Get the public feature registry (no auth required).\n * Returns only features marked for product page display.\n */\n async getPublicFeatureRegistry(): Promise<FeaturesRegistryResponse> {\n return this.fetch<FeaturesRegistryResponse>('features/registry/public');\n }\n\n /**\n * Get a specific feature definition by slug\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 FhirCsvImportSettings,\n FhirCsvImportRunSummary,\n FhirCsvImportRunItem,\n FhirCsvInspectResponse,\n UpdateFhirCsvImportSettingsRequest,\n EncounterSyncStatus,\n EncounterSyncRunResponse,\n EncounterSyncHistoryItem,\n UpdateEncounterSyncRequest,\n TriggerPatientRefreshRequest,\n TriggerConnectionBackfillRequest,\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 // ==================== CSV Inspect & Import ====================\n\n async fhirCsvImportInspect(\n wid: string,\n connectionId: number,\n file: File\n ): Promise<FhirCsvInspectResponse> {\n const formData = new FormData();\n formData.append('file', file);\n return this.fetch(\n `w/${wid}/app-connections/fhir/connections/${connectionId}/csv-import/inspect`,\n { method: 'POST', body: formData }\n );\n }\n\n async fhirGetCsvImportSettings(\n wid: string,\n connectionId: number\n ): Promise<FhirCsvImportSettings> {\n return this.fetch(\n `w/${wid}/app-connections/fhir/connections/${connectionId}/csv-import/settings`\n );\n }\n\n async fhirUpdateCsvImportSettings(\n wid: string,\n connectionId: number,\n data: UpdateFhirCsvImportSettingsRequest\n ): Promise<FhirCsvImportSettings> {\n return this.fetch(\n `w/${wid}/app-connections/fhir/connections/${connectionId}/csv-import/settings`,\n { method: 'PUT', body: JSON.stringify(data) }\n );\n }\n\n async fhirCsvImportApply(\n wid: string,\n connectionId: number,\n file: File,\n columns?: { identifierColumn: string; birthdateColumn?: string }\n ): Promise<Response> {\n const formData = new FormData();\n formData.append('file', file);\n if (columns) {\n formData.append('identifierColumn', columns.identifierColumn);\n if (columns.birthdateColumn) {\n formData.append('birthdateColumn', columns.birthdateColumn);\n }\n }\n return this.fetchRaw(\n `w/${wid}/app-connections/fhir/connections/${connectionId}/csv-import/runs`,\n { method: 'POST', body: formData }\n );\n }\n\n async fhirGetCsvImportRuns(\n wid: string,\n connectionId: number,\n limit = 20\n ): Promise<FhirCsvImportRunSummary[]> {\n return this.fetch(\n `w/${wid}/app-connections/fhir/connections/${connectionId}/csv-import/runs?limit=${limit}`\n );\n }\n\n async fhirGetCsvImportRunItems(\n wid: string,\n connectionId: number,\n runId: string,\n limit = 500\n ): Promise<FhirCsvImportRunItem[]> {\n return this.fetch(\n `w/${wid}/app-connections/fhir/connections/${connectionId}/csv-import/runs/${runId}/items?limit=${limit}`\n );\n }\n\n // ==================== Member Sync ====================\n\n async fhirListLinkedMembers(\n wid: string,\n connectionId: number,\n params?: { page?: number; pageSize?: number; search?: string }\n ): Promise<PaginatedResponse<FhirLinkedMember>> {\n const query = new URLSearchParams();\n if (params?.page !== undefined) query.set('page', String(params.page));\n if (params?.pageSize !== undefined) query.set('pageSize', String(params.pageSize));\n if (params?.search?.trim()) query.set('search', params.search.trim());\n const qs = query.toString() ? `?${query.toString()}` : '';\n return this.fetch<PaginatedResponse<FhirLinkedMember>>(\n `w/${wid}/app-connections/fhir/connections/${connectionId}/linked-members${qs}`\n );\n }\n\n async fhirLinkMember(\n wid: string,\n connectionId: number,\n data: { memberId: number; patientId: string }\n ): Promise<FhirMethodResponse> {\n return this.fetch(`w/${wid}/app-connections/fhir/connections/${connectionId}/link-member`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n async fhirUnlinkMember(\n wid: string,\n connectionId: number,\n memberId: number\n ): Promise<FhirMethodResponse> {\n return this.fetch(`w/${wid}/app-connections/fhir/connections/${connectionId}/unlink-member`, {\n method: 'POST',\n body: JSON.stringify({ memberId: memberId }),\n });\n }\n\n async fhirSyncMember(\n wid: string,\n connectionId: number,\n memberId: number\n ): Promise<FhirMethodResponse> {\n return this.fetch(`w/${wid}/app-connections/fhir/connections/${connectionId}/sync-member`, {\n method: 'POST',\n body: JSON.stringify({ memberId: memberId }),\n });\n }\n\n async fhirImportPatient(\n wid: string,\n connectionId: number,\n data: { patientId: string; memberRoleId?: number }\n ): Promise<FhirMethodResponse> {\n return this.fetch(\n `w/${wid}/app-connections/fhir/connections/${connectionId}/import-patient`,\n { method: 'POST', body: JSON.stringify(data) }\n );\n }\n\n // ==================== Encounter Sync ====================\n\n async fhirGetEncounterSyncStatus(\n wid: string,\n connectionId: number\n ): Promise<EncounterSyncStatus> {\n return this.fetch(`w/${wid}/app-connections/fhir/connections/${connectionId}/encounter-sync`);\n }\n\n async fhirUpdateEncounterSync(\n wid: string,\n connectionId: number,\n data: UpdateEncounterSyncRequest\n ): Promise<EncounterSyncStatus> {\n return this.fetch(\n `w/${wid}/app-connections/fhir/connections/${connectionId}/encounter-sync`,\n { method: 'PUT', body: JSON.stringify(data) }\n );\n }\n\n async fhirRunEncounterSync(\n wid: string,\n connectionId: number\n ): Promise<EncounterSyncRunResponse> {\n return this.fetch(\n `w/${wid}/app-connections/fhir/connections/${connectionId}/encounter-sync/run`,\n { method: 'POST' }\n );\n }\n\n async fhirGetEncounterSyncRuns(\n wid: string,\n connectionId: number,\n limit = 20\n ): Promise<EncounterSyncHistoryItem[]> {\n const qs = limit !== 20 ? `?limit=${limit}` : '';\n return this.fetch(\n `w/${wid}/app-connections/fhir/connections/${connectionId}/encounter-sync/runs${qs}`\n );\n }\n\n async fhirRefreshEncounterPatient(\n wid: string,\n connectionId: number,\n data: TriggerPatientRefreshRequest\n ): Promise<EncounterSyncRunResponse> {\n return this.fetch(\n `w/${wid}/app-connections/fhir/connections/${connectionId}/encounter-sync/refresh-patient`,\n { method: 'POST', body: JSON.stringify(data) }\n );\n }\n\n async fhirBackfillEncounterSync(\n wid: string,\n connectionId: number,\n data: TriggerConnectionBackfillRequest\n ): Promise<EncounterSyncRunResponse> {\n return this.fetch(\n `w/${wid}/app-connections/fhir/connections/${connectionId}/encounter-sync/backfill`,\n { method: 'POST', body: JSON.stringify(data) }\n );\n }\n}\n\nexport interface FhirLinkedMember {\n memberId: number;\n patientId: string;\n lastSyncedAt: string | null;\n lastSyncStatus: string | null;\n syncCount: number;\n memberName?: string | null;\n memberEmail?: string | null;\n memberPhone?: string | null;\n}\n","import type { PaginatedResponse } from '../types/coreTypes';\nimport { BaseApiClient } from './base';\n\nexport interface ConfigureHealthieRequest {\n api_key: string;\n base_url?: string;\n}\n\nexport interface HealthieConnectionStatus {\n connected: boolean;\n state: string | null;\n user_id: string | null;\n user_name: string | null;\n user_email: string | null;\n error: string | null;\n}\n\nexport interface HealthieProvider {\n id: string;\n first_name: string | null;\n last_name: string | null;\n email: string | null;\n}\n\nexport interface LinkCalendarToHealthieRequest {\n calendar_id: number;\n provider_id: string;\n}\n\nexport interface LinkCalendarToHealthieResponse {\n status: string;\n calendar_id: number;\n provider_id: string;\n sync: {\n event_types_synced: number;\n events_created: number;\n events_updated: number;\n };\n}\n\nexport interface LinkedHealthieMember {\n member_id: number;\n healthie_patient_id: string;\n member_name: string | null;\n member_email: string | null;\n member_phone: string | null;\n}\n\nexport interface HealthieReconciliationMatch {\n member_id: number;\n healthie_patient_id: string;\n healthie_first_name: string | null;\n healthie_last_name: string | null;\n healthie_email: string | null;\n healthie_phone: string | null;\n match_type: string;\n}\n\nexport interface LinkMemberToHealthieRequest {\n member_id: number;\n healthie_patient_id: string;\n}\n\nexport class HealthieApi extends BaseApiClient {\n async configureHealthie(\n wid: string,\n data: ConfigureHealthieRequest\n ): Promise<HealthieConnectionStatus> {\n return this.fetch<HealthieConnectionStatus>(`w/${wid}/app-connections/healthie/configure`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n async getHealthieStatus(wid: string): Promise<HealthieConnectionStatus> {\n return this.fetch<HealthieConnectionStatus>(`w/${wid}/app-connections/healthie/status`);\n }\n\n async listHealthieProviders(wid: string): Promise<HealthieProvider[]> {\n return this.fetch<HealthieProvider[]>(`w/${wid}/app-connections/healthie/providers`);\n }\n\n async linkCalendarToHealthie(\n wid: string,\n data: LinkCalendarToHealthieRequest\n ): Promise<LinkCalendarToHealthieResponse> {\n return this.fetch<LinkCalendarToHealthieResponse>(\n `w/${wid}/app-connections/healthie/calendar/link`,\n {\n method: 'POST',\n body: JSON.stringify(data),\n }\n );\n }\n\n async unlinkCalendarFromHealthie(wid: string, calendarId: number): Promise<{ status: string }> {\n return this.fetch<{ status: string }>(\n `w/${wid}/app-connections/healthie/calendar/${calendarId}/link`,\n { method: 'DELETE' }\n );\n }\n\n async syncCalendarWithHealthie(\n wid: string,\n calendarId: number\n ): Promise<LinkCalendarToHealthieResponse> {\n return this.fetch<LinkCalendarToHealthieResponse>(\n `w/${wid}/app-connections/healthie/calendar/${calendarId}/sync`,\n { method: 'POST' }\n );\n }\n\n async getLinkedHealthieMembers(\n wid: string,\n params?: { page?: number; pageSize?: number; search?: string }\n ): Promise<PaginatedResponse<LinkedHealthieMember>> {\n const query = new URLSearchParams();\n if (params?.page !== undefined) query.set('page', String(params.page));\n if (params?.pageSize !== undefined) query.set('pageSize', String(params.pageSize));\n if (params?.search?.trim()) query.set('search', params.search.trim());\n const qs = query.toString() ? `?${query.toString()}` : '';\n return this.fetch<PaginatedResponse<LinkedHealthieMember>>(\n `w/${wid}/app-connections/healthie/reconciliation/linked${qs}`\n );\n }\n\n async getHealthieReconciliationMatches(\n wid: string,\n params?: { limit?: number; offset?: number }\n ): Promise<HealthieReconciliationMatch[]> {\n const query = new URLSearchParams();\n if (params?.limit !== undefined) query.set('limit', String(params.limit));\n if (params?.offset !== undefined) query.set('offset', String(params.offset));\n const qs = query.toString() ? `?${query.toString()}` : '';\n return this.fetch<HealthieReconciliationMatch[]>(\n `w/${wid}/app-connections/healthie/reconciliation/matches${qs}`\n );\n }\n\n async linkMemberToHealthie(\n wid: string,\n data: LinkMemberToHealthieRequest\n ): Promise<{ status: string; member_id: number; healthie_patient_id: string }> {\n return this.fetch(`w/${wid}/app-connections/healthie/reconciliation/link`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n async unlinkMemberFromHealthie(\n wid: string,\n memberId: number\n ): Promise<{ status: string; member_id: number }> {\n return this.fetch(`w/${wid}/app-connections/healthie/reconciliation/unlink/${memberId}`, {\n method: 'DELETE',\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 /** List files in a workspace with optional folder filtering, sorting, and search. */\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 /** Get a single file by ID. */\n async getFile(wid: string, id: number): Promise<File> {\n return this.fetch<File>(`w/${wid}/files/${id}`);\n }\n\n /** Create a new file record in the workspace. */\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 /** Update an existing file's metadata. */\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 /** Delete a file by ID. */\n async deleteFile(wid: string, id: number): Promise<void> {\n return this.fetch(`w/${wid}/files/${id}`, {\n method: 'DELETE',\n });\n }\n\n /** Convert a file to the specified format (text, markdown, or PDF). */\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 /** Generate a pre-signed upload URL for uploading file content. */\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 /** List child folders of a given parent folder.\n *\n * `parentId` is required — use the workspace root folder ID from\n * `WorkspaceSettings.workspaceFolderId` as the starting point for\n * workspace-level browsing.\n */\n async getFolders(\n wid: string,\n parentIdOrOpts: number | { parentId: number }\n ): Promise<FileFolder[]> {\n const parentId =\n typeof parentIdOrOpts === 'number' ? parentIdOrOpts : parentIdOrOpts.parentId;\n return this.fetch<FileFolder[]>(`w/${wid}/folders?parent_id=${parentId}`);\n }\n\n /** Get a single folder by ID. */\n async getFolder(wid: string, id: number): Promise<FileFolder> {\n return this.fetch<FileFolder>(`w/${wid}/folders/${id}`);\n }\n\n /** Create a new folder in the workspace. */\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 /** Update a folder's properties. */\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 /** Delete a folder by ID. */\n async deleteFolder(wid: string, id: number): Promise<void> {\n return this.fetch(`w/${wid}/folders/${id}`, {\n method: 'DELETE',\n });\n }\n\n /** Trigger reindexing of a folder's contents for search. */\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 /** Search for content within a folder using semantic search. */\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 /** List all file labels in the workspace. */\n async getFileLabels(wid: string): Promise<FileLabel[]> {\n return this.fetch<FileLabel[]>(`w/${wid}/file-labels`);\n }\n\n /** Get a single file label by ID. */\n async getFileLabel(wid: string, id: number): Promise<FileLabel> {\n return this.fetch<FileLabel>(`w/${wid}/file-labels/${id}`);\n }\n\n /** Get a single file label by UUID. */\n async getFileLabelByUuid(wid: string, uuid: string): Promise<FileLabel> {\n return this.fetch<FileLabel>(`w/${wid}/file-labels/${uuid}`);\n }\n\n /** Create a new file label in the workspace. */\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 /** Update a file label's properties. */\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 /** Delete a file label by ID. */\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 /** Get sharing settings for a file. */\n async getFileSharing(wid: string, fileId: number): Promise<FileSharingResponse> {\n return this.fetch<FileSharingResponse>(`w/${wid}/files/${fileId}/sharing`);\n }\n\n /** Update the role associations for a file's sharing permissions. */\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 /** Remove a role's access to a file. */\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 /** Get sharing settings for a folder. */\n async getFolderSharing(wid: string, folderId: number): Promise<FolderSharingResponse> {\n return this.fetch<FolderSharingResponse>(`w/${wid}/folders/${folderId}/sharing`);\n }\n\n /** Update the role associations for a folder's sharing permissions. */\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 /** Remove a role's access to a folder. */\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 /** Update all sharing settings for a file in a single request. */\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 /** Update all sharing settings for a folder in a single request. */\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 /** Get metadata for a publicly shared file (unauthenticated). */\n async getPublicFile(wid: string, fileId: number): Promise<PublicFileMetadata> {\n return this.fetch<PublicFileMetadata>(`w/${wid}/sharing/files/${fileId}`);\n }\n\n /** Get contents of a publicly shared folder (unauthenticated). */\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 /** List files within a publicly shared folder (unauthenticated). */\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 {\n ChatEmailsResponse,\n EmailConversionResponse,\n ThreadEmailsResponse,\n} from '../types/communicationTypes';\nimport { BaseApiClient } from './base';\n\nexport class InboxesApi extends BaseApiClient {\n /** List all inboxes in a workspace. */\n async getInboxes(wid: string): Promise<PaginatedResponse<Inbox>> {\n return this.fetch<PaginatedResponse<Inbox>>(`w/${wid}/inboxes`);\n }\n\n /** Get an inbox by ID. */\n async getInbox(wid: string, id: number): Promise<Inbox> {\n return this.fetch<Inbox>(`w/${wid}/inboxes/${id}`);\n }\n\n /** Create a new inbox. */\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 /** Update an inbox. */\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 /** Delete an inbox. */\n async deleteInbox(wid: string, id: number): Promise<void> {\n return this.fetch(`w/${wid}/inboxes/${id}`, {\n method: 'DELETE',\n });\n }\n\n /** List emails in an inbox with pagination and optional attachment inclusion. */\n async getInboxEmails(\n wid: string,\n inboxId: number,\n options: {\n page?: number;\n pageSize?: number;\n includeAttachments?: boolean;\n } = {}\n ): Promise<PaginatedResponse<Email>> {\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.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 /** Get a single email from an inbox. */\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 /** Mark an email as read. */\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 /** Mark an email as unread. */\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 /** Convert an email to text, markdown, or PDF format. */\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 /** Download an email attachment as raw bytes. */\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 /** List email threads in an inbox. */\n async getInboxThreads(wid: string, inboxId: number): Promise<any> {\n return this.fetch(`w/${wid}/inboxes/${inboxId}/threads`);\n }\n\n /** List emails in a thread by assignment ID with pagination. */\n async getThreadEmails(\n wid: string,\n inboxId: number,\n assignmentId: number,\n options: { page?: number; pageSize?: number; includeAttachments?: boolean } = {}\n ): Promise<ThreadEmailsResponse> {\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.includeAttachments)\n params.append('include_attachments', options.includeAttachments.toString());\n\n return this.fetch<ThreadEmailsResponse>(\n `w/${wid}/inboxes/${inboxId}/assignments/${assignmentId}/emails${params.toString() ? `?${params.toString()}` : ''}`\n );\n }\n\n /** List emails associated with a chat with pagination. */\n async getChatEmails(\n wid: string,\n inboxId: number,\n chatId: number,\n options: { page?: number; pageSize?: number; includeAttachments?: boolean } = {}\n ): Promise<ChatEmailsResponse> {\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.includeAttachments)\n params.append('include_attachments', options.includeAttachments.toString());\n\n return this.fetch<ChatEmailsResponse>(\n `w/${wid}/inboxes/${inboxId}/chats/${chatId}/emails${params.toString() ? `?${params.toString()}` : ''}`\n );\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 with optional status filtering (superuser only)\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 { MemberMemoriesResponse, MemoryStrategyType } from '../types/memberTypes';\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 /** Get the currently authenticated member for a workspace. */\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 /** Update the currently authenticated member's profile. */\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 /** List workspace members with pagination, filtering, and sorting. */\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 /** Get a single workspace member by ID. */\n async getWorkspaceMember(wid: string, memberId: number): Promise<Member> {\n return this.fetch<Member>(`w/${wid}/members/${memberId}`);\n }\n\n /** Create a new workspace member. */\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 /** Update a workspace member by ID. */\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 /** Delete a workspace member, optionally forcing removal of associated data. */\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 /** Archive a workspace member. */\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 /** Unarchive a previously archived workspace member. */\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 /** List all saved member filters for a workspace. */\n async getMemberFilters(wid: string): Promise<MemberFilter[]> {\n return this.fetch<MemberFilter[]>(`w/${wid}/member-filters`);\n }\n\n /** Get a single member filter by ID. */\n async getMemberFilter(wid: string, filterId: number): Promise<MemberFilter> {\n return this.fetch<MemberFilter>(`w/${wid}/member-filters/${filterId}`);\n }\n\n /** Create a new saved member filter. */\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 /** Update a saved member filter. */\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 /** Delete a saved member filter. */\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 /** Get the count of members matching a saved filter. */\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 /** List all member labels for a workspace. */\n async getMemberLabels(wid: string): Promise<MemberLabel[]> {\n return this.fetch<MemberLabel[]>(`w/${wid}/member-labels`);\n }\n\n /** Get a single member label by ID. */\n async getMemberLabel(wid: string, id: number): Promise<MemberLabel> {\n return this.fetch<MemberLabel>(`w/${wid}/member-labels/${id}`);\n }\n\n /** Get a single member label by UUID. */\n async getMemberLabelByUuid(wid: string, uuid: string): Promise<MemberLabel> {\n return this.fetch<MemberLabel>(`w/${wid}/member-labels/${uuid}`);\n }\n\n /** Create a new member label. */\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 /** Update a member label. */\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 /** Delete a member label. */\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 /** List all member roles for a workspace. */\n async getMemberRoles(wid: string): Promise<MemberRole[]> {\n return this.fetch<MemberRole[]>(`w/${wid}/member-roles`);\n }\n\n /** Get a single member role by ID. */\n async getMemberRole(wid: string, id: number): Promise<MemberRole> {\n return this.fetch<MemberRole>(`w/${wid}/member-roles/${id}`);\n }\n\n /** Get a single member role by UUID. */\n async getMemberRoleByUuid(wid: string, uuid: string): Promise<MemberRole> {\n return this.fetch<MemberRole>(`w/${wid}/member-roles/${uuid}`);\n }\n\n /** Create a new member role. */\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 /** Update a member role. */\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 /** Delete a member role. */\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 /** Import members from a CSV file, streaming progress updates via callback. */\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 {\n // Skip invalid JSON lines\n }\n }\n }\n }\n\n return { success: true };\n }\n\n /** Export members as a downloadable file with selected fields and data types. */\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 this.fetchRaw(`w/${wid}/members/export?${params.toString()}`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n });\n\n return response.blob();\n }\n\n /** Get message activity counts for the specified members over a time period. */\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, paginated.\n * Admin-only. Optionally filter by member.\n */\n async getCredentialUpdateInvites(\n wid: string,\n memberId?: number,\n pageOpts?: { page?: number; pageSize?: number }\n ): Promise<PaginatedResponse<PendingCredentialChangeInvite>> {\n const params = new URLSearchParams();\n if (memberId) params.append('member_id', memberId.toString());\n if (pageOpts?.page !== undefined) params.set('page', String(pageOpts.page));\n if (pageOpts?.pageSize !== undefined) params.set('pageSize', String(pageOpts.pageSize));\n const qs = params.toString();\n return this.fetch<PaginatedResponse<PendingCredentialChangeInvite>>(\n `w/${wid}/credential-update-invites${qs ? `?${qs}` : ''}`\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 // ===== Member Memories =====\n\n async getMemberMemories(\n wid: string,\n memberId: number,\n options?: { strategy?: MemoryStrategyType; query?: string; limit?: number; offset?: number }\n ): Promise<MemberMemoriesResponse> {\n const params = new URLSearchParams();\n if (options?.strategy) params.append('strategy', options.strategy);\n if (options?.query) params.append('query', options.query);\n if (options?.limit) params.append('limit', options.limit.toString());\n if (options?.offset) params.append('offset', options.offset.toString());\n const qs = params.toString();\n return this.fetch<MemberMemoriesResponse>(\n `w/${wid}/members/${memberId}/memories${qs ? `?${qs}` : ''}`\n );\n }\n\n async deleteMemberMemory(\n wid: string,\n memberId: number,\n memoryKey: string,\n strategy: MemoryStrategyType\n ): Promise<void> {\n await this.fetch<{ status: string }>(\n `w/${wid}/members/${memberId}/memories/${encodeURIComponent(memoryKey)}?strategy=${encodeURIComponent(strategy)}`,\n { method: 'DELETE' }\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 /** List milestones in a workspace with optional pagination and sorting. */\n async getMilestones(\n wid: string,\n options: {\n page?: number;\n pageSize?: number;\n sortBy?: MilestoneSortField;\n sortOrder?: SortOrder;\n search?: string;\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 if (options.search) params.append('search', options.search);\n\n return this.fetch<PaginatedResponse<Milestone>>(\n `w/${wid}/milestones${params.toString() ? `?${params.toString()}` : ''}`\n );\n }\n\n /** Get a single milestone by ID. */\n async getMilestone(wid: string, id: number): Promise<Milestone> {\n return this.fetch<Milestone>(`w/${wid}/milestones/${id}`);\n }\n\n /** Create a new milestone in a workspace. */\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 /** Update an existing milestone with partial data. */\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 /** Delete a milestone by ID. */\n async deleteMilestone(wid: string, id: number): Promise<void> {\n return this.fetch(`w/${wid}/milestones/${id}`, {\n method: 'DELETE',\n });\n }\n}\n","import type { PaginatedResponse } from '../types/coreTypes';\nimport { 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 userName?: string;\n userEmail?: string;\n accountName?: 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// Monday.com Connection types (parallel to HubSpot/Salesforce)\n// ---------------------------------------------------------------------------\n\nexport interface MondayConnectionStatus {\n connectionId: number | null;\n connected: boolean;\n state: string | null;\n mondayAccountId: string | null;\n accountName: string | null;\n userName: string | null;\n authorizeUrl: string | null;\n error: string | null;\n authorizedByMemberId: number | null;\n authorizedAt: string | null;\n}\n\nexport interface MondayReconciliationMatch {\n memberId: number;\n mondayItemId: string;\n mondayItemName: string | null;\n boardId: string;\n matchType: string;\n}\n\nexport interface LinkMemberToMondayRequest {\n memberId: number;\n mondayItemId: string;\n boardId: string;\n}\n\nexport interface BulkLinkMondayRequest {\n links: LinkMemberToMondayRequest[];\n}\n\nexport interface LinkedMondayMember {\n memberId: number;\n /**\n * Monday item ID for sync-linked rows. Null for OAuth-only rows where the\n * member has authorized Monday but is not (yet) linked to a board item.\n */\n mondayItemId: string | null;\n /**\n * Board ID for sync-linked rows. Null for OAuth-only rows. The unlink\n * endpoint requires a board ID, so OAuth-only rows cannot be removed\n * via the board-link unlink action.\n */\n boardId: string | null;\n linkSource: 'sync' | 'oauth';\n memberName: string | null;\n memberEmail: string | null;\n memberPhone: string | null;\n lastSyncedAt: string | null;\n lastSyncStatus: string | null;\n}\n\nexport interface LinkedMondayRecord {\n recordId: number;\n externalId: string | null;\n dataTypeId: number;\n dataTypeName: string;\n mondayItemId: string;\n boardId: string;\n}\n\nexport interface MondayImportRequest {\n boardId: string;\n targetType?: 'member' | 'data_record';\n dataTypeId?: number;\n filterExpression?: string;\n createUnmatched?: boolean;\n dryRun?: boolean;\n}\n\nexport interface MondayImportResponse {\n streamKey: string;\n message: string;\n}\n\nexport interface MondaySyncConfigResponse {\n syncConfig: Record<string, unknown> | null;\n managedFields: { key: string; label: string }[];\n warnings?: string[];\n}\n\n/**\n * API for Monday.com integration operations\n */\nexport class MondayIntegrationApi extends BaseApiClient {\n /**\n * Get list of boards from the workspace Monday.com connection\n */\n async getBoards(wid: string): Promise<BoardsResponse> {\n const boards = await this.fetch<MondayBoard[]>(`w/${wid}/app-connections/monday/boards`);\n return { boards };\n }\n\n /**\n * Get columns for a specific Monday.com board\n */\n async getBoardColumns(wid: string, boardId: string): Promise<ColumnsResponse> {\n const columns = await this.fetch<MondayColumn[]>(\n `w/${wid}/app-connections/monday/boards/${boardId}/columns`\n );\n return { columns };\n }\n\n /**\n * Create a webhook in Monday.com\n */\n async createWebhook(wid: string, params: CreateWebhookParams): Promise<WebhookResponse> {\n return this.fetch<WebhookResponse>(`w/${wid}/app-connections/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(\n wid: string,\n webhookId: string\n ): Promise<{ status: string; webhook_id: string }> {\n return this.fetch<{ status: string; webhook_id: string }>(\n `w/${wid}/app-connections/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(wid: string, boardId: string, webhookId: string): Promise<WebhookDetails> {\n return this.fetch<WebhookDetails>(\n `w/${wid}/app-connections/monday/boards/${boardId}/webhooks/${webhookId}`\n );\n }\n\n /**\n * Get groups for a specific Monday.com board\n */\n async getBoardGroups(wid: string, boardId: string): Promise<GroupsResponse> {\n const groups = await this.fetch<MondayGroup[]>(\n `w/${wid}/app-connections/monday/boards/${boardId}/groups`\n );\n return { groups };\n }\n\n /**\n * Get info about the current user's Monday.com connection\n */\n async getCurrentUserInfo(wid: string): Promise<CurrentUserInfoResponse> {\n return this.fetch<CurrentUserInfoResponse>(`w/${wid}/app-connections/monday/current-user`);\n }\n\n // -----------------------------------------------------------------------\n // Monday.com Connection management (OAuth, status, sync, reconciliation)\n // -----------------------------------------------------------------------\n\n async configureMondayConnection(\n wid: string,\n data: { clientId: string; clientSecret: string; signingSecret?: string }\n ): Promise<MondayConnectionStatus> {\n return this.fetch<MondayConnectionStatus>(`w/${wid}/app-connections/monday/configure`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n async getMondayConnectionStatus(wid: string): Promise<MondayConnectionStatus> {\n return this.fetch<MondayConnectionStatus>(`w/${wid}/app-connections/monday/status`);\n }\n\n async authorizeMondayConnection(wid: string): Promise<{ authorizeUrl: string }> {\n return this.fetch<{ authorizeUrl: string }>(`w/${wid}/app-connections/monday/authorize`);\n }\n\n async testMondayConnection(\n wid: string\n ): Promise<{ status: string; userName?: string; accountName?: string }> {\n return this.fetch(`w/${wid}/app-connections/monday/test`, { method: 'POST' });\n }\n\n async disconnectMondayConnection(wid: string): Promise<{ status: string }> {\n return this.fetch<{ status: string }>(`w/${wid}/app-connections/monday/disconnect`, {\n method: 'DELETE',\n });\n }\n\n async disableMondayConnection(wid: string): Promise<MondayConnectionStatus> {\n return this.fetch<MondayConnectionStatus>(`w/${wid}/app-connections/monday/disable`, {\n method: 'POST',\n });\n }\n\n async enableMondayConnection(wid: string): Promise<MondayConnectionStatus> {\n return this.fetch<MondayConnectionStatus>(`w/${wid}/app-connections/monday/enable`, {\n method: 'POST',\n });\n }\n\n async deleteMondayConnection(wid: string): Promise<{ status: string }> {\n return this.fetch<{ status: string }>(`w/${wid}/app-connections/monday/delete`, {\n method: 'DELETE',\n });\n }\n\n async getMondayConnectionBoards(wid: string): Promise<MondayBoard[]> {\n return this.fetch<MondayBoard[]>(`w/${wid}/app-connections/monday/boards`);\n }\n\n async getMondayConnectionBoardColumns(wid: string, boardId: string): Promise<MondayColumn[]> {\n return this.fetch<MondayColumn[]>(\n `w/${wid}/app-connections/monday/boards/${boardId}/columns`\n );\n }\n\n async getMondayConnectionBoardGroups(wid: string, boardId: string): Promise<MondayGroup[]> {\n return this.fetch<MondayGroup[]>(`w/${wid}/app-connections/monday/boards/${boardId}/groups`);\n }\n\n async getMondaySyncConfig(wid: string): Promise<MondaySyncConfigResponse> {\n return this.fetch<MondaySyncConfigResponse>(`w/${wid}/app-connections/monday/sync-config`);\n }\n\n async updateMondaySyncConfig(\n wid: string,\n syncConfig: Record<string, unknown>\n ): Promise<MondaySyncConfigResponse> {\n return this.fetch<MondaySyncConfigResponse>(`w/${wid}/app-connections/monday/sync-config`, {\n method: 'PUT',\n body: JSON.stringify({ syncConfig }),\n });\n }\n\n async getLinkedMondayMembers(\n wid: string,\n params?: { board_id?: string; page?: number; pageSize?: number; search?: string }\n ): Promise<PaginatedResponse<LinkedMondayMember>> {\n const query = new URLSearchParams();\n if (params?.board_id) query.set('board_id', params.board_id);\n if (params?.page !== undefined) query.set('page', String(params.page));\n if (params?.pageSize !== undefined) query.set('pageSize', String(params.pageSize));\n if (params?.search?.trim()) query.set('search', params.search.trim());\n const qs = query.toString() ? `?${query.toString()}` : '';\n return this.fetch<PaginatedResponse<LinkedMondayMember>>(\n `w/${wid}/app-connections/monday/reconciliation/linked${qs}`\n );\n }\n\n async getMondayReconciliationMatches(\n wid: string,\n params?: { limit?: number; offset?: number }\n ): Promise<MondayReconciliationMatch[]> {\n const query = new URLSearchParams();\n if (params?.limit !== undefined) query.set('limit', String(params.limit));\n if (params?.offset !== undefined) query.set('offset', String(params.offset));\n const qs = query.toString() ? `?${query.toString()}` : '';\n return this.fetch<MondayReconciliationMatch[]>(\n `w/${wid}/app-connections/monday/reconciliation/matches${qs}`\n );\n }\n\n async linkMemberToMonday(\n wid: string,\n data: LinkMemberToMondayRequest\n ): Promise<{ status: string; memberId: number; mondayItemId: string }> {\n return this.fetch(`w/${wid}/app-connections/monday/reconciliation/link`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n async bulkLinkMembersToMonday(\n wid: string,\n data: BulkLinkMondayRequest\n ): Promise<{ linked: number }> {\n return this.fetch(`w/${wid}/app-connections/monday/reconciliation/link/bulk`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n async unlinkMemberFromMonday(\n wid: string,\n memberId: number,\n boardId: string\n ): Promise<{ status: string; memberId: number }> {\n return this.fetch(\n `w/${wid}/app-connections/monday/reconciliation/unlink/${memberId}?board_id=${encodeURIComponent(boardId)}`,\n { method: 'DELETE' }\n );\n }\n\n async getLinkedRecords(\n wid: string,\n params?: { board_id?: string; page?: number; pageSize?: number }\n ): Promise<PaginatedResponse<LinkedMondayRecord>> {\n const query = new URLSearchParams();\n if (params?.board_id) query.set('board_id', params.board_id);\n if (params?.page !== undefined) query.set('page', String(params.page));\n if (params?.pageSize !== undefined) query.set('pageSize', String(params.pageSize));\n const qs = query.toString() ? `?${query.toString()}` : '';\n return this.fetch<PaginatedResponse<LinkedMondayRecord>>(\n `w/${wid}/app-connections/monday/linked-records${qs}`\n );\n }\n\n async importFromBoard(wid: string, data: MondayImportRequest): Promise<MondayImportResponse> {\n return this.fetch<MondayImportResponse>(`w/${wid}/app-connections/monday/import`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n async autoCreateDataTypeFromBoard(\n wid: string,\n boardId: string\n ): Promise<{\n dataTypeId: number;\n dataTypeName: string;\n fieldCount: number;\n warnings?: string[];\n }> {\n return this.fetch(`w/${wid}/app-connections/monday/boards/${boardId}/auto-create-data-type`, {\n method: 'POST',\n });\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 /** List all notification rules in a workspace. */\n async getNotificationRules(wid: string): Promise<NotificationRule[]> {\n return this.fetch<NotificationRule[]>(`w/${wid}/notification-rules`);\n }\n\n /** Create a new notification rule. */\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 /** Update a notification rule. */\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 /** Delete a notification rule. */\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 /** List all operator groups for a workspace. */\n async getOperatorGroups(wid: string): Promise<OperatorGroup[]> {\n return this.fetch<OperatorGroup[]>(`w/${wid}/operator/groups`);\n }\n\n /** Get a single operator group by ID. */\n async getOperatorGroup(wid: string, groupId: number): Promise<OperatorGroup> {\n return this.fetch<OperatorGroup>(`w/${wid}/operator/groups/${groupId}`);\n }\n\n /** Create a new operator group. */\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 /** Update an operator group. */\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 /** Delete an operator group. */\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 /** Add a member to an operator group. */\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 /** Remove a member from an operator group. */\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 /** Get all currently live (online) operators in a workspace. */\n async getLiveOperators(wid: string): Promise<LiveOperatorsResponse> {\n return this.fetch<LiveOperatorsResponse>(`w/${wid}/presence/live`);\n }\n\n /** Get the current member's presence status. */\n async getPresenceStatus(wid: string): Promise<PresenceStatusResponse> {\n return this.fetch<PresenceStatusResponse>(`w/${wid}/presence/me`);\n }\n\n /** Disconnect the current member's presence session. */\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 /** Get paginated chat messages for an operator chat. */\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 /** Send a message in an operator chat. */\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","/**\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 MemberRole,\n OrgCreateWorkspaceFormData,\n OrgJoinWorkspaceRequest,\n OrgJoinWorkspaceResponse,\n OrgMember,\n OrgMemberListResponse,\n OrgWorkspace,\n OrgWorkspaceFormData,\n PaginatedResponse,\n AvailablePhoneNumber,\n OrgA2PStatus,\n ProviderPhoneNumber,\n SortOrder,\n UpdateInvitationFormData,\n UpdateOrgMemberRequest,\n WorkspaceSortField,\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 * Get the billing customer UUID for an organization.\n */\n async getOrgBillingCustomer(\n orgIdOrUuid: number | string\n ): Promise<{ customerUuid: string | null; customerName: string | null; hasAccess: boolean }> {\n return this.fetch<{\n customerUuid: string | null;\n customerName: string | null;\n hasAccess: boolean;\n }>(`o/${orgIdOrUuid}/billing-customer`);\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 // ============================================================================\n // Organization Workspaces API\n // ============================================================================\n\n /**\n * List workspaces in an organization with pagination.\n */\n async getOrganizationWorkspaces(\n orgIdOrUuid: number | string,\n options?: {\n page?: number;\n pageSize?: number;\n sortBy?: WorkspaceSortField;\n sortOrder?: SortOrder;\n search?: string;\n }\n ): Promise<PaginatedResponse<OrgWorkspace>> {\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<OrgWorkspace>>(\n `o/${orgIdOrUuid}/workspaces?${params.toString()}`\n );\n }\n\n /**\n * Get a single workspace in an organization.\n */\n async getOrganizationWorkspace(\n orgIdOrUuid: number | string,\n workspaceUuid: string\n ): Promise<OrgWorkspace> {\n return this.fetch<OrgWorkspace>(`o/${orgIdOrUuid}/workspaces/${workspaceUuid}`);\n }\n\n /**\n * Create a workspace in an organization.\n */\n async createOrganizationWorkspace(\n orgIdOrUuid: number | string,\n data: OrgCreateWorkspaceFormData\n ): Promise<OrgWorkspace> {\n return this.fetch<OrgWorkspace>(`o/${orgIdOrUuid}/workspaces`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n /**\n * Update a workspace in an organization.\n */\n async updateOrganizationWorkspace(\n orgIdOrUuid: number | string,\n workspaceUuid: string,\n data: OrgWorkspaceFormData\n ): Promise<OrgWorkspace> {\n return this.fetch<OrgWorkspace>(`o/${orgIdOrUuid}/workspaces/${workspaceUuid}`, {\n method: 'PUT',\n body: JSON.stringify(data),\n });\n }\n\n // ============================================================================\n // Organization Phone Numbers API\n // ============================================================================\n\n /**\n * List all provider phone numbers owned by this organization.\n */\n async listPhoneNumbers(orgUuid: string): Promise<ProviderPhoneNumber[]> {\n return this.fetch<ProviderPhoneNumber[]>(`o/${orgUuid}/phone-numbers`);\n }\n\n /**\n * Assign a phone number to a workspace.\n */\n async assignPhoneToWorkspace(\n orgUuid: string,\n providerPhoneUuid: string,\n workspaceUuid: string\n ): Promise<ProviderPhoneNumber> {\n return this.fetch<ProviderPhoneNumber>(`o/${orgUuid}/phone-numbers/assign`, {\n method: 'POST',\n body: JSON.stringify({ providerPhoneUuid, workspaceUuid }),\n });\n }\n\n /**\n * Reassign a phone number to a different workspace.\n */\n async reassignPhone(\n orgUuid: string,\n providerPhoneUuid: string,\n newWorkspaceUuid: string\n ): Promise<ProviderPhoneNumber> {\n return this.fetch<ProviderPhoneNumber>(`o/${orgUuid}/phone-numbers/reassign`, {\n method: 'POST',\n body: JSON.stringify({ providerPhoneUuid, newWorkspaceUuid }),\n });\n }\n\n /**\n * Release a phone number from its current workspace.\n */\n async releasePhone(orgUuid: string, providerPhoneUuid: string): Promise<ProviderPhoneNumber> {\n return this.fetch<ProviderPhoneNumber>(`o/${orgUuid}/phone-numbers/release`, {\n method: 'POST',\n body: JSON.stringify({ providerPhoneUuid }),\n });\n }\n\n /**\n * Search for available phone numbers to purchase from Twilio.\n */\n async searchPhoneNumbers(\n orgUuid: string,\n params?: {\n numberType?: 'local' | 'toll_free';\n areaCode?: string;\n contains?: string;\n limit?: number;\n }\n ): Promise<AvailablePhoneNumber[]> {\n const query = new URLSearchParams();\n if (params?.numberType) query.set('number_type', params.numberType);\n if (params?.areaCode) query.set('area_code', params.areaCode);\n if (params?.contains) query.set('contains', params.contains);\n if (params?.limit) query.set('limit', String(params.limit));\n const qs = query.toString();\n return this.fetch<AvailablePhoneNumber[]>(\n `o/${orgUuid}/phone-numbers/search${qs ? `?${qs}` : ''}`\n );\n }\n\n /**\n * Purchase a phone number from Twilio for this org.\n */\n async purchasePhoneNumber(\n orgUuid: string,\n phoneNumber: string,\n numberType: 'local' | 'toll_free'\n ): Promise<ProviderPhoneNumber> {\n return this.fetch<ProviderPhoneNumber>(`o/${orgUuid}/phone-numbers/purchase`, {\n method: 'POST',\n body: JSON.stringify({ phoneNumber, numberType }),\n });\n }\n\n /**\n * Delete a phone number from the org (releases from Twilio).\n */\n async deletePhoneNumber(orgUuid: string, providerPhoneUuid: string): Promise<void> {\n await this.fetch(`o/${orgUuid}/phone-numbers/delete`, {\n method: 'POST',\n body: JSON.stringify({ providerPhoneUuid }),\n });\n }\n\n // ============================================================================\n // Organization A2P Brand Registration API\n // ============================================================================\n\n /**\n * Get the org's A2P brand registration status.\n */\n async getA2PStatus(orgUuid: string): Promise<OrgA2PStatus> {\n return this.fetch<OrgA2PStatus>(`o/${orgUuid}/phone-numbers/a2p/status`);\n }\n\n /**\n * Start org-level A2P brand registration.\n */\n async startA2PRegistration(\n orgUuid: string,\n brandName: string,\n brandDescription: string\n ): Promise<{ status: string; workflowId: string }> {\n return this.fetch<{ status: string; workflowId: string }>(\n `o/${orgUuid}/phone-numbers/a2p/start`,\n {\n method: 'POST',\n body: JSON.stringify({ brandName, brandDescription }),\n }\n );\n }\n\n /**\n * Approve sample messages for the org's A2P campaign.\n */\n async approveA2PMessages(\n orgUuid: string,\n sampleMessages: string[]\n ): Promise<{ status: string }> {\n return this.fetch<{ status: string }>(`o/${orgUuid}/phone-numbers/a2p/approve-messages`, {\n method: 'POST',\n body: JSON.stringify({ sampleMessages }),\n });\n }\n\n /**\n * List available member roles for a workspace in the organization.\n */\n async getWorkspaceMemberRoles(\n orgIdOrUuid: number | string,\n workspaceUuid: string\n ): Promise<MemberRole[]> {\n return this.fetch<MemberRole[]>(`o/${orgIdOrUuid}/workspaces/${workspaceUuid}/member-roles`);\n }\n\n /**\n * Join a workspace as the current org admin/owner.\n */\n async joinWorkspace(\n orgIdOrUuid: number | string,\n workspaceUuid: string,\n data: OrgJoinWorkspaceRequest\n ): Promise<OrgJoinWorkspaceResponse> {\n return this.fetch<OrgJoinWorkspaceResponse>(\n `o/${orgIdOrUuid}/workspaces/${workspaceUuid}/join`,\n {\n method: 'POST',\n body: JSON.stringify(data),\n }\n );\n }\n}\n","import { BaseApiClient } from './base';\n\n// Third-party OAuth connection types\nexport type OAuthProviderSlug = 'google_calendar' | 'gmail' | '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 // 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 {\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 items: 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 ArchiveBlockers,\n PhoneNumber,\n PhoneNumberFormData,\n PhoneCall,\n SMSMessage,\n Voicemail,\n VoicemailStatus,\n PaginatedResponse,\n AvailablePhoneNumber,\n PurchasePhoneNumberRequest,\n} from '../types';\n\nexport interface SearchPhoneNumbersParams {\n country?: string;\n numberType?: 'local' | 'toll_free';\n areaCode?: string;\n contains?: string;\n city?: string;\n state?: string;\n limit?: number;\n}\n\nexport class PhoneNumbersApi extends BaseApiClient {\n /** List phone numbers in a workspace, optionally including archived. */\n async getPhoneNumbers(wid: string, options?: { isArchived?: boolean }): Promise<PhoneNumber[]> {\n const params = new URLSearchParams();\n if (options?.isArchived !== undefined) {\n params.set('is_archived', String(options.isArchived));\n }\n const query = params.toString();\n return this.fetch<PhoneNumber[]>(`w/${wid}/phone-numbers${query ? `?${query}` : ''}`);\n }\n\n /** List phone numbers available for provisioning. */\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 /** Request provisioning of a specific phone number. */\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 /** Get a phone number by ID or UUID. */\n async getPhoneNumber(wid: string, id: number | string): Promise<PhoneNumber> {\n return this.fetch<PhoneNumber>(`w/${wid}/phone-numbers/${id}`);\n }\n\n /** Create a new phone number record. */\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 /** Update a phone number record. */\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 /** Get archive blockers for a phone number. */\n async getArchiveBlockers(wid: string, id: number): Promise<ArchiveBlockers> {\n return this.fetch<ArchiveBlockers>(`w/${wid}/phone-numbers/${id}/archive-blockers`);\n }\n\n /** Archive a phone number, releasing the Twilio number back to the pool. */\n async archivePhoneNumber(wid: string, id: number): Promise<PhoneNumber> {\n return this.fetch<PhoneNumber>(`w/${wid}/phone-numbers/${id}/archive`, {\n method: 'POST',\n });\n }\n\n /** List paginated call records for a phone number.\n *\n * Routes through the workspace-wide /calls endpoint with a\n * phoneNumberId filter.\n */\n async getPhoneNumberCalls(\n wid: string,\n id: number,\n page: number = 1,\n pageSize: number = 10,\n filters?: { status?: string; inbound?: boolean; dateFrom?: string; dateTo?: string }\n ): Promise<PaginatedResponse<PhoneCall>> {\n const params = new URLSearchParams({\n page: String(page),\n pageSize: String(pageSize),\n phoneNumberId: String(id),\n });\n if (filters?.status) params.set('status', filters.status);\n if (filters?.inbound !== undefined) params.set('inbound', String(filters.inbound));\n if (filters?.dateFrom) params.set('dateFrom', filters.dateFrom);\n if (filters?.dateTo) params.set('dateTo', filters.dateTo);\n return this.fetch<PaginatedResponse<PhoneCall>>(`w/${wid}/calls?${params}`);\n }\n\n /** List paginated voicemails for a phone number. */\n async getPhoneNumberVoicemails(\n wid: string,\n id: number,\n page: number = 1,\n pageSize: number = 10,\n status?: VoicemailStatus\n ): Promise<PaginatedResponse<Voicemail>> {\n const params = new URLSearchParams({\n page: String(page),\n page_size: String(pageSize),\n });\n if (status) params.set('status', status);\n return this.fetch<PaginatedResponse<Voicemail>>(\n `w/${wid}/phone-numbers/${id}/voicemails?${params}`\n );\n }\n\n /** Fetch voicemail audio through the authenticated client path. */\n async fetchVoicemailAudio(\n wid: string,\n phoneNumberId: number,\n voicemailId: number\n ): Promise<ArrayBuffer> {\n const response = await this.fetchRaw(\n `w/${wid}/phone-numbers/${phoneNumberId}/voicemails/${voicemailId}/audio`\n );\n return response.arrayBuffer();\n }\n\n /** Update voicemail status. */\n async updateVoicemailStatus(\n wid: string,\n phoneNumberId: number,\n voicemailId: number,\n status: VoicemailStatus\n ): Promise<Voicemail> {\n return this.fetch<Voicemail>(\n `w/${wid}/phone-numbers/${phoneNumberId}/voicemails/${voicemailId}?status=${status}`,\n { method: 'PATCH' }\n );\n }\n\n /** List paginated SMS messages for a phone number. */\n async getPhoneNumberMessages(\n wid: string,\n id: number,\n page: number = 1,\n pageSize: number = 10,\n filters?: { status?: string; inbound?: boolean; dateFrom?: string; dateTo?: string }\n ): Promise<PaginatedResponse<SMSMessage>> {\n const params = new URLSearchParams({\n page: String(page),\n pageSize: String(pageSize),\n });\n if (filters?.status) params.set('status', filters.status);\n if (filters?.inbound !== undefined) params.set('inbound', String(filters.inbound));\n if (filters?.dateFrom) params.set('dateFrom', filters.dateFrom);\n if (filters?.dateTo) params.set('dateTo', filters.dateTo);\n return this.fetch<PaginatedResponse<SMSMessage>>(\n `w/${wid}/phone-numbers/${id}/messages?${params}`\n );\n }\n\n /** List provider phones available for linking to workspace phone numbers. */\n async getLinkablePhones(wid: string): Promise<\n Array<{\n uuid: string;\n phoneNumber: string;\n friendlyName: string | null;\n provider: string;\n isAssigned: boolean;\n workspaceId: number | null;\n linkedInWorkspace: boolean;\n }>\n > {\n return this.fetch(`w/${wid}/phone-numbers/linkable-phones`);\n }\n\n /** Link or unlink a workspace phone number to/from a provider phone. */\n async linkPhoneNumber(\n wid: string,\n id: number,\n providerPhoneUuid: string | null\n ): Promise<PhoneNumber> {\n return this.fetch<PhoneNumber>(`w/${wid}/phone-numbers/${id}/link`, {\n method: 'POST',\n body: JSON.stringify({ providerPhoneUuid }),\n });\n }\n\n async searchAvailablePhoneNumbers(\n wid: string,\n params: SearchPhoneNumbersParams\n ): Promise<AvailablePhoneNumber[]> {\n const searchParams = new URLSearchParams();\n if (params.country) searchParams.set('country', params.country);\n if (params.numberType) searchParams.set('number_type', params.numberType);\n if (params.areaCode) searchParams.set('area_code', params.areaCode);\n if (params.contains) searchParams.set('contains', params.contains);\n if (params.city) searchParams.set('city', params.city);\n if (params.state) searchParams.set('state', params.state);\n if (params.limit) searchParams.set('limit', String(params.limit));\n const qs = searchParams.toString();\n return this.fetch<AvailablePhoneNumber[]>(\n `w/${wid}/phone-numbers/search${qs ? `?${qs}` : ''}`\n );\n }\n\n async purchasePhoneNumber(\n wid: string,\n request: PurchasePhoneNumberRequest,\n idempotencyKey?: string\n ): Promise<PhoneNumber> {\n const headers: Record<string, string> = {};\n if (idempotencyKey) {\n headers['Idempotency-Key'] = idempotencyKey;\n }\n return this.fetch<PhoneNumber>(`w/${wid}/phone-numbers/purchase`, {\n method: 'POST',\n body: JSON.stringify(request),\n headers,\n });\n }\n\n async releasePhoneNumber(wid: string, id: number): Promise<void> {\n return this.fetch(`w/${wid}/phone-numbers/${id}/release`, {\n method: 'POST',\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 /** List pronunciation entries for an organization, optionally filtered by scope. */\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 /** Create a new pronunciation entry for an organization. */\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 /** Update an existing organization pronunciation entry. */\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 /** Delete a pronunciation entry from an organization. */\n async deletePronunciationEntry(orgUuid: string, id: number): Promise<void> {\n return this.fetch(`o/${orgUuid}/pronunciations/${id}`, {\n method: 'DELETE',\n });\n }\n\n /** Export all pronunciation entries for an organization as term/respelling pairs. */\n async exportPronunciationEntries(\n orgUuid: string\n ): Promise<Array<{ term: string; respelling: string }>> {\n return this.fetch(`o/${orgUuid}/pronunciations/export`);\n }\n\n /** Bulk import pronunciation entries into an organization. */\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 /** List the current user's personal pronunciation entries. */\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 /** Create a personal pronunciation entry for the current user. */\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 /** Update a personal pronunciation entry. */\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 /** Delete a personal pronunciation entry. */\n async deleteMyPronunciation(id: number): Promise<void> {\n return this.fetch(`account/pronunciations/${id}`, {\n method: 'DELETE',\n });\n }\n\n /** Get AI-suggested respellings for a given term. */\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 /** List recommended voices for pronunciation preview. */\n async getRecommendedVoices(): Promise<RecommendedVoice[]> {\n const response = await this.fetch<{ items: RecommendedVoice[] }>(\n 'account/pronunciations/voices'\n );\n return response.items;\n }\n\n /** Generate an audio preview of a pronunciation respelling using a specified voice. */\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';\n\nexport interface PromptInspectionResult {\n meta: {\n workflow_id: number;\n workflow_name: string;\n task_id: number;\n task_name: string;\n agent_name: string | null;\n channel: string;\n resolved_at: string;\n };\n layers: Array<{\n name: string;\n kind: string;\n source: string;\n static: boolean;\n content: string | null;\n template: string | null;\n tokens: number;\n note: string | null;\n tool_parameters: Record<string, unknown> | null;\n }>;\n composed_prompt: string;\n token_summary: {\n total: number;\n by_layer: Record<string, number>;\n };\n}\n\nexport class PromptsApi extends BaseApiClient {\n /** Inspect the full composed prompt for a task (static) or chat (live). */\n async inspectPrompt(\n wid: string,\n taskId: number,\n options: { channel?: string; chatId?: number; turn?: number } = {}\n ): Promise<PromptInspectionResult> {\n const params = new URLSearchParams();\n if (options.chatId) {\n params.append('chat_id', options.chatId.toString());\n } else {\n params.append('task_id', taskId.toString());\n }\n if (options.channel) params.append('channel', options.channel);\n if (options.turn) params.append('turn', options.turn.toString());\n return this.fetch<PromptInspectionResult>(`w/${wid}/prompts/inspect?${params}`);\n }\n}\n","import { BaseApiClient } from './base';\nimport type {\n CreatePersonaRequest,\n PaginatedResponse,\n Persona,\n UpdatePersonaRequest,\n} from '../types';\n\nexport class PersonasApi extends BaseApiClient {\n /** List personas in the workspace, paginated. */\n async listPersonas(\n wid: string,\n params?: { page?: number; pageSize?: number }\n ): Promise<PaginatedResponse<Persona>> {\n const q = new URLSearchParams();\n if (params?.page !== undefined) q.set('page', String(params.page));\n if (params?.pageSize !== undefined) q.set('pageSize', String(params.pageSize));\n const qs = q.toString() ? `?${q.toString()}` : '';\n return this.fetch<PaginatedResponse<Persona>>(`w/${wid}/personas${qs}`);\n }\n\n async getPersona(wid: string, id: number): Promise<Persona> {\n return this.fetch<Persona>(`w/${wid}/personas/${id}`);\n }\n\n async createPersona(wid: string, data: CreatePersonaRequest): Promise<Persona> {\n return this.fetch<Persona>(`w/${wid}/personas`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n async updatePersona(wid: string, id: number, data: UpdatePersonaRequest): Promise<Persona> {\n return this.fetch<Persona>(`w/${wid}/personas/${id}`, {\n method: 'PUT',\n body: JSON.stringify(data),\n });\n }\n\n async deletePersona(wid: string, id: number): Promise<void> {\n return this.fetch(`w/${wid}/personas/${id}`, { method: 'DELETE' });\n }\n}\n","import { BaseApiClient } from './base';\nimport type {\n CreateScenarioRequest,\n PaginatedResponse,\n Qualification,\n Scenario,\n StartTestChatRunRequest,\n StartTestChatRunResponse,\n TestChatRun,\n UpdateScenarioRequest,\n} from '../types';\n\nexport class QualificationsApi extends BaseApiClient {\n /** List qualifications in a workspace, paginated. */\n async getQualifications(\n wid: string,\n params?: { page?: number; pageSize?: number }\n ): Promise<PaginatedResponse<Qualification>> {\n const query = new URLSearchParams();\n if (params?.page !== undefined) query.set('page', String(params.page));\n if (params?.pageSize !== undefined) query.set('pageSize', String(params.pageSize));\n const qs = query.toString() ? `?${query.toString()}` : '';\n return this.fetch<PaginatedResponse<Qualification>>(`w/${wid}/qualifications${qs}`);\n }\n\n /** Get a single qualification by ID. */\n async getQualification(wid: string, id: number): Promise<Qualification> {\n return this.fetch<Qualification>(`w/${wid}/qualifications/${id}`);\n }\n\n /** Fetch (auto-creating if absent) the qualification for a workflow. */\n async getOrCreateQualificationForWorkflow(\n wid: string,\n workflowId: number\n ): Promise<Qualification> {\n return this.fetch<Qualification>(\n `w/${wid}/qualifications/workflows/${workflowId}/qualification`\n );\n }\n\n // ===== Scenarios =====\n\n async listScenarios(\n wid: string,\n qualificationId: number,\n params?: { includeArchived?: boolean }\n ): Promise<Scenario[]> {\n const query = new URLSearchParams();\n if (params?.includeArchived) query.set('include_archived', 'true');\n const qs = query.toString() ? `?${query.toString()}` : '';\n return this.fetch<Scenario[]>(`w/${wid}/qualifications/${qualificationId}/scenarios${qs}`);\n }\n\n async createScenario(\n wid: string,\n qualificationId: number,\n data: CreateScenarioRequest\n ): Promise<Scenario> {\n return this.fetch<Scenario>(`w/${wid}/qualifications/${qualificationId}/scenarios`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n async getScenario(wid: string, scenarioId: number): Promise<Scenario> {\n return this.fetch<Scenario>(`w/${wid}/qualifications/scenarios/${scenarioId}`);\n }\n\n async updateScenario(\n wid: string,\n scenarioId: number,\n data: UpdateScenarioRequest\n ): Promise<Scenario> {\n return this.fetch<Scenario>(`w/${wid}/qualifications/scenarios/${scenarioId}`, {\n method: 'PUT',\n body: JSON.stringify(data),\n });\n }\n\n async deleteScenario(wid: string, scenarioId: number): Promise<void> {\n return this.fetch(`w/${wid}/qualifications/scenarios/${scenarioId}`, {\n method: 'DELETE',\n });\n }\n\n // ===== Test chat runs =====\n\n async listTestChatRuns(\n wid: string,\n workflowId: number,\n params?: { scenarioId?: number; limit?: number }\n ): Promise<TestChatRun[]> {\n const query = new URLSearchParams();\n if (params?.scenarioId !== undefined) query.set('scenarioId', String(params.scenarioId));\n if (params?.limit !== undefined) query.set('limit', String(params.limit));\n const qs = query.toString() ? `?${query.toString()}` : '';\n return this.fetch<TestChatRun[]>(\n `w/${wid}/qualifications/workflows/${workflowId}/test-chat-runs${qs}`\n );\n }\n\n async getTestChatRun(wid: string, runId: number): Promise<TestChatRun> {\n return this.fetch<TestChatRun>(`w/${wid}/qualifications/test-chat-runs/${runId}`);\n }\n\n async startTestChatRun(\n wid: string,\n workflowId: number,\n data: StartTestChatRunRequest = {}\n ): Promise<StartTestChatRunResponse> {\n return this.fetch<StartTestChatRunResponse>(\n `w/${wid}/qualifications/workflows/${workflowId}/test-chat-runs`,\n {\n method: 'POST',\n body: JSON.stringify(data),\n }\n );\n }\n\n async evaluateTestChatRun(wid: string, runId: number): Promise<void> {\n await this.fetch(`w/${wid}/qualifications/test-chat-runs/${runId}/evaluate`, {\n method: 'POST',\n });\n }\n\n /** Manually end a test chat run (for human-driven runs, which have no\n * simulator workflow to mark them completed). */\n async endTestChatRun(wid: string, runId: number): Promise<TestChatRun> {\n return this.fetch<TestChatRun>(`w/${wid}/qualifications/test-chat-runs/${runId}/end`, {\n method: 'POST',\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 credits: 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_credits: 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_credits: number;\n by_provider: ProviderUsageSummary[];\n by_type: Record<\n string,\n { messages: number; tokens: number; cached_tokens: number; cost: number; credits: 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 totalCredits: 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}\n\nexport interface TTSUsageRow {\n date: string;\n provider: string;\n model: string;\n messageCount: number;\n totalCharacters: number;\n}\n\nexport interface STTProviderSummary {\n provider: string;\n model: string;\n totalDurationSeconds: number;\n totalMessages: number;\n}\n\nexport interface TTSProviderSummary {\n provider: string;\n model: string;\n totalCharacters: number;\n totalMessages: 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 totalTtsCharacters: number;\n totalTtsMessages: 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 /** Get AI model usage report for a workspace within an optional date range. */\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 /** Get SMS usage report for a workspace within an optional date range. */\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 /** Get phone call usage report for a workspace within an optional date range. */\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 /** Get usage report for a specific member within an optional date range. */\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 /** Get voice (STT/TTS) usage report for a workspace within an optional date range. */\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 type {\n ImportSalesforceMembersRequest,\n ImportSalesforceMembersResponse,\n SalesforceSearchRequest,\n SalesforceSearchResponse,\n SalesforceSyncConfigResponse,\n UpdateSalesforceSyncConfigRequest,\n} from '../types/appConnectionTypes';\nexport type {\n ImportSalesforceMembersRequest,\n ImportSalesforceMembersResponse,\n SalesforceSearchRequest,\n SalesforceSearchResponse,\n};\nimport type { PaginatedResponse } from '../types/coreTypes';\nimport { BaseApiClient } from './base';\n\nexport interface SalesforceConnectionStatus {\n connectionId: number | null;\n connected: boolean;\n state: string | null;\n instanceUrl: string | null;\n apiVersion: string | null;\n authorizeUrl: string | null;\n error: string | null;\n authorizedByMemberId: number | null;\n authorizedAt: string | null;\n}\n\nexport interface ConfigureSalesforceRequest {\n clientId: string;\n clientSecret: string;\n instanceUrl: string;\n}\n\nexport interface SalesforceReconciliationMatch {\n memberId: number;\n salesforceRecordId: string;\n salesforceName: string | null;\n salesforceEmail: string | null;\n salesforcePhone: string | null;\n matchType: string;\n objectType: string;\n}\n\nexport interface LinkMemberToSalesforceRequest {\n memberId: number;\n salesforceRecordId: string;\n objectType?: string;\n}\n\nexport interface BulkLinkSalesforceRequest {\n links: LinkMemberToSalesforceRequest[];\n}\n\nexport interface LinkedSalesforceMember {\n memberId: number;\n salesforceRecordId: string;\n memberName: string | null;\n memberEmail: string | null;\n memberPhone: string | null;\n lastSyncedAt: string | null;\n lastSyncStatus: string | null;\n}\n\nexport class SalesforceApi extends BaseApiClient {\n async configureSalesforce(\n wid: string,\n data: ConfigureSalesforceRequest\n ): Promise<SalesforceConnectionStatus> {\n return this.fetch<SalesforceConnectionStatus>(\n `w/${wid}/app-connections/salesforce/configure`,\n {\n method: 'POST',\n body: JSON.stringify(data),\n }\n );\n }\n\n async startSalesforceOAuth(wid: string): Promise<SalesforceConnectionStatus> {\n return this.fetch<SalesforceConnectionStatus>(\n `w/${wid}/app-connections/salesforce/oauth/start`,\n {\n method: 'POST',\n }\n );\n }\n\n async getSalesforceStatus(wid: string): Promise<SalesforceConnectionStatus> {\n return this.fetch<SalesforceConnectionStatus>(`w/${wid}/app-connections/salesforce/status`);\n }\n\n async disconnectSalesforce(wid: string): Promise<SalesforceConnectionStatus> {\n return this.fetch<SalesforceConnectionStatus>(\n `w/${wid}/app-connections/salesforce/disconnect`,\n {\n method: 'DELETE',\n }\n );\n }\n\n async disableSalesforce(wid: string): Promise<SalesforceConnectionStatus> {\n return this.fetch<SalesforceConnectionStatus>(`w/${wid}/app-connections/salesforce/disable`, {\n method: 'POST',\n });\n }\n\n async enableSalesforce(wid: string): Promise<SalesforceConnectionStatus> {\n return this.fetch<SalesforceConnectionStatus>(`w/${wid}/app-connections/salesforce/enable`, {\n method: 'POST',\n });\n }\n\n async deleteSalesforce(wid: string): Promise<{ status: string }> {\n return this.fetch<{ status: string }>(`w/${wid}/app-connections/salesforce/delete`, {\n method: 'DELETE',\n });\n }\n\n async getSalesforceReconciliationMatches(\n wid: string,\n params?: { limit?: number; offset?: number }\n ): Promise<SalesforceReconciliationMatch[]> {\n const query = new URLSearchParams();\n if (params?.limit !== undefined) query.set('limit', String(params.limit));\n if (params?.offset !== undefined) query.set('offset', String(params.offset));\n const qs = query.toString() ? `?${query.toString()}` : '';\n return this.fetch<SalesforceReconciliationMatch[]>(\n `w/${wid}/app-connections/salesforce/reconciliation/matches${qs}`\n );\n }\n\n async linkMemberToSalesforce(\n wid: string,\n data: LinkMemberToSalesforceRequest\n ): Promise<{ status: string; memberId: number; salesforceRecordId: string }> {\n return this.fetch(`w/${wid}/app-connections/salesforce/reconciliation/link`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n async bulkLinkMembersToSalesforce(\n wid: string,\n data: BulkLinkSalesforceRequest\n ): Promise<{ linked: number }> {\n return this.fetch(`w/${wid}/app-connections/salesforce/reconciliation/link/bulk`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n async unlinkMemberFromSalesforce(\n wid: string,\n memberId: number\n ): Promise<{ status: string; memberId: number }> {\n return this.fetch(`w/${wid}/app-connections/salesforce/reconciliation/unlink/${memberId}`, {\n method: 'DELETE',\n });\n }\n\n async getLinkedSalesforceMembers(\n wid: string,\n params?: { page?: number; pageSize?: number; search?: string }\n ): Promise<PaginatedResponse<LinkedSalesforceMember>> {\n const query = new URLSearchParams();\n if (params?.page !== undefined) query.set('page', String(params.page));\n if (params?.pageSize !== undefined) query.set('pageSize', String(params.pageSize));\n if (params?.search?.trim()) query.set('search', params.search.trim());\n const qs = query.toString() ? `?${query.toString()}` : '';\n return this.fetch<PaginatedResponse<LinkedSalesforceMember>>(\n `w/${wid}/app-connections/salesforce/reconciliation/linked${qs}`\n );\n }\n\n // --- Sync config ---\n\n async getSalesforceSyncConfig(wid: string): Promise<SalesforceSyncConfigResponse> {\n return this.fetch<SalesforceSyncConfigResponse>(\n `w/${wid}/app-connections/salesforce/sync/config`\n );\n }\n\n async updateSalesforceSyncConfig(\n wid: string,\n data: UpdateSalesforceSyncConfigRequest\n ): Promise<SalesforceSyncConfigResponse> {\n return this.fetch<SalesforceSyncConfigResponse>(\n `w/${wid}/app-connections/salesforce/sync/config`,\n {\n method: 'PUT',\n body: JSON.stringify(data),\n }\n );\n }\n\n async describeSalesforceObject(\n wid: string,\n sobject: string\n ): Promise<{ fields: Array<{ name: string; label: string; type: string }> }> {\n return this.fetch(\n `w/${wid}/app-connections/salesforce/describe/${encodeURIComponent(sobject)}`\n );\n }\n\n // --- Search & Import ---\n\n async searchSalesforceRecords(\n wid: string,\n data: SalesforceSearchRequest\n ): Promise<SalesforceSearchResponse> {\n return this.fetch<SalesforceSearchResponse>(`w/${wid}/app-connections/salesforce/search`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n async importSalesforceMembers(\n wid: string,\n data: ImportSalesforceMembersRequest\n ): Promise<ImportSalesforceMembersResponse> {\n return this.fetch<ImportSalesforceMembersResponse>(\n `w/${wid}/app-connections/salesforce/import-members`,\n {\n method: 'POST',\n body: JSON.stringify(data),\n }\n );\n }\n}\n","import type {\n ConnectionSyncConfig,\n SyncCapabilities,\n SyncCheckpoint,\n SyncEntityType,\n SyncRunMode,\n} from '../types/appConnectionTypes';\nimport { BaseApiClient } from './base';\n\nexport type { SyncRunMode };\nexport type SyncRunStatus = 'running' | 'completed' | 'failed' | 'completed_with_errors';\nexport type SyncDirection = 'inbound' | 'outbound';\nexport type SyncItemStatus = 'synced' | 'failed' | 'skipped' | 'linked' | 'unlinked';\nexport type SyncRunSource = 'manual' | 'webhook' | 'scheduled';\n\nexport interface SyncRunSummary {\n runId: string;\n connectionUuid: string;\n startedAt: string;\n completedAt: string | null;\n status: SyncRunStatus;\n mode: SyncRunMode;\n dryRun: boolean;\n source?: SyncRunSource;\n total: number;\n synced: number;\n failed: number;\n skipped: number;\n errorMessage: string | null;\n errors: string[];\n /**\n * Run-level scope. ``null`` indicates an unscoped run that processed\n * every enabled entity type. When set, only that entity type was\n * processed.\n */\n entityType?: SyncEntityType | null;\n}\n\nexport interface MemberSyncSummary {\n totalWorkspaceMembers: number;\n linkedMembers: number;\n unlinkedMembers: number;\n erroredLinks: number;\n lastSuccessfulSyncAt: string | null;\n lastSyncStatus: SyncRunStatus | null;\n}\n\nexport interface SyncRunItemDetail {\n index: number;\n direction: SyncDirection;\n status: SyncItemStatus;\n detail: string | null;\n memberId: number | null;\n memberName: string | null;\n remoteRecordId: string | null;\n entityType: SyncEntityType | null;\n localId: number | null;\n scopeType: string | null;\n scopeKey: string | null;\n}\n\n/**\n * Generic connection sync API — works with any sync-capable connection.\n * Endpoints are under /app-connections/{connectionId}/sync-config and /sync/*.\n */\nexport class ConnectionSyncApi extends BaseApiClient {\n async getConnectionSyncCapabilities(\n wid: string,\n connectionId: number\n ): Promise<SyncCapabilities> {\n return this.fetch<SyncCapabilities>(\n `w/${wid}/app-connections/${connectionId}/sync-capabilities`\n );\n }\n\n async getConnectionSyncConfig(wid: string, connectionId: number): Promise<ConnectionSyncConfig> {\n return this.fetch<ConnectionSyncConfig>(\n `w/${wid}/app-connections/${connectionId}/sync-config`\n );\n }\n\n async updateConnectionSyncConfig(\n wid: string,\n connectionId: number,\n data: ConnectionSyncConfig\n ): Promise<ConnectionSyncConfig> {\n return this.fetch<ConnectionSyncConfig>(\n `w/${wid}/app-connections/${connectionId}/sync-config`,\n { method: 'PUT', body: JSON.stringify(data) }\n );\n }\n\n async getConnectionSyncCheckpoint(\n wid: string,\n connectionId: number,\n direction: SyncDirection = 'inbound',\n syncKey: string = 'default'\n ): Promise<SyncCheckpoint> {\n const query = new URLSearchParams({\n direction,\n sync_key: syncKey,\n });\n return this.fetch<SyncCheckpoint>(\n `w/${wid}/app-connections/${connectionId}/sync/checkpoint?${query}`\n );\n }\n\n /**\n * Start a sync run. Returns the raw Response (SSE stream).\n * Callers should read the stream for sync_run and sync_item events.\n *\n * Pass ``entityType`` to scope the run to a single entity type\n * (members or records). When omitted, the run covers every enabled\n * entity type on the connection.\n *\n * Pass ``boardId`` together with ``entityType`` to further scope the\n * run to a single board mapping within that entity — useful for\n * isolating test/debug runs to one board.\n */\n async startSyncRun(\n wid: string,\n connectionId: number,\n options?: {\n dryRun?: boolean;\n resetCheckpoints?: boolean;\n entityType?: SyncEntityType;\n boardId?: string;\n }\n ): Promise<Response> {\n return this.fetchRaw(`w/${wid}/app-connections/${connectionId}/sync/run`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n dryRun: options?.dryRun ?? false,\n resetCheckpoints: options?.resetCheckpoints ?? false,\n ...(options?.entityType ? { entityType: options.entityType } : {}),\n ...(options?.boardId ? { boardId: options.boardId } : {}),\n }),\n });\n }\n\n async getSyncRuns(\n wid: string,\n connectionId: number,\n limit: number = 20\n ): Promise<SyncRunSummary[]> {\n return this.fetch<SyncRunSummary[]>(\n `w/${wid}/app-connections/${connectionId}/sync/runs?limit=${limit}`\n );\n }\n\n async getMemberSyncSummary(wid: string, connectionId: number): Promise<MemberSyncSummary> {\n return this.fetch<MemberSyncSummary>(\n `w/${wid}/app-connections/${connectionId}/sync/member-summary`\n );\n }\n\n async getSyncRunItems(\n wid: string,\n connectionId: number,\n runId: string,\n limit: number = 500\n ): Promise<SyncRunItemDetail[]> {\n return this.fetch<SyncRunItemDetail[]>(\n `w/${wid}/app-connections/${connectionId}/sync/runs/${runId}/items?limit=${limit}`\n );\n }\n}\n","import type {\n HubSpotSearchRequest,\n HubSpotSearchResponse,\n HubSpotPropertyDefinition,\n ImportHubSpotMembersRequest,\n ImportHubSpotMembersResponse,\n ManagedRuleStatus,\n SyncLogsResponse,\n TransformPreset,\n} from '../types/appConnectionTypes';\nimport type { PaginatedResponse } from '../types/coreTypes';\nimport { BaseApiClient } from './base';\n\nexport interface HubspotConnectionStatus {\n connectionId: number | null;\n connected: boolean;\n state: string | null;\n portalId: string | null;\n authorizeUrl: string | null;\n error: string | null;\n authorizedByMemberId: number | null;\n authorizedAt: string | null;\n}\n\nexport interface ConfigureHubspotRequest {\n clientId: string;\n clientSecret: string;\n}\n\nexport interface HubspotReconciliationMatch {\n memberId: number;\n hubspotRecordId: string;\n hubspotName: string | null;\n hubspotEmail: string | null;\n hubspotPhone: string | null;\n matchType: string;\n objectType: string;\n}\n\nexport interface LinkMemberToHubspotRequest {\n memberId: number;\n hubspotRecordId: string;\n objectType?: string;\n}\n\nexport interface BulkLinkHubspotRequest {\n links: LinkMemberToHubspotRequest[];\n}\n\nexport interface LinkedHubspotMember {\n memberId: number;\n hubspotRecordId: string;\n memberName: string | null;\n memberEmail: string | null;\n memberPhone: string | null;\n lastSyncedAt: string | null;\n lastSyncStatus: string | null;\n}\n\nexport class HubspotApi extends BaseApiClient {\n async configureHubspot(\n wid: string,\n data: ConfigureHubspotRequest\n ): Promise<HubspotConnectionStatus> {\n return this.fetch<HubspotConnectionStatus>(`w/${wid}/app-connections/hubspot/configure`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n async startHubspotOAuth(wid: string): Promise<HubspotConnectionStatus> {\n return this.fetch<HubspotConnectionStatus>(`w/${wid}/app-connections/hubspot/oauth/start`, {\n method: 'POST',\n });\n }\n\n async getHubspotStatus(wid: string): Promise<HubspotConnectionStatus> {\n return this.fetch<HubspotConnectionStatus>(`w/${wid}/app-connections/hubspot/status`);\n }\n\n async disconnectHubspot(wid: string): Promise<HubspotConnectionStatus> {\n return this.fetch<HubspotConnectionStatus>(`w/${wid}/app-connections/hubspot/disconnect`, {\n method: 'DELETE',\n });\n }\n\n async disableHubspot(wid: string): Promise<HubspotConnectionStatus> {\n return this.fetch<HubspotConnectionStatus>(`w/${wid}/app-connections/hubspot/disable`, {\n method: 'POST',\n });\n }\n\n async enableHubspot(wid: string): Promise<HubspotConnectionStatus> {\n return this.fetch<HubspotConnectionStatus>(`w/${wid}/app-connections/hubspot/enable`, {\n method: 'POST',\n });\n }\n\n async deleteHubspot(wid: string): Promise<{ status: string }> {\n return this.fetch<{ status: string }>(`w/${wid}/app-connections/hubspot/delete`, {\n method: 'DELETE',\n });\n }\n\n async getHubspotReconciliationMatches(\n wid: string,\n params?: { limit?: number; offset?: number }\n ): Promise<HubspotReconciliationMatch[]> {\n const query = new URLSearchParams();\n if (params?.limit !== undefined) query.set('limit', String(params.limit));\n if (params?.offset !== undefined) query.set('offset', String(params.offset));\n const qs = query.toString() ? `?${query.toString()}` : '';\n return this.fetch<HubspotReconciliationMatch[]>(\n `w/${wid}/app-connections/hubspot/reconciliation/matches${qs}`\n );\n }\n\n async linkMemberToHubspot(\n wid: string,\n data: LinkMemberToHubspotRequest\n ): Promise<{ status: string; memberId: number; hubspotRecordId: string }> {\n return this.fetch(`w/${wid}/app-connections/hubspot/reconciliation/link`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n async bulkLinkMembersToHubspot(\n wid: string,\n data: BulkLinkHubspotRequest\n ): Promise<{ linked: number }> {\n return this.fetch(`w/${wid}/app-connections/hubspot/reconciliation/link/bulk`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n async unlinkMemberFromHubspot(\n wid: string,\n memberId: number\n ): Promise<{ status: string; memberId: number }> {\n return this.fetch(`w/${wid}/app-connections/hubspot/reconciliation/unlink/${memberId}`, {\n method: 'DELETE',\n });\n }\n\n async getLinkedHubspotMembers(\n wid: string,\n params?: { page?: number; pageSize?: number; search?: string }\n ): Promise<PaginatedResponse<LinkedHubspotMember>> {\n const query = new URLSearchParams();\n if (params?.page !== undefined) query.set('page', String(params.page));\n if (params?.pageSize !== undefined) query.set('pageSize', String(params.pageSize));\n if (params?.search?.trim()) query.set('search', params.search.trim());\n const qs = query.toString() ? `?${query.toString()}` : '';\n return this.fetch<PaginatedResponse<LinkedHubspotMember>>(\n `w/${wid}/app-connections/hubspot/reconciliation/linked${qs}`\n );\n }\n\n async searchHubspotRecords(\n wid: string,\n data: HubSpotSearchRequest\n ): Promise<HubSpotSearchResponse> {\n return this.fetch<HubSpotSearchResponse>(`w/${wid}/app-connections/hubspot/search`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n async importHubspotMembers(\n wid: string,\n data: ImportHubSpotMembersRequest\n ): Promise<ImportHubSpotMembersResponse> {\n return this.fetch<ImportHubSpotMembersResponse>(\n `w/${wid}/app-connections/hubspot/import-members`,\n { method: 'POST', body: JSON.stringify(data) }\n );\n }\n\n async getHubspotContactProperties(wid: string): Promise<HubSpotPropertyDefinition[]> {\n return this.fetch<HubSpotPropertyDefinition[]>(\n `w/${wid}/app-connections/hubspot/sync-settings/hs-properties`\n );\n }\n\n async getHubspotManagedRules(wid: string): Promise<ManagedRuleStatus[]> {\n return this.fetch<ManagedRuleStatus[]>(`w/${wid}/app-connections/hubspot/managed-rules`);\n }\n\n async getHubspotSyncLogs(\n wid: string,\n params?: { pageSize?: number; cursor?: string }\n ): Promise<SyncLogsResponse> {\n const query = new URLSearchParams();\n if (params?.pageSize) query.set('pageSize', String(params.pageSize));\n if (params?.cursor) query.set('cursor', params.cursor);\n const qs = query.toString() ? `?${query.toString()}` : '';\n return this.fetch(`w/${wid}/app-connections/hubspot/sync/logs${qs}`);\n }\n\n async getHubspotTransformPresets(wid: string): Promise<TransformPreset[]> {\n return this.fetch<TransformPreset[]>(\n `w/${wid}/app-connections/hubspot/sync-settings/transform-presets`\n );\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 /** List all sites in a workspace. */\n async getSites(wid: string): Promise<Site[]> {\n return this.fetch<Site[]>(`w/${wid}/sites`);\n }\n\n /** Check whether a site slug is available for use. */\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 /** Check whether a custom domain is available for a site. */\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 /** Get a single site by ID. */\n async getSite(wid: string, id: number): Promise<Site> {\n return this.fetch<Site>(`w/${wid}/sites/${id}`);\n }\n\n /** Get a single site by UUID. */\n async getSiteByUuid(wid: string, uuid: string): Promise<Site> {\n return this.fetch<Site>(`s/${wid}/${uuid}`);\n }\n\n /** Get a fully rendered page from a site by slug or ID. */\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 /** Get the rendered navigation menu for a site, including all translations. */\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 /** Sign up a new user through a site's public registration. */\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 /** Send a phone verification code for site-specific authentication. */\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 /** Send an email verification code for site-specific authentication. */\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 /** Verify a phone or email code and complete site authentication. */\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 /** Trigger a crawl of the site's external content source. */\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 /** Create a new site in the workspace. */\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 /** Update a site's configuration. */\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 /** Delete a site by ID. */\n async deleteSite(wid: string, id: number): Promise<void> {\n return this.fetch(`w/${wid}/sites/${id}`, {\n method: 'DELETE',\n });\n }\n\n /** List pages for a site with optional pagination, sorting, and search. */\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 /** Get a single page by ID within a site. */\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 /** Get a single page by its slug within a site. */\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 /** Create a new page within a site. */\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 /** Update a page's content or metadata. */\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 /** Delete a page from a site. */\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 /** Get aggregate counts (pages, menu items, etc.) for a site. */\n async getSiteCounts(wid: string, siteId: number): Promise<SiteCountsResponse> {\n return this.fetch<SiteCountsResponse>(`w/${wid}/sites/${siteId}/counts`);\n }\n\n /** Get the full menu tree for a site. */\n async getSiteMenu(wid: string, siteId: number): Promise<MenuTree> {\n return this.fetch<MenuTree>(`w/${wid}/sites/${siteId}/menu`);\n }\n\n /** List menu items for a site, optionally filtered by parent item. */\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 /** Create a new menu item in a site's navigation. */\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 /** Update a menu item's properties. */\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 /** Delete a menu item from a site's navigation. */\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 /** Reorder menu items within a site's navigation. */\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 /** Generate a pre-signed upload URL for site media content. */\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 /** Initiate Google OAuth flow for site-specific authentication. */\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 /** List all subscriptions for the current account. */\n async getSubscriptions(): Promise<Subscription[]> {\n return this.fetch<Subscription[]>('subscriptions');\n }\n\n /** List all subscriptions associated with a workspace. */\n async getWorkspaceSubscriptions(wid: string): Promise<Subscription[]> {\n return this.fetch<Subscription[]>(`w/${wid}/subscriptions`);\n }\n\n /** Cancel an active subscription. */\n async cancelSubscription(subscriptionId: number): Promise<void> {\n return this.fetch(`subscriptions/${subscriptionId}/cancel`, {\n method: 'POST',\n credentials: 'include',\n });\n }\n\n /** Reactivate a previously cancelled subscription. */\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 /** Update a subscription's budget, plan period, or credit settings. */\n async updateSubscription(\n subscriptionId: number,\n updates: {\n planPeriod?: string; // Plan period (e.g., \"month\", \"year\")\n extraUsageEnabled?: boolean;\n reloadAmountCents?: number | null;\n reloadThresholdCents?: number | null;\n monthlyReloadLimitCents?: number | null;\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 /** Add a workspace to an existing subscription. */\n async addWorkspaceToSubscription(\n subscriptionId: number,\n data: {\n product_id: number;\n workspace_id: number;\n plan_period?: string;\n name?: string;\n slug?: string;\n template_workspace_uuid?: string;\n }\n ): Promise<{\n success: boolean;\n itemsCreated: number;\n subscriptionId: number;\n workspaceId: number;\n }> {\n return this.fetch(`subscriptions/${subscriptionId}/add-workspace`, {\n method: 'POST',\n credentials: 'include',\n body: JSON.stringify(data),\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n }\n\n /** Purchase extra credits on a subscription (org-level). */\n async purchaseCredits(\n subscriptionId: number,\n amountCents: number\n ): Promise<{\n success: boolean;\n grantId: number;\n creditsAdded: number;\n amountChargedCents: number;\n newBalance: number;\n }> {\n return this.fetch(`subscriptions/${subscriptionId}/purchase-credits`, {\n method: 'POST',\n credentials: 'include',\n body: JSON.stringify({ amount_cents: amountCents }),\n headers: { 'Content-Type': 'application/json' },\n });\n }\n}\n","import { BaseApiClient } from './base';\nimport type {\n Customer,\n CustomerAccount,\n Invoice,\n StripePaymentMethod,\n UpdateCustomerRequest,\n} from '../types';\nimport type { Subscription } from '../types';\n\n// Response type includes the user's role on this customer\nexport interface MyCustomerResponse extends Customer {\n role: string;\n}\n\nexport class CustomersApi extends BaseApiClient {\n async getMyCustomers(): Promise<MyCustomerResponse[]> {\n return this.fetch<MyCustomerResponse[]>('customers');\n }\n\n async getMyCustomer(uuid: string): Promise<MyCustomerResponse> {\n return this.fetch<MyCustomerResponse>(`customers/${uuid}`);\n }\n\n async getMyCustomerAccounts(uuid: string): Promise<CustomerAccount[]> {\n return this.fetch<CustomerAccount[]>(`customers/${uuid}/accounts`);\n }\n\n async getMyCustomerSubscriptions(\n uuid: string,\n opts?: { status?: string; page?: number; pageSize?: number }\n ): Promise<{ items: Subscription[]; total: number; page: number; pageSize: number }> {\n const params = new URLSearchParams();\n if (opts?.status) params.set('status', opts.status);\n if (opts?.page) params.set('page', String(opts.page));\n if (opts?.pageSize) params.set('page_size', String(opts.pageSize));\n const qs = params.toString();\n return this.fetch(`customers/${uuid}/subscriptions${qs ? '?' + qs : ''}`);\n }\n\n async getMyCustomerInvoices(uuid: string): Promise<Invoice[]> {\n return this.fetch<Invoice[]>(`customers/${uuid}/invoices`);\n }\n\n async updateMyCustomer(uuid: string, data: UpdateCustomerRequest): Promise<MyCustomerResponse> {\n return this.fetch<MyCustomerResponse>(`customers/${uuid}`, {\n method: 'PUT',\n body: JSON.stringify(data),\n headers: { 'Content-Type': 'application/json' },\n });\n }\n\n // ===== Payment Methods =====\n\n async createMyCustomerSetupIntent(\n uuid: string\n ): Promise<{ clientSecret: string; setupIntentId: string; status: string }> {\n return this.fetch(`customers/${uuid}/stripe/setup-intent`, { method: 'POST' });\n }\n\n async getMyCustomerPaymentMethods(uuid: string): Promise<StripePaymentMethod[]> {\n return this.fetch<StripePaymentMethod[]>(`customers/${uuid}/stripe/payment-methods`);\n }\n\n async attachMyCustomerPaymentMethod(\n uuid: string,\n paymentMethodId: string,\n setAsDefault: boolean = false\n ): Promise<{ success: boolean; message: string; paymentMethodId: string; type: string }> {\n return this.fetch(`customers/${uuid}/stripe/payment-methods/${paymentMethodId}/attach`, {\n method: 'POST',\n body: JSON.stringify({ setAsDefault }),\n });\n }\n\n async detachMyCustomerPaymentMethod(\n uuid: string,\n paymentMethodId: string\n ): Promise<{ success: string; message: string }> {\n return this.fetch(`customers/${uuid}/stripe/payment-methods/${paymentMethodId}`, {\n method: 'DELETE',\n });\n }\n\n async setDefaultMyCustomerPaymentMethod(\n uuid: string,\n paymentMethodId: string\n ): Promise<{ success: string; message: string }> {\n return this.fetch(`customers/${uuid}/stripe/payment-methods/${paymentMethodId}/set-default`, {\n method: 'PUT',\n });\n }\n}\n","import { BaseApiClient } from './base';\nimport type { Reseller, ResellerAccount, UpdateResellerRequest, Subscription } from '../types';\nimport type { Product } from '../types';\n\n// Response type includes the user's role on this reseller\nexport interface MyResellerResponse extends Reseller {\n role: string;\n}\n\nexport class ResellersApi extends BaseApiClient {\n async getMyResellers(): Promise<MyResellerResponse[]> {\n return this.fetch<MyResellerResponse[]>('resellers');\n }\n\n async getMyReseller(uuid: string): Promise<MyResellerResponse> {\n return this.fetch<MyResellerResponse>(`resellers/${uuid}`);\n }\n\n async getMyResellerAccounts(uuid: string): Promise<ResellerAccount[]> {\n return this.fetch<ResellerAccount[]>(`resellers/${uuid}/accounts`);\n }\n\n async getMyResellerProducts(uuid: string): Promise<Product[]> {\n return this.fetch<Product[]>(`resellers/${uuid}/products`);\n }\n\n async getMyResellerSubscriptions(\n uuid: string,\n opts?: { status?: string; page?: number; pageSize?: number }\n ): Promise<{ items: Subscription[]; total: number; page: number; pageSize: number }> {\n const params = new URLSearchParams();\n if (opts?.status) params.set('status', opts.status);\n if (opts?.page) params.set('page', String(opts.page));\n if (opts?.pageSize) params.set('page_size', String(opts.pageSize));\n const qs = params.toString();\n return this.fetch(`resellers/${uuid}/subscriptions${qs ? '?' + qs : ''}`);\n }\n\n async updateMyReseller(uuid: string, data: UpdateResellerRequest): Promise<MyResellerResponse> {\n return this.fetch<MyResellerResponse>(`resellers/${uuid}`, {\n method: 'PUT',\n body: JSON.stringify(data),\n headers: { 'Content-Type': 'application/json' },\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 /** List all supervisors in a workspace. */\n async getSupervisors(wid: string): Promise<CustomTool[]> {\n return this.fetch<CustomTool[]>(`w/${wid}/supervisors`);\n }\n\n /** Get a single supervisor by ID. */\n async getSupervisor(wid: string, id: number): Promise<CustomTool> {\n return this.fetch<CustomTool>(`w/${wid}/supervisors/${id}`);\n }\n\n /** Create a new supervisor in a workspace. */\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 /** Update an existing supervisor with partial data. */\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 /** Delete a supervisor by ID. */\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';\nimport { Task, TaskFormData } from '../types';\n\nexport class TasksApi extends BaseApiClient {\n /** List all tasks in a workspace, optionally filtering by workflow or including archived. */\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 /** Get a single task by ID. */\n async getTask(wid: string, id: number | string): Promise<Task> {\n return this.fetch<Task>(`w/${wid}/tasks/${id}`);\n }\n\n /** Create a new task in a workspace. */\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 /** Update an existing task with partial data. */\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 /** Delete a task by ID. */\n async deleteTask(wid: string, id: number): Promise<void> {\n return this.fetch(`w/${wid}/tasks/${id}`, {\n method: 'DELETE',\n });\n }\n\n /** Archive a task, hiding it from default listings. */\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 /** Restore an archived task back to active status. */\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 * 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 { 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 { 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 {\n Journey,\n JourneyFormData,\n JourneyGoal,\n JourneyGoalFormData,\n JourneyNote,\n JourneyNoteFormData,\n JourneyStep,\n JourneyStepConnectionFormData,\n JourneyStepConnection,\n JourneyStepFormData,\n MemberJourney,\n EnrollMemberFormData,\n UnenrollMemberFormData,\n PaginatedResponse,\n} from '../types';\n\nexport class JourneysApi extends BaseApiClient {\n /** List journeys, optionally including archived, paginated. */\n async getJourneys(\n wid: string,\n includeArchived: boolean = false,\n pageOpts?: { page?: number; pageSize?: number }\n ): Promise<PaginatedResponse<Journey>> {\n const query = new URLSearchParams();\n if (includeArchived) query.set('include_archived', 'true');\n if (pageOpts?.page !== undefined) query.set('page', String(pageOpts.page));\n if (pageOpts?.pageSize !== undefined) query.set('pageSize', String(pageOpts.pageSize));\n const qs = query.toString() ? `?${query.toString()}` : '';\n return this.fetch<PaginatedResponse<Journey>>(`w/${wid}/journeys${qs}`);\n }\n\n /** Get a single journey by ID (includes steps and goals). */\n async getJourney(wid: string, journeyId: number): Promise<Journey> {\n return this.fetch<Journey>(`w/${wid}/journeys/${journeyId}`);\n }\n\n /** Create a new journey. */\n async createJourney(wid: string, data: JourneyFormData): Promise<Journey> {\n return this.fetch<Journey>(`w/${wid}/journeys`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n /** Update an existing journey. */\n async updateJourney(\n wid: string,\n journeyId: number,\n data: Partial<JourneyFormData>\n ): Promise<Journey> {\n return this.fetch<Journey>(`w/${wid}/journeys/${journeyId}`, {\n method: 'PUT',\n body: JSON.stringify(data),\n });\n }\n\n /** Archive a journey (soft delete). */\n async archiveJourney(wid: string, journeyId: number): Promise<{ status: string }> {\n return this.fetch<{ status: string }>(`w/${wid}/journeys/${journeyId}`, {\n method: 'DELETE',\n });\n }\n\n /** Create a step within a journey. */\n async createStep(\n wid: string,\n journeyId: number,\n data: JourneyStepFormData\n ): Promise<JourneyStep> {\n return this.fetch<JourneyStep>(`w/${wid}/journeys/${journeyId}/steps`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n /** Update an existing step. */\n async updateStep(\n wid: string,\n journeyId: number,\n stepUuid: string,\n data: Partial<JourneyStepFormData>\n ): Promise<JourneyStep> {\n return this.fetch<JourneyStep>(`w/${wid}/journeys/${journeyId}/steps/${stepUuid}`, {\n method: 'PUT',\n body: JSON.stringify(data),\n });\n }\n\n /** Archive a step (soft delete). */\n async archiveStep(\n wid: string,\n journeyId: number,\n stepUuid: string\n ): Promise<{ status: string }> {\n return this.fetch<{ status: string }>(`w/${wid}/journeys/${journeyId}/steps/${stepUuid}`, {\n method: 'DELETE',\n });\n }\n\n /** Create a connection (DAG edge) between two steps. */\n async createConnection(\n wid: string,\n journeyId: number,\n data: JourneyStepConnectionFormData\n ): Promise<JourneyStepConnection> {\n return this.fetch<JourneyStepConnection>(`w/${wid}/journeys/${journeyId}/connections`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n /** Update a connection (edge) by ID. */\n async updateConnection(\n wid: string,\n journeyId: number,\n connectionId: number,\n data: Partial<JourneyStepConnectionFormData>\n ): Promise<JourneyStepConnection> {\n return this.fetch<JourneyStepConnection>(\n `w/${wid}/journeys/${journeyId}/connections/${connectionId}`,\n { method: 'PUT', body: JSON.stringify(data) }\n );\n }\n\n /** Delete a connection by ID. */\n async deleteConnection(\n wid: string,\n journeyId: number,\n connectionId: number\n ): Promise<{ status: string }> {\n return this.fetch<{ status: string }>(\n `w/${wid}/journeys/${journeyId}/connections/${connectionId}`,\n { method: 'DELETE' }\n );\n }\n\n /** Create a goal for a journey. */\n async createGoal(\n wid: string,\n journeyId: number,\n data: JourneyGoalFormData\n ): Promise<JourneyGoal> {\n return this.fetch<JourneyGoal>(`w/${wid}/journeys/${journeyId}/goals`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n /** Update an existing goal. */\n async updateGoal(\n wid: string,\n journeyId: number,\n goalUuid: string,\n data: Partial<JourneyGoalFormData>\n ): Promise<JourneyGoal> {\n return this.fetch<JourneyGoal>(`w/${wid}/journeys/${journeyId}/goals/${goalUuid}`, {\n method: 'PUT',\n body: JSON.stringify(data),\n });\n }\n\n /** Delete a goal. */\n async deleteGoal(wid: string, journeyId: number, goalUuid: string): Promise<{ status: string }> {\n return this.fetch<{ status: string }>(`w/${wid}/journeys/${journeyId}/goals/${goalUuid}`, {\n method: 'DELETE',\n });\n }\n\n /** List enrolled members for a journey (paginated). */\n async getJourneyMembers(\n wid: string,\n journeyId: number,\n params?: { page?: number; pageSize?: number; search?: string }\n ): Promise<PaginatedResponse<MemberJourney>> {\n const qs = new URLSearchParams();\n if (params?.page) qs.set('page', String(params.page));\n if (params?.pageSize) qs.set('pageSize', String(params.pageSize));\n if (params?.search) qs.set('search', params.search);\n const query = qs.toString();\n return this.fetch<PaginatedResponse<MemberJourney>>(\n `w/${wid}/journeys/${journeyId}/members${query ? `?${query}` : ''}`\n );\n }\n\n /** Enroll one or more members in a journey. */\n async enrollMembers(\n wid: string,\n journeyId: number,\n data: EnrollMemberFormData\n ): Promise<MemberJourney[]> {\n return this.fetch<MemberJourney[]>(`w/${wid}/journeys/${journeyId}/enroll`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n /** Unenroll one or more members from a journey. */\n async unenrollMembers(\n wid: string,\n journeyId: number,\n data: UnenrollMemberFormData\n ): Promise<MemberJourney[]> {\n return this.fetch<MemberJourney[]>(`w/${wid}/journeys/${journeyId}/unenroll`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n /** Re-enroll a canceled member back to enrolled status. */\n async reenrollMember(wid: string, journeyId: number, memberId: number): Promise<MemberJourney> {\n return this.fetch<MemberJourney>(`w/${wid}/journeys/${journeyId}/reenroll`, {\n method: 'POST',\n body: JSON.stringify({ memberId }),\n });\n }\n\n /** Hard-delete a canceled enrollment so the member can be re-enrolled fresh. */\n async deleteEnrollment(wid: string, journeyId: number, memberId: number): Promise<void> {\n await this.fetch(`w/${wid}/journeys/${journeyId}/members/${memberId}`, {\n method: 'DELETE',\n });\n }\n\n /** Get all journey enrollments for a member. */\n async getMemberJourneys(wid: string, memberId: number): Promise<MemberJourney[]> {\n return this.fetch<MemberJourney[]>(`w/${wid}/journeys/by-member/${memberId}`);\n }\n\n // ===== JOURNEY NOTES =====\n\n /** List notes for a journey. */\n async getJourneyNotes(wid: string, journeyId: number): Promise<JourneyNote[]> {\n return this.fetch<JourneyNote[]>(`w/${wid}/journeys/${journeyId}/notes`);\n }\n\n /** Create a note on a journey. */\n async createJourneyNote(\n wid: string,\n journeyId: number,\n data: JourneyNoteFormData\n ): Promise<JourneyNote> {\n return this.fetch<JourneyNote>(`w/${wid}/journeys/${journeyId}/notes`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n /** Update an existing journey note. */\n async updateJourneyNote(\n wid: string,\n journeyId: number,\n noteId: number,\n data: Partial<JourneyNoteFormData>\n ): Promise<JourneyNote> {\n return this.fetch<JourneyNote>(`w/${wid}/journeys/${journeyId}/notes/${noteId}`, {\n method: 'PUT',\n body: JSON.stringify(data),\n });\n }\n\n /** Delete a journey note. */\n async deleteJourneyNote(wid: string, journeyId: number, noteId: number): Promise<void> {\n return this.fetch<void>(`w/${wid}/journeys/${journeyId}/notes/${noteId}`, {\n method: 'DELETE',\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 WorkflowAccessValidationResponse,\n WorkflowConfigValidationResponse,\n WorkflowContributor,\n CreateWorkflowContributorRequest,\n UpdateWorkflowContributorRequest,\n} from '../types/taskTypes';\nimport type {\n WorkspaceBuilderInfo,\n BuildWorkspaceResponse,\n ValidateWorkflowNameResponse,\n} from '../types/workspaceBuilderTypes';\nimport type {\n WorkflowVersionResponse,\n WorkflowVersionDetailResponse,\n WorkflowVersionListResponse,\n PublishVersionRequest,\n UpdateVersionRequest,\n WorkflowVersionDiffResponse,\n} from '../types/workflowVersionTypes';\n\nexport class WorkflowsApi extends BaseApiClient {\n /** List all workflows in a workspace, optionally including archived ones. */\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 /** Get a single workflow by ID. */\n async getWorkflow(wid: string, id: number | string): Promise<Workflow> {\n return this.fetch<Workflow>(`w/${wid}/workflows/${id}`);\n }\n\n /** Get activity metrics for a single workflow. */\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 /** Get activity metrics for multiple workflows in a single request. */\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 /** Get the Mermaid diagram representation of a workflow. */\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 /** Create a new workflow in a workspace. */\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 /** Update an existing workflow. */\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 /** Preview the impact of deleting a workflow, including affected tasks and assignments. */\n async getWorkflowDeletionPreview(\n wid: string,\n id: number\n ): Promise<{\n items: Array<{ id: number; name: string; description: string | null }>;\n total: number;\n hasAssignments: boolean;\n }> {\n return this.fetch(`w/${wid}/workflows/${id}/deletion-preview`);\n }\n\n /** Delete a workflow, optionally cascading to delete its tasks. */\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 /** Archive a workflow. */\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 /** Unarchive a previously archived workflow. */\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 /** Clone a workflow with a new name. */\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 /** List available workflow templates. */\n async getWorkflowTemplates(wid: string): Promise<WorkflowTemplate[]> {\n return this.fetch<WorkflowTemplate[]>(`w/${wid}/workflows/templates`);\n }\n\n /** Create a new workflow from a template. */\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 /** Get task assignment statistics for a workflow within an optional date range. */\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 /** List chats for a specific task within a workflow. */\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 async getWorkflowAccessValidation(\n wid: string,\n workflowId: number\n ): Promise<WorkflowAccessValidationResponse> {\n return this.fetch<WorkflowAccessValidationResponse>(\n `w/${wid}/workflows/${workflowId}/validate-access`\n );\n }\n\n async getWorkflowConfigValidation(\n wid: string,\n workflowId: number\n ): Promise<WorkflowConfigValidationResponse> {\n return this.fetch<WorkflowConfigValidationResponse>(\n `w/${wid}/workflows/${workflowId}/validate-config`\n );\n }\n\n // Workflow Contributors API\n\n /** List all contributors for a workflow. */\n async getWorkflowContributors(wid: string, workflowId: number): Promise<WorkflowContributor[]> {\n return this.fetch<WorkflowContributor[]>(`w/${wid}/workflows/${workflowId}/contributors`);\n }\n\n /** Add a contributor to a workflow. */\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 /** Update a workflow contributor's settings. */\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 /** Remove a contributor from a workflow. */\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<{ items: WorkspaceBuilderInfo[] }>(`w/${wid}/builders`);\n return response.items;\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 // Workflow Versions API\n\n /** List all versions of a workflow. */\n async getWorkflowVersions(\n wid: string,\n workflowUuid: string\n ): Promise<WorkflowVersionListResponse> {\n return this.fetch<WorkflowVersionListResponse>(`w/${wid}/workflows/${workflowUuid}/versions`);\n }\n\n /** Get the active version of a workflow. */\n async getWorkflowVersionActive(\n wid: string,\n workflowUuid: string\n ): Promise<WorkflowVersionDetailResponse> {\n return this.fetch<WorkflowVersionDetailResponse>(\n `w/${wid}/workflows/${workflowUuid}/versions/active`\n );\n }\n\n /** Get a specific version of a workflow by version number. */\n async getWorkflowVersion(\n wid: string,\n workflowUuid: string,\n versionNumber: number\n ): Promise<WorkflowVersionDetailResponse> {\n return this.fetch<WorkflowVersionDetailResponse>(\n `w/${wid}/workflows/${workflowUuid}/versions/${versionNumber}`\n );\n }\n\n /** Publish the live workflow as a new immutable version. */\n async publishWorkflowVersion(\n wid: string,\n workflowUuid: string,\n data: PublishVersionRequest\n ): Promise<WorkflowVersionResponse> {\n return this.fetch<WorkflowVersionResponse>(`w/${wid}/workflows/${workflowUuid}/versions`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n async updateWorkflowVersion(\n wid: string,\n workflowUuid: string,\n versionNumber: number,\n data: UpdateVersionRequest\n ): Promise<WorkflowVersionResponse> {\n return this.fetch<WorkflowVersionResponse>(\n `w/${wid}/workflows/${workflowUuid}/versions/${versionNumber}`,\n { method: 'PATCH', body: JSON.stringify(data) }\n );\n }\n\n /** Activate a published version. */\n async activateWorkflowVersion(\n wid: string,\n workflowUuid: string,\n versionNumber: number\n ): Promise<WorkflowVersionResponse> {\n return this.fetch<WorkflowVersionResponse>(\n `w/${wid}/workflows/${workflowUuid}/versions/${versionNumber}/activate`,\n {\n method: 'POST',\n }\n );\n }\n\n /** Deactivate a published version. */\n async deactivateWorkflowVersion(\n wid: string,\n workflowUuid: string,\n versionNumber: number\n ): Promise<WorkflowVersionResponse> {\n return this.fetch<WorkflowVersionResponse>(\n `w/${wid}/workflows/${workflowUuid}/versions/${versionNumber}/deactivate`,\n {\n method: 'POST',\n }\n );\n }\n\n /** Compare two workflow versions (0 = draft). */\n async diffWorkflowVersions(\n wid: string,\n workflowUuid: string,\n fromVersion: number,\n toVersion: number\n ): Promise<WorkflowVersionDiffResponse> {\n return this.fetch<WorkflowVersionDiffResponse>(\n `w/${wid}/workflows/${workflowUuid}/versions/diff?from=${fromVersion}&to=${toVersion}`\n );\n }\n}\n","import { BaseApiClient } from './base';\nimport type { WorkflowNote, WorkflowNoteFormData } from '../types/taskTypes';\n\nexport class WorkflowNotesApi extends BaseApiClient {\n /** List all notes for a specific workflow. */\n async getWorkflowNotes(wid: string, workflowId: number): Promise<WorkflowNote[]> {\n return this.fetch<WorkflowNote[]>(`w/${wid}/workflows/${workflowId}/notes`);\n }\n\n /** Create a new note on a workflow. */\n async createWorkflowNote(\n wid: string,\n workflowId: number,\n data: WorkflowNoteFormData\n ): Promise<WorkflowNote> {\n return this.fetch<WorkflowNote>(`w/${wid}/workflows/${workflowId}/notes`, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n }\n\n /** Update an existing workflow note with partial data. */\n async updateWorkflowNote(\n wid: string,\n workflowId: number,\n noteId: number,\n data: Partial<WorkflowNoteFormData>\n ): Promise<WorkflowNote> {\n return this.fetch<WorkflowNote>(`w/${wid}/workflows/${workflowId}/notes/${noteId}`, {\n method: 'PUT',\n body: JSON.stringify(data),\n });\n }\n\n /** Delete a workflow note by ID. */\n async deleteWorkflowNote(wid: string, workflowId: number, noteId: number): Promise<void> {\n return this.fetch<void>(`w/${wid}/workflows/${workflowId}/notes/${noteId}`, {\n method: 'DELETE',\n });\n }\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 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 // Journey\n JOURNEYS_READ = 'journeys:read',\n JOURNEYS_WRITE = 'journeys:write',\n JOURNEYS_ADMIN = 'journeys: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 /** @deprecated Use parent resource write scope (MEMBERS_WRITE, CHATS_WRITE, FILES_WRITE) */\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// ===== MEMBER MEMORY TYPES =====\nexport type MemoryStrategyType = 'preferences' | 'semantic' | 'summaries' | 'episodic';\n\nexport interface MemoryItem {\n key: string;\n strategy: string;\n content: string;\n createdAt: string | null;\n updatedAt: string | null;\n}\n\nexport interface MemberMemoriesResponse {\n items: MemoryItem[];\n total: number;\n}\n\n// ===== AGENT MEMORY CONFIG =====\n/** Configuration for AgentCore long-term memory on Agent members. */\nexport interface AgentMemoryConfig {\n /** Whether memory is enabled (default: false) */\n enabled?: boolean;\n /** Retrieve relevant memories and inject into prompt (default: true) */\n read?: boolean;\n /** Store conversational events for memory extraction (default: true) */\n write?: boolean;\n /** Search user preference memories (default: true) */\n preferences?: boolean;\n /** Search semantic fact memories (default: true) */\n semantic?: boolean;\n /** Search conversation summary memories (default: true) */\n summaries?: boolean;\n /** Search episodic memories — interaction sequences, troubleshooting flows (default: false) */\n episodic?: boolean;\n}\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 maxDailyActions?: number;\n tools?: string[];\n codeInterpreterEnabled?: boolean;\n memoryConfig?: AgentMemoryConfig;\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 maxDailyActions?: number;\n tools?: string[];\n codeInterpreterEnabled?: boolean;\n memoryConfig?: AgentMemoryConfig;\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 | 'notifyVoice'\n | 'calendarEvent'\n | 'chatEngagement'\n | 'lastMessageActivity'\n | 'memberCreated'\n | 'isDefault'\n | 'memberType'\n | 'memberField'\n | 'journey';\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 | 'lessThanDaysAgo'\n | 'daysUntil'\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 homeFolderId?: number | null;\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 notifyWhatsapp?: 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 notifyWhatsapp?: 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 notifyWhatsapp?: 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 notifyWhatsapp?: 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 maxDailyActions?: number;\n tools?: string[];\n codeInterpreterEnabled?: boolean;\n memoryConfig?: AgentMemoryConfig;\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 maxDailyActions?: number;\n tools?: string[];\n codeInterpreterEnabled?: boolean;\n memoryConfig?: AgentMemoryConfig;\n}\n\n// ===== BULK MEMBER CREATION TYPES =====\nexport interface BulkMemberItem {\n email?: string;\n phone?: string;\n name?: string;\n description?: string;\n externalId?: string;\n memberRoleId?: number;\n labels?: string[];\n notifySms?: boolean;\n notifyEmail?: boolean;\n notifyVoice?: boolean;\n notifyWhatsapp?: boolean;\n locale?: string;\n timezone?: string;\n}\n\nexport interface BulkMemberResult {\n index: number;\n status: 'created' | 'updated' | 'failed';\n memberId?: number;\n externalId?: string;\n error?: string;\n}\n\nexport interface BulkCreateMembersRequest {\n members: BulkMemberItem[];\n upsert?: boolean;\n}\n\nexport interface BulkCreateMembersResponse {\n importedCount: number;\n totalCount: number;\n success: boolean;\n results: BulkMemberResult[];\n errors?: string[];\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, routines, 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 RoutineSortField,\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 ROUTINE = 'routine',\n WORKFLOW = 'workflow',\n CALENDAR = 'calendar',\n CALENDAR_EVENT_TYPE = 'calendar_event_type',\n MONDAY = 'monday',\n JOURNEY = 'journey',\n CALL = 'call',\n}\n\nexport enum EventRuleEventType {\n TASK_EXECUTE = 'task:execute',\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 ROUTINE_TRIGGERED = 'routine:triggered',\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 // Journey event types\n JOURNEY_STEP_EXECUTE = 'journey_step:execute',\n JOURNEY_ENROLLED = 'journey:enrolled',\n JOURNEY_COMPLETED = 'journey:completed',\n\n // Call lifecycle event types\n CALL_STARTED = 'call:started',\n CALL_COMPLETED = 'call:completed',\n CALL_SUMMARY = 'call:summary',\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_CREATE_ITEM = 'monday:create_item',\n MONDAY_UPSERT_ITEM = 'monday:upsert_item',\n MONDAY_REFRESH = 'monday:refresh',\n ASSIGNMENT_CONCLUDE = 'assignment:conclude',\n JOURNEY_ENROLL = 'journey:enroll',\n SMS_SEND = 'sms:send',\n WHATSAPP_SEND = 'whatsapp:send',\n PHONE_CALL = 'phone:call',\n CONNECTION_SYNC = 'connection:sync',\n ECW_REFRESH_MEMBER_ENCOUNTERS = 'ecw:refresh_member_encounters',\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 signingSecret?: 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 // Completion outcomes: 'success' | 'failed' | 'referred'\n // Cancellation outcomes: 'caller_hangup' | 'member_unsubscribe' | 'admin_canceled'\n // | 'expired' | 'system_error' | 'busy' | 'no_answer'\n outcome: string;\n reason?: string; // Optional reason for conclusion\n}\n\nexport interface JourneyEnrollActionParams {\n journeyId: number; // ID of the journey to enroll the member in\n}\n\nexport interface EmailSendActionParams {\n subjectTemplate?: string; // Email subject — required for one-off, optional for workflow-only; if provided with workflow, sent as initial message\n bodyTemplate?: string; // Email body — required for one-off, optional for workflow-only; if provided with workflow, sent as initial message\n inboxUUID: string; // UUID of the inbox to send from\n toEmail?: string; // Override recipient email (defaults to member's email); ignored when workflow is set\n contentType?: 'text' | 'html'; // Content type: 'text' for plain text, 'html' for HTML (default: 'text')\n workflowUUID?: string; // Start a conversation with this workflow after sending\n initialUserMessage?: string; // Initial message to send from user when starting conversation\n}\n\nexport interface SmsSendActionParams {\n phoneNumberUUID: string; // UUID of the phone number to send from\n messageTemplate?: string; // SMS body — required for one-off, optional for workflow-only; if provided with workflow, sent as initial message\n workflowUUID?: string; // Start a conversation with this workflow after sending\n initialUserMessage?: string; // Initial message to send from user when starting conversation\n}\n\nexport interface PhoneCallActionParams {\n phoneNumberUUID: string; // Required: UUID of the phone number to call from\n workflowUUID: string; // Required: UUID of the workflow to use for the call\n}\n\n/**\n * Parameters for the ecw:refresh_member_encounters action.\n * Refreshes the local eCW encounter cache for the target member before\n * later actions (such as phone:call) run in the same rule chain.\n */\nexport interface EcwRefreshMemberEncountersActionParams {\n /** ID of the eCW FHIR connection whose encounter cache should be refreshed. */\n connectionId: number;\n /** Days of encounter history to pull on this refresh. Defaults to 30. */\n lookbackDays?: number;\n /**\n * When true (default), a refresh failure raises a non-retryable action\n * error so later rules in the same chain do not run. Set to false only\n * when a time-critical outreach must proceed with stale cache on refresh\n * failure.\n */\n haltOnFailure?: boolean;\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 routineId?: number | null;\n workflowId?: number | null;\n calendarId?: number | null;\n calendarEventTypeId?: number | null;\n journeyStepId?: number | null;\n journeyId?: number | null;\n appConnectionId?: 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 routineId?: number | null;\n workflowId?: number | null;\n calendarId?: number | null;\n calendarEventTypeId?: number | null;\n journeyStepId?: 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// ===== ROUTINES TYPES =====\n\nexport interface Routine {\n id: number;\n uuid: string;\n name: string;\n description?: string;\n /** Gates time-based firing. The mode config is preserved across disable/enable. */\n scheduleEnabled: boolean;\n scheduleMode: 'ONCE' | 'CRON' | 'INTERVAL';\n scheduledTime?: string;\n intervalSeconds?: number;\n repeatCount?: number;\n cronString?: string;\n startDate?: string;\n memberFilterId?: number;\n targetMemberId?: number;\n limit: number;\n /** `private` = owner-only; `workspace` = visible to anyone in the workspace. */\n visibility: 'private' | 'workspace';\n ownerId: number;\n createdAt: string;\n updatedAt: string;\n eventRules?: EventRule[];\n lastRun?: RoutineRun;\n nextRun?: string;\n /** Gates inbound webhook delivery. */\n webhookEnabled: boolean;\n /** Plaintext secret returned ONCE on enable or rotate. Null otherwise. */\n webhookSecretPlaintext?: string | null;\n}\n\nexport interface RoutineRun {\n id: number;\n uuid: string;\n routineId: 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 CreateRoutineRequest {\n name: string;\n description?: string;\n scheduleEnabled?: boolean;\n scheduleMode?: 'ONCE' | 'CRON' | 'INTERVAL';\n scheduledTime?: string;\n intervalSeconds?: number;\n repeatCount?: number;\n cronString?: string;\n startDate?: string;\n memberFilterId?: number;\n targetMemberId?: number;\n limit?: number;\n visibility?: 'private' | 'workspace';\n /** When true, the server generates a webhook secret and returns its\n * plaintext exactly once in the create response. */\n webhookEnabled?: boolean;\n /** Ordered event rules to attach in the same request. Server syncs by\n * UUID: same-UUID updates, new UUID creates, omitted UUIDs are deleted. */\n eventRules?: EventRuleInput[];\n}\n\nexport interface UpdateRoutineRequest {\n name?: string;\n description?: string;\n scheduleEnabled?: boolean;\n scheduleMode?: 'ONCE' | 'CRON' | 'INTERVAL';\n scheduledTime?: string;\n intervalSeconds?: number;\n repeatCount?: number;\n cronString?: string;\n /** ISO 8601 datetime string for deferred start. Pass empty string \"\" to clear the start date. */\n startDate?: string;\n memberFilterId?: number;\n targetMemberId?: number;\n limit?: number;\n visibility?: 'private' | 'workspace';\n /** Ordered event rules to attach. Server syncs by UUID: same-UUID rows\n * update, new UUIDs create, UUIDs missing from the list are deleted.\n * Omit the field to leave existing rules untouched. */\n eventRules?: EventRuleInput[];\n /** Toggle inbound webhook. Enabling without a stored secret generates one and surfaces plaintext in the response exactly once. */\n webhookEnabled?: boolean;\n /** Rotate the stored secret without toggling enabled. Ignored when webhookEnabled=false. */\n rotateWebhookSecret?: boolean;\n}\n\nexport interface RoutinesQueryParams {\n page?: number;\n pageSize?: number;\n sortBy?: RoutineSortField;\n sortOrder?: SortOrder;\n /**\n * 'mine' = routines I own, 'shared' = workspace-visible from others,\n * 'all' = both. 'all_including_private' = every routine in the\n * workspace; requires AUTOMATIONS_ADMIN and will 403 otherwise.\n */\n owner?: 'mine' | 'shared' | 'all' | 'all_including_private';\n}\n\nexport interface RoutineRunsQueryParams {\n page?: number;\n pageSize?: number;\n sortBy?: EventRunSortField;\n sortOrder?: SortOrder;\n routineId?: number;\n memberId?: number;\n status?: 'PENDING' | 'RUNNING' | 'COMPLETED' | 'FAILED';\n}\n\n// ===== SCHEDULE PREVIEW =====\n\nexport interface SchedulePreviewRequest {\n cronString: string;\n count?: number;\n}\n\nexport interface SchedulePreviewResponse {\n nextRuns: string[];\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 customerId: number | null;\n stripeSubscriptionId: string | null;\n stripeProductId: string | null;\n productId: number;\n planPeriod: string; // e.g., \"month\", \"year\"\n productType: string;\n productName: string;\n planCostPerPeriod: number | null;\n // Sum of planCostPerPeriod plus every active item's costPerPeriod (cents).\n // Use this for the collapsed subscription total in admin tables.\n totalCostPerPeriod?: number | null;\n subscriptionStatus: string;\n createdAt: string;\n updatedAt: string;\n customerOrganizationId: number | null;\n resellerWorkspaceUuid: string | null;\n resellerWorkspaceName: string | null;\n // Credit-based billing controls\n extraUsageEnabled: boolean;\n usageSuspended: boolean;\n reloadAmountCents: number | null;\n reloadThresholdCents: number | null;\n creditPriceCents: number | null;\n monthlyReloadLimitCents: number | null;\n cancelAtPeriodEnd: boolean;\n cancelAt: string | null;\n canceledAt: string | null;\n isDirect: boolean;\n customerName: string | null;\n customerEmail: string | null;\n resellerUuid?: string | null;\n resellerName?: string | null;\n // Plan inclusion (from product.credit_inclusion) — informational only.\n planIncludedUnits?: number | null;\n // Authoritative current balance (subscription.credits_remaining).\n creditBalance?: number | null;\n // Sum of credit_units from all grants effective in the current period.\n // Use this (not planIncludedUnits) as the denominator for usage displays.\n creditsGrantedThisPeriod?: number;\n // Credits consumed this period. Computed server-side.\n creditsUsedThisPeriod?: number;\n reloadsThisPeriodCents?: number | null;\n currentPeriodEnd?: string | null;\n items?: SubscriptionItem[];\n}\n\nexport type SubscriptionItemPriceType = 'plan' | 'overage' | 'phone_number';\n\nexport interface SubscriptionItem {\n id: number;\n subscriptionId: number;\n productId: number;\n productName?: string;\n productType?: string;\n stripeSubscriptionItemId: string | null;\n stripeSubscriptionId: string | null; // per-workspace Stripe subscription\n priceType: SubscriptionItemPriceType;\n resourceKey: string | null;\n customerWorkspaceId: number | null;\n customerWorkspaceUuid: string | null;\n customerWorkspaceName: string | null;\n providerPhoneNumberId: number | null;\n phoneNumber: string | null;\n quantity: number;\n status: string;\n createdAt: string;\n updatedAt: string;\n // Recurring cost for this item in cents (unit cost * quantity) for the\n // parent subscription's billing period. Null for metered/overage items.\n costPerPeriod?: number | null;\n}\n\n// ===== CREDIT GRANT TYPES =====\n\nexport type CreditGrantType = 'plan_inclusion' | 'reload' | 'promotional';\nexport type CreditGrantStatus = 'pending' | 'active' | 'depleted' | 'expired' | 'voided';\n\nexport interface CreditGrant {\n id: number;\n uuid: string;\n subscriptionId: number;\n customerId: number;\n customerWorkspaceId: number | null;\n grantType: CreditGrantType;\n amountCents: number;\n priority: number;\n creditUnits: number;\n remainingUnits: number;\n effectiveAt: string;\n expiresAt: string | null;\n status: CreditGrantStatus;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface CreditBalance {\n balance: number; // remaining credits\n totalGranted: number; // total for this period\n used: number; // consumed this period\n reloadsThisPeriodCents: number;\n extraUsageEnabled: boolean;\n reloadAmountCents: number | null;\n reloadThresholdCents: number | null;\n monthlyReloadLimitCents: number | 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 PHONE = 'phone',\n EMAIL = 'email',\n WHATSAPP = 'whatsapp',\n DISCORD = 'discord',\n SLACK = 'slack',\n\n // Platform features\n SITES = 'sites',\n FORMS = 'forms',\n MAPS = 'maps',\n BROWSER = 'browser',\n WEB_SEARCH = 'web_search',\n CALENDAR = 'calendar',\n DIRECT_MESSAGES = 'direct_messages',\n JOURNEYS = 'journeys',\n OPERATOR = 'operator',\n PRESENCE = 'presence',\n\n // Integration features\n GMAIL = 'gmail',\n GCALENDAR = 'gcalendar',\n MONDAY = 'monday',\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 // EHR Integration features\n EHR_FHIR = 'ehr_fhir', // Base feature for FHIR/EHR integration UI\n EHR_ECLINICALWORKS = 'ehr_eclinicalworks', // Requires EHR_FHIR\n EHR_HEALTHIE = 'ehr_healthie', // Healthie EHR integration\n\n // CRM Integration features\n CRM_SALESFORCE = 'crm_salesforce', // Salesforce CRM integration\n CRM_HUBSPOT = 'crm_hubspot', // HubSpot CRM integration\n\n // Knowledge base features\n CONFLUENCE = 'confluence', // Confluence knowledge base sync\n\n // AI features\n AGENT_MEMORY = 'agent_memory', // AgentCore long-term memory for agents\n IMAGE_GENERATION = 'image_generation', // AI image generation\n WORKFLOW_VERSIONING = 'workflow_versioning', // Publish and manage workflow versions\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 = 'phone',\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 CREDIT = 'credit',\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 ORG = 'org', // Organization-level subscription\n ADDON = 'addon', // Feature add-on (scoped by SubscriptionItem.customerWorkspaceId)\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([\n Resource.WORKSPACE,\n Resource.ORG_ADMIN,\n Resource.PHONE_NUMBER,\n]);\n\n/**\n * Limit-only resources: enforced by hard limits, no overage billing.\n * These have plan inclusions/limits but no metered overages.\n * When the limit is hit, the operation is blocked.\n */\nexport const LIMIT_ONLY_RESOURCES: Set<Resource> = new Set([\n Resource.MEMBER,\n Resource.INBOX,\n Resource.SITE,\n Resource.PHONE_NUMBER,\n Resource.STORAGE_MB,\n Resource.WORKSPACE,\n Resource.ORG_ADMIN,\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\n// Note: ProductLimits type defined above is used for WORKSPACE product limits\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 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 concierge: boolean;\n\n supportLevels: string[];\n selfService: boolean;\n\n // ORG products: credit budget\n creditInclusion?: number | null;\n creditUnitCost?: number | null;\n // WORKSPACE products: resource hard caps\n limits?: ProductLimits | null;\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 concierge?: boolean;\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 // ORG products: credit budget\n creditInclusion?: number | null;\n creditUnitCost?: number | null;\n // WORKSPACE products: resource hard caps\n limits?: ProductLimits | null;\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 concierge?: boolean;\n supportLevels?: 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 // ORG products: credit budget\n creditInclusion?: number | null;\n creditUnitCost?: number | null;\n // WORKSPACE products: resource hard caps\n limits?: ProductLimits | null;\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 productId: number;\n planPeriod: string;\n workspaceId: number;\n customerWorkspaceId?: number;\n trialPeriodDays?: number;\n metadata?: Record<string, string>;\n cancelAtPeriodEnd?: boolean;\n collectionMethod?: string;\n}\n\nexport interface DirectSubscriptionCreateRequest {\n productId: number;\n planPeriod: string;\n workspaceId: number;\n customerWorkspaceId?: number;\n organizationId?: number;\n organizationName?: 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\nexport interface StripeSubscriptionUpdateRequest {\n metadata?: Record<string, string>;\n cancelAtPeriodEnd?: boolean;\n items?: Array<Record<string, any>>;\n trialEnd?: string;\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: Partial<Record<Resource, number | null>>;\n inclusions: Partial<Record<Resource, number | null>>;\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: Partial<Record<Resource, number | null>>;\n inclusions: Partial<Record<Resource, number | null>>;\n workspaceFeatures?: string[];\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: Partial<Record<Resource, number>>;\n cachedUsage: Partial<Record<Resource, number>>; // Cached/last synced usage values\n stripeOverage: Partial<Record<Resource, number>>;\n discrepancies: Partial<Record<Resource, 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 UsageDashboardResponse {\n workspaceId: number;\n workspaceUuid: string;\n workspaceName: string;\n plan: BillingPlanInfo;\n usage: BillingUsageInfo;\n resources: BillingResourceCounts;\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 StripeComparisonResult {\n localProduct: Product;\n stripeProduct?: StripeProduct;\n status: 'synced' | 'mismatch' | 'missing_stripe' | 'missing_local';\n differences: string[];\n planComparisons: PlanComparisonResult[];\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\n// ===== INVOICE TYPES =====\n\nexport interface Invoice {\n id: number;\n subscriptionId: number;\n invoiceNumber: string;\n status: string;\n amount: number; // in cents\n periodStart: string;\n periodEnd: string;\n s3Key: string | null;\n generatedAt: string | null;\n downloadUrl: string | null;\n productName: string | null;\n planPeriod: string | null;\n accountName: string | null;\n accountEmail: string | null;\n paymentReference: string | null;\n paidAt: string | null;\n receiptUrl: string | null;\n}\n\nexport interface RecordPaymentRequest {\n paymentReference: string;\n amount?: number; // override amount in cents\n}\n\nexport interface BillingPeriod {\n periodStart: string; // ISO datetime\n periodEnd: string; // ISO datetime\n invoiced: boolean;\n invoiceNumber: string | null;\n}\n\nexport interface GenerateInvoiceRequest {\n subscriptionId: number;\n periodStart: string; // ISO datetime\n periodEnd: string; // ISO datetime\n regenerate?: boolean;\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 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 /** Setup spec IDs linked to this workspace that are pending execution. */\n pendingSetupSpecIds?: number[] | null;\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 featuresOverride?: Record<string, boolean> | null;\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 isPublic?: boolean;\n allowSignup?: boolean;\n resellerId?: number;\n ownerId?: number;\n features?: WorkspaceFeature[];\n featuresOverride?: Record<string, boolean> | null;\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 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 agents: 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 defaultPhoneNumberId: number | null;\n defaultAgentId: number | null;\n workspaceFolderId: 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 sesDomain: string;\n enableAudioRecording: boolean;\n // Default model settings for new agents\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 defaultPhoneNumberId?: number | null;\n defaultAgentId?: 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, 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\n// ===== ORG-SCOPED WORKSPACE TYPES =====\n\n// Org-level workspace view (no superuser fields like dbId, featuresOverride, billing)\nexport interface OrgWorkspace {\n id: number;\n uuid: string;\n name: string;\n slug: string;\n organizationId: number;\n organizationUuid?: string | null;\n organizationName?: string | null;\n signupCode: string | null;\n createdAt: string;\n isPublic: boolean;\n allowSignup: boolean;\n resellerId: number | null;\n status: number;\n features?: string[] | null;\n featureStatus?: Record<string, string> | null;\n creatorId?: number | null;\n creatorName?: string | null;\n locale?: string | null;\n timezone?: string | null;\n isMember: boolean;\n}\n\nexport interface OrgJoinWorkspaceRequest {\n memberRoleId: number;\n}\n\nexport interface OrgJoinWorkspaceResponse {\n memberId: number;\n memberRoleId: number;\n message: string;\n}\n\n// Form data for org-scoped workspace creation (no features, no billing)\nexport interface OrgCreateWorkspaceFormData {\n name: string;\n slug?: string;\n templateWorkspaceUuid?: string;\n}\n\n// Form data for org-scoped workspace updates (no features, no billing, no org change)\nexport interface OrgWorkspaceFormData {\n name?: string;\n slug?: string;\n signupCode?: string;\n isPublic?: boolean;\n allowSignup?: boolean;\n locale?: string;\n timezone?: 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","// Data-related types extracted from main types.ts file\n// This file contains all types related to data types, data records, data fields, and data integrity management\n\nimport type { AccountReportItem } from './accountTypes';\nimport type { MemberReportItem } from './memberTypes';\n\n// ===== DATA FIELD TYPES =====\n\nexport enum DataFieldType {\n ENUM = 'enum',\n EMAIL = 'email',\n PHONE = 'phone',\n TEXT = 'text',\n LONGTEXT = 'longtext',\n NUMBER = 'number',\n DATE = 'date',\n DATETIME = 'datetime',\n TIME_OF_DAY = 'time_of_day',\n US_ZIP_CODE = 'us_zip_code',\n INTEGER = 'integer',\n BOOLEAN = 'boolean',\n ARRAY = 'array',\n OBJECT = 'object',\n FUNCTION = 'function',\n}\n\nexport enum IndexStatus {\n NONE = 'none',\n PENDING = 'pending',\n CREATING = 'creating',\n REMOVING = 'removing',\n READY = 'ready',\n ERROR = 'error',\n}\n\nexport interface DataField {\n id?: number;\n name: string;\n slug: string;\n description?: string;\n required: boolean;\n fieldType: DataFieldType;\n options?: EnumOption[];\n referencedTypeId?: number;\n shouldIndex?: boolean;\n indexStatus?: IndexStatus;\n adminOnly?: boolean;\n defaultValue?: any;\n order: number;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface DataFieldFormData {\n name: string;\n slug: string;\n description?: string;\n required: boolean;\n fieldType: DataFieldType;\n options?: EnumOption[];\n referencedTypeId?: number;\n shouldIndex?: boolean;\n indexStatus?: IndexStatus;\n adminOnly?: boolean;\n defaultValue?: any;\n}\n\n// ===== SCHEMA FIELD TYPES =====\n// Strongly-typed field definitions (canonical representation)\n\n/**\n * Label-value pair for enum field options.\n * Allows enum fields to have user-friendly labels while storing clean values\n * (e.g., numbers for scoring calculations in CEL expressions).\n */\nexport interface EnumOption {\n /** Display label shown to users */\n label: string;\n /** Stored value (can be string or number) */\n value: string | number;\n /**\n * CEL expression that must return true for this option to be visible.\n * Uses record.data.<field_slug> syntax to reference other field values.\n * CONSTRAINT: Can only reference non-FUNCTION fields.\n */\n visibleWhen?: string;\n}\n\n/**\n * SchemaField is the canonical representation of a data type field.\n * This is the type returned by the API and stored in the database.\n * Display order is determined by array position, not the order field.\n */\nexport interface SchemaField {\n /** Unique field identifier */\n slug: string;\n /** Display name for the field */\n name: string;\n /** Optional field description */\n description?: string;\n /** Field type (text, email, enum, etc.) */\n fieldType: DataFieldType;\n /** Whether field is required */\n required: boolean;\n /** @deprecated Display order is now determined by array position */\n order?: number;\n /** Options for enum fields as {label, value} objects. */\n options?: EnumOption[];\n /** Referenced DataType ID for reference fields */\n referencedTypeId?: number;\n /** Whether to index this field */\n shouldIndex?: boolean;\n /** Whether only admins can see this field */\n adminOnly?: boolean;\n /** Default value for the field */\n defaultValue?: any;\n /** CEL expression that computes this field's value from other fields */\n celFunction?: string;\n /**\n * CEL expression for cross-field validation.\n * Context: 'value' (current field value), 'record.data.<field_slug>' (other fields).\n * Returns: true if valid, or a string error message if invalid.\n * CONSTRAINT: Can only reference non-FUNCTION fields.\n */\n validateCel?: string;\n}\n\n// ===== DATA TYPE TYPES =====\n\nexport interface DataType {\n id: number;\n name: string;\n slug: string;\n uuid: string;\n description?: string;\n prompt?: string;\n isCollection: boolean;\n pinned?: boolean;\n archived: boolean;\n ownerId: number | null;\n createdAt: string;\n updatedAt: string;\n /** Typed field definitions */\n fields: SchemaField[];\n}\n\nexport interface DataTypeFormData {\n name: string;\n slug: string;\n description?: string;\n prompt?: string;\n isCollection: boolean;\n pinned?: boolean;\n /** Typed field definitions */\n fields: SchemaField[];\n ownerId?: number | null;\n}\n\n// ===== DATA RECORD TYPES =====\n\nexport interface DataRecord {\n id: number;\n dataTypeId: number;\n memberId: number;\n fieldValues: Record<string, any>;\n externalId?: string;\n assignmentTaskId?: number;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface DataRecordFormData {\n memberId?: number;\n /** Member external ID (alternative to memberId). Cannot be used with memberId. */\n memberExternalId?: string;\n fieldValues: Record<string, any>;\n externalId?: string;\n assignmentTaskId?: number;\n}\n\n// ===== DATA RECORD AUDIT TRAIL =====\n\nexport interface DataRecordUpdate {\n id: number;\n dataRecordId: number;\n memberId: number;\n fieldName: string;\n oldValue?: string | null;\n newValue?: string | null;\n createdAt: string;\n updatedAt: string;\n assignmentTaskId?: number | null;\n memberName?: string | null;\n}\n\n// ===== DATA RECORD PAGINATION =====\n\nexport interface DataRecordsPaginatedResponse {\n items: DataRecord[];\n total: number;\n page: number;\n pageSize: number;\n totalPages: number;\n}\n\n// ===== DATA RECORD ACCESS MODE TYPES =====\n// Used by Assignment data record associations\n\nexport interface DataRecordWithAccessMode extends DataRecord {\n accessMode: number;\n}\n\nexport interface DataRecordAssociationFormData {\n id: number;\n accessMode: number;\n}\n\n// ===== DATA INTEGRITY TYPES =====\n\nexport interface DataRecordReportItem {\n id: number;\n data_type_id: number;\n data_type_name: string;\n data_type_slug: string;\n values: Record<string, any>;\n created_at: string;\n updated_at: string;\n external_id?: string | null;\n}\n\nexport interface DataIntegrityReportItem {\n member: MemberReportItem;\n account: AccountReportItem;\n data_records: DataRecordReportItem[];\n possible_matches: DataIntegrityReportItem[];\n issues: string[];\n normalized_phone?: string | null;\n}\n\n// ===== DATA EXPORT/IMPORT TYPES =====\n\nexport interface DataTypeExportItem {\n uuid: string;\n name: string;\n description: string | null;\n}\n\nexport interface TaskExportDataTypeRelation {\n taskUuid: string;\n dataTypeUuid: string;\n accessMode: number;\n}\n\n// ===== BULK IMPORT TYPES =====\n\n/**\n * Result for a single record in a bulk import operation.\n */\nexport interface BulkRecordResult {\n index: number;\n status: 'created' | 'updated' | 'failed';\n recordId?: number | null;\n externalId?: string | null;\n error?: string | null;\n}\n\n/**\n * Response for bulk create data records operation.\n */\nexport interface BulkCreateDataRecordResponse {\n importedCount: number;\n totalCount: number;\n success: boolean;\n results: BulkRecordResult[];\n errors?: string[] | null;\n}\n\n/**\n * Request body for bulk create data records.\n */\nexport interface BulkCreateDataRecordRequest {\n records: DataRecordFormData[];\n upsert?: boolean;\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; // Credits 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 languages?: { code: string; name: string }[]; // Supported languages for STT 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 | 'pocket'\n | 'xai'\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 ttsModels: string[]; // TTS model IDs this voice is compatible with\n}\n\nexport interface VoiceModelsResponse {\n items: 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:aistudio:gemini-3.1-flash-live';\nexport const REALTIME_MODEL_GEMINI_VERTEX = 'google:vertex:gemini-3.1-flash-live';\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_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_DEEPGRAM_AURA_2 = 'deepgram:tts:aura-2';\nexport const TTS_MODEL_AWS_POLLY_GENERATIVE = 'aws:tts:polly-generative';\nexport const TTS_MODEL_AWS_POLLY_NEURAL = 'aws:tts:polly-neural';\nexport const TTS_MODEL_POCKET = 'pocket:tts:default';\n","/**\n * Calendar-related types for the Gravity Rail calendar and appointment booking system.\n */\n\n// Calendar Permission Types\nexport enum CalendarPermissionType {\n NONE = 'NONE',\n FREE_BUSY = 'FREE_BUSY',\n READ = 'READ',\n WRITE = 'WRITE',\n ADMIN = 'ADMIN',\n}\n\nexport enum CalendarSource {\n INTERNAL = 'internal',\n GOOGLE = 'google',\n OUTLOOK = 'outlook',\n}\n\n// Calendar types\nexport interface Calendar {\n id: number;\n uuid: string;\n templateUuid: string | null;\n name: string;\n slug: string;\n description: string | null;\n timezone: string;\n color: string | null;\n isPublic: boolean;\n ownerId: number;\n ownerName: string | null;\n remoteCalendarId?: string | null;\n syncStatus?: string | null;\n syncError?: string | null;\n lastSyncedAt?: string | null;\n calendarSource: CalendarSource;\n eventTypeIds: number[];\n schedules: CalendarSchedule[];\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface CalendarFormData {\n name: string;\n slug?: string;\n description?: string | null;\n timezone?: string;\n color?: string | null;\n isPublic?: boolean;\n eventTypeIds?: number[];\n}\n\nexport interface CalendarSchedule {\n id: number;\n uuid: string;\n name: string;\n description: string | null;\n availabilityType: CalendarScheduleAvailabilityType;\n recurrenceType: CalendarScheduleRecurrence;\n startTime: string;\n endTime: string;\n recurrenceRule: Record<string, any> | null;\n recurrenceEndDate: string | null;\n daysOfWeek: string[] | null;\n priority: number;\n eventTypeIds: number[];\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface CalendarScheduleFormData {\n name: string;\n description?: string | null;\n availabilityType: CalendarScheduleAvailabilityType;\n recurrenceType: CalendarScheduleRecurrence;\n startTime: string;\n endTime: string;\n recurrenceRule?: Record<string, any> | null;\n recurrenceEndDate?: string | null;\n daysOfWeek?: string[] | null;\n priority?: number;\n eventTypeIds?: number[] | null;\n}\n\nexport enum CalendarScheduleRecurrence {\n ONCE = 'ONCE',\n DAILY = 'DAILY',\n WEEKLY = 'WEEKLY',\n MONTHLY = 'MONTHLY',\n CUSTOM = 'CUSTOM',\n}\n\nexport enum CalendarScheduleAvailabilityType {\n AVAILABLE = 'AVAILABLE',\n UNAVAILABLE = 'UNAVAILABLE',\n}\n\n// Event type types\nexport interface CalendarEventType {\n id: number;\n uuid: string;\n templateUuid: string | null;\n name: string;\n slug: string;\n description: string | null;\n defaultDurationMinutes: number;\n bufferBeforeMinutes: number;\n bufferAfterMinutes: number;\n minAttendees: number;\n maxAttendees: number | null;\n color: string | null;\n active: boolean;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface CalendarEventTypeFormData {\n name: string;\n slug?: string;\n description?: string | null;\n defaultDurationMinutes: number;\n bufferBeforeMinutes?: number;\n bufferAfterMinutes?: number;\n minAttendees?: number;\n maxAttendees?: number | null;\n color?: string | null;\n active?: boolean;\n}\n\n// Event types\nexport interface CalendarEvent {\n id: number;\n uuid: string;\n calendarId: number;\n calendarName: string;\n eventTypeId: number;\n eventTypeName: string;\n eventTypeColor: string | null;\n title: string;\n description: string | null;\n location: string | null;\n startTime: string;\n endTime: string;\n status: CalendarEventStatus;\n creatorMemberId: number | null;\n workflowId: number | null;\n taskId: number | null;\n assignmentId: number | null;\n chatId: number | null;\n messageId: number | null;\n cancelledAt: string | null;\n cancelledByMemberId: number | null;\n cancellationReason: string | null;\n recurrenceRule: string | null;\n recurringEventId: string | null;\n isRecurringInstance: boolean;\n originalStartTime: string | null;\n remoteEventId: string | null;\n attendees: CalendarEventAttendee[];\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface CalendarEventFormData {\n calendarId: number;\n eventTypeId: number;\n title: string;\n description?: string | null;\n location?: string | null;\n startTime: string;\n attendeeIds: number[];\n workflowId?: number | null;\n taskId?: number | null;\n assignmentId?: number | null;\n}\n\nexport enum CalendarEventStatus {\n TENTATIVE = 'TENTATIVE',\n CONFIRMED = 'CONFIRMED',\n CANCELLED = 'CANCELLED',\n NO_SHOW = 'NO_SHOW',\n COMPLETED = 'COMPLETED',\n}\n\nexport interface CalendarEventAttendee {\n id: number;\n memberId: number;\n status: AttendeeStatus;\n responseStatus: AttendeeResponseStatus;\n responseAt: string | null;\n note: string | null;\n}\n\nexport enum AttendeeStatus {\n REQUIRED = 'REQUIRED',\n OPTIONAL = 'OPTIONAL',\n}\n\nexport enum AttendeeResponseStatus {\n PENDING = 'PENDING',\n ACCEPTED = 'ACCEPTED',\n DECLINED = 'DECLINED',\n TENTATIVE = 'TENTATIVE',\n}\n\n// iCal Feed Types\nexport interface ICalFeedTokenResponse {\n feedUrl: string;\n tokenGeneratedAt: string; // ISO 8601 datetime\n calendarId: number;\n calendarUuid: string;\n}\n\nexport interface ICalFeedUrlResponse {\n feedUrl: string | null;\n hasToken: boolean;\n tokenGeneratedAt: string | null; // ISO 8601 datetime\n}\n\nexport interface UpdateAttendeeRequest {\n responseStatus: AttendeeResponseStatus;\n note?: string | null;\n}\n\n// Availability types\nexport interface AvailabilityCheck {\n eventTypeId: number;\n startTime: string;\n endTime?: string | null;\n}\n\nexport interface AvailabilityResponse {\n available: boolean;\n reason?: string | null;\n}\n\nexport interface AvailableSlotsRequest {\n eventTypeId: number;\n startDate: string;\n endDate: string;\n slotIntervalMinutes?: number;\n}\n\nexport interface AvailableSlotsResponse {\n slots: string[];\n eventTypeId: number;\n calendarId: number;\n}\n\n// Query params\nexport interface CalendarEventsQueryParams {\n calendarId?: number;\n startDate?: string;\n endDate?: string;\n status?: CalendarEventStatus;\n memberId?: number;\n limit?: number;\n offset?: number;\n}\n\n// Google Calendar Integration Types\nexport interface GoogleCalendarInfo {\n id: string;\n summary: string;\n description?: string;\n timeZone: string;\n backgroundColor?: string;\n accessRole: string;\n primary: boolean;\n}\n\nexport interface GoogleCalendarStatusResponse {\n connected: boolean;\n email?: string;\n calendars: GoogleCalendarInfo[];\n insufficientScopes?: boolean;\n}\n\nexport interface GoogleCalendarInsufficientScopesResponse {\n connected: boolean;\n insufficientScopes: true;\n email?: string;\n reAuthUrl: string;\n}\n\nexport interface LinkCalendarRequest {\n googleCalendarId: string;\n}\n\nexport interface LinkCalendarResponse {\n status: string;\n message: string;\n googleCalendarId: string;\n googleCalendarName?: string;\n}\n\nexport interface UnlinkCalendarResponse {\n status: string;\n message: string;\n}\n\nexport interface SyncCalendarResponse {\n status: string;\n message: string;\n created: number;\n updated: number;\n errors: Array<{ event_id: string; error: string }>;\n}\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 *\n * ``skipped`` distinguishes an intentional no-op (e.g. manual-unlink\n * exclusion) from an execution failure. Clients should surface a\n * non-destructive toast for ``success=true, skipped=true`` results.\n */\nexport interface FhirMethodResponse {\n success: boolean;\n message: string;\n data?: unknown;\n skipped?: boolean;\n}\n\n// ==================== CSV Inspect Types ====================\n\n/**\n * Identifier classification kind returned by the inspect endpoint.\n */\nexport type FhirCsvIdentifierKind = 'encrypted_patient_id' | 'human_identifier';\n\n/**\n * Per-header classification metadata from the inspect endpoint.\n */\nexport interface FhirCsvColumnMeta {\n identifierKind: FhirCsvIdentifierKind;\n birthdayRequired: boolean;\n}\n\n/**\n * Response from the CSV inspect endpoint (PHI-minimal).\n */\nexport interface FhirCsvInspectResponse {\n headers: string[];\n suggestedIdentifierColumn: string | null;\n suggestedBirthdateColumn: string | null;\n columnMeta: Record<string, FhirCsvColumnMeta>;\n}\n\n// ==================== CSV Import Types ====================\n\n/**\n * CSV import settings stored in FhirConnection.vendor_config.\n */\nexport interface FhirCsvImportSettings {\n allowCreateUnmatched: boolean;\n defaultImportedMemberRoleId: number | null;\n trustEmail: boolean;\n trustPhone: boolean;\n}\n\n/**\n * Request to update CSV import settings.\n */\nexport interface UpdateFhirCsvImportSettingsRequest {\n allowCreateUnmatched?: boolean;\n defaultImportedMemberRoleId?: number | null;\n trustEmail?: boolean;\n trustPhone?: boolean;\n}\n\n/**\n * Status for a single import row.\n */\nexport type FhirCsvImportRowStatus =\n | 'linked'\n | 'already_linked'\n | 'created'\n | 'skipped'\n | 'ambiguous'\n | 'conflict'\n | 'not_found'\n | 'failed';\n\n/**\n * Import run summary (PHI-minimal, from DynamoDB).\n */\nexport type FhirCsvImportRunStatus =\n | 'queued'\n | 'in_progress'\n | 'completed'\n | 'completed_with_errors'\n | 'failed';\n\nexport interface FhirCsvImportRunSummary {\n runId: string;\n connectionUuid: string;\n startedAt: string;\n completedAt: string | null;\n status: FhirCsvImportRunStatus;\n total: number;\n linked: number;\n alreadyLinked: number;\n created: number;\n skipped: number;\n ambiguous: number;\n conflicted: number;\n notFound: number;\n failed: number;\n terminalError: string | null;\n}\n\n/**\n * Per-row item from a completed import run (PHI-minimal).\n */\nexport interface FhirCsvImportRunItem {\n index: number;\n status: FhirCsvImportRowStatus;\n reasonCode: string;\n detail: string | null;\n memberId: number | null;\n}\n\n// ==================== Encounter Sync Types ====================\n\n/**\n * Thin descriptor for the connector-owned encounter form.\n */\nexport interface EncounterSyncDataTypeSummary {\n id: number;\n uuid: string;\n slug: string;\n name: string;\n}\n\n/**\n * Current encounter-sync config plus runtime state for the UI status card.\n *\n * The legacy scheduler fields (``cadenceHours``, ``rollingLookbackDays``,\n * ``overlapDays``, ``initialLookbackDays``) are retained during the\n * demand-refresh migration and will be removed in a follow-up cleanup.\n */\nexport interface WorkflowStartAutomation {\n workflowIds: number[];\n /** Server-derived; present only in responses. */\n unsupportedWorkflowIds?: number[];\n}\n\nexport interface EncounterSyncStatus {\n enabled: boolean;\n schemaVersion?: number | null;\n /** Freshness TTL in minutes — refreshes skip paid reads within this window. */\n refreshTtlMinutes: number;\n /** Default lookback for workflow-start and scheduled-event refresh actions. */\n refreshLookbackDays: number;\n /** Default lookback for stale-reader refreshes. */\n readerLookbackDays: number;\n /** Lookback for manual connection-wide backfills. */\n manualBackfillLookbackDays: number;\n /** Post-create telephonic encounter write-through enabled. */\n postCreateWriteThroughEnabled: boolean;\n /** Optional delayed verification refresh enabled. */\n postCreateVerificationEnabled: boolean;\n /** Minutes to wait before the verification refresh runs. */\n postCreateVerificationDelayMinutes: number;\n /** Workflows with automatic workflow-start encounter refresh. */\n workflowStartAutomation: WorkflowStartAutomation;\n /** @deprecated Legacy scheduler field — not consulted by demand-refresh. */\n initialLookbackDays: number;\n /** @deprecated Legacy scheduler field — not consulted by demand-refresh. */\n rollingLookbackDays: number;\n /** @deprecated Legacy scheduler field — not consulted by demand-refresh. */\n overlapDays: number;\n /** @deprecated Legacy scheduler field — not consulted by demand-refresh. */\n cadenceHours: number;\n dataType?: EncounterSyncDataTypeSummary | null;\n /**\n * Companion observation form descriptor. Mirrors ``dataType`` but\n * for the per-observation row form. Server-provisioned alongside\n * the encounter form when encounter sync is enabled.\n */\n observationDataType?: EncounterSyncDataTypeSummary | null;\n /** Schema version of the observation form. Bumped on schema changes. */\n observationSchemaVersion?: number | null;\n /**\n * Observation-sync overlap window (days). Absorbs the gap between\n * ``effectiveDateTime`` (sample draw) and ``meta.lastUpdated``\n * (result release) on this practice. Read-only on the status\n * response until operator overrides land in a follow-up (see plan\n * §5 open questions).\n */\n observationOverlapDays: number;\n /**\n * Rolling floor for the observation cutoff (days). Used on first\n * sync or when overlap alone would drift too far back.\n */\n observationRollingLookbackDays: number;\n /** Full-sweep runtime state — last connection-wide sweep / manual backfill. */\n lastAttemptedAt?: string | null;\n lastSuccessfulAt?: string | null;\n lastStatus?: string | null;\n lastError?: string | null;\n /** Patient-refresh runtime state — last single-patient refresh outcome. */\n lastPatientRefreshAt?: string | null;\n lastPatientRefreshStatus?: string | null;\n lastPatientRefreshError?: string | null;\n}\n\n/**\n * Request to enable/disable encounter sync and configure freshness knobs.\n * All fields optional — server falls back to documented defaults.\n */\nexport interface UpdateEncounterSyncRequest {\n enabled: boolean;\n refreshTtlMinutes?: number;\n refreshLookbackDays?: number;\n readerLookbackDays?: number;\n manualBackfillLookbackDays?: number;\n postCreateWriteThroughEnabled?: boolean;\n postCreateVerificationEnabled?: boolean;\n postCreateVerificationDelayMinutes?: number;\n workflowStartAutomation?: WorkflowStartAutomation;\n /** @deprecated Legacy scheduler field (migration only). */\n initialLookbackDays?: number;\n /** @deprecated Legacy scheduler field (migration only). */\n rollingLookbackDays?: number;\n /** @deprecated Legacy scheduler field (migration only). */\n overlapDays?: number;\n /** @deprecated Legacy scheduler field (migration only). */\n cadenceHours?: number;\n}\n\n/**\n * Request to refresh a single linked patient's encounter cache on demand.\n */\nexport interface TriggerPatientRefreshRequest {\n memberId: number;\n patientId: string;\n lookbackDays?: number;\n /** When true, bypass the freshness TTL (operator-initiated repair). */\n force?: boolean;\n}\n\n/**\n * Request to run a manual connection-wide backfill across linked patients.\n */\nexport interface TriggerConnectionBackfillRequest {\n lookbackDays?: number;\n}\n\n/**\n * Response from the manual run endpoint.\n */\nexport interface EncounterSyncRunResponse {\n success: boolean;\n message: string;\n workflowId?: string | null;\n skipped?: boolean;\n}\n\n/**\n * PHI-safe encounter sync run history row.\n *\n * Derived from the shared ``sync_runs`` DynamoDB table filtered to\n * encounter-sync rows. Counts and sanitized reason codes only — never\n * patient names, encounter content, or other PHI.\n */\nexport interface EncounterSyncHistoryItem {\n runId: string;\n startedAt: string;\n completedAt?: string | null;\n status: string;\n source: string;\n /**\n * Run scope discriminator. \"patient_refresh\" = single-patient refresh,\n * \"full_sweep\" = connection-wide sweep / manual backfill. Null on rows\n * written before the journal started tagging run_kind; callers should\n * treat missing values as full-sweep (legacy default).\n */\n runKind?: string | null;\n total: number;\n synced: number;\n failed: number;\n skipped: number;\n errorMessage?: string | null;\n errors: string[];\n}\n","export enum CriterionType {\n EXPRESSION = 'expression',\n RUBRIC = 'rubric',\n}\n\nexport enum DriverMode {\n AUTO = 'auto',\n HUMAN = 'human',\n}\n\n// ===== Core types =====\n\nexport interface Qualification {\n id: number;\n uuid: string;\n workflowId: number;\n workflowName?: string | null;\n createdAt: string;\n updatedAt: string;\n}\n\n// ===== Scenario data records (keyed by data-type slug) =====\n\nexport interface ScenarioDataRecord {\n externalId?: string;\n fieldValues: Record<string, unknown>;\n}\n\n// ===== Scenario types =====\n\nexport interface Scenario {\n id: number;\n uuid: string;\n qualificationId: number;\n order: number;\n slug: string;\n name: string;\n description?: string | null;\n /** Persona driving the user side of the simulated conversation. */\n personaId?: number | null;\n personaName?: string | null;\n /** What the persona is trying to accomplish in this scenario. */\n goal?: string | null;\n /** Override the default web-chat channel (phone-voice, email, …). */\n channel?: string | null;\n /** Pre-seeded data records for the test member. */\n dataRecords?: Record<string, ScenarioDataRecord> | null;\n criteria: ScenarioCriterion[];\n archived: boolean;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface ScenarioCriterion {\n id: number;\n uuid: string;\n scenarioId: 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// ===== Test chat runs =====\n\nexport interface TestChatRun {\n id: number;\n uuid: string;\n /** Always set — runs are anchored to a workflow. */\n workflowId: number;\n /** NULL means ad-hoc (no scenario linkage, no grading). */\n scenarioId?: number | null;\n scenarioSlug?: string | null;\n scenarioName?: string | null;\n chatId?: number | null;\n assignmentId?: number | null;\n /** NULL = auto (LLM simulator drove). Set = a member drove manually. */\n driverMemberId?: number | null;\n driverMemberName?: string | null;\n startedAt: string;\n completedAt?: string | null;\n failedAt?: string | null;\n failureReason?: string | null;\n overallScore?: number | null;\n passed?: boolean | null;\n evaluatedAt?: string | null;\n criterionResults: CriterionResult[];\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface CriterionResult {\n id: number;\n testChatRunId: number;\n criterionId: number;\n criterionName?: string | null;\n criterionType?: CriterionType | null;\n passingThreshold?: number | null;\n score?: number | null;\n passed?: boolean | null;\n evaluationData?: Record<string, unknown> | null;\n createdAt: string;\n}\n\n// ===== Request types =====\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 CreateScenarioRequest {\n slug: string;\n name: string;\n description?: string;\n personaId?: number;\n goal?: string;\n channel?: string;\n dataRecords?: Record<string, ScenarioDataRecord>;\n order?: number;\n criteria?: CriterionInput[];\n}\n\nexport interface UpdateScenarioRequest {\n slug?: string;\n name?: string;\n description?: string;\n personaId?: number;\n goal?: string;\n channel?: string;\n dataRecords?: Record<string, ScenarioDataRecord>;\n order?: number;\n archived?: boolean;\n criteria?: CriterionInput[];\n}\n\n// ===== Persona types (workspace-scoped) =====\n\nexport interface Persona {\n id: number;\n uuid: string;\n name: string;\n description?: string | null;\n age?: number | null;\n hasPhone: boolean;\n hasEmail: boolean;\n memberRoleUuid?: string | null;\n identity?: string | null;\n /** Default data records seeded onto the test member whenever this\n * persona is used. Scenario-level ``dataRecords`` override per-slug. */\n dataRecords?: Record<string, ScenarioDataRecord> | null;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface CreatePersonaRequest {\n name: string;\n description?: string;\n age?: number;\n hasPhone?: boolean;\n hasEmail?: boolean;\n memberRoleUuid?: string | null;\n identity?: string;\n dataRecords?: Record<string, ScenarioDataRecord>;\n}\n\nexport interface UpdatePersonaRequest {\n name?: string;\n description?: string;\n age?: number;\n hasPhone?: boolean;\n hasEmail?: boolean;\n memberRoleUuid?: string | null;\n identity?: string;\n dataRecords?: Record<string, ScenarioDataRecord>;\n}\n\n// ===== Test chat run launcher =====\n\n/**\n * Start a test chat run on a workflow.\n *\n * With ``scenarioId``: the scenario's persona/goal/channel/data act as\n * defaults (overridable). The run is eligible for grading afterwards.\n *\n * Without ``scenarioId``: an ad-hoc run. ``personaId`` is required; the\n * run has no scenario linkage and cannot be evaluated.\n */\nexport interface StartTestChatRunRequest {\n scenarioId?: number;\n personaId?: number;\n goal?: string;\n channel?: string;\n dataRecords?: Record<string, ScenarioDataRecord>;\n driver?: DriverMode;\n}\n\nexport interface StartTestChatRunResponse {\n run: TestChatRun;\n testMemberId: number;\n driver: 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","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 UsageDashboardResponse,\n ClientWorkspace,\n NoticesResponse,\n Notification,\n PaginatedResponse,\n Product,\n PublicWorkspace,\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 items: WorkspaceScope[];\n categories: string[];\n}\n\nexport class WorkspacesApi extends BaseApiClient {\n /** List all workspaces accessible to the current user. */\n async getWorkspaces(): Promise<Workspace[]> {\n return this.fetch<Workspace[]>('w/');\n }\n\n /** List all publicly visible workspaces. */\n async getPublicWorkspaces(): Promise<PublicWorkspace[]> {\n return this.fetch<PublicWorkspace[]>('w/public');\n }\n\n /** Get a single workspace by ID. */\n async getWorkspace(wid: string): Promise<Workspace> {\n return this.fetch<Workspace>(`w/${wid}`);\n }\n\n /** Create a new workspace. */\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 /** Update an existing workspace. */\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 /** Delete a workspace. */\n async deleteWorkspace(wid: string): Promise<void> {\n return this.fetch(`w/${wid}`, {\n method: 'DELETE',\n });\n }\n\n /** Leave a workspace as the current user. */\n async leaveWorkspace(wid: string): Promise<{ message: string }> {\n return this.fetch<{ message: string }>(`w/${wid}/me`, {\n method: 'DELETE',\n });\n }\n\n /** Get the default settings for a workspace. */\n async getWorkspaceDefaults(wid: string): Promise<WorkspaceDefaults> {\n return this.fetch<WorkspaceDefaults>(`w/${wid}/defaults`);\n }\n\n /** Update the default settings for a workspace. */\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 /** Get entity counts (members, tasks, workflows, etc.) for a workspace. */\n async getWorkspaceCounts(wid: string): Promise<WorkspaceCounts> {\n return this.fetch<WorkspaceCounts>(`w/${wid}/counts`);\n }\n\n /** Check whether the workspace is currently within business hours. */\n async getBusinessHoursStatus(wid: string): Promise<{ isBusinessHours: boolean }> {\n return this.fetch<{ isBusinessHours: boolean }>(`w/${wid}/business-hours-status`);\n }\n\n /** List all available workspace feature flags from the registry. */\n async getAvailableWorkspaceFeatures(): Promise<WorkspaceFeatureInfo[]> {\n const result = await this.fetch<{ features: WorkspaceFeatureInfo[] }>(`features/registry`);\n return result.features;\n }\n\n /** Get active notices for a workspace. */\n async getWorkspaceNotices(wid: string): Promise<NoticesResponse> {\n return this.fetch<NoticesResponse>(`w/${wid}/notices`);\n }\n\n /** List notifications for the current user in a workspace. */\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 /** Get a single notification by ID. */\n async getNotification(wid: string, id: number): Promise<Notification> {\n return this.fetch<Notification>(`w/${wid}/notifications/${id}`);\n }\n\n /** Get the count of unread notifications for the current user. */\n async getUnreadNotificationCount(wid: string): Promise<number> {\n return this.fetch<number>(`w/${wid}/notifications/unread-count`);\n }\n\n /** Mark a notification as read. */\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 /** Dismiss a single notification. */\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 /** Dismiss all notifications for the current user in a workspace. */\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 /** Get the VAPID public key for Web Push subscription registration. */\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 /** Register a Web Push subscription for the current user. */\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 /** Unregister a Web Push subscription by endpoint URL. */\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 /** List all active Web Push subscriptions for the current user. */\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 /** List client workspaces managed by this reseller workspace, paginated. */\n async getResellerWorkspaces(\n wid: string,\n params?: { page?: number; pageSize?: number }\n ): Promise<PaginatedResponse<ClientWorkspace>> {\n const query = new URLSearchParams();\n if (params?.page !== undefined) query.set('page', String(params.page));\n if (params?.pageSize !== undefined) query.set('pageSize', String(params.pageSize));\n const qs = query.toString() ? `?${query.toString()}` : '';\n return this.fetch<PaginatedResponse<ClientWorkspace>>(`w/${wid}/reseller/workspaces${qs}`);\n }\n\n /** Create a new client workspace under a reseller workspace. */\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 /** Get a single client workspace by ID. */\n async getClientWorkspace(wid: string, workspaceId: number): Promise<ClientWorkspace> {\n return this.fetch<ClientWorkspace>(`w/${wid}/reseller/workspaces/${workspaceId}`);\n }\n\n /** Update a client workspace's name or slug. */\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 /** Delete a client workspace. */\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 /** Provision a client workspace, setting up its database and resources. */\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 /** List products available from a reseller workspace, optionally filtering by featured status. */\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 /** Get a product by ID using the global endpoint. */\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 /** List public products for a workspace's storefront. No auth required. */\n async getPublicProducts(workspaceUuid: string, featured?: boolean): Promise<Product[]> {\n const params = new URLSearchParams({ workspace_uuid: workspaceUuid });\n if (featured !== undefined) params.set('featured', String(featured));\n return this.fetch<Product[]>(`products?${params.toString()}`);\n }\n\n /** Get a publicly accessible product by ID. */\n async getPublicProduct(id: number): Promise<Product> {\n return this.fetch<Product>(`products/${id}`);\n }\n\n /** Create a new product for a reseller workspace. */\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 /** Update an existing product. */\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 /** Delete a product from a reseller workspace. */\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 Export/Import API\n\n /** Export workspace configuration, optionally scoped to a single workflow or workflows-only.\n * @param workflowId - Export a single workflow by ID\n * @param scope - Export scope (\"workflows\" for all workflows only). Cannot be combined with workflowId.\n * @param exclude - Comma-separated entity categories to exclude (e.g. \"channels\")\n */\n async exportWorkspace(\n wid: string,\n workflowId?: number,\n scope?: 'workflows',\n exclude?: string\n ): Promise<WorkspaceExportData> {\n const searchParams = new URLSearchParams();\n if (workflowId !== undefined) searchParams.set('workflow_id', String(workflowId));\n if (scope !== undefined) searchParams.set('scope', scope);\n if (exclude !== undefined) searchParams.set('exclude', exclude);\n const qs = searchParams.toString();\n return this.fetch<WorkspaceExportData>(`w/${wid}/export${qs ? `?${qs}` : ''}`);\n }\n\n /** Preview the result of importing workspace configuration without applying changes. */\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 /** Import workspace configuration from exported data. */\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 /** Preview a workspace import using the legacy untyped interface. */\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 /** List available themes for a workspace. */\n async getWorkspaceThemes(wid: string): Promise<ThemesListResponse> {\n return this.fetch<ThemesListResponse>(`w/${wid}/themes`);\n }\n\n /** Update the active themes for a workspace. */\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 getWorkspaceUsageDashboard.\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 getUsageDashboard(wid: string): Promise<UsageDashboardResponse> {\n return this.fetch<UsageDashboardResponse>(`w/${wid}/usage/dashboard`);\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 /** Enable deep thinking mode for the current session */\n deepThink?: boolean;\n\n /** Setup spec IDs linked to the current workspace that are pending execution. */\n pendingSetupSpecIds?: number[];\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 {\n AbilitiesApi,\n AccessGrantsApi,\n AgentJobsApi,\n AgentTasksApi,\n AgentsApi,\n AIModelsApi,\n ApiKeysApi,\n AppsApi,\n AssignmentsApi,\n AuthApi,\n BuildersApi,\n CalendarsApi,\n CallsApi,\n CELApi,\n ChatsApi,\n ConfluenceApi,\n ConnectionSyncApi,\n CustomToolkitsApi,\n DataTypesApi,\n DiscordBotsApi,\n SlackAppsApi,\n EventsApi,\n FeaturesApi,\n FhirConnectionsApi,\n HealthieApi,\n HubspotApi,\n FilesApi,\n InboxesApi,\n InquiriesApi,\n JourneysApi,\n AppConnectionsApi,\n McpServersApi,\n MembersApi,\n MilestonesApi,\n MondayIntegrationApi,\n NotificationRulesApi,\n OAuthApi,\n OperatorApi,\n OAuthConnectionsApi,\n PhoneNumbersApi,\n PronunciationsApi,\n PersonasApi,\n QualificationsApi,\n ReportsApi,\n SalesforceApi,\n SitesApi,\n SubscriptionsApi,\n SupervisorsApi,\n TasksApi,\n TemplatesApi,\n ToolkitsApi,\n WorkflowsApi,\n WorkspaceInvitationsApi,\n CustomersApi,\n ResellersApi,\n VoiceApi,\n WorkspacesApi,\n} from '../api';\nimport { PromptsApi } from '../api/prompts';\nimport { WorkflowNotesApi } from '../api/workflow-notes';\n\nexport interface ApiModules {\n abilities: AbilitiesApi;\n accessGrants: AccessGrantsApi;\n agentJobs: AgentJobsApi;\n agentTasks: AgentTasksApi;\n agents: AgentsApi;\n aiModels: AIModelsApi;\n apiKeys: ApiKeysApi;\n apps: AppsApi;\n assignments: AssignmentsApi;\n auth: AuthApi;\n builders: BuildersApi;\n calendars: CalendarsApi;\n calls: CallsApi;\n cel: CELApi;\n chats: ChatsApi;\n confluence: ConfluenceApi;\n customers: CustomersApi;\n resellers: ResellersApi;\n customToolkits: CustomToolkitsApi;\n dataTypes: DataTypesApi;\n discordBots: DiscordBotsApi;\n slackApps: SlackAppsApi;\n events: EventsApi;\n fhirConnections: FhirConnectionsApi;\n healthie: HealthieApi;\n hubspot: HubspotApi;\n features: FeaturesApi;\n files: FilesApi;\n inboxes: InboxesApi;\n inquiries: InquiriesApi;\n journeys: JourneysApi;\n appConnections: AppConnectionsApi;\n connectionSync: ConnectionSyncApi;\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 personas: PersonasApi;\n reports: ReportsApi;\n salesforce: SalesforceApi;\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 prompts: PromptsApi;\n voice: VoiceApi;\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 agentJobs: new AgentJobsApi(apiKey, baseUrl, customFetch),\n agentTasks: new AgentTasksApi(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 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 customers: new CustomersApi(apiKey, baseUrl, customFetch),\n resellers: new ResellersApi(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 healthie: new HealthieApi(apiKey, baseUrl, customFetch),\n hubspot: new HubspotApi(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 journeys: new JourneysApi(apiKey, baseUrl, customFetch),\n appConnections: new AppConnectionsApi(apiKey, baseUrl, customFetch),\n connectionSync: new ConnectionSyncApi(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 confluence: new ConfluenceApi(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 personas: new PersonasApi(apiKey, baseUrl, customFetch),\n reports: new ReportsApi(apiKey, baseUrl, customFetch),\n salesforce: new SalesforceApi(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 prompts: new PromptsApi(apiKey, baseUrl, customFetch),\n voice: new VoiceApi(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 { AgentJobsApi } from '../../api/agent-jobs';\n\nexport interface AgentJobsBindings {\n listAgentJobs: AgentJobsApi['listAgentJobs'];\n getAgentJob: AgentJobsApi['getAgentJob'];\n createAgentJob: AgentJobsApi['createAgentJob'];\n updateAgentJob: AgentJobsApi['updateAgentJob'];\n deleteAgentJob: AgentJobsApi['deleteAgentJob'];\n getAgentJobRuns: AgentJobsApi['getAgentJobRuns'];\n}\n\nexport function bindAgentJobsMethods(target: AgentJobsBindings, api: AgentJobsApi): void {\n target.listAgentJobs = api.listAgentJobs.bind(api);\n target.getAgentJob = api.getAgentJob.bind(api);\n target.createAgentJob = api.createAgentJob.bind(api);\n target.updateAgentJob = api.updateAgentJob.bind(api);\n target.deleteAgentJob = api.deleteAgentJob.bind(api);\n target.getAgentJobRuns = api.getAgentJobRuns.bind(api);\n}\n","import { AgentTasksApi } from '../../api/agent-tasks';\n\nexport interface AgentTasksBindings {\n getAgentTasks: AgentTasksApi['getAgentTasks'];\n getAgentTask: AgentTasksApi['getAgentTask'];\n cancelAgentTask: AgentTasksApi['cancelAgentTask'];\n getAgentTaskMessages: AgentTasksApi['getAgentTaskMessages'];\n}\n\nexport function bindAgentTasksMethods(target: AgentTasksBindings, api: AgentTasksApi): void {\n target.getAgentTasks = api.getAgentTasks.bind(api);\n target.getAgentTask = api.getAgentTask.bind(api);\n target.cancelAgentTask = api.cancelAgentTask.bind(api);\n target.getAgentTaskMessages = api.getAgentTaskMessages.bind(api);\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 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.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 getToolCallNames: ChatsApi['getToolCallNames'];\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 getChatPhoneCalls: ChatsApi['getChatPhoneCalls'];\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.getToolCallNames = chats.getToolCallNames.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 target.getChatPhoneCalls = chats.getChatPhoneCalls.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 // Member Memories\n getMemberMemories: MembersApi['getMemberMemories'];\n deleteMemberMemory: MembersApi['deleteMemberMemory'];\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 // Member Memories\n target.getMemberMemories = members.getMemberMemories.bind(members);\n target.deleteMemberMemory = members.deleteMemberMemory.bind(members);\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 getPublicProducts: WorkspacesApi['getPublicProducts'];\n getPublicProduct: WorkspacesApi['getPublicProduct'];\n createProduct: WorkspacesApi['createProduct'];\n updateProduct: WorkspacesApi['updateProduct'];\n deleteProduct: WorkspacesApi['deleteProduct'];\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 getUsageDashboard: WorkspacesApi['getUsageDashboard'];\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.getPublicProducts = workspaces.getPublicProducts.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.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.getUsageDashboard = workspaces.getUsageDashboard.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 // Consent (GDPR Art. 7(1))\n getConsentState: AuthApi['getConsentState'];\n updateConsent: AuthApi['updateConsent'];\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 // Consent (GDPR Art. 7(1))\n target.getConsentState = auth.getConsentState.bind(auth);\n target.updateConsent = auth.updateConsent.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 // Scoped Folders API\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 // Routines API\n getRoutines: EventsApi['getRoutines'];\n getRoutine: EventsApi['getRoutine'];\n createRoutine: EventsApi['createRoutine'];\n updateRoutine: EventsApi['updateRoutine'];\n deleteRoutine: EventsApi['deleteRoutine'];\n runRoutine: EventsApi['runRoutine'];\n getRoutineRuns: EventsApi['getRoutineRuns'];\n resetRoutineRuns: EventsApi['resetRoutineRuns'];\n previewSchedule: EventsApi['previewSchedule'];\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 // Routines API\n target.getRoutines = events.getRoutines.bind(events);\n target.getRoutine = events.getRoutine.bind(events);\n target.createRoutine = events.createRoutine.bind(events);\n target.updateRoutine = events.updateRoutine.bind(events);\n target.deleteRoutine = events.deleteRoutine.bind(events);\n target.runRoutine = events.runRoutine.bind(events);\n target.getRoutineRuns = events.getRoutineRuns.bind(events);\n target.resetRoutineRuns = events.resetRoutineRuns.bind(events);\n target.previewSchedule = events.previewSchedule.bind(events);\n}\n","import { WorkflowsApi } from '../../api';\nimport { WorkflowNotesApi } from '../../api/workflow-notes';\nimport { VoiceApi, 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 getWorkflowAccessValidation: WorkflowsApi['getWorkflowAccessValidation'];\n getWorkflowConfigValidation: WorkflowsApi['getWorkflowConfigValidation'];\n\n // Workflow Notes API\n getWorkflowNotes: WorkflowNotesApi['getWorkflowNotes'];\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 // Workflow Versions API\n getWorkflowVersions: WorkflowsApi['getWorkflowVersions'];\n getWorkflowVersionActive: WorkflowsApi['getWorkflowVersionActive'];\n getWorkflowVersion: WorkflowsApi['getWorkflowVersion'];\n publishWorkflowVersion: WorkflowsApi['publishWorkflowVersion'];\n updateWorkflowVersion: WorkflowsApi['updateWorkflowVersion'];\n activateWorkflowVersion: WorkflowsApi['activateWorkflowVersion'];\n deactivateWorkflowVersion: WorkflowsApi['deactivateWorkflowVersion'];\n diffWorkflowVersions: WorkflowsApi['diffWorkflowVersions'];\n\n // Workspace Builders API\n getWorkspaceBuilders: WorkflowsApi['getWorkspaceBuilders'];\n getWorkspaceBuilder: WorkflowsApi['getWorkspaceBuilder'];\n buildWorkspace: WorkflowsApi['buildWorkspace'];\n validateWorkflowName: WorkflowsApi['validateWorkflowName'];\n\n // Voice API\n previewTTS: VoiceApi['previewTTS'];\n previewThinkingSound: VoiceApi['previewThinkingSound'];\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 voice: VoiceApi,\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 target.getWorkflowAccessValidation = workflows.getWorkflowAccessValidation.bind(workflows);\n target.getWorkflowConfigValidation = workflows.getWorkflowConfigValidation.bind(workflows);\n\n // Workflow Notes API\n target.getWorkflowNotes = workflowNotes.getWorkflowNotes.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 // Workflow Versions API\n target.getWorkflowVersions = workflows.getWorkflowVersions.bind(workflows);\n target.getWorkflowVersionActive = workflows.getWorkflowVersionActive.bind(workflows);\n target.getWorkflowVersion = workflows.getWorkflowVersion.bind(workflows);\n target.publishWorkflowVersion = workflows.publishWorkflowVersion.bind(workflows);\n target.updateWorkflowVersion = workflows.updateWorkflowVersion.bind(workflows);\n target.activateWorkflowVersion = workflows.activateWorkflowVersion.bind(workflows);\n target.deactivateWorkflowVersion = workflows.deactivateWorkflowVersion.bind(workflows);\n target.diffWorkflowVersions = workflows.diffWorkflowVersions.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 // Voice API\n target.previewTTS = voice.previewTTS.bind(voice);\n target.previewThinkingSound = voice.previewThinkingSound.bind(voice);\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 getArchiveBlockers: PhoneNumbersApi['getArchiveBlockers'];\n archivePhoneNumber: PhoneNumbersApi['archivePhoneNumber'];\n getPhoneNumberCalls: PhoneNumbersApi['getPhoneNumberCalls'];\n getPhoneNumberMessages: PhoneNumbersApi['getPhoneNumberMessages'];\n getPhoneNumberVoicemails: PhoneNumbersApi['getPhoneNumberVoicemails'];\n fetchVoicemailAudio: PhoneNumbersApi['fetchVoicemailAudio'];\n updateVoicemailStatus: PhoneNumbersApi['updateVoicemailStatus'];\n searchAvailablePhoneNumbers: PhoneNumbersApi['searchAvailablePhoneNumbers'];\n purchasePhoneNumber: PhoneNumbersApi['purchasePhoneNumber'];\n releasePhoneNumber: PhoneNumbersApi['releasePhoneNumber'];\n getLinkablePhones: PhoneNumbersApi['getLinkablePhones'];\n linkPhoneNumber: PhoneNumbersApi['linkPhoneNumber'];\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.getArchiveBlockers = phoneNumbers.getArchiveBlockers.bind(phoneNumbers);\n target.archivePhoneNumber = phoneNumbers.archivePhoneNumber.bind(phoneNumbers);\n target.getPhoneNumberCalls = phoneNumbers.getPhoneNumberCalls.bind(phoneNumbers);\n target.getPhoneNumberMessages = phoneNumbers.getPhoneNumberMessages.bind(phoneNumbers);\n target.getPhoneNumberVoicemails = phoneNumbers.getPhoneNumberVoicemails.bind(phoneNumbers);\n target.fetchVoicemailAudio = phoneNumbers.fetchVoicemailAudio.bind(phoneNumbers);\n target.updateVoicemailStatus = phoneNumbers.updateVoicemailStatus.bind(phoneNumbers);\n target.searchAvailablePhoneNumbers = phoneNumbers.searchAvailablePhoneNumbers.bind(phoneNumbers);\n target.purchasePhoneNumber = phoneNumbers.purchasePhoneNumber.bind(phoneNumbers);\n target.releasePhoneNumber = phoneNumbers.releasePhoneNumber.bind(phoneNumbers);\n target.getLinkablePhones = phoneNumbers.getLinkablePhones.bind(phoneNumbers);\n target.linkPhoneNumber = phoneNumbers.linkPhoneNumber.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 getSTTModels: AIModelsApi['getSTTModels'];\n getTTSModels: AIModelsApi['getTTSModels'];\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 getPublicFeatureRegistry: FeaturesApi['getPublicFeatureRegistry'];\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.getSTTModels = aiModels.getSTTModels.bind(aiModels);\n target.getTTSModels = aiModels.getTTSModels.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.getPublicFeatureRegistry = features.getPublicFeatureRegistry.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 addWorkspaceToSubscription: SubscriptionsApi['addWorkspaceToSubscription'];\n purchaseCredits: SubscriptionsApi['purchaseCredits'];\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.addWorkspaceToSubscription = subscriptions.addWorkspaceToSubscription.bind(subscriptions);\n target.purchaseCredits = subscriptions.purchaseCredits.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 ConfluenceApi,\n ConnectionSyncApi,\n DiscordBotsApi,\n FhirConnectionsApi,\n HealthieApi,\n HubspotApi,\n AppConnectionsApi,\n MondayIntegrationApi,\n SalesforceApi,\n SlackAppsApi,\n} from '../../api';\n\nexport interface IntegrationsBindings {\n // Monday.com Integration API (workspace-scoped)\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 // Monday.com Connection API\n configureMondayConnection: MondayIntegrationApi['configureMondayConnection'];\n getMondayConnectionStatus: MondayIntegrationApi['getMondayConnectionStatus'];\n authorizeMondayConnection: MondayIntegrationApi['authorizeMondayConnection'];\n testMondayConnection: MondayIntegrationApi['testMondayConnection'];\n disconnectMondayConnection: MondayIntegrationApi['disconnectMondayConnection'];\n disableMondayConnection: MondayIntegrationApi['disableMondayConnection'];\n enableMondayConnection: MondayIntegrationApi['enableMondayConnection'];\n deleteMondayConnection: MondayIntegrationApi['deleteMondayConnection'];\n getMondayConnectionBoards: MondayIntegrationApi['getMondayConnectionBoards'];\n getMondayConnectionBoardColumns: MondayIntegrationApi['getMondayConnectionBoardColumns'];\n getMondayConnectionBoardGroups: MondayIntegrationApi['getMondayConnectionBoardGroups'];\n getMondaySyncConfig: MondayIntegrationApi['getMondaySyncConfig'];\n updateMondaySyncConfig: MondayIntegrationApi['updateMondaySyncConfig'];\n getLinkedMondayMembers: MondayIntegrationApi['getLinkedMondayMembers'];\n getMondayReconciliationMatches: MondayIntegrationApi['getMondayReconciliationMatches'];\n linkMemberToMonday: MondayIntegrationApi['linkMemberToMonday'];\n bulkLinkMembersToMonday: MondayIntegrationApi['bulkLinkMembersToMonday'];\n unlinkMemberFromMonday: MondayIntegrationApi['unlinkMemberFromMonday'];\n getLinkedRecords: MondayIntegrationApi['getLinkedRecords'];\n importFromBoard: MondayIntegrationApi['importFromBoard'];\n autoCreateDataTypeFromBoard: MondayIntegrationApi['autoCreateDataTypeFromBoard'];\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 fhirListLinkedMembers: FhirConnectionsApi['fhirListLinkedMembers'];\n fhirLinkMember: FhirConnectionsApi['fhirLinkMember'];\n fhirUnlinkMember: FhirConnectionsApi['fhirUnlinkMember'];\n fhirSyncMember: FhirConnectionsApi['fhirSyncMember'];\n fhirImportPatient: FhirConnectionsApi['fhirImportPatient'];\n fhirCsvImportInspect: FhirConnectionsApi['fhirCsvImportInspect'];\n fhirGetCsvImportSettings: FhirConnectionsApi['fhirGetCsvImportSettings'];\n fhirUpdateCsvImportSettings: FhirConnectionsApi['fhirUpdateCsvImportSettings'];\n fhirCsvImportApply: FhirConnectionsApi['fhirCsvImportApply'];\n fhirGetCsvImportRuns: FhirConnectionsApi['fhirGetCsvImportRuns'];\n fhirGetCsvImportRunItems: FhirConnectionsApi['fhirGetCsvImportRunItems'];\n fhirGetEncounterSyncStatus: FhirConnectionsApi['fhirGetEncounterSyncStatus'];\n fhirUpdateEncounterSync: FhirConnectionsApi['fhirUpdateEncounterSync'];\n fhirRunEncounterSync: FhirConnectionsApi['fhirRunEncounterSync'];\n fhirGetEncounterSyncRuns: FhirConnectionsApi['fhirGetEncounterSyncRuns'];\n fhirRefreshEncounterPatient: FhirConnectionsApi['fhirRefreshEncounterPatient'];\n fhirBackfillEncounterSync: FhirConnectionsApi['fhirBackfillEncounterSync'];\n\n // Healthie API\n configureHealthie: HealthieApi['configureHealthie'];\n getHealthieStatus: HealthieApi['getHealthieStatus'];\n listHealthieProviders: HealthieApi['listHealthieProviders'];\n linkCalendarToHealthie: HealthieApi['linkCalendarToHealthie'];\n unlinkCalendarFromHealthie: HealthieApi['unlinkCalendarFromHealthie'];\n syncCalendarWithHealthie: HealthieApi['syncCalendarWithHealthie'];\n getLinkedHealthieMembers: HealthieApi['getLinkedHealthieMembers'];\n getHealthieReconciliationMatches: HealthieApi['getHealthieReconciliationMatches'];\n linkMemberToHealthie: HealthieApi['linkMemberToHealthie'];\n unlinkMemberFromHealthie: HealthieApi['unlinkMemberFromHealthie'];\n\n // Confluence API\n configureConfluence: ConfluenceApi['configureConfluence'];\n startConfluenceOAuth: ConfluenceApi['startConfluenceOAuth'];\n getConfluenceStatus: ConfluenceApi['getConfluenceStatus'];\n disconnectConfluence: ConfluenceApi['disconnectConfluence'];\n disableConfluence: ConfluenceApi['disableConfluence'];\n enableConfluence: ConfluenceApi['enableConfluence'];\n deleteConfluence: ConfluenceApi['deleteConfluence'];\n listConfluenceSpaces: ConfluenceApi['listConfluenceSpaces'];\n listConfluencePages: ConfluenceApi['listConfluencePages'];\n\n // Salesforce API\n configureSalesforce: SalesforceApi['configureSalesforce'];\n startSalesforceOAuth: SalesforceApi['startSalesforceOAuth'];\n getSalesforceStatus: SalesforceApi['getSalesforceStatus'];\n disconnectSalesforce: SalesforceApi['disconnectSalesforce'];\n disableSalesforce: SalesforceApi['disableSalesforce'];\n enableSalesforce: SalesforceApi['enableSalesforce'];\n deleteSalesforce: SalesforceApi['deleteSalesforce'];\n getSalesforceReconciliationMatches: SalesforceApi['getSalesforceReconciliationMatches'];\n linkMemberToSalesforce: SalesforceApi['linkMemberToSalesforce'];\n bulkLinkMembersToSalesforce: SalesforceApi['bulkLinkMembersToSalesforce'];\n unlinkMemberFromSalesforce: SalesforceApi['unlinkMemberFromSalesforce'];\n getLinkedSalesforceMembers: SalesforceApi['getLinkedSalesforceMembers'];\n getSalesforceSyncConfig: SalesforceApi['getSalesforceSyncConfig'];\n updateSalesforceSyncConfig: SalesforceApi['updateSalesforceSyncConfig'];\n describeSalesforceObject: SalesforceApi['describeSalesforceObject'];\n searchSalesforceRecords: SalesforceApi['searchSalesforceRecords'];\n importSalesforceMembers: SalesforceApi['importSalesforceMembers'];\n\n // HubSpot API\n configureHubspot: HubspotApi['configureHubspot'];\n startHubspotOAuth: HubspotApi['startHubspotOAuth'];\n getHubspotStatus: HubspotApi['getHubspotStatus'];\n disconnectHubspot: HubspotApi['disconnectHubspot'];\n disableHubspot: HubspotApi['disableHubspot'];\n enableHubspot: HubspotApi['enableHubspot'];\n deleteHubspot: HubspotApi['deleteHubspot'];\n getHubspotReconciliationMatches: HubspotApi['getHubspotReconciliationMatches'];\n linkMemberToHubspot: HubspotApi['linkMemberToHubspot'];\n bulkLinkMembersToHubspot: HubspotApi['bulkLinkMembersToHubspot'];\n unlinkMemberFromHubspot: HubspotApi['unlinkMemberFromHubspot'];\n getLinkedHubspotMembers: HubspotApi['getLinkedHubspotMembers'];\n searchHubspotRecords: HubspotApi['searchHubspotRecords'];\n importHubspotMembers: HubspotApi['importHubspotMembers'];\n getHubspotContactProperties: HubspotApi['getHubspotContactProperties'];\n getHubspotManagedRules: HubspotApi['getHubspotManagedRules'];\n getHubspotSyncLogs: HubspotApi['getHubspotSyncLogs'];\n getHubspotTransformPresets: HubspotApi['getHubspotTransformPresets'];\n\n // Connection Sync API (generic, works with any sync-capable connection)\n getConnectionSyncCapabilities: ConnectionSyncApi['getConnectionSyncCapabilities'];\n getConnectionSyncConfig: ConnectionSyncApi['getConnectionSyncConfig'];\n updateConnectionSyncConfig: ConnectionSyncApi['updateConnectionSyncConfig'];\n getConnectionSyncCheckpoint: ConnectionSyncApi['getConnectionSyncCheckpoint'];\n startSyncRun: ConnectionSyncApi['startSyncRun'];\n getSyncRuns: ConnectionSyncApi['getSyncRuns'];\n getSyncRunItems: ConnectionSyncApi['getSyncRunItems'];\n getMemberSyncSummary: ConnectionSyncApi['getMemberSyncSummary'];\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 healthie: HealthieApi,\n salesforce: SalesforceApi,\n hubspot: HubspotApi,\n appConnections: AppConnectionsApi,\n connectionSync: ConnectionSyncApi,\n confluence: ConfluenceApi\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 // Monday.com Connection API\n target.configureMondayConnection =\n mondayIntegration.configureMondayConnection.bind(mondayIntegration);\n target.getMondayConnectionStatus =\n mondayIntegration.getMondayConnectionStatus.bind(mondayIntegration);\n target.authorizeMondayConnection =\n mondayIntegration.authorizeMondayConnection.bind(mondayIntegration);\n target.testMondayConnection = mondayIntegration.testMondayConnection.bind(mondayIntegration);\n target.disconnectMondayConnection =\n mondayIntegration.disconnectMondayConnection.bind(mondayIntegration);\n target.disableMondayConnection =\n mondayIntegration.disableMondayConnection.bind(mondayIntegration);\n target.enableMondayConnection = mondayIntegration.enableMondayConnection.bind(mondayIntegration);\n target.deleteMondayConnection = mondayIntegration.deleteMondayConnection.bind(mondayIntegration);\n target.getMondayConnectionBoards =\n mondayIntegration.getMondayConnectionBoards.bind(mondayIntegration);\n target.getMondayConnectionBoardColumns =\n mondayIntegration.getMondayConnectionBoardColumns.bind(mondayIntegration);\n target.getMondayConnectionBoardGroups =\n mondayIntegration.getMondayConnectionBoardGroups.bind(mondayIntegration);\n target.getMondaySyncConfig = mondayIntegration.getMondaySyncConfig.bind(mondayIntegration);\n target.updateMondaySyncConfig = mondayIntegration.updateMondaySyncConfig.bind(mondayIntegration);\n target.getLinkedMondayMembers = mondayIntegration.getLinkedMondayMembers.bind(mondayIntegration);\n target.getMondayReconciliationMatches =\n mondayIntegration.getMondayReconciliationMatches.bind(mondayIntegration);\n target.linkMemberToMonday = mondayIntegration.linkMemberToMonday.bind(mondayIntegration);\n target.bulkLinkMembersToMonday =\n mondayIntegration.bulkLinkMembersToMonday.bind(mondayIntegration);\n target.unlinkMemberFromMonday = mondayIntegration.unlinkMemberFromMonday.bind(mondayIntegration);\n target.getLinkedRecords = mondayIntegration.getLinkedRecords.bind(mondayIntegration);\n target.importFromBoard = mondayIntegration.importFromBoard.bind(mondayIntegration);\n target.autoCreateDataTypeFromBoard =\n mondayIntegration.autoCreateDataTypeFromBoard.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 target.fhirListLinkedMembers = fhirConnections.fhirListLinkedMembers.bind(fhirConnections);\n target.fhirLinkMember = fhirConnections.fhirLinkMember.bind(fhirConnections);\n target.fhirUnlinkMember = fhirConnections.fhirUnlinkMember.bind(fhirConnections);\n target.fhirSyncMember = fhirConnections.fhirSyncMember.bind(fhirConnections);\n target.fhirImportPatient = fhirConnections.fhirImportPatient.bind(fhirConnections);\n target.fhirCsvImportInspect = fhirConnections.fhirCsvImportInspect.bind(fhirConnections);\n target.fhirGetCsvImportSettings = fhirConnections.fhirGetCsvImportSettings.bind(fhirConnections);\n target.fhirUpdateCsvImportSettings =\n fhirConnections.fhirUpdateCsvImportSettings.bind(fhirConnections);\n target.fhirCsvImportApply = fhirConnections.fhirCsvImportApply.bind(fhirConnections);\n target.fhirGetCsvImportRuns = fhirConnections.fhirGetCsvImportRuns.bind(fhirConnections);\n target.fhirGetCsvImportRunItems = fhirConnections.fhirGetCsvImportRunItems.bind(fhirConnections);\n target.fhirGetEncounterSyncStatus =\n fhirConnections.fhirGetEncounterSyncStatus.bind(fhirConnections);\n target.fhirUpdateEncounterSync = fhirConnections.fhirUpdateEncounterSync.bind(fhirConnections);\n target.fhirRunEncounterSync = fhirConnections.fhirRunEncounterSync.bind(fhirConnections);\n target.fhirGetEncounterSyncRuns = fhirConnections.fhirGetEncounterSyncRuns.bind(fhirConnections);\n target.fhirRefreshEncounterPatient =\n fhirConnections.fhirRefreshEncounterPatient.bind(fhirConnections);\n target.fhirBackfillEncounterSync =\n fhirConnections.fhirBackfillEncounterSync.bind(fhirConnections);\n\n // Healthie API\n target.configureHealthie = healthie.configureHealthie.bind(healthie);\n target.getHealthieStatus = healthie.getHealthieStatus.bind(healthie);\n target.listHealthieProviders = healthie.listHealthieProviders.bind(healthie);\n target.linkCalendarToHealthie = healthie.linkCalendarToHealthie.bind(healthie);\n target.unlinkCalendarFromHealthie = healthie.unlinkCalendarFromHealthie.bind(healthie);\n target.syncCalendarWithHealthie = healthie.syncCalendarWithHealthie.bind(healthie);\n target.getLinkedHealthieMembers = healthie.getLinkedHealthieMembers.bind(healthie);\n target.getHealthieReconciliationMatches =\n healthie.getHealthieReconciliationMatches.bind(healthie);\n target.linkMemberToHealthie = healthie.linkMemberToHealthie.bind(healthie);\n target.unlinkMemberFromHealthie = healthie.unlinkMemberFromHealthie.bind(healthie);\n\n // Confluence API\n target.configureConfluence = confluence.configureConfluence.bind(confluence);\n target.startConfluenceOAuth = confluence.startConfluenceOAuth.bind(confluence);\n target.getConfluenceStatus = confluence.getConfluenceStatus.bind(confluence);\n target.disconnectConfluence = confluence.disconnectConfluence.bind(confluence);\n target.disableConfluence = confluence.disableConfluence.bind(confluence);\n target.enableConfluence = confluence.enableConfluence.bind(confluence);\n target.deleteConfluence = confluence.deleteConfluence.bind(confluence);\n target.listConfluenceSpaces = confluence.listConfluenceSpaces.bind(confluence);\n target.listConfluencePages = confluence.listConfluencePages.bind(confluence);\n\n // Salesforce API\n target.configureSalesforce = salesforce.configureSalesforce.bind(salesforce);\n target.startSalesforceOAuth = salesforce.startSalesforceOAuth.bind(salesforce);\n target.getSalesforceStatus = salesforce.getSalesforceStatus.bind(salesforce);\n target.disconnectSalesforce = salesforce.disconnectSalesforce.bind(salesforce);\n target.disableSalesforce = salesforce.disableSalesforce.bind(salesforce);\n target.enableSalesforce = salesforce.enableSalesforce.bind(salesforce);\n target.deleteSalesforce = salesforce.deleteSalesforce.bind(salesforce);\n target.getSalesforceReconciliationMatches =\n salesforce.getSalesforceReconciliationMatches.bind(salesforce);\n target.linkMemberToSalesforce = salesforce.linkMemberToSalesforce.bind(salesforce);\n target.bulkLinkMembersToSalesforce = salesforce.bulkLinkMembersToSalesforce.bind(salesforce);\n target.unlinkMemberFromSalesforce = salesforce.unlinkMemberFromSalesforce.bind(salesforce);\n target.getLinkedSalesforceMembers = salesforce.getLinkedSalesforceMembers.bind(salesforce);\n target.getSalesforceSyncConfig = salesforce.getSalesforceSyncConfig.bind(salesforce);\n target.updateSalesforceSyncConfig = salesforce.updateSalesforceSyncConfig.bind(salesforce);\n target.describeSalesforceObject = salesforce.describeSalesforceObject.bind(salesforce);\n target.searchSalesforceRecords = salesforce.searchSalesforceRecords.bind(salesforce);\n target.importSalesforceMembers = salesforce.importSalesforceMembers.bind(salesforce);\n\n // HubSpot API\n target.configureHubspot = hubspot.configureHubspot.bind(hubspot);\n target.startHubspotOAuth = hubspot.startHubspotOAuth.bind(hubspot);\n target.getHubspotStatus = hubspot.getHubspotStatus.bind(hubspot);\n target.disconnectHubspot = hubspot.disconnectHubspot.bind(hubspot);\n target.disableHubspot = hubspot.disableHubspot.bind(hubspot);\n target.enableHubspot = hubspot.enableHubspot.bind(hubspot);\n target.deleteHubspot = hubspot.deleteHubspot.bind(hubspot);\n target.getHubspotReconciliationMatches = hubspot.getHubspotReconciliationMatches.bind(hubspot);\n target.linkMemberToHubspot = hubspot.linkMemberToHubspot.bind(hubspot);\n target.bulkLinkMembersToHubspot = hubspot.bulkLinkMembersToHubspot.bind(hubspot);\n target.unlinkMemberFromHubspot = hubspot.unlinkMemberFromHubspot.bind(hubspot);\n target.getLinkedHubspotMembers = hubspot.getLinkedHubspotMembers.bind(hubspot);\n target.searchHubspotRecords = hubspot.searchHubspotRecords.bind(hubspot);\n target.importHubspotMembers = hubspot.importHubspotMembers.bind(hubspot);\n target.getHubspotContactProperties = hubspot.getHubspotContactProperties.bind(hubspot);\n target.getHubspotManagedRules = hubspot.getHubspotManagedRules.bind(hubspot);\n target.getHubspotSyncLogs = hubspot.getHubspotSyncLogs.bind(hubspot);\n target.getHubspotTransformPresets = hubspot.getHubspotTransformPresets.bind(hubspot);\n\n // Connection Sync API\n target.getConnectionSyncCapabilities =\n connectionSync.getConnectionSyncCapabilities.bind(connectionSync);\n target.getConnectionSyncConfig = connectionSync.getConnectionSyncConfig.bind(connectionSync);\n target.updateConnectionSyncConfig =\n connectionSync.updateConnectionSyncConfig.bind(connectionSync);\n target.getConnectionSyncCheckpoint =\n connectionSync.getConnectionSyncCheckpoint.bind(connectionSync);\n target.startSyncRun = connectionSync.startSyncRun.bind(connectionSync);\n target.getSyncRuns = connectionSync.getSyncRuns.bind(connectionSync);\n target.getSyncRunItems = connectionSync.getSyncRunItems.bind(connectionSync);\n target.getMemberSyncSummary = connectionSync.getMemberSyncSummary.bind(connectionSync);\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 { JourneysApi } from '../../api';\n\nexport interface JourneysBindings {\n getJourneys: JourneysApi['getJourneys'];\n getJourney: JourneysApi['getJourney'];\n createJourney: JourneysApi['createJourney'];\n updateJourney: JourneysApi['updateJourney'];\n archiveJourney: JourneysApi['archiveJourney'];\n createStep: JourneysApi['createStep'];\n updateStep: JourneysApi['updateStep'];\n archiveStep: JourneysApi['archiveStep'];\n createConnection: JourneysApi['createConnection'];\n updateConnection: JourneysApi['updateConnection'];\n deleteConnection: JourneysApi['deleteConnection'];\n createGoal: JourneysApi['createGoal'];\n updateGoal: JourneysApi['updateGoal'];\n deleteGoal: JourneysApi['deleteGoal'];\n getJourneyMembers: JourneysApi['getJourneyMembers'];\n enrollMembers: JourneysApi['enrollMembers'];\n unenrollMembers: JourneysApi['unenrollMembers'];\n reenrollMember: JourneysApi['reenrollMember'];\n deleteEnrollment: JourneysApi['deleteEnrollment'];\n getMemberJourneys: JourneysApi['getMemberJourneys'];\n getJourneyNotes: JourneysApi['getJourneyNotes'];\n createJourneyNote: JourneysApi['createJourneyNote'];\n updateJourneyNote: JourneysApi['updateJourneyNote'];\n deleteJourneyNote: JourneysApi['deleteJourneyNote'];\n}\n\nexport function bindJourneysMethods(target: JourneysBindings, journeys: JourneysApi): void {\n target.getJourneys = journeys.getJourneys.bind(journeys);\n target.getJourney = journeys.getJourney.bind(journeys);\n target.createJourney = journeys.createJourney.bind(journeys);\n target.updateJourney = journeys.updateJourney.bind(journeys);\n target.archiveJourney = journeys.archiveJourney.bind(journeys);\n target.createStep = journeys.createStep.bind(journeys);\n target.updateStep = journeys.updateStep.bind(journeys);\n target.archiveStep = journeys.archiveStep.bind(journeys);\n target.createConnection = journeys.createConnection.bind(journeys);\n target.updateConnection = journeys.updateConnection.bind(journeys);\n target.deleteConnection = journeys.deleteConnection.bind(journeys);\n target.createGoal = journeys.createGoal.bind(journeys);\n target.updateGoal = journeys.updateGoal.bind(journeys);\n target.deleteGoal = journeys.deleteGoal.bind(journeys);\n target.getJourneyMembers = journeys.getJourneyMembers.bind(journeys);\n target.enrollMembers = journeys.enrollMembers.bind(journeys);\n target.unenrollMembers = journeys.unenrollMembers.bind(journeys);\n target.reenrollMember = journeys.reenrollMember.bind(journeys);\n target.deleteEnrollment = journeys.deleteEnrollment.bind(journeys);\n target.getMemberJourneys = journeys.getMemberJourneys.bind(journeys);\n target.getJourneyNotes = journeys.getJourneyNotes.bind(journeys);\n target.createJourneyNote = journeys.createJourneyNote.bind(journeys);\n target.updateJourneyNote = journeys.updateJourneyNote.bind(journeys);\n target.deleteJourneyNote = journeys.deleteJourneyNote.bind(journeys);\n}\n","import { QualificationsApi } from '../../api';\n\nexport interface QualificationsBindings {\n getQualifications: QualificationsApi['getQualifications'];\n getQualification: QualificationsApi['getQualification'];\n getOrCreateQualificationForWorkflow: QualificationsApi['getOrCreateQualificationForWorkflow'];\n // Scenarios\n listScenarios: QualificationsApi['listScenarios'];\n createScenario: QualificationsApi['createScenario'];\n getScenario: QualificationsApi['getScenario'];\n updateScenario: QualificationsApi['updateScenario'];\n deleteScenario: QualificationsApi['deleteScenario'];\n // Test chat runs\n listTestChatRuns: QualificationsApi['listTestChatRuns'];\n getTestChatRun: QualificationsApi['getTestChatRun'];\n startTestChatRun: QualificationsApi['startTestChatRun'];\n evaluateTestChatRun: QualificationsApi['evaluateTestChatRun'];\n endTestChatRun: QualificationsApi['endTestChatRun'];\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.getOrCreateQualificationForWorkflow =\n qualifications.getOrCreateQualificationForWorkflow.bind(qualifications);\n // Scenarios\n target.listScenarios = qualifications.listScenarios.bind(qualifications);\n target.createScenario = qualifications.createScenario.bind(qualifications);\n target.getScenario = qualifications.getScenario.bind(qualifications);\n target.updateScenario = qualifications.updateScenario.bind(qualifications);\n target.deleteScenario = qualifications.deleteScenario.bind(qualifications);\n // Test chat runs\n target.listTestChatRuns = qualifications.listTestChatRuns.bind(qualifications);\n target.getTestChatRun = qualifications.getTestChatRun.bind(qualifications);\n target.startTestChatRun = qualifications.startTestChatRun.bind(qualifications);\n target.evaluateTestChatRun = qualifications.evaluateTestChatRun.bind(qualifications);\n target.endTestChatRun = qualifications.endTestChatRun.bind(qualifications);\n}\n","import { PersonasApi } from '../../api';\n\nexport interface PersonasBindings {\n listPersonas: PersonasApi['listPersonas'];\n getPersona: PersonasApi['getPersona'];\n createPersona: PersonasApi['createPersona'];\n updatePersona: PersonasApi['updatePersona'];\n deletePersona: PersonasApi['deletePersona'];\n}\n\nexport function bindPersonasMethods(target: PersonasBindings, personas: PersonasApi): void {\n target.listPersonas = personas.listPersonas.bind(personas);\n target.getPersona = personas.getPersona.bind(personas);\n target.createPersona = personas.createPersona.bind(personas);\n target.updatePersona = personas.updatePersona.bind(personas);\n target.deletePersona = personas.deletePersona.bind(personas);\n}\n","import { CustomersApi } from '../../api';\n\nexport interface CustomersBindings {\n getMyCustomers: CustomersApi['getMyCustomers'];\n getMyCustomer: CustomersApi['getMyCustomer'];\n getMyCustomerAccounts: CustomersApi['getMyCustomerAccounts'];\n getMyCustomerSubscriptions: CustomersApi['getMyCustomerSubscriptions'];\n getMyCustomerInvoices: CustomersApi['getMyCustomerInvoices'];\n updateMyCustomer: CustomersApi['updateMyCustomer'];\n createMyCustomerSetupIntent: CustomersApi['createMyCustomerSetupIntent'];\n getMyCustomerPaymentMethods: CustomersApi['getMyCustomerPaymentMethods'];\n attachMyCustomerPaymentMethod: CustomersApi['attachMyCustomerPaymentMethod'];\n detachMyCustomerPaymentMethod: CustomersApi['detachMyCustomerPaymentMethod'];\n setDefaultMyCustomerPaymentMethod: CustomersApi['setDefaultMyCustomerPaymentMethod'];\n}\n\nexport function bindCustomersMethods(target: CustomersBindings, customers: CustomersApi): void {\n target.getMyCustomers = customers.getMyCustomers.bind(customers);\n target.getMyCustomer = customers.getMyCustomer.bind(customers);\n target.getMyCustomerAccounts = customers.getMyCustomerAccounts.bind(customers);\n target.getMyCustomerSubscriptions = customers.getMyCustomerSubscriptions.bind(customers);\n target.getMyCustomerInvoices = customers.getMyCustomerInvoices.bind(customers);\n target.updateMyCustomer = customers.updateMyCustomer.bind(customers);\n target.createMyCustomerSetupIntent = customers.createMyCustomerSetupIntent.bind(customers);\n target.getMyCustomerPaymentMethods = customers.getMyCustomerPaymentMethods.bind(customers);\n target.attachMyCustomerPaymentMethod = customers.attachMyCustomerPaymentMethod.bind(customers);\n target.detachMyCustomerPaymentMethod = customers.detachMyCustomerPaymentMethod.bind(customers);\n target.setDefaultMyCustomerPaymentMethod =\n customers.setDefaultMyCustomerPaymentMethod.bind(customers);\n}\n","import { ResellersApi } from '../../api';\n\nexport interface ResellersBindings {\n getMyResellers: ResellersApi['getMyResellers'];\n getMyReseller: ResellersApi['getMyReseller'];\n getMyResellerAccounts: ResellersApi['getMyResellerAccounts'];\n getMyResellerProducts: ResellersApi['getMyResellerProducts'];\n getMyResellerSubscriptions: ResellersApi['getMyResellerSubscriptions'];\n updateMyReseller: ResellersApi['updateMyReseller'];\n}\n\nexport function bindResellersMethods(target: ResellersBindings, resellers: ResellersApi): void {\n target.getMyResellers = resellers.getMyResellers.bind(resellers);\n target.getMyReseller = resellers.getMyReseller.bind(resellers);\n target.getMyResellerAccounts = resellers.getMyResellerAccounts.bind(resellers);\n target.getMyResellerProducts = resellers.getMyResellerProducts.bind(resellers);\n target.getMyResellerSubscriptions = resellers.getMyResellerSubscriptions.bind(resellers);\n target.updateMyReseller = resellers.updateMyReseller.bind(resellers);\n}\n","import { PromptsApi } from '../../api/prompts';\n\nexport interface PromptsBindings {\n inspectPrompt: PromptsApi['inspectPrompt'];\n}\n\nexport function bindPromptsMethods(target: PromptsBindings, prompts: PromptsApi): void {\n target.inspectPrompt = prompts.inspectPrompt.bind(prompts);\n}\n","import { WorkspaceInvitationsApi } from '../api';\nimport { EnhancedAuthHandler, OrgAuthHandler } from '../api/base';\nimport { ApiModules, createApiModules } from './api-modules';\nimport {\n AccessGrantsBindings,\n AgentJobsBindings,\n AgentTasksBindings,\n AgentsBindings,\n AppsBindings,\n AuthBindings,\n BillingBindings,\n CalendarsBindings,\n CallsBindings,\n ChatsBindings,\n CommunicationsBindings,\n CustomersBindings,\n ResellersBindings,\n DataTypesBindings,\n EventsBindings,\n FilesBindings,\n IntegrationsBindings,\n JourneysBindings,\n bindJourneysMethods,\n MembersBindings,\n OperatorBindings,\n PronunciationsBindings,\n QualificationsBindings,\n PersonasBindings,\n bindPronunciationsMethods,\n SitesBindings,\n TasksBindings,\n ToolkitsBindings,\n WorkflowsBindings,\n WorkspacesBindings,\n bindAccessGrantsMethods,\n bindAgentJobsMethods,\n bindAgentTasksMethods,\n bindAgentsMethods,\n bindAppsMethods,\n bindAuthMethods,\n bindBillingMethods,\n bindCalendarsMethods,\n bindCallsMethods,\n bindChatsMethods,\n bindCommunicationsMethods,\n bindCustomersMethods,\n bindResellersMethods,\n bindDataTypesMethods,\n bindEventsMethods,\n bindFilesMethods,\n bindIntegrationsMethods,\n bindMembersMethods,\n bindOperatorMethods,\n bindQualificationsMethods,\n bindPersonasMethods,\n bindSitesMethods,\n bindTasksMethods,\n bindToolkitsMethods,\n bindWorkflowsMethods,\n bindWorkspacesMethods,\n PromptsBindings,\n bindPromptsMethods,\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. The full client including\n * admin functionality (`ApiClient`) lives in the private `@gravity-rail/client`\n * package and extends this class.\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 AgentJobsBindings,\n AgentTasksBindings,\n AgentsBindings,\n PronunciationsBindings,\n QualificationsBindings,\n PersonasBindings,\n CustomersBindings,\n ResellersBindings,\n JourneysBindings,\n OperatorBindings,\n AccessGrantsBindings,\n PromptsBindings\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 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 getToolCallNames!: ChatsBindings['getToolCallNames'];\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 getChatPhoneCalls!: ChatsBindings['getChatPhoneCalls'];\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 // Member Memories\n getMemberMemories!: MembersBindings['getMemberMemories'];\n deleteMemberMemory!: MembersBindings['deleteMemberMemory'];\n\n // Agent Jobs API\n listAgentJobs!: AgentJobsBindings['listAgentJobs'];\n getAgentJob!: AgentJobsBindings['getAgentJob'];\n createAgentJob!: AgentJobsBindings['createAgentJob'];\n updateAgentJob!: AgentJobsBindings['updateAgentJob'];\n deleteAgentJob!: AgentJobsBindings['deleteAgentJob'];\n getAgentJobRuns!: AgentJobsBindings['getAgentJobRuns'];\n\n // Agent Tasks API (operator-facing async sub-agent inspection/cancel)\n getAgentTasks!: AgentTasksBindings['getAgentTasks'];\n getAgentTask!: AgentTasksBindings['getAgentTask'];\n cancelAgentTask!: AgentTasksBindings['cancelAgentTask'];\n getAgentTaskMessages!: AgentTasksBindings['getAgentTaskMessages'];\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 getOrCreateQualificationForWorkflow!: QualificationsBindings['getOrCreateQualificationForWorkflow'];\n listScenarios!: QualificationsBindings['listScenarios'];\n createScenario!: QualificationsBindings['createScenario'];\n getScenario!: QualificationsBindings['getScenario'];\n updateScenario!: QualificationsBindings['updateScenario'];\n deleteScenario!: QualificationsBindings['deleteScenario'];\n listTestChatRuns!: QualificationsBindings['listTestChatRuns'];\n getTestChatRun!: QualificationsBindings['getTestChatRun'];\n startTestChatRun!: QualificationsBindings['startTestChatRun'];\n evaluateTestChatRun!: QualificationsBindings['evaluateTestChatRun'];\n endTestChatRun!: QualificationsBindings['endTestChatRun'];\n\n // Personas API (workspace-scoped test-identity templates)\n listPersonas!: PersonasBindings['listPersonas'];\n getPersona!: PersonasBindings['getPersona'];\n createPersona!: PersonasBindings['createPersona'];\n updatePersona!: PersonasBindings['updatePersona'];\n deletePersona!: PersonasBindings['deletePersona'];\n\n // Journeys API\n getJourneys!: JourneysBindings['getJourneys'];\n getJourney!: JourneysBindings['getJourney'];\n createJourney!: JourneysBindings['createJourney'];\n updateJourney!: JourneysBindings['updateJourney'];\n archiveJourney!: JourneysBindings['archiveJourney'];\n createStep!: JourneysBindings['createStep'];\n updateStep!: JourneysBindings['updateStep'];\n archiveStep!: JourneysBindings['archiveStep'];\n createConnection!: JourneysBindings['createConnection'];\n updateConnection!: JourneysBindings['updateConnection'];\n deleteConnection!: JourneysBindings['deleteConnection'];\n createGoal!: JourneysBindings['createGoal'];\n updateGoal!: JourneysBindings['updateGoal'];\n deleteGoal!: JourneysBindings['deleteGoal'];\n getJourneyMembers!: JourneysBindings['getJourneyMembers'];\n enrollMembers!: JourneysBindings['enrollMembers'];\n unenrollMembers!: JourneysBindings['unenrollMembers'];\n reenrollMember!: JourneysBindings['reenrollMember'];\n deleteEnrollment!: JourneysBindings['deleteEnrollment'];\n getMemberJourneys!: JourneysBindings['getMemberJourneys'];\n getJourneyNotes!: JourneysBindings['getJourneyNotes'];\n createJourneyNote!: JourneysBindings['createJourneyNote'];\n updateJourneyNote!: JourneysBindings['updateJourneyNote'];\n deleteJourneyNote!: JourneysBindings['deleteJourneyNote'];\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 // Prompts API\n inspectPrompt!: PromptsBindings['inspectPrompt'];\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 getPublicProducts!: WorkspacesBindings['getPublicProducts'];\n getPublicProduct!: WorkspacesBindings['getPublicProduct'];\n createProduct!: WorkspacesBindings['createProduct'];\n updateProduct!: WorkspacesBindings['updateProduct'];\n deleteProduct!: WorkspacesBindings['deleteProduct'];\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 getUsageDashboard!: WorkspacesBindings['getUsageDashboard'];\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 getConsentState!: AuthBindings['getConsentState'];\n updateConsent!: AuthBindings['updateConsent'];\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 getRoutines!: EventsBindings['getRoutines'];\n getRoutine!: EventsBindings['getRoutine'];\n createRoutine!: EventsBindings['createRoutine'];\n updateRoutine!: EventsBindings['updateRoutine'];\n deleteRoutine!: EventsBindings['deleteRoutine'];\n runRoutine!: EventsBindings['runRoutine'];\n getRoutineRuns!: EventsBindings['getRoutineRuns'];\n resetRoutineRuns!: EventsBindings['resetRoutineRuns'];\n previewSchedule!: EventsBindings['previewSchedule'];\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 getWorkflowAccessValidation!: WorkflowsBindings['getWorkflowAccessValidation'];\n getWorkflowConfigValidation!: WorkflowsBindings['getWorkflowConfigValidation'];\n getWorkflowNotes!: WorkflowsBindings['getWorkflowNotes'];\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 getWorkflowVersions!: WorkflowsBindings['getWorkflowVersions'];\n getWorkflowVersionActive!: WorkflowsBindings['getWorkflowVersionActive'];\n getWorkflowVersion!: WorkflowsBindings['getWorkflowVersion'];\n publishWorkflowVersion!: WorkflowsBindings['publishWorkflowVersion'];\n updateWorkflowVersion!: WorkflowsBindings['updateWorkflowVersion'];\n activateWorkflowVersion!: WorkflowsBindings['activateWorkflowVersion'];\n deactivateWorkflowVersion!: WorkflowsBindings['deactivateWorkflowVersion'];\n diffWorkflowVersions!: WorkflowsBindings['diffWorkflowVersions'];\n getWorkspaceBuilders!: WorkflowsBindings['getWorkspaceBuilders'];\n getWorkspaceBuilder!: WorkflowsBindings['getWorkspaceBuilder'];\n buildWorkspace!: WorkflowsBindings['buildWorkspace'];\n validateWorkflowName!: WorkflowsBindings['validateWorkflowName'];\n previewTTS!: WorkflowsBindings['previewTTS'];\n previewThinkingSound!: WorkflowsBindings['previewThinkingSound'];\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 getArchiveBlockers!: CommunicationsBindings['getArchiveBlockers'];\n archivePhoneNumber!: CommunicationsBindings['archivePhoneNumber'];\n getPhoneNumberCalls!: CommunicationsBindings['getPhoneNumberCalls'];\n getPhoneNumberMessages!: CommunicationsBindings['getPhoneNumberMessages'];\n getPhoneNumberVoicemails!: CommunicationsBindings['getPhoneNumberVoicemails'];\n fetchVoicemailAudio!: CommunicationsBindings['fetchVoicemailAudio'];\n updateVoicemailStatus!: CommunicationsBindings['updateVoicemailStatus'];\n searchAvailablePhoneNumbers!: CommunicationsBindings['searchAvailablePhoneNumbers'];\n purchasePhoneNumber!: CommunicationsBindings['purchasePhoneNumber'];\n releasePhoneNumber!: CommunicationsBindings['releasePhoneNumber'];\n getLinkablePhones!: CommunicationsBindings['getLinkablePhones'];\n linkPhoneNumber!: CommunicationsBindings['linkPhoneNumber'];\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 getSTTModels!: ToolkitsBindings['getSTTModels'];\n getTTSModels!: ToolkitsBindings['getTTSModels'];\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 getPublicFeatureRegistry!: ToolkitsBindings['getPublicFeatureRegistry'];\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 addWorkspaceToSubscription!: BillingBindings['addWorkspaceToSubscription'];\n purchaseCredits!: BillingBindings['purchaseCredits'];\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 // Monday.com Connection API\n configureMondayConnection!: IntegrationsBindings['configureMondayConnection'];\n getMondayConnectionStatus!: IntegrationsBindings['getMondayConnectionStatus'];\n authorizeMondayConnection!: IntegrationsBindings['authorizeMondayConnection'];\n testMondayConnection!: IntegrationsBindings['testMondayConnection'];\n disconnectMondayConnection!: IntegrationsBindings['disconnectMondayConnection'];\n disableMondayConnection!: IntegrationsBindings['disableMondayConnection'];\n enableMondayConnection!: IntegrationsBindings['enableMondayConnection'];\n deleteMondayConnection!: IntegrationsBindings['deleteMondayConnection'];\n getMondayConnectionBoards!: IntegrationsBindings['getMondayConnectionBoards'];\n getMondayConnectionBoardColumns!: IntegrationsBindings['getMondayConnectionBoardColumns'];\n getMondayConnectionBoardGroups!: IntegrationsBindings['getMondayConnectionBoardGroups'];\n getMondaySyncConfig!: IntegrationsBindings['getMondaySyncConfig'];\n updateMondaySyncConfig!: IntegrationsBindings['updateMondaySyncConfig'];\n getLinkedMondayMembers!: IntegrationsBindings['getLinkedMondayMembers'];\n getMondayReconciliationMatches!: IntegrationsBindings['getMondayReconciliationMatches'];\n linkMemberToMonday!: IntegrationsBindings['linkMemberToMonday'];\n bulkLinkMembersToMonday!: IntegrationsBindings['bulkLinkMembersToMonday'];\n unlinkMemberFromMonday!: IntegrationsBindings['unlinkMemberFromMonday'];\n getLinkedRecords!: IntegrationsBindings['getLinkedRecords'];\n importFromBoard!: IntegrationsBindings['importFromBoard'];\n autoCreateDataTypeFromBoard!: IntegrationsBindings['autoCreateDataTypeFromBoard'];\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 fhirListLinkedMembers!: IntegrationsBindings['fhirListLinkedMembers'];\n fhirLinkMember!: IntegrationsBindings['fhirLinkMember'];\n fhirUnlinkMember!: IntegrationsBindings['fhirUnlinkMember'];\n fhirSyncMember!: IntegrationsBindings['fhirSyncMember'];\n fhirImportPatient!: IntegrationsBindings['fhirImportPatient'];\n fhirCsvImportInspect!: IntegrationsBindings['fhirCsvImportInspect'];\n fhirGetCsvImportSettings!: IntegrationsBindings['fhirGetCsvImportSettings'];\n fhirUpdateCsvImportSettings!: IntegrationsBindings['fhirUpdateCsvImportSettings'];\n fhirCsvImportApply!: IntegrationsBindings['fhirCsvImportApply'];\n fhirGetCsvImportRuns!: IntegrationsBindings['fhirGetCsvImportRuns'];\n fhirGetCsvImportRunItems!: IntegrationsBindings['fhirGetCsvImportRunItems'];\n fhirGetEncounterSyncStatus!: IntegrationsBindings['fhirGetEncounterSyncStatus'];\n fhirUpdateEncounterSync!: IntegrationsBindings['fhirUpdateEncounterSync'];\n fhirRunEncounterSync!: IntegrationsBindings['fhirRunEncounterSync'];\n fhirGetEncounterSyncRuns!: IntegrationsBindings['fhirGetEncounterSyncRuns'];\n fhirRefreshEncounterPatient!: IntegrationsBindings['fhirRefreshEncounterPatient'];\n fhirBackfillEncounterSync!: IntegrationsBindings['fhirBackfillEncounterSync'];\n\n // Healthie API\n configureHealthie!: IntegrationsBindings['configureHealthie'];\n getHealthieStatus!: IntegrationsBindings['getHealthieStatus'];\n listHealthieProviders!: IntegrationsBindings['listHealthieProviders'];\n linkCalendarToHealthie!: IntegrationsBindings['linkCalendarToHealthie'];\n unlinkCalendarFromHealthie!: IntegrationsBindings['unlinkCalendarFromHealthie'];\n syncCalendarWithHealthie!: IntegrationsBindings['syncCalendarWithHealthie'];\n getLinkedHealthieMembers!: IntegrationsBindings['getLinkedHealthieMembers'];\n getHealthieReconciliationMatches!: IntegrationsBindings['getHealthieReconciliationMatches'];\n linkMemberToHealthie!: IntegrationsBindings['linkMemberToHealthie'];\n unlinkMemberFromHealthie!: IntegrationsBindings['unlinkMemberFromHealthie'];\n\n // Confluence API\n configureConfluence!: IntegrationsBindings['configureConfluence'];\n startConfluenceOAuth!: IntegrationsBindings['startConfluenceOAuth'];\n getConfluenceStatus!: IntegrationsBindings['getConfluenceStatus'];\n disconnectConfluence!: IntegrationsBindings['disconnectConfluence'];\n disableConfluence!: IntegrationsBindings['disableConfluence'];\n enableConfluence!: IntegrationsBindings['enableConfluence'];\n deleteConfluence!: IntegrationsBindings['deleteConfluence'];\n listConfluenceSpaces!: IntegrationsBindings['listConfluenceSpaces'];\n listConfluencePages!: IntegrationsBindings['listConfluencePages'];\n\n // Salesforce API\n configureSalesforce!: IntegrationsBindings['configureSalesforce'];\n startSalesforceOAuth!: IntegrationsBindings['startSalesforceOAuth'];\n getSalesforceStatus!: IntegrationsBindings['getSalesforceStatus'];\n disconnectSalesforce!: IntegrationsBindings['disconnectSalesforce'];\n disableSalesforce!: IntegrationsBindings['disableSalesforce'];\n enableSalesforce!: IntegrationsBindings['enableSalesforce'];\n deleteSalesforce!: IntegrationsBindings['deleteSalesforce'];\n getSalesforceReconciliationMatches!: IntegrationsBindings['getSalesforceReconciliationMatches'];\n linkMemberToSalesforce!: IntegrationsBindings['linkMemberToSalesforce'];\n bulkLinkMembersToSalesforce!: IntegrationsBindings['bulkLinkMembersToSalesforce'];\n unlinkMemberFromSalesforce!: IntegrationsBindings['unlinkMemberFromSalesforce'];\n getLinkedSalesforceMembers!: IntegrationsBindings['getLinkedSalesforceMembers'];\n getSalesforceSyncConfig!: IntegrationsBindings['getSalesforceSyncConfig'];\n updateSalesforceSyncConfig!: IntegrationsBindings['updateSalesforceSyncConfig'];\n describeSalesforceObject!: IntegrationsBindings['describeSalesforceObject'];\n searchSalesforceRecords!: IntegrationsBindings['searchSalesforceRecords'];\n importSalesforceMembers!: IntegrationsBindings['importSalesforceMembers'];\n\n // HubSpot API\n configureHubspot!: IntegrationsBindings['configureHubspot'];\n startHubspotOAuth!: IntegrationsBindings['startHubspotOAuth'];\n getHubspotStatus!: IntegrationsBindings['getHubspotStatus'];\n disconnectHubspot!: IntegrationsBindings['disconnectHubspot'];\n disableHubspot!: IntegrationsBindings['disableHubspot'];\n enableHubspot!: IntegrationsBindings['enableHubspot'];\n deleteHubspot!: IntegrationsBindings['deleteHubspot'];\n getHubspotReconciliationMatches!: IntegrationsBindings['getHubspotReconciliationMatches'];\n linkMemberToHubspot!: IntegrationsBindings['linkMemberToHubspot'];\n bulkLinkMembersToHubspot!: IntegrationsBindings['bulkLinkMembersToHubspot'];\n unlinkMemberFromHubspot!: IntegrationsBindings['unlinkMemberFromHubspot'];\n getLinkedHubspotMembers!: IntegrationsBindings['getLinkedHubspotMembers'];\n searchHubspotRecords!: IntegrationsBindings['searchHubspotRecords'];\n importHubspotMembers!: IntegrationsBindings['importHubspotMembers'];\n getHubspotContactProperties!: IntegrationsBindings['getHubspotContactProperties'];\n getHubspotManagedRules!: IntegrationsBindings['getHubspotManagedRules'];\n getHubspotSyncLogs!: IntegrationsBindings['getHubspotSyncLogs'];\n getHubspotTransformPresets!: IntegrationsBindings['getHubspotTransformPresets'];\n\n // Connection Sync API (generic)\n getConnectionSyncCapabilities!: IntegrationsBindings['getConnectionSyncCapabilities'];\n getConnectionSyncConfig!: IntegrationsBindings['getConnectionSyncConfig'];\n updateConnectionSyncConfig!: IntegrationsBindings['updateConnectionSyncConfig'];\n getConnectionSyncCheckpoint!: IntegrationsBindings['getConnectionSyncCheckpoint'];\n startSyncRun!: IntegrationsBindings['startSyncRun'];\n getSyncRuns!: IntegrationsBindings['getSyncRuns'];\n getSyncRunItems!: IntegrationsBindings['getSyncRunItems'];\n getMemberSyncSummary!: IntegrationsBindings['getMemberSyncSummary'];\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 // Customers API (self-service billing portal)\n getMyCustomers!: CustomersBindings['getMyCustomers'];\n getMyCustomer!: CustomersBindings['getMyCustomer'];\n getMyCustomerAccounts!: CustomersBindings['getMyCustomerAccounts'];\n getMyCustomerSubscriptions!: CustomersBindings['getMyCustomerSubscriptions'];\n getMyCustomerInvoices!: CustomersBindings['getMyCustomerInvoices'];\n updateMyCustomer!: CustomersBindings['updateMyCustomer'];\n createMyCustomerSetupIntent!: CustomersBindings['createMyCustomerSetupIntent'];\n getMyCustomerPaymentMethods!: CustomersBindings['getMyCustomerPaymentMethods'];\n attachMyCustomerPaymentMethod!: CustomersBindings['attachMyCustomerPaymentMethod'];\n detachMyCustomerPaymentMethod!: CustomersBindings['detachMyCustomerPaymentMethod'];\n setDefaultMyCustomerPaymentMethod!: CustomersBindings['setDefaultMyCustomerPaymentMethod'];\n\n // Resellers API (self-service reseller portal)\n getMyResellers!: ResellersBindings['getMyResellers'];\n getMyReseller!: ResellersBindings['getMyReseller'];\n getMyResellerAccounts!: ResellersBindings['getMyResellerAccounts'];\n getMyResellerProducts!: ResellersBindings['getMyResellerProducts'];\n getMyResellerSubscriptions!: ResellersBindings['getMyResellerSubscriptions'];\n updateMyReseller!: ResellersBindings['updateMyReseller'];\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 bindAgentJobsMethods(this, apis.agentJobs);\n bindAgentTasksMethods(this, apis.agentTasks);\n bindAgentsMethods(this, apis.agents);\n bindQualificationsMethods(this, apis.qualifications);\n bindPersonasMethods(this, apis.personas);\n bindJourneysMethods(this, apis.journeys);\n bindOperatorMethods(this, apis.operatorGroups);\n bindAccessGrantsMethods(this, apis.accessGrants);\n bindPromptsMethods(this, apis.prompts);\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(this, apis.workflows, apis.workflowNotes, apis.voice, apis.supervisors);\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.healthie,\n apis.salesforce,\n apis.hubspot,\n apis.appConnections,\n apis.connectionSync,\n apis.confluence\n );\n bindPronunciationsMethods(this, apis.pronunciations);\n bindCustomersMethods(this, apis.customers);\n bindResellersMethods(this, apis.resellers);\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 * 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 CHARLESTON_PMD_PAGING: 'integration:charleston_pmd_paging',\n\n // Communication\n PHONE_CALL_TOOLS: 'communication:phone_call_tools',\n SEND_SMS: 'communication:send_sms',\n MEMBER_ACCESS: 'communication:member_access',\n AUDIO_PLAYBACK: 'communication:audio_playback',\n\n // Memory\n AGENT_MEMORY: 'memory:agent_memory',\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 /** Field slugs the agent can read. If empty/undefined, all fields are readable. */\n readFields?: string[];\n /** Field slugs the agent can write/update. If empty/undefined, all fields are writable. */\n writeFields?: string[];\n /** Field slugs the agent can set when creating records. If empty/undefined, all fields are available. */\n createFields?: string[];\n /** When true, auto-create a record for the assignment if one doesn't exist (default: false) */\n autoCreate?: boolean;\n}\n\n/** A single forwarding number in the ability config */\nexport interface ForwardingNumberDef {\n /** Human-readable name for this forwarding destination (e.g., 'Billing Department') */\n name: string;\n /** Phone number in E.164 format (e.g., '+15551234567') */\n phoneNumber: string;\n /** Hint for the LLM about when to use this number (e.g., 'for billing inquiries') */\n choicePrompt?: string;\n /** CEL expression that must evaluate to true for this number to be available */\n celCondition?: string;\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 /** List of specific forwarding destinations the agent can use */\n forwardingNumbers?: ForwardingNumberDef[];\n /** When true, the agent can also forward to any number (not just configured ones) */\n allowFreeformForwarding?: boolean;\n}\n\n/** A single named SMS message in the ability config */\nexport interface SMSMessageDef {\n /** AI-readable title like \"Customer Docs Link\" */\n title: string;\n /** Jinja2 template for the message body */\n messageTemplate: string;\n}\n\n/** Config for send_sms ability */\nexport interface SendSMSAbilityConfig {\n /** If true, the agent can also compose its own messages (default: false) */\n allowFreeformMessage?: boolean;\n /** List of named messages the agent can send */\n messages?: SMSMessageDef[];\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 agent_memory ability */\nexport interface AgentMemoryAbilityConfig {\n /** Recall user preference memories into the prompt (default: true) */\n preferences?: boolean;\n /** Recall semantic fact memories into the prompt (default: true) */\n semantic?: boolean;\n /** Recall conversation summary memories into the prompt (default: true) */\n summaries?: boolean;\n /** Recall episodic memories into the prompt (default: false) */\n episodic?: boolean;\n}\n\n/** Config for gmail ability - no configuration needed (feature flag controlled) */\nexport type GmailAbilityConfig = EmptyAbilityConfig;\n\n/** A single audio file entry in the audio_playback ability config */\nexport interface AudioPlaybackFileEntry {\n /** ID of the workspace file to expose for playback (must be a .wav file) */\n fileId: number;\n /** Short label the LLM uses to pick this clip (e.g. 'voicemail_greeting') */\n label: string;\n /** Optional hint for the LLM about when to use this clip */\n hint?: string;\n}\n\n/** Config for audio_playback ability */\nexport interface AudioPlaybackAbilityConfig {\n /** Audio files the agent may play on this task */\n files?: AudioPlaybackFileEntry[];\n}\n\n/** Config for the Charleston Nephrology PMD paging ability. */\nexport interface CharlestonPmdAbilityConfig {\n /**\n * UUID of the workspace OperatorGroup whose members receive\n * manual-escalation notifications when both automated PMD attempts\n * go unread. Picked from the workspace's OperatorGroup list in the\n * ability config UI.\n */\n operatorGroupUuid: string;\n}\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 | SendSMSAbilityConfig\n | EscalationAbilityConfig\n | WebSearchAbilityConfig\n | ConversationHistoryAbilityConfig\n | AgentMemoryAbilityConfig\n | GmailAbilityConfig\n | AudioPlaybackAbilityConfig\n | CharlestonPmdAbilityConfig\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","// Model configuration types for AI agents and voice\n// These types are used for agent configuration (realtime models, chat models, TTS, etc.)\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' | 'speech';\nexport type InterruptionSound = 'none' | 'clav' | 'bells' | 'organ' | 'guzheng';\n\n/** Default filler phrases suggested when the user first enables \"speech\" mode. */\nexport const DEFAULT_THINKING_SPEECH_PHRASES: readonly string[] = [\n 'One moment please',\n \"I'll be right with you\",\n 'Just a moment',\n];\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 | 'openai:tts:gpt-4o-mini-tts'\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 agent is processing tool calls. */\n thinkingSound?: ThinkingSound | null;\n /** Volume level for the thinking sound (0-100). 0 means muted. Missing or null means full volume (100). */\n thinkingSoundVolume?: number | null;\n /** Initial delay in milliseconds before playing thinking sound. Prevents needless interruption on short tool calls. Default: 500ms. */\n thinkingSoundInitialDelay?: number | null;\n /** When `thinkingSound` is 'speech', one of these phrases is spoken while the agent runs a tool. Phrases rotate round-robin per session. */\n thinkingSpeechPhrases?: string[] | null;\n /** Sound to play when user stops speaking after interrupting the assistant. Provides immediate auditory feedback that input was received. Default: none. */\n interruptionSound?: InterruptionSound | null;\n /** Volume level for the interruption sound (0-100). 0 means muted. Missing or null means full volume (100). */\n interruptionSoundVolume?: number | 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 agent 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\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 = [\n 'openai',\n 'elevenlabs',\n 'google',\n 'aws',\n 'pocket',\n 'deepgram',\n] as const;\nexport type TTSPreviewProvider = (typeof TTS_PREVIEW_PROVIDERS)[number];\n\n/**\n * Get the canonical voice model ID from a realtime model config.\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 entity - An object with optional realtimeModelConfig\n * @returns The canonical voice model ID, or null if no voice is configured\n */\nexport function getVoiceModelId(entity: {\n realtimeModelConfig?: RealtimeModelConfig | null;\n}): string | null {\n const config = entity.realtimeModelConfig as BaseRealtimeModelConfig | null;\n return config?.voiceModel ?? null;\n}\n\n/**\n * Check if an entity's voice can be previewed.\n *\n * @param entity - An object with optional realtimeModelConfig\n * @returns True if the entity's voice supports TTS preview\n */\nexport function canPreviewVoice(entity: {\n realtimeModelConfig?: RealtimeModelConfig | null;\n}): boolean {\n const voiceModel = getVoiceModelId(entity);\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 /** Override-only feature — not in the features array, only controllable via override */\n overrideOnly?: boolean;\n /** Whether this feature should appear on public product cards */\n productDisplay?: boolean;\n /** Override label for product cards (defaults to name) */\n productLabel?: string;\n /** Sort order on product cards (lower = higher) */\n productOrder?: number;\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 MEMBER - Member-to-member chats (human-human, human-agent, or agent-agent)\n */\nexport const CHAT_TYPES = {\n ASSIGNMENT: 'assignment',\n MANAGER: 'manager',\n CONTRIBUTOR: 'contributor',\n DEVELOPER: 'developer',\n MEMBER: 'member',\n\n /** @deprecated Use MEMBER instead */\n AGENT: 'member',\n /** @deprecated Use MEMBER instead */\n DM: 'member',\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 member chats.\n */\nexport const NO_ASSISTANT_PARTICIPANT_CHAT_TYPES = new Set<ChatType>([\n ...BUILTIN_ASSISTANT_CHAT_TYPES,\n CHAT_TYPES.MEMBER,\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.CREDIT]: {\n label: 'Credits',\n unit: 'credit',\n unitPlural: 'credits',\n description: 'AI model usage billed as 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,\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,\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;\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_ROLES = 'member_roles',\n CHATS = 'chats',\n DM = 'dm',\n WORKFLOWS = 'workflows',\n ASSIGNMENTS = 'assignments',\n AUTOMATIONS = 'automations',\n DATATYPES = 'datatypes',\n RECORDS = 'records',\n FILES = 'files',\n JOURNEYS = 'journeys',\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 EXPORT = 'export',\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 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 // 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 // JOURNEYS\n // =========================================================================\n 'journeys:read': {\n name: 'journeys:read',\n category: ScopeCategory.JOURNEYS,\n description: 'View journey definitions',\n },\n 'journeys:write': {\n name: 'journeys:write',\n category: ScopeCategory.JOURNEYS,\n description: 'Create and edit journeys',\n implies: ['journeys:read'],\n },\n 'journeys:admin': {\n name: 'journeys:admin',\n category: ScopeCategory.JOURNEYS,\n description: 'Delete journeys',\n implies: ['journeys: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:\n 'Deprecated — label mutations now require the parent resource write scope (members:write, chats:write, files:write)',\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 // EXPORT\n // =========================================================================\n 'export:read': {\n name: 'export:read',\n category: ScopeCategory.EXPORT,\n description: 'Export workspace data',\n },\n 'export:write': {\n name: 'export:write',\n category: ScopeCategory.EXPORT,\n description: 'Export workspace data',\n implies: ['export:read'],\n },\n 'export:admin': {\n name: 'export:admin',\n category: ScopeCategory.EXPORT,\n description: 'Export all data including sensitive information',\n implies: ['export:write'],\n dangerous: true,\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:manage_admins': {\n name: 'org:manage_admins',\n category: ScopeCategory.ORG,\n description: 'Assign admin and owner roles (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"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAAAA;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACCO,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;AAAA,IACV;AAAA,EACH;AAEA,SAAO;AACV;AAsBA,SAAS,qBAAqB,OAA6C;AACxE,MAAI,CAAC,SAAS,OAAO,UAAU,SAAU,QAAO;AAChD,QAAM,IAAI;AACV,SACG,OAAO,EAAE,UAAU,YAAY,OAAO,EAAE,SAAS,YAAY,OAAO,EAAE,YAAY;AAExF;AAEO,IAAM,WAAN,cAAuB,MAAM;AAAA,EACjC;AAAA;AAAA,EAEA;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA;AAAA,EAEA,YACG,SACA,YACA,QACA,kBACD;AACC,UAAM,OAAO;AACb,SAAK,aAAa;AAClB,SAAK,SAAS;AACd,SAAK,mBAAmB;AAAA,EAC3B;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;AAAA,EACV;AAEA,SAAO;AAAA,IACJ,SAAS,aAAa,CAAC;AAAA,IACvB,YAAY,gBAAgB,CAAC;AAAA,IAC7B,SAAS,aAAa,CAAC;AAAA,EAC1B;AACH;AAEO,IAAM,gBAAN,MAAoB;AAAA,EACd;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACF;AAAA,EACA,yBAAiD;AAAA,EACjD;AAAA,EACA;AAAA,EACA;AAAA,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;AAAA,EAE/E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,uBAAuB,SAA0C;AAC9D,SAAK,sBAAsB;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,kBAAkB,SAAqC;AACpD,SAAK,iBAAiB;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,WAAmB;AAC7B,SAAK,SAAS;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,gBAAgB,YAAgC;AAC7C,SAAK,mBAAmB;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAsC;AACnC,WAAO,KAAK;AAAA,EACf;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,YAAY,OAA2B;AACpC,SAAK,WAAW;AAAA,EACnB;AAAA,EAEA,MAAgB,MAAS,UAAkB,SAAmC;AAC3E,QAAI;AACD,YAAM,UAAU,IAAI,QAAQ;AAAA;AAAA;AAAA,QAGzB,GAAI,SAAS,gBAAgB,WAAW,CAAC,IAAI,EAAE,gBAAgB,mBAAmB;AAAA,QAClF,GAAK,SAAS,WAAsC,CAAC;AAAA,MACxD,CAAC;AAED,UAAI,KAAK,QAAQ;AACd,gBAAQ,IAAI,iBAAiB,UAAU,KAAK,MAAM,EAAE;AAAA,MACvD,WAAW,KAAK,eAAe;AAE5B,cAAM,eAAe,eAAe,cAAc;AAClD,YAAI,cAAc;AACf,kBAAQ,IAAI,iBAAiB,UAAU,YAAY,EAAE;AAAA,QACxD;AAAA,MACH;AAGA,UAAI,KAAK,kBAAkB;AACxB,gBAAQ,IAAI,mBAAmB,KAAK,gBAAgB;AAAA,MACvD;AAGA,UAAI,KAAK,UAAU;AAChB,gBAAQ,IAAI,eAAe,KAAK,QAAQ;AAAA,MAC3C;AAGA,YAAM,UAAU,GAAG,KAAK,OAAO,WAAW,QAAQ;AAGlD,YAAM,WAAW,MAAM,KAAK,cAAc,SAAS;AAAA,QAChD,GAAG;AAAA,QACH,GAAI,KAAK,SAAS,CAAC,IAAI,EAAE,aAAa,UAAU;AAAA,QAChD,GAAI,KAAK,gBAAgB,EAAE,MAAM,OAAO,IAAI,CAAC;AAAA,QAC7C;AAAA,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;AAAA,UACd,OAAO;AAEJ,iBAAK,yBAAyB,KAAK,oBAAoB;AACvD,gBAAI;AACD,oBAAM,WAAW,MAAM,KAAK;AAC5B,mBAAK,SAAS;AAAA,YACjB,UAAE;AACC,mBAAK,yBAAyB;AAAA,YACjC;AAAA,UACH;AAEA,cAAI;AACD,mBAAO,MAAM,KAAK,MAAS,UAAU,OAAO;AAAA,UAC/C,SAAS,YAAY;AAClB,iBAAK,WAAW;AAChB,kBAAM;AAAA,UACT;AAAA,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;AAAA,cAC9C;AAAA,cACA;AAAA,YACH;AACA,kBAAM,iBAAiB,eAAe,iBAAiB;AACvD,gBAAI,gBAAgB;AAEjB,mBAAK,WAAW;AAChB,kBAAI;AACD,uBAAO,MAAM,KAAK,MAAS,UAAU,OAAO;AAAA,cAC/C,SAAS,YAAY;AAClB,qBAAK,WAAW;AAChB,sBAAM;AAAA,cACT;AAAA,YACH;AAGA,gBAAI,KAAK,gBAAgB;AACtB,oBAAM,KAAK,eAAe,WAAW;AACrC,oBAAM,IAAI,SAAS,wCAAwC,GAAG;AAAA,YACjE;AAAA,UACH;AAAA,QACH;AAEA,cAAM,YAAY,MAAM,SAAS,KAAK,EAAE,MAAM,OAAO,CAAC,EAAE;AAGxD,YAAI,SAAS,WAAW,OAAO,aAAa,WAAW;AACpD,gBAAM,IAAI,MAAM,cAAc;AAAA,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;AAAA,UACnC,CAAC,EACA,KAAK,IAAI;AACb,gBAAM,IAAI,SAAS;AAAA,EAAsB,eAAe,IAAI,SAAS,MAAM;AAAA,QAC9E;AAGA,YAAI,UAAU,UAAU,MAAM,QAAQ,UAAU,MAAM,GAAG;AAItD,cAAI,UAAU,OAAO,SAAS,KAAK,qBAAqB,UAAU,OAAO,CAAC,CAAC,GAAG;AAC3E,kBAAM,mBACH,UAAU,OAAO,OAAO,oBAAoB;AAC/C,kBAAM,CAAC,KAAK,IAAI;AAChB,gBAAI,OAAO;AACR,oBAAM,QACH,iBAAiB,SAAS,IACrB,MAAM,iBAAiB,SAAS,CAAC,WACjC;AACR,oBAAM,WAAW,GAAG,MAAM,KAAK,KAAK,MAAM,OAAO,GAAG,KAAK;AACzD,oBAAM,IAAI;AAAA,gBACP;AAAA,gBACA,SAAS;AAAA,gBACT,iBAAiB,IAAI,CAAC,MAAM,GAAG,EAAE,KAAK,KAAK,EAAE,OAAO,EAAE;AAAA,gBACtD;AAAA,cACH;AAAA,YACH;AAAA,UACH;AAGA,gBAAM,eAAyB,UAAU,OAAO;AAAA,YAC7C,CAAC,MAA4B,OAAO,MAAM;AAAA,UAC7C;AACA,gBAAM,UAAU,aAAa,KAAK,IAAI;AACtC,gBAAM,UAAU,UAAU,SACrB,GAAG,UAAU,MAAM,KAAK,OAAO,KAC/B,sBAAsB,OAAO;AAClC,gBAAM,IAAI,SAAS,SAAS,SAAS,QAAQ,YAAY;AAAA,QAC5D;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;AAEnD,UAAC,MAAc,YAAY;AAC3B,gBAAM;AAAA,QACT;AAGA,cAAM,eACH,OAAO,UAAU,WAAW,WACvB,UAAU,SACV,UAAU,WAAW,SAAS;AACtC,cAAM,IAAI,SAAS,cAAc,SAAS,MAAM;AAAA,MACnD;AAGA,UAAI,SAAS,WAAW,KAAK;AAC1B,eAAO;AAAA,MACV;AAEA,aAAO,SAAS,KAAK;AAAA,IACxB,SAAS,OAAO;AACb,cAAQ,KAAK,KAAK;AAClB,YAAM;AAAA,IACT;AAAA,EACH;AAAA,EAEA,MAAgB,SAAS,UAAkB,SAA0C;AAClF,QAAI;AACD,YAAM,UAAU,IAAI,QAAQ;AAAA,QACzB,GAAK,SAAS,WAAsC,CAAC;AAAA,MACxD,CAAC;AAED,UAAI,KAAK,QAAQ;AACd,gBAAQ,IAAI,iBAAiB,UAAU,KAAK,MAAM,EAAE;AAAA,MACvD,WAAW,KAAK,eAAe;AAE5B,cAAM,eAAe,eAAe,cAAc;AAClD,YAAI,cAAc;AACf,kBAAQ,IAAI,iBAAiB,UAAU,YAAY,EAAE;AAAA,QACxD;AAAA,MACH;AAGA,UAAI,KAAK,kBAAkB;AACxB,gBAAQ,IAAI,mBAAmB,KAAK,gBAAgB;AAAA,MACvD;AAGA,UAAI,KAAK,UAAU;AAChB,gBAAQ,IAAI,eAAe,KAAK,QAAQ;AAAA,MAC3C;AAEA,YAAM,WAAW,MAAM,KAAK,cAAc,GAAG,KAAK,OAAO,WAAW,QAAQ,IAAI;AAAA,QAC7E,GAAG;AAAA,QACH,GAAI,KAAK,SAAS,CAAC,IAAI,EAAE,aAAa,UAAU;AAAA,QAChD,GAAI,KAAK,gBAAgB,EAAE,MAAM,OAAO,IAAI,CAAC;AAAA,QAC7C;AAAA,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;AAAA,UACd,OAAO;AAEJ,iBAAK,yBAAyB,KAAK,oBAAoB;AACvD,gBAAI;AACD,oBAAM,WAAW,MAAM,KAAK;AAC5B,mBAAK,SAAS;AAAA,YACjB,UAAE;AACC,mBAAK,yBAAyB;AAAA,YACjC;AAAA,UACH;AAEA,cAAI;AACD,mBAAO,MAAM,KAAK,SAAS,UAAU,OAAO;AAAA,UAC/C,SAAS,YAAY;AAClB,iBAAK,WAAW;AAChB,kBAAM;AAAA,UACT;AAAA,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;AAAA,cAC9C;AAAA,cACA;AAAA,YACH;AACA,kBAAM,iBAAiB,eAAe,iBAAiB;AACvD,gBAAI,gBAAgB;AACjB,mBAAK,WAAW;AAChB,kBAAI;AACD,uBAAO,MAAM,KAAK,SAAS,UAAU,OAAO;AAAA,cAC/C,SAAS,YAAY;AAClB,qBAAK,WAAW;AAChB,sBAAM;AAAA,cACT;AAAA,YACH;AAEA,gBAAI,KAAK,gBAAgB;AACtB,oBAAM,KAAK,eAAe,WAAW;AACrC,oBAAM,IAAI,SAAS,wCAAwC,GAAG;AAAA,YACjE;AAAA,UACH;AAAA,QACH;AAEA,cAAM,YAAY,MAAM,SAAS,KAAK,EAAE,MAAM,MAAM,EAAE;AACtD,cAAM,IAAI,SAAS,aAAa,SAAS,YAAY,SAAS,MAAM;AAAA,MACvE;AAEA,aAAO;AAAA,IACV,SAAS,OAAO;AACb,cAAQ,KAAK,KAAK;AAClB,YAAM;AAAA,IACT;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAgB,UAAa,MAAc,SAAmC;AAC3E,QAAI;AACD,YAAM,UAAU,IAAI,QAAQ;AAAA,QACzB,GAAI,SAAS,gBAAgB,WAAW,CAAC,IAAI,EAAE,gBAAgB,mBAAmB;AAAA,QAClF,GAAK,SAAS,WAAsC,CAAC;AAAA,MACxD,CAAC;AAED,UAAI,KAAK,QAAQ;AACd,gBAAQ,IAAI,iBAAiB,UAAU,KAAK,MAAM,EAAE;AAAA,MACvD,WAAW,KAAK,eAAe;AAC5B,cAAM,eAAe,eAAe,cAAc;AAClD,YAAI,cAAc;AACf,kBAAQ,IAAI,iBAAiB,UAAU,YAAY,EAAE;AAAA,QACxD;AAAA,MACH;AAGA,UAAI,KAAK,kBAAkB;AACxB,gBAAQ,IAAI,mBAAmB,KAAK,gBAAgB;AAAA,MACvD;AAGA,UAAI,KAAK,UAAU;AAChB,gBAAQ,IAAI,eAAe,KAAK,QAAQ;AAAA,MAC3C;AAEA,YAAM,UAAU,GAAG,KAAK,OAAO,IAAI,IAAI;AAEvC,YAAM,WAAW,MAAM,KAAK,cAAc,SAAS;AAAA,QAChD,GAAG;AAAA,QACH,GAAI,KAAK,SAAS,CAAC,IAAI,EAAE,aAAa,UAAU;AAAA,QAChD,GAAI,KAAK,gBAAgB,EAAE,MAAM,OAAO,IAAI,CAAC;AAAA,QAC7C;AAAA,MACH,CAAC;AAED,UAAI,CAAC,SAAS,IAAI;AACf,YAAI,SAAS,WAAW,KAAK;AAC1B,iBAAO;AAAA,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;AAAA,MACnD;AAEA,UAAI,SAAS,WAAW,KAAK;AAC1B,eAAO;AAAA,MACV;AAEA,aAAO,SAAS,KAAK;AAAA,IACxB,SAAS,OAAO;AACb,cAAQ,KAAK,KAAK;AAClB,YAAM;AAAA,IACT;AAAA,EACH;AACH;;;AChiBO,IAAM,eAAN,cAA2B,cAAc;AAAA;AAAA;AAAA;AAAA,EAI7C,MAAM,gBAAgB,KAA4C;AAC/D,WAAO,KAAK,MAA4B,KAAK,GAAG,kBAAkB;AAAA,EACrE;AACH;;;ACLO,IAAM,kBAAN,cAA8B,cAAc;AAAA;AAAA,EAEhD,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;AAAA,MACT,KAAK,GAAG,6BAA6B,KAAK,IAAI,EAAE,KAAK,EAAE;AAAA,IAC1D;AAAA,EACH;AAAA;AAAA,EAGA,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;AAAA,MACT,KAAK,GAAG,0BAA0B,KAAK,IAAI,EAAE,KAAK,EAAE;AAAA,IACvD;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,eAAe,KAAa,MAAoC;AACnE,WAAO,KAAK,MAAmB,KAAK,GAAG,kBAAkB,IAAI,EAAE;AAAA,EAClE;AAAA;AAAA,EAGA,MAAM,kBAAkB,KAAa,MAAsD;AACxF,WAAO,KAAK,MAAmB,KAAK,GAAG,kBAAkB;AAAA,MACtD,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,IAAI;AAAA,IAC5B,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,mBACH,KACA,MACA,MACqB;AACrB,WAAO,KAAK,MAAmB,KAAK,GAAG,kBAAkB,IAAI,YAAY;AAAA,MACtE,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,IAAI;AAAA,IAC5B,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,kBACH,KACA,MACA,MACqB;AACrB,WAAO,KAAK,MAAmB,KAAK,GAAG,kBAAkB,IAAI,WAAW;AAAA,MACrE,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,IAAI;AAAA,IAC5B,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,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,aAAa,OAAO,SAAS,SAAS,CAAC;AAC9E,UAAM,KAAK,aAAa,SAAS;AACjC,WAAO,KAAK;AAAA,MACT,KAAK,GAAG,iBAAiB,KAAK,IAAI,EAAE,KAAK,EAAE;AAAA,IAC9C;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,gBAAgB,KAAa,UAA0C;AAC1E,UAAM,OAAO,MAAM,KAAK;AAAA,MACrB,KAAK,GAAG,yBAAyB,QAAQ;AAAA,IAC5C;AACA,WAAO,KAAK;AAAA,EACf;AACH;;;ACxGO,IAAM,eAAN,cAA2B,cAAc;AAAA,EAC7C,MAAM,cACH,KACA,QACoB;AACpB,UAAM,eAAe,IAAI,gBAAgB;AACzC,QAAI,QAAQ,QAAS,cAAa,IAAI,WAAW,OAAO,OAAO;AAC/D,QAAI,QAAQ,OAAQ,cAAa,IAAI,UAAU,OAAO,MAAM;AAC5D,QAAI,QAAQ,OAAQ,cAAa,IAAI,UAAU,OAAO,OAAO,MAAM,CAAC;AACpE,UAAM,KAAK,aAAa,SAAS;AACjC,WAAO,KAAK,MAAkB,KAAK,GAAG,cAAc,KAAK,IAAI,EAAE,KAAK,EAAE,EAAE;AAAA,EAC3E;AAAA,EAEA,MAAM,YAAY,KAAa,OAAkC;AAC9D,WAAO,KAAK,MAAgB,KAAK,GAAG,eAAe,KAAK,EAAE;AAAA,EAC7D;AAAA,EAEA,MAAM,eAAe,KAAa,MAAgD;AAC/E,WAAO,KAAK,MAAgB,KAAK,GAAG,eAAe;AAAA,MAChD,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,IAAI;AAAA,IAC5B,CAAC;AAAA,EACJ;AAAA,EAEA,MAAM,eACH,KACA,OACA,MACkB;AAClB,WAAO,KAAK,MAAgB,KAAK,GAAG,eAAe,KAAK,IAAI;AAAA,MACzD,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,IAAI;AAAA,IAC5B,CAAC;AAAA,EACJ;AAAA,EAEA,MAAM,eAAe,KAAa,OAA8B;AAC7D,UAAM,KAAK,SAAS,KAAK,GAAG,eAAe,KAAK,IAAI,EAAE,QAAQ,SAAS,CAAC;AAAA,EAC3E;AAAA,EAEA,MAAM,gBAAgB,KAAa,OAAuC;AACvE,WAAO,KAAK,MAAqB,KAAK,GAAG,eAAe,KAAK,OAAO;AAAA,EACvE;AACH;;;ACpCO,IAAM,gBAAN,cAA4B,cAAc;AAAA,EAC9C,MAAM,cAAc,KAAa,QAA6D;AAC3F,UAAM,eAAe,IAAI,gBAAgB;AACzC,QAAI,QAAQ,OAAQ,cAAa,IAAI,UAAU,OAAO,MAAM;AAC5D,QAAI,QAAQ,iBAAiB;AAC1B,mBAAa,IAAI,mBAAmB,OAAO,OAAO,aAAa,CAAC;AACnE,QAAI,QAAQ,gBAAgB;AACzB,mBAAa,IAAI,kBAAkB,OAAO,OAAO,YAAY,CAAC;AACjE,QAAI,QAAQ,SAAS,KAAM,cAAa,IAAI,SAAS,OAAO,OAAO,KAAK,CAAC;AACzE,UAAM,KAAK,aAAa,SAAS;AACjC,WAAO,KAAK,MAA2B,KAAK,GAAG,eAAe,KAAK,IAAI,EAAE,KAAK,EAAE,EAAE;AAAA,EACrF;AAAA,EAEA,MAAM,aAAa,KAAa,UAA8C;AAC3E,WAAO,KAAK,MAAyB,KAAK,GAAG,gBAAgB,QAAQ,EAAE;AAAA,EAC1E;AAAA,EAEA,MAAM,gBAAgB,KAAa,UAAoD;AACpF,WAAO,KAAK,MAA+B,KAAK,GAAG,gBAAgB,QAAQ,WAAW;AAAA,MACnF,QAAQ;AAAA,IACX,CAAC;AAAA,EACJ;AAAA,EAEA,MAAM,qBACH,KACA,UACA,QACoC;AACpC,UAAM,eAAe,IAAI,gBAAgB;AACzC,QAAI,QAAQ,SAAS,KAAM,cAAa,IAAI,SAAS,OAAO,OAAO,KAAK,CAAC;AACzE,UAAM,KAAK,aAAa,SAAS;AACjC,WAAO,KAAK;AAAA,MACT,KAAK,GAAG,gBAAgB,QAAQ,YAAY,KAAK,IAAI,EAAE,KAAK,EAAE;AAAA,IACjE;AAAA,EACH;AACH;;;ACjCO,IAAM,YAAN,cAAwB,cAAc;AAAA;AAAA,EAE1C,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;AAAA,MACT,KAAK,GAAG,UAAU,OAAO,SAAS,IAAI,IAAI,OAAO,SAAS,CAAC,KAAK,EAAE;AAAA,IACrE;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,SAAS,KAAa,IAA4B;AACrD,WAAO,KAAK,MAAa,KAAK,GAAG,WAAW,EAAE,EAAE;AAAA,EACnD;AAAA;AAAA,EAGA,MAAM,YAAY,KAAa,OAA2C;AACvE,WAAO,KAAK,MAAa,KAAK,GAAG,WAAW;AAAA,MACzC,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,KAAK;AAAA,IAC7B,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,YAAY,KAAa,IAAY,OAA2C;AACnF,WAAO,KAAK,MAAa,KAAK,GAAG,WAAW,EAAE,IAAI;AAAA,MAC/C,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,KAAK;AAAA,IAC7B,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,YAAY,KAAa,IAAY,OAAgC;AACxE,UAAM,SAAS,QAAQ,gBAAgB;AACvC,WAAO,KAAK,MAAM,KAAK,GAAG,WAAW,EAAE,GAAG,MAAM,IAAI;AAAA,MACjD,QAAQ;AAAA,IACX,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,aAAa,KAAa,IAA4B;AACzD,WAAO,KAAK,MAAa,KAAK,GAAG,WAAW,EAAE,YAAY;AAAA,MACvD,QAAQ;AAAA,IACX,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,eAAe,KAAa,IAA4B;AAC3D,WAAO,KAAK,MAAa,KAAK,GAAG,WAAW,EAAE,cAAc;AAAA,MACzD,QAAQ;AAAA,IACX,CAAC;AAAA,EACJ;AACH;;;ACtEO,IAAM,cAAN,cAA0B,cAAc;AAAA;AAAA;AAAA;AAAA,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;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA,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;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA,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;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA;AAAA,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;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA,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;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA,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;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA,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;AAAA,EAC1C;AACH;;;ACpGO,IAAM,aAAN,cAAyB,cAAc;AAAA;AAAA;AAAA,EAI3C,MAAM,WAAW,KAAgC;AAC9C,WAAO,KAAK,MAAgB,KAAK,GAAG,WAAW;AAAA,EAClD;AAAA;AAAA,EAGA,MAAM,aAAa,KAAa,QAAgD;AAC7E,WAAO,KAAK,MAAqB,KAAK,GAAG,aAAa;AAAA,MACnD,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,MAAM;AAAA,IAC9B,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,aAAa,KAAa,IAA2B;AACxD,WAAO,KAAK,MAAM,KAAK,GAAG,aAAa,EAAE,IAAI;AAAA,MAC1C,QAAQ;AAAA,IACX,CAAC;AAAA,EACJ;AAAA;AAAA;AAAA,EAKA,MAAM,mBAAsC;AACzC,WAAO,KAAK,MAAgB,kBAAkB;AAAA,EACjD;AAAA;AAAA,EAGA,MAAM,mBAAmB,QAAgD;AACtE,WAAO,KAAK,MAAqB,oBAAoB;AAAA,MAClD,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,MAAM;AAAA,IAC9B,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,mBAAmB,IAA2B;AACjD,WAAO,KAAK,MAAM,oBAAoB,EAAE,IAAI;AAAA,MACzC,QAAQ;AAAA,IACX,CAAC;AAAA,EACJ;AACH;;;ACtCO,IAAM,UAAN,cAAsB,cAAc;AAAA;AAAA;AAAA;AAAA,EAIxC,MAAM,SAAS,QAIc;AAC1B,UAAM,cAAc,IAAI,gBAAgB;AACxC,QAAI,QAAQ,OAAQ,aAAY,OAAO,UAAU,MAAM;AACvD,QAAI,QAAQ,kBAAkB;AAC3B,kBAAY,OAAO,kBAAkB,OAAO,aAAa;AAC5D,QAAI,QAAQ,cAAc;AACvB,kBAAY,OAAO,cAAc,OAAO,UAAU,SAAS,CAAC;AAC/D,UAAM,cAAc,YAAY,SAAS;AACzC,WAAO,KAAK,MAAuB,OAAO,cAAc,IAAI,WAAW,KAAK,EAAE,EAAE;AAAA,EACnF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAU,SAAyC;AACtD,WAAO,KAAK,MAAW,QAAQ;AAAA,MAC5B,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,OAAO;AAAA,IAC/B,CAAC;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAO,OAA6B;AACvC,WAAO,KAAK,MAAW,QAAQ,KAAK,EAAE;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,iBAAiB,UAAgC;AACpD,WAAO,KAAK,MAAW,qBAAqB,QAAQ,EAAE;AAAA,EACzD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAU,OAAe,SAAyC;AACrE,WAAO,KAAK,MAAW,QAAQ,KAAK,IAAI;AAAA,MACrC,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,OAAO;AAAA,IAC/B,CAAC;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAU,OAA6C;AAC1D,WAAO,KAAK,MAA2B,QAAQ,KAAK,IAAI;AAAA,MACrD,QAAQ;AAAA,IACX,CAAC;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,uBAAuB,OAA+C;AACzE,WAAO,KAAK,MAA6B,QAAQ,KAAK,sBAAsB;AAAA,MACzE,QAAQ;AAAA,IACX,CAAC;AAAA,EACJ;AACH;;;ACjEO,IAAM,iBAAN,cAA6B,cAAc;AAAA;AAAA,EAE/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;AAAA,MACT,KAAK,GAAG,eAAe,OAAO,SAAS,IAAI,IAAI,OAAO,SAAS,CAAC,KAAK,EAAE;AAAA,IAC1E;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,cAAc,KAAa,IAAiC;AAC/D,WAAO,KAAK,MAAkB,KAAK,GAAG,gBAAgB,EAAE,EAAE;AAAA,EAC7D;AAAA;AAAA,EAGA,MAAM,sBAAsB,KAAa,IAAoC;AAC1E,WAAO,KAAK,MAAqB,KAAK,GAAG,gBAAgB,EAAE,WAAW;AAAA,EACzE;AAAA;AAAA,EAGA,MAAM,iBACH,KACA,IACA,YACoB;AACpB,WAAO,KAAK,MAAkB,KAAK,GAAG,gBAAgB,EAAE,IAAI;AAAA,MACzD,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,UAAU;AAAA,IAClC,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,iBAAiB,KAAa,IAA2B;AAC5D,WAAO,KAAK,MAAM,KAAK,GAAG,gBAAgB,EAAE,IAAI;AAAA,MAC7C,QAAQ;AAAA,IACX,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,kBACH,KACA,IACA,kBACwB;AACxB,WAAO,KAAK,MAAsB,KAAK,GAAG,gBAAgB,EAAE,UAAU,gBAAgB,EAAE;AAAA,EAC3F;AAAA;AAAA,EAGA,MAAM,4BACH,KACA,IACA,kBACc;AACd,WAAO,KAAK,MAAM,KAAK,GAAG,gBAAgB,EAAE,UAAU,gBAAgB,WAAW;AAAA,MAC9E,QAAQ;AAAA,IACX,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,iBAAiB,KAAa,MAAqD;AACtF,WAAO,KAAK,MAAkB,KAAK,GAAG,gBAAgB;AAAA,MACnD,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,IAAI;AAAA,IAC5B,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,wBACH,KACA,cACoC;AACpC,WAAO,KAAK;AAAA,MACT,KAAK,GAAG,gBAAgB,YAAY;AAAA,IACvC;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,wBACH,KACA,cACiC;AACjC,WAAO,KAAK;AAAA,MACT,KAAK,GAAG,gBAAgB,YAAY;AAAA,IACvC;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,iBACH,KACA,IACA,MACoB;AACpB,WAAO,KAAK,MAAkB,KAAK,GAAG,gBAAgB,EAAE,WAAW;AAAA,MAChE,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,QAAQ,CAAC,CAAC;AAAA,IAClC,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,mBAAmB,KAAa,cAA8C;AACjF,WAAO,KAAK,MAAqB,KAAK,GAAG,gBAAgB,YAAY,QAAQ;AAAA,EAChF;AAAA;AAAA,EAGA,MAAM,sBACH,KACA,cACA,UACA,aAAsC,CAAC,GACV;AAC7B,WAAO,KAAK,MAA2B,KAAK,GAAG,gBAAgB,YAAY,iBAAiB;AAAA,MACzF,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,EAAE,UAAU,WAAW,CAAC;AAAA,IAChD,CAAC;AAAA,EACJ;AACH;;;ACjIO,IAAM,WAAN,cAAuB,cAAc;AAAA;AAAA,EAEzC,MAAM,WAAW,KAAa,SAAkD;AAC7E,UAAM,WAAW,MAAM,KAAK,SAAS,KAAK,GAAG,uBAAuB;AAAA,MACjE,QAAQ;AAAA,MACR,SAAS;AAAA,QACN,gBAAgB;AAAA,MACnB;AAAA,MACA,MAAM,KAAK,UAAU,OAAO;AAAA,IAC/B,CAAC;AACD,WAAO,SAAS,YAAY;AAAA,EAC/B;AAAA;AAAA,EAGA,MAAM,qBACH,KACA,SACqB;AACrB,UAAM,WAAW,MAAM,KAAK,SAAS,KAAK,GAAG,kCAAkC;AAAA,MAC5E,QAAQ;AAAA,MACR,SAAS;AAAA,QACN,gBAAgB;AAAA,MACnB;AAAA,MACA,MAAM,KAAK,UAAU,OAAO;AAAA,IAC/B,CAAC;AACD,WAAO,SAAS,YAAY;AAAA,EAC/B;AACH;;;ACRA,+BAA2C;AAM3C,SAAS,wBAAwB,aAA6B;AAC3D,MAAI;AAED,QAAI,aAAS,qDAA2B,WAAW;AAGnD,QAAI,CAAC,QAAQ;AACV,mBAAS,qDAA2B,aAAa,IAAI;AAAA,IACxD;AAEA,QAAI,UAAU,OAAO,QAAQ,GAAG;AAC7B,aAAO,OAAO,OAAO,OAAO;AAAA,IAC/B;AAAA,EACH,QAAQ;AAAA,EAER;AAEA,SAAO;AACV;AAEO,IAAM,UAAN,cAAsB,cAAc;AAAA;AAAA,EAExC,MAAM,iBAAmC;AACtC,WAAO,KAAK,MAAe,SAAS;AAAA,EACvC;AAAA;AAAA,EAGA,MAAM,kBAAkB,MAAyC;AAC9D,WAAO,KAAK,MAAM,WAAW;AAAA,MAC1B,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,IAAI;AAAA,IAC5B,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,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;AAAA,MAC1E,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,IAAI;AAAA,IAC5B,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,WAAW,aAAqB,kBAAsD;AACzF,UAAM,OAAY,EAAE,aAAa,wBAAwB,WAAW,EAAE;AACtE,QAAI,iBAAkB,MAAK,mBAAmB;AAC9C,WAAO,MAAM,KAAK,MAAwB,oBAAoB;AAAA,MAC3D,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,IAAI;AAAA,IAC5B,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,kBACH,aACA,MACA,kBAC4B;AAE5B,UAAM,iBAAiB,MAAM,KAAK,MAA0B,wBAAwB;AAAA,MACjF,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU;AAAA,QAClB,aAAa,wBAAwB,WAAW;AAAA,QAChD;AAAA,QACA;AAAA,MACH,CAAC;AAAA,IACJ,CAAC;AAGD,QAAI,CAAC,eAAe,qBAAqB,eAAe,OAAO;AAC5D,YAAM,mBAAmB,MAAM,MAAM,sBAAsB;AAAA,QACxD,QAAQ;AAAA,QACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,QAC9C,MAAM,KAAK,UAAU;AAAA,UAClB,OAAO,eAAe;AAAA,UACtB,SAAS;AAAA;AAAA,QACZ,CAAC;AAAA,MACJ,CAAC;AAED,UAAI,CAAC,iBAAiB,IAAI;AACvB,cAAM,SAAS,MAAM,iBAAiB,KAAK;AAC3C,gBAAQ,MAAM,0BAA0B,MAAM,EAAE;AAChD,cAAM,IAAI,MAAM,mCAAmC;AAAA,MACtD;AAAA,IACH;AAEA,WAAO;AAAA,EACV;AAAA;AAAA,EAGA,MAAM,mBACH,OACA,UACA,kBAC4B;AAC5B,WAAO,MAAM,KAAK,MAA0B,6BAA6B;AAAA,MACtE,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,EAAE,OAAO,UAAU,iBAAiB,CAAC;AAAA,IAC7D,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,oBACH,OACA,UACA,MACA,kBAC4B;AAC5B,WAAO,MAAM,KAAK,MAA0B,8BAA8B;AAAA,MACvE,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,EAAE,OAAO,UAAU,MAAM,iBAAiB,CAAC;AAAA,IACnE,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,eACH,iBACA,aAC+C;AAC/C,WAAO,MAAM,KAAK,MAA6C,wBAAwB;AAAA,MACpF,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,EAAE,iBAAiB,YAAY,CAAC;AAAA,IACxD,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,YAAY,aAAqE;AACpF,WAAO,MAAM,KAAK,MAA6C,qBAAqB;AAAA,MACjF,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,EAAE,YAAY,CAAC;AAAA,IACvC,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,oBAAuD;AAC1D,WAAO,MAAM,KAAK,MAAgC,sBAAsB;AAAA,EAC3E;AAAA;AAAA,EAGA,MAAM,SAAwC;AAE3C,UAAM,WAAW,MAAM,MAAM,oBAAoB;AAAA,MAC9C,QAAQ;AAAA,MACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,IACjD,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AACf,YAAM,IAAI,MAAM,kBAAkB;AAAA,IACrC;AAEA,WAAO,MAAM,SAAS,KAAK;AAAA,EAC9B;AAAA;AAAA,EAGA,MAAM,0BAAsD;AACzD,WAAO,KAAK,MAAyB,2BAA2B;AAAA,MAC7D,QAAQ;AAAA,IACX,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,cAAc,OAA2C;AAC5D,WAAO,KAAK,MAAyB,uBAAuB;AAAA,MACzD,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,EAAE,MAAM,CAAC;AAAA,IACjC,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,iBAAiB,cAA8C;AAClE,WAAO,KAAK,MAAqB,aAAa,YAAY,EAAE;AAAA,EAC/D;AAAA;AAAA,EAGA,MAAM,aACH,KACA,MAkB8B;AAC9B,WAAO,KAAK,MAA4B,KAAK,GAAG,kBAAkB;AAAA,MAC/D,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,IAAI;AAAA,IAC5B,CAAC;AAAA,EACJ;AAAA;AAAA;AAAA,EAKA,MAAM,iBACH,OACA,kBACA,aACkC;AAClC,WAAO,MAAM,KAAK,MAAgC,2BAA2B;AAAA,MAC1E,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,EAAE,OAAO,kBAAkB,YAAY,CAAC;AAAA,IAChE,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,kBAAkB,OAAe,KAAkD;AACtF,UAAM,OAAwC,EAAE,MAAM;AACtD,QAAI,KAAK;AACN,WAAK,MAAM;AAAA,IACd;AACA,WAAO,MAAM,KAAK,MAAiC,4BAA4B;AAAA,MAC5E,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,IAAI;AAAA,IAC5B,CAAC;AAAA,EACJ;AAAA;AAAA;AAAA,EAKA,MAAM,sBACH,OACA,kBAC0B;AAC1B,WAAO,MAAM,KAAK,MAAwB,gCAAgC;AAAA,MACvE,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,EAAE,OAAO,iBAAiB,CAAC;AAAA,IACnD,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,YACH,OACA,MACA,kBAC4B;AAE5B,UAAM,iBAAiB,MAAM,KAAK,MAA0B,qBAAqB;AAAA,MAC9E,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,EAAE,OAAO,MAAM,iBAAiB,CAAC;AAAA,IACzD,CAAC;AAGD,QAAI,CAAC,eAAe,qBAAqB,eAAe,OAAO;AAC5D,YAAM,mBAAmB,MAAM,MAAM,sBAAsB;AAAA,QACxD,QAAQ;AAAA,QACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,QAC9C,MAAM,KAAK,UAAU;AAAA,UAClB,OAAO,eAAe;AAAA,UACtB,SAAS;AAAA;AAAA,QACZ,CAAC;AAAA,MACJ,CAAC;AAED,UAAI,CAAC,iBAAiB,IAAI;AACvB,cAAM,IAAI,MAAM,mCAAmC;AAAA,MACtD;AAAA,IACH;AAEA,WAAO;AAAA,EACV;AAAA;AAAA;AAAA,EAKA,MAAM,qBAA+C;AAClD,WAAO,KAAK,MAAuB,iBAAiB;AAAA,EACvD;AAAA;AAAA,EAGA,MAAM,UAAU,MAAoD;AACjE,WAAO,KAAK,MAAyB,uBAAuB;AAAA,MACzD,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,IAAI;AAAA,IAC5B,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,gBAAgB,MAAmE;AACtF,WAAO,KAAK,MAAkC,wBAAwB;AAAA,MACnE,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,IAAI;AAAA,IAC5B,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,cAAc,MAA0C;AAC3D,WAAO,KAAK,MAAW,2BAA2B;AAAA,MAC/C,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,IAAI;AAAA,IAC5B,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,oBACH,MACoC;AACpC,WAAO,KAAK,MAAkC,4BAA4B;AAAA,MACvE,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,IAAI;AAAA,IAC5B,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,sBACH,OAAqC,CAAC,GACP;AAC/B,WAAO,KAAK,MAA6B,oCAAoC;AAAA,MAC1E,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,IAAI;AAAA,IAC5B,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,uBAAuB,UAAuD;AACjF,WAAO,KAAK,MAAkC,oBAAoB,QAAQ,IAAI;AAAA,MAC3E,QAAQ;AAAA,IACX,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,sBACH,MACoC;AACpC,WAAO,KAAK,MAAkC,oBAAoB,KAAK,QAAQ,IAAI;AAAA,MAChF,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,IAAI;AAAA,IAC5B,CAAC;AAAA,EACJ;AAAA;AAAA;AAAA,EAKA,MAAM,eACH,WACA,MAC8C;AAC9C,WAAO,KAAK,MAA4C,sBAAsB;AAAA,MAC3E,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU;AAAA,QAClB,YAAY;AAAA,QACZ;AAAA,MACH,CAAC;AAAA,IACJ,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,uBACH,WACA,MAC8C;AAC9C,WAAO,KAAK,MAA4C,0BAA0B;AAAA,MAC/E,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU;AAAA,QAClB,YAAY;AAAA,QACZ;AAAA,MACH,CAAC;AAAA,IACJ,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,uBAAuB,WAQ1B;AACA,WAAO,KAAK,MAQT,6BAA6B;AAAA,MAC7B,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU;AAAA,QAClB,YAAY;AAAA,MACf,CAAC;AAAA,IACJ,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,mBACH,WACA,mBAC8C;AAC9C,WAAO,KAAK,MAA4C,qBAAqB;AAAA,MAC1E,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU;AAAA,QAClB,YAAY;AAAA,QACZ,oBAAoB;AAAA,MACvB,CAAC;AAAA,IACJ,CAAC;AAAA,EACJ;AAAA;AAAA;AAAA,EAKA,MAAM,qBAA2D;AAC9D,WAAO,KAAK,MAAmC,QAAQ;AAAA,EAC1D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,wBACH,gBACA,UACyC;AACzC,WAAO,KAAK,MAAuC,qCAAqC;AAAA,MACrF,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU;AAAA,QAClB,iBAAiB;AAAA,QACjB,WAAW;AAAA,MACd,CAAC;AAAA,IACJ,CAAC;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,uBACH,WACA,SACwC;AACxC,WAAO,KAAK,MAAsC,oCAAoC;AAAA,MACnF,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU;AAAA,QAClB,YAAY;AAAA,QACZ,UAAU;AAAA,MACb,CAAC;AAAA,IACJ,CAAC;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,8BAAkE;AACrE,WAAO,KAAK,MAAiC,oCAAoC;AAAA,EACpF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,uBAAuB,WAA4D;AACtF,WAAO,KAAK;AAAA,MACT,oCAAoC,SAAS;AAAA,MAC7C,EAAE,QAAQ,SAAS;AAAA,IACtB;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,iCAAiC,OAAuD;AAC3F,WAAO,KAAK,MAAqC,oCAAoC,KAAK,EAAE;AAAA,EAC/F;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,8BACH,OAC+C;AAC/C,WAAO,KAAK;AAAA,MACT,oCAAoC,KAAK;AAAA,MACzC,EAAE,QAAQ,OAAO;AAAA,IACpB;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,kBAAiD;AACpD,WAAO,KAAK,MAA4B,iBAAiB;AAAA,EAC5D;AAAA;AAAA,EAGA,MAAM,cACH,UAC8B;AAC9B,WAAO,KAAK,MAA4B,mBAAmB;AAAA,MACxD,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,EAAE,SAAS,CAAC;AAAA,IACpC,CAAC;AAAA,EACJ;AACH;;;AC3hBO,IAAM,cAAN,cAA0B,cAAc;AAAA;AAAA;AAAA;AAAA,EAI5C,MAAM,aAAa,KAA6C;AAC7D,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;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAW,WAAqC;AACnD,WAAO,KAAK,MAAe,YAAY,SAAS,EAAE;AAAA,EACrD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAc,SAAiD;AAClE,WAAO,KAAK,MAAe,YAAY;AAAA,MACpC,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,OAAO;AAAA,IAC/B,CAAC;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAc,WAAmB,SAAiD;AACrF,WAAO,KAAK,MAAe,YAAY,SAAS,IAAI;AAAA,MACjD,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,OAAO;AAAA,IAC/B,CAAC;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAc,WAAiD;AAClE,WAAO,KAAK,MAA2B,YAAY,SAAS,IAAI;AAAA,MAC7D,QAAQ;AAAA,IACX,CAAC;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eAAe,WAA6C;AAC/D,WAAO,KAAK,MAAuB,YAAY,SAAS,OAAO;AAAA,EAClE;AACH;;;ACxCO,IAAM,eAAN,cAA2B,cAAc;AAAA;AAAA,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;AAAA,MACT,KAAK,GAAG,aAAa,cAAc,IAAI,WAAW,KAAK,EAAE;AAAA,IAC5D;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,YAAY,KAAa,IAAY,kBAA+C;AACvF,UAAM,SAAS,IAAI,gBAAgB;AACnC,QAAI,iBAAkB,QAAO,OAAO,qBAAqB,MAAM;AAC/D,WAAO,KAAK;AAAA,MACT,KAAK,GAAG,cAAc,EAAE,GAAG,OAAO,SAAS,IAAI,IAAI,OAAO,SAAS,CAAC,KAAK,EAAE;AAAA,IAC9E;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,eAAe,KAAa,UAA+C;AAC9E,WAAO,KAAK,MAAgB,KAAK,GAAG,cAAc;AAAA,MAC/C,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,QAAQ;AAAA,IAChC,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,eACH,KACA,IACA,UACkB;AAClB,WAAO,KAAK,MAAgB,KAAK,GAAG,cAAc,EAAE,IAAI;AAAA,MACrD,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,QAAQ;AAAA,IAChC,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,eAAe,KAAa,IAA2B;AAC1D,WAAO,KAAK,MAAM,KAAK,GAAG,cAAc,EAAE,IAAI;AAAA,MAC3C,QAAQ;AAAA,IACX,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,qBAAqB,KAAa,YAAiD;AACtF,WAAO,KAAK,MAA0B,KAAK,GAAG,cAAc,UAAU,YAAY;AAAA,EACrF;AAAA;AAAA,EAGA,MAAM,uBACH,KACA,YACA,UAC0B;AAC1B,WAAO,KAAK,MAAwB,KAAK,GAAG,cAAc,UAAU,cAAc;AAAA,MAC/E,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,QAAQ;AAAA,IAChC,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,uBACH,KACA,YACA,YACA,UAC0B;AAC1B,WAAO,KAAK;AAAA,MACT,KAAK,GAAG,cAAc,UAAU,cAAc,UAAU;AAAA,MACxD;AAAA,QACG,QAAQ;AAAA,QACR,MAAM,KAAK,UAAU,QAAQ;AAAA,MAChC;AAAA,IACH;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,uBACH,KACA,YACA,YACc;AACd,WAAO,KAAK,MAAM,KAAK,GAAG,cAAc,UAAU,cAAc,UAAU,IAAI;AAAA,MAC3E,QAAQ;AAAA,IACX,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,kBACH,KACA,YACA,OAC8B;AAC9B,WAAO,KAAK,MAA4B,KAAK,GAAG,cAAc,UAAU,iBAAiB;AAAA,MACtF,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,KAAK;AAAA,IAC7B,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,kBACH,KACA,YACA,SACgC;AAChC,WAAO,KAAK;AAAA,MACT,KAAK,GAAG,cAAc,UAAU;AAAA,MAChC;AAAA,QACG,QAAQ;AAAA,QACR,MAAM,KAAK,UAAU,OAAO;AAAA,MAC/B;AAAA,IACH;AAAA,EACH;AAAA;AAAA,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;AAAA,MACT,KAAK,GAAG,mBAAmB,OAAO,SAAS,IAAI,IAAI,OAAO,SAAS,CAAC,KAAK,EAAE;AAAA,IAC9E;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,iBAAiB,KAAa,SAAyC;AAC1E,WAAO,KAAK,MAAqB,KAAK,GAAG,oBAAoB,OAAO,EAAE;AAAA,EACzE;AAAA;AAAA,EAGA,MAAM,oBAAoB,KAAa,OAAsD;AAC1F,WAAO,KAAK,MAAqB,KAAK,GAAG,oBAAoB;AAAA,MAC1D,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,KAAK;AAAA,IAC7B,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,oBACH,KACA,SACA,OACuB;AACvB,WAAO,KAAK,MAAqB,KAAK,GAAG,oBAAoB,OAAO,IAAI;AAAA,MACrE,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,KAAK;AAAA,IAC7B,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,oBACH,KACA,SACA,QACuB;AACvB,WAAO,KAAK,MAAqB,KAAK,GAAG,oBAAoB,OAAO,WAAW;AAAA,MAC5E,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,EAAE,oBAAoB,OAAO,CAAC;AAAA,IACtD,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,oBAAoB,KAAa,SAAgC;AACpE,WAAO,KAAK,MAAM,KAAK,GAAG,oBAAoB,OAAO,IAAI;AAAA,MACtD,QAAQ;AAAA,IACX,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,oBACH,KACA,SACA,YACA,QACc;AACd,WAAO,KAAK,MAAM,KAAK,GAAG,oBAAoB,OAAO,cAAc,UAAU,IAAI;AAAA,MAC9E,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,MAAM;AAAA,IAC9B,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,cAAc,KAA4D;AAC7E,WAAO,KAAK,MAA4C,KAAK,GAAG,uBAAuB;AAAA,EAC1F;AAAA;AAAA,EAGA,MAAM,aAAa,KAAa,IAAwC;AACrE,WAAO,KAAK,MAAyB,KAAK,GAAG,yBAAyB,EAAE,EAAE;AAAA,EAC7E;AAAA;AAAA,EAGA,MAAM,gBACH,KACA,WAC2B;AAC3B,WAAO,KAAK,MAAyB,KAAK,GAAG,yBAAyB;AAAA,MACnE,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,SAAS;AAAA,IACjC,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,gBACH,KACA,IACA,WAC2B;AAC3B,WAAO,KAAK,MAAyB,KAAK,GAAG,yBAAyB,EAAE,IAAI;AAAA,MACzE,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,SAAS;AAAA,IACjC,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,gBAAgB,KAAa,IAA2B;AAC3D,WAAO,KAAK,MAAM,KAAK,GAAG,yBAAyB,EAAE,IAAI;AAAA,MACtD,QAAQ;AAAA,IACX,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,kBACH,KACA,YACA,aAAsB,OACS;AAC/B,WAAO,KAAK,MAA6B,KAAK,GAAG,cAAc,UAAU,eAAe;AAAA,MACrF,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,EAAE,WAAW,CAAC;AAAA,IACtC,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,gBACH,KACA,YAC+C;AAC/C,WAAO,KAAK;AAAA,MACT,KAAK,GAAG,cAAc,UAAU;AAAA,MAChC;AAAA,QACG,QAAQ;AAAA,MACX;AAAA,IACH;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,eAAe,KAAa,YAAkD;AACjF,WAAO,KAAK,MAA2B,KAAK,GAAG,cAAc,UAAU,WAAW;AAAA,EACrF;AAAA;AAAA,EAGA,MAAM,oBAAoB,KAA4C;AACnE,WAAO,KAAK,MAA4B,KAAK,GAAG,wBAAwB;AAAA,EAC3E;AAAA;AAAA,EAGA,MAAM,wBACH,KACiF;AACjF,WAAO,KAAK;AAAA,MACT,KAAK,GAAG;AAAA,IACX;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,qBACH,KACA,YACA,SAC8B;AAC9B,WAAO,KAAK,MAA4B,KAAK,GAAG,cAAc,UAAU,gBAAgB;AAAA,MACrF,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,OAAO;AAAA,IAC/B,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,yBACH,KACA,YACgC;AAChC,WAAO,KAAK,MAA8B,KAAK,GAAG,cAAc,UAAU,gBAAgB;AAAA,MACvF,QAAQ;AAAA,IACX,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,uBAAuB,KAAa,YAAmD;AAC1F,WAAO,KAAK,MAA4B,KAAK,GAAG,cAAc,UAAU,gBAAgB;AAAA,MACrF,QAAQ;AAAA,IACX,CAAC;AAAA,EACJ;AACH;;;AC5UO,IAAM,WAAN,cAAuB,cAAc;AAAA;AAAA,EAEzC,MAAM,aAAa,KAAa,SAA6D;AAC1F,WAAO,KAAK,MAA4B,KAAK,GAAG,SAAS;AAAA,MACtD,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,OAAO;AAAA,IAC/B,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,cAAc,KAA0C;AAC3D,WAAO,KAAK,MAA0B,KAAK,GAAG,cAAc;AAAA,EAC/D;AAAA;AAAA,EAGA,MAAM,iBAAiB,KAAa,QAAgD;AACjF,WAAO,KAAK,MAA6B,KAAK,GAAG,oBAAoB,MAAM,iBAAiB;AAAA,EAC/F;AACH;;;ACvBO,IAAM,SAAN,cAAqB,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOvC,MAAM,cAAc,KAAa,SAAyD;AACvF,WAAO,KAAK,MAA0B,KAAK,GAAG,gBAAgB;AAAA,MAC3D,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,OAAO;AAAA,IAC/B,CAAC;AAAA,EACJ;AACH;;;ACEO,IAAM,WAAN,cAAuB,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA,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;AAAA,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;AAAA,IAC3D;AAEA,WAAO;AAAA,EACV;AAAA;AAAA,EAGA,MAAM,SAAS,KAAa,UAA2B,CAAC,GAAqC;AAC1F,UAAM,SAAS,KAAK,sBAAsB,SAAS,IAAI;AACvD,UAAM,cAAc,OAAO,SAAS;AACpC,WAAO,KAAK;AAAA,MACT,KAAK,GAAG,SAAS,cAAc,IAAI,WAAW,KAAK,EAAE;AAAA,IACxD;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,YAAY,KAAa,UAA2B,CAAC,GAAkB;AAC1E,UAAM,SAAS,KAAK,sBAAsB,SAAS,KAAK;AACxD,UAAM,cAAc,OAAO,SAAS;AACpC,UAAM,WAAW,MAAM,KAAK;AAAA,MACzB,KAAK,GAAG,gBAAgB,cAAc,IAAI,WAAW,KAAK,EAAE;AAAA,IAC/D;AACA,WAAO,SAAS,KAAK;AAAA,EACxB;AAAA;AAAA,EAGA,MAAM,WAAW,KAAa,QAAgB,SAAkB,SAAwB;AACrF,UAAM,WAAW,MAAM,KAAK,SAAS,KAAK,GAAG,UAAU,MAAM,kBAAkB,MAAM,EAAE;AACvF,WAAO,SAAS,KAAK;AAAA,EACxB;AAAA;AAAA,EAGA,MAAM,QAAQ,KAAa,IAA2B;AACnD,WAAO,KAAK,MAAY,KAAK,GAAG,UAAU,EAAE,EAAE;AAAA,EACjD;AAAA;AAAA,EAGA,MAAM,kBAAkB,KAAa,QAAyC;AAC3E,WAAO,KAAK,MAAsB,KAAK,GAAG,UAAU,MAAM,cAAc;AAAA,EAC3E;AAAA;AAAA,EAGA,MAAM,aAAa,KAAa,QAAgD;AAC7E,WAAO,KAAK,MAA6B,KAAK,GAAG,UAAU,MAAM,QAAQ;AAAA,EAC5E;AAAA;AAAA,EAGA,MAAM,cACH,KACA,QAC8D;AAC9D,WAAO,KAAK;AAAA,MACT,KAAK,GAAG,UAAU,MAAM;AAAA,IAC3B;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,sBAAsB,KAAgC;AACzD,WAAO,KAAK,MAAgB,KAAK,GAAG,uBAAuB;AAAA,EAC9D;AAAA;AAAA,EAGA,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;AAAA,MACT,KAAK,GAAG,8BAA8B,cAAc,IAAI,WAAW,KAAK,EAAE;AAAA,IAC7E;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,YAAY,KAAa,IAA2B;AACvD,WAAO,KAAK,MAAM,KAAK,GAAG,UAAU,EAAE,YAAY;AAAA,MAC/C,QAAQ;AAAA,IACX,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,cAAc,KAAa,IAA2B;AACzD,WAAO,KAAK,MAAM,KAAK,GAAG,UAAU,EAAE,cAAc;AAAA,MACjD,QAAQ;AAAA,IACX,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,WAAW,KAAa,MAAmC;AAC9D,WAAO,KAAK,MAAY,KAAK,GAAG,UAAU;AAAA,MACvC,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,IAAI;AAAA,IAC5B,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,WAAW,KAAa,IAAY,QAAgC;AACvE,WAAO,KAAK,MAAM,KAAK,GAAG,UAAU,EAAE,IAAI;AAAA,MACvC,QAAQ;AAAA,MACR,MAAM,SAAS,KAAK,UAAU,EAAE,OAAO,CAAC,IAAI;AAAA,IAC/C,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,WAAW,KAAa,IAAY,MAA4C;AACnF,WAAO,KAAK,MAAY,KAAK,GAAG,UAAU,EAAE,IAAI;AAAA,MAC7C,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,IAAI;AAAA,IAC5B,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,eACH,KACA,IACA,OACwC;AACxC,WAAO,KAAK,MAAsC,KAAK,GAAG,UAAU,EAAE,SAAS;AAAA,MAC5E,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,EAAE,MAAM,CAAC;AAAA,IACjC,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,wBACH,KACA,IACA,eACgD;AAChD,WAAO,KAAK;AAAA,MACT,KAAK,GAAG,UAAU,EAAE;AAAA,MACpB;AAAA,QACG,QAAQ;AAAA,QACR,MAAM,KAAK,UAAU,EAAE,cAAc,CAAC;AAAA,MACzC;AAAA,IACH;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,cAAc,KAAa,IAAY,cAAuC;AACjF,UAAM,SAAS,IAAI,gBAAgB;AACnC,QAAI,iBAAiB,QAAW;AAC7B,aAAO,OAAO,iBAAiB,aAAa,SAAS,CAAC;AAAA,IACzD;AACA,WAAO,KAAK;AAAA,MACT,KAAK,GAAG,UAAU,EAAE,aAAa,OAAO,SAAS,IAAI,IAAI,OAAO,SAAS,CAAC,KAAK,EAAE;AAAA,MACjF;AAAA,QACG,QAAQ;AAAA,MACX;AAAA,IACH;AAAA,EACH;AAAA;AAAA,EAGA,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;AAAA,MACT,KAAK,GAAG,UAAU,EAAE,YAAY,OAAO,SAAS,IAAI,IAAI,OAAO,SAAS,CAAC,KAAK,EAAE;AAAA,IACnF;AAAA,EACH;AAAA;AAAA,EAGA,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;AAAA,MACT,KAAK,GAAG,UAAU,MAAM,eAAe,MAAM,aAAa,OAAO,SAAS,CAAC;AAAA,IAC9E;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,aAAa,KAAa,QAAwC;AACrE,WAAO,KAAK,MAAqB,KAAK,GAAG,UAAU,MAAM,QAAQ;AAAA,EACpE;AAAA;AAAA,EAGA,MAAM,qBACH,KACA,QACA,eAC8B;AAC9B,WAAO,KAAK,MAAM,KAAK,GAAG,UAAU,MAAM,kBAAkB;AAAA,MACzD,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,EAAE,eAAe,OAAO,CAAC;AAAA,IACjD,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,qBACH,KACA,QACA,SACA,WAgBA;AACA,WAAO,KAAK,MAAM,KAAK,GAAG,UAAU,MAAM,2BAA2B;AAAA,MAClE,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU;AAAA,QAClB;AAAA,QACA,YAAY;AAAA,MACf,CAAC;AAAA,IACJ,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,YACH,KACA,QACA,aACA,QAC6C;AAC7C,WAAO,KAAK;AAAA,MACT,KAAK,GAAG,UAAU,MAAM,aAAa,WAAW;AAAA,MAChD;AAAA,QACG,QAAQ;AAAA,QACR,MAAM,KAAK,UAAU,EAAE,OAAO,CAAC;AAAA,MAClC;AAAA,IACH;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,mBAAmB,KAAa,UAAiC;AACpE,WAAO,KAAK,MAAY,KAAK,GAAG,aAAa;AAAA,MAC1C,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,EAAE,SAAS,CAAC;AAAA,IACpC,CAAC;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBAAgB,KAAa,QAAgB,SAAuC;AACvF,WAAO,KAAK,MAAmB,KAAK,GAAG,UAAU,MAAM,aAAa;AAAA,MACjE,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,EAAE,QAAQ,CAAC;AAAA,IACnC,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,uBACH,KACA,QAOD;AACC,WAAO,KAAK,MAAM,KAAK,GAAG,UAAU,MAAM,mBAAmB;AAAA,EAChE;AAAA;AAAA,EAGA,MAAM,qBACH,KACA,QACA,MAsBA;AACA,WAAO,KAAK,MAAM,KAAK,GAAG,aAAa,MAAM,kCAAkC;AAAA,MAC5E,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU;AAAA,QAClB,OAAO,KAAK,SAAS;AAAA,QACrB,UAAU,KAAK;AAAA,MAClB,CAAC;AAAA,IACJ,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,cAAc,KAAmC;AACpD,WAAO,KAAK,MAAmB,KAAK,GAAG,cAAc;AAAA,EACxD;AAAA;AAAA,EAGA,MAAM,aAAa,KAAa,IAAgC;AAC7D,WAAO,KAAK,MAAiB,KAAK,GAAG,gBAAgB,EAAE,EAAE;AAAA,EAC5D;AAAA;AAAA,EAGA,MAAM,mBAAmB,KAAa,MAAkC;AACrE,WAAO,KAAK,MAAiB,KAAK,GAAG,gBAAgB,IAAI,EAAE;AAAA,EAC9D;AAAA;AAAA,EAGA,MAAM,gBAAgB,KAAa,OAA8C;AAC9E,WAAO,KAAK,MAAiB,KAAK,GAAG,gBAAgB;AAAA,MAClD,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,KAAK;AAAA,IAC7B,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,gBACH,KACA,IACA,OACmB;AACnB,WAAO,KAAK,MAAiB,KAAK,GAAG,gBAAgB,EAAE,IAAI;AAAA,MACxD,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,KAAK;AAAA,IAC7B,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,gBAAgB,KAAa,IAA2B;AAC3D,WAAO,KAAK,MAAY,KAAK,GAAG,gBAAgB,EAAE,IAAI;AAAA,MACnD,QAAQ;AAAA,IACX,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,iBAAiB,KAAgC;AACpD,WAAO,KAAK,MAAgB,KAAK,GAAG,wBAAwB;AAAA,EAC/D;AAAA;AAAA,EAGA,MAAM,eAAe,KAAoC;AACtD,WAAO,KAAK,MAAoB,KAAK,GAAG,eAAe;AAAA,EAC1D;AAAA;AAAA,EAGA,MAAM,cAAc,KAAa,IAAiC;AAC/D,WAAO,KAAK,MAAkB,KAAK,GAAG,iBAAiB,EAAE,EAAE;AAAA,EAC9D;AAAA;AAAA,EAGA,MAAM,oBAAoB,KAAa,MAAmC;AACvE,WAAO,KAAK,MAAkB,KAAK,GAAG,yBAAyB,IAAI,EAAE;AAAA,EACxE;AAAA;AAAA,EAGA,MAAM,iBAAiB,KAAa,QAAiD;AAClF,WAAO,KAAK,MAAkB,KAAK,GAAG,iBAAiB;AAAA,MACpD,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,MAAM;AAAA,IAC9B,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,iBACH,KACA,IACA,QACoB;AACpB,WAAO,KAAK,MAAkB,KAAK,GAAG,iBAAiB,EAAE,IAAI;AAAA,MAC1D,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,MAAM;AAAA,IAC9B,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,iBAAiB,KAAa,IAA2B;AAC5D,WAAO,KAAK,MAAY,KAAK,GAAG,iBAAiB,EAAE,IAAI;AAAA,MACpD,QAAQ;AAAA,IACX,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,kBAAkB,KAAa,QAAsC;AACxE,WAAO,KAAK,MAAmB,KAAK,GAAG,UAAU,MAAM,cAAc;AAAA,EACxE;AACH;;;AClbO,IAAM,gBAAN,cAA4B,cAAc;AAAA,EAC9C,MAAM,oBACH,KACA,MACoC;AACpC,WAAO,KAAK;AAAA,MACT,KAAK,GAAG;AAAA,MACR;AAAA,QACG,QAAQ;AAAA,QACR,MAAM,KAAK,UAAU,IAAI;AAAA,MAC5B;AAAA,IACH;AAAA,EACH;AAAA,EAEA,MAAM,qBAAqB,KAAkD;AAC1E,WAAO,KAAK;AAAA,MACT,KAAK,GAAG;AAAA,MACR;AAAA,QACG,QAAQ;AAAA,MACX;AAAA,IACH;AAAA,EACH;AAAA,EAEA,MAAM,oBAAoB,KAAkD;AACzE,WAAO,KAAK,MAAkC,KAAK,GAAG,oCAAoC;AAAA,EAC7F;AAAA,EAEA,MAAM,qBAAqB,KAAkD;AAC1E,WAAO,KAAK;AAAA,MACT,KAAK,GAAG;AAAA,MACR;AAAA,QACG,QAAQ;AAAA,MACX;AAAA,IACH;AAAA,EACH;AAAA,EAEA,MAAM,kBAAkB,KAAkD;AACvE,WAAO,KAAK,MAAkC,KAAK,GAAG,uCAAuC;AAAA,MAC1F,QAAQ;AAAA,IACX,CAAC;AAAA,EACJ;AAAA,EAEA,MAAM,iBAAiB,KAAkD;AACtE,WAAO,KAAK,MAAkC,KAAK,GAAG,sCAAsC;AAAA,MACzF,QAAQ;AAAA,IACX,CAAC;AAAA,EACJ;AAAA,EAEA,MAAM,iBAAiB,KAA0C;AAC9D,WAAO,KAAK,MAA0B,KAAK,GAAG,sCAAsC;AAAA,MACjF,QAAQ;AAAA,IACX,CAAC;AAAA,EACJ;AAAA,EAEA,MAAM,qBACH,KACA,QACkC;AAClC,UAAM,KAAK,IAAI,gBAAgB;AAC/B,QAAI,QAAQ,OAAQ,IAAG,IAAI,UAAU,OAAO,MAAM;AAClD,QAAI,QAAQ,MAAO,IAAG,IAAI,SAAS,OAAO,OAAO,KAAK,CAAC;AACvD,UAAM,QAAQ,GAAG,SAAS;AAC1B,WAAO,KAAK;AAAA,MACT,KAAK,GAAG,qCAAqC,QAAQ,IAAI,KAAK,KAAK,EAAE;AAAA,IACxE;AAAA,EACH;AAAA,EAEA,MAAM,oBACH,KACA,SACA,QACiC;AACjC,UAAM,KAAK,IAAI,gBAAgB,EAAE,UAAU,QAAQ,CAAC;AACpD,QAAI,QAAQ,OAAQ,IAAG,IAAI,UAAU,OAAO,MAAM;AAClD,QAAI,QAAQ,MAAO,IAAG,IAAI,SAAS,OAAO,OAAO,KAAK,CAAC;AACvD,WAAO,KAAK;AAAA,MACT,KAAK,GAAG,qCAAqC,GAAG,SAAS,CAAC;AAAA,IAC7D;AAAA,EACH;AACH;;;ACrHO,IAAM,oBAAN,cAAgC,cAAc;AAAA;AAAA;AAAA;AAAA,EAIlD,MAAM,kBAAkB,KAAuC;AAC5D,WAAO,KAAK,MAAuB,KAAK,GAAG,kBAAkB;AAAA,EAChE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,iBAAiB,KAAa,WAA2C;AAC5E,WAAO,KAAK,MAAqB,KAAK,GAAG,oBAAoB,SAAS,EAAE;AAAA,EAC3E;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,oBAAoB,KAAa,MAAqD;AACzF,WAAO,KAAK,MAAqB,KAAK,GAAG,oBAAoB;AAAA,MAC1D,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,IAAI;AAAA,IAC5B,CAAC;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,oBACH,KACA,WACA,MACuB;AACvB,WAAO,KAAK,MAAqB,KAAK,GAAG,oBAAoB,SAAS,IAAI;AAAA,MACvE,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,IAAI;AAAA,IAC5B,CAAC;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,oBAAoB,KAAa,WAAgD;AACpF,WAAO,KAAK,MAA0B,KAAK,GAAG,oBAAoB,SAAS,IAAI;AAAA,MAC5E,QAAQ;AAAA,IACX,CAAC;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,oBAAoB,KAAa,WAA2C;AAC/E,WAAO,KAAK,MAAqB,KAAK,GAAG,oBAAoB,SAAS,WAAW;AAAA,MAC9E,QAAQ;AAAA,IACX,CAAC;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,qBAAqB,KAAa,WAA2C;AAChF,WAAO,KAAK,MAAqB,KAAK,GAAG,oBAAoB,SAAS,YAAY;AAAA,MAC/E,QAAQ;AAAA,IACX,CAAC;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,iBACH,KACA,WACA,MACoB;AACpB,WAAO,KAAK,MAAkB,KAAK,GAAG,oBAAoB,SAAS,UAAU;AAAA,MAC1E,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,IAAI;AAAA,IAC5B,CAAC;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,iBACH,KACA,WACA,QACA,MACoB;AACpB,WAAO,KAAK,MAAkB,KAAK,GAAG,oBAAoB,SAAS,UAAU,MAAM,IAAI;AAAA,MACpF,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,IAAI;AAAA,IAC5B,CAAC;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,iBACH,KACA,WACA,QAC4B;AAC5B,WAAO,KAAK;AAAA,MACT,KAAK,GAAG,oBAAoB,SAAS,UAAU,MAAM;AAAA,MACrD;AAAA,QACG,QAAQ;AAAA,MACX;AAAA,IACH;AAAA,EACH;AACH;;;AC9GO,IAAM,eAAN,cAA2B,cAAc;AAAA;AAAA,EAE7C,MAAM,aAAa,KAAa,SAAuD;AACpF,UAAM,SAAS,IAAI,gBAAgB;AACnC,QAAI,SAAS,aAAa,QAAW;AAClC,aAAO,OAAO,YAAY,QAAQ,SAAS,SAAS,CAAC;AAAA,IACxD;AACA,UAAM,cAAc,OAAO,SAAS;AACpC,WAAO,KAAK,MAAkB,KAAK,GAAG,cAAc,cAAc,IAAI,WAAW,KAAK,EAAE,EAAE;AAAA,EAC7F;AAAA;AAAA,EAGA,MAAM,YAAY,KAAa,IAA+B;AAC3D,WAAO,KAAK,MAAgB,KAAK,GAAG,eAAe,EAAE,EAAE;AAAA,EAC1D;AAAA;AAAA,EAGA,MAAM,kBAAkB,KAAa,MAAiC;AACnE,WAAO,KAAK,MAAgB,KAAK,GAAG,oBAAoB,IAAI,EAAE;AAAA,EACjE;AAAA;AAAA,EAGA,MAAM,eAAe,KAAa,UAA+C;AAC9E,WAAO,KAAK,MAAgB,KAAK,GAAG,eAAe;AAAA,MAChD,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,QAAQ;AAAA,IAChC,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,eACH,KACA,IACA,UACkB;AAClB,WAAO,KAAK,MAAgB,KAAK,GAAG,eAAe,EAAE,IAAI;AAAA,MACtD,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,QAAQ;AAAA,IAChC,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,eAAe,KAAa,IAA2B;AAC1D,WAAO,KAAK,MAAM,KAAK,GAAG,eAAe,EAAE,IAAI;AAAA,MAC5C,QAAQ;AAAA,IACX,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,gBAAgB,KAAa,IAAyC;AACzE,WAAO,KAAK,MAA0B,KAAK,GAAG,eAAe,EAAE,YAAY;AAAA,MACxE,QAAQ;AAAA,IACX,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,kBAAkB,KAAa,IAAyC;AAC3E,WAAO,KAAK,MAA0B,KAAK,GAAG,eAAe,EAAE,cAAc;AAAA,MAC1E,QAAQ;AAAA,IACX,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,cACH,KACA,IACA,MACkB;AAClB,WAAO,KAAK,MAAgB,KAAK,GAAG,eAAe,EAAE,UAAU;AAAA,MAC5D,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,IAAI;AAAA,IAC5B,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,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;AAAA,MACT,KAAK,GAAG,eAAe,UAAU,WAAW,QAAQ,SAAS,IAAI,IAAI,OAAO,SAAS,CAAC,KAAK,EAAE;AAAA,IAChG;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,cAAc,KAAa,UAAuC;AACrE,WAAO,KAAK,MAAkB,KAAK,GAAG,uBAAuB,QAAQ,EAAE;AAAA,EAC1E;AAAA;AAAA,EAGA,MAAM,iBACH,KACA,YACA,QACoB;AACpB,WAAO,KAAK,MAAkB,KAAK,GAAG,eAAe,UAAU,YAAY;AAAA,MACxE,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,MAAM;AAAA,IAC9B,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,iBACH,KACA,YACA,UACA,QACoB;AACpB,WAAO,KAAK,MAAkB,KAAK,GAAG,eAAe,UAAU,YAAY,QAAQ,IAAI;AAAA,MACpF,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,MAAM;AAAA,IAC9B,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,iBAAiB,KAAa,YAAoB,UAAiC;AACtF,WAAO,KAAK,MAAM,KAAK,GAAG,eAAe,UAAU,YAAY,QAAQ,IAAI;AAAA,MACxE,QAAQ;AAAA,IACX,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,qBACH,KACA,YACA,UAC4B;AAC5B,WAAO,KAAK;AAAA,MACT,KAAK,GAAG,eAAe,UAAU,YAAY,QAAQ;AAAA,IACxD;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,iBACH,KACA,YACA,YACA,MAGoB;AACpB,WAAO,KAAK,MAAkB,KAAK,GAAG,eAAe,UAAU,WAAW,UAAU,IAAI;AAAA,MACrF,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU;AAAA,QAClB;AAAA,QACA,aAAa,KAAK;AAAA,MACrB,CAAC;AAAA,IACJ,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,iBACH,KACA,YACA,WACA,aACmE;AACnE,WAAO,KAAK,MAAM,KAAK,GAAG,eAAe,UAAU,WAAW,SAAS,iBAAiB;AAAA,MACrF,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,EAAE,YAAyB,CAAC;AAAA,IACpD,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,oBACH,KACA,YACA,WAMA;AACA,WAAO,KAAK,MAAM,KAAK,GAAG,eAAe,UAAU,WAAW,SAAS,eAAe;AAAA,EACzF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,qBACH,KACA,MACA,WACwD;AACxD,WAAO,KAAK,MAAM,KAAK,GAAG,6BAA6B;AAAA,MACpD,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,EAAE,MAAM,UAAU,CAAC;AAAA,IAC3C,CAAC;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,sBACH,KACA,UAC4C;AAC5C,WAAO,KAAK,MAAM,KAAK,GAAG,8CAA8C,QAAQ,EAAE;AAAA,EACrF;AACH;;;ACpNO,IAAM,iBAAN,cAA6B,cAAc;AAAA;AAAA;AAAA;AAAA,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;AAAA,MACT,KAAK,GAAG,gCAAgC,OAAO,SAAS,IAAI,IAAI,OAAO,SAAS,CAAC,KAAK,EAAE;AAAA,IAC3F;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAc,KAAa,OAAoC;AAClE,WAAO,KAAK,MAAkB,KAAK,GAAG,iCAAiC,KAAK,EAAE;AAAA,EACjF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,oBAAoB,KAAa,MAAmC;AACvE,WAAO,KAAK,MAAkB,KAAK,GAAG,sCAAsC,IAAI,EAAE;AAAA,EACrF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,iBAAiB,KAAa,MAAoD;AACrF,WAAO,KAAK,MAAkB,KAAK,GAAG,iCAAiC;AAAA,MACpE,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,IAAI;AAAA,IAC5B,CAAC;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,iBACH,KACA,OACA,MACoB;AACpB,WAAO,KAAK,MAAkB,KAAK,GAAG,iCAAiC,KAAK,IAAI;AAAA,MAC7E,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,IAAI;AAAA,IAC5B,CAAC;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,iBAAiB,KAAa,OAA8B;AAC/D,WAAO,KAAK,MAAM,KAAK,GAAG,iCAAiC,KAAK,IAAI;AAAA,MACjE,QAAQ;AAAA,IACX,CAAC;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,sBAAsB,KAAa,OAA8B;AACpE,WAAO,KAAK,MAAM,KAAK,GAAG,iCAAiC,KAAK,sBAAsB;AAAA,MACnF,QAAQ;AAAA,IACX,CAAC;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,4BACH,KACA,OACkD;AAClD,WAAO,KAAK;AAAA,MACT,KAAK,GAAG,iCAAiC,KAAK;AAAA,MAC9C;AAAA,QACG,QAAQ;AAAA,MACX;AAAA,IACH;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,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;AAAA,MACT,KAAK,GAAG,iCAAiC,KAAK,WAAW,OAAO,SAAS,IAAI,IAAI,OAAO,SAAS,CAAC,KAAK,EAAE;AAAA,IAC5G;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,iBAAiB,KAA0C;AAC9D,WAAO,KAAK,MAA0B,KAAK,GAAG,iBAAiB;AAAA,EAClE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,iBAAiB,KAAa,cAAqC;AACtE,WAAO,KAAK,MAAM,KAAK,GAAG,mBAAmB,YAAY,IAAI;AAAA,MAC1D,QAAQ;AAAA,IACX,CAAC;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,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;AAAA,MACT,KAAK,GAAG,iCAAiC,KAAK,UAAU,OAAO,SAAS,IAAI,IAAI,OAAO,SAAS,CAAC,KAAK,EAAE;AAAA,IAC3G;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,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;AAAA,MACT,KAAK,GAAG,iCAAiC,KAAK,YAAY,OAAO,SAAS,IAAI,IAAI,OAAO,SAAS,CAAC,KAAK,EAAE;AAAA,IAC7G;AAAA,EACH;AACH;;;AC9KO,IAAM,eAAN,cAA2B,cAAc;AAAA;AAAA;AAAA;AAAA,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;AAAA,MACT,KAAK,GAAG,8BAA8B,OAAO,SAAS,IAAI,IAAI,OAAO,SAAS,CAAC,KAAK,EAAE;AAAA,IACzF;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAY,KAAa,OAAkC;AAC9D,WAAO,KAAK,MAAgB,KAAK,GAAG,+BAA+B,KAAK,EAAE;AAAA,EAC7E;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eAAe,KAAa,MAAgD;AAC/E,WAAO,KAAK,MAAgB,KAAK,GAAG,+BAA+B;AAAA,MAChE,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,IAAI;AAAA,IAC5B,CAAC;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eACH,KACA,OACA,MACkB;AAClB,WAAO,KAAK,MAAgB,KAAK,GAAG,+BAA+B,KAAK,IAAI;AAAA,MACzE,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,IAAI;AAAA,IAC5B,CAAC;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eAAe,KAAa,OAA8B;AAC7D,WAAO,KAAK,MAAM,KAAK,GAAG,+BAA+B,KAAK,IAAI;AAAA,MAC/D,QAAQ;AAAA,IACX,CAAC;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,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;AAAA,MACT,KAAK,GAAG,+BAA+B,KAAK,WAAW,OAAO,SAAS,IAAI,IAAI,OAAO,SAAS,CAAC,KAAK,EAAE;AAAA,IAC1G;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,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;AAAA,MACT,KAAK,GAAG,+BAA+B,KAAK,iBAAiB,OAAO,SAAS,IAAI,IAAI,OAAO,SAAS,CAAC,KAAK,EAAE;AAAA,IAChH;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,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;AAAA,MACT,KAAK,GAAG,+BAA+B,KAAK,YAAY,OAAO,SAAS,IAAI,IAAI,OAAO,SAAS,CAAC,KAAK,EAAE;AAAA,IAC3G;AAAA,EACH;AACH;;;AChHO,IAAM,YAAN,cAAwB,cAAc;AAAA;AAAA,EAE1C,MAAM,cACH,KACA,QACsC;AACtC,UAAM,QAAQ,IAAI,gBAAgB;AAClC,QAAI,QAAQ,SAAS,OAAW,OAAM,IAAI,QAAQ,OAAO,OAAO,IAAI,CAAC;AACrE,QAAI,QAAQ,aAAa,OAAW,OAAM,IAAI,YAAY,OAAO,OAAO,QAAQ,CAAC;AACjF,UAAM,KAAK,MAAM,SAAS,IAAI,IAAI,MAAM,SAAS,CAAC,KAAK;AACvD,WAAO,KAAK,MAAoC,KAAK,GAAG,eAAe,EAAE,EAAE;AAAA,EAC9E;AAAA;AAAA,EAGA,MAAM,oBAAoB,KAAmD;AAC1E,WAAO,KAAK,MAAmC,KAAK,GAAG,gCAAgC;AAAA,EAC1F;AAAA;AAAA,EAGA,MAAM,iBACH,KACA,QAWqB;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,UAAW,cAAa,OAAO,aAAa,OAAO,UAAU,SAAS,CAAC;AAClF,QAAI,OAAO,WAAY,cAAa,OAAO,cAAc,OAAO,WAAW,SAAS,CAAC;AACrF,QAAI,OAAO;AACR,mBAAa,OAAO,iBAAiB,OAAO,cAAc,SAAS,CAAC;AACvE,QAAI,OAAO,gBAAiB,cAAa,OAAO,mBAAmB,MAAM;AACzE,WAAO,KAAK,MAAmB,KAAK,GAAG,uBAAuB,aAAa,SAAS,CAAC,EAAE;AAAA,EAC1F;AAAA;AAAA,EAGA,MAAM,aAAa,KAAa,IAAgC;AAC7D,WAAO,KAAK,MAAiB,KAAK,GAAG,gBAAgB,EAAE,EAAE;AAAA,EAC5D;AAAA;AAAA,EAGA,MAAM,gBAAgB,KAAa,MAA6C;AAC7E,WAAO,KAAK,MAAiB,KAAK,GAAG,gBAAgB;AAAA,MAClD,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,IAAI;AAAA,IAC5B,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,gBACH,KACA,IACA,MACmB;AACnB,WAAO,KAAK,MAAiB,KAAK,GAAG,gBAAgB,EAAE,IAAI;AAAA,MACxD,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,IAAI;AAAA,IAC5B,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,gBAAgB,KAAa,IAA2B;AAC3D,WAAO,KAAK,MAAM,KAAK,GAAG,gBAAgB,EAAE,IAAI;AAAA,MAC7C,QAAQ;AAAA,IACX,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,kBAAkB,KAAa,SAAgD;AAClF,WAAO,KAAK,MAA0B,KAAK,GAAG,wBAAwB;AAAA,MACnE,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,OAAO;AAAA,IAC/B,CAAC;AAAA,EACJ;AAAA;AAAA,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;AAAA,MACT,KAAK,GAAG,gBAAgB,OAAO,SAAS,IAAI,IAAI,OAAO,SAAS,CAAC,KAAK,EAAE;AAAA,IAC3E;AAAA,EACH;AAAA;AAAA,EAGA,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;AAAA,MACT,KAAK,GAAG,0BAA0B,OAAO,SAAS,IAAI,IAAI,OAAO,SAAS,CAAC,KAAK,EAAE;AAAA,IACrF;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,gBACH,KACA,SACiC;AACjC,WAAO,KAAK,MAA+B,KAAK,GAAG,8BAA8B;AAAA,MAC9E,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,OAAO;AAAA,IAC/B,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,YACH,KACA,UAA+B,CAAC,GACI;AACpC,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,MAAO,QAAO,OAAO,SAAS,QAAQ,KAAK;AAEvD,WAAO,KAAK;AAAA,MACT,KAAK,GAAG,YAAY,OAAO,SAAS,IAAI,IAAI,OAAO,SAAS,CAAC,KAAK,EAAE;AAAA,IACvE;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,WAAW,KAAa,IAA8B;AACzD,WAAO,KAAK,MAAe,KAAK,GAAG,aAAa,EAAE,EAAE;AAAA,EACvD;AAAA;AAAA,EAGA,MAAM,cAAc,KAAa,SAAiD;AAC/E,WAAO,KAAK,MAAe,KAAK,GAAG,aAAa;AAAA,MAC7C,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,OAAO;AAAA,IAC/B,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,cAAc,KAAa,IAAY,SAAiD;AAC3F,WAAO,KAAK,MAAe,KAAK,GAAG,aAAa,EAAE,IAAI;AAAA,MACnD,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,OAAO;AAAA,IAC/B,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,cAAc,KAAa,IAA2B;AACzD,WAAO,KAAK,MAAM,KAAK,GAAG,aAAa,EAAE,IAAI;AAAA,MAC1C,QAAQ;AAAA,IACX,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,WACH,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,aAAa,EAAE,QAAQ,aAAa,SAAS,CAAC,IAAI;AAAA,MACzE,QAAQ;AAAA,IACX,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,eACH,KACA,UAOI,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,UAAW,QAAO,OAAO,aAAa,QAAQ,UAAU,SAAS,CAAC;AAC9E,QAAI,QAAQ,OAAQ,QAAO,OAAO,UAAU,QAAQ,MAAM;AAE1D,WAAO,KAAK;AAAA,MACT,KAAK,GAAG,kBAAkB,OAAO,SAAS,CAAC;AAAA,IAC9C;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,iBACH,KACA,WACuE;AACvE,WAAO,KAAK,MAAM,KAAK,GAAG,aAAa,SAAS,SAAS;AAAA,MACtD,QAAQ;AAAA,IACX,CAAC;AAAA,EACJ;AACH;;;ACjQO,IAAM,cAAN,cAA0B,cAAc;AAAA;AAAA;AAAA;AAAA,EAI5C,MAAM,qBAAwD;AAC3D,WAAO,KAAK,MAAgC,mBAAmB;AAAA,EAClE;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,2BAA8D;AACjE,WAAO,KAAK,MAAgC,0BAA0B;AAAA,EACzE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,iBAAiB,MAA0C;AAC9D,WAAO,KAAK,MAAyB,YAAY,IAAI,EAAE;AAAA,EAC1D;AACH;;;ACDO,IAAM,qBAAN,cAAiC,cAAc;AAAA;AAAA;AAAA;AAAA,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;AAAA,MACT,KAAK,GAAG,oCAAoC,OAAO,SAAS,IAAI,IAAI,OAAO,SAAS,CAAC,KAAK,EAAE;AAAA,IAC/F;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,kBAAkB,KAAa,cAA+C;AACjF,WAAO,KAAK;AAAA,MACT,KAAK,GAAG,qCAAqC,YAAY;AAAA,IAC5D;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,wBAAwB,KAAa,MAAuC;AAC/E,WAAO,KAAK,MAAsB,KAAK,GAAG,0CAA0C,IAAI,EAAE;AAAA,EAC7F;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,qBACH,KACA,MACwB;AACxB,WAAO,KAAK,MAAsB,KAAK,GAAG,qCAAqC;AAAA,MAC5E,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,IAAI;AAAA,IAC5B,CAAC;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,qBACH,KACA,cACA,MACwB;AACxB,WAAO,KAAK;AAAA,MACT,KAAK,GAAG,qCAAqC,YAAY;AAAA,MACzD;AAAA,QACG,QAAQ;AAAA,QACR,MAAM,KAAK,UAAU,IAAI;AAAA,MAC5B;AAAA,IACH;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,qBAAqB,KAAa,cAAqC;AAC1E,WAAO,KAAK,MAAM,KAAK,GAAG,qCAAqC,YAAY,IAAI;AAAA,MAC5E,QAAQ;AAAA,IACX,CAAC;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,mBACH,KACA,cAC+C;AAC/C,WAAO,KAAK,MAAM,KAAK,GAAG,qCAAqC,YAAY,SAAS;AAAA,MACjF,QAAQ;AAAA,IACX,CAAC;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,mBACH,KACA,cACA,MAC4B;AAC5B,WAAO,KAAK;AAAA,MACT,KAAK,GAAG,qCAAqC,YAAY;AAAA,MACzD;AAAA,QACG,QAAQ;AAAA,QACR,MAAM,KAAK,UAAU,IAAI;AAAA,MAC5B;AAAA,IACH;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,wBACH,KACA,cACA,MAC4B;AAC5B,WAAO,KAAK;AAAA,MACT,KAAK,GAAG,qCAAqC,YAAY;AAAA,MACzD;AAAA,QACG,QAAQ;AAAA,QACR,MAAM,KAAK,UAAU,IAAI;AAAA,MAC5B;AAAA,IACH;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,oBACH,KACA,cACA,MAC4B;AAC5B,WAAO,KAAK;AAAA,MACT,KAAK,GAAG,qCAAqC,YAAY;AAAA,MACzD;AAAA,QACG,QAAQ;AAAA,QACR,MAAM,KAAK,UAAU,IAAI;AAAA,MAC5B;AAAA,IACH;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,kBACH,KACA,cACA,MAC4B;AAC5B,WAAO,KAAK,MAAM,KAAK,GAAG,qCAAqC,YAAY,aAAa;AAAA,MACrF,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,IAAI;AAAA,IAC5B,CAAC;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,oBACH,KACA,cACA,MAC4B;AAC5B,WAAO,KAAK,MAAM,KAAK,GAAG,qCAAqC,YAAY,eAAe;AAAA,MACvF,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,IAAI;AAAA,IAC5B,CAAC;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,oBACH,KACA,cACA,MAC4B;AAC5B,WAAO,KAAK;AAAA,MACT,KAAK,GAAG,qCAAqC,YAAY;AAAA,MACzD;AAAA,QACG,QAAQ;AAAA,QACR,MAAM,KAAK,UAAU,IAAI;AAAA,MAC5B;AAAA,IACH;AAAA,EACH;AAAA;AAAA,EAIA,MAAM,qBACH,KACA,cACA,MACgC;AAChC,UAAM,WAAW,IAAI,SAAS;AAC9B,aAAS,OAAO,QAAQ,IAAI;AAC5B,WAAO,KAAK;AAAA,MACT,KAAK,GAAG,qCAAqC,YAAY;AAAA,MACzD,EAAE,QAAQ,QAAQ,MAAM,SAAS;AAAA,IACpC;AAAA,EACH;AAAA,EAEA,MAAM,yBACH,KACA,cAC+B;AAC/B,WAAO,KAAK;AAAA,MACT,KAAK,GAAG,qCAAqC,YAAY;AAAA,IAC5D;AAAA,EACH;AAAA,EAEA,MAAM,4BACH,KACA,cACA,MAC+B;AAC/B,WAAO,KAAK;AAAA,MACT,KAAK,GAAG,qCAAqC,YAAY;AAAA,MACzD,EAAE,QAAQ,OAAO,MAAM,KAAK,UAAU,IAAI,EAAE;AAAA,IAC/C;AAAA,EACH;AAAA,EAEA,MAAM,mBACH,KACA,cACA,MACA,SACkB;AAClB,UAAM,WAAW,IAAI,SAAS;AAC9B,aAAS,OAAO,QAAQ,IAAI;AAC5B,QAAI,SAAS;AACV,eAAS,OAAO,oBAAoB,QAAQ,gBAAgB;AAC5D,UAAI,QAAQ,iBAAiB;AAC1B,iBAAS,OAAO,mBAAmB,QAAQ,eAAe;AAAA,MAC7D;AAAA,IACH;AACA,WAAO,KAAK;AAAA,MACT,KAAK,GAAG,qCAAqC,YAAY;AAAA,MACzD,EAAE,QAAQ,QAAQ,MAAM,SAAS;AAAA,IACpC;AAAA,EACH;AAAA,EAEA,MAAM,qBACH,KACA,cACA,QAAQ,IAC2B;AACnC,WAAO,KAAK;AAAA,MACT,KAAK,GAAG,qCAAqC,YAAY,0BAA0B,KAAK;AAAA,IAC3F;AAAA,EACH;AAAA,EAEA,MAAM,yBACH,KACA,cACA,OACA,QAAQ,KACwB;AAChC,WAAO,KAAK;AAAA,MACT,KAAK,GAAG,qCAAqC,YAAY,oBAAoB,KAAK,gBAAgB,KAAK;AAAA,IAC1G;AAAA,EACH;AAAA;AAAA,EAIA,MAAM,sBACH,KACA,cACA,QAC6C;AAC7C,UAAM,QAAQ,IAAI,gBAAgB;AAClC,QAAI,QAAQ,SAAS,OAAW,OAAM,IAAI,QAAQ,OAAO,OAAO,IAAI,CAAC;AACrE,QAAI,QAAQ,aAAa,OAAW,OAAM,IAAI,YAAY,OAAO,OAAO,QAAQ,CAAC;AACjF,QAAI,QAAQ,QAAQ,KAAK,EAAG,OAAM,IAAI,UAAU,OAAO,OAAO,KAAK,CAAC;AACpE,UAAM,KAAK,MAAM,SAAS,IAAI,IAAI,MAAM,SAAS,CAAC,KAAK;AACvD,WAAO,KAAK;AAAA,MACT,KAAK,GAAG,qCAAqC,YAAY,kBAAkB,EAAE;AAAA,IAChF;AAAA,EACH;AAAA,EAEA,MAAM,eACH,KACA,cACA,MAC4B;AAC5B,WAAO,KAAK,MAAM,KAAK,GAAG,qCAAqC,YAAY,gBAAgB;AAAA,MACxF,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,IAAI;AAAA,IAC5B,CAAC;AAAA,EACJ;AAAA,EAEA,MAAM,iBACH,KACA,cACA,UAC4B;AAC5B,WAAO,KAAK,MAAM,KAAK,GAAG,qCAAqC,YAAY,kBAAkB;AAAA,MAC1F,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,EAAE,SAAmB,CAAC;AAAA,IAC9C,CAAC;AAAA,EACJ;AAAA,EAEA,MAAM,eACH,KACA,cACA,UAC4B;AAC5B,WAAO,KAAK,MAAM,KAAK,GAAG,qCAAqC,YAAY,gBAAgB;AAAA,MACxF,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,EAAE,SAAmB,CAAC;AAAA,IAC9C,CAAC;AAAA,EACJ;AAAA,EAEA,MAAM,kBACH,KACA,cACA,MAC4B;AAC5B,WAAO,KAAK;AAAA,MACT,KAAK,GAAG,qCAAqC,YAAY;AAAA,MACzD,EAAE,QAAQ,QAAQ,MAAM,KAAK,UAAU,IAAI,EAAE;AAAA,IAChD;AAAA,EACH;AAAA;AAAA,EAIA,MAAM,2BACH,KACA,cAC6B;AAC7B,WAAO,KAAK,MAAM,KAAK,GAAG,qCAAqC,YAAY,iBAAiB;AAAA,EAC/F;AAAA,EAEA,MAAM,wBACH,KACA,cACA,MAC6B;AAC7B,WAAO,KAAK;AAAA,MACT,KAAK,GAAG,qCAAqC,YAAY;AAAA,MACzD,EAAE,QAAQ,OAAO,MAAM,KAAK,UAAU,IAAI,EAAE;AAAA,IAC/C;AAAA,EACH;AAAA,EAEA,MAAM,qBACH,KACA,cACkC;AAClC,WAAO,KAAK;AAAA,MACT,KAAK,GAAG,qCAAqC,YAAY;AAAA,MACzD,EAAE,QAAQ,OAAO;AAAA,IACpB;AAAA,EACH;AAAA,EAEA,MAAM,yBACH,KACA,cACA,QAAQ,IAC4B;AACpC,UAAM,KAAK,UAAU,KAAK,UAAU,KAAK,KAAK;AAC9C,WAAO,KAAK;AAAA,MACT,KAAK,GAAG,qCAAqC,YAAY,uBAAuB,EAAE;AAAA,IACrF;AAAA,EACH;AAAA,EAEA,MAAM,4BACH,KACA,cACA,MACkC;AAClC,WAAO,KAAK;AAAA,MACT,KAAK,GAAG,qCAAqC,YAAY;AAAA,MACzD,EAAE,QAAQ,QAAQ,MAAM,KAAK,UAAU,IAAI,EAAE;AAAA,IAChD;AAAA,EACH;AAAA,EAEA,MAAM,0BACH,KACA,cACA,MACkC;AAClC,WAAO,KAAK;AAAA,MACT,KAAK,GAAG,qCAAqC,YAAY;AAAA,MACzD,EAAE,QAAQ,QAAQ,MAAM,KAAK,UAAU,IAAI,EAAE;AAAA,IAChD;AAAA,EACH;AACH;;;ACjWO,IAAM,cAAN,cAA0B,cAAc;AAAA,EAC5C,MAAM,kBACH,KACA,MACkC;AAClC,WAAO,KAAK,MAAgC,KAAK,GAAG,uCAAuC;AAAA,MACxF,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,IAAI;AAAA,IAC5B,CAAC;AAAA,EACJ;AAAA,EAEA,MAAM,kBAAkB,KAAgD;AACrE,WAAO,KAAK,MAAgC,KAAK,GAAG,kCAAkC;AAAA,EACzF;AAAA,EAEA,MAAM,sBAAsB,KAA0C;AACnE,WAAO,KAAK,MAA0B,KAAK,GAAG,qCAAqC;AAAA,EACtF;AAAA,EAEA,MAAM,uBACH,KACA,MACwC;AACxC,WAAO,KAAK;AAAA,MACT,KAAK,GAAG;AAAA,MACR;AAAA,QACG,QAAQ;AAAA,QACR,MAAM,KAAK,UAAU,IAAI;AAAA,MAC5B;AAAA,IACH;AAAA,EACH;AAAA,EAEA,MAAM,2BAA2B,KAAa,YAAiD;AAC5F,WAAO,KAAK;AAAA,MACT,KAAK,GAAG,sCAAsC,UAAU;AAAA,MACxD,EAAE,QAAQ,SAAS;AAAA,IACtB;AAAA,EACH;AAAA,EAEA,MAAM,yBACH,KACA,YACwC;AACxC,WAAO,KAAK;AAAA,MACT,KAAK,GAAG,sCAAsC,UAAU;AAAA,MACxD,EAAE,QAAQ,OAAO;AAAA,IACpB;AAAA,EACH;AAAA,EAEA,MAAM,yBACH,KACA,QACiD;AACjD,UAAM,QAAQ,IAAI,gBAAgB;AAClC,QAAI,QAAQ,SAAS,OAAW,OAAM,IAAI,QAAQ,OAAO,OAAO,IAAI,CAAC;AACrE,QAAI,QAAQ,aAAa,OAAW,OAAM,IAAI,YAAY,OAAO,OAAO,QAAQ,CAAC;AACjF,QAAI,QAAQ,QAAQ,KAAK,EAAG,OAAM,IAAI,UAAU,OAAO,OAAO,KAAK,CAAC;AACpE,UAAM,KAAK,MAAM,SAAS,IAAI,IAAI,MAAM,SAAS,CAAC,KAAK;AACvD,WAAO,KAAK;AAAA,MACT,KAAK,GAAG,kDAAkD,EAAE;AAAA,IAC/D;AAAA,EACH;AAAA,EAEA,MAAM,iCACH,KACA,QACuC;AACvC,UAAM,QAAQ,IAAI,gBAAgB;AAClC,QAAI,QAAQ,UAAU,OAAW,OAAM,IAAI,SAAS,OAAO,OAAO,KAAK,CAAC;AACxE,QAAI,QAAQ,WAAW,OAAW,OAAM,IAAI,UAAU,OAAO,OAAO,MAAM,CAAC;AAC3E,UAAM,KAAK,MAAM,SAAS,IAAI,IAAI,MAAM,SAAS,CAAC,KAAK;AACvD,WAAO,KAAK;AAAA,MACT,KAAK,GAAG,mDAAmD,EAAE;AAAA,IAChE;AAAA,EACH;AAAA,EAEA,MAAM,qBACH,KACA,MAC4E;AAC5E,WAAO,KAAK,MAAM,KAAK,GAAG,iDAAiD;AAAA,MACxE,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,IAAI;AAAA,IAC5B,CAAC;AAAA,EACJ;AAAA,EAEA,MAAM,yBACH,KACA,UAC+C;AAC/C,WAAO,KAAK,MAAM,KAAK,GAAG,mDAAmD,QAAQ,IAAI;AAAA,MACtF,QAAQ;AAAA,IACX,CAAC;AAAA,EACJ;AACH;;;ACpIO,IAAM,WAAN,cAAuB,cAAc;AAAA;AAAA,EAEzC,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;AAAA,MACT,KAAK,GAAG,SAAS,OAAO,SAAS,IAAI,IAAI,OAAO,SAAS,CAAC,KAAK,EAAE;AAAA,IACpE;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,QAAQ,KAAa,IAA2B;AACnD,WAAO,KAAK,MAAY,KAAK,GAAG,UAAU,EAAE,EAAE;AAAA,EACjD;AAAA;AAAA,EAGA,MAAM,WAAW,KAAa,MAAmC;AAC9D,WAAO,KAAK,MAAY,KAAK,GAAG,UAAU;AAAA,MACvC,QAAQ;AAAA,MACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,MAC9C,MAAM,KAAK,UAAU,IAAI;AAAA,IAC5B,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,WAAW,KAAa,IAAY,MAA4C;AACnF,WAAO,KAAK,MAAY,KAAK,GAAG,UAAU,EAAE,IAAI;AAAA,MAC7C,QAAQ;AAAA,MACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,MAC9C,MAAM,KAAK,UAAU,IAAI;AAAA,IAC5B,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,WAAW,KAAa,IAA2B;AACtD,WAAO,KAAK,MAAM,KAAK,GAAG,UAAU,EAAE,IAAI;AAAA,MACvC,QAAQ;AAAA,IACX,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,YACH,KACA,QACA,SAAsC,OACN;AAChC,WAAO,KAAK;AAAA,MACT,KAAK,GAAG,UAAU,MAAM,mBAAmB,MAAM;AAAA,MACjD;AAAA,QACG,QAAQ;AAAA,MACX;AAAA,IACH;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,sBACH,KACA,SAC4B;AAC5B,WAAO,KAAK,MAA0B,KAAK,GAAG,qBAAqB;AAAA,MAChE,QAAQ;AAAA,MACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,MAC9C,MAAM,KAAK,UAAU,OAAO;AAAA,IAC/B,CAAC;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,WACH,KACA,gBACsB;AACtB,UAAM,WACH,OAAO,mBAAmB,WAAW,iBAAiB,eAAe;AACxE,WAAO,KAAK,MAAoB,KAAK,GAAG,sBAAsB,QAAQ,EAAE;AAAA,EAC3E;AAAA;AAAA,EAGA,MAAM,UAAU,KAAa,IAAiC;AAC3D,WAAO,KAAK,MAAkB,KAAK,GAAG,YAAY,EAAE,EAAE;AAAA,EACzD;AAAA;AAAA,EAGA,MAAM,aAAa,KAAa,WAAoD;AACjF,WAAO,KAAK,MAAkB,KAAK,GAAG,YAAY;AAAA,MAC/C,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,SAAS;AAAA,IACjC,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,aACH,KACA,IACA,WACoB;AACpB,WAAO,KAAK,MAAkB,KAAK,GAAG,YAAY,EAAE,IAAI;AAAA,MACrD,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,SAAS;AAAA,IACjC,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,aAAa,KAAa,IAA2B;AACxD,WAAO,KAAK,MAAM,KAAK,GAAG,YAAY,EAAE,IAAI;AAAA,MACzC,QAAQ;AAAA,IACX,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,cAAc,KAAa,IAA0D;AACxF,WAAO,KAAK,MAA2C,KAAK,GAAG,YAAY,EAAE,YAAY;AAAA,MACtF,QAAQ;AAAA,IACX,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,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;AAAA,MACT,KAAK,GAAG,YAAY,EAAE,WAAW,aAAa,SAAS,CAAC;AAAA,IAC3D;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,cAAc,KAAmC;AACpD,WAAO,KAAK,MAAmB,KAAK,GAAG,cAAc;AAAA,EACxD;AAAA;AAAA,EAGA,MAAM,aAAa,KAAa,IAAgC;AAC7D,WAAO,KAAK,MAAiB,KAAK,GAAG,gBAAgB,EAAE,EAAE;AAAA,EAC5D;AAAA;AAAA,EAGA,MAAM,mBAAmB,KAAa,MAAkC;AACrE,WAAO,KAAK,MAAiB,KAAK,GAAG,gBAAgB,IAAI,EAAE;AAAA,EAC9D;AAAA;AAAA,EAGA,MAAM,gBAAgB,KAAa,OAA8C;AAC9E,WAAO,KAAK,MAAiB,KAAK,GAAG,gBAAgB;AAAA,MAClD,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,KAAK;AAAA,IAC7B,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,gBACH,KACA,IACA,OACmB;AACnB,WAAO,KAAK,MAAiB,KAAK,GAAG,gBAAgB,EAAE,IAAI;AAAA,MACxD,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,KAAK;AAAA,IAC7B,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,gBAAgB,KAAa,IAA2B;AAC3D,WAAO,KAAK,MAAM,KAAK,GAAG,gBAAgB,EAAE,IAAI;AAAA,MAC7C,QAAQ;AAAA,IACX,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,eAAe,KAAa,QAA8C;AAC7E,WAAO,KAAK,MAA2B,KAAK,GAAG,UAAU,MAAM,UAAU;AAAA,EAC5E;AAAA;AAAA,EAGA,MAAM,gBACH,KACA,QACA,MACuC;AACvC,WAAO,KAAK,MAAqC,KAAK,GAAG,UAAU,MAAM,kBAAkB;AAAA,MACxF,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,IAAI;AAAA,IAC5B,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,eAAe,KAAa,QAAgB,QAA+B;AAC9E,WAAO,KAAK,MAAM,KAAK,GAAG,UAAU,MAAM,kBAAkB,MAAM,IAAI;AAAA,MACnE,QAAQ;AAAA,IACX,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,iBAAiB,KAAa,UAAkD;AACnF,WAAO,KAAK,MAA6B,KAAK,GAAG,YAAY,QAAQ,UAAU;AAAA,EAClF;AAAA;AAAA,EAGA,MAAM,kBACH,KACA,UACA,MACuC;AACvC,WAAO,KAAK;AAAA,MACT,KAAK,GAAG,YAAY,QAAQ;AAAA,MAC5B;AAAA,QACG,QAAQ;AAAA,QACR,MAAM,KAAK,UAAU,IAAI;AAAA,MAC5B;AAAA,IACH;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,iBAAiB,KAAa,UAAkB,QAA+B;AAClF,WAAO,KAAK,MAAM,KAAK,GAAG,YAAY,QAAQ,kBAAkB,MAAM,IAAI;AAAA,MACvE,QAAQ;AAAA,IACX,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,kBACH,KACA,QACA,MAC6B;AAC7B,WAAO,KAAK,MAA2B,KAAK,GAAG,UAAU,MAAM,YAAY;AAAA,MACxE,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,IAAI;AAAA,IAC5B,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,oBACH,KACA,UACA,MAC+B;AAC/B,WAAO,KAAK,MAA6B,KAAK,GAAG,YAAY,QAAQ,YAAY;AAAA,MAC9E,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,IAAI;AAAA,IAC5B,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,cAAc,KAAa,QAA6C;AAC3E,WAAO,KAAK,MAA0B,KAAK,GAAG,kBAAkB,MAAM,EAAE;AAAA,EAC3E;AAAA;AAAA,EAGA,MAAM,gBACH,KACA,UACA,OAAO,GACP,WAAW,KACmB;AAC9B,WAAO,KAAK;AAAA,MACT,KAAK,GAAG,oBAAoB,QAAQ,SAAS,IAAI,aAAa,QAAQ;AAAA,IACzE;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,qBACH,KACA,UACA,OAAO,GACP,WAAW,KACgD;AAC3D,WAAO,KAAK;AAAA,MACT,KAAK,GAAG,oBAAoB,QAAQ,eAAe,IAAI,aAAa,QAAQ;AAAA,IAC/E;AAAA,EACH;AACH;;;ACxTO,IAAM,aAAN,cAAyB,cAAc;AAAA;AAAA,EAE3C,MAAM,WAAW,KAAgD;AAC9D,WAAO,KAAK,MAAgC,KAAK,GAAG,UAAU;AAAA,EACjE;AAAA;AAAA,EAGA,MAAM,SAAS,KAAa,IAA4B;AACrD,WAAO,KAAK,MAAa,KAAK,GAAG,YAAY,EAAE,EAAE;AAAA,EACpD;AAAA;AAAA,EAGA,MAAM,YAAY,KAAa,OAA2C;AACvE,WAAO,KAAK,MAAa,KAAK,GAAG,YAAY;AAAA,MAC1C,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,KAAK;AAAA,IAC7B,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,YAAY,KAAa,IAAY,OAA2C;AACnF,WAAO,KAAK,MAAa,KAAK,GAAG,YAAY,EAAE,IAAI;AAAA,MAChD,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,KAAK;AAAA,IAC7B,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,YAAY,KAAa,IAA2B;AACvD,WAAO,KAAK,MAAM,KAAK,GAAG,YAAY,EAAE,IAAI;AAAA,MACzC,QAAQ;AAAA,IACX,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,eACH,KACA,SACA,UAII,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;AACT,aAAO,OAAO,uBAAuB,QAAQ,mBAAmB,SAAS,CAAC;AAE7E,WAAO,KAAK;AAAA,MACT,KAAK,GAAG,YAAY,OAAO,UAAU,OAAO,SAAS,IAAI,IAAI,OAAO,SAAS,CAAC,KAAK,EAAE;AAAA,IACxF;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,cAAc,KAAa,SAAiB,SAAiC;AAChF,WAAO,KAAK,MAAa,KAAK,GAAG,YAAY,OAAO,WAAW,OAAO,EAAE;AAAA,EAC3E;AAAA;AAAA,EAGA,MAAM,gBAAgB,KAAa,SAAiB,SAAiC;AAClF,WAAO,KAAK,MAAa,KAAK,GAAG,YAAY,OAAO,WAAW,OAAO,cAAc;AAAA,MACjF,QAAQ;AAAA,IACX,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,kBAAkB,KAAa,SAAiB,SAAiC;AACpF,WAAO,KAAK,MAAa,KAAK,GAAG,YAAY,OAAO,WAAW,OAAO,WAAW;AAAA,MAC9E,QAAQ;AAAA,IACX,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,aACH,KACA,SACA,SAAsC,OACL;AACjC,WAAO,KAAK;AAAA,MACT,KAAK,GAAG,mBAAmB,OAAO,mBAAmB,MAAM;AAAA,MAC3D;AAAA,QACG,QAAQ;AAAA,MACX;AAAA,IACH;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,wBACH,KACA,SACA,SACA,cACqB;AACrB,UAAM,WAAW,MAAM,KAAK;AAAA,MACzB,KAAK,GAAG,YAAY,OAAO,WAAW,OAAO,gBAAgB,YAAY;AAAA,IAC5E;AACA,WAAO,SAAS,YAAY;AAAA,EAC/B;AAAA;AAAA,EAGA,MAAM,gBAAgB,KAAa,SAA+B;AAC/D,WAAO,KAAK,MAAM,KAAK,GAAG,YAAY,OAAO,UAAU;AAAA,EAC1D;AAAA;AAAA,EAGA,MAAM,gBACH,KACA,SACA,cACA,UAA8E,CAAC,GACjD;AAC9B,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;AACT,aAAO,OAAO,uBAAuB,QAAQ,mBAAmB,SAAS,CAAC;AAE7E,WAAO,KAAK;AAAA,MACT,KAAK,GAAG,YAAY,OAAO,gBAAgB,YAAY,UAAU,OAAO,SAAS,IAAI,IAAI,OAAO,SAAS,CAAC,KAAK,EAAE;AAAA,IACpH;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,cACH,KACA,SACA,QACA,UAA8E,CAAC,GACnD;AAC5B,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;AACT,aAAO,OAAO,uBAAuB,QAAQ,mBAAmB,SAAS,CAAC;AAE7E,WAAO,KAAK;AAAA,MACT,KAAK,GAAG,YAAY,OAAO,UAAU,MAAM,UAAU,OAAO,SAAS,IAAI,IAAI,OAAO,SAAS,CAAC,KAAK,EAAE;AAAA,IACxG;AAAA,EACH;AACH;;;AC7IO,IAAM,eAAN,cAA2B,cAAc;AAAA;AAAA;AAAA;AAAA,EAI7C,MAAM,cAAc,MAA8C;AAC/D,WAAO,KAAK,MAAe,aAAa;AAAA,MACrC,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,IAAI;AAAA,IAC5B,CAAC;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,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;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAW,WAAqC;AACnD,WAAO,KAAK,MAAe,aAAa,SAAS,EAAE;AAAA,EACtD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAc,WAAmB,MAA8C;AAClF,WAAO,KAAK,MAAe,aAAa,SAAS,IAAI;AAAA,MAClD,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,IAAI;AAAA,IAC5B,CAAC;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAc,WAAkC;AACnD,UAAM,KAAK,MAAM,aAAa,SAAS,IAAI;AAAA,MACxC,QAAQ;AAAA,IACX,CAAC;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,mBAAmB,cAAsC;AAC5D,UAAM,SAAS,IAAI,gBAAgB;AACnC,QAAI,cAAc;AACf,aAAO,OAAO,iBAAiB,YAAY;AAAA,IAC9C;AAEA,UAAM,cAAc,OAAO,SAAS;AACpC,UAAM,MAAM,cAAc,wBAAwB,WAAW,KAAK;AAElE,UAAM,WAAW,MAAM,MAAM,GAAG,KAAK,OAAO,WAAW,GAAG,IAAI;AAAA,MAC3D,QAAQ;AAAA,MACR,aAAa;AAAA,IAChB,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AACf,YAAM,QAAQ,MAAM,SAAS,KAAK;AAClC,YAAM,IAAI,MAAM,MAAM,UAAU,eAAe;AAAA,IAClD;AAEA,WAAO,SAAS,KAAK;AAAA,EACxB;AACH;;;AC/EO,IAAM,oBAAN,cAAgC,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA,EAKlD,MAAM,4BAA4B,KAAsD;AACrF,WAAO,KAAK,MAAsC,KAAK,GAAG,4BAA4B;AAAA,EACzF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,mBAAmB,KAA2C;AACjE,WAAO,KAAK,MAA2B,KAAK,GAAG,kBAAkB;AAAA,EACpE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,kBACH,KACA,MACuC;AACvC,WAAO,KAAK,MAAqC,KAAK,GAAG,kCAAkC;AAAA,MACxF,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,IAAI;AAAA,IAC5B,CAAC;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eAAe,KAAa,SAAyD;AACxF,WAAO,KAAK;AAAA,MACT,KAAK,GAAG,kCAAkC,OAAO;AAAA,IACpD;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,kBACH,KACA,SACA,MACuC;AACvC,WAAO,KAAK;AAAA,MACT,KAAK,GAAG,kCAAkC,OAAO;AAAA,MACjD;AAAA,QACG,QAAQ;AAAA,QACR,MAAM,KAAK,UAAU,IAAI;AAAA,MAC5B;AAAA,IACH;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,kBACH,KACA,SACA,OAAgB,OACiD;AACjE,UAAM,SAAS,OAAO,eAAe;AACrC,WAAO,KAAK;AAAA,MACT,KAAK,GAAG,kCAAkC,OAAO,GAAG,MAAM;AAAA,MAC1D,EAAE,QAAQ,SAAS;AAAA,IACtB;AAAA,EACH;AACH;;;ACvEO,IAAM,gBAAN,cAA4B,cAAc;AAAA;AAAA;AAAA;AAAA,EAI9C,MAAM,cAAc,KAAmC;AACpD,WAAO,KAAK,MAAmB,KAAK,GAAG,8BAA8B;AAAA,EACxE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAa,KAAa,UAAsC;AACnE,WAAO,KAAK,MAAiB,KAAK,GAAG,gCAAgC,QAAQ,EAAE;AAAA,EAClF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBAAgB,KAAa,MAA6C;AAC7E,WAAO,KAAK,MAAiB,KAAK,GAAG,gCAAgC;AAAA,MAClE,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,IAAI;AAAA,IAC5B,CAAC;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBACH,KACA,UACA,MACmB;AACnB,WAAO,KAAK,MAAiB,KAAK,GAAG,gCAAgC,QAAQ,IAAI;AAAA,MAC9E,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,IAAI;AAAA,IAC5B,CAAC;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBAAgB,KAAa,UAAgD;AAChF,WAAO,KAAK,MAA2B,KAAK,GAAG,gCAAgC,QAAQ,IAAI;AAAA,MACxF,QAAQ;AAAA,IACX,CAAC;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBAAgB,KAAa,UAAsC;AACtE,WAAO,KAAK,MAAiB,KAAK,GAAG,gCAAgC,QAAQ,WAAW;AAAA,MACrF,QAAQ;AAAA,IACX,CAAC;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,iBAAiB,KAAa,UAAsC;AACvE,WAAO,KAAK,MAAiB,KAAK,GAAG,gCAAgC,QAAQ,YAAY;AAAA,MACtF,QAAQ;AAAA,IACX,CAAC;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,kBAAkB,KAAa,UAAmD;AACrF,WAAO,KAAK;AAAA,MACT,KAAK,GAAG,gCAAgC,QAAQ;AAAA,IACnD;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,sBAAsB,KAAa,UAAuD;AAC7F,WAAO,KAAK;AAAA,MACT,KAAK,GAAG,gCAAgC,QAAQ;AAAA,IACnD;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,oBAAoB,KAAa,UAAqD;AACzF,WAAO,KAAK;AAAA,MACT,KAAK,GAAG,gCAAgC,QAAQ;AAAA,IACnD;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,wBACH,KACA,UACmC;AACnC,WAAO,KAAK;AAAA,MACT,KAAK,GAAG,gCAAgC,QAAQ;AAAA,MAChD,EAAE,QAAQ,OAAO;AAAA,IACpB;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,sBACH,KACA,MAC8D;AAC9D,WAAO,KAAK;AAAA,MACT,KAAK,GAAG;AAAA,MACR;AAAA,QACG,QAAQ;AAAA,QACR,MAAM,KAAK,UAAU,IAAI;AAAA,MAC5B;AAAA,IACH;AAAA,EACH;AACH;;;ACrGO,IAAM,aAAN,cAAyB,cAAc;AAAA;AAAA,EAE3C,MAAM,iBAAiB,KAAqC;AACzD,WAAO,KAAK,MAAqB,KAAK,GAAG,KAAK;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,gBAAgB,KAAgC;AACnD,WAAO,KAAK,MAAgB,KAAK,GAAG,gBAAgB;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,aAAa,KAAa,YAAqC;AAClE,WAAO,KAAK,MAAc,KAAK,GAAG,mBAAmB;AAAA,MAClD,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,EAAE,WAAW,CAAC;AAAA,IACtC,CAAC;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,kBAAkB,KAA8B;AACnD,WAAO,KAAK,MAAc,KAAK,GAAG,mBAAmB;AAAA,MAClD,QAAQ;AAAA,IACX,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,oBAAoB,KAAa,QAAkD;AACtF,WAAO,KAAK,MAAc,KAAK,GAAG,OAAO;AAAA,MACtC,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,MAAM;AAAA,IAC9B,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,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;AAAA,MACnD,OAAO;AAEJ,eAAO,OAAO,WAAW,KAAK,UAAU,OAAO,CAAC;AAAA,MACnD;AAAA,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;AAAA,IACtD,WAAW,YAAY;AAEpB,aAAO,OAAO,eAAe,UAAU;AAAA,IAC1C;AAEA,WAAO,OAAO,eAAe,WAAW,SAAS,CAAC;AAElD,QAAI,cAAc,QAAW;AAC1B,aAAO,OAAO,cAAc,UAAU,SAAS,CAAC;AAAA,IACnD;AAEA,QAAI,eAAe,QAAW;AAC3B,aAAO,OAAO,eAAe,WAAW,SAAS,CAAC;AAAA,IACrD;AAEA,QAAI,cAAc,WAAW,SAAS,GAAG;AACtC,aAAO,OAAO,eAAe,WAAW,KAAK,GAAG,CAAC;AAAA,IACpD;AAEA,WAAO,KAAK,MAAiC,KAAK,GAAG,YAAY,OAAO,SAAS,CAAC,EAAE;AAAA,EACvF;AAAA;AAAA,EAGA,MAAM,mBAAmB,KAAa,UAAmC;AACtE,WAAO,KAAK,MAAc,KAAK,GAAG,YAAY,QAAQ,EAAE;AAAA,EAC3D;AAAA;AAAA,EAGA,MAAM,sBAAsB,KAAa,MAAqD;AAC3F,WAAO,KAAK,MAAc,KAAK,GAAG,YAAY;AAAA,MAC3C,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,IAAI;AAAA,IAC5B,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,aACH,KACA,UACA,MACgB;AAChB,WAAO,KAAK,MAAc,KAAK,GAAG,YAAY,QAAQ,IAAI;AAAA,MACvD,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,IAAI;AAAA,IAC5B,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,aAAa,KAAa,UAAkB,SAA8C;AAC7F,UAAM,SAAS,IAAI,gBAAgB;AACnC,QAAI,SAAS,OAAO;AACjB,aAAO,OAAO,SAAS,MAAM;AAAA,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;AAAA,MACpB,QAAQ;AAAA,IACX,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,cAAc,KAAa,UAAmC;AACjE,WAAO,KAAK,MAAc,KAAK,GAAG,YAAY,QAAQ,YAAY;AAAA,MAC/D,QAAQ;AAAA,IACX,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,gBAAgB,KAAa,UAAmC;AACnE,WAAO,KAAK,MAAc,KAAK,GAAG,YAAY,QAAQ,cAAc;AAAA,MACjE,QAAQ;AAAA,IACX,CAAC;AAAA,EACJ;AAAA;AAAA;AAAA,EAIA,MAAM,iBAAiB,KAAsC;AAC1D,WAAO,KAAK,MAAsB,KAAK,GAAG,iBAAiB;AAAA,EAC9D;AAAA;AAAA,EAGA,MAAM,gBAAgB,KAAa,UAAyC;AACzE,WAAO,KAAK,MAAoB,KAAK,GAAG,mBAAmB,QAAQ,EAAE;AAAA,EACxE;AAAA;AAAA,EAGA,MAAM,mBAAmB,KAAa,MAAmD;AACtF,WAAO,KAAK,MAAoB,KAAK,GAAG,mBAAmB;AAAA,MACxD,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,IAAI;AAAA,IAC5B,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,mBACH,KACA,UACA,MACsB;AACtB,WAAO,KAAK,MAAoB,KAAK,GAAG,mBAAmB,QAAQ,IAAI;AAAA,MACpE,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,IAAI;AAAA,IAC5B,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,mBAAmB,KAAa,UAAiC;AACpE,WAAO,KAAK,MAAM,KAAK,GAAG,mBAAmB,QAAQ,IAAI;AAAA,MACtD,QAAQ;AAAA,IACX,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,qBAAqB,KAAa,UAA8C;AACnF,WAAO,KAAK,MAAyB,KAAK,GAAG,mBAAmB,QAAQ,QAAQ;AAAA,EACnF;AAAA;AAAA;AAAA,EAIA,MAAM,gBAAgB,KAAqC;AACxD,WAAO,KAAK,MAAqB,KAAK,GAAG,gBAAgB;AAAA,EAC5D;AAAA;AAAA,EAGA,MAAM,eAAe,KAAa,IAAkC;AACjE,WAAO,KAAK,MAAmB,KAAK,GAAG,kBAAkB,EAAE,EAAE;AAAA,EAChE;AAAA;AAAA,EAGA,MAAM,qBAAqB,KAAa,MAAoC;AACzE,WAAO,KAAK,MAAmB,KAAK,GAAG,kBAAkB,IAAI,EAAE;AAAA,EAClE;AAAA;AAAA,EAGA,MAAM,kBAAkB,KAAa,OAAkD;AACpF,WAAO,KAAK,MAAmB,KAAK,GAAG,kBAAkB;AAAA,MACtD,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,KAAK;AAAA,IAC7B,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,kBACH,KACA,IACA,OACqB;AACrB,WAAO,KAAK,MAAmB,KAAK,GAAG,kBAAkB,EAAE,IAAI;AAAA,MAC5D,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,KAAK;AAAA,IAC7B,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,kBAAkB,KAAa,IAA2B;AAC7D,WAAO,KAAK,MAAM,KAAK,GAAG,kBAAkB,EAAE,IAAI;AAAA,MAC/C,QAAQ;AAAA,IACX,CAAC;AAAA,EACJ;AAAA;AAAA;AAAA,EAIA,MAAM,eAAe,KAAoC;AACtD,WAAO,KAAK,MAAoB,KAAK,GAAG,eAAe;AAAA,EAC1D;AAAA;AAAA,EAGA,MAAM,cAAc,KAAa,IAAiC;AAC/D,WAAO,KAAK,MAAkB,KAAK,GAAG,iBAAiB,EAAE,EAAE;AAAA,EAC9D;AAAA;AAAA,EAGA,MAAM,oBAAoB,KAAa,MAAmC;AACvE,WAAO,KAAK,MAAkB,KAAK,GAAG,iBAAiB,IAAI,EAAE;AAAA,EAChE;AAAA;AAAA,EAGA,MAAM,iBAAiB,KAAa,YAAqD;AACtF,WAAO,KAAK,MAAkB,KAAK,GAAG,iBAAiB;AAAA,MACpD,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,UAAU;AAAA,IAClC,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,iBACH,KACA,IACA,YACoB;AACpB,WAAO,KAAK,MAAkB,KAAK,GAAG,iBAAiB,EAAE,IAAI;AAAA,MAC1D,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,UAAU;AAAA,IAClC,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,iBAAiB,KAAa,IAA2B;AAC5D,WAAO,KAAK,MAAM,KAAK,GAAG,iBAAiB,EAAE,IAAI;AAAA,MAC9C,QAAQ;AAAA,IACX,CAAC;AAAA,EACJ;AAAA;AAAA;AAAA,EAIA,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;AAAA,MACpB,GAAG,KAAK,OAAO,aAAa,GAAG,mBAAmB,OAAO,SAAS,CAAC;AAAA,MACnE;AAAA,QACG,QAAQ;AAAA,QACR,MAAM;AAAA,QACN,aAAa;AAAA,MAChB;AAAA,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;AACnE,UAAC,YAAoB,mBAAmB;AACxC,gBAAM;AAAA,QACT;AAAA,MACH;AAGA,YAAM,IAAI,MAAM,MAAM,UAAU,eAAe;AAAA,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;AAAA,UACtB,QAAQ;AAAA,UAER;AAAA,QACH;AAAA,MACH;AAAA,IACH;AAEA,WAAO,EAAE,SAAS,KAAK;AAAA,EAC1B;AAAA;AAAA,EAGA,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,KAAK,SAAS,KAAK,GAAG,mBAAmB,OAAO,SAAS,CAAC,IAAI;AAAA,MAClF,QAAQ;AAAA,MACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,IACjD,CAAC;AAED,WAAO,SAAS,KAAK;AAAA,EACxB;AAAA;AAAA,EAGA,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;AAAA,MACT,KAAK,GAAG,6BAA6B,OAAO,SAAS,CAAC;AAAA,IACzD;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,gBAAgB,KAAa,UAAoD;AACpF,WAAO,KAAK,MAA+B,KAAK,GAAG,YAAY,QAAQ,SAAS;AAAA,EACnF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,0BAA0B,KAAyD;AACtF,WAAO,KAAK,MAAyC,KAAK,GAAG,2BAA2B;AAAA,EAC3F;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,kBACH,KACA,UACA,SACqB;AACrB,WAAO,KAAK,MAAmB,KAAK,GAAG,YAAY,QAAQ,WAAW;AAAA,MACnE,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,OAAO;AAAA,IAC/B,CAAC;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,kBACH,KACA,UACA,SACA,SACqB;AACrB,WAAO,KAAK,MAAmB,KAAK,GAAG,YAAY,QAAQ,WAAW,OAAO,IAAI;AAAA,MAC9E,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,OAAO;AAAA,IAC/B,CAAC;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,kBAAkB,KAAa,UAAkB,SAAgC;AACpF,UAAM,KAAK,MAAM,KAAK,GAAG,YAAY,QAAQ,WAAW,OAAO,IAAI;AAAA,MAChE,QAAQ;AAAA,IACX,CAAC;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,6BACH,KACA,UACA,gBACA,UACwC;AACxC,WAAO,KAAK;AAAA,MACT,KAAK,GAAG,YAAY,QAAQ;AAAA,MAC5B;AAAA,QACG,QAAQ;AAAA,QACR,MAAM,KAAK,UAAU;AAAA,UAClB,iBAAiB;AAAA,UACjB,WAAW;AAAA,QACd,CAAC;AAAA,MACJ;AAAA,IACH;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,6BACH,KACA,UAC8C;AAC9C,WAAO,KAAK;AAAA,MACT,KAAK,GAAG,8BAA8B,QAAQ;AAAA,MAC9C,EAAE,QAAQ,SAAS;AAAA,IACtB;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,2BACH,KACA,UACA,UAC0D;AAC1D,UAAM,SAAS,IAAI,gBAAgB;AACnC,QAAI,SAAU,QAAO,OAAO,aAAa,SAAS,SAAS,CAAC;AAC5D,QAAI,UAAU,SAAS,OAAW,QAAO,IAAI,QAAQ,OAAO,SAAS,IAAI,CAAC;AAC1E,QAAI,UAAU,aAAa,OAAW,QAAO,IAAI,YAAY,OAAO,SAAS,QAAQ,CAAC;AACtF,UAAM,KAAK,OAAO,SAAS;AAC3B,WAAO,KAAK;AAAA,MACT,KAAK,GAAG,6BAA6B,KAAK,IAAI,EAAE,KAAK,EAAE;AAAA,IAC1D;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,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;AAAA,EACzD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,uBACH,KACA,cACmC;AACnC,WAAO,KAAK;AAAA,MACT,KAAK,GAAG,kCAAkC,YAAY;AAAA,IACzD;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,uBACH,KACA,cACA,SACmC;AACnC,WAAO,KAAK;AAAA,MACT,KAAK,GAAG,kCAAkC,YAAY;AAAA,MACtD;AAAA,QACG,QAAQ;AAAA,QACR,MAAM,KAAK,UAAU,OAAO;AAAA,MAC/B;AAAA,IACH;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,sBACH,KACA,cACA,SACmC;AACnC,WAAO,KAAK;AAAA,MACT,KAAK,GAAG,kCAAkC,YAAY;AAAA,MACtD;AAAA,QACG,QAAQ;AAAA,QACR,MAAM,KAAK,UAAU,WAAW,CAAC,CAAC;AAAA,MACrC;AAAA,IACH;AAAA,EACH;AAAA;AAAA,EAIA,MAAM,kBACH,KACA,UACA,SACgC;AAChC,UAAM,SAAS,IAAI,gBAAgB;AACnC,QAAI,SAAS,SAAU,QAAO,OAAO,YAAY,QAAQ,QAAQ;AACjE,QAAI,SAAS,MAAO,QAAO,OAAO,SAAS,QAAQ,KAAK;AACxD,QAAI,SAAS,MAAO,QAAO,OAAO,SAAS,QAAQ,MAAM,SAAS,CAAC;AACnE,QAAI,SAAS,OAAQ,QAAO,OAAO,UAAU,QAAQ,OAAO,SAAS,CAAC;AACtE,UAAM,KAAK,OAAO,SAAS;AAC3B,WAAO,KAAK;AAAA,MACT,KAAK,GAAG,YAAY,QAAQ,YAAY,KAAK,IAAI,EAAE,KAAK,EAAE;AAAA,IAC7D;AAAA,EACH;AAAA,EAEA,MAAM,mBACH,KACA,UACA,WACA,UACc;AACd,UAAM,KAAK;AAAA,MACR,KAAK,GAAG,YAAY,QAAQ,aAAa,mBAAmB,SAAS,CAAC,aAAa,mBAAmB,QAAQ,CAAC;AAAA,MAC/G,EAAE,QAAQ,SAAS;AAAA,IACtB;AAAA,EACH;AACH;;;ACloBO,IAAM,gBAAN,cAA4B,cAAc;AAAA;AAAA,EAE9C,MAAM,cACH,KACA,UAMI,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,OAAQ,QAAO,OAAO,UAAU,QAAQ,MAAM;AAE1D,WAAO,KAAK;AAAA,MACT,KAAK,GAAG,cAAc,OAAO,SAAS,IAAI,IAAI,OAAO,SAAS,CAAC,KAAK,EAAE;AAAA,IACzE;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,aAAa,KAAa,IAAgC;AAC7D,WAAO,KAAK,MAAiB,KAAK,GAAG,eAAe,EAAE,EAAE;AAAA,EAC3D;AAAA;AAAA,EAGA,MAAM,gBAAgB,KAAa,WAAkD;AAClF,WAAO,KAAK,MAAiB,KAAK,GAAG,eAAe;AAAA,MACjD,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,SAAS;AAAA,IACjC,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,gBACH,KACA,IACA,WACmB;AACnB,WAAO,KAAK,MAAiB,KAAK,GAAG,eAAe,EAAE,IAAI;AAAA,MACvD,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,SAAS;AAAA,IACjC,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,gBAAgB,KAAa,IAA2B;AAC3D,WAAO,KAAK,MAAM,KAAK,GAAG,eAAe,EAAE,IAAI;AAAA,MAC5C,QAAQ;AAAA,IACX,CAAC;AAAA,EACJ;AACH;;;ACoHO,IAAM,uBAAN,cAAmC,cAAc;AAAA;AAAA;AAAA;AAAA,EAIrD,MAAM,UAAU,KAAsC;AACnD,UAAM,SAAS,MAAM,KAAK,MAAqB,KAAK,GAAG,gCAAgC;AACvF,WAAO,EAAE,OAAO;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBAAgB,KAAa,SAA2C;AAC3E,UAAM,UAAU,MAAM,KAAK;AAAA,MACxB,KAAK,GAAG,kCAAkC,OAAO;AAAA,IACpD;AACA,WAAO,EAAE,QAAQ;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAc,KAAa,QAAuD;AACrF,WAAO,KAAK,MAAuB,KAAK,GAAG,oCAAoC;AAAA,MAC5E,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,MAAM;AAAA,IAC9B,CAAC;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cACH,KACA,WACgD;AAChD,WAAO,KAAK;AAAA,MACT,KAAK,GAAG,oCAAoC,SAAS;AAAA,MACrD,EAAE,QAAQ,SAAS;AAAA,IACtB;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,WAAW,KAAa,SAAiB,WAA4C;AACxF,WAAO,KAAK;AAAA,MACT,KAAK,GAAG,kCAAkC,OAAO,aAAa,SAAS;AAAA,IAC1E;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eAAe,KAAa,SAA0C;AACzE,UAAM,SAAS,MAAM,KAAK;AAAA,MACvB,KAAK,GAAG,kCAAkC,OAAO;AAAA,IACpD;AACA,WAAO,EAAE,OAAO;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,mBAAmB,KAA+C;AACrE,WAAO,KAAK,MAA+B,KAAK,GAAG,sCAAsC;AAAA,EAC5F;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,0BACH,KACA,MACgC;AAChC,WAAO,KAAK,MAA8B,KAAK,GAAG,qCAAqC;AAAA,MACpF,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,IAAI;AAAA,IAC5B,CAAC;AAAA,EACJ;AAAA,EAEA,MAAM,0BAA0B,KAA8C;AAC3E,WAAO,KAAK,MAA8B,KAAK,GAAG,gCAAgC;AAAA,EACrF;AAAA,EAEA,MAAM,0BAA0B,KAAgD;AAC7E,WAAO,KAAK,MAAgC,KAAK,GAAG,mCAAmC;AAAA,EAC1F;AAAA,EAEA,MAAM,qBACH,KACqE;AACrE,WAAO,KAAK,MAAM,KAAK,GAAG,gCAAgC,EAAE,QAAQ,OAAO,CAAC;AAAA,EAC/E;AAAA,EAEA,MAAM,2BAA2B,KAA0C;AACxE,WAAO,KAAK,MAA0B,KAAK,GAAG,sCAAsC;AAAA,MACjF,QAAQ;AAAA,IACX,CAAC;AAAA,EACJ;AAAA,EAEA,MAAM,wBAAwB,KAA8C;AACzE,WAAO,KAAK,MAA8B,KAAK,GAAG,mCAAmC;AAAA,MAClF,QAAQ;AAAA,IACX,CAAC;AAAA,EACJ;AAAA,EAEA,MAAM,uBAAuB,KAA8C;AACxE,WAAO,KAAK,MAA8B,KAAK,GAAG,kCAAkC;AAAA,MACjF,QAAQ;AAAA,IACX,CAAC;AAAA,EACJ;AAAA,EAEA,MAAM,uBAAuB,KAA0C;AACpE,WAAO,KAAK,MAA0B,KAAK,GAAG,kCAAkC;AAAA,MAC7E,QAAQ;AAAA,IACX,CAAC;AAAA,EACJ;AAAA,EAEA,MAAM,0BAA0B,KAAqC;AAClE,WAAO,KAAK,MAAqB,KAAK,GAAG,gCAAgC;AAAA,EAC5E;AAAA,EAEA,MAAM,gCAAgC,KAAa,SAA0C;AAC1F,WAAO,KAAK;AAAA,MACT,KAAK,GAAG,kCAAkC,OAAO;AAAA,IACpD;AAAA,EACH;AAAA,EAEA,MAAM,+BAA+B,KAAa,SAAyC;AACxF,WAAO,KAAK,MAAqB,KAAK,GAAG,kCAAkC,OAAO,SAAS;AAAA,EAC9F;AAAA,EAEA,MAAM,oBAAoB,KAAgD;AACvE,WAAO,KAAK,MAAgC,KAAK,GAAG,qCAAqC;AAAA,EAC5F;AAAA,EAEA,MAAM,uBACH,KACA,YACkC;AAClC,WAAO,KAAK,MAAgC,KAAK,GAAG,uCAAuC;AAAA,MACxF,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,EAAE,WAAW,CAAC;AAAA,IACtC,CAAC;AAAA,EACJ;AAAA,EAEA,MAAM,uBACH,KACA,QAC+C;AAC/C,UAAM,QAAQ,IAAI,gBAAgB;AAClC,QAAI,QAAQ,SAAU,OAAM,IAAI,YAAY,OAAO,QAAQ;AAC3D,QAAI,QAAQ,SAAS,OAAW,OAAM,IAAI,QAAQ,OAAO,OAAO,IAAI,CAAC;AACrE,QAAI,QAAQ,aAAa,OAAW,OAAM,IAAI,YAAY,OAAO,OAAO,QAAQ,CAAC;AACjF,QAAI,QAAQ,QAAQ,KAAK,EAAG,OAAM,IAAI,UAAU,OAAO,OAAO,KAAK,CAAC;AACpE,UAAM,KAAK,MAAM,SAAS,IAAI,IAAI,MAAM,SAAS,CAAC,KAAK;AACvD,WAAO,KAAK;AAAA,MACT,KAAK,GAAG,gDAAgD,EAAE;AAAA,IAC7D;AAAA,EACH;AAAA,EAEA,MAAM,+BACH,KACA,QACqC;AACrC,UAAM,QAAQ,IAAI,gBAAgB;AAClC,QAAI,QAAQ,UAAU,OAAW,OAAM,IAAI,SAAS,OAAO,OAAO,KAAK,CAAC;AACxE,QAAI,QAAQ,WAAW,OAAW,OAAM,IAAI,UAAU,OAAO,OAAO,MAAM,CAAC;AAC3E,UAAM,KAAK,MAAM,SAAS,IAAI,IAAI,MAAM,SAAS,CAAC,KAAK;AACvD,WAAO,KAAK;AAAA,MACT,KAAK,GAAG,iDAAiD,EAAE;AAAA,IAC9D;AAAA,EACH;AAAA,EAEA,MAAM,mBACH,KACA,MACoE;AACpE,WAAO,KAAK,MAAM,KAAK,GAAG,+CAA+C;AAAA,MACtE,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,IAAI;AAAA,IAC5B,CAAC;AAAA,EACJ;AAAA,EAEA,MAAM,wBACH,KACA,MAC4B;AAC5B,WAAO,KAAK,MAAM,KAAK,GAAG,oDAAoD;AAAA,MAC3E,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,IAAI;AAAA,IAC5B,CAAC;AAAA,EACJ;AAAA,EAEA,MAAM,uBACH,KACA,UACA,SAC8C;AAC9C,WAAO,KAAK;AAAA,MACT,KAAK,GAAG,iDAAiD,QAAQ,aAAa,mBAAmB,OAAO,CAAC;AAAA,MACzG,EAAE,QAAQ,SAAS;AAAA,IACtB;AAAA,EACH;AAAA,EAEA,MAAM,iBACH,KACA,QAC+C;AAC/C,UAAM,QAAQ,IAAI,gBAAgB;AAClC,QAAI,QAAQ,SAAU,OAAM,IAAI,YAAY,OAAO,QAAQ;AAC3D,QAAI,QAAQ,SAAS,OAAW,OAAM,IAAI,QAAQ,OAAO,OAAO,IAAI,CAAC;AACrE,QAAI,QAAQ,aAAa,OAAW,OAAM,IAAI,YAAY,OAAO,OAAO,QAAQ,CAAC;AACjF,UAAM,KAAK,MAAM,SAAS,IAAI,IAAI,MAAM,SAAS,CAAC,KAAK;AACvD,WAAO,KAAK;AAAA,MACT,KAAK,GAAG,yCAAyC,EAAE;AAAA,IACtD;AAAA,EACH;AAAA,EAEA,MAAM,gBAAgB,KAAa,MAA0D;AAC1F,WAAO,KAAK,MAA4B,KAAK,GAAG,kCAAkC;AAAA,MAC/E,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,IAAI;AAAA,IAC5B,CAAC;AAAA,EACJ;AAAA,EAEA,MAAM,4BACH,KACA,SAMA;AACA,WAAO,KAAK,MAAM,KAAK,GAAG,kCAAkC,OAAO,0BAA0B;AAAA,MAC1F,QAAQ;AAAA,IACX,CAAC;AAAA,EACJ;AACH;;;ACrYO,IAAM,uBAAN,cAAmC,cAAc;AAAA;AAAA,EAErD,MAAM,qBAAqB,KAA0C;AAClE,WAAO,KAAK,MAA0B,KAAK,GAAG,qBAAqB;AAAA,EACtE;AAAA;AAAA,EAGA,MAAM,uBACH,KACA,MAC0B;AAC1B,WAAO,KAAK,MAAwB,KAAK,GAAG,uBAAuB;AAAA,MAChE,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,IAAI;AAAA,IAC5B,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,uBACH,KACA,QACA,MAC0B;AAC1B,WAAO,KAAK,MAAwB,KAAK,GAAG,uBAAuB,MAAM,IAAI;AAAA,MAC1E,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,IAAI;AAAA,IAC5B,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,uBAAuB,KAAa,QAA8C;AACrF,WAAO,KAAK,MAA2B,KAAK,GAAG,uBAAuB,MAAM,IAAI;AAAA,MAC7E,QAAQ;AAAA,IACX,CAAC;AAAA,EACJ;AACH;;;ACxDO,IAAM,cAAN,cAA0B,cAAc;AAAA;AAAA,EAE5C,MAAM,kBAAkB,KAAuC;AAC5D,WAAO,KAAK,MAAuB,KAAK,GAAG,kBAAkB;AAAA,EAChE;AAAA;AAAA,EAGA,MAAM,iBAAiB,KAAa,SAAyC;AAC1E,WAAO,KAAK,MAAqB,KAAK,GAAG,oBAAoB,OAAO,EAAE;AAAA,EACzE;AAAA;AAAA,EAGA,MAAM,oBACH,KACA,MACuB;AACvB,WAAO,KAAK,MAAqB,KAAK,GAAG,oBAAoB;AAAA,MAC1D,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,IAAI;AAAA,IAC5B,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,oBACH,KACA,SACA,MACuB;AACvB,WAAO,KAAK,MAAqB,KAAK,GAAG,oBAAoB,OAAO,IAAI;AAAA,MACrE,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,IAAI;AAAA,IAC5B,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,oBAAoB,KAAa,SAAgC;AACpE,WAAO,KAAK,MAAM,KAAK,GAAG,oBAAoB,OAAO,IAAI;AAAA,MACtD,QAAQ;AAAA,IACX,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,eACH,KACA,SACA,MAC6B;AAC7B,WAAO,KAAK,MAA2B,KAAK,GAAG,oBAAoB,OAAO,YAAY;AAAA,MACnF,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,IAAI;AAAA,IAC5B,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,kBAAkB,KAAa,SAAiB,UAAiC;AACpF,WAAO,KAAK,MAAM,KAAK,GAAG,oBAAoB,OAAO,YAAY,QAAQ,IAAI;AAAA,MAC1E,QAAQ;AAAA,IACX,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,iBAAiB,KAA6C;AACjE,WAAO,KAAK,MAA6B,KAAK,GAAG,gBAAgB;AAAA,EACpE;AAAA;AAAA,EAGA,MAAM,kBAAkB,KAA8C;AACnE,WAAO,KAAK,MAA8B,KAAK,GAAG,cAAc;AAAA,EACnE;AAAA;AAAA,EAGA,MAAM,mBAAmB,KAAuC;AAC7D,WAAO,KAAK,MAAuB,KAAK,GAAG,6BAA6B;AAAA,MACrE,QAAQ;AAAA,IACX,CAAC;AAAA,EACJ;AAAA;AAAA;AAAA,EAKA,MAAM,wBACH,KACA,QACA,QAAQ,IACR,SAAS,GACc;AACvB,WAAO,KAAK;AAAA,MACT,KAAK,GAAG,mBAAmB,MAAM,mBAAmB,KAAK,WAAW,MAAM;AAAA,IAC7E;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,oBACH,KACA,QACA,SAOA;AACA,WAAO,KAAK,MAAM,KAAK,GAAG,mBAAmB,MAAM,aAAa;AAAA,MAC7D,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,EAAE,QAAQ,CAAC;AAAA,IACnC,CAAC;AAAA,EACJ;AACH;;;ACnFO,IAAM,SAAN,cAAqB,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWvC,MAAM,gBAAgB,UAA0D;AAC7E,WAAO,KAAK,MAA4B,KAAK,QAAQ,EAAE;AAAA,EAC1D;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,oBAAoB,aAAyD;AAChF,WAAO,KAAK,MAAwB,KAAK,WAAW,KAAK;AAAA,EAC5D;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,sBACH,aAC0F;AAC1F,WAAO,KAAK,MAIT,KAAK,WAAW,mBAAmB;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA,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;AAAA,EAC3F;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,yBACH,aACA,MACmB;AACnB,WAAO,KAAK,MAAiB,KAAK,WAAW,YAAY;AAAA,MACtD,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,IAAI;AAAA,IAC5B,CAAC;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,uBACH,SACA,aAC+B;AAC/B,WAAO,KAAK,MAA6B,KAAK,OAAO,kBAAkB,WAAW,EAAE;AAAA,EACvF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,yBACH,aACA,UACA,MACmB;AACnB,WAAO,KAAK,MAAiB,KAAK,WAAW,YAAY,QAAQ,IAAI;AAAA,MAClE,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,IAAI;AAAA,IAC5B,CAAC;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,yBAAyB,aAA8B,UAAiC;AAC3F,WAAO,KAAK,MAAY,KAAK,WAAW,YAAY,QAAQ,IAAI;AAAA,MAC7D,QAAQ;AAAA,IACX,CAAC;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,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;AAAA,MACT,KAAK,WAAW,gBAAgB,OAAO,SAAS,CAAC;AAAA,IACpD;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,6BACH,aACA,MACoB;AACpB,WAAO,KAAK,MAAkB,KAAK,WAAW,gBAAgB;AAAA,MAC3D,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,IAAI;AAAA,IAC5B,CAAC;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,0BACH,aACA,cACoB;AACpB,WAAO,KAAK,MAAkB,KAAK,WAAW,gBAAgB,YAAY,EAAE;AAAA,EAC/E;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,6BACH,aACA,cACA,MACoB;AACpB,WAAO,KAAK,MAAkB,KAAK,WAAW,gBAAgB,YAAY,IAAI;AAAA,MAC3E,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,IAAI;AAAA,IAC5B,CAAC;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,6BACH,aACA,cACc;AACd,WAAO,KAAK,MAAY,KAAK,WAAW,gBAAgB,YAAY,IAAI;AAAA,MACrE,QAAQ;AAAA,IACX,CAAC;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,6BACH,aACA,cAC6B;AAC7B,WAAO,KAAK;AAAA,MACT,KAAK,WAAW,gBAAgB,YAAY;AAAA,MAC5C;AAAA,QACG,QAAQ;AAAA,MACX;AAAA,IACH;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,0BACH,aACA,SAOyC;AACzC,UAAM,SAAS,IAAI,gBAAgB;AACnC,QAAI,SAAS,KAAM,QAAO,OAAO,QAAQ,QAAQ,KAAK,SAAS,CAAC;AAChE,QAAI,SAAS,SAAU,QAAO,OAAO,YAAY,QAAQ,SAAS,SAAS,CAAC;AAC5E,QAAI,SAAS,OAAQ,QAAO,OAAO,UAAU,QAAQ,MAAM;AAC3D,QAAI,SAAS,UAAW,QAAO,OAAO,aAAa,QAAQ,SAAS;AACpE,QAAI,SAAS,OAAQ,QAAO,OAAO,UAAU,QAAQ,MAAM;AAE3D,WAAO,KAAK;AAAA,MACT,KAAK,WAAW,eAAe,OAAO,SAAS,CAAC;AAAA,IACnD;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,yBACH,aACA,eACsB;AACtB,WAAO,KAAK,MAAoB,KAAK,WAAW,eAAe,aAAa,EAAE;AAAA,EACjF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,4BACH,aACA,MACsB;AACtB,WAAO,KAAK,MAAoB,KAAK,WAAW,eAAe;AAAA,MAC5D,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,IAAI;AAAA,IAC5B,CAAC;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,4BACH,aACA,eACA,MACsB;AACtB,WAAO,KAAK,MAAoB,KAAK,WAAW,eAAe,aAAa,IAAI;AAAA,MAC7E,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,IAAI;AAAA,IAC5B,CAAC;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,iBAAiB,SAAiD;AACrE,WAAO,KAAK,MAA6B,KAAK,OAAO,gBAAgB;AAAA,EACxE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,uBACH,SACA,mBACA,eAC6B;AAC7B,WAAO,KAAK,MAA2B,KAAK,OAAO,yBAAyB;AAAA,MACzE,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,EAAE,mBAAmB,cAAc,CAAC;AAAA,IAC5D,CAAC;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cACH,SACA,mBACA,kBAC6B;AAC7B,WAAO,KAAK,MAA2B,KAAK,OAAO,2BAA2B;AAAA,MAC3E,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,EAAE,mBAAmB,iBAAiB,CAAC;AAAA,IAC/D,CAAC;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAa,SAAiB,mBAAyD;AAC1F,WAAO,KAAK,MAA2B,KAAK,OAAO,0BAA0B;AAAA,MAC1E,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,EAAE,kBAAkB,CAAC;AAAA,IAC7C,CAAC;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,mBACH,SACA,QAMgC;AAChC,UAAM,QAAQ,IAAI,gBAAgB;AAClC,QAAI,QAAQ,WAAY,OAAM,IAAI,eAAe,OAAO,UAAU;AAClE,QAAI,QAAQ,SAAU,OAAM,IAAI,aAAa,OAAO,QAAQ;AAC5D,QAAI,QAAQ,SAAU,OAAM,IAAI,YAAY,OAAO,QAAQ;AAC3D,QAAI,QAAQ,MAAO,OAAM,IAAI,SAAS,OAAO,OAAO,KAAK,CAAC;AAC1D,UAAM,KAAK,MAAM,SAAS;AAC1B,WAAO,KAAK;AAAA,MACT,KAAK,OAAO,wBAAwB,KAAK,IAAI,EAAE,KAAK,EAAE;AAAA,IACzD;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,oBACH,SACA,aACA,YAC6B;AAC7B,WAAO,KAAK,MAA2B,KAAK,OAAO,2BAA2B;AAAA,MAC3E,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,EAAE,aAAa,WAAW,CAAC;AAAA,IACnD,CAAC;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,kBAAkB,SAAiB,mBAA0C;AAChF,UAAM,KAAK,MAAM,KAAK,OAAO,yBAAyB;AAAA,MACnD,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,EAAE,kBAAkB,CAAC;AAAA,IAC7C,CAAC;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,aAAa,SAAwC;AACxD,WAAO,KAAK,MAAoB,KAAK,OAAO,2BAA2B;AAAA,EAC1E;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,qBACH,SACA,WACA,kBACgD;AAChD,WAAO,KAAK;AAAA,MACT,KAAK,OAAO;AAAA,MACZ;AAAA,QACG,QAAQ;AAAA,QACR,MAAM,KAAK,UAAU,EAAE,WAAW,iBAAiB,CAAC;AAAA,MACvD;AAAA,IACH;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,mBACH,SACA,gBAC4B;AAC5B,WAAO,KAAK,MAA0B,KAAK,OAAO,uCAAuC;AAAA,MACtF,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,EAAE,eAAe,CAAC;AAAA,IAC1C,CAAC;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,wBACH,aACA,eACsB;AACtB,WAAO,KAAK,MAAoB,KAAK,WAAW,eAAe,aAAa,eAAe;AAAA,EAC9F;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cACH,aACA,eACA,MACkC;AAClC,WAAO,KAAK;AAAA,MACT,KAAK,WAAW,eAAe,aAAa;AAAA,MAC5C;AAAA,QACG,QAAQ;AAAA,QACR,MAAM,KAAK,UAAU,IAAI;AAAA,MAC5B;AAAA,IACH;AAAA,EACH;AACH;;;ACvbA,SAAS,aACN,cACA,QACO;AAIP,MAAI,iBAAiB,mBAAmB;AACrC,WAAO,yBAAyB,MAAM;AAAA,EACzC,WAAW,iBAAiB,SAAS;AAClC,WAAO,sBAAsB,MAAM;AAAA,EACtC,OAAO;AACJ,WAAO,SAAS,YAAY,IAAI,MAAM;AAAA,EACzC;AACH;AAKO,IAAM,sBAAN,cAAkC,cAAc;AAAA;AAAA;AAAA;AAAA,EAIpD,MAAM,oBACH,cACsC;AACtC,UAAM,OAAO,aAAa,cAAc,QAAQ;AAChD,WAAO,KAAK,UAAwC,IAAI;AAAA,EAC3D;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,oBAAoB,cAAkE;AACzF,UAAM,OAAO,aAAa,cAAc,WAAW;AACnD,WAAO,KAAK,UAAkC,IAAI;AAAA,EACrD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAW,cAAgD;AAC9D,UAAM,OAAO,aAAa,cAAc,YAAY;AACpD,WAAO,KAAK,UAAgB,MAAM,EAAE,QAAQ,SAAS,CAAC;AAAA,EACzD;AACH;AAuDO,IAAM,WAAN,cAAuB,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOzC,MAAM,qBAAkD;AACrD,WAAO,KAAK,MAA0B,cAAc;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,UAAU,SAAuD;AACpE,WAAO,KAAK,MAAyB,mBAAmB;AAAA,MACrD,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,OAAO;AAAA,IAC/B,CAAC;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,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;AAAA,MAC7C,QAAQ;AAAA,MACR,SAAS;AAAA,QACN,gBAAgB;AAAA,MACnB;AAAA,MACA,MAAM,SAAS,SAAS;AAAA,IAC3B,CAAC;AAAA,EACJ;AACH;;;ACzIO,IAAM,kBAAN,cAA8B,cAAc;AAAA;AAAA,EAEhD,MAAM,gBAAgB,KAAa,SAA4D;AAC5F,UAAM,SAAS,IAAI,gBAAgB;AACnC,QAAI,SAAS,eAAe,QAAW;AACpC,aAAO,IAAI,eAAe,OAAO,QAAQ,UAAU,CAAC;AAAA,IACvD;AACA,UAAM,QAAQ,OAAO,SAAS;AAC9B,WAAO,KAAK,MAAqB,KAAK,GAAG,iBAAiB,QAAQ,IAAI,KAAK,KAAK,EAAE,EAAE;AAAA,EACvF;AAAA;AAAA,EAGA,MAAM,yBACH,KAC8D;AAC9D,WAAO,KAAK;AAAA,MACT,KAAK,GAAG;AAAA,IACX;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,mBACH,KACA,aAC6C;AAC7C,WAAO,KAAK,MAA2C,KAAK,GAAG,0BAA0B;AAAA,MACtF,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,EAAE,cAAc,YAAY,CAAC;AAAA,IACrD,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,eAAe,KAAa,IAA2C;AAC1E,WAAO,KAAK,MAAmB,KAAK,GAAG,kBAAkB,EAAE,EAAE;AAAA,EAChE;AAAA;AAAA,EAGA,MAAM,kBAAkB,KAAa,aAAwD;AAC1F,WAAO,KAAK,MAAmB,KAAK,GAAG,kBAAkB;AAAA,MACtD,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,WAAW;AAAA,IACnC,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,kBACH,KACA,IACA,aACqB;AACrB,WAAO,KAAK,MAAmB,KAAK,GAAG,kBAAkB,EAAE,IAAI;AAAA,MAC5D,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,WAAW;AAAA,IACnC,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,mBAAmB,KAAa,IAAsC;AACzE,WAAO,KAAK,MAAuB,KAAK,GAAG,kBAAkB,EAAE,mBAAmB;AAAA,EACrF;AAAA;AAAA,EAGA,MAAM,mBAAmB,KAAa,IAAkC;AACrE,WAAO,KAAK,MAAmB,KAAK,GAAG,kBAAkB,EAAE,YAAY;AAAA,MACpE,QAAQ;AAAA,IACX,CAAC;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,oBACH,KACA,IACA,OAAe,GACf,WAAmB,IACnB,SACsC;AACtC,UAAM,SAAS,IAAI,gBAAgB;AAAA,MAChC,MAAM,OAAO,IAAI;AAAA,MACjB,UAAU,OAAO,QAAQ;AAAA,MACzB,eAAe,OAAO,EAAE;AAAA,IAC3B,CAAC;AACD,QAAI,SAAS,OAAQ,QAAO,IAAI,UAAU,QAAQ,MAAM;AACxD,QAAI,SAAS,YAAY,OAAW,QAAO,IAAI,WAAW,OAAO,QAAQ,OAAO,CAAC;AACjF,QAAI,SAAS,SAAU,QAAO,IAAI,YAAY,QAAQ,QAAQ;AAC9D,QAAI,SAAS,OAAQ,QAAO,IAAI,UAAU,QAAQ,MAAM;AACxD,WAAO,KAAK,MAAoC,KAAK,GAAG,UAAU,MAAM,EAAE;AAAA,EAC7E;AAAA;AAAA,EAGA,MAAM,yBACH,KACA,IACA,OAAe,GACf,WAAmB,IACnB,QACsC;AACtC,UAAM,SAAS,IAAI,gBAAgB;AAAA,MAChC,MAAM,OAAO,IAAI;AAAA,MACjB,WAAW,OAAO,QAAQ;AAAA,IAC7B,CAAC;AACD,QAAI,OAAQ,QAAO,IAAI,UAAU,MAAM;AACvC,WAAO,KAAK;AAAA,MACT,KAAK,GAAG,kBAAkB,EAAE,eAAe,MAAM;AAAA,IACpD;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,oBACH,KACA,eACA,aACqB;AACrB,UAAM,WAAW,MAAM,KAAK;AAAA,MACzB,KAAK,GAAG,kBAAkB,aAAa,eAAe,WAAW;AAAA,IACpE;AACA,WAAO,SAAS,YAAY;AAAA,EAC/B;AAAA;AAAA,EAGA,MAAM,sBACH,KACA,eACA,aACA,QACmB;AACnB,WAAO,KAAK;AAAA,MACT,KAAK,GAAG,kBAAkB,aAAa,eAAe,WAAW,WAAW,MAAM;AAAA,MAClF,EAAE,QAAQ,QAAQ;AAAA,IACrB;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,uBACH,KACA,IACA,OAAe,GACf,WAAmB,IACnB,SACuC;AACvC,UAAM,SAAS,IAAI,gBAAgB;AAAA,MAChC,MAAM,OAAO,IAAI;AAAA,MACjB,UAAU,OAAO,QAAQ;AAAA,IAC5B,CAAC;AACD,QAAI,SAAS,OAAQ,QAAO,IAAI,UAAU,QAAQ,MAAM;AACxD,QAAI,SAAS,YAAY,OAAW,QAAO,IAAI,WAAW,OAAO,QAAQ,OAAO,CAAC;AACjF,QAAI,SAAS,SAAU,QAAO,IAAI,YAAY,QAAQ,QAAQ;AAC9D,QAAI,SAAS,OAAQ,QAAO,IAAI,UAAU,QAAQ,MAAM;AACxD,WAAO,KAAK;AAAA,MACT,KAAK,GAAG,kBAAkB,EAAE,aAAa,MAAM;AAAA,IAClD;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,kBAAkB,KAUtB;AACC,WAAO,KAAK,MAAM,KAAK,GAAG,gCAAgC;AAAA,EAC7D;AAAA;AAAA,EAGA,MAAM,gBACH,KACA,IACA,mBACqB;AACrB,WAAO,KAAK,MAAmB,KAAK,GAAG,kBAAkB,EAAE,SAAS;AAAA,MACjE,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,EAAE,kBAAkB,CAAC;AAAA,IAC7C,CAAC;AAAA,EACJ;AAAA,EAEA,MAAM,4BACH,KACA,QACgC;AAChC,UAAM,eAAe,IAAI,gBAAgB;AACzC,QAAI,OAAO,QAAS,cAAa,IAAI,WAAW,OAAO,OAAO;AAC9D,QAAI,OAAO,WAAY,cAAa,IAAI,eAAe,OAAO,UAAU;AACxE,QAAI,OAAO,SAAU,cAAa,IAAI,aAAa,OAAO,QAAQ;AAClE,QAAI,OAAO,SAAU,cAAa,IAAI,YAAY,OAAO,QAAQ;AACjE,QAAI,OAAO,KAAM,cAAa,IAAI,QAAQ,OAAO,IAAI;AACrD,QAAI,OAAO,MAAO,cAAa,IAAI,SAAS,OAAO,KAAK;AACxD,QAAI,OAAO,MAAO,cAAa,IAAI,SAAS,OAAO,OAAO,KAAK,CAAC;AAChE,UAAM,KAAK,aAAa,SAAS;AACjC,WAAO,KAAK;AAAA,MACT,KAAK,GAAG,wBAAwB,KAAK,IAAI,EAAE,KAAK,EAAE;AAAA,IACrD;AAAA,EACH;AAAA,EAEA,MAAM,oBACH,KACA,SACA,gBACqB;AACrB,UAAM,UAAkC,CAAC;AACzC,QAAI,gBAAgB;AACjB,cAAQ,iBAAiB,IAAI;AAAA,IAChC;AACA,WAAO,KAAK,MAAmB,KAAK,GAAG,2BAA2B;AAAA,MAC/D,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,OAAO;AAAA,MAC5B;AAAA,IACH,CAAC;AAAA,EACJ;AAAA,EAEA,MAAM,mBAAmB,KAAa,IAA2B;AAC9D,WAAO,KAAK,MAAM,KAAK,GAAG,kBAAkB,EAAE,YAAY;AAAA,MACvD,QAAQ;AAAA,IACX,CAAC;AAAA,EACJ;AACH;;;AC5OO,IAAM,oBAAN,cAAgC,cAAc;AAAA;AAAA,EAElD,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;AAAA,MACzB,KAAK,OAAO,kBAAkB,OAAO,SAAS,IAAI,IAAI,OAAO,SAAS,CAAC,KAAK,EAAE;AAAA,IACjF;AACA,WAAO,SAAS;AAAA,EACnB;AAAA;AAAA,EAGA,MAAM,yBACH,SACA,MAC4B;AAC5B,WAAO,KAAK,MAA0B,KAAK,OAAO,mBAAmB;AAAA,MAClE,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,IAAI;AAAA,IAC5B,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,yBACH,SACA,IACA,MAC4B;AAC5B,WAAO,KAAK,MAA0B,KAAK,OAAO,mBAAmB,EAAE,IAAI;AAAA,MACxE,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,IAAI;AAAA,IAC5B,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,yBAAyB,SAAiB,IAA2B;AACxE,WAAO,KAAK,MAAM,KAAK,OAAO,mBAAmB,EAAE,IAAI;AAAA,MACpD,QAAQ;AAAA,IACX,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,2BACH,SACqD;AACrD,WAAO,KAAK,MAAM,KAAK,OAAO,wBAAwB;AAAA,EACzD;AAAA;AAAA,EAGA,MAAM,2BACH,SACA,SACmC;AACnC,WAAO,KAAK,MAAiC,KAAK,OAAO,0BAA0B;AAAA,MAChF,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,EAAE,QAAQ,CAAC;AAAA,IACnC,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,sBAAqD;AACxD,UAAM,WAAW,MAAM,KAAK;AAAA,MACzB;AAAA,IACH;AACA,WAAO,SAAS;AAAA,EACnB;AAAA;AAAA,EAGA,MAAM,sBACH,MAC4B;AAC5B,WAAO,KAAK,MAA0B,0BAA0B;AAAA,MAC7D,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,IAAI;AAAA,IAC5B,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,sBACH,IACA,MAC4B;AAC5B,WAAO,KAAK,MAA0B,0BAA0B,EAAE,IAAI;AAAA,MACnE,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,IAAI;AAAA,IAC5B,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,sBAAsB,IAA2B;AACpD,WAAO,KAAK,MAAM,0BAA0B,EAAE,IAAI;AAAA,MAC/C,QAAQ;AAAA,IACX,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,sBAAsB,MAAc,UAAsC;AAC7E,UAAM,WAAW,MAAM,KAAK;AAAA,MACzB;AAAA,MACA;AAAA,QACG,QAAQ;AAAA,QACR,MAAM,KAAK,UAAU,EAAE,MAAM,GAAI,YAAY,EAAE,SAAS,EAAG,CAAC;AAAA,MAC/D;AAAA,IACH;AACA,WAAO,SAAS;AAAA,EACnB;AAAA;AAAA,EAGA,MAAM,uBAAoD;AACvD,UAAM,WAAW,MAAM,KAAK;AAAA,MACzB;AAAA,IACH;AACA,WAAO,SAAS;AAAA,EACnB;AAAA;AAAA,EAGA,MAAM,qBAAqB,MAGF;AACtB,UAAM,WAAW,MAAM,KAAK,SAAS,kCAAkC;AAAA,MACpE,QAAQ;AAAA,MACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,MAC9C,MAAM,KAAK,UAAU;AAAA,QAClB,YAAY,KAAK;AAAA,QACjB,aAAa,KAAK;AAAA,MACrB,CAAC;AAAA,IACJ,CAAC;AACD,WAAO,SAAS,YAAY;AAAA,EAC/B;AACH;;;AClHO,IAAM,aAAN,cAAyB,cAAc;AAAA;AAAA,EAE3C,MAAM,cACH,KACA,QACA,UAAgE,CAAC,GACjC;AAChC,UAAM,SAAS,IAAI,gBAAgB;AACnC,QAAI,QAAQ,QAAQ;AACjB,aAAO,OAAO,WAAW,QAAQ,OAAO,SAAS,CAAC;AAAA,IACrD,OAAO;AACJ,aAAO,OAAO,WAAW,OAAO,SAAS,CAAC;AAAA,IAC7C;AACA,QAAI,QAAQ,QAAS,QAAO,OAAO,WAAW,QAAQ,OAAO;AAC7D,QAAI,QAAQ,KAAM,QAAO,OAAO,QAAQ,QAAQ,KAAK,SAAS,CAAC;AAC/D,WAAO,KAAK,MAA8B,KAAK,GAAG,oBAAoB,MAAM,EAAE;AAAA,EACjF;AACH;;;ACvCO,IAAM,cAAN,cAA0B,cAAc;AAAA;AAAA,EAE5C,MAAM,aACH,KACA,QACoC;AACpC,UAAM,IAAI,IAAI,gBAAgB;AAC9B,QAAI,QAAQ,SAAS,OAAW,GAAE,IAAI,QAAQ,OAAO,OAAO,IAAI,CAAC;AACjE,QAAI,QAAQ,aAAa,OAAW,GAAE,IAAI,YAAY,OAAO,OAAO,QAAQ,CAAC;AAC7E,UAAM,KAAK,EAAE,SAAS,IAAI,IAAI,EAAE,SAAS,CAAC,KAAK;AAC/C,WAAO,KAAK,MAAkC,KAAK,GAAG,YAAY,EAAE,EAAE;AAAA,EACzE;AAAA,EAEA,MAAM,WAAW,KAAa,IAA8B;AACzD,WAAO,KAAK,MAAe,KAAK,GAAG,aAAa,EAAE,EAAE;AAAA,EACvD;AAAA,EAEA,MAAM,cAAc,KAAa,MAA8C;AAC5E,WAAO,KAAK,MAAe,KAAK,GAAG,aAAa;AAAA,MAC7C,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,IAAI;AAAA,IAC5B,CAAC;AAAA,EACJ;AAAA,EAEA,MAAM,cAAc,KAAa,IAAY,MAA8C;AACxF,WAAO,KAAK,MAAe,KAAK,GAAG,aAAa,EAAE,IAAI;AAAA,MACnD,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,IAAI;AAAA,IAC5B,CAAC;AAAA,EACJ;AAAA,EAEA,MAAM,cAAc,KAAa,IAA2B;AACzD,WAAO,KAAK,MAAM,KAAK,GAAG,aAAa,EAAE,IAAI,EAAE,QAAQ,SAAS,CAAC;AAAA,EACpE;AACH;;;AC9BO,IAAM,oBAAN,cAAgC,cAAc;AAAA;AAAA,EAElD,MAAM,kBACH,KACA,QAC0C;AAC1C,UAAM,QAAQ,IAAI,gBAAgB;AAClC,QAAI,QAAQ,SAAS,OAAW,OAAM,IAAI,QAAQ,OAAO,OAAO,IAAI,CAAC;AACrE,QAAI,QAAQ,aAAa,OAAW,OAAM,IAAI,YAAY,OAAO,OAAO,QAAQ,CAAC;AACjF,UAAM,KAAK,MAAM,SAAS,IAAI,IAAI,MAAM,SAAS,CAAC,KAAK;AACvD,WAAO,KAAK,MAAwC,KAAK,GAAG,kBAAkB,EAAE,EAAE;AAAA,EACrF;AAAA;AAAA,EAGA,MAAM,iBAAiB,KAAa,IAAoC;AACrE,WAAO,KAAK,MAAqB,KAAK,GAAG,mBAAmB,EAAE,EAAE;AAAA,EACnE;AAAA;AAAA,EAGA,MAAM,oCACH,KACA,YACuB;AACvB,WAAO,KAAK;AAAA,MACT,KAAK,GAAG,6BAA6B,UAAU;AAAA,IAClD;AAAA,EACH;AAAA;AAAA,EAIA,MAAM,cACH,KACA,iBACA,QACoB;AACpB,UAAM,QAAQ,IAAI,gBAAgB;AAClC,QAAI,QAAQ,gBAAiB,OAAM,IAAI,oBAAoB,MAAM;AACjE,UAAM,KAAK,MAAM,SAAS,IAAI,IAAI,MAAM,SAAS,CAAC,KAAK;AACvD,WAAO,KAAK,MAAkB,KAAK,GAAG,mBAAmB,eAAe,aAAa,EAAE,EAAE;AAAA,EAC5F;AAAA,EAEA,MAAM,eACH,KACA,iBACA,MACkB;AAClB,WAAO,KAAK,MAAgB,KAAK,GAAG,mBAAmB,eAAe,cAAc;AAAA,MACjF,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,IAAI;AAAA,IAC5B,CAAC;AAAA,EACJ;AAAA,EAEA,MAAM,YAAY,KAAa,YAAuC;AACnE,WAAO,KAAK,MAAgB,KAAK,GAAG,6BAA6B,UAAU,EAAE;AAAA,EAChF;AAAA,EAEA,MAAM,eACH,KACA,YACA,MACkB;AAClB,WAAO,KAAK,MAAgB,KAAK,GAAG,6BAA6B,UAAU,IAAI;AAAA,MAC5E,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,IAAI;AAAA,IAC5B,CAAC;AAAA,EACJ;AAAA,EAEA,MAAM,eAAe,KAAa,YAAmC;AAClE,WAAO,KAAK,MAAM,KAAK,GAAG,6BAA6B,UAAU,IAAI;AAAA,MAClE,QAAQ;AAAA,IACX,CAAC;AAAA,EACJ;AAAA;AAAA,EAIA,MAAM,iBACH,KACA,YACA,QACuB;AACvB,UAAM,QAAQ,IAAI,gBAAgB;AAClC,QAAI,QAAQ,eAAe,OAAW,OAAM,IAAI,cAAc,OAAO,OAAO,UAAU,CAAC;AACvF,QAAI,QAAQ,UAAU,OAAW,OAAM,IAAI,SAAS,OAAO,OAAO,KAAK,CAAC;AACxE,UAAM,KAAK,MAAM,SAAS,IAAI,IAAI,MAAM,SAAS,CAAC,KAAK;AACvD,WAAO,KAAK;AAAA,MACT,KAAK,GAAG,6BAA6B,UAAU,kBAAkB,EAAE;AAAA,IACtE;AAAA,EACH;AAAA,EAEA,MAAM,eAAe,KAAa,OAAqC;AACpE,WAAO,KAAK,MAAmB,KAAK,GAAG,kCAAkC,KAAK,EAAE;AAAA,EACnF;AAAA,EAEA,MAAM,iBACH,KACA,YACA,OAAgC,CAAC,GACC;AAClC,WAAO,KAAK;AAAA,MACT,KAAK,GAAG,6BAA6B,UAAU;AAAA,MAC/C;AAAA,QACG,QAAQ;AAAA,QACR,MAAM,KAAK,UAAU,IAAI;AAAA,MAC5B;AAAA,IACH;AAAA,EACH;AAAA,EAEA,MAAM,oBAAoB,KAAa,OAA8B;AAClE,UAAM,KAAK,MAAM,KAAK,GAAG,kCAAkC,KAAK,aAAa;AAAA,MAC1E,QAAQ;AAAA,IACX,CAAC;AAAA,EACJ;AAAA;AAAA;AAAA,EAIA,MAAM,eAAe,KAAa,OAAqC;AACpE,WAAO,KAAK,MAAmB,KAAK,GAAG,kCAAkC,KAAK,QAAQ;AAAA,MACnF,QAAQ;AAAA,IACX,CAAC;AAAA,EACJ;AACH;;;ACmFO,IAAM,aAAN,cAAyB,cAAc;AAAA;AAAA,EAE3C,MAAM,iBAAiB,KAAa,QAAsD;AACvF,UAAM,cAAc,IAAI,gBAAgB;AACxC,QAAI,QAAQ,YAAY;AACrB,kBAAY,OAAO,cAAc,OAAO,UAAU;AAAA,IACrD;AACA,QAAI,QAAQ,UAAU;AACnB,kBAAY,OAAO,YAAY,OAAO,QAAQ;AAAA,IACjD;AAEA,UAAM,cAAc,YAAY,SAAS;AACzC,UAAM,MAAM,KAAK,GAAG,oBAAoB,cAAc,IAAI,WAAW,KAAK,EAAE;AAE5E,WAAO,KAAK,MAAqB,GAAG;AAAA,EACvC;AAAA;AAAA,EAGA,MAAM,kBAAkB,KAAa,QAAwD;AAC1F,UAAM,cAAc,IAAI,gBAAgB;AACxC,QAAI,QAAQ,YAAY;AACrB,kBAAY,OAAO,cAAc,OAAO,UAAU;AAAA,IACrD;AACA,QAAI,QAAQ,UAAU;AACnB,kBAAY,OAAO,YAAY,OAAO,QAAQ;AAAA,IACjD;AAEA,UAAM,cAAc,YAAY,SAAS;AACzC,UAAM,MAAM,KAAK,GAAG,qBAAqB,cAAc,IAAI,WAAW,KAAK,EAAE;AAE7E,WAAO,KAAK,MAAsB,GAAG;AAAA,EACxC;AAAA;AAAA,EAGA,MAAM,oBACH,KACA,QAC0B;AAC1B,UAAM,cAAc,IAAI,gBAAgB;AACxC,QAAI,QAAQ,YAAY;AACrB,kBAAY,OAAO,cAAc,OAAO,UAAU;AAAA,IACrD;AACA,QAAI,QAAQ,UAAU;AACnB,kBAAY,OAAO,YAAY,OAAO,QAAQ;AAAA,IACjD;AAEA,UAAM,cAAc,YAAY,SAAS;AACzC,UAAM,MAAM,KAAK,GAAG,uBAAuB,cAAc,IAAI,WAAW,KAAK,EAAE;AAE/E,WAAO,KAAK,MAAwB,GAAG;AAAA,EAC1C;AAAA;AAAA,EAGA,MAAM,eACH,KACA,UACA,QAC2B;AAC3B,UAAM,cAAc,IAAI,gBAAgB;AACxC,QAAI,QAAQ,YAAY;AACrB,kBAAY,OAAO,cAAc,OAAO,UAAU;AAAA,IACrD;AACA,QAAI,QAAQ,UAAU;AACnB,kBAAY,OAAO,YAAY,OAAO,QAAQ;AAAA,IACjD;AAEA,UAAM,cAAc,YAAY,SAAS;AACzC,UAAM,MAAM,KAAK,GAAG,yBAAyB,QAAQ,GAAG,cAAc,IAAI,WAAW,KAAK,EAAE;AAE5F,WAAO,KAAK,MAAyB,GAAG;AAAA,EAC3C;AAAA;AAAA,EAGA,MAAM,oBACH,KACA,QAC0B;AAC1B,UAAM,cAAc,IAAI,gBAAgB;AACxC,QAAI,QAAQ,YAAY;AACrB,kBAAY,OAAO,cAAc,OAAO,UAAU;AAAA,IACrD;AACA,QAAI,QAAQ,UAAU;AACnB,kBAAY,OAAO,YAAY,OAAO,QAAQ;AAAA,IACjD;AAEA,UAAM,cAAc,YAAY,SAAS;AACzC,UAAM,MAAM,KAAK,GAAG,uBAAuB,cAAc,IAAI,WAAW,KAAK,EAAE;AAE/E,WAAO,KAAK,MAAwB,GAAG;AAAA,EAC1C;AACH;;;AChPO,IAAM,gBAAN,cAA4B,cAAc;AAAA,EAC9C,MAAM,oBACH,KACA,MACoC;AACpC,WAAO,KAAK;AAAA,MACT,KAAK,GAAG;AAAA,MACR;AAAA,QACG,QAAQ;AAAA,QACR,MAAM,KAAK,UAAU,IAAI;AAAA,MAC5B;AAAA,IACH;AAAA,EACH;AAAA,EAEA,MAAM,qBAAqB,KAAkD;AAC1E,WAAO,KAAK;AAAA,MACT,KAAK,GAAG;AAAA,MACR;AAAA,QACG,QAAQ;AAAA,MACX;AAAA,IACH;AAAA,EACH;AAAA,EAEA,MAAM,oBAAoB,KAAkD;AACzE,WAAO,KAAK,MAAkC,KAAK,GAAG,oCAAoC;AAAA,EAC7F;AAAA,EAEA,MAAM,qBAAqB,KAAkD;AAC1E,WAAO,KAAK;AAAA,MACT,KAAK,GAAG;AAAA,MACR;AAAA,QACG,QAAQ;AAAA,MACX;AAAA,IACH;AAAA,EACH;AAAA,EAEA,MAAM,kBAAkB,KAAkD;AACvE,WAAO,KAAK,MAAkC,KAAK,GAAG,uCAAuC;AAAA,MAC1F,QAAQ;AAAA,IACX,CAAC;AAAA,EACJ;AAAA,EAEA,MAAM,iBAAiB,KAAkD;AACtE,WAAO,KAAK,MAAkC,KAAK,GAAG,sCAAsC;AAAA,MACzF,QAAQ;AAAA,IACX,CAAC;AAAA,EACJ;AAAA,EAEA,MAAM,iBAAiB,KAA0C;AAC9D,WAAO,KAAK,MAA0B,KAAK,GAAG,sCAAsC;AAAA,MACjF,QAAQ;AAAA,IACX,CAAC;AAAA,EACJ;AAAA,EAEA,MAAM,mCACH,KACA,QACyC;AACzC,UAAM,QAAQ,IAAI,gBAAgB;AAClC,QAAI,QAAQ,UAAU,OAAW,OAAM,IAAI,SAAS,OAAO,OAAO,KAAK,CAAC;AACxE,QAAI,QAAQ,WAAW,OAAW,OAAM,IAAI,UAAU,OAAO,OAAO,MAAM,CAAC;AAC3E,UAAM,KAAK,MAAM,SAAS,IAAI,IAAI,MAAM,SAAS,CAAC,KAAK;AACvD,WAAO,KAAK;AAAA,MACT,KAAK,GAAG,qDAAqD,EAAE;AAAA,IAClE;AAAA,EACH;AAAA,EAEA,MAAM,uBACH,KACA,MAC0E;AAC1E,WAAO,KAAK,MAAM,KAAK,GAAG,mDAAmD;AAAA,MAC1E,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,IAAI;AAAA,IAC5B,CAAC;AAAA,EACJ;AAAA,EAEA,MAAM,4BACH,KACA,MAC4B;AAC5B,WAAO,KAAK,MAAM,KAAK,GAAG,wDAAwD;AAAA,MAC/E,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,IAAI;AAAA,IAC5B,CAAC;AAAA,EACJ;AAAA,EAEA,MAAM,2BACH,KACA,UAC8C;AAC9C,WAAO,KAAK,MAAM,KAAK,GAAG,qDAAqD,QAAQ,IAAI;AAAA,MACxF,QAAQ;AAAA,IACX,CAAC;AAAA,EACJ;AAAA,EAEA,MAAM,2BACH,KACA,QACmD;AACnD,UAAM,QAAQ,IAAI,gBAAgB;AAClC,QAAI,QAAQ,SAAS,OAAW,OAAM,IAAI,QAAQ,OAAO,OAAO,IAAI,CAAC;AACrE,QAAI,QAAQ,aAAa,OAAW,OAAM,IAAI,YAAY,OAAO,OAAO,QAAQ,CAAC;AACjF,QAAI,QAAQ,QAAQ,KAAK,EAAG,OAAM,IAAI,UAAU,OAAO,OAAO,KAAK,CAAC;AACpE,UAAM,KAAK,MAAM,SAAS,IAAI,IAAI,MAAM,SAAS,CAAC,KAAK;AACvD,WAAO,KAAK;AAAA,MACT,KAAK,GAAG,oDAAoD,EAAE;AAAA,IACjE;AAAA,EACH;AAAA;AAAA,EAIA,MAAM,wBAAwB,KAAoD;AAC/E,WAAO,KAAK;AAAA,MACT,KAAK,GAAG;AAAA,IACX;AAAA,EACH;AAAA,EAEA,MAAM,2BACH,KACA,MACsC;AACtC,WAAO,KAAK;AAAA,MACT,KAAK,GAAG;AAAA,MACR;AAAA,QACG,QAAQ;AAAA,QACR,MAAM,KAAK,UAAU,IAAI;AAAA,MAC5B;AAAA,IACH;AAAA,EACH;AAAA,EAEA,MAAM,yBACH,KACA,SAC0E;AAC1E,WAAO,KAAK;AAAA,MACT,KAAK,GAAG,wCAAwC,mBAAmB,OAAO,CAAC;AAAA,IAC9E;AAAA,EACH;AAAA;AAAA,EAIA,MAAM,wBACH,KACA,MACkC;AAClC,WAAO,KAAK,MAAgC,KAAK,GAAG,sCAAsC;AAAA,MACvF,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,IAAI;AAAA,IAC5B,CAAC;AAAA,EACJ;AAAA,EAEA,MAAM,wBACH,KACA,MACyC;AACzC,WAAO,KAAK;AAAA,MACT,KAAK,GAAG;AAAA,MACR;AAAA,QACG,QAAQ;AAAA,QACR,MAAM,KAAK,UAAU,IAAI;AAAA,MAC5B;AAAA,IACH;AAAA,EACH;AACH;;;ACpKO,IAAM,oBAAN,cAAgC,cAAc;AAAA,EAClD,MAAM,8BACH,KACA,cAC0B;AAC1B,WAAO,KAAK;AAAA,MACT,KAAK,GAAG,oBAAoB,YAAY;AAAA,IAC3C;AAAA,EACH;AAAA,EAEA,MAAM,wBAAwB,KAAa,cAAqD;AAC7F,WAAO,KAAK;AAAA,MACT,KAAK,GAAG,oBAAoB,YAAY;AAAA,IAC3C;AAAA,EACH;AAAA,EAEA,MAAM,2BACH,KACA,cACA,MAC8B;AAC9B,WAAO,KAAK;AAAA,MACT,KAAK,GAAG,oBAAoB,YAAY;AAAA,MACxC,EAAE,QAAQ,OAAO,MAAM,KAAK,UAAU,IAAI,EAAE;AAAA,IAC/C;AAAA,EACH;AAAA,EAEA,MAAM,4BACH,KACA,cACA,YAA2B,WAC3B,UAAkB,WACM;AACxB,UAAM,QAAQ,IAAI,gBAAgB;AAAA,MAC/B;AAAA,MACA,UAAU;AAAA,IACb,CAAC;AACD,WAAO,KAAK;AAAA,MACT,KAAK,GAAG,oBAAoB,YAAY,oBAAoB,KAAK;AAAA,IACpE;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,MAAM,aACH,KACA,cACA,SAMkB;AAClB,WAAO,KAAK,SAAS,KAAK,GAAG,oBAAoB,YAAY,aAAa;AAAA,MACvE,QAAQ;AAAA,MACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,MAC9C,MAAM,KAAK,UAAU;AAAA,QAClB,QAAQ,SAAS,UAAU;AAAA,QAC3B,kBAAkB,SAAS,oBAAoB;AAAA,QAC/C,GAAI,SAAS,aAAa,EAAE,YAAY,QAAQ,WAAW,IAAI,CAAC;AAAA,QAChE,GAAI,SAAS,UAAU,EAAE,SAAS,QAAQ,QAAQ,IAAI,CAAC;AAAA,MAC1D,CAAC;AAAA,IACJ,CAAC;AAAA,EACJ;AAAA,EAEA,MAAM,YACH,KACA,cACA,QAAgB,IACU;AAC1B,WAAO,KAAK;AAAA,MACT,KAAK,GAAG,oBAAoB,YAAY,oBAAoB,KAAK;AAAA,IACpE;AAAA,EACH;AAAA,EAEA,MAAM,qBAAqB,KAAa,cAAkD;AACvF,WAAO,KAAK;AAAA,MACT,KAAK,GAAG,oBAAoB,YAAY;AAAA,IAC3C;AAAA,EACH;AAAA,EAEA,MAAM,gBACH,KACA,cACA,OACA,QAAgB,KACa;AAC7B,WAAO,KAAK;AAAA,MACT,KAAK,GAAG,oBAAoB,YAAY,cAAc,KAAK,gBAAgB,KAAK;AAAA,IACnF;AAAA,EACH;AACH;;;AC5GO,IAAM,aAAN,cAAyB,cAAc;AAAA,EAC3C,MAAM,iBACH,KACA,MACiC;AACjC,WAAO,KAAK,MAA+B,KAAK,GAAG,sCAAsC;AAAA,MACtF,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,IAAI;AAAA,IAC5B,CAAC;AAAA,EACJ;AAAA,EAEA,MAAM,kBAAkB,KAA+C;AACpE,WAAO,KAAK,MAA+B,KAAK,GAAG,wCAAwC;AAAA,MACxF,QAAQ;AAAA,IACX,CAAC;AAAA,EACJ;AAAA,EAEA,MAAM,iBAAiB,KAA+C;AACnE,WAAO,KAAK,MAA+B,KAAK,GAAG,iCAAiC;AAAA,EACvF;AAAA,EAEA,MAAM,kBAAkB,KAA+C;AACpE,WAAO,KAAK,MAA+B,KAAK,GAAG,uCAAuC;AAAA,MACvF,QAAQ;AAAA,IACX,CAAC;AAAA,EACJ;AAAA,EAEA,MAAM,eAAe,KAA+C;AACjE,WAAO,KAAK,MAA+B,KAAK,GAAG,oCAAoC;AAAA,MACpF,QAAQ;AAAA,IACX,CAAC;AAAA,EACJ;AAAA,EAEA,MAAM,cAAc,KAA+C;AAChE,WAAO,KAAK,MAA+B,KAAK,GAAG,mCAAmC;AAAA,MACnF,QAAQ;AAAA,IACX,CAAC;AAAA,EACJ;AAAA,EAEA,MAAM,cAAc,KAA0C;AAC3D,WAAO,KAAK,MAA0B,KAAK,GAAG,mCAAmC;AAAA,MAC9E,QAAQ;AAAA,IACX,CAAC;AAAA,EACJ;AAAA,EAEA,MAAM,gCACH,KACA,QACsC;AACtC,UAAM,QAAQ,IAAI,gBAAgB;AAClC,QAAI,QAAQ,UAAU,OAAW,OAAM,IAAI,SAAS,OAAO,OAAO,KAAK,CAAC;AACxE,QAAI,QAAQ,WAAW,OAAW,OAAM,IAAI,UAAU,OAAO,OAAO,MAAM,CAAC;AAC3E,UAAM,KAAK,MAAM,SAAS,IAAI,IAAI,MAAM,SAAS,CAAC,KAAK;AACvD,WAAO,KAAK;AAAA,MACT,KAAK,GAAG,kDAAkD,EAAE;AAAA,IAC/D;AAAA,EACH;AAAA,EAEA,MAAM,oBACH,KACA,MACuE;AACvE,WAAO,KAAK,MAAM,KAAK,GAAG,gDAAgD;AAAA,MACvE,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,IAAI;AAAA,IAC5B,CAAC;AAAA,EACJ;AAAA,EAEA,MAAM,yBACH,KACA,MAC4B;AAC5B,WAAO,KAAK,MAAM,KAAK,GAAG,qDAAqD;AAAA,MAC5E,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,IAAI;AAAA,IAC5B,CAAC;AAAA,EACJ;AAAA,EAEA,MAAM,wBACH,KACA,UAC8C;AAC9C,WAAO,KAAK,MAAM,KAAK,GAAG,kDAAkD,QAAQ,IAAI;AAAA,MACrF,QAAQ;AAAA,IACX,CAAC;AAAA,EACJ;AAAA,EAEA,MAAM,wBACH,KACA,QACgD;AAChD,UAAM,QAAQ,IAAI,gBAAgB;AAClC,QAAI,QAAQ,SAAS,OAAW,OAAM,IAAI,QAAQ,OAAO,OAAO,IAAI,CAAC;AACrE,QAAI,QAAQ,aAAa,OAAW,OAAM,IAAI,YAAY,OAAO,OAAO,QAAQ,CAAC;AACjF,QAAI,QAAQ,QAAQ,KAAK,EAAG,OAAM,IAAI,UAAU,OAAO,OAAO,KAAK,CAAC;AACpE,UAAM,KAAK,MAAM,SAAS,IAAI,IAAI,MAAM,SAAS,CAAC,KAAK;AACvD,WAAO,KAAK;AAAA,MACT,KAAK,GAAG,iDAAiD,EAAE;AAAA,IAC9D;AAAA,EACH;AAAA,EAEA,MAAM,qBACH,KACA,MAC+B;AAC/B,WAAO,KAAK,MAA6B,KAAK,GAAG,mCAAmC;AAAA,MACjF,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,IAAI;AAAA,IAC5B,CAAC;AAAA,EACJ;AAAA,EAEA,MAAM,qBACH,KACA,MACsC;AACtC,WAAO,KAAK;AAAA,MACT,KAAK,GAAG;AAAA,MACR,EAAE,QAAQ,QAAQ,MAAM,KAAK,UAAU,IAAI,EAAE;AAAA,IAChD;AAAA,EACH;AAAA,EAEA,MAAM,4BAA4B,KAAmD;AAClF,WAAO,KAAK;AAAA,MACT,KAAK,GAAG;AAAA,IACX;AAAA,EACH;AAAA,EAEA,MAAM,uBAAuB,KAA2C;AACrE,WAAO,KAAK,MAA2B,KAAK,GAAG,wCAAwC;AAAA,EAC1F;AAAA,EAEA,MAAM,mBACH,KACA,QAC0B;AAC1B,UAAM,QAAQ,IAAI,gBAAgB;AAClC,QAAI,QAAQ,SAAU,OAAM,IAAI,YAAY,OAAO,OAAO,QAAQ,CAAC;AACnE,QAAI,QAAQ,OAAQ,OAAM,IAAI,UAAU,OAAO,MAAM;AACrD,UAAM,KAAK,MAAM,SAAS,IAAI,IAAI,MAAM,SAAS,CAAC,KAAK;AACvD,WAAO,KAAK,MAAM,KAAK,GAAG,qCAAqC,EAAE,EAAE;AAAA,EACtE;AAAA,EAEA,MAAM,2BAA2B,KAAyC;AACvE,WAAO,KAAK;AAAA,MACT,KAAK,GAAG;AAAA,IACX;AAAA,EACH;AACH;;;AC1LO,IAAM,WAAN,cAAuB,cAAc;AAAA;AAAA,EAEzC,MAAM,SAAS,KAA8B;AAC1C,WAAO,KAAK,MAAc,KAAK,GAAG,QAAQ;AAAA,EAC7C;AAAA;AAAA,EAGA,MAAM,0BACH,KACA,MACA,WAA0B,MACI;AAC9B,UAAM,SAAS,IAAI,gBAAgB;AACnC,QAAI,SAAU,QAAO,OAAO,aAAa,QAAQ;AACjD,WAAO,KAAK;AAAA,MACT,KAAK,GAAG,oBAAoB,IAAI,IAAI,OAAO,SAAS,CAAC;AAAA,IACxD;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,4BACH,KACA,QACA,WAA0B,MACG;AAC7B,UAAM,SAAS,IAAI,gBAAgB;AACnC,QAAI,SAAU,QAAO,OAAO,aAAa,QAAQ;AACjD,WAAO,KAAK;AAAA,MACT,KAAK,GAAG,2BAA2B,MAAM,IAAI,OAAO,SAAS,CAAC;AAAA,IACjE;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,QAAQ,KAAa,IAA2B;AACnD,WAAO,KAAK,MAAY,KAAK,GAAG,UAAU,EAAE,EAAE;AAAA,EACjD;AAAA;AAAA,EAGA,MAAM,cAAc,KAAa,MAA6B;AAC3D,WAAO,KAAK,MAAY,KAAK,GAAG,IAAI,IAAI,EAAE;AAAA,EAC7C;AAAA;AAAA,EAGA,MAAM,oBACH,KACA,UACA,cACsB;AACtB,WAAO,KAAK,MAAoB,KAAK,GAAG,IAAI,QAAQ,UAAU,YAAY,EAAE;AAAA,EAC/E;AAAA;AAAA,EAGA,MAAM,oBAAoB,KAAa,UAAqC;AAEzE,WAAO,KAAK,MAAgB,KAAK,GAAG,IAAI,QAAQ,OAAO;AAAA,EAC1D;AAAA;AAAA,EAGA,MAAM,WAAW,KAAa,UAA+C;AAC1E,WAAO,KAAK,MAA0B,KAAK,GAAG,IAAI,QAAQ,WAAW;AAAA,MAClE,QAAQ;AAAA,IACX,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,kBACH,KACA,UACA,aAC+C;AAC/C,WAAO,KAAK;AAAA,MACT,KAAK,GAAG,IAAI,QAAQ;AAAA,MACpB;AAAA,QACG,QAAQ;AAAA,QACR,MAAM,KAAK,UAAU,EAAE,YAAY,CAAC;AAAA,MACvC;AAAA,IACH;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,kBACH,KACA,UACA,OAC+C;AAC/C,WAAO,KAAK;AAAA,MACT,KAAK,GAAG,IAAI,QAAQ;AAAA,MACpB;AAAA,QACG,QAAQ;AAAA,QACR,MAAM,KAAK,UAAU,EAAE,MAAM,CAAC;AAAA,MACjC;AAAA,IACH;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,eACH,KACA,UACA,MACA,aACA,OACiE;AAEjE,UAAM,iBAAiB,MAAM,KAAK,MAI/B,KAAK,GAAG,IAAI,QAAQ,gBAAgB;AAAA,MACpC,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,EAAE,MAAM,aAAa,MAAM,CAAC;AAAA,IACpD,CAAC;AAGD,UAAM,mBAAmB,MAAM,MAAM,sBAAsB;AAAA,MACxD,QAAQ;AAAA,MACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,MAC9C,MAAM,KAAK,UAAU,EAAE,OAAO,eAAe,MAAM,CAAC;AAAA,IACvD,CAAC;AAED,QAAI,CAAC,iBAAiB,IAAI;AACvB,YAAM,IAAI,MAAM,mCAAmC;AAAA,IACtD;AAEA,WAAO;AAAA,EACV;AAAA;AAAA,EAGA,MAAM,UAAU,KAAa,QAA+B;AACzD,WAAO,KAAK,MAAY,KAAK,GAAG,UAAU,MAAM,UAAU;AAAA,MACvD,QAAQ;AAAA,IACX,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,WAAW,KAAa,MAAmC;AAC9D,WAAO,KAAK,MAAY,KAAK,GAAG,UAAU;AAAA,MACvC,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,IAAI;AAAA,IAC5B,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,WAAW,KAAa,IAAY,MAA4C;AACnF,WAAO,KAAK,MAAY,KAAK,GAAG,UAAU,EAAE,IAAI;AAAA,MAC7C,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,IAAI;AAAA,IAC5B,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,WAAW,KAAa,IAA2B;AACtD,WAAO,KAAK,MAAM,KAAK,GAAG,UAAU,EAAE,IAAI;AAAA,MACvC,QAAQ;AAAA,IACX,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,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;AAAA,MACT,KAAK,GAAG,UAAU,MAAM,SAAS,OAAO,SAAS,IAAI,IAAI,OAAO,SAAS,CAAC,KAAK,EAAE;AAAA,IACpF;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,QAAQ,KAAa,QAAgB,QAA+B;AACvE,WAAO,KAAK,MAAY,KAAK,GAAG,UAAU,MAAM,UAAU,MAAM,EAAE;AAAA,EACrE;AAAA;AAAA,EAGA,MAAM,cAAc,KAAa,QAAgB,MAA6B;AAC3E,WAAO,KAAK,MAAY,KAAK,GAAG,UAAU,MAAM,kBAAkB,IAAI,EAAE;AAAA,EAC3E;AAAA;AAAA,EAGA,MAAM,WAAW,KAAa,QAAgB,MAAmC;AAC9E,WAAO,KAAK,MAAY,KAAK,GAAG,UAAU,MAAM,UAAU;AAAA,MACvD,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,IAAI;AAAA,IAC5B,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,WACH,KACA,QACA,QACA,MACc;AACd,WAAO,KAAK,MAAY,KAAK,GAAG,UAAU,MAAM,UAAU,MAAM,IAAI;AAAA,MACjE,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,IAAI;AAAA,IAC5B,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,WAAW,KAAa,QAAgB,QAA+B;AAC1E,WAAO,KAAK,MAAM,KAAK,GAAG,UAAU,MAAM,UAAU,MAAM,IAAI;AAAA,MAC3D,QAAQ;AAAA,IACX,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,cAAc,KAAa,QAA6C;AAC3E,WAAO,KAAK,MAA0B,KAAK,GAAG,UAAU,MAAM,SAAS;AAAA,EAC1E;AAAA;AAAA,EAGA,MAAM,YAAY,KAAa,QAAmC;AAC/D,WAAO,KAAK,MAAgB,KAAK,GAAG,UAAU,MAAM,OAAO;AAAA,EAC9D;AAAA;AAAA,EAGA,MAAM,aAAa,KAAa,QAAgB,UAA+C;AAC5F,UAAM,SAAS,IAAI,gBAAgB;AACnC,QAAI,aAAa,UAAa,aAAa,MAAM;AAC9C,aAAO,OAAO,aAAa,SAAS,SAAS,CAAC;AAAA,IACjD;AACA,UAAM,QAAQ,OAAO,SAAS;AAC9B,WAAO,KAAK;AAAA,MACT,KAAK,GAAG,UAAU,MAAM,cAAc,QAAQ,IAAI,KAAK,KAAK,EAAE;AAAA,IACjE;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,eAAe,KAAa,QAAgB,MAA2C;AAC1F,WAAO,KAAK,MAAgB,KAAK,GAAG,UAAU,MAAM,eAAe;AAAA,MAChE,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,IAAI;AAAA,IAC5B,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,eACH,KACA,QACA,QACA,MACkB;AAClB,WAAO,KAAK,MAAgB,KAAK,GAAG,UAAU,MAAM,eAAe,MAAM,IAAI;AAAA,MAC1E,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,IAAI;AAAA,IAC5B,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,eAAe,KAAa,QAAgB,QAA+B;AAC9E,WAAO,KAAK,MAAM,KAAK,GAAG,UAAU,MAAM,eAAe,MAAM,IAAI;AAAA,MAChE,QAAQ;AAAA,IACX,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,iBAAiB,KAAa,QAAgB,MAA2C;AAC5F,WAAO,KAAK,MAAM,KAAK,GAAG,UAAU,MAAM,iBAAiB;AAAA,MACxD,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,IAAI;AAAA,IAC5B,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,2BACH,KACA,QACA,eAC4B;AAC5B,WAAO,KAAK,MAA0B,KAAK,GAAG,UAAU,MAAM,qBAAqB;AAAA,MAChF,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,aAAa;AAAA,IACrC,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,wBACH,KACA,UACA,QACsC;AACtC,UAAM,SAAS,IAAI,gBAAgB,EAAE,OAAO,CAAC;AAC7C,WAAO,KAAK;AAAA,MACT,KAAK,GAAG,IAAI,QAAQ,yBAAyB,OAAO,SAAS,CAAC;AAAA,IACjE;AAAA,EACH;AACH;;;ACtTO,IAAM,mBAAN,cAA+B,cAAc;AAAA;AAAA,EAEjD,MAAM,mBAA4C;AAC/C,WAAO,KAAK,MAAsB,eAAe;AAAA,EACpD;AAAA;AAAA,EAGA,MAAM,0BAA0B,KAAsC;AACnE,WAAO,KAAK,MAAsB,KAAK,GAAG,gBAAgB;AAAA,EAC7D;AAAA;AAAA,EAGA,MAAM,mBAAmB,gBAAuC;AAC7D,WAAO,KAAK,MAAM,iBAAiB,cAAc,WAAW;AAAA,MACzD,QAAQ;AAAA,MACR,aAAa;AAAA,IAChB,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,uBAAuB,gBAAsD;AAChF,WAAO,KAAK,MAAM,iBAAiB,cAAc,eAAe;AAAA,MAC7D,QAAQ;AAAA,MACR,aAAa;AAAA,IAChB,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,mBACH,gBACA,SAO6B;AAC7B,WAAO,KAAK,MAAM,iBAAiB,cAAc,IAAI;AAAA,MAClD,QAAQ;AAAA,MACR,aAAa;AAAA,MACb,MAAM,KAAK,UAAU,OAAO;AAAA,MAC5B,SAAS;AAAA,QACN,gBAAgB;AAAA,MACnB;AAAA,IACH,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,2BACH,gBACA,MAaA;AACA,WAAO,KAAK,MAAM,iBAAiB,cAAc,kBAAkB;AAAA,MAChE,QAAQ;AAAA,MACR,aAAa;AAAA,MACb,MAAM,KAAK,UAAU,IAAI;AAAA,MACzB,SAAS;AAAA,QACN,gBAAgB;AAAA,MACnB;AAAA,IACH,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,gBACH,gBACA,aAOA;AACA,WAAO,KAAK,MAAM,iBAAiB,cAAc,qBAAqB;AAAA,MACnE,QAAQ;AAAA,MACR,aAAa;AAAA,MACb,MAAM,KAAK,UAAU,EAAE,cAAc,YAAY,CAAC;AAAA,MAClD,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,IACjD,CAAC;AAAA,EACJ;AACH;;;ACjFO,IAAM,eAAN,cAA2B,cAAc;AAAA,EAC7C,MAAM,iBAAgD;AACnD,WAAO,KAAK,MAA4B,WAAW;AAAA,EACtD;AAAA,EAEA,MAAM,cAAc,MAA2C;AAC5D,WAAO,KAAK,MAA0B,aAAa,IAAI,EAAE;AAAA,EAC5D;AAAA,EAEA,MAAM,sBAAsB,MAA0C;AACnE,WAAO,KAAK,MAAyB,aAAa,IAAI,WAAW;AAAA,EACpE;AAAA,EAEA,MAAM,2BACH,MACA,MACkF;AAClF,UAAM,SAAS,IAAI,gBAAgB;AACnC,QAAI,MAAM,OAAQ,QAAO,IAAI,UAAU,KAAK,MAAM;AAClD,QAAI,MAAM,KAAM,QAAO,IAAI,QAAQ,OAAO,KAAK,IAAI,CAAC;AACpD,QAAI,MAAM,SAAU,QAAO,IAAI,aAAa,OAAO,KAAK,QAAQ,CAAC;AACjE,UAAM,KAAK,OAAO,SAAS;AAC3B,WAAO,KAAK,MAAM,aAAa,IAAI,iBAAiB,KAAK,MAAM,KAAK,EAAE,EAAE;AAAA,EAC3E;AAAA,EAEA,MAAM,sBAAsB,MAAkC;AAC3D,WAAO,KAAK,MAAiB,aAAa,IAAI,WAAW;AAAA,EAC5D;AAAA,EAEA,MAAM,iBAAiB,MAAc,MAA0D;AAC5F,WAAO,KAAK,MAA0B,aAAa,IAAI,IAAI;AAAA,MACxD,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,IAAI;AAAA,MACzB,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,IACjD,CAAC;AAAA,EACJ;AAAA;AAAA,EAIA,MAAM,4BACH,MACyE;AACzE,WAAO,KAAK,MAAM,aAAa,IAAI,wBAAwB,EAAE,QAAQ,OAAO,CAAC;AAAA,EAChF;AAAA,EAEA,MAAM,4BAA4B,MAA8C;AAC7E,WAAO,KAAK,MAA6B,aAAa,IAAI,yBAAyB;AAAA,EACtF;AAAA,EAEA,MAAM,8BACH,MACA,iBACA,eAAwB,OAC8D;AACtF,WAAO,KAAK,MAAM,aAAa,IAAI,2BAA2B,eAAe,WAAW;AAAA,MACrF,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,EAAE,aAAa,CAAC;AAAA,IACxC,CAAC;AAAA,EACJ;AAAA,EAEA,MAAM,8BACH,MACA,iBAC8C;AAC9C,WAAO,KAAK,MAAM,aAAa,IAAI,2BAA2B,eAAe,IAAI;AAAA,MAC9E,QAAQ;AAAA,IACX,CAAC;AAAA,EACJ;AAAA,EAEA,MAAM,kCACH,MACA,iBAC8C;AAC9C,WAAO,KAAK,MAAM,aAAa,IAAI,2BAA2B,eAAe,gBAAgB;AAAA,MAC1F,QAAQ;AAAA,IACX,CAAC;AAAA,EACJ;AACH;;;ACnFO,IAAM,eAAN,cAA2B,cAAc;AAAA,EAC7C,MAAM,iBAAgD;AACnD,WAAO,KAAK,MAA4B,WAAW;AAAA,EACtD;AAAA,EAEA,MAAM,cAAc,MAA2C;AAC5D,WAAO,KAAK,MAA0B,aAAa,IAAI,EAAE;AAAA,EAC5D;AAAA,EAEA,MAAM,sBAAsB,MAA0C;AACnE,WAAO,KAAK,MAAyB,aAAa,IAAI,WAAW;AAAA,EACpE;AAAA,EAEA,MAAM,sBAAsB,MAAkC;AAC3D,WAAO,KAAK,MAAiB,aAAa,IAAI,WAAW;AAAA,EAC5D;AAAA,EAEA,MAAM,2BACH,MACA,MACkF;AAClF,UAAM,SAAS,IAAI,gBAAgB;AACnC,QAAI,MAAM,OAAQ,QAAO,IAAI,UAAU,KAAK,MAAM;AAClD,QAAI,MAAM,KAAM,QAAO,IAAI,QAAQ,OAAO,KAAK,IAAI,CAAC;AACpD,QAAI,MAAM,SAAU,QAAO,IAAI,aAAa,OAAO,KAAK,QAAQ,CAAC;AACjE,UAAM,KAAK,OAAO,SAAS;AAC3B,WAAO,KAAK,MAAM,aAAa,IAAI,iBAAiB,KAAK,MAAM,KAAK,EAAE,EAAE;AAAA,EAC3E;AAAA,EAEA,MAAM,iBAAiB,MAAc,MAA0D;AAC5F,WAAO,KAAK,MAA0B,aAAa,IAAI,IAAI;AAAA,MACxD,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,IAAI;AAAA,MACzB,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,IACjD,CAAC;AAAA,EACJ;AACH;;;ACxBO,IAAM,iBAAN,cAA6B,cAAc;AAAA;AAAA,EAE/C,MAAM,eAAe,KAAoC;AACtD,WAAO,KAAK,MAAoB,KAAK,GAAG,cAAc;AAAA,EACzD;AAAA;AAAA,EAGA,MAAM,cAAc,KAAa,IAAiC;AAC/D,WAAO,KAAK,MAAkB,KAAK,GAAG,gBAAgB,EAAE,EAAE;AAAA,EAC7D;AAAA;AAAA,EAGA,MAAM,iBAAiB,KAAa,YAAqD;AACtF,WAAO,KAAK,MAAkB,KAAK,GAAG,gBAAgB;AAAA,MACnD,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,UAAU;AAAA,IAClC,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,iBACH,KACA,IACA,YACoB;AACpB,WAAO,KAAK,MAAkB,KAAK,GAAG,gBAAgB,EAAE,IAAI;AAAA,MACzD,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,UAAU;AAAA,IAClC,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,iBAAiB,KAAa,IAA2B;AAC5D,WAAO,KAAK,MAAM,KAAK,GAAG,gBAAgB,EAAE,IAAI;AAAA,MAC7C,QAAQ;AAAA,IACX,CAAC;AAAA,EACJ;AACH;;;ACvDO,IAAM,WAAN,cAAuB,cAAc;AAAA;AAAA,EAEzC,MAAM,SACH,KACA,UAGI,CAAC,GACW;AAChB,UAAM,SAAS,IAAI,gBAAgB;AACnC,QAAI,QAAQ,iBAAiB;AAC1B,aAAO,OAAO,oBAAoB,MAAM;AAAA,IAC3C;AACA,QAAI,QAAQ,YAAY;AACrB,aAAO,OAAO,eAAe,QAAQ,WAAW,SAAS,CAAC;AAAA,IAC7D;AACA,WAAO,KAAK;AAAA,MACT,KAAK,GAAG,SAAS,OAAO,SAAS,IAAI,IAAI,OAAO,SAAS,CAAC,KAAK,EAAE;AAAA,IACpE;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,QAAQ,KAAa,IAAoC;AAC5D,WAAO,KAAK,MAAY,KAAK,GAAG,UAAU,EAAE,EAAE;AAAA,EACjD;AAAA;AAAA,EAGA,MAAM,WAAW,KAAa,MAAmC;AAC9D,WAAO,KAAK,MAAY,KAAK,GAAG,UAAU;AAAA,MACvC,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,IAAI;AAAA,IAC5B,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,WAAW,KAAa,IAAY,MAA4C;AACnF,WAAO,KAAK,MAAY,KAAK,GAAG,UAAU,EAAE,IAAI;AAAA,MAC7C,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,IAAI;AAAA,IAC5B,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,WAAW,KAAa,IAA2B;AACtD,WAAO,KAAK,MAAM,KAAK,GAAG,UAAU,EAAE,IAAI;AAAA,MACvC,QAAQ;AAAA,IACX,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,YAAY,KAAa,IAA2B;AACvD,WAAO,KAAK,MAAY,KAAK,GAAG,UAAU,EAAE,YAAY;AAAA,MACrD,QAAQ;AAAA,IACX,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,cAAc,KAAa,IAA2B;AACzD,WAAO,KAAK,MAAY,KAAK,GAAG,UAAU,EAAE,cAAc;AAAA,MACvD,QAAQ;AAAA,IACX,CAAC;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,MAAM,UAAU,KAAa,QAAgB,MAAc,MAA8B;AACtF,WAAO,KAAK,MAAY,KAAK,GAAG,UAAU,MAAM,UAAU;AAAA,MACvD,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,EAAE,MAAM,KAAK,CAAC;AAAA,IACtC,CAAC;AAAA,EACJ;AACH;;;ACCO,IAAM,eAAN,cAA2B,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAO7C,MAAM,mBACH,KACA,SACiC;AACjC,WAAO,KAAK,MAA+B,KAAK,GAAG,sBAAsB;AAAA,MACtE,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,OAAO;AAAA,IAC/B,CAAC;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,gBACH,KACA,SACiC;AACjC,WAAO,KAAK,MAA+B,KAAK,GAAG,sBAAsB;AAAA,MACtE,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,OAAO;AAAA,IAC/B,CAAC;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,oBACH,KACA,UAAmC,CAAC,GACF;AAClC,UAAM,SAAS,IAAI,gBAAgB;AACnC,QAAI,QAAQ,WAAW;AACpB,aAAO,OAAO,cAAc,QAAQ,SAAS;AAAA,IAChD;AACA,QAAI,QAAQ,mBAAmB;AAC5B,aAAO,OAAO,sBAAsB,MAAM;AAAA,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;AAAA,EACrE;AACH;;;ACrIO,IAAM,cAAN,cAA0B,cAAc;AAAA;AAAA;AAAA;AAAA,EAI5C,MAAM,YAAY,KAAwC;AACvD,WAAO,KAAK,MAAwB,KAAK,GAAG,WAAW;AAAA,EAC1D;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,QAAQ,KAAa,QAAgB,UAAyC;AACjF,WAAO,KAAK;AAAA,MACT,KAAK,GAAG,UAAU,MAAM,SAAS,mBAAmB,QAAQ,CAAC;AAAA,IAChE;AAAA,EACH;AACH;;;ACLO,IAAM,cAAN,cAA0B,cAAc;AAAA;AAAA,EAE5C,MAAM,YACH,KACA,kBAA2B,OAC3B,UACoC;AACpC,UAAM,QAAQ,IAAI,gBAAgB;AAClC,QAAI,gBAAiB,OAAM,IAAI,oBAAoB,MAAM;AACzD,QAAI,UAAU,SAAS,OAAW,OAAM,IAAI,QAAQ,OAAO,SAAS,IAAI,CAAC;AACzE,QAAI,UAAU,aAAa,OAAW,OAAM,IAAI,YAAY,OAAO,SAAS,QAAQ,CAAC;AACrF,UAAM,KAAK,MAAM,SAAS,IAAI,IAAI,MAAM,SAAS,CAAC,KAAK;AACvD,WAAO,KAAK,MAAkC,KAAK,GAAG,YAAY,EAAE,EAAE;AAAA,EACzE;AAAA;AAAA,EAGA,MAAM,WAAW,KAAa,WAAqC;AAChE,WAAO,KAAK,MAAe,KAAK,GAAG,aAAa,SAAS,EAAE;AAAA,EAC9D;AAAA;AAAA,EAGA,MAAM,cAAc,KAAa,MAAyC;AACvE,WAAO,KAAK,MAAe,KAAK,GAAG,aAAa;AAAA,MAC7C,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,IAAI;AAAA,IAC5B,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,cACH,KACA,WACA,MACiB;AACjB,WAAO,KAAK,MAAe,KAAK,GAAG,aAAa,SAAS,IAAI;AAAA,MAC1D,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,IAAI;AAAA,IAC5B,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,eAAe,KAAa,WAAgD;AAC/E,WAAO,KAAK,MAA0B,KAAK,GAAG,aAAa,SAAS,IAAI;AAAA,MACrE,QAAQ;AAAA,IACX,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,WACH,KACA,WACA,MACqB;AACrB,WAAO,KAAK,MAAmB,KAAK,GAAG,aAAa,SAAS,UAAU;AAAA,MACpE,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,IAAI;AAAA,IAC5B,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,WACH,KACA,WACA,UACA,MACqB;AACrB,WAAO,KAAK,MAAmB,KAAK,GAAG,aAAa,SAAS,UAAU,QAAQ,IAAI;AAAA,MAChF,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,IAAI;AAAA,IAC5B,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,YACH,KACA,WACA,UAC4B;AAC5B,WAAO,KAAK,MAA0B,KAAK,GAAG,aAAa,SAAS,UAAU,QAAQ,IAAI;AAAA,MACvF,QAAQ;AAAA,IACX,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,iBACH,KACA,WACA,MAC+B;AAC/B,WAAO,KAAK,MAA6B,KAAK,GAAG,aAAa,SAAS,gBAAgB;AAAA,MACpF,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,IAAI;AAAA,IAC5B,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,iBACH,KACA,WACA,cACA,MAC+B;AAC/B,WAAO,KAAK;AAAA,MACT,KAAK,GAAG,aAAa,SAAS,gBAAgB,YAAY;AAAA,MAC1D,EAAE,QAAQ,OAAO,MAAM,KAAK,UAAU,IAAI,EAAE;AAAA,IAC/C;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,iBACH,KACA,WACA,cAC4B;AAC5B,WAAO,KAAK;AAAA,MACT,KAAK,GAAG,aAAa,SAAS,gBAAgB,YAAY;AAAA,MAC1D,EAAE,QAAQ,SAAS;AAAA,IACtB;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,WACH,KACA,WACA,MACqB;AACrB,WAAO,KAAK,MAAmB,KAAK,GAAG,aAAa,SAAS,UAAU;AAAA,MACpE,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,IAAI;AAAA,IAC5B,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,WACH,KACA,WACA,UACA,MACqB;AACrB,WAAO,KAAK,MAAmB,KAAK,GAAG,aAAa,SAAS,UAAU,QAAQ,IAAI;AAAA,MAChF,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,IAAI;AAAA,IAC5B,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,WAAW,KAAa,WAAmB,UAA+C;AAC7F,WAAO,KAAK,MAA0B,KAAK,GAAG,aAAa,SAAS,UAAU,QAAQ,IAAI;AAAA,MACvF,QAAQ;AAAA,IACX,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,kBACH,KACA,WACA,QAC0C;AAC1C,UAAM,KAAK,IAAI,gBAAgB;AAC/B,QAAI,QAAQ,KAAM,IAAG,IAAI,QAAQ,OAAO,OAAO,IAAI,CAAC;AACpD,QAAI,QAAQ,SAAU,IAAG,IAAI,YAAY,OAAO,OAAO,QAAQ,CAAC;AAChE,QAAI,QAAQ,OAAQ,IAAG,IAAI,UAAU,OAAO,MAAM;AAClD,UAAM,QAAQ,GAAG,SAAS;AAC1B,WAAO,KAAK;AAAA,MACT,KAAK,GAAG,aAAa,SAAS,WAAW,QAAQ,IAAI,KAAK,KAAK,EAAE;AAAA,IACpE;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,cACH,KACA,WACA,MACyB;AACzB,WAAO,KAAK,MAAuB,KAAK,GAAG,aAAa,SAAS,WAAW;AAAA,MACzE,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,IAAI;AAAA,IAC5B,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,gBACH,KACA,WACA,MACyB;AACzB,WAAO,KAAK,MAAuB,KAAK,GAAG,aAAa,SAAS,aAAa;AAAA,MAC3E,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,IAAI;AAAA,IAC5B,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,eAAe,KAAa,WAAmB,UAA0C;AAC5F,WAAO,KAAK,MAAqB,KAAK,GAAG,aAAa,SAAS,aAAa;AAAA,MACzE,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,EAAE,SAAS,CAAC;AAAA,IACpC,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,iBAAiB,KAAa,WAAmB,UAAiC;AACrF,UAAM,KAAK,MAAM,KAAK,GAAG,aAAa,SAAS,YAAY,QAAQ,IAAI;AAAA,MACpE,QAAQ;AAAA,IACX,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,kBAAkB,KAAa,UAA4C;AAC9E,WAAO,KAAK,MAAuB,KAAK,GAAG,uBAAuB,QAAQ,EAAE;AAAA,EAC/E;AAAA;AAAA;AAAA,EAKA,MAAM,gBAAgB,KAAa,WAA2C;AAC3E,WAAO,KAAK,MAAqB,KAAK,GAAG,aAAa,SAAS,QAAQ;AAAA,EAC1E;AAAA;AAAA,EAGA,MAAM,kBACH,KACA,WACA,MACqB;AACrB,WAAO,KAAK,MAAmB,KAAK,GAAG,aAAa,SAAS,UAAU;AAAA,MACpE,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,IAAI;AAAA,IAC5B,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,kBACH,KACA,WACA,QACA,MACqB;AACrB,WAAO,KAAK,MAAmB,KAAK,GAAG,aAAa,SAAS,UAAU,MAAM,IAAI;AAAA,MAC9E,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,IAAI;AAAA,IAC5B,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,kBAAkB,KAAa,WAAmB,QAA+B;AACpF,WAAO,KAAK,MAAY,KAAK,GAAG,aAAa,SAAS,UAAU,MAAM,IAAI;AAAA,MACvE,QAAQ;AAAA,IACX,CAAC;AAAA,EACJ;AACH;;;AChPO,IAAM,eAAN,cAA2B,cAAc;AAAA;AAAA,EAE7C,MAAM,aAAa,KAAa,WAAoB,OAA4B;AAC7E,UAAM,MAAM,WAAW,KAAK,GAAG,6BAA6B,KAAK,GAAG;AACpE,WAAO,KAAK,MAAkB,GAAG;AAAA,EACpC;AAAA;AAAA,EAGA,MAAM,YAAY,KAAa,IAAwC;AACpE,WAAO,KAAK,MAAgB,KAAK,GAAG,cAAc,EAAE,EAAE;AAAA,EACzD;AAAA;AAAA,EAGA,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;AAAA,EACnF;AAAA;AAAA,EAGA,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;AAAA,MACT,KAAK,GAAG,6BAA6B,OAAO,SAAS,CAAC;AAAA,IACzD;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,mBACH,KACA,IACgD;AAChD,WAAO,KAAK,MAA8C,KAAK,GAAG,cAAc,EAAE,UAAU;AAAA,EAC/F;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,wBAAwB,KAAa,IAAoB;AACtD,QAAI,KAAK,eAAe;AAErB,aAAO,aAAa,GAAG,cAAc,EAAE;AAAA,IAC1C;AAEA,WAAO,GAAG,KAAK,OAAO,aAAa,GAAG,cAAc,EAAE;AAAA,EACzD;AAAA;AAAA,EAGA,MAAM,eAAe,KAAa,UAA+C;AAC9E,WAAO,KAAK,MAAgB,KAAK,GAAG,cAAc;AAAA,MAC/C,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,QAAQ;AAAA,IAChC,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,eACH,KACA,IACA,UACkB;AAClB,WAAO,KAAK,MAAgB,KAAK,GAAG,cAAc,EAAE,IAAI;AAAA,MACrD,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,QAAQ;AAAA,IAChC,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,2BACH,KACA,IAKA;AACA,WAAO,KAAK,MAAM,KAAK,GAAG,cAAc,EAAE,mBAAmB;AAAA,EAChE;AAAA;AAAA,EAGA,MAAM,eACH,KACA,IACA,UAAmB,OACmC;AACtD,UAAM,MAAM,UAAU,KAAK,GAAG,cAAc,EAAE,kBAAkB,KAAK,GAAG,cAAc,EAAE;AACxF,WAAO,KAAK,MAAM,KAAK;AAAA,MACpB,QAAQ;AAAA,IACX,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,gBAAgB,KAAa,IAAyC;AACzE,WAAO,KAAK,MAAM,KAAK,GAAG,cAAc,EAAE,YAAY;AAAA,MACnD,QAAQ;AAAA,IACX,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,kBAAkB,KAAa,IAAyC;AAC3E,WAAO,KAAK,MAAM,KAAK,GAAG,cAAc,EAAE,cAAc;AAAA,MACrD,QAAQ;AAAA,IACX,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,cAAc,KAAa,IAAY,MAA2C;AACrF,WAAO,KAAK,MAAgB,KAAK,GAAG,cAAc,EAAE,UAAU;AAAA,MAC3D,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,IAAI;AAAA,IAC5B,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,qBAAqB,KAA0C;AAClE,WAAO,KAAK,MAA0B,KAAK,GAAG,sBAAsB;AAAA,EACvE;AAAA;AAAA,EAGA,MAAM,2BACH,KACA,cACA,MACkB;AAClB,WAAO,KAAK,MAAgB,KAAK,GAAG,wBAAwB,YAAY,oBAAoB;AAAA,MACzF,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,IAAI;AAAA,IAC5B,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,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;AAAA,MACT,KAAK,GAAG,cAAc,EAAE,0BAA0B,OAAO,SAAS,CAAC;AAAA,IACtE;AAAA,EACH;AAAA;AAAA,EAGA,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;AAAA,MACT,KAAK,GAAG,cAAc,UAAU,UAAU,MAAM,UAAU,OAAO,SAAS,CAAC;AAAA,IAC9E;AAAA,EACH;AAAA,EAEA,MAAM,4BACH,KACA,YAC0C;AAC1C,WAAO,KAAK;AAAA,MACT,KAAK,GAAG,cAAc,UAAU;AAAA,IACnC;AAAA,EACH;AAAA,EAEA,MAAM,4BACH,KACA,YAC0C;AAC1C,WAAO,KAAK;AAAA,MACT,KAAK,GAAG,cAAc,UAAU;AAAA,IACnC;AAAA,EACH;AAAA;AAAA;AAAA,EAKA,MAAM,wBAAwB,KAAa,YAAoD;AAC5F,WAAO,KAAK,MAA6B,KAAK,GAAG,cAAc,UAAU,eAAe;AAAA,EAC3F;AAAA;AAAA,EAGA,MAAM,0BACH,KACA,YACA,MAC6B;AAC7B,WAAO,KAAK,MAA2B,KAAK,GAAG,cAAc,UAAU,iBAAiB;AAAA,MACrF,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,IAAI;AAAA,IAC5B,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,0BACH,KACA,YACA,eACA,MAC6B;AAC7B,WAAO,KAAK;AAAA,MACT,KAAK,GAAG,cAAc,UAAU,iBAAiB,aAAa;AAAA,MAC9D;AAAA,QACG,QAAQ;AAAA,QACR,MAAM,KAAK,UAAU,IAAI;AAAA,MAC5B;AAAA,IACH;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,0BACH,KACA,YACA,eAC8B;AAC9B,WAAO,KAAK;AAAA,MACT,KAAK,GAAG,cAAc,UAAU,iBAAiB,aAAa;AAAA,MAC9D;AAAA,QACG,QAAQ;AAAA,MACX;AAAA,IACH;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,qBAAqB,KAA8C;AACtE,UAAM,WAAW,MAAM,KAAK,MAAyC,KAAK,GAAG,WAAW;AACxF,WAAO,SAAS;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,oBAAoB,KAAa,WAAkD;AACtF,WAAO,KAAK,MAA4B,KAAK,GAAG,aAAa,SAAS,EAAE;AAAA,EAC3E;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,eACH,KACA,WACA,QACgC;AAChC,WAAO,KAAK,MAA8B,KAAK,GAAG,mBAAmB;AAAA,MAClE,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,EAAE,WAAW,OAAO,CAAC;AAAA,IAC7C,CAAC;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,qBAAqB,KAAa,MAAqD;AAC1F,WAAO,KAAK,MAAoC,KAAK,GAAG,2BAA2B;AAAA,MAChF,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,EAAE,KAAK,CAAC;AAAA,IAChC,CAAC;AAAA,EACJ;AAAA;AAAA;AAAA,EAKA,MAAM,oBACH,KACA,cACqC;AACrC,WAAO,KAAK,MAAmC,KAAK,GAAG,cAAc,YAAY,WAAW;AAAA,EAC/F;AAAA;AAAA,EAGA,MAAM,yBACH,KACA,cACuC;AACvC,WAAO,KAAK;AAAA,MACT,KAAK,GAAG,cAAc,YAAY;AAAA,IACrC;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,mBACH,KACA,cACA,eACuC;AACvC,WAAO,KAAK;AAAA,MACT,KAAK,GAAG,cAAc,YAAY,aAAa,aAAa;AAAA,IAC/D;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,uBACH,KACA,cACA,MACiC;AACjC,WAAO,KAAK,MAA+B,KAAK,GAAG,cAAc,YAAY,aAAa;AAAA,MACvF,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,IAAI;AAAA,IAC5B,CAAC;AAAA,EACJ;AAAA,EAEA,MAAM,sBACH,KACA,cACA,eACA,MACiC;AACjC,WAAO,KAAK;AAAA,MACT,KAAK,GAAG,cAAc,YAAY,aAAa,aAAa;AAAA,MAC5D,EAAE,QAAQ,SAAS,MAAM,KAAK,UAAU,IAAI,EAAE;AAAA,IACjD;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,wBACH,KACA,cACA,eACiC;AACjC,WAAO,KAAK;AAAA,MACT,KAAK,GAAG,cAAc,YAAY,aAAa,aAAa;AAAA,MAC5D;AAAA,QACG,QAAQ;AAAA,MACX;AAAA,IACH;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,0BACH,KACA,cACA,eACiC;AACjC,WAAO,KAAK;AAAA,MACT,KAAK,GAAG,cAAc,YAAY,aAAa,aAAa;AAAA,MAC5D;AAAA,QACG,QAAQ;AAAA,MACX;AAAA,IACH;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,qBACH,KACA,cACA,aACA,WACqC;AACrC,WAAO,KAAK;AAAA,MACT,KAAK,GAAG,cAAc,YAAY,uBAAuB,WAAW,OAAO,SAAS;AAAA,IACvF;AAAA,EACH;AACH;;;ACvZO,IAAM,mBAAN,cAA+B,cAAc;AAAA;AAAA,EAEjD,MAAM,iBAAiB,KAAa,YAA6C;AAC9E,WAAO,KAAK,MAAsB,KAAK,GAAG,cAAc,UAAU,QAAQ;AAAA,EAC7E;AAAA;AAAA,EAGA,MAAM,mBACH,KACA,YACA,MACsB;AACtB,WAAO,KAAK,MAAoB,KAAK,GAAG,cAAc,UAAU,UAAU;AAAA,MACvE,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,IAAI;AAAA,IAC5B,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,mBACH,KACA,YACA,QACA,MACsB;AACtB,WAAO,KAAK,MAAoB,KAAK,GAAG,cAAc,UAAU,UAAU,MAAM,IAAI;AAAA,MACjF,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,IAAI;AAAA,IAC5B,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,mBAAmB,KAAa,YAAoB,QAA+B;AACtF,WAAO,KAAK,MAAY,KAAK,GAAG,cAAc,UAAU,UAAU,MAAM,IAAI;AAAA,MACzE,QAAQ;AAAA,IACX,CAAC;AAAA,EACJ;AACH;;;ACjBO,IAAKC,eAAL,kBAAKA,iBAAL;AACJ,EAAAA,aAAA,aAAU;AACV,EAAAA,aAAA,YAAS;AACT,EAAAA,aAAA,eAAY;AAHH,SAAAA;AAAA,mBAAA;AAOL,IAAM,kBAAkB;AACxB,IAAM,iBAAiB;AACvB,IAAM,kBAAkB;AACxB,IAAM,oBAAoB;AAC1B,IAAM,kBAAkB;AACxB,IAAM,mBAAmB;AACzB,IAAM,oBAAoB;AAC1B,IAAM,uBAAuB;AAC7B,IAAM,sBAAsB;AAC5B,IAAM,oBAAoB;AAe1B,SAAS,kBAAkB,YAA2C;AAC1E,SAAO;AAAA,IACJ,MAAM,aAAa,oBAAoB;AAAA,IACvC,OAAO,aAAa,qBAAqB;AAAA,IACzC,SAAS,aAAa,uBAAuB;AAAA,IAC7C,OAAO,aAAa,qBAAqB;AAAA,IACzC,SAAS,aAAa,uBAAuB;AAAA,IAC7C,YAAY,aAAa,0BAA0B;AAAA,IACnD,UAAU,aAAa,yBAAyB;AAAA,IAChD,SAAS,aAAa,uBAAuB;AAAA,EAChD;AACH;AAEO,SAAS,kBAAkB,aAA4C;AAC3E,MAAI,aAAa;AACjB,MAAI,YAAY,IAAK,eAAc;AACnC,MAAI,YAAY,KAAM,eAAc;AACpC,MAAI,YAAY,OAAQ,eAAc;AACtC,MAAI,YAAY,KAAM,eAAc;AACpC,MAAI,YAAY,OAAQ,eAAc;AACtC,MAAI,YAAY,UAAW,eAAc;AACzC,MAAI,YAAY,QAAS,eAAc;AACvC,MAAI,YAAY,OAAQ,eAAc;AACtC,SAAO;AACV;AAoBO,IAAK,QAAL,kBAAKC,WAAL;AAEJ,EAAAA,OAAA,oBAAiB;AACjB,EAAAA,OAAA,qBAAkB;AAClB,EAAAA,OAAA,qBAAkB;AAGlB,EAAAA,OAAA,kBAAe;AACf,EAAAA,OAAA,mBAAgB;AAChB,EAAAA,OAAA,mBAAgB;AAGhB,EAAAA,OAAA,uBAAoB;AACpB,EAAAA,OAAA,wBAAqB;AACrB,EAAAA,OAAA,wBAAqB;AAGrB,EAAAA,OAAA,gBAAa;AACb,EAAAA,OAAA,iBAAc;AACd,EAAAA,OAAA,iBAAc;AAGd,EAAAA,OAAA,0BAAuB;AACvB,EAAAA,OAAA,2BAAwB;AACxB,EAAAA,OAAA,2BAAwB;AAGxB,EAAAA,OAAA,mBAAgB;AAChB,EAAAA,OAAA,oBAAiB;AACjB,EAAAA,OAAA,oBAAiB;AAGjB,EAAAA,OAAA,oBAAiB;AACjB,EAAAA,OAAA,qBAAkB;AAClB,EAAAA,OAAA,qBAAkB;AAGlB,EAAAA,OAAA,sBAAmB;AACnB,EAAAA,OAAA,uBAAoB;AACpB,EAAAA,OAAA,uBAAoB;AAGpB,EAAAA,OAAA,sBAAmB;AACnB,EAAAA,OAAA,uBAAoB;AACpB,EAAAA,OAAA,uBAAoB;AAGpB,EAAAA,OAAA,oBAAiB;AACjB,EAAAA,OAAA,qBAAkB;AAClB,EAAAA,OAAA,qBAAkB;AAGlB,EAAAA,OAAA,kBAAe;AACf,EAAAA,OAAA,mBAAgB;AAChB,EAAAA,OAAA,mBAAgB;AAGhB,EAAAA,OAAA,gBAAa;AACb,EAAAA,OAAA,iBAAc;AACd,EAAAA,OAAA,iBAAc;AAGd,EAAAA,OAAA,gBAAa;AACb,EAAAA,OAAA,iBAAc;AACd,EAAAA,OAAA,iBAAc;AAGd,EAAAA,OAAA,iBAAc;AACd,EAAAA,OAAA,kBAAe;AACf,EAAAA,OAAA,kBAAe;AAGf,EAAAA,OAAA,oBAAiB;AACjB,EAAAA,OAAA,qBAAkB;AAClB,EAAAA,OAAA,qBAAkB;AAGlB,EAAAA,OAAA,kBAAe;AACf,EAAAA,OAAA,mBAAgB;AAChB,EAAAA,OAAA,mBAAgB;AAGhB,EAAAA,OAAA,iBAAc;AACd,EAAAA,OAAA,kBAAe;AACf,EAAAA,OAAA,kBAAe;AAGf,EAAAA,OAAA,mBAAgB;AAChB,EAAAA,OAAA,oBAAiB;AACjB,EAAAA,OAAA,oBAAiB;AACjB,EAAAA,OAAA,kBAAe;AAGf,EAAAA,OAAA,eAAY;AACZ,EAAAA,OAAA,gBAAa;AACb,EAAAA,OAAA,gBAAa;AAGb,EAAAA,OAAA,iBAAc;AAEd,EAAAA,OAAA,kBAAe;AAGf,EAAAA,OAAA,oBAAiB;AAGjB,EAAAA,OAAA,mBAAgB;AAChB,EAAAA,OAAA,oBAAiB;AAGjB,EAAAA,OAAA,cAAW;AACX,EAAAA,OAAA,cAAW;AACX,EAAAA,OAAA,eAAY;AACZ,EAAAA,OAAA,eAAY;AACZ,EAAAA,OAAA,iBAAc;AACd,EAAAA,OAAA,gBAAa;AAnHJ,SAAAA;AAAA,GAAA;;;AC1FL,IAAK,aAAL,kBAAKC,gBAAL;AAEJ,EAAAA,YAAA,eAAY;AAEZ,EAAAA,YAAA,UAAO;AAEP,EAAAA,YAAA,YAAS;AAET,EAAAA,YAAA,WAAQ;AARC,SAAAA;AAAA,GAAA;;;ACNL,IAAK,iBAAL,kBAAKC,oBAAL;AACJ,EAAAA,gBAAA,cAAW;AACX,EAAAA,gBAAA,eAAY;AACZ,EAAAA,gBAAA,WAAQ;AAHC,SAAAA;AAAA,GAAA;;;ACAL,IAAK,eAAL,kBAAKC,kBAAL;AACJ,EAAAA,cAAA,cAAW;AACX,EAAAA,cAAA,aAAU;AACV,EAAAA,cAAA,UAAO;AAHE,SAAAA;AAAA,GAAA;;;ACcL,IAAK,sBAAL,kBAAKC,yBAAL;AACJ,EAAAA,qBAAA,UAAO;AACP,EAAAA,qBAAA,eAAY;AACZ,EAAAA,qBAAA,UAAO;AACP,EAAAA,qBAAA,iBAAc;AACd,EAAAA,qBAAA,YAAS;AACT,EAAAA,qBAAA,aAAU;AACV,EAAAA,qBAAA,cAAW;AACX,EAAAA,qBAAA,cAAW;AACX,EAAAA,qBAAA,yBAAsB;AACtB,EAAAA,qBAAA,YAAS;AACT,EAAAA,qBAAA,aAAU;AACV,EAAAA,qBAAA,UAAO;AAZE,SAAAA;AAAA,GAAA;AAeL,IAAK,qBAAL,kBAAKC,wBAAL;AACJ,EAAAA,oBAAA,kBAAe;AAEf,EAAAA,oBAAA,mBAAgB;AAChB,EAAAA,oBAAA,iBAAc;AAEd,EAAAA,oBAAA,yBAAsB;AACtB,EAAAA,oBAAA,yBAAsB;AAEtB,EAAAA,oBAAA,kBAAe;AACf,EAAAA,oBAAA,mBAAgB;AAEhB,EAAAA,oBAAA,oBAAiB;AAEjB,EAAAA,oBAAA,uBAAoB;AAEpB,EAAAA,oBAAA,uBAAoB;AACpB,EAAAA,oBAAA,kBAAe;AAEf,EAAAA,oBAAA,4BAAyB;AACzB,EAAAA,oBAAA,4BAAyB;AACzB,EAAAA,oBAAA,8BAA2B;AAC3B,EAAAA,oBAAA,6BAA0B;AAC1B,EAAAA,oBAAA,0BAAuB;AAGvB,EAAAA,oBAAA,oBAAiB;AAGjB,EAAAA,oBAAA,0BAAuB;AACvB,EAAAA,oBAAA,sBAAmB;AACnB,EAAAA,oBAAA,uBAAoB;AAGpB,EAAAA,oBAAA,kBAAe;AACf,EAAAA,oBAAA,oBAAiB;AACjB,EAAAA,oBAAA,kBAAe;AApCN,SAAAA;AAAA,GAAA;AAuCL,IAAK,sBAAL,kBAAKC,yBAAL;AACJ,EAAAA,qBAAA,0BAAuB;AACvB,EAAAA,qBAAA,yBAAsB;AACtB,EAAAA,qBAAA,mBAAgB;AAChB,EAAAA,qBAAA,kBAAe;AACf,EAAAA,qBAAA,wBAAqB;AACrB,EAAAA,qBAAA,uBAAoB;AACpB,EAAAA,qBAAA,uBAAoB;AACpB,EAAAA,qBAAA,wBAAqB;AACrB,EAAAA,qBAAA,iBAAc;AACd,EAAAA,qBAAA,mBAAgB;AAChB,EAAAA,qBAAA,oBAAiB;AACjB,EAAAA,qBAAA,gBAAa;AACb,EAAAA,qBAAA,wBAAqB;AACrB,EAAAA,qBAAA,uBAAoB;AACpB,EAAAA,qBAAA,wBAAqB;AACrB,EAAAA,qBAAA,wBAAqB;AACrB,EAAAA,qBAAA,oBAAiB;AACjB,EAAAA,qBAAA,yBAAsB;AACtB,EAAAA,qBAAA,oBAAiB;AACjB,EAAAA,qBAAA,cAAW;AACX,EAAAA,qBAAA,mBAAgB;AAChB,EAAAA,qBAAA,gBAAa;AACb,EAAAA,qBAAA,qBAAkB;AAClB,EAAAA,qBAAA,mCAAgC;AAxBvB,SAAAA;AAAA,GAAA;AAmCL,IAAM,yBAAyB;;;ACsD/B,IAAK,mBAAL,kBAAKC,sBAAL;AAEJ,EAAAA,kBAAA,WAAQ;AACR,EAAAA,kBAAA,WAAQ;AACR,EAAAA,kBAAA,cAAW;AACX,EAAAA,kBAAA,aAAU;AACV,EAAAA,kBAAA,WAAQ;AAGR,EAAAA,kBAAA,WAAQ;AACR,EAAAA,kBAAA,WAAQ;AACR,EAAAA,kBAAA,UAAO;AACP,EAAAA,kBAAA,aAAU;AACV,EAAAA,kBAAA,gBAAa;AACb,EAAAA,kBAAA,cAAW;AACX,EAAAA,kBAAA,qBAAkB;AAClB,EAAAA,kBAAA,cAAW;AACX,EAAAA,kBAAA,cAAW;AACX,EAAAA,kBAAA,cAAW;AAGX,EAAAA,kBAAA,WAAQ;AACR,EAAAA,kBAAA,eAAY;AACZ,EAAAA,kBAAA,YAAS;AAGT,EAAAA,kBAAA,qBAAkB;AAGlB,EAAAA,kBAAA,sBAAmB;AACnB,EAAAA,kBAAA,qBAAkB;AAGlB,EAAAA,kBAAA,cAAW;AACX,EAAAA,kBAAA,wBAAqB;AACrB,EAAAA,kBAAA,kBAAe;AAGf,EAAAA,kBAAA,oBAAiB;AACjB,EAAAA,kBAAA,iBAAc;AAGd,EAAAA,kBAAA,gBAAa;AAGb,EAAAA,kBAAA,kBAAe;AACf,EAAAA,kBAAA,sBAAmB;AACnB,EAAAA,kBAAA,yBAAsB;AA/Cb,SAAAA;AAAA,GAAA;AAsDL,IAAK,gBAAL,kBAAKC,mBAAL;AACJ,EAAAA,eAAA,cAAW;AACX,EAAAA,eAAA,eAAY;AACZ,EAAAA,eAAA,WAAQ;AACR,EAAAA,eAAA,cAAW;AACX,EAAAA,eAAA,WAAQ;AALC,SAAAA;AAAA,GAAA;AAaL,IAAK,aAAL,kBAAKC,gBAAL;AAEJ,EAAAA,YAAA,SAAM;AACN,EAAAA,YAAA,gBAAa;AAGb,EAAAA,YAAA,sBAAmB;AACnB,EAAAA,YAAA,qBAAkB;AAGlB,EAAAA,YAAA,qBAAkB;AAClB,EAAAA,YAAA,sBAAmB;AAXV,SAAAA;AAAA,GAAA;AA4BL,IAAK,WAAL,kBAAKC,cAAL;AAEJ,EAAAA,UAAA,YAAS;AACT,EAAAA,UAAA,SAAM;AACN,EAAAA,UAAA,SAAM;AAGN,EAAAA,UAAA,SAAM;AACN,EAAAA,UAAA,WAAQ;AACR,EAAAA,UAAA,gBAAa;AAGb,EAAAA,UAAA,kBAAe;AACf,EAAAA,UAAA,WAAQ;AACR,EAAAA,UAAA,UAAO;AACP,EAAAA,UAAA,YAAS;AACT,EAAAA,UAAA,eAAY;AACZ,EAAAA,UAAA,eAAY;AAGZ,EAAAA,UAAA,gBAAa;AApBJ,SAAAA;AAAA,GAAA;AAiDL,IAAK,cAAL,kBAAKC,iBAAL;AACJ,EAAAA,aAAA,eAAY;AACZ,EAAAA,aAAA,SAAM;AACN,EAAAA,aAAA,WAAQ;AAHC,SAAAA;AAAA,GAAA;AAUL,IAAM,qBAAoC,oBAAI,IAAI;AAAA,EACtD;AAAA,EACA;AAAA,EACA;AACH,CAAC;;;AC1QM,IAAK,2BAAL,kBAAKC,8BAAL;AACJ,EAAAA,oDAAA,mBAAgB,KAAhB;AACA,EAAAA,oDAAA,kBAAe,KAAf;AACA,EAAAA,oDAAA,eAAY,KAAZ;AACA,EAAAA,oDAAA,iBAAc,KAAd;AACA,EAAAA,oDAAA,cAAW,KAAX;AACA,EAAAA,oDAAA,oBAAiB,KAAjB;AACA,EAAAA,oDAAA,oBAAiB,KAAjB;AACA,EAAAA,oDAAA,aAAU,KAAV;AACA,EAAAA,oDAAA,WAAQ,KAAR;AACA,EAAAA,oDAAA,qBAAkB,KAAlB;AAVS,SAAAA;AAAA,GAAA;;;AC3CL,IAAK,mBAAL,kBAAKC,sBAAL;AACJ,EAAAA,kBAAA,eAAY;AACZ,EAAAA,kBAAA,aAAU;AACV,EAAAA,kBAAA,aAAU;AACV,EAAAA,kBAAA,YAAS;AACT,EAAAA,kBAAA,cAAW;AACX,EAAAA,kBAAA,aAAU;AAND,SAAAA;AAAA,GAAA;;;ACAL,IAAK,gBAAL,kBAAKC,mBAAL;AACJ,EAAAA,eAAA,UAAO;AACP,EAAAA,eAAA,WAAQ;AACR,EAAAA,eAAA,WAAQ;AACR,EAAAA,eAAA,UAAO;AACP,EAAAA,eAAA,cAAW;AACX,EAAAA,eAAA,YAAS;AACT,EAAAA,eAAA,UAAO;AACP,EAAAA,eAAA,cAAW;AACX,EAAAA,eAAA,iBAAc;AACd,EAAAA,eAAA,iBAAc;AACd,EAAAA,eAAA,aAAU;AACV,EAAAA,eAAA,aAAU;AACV,EAAAA,eAAA,WAAQ;AACR,EAAAA,eAAA,YAAS;AACT,EAAAA,eAAA,cAAW;AAfF,SAAAA;AAAA,GAAA;AAkBL,IAAK,cAAL,kBAAKC,iBAAL;AACJ,EAAAA,aAAA,UAAO;AACP,EAAAA,aAAA,aAAU;AACV,EAAAA,aAAA,cAAW;AACX,EAAAA,aAAA,cAAW;AACX,EAAAA,aAAA,WAAQ;AACR,EAAAA,aAAA,WAAQ;AANC,SAAAA;AAAA,GAAA;;;ACgDL,IAAM,wBAAwB;AAC9B,IAAM,6BAA6B;AACnC,IAAM,wBAAwB;AAC9B,IAAM,+BAA+B;AACrC,IAAM,4BAA4B;AAClC,IAAM,wBAAwB;AAG9B,IAAM,0BAA0B;AAChC,IAAM,8BAA8B;AAGpC,IAAM,6BAA6B;AACnC,IAAM,6BAA6B;AACnC,IAAM,oCAAoC;AAC1C,IAAM,4BAA4B;AAClC,IAAM,iCAAiC;AACvC,IAAM,6BAA6B;AACnC,IAAM,mBAAmB;;;ACvFzB,IAAK,yBAAL,kBAAKC,4BAAL;AACJ,EAAAA,wBAAA,UAAO;AACP,EAAAA,wBAAA,eAAY;AACZ,EAAAA,wBAAA,UAAO;AACP,EAAAA,wBAAA,WAAQ;AACR,EAAAA,wBAAA,WAAQ;AALC,SAAAA;AAAA,GAAA;AAQL,IAAK,iBAAL,kBAAKC,oBAAL;AACJ,EAAAA,gBAAA,cAAW;AACX,EAAAA,gBAAA,YAAS;AACT,EAAAA,gBAAA,aAAU;AAHD,SAAAA;AAAA,GAAA;AAwEL,IAAK,6BAAL,kBAAKC,gCAAL;AACJ,EAAAA,4BAAA,UAAO;AACP,EAAAA,4BAAA,WAAQ;AACR,EAAAA,4BAAA,YAAS;AACT,EAAAA,4BAAA,aAAU;AACV,EAAAA,4BAAA,YAAS;AALA,SAAAA;AAAA,GAAA;AAQL,IAAK,mCAAL,kBAAKC,sCAAL;AACJ,EAAAA,kCAAA,eAAY;AACZ,EAAAA,kCAAA,iBAAc;AAFL,SAAAA;AAAA,GAAA;AAoFL,IAAK,sBAAL,kBAAKC,yBAAL;AACJ,EAAAA,qBAAA,eAAY;AACZ,EAAAA,qBAAA,eAAY;AACZ,EAAAA,qBAAA,eAAY;AACZ,EAAAA,qBAAA,aAAU;AACV,EAAAA,qBAAA,eAAY;AALH,SAAAA;AAAA,GAAA;AAiBL,IAAK,iBAAL,kBAAKC,oBAAL;AACJ,EAAAA,gBAAA,cAAW;AACX,EAAAA,gBAAA,cAAW;AAFF,SAAAA;AAAA,GAAA;AAKL,IAAK,yBAAL,kBAAKC,4BAAL;AACJ,EAAAA,wBAAA,aAAU;AACV,EAAAA,wBAAA,cAAW;AACX,EAAAA,wBAAA,cAAW;AACX,EAAAA,wBAAA,eAAY;AAJH,SAAAA;AAAA,GAAA;;;AC7LL,IAAK,aAAL,kBAAKC,gBAAL;AACJ,EAAAA,YAAA,oBAAiB;AACjB,EAAAA,YAAA,UAAO;AACP,EAAAA,YAAA,YAAS;AACT,EAAAA,YAAA,YAAS;AAJA,SAAAA;AAAA,GAAA;AAUL,IAAK,sBAAL,kBAAKC,yBAAL;AACJ,EAAAA,qBAAA,iBAAc;AACd,EAAAA,qBAAA,gBAAa;AACb,EAAAA,qBAAA,WAAQ;AAHC,SAAAA;AAAA,GAAA;AAWL,IAAK,iBAAL,kBAAKC,oBAAL;AACJ,EAAAA,gBAAA,kBAAe;AACf,EAAAA,gBAAA,4BAAyB;AAFhB,SAAAA;AAAA,GAAA;;;AC/BL,IAAK,gBAAL,kBAAKC,mBAAL;AACJ,EAAAA,eAAA,gBAAa;AACb,EAAAA,eAAA,YAAS;AAFA,SAAAA;AAAA,GAAA;AAKL,IAAK,aAAL,kBAAKC,gBAAL;AACJ,EAAAA,YAAA,UAAO;AACP,EAAAA,YAAA,WAAQ;AAFC,SAAAA;AAAA,GAAA;;;ACLL,IAAK,0BAAL,kBAAKC,6BAAL;AACJ,EAAAA,yBAAA,iBAAc;AACd,EAAAA,yBAAA,eAAY;AACZ,EAAAA,yBAAA,UAAO;AACP,EAAAA,yBAAA,YAAS;AACT,EAAAA,yBAAA,cAAW;AACX,EAAAA,yBAAA,gBAAa;AACb,EAAAA,yBAAA,oBAAiB;AAPR,SAAAA;AAAA,GAAA;AAUL,IAAK,oBAAL,kBAAKC,uBAAL;AACJ,EAAAA,mBAAA,aAAU;AACV,EAAAA,mBAAA,YAAS;AACT,EAAAA,mBAAA,YAAS;AACT,EAAAA,mBAAA,aAAU;AACV,EAAAA,mBAAA,aAAU;AALD,SAAAA;AAAA,GAAA;AAQL,IAAK,qBAAL,kBAAKC,wBAAL;AACJ,EAAAA,oBAAA,mBAAgB;AAChB,EAAAA,oBAAA,sBAAmB;AACnB,EAAAA,oBAAA,oBAAiB;AACjB,EAAAA,oBAAA,iBAAc;AAJL,SAAAA;AAAA,GAAA;AAOL,IAAK,gBAAL,kBAAKC,mBAAL;AACJ,EAAAA,eAAA,iBAAc;AACd,EAAAA,eAAA,YAAS;AACT,EAAAA,eAAA,UAAO;AACP,EAAAA,eAAA,kBAAe;AACf,EAAAA,eAAA,eAAY;AACZ,EAAAA,eAAA,oBAAiB;AANR,SAAAA;AAAA,GAAA;;;AChBL,IAAM,0BAAN,cAAsC,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA,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;AAAA,EAChD;AAAA,EAEA,MAAM,uBAAuB,WAAwC;AAClE,WAAO,KAAK,MAAkB,eAAe,SAAS,EAAE;AAAA,EAC3D;AAAA,EAEA,MAAM,0BAA0B,WAAiD;AAC9E,WAAO,KAAK,MAA2B,eAAe,SAAS,IAAI;AAAA,MAChE,QAAQ;AAAA,IACX,CAAC;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,2BAA2B,eAAuB,SAAuC;AAC5F,WAAO,KAAK,MAAkB,0BAA0B,aAAa,uBAAuB;AAAA,MACzF,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,EAAE,QAAQ,CAAC;AAAA,IACnC,CAAC;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,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;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,kBACH,eACA,kBACA,SACA,cACA,MACoB;AACpB,UAAM,OAAgC;AAAA,MACnC;AAAA,MACA;AAAA,MACA;AAAA,IACH;AAGA,QAAI,OAAO,qBAAqB,UAAU;AACvC,WAAK,QAAQ;AAAA,IAChB,OAAO;AACJ,WAAK,YAAY;AAAA,IACpB;AAEA,WAAO,KAAK,MAAkB,KAAK,aAAa,gBAAgB;AAAA,MAC7D,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,IAAI;AAAA,IAC5B,CAAC;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,+BACH,eACA,cACA,MACoB;AACpB,WAAO,KAAK,MAAkB,KAAK,aAAa,gBAAgB,YAAY,IAAI;AAAA,MAC7E,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,IAAI;AAAA,IAC5B,CAAC;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,+BACH,eACA,cAC6B;AAC7B,WAAO,KAAK,MAA2B,KAAK,aAAa,gBAAgB,YAAY,IAAI;AAAA,MACtF,QAAQ;AAAA,IACX,CAAC;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,2BACH,eACA,cACoB;AACpB,WAAO,KAAK,+BAA+B,eAAe,cAAc;AAAA,MACrE;AAAA,IACH,CAAC;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,wBAAwB,eAAuB,cAA2C;AAC7F,WAAO,KAAK,+BAA+B,eAAe,cAAc;AAAA,MACrE;AAAA,IACH,CAAC;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,yBACH,eACA,cACoB;AACpB,WAAO,KAAK,+BAA+B,eAAe,cAAc;AAAA,MACrE;AAAA,IACH,CAAC;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,iBAAiB,WAAwC;AAC5D,WAAO,KAAK,MAAkB,eAAe,SAAS,WAAW;AAAA,MAC9D,QAAQ;AAAA,IACX,CAAC;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,kBAAkB,WAAwC;AAC7D,WAAO,KAAK,MAAkB,eAAe,SAAS,YAAY;AAAA,MAC/D,QAAQ;AAAA,IACX,CAAC;AAAA,EACJ;AACH;;;AC/IO,IAAM,gBAAN,cAA4B,cAAc;AAAA;AAAA,EAE9C,MAAM,gBAAsC;AACzC,WAAO,KAAK,MAAmB,IAAI;AAAA,EACtC;AAAA;AAAA,EAGA,MAAM,sBAAkD;AACrD,WAAO,KAAK,MAAyB,UAAU;AAAA,EAClD;AAAA;AAAA,EAGA,MAAM,aAAa,KAAiC;AACjD,WAAO,KAAK,MAAiB,KAAK,GAAG,EAAE;AAAA,EAC1C;AAAA;AAAA,EAGA,MAAM,gBAAgB,WAAkD;AACrE,WAAO,KAAK,MAAiB,MAAM;AAAA,MAChC,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,SAAS;AAAA,IACjC,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,gBAAgB,KAAa,WAA2D;AAC3F,WAAO,KAAK,MAAiB,KAAK,GAAG,IAAI;AAAA,MACtC,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,SAAS;AAAA,IACjC,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,gBAAgB,KAA4B;AAC/C,WAAO,KAAK,MAAM,KAAK,GAAG,IAAI;AAAA,MAC3B,QAAQ;AAAA,IACX,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,eAAe,KAA2C;AAC7D,WAAO,KAAK,MAA2B,KAAK,GAAG,OAAO;AAAA,MACnD,QAAQ;AAAA,IACX,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,qBAAqB,KAAyC;AACjE,WAAO,KAAK,MAAyB,KAAK,GAAG,WAAW;AAAA,EAC3D;AAAA;AAAA,EAGA,MAAM,wBACH,KACA,UAC2B;AAC3B,WAAO,KAAK,MAAyB,KAAK,GAAG,aAAa;AAAA,MACvD,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,QAAQ;AAAA,IAChC,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,mBAAmB,KAAuC;AAC7D,WAAO,KAAK,MAAuB,KAAK,GAAG,SAAS;AAAA,EACvD;AAAA;AAAA,EAGA,MAAM,uBAAuB,KAAoD;AAC9E,WAAO,KAAK,MAAoC,KAAK,GAAG,wBAAwB;AAAA,EACnF;AAAA;AAAA,EAGA,MAAM,gCAAiE;AACpE,UAAM,SAAS,MAAM,KAAK,MAA4C,mBAAmB;AACzF,WAAO,OAAO;AAAA,EACjB;AAAA;AAAA,EAGA,MAAM,oBAAoB,KAAuC;AAC9D,WAAO,KAAK,MAAuB,KAAK,GAAG,UAAU;AAAA,EACxD;AAAA;AAAA,EAGA,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;AAAA,EACzD;AAAA;AAAA,EAGA,MAAM,gBAAgB,KAAa,IAAmC;AACnE,WAAO,KAAK,MAAoB,KAAK,GAAG,kBAAkB,EAAE,EAAE;AAAA,EACjE;AAAA;AAAA,EAGA,MAAM,2BAA2B,KAA8B;AAC5D,WAAO,KAAK,MAAc,KAAK,GAAG,6BAA6B;AAAA,EAClE;AAAA;AAAA,EAGA,MAAM,uBAAuB,KAAa,IAAmC;AAC1E,WAAO,KAAK,MAAoB,KAAK,GAAG,kBAAkB,EAAE,SAAS;AAAA,MAClE,QAAQ;AAAA,IACX,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,oBAAoB,KAAa,IAAmC;AACvE,WAAO,KAAK,MAAoB,KAAK,GAAG,kBAAkB,EAAE,YAAY;AAAA,MACrE,QAAQ;AAAA,IACX,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,wBAAwB,KAAkD;AAC7E,WAAO,KAAK,MAAkC,KAAK,GAAG,8BAA8B;AAAA,MACjF,QAAQ;AAAA,IACX,CAAC;AAAA,EACJ;AAAA;AAAA;AAAA,EAKA,MAAM,oBAA4C;AAC/C,UAAM,WAAW,MAAM,KAAK,MAAoC,uBAAuB;AACvF,WAAO,SAAS;AAAA,EACnB;AAAA;AAAA,EAGA,MAAM,yBACH,KACA,cAC6D;AAC7D,WAAO,KAAK;AAAA,MACT,KAAK,GAAG;AAAA,MACR;AAAA,QACG,QAAQ;AAAA,QACR,MAAM,KAAK,UAAU,YAAY;AAAA,MACpC;AAAA,IACH;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,2BAA2B,KAAa,UAAiD;AAC5F,WAAO,KAAK;AAAA,MACT,KAAK,GAAG,gCAAgC,mBAAmB,QAAQ,CAAC;AAAA,MACpE;AAAA,QACG,QAAQ;AAAA,MACX;AAAA,IACH;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,sBACH,KACyF;AACzF,WAAO,KAAK,MAEV,KAAK,GAAG,qBAAqB;AAAA,EAClC;AAAA;AAAA,EAGA,MAAM,sBACH,KACA,QAC4C;AAC5C,UAAM,QAAQ,IAAI,gBAAgB;AAClC,QAAI,QAAQ,SAAS,OAAW,OAAM,IAAI,QAAQ,OAAO,OAAO,IAAI,CAAC;AACrE,QAAI,QAAQ,aAAa,OAAW,OAAM,IAAI,YAAY,OAAO,OAAO,QAAQ,CAAC;AACjF,UAAM,KAAK,MAAM,SAAS,IAAI,IAAI,MAAM,SAAS,CAAC,KAAK;AACvD,WAAO,KAAK,MAA0C,KAAK,GAAG,uBAAuB,EAAE,EAAE;AAAA,EAC5F;AAAA;AAAA,EAGA,MAAM,sBACH,KACA,MACyB;AACzB,WAAO,KAAK,MAAuB,KAAK,GAAG,wBAAwB;AAAA,MAChE,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,IAAI;AAAA,IAC5B,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,mBAAmB,KAAa,aAA+C;AAClF,WAAO,KAAK,MAAuB,KAAK,GAAG,wBAAwB,WAAW,EAAE;AAAA,EACnF;AAAA;AAAA,EAGA,MAAM,sBACH,KACA,aACA,MACyB;AACzB,WAAO,KAAK,MAAuB,KAAK,GAAG,wBAAwB,WAAW,IAAI;AAAA,MAC/E,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,IAAI;AAAA,IAC5B,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,sBAAsB,KAAa,aAAmD;AACzF,WAAO,KAAK,MAA2B,KAAK,GAAG,wBAAwB,WAAW,IAAI;AAAA,MACnF,QAAQ;AAAA,IACX,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,yBACH,KACA,aAC6C;AAC7C,WAAO,KAAK;AAAA,MACT,KAAK,GAAG,wBAAwB,WAAW;AAAA,MAC3C;AAAA,QACG,QAAQ;AAAA,MACX;AAAA,IACH;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,YAAY,KAAa,UAAwC;AACpE,UAAM,SAAS,aAAa,SAAY,aAAa,QAAQ,KAAK;AAClE,WAAO,KAAK,MAAiB,KAAK,GAAG,qBAAqB,MAAM,EAAE;AAAA,EACrE;AAAA;AAAA,EAGA,MAAM,WAAW,IAA8B;AAG5C,WAAO,KAAK,MAAe,YAAY,EAAE,EAAE;AAAA,EAC9C;AAAA;AAAA,EAGA,MAAM,kBAAkB,eAAuB,UAAwC;AACpF,UAAM,SAAS,IAAI,gBAAgB,EAAE,gBAAgB,cAAc,CAAC;AACpE,QAAI,aAAa,OAAW,QAAO,IAAI,YAAY,OAAO,QAAQ,CAAC;AACnE,WAAO,KAAK,MAAiB,YAAY,OAAO,SAAS,CAAC,EAAE;AAAA,EAC/D;AAAA;AAAA,EAGA,MAAM,iBAAiB,IAA8B;AAClD,WAAO,KAAK,MAAe,YAAY,EAAE,EAAE;AAAA,EAC9C;AAAA;AAAA,EAGA,MAAM,cAAc,KAAa,SAAgC;AAC9D,WAAO,KAAK,MAAe,KAAK,GAAG,sBAAsB;AAAA,MACtD,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,OAAO;AAAA,IAC/B,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,cAAc,KAAa,IAAY,SAAgC;AAC1E,WAAO,KAAK,MAAe,KAAK,GAAG,sBAAsB,EAAE,IAAI;AAAA,MAC5D,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,OAAO;AAAA,IAC/B,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,cAAc,KAAa,IAA0C;AACxE,WAAO,KAAK,MAA2B,KAAK,GAAG,sBAAsB,EAAE,IAAI;AAAA,MACxE,QAAQ;AAAA,IACX,CAAC;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,gBACH,KACA,YACA,OACA,SAC6B;AAC7B,UAAM,eAAe,IAAI,gBAAgB;AACzC,QAAI,eAAe,OAAW,cAAa,IAAI,eAAe,OAAO,UAAU,CAAC;AAChF,QAAI,UAAU,OAAW,cAAa,IAAI,SAAS,KAAK;AACxD,QAAI,YAAY,OAAW,cAAa,IAAI,WAAW,OAAO;AAC9D,UAAM,KAAK,aAAa,SAAS;AACjC,WAAO,KAAK,MAA2B,KAAK,GAAG,UAAU,KAAK,IAAI,EAAE,KAAK,EAAE,EAAE;AAAA,EAChF;AAAA;AAAA,EAGA,MAAM,uBACH,KACA,YACA,gBACA,WACA,SACwC;AACxC,WAAO,KAAK,MAAsC,KAAK,GAAG,mBAAmB;AAAA,MAC1E,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU;AAAA,QAClB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACH,CAAC;AAAA,IACJ,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,gBACH,KACA,YACA,gBACA,WACwC;AACxC,WAAO,KAAK,MAAsC,KAAK,GAAG,WAAW;AAAA,MAClE,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU;AAAA,QAClB;AAAA,QACA;AAAA,QACA;AAAA,MACH,CAAC;AAAA,IACJ,CAAC;AAAA,EACJ;AAAA;AAAA;AAAA,EAIA,MAAM,uBACH,KACA,YACA,iBAAsB,CAAC,GACvB,YAAiB,CAAC,GACL;AACb,WAAO,KAAK,MAAW,KAAK,GAAG,mBAAmB;AAAA,MAC/C,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU;AAAA,QAClB;AAAA,QACA;AAAA,QACA;AAAA,MACH,CAAC;AAAA,IACJ,CAAC;AAAA,EACJ;AAAA;AAAA,EAGA,MAAM,mBAAmB,KAA0C;AAChE,WAAO,KAAK,MAA0B,KAAK,GAAG,SAAS;AAAA,EAC1D;AAAA;AAAA,EAGA,MAAM,sBAAsB,KAAa,QAAsC;AAC5E,WAAO,KAAK,MAAiB,KAAK,GAAG,WAAW;AAAA,MAC7C,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,EAAE,OAAO,CAAC;AAAA,IAClC,CAAC;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAM,qBAAuD;AAC1D,WAAO,KAAK,MAA+B,UAAU;AAAA,EACxD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,MAAM,kBAAkB,KAA8C;AACnE,WAAO,KAAK,MAA8B,KAAK,GAAG,kBAAkB;AAAA,EACvE;AACH;;;ACvUO,SAAS,2BAA2B,SAAyC;AACjF,MAAI,CAAC,SAAS;AACX,WAAO;AAAA,EACV;AAEA,QAAM,QAAkB,CAAC;AAGzB,MAAI,QAAQ,SAAS;AAClB,UAAM,KAAK,2BAA2B,QAAQ,OAAO,GAAG;AAAA,EAC3D,WAAW,QAAQ,QAAQ;AAExB,UAAM,KAAK,eAAe,QAAQ,MAAM,IAAI;AAAA,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;AAAA,QACH,WAAW,aAAa,QAAQ,WAAW,KAAK,EAAE,QAAQ,kBAAkB,KAAK,EAAE;AAAA,MACtF;AAAA,IACH;AAGA,QAAI,MAAM;AACP,YAAM,WAAW,KAAK,QAAQ,KAAK;AACnC,YAAM;AAAA,QACH,WAAW,aAAa,QAAQ,WAAW,KAAK,EAAE,QAAQ,kBAAkB,KAAK,EAAE;AAAA,MACtF;AAAA,IACH;AAGA,QAAI,UAAU;AACX,YAAM,eAAe,SAAS;AAC9B,YAAM;AAAA,QACH,eACK,iBAAiB,YAAY,WAAW,SAAS,EAAE,QACnD,sBAAsB,SAAS,EAAE;AAAA,MACzC;AAGA,UAAI,SAAS,cAAc;AACxB,cAAM,WAAW,SAAS,aAAa;AACvC,cAAM;AAAA,UACH,WACK,sBAAsB,QAAQ,WAAW,SAAS,aAAa,EAAE,QACjE,2BAA2B,SAAS,aAAa,EAAE;AAAA,QAC3D;AAAA,MACH;AAAA,IACH;AAGA,QAAI,YAAY;AACb,YAAM,aAAa,WAAW,QAAQ,WAAW;AACjD,YAAM;AAAA,QACH,aACK,oBAAoB,UAAU,WAAW,WAAW,EAAE,QACtD,yBAAyB,WAAW,EAAE;AAAA,MAC9C;AAAA,IACH;AAGA,QAAI,SAAS;AACV,YAAM;AAAA,QACH,QAAQ,OACH,gBAAgB,QAAQ,IAAI,WAAW,QAAQ,EAAE,QACjD,qBAAqB,QAAQ,EAAE;AAAA,MACvC;AAAA,IACH;AAGA,QAAI,QAAQ,UAAU,eAAe,QAAQ,UAAU,YAAY,SAAS,GAAG;AAC5E,YAAM,KAAK,qBAAqB,QAAQ,UAAU,YAAY,KAAK,IAAI,CAAC,EAAE;AAAA,IAC7E;AAGA,QAAI,QAAQ,UAAU,gBAAgB,QAAQ,UAAU,aAAa,SAAS,GAAG;AAC9E,YAAM,KAAK,sBAAsB,QAAQ,UAAU,aAAa,KAAK,IAAI,CAAC,EAAE;AAAA,IAC/E;AAAA,EACH;AAEA,MAAI,MAAM,WAAW,GAAG;AACrB,WAAO;AAAA,EACV;AAEA,SAAO;AAAA;AAAA,EAAkB,MAAM,KAAK,IAAI,CAAC;AAC5C;;;ACjFO,SAAS,iBACb,QACA,SACA,aACW;AACX,SAAO;AAAA,IACJ,WAAW,IAAI,aAAa,QAAQ,SAAS,WAAW;AAAA,IACxD,cAAc,IAAI,gBAAgB,QAAQ,SAAS,WAAW;AAAA,IAC9D,WAAW,IAAI,aAAa,QAAQ,SAAS,WAAW;AAAA,IACxD,YAAY,IAAI,cAAc,QAAQ,SAAS,WAAW;AAAA,IAC1D,QAAQ,IAAI,UAAU,QAAQ,SAAS,WAAW;AAAA,IAClD,UAAU,IAAI,YAAY,QAAQ,SAAS,WAAW;AAAA,IACtD,SAAS,IAAI,WAAW,QAAQ,SAAS,WAAW;AAAA,IACpD,MAAM,IAAI,QAAQ,QAAQ,SAAS,WAAW;AAAA,IAC9C,aAAa,IAAI,eAAe,QAAQ,SAAS,WAAW;AAAA,IAC5D,MAAM,IAAI,QAAQ,QAAQ,SAAS,WAAW;AAAA,IAC9C,UAAU,IAAI,YAAY,QAAQ,SAAS,WAAW;AAAA,IACtD,WAAW,IAAI,aAAa,QAAQ,SAAS,WAAW;AAAA,IACxD,OAAO,IAAI,SAAS,QAAQ,SAAS,WAAW;AAAA,IAChD,KAAK,IAAI,OAAO,QAAQ,SAAS,WAAW;AAAA,IAC5C,OAAO,IAAI,SAAS,QAAQ,SAAS,WAAW;AAAA,IAChD,WAAW,IAAI,aAAa,QAAQ,SAAS,WAAW;AAAA,IACxD,WAAW,IAAI,aAAa,QAAQ,SAAS,WAAW;AAAA,IACxD,gBAAgB,IAAI,kBAAkB,QAAQ,SAAS,WAAW;AAAA,IAClE,WAAW,IAAI,aAAa,QAAQ,SAAS,WAAW;AAAA,IACxD,aAAa,IAAI,eAAe,QAAQ,SAAS,WAAW;AAAA,IAC5D,WAAW,IAAI,aAAa,QAAQ,SAAS,WAAW;AAAA,IACxD,QAAQ,IAAI,UAAU,QAAQ,SAAS,WAAW;AAAA,IAClD,iBAAiB,IAAI,mBAAmB,QAAQ,SAAS,WAAW;AAAA,IACpE,UAAU,IAAI,YAAY,QAAQ,SAAS,WAAW;AAAA,IACtD,SAAS,IAAI,WAAW,QAAQ,SAAS,WAAW;AAAA,IACpD,UAAU,IAAI,YAAY,QAAQ,SAAS,WAAW;AAAA,IACtD,OAAO,IAAI,SAAS,QAAQ,SAAS,WAAW;AAAA,IAChD,SAAS,IAAI,WAAW,QAAQ,SAAS,WAAW;AAAA,IACpD,WAAW,IAAI,aAAa,QAAQ,SAAS,WAAW;AAAA,IACxD,UAAU,IAAI,YAAY,QAAQ,SAAS,WAAW;AAAA,IACtD,gBAAgB,IAAI,kBAAkB,QAAQ,SAAS,WAAW;AAAA,IAClE,gBAAgB,IAAI,kBAAkB,QAAQ,SAAS,WAAW;AAAA,IAClE,YAAY,IAAI,cAAc,QAAQ,SAAS,WAAW;AAAA,IAC1D,SAAS,IAAI,WAAW,QAAQ,SAAS,WAAW;AAAA,IACpD,YAAY,IAAI,cAAc,QAAQ,SAAS,WAAW;AAAA,IAC1D,YAAY,IAAI,cAAc,QAAQ,SAAS,WAAW;AAAA,IAC1D,mBAAmB,IAAI,qBAAqB,QAAQ,SAAS,WAAW;AAAA,IACxE,mBAAmB,IAAI,qBAAqB,QAAQ,SAAS,WAAW;AAAA,IACxE,OAAO,IAAI,SAAS,QAAQ,SAAS,WAAW;AAAA,IAChD,gBAAgB,IAAI,YAAY,QAAQ,SAAS,WAAW;AAAA,IAC5D,kBAAkB,IAAI,oBAAoB,QAAQ,SAAS,WAAW;AAAA,IACtE,cAAc,IAAI,gBAAgB,QAAQ,SAAS,WAAW;AAAA,IAC9D,gBAAgB,IAAI,kBAAkB,QAAQ,SAAS,WAAW;AAAA,IAClE,gBAAgB,IAAI,kBAAkB,QAAQ,SAAS,WAAW;AAAA,IAClE,UAAU,IAAI,YAAY,QAAQ,SAAS,WAAW;AAAA,IACtD,SAAS,IAAI,WAAW,QAAQ,SAAS,WAAW;AAAA,IACpD,YAAY,IAAI,cAAc,QAAQ,SAAS,WAAW;AAAA,IAC1D,OAAO,IAAI,SAAS,QAAQ,SAAS,WAAW;AAAA,IAChD,eAAe,IAAI,iBAAiB,QAAQ,SAAS,WAAW;AAAA,IAChE,aAAa,IAAI,eAAe,QAAQ,SAAS,WAAW;AAAA,IAC5D,OAAO,IAAI,SAAS,QAAQ,SAAS,WAAW;AAAA,IAChD,WAAW,IAAI,aAAa,QAAQ,SAAS,WAAW;AAAA,IACxD,UAAU,IAAI,YAAY,QAAQ,SAAS,WAAW;AAAA,IACtD,WAAW,IAAI,aAAa,QAAQ,SAAS,WAAW;AAAA,IACxD,eAAe,IAAI,iBAAiB,QAAQ,SAAS,WAAW;AAAA,IAChE,sBAAsB,IAAI,wBAAwB,QAAQ,SAAS,WAAW;AAAA,IAC9E,SAAS,IAAI,WAAW,QAAQ,SAAS,WAAW;AAAA,IACpD,OAAO,IAAI,SAAS,QAAQ,SAAS,WAAW;AAAA,IAChD,YAAY,IAAI,cAAc,QAAQ,SAAS,WAAW;AAAA,EAC7D;AACH;;;ACjLO,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;;;ACdO,SAAS,qBAAqB,QAA2B,KAAyB;AACtF,SAAO,gBAAgB,IAAI,cAAc,KAAK,GAAG;AACjD,SAAO,cAAc,IAAI,YAAY,KAAK,GAAG;AAC7C,SAAO,iBAAiB,IAAI,eAAe,KAAK,GAAG;AACnD,SAAO,iBAAiB,IAAI,eAAe,KAAK,GAAG;AACnD,SAAO,iBAAiB,IAAI,eAAe,KAAK,GAAG;AACnD,SAAO,kBAAkB,IAAI,gBAAgB,KAAK,GAAG;AACxD;;;ACTO,SAAS,sBAAsB,QAA4B,KAA0B;AACzF,SAAO,gBAAgB,IAAI,cAAc,KAAK,GAAG;AACjD,SAAO,eAAe,IAAI,aAAa,KAAK,GAAG;AAC/C,SAAO,kBAAkB,IAAI,gBAAgB,KAAK,GAAG;AACrD,SAAO,uBAAuB,IAAI,qBAAqB,KAAK,GAAG;AAClE;;;ACFO,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;;;ACFO,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,YAAY,MAAM,UAAU,KAAK,KAAK;AAG7C,SAAO,kBAAkB,UAAU,gBAAgB,KAAK,SAAS;AACpE;;;ACcO,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,mBAAmB,MAAM,iBAAiB,KAAK,KAAK;AAC3D,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;AACzD,SAAO,oBAAoB,MAAM,kBAAkB,KAAK,KAAK;AAE7D,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;;;ACjFO,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;;;ACUO,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;AAEzE,SAAO,oBAAoB,QAAQ,kBAAkB,KAAK,OAAO;AACjE,SAAO,qBAAqB,QAAQ,mBAAmB,KAAK,OAAO;AACtE;;;ACzCO,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,oBAAoB,WAAW,kBAAkB,KAAK,UAAU;AACvE,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,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,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;;;ACrEO,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,kBAAkB,KAAK,gBAAgB,KAAK,IAAI;AACvD,SAAO,gBAAgB,KAAK,cAAc,KAAK,IAAI;AAGnD,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;;;AC3GO,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;AAGnD,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,cAAc,OAAO,YAAY,KAAK,MAAM;AACnD,SAAO,aAAa,OAAO,WAAW,KAAK,MAAM;AACjD,SAAO,gBAAgB,OAAO,cAAc,KAAK,MAAM;AACvD,SAAO,gBAAgB,OAAO,cAAc,KAAK,MAAM;AACvD,SAAO,gBAAgB,OAAO,cAAc,KAAK,MAAM;AACvD,SAAO,aAAa,OAAO,WAAW,KAAK,MAAM;AACjD,SAAO,iBAAiB,OAAO,eAAe,KAAK,MAAM;AACzD,SAAO,mBAAmB,OAAO,iBAAiB,KAAK,MAAM;AAC7D,SAAO,kBAAkB,OAAO,gBAAgB,KAAK,MAAM;AAC9D;;;ACgBO,SAAS,qBACb,QACA,WACA,eACA,OACA,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;AAC3D,SAAO,8BAA8B,UAAU,4BAA4B,KAAK,SAAS;AACzF,SAAO,8BAA8B,UAAU,4BAA4B,KAAK,SAAS;AAGzF,SAAO,mBAAmB,cAAc,iBAAiB,KAAK,aAAa;AAC3E,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,sBAAsB,UAAU,oBAAoB,KAAK,SAAS;AACzE,SAAO,2BAA2B,UAAU,yBAAyB,KAAK,SAAS;AACnF,SAAO,qBAAqB,UAAU,mBAAmB,KAAK,SAAS;AACvE,SAAO,yBAAyB,UAAU,uBAAuB,KAAK,SAAS;AAC/E,SAAO,wBAAwB,UAAU,sBAAsB,KAAK,SAAS;AAC7E,SAAO,0BAA0B,UAAU,wBAAwB,KAAK,SAAS;AACjF,SAAO,4BAA4B,UAAU,0BAA0B,KAAK,SAAS;AACrF,SAAO,uBAAuB,UAAU,qBAAqB,KAAK,SAAS;AAG3E,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,aAAa,MAAM,WAAW,KAAK,KAAK;AAC/C,SAAO,uBAAuB,MAAM,qBAAqB,KAAK,KAAK;AAGnE,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;;;ACxFO,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;;;AC1CO,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,qBAAqB,aAAa,mBAAmB,KAAK,YAAY;AAC7E,SAAO,qBAAqB,aAAa,mBAAmB,KAAK,YAAY;AAC7E,SAAO,sBAAsB,aAAa,oBAAoB,KAAK,YAAY;AAC/E,SAAO,yBAAyB,aAAa,uBAAuB,KAAK,YAAY;AACrF,SAAO,2BAA2B,aAAa,yBAAyB,KAAK,YAAY;AACzF,SAAO,sBAAsB,aAAa,oBAAoB,KAAK,YAAY;AAC/E,SAAO,wBAAwB,aAAa,sBAAsB,KAAK,YAAY;AACnF,SAAO,8BAA8B,aAAa,4BAA4B,KAAK,YAAY;AAC/F,SAAO,sBAAsB,aAAa,oBAAoB,KAAK,YAAY;AAC/E,SAAO,qBAAqB,aAAa,mBAAmB,KAAK,YAAY;AAC7E,SAAO,oBAAoB,aAAa,kBAAkB,KAAK,YAAY;AAC3E,SAAO,kBAAkB,aAAa,gBAAgB,KAAK,YAAY;AAGvE,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;;;AClCO,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,eAAe,SAAS,aAAa,KAAK,QAAQ;AACzD,SAAO,eAAe,SAAS,aAAa,KAAK,QAAQ;AACzD,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,2BAA2B,SAAS,yBAAyB,KAAK,QAAQ;AACjF,SAAO,mBAAmB,SAAS,iBAAiB,KAAK,QAAQ;AACpE;;;ACrFO,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,6BAA6B,cAAc,2BAA2B,KAAK,aAAa;AAC/F,SAAO,kBAAkB,cAAc,gBAAgB,KAAK,aAAa;AAGzE,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;;;ACtBO,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;;;ACuGO,SAAS,wBACb,QACA,mBACA,aACA,WACA,iBACA,UACA,YACA,SACA,gBACA,gBACA,YACK;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,4BACJ,kBAAkB,0BAA0B,KAAK,iBAAiB;AACrE,SAAO,4BACJ,kBAAkB,0BAA0B,KAAK,iBAAiB;AACrE,SAAO,4BACJ,kBAAkB,0BAA0B,KAAK,iBAAiB;AACrE,SAAO,uBAAuB,kBAAkB,qBAAqB,KAAK,iBAAiB;AAC3F,SAAO,6BACJ,kBAAkB,2BAA2B,KAAK,iBAAiB;AACtE,SAAO,0BACJ,kBAAkB,wBAAwB,KAAK,iBAAiB;AACnE,SAAO,yBAAyB,kBAAkB,uBAAuB,KAAK,iBAAiB;AAC/F,SAAO,yBAAyB,kBAAkB,uBAAuB,KAAK,iBAAiB;AAC/F,SAAO,4BACJ,kBAAkB,0BAA0B,KAAK,iBAAiB;AACrE,SAAO,kCACJ,kBAAkB,gCAAgC,KAAK,iBAAiB;AAC3E,SAAO,iCACJ,kBAAkB,+BAA+B,KAAK,iBAAiB;AAC1E,SAAO,sBAAsB,kBAAkB,oBAAoB,KAAK,iBAAiB;AACzF,SAAO,yBAAyB,kBAAkB,uBAAuB,KAAK,iBAAiB;AAC/F,SAAO,yBAAyB,kBAAkB,uBAAuB,KAAK,iBAAiB;AAC/F,SAAO,iCACJ,kBAAkB,+BAA+B,KAAK,iBAAiB;AAC1E,SAAO,qBAAqB,kBAAkB,mBAAmB,KAAK,iBAAiB;AACvF,SAAO,0BACJ,kBAAkB,wBAAwB,KAAK,iBAAiB;AACnE,SAAO,yBAAyB,kBAAkB,uBAAuB,KAAK,iBAAiB;AAC/F,SAAO,mBAAmB,kBAAkB,iBAAiB,KAAK,iBAAiB;AACnF,SAAO,kBAAkB,kBAAkB,gBAAgB,KAAK,iBAAiB;AACjF,SAAO,8BACJ,kBAAkB,4BAA4B,KAAK,iBAAiB;AAGvE,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;AACrF,SAAO,wBAAwB,gBAAgB,sBAAsB,KAAK,eAAe;AACzF,SAAO,iBAAiB,gBAAgB,eAAe,KAAK,eAAe;AAC3E,SAAO,mBAAmB,gBAAgB,iBAAiB,KAAK,eAAe;AAC/E,SAAO,iBAAiB,gBAAgB,eAAe,KAAK,eAAe;AAC3E,SAAO,oBAAoB,gBAAgB,kBAAkB,KAAK,eAAe;AACjF,SAAO,uBAAuB,gBAAgB,qBAAqB,KAAK,eAAe;AACvF,SAAO,2BAA2B,gBAAgB,yBAAyB,KAAK,eAAe;AAC/F,SAAO,8BACJ,gBAAgB,4BAA4B,KAAK,eAAe;AACnE,SAAO,qBAAqB,gBAAgB,mBAAmB,KAAK,eAAe;AACnF,SAAO,uBAAuB,gBAAgB,qBAAqB,KAAK,eAAe;AACvF,SAAO,2BAA2B,gBAAgB,yBAAyB,KAAK,eAAe;AAC/F,SAAO,6BACJ,gBAAgB,2BAA2B,KAAK,eAAe;AAClE,SAAO,0BAA0B,gBAAgB,wBAAwB,KAAK,eAAe;AAC7F,SAAO,uBAAuB,gBAAgB,qBAAqB,KAAK,eAAe;AACvF,SAAO,2BAA2B,gBAAgB,yBAAyB,KAAK,eAAe;AAC/F,SAAO,8BACJ,gBAAgB,4BAA4B,KAAK,eAAe;AACnE,SAAO,4BACJ,gBAAgB,0BAA0B,KAAK,eAAe;AAGjE,SAAO,oBAAoB,SAAS,kBAAkB,KAAK,QAAQ;AACnE,SAAO,oBAAoB,SAAS,kBAAkB,KAAK,QAAQ;AACnE,SAAO,wBAAwB,SAAS,sBAAsB,KAAK,QAAQ;AAC3E,SAAO,yBAAyB,SAAS,uBAAuB,KAAK,QAAQ;AAC7E,SAAO,6BAA6B,SAAS,2BAA2B,KAAK,QAAQ;AACrF,SAAO,2BAA2B,SAAS,yBAAyB,KAAK,QAAQ;AACjF,SAAO,2BAA2B,SAAS,yBAAyB,KAAK,QAAQ;AACjF,SAAO,mCACJ,SAAS,iCAAiC,KAAK,QAAQ;AAC1D,SAAO,uBAAuB,SAAS,qBAAqB,KAAK,QAAQ;AACzE,SAAO,2BAA2B,SAAS,yBAAyB,KAAK,QAAQ;AAGjF,SAAO,sBAAsB,WAAW,oBAAoB,KAAK,UAAU;AAC3E,SAAO,uBAAuB,WAAW,qBAAqB,KAAK,UAAU;AAC7E,SAAO,sBAAsB,WAAW,oBAAoB,KAAK,UAAU;AAC3E,SAAO,uBAAuB,WAAW,qBAAqB,KAAK,UAAU;AAC7E,SAAO,oBAAoB,WAAW,kBAAkB,KAAK,UAAU;AACvE,SAAO,mBAAmB,WAAW,iBAAiB,KAAK,UAAU;AACrE,SAAO,mBAAmB,WAAW,iBAAiB,KAAK,UAAU;AACrE,SAAO,uBAAuB,WAAW,qBAAqB,KAAK,UAAU;AAC7E,SAAO,sBAAsB,WAAW,oBAAoB,KAAK,UAAU;AAG3E,SAAO,sBAAsB,WAAW,oBAAoB,KAAK,UAAU;AAC3E,SAAO,uBAAuB,WAAW,qBAAqB,KAAK,UAAU;AAC7E,SAAO,sBAAsB,WAAW,oBAAoB,KAAK,UAAU;AAC3E,SAAO,uBAAuB,WAAW,qBAAqB,KAAK,UAAU;AAC7E,SAAO,oBAAoB,WAAW,kBAAkB,KAAK,UAAU;AACvE,SAAO,mBAAmB,WAAW,iBAAiB,KAAK,UAAU;AACrE,SAAO,mBAAmB,WAAW,iBAAiB,KAAK,UAAU;AACrE,SAAO,qCACJ,WAAW,mCAAmC,KAAK,UAAU;AAChE,SAAO,yBAAyB,WAAW,uBAAuB,KAAK,UAAU;AACjF,SAAO,8BAA8B,WAAW,4BAA4B,KAAK,UAAU;AAC3F,SAAO,6BAA6B,WAAW,2BAA2B,KAAK,UAAU;AACzF,SAAO,6BAA6B,WAAW,2BAA2B,KAAK,UAAU;AACzF,SAAO,0BAA0B,WAAW,wBAAwB,KAAK,UAAU;AACnF,SAAO,6BAA6B,WAAW,2BAA2B,KAAK,UAAU;AACzF,SAAO,2BAA2B,WAAW,yBAAyB,KAAK,UAAU;AACrF,SAAO,0BAA0B,WAAW,wBAAwB,KAAK,UAAU;AACnF,SAAO,0BAA0B,WAAW,wBAAwB,KAAK,UAAU;AAGnF,SAAO,mBAAmB,QAAQ,iBAAiB,KAAK,OAAO;AAC/D,SAAO,oBAAoB,QAAQ,kBAAkB,KAAK,OAAO;AACjE,SAAO,mBAAmB,QAAQ,iBAAiB,KAAK,OAAO;AAC/D,SAAO,oBAAoB,QAAQ,kBAAkB,KAAK,OAAO;AACjE,SAAO,iBAAiB,QAAQ,eAAe,KAAK,OAAO;AAC3D,SAAO,gBAAgB,QAAQ,cAAc,KAAK,OAAO;AACzD,SAAO,gBAAgB,QAAQ,cAAc,KAAK,OAAO;AACzD,SAAO,kCAAkC,QAAQ,gCAAgC,KAAK,OAAO;AAC7F,SAAO,sBAAsB,QAAQ,oBAAoB,KAAK,OAAO;AACrE,SAAO,2BAA2B,QAAQ,yBAAyB,KAAK,OAAO;AAC/E,SAAO,0BAA0B,QAAQ,wBAAwB,KAAK,OAAO;AAC7E,SAAO,0BAA0B,QAAQ,wBAAwB,KAAK,OAAO;AAC7E,SAAO,uBAAuB,QAAQ,qBAAqB,KAAK,OAAO;AACvE,SAAO,uBAAuB,QAAQ,qBAAqB,KAAK,OAAO;AACvE,SAAO,8BAA8B,QAAQ,4BAA4B,KAAK,OAAO;AACrF,SAAO,yBAAyB,QAAQ,uBAAuB,KAAK,OAAO;AAC3E,SAAO,qBAAqB,QAAQ,mBAAmB,KAAK,OAAO;AACnE,SAAO,6BAA6B,QAAQ,2BAA2B,KAAK,OAAO;AAGnF,SAAO,gCACJ,eAAe,8BAA8B,KAAK,cAAc;AACnE,SAAO,0BAA0B,eAAe,wBAAwB,KAAK,cAAc;AAC3F,SAAO,6BACJ,eAAe,2BAA2B,KAAK,cAAc;AAChE,SAAO,8BACJ,eAAe,4BAA4B,KAAK,cAAc;AACjE,SAAO,eAAe,eAAe,aAAa,KAAK,cAAc;AACrE,SAAO,cAAc,eAAe,YAAY,KAAK,cAAc;AACnE,SAAO,kBAAkB,eAAe,gBAAgB,KAAK,cAAc;AAC3E,SAAO,uBAAuB,eAAe,qBAAqB,KAAK,cAAc;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;;;ACjXO,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;;;ACRO,SAAS,oBAAoB,QAA0B,UAA6B;AACxF,SAAO,cAAc,SAAS,YAAY,KAAK,QAAQ;AACvD,SAAO,aAAa,SAAS,WAAW,KAAK,QAAQ;AACrD,SAAO,gBAAgB,SAAS,cAAc,KAAK,QAAQ;AAC3D,SAAO,gBAAgB,SAAS,cAAc,KAAK,QAAQ;AAC3D,SAAO,iBAAiB,SAAS,eAAe,KAAK,QAAQ;AAC7D,SAAO,aAAa,SAAS,WAAW,KAAK,QAAQ;AACrD,SAAO,aAAa,SAAS,WAAW,KAAK,QAAQ;AACrD,SAAO,cAAc,SAAS,YAAY,KAAK,QAAQ;AACvD,SAAO,mBAAmB,SAAS,iBAAiB,KAAK,QAAQ;AACjE,SAAO,mBAAmB,SAAS,iBAAiB,KAAK,QAAQ;AACjE,SAAO,mBAAmB,SAAS,iBAAiB,KAAK,QAAQ;AACjE,SAAO,aAAa,SAAS,WAAW,KAAK,QAAQ;AACrD,SAAO,aAAa,SAAS,WAAW,KAAK,QAAQ;AACrD,SAAO,aAAa,SAAS,WAAW,KAAK,QAAQ;AACrD,SAAO,oBAAoB,SAAS,kBAAkB,KAAK,QAAQ;AACnE,SAAO,gBAAgB,SAAS,cAAc,KAAK,QAAQ;AAC3D,SAAO,kBAAkB,SAAS,gBAAgB,KAAK,QAAQ;AAC/D,SAAO,iBAAiB,SAAS,eAAe,KAAK,QAAQ;AAC7D,SAAO,mBAAmB,SAAS,iBAAiB,KAAK,QAAQ;AACjE,SAAO,oBAAoB,SAAS,kBAAkB,KAAK,QAAQ;AACnE,SAAO,kBAAkB,SAAS,gBAAgB,KAAK,QAAQ;AAC/D,SAAO,oBAAoB,SAAS,kBAAkB,KAAK,QAAQ;AACnE,SAAO,oBAAoB,SAAS,kBAAkB,KAAK,QAAQ;AACnE,SAAO,oBAAoB,SAAS,kBAAkB,KAAK,QAAQ;AACtE;;;AClCO,SAAS,0BACb,QACA,gBACK;AACL,SAAO,oBAAoB,eAAe,kBAAkB,KAAK,cAAc;AAC/E,SAAO,mBAAmB,eAAe,iBAAiB,KAAK,cAAc;AAC7E,SAAO,sCACJ,eAAe,oCAAoC,KAAK,cAAc;AAEzE,SAAO,gBAAgB,eAAe,cAAc,KAAK,cAAc;AACvE,SAAO,iBAAiB,eAAe,eAAe,KAAK,cAAc;AACzE,SAAO,cAAc,eAAe,YAAY,KAAK,cAAc;AACnE,SAAO,iBAAiB,eAAe,eAAe,KAAK,cAAc;AACzE,SAAO,iBAAiB,eAAe,eAAe,KAAK,cAAc;AAEzE,SAAO,mBAAmB,eAAe,iBAAiB,KAAK,cAAc;AAC7E,SAAO,iBAAiB,eAAe,eAAe,KAAK,cAAc;AACzE,SAAO,mBAAmB,eAAe,iBAAiB,KAAK,cAAc;AAC7E,SAAO,sBAAsB,eAAe,oBAAoB,KAAK,cAAc;AACnF,SAAO,iBAAiB,eAAe,eAAe,KAAK,cAAc;AAC5E;;;AC9BO,SAAS,oBAAoB,QAA0B,UAA6B;AACxF,SAAO,eAAe,SAAS,aAAa,KAAK,QAAQ;AACzD,SAAO,aAAa,SAAS,WAAW,KAAK,QAAQ;AACrD,SAAO,gBAAgB,SAAS,cAAc,KAAK,QAAQ;AAC3D,SAAO,gBAAgB,SAAS,cAAc,KAAK,QAAQ;AAC3D,SAAO,gBAAgB,SAAS,cAAc,KAAK,QAAQ;AAC9D;;;ACAO,SAAS,qBAAqB,QAA2B,WAA+B;AAC5F,SAAO,iBAAiB,UAAU,eAAe,KAAK,SAAS;AAC/D,SAAO,gBAAgB,UAAU,cAAc,KAAK,SAAS;AAC7D,SAAO,wBAAwB,UAAU,sBAAsB,KAAK,SAAS;AAC7E,SAAO,6BAA6B,UAAU,2BAA2B,KAAK,SAAS;AACvF,SAAO,wBAAwB,UAAU,sBAAsB,KAAK,SAAS;AAC7E,SAAO,mBAAmB,UAAU,iBAAiB,KAAK,SAAS;AACnE,SAAO,8BAA8B,UAAU,4BAA4B,KAAK,SAAS;AACzF,SAAO,8BAA8B,UAAU,4BAA4B,KAAK,SAAS;AACzF,SAAO,gCAAgC,UAAU,8BAA8B,KAAK,SAAS;AAC7F,SAAO,gCAAgC,UAAU,8BAA8B,KAAK,SAAS;AAC7F,SAAO,oCACJ,UAAU,kCAAkC,KAAK,SAAS;AAChE;;;AClBO,SAAS,qBAAqB,QAA2B,WAA+B;AAC5F,SAAO,iBAAiB,UAAU,eAAe,KAAK,SAAS;AAC/D,SAAO,gBAAgB,UAAU,cAAc,KAAK,SAAS;AAC7D,SAAO,wBAAwB,UAAU,sBAAsB,KAAK,SAAS;AAC7E,SAAO,wBAAwB,UAAU,sBAAsB,KAAK,SAAS;AAC7E,SAAO,6BAA6B,UAAU,2BAA2B,KAAK,SAAS;AACvF,SAAO,mBAAmB,UAAU,iBAAiB,KAAK,SAAS;AACtE;;;ACZO,SAAS,mBAAmB,QAAyB,SAA2B;AACpF,SAAO,gBAAgB,QAAQ,cAAc,KAAK,OAAO;AAC5D;;;ACkEO,IAAM,oBAAN,MA+BP;AAAA;AAAA,EAEU;AAAA;AAAA,EAGG;AAAA;AAAA,EAGV;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAGA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA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","names":["AccessLevel","AccessLevel","Scope","MemberType","McpServerState","ToolkitState","EventRuleObjectType","EventRuleEventType","EventRuleActionType","WorkspaceFeature","MemberFeature","OrgFeature","Resource","ProductType","WorkspaceProvisionStatus","InvitationStatus","DataFieldType","IndexStatus","CalendarPermissionType","CalendarSource","CalendarScheduleRecurrence","CalendarScheduleAvailabilityType","CalendarEventStatus","AttendeeStatus","AttendeeResponseStatus","FhirVendor","FhirConnectionState","FhirClientType","CriterionType","DriverMode","AccessGrantResourceType","AccessGrantStatus","AccessGrantTrigger","ConsentMethod","FeatureCategory","FeatureVisibility","ScopeCategory"]}