@lpextend/node-sdk 1.1.3 → 1.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +108 -1
- package/dist/index.d.ts +108 -1
- package/dist/index.js +99 -0
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +99 -0
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/types/index.ts","../src/domains.ts","../src/http.ts","../src/api/account-config.api.ts","../src/api/ai-studio.api.ts","../src/api/messaging.api.ts","../src/api/sentinel.api.ts","../src/api/prompts.api.ts","../src/api/conversation-builder.api.ts","../src/sdk.ts","../src/index.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["/**\r\n * LP Extend Client SDK - Type Definitions Index\r\n *\r\n * Re-exports all types from domain-specific type files.\r\n */\r\n\r\n// Account Configuration Types\r\nexport * from './account-config.types';\r\n\r\n// Sentinel (LivePerson IDP) Types\r\nexport * from './sentinel.types';\r\n\r\n// LP Prompts (Prompt Library) Types\r\nexport * from './prompts.types';\r\n\r\n// Conversation Builder Types\r\nexport * from './conversation-builder.types';\r\n\r\n// AI Studio Types - explicit exports to avoid conflicts\r\nexport type {\r\n // Categories\r\n AIStudioCategory,\r\n CreateCategoryRequest,\r\n UpdateCategoryRequest,\r\n // Conversations (renamed to avoid conflict)\r\n AIStudioConversation,\r\n AIStudioMessage,\r\n CreateConversationRequest as AICreateConversationRequest,\r\n UpdateConversationRequest as AIUpdateConversationRequest,\r\n ConversationQueryParams,\r\n UpdateConversationAttributesRequest,\r\n // Summary\r\n SummaryRequest,\r\n BatchSummaryRequest,\r\n AIStudioSummary,\r\n // Query\r\n QueryGenerateRequest,\r\n QueryGenerateResponse,\r\n // Simulations\r\n AIStudioSimulation,\r\n SimulationConfig,\r\n SimulationTestCase,\r\n SimulationResults,\r\n CreateSimulationRequest,\r\n UpdateSimulationRequest,\r\n SimulationQueryParams,\r\n SimulationJobResult,\r\n // Transcript Analysis\r\n TranscriptAnalysis,\r\n TranscriptConversation,\r\n TranscriptQuestion,\r\n CreateTranscriptAnalysisRequest,\r\n UpdateTranscriptAnalysisRequest,\r\n // Knowledgebases\r\n Knowledgebase,\r\n KnowledgebaseHealth,\r\n KnowledgebaseSearchRequest,\r\n KnowledgebaseSearchResult,\r\n KnowledgebaseItem,\r\n KnowledgebaseTextItem,\r\n // Evaluators\r\n SimilarityEvaluationRequest,\r\n SimilarityEvaluationResponse,\r\n ResolutionEvaluationRequest,\r\n ResolutionEvaluationResponse,\r\n GuidedRoutingEvaluationRequest,\r\n GuidedRoute,\r\n GuidedRoutingEvaluationResponse,\r\n // Generators\r\n QuestionGeneratorRequest,\r\n QuestionGeneratorResponse,\r\n GeneratedQuestion,\r\n KAIRouteGeneratorRequest,\r\n KAIRouteGeneratorResponse,\r\n GeneratedRoute,\r\n KAIRouteGenerationStatus,\r\n // Prompt Library\r\n Prompt,\r\n PromptVariable,\r\n CreatePromptRequest,\r\n UpdatePromptRequest,\r\n LLMProvider,\r\n LLMModel,\r\n // Users\r\n AIStudioUser,\r\n CreateAIStudioUserRequest,\r\n UpdateAIStudioUserRequest,\r\n UpdateAIStudioUserModelsRequest,\r\n // Flows\r\n AIStudioFlow,\r\n InvokeFlowRequest,\r\n InvokeFlowResponse,\r\n} from './ai-studio.types';\r\n\r\n// Messaging Types - explicit exports to avoid conflicts\r\nexport type {\r\n // Messaging History\r\n MessagingConversation,\r\n ConversationParticipant,\r\n ConsumerParticipant,\r\n AgentParticipant,\r\n ConversationTransfer,\r\n ConversationInteraction,\r\n MessageRecord,\r\n MessageData,\r\n TextMessage,\r\n FileMessage,\r\n RichContentMessage,\r\n ConversationSummary,\r\n SDERecord,\r\n SDEEvent,\r\n CoBrowseSession,\r\n SurveyRecord,\r\n MessagingHistoryQuery,\r\n ContentToRetrieve,\r\n MessagingHistoryResponse,\r\n MessagingInteraction,\r\n // Agent Metrics\r\n AgentMetrics,\r\n AgentStatus,\r\n AgentMetricsQuery,\r\n // Agent Activity\r\n AgentActivity,\r\n ActivityRecord,\r\n AgentActivityQuery,\r\n // Operations\r\n TransferConversationRequest,\r\n CloseConversationRequest,\r\n SendMessageRequest,\r\n // Connect to Messaging (renamed to avoid conflict)\r\n CreateConversationRequest as MessagingCreateConversationRequest,\r\n ConsumerProfile,\r\n ConversationContext,\r\n CreateConversationResponse,\r\n // Outbound\r\n OutboundCampaignReport,\r\n OutboundReportQuery,\r\n} from './messaging.types';\r\n\r\n// =============================================================================\r\n// SDK Configuration\r\n// =============================================================================\r\n\r\n/**\r\n * Configuration options for initializing the SDK\r\n */\r\nexport interface LPExtendSDKConfig {\r\n /**\r\n * Your registered app ID from LP Extend\r\n * @example 'my-qa-app'\r\n */\r\n appId: string;\r\n\r\n /**\r\n * LivePerson account ID\r\n * @example '12345678'\r\n */\r\n accountId: string;\r\n\r\n /**\r\n * LP Access token (obtained from shell auth)\r\n * This is the user's LP bearer token passed to the child app.\r\n *\r\n * Either provide this directly OR provide extendToken OR provide shellToken OR provide apiKey.\r\n */\r\n accessToken?: string;\r\n\r\n /**\r\n * LP Extend API Key (RECOMMENDED for backend apps)\r\n * Your app's API key from LP Extend shell registration.\r\n * SDK will authenticate with shell and get LP access token.\r\n *\r\n * Set via environment variable: LPEXTEND_API_KEY\r\n * @example 'lpx_my-app_abc123...'\r\n */\r\n apiKey?: string;\r\n\r\n /**\r\n * ExtendJWT token (for iframe apps receiving token from shell)\r\n * Encrypted JWT from shell containing all auth data.\r\n * SDK will verify with shell and get LP access token.\r\n *\r\n * @example Received via URL params: ?extendToken=xxx\r\n */\r\n extendToken?: string;\r\n\r\n /**\r\n * Shell JWT token (X-Shell-Token) - LEGACY\r\n * If provided instead of accessToken, the SDK will automatically\r\n * fetch the LP access token from the shell during initialization.\r\n *\r\n * @example Received via URL params: ?shellToken=xxx\r\n * @deprecated Use apiKey for backend apps or extendToken for iframe apps\r\n */\r\n shellToken?: string;\r\n\r\n /**\r\n * Shell backend base URL\r\n * Required when using apiKey, extendToken, or shellToken for automatic token retrieval.\r\n * @default Derived from window.location.origin, parent frame, or LPEXTEND_SHELL_URL env var\r\n * @example 'https://lp-extend.example.com'\r\n */\r\n shellBaseUrl?: string;\r\n\r\n /**\r\n * Scopes your app requests access to\r\n * These are validated against app registration\r\n * @example ['skills', 'users', 'agentGroups']\r\n */\r\n scopes?: string[];\r\n\r\n /**\r\n * Enable debug logging\r\n * @default false\r\n */\r\n debug?: boolean;\r\n\r\n /**\r\n * Request timeout in milliseconds\r\n * @default 30000\r\n */\r\n timeout?: number;\r\n}\r\n\r\n/**\r\n * SDK initialization result\r\n */\r\nexport interface SDKInitResult {\r\n /** App ID confirmed by shell */\r\n appId: string;\r\n /** Account ID */\r\n accountId: string;\r\n /** Scopes granted based on app registration */\r\n grantedScopes: string[];\r\n /** App name from registration */\r\n appName: string;\r\n /** App version */\r\n version?: string;\r\n}\r\n\r\n// =============================================================================\r\n// API Response Types\r\n// =============================================================================\r\n\r\n/**\r\n * Standard API response wrapper\r\n */\r\nexport interface APIResponse<T> {\r\n /** Response data */\r\n data: T;\r\n /** Revision number for optimistic locking (used for updates/deletes) */\r\n revision?: string;\r\n}\r\n\r\n/**\r\n * Paginated response\r\n */\r\nexport interface PaginatedResponse<T> {\r\n /** Array of items */\r\n items: T[];\r\n /** Total count */\r\n total: number;\r\n /** Current offset */\r\n offset: number;\r\n /** Page size */\r\n limit: number;\r\n /** Next page token if available */\r\n nextOffset?: number;\r\n}\r\n\r\n// =============================================================================\r\n// Error Types\r\n// =============================================================================\r\n\r\n/**\r\n * SDK Error\r\n */\r\nexport class LPExtendSDKError extends Error {\r\n constructor(\r\n message: string,\r\n public readonly code: string,\r\n public readonly status?: number,\r\n public readonly details?: Record<string, unknown>\r\n ) {\r\n super(message);\r\n this.name = 'LPExtendSDKError';\r\n }\r\n}\r\n\r\n/**\r\n * Error codes\r\n */\r\nexport const ErrorCodes = {\r\n /** Not running inside shell iframe */\r\n NOT_IN_SHELL: 'NOT_IN_SHELL',\r\n /** SDK initialization failed */\r\n INIT_FAILED: 'INIT_FAILED',\r\n /** App not registered or disabled */\r\n APP_NOT_REGISTERED: 'APP_NOT_REGISTERED',\r\n /** Authentication failed */\r\n UNAUTHORIZED: 'UNAUTHORIZED',\r\n /** Scope not granted - update app registration */\r\n SCOPE_DENIED: 'SCOPE_DENIED',\r\n /** Resource not found */\r\n NOT_FOUND: 'NOT_FOUND',\r\n /** API call failed */\r\n API_ERROR: 'API_ERROR',\r\n /** Request timeout */\r\n TIMEOUT: 'TIMEOUT',\r\n /** Invalid configuration */\r\n INVALID_CONFIG: 'INVALID_CONFIG',\r\n /** Revision conflict - resource was modified */\r\n REVISION_CONFLICT: 'REVISION_CONFLICT',\r\n /** Rate limit exceeded */\r\n RATE_LIMITED: 'RATE_LIMITED',\r\n} as const;\r\n\r\nexport type ErrorCode = (typeof ErrorCodes)[keyof typeof ErrorCodes];\r\n\r\n// =============================================================================\r\n// Shell Token Types (for child apps retrieving LP tokens from shell)\r\n// =============================================================================\r\n\r\n/**\r\n * Configuration for retrieving LP token from shell\r\n */\r\nexport interface ShellTokenConfig {\r\n /**\r\n * Shell backend base URL\r\n * @example 'https://lp-extend.example.com'\r\n */\r\n shellBaseUrl: string;\r\n\r\n /**\r\n * LP Account ID\r\n * @example '12345678'\r\n */\r\n accountId: string;\r\n\r\n /**\r\n * Shell JWT token (X-Shell-Token)\r\n * Received from shell via postMessage or URL params\r\n */\r\n shellToken: string;\r\n\r\n /**\r\n * Your registered app ID\r\n * @example 'my-qa-app'\r\n */\r\n appId: string;\r\n\r\n /**\r\n * Optional scopes to request validation for\r\n */\r\n scopes?: string[];\r\n\r\n /**\r\n * Request timeout in milliseconds\r\n * @default 10000\r\n */\r\n timeout?: number;\r\n}\r\n\r\n/**\r\n * User profile data returned with LP token\r\n */\r\nexport interface ShellTokenUser {\r\n id: string;\r\n fullName?: string;\r\n email?: string;\r\n loginName?: string;\r\n profileIds?: number[];\r\n skillIds?: number[];\r\n}\r\n\r\n/**\r\n * Response from shell token retrieval\r\n */\r\nexport interface ShellTokenResponse {\r\n /** LP Bearer access token for API calls */\r\n accessToken: string;\r\n /** Token expiration timestamp (Unix ms) */\r\n expiresAt: number;\r\n /** LP Account ID */\r\n accountId: string;\r\n /** LP User ID */\r\n userId: string;\r\n /** User profile data */\r\n user?: ShellTokenUser;\r\n /**\r\n * Conversation Builder API token\r\n * Used for authenticating CB API calls\r\n */\r\n cbToken?: string;\r\n /**\r\n * Conversation Builder organization ID\r\n * Required for CB API calls\r\n */\r\n cbOrg?: string;\r\n}\r\n\r\n// =============================================================================\r\n// ExtendJWT Types (New unified auth)\r\n// =============================================================================\r\n\r\n/**\r\n * Response from ExtendJWT verification\r\n * Child apps call shell's /api/v2/auth/verify-child endpoint\r\n */\r\nexport interface ExtendJWTVerifyResponse {\r\n /** Verification success */\r\n valid: boolean;\r\n /** LP Bearer access token for API calls */\r\n lpAccessToken: string;\r\n /** LP User ID */\r\n lpUserId: string;\r\n /** LP Account ID */\r\n lpAccountId: string;\r\n /** Is LPA user */\r\n isLPA: boolean;\r\n /** Conversation Builder token */\r\n cbToken?: string;\r\n /** Conversation Builder org */\r\n cbOrg?: string;\r\n /** Token expiration timestamp (Unix ms) */\r\n expiresAt: number;\r\n /** Time until expiry in ms */\r\n expiresIn: number;\r\n}\r\n\r\n// =============================================================================\r\n// API Key Authentication Types\r\n// =============================================================================\r\n\r\n/**\r\n * Response from API key authentication\r\n * Child apps call shell's /api/v1/apps/auth endpoint with API key\r\n */\r\nexport interface ApiKeyAuthResponse {\r\n /** Authentication success */\r\n authenticated: boolean;\r\n /** LP Bearer access token for API calls */\r\n lpAccessToken: string;\r\n /** LP User ID */\r\n lpUserId: string;\r\n /** LP Account ID */\r\n lpAccountId: string;\r\n /** Is LPA user */\r\n isLPA: boolean;\r\n /** APIs this app has access to */\r\n allowedApis: string[];\r\n /** App name from registration */\r\n appName: string;\r\n /** Conversation Builder token */\r\n cbToken?: string;\r\n /** Conversation Builder org */\r\n cbOrg?: string;\r\n /** Token expiration timestamp (Unix ms) */\r\n expiresAt: number;\r\n}\r\n","/**\r\n * LP Domain Resolution (CSDS)\r\n *\r\n * Resolves LivePerson service domains using the CSDS API.\r\n * Caches domains per account to minimize API calls.\r\n */\r\n\r\n/**\r\n * Base URI response from CSDS\r\n */\r\nexport interface BaseURI {\r\n account: string;\r\n service: string;\r\n baseURI: string;\r\n}\r\n\r\n/**\r\n * Zone/region mapping\r\n */\r\nconst ZONE_MAP: Record<string, string> = {\r\n va: 'z1', // US\r\n lo: 'z2', // EU\r\n sy: 'z3', // AU/APAC\r\n};\r\n\r\nconst GEO_MAP: Record<string, string> = {\r\n z1: 'p-us',\r\n z2: 'p-eu',\r\n z3: 'p-au',\r\n};\r\n\r\n/**\r\n * Domain cache - simple in-memory cache\r\n */\r\nconst domainCache: Map<string, { domains: BaseURI[]; expires: number }> = new Map();\r\nconst CACHE_TTL_MS = 60 * 60 * 1000; // 1 hour\r\n\r\n/**\r\n * Domain Resolver\r\n *\r\n * Resolves LP service domains using CSDS API.\r\n */\r\nexport class DomainResolver {\r\n private accountId: string;\r\n private region: string | null = null;\r\n private zone: string | null = null;\r\n private geo: string | null = null;\r\n\r\n constructor(accountId: string) {\r\n this.accountId = accountId;\r\n }\r\n\r\n /**\r\n * Get domain for a specific LP service\r\n */\r\n async getDomain(service: string): Promise<string | null> {\r\n const domains = await this.getDomains();\r\n const domain = domains.find((d) => d.service === service);\r\n return domain?.baseURI || null;\r\n }\r\n\r\n /**\r\n * Get all domains for the account\r\n */\r\n async getDomains(): Promise<BaseURI[]> {\r\n // Check cache first\r\n const cached = domainCache.get(this.accountId);\r\n if (cached && cached.expires > Date.now()) {\r\n return cached.domains;\r\n }\r\n\r\n // Fetch from CSDS\r\n const response = await fetch(\r\n `https://api.liveperson.net/api/account/${this.accountId}/service/baseURI.json?version=1.0`,\r\n {\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n },\r\n }\r\n );\r\n\r\n if (!response.ok) {\r\n throw new Error(`Failed to fetch domains: ${response.status} ${response.statusText}`);\r\n }\r\n\r\n const data = await response.json();\r\n const domains: BaseURI[] = data.baseURIs || [];\r\n\r\n // Determine region/zone from asyncMessagingEnt domain\r\n const asyncMessagingEnt = domains.find((d) => d.service === 'asyncMessagingEnt');\r\n if (asyncMessagingEnt) {\r\n this.region = asyncMessagingEnt.baseURI.split('.')[0];\r\n this.zone = ZONE_MAP[this.region] || null;\r\n this.geo = this.zone ? GEO_MAP[this.zone] : null;\r\n\r\n // Add additional domains not in CSDS\r\n if (this.zone && this.region && this.geo) {\r\n const additionalDomains = this.getAdditionalDomains();\r\n for (const additional of additionalDomains) {\r\n if (!domains.find((d) => d.service === additional.service)) {\r\n domains.push(additional);\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Cache the domains\r\n domainCache.set(this.accountId, {\r\n domains,\r\n expires: Date.now() + CACHE_TTL_MS,\r\n });\r\n\r\n return domains;\r\n }\r\n\r\n /**\r\n * Get additional domains not in CSDS\r\n */\r\n private getAdditionalDomains(): BaseURI[] {\r\n if (!this.zone || !this.region || !this.geo) {\r\n return [];\r\n }\r\n\r\n return [\r\n {\r\n account: this.accountId,\r\n service: 'aiStudioPlatformService',\r\n baseURI: `aistudio-${this.geo}.liveperson.net`,\r\n },\r\n {\r\n account: this.accountId,\r\n service: 'proactive',\r\n baseURI: `proactive-messaging.${this.zone}.fs.liveperson.com`,\r\n },\r\n {\r\n account: this.accountId,\r\n service: 'botlogs',\r\n baseURI: `${this.region}.bc-bot.liveperson.net`,\r\n },\r\n {\r\n account: this.accountId,\r\n service: 'bot',\r\n baseURI: `${this.region}.bc-bot.liveperson.net`,\r\n },\r\n {\r\n account: this.accountId,\r\n service: 'botPlatform',\r\n baseURI: `${this.region}.bc-platform.liveperson.net`,\r\n },\r\n {\r\n account: this.accountId,\r\n service: 'kb',\r\n baseURI: `${this.region}.bc-kb.liveperson.net`,\r\n },\r\n {\r\n account: this.accountId,\r\n service: 'context',\r\n baseURI: `${this.region}.context.liveperson.net`,\r\n },\r\n {\r\n account: this.accountId,\r\n service: 'recommendation',\r\n baseURI: `${this.zone}.askmaven.liveperson.net`,\r\n },\r\n {\r\n account: this.accountId,\r\n service: 'proactiveHandoff',\r\n baseURI: `${this.region}.handoff.liveperson.net`,\r\n },\r\n {\r\n account: this.accountId,\r\n service: 'convBuild',\r\n baseURI: `${this.region}.bc-sso.liveperson.net`,\r\n },\r\n {\r\n account: this.accountId,\r\n service: 'bcmgmt',\r\n baseURI: `${this.region}.bc-mgmt.liveperson.net`,\r\n },\r\n {\r\n account: this.accountId,\r\n service: 'bcintg',\r\n baseURI: `${this.region}.bc-intg.liveperson.net`,\r\n },\r\n {\r\n account: this.accountId,\r\n service: 'bcnlu',\r\n baseURI: `${this.region}.bc-nlu.liveperson.net`,\r\n },\r\n {\r\n account: this.accountId,\r\n service: 'promptlibrary',\r\n baseURI: `${this.geo}.promptlibrary.liveperson.net`,\r\n },\r\n // Conversation Builder domains (aliases for consistency with CB service naming)\r\n {\r\n account: this.accountId,\r\n service: 'cbBotPlatform',\r\n baseURI: `${this.region}.bc-platform.liveperson.net`,\r\n },\r\n {\r\n account: this.accountId,\r\n service: 'cbIbc',\r\n baseURI: `${this.region}.bc-nlu.liveperson.net`,\r\n },\r\n {\r\n account: this.accountId,\r\n service: 'cbKb',\r\n baseURI: `${this.region}.bc-kb.liveperson.net`,\r\n },\r\n {\r\n account: this.accountId,\r\n service: 'cbMonitoring',\r\n baseURI: `${this.region}.bc-mgmt.liveperson.net`,\r\n },\r\n {\r\n account: this.accountId,\r\n service: 'cbExternalIntegrations',\r\n baseURI: `${this.region}.bc-intg.liveperson.net`,\r\n },\r\n {\r\n account: this.accountId,\r\n service: 'cbAiSearch',\r\n baseURI: `${this.region}.kai.liveperson.net`,\r\n },\r\n ];\r\n }\r\n\r\n /**\r\n * Clear cached domains for this account\r\n */\r\n clearCache(): void {\r\n domainCache.delete(this.accountId);\r\n }\r\n}\r\n\r\n/**\r\n * Create a domain resolver for an account\r\n */\r\nexport function createDomainResolver(accountId: string): DomainResolver {\r\n return new DomainResolver(accountId);\r\n}\r\n\r\n/**\r\n * Clear all cached domains\r\n */\r\nexport function clearAllDomainCache(): void {\r\n domainCache.clear();\r\n}\r\n","/**\r\n * HTTP Client\r\n *\r\n * Makes HTTP requests directly to LivePerson APIs.\r\n * Handles domain resolution, authentication, and revision management.\r\n * Supports both Bearer (standard LP) and CC-Bearer (AI Studio) auth modes.\r\n */\r\n\r\nimport type { APIResponse } from './types';\r\nimport { LPExtendSDKError, ErrorCodes } from './types';\r\nimport { DomainResolver } from './domains';\r\n\r\n/**\r\n * HTTP method types\r\n */\r\ntype HTTPMethod = 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';\r\n\r\n/**\r\n * Auth mode for LP APIs\r\n */\r\nexport type AuthMode = 'bearer' | 'cc-bearer';\r\n\r\n/**\r\n * Request options\r\n */\r\nexport interface RequestOptions {\r\n body?: unknown;\r\n headers?: Record<string, string>;\r\n params?: Record<string, string | number | boolean | undefined>;\r\n /** Revision for optimistic locking (If-Match header) */\r\n revision?: string;\r\n /** Auth mode override (default: bearer) */\r\n authMode?: AuthMode;\r\n /** Custom timeout for this request */\r\n timeout?: number;\r\n}\r\n\r\n/**\r\n * Scope configuration - maps SDK scopes to LP services and URL patterns\r\n */\r\ninterface ScopeConfig {\r\n service: string;\r\n pathPrefix: string;\r\n authType?: AuthMode;\r\n urlPattern: 'accountConfig' | 'messaging' | 'aiStudio' | 'prompts' | 'custom';\r\n}\r\n\r\n/**\r\n * Scope to LP service mapping\r\n */\r\nconst SCOPE_CONFIG: Record<string, ScopeConfig> = {\r\n // Account Configuration APIs (Bearer auth)\r\n skills: { service: 'accountConfigReadOnly', pathPrefix: '/le-users/skills', urlPattern: 'accountConfig' },\r\n users: { service: 'accountConfigReadOnly', pathPrefix: '/le-users/users', urlPattern: 'accountConfig' },\r\n agentGroups: { service: 'accountConfigReadOnly', pathPrefix: '/le-users/agentGroups', urlPattern: 'accountConfig' },\r\n profiles: { service: 'accountConfigReadOnly', pathPrefix: '/le-users/profiles', urlPattern: 'accountConfig' },\r\n lobs: { service: 'accountConfigReadOnly', pathPrefix: '/le-users/lobs', urlPattern: 'accountConfig' },\r\n predefinedContent: { service: 'accountConfigReadOnly', pathPrefix: '/le-predefined-content/predefinedContent', urlPattern: 'accountConfig' },\r\n automaticMessages: { service: 'accountConfigReadOnly', pathPrefix: '/le-campaigns/automatic-messages', urlPattern: 'accountConfig' },\r\n workingHours: { service: 'accountConfigReadOnly', pathPrefix: '/le-users/working-hours', urlPattern: 'accountConfig' },\r\n specialOccasions: { service: 'accountConfigReadOnly', pathPrefix: '/le-users/special-occasions', urlPattern: 'accountConfig' },\r\n campaigns: { service: 'accountConfigReadOnly', pathPrefix: '/le-campaigns/campaigns', urlPattern: 'accountConfig' },\r\n engagements: { service: 'accountConfigReadOnly', pathPrefix: '/le-campaigns/campaigns', urlPattern: 'accountConfig' },\r\n\r\n // AI Studio APIs (CC-Bearer auth)\r\n aiStudio: { service: 'aiStudioPlatformService', pathPrefix: '', authType: 'cc-bearer', urlPattern: 'aiStudio' },\r\n promptLibrary: { service: 'aiStudioPlatformService', pathPrefix: '', authType: 'cc-bearer', urlPattern: 'aiStudio' },\r\n\r\n // Messaging APIs\r\n messagingHistory: { service: 'msgHist', pathPrefix: '/messaging_history/api/account', urlPattern: 'messaging' },\r\n messagingOperations: { service: 'asyncMessagingEnt', pathPrefix: '/api/account', urlPattern: 'messaging' },\r\n connectToMessaging: { service: 'asyncMessagingEnt', pathPrefix: '/api/account', urlPattern: 'messaging' },\r\n agentMetrics: { service: 'leDataReporting', pathPrefix: '/operations/api/account', urlPattern: 'messaging' },\r\n agentActivity: { service: 'leDataReporting', pathPrefix: '/operations/api/account', urlPattern: 'messaging' },\r\n outboundReporting: { service: 'leDataReporting', pathPrefix: '/operations/api/account', urlPattern: 'messaging' },\r\n\r\n // Other LP APIs\r\n conversationOrchestrator: { service: 'maven', pathPrefix: '/v1/account', urlPattern: 'messaging' },\r\n faas: { service: 'faasUI', pathPrefix: '/api/account', urlPattern: 'messaging' },\r\n proactiveMessaging: { service: 'proactive', pathPrefix: '/api', urlPattern: 'custom' },\r\n\r\n // LP Prompt Library (separate from AI Studio Prompt Library)\r\n prompts: { service: 'promptlibrary', pathPrefix: '/v2', urlPattern: 'prompts' },\r\n};\r\n\r\n/**\r\n * Write operations use accountConfigReadWrite domain\r\n */\r\nconst WRITE_SERVICE = 'accountConfigReadWrite';\r\n\r\n/**\r\n * HTTP Client for direct LP API calls\r\n *\r\n * All requests go directly to LivePerson APIs.\r\n * Domain resolution is handled via CSDS.\r\n * The shell is only consulted for scope validation during SDK init.\r\n */\r\nexport class HTTPClient {\r\n private readonly domainResolver: DomainResolver;\r\n\r\n constructor(\r\n private readonly accountId: string,\r\n private readonly accessToken: string,\r\n private readonly defaultTimeout: number,\r\n private readonly debug: boolean\r\n ) {\r\n this.domainResolver = new DomainResolver(accountId);\r\n }\r\n\r\n /**\r\n * Make a GET request\r\n */\r\n async get<T>(path: string, options?: RequestOptions): Promise<APIResponse<T>> {\r\n return this.request<T>('GET', path, options);\r\n }\r\n\r\n /**\r\n * Make a POST request\r\n */\r\n async post<T>(path: string, body?: unknown, options?: RequestOptions): Promise<APIResponse<T>> {\r\n return this.request<T>('POST', path, { ...options, body });\r\n }\r\n\r\n /**\r\n * Make a PUT request\r\n */\r\n async put<T>(path: string, body?: unknown, options?: RequestOptions): Promise<APIResponse<T>> {\r\n return this.request<T>('PUT', path, { ...options, body });\r\n }\r\n\r\n /**\r\n * Make a DELETE request\r\n */\r\n async delete<T>(path: string, options?: RequestOptions): Promise<APIResponse<T>> {\r\n return this.request<T>('DELETE', path, options);\r\n }\r\n\r\n /**\r\n * Make a PATCH request\r\n */\r\n async patch<T>(path: string, body?: unknown, options?: RequestOptions): Promise<APIResponse<T>> {\r\n return this.request<T>('PATCH', path, { ...options, body });\r\n }\r\n\r\n /**\r\n * Create a scoped client for a specific API domain\r\n * This allows setting default options like authMode for all requests\r\n */\r\n withDefaults(defaults: Partial<RequestOptions>): ScopedHTTPClient {\r\n return new ScopedHTTPClient(this, defaults);\r\n }\r\n\r\n /**\r\n * Build the full URL for an LP API endpoint\r\n */\r\n private async buildUrl(\r\n path: string,\r\n scopeConfig: ScopeConfig,\r\n isWrite: boolean\r\n ): Promise<string> {\r\n // Determine which service to use (read vs write for account config)\r\n const serviceName =\r\n isWrite && scopeConfig.service.startsWith('accountConfig')\r\n ? WRITE_SERVICE\r\n : scopeConfig.service;\r\n\r\n const domain = await this.domainResolver.getDomain(serviceName);\r\n if (!domain) {\r\n throw new LPExtendSDKError(\r\n `Could not resolve domain for service: ${serviceName}`,\r\n ErrorCodes.API_ERROR\r\n );\r\n }\r\n\r\n let url: string;\r\n\r\n switch (scopeConfig.urlPattern) {\r\n case 'accountConfig':\r\n // Standard account config: https://{domain}/api/account/{accountId}/configuration{pathPrefix}{path}\r\n url = `https://${domain}/api/account/${this.accountId}/configuration${scopeConfig.pathPrefix}`;\r\n break;\r\n\r\n case 'messaging':\r\n // Messaging/Reporting: https://{domain}{pathPrefix}/{accountId}{path}\r\n url = `https://${domain}${scopeConfig.pathPrefix}/${this.accountId}`;\r\n break;\r\n\r\n case 'aiStudio':\r\n // AI Studio: https://{domain}/api/v2{path}\r\n // Note: account_id is passed as query param where needed, not in path\r\n url = `https://${domain}/api/v2`;\r\n break;\r\n\r\n case 'prompts':\r\n // LP Prompt Library has special path transformations:\r\n // /system -> /v2/system/prompts\r\n // /account -> /v2/accounts/{accountId}/prompts\r\n // /account/{id} -> /v2/accounts/{accountId}/prompts/{id}\r\n // /llm-providers -> /v2/accounts/{accountId}/configurations/llm-providers\r\n url = `https://${domain}${scopeConfig.pathPrefix}`;\r\n // Path transformation happens via the path parameter\r\n if (path.startsWith('/system')) {\r\n url += `/system/prompts${path.substring('/system'.length)}`;\r\n return url;\r\n } else if (path.startsWith('/account')) {\r\n url += `/accounts/${this.accountId}/prompts${path.substring('/account'.length)}`;\r\n return url;\r\n } else if (path.startsWith('/llm-providers')) {\r\n url += `/accounts/${this.accountId}/configurations/llm-providers${path.substring('/llm-providers'.length)}`;\r\n return url;\r\n }\r\n break;\r\n\r\n case 'custom':\r\n default:\r\n // Custom pattern\r\n url = `https://${domain}${scopeConfig.pathPrefix}`;\r\n break;\r\n }\r\n\r\n // Append the path\r\n if (path) {\r\n url += path.startsWith('/') ? path : `/${path}`;\r\n }\r\n\r\n return url;\r\n }\r\n\r\n /**\r\n * Determine scope from path\r\n */\r\n private getScopeFromPath(path: string): string {\r\n // Extract scope from path like /skills, /users, /ai-studio/...\r\n const normalizedPath = path.startsWith('/') ? path.substring(1) : path;\r\n const firstSegment = normalizedPath.split('/')[0];\r\n\r\n // Check for prompts prefix (LP Prompt Library)\r\n if (firstSegment === 'prompts') {\r\n return 'prompts';\r\n }\r\n\r\n // Check for ai-studio prefix\r\n if (firstSegment === 'ai-studio' || normalizedPath.startsWith('ai-studio')) {\r\n return 'aiStudio';\r\n }\r\n\r\n // Check for messaging prefix\r\n if (firstSegment === 'messaging') {\r\n const secondSegment = normalizedPath.split('/')[1];\r\n if (secondSegment === 'history') return 'messagingHistory';\r\n if (secondSegment === 'agent-metrics') return 'agentMetrics';\r\n if (secondSegment === 'agent-activity') return 'agentActivity';\r\n if (secondSegment === 'operations') return 'messagingOperations';\r\n if (secondSegment === 'connect') return 'connectToMessaging';\r\n if (secondSegment === 'outbound') return 'outboundReporting';\r\n return 'messagingHistory'; // default\r\n }\r\n\r\n // Map path segment to scope\r\n const scopeMap: Record<string, string> = {\r\n skills: 'skills',\r\n users: 'users',\r\n 'agent-groups': 'agentGroups',\r\n profiles: 'profiles',\r\n lobs: 'lobs',\r\n campaigns: 'campaigns',\r\n engagements: 'engagements',\r\n 'predefined-content': 'predefinedContent',\r\n 'automatic-messages': 'automaticMessages',\r\n 'working-hours': 'workingHours',\r\n 'special-occasions': 'specialOccasions',\r\n };\r\n\r\n return scopeMap[firstSegment] || firstSegment;\r\n }\r\n\r\n /**\r\n * Make HTTP request to LP API\r\n */\r\n private async request<T>(\r\n method: HTTPMethod,\r\n path: string,\r\n options?: RequestOptions\r\n ): Promise<APIResponse<T>> {\r\n // Determine scope and config\r\n const scope = this.getScopeFromPath(path);\r\n const scopeConfig = SCOPE_CONFIG[scope];\r\n\r\n if (!scopeConfig) {\r\n throw new LPExtendSDKError(\r\n `Unknown scope: ${scope}. Path: ${path}`,\r\n ErrorCodes.SCOPE_DENIED\r\n );\r\n }\r\n\r\n // Determine if this is a write operation\r\n const isWrite = method !== 'GET';\r\n\r\n // Build the URL - strip the scope prefix from path since it's in pathPrefix\r\n const pathWithoutScope = this.stripScopeFromPath(path, scope);\r\n const url = await this.buildUrl(pathWithoutScope, scopeConfig, isWrite);\r\n\r\n // Add query params\r\n let fullUrl = url;\r\n if (options?.params) {\r\n const searchParams = new URLSearchParams();\r\n Object.entries(options.params).forEach(([key, value]) => {\r\n if (value !== undefined) {\r\n searchParams.set(key, String(value));\r\n }\r\n });\r\n const paramString = searchParams.toString();\r\n if (paramString) {\r\n fullUrl += (fullUrl.includes('?') ? '&' : '?') + paramString;\r\n }\r\n }\r\n\r\n // Build headers\r\n const authMode = options?.authMode || scopeConfig.authType || 'bearer';\r\n const authHeader =\r\n authMode === 'cc-bearer'\r\n ? `CC-Bearer ${this.accessToken}`\r\n : `Bearer ${this.accessToken}`;\r\n\r\n const headers: Record<string, string> = {\r\n 'Content-Type': 'application/json',\r\n Accept: 'application/json',\r\n Authorization: authHeader,\r\n ...options?.headers,\r\n };\r\n\r\n // Add If-Match header for optimistic locking\r\n if (options?.revision) {\r\n headers['If-Match'] = options.revision;\r\n }\r\n\r\n this.log(`${method} ${fullUrl}`, { scope, authMode });\r\n\r\n // Make request with timeout\r\n const timeout = options?.timeout || this.defaultTimeout;\r\n const controller = new AbortController();\r\n const timeoutId = setTimeout(() => controller.abort(), timeout);\r\n\r\n try {\r\n const response = await fetch(fullUrl, {\r\n method,\r\n headers,\r\n body: options?.body ? JSON.stringify(options.body) : undefined,\r\n signal: controller.signal,\r\n });\r\n\r\n clearTimeout(timeoutId);\r\n\r\n // Handle errors\r\n if (!response.ok) {\r\n await this.handleError(response);\r\n }\r\n\r\n // Handle empty responses (204 No Content, etc.)\r\n const contentType = response.headers.get('content-type');\r\n const hasJsonBody = contentType?.includes('application/json');\r\n\r\n let responseData: T | undefined;\r\n\r\n if (hasJsonBody && response.status !== 204) {\r\n responseData = await response.json();\r\n }\r\n\r\n // Get revision from response headers\r\n const revision =\r\n response.headers.get('ac-revision') ||\r\n response.headers.get('etag') ||\r\n response.headers.get('x-revision') ||\r\n undefined;\r\n\r\n return {\r\n data: responseData as T,\r\n revision: revision || undefined,\r\n };\r\n } catch (error) {\r\n clearTimeout(timeoutId);\r\n\r\n if ((error as Error).name === 'AbortError') {\r\n throw new LPExtendSDKError('Request timeout', ErrorCodes.TIMEOUT);\r\n }\r\n\r\n if (error instanceof LPExtendSDKError) {\r\n throw error;\r\n }\r\n\r\n throw new LPExtendSDKError((error as Error).message, ErrorCodes.API_ERROR);\r\n }\r\n }\r\n\r\n /**\r\n * Strip the scope prefix from the path\r\n */\r\n private stripScopeFromPath(path: string, scope: string): string {\r\n const normalizedPath = path.startsWith('/') ? path.substring(1) : path;\r\n\r\n // Map scope to path prefixes to strip\r\n const prefixMap: Record<string, string[]> = {\r\n skills: ['skills'],\r\n users: ['users'],\r\n agentGroups: ['agent-groups'],\r\n profiles: ['profiles'],\r\n lobs: ['lobs'],\r\n campaigns: ['campaigns'],\r\n engagements: ['engagements'],\r\n predefinedContent: ['predefined-content'],\r\n automaticMessages: ['automatic-messages'],\r\n workingHours: ['working-hours'],\r\n specialOccasions: ['special-occasions'],\r\n aiStudio: ['ai-studio'],\r\n messagingHistory: ['messaging/history'],\r\n agentMetrics: ['messaging/agent-metrics'],\r\n agentActivity: ['messaging/agent-activity'],\r\n messagingOperations: ['messaging/operations'],\r\n connectToMessaging: ['messaging/connect'],\r\n outboundReporting: ['messaging/outbound'],\r\n prompts: ['prompts'],\r\n };\r\n\r\n const prefixes = prefixMap[scope] || [];\r\n for (const prefix of prefixes) {\r\n if (normalizedPath.startsWith(prefix)) {\r\n const remaining = normalizedPath.substring(prefix.length);\r\n return remaining.startsWith('/') ? remaining : `/${remaining}`;\r\n }\r\n }\r\n\r\n return path;\r\n }\r\n\r\n /**\r\n * Handle HTTP error responses\r\n */\r\n private async handleError(response: Response): Promise<never> {\r\n const errorBody = await response.json().catch(() => ({ message: 'Unknown error' }));\r\n\r\n switch (response.status) {\r\n case 401:\r\n throw new LPExtendSDKError(\r\n 'Authentication failed',\r\n ErrorCodes.UNAUTHORIZED,\r\n response.status,\r\n errorBody\r\n );\r\n\r\n case 403:\r\n throw new LPExtendSDKError(\r\n errorBody.message || 'Access denied',\r\n ErrorCodes.SCOPE_DENIED,\r\n response.status,\r\n errorBody\r\n );\r\n\r\n case 404:\r\n throw new LPExtendSDKError(\r\n errorBody.message || 'Resource not found',\r\n ErrorCodes.NOT_FOUND,\r\n response.status,\r\n errorBody\r\n );\r\n\r\n case 409:\r\n throw new LPExtendSDKError(\r\n errorBody.message || 'Revision conflict - resource was modified',\r\n ErrorCodes.REVISION_CONFLICT,\r\n response.status,\r\n errorBody\r\n );\r\n\r\n case 429:\r\n throw new LPExtendSDKError(\r\n errorBody.message || 'Rate limit exceeded',\r\n ErrorCodes.RATE_LIMITED,\r\n response.status,\r\n errorBody\r\n );\r\n\r\n default:\r\n throw new LPExtendSDKError(\r\n `API Error: ${response.status} - ${errorBody.message || response.statusText}`,\r\n ErrorCodes.API_ERROR,\r\n response.status,\r\n errorBody\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Debug logging\r\n */\r\n private log(...args: unknown[]): void {\r\n if (this.debug) {\r\n console.log('[LP-Extend-SDK]', ...args);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Scoped HTTP client with preset defaults\r\n * Used for API modules that need specific auth modes\r\n */\r\nexport class ScopedHTTPClient {\r\n constructor(\r\n private readonly client: HTTPClient,\r\n private readonly defaults: Partial<RequestOptions>\r\n ) {}\r\n\r\n async get<T>(path: string, options?: RequestOptions): Promise<APIResponse<T>> {\r\n return this.client.get<T>(path, this.mergeOptions(options));\r\n }\r\n\r\n async post<T>(path: string, body?: unknown, options?: RequestOptions): Promise<APIResponse<T>> {\r\n return this.client.post<T>(path, body, this.mergeOptions(options));\r\n }\r\n\r\n async put<T>(path: string, body?: unknown, options?: RequestOptions): Promise<APIResponse<T>> {\r\n return this.client.put<T>(path, body, this.mergeOptions(options));\r\n }\r\n\r\n async delete<T>(path: string, options?: RequestOptions): Promise<APIResponse<T>> {\r\n return this.client.delete<T>(path, this.mergeOptions(options));\r\n }\r\n\r\n async patch<T>(path: string, body?: unknown, options?: RequestOptions): Promise<APIResponse<T>> {\r\n return this.client.patch<T>(path, body, this.mergeOptions(options));\r\n }\r\n\r\n private mergeOptions(options?: RequestOptions): RequestOptions {\r\n return {\r\n ...this.defaults,\r\n ...options,\r\n headers: {\r\n ...this.defaults.headers,\r\n ...options?.headers,\r\n },\r\n };\r\n }\r\n}\r\n","/**\r\n * Account Configuration API Module\r\n *\r\n * Provides access to LivePerson Account Configuration APIs.\r\n * These include Skills, Users, Agent Groups, Profiles, LOBs, Campaigns, etc.\r\n * Uses standard Bearer authentication.\r\n */\r\n\r\nimport type { HTTPClient } from '../http';\r\nimport type { APIResponse } from '../types';\r\nimport type {\r\n // Skills\r\n LPSkill,\r\n CreateSkillRequest,\r\n UpdateSkillRequest,\r\n // Users\r\n LPUser,\r\n CreateUserRequest,\r\n UpdateUserRequest,\r\n // Agent Groups\r\n LPAgentGroup,\r\n CreateAgentGroupRequest,\r\n UpdateAgentGroupRequest,\r\n // Profiles\r\n LPProfile,\r\n CreateProfileRequest,\r\n UpdateProfileRequest,\r\n // LOBs\r\n LPLOB,\r\n CreateLOBRequest,\r\n UpdateLOBRequest,\r\n // Campaigns\r\n LPCampaign,\r\n CreateCampaignRequest,\r\n UpdateCampaignRequest,\r\n // Engagements\r\n LPEngagement,\r\n CreateEngagementRequest,\r\n UpdateEngagementRequest,\r\n // Predefined Content\r\n LPPredefinedContent,\r\n CreatePredefinedContentRequest,\r\n UpdatePredefinedContentRequest,\r\n // Automatic Messages\r\n LPAutomaticMessage,\r\n CreateAutomaticMessageRequest,\r\n UpdateAutomaticMessageRequest,\r\n // Working Hours\r\n LPWorkingHours,\r\n CreateWorkingHoursRequest,\r\n UpdateWorkingHoursRequest,\r\n // Special Occasions\r\n LPSpecialOccasion,\r\n CreateSpecialOccasionRequest,\r\n UpdateSpecialOccasionRequest,\r\n} from '../types';\r\n\r\n/**\r\n * Skills API\r\n *\r\n * Manage LivePerson skills for routing conversations.\r\n */\r\nexport class SkillsAPI {\r\n constructor(private http: HTTPClient) {}\r\n\r\n /**\r\n * Get all skills\r\n */\r\n async getAll(): Promise<APIResponse<LPSkill[]>> {\r\n return this.http.get<LPSkill[]>('/skills');\r\n }\r\n\r\n /**\r\n * Get a skill by ID\r\n */\r\n async getById(skillId: number): Promise<APIResponse<LPSkill>> {\r\n return this.http.get<LPSkill>(`/skills/${skillId}`);\r\n }\r\n\r\n /**\r\n * Create a new skill\r\n */\r\n async create(skill: CreateSkillRequest): Promise<APIResponse<LPSkill>> {\r\n return this.http.post<LPSkill>('/skills', skill);\r\n }\r\n\r\n /**\r\n * Update a skill\r\n * @param skillId - The skill ID\r\n * @param skill - Updated skill data\r\n * @param revision - Optional revision for optimistic locking (auto-fetched if not provided)\r\n */\r\n async update(skillId: number, skill: UpdateSkillRequest, revision?: string): Promise<APIResponse<LPSkill>> {\r\n const rev = revision || (await this.getAll()).revision;\r\n return this.http.put<LPSkill>(`/skills/${skillId}`, skill, { revision: rev });\r\n }\r\n\r\n /**\r\n * Delete a skill\r\n * @param skillId - The skill ID\r\n * @param revision - Optional revision for optimistic locking (auto-fetched if not provided)\r\n */\r\n async delete(skillId: number, revision?: string): Promise<APIResponse<void>> {\r\n const rev = revision || (await this.getAll()).revision;\r\n return this.http.delete<void>(`/skills/${skillId}`, { revision: rev });\r\n }\r\n}\r\n\r\n/**\r\n * Users API\r\n *\r\n * Manage LivePerson users and agents.\r\n */\r\nexport class UsersAPI {\r\n constructor(private http: HTTPClient) {}\r\n\r\n /**\r\n * Get all users\r\n */\r\n async getAll(): Promise<APIResponse<LPUser[]>> {\r\n return this.http.get<LPUser[]>('/users');\r\n }\r\n\r\n /**\r\n * Get a user by ID\r\n */\r\n async getById(userId: string): Promise<APIResponse<LPUser>> {\r\n return this.http.get<LPUser>(`/users/${userId}`);\r\n }\r\n\r\n /**\r\n * Create a new user\r\n */\r\n async create(user: CreateUserRequest): Promise<APIResponse<LPUser>> {\r\n return this.http.post<LPUser>('/users', user);\r\n }\r\n\r\n /**\r\n * Update a user\r\n * @param userId - The user ID\r\n * @param user - Updated user data\r\n * @param revision - Optional revision for optimistic locking (auto-fetched if not provided)\r\n */\r\n async update(userId: string, user: UpdateUserRequest, revision?: string): Promise<APIResponse<LPUser>> {\r\n const rev = revision || (await this.getAll()).revision;\r\n return this.http.put<LPUser>(`/users/${userId}`, user, { revision: rev });\r\n }\r\n\r\n /**\r\n * Delete a user\r\n * @param userId - The user ID\r\n * @param revision - Optional revision for optimistic locking (auto-fetched if not provided)\r\n */\r\n async delete(userId: string, revision?: string): Promise<APIResponse<void>> {\r\n const rev = revision || (await this.getAll()).revision;\r\n return this.http.delete<void>(`/users/${userId}`, { revision: rev });\r\n }\r\n\r\n /**\r\n * Get the current authenticated user\r\n */\r\n async getSelf(): Promise<APIResponse<LPUser>> {\r\n return this.http.get<LPUser>('/users/self');\r\n }\r\n}\r\n\r\n/**\r\n * Agent Groups API\r\n */\r\nexport class AgentGroupsAPI {\r\n constructor(private http: HTTPClient) {}\r\n\r\n /**\r\n * Get all agent groups\r\n */\r\n async getAll(): Promise<APIResponse<LPAgentGroup[]>> {\r\n return this.http.get<LPAgentGroup[]>('/agent-groups');\r\n }\r\n\r\n /**\r\n * Get an agent group by ID\r\n */\r\n async getById(groupId: number): Promise<APIResponse<LPAgentGroup>> {\r\n return this.http.get<LPAgentGroup>(`/agent-groups/${groupId}`);\r\n }\r\n\r\n /**\r\n * Create a new agent group\r\n */\r\n async create(group: CreateAgentGroupRequest): Promise<APIResponse<LPAgentGroup>> {\r\n return this.http.post<LPAgentGroup>('/agent-groups', group);\r\n }\r\n\r\n /**\r\n * Update an agent group\r\n * @param revision - Optional revision for optimistic locking (auto-fetched if not provided)\r\n */\r\n async update(groupId: number, group: UpdateAgentGroupRequest, revision?: string): Promise<APIResponse<LPAgentGroup>> {\r\n const rev = revision || (await this.getAll()).revision;\r\n return this.http.put<LPAgentGroup>(`/agent-groups/${groupId}`, group, { revision: rev });\r\n }\r\n\r\n /**\r\n * Delete an agent group\r\n * @param revision - Optional revision for optimistic locking (auto-fetched if not provided)\r\n */\r\n async delete(groupId: number, revision?: string): Promise<APIResponse<void>> {\r\n const rev = revision || (await this.getAll()).revision;\r\n return this.http.delete<void>(`/agent-groups/${groupId}`, { revision: rev });\r\n }\r\n}\r\n\r\n/**\r\n * Profiles API\r\n */\r\nexport class ProfilesAPI {\r\n constructor(private http: HTTPClient) {}\r\n\r\n /**\r\n * Get all profiles\r\n */\r\n async getAll(): Promise<APIResponse<LPProfile[]>> {\r\n return this.http.get<LPProfile[]>('/profiles');\r\n }\r\n\r\n /**\r\n * Get a profile by ID\r\n */\r\n async getById(profileId: number): Promise<APIResponse<LPProfile>> {\r\n return this.http.get<LPProfile>(`/profiles/${profileId}`);\r\n }\r\n\r\n /**\r\n * Create a new profile\r\n */\r\n async create(profile: CreateProfileRequest): Promise<APIResponse<LPProfile>> {\r\n return this.http.post<LPProfile>('/profiles', profile);\r\n }\r\n\r\n /**\r\n * Update a profile\r\n * @param revision - Optional revision for optimistic locking (auto-fetched if not provided)\r\n */\r\n async update(profileId: number, profile: UpdateProfileRequest, revision?: string): Promise<APIResponse<LPProfile>> {\r\n const rev = revision || (await this.getAll()).revision;\r\n return this.http.put<LPProfile>(`/profiles/${profileId}`, profile, { revision: rev });\r\n }\r\n\r\n /**\r\n * Delete a profile\r\n * @param revision - Optional revision for optimistic locking (auto-fetched if not provided)\r\n */\r\n async delete(profileId: number, revision?: string): Promise<APIResponse<void>> {\r\n const rev = revision || (await this.getAll()).revision;\r\n return this.http.delete<void>(`/profiles/${profileId}`, { revision: rev });\r\n }\r\n}\r\n\r\n/**\r\n * LOBs (Lines of Business) API\r\n */\r\nexport class LOBsAPI {\r\n constructor(private http: HTTPClient) {}\r\n\r\n /**\r\n * Get all LOBs\r\n */\r\n async getAll(): Promise<APIResponse<LPLOB[]>> {\r\n return this.http.get<LPLOB[]>('/lobs');\r\n }\r\n\r\n /**\r\n * Get a LOB by ID\r\n */\r\n async getById(lobId: number): Promise<APIResponse<LPLOB>> {\r\n return this.http.get<LPLOB>(`/lobs/${lobId}`);\r\n }\r\n\r\n /**\r\n * Create a new LOB\r\n */\r\n async create(lob: CreateLOBRequest): Promise<APIResponse<LPLOB>> {\r\n return this.http.post<LPLOB>('/lobs', lob);\r\n }\r\n\r\n /**\r\n * Update a LOB\r\n * @param revision - Optional revision for optimistic locking (auto-fetched if not provided)\r\n */\r\n async update(lobId: number, lob: UpdateLOBRequest, revision?: string): Promise<APIResponse<LPLOB>> {\r\n const rev = revision || (await this.getAll()).revision;\r\n return this.http.put<LPLOB>(`/lobs/${lobId}`, lob, { revision: rev });\r\n }\r\n\r\n /**\r\n * Delete a LOB\r\n * @param revision - Optional revision for optimistic locking (auto-fetched if not provided)\r\n */\r\n async delete(lobId: number, revision?: string): Promise<APIResponse<void>> {\r\n const rev = revision || (await this.getAll()).revision;\r\n return this.http.delete<void>(`/lobs/${lobId}`, { revision: rev });\r\n }\r\n}\r\n\r\n/**\r\n * Campaigns API\r\n */\r\nexport class CampaignsAPI {\r\n constructor(private http: HTTPClient) {}\r\n\r\n /**\r\n * Get all campaigns\r\n */\r\n async getAll(): Promise<APIResponse<LPCampaign[]>> {\r\n return this.http.get<LPCampaign[]>('/campaigns');\r\n }\r\n\r\n /**\r\n * Get a campaign by ID\r\n */\r\n async getById(campaignId: number): Promise<APIResponse<LPCampaign>> {\r\n return this.http.get<LPCampaign>(`/campaigns/${campaignId}`);\r\n }\r\n\r\n /**\r\n * Create a new campaign\r\n */\r\n async create(campaign: CreateCampaignRequest): Promise<APIResponse<LPCampaign>> {\r\n return this.http.post<LPCampaign>('/campaigns', campaign);\r\n }\r\n\r\n /**\r\n * Update a campaign\r\n * @param revision - Optional revision for optimistic locking (auto-fetched if not provided)\r\n */\r\n async update(campaignId: number, campaign: UpdateCampaignRequest, revision?: string): Promise<APIResponse<LPCampaign>> {\r\n const rev = revision || (await this.getAll()).revision;\r\n return this.http.put<LPCampaign>(`/campaigns/${campaignId}`, campaign, { revision: rev });\r\n }\r\n\r\n /**\r\n * Delete a campaign\r\n * @param revision - Optional revision for optimistic locking (auto-fetched if not provided)\r\n */\r\n async delete(campaignId: number, revision?: string): Promise<APIResponse<void>> {\r\n const rev = revision || (await this.getAll()).revision;\r\n return this.http.delete<void>(`/campaigns/${campaignId}`, { revision: rev });\r\n }\r\n}\r\n\r\n/**\r\n * Engagements API\r\n */\r\nexport class EngagementsAPI {\r\n constructor(private http: HTTPClient) {}\r\n\r\n /**\r\n * Get all engagements for a campaign\r\n */\r\n async getByCampaign(campaignId: number): Promise<APIResponse<LPEngagement[]>> {\r\n return this.http.get<LPEngagement[]>(`/campaigns/${campaignId}/engagements`);\r\n }\r\n\r\n /**\r\n * Get an engagement by ID\r\n */\r\n async getById(campaignId: number, engagementId: number): Promise<APIResponse<LPEngagement>> {\r\n return this.http.get<LPEngagement>(`/campaigns/${campaignId}/engagements/${engagementId}`);\r\n }\r\n\r\n /**\r\n * Create a new engagement\r\n */\r\n async create(engagement: CreateEngagementRequest): Promise<APIResponse<LPEngagement>> {\r\n return this.http.post<LPEngagement>(`/campaigns/${engagement.campaignId}/engagements`, engagement);\r\n }\r\n\r\n /**\r\n * Update an engagement\r\n * @param revision - Optional revision for optimistic locking (auto-fetched if not provided)\r\n */\r\n async update(\r\n campaignId: number,\r\n engagementId: number,\r\n engagement: UpdateEngagementRequest,\r\n revision?: string\r\n ): Promise<APIResponse<LPEngagement>> {\r\n const rev = revision || (await this.getByCampaign(campaignId)).revision;\r\n return this.http.put<LPEngagement>(`/campaigns/${campaignId}/engagements/${engagementId}`, engagement, { revision: rev });\r\n }\r\n\r\n /**\r\n * Delete an engagement\r\n * @param revision - Optional revision for optimistic locking (auto-fetched if not provided)\r\n */\r\n async delete(campaignId: number, engagementId: number, revision?: string): Promise<APIResponse<void>> {\r\n const rev = revision || (await this.getByCampaign(campaignId)).revision;\r\n return this.http.delete<void>(`/campaigns/${campaignId}/engagements/${engagementId}`, { revision: rev });\r\n }\r\n}\r\n\r\n/**\r\n * Predefined Content (Canned Responses) API\r\n */\r\nexport class PredefinedContentAPI {\r\n constructor(private http: HTTPClient) {}\r\n\r\n /**\r\n * Get all predefined content\r\n */\r\n async getAll(): Promise<APIResponse<LPPredefinedContent[]>> {\r\n return this.http.get<LPPredefinedContent[]>('/predefined-content');\r\n }\r\n\r\n /**\r\n * Get predefined content by ID\r\n */\r\n async getById(contentId: number): Promise<APIResponse<LPPredefinedContent>> {\r\n return this.http.get<LPPredefinedContent>(`/predefined-content/${contentId}`);\r\n }\r\n\r\n /**\r\n * Create new predefined content\r\n */\r\n async create(content: CreatePredefinedContentRequest): Promise<APIResponse<LPPredefinedContent>> {\r\n return this.http.post<LPPredefinedContent>('/predefined-content', content);\r\n }\r\n\r\n /**\r\n * Update predefined content\r\n * @param revision - Optional revision for optimistic locking (auto-fetched if not provided)\r\n */\r\n async update(contentId: number, content: UpdatePredefinedContentRequest, revision?: string): Promise<APIResponse<LPPredefinedContent>> {\r\n const rev = revision || (await this.getAll()).revision;\r\n return this.http.put<LPPredefinedContent>(`/predefined-content/${contentId}`, content, { revision: rev });\r\n }\r\n\r\n /**\r\n * Delete predefined content\r\n * @param revision - Optional revision for optimistic locking (auto-fetched if not provided)\r\n */\r\n async delete(contentId: number, revision?: string): Promise<APIResponse<void>> {\r\n const rev = revision || (await this.getAll()).revision;\r\n return this.http.delete<void>(`/predefined-content/${contentId}`, { revision: rev });\r\n }\r\n}\r\n\r\n/**\r\n * Automatic Messages API\r\n */\r\nexport class AutomaticMessagesAPI {\r\n constructor(private http: HTTPClient) {}\r\n\r\n /**\r\n * Get all automatic messages\r\n */\r\n async getAll(): Promise<APIResponse<LPAutomaticMessage[]>> {\r\n return this.http.get<LPAutomaticMessage[]>('/automatic-messages');\r\n }\r\n\r\n /**\r\n * Get an automatic message by ID\r\n */\r\n async getById(messageId: number): Promise<APIResponse<LPAutomaticMessage>> {\r\n return this.http.get<LPAutomaticMessage>(`/automatic-messages/${messageId}`);\r\n }\r\n\r\n /**\r\n * Create a new automatic message\r\n */\r\n async create(message: CreateAutomaticMessageRequest): Promise<APIResponse<LPAutomaticMessage>> {\r\n return this.http.post<LPAutomaticMessage>('/automatic-messages', message);\r\n }\r\n\r\n /**\r\n * Update an automatic message\r\n * @param revision - Optional revision for optimistic locking (auto-fetched if not provided)\r\n */\r\n async update(messageId: number, message: UpdateAutomaticMessageRequest, revision?: string): Promise<APIResponse<LPAutomaticMessage>> {\r\n const rev = revision || (await this.getAll()).revision;\r\n return this.http.put<LPAutomaticMessage>(`/automatic-messages/${messageId}`, message, { revision: rev });\r\n }\r\n\r\n /**\r\n * Delete an automatic message\r\n * @param revision - Optional revision for optimistic locking (auto-fetched if not provided)\r\n */\r\n async delete(messageId: number, revision?: string): Promise<APIResponse<void>> {\r\n const rev = revision || (await this.getAll()).revision;\r\n return this.http.delete<void>(`/automatic-messages/${messageId}`, { revision: rev });\r\n }\r\n}\r\n\r\n/**\r\n * Working Hours API\r\n */\r\nexport class WorkingHoursAPI {\r\n constructor(private http: HTTPClient) {}\r\n\r\n /**\r\n * Get all working hours schedules\r\n */\r\n async getAll(): Promise<APIResponse<LPWorkingHours[]>> {\r\n return this.http.get<LPWorkingHours[]>('/working-hours');\r\n }\r\n\r\n /**\r\n * Get working hours by ID\r\n */\r\n async getById(scheduleId: number): Promise<APIResponse<LPWorkingHours>> {\r\n return this.http.get<LPWorkingHours>(`/working-hours/${scheduleId}`);\r\n }\r\n\r\n /**\r\n * Create new working hours schedule\r\n */\r\n async create(schedule: CreateWorkingHoursRequest): Promise<APIResponse<LPWorkingHours>> {\r\n return this.http.post<LPWorkingHours>('/working-hours', schedule);\r\n }\r\n\r\n /**\r\n * Update working hours schedule\r\n * @param revision - Optional revision for optimistic locking (auto-fetched if not provided)\r\n */\r\n async update(scheduleId: number, schedule: UpdateWorkingHoursRequest, revision?: string): Promise<APIResponse<LPWorkingHours>> {\r\n const rev = revision || (await this.getAll()).revision;\r\n return this.http.put<LPWorkingHours>(`/working-hours/${scheduleId}`, schedule, { revision: rev });\r\n }\r\n\r\n /**\r\n * Delete working hours schedule\r\n * @param revision - Optional revision for optimistic locking (auto-fetched if not provided)\r\n */\r\n async delete(scheduleId: number, revision?: string): Promise<APIResponse<void>> {\r\n const rev = revision || (await this.getAll()).revision;\r\n return this.http.delete<void>(`/working-hours/${scheduleId}`, { revision: rev });\r\n }\r\n}\r\n\r\n/**\r\n * Special Occasions API\r\n */\r\nexport class SpecialOccasionsAPI {\r\n constructor(private http: HTTPClient) {}\r\n\r\n /**\r\n * Get all special occasions\r\n */\r\n async getAll(): Promise<APIResponse<LPSpecialOccasion[]>> {\r\n return this.http.get<LPSpecialOccasion[]>('/special-occasions');\r\n }\r\n\r\n /**\r\n * Get a special occasion by ID\r\n */\r\n async getById(occasionId: number): Promise<APIResponse<LPSpecialOccasion>> {\r\n return this.http.get<LPSpecialOccasion>(`/special-occasions/${occasionId}`);\r\n }\r\n\r\n /**\r\n * Create a new special occasion\r\n */\r\n async create(occasion: CreateSpecialOccasionRequest): Promise<APIResponse<LPSpecialOccasion>> {\r\n return this.http.post<LPSpecialOccasion>('/special-occasions', occasion);\r\n }\r\n\r\n /**\r\n * Update a special occasion\r\n * @param revision - Optional revision for optimistic locking (auto-fetched if not provided)\r\n */\r\n async update(occasionId: number, occasion: UpdateSpecialOccasionRequest, revision?: string): Promise<APIResponse<LPSpecialOccasion>> {\r\n const rev = revision || (await this.getAll()).revision;\r\n return this.http.put<LPSpecialOccasion>(`/special-occasions/${occasionId}`, occasion, { revision: rev });\r\n }\r\n\r\n /**\r\n * Delete a special occasion\r\n * @param revision - Optional revision for optimistic locking (auto-fetched if not provided)\r\n */\r\n async delete(occasionId: number, revision?: string): Promise<APIResponse<void>> {\r\n const rev = revision || (await this.getAll()).revision;\r\n return this.http.delete<void>(`/special-occasions/${occasionId}`, { revision: rev });\r\n }\r\n}\r\n","/**\r\n * AI Studio API Module\r\n *\r\n * Provides access to LivePerson AI Studio APIs.\r\n * Uses CC-Bearer authentication mode.\r\n */\r\n\r\nimport type { HTTPClient, ScopedHTTPClient } from '../http';\r\nimport type { APIResponse } from '../types';\r\nimport type {\r\n // Categories\r\n AIStudioCategory,\r\n CreateCategoryRequest,\r\n UpdateCategoryRequest,\r\n // Conversations\r\n AIStudioConversation,\r\n AICreateConversationRequest as CreateConversationRequest,\r\n AIUpdateConversationRequest as UpdateConversationRequest,\r\n ConversationQueryParams,\r\n UpdateConversationAttributesRequest,\r\n // Summary\r\n SummaryRequest,\r\n BatchSummaryRequest,\r\n AIStudioSummary,\r\n // Query\r\n QueryGenerateRequest,\r\n QueryGenerateResponse,\r\n // Simulations\r\n AIStudioSimulation,\r\n CreateSimulationRequest,\r\n UpdateSimulationRequest,\r\n SimulationQueryParams,\r\n SimulationJobResult,\r\n // Transcript Analysis\r\n TranscriptAnalysis,\r\n CreateTranscriptAnalysisRequest,\r\n UpdateTranscriptAnalysisRequest,\r\n // Knowledgebases\r\n Knowledgebase,\r\n KnowledgebaseHealth,\r\n KnowledgebaseSearchRequest,\r\n KnowledgebaseSearchResult,\r\n KnowledgebaseItem,\r\n KnowledgebaseTextItem,\r\n // Evaluators\r\n SimilarityEvaluationRequest,\r\n SimilarityEvaluationResponse,\r\n ResolutionEvaluationRequest,\r\n ResolutionEvaluationResponse,\r\n GuidedRoutingEvaluationRequest,\r\n GuidedRoutingEvaluationResponse,\r\n // Generators\r\n QuestionGeneratorRequest,\r\n QuestionGeneratorResponse,\r\n KAIRouteGeneratorRequest,\r\n KAIRouteGeneratorResponse,\r\n KAIRouteGenerationStatus,\r\n // Prompt Library\r\n Prompt,\r\n CreatePromptRequest,\r\n UpdatePromptRequest,\r\n LLMProvider,\r\n // Users\r\n AIStudioUser,\r\n CreateAIStudioUserRequest,\r\n UpdateAIStudioUserRequest,\r\n UpdateAIStudioUserModelsRequest,\r\n // Flows\r\n AIStudioFlow,\r\n InvokeFlowRequest,\r\n InvokeFlowResponse,\r\n} from '../types';\r\n\r\n/**\r\n * AI Studio Categories API\r\n */\r\nexport class CategoriesAPI {\r\n constructor(private http: ScopedHTTPClient) {}\r\n\r\n async getAll(): Promise<APIResponse<AIStudioCategory[]>> {\r\n return this.http.get<AIStudioCategory[]>('/ai-studio/categories');\r\n }\r\n\r\n async create(data: CreateCategoryRequest): Promise<APIResponse<AIStudioCategory>> {\r\n return this.http.post<AIStudioCategory>('/ai-studio/categories', data);\r\n }\r\n\r\n async update(categoryId: string, data: UpdateCategoryRequest): Promise<APIResponse<AIStudioCategory>> {\r\n return this.http.put<AIStudioCategory>(`/ai-studio/categories/${categoryId}`, data);\r\n }\r\n\r\n async delete(categoryId: string): Promise<APIResponse<void>> {\r\n return this.http.delete<void>(`/ai-studio/categories/${categoryId}`);\r\n }\r\n}\r\n\r\n/**\r\n * AI Studio Conversations API\r\n */\r\nexport class ConversationsAPI {\r\n constructor(private http: ScopedHTTPClient) {}\r\n\r\n async getAll(params?: ConversationQueryParams): Promise<APIResponse<AIStudioConversation[]>> {\r\n return this.http.get<AIStudioConversation[]>('/ai-studio/conversations', { params: params as Record<string, string | number | boolean | undefined> });\r\n }\r\n\r\n async getById(convId: string): Promise<APIResponse<AIStudioConversation>> {\r\n return this.http.get<AIStudioConversation>(`/ai-studio/conversations/${convId}`);\r\n }\r\n\r\n async create(data: CreateConversationRequest): Promise<APIResponse<AIStudioConversation>> {\r\n return this.http.post<AIStudioConversation>('/ai-studio/conversations', data);\r\n }\r\n\r\n async update(convId: string, data: UpdateConversationRequest): Promise<APIResponse<AIStudioConversation>> {\r\n return this.http.put<AIStudioConversation>(`/ai-studio/conversations/${convId}`, data);\r\n }\r\n\r\n async delete(convId: string): Promise<APIResponse<void>> {\r\n return this.http.delete<void>(`/ai-studio/conversations/${convId}`);\r\n }\r\n\r\n async updateAttributes(convId: string, data: UpdateConversationAttributesRequest): Promise<APIResponse<AIStudioConversation>> {\r\n return this.http.put<AIStudioConversation>(`/ai-studio/conversations/${convId}/attributes`, data);\r\n }\r\n\r\n async close(convId: string): Promise<APIResponse<void>> {\r\n return this.http.patch<void>(`/ai-studio/conversations/${convId}/close`);\r\n }\r\n\r\n async export(params?: ConversationQueryParams): Promise<APIResponse<AIStudioConversation[]>> {\r\n return this.http.get<AIStudioConversation[]>('/ai-studio/conversations/export', { params: params as Record<string, string | number | boolean | undefined> });\r\n }\r\n\r\n async upload(conversations: AIStudioConversation[]): Promise<APIResponse<AIStudioConversation[]>> {\r\n return this.http.post<AIStudioConversation[]>('/ai-studio/conversations/upload', { conversations });\r\n }\r\n}\r\n\r\n/**\r\n * AI Studio Summary API\r\n */\r\nexport class SummaryAPI {\r\n constructor(private http: ScopedHTTPClient) {}\r\n\r\n async create(data: SummaryRequest): Promise<APIResponse<AIStudioSummary>> {\r\n return this.http.post<AIStudioSummary>('/ai-studio/summary', data);\r\n }\r\n\r\n async createBatch(data: BatchSummaryRequest): Promise<APIResponse<AIStudioSummary>> {\r\n return this.http.post<AIStudioSummary>('/ai-studio/summary/batch', data);\r\n }\r\n\r\n async getBatch(offset?: number, limit?: number): Promise<APIResponse<AIStudioSummary[]>> {\r\n return this.http.get<AIStudioSummary[]>('/ai-studio/summary/batch', { params: { offset, limit } });\r\n }\r\n\r\n async getBatchById(summaryId: string): Promise<APIResponse<AIStudioSummary>> {\r\n return this.http.get<AIStudioSummary>(`/ai-studio/summary/batch/${summaryId}`);\r\n }\r\n\r\n async deleteBatch(summaryId: string): Promise<APIResponse<void>> {\r\n return this.http.delete<void>(`/ai-studio/summary/batch/${summaryId}`);\r\n }\r\n}\r\n\r\n/**\r\n * AI Studio Query API\r\n */\r\nexport class QueryAPI {\r\n constructor(private http: ScopedHTTPClient) {}\r\n\r\n async generate(data: QueryGenerateRequest): Promise<APIResponse<QueryGenerateResponse>> {\r\n return this.http.post<QueryGenerateResponse>('/ai-studio/query', data);\r\n }\r\n}\r\n\r\n/**\r\n * AI Studio Simulations API\r\n */\r\nexport class SimulationsAPI {\r\n constructor(private http: ScopedHTTPClient) {}\r\n\r\n async getAll(params?: SimulationQueryParams): Promise<APIResponse<AIStudioSimulation[]>> {\r\n return this.http.get<AIStudioSimulation[]>('/ai-studio/simulations', { params: params as Record<string, string | number | boolean | undefined> });\r\n }\r\n\r\n async getById(simulationId: string): Promise<APIResponse<AIStudioSimulation>> {\r\n return this.http.get<AIStudioSimulation>(`/ai-studio/simulations/${simulationId}`);\r\n }\r\n\r\n async create(data: CreateSimulationRequest): Promise<APIResponse<AIStudioSimulation>> {\r\n return this.http.post<AIStudioSimulation>('/ai-studio/simulations', data);\r\n }\r\n\r\n async update(simulationId: string, data: UpdateSimulationRequest): Promise<APIResponse<AIStudioSimulation>> {\r\n return this.http.put<AIStudioSimulation>(`/ai-studio/simulations/${simulationId}`, data);\r\n }\r\n\r\n async delete(simulationId: string): Promise<APIResponse<void>> {\r\n return this.http.delete<void>(`/ai-studio/simulations/${simulationId}`);\r\n }\r\n\r\n async getStatus(simulationId: string): Promise<APIResponse<AIStudioSimulation>> {\r\n return this.http.get<AIStudioSimulation>(`/ai-studio/simulations/${simulationId}/status`);\r\n }\r\n\r\n async getJobResults(simulationId: string, jobId: string): Promise<APIResponse<SimulationJobResult>> {\r\n return this.http.get<SimulationJobResult>(`/ai-studio/simulations/${simulationId}/jobs/${jobId}`);\r\n }\r\n\r\n async cancel(simulationId: string): Promise<APIResponse<void>> {\r\n return this.http.post<void>(`/ai-studio/simulations/${simulationId}/cancel`);\r\n }\r\n}\r\n\r\n/**\r\n * AI Studio Transcript Analysis API\r\n */\r\nexport class TranscriptAnalysisAPI {\r\n constructor(private http: ScopedHTTPClient) {}\r\n\r\n async getAll(owner?: string, limit?: number, startAfterId?: string): Promise<APIResponse<TranscriptAnalysis[]>> {\r\n return this.http.get<TranscriptAnalysis[]>('/ai-studio/transcript-analysis', {\r\n params: { owner, limit, start_after_id: startAfterId },\r\n });\r\n }\r\n\r\n async getById(\r\n analysisId: string,\r\n excludeConversations?: boolean,\r\n excludeQuestions?: boolean\r\n ): Promise<APIResponse<TranscriptAnalysis>> {\r\n return this.http.get<TranscriptAnalysis>(`/ai-studio/transcript-analysis/${analysisId}`, {\r\n params: { exclude_conversations: excludeConversations, exclude_questions: excludeQuestions },\r\n });\r\n }\r\n\r\n async create(data: CreateTranscriptAnalysisRequest): Promise<APIResponse<TranscriptAnalysis>> {\r\n return this.http.post<TranscriptAnalysis>('/ai-studio/transcript-analysis', data);\r\n }\r\n\r\n async update(analysisId: string, data: UpdateTranscriptAnalysisRequest): Promise<APIResponse<TranscriptAnalysis>> {\r\n return this.http.put<TranscriptAnalysis>(`/ai-studio/transcript-analysis/${analysisId}`, data);\r\n }\r\n\r\n async delete(analysisId: string): Promise<APIResponse<void>> {\r\n return this.http.delete<void>(`/ai-studio/transcript-analysis/${analysisId}`);\r\n }\r\n}\r\n\r\n/**\r\n * AI Studio Knowledgebases API\r\n */\r\nexport class KnowledgebasesAPI {\r\n constructor(private http: ScopedHTTPClient) {}\r\n\r\n async getAll(): Promise<APIResponse<Knowledgebase[]>> {\r\n return this.http.get<Knowledgebase[]>('/ai-studio/knowledgebases');\r\n }\r\n\r\n async getKai(): Promise<APIResponse<Knowledgebase[]>> {\r\n return this.http.get<Knowledgebase[]>('/ai-studio/knowledgebases/kai');\r\n }\r\n\r\n async getById(kbId: string): Promise<APIResponse<Knowledgebase>> {\r\n return this.http.get<Knowledgebase>(`/ai-studio/knowledgebases/${kbId}`);\r\n }\r\n\r\n async delete(kbId: string): Promise<APIResponse<void>> {\r\n return this.http.delete<void>(`/ai-studio/knowledgebases/${kbId}`);\r\n }\r\n\r\n async getHealth(kbId: string): Promise<APIResponse<KnowledgebaseHealth>> {\r\n return this.http.get<KnowledgebaseHealth>(`/ai-studio/knowledgebases/${kbId}/health`);\r\n }\r\n\r\n async refresh(kbId: string): Promise<APIResponse<Knowledgebase>> {\r\n return this.http.get<Knowledgebase>(`/ai-studio/knowledgebases/${kbId}/refresh`);\r\n }\r\n\r\n async search(kbId: string, data: KnowledgebaseSearchRequest): Promise<APIResponse<KnowledgebaseSearchResult[]>> {\r\n return this.http.post<KnowledgebaseSearchResult[]>(`/ai-studio/knowledgebases/${kbId}/search`, data);\r\n }\r\n\r\n async getItems(kbId: string): Promise<APIResponse<KnowledgebaseItem[]>> {\r\n return this.http.get<KnowledgebaseItem[]>(`/ai-studio/knowledgebases/${kbId}/items`);\r\n }\r\n\r\n async getItemsBySource(kbId: string, sourceId: string): Promise<APIResponse<KnowledgebaseItem[]>> {\r\n return this.http.get<KnowledgebaseItem[]>(`/ai-studio/knowledgebases/${kbId}/items/${sourceId}`);\r\n }\r\n\r\n async createItems(kbId: string, sourceId: string, items: KnowledgebaseTextItem[]): Promise<APIResponse<KnowledgebaseItem[]>> {\r\n return this.http.post<KnowledgebaseItem[]>(`/ai-studio/knowledgebases/${kbId}/items/${sourceId}`, items);\r\n }\r\n\r\n async updateItems(kbId: string, sourceId: string, items: KnowledgebaseTextItem[]): Promise<APIResponse<KnowledgebaseItem[]>> {\r\n return this.http.put<KnowledgebaseItem[]>(`/ai-studio/knowledgebases/${kbId}/items/${sourceId}`, items);\r\n }\r\n\r\n async deleteItems(kbId: string, sourceId: string, itemIds: string[]): Promise<APIResponse<string[]>> {\r\n return this.http.delete<string[]>(`/ai-studio/knowledgebases/${kbId}/items/${sourceId}`, { body: itemIds } as unknown as undefined);\r\n }\r\n}\r\n\r\n/**\r\n * AI Studio Evaluators API\r\n */\r\nexport class EvaluatorsAPI {\r\n constructor(private http: ScopedHTTPClient) {}\r\n\r\n async similarity(evaluationType: string, data: SimilarityEvaluationRequest): Promise<APIResponse<SimilarityEvaluationResponse>> {\r\n return this.http.post<SimilarityEvaluationResponse>('/ai-studio/evaluators/similarity', data, {\r\n params: { type: evaluationType },\r\n });\r\n }\r\n\r\n async resolution(data: ResolutionEvaluationRequest): Promise<APIResponse<ResolutionEvaluationResponse>> {\r\n return this.http.post<ResolutionEvaluationResponse>('/ai-studio/evaluators/resolution', data);\r\n }\r\n\r\n async guidedRouting(data: GuidedRoutingEvaluationRequest): Promise<APIResponse<GuidedRoutingEvaluationResponse>> {\r\n return this.http.post<GuidedRoutingEvaluationResponse>('/ai-studio/evaluators/guided-routing', data);\r\n }\r\n}\r\n\r\n/**\r\n * AI Studio Generators API\r\n */\r\nexport class GeneratorsAPI {\r\n constructor(private http: ScopedHTTPClient) {}\r\n\r\n async qaFromModel(modelId: string): Promise<APIResponse<QuestionGeneratorResponse>> {\r\n return this.http.get<QuestionGeneratorResponse>(`/ai-studio/generators/qa/model/${modelId}`);\r\n }\r\n\r\n async qaFromKnowledgebase(\r\n kbIds: string[],\r\n generateAnswers?: boolean,\r\n useRandomSections?: boolean\r\n ): Promise<APIResponse<QuestionGeneratorResponse>> {\r\n return this.http.get<QuestionGeneratorResponse>('/ai-studio/generators/qa/knowledgebase', {\r\n params: { kb_id: kbIds.join(','), generate_answers: generateAnswers, use_random_sections: useRandomSections },\r\n });\r\n }\r\n\r\n async qaFromConversationCloud(data: QuestionGeneratorRequest): Promise<APIResponse<QuestionGeneratorResponse>> {\r\n return this.http.post<QuestionGeneratorResponse>('/ai-studio/generators/qa/conversation-cloud', data);\r\n }\r\n\r\n async kaiRoutesLlm(data: KAIRouteGeneratorRequest): Promise<APIResponse<KAIRouteGeneratorResponse>> {\r\n return this.http.post<KAIRouteGeneratorResponse>('/ai-studio/generators/routes/kai-llm', data);\r\n }\r\n\r\n async kaiRoutes(data: KAIRouteGeneratorRequest): Promise<APIResponse<number>> {\r\n return this.http.post<number>('/ai-studio/generators/routes/kai', data);\r\n }\r\n\r\n async kaiRoutesStatus(flowId: string): Promise<APIResponse<KAIRouteGenerationStatus>> {\r\n return this.http.get<KAIRouteGenerationStatus>('/ai-studio/generators/routes/kai/status', {\r\n params: { flow_id: flowId },\r\n });\r\n }\r\n}\r\n\r\n/**\r\n * AI Studio Prompt Library API\r\n */\r\nexport class PromptLibraryAPI {\r\n constructor(private http: ScopedHTTPClient) {}\r\n\r\n async getAll(): Promise<APIResponse<Prompt[]>> {\r\n return this.http.get<Prompt[]>('/ai-studio/prompt-library');\r\n }\r\n\r\n async create(data: CreatePromptRequest): Promise<APIResponse<Prompt>> {\r\n return this.http.post<Prompt>('/ai-studio/prompt-library', data);\r\n }\r\n\r\n async update(promptId: string, data: UpdatePromptRequest): Promise<APIResponse<Prompt>> {\r\n return this.http.put<Prompt>(`/ai-studio/prompt-library/${promptId}`, data);\r\n }\r\n\r\n async getProviders(): Promise<APIResponse<LLMProvider[]>> {\r\n return this.http.get<LLMProvider[]>('/ai-studio/prompt-library/providers');\r\n }\r\n\r\n async getSystemPrompts(): Promise<APIResponse<Prompt[]>> {\r\n return this.http.get<Prompt[]>('/ai-studio/prompt-library/system');\r\n }\r\n}\r\n\r\n/**\r\n * AI Studio Users API\r\n */\r\nexport class AIStudioUsersAPI {\r\n constructor(private http: ScopedHTTPClient) {}\r\n\r\n async getSelf(): Promise<APIResponse<AIStudioUser>> {\r\n return this.http.get<AIStudioUser>('/ai-studio/users/self');\r\n }\r\n\r\n async getAll(): Promise<APIResponse<AIStudioUser[]>> {\r\n return this.http.get<AIStudioUser[]>('/ai-studio/users');\r\n }\r\n\r\n async getDetails(): Promise<APIResponse<AIStudioUser[]>> {\r\n return this.http.get<AIStudioUser[]>('/ai-studio/users/details');\r\n }\r\n\r\n async create(data: CreateAIStudioUserRequest): Promise<APIResponse<AIStudioUser>> {\r\n return this.http.post<AIStudioUser>('/ai-studio/users', data);\r\n }\r\n\r\n async update(userId: string, data: UpdateAIStudioUserRequest): Promise<APIResponse<AIStudioUser>> {\r\n return this.http.put<AIStudioUser>(`/ai-studio/users/${userId}`, data);\r\n }\r\n\r\n async delete(userId: string): Promise<APIResponse<void>> {\r\n return this.http.delete<void>(`/ai-studio/users/${userId}`);\r\n }\r\n\r\n async updateModels(userId: string, data: UpdateAIStudioUserModelsRequest): Promise<APIResponse<AIStudioUser>> {\r\n return this.http.put<AIStudioUser>(`/ai-studio/users/${userId}/models`, data);\r\n }\r\n\r\n async agreeToTerms(userId: string): Promise<APIResponse<AIStudioUser>> {\r\n return this.http.get<AIStudioUser>(`/ai-studio/users/${userId}/terms`);\r\n }\r\n}\r\n\r\n/**\r\n * AI Studio Flows API\r\n *\r\n * Uses /api/v2/flows endpoints.\r\n * Reference: ai-studio.service.ts in lp-demo\r\n */\r\nexport class FlowsAPI {\r\n constructor(\r\n private http: ScopedHTTPClient,\r\n private accountId: string\r\n ) {}\r\n\r\n /**\r\n * List all flows for the account\r\n * GET /api/v2/flows?account_id={accountId}\r\n */\r\n async getAll(): Promise<APIResponse<AIStudioFlow[]>> {\r\n return this.http.get<AIStudioFlow[]>('/ai-studio/flows', {\r\n params: { account_id: this.accountId },\r\n });\r\n }\r\n\r\n /**\r\n * Get a specific flow by ID\r\n * GET /api/v2/flows/{flowId}\r\n */\r\n async getById(flowId: string): Promise<APIResponse<AIStudioFlow>> {\r\n return this.http.get<AIStudioFlow>(`/ai-studio/flows/${flowId}`);\r\n }\r\n\r\n /**\r\n * Invoke a flow\r\n * POST /api/v2/flows/{flowId}\r\n */\r\n async invoke(flowId: string, data: InvokeFlowRequest): Promise<APIResponse<InvokeFlowResponse>> {\r\n return this.http.post<InvokeFlowResponse>(`/ai-studio/flows/${flowId}`, data);\r\n }\r\n\r\n /**\r\n * Invoke a promptless flow (quick response)\r\n * POST /api/v2/flows/response\r\n */\r\n async invokeWithResponse(prompt: string, messages?: Array<{ text: string; speaker: string }>, text?: string): Promise<APIResponse<InvokeFlowResponse>> {\r\n const body: Record<string, unknown> = { prompt };\r\n if (messages) body.messages = messages;\r\n if (text) body.text = text;\r\n return this.http.post<InvokeFlowResponse>('/ai-studio/flows/response', body);\r\n }\r\n}\r\n\r\n/**\r\n * Main AI Studio API\r\n *\r\n * Provides access to all AI Studio sub-APIs.\r\n * Uses CC-Bearer authentication.\r\n */\r\nexport class AIStudioAPI {\r\n public readonly categories: CategoriesAPI;\r\n public readonly conversations: ConversationsAPI;\r\n public readonly summary: SummaryAPI;\r\n public readonly query: QueryAPI;\r\n public readonly simulations: SimulationsAPI;\r\n public readonly transcriptAnalysis: TranscriptAnalysisAPI;\r\n public readonly knowledgebases: KnowledgebasesAPI;\r\n public readonly evaluators: EvaluatorsAPI;\r\n public readonly generators: GeneratorsAPI;\r\n public readonly promptLibrary: PromptLibraryAPI;\r\n public readonly users: AIStudioUsersAPI;\r\n public readonly flows: FlowsAPI;\r\n\r\n constructor(http: HTTPClient, accountId: string) {\r\n // Create scoped client with CC-Bearer auth\r\n const scopedHttp = http.withDefaults({ authMode: 'cc-bearer' });\r\n\r\n this.categories = new CategoriesAPI(scopedHttp);\r\n this.conversations = new ConversationsAPI(scopedHttp);\r\n this.summary = new SummaryAPI(scopedHttp);\r\n this.query = new QueryAPI(scopedHttp);\r\n this.simulations = new SimulationsAPI(scopedHttp);\r\n this.transcriptAnalysis = new TranscriptAnalysisAPI(scopedHttp);\r\n this.knowledgebases = new KnowledgebasesAPI(scopedHttp);\r\n this.evaluators = new EvaluatorsAPI(scopedHttp);\r\n this.generators = new GeneratorsAPI(scopedHttp);\r\n this.promptLibrary = new PromptLibraryAPI(scopedHttp);\r\n this.users = new AIStudioUsersAPI(scopedHttp);\r\n this.flows = new FlowsAPI(scopedHttp, accountId);\r\n }\r\n}\r\n","/**\r\n * Messaging API Module\r\n *\r\n * Provides access to LivePerson Messaging APIs.\r\n * Includes Messaging History, Agent Metrics, Agent Activity, and Operations.\r\n */\r\n\r\nimport type { HTTPClient } from '../http';\r\nimport type { APIResponse } from '../types';\r\nimport type {\r\n // Messaging History\r\n MessagingConversation,\r\n MessagingHistoryQuery,\r\n MessagingHistoryResponse,\r\n // Agent Metrics\r\n AgentMetrics,\r\n AgentMetricsQuery,\r\n // Agent Activity\r\n AgentActivity,\r\n AgentActivityQuery,\r\n // Operations\r\n TransferConversationRequest,\r\n CloseConversationRequest,\r\n SendMessageRequest,\r\n // Connect to Messaging\r\n MessagingCreateConversationRequest as CreateConversationRequest,\r\n CreateConversationResponse,\r\n // Outbound Reporting\r\n OutboundCampaignReport,\r\n OutboundReportQuery,\r\n} from '../types';\r\n\r\n/**\r\n * Messaging History API\r\n *\r\n * Access conversation history and transcripts.\r\n */\r\nexport class MessagingHistoryAPI {\r\n constructor(private http: HTTPClient) {}\r\n\r\n /**\r\n * Query messaging conversations\r\n */\r\n async query(params: MessagingHistoryQuery): Promise<APIResponse<MessagingHistoryResponse>> {\r\n return this.http.post<MessagingHistoryResponse>('/messaging/history', params);\r\n }\r\n\r\n /**\r\n * Get a single conversation by ID\r\n */\r\n async getConversation(conversationId: string): Promise<APIResponse<MessagingConversation>> {\r\n return this.http.get<MessagingConversation>(`/messaging/history/${conversationId}`);\r\n }\r\n\r\n /**\r\n * Get conversations by IDs (batch)\r\n */\r\n async getConversations(conversationIds: string[]): Promise<APIResponse<MessagingConversation[]>> {\r\n return this.http.post<MessagingConversation[]>('/messaging/history/batch', { conversationIds });\r\n }\r\n\r\n /**\r\n * Export conversations matching criteria\r\n */\r\n async export(params: MessagingHistoryQuery): Promise<APIResponse<MessagingHistoryResponse>> {\r\n return this.http.post<MessagingHistoryResponse>('/messaging/history/export', params);\r\n }\r\n}\r\n\r\n/**\r\n * Agent Metrics API\r\n *\r\n * Real-time agent metrics and status.\r\n */\r\nexport class AgentMetricsAPI {\r\n constructor(private http: HTTPClient) {}\r\n\r\n /**\r\n * Get current metrics for agents\r\n */\r\n async getMetrics(params?: AgentMetricsQuery): Promise<APIResponse<AgentMetrics[]>> {\r\n return this.http.post<AgentMetrics[]>('/messaging/agent-metrics', params || {});\r\n }\r\n\r\n /**\r\n * Get metrics for a specific agent\r\n */\r\n async getAgentMetrics(agentId: string): Promise<APIResponse<AgentMetrics>> {\r\n return this.http.get<AgentMetrics>(`/messaging/agent-metrics/${agentId}`);\r\n }\r\n\r\n /**\r\n * Get metrics summary by skill\r\n */\r\n async getBySkill(skillId: number): Promise<APIResponse<AgentMetrics[]>> {\r\n return this.http.get<AgentMetrics[]>(`/messaging/agent-metrics/skill/${skillId}`);\r\n }\r\n\r\n /**\r\n * Get metrics summary by agent group\r\n */\r\n async getByAgentGroup(groupId: number): Promise<APIResponse<AgentMetrics[]>> {\r\n return this.http.get<AgentMetrics[]>(`/messaging/agent-metrics/group/${groupId}`);\r\n }\r\n}\r\n\r\n/**\r\n * Agent Activity API\r\n *\r\n * Historical agent activity and session data.\r\n */\r\nexport class AgentActivityAPI {\r\n constructor(private http: HTTPClient) {}\r\n\r\n /**\r\n * Query agent activity\r\n */\r\n async query(params: AgentActivityQuery): Promise<APIResponse<AgentActivity[]>> {\r\n return this.http.post<AgentActivity[]>('/messaging/agent-activity', params);\r\n }\r\n\r\n /**\r\n * Get activity for a specific agent\r\n */\r\n async getAgentActivity(agentId: string, from: number, to: number): Promise<APIResponse<AgentActivity>> {\r\n return this.http.get<AgentActivity>(`/messaging/agent-activity/${agentId}`, {\r\n params: { from, to },\r\n });\r\n }\r\n}\r\n\r\n/**\r\n * Messaging Operations API\r\n *\r\n * Perform actions on conversations.\r\n */\r\nexport class MessagingOperationsAPI {\r\n constructor(private http: HTTPClient) {}\r\n\r\n /**\r\n * Transfer a conversation to another skill or agent\r\n */\r\n async transfer(request: TransferConversationRequest): Promise<APIResponse<void>> {\r\n return this.http.post<void>(`/messaging/operations/${request.conversationId}/transfer`, {\r\n targetSkillId: request.targetSkillId,\r\n targetAgentId: request.targetAgentId,\r\n reason: request.reason,\r\n });\r\n }\r\n\r\n /**\r\n * Close a conversation\r\n */\r\n async close(request: CloseConversationRequest): Promise<APIResponse<void>> {\r\n return this.http.post<void>(`/messaging/operations/${request.conversationId}/close`, {\r\n closeReason: request.closeReason,\r\n });\r\n }\r\n\r\n /**\r\n * Send a message to a conversation\r\n */\r\n async sendMessage(request: SendMessageRequest): Promise<APIResponse<void>> {\r\n return this.http.post<void>(`/messaging/operations/${request.conversationId}/message`, {\r\n message: request.message,\r\n contentType: request.contentType,\r\n richContent: request.richContent,\r\n });\r\n }\r\n\r\n /**\r\n * Set conversation priority\r\n */\r\n async setPriority(conversationId: string, priority: number): Promise<APIResponse<void>> {\r\n return this.http.post<void>(`/messaging/operations/${conversationId}/priority`, { priority });\r\n }\r\n\r\n /**\r\n * Set conversation TTR (Time To Respond)\r\n */\r\n async setTTR(conversationId: string, ttrType: 'URGENT' | 'NORMAL' | 'PRIORITIZED', value?: number): Promise<APIResponse<void>> {\r\n return this.http.post<void>(`/messaging/operations/${conversationId}/ttr`, { ttrType, value });\r\n }\r\n}\r\n\r\n/**\r\n * Connect to Messaging API\r\n *\r\n * Create new messaging conversations programmatically.\r\n */\r\nexport class ConnectToMessagingAPI {\r\n constructor(private http: HTTPClient) {}\r\n\r\n /**\r\n * Create a new conversation\r\n */\r\n async createConversation(request: CreateConversationRequest): Promise<APIResponse<CreateConversationResponse>> {\r\n return this.http.post<CreateConversationResponse>('/messaging/connect', request);\r\n }\r\n\r\n /**\r\n * Get available campaigns and engagements for creating conversations\r\n */\r\n async getAvailableEngagements(): Promise<APIResponse<{ campaigns: Array<{ id: number; name: string; engagements: Array<{ id: number; name: string }> }> }>> {\r\n return this.http.get('/messaging/connect/engagements');\r\n }\r\n}\r\n\r\n/**\r\n * Outbound Reporting API\r\n *\r\n * Reports on outbound messaging campaigns.\r\n */\r\nexport class OutboundReportingAPI {\r\n constructor(private http: HTTPClient) {}\r\n\r\n /**\r\n * Query outbound campaign reports\r\n */\r\n async query(params: OutboundReportQuery): Promise<APIResponse<OutboundCampaignReport[]>> {\r\n return this.http.post<OutboundCampaignReport[]>('/messaging/outbound/reports', params);\r\n }\r\n\r\n /**\r\n * Get report for a specific campaign\r\n */\r\n async getCampaignReport(campaignId: string, from: number, to: number): Promise<APIResponse<OutboundCampaignReport>> {\r\n return this.http.get<OutboundCampaignReport>(`/messaging/outbound/reports/${campaignId}`, {\r\n params: { from, to },\r\n });\r\n }\r\n\r\n /**\r\n * Get aggregate outbound stats\r\n */\r\n async getAggregateStats(from: number, to: number): Promise<APIResponse<OutboundCampaignReport>> {\r\n return this.http.get<OutboundCampaignReport>('/messaging/outbound/reports/aggregate', {\r\n params: { from, to },\r\n });\r\n }\r\n}\r\n\r\n/**\r\n * Main Messaging API\r\n *\r\n * Provides access to all Messaging sub-APIs.\r\n */\r\nexport class MessagingAPI {\r\n public readonly history: MessagingHistoryAPI;\r\n public readonly agentMetrics: AgentMetricsAPI;\r\n public readonly agentActivity: AgentActivityAPI;\r\n public readonly operations: MessagingOperationsAPI;\r\n public readonly connect: ConnectToMessagingAPI;\r\n public readonly outbound: OutboundReportingAPI;\r\n\r\n constructor(http: HTTPClient) {\r\n this.history = new MessagingHistoryAPI(http);\r\n this.agentMetrics = new AgentMetricsAPI(http);\r\n this.agentActivity = new AgentActivityAPI(http);\r\n this.operations = new MessagingOperationsAPI(http);\r\n this.connect = new ConnectToMessagingAPI(http);\r\n this.outbound = new OutboundReportingAPI(http);\r\n }\r\n}\r\n","/**\r\n * Sentinel API Module\r\n *\r\n * Provides access to LivePerson's Sentinel (IDP) authentication APIs.\r\n * Handles OAuth token exchange, login URL generation, and session management.\r\n */\r\n\r\nimport type { HTTPClient } from '../http';\r\nimport type {\r\n SentinelAuthRequest,\r\n SentinelToken,\r\n SentinelLoginUrlResponse,\r\n SentinelDomainsResponse,\r\n CBAuthInfo,\r\n} from '../types';\r\n\r\n/**\r\n * Sentinel Authentication API\r\n *\r\n * Handles LivePerson OAuth authentication flow via the Sentinel service.\r\n *\r\n * @example\r\n * ```typescript\r\n * // Get login URL for OAuth redirect\r\n * const { url } = await sdk.sentinel.getLoginUrl();\r\n * window.location.href = url;\r\n *\r\n * // After redirect, exchange code for token\r\n * const token = await sdk.sentinel.exchangeToken({\r\n * code: authCode,\r\n * redirect: window.location.origin + '/callback',\r\n * appname: 'my-app',\r\n * });\r\n * ```\r\n */\r\nexport class SentinelAPI {\r\n constructor(private http: HTTPClient) {}\r\n\r\n /**\r\n * Get login URL for OAuth redirect\r\n *\r\n * Returns a URL to redirect the user to for LivePerson authentication.\r\n * After successful auth, user is redirected back with an authorization code.\r\n *\r\n * @returns Login URL for OAuth redirect\r\n *\r\n * @example\r\n * ```typescript\r\n * const { url } = await sdk.sentinel.getLoginUrl();\r\n * // Redirect user to LP login\r\n * window.location.href = url;\r\n * ```\r\n */\r\n async getLoginUrl(): Promise<SentinelLoginUrlResponse> {\r\n const response = await this.http.get<SentinelLoginUrlResponse>('/idp/login-url');\r\n return response.data;\r\n }\r\n\r\n /**\r\n * Exchange OAuth authorization code for access token\r\n *\r\n * After the user completes LP authentication and is redirected back,\r\n * use this method to exchange the authorization code for tokens.\r\n *\r\n * @param request - Token exchange request with code and redirect URI\r\n * @returns Token object with access token, refresh token, and user info\r\n *\r\n * @example\r\n * ```typescript\r\n * // Get code from URL params after redirect\r\n * const urlParams = new URLSearchParams(window.location.search);\r\n * const code = urlParams.get('code');\r\n *\r\n * const token = await sdk.sentinel.exchangeToken({\r\n * code,\r\n * redirect: window.location.origin + '/callback',\r\n * appname: 'my-app',\r\n * });\r\n *\r\n * // Store token for API calls\r\n * localStorage.setItem('lpToken', token.accessToken);\r\n * ```\r\n */\r\n async exchangeToken(request: SentinelAuthRequest): Promise<SentinelToken> {\r\n const response = await this.http.post<SentinelToken>('/idp/token', request);\r\n return response.data;\r\n }\r\n\r\n /**\r\n * Logout and revoke token\r\n *\r\n * Revokes the current access token, ending the user's session.\r\n *\r\n * @example\r\n * ```typescript\r\n * await sdk.sentinel.logout();\r\n * // Clear local storage and redirect to login\r\n * localStorage.removeItem('lpToken');\r\n * window.location.href = '/login';\r\n * ```\r\n */\r\n async logout(): Promise<void> {\r\n await this.http.post<void>('/idp/logout', {});\r\n }\r\n\r\n /**\r\n * Get LivePerson domains for the account\r\n *\r\n * Returns the domain URLs for various LP services.\r\n * Useful for making direct API calls to specific LP services.\r\n *\r\n * @returns Map of service names to domain URLs\r\n *\r\n * @example\r\n * ```typescript\r\n * const domains = await sdk.sentinel.getDomains();\r\n * console.log('Sentinel domain:', domains.sentinel);\r\n * console.log('Account Config domain:', domains.accountConfigReadOnly);\r\n * ```\r\n */\r\n async getDomains(): Promise<SentinelDomainsResponse> {\r\n const response = await this.http.get<SentinelDomainsResponse>('/idp/domains');\r\n return response.data;\r\n }\r\n\r\n /**\r\n * Authenticate with Conversation Builder\r\n *\r\n * Exchanges the LP access token for a CB-specific token.\r\n * Required for making Conversation Builder API calls.\r\n *\r\n * @returns CB authentication info with token and organization ID\r\n *\r\n * @example\r\n * ```typescript\r\n * const cbAuth = await sdk.sentinel.authenticateCB();\r\n * if (cbAuth.success) {\r\n * const cbToken = cbAuth.successResult.apiAccessToken;\r\n * const cbOrg = cbAuth.successResult.sessionOrganizationId;\r\n * // Use cbToken for CB API calls\r\n * }\r\n * ```\r\n */\r\n async authenticateCB(): Promise<CBAuthInfo> {\r\n const response = await this.http.get<CBAuthInfo>('/idp/authenticate-cb');\r\n return response.data;\r\n }\r\n}\r\n","/**\r\n * LP Prompts API Module\r\n *\r\n * Provides access to LivePerson Prompt Library API.\r\n * Domain: promptlibrary\r\n * Note: This is different from AI Studio Prompt Library API.\r\n */\r\n\r\nimport type { HTTPClient, ScopedHTTPClient } from '../http';\r\nimport type { APIResponse } from '../types';\r\nimport type {\r\n LPPrompt,\r\n CreateLPPromptRequest,\r\n UpdateLPPromptRequest,\r\n LPLLMProviderSubscription,\r\n LPPromptsQueryParams,\r\n} from '../types/prompts.types';\r\n\r\n/**\r\n * Internal response wrapper from LP API\r\n */\r\ninterface LPPromptsAPIResponse {\r\n success: boolean;\r\n statusCode: number;\r\n successResult: {\r\n prompts: LPPrompt[];\r\n };\r\n}\r\n\r\n/**\r\n * Internal response wrapper for LLM providers\r\n */\r\ninterface LPLLMProvidersAPIResponse {\r\n success: boolean;\r\n statusCode: number;\r\n successResult: {\r\n provider_subscriptions: LPLLMProviderSubscription[];\r\n };\r\n}\r\n\r\n/**\r\n * LP Prompts API\r\n *\r\n * Manage LivePerson Prompt Library prompts.\r\n * Uses Bearer authentication and the promptlibrary domain.\r\n */\r\nexport class LPPromptsAPI {\r\n private readonly scopedHttp: ScopedHTTPClient;\r\n\r\n constructor(http: HTTPClient) {\r\n // Use default bearer auth with source param\r\n this.scopedHttp = http.withDefaults({\r\n params: { source: 'ccui' },\r\n });\r\n }\r\n\r\n /**\r\n * Get all system prompts (read-only, provided by LivePerson)\r\n */\r\n async getSystemPrompts(params?: LPPromptsQueryParams): Promise<APIResponse<LPPrompt[]>> {\r\n const response = await this.scopedHttp.get<LPPromptsAPIResponse>(\r\n '/prompts/system',\r\n { params: params as Record<string, string> }\r\n );\r\n\r\n // Extract prompts array from nested response\r\n const prompts = response.data?.successResult?.prompts || [];\r\n\r\n return {\r\n data: prompts,\r\n revision: response.revision,\r\n };\r\n }\r\n\r\n /**\r\n * Get all account prompts\r\n */\r\n async getAccountPrompts(params?: LPPromptsQueryParams): Promise<APIResponse<LPPrompt[]>> {\r\n const response = await this.scopedHttp.get<LPPromptsAPIResponse>(\r\n '/prompts/account',\r\n { params: params as Record<string, string> }\r\n );\r\n\r\n // Extract prompts array from nested response\r\n const prompts = response.data?.successResult?.prompts || [];\r\n\r\n return {\r\n data: prompts,\r\n revision: response.revision,\r\n };\r\n }\r\n\r\n /**\r\n * Get a single account prompt by ID\r\n */\r\n async getById(promptId: string): Promise<APIResponse<LPPrompt>> {\r\n return this.scopedHttp.get<LPPrompt>(`/prompts/account/${promptId}`);\r\n }\r\n\r\n /**\r\n * Create a new account prompt\r\n */\r\n async create(prompt: CreateLPPromptRequest): Promise<APIResponse<LPPrompt>> {\r\n return this.scopedHttp.post<LPPrompt>('/prompts/account', prompt);\r\n }\r\n\r\n /**\r\n * Update an account prompt\r\n * @param promptId - The prompt ID\r\n * @param prompt - Updated prompt data\r\n */\r\n async update(promptId: string, prompt: UpdateLPPromptRequest): Promise<APIResponse<LPPrompt>> {\r\n return this.scopedHttp.put<LPPrompt>(`/prompts/account/${promptId}`, prompt);\r\n }\r\n\r\n /**\r\n * Delete an account prompt\r\n * @param promptId - The prompt ID\r\n */\r\n async delete(promptId: string): Promise<APIResponse<void>> {\r\n return this.scopedHttp.delete<void>(`/prompts/account/${promptId}`);\r\n }\r\n\r\n /**\r\n * Get LLM provider subscriptions for the account\r\n */\r\n async getLLMProviders(): Promise<APIResponse<LPLLMProviderSubscription[]>> {\r\n const response = await this.scopedHttp.get<LPLLMProvidersAPIResponse>(\r\n '/prompts/llm-providers'\r\n );\r\n\r\n // Extract providers array from nested response\r\n const providers = response.data?.successResult?.provider_subscriptions || [];\r\n\r\n return {\r\n data: providers,\r\n revision: response.revision,\r\n };\r\n }\r\n}\r\n","/**\r\n * Conversation Builder API Module\r\n *\r\n * Provides access to LivePerson's Conversation Builder (CB) and Knowledge AI (KAI) APIs.\r\n * Manages bots, dialogs, interactions, knowledge bases, and NLU domains.\r\n *\r\n * CB APIs use a separate authentication mechanism (cbToken + organizationId) obtained\r\n * via sentinel.authenticateCB() or from ExtendJWT verification.\r\n */\r\n\r\nimport { DomainResolver } from '../domains';\r\nimport { LPExtendSDKError, ErrorCodes } from '../types';\r\nimport type {\r\n // Bot Groups\r\n CBBotGroup,\r\n CBPaginatedResult,\r\n CBBotGroupsQueryParams,\r\n CBBotsByGroupQueryParams,\r\n // Bots\r\n CBBot,\r\n CBChatBot,\r\n CBChatBotSummaryList,\r\n // Dialogs\r\n CBDialog,\r\n CBDialogGroup,\r\n CBInteraction,\r\n CBInteractionList,\r\n // NLU\r\n CBNLUDomain,\r\n CBDomainList,\r\n CBIntent,\r\n // Knowledge Base\r\n CBKnowledgeBase,\r\n CBKnowledgeBaseList,\r\n CBKnowledgeBaseDetail,\r\n CBKBArticle,\r\n CBKBArticlesQueryParams,\r\n CBKBContentSource,\r\n CBKAISearchRequest,\r\n CBKAISearchResponse,\r\n CBKAIOnDemandConfig,\r\n // Bot Management\r\n CBBotUser,\r\n CBBotInstanceStatus,\r\n CBAddBotAgentRequest,\r\n CBAllBotAgentsStatusQueryParams,\r\n CBPCSBotsStatusQueryParams,\r\n // Other\r\n CBResponder,\r\n CBGlobalFunctions,\r\n CBBotEnvironment,\r\n CBLPAppCredentials,\r\n CBLPSkill,\r\n CBDialogTemplateSummary,\r\n CBCredential,\r\n CBApiResponse,\r\n} from '../types';\r\n\r\n/**\r\n * CB Authentication credentials\r\n */\r\nexport interface CBAuthCredentials {\r\n /** CB API access token */\r\n cbToken: string;\r\n /** CB organization ID */\r\n organizationId: string;\r\n}\r\n\r\n/**\r\n * Conversation Builder API\r\n *\r\n * Provides methods for interacting with CB/KAI APIs.\r\n * Requires CB authentication credentials (cbToken + organizationId).\r\n *\r\n * @example\r\n * ```typescript\r\n * // Get CB credentials from sentinel or ExtendJWT verification\r\n * const cbAuth = await sdk.sentinel.authenticateCB();\r\n * const cbCreds = {\r\n * cbToken: cbAuth.successResult.apiAccessToken,\r\n * organizationId: cbAuth.successResult.sessionOrganizationId,\r\n * };\r\n *\r\n * // Initialize CB API with credentials\r\n * sdk.conversationBuilder.setCredentials(cbCreds);\r\n *\r\n * // Now use CB APIs\r\n * const bots = await sdk.conversationBuilder.getBots();\r\n * const kbs = await sdk.conversationBuilder.knowledgeBases.getAll();\r\n * ```\r\n */\r\nexport class ConversationBuilderAPI {\r\n private domainResolver: DomainResolver;\r\n private credentials: CBAuthCredentials | null = null;\r\n private debug: boolean;\r\n private timeout: number;\r\n\r\n /** Bot Groups API */\r\n public readonly botGroups: BotGroupsAPI;\r\n /** Bots API */\r\n public readonly bots: BotsAPI;\r\n /** Dialogs API */\r\n public readonly dialogs: DialogsAPI;\r\n /** Interactions API */\r\n public readonly interactions: InteractionsAPI;\r\n /** NLU Domains API */\r\n public readonly nluDomains: NLUDomainsAPI;\r\n /** Knowledge Bases API (KAI) */\r\n public readonly knowledgeBases: KnowledgeBasesAPI;\r\n /** Bot Agents API */\r\n public readonly botAgents: BotAgentsAPI;\r\n /** Integrations/Responders API */\r\n public readonly integrations: IntegrationsAPI;\r\n\r\n constructor(\r\n private readonly accountId: string,\r\n debug: boolean = false,\r\n timeout: number = 30000\r\n ) {\r\n this.domainResolver = new DomainResolver(accountId);\r\n this.debug = debug;\r\n this.timeout = timeout;\r\n\r\n // Initialize sub-APIs (they share the parent's credentials)\r\n this.botGroups = new BotGroupsAPI(this);\r\n this.bots = new BotsAPI(this);\r\n this.dialogs = new DialogsAPI(this);\r\n this.interactions = new InteractionsAPI(this);\r\n this.nluDomains = new NLUDomainsAPI(this);\r\n this.knowledgeBases = new KnowledgeBasesAPI(this);\r\n this.botAgents = new BotAgentsAPI(this);\r\n this.integrations = new IntegrationsAPI(this);\r\n }\r\n\r\n /**\r\n * Set CB authentication credentials\r\n * Must be called before making any CB API calls\r\n */\r\n setCredentials(credentials: CBAuthCredentials): void {\r\n this.credentials = credentials;\r\n this.log('CB credentials set', { organizationId: credentials.organizationId });\r\n }\r\n\r\n /**\r\n * Check if credentials are set\r\n */\r\n hasCredentials(): boolean {\r\n return this.credentials !== null;\r\n }\r\n\r\n /**\r\n * Get the current credentials\r\n * @throws If credentials not set\r\n */\r\n getCredentials(): CBAuthCredentials {\r\n if (!this.credentials) {\r\n throw new LPExtendSDKError(\r\n 'CB credentials not set. Call setCredentials() first or use sentinel.authenticateCB().',\r\n ErrorCodes.UNAUTHORIZED\r\n );\r\n }\r\n return this.credentials;\r\n }\r\n\r\n /**\r\n * Get the account ID\r\n */\r\n getAccountId(): string {\r\n return this.accountId;\r\n }\r\n\r\n /**\r\n * Get domain for a CB service\r\n */\r\n async getDomain(service: string): Promise<string> {\r\n const domain = await this.domainResolver.getDomain(service);\r\n if (!domain) {\r\n throw new LPExtendSDKError(\r\n `Could not resolve domain for CB service: ${service}`,\r\n ErrorCodes.API_ERROR\r\n );\r\n }\r\n return domain;\r\n }\r\n\r\n /**\r\n * Make authenticated request to CB API\r\n */\r\n async request<T>(\r\n service: string,\r\n path: string,\r\n options: {\r\n method?: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';\r\n body?: unknown;\r\n params?: Record<string, string | number | boolean | undefined>;\r\n } = {}\r\n ): Promise<T> {\r\n const { cbToken, organizationId } = this.getCredentials();\r\n const domain = await this.getDomain(service);\r\n const method = options.method || 'GET';\r\n\r\n // Build URL with query params\r\n let url = `https://${domain}${path}`;\r\n if (options.params) {\r\n const searchParams = new URLSearchParams();\r\n Object.entries(options.params).forEach(([key, value]) => {\r\n if (value !== undefined) {\r\n searchParams.set(key, String(value));\r\n }\r\n });\r\n const paramString = searchParams.toString();\r\n if (paramString) {\r\n url += (url.includes('?') ? '&' : '?') + paramString;\r\n }\r\n }\r\n\r\n // Build headers\r\n const headers: Record<string, string> = {\r\n 'Accept': 'application/json',\r\n 'Content-Type': 'application/json; charset=utf-8',\r\n 'authorization': cbToken,\r\n 'organizationid': organizationId,\r\n };\r\n\r\n this.log(`${method} ${url}`, { service });\r\n\r\n // Make request with timeout\r\n const controller = new AbortController();\r\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\r\n\r\n try {\r\n const response = await fetch(url, {\r\n method,\r\n headers,\r\n body: options.body ? JSON.stringify(options.body) : undefined,\r\n signal: controller.signal,\r\n });\r\n\r\n clearTimeout(timeoutId);\r\n\r\n if (!response.ok) {\r\n const errorBody = await response.json().catch(() => ({ message: 'Unknown error' }));\r\n throw new LPExtendSDKError(\r\n `CB API Error: ${response.status} - ${errorBody.message || response.statusText}`,\r\n ErrorCodes.API_ERROR,\r\n response.status,\r\n errorBody\r\n );\r\n }\r\n\r\n // Handle empty responses\r\n const contentType = response.headers.get('content-type');\r\n if (!contentType?.includes('application/json') || response.status === 204) {\r\n return undefined as T;\r\n }\r\n\r\n return await response.json();\r\n } catch (error) {\r\n clearTimeout(timeoutId);\r\n\r\n if ((error as Error).name === 'AbortError') {\r\n throw new LPExtendSDKError('CB API request timeout', ErrorCodes.TIMEOUT);\r\n }\r\n\r\n if (error instanceof LPExtendSDKError) {\r\n throw error;\r\n }\r\n\r\n throw new LPExtendSDKError(\r\n `CB API request failed: ${(error as Error).message}`,\r\n ErrorCodes.API_ERROR\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Debug logging\r\n */\r\n private log(...args: unknown[]): void {\r\n if (this.debug) {\r\n console.log('[LP-Extend-SDK:CB]', ...args);\r\n }\r\n }\r\n}\r\n\r\n// =============================================================================\r\n// Sub-APIs\r\n// =============================================================================\r\n\r\n/**\r\n * Bot Groups API\r\n */\r\nexport class BotGroupsAPI {\r\n constructor(private readonly cb: ConversationBuilderAPI) {}\r\n\r\n /**\r\n * Get all bot groups\r\n */\r\n async getAll(params?: CBBotGroupsQueryParams): Promise<CBPaginatedResult<CBBotGroup> | CBBotGroup[]> {\r\n const queryParams: Record<string, string | number | boolean | undefined> = {};\r\n if (params?.expandAll) {\r\n queryParams['expand-all'] = true;\r\n } else {\r\n queryParams.page = params?.page ?? 1;\r\n queryParams.size = params?.size ?? 100;\r\n }\r\n return this.cb.request('cbBotPlatform', '/bot-groups', { params: queryParams });\r\n }\r\n\r\n /**\r\n * Get bots by group\r\n */\r\n async getBots(params?: CBBotsByGroupQueryParams): Promise<CBPaginatedResult<CBBot>> {\r\n const queryParams: Record<string, string | number | boolean | undefined> = {\r\n 'sort-by': params?.sortBy ?? 'botName:asc',\r\n page: params?.page ?? 1,\r\n size: params?.size ?? 10,\r\n 'bot-group-id': params?.botGroupId ?? 'un_assigned',\r\n };\r\n return this.cb.request('cbBotPlatform', '/bot-groups/bots', { params: queryParams });\r\n }\r\n}\r\n\r\n/**\r\n * Bots API\r\n */\r\nexport class BotsAPI {\r\n constructor(private readonly cb: ConversationBuilderAPI) {}\r\n\r\n /**\r\n * Get all bots (legacy chatbots endpoint)\r\n */\r\n async getAll(): Promise<CBChatBotSummaryList> {\r\n return this.cb.request('botPlatform', '/bot-platform-manager-0.1/chatbots');\r\n }\r\n\r\n /**\r\n * Get chatbot by ID\r\n */\r\n async getById(chatBotId: string): Promise<CBChatBot> {\r\n return this.cb.request('cbBotPlatform', '/chatbots', {\r\n params: { chatBotId },\r\n });\r\n }\r\n\r\n /**\r\n * Get global functions for a bot\r\n */\r\n async getGlobalFunctions(botId: string): Promise<CBGlobalFunctions> {\r\n return this.cb.request('cbBotPlatform', `/bot/${botId}/globalFunctions`);\r\n }\r\n\r\n /**\r\n * Get LP app credentials for a bot\r\n */\r\n async getLPAppCredentials(chatBotId: string): Promise<CBLPAppCredentials> {\r\n return this.cb.request('cbBotPlatform', '/auth/liveperson/app', {\r\n params: { chatBotId },\r\n });\r\n }\r\n\r\n /**\r\n * Get bot environment variables\r\n */\r\n async getEnvironment(): Promise<CBApiResponse<CBBotEnvironment[]>> {\r\n const data = await this.cb.request<CBBotEnvironment[] | CBApiResponse<CBBotEnvironment[]>>('cbBotPlatform', '/auth/botenvironment/');\r\n // Wrap raw array response for consistency\r\n if (Array.isArray(data)) {\r\n return { success: true, successResult: data };\r\n }\r\n return data;\r\n }\r\n}\r\n\r\n/**\r\n * Dialogs API\r\n */\r\nexport class DialogsAPI {\r\n constructor(private readonly cb: ConversationBuilderAPI) {}\r\n\r\n /**\r\n * Get all dialogs for a bot\r\n */\r\n async getByBotId(botId: string): Promise<CBDialogGroup> {\r\n return this.cb.request('cbBotPlatform', `/bots/${botId}/dialog/`);\r\n }\r\n\r\n /**\r\n * Get dialog template summaries\r\n */\r\n async getTemplateSummary(): Promise<CBDialogTemplateSummary[]> {\r\n return this.cb.request('cbBotPlatform', '/dialog/template/summary');\r\n }\r\n}\r\n\r\n/**\r\n * Interactions API\r\n */\r\nexport class InteractionsAPI {\r\n constructor(private readonly cb: ConversationBuilderAPI) {}\r\n\r\n /**\r\n * Get all interactions for a bot\r\n */\r\n async getByBotId(botId: string): Promise<CBInteractionList> {\r\n return this.cb.request('cbBotPlatform', `/chat/${botId}/interaction/`);\r\n }\r\n}\r\n\r\n/**\r\n * NLU Domains API\r\n */\r\nexport class NLUDomainsAPI {\r\n constructor(private readonly cb: ConversationBuilderAPI) {}\r\n\r\n /**\r\n * Get all NLU domains for the organization\r\n */\r\n async getAll(): Promise<CBDomainList> {\r\n return this.cb.request('cbIbc', '/api/cb/nlu/v1/domains/getByOrgId');\r\n }\r\n\r\n /**\r\n * Get intents for a domain\r\n */\r\n async getIntents(domainId: string): Promise<CBApiResponse<CBIntent[]>> {\r\n const data = await this.cb.request<CBIntent[] | CBApiResponse<CBIntent[]>>('cbIbc', `/api/cb/nlu/v1/domains/${domainId}/intents`);\r\n // Wrap raw array response for consistency\r\n if (Array.isArray(data)) {\r\n return { success: true, successResult: data };\r\n }\r\n return data;\r\n }\r\n}\r\n\r\n/**\r\n * Knowledge Bases API (KAI)\r\n */\r\nexport class KnowledgeBasesAPI {\r\n constructor(private readonly cb: ConversationBuilderAPI) {}\r\n\r\n /**\r\n * Get all knowledge bases\r\n */\r\n async getAll(includeMetrics: boolean = true): Promise<CBKnowledgeBaseList> {\r\n return this.cb.request('cbKb', '/knowledgeDataSource', {\r\n params: { includeMetrics },\r\n });\r\n }\r\n\r\n /**\r\n * Get knowledge base by ID\r\n */\r\n async getById(kbId: string, includeMetrics: boolean = true): Promise<CBKnowledgeBaseDetail> {\r\n return this.cb.request('cbKb', `/knowledgeDataSource/${kbId}`, {\r\n params: { includeMetrics },\r\n });\r\n }\r\n\r\n /**\r\n * Get content sources for a knowledge base\r\n */\r\n async getContentSources(kbId: string, includeKmsRecipeDetails: boolean = true): Promise<CBKBContentSource[]> {\r\n return this.cb.request('cbKb', `/kb/${kbId}/content_sources`, {\r\n params: { includeKmsRecipeDetails },\r\n });\r\n }\r\n\r\n /**\r\n * Get articles for a knowledge base\r\n */\r\n async getArticles(kbId: string, params?: CBKBArticlesQueryParams): Promise<CBPaginatedResult<CBKBArticle>> {\r\n const body = {\r\n page: params?.page ?? 1,\r\n size: params?.size ?? 20,\r\n sortAscByLastModificationTime: params?.sortAscByLastModificationTime ?? false,\r\n articleIds: params?.articleIds ?? [],\r\n };\r\n return this.cb.request('cbKb', `/kb/${kbId}/articles`, {\r\n method: 'POST',\r\n body,\r\n params: { includeConflictingDetails: params?.includeConflictingDetails ?? true },\r\n });\r\n }\r\n\r\n /**\r\n * Search knowledge base using KAI\r\n */\r\n async search(kbId: string, searchRequest: CBKAISearchRequest): Promise<CBKAISearchResponse> {\r\n // Try cbAiSearch domain first, fallback to cbKb\r\n try {\r\n return await this.cb.request('cbAiSearch', `/v1/account/${this.cb.getAccountId()}/kb/${kbId}/search`, {\r\n method: 'POST',\r\n body: searchRequest,\r\n });\r\n } catch {\r\n // Fallback to cbKb domain\r\n return this.cb.request('cbKb', `/kb/${kbId}/search`, {\r\n method: 'POST',\r\n body: searchRequest,\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Get KAI On-Demand configurations\r\n */\r\n async getOnDemandConfigs(): Promise<CBKAIOnDemandConfig[]> {\r\n return this.cb.request('cbKb', '/on-demand/configs');\r\n }\r\n\r\n /**\r\n * Get default prompt for KAI\r\n */\r\n async getDefaultPrompt(): Promise<unknown> {\r\n return this.cb.request('cbKb', '/default-prompt');\r\n }\r\n}\r\n\r\n/**\r\n * Bot Agents API\r\n */\r\nexport class BotAgentsAPI {\r\n constructor(private readonly cb: ConversationBuilderAPI) {}\r\n\r\n /**\r\n * Get bot instance status\r\n */\r\n async getInstanceStatus(botId: string): Promise<CBBotInstanceStatus> {\r\n return this.cb.request('cbMonitoring', `/sysadmin/nodejs/instance/status-v2/${botId}`);\r\n }\r\n\r\n /**\r\n * Start a bot agent\r\n */\r\n async start(botId: string, lpAccountId: string, lpAccountUser: string): Promise<unknown> {\r\n return this.cb.request('cbMonitoring', `/sysadmin/nodejs/instance/start/${botId}`, {\r\n method: 'PUT',\r\n body: { lpAccountId, lpAccountUser },\r\n });\r\n }\r\n\r\n /**\r\n * Stop a bot agent\r\n */\r\n async stop(botId: string, lpAccountId: string, lpAccountUser: string): Promise<unknown> {\r\n return this.cb.request('cbMonitoring', `/sysadmin/nodejs/instance/stop/${botId}`, {\r\n method: 'PUT',\r\n body: { lpAccountId, lpAccountUser },\r\n });\r\n }\r\n\r\n /**\r\n * Get all bot agents status\r\n */\r\n async getAllStatus(params?: CBAllBotAgentsStatusQueryParams): Promise<unknown> {\r\n return this.cb.request('cbMonitoring', '/sysadmin/nodejs/instance/status', {\r\n params: { environment: params?.environment ?? 'PRODUCTION' },\r\n });\r\n }\r\n\r\n /**\r\n * Get PCS bots status\r\n */\r\n async getPCSStatus(params?: CBPCSBotsStatusQueryParams): Promise<unknown> {\r\n return this.cb.request('cbMonitoring', '/sysadmin/nodejs/instance/pcs/status', {\r\n params: { showBotsData: params?.showBotsData ?? true },\r\n });\r\n }\r\n\r\n /**\r\n * Get bot users\r\n */\r\n async getBotUsers(): Promise<CBBotUser[]> {\r\n return this.cb.request('cbExternalIntegrations', `/live-engage-service-0.1/le/accounts/${this.cb.getAccountId()}/bot_users`);\r\n }\r\n\r\n /**\r\n * Add a bot agent\r\n */\r\n async addAgent(lpUserId: string, chatBotId: string, request: CBAddBotAgentRequest): Promise<CBBotUser> {\r\n return this.cb.request('cbExternalIntegrations', `/live-engage-service-0.1/le/accounts/${this.cb.getAccountId()}/bot_users/${lpUserId}`, {\r\n method: 'POST',\r\n body: request,\r\n params: { chatBotId },\r\n });\r\n }\r\n}\r\n\r\n/**\r\n * Integrations/Responders API\r\n */\r\nexport class IntegrationsAPI {\r\n constructor(private readonly cb: ConversationBuilderAPI) {}\r\n\r\n /**\r\n * Get responders for a chatbot\r\n */\r\n async getResponders(chatBotId: string): Promise<CBResponder[]> {\r\n return this.cb.request('cbBotPlatform', '/responder', {\r\n params: { chatBotId },\r\n });\r\n }\r\n\r\n /**\r\n * Get LP skills\r\n */\r\n async getLPSkills(): Promise<CBLPSkill[]> {\r\n return this.cb.request('cbExternalIntegrations', `/live-engage-service-0.1/le/accounts/${this.cb.getAccountId()}/skills`);\r\n }\r\n\r\n /**\r\n * Get credentials\r\n */\r\n async getCredentials(): Promise<CBCredential[]> {\r\n return this.cb.request('cbExternalIntegrations', '/auth-service-0.1/credentials');\r\n }\r\n}\r\n","/**\r\n * LP Extend Client SDK\r\n *\r\n * Main SDK class providing typed access to LivePerson APIs.\r\n * The SDK calls LP APIs directly after verifying scopes with the shell.\r\n *\r\n * @example\r\n * ```typescript\r\n * import { initializeSDK } from '@lpextend/client-sdk';\r\n *\r\n * // Initialize the SDK\r\n * const sdk = await initializeSDK({\r\n * appId: 'my-app',\r\n * accountId: '12345678',\r\n * accessToken: 'user-lp-token',\r\n * scopes: ['skills', 'users', 'aiStudio'],\r\n * });\r\n *\r\n * // Check granted scopes\r\n * console.log('Granted scopes:', sdk.grantedScopes);\r\n *\r\n * // Use the typed APIs - calls LP APIs directly\r\n * const { data: skills, revision } = await sdk.skills.getAll();\r\n *\r\n * // Update with revision for optimistic locking\r\n * await sdk.skills.update(skills[0].id, { name: 'New Name' }, revision);\r\n *\r\n * // AI Studio (uses CC-Bearer auth automatically)\r\n * const { data: flows } = await sdk.aiStudio.flows.getAll();\r\n * ```\r\n */\r\n\r\nimport { HTTPClient } from './http';\r\nimport type { LPExtendSDKConfig, SDKInitResult, ExtendJWTVerifyResponse } from './types';\r\nimport { LPExtendSDKError, ErrorCodes } from './types';\r\n\r\n// Account Config APIs\r\nimport {\r\n SkillsAPI,\r\n UsersAPI,\r\n AgentGroupsAPI,\r\n ProfilesAPI,\r\n LOBsAPI,\r\n CampaignsAPI,\r\n EngagementsAPI,\r\n PredefinedContentAPI,\r\n AutomaticMessagesAPI,\r\n WorkingHoursAPI,\r\n SpecialOccasionsAPI,\r\n} from './api/account-config.api';\r\n\r\n// AI Studio API\r\nimport { AIStudioAPI } from './api/ai-studio.api';\r\n\r\n// Messaging APIs\r\nimport { MessagingAPI } from './api/messaging.api';\r\n\r\n// Sentinel (IDP) APIs\r\nimport { SentinelAPI } from './api/sentinel.api';\r\n\r\n// LP Prompts API (Prompt Library)\r\nimport { LPPromptsAPI } from './api/prompts.api';\r\n\r\n// Conversation Builder API\r\nimport { ConversationBuilderAPI } from './api/conversation-builder.api';\r\n\r\n// Re-export API classes for typing\r\nexport {\r\n SkillsAPI,\r\n UsersAPI,\r\n AgentGroupsAPI,\r\n ProfilesAPI,\r\n LOBsAPI,\r\n CampaignsAPI,\r\n EngagementsAPI,\r\n PredefinedContentAPI,\r\n AutomaticMessagesAPI,\r\n WorkingHoursAPI,\r\n SpecialOccasionsAPI,\r\n} from './api/account-config.api';\r\n\r\nexport {\r\n AIStudioAPI,\r\n CategoriesAPI,\r\n ConversationsAPI,\r\n SummaryAPI,\r\n QueryAPI,\r\n SimulationsAPI,\r\n TranscriptAnalysisAPI,\r\n KnowledgebasesAPI,\r\n EvaluatorsAPI,\r\n GeneratorsAPI,\r\n PromptLibraryAPI,\r\n AIStudioUsersAPI,\r\n FlowsAPI,\r\n} from './api/ai-studio.api';\r\n\r\nexport {\r\n MessagingAPI,\r\n MessagingHistoryAPI,\r\n AgentMetricsAPI,\r\n AgentActivityAPI,\r\n MessagingOperationsAPI,\r\n ConnectToMessagingAPI,\r\n OutboundReportingAPI,\r\n} from './api/messaging.api';\r\n\r\nexport { SentinelAPI } from './api/sentinel.api';\r\n\r\nexport { LPPromptsAPI } from './api/prompts.api';\r\n\r\nexport {\r\n ConversationBuilderAPI,\r\n BotGroupsAPI,\r\n BotsAPI,\r\n DialogsAPI,\r\n InteractionsAPI,\r\n NLUDomainsAPI,\r\n KnowledgeBasesAPI,\r\n BotAgentsAPI,\r\n IntegrationsAPI,\r\n} from './api/conversation-builder.api';\r\n\r\nexport type { CBAuthCredentials } from './api/conversation-builder.api';\r\n\r\n/**\r\n * LP Extend Client SDK\r\n *\r\n * Main SDK instance providing access to all LivePerson APIs.\r\n * Calls LP APIs directly after verifying scopes with the shell.\r\n *\r\n * Account Configuration APIs (Bearer auth):\r\n * - skills: Manage routing skills\r\n * - users: Manage users and agents\r\n * - agentGroups: Manage agent groups\r\n * - profiles: Manage permission profiles\r\n * - lobs: Manage lines of business\r\n * - campaigns: Manage campaigns\r\n * - engagements: Manage campaign engagements\r\n * - predefinedContent: Manage canned responses\r\n * - automaticMessages: Manage automatic messages\r\n * - workingHours: Manage working hours schedules\r\n * - specialOccasions: Manage special occasions\r\n *\r\n * AI Studio APIs (CC-Bearer auth):\r\n * - aiStudio.categories: Manage categories\r\n * - aiStudio.conversations: Manage conversations\r\n * - aiStudio.summary: Generate summaries\r\n * - aiStudio.simulations: Run simulations\r\n * - aiStudio.knowledgebases: Manage knowledge bases\r\n * - aiStudio.flows: Invoke AI flows\r\n * - aiStudio.promptLibrary: Manage prompts\r\n * - And more...\r\n *\r\n * Messaging APIs:\r\n * - messaging.history: Query conversation history\r\n * - messaging.agentMetrics: Get agent metrics\r\n * - messaging.operations: Transfer, close, send messages\r\n * - messaging.connect: Create new conversations\r\n */\r\nexport class LPExtendSDK {\r\n // =========================================================================\r\n // Account Configuration APIs\r\n // =========================================================================\r\n\r\n /** Skills API - Manage routing skills */\r\n public readonly skills: SkillsAPI;\r\n /** Users API - Manage users and agents */\r\n public readonly users: UsersAPI;\r\n /** Agent Groups API - Manage agent groups */\r\n public readonly agentGroups: AgentGroupsAPI;\r\n /** Profiles API - Manage permission profiles */\r\n public readonly profiles: ProfilesAPI;\r\n /** LOBs API - Manage lines of business */\r\n public readonly lobs: LOBsAPI;\r\n /** Campaigns API - Manage campaigns */\r\n public readonly campaigns: CampaignsAPI;\r\n /** Engagements API - Manage campaign engagements */\r\n public readonly engagements: EngagementsAPI;\r\n /** Predefined Content API - Manage canned responses */\r\n public readonly predefinedContent: PredefinedContentAPI;\r\n /** Automatic Messages API - Manage automatic messages */\r\n public readonly automaticMessages: AutomaticMessagesAPI;\r\n /** Working Hours API - Manage working hours schedules */\r\n public readonly workingHours: WorkingHoursAPI;\r\n /** Special Occasions API - Manage special occasions */\r\n public readonly specialOccasions: SpecialOccasionsAPI;\r\n\r\n // =========================================================================\r\n // AI Studio APIs (CC-Bearer auth)\r\n // =========================================================================\r\n\r\n /** AI Studio API - Access AI Studio features */\r\n public readonly aiStudio: AIStudioAPI;\r\n\r\n // =========================================================================\r\n // Messaging APIs\r\n // =========================================================================\r\n\r\n /** Messaging API - History, metrics, operations */\r\n public readonly messaging: MessagingAPI;\r\n\r\n // =========================================================================\r\n // Sentinel (IDP) APIs\r\n // =========================================================================\r\n\r\n /** Sentinel API - Authentication, login, token management */\r\n public readonly sentinel: SentinelAPI;\r\n\r\n // =========================================================================\r\n // LP Prompts API (Prompt Library)\r\n // =========================================================================\r\n\r\n /** LP Prompts API - Manage prompts from LivePerson Prompt Library */\r\n public readonly prompts: LPPromptsAPI;\r\n\r\n // =========================================================================\r\n // Conversation Builder API\r\n // =========================================================================\r\n\r\n /**\r\n * Conversation Builder API - Manage bots, dialogs, knowledge bases, NLU\r\n *\r\n * NOTE: CB APIs require separate authentication. After SDK init, call:\r\n * ```typescript\r\n * const cbAuth = await sdk.sentinel.authenticateCB();\r\n * sdk.conversationBuilder.setCredentials({\r\n * cbToken: cbAuth.successResult.apiAccessToken,\r\n * organizationId: cbAuth.successResult.sessionOrganizationId,\r\n * });\r\n * ```\r\n *\r\n * Or if using ExtendJWT (v2 auth), credentials may be set automatically\r\n * from the verification response.\r\n */\r\n public readonly conversationBuilder: ConversationBuilderAPI;\r\n\r\n // =========================================================================\r\n // SDK Properties\r\n // =========================================================================\r\n\r\n /** Scopes granted by app registration */\r\n public readonly grantedScopes: string[];\r\n /** App name from registration */\r\n public readonly appName: string;\r\n\r\n private readonly http: HTTPClient;\r\n private readonly debug: boolean;\r\n\r\n /**\r\n * Create SDK instance (use initializeSDK() instead for async init)\r\n */\r\n constructor(\r\n private readonly config: LPExtendSDKConfig,\r\n initResult: SDKInitResult\r\n ) {\r\n this.debug = config.debug ?? false;\r\n this.grantedScopes = initResult.grantedScopes;\r\n this.appName = initResult.appName;\r\n\r\n const timeout = config.timeout ?? 30000;\r\n\r\n // Initialize HTTP client - calls LP APIs directly\r\n // Note: accessToken is guaranteed to exist at this point (validated in createSDK)\r\n this.http = new HTTPClient(\r\n config.accountId,\r\n config.accessToken!,\r\n timeout,\r\n this.debug\r\n );\r\n\r\n // Initialize Account Configuration APIs\r\n this.skills = new SkillsAPI(this.http);\r\n this.users = new UsersAPI(this.http);\r\n this.agentGroups = new AgentGroupsAPI(this.http);\r\n this.profiles = new ProfilesAPI(this.http);\r\n this.lobs = new LOBsAPI(this.http);\r\n this.campaigns = new CampaignsAPI(this.http);\r\n this.engagements = new EngagementsAPI(this.http);\r\n this.predefinedContent = new PredefinedContentAPI(this.http);\r\n this.automaticMessages = new AutomaticMessagesAPI(this.http);\r\n this.workingHours = new WorkingHoursAPI(this.http);\r\n this.specialOccasions = new SpecialOccasionsAPI(this.http);\r\n\r\n // Initialize AI Studio API (uses CC-Bearer internally)\r\n this.aiStudio = new AIStudioAPI(this.http, this.config.accountId);\r\n\r\n // Initialize Messaging APIs\r\n this.messaging = new MessagingAPI(this.http);\r\n\r\n // Initialize Sentinel (IDP) APIs\r\n this.sentinel = new SentinelAPI(this.http);\r\n\r\n // Initialize LP Prompts API (Prompt Library)\r\n this.prompts = new LPPromptsAPI(this.http);\r\n\r\n // Initialize Conversation Builder API\r\n // Note: CB requires separate authentication - call sdk.conversationBuilder.setCredentials()\r\n this.conversationBuilder = new ConversationBuilderAPI(config.accountId, this.debug, timeout);\r\n\r\n this.log('SDK initialized with scopes:', this.grantedScopes);\r\n }\r\n\r\n /**\r\n * Get the current account ID\r\n */\r\n get accountId(): string {\r\n return this.config.accountId;\r\n }\r\n\r\n /**\r\n * Get the app ID\r\n */\r\n get appId(): string {\r\n return this.config.appId;\r\n }\r\n\r\n /**\r\n * Check if a scope was granted\r\n */\r\n hasScope(scope: string): boolean {\r\n return this.grantedScopes.includes(scope);\r\n }\r\n\r\n /**\r\n * Check if multiple scopes were granted\r\n */\r\n hasScopes(scopes: string[]): boolean {\r\n return scopes.every((scope) => this.grantedScopes.includes(scope));\r\n }\r\n\r\n /**\r\n * Check if any of the specified scopes were granted\r\n */\r\n hasAnyScope(scopes: string[]): boolean {\r\n return scopes.some((scope) => this.grantedScopes.includes(scope));\r\n }\r\n\r\n /**\r\n * Debug logging\r\n */\r\n private log(...args: unknown[]): void {\r\n if (this.debug) {\r\n console.log('[LP-Extend-SDK]', ...args);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Initialize the SDK with async init call\r\n *\r\n * This calls the shell backend to verify app registration and get granted scopes,\r\n * then creates an SDK that calls LP APIs directly.\r\n *\r\n * Supports four authentication modes (in order of preference):\r\n * 1. API Key (RECOMMENDED for backend apps): Provide `apiKey` - SDK authenticates with shell\r\n * 2. ExtendJWT token (for iframe apps): Provide `extendToken` - SDK verifies with shell and gets LP token\r\n * 3. Direct access token: Provide `accessToken` directly\r\n * 4. Shell token (LEGACY): Provide `shellToken` to fetch the LP token from the shell\r\n */\r\nexport async function createSDK(config: LPExtendSDKConfig): Promise<LPExtendSDK> {\r\n // Validate config\r\n if (!config.appId) {\r\n throw new LPExtendSDKError('appId is required', ErrorCodes.INVALID_CONFIG);\r\n }\r\n if (!config.accountId) {\r\n throw new LPExtendSDKError('accountId is required', ErrorCodes.INVALID_CONFIG);\r\n }\r\n if (!config.accessToken && !config.extendToken && !config.shellToken && !config.apiKey) {\r\n throw new LPExtendSDKError(\r\n 'Either accessToken, apiKey, extendToken, or shellToken is required',\r\n ErrorCodes.INVALID_CONFIG\r\n );\r\n }\r\n\r\n const debug = config.debug ?? false;\r\n const timeout = config.timeout ?? 30000;\r\n\r\n // Detect shell base URL for scope verification\r\n let shellBaseUrl = config.shellBaseUrl;\r\n if (!shellBaseUrl) {\r\n // In Node.js, check environment variable\r\n if (typeof process !== 'undefined' && process.env?.LPEXTEND_SHELL_URL) {\r\n shellBaseUrl = process.env.LPEXTEND_SHELL_URL;\r\n } else if (typeof window !== 'undefined') {\r\n try {\r\n if (window.self !== window.top && document.referrer) {\r\n const url = new URL(document.referrer);\r\n shellBaseUrl = url.origin;\r\n }\r\n } catch {\r\n // Cross-origin restriction\r\n }\r\n shellBaseUrl = shellBaseUrl || window.location.origin;\r\n } else if (config.apiKey || config.extendToken || config.shellToken) {\r\n throw new LPExtendSDKError(\r\n 'shellBaseUrl is required when using apiKey, extendToken, or shellToken in non-browser environments. ' +\r\n 'Set LPEXTEND_SHELL_URL environment variable or pass shellBaseUrl in config.',\r\n ErrorCodes.INVALID_CONFIG\r\n );\r\n }\r\n }\r\n\r\n // Determine access token - from direct, apiKey+extendToken, extendToken, or shellToken\r\n let accessToken = config.accessToken;\r\n\r\n // API Key + ExtendJWT authentication (RECOMMENDED)\r\n // Child app receives ExtendJWT from shell, verifies with shell using API key\r\n if (!accessToken && config.apiKey && config.extendToken) {\r\n const verifyUrl = `${shellBaseUrl}/api/v1/apps/verify`;\r\n\r\n if (debug) {\r\n console.log('[LP-Extend-SDK] Verifying ExtendJWT with API key');\r\n console.log('[LP-Extend-SDK] Shell URL:', shellBaseUrl);\r\n console.log('[LP-Extend-SDK] Verify URL:', verifyUrl);\r\n console.log('[LP-Extend-SDK] API Key:', config.apiKey.substring(0, 20) + '...');\r\n console.log('[LP-Extend-SDK] ExtendToken length:', config.extendToken.length);\r\n }\r\n\r\n const authController = new AbortController();\r\n const authTimeoutId = setTimeout(() => authController.abort(), timeout);\r\n\r\n try {\r\n const authResponse = await fetch(verifyUrl, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'X-LPExtend-API-Key': config.apiKey,\r\n },\r\n body: JSON.stringify({\r\n token: config.extendToken,\r\n }),\r\n signal: authController.signal,\r\n });\r\n\r\n clearTimeout(authTimeoutId);\r\n\r\n if (!authResponse.ok) {\r\n const errorData = await authResponse.json().catch(() => ({}));\r\n\r\n if (authResponse.status === 401) {\r\n throw new LPExtendSDKError(\r\n errorData.message || 'Invalid API key or ExtendJWT',\r\n ErrorCodes.UNAUTHORIZED,\r\n authResponse.status,\r\n errorData\r\n );\r\n }\r\n\r\n if (authResponse.status === 403) {\r\n throw new LPExtendSDKError(\r\n errorData.message || 'App not authorized for this account',\r\n ErrorCodes.APP_NOT_REGISTERED,\r\n authResponse.status,\r\n errorData\r\n );\r\n }\r\n\r\n throw new LPExtendSDKError(\r\n errorData.message || `Token verification failed: ${authResponse.status}`,\r\n ErrorCodes.API_ERROR,\r\n authResponse.status,\r\n errorData\r\n );\r\n }\r\n\r\n const authData = await authResponse.json();\r\n accessToken = authData.lpAccessToken;\r\n\r\n if (debug) {\r\n console.log('[LP-Extend-SDK] ExtendJWT verified with API key');\r\n console.log('[LP-Extend-SDK] User:', authData.user?.lpUserId, 'Account:', authData.user?.lpAccountId);\r\n console.log('[LP-Extend-SDK] Allowed APIs:', authData.allowedApis);\r\n }\r\n\r\n // Create SDK directly with the authenticated access token\r\n const resolvedConfig = { ...config, accessToken };\r\n const initResult: SDKInitResult = {\r\n appId: config.appId,\r\n accountId: authData.user?.lpAccountId || config.accountId,\r\n grantedScopes: authData.allowedApis || [],\r\n appName: config.appId,\r\n version: '1.0.0',\r\n };\r\n return new LPExtendSDK(resolvedConfig, initResult);\r\n } catch (error) {\r\n clearTimeout(authTimeoutId);\r\n\r\n if (debug) {\r\n console.error('[LP-Extend-SDK] ExtendJWT verification error:', {\r\n name: (error as Error).name,\r\n message: (error as Error).message,\r\n cause: (error as any).cause?.message || (error as any).cause,\r\n verifyUrl,\r\n });\r\n }\r\n\r\n if (error instanceof LPExtendSDKError) {\r\n throw error;\r\n }\r\n\r\n if ((error as Error).name === 'AbortError') {\r\n throw new LPExtendSDKError('Token verification timeout', ErrorCodes.TIMEOUT);\r\n }\r\n\r\n // Include more context about the failure\r\n const errorMessage = (error as any).cause?.message || (error as Error).message;\r\n throw new LPExtendSDKError(\r\n `ExtendJWT verification failed: ${errorMessage}`,\r\n ErrorCodes.INIT_FAILED\r\n );\r\n }\r\n }\r\n\r\n // API Key only - error, need ExtendJWT too\r\n if (!accessToken && config.apiKey && !config.extendToken) {\r\n throw new LPExtendSDKError(\r\n 'API key authentication requires extendToken. ' +\r\n 'The ExtendJWT is passed from the shell to your app when opened in an iframe.',\r\n ErrorCodes.INVALID_CONFIG\r\n );\r\n }\r\n\r\n // ExtendJWT without API key (legacy flow - calls old verify endpoint)\r\n if (!accessToken && config.extendToken && !config.apiKey) {\r\n if (debug) {\r\n console.log('[LP-Extend-SDK] Verifying ExtendJWT with shell');\r\n }\r\n\r\n const verifyUrl = `${shellBaseUrl}/api/v2/auth/verify-child`;\r\n\r\n const extendController = new AbortController();\r\n const extendTimeoutId = setTimeout(() => extendController.abort(), timeout);\r\n\r\n try {\r\n const verifyResponse = await fetch(verifyUrl, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n },\r\n body: JSON.stringify({\r\n extendToken: config.extendToken,\r\n appId: config.appId,\r\n }),\r\n signal: extendController.signal,\r\n });\r\n\r\n clearTimeout(extendTimeoutId);\r\n\r\n if (!verifyResponse.ok) {\r\n const errorData = await verifyResponse.json().catch(() => ({}));\r\n\r\n if (verifyResponse.status === 401) {\r\n throw new LPExtendSDKError(\r\n errorData.message || 'ExtendJWT invalid or expired',\r\n ErrorCodes.UNAUTHORIZED,\r\n verifyResponse.status,\r\n errorData\r\n );\r\n }\r\n\r\n throw new LPExtendSDKError(\r\n errorData.message || `ExtendJWT verification failed: ${verifyResponse.status}`,\r\n ErrorCodes.API_ERROR,\r\n verifyResponse.status,\r\n errorData\r\n );\r\n }\r\n\r\n const authData: ExtendJWTVerifyResponse = await verifyResponse.json();\r\n accessToken = authData.lpAccessToken;\r\n\r\n if (debug) {\r\n console.log('[LP-Extend-SDK] ExtendJWT verified, got LP access token');\r\n console.log('[LP-Extend-SDK] User:', authData.lpUserId, 'Account:', authData.lpAccountId);\r\n }\r\n\r\n // ExtendJWT authentication grants all scopes - skip scope verification with shell\r\n // since we can't call the shell's sdk/init endpoint without extend_auth cookie\r\n const grantedScopes = config.scopes || ['*'];\r\n\r\n if (debug) {\r\n console.log('[LP-Extend-SDK] ExtendJWT auth grants all scopes:', grantedScopes);\r\n console.log('[LP-Extend-SDK] SDK will call LP APIs directly');\r\n }\r\n\r\n // Create SDK directly with the verified access token\r\n const resolvedConfig = { ...config, accessToken };\r\n const initResult: SDKInitResult = {\r\n appId: config.appId,\r\n accountId: config.accountId,\r\n grantedScopes,\r\n appName: config.appId,\r\n version: '1.0.0',\r\n };\r\n return new LPExtendSDK(resolvedConfig, initResult);\r\n } catch (error) {\r\n clearTimeout(extendTimeoutId);\r\n\r\n if (error instanceof LPExtendSDKError) {\r\n throw error;\r\n }\r\n\r\n if ((error as Error).name === 'AbortError') {\r\n throw new LPExtendSDKError('ExtendJWT verification timeout', ErrorCodes.TIMEOUT);\r\n }\r\n\r\n throw new LPExtendSDKError(\r\n `ExtendJWT verification failed: ${(error as Error).message}`,\r\n ErrorCodes.INIT_FAILED\r\n );\r\n }\r\n }\r\n\r\n // LEGACY: Shell token authentication\r\n if (!accessToken && config.shellToken) {\r\n if (debug) {\r\n console.log('[LP-Extend-SDK] Fetching LP token from shell using shellToken (legacy)');\r\n }\r\n\r\n // Fetch LP token from shell\r\n const tokenUrl = `${shellBaseUrl}/api/v1/shell/token/${config.accountId}/lp-token`;\r\n\r\n const tokenController = new AbortController();\r\n const tokenTimeoutId = setTimeout(() => tokenController.abort(), timeout);\r\n\r\n try {\r\n const tokenResponse = await fetch(tokenUrl, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'X-Shell-Token': config.shellToken,\r\n },\r\n body: JSON.stringify({\r\n appId: config.appId,\r\n scopes: config.scopes,\r\n }),\r\n signal: tokenController.signal,\r\n });\r\n\r\n clearTimeout(tokenTimeoutId);\r\n\r\n if (!tokenResponse.ok) {\r\n const errorData = await tokenResponse.json().catch(() => ({}));\r\n\r\n if (tokenResponse.status === 401) {\r\n throw new LPExtendSDKError(\r\n errorData.message || 'Shell token invalid or expired',\r\n ErrorCodes.UNAUTHORIZED,\r\n tokenResponse.status,\r\n errorData\r\n );\r\n }\r\n\r\n if (tokenResponse.status === 403) {\r\n throw new LPExtendSDKError(\r\n errorData.message || 'App not installed or disabled',\r\n ErrorCodes.APP_NOT_REGISTERED,\r\n tokenResponse.status,\r\n errorData\r\n );\r\n }\r\n\r\n if (tokenResponse.status === 404) {\r\n throw new LPExtendSDKError(\r\n errorData.message || 'No LP token found - user may need to re-authenticate',\r\n ErrorCodes.NOT_FOUND,\r\n tokenResponse.status,\r\n errorData\r\n );\r\n }\r\n\r\n throw new LPExtendSDKError(\r\n errorData.message || `Failed to retrieve LP token: ${tokenResponse.status}`,\r\n ErrorCodes.API_ERROR,\r\n tokenResponse.status,\r\n errorData\r\n );\r\n }\r\n\r\n const tokenData = await tokenResponse.json();\r\n accessToken = tokenData.accessToken;\r\n\r\n if (debug) {\r\n console.log('[LP-Extend-SDK] LP token retrieved successfully');\r\n }\r\n } catch (error) {\r\n clearTimeout(tokenTimeoutId);\r\n\r\n if (error instanceof LPExtendSDKError) {\r\n throw error;\r\n }\r\n\r\n if ((error as Error).name === 'AbortError') {\r\n throw new LPExtendSDKError('LP token retrieval timeout', ErrorCodes.TIMEOUT);\r\n }\r\n\r\n throw new LPExtendSDKError(\r\n `Failed to retrieve LP token: ${(error as Error).message}`,\r\n ErrorCodes.INIT_FAILED\r\n );\r\n }\r\n }\r\n\r\n if (debug) {\r\n console.log('[LP-Extend-SDK] Verifying scopes with shell:', shellBaseUrl);\r\n }\r\n\r\n // Call shell backend to verify app and get scopes\r\n const initUrl = `${shellBaseUrl}/api/v1/lp/${config.accountId}/sdk/init`;\r\n\r\n const controller = new AbortController();\r\n const timeoutId = setTimeout(() => controller.abort(), timeout);\r\n\r\n try {\r\n const response = await fetch(initUrl, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n Authorization: `Bearer ${accessToken}`,\r\n 'X-App-Id': config.appId,\r\n },\r\n body: JSON.stringify({ scopes: config.scopes || [] }),\r\n signal: controller.signal,\r\n });\r\n\r\n clearTimeout(timeoutId);\r\n\r\n if (!response.ok) {\r\n const errorBody = await response.json().catch(() => ({ message: 'Unknown error' }));\r\n\r\n if (response.status === 404) {\r\n throw new LPExtendSDKError(\r\n `App \"${config.appId}\" is not registered for account ${config.accountId}`,\r\n ErrorCodes.APP_NOT_REGISTERED,\r\n response.status,\r\n errorBody\r\n );\r\n }\r\n if (response.status === 403) {\r\n throw new LPExtendSDKError(\r\n errorBody.message || 'App is disabled or not authorized',\r\n ErrorCodes.APP_NOT_REGISTERED,\r\n response.status,\r\n errorBody\r\n );\r\n }\r\n if (response.status === 401) {\r\n throw new LPExtendSDKError(\r\n 'Authentication failed - invalid access token',\r\n ErrorCodes.UNAUTHORIZED,\r\n response.status,\r\n errorBody\r\n );\r\n }\r\n\r\n throw new LPExtendSDKError(\r\n `SDK initialization failed: ${errorBody.message || response.statusText}`,\r\n ErrorCodes.INIT_FAILED,\r\n response.status,\r\n errorBody\r\n );\r\n }\r\n\r\n const initResult: SDKInitResult = await response.json();\r\n\r\n if (debug) {\r\n console.log('[LP-Extend-SDK] Scopes verified:', initResult.grantedScopes);\r\n console.log('[LP-Extend-SDK] SDK will call LP APIs directly');\r\n }\r\n\r\n // Create config with resolved access token\r\n const resolvedConfig = { ...config, accessToken };\r\n return new LPExtendSDK(resolvedConfig, initResult);\r\n } catch (error) {\r\n clearTimeout(timeoutId);\r\n\r\n if ((error as Error).name === 'AbortError') {\r\n throw new LPExtendSDKError('SDK initialization timeout', ErrorCodes.TIMEOUT);\r\n }\r\n\r\n if (error instanceof LPExtendSDKError) {\r\n throw error;\r\n }\r\n\r\n throw new LPExtendSDKError(\r\n `SDK initialization failed: ${(error as Error).message}`,\r\n ErrorCodes.INIT_FAILED\r\n );\r\n }\r\n}\r\n","/**\r\n * LP Extend Node SDK\r\n *\r\n * A TypeScript SDK for building Node.js/backend applications on the LivePerson Extend platform.\r\n * Provides typed access to LivePerson APIs through the shell backend proxy.\r\n * The shell handles authentication and scope enforcement.\r\n *\r\n * For browser/frontend authentication, use @lpextend/client-sdk instead.\r\n *\r\n * @packageDocumentation\r\n *\r\n * @example Basic Usage\r\n * ```typescript\r\n * import { initializeSDK, Scopes } from '@lpextend/node-sdk';\r\n *\r\n * // Initialize the SDK (async - verifies app registration)\r\n * const sdk = await initializeSDK({\r\n * appId: 'my-app',\r\n * accountId: '12345678',\r\n * accessToken: 'user-lp-bearer-token',\r\n * scopes: [Scopes.SKILLS, Scopes.USERS, Scopes.AI_STUDIO],\r\n * });\r\n *\r\n * // Check granted scopes\r\n * if (sdk.hasScope(Scopes.SKILLS)) {\r\n * const { data: skills, revision } = await sdk.skills.getAll();\r\n * console.log('Skills:', skills);\r\n *\r\n * // Update with revision for optimistic locking\r\n * await sdk.skills.update(skills[0].id, { name: 'Updated' }, revision);\r\n * }\r\n *\r\n * // AI Studio APIs (automatically uses CC-Bearer auth)\r\n * if (sdk.hasScope(Scopes.AI_STUDIO)) {\r\n * const { data: flows } = await sdk.aiStudio.flows.getAll();\r\n * const result = await sdk.aiStudio.flows.invoke(flows[0].id, { input: { query: 'Hello' } });\r\n * }\r\n *\r\n * // Messaging History\r\n * if (sdk.hasScope(Scopes.MESSAGING_HISTORY)) {\r\n * const { data: history } = await sdk.messaging.history.query({\r\n * start: { from: Date.now() - 86400000, to: Date.now() },\r\n * status: ['CLOSE'],\r\n * });\r\n * }\r\n * ```\r\n *\r\n * @example Error Handling\r\n * ```typescript\r\n * import { initializeSDK, ErrorCodes, LPExtendSDKError } from '@lpextend/client-sdk';\r\n *\r\n * try {\r\n * const sdk = await initializeSDK(config);\r\n * const { data, revision } = await sdk.skills.getAll();\r\n *\r\n * // Try to update\r\n * await sdk.skills.update(data[0].id, { name: 'New' }, revision);\r\n * } catch (error) {\r\n * if (error instanceof LPExtendSDKError) {\r\n * switch (error.code) {\r\n * case ErrorCodes.SCOPE_DENIED:\r\n * console.error('App does not have access. Update app registration.');\r\n * break;\r\n * case ErrorCodes.APP_NOT_REGISTERED:\r\n * console.error('App is not installed for this account.');\r\n * break;\r\n * case ErrorCodes.REVISION_CONFLICT:\r\n * console.error('Resource was modified. Refresh and try again.');\r\n * break;\r\n * default:\r\n * console.error('API Error:', error.message);\r\n * }\r\n * }\r\n * }\r\n * ```\r\n */\r\n\r\nimport { createSDK, LPExtendSDK } from './sdk';\r\nimport type { LPExtendSDKConfig } from './types';\r\n\r\n// Re-export SDK class\r\nexport { LPExtendSDK } from './sdk';\r\n\r\n// Re-export the createSDK function\r\nexport { createSDK } from './sdk';\r\n\r\n// Re-export all API classes\r\nexport {\r\n // Account Config APIs\r\n SkillsAPI,\r\n UsersAPI,\r\n AgentGroupsAPI,\r\n ProfilesAPI,\r\n LOBsAPI,\r\n CampaignsAPI,\r\n EngagementsAPI,\r\n PredefinedContentAPI,\r\n AutomaticMessagesAPI,\r\n WorkingHoursAPI,\r\n SpecialOccasionsAPI,\r\n // AI Studio APIs\r\n AIStudioAPI,\r\n CategoriesAPI,\r\n ConversationsAPI,\r\n SummaryAPI,\r\n QueryAPI,\r\n SimulationsAPI,\r\n TranscriptAnalysisAPI,\r\n KnowledgebasesAPI,\r\n EvaluatorsAPI,\r\n GeneratorsAPI,\r\n PromptLibraryAPI,\r\n AIStudioUsersAPI,\r\n FlowsAPI,\r\n // Messaging APIs\r\n MessagingAPI,\r\n MessagingHistoryAPI,\r\n AgentMetricsAPI,\r\n AgentActivityAPI,\r\n MessagingOperationsAPI,\r\n ConnectToMessagingAPI,\r\n OutboundReportingAPI,\r\n // Sentinel (IDP) APIs\r\n SentinelAPI,\r\n // LP Prompts API (Prompt Library)\r\n LPPromptsAPI,\r\n // Conversation Builder APIs\r\n ConversationBuilderAPI,\r\n BotGroupsAPI,\r\n BotsAPI,\r\n DialogsAPI,\r\n InteractionsAPI,\r\n NLUDomainsAPI,\r\n KnowledgeBasesAPI,\r\n BotAgentsAPI,\r\n IntegrationsAPI,\r\n} from './sdk';\r\n\r\nexport type { CBAuthCredentials } from './sdk';\r\n\r\n// Re-export all types\r\nexport type {\r\n // SDK Config\r\n LPExtendSDKConfig,\r\n SDKInitResult,\r\n ApiKeyAuthResponse,\r\n // API Response\r\n APIResponse,\r\n PaginatedResponse,\r\n // Account Config Types\r\n LPSkill,\r\n LPSkillRoutingConfig,\r\n CreateSkillRequest,\r\n UpdateSkillRequest,\r\n LPUser,\r\n MemberOf,\r\n CreateUserRequest,\r\n UpdateUserRequest,\r\n LPAgentGroup,\r\n CreateAgentGroupRequest,\r\n UpdateAgentGroupRequest,\r\n LPProfile,\r\n LPPermission,\r\n CreateProfileRequest,\r\n UpdateProfileRequest,\r\n LPLOB,\r\n CreateLOBRequest,\r\n UpdateLOBRequest,\r\n LPCampaign,\r\n CreateCampaignRequest,\r\n UpdateCampaignRequest,\r\n LPEngagement,\r\n CreateEngagementRequest,\r\n UpdateEngagementRequest,\r\n LPPredefinedContent,\r\n LPPredefinedContentData,\r\n CreatePredefinedContentRequest,\r\n UpdatePredefinedContentRequest,\r\n LPAutomaticMessage,\r\n LPAutomaticMessageData,\r\n CreateAutomaticMessageRequest,\r\n UpdateAutomaticMessageRequest,\r\n LPWorkingHours,\r\n LPWorkingDay,\r\n LPShift,\r\n CreateWorkingHoursRequest,\r\n UpdateWorkingHoursRequest,\r\n LPSpecialOccasion,\r\n LPSpecialOccasionEvent,\r\n CreateSpecialOccasionRequest,\r\n UpdateSpecialOccasionRequest,\r\n // AI Studio Types\r\n AIStudioCategory,\r\n CreateCategoryRequest,\r\n UpdateCategoryRequest,\r\n AIStudioConversation,\r\n AIStudioMessage,\r\n AICreateConversationRequest,\r\n AIUpdateConversationRequest,\r\n ConversationQueryParams,\r\n UpdateConversationAttributesRequest,\r\n SummaryRequest,\r\n BatchSummaryRequest,\r\n AIStudioSummary,\r\n QueryGenerateRequest,\r\n QueryGenerateResponse,\r\n AIStudioSimulation,\r\n SimulationConfig,\r\n SimulationTestCase,\r\n SimulationResults,\r\n CreateSimulationRequest,\r\n UpdateSimulationRequest,\r\n SimulationQueryParams,\r\n SimulationJobResult,\r\n TranscriptAnalysis,\r\n TranscriptConversation,\r\n TranscriptQuestion,\r\n CreateTranscriptAnalysisRequest,\r\n UpdateTranscriptAnalysisRequest,\r\n Knowledgebase,\r\n KnowledgebaseHealth,\r\n KnowledgebaseSearchRequest,\r\n KnowledgebaseSearchResult,\r\n KnowledgebaseItem,\r\n KnowledgebaseTextItem,\r\n SimilarityEvaluationRequest,\r\n SimilarityEvaluationResponse,\r\n ResolutionEvaluationRequest,\r\n ResolutionEvaluationResponse,\r\n GuidedRoutingEvaluationRequest,\r\n GuidedRoute,\r\n GuidedRoutingEvaluationResponse,\r\n QuestionGeneratorRequest,\r\n QuestionGeneratorResponse,\r\n GeneratedQuestion,\r\n KAIRouteGeneratorRequest,\r\n KAIRouteGeneratorResponse,\r\n GeneratedRoute,\r\n KAIRouteGenerationStatus,\r\n Prompt,\r\n PromptVariable,\r\n CreatePromptRequest,\r\n UpdatePromptRequest,\r\n LLMProvider,\r\n LLMModel,\r\n AIStudioUser,\r\n CreateAIStudioUserRequest,\r\n UpdateAIStudioUserRequest,\r\n UpdateAIStudioUserModelsRequest,\r\n AIStudioFlow,\r\n InvokeFlowRequest,\r\n InvokeFlowResponse,\r\n // Messaging Types\r\n MessagingConversation,\r\n ConversationParticipant,\r\n ConsumerParticipant,\r\n AgentParticipant,\r\n ConversationTransfer,\r\n ConversationInteraction,\r\n MessageRecord,\r\n MessageData,\r\n TextMessage,\r\n FileMessage,\r\n RichContentMessage,\r\n ConversationSummary,\r\n SDERecord,\r\n SDEEvent,\r\n CoBrowseSession,\r\n SurveyRecord,\r\n MessagingHistoryQuery,\r\n ContentToRetrieve,\r\n MessagingHistoryResponse,\r\n MessagingInteraction,\r\n AgentMetrics,\r\n AgentStatus,\r\n AgentMetricsQuery,\r\n AgentActivity,\r\n ActivityRecord,\r\n AgentActivityQuery,\r\n TransferConversationRequest,\r\n CloseConversationRequest,\r\n SendMessageRequest,\r\n MessagingCreateConversationRequest,\r\n ConsumerProfile,\r\n ConversationContext,\r\n CreateConversationResponse,\r\n OutboundCampaignReport,\r\n OutboundReportQuery,\r\n // Error Types\r\n ErrorCode,\r\n // Shell Token Types\r\n ShellTokenConfig,\r\n ShellTokenResponse,\r\n ShellTokenUser,\r\n // Sentinel Types\r\n SentinelAuthRequest,\r\n SentinelTokenExchange,\r\n SentinelToken,\r\n SentinelLpToken,\r\n SentinelUserData,\r\n SentinelProfile,\r\n SentinelMemberOf,\r\n SentinelManagerOf,\r\n SentinelUserSkill,\r\n SentinelLpUser,\r\n SentinelAppUser,\r\n SentinelCCUser,\r\n CBChatBotPlatformUser,\r\n CBSuccessResult,\r\n CBAuthInfo,\r\n SentinelAppSetting,\r\n SentinelAppSettings,\r\n SentinelLoginUrlResponse,\r\n SentinelDomainsResponse,\r\n // LP Prompts Types (Prompt Library - separate from AI Studio)\r\n LPPrompt,\r\n LPPromptVariable,\r\n LPPromptVariableSourceType,\r\n LPPromptGenericConfig,\r\n LPPromptClientConfig,\r\n LPPromptConfiguration,\r\n LPPromptVersionDetail,\r\n LPPromptClientType,\r\n LPPromptStatus,\r\n LPLLMProviderModels,\r\n LPLLMType,\r\n LPLLMProviderSubscription,\r\n CreateLPPromptRequest,\r\n UpdateLPPromptRequest,\r\n LPPromptsQueryParams,\r\n // Conversation Builder Types\r\n CBApiResponse,\r\n CBPageContext,\r\n CBPaginatedResult,\r\n CBBotGroup,\r\n CBBot,\r\n CBBotPlatform,\r\n CBChatBot,\r\n CBChatBotMetrics,\r\n CBChatBotSummary,\r\n CBChatBotSummaryList,\r\n CBDialog,\r\n CBDialogGroup,\r\n CBResponseMatch,\r\n CBTileData,\r\n CBInteractionContent,\r\n CBInteraction,\r\n CBInteractionList,\r\n CBDuplicatePhrase,\r\n CBDuplicatePhrases,\r\n CBNLUDomain,\r\n CBDomainList,\r\n CBIntent,\r\n CBKBLandingPageMetrics,\r\n CBSyncStatusDetails,\r\n CBKnowledgeBase,\r\n CBKnowledgeBaseList,\r\n CBKnowledgeBaseDetail,\r\n CBKBArticle,\r\n CBKAISearchRequest,\r\n CBKAISearchResultItem,\r\n CBKAISearchResponse,\r\n CBKAIOnDemandConfig,\r\n CBBotUser,\r\n CBBotInstanceStatus,\r\n CBAddBotAgentRequest,\r\n CBResponder,\r\n CBGlobalFunctions,\r\n CBBotEnvironment,\r\n CBLPAppCredentials,\r\n CBLPSkill,\r\n CBKBContentSource,\r\n CBDialogTemplateSummary,\r\n CBCredential,\r\n CBBotGroupsQueryParams,\r\n CBBotsByGroupQueryParams,\r\n CBKBArticlesQueryParams,\r\n CBAllBotAgentsStatusQueryParams,\r\n CBPCSBotsStatusQueryParams,\r\n} from './types';\r\n\r\n// Re-export error class and codes\r\nexport { LPExtendSDKError, ErrorCodes } from './types';\r\n\r\n/**\r\n * Initialize the LP Extend SDK\r\n *\r\n * Creates and returns an SDK instance after verifying app registration with the shell.\r\n * This is an async function that validates the app is registered and gets granted scopes.\r\n *\r\n * @param config - SDK configuration options\r\n * @returns Promise resolving to initialized SDK instance\r\n *\r\n * @example\r\n * ```typescript\r\n * import { initializeSDK, Scopes } from '@lpextend/node-sdk';\r\n *\r\n * const sdk = await initializeSDK({\r\n * appId: 'my-analytics-app',\r\n * accountId: '12345678',\r\n * accessToken: lpAccessToken, // From shell auth\r\n * scopes: [Scopes.SKILLS, Scopes.USERS, Scopes.AI_STUDIO],\r\n * debug: true,\r\n * });\r\n *\r\n * // Check what scopes were granted\r\n * console.log('Granted:', sdk.grantedScopes);\r\n *\r\n * // Access Account Config APIs (Bearer auth)\r\n * if (sdk.hasScope(Scopes.SKILLS)) {\r\n * const { data: skills, revision } = await sdk.skills.getAll();\r\n * // Update with revision\r\n * await sdk.skills.update(skills[0].id, { name: 'New Name' }, revision);\r\n * }\r\n *\r\n * // Access AI Studio APIs (CC-Bearer auth - handled automatically)\r\n * if (sdk.hasScope(Scopes.AI_STUDIO)) {\r\n * const { data: flows } = await sdk.aiStudio.flows.getAll();\r\n * const result = await sdk.aiStudio.flows.invoke(flows[0].id, {\r\n * input: { query: 'What is your return policy?' },\r\n * });\r\n * }\r\n *\r\n * // Access Messaging APIs\r\n * if (sdk.hasScope(Scopes.MESSAGING_HISTORY)) {\r\n * const { data: history } = await sdk.messaging.history.query({\r\n * start: { from: Date.now() - 86400000, to: Date.now() },\r\n * status: ['CLOSE'],\r\n * contentToRetrieve: ['messageRecords', 'summary'],\r\n * });\r\n * }\r\n * ```\r\n */\r\nexport async function initializeSDK(config: LPExtendSDKConfig): Promise<LPExtendSDK> {\r\n return createSDK(config);\r\n}\r\n\r\n/**\r\n * Initialize the SDK using environment variables + ExtendJWT\r\n *\r\n * Reads configuration from environment variables:\r\n * - LPEXTEND_API_KEY: Your app's API key (required)\r\n * - APP_ID: Your registered app ID (required)\r\n * - LP_ACCOUNT_ID: LivePerson account ID (required)\r\n * - LPEXTEND_SHELL_URL: Shell base URL (required)\r\n * - LPEXTEND_DEBUG: Enable debug logging (optional, default: false)\r\n *\r\n * The ExtendJWT is passed as a parameter since it comes from the shell at runtime.\r\n *\r\n * @param extendToken - The ExtendJWT received from the shell\r\n * @returns Promise resolving to initialized SDK instance\r\n * @throws LPExtendSDKError if required env vars are missing\r\n *\r\n * @example\r\n * ```typescript\r\n * // In your .env file:\r\n * // LPEXTEND_API_KEY=lpx_my-app_abc123...\r\n * // APP_ID=my-app\r\n * // LP_ACCOUNT_ID=12345678\r\n * // LPEXTEND_SHELL_URL=https://lp-extend.example.com\r\n *\r\n * import { createSDKFromEnv } from '@lpextend/node-sdk';\r\n *\r\n * // In your API route handler:\r\n * app.get('/api/skills', async (req, res) => {\r\n * // Get ExtendJWT from request (sent by frontend)\r\n * const extendToken = req.headers['x-extend-token'] as string;\r\n *\r\n * const sdk = await createSDKFromEnv(extendToken);\r\n * const { data: skills } = await sdk.skills.getAll();\r\n * res.json(skills);\r\n * });\r\n * ```\r\n */\r\nexport async function createSDKFromEnv(extendToken: string): Promise<LPExtendSDK> {\r\n const apiKey = process.env.LPEXTEND_API_KEY;\r\n const appId = process.env.APP_ID;\r\n const accountId = process.env.LP_ACCOUNT_ID;\r\n const shellBaseUrl = process.env.LPEXTEND_SHELL_URL;\r\n const debug = process.env.LPEXTEND_DEBUG === 'true';\r\n\r\n if (!apiKey) {\r\n throw new LPExtendSDKError(\r\n 'LPEXTEND_API_KEY environment variable is required',\r\n ErrorCodes.INVALID_CONFIG\r\n );\r\n }\r\n\r\n if (!appId) {\r\n throw new LPExtendSDKError(\r\n 'APP_ID environment variable is required',\r\n ErrorCodes.INVALID_CONFIG\r\n );\r\n }\r\n\r\n if (!accountId) {\r\n throw new LPExtendSDKError(\r\n 'LP_ACCOUNT_ID environment variable is required',\r\n ErrorCodes.INVALID_CONFIG\r\n );\r\n }\r\n\r\n if (!shellBaseUrl) {\r\n throw new LPExtendSDKError(\r\n 'LPEXTEND_SHELL_URL environment variable is required',\r\n ErrorCodes.INVALID_CONFIG\r\n );\r\n }\r\n\r\n if (!extendToken) {\r\n throw new LPExtendSDKError(\r\n 'extendToken is required. This is passed from the shell to your app when opened.',\r\n ErrorCodes.INVALID_CONFIG\r\n );\r\n }\r\n\r\n return createSDK({\r\n appId,\r\n accountId,\r\n apiKey,\r\n extendToken,\r\n shellBaseUrl,\r\n debug,\r\n });\r\n}\r\n\r\n/**\r\n * SDK Version\r\n */\r\nexport const VERSION = '1.0.0';\r\n\r\n/**\r\n * Available API Scopes\r\n *\r\n * These map to lpApiAccess fields in app registration.\r\n * Request these scopes when initializing the SDK.\r\n *\r\n * @example\r\n * ```typescript\r\n * import { initializeSDK, Scopes } from '@lpextend/node-sdk';\r\n *\r\n * const sdk = await initializeSDK({\r\n * appId: 'my-app',\r\n * accountId: '12345678',\r\n * accessToken: token,\r\n * scopes: [\r\n * Scopes.SKILLS,\r\n * Scopes.USERS,\r\n * Scopes.AGENT_GROUPS,\r\n * Scopes.AI_STUDIO,\r\n * Scopes.MESSAGING_HISTORY,\r\n * ],\r\n * });\r\n * ```\r\n */\r\nexport const Scopes = {\r\n // Account Configuration\r\n SKILLS: 'skills',\r\n USERS: 'users',\r\n AGENT_GROUPS: 'agentGroups',\r\n PROFILES: 'profiles',\r\n LOBS: 'lobs',\r\n PREDEFINED_CONTENT: 'predefinedContent',\r\n AUTOMATIC_MESSAGES: 'automaticMessages',\r\n WORKING_HOURS: 'workingHours',\r\n SPECIAL_OCCASIONS: 'specialOccasions',\r\n CAMPAIGNS: 'campaigns',\r\n ENGAGEMENTS: 'engagements',\r\n\r\n // Messaging & Conversations\r\n MESSAGING_HISTORY: 'messagingHistory',\r\n MESSAGING_OPERATIONS: 'messagingOperations',\r\n CONNECT_TO_MESSAGING: 'connectToMessaging',\r\n\r\n // Agent & Reporting\r\n AGENT_METRICS: 'agentMetrics',\r\n AGENT_ACTIVITY: 'agentActivity',\r\n OUTBOUND_REPORTING: 'outboundReporting',\r\n\r\n // AI & Automation\r\n AI_STUDIO: 'aiStudio',\r\n CONVERSATION_BUILDER: 'conversationBuilder',\r\n CONVERSATION_ORCHESTRATOR: 'conversationOrchestrator',\r\n /** AI Studio Prompt Library (different from LP Prompts) */\r\n PROMPT_LIBRARY: 'promptLibrary',\r\n /** LP Prompts API (Prompt Library) */\r\n LP_PROMPTS: 'prompts',\r\n FAAS: 'faas',\r\n\r\n // Proactive\r\n PROACTIVE_MESSAGING: 'proactiveMessaging',\r\n} as const;\r\n\r\nexport type Scope = (typeof Scopes)[keyof typeof Scopes];\r\n\r\n// =============================================================================\r\n// Shell Token Retrieval (for child apps)\r\n// =============================================================================\r\n\r\nimport type { ShellTokenConfig, ShellTokenResponse } from './types';\r\nimport { LPExtendSDKError, ErrorCodes } from './types';\r\n\r\n/**\r\n * Retrieve LP Bearer token from the shell\r\n *\r\n * Child apps call this function to get the LP access token for making\r\n * direct LP API calls. The shell stores tokens on user login and provides\r\n * them to authenticated child apps.\r\n *\r\n * @param config - Shell token configuration\r\n * @returns Promise resolving to LP token data\r\n * @throws LPExtendSDKError if retrieval fails\r\n *\r\n * @example\r\n * ```typescript\r\n * import { getShellToken } from '@lpextend/client-sdk';\r\n *\r\n * // Get shell token from URL params or postMessage\r\n * const shellToken = new URLSearchParams(window.location.search).get('shellToken');\r\n *\r\n * const lpToken = await getShellToken({\r\n * shellBaseUrl: 'https://lp-extend.example.com',\r\n * accountId: '12345678',\r\n * shellToken: shellToken,\r\n * appId: 'my-app',\r\n * });\r\n *\r\n * // Now use the LP token to initialize the SDK\r\n * const sdk = await initializeSDK({\r\n * appId: 'my-app',\r\n * accountId: lpToken.accountId,\r\n * accessToken: lpToken.accessToken,\r\n * scopes: [Scopes.SKILLS, Scopes.USERS],\r\n * });\r\n * ```\r\n */\r\nexport async function getShellToken(config: ShellTokenConfig): Promise<ShellTokenResponse> {\r\n const { shellBaseUrl, accountId, shellToken, appId, scopes, timeout = 10000 } = config;\r\n\r\n // Validate required config\r\n if (!shellBaseUrl) {\r\n throw new LPExtendSDKError('shellBaseUrl is required', ErrorCodes.INVALID_CONFIG);\r\n }\r\n if (!accountId) {\r\n throw new LPExtendSDKError('accountId is required', ErrorCodes.INVALID_CONFIG);\r\n }\r\n if (!shellToken) {\r\n throw new LPExtendSDKError('shellToken is required', ErrorCodes.INVALID_CONFIG);\r\n }\r\n if (!appId) {\r\n throw new LPExtendSDKError('appId is required', ErrorCodes.INVALID_CONFIG);\r\n }\r\n\r\n const url = `${shellBaseUrl.replace(/\\/$/, '')}/api/v1/shell/token/${accountId}/lp-token`;\r\n\r\n const controller = new AbortController();\r\n const timeoutId = setTimeout(() => controller.abort(), timeout);\r\n\r\n try {\r\n const response = await fetch(url, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'X-Shell-Token': shellToken,\r\n },\r\n body: JSON.stringify({\r\n appId,\r\n scopes,\r\n }),\r\n signal: controller.signal,\r\n });\r\n\r\n clearTimeout(timeoutId);\r\n\r\n if (!response.ok) {\r\n const errorData = await response.json().catch(() => ({}));\r\n\r\n if (response.status === 401) {\r\n throw new LPExtendSDKError(\r\n errorData.message || 'Shell token invalid or expired',\r\n ErrorCodes.UNAUTHORIZED,\r\n response.status,\r\n errorData\r\n );\r\n }\r\n\r\n if (response.status === 403) {\r\n throw new LPExtendSDKError(\r\n errorData.message || 'App not installed or disabled',\r\n ErrorCodes.APP_NOT_REGISTERED,\r\n response.status,\r\n errorData\r\n );\r\n }\r\n\r\n if (response.status === 404) {\r\n throw new LPExtendSDKError(\r\n errorData.message || 'No LP token found for user',\r\n ErrorCodes.NOT_FOUND,\r\n response.status,\r\n errorData\r\n );\r\n }\r\n\r\n throw new LPExtendSDKError(\r\n errorData.message || `Shell token request failed: ${response.status}`,\r\n ErrorCodes.API_ERROR,\r\n response.status,\r\n errorData\r\n );\r\n }\r\n\r\n const data: ShellTokenResponse = await response.json();\r\n return data;\r\n } catch (error) {\r\n clearTimeout(timeoutId);\r\n\r\n if (error instanceof LPExtendSDKError) {\r\n throw error;\r\n }\r\n\r\n if (error instanceof Error && error.name === 'AbortError') {\r\n throw new LPExtendSDKError('Shell token request timed out', ErrorCodes.TIMEOUT);\r\n }\r\n\r\n throw new LPExtendSDKError(\r\n `Failed to retrieve shell token: ${error instanceof Error ? error.message : 'Unknown error'}`,\r\n ErrorCodes.API_ERROR\r\n );\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/types/index.ts","../src/domains.ts","../src/http.ts","../src/api/account-config.api.ts","../src/api/ai-studio.api.ts","../src/api/messaging.api.ts","../src/api/sentinel.api.ts","../src/api/prompts.api.ts","../src/api/conversation-builder.api.ts","../src/sdk.ts","../src/index.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["/**\r\n * LP Extend Client SDK - Type Definitions Index\r\n *\r\n * Re-exports all types from domain-specific type files.\r\n */\r\n\r\n// Account Configuration Types\r\nexport * from './account-config.types';\r\n\r\n// Sentinel (LivePerson IDP) Types\r\nexport * from './sentinel.types';\r\n\r\n// LP Prompts (Prompt Library) Types\r\nexport * from './prompts.types';\r\n\r\n// Conversation Builder Types\r\nexport * from './conversation-builder.types';\r\n\r\n// AI Studio Types - explicit exports to avoid conflicts\r\nexport type {\r\n // Categories\r\n AIStudioCategory,\r\n CreateCategoryRequest,\r\n UpdateCategoryRequest,\r\n // Conversations (renamed to avoid conflict)\r\n AIStudioConversation,\r\n AIStudioMessage,\r\n CreateConversationRequest as AICreateConversationRequest,\r\n UpdateConversationRequest as AIUpdateConversationRequest,\r\n ConversationQueryParams,\r\n UpdateConversationAttributesRequest,\r\n // Summary\r\n SummaryRequest,\r\n BatchSummaryRequest,\r\n AIStudioSummary,\r\n // Query\r\n QueryGenerateRequest,\r\n QueryGenerateResponse,\r\n // Simulations\r\n AIStudioSimulation,\r\n SimulationConfig,\r\n SimulationTestCase,\r\n SimulationResults,\r\n CreateSimulationRequest,\r\n UpdateSimulationRequest,\r\n SimulationQueryParams,\r\n SimulationJobResult,\r\n // Transcript Analysis\r\n TranscriptAnalysis,\r\n TranscriptConversation,\r\n TranscriptQuestion,\r\n CreateTranscriptAnalysisRequest,\r\n UpdateTranscriptAnalysisRequest,\r\n // Knowledgebases\r\n Knowledgebase,\r\n KnowledgebaseHealth,\r\n KnowledgebaseSearchRequest,\r\n KnowledgebaseSearchResult,\r\n KnowledgebaseItem,\r\n KnowledgebaseTextItem,\r\n // Evaluators\r\n SimilarityEvaluationRequest,\r\n SimilarityEvaluationResponse,\r\n ResolutionEvaluationRequest,\r\n ResolutionEvaluationResponse,\r\n GuidedRoutingEvaluationRequest,\r\n GuidedRoute,\r\n GuidedRoutingEvaluationResponse,\r\n // Generators\r\n QuestionGeneratorRequest,\r\n QuestionGeneratorResponse,\r\n GeneratedQuestion,\r\n KAIRouteGeneratorRequest,\r\n KAIRouteGeneratorResponse,\r\n GeneratedRoute,\r\n KAIRouteGenerationStatus,\r\n // Prompt Library\r\n Prompt,\r\n PromptVariable,\r\n CreatePromptRequest,\r\n UpdatePromptRequest,\r\n LLMProvider,\r\n LLMModel,\r\n // Users\r\n AIStudioUser,\r\n CreateAIStudioUserRequest,\r\n UpdateAIStudioUserRequest,\r\n UpdateAIStudioUserModelsRequest,\r\n // Flows\r\n AIStudioFlow,\r\n InvokeFlowRequest,\r\n InvokeFlowResponse,\r\n} from './ai-studio.types';\r\n\r\n// Messaging Types - explicit exports to avoid conflicts\r\nexport type {\r\n // Messaging History\r\n MessagingConversation,\r\n ConversationParticipant,\r\n ConsumerParticipant,\r\n AgentParticipant,\r\n ConversationTransfer,\r\n ConversationInteraction,\r\n MessageRecord,\r\n MessageData,\r\n TextMessage,\r\n FileMessage,\r\n RichContentMessage,\r\n ConversationSummary,\r\n SDERecord,\r\n SDEEvent,\r\n CoBrowseSession,\r\n SurveyRecord,\r\n MessagingHistoryQuery,\r\n ContentToRetrieve,\r\n MessagingHistoryResponse,\r\n MessagingInteraction,\r\n // Agent Metrics\r\n AgentMetrics,\r\n AgentStatus,\r\n AgentMetricsQuery,\r\n // Agent Activity\r\n AgentActivity,\r\n ActivityRecord,\r\n AgentActivityQuery,\r\n // Operations\r\n TransferConversationRequest,\r\n CloseConversationRequest,\r\n SendMessageRequest,\r\n // Connect to Messaging (renamed to avoid conflict)\r\n CreateConversationRequest as MessagingCreateConversationRequest,\r\n ConsumerProfile,\r\n ConversationContext,\r\n CreateConversationResponse,\r\n // Outbound\r\n OutboundCampaignReport,\r\n OutboundReportQuery,\r\n} from './messaging.types';\r\n\r\n// =============================================================================\r\n// SDK Configuration\r\n// =============================================================================\r\n\r\n/**\r\n * Configuration options for initializing the SDK\r\n */\r\nexport interface LPExtendSDKConfig {\r\n /**\r\n * Your registered app ID from LP Extend\r\n * @example 'my-qa-app'\r\n */\r\n appId: string;\r\n\r\n /**\r\n * LivePerson account ID\r\n * @example '12345678'\r\n */\r\n accountId: string;\r\n\r\n /**\r\n * LP Access token (obtained from shell auth)\r\n * This is the user's LP bearer token passed to the child app.\r\n *\r\n * Either provide this directly OR provide extendToken OR provide shellToken OR provide apiKey.\r\n */\r\n accessToken?: string;\r\n\r\n /**\r\n * LP Extend API Key (RECOMMENDED for backend apps)\r\n * Your app's API key from LP Extend shell registration.\r\n * SDK will authenticate with shell and get LP access token.\r\n *\r\n * Set via environment variable: LPEXTEND_API_KEY\r\n * @example 'lpx_my-app_abc123...'\r\n */\r\n apiKey?: string;\r\n\r\n /**\r\n * ExtendJWT token (for iframe apps receiving token from shell)\r\n * Encrypted JWT from shell containing all auth data.\r\n * SDK will verify with shell and get LP access token.\r\n *\r\n * @example Received via URL params: ?extendToken=xxx\r\n */\r\n extendToken?: string;\r\n\r\n /**\r\n * Shell JWT token (X-Shell-Token) - LEGACY\r\n * If provided instead of accessToken, the SDK will automatically\r\n * fetch the LP access token from the shell during initialization.\r\n *\r\n * @example Received via URL params: ?shellToken=xxx\r\n * @deprecated Use apiKey for backend apps or extendToken for iframe apps\r\n */\r\n shellToken?: string;\r\n\r\n /**\r\n * Shell backend base URL\r\n * Required when using apiKey, extendToken, or shellToken for automatic token retrieval.\r\n * @default Derived from window.location.origin, parent frame, or LPEXTEND_SHELL_URL env var\r\n * @example 'https://lp-extend.example.com'\r\n */\r\n shellBaseUrl?: string;\r\n\r\n /**\r\n * Scopes your app requests access to\r\n * These are validated against app registration\r\n * @example ['skills', 'users', 'agentGroups']\r\n */\r\n scopes?: string[];\r\n\r\n /**\r\n * Enable debug logging\r\n * @default false\r\n */\r\n debug?: boolean;\r\n\r\n /**\r\n * Request timeout in milliseconds\r\n * @default 30000\r\n */\r\n timeout?: number;\r\n}\r\n\r\n/**\r\n * SDK initialization result\r\n */\r\nexport interface SDKInitResult {\r\n /** App ID confirmed by shell */\r\n appId: string;\r\n /** Account ID */\r\n accountId: string;\r\n /** Scopes granted based on app registration */\r\n grantedScopes: string[];\r\n /** App name from registration */\r\n appName: string;\r\n /** App version */\r\n version?: string;\r\n}\r\n\r\n// =============================================================================\r\n// API Response Types\r\n// =============================================================================\r\n\r\n/**\r\n * Standard API response wrapper\r\n */\r\nexport interface APIResponse<T> {\r\n /** Response data */\r\n data: T;\r\n /** Revision number for optimistic locking (used for updates/deletes) */\r\n revision?: string;\r\n}\r\n\r\n/**\r\n * Paginated response\r\n */\r\nexport interface PaginatedResponse<T> {\r\n /** Array of items */\r\n items: T[];\r\n /** Total count */\r\n total: number;\r\n /** Current offset */\r\n offset: number;\r\n /** Page size */\r\n limit: number;\r\n /** Next page token if available */\r\n nextOffset?: number;\r\n}\r\n\r\n// =============================================================================\r\n// Error Types\r\n// =============================================================================\r\n\r\n/**\r\n * SDK Error\r\n */\r\nexport class LPExtendSDKError extends Error {\r\n constructor(\r\n message: string,\r\n public readonly code: string,\r\n public readonly status?: number,\r\n public readonly details?: Record<string, unknown>\r\n ) {\r\n super(message);\r\n this.name = 'LPExtendSDKError';\r\n }\r\n}\r\n\r\n/**\r\n * Error codes\r\n */\r\nexport const ErrorCodes = {\r\n /** Not running inside shell iframe */\r\n NOT_IN_SHELL: 'NOT_IN_SHELL',\r\n /** SDK initialization failed */\r\n INIT_FAILED: 'INIT_FAILED',\r\n /** App not registered or disabled */\r\n APP_NOT_REGISTERED: 'APP_NOT_REGISTERED',\r\n /** Authentication failed */\r\n UNAUTHORIZED: 'UNAUTHORIZED',\r\n /** Scope not granted - update app registration */\r\n SCOPE_DENIED: 'SCOPE_DENIED',\r\n /** Resource not found */\r\n NOT_FOUND: 'NOT_FOUND',\r\n /** API call failed */\r\n API_ERROR: 'API_ERROR',\r\n /** Request timeout */\r\n TIMEOUT: 'TIMEOUT',\r\n /** Invalid configuration */\r\n INVALID_CONFIG: 'INVALID_CONFIG',\r\n /** Revision conflict - resource was modified */\r\n REVISION_CONFLICT: 'REVISION_CONFLICT',\r\n /** Rate limit exceeded */\r\n RATE_LIMITED: 'RATE_LIMITED',\r\n} as const;\r\n\r\nexport type ErrorCode = (typeof ErrorCodes)[keyof typeof ErrorCodes];\r\n\r\n// =============================================================================\r\n// Shell Token Types (for child apps retrieving LP tokens from shell)\r\n// =============================================================================\r\n\r\n/**\r\n * Configuration for retrieving LP token from shell\r\n */\r\nexport interface ShellTokenConfig {\r\n /**\r\n * Shell backend base URL\r\n * @example 'https://lp-extend.example.com'\r\n */\r\n shellBaseUrl: string;\r\n\r\n /**\r\n * LP Account ID\r\n * @example '12345678'\r\n */\r\n accountId: string;\r\n\r\n /**\r\n * Shell JWT token (X-Shell-Token)\r\n * Received from shell via postMessage or URL params\r\n */\r\n shellToken: string;\r\n\r\n /**\r\n * Your registered app ID\r\n * @example 'my-qa-app'\r\n */\r\n appId: string;\r\n\r\n /**\r\n * Optional scopes to request validation for\r\n */\r\n scopes?: string[];\r\n\r\n /**\r\n * Request timeout in milliseconds\r\n * @default 10000\r\n */\r\n timeout?: number;\r\n}\r\n\r\n/**\r\n * User profile data returned with LP token\r\n */\r\nexport interface ShellTokenUser {\r\n id: string;\r\n fullName?: string;\r\n email?: string;\r\n loginName?: string;\r\n profileIds?: number[];\r\n skillIds?: number[];\r\n}\r\n\r\n/**\r\n * Response from shell token retrieval\r\n */\r\nexport interface ShellTokenResponse {\r\n /** LP Bearer access token for API calls */\r\n accessToken: string;\r\n /** Token expiration timestamp (Unix ms) */\r\n expiresAt: number;\r\n /** LP Account ID */\r\n accountId: string;\r\n /** LP User ID */\r\n userId: string;\r\n /** User profile data */\r\n user?: ShellTokenUser;\r\n /**\r\n * Conversation Builder API token\r\n * Used for authenticating CB API calls\r\n */\r\n cbToken?: string;\r\n /**\r\n * Conversation Builder organization ID\r\n * Required for CB API calls\r\n */\r\n cbOrg?: string;\r\n}\r\n\r\n// =============================================================================\r\n// ExtendJWT Types (New unified auth)\r\n// =============================================================================\r\n\r\n/**\r\n * Response from ExtendJWT verification\r\n * Child apps call shell's /api/v2/auth/verify-child endpoint\r\n */\r\nexport interface ExtendJWTVerifyResponse {\r\n /** Verification success */\r\n valid: boolean;\r\n /** LP Bearer access token for API calls */\r\n lpAccessToken: string;\r\n /** LP User ID */\r\n lpUserId: string;\r\n /** LP Account ID */\r\n lpAccountId: string;\r\n /** Is LPA user */\r\n isLPA: boolean;\r\n /** Conversation Builder token */\r\n cbToken?: string;\r\n /** Conversation Builder org */\r\n cbOrg?: string;\r\n /** Token expiration timestamp (Unix ms) */\r\n expiresAt: number;\r\n /** Time until expiry in ms */\r\n expiresIn: number;\r\n}\r\n\r\n// =============================================================================\r\n// API Key Authentication Types\r\n// =============================================================================\r\n\r\n/**\r\n * Response from API key authentication\r\n * Child apps call shell's /api/v1/apps/auth endpoint with API key\r\n */\r\nexport interface ApiKeyAuthResponse {\r\n /** Authentication success */\r\n authenticated: boolean;\r\n /** LP Bearer access token for API calls */\r\n lpAccessToken: string;\r\n /** LP User ID */\r\n lpUserId: string;\r\n /** LP Account ID */\r\n lpAccountId: string;\r\n /** Is LPA user */\r\n isLPA: boolean;\r\n /** APIs this app has access to */\r\n allowedApis: string[];\r\n /** App name from registration */\r\n appName: string;\r\n /** Conversation Builder token */\r\n cbToken?: string;\r\n /** Conversation Builder org */\r\n cbOrg?: string;\r\n /** Token expiration timestamp (Unix ms) */\r\n expiresAt: number;\r\n}\r\n","/**\r\n * LP Domain Resolution (CSDS)\r\n *\r\n * Resolves LivePerson service domains using the CSDS API.\r\n * Caches domains per account to minimize API calls.\r\n */\r\n\r\n/**\r\n * Base URI response from CSDS\r\n */\r\nexport interface BaseURI {\r\n account: string;\r\n service: string;\r\n baseURI: string;\r\n}\r\n\r\n/**\r\n * Zone/region mapping\r\n */\r\nconst ZONE_MAP: Record<string, string> = {\r\n va: 'z1', // US\r\n lo: 'z2', // EU\r\n sy: 'z3', // AU/APAC\r\n};\r\n\r\nconst GEO_MAP: Record<string, string> = {\r\n z1: 'p-us',\r\n z2: 'p-eu',\r\n z3: 'p-au',\r\n};\r\n\r\n/**\r\n * Domain cache - simple in-memory cache\r\n */\r\nconst domainCache: Map<string, { domains: BaseURI[]; expires: number }> = new Map();\r\nconst CACHE_TTL_MS = 60 * 60 * 1000; // 1 hour\r\n\r\n/**\r\n * Domain Resolver\r\n *\r\n * Resolves LP service domains using CSDS API.\r\n */\r\nexport class DomainResolver {\r\n private accountId: string;\r\n private region: string | null = null;\r\n private zone: string | null = null;\r\n private geo: string | null = null;\r\n\r\n constructor(accountId: string) {\r\n this.accountId = accountId;\r\n }\r\n\r\n /**\r\n * Get domain for a specific LP service\r\n */\r\n async getDomain(service: string): Promise<string | null> {\r\n const domains = await this.getDomains();\r\n const domain = domains.find((d) => d.service === service);\r\n return domain?.baseURI || null;\r\n }\r\n\r\n /**\r\n * Get all domains for the account\r\n */\r\n async getDomains(): Promise<BaseURI[]> {\r\n // Check cache first\r\n const cached = domainCache.get(this.accountId);\r\n if (cached && cached.expires > Date.now()) {\r\n return cached.domains;\r\n }\r\n\r\n // Fetch from CSDS\r\n const response = await fetch(\r\n `https://api.liveperson.net/api/account/${this.accountId}/service/baseURI.json?version=1.0`,\r\n {\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n },\r\n }\r\n );\r\n\r\n if (!response.ok) {\r\n throw new Error(`Failed to fetch domains: ${response.status} ${response.statusText}`);\r\n }\r\n\r\n const data = await response.json();\r\n const domains: BaseURI[] = data.baseURIs || [];\r\n\r\n // Determine region/zone from asyncMessagingEnt domain\r\n const asyncMessagingEnt = domains.find((d) => d.service === 'asyncMessagingEnt');\r\n if (asyncMessagingEnt) {\r\n this.region = asyncMessagingEnt.baseURI.split('.')[0];\r\n this.zone = ZONE_MAP[this.region] || null;\r\n this.geo = this.zone ? GEO_MAP[this.zone] : null;\r\n\r\n // Add additional domains not in CSDS\r\n if (this.zone && this.region && this.geo) {\r\n const additionalDomains = this.getAdditionalDomains();\r\n for (const additional of additionalDomains) {\r\n if (!domains.find((d) => d.service === additional.service)) {\r\n domains.push(additional);\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Cache the domains\r\n domainCache.set(this.accountId, {\r\n domains,\r\n expires: Date.now() + CACHE_TTL_MS,\r\n });\r\n\r\n return domains;\r\n }\r\n\r\n /**\r\n * Get additional domains not in CSDS\r\n */\r\n private getAdditionalDomains(): BaseURI[] {\r\n if (!this.zone || !this.region || !this.geo) {\r\n return [];\r\n }\r\n\r\n return [\r\n {\r\n account: this.accountId,\r\n service: 'aiStudioPlatformService',\r\n baseURI: `aistudio-${this.geo}.liveperson.net`,\r\n },\r\n {\r\n account: this.accountId,\r\n service: 'proactive',\r\n baseURI: `proactive-messaging.${this.zone}.fs.liveperson.com`,\r\n },\r\n {\r\n account: this.accountId,\r\n service: 'botlogs',\r\n baseURI: `${this.region}.bc-bot.liveperson.net`,\r\n },\r\n {\r\n account: this.accountId,\r\n service: 'bot',\r\n baseURI: `${this.region}.bc-bot.liveperson.net`,\r\n },\r\n {\r\n account: this.accountId,\r\n service: 'botPlatform',\r\n baseURI: `${this.region}.bc-platform.liveperson.net`,\r\n },\r\n {\r\n account: this.accountId,\r\n service: 'kb',\r\n baseURI: `${this.region}.bc-kb.liveperson.net`,\r\n },\r\n {\r\n account: this.accountId,\r\n service: 'context',\r\n baseURI: `${this.region}.context.liveperson.net`,\r\n },\r\n {\r\n account: this.accountId,\r\n service: 'recommendation',\r\n baseURI: `${this.zone}.askmaven.liveperson.net`,\r\n },\r\n {\r\n account: this.accountId,\r\n service: 'proactiveHandoff',\r\n baseURI: `${this.region}.handoff.liveperson.net`,\r\n },\r\n {\r\n account: this.accountId,\r\n service: 'convBuild',\r\n baseURI: `${this.region}.bc-sso.liveperson.net`,\r\n },\r\n {\r\n account: this.accountId,\r\n service: 'bcmgmt',\r\n baseURI: `${this.region}.bc-mgmt.liveperson.net`,\r\n },\r\n {\r\n account: this.accountId,\r\n service: 'bcintg',\r\n baseURI: `${this.region}.bc-intg.liveperson.net`,\r\n },\r\n {\r\n account: this.accountId,\r\n service: 'bcnlu',\r\n baseURI: `${this.region}.bc-nlu.liveperson.net`,\r\n },\r\n {\r\n account: this.accountId,\r\n service: 'promptlibrary',\r\n baseURI: `${this.geo}.promptlibrary.liveperson.net`,\r\n },\r\n // Conversation Builder domains (aliases for consistency with CB service naming)\r\n {\r\n account: this.accountId,\r\n service: 'cbBotPlatform',\r\n baseURI: `${this.region}.bc-platform.liveperson.net`,\r\n },\r\n {\r\n account: this.accountId,\r\n service: 'cbIbc',\r\n baseURI: `${this.region}.bc-nlu.liveperson.net`,\r\n },\r\n {\r\n account: this.accountId,\r\n service: 'cbKb',\r\n baseURI: `${this.region}.bc-kb.liveperson.net`,\r\n },\r\n {\r\n account: this.accountId,\r\n service: 'cbMonitoring',\r\n baseURI: `${this.region}.bc-mgmt.liveperson.net`,\r\n },\r\n {\r\n account: this.accountId,\r\n service: 'cbExternalIntegrations',\r\n baseURI: `${this.region}.bc-intg.liveperson.net`,\r\n },\r\n {\r\n account: this.accountId,\r\n service: 'cbAiSearch',\r\n baseURI: `${this.region}.kai.liveperson.net`,\r\n },\r\n ];\r\n }\r\n\r\n /**\r\n * Clear cached domains for this account\r\n */\r\n clearCache(): void {\r\n domainCache.delete(this.accountId);\r\n }\r\n}\r\n\r\n/**\r\n * Create a domain resolver for an account\r\n */\r\nexport function createDomainResolver(accountId: string): DomainResolver {\r\n return new DomainResolver(accountId);\r\n}\r\n\r\n/**\r\n * Clear all cached domains\r\n */\r\nexport function clearAllDomainCache(): void {\r\n domainCache.clear();\r\n}\r\n","/**\r\n * HTTP Client\r\n *\r\n * Makes HTTP requests directly to LivePerson APIs.\r\n * Handles domain resolution, authentication, and revision management.\r\n * Supports both Bearer (standard LP) and CC-Bearer (AI Studio) auth modes.\r\n */\r\n\r\nimport type { APIResponse } from './types';\r\nimport { LPExtendSDKError, ErrorCodes } from './types';\r\nimport { DomainResolver } from './domains';\r\n\r\n/**\r\n * HTTP method types\r\n */\r\ntype HTTPMethod = 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';\r\n\r\n/**\r\n * Auth mode for LP APIs\r\n */\r\nexport type AuthMode = 'bearer' | 'cc-bearer';\r\n\r\n/**\r\n * Request options\r\n */\r\nexport interface RequestOptions {\r\n body?: unknown;\r\n headers?: Record<string, string>;\r\n params?: Record<string, string | number | boolean | undefined>;\r\n /** Revision for optimistic locking (If-Match header) */\r\n revision?: string;\r\n /** Auth mode override (default: bearer) */\r\n authMode?: AuthMode;\r\n /** Custom timeout for this request */\r\n timeout?: number;\r\n}\r\n\r\n/**\r\n * Scope configuration - maps SDK scopes to LP services and URL patterns\r\n */\r\ninterface ScopeConfig {\r\n service: string;\r\n pathPrefix: string;\r\n authType?: AuthMode;\r\n urlPattern: 'accountConfig' | 'messaging' | 'aiStudio' | 'prompts' | 'custom';\r\n}\r\n\r\n/**\r\n * Scope to LP service mapping\r\n */\r\nconst SCOPE_CONFIG: Record<string, ScopeConfig> = {\r\n // Account Configuration APIs (Bearer auth)\r\n skills: { service: 'accountConfigReadOnly', pathPrefix: '/le-users/skills', urlPattern: 'accountConfig' },\r\n users: { service: 'accountConfigReadOnly', pathPrefix: '/le-users/users', urlPattern: 'accountConfig' },\r\n agentGroups: { service: 'accountConfigReadOnly', pathPrefix: '/le-users/agentGroups', urlPattern: 'accountConfig' },\r\n profiles: { service: 'accountConfigReadOnly', pathPrefix: '/le-users/profiles', urlPattern: 'accountConfig' },\r\n lobs: { service: 'accountConfigReadOnly', pathPrefix: '/le-users/lobs', urlPattern: 'accountConfig' },\r\n predefinedContent: { service: 'accountConfigReadOnly', pathPrefix: '/le-predefined-content/predefinedContent', urlPattern: 'accountConfig' },\r\n automaticMessages: { service: 'accountConfigReadOnly', pathPrefix: '/le-campaigns/automatic-messages', urlPattern: 'accountConfig' },\r\n workingHours: { service: 'accountConfigReadOnly', pathPrefix: '/le-users/working-hours', urlPattern: 'accountConfig' },\r\n specialOccasions: { service: 'accountConfigReadOnly', pathPrefix: '/le-users/special-occasions', urlPattern: 'accountConfig' },\r\n campaigns: { service: 'accountConfigReadOnly', pathPrefix: '/le-campaigns/campaigns', urlPattern: 'accountConfig' },\r\n engagements: { service: 'accountConfigReadOnly', pathPrefix: '/le-campaigns/campaigns', urlPattern: 'accountConfig' },\r\n\r\n // AI Studio APIs (CC-Bearer auth)\r\n aiStudio: { service: 'aiStudioPlatformService', pathPrefix: '', authType: 'cc-bearer', urlPattern: 'aiStudio' },\r\n promptLibrary: { service: 'aiStudioPlatformService', pathPrefix: '', authType: 'cc-bearer', urlPattern: 'aiStudio' },\r\n\r\n // Messaging APIs\r\n messagingHistory: { service: 'msgHist', pathPrefix: '/messaging_history/api/account', urlPattern: 'messaging' },\r\n messagingOperations: { service: 'asyncMessagingEnt', pathPrefix: '/api/account', urlPattern: 'messaging' },\r\n connectToMessaging: { service: 'asyncMessagingEnt', pathPrefix: '/api/account', urlPattern: 'messaging' },\r\n agentMetrics: { service: 'leDataReporting', pathPrefix: '/operations/api/account', urlPattern: 'messaging' },\r\n agentActivity: { service: 'leDataReporting', pathPrefix: '/operations/api/account', urlPattern: 'messaging' },\r\n outboundReporting: { service: 'leDataReporting', pathPrefix: '/operations/api/account', urlPattern: 'messaging' },\r\n\r\n // Other LP APIs\r\n conversationOrchestrator: { service: 'maven', pathPrefix: '/v1/account', urlPattern: 'messaging' },\r\n faas: { service: 'faasUI', pathPrefix: '/api/account', urlPattern: 'messaging' },\r\n proactiveMessaging: { service: 'proactive', pathPrefix: '/api', urlPattern: 'custom' },\r\n\r\n // LP Prompt Library (separate from AI Studio Prompt Library)\r\n prompts: { service: 'promptlibrary', pathPrefix: '/v2', urlPattern: 'prompts' },\r\n};\r\n\r\n/**\r\n * Write operations use accountConfigReadWrite domain\r\n */\r\nconst WRITE_SERVICE = 'accountConfigReadWrite';\r\n\r\n/**\r\n * HTTP Client for direct LP API calls\r\n *\r\n * All requests go directly to LivePerson APIs.\r\n * Domain resolution is handled via CSDS.\r\n * The shell is only consulted for scope validation during SDK init.\r\n */\r\nexport class HTTPClient {\r\n private readonly domainResolver: DomainResolver;\r\n\r\n constructor(\r\n private readonly accountId: string,\r\n private readonly accessToken: string,\r\n private readonly defaultTimeout: number,\r\n private readonly debug: boolean\r\n ) {\r\n this.domainResolver = new DomainResolver(accountId);\r\n }\r\n\r\n /**\r\n * Make a GET request\r\n */\r\n async get<T>(path: string, options?: RequestOptions): Promise<APIResponse<T>> {\r\n return this.request<T>('GET', path, options);\r\n }\r\n\r\n /**\r\n * Make a POST request\r\n */\r\n async post<T>(path: string, body?: unknown, options?: RequestOptions): Promise<APIResponse<T>> {\r\n return this.request<T>('POST', path, { ...options, body });\r\n }\r\n\r\n /**\r\n * Make a PUT request\r\n */\r\n async put<T>(path: string, body?: unknown, options?: RequestOptions): Promise<APIResponse<T>> {\r\n return this.request<T>('PUT', path, { ...options, body });\r\n }\r\n\r\n /**\r\n * Make a DELETE request\r\n */\r\n async delete<T>(path: string, options?: RequestOptions): Promise<APIResponse<T>> {\r\n return this.request<T>('DELETE', path, options);\r\n }\r\n\r\n /**\r\n * Make a PATCH request\r\n */\r\n async patch<T>(path: string, body?: unknown, options?: RequestOptions): Promise<APIResponse<T>> {\r\n return this.request<T>('PATCH', path, { ...options, body });\r\n }\r\n\r\n /**\r\n * Create a scoped client for a specific API domain\r\n * This allows setting default options like authMode for all requests\r\n */\r\n withDefaults(defaults: Partial<RequestOptions>): ScopedHTTPClient {\r\n return new ScopedHTTPClient(this, defaults);\r\n }\r\n\r\n /**\r\n * Build the full URL for an LP API endpoint\r\n */\r\n private async buildUrl(\r\n path: string,\r\n scopeConfig: ScopeConfig,\r\n isWrite: boolean\r\n ): Promise<string> {\r\n // Determine which service to use (read vs write for account config)\r\n const serviceName =\r\n isWrite && scopeConfig.service.startsWith('accountConfig')\r\n ? WRITE_SERVICE\r\n : scopeConfig.service;\r\n\r\n const domain = await this.domainResolver.getDomain(serviceName);\r\n if (!domain) {\r\n throw new LPExtendSDKError(\r\n `Could not resolve domain for service: ${serviceName}`,\r\n ErrorCodes.API_ERROR\r\n );\r\n }\r\n\r\n let url: string;\r\n\r\n switch (scopeConfig.urlPattern) {\r\n case 'accountConfig':\r\n // Standard account config: https://{domain}/api/account/{accountId}/configuration{pathPrefix}{path}\r\n url = `https://${domain}/api/account/${this.accountId}/configuration${scopeConfig.pathPrefix}`;\r\n break;\r\n\r\n case 'messaging':\r\n // Messaging/Reporting: https://{domain}{pathPrefix}/{accountId}{path}\r\n url = `https://${domain}${scopeConfig.pathPrefix}/${this.accountId}`;\r\n break;\r\n\r\n case 'aiStudio':\r\n // AI Studio: https://{domain}/api/v2{path}\r\n // Note: account_id is passed as query param where needed, not in path\r\n url = `https://${domain}/api/v2`;\r\n break;\r\n\r\n case 'prompts':\r\n // LP Prompt Library has special path transformations:\r\n // /system -> /v2/system/prompts\r\n // /account -> /v2/accounts/{accountId}/prompts\r\n // /account/{id} -> /v2/accounts/{accountId}/prompts/{id}\r\n // /llm-providers -> /v2/accounts/{accountId}/configurations/llm-providers\r\n url = `https://${domain}${scopeConfig.pathPrefix}`;\r\n // Path transformation happens via the path parameter\r\n if (path.startsWith('/system')) {\r\n url += `/system/prompts${path.substring('/system'.length)}`;\r\n return url;\r\n } else if (path.startsWith('/account')) {\r\n url += `/accounts/${this.accountId}/prompts${path.substring('/account'.length)}`;\r\n return url;\r\n } else if (path.startsWith('/llm-providers')) {\r\n url += `/accounts/${this.accountId}/configurations/llm-providers${path.substring('/llm-providers'.length)}`;\r\n return url;\r\n }\r\n break;\r\n\r\n case 'custom':\r\n default:\r\n // Custom pattern\r\n url = `https://${domain}${scopeConfig.pathPrefix}`;\r\n break;\r\n }\r\n\r\n // Append the path\r\n if (path) {\r\n url += path.startsWith('/') ? path : `/${path}`;\r\n }\r\n\r\n return url;\r\n }\r\n\r\n /**\r\n * Determine scope from path\r\n */\r\n private getScopeFromPath(path: string): string {\r\n // Extract scope from path like /skills, /users, /ai-studio/...\r\n const normalizedPath = path.startsWith('/') ? path.substring(1) : path;\r\n const firstSegment = normalizedPath.split('/')[0];\r\n\r\n // Check for prompts prefix (LP Prompt Library)\r\n if (firstSegment === 'prompts') {\r\n return 'prompts';\r\n }\r\n\r\n // Check for ai-studio prefix\r\n if (firstSegment === 'ai-studio' || normalizedPath.startsWith('ai-studio')) {\r\n return 'aiStudio';\r\n }\r\n\r\n // Check for messaging prefix\r\n if (firstSegment === 'messaging') {\r\n const secondSegment = normalizedPath.split('/')[1];\r\n if (secondSegment === 'history') return 'messagingHistory';\r\n if (secondSegment === 'agent-metrics') return 'agentMetrics';\r\n if (secondSegment === 'agent-activity') return 'agentActivity';\r\n if (secondSegment === 'operations') return 'messagingOperations';\r\n if (secondSegment === 'connect') return 'connectToMessaging';\r\n if (secondSegment === 'outbound') return 'outboundReporting';\r\n return 'messagingHistory'; // default\r\n }\r\n\r\n // Map path segment to scope\r\n const scopeMap: Record<string, string> = {\r\n skills: 'skills',\r\n users: 'users',\r\n 'agent-groups': 'agentGroups',\r\n profiles: 'profiles',\r\n lobs: 'lobs',\r\n campaigns: 'campaigns',\r\n engagements: 'engagements',\r\n 'predefined-content': 'predefinedContent',\r\n 'automatic-messages': 'automaticMessages',\r\n 'working-hours': 'workingHours',\r\n 'special-occasions': 'specialOccasions',\r\n };\r\n\r\n return scopeMap[firstSegment] || firstSegment;\r\n }\r\n\r\n /**\r\n * Make HTTP request to LP API\r\n */\r\n private async request<T>(\r\n method: HTTPMethod,\r\n path: string,\r\n options?: RequestOptions\r\n ): Promise<APIResponse<T>> {\r\n // Determine scope and config\r\n const scope = this.getScopeFromPath(path);\r\n const scopeConfig = SCOPE_CONFIG[scope];\r\n\r\n if (!scopeConfig) {\r\n throw new LPExtendSDKError(\r\n `Unknown scope: ${scope}. Path: ${path}`,\r\n ErrorCodes.SCOPE_DENIED\r\n );\r\n }\r\n\r\n // Determine if this is a write operation\r\n const isWrite = method !== 'GET';\r\n\r\n // Build the URL - strip the scope prefix from path since it's in pathPrefix\r\n const pathWithoutScope = this.stripScopeFromPath(path, scope);\r\n const url = await this.buildUrl(pathWithoutScope, scopeConfig, isWrite);\r\n\r\n // Add query params\r\n let fullUrl = url;\r\n if (options?.params) {\r\n const searchParams = new URLSearchParams();\r\n Object.entries(options.params).forEach(([key, value]) => {\r\n if (value !== undefined) {\r\n searchParams.set(key, String(value));\r\n }\r\n });\r\n const paramString = searchParams.toString();\r\n if (paramString) {\r\n fullUrl += (fullUrl.includes('?') ? '&' : '?') + paramString;\r\n }\r\n }\r\n\r\n // Build headers\r\n const authMode = options?.authMode || scopeConfig.authType || 'bearer';\r\n const authHeader =\r\n authMode === 'cc-bearer'\r\n ? `CC-Bearer ${this.accessToken}`\r\n : `Bearer ${this.accessToken}`;\r\n\r\n const headers: Record<string, string> = {\r\n 'Content-Type': 'application/json',\r\n Accept: 'application/json',\r\n Authorization: authHeader,\r\n ...options?.headers,\r\n };\r\n\r\n // Add If-Match header for optimistic locking\r\n if (options?.revision) {\r\n headers['If-Match'] = options.revision;\r\n }\r\n\r\n this.log(`${method} ${fullUrl}`, { scope, authMode });\r\n\r\n // Make request with timeout\r\n const timeout = options?.timeout || this.defaultTimeout;\r\n const controller = new AbortController();\r\n const timeoutId = setTimeout(() => controller.abort(), timeout);\r\n\r\n try {\r\n const response = await fetch(fullUrl, {\r\n method,\r\n headers,\r\n body: options?.body ? JSON.stringify(options.body) : undefined,\r\n signal: controller.signal,\r\n });\r\n\r\n clearTimeout(timeoutId);\r\n\r\n // Handle errors\r\n if (!response.ok) {\r\n await this.handleError(response);\r\n }\r\n\r\n // Handle empty responses (204 No Content, etc.)\r\n const contentType = response.headers.get('content-type');\r\n const hasJsonBody = contentType?.includes('application/json');\r\n\r\n let responseData: T | undefined;\r\n\r\n if (hasJsonBody && response.status !== 204) {\r\n responseData = await response.json();\r\n }\r\n\r\n // Get revision from response headers\r\n const revision =\r\n response.headers.get('ac-revision') ||\r\n response.headers.get('etag') ||\r\n response.headers.get('x-revision') ||\r\n undefined;\r\n\r\n return {\r\n data: responseData as T,\r\n revision: revision || undefined,\r\n };\r\n } catch (error) {\r\n clearTimeout(timeoutId);\r\n\r\n if ((error as Error).name === 'AbortError') {\r\n throw new LPExtendSDKError('Request timeout', ErrorCodes.TIMEOUT);\r\n }\r\n\r\n if (error instanceof LPExtendSDKError) {\r\n throw error;\r\n }\r\n\r\n throw new LPExtendSDKError((error as Error).message, ErrorCodes.API_ERROR);\r\n }\r\n }\r\n\r\n /**\r\n * Strip the scope prefix from the path\r\n */\r\n private stripScopeFromPath(path: string, scope: string): string {\r\n const normalizedPath = path.startsWith('/') ? path.substring(1) : path;\r\n\r\n // Map scope to path prefixes to strip\r\n const prefixMap: Record<string, string[]> = {\r\n skills: ['skills'],\r\n users: ['users'],\r\n agentGroups: ['agent-groups'],\r\n profiles: ['profiles'],\r\n lobs: ['lobs'],\r\n campaigns: ['campaigns'],\r\n engagements: ['engagements'],\r\n predefinedContent: ['predefined-content'],\r\n automaticMessages: ['automatic-messages'],\r\n workingHours: ['working-hours'],\r\n specialOccasions: ['special-occasions'],\r\n aiStudio: ['ai-studio'],\r\n messagingHistory: ['messaging/history'],\r\n agentMetrics: ['messaging/agent-metrics'],\r\n agentActivity: ['messaging/agent-activity'],\r\n messagingOperations: ['messaging/operations'],\r\n connectToMessaging: ['messaging/connect'],\r\n outboundReporting: ['messaging/outbound'],\r\n prompts: ['prompts'],\r\n };\r\n\r\n const prefixes = prefixMap[scope] || [];\r\n for (const prefix of prefixes) {\r\n if (normalizedPath.startsWith(prefix)) {\r\n const remaining = normalizedPath.substring(prefix.length);\r\n return remaining.startsWith('/') ? remaining : `/${remaining}`;\r\n }\r\n }\r\n\r\n return path;\r\n }\r\n\r\n /**\r\n * Handle HTTP error responses\r\n */\r\n private async handleError(response: Response): Promise<never> {\r\n const errorBody = await response.json().catch(() => ({ message: 'Unknown error' }));\r\n\r\n switch (response.status) {\r\n case 401:\r\n throw new LPExtendSDKError(\r\n 'Authentication failed',\r\n ErrorCodes.UNAUTHORIZED,\r\n response.status,\r\n errorBody\r\n );\r\n\r\n case 403:\r\n throw new LPExtendSDKError(\r\n errorBody.message || 'Access denied',\r\n ErrorCodes.SCOPE_DENIED,\r\n response.status,\r\n errorBody\r\n );\r\n\r\n case 404:\r\n throw new LPExtendSDKError(\r\n errorBody.message || 'Resource not found',\r\n ErrorCodes.NOT_FOUND,\r\n response.status,\r\n errorBody\r\n );\r\n\r\n case 409:\r\n throw new LPExtendSDKError(\r\n errorBody.message || 'Revision conflict - resource was modified',\r\n ErrorCodes.REVISION_CONFLICT,\r\n response.status,\r\n errorBody\r\n );\r\n\r\n case 429:\r\n throw new LPExtendSDKError(\r\n errorBody.message || 'Rate limit exceeded',\r\n ErrorCodes.RATE_LIMITED,\r\n response.status,\r\n errorBody\r\n );\r\n\r\n default:\r\n throw new LPExtendSDKError(\r\n `API Error: ${response.status} - ${errorBody.message || response.statusText}`,\r\n ErrorCodes.API_ERROR,\r\n response.status,\r\n errorBody\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Debug logging\r\n */\r\n private log(...args: unknown[]): void {\r\n if (this.debug) {\r\n console.log('[LP-Extend-SDK]', ...args);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Scoped HTTP client with preset defaults\r\n * Used for API modules that need specific auth modes\r\n */\r\nexport class ScopedHTTPClient {\r\n constructor(\r\n private readonly client: HTTPClient,\r\n private readonly defaults: Partial<RequestOptions>\r\n ) {}\r\n\r\n async get<T>(path: string, options?: RequestOptions): Promise<APIResponse<T>> {\r\n return this.client.get<T>(path, this.mergeOptions(options));\r\n }\r\n\r\n async post<T>(path: string, body?: unknown, options?: RequestOptions): Promise<APIResponse<T>> {\r\n return this.client.post<T>(path, body, this.mergeOptions(options));\r\n }\r\n\r\n async put<T>(path: string, body?: unknown, options?: RequestOptions): Promise<APIResponse<T>> {\r\n return this.client.put<T>(path, body, this.mergeOptions(options));\r\n }\r\n\r\n async delete<T>(path: string, options?: RequestOptions): Promise<APIResponse<T>> {\r\n return this.client.delete<T>(path, this.mergeOptions(options));\r\n }\r\n\r\n async patch<T>(path: string, body?: unknown, options?: RequestOptions): Promise<APIResponse<T>> {\r\n return this.client.patch<T>(path, body, this.mergeOptions(options));\r\n }\r\n\r\n private mergeOptions(options?: RequestOptions): RequestOptions {\r\n return {\r\n ...this.defaults,\r\n ...options,\r\n headers: {\r\n ...this.defaults.headers,\r\n ...options?.headers,\r\n },\r\n };\r\n }\r\n}\r\n","/**\r\n * Account Configuration API Module\r\n *\r\n * Provides access to LivePerson Account Configuration APIs.\r\n * These include Skills, Users, Agent Groups, Profiles, LOBs, Campaigns, etc.\r\n * Uses standard Bearer authentication.\r\n */\r\n\r\nimport type { HTTPClient } from '../http';\r\nimport type { APIResponse } from '../types';\r\nimport type {\r\n // Skills\r\n LPSkill,\r\n CreateSkillRequest,\r\n UpdateSkillRequest,\r\n // Users\r\n LPUser,\r\n CreateUserRequest,\r\n UpdateUserRequest,\r\n // Agent Groups\r\n LPAgentGroup,\r\n CreateAgentGroupRequest,\r\n UpdateAgentGroupRequest,\r\n // Profiles\r\n LPProfile,\r\n CreateProfileRequest,\r\n UpdateProfileRequest,\r\n // LOBs\r\n LPLOB,\r\n CreateLOBRequest,\r\n UpdateLOBRequest,\r\n // Campaigns\r\n LPCampaign,\r\n CreateCampaignRequest,\r\n UpdateCampaignRequest,\r\n // Engagements\r\n LPEngagement,\r\n CreateEngagementRequest,\r\n UpdateEngagementRequest,\r\n // Predefined Content\r\n LPPredefinedContent,\r\n CreatePredefinedContentRequest,\r\n UpdatePredefinedContentRequest,\r\n // Automatic Messages\r\n LPAutomaticMessage,\r\n CreateAutomaticMessageRequest,\r\n UpdateAutomaticMessageRequest,\r\n // Working Hours\r\n LPWorkingHours,\r\n CreateWorkingHoursRequest,\r\n UpdateWorkingHoursRequest,\r\n // Special Occasions\r\n LPSpecialOccasion,\r\n CreateSpecialOccasionRequest,\r\n UpdateSpecialOccasionRequest,\r\n} from '../types';\r\n\r\n/**\r\n * Skills API\r\n *\r\n * Manage LivePerson skills for routing conversations.\r\n */\r\nexport class SkillsAPI {\r\n constructor(private http: HTTPClient) {}\r\n\r\n /**\r\n * Get all skills\r\n */\r\n async getAll(): Promise<APIResponse<LPSkill[]>> {\r\n return this.http.get<LPSkill[]>('/skills');\r\n }\r\n\r\n /**\r\n * Get a skill by ID\r\n */\r\n async getById(skillId: number): Promise<APIResponse<LPSkill>> {\r\n return this.http.get<LPSkill>(`/skills/${skillId}`);\r\n }\r\n\r\n /**\r\n * Create a new skill\r\n */\r\n async create(skill: CreateSkillRequest): Promise<APIResponse<LPSkill>> {\r\n return this.http.post<LPSkill>('/skills', skill);\r\n }\r\n\r\n /**\r\n * Update a skill\r\n * @param skillId - The skill ID\r\n * @param skill - Updated skill data\r\n * @param revision - Optional revision for optimistic locking (auto-fetched if not provided)\r\n */\r\n async update(skillId: number, skill: UpdateSkillRequest, revision?: string): Promise<APIResponse<LPSkill>> {\r\n const rev = revision || (await this.getAll()).revision;\r\n return this.http.put<LPSkill>(`/skills/${skillId}`, skill, { revision: rev });\r\n }\r\n\r\n /**\r\n * Delete a skill\r\n * @param skillId - The skill ID\r\n * @param revision - Optional revision for optimistic locking (auto-fetched if not provided)\r\n */\r\n async delete(skillId: number, revision?: string): Promise<APIResponse<void>> {\r\n const rev = revision || (await this.getAll()).revision;\r\n return this.http.delete<void>(`/skills/${skillId}`, { revision: rev });\r\n }\r\n}\r\n\r\n/**\r\n * Users API\r\n *\r\n * Manage LivePerson users and agents.\r\n */\r\nexport class UsersAPI {\r\n constructor(private http: HTTPClient) {}\r\n\r\n /**\r\n * Get all users\r\n */\r\n async getAll(): Promise<APIResponse<LPUser[]>> {\r\n return this.http.get<LPUser[]>('/users');\r\n }\r\n\r\n /**\r\n * Get a user by ID\r\n */\r\n async getById(userId: string): Promise<APIResponse<LPUser>> {\r\n return this.http.get<LPUser>(`/users/${userId}`);\r\n }\r\n\r\n /**\r\n * Create a new user\r\n */\r\n async create(user: CreateUserRequest): Promise<APIResponse<LPUser>> {\r\n return this.http.post<LPUser>('/users', user);\r\n }\r\n\r\n /**\r\n * Update a user\r\n * @param userId - The user ID\r\n * @param user - Updated user data\r\n * @param revision - Optional revision for optimistic locking (auto-fetched if not provided)\r\n */\r\n async update(userId: string, user: UpdateUserRequest, revision?: string): Promise<APIResponse<LPUser>> {\r\n const rev = revision || (await this.getAll()).revision;\r\n return this.http.put<LPUser>(`/users/${userId}`, user, { revision: rev });\r\n }\r\n\r\n /**\r\n * Delete a user\r\n * @param userId - The user ID\r\n * @param revision - Optional revision for optimistic locking (auto-fetched if not provided)\r\n */\r\n async delete(userId: string, revision?: string): Promise<APIResponse<void>> {\r\n const rev = revision || (await this.getAll()).revision;\r\n return this.http.delete<void>(`/users/${userId}`, { revision: rev });\r\n }\r\n\r\n /**\r\n * Get the current authenticated user\r\n */\r\n async getSelf(): Promise<APIResponse<LPUser>> {\r\n return this.http.get<LPUser>('/users/self');\r\n }\r\n}\r\n\r\n/**\r\n * Agent Groups API\r\n */\r\nexport class AgentGroupsAPI {\r\n constructor(private http: HTTPClient) {}\r\n\r\n /**\r\n * Get all agent groups\r\n */\r\n async getAll(): Promise<APIResponse<LPAgentGroup[]>> {\r\n return this.http.get<LPAgentGroup[]>('/agent-groups');\r\n }\r\n\r\n /**\r\n * Get an agent group by ID\r\n */\r\n async getById(groupId: number): Promise<APIResponse<LPAgentGroup>> {\r\n return this.http.get<LPAgentGroup>(`/agent-groups/${groupId}`);\r\n }\r\n\r\n /**\r\n * Create a new agent group\r\n */\r\n async create(group: CreateAgentGroupRequest): Promise<APIResponse<LPAgentGroup>> {\r\n return this.http.post<LPAgentGroup>('/agent-groups', group);\r\n }\r\n\r\n /**\r\n * Update an agent group\r\n * @param revision - Optional revision for optimistic locking (auto-fetched if not provided)\r\n */\r\n async update(groupId: number, group: UpdateAgentGroupRequest, revision?: string): Promise<APIResponse<LPAgentGroup>> {\r\n const rev = revision || (await this.getAll()).revision;\r\n return this.http.put<LPAgentGroup>(`/agent-groups/${groupId}`, group, { revision: rev });\r\n }\r\n\r\n /**\r\n * Delete an agent group\r\n * @param revision - Optional revision for optimistic locking (auto-fetched if not provided)\r\n */\r\n async delete(groupId: number, revision?: string): Promise<APIResponse<void>> {\r\n const rev = revision || (await this.getAll()).revision;\r\n return this.http.delete<void>(`/agent-groups/${groupId}`, { revision: rev });\r\n }\r\n}\r\n\r\n/**\r\n * Profiles API\r\n */\r\nexport class ProfilesAPI {\r\n constructor(private http: HTTPClient) {}\r\n\r\n /**\r\n * Get all profiles\r\n */\r\n async getAll(): Promise<APIResponse<LPProfile[]>> {\r\n return this.http.get<LPProfile[]>('/profiles');\r\n }\r\n\r\n /**\r\n * Get a profile by ID\r\n */\r\n async getById(profileId: number): Promise<APIResponse<LPProfile>> {\r\n return this.http.get<LPProfile>(`/profiles/${profileId}`);\r\n }\r\n\r\n /**\r\n * Create a new profile\r\n */\r\n async create(profile: CreateProfileRequest): Promise<APIResponse<LPProfile>> {\r\n return this.http.post<LPProfile>('/profiles', profile);\r\n }\r\n\r\n /**\r\n * Update a profile\r\n * @param revision - Optional revision for optimistic locking (auto-fetched if not provided)\r\n */\r\n async update(profileId: number, profile: UpdateProfileRequest, revision?: string): Promise<APIResponse<LPProfile>> {\r\n const rev = revision || (await this.getAll()).revision;\r\n return this.http.put<LPProfile>(`/profiles/${profileId}`, profile, { revision: rev });\r\n }\r\n\r\n /**\r\n * Delete a profile\r\n * @param revision - Optional revision for optimistic locking (auto-fetched if not provided)\r\n */\r\n async delete(profileId: number, revision?: string): Promise<APIResponse<void>> {\r\n const rev = revision || (await this.getAll()).revision;\r\n return this.http.delete<void>(`/profiles/${profileId}`, { revision: rev });\r\n }\r\n}\r\n\r\n/**\r\n * LOBs (Lines of Business) API\r\n */\r\nexport class LOBsAPI {\r\n constructor(private http: HTTPClient) {}\r\n\r\n /**\r\n * Get all LOBs\r\n */\r\n async getAll(): Promise<APIResponse<LPLOB[]>> {\r\n return this.http.get<LPLOB[]>('/lobs');\r\n }\r\n\r\n /**\r\n * Get a LOB by ID\r\n */\r\n async getById(lobId: number): Promise<APIResponse<LPLOB>> {\r\n return this.http.get<LPLOB>(`/lobs/${lobId}`);\r\n }\r\n\r\n /**\r\n * Create a new LOB\r\n */\r\n async create(lob: CreateLOBRequest): Promise<APIResponse<LPLOB>> {\r\n return this.http.post<LPLOB>('/lobs', lob);\r\n }\r\n\r\n /**\r\n * Update a LOB\r\n * @param revision - Optional revision for optimistic locking (auto-fetched if not provided)\r\n */\r\n async update(lobId: number, lob: UpdateLOBRequest, revision?: string): Promise<APIResponse<LPLOB>> {\r\n const rev = revision || (await this.getAll()).revision;\r\n return this.http.put<LPLOB>(`/lobs/${lobId}`, lob, { revision: rev });\r\n }\r\n\r\n /**\r\n * Delete a LOB\r\n * @param revision - Optional revision for optimistic locking (auto-fetched if not provided)\r\n */\r\n async delete(lobId: number, revision?: string): Promise<APIResponse<void>> {\r\n const rev = revision || (await this.getAll()).revision;\r\n return this.http.delete<void>(`/lobs/${lobId}`, { revision: rev });\r\n }\r\n}\r\n\r\n/**\r\n * Campaigns API\r\n */\r\nexport class CampaignsAPI {\r\n constructor(private http: HTTPClient) {}\r\n\r\n /**\r\n * Get all campaigns\r\n */\r\n async getAll(): Promise<APIResponse<LPCampaign[]>> {\r\n return this.http.get<LPCampaign[]>('/campaigns');\r\n }\r\n\r\n /**\r\n * Get a campaign by ID\r\n */\r\n async getById(campaignId: number): Promise<APIResponse<LPCampaign>> {\r\n return this.http.get<LPCampaign>(`/campaigns/${campaignId}`);\r\n }\r\n\r\n /**\r\n * Create a new campaign\r\n */\r\n async create(campaign: CreateCampaignRequest): Promise<APIResponse<LPCampaign>> {\r\n return this.http.post<LPCampaign>('/campaigns', campaign);\r\n }\r\n\r\n /**\r\n * Update a campaign\r\n * @param revision - Optional revision for optimistic locking (auto-fetched if not provided)\r\n */\r\n async update(campaignId: number, campaign: UpdateCampaignRequest, revision?: string): Promise<APIResponse<LPCampaign>> {\r\n const rev = revision || (await this.getAll()).revision;\r\n return this.http.put<LPCampaign>(`/campaigns/${campaignId}`, campaign, { revision: rev });\r\n }\r\n\r\n /**\r\n * Delete a campaign\r\n * @param revision - Optional revision for optimistic locking (auto-fetched if not provided)\r\n */\r\n async delete(campaignId: number, revision?: string): Promise<APIResponse<void>> {\r\n const rev = revision || (await this.getAll()).revision;\r\n return this.http.delete<void>(`/campaigns/${campaignId}`, { revision: rev });\r\n }\r\n}\r\n\r\n/**\r\n * Engagements API\r\n */\r\nexport class EngagementsAPI {\r\n constructor(private http: HTTPClient) {}\r\n\r\n /**\r\n * Get all engagements for a campaign\r\n */\r\n async getByCampaign(campaignId: number): Promise<APIResponse<LPEngagement[]>> {\r\n return this.http.get<LPEngagement[]>(`/campaigns/${campaignId}/engagements`);\r\n }\r\n\r\n /**\r\n * Get an engagement by ID\r\n */\r\n async getById(campaignId: number, engagementId: number): Promise<APIResponse<LPEngagement>> {\r\n return this.http.get<LPEngagement>(`/campaigns/${campaignId}/engagements/${engagementId}`);\r\n }\r\n\r\n /**\r\n * Create a new engagement\r\n */\r\n async create(engagement: CreateEngagementRequest): Promise<APIResponse<LPEngagement>> {\r\n return this.http.post<LPEngagement>(`/campaigns/${engagement.campaignId}/engagements`, engagement);\r\n }\r\n\r\n /**\r\n * Update an engagement\r\n * @param revision - Optional revision for optimistic locking (auto-fetched if not provided)\r\n */\r\n async update(\r\n campaignId: number,\r\n engagementId: number,\r\n engagement: UpdateEngagementRequest,\r\n revision?: string\r\n ): Promise<APIResponse<LPEngagement>> {\r\n const rev = revision || (await this.getByCampaign(campaignId)).revision;\r\n return this.http.put<LPEngagement>(`/campaigns/${campaignId}/engagements/${engagementId}`, engagement, { revision: rev });\r\n }\r\n\r\n /**\r\n * Delete an engagement\r\n * @param revision - Optional revision for optimistic locking (auto-fetched if not provided)\r\n */\r\n async delete(campaignId: number, engagementId: number, revision?: string): Promise<APIResponse<void>> {\r\n const rev = revision || (await this.getByCampaign(campaignId)).revision;\r\n return this.http.delete<void>(`/campaigns/${campaignId}/engagements/${engagementId}`, { revision: rev });\r\n }\r\n}\r\n\r\n/**\r\n * Predefined Content (Canned Responses) API\r\n */\r\nexport class PredefinedContentAPI {\r\n constructor(private http: HTTPClient) {}\r\n\r\n /**\r\n * Get all predefined content\r\n */\r\n async getAll(): Promise<APIResponse<LPPredefinedContent[]>> {\r\n return this.http.get<LPPredefinedContent[]>('/predefined-content');\r\n }\r\n\r\n /**\r\n * Get predefined content by ID\r\n */\r\n async getById(contentId: number): Promise<APIResponse<LPPredefinedContent>> {\r\n return this.http.get<LPPredefinedContent>(`/predefined-content/${contentId}`);\r\n }\r\n\r\n /**\r\n * Create new predefined content\r\n */\r\n async create(content: CreatePredefinedContentRequest): Promise<APIResponse<LPPredefinedContent>> {\r\n return this.http.post<LPPredefinedContent>('/predefined-content', content);\r\n }\r\n\r\n /**\r\n * Update predefined content\r\n * @param revision - Optional revision for optimistic locking (auto-fetched if not provided)\r\n */\r\n async update(contentId: number, content: UpdatePredefinedContentRequest, revision?: string): Promise<APIResponse<LPPredefinedContent>> {\r\n const rev = revision || (await this.getAll()).revision;\r\n return this.http.put<LPPredefinedContent>(`/predefined-content/${contentId}`, content, { revision: rev });\r\n }\r\n\r\n /**\r\n * Delete predefined content\r\n * @param revision - Optional revision for optimistic locking (auto-fetched if not provided)\r\n */\r\n async delete(contentId: number, revision?: string): Promise<APIResponse<void>> {\r\n const rev = revision || (await this.getAll()).revision;\r\n return this.http.delete<void>(`/predefined-content/${contentId}`, { revision: rev });\r\n }\r\n}\r\n\r\n/**\r\n * Automatic Messages API\r\n */\r\nexport class AutomaticMessagesAPI {\r\n constructor(private http: HTTPClient) {}\r\n\r\n /**\r\n * Get all automatic messages\r\n */\r\n async getAll(): Promise<APIResponse<LPAutomaticMessage[]>> {\r\n return this.http.get<LPAutomaticMessage[]>('/automatic-messages');\r\n }\r\n\r\n /**\r\n * Get an automatic message by ID\r\n */\r\n async getById(messageId: number): Promise<APIResponse<LPAutomaticMessage>> {\r\n return this.http.get<LPAutomaticMessage>(`/automatic-messages/${messageId}`);\r\n }\r\n\r\n /**\r\n * Create a new automatic message\r\n */\r\n async create(message: CreateAutomaticMessageRequest): Promise<APIResponse<LPAutomaticMessage>> {\r\n return this.http.post<LPAutomaticMessage>('/automatic-messages', message);\r\n }\r\n\r\n /**\r\n * Update an automatic message\r\n * @param revision - Optional revision for optimistic locking (auto-fetched if not provided)\r\n */\r\n async update(messageId: number, message: UpdateAutomaticMessageRequest, revision?: string): Promise<APIResponse<LPAutomaticMessage>> {\r\n const rev = revision || (await this.getAll()).revision;\r\n return this.http.put<LPAutomaticMessage>(`/automatic-messages/${messageId}`, message, { revision: rev });\r\n }\r\n\r\n /**\r\n * Delete an automatic message\r\n * @param revision - Optional revision for optimistic locking (auto-fetched if not provided)\r\n */\r\n async delete(messageId: number, revision?: string): Promise<APIResponse<void>> {\r\n const rev = revision || (await this.getAll()).revision;\r\n return this.http.delete<void>(`/automatic-messages/${messageId}`, { revision: rev });\r\n }\r\n}\r\n\r\n/**\r\n * Working Hours API\r\n */\r\nexport class WorkingHoursAPI {\r\n constructor(private http: HTTPClient) {}\r\n\r\n /**\r\n * Get all working hours schedules\r\n */\r\n async getAll(): Promise<APIResponse<LPWorkingHours[]>> {\r\n return this.http.get<LPWorkingHours[]>('/working-hours');\r\n }\r\n\r\n /**\r\n * Get working hours by ID\r\n */\r\n async getById(scheduleId: number): Promise<APIResponse<LPWorkingHours>> {\r\n return this.http.get<LPWorkingHours>(`/working-hours/${scheduleId}`);\r\n }\r\n\r\n /**\r\n * Create new working hours schedule\r\n */\r\n async create(schedule: CreateWorkingHoursRequest): Promise<APIResponse<LPWorkingHours>> {\r\n return this.http.post<LPWorkingHours>('/working-hours', schedule);\r\n }\r\n\r\n /**\r\n * Update working hours schedule\r\n * @param revision - Optional revision for optimistic locking (auto-fetched if not provided)\r\n */\r\n async update(scheduleId: number, schedule: UpdateWorkingHoursRequest, revision?: string): Promise<APIResponse<LPWorkingHours>> {\r\n const rev = revision || (await this.getAll()).revision;\r\n return this.http.put<LPWorkingHours>(`/working-hours/${scheduleId}`, schedule, { revision: rev });\r\n }\r\n\r\n /**\r\n * Delete working hours schedule\r\n * @param revision - Optional revision for optimistic locking (auto-fetched if not provided)\r\n */\r\n async delete(scheduleId: number, revision?: string): Promise<APIResponse<void>> {\r\n const rev = revision || (await this.getAll()).revision;\r\n return this.http.delete<void>(`/working-hours/${scheduleId}`, { revision: rev });\r\n }\r\n}\r\n\r\n/**\r\n * Special Occasions API\r\n */\r\nexport class SpecialOccasionsAPI {\r\n constructor(private http: HTTPClient) {}\r\n\r\n /**\r\n * Get all special occasions\r\n */\r\n async getAll(): Promise<APIResponse<LPSpecialOccasion[]>> {\r\n return this.http.get<LPSpecialOccasion[]>('/special-occasions');\r\n }\r\n\r\n /**\r\n * Get a special occasion by ID\r\n */\r\n async getById(occasionId: number): Promise<APIResponse<LPSpecialOccasion>> {\r\n return this.http.get<LPSpecialOccasion>(`/special-occasions/${occasionId}`);\r\n }\r\n\r\n /**\r\n * Create a new special occasion\r\n */\r\n async create(occasion: CreateSpecialOccasionRequest): Promise<APIResponse<LPSpecialOccasion>> {\r\n return this.http.post<LPSpecialOccasion>('/special-occasions', occasion);\r\n }\r\n\r\n /**\r\n * Update a special occasion\r\n * @param revision - Optional revision for optimistic locking (auto-fetched if not provided)\r\n */\r\n async update(occasionId: number, occasion: UpdateSpecialOccasionRequest, revision?: string): Promise<APIResponse<LPSpecialOccasion>> {\r\n const rev = revision || (await this.getAll()).revision;\r\n return this.http.put<LPSpecialOccasion>(`/special-occasions/${occasionId}`, occasion, { revision: rev });\r\n }\r\n\r\n /**\r\n * Delete a special occasion\r\n * @param revision - Optional revision for optimistic locking (auto-fetched if not provided)\r\n */\r\n async delete(occasionId: number, revision?: string): Promise<APIResponse<void>> {\r\n const rev = revision || (await this.getAll()).revision;\r\n return this.http.delete<void>(`/special-occasions/${occasionId}`, { revision: rev });\r\n }\r\n}\r\n","/**\r\n * AI Studio API Module\r\n *\r\n * Provides access to LivePerson AI Studio APIs.\r\n * Uses CC-Bearer authentication mode.\r\n */\r\n\r\nimport type { HTTPClient, ScopedHTTPClient } from '../http';\r\nimport type { APIResponse } from '../types';\r\nimport type {\r\n // Categories\r\n AIStudioCategory,\r\n CreateCategoryRequest,\r\n UpdateCategoryRequest,\r\n // Conversations\r\n AIStudioConversation,\r\n AICreateConversationRequest as CreateConversationRequest,\r\n AIUpdateConversationRequest as UpdateConversationRequest,\r\n ConversationQueryParams,\r\n UpdateConversationAttributesRequest,\r\n // Summary\r\n SummaryRequest,\r\n BatchSummaryRequest,\r\n AIStudioSummary,\r\n // Query\r\n QueryGenerateRequest,\r\n QueryGenerateResponse,\r\n // Simulations\r\n AIStudioSimulation,\r\n CreateSimulationRequest,\r\n UpdateSimulationRequest,\r\n SimulationQueryParams,\r\n SimulationJobResult,\r\n // Transcript Analysis\r\n TranscriptAnalysis,\r\n CreateTranscriptAnalysisRequest,\r\n UpdateTranscriptAnalysisRequest,\r\n // Knowledgebases\r\n Knowledgebase,\r\n KnowledgebaseHealth,\r\n KnowledgebaseSearchRequest,\r\n KnowledgebaseSearchResult,\r\n KnowledgebaseItem,\r\n KnowledgebaseTextItem,\r\n // Evaluators\r\n SimilarityEvaluationRequest,\r\n SimilarityEvaluationResponse,\r\n ResolutionEvaluationRequest,\r\n ResolutionEvaluationResponse,\r\n GuidedRoutingEvaluationRequest,\r\n GuidedRoutingEvaluationResponse,\r\n // Generators\r\n QuestionGeneratorRequest,\r\n QuestionGeneratorResponse,\r\n KAIRouteGeneratorRequest,\r\n KAIRouteGeneratorResponse,\r\n KAIRouteGenerationStatus,\r\n // Prompt Library\r\n Prompt,\r\n CreatePromptRequest,\r\n UpdatePromptRequest,\r\n LLMProvider,\r\n // Users\r\n AIStudioUser,\r\n CreateAIStudioUserRequest,\r\n UpdateAIStudioUserRequest,\r\n UpdateAIStudioUserModelsRequest,\r\n // Flows\r\n AIStudioFlow,\r\n InvokeFlowRequest,\r\n InvokeFlowResponse,\r\n} from '../types';\r\n\r\n/**\r\n * AI Studio Categories API\r\n */\r\nexport class CategoriesAPI {\r\n constructor(private http: ScopedHTTPClient) {}\r\n\r\n async getAll(): Promise<APIResponse<AIStudioCategory[]>> {\r\n return this.http.get<AIStudioCategory[]>('/ai-studio/categories');\r\n }\r\n\r\n async create(data: CreateCategoryRequest): Promise<APIResponse<AIStudioCategory>> {\r\n return this.http.post<AIStudioCategory>('/ai-studio/categories', data);\r\n }\r\n\r\n async update(categoryId: string, data: UpdateCategoryRequest): Promise<APIResponse<AIStudioCategory>> {\r\n return this.http.put<AIStudioCategory>(`/ai-studio/categories/${categoryId}`, data);\r\n }\r\n\r\n async delete(categoryId: string): Promise<APIResponse<void>> {\r\n return this.http.delete<void>(`/ai-studio/categories/${categoryId}`);\r\n }\r\n}\r\n\r\n/**\r\n * AI Studio Conversations API\r\n */\r\nexport class ConversationsAPI {\r\n constructor(private http: ScopedHTTPClient) {}\r\n\r\n async getAll(params?: ConversationQueryParams): Promise<APIResponse<AIStudioConversation[]>> {\r\n return this.http.get<AIStudioConversation[]>('/ai-studio/conversations', { params: params as Record<string, string | number | boolean | undefined> });\r\n }\r\n\r\n async getById(convId: string): Promise<APIResponse<AIStudioConversation>> {\r\n return this.http.get<AIStudioConversation>(`/ai-studio/conversations/${convId}`);\r\n }\r\n\r\n async create(data: CreateConversationRequest): Promise<APIResponse<AIStudioConversation>> {\r\n return this.http.post<AIStudioConversation>('/ai-studio/conversations', data);\r\n }\r\n\r\n async update(convId: string, data: UpdateConversationRequest): Promise<APIResponse<AIStudioConversation>> {\r\n return this.http.put<AIStudioConversation>(`/ai-studio/conversations/${convId}`, data);\r\n }\r\n\r\n async delete(convId: string): Promise<APIResponse<void>> {\r\n return this.http.delete<void>(`/ai-studio/conversations/${convId}`);\r\n }\r\n\r\n async updateAttributes(convId: string, data: UpdateConversationAttributesRequest): Promise<APIResponse<AIStudioConversation>> {\r\n return this.http.put<AIStudioConversation>(`/ai-studio/conversations/${convId}/attributes`, data);\r\n }\r\n\r\n async close(convId: string): Promise<APIResponse<void>> {\r\n return this.http.patch<void>(`/ai-studio/conversations/${convId}/close`);\r\n }\r\n\r\n async export(params?: ConversationQueryParams): Promise<APIResponse<AIStudioConversation[]>> {\r\n return this.http.get<AIStudioConversation[]>('/ai-studio/conversations/export', { params: params as Record<string, string | number | boolean | undefined> });\r\n }\r\n\r\n async upload(conversations: AIStudioConversation[]): Promise<APIResponse<AIStudioConversation[]>> {\r\n return this.http.post<AIStudioConversation[]>('/ai-studio/conversations/upload', { conversations });\r\n }\r\n}\r\n\r\n/**\r\n * AI Studio Summary API\r\n */\r\nexport class SummaryAPI {\r\n constructor(private http: ScopedHTTPClient) {}\r\n\r\n async create(data: SummaryRequest): Promise<APIResponse<AIStudioSummary>> {\r\n return this.http.post<AIStudioSummary>('/ai-studio/summary', data);\r\n }\r\n\r\n async createBatch(data: BatchSummaryRequest): Promise<APIResponse<AIStudioSummary>> {\r\n return this.http.post<AIStudioSummary>('/ai-studio/summary/batch', data);\r\n }\r\n\r\n async getBatch(offset?: number, limit?: number): Promise<APIResponse<AIStudioSummary[]>> {\r\n return this.http.get<AIStudioSummary[]>('/ai-studio/summary/batch', { params: { offset, limit } });\r\n }\r\n\r\n async getBatchById(summaryId: string): Promise<APIResponse<AIStudioSummary>> {\r\n return this.http.get<AIStudioSummary>(`/ai-studio/summary/batch/${summaryId}`);\r\n }\r\n\r\n async deleteBatch(summaryId: string): Promise<APIResponse<void>> {\r\n return this.http.delete<void>(`/ai-studio/summary/batch/${summaryId}`);\r\n }\r\n}\r\n\r\n/**\r\n * AI Studio Query API\r\n */\r\nexport class QueryAPI {\r\n constructor(private http: ScopedHTTPClient) {}\r\n\r\n async generate(data: QueryGenerateRequest): Promise<APIResponse<QueryGenerateResponse>> {\r\n return this.http.post<QueryGenerateResponse>('/ai-studio/query', data);\r\n }\r\n}\r\n\r\n/**\r\n * AI Studio Simulations API\r\n */\r\nexport class SimulationsAPI {\r\n constructor(private http: ScopedHTTPClient) {}\r\n\r\n async getAll(params?: SimulationQueryParams): Promise<APIResponse<AIStudioSimulation[]>> {\r\n return this.http.get<AIStudioSimulation[]>('/ai-studio/simulations', { params: params as Record<string, string | number | boolean | undefined> });\r\n }\r\n\r\n async getById(simulationId: string): Promise<APIResponse<AIStudioSimulation>> {\r\n return this.http.get<AIStudioSimulation>(`/ai-studio/simulations/${simulationId}`);\r\n }\r\n\r\n async create(data: CreateSimulationRequest): Promise<APIResponse<AIStudioSimulation>> {\r\n return this.http.post<AIStudioSimulation>('/ai-studio/simulations', data);\r\n }\r\n\r\n async update(simulationId: string, data: UpdateSimulationRequest): Promise<APIResponse<AIStudioSimulation>> {\r\n return this.http.put<AIStudioSimulation>(`/ai-studio/simulations/${simulationId}`, data);\r\n }\r\n\r\n async delete(simulationId: string): Promise<APIResponse<void>> {\r\n return this.http.delete<void>(`/ai-studio/simulations/${simulationId}`);\r\n }\r\n\r\n async getStatus(simulationId: string): Promise<APIResponse<AIStudioSimulation>> {\r\n return this.http.get<AIStudioSimulation>(`/ai-studio/simulations/${simulationId}/status`);\r\n }\r\n\r\n async getJobResults(simulationId: string, jobId: string): Promise<APIResponse<SimulationJobResult>> {\r\n return this.http.get<SimulationJobResult>(`/ai-studio/simulations/${simulationId}/jobs/${jobId}`);\r\n }\r\n\r\n async cancel(simulationId: string): Promise<APIResponse<void>> {\r\n return this.http.post<void>(`/ai-studio/simulations/${simulationId}/cancel`);\r\n }\r\n}\r\n\r\n/**\r\n * AI Studio Transcript Analysis API\r\n */\r\nexport class TranscriptAnalysisAPI {\r\n constructor(private http: ScopedHTTPClient) {}\r\n\r\n async getAll(owner?: string, limit?: number, startAfterId?: string): Promise<APIResponse<TranscriptAnalysis[]>> {\r\n return this.http.get<TranscriptAnalysis[]>('/ai-studio/transcript-analysis', {\r\n params: { owner, limit, start_after_id: startAfterId },\r\n });\r\n }\r\n\r\n async getById(\r\n analysisId: string,\r\n excludeConversations?: boolean,\r\n excludeQuestions?: boolean\r\n ): Promise<APIResponse<TranscriptAnalysis>> {\r\n return this.http.get<TranscriptAnalysis>(`/ai-studio/transcript-analysis/${analysisId}`, {\r\n params: { exclude_conversations: excludeConversations, exclude_questions: excludeQuestions },\r\n });\r\n }\r\n\r\n async create(data: CreateTranscriptAnalysisRequest): Promise<APIResponse<TranscriptAnalysis>> {\r\n return this.http.post<TranscriptAnalysis>('/ai-studio/transcript-analysis', data);\r\n }\r\n\r\n async update(analysisId: string, data: UpdateTranscriptAnalysisRequest): Promise<APIResponse<TranscriptAnalysis>> {\r\n return this.http.put<TranscriptAnalysis>(`/ai-studio/transcript-analysis/${analysisId}`, data);\r\n }\r\n\r\n async delete(analysisId: string): Promise<APIResponse<void>> {\r\n return this.http.delete<void>(`/ai-studio/transcript-analysis/${analysisId}`);\r\n }\r\n}\r\n\r\n/**\r\n * AI Studio Knowledgebases API\r\n */\r\nexport class KnowledgebasesAPI {\r\n constructor(private http: ScopedHTTPClient) {}\r\n\r\n async getAll(): Promise<APIResponse<Knowledgebase[]>> {\r\n return this.http.get<Knowledgebase[]>('/ai-studio/knowledgebases');\r\n }\r\n\r\n async getKai(): Promise<APIResponse<Knowledgebase[]>> {\r\n return this.http.get<Knowledgebase[]>('/ai-studio/knowledgebases/kai');\r\n }\r\n\r\n async getById(kbId: string): Promise<APIResponse<Knowledgebase>> {\r\n return this.http.get<Knowledgebase>(`/ai-studio/knowledgebases/${kbId}`);\r\n }\r\n\r\n async delete(kbId: string): Promise<APIResponse<void>> {\r\n return this.http.delete<void>(`/ai-studio/knowledgebases/${kbId}`);\r\n }\r\n\r\n async getHealth(kbId: string): Promise<APIResponse<KnowledgebaseHealth>> {\r\n return this.http.get<KnowledgebaseHealth>(`/ai-studio/knowledgebases/${kbId}/health`);\r\n }\r\n\r\n async refresh(kbId: string): Promise<APIResponse<Knowledgebase>> {\r\n return this.http.get<Knowledgebase>(`/ai-studio/knowledgebases/${kbId}/refresh`);\r\n }\r\n\r\n async search(kbId: string, data: KnowledgebaseSearchRequest): Promise<APIResponse<KnowledgebaseSearchResult[]>> {\r\n return this.http.post<KnowledgebaseSearchResult[]>(`/ai-studio/knowledgebases/${kbId}/search`, data);\r\n }\r\n\r\n async getItems(kbId: string): Promise<APIResponse<KnowledgebaseItem[]>> {\r\n return this.http.get<KnowledgebaseItem[]>(`/ai-studio/knowledgebases/${kbId}/items`);\r\n }\r\n\r\n async getItemsBySource(kbId: string, sourceId: string): Promise<APIResponse<KnowledgebaseItem[]>> {\r\n return this.http.get<KnowledgebaseItem[]>(`/ai-studio/knowledgebases/${kbId}/items/${sourceId}`);\r\n }\r\n\r\n async createItems(kbId: string, sourceId: string, items: KnowledgebaseTextItem[]): Promise<APIResponse<KnowledgebaseItem[]>> {\r\n return this.http.post<KnowledgebaseItem[]>(`/ai-studio/knowledgebases/${kbId}/items/${sourceId}`, items);\r\n }\r\n\r\n async updateItems(kbId: string, sourceId: string, items: KnowledgebaseTextItem[]): Promise<APIResponse<KnowledgebaseItem[]>> {\r\n return this.http.put<KnowledgebaseItem[]>(`/ai-studio/knowledgebases/${kbId}/items/${sourceId}`, items);\r\n }\r\n\r\n async deleteItems(kbId: string, sourceId: string, itemIds: string[]): Promise<APIResponse<string[]>> {\r\n return this.http.delete<string[]>(`/ai-studio/knowledgebases/${kbId}/items/${sourceId}`, { body: itemIds } as unknown as undefined);\r\n }\r\n}\r\n\r\n/**\r\n * AI Studio Evaluators API\r\n */\r\nexport class EvaluatorsAPI {\r\n constructor(private http: ScopedHTTPClient) {}\r\n\r\n async similarity(evaluationType: string, data: SimilarityEvaluationRequest): Promise<APIResponse<SimilarityEvaluationResponse>> {\r\n return this.http.post<SimilarityEvaluationResponse>('/ai-studio/evaluators/similarity', data, {\r\n params: { type: evaluationType },\r\n });\r\n }\r\n\r\n async resolution(data: ResolutionEvaluationRequest): Promise<APIResponse<ResolutionEvaluationResponse>> {\r\n return this.http.post<ResolutionEvaluationResponse>('/ai-studio/evaluators/resolution', data);\r\n }\r\n\r\n async guidedRouting(data: GuidedRoutingEvaluationRequest): Promise<APIResponse<GuidedRoutingEvaluationResponse>> {\r\n return this.http.post<GuidedRoutingEvaluationResponse>('/ai-studio/evaluators/guided-routing', data);\r\n }\r\n}\r\n\r\n/**\r\n * AI Studio Generators API\r\n */\r\nexport class GeneratorsAPI {\r\n constructor(private http: ScopedHTTPClient) {}\r\n\r\n async qaFromModel(modelId: string): Promise<APIResponse<QuestionGeneratorResponse>> {\r\n return this.http.get<QuestionGeneratorResponse>(`/ai-studio/generators/qa/model/${modelId}`);\r\n }\r\n\r\n async qaFromKnowledgebase(\r\n kbIds: string[],\r\n generateAnswers?: boolean,\r\n useRandomSections?: boolean\r\n ): Promise<APIResponse<QuestionGeneratorResponse>> {\r\n return this.http.get<QuestionGeneratorResponse>('/ai-studio/generators/qa/knowledgebase', {\r\n params: { kb_id: kbIds.join(','), generate_answers: generateAnswers, use_random_sections: useRandomSections },\r\n });\r\n }\r\n\r\n async qaFromConversationCloud(data: QuestionGeneratorRequest): Promise<APIResponse<QuestionGeneratorResponse>> {\r\n return this.http.post<QuestionGeneratorResponse>('/ai-studio/generators/qa/conversation-cloud', data);\r\n }\r\n\r\n async kaiRoutesLlm(data: KAIRouteGeneratorRequest): Promise<APIResponse<KAIRouteGeneratorResponse>> {\r\n return this.http.post<KAIRouteGeneratorResponse>('/ai-studio/generators/routes/kai-llm', data);\r\n }\r\n\r\n async kaiRoutes(data: KAIRouteGeneratorRequest): Promise<APIResponse<number>> {\r\n return this.http.post<number>('/ai-studio/generators/routes/kai', data);\r\n }\r\n\r\n async kaiRoutesStatus(flowId: string): Promise<APIResponse<KAIRouteGenerationStatus>> {\r\n return this.http.get<KAIRouteGenerationStatus>('/ai-studio/generators/routes/kai/status', {\r\n params: { flow_id: flowId },\r\n });\r\n }\r\n}\r\n\r\n/**\r\n * AI Studio Prompt Library API\r\n */\r\nexport class PromptLibraryAPI {\r\n constructor(private http: ScopedHTTPClient) {}\r\n\r\n async getAll(): Promise<APIResponse<Prompt[]>> {\r\n return this.http.get<Prompt[]>('/ai-studio/prompt-library');\r\n }\r\n\r\n async create(data: CreatePromptRequest): Promise<APIResponse<Prompt>> {\r\n return this.http.post<Prompt>('/ai-studio/prompt-library', data);\r\n }\r\n\r\n async update(promptId: string, data: UpdatePromptRequest): Promise<APIResponse<Prompt>> {\r\n return this.http.put<Prompt>(`/ai-studio/prompt-library/${promptId}`, data);\r\n }\r\n\r\n async getProviders(): Promise<APIResponse<LLMProvider[]>> {\r\n return this.http.get<LLMProvider[]>('/ai-studio/prompt-library/providers');\r\n }\r\n\r\n async getSystemPrompts(): Promise<APIResponse<Prompt[]>> {\r\n return this.http.get<Prompt[]>('/ai-studio/prompt-library/system');\r\n }\r\n}\r\n\r\n/**\r\n * AI Studio Users API\r\n */\r\nexport class AIStudioUsersAPI {\r\n constructor(private http: ScopedHTTPClient) {}\r\n\r\n async getSelf(): Promise<APIResponse<AIStudioUser>> {\r\n return this.http.get<AIStudioUser>('/ai-studio/users/self');\r\n }\r\n\r\n async getAll(): Promise<APIResponse<AIStudioUser[]>> {\r\n return this.http.get<AIStudioUser[]>('/ai-studio/users');\r\n }\r\n\r\n async getDetails(): Promise<APIResponse<AIStudioUser[]>> {\r\n return this.http.get<AIStudioUser[]>('/ai-studio/users/details');\r\n }\r\n\r\n async create(data: CreateAIStudioUserRequest): Promise<APIResponse<AIStudioUser>> {\r\n return this.http.post<AIStudioUser>('/ai-studio/users', data);\r\n }\r\n\r\n async update(userId: string, data: UpdateAIStudioUserRequest): Promise<APIResponse<AIStudioUser>> {\r\n return this.http.put<AIStudioUser>(`/ai-studio/users/${userId}`, data);\r\n }\r\n\r\n async delete(userId: string): Promise<APIResponse<void>> {\r\n return this.http.delete<void>(`/ai-studio/users/${userId}`);\r\n }\r\n\r\n async updateModels(userId: string, data: UpdateAIStudioUserModelsRequest): Promise<APIResponse<AIStudioUser>> {\r\n return this.http.put<AIStudioUser>(`/ai-studio/users/${userId}/models`, data);\r\n }\r\n\r\n async agreeToTerms(userId: string): Promise<APIResponse<AIStudioUser>> {\r\n return this.http.get<AIStudioUser>(`/ai-studio/users/${userId}/terms`);\r\n }\r\n}\r\n\r\n/**\r\n * AI Studio Flows API\r\n *\r\n * Uses /api/v2/flows endpoints.\r\n * Reference: ai-studio.service.ts in lp-demo\r\n */\r\nexport class FlowsAPI {\r\n constructor(\r\n private http: ScopedHTTPClient,\r\n private accountId: string\r\n ) {}\r\n\r\n /**\r\n * List all flows for the account\r\n * GET /api/v2/flows?account_id={accountId}\r\n */\r\n async getAll(): Promise<APIResponse<AIStudioFlow[]>> {\r\n return this.http.get<AIStudioFlow[]>('/ai-studio/flows', {\r\n params: { account_id: this.accountId },\r\n });\r\n }\r\n\r\n /**\r\n * Get a specific flow by ID\r\n * GET /api/v2/flows/{flowId}\r\n */\r\n async getById(flowId: string): Promise<APIResponse<AIStudioFlow>> {\r\n return this.http.get<AIStudioFlow>(`/ai-studio/flows/${flowId}`);\r\n }\r\n\r\n /**\r\n * Invoke a flow\r\n * POST /api/v2/flows/{flowId}\r\n */\r\n async invoke(flowId: string, data: InvokeFlowRequest): Promise<APIResponse<InvokeFlowResponse>> {\r\n return this.http.post<InvokeFlowResponse>(`/ai-studio/flows/${flowId}`, data);\r\n }\r\n\r\n /**\r\n * Invoke a promptless flow (quick response)\r\n * POST /api/v2/flows/response\r\n */\r\n async invokeWithResponse(prompt: string, messages?: Array<{ text: string; speaker: string }>, text?: string): Promise<APIResponse<InvokeFlowResponse>> {\r\n const body: Record<string, unknown> = { prompt };\r\n if (messages) body.messages = messages;\r\n if (text) body.text = text;\r\n return this.http.post<InvokeFlowResponse>('/ai-studio/flows/response', body);\r\n }\r\n}\r\n\r\n/**\r\n * Main AI Studio API\r\n *\r\n * Provides access to all AI Studio sub-APIs.\r\n * Uses CC-Bearer authentication.\r\n */\r\nexport class AIStudioAPI {\r\n public readonly categories: CategoriesAPI;\r\n public readonly conversations: ConversationsAPI;\r\n public readonly summary: SummaryAPI;\r\n public readonly query: QueryAPI;\r\n public readonly simulations: SimulationsAPI;\r\n public readonly transcriptAnalysis: TranscriptAnalysisAPI;\r\n public readonly knowledgebases: KnowledgebasesAPI;\r\n public readonly evaluators: EvaluatorsAPI;\r\n public readonly generators: GeneratorsAPI;\r\n public readonly promptLibrary: PromptLibraryAPI;\r\n public readonly users: AIStudioUsersAPI;\r\n public readonly flows: FlowsAPI;\r\n\r\n constructor(http: HTTPClient, accountId: string) {\r\n // Create scoped client with CC-Bearer auth\r\n const scopedHttp = http.withDefaults({ authMode: 'cc-bearer' });\r\n\r\n this.categories = new CategoriesAPI(scopedHttp);\r\n this.conversations = new ConversationsAPI(scopedHttp);\r\n this.summary = new SummaryAPI(scopedHttp);\r\n this.query = new QueryAPI(scopedHttp);\r\n this.simulations = new SimulationsAPI(scopedHttp);\r\n this.transcriptAnalysis = new TranscriptAnalysisAPI(scopedHttp);\r\n this.knowledgebases = new KnowledgebasesAPI(scopedHttp);\r\n this.evaluators = new EvaluatorsAPI(scopedHttp);\r\n this.generators = new GeneratorsAPI(scopedHttp);\r\n this.promptLibrary = new PromptLibraryAPI(scopedHttp);\r\n this.users = new AIStudioUsersAPI(scopedHttp);\r\n this.flows = new FlowsAPI(scopedHttp, accountId);\r\n }\r\n}\r\n","/**\r\n * Messaging API Module\r\n *\r\n * Provides access to LivePerson Messaging APIs.\r\n * Includes Messaging History, Agent Metrics, Agent Activity, and Operations.\r\n */\r\n\r\nimport type { HTTPClient } from '../http';\r\nimport type { APIResponse } from '../types';\r\nimport type {\r\n // Messaging History\r\n MessagingConversation,\r\n MessagingHistoryQuery,\r\n MessagingHistoryResponse,\r\n // Agent Metrics\r\n AgentMetrics,\r\n AgentMetricsQuery,\r\n // Agent Activity\r\n AgentActivity,\r\n AgentActivityQuery,\r\n // Operations\r\n TransferConversationRequest,\r\n CloseConversationRequest,\r\n SendMessageRequest,\r\n // Connect to Messaging\r\n MessagingCreateConversationRequest as CreateConversationRequest,\r\n CreateConversationResponse,\r\n // Outbound Reporting\r\n OutboundCampaignReport,\r\n OutboundReportQuery,\r\n} from '../types';\r\n\r\n/**\r\n * Messaging History API\r\n *\r\n * Access conversation history and transcripts.\r\n */\r\nexport class MessagingHistoryAPI {\r\n constructor(private http: HTTPClient) {}\r\n\r\n /**\r\n * Query messaging conversations\r\n */\r\n async query(params: MessagingHistoryQuery): Promise<APIResponse<MessagingHistoryResponse>> {\r\n return this.http.post<MessagingHistoryResponse>('/messaging/history', params);\r\n }\r\n\r\n /**\r\n * Get a single conversation by ID\r\n */\r\n async getConversation(conversationId: string): Promise<APIResponse<MessagingConversation>> {\r\n return this.http.get<MessagingConversation>(`/messaging/history/${conversationId}`);\r\n }\r\n\r\n /**\r\n * Get conversations by IDs (batch)\r\n */\r\n async getConversations(conversationIds: string[]): Promise<APIResponse<MessagingConversation[]>> {\r\n return this.http.post<MessagingConversation[]>('/messaging/history/batch', { conversationIds });\r\n }\r\n\r\n /**\r\n * Export conversations matching criteria\r\n */\r\n async export(params: MessagingHistoryQuery): Promise<APIResponse<MessagingHistoryResponse>> {\r\n return this.http.post<MessagingHistoryResponse>('/messaging/history/export', params);\r\n }\r\n}\r\n\r\n/**\r\n * Agent Metrics API\r\n *\r\n * Real-time agent metrics and status.\r\n */\r\nexport class AgentMetricsAPI {\r\n constructor(private http: HTTPClient) {}\r\n\r\n /**\r\n * Get current metrics for agents\r\n */\r\n async getMetrics(params?: AgentMetricsQuery): Promise<APIResponse<AgentMetrics[]>> {\r\n return this.http.post<AgentMetrics[]>('/messaging/agent-metrics', params || {});\r\n }\r\n\r\n /**\r\n * Get metrics for a specific agent\r\n */\r\n async getAgentMetrics(agentId: string): Promise<APIResponse<AgentMetrics>> {\r\n return this.http.get<AgentMetrics>(`/messaging/agent-metrics/${agentId}`);\r\n }\r\n\r\n /**\r\n * Get metrics summary by skill\r\n */\r\n async getBySkill(skillId: number): Promise<APIResponse<AgentMetrics[]>> {\r\n return this.http.get<AgentMetrics[]>(`/messaging/agent-metrics/skill/${skillId}`);\r\n }\r\n\r\n /**\r\n * Get metrics summary by agent group\r\n */\r\n async getByAgentGroup(groupId: number): Promise<APIResponse<AgentMetrics[]>> {\r\n return this.http.get<AgentMetrics[]>(`/messaging/agent-metrics/group/${groupId}`);\r\n }\r\n}\r\n\r\n/**\r\n * Agent Activity API\r\n *\r\n * Historical agent activity and session data.\r\n */\r\nexport class AgentActivityAPI {\r\n constructor(private http: HTTPClient) {}\r\n\r\n /**\r\n * Query agent activity\r\n */\r\n async query(params: AgentActivityQuery): Promise<APIResponse<AgentActivity[]>> {\r\n return this.http.post<AgentActivity[]>('/messaging/agent-activity', params);\r\n }\r\n\r\n /**\r\n * Get activity for a specific agent\r\n */\r\n async getAgentActivity(agentId: string, from: number, to: number): Promise<APIResponse<AgentActivity>> {\r\n return this.http.get<AgentActivity>(`/messaging/agent-activity/${agentId}`, {\r\n params: { from, to },\r\n });\r\n }\r\n}\r\n\r\n/**\r\n * Messaging Operations API\r\n *\r\n * Perform actions on conversations.\r\n */\r\nexport class MessagingOperationsAPI {\r\n constructor(private http: HTTPClient) {}\r\n\r\n /**\r\n * Transfer a conversation to another skill or agent\r\n */\r\n async transfer(request: TransferConversationRequest): Promise<APIResponse<void>> {\r\n return this.http.post<void>(`/messaging/operations/${request.conversationId}/transfer`, {\r\n targetSkillId: request.targetSkillId,\r\n targetAgentId: request.targetAgentId,\r\n reason: request.reason,\r\n });\r\n }\r\n\r\n /**\r\n * Close a conversation\r\n */\r\n async close(request: CloseConversationRequest): Promise<APIResponse<void>> {\r\n return this.http.post<void>(`/messaging/operations/${request.conversationId}/close`, {\r\n closeReason: request.closeReason,\r\n });\r\n }\r\n\r\n /**\r\n * Send a message to a conversation\r\n */\r\n async sendMessage(request: SendMessageRequest): Promise<APIResponse<void>> {\r\n return this.http.post<void>(`/messaging/operations/${request.conversationId}/message`, {\r\n message: request.message,\r\n contentType: request.contentType,\r\n richContent: request.richContent,\r\n });\r\n }\r\n\r\n /**\r\n * Set conversation priority\r\n */\r\n async setPriority(conversationId: string, priority: number): Promise<APIResponse<void>> {\r\n return this.http.post<void>(`/messaging/operations/${conversationId}/priority`, { priority });\r\n }\r\n\r\n /**\r\n * Set conversation TTR (Time To Respond)\r\n */\r\n async setTTR(conversationId: string, ttrType: 'URGENT' | 'NORMAL' | 'PRIORITIZED', value?: number): Promise<APIResponse<void>> {\r\n return this.http.post<void>(`/messaging/operations/${conversationId}/ttr`, { ttrType, value });\r\n }\r\n}\r\n\r\n/**\r\n * Connect to Messaging API\r\n *\r\n * Create new messaging conversations programmatically.\r\n */\r\nexport class ConnectToMessagingAPI {\r\n constructor(private http: HTTPClient) {}\r\n\r\n /**\r\n * Create a new conversation\r\n */\r\n async createConversation(request: CreateConversationRequest): Promise<APIResponse<CreateConversationResponse>> {\r\n return this.http.post<CreateConversationResponse>('/messaging/connect', request);\r\n }\r\n\r\n /**\r\n * Get available campaigns and engagements for creating conversations\r\n */\r\n async getAvailableEngagements(): Promise<APIResponse<{ campaigns: Array<{ id: number; name: string; engagements: Array<{ id: number; name: string }> }> }>> {\r\n return this.http.get('/messaging/connect/engagements');\r\n }\r\n}\r\n\r\n/**\r\n * Outbound Reporting API\r\n *\r\n * Reports on outbound messaging campaigns.\r\n */\r\nexport class OutboundReportingAPI {\r\n constructor(private http: HTTPClient) {}\r\n\r\n /**\r\n * Query outbound campaign reports\r\n */\r\n async query(params: OutboundReportQuery): Promise<APIResponse<OutboundCampaignReport[]>> {\r\n return this.http.post<OutboundCampaignReport[]>('/messaging/outbound/reports', params);\r\n }\r\n\r\n /**\r\n * Get report for a specific campaign\r\n */\r\n async getCampaignReport(campaignId: string, from: number, to: number): Promise<APIResponse<OutboundCampaignReport>> {\r\n return this.http.get<OutboundCampaignReport>(`/messaging/outbound/reports/${campaignId}`, {\r\n params: { from, to },\r\n });\r\n }\r\n\r\n /**\r\n * Get aggregate outbound stats\r\n */\r\n async getAggregateStats(from: number, to: number): Promise<APIResponse<OutboundCampaignReport>> {\r\n return this.http.get<OutboundCampaignReport>('/messaging/outbound/reports/aggregate', {\r\n params: { from, to },\r\n });\r\n }\r\n}\r\n\r\n/**\r\n * Main Messaging API\r\n *\r\n * Provides access to all Messaging sub-APIs.\r\n */\r\nexport class MessagingAPI {\r\n public readonly history: MessagingHistoryAPI;\r\n public readonly agentMetrics: AgentMetricsAPI;\r\n public readonly agentActivity: AgentActivityAPI;\r\n public readonly operations: MessagingOperationsAPI;\r\n public readonly connect: ConnectToMessagingAPI;\r\n public readonly outbound: OutboundReportingAPI;\r\n\r\n constructor(http: HTTPClient) {\r\n this.history = new MessagingHistoryAPI(http);\r\n this.agentMetrics = new AgentMetricsAPI(http);\r\n this.agentActivity = new AgentActivityAPI(http);\r\n this.operations = new MessagingOperationsAPI(http);\r\n this.connect = new ConnectToMessagingAPI(http);\r\n this.outbound = new OutboundReportingAPI(http);\r\n }\r\n}\r\n","/**\r\n * Sentinel API Module\r\n *\r\n * Provides access to LivePerson's Sentinel (IDP) authentication APIs.\r\n * Handles OAuth token exchange, login URL generation, and session management.\r\n */\r\n\r\nimport type { HTTPClient } from '../http';\r\nimport type {\r\n SentinelAuthRequest,\r\n SentinelToken,\r\n SentinelLoginUrlResponse,\r\n SentinelDomainsResponse,\r\n CBAuthInfo,\r\n} from '../types';\r\n\r\n/**\r\n * Sentinel Authentication API\r\n *\r\n * Handles LivePerson OAuth authentication flow via the Sentinel service.\r\n *\r\n * @example\r\n * ```typescript\r\n * // Get login URL for OAuth redirect\r\n * const { url } = await sdk.sentinel.getLoginUrl();\r\n * window.location.href = url;\r\n *\r\n * // After redirect, exchange code for token\r\n * const token = await sdk.sentinel.exchangeToken({\r\n * code: authCode,\r\n * redirect: window.location.origin + '/callback',\r\n * appname: 'my-app',\r\n * });\r\n * ```\r\n */\r\nexport class SentinelAPI {\r\n constructor(private http: HTTPClient) {}\r\n\r\n /**\r\n * Get login URL for OAuth redirect\r\n *\r\n * Returns a URL to redirect the user to for LivePerson authentication.\r\n * After successful auth, user is redirected back with an authorization code.\r\n *\r\n * @returns Login URL for OAuth redirect\r\n *\r\n * @example\r\n * ```typescript\r\n * const { url } = await sdk.sentinel.getLoginUrl();\r\n * // Redirect user to LP login\r\n * window.location.href = url;\r\n * ```\r\n */\r\n async getLoginUrl(): Promise<SentinelLoginUrlResponse> {\r\n const response = await this.http.get<SentinelLoginUrlResponse>('/idp/login-url');\r\n return response.data;\r\n }\r\n\r\n /**\r\n * Exchange OAuth authorization code for access token\r\n *\r\n * After the user completes LP authentication and is redirected back,\r\n * use this method to exchange the authorization code for tokens.\r\n *\r\n * @param request - Token exchange request with code and redirect URI\r\n * @returns Token object with access token, refresh token, and user info\r\n *\r\n * @example\r\n * ```typescript\r\n * // Get code from URL params after redirect\r\n * const urlParams = new URLSearchParams(window.location.search);\r\n * const code = urlParams.get('code');\r\n *\r\n * const token = await sdk.sentinel.exchangeToken({\r\n * code,\r\n * redirect: window.location.origin + '/callback',\r\n * appname: 'my-app',\r\n * });\r\n *\r\n * // Store token for API calls\r\n * localStorage.setItem('lpToken', token.accessToken);\r\n * ```\r\n */\r\n async exchangeToken(request: SentinelAuthRequest): Promise<SentinelToken> {\r\n const response = await this.http.post<SentinelToken>('/idp/token', request);\r\n return response.data;\r\n }\r\n\r\n /**\r\n * Logout and revoke token\r\n *\r\n * Revokes the current access token, ending the user's session.\r\n *\r\n * @example\r\n * ```typescript\r\n * await sdk.sentinel.logout();\r\n * // Clear local storage and redirect to login\r\n * localStorage.removeItem('lpToken');\r\n * window.location.href = '/login';\r\n * ```\r\n */\r\n async logout(): Promise<void> {\r\n await this.http.post<void>('/idp/logout', {});\r\n }\r\n\r\n /**\r\n * Get LivePerson domains for the account\r\n *\r\n * Returns the domain URLs for various LP services.\r\n * Useful for making direct API calls to specific LP services.\r\n *\r\n * @returns Map of service names to domain URLs\r\n *\r\n * @example\r\n * ```typescript\r\n * const domains = await sdk.sentinel.getDomains();\r\n * console.log('Sentinel domain:', domains.sentinel);\r\n * console.log('Account Config domain:', domains.accountConfigReadOnly);\r\n * ```\r\n */\r\n async getDomains(): Promise<SentinelDomainsResponse> {\r\n const response = await this.http.get<SentinelDomainsResponse>('/idp/domains');\r\n return response.data;\r\n }\r\n\r\n /**\r\n * Authenticate with Conversation Builder\r\n *\r\n * Exchanges the LP access token for a CB-specific token.\r\n * Required for making Conversation Builder API calls.\r\n *\r\n * @returns CB authentication info with token and organization ID\r\n *\r\n * @example\r\n * ```typescript\r\n * const cbAuth = await sdk.sentinel.authenticateCB();\r\n * if (cbAuth.success) {\r\n * const cbToken = cbAuth.successResult.apiAccessToken;\r\n * const cbOrg = cbAuth.successResult.sessionOrganizationId;\r\n * // Use cbToken for CB API calls\r\n * }\r\n * ```\r\n */\r\n async authenticateCB(): Promise<CBAuthInfo> {\r\n const response = await this.http.get<CBAuthInfo>('/idp/authenticate-cb');\r\n return response.data;\r\n }\r\n}\r\n","/**\r\n * LP Prompts API Module\r\n *\r\n * Provides access to LivePerson Prompt Library API.\r\n * Domain: promptlibrary\r\n * Note: This is different from AI Studio Prompt Library API.\r\n */\r\n\r\nimport type { HTTPClient, ScopedHTTPClient } from '../http';\r\nimport type { APIResponse } from '../types';\r\nimport type {\r\n LPPrompt,\r\n CreateLPPromptRequest,\r\n UpdateLPPromptRequest,\r\n LPLLMProviderSubscription,\r\n LPPromptsQueryParams,\r\n} from '../types/prompts.types';\r\n\r\n/**\r\n * Internal response wrapper from LP API\r\n */\r\ninterface LPPromptsAPIResponse {\r\n success: boolean;\r\n statusCode: number;\r\n successResult: {\r\n prompts: LPPrompt[];\r\n };\r\n}\r\n\r\n/**\r\n * Internal response wrapper for LLM providers\r\n */\r\ninterface LPLLMProvidersAPIResponse {\r\n success: boolean;\r\n statusCode: number;\r\n successResult: {\r\n provider_subscriptions: LPLLMProviderSubscription[];\r\n };\r\n}\r\n\r\n/**\r\n * LP Prompts API\r\n *\r\n * Manage LivePerson Prompt Library prompts.\r\n * Uses Bearer authentication and the promptlibrary domain.\r\n */\r\nexport class LPPromptsAPI {\r\n private readonly scopedHttp: ScopedHTTPClient;\r\n\r\n constructor(http: HTTPClient) {\r\n // Use default bearer auth with source param\r\n this.scopedHttp = http.withDefaults({\r\n params: { source: 'ccui' },\r\n });\r\n }\r\n\r\n /**\r\n * Get all system prompts (read-only, provided by LivePerson)\r\n */\r\n async getSystemPrompts(params?: LPPromptsQueryParams): Promise<APIResponse<LPPrompt[]>> {\r\n const response = await this.scopedHttp.get<LPPromptsAPIResponse>(\r\n '/prompts/system',\r\n { params: params as Record<string, string> }\r\n );\r\n\r\n // Extract prompts array from nested response\r\n const prompts = response.data?.successResult?.prompts || [];\r\n\r\n return {\r\n data: prompts,\r\n revision: response.revision,\r\n };\r\n }\r\n\r\n /**\r\n * Get all account prompts\r\n */\r\n async getAccountPrompts(params?: LPPromptsQueryParams): Promise<APIResponse<LPPrompt[]>> {\r\n const response = await this.scopedHttp.get<LPPromptsAPIResponse>(\r\n '/prompts/account',\r\n { params: params as Record<string, string> }\r\n );\r\n\r\n // Extract prompts array from nested response\r\n const prompts = response.data?.successResult?.prompts || [];\r\n\r\n return {\r\n data: prompts,\r\n revision: response.revision,\r\n };\r\n }\r\n\r\n /**\r\n * Get a single account prompt by ID\r\n */\r\n async getById(promptId: string): Promise<APIResponse<LPPrompt>> {\r\n return this.scopedHttp.get<LPPrompt>(`/prompts/account/${promptId}`);\r\n }\r\n\r\n /**\r\n * Create a new account prompt\r\n */\r\n async create(prompt: CreateLPPromptRequest): Promise<APIResponse<LPPrompt>> {\r\n return this.scopedHttp.post<LPPrompt>('/prompts/account', prompt);\r\n }\r\n\r\n /**\r\n * Update an account prompt\r\n * @param promptId - The prompt ID\r\n * @param prompt - Updated prompt data\r\n */\r\n async update(promptId: string, prompt: UpdateLPPromptRequest): Promise<APIResponse<LPPrompt>> {\r\n return this.scopedHttp.put<LPPrompt>(`/prompts/account/${promptId}`, prompt);\r\n }\r\n\r\n /**\r\n * Delete an account prompt\r\n * @param promptId - The prompt ID\r\n */\r\n async delete(promptId: string): Promise<APIResponse<void>> {\r\n return this.scopedHttp.delete<void>(`/prompts/account/${promptId}`);\r\n }\r\n\r\n /**\r\n * Get LLM provider subscriptions for the account\r\n */\r\n async getLLMProviders(): Promise<APIResponse<LPLLMProviderSubscription[]>> {\r\n const response = await this.scopedHttp.get<LPLLMProvidersAPIResponse>(\r\n '/prompts/llm-providers'\r\n );\r\n\r\n // Extract providers array from nested response\r\n const providers = response.data?.successResult?.provider_subscriptions || [];\r\n\r\n return {\r\n data: providers,\r\n revision: response.revision,\r\n };\r\n }\r\n}\r\n","/**\r\n * Conversation Builder API Module\r\n *\r\n * Provides access to LivePerson's Conversation Builder (CB) and Knowledge AI (KAI) APIs.\r\n * Manages bots, dialogs, interactions, knowledge bases, and NLU domains.\r\n *\r\n * CB APIs use a separate authentication mechanism (cbToken + organizationId) obtained\r\n * via sentinel.authenticateCB() or from ExtendJWT verification.\r\n */\r\n\r\nimport { DomainResolver } from '../domains';\r\nimport { LPExtendSDKError, ErrorCodes } from '../types';\r\nimport type {\r\n // Bot Groups\r\n CBBotGroup,\r\n CBPaginatedResult,\r\n CBBotGroupsQueryParams,\r\n CBBotsByGroupQueryParams,\r\n // Bots\r\n CBBot,\r\n CBChatBot,\r\n CBChatBotSummaryList,\r\n // Dialogs\r\n CBDialog,\r\n CBDialogGroup,\r\n CBInteraction,\r\n CBInteractionList,\r\n // NLU\r\n CBNLUDomain,\r\n CBDomainList,\r\n CBIntent,\r\n // Knowledge Base\r\n CBKnowledgeBase,\r\n CBKnowledgeBaseList,\r\n CBKnowledgeBaseDetail,\r\n CBKBArticle,\r\n CBKBArticlesQueryParams,\r\n CBKBContentSource,\r\n CBKAISearchRequest,\r\n CBKAISearchResponse,\r\n CBKAIOnDemandConfig,\r\n // Consumer Query Metrics\r\n CBConsumerQueryMetricsParams,\r\n CBConsumerQueryMetric,\r\n CBConsumerQueryMetricsResponse,\r\n CBConsumerQueryMetricsExtendedParams,\r\n // Bot Management\r\n CBBotUser,\r\n CBBotInstanceStatus,\r\n CBAddBotAgentRequest,\r\n CBAllBotAgentsStatusQueryParams,\r\n CBPCSBotsStatusQueryParams,\r\n // Other\r\n CBResponder,\r\n CBGlobalFunctions,\r\n CBBotEnvironment,\r\n CBLPAppCredentials,\r\n CBLPSkill,\r\n CBDialogTemplateSummary,\r\n CBCredential,\r\n CBApiResponse,\r\n} from '../types';\r\n\r\n/**\r\n * CB Authentication credentials\r\n */\r\nexport interface CBAuthCredentials {\r\n /** CB API access token */\r\n cbToken: string;\r\n /** CB organization ID */\r\n organizationId: string;\r\n}\r\n\r\n/**\r\n * Conversation Builder API\r\n *\r\n * Provides methods for interacting with CB/KAI APIs.\r\n * Requires CB authentication credentials (cbToken + organizationId).\r\n *\r\n * @example\r\n * ```typescript\r\n * // Get CB credentials from sentinel or ExtendJWT verification\r\n * const cbAuth = await sdk.sentinel.authenticateCB();\r\n * const cbCreds = {\r\n * cbToken: cbAuth.successResult.apiAccessToken,\r\n * organizationId: cbAuth.successResult.sessionOrganizationId,\r\n * };\r\n *\r\n * // Initialize CB API with credentials\r\n * sdk.conversationBuilder.setCredentials(cbCreds);\r\n *\r\n * // Now use CB APIs\r\n * const bots = await sdk.conversationBuilder.getBots();\r\n * const kbs = await sdk.conversationBuilder.knowledgeBases.getAll();\r\n * ```\r\n */\r\nexport class ConversationBuilderAPI {\r\n private domainResolver: DomainResolver;\r\n private credentials: CBAuthCredentials | null = null;\r\n private debug: boolean;\r\n private timeout: number;\r\n\r\n /** Bot Groups API */\r\n public readonly botGroups: BotGroupsAPI;\r\n /** Bots API */\r\n public readonly bots: BotsAPI;\r\n /** Dialogs API */\r\n public readonly dialogs: DialogsAPI;\r\n /** Interactions API */\r\n public readonly interactions: InteractionsAPI;\r\n /** NLU Domains API */\r\n public readonly nluDomains: NLUDomainsAPI;\r\n /** Knowledge Bases API (KAI) */\r\n public readonly knowledgeBases: KnowledgeBasesAPI;\r\n /** Bot Agents API */\r\n public readonly botAgents: BotAgentsAPI;\r\n /** Integrations/Responders API */\r\n public readonly integrations: IntegrationsAPI;\r\n\r\n constructor(\r\n private readonly accountId: string,\r\n debug: boolean = false,\r\n timeout: number = 30000\r\n ) {\r\n this.domainResolver = new DomainResolver(accountId);\r\n this.debug = debug;\r\n this.timeout = timeout;\r\n\r\n // Initialize sub-APIs (they share the parent's credentials)\r\n this.botGroups = new BotGroupsAPI(this);\r\n this.bots = new BotsAPI(this);\r\n this.dialogs = new DialogsAPI(this);\r\n this.interactions = new InteractionsAPI(this);\r\n this.nluDomains = new NLUDomainsAPI(this);\r\n this.knowledgeBases = new KnowledgeBasesAPI(this);\r\n this.botAgents = new BotAgentsAPI(this);\r\n this.integrations = new IntegrationsAPI(this);\r\n }\r\n\r\n /**\r\n * Set CB authentication credentials\r\n * Must be called before making any CB API calls\r\n */\r\n setCredentials(credentials: CBAuthCredentials): void {\r\n this.credentials = credentials;\r\n this.log('CB credentials set', { organizationId: credentials.organizationId });\r\n }\r\n\r\n /**\r\n * Check if credentials are set\r\n */\r\n hasCredentials(): boolean {\r\n return this.credentials !== null;\r\n }\r\n\r\n /**\r\n * Get the current credentials\r\n * @throws If credentials not set\r\n */\r\n getCredentials(): CBAuthCredentials {\r\n if (!this.credentials) {\r\n throw new LPExtendSDKError(\r\n 'CB credentials not set. Call setCredentials() first or use sentinel.authenticateCB().',\r\n ErrorCodes.UNAUTHORIZED\r\n );\r\n }\r\n return this.credentials;\r\n }\r\n\r\n /**\r\n * Get the account ID\r\n */\r\n getAccountId(): string {\r\n return this.accountId;\r\n }\r\n\r\n /**\r\n * Get domain for a CB service\r\n */\r\n async getDomain(service: string): Promise<string> {\r\n const domain = await this.domainResolver.getDomain(service);\r\n if (!domain) {\r\n throw new LPExtendSDKError(\r\n `Could not resolve domain for CB service: ${service}`,\r\n ErrorCodes.API_ERROR\r\n );\r\n }\r\n return domain;\r\n }\r\n\r\n /**\r\n * Make authenticated request to CB API\r\n */\r\n async request<T>(\r\n service: string,\r\n path: string,\r\n options: {\r\n method?: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';\r\n body?: unknown;\r\n params?: Record<string, string | number | boolean | undefined>;\r\n } = {}\r\n ): Promise<T> {\r\n const { cbToken, organizationId } = this.getCredentials();\r\n const domain = await this.getDomain(service);\r\n const method = options.method || 'GET';\r\n\r\n // Build URL with query params\r\n let url = `https://${domain}${path}`;\r\n if (options.params) {\r\n const searchParams = new URLSearchParams();\r\n Object.entries(options.params).forEach(([key, value]) => {\r\n if (value !== undefined) {\r\n searchParams.set(key, String(value));\r\n }\r\n });\r\n const paramString = searchParams.toString();\r\n if (paramString) {\r\n url += (url.includes('?') ? '&' : '?') + paramString;\r\n }\r\n }\r\n\r\n // Build headers\r\n const headers: Record<string, string> = {\r\n 'Accept': 'application/json',\r\n 'Content-Type': 'application/json; charset=utf-8',\r\n 'authorization': cbToken,\r\n 'organizationid': organizationId,\r\n };\r\n\r\n this.log(`${method} ${url}`, { service });\r\n\r\n // Make request with timeout\r\n const controller = new AbortController();\r\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\r\n\r\n try {\r\n const response = await fetch(url, {\r\n method,\r\n headers,\r\n body: options.body ? JSON.stringify(options.body) : undefined,\r\n signal: controller.signal,\r\n });\r\n\r\n clearTimeout(timeoutId);\r\n\r\n if (!response.ok) {\r\n const errorBody = await response.json().catch(() => ({ message: 'Unknown error' }));\r\n throw new LPExtendSDKError(\r\n `CB API Error: ${response.status} - ${errorBody.message || response.statusText}`,\r\n ErrorCodes.API_ERROR,\r\n response.status,\r\n errorBody\r\n );\r\n }\r\n\r\n // Handle empty responses\r\n const contentType = response.headers.get('content-type');\r\n if (!contentType?.includes('application/json') || response.status === 204) {\r\n return undefined as T;\r\n }\r\n\r\n return await response.json();\r\n } catch (error) {\r\n clearTimeout(timeoutId);\r\n\r\n if ((error as Error).name === 'AbortError') {\r\n throw new LPExtendSDKError('CB API request timeout', ErrorCodes.TIMEOUT);\r\n }\r\n\r\n if (error instanceof LPExtendSDKError) {\r\n throw error;\r\n }\r\n\r\n throw new LPExtendSDKError(\r\n `CB API request failed: ${(error as Error).message}`,\r\n ErrorCodes.API_ERROR\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Debug logging\r\n */\r\n private log(...args: unknown[]): void {\r\n if (this.debug) {\r\n console.log('[LP-Extend-SDK:CB]', ...args);\r\n }\r\n }\r\n}\r\n\r\n// =============================================================================\r\n// Sub-APIs\r\n// =============================================================================\r\n\r\n/**\r\n * Bot Groups API\r\n */\r\nexport class BotGroupsAPI {\r\n constructor(private readonly cb: ConversationBuilderAPI) {}\r\n\r\n /**\r\n * Get all bot groups\r\n */\r\n async getAll(params?: CBBotGroupsQueryParams): Promise<CBPaginatedResult<CBBotGroup> | CBBotGroup[]> {\r\n const queryParams: Record<string, string | number | boolean | undefined> = {};\r\n if (params?.expandAll) {\r\n queryParams['expand-all'] = true;\r\n } else {\r\n queryParams.page = params?.page ?? 1;\r\n queryParams.size = params?.size ?? 100;\r\n }\r\n return this.cb.request('cbBotPlatform', '/bot-groups', { params: queryParams });\r\n }\r\n\r\n /**\r\n * Get bots by group\r\n */\r\n async getBots(params?: CBBotsByGroupQueryParams): Promise<CBPaginatedResult<CBBot>> {\r\n const queryParams: Record<string, string | number | boolean | undefined> = {\r\n 'sort-by': params?.sortBy ?? 'botName:asc',\r\n page: params?.page ?? 1,\r\n size: params?.size ?? 10,\r\n 'bot-group-id': params?.botGroupId ?? 'un_assigned',\r\n };\r\n return this.cb.request('cbBotPlatform', '/bot-groups/bots', { params: queryParams });\r\n }\r\n}\r\n\r\n/**\r\n * Bots API\r\n */\r\nexport class BotsAPI {\r\n constructor(private readonly cb: ConversationBuilderAPI) {}\r\n\r\n /**\r\n * Get all bots (legacy chatbots endpoint)\r\n */\r\n async getAll(): Promise<CBChatBotSummaryList> {\r\n return this.cb.request('botPlatform', '/bot-platform-manager-0.1/chatbots');\r\n }\r\n\r\n /**\r\n * Get chatbot by ID\r\n */\r\n async getById(chatBotId: string): Promise<CBChatBot> {\r\n return this.cb.request('cbBotPlatform', '/chatbots', {\r\n params: { chatBotId },\r\n });\r\n }\r\n\r\n /**\r\n * Get global functions for a bot\r\n */\r\n async getGlobalFunctions(botId: string): Promise<CBGlobalFunctions> {\r\n return this.cb.request('cbBotPlatform', `/bot/${botId}/globalFunctions`);\r\n }\r\n\r\n /**\r\n * Get LP app credentials for a bot\r\n */\r\n async getLPAppCredentials(chatBotId: string): Promise<CBLPAppCredentials> {\r\n return this.cb.request('cbBotPlatform', '/auth/liveperson/app', {\r\n params: { chatBotId },\r\n });\r\n }\r\n\r\n /**\r\n * Get bot environment variables\r\n */\r\n async getEnvironment(): Promise<CBApiResponse<CBBotEnvironment[]>> {\r\n const data = await this.cb.request<CBBotEnvironment[] | CBApiResponse<CBBotEnvironment[]>>('cbBotPlatform', '/auth/botenvironment/');\r\n // Wrap raw array response for consistency\r\n if (Array.isArray(data)) {\r\n return { success: true, successResult: data };\r\n }\r\n return data;\r\n }\r\n}\r\n\r\n/**\r\n * Dialogs API\r\n */\r\nexport class DialogsAPI {\r\n constructor(private readonly cb: ConversationBuilderAPI) {}\r\n\r\n /**\r\n * Get all dialogs for a bot\r\n */\r\n async getByBotId(botId: string): Promise<CBDialogGroup> {\r\n return this.cb.request('cbBotPlatform', `/bots/${botId}/dialog/`);\r\n }\r\n\r\n /**\r\n * Get dialog template summaries\r\n */\r\n async getTemplateSummary(): Promise<CBDialogTemplateSummary[]> {\r\n return this.cb.request('cbBotPlatform', '/dialog/template/summary');\r\n }\r\n}\r\n\r\n/**\r\n * Interactions API\r\n */\r\nexport class InteractionsAPI {\r\n constructor(private readonly cb: ConversationBuilderAPI) {}\r\n\r\n /**\r\n * Get all interactions for a bot\r\n */\r\n async getByBotId(botId: string): Promise<CBInteractionList> {\r\n return this.cb.request('cbBotPlatform', `/chat/${botId}/interaction/`);\r\n }\r\n}\r\n\r\n/**\r\n * NLU Domains API\r\n */\r\nexport class NLUDomainsAPI {\r\n constructor(private readonly cb: ConversationBuilderAPI) {}\r\n\r\n /**\r\n * Get all NLU domains for the organization\r\n */\r\n async getAll(): Promise<CBDomainList> {\r\n return this.cb.request('cbIbc', '/api/cb/nlu/v1/domains/getByOrgId');\r\n }\r\n\r\n /**\r\n * Get intents for a domain\r\n */\r\n async getIntents(domainId: string): Promise<CBApiResponse<CBIntent[]>> {\r\n const data = await this.cb.request<CBIntent[] | CBApiResponse<CBIntent[]>>('cbIbc', `/api/cb/nlu/v1/domains/${domainId}/intents`);\r\n // Wrap raw array response for consistency\r\n if (Array.isArray(data)) {\r\n return { success: true, successResult: data };\r\n }\r\n return data;\r\n }\r\n}\r\n\r\n/**\r\n * Knowledge Bases API (KAI)\r\n */\r\nexport class KnowledgeBasesAPI {\r\n constructor(private readonly cb: ConversationBuilderAPI) {}\r\n\r\n /**\r\n * Get all knowledge bases\r\n */\r\n async getAll(includeMetrics: boolean = true): Promise<CBKnowledgeBaseList> {\r\n return this.cb.request('cbKb', '/knowledgeDataSource', {\r\n params: { includeMetrics },\r\n });\r\n }\r\n\r\n /**\r\n * Get knowledge base by ID\r\n */\r\n async getById(kbId: string, includeMetrics: boolean = true): Promise<CBKnowledgeBaseDetail> {\r\n return this.cb.request('cbKb', `/knowledgeDataSource/${kbId}`, {\r\n params: { includeMetrics },\r\n });\r\n }\r\n\r\n /**\r\n * Get content sources for a knowledge base\r\n */\r\n async getContentSources(kbId: string, includeKmsRecipeDetails: boolean = true): Promise<CBKBContentSource[]> {\r\n return this.cb.request('cbKb', `/kb/${kbId}/content_sources`, {\r\n params: { includeKmsRecipeDetails },\r\n });\r\n }\r\n\r\n /**\r\n * Get articles for a knowledge base\r\n */\r\n async getArticles(kbId: string, params?: CBKBArticlesQueryParams): Promise<CBPaginatedResult<CBKBArticle>> {\r\n const body = {\r\n page: params?.page ?? 1,\r\n size: params?.size ?? 20,\r\n sortAscByLastModificationTime: params?.sortAscByLastModificationTime ?? false,\r\n articleIds: params?.articleIds ?? [],\r\n };\r\n return this.cb.request('cbKb', `/kb/${kbId}/articles`, {\r\n method: 'POST',\r\n body,\r\n params: { includeConflictingDetails: params?.includeConflictingDetails ?? true },\r\n });\r\n }\r\n\r\n /**\r\n * Search knowledge base using KAI\r\n */\r\n async search(kbId: string, searchRequest: CBKAISearchRequest): Promise<CBKAISearchResponse> {\r\n // Try cbAiSearch domain first, fallback to cbKb\r\n try {\r\n return await this.cb.request('cbAiSearch', `/v1/account/${this.cb.getAccountId()}/kb/${kbId}/search`, {\r\n method: 'POST',\r\n body: searchRequest,\r\n });\r\n } catch {\r\n // Fallback to cbKb domain\r\n return this.cb.request('cbKb', `/kb/${kbId}/search`, {\r\n method: 'POST',\r\n body: searchRequest,\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Get KAI On-Demand configurations\r\n */\r\n async getOnDemandConfigs(): Promise<CBKAIOnDemandConfig[]> {\r\n return this.cb.request('cbKb', '/on-demand/configs');\r\n }\r\n\r\n /**\r\n * Get default prompt for KAI\r\n */\r\n async getDefaultPrompt(): Promise<unknown> {\r\n return this.cb.request('cbKb', '/default-prompt');\r\n }\r\n\r\n /**\r\n * Get consumer query metrics for a knowledge base\r\n *\r\n * Retrieves answered and/or unanswered query metrics within a date range.\r\n * Note: The API only supports 7-day ranges. For longer ranges, use getConsumerQueryMetricsExtended().\r\n *\r\n * @param params - Query parameters including kbId, startTime, endTime, and eventType\r\n * @returns Promise resolving to consumer query metrics\r\n *\r\n * @example\r\n * ```typescript\r\n * const metrics = await sdk.conversationBuilder.knowledgeBases.getConsumerQueryMetrics({\r\n * kbId: 'kb-123',\r\n * startTime: Date.now() - 7 * 24 * 60 * 60 * 1000, // 7 days ago\r\n * endTime: Date.now(),\r\n * eventType: ['EVENT_KB_UN_ANSWERED'],\r\n * });\r\n * ```\r\n */\r\n async getConsumerQueryMetrics(params: CBConsumerQueryMetricsParams): Promise<CBConsumerQueryMetricsResponse> {\r\n const body = {\r\n startTime: String(params.startTime),\r\n endTime: String(params.endTime),\r\n eventType: params.eventType,\r\n kbId: params.kbId,\r\n };\r\n return this.cb.request('cbKb', '/kb/consumerQueryMetrics', {\r\n method: 'POST',\r\n body,\r\n });\r\n }\r\n\r\n /**\r\n * Get consumer query metrics for extended date ranges (up to 3 months)\r\n *\r\n * Automatically iterates through 7-day chunks to retrieve all metrics within\r\n * the specified date range. Useful for historical analysis beyond the 7-day API limit.\r\n *\r\n * @param params - Extended query parameters including startDate, endDate, kbId, and eventType\r\n * @returns Promise resolving to aggregated consumer query metrics from all chunks\r\n *\r\n * @example\r\n * ```typescript\r\n * const metrics = await sdk.conversationBuilder.knowledgeBases.getConsumerQueryMetricsExtended({\r\n * kbId: 'kb-123',\r\n * startDate: new Date('2024-01-01'),\r\n * endDate: new Date('2024-03-01'),\r\n * eventType: ['EVENT_KB_ANSWERED', 'EVENT_KB_UN_ANSWERED'],\r\n * onProgress: (completed, total) => console.log(`${completed}/${total} chunks processed`),\r\n * });\r\n * ```\r\n */\r\n async getConsumerQueryMetricsExtended(params: CBConsumerQueryMetricsExtendedParams): Promise<CBConsumerQueryMetric[]> {\r\n const { startDate, endDate, eventType, kbId, onProgress } = params;\r\n\r\n // Convert to timestamps\r\n const startMs = typeof startDate === 'number' ? startDate : startDate.getTime();\r\n const endMs = typeof endDate === 'number' ? endDate : endDate.getTime();\r\n\r\n // Validate date range (max 3 months = ~90 days)\r\n const maxRangeMs = 90 * 24 * 60 * 60 * 1000;\r\n if (endMs - startMs > maxRangeMs) {\r\n throw new LPExtendSDKError(\r\n 'Date range exceeds maximum of 90 days. Please use a smaller range.',\r\n ErrorCodes.INVALID_CONFIG\r\n );\r\n }\r\n\r\n // Calculate 7-day chunks\r\n const chunkSizeMs = 7 * 24 * 60 * 60 * 1000;\r\n const chunks: Array<{ start: number; end: number }> = [];\r\n\r\n let chunkStart = startMs;\r\n while (chunkStart < endMs) {\r\n const chunkEnd = Math.min(chunkStart + chunkSizeMs, endMs);\r\n chunks.push({ start: chunkStart, end: chunkEnd });\r\n chunkStart = chunkEnd;\r\n }\r\n\r\n // Fetch all chunks\r\n const allMetrics: CBConsumerQueryMetric[] = [];\r\n\r\n for (let i = 0; i < chunks.length; i++) {\r\n const chunk = chunks[i];\r\n\r\n try {\r\n const response = await this.getConsumerQueryMetrics({\r\n kbId,\r\n startTime: chunk.start,\r\n endTime: chunk.end,\r\n eventType,\r\n });\r\n\r\n if (response.data && Array.isArray(response.data)) {\r\n allMetrics.push(...response.data);\r\n }\r\n } catch (error) {\r\n // Log error but continue with other chunks\r\n console.warn(`Failed to fetch metrics for chunk ${i + 1}/${chunks.length}:`, error);\r\n }\r\n\r\n // Report progress\r\n if (onProgress) {\r\n onProgress(i + 1, chunks.length);\r\n }\r\n }\r\n\r\n // Deduplicate by id if available, or by unique query+timestamp combination\r\n const seen = new Set<string>();\r\n const uniqueMetrics = allMetrics.filter(metric => {\r\n const key = metric.id || `${metric.consumerQuery}-${metric.timestamp}`;\r\n if (seen.has(key)) return false;\r\n seen.add(key);\r\n return true;\r\n });\r\n\r\n return uniqueMetrics;\r\n }\r\n}\r\n\r\n/**\r\n * Bot Agents API\r\n */\r\nexport class BotAgentsAPI {\r\n constructor(private readonly cb: ConversationBuilderAPI) {}\r\n\r\n /**\r\n * Get bot instance status\r\n */\r\n async getInstanceStatus(botId: string): Promise<CBBotInstanceStatus> {\r\n return this.cb.request('cbMonitoring', `/sysadmin/nodejs/instance/status-v2/${botId}`);\r\n }\r\n\r\n /**\r\n * Start a bot agent\r\n */\r\n async start(botId: string, lpAccountId: string, lpAccountUser: string): Promise<unknown> {\r\n return this.cb.request('cbMonitoring', `/sysadmin/nodejs/instance/start/${botId}`, {\r\n method: 'PUT',\r\n body: { lpAccountId, lpAccountUser },\r\n });\r\n }\r\n\r\n /**\r\n * Stop a bot agent\r\n */\r\n async stop(botId: string, lpAccountId: string, lpAccountUser: string): Promise<unknown> {\r\n return this.cb.request('cbMonitoring', `/sysadmin/nodejs/instance/stop/${botId}`, {\r\n method: 'PUT',\r\n body: { lpAccountId, lpAccountUser },\r\n });\r\n }\r\n\r\n /**\r\n * Get all bot agents status\r\n */\r\n async getAllStatus(params?: CBAllBotAgentsStatusQueryParams): Promise<unknown> {\r\n return this.cb.request('cbMonitoring', '/sysadmin/nodejs/instance/status', {\r\n params: { environment: params?.environment ?? 'PRODUCTION' },\r\n });\r\n }\r\n\r\n /**\r\n * Get PCS bots status\r\n */\r\n async getPCSStatus(params?: CBPCSBotsStatusQueryParams): Promise<unknown> {\r\n return this.cb.request('cbMonitoring', '/sysadmin/nodejs/instance/pcs/status', {\r\n params: { showBotsData: params?.showBotsData ?? true },\r\n });\r\n }\r\n\r\n /**\r\n * Get bot users\r\n */\r\n async getBotUsers(): Promise<CBBotUser[]> {\r\n return this.cb.request('cbExternalIntegrations', `/live-engage-service-0.1/le/accounts/${this.cb.getAccountId()}/bot_users`);\r\n }\r\n\r\n /**\r\n * Add a bot agent\r\n */\r\n async addAgent(lpUserId: string, chatBotId: string, request: CBAddBotAgentRequest): Promise<CBBotUser> {\r\n return this.cb.request('cbExternalIntegrations', `/live-engage-service-0.1/le/accounts/${this.cb.getAccountId()}/bot_users/${lpUserId}`, {\r\n method: 'POST',\r\n body: request,\r\n params: { chatBotId },\r\n });\r\n }\r\n}\r\n\r\n/**\r\n * Integrations/Responders API\r\n */\r\nexport class IntegrationsAPI {\r\n constructor(private readonly cb: ConversationBuilderAPI) {}\r\n\r\n /**\r\n * Get responders for a chatbot\r\n */\r\n async getResponders(chatBotId: string): Promise<CBResponder[]> {\r\n return this.cb.request('cbBotPlatform', '/responder', {\r\n params: { chatBotId },\r\n });\r\n }\r\n\r\n /**\r\n * Get LP skills\r\n */\r\n async getLPSkills(): Promise<CBLPSkill[]> {\r\n return this.cb.request('cbExternalIntegrations', `/live-engage-service-0.1/le/accounts/${this.cb.getAccountId()}/skills`);\r\n }\r\n\r\n /**\r\n * Get credentials\r\n */\r\n async getCredentials(): Promise<CBCredential[]> {\r\n return this.cb.request('cbExternalIntegrations', '/auth-service-0.1/credentials');\r\n }\r\n}\r\n","/**\r\n * LP Extend Client SDK\r\n *\r\n * Main SDK class providing typed access to LivePerson APIs.\r\n * The SDK calls LP APIs directly after verifying scopes with the shell.\r\n *\r\n * @example\r\n * ```typescript\r\n * import { initializeSDK } from '@lpextend/client-sdk';\r\n *\r\n * // Initialize the SDK\r\n * const sdk = await initializeSDK({\r\n * appId: 'my-app',\r\n * accountId: '12345678',\r\n * accessToken: 'user-lp-token',\r\n * scopes: ['skills', 'users', 'aiStudio'],\r\n * });\r\n *\r\n * // Check granted scopes\r\n * console.log('Granted scopes:', sdk.grantedScopes);\r\n *\r\n * // Use the typed APIs - calls LP APIs directly\r\n * const { data: skills, revision } = await sdk.skills.getAll();\r\n *\r\n * // Update with revision for optimistic locking\r\n * await sdk.skills.update(skills[0].id, { name: 'New Name' }, revision);\r\n *\r\n * // AI Studio (uses CC-Bearer auth automatically)\r\n * const { data: flows } = await sdk.aiStudio.flows.getAll();\r\n * ```\r\n */\r\n\r\nimport { HTTPClient } from './http';\r\nimport type { LPExtendSDKConfig, SDKInitResult, ExtendJWTVerifyResponse } from './types';\r\nimport { LPExtendSDKError, ErrorCodes } from './types';\r\n\r\n// Account Config APIs\r\nimport {\r\n SkillsAPI,\r\n UsersAPI,\r\n AgentGroupsAPI,\r\n ProfilesAPI,\r\n LOBsAPI,\r\n CampaignsAPI,\r\n EngagementsAPI,\r\n PredefinedContentAPI,\r\n AutomaticMessagesAPI,\r\n WorkingHoursAPI,\r\n SpecialOccasionsAPI,\r\n} from './api/account-config.api';\r\n\r\n// AI Studio API\r\nimport { AIStudioAPI } from './api/ai-studio.api';\r\n\r\n// Messaging APIs\r\nimport { MessagingAPI } from './api/messaging.api';\r\n\r\n// Sentinel (IDP) APIs\r\nimport { SentinelAPI } from './api/sentinel.api';\r\n\r\n// LP Prompts API (Prompt Library)\r\nimport { LPPromptsAPI } from './api/prompts.api';\r\n\r\n// Conversation Builder API\r\nimport { ConversationBuilderAPI } from './api/conversation-builder.api';\r\n\r\n// Re-export API classes for typing\r\nexport {\r\n SkillsAPI,\r\n UsersAPI,\r\n AgentGroupsAPI,\r\n ProfilesAPI,\r\n LOBsAPI,\r\n CampaignsAPI,\r\n EngagementsAPI,\r\n PredefinedContentAPI,\r\n AutomaticMessagesAPI,\r\n WorkingHoursAPI,\r\n SpecialOccasionsAPI,\r\n} from './api/account-config.api';\r\n\r\nexport {\r\n AIStudioAPI,\r\n CategoriesAPI,\r\n ConversationsAPI,\r\n SummaryAPI,\r\n QueryAPI,\r\n SimulationsAPI,\r\n TranscriptAnalysisAPI,\r\n KnowledgebasesAPI,\r\n EvaluatorsAPI,\r\n GeneratorsAPI,\r\n PromptLibraryAPI,\r\n AIStudioUsersAPI,\r\n FlowsAPI,\r\n} from './api/ai-studio.api';\r\n\r\nexport {\r\n MessagingAPI,\r\n MessagingHistoryAPI,\r\n AgentMetricsAPI,\r\n AgentActivityAPI,\r\n MessagingOperationsAPI,\r\n ConnectToMessagingAPI,\r\n OutboundReportingAPI,\r\n} from './api/messaging.api';\r\n\r\nexport { SentinelAPI } from './api/sentinel.api';\r\n\r\nexport { LPPromptsAPI } from './api/prompts.api';\r\n\r\nexport {\r\n ConversationBuilderAPI,\r\n BotGroupsAPI,\r\n BotsAPI,\r\n DialogsAPI,\r\n InteractionsAPI,\r\n NLUDomainsAPI,\r\n KnowledgeBasesAPI,\r\n BotAgentsAPI,\r\n IntegrationsAPI,\r\n} from './api/conversation-builder.api';\r\n\r\nexport type { CBAuthCredentials } from './api/conversation-builder.api';\r\n\r\n/**\r\n * LP Extend Client SDK\r\n *\r\n * Main SDK instance providing access to all LivePerson APIs.\r\n * Calls LP APIs directly after verifying scopes with the shell.\r\n *\r\n * Account Configuration APIs (Bearer auth):\r\n * - skills: Manage routing skills\r\n * - users: Manage users and agents\r\n * - agentGroups: Manage agent groups\r\n * - profiles: Manage permission profiles\r\n * - lobs: Manage lines of business\r\n * - campaigns: Manage campaigns\r\n * - engagements: Manage campaign engagements\r\n * - predefinedContent: Manage canned responses\r\n * - automaticMessages: Manage automatic messages\r\n * - workingHours: Manage working hours schedules\r\n * - specialOccasions: Manage special occasions\r\n *\r\n * AI Studio APIs (CC-Bearer auth):\r\n * - aiStudio.categories: Manage categories\r\n * - aiStudio.conversations: Manage conversations\r\n * - aiStudio.summary: Generate summaries\r\n * - aiStudio.simulations: Run simulations\r\n * - aiStudio.knowledgebases: Manage knowledge bases\r\n * - aiStudio.flows: Invoke AI flows\r\n * - aiStudio.promptLibrary: Manage prompts\r\n * - And more...\r\n *\r\n * Messaging APIs:\r\n * - messaging.history: Query conversation history\r\n * - messaging.agentMetrics: Get agent metrics\r\n * - messaging.operations: Transfer, close, send messages\r\n * - messaging.connect: Create new conversations\r\n */\r\nexport class LPExtendSDK {\r\n // =========================================================================\r\n // Account Configuration APIs\r\n // =========================================================================\r\n\r\n /** Skills API - Manage routing skills */\r\n public readonly skills: SkillsAPI;\r\n /** Users API - Manage users and agents */\r\n public readonly users: UsersAPI;\r\n /** Agent Groups API - Manage agent groups */\r\n public readonly agentGroups: AgentGroupsAPI;\r\n /** Profiles API - Manage permission profiles */\r\n public readonly profiles: ProfilesAPI;\r\n /** LOBs API - Manage lines of business */\r\n public readonly lobs: LOBsAPI;\r\n /** Campaigns API - Manage campaigns */\r\n public readonly campaigns: CampaignsAPI;\r\n /** Engagements API - Manage campaign engagements */\r\n public readonly engagements: EngagementsAPI;\r\n /** Predefined Content API - Manage canned responses */\r\n public readonly predefinedContent: PredefinedContentAPI;\r\n /** Automatic Messages API - Manage automatic messages */\r\n public readonly automaticMessages: AutomaticMessagesAPI;\r\n /** Working Hours API - Manage working hours schedules */\r\n public readonly workingHours: WorkingHoursAPI;\r\n /** Special Occasions API - Manage special occasions */\r\n public readonly specialOccasions: SpecialOccasionsAPI;\r\n\r\n // =========================================================================\r\n // AI Studio APIs (CC-Bearer auth)\r\n // =========================================================================\r\n\r\n /** AI Studio API - Access AI Studio features */\r\n public readonly aiStudio: AIStudioAPI;\r\n\r\n // =========================================================================\r\n // Messaging APIs\r\n // =========================================================================\r\n\r\n /** Messaging API - History, metrics, operations */\r\n public readonly messaging: MessagingAPI;\r\n\r\n // =========================================================================\r\n // Sentinel (IDP) APIs\r\n // =========================================================================\r\n\r\n /** Sentinel API - Authentication, login, token management */\r\n public readonly sentinel: SentinelAPI;\r\n\r\n // =========================================================================\r\n // LP Prompts API (Prompt Library)\r\n // =========================================================================\r\n\r\n /** LP Prompts API - Manage prompts from LivePerson Prompt Library */\r\n public readonly prompts: LPPromptsAPI;\r\n\r\n // =========================================================================\r\n // Conversation Builder API\r\n // =========================================================================\r\n\r\n /**\r\n * Conversation Builder API - Manage bots, dialogs, knowledge bases, NLU\r\n *\r\n * NOTE: CB APIs require separate authentication. After SDK init, call:\r\n * ```typescript\r\n * const cbAuth = await sdk.sentinel.authenticateCB();\r\n * sdk.conversationBuilder.setCredentials({\r\n * cbToken: cbAuth.successResult.apiAccessToken,\r\n * organizationId: cbAuth.successResult.sessionOrganizationId,\r\n * });\r\n * ```\r\n *\r\n * Or if using ExtendJWT (v2 auth), credentials may be set automatically\r\n * from the verification response.\r\n */\r\n public readonly conversationBuilder: ConversationBuilderAPI;\r\n\r\n // =========================================================================\r\n // SDK Properties\r\n // =========================================================================\r\n\r\n /** Scopes granted by app registration */\r\n public readonly grantedScopes: string[];\r\n /** App name from registration */\r\n public readonly appName: string;\r\n\r\n private readonly http: HTTPClient;\r\n private readonly debug: boolean;\r\n\r\n /**\r\n * Create SDK instance (use initializeSDK() instead for async init)\r\n */\r\n constructor(\r\n private readonly config: LPExtendSDKConfig,\r\n initResult: SDKInitResult\r\n ) {\r\n this.debug = config.debug ?? false;\r\n this.grantedScopes = initResult.grantedScopes;\r\n this.appName = initResult.appName;\r\n\r\n const timeout = config.timeout ?? 30000;\r\n\r\n // Initialize HTTP client - calls LP APIs directly\r\n // Note: accessToken is guaranteed to exist at this point (validated in createSDK)\r\n this.http = new HTTPClient(\r\n config.accountId,\r\n config.accessToken!,\r\n timeout,\r\n this.debug\r\n );\r\n\r\n // Initialize Account Configuration APIs\r\n this.skills = new SkillsAPI(this.http);\r\n this.users = new UsersAPI(this.http);\r\n this.agentGroups = new AgentGroupsAPI(this.http);\r\n this.profiles = new ProfilesAPI(this.http);\r\n this.lobs = new LOBsAPI(this.http);\r\n this.campaigns = new CampaignsAPI(this.http);\r\n this.engagements = new EngagementsAPI(this.http);\r\n this.predefinedContent = new PredefinedContentAPI(this.http);\r\n this.automaticMessages = new AutomaticMessagesAPI(this.http);\r\n this.workingHours = new WorkingHoursAPI(this.http);\r\n this.specialOccasions = new SpecialOccasionsAPI(this.http);\r\n\r\n // Initialize AI Studio API (uses CC-Bearer internally)\r\n this.aiStudio = new AIStudioAPI(this.http, this.config.accountId);\r\n\r\n // Initialize Messaging APIs\r\n this.messaging = new MessagingAPI(this.http);\r\n\r\n // Initialize Sentinel (IDP) APIs\r\n this.sentinel = new SentinelAPI(this.http);\r\n\r\n // Initialize LP Prompts API (Prompt Library)\r\n this.prompts = new LPPromptsAPI(this.http);\r\n\r\n // Initialize Conversation Builder API\r\n // Note: CB requires separate authentication - call sdk.conversationBuilder.setCredentials()\r\n this.conversationBuilder = new ConversationBuilderAPI(config.accountId, this.debug, timeout);\r\n\r\n this.log('SDK initialized with scopes:', this.grantedScopes);\r\n }\r\n\r\n /**\r\n * Get the current account ID\r\n */\r\n get accountId(): string {\r\n return this.config.accountId;\r\n }\r\n\r\n /**\r\n * Get the app ID\r\n */\r\n get appId(): string {\r\n return this.config.appId;\r\n }\r\n\r\n /**\r\n * Check if a scope was granted\r\n */\r\n hasScope(scope: string): boolean {\r\n return this.grantedScopes.includes(scope);\r\n }\r\n\r\n /**\r\n * Check if multiple scopes were granted\r\n */\r\n hasScopes(scopes: string[]): boolean {\r\n return scopes.every((scope) => this.grantedScopes.includes(scope));\r\n }\r\n\r\n /**\r\n * Check if any of the specified scopes were granted\r\n */\r\n hasAnyScope(scopes: string[]): boolean {\r\n return scopes.some((scope) => this.grantedScopes.includes(scope));\r\n }\r\n\r\n /**\r\n * Debug logging\r\n */\r\n private log(...args: unknown[]): void {\r\n if (this.debug) {\r\n console.log('[LP-Extend-SDK]', ...args);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Initialize the SDK with async init call\r\n *\r\n * This calls the shell backend to verify app registration and get granted scopes,\r\n * then creates an SDK that calls LP APIs directly.\r\n *\r\n * Supports four authentication modes (in order of preference):\r\n * 1. API Key (RECOMMENDED for backend apps): Provide `apiKey` - SDK authenticates with shell\r\n * 2. ExtendJWT token (for iframe apps): Provide `extendToken` - SDK verifies with shell and gets LP token\r\n * 3. Direct access token: Provide `accessToken` directly\r\n * 4. Shell token (LEGACY): Provide `shellToken` to fetch the LP token from the shell\r\n */\r\nexport async function createSDK(config: LPExtendSDKConfig): Promise<LPExtendSDK> {\r\n // Validate config\r\n if (!config.appId) {\r\n throw new LPExtendSDKError('appId is required', ErrorCodes.INVALID_CONFIG);\r\n }\r\n if (!config.accountId) {\r\n throw new LPExtendSDKError('accountId is required', ErrorCodes.INVALID_CONFIG);\r\n }\r\n if (!config.accessToken && !config.extendToken && !config.shellToken && !config.apiKey) {\r\n throw new LPExtendSDKError(\r\n 'Either accessToken, apiKey, extendToken, or shellToken is required',\r\n ErrorCodes.INVALID_CONFIG\r\n );\r\n }\r\n\r\n const debug = config.debug ?? false;\r\n const timeout = config.timeout ?? 30000;\r\n\r\n // Detect shell base URL for scope verification\r\n let shellBaseUrl = config.shellBaseUrl;\r\n if (!shellBaseUrl) {\r\n // In Node.js, check environment variable\r\n if (typeof process !== 'undefined' && process.env?.LPEXTEND_SHELL_URL) {\r\n shellBaseUrl = process.env.LPEXTEND_SHELL_URL;\r\n } else if (typeof window !== 'undefined') {\r\n try {\r\n if (window.self !== window.top && document.referrer) {\r\n const url = new URL(document.referrer);\r\n shellBaseUrl = url.origin;\r\n }\r\n } catch {\r\n // Cross-origin restriction\r\n }\r\n shellBaseUrl = shellBaseUrl || window.location.origin;\r\n } else if (config.apiKey || config.extendToken || config.shellToken) {\r\n throw new LPExtendSDKError(\r\n 'shellBaseUrl is required when using apiKey, extendToken, or shellToken in non-browser environments. ' +\r\n 'Set LPEXTEND_SHELL_URL environment variable or pass shellBaseUrl in config.',\r\n ErrorCodes.INVALID_CONFIG\r\n );\r\n }\r\n }\r\n\r\n // Determine access token - from direct, apiKey+extendToken, extendToken, or shellToken\r\n let accessToken = config.accessToken;\r\n\r\n // API Key + ExtendJWT authentication (RECOMMENDED)\r\n // Child app receives ExtendJWT from shell, verifies with shell using API key\r\n if (!accessToken && config.apiKey && config.extendToken) {\r\n const verifyUrl = `${shellBaseUrl}/api/v1/apps/verify`;\r\n\r\n if (debug) {\r\n console.log('[LP-Extend-SDK] Verifying ExtendJWT with API key');\r\n console.log('[LP-Extend-SDK] Shell URL:', shellBaseUrl);\r\n console.log('[LP-Extend-SDK] Verify URL:', verifyUrl);\r\n console.log('[LP-Extend-SDK] API Key:', config.apiKey.substring(0, 20) + '...');\r\n console.log('[LP-Extend-SDK] ExtendToken length:', config.extendToken.length);\r\n }\r\n\r\n const authController = new AbortController();\r\n const authTimeoutId = setTimeout(() => authController.abort(), timeout);\r\n\r\n try {\r\n const authResponse = await fetch(verifyUrl, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'X-LPExtend-API-Key': config.apiKey,\r\n },\r\n body: JSON.stringify({\r\n token: config.extendToken,\r\n }),\r\n signal: authController.signal,\r\n });\r\n\r\n clearTimeout(authTimeoutId);\r\n\r\n if (!authResponse.ok) {\r\n const errorData = await authResponse.json().catch(() => ({}));\r\n\r\n if (authResponse.status === 401) {\r\n throw new LPExtendSDKError(\r\n errorData.message || 'Invalid API key or ExtendJWT',\r\n ErrorCodes.UNAUTHORIZED,\r\n authResponse.status,\r\n errorData\r\n );\r\n }\r\n\r\n if (authResponse.status === 403) {\r\n throw new LPExtendSDKError(\r\n errorData.message || 'App not authorized for this account',\r\n ErrorCodes.APP_NOT_REGISTERED,\r\n authResponse.status,\r\n errorData\r\n );\r\n }\r\n\r\n throw new LPExtendSDKError(\r\n errorData.message || `Token verification failed: ${authResponse.status}`,\r\n ErrorCodes.API_ERROR,\r\n authResponse.status,\r\n errorData\r\n );\r\n }\r\n\r\n const authData = await authResponse.json();\r\n accessToken = authData.lpAccessToken;\r\n\r\n if (debug) {\r\n console.log('[LP-Extend-SDK] ExtendJWT verified with API key');\r\n console.log('[LP-Extend-SDK] User:', authData.user?.lpUserId, 'Account:', authData.user?.lpAccountId);\r\n console.log('[LP-Extend-SDK] Allowed APIs:', authData.allowedApis);\r\n }\r\n\r\n // Create SDK directly with the authenticated access token\r\n const resolvedConfig = { ...config, accessToken };\r\n const initResult: SDKInitResult = {\r\n appId: config.appId,\r\n accountId: authData.user?.lpAccountId || config.accountId,\r\n grantedScopes: authData.allowedApis || [],\r\n appName: config.appId,\r\n version: '1.0.0',\r\n };\r\n return new LPExtendSDK(resolvedConfig, initResult);\r\n } catch (error) {\r\n clearTimeout(authTimeoutId);\r\n\r\n if (debug) {\r\n console.error('[LP-Extend-SDK] ExtendJWT verification error:', {\r\n name: (error as Error).name,\r\n message: (error as Error).message,\r\n cause: (error as any).cause?.message || (error as any).cause,\r\n verifyUrl,\r\n });\r\n }\r\n\r\n if (error instanceof LPExtendSDKError) {\r\n throw error;\r\n }\r\n\r\n if ((error as Error).name === 'AbortError') {\r\n throw new LPExtendSDKError('Token verification timeout', ErrorCodes.TIMEOUT);\r\n }\r\n\r\n // Include more context about the failure\r\n const errorMessage = (error as any).cause?.message || (error as Error).message;\r\n throw new LPExtendSDKError(\r\n `ExtendJWT verification failed: ${errorMessage}`,\r\n ErrorCodes.INIT_FAILED\r\n );\r\n }\r\n }\r\n\r\n // API Key only - error, need ExtendJWT too\r\n if (!accessToken && config.apiKey && !config.extendToken) {\r\n throw new LPExtendSDKError(\r\n 'API key authentication requires extendToken. ' +\r\n 'The ExtendJWT is passed from the shell to your app when opened in an iframe.',\r\n ErrorCodes.INVALID_CONFIG\r\n );\r\n }\r\n\r\n // ExtendJWT without API key (legacy flow - calls old verify endpoint)\r\n if (!accessToken && config.extendToken && !config.apiKey) {\r\n if (debug) {\r\n console.log('[LP-Extend-SDK] Verifying ExtendJWT with shell');\r\n }\r\n\r\n const verifyUrl = `${shellBaseUrl}/api/v2/auth/verify-child`;\r\n\r\n const extendController = new AbortController();\r\n const extendTimeoutId = setTimeout(() => extendController.abort(), timeout);\r\n\r\n try {\r\n const verifyResponse = await fetch(verifyUrl, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n },\r\n body: JSON.stringify({\r\n extendToken: config.extendToken,\r\n appId: config.appId,\r\n }),\r\n signal: extendController.signal,\r\n });\r\n\r\n clearTimeout(extendTimeoutId);\r\n\r\n if (!verifyResponse.ok) {\r\n const errorData = await verifyResponse.json().catch(() => ({}));\r\n\r\n if (verifyResponse.status === 401) {\r\n throw new LPExtendSDKError(\r\n errorData.message || 'ExtendJWT invalid or expired',\r\n ErrorCodes.UNAUTHORIZED,\r\n verifyResponse.status,\r\n errorData\r\n );\r\n }\r\n\r\n throw new LPExtendSDKError(\r\n errorData.message || `ExtendJWT verification failed: ${verifyResponse.status}`,\r\n ErrorCodes.API_ERROR,\r\n verifyResponse.status,\r\n errorData\r\n );\r\n }\r\n\r\n const authData: ExtendJWTVerifyResponse = await verifyResponse.json();\r\n accessToken = authData.lpAccessToken;\r\n\r\n if (debug) {\r\n console.log('[LP-Extend-SDK] ExtendJWT verified, got LP access token');\r\n console.log('[LP-Extend-SDK] User:', authData.lpUserId, 'Account:', authData.lpAccountId);\r\n }\r\n\r\n // ExtendJWT authentication grants all scopes - skip scope verification with shell\r\n // since we can't call the shell's sdk/init endpoint without extend_auth cookie\r\n const grantedScopes = config.scopes || ['*'];\r\n\r\n if (debug) {\r\n console.log('[LP-Extend-SDK] ExtendJWT auth grants all scopes:', grantedScopes);\r\n console.log('[LP-Extend-SDK] SDK will call LP APIs directly');\r\n }\r\n\r\n // Create SDK directly with the verified access token\r\n const resolvedConfig = { ...config, accessToken };\r\n const initResult: SDKInitResult = {\r\n appId: config.appId,\r\n accountId: config.accountId,\r\n grantedScopes,\r\n appName: config.appId,\r\n version: '1.0.0',\r\n };\r\n return new LPExtendSDK(resolvedConfig, initResult);\r\n } catch (error) {\r\n clearTimeout(extendTimeoutId);\r\n\r\n if (error instanceof LPExtendSDKError) {\r\n throw error;\r\n }\r\n\r\n if ((error as Error).name === 'AbortError') {\r\n throw new LPExtendSDKError('ExtendJWT verification timeout', ErrorCodes.TIMEOUT);\r\n }\r\n\r\n throw new LPExtendSDKError(\r\n `ExtendJWT verification failed: ${(error as Error).message}`,\r\n ErrorCodes.INIT_FAILED\r\n );\r\n }\r\n }\r\n\r\n // LEGACY: Shell token authentication\r\n if (!accessToken && config.shellToken) {\r\n if (debug) {\r\n console.log('[LP-Extend-SDK] Fetching LP token from shell using shellToken (legacy)');\r\n }\r\n\r\n // Fetch LP token from shell\r\n const tokenUrl = `${shellBaseUrl}/api/v1/shell/token/${config.accountId}/lp-token`;\r\n\r\n const tokenController = new AbortController();\r\n const tokenTimeoutId = setTimeout(() => tokenController.abort(), timeout);\r\n\r\n try {\r\n const tokenResponse = await fetch(tokenUrl, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'X-Shell-Token': config.shellToken,\r\n },\r\n body: JSON.stringify({\r\n appId: config.appId,\r\n scopes: config.scopes,\r\n }),\r\n signal: tokenController.signal,\r\n });\r\n\r\n clearTimeout(tokenTimeoutId);\r\n\r\n if (!tokenResponse.ok) {\r\n const errorData = await tokenResponse.json().catch(() => ({}));\r\n\r\n if (tokenResponse.status === 401) {\r\n throw new LPExtendSDKError(\r\n errorData.message || 'Shell token invalid or expired',\r\n ErrorCodes.UNAUTHORIZED,\r\n tokenResponse.status,\r\n errorData\r\n );\r\n }\r\n\r\n if (tokenResponse.status === 403) {\r\n throw new LPExtendSDKError(\r\n errorData.message || 'App not installed or disabled',\r\n ErrorCodes.APP_NOT_REGISTERED,\r\n tokenResponse.status,\r\n errorData\r\n );\r\n }\r\n\r\n if (tokenResponse.status === 404) {\r\n throw new LPExtendSDKError(\r\n errorData.message || 'No LP token found - user may need to re-authenticate',\r\n ErrorCodes.NOT_FOUND,\r\n tokenResponse.status,\r\n errorData\r\n );\r\n }\r\n\r\n throw new LPExtendSDKError(\r\n errorData.message || `Failed to retrieve LP token: ${tokenResponse.status}`,\r\n ErrorCodes.API_ERROR,\r\n tokenResponse.status,\r\n errorData\r\n );\r\n }\r\n\r\n const tokenData = await tokenResponse.json();\r\n accessToken = tokenData.accessToken;\r\n\r\n if (debug) {\r\n console.log('[LP-Extend-SDK] LP token retrieved successfully');\r\n }\r\n } catch (error) {\r\n clearTimeout(tokenTimeoutId);\r\n\r\n if (error instanceof LPExtendSDKError) {\r\n throw error;\r\n }\r\n\r\n if ((error as Error).name === 'AbortError') {\r\n throw new LPExtendSDKError('LP token retrieval timeout', ErrorCodes.TIMEOUT);\r\n }\r\n\r\n throw new LPExtendSDKError(\r\n `Failed to retrieve LP token: ${(error as Error).message}`,\r\n ErrorCodes.INIT_FAILED\r\n );\r\n }\r\n }\r\n\r\n if (debug) {\r\n console.log('[LP-Extend-SDK] Verifying scopes with shell:', shellBaseUrl);\r\n }\r\n\r\n // Call shell backend to verify app and get scopes\r\n const initUrl = `${shellBaseUrl}/api/v1/lp/${config.accountId}/sdk/init`;\r\n\r\n const controller = new AbortController();\r\n const timeoutId = setTimeout(() => controller.abort(), timeout);\r\n\r\n try {\r\n const response = await fetch(initUrl, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n Authorization: `Bearer ${accessToken}`,\r\n 'X-App-Id': config.appId,\r\n },\r\n body: JSON.stringify({ scopes: config.scopes || [] }),\r\n signal: controller.signal,\r\n });\r\n\r\n clearTimeout(timeoutId);\r\n\r\n if (!response.ok) {\r\n const errorBody = await response.json().catch(() => ({ message: 'Unknown error' }));\r\n\r\n if (response.status === 404) {\r\n throw new LPExtendSDKError(\r\n `App \"${config.appId}\" is not registered for account ${config.accountId}`,\r\n ErrorCodes.APP_NOT_REGISTERED,\r\n response.status,\r\n errorBody\r\n );\r\n }\r\n if (response.status === 403) {\r\n throw new LPExtendSDKError(\r\n errorBody.message || 'App is disabled or not authorized',\r\n ErrorCodes.APP_NOT_REGISTERED,\r\n response.status,\r\n errorBody\r\n );\r\n }\r\n if (response.status === 401) {\r\n throw new LPExtendSDKError(\r\n 'Authentication failed - invalid access token',\r\n ErrorCodes.UNAUTHORIZED,\r\n response.status,\r\n errorBody\r\n );\r\n }\r\n\r\n throw new LPExtendSDKError(\r\n `SDK initialization failed: ${errorBody.message || response.statusText}`,\r\n ErrorCodes.INIT_FAILED,\r\n response.status,\r\n errorBody\r\n );\r\n }\r\n\r\n const initResult: SDKInitResult = await response.json();\r\n\r\n if (debug) {\r\n console.log('[LP-Extend-SDK] Scopes verified:', initResult.grantedScopes);\r\n console.log('[LP-Extend-SDK] SDK will call LP APIs directly');\r\n }\r\n\r\n // Create config with resolved access token\r\n const resolvedConfig = { ...config, accessToken };\r\n return new LPExtendSDK(resolvedConfig, initResult);\r\n } catch (error) {\r\n clearTimeout(timeoutId);\r\n\r\n if ((error as Error).name === 'AbortError') {\r\n throw new LPExtendSDKError('SDK initialization timeout', ErrorCodes.TIMEOUT);\r\n }\r\n\r\n if (error instanceof LPExtendSDKError) {\r\n throw error;\r\n }\r\n\r\n throw new LPExtendSDKError(\r\n `SDK initialization failed: ${(error as Error).message}`,\r\n ErrorCodes.INIT_FAILED\r\n );\r\n }\r\n}\r\n","/**\r\n * LP Extend Node SDK\r\n *\r\n * A TypeScript SDK for building Node.js/backend applications on the LivePerson Extend platform.\r\n * Provides typed access to LivePerson APIs through the shell backend proxy.\r\n * The shell handles authentication and scope enforcement.\r\n *\r\n * For browser/frontend authentication, use @lpextend/client-sdk instead.\r\n *\r\n * @packageDocumentation\r\n *\r\n * @example Basic Usage\r\n * ```typescript\r\n * import { initializeSDK, Scopes } from '@lpextend/node-sdk';\r\n *\r\n * // Initialize the SDK (async - verifies app registration)\r\n * const sdk = await initializeSDK({\r\n * appId: 'my-app',\r\n * accountId: '12345678',\r\n * accessToken: 'user-lp-bearer-token',\r\n * scopes: [Scopes.SKILLS, Scopes.USERS, Scopes.AI_STUDIO],\r\n * });\r\n *\r\n * // Check granted scopes\r\n * if (sdk.hasScope(Scopes.SKILLS)) {\r\n * const { data: skills, revision } = await sdk.skills.getAll();\r\n * console.log('Skills:', skills);\r\n *\r\n * // Update with revision for optimistic locking\r\n * await sdk.skills.update(skills[0].id, { name: 'Updated' }, revision);\r\n * }\r\n *\r\n * // AI Studio APIs (automatically uses CC-Bearer auth)\r\n * if (sdk.hasScope(Scopes.AI_STUDIO)) {\r\n * const { data: flows } = await sdk.aiStudio.flows.getAll();\r\n * const result = await sdk.aiStudio.flows.invoke(flows[0].id, { input: { query: 'Hello' } });\r\n * }\r\n *\r\n * // Messaging History\r\n * if (sdk.hasScope(Scopes.MESSAGING_HISTORY)) {\r\n * const { data: history } = await sdk.messaging.history.query({\r\n * start: { from: Date.now() - 86400000, to: Date.now() },\r\n * status: ['CLOSE'],\r\n * });\r\n * }\r\n * ```\r\n *\r\n * @example Error Handling\r\n * ```typescript\r\n * import { initializeSDK, ErrorCodes, LPExtendSDKError } from '@lpextend/client-sdk';\r\n *\r\n * try {\r\n * const sdk = await initializeSDK(config);\r\n * const { data, revision } = await sdk.skills.getAll();\r\n *\r\n * // Try to update\r\n * await sdk.skills.update(data[0].id, { name: 'New' }, revision);\r\n * } catch (error) {\r\n * if (error instanceof LPExtendSDKError) {\r\n * switch (error.code) {\r\n * case ErrorCodes.SCOPE_DENIED:\r\n * console.error('App does not have access. Update app registration.');\r\n * break;\r\n * case ErrorCodes.APP_NOT_REGISTERED:\r\n * console.error('App is not installed for this account.');\r\n * break;\r\n * case ErrorCodes.REVISION_CONFLICT:\r\n * console.error('Resource was modified. Refresh and try again.');\r\n * break;\r\n * default:\r\n * console.error('API Error:', error.message);\r\n * }\r\n * }\r\n * }\r\n * ```\r\n */\r\n\r\nimport { createSDK, LPExtendSDK } from './sdk';\r\nimport type { LPExtendSDKConfig } from './types';\r\n\r\n// Re-export SDK class\r\nexport { LPExtendSDK } from './sdk';\r\n\r\n// Re-export the createSDK function\r\nexport { createSDK } from './sdk';\r\n\r\n// Re-export all API classes\r\nexport {\r\n // Account Config APIs\r\n SkillsAPI,\r\n UsersAPI,\r\n AgentGroupsAPI,\r\n ProfilesAPI,\r\n LOBsAPI,\r\n CampaignsAPI,\r\n EngagementsAPI,\r\n PredefinedContentAPI,\r\n AutomaticMessagesAPI,\r\n WorkingHoursAPI,\r\n SpecialOccasionsAPI,\r\n // AI Studio APIs\r\n AIStudioAPI,\r\n CategoriesAPI,\r\n ConversationsAPI,\r\n SummaryAPI,\r\n QueryAPI,\r\n SimulationsAPI,\r\n TranscriptAnalysisAPI,\r\n KnowledgebasesAPI,\r\n EvaluatorsAPI,\r\n GeneratorsAPI,\r\n PromptLibraryAPI,\r\n AIStudioUsersAPI,\r\n FlowsAPI,\r\n // Messaging APIs\r\n MessagingAPI,\r\n MessagingHistoryAPI,\r\n AgentMetricsAPI,\r\n AgentActivityAPI,\r\n MessagingOperationsAPI,\r\n ConnectToMessagingAPI,\r\n OutboundReportingAPI,\r\n // Sentinel (IDP) APIs\r\n SentinelAPI,\r\n // LP Prompts API (Prompt Library)\r\n LPPromptsAPI,\r\n // Conversation Builder APIs\r\n ConversationBuilderAPI,\r\n BotGroupsAPI,\r\n BotsAPI,\r\n DialogsAPI,\r\n InteractionsAPI,\r\n NLUDomainsAPI,\r\n KnowledgeBasesAPI,\r\n BotAgentsAPI,\r\n IntegrationsAPI,\r\n} from './sdk';\r\n\r\nexport type { CBAuthCredentials } from './sdk';\r\n\r\n// Re-export all types\r\nexport type {\r\n // SDK Config\r\n LPExtendSDKConfig,\r\n SDKInitResult,\r\n ApiKeyAuthResponse,\r\n // API Response\r\n APIResponse,\r\n PaginatedResponse,\r\n // Account Config Types\r\n LPSkill,\r\n LPSkillRoutingConfig,\r\n CreateSkillRequest,\r\n UpdateSkillRequest,\r\n LPUser,\r\n MemberOf,\r\n CreateUserRequest,\r\n UpdateUserRequest,\r\n LPAgentGroup,\r\n CreateAgentGroupRequest,\r\n UpdateAgentGroupRequest,\r\n LPProfile,\r\n LPPermission,\r\n CreateProfileRequest,\r\n UpdateProfileRequest,\r\n LPLOB,\r\n CreateLOBRequest,\r\n UpdateLOBRequest,\r\n LPCampaign,\r\n CreateCampaignRequest,\r\n UpdateCampaignRequest,\r\n LPEngagement,\r\n CreateEngagementRequest,\r\n UpdateEngagementRequest,\r\n LPPredefinedContent,\r\n LPPredefinedContentData,\r\n CreatePredefinedContentRequest,\r\n UpdatePredefinedContentRequest,\r\n LPAutomaticMessage,\r\n LPAutomaticMessageData,\r\n CreateAutomaticMessageRequest,\r\n UpdateAutomaticMessageRequest,\r\n LPWorkingHours,\r\n LPWorkingDay,\r\n LPShift,\r\n CreateWorkingHoursRequest,\r\n UpdateWorkingHoursRequest,\r\n LPSpecialOccasion,\r\n LPSpecialOccasionEvent,\r\n CreateSpecialOccasionRequest,\r\n UpdateSpecialOccasionRequest,\r\n // AI Studio Types\r\n AIStudioCategory,\r\n CreateCategoryRequest,\r\n UpdateCategoryRequest,\r\n AIStudioConversation,\r\n AIStudioMessage,\r\n AICreateConversationRequest,\r\n AIUpdateConversationRequest,\r\n ConversationQueryParams,\r\n UpdateConversationAttributesRequest,\r\n SummaryRequest,\r\n BatchSummaryRequest,\r\n AIStudioSummary,\r\n QueryGenerateRequest,\r\n QueryGenerateResponse,\r\n AIStudioSimulation,\r\n SimulationConfig,\r\n SimulationTestCase,\r\n SimulationResults,\r\n CreateSimulationRequest,\r\n UpdateSimulationRequest,\r\n SimulationQueryParams,\r\n SimulationJobResult,\r\n TranscriptAnalysis,\r\n TranscriptConversation,\r\n TranscriptQuestion,\r\n CreateTranscriptAnalysisRequest,\r\n UpdateTranscriptAnalysisRequest,\r\n Knowledgebase,\r\n KnowledgebaseHealth,\r\n KnowledgebaseSearchRequest,\r\n KnowledgebaseSearchResult,\r\n KnowledgebaseItem,\r\n KnowledgebaseTextItem,\r\n SimilarityEvaluationRequest,\r\n SimilarityEvaluationResponse,\r\n ResolutionEvaluationRequest,\r\n ResolutionEvaluationResponse,\r\n GuidedRoutingEvaluationRequest,\r\n GuidedRoute,\r\n GuidedRoutingEvaluationResponse,\r\n QuestionGeneratorRequest,\r\n QuestionGeneratorResponse,\r\n GeneratedQuestion,\r\n KAIRouteGeneratorRequest,\r\n KAIRouteGeneratorResponse,\r\n GeneratedRoute,\r\n KAIRouteGenerationStatus,\r\n Prompt,\r\n PromptVariable,\r\n CreatePromptRequest,\r\n UpdatePromptRequest,\r\n LLMProvider,\r\n LLMModel,\r\n AIStudioUser,\r\n CreateAIStudioUserRequest,\r\n UpdateAIStudioUserRequest,\r\n UpdateAIStudioUserModelsRequest,\r\n AIStudioFlow,\r\n InvokeFlowRequest,\r\n InvokeFlowResponse,\r\n // Messaging Types\r\n MessagingConversation,\r\n ConversationParticipant,\r\n ConsumerParticipant,\r\n AgentParticipant,\r\n ConversationTransfer,\r\n ConversationInteraction,\r\n MessageRecord,\r\n MessageData,\r\n TextMessage,\r\n FileMessage,\r\n RichContentMessage,\r\n ConversationSummary,\r\n SDERecord,\r\n SDEEvent,\r\n CoBrowseSession,\r\n SurveyRecord,\r\n MessagingHistoryQuery,\r\n ContentToRetrieve,\r\n MessagingHistoryResponse,\r\n MessagingInteraction,\r\n AgentMetrics,\r\n AgentStatus,\r\n AgentMetricsQuery,\r\n AgentActivity,\r\n ActivityRecord,\r\n AgentActivityQuery,\r\n TransferConversationRequest,\r\n CloseConversationRequest,\r\n SendMessageRequest,\r\n MessagingCreateConversationRequest,\r\n ConsumerProfile,\r\n ConversationContext,\r\n CreateConversationResponse,\r\n OutboundCampaignReport,\r\n OutboundReportQuery,\r\n // Error Types\r\n ErrorCode,\r\n // Shell Token Types\r\n ShellTokenConfig,\r\n ShellTokenResponse,\r\n ShellTokenUser,\r\n // Sentinel Types\r\n SentinelAuthRequest,\r\n SentinelTokenExchange,\r\n SentinelToken,\r\n SentinelLpToken,\r\n SentinelUserData,\r\n SentinelProfile,\r\n SentinelMemberOf,\r\n SentinelManagerOf,\r\n SentinelUserSkill,\r\n SentinelLpUser,\r\n SentinelAppUser,\r\n SentinelCCUser,\r\n CBChatBotPlatformUser,\r\n CBSuccessResult,\r\n CBAuthInfo,\r\n SentinelAppSetting,\r\n SentinelAppSettings,\r\n SentinelLoginUrlResponse,\r\n SentinelDomainsResponse,\r\n // LP Prompts Types (Prompt Library - separate from AI Studio)\r\n LPPrompt,\r\n LPPromptVariable,\r\n LPPromptVariableSourceType,\r\n LPPromptGenericConfig,\r\n LPPromptClientConfig,\r\n LPPromptConfiguration,\r\n LPPromptVersionDetail,\r\n LPPromptClientType,\r\n LPPromptStatus,\r\n LPLLMProviderModels,\r\n LPLLMType,\r\n LPLLMProviderSubscription,\r\n CreateLPPromptRequest,\r\n UpdateLPPromptRequest,\r\n LPPromptsQueryParams,\r\n // Conversation Builder Types\r\n CBApiResponse,\r\n CBPageContext,\r\n CBPaginatedResult,\r\n CBBotGroup,\r\n CBBot,\r\n CBBotPlatform,\r\n CBChatBot,\r\n CBChatBotMetrics,\r\n CBChatBotSummary,\r\n CBChatBotSummaryList,\r\n CBDialog,\r\n CBDialogGroup,\r\n CBResponseMatch,\r\n CBTileData,\r\n CBInteractionContent,\r\n CBInteraction,\r\n CBInteractionList,\r\n CBDuplicatePhrase,\r\n CBDuplicatePhrases,\r\n CBNLUDomain,\r\n CBDomainList,\r\n CBIntent,\r\n CBKBLandingPageMetrics,\r\n CBSyncStatusDetails,\r\n CBKnowledgeBase,\r\n CBKnowledgeBaseList,\r\n CBKnowledgeBaseDetail,\r\n CBKBArticle,\r\n CBKAISearchRequest,\r\n CBKAISearchResultItem,\r\n CBKAISearchResponse,\r\n CBKAIOnDemandConfig,\r\n CBBotUser,\r\n CBBotInstanceStatus,\r\n CBAddBotAgentRequest,\r\n CBResponder,\r\n CBGlobalFunctions,\r\n CBBotEnvironment,\r\n CBLPAppCredentials,\r\n CBLPSkill,\r\n CBKBContentSource,\r\n CBDialogTemplateSummary,\r\n CBCredential,\r\n CBBotGroupsQueryParams,\r\n CBBotsByGroupQueryParams,\r\n CBKBArticlesQueryParams,\r\n CBAllBotAgentsStatusQueryParams,\r\n CBPCSBotsStatusQueryParams,\r\n // Consumer Query Metrics\r\n CBConsumerQueryEventType,\r\n CBConsumerQueryMetricsParams,\r\n CBConsumerQueryMetric,\r\n CBConsumerQueryMetricsResponse,\r\n CBConsumerQueryMetricsExtendedParams,\r\n} from './types';\r\n\r\n// Re-export error class and codes\r\nexport { LPExtendSDKError, ErrorCodes } from './types';\r\n\r\n/**\r\n * Initialize the LP Extend SDK\r\n *\r\n * Creates and returns an SDK instance after verifying app registration with the shell.\r\n * This is an async function that validates the app is registered and gets granted scopes.\r\n *\r\n * @param config - SDK configuration options\r\n * @returns Promise resolving to initialized SDK instance\r\n *\r\n * @example\r\n * ```typescript\r\n * import { initializeSDK, Scopes } from '@lpextend/node-sdk';\r\n *\r\n * const sdk = await initializeSDK({\r\n * appId: 'my-analytics-app',\r\n * accountId: '12345678',\r\n * accessToken: lpAccessToken, // From shell auth\r\n * scopes: [Scopes.SKILLS, Scopes.USERS, Scopes.AI_STUDIO],\r\n * debug: true,\r\n * });\r\n *\r\n * // Check what scopes were granted\r\n * console.log('Granted:', sdk.grantedScopes);\r\n *\r\n * // Access Account Config APIs (Bearer auth)\r\n * if (sdk.hasScope(Scopes.SKILLS)) {\r\n * const { data: skills, revision } = await sdk.skills.getAll();\r\n * // Update with revision\r\n * await sdk.skills.update(skills[0].id, { name: 'New Name' }, revision);\r\n * }\r\n *\r\n * // Access AI Studio APIs (CC-Bearer auth - handled automatically)\r\n * if (sdk.hasScope(Scopes.AI_STUDIO)) {\r\n * const { data: flows } = await sdk.aiStudio.flows.getAll();\r\n * const result = await sdk.aiStudio.flows.invoke(flows[0].id, {\r\n * input: { query: 'What is your return policy?' },\r\n * });\r\n * }\r\n *\r\n * // Access Messaging APIs\r\n * if (sdk.hasScope(Scopes.MESSAGING_HISTORY)) {\r\n * const { data: history } = await sdk.messaging.history.query({\r\n * start: { from: Date.now() - 86400000, to: Date.now() },\r\n * status: ['CLOSE'],\r\n * contentToRetrieve: ['messageRecords', 'summary'],\r\n * });\r\n * }\r\n * ```\r\n */\r\nexport async function initializeSDK(config: LPExtendSDKConfig): Promise<LPExtendSDK> {\r\n return createSDK(config);\r\n}\r\n\r\n/**\r\n * Initialize the SDK using environment variables + ExtendJWT\r\n *\r\n * Reads configuration from environment variables:\r\n * - LPEXTEND_API_KEY: Your app's API key (required)\r\n * - APP_ID: Your registered app ID (required)\r\n * - LP_ACCOUNT_ID: LivePerson account ID (required)\r\n * - LPEXTEND_SHELL_URL: Shell base URL (required)\r\n * - LPEXTEND_DEBUG: Enable debug logging (optional, default: false)\r\n *\r\n * The ExtendJWT is passed as a parameter since it comes from the shell at runtime.\r\n *\r\n * @param extendToken - The ExtendJWT received from the shell\r\n * @returns Promise resolving to initialized SDK instance\r\n * @throws LPExtendSDKError if required env vars are missing\r\n *\r\n * @example\r\n * ```typescript\r\n * // In your .env file:\r\n * // LPEXTEND_API_KEY=lpx_my-app_abc123...\r\n * // APP_ID=my-app\r\n * // LP_ACCOUNT_ID=12345678\r\n * // LPEXTEND_SHELL_URL=https://lp-extend.example.com\r\n *\r\n * import { createSDKFromEnv } from '@lpextend/node-sdk';\r\n *\r\n * // In your API route handler:\r\n * app.get('/api/skills', async (req, res) => {\r\n * // Get ExtendJWT from request (sent by frontend)\r\n * const extendToken = req.headers['x-extend-token'] as string;\r\n *\r\n * const sdk = await createSDKFromEnv(extendToken);\r\n * const { data: skills } = await sdk.skills.getAll();\r\n * res.json(skills);\r\n * });\r\n * ```\r\n */\r\nexport async function createSDKFromEnv(extendToken: string): Promise<LPExtendSDK> {\r\n const apiKey = process.env.LPEXTEND_API_KEY;\r\n const appId = process.env.APP_ID;\r\n const accountId = process.env.LP_ACCOUNT_ID;\r\n const shellBaseUrl = process.env.LPEXTEND_SHELL_URL;\r\n const debug = process.env.LPEXTEND_DEBUG === 'true';\r\n\r\n if (!apiKey) {\r\n throw new LPExtendSDKError(\r\n 'LPEXTEND_API_KEY environment variable is required',\r\n ErrorCodes.INVALID_CONFIG\r\n );\r\n }\r\n\r\n if (!appId) {\r\n throw new LPExtendSDKError(\r\n 'APP_ID environment variable is required',\r\n ErrorCodes.INVALID_CONFIG\r\n );\r\n }\r\n\r\n if (!accountId) {\r\n throw new LPExtendSDKError(\r\n 'LP_ACCOUNT_ID environment variable is required',\r\n ErrorCodes.INVALID_CONFIG\r\n );\r\n }\r\n\r\n if (!shellBaseUrl) {\r\n throw new LPExtendSDKError(\r\n 'LPEXTEND_SHELL_URL environment variable is required',\r\n ErrorCodes.INVALID_CONFIG\r\n );\r\n }\r\n\r\n if (!extendToken) {\r\n throw new LPExtendSDKError(\r\n 'extendToken is required. This is passed from the shell to your app when opened.',\r\n ErrorCodes.INVALID_CONFIG\r\n );\r\n }\r\n\r\n return createSDK({\r\n appId,\r\n accountId,\r\n apiKey,\r\n extendToken,\r\n shellBaseUrl,\r\n debug,\r\n });\r\n}\r\n\r\n/**\r\n * SDK Version\r\n */\r\nexport const VERSION = '1.0.0';\r\n\r\n/**\r\n * Available API Scopes\r\n *\r\n * These map to lpApiAccess fields in app registration.\r\n * Request these scopes when initializing the SDK.\r\n *\r\n * @example\r\n * ```typescript\r\n * import { initializeSDK, Scopes } from '@lpextend/node-sdk';\r\n *\r\n * const sdk = await initializeSDK({\r\n * appId: 'my-app',\r\n * accountId: '12345678',\r\n * accessToken: token,\r\n * scopes: [\r\n * Scopes.SKILLS,\r\n * Scopes.USERS,\r\n * Scopes.AGENT_GROUPS,\r\n * Scopes.AI_STUDIO,\r\n * Scopes.MESSAGING_HISTORY,\r\n * ],\r\n * });\r\n * ```\r\n */\r\nexport const Scopes = {\r\n // Account Configuration\r\n SKILLS: 'skills',\r\n USERS: 'users',\r\n AGENT_GROUPS: 'agentGroups',\r\n PROFILES: 'profiles',\r\n LOBS: 'lobs',\r\n PREDEFINED_CONTENT: 'predefinedContent',\r\n AUTOMATIC_MESSAGES: 'automaticMessages',\r\n WORKING_HOURS: 'workingHours',\r\n SPECIAL_OCCASIONS: 'specialOccasions',\r\n CAMPAIGNS: 'campaigns',\r\n ENGAGEMENTS: 'engagements',\r\n\r\n // Messaging & Conversations\r\n MESSAGING_HISTORY: 'messagingHistory',\r\n MESSAGING_OPERATIONS: 'messagingOperations',\r\n CONNECT_TO_MESSAGING: 'connectToMessaging',\r\n\r\n // Agent & Reporting\r\n AGENT_METRICS: 'agentMetrics',\r\n AGENT_ACTIVITY: 'agentActivity',\r\n OUTBOUND_REPORTING: 'outboundReporting',\r\n\r\n // AI & Automation\r\n AI_STUDIO: 'aiStudio',\r\n CONVERSATION_BUILDER: 'conversationBuilder',\r\n CONVERSATION_ORCHESTRATOR: 'conversationOrchestrator',\r\n /** AI Studio Prompt Library (different from LP Prompts) */\r\n PROMPT_LIBRARY: 'promptLibrary',\r\n /** LP Prompts API (Prompt Library) */\r\n LP_PROMPTS: 'prompts',\r\n FAAS: 'faas',\r\n\r\n // Proactive\r\n PROACTIVE_MESSAGING: 'proactiveMessaging',\r\n} as const;\r\n\r\nexport type Scope = (typeof Scopes)[keyof typeof Scopes];\r\n\r\n// =============================================================================\r\n// Shell Token Retrieval (for child apps)\r\n// =============================================================================\r\n\r\nimport type { ShellTokenConfig, ShellTokenResponse } from './types';\r\nimport { LPExtendSDKError, ErrorCodes } from './types';\r\n\r\n/**\r\n * Retrieve LP Bearer token from the shell\r\n *\r\n * Child apps call this function to get the LP access token for making\r\n * direct LP API calls. The shell stores tokens on user login and provides\r\n * them to authenticated child apps.\r\n *\r\n * @param config - Shell token configuration\r\n * @returns Promise resolving to LP token data\r\n * @throws LPExtendSDKError if retrieval fails\r\n *\r\n * @example\r\n * ```typescript\r\n * import { getShellToken } from '@lpextend/client-sdk';\r\n *\r\n * // Get shell token from URL params or postMessage\r\n * const shellToken = new URLSearchParams(window.location.search).get('shellToken');\r\n *\r\n * const lpToken = await getShellToken({\r\n * shellBaseUrl: 'https://lp-extend.example.com',\r\n * accountId: '12345678',\r\n * shellToken: shellToken,\r\n * appId: 'my-app',\r\n * });\r\n *\r\n * // Now use the LP token to initialize the SDK\r\n * const sdk = await initializeSDK({\r\n * appId: 'my-app',\r\n * accountId: lpToken.accountId,\r\n * accessToken: lpToken.accessToken,\r\n * scopes: [Scopes.SKILLS, Scopes.USERS],\r\n * });\r\n * ```\r\n */\r\nexport async function getShellToken(config: ShellTokenConfig): Promise<ShellTokenResponse> {\r\n const { shellBaseUrl, accountId, shellToken, appId, scopes, timeout = 10000 } = config;\r\n\r\n // Validate required config\r\n if (!shellBaseUrl) {\r\n throw new LPExtendSDKError('shellBaseUrl is required', ErrorCodes.INVALID_CONFIG);\r\n }\r\n if (!accountId) {\r\n throw new LPExtendSDKError('accountId is required', ErrorCodes.INVALID_CONFIG);\r\n }\r\n if (!shellToken) {\r\n throw new LPExtendSDKError('shellToken is required', ErrorCodes.INVALID_CONFIG);\r\n }\r\n if (!appId) {\r\n throw new LPExtendSDKError('appId is required', ErrorCodes.INVALID_CONFIG);\r\n }\r\n\r\n const url = `${shellBaseUrl.replace(/\\/$/, '')}/api/v1/shell/token/${accountId}/lp-token`;\r\n\r\n const controller = new AbortController();\r\n const timeoutId = setTimeout(() => controller.abort(), timeout);\r\n\r\n try {\r\n const response = await fetch(url, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'X-Shell-Token': shellToken,\r\n },\r\n body: JSON.stringify({\r\n appId,\r\n scopes,\r\n }),\r\n signal: controller.signal,\r\n });\r\n\r\n clearTimeout(timeoutId);\r\n\r\n if (!response.ok) {\r\n const errorData = await response.json().catch(() => ({}));\r\n\r\n if (response.status === 401) {\r\n throw new LPExtendSDKError(\r\n errorData.message || 'Shell token invalid or expired',\r\n ErrorCodes.UNAUTHORIZED,\r\n response.status,\r\n errorData\r\n );\r\n }\r\n\r\n if (response.status === 403) {\r\n throw new LPExtendSDKError(\r\n errorData.message || 'App not installed or disabled',\r\n ErrorCodes.APP_NOT_REGISTERED,\r\n response.status,\r\n errorData\r\n );\r\n }\r\n\r\n if (response.status === 404) {\r\n throw new LPExtendSDKError(\r\n errorData.message || 'No LP token found for user',\r\n ErrorCodes.NOT_FOUND,\r\n response.status,\r\n errorData\r\n );\r\n }\r\n\r\n throw new LPExtendSDKError(\r\n errorData.message || `Shell token request failed: ${response.status}`,\r\n ErrorCodes.API_ERROR,\r\n response.status,\r\n errorData\r\n );\r\n }\r\n\r\n const data: ShellTokenResponse = await response.json();\r\n return data;\r\n } catch (error) {\r\n clearTimeout(timeoutId);\r\n\r\n if (error instanceof LPExtendSDKError) {\r\n throw error;\r\n }\r\n\r\n if (error instanceof Error && error.name === 'AbortError') {\r\n throw new LPExtendSDKError('Shell token request timed out', ErrorCodes.TIMEOUT);\r\n }\r\n\r\n throw new LPExtendSDKError(\r\n `Failed to retrieve shell token: ${error instanceof Error ? error.message : 'Unknown error'}`,\r\n ErrorCodes.API_ERROR\r\n );\r\n }\r\n}\r\n"]}
|