@pagelines/sdk 1.0.172 → 1.0.174

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/dist/{AgentProvider.vue_vue_type_script_setup_true_lang-DCanEQe2.js → AgentProvider.vue_vue_type_script_setup_true_lang-DfdOD9DB.js} +2 -2
  2. package/dist/{AgentProvider.vue_vue_type_script_setup_true_lang-DCanEQe2.js.map → AgentProvider.vue_vue_type_script_setup_true_lang-DfdOD9DB.js.map} +1 -1
  3. package/dist/{AgentWidgetInline-BW7Kg22N.js → AgentWidgetInline-DzMuLq-e.js} +2 -2
  4. package/dist/{AgentWidgetInline-BW7Kg22N.js.map → AgentWidgetInline-DzMuLq-e.js.map} +1 -1
  5. package/dist/{AgentWidgetModal-dH9xiLtO.js → AgentWidgetModal-Bo3I1Kvp.js} +2 -2
  6. package/dist/{AgentWidgetModal-dH9xiLtO.js.map → AgentWidgetModal-Bo3I1Kvp.js.map} +1 -1
  7. package/dist/{AgentWidgetPopup--EAvcTDh.js → AgentWidgetPopup-Vhq23tUI.js} +2 -2
  8. package/dist/{AgentWidgetPopup--EAvcTDh.js.map → AgentWidgetPopup-Vhq23tUI.js.map} +1 -1
  9. package/dist/AgentWrap.vue_vue_type_script_setup_true_lang-By0ndeW_.js +6972 -0
  10. package/dist/AgentWrap.vue_vue_type_script_setup_true_lang-By0ndeW_.js.map +1 -0
  11. package/dist/agent/AgentController.d.ts +14 -4
  12. package/dist/agent/ClientAudio.d.ts +1 -1
  13. package/dist/agent/index.d.ts +4 -1
  14. package/dist/agent/ui/AgentChat.vue.d.ts +1 -1
  15. package/dist/agent/ui/AgentWrap.vue.d.ts +0 -2
  16. package/dist/agent/ui/ElAgentChat.vue.d.ts +1 -0
  17. package/dist/agent.js +34 -32
  18. package/dist/clients/AuthClient.d.ts +0 -1
  19. package/dist/clients/ChatClient.d.ts +0 -6
  20. package/dist/clients/UserClient.d.ts +0 -20
  21. package/dist/clients/types.d.ts +2 -2
  22. package/dist/demo/index.d.ts +3 -5
  23. package/dist/sdk.css +1 -1
  24. package/dist/sdk.js +1 -1
  25. package/dist/{sdkClient-DlvpHeVt.js → sdkClient--jt-zUDx.js} +148 -251
  26. package/dist/sdkClient--jt-zUDx.js.map +1 -0
  27. package/dist/sdkClient.d.ts +1 -18
  28. package/dist/utils/base.d.ts +14 -0
  29. package/dist/utils/color.d.ts +12 -0
  30. package/dist/utils/cookies.d.ts +47 -0
  31. package/dist/utils/id.d.ts +27 -0
  32. package/dist/utils/logger.d.ts +49 -0
  33. package/dist/widget.js +5 -5
  34. package/dist/widget.js.map +1 -1
  35. package/package.json +2 -2
  36. package/dist/AgentWrap.vue_vue_type_script_setup_true_lang-DWBaKmcq.js +0 -5184
  37. package/dist/AgentWrap.vue_vue_type_script_setup_true_lang-DWBaKmcq.js.map +0 -1
  38. package/dist/sdkClient-DlvpHeVt.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sdkClient--jt-zUDx.js","sources":["../utils/id.ts","../utils/logger.ts","../utils/base.ts","../utils/cookies.ts","../api.ts","../../../node_modules/.pnpm/nanostores@1.1.0/node_modules/nanostores/clean-stores/index.js","../../../node_modules/.pnpm/nanostores@1.1.0/node_modules/nanostores/atom/index.js","../sdkStorage.ts","../clients/AuthClient.ts","../clients/ChatClient.ts","../clients/UserClient.ts","../sdkClient.ts"],"sourcesContent":["// SDK-local copy — see src/utils/id.ts for app version\n\n/**\n * Generate a short random ID\n * @param length - Length of the ID (default: 8)\n * @returns Random alphanumeric string\n */\nexport function shortId(length = 8): string {\n const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'\n let result = ''\n for (let i = 0; i < length; i++) {\n result += chars.charAt(Math.floor(Math.random() * chars.length))\n }\n return result\n}\n\n/**\n * Generate a nanoid-style ID with prefix\n * @param prefix - Prefix for the ID (e.g., 'usr_', 'org_', 'spc_')\n * @param length - Length of the random part (default: 12)\n * @returns Prefixed ID string\n */\nexport function nanoid(prefix = '', length = 12): string {\n const id = shortId(length)\n return prefix + id\n}\n\n/**\n * Generate a MongoDB-style unique ID with prefix\n * Format: [prefix 3 chars][8-char hex timestamp][16-char random hex]\n * Total: 27 characters\n *\n * @example objectId({ prefix: 'usr' }) → 'usr507f1f77bcf86cd799439011'\n */\nexport function objectId(args: { prefix?: string } = {}): string {\n const { prefix = 'id_' } = args\n const effectivePrefix = prefix.length >= 3 ? prefix.substring(0, 3) : prefix.padEnd(3, '_')\n const timestamp = Math.floor(Date.now() / 1000).toString(16).padStart(8, '0')\n let randomPart = ''\n for (let i = 0; i < 16; i++)\n randomPart += Math.floor(Math.random() * 16).toString(16)\n return effectivePrefix + timestamp + randomPart\n}\n\n/**\n * Generate a standard UUID v4\n */\nexport function uuid(): string {\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(\n /[xy]/g,\n (c: string) => {\n const r = Math.trunc(Math.random() * 16)\n const v = c === 'x' ? r : (r & 0x3) | 0x8\n return v.toString(16)\n },\n )\n}\n","// SDK-local copy — see src/utils/logger.ts for app version\n/* eslint-disable no-console */\n\n// Use globalThis.process instead of node:process import for browser compatibility\n// Safe because we always check `typeof process !== 'undefined'` before accessing properties\n\n// eslint-disable-next-line node/prefer-global/process\nconst process = (globalThis as any).process\n\ntype LogLevel = 'error' | 'warn' | 'info' | 'debug' | 'trace'\ntype LogData = Record<string, unknown> | unknown\n\nexport interface LogHelper {\n error: (description: string, data?: LogData) => void\n warn: (description: string, data?: LogData) => void\n info: (description: string, data?: LogData) => void\n debug: (description: string, data?: LogData) => void\n trace: (description: string, data?: LogData) => void\n isEnabled?: () => boolean\n setLevel?: (level: LogLevel) => void\n}\n\ninterface LoggerConfig {\n level: LogLevel\n context?: string\n description?: string\n data?: LogData\n error?: Error | unknown\n timestamp?: boolean\n}\n\ninterface LogSettings {\n enabled?: boolean\n minLevel?: LogLevel\n timestamps?: boolean\n}\n\n// Universal environment detection\nconst isBrowser = typeof window !== 'undefined'\nconst isNode = typeof process !== 'undefined' && !isBrowser\nconst isProd = isBrowser\n ? (typeof window !== 'undefined' && window.location && !window.location.hostname.includes('localhost'))\n : (isNode && typeof process !== 'undefined' && process.env?.NODE_ENV === 'production')\nconst isDev = !isProd\n\n// Log level configuration\nconst logLevels: Record<LogLevel, { priority: number, color: string, nodeColor?: string }> = {\n error: { priority: 50, color: '#FF0000', nodeColor: '\\x1B[31m' },\n warn: { priority: 40, color: '#FFA500', nodeColor: '\\x1B[33m' },\n info: { priority: 30, color: '#00ABFF', nodeColor: '\\x1B[36m' },\n debug: { priority: 20, color: '#00BD0C', nodeColor: '\\x1B[32m' },\n trace: { priority: 10, color: '#5233FF', nodeColor: '\\x1B[35m' },\n}\n\n// Sensitive keys to redact\nconst SENSITIVE_KEYS = ['password', 'token', 'secret', 'apikey', 'api_key', 'authorization', 'cookie']\n\nexport class Logger {\n private settings: Required<LogSettings>\n private enabledInBrowser: boolean = false\n private context?: string\n private static hasShownHelp = false\n\n constructor(settings: LogSettings = {}, context?: string) {\n this.context = context\n this.settings = {\n enabled: settings.enabled ?? true,\n minLevel: settings.minLevel ?? this.getDefaultLevel(),\n timestamps: settings.timestamps ?? true,\n }\n\n if (isBrowser) {\n this.initBrowserLogging()\n }\n }\n\n private getDefaultLevel(): LogLevel {\n // Check environment variable first\n if (isNode && typeof process !== 'undefined' && process.env?.LOG_LEVEL) {\n return process.env.LOG_LEVEL as LogLevel\n }\n\n // Check localStorage in browser\n if (isBrowser && typeof localStorage !== 'undefined' && typeof localStorage.getItem === 'function') {\n const level = localStorage.getItem('PAGELINES_LOG_LEVEL')\n if (level)\n return level as LogLevel\n }\n\n // Default: info in production, debug in development\n return isProd ? 'info' : 'debug'\n }\n\n private initBrowserLogging(): void {\n if (!isBrowser)\n return\n\n const logKey = 'PAGELINES_LOG'\n const enabled = typeof localStorage?.getItem === 'function' && localStorage.getItem(logKey) === 'true'\n const hostname = window.location?.hostname || ''\n\n // Enable in dev, or if explicitly enabled via localStorage\n this.enabledInBrowser = isDev || enabled || hostname === 'localhost' || hostname.includes('127.0.0.1')\n\n // Show help message once in production\n if (isProd && !enabled && !Logger.hasShownHelp) {\n console.log(\n '%cPageLines Logger (disabled in production)',\n 'color: #888; font-size: 12px',\n )\n console.log(\n '%cTo enable: localStorage.setItem(\"PAGELINES_LOG\", \"true\")',\n 'color: #888; font-size: 11px',\n )\n Logger.hasShownHelp = true\n }\n }\n\n private shouldLog(level: LogLevel): boolean {\n if (!this.settings.enabled)\n return false\n\n // In browser, check if enabled\n if (isBrowser && !this.enabledInBrowser)\n return false\n\n const currentPriority = logLevels[level].priority\n const minPriority = logLevels[this.settings.minLevel].priority\n\n return currentPriority >= minPriority\n }\n\n private formatTimestamp(): string {\n return new Date().toLocaleTimeString('en-GB', {\n hour12: false,\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n })\n }\n\n private formatISOTimestamp(): string {\n return new Date().toISOString()\n }\n\n private redactSensitive(obj: any): any {\n if (typeof obj !== 'object' || obj === null)\n return obj\n\n if (Array.isArray(obj)) {\n return obj.map((item) => this.redactSensitive(item))\n }\n\n const result: any = {}\n for (const [key, value] of Object.entries(obj)) {\n const lowerKey = key.toLowerCase()\n if (SENSITIVE_KEYS.some((sensitive) => lowerKey.includes(sensitive))) {\n result[key] = '[REDACTED]'\n } else if (typeof value === 'object' && value !== null) {\n result[key] = this.redactSensitive(value)\n } else {\n result[key] = value\n }\n }\n return result\n }\n\n private formatData(data: unknown, maxDepth: number = 3, currentDepth: number = 0): unknown {\n if (currentDepth >= maxDepth) {\n return '[Max Depth]'\n }\n\n if (data === null || data === undefined) {\n return data\n }\n\n // Handle Error objects specially\n if (data instanceof Error) {\n return {\n name: data.name,\n message: data.message,\n stack: isProd ? data.stack?.split('\\n').slice(0, 3).join('\\n') : data.stack,\n ...(data as any), // Include any additional error properties\n }\n }\n\n if (data instanceof Date) {\n return data.toISOString()\n }\n\n if (typeof data !== 'object') {\n return data\n }\n\n if (Array.isArray(data)) {\n if (data.length > 20 && isProd) {\n return `Array(${data.length}) [${data.slice(0, 3).map((item) =>\n this.formatData(item, maxDepth, currentDepth + 1)).join(', ')}, ...]`\n }\n return data.map((item) => this.formatData(item, maxDepth, currentDepth + 1))\n }\n\n // Handle regular objects\n try {\n const formatted: Record<string, unknown> = {}\n const entries = Object.entries(data)\n const maxProperties = isProd ? 50 : 200\n\n for (const [key, value] of entries.slice(0, maxProperties)) {\n formatted[key] = this.formatData(value, maxDepth, currentDepth + 1)\n }\n\n if (entries.length > maxProperties) {\n formatted['...'] = `${entries.length - maxProperties} more properties`\n }\n\n return this.redactSensitive(formatted)\n } catch {\n return '[Unserializable]'\n }\n }\n\n private logToBrowser(config: LoggerConfig): void {\n if (!isBrowser || !this.shouldLog(config.level))\n return\n\n const { level, description, context, data, error } = config\n const levelConfig = logLevels[level]\n const ctx = context || this.context || 'www'\n\n // Format for browser console\n const prefix = `[${ctx}] ${level.toUpperCase()}:`\n const style = `color: ${levelConfig.color}; font-weight: bold;`\n\n // Log main message\n if (data !== undefined) {\n console[level](`%c${prefix}`, style, description, this.formatData(data))\n } else {\n console[level](`%c${prefix}`, style, description)\n }\n\n // Log error details if present\n if (error) {\n if (error instanceof Error) {\n console.error(error)\n } else {\n console.error('Error details:', error)\n }\n }\n }\n\n private logToNode(config: LoggerConfig): void {\n if (!isNode || !this.shouldLog(config.level))\n return\n\n const { level, description, context, data, error } = config\n const ctx = context || this.context || 'www'\n\n if (isProd) {\n // Production: Single-line JSON format for log aggregation\n const logEntry: any = {\n timestamp: this.formatISOTimestamp(),\n level: level.toUpperCase(),\n context: ctx,\n message: description,\n }\n if (data) {\n logEntry.data = this.formatData(data)\n }\n if (error) {\n logEntry.error = this.formatData(error)\n }\n\n console[level](`${logEntry.timestamp} ${logEntry.level} [${ctx}] ${description}`, data || error ? JSON.stringify({ data, error }) : '')\n } else {\n // Development: Pretty-printed format with ANSI colors\n const levelConfig = logLevels[level]\n const timestamp = this.formatTimestamp()\n const reset = '\\x1B[0m'\n const dim = '\\x1B[2m'\n const nodeColor = levelConfig.nodeColor || ''\n\n const logMessage = `${dim}${timestamp}${reset} ${nodeColor}${level.toUpperCase()} (${ctx}):${reset} ${description}`\n console[level](logMessage)\n\n if (data !== undefined) {\n console.log(JSON.stringify(this.formatData(data), null, 2))\n }\n\n if (error) {\n if (error instanceof Error) {\n console.error(`\\x1B[31mError:${reset}`, error.message)\n if (error.stack) {\n console.error(`\\x1B[90m${error.stack}${reset}`)\n }\n } else {\n console.error('Error:', error)\n }\n }\n }\n }\n\n private log(config: LoggerConfig): void {\n if (isBrowser) {\n this.logToBrowser(config)\n } else if (isNode) {\n this.logToNode(config)\n }\n }\n\n error(description: string, data?: LogData): void {\n this.log({ level: 'error', description, data, context: this.context })\n }\n\n warn(description: string, data?: LogData): void {\n this.log({ level: 'warn', description, data, context: this.context })\n }\n\n info(description: string, data?: LogData): void {\n this.log({ level: 'info', description, data, context: this.context })\n }\n\n debug(description: string, data?: LogData): void {\n this.log({ level: 'debug', description, data, context: this.context })\n }\n\n trace(description: string, data?: LogData): void {\n this.log({ level: 'trace', description, data, context: this.context })\n }\n\n isEnabled(): boolean {\n if (isBrowser) {\n return this.enabledInBrowser\n }\n return true // Always enabled in Node\n }\n\n setLevel(level: LogLevel): void {\n this.settings.minLevel = level\n }\n\n createContextLogger(context: string): LogHelper {\n const contextualLogger = new Logger(this.settings, context)\n\n return {\n error: (description: string, data?: LogData) => contextualLogger.error(description, data),\n warn: (description: string, data?: LogData) => contextualLogger.warn(description, data),\n info: (description: string, data?: LogData) => contextualLogger.info(description, data),\n debug: (description: string, data?: LogData) => contextualLogger.debug(description, data),\n trace: (description: string, data?: LogData) => contextualLogger.trace(description, data),\n isEnabled: () => contextualLogger.isEnabled(),\n setLevel: (level: LogLevel) => contextualLogger.setLevel(level),\n }\n }\n}\n\n// Factory function - main export\nexport function createLogger(context: string): Logger {\n return new Logger({}, context)\n}\n\n// Default logger instance for convenience\nexport const logger = new Logger()\n\n// Convenience exports\nexport const error = logger.error.bind(logger)\nexport const warn = logger.warn.bind(logger)\nexport const info = logger.info.bind(logger)\nexport const debug = logger.debug.bind(logger)\nexport const trace = logger.trace.bind(logger)\n","// SDK-local copy — see src/utils/base.ts for app version\nimport { createLogger } from './logger'\n\nexport type SettingsObjectSettings = {\n [key: string]: unknown\n}\n\n/**\n * Base class for objects with settings and contextual logging.\n * Services use this.logger.error(message, { data }) pattern directly.\n */\nexport abstract class SettingsObject<T extends SettingsObjectSettings = SettingsObjectSettings> {\n name: string\n settings: T\n logger: ReturnType<typeof createLogger>\n\n constructor(name: string, settings: T) {\n this.name = name\n this.settings = settings\n this.logger = createLogger(name)\n }\n}\n","// SDK-local copy — see src/utils/cookies.ts for app version\n\n/**\n * Client-side cookie utilities\n * Provides simple interface for reading/writing cookies with secure defaults\n */\n\nexport interface CookieOptions {\n httpOnly?: boolean\n secure?: boolean\n sameSite?: 'strict' | 'lax' | 'none'\n maxAge?: number // in seconds\n domain?: string\n path?: string\n}\n\nexport class CookieUtil {\n // Configuration properties\n tokenName = 'auth-token'\n tokenMaxAge = 60 * 60 * 24 * 7 // 7 days\n fallbackStorageKey = 'token' // For localStorage migration\n productionDomain = '.pagelines.com'\n /**\n * Get cookie value by name\n */\n getCookie(name: string): string | null {\n if (typeof document === 'undefined')\n return null\n\n const cookies = document.cookie.split(';')\n for (const cookie of cookies) {\n const [cookieName, cookieValue] = cookie.trim().split('=')\n if (cookieName === name) {\n return decodeURIComponent(cookieValue || '')\n }\n }\n return null\n }\n\n /**\n * Set cookie with secure defaults\n */\n setCookie(name: string, value: string, options: CookieOptions = {}): void {\n if (typeof document === 'undefined')\n return\n\n const {\n secure = true,\n sameSite = 'lax',\n maxAge = 60 * 60 * 24 * 7, // 7 days default\n domain,\n path = '/',\n } = options\n\n let cookieString = `${name}=${encodeURIComponent(value)}`\n cookieString += `; Path=${path}`\n cookieString += `; Max-Age=${maxAge}`\n cookieString += `; SameSite=${sameSite}`\n\n if (secure) {\n cookieString += '; Secure'\n }\n\n if (domain) {\n cookieString += `; Domain=${domain}`\n }\n\n document.cookie = cookieString\n }\n\n /**\n * Remove cookie by setting expired date\n */\n removeCookie(name: string, options: Pick<CookieOptions, 'domain' | 'path'> = {}): void {\n this.setCookie(name, '', { ...options, maxAge: 0 })\n }\n\n /**\n * Check if localStorage is fully functional (some test environments provide partial mocks)\n */\n private isLocalStorageFunctional(): boolean {\n return typeof window !== 'undefined'\n && typeof window.localStorage?.getItem === 'function'\n && typeof window.localStorage?.setItem === 'function'\n && typeof window.localStorage?.removeItem === 'function'\n }\n\n /**\n * Get auth token with fallback to localStorage for migration\n */\n getAuthToken(): string | null {\n // Try cookie first (new approach)\n const cookieToken = this.getCookie(this.tokenName)\n if (cookieToken)\n return cookieToken\n\n // Fallback to localStorage for migration (browser-only)\n if (this.isLocalStorageFunctional()) {\n const localToken = window.localStorage.getItem(this.fallbackStorageKey)\n if (localToken) {\n // Migrate to cookie and remove from localStorage\n this.setAuthToken(localToken)\n window.localStorage.removeItem(this.fallbackStorageKey)\n return localToken\n }\n }\n\n return null\n }\n\n /**\n * Set auth token in cookie with production-ready settings\n */\n setAuthToken(token: string): void {\n const isProduction = typeof window !== 'undefined' && window.location.hostname !== 'localhost'\n\n this.setCookie(this.tokenName, token, {\n secure: isProduction,\n sameSite: 'lax',\n maxAge: this.tokenMaxAge,\n domain: isProduction ? this.productionDomain : undefined,\n path: '/',\n })\n }\n\n /**\n * Remove auth token\n */\n removeAuthToken(): void {\n const isProduction = typeof window !== 'undefined' && window.location.hostname !== 'localhost'\n\n this.removeCookie(this.tokenName, {\n domain: isProduction ? this.productionDomain : undefined,\n path: '/',\n })\n\n // Also remove from localStorage if it exists (cleanup, browser-only)\n if (this.isLocalStorageFunctional()) {\n window.localStorage.removeItem(this.fallbackStorageKey)\n }\n }\n}\n\nexport const cookieUtil = new CookieUtil()\n","import type { Hono } from 'hono'\nimport { APP_PORT, APP_PROD_URL } from '@pagelines/types'\nimport { hc } from 'hono/client'\nimport { cookieUtil } from './utils/cookies'\n\nexport interface ApiClientSettings {\n isDev: boolean\n apiBase?: string\n [key: string]: unknown\n}\n\n/**\n * Create fully typed Hono RPC client for PageLines SDK\n *\n * @template TAppType - The Hono app type from the server (enables full type safety)\n * @param settings - Configuration for API base URL and environment\n * @param responseHandler - Optional handler to process ApiResponse for auto user/token updates\n * @returns Typed Hono client with response interceptor\n *\n * @example\n * ```typescript\n * import type { SDKAppType } from '@/modules/main/server'\n * const client = createApiClient<SDKAppType>({ isDev: true })\n * const response = await client.api.auth['check-email'].$post({ json: { email } })\n * ```\n */\nexport function createApiClient<TAppType extends Hono = any>(\n settings: ApiClientSettings,\n responseHandler?: (response: any) => void,\n): ReturnType<typeof hc<TAppType>> {\n // Auto-detect API base URL\n const baseUrl = settings.apiBase || (settings.isDev ? `http://localhost:${APP_PORT}` : APP_PROD_URL)\n\n // Create typed Hono RPC client with response interceptor\n const client = hc<TAppType>(baseUrl, {\n fetch: async (input: RequestInfo | URL, init?: RequestInit) => {\n const token = cookieUtil.getAuthToken()\n\n const response = await fetch(input, {\n ...init,\n headers: {\n ...init?.headers,\n 'Content-Type': 'application/json',\n // Only include Authorization header if token exists\n ...(token && { 'Authorization': `Bearer ${token}` }),\n },\n // Use 'omit' for Bearer tokens (not cookies) to allow CORS wildcard origin\n credentials: 'omit',\n })\n\n // Intercept response to process ApiResponse pattern\n if (responseHandler) {\n // Wrap the original response's json method directly\n const originalJson = response.json.bind(response)\n\n // Override json method on the response object itself\n response.json = async () => {\n const result = await originalJson()\n\n // Process ApiResponse pattern if it has user/token fields\n if (typeof result === 'object' && result !== null) {\n if ('ok' in result && ('user' in result || 'token' in result)) {\n responseHandler(result)\n }\n }\n\n return result\n }\n }\n\n return response\n },\n })\n\n return client\n}\n","import { cleanTasks } from '../task/index.js'\n\nexport let clean = Symbol('clean')\n\nexport let cleanStores = (...stores) => {\n if (process.env.NODE_ENV === 'production') {\n throw new Error(\n 'cleanStores() can be used only during development or tests'\n )\n }\n cleanTasks()\n for (let $store of stores) {\n if ($store) {\n if ($store.mocked) delete $store.mocked\n if ($store[clean]) $store[clean]()\n }\n }\n}\n","import { clean } from '../clean-stores/index.js'\n\nlet listenerQueue = []\nlet lqIndex = 0\nconst QUEUE_ITEMS_PER_LISTENER = 4\nexport let epoch = 0\n\n/* @__NO_SIDE_EFFECTS__ */\nexport const atom = initialValue => {\n let listeners = []\n let $atom = {\n get() {\n if (!$atom.lc) {\n $atom.listen(() => {})()\n }\n return $atom.value\n },\n lc: 0,\n listen(listener) {\n $atom.lc = listeners.push(listener)\n\n return () => {\n for (\n let i = lqIndex + QUEUE_ITEMS_PER_LISTENER;\n i < listenerQueue.length;\n\n ) {\n if (listenerQueue[i] === listener) {\n listenerQueue.splice(i, QUEUE_ITEMS_PER_LISTENER)\n } else {\n i += QUEUE_ITEMS_PER_LISTENER\n }\n }\n\n let index = listeners.indexOf(listener)\n if (~index) {\n listeners.splice(index, 1)\n if (!--$atom.lc) $atom.off()\n }\n }\n },\n notify(oldValue, changedKey) {\n epoch++\n let runListenerQueue = !listenerQueue.length\n for (let listener of listeners) {\n listenerQueue.push(listener, $atom.value, oldValue, changedKey)\n }\n\n if (runListenerQueue) {\n for (\n lqIndex = 0;\n lqIndex < listenerQueue.length;\n lqIndex += QUEUE_ITEMS_PER_LISTENER\n ) {\n listenerQueue[lqIndex](\n listenerQueue[lqIndex + 1],\n listenerQueue[lqIndex + 2],\n listenerQueue[lqIndex + 3]\n )\n }\n listenerQueue.length = 0\n }\n },\n /* It will be called on last listener unsubscribing.\n We will redefine it in onMount and onStop. */\n off() {},\n set(newValue) {\n let oldValue = $atom.value\n if (oldValue !== newValue) {\n $atom.value = newValue\n $atom.notify(oldValue)\n }\n },\n subscribe(listener) {\n let unbind = $atom.listen(listener)\n listener($atom.value)\n return unbind\n },\n value: initialValue\n }\n\n if (process.env.NODE_ENV !== 'production') {\n $atom[clean] = () => {\n listeners = []\n $atom.lc = 0\n $atom.off()\n }\n }\n\n return $atom\n}\n\nexport const readonlyType = store => store\n","import type { Ref } from 'vue'\nimport type { EnrichedUser } from '@pagelines/types'\nimport { atom } from 'nanostores'\nimport { watch } from 'vue'\nimport { cookieUtil } from './utils/cookies'\nimport { createLogger } from './utils/logger'\n\n// Global nanostores for persistence across page navigations\n// These must be outside the class to survive view transitions\nconst $globalActiveUser = atom<EnrichedUser | undefined>(undefined)\nconst $globalToken = atom<string | null>(null)\n\n/**\n * SDKStorage - Handles all storage, sync, and persistence for PageLinesSDK\n *\n * Extracted from PageLinesSDK to keep the main class focused on public API methods.\n * Manages localStorage, cookies, and nanostor synchronization for state persistence.\n */\nexport class SDKStorage {\n private logger = createLogger('SDKStorage')\n\n /**\n * Check if localStorage is fully functional (some test environments provide partial mocks)\n */\n private isLocalStorageFunctional(): boolean {\n return typeof window !== 'undefined'\n && typeof localStorage?.getItem === 'function'\n && typeof localStorage?.setItem === 'function'\n && typeof localStorage?.removeItem === 'function'\n }\n\n /**\n * Sync Vue reactive refs with global nanostores for cross-page persistence\n */\n syncWithGlobalStores(activeUser: Ref<EnrichedUser | undefined>, token: Ref<string | null>): void {\n // 1. Restore from global store on init\n const storedUser = $globalActiveUser.get()\n const storedToken = $globalToken.get()\n\n if (storedUser) {\n activeUser.value = storedUser\n }\n if (storedToken) {\n token.value = storedToken\n }\n\n // 2. Vue refs → global stores (for persistence)\n watch(activeUser, (newUser) => {\n $globalActiveUser.set(newUser)\n }, { immediate: true })\n\n watch(token, (newToken) => {\n $globalToken.set(newToken)\n }, { immediate: true })\n\n // 3. Global stores → Vue refs (for cross-page updates)\n $globalActiveUser.subscribe((newUser) => {\n if (newUser !== activeUser.value) {\n activeUser.value = newUser\n }\n })\n\n $globalToken.subscribe((newToken) => {\n if (newToken !== token.value) {\n token.value = newToken\n }\n })\n }\n\n /**\n * Load user and token from browser storage on initialization\n */\n loadFromStorage(activeUser: Ref<EnrichedUser | undefined>, token: Ref<string | null>): void {\n if (typeof window === 'undefined')\n return\n\n // Load token from cookie\n const savedToken = cookieUtil.getAuthToken()\n if (savedToken) {\n token.value = savedToken\n }\n\n // Try to load user from localStorage for immediate availability\n if (this.isLocalStorageFunctional()) {\n try {\n const savedUser = localStorage.getItem('pagelines-user')\n if (savedUser) {\n activeUser.value = JSON.parse(savedUser)\n }\n } catch (error) {\n this.logger.error('Failed to load user from localStorage', { data: error })\n }\n }\n }\n\n /**\n * Save current user and token to browser storage\n */\n saveToStorage(activeUser: Ref<EnrichedUser | undefined>, token: Ref<string | null>): void {\n if (typeof window === 'undefined')\n return\n\n // Save token to cookie using app's cookie utility\n if (token.value) {\n cookieUtil.setAuthToken(token.value)\n } else {\n cookieUtil.removeAuthToken()\n }\n\n // Save user to localStorage for quick loading\n if (this.isLocalStorageFunctional()) {\n try {\n if (activeUser.value) {\n localStorage.setItem('pagelines-user', JSON.stringify(activeUser.value))\n } else {\n localStorage.removeItem('pagelines-user')\n }\n } catch (error) {\n this.logger.error('Failed to save user to localStorage', { data: error })\n }\n }\n }\n\n /**\n * Clear all stored user data and tokens\n */\n clearStorage(): void {\n if (typeof window === 'undefined')\n return\n\n cookieUtil.removeAuthToken()\n\n if (this.isLocalStorageFunctional()) {\n try {\n localStorage.removeItem('pagelines-user')\n } catch (error) {\n this.logger.error('Failed to clear user from localStorage', { data: error })\n }\n }\n\n // Clear global stores\n $globalActiveUser.set(undefined)\n $globalToken.set(null)\n }\n\n /**\n * Generic localStorage getter\n */\n getItem(key: string): string | null {\n if (!this.isLocalStorageFunctional())\n return null\n\n try {\n return localStorage.getItem(key)\n } catch (error) {\n this.logger.error('Failed to get item from localStorage', { key, error })\n return null\n }\n }\n\n /**\n * Generic localStorage setter\n */\n setItem(key: string, value: string): void {\n if (!this.isLocalStorageFunctional())\n return\n\n try {\n localStorage.setItem(key, value)\n } catch (error) {\n this.logger.error('Failed to set item in localStorage', { key, error })\n }\n }\n}\n","import type { EnrichedUser } from '@pagelines/types'\nimport { APP_PORT, APP_PROD_URL } from '@pagelines/types'\nimport type { SDKContext } from './types'\n\nexport class AuthClient {\n constructor(private ctx: SDKContext) {}\n\n async sendCode(email: string): Promise<void> {\n this.ctx.loading.value = true\n this.ctx.error.value = null\n\n try {\n const response = await this.ctx.api.auth['check-email'].$post({\n json: { email },\n })\n\n const data = await response.json()\n\n if (!data.ok) {\n this.ctx.error.value = data.error\n throw new Error(data.error)\n }\n } catch (err) {\n this.ctx.logger.error('Send code error', { data: err })\n const errorMessage = err instanceof Error ? err.message : 'Failed to send verification code'\n this.ctx.error.value = errorMessage\n throw err\n } finally {\n this.ctx.loading.value = false\n }\n }\n\n async verifyCode(email: string, code: string): Promise<void> {\n this.ctx.loading.value = true\n this.ctx.error.value = null\n\n try {\n const response = await this.ctx.api.auth['verify-code'].$post({\n json: { email, code },\n })\n\n const data = await response.json()\n\n if (!data.ok) {\n this.ctx.error.value = data.error\n throw new Error(data.error)\n }\n } catch (err) {\n this.ctx.logger.error('Verify code error', { data: err })\n const errorMessage = err instanceof Error ? err.message : 'Failed to verify code'\n this.ctx.error.value = errorMessage\n throw err\n } finally {\n this.ctx.loading.value = false\n }\n }\n\n async login(email: string, password: string): Promise<void> {\n this.ctx.loading.value = true\n this.ctx.error.value = null\n\n try {\n const response = await this.ctx.api.auth.login.$post({\n json: { email, password },\n })\n\n const data = await response.json()\n\n if (!data.ok) {\n this.ctx.error.value = data.error\n throw new Error(data.error)\n }\n } catch (err) {\n this.ctx.logger.error('Login error', { data: err })\n const errorMessage = err instanceof Error ? err.message : 'Login failed'\n this.ctx.error.value = errorMessage\n throw err\n } finally {\n this.ctx.loading.value = false\n }\n }\n\n async logout(): Promise<void> {\n this.ctx.loading.value = true\n this.ctx.error.value = null\n\n try {\n await this.ctx.api.auth.logout.$post()\n\n // Clear local state\n this.ctx.activeUser.value = undefined\n this.ctx.token.value = null\n this.ctx.storage.clearStorage()\n } catch (err) {\n this.ctx.logger.error('Logout error (user still logged out locally)', { data: err })\n // Still clear local state even if API call fails\n this.ctx.activeUser.value = undefined\n this.ctx.token.value = null\n this.ctx.storage.clearStorage()\n } finally {\n this.ctx.loading.value = false\n }\n }\n\n async getCurrentUser(): Promise<EnrichedUser | undefined> {\n if (!this.ctx.token.value) {\n return undefined\n }\n\n this.ctx.loading.value = true\n\n try {\n const response = await this.ctx.api.auth.me.$get()\n const data = await response.json()\n\n if (!data.ok) {\n this.ctx.error.value = data.error\n // Clear invalid session\n if (data.error.includes('Authentication')) {\n this.ctx.activeUser.value = undefined\n this.ctx.token.value = null\n this.ctx.storage.clearStorage()\n }\n return undefined\n }\n\n return data.user\n } catch (err) {\n this.ctx.logger.error('Get current user error', { data: err })\n this.ctx.error.value = err instanceof Error ? err.message : 'Failed to get user info'\n return undefined\n } finally {\n this.ctx.loading.value = false\n }\n }\n\n async requestAuthCode(args: { email: string }): Promise<boolean> {\n this.ctx.loading.value = true\n this.ctx.error.value = null\n\n try {\n const response = await this.ctx.api.auth['check-email'].$post({\n json: { email: args.email },\n })\n\n const data = await response.json()\n\n if (!data.ok) {\n this.ctx.error.value = data.error\n this.ctx.logger.error('Failed to request auth code', { email: args.email, error: data.error })\n return false\n }\n\n this.ctx.logger.info('Auth code requested successfully', { email: args.email })\n return true\n } catch (err) {\n this.ctx.logger.error('Request auth code error', { email: args.email, error: err })\n this.ctx.error.value = err instanceof Error ? err.message : 'Failed to request auth code'\n return false\n } finally {\n this.ctx.loading.value = false\n }\n }\n\n async loginWithCode(args: {\n email: string\n code: string\n orgId?: string\n autoCreateContact?: boolean\n }): Promise<boolean> {\n this.ctx.loading.value = true\n this.ctx.error.value = null\n\n try {\n const response = await this.ctx.api.auth['verify-code'].$post({\n json: { email: args.email, code: args.code },\n })\n\n const data = await response.json()\n\n if (!data.ok) {\n this.ctx.error.value = data.error\n this.ctx.logger.error('Login failed', { email: args.email, error: data.error })\n return false\n }\n\n // Response interceptor automatically processes user/token updates\n this.ctx.logger.info('Login successful', { email: args.email })\n\n return true\n } catch (err) {\n this.ctx.logger.error('Login with code error', { email: args.email, error: err })\n this.ctx.error.value = err instanceof Error ? err.message : 'Login failed'\n return false\n } finally {\n this.ctx.loading.value = false\n }\n }\n\n loginWithGoogle(args?: { onSuccess?: (user: EnrichedUser) => void, onError?: (error: string) => void }): void {\n if (typeof window === 'undefined') {\n this.ctx.logger.error('loginWithGoogle: Only available in browser')\n return\n }\n\n const apiBase = this.ctx.apiBase || (this.ctx.isDev ? `http://localhost:${APP_PORT}` : APP_PROD_URL)\n const origin = window.location.origin\n const popupUrl = `${apiBase}/auth/google-popup?origin=${encodeURIComponent(origin)}`\n\n // Open centered popup\n const width = 500\n const height = 600\n const left = window.screenX + (window.outerWidth - width) / 2\n const top = window.screenY + (window.outerHeight - height) / 2\n const popup = window.open(\n popupUrl,\n 'google-auth',\n `width=${width},height=${height},left=${left},top=${top},popup=yes`,\n )\n\n if (!popup) {\n const msg = 'Popup was blocked. Please allow popups for this site.'\n this.ctx.error.value = msg\n args?.onError?.(msg)\n return\n }\n\n // Listen for postMessage from popup\n const handler = (event: MessageEvent) => {\n // Validate origin -- must be our API base\n const expectedOrigin = new URL(apiBase).origin\n if (event.origin !== expectedOrigin) return\n\n if (event.data?.type === 'auth-success') {\n window.removeEventListener('message', handler)\n const { token, user } = event.data\n\n // Process the auth response the same way as other login methods\n this.ctx.processApiResponse({ ok: true, data: {}, token, user })\n\n this.ctx.logger.info('Google login successful')\n args?.onSuccess?.(user)\n } else if (event.data?.type === 'auth-error') {\n window.removeEventListener('message', handler)\n const errorMsg = event.data.error || 'Google authentication failed'\n this.ctx.error.value = errorMsg\n this.ctx.logger.error('Google login failed', { error: errorMsg })\n args?.onError?.(errorMsg)\n }\n }\n\n window.addEventListener('message', handler)\n\n // Clean up listener if popup is closed without completing auth\n const checkClosed = setInterval(() => {\n if (popup.closed) {\n clearInterval(checkClosed)\n window.removeEventListener('message', handler)\n }\n }, 500)\n }\n}\n","import type { ApiResponse } from '@pagelines/types'\nimport { APP_PORT, APP_PROD_URL } from '@pagelines/types'\nimport type { SDKContext } from './types'\n\nexport class ChatClient {\n constructor(private ctx: SDKContext) {}\n\n async chatStream(args: {\n handle: string\n message: string\n conversationId?: string\n history?: Array<{ role: 'user' | 'assistant', content: string }>\n visitorId?: string\n context?: string\n onDelta: (text: string) => void\n onDone: (conversationId: string) => void\n onError: (error: string) => void\n }): Promise<void> {\n const apiBase = this.ctx.apiBase || (this.ctx.isDev ? `http://localhost:${APP_PORT}` : APP_PROD_URL)\n const url = `${apiBase}/api/agent/public/${encodeURIComponent(args.handle)}/chat/stream`\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n message: args.message,\n conversationId: args.conversationId,\n history: args.history,\n visitorId: args.visitorId,\n context: args.context,\n }),\n })\n\n if (!response.ok) {\n const errorBody = await response.json().catch(() => ({ error: 'Request failed' })) as { error?: string }\n args.onError(errorBody.error || `HTTP ${response.status}`)\n return\n }\n\n const reader = response.body?.getReader()\n if (!reader) {\n args.onError('No response stream')\n return\n }\n\n const decoder = new TextDecoder()\n let buffer = ''\n let resolvedConversationId = args.conversationId || ''\n\n while (true) {\n const { done, value } = await reader.read()\n if (done)\n break\n\n buffer += decoder.decode(value, { stream: true })\n const lines = buffer.split('\\n')\n buffer = lines.pop() || ''\n\n for (const line of lines) {\n if (!line.startsWith('data: '))\n continue\n\n const data = line.slice(6).trim()\n if (data === '[DONE]') {\n args.onDone(resolvedConversationId)\n return\n }\n\n try {\n const chunk = JSON.parse(data) as {\n choices?: Array<{ delta?: { content?: string } }>\n pl_metadata?: { conversationId?: string }\n }\n\n if (chunk.pl_metadata?.conversationId) {\n resolvedConversationId = chunk.pl_metadata.conversationId\n }\n\n const delta = chunk.choices?.[0]?.delta\n if (delta?.content) {\n args.onDelta(delta.content)\n }\n } catch {\n // Skip malformed chunks\n }\n }\n }\n\n // Stream ended without [DONE]\n args.onDone(resolvedConversationId)\n } catch (error) {\n args.onError(error instanceof Error ? error.message : 'Stream failed')\n }\n }\n\n async chatMessage(args: {\n handle: string\n message: string\n conversationId?: string\n visitorId?: string\n context?: string\n }): Promise<{ conversationId: string, content: string } | undefined> {\n const apiBase = this.ctx.apiBase || (this.ctx.isDev ? `http://localhost:${APP_PORT}` : APP_PROD_URL)\n const url = `${apiBase}/api/agent/public/${encodeURIComponent(args.handle)}/chat`\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n message: args.message,\n conversationId: args.conversationId,\n visitorId: args.visitorId,\n context: args.context,\n }),\n })\n\n const data = await response.json() as ApiResponse<{\n conversationId: string\n message: { role: 'assistant', content: string }\n }>\n\n if (!data.ok || !data.data) {\n this.ctx.logger.error('chatMessage failed', { error: !data.ok && 'error' in data ? data.error : 'Unknown' })\n return undefined\n }\n\n return {\n conversationId: data.data.conversationId,\n content: data.data.message.content,\n }\n } catch (err) {\n this.ctx.logger.error('chatMessage error', { error: err })\n return undefined\n }\n }\n\n}\n","import type { Agent } from '@pagelines/types'\nimport { objectId } from '../utils/id'\nimport type { SDKContext } from './types'\n\nexport class UserClient {\n constructor(private ctx: SDKContext) {}\n\n async getPublicAgent(args: { handle: string }): Promise<Agent | undefined> {\n this.ctx.loading.value = true\n this.ctx.error.value = null\n\n try {\n const response = await this.ctx.api.agent.public[':handle'].$get({\n param: { handle: args.handle },\n })\n\n const data = await response.json()\n\n if (!data.ok) {\n this.ctx.error.value = data.error\n this.ctx.logger.error('Failed to fetch public agent', { handle: args.handle, error: data.error })\n return undefined\n }\n\n return data.data\n } catch (err) {\n this.ctx.logger.error('Get public agent error', { handle: args.handle, error: err })\n this.ctx.error.value = err instanceof Error ? err.message : 'Failed to fetch agent'\n return undefined\n } finally {\n this.ctx.loading.value = false\n }\n }\n\n async getAgentByEmail(args: { email: string }): Promise<Agent | undefined> {\n this.ctx.loading.value = true\n this.ctx.error.value = null\n\n try {\n const response = await this.ctx.api.agent['by-email'][':email'].$get({\n param: { email: args.email },\n })\n\n const data = await response.json()\n\n if (!data.ok) {\n this.ctx.error.value = data.error\n this.ctx.logger.error('Failed to fetch agent by email', { email: args.email, error: data.error })\n return undefined\n }\n\n return data.data\n } catch (err) {\n this.ctx.logger.error('Get agent by email error', { email: args.email, error: err })\n this.ctx.error.value = err instanceof Error ? err.message : 'Failed to fetch agent'\n return undefined\n } finally {\n this.ctx.loading.value = false\n }\n }\n\n generateAnonId(): string {\n const storageKey = 'pagelinesAnonId'\n let anonId = this.ctx.storage.getItem(storageKey)\n\n if (!anonId) {\n anonId = objectId({ prefix: 'anon' })\n this.ctx.storage.setItem(storageKey, anonId)\n }\n\n return anonId\n }\n\n track(args: {\n event: 'view_profile' | 'profile_interaction'\n agentId: string\n properties?: Record<string, any>\n }): void {\n try {\n // Track event via postMessage to parent window if embedded\n if (typeof window !== 'undefined' && window.parent !== window) {\n window.parent.postMessage({\n type: 'pagelines_track',\n event: args.event,\n agentId: args.agentId,\n properties: args.properties || {},\n }, '*')\n }\n\n this.ctx.logger.info('SDK event tracked', { event: args.event, agentId: args.agentId })\n } catch (err) {\n this.ctx.logger.error('Track event error', { error: err, args })\n }\n }\n}\n","import type { hc } from 'hono/client'\n// Use stub type for production builds (aliased in vite.config.sdk.ts)\n// Dev uses real SDKAppType from server via alias\nimport type { SDKAppType } from '@/modules/main/server'\nimport type { Agent, EnrichedUser } from '@pagelines/types'\nimport type { ApiResponse } from '@pagelines/types'\nimport { objectId } from './utils/id'\nimport { computed, ref } from 'vue'\nimport { SettingsObject } from './utils/base'\nimport { createApiClient } from './api'\nimport { SDKStorage } from './sdkStorage'\nimport { AuthClient } from './clients/AuthClient'\nimport { ChatClient } from './clients/ChatClient'\nimport { UserClient } from './clients/UserClient'\nimport type { SDKContext } from './clients/types'\n\nexport interface PageLinesSDKSettings {\n apiBase?: string\n isDev?: boolean\n [key: string]: unknown\n}\n\n/**\n * Browser-only singleton manager\n * Browser: Uses globalThis for cross-bundle singleton (www + widget)\n * Node.js SSR: No singleton - each request gets new instance (prevents request bleeding)\n */\nclass SDKGlobal {\n private key = '__PAGELINES_SDK__'\n\n get(): PageLinesSDK | undefined {\n if (typeof window === 'undefined')\n return undefined\n return (globalThis as any)[this.key]\n }\n\n set(instance: PageLinesSDK): void {\n if (typeof window !== 'undefined')\n (globalThis as any)[this.key] = instance\n }\n\n delete(): void {\n if (typeof window !== 'undefined')\n delete (globalThis as any)[this.key]\n }\n}\n\n// Module-scoped singleton manager\nconst sdkGlobal = new SDKGlobal()\n\nexport class PageLinesSDK extends SettingsObject<PageLinesSDKSettings> {\n /**\n * Get singleton instance in browser (creates if doesn't exist)\n * Node.js: Always creates new instance (no singleton)\n * Recommended: Use this instead of constructor for shared state\n */\n static getInstance(settings: PageLinesSDKSettings = {}): PageLinesSDK {\n // Browser: return singleton or create\n // Node: always create new (no singleton)\n return sdkGlobal.get() || new PageLinesSDK(settings)\n }\n\n // Vue reactive state\n activeUser = ref<EnrichedUser | undefined>()\n token = ref<string | null>(null)\n loading = ref(false)\n error = ref<string | null>(null)\n apiBase = this.settings.apiBase || undefined\n\n // Storage handler for persistence\n private storage = new SDKStorage()\n\n // Auto-managed session ID for usage tracking\n private sessionId = objectId({ prefix: 'ses' })\n\n get isDev() {\n return this.settings.isDev ?? (\n typeof window !== 'undefined'\n ? window.location.hostname === 'localhost' || window.location.hostname.includes('127.0.0.1')\n : false\n )\n }\n\n // Typed Hono RPC client - uses SDKAppType (auth/self/usage routes only)\n // Initialized in constructor (definite assignment via singleton pattern)\n private apiClient!: ReturnType<typeof hc<SDKAppType>>\n\n // Bypass stub typing for route access (production builds use SDKAppType stub)\n // Runtime types are validated via Zod at API boundaries\n private get api() {\n return (this.apiClient as any).api\n }\n\n // Computed properties derived from activeUser (matches UserClient pattern)\n currentAgent = computed(() => {\n const user = this.activeUser.value\n if (!user?.agents)\n return undefined\n\n const agentId = user.primaryAgentId || user.agents[0]?.agentId\n if (!agentId)\n return undefined\n\n return user.agents.find((a) => a.agentId === agentId)\n })\n\n currentOrg = computed(() => {\n const agent = this.currentAgent.value\n if (!agent?.orgId)\n return undefined\n\n const user = this.activeUser.value\n if (!user?.orgs)\n return undefined\n\n return user.orgs.find((org) => org.orgId === agent.orgId)\n })\n\n // Initialization state\n initialized?: Promise<EnrichedUser | undefined>\n resolveUser?: (value: EnrichedUser | undefined) => void\n\n // Sub-clients (new preferred API surface)\n readonly auth!: AuthClient\n readonly chat!: ChatClient\n readonly user!: UserClient\n\n constructor(settings: PageLinesSDKSettings = {}) {\n // Browser: return existing singleton\n // Node: always create new\n const existing = sdkGlobal.get()\n if (existing) {\n console.debug('[PageLinesSDK] Returning existing singleton instance')\n return existing\n }\n\n super('PageLinesSDK', settings)\n\n // Browser: set singleton reference (no-op in Node)\n sdkGlobal.set(this)\n\n // Create typed Hono RPC client with response handler\n this.apiClient = createApiClient<SDKAppType>(\n { isDev: this.isDev, apiBase: this.apiBase },\n this.processApiResponse.bind(this),\n )\n\n // Build shared context for sub-clients\n const ctx: SDKContext = {\n api: this.api,\n apiBase: this.apiBase,\n isDev: this.isDev,\n activeUser: this.activeUser,\n token: this.token,\n loading: this.loading,\n error: this.error,\n currentAgent: this.currentAgent,\n storage: this.storage,\n sessionId: this.sessionId,\n logger: this.logger,\n processApiResponse: this.processApiResponse.bind(this),\n }\n\n // Initialize sub-clients\n this.auth = new AuthClient(ctx)\n this.chat = new ChatClient(ctx)\n this.user = new UserClient(ctx)\n\n this.logger.info('PageLinesSDK initialized')\n\n // Initialize from storage using handler\n this.storage.loadFromStorage(this.activeUser, this.token)\n\n // Sync with global stores for persistence across navigation\n this.storage.syncWithGlobalStores(this.activeUser, this.token)\n\n // Set up initialization promise (same pattern as UserClient)\n this.initialized = new Promise((resolve) => {\n this.resolveUser = resolve\n })\n\n // Auto-fetch user if token exists (mirrors UserClient pattern)\n if (this.token.value && !this.activeUser.value) {\n this.getCurrentUser().then((user) => {\n if (this.resolveUser) {\n this.resolveUser(user)\n this.resolveUser = undefined\n }\n }).catch((err) => {\n this.logger.error('Auto user fetch failed', { data: err })\n if (this.resolveUser) {\n this.resolveUser(undefined)\n this.resolveUser = undefined\n }\n })\n } else if (this.activeUser.value) {\n // Resolve immediately if we already have a user from storage\n this.resolveUser?.(this.activeUser.value)\n } else {\n // No token, resolve with undefined\n this.resolveUser?.(undefined)\n }\n }\n\n // Process ApiResponse for automatic user/token updates - public for dependency injection\n processApiResponse(response: ApiResponse<any>): void {\n // Handle user updates\n if (response.ok && response.user) {\n this.activeUser.value = response.user\n this.logger.info('User updated from API response', { data: response.user })\n }\n\n // Handle token updates\n if (response.ok && response.token) {\n this.token.value = response.token\n this.storage.saveToStorage(this.activeUser, this.token)\n this.logger.info('Token updated from API response')\n }\n\n // Resolve initialization promise\n if (this.resolveUser && response.ok) {\n this.resolveUser(response.user)\n this.resolveUser = undefined\n }\n }\n\n // Clear all user data and tokens\n clearSession(): void {\n this.logger.info('Clearing session')\n this.activeUser.value = undefined\n this.token.value = null\n this.error.value = null\n this.storage.clearStorage()\n }\n\n // Full reset - clears session + state + destroys singleton\n clear(): void {\n this.logger.info('Clearing SDK completely')\n\n // 1. Clear session data\n this.clearSession()\n\n // 2. Reset other state\n this.loading.value = false\n this.sessionId = objectId({ prefix: 'ses' })\n\n // 3. Destroy singleton (no-op in Node)\n sdkGlobal.delete()\n }\n\n // Backward-compatible delegates -- these forward to sub-clients\n // Can be removed in a future breaking change\n async sendCode(email: string): Promise<void> { return this.auth.sendCode(email) }\n async verifyCode(email: string, code: string): Promise<void> { return this.auth.verifyCode(email, code) }\n async login(email: string, password: string): Promise<void> { return this.auth.login(email, password) }\n async logout(): Promise<void> { return this.auth.logout() }\n async getCurrentUser(): Promise<EnrichedUser | undefined> { return this.auth.getCurrentUser() }\n async requestAuthCode(args: { email: string }): Promise<boolean> { return this.auth.requestAuthCode(args) }\n async loginWithCode(args: { email: string, code: string, orgId?: string, autoCreateContact?: boolean }): Promise<boolean> { return this.auth.loginWithCode(args) }\n loginWithGoogle(args?: { onSuccess?: (user: EnrichedUser) => void, onError?: (error: string) => void }): void { return this.auth.loginWithGoogle(args) }\n\n async chatStream(args: Parameters<ChatClient['chatStream']>[0]): Promise<void> { return this.chat.chatStream(args) }\n async chatMessage(args: Parameters<ChatClient['chatMessage']>[0]): Promise<{ conversationId: string, content: string } | undefined> { return this.chat.chatMessage(args) }\n\n async getPublicAgent(args: { handle: string }): Promise<Agent | undefined> { return this.user.getPublicAgent(args) }\n async getAgentByEmail(args: { email: string }): Promise<Agent | undefined> { return this.user.getAgentByEmail(args) }\n generateAnonId(): string { return this.user.generateAnonId() }\n track(args: Parameters<UserClient['track']>[0]): void { return this.user.track(args) }\n}\n"],"names":["objectId","args","prefix","effectivePrefix","timestamp","randomPart","__name","process","isBrowser","isNode","isProd","isDev","logLevels","SENSITIVE_KEYS","_Logger","settings","context","__publicField","level","enabled","hostname","currentPriority","minPriority","obj","item","result","key","value","lowerKey","sensitive","data","maxDepth","currentDepth","formatted","entries","maxProperties","config","description","error","levelConfig","style","ctx","logEntry","reset","dim","nodeColor","logMessage","contextualLogger","Logger","createLogger","logger","_SettingsObject","name","SettingsObject","_CookieUtil","cookies","cookie","cookieName","cookieValue","options","secure","sameSite","maxAge","domain","path","cookieString","cookieToken","localToken","token","isProduction","CookieUtil","cookieUtil","createApiClient","responseHandler","baseUrl","APP_PORT","APP_PROD_URL","hc","input","init","response","originalJson","clean","listenerQueue","lqIndex","QUEUE_ITEMS_PER_LISTENER","atom","initialValue","listeners","$atom","listener","index","oldValue","changedKey","runListenerQueue","newValue","unbind","$globalActiveUser","$globalToken","_SDKStorage","activeUser","storedUser","storedToken","watch","newUser","newToken","savedToken","savedUser","SDKStorage","_AuthClient","email","err","errorMessage","code","password","apiBase","origin","popupUrl","width","height","left","top","popup","msg","handler","event","expectedOrigin","user","errorMsg","checkClosed","AuthClient","_ChatClient","url","errorBody","reader","decoder","buffer","resolvedConversationId","done","lines","line","chunk","delta","ChatClient","_UserClient","storageKey","anonId","UserClient","_SDKGlobal","instance","SDKGlobal","sdkGlobal","_PageLinesSDK","existing","ref","computed","agentId","a","agent","org","resolve","PageLinesSDK"],"mappings":"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","x_google_ignoreList":[5,6]}
@@ -1,5 +1,5 @@
1
1
  import { Agent, EnrichedUser, ApiResponse } from '@pagelines/types';
2
- import { SettingsObject } from '../../src/utils/base';
2
+ import { SettingsObject } from './utils/base';
3
3
  import { AuthClient } from './clients/AuthClient';
4
4
  import { ChatClient } from './clients/ChatClient';
5
5
  import { UserClient } from './clients/UserClient';
@@ -233,9 +233,7 @@ export declare class PageLinesSDK extends SettingsObject<PageLinesSDKSettings> {
233
233
  instanceId?: string | null | undefined;
234
234
  instanceProvider?: string | null | undefined;
235
235
  imageVersion?: string | null | undefined;
236
- botStatus?: string | null | undefined;
237
236
  botServerUrl?: string | null | undefined;
238
- botError?: string | null | undefined;
239
237
  botHeartbeatAt?: string | null | undefined;
240
238
  desiredStatus?: "active" | "stopped" | null | undefined;
241
239
  onboardedAt?: string | null | undefined;
@@ -472,9 +470,7 @@ export declare class PageLinesSDK extends SettingsObject<PageLinesSDKSettings> {
472
470
  instanceId?: string | null | undefined;
473
471
  instanceProvider?: string | null | undefined;
474
472
  imageVersion?: string | null | undefined;
475
- botStatus?: string | null | undefined;
476
473
  botServerUrl?: string | null | undefined;
477
- botError?: string | null | undefined;
478
474
  botHeartbeatAt?: string | null | undefined;
479
475
  desiredStatus?: "active" | "stopped" | null | undefined;
480
476
  onboardedAt?: string | null | undefined;
@@ -570,9 +566,7 @@ export declare class PageLinesSDK extends SettingsObject<PageLinesSDKSettings> {
570
566
  instanceId?: string | null | undefined;
571
567
  instanceProvider?: string | null | undefined;
572
568
  imageVersion?: string | null | undefined;
573
- botStatus?: string | null | undefined;
574
569
  botServerUrl?: string | null | undefined;
575
- botError?: string | null | undefined;
576
570
  botHeartbeatAt?: string | null | undefined;
577
571
  desiredStatus?: "active" | "stopped" | null | undefined;
578
572
  onboardedAt?: string | null | undefined;
@@ -677,23 +671,12 @@ export declare class PageLinesSDK extends SettingsObject<PageLinesSDKSettings> {
677
671
  conversationId: string;
678
672
  content: string;
679
673
  } | undefined>;
680
- saveMessage(args: Parameters<ChatClient['saveMessage']>[0]): Promise<boolean>;
681
674
  getPublicAgent(args: {
682
675
  handle: string;
683
676
  }): Promise<Agent | undefined>;
684
677
  getAgentByEmail(args: {
685
678
  email: string;
686
679
  }): Promise<Agent | undefined>;
687
- trackUsage(args: Parameters<UserClient['trackUsage']>[0]): Promise<boolean>;
688
- startConversation(args: Parameters<UserClient['startConversation']>[0]): Promise<{
689
- conversationId: string;
690
- hostParticipantId?: string;
691
- visitorParticipantId?: string;
692
- } | undefined>;
693
- autoCreateContact(args: {
694
- userId: string;
695
- orgId: string;
696
- }): Promise<boolean>;
697
680
  generateAnonId(): string;
698
681
  track(args: Parameters<UserClient['track']>[0]): void;
699
682
  }
@@ -0,0 +1,14 @@
1
+ import { createLogger } from './logger';
2
+ export type SettingsObjectSettings = {
3
+ [key: string]: unknown;
4
+ };
5
+ /**
6
+ * Base class for objects with settings and contextual logging.
7
+ * Services use this.logger.error(message, { data }) pattern directly.
8
+ */
9
+ export declare abstract class SettingsObject<T extends SettingsObjectSettings = SettingsObjectSettings> {
10
+ name: string;
11
+ settings: T;
12
+ logger: ReturnType<typeof createLogger>;
13
+ constructor(name: string, settings: T);
14
+ }
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Tailwind v4 OKLCH color scales for theming
3
+ * Values copied from Tailwind CSS v4 default theme
4
+ */
5
+ export type ColorScale = 50 | 100 | 200 | 300 | 400 | 500 | 600 | 700 | 800 | 900 | 950;
6
+ export type ColorName = 'green' | 'blue' | 'rose' | 'cyan' | 'purple' | 'amber' | 'indigo' | 'pink' | 'teal' | 'sky';
7
+ export type ColorScheme = Record<ColorScale, string>;
8
+ /**
9
+ * Get OKLCH color scale for a given color name
10
+ * Returns full scale (50-950) for use with CSS custom properties
11
+ */
12
+ export declare function getColorSchemeOklch(colorName: ColorName): ColorScheme;
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Client-side cookie utilities
3
+ * Provides simple interface for reading/writing cookies with secure defaults
4
+ */
5
+ export interface CookieOptions {
6
+ httpOnly?: boolean;
7
+ secure?: boolean;
8
+ sameSite?: 'strict' | 'lax' | 'none';
9
+ maxAge?: number;
10
+ domain?: string;
11
+ path?: string;
12
+ }
13
+ export declare class CookieUtil {
14
+ tokenName: string;
15
+ tokenMaxAge: number;
16
+ fallbackStorageKey: string;
17
+ productionDomain: string;
18
+ /**
19
+ * Get cookie value by name
20
+ */
21
+ getCookie(name: string): string | null;
22
+ /**
23
+ * Set cookie with secure defaults
24
+ */
25
+ setCookie(name: string, value: string, options?: CookieOptions): void;
26
+ /**
27
+ * Remove cookie by setting expired date
28
+ */
29
+ removeCookie(name: string, options?: Pick<CookieOptions, 'domain' | 'path'>): void;
30
+ /**
31
+ * Check if localStorage is fully functional (some test environments provide partial mocks)
32
+ */
33
+ private isLocalStorageFunctional;
34
+ /**
35
+ * Get auth token with fallback to localStorage for migration
36
+ */
37
+ getAuthToken(): string | null;
38
+ /**
39
+ * Set auth token in cookie with production-ready settings
40
+ */
41
+ setAuthToken(token: string): void;
42
+ /**
43
+ * Remove auth token
44
+ */
45
+ removeAuthToken(): void;
46
+ }
47
+ export declare const cookieUtil: CookieUtil;
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Generate a short random ID
3
+ * @param length - Length of the ID (default: 8)
4
+ * @returns Random alphanumeric string
5
+ */
6
+ export declare function shortId(length?: number): string;
7
+ /**
8
+ * Generate a nanoid-style ID with prefix
9
+ * @param prefix - Prefix for the ID (e.g., 'usr_', 'org_', 'spc_')
10
+ * @param length - Length of the random part (default: 12)
11
+ * @returns Prefixed ID string
12
+ */
13
+ export declare function nanoid(prefix?: string, length?: number): string;
14
+ /**
15
+ * Generate a MongoDB-style unique ID with prefix
16
+ * Format: [prefix 3 chars][8-char hex timestamp][16-char random hex]
17
+ * Total: 27 characters
18
+ *
19
+ * @example objectId({ prefix: 'usr' }) → 'usr507f1f77bcf86cd799439011'
20
+ */
21
+ export declare function objectId(args?: {
22
+ prefix?: string;
23
+ }): string;
24
+ /**
25
+ * Generate a standard UUID v4
26
+ */
27
+ export declare function uuid(): string;
@@ -0,0 +1,49 @@
1
+ type LogLevel = 'error' | 'warn' | 'info' | 'debug' | 'trace';
2
+ type LogData = Record<string, unknown> | unknown;
3
+ export interface LogHelper {
4
+ error: (description: string, data?: LogData) => void;
5
+ warn: (description: string, data?: LogData) => void;
6
+ info: (description: string, data?: LogData) => void;
7
+ debug: (description: string, data?: LogData) => void;
8
+ trace: (description: string, data?: LogData) => void;
9
+ isEnabled?: () => boolean;
10
+ setLevel?: (level: LogLevel) => void;
11
+ }
12
+ interface LogSettings {
13
+ enabled?: boolean;
14
+ minLevel?: LogLevel;
15
+ timestamps?: boolean;
16
+ }
17
+ export declare class Logger {
18
+ private settings;
19
+ private enabledInBrowser;
20
+ private context?;
21
+ private static hasShownHelp;
22
+ constructor(settings?: LogSettings, context?: string);
23
+ private getDefaultLevel;
24
+ private initBrowserLogging;
25
+ private shouldLog;
26
+ private formatTimestamp;
27
+ private formatISOTimestamp;
28
+ private redactSensitive;
29
+ private formatData;
30
+ private logToBrowser;
31
+ private logToNode;
32
+ private log;
33
+ error(description: string, data?: LogData): void;
34
+ warn(description: string, data?: LogData): void;
35
+ info(description: string, data?: LogData): void;
36
+ debug(description: string, data?: LogData): void;
37
+ trace(description: string, data?: LogData): void;
38
+ isEnabled(): boolean;
39
+ setLevel(level: LogLevel): void;
40
+ createContextLogger(context: string): LogHelper;
41
+ }
42
+ export declare function createLogger(context: string): Logger;
43
+ export declare const logger: Logger;
44
+ export declare const error: (description: string, data?: LogData) => void;
45
+ export declare const warn: (description: string, data?: LogData) => void;
46
+ export declare const info: (description: string, data?: LogData) => void;
47
+ export declare const debug: (description: string, data?: LogData) => void;
48
+ export declare const trace: (description: string, data?: LogData) => void;
49
+ export {};