@pagelines/sdk 1.0.388 → 1.0.389
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../widget/PLWidget.ts","../widget/composables/usePLWidget.ts","../widget/composables/useWidgetState.ts","../widget/ui/AgentWidgetPopup.vue","../agent/ui/ElAuthPanel.vue","../agent/ui/ElCreateAgent.vue","../agent/ui/ElProvisioningStatus.vue","../widget/ui/AgentWidgetOnboard.vue"],"sourcesContent":["import type { App, ComponentPublicInstance } from 'vue'\nimport type { AgentConfig } from '@pagelines/core'\nimport type { AgentChatController } from '../agent/AgentController'\nimport { PageLinesSDK } from '../sdkClient'\nimport sdkCSS from '../agent/ui/styles.css?inline'\nimport { createApp } from 'vue'\nimport { createLogger } from '@pagelines/core'\n\nexport type WidgetMode = 'inline' | 'button' | 'popup' | 'modal' | 'onboard'\nexport type ButtonIconPreset = 'phone' | 'calendar' | 'question' | 'message' | 'sparkles'\n\nexport interface WidgetConfig {\n el?: HTMLElement // Optional for modal/button modes (creates and appends to body for modal)\n mode: WidgetMode\n handle?: string\n agent?: AgentConfig\n context?: string\n firstMessage?: string\n buttonText?: string // Custom button text with template vars: {name}, {title}, {handle}, {orgName}\n buttonIcon?: ButtonIconPreset // Icon preset: phone | calendar | question | message | sparkles\n position?: 'bottom-right' | 'bottom-left' | 'top-right' | 'top-left' // Popup mode only\n chatOnly?: boolean // Skip full agent interface, show chat directly (for embedded chatbots)\n chatController?: AgentChatController // Optional external chat controller\n apiBase?: string\n onClose?: () => void // Callback when widget is closed (modal/popup/button modes)\n}\n\nexport interface WidgetUpdate {\n agent?: AgentConfig\n context?: string\n firstMessage?: string\n buttonText?: string\n buttonIcon?: ButtonIconPreset\n}\n\ntype WidgetInstance = {\n toggle?: () => void\n open?: () => void\n close?: () => void\n update?: (config: WidgetUpdate) => void\n} & ComponentPublicInstance\n\nconst logger = createLogger('PLWidget')\n\nexport class PLWidget {\n private app: App | null = null\n private shadowRoot: ShadowRoot | null = null\n private widgetInstance: WidgetInstance | null = null\n private config: WidgetConfig\n private sdk: PageLinesSDK\n private container: HTMLElement | null = null\n private static modalInstances = new Map<string, PLWidget>()\n\n /**\n * Auto-collect page context from the current document.\n * Returns a concise summary string the agent can use to understand\n * where the visitor is on the site.\n */\n static collectPageContext(): string {\n if (typeof window === 'undefined' || typeof document === 'undefined')\n return ''\n\n const parts: string[] = []\n\n const url = window.location.href\n if (url)\n parts.push(`Page URL: ${url}`)\n\n const title = document.title\n if (title)\n parts.push(`Page title: ${title}`)\n\n const metaDesc = document.querySelector('meta[name=\"description\"]')?.getAttribute('content')\n if (metaDesc)\n parts.push(`Page description: ${metaDesc}`)\n\n const ogTitle = document.querySelector('meta[property=\"og:title\"]')?.getAttribute('content')\n if (ogTitle && ogTitle !== title)\n parts.push(`OG title: ${ogTitle}`)\n\n const referrer = document.referrer\n if (referrer)\n parts.push(`Referrer: ${referrer}`)\n\n const path = window.location.pathname\n if (path && path !== '/')\n parts.push(`Path: ${path}`)\n\n return parts.join('\\n')\n }\n\n constructor(config: WidgetConfig) {\n // Auto-collect page context and merge with any manual context\n const autoContext = PLWidget.collectPageContext()\n const manualContext = config.context || ''\n const mergedContext = [autoContext, manualContext].filter(Boolean).join('\\n\\n')\n\n this.config = {\n ...config,\n context: mergedContext || undefined,\n }\n\n // Validate required config\n if (!config.mode)\n throw new Error('PLWidget: mode is required')\n if (!config.handle && !config.agent && config.mode !== 'onboard')\n throw new Error('PLWidget: either handle or agent is required')\n\n // For non-modal/button/onboard modes, el is required\n if (config.mode !== 'modal' && config.mode !== 'button' && config.mode !== 'onboard' && !config.el)\n throw new Error(`PLWidget: el (HTMLElement) is required for ${config.mode} mode`)\n\n // For modal/onboard mode, handle singleton pattern\n if (config.mode === 'modal' || config.mode === 'onboard') {\n const instanceKey = config.handle || config.agent?.agentId || 'default'\n const existing = PLWidget.modalInstances.get(instanceKey)\n if (existing) {\n logger.warn(`Destroying existing modal widget for: ${instanceKey}`)\n existing.destroy()\n }\n PLWidget.modalInstances.set(instanceKey, this)\n }\n\n // Create SDK instance (singleton)\n const isDev = typeof window !== 'undefined'\n ? window.location.hostname === 'localhost' || window.location.hostname.includes('127.0.0.1')\n : false\n\n this.sdk = PageLinesSDK.getInstance({\n isDev,\n ...(config.apiBase && { apiBase: config.apiBase }),\n })\n\n logger.info(`Initializing ${config.mode} mode for @${config.handle || config.agent?.handle} (isDev: ${isDev})`)\n\n this.init()\n }\n\n private async init() {\n // Button mode doesn't need shadow DOM - just set up click handler\n if (this.config.mode === 'button') {\n await this.mountMode(this.config.el!)\n return\n }\n\n // For modal/onboard mode, create container and append to body\n if (this.config.mode === 'modal' || this.config.mode === 'onboard') {\n this.container = document.createElement('div')\n this.container.id = `pagelines-modal-${this.config.handle || this.config.agent?.agentId || 'widget'}`\n // Position container to cover viewport for proper modal centering\n this.container.style.cssText = 'position: fixed; inset: 0; z-index: 9999;'\n document.body.appendChild(this.container)\n\n // Create shadow root in modal container\n this.shadowRoot = this.container.attachShadow({ mode: 'open' })\n }\n else {\n // For other modes, use provided element\n this.shadowRoot = this.config.el!.attachShadow({ mode: 'open' })\n }\n\n // Inject SDK CSS into shadow DOM\n const styleElement = document.createElement('style')\n styleElement.textContent = sdkCSS\n this.shadowRoot.appendChild(styleElement)\n\n // Create mount point\n const mountPoint = document.createElement('div')\n mountPoint.id = 'pagelines-widget-root'\n mountPoint.style.cssText = 'width: 100%; height: 100%;'\n this.shadowRoot.appendChild(mountPoint)\n\n // Import and mount mode-specific component\n await this.mountMode(mountPoint)\n }\n\n private async mountMode(mountPoint: HTMLElement) {\n const { mode } = this.config\n\n if (mode === 'inline') {\n const { default: AgentWidgetInline } = await import('./ui/AgentWidgetInline.vue')\n\n this.app = createApp(AgentWidgetInline, {\n sdk: this.sdk,\n handle: this.config.handle,\n agent: this.config.agent,\n context: this.config.context,\n firstMessage: this.config.firstMessage,\n buttonText: this.config.buttonText,\n buttonIcon: this.config.buttonIcon,\n chatOnly: this.config.chatOnly,\n })\n\n this.widgetInstance = this.app.mount(mountPoint) as WidgetInstance\n }\n else if (mode === 'button') {\n // Button mode - element is the button itself, no Vue component\n // Just set up click handler to open modal\n if (!this.config.el)\n throw new Error('PLWidget: el is required for button mode')\n\n const buttonEl = this.config.el\n buttonEl.style.cursor = 'pointer'\n\n const handleClick = () => {\n // Create modal widget on click\n new PLWidget({\n mode: 'modal',\n handle: this.config.handle,\n agent: this.config.agent,\n context: this.config.context,\n firstMessage: this.config.firstMessage,\n buttonText: this.config.buttonText,\n buttonIcon: this.config.buttonIcon,\n chatOnly: this.config.chatOnly,\n onClose: this.config.onClose,\n })\n }\n\n buttonEl.addEventListener('click', handleClick)\n\n // Store cleanup function\n this.destroy = () => {\n buttonEl.removeEventListener('click', handleClick)\n logger.info(`Button mode widget destroyed for handle: ${this.config.handle}`)\n }\n }\n else if (mode === 'popup') {\n const { default: AgentWidgetPopup } = await import('./ui/AgentWidgetPopup.vue')\n\n this.app = createApp(AgentWidgetPopup, {\n sdk: this.sdk,\n handle: this.config.handle,\n agent: this.config.agent,\n context: this.config.context,\n firstMessage: this.config.firstMessage,\n buttonText: this.config.buttonText,\n buttonIcon: this.config.buttonIcon,\n position: this.config.position || 'bottom-right',\n chatOnly: this.config.chatOnly,\n chatController: this.config.chatController,\n })\n\n this.widgetInstance = this.app.mount(mountPoint) as WidgetInstance\n }\n else if (mode === 'modal') {\n const { default: AgentWidgetModal } = await import('./ui/AgentWidgetModal.vue')\n\n this.app = createApp(AgentWidgetModal, {\n sdk: this.sdk,\n handle: this.config.handle,\n agent: this.config.agent,\n context: this.config.context,\n firstMessage: this.config.firstMessage,\n buttonText: this.config.buttonText,\n buttonIcon: this.config.buttonIcon,\n chatOnly: this.config.chatOnly,\n onClose: () => {\n // Call user's onClose callback if provided\n if (this.config.onClose) {\n this.config.onClose()\n }\n // Auto-destroy modal when closed\n this.destroy()\n },\n })\n\n this.widgetInstance = this.app.mount(mountPoint) as WidgetInstance\n }\n else if (mode === 'onboard') {\n const { default: AgentWidgetOnboard } = await import('./ui/AgentWidgetOnboard.vue')\n\n this.app = createApp(AgentWidgetOnboard, {\n sdk: this.sdk,\n onClose: () => {\n if (this.config.onClose) {\n this.config.onClose()\n }\n this.destroy()\n },\n })\n\n this.widgetInstance = this.app.mount(mountPoint) as WidgetInstance\n }\n else {\n throw new Error(`PLWidget: unsupported mode \"${mode}\"`)\n }\n }\n\n /**\n * Update widget with new configuration without re-mounting\n */\n update(updates: WidgetUpdate) {\n if (this.widgetInstance?.update) {\n this.widgetInstance.update(updates)\n logger.info(`Widget updated: ${Object.keys(updates).join(', ')}`)\n }\n else {\n logger.warn('Widget instance does not support update()')\n }\n }\n\n /**\n * Toggle widget visibility (popup mode only)\n */\n toggle() {\n if (this.widgetInstance?.toggle) {\n this.widgetInstance.toggle()\n }\n else {\n logger.warn('Widget mode does not support toggle()')\n }\n }\n\n /**\n * Open widget (popup mode only)\n */\n open() {\n if (this.widgetInstance?.open) {\n this.widgetInstance.open()\n }\n else {\n logger.warn('Widget mode does not support open()')\n }\n }\n\n /**\n * Close widget (popup mode only)\n */\n close() {\n if (this.widgetInstance?.close) {\n this.widgetInstance.close()\n }\n else {\n logger.warn('Widget mode does not support close()')\n }\n }\n\n /**\n * Destroy widget and cleanup\n */\n destroy() {\n if (this.app) {\n this.app.unmount()\n this.app = null\n }\n\n if (this.shadowRoot) {\n this.shadowRoot.innerHTML = ''\n this.shadowRoot = null\n }\n\n // For modal/onboard mode, remove container from body and remove from singleton map\n if (this.config.mode === 'modal' || this.config.mode === 'onboard') {\n if (this.container) {\n this.container.remove()\n this.container = null\n }\n\n const instanceKey = this.config.handle || this.config.agent?.agentId || 'default'\n PLWidget.modalInstances.delete(instanceKey)\n }\n\n this.widgetInstance = null\n\n logger.info(`Widget destroyed for handle: ${this.config.handle || this.config.agent?.handle}`)\n }\n}\n","import type { MaybeRef } from 'vue'\nimport type { AgentConfig } from '@pagelines/core'\nimport type { WidgetConfig, WidgetUpdate } from '../PLWidget'\nimport { computed, onUnmounted, ref, unref, watch } from 'vue'\nimport { PLWidget } from '../PLWidget'\n\nexport interface UsePLWidgetConfig {\n mode: WidgetConfig['mode']\n handle?: MaybeRef<string | undefined>\n agent?: MaybeRef<AgentConfig | null | undefined>\n context?: MaybeRef<string | undefined>\n firstMessage?: MaybeRef<string | undefined>\n apiBase?: string\n onClose?: () => void\n}\n\n/**\n * Composable for managing PLWidget lifecycle with automatic initialization,\n * reactive updates, and cleanup.\n *\n * Benefits:\n * - Eliminates manual DOM timing coordination (watch + nextTick)\n * - Automatic cleanup on unmount\n * - Reactive prop updates via widget.update()\n * - Prevents double initialization\n * - Clear loading/error states\n *\n * @example\n * ```vue\n * <script setup>\n * const agentRef = ref<Agent | null>(null)\n * const { containerRef, loading, error } = usePLWidget({\n * mode: 'inline',\n * agent: agentRef,\n * context: 'welcome'\n * })\n * </script>\n *\n * <template>\n * <div ref=\"containerRef\" class=\"w-full h-full\" />\n * </template>\n * ```\n */\nexport function usePLWidget(config: UsePLWidgetConfig) {\n const containerRef = ref<HTMLElement | null>(null)\n const widget = ref<InstanceType<typeof PLWidget> | null>(null)\n const loading = ref(true)\n const error = ref<string | null>(null)\n\n // Track if widget has been initialized to prevent double-init\n const initialized = ref(false)\n\n // Computed values for reactive tracking\n const currentHandle = computed(() => unref(config.handle))\n const currentAgent = computed(() => unref(config.agent))\n const currentContext = computed(() => unref(config.context))\n const currentFirstMessage = computed(() => unref(config.firstMessage))\n\n // Check if we have required data for initialization\n const hasRequiredData = computed(() => {\n if (config.mode === 'modal') {\n // Modal doesn't need container\n return !!(currentHandle.value || currentAgent.value)\n }\n // Inline/popup need container + (handle or agent)\n return !!(containerRef.value && (currentHandle.value || currentAgent.value))\n })\n\n // Initialize widget when container and data are ready\n watch([containerRef, currentAgent, currentHandle], async () => {\n // Skip if already initialized or missing required data\n if (initialized.value || !hasRequiredData.value) {\n return\n }\n\n loading.value = true\n error.value = null\n\n try {\n // Wait for next tick to ensure DOM is fully rendered\n await new Promise(resolve => setTimeout(resolve, 0))\n\n const widgetConfig: WidgetConfig = {\n mode: config.mode,\n handle: currentHandle.value,\n agent: currentAgent.value || undefined,\n context: currentContext.value,\n firstMessage: currentFirstMessage.value,\n apiBase: config.apiBase,\n onClose: config.onClose,\n }\n\n // Add container element for non-modal modes\n if (config.mode !== 'modal') {\n widgetConfig.el = containerRef.value!\n }\n\n widget.value = new PLWidget(widgetConfig)\n initialized.value = true\n } catch (err) {\n error.value = err instanceof Error ? err.message : 'Failed to initialize widget'\n console.error('[usePLWidget] Initialization error:', err)\n } finally {\n loading.value = false\n }\n }, { immediate: true })\n\n // Watch for prop changes and update widget reactively\n watch([currentAgent, currentContext, currentFirstMessage], () => {\n if (!widget.value || !initialized.value) {\n return\n }\n\n const updates: WidgetUpdate = {}\n if (currentAgent.value !== undefined) {\n updates.agent = currentAgent.value || undefined\n }\n if (currentContext.value !== undefined) {\n updates.context = currentContext.value\n }\n if (currentFirstMessage.value !== undefined) {\n updates.firstMessage = currentFirstMessage.value\n }\n\n if (Object.keys(updates).length > 0) {\n widget.value.update(updates)\n }\n })\n\n // Cleanup on unmount\n onUnmounted(() => {\n if (widget.value) {\n widget.value.destroy()\n widget.value = null\n }\n initialized.value = false\n })\n\n return {\n containerRef,\n widget,\n loading,\n error,\n }\n}\n","import type { AgentConfig } from '../../agent/schema'\nimport type { ButtonIconPreset, WidgetUpdate } from '../PLWidget'\nimport { ref } from 'vue'\n\nexport function useWidgetState(props: {\n agent?: AgentConfig\n context?: string\n firstMessage?: string\n buttonText?: string\n buttonIcon?: ButtonIconPreset\n}) {\n const currentAgent = ref<AgentConfig | undefined>(props.agent)\n const currentContext = ref<string | undefined>(props.context)\n const currentFirstMessage = ref<string | undefined>(props.firstMessage)\n const currentButtonText = ref<string | undefined>(props.buttonText)\n const currentButtonIcon = ref<ButtonIconPreset | undefined>(props.buttonIcon)\n\n function update(updates: WidgetUpdate) {\n if (updates.agent !== undefined)\n currentAgent.value = updates.agent\n if (updates.context !== undefined)\n currentContext.value = updates.context\n if (updates.firstMessage !== undefined)\n currentFirstMessage.value = updates.firstMessage\n if (updates.buttonText !== undefined)\n currentButtonText.value = updates.buttonText\n if (updates.buttonIcon !== undefined)\n currentButtonIcon.value = updates.buttonIcon\n }\n\n return { currentAgent, currentContext, currentFirstMessage, currentButtonText, currentButtonIcon, update }\n}\n","<script setup lang=\"ts\">\nimport type { AgentChatController } from '../../agent/AgentController'\nimport type { PageLinesSDK } from '../../sdkClient'\nimport type { AgentConfig } from '../../agent/schema'\nimport type { Agent } from '../../agent/schema'\nimport { computed, ref, shallowRef, watch } from 'vue'\nimport { getAgentAvatarUrl } from '../../agent/utils'\nimport { AgentChatController as Controller } from '../../agent/AgentController'\nimport AgentWrap from '../../agent/ui/AgentWrap.vue'\nimport ElAgentChat from '../../agent/ui/ElAgentChat.vue'\nimport { useWidgetState } from '../composables/useWidgetState'\n\nconst props = defineProps<{\n sdk?: PageLinesSDK\n handle?: string\n agent?: AgentConfig\n context?: string\n firstMessage?: string\n position?: 'bottom-right' | 'bottom-left' | 'top-right' | 'top-left'\n chatController?: AgentChatController\n}>()\n\nconst isOpen = ref(false)\nconst hasOpened = ref(false)\nconst internalController = shallowRef<AgentChatController>()\n\nconst { currentAgent, currentContext, currentFirstMessage, update } = useWidgetState(props)\n\nconst positionClasses = computed(() => {\n const map = {\n 'bottom-left': 'bottom-4 left-4 sm:bottom-6 sm:left-6',\n 'top-right': 'top-4 right-4 sm:top-6 sm:right-6',\n 'top-left': 'top-4 left-4 sm:top-6 sm:left-6',\n 'bottom-right': 'bottom-4 right-4 sm:bottom-6 sm:right-6',\n }\n return map[props.position || 'bottom-right']\n})\n\nconst transformOrigin = computed(() => {\n const map = {\n 'bottom-left': 'bottom left',\n 'top-right': 'top right',\n 'top-left': 'top left',\n 'bottom-right': 'bottom right',\n }\n return map[props.position || 'bottom-right']\n})\n\nfunction initController(agent: Agent, sdk: PageLinesSDK) {\n if (props.chatController || internalController.value) return\n\n internalController.value = new Controller({\n sdk,\n agent: agent.toConfig(),\n context: currentContext.value,\n firstMessage: currentFirstMessage.value,\n })\n}\n\n// Lazy connection: start conversation on first open\nwatch(isOpen, (open) => {\n if (open && !hasOpened.value) {\n hasOpened.value = true\n const ctrl = props.chatController || internalController.value\n if (ctrl) {\n void ctrl.startTextConversation()\n }\n }\n})\n\nfunction toggle() {\n isOpen.value = !isOpen.value\n}\n\nfunction open() {\n isOpen.value = true\n}\n\nfunction close() {\n isOpen.value = false\n}\n\ndefineExpose({ toggle, open, close, update })\n</script>\n\n<template>\n <AgentWrap\n v-slot=\"{ agent, sdk: resolvedSdk }\"\n :sdk=\"sdk\"\n :handle=\"handle\"\n :agent=\"currentAgent\"\n :context=\"currentContext\"\n :first-message=\"currentFirstMessage\"\n >\n <div\n v-if=\"agent\"\n :ref=\"() => initController(agent, resolvedSdk)\"\n class=\"fixed z-[999999] pointer-events-auto\"\n :class=\"positionClasses\"\n >\n <!-- Widget container: animates size/radius/shadow -->\n <div\n class=\"widget-container transform-gpu overflow-hidden\"\n :class=\"isOpen\n ? 'w-[min(400px,calc(100vw-2rem))] h-[min(600px,calc(100vh-4rem))] shadow-[0_24px_80px_-12px_rgba(0,0,0,0.2),0_8px_24px_-8px_rgba(0,0,0,0.08)]'\n : 'w-16 h-16 shadow-[0_8px_32px_-4px_rgba(0,0,0,0.15)] cursor-pointer'\"\n :style=\"{ 'border-radius': isOpen ? '16px' : '32px', 'transform-origin': transformOrigin }\"\n @click=\"!isOpen ? toggle() : undefined\"\n >\n <!-- Bubble (cross-fade: always in DOM) -->\n <div\n class=\"absolute inset-0 transition-opacity duration-200\"\n :class=\"isOpen ? 'opacity-0 pointer-events-none' : 'opacity-100'\"\n >\n <div class=\"relative h-full w-full rounded-full overflow-hidden\">\n <img\n :src=\"getAgentAvatarUrl(agent.toConfig())\"\n :alt=\"`${agent.name.value} agent`\"\n class=\"h-full w-full object-cover pointer-events-none\"\n width=\"64\"\n height=\"64\"\n />\n <div class=\"absolute inset-0 pointer-events-none bg-gradient-to-br from-transparent via-black/10 to-black/40 opacity-60\" />\n </div>\n </div>\n\n <!-- Panel (cross-fade: always in DOM) -->\n <div\n class=\"absolute inset-0 flex flex-col bg-white transition-opacity duration-250\"\n :class=\"isOpen ? 'opacity-100' : 'opacity-0 pointer-events-none'\"\n >\n <!-- Header -->\n <div class=\"flex items-center shrink-0 border-b border-theme-100 px-4 py-3\">\n <div class=\"flex items-center gap-3 flex-1 min-w-0\">\n <img\n :src=\"agent.avatarUrl.value\"\n :alt=\"agent.name.value\"\n class=\"size-8 rounded-full object-cover shrink-0\"\n />\n <div class=\"min-w-0\">\n <div class=\"text-sm font-medium text-theme-900 truncate\">{{ agent.displayName.value }}</div>\n <div class=\"text-[11px]\" :class=\"agent.desiredStatus.value === 'active' ? 'text-green-500' : 'text-theme-400'\">\n {{ agent.desiredStatus.value === 'active' ? 'Online' : 'Offline' }}\n </div>\n </div>\n </div>\n <button\n class=\"cursor-pointer flex items-center justify-center p-2 -mr-1 rounded-xl text-theme-400 hover:text-theme-600 hover:bg-theme-50 transition-colors\"\n @click.stop=\"close\"\n >\n <i class=\"size-5 i-tabler-x\" />\n </button>\n </div>\n\n <!-- Chat -->\n <div class=\"flex-1 overflow-hidden\">\n <ElAgentChat\n v-if=\"hasOpened\"\n :chat-controller=\"chatController || internalController\"\n :agent=\"agent\"\n variant=\"light\"\n scale=\"md\"\n setup-hint=\"\"\n empty-state-message=\"Send a message to get started\"\n />\n </div>\n\n <!-- Footer -->\n <div class=\"shrink-0 flex items-center justify-center border-t border-theme-100 py-1.5\">\n <a\n href=\"https://www.pagelines.com\"\n target=\"_blank\"\n rel=\"noopener\"\n class=\"text-[10px] text-theme-300 hover:text-theme-400 transition-colors\"\n >\n AI Agent™ by PageLines\n </a>\n </div>\n </div>\n </div>\n\n <!-- Online indicator (outside overflow-hidden so ping isn't clipped) -->\n <div\n v-if=\"agent.desiredStatus.value === 'active'\"\n class=\"absolute top-[5%] right-[5%] transition-opacity duration-200 pointer-events-none\"\n :class=\"isOpen ? 'opacity-0' : 'opacity-100'\"\n >\n <div class=\"size-3 bg-green-500 rounded-full ring-2 ring-white absolute animate-ping\" style=\"animation-duration: 5s;\" />\n <div class=\"size-3 bg-green-500 rounded-full ring-2 ring-white\" />\n </div>\n </div>\n </AgentWrap>\n</template>\n\n<style scoped>\n.widget-container {\n transition: width 0.4s cubic-bezier(0.32, 0.72, 0, 1),\n height 0.4s cubic-bezier(0.32, 0.72, 0, 1),\n border-radius 0.4s cubic-bezier(0.32, 0.72, 0, 1),\n box-shadow 0.4s cubic-bezier(0.32, 0.72, 0, 1);\n}\n</style>\n","<script setup lang=\"ts\">\nimport type { PageLinesSDK } from '../../sdkClient'\nimport { ref } from 'vue'\nimport ElAgentButton from './ElAgentButton.vue'\nimport AgentInputEmail from './AgentInputEmail.vue'\nimport AgentInputOneTimeCode from './AgentInputOneTimeCode.vue'\n\nconst { sdk } = defineProps<{ sdk: PageLinesSDK }>()\n\nconst showEmail = ref(false)\nconst emailStep = ref<'email' | 'code'>('email')\nconst form = ref({ email: '', code: '' })\nconst isSubmitting = ref(false)\n\nfunction signInWithGoogle() {\n sdk.error.value = null\n sdk.auth.loginWithGoogle({\n onError: (error) => {\n sdk.error.value = error\n },\n })\n}\n\nasync function sendCode() {\n if (isSubmitting.value) return\n isSubmitting.value = true\n sdk.error.value = null\n try {\n const success = await sdk.auth.requestAuthCode({ email: form.value.email })\n if (success) emailStep.value = 'code'\n }\n finally {\n isSubmitting.value = false\n }\n}\n\nasync function verifyCode() {\n if (isSubmitting.value) return\n isSubmitting.value = true\n sdk.error.value = null\n try {\n await sdk.auth.loginWithCode({ email: form.value.email, code: form.value.code })\n }\n finally {\n isSubmitting.value = false\n }\n}\n</script>\n\n<template>\n <div data-test=\"auth-panel\" class=\"flex flex-col justify-end h-full px-5 pb-8 pt-6\">\n <!-- Top area — conversational prompt -->\n <div class=\"flex-1 flex flex-col justify-center\">\n <div class=\"space-y-3 mb-10\">\n <h3 class=\"text-2xl font-light text-theme-900 leading-snug\">\n Your AI assistant,<br />ready in two minutes.\n </h3>\n <p class=\"text-sm text-theme-400 leading-relaxed max-w-[260px]\">\n Sign in to create and deploy a personal AI that works for you.\n </p>\n </div>\n\n <p\n v-if=\"sdk.error.value\"\n class=\"text-xs text-red-500 mb-4\"\n >\n {{ sdk.error.value }}\n </p>\n </div>\n\n <!-- Bottom area — actions -->\n <div class=\"space-y-3\">\n <!-- Google button -->\n <button\n data-test=\"google-auth-btn\"\n class=\"w-full flex items-center justify-center gap-3 px-5 py-3.5 rounded-xl border border-theme-200 bg-theme-0 text-theme-800 font-medium text-sm transition-all duration-150 hover:border-theme-300 hover:bg-theme-25 active:scale-[0.98] cursor-pointer\"\n @click=\"signInWithGoogle\"\n >\n <svg class=\"size-[18px]\" viewBox=\"0 0 24 24\">\n <path d=\"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92a5.06 5.06 0 0 1-2.2 3.32v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.1z\" fill=\"#4285F4\" />\n <path d=\"M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z\" fill=\"#34A853\" />\n <path d=\"M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z\" fill=\"#FBBC05\" />\n <path d=\"M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z\" fill=\"#EA4335\" />\n </svg>\n Continue with Google\n </button>\n\n <!-- Divider -->\n <div class=\"flex items-center gap-3 py-1\">\n <div class=\"flex-1 h-px bg-theme-100\" />\n <span class=\"text-[11px] text-theme-300 uppercase tracking-widest\">or</span>\n <div class=\"flex-1 h-px bg-theme-100\" />\n </div>\n\n <!-- Email flow -->\n <div v-if=\"!showEmail\">\n <button\n data-test=\"email-auth-link\"\n class=\"w-full px-5 py-3 rounded-xl border border-theme-100 text-sm text-theme-500 transition-all duration-150 hover:border-theme-200 hover:text-theme-700 cursor-pointer\"\n @click=\"showEmail = true\"\n >\n Use email instead\n </button>\n </div>\n\n <!-- Email input step -->\n <div v-if=\"showEmail && emailStep === 'email'\" class=\"space-y-3\">\n <AgentInputEmail\n v-model=\"form.email\"\n data-test=\"auth-email-input\"\n @keyup.enter=\"sendCode\"\n />\n <ElAgentButton\n data-test=\"auth-send-code\"\n theme=\"primary\"\n size=\"md\"\n class=\"w-full\"\n :loading=\"isSubmitting\"\n :disabled=\"!form.email || isSubmitting\"\n @click=\"sendCode\"\n >\n Send verification code\n </ElAgentButton>\n </div>\n\n <!-- Code verification step -->\n <div v-if=\"showEmail && emailStep === 'code'\" class=\"space-y-3\">\n <p class=\"text-xs text-theme-400\">\n Code sent to {{ form.email }}\n </p>\n <AgentInputOneTimeCode\n v-model=\"form.code\"\n :length=\"6\"\n :focus-first=\"true\"\n data-test=\"auth-code-input\"\n @auto-submit=\"verifyCode\"\n />\n <ElAgentButton\n data-test=\"auth-verify-code\"\n theme=\"primary\"\n size=\"md\"\n class=\"w-full\"\n :loading=\"isSubmitting\"\n :disabled=\"form.code.length !== 6 || isSubmitting\"\n @click=\"verifyCode\"\n >\n Verify\n </ElAgentButton>\n <button\n class=\"w-full text-xs text-theme-300 hover:text-theme-500 transition-colors py-1 cursor-pointer\"\n @click=\"emailStep = 'email'\"\n >\n Use a different email\n </button>\n </div>\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport type { AgentConfig } from '@pagelines/core'\nimport type { PageLinesSDK } from '../../sdkClient'\nimport { ref } from 'vue'\n\nconst { sdk } = defineProps<{ sdk: PageLinesSDK }>()\nconst emit = defineEmits<{ created: [agent: AgentConfig] }>()\n\nconst name = ref('')\nconst isSubmitting = ref(false)\nconst error = ref<string | null>(null)\n\nasync function createAgent() {\n if (isSubmitting.value || !name.value.trim()) return\n isSubmitting.value = true\n error.value = null\n\n try {\n const agent = await sdk.agent.create({ name: name.value.trim() })\n emit('created', agent)\n }\n catch (err) {\n error.value = err instanceof Error ? err.message : 'Failed to create agent'\n }\n finally {\n isSubmitting.value = false\n }\n}\n</script>\n\n<template>\n <div data-test=\"create-panel\" class=\"flex flex-col justify-end h-full px-5 pb-8 pt-6\">\n <div class=\"flex-1 flex flex-col justify-center\">\n <div class=\"space-y-3 mb-10\">\n <h3 class=\"text-2xl font-light text-theme-900 leading-snug\">\n What should we call<br />your assistant?\n </h3>\n <p class=\"text-sm text-theme-400 leading-relaxed max-w-[260px]\">\n Pick a name. You can change it later.\n </p>\n </div>\n\n <p v-if=\"error\" class=\"text-xs text-red-500 mb-4\">\n {{ error }}\n </p>\n </div>\n\n <div class=\"space-y-3\">\n <input\n v-model=\"name\"\n data-test=\"agent-name-input\"\n type=\"text\"\n placeholder=\"e.g. Alex, Casey, Jordan\"\n class=\"w-full px-4 py-3 text-theme-900 placeholder-theme-300 bg-theme-0 border border-theme-200 rounded-xl focus:outline-none focus:border-primary-400 transition-colors\"\n style=\"font-size: 16px\"\n @keyup.enter=\"createAgent\"\n />\n\n <button\n data-test=\"agent-create-btn\"\n class=\"w-full px-5 py-3.5 rounded-xl bg-primary-600 text-white text-sm font-medium transition-all duration-150 hover:bg-primary-500 active:scale-[0.98] disabled:opacity-50 disabled:cursor-not-allowed cursor-pointer\"\n :disabled=\"!name.trim() || isSubmitting\"\n @click=\"createAgent\"\n >\n {{ isSubmitting ? 'Creating...' : 'Create assistant' }}\n </button>\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport type { PageLinesSDK } from '../../sdkClient'\nimport { onMounted, ref } from 'vue'\n\nconst props = defineProps<{\n sdk: PageLinesSDK\n agentId: string\n}>()\n\nconst emit = defineEmits<{\n ready: []\n error: [message: string]\n}>()\n\nconst statusMessage = ref('Deploying your server...')\nconst hasError = ref(false)\nconst errorMessage = ref('')\n\nasync function startPolling() {\n hasError.value = false\n errorMessage.value = ''\n\n try {\n await props.sdk.agent.waitUntilReady({\n agentId: props.agentId,\n onStatus: (msg) => {\n statusMessage.value = msg\n },\n })\n emit('ready')\n }\n catch (err) {\n hasError.value = true\n errorMessage.value = err instanceof Error ? err.message : 'Something went wrong'\n emit('error', errorMessage.value)\n }\n}\n\nonMounted(() => {\n startPolling()\n})\n</script>\n\n<template>\n <div data-test=\"provisioning-panel\" class=\"flex flex-col items-center justify-center h-full p-6\">\n <div class=\"w-full max-w-xs space-y-6 text-center\">\n <template v-if=\"!hasError\">\n <div class=\"flex justify-center\">\n <div class=\"animate-spin rounded-full size-6 border-2 border-theme-200 border-t-primary-500\" />\n </div>\n <p class=\"text-sm text-theme-500\">\n {{ statusMessage }}\n </p>\n </template>\n\n <template v-else>\n <p class=\"text-sm text-red-500\">\n {{ errorMessage }}\n </p>\n <button\n data-test=\"provision-retry-btn\"\n class=\"px-6 py-2.5 rounded-lg bg-primary-600 text-white text-sm font-medium hover:bg-primary-500 transition-colors cursor-pointer\"\n @click=\"startPolling\"\n >\n Try Again\n </button>\n </template>\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport type { AgentConfig } from '@pagelines/core'\nimport type { PageLinesSDK } from '../../sdkClient'\nimport { computed, ref, shallowRef, watch } from 'vue'\nimport { Agent } from '../../agent/schema'\nimport { AgentChatController } from '../../agent/AgentController'\nimport { resolveApiBase } from '../../api'\nimport { PageLinesSDK as PageLinesSDKClass } from '../../sdkClient'\nimport ElAgentChat from '../../agent/ui/ElAgentChat.vue'\nimport ElAuthPanel from '../../agent/ui/ElAuthPanel.vue'\nimport ElCreateAgent from '../../agent/ui/ElCreateAgent.vue'\nimport ElProvisioningStatus from '../../agent/ui/ElProvisioningStatus.vue'\n\nconst props = defineProps<{\n sdk?: PageLinesSDK\n onClose?: () => void\n}>()\n\n// SDK singleton\nconst sdk = props.sdk || PageLinesSDKClass.getInstance({\n isDev: typeof window !== 'undefined'\n ? window.location.hostname === 'localhost' || window.location.hostname.includes('127.0.0.1')\n : false,\n})\n\n// Local state\nconst createdAgent = shallowRef<AgentConfig | undefined>()\nconst botReady = ref(false)\nconst provisionError = ref<string | undefined>()\n// True when user just created an agent in this session (needs provisioning gate)\nconst isNewAgent = ref(false)\n\n// Derive current agent from SDK state or local creation\nconst agent = computed(() => {\n if (createdAgent.value) return createdAgent.value\n const user = sdk.activeUser.value\n if (!user?.agents?.length) return undefined\n const primaryId = user.primaryAgentId\n return user.agents.find(a => a.agentId === primaryId) || user.agents[0]\n})\n\n// Agent wrapper for AgentChat — stable ref, only created once per agent\nconst agentInstance = shallowRef<Agent | undefined>()\nconst chatControllerRef = shallowRef<AgentChatController | undefined>()\n\n// Create Agent + Controller only when agentId changes (not on every reactivity tick)\nwatch(() => agent.value?.agentId, (agentId) => {\n if (!agentId || !agent.value) {\n agentInstance.value = undefined\n chatControllerRef.value = undefined\n return\n }\n\n const agentObj = new Agent({ config: agent.value })\n agentInstance.value = agentObj\n\n chatControllerRef.value = new AgentChatController({\n sdk,\n agent: agentObj,\n chatStreamFn: async (args) => {\n await sdk.chat.chatStreamAuthenticated({\n agentId: agentId!,\n message: args.message,\n attachments: args.attachments,\n conversationId: args.conversationId,\n history: args.history,\n onDelta: args.onDelta,\n onDone: args.onDone,\n onError: args.onError,\n onStatus: args.onStatus,\n })\n },\n })\n}, { immediate: true })\n\n// Derive mode from state\n// Key insight: existing agents go straight to chat (auto-wake handles bot startup).\n// Only newly created agents go through the provisioning gate.\nconst mode = computed<'auth' | 'create' | 'provisioning' | 'error' | 'chat'>(() => {\n if (!sdk.token.value) return 'auth'\n if (!agent.value) return 'create'\n // Only gate on provisioning for agents created in this session\n if (isNewAgent.value) {\n if (provisionError.value) return 'error'\n if (!botReady.value) return 'provisioning'\n }\n return 'chat'\n})\n\n// Dashboard URL\nconst dashboardUrl = computed(() => {\n const base = resolveApiBase(sdk.apiBase, sdk.isDev)\n return `${base}/dashboard`\n})\n\n// Event handlers\nfunction onAgentCreated(agentConfig: AgentConfig) {\n createdAgent.value = agentConfig\n provisionError.value = undefined\n botReady.value = false\n isNewAgent.value = true\n}\n\nfunction onProvisionReady() {\n botReady.value = true\n}\n\nfunction onProvisionError(msg: string) {\n provisionError.value = msg\n}\n\nfunction onRetry() {\n provisionError.value = undefined\n botReady.value = false\n}\n\n// No initial status check needed for existing agents —\n// AgentChat's auto-wake handles starting stopped bots.\n// Provisioning gate only applies to newly created agents (isNewAgent).\n</script>\n\n<template>\n <div\n class=\"size-full flex flex-col bg-theme-0\"\n data-test=\"onboard-widget\"\n :data-test-state=\"mode\"\n >\n <!-- Header -->\n <div class=\"flex items-center justify-between px-4 py-3 border-b border-theme-100\">\n <span class=\"text-sm font-medium text-theme-800\">\n {{ agent?.name || 'PageLines' }}\n </span>\n <button\n v-if=\"props.onClose\"\n class=\"text-theme-400 hover:text-theme-600 transition-colors cursor-pointer\"\n @click=\"props.onClose?.()\"\n >\n <svg xmlns=\"http://www.w3.org/2000/svg\" class=\"size-5\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\n <path fill-rule=\"evenodd\" d=\"M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z\" clip-rule=\"evenodd\" />\n </svg>\n </button>\n </div>\n\n <!-- Content area -->\n <div class=\"flex-1 overflow-hidden\">\n <ElAuthPanel v-if=\"mode === 'auth'\" :sdk=\"sdk\" />\n <ElCreateAgent v-if=\"mode === 'create'\" :sdk=\"sdk\" @created=\"onAgentCreated\" />\n <ElProvisioningStatus\n v-if=\"mode === 'provisioning' && agent\"\n :sdk=\"sdk\"\n :agent-id=\"agent.agentId || ''\"\n @ready=\"onProvisionReady\"\n @error=\"onProvisionError\"\n />\n <ElAgentChat\n v-if=\"mode === 'chat' && agentInstance && chatControllerRef\"\n :chat-controller=\"chatControllerRef\"\n :agent=\"agentInstance\"\n variant=\"light\"\n class=\"size-full\"\n />\n\n <!-- Error recovery -->\n <div v-if=\"mode === 'error'\" class=\"flex flex-col items-center justify-center h-full p-6\">\n <div class=\"w-full max-w-xs space-y-6 text-center\">\n <p class=\"text-sm text-red-500\">\n {{ provisionError }}\n </p>\n <button\n class=\"px-6 py-2.5 rounded-lg bg-primary-600 text-white text-sm font-medium hover:bg-primary-500 transition-colors cursor-pointer\"\n @click=\"onRetry\"\n >\n Try Again\n </button>\n </div>\n </div>\n </div>\n\n <!-- Dashboard CTA (chat mode) -->\n <div v-if=\"mode === 'chat'\" class=\"border-t border-theme-100 px-4 py-2 text-center\">\n <a\n :href=\"dashboardUrl\"\n target=\"_blank\"\n class=\"text-xs text-theme-400 hover:text-primary-600 transition-colors\"\n >\n Go to Dashboard →\n </a>\n </div>\n </div>\n</template>\n"],"names":["logger","createLogger","_PLWidget","config","__publicField","autoContext","manualContext","mergedContext","instanceKey","existing","isDev","PageLinesSDK","parts","url","title","metaDesc","ogTitle","referrer","path","styleElement","sdkCSS","mountPoint","mode","AgentWidgetInline","createApp","buttonEl","handleClick","__name","AgentWidgetPopup","AgentWidgetPopup$1","AgentWidgetModal","AgentWidgetOnboard","updates","PLWidget","usePLWidget","containerRef","ref","widget","loading","error","initialized","currentHandle","computed","unref","currentAgent","currentContext","currentFirstMessage","hasRequiredData","watch","resolve","widgetConfig","err","onUnmounted","useWidgetState","props","currentButtonText","currentButtonIcon","update","__props","isOpen","hasOpened","internalController","shallowRef","positionClasses","transformOrigin","initController","agent","sdk","Controller","open","ctrl","toggle","close","__expose","_createBlock","AgentWrap","_unref","resolvedSdk","_createElementBlock","_normalizeClass","_createElementVNode","_normalizeStyle","_cache","$event","_hoisted_1","getAgentAvatarUrl","_hoisted_3","_hoisted_4","_hoisted_6","_hoisted_7","_toDisplayString","_hoisted_8","ElAgentChat","showEmail","emailStep","form","isSubmitting","signInWithGoogle","sendCode","verifyCode","_openBlock","_hoisted_2","_hoisted_5","_createVNode","AgentInputEmail","ElAgentButton","AgentInputOneTimeCode","emit","__emit","name","createAgent","statusMessage","hasError","errorMessage","startPolling","msg","onMounted","_Fragment","PageLinesSDKClass","createdAgent","botReady","provisionError","isNewAgent","user","primaryId","a","agentInstance","chatControllerRef","agentId","agentObj","Agent","AgentChatController","args","dashboardUrl","resolveApiBase","onAgentCreated","agentConfig","onProvisionReady","onProvisionError","onRetry","ElAuthPanel","ElCreateAgent","ElProvisioningStatus","_hoisted_9"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../widget/PLWidget.ts","../widget/composables/usePLWidget.ts","../widget/composables/useWidgetState.ts","../widget/ui/AgentWidgetPopup.vue","../agent/ui/ElAuthPanel.vue","../agent/ui/ElCreateAgent.vue","../agent/ui/ElProvisioningStatus.vue","../widget/ui/AgentWidgetOnboard.vue"],"sourcesContent":["import type { App, ComponentPublicInstance } from 'vue'\nimport type { AgentConfig } from '@pagelines/core'\nimport type { AgentChatController } from '../agent/AgentController'\nimport { PageLinesSDK } from '../sdkClient'\nimport sdkCSS from '../agent/ui/styles.css?inline'\nimport { createApp } from 'vue'\nimport { createLogger } from '@pagelines/core'\n\nexport type WidgetMode = 'inline' | 'button' | 'popup' | 'modal' | 'onboard'\nexport type ButtonIconPreset = 'phone' | 'calendar' | 'question' | 'message' | 'sparkles'\n\nexport interface WidgetConfig {\n el?: HTMLElement // Optional for modal/button modes (creates and appends to body for modal)\n mode: WidgetMode\n handle?: string\n agent?: AgentConfig\n context?: string\n firstMessage?: string\n buttonText?: string // Custom button text with template vars: {name}, {title}, {handle}, {orgName}\n buttonIcon?: ButtonIconPreset // Icon preset: phone | calendar | question | message | sparkles\n position?: 'bottom-right' | 'bottom-left' | 'top-right' | 'top-left' // Popup mode only\n chatOnly?: boolean // Skip full agent interface, show chat directly (for embedded chatbots)\n chatController?: AgentChatController // Optional external chat controller\n apiBase?: string\n onClose?: () => void // Callback when widget is closed (modal/popup/button modes)\n}\n\nexport interface WidgetUpdate {\n agent?: AgentConfig\n context?: string\n firstMessage?: string\n buttonText?: string\n buttonIcon?: ButtonIconPreset\n}\n\ntype WidgetInstance = {\n toggle?: () => void\n open?: () => void\n close?: () => void\n update?: (config: WidgetUpdate) => void\n} & ComponentPublicInstance\n\nconst logger = createLogger('PLWidget')\n\nexport class PLWidget {\n private app: App | null = null\n private shadowRoot: ShadowRoot | null = null\n private widgetInstance: WidgetInstance | null = null\n private config: WidgetConfig\n private sdk: PageLinesSDK\n private container: HTMLElement | null = null\n private static modalInstances = new Map<string, PLWidget>()\n\n /**\n * Auto-collect page context from the current document.\n * Returns a concise summary string the agent can use to understand\n * where the visitor is on the site.\n */\n static collectPageContext(): string {\n if (typeof window === 'undefined' || typeof document === 'undefined')\n return ''\n\n const parts: string[] = []\n\n const url = window.location.href\n if (url)\n parts.push(`Page URL: ${url}`)\n\n const title = document.title\n if (title)\n parts.push(`Page title: ${title}`)\n\n const metaDesc = document.querySelector('meta[name=\"description\"]')?.getAttribute('content')\n if (metaDesc)\n parts.push(`Page description: ${metaDesc}`)\n\n const ogTitle = document.querySelector('meta[property=\"og:title\"]')?.getAttribute('content')\n if (ogTitle && ogTitle !== title)\n parts.push(`OG title: ${ogTitle}`)\n\n const referrer = document.referrer\n if (referrer)\n parts.push(`Referrer: ${referrer}`)\n\n const path = window.location.pathname\n if (path && path !== '/')\n parts.push(`Path: ${path}`)\n\n return parts.join('\\n')\n }\n\n constructor(config: WidgetConfig) {\n // Auto-collect page context and merge with any manual context\n const autoContext = PLWidget.collectPageContext()\n const manualContext = config.context || ''\n const mergedContext = [autoContext, manualContext].filter(Boolean).join('\\n\\n')\n\n this.config = {\n ...config,\n context: mergedContext || undefined,\n }\n\n // Validate required config\n if (!config.mode)\n throw new Error('PLWidget: mode is required')\n if (!config.handle && !config.agent && config.mode !== 'onboard')\n throw new Error('PLWidget: either handle or agent is required')\n\n // For non-modal/button/onboard modes, el is required\n if (config.mode !== 'modal' && config.mode !== 'button' && config.mode !== 'onboard' && !config.el)\n throw new Error(`PLWidget: el (HTMLElement) is required for ${config.mode} mode`)\n\n // For modal/onboard mode, handle singleton pattern\n if (config.mode === 'modal' || config.mode === 'onboard') {\n const instanceKey = config.handle || config.agent?.agentId || 'default'\n const existing = PLWidget.modalInstances.get(instanceKey)\n if (existing) {\n logger.warn(`Destroying existing modal widget for: ${instanceKey}`)\n existing.destroy()\n }\n PLWidget.modalInstances.set(instanceKey, this)\n }\n\n // Create SDK instance (singleton)\n const isDev = typeof window !== 'undefined'\n ? window.location.hostname === 'localhost' || window.location.hostname.includes('127.0.0.1')\n : false\n\n this.sdk = PageLinesSDK.getInstance({\n isDev,\n ...(config.apiBase && { apiBase: config.apiBase }),\n })\n\n logger.info(`Initializing ${config.mode} mode for @${config.handle || config.agent?.handle} (isDev: ${isDev})`)\n\n this.init()\n }\n\n private async init() {\n // Button mode doesn't need shadow DOM - just set up click handler\n if (this.config.mode === 'button') {\n await this.mountMode(this.config.el!)\n return\n }\n\n // For modal/onboard mode, create container and append to body\n if (this.config.mode === 'modal' || this.config.mode === 'onboard') {\n this.container = document.createElement('div')\n this.container.id = `pagelines-modal-${this.config.handle || this.config.agent?.agentId || 'widget'}`\n // Position container to cover viewport for proper modal centering\n this.container.style.cssText = 'position: fixed; inset: 0; z-index: 9999;'\n document.body.appendChild(this.container)\n\n // Create shadow root in modal container\n this.shadowRoot = this.container.attachShadow({ mode: 'open' })\n }\n else {\n // For other modes, use provided element\n this.shadowRoot = this.config.el!.attachShadow({ mode: 'open' })\n }\n\n // Inject SDK CSS into shadow DOM\n const styleElement = document.createElement('style')\n styleElement.textContent = sdkCSS\n this.shadowRoot.appendChild(styleElement)\n\n // Create mount point\n const mountPoint = document.createElement('div')\n mountPoint.id = 'pagelines-widget-root'\n mountPoint.style.cssText = 'width: 100%; height: 100%;'\n this.shadowRoot.appendChild(mountPoint)\n\n // Import and mount mode-specific component\n await this.mountMode(mountPoint)\n }\n\n private async mountMode(mountPoint: HTMLElement) {\n const { mode } = this.config\n\n if (mode === 'inline') {\n const { default: AgentWidgetInline } = await import('./ui/AgentWidgetInline.vue')\n\n this.app = createApp(AgentWidgetInline, {\n sdk: this.sdk,\n handle: this.config.handle,\n agent: this.config.agent,\n context: this.config.context,\n firstMessage: this.config.firstMessage,\n buttonText: this.config.buttonText,\n buttonIcon: this.config.buttonIcon,\n chatOnly: this.config.chatOnly,\n })\n\n this.widgetInstance = this.app.mount(mountPoint) as WidgetInstance\n }\n else if (mode === 'button') {\n // Button mode - element is the button itself, no Vue component\n // Just set up click handler to open modal\n if (!this.config.el)\n throw new Error('PLWidget: el is required for button mode')\n\n const buttonEl = this.config.el\n buttonEl.style.cursor = 'pointer'\n\n const handleClick = () => {\n // Create modal widget on click\n new PLWidget({\n mode: 'modal',\n handle: this.config.handle,\n agent: this.config.agent,\n context: this.config.context,\n firstMessage: this.config.firstMessage,\n buttonText: this.config.buttonText,\n buttonIcon: this.config.buttonIcon,\n chatOnly: this.config.chatOnly,\n onClose: this.config.onClose,\n })\n }\n\n buttonEl.addEventListener('click', handleClick)\n\n // Store cleanup function\n this.destroy = () => {\n buttonEl.removeEventListener('click', handleClick)\n logger.info(`Button mode widget destroyed for handle: ${this.config.handle}`)\n }\n }\n else if (mode === 'popup') {\n const { default: AgentWidgetPopup } = await import('./ui/AgentWidgetPopup.vue')\n\n this.app = createApp(AgentWidgetPopup, {\n sdk: this.sdk,\n handle: this.config.handle,\n agent: this.config.agent,\n context: this.config.context,\n firstMessage: this.config.firstMessage,\n buttonText: this.config.buttonText,\n buttonIcon: this.config.buttonIcon,\n position: this.config.position || 'bottom-right',\n chatOnly: this.config.chatOnly,\n chatController: this.config.chatController,\n })\n\n this.widgetInstance = this.app.mount(mountPoint) as WidgetInstance\n }\n else if (mode === 'modal') {\n const { default: AgentWidgetModal } = await import('./ui/AgentWidgetModal.vue')\n\n this.app = createApp(AgentWidgetModal, {\n sdk: this.sdk,\n handle: this.config.handle,\n agent: this.config.agent,\n context: this.config.context,\n firstMessage: this.config.firstMessage,\n buttonText: this.config.buttonText,\n buttonIcon: this.config.buttonIcon,\n chatOnly: this.config.chatOnly,\n onClose: () => {\n // Call user's onClose callback if provided\n if (this.config.onClose) {\n this.config.onClose()\n }\n // Auto-destroy modal when closed\n this.destroy()\n },\n })\n\n this.widgetInstance = this.app.mount(mountPoint) as WidgetInstance\n }\n else if (mode === 'onboard') {\n const { default: AgentWidgetOnboard } = await import('./ui/AgentWidgetOnboard.vue')\n\n this.app = createApp(AgentWidgetOnboard, {\n sdk: this.sdk,\n onClose: () => {\n if (this.config.onClose) {\n this.config.onClose()\n }\n this.destroy()\n },\n })\n\n this.widgetInstance = this.app.mount(mountPoint) as WidgetInstance\n }\n else {\n throw new Error(`PLWidget: unsupported mode \"${mode}\"`)\n }\n }\n\n /**\n * Update widget with new configuration without re-mounting\n */\n update(updates: WidgetUpdate) {\n if (this.widgetInstance?.update) {\n this.widgetInstance.update(updates)\n logger.info(`Widget updated: ${Object.keys(updates).join(', ')}`)\n }\n else {\n logger.warn('Widget instance does not support update()')\n }\n }\n\n /**\n * Toggle widget visibility (popup mode only)\n */\n toggle() {\n if (this.widgetInstance?.toggle) {\n this.widgetInstance.toggle()\n }\n else {\n logger.warn('Widget mode does not support toggle()')\n }\n }\n\n /**\n * Open widget (popup mode only)\n */\n open() {\n if (this.widgetInstance?.open) {\n this.widgetInstance.open()\n }\n else {\n logger.warn('Widget mode does not support open()')\n }\n }\n\n /**\n * Close widget (popup mode only)\n */\n close() {\n if (this.widgetInstance?.close) {\n this.widgetInstance.close()\n }\n else {\n logger.warn('Widget mode does not support close()')\n }\n }\n\n /**\n * Destroy widget and cleanup\n */\n destroy() {\n if (this.app) {\n this.app.unmount()\n this.app = null\n }\n\n if (this.shadowRoot) {\n this.shadowRoot.innerHTML = ''\n this.shadowRoot = null\n }\n\n // For modal/onboard mode, remove container from body and remove from singleton map\n if (this.config.mode === 'modal' || this.config.mode === 'onboard') {\n if (this.container) {\n this.container.remove()\n this.container = null\n }\n\n const instanceKey = this.config.handle || this.config.agent?.agentId || 'default'\n PLWidget.modalInstances.delete(instanceKey)\n }\n\n this.widgetInstance = null\n\n logger.info(`Widget destroyed for handle: ${this.config.handle || this.config.agent?.handle}`)\n }\n}\n","import type { MaybeRef } from 'vue'\nimport type { AgentConfig } from '@pagelines/core'\nimport type { WidgetConfig, WidgetUpdate } from '../PLWidget'\nimport { computed, onUnmounted, ref, unref, watch } from 'vue'\nimport { PLWidget } from '../PLWidget'\n\nexport interface UsePLWidgetConfig {\n mode: WidgetConfig['mode']\n handle?: MaybeRef<string | undefined>\n agent?: MaybeRef<AgentConfig | null | undefined>\n context?: MaybeRef<string | undefined>\n firstMessage?: MaybeRef<string | undefined>\n apiBase?: string\n onClose?: () => void\n}\n\n/**\n * Composable for managing PLWidget lifecycle with automatic initialization,\n * reactive updates, and cleanup.\n *\n * Benefits:\n * - Eliminates manual DOM timing coordination (watch + nextTick)\n * - Automatic cleanup on unmount\n * - Reactive prop updates via widget.update()\n * - Prevents double initialization\n * - Clear loading/error states\n *\n * @example\n * ```vue\n * <script setup>\n * const agentRef = ref<Agent | null>(null)\n * const { containerRef, loading, error } = usePLWidget({\n * mode: 'inline',\n * agent: agentRef,\n * context: 'welcome'\n * })\n * </script>\n *\n * <template>\n * <div ref=\"containerRef\" class=\"w-full h-full\" />\n * </template>\n * ```\n */\nexport function usePLWidget(config: UsePLWidgetConfig) {\n const containerRef = ref<HTMLElement | null>(null)\n const widget = ref<InstanceType<typeof PLWidget> | null>(null)\n const loading = ref(true)\n const error = ref<string | null>(null)\n\n // Track if widget has been initialized to prevent double-init\n const initialized = ref(false)\n\n // Computed values for reactive tracking\n const currentHandle = computed(() => unref(config.handle))\n const currentAgent = computed(() => unref(config.agent))\n const currentContext = computed(() => unref(config.context))\n const currentFirstMessage = computed(() => unref(config.firstMessage))\n\n // Check if we have required data for initialization\n const hasRequiredData = computed(() => {\n if (config.mode === 'modal') {\n // Modal doesn't need container\n return !!(currentHandle.value || currentAgent.value)\n }\n // Inline/popup need container + (handle or agent)\n return !!(containerRef.value && (currentHandle.value || currentAgent.value))\n })\n\n // Initialize widget when container and data are ready\n watch([containerRef, currentAgent, currentHandle], async () => {\n // Skip if already initialized or missing required data\n if (initialized.value || !hasRequiredData.value) {\n return\n }\n\n loading.value = true\n error.value = null\n\n try {\n // Wait for next tick to ensure DOM is fully rendered\n await new Promise(resolve => setTimeout(resolve, 0))\n\n const widgetConfig: WidgetConfig = {\n mode: config.mode,\n handle: currentHandle.value,\n agent: currentAgent.value || undefined,\n context: currentContext.value,\n firstMessage: currentFirstMessage.value,\n apiBase: config.apiBase,\n onClose: config.onClose,\n }\n\n // Add container element for non-modal modes\n if (config.mode !== 'modal') {\n widgetConfig.el = containerRef.value!\n }\n\n widget.value = new PLWidget(widgetConfig)\n initialized.value = true\n } catch (err) {\n error.value = err instanceof Error ? err.message : 'Failed to initialize widget'\n console.error('[usePLWidget] Initialization error:', err)\n } finally {\n loading.value = false\n }\n }, { immediate: true })\n\n // Watch for prop changes and update widget reactively\n watch([currentAgent, currentContext, currentFirstMessage], () => {\n if (!widget.value || !initialized.value) {\n return\n }\n\n const updates: WidgetUpdate = {}\n if (currentAgent.value !== undefined) {\n updates.agent = currentAgent.value || undefined\n }\n if (currentContext.value !== undefined) {\n updates.context = currentContext.value\n }\n if (currentFirstMessage.value !== undefined) {\n updates.firstMessage = currentFirstMessage.value\n }\n\n if (Object.keys(updates).length > 0) {\n widget.value.update(updates)\n }\n })\n\n // Cleanup on unmount\n onUnmounted(() => {\n if (widget.value) {\n widget.value.destroy()\n widget.value = null\n }\n initialized.value = false\n })\n\n return {\n containerRef,\n widget,\n loading,\n error,\n }\n}\n","import type { AgentConfig } from '../../agent/schema'\nimport type { ButtonIconPreset, WidgetUpdate } from '../PLWidget'\nimport { ref } from 'vue'\n\nexport function useWidgetState(props: {\n agent?: AgentConfig\n context?: string\n firstMessage?: string\n buttonText?: string\n buttonIcon?: ButtonIconPreset\n}) {\n const currentAgent = ref<AgentConfig | undefined>(props.agent)\n const currentContext = ref<string | undefined>(props.context)\n const currentFirstMessage = ref<string | undefined>(props.firstMessage)\n const currentButtonText = ref<string | undefined>(props.buttonText)\n const currentButtonIcon = ref<ButtonIconPreset | undefined>(props.buttonIcon)\n\n function update(updates: WidgetUpdate) {\n if (updates.agent !== undefined)\n currentAgent.value = updates.agent\n if (updates.context !== undefined)\n currentContext.value = updates.context\n if (updates.firstMessage !== undefined)\n currentFirstMessage.value = updates.firstMessage\n if (updates.buttonText !== undefined)\n currentButtonText.value = updates.buttonText\n if (updates.buttonIcon !== undefined)\n currentButtonIcon.value = updates.buttonIcon\n }\n\n return { currentAgent, currentContext, currentFirstMessage, currentButtonText, currentButtonIcon, update }\n}\n","<script setup lang=\"ts\">\nimport type { AgentChatController } from '../../agent/AgentController'\nimport type { PageLinesSDK } from '../../sdkClient'\nimport type { AgentConfig } from '../../agent/schema'\nimport type { Agent } from '../../agent/schema'\nimport { computed, ref, shallowRef, watch } from 'vue'\nimport { getAgentAvatarUrl } from '../../agent/utils'\nimport { AgentChatController as Controller } from '../../agent/AgentController'\nimport AgentWrap from '../../agent/ui/AgentWrap.vue'\nimport ElAgentChat from '../../agent/ui/ElAgentChat.vue'\nimport { useWidgetState } from '../composables/useWidgetState'\n\nconst props = defineProps<{\n sdk?: PageLinesSDK\n handle?: string\n agent?: AgentConfig\n context?: string\n firstMessage?: string\n position?: 'bottom-right' | 'bottom-left' | 'top-right' | 'top-left'\n chatController?: AgentChatController\n}>()\n\nconst isOpen = ref(false)\nconst hasOpened = ref(false)\nconst internalController = shallowRef<AgentChatController>()\n\nconst { currentAgent, currentContext, currentFirstMessage, update } = useWidgetState(props)\n\nconst positionClasses = computed(() => {\n const map = {\n 'bottom-left': 'bottom-4 left-4 sm:bottom-6 sm:left-6',\n 'top-right': 'top-4 right-4 sm:top-6 sm:right-6',\n 'top-left': 'top-4 left-4 sm:top-6 sm:left-6',\n 'bottom-right': 'bottom-4 right-4 sm:bottom-6 sm:right-6',\n }\n return map[props.position || 'bottom-right']\n})\n\nconst transformOrigin = computed(() => {\n const map = {\n 'bottom-left': 'bottom left',\n 'top-right': 'top right',\n 'top-left': 'top left',\n 'bottom-right': 'bottom right',\n }\n return map[props.position || 'bottom-right']\n})\n\nfunction initController(agent: Agent, sdk: PageLinesSDK) {\n if (props.chatController || internalController.value) return\n\n internalController.value = new Controller({\n sdk,\n agent: agent.toConfig(),\n context: currentContext.value,\n firstMessage: currentFirstMessage.value,\n })\n}\n\n// Lazy connection: start conversation on first open\nwatch(isOpen, (open) => {\n if (open && !hasOpened.value) {\n hasOpened.value = true\n const ctrl = props.chatController || internalController.value\n if (ctrl) {\n void ctrl.startTextConversation()\n }\n }\n})\n\nfunction toggle() {\n isOpen.value = !isOpen.value\n}\n\nfunction open() {\n isOpen.value = true\n}\n\nfunction close() {\n isOpen.value = false\n}\n\ndefineExpose({ toggle, open, close, update })\n</script>\n\n<template>\n <AgentWrap\n v-slot=\"{ agent, sdk: resolvedSdk }\"\n :sdk=\"sdk\"\n :handle=\"handle\"\n :agent=\"currentAgent\"\n :context=\"currentContext\"\n :first-message=\"currentFirstMessage\"\n >\n <div\n v-if=\"agent\"\n :ref=\"() => initController(agent, resolvedSdk)\"\n class=\"fixed z-[999999] pointer-events-auto\"\n :class=\"positionClasses\"\n >\n <!-- Widget container: animates size/radius/shadow -->\n <div\n class=\"widget-container transform-gpu overflow-hidden\"\n :class=\"isOpen\n ? 'w-[min(400px,calc(100vw-2rem))] h-[min(600px,calc(100vh-4rem))] shadow-[0_24px_80px_-12px_rgba(0,0,0,0.2),0_8px_24px_-8px_rgba(0,0,0,0.08)]'\n : 'w-16 h-16 shadow-[0_8px_32px_-4px_rgba(0,0,0,0.15)] cursor-pointer'\"\n :style=\"{ 'border-radius': isOpen ? '16px' : '32px', 'transform-origin': transformOrigin }\"\n @click=\"!isOpen ? toggle() : undefined\"\n >\n <!-- Bubble (cross-fade: always in DOM) -->\n <div\n class=\"absolute inset-0 transition-opacity duration-200\"\n :class=\"isOpen ? 'opacity-0 pointer-events-none' : 'opacity-100'\"\n >\n <div class=\"relative h-full w-full rounded-full overflow-hidden\">\n <img\n :src=\"getAgentAvatarUrl(agent.toConfig())\"\n :alt=\"`${agent.name.value} agent`\"\n class=\"h-full w-full object-cover pointer-events-none\"\n width=\"64\"\n height=\"64\"\n />\n <div class=\"absolute inset-0 pointer-events-none bg-gradient-to-br from-transparent via-black/10 to-black/40 opacity-60\" />\n </div>\n </div>\n\n <!-- Panel (cross-fade: always in DOM) -->\n <div\n class=\"absolute inset-0 flex flex-col bg-white transition-opacity duration-250\"\n :class=\"isOpen ? 'opacity-100' : 'opacity-0 pointer-events-none'\"\n >\n <!-- Header -->\n <div class=\"flex items-center shrink-0 border-b border-theme-100 px-4 py-3\">\n <div class=\"flex items-center gap-3 flex-1 min-w-0\">\n <img\n :src=\"agent.avatarUrl.value\"\n :alt=\"agent.name.value\"\n class=\"size-8 rounded-full object-cover shrink-0\"\n />\n <div class=\"min-w-0\">\n <div class=\"text-sm font-medium text-theme-900 truncate\">{{ agent.displayName.value }}</div>\n <div class=\"text-[11px]\" :class=\"agent.desiredStatus.value === 'active' ? 'text-green-500' : 'text-theme-400'\">\n {{ agent.desiredStatus.value === 'active' ? 'Online' : 'Offline' }}\n </div>\n </div>\n </div>\n <button\n class=\"cursor-pointer flex items-center justify-center p-2 -mr-1 rounded-xl text-theme-400 hover:text-theme-600 hover:bg-theme-50 transition-colors\"\n @click.stop=\"close\"\n >\n <i class=\"size-5 i-tabler-x\" />\n </button>\n </div>\n\n <!-- Chat -->\n <div class=\"flex-1 overflow-hidden\">\n <ElAgentChat\n v-if=\"hasOpened\"\n :chat-controller=\"chatController || internalController\"\n :agent=\"agent\"\n variant=\"light\"\n scale=\"md\"\n setup-hint=\"\"\n empty-state-message=\"Send a message to get started\"\n />\n </div>\n\n <!-- Footer -->\n <div class=\"shrink-0 flex items-center justify-center border-t border-theme-100 py-1.5\">\n <a\n href=\"https://www.pagelines.com\"\n target=\"_blank\"\n rel=\"noopener\"\n class=\"text-[10px] text-theme-300 hover:text-theme-400 transition-colors\"\n >\n AI Agent™ by PageLines\n </a>\n </div>\n </div>\n </div>\n\n <!-- Online indicator (outside overflow-hidden so ping isn't clipped) -->\n <div\n v-if=\"agent.desiredStatus.value === 'active'\"\n class=\"absolute top-[5%] right-[5%] transition-opacity duration-200 pointer-events-none\"\n :class=\"isOpen ? 'opacity-0' : 'opacity-100'\"\n >\n <div class=\"size-3 bg-green-500 rounded-full ring-2 ring-white absolute animate-ping\" style=\"animation-duration: 5s;\" />\n <div class=\"size-3 bg-green-500 rounded-full ring-2 ring-white\" />\n </div>\n </div>\n </AgentWrap>\n</template>\n\n<style scoped>\n.widget-container {\n transition: width 0.4s cubic-bezier(0.32, 0.72, 0, 1),\n height 0.4s cubic-bezier(0.32, 0.72, 0, 1),\n border-radius 0.4s cubic-bezier(0.32, 0.72, 0, 1),\n box-shadow 0.4s cubic-bezier(0.32, 0.72, 0, 1);\n}\n</style>\n","<script setup lang=\"ts\">\nimport type { PageLinesSDK } from '../../sdkClient'\nimport { ref } from 'vue'\nimport ElAgentButton from './ElAgentButton.vue'\nimport AgentInputEmail from './AgentInputEmail.vue'\nimport AgentInputOneTimeCode from './AgentInputOneTimeCode.vue'\n\nconst { sdk } = defineProps<{ sdk: PageLinesSDK }>()\n\nconst showEmail = ref(false)\nconst emailStep = ref<'email' | 'code'>('email')\nconst form = ref({ email: '', code: '' })\nconst isSubmitting = ref(false)\n\nfunction signInWithGoogle() {\n sdk.error.value = null\n sdk.auth.loginWithGoogle({\n onError: (error) => {\n sdk.error.value = error\n },\n })\n}\n\nasync function sendCode() {\n if (isSubmitting.value) return\n isSubmitting.value = true\n sdk.error.value = null\n try {\n const success = await sdk.auth.requestAuthCode({ email: form.value.email })\n if (success) emailStep.value = 'code'\n }\n finally {\n isSubmitting.value = false\n }\n}\n\nasync function verifyCode() {\n if (isSubmitting.value) return\n isSubmitting.value = true\n sdk.error.value = null\n try {\n await sdk.auth.loginWithCode({ email: form.value.email, code: form.value.code })\n }\n finally {\n isSubmitting.value = false\n }\n}\n</script>\n\n<template>\n <div data-test=\"auth-panel\" class=\"flex flex-col justify-end h-full px-5 pb-8 pt-6\">\n <!-- Top area — conversational prompt -->\n <div class=\"flex-1 flex flex-col justify-center\">\n <div class=\"space-y-3 mb-10\">\n <h3 class=\"text-2xl font-light text-theme-900 leading-snug\">\n Your AI assistant,<br />ready in two minutes.\n </h3>\n <p class=\"text-sm text-theme-400 leading-relaxed max-w-[260px]\">\n Sign in to create and deploy a personal AI that works for you.\n </p>\n </div>\n\n <p\n v-if=\"sdk.error.value\"\n class=\"text-xs text-red-500 mb-4\"\n >\n {{ sdk.error.value }}\n </p>\n </div>\n\n <!-- Bottom area — actions -->\n <div class=\"space-y-3\">\n <!-- Google button -->\n <button\n data-test=\"google-auth-btn\"\n class=\"w-full flex items-center justify-center gap-3 px-5 py-3.5 rounded-xl border border-theme-200 bg-theme-0 text-theme-800 font-medium text-sm transition-all duration-150 hover:border-theme-300 hover:bg-theme-25 active:scale-[0.98] cursor-pointer\"\n @click=\"signInWithGoogle\"\n >\n <svg class=\"size-[18px]\" viewBox=\"0 0 24 24\">\n <path d=\"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92a5.06 5.06 0 0 1-2.2 3.32v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.1z\" fill=\"#4285F4\" />\n <path d=\"M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z\" fill=\"#34A853\" />\n <path d=\"M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z\" fill=\"#FBBC05\" />\n <path d=\"M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z\" fill=\"#EA4335\" />\n </svg>\n Continue with Google\n </button>\n\n <!-- Divider -->\n <div class=\"flex items-center gap-3 py-1\">\n <div class=\"flex-1 h-px bg-theme-100\" />\n <span class=\"text-[11px] text-theme-300 uppercase tracking-widest\">or</span>\n <div class=\"flex-1 h-px bg-theme-100\" />\n </div>\n\n <!-- Email flow -->\n <div v-if=\"!showEmail\">\n <button\n data-test=\"email-auth-link\"\n class=\"w-full px-5 py-3 rounded-xl border border-theme-100 text-sm text-theme-500 transition-all duration-150 hover:border-theme-200 hover:text-theme-700 cursor-pointer\"\n @click=\"showEmail = true\"\n >\n Use email instead\n </button>\n </div>\n\n <!-- Email input step -->\n <div v-if=\"showEmail && emailStep === 'email'\" class=\"space-y-3\">\n <AgentInputEmail\n v-model=\"form.email\"\n data-test=\"auth-email-input\"\n @keyup.enter=\"sendCode\"\n />\n <ElAgentButton\n data-test=\"auth-send-code\"\n theme=\"primary\"\n size=\"md\"\n class=\"w-full\"\n :loading=\"isSubmitting\"\n :disabled=\"!form.email || isSubmitting\"\n @click=\"sendCode\"\n >\n Send verification code\n </ElAgentButton>\n </div>\n\n <!-- Code verification step -->\n <div v-if=\"showEmail && emailStep === 'code'\" class=\"space-y-3\">\n <p class=\"text-xs text-theme-400\">\n Code sent to {{ form.email }}\n </p>\n <AgentInputOneTimeCode\n v-model=\"form.code\"\n :length=\"6\"\n :focus-first=\"true\"\n data-test=\"auth-code-input\"\n @auto-submit=\"verifyCode\"\n />\n <ElAgentButton\n data-test=\"auth-verify-code\"\n theme=\"primary\"\n size=\"md\"\n class=\"w-full\"\n :loading=\"isSubmitting\"\n :disabled=\"form.code.length !== 6 || isSubmitting\"\n @click=\"verifyCode\"\n >\n Verify\n </ElAgentButton>\n <button\n class=\"w-full text-xs text-theme-300 hover:text-theme-500 transition-colors py-1 cursor-pointer\"\n @click=\"emailStep = 'email'\"\n >\n Use a different email\n </button>\n </div>\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport type { AgentConfig } from '@pagelines/core'\nimport type { PageLinesSDK } from '../../sdkClient'\nimport { ref } from 'vue'\n\nconst { sdk } = defineProps<{ sdk: PageLinesSDK }>()\nconst emit = defineEmits<{ created: [agent: AgentConfig] }>()\n\nconst name = ref('')\nconst isSubmitting = ref(false)\nconst error = ref<string | null>(null)\n\nasync function createAgent() {\n if (isSubmitting.value || !name.value.trim()) return\n isSubmitting.value = true\n error.value = null\n\n try {\n const agent = await sdk.agent.create({ name: name.value.trim() })\n emit('created', agent)\n }\n catch (err) {\n error.value = err instanceof Error ? err.message : 'Failed to create agent'\n }\n finally {\n isSubmitting.value = false\n }\n}\n</script>\n\n<template>\n <div data-test=\"create-panel\" class=\"flex flex-col justify-end h-full px-5 pb-8 pt-6\">\n <div class=\"flex-1 flex flex-col justify-center\">\n <div class=\"space-y-3 mb-10\">\n <h3 class=\"text-2xl font-light text-theme-900 leading-snug\">\n What should we call<br />your assistant?\n </h3>\n <p class=\"text-sm text-theme-400 leading-relaxed max-w-[260px]\">\n Pick a name. You can change it later.\n </p>\n </div>\n\n <p v-if=\"error\" class=\"text-xs text-red-500 mb-4\">\n {{ error }}\n </p>\n </div>\n\n <div class=\"space-y-3\">\n <input\n v-model=\"name\"\n data-test=\"agent-name-input\"\n type=\"text\"\n placeholder=\"e.g. Alex, Casey, Jordan\"\n class=\"w-full px-4 py-3 text-theme-900 placeholder-theme-300 bg-theme-0 border border-theme-200 rounded-xl focus:outline-none focus:border-primary-400 transition-colors\"\n style=\"font-size: 16px\"\n @keyup.enter=\"createAgent\"\n />\n\n <button\n data-test=\"agent-create-btn\"\n class=\"w-full px-5 py-3.5 rounded-xl bg-primary-600 text-white text-sm font-medium transition-all duration-150 hover:bg-primary-500 active:scale-[0.98] disabled:opacity-50 disabled:cursor-not-allowed cursor-pointer\"\n :disabled=\"!name.trim() || isSubmitting\"\n @click=\"createAgent\"\n >\n {{ isSubmitting ? 'Creating...' : 'Create assistant' }}\n </button>\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport type { PageLinesSDK } from '../../sdkClient'\nimport { onMounted, ref } from 'vue'\n\nconst props = defineProps<{\n sdk: PageLinesSDK\n agentId: string\n}>()\n\nconst emit = defineEmits<{\n ready: []\n error: [message: string]\n}>()\n\nconst statusMessage = ref('Deploying your server...')\nconst hasError = ref(false)\nconst errorMessage = ref('')\n\nasync function startPolling() {\n hasError.value = false\n errorMessage.value = ''\n\n try {\n await props.sdk.agent.waitUntilReady({\n agentId: props.agentId,\n onStatus: (msg) => {\n statusMessage.value = msg\n },\n })\n emit('ready')\n }\n catch (err) {\n hasError.value = true\n errorMessage.value = err instanceof Error ? err.message : 'Something went wrong'\n emit('error', errorMessage.value)\n }\n}\n\nonMounted(() => {\n startPolling()\n})\n</script>\n\n<template>\n <div data-test=\"provisioning-panel\" class=\"flex flex-col items-center justify-center h-full p-6\">\n <div class=\"w-full max-w-xs space-y-6 text-center\">\n <template v-if=\"!hasError\">\n <div class=\"flex justify-center\">\n <div class=\"animate-spin rounded-full size-6 border-2 border-theme-200 border-t-primary-500\" />\n </div>\n <p class=\"text-sm text-theme-500\">\n {{ statusMessage }}\n </p>\n </template>\n\n <template v-else>\n <p class=\"text-sm text-red-500\">\n {{ errorMessage }}\n </p>\n <button\n data-test=\"provision-retry-btn\"\n class=\"px-6 py-2.5 rounded-lg bg-primary-600 text-white text-sm font-medium hover:bg-primary-500 transition-colors cursor-pointer\"\n @click=\"startPolling\"\n >\n Try Again\n </button>\n </template>\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport type { AgentConfig } from '@pagelines/core'\nimport type { PageLinesSDK } from '../../sdkClient'\nimport { computed, ref, shallowRef, watch } from 'vue'\nimport { Agent } from '../../agent/schema'\nimport { AgentChatController } from '../../agent/AgentController'\nimport { resolveApiBase } from '../../api'\nimport { PageLinesSDK as PageLinesSDKClass } from '../../sdkClient'\nimport ElAgentChat from '../../agent/ui/ElAgentChat.vue'\nimport ElAuthPanel from '../../agent/ui/ElAuthPanel.vue'\nimport ElCreateAgent from '../../agent/ui/ElCreateAgent.vue'\nimport ElProvisioningStatus from '../../agent/ui/ElProvisioningStatus.vue'\n\nconst props = defineProps<{\n sdk?: PageLinesSDK\n onClose?: () => void\n}>()\n\n// SDK singleton\nconst sdk = props.sdk || PageLinesSDKClass.getInstance({\n isDev: typeof window !== 'undefined'\n ? window.location.hostname === 'localhost' || window.location.hostname.includes('127.0.0.1')\n : false,\n})\n\n// Local state\nconst createdAgent = shallowRef<AgentConfig | undefined>()\nconst botReady = ref(false)\nconst provisionError = ref<string | undefined>()\n// True when user just created an agent in this session (needs provisioning gate)\nconst isNewAgent = ref(false)\n\n// Derive current agent from SDK state or local creation\nconst agent = computed(() => {\n if (createdAgent.value) return createdAgent.value\n const user = sdk.activeUser.value\n if (!user?.agents?.length) return undefined\n const primaryId = user.primaryAgentId\n return user.agents.find(a => a.agentId === primaryId) || user.agents[0]\n})\n\n// Agent wrapper for AgentChat — stable ref, only created once per agent\nconst agentInstance = shallowRef<Agent | undefined>()\nconst chatControllerRef = shallowRef<AgentChatController | undefined>()\n\n// Create Agent + Controller only when agentId changes (not on every reactivity tick)\nwatch(() => agent.value?.agentId, (agentId) => {\n if (!agentId || !agent.value) {\n agentInstance.value = undefined\n chatControllerRef.value = undefined\n return\n }\n\n const agentObj = new Agent({ config: agent.value })\n agentInstance.value = agentObj\n\n chatControllerRef.value = new AgentChatController({\n sdk,\n agent: agentObj,\n chatStreamFn: async (args) => {\n await sdk.chat.chatStreamAuthenticated({\n agentId: agentId!,\n message: args.message,\n attachments: args.attachments,\n conversationId: args.conversationId,\n history: args.history,\n onDelta: args.onDelta,\n onDone: args.onDone,\n onError: args.onError,\n onStatus: args.onStatus,\n })\n },\n })\n}, { immediate: true })\n\n// Derive mode from state\n// Key insight: existing agents go straight to chat (auto-wake handles bot startup).\n// Only newly created agents go through the provisioning gate.\nconst mode = computed<'auth' | 'create' | 'provisioning' | 'error' | 'chat'>(() => {\n if (!sdk.token.value) return 'auth'\n if (!agent.value) return 'create'\n // Only gate on provisioning for agents created in this session\n if (isNewAgent.value) {\n if (provisionError.value) return 'error'\n if (!botReady.value) return 'provisioning'\n }\n return 'chat'\n})\n\n// Dashboard URL\nconst dashboardUrl = computed(() => {\n const base = resolveApiBase(sdk.apiBase, sdk.isDev)\n return `${base}/dashboard`\n})\n\n// Event handlers\nfunction onAgentCreated(agentConfig: AgentConfig) {\n createdAgent.value = agentConfig\n provisionError.value = undefined\n botReady.value = false\n isNewAgent.value = true\n}\n\nfunction onProvisionReady() {\n botReady.value = true\n}\n\nfunction onProvisionError(msg: string) {\n provisionError.value = msg\n}\n\nfunction onRetry() {\n provisionError.value = undefined\n botReady.value = false\n}\n\n// No initial status check needed for existing agents —\n// AgentChat's auto-wake handles starting stopped bots.\n// Provisioning gate only applies to newly created agents (isNewAgent).\n</script>\n\n<template>\n <div\n class=\"size-full flex flex-col bg-theme-0\"\n data-test=\"onboard-widget\"\n :data-test-state=\"mode\"\n >\n <!-- Header -->\n <div class=\"flex items-center justify-between px-4 py-3 border-b border-theme-100\">\n <span class=\"text-sm font-medium text-theme-800\">\n {{ agent?.name || 'PageLines' }}\n </span>\n <button\n v-if=\"props.onClose\"\n class=\"text-theme-400 hover:text-theme-600 transition-colors cursor-pointer\"\n @click=\"props.onClose?.()\"\n >\n <svg xmlns=\"http://www.w3.org/2000/svg\" class=\"size-5\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\n <path fill-rule=\"evenodd\" d=\"M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z\" clip-rule=\"evenodd\" />\n </svg>\n </button>\n </div>\n\n <!-- Content area -->\n <div class=\"flex-1 overflow-hidden\">\n <ElAuthPanel v-if=\"mode === 'auth'\" :sdk=\"sdk\" />\n <ElCreateAgent v-if=\"mode === 'create'\" :sdk=\"sdk\" @created=\"onAgentCreated\" />\n <ElProvisioningStatus\n v-if=\"mode === 'provisioning' && agent\"\n :sdk=\"sdk\"\n :agent-id=\"agent.agentId || ''\"\n @ready=\"onProvisionReady\"\n @error=\"onProvisionError\"\n />\n <ElAgentChat\n v-if=\"mode === 'chat' && agentInstance && chatControllerRef\"\n :chat-controller=\"chatControllerRef\"\n :agent=\"agentInstance\"\n variant=\"light\"\n class=\"size-full\"\n />\n\n <!-- Error recovery -->\n <div v-if=\"mode === 'error'\" class=\"flex flex-col items-center justify-center h-full p-6\">\n <div class=\"w-full max-w-xs space-y-6 text-center\">\n <p class=\"text-sm text-red-500\">\n {{ provisionError }}\n </p>\n <button\n class=\"px-6 py-2.5 rounded-lg bg-primary-600 text-white text-sm font-medium hover:bg-primary-500 transition-colors cursor-pointer\"\n @click=\"onRetry\"\n >\n Try Again\n </button>\n </div>\n </div>\n </div>\n\n <!-- Dashboard CTA (chat mode) -->\n <div v-if=\"mode === 'chat'\" class=\"border-t border-theme-100 px-4 py-2 text-center\">\n <a\n :href=\"dashboardUrl\"\n target=\"_blank\"\n class=\"text-xs text-theme-400 hover:text-primary-600 transition-colors\"\n >\n Go to Dashboard →\n </a>\n </div>\n </div>\n</template>\n"],"names":["logger","createLogger","_PLWidget","config","__publicField","autoContext","manualContext","mergedContext","instanceKey","existing","isDev","PageLinesSDK","parts","url","title","metaDesc","ogTitle","referrer","path","styleElement","sdkCSS","mountPoint","mode","AgentWidgetInline","createApp","buttonEl","handleClick","__name","AgentWidgetPopup","AgentWidgetPopup$1","AgentWidgetModal","AgentWidgetOnboard","updates","PLWidget","usePLWidget","containerRef","ref","widget","loading","error","initialized","currentHandle","computed","unref","currentAgent","currentContext","currentFirstMessage","hasRequiredData","watch","resolve","widgetConfig","err","onUnmounted","useWidgetState","props","currentButtonText","currentButtonIcon","update","__props","isOpen","hasOpened","internalController","shallowRef","positionClasses","transformOrigin","initController","agent","sdk","Controller","open","ctrl","toggle","close","__expose","_createBlock","AgentWrap","_unref","resolvedSdk","_createElementBlock","_normalizeClass","_createElementVNode","_normalizeStyle","_cache","$event","_hoisted_1","getAgentAvatarUrl","_hoisted_3","_hoisted_4","_hoisted_6","_hoisted_7","_toDisplayString","_hoisted_8","ElAgentChat","showEmail","emailStep","form","isSubmitting","signInWithGoogle","sendCode","verifyCode","_openBlock","_hoisted_2","_hoisted_5","_createVNode","AgentInputEmail","ElAgentButton","AgentInputOneTimeCode","emit","__emit","name","createAgent","statusMessage","hasError","errorMessage","startPolling","msg","onMounted","_Fragment","PageLinesSDKClass","createdAgent","botReady","provisionError","isNewAgent","user","primaryId","a","agentInstance","chatControllerRef","agentId","agentObj","Agent","AgentChatController","args","dashboardUrl","resolveApiBase","onAgentCreated","agentConfig","onProvisionReady","onProvisionError","onRetry","ElAuthPanel","ElCreateAgent","ElProvisioningStatus","_hoisted_9"],"mappings":"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"}
|