@ourguide-ai/client 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +6 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +303 -0
- package/dist/index.js +697 -0
- package/dist/index.js.map +1 -0
- package/package.json +46 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/api.ts","../src/state-machine.ts","../src/stream-parser.ts","../src/client-tool-registry.ts","../src/session.ts","../src/dom-capture.ts","../src/navigator.ts","../src/OurguideClient.ts","../src/markdown.ts","../src/appearance.ts"],"sourcesContent":["export function fileToBase64(file: File): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = () => {\n const result = reader.result as string;\n resolve(result.split(',')[1]); // strip \"data:...;base64,\"\n };\n reader.onerror = () => reject(new Error('Failed to read file'));\n reader.readAsDataURL(file);\n });\n}\n\nexport interface ChatMessage {\n role: 'user' | 'assistant';\n content: string;\n}\n\nexport interface AssistantToolCallMessage {\n role: 'assistant';\n content: Array<{\n type: 'tool-call';\n toolCallId: string;\n toolName: string;\n input: Record<string, unknown>;\n providerOptions?: Record<string, unknown>;\n }>;\n}\n\nexport interface ToolResultMessage {\n role: 'tool';\n content: Array<{\n type: 'tool-result';\n toolCallId: string;\n toolName: string;\n output: { type: 'json'; value: Record<string, unknown> };\n }>;\n}\n\nexport type AnyMessage = ChatMessage | AssistantToolCallMessage | ToolResultMessage;\n\nexport interface SendMessageResult {\n stream: ReadableStream<Uint8Array>;\n conversationId: string | null;\n}\n\nexport interface FileAttachment {\n name: string;\n type: string;\n data: string; // base64\n}\n\nexport interface ProductConfig {\n appearance?: {\n colors?: Record<string, string>;\n typography?: Record<string, string | number>;\n dimensions?: Record<string, number>;\n shadow?: string;\n };\n bubble?: {\n background?: string;\n border?: string;\n icon?: string;\n buttonSize?: number;\n iconSize?: number;\n right?: number;\n bottom?: number;\n };\n identity?: {\n name?: string;\n welcomeMessage?: string;\n };\n suggestions?: Array<{ buttonLabel: string; message: string }>;\n}\n\n/**\n * Fetch product config to know which features are enabled.\n */\nexport async function fetchConfig(\n apiUrl: string,\n productId: string\n): Promise<ProductConfig> {\n const url = `${apiUrl}/api/products/${productId}/config`;\n console.log('[Ourguide] fetchConfig HTTP GET', url);\n try {\n const res = await fetch(url, {\n headers: { 'ngrok-skip-browser-warning': 'true' },\n });\n console.log('[Ourguide] fetchConfig HTTP status:', res.status, res.statusText);\n if (!res.ok) {\n console.warn('[Ourguide] fetchConfig non-OK response, returning {}');\n return {};\n }\n const data = await res.json();\n console.log('[Ourguide] fetchConfig raw JSON:', JSON.stringify(data, null, 2));\n return data;\n } catch (err) {\n console.error('[Ourguide] fetchConfig threw:', err);\n return {};\n }\n}\n\n/**\n * Send a chat message and return the raw ReadableStream for parsing.\n * Uses the /api/chat endpoint which returns a Vercel AI SDK data stream.\n */\nexport async function sendMessage(\n apiUrl: string,\n productId: string,\n messages: AnyMessage[],\n endUserSessionId?: string,\n conversationId?: string,\n attachments?: FileAttachment[]\n): Promise<SendMessageResult> {\n const body: Record<string, unknown> = { productId, messages, endUserSessionId };\n if (conversationId) {\n body.conversationId = conversationId;\n }\n if (attachments && attachments.length > 0) {\n body.attachments = attachments;\n }\n\n const res = await fetch(`${apiUrl}/api/chat`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'ngrok-skip-browser-warning': 'true',\n },\n body: JSON.stringify(body),\n });\n\n if (!res.ok) {\n const data = await res.json().catch(() => ({ error: 'Request failed' }));\n throw new Error(data.error || `HTTP ${res.status}`);\n }\n\n if (!res.body) {\n throw new Error('No response stream available');\n }\n\n return {\n stream: res.body,\n conversationId: res.headers.get('X-Conversation-Id'),\n };\n}\n\nexport async function identifyEndUser(\n apiUrl: string,\n productId: string,\n endUserSessionId: string,\n token: string,\n name?: string\n): Promise<{ stored: boolean } & Record<string, unknown>> {\n const res = await fetch(`${apiUrl}/api/widget/identify`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'ngrok-skip-browser-warning': 'true',\n },\n body: JSON.stringify({ productId, endUserSessionId, token, name }),\n });\n\n const data = await res.json().catch(() => ({}));\n if (!res.ok) {\n throw new Error((data as { error?: string }).error || `HTTP ${res.status}`);\n }\n return data as { stored: boolean } & Record<string, unknown>;\n}\n\nexport async function resetEndUser(\n apiUrl: string,\n productId: string,\n endUserSessionId: string\n): Promise<{ deleted: boolean } & Record<string, unknown>> {\n const res = await fetch(`${apiUrl}/api/widget/reset-user`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'ngrok-skip-browser-warning': 'true',\n },\n body: JSON.stringify({ productId, endUserSessionId }),\n });\n\n const data = await res.json().catch(() => ({}));\n if (!res.ok) {\n throw new Error((data as { error?: string }).error || `HTTP ${res.status}`);\n }\n return data as { deleted: boolean } & Record<string, unknown>;\n}\n","export interface ToolCallInfo {\n id: string;\n name: string;\n args: Record<string, unknown>;\n result?: unknown;\n status: 'calling' | 'done' | 'error';\n /** Provider-specific metadata from the LLM response (e.g. Gemini thought signatures). */\n providerMetadata?: Record<string, unknown>;\n}\n\nexport interface Message {\n id: string;\n role: 'user' | 'assistant';\n content: string;\n toolCalls?: ToolCallInfo[];\n isStreaming?: boolean;\n}\n\nexport interface WidgetState {\n isOpen: boolean;\n messages: Message[];\n isStreaming: boolean;\n error: string | null;\n}\n\nexport type WidgetAction =\n | { type: 'OPEN' }\n | { type: 'CLOSE' }\n | { type: 'LOAD_MESSAGES'; messages: Message[] }\n | { type: 'ADD_USER_MESSAGE'; id: string; content: string }\n | { type: 'START_STREAMING'; id: string }\n | { type: 'APPEND_TEXT'; text: string }\n | { type: 'ADD_TOOL_CALL'; toolCall: ToolCallInfo }\n | { type: 'SET_TOOL_RESULT'; toolCallId: string; result: unknown }\n | { type: 'FINISH_STREAMING' }\n | { type: 'SET_ERROR'; error: string }\n | { type: 'CLEAR_MESSAGES' };\n\nexport const initialState: WidgetState = {\n isOpen: false,\n messages: [],\n isStreaming: false,\n error: null,\n};\n\nfunction generateId(): string {\n return Date.now().toString(36) + Math.random().toString(36).slice(2, 7);\n}\n\nexport { generateId };\n\nexport function widgetReducer(state: WidgetState, action: WidgetAction): WidgetState {\n switch (action.type) {\n case 'OPEN':\n return { ...state, isOpen: true, error: null };\n\n case 'CLOSE':\n return { ...state, isOpen: false };\n\n case 'LOAD_MESSAGES':\n return { ...state, messages: action.messages };\n\n case 'ADD_USER_MESSAGE':\n return {\n ...state,\n error: null,\n messages: [\n ...state.messages,\n { id: action.id, role: 'user', content: action.content },\n ],\n };\n\n case 'START_STREAMING':\n return {\n ...state,\n isStreaming: true,\n error: null,\n messages: [\n ...state.messages,\n { id: action.id, role: 'assistant', content: '', isStreaming: true },\n ],\n };\n\n case 'APPEND_TEXT': {\n const msgs = [...state.messages];\n const last = msgs[msgs.length - 1];\n if (last && last.role === 'assistant' && last.isStreaming) {\n msgs[msgs.length - 1] = { ...last, content: last.content + action.text };\n }\n return { ...state, messages: msgs };\n }\n\n case 'ADD_TOOL_CALL': {\n const msgs = [...state.messages];\n const last = msgs[msgs.length - 1];\n if (last && last.role === 'assistant') {\n const toolCalls = [...(last.toolCalls ?? []), action.toolCall];\n msgs[msgs.length - 1] = { ...last, toolCalls };\n }\n return { ...state, messages: msgs };\n }\n\n case 'SET_TOOL_RESULT': {\n const msgs = [...state.messages];\n const last = msgs[msgs.length - 1];\n if (last && last.role === 'assistant' && last.toolCalls) {\n const toolCalls = last.toolCalls.map((tc) =>\n tc.id === action.toolCallId\n ? { ...tc, result: action.result, status: 'done' as const }\n : tc\n );\n msgs[msgs.length - 1] = { ...last, toolCalls };\n }\n return { ...state, messages: msgs };\n }\n\n case 'FINISH_STREAMING': {\n const msgs = [...state.messages];\n const last = msgs[msgs.length - 1];\n if (last && last.role === 'assistant' && last.isStreaming) {\n // If only tool calls arrived with no text, remove the empty assistant message\n if (!last.content && last.toolCalls?.length) {\n msgs.pop();\n } else {\n msgs[msgs.length - 1] = { ...last, isStreaming: false };\n }\n }\n return { ...state, isStreaming: false, messages: msgs };\n }\n\n case 'SET_ERROR': {\n const msgs = [...state.messages];\n const last = msgs[msgs.length - 1];\n if (last && last.role === 'assistant' && last.isStreaming) {\n msgs[msgs.length - 1] = { ...last, isStreaming: false };\n }\n return { ...state, isStreaming: false, error: action.error, messages: msgs };\n }\n\n case 'CLEAR_MESSAGES':\n return { ...state, messages: [], error: null, isStreaming: false };\n\n default:\n return state;\n }\n}\n","/**\n * Lightweight parser for the Vercel AI SDK UI Message Stream protocol (SSE format).\n *\n * Protocol format (AI SDK v6): Server-Sent Events\n * data: {\"type\":\"text-delta\",\"delta\":\"...\",\"id\":\"...\"}\\n\\n\n * data: {\"type\":\"tool-input-start\",\"toolCallId\":\"...\",\"toolName\":\"...\"}\\n\\n\n * data: {\"type\":\"tool-input-delta\",\"toolCallId\":\"...\",\"inputTextDelta\":\"...\"}\\n\\n\n * data: {\"type\":\"tool-input-available\",\"toolCallId\":\"...\",\"toolName\":\"...\",\"input\":{...}}\\n\\n\n * data: {\"type\":\"tool-output-available\",\"toolCallId\":\"...\",\"output\":{...}}\\n\\n\n * data: {\"type\":\"finish\"}\\n\\n\n * data: [DONE]\\n\\n\n */\n\nexport interface StreamCallbacks {\n onTextDelta: (text: string) => void;\n onToolCall: (id: string, name: string, args: Record<string, unknown>, providerMetadata?: Record<string, unknown>) => void;\n onToolResult: (id: string, result: unknown) => void;\n onFinish: () => void;\n onError: (error: string) => void;\n}\n\nexport async function parseDataStream(\n body: ReadableStream<Uint8Array>,\n callbacks: StreamCallbacks\n): Promise<void> {\n const reader = body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n\n buffer += done\n ? decoder.decode()\n : decoder.decode(value, { stream: true });\n\n if (done) break;\n\n // SSE events are separated by double newlines\n const parts = buffer.split('\\n\\n');\n // Keep the last incomplete part in the buffer\n buffer = parts.pop() ?? '';\n\n for (const part of parts) {\n processSSEEvent(part.trim(), callbacks);\n }\n }\n\n // Process any remaining buffer\n if (buffer.trim()) {\n processSSEEvent(buffer.trim(), callbacks);\n }\n\n callbacks.onFinish();\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Stream read failed';\n callbacks.onError(message);\n } finally {\n reader.releaseLock();\n }\n}\n\nfunction processSSEEvent(event: string, callbacks: StreamCallbacks): void {\n // SSE lines start with \"data: \"\n const lines = event.split('\\n');\n for (const line of lines) {\n if (!line.startsWith('data: ')) continue;\n\n const payload = line.slice(6); // Remove \"data: \" prefix\n\n // End of stream marker\n if (payload === '[DONE]') return;\n\n try {\n const chunk = JSON.parse(payload) as {\n type: string;\n delta?: string;\n toolCallId?: string;\n toolName?: string;\n input?: Record<string, unknown>;\n inputTextDelta?: string;\n output?: unknown;\n finishReason?: string;\n reason?: string;\n errorText?: string;\n providerMetadata?: Record<string, unknown>;\n };\n\n switch (chunk.type) {\n case 'text-delta':\n if (chunk.delta) {\n callbacks.onTextDelta(chunk.delta);\n }\n break;\n\n // AI SDK v6: tool-input-available fires when tool input is fully parsed\n case 'tool-input-available':\n if (chunk.toolCallId && chunk.toolName) {\n callbacks.onToolCall(\n chunk.toolCallId,\n chunk.toolName,\n (chunk.input as Record<string, unknown>) ?? {},\n chunk.providerMetadata\n );\n }\n break;\n\n // AI SDK v6: tool-output-available fires when tool execution completes\n case 'tool-output-available':\n if (chunk.toolCallId) {\n callbacks.onToolResult(chunk.toolCallId, chunk.output);\n }\n break;\n\n // Legacy event names (AI SDK v5 compat)\n case 'tool-call':\n if (chunk.toolCallId && chunk.toolName) {\n callbacks.onToolCall(\n chunk.toolCallId,\n chunk.toolName,\n (chunk.input as Record<string, unknown>) ?? {}\n );\n }\n break;\n\n case 'tool-result':\n if (chunk.toolCallId) {\n callbacks.onToolResult(chunk.toolCallId, chunk.output);\n }\n break;\n\n case 'error':\n callbacks.onError(chunk.errorText ?? chunk.reason ?? 'Unknown error');\n break;\n\n case 'abort':\n callbacks.onError(chunk.reason ?? 'Response aborted');\n break;\n\n // Ignore: start, finish, text-start, text-end, start-step, finish-step,\n // tool-input-start, tool-input-delta\n default:\n break;\n }\n } catch {\n // Skip malformed JSON silently\n }\n }\n}\n","export type ToolHandler = (args: Record<string, unknown>) => Promise<Record<string, unknown>>;\nexport type ToolHandlerMap = Record<string, ToolHandler>;\n\nconst handlers: ToolHandlerMap = {};\n\nexport function registerTools(newHandlers: ToolHandlerMap): void {\n Object.assign(handlers, newHandlers);\n}\n\nexport function getHandler(name: string): ToolHandler | undefined {\n return handlers[name];\n}\n\nexport function hasHandler(name: string): boolean {\n return Object.hasOwn(handlers, name);\n}\n","import type { Message } from './state-machine';\n\nconst KEY_PREFIX = 'og2-chat-';\nconst END_USER_SESSION_PREFIX = 'og2-enduser-session-';\nconst CONVERSATION_ID_PREFIX = 'og2-conv-';\n\nfunction getKey(productId: string): string {\n return `${KEY_PREFIX}${productId}`;\n}\n\nfunction getEndUserSessionKey(productId: string): string {\n return `${END_USER_SESSION_PREFIX}${productId}`;\n}\n\nfunction randomId(): string {\n const uuid = globalThis.crypto?.randomUUID?.();\n if (uuid) return uuid;\n // Fallback for older environments\n return `${Date.now()}-${Math.random().toString(16).slice(2)}`;\n}\n\nexport function getOrCreateEndUserSessionId(productId: string): string {\n const key = getEndUserSessionKey(productId);\n try {\n const existing = localStorage.getItem(key);\n if (existing && existing.trim()) return existing;\n const created = `sess_${randomId()}`;\n localStorage.setItem(key, created);\n return created;\n } catch {\n return `sess_${randomId()}`;\n }\n}\n\nexport function clearEndUserSessionId(productId: string): void {\n try {\n localStorage.removeItem(getEndUserSessionKey(productId));\n } catch {\n // fail silently\n }\n}\n\nexport function saveMessages(productId: string, messages: Message[]): void {\n try {\n // Strip streaming flags before persisting\n const cleaned = messages.map(({ isStreaming, ...rest }) => rest);\n sessionStorage.setItem(getKey(productId), JSON.stringify(cleaned));\n } catch {\n // sessionStorage might be unavailable or full — fail silently\n }\n}\n\nexport function loadMessages(productId: string): Message[] {\n try {\n const raw = sessionStorage.getItem(getKey(productId));\n if (!raw) return [];\n return JSON.parse(raw) as Message[];\n } catch {\n return [];\n }\n}\n\nexport function clearMessages(productId: string): void {\n try {\n sessionStorage.removeItem(getKey(productId));\n sessionStorage.removeItem(`${CONVERSATION_ID_PREFIX}${productId}`);\n } catch {\n // fail silently\n }\n}\n\nexport function saveConversationId(productId: string, conversationId: string): void {\n try {\n sessionStorage.setItem(`${CONVERSATION_ID_PREFIX}${productId}`, conversationId);\n } catch {\n // fail silently\n }\n}\n\nexport function loadConversationId(productId: string): string | null {\n try {\n return sessionStorage.getItem(`${CONVERSATION_ID_PREFIX}${productId}`);\n } catch {\n return null;\n }\n}\n\nexport function clearConversationId(productId: string): void {\n try {\n sessionStorage.removeItem(`${CONVERSATION_ID_PREFIX}${productId}`);\n } catch {\n // fail silently\n }\n}\n","/**\n * Lightweight DOM snapshot for screen context.\n * Captures just enough for an LLM to understand the current page.\n *\n * Current caps (roughly ~500-1000 tokens per snapshot):\n * - Headings (h1-h3): max 10\n * - Interactive elements (buttons, links, inputs): max 30, labels truncated to 80 chars\n * - Visible text (from <main> or <body>): max 500 chars\n * - Skips: hidden elements, input values (PII), widget's own DOM, scripts/styles/nav/header/footer\n */\n\nexport interface InteractiveElement {\n tag: string;\n text: string;\n type?: string;\n href?: string;\n}\n\nexport interface ScreenContext {\n url: string;\n title: string;\n headings: string[];\n interactiveElements: InteractiveElement[];\n visibleText: string;\n}\n\nconst MAX_HEADINGS = 10;\nconst MAX_INTERACTIVE = 30;\nconst MAX_VISIBLE_TEXT = 500;\n\nconst WIDGET_ROOT_ID = 'og2-widget-root';\n\n/** Tags to skip when extracting visible text */\nconst SKIP_TEXT_TAGS = new Set(['SCRIPT', 'STYLE', 'NOSCRIPT', 'SVG', 'NAV', 'HEADER', 'FOOTER']);\n\n/** Interactive element selectors */\nconst INTERACTIVE_SELECTOR = 'a[href], button, input, select, textarea';\n\nfunction isVisible(el: Element): boolean {\n if (!(el instanceof HTMLElement)) return false;\n // checkVisibility walks the full ancestor chain (Chrome 105+, Firefox 124+)\n if (typeof el.checkVisibility === 'function') {\n return el.checkVisibility({ checkOpacity: false, checkVisibilityCSS: true });\n }\n // Fallback: walk ancestors manually to catch hidden parents\n let node: HTMLElement | null = el;\n while (node) {\n if (node.hidden || node.getAttribute('aria-hidden') === 'true') return false;\n const style = getComputedStyle(node);\n if (style.display === 'none' || style.visibility === 'hidden') return false;\n node = node.parentElement;\n }\n return true;\n}\n\nfunction isInsideWidget(el: Element): boolean {\n return !!el.closest(`#${WIDGET_ROOT_ID}`);\n}\n\nfunction getLabel(el: Element): string {\n if (el instanceof HTMLInputElement || el instanceof HTMLSelectElement || el instanceof HTMLTextAreaElement) {\n // Try associated label\n if (el.id) {\n const label = document.querySelector(`label[for=\"${CSS.escape(el.id)}\"]`);\n if (label?.textContent?.trim()) return label.textContent.trim();\n }\n // Fallback to aria-label, placeholder, or name\n return (\n el.getAttribute('aria-label') ||\n (el as HTMLInputElement).placeholder ||\n el.getAttribute('name') ||\n ''\n );\n }\n\n // For buttons and links: innerText, aria-label, or title\n const text = (el as HTMLElement).innerText?.trim();\n if (text) return text;\n return el.getAttribute('aria-label') || el.getAttribute('title') || '';\n}\n\nfunction truncate(str: string, max: number): string {\n if (str.length <= max) return str;\n return str.slice(0, max - 3) + '...';\n}\n\nexport function captureDOM(): ScreenContext {\n // 1. Page metadata — pathname only, avoid leaking host/environment info\n const url = window.location.pathname + window.location.search;\n const title = document.title || '';\n\n // 2. Headings (h1-h3)\n const headingEls = document.querySelectorAll('h1, h2, h3');\n const headings: string[] = [];\n for (const h of headingEls) {\n if (headings.length >= MAX_HEADINGS) break;\n if (isInsideWidget(h) || !isVisible(h)) continue;\n const text = (h as HTMLElement).innerText?.trim();\n if (text && !headings.includes(text)) {\n headings.push(text);\n }\n }\n\n // 3. Interactive elements\n const interactiveEls = document.querySelectorAll(INTERACTIVE_SELECTOR);\n const interactiveElements: InteractiveElement[] = [];\n const seenLabels = new Set<string>();\n\n for (const el of interactiveEls) {\n if (interactiveElements.length >= MAX_INTERACTIVE) break;\n if (isInsideWidget(el) || !isVisible(el)) continue;\n\n const label = getLabel(el);\n if (!label) continue;\n\n // Deduplicate by label+tag\n const key = `${el.tagName}:${label}`;\n if (seenLabels.has(key)) continue;\n seenLabels.add(key);\n\n const item: InteractiveElement = {\n tag: el.tagName.toLowerCase(),\n text: truncate(label, 80),\n };\n\n if (el instanceof HTMLInputElement) {\n item.type = el.type;\n }\n if (el instanceof HTMLAnchorElement && el.href) {\n // Store relative path to avoid leaking full URLs\n try {\n const parsed = new URL(el.href);\n item.href = parsed.pathname + parsed.search;\n } catch {\n item.href = el.getAttribute('href') || undefined;\n }\n }\n\n interactiveElements.push(item);\n }\n\n // 4. Visible text from main content\n const mainEl = document.querySelector('main') || document.body;\n let visibleText = '';\n\n function walkText(node: Node) {\n if (visibleText.length >= MAX_VISIBLE_TEXT) return;\n\n if (node.nodeType === Node.TEXT_NODE) {\n const text = node.textContent?.trim();\n if (text) {\n visibleText += (visibleText ? ' ' : '') + text;\n }\n return;\n }\n\n if (node.nodeType !== Node.ELEMENT_NODE) return;\n const el = node as Element;\n\n if (SKIP_TEXT_TAGS.has(el.tagName)) return;\n if (isInsideWidget(el)) return;\n if (!isVisible(el)) return;\n\n for (const child of el.childNodes) {\n walkText(child);\n if (visibleText.length >= MAX_VISIBLE_TEXT) return;\n }\n }\n\n walkText(mainEl);\n visibleText = truncate(visibleText.replace(/\\s+/g, ' ').trim(), MAX_VISIBLE_TEXT);\n\n return { url, title, headings, interactiveElements, visibleText };\n}\n","/**\n * Substitute dynamic segments in a route pattern with actual values.\n * e.g., \"/users/:userId/profile\" + { userId: \"42\" } => \"/users/42/profile\"\n */\nfunction substituteParams(route: string, params?: Record<string, string>): string {\n if (!params) return route;\n let result = route;\n for (const [key, value] of Object.entries(params)) {\n const escapedKey = key.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n result = result.replace(new RegExp(`:${escapedKey}(?!\\\\w)`, 'g'), encodeURIComponent(value));\n }\n return result;\n}\n\nexport type NavigateFn = (path: string) => void;\n\nfunction tryAnchorClick(path: string): boolean {\n const normalized = path.replace(/\\/$/, '') || '/';\n const anchors = document.querySelectorAll('a[href]');\n for (const el of anchors) {\n const anchor = el as HTMLAnchorElement;\n const href = anchor.pathname?.replace(/\\/$/, '') || '/';\n if (anchor.origin === window.location.origin && href === normalized) {\n anchor.click();\n console.log(`[Ourguide] Navigated via anchor click: ${path}`);\n return true;\n }\n }\n return false;\n}\n\nfunction tryFrameworkRouter(path: string): boolean {\n const win = window as unknown as Record<string, unknown>;\n\n // Next.js\n const next = win.next as { router?: { push?: (path: string) => void } } | undefined;\n if (next?.router?.push) {\n next.router.push(path);\n console.log(`[Ourguide] Navigated via Next.js router: ${path}`);\n return true;\n }\n\n // Nuxt / Vue\n const nuxt = win.__NUXT__ as Record<string, unknown> | undefined;\n if (nuxt) {\n const nuxtApp = win.$nuxt as { $router?: { push?: (path: string) => void } } | undefined;\n if (nuxtApp?.$router?.push) {\n nuxtApp.$router.push(path);\n console.log(`[Ourguide] Navigated via Vue/Nuxt router: ${path}`);\n return true;\n }\n }\n\n return false;\n}\n\nfunction tryPushState(path: string): boolean {\n try {\n window.history.pushState({}, '', path);\n window.dispatchEvent(new PopStateEvent('popstate', { state: {} }));\n console.log(`[Ourguide] Navigated via pushState: ${path}`);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Navigate to a route using a four-tier cascade:\n * 1. Consumer-provided navigate fn (e.g. Next.js router.push passed as prop)\n * 2. Click matching anchor in the DOM\n * 3. Auto-detect framework router (Next.js / Nuxt / Vue)\n * 4. pushState + popstate event\n * 5. Hard navigation fallback\n */\nexport async function navigateTo(\n route: string,\n params?: Record<string, string>,\n navigateFn?: NavigateFn,\n): Promise<boolean> {\n const path = substituteParams(route, params);\n\n // Tier 1: explicit navigate prop\n if (navigateFn) {\n navigateFn(path);\n console.log(`[Ourguide] Navigated via navigate prop: ${path}`);\n return true;\n }\n\n // Tier 2: anchor click\n if (tryAnchorClick(path)) return true;\n\n // Tier 3: framework router auto-detection\n if (tryFrameworkRouter(path)) return true;\n\n // Tier 4: pushState\n if (tryPushState(path)) return true;\n\n // Tier 5: hard navigation (always works)\n console.log(`[Ourguide] Navigated via hard navigation: ${path}`);\n window.location.href = path;\n return true;\n}\n","import { sendMessage, fetchConfig, identifyEndUser, resetEndUser, fileToBase64 } from './api';\nimport type { AnyMessage, ChatMessage, FileAttachment, ProductConfig, SendMessageResult } from './api';\nimport { widgetReducer, initialState, generateId } from './state-machine';\nimport type { Message, ToolCallInfo, WidgetState, WidgetAction } from './state-machine';\nimport { parseDataStream } from './stream-parser';\nimport type { StreamCallbacks } from './stream-parser';\nimport { registerTools, hasHandler, getHandler } from './client-tool-registry';\nimport type { ToolHandler, ToolHandlerMap } from './client-tool-registry';\nimport { saveMessages, loadMessages, clearMessages, getOrCreateEndUserSessionId, clearEndUserSessionId, saveConversationId, loadConversationId } from './session';\nimport { captureDOM } from './dom-capture';\nimport type { ScreenContext } from './dom-capture';\nimport { renderMarkdown } from './markdown';\nimport { navigateTo } from './navigator';\nimport type { NavigateFn } from './navigator';\nimport { applyAppearance, applyBubble } from './appearance';\n\nexport interface OurguideClientOptions {\n productId: string;\n apiUrl: string;\n}\n\nexport interface OurguideClientCallbacks {\n onStateChange?: (state: WidgetState) => void;\n onMessage?: (message: Message) => void;\n onToolCall?: (toolCall: ToolCallInfo) => void;\n onToolResult?: (toolName: string, result: unknown) => void;\n onError?: (error: string) => void;\n onConfigLoaded?: (config: ProductConfig) => void;\n}\n\nexport class OurguideClient {\n readonly productId: string;\n readonly apiUrl: string;\n\n private state: WidgetState = initialState;\n private conversationId: string | null = null;\n private callbacks: OurguideClientCallbacks = {};\n\n constructor(options: OurguideClientOptions) {\n this.productId = options.productId;\n this.apiUrl = options.apiUrl;\n\n this.conversationId = loadConversationId(this.productId);\n const saved = loadMessages(this.productId);\n if (saved.length > 0) {\n this.dispatch({ type: 'LOAD_MESSAGES', messages: saved });\n }\n\n registerTools({\n capture_screen: async () => {\n const ctx = captureDOM();\n return ctx as unknown as Record<string, unknown>;\n },\n });\n }\n\n on(callbacks: OurguideClientCallbacks): void {\n this.callbacks = { ...this.callbacks, ...callbacks };\n }\n\n getState(): WidgetState {\n return this.state;\n }\n\n getMessages(): Message[] {\n return this.state.messages;\n }\n\n dispatch(action: WidgetAction): void {\n this.state = widgetReducer(this.state, action);\n this.callbacks.onStateChange?.(this.state);\n }\n\n open(): void {\n this.dispatch({ type: 'OPEN' });\n }\n\n close(): void {\n this.dispatch({ type: 'CLOSE' });\n }\n\n registerTools(tools: ToolHandlerMap): void {\n registerTools(tools);\n }\n\n async loadConfig(): Promise<ProductConfig> {\n const config = await fetchConfig(this.apiUrl, this.productId);\n this.callbacks.onConfigLoaded?.(config);\n return config;\n }\n\n async identify(token: string, name?: string): Promise<void> {\n const sessionId = getOrCreateEndUserSessionId(this.productId);\n await identifyEndUser(this.apiUrl, this.productId, sessionId, token, name);\n }\n\n resetUser(): void {\n const sessionId = getOrCreateEndUserSessionId(this.productId);\n resetEndUser(this.apiUrl, this.productId, sessionId).catch(() => {});\n clearEndUserSessionId(this.productId);\n clearMessages(this.productId);\n this.conversationId = null;\n this.dispatch({ type: 'FINISH_STREAMING' });\n this.dispatch({ type: 'CLEAR_MESSAGES' });\n }\n\n newConversation(): { title: string; preview: string; messages: Message[] } | null {\n const msgs = this.state.messages;\n let saved: { title: string; preview: string; messages: Message[] } | null = null;\n if (msgs.length > 0) {\n const first = msgs.find((m) => m.role === 'user');\n saved = {\n title: first ? first.content.slice(0, 30) : 'Conversation',\n preview: msgs[msgs.length - 1].content.slice(0, 50),\n messages: [...msgs],\n };\n }\n clearMessages(this.productId);\n this.conversationId = null;\n this.dispatch({ type: 'CLEAR_MESSAGES' });\n return saved;\n }\n\n async sendMessage(\n text: string,\n files?: File[],\n navigateFn?: NavigateFn,\n ): Promise<void> {\n const trimmed = text.trim();\n const filesToSend = files ? [...files] : [];\n if ((!trimmed && filesToSend.length === 0) || this.state.isStreaming) return;\n\n const fileLabel = filesToSend.length > 0 ? filesToSend.map((f) => `[${f.name}]`).join(' ') : '';\n const displayContent = [trimmed, fileLabel].filter(Boolean).join(' ');\n this.dispatch({ type: 'ADD_USER_MESSAGE', id: generateId(), content: displayContent });\n\n let fileAttachments: FileAttachment[] = [];\n if (filesToSend.length > 0) {\n try {\n fileAttachments = await Promise.all(filesToSend.map(async (f) => ({ name: f.name, type: f.type, data: await fileToBase64(f) })));\n } catch {\n this.dispatch({ type: 'SET_ERROR', error: 'Failed to read attached files' });\n return;\n }\n }\n\n const apiMessages: ChatMessage[] = [\n ...this.state.messages.map((m) => ({ role: m.role, content: m.content })),\n { role: 'user' as const, content: trimmed || 'Please review the attached file(s).' },\n ];\n\n this.dispatch({ type: 'START_STREAMING', id: generateId() });\n const pendingToolCalls = new Map<string, ToolCallInfo>();\n const pendingClientCalls = new Map<string, { name: string; args: Record<string, unknown>; providerMetadata?: Record<string, unknown> }>();\n\n const makeCallbacks = (allowClientTools: boolean) => ({\n onTextDelta: (delta: string) => this.dispatch({ type: 'APPEND_TEXT', text: delta }),\n onToolCall: (id: string, name: string, args: Record<string, unknown>, providerMetadata?: Record<string, unknown>) => {\n const tc: ToolCallInfo = { id, name, args, status: 'calling', providerMetadata };\n pendingToolCalls.set(id, tc);\n this.dispatch({ type: 'ADD_TOOL_CALL', toolCall: tc });\n this.callbacks.onToolCall?.(tc);\n if (allowClientTools && hasHandler(name)) pendingClientCalls.set(id, { name, args, providerMetadata });\n },\n onToolResult: (id: string, result: unknown) => {\n this.dispatch({ type: 'SET_TOOL_RESULT', toolCallId: id, result });\n const tc = pendingToolCalls.get(id);\n if (tc) this.callbacks.onToolResult?.(tc.name, result);\n if (tc?.name === 'navigate_to_page') {\n const nav = result as { route?: string | null; confidence?: number; params?: Record<string, string> };\n if (nav.route && (nav.confidence ?? 0) >= 0.5) navigateTo(nav.route, nav.params, navigateFn);\n }\n },\n onError: (error: string) => {\n this.dispatch({ type: 'SET_ERROR', error });\n this.callbacks.onError?.(error);\n },\n });\n\n try {\n const endUserSessionId = getOrCreateEndUserSessionId(this.productId);\n const { stream, conversationId: retConvId } = await sendMessage(this.apiUrl, this.productId, apiMessages, endUserSessionId, this.conversationId || undefined, fileAttachments);\n if (retConvId && !this.conversationId) {\n this.conversationId = retConvId;\n saveConversationId(this.productId, retConvId);\n }\n\n let hadError = false;\n await parseDataStream(stream, { ...makeCallbacks(true), onError: (e) => { hadError = true; this.dispatch({ type: 'SET_ERROR', error: e }); this.callbacks.onError?.(e); }, onFinish: () => {} });\n if (hadError || pendingClientCalls.size === 0) { if (!hadError) this.dispatch({ type: 'FINISH_STREAMING' }); this.persistMessages(); return; }\n\n const toolResults: Array<{ toolCallId: string; toolName: string; args: Record<string, unknown>; result: Record<string, unknown>; providerMetadata?: Record<string, unknown> }> = [];\n for (const [id, { name, args, providerMetadata }] of pendingClientCalls) {\n let result: Record<string, unknown>;\n try { result = await getHandler(name)!(args); } catch (err) { result = { status: 'error', error: err instanceof Error ? err.message : 'Handler failed' }; }\n this.dispatch({ type: 'SET_TOOL_RESULT', toolCallId: id, result });\n this.callbacks.onToolResult?.(name, result);\n toolResults.push({ toolCallId: id, toolName: name, args, result, providerMetadata });\n }\n\n const contMessages: AnyMessage[] = [\n ...apiMessages,\n { role: 'assistant', content: toolResults.map((tr) => ({ type: 'tool-call' as const, toolCallId: tr.toolCallId, toolName: tr.toolName, input: tr.args, ...(tr.providerMetadata ? { providerOptions: tr.providerMetadata } : {}) })) },\n { role: 'tool', content: toolResults.map((tr) => ({ type: 'tool-result' as const, toolCallId: tr.toolCallId, toolName: tr.toolName, output: { type: 'json' as const, value: tr.result } })) },\n ];\n const { stream: contStream } = await sendMessage(this.apiUrl, this.productId, contMessages, undefined, this.conversationId || undefined);\n await parseDataStream(contStream, { ...makeCallbacks(false), onFinish: () => this.dispatch({ type: 'FINISH_STREAMING' }) });\n } catch (err) {\n this.dispatch({ type: 'FINISH_STREAMING' });\n const msg = err instanceof Error ? err.message : 'Something went wrong';\n this.dispatch({ type: 'SET_ERROR', error: msg });\n this.callbacks.onError?.(msg);\n }\n\n this.persistMessages();\n }\n\n private persistMessages(): void {\n if (!this.state.isStreaming && this.state.messages.length > 0) {\n saveMessages(this.productId, this.state.messages);\n }\n }\n}\n","/**\n * Lightweight markdown-to-HTML renderer for the chat widget.\n * Handles the most common patterns produced by LLMs without external dependencies.\n * ~2-3KB minified.\n */\n\nfunction escapeHtml(text: string): string {\n return text\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n}\n\n/** Apply inline formatting (code, bold, italic, links) to already-escaped text. */\nfunction applyInline(text: string): string {\n let result = text;\n\n // Inline code (must come before bold/italic to avoid conflicts)\n result = result.replace(/`([^`\\n]+)`/g, '<code class=\"og2-md-inline-code\">$1</code>');\n\n // Bold (**text** or __text__)\n result = result.replace(/\\*\\*(.+?)\\*\\*/g, '<strong>$1</strong>');\n result = result.replace(/__(.+?)__/g, '<strong>$1</strong>');\n\n // Italic (*text* or _text_) — avoid matching inside words for underscores\n result = result.replace(/\\*(.+?)\\*/g, '<em>$1</em>');\n result = result.replace(/(?<!\\w)_(.+?)_(?!\\w)/g, '<em>$1</em>');\n\n // Links [text](url) — only allow safe URL schemes\n result = result.replace(\n /\\[([^\\]]+)\\]\\(([^)]+)\\)/g,\n (_, linkText, url) => {\n const trimmed = url.trim();\n if (/^(https?:\\/\\/|mailto:|\\/|#)/i.test(trimmed)) {\n return `<a class=\"og2-md-link\" href=\"${trimmed}\" target=\"_blank\" rel=\"noopener noreferrer\">${linkText}</a>`;\n }\n return linkText;\n },\n );\n\n return result;\n}\n\nexport function renderMarkdown(text: string): string {\n if (!text) return '';\n\n // 1. Extract fenced code blocks to protect from all processing\n const codeBlocks: string[] = [];\n let processed = text.replace(/```(\\w*)\\n([\\s\\S]*?)```/g, (_, lang, code) => {\n const idx = codeBlocks.length;\n const escaped = escapeHtml(code.replace(/\\n$/, ''));\n const langAttr = lang ? ` data-lang=\"${escapeHtml(lang)}\"` : '';\n codeBlocks.push(\n `<pre class=\"og2-md-pre\"${langAttr}><code class=\"og2-md-code\">${escaped}</code></pre>`,\n );\n return `\\x00CB${idx}\\x00`;\n });\n\n // 2. Escape HTML in remaining text\n processed = escapeHtml(processed);\n\n // 3. Process blocks (detects structure before inline formatting touches markers)\n processed = processBlocks(processed);\n\n // 4. Restore code blocks\n processed = processed.replace(/\\x00CB(\\d+)\\x00/g, (_, idx) => codeBlocks[parseInt(idx)]);\n\n return processed;\n}\n\ntype LineType = 'ul' | 'ol' | 'heading' | 'table' | 'text';\ntype Segment = { type: LineType; lines: string[] };\n\n/** Classify a single line by its markdown structure. */\nfunction classifyLine(line: string): LineType {\n if (/^[\\s]*[-*]\\s/.test(line)) return 'ul';\n if (/^[\\s]*\\d+\\.\\s/.test(line)) return 'ol';\n if (/^#{1,4}\\s+/.test(line)) return 'heading';\n if (/^\\s*\\|/.test(line)) return 'table';\n return 'text';\n}\n\n/** Group consecutive lines of the same type into segments. */\nfunction segmentLines(lines: string[]): Segment[] {\n const segments: Segment[] = [];\n let current: Segment | null = null;\n\n for (const line of lines) {\n const type = classifyLine(line);\n if (current && current.type === type) {\n current.lines.push(line);\n } else {\n if (current) segments.push(current);\n current = { type, lines: [line] };\n }\n }\n if (current) segments.push(current);\n return segments;\n}\n\n/** Render a single segment into HTML. */\nfunction renderSegment(segment: Segment): string {\n switch (segment.type) {\n case 'ul': {\n const items = segment.lines\n .map((l) => `<li>${applyInline(l.replace(/^[\\s]*[-*]\\s/, ''))}</li>`)\n .join('');\n return `<ul class=\"og2-md-list\">${items}</ul>`;\n }\n case 'ol': {\n const items = segment.lines\n .map((l) => `<li>${applyInline(l.replace(/^[\\s]*\\d+\\.\\s/, ''))}</li>`)\n .join('');\n const startNum = segment.lines[0].match(/^[\\s]*(\\d+)\\./)?.[1] ?? '1';\n const startAttr = startNum !== '1' ? ` start=\"${startNum}\"` : '';\n return `<ol class=\"og2-md-list\"${startAttr}>${items}</ol>`;\n }\n case 'heading':\n return segment.lines\n .map((line) => {\n const m = line.match(/^(#{1,4})\\s+(.+)$/)!;\n const level = m[1].length;\n return `<h${level + 2} class=\"og2-md-heading\">${applyInline(m[2])}</h${level + 2}>`;\n })\n .join('');\n case 'table':\n return renderTable(segment.lines);\n case 'text':\n return `<p>${segment.lines.map((l) => applyInline(l)).join('<br>')}</p>`;\n }\n}\n\n/** Split a table row into cell contents, trimming outer pipes and whitespace. */\nfunction parseTableRow(line: string): string[] {\n const trimmed = line.trim();\n // Strip leading/trailing pipes then split on |\n const inner = trimmed.replace(/^\\|/, '').replace(/\\|$/, '');\n return inner.split('|').map((c) => c.trim());\n}\n\ntype Alignment = 'left' | 'center' | 'right';\n\n/** Parse alignment from separator cells like :---, :---:, ---: */\nfunction parseAlignment(cell: string): Alignment {\n const t = cell.trim();\n const left = t.startsWith(':');\n const right = t.endsWith(':');\n if (left && right) return 'center';\n if (right) return 'right';\n return 'left';\n}\n\n/** Check if a line is a valid table separator (e.g. |---|:---:|---:| ) */\nfunction isSeparatorRow(line: string): boolean {\n const cells = parseTableRow(line);\n return cells.length > 0 && cells.every((c) => /^:?-{1,}:?$/.test(c.trim()));\n}\n\n/**\n * Render a group of table-classified lines into an HTML table.\n * Falls back to text paragraphs if the structure is invalid.\n */\nfunction renderTable(lines: string[]): string {\n // A valid table needs at least 2 rows (header + separator) and\n // the second line must be a separator row\n if (lines.length < 2 || !isSeparatorRow(lines[1])) {\n // Not a valid table — render as plain text\n return `<p>${lines.map((l) => applyInline(l)).join('<br>')}</p>`;\n }\n\n const headerCells = parseTableRow(lines[0]);\n const alignments = parseTableRow(lines[1]).map(parseAlignment);\n const bodyRows = lines.slice(2);\n\n const alignAttr = (i: number) => {\n const a = alignments[i];\n return a && a !== 'left' ? ` style=\"text-align:${a}\"` : '';\n };\n\n const thead = '<thead><tr>' +\n headerCells.map((c, i) => `<th${alignAttr(i)}>${applyInline(c)}</th>`).join('') +\n '</tr></thead>';\n\n let tbody = '';\n if (bodyRows.length > 0) {\n const rows = bodyRows.map((row) => {\n const cells = parseTableRow(row);\n return '<tr>' +\n headerCells.map((_, i) => `<td${alignAttr(i)}>${applyInline(cells[i] ?? '')}</td>`).join('') +\n '</tr>';\n }).join('');\n tbody = `<tbody>${rows}</tbody>`;\n }\n\n return `<table class=\"og2-md-table\">${thead}${tbody}</table>`;\n}\n\nfunction processBlocks(text: string): string {\n const paragraphs = text.split(/\\n{2,}/);\n const result: string[] = [];\n\n for (const para of paragraphs) {\n const trimmed = para.trim();\n if (!trimmed) continue;\n\n // Preserve code block placeholders\n if (/^\\x00CB\\d+\\x00$/.test(trimmed)) {\n result.push(trimmed);\n continue;\n }\n\n const lines = trimmed.split('\\n');\n const segments = segmentLines(lines);\n\n for (const segment of segments) {\n result.push(renderSegment(segment));\n }\n }\n\n return result.join('');\n}\n","const SHADOW_MAP: Record<string, string> = {\n none: 'none',\n soft: '0 2px 8px rgba(0,0,0,0.08)',\n medium: '0 4px 16px rgba(0,0,0,0.12)',\n strong: '0 8px 32px rgba(0,0,0,0.18)',\n 'extra-strong': '0 16px 48px rgba(0,0,0,0.28)',\n};\n\nexport function applyAppearance(\n el: HTMLElement | null,\n appearance: { colors?: Record<string, string>; typography?: Record<string, string | number>; dimensions?: Record<string, number>; shadow?: string } | undefined,\n) {\n if (!el || !appearance) return;\n const set = (prop: string, val: string | number | undefined) => {\n if (val !== undefined && val !== null && val !== '') {\n el.style.setProperty(prop, String(val));\n }\n };\n const { colors, typography, dimensions, shadow } = appearance;\n if (colors) {\n set('--og2-bg', colors.background);\n set('--og2-border', colors.border);\n set('--og2-text', colors.text);\n set('--og2-messages-bg', colors.messagesBackground);\n set('--og2-agent-bubble', colors.agentBubble);\n set('--og2-agent-bubble-text', colors.agentBubbleText);\n set('--og2-user-bubble', colors.userBubble);\n set('--og2-user-bubble-text', colors.userBubbleText);\n set('--og2-user-bubble-border', colors.userBubbleBorder);\n set('--og2-send-bg', colors.sendButtonBackground);\n set('--og2-send-icon', colors.sendButtonIcon);\n set('--og2-send-inactive-bg', colors.sendButtonInactiveBackground);\n }\n if (typography) {\n set('--og2-font', typography.fontFamily);\n set('--og2-font-weight', typography.fontWeight);\n set('--og2-line-height', typography.lineHeight);\n if (typeof typography.fontSize === 'number') set('--og2-font-size', `${typography.fontSize}px`);\n if (typeof typography.headerSize === 'number') set('--og2-header-size', `${typography.headerSize}px`);\n if (typeof typography.letterSpacing === 'number') set('--og2-letter-spacing', `${typography.letterSpacing}px`);\n }\n if (dimensions) {\n if (dimensions.width !== undefined) set('--og2-width', `${dimensions.width}px`);\n if (dimensions.maxHeight !== undefined) set('--og2-height', `${dimensions.maxHeight}px`);\n if (dimensions.borderRadius !== undefined) set('--og2-radius', `${dimensions.borderRadius}px`);\n if (dimensions.padding !== undefined) set('--og2-padding', `${dimensions.padding}px`);\n }\n if (shadow && SHADOW_MAP[shadow]) {\n set('--og2-shadow', SHADOW_MAP[shadow]);\n }\n}\n\nexport function applyBubble(\n el: HTMLElement | null,\n bubble: { background?: string; border?: string; icon?: string; buttonSize?: number; iconSize?: number; right?: number; bottom?: number } | undefined,\n) {\n if (!el || !bubble) return;\n const set = (prop: string, val: string | number | undefined) => {\n if (val !== undefined && val !== null && val !== '') {\n el.style.setProperty(prop, String(val));\n }\n };\n if (bubble.background) set('--og2-bubble-bg', bubble.background);\n if (bubble.border) set('--og2-bubble-border', bubble.border);\n if (bubble.icon) set('--og2-bubble-icon', bubble.icon);\n if (bubble.buttonSize) set('--og2-bubble-size', `${bubble.buttonSize}px`);\n if (bubble.iconSize) set('--og2-bubble-icon-size', `${bubble.iconSize}px`);\n if (bubble.right !== undefined) set('--og2-bubble-right', `${bubble.right}px`);\n if (bubble.bottom !== undefined) set('--og2-bubble-bottom', `${bubble.bottom}px`);\n}\n"],"names":["fileToBase64","file","resolve","reject","reader","result","fetchConfig","apiUrl","productId","url","res","data","err","sendMessage","messages","endUserSessionId","conversationId","attachments","body","identifyEndUser","token","name","resetEndUser","initialState","generateId","widgetReducer","state","action","_a","msgs","last","toolCalls","tc","parseDataStream","callbacks","decoder","buffer","done","value","parts","part","processSSEEvent","message","event","lines","line","payload","chunk","handlers","registerTools","newHandlers","getHandler","hasHandler","KEY_PREFIX","END_USER_SESSION_PREFIX","CONVERSATION_ID_PREFIX","getKey","getEndUserSessionKey","randomId","_b","uuid","getOrCreateEndUserSessionId","key","existing","created","clearEndUserSessionId","saveMessages","cleaned","isStreaming","rest","loadMessages","raw","clearMessages","saveConversationId","loadConversationId","MAX_HEADINGS","MAX_INTERACTIVE","MAX_VISIBLE_TEXT","WIDGET_ROOT_ID","SKIP_TEXT_TAGS","INTERACTIVE_SELECTOR","isVisible","el","node","style","isInsideWidget","getLabel","label","text","truncate","str","max","captureDOM","title","headingEls","headings","h","interactiveEls","interactiveElements","seenLabels","item","parsed","mainEl","visibleText","walkText","child","substituteParams","route","params","escapedKey","tryAnchorClick","path","normalized","anchors","anchor","href","tryFrameworkRouter","win","next","nuxtApp","tryPushState","navigateTo","navigateFn","OurguideClient","options","saved","tools","config","sessionId","first","m","files","_c","_d","trimmed","filesToSend","fileLabel","f","displayContent","fileAttachments","apiMessages","pendingToolCalls","pendingClientCalls","makeCallbacks","allowClientTools","delta","id","args","providerMetadata","nav","error","stream","retConvId","hadError","e","toolResults","contMessages","tr","contStream","msg","escapeHtml","applyInline","_","linkText","renderMarkdown","codeBlocks","processed","lang","code","idx","escaped","langAttr","processBlocks","classifyLine","segmentLines","segments","current","type","renderSegment","segment","l","items","startNum","level","renderTable","parseTableRow","c","parseAlignment","cell","left","right","isSeparatorRow","cells","headerCells","alignments","bodyRows","alignAttr","i","thead","tbody","row","paragraphs","para","SHADOW_MAP","applyAppearance","appearance","set","prop","val","colors","typography","dimensions","shadow","applyBubble","bubble"],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@ourguide-ai/client",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Ourguide client SDK for communicating with the Ourguide API",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"author": "Ourguide",
|
|
8
|
+
"repository": {
|
|
9
|
+
"type": "git",
|
|
10
|
+
"url": "https://github.com/Ourguide-ai/Ourguide-B2B",
|
|
11
|
+
"directory": "packages/client"
|
|
12
|
+
},
|
|
13
|
+
"keywords": ["ourguide", "client", "sdk", "copilot"],
|
|
14
|
+
"publishConfig": {
|
|
15
|
+
"access": "public"
|
|
16
|
+
},
|
|
17
|
+
"main": "./dist/index.cjs",
|
|
18
|
+
"module": "./dist/index.js",
|
|
19
|
+
"types": "./dist/index.d.ts",
|
|
20
|
+
"exports": {
|
|
21
|
+
".": {
|
|
22
|
+
"import": {
|
|
23
|
+
"types": "./dist/index.d.ts",
|
|
24
|
+
"default": "./dist/index.js"
|
|
25
|
+
},
|
|
26
|
+
"require": {
|
|
27
|
+
"types": "./dist/index.d.cts",
|
|
28
|
+
"default": "./dist/index.cjs"
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
},
|
|
32
|
+
"files": [
|
|
33
|
+
"dist"
|
|
34
|
+
],
|
|
35
|
+
"scripts": {
|
|
36
|
+
"build": "vite build",
|
|
37
|
+
"dev": "vite build --watch",
|
|
38
|
+
"prepublishOnly": "npm run build"
|
|
39
|
+
},
|
|
40
|
+
"dependencies": {},
|
|
41
|
+
"devDependencies": {
|
|
42
|
+
"typescript": "^5.7.0",
|
|
43
|
+
"vite": "^6.3.0",
|
|
44
|
+
"vite-plugin-dts": "^4.5.0"
|
|
45
|
+
}
|
|
46
|
+
}
|