@yourgpt/copilot-sdk 0.1.1 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/core/tools/screenshot.ts","../src/core/tools/console.ts","../src/core/tools/network.ts","../src/core/tools/intentDetector.ts","../src/core/types/tools.ts","../src/core/tools/builtin/screenshot.ts","../src/core/tools/builtin/console.ts","../src/core/tools/builtin/network.ts","../src/core/tools/builtin/index.ts","../src/core/utils/id.ts","../src/core/types/message.ts","../src/core/types/config.ts","../src/core/types/actions.ts","../src/core/types/events.ts","../src/core/types/thread.ts","../src/core/utils/stream.ts","../src/core/utils/zod-to-json-schema.ts","../src/core/system-prompt.ts","../src/core/services/storage.ts"],"names":["isBrowser","DEFAULT_OPTIONS","isCapturing","captureOptions","tool","result"],"mappings":"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","file":"chunk-IH7WXWX4.cjs","sourcesContent":["/**\n * Screenshot Capture Tool\n *\n * Captures screenshots of the current viewport or specific elements.\n * Uses html2canvas for reliable DOM-to-canvas conversion.\n */\n\nimport type { ScreenshotOptions, ScreenshotResult } from \"./types\";\n\n// Check if we're in a browser environment\nconst isBrowser =\n typeof window !== \"undefined\" && typeof document !== \"undefined\";\n\n/**\n * Default screenshot options\n */\nconst DEFAULT_OPTIONS: Required<ScreenshotOptions> = {\n element: isBrowser ? document.body : (null as unknown as HTMLElement),\n quality: 0.8,\n format: \"png\",\n maxWidth: 1920,\n maxHeight: 1080,\n includeCursor: false,\n};\n\n// Lazy-loaded html2canvas instance\nlet html2canvasPromise: Promise<typeof import(\"html2canvas\").default> | null =\n null;\n\n/**\n * Dynamically import html2canvas (only when needed)\n */\nasync function getHtml2Canvas(): Promise<typeof import(\"html2canvas\").default> {\n if (!html2canvasPromise) {\n html2canvasPromise = import(\"html2canvas\").then((mod) => mod.default);\n }\n return html2canvasPromise;\n}\n\n/**\n * Capture a screenshot of an element or the viewport\n *\n * Uses html2canvas for reliable DOM-to-canvas conversion.\n * Handles complex CSS, images, flexbox, grid, etc.\n *\n * @param options - Screenshot options\n * @returns Promise resolving to screenshot result\n *\n * @example\n * ```typescript\n * // Capture viewport\n * const screenshot = await captureScreenshot();\n *\n * // Capture specific element\n * const screenshot = await captureScreenshot({\n * element: document.getElementById('my-element'),\n * format: 'jpeg',\n * quality: 0.9,\n * });\n * ```\n */\nexport async function captureScreenshot(\n options: ScreenshotOptions = {},\n): Promise<ScreenshotResult> {\n if (!isBrowser) {\n throw new Error(\n \"Screenshot capture is only available in browser environment\",\n );\n }\n\n const opts = { ...DEFAULT_OPTIONS, ...options };\n const element = opts.element || document.body;\n\n // Get element dimensions\n const rect = element.getBoundingClientRect();\n let width = rect.width || window.innerWidth;\n let height = rect.height || window.innerHeight;\n\n // Scale down if needed\n const scale = Math.min(opts.maxWidth / width, opts.maxHeight / height, 1);\n width = Math.round(width * scale);\n height = Math.round(height * scale);\n\n let canvas: HTMLCanvasElement;\n\n try {\n // Load html2canvas dynamically\n const html2canvas = await getHtml2Canvas();\n\n // Capture using html2canvas\n canvas = await html2canvas(element, {\n scale: scale,\n useCORS: true, // Enable cross-origin images\n allowTaint: false, // Don't allow tainted canvas\n backgroundColor: null, // Transparent background (uses element's bg)\n logging: false, // Disable internal logging\n width: rect.width,\n height: rect.height,\n windowWidth: window.innerWidth,\n windowHeight: window.innerHeight,\n scrollX: 0,\n scrollY: 0,\n x: rect.left + window.scrollX,\n y: rect.top + window.scrollY,\n });\n } catch (error) {\n // Fallback to placeholder if html2canvas fails\n canvas = document.createElement(\"canvas\");\n canvas.width = width;\n canvas.height = height;\n const ctx = canvas.getContext(\"2d\");\n if (ctx) {\n createPlaceholder(ctx, width, height, element, String(error));\n }\n }\n\n // Convert to data URL\n const mimeType = `image/${opts.format === \"jpeg\" ? \"jpeg\" : opts.format}`;\n let data: string;\n\n try {\n data = canvas.toDataURL(mimeType, opts.quality);\n } catch (e) {\n // Handle tainted canvas (cross-origin images)\n if (e instanceof DOMException && e.name === \"SecurityError\") {\n console.warn(\n \"[Copilot SDK] Canvas tainted by cross-origin content. Creating placeholder.\",\n );\n const cleanCanvas = document.createElement(\"canvas\");\n cleanCanvas.width = width;\n cleanCanvas.height = height;\n const cleanCtx = cleanCanvas.getContext(\"2d\");\n if (cleanCtx) {\n createPlaceholder(\n cleanCtx,\n width,\n height,\n element,\n \"Cross-origin content blocked\",\n );\n data = cleanCanvas.toDataURL(mimeType, opts.quality);\n } else {\n throw new Error(\"Failed to create placeholder canvas\");\n }\n } else {\n throw e;\n }\n }\n\n return {\n data,\n format: opts.format,\n width: canvas.width,\n height: canvas.height,\n timestamp: Date.now(),\n };\n}\n\n/**\n * Create a placeholder image when capture fails\n */\nfunction createPlaceholder(\n ctx: CanvasRenderingContext2D,\n width: number,\n height: number,\n element: HTMLElement,\n errorMessage?: string,\n): void {\n // Gray background\n ctx.fillStyle = \"#f0f0f0\";\n ctx.fillRect(0, 0, width, height);\n\n // Border\n ctx.strokeStyle = \"#ddd\";\n ctx.lineWidth = 2;\n ctx.strokeRect(2, 2, width - 4, height - 4);\n\n // Text\n ctx.fillStyle = \"#666\";\n ctx.font = \"14px system-ui, sans-serif\";\n ctx.textAlign = \"center\";\n ctx.textBaseline = \"middle\";\n\n const tagName = element.tagName.toLowerCase();\n const id = element.id ? `#${element.id}` : \"\";\n const className = element.className\n ? `.${String(element.className).split(\" \")[0]}`\n : \"\";\n\n ctx.fillText(\n `Screenshot: <${tagName}${id}${className}>`,\n width / 2,\n height / 2 - 20,\n );\n ctx.fillText(\n `${Math.round(width)}×${Math.round(height)}px`,\n width / 2,\n height / 2,\n );\n\n if (errorMessage) {\n ctx.fillStyle = \"#999\";\n ctx.font = \"12px system-ui, sans-serif\";\n ctx.fillText(\n `Error: ${errorMessage.slice(0, 50)}`,\n width / 2,\n height / 2 + 20,\n );\n }\n}\n\n/**\n * Check if screenshot capture is supported\n */\nexport function isScreenshotSupported(): boolean {\n return isBrowser && typeof document.createElement === \"function\";\n}\n\n/**\n * Resize a screenshot result\n */\nexport async function resizeScreenshot(\n screenshot: ScreenshotResult,\n maxWidth: number,\n maxHeight: number,\n): Promise<ScreenshotResult> {\n if (!isBrowser) {\n throw new Error(\"Resize is only available in browser environment\");\n }\n\n return new Promise((resolve, reject) => {\n const img = new Image();\n img.onload = () => {\n const scale = Math.min(maxWidth / img.width, maxHeight / img.height, 1);\n const width = Math.round(img.width * scale);\n const height = Math.round(img.height * scale);\n\n const canvas = document.createElement(\"canvas\");\n canvas.width = width;\n canvas.height = height;\n const ctx = canvas.getContext(\"2d\");\n\n if (!ctx) {\n reject(new Error(\"Failed to create canvas context\"));\n return;\n }\n\n ctx.drawImage(img, 0, 0, width, height);\n\n const data = canvas.toDataURL(`image/${screenshot.format}`, 0.8);\n\n resolve({\n ...screenshot,\n data,\n width,\n height,\n timestamp: Date.now(),\n });\n };\n img.onerror = () => reject(new Error(\"Failed to load screenshot\"));\n img.src = screenshot.data;\n });\n}\n","/**\n * Console Log Capture Tool\n *\n * Intercepts console methods to capture logs for AI analysis.\n * Framework-agnostic implementation.\n */\n\nimport type {\n ConsoleLogType,\n ConsoleLogEntry,\n ConsoleLogOptions,\n ConsoleLogResult,\n} from \"./types\";\n\n// Check if we're in a browser environment\nconst isBrowser =\n typeof window !== \"undefined\" && typeof console !== \"undefined\";\n\n// Store for captured logs\nlet capturedLogs: ConsoleLogEntry[] = [];\nlet isCapturing = false;\nlet captureOptions: Required<ConsoleLogOptions>;\n\n// Original console methods\nconst originalMethods: Record<ConsoleLogType, (...args: unknown[]) => void> = {\n log: console.log,\n info: console.info,\n warn: console.warn,\n error: console.error,\n debug: console.debug,\n};\n\n/**\n * Default capture options\n */\nconst DEFAULT_OPTIONS: Required<ConsoleLogOptions> = {\n types: [\"log\", \"info\", \"warn\", \"error\", \"debug\"],\n limit: 100,\n filter: () => true,\n};\n\n/**\n * Convert arguments to a readable message string\n */\nfunction argsToMessage(args: unknown[]): string {\n return args\n .map((arg) => {\n if (arg === null) return \"null\";\n if (arg === undefined) return \"undefined\";\n if (typeof arg === \"string\") return arg;\n if (arg instanceof Error) return `${arg.name}: ${arg.message}`;\n try {\n return JSON.stringify(arg, null, 2);\n } catch {\n return String(arg);\n }\n })\n .join(\" \");\n}\n\n/**\n * Extract stack trace from an error or create one\n */\nfunction getStackTrace(): string | undefined {\n try {\n const error = new Error();\n const stack = error.stack?.split(\"\\n\").slice(3).join(\"\\n\"); // Skip internal frames\n return stack;\n } catch {\n return undefined;\n }\n}\n\n/**\n * Create a console interceptor for a specific method\n */\nfunction createInterceptor(type: ConsoleLogType) {\n return (...args: unknown[]) => {\n // Call original method\n originalMethods[type].apply(console, args);\n\n // Skip if not capturing this type\n if (!captureOptions.types.includes(type)) {\n return;\n }\n\n // Create log entry\n const entry: ConsoleLogEntry = {\n type,\n message: argsToMessage(args),\n args: args.length > 1 ? args : undefined,\n timestamp: Date.now(),\n };\n\n // Add stack trace for errors\n if (type === \"error\" || type === \"warn\") {\n entry.stack = getStackTrace();\n }\n\n // Check if first arg is an Error\n if (args[0] instanceof Error) {\n entry.stack = args[0].stack;\n }\n\n // Apply filter\n if (!captureOptions.filter(entry)) {\n return;\n }\n\n // Add to captured logs\n capturedLogs.push(entry);\n\n // Enforce limit\n while (capturedLogs.length > captureOptions.limit) {\n capturedLogs.shift();\n }\n };\n}\n\n/**\n * Start capturing console logs\n *\n * @param options - Capture options\n *\n * @example\n * ```typescript\n * // Start capturing all logs\n * startConsoleCapture();\n *\n * // Capture only errors and warnings\n * startConsoleCapture({ types: ['error', 'warn'] });\n *\n * // Custom filter\n * startConsoleCapture({\n * filter: (entry) => !entry.message.includes('[HMR]')\n * });\n * ```\n */\nexport function startConsoleCapture(options: ConsoleLogOptions = {}): void {\n if (!isBrowser) {\n console.warn(\"Console capture is only available in browser environment\");\n return;\n }\n\n if (isCapturing) {\n console.warn(\"Console capture already active\");\n return;\n }\n\n captureOptions = { ...DEFAULT_OPTIONS, ...options };\n isCapturing = true;\n\n // Override console methods\n (Object.keys(originalMethods) as ConsoleLogType[]).forEach((type) => {\n console[type] = createInterceptor(type);\n });\n}\n\n/**\n * Stop capturing console logs\n */\nexport function stopConsoleCapture(): void {\n if (!isCapturing) {\n return;\n }\n\n isCapturing = false;\n\n // Restore original methods\n (Object.keys(originalMethods) as ConsoleLogType[]).forEach((type) => {\n console[type] = originalMethods[type];\n });\n}\n\n/**\n * Get captured console logs\n *\n * @param options - Filter options\n * @returns Captured log entries\n *\n * @example\n * ```typescript\n * // Get all captured logs\n * const { logs } = getConsoleLogs();\n *\n * // Get only errors from last minute\n * const { logs } = getConsoleLogs({\n * types: ['error'],\n * filter: (entry) => entry.timestamp > Date.now() - 60000\n * });\n * ```\n */\nexport function getConsoleLogs(\n options: ConsoleLogOptions = {},\n): ConsoleLogResult {\n const opts = { ...DEFAULT_OPTIONS, ...options };\n\n let logs = [...capturedLogs];\n\n // Filter by type\n if (opts.types.length < Object.keys(originalMethods).length) {\n logs = logs.filter((entry) => opts.types.includes(entry.type));\n }\n\n // Apply custom filter\n if (opts.filter !== DEFAULT_OPTIONS.filter) {\n logs = logs.filter(opts.filter);\n }\n\n // Apply limit\n const totalCaptured = logs.length;\n logs = logs.slice(-opts.limit);\n\n return {\n logs,\n totalCaptured,\n };\n}\n\n/**\n * Clear captured console logs\n */\nexport function clearConsoleLogs(): void {\n capturedLogs = [];\n}\n\n/**\n * Check if console capture is active\n */\nexport function isConsoleCaptureActive(): boolean {\n return isCapturing;\n}\n\n/**\n * Get console errors only (convenience function)\n */\nexport function getConsoleErrors(limit = 50): ConsoleLogEntry[] {\n return getConsoleLogs({\n types: [\"error\"],\n limit,\n }).logs;\n}\n\n/**\n * Get console warnings only (convenience function)\n */\nexport function getConsoleWarnings(limit = 50): ConsoleLogEntry[] {\n return getConsoleLogs({\n types: [\"warn\"],\n limit,\n }).logs;\n}\n\n/**\n * Format console logs for AI context\n *\n * @param logs - Log entries to format\n * @returns Formatted string for AI consumption\n */\nexport function formatLogsForAI(logs: ConsoleLogEntry[]): string {\n if (logs.length === 0) {\n return \"No console logs captured.\";\n }\n\n const formatted = logs.map((entry, index) => {\n const time = new Date(entry.timestamp).toISOString();\n const typeIcon = {\n error: \"❌\",\n warn: \"⚠️\",\n log: \"📝\",\n info: \"ℹ️\",\n debug: \"🔍\",\n }[entry.type];\n\n let text = `[${index + 1}] ${typeIcon} [${entry.type.toUpperCase()}] ${time}\\n`;\n text += ` ${entry.message}`;\n\n if (entry.stack) {\n // Only include first few lines of stack\n const stackLines = entry.stack.split(\"\\n\").slice(0, 3);\n text += `\\n Stack:\\n${stackLines.map((l) => ` ${l.trim()}`).join(\"\\n\")}`;\n }\n\n return text;\n });\n\n return `Console Logs (${logs.length} entries):\\n\\n${formatted.join(\"\\n\\n\")}`;\n}\n\n/**\n * Create a one-time capture of current logs\n * Useful for getting logs without starting persistent capture\n */\nexport function captureCurrentLogs(\n options: ConsoleLogOptions = {},\n): ConsoleLogResult {\n // If already capturing, just return current logs\n if (isCapturing) {\n return getConsoleLogs(options);\n }\n\n // Return what we have (may be empty if capture was never started)\n return getConsoleLogs(options);\n}\n\n// Auto-cleanup on page unload\nif (isBrowser) {\n window.addEventListener(\"beforeunload\", () => {\n stopConsoleCapture();\n });\n}\n","/**\n * Network Request Capture Tool\n *\n * Intercepts fetch and XHR requests to capture network activity.\n * Framework-agnostic implementation.\n */\n\nimport type {\n HttpMethod,\n NetworkRequestEntry,\n NetworkRequestOptions,\n NetworkRequestResult,\n} from \"./types\";\n\n// Check if we're in a browser environment\nconst isBrowser = typeof window !== \"undefined\";\n\n// Store for captured requests\nlet capturedRequests: NetworkRequestEntry[] = [];\nlet isCapturing = false;\nlet captureOptions: Required<NetworkRequestOptions>;\n\n// Original fetch and XHR\nconst originalFetch = isBrowser ? window.fetch.bind(window) : null;\nconst originalXHROpen = isBrowser ? XMLHttpRequest.prototype.open : null;\nconst originalXHRSend = isBrowser ? XMLHttpRequest.prototype.send : null;\n\n/**\n * Default capture options\n */\nconst DEFAULT_OPTIONS: Required<NetworkRequestOptions> = {\n limit: 50,\n failedOnly: true,\n methods: [\"GET\", \"POST\", \"PUT\", \"PATCH\", \"DELETE\", \"HEAD\", \"OPTIONS\"],\n includeUrls: [],\n excludeUrls: [],\n captureRequestBody: true,\n captureResponseBody: true,\n maxBodySize: 10000, // 10KB\n};\n\n/**\n * Sanitize headers to remove sensitive information\n */\nfunction sanitizeHeaders(\n headers: Headers | Record<string, string> | null,\n): Record<string, string> {\n const sensitiveHeaders = [\n \"authorization\",\n \"cookie\",\n \"set-cookie\",\n \"x-api-key\",\n \"api-key\",\n \"x-auth-token\",\n ];\n\n const result: Record<string, string> = {};\n\n if (!headers) {\n return result;\n }\n\n const entries =\n headers instanceof Headers\n ? Array.from(headers.entries())\n : Object.entries(headers);\n\n for (const [key, value] of entries) {\n if (sensitiveHeaders.includes(key.toLowerCase())) {\n result[key] = \"[REDACTED]\";\n } else {\n result[key] = value;\n }\n }\n\n return result;\n}\n\n/**\n * Truncate body if it exceeds max size\n */\nfunction truncateBody(body: unknown, maxSize: number): unknown {\n if (body === null || body === undefined) {\n return body;\n }\n\n try {\n const str = typeof body === \"string\" ? body : JSON.stringify(body);\n if (str.length > maxSize) {\n return `${str.slice(0, maxSize)}... [truncated, total: ${str.length} chars]`;\n }\n return body;\n } catch {\n return \"[Unable to serialize body]\";\n }\n}\n\n/**\n * Check if URL matches any pattern\n */\nfunction matchesPatterns(url: string, patterns: RegExp[]): boolean {\n if (patterns.length === 0) return false;\n return patterns.some((pattern) => pattern.test(url));\n}\n\n/**\n * Check if request should be captured\n */\nfunction shouldCapture(\n url: string,\n method: HttpMethod,\n failed: boolean,\n): boolean {\n // Check failed only\n if (captureOptions.failedOnly && !failed) {\n return false;\n }\n\n // Check method\n if (!captureOptions.methods.includes(method)) {\n return false;\n }\n\n // Check exclude patterns\n if (matchesPatterns(url, captureOptions.excludeUrls)) {\n return false;\n }\n\n // Check include patterns (if specified, URL must match)\n if (\n captureOptions.includeUrls.length > 0 &&\n !matchesPatterns(url, captureOptions.includeUrls)\n ) {\n return false;\n }\n\n return true;\n}\n\n/**\n * Add a captured request\n */\nfunction addCapturedRequest(entry: NetworkRequestEntry): void {\n capturedRequests.push(entry);\n\n // Enforce limit\n while (capturedRequests.length > captureOptions.limit) {\n capturedRequests.shift();\n }\n}\n\n/**\n * Create intercepted fetch function\n */\nfunction createFetchInterceptor() {\n return async function interceptedFetch(\n input: RequestInfo | URL,\n init?: RequestInit,\n ): Promise<Response> {\n const startTime = Date.now();\n const url =\n typeof input === \"string\"\n ? input\n : input instanceof URL\n ? input.href\n : input.url;\n const method = (init?.method?.toUpperCase() || \"GET\") as HttpMethod;\n\n let requestBody: unknown;\n if (captureOptions.captureRequestBody && init?.body) {\n try {\n if (typeof init.body === \"string\") {\n requestBody = JSON.parse(init.body);\n } else {\n requestBody = init.body;\n }\n } catch {\n requestBody = init.body;\n }\n }\n\n try {\n const response = await originalFetch!(input, init);\n const duration = Date.now() - startTime;\n const failed = !response.ok;\n\n if (shouldCapture(url, method, failed)) {\n let responseBody: unknown;\n\n // Clone response to read body without consuming it\n if (captureOptions.captureResponseBody && failed) {\n try {\n const clone = response.clone();\n const text = await clone.text();\n try {\n responseBody = JSON.parse(text);\n } catch {\n responseBody = text;\n }\n } catch {\n responseBody = \"[Unable to read response body]\";\n }\n }\n\n const entry: NetworkRequestEntry = {\n url,\n method,\n status: response.status,\n statusText: response.statusText,\n failed,\n requestHeaders: sanitizeHeaders(\n init?.headers as Record<string, string> | null,\n ),\n responseHeaders: sanitizeHeaders(response.headers),\n requestBody: truncateBody(requestBody, captureOptions.maxBodySize),\n responseBody: truncateBody(responseBody, captureOptions.maxBodySize),\n duration,\n timestamp: startTime,\n };\n\n addCapturedRequest(entry);\n }\n\n return response;\n } catch (error) {\n const duration = Date.now() - startTime;\n\n if (shouldCapture(url, method, true)) {\n const entry: NetworkRequestEntry = {\n url,\n method,\n status: 0,\n statusText: \"Network Error\",\n failed: true,\n requestBody: truncateBody(requestBody, captureOptions.maxBodySize),\n duration,\n timestamp: startTime,\n error: error instanceof Error ? error.message : String(error),\n };\n\n addCapturedRequest(entry);\n }\n\n throw error;\n }\n };\n}\n\n/**\n * Start capturing network requests\n *\n * @param options - Capture options\n *\n * @example\n * ```typescript\n * // Start capturing failed requests only (default)\n * startNetworkCapture();\n *\n * // Capture all requests\n * startNetworkCapture({ failedOnly: false });\n *\n * // Capture only specific API\n * startNetworkCapture({\n * includeUrls: [/api\\.example\\.com/],\n * failedOnly: false\n * });\n * ```\n */\nexport function startNetworkCapture(options: NetworkRequestOptions = {}): void {\n if (!isBrowser) {\n console.warn(\"Network capture is only available in browser environment\");\n return;\n }\n\n if (isCapturing) {\n console.warn(\"Network capture already active\");\n return;\n }\n\n captureOptions = { ...DEFAULT_OPTIONS, ...options };\n isCapturing = true;\n\n // Override fetch\n window.fetch = createFetchInterceptor();\n\n // Override XHR\n XMLHttpRequest.prototype.open = function (\n method: string,\n url: string | URL,\n async: boolean = true,\n username?: string | null,\n password?: string | null,\n ) {\n (this as XMLHttpRequest & { _captureData: unknown })._captureData = {\n method: method.toUpperCase() as HttpMethod,\n url: url.toString(),\n startTime: 0,\n };\n\n return originalXHROpen!.call(\n this,\n method,\n url,\n async as boolean,\n username,\n password,\n );\n };\n\n XMLHttpRequest.prototype.send = function (\n body?: Document | XMLHttpRequestBodyInit | null,\n ) {\n const xhr = this as XMLHttpRequest & {\n _captureData: {\n method: HttpMethod;\n url: string;\n startTime: number;\n requestBody?: unknown;\n };\n };\n\n if (xhr._captureData) {\n xhr._captureData.startTime = Date.now();\n\n if (captureOptions.captureRequestBody && body) {\n try {\n if (typeof body === \"string\") {\n xhr._captureData.requestBody = JSON.parse(body);\n } else {\n xhr._captureData.requestBody = body;\n }\n } catch {\n xhr._captureData.requestBody = body;\n }\n }\n\n // Listen for completion\n const originalOnReadyStateChange = xhr.onreadystatechange;\n xhr.onreadystatechange = function (event) {\n if (xhr.readyState === XMLHttpRequest.DONE) {\n const duration = Date.now() - xhr._captureData.startTime;\n const failed = xhr.status === 0 || xhr.status >= 400;\n\n if (\n shouldCapture(xhr._captureData.url, xhr._captureData.method, failed)\n ) {\n let responseBody: unknown;\n\n if (captureOptions.captureResponseBody && failed) {\n try {\n responseBody =\n xhr.responseType === \"\" || xhr.responseType === \"text\"\n ? JSON.parse(xhr.responseText)\n : xhr.response;\n } catch {\n responseBody = xhr.responseText || xhr.response;\n }\n }\n\n const entry: NetworkRequestEntry = {\n url: xhr._captureData.url,\n method: xhr._captureData.method,\n status: xhr.status,\n statusText: xhr.statusText,\n failed,\n requestBody: truncateBody(\n xhr._captureData.requestBody,\n captureOptions.maxBodySize,\n ),\n responseBody: truncateBody(\n responseBody,\n captureOptions.maxBodySize,\n ),\n duration,\n timestamp: xhr._captureData.startTime,\n };\n\n addCapturedRequest(entry);\n }\n }\n\n if (originalOnReadyStateChange) {\n originalOnReadyStateChange.call(xhr, event);\n }\n };\n }\n\n return originalXHRSend!.call(this, body);\n };\n}\n\n/**\n * Stop capturing network requests\n */\nexport function stopNetworkCapture(): void {\n if (!isBrowser || !isCapturing) {\n return;\n }\n\n isCapturing = false;\n\n // Restore original fetch\n window.fetch = originalFetch!;\n\n // Restore original XHR\n XMLHttpRequest.prototype.open = originalXHROpen!;\n XMLHttpRequest.prototype.send = originalXHRSend!;\n}\n\n/**\n * Get captured network requests\n *\n * @param options - Filter options\n * @returns Captured requests\n *\n * @example\n * ```typescript\n * // Get all captured requests\n * const { requests } = getNetworkRequests();\n *\n * // Get only failed POST requests\n * const { requests } = getNetworkRequests({\n * methods: ['POST'],\n * failedOnly: true\n * });\n * ```\n */\nexport function getNetworkRequests(\n options: NetworkRequestOptions = {},\n): NetworkRequestResult {\n const opts = { ...DEFAULT_OPTIONS, ...options };\n\n let requests = [...capturedRequests];\n\n // Filter by failed only\n if (opts.failedOnly) {\n requests = requests.filter((r) => r.failed);\n }\n\n // Filter by method\n if (opts.methods.length < DEFAULT_OPTIONS.methods.length) {\n requests = requests.filter((r) => opts.methods.includes(r.method));\n }\n\n // Filter by URL patterns\n if (opts.includeUrls.length > 0) {\n requests = requests.filter((r) => matchesPatterns(r.url, opts.includeUrls));\n }\n\n if (opts.excludeUrls.length > 0) {\n requests = requests.filter(\n (r) => !matchesPatterns(r.url, opts.excludeUrls),\n );\n }\n\n // Apply limit\n const totalCaptured = requests.length;\n requests = requests.slice(-opts.limit);\n\n return {\n requests,\n totalCaptured,\n };\n}\n\n/**\n * Clear captured network requests\n */\nexport function clearNetworkRequests(): void {\n capturedRequests = [];\n}\n\n/**\n * Check if network capture is active\n */\nexport function isNetworkCaptureActive(): boolean {\n return isCapturing;\n}\n\n/**\n * Get failed requests only (convenience function)\n */\nexport function getFailedRequests(limit = 20): NetworkRequestEntry[] {\n return getNetworkRequests({ failedOnly: true, limit }).requests;\n}\n\n/**\n * Format network requests for AI context\n *\n * @param requests - Request entries to format\n * @returns Formatted string for AI consumption\n */\nexport function formatRequestsForAI(requests: NetworkRequestEntry[]): string {\n if (requests.length === 0) {\n return \"No network requests captured.\";\n }\n\n const formatted = requests.map((req, index) => {\n const time = new Date(req.timestamp).toISOString();\n const statusIcon = req.failed ? \"❌\" : \"✅\";\n\n let text = `[${index + 1}] ${statusIcon} ${req.method} ${req.url}\\n`;\n text += ` Status: ${req.status} ${req.statusText}\\n`;\n text += ` Duration: ${req.duration}ms\\n`;\n text += ` Time: ${time}`;\n\n if (req.error) {\n text += `\\n Error: ${req.error}`;\n }\n\n if (req.responseBody && req.failed) {\n const bodyStr =\n typeof req.responseBody === \"string\"\n ? req.responseBody\n : JSON.stringify(req.responseBody, null, 2);\n text += `\\n Response Body:\\n ${bodyStr.split(\"\\n\").join(\"\\n \")}`;\n }\n\n return text;\n });\n\n return `Network Requests (${requests.length} entries):\\n\\n${formatted.join(\"\\n\\n\")}`;\n}\n\n// Auto-cleanup on page unload\nif (isBrowser) {\n window.addEventListener(\"beforeunload\", () => {\n stopNetworkCapture();\n });\n}\n","/**\n * Intent Detector\n *\n * Detects user intent from messages to suggest relevant tools.\n * Framework-agnostic implementation using keyword matching.\n */\n\nimport type { ToolType, IntentDetectionResult } from \"./types\";\n\n/**\n * Keywords that suggest screenshot might be helpful\n */\nconst SCREENSHOT_KEYWORDS = [\n // Visual references\n \"see\",\n \"seeing\",\n \"look\",\n \"looking\",\n \"looks\",\n \"appear\",\n \"appears\",\n \"show\",\n \"showing\",\n \"shows\",\n \"display\",\n \"displays\",\n \"displayed\",\n \"visible\",\n \"invisible\",\n\n // UI elements\n \"screen\",\n \"page\",\n \"ui\",\n \"interface\",\n \"layout\",\n \"design\",\n \"button\",\n \"input\",\n \"form\",\n \"modal\",\n \"popup\",\n \"menu\",\n \"dropdown\",\n \"sidebar\",\n \"header\",\n \"footer\",\n \"navbar\",\n \"navigation\",\n \"image\",\n \"icon\",\n \"text\",\n \"font\",\n \"color\",\n \"style\",\n \"css\",\n \"alignment\",\n \"position\",\n \"spacing\",\n\n // Visual issues\n \"broken\",\n \"misaligned\",\n \"overlapping\",\n \"cutoff\",\n \"overflow\",\n \"blank\",\n \"empty\",\n \"missing\",\n \"wrong\",\n \"weird\",\n \"strange\",\n \"different\",\n \"changed\",\n];\n\n/**\n * Keywords that suggest console logs might be helpful\n */\nconst CONSOLE_KEYWORDS = [\n // Errors\n \"error\",\n \"errors\",\n \"exception\",\n \"exceptions\",\n \"crash\",\n \"crashed\",\n \"crashing\",\n \"bug\",\n \"bugs\",\n \"buggy\",\n \"broken\",\n \"break\",\n \"breaks\",\n\n // Issues\n \"issue\",\n \"issues\",\n \"problem\",\n \"problems\",\n \"not working\",\n \"doesnt work\",\n \"doesn't work\",\n \"stopped working\",\n \"fails\",\n \"failed\",\n \"failing\",\n \"failure\",\n\n // Debug references\n \"debug\",\n \"debugging\",\n \"console\",\n \"log\",\n \"logs\",\n \"warning\",\n \"warnings\",\n \"warn\",\n \"stack\",\n \"stacktrace\",\n \"trace\",\n \"traceback\",\n\n // State issues\n \"undefined\",\n \"null\",\n \"nan\",\n \"typeerror\",\n \"referenceerror\",\n \"syntaxerror\",\n \"unexpected\",\n \"uncaught\",\n];\n\n/**\n * Keywords that suggest network inspection might be helpful\n */\nconst NETWORK_KEYWORDS = [\n // API references\n \"api\",\n \"apis\",\n \"endpoint\",\n \"endpoints\",\n \"request\",\n \"requests\",\n \"response\",\n \"responses\",\n \"fetch\",\n \"fetching\",\n\n // HTTP\n \"http\",\n \"https\",\n \"rest\",\n \"graphql\",\n \"post\",\n \"get\",\n \"put\",\n \"delete\",\n \"patch\",\n\n // Issues\n \"timeout\",\n \"timeouts\",\n \"timed out\",\n \"slow\",\n \"loading\",\n \"loads\",\n \"load\",\n \"forever\",\n\n // Status\n \"404\",\n \"500\",\n \"401\",\n \"403\",\n \"400\",\n \"not found\",\n \"unauthorized\",\n \"forbidden\",\n \"server error\",\n \"bad request\",\n\n // Data\n \"data\",\n \"json\",\n \"payload\",\n \"body\",\n \"headers\",\n \"cors\",\n \"network\",\n \"connection\",\n \"backend\",\n \"server\",\n];\n\n/**\n * Default confidence thresholds\n */\nconst DEFAULT_THRESHOLDS = {\n suggest: 0.3, // Minimum confidence to suggest a tool\n high: 0.6, // High confidence threshold\n};\n\n/**\n * Normalize text for matching\n */\nfunction normalizeText(text: string): string {\n return text\n .toLowerCase()\n .replace(/[^\\w\\s]/g, \" \")\n .replace(/\\s+/g, \" \")\n .trim();\n}\n\n/**\n * Find matching keywords in text\n */\nfunction findMatches(text: string, keywords: string[]): string[] {\n const normalizedText = normalizeText(text);\n const words = new Set(normalizedText.split(\" \"));\n const matches: string[] = [];\n\n for (const keyword of keywords) {\n const normalizedKeyword = normalizeText(keyword);\n\n // Check for exact word match\n if (words.has(normalizedKeyword)) {\n matches.push(keyword);\n continue;\n }\n\n // Check for phrase match (multi-word keywords)\n if (\n normalizedKeyword.includes(\" \") &&\n normalizedText.includes(normalizedKeyword)\n ) {\n matches.push(keyword);\n continue;\n }\n\n // Check for partial match at word boundaries\n const pattern = new RegExp(`\\\\b${normalizedKeyword}`, \"i\");\n if (pattern.test(normalizedText)) {\n matches.push(keyword);\n }\n }\n\n return [...new Set(matches)]; // Remove duplicates\n}\n\n/**\n * Calculate confidence score based on matches\n */\nfunction calculateConfidence(\n matches: string[],\n totalKeywords: number,\n textLength: number,\n): number {\n if (matches.length === 0) return 0;\n\n // Base score from number of matches\n const matchRatio = Math.min(matches.length / 5, 1); // Cap at 5 matches = max\n\n // Bonus for multiple matches\n const multiMatchBonus =\n matches.length > 2 ? 0.2 : matches.length > 1 ? 0.1 : 0;\n\n // Penalty for very short messages (might be false positives)\n const lengthPenalty = textLength < 20 ? 0.2 : 0;\n\n return Math.min(matchRatio * 0.7 + multiMatchBonus - lengthPenalty, 1);\n}\n\n/**\n * Detect user intent from a message\n *\n * @param message - User message to analyze\n * @returns Detection result with suggested tools\n *\n * @example\n * ```typescript\n * const result = detectIntent(\"I'm seeing an error on my screen\");\n * // Returns:\n * // {\n * // suggestedTools: ['screenshot', 'console'],\n * // confidence: { screenshot: 0.6, console: 0.8, network: 0 },\n * // matchedKeywords: { screenshot: ['seeing', 'screen'], console: ['error'] }\n * // }\n * ```\n */\nexport function detectIntent(message: string): IntentDetectionResult {\n const screenshotMatches = findMatches(message, SCREENSHOT_KEYWORDS);\n const consoleMatches = findMatches(message, CONSOLE_KEYWORDS);\n const networkMatches = findMatches(message, NETWORK_KEYWORDS);\n\n const textLength = message.length;\n\n const confidence: Record<ToolType, number> = {\n screenshot: calculateConfidence(\n screenshotMatches,\n SCREENSHOT_KEYWORDS.length,\n textLength,\n ),\n console: calculateConfidence(\n consoleMatches,\n CONSOLE_KEYWORDS.length,\n textLength,\n ),\n network: calculateConfidence(\n networkMatches,\n NETWORK_KEYWORDS.length,\n textLength,\n ),\n };\n\n // Determine suggested tools based on confidence\n const suggestedTools: ToolType[] = [];\n\n if (confidence.screenshot >= DEFAULT_THRESHOLDS.suggest) {\n suggestedTools.push(\"screenshot\");\n }\n if (confidence.console >= DEFAULT_THRESHOLDS.suggest) {\n suggestedTools.push(\"console\");\n }\n if (confidence.network >= DEFAULT_THRESHOLDS.suggest) {\n suggestedTools.push(\"network\");\n }\n\n // Sort by confidence (highest first)\n suggestedTools.sort((a, b) => confidence[b] - confidence[a]);\n\n return {\n suggestedTools,\n confidence,\n matchedKeywords: {\n screenshot: screenshotMatches,\n console: consoleMatches,\n network: networkMatches,\n },\n };\n}\n\n/**\n * Check if a message suggests any tools\n */\nexport function hasToolSuggestions(message: string): boolean {\n const result = detectIntent(message);\n return result.suggestedTools.length > 0;\n}\n\n/**\n * Get the primary suggested tool (highest confidence)\n */\nexport function getPrimaryTool(message: string): ToolType | null {\n const result = detectIntent(message);\n return result.suggestedTools[0] || null;\n}\n\n/**\n * Generate a reason string for why tools are being suggested\n */\nexport function generateSuggestionReason(\n result: IntentDetectionResult,\n): string {\n if (result.suggestedTools.length === 0) {\n return \"\";\n }\n\n const reasons: string[] = [];\n\n if (result.suggestedTools.includes(\"screenshot\")) {\n const keywords = result.matchedKeywords.screenshot.slice(0, 3);\n reasons.push(`visual elements mentioned (${keywords.join(\", \")})`);\n }\n\n if (result.suggestedTools.includes(\"console\")) {\n const keywords = result.matchedKeywords.console.slice(0, 3);\n reasons.push(`potential errors indicated (${keywords.join(\", \")})`);\n }\n\n if (result.suggestedTools.includes(\"network\")) {\n const keywords = result.matchedKeywords.network.slice(0, 3);\n reasons.push(`API/network issues suggested (${keywords.join(\", \")})`);\n }\n\n return `Based on your message: ${reasons.join(\"; \")}.`;\n}\n\n/**\n * Custom keyword configuration\n */\nexport interface CustomKeywords {\n screenshot?: string[];\n console?: string[];\n network?: string[];\n}\n\n/**\n * Create a custom intent detector with additional keywords\n */\nexport function createCustomDetector(customKeywords: CustomKeywords) {\n const extendedScreenshot = [\n ...SCREENSHOT_KEYWORDS,\n ...(customKeywords.screenshot || []),\n ];\n const extendedConsole = [\n ...CONSOLE_KEYWORDS,\n ...(customKeywords.console || []),\n ];\n const extendedNetwork = [\n ...NETWORK_KEYWORDS,\n ...(customKeywords.network || []),\n ];\n\n return function detectCustomIntent(message: string): IntentDetectionResult {\n const screenshotMatches = findMatches(message, extendedScreenshot);\n const consoleMatches = findMatches(message, extendedConsole);\n const networkMatches = findMatches(message, extendedNetwork);\n\n const textLength = message.length;\n\n const confidence: Record<ToolType, number> = {\n screenshot: calculateConfidence(\n screenshotMatches,\n extendedScreenshot.length,\n textLength,\n ),\n console: calculateConfidence(\n consoleMatches,\n extendedConsole.length,\n textLength,\n ),\n network: calculateConfidence(\n networkMatches,\n extendedNetwork.length,\n textLength,\n ),\n };\n\n const suggestedTools: ToolType[] = [];\n\n if (confidence.screenshot >= DEFAULT_THRESHOLDS.suggest) {\n suggestedTools.push(\"screenshot\");\n }\n if (confidence.console >= DEFAULT_THRESHOLDS.suggest) {\n suggestedTools.push(\"console\");\n }\n if (confidence.network >= DEFAULT_THRESHOLDS.suggest) {\n suggestedTools.push(\"network\");\n }\n\n suggestedTools.sort((a, b) => confidence[b] - confidence[a]);\n\n return {\n suggestedTools,\n confidence,\n matchedKeywords: {\n screenshot: screenshotMatches,\n console: consoleMatches,\n network: networkMatches,\n },\n };\n };\n}\n","/**\n * Tool-related types for the agentic loop\n */\n\nimport type { ActionRenderProps } from \"./actions\";\n\n// ============================================\n// Provider Types\n// ============================================\n\n/**\n * Supported AI providers for tool calling\n */\nexport type AIProvider =\n | \"anthropic\"\n | \"openai\"\n | \"xai\"\n | \"grok\"\n | \"gemini\"\n | \"groq\"\n | \"ollama\";\n\n/**\n * Where the tool executes\n */\nexport type ToolLocation = \"server\" | \"client\";\n\n// ============================================\n// Tool Definition Types\n// ============================================\n\n/**\n * JSON Schema property definition\n */\nexport interface JSONSchemaProperty {\n type:\n | \"string\"\n | \"number\"\n | \"boolean\"\n | \"object\"\n | \"array\"\n | \"integer\"\n | \"null\";\n description?: string;\n enum?: (string | number | boolean)[];\n items?: JSONSchemaProperty;\n properties?: Record<string, JSONSchemaProperty>;\n required?: string[];\n default?: unknown;\n minLength?: number;\n maxLength?: number;\n minimum?: number;\n maximum?: number;\n pattern?: string;\n}\n\n/**\n * JSON Schema for tool input\n */\nexport interface ToolInputSchema {\n type: \"object\";\n properties: Record<string, JSONSchemaProperty>;\n required?: string[];\n additionalProperties?: boolean;\n}\n\n/**\n * Tool execution context\n *\n * Provides runtime information to tool handlers including cancellation signals,\n * request metadata, and custom context data.\n */\nexport interface ToolContext {\n /** Abort signal for cancellation */\n signal?: AbortSignal;\n /** Thread ID if using threads */\n threadId?: string;\n /** Custom context data passed from runtime config */\n data?: Record<string, unknown>;\n\n // ============================================\n // Rich Context (Vercel AI SDK pattern)\n // ============================================\n\n /**\n * Unique ID for this specific tool call.\n * Useful for logging, tracing, and correlating tool executions.\n */\n toolCallId?: string;\n\n /**\n * Request headers (for auth in server tools).\n * Contains headers from the original HTTP request.\n *\n * @example\n * ```typescript\n * handler: async (params, context) => {\n * const token = context?.headers?.authorization;\n * if (!token) return failure('Authentication required');\n * // ...\n * }\n * ```\n */\n headers?: Record<string, string>;\n\n /**\n * Full request metadata for server-side tools.\n * Provides access to HTTP method, URL, and headers.\n *\n * @example\n * ```typescript\n * handler: async (params, context) => {\n * console.log(`Tool called from: ${context?.request?.url}`);\n * // Forward auth to internal service\n * const authHeader = context?.request?.headers?.authorization;\n * }\n * ```\n */\n request?: {\n /** HTTP method (GET, POST, etc.) */\n method?: string;\n /** Request URL path */\n url?: string;\n /** Request headers */\n headers?: Record<string, string>;\n };\n\n /**\n * Data passed from user's approval action.\n * Only present when tool has `needsApproval: true` and user approved with extra data.\n *\n * @example\n * ```typescript\n * // In render function:\n * approval.onApprove({ supervisor: selectedSupervisor });\n *\n * // In handler:\n * handler: async (params, context) => {\n * const supervisor = context?.approvalData?.supervisor;\n * await assignToSupervisor(params.ticketId, supervisor);\n * }\n * ```\n */\n approvalData?: Record<string, unknown>;\n}\n\n// ============================================\n// AI Response Control Types\n// ============================================\n\n/**\n * AI response behavior for tool results.\n *\n * Controls what the AI sees after a tool executes and renders UI.\n *\n * - `'none'`: AI generates minimal response, UI component handles display\n * - `'brief'`: AI gets summary context (via aiContext), gives brief acknowledgment\n * - `'full'`: AI receives full data and responds accordingly (default)\n */\nexport type AIResponseMode = \"none\" | \"brief\" | \"full\";\n\n/**\n * Multimodal content for AI to analyze\n */\nexport type AIContent =\n | { type: \"image\"; data: string; mediaType: string }\n | { type: \"text\"; text: string };\n\n/**\n * Tool response format\n */\nexport interface ToolResponse<T = unknown> {\n /** Whether the tool succeeded */\n success: boolean;\n /** Human-readable message */\n message?: string;\n /** Error message if failed */\n error?: string;\n /** Result data */\n data?: T;\n\n // ============================================\n // AI Response Control (result-level overrides)\n // ============================================\n\n /**\n * Override AI context for this specific result.\n * Takes precedence over tool-level aiContext config.\n * If set, this message is sent to AI instead of full result data.\n *\n * @example\n * ```typescript\n * return {\n * success: true,\n * data: sensitiveData,\n * _aiContext: '[Data retrieved - contains sensitive info, displayed to user]'\n * };\n * ```\n */\n _aiContext?: string;\n\n /**\n * Override AI response mode for this specific result.\n * Takes precedence over tool-level aiResponseMode config.\n */\n _aiResponseMode?: AIResponseMode;\n\n /**\n * Content for AI to analyze (images, documents, etc.).\n * When present, these are included as multimodal content for AI analysis.\n *\n * @example\n * ```typescript\n * // Screenshot for AI to analyze\n * return {\n * success: true,\n * message: 'Screenshot captured',\n * _aiContent: [{ type: 'image', data: base64, mediaType: 'image/png' }]\n * };\n * ```\n */\n _aiContent?: AIContent[];\n}\n\n/**\n * Approval callbacks passed to render when tool requires user action.\n * Only present when status is \"approval-required\".\n */\nexport interface ToolApprovalCallbacks {\n /**\n * Approve execution and optionally pass extra data to the handler.\n * The extraData is available in handler via `context.approvalData`.\n *\n * @example\n * ```tsx\n * // Simple approval\n * approval.onApprove();\n *\n * // Approval with data (e.g., user selection)\n * approval.onApprove({ supervisor: { name: \"John\", role: \"Manager\" } });\n * ```\n */\n onApprove: (extraData?: Record<string, unknown>) => void;\n\n /**\n * Reject the tool execution with optional reason.\n * This stops the tool from executing and returns an error to AI.\n */\n onReject: (reason?: string) => void;\n\n /** Custom message from tool's approvalMessage config */\n message?: string;\n}\n\n/**\n * Props passed to tool render function.\n *\n * The render function is called for every status change, enabling\n * full lifecycle rendering similar to Vercel AI SDK.\n *\n * @example\n * ```tsx\n * render: ({ status, args, approval, result }) => {\n * if (status === \"approval-required\" && approval) {\n * return <ApprovalCard onConfirm={() => approval.onApprove()} />;\n * }\n * if (status === \"executing\") {\n * return <LoadingSkeleton />;\n * }\n * if (status === \"completed\") {\n * return <ResultCard data={result.data} />;\n * }\n * return null;\n * }\n * ```\n */\nexport interface ToolRenderProps<TParams = Record<string, unknown>> {\n /**\n * Current execution status:\n * - `pending`: Tool call received, waiting to start\n * - `approval-required`: Waiting for user approval (when needsApproval is set)\n * - `executing`: Handler is running\n * - `completed`: Handler finished successfully\n * - `error`: Handler failed\n */\n status: \"pending\" | \"approval-required\" | \"executing\" | \"completed\" | \"error\";\n\n /** Arguments passed to the tool */\n args: TParams;\n\n /** Result if completed */\n result?: ToolResponse;\n\n /** Error if failed */\n error?: string;\n\n /** Tool call ID */\n toolCallId: string;\n\n /** Tool name */\n toolName: string;\n\n /**\n * Approval callbacks - only present when status is \"approval-required\".\n * Use these to create custom approval UIs that can pass extra data to the handler.\n */\n approval?: ToolApprovalCallbacks;\n}\n\n/**\n * Tool definition with JSON Schema\n */\nexport interface ToolDefinition<TParams = Record<string, unknown>> {\n /** Unique tool name */\n name: string;\n /** Tool description for LLM */\n description: string;\n /** Where the tool executes (server or client) */\n location: ToolLocation;\n\n // ============================================\n // Display Configuration\n // ============================================\n\n /**\n * Human-readable title for UI display.\n * Can be a static string or a function that generates title from args.\n *\n * @example\n * ```typescript\n * title: \"Get order details\"\n * // or dynamic:\n * title: (args) => `Order #${args.orderId}`\n * ```\n */\n title?: string | ((args: TParams) => string);\n\n /**\n * Title shown while executing (present tense with \"...\").\n * If not provided, uses `title` with \"...\" appended.\n *\n * @example\n * ```typescript\n * executingTitle: (args) => `Fetching order #${args.orderId}...`\n * ```\n */\n executingTitle?: string | ((args: TParams) => string);\n\n /**\n * Title shown after completion.\n * If not provided, defaults to `title`.\n *\n * @example\n * ```typescript\n * completedTitle: (args) => `Retrieved order #${args.orderId}`\n * ```\n */\n completedTitle?: string | ((args: TParams) => string);\n /** JSON Schema for input parameters */\n inputSchema: ToolInputSchema;\n /** Handler function (optional for client tools registered on server) */\n handler?: (\n params: TParams,\n context?: ToolContext,\n ) => Promise<ToolResponse> | ToolResponse;\n /** Optional render function for UI */\n render?: (props: ToolRenderProps<TParams>) => unknown;\n /** Whether the tool is available (for conditional registration) */\n available?: boolean;\n\n /**\n * Require user approval before execution.\n * Can be:\n * - `true`: Always require approval\n * - `false` or `undefined`: No approval needed (default)\n * - `(params) => boolean`: Conditional approval based on input\n *\n * Similar to Vercel AI SDK v6's needsApproval pattern.\n */\n needsApproval?: boolean | ((params: TParams) => boolean | Promise<boolean>);\n\n /**\n * Custom message shown in the approval UI.\n * Can be a string or a function that generates a message from params.\n * If not provided, a default message with the tool name is shown.\n */\n approvalMessage?: string | ((params: TParams) => string);\n\n // ============================================\n // AI Response Control\n // ============================================\n\n /**\n * How the AI should respond when this tool's result is rendered as UI.\n *\n * - `'none'`: AI generates minimal response (\"[Result displayed to user]\").\n * Use for tools where UI component fully handles the display (stats cards, etc.)\n *\n * - `'brief'`: AI receives summary context (from aiContext) and gives brief acknowledgment.\n * Use for charts/visualizations where AI should acknowledge but not repeat data.\n *\n * - `'full'`: AI receives complete data and responds accordingly (default).\n * Use for tools where AI should analyze and elaborate on results.\n *\n * @default 'full'\n *\n * @example\n * ```typescript\n * // Chart tool - AI acknowledges without repeating data\n * const chartTool: ToolDefinition = {\n * name: 'get_chart',\n * aiResponseMode: 'brief',\n * aiContext: (result) => `[Chart displayed: ${result.data.title}]`,\n * handler: async () => ({ success: true, data: chartData })\n * };\n * ```\n */\n aiResponseMode?: AIResponseMode;\n\n /**\n * Context/summary sent to AI instead of (or along with) full result.\n *\n * Used when:\n * - `aiResponseMode: 'brief'` - This becomes the only thing AI sees\n * - `aiResponseMode: 'full'` - This is prepended to full data for context\n *\n * Can be:\n * - `string`: Static message (e.g., \"[Weather data displayed]\")\n * - `function`: Dynamic based on result (e.g., (result) => `[Chart: ${result.data.title}]`)\n *\n * @example\n * ```typescript\n * // Static context\n * aiContext: '[Analytics chart displayed to user]'\n *\n * // Dynamic context based on result\n * aiContext: (result, args) => {\n * const { title, currentValue } = result.data;\n * return `[Chart displayed: ${title}, showing ${currentValue}]`;\n * }\n * ```\n */\n aiContext?:\n | string\n | ((result: ToolResponse, args: Record<string, unknown>) => string);\n}\n\n// ============================================\n// Unified Tool Call Types (Provider-Agnostic)\n// ============================================\n\n/**\n * Unified tool call format (internal representation)\n */\nexport interface UnifiedToolCall {\n /** Unique tool call ID */\n id: string;\n /** Tool name */\n name: string;\n /** Tool input arguments */\n input: Record<string, unknown>;\n}\n\n/**\n * Unified tool result format\n */\nexport interface UnifiedToolResult {\n /** Tool call ID this result is for */\n toolCallId: string;\n /** Serialized result content (JSON string) */\n content: string;\n /** Whether the tool succeeded */\n success: boolean;\n /** Error message if failed */\n error?: string;\n}\n\n// ============================================\n// Tool Execution Types\n// ============================================\n\n/**\n * Tool execution status\n */\nexport type ToolExecutionStatus =\n | \"pending\"\n | \"executing\"\n | \"completed\"\n | \"error\";\n\n/**\n * Tool approval status (for human-in-the-loop)\n *\n * Similar to Vercel AI SDK v6's tool approval pattern.\n */\nexport type ToolApprovalStatus =\n | \"none\" // No approval needed (default)\n | \"required\" // Waiting for user decision\n | \"approved\" // User approved, execution can proceed\n | \"rejected\"; // User rejected, execution skipped\n\n// ============================================\n// Permission Persistence Types\n// ============================================\n\n/**\n * Permission level for tool execution\n *\n * Controls whether approval is needed and how the choice is remembered:\n * - \"ask\" - Always prompt user (default)\n * - \"allow_always\" - Auto-approve, persisted to storage\n * - \"deny_always\" - Auto-reject, persisted to storage\n * - \"session\" - Auto-approve for current session only\n */\nexport type PermissionLevel =\n | \"ask\"\n | \"allow_always\"\n | \"deny_always\"\n | \"session\";\n\n/**\n * Stored tool permission record\n */\nexport interface ToolPermission {\n /** Tool name (unique identifier) */\n toolName: string;\n /** Permission level */\n level: PermissionLevel;\n /** When permission was set */\n createdAt: number;\n /** Last time this permission was used */\n lastUsedAt?: number;\n}\n\n/**\n * Permission storage configuration\n */\nexport interface PermissionStorageConfig {\n /**\n * Storage type:\n * - \"localStorage\" - Persists across browser sessions\n * - \"sessionStorage\" - Clears when tab closes\n * - \"memory\" - In-memory only (for SSR or testing)\n */\n type: \"localStorage\" | \"sessionStorage\" | \"memory\";\n /** Storage key prefix (default: \"yourgpt-permissions\") */\n keyPrefix?: string;\n}\n\n/**\n * Permission storage adapter interface (for custom implementations)\n */\nexport interface PermissionStorageAdapter {\n /** Get permission for a tool */\n get(toolName: string): Promise<ToolPermission | null>;\n /** Set permission for a tool */\n set(permission: ToolPermission): Promise<void>;\n /** Remove permission for a tool */\n remove(toolName: string): Promise<void>;\n /** Get all permissions */\n getAll(): Promise<ToolPermission[]>;\n /** Clear all permissions */\n clear(): Promise<void>;\n}\n\n/**\n * Tool execution record (for UI tracking)\n */\nexport interface ToolExecution {\n /** Tool call ID */\n id: string;\n /** Tool name */\n name: string;\n /** Tool arguments */\n args: Record<string, unknown>;\n /** Execution status */\n status: ToolExecutionStatus;\n /** Result if completed */\n result?: ToolResponse;\n /** Error message if failed */\n error?: string;\n /** Timestamp when execution started */\n timestamp: number;\n /** Duration in ms (set when completed) */\n duration?: number;\n\n // Approval fields (for needsApproval tools)\n\n /** Approval status for this execution */\n approvalStatus: ToolApprovalStatus;\n /** Message shown in approval UI (from tool's approvalMessage) */\n approvalMessage?: string;\n /** Timestamp when user responded to approval request */\n approvalTimestamp?: number;\n}\n\n// ============================================\n// Agent Loop Types\n// ============================================\n\n/**\n * Agentic loop configuration\n */\nexport interface AgentLoopConfig {\n /** Maximum iterations before stopping (default: 20) */\n maxIterations?: number;\n /** Enable debug logging */\n debug?: boolean;\n /** Whether to enable the agentic loop (default: true) */\n enabled?: boolean;\n}\n\n/**\n * Agent loop state (for tracking)\n */\nexport interface AgentLoopState {\n /** Current iteration number */\n iteration: number;\n /** Maximum iterations allowed */\n maxIterations: number;\n /** Whether the loop is currently running */\n running: boolean;\n /** Whether max iterations was reached */\n maxIterationsReached: boolean;\n /** Whether the loop was aborted */\n aborted: boolean;\n}\n\n// ============================================\n// ToolSet Type (Vercel AI SDK pattern)\n// ============================================\n\n/**\n * A set of tools, keyed by tool name\n *\n * @example\n * ```typescript\n * const myTools: ToolSet = {\n * capture_screenshot: screenshotTool,\n * get_weather: weatherTool,\n * };\n * ```\n */\nexport type ToolSet = Record<string, ToolDefinition>;\n\n// ============================================\n// Tool Helper Function (Vercel AI SDK pattern)\n// ============================================\n\n/**\n * Configuration for creating a tool\n */\nexport interface ToolConfig<TParams = Record<string, unknown>> {\n /** Tool description for LLM */\n description: string;\n /** Where the tool executes (default: 'client') */\n location?: ToolLocation;\n\n // Display Configuration\n /** Human-readable title for UI display */\n title?: string | ((args: TParams) => string);\n /** Title shown while executing */\n executingTitle?: string | ((args: TParams) => string);\n /** Title shown after completion */\n completedTitle?: string | ((args: TParams) => string);\n\n /** JSON Schema for input parameters */\n inputSchema?: ToolInputSchema;\n /** Handler function */\n handler?: (\n params: TParams,\n context?: ToolContext,\n ) => Promise<ToolResponse> | ToolResponse;\n /** Optional render function for UI */\n render?: (props: ToolRenderProps<TParams>) => unknown;\n /** Whether the tool is available */\n available?: boolean;\n /** Require user approval before execution */\n needsApproval?: boolean | ((params: TParams) => boolean | Promise<boolean>);\n /** Custom message shown in the approval UI */\n approvalMessage?: string | ((params: TParams) => string);\n /** AI response mode for this tool (default: 'full') */\n aiResponseMode?: AIResponseMode;\n /** Context/summary sent to AI instead of full result */\n aiContext?:\n | string\n | ((result: ToolResponse, args: Record<string, unknown>) => string);\n}\n\n/**\n * Create a tool definition (similar to Vercel AI SDK's tool())\n *\n * @example\n * ```typescript\n * const weatherTool = tool({\n * description: 'Get weather for a location',\n * inputSchema: {\n * type: 'object',\n * properties: {\n * location: { type: 'string', description: 'City name' },\n * },\n * required: ['location'],\n * },\n * handler: async ({ location }) => {\n * const weather = await fetchWeather(location);\n * return success(weather);\n * },\n * });\n * ```\n */\nexport function tool<TParams = Record<string, unknown>>(\n config: ToolConfig<TParams>,\n): Omit<ToolDefinition<TParams>, \"name\"> {\n return {\n description: config.description,\n location: config.location ?? \"client\",\n // Display configuration\n title: config.title,\n executingTitle: config.executingTitle,\n completedTitle: config.completedTitle,\n // Schema and handlers\n inputSchema: config.inputSchema ?? {\n type: \"object\",\n properties: {},\n required: [],\n },\n handler: config.handler,\n render: config.render,\n available: config.available,\n needsApproval: config.needsApproval,\n approvalMessage: config.approvalMessage,\n aiResponseMode: config.aiResponseMode,\n aiContext: config.aiContext,\n };\n}\n\n// ============================================\n// Helper Functions\n// ============================================\n\n/**\n * Convert ToolDefinition to OpenAI tool format\n */\nexport function toolToOpenAIFormat(tool: ToolDefinition): object {\n return {\n type: \"function\",\n function: {\n name: tool.name,\n description: tool.description,\n parameters: tool.inputSchema,\n },\n };\n}\n\n/**\n * Convert ToolDefinition to Anthropic tool format\n */\nexport function toolToAnthropicFormat(tool: ToolDefinition): object {\n return {\n name: tool.name,\n description: tool.description,\n input_schema: tool.inputSchema,\n };\n}\n\n/**\n * Create a tool result response\n */\nexport function createToolResult(\n toolCallId: string,\n response: ToolResponse,\n): UnifiedToolResult {\n return {\n toolCallId,\n content: JSON.stringify(response),\n success: response.success,\n error: response.error,\n };\n}\n\n/**\n * Create a successful tool response\n */\nexport function success<T = unknown>(\n data?: T,\n message?: string,\n): ToolResponse<T> {\n return {\n success: true,\n data,\n message,\n };\n}\n\n/**\n * Create a failed tool response\n */\nexport function failure(error: string): ToolResponse {\n return {\n success: false,\n error,\n };\n}\n","/**\n * Built-in Screenshot Tool\n *\n * A pre-configured tool that captures screenshots of the user's viewport.\n * Can be used with useTools() hook in React.\n */\n\nimport { tool, success, failure } from \"../../types/tools\";\nimport { captureScreenshot, isScreenshotSupported } from \"../screenshot\";\nimport type { ScreenshotOptions } from \"../types\";\n\n/**\n * Screenshot tool - captures the user's screen\n *\n * @example\n * ```tsx\n * import { screenshotTool } from '@yourgpt/copilot-sdk-core';\n *\n * // In your component\n * useTools({\n * capture_screenshot: screenshotTool,\n * });\n * ```\n */\nexport const screenshotTool = tool<{ quality?: number }>({\n description:\n \"Capture a screenshot of the user's current screen/viewport. Use this when the user asks you to look at their screen, see what they're seeing, help with visual issues, or debug UI problems.\",\n location: \"client\",\n inputSchema: {\n type: \"object\",\n properties: {\n quality: {\n type: \"number\",\n description: \"Image quality from 0 to 1 (default: 0.8)\",\n minimum: 0,\n maximum: 1,\n },\n },\n required: [],\n },\n needsApproval: true,\n approvalMessage: \"Allow AI to capture a screenshot of your screen?\",\n handler: async (params) => {\n if (!isScreenshotSupported()) {\n return failure(\"Screenshot capture is not supported in this environment\");\n }\n\n try {\n const options: ScreenshotOptions = {};\n if (params.quality !== undefined) {\n options.quality = params.quality;\n }\n\n const result = await captureScreenshot(options);\n\n // Return with addAsUserMessage flag so the provider adds it as a user message\n // This allows the AI to actually SEE the image through vision capabilities\n return {\n success: true,\n message: `Screenshot captured (${result.width}x${result.height}). The image is shared in the conversation.`,\n addAsUserMessage: true,\n data: {\n attachment: {\n type: \"image\" as const,\n data: result.data,\n mimeType: `image/${result.format}`,\n filename: \"screenshot.png\",\n },\n dimensions: {\n width: result.width,\n height: result.height,\n },\n },\n };\n } catch (error) {\n return failure(\n error instanceof Error ? error.message : \"Screenshot capture failed\",\n );\n }\n },\n});\n\n/**\n * Create a custom screenshot tool with different options\n */\nexport function createScreenshotTool(options?: {\n needsApproval?: boolean;\n approvalMessage?: string;\n defaultQuality?: number;\n}) {\n return tool<{ quality?: number }>({\n ...screenshotTool,\n needsApproval: options?.needsApproval ?? true,\n approvalMessage:\n options?.approvalMessage ??\n \"Allow AI to capture a screenshot of your screen?\",\n handler: async (params) => {\n if (!isScreenshotSupported()) {\n return failure(\n \"Screenshot capture is not supported in this environment\",\n );\n }\n\n try {\n const result = await captureScreenshot({\n quality: params.quality ?? options?.defaultQuality ?? 0.8,\n });\n\n // Return with addAsUserMessage flag so the provider adds it as a user message\n return {\n success: true,\n message: `Screenshot captured (${result.width}x${result.height}). The image is shared in the conversation.`,\n addAsUserMessage: true,\n data: {\n attachment: {\n type: \"image\" as const,\n data: result.data,\n mimeType: `image/${result.format}`,\n filename: \"screenshot.png\",\n },\n dimensions: {\n width: result.width,\n height: result.height,\n },\n },\n };\n } catch (error) {\n return failure(\n error instanceof Error ? error.message : \"Screenshot capture failed\",\n );\n }\n },\n });\n}\n","/**\n * Built-in Console Logs Tool\n *\n * A pre-configured tool that retrieves browser console logs.\n * Can be used with useTools() hook in React.\n */\n\nimport { tool, success, failure } from \"../../types/tools\";\nimport {\n getConsoleLogs,\n formatLogsForAI,\n isConsoleCaptureActive,\n startConsoleCapture,\n} from \"../console\";\n\n/**\n * Console logs tool - retrieves browser console output\n *\n * @example\n * ```tsx\n * import { consoleLogsTool } from '@yourgpt/copilot-sdk-core';\n *\n * // In your component\n * useTools({\n * get_console_logs: consoleLogsTool,\n * });\n * ```\n */\nexport const consoleLogsTool = tool<{ limit?: number; types?: string[] }>({\n description:\n \"Get recent console logs from the browser. Use this when debugging JavaScript errors, checking for warnings, or understanding what's happening in the application.\",\n location: \"client\",\n inputSchema: {\n type: \"object\",\n properties: {\n limit: {\n type: \"number\",\n description: \"Maximum number of logs to return (default: 50)\",\n },\n types: {\n type: \"array\",\n description:\n \"Filter by log types: 'error', 'warn', 'info', 'log', 'debug'\",\n items: {\n type: \"string\",\n enum: [\"error\", \"warn\", \"info\", \"log\", \"debug\"],\n },\n },\n },\n required: [],\n },\n needsApproval: true,\n approvalMessage: \"Allow AI to access browser console logs?\",\n handler: async (params) => {\n try {\n // Start capture if not already active\n if (!isConsoleCaptureActive()) {\n startConsoleCapture();\n }\n\n const logs = getConsoleLogs({\n limit: params.limit || 50,\n types: params.types as\n | (\"error\" | \"warn\" | \"info\" | \"log\" | \"debug\")[]\n | undefined,\n });\n\n const formattedLogs = formatLogsForAI(logs.logs);\n\n return success(\n {\n logs: formattedLogs,\n count: logs.logs.length,\n totalCaptured: logs.totalCaptured,\n },\n `Retrieved ${logs.logs.length} console logs`,\n );\n } catch (error) {\n return failure(\n error instanceof Error ? error.message : \"Failed to get console logs\",\n );\n }\n },\n});\n\n/**\n * Create a custom console logs tool with different options\n */\nexport function createConsoleLogsTool(options?: {\n needsApproval?: boolean;\n approvalMessage?: string;\n defaultLimit?: number;\n}) {\n return tool<{ limit?: number; types?: string[] }>({\n ...consoleLogsTool,\n needsApproval: options?.needsApproval ?? true,\n approvalMessage:\n options?.approvalMessage ?? \"Allow AI to access browser console logs?\",\n handler: async (params) => {\n try {\n if (!isConsoleCaptureActive()) {\n startConsoleCapture();\n }\n\n const logs = getConsoleLogs({\n limit: params.limit || options?.defaultLimit || 50,\n types: params.types as\n | (\"error\" | \"warn\" | \"info\" | \"log\" | \"debug\")[]\n | undefined,\n });\n\n const formattedLogs = formatLogsForAI(logs.logs);\n\n return success(\n {\n logs: formattedLogs,\n count: logs.logs.length,\n totalCaptured: logs.totalCaptured,\n },\n `Retrieved ${logs.logs.length} console logs`,\n );\n } catch (error) {\n return failure(\n error instanceof Error ? error.message : \"Failed to get console logs\",\n );\n }\n },\n });\n}\n","/**\n * Built-in Network Requests Tool\n *\n * A pre-configured tool that retrieves browser network requests.\n * Can be used with useTools() hook in React.\n */\n\nimport { tool, success, failure } from \"../../types/tools\";\nimport {\n getNetworkRequests,\n formatRequestsForAI,\n isNetworkCaptureActive,\n startNetworkCapture,\n} from \"../network\";\n\n/**\n * Network requests tool - retrieves browser network activity\n *\n * @example\n * ```tsx\n * import { networkRequestsTool } from '@yourgpt/copilot-sdk-core';\n *\n * // In your component\n * useTools({\n * get_network_requests: networkRequestsTool,\n * });\n * ```\n */\nexport const networkRequestsTool = tool<{\n limit?: number;\n failedOnly?: boolean;\n}>({\n description:\n \"Get recent network requests from the browser. Use this when debugging API calls, checking for failed requests, analyzing network activity, or troubleshooting connectivity issues.\",\n location: \"client\",\n inputSchema: {\n type: \"object\",\n properties: {\n limit: {\n type: \"number\",\n description: \"Maximum number of requests to return (default: 20)\",\n },\n failedOnly: {\n type: \"boolean\",\n description: \"Only return failed requests (status >= 400)\",\n },\n },\n required: [],\n },\n needsApproval: true,\n approvalMessage: \"Allow AI to access network request history?\",\n handler: async (params) => {\n try {\n // Start capture if not already active\n if (!isNetworkCaptureActive()) {\n startNetworkCapture();\n }\n\n const requests = getNetworkRequests({\n limit: params.limit || 20,\n failedOnly: params.failedOnly,\n });\n\n const formattedRequests = formatRequestsForAI(requests.requests);\n\n return success(\n {\n requests: formattedRequests,\n count: requests.requests.length,\n totalCaptured: requests.totalCaptured,\n },\n `Retrieved ${requests.requests.length} network requests`,\n );\n } catch (error) {\n return failure(\n error instanceof Error\n ? error.message\n : \"Failed to get network requests\",\n );\n }\n },\n});\n\n/**\n * Create a custom network requests tool with different options\n */\nexport function createNetworkRequestsTool(options?: {\n needsApproval?: boolean;\n approvalMessage?: string;\n defaultLimit?: number;\n}) {\n return tool<{ limit?: number; failedOnly?: boolean }>({\n ...networkRequestsTool,\n needsApproval: options?.needsApproval ?? true,\n approvalMessage:\n options?.approvalMessage ?? \"Allow AI to access network request history?\",\n handler: async (params) => {\n try {\n if (!isNetworkCaptureActive()) {\n startNetworkCapture();\n }\n\n const requests = getNetworkRequests({\n limit: params.limit || options?.defaultLimit || 20,\n failedOnly: params.failedOnly,\n });\n\n const formattedRequests = formatRequestsForAI(requests.requests);\n\n return success(\n {\n requests: formattedRequests,\n count: requests.requests.length,\n totalCaptured: requests.totalCaptured,\n },\n `Retrieved ${requests.requests.length} network requests`,\n );\n } catch (error) {\n return failure(\n error instanceof Error\n ? error.message\n : \"Failed to get network requests\",\n );\n }\n },\n });\n}\n","/**\n * Built-in Tools\n *\n * Pre-configured tools for common client-side operations.\n * These can be registered using the useTools() hook.\n *\n * @example\n * ```tsx\n * import { builtinTools } from '@yourgpt/copilot-sdk-core';\n *\n * // Register all built-in tools\n * useTools(builtinTools);\n *\n * // Or register specific tools\n * useTools({\n * capture_screenshot: builtinTools.capture_screenshot,\n * });\n * ```\n */\n\nimport type { ToolDefinition } from \"../../types/tools\";\n\n// Import tools for builtinTools object\nimport { screenshotTool, createScreenshotTool } from \"./screenshot\";\nimport { consoleLogsTool, createConsoleLogsTool } from \"./console\";\nimport { networkRequestsTool, createNetworkRequestsTool } from \"./network\";\n\n// Re-export individual tools\nexport {\n screenshotTool,\n createScreenshotTool,\n consoleLogsTool,\n createConsoleLogsTool,\n networkRequestsTool,\n createNetworkRequestsTool,\n};\n\n/**\n * All built-in tools as a ToolSet\n *\n * @example\n * ```tsx\n * import { builtinTools } from '@yourgpt/copilot-sdk-core';\n *\n * // Use with useTools hook\n * useTools(builtinTools);\n *\n * // Or spread with custom tools\n * useTools({\n * ...builtinTools,\n * my_custom_tool: myTool,\n * });\n * ```\n */\nexport const builtinTools: Record<string, ToolDefinition> = {\n capture_screenshot: {\n name: \"capture_screenshot\",\n ...screenshotTool,\n } as ToolDefinition,\n get_console_logs: {\n name: \"get_console_logs\",\n ...consoleLogsTool,\n } as ToolDefinition,\n get_network_requests: {\n name: \"get_network_requests\",\n ...networkRequestsTool,\n } as ToolDefinition,\n};\n","/**\n * Generate a unique ID with optional prefix\n */\nexport function generateId(prefix = \"id\"): string {\n return `${prefix}_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`;\n}\n\n/**\n * Generate a message ID\n */\nexport function generateMessageId(): string {\n return generateId(\"msg\");\n}\n\n/**\n * Generate a conversation/thread ID\n */\nexport function generateThreadId(): string {\n return generateId(\"thread\");\n}\n\n/**\n * Generate a tool call ID\n */\nexport function generateToolCallId(): string {\n return generateId(\"call\");\n}\n","import { generateMessageId } from \"../utils/id\";\n\n/**\n * Message roles in a conversation (OpenAI format)\n */\nexport type MessageRole = \"user\" | \"assistant\" | \"system\" | \"tool\";\n\n/**\n * A source document from knowledge base\n */\nexport interface Source {\n /** Unique identifier */\n id: string;\n /** Source title or filename */\n title: string;\n /** Relevant content snippet */\n content: string;\n /** URL if available */\n url?: string;\n /** Relevance score (0-1) */\n score?: number;\n /** Additional metadata */\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Tool/function call in OpenAI format\n * Used in assistant messages when AI wants to call tools\n */\nexport interface ToolCall {\n /** Unique identifier for this call */\n id: string;\n /** Always \"function\" for OpenAI compatibility */\n type: \"function\";\n /** Function details */\n function: {\n /** Name of the function/tool */\n name: string;\n /** Arguments as JSON string (OpenAI format) */\n arguments: string;\n };\n}\n\n/**\n * Attachment in a message (images, files, etc.)\n *\n * Attachments can be stored as:\n * - Base64 data (free tier, embedded in message)\n * - URL (premium cloud storage, lighter payload)\n */\nexport interface MessageAttachment {\n /** Type of attachment */\n type: \"image\" | \"file\" | \"audio\" | \"video\";\n /** Base64 data (for embedded attachments) */\n data?: string;\n /** URL for cloud-stored attachments (managed cloud storage) */\n url?: string;\n /** MIME type */\n mimeType: string;\n /** Optional filename */\n filename?: string;\n}\n\n/**\n * Token usage information\n */\nexport interface TokenUsage {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens?: number;\n}\n\n/**\n * Message metadata (flexible container for provider-specific data)\n */\nexport interface MessageMetadata {\n /** Extended thinking/reasoning (Claude, DeepSeek) */\n thinking?: string;\n /** Knowledge base sources */\n sources?: Source[];\n /** Attachments (images, files) */\n attachments?: MessageAttachment[];\n /** Model used to generate this message */\n model?: string;\n /** Token usage */\n usage?: TokenUsage;\n /** Any additional data */\n [key: string]: unknown;\n}\n\n/**\n * A message in the conversation (OpenAI format)\n *\n * This format is compatible with OpenAI's Chat Completions API\n * and can be stored directly in a database (1 row per message).\n *\n * Message types:\n * - user: User's input message\n * - assistant: AI's response (may include tool_calls)\n * - tool: Result of a tool execution (has tool_call_id)\n * - system: System prompt (usually first message)\n *\n * @example\n * // User message\n * { role: \"user\", content: \"What's the weather?\" }\n *\n * // Assistant requesting tool\n * { role: \"assistant\", content: null, tool_calls: [{...}] }\n *\n * // Tool result\n * { role: \"tool\", content: '{\"temp\": 72}', tool_call_id: \"call_abc\" }\n *\n * // Final assistant response\n * { role: \"assistant\", content: \"The temperature is 72°F\" }\n */\nexport interface Message {\n /** Unique identifier */\n id: string;\n\n /** Thread/conversation ID (for multi-session apps) */\n thread_id?: string;\n\n /** Role of the message sender */\n role: MessageRole;\n\n /** Text content (null for tool-calling assistant messages) */\n content: string | null;\n\n /**\n * Tool calls made by assistant (OpenAI format)\n * Only present when role is \"assistant\" and AI wants to call tools\n */\n tool_calls?: ToolCall[];\n\n /**\n * Tool call ID this message is responding to\n * Only present when role is \"tool\"\n */\n tool_call_id?: string;\n\n /**\n * Flexible metadata container\n * Contains: thinking, sources, attachments, model, usage, etc.\n */\n metadata?: MessageMetadata;\n\n /** When the message was created */\n created_at: Date;\n}\n\n/**\n * Helper to parse tool call arguments\n */\nexport function parseToolCallArgs<T = Record<string, unknown>>(\n toolCall: ToolCall,\n): T {\n try {\n return JSON.parse(toolCall.function.arguments) as T;\n } catch {\n return {} as T;\n }\n}\n\n/**\n * Helper to create a tool call\n */\nexport function createToolCall(\n id: string,\n name: string,\n args: Record<string, unknown>,\n): ToolCall {\n return {\n id,\n type: \"function\",\n function: {\n name,\n arguments: JSON.stringify(args),\n },\n };\n}\n\n/**\n * Create a new message with defaults\n */\nexport function createMessage(\n partial: Partial<Message> &\n Pick<Message, \"role\"> & { content?: string | null },\n): Message {\n return {\n id: partial.id ?? generateMessageId(),\n thread_id: partial.thread_id,\n role: partial.role,\n content: partial.content ?? null,\n tool_calls: partial.tool_calls,\n tool_call_id: partial.tool_call_id,\n metadata: partial.metadata,\n created_at: partial.created_at ?? new Date(),\n };\n}\n\n/**\n * Create a user message\n */\nexport function createUserMessage(\n content: string,\n options?: {\n id?: string;\n thread_id?: string;\n attachments?: MessageAttachment[];\n },\n): Message {\n return createMessage({\n id: options?.id,\n thread_id: options?.thread_id,\n role: \"user\",\n content,\n metadata: options?.attachments\n ? { attachments: options.attachments }\n : undefined,\n });\n}\n\n/**\n * Create an assistant message\n */\nexport function createAssistantMessage(\n content: string | null,\n options?: {\n id?: string;\n thread_id?: string;\n tool_calls?: ToolCall[];\n thinking?: string;\n sources?: Source[];\n model?: string;\n },\n): Message {\n const metadata: MessageMetadata = {};\n if (options?.thinking) metadata.thinking = options.thinking;\n if (options?.sources) metadata.sources = options.sources;\n if (options?.model) metadata.model = options.model;\n\n return createMessage({\n id: options?.id,\n thread_id: options?.thread_id,\n role: \"assistant\",\n content,\n tool_calls: options?.tool_calls,\n metadata: Object.keys(metadata).length > 0 ? metadata : undefined,\n });\n}\n\n/**\n * Create a tool result message\n */\nexport function createToolMessage(\n toolCallId: string,\n result: {\n success: boolean;\n data?: unknown;\n error?: string;\n message?: string;\n },\n options?: { id?: string; thread_id?: string },\n): Message {\n return createMessage({\n id: options?.id,\n thread_id: options?.thread_id,\n role: \"tool\",\n content: JSON.stringify(result),\n tool_call_id: toolCallId,\n });\n}\n\n/**\n * Check if a message has tool calls\n */\nexport function hasToolCalls(message: Message): boolean {\n return (\n message.role === \"assistant\" &&\n Array.isArray(message.tool_calls) &&\n message.tool_calls.length > 0\n );\n}\n\n/**\n * Check if a message is a tool result\n */\nexport function isToolResult(message: Message): boolean {\n return message.role === \"tool\" && !!message.tool_call_id;\n}\n","/**\n * Supported LLM providers\n */\nexport type LLMProvider =\n | \"openai\"\n | \"anthropic\"\n | \"google\"\n | \"groq\"\n | \"ollama\"\n | \"custom\";\n\n/**\n * LLM configuration\n */\nexport interface LLMConfig {\n /** LLM provider */\n provider: LLMProvider;\n /** Model name (e.g., 'gpt-4o', 'claude-3-5-sonnet-latest') */\n model?: string;\n /** API key for the provider */\n apiKey?: string;\n /** Base URL for custom/self-hosted models */\n baseUrl?: string;\n /** Temperature (0-2) */\n temperature?: number;\n /** Maximum tokens in response */\n maxTokens?: number;\n /** Top P sampling */\n topP?: number;\n /** Frequency penalty */\n frequencyPenalty?: number;\n /** Presence penalty */\n presencePenalty?: number;\n /** Enable streaming responses (default: true) */\n streaming?: boolean;\n}\n\n/**\n * Cloud configuration (for managed hosting)\n */\nexport interface CloudConfig {\n /** API key */\n apiKey: string;\n /** Bot ID */\n botId: string;\n /** Custom API endpoint (optional) */\n endpoint?: string;\n}\n\n/**\n * Extension configuration\n */\nexport interface Extension {\n /** Extension name */\n name: string;\n /** Extension configuration */\n config: Record<string, unknown>;\n /** Initialize the extension */\n init?: () => Promise<void>;\n}\n\n/**\n * Main SDK configuration\n */\nexport interface CopilotConfig {\n /** LLM configuration (for self-hosted) */\n config?: LLMConfig;\n /** Cloud configuration (for managed hosting) */\n cloud?: CloudConfig;\n /** Runtime URL for self-hosted backend */\n runtimeUrl?: string;\n /** System prompt */\n systemPrompt?: string;\n /** Extensions (like knowledge base) */\n extensions?: Extension[];\n /** Enable debug logging */\n debug?: boolean;\n}\n\n/**\n * Default LLM configurations per provider\n */\nexport const DEFAULT_MODELS: Record<LLMProvider, string> = {\n openai: \"gpt-4o\",\n anthropic: \"claude-3-5-sonnet-latest\",\n google: \"gemini-pro\",\n groq: \"llama-3.1-70b-versatile\",\n ollama: \"llama3\",\n custom: \"default\",\n};\n\n/**\n * Get default model for a provider\n */\nexport function getDefaultModel(provider: LLMProvider): string {\n return DEFAULT_MODELS[provider] || \"default\";\n}\n","/**\n * Parameter types for actions\n */\nexport type ParameterType =\n | \"string\"\n | \"number\"\n | \"boolean\"\n | \"object\"\n | \"array\";\n\n/**\n * Action parameter definition\n */\nexport interface ActionParameter {\n /** Parameter type */\n type: ParameterType;\n /** Description of the parameter */\n description?: string;\n /** Whether the parameter is required */\n required?: boolean;\n /** Default value */\n default?: unknown;\n /** Enum values for string type */\n enum?: string[];\n /** Properties for object type */\n properties?: Record<string, ActionParameter>;\n /** Items schema for array type */\n items?: ActionParameter;\n}\n\n/**\n * Action definition\n */\nexport interface ActionDefinition<TParams = Record<string, unknown>> {\n /** Unique name for the action */\n name: string;\n /** Description of what the action does */\n description: string;\n /** Parameter definitions */\n parameters?: Record<string, ActionParameter>;\n /** Handler function */\n handler: (params: TParams) => unknown | Promise<unknown>;\n /** Optional render function for UI */\n render?: (props: ActionRenderProps<TParams>) => unknown;\n}\n\n/**\n * Props passed to action render function\n */\nexport interface ActionRenderProps<TParams = Record<string, unknown>> {\n /** Current status */\n status: \"pending\" | \"executing\" | \"completed\" | \"error\";\n /** Arguments passed to the action */\n args: TParams;\n /** Result if completed */\n result?: unknown;\n /** Error if failed */\n error?: string;\n}\n\n/**\n * Convert action definition to OpenAI tool format\n */\nexport function actionToTool(action: ActionDefinition): object {\n const properties: Record<string, object> = {};\n const required: string[] = [];\n\n if (action.parameters) {\n for (const [name, param] of Object.entries(action.parameters)) {\n properties[name] = parameterToJsonSchema(param);\n if (param.required) {\n required.push(name);\n }\n }\n }\n\n return {\n type: \"function\",\n function: {\n name: action.name,\n description: action.description,\n parameters: {\n type: \"object\",\n properties,\n required: required.length > 0 ? required : undefined,\n },\n },\n };\n}\n\n/**\n * Convert parameter to JSON Schema format\n */\nfunction parameterToJsonSchema(param: ActionParameter): object {\n const schema: Record<string, unknown> = {\n type: param.type,\n };\n\n if (param.description) {\n schema.description = param.description;\n }\n\n if (param.enum) {\n schema.enum = param.enum;\n }\n\n if (param.default !== undefined) {\n schema.default = param.default;\n }\n\n if (param.properties) {\n schema.properties = {};\n for (const [name, prop] of Object.entries(param.properties)) {\n (schema.properties as Record<string, object>)[name] =\n parameterToJsonSchema(prop);\n }\n }\n\n if (param.items) {\n schema.items = parameterToJsonSchema(param.items);\n }\n\n return schema;\n}\n","import type { Source } from \"./message\";\nimport type { ToolResponse, ToolExecutionStatus } from \"./tools\";\n\n/**\n * Stream event types\n */\nexport type StreamEventType =\n | \"message:start\"\n | \"message:delta\"\n | \"message:end\"\n | \"thinking:start\"\n | \"thinking:delta\"\n | \"thinking:end\"\n | \"source:add\"\n | \"action:start\"\n | \"action:args\"\n | \"action:end\"\n | \"tool_calls\"\n | \"tool:status\"\n | \"tool:result\"\n | \"loop:iteration\"\n | \"loop:complete\"\n | \"error\"\n | \"done\";\n\n/**\n * Base event interface\n */\ninterface BaseEvent {\n type: StreamEventType;\n}\n\n/**\n * Message started streaming\n */\nexport interface MessageStartEvent extends BaseEvent {\n type: \"message:start\";\n /** Message ID */\n id: string;\n}\n\n/**\n * Message content delta (incremental update)\n */\nexport interface MessageDeltaEvent extends BaseEvent {\n type: \"message:delta\";\n /** Content chunk */\n content: string;\n}\n\n/**\n * Message finished streaming\n */\nexport interface MessageEndEvent extends BaseEvent {\n type: \"message:end\";\n}\n\n// ============================================\n// Thinking/Reasoning Events\n// ============================================\n\n/**\n * Thinking/reasoning started (for models like Claude, DeepSeek)\n */\nexport interface ThinkingStartEvent extends BaseEvent {\n type: \"thinking:start\";\n}\n\n/**\n * Thinking content delta (incremental update)\n */\nexport interface ThinkingDeltaEvent extends BaseEvent {\n type: \"thinking:delta\";\n /** Thinking content chunk */\n content: string;\n}\n\n/**\n * Thinking finished\n */\nexport interface ThinkingEndEvent extends BaseEvent {\n type: \"thinking:end\";\n}\n\n/**\n * Knowledge base source added\n */\nexport interface SourceAddEvent extends BaseEvent {\n type: \"source:add\";\n /** Source document */\n source: Source;\n}\n\n/**\n * Action/tool execution started\n */\nexport interface ActionStartEvent extends BaseEvent {\n type: \"action:start\";\n /** Tool call ID */\n id: string;\n /** Action name */\n name: string;\n}\n\n/**\n * Action arguments (streaming)\n */\nexport interface ActionArgsEvent extends BaseEvent {\n type: \"action:args\";\n /** Tool call ID */\n id: string;\n /** Partial arguments JSON */\n args: string;\n}\n\n/**\n * Action execution completed\n */\nexport interface ActionEndEvent extends BaseEvent {\n type: \"action:end\";\n /** Tool call ID */\n id: string;\n /** Action name */\n name?: string;\n /** Result of the action */\n result?: unknown;\n /** Error if failed */\n error?: string;\n}\n\n/**\n * Error event\n */\nexport interface ErrorEvent extends BaseEvent {\n type: \"error\";\n /** Error message */\n message: string;\n /** Error code */\n code?: string;\n}\n\n/**\n * Message format for done event (API format with snake_case)\n */\nexport interface DoneEventMessage {\n role: \"assistant\" | \"tool\";\n content: string | null;\n tool_calls?: Array<{\n id: string;\n type: \"function\";\n function: {\n name: string;\n arguments: string;\n };\n }>;\n tool_call_id?: string;\n}\n\n/**\n * Stream completed\n */\nexport interface DoneEvent extends BaseEvent {\n type: \"done\";\n /**\n * True when client needs to execute tools and send results in next request\n * (Vercel AI SDK pattern)\n */\n requiresAction?: boolean;\n /**\n * All new messages created during this request (for client to append to state)\n * This includes: assistant messages with tool_calls, tool result messages, final response\n */\n messages?: DoneEventMessage[];\n}\n\n// ============================================\n// Tool/Loop Events (Agentic Loop)\n// ============================================\n\n/**\n * Tool call information for client execution\n */\nexport interface ToolCallInfo {\n /** Unique tool call ID */\n id: string;\n /** Tool name */\n name: string;\n /** Tool arguments (parsed JSON) */\n args: Record<string, unknown>;\n}\n\n/**\n * Assistant message with tool calls (for including in next request)\n */\nexport interface AssistantToolMessage {\n role: \"assistant\";\n content: string | null;\n tool_calls: Array<{\n id: string;\n type: \"function\";\n function: {\n name: string;\n arguments: string;\n };\n }>;\n}\n\n/**\n * Server detected tool calls - client should execute and send results in next request\n * (Vercel AI SDK pattern - replaces tool:execute)\n */\nexport interface ToolCallsEvent extends BaseEvent {\n type: \"tool_calls\";\n /** Tool calls to execute */\n toolCalls: ToolCallInfo[];\n /**\n * Assistant message to include in next request's messages\n * This preserves the tool_calls structure for the LLM\n */\n assistantMessage: AssistantToolMessage;\n}\n\n/**\n * Tool execution status update\n */\nexport interface ToolStatusEvent extends BaseEvent {\n type: \"tool:status\";\n /** Tool call ID */\n id: string;\n /** Execution status */\n status: ToolExecutionStatus;\n}\n\n/**\n * Tool result received (from client or server)\n */\nexport interface ToolResultEvent extends BaseEvent {\n type: \"tool:result\";\n /** Tool call ID */\n id: string;\n /** Tool name */\n name: string;\n /** Tool result */\n result: ToolResponse;\n}\n\n/**\n * Loop iteration progress\n */\nexport interface LoopIterationEvent extends BaseEvent {\n type: \"loop:iteration\";\n /** Current iteration number (1-based) */\n iteration: number;\n /** Maximum iterations allowed */\n maxIterations: number;\n}\n\n/**\n * Loop completed\n */\nexport interface LoopCompleteEvent extends BaseEvent {\n type: \"loop:complete\";\n /** Total iterations executed */\n iterations: number;\n /** Whether loop was aborted by user */\n aborted?: boolean;\n /** Whether max iterations was reached */\n maxIterationsReached?: boolean;\n}\n\n/**\n * Union of all stream events\n */\nexport type StreamEvent =\n | MessageStartEvent\n | MessageDeltaEvent\n | MessageEndEvent\n | ThinkingStartEvent\n | ThinkingDeltaEvent\n | ThinkingEndEvent\n | SourceAddEvent\n | ActionStartEvent\n | ActionArgsEvent\n | ActionEndEvent\n | ToolCallsEvent\n | ToolStatusEvent\n | ToolResultEvent\n | LoopIterationEvent\n | LoopCompleteEvent\n | ErrorEvent\n | DoneEvent;\n\n/**\n * Parse a stream event from JSON\n */\nexport function parseStreamEvent(data: string): StreamEvent | null {\n try {\n return JSON.parse(data) as StreamEvent;\n } catch {\n return null;\n }\n}\n\n/**\n * Serialize a stream event to JSON\n */\nexport function serializeStreamEvent(event: StreamEvent): string {\n return JSON.stringify(event);\n}\n\n/**\n * Format event for SSE\n */\nexport function formatSSE(event: StreamEvent): string {\n return `data: ${serializeStreamEvent(event)}\\n\\n`;\n}\n","import type { Message, Source } from \"./message\";\n\n/**\n * Thread metadata (for listing threads)\n */\nexport interface Thread {\n /** Unique thread identifier */\n id: string;\n /** Thread title (auto-generated from first message or manual) */\n title?: string;\n /** When thread was created */\n createdAt: Date;\n /** When thread was last updated */\n updatedAt: Date;\n}\n\n/**\n * Full thread data including messages\n */\nexport interface ThreadData extends Thread {\n /** Messages in this thread */\n messages: Message[];\n /** Sources from knowledge base for this thread */\n sources: Source[];\n}\n\n/**\n * Persistence storage interface for custom adapters\n */\nexport interface ThreadStorageAdapter {\n /** Save threads to storage */\n save: (threads: ThreadData[]) => Promise<void>;\n /** Load threads from storage */\n load: () => Promise<ThreadData[]>;\n /** Clear all threads from storage */\n clear: () => Promise<void>;\n}\n\n/**\n * Persistence configuration\n */\nexport interface PersistenceConfig {\n /** Enable persistence (default: false) */\n enabled: boolean;\n /** Storage type */\n storage?: \"localStorage\" | \"custom\";\n /** Custom storage adapter (required if storage is 'custom') */\n customStorage?: ThreadStorageAdapter;\n}\n\n/**\n * Generate a thread title from message content\n */\nexport function generateThreadTitle(content: string): string {\n const trimmed = content.trim();\n if (trimmed.length <= 50) return trimmed;\n return trimmed.substring(0, 47) + \"...\";\n}\n","import type { StreamEvent } from \"../types\";\n\n/**\n * Parse SSE stream data\n */\nexport function parseSSELine(line: string): StreamEvent | null {\n if (!line.startsWith(\"data: \")) {\n return null;\n }\n\n const data = line.slice(6).trim();\n\n if (data === \"[DONE]\") {\n return { type: \"done\" };\n }\n\n try {\n return JSON.parse(data) as StreamEvent;\n } catch {\n return null;\n }\n}\n\n/**\n * Create an async iterator from SSE response\n */\nexport async function* streamSSE(\n response: Response,\n): AsyncGenerator<StreamEvent, void, undefined> {\n if (!response.body) {\n throw new Error(\"Response body is null\");\n }\n\n const reader = response.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 if (done) {\n break;\n }\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() || \"\";\n\n for (const line of lines) {\n const event = parseSSELine(line);\n if (event) {\n yield event;\n }\n }\n }\n\n // Process remaining buffer\n if (buffer.trim()) {\n const event = parseSSELine(buffer);\n if (event) {\n yield event;\n }\n }\n } finally {\n reader.releaseLock();\n }\n}\n\n/**\n * Create SSE response from async generator\n */\nexport function createSSEStream(\n generator: AsyncGenerator<StreamEvent, void, undefined>,\n): ReadableStream<Uint8Array> {\n const encoder = new TextEncoder();\n\n return new ReadableStream({\n async start(controller) {\n try {\n for await (const event of generator) {\n const data = `data: ${JSON.stringify(event)}\\n\\n`;\n controller.enqueue(encoder.encode(data));\n }\n controller.enqueue(encoder.encode(\"data: [DONE]\\n\\n\"));\n controller.close();\n } catch (error) {\n const errorEvent: StreamEvent = {\n type: \"error\",\n message: error instanceof Error ? error.message : \"Unknown error\",\n };\n controller.enqueue(\n encoder.encode(`data: ${JSON.stringify(errorEvent)}\\n\\n`),\n );\n controller.close();\n }\n },\n });\n}\n","/**\n * Zod to JSON Schema conversion utilities\n *\n * Provides helpers to convert Zod schemas to JSON Schema format\n * for use with LLM tool definitions.\n */\n\nimport type {\n JSONSchemaProperty,\n ToolInputSchema,\n ToolDefinition,\n ToolLocation,\n ToolContext,\n ToolResponse,\n} from \"../types/tools\";\n\n// ============================================\n// Zod Type Detection\n// ============================================\n\n/**\n * Check if value is a Zod schema\n */\nfunction isZodSchema(value: unknown): boolean {\n return (\n value !== null &&\n typeof value === \"object\" &&\n \"_def\" in value &&\n typeof (value as Record<string, unknown>)._def === \"object\"\n );\n}\n\n/**\n * Get the Zod type name from a schema\n */\nfunction getZodTypeName(schema: unknown): string {\n if (!isZodSchema(schema)) return \"unknown\";\n const def = (schema as Record<string, unknown>)._def as Record<\n string,\n unknown\n >;\n return (def.typeName as string) || \"unknown\";\n}\n\n/**\n * Get description from Zod schema\n */\nfunction getZodDescription(schema: unknown): string | undefined {\n if (!isZodSchema(schema)) return undefined;\n const def = (schema as Record<string, unknown>)._def as Record<\n string,\n unknown\n >;\n return def.description as string | undefined;\n}\n\n// ============================================\n// Zod to JSON Schema Conversion\n// ============================================\n\n/**\n * Convert a Zod schema to JSON Schema property\n */\nexport function zodToJsonSchema(schema: unknown): JSONSchemaProperty {\n if (!isZodSchema(schema)) {\n return { type: \"string\" };\n }\n\n const typeName = getZodTypeName(schema);\n const description = getZodDescription(schema);\n const def = (schema as Record<string, unknown>)._def as Record<\n string,\n unknown\n >;\n\n switch (typeName) {\n case \"ZodString\": {\n const result: JSONSchemaProperty = { type: \"string\" };\n if (description) result.description = description;\n\n // Handle string constraints\n const checks = def.checks as\n | Array<{ kind: string; value?: unknown }>\n | undefined;\n if (checks) {\n for (const check of checks) {\n if (check.kind === \"min\") result.minLength = check.value as number;\n if (check.kind === \"max\") result.maxLength = check.value as number;\n if (check.kind === \"regex\") result.pattern = String(check.value);\n }\n }\n return result;\n }\n\n case \"ZodNumber\": {\n const result: JSONSchemaProperty = { type: \"number\" };\n if (description) result.description = description;\n\n const checks = def.checks as\n | Array<{ kind: string; value?: unknown }>\n | undefined;\n if (checks) {\n for (const check of checks) {\n if (check.kind === \"min\") result.minimum = check.value as number;\n if (check.kind === \"max\") result.maximum = check.value as number;\n if (check.kind === \"int\") result.type = \"integer\";\n }\n }\n return result;\n }\n\n case \"ZodBoolean\": {\n const result: JSONSchemaProperty = { type: \"boolean\" };\n if (description) result.description = description;\n return result;\n }\n\n case \"ZodEnum\": {\n const values = def.values as (string | number | boolean)[];\n const result: JSONSchemaProperty = {\n type: typeof values[0] === \"number\" ? \"number\" : \"string\",\n enum: values,\n };\n if (description) result.description = description;\n return result;\n }\n\n case \"ZodArray\": {\n const innerType = def.type as unknown;\n const result: JSONSchemaProperty = {\n type: \"array\",\n items: zodToJsonSchema(innerType),\n };\n if (description) result.description = description;\n return result;\n }\n\n case \"ZodObject\": {\n const shape = def.shape as\n | (() => Record<string, unknown>)\n | Record<string, unknown>;\n const shapeObj = typeof shape === \"function\" ? shape() : shape;\n const properties: Record<string, JSONSchemaProperty> = {};\n const required: string[] = [];\n\n for (const [key, value] of Object.entries(shapeObj)) {\n properties[key] = zodToJsonSchema(value);\n\n // Check if the field is required (not optional/nullable)\n const fieldTypeName = getZodTypeName(value);\n if (\n fieldTypeName !== \"ZodOptional\" &&\n fieldTypeName !== \"ZodNullable\"\n ) {\n required.push(key);\n }\n }\n\n const result: JSONSchemaProperty = {\n type: \"object\",\n properties,\n };\n if (required.length > 0) result.required = required;\n if (description) result.description = description;\n return result;\n }\n\n case \"ZodOptional\":\n case \"ZodNullable\": {\n const innerType = def.innerType as unknown;\n return zodToJsonSchema(innerType);\n }\n\n case \"ZodDefault\": {\n const innerType = def.innerType as unknown;\n const defaultValue = def.defaultValue as () => unknown;\n const result = zodToJsonSchema(innerType);\n result.default =\n typeof defaultValue === \"function\" ? defaultValue() : defaultValue;\n return result;\n }\n\n case \"ZodLiteral\": {\n const value = def.value as string | number | boolean;\n return {\n type:\n typeof value === \"number\"\n ? \"number\"\n : typeof value === \"boolean\"\n ? \"boolean\"\n : \"string\",\n enum: [value],\n description,\n };\n }\n\n case \"ZodUnion\": {\n // For unions, we take the first option for simplicity\n // A more complete implementation would use oneOf/anyOf\n const options = def.options as unknown[];\n if (options && options.length > 0) {\n return zodToJsonSchema(options[0]);\n }\n return { type: \"string\" };\n }\n\n default:\n // Fallback for unknown types\n const result: JSONSchemaProperty = { type: \"string\" };\n if (description) result.description = description;\n return result;\n }\n}\n\n/**\n * Convert a Zod object schema to ToolInputSchema\n *\n * Note: For Zod 4.x+, the react package uses z.toJSONSchema() directly.\n * This fallback implementation is for older Zod versions.\n */\nexport function zodObjectToInputSchema(schema: unknown): ToolInputSchema {\n const jsonSchema = zodToJsonSchema(schema);\n\n if (jsonSchema.type !== \"object\" || !jsonSchema.properties) {\n const typeName = getZodTypeName(schema);\n throw new Error(\n `Expected a Zod object schema, got ${typeName}. ` +\n `Converted to: ${JSON.stringify(jsonSchema)}`,\n );\n }\n\n return {\n type: \"object\",\n properties: jsonSchema.properties,\n required: jsonSchema.required,\n };\n}\n\n// ============================================\n// Tool Definition Helper\n// ============================================\n\n/**\n * Configuration for defining a tool with Zod schema\n */\nexport interface DefineToolConfig<\n TSchema extends { _output: Record<string, unknown> },\n> {\n /** Unique tool name */\n name: string;\n /** Tool description for LLM */\n description: string;\n /** Where the tool executes */\n location: ToolLocation;\n /** Zod schema for parameters */\n schema: TSchema;\n /** Handler function */\n handler?: (\n params: TSchema[\"_output\"],\n context?: ToolContext,\n ) => Promise<ToolResponse> | ToolResponse;\n /** Optional render function for custom UI */\n render?: (props: {\n status:\n | \"pending\"\n | \"approval-required\"\n | \"executing\"\n | \"completed\"\n | \"error\";\n args: TSchema[\"_output\"];\n result?: ToolResponse;\n error?: string;\n toolCallId: string;\n toolName: string;\n approval?: {\n onApprove: (extraData?: Record<string, unknown>) => void;\n onReject: (reason?: string) => void;\n message?: string;\n };\n }) => unknown;\n /** Whether the tool is available */\n available?: boolean;\n\n // ============================================\n // Display Configuration\n // ============================================\n\n /**\n * Human-readable title for UI display.\n * Can be a static string or a function that generates title from args.\n */\n title?: string | ((args: TSchema[\"_output\"]) => string);\n\n /**\n * Title shown while executing (present tense with \"...\").\n */\n executingTitle?: string | ((args: TSchema[\"_output\"]) => string);\n\n /**\n * Title shown after completion.\n */\n completedTitle?: string | ((args: TSchema[\"_output\"]) => string);\n\n // ============================================\n // AI Response Control\n // ============================================\n\n /**\n * How the AI should respond when this tool's result is rendered as UI.\n * - 'none': AI generates minimal response\n * - 'brief': AI receives summary context, gives brief acknowledgment\n * - 'full': AI receives complete data (default)\n */\n aiResponseMode?: \"none\" | \"brief\" | \"full\";\n\n /**\n * Context/summary sent to AI instead of (or along with) full result.\n */\n aiContext?:\n | string\n | ((result: ToolResponse, args: Record<string, unknown>) => string);\n\n // ============================================\n // Approval Configuration\n // ============================================\n\n /**\n * Require user approval before execution.\n * - true: Always require approval\n * - false: No approval needed (default)\n * - function: Conditional approval based on input\n */\n needsApproval?:\n | boolean\n | ((params: TSchema[\"_output\"]) => boolean | Promise<boolean>);\n\n /**\n * Custom message shown in the approval UI.\n */\n approvalMessage?: string | ((params: TSchema[\"_output\"]) => string);\n}\n\n/**\n * Define a tool using a Zod schema\n *\n * @example\n * ```ts\n * import { z } from \"zod\";\n * import { defineTool } from \"@yourgpt/copilot-sdk-core\";\n *\n * const navigateTool = defineTool({\n * name: \"navigate\",\n * description: \"Navigate to a page\",\n * location: \"client\",\n * schema: z.object({\n * path: z.string().describe(\"The path to navigate to\"),\n * }),\n * handler: async ({ path }) => {\n * router.push(path);\n * return { success: true, message: `Navigated to ${path}` };\n * },\n * });\n * ```\n */\nexport function defineTool<\n TSchema extends { _output: Record<string, unknown> },\n>(config: DefineToolConfig<TSchema>): ToolDefinition<TSchema[\"_output\"]> {\n return {\n name: config.name,\n description: config.description,\n location: config.location,\n inputSchema: zodObjectToInputSchema(config.schema),\n handler: config.handler,\n render: config.render,\n available: config.available,\n // Display config\n title: config.title,\n executingTitle: config.executingTitle,\n completedTitle: config.completedTitle,\n // AI response control\n aiResponseMode: config.aiResponseMode,\n aiContext: config.aiContext,\n // Approval\n needsApproval: config.needsApproval,\n approvalMessage: config.approvalMessage,\n };\n}\n\n/**\n * Define a client-side tool using a Zod schema\n *\n * Shorthand for defineTool with location: \"client\".\n * Client tools run in the browser and can interact with UI.\n *\n * @example\n * ```ts\n * const navigateTool = defineClientTool({\n * name: \"navigate\",\n * description: \"Navigate to a page\",\n * schema: z.object({ path: z.string() }),\n * handler: async ({ path }) => {\n * router.push(path);\n * return { success: true };\n * },\n * });\n * ```\n */\nexport function defineClientTool<\n TSchema extends { _output: Record<string, unknown> },\n>(\n config: Omit<DefineToolConfig<TSchema>, \"location\">,\n): ToolDefinition<TSchema[\"_output\"]> {\n return defineTool({ ...config, location: \"client\" });\n}\n\n/**\n * Define a server-side (backend) tool using a Zod schema\n *\n * Server tools run on your backend with full access to:\n * - Environment variables and secrets\n * - Database connections\n * - Internal microservices\n * - External APIs with server-side authentication\n *\n * The handler receives a context object with request headers for auth.\n *\n * @example\n * ```ts\n * const getOrderTool = defineServerTool({\n * name: \"get_order\",\n * description: \"Get order details by ID\",\n * schema: z.object({\n * orderId: z.string().describe(\"Order ID\"),\n * }),\n * handler: async ({ orderId }, context) => {\n * // Access auth from context\n * const token = context?.headers?.authorization;\n * if (!token) return failure(\"Authentication required\");\n *\n * const order = await orderService.get(orderId, token);\n * return success(order);\n * },\n * });\n * ```\n *\n * @example\n * ```ts\n * // With AI response control\n * const sensitiveDataTool = defineServerTool({\n * name: \"get_sensitive_data\",\n * description: \"Fetch sensitive records\",\n * schema: z.object({ id: z.string() }),\n * aiResponseMode: \"brief\",\n * aiContext: (result) => `Retrieved record - displayed to user`,\n * handler: async ({ id }) => {\n * const data = await db.sensitiveRecords.findUnique({ where: { id } });\n * return success(data);\n * },\n * });\n * ```\n */\nexport function defineServerTool<\n TSchema extends { _output: Record<string, unknown> },\n>(\n config: Omit<DefineToolConfig<TSchema>, \"location\">,\n): ToolDefinition<TSchema[\"_output\"]> {\n return defineTool({ ...config, location: \"server\" });\n}\n","/**\n * System Prompt Utilities\n *\n * Default system message generation for Copilot SDK.\n */\n\n/**\n * Function type for generating system messages\n */\nexport type SystemMessageFunction = (\n contextString: string,\n additionalInstructions?: string,\n) => string;\n\n/**\n * Default system message for Copilot SDK\n *\n * @param contextString - Context from useReadable hooks\n * @param additionalInstructions - Additional instructions from user\n */\nexport function defaultSystemMessage(\n contextString: string,\n additionalInstructions?: string,\n): string {\n return (\n `\nYou are a helpful, efficient, and professional AI assistant.\n\nHelp the user achieve their goals efficiently, without unnecessary fluff, while maintaining professionalism.\nBe polite, respectful, and prefer brevity over verbosity.\n\n${\n contextString\n ? `The user has provided you with the following context:\n\\`\\`\\`\n${contextString}\n\\`\\`\\`\n\n`\n : \"\"\n}You have access to functions you can call to take actions or get more information.\n\nAssist the user as best you can. Ask clarifying questions if needed, but if you can reasonably fill in the blanks yourself, do so.\n\nWhen calling a function, call it without extra commentary.\nIf a function returns an error:\n- If the error is from incorrect parameters, you may retry with corrected arguments.\n- If the error source is unclear, do not retry.\n` + (additionalInstructions ? `\\n${additionalInstructions}` : \"\")\n );\n}\n","/**\n * Cloud Storage Service\n *\n * Provides managed file storage for premium users.\n * Files are uploaded to managed cloud via presigned URLs.\n */\n\nimport type { MessageAttachment } from \"../types/message\";\n\n/**\n * Upload result from storage service\n */\nexport interface UploadResult {\n /** Public URL of the uploaded file */\n url: string;\n /** Expiration timestamp (if applicable) */\n expiresAt?: number;\n}\n\n/**\n * Upload options\n */\nexport interface UploadOptions {\n /** Progress callback */\n onProgress?: (progress: number) => void;\n}\n\n/**\n * Storage service interface\n */\nexport interface StorageService {\n /** Check if cloud storage is available */\n isAvailable(): boolean;\n /** Upload file and get URL */\n upload(file: File, options?: UploadOptions): Promise<UploadResult>;\n}\n\n/**\n * Storage configuration\n */\nexport interface StorageConfig {\n /** Cloud API key (must start with \"ygpt_\" for premium) */\n apiKey: string;\n /** Custom API endpoint */\n endpoint?: string;\n /** Maximum file size in bytes (default: 25MB for premium) */\n maxFileSize?: number;\n}\n\n/** Default max file size for cloud storage (25MB) */\nexport const CLOUD_MAX_FILE_SIZE = 25 * 1024 * 1024;\n\n/** Default Cloud API endpoint */\nexport const DEFAULT_YOURGPT_ENDPOINT = \"https://api.yourgpt.ai\";\n\n/**\n * Create managed cloud storage service\n *\n * @example\n * ```ts\n * const storage = createCloudStorage({\n * apiKey: \"ygpt_...\",\n * });\n *\n * if (storage.isAvailable()) {\n * const { url } = await storage.upload(file);\n * // url = \"https://cdn.yourgpt.ai/...\"\n * }\n * ```\n */\nexport function createCloudStorage(config: StorageConfig): StorageService {\n const endpoint = config.endpoint || DEFAULT_YOURGPT_ENDPOINT;\n const maxFileSize = config.maxFileSize || CLOUD_MAX_FILE_SIZE;\n\n return {\n /**\n * Check if cloud storage is available\n * Premium API keys start with \"ygpt_\"\n */\n isAvailable(): boolean {\n return Boolean(config.apiKey?.startsWith(\"ygpt_\"));\n },\n\n /**\n * Upload file to managed cloud storage\n */\n async upload(file: File, options?: UploadOptions): Promise<UploadResult> {\n // Validate file size\n if (file.size > maxFileSize) {\n const sizeMB = (maxFileSize / (1024 * 1024)).toFixed(0);\n throw new Error(`File size exceeds ${sizeMB}MB limit`);\n }\n\n // 1. Request presigned upload URL from Cloud API\n const presignResponse = await fetch(`${endpoint}/v1/storage/upload-url`, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${config.apiKey}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n filename: file.name,\n mimeType: file.type,\n size: file.size,\n }),\n });\n\n if (!presignResponse.ok) {\n const error = await presignResponse.text();\n throw new Error(`Failed to get upload URL: ${error}`);\n }\n\n const { uploadUrl, publicUrl, expiresIn } = await presignResponse.json();\n\n // 2. Upload file directly to cloud storage using presigned URL\n const uploadResponse = await fetch(uploadUrl, {\n method: \"PUT\",\n body: file,\n headers: {\n \"Content-Type\": file.type,\n },\n });\n\n if (!uploadResponse.ok) {\n throw new Error(`Failed to upload file: ${uploadResponse.statusText}`);\n }\n\n return {\n url: publicUrl,\n expiresAt: expiresIn ? Date.now() + expiresIn * 1000 : undefined,\n };\n },\n };\n}\n\n/**\n * Helper to get attachment type from MIME type\n */\nexport function getAttachmentTypeFromMime(\n mimeType: string,\n): \"image\" | \"file\" | \"audio\" | \"video\" {\n if (mimeType.startsWith(\"image/\")) return \"image\";\n if (mimeType.startsWith(\"audio/\")) return \"audio\";\n if (mimeType.startsWith(\"video/\")) return \"video\";\n return \"file\";\n}\n\n/**\n * Process file to MessageAttachment using storage service\n *\n * - If storage is available, uploads to cloud and returns URL-based attachment\n * - Otherwise, converts to base64 (fallback for free tier)\n */\nexport async function processFileToAttachment(\n file: File,\n storage?: StorageService | null,\n): Promise<MessageAttachment> {\n const type = getAttachmentTypeFromMime(file.type);\n\n // Premium: Upload to cloud storage\n if (storage?.isAvailable()) {\n const { url } = await storage.upload(file);\n return {\n type,\n url,\n mimeType: file.type,\n filename: file.name,\n };\n }\n\n // Free: Convert to base64\n const data = await fileToBase64(file);\n return {\n type,\n data,\n mimeType: file.type,\n filename: file.name,\n };\n}\n\n/**\n * Convert file to base64 data URL\n */\nfunction fileToBase64(file: File): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = () => {\n if (typeof reader.result === \"string\") {\n resolve(reader.result);\n } else {\n reject(new Error(\"Failed to read file as base64\"));\n }\n };\n reader.onerror = () => reject(new Error(\"Failed to read file\"));\n reader.readAsDataURL(file);\n });\n}\n"]}