@pancake-apps/web 0.0.0-snapshot-20260125200133

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/mcp-apps/index.ts","../src/mcp-apps/types.ts","../src/mcp-apps/protocol.ts","../src/mcp-apps/bridge.ts","../src/mcp-apps/store.ts","../src/mcp-apps/hooks/use-mcp-store.ts","../src/mcp-apps/hooks/use-theme.ts","../src/mcp-apps/hooks/use-locale.ts","../src/mcp-apps/hooks/use-timezone.ts","../src/mcp-apps/hooks/use-display-mode.ts","../src/mcp-apps/hooks/use-available-display-modes.ts","../src/mcp-apps/hooks/use-container-dimensions.ts","../src/mcp-apps/hooks/use-safe-area.ts","../src/mcp-apps/hooks/use-platform.ts","../src/mcp-apps/hooks/use-device-capabilities.ts","../src/mcp-apps/hooks/use-styles.ts","../src/mcp-apps/hooks/use-tool-info.ts","../src/mcp-apps/hooks/use-tool-input.ts","../src/mcp-apps/hooks/use-tool-result.ts","../src/mcp-apps/hooks/use-host-context.ts","../src/mcp-apps/hooks/use-host-capabilities.ts","../src/mcp-apps/hooks/use-is-initialized.ts","../src/mcp-apps/actions/initialize.ts","../src/mcp-apps/actions/call-tool.ts","../src/mcp-apps/actions/read-resource.ts","../src/mcp-apps/actions/send-message.ts","../src/mcp-apps/actions/open-link.ts","../src/mcp-apps/actions/request-display-mode.ts","../src/mcp-apps/actions/update-model-context.ts","../src/mcp-apps/actions/notify-size-changed.ts","../src/mcp-apps/actions/log.ts","../src/mcp-apps/actions/on-teardown.ts","../src/mcp-apps/create-view.ts"],"names":["useMcpStore"],"mappings":"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","file":"chunk-YGGRUIUG.js","sourcesContent":["/**\n * @pancake-apps/web/mcp-apps\n *\n * Complete SDK for building Guest UIs that communicate with MCP hosts.\n * Implements JSON-RPC 2.0 over postMessage as per MCP Apps specification.\n */\n\n// Types\nexport type {\n // JSON-RPC\n JsonRpcId,\n JsonRpcRequest,\n JsonRpcNotification,\n JsonRpcSuccessResponse,\n JsonRpcErrorResponse,\n JsonRpcResponse,\n JsonRpcMessage,\n\n // Core\n Theme,\n DisplayMode,\n Platform,\n LogLevel,\n SafeAreaInsets,\n DeviceCapabilities,\n ContainerDimensions,\n\n // Styles\n StyleVariables,\n StyleCss,\n Styles,\n\n // Tools\n ToolInfo,\n ContentBlock,\n CallToolResult,\n ToolsCallParams,\n\n // Host Context\n HostContext,\n\n // Capabilities\n McpUiResourceCsp,\n PermissionFields,\n SandboxCapabilities,\n HostCapabilities,\n\n // Initialize\n ClientInfo,\n HostInfo,\n InitializeParams,\n McpUiInitializeResult,\n InitializeOptions,\n\n // Messages\n OpenLinkParams,\n UiMessageParams,\n RequestDisplayModeParams,\n RequestDisplayModeResult,\n UpdateModelContextParams,\n SizeChangedParams,\n LogMessageParams,\n ResourceTeardownParams,\n\n // Resources\n ResourceReadParams,\n ResourceContent,\n ResourceReadResult,\n\n // Notifications\n ToolInputParams,\n ToolInputPartialParams,\n ToolCancelledParams,\n\n // Store\n McpStoreState,\n} from './types';\n\nexport { PROTOCOL_VERSION, DEFAULT_CLIENT_INFO, MCP_METHODS } from './types';\n\n// Protocol\nexport {\n generateId,\n createRequest,\n createNotification,\n createSuccessResponse,\n createErrorResponse,\n isJsonRpcMessage,\n isRequest,\n isNotification,\n isResponse,\n isErrorResponse,\n ERROR_CODES,\n JsonRpcError,\n} from './protocol';\n\n// Bridge\nexport { McpAppsBridge, getBridge } from './bridge';\n\n// Store\nexport { McpAppsStore, getStore } from './store';\n\n// Hooks\nexport {\n useMcpStore,\n createMcpStoreHook,\n useTheme,\n useLocale,\n useTimezone,\n useDisplayMode,\n useAvailableDisplayModes,\n useContainerDimensions,\n useSafeArea,\n usePlatform,\n useDeviceCapabilities,\n useStyles,\n useToolInfo,\n useToolInput,\n useToolResult,\n useHostContext,\n useHostCapabilities,\n useIsInitialized,\n} from './hooks';\n\n// Actions\nexport {\n initialize,\n callTool,\n readResource,\n sendMessage,\n openLink,\n requestDisplayMode,\n updateModelContext,\n notifySizeChanged,\n setupAutoSizeReporting,\n log,\n logDebug,\n logInfo,\n logWarning,\n logError,\n onTeardown,\n} from './actions';\n\n// High-level API\nexport { createMcpView, type McpView, type CreateMcpViewOptions, type AutoResizeOptions } from './create-view';\n","/**\n * MCP Apps SDK Type Definitions\n *\n * These types match the MCP Apps specification for Guest UI implementation.\n */\n\n// ============================================\n// JSON-RPC Types\n// ============================================\n\nexport type JsonRpcId = string | number;\n\nexport interface JsonRpcRequest {\n jsonrpc: '2.0';\n id: JsonRpcId;\n method: string;\n params?: unknown;\n}\n\nexport interface JsonRpcNotification {\n jsonrpc: '2.0';\n method: string;\n params?: unknown;\n}\n\nexport interface JsonRpcSuccessResponse {\n jsonrpc: '2.0';\n id: JsonRpcId;\n result: unknown;\n}\n\nexport interface JsonRpcErrorResponse {\n jsonrpc: '2.0';\n id: JsonRpcId;\n error: {\n code: number;\n message: string;\n data?: unknown;\n };\n}\n\nexport type JsonRpcResponse = JsonRpcSuccessResponse | JsonRpcErrorResponse;\nexport type JsonRpcMessage = JsonRpcRequest | JsonRpcNotification | JsonRpcResponse;\n\n// ============================================\n// Core Types\n// ============================================\n\nexport type Theme = 'light' | 'dark';\n\nexport type DisplayMode = 'inline' | 'fullscreen' | 'pip';\n\nexport type Platform = 'web' | 'desktop' | 'mobile';\n\nexport type LogLevel = 'debug' | 'info' | 'warning' | 'error';\n\nexport interface SafeAreaInsets {\n top: number;\n right: number;\n bottom: number;\n left: number;\n}\n\nexport interface DeviceCapabilities {\n touch?: boolean;\n hover?: boolean;\n}\n\nexport type ContainerDimensions = (\n | { height: number; maxHeight?: never }\n | { height?: never; maxHeight?: number }\n) & (\n | { width: number; maxWidth?: never }\n | { width?: never; maxWidth?: number }\n);\n\n// ============================================\n// Styles Types\n// ============================================\n\n/** CSS variable keys available to MCP apps for theming. */\nexport type McpUiStyleVariableKey =\n // Background colors\n | '--color-background-primary'\n | '--color-background-secondary'\n | '--color-background-tertiary'\n | '--color-background-inverse'\n | '--color-background-ghost'\n | '--color-background-info'\n | '--color-background-danger'\n | '--color-background-success'\n | '--color-background-warning'\n | '--color-background-disabled'\n // Text colors\n | '--color-text-primary'\n | '--color-text-secondary'\n | '--color-text-tertiary'\n | '--color-text-inverse'\n | '--color-text-info'\n | '--color-text-danger'\n | '--color-text-success'\n | '--color-text-warning'\n | '--color-text-disabled'\n | '--color-text-ghost'\n // Border colors\n | '--color-border-primary'\n | '--color-border-secondary'\n | '--color-border-tertiary'\n | '--color-border-inverse'\n | '--color-border-ghost'\n | '--color-border-info'\n | '--color-border-danger'\n | '--color-border-success'\n | '--color-border-warning'\n | '--color-border-disabled'\n // Ring colors\n | '--color-ring-primary'\n | '--color-ring-secondary'\n | '--color-ring-inverse'\n | '--color-ring-info'\n | '--color-ring-danger'\n | '--color-ring-success'\n | '--color-ring-warning'\n // Typography - Family\n | '--font-sans'\n | '--font-mono'\n // Typography - Weight\n | '--font-weight-normal'\n | '--font-weight-medium'\n | '--font-weight-semibold'\n | '--font-weight-bold'\n // Typography - Text Size\n | '--font-text-xs-size'\n | '--font-text-sm-size'\n | '--font-text-md-size'\n | '--font-text-lg-size'\n // Typography - Heading Size\n | '--font-heading-xs-size'\n | '--font-heading-sm-size'\n | '--font-heading-md-size'\n | '--font-heading-lg-size'\n | '--font-heading-xl-size'\n | '--font-heading-2xl-size'\n | '--font-heading-3xl-size'\n // Typography - Text Line Height\n | '--font-text-xs-line-height'\n | '--font-text-sm-line-height'\n | '--font-text-md-line-height'\n | '--font-text-lg-line-height'\n // Typography - Heading Line Height\n | '--font-heading-xs-line-height'\n | '--font-heading-sm-line-height'\n | '--font-heading-md-line-height'\n | '--font-heading-lg-line-height'\n | '--font-heading-xl-line-height'\n | '--font-heading-2xl-line-height'\n | '--font-heading-3xl-line-height'\n // Border radius\n | '--border-radius-xs'\n | '--border-radius-sm'\n | '--border-radius-md'\n | '--border-radius-lg'\n | '--border-radius-xl'\n | '--border-radius-full'\n // Border width\n | '--border-width-regular'\n // Shadows\n | '--shadow-hairline'\n | '--shadow-sm'\n | '--shadow-md'\n | '--shadow-lg';\n\nexport type StyleVariables = Partial<Record<McpUiStyleVariableKey, string>>;\n\nexport interface StyleCss {\n fonts?: string;\n}\n\nexport interface Styles {\n variables?: StyleVariables;\n css?: StyleCss;\n}\n\n// ============================================\n// Tool Types\n// ============================================\n\nexport interface ToolInfo {\n id?: JsonRpcId;\n tool: {\n name: string;\n description?: string;\n inputSchema?: object;\n };\n}\n\nexport interface ContentBlock {\n type: string;\n text?: string;\n [key: string]: unknown;\n}\n\nexport interface CallToolResult<TOutput = unknown> {\n content: ContentBlock[];\n structuredContent?: TOutput;\n isError?: boolean;\n _meta?: Record<string, unknown>;\n}\n\nexport interface ToolsCallParams {\n name: string;\n arguments?: Record<string, unknown>;\n}\n\n// ============================================\n// Host Context Types\n// ============================================\n\nexport interface HostContext {\n toolInfo?: ToolInfo;\n theme?: Theme;\n styles?: Styles;\n displayMode?: DisplayMode;\n availableDisplayModes?: DisplayMode[];\n containerDimensions?: ContainerDimensions;\n locale?: string;\n timeZone?: string;\n userAgent?: string;\n platform?: Platform;\n deviceCapabilities?: DeviceCapabilities;\n safeAreaInsets?: SafeAreaInsets;\n}\n\n// ============================================\n// Capability Types\n// ============================================\n\nexport interface McpUiResourceCsp {\n connectDomains?: string[];\n resourceDomains?: string[];\n frameDomains?: string[];\n baseUriDomains?: string[];\n}\n\nexport interface PermissionFields {\n camera?: Record<string, never>;\n microphone?: Record<string, never>;\n geolocation?: Record<string, never>;\n clipboardWrite?: Record<string, never>;\n}\n\nexport interface SandboxCapabilities {\n permissions?: PermissionFields;\n csp?: McpUiResourceCsp;\n}\n\nexport interface HostCapabilities {\n experimental?: object;\n openLinks?: object;\n serverTools?: {\n listChanged?: boolean;\n };\n serverResources?: {\n listChanged?: boolean;\n };\n logging?: object;\n sandbox?: SandboxCapabilities;\n}\n\n// ============================================\n// Initialize Types\n// ============================================\n\nexport interface ClientInfo {\n name: string;\n version: string;\n}\n\nexport interface HostInfo {\n name: string;\n version: string;\n}\n\nexport interface InitializeParams {\n protocolVersion: string;\n capabilities: object;\n clientInfo: ClientInfo;\n}\n\nexport interface McpUiInitializeResult {\n protocolVersion: string;\n hostCapabilities: HostCapabilities;\n hostInfo: HostInfo;\n hostContext: HostContext;\n}\n\nexport interface InitializeOptions {\n clientInfo?: ClientInfo;\n capabilities?: object;\n}\n\n// ============================================\n// Message Types\n// ============================================\n\nexport interface OpenLinkParams {\n url: string;\n}\n\nexport interface UiMessageParams {\n role: 'user';\n content: {\n type: 'text';\n text: string;\n };\n}\n\nexport interface RequestDisplayModeParams {\n mode: DisplayMode;\n}\n\nexport interface RequestDisplayModeResult {\n mode: DisplayMode;\n}\n\nexport interface UpdateModelContextParams {\n content?: ContentBlock[];\n structuredContent?: Record<string, unknown>;\n}\n\nexport interface SizeChangedParams {\n width: number;\n height: number;\n}\n\nexport interface LogMessageParams {\n level: LogLevel;\n data: unknown;\n logger?: string;\n}\n\nexport interface ResourceTeardownParams {\n reason: string;\n}\n\n// ============================================\n// Resource Types\n// ============================================\n\nexport interface ResourceReadParams {\n uri: string;\n}\n\nexport interface ResourceContent {\n uri: string;\n mimeType: string;\n text?: string;\n blob?: string;\n _meta?: {\n ui?: {\n csp?: McpUiResourceCsp;\n permissions?: PermissionFields;\n domain?: string;\n prefersBorder?: boolean;\n };\n };\n}\n\nexport interface ResourceReadResult {\n contents: ResourceContent[];\n}\n\n// ============================================\n// Notification Types (from Host)\n// ============================================\n\nexport interface ToolInputParams {\n arguments: Record<string, unknown>;\n}\n\nexport interface ToolInputPartialParams {\n arguments: Record<string, unknown>;\n}\n\nexport interface ToolCancelledParams {\n reason: string;\n}\n\n// ============================================\n// Store State Type\n// ============================================\n\nexport interface McpStoreState {\n isInitialized: boolean;\n hostContext: HostContext;\n hostCapabilities: HostCapabilities | undefined;\n hostInfo: HostInfo | undefined;\n toolInput: Record<string, unknown> | undefined;\n toolResult: CallToolResult | undefined;\n toolInputPartial: Record<string, unknown> | undefined;\n isCancelled: boolean;\n cancelReason: string | undefined;\n}\n\n// ============================================\n// Constants\n// ============================================\n\nexport const PROTOCOL_VERSION = '2025-11-21';\n\nexport const DEFAULT_CLIENT_INFO: ClientInfo = {\n name: 'pancake-mcp-apps',\n version: '1.0.0',\n};\n\n// ============================================\n// Method Constants\n// ============================================\n\nexport const MCP_METHODS = {\n // Guest -> Host Requests\n INITIALIZE: 'ui/initialize',\n OPEN_LINK: 'ui/open-link',\n MESSAGE: 'ui/message',\n REQUEST_DISPLAY_MODE: 'ui/request-display-mode',\n UPDATE_MODEL_CONTEXT: 'ui/update-model-context',\n TOOLS_CALL: 'tools/call',\n RESOURCES_READ: 'resources/read',\n PING: 'ping',\n\n // Guest -> Host Notifications\n INITIALIZED: 'ui/notifications/initialized',\n SIZE_CHANGED: 'ui/notifications/size-changed',\n LOG_MESSAGE: 'notifications/message',\n\n // Host -> Guest Notifications\n TOOL_INPUT: 'ui/notifications/tool-input',\n TOOL_INPUT_PARTIAL: 'ui/notifications/tool-input-partial',\n TOOL_RESULT: 'ui/notifications/tool-result',\n TOOL_CANCELLED: 'ui/notifications/tool-cancelled',\n HOST_CONTEXT_CHANGED: 'ui/notifications/host-context-changed',\n RESOURCE_TEARDOWN: 'ui/resource-teardown',\n} as const;\n","/**\n * JSON-RPC 2.0 Protocol Helpers\n *\n * Utilities for creating and parsing JSON-RPC messages.\n */\n\nimport type {\n JsonRpcId,\n JsonRpcRequest,\n JsonRpcNotification,\n JsonRpcSuccessResponse,\n JsonRpcErrorResponse,\n JsonRpcMessage,\n} from './types';\n\n/**\n * Generate a unique request ID\n */\nexport function generateId(): string {\n return crypto.randomUUID();\n}\n\n/**\n * Create a JSON-RPC request\n */\nexport function createRequest(\n method: string,\n params?: unknown,\n id: JsonRpcId = generateId()\n): JsonRpcRequest {\n const request: JsonRpcRequest = {\n jsonrpc: '2.0',\n id,\n method,\n };\n\n if (params !== undefined) {\n request.params = params;\n }\n\n return request;\n}\n\n/**\n * Create a JSON-RPC notification (no id, no response expected)\n */\nexport function createNotification(method: string, params?: unknown): JsonRpcNotification {\n const notification: JsonRpcNotification = {\n jsonrpc: '2.0',\n method,\n };\n\n if (params !== undefined) {\n notification.params = params;\n }\n\n return notification;\n}\n\n/**\n * Create a JSON-RPC success response\n */\nexport function createSuccessResponse(id: JsonRpcId, result: unknown): JsonRpcSuccessResponse {\n return {\n jsonrpc: '2.0',\n id,\n result,\n };\n}\n\n/**\n * Create a JSON-RPC error response\n */\nexport function createErrorResponse(\n id: JsonRpcId,\n code: number,\n message: string,\n data?: unknown\n): JsonRpcErrorResponse {\n return {\n jsonrpc: '2.0',\n id,\n error: {\n code,\n message,\n ...(data !== undefined && { data }),\n },\n };\n}\n\n/**\n * Check if a message is a valid JSON-RPC message\n */\nexport function isJsonRpcMessage(data: unknown): data is JsonRpcMessage {\n if (typeof data !== 'object' || data === null) return false;\n return (data as JsonRpcMessage).jsonrpc === '2.0';\n}\n\n/**\n * Check if a message is a JSON-RPC request\n */\nexport function isRequest(message: JsonRpcMessage): message is JsonRpcRequest {\n return 'id' in message && 'method' in message && !('result' in message) && !('error' in message);\n}\n\n/**\n * Check if a message is a JSON-RPC notification\n */\nexport function isNotification(message: JsonRpcMessage): message is JsonRpcNotification {\n return 'method' in message && !('id' in message);\n}\n\n/**\n * Check if a message is a JSON-RPC response\n */\nexport function isResponse(\n message: JsonRpcMessage\n): message is JsonRpcSuccessResponse | JsonRpcErrorResponse {\n return 'id' in message && ('result' in message || 'error' in message);\n}\n\n/**\n * Check if a response is an error\n */\nexport function isErrorResponse(\n response: JsonRpcSuccessResponse | JsonRpcErrorResponse\n): response is JsonRpcErrorResponse {\n return 'error' in response;\n}\n\n/**\n * Standard JSON-RPC error codes\n */\nexport const ERROR_CODES = {\n PARSE_ERROR: -32700,\n INVALID_REQUEST: -32600,\n METHOD_NOT_FOUND: -32601,\n INVALID_PARAMS: -32602,\n INTERNAL_ERROR: -32603,\n} as const;\n\n/**\n * Create an error from a JSON-RPC error response\n */\nexport class JsonRpcError extends Error {\n code: number;\n data?: unknown;\n\n constructor(code: number, message: string, data?: unknown) {\n super(message);\n this.name = 'JsonRpcError';\n this.code = code;\n this.data = data;\n }\n\n static fromResponse(response: JsonRpcErrorResponse): JsonRpcError {\n return new JsonRpcError(response.error.code, response.error.message, response.error.data);\n }\n}\n","/**\n * McpAppsBridge\n *\n * Singleton bridge that handles JSON-RPC communication with the MCP host\n * via postMessage. Manages initialization, request/response tracking,\n * and notification handling.\n */\n\nimport {\n createRequest,\n createNotification,\n isJsonRpcMessage,\n isResponse,\n isErrorResponse,\n isRequest,\n isNotification,\n JsonRpcError,\n} from './protocol';\nimport {\n PROTOCOL_VERSION,\n DEFAULT_CLIENT_INFO,\n MCP_METHODS,\n type JsonRpcId,\n type JsonRpcRequest,\n type McpUiInitializeResult,\n type InitializeOptions,\n type CallToolResult,\n type ResourceReadResult,\n type DisplayMode,\n type UpdateModelContextParams,\n type LogLevel,\n type ResourceTeardownParams,\n} from './types';\n\nconst DEFAULT_TIMEOUT = 30_000; // 30 seconds\n\ntype PendingRequest = {\n resolve: (value: unknown) => void;\n reject: (error: Error) => void;\n timeout: ReturnType<typeof setTimeout>;\n};\n\ntype NotificationHandler = (params: unknown) => void;\ntype TeardownHandler = (params: ResourceTeardownParams) => Promise<void> | void;\n\nexport class McpAppsBridge {\n private static instance: McpAppsBridge | null = null;\n\n private pendingRequests = new Map<string, PendingRequest>();\n private notificationHandlers = new Map<string, Set<NotificationHandler>>();\n private teardownHandlers = new Set<TeardownHandler>();\n private _isInitialized = false;\n private initializeResult: McpUiInitializeResult | null = null;\n private resizeObserver: ResizeObserver | null = null;\n\n /**\n * Get the singleton bridge instance\n */\n static getInstance(): McpAppsBridge {\n if (!McpAppsBridge.instance) {\n McpAppsBridge.instance = new McpAppsBridge();\n }\n return McpAppsBridge.instance;\n }\n\n /**\n * Reset the singleton (for testing)\n */\n static reset(): void {\n if (McpAppsBridge.instance) {\n McpAppsBridge.instance.cleanup();\n }\n McpAppsBridge.instance = null;\n }\n\n private constructor() {\n this.setupMessageListener();\n }\n\n /**\n * Check if the bridge has been initialized\n */\n get isInitialized(): boolean {\n return this._isInitialized;\n }\n\n /**\n * Get the initialization result (host context, capabilities, etc.)\n */\n get initResult(): McpUiInitializeResult | null {\n return this.initializeResult;\n }\n\n // ============================================\n // Message Handling\n // ============================================\n\n private setupMessageListener(): void {\n if (typeof window !== 'undefined') {\n window.addEventListener('message', this.handleMessage);\n }\n }\n\n private cleanup(): void {\n if (typeof window !== 'undefined') {\n window.removeEventListener('message', this.handleMessage);\n }\n\n // Clear all pending requests with rejection\n for (const [, pending] of this.pendingRequests) {\n clearTimeout(pending.timeout);\n pending.reject(new Error('Bridge was reset'));\n }\n this.pendingRequests.clear();\n\n // Clear handlers\n this.notificationHandlers.clear();\n this.teardownHandlers.clear();\n\n // Cleanup resize observer\n if (this.resizeObserver) {\n this.resizeObserver.disconnect();\n this.resizeObserver = null;\n }\n }\n\n private handleMessage = (event: MessageEvent): void => {\n const data = event.data;\n\n // Validate JSON-RPC message\n if (!isJsonRpcMessage(data)) {\n return;\n }\n\n // Handle responses to our requests\n if (isResponse(data)) {\n const id = String(data.id);\n const pending = this.pendingRequests.get(id);\n\n if (pending) {\n clearTimeout(pending.timeout);\n this.pendingRequests.delete(id);\n\n if (isErrorResponse(data)) {\n pending.reject(JsonRpcError.fromResponse(data));\n } else {\n pending.resolve(data.result);\n }\n }\n return;\n }\n\n // Handle requests from host (like ui/resource-teardown)\n if (isRequest(data)) {\n this.handleHostRequest(data);\n return;\n }\n\n // Handle notifications from host\n if (isNotification(data)) {\n this.handleNotification(data.method, data.params);\n }\n };\n\n private handleHostRequest(request: JsonRpcRequest): void {\n if (request.method === MCP_METHODS.RESOURCE_TEARDOWN) {\n this.handleTeardown(request);\n }\n }\n\n private async handleTeardown(request: JsonRpcRequest): Promise<void> {\n const params = request.params as ResourceTeardownParams;\n\n try {\n // Run all teardown handlers\n await Promise.all(Array.from(this.teardownHandlers).map((handler) => handler(params)));\n\n // Send success response\n this.sendResponse(request.id, {});\n } catch (error) {\n // Send error response\n this.sendErrorResponse(\n request.id,\n -32603,\n error instanceof Error ? error.message : 'Teardown failed'\n );\n }\n }\n\n private handleNotification(method: string, params: unknown): void {\n const handlers = this.notificationHandlers.get(method);\n if (handlers) {\n handlers.forEach((handler) => handler(params));\n }\n }\n\n // ============================================\n // Sending Messages\n // ============================================\n\n private send(message: unknown): void {\n if (typeof window !== 'undefined') {\n window.parent.postMessage(message, '*');\n }\n }\n\n private sendResponse(id: JsonRpcId, result: unknown): void {\n this.send({\n jsonrpc: '2.0',\n id,\n result,\n });\n }\n\n private sendErrorResponse(id: JsonRpcId, code: number, message: string): void {\n this.send({\n jsonrpc: '2.0',\n id,\n error: { code, message },\n });\n }\n\n /**\n * Send a request and wait for response\n */\n async sendRequest<T>(method: string, params?: unknown, timeout = DEFAULT_TIMEOUT): Promise<T> {\n const request = createRequest(method, params);\n const id = String(request.id);\n\n return new Promise<T>((resolve, reject) => {\n const timeoutId = setTimeout(() => {\n this.pendingRequests.delete(id);\n reject(new Error(`Request ${method} timed out after ${timeout}ms`));\n }, timeout);\n\n this.pendingRequests.set(id, {\n resolve: resolve as (value: unknown) => void,\n reject,\n timeout: timeoutId,\n });\n\n this.send(request);\n });\n }\n\n /**\n * Send a notification (no response expected)\n */\n sendNotification(method: string, params?: unknown): void {\n this.send(createNotification(method, params));\n }\n\n // ============================================\n // Subscription\n // ============================================\n\n /**\n * Subscribe to notifications from the host\n */\n onNotification(method: string, handler: NotificationHandler): () => void {\n if (!this.notificationHandlers.has(method)) {\n this.notificationHandlers.set(method, new Set());\n }\n this.notificationHandlers.get(method)!.add(handler);\n\n return () => {\n this.notificationHandlers.get(method)?.delete(handler);\n };\n }\n\n /**\n * Register a teardown handler\n */\n onTeardown(handler: TeardownHandler): () => void {\n this.teardownHandlers.add(handler);\n return () => {\n this.teardownHandlers.delete(handler);\n };\n }\n\n // ============================================\n // Initialization\n // ============================================\n\n /**\n * Initialize the connection with the host\n */\n async initialize(options: InitializeOptions = {}): Promise<McpUiInitializeResult> {\n if (this._isInitialized && this.initializeResult) {\n return this.initializeResult;\n }\n\n const result = await this.sendRequest<McpUiInitializeResult>(MCP_METHODS.INITIALIZE, {\n protocolVersion: PROTOCOL_VERSION,\n capabilities: options.capabilities ?? {},\n clientInfo: options.clientInfo ?? DEFAULT_CLIENT_INFO,\n });\n\n this.initializeResult = result;\n this._isInitialized = true;\n\n // Send initialized notification\n this.sendNotification(MCP_METHODS.INITIALIZED);\n\n return result;\n }\n\n /**\n * Ensure the bridge is initialized before performing operations\n */\n async ensureInitialized(): Promise<void> {\n if (!this._isInitialized) {\n await this.initialize();\n }\n }\n\n // ============================================\n // Tool Operations\n // ============================================\n\n /**\n * Call a server tool\n */\n async callTool<TInput = Record<string, unknown>, TOutput = unknown>(\n name: string,\n args?: TInput\n ): Promise<CallToolResult<TOutput>> {\n await this.ensureInitialized();\n\n return this.sendRequest<CallToolResult<TOutput>>(MCP_METHODS.TOOLS_CALL, {\n name,\n arguments: args,\n });\n }\n\n // ============================================\n // Resource Operations\n // ============================================\n\n /**\n * Read a resource by URI\n */\n async readResource(uri: string): Promise<ResourceReadResult> {\n await this.ensureInitialized();\n\n return this.sendRequest<ResourceReadResult>(MCP_METHODS.RESOURCES_READ, {\n uri,\n });\n }\n\n // ============================================\n // Message Operations\n // ============================================\n\n /**\n * Send a message to the host's chat interface\n */\n async sendMessage(text: string): Promise<void> {\n await this.ensureInitialized();\n\n await this.sendRequest(MCP_METHODS.MESSAGE, {\n role: 'user',\n content: {\n type: 'text',\n text,\n },\n });\n }\n\n // ============================================\n // Link Operations\n // ============================================\n\n /**\n * Request the host to open a URL\n */\n async openLink(url: string): Promise<void> {\n await this.ensureInitialized();\n\n await this.sendRequest(MCP_METHODS.OPEN_LINK, { url });\n }\n\n // ============================================\n // Display Operations\n // ============================================\n\n /**\n * Request a change in display mode\n */\n async requestDisplayMode(mode: DisplayMode): Promise<DisplayMode> {\n await this.ensureInitialized();\n\n const result = await this.sendRequest<{ mode: DisplayMode }>(MCP_METHODS.REQUEST_DISPLAY_MODE, {\n mode,\n });\n\n return result.mode;\n }\n\n // ============================================\n // Model Context Operations\n // ============================================\n\n /**\n * Update the host's model context\n */\n async updateModelContext(params: UpdateModelContextParams): Promise<void> {\n await this.ensureInitialized();\n\n await this.sendRequest(MCP_METHODS.UPDATE_MODEL_CONTEXT, params);\n }\n\n // ============================================\n // Size Reporting\n // ============================================\n\n /**\n * Notify the host of size changes\n */\n notifySizeChanged(width: number, height: number): void {\n this.sendNotification(MCP_METHODS.SIZE_CHANGED, { width, height });\n }\n\n /**\n * Setup automatic size reporting via ResizeObserver\n */\n setupAutoSizeReporting(element: HTMLElement = document.documentElement): () => void {\n if (this.resizeObserver) {\n this.resizeObserver.disconnect();\n }\n\n this.resizeObserver = new ResizeObserver((entries) => {\n const entry = entries[0];\n if (!entry) return;\n\n this.notifySizeChanged(entry.contentRect.width, entry.contentRect.height);\n });\n\n this.resizeObserver.observe(element);\n\n return () => {\n if (this.resizeObserver) {\n this.resizeObserver.disconnect();\n this.resizeObserver = null;\n }\n };\n }\n\n // ============================================\n // Logging\n // ============================================\n\n /**\n * Send a log message to the host\n */\n log(level: LogLevel, data: unknown, logger?: string): void {\n this.sendNotification(MCP_METHODS.LOG_MESSAGE, {\n level,\n data,\n ...(logger && { logger }),\n });\n }\n\n // ============================================\n // Health Check\n // ============================================\n\n /**\n * Ping the host to check connection\n */\n async ping(): Promise<void> {\n await this.sendRequest(MCP_METHODS.PING);\n }\n}\n\n/**\n * Get the bridge instance (convenience function)\n */\nexport function getBridge(): McpAppsBridge {\n return McpAppsBridge.getInstance();\n}\n","/**\n * McpAppsStore\n *\n * External store implementation for React 18's useSyncExternalStore.\n * Listens to MCP notifications for reactive updates.\n */\n\nimport { getBridge } from './bridge';\nimport {\n MCP_METHODS,\n type McpStoreState,\n type HostContext,\n type HostCapabilities,\n type HostInfo,\n type CallToolResult,\n type ToolInputParams,\n type ToolInputPartialParams,\n type ToolCancelledParams,\n} from './types';\n\ntype Subscriber = () => void;\ntype Unsubscribe = () => void;\n\nclass McpAppsStore {\n private static instance: McpAppsStore | null = null;\n\n private state: McpStoreState = {\n isInitialized: false,\n hostContext: {},\n hostCapabilities: undefined,\n hostInfo: undefined,\n toolInput: undefined,\n toolResult: undefined,\n toolInputPartial: undefined,\n isCancelled: false,\n cancelReason: undefined,\n };\n\n private subscribers = new Map<keyof McpStoreState | '*', Set<Subscriber>>();\n private unsubscribers: Unsubscribe[] = [];\n\n static getInstance(): McpAppsStore {\n if (!McpAppsStore.instance) {\n McpAppsStore.instance = new McpAppsStore();\n }\n return McpAppsStore.instance;\n }\n\n static reset(): void {\n if (McpAppsStore.instance) {\n McpAppsStore.instance.cleanup();\n }\n McpAppsStore.instance = null;\n }\n\n private constructor() {\n this.setupNotificationHandlers();\n }\n\n private cleanup(): void {\n this.unsubscribers.forEach((unsub) => unsub());\n this.unsubscribers = [];\n this.subscribers.clear();\n this.state = {\n isInitialized: false,\n hostContext: {},\n hostCapabilities: undefined,\n hostInfo: undefined,\n toolInput: undefined,\n toolResult: undefined,\n toolInputPartial: undefined,\n isCancelled: false,\n cancelReason: undefined,\n };\n }\n\n private setupNotificationHandlers(): void {\n const bridge = getBridge();\n\n // Tool input\n this.unsubscribers.push(\n bridge.onNotification(MCP_METHODS.TOOL_INPUT, (params) => {\n const { arguments: args } = params as ToolInputParams;\n this.updateState({ toolInput: args, toolInputPartial: undefined });\n })\n );\n\n // Tool input partial (streaming)\n this.unsubscribers.push(\n bridge.onNotification(MCP_METHODS.TOOL_INPUT_PARTIAL, (params) => {\n const { arguments: args } = params as ToolInputPartialParams;\n this.updateState({ toolInputPartial: args });\n })\n );\n\n // Tool result\n this.unsubscribers.push(\n bridge.onNotification(MCP_METHODS.TOOL_RESULT, (params) => {\n this.updateState({ toolResult: params as CallToolResult });\n })\n );\n\n // Tool cancelled\n this.unsubscribers.push(\n bridge.onNotification(MCP_METHODS.TOOL_CANCELLED, (params) => {\n const { reason } = params as ToolCancelledParams;\n this.updateState({ isCancelled: true, cancelReason: reason });\n })\n );\n\n // Host context changed\n this.unsubscribers.push(\n bridge.onNotification(MCP_METHODS.HOST_CONTEXT_CHANGED, (params) => {\n const changes = params as Partial<HostContext>;\n this.updateState({\n hostContext: { ...this.state.hostContext, ...changes },\n });\n })\n );\n }\n\n /**\n * Update store state and notify subscribers\n */\n private updateState(updates: Partial<McpStoreState>): void {\n const changedKeys = Object.keys(updates) as (keyof McpStoreState)[];\n\n this.state = { ...this.state, ...updates };\n\n // Notify specific key subscribers\n for (const key of changedKeys) {\n const keySubscribers = this.subscribers.get(key);\n if (keySubscribers) {\n keySubscribers.forEach((cb) => cb());\n }\n }\n\n // Notify wildcard subscribers\n const wildcardSubscribers = this.subscribers.get('*');\n if (wildcardSubscribers) {\n wildcardSubscribers.forEach((cb) => cb());\n }\n }\n\n /**\n * Set initialization result from bridge\n */\n setInitialized(\n hostContext: HostContext,\n hostCapabilities: HostCapabilities,\n hostInfo: HostInfo\n ): void {\n this.updateState({\n isInitialized: true,\n hostContext,\n hostCapabilities,\n hostInfo,\n });\n }\n\n /**\n * Subscribe to changes for specific keys or all changes\n */\n subscribe(\n keys: keyof McpStoreState | (keyof McpStoreState)[] | '*',\n callback: Subscriber\n ): Unsubscribe {\n const keyArray =\n keys === '*' ? (['*'] as const) : Array.isArray(keys) ? keys : [keys];\n\n for (const key of keyArray) {\n if (!this.subscribers.has(key)) {\n this.subscribers.set(key, new Set());\n }\n this.subscribers.get(key)!.add(callback);\n }\n\n return () => {\n for (const key of keyArray) {\n this.subscribers.get(key)?.delete(callback);\n }\n };\n }\n\n /**\n * Get current value of a state property\n */\n getSnapshot<K extends keyof McpStoreState>(key: K): McpStoreState[K] {\n return this.state[key];\n }\n\n /**\n * Get the full state snapshot\n */\n getFullSnapshot(): McpStoreState {\n return this.state;\n }\n\n /**\n * Get server snapshot (for SSR)\n */\n getServerSnapshot<K extends keyof McpStoreState>(key: K): McpStoreState[K] | undefined {\n // Return sensible defaults for SSR\n const defaults: Partial<McpStoreState> = {\n isInitialized: false,\n hostContext: {},\n };\n return defaults[key] as McpStoreState[K] | undefined;\n }\n}\n\nexport { McpAppsStore };\n\n/**\n * Get the store instance (convenience function)\n */\nexport function getStore(): McpAppsStore {\n return McpAppsStore.getInstance();\n}\n","/**\n * Base hook factory for creating reactive hooks for MCP store properties\n */\n\nimport { useSyncExternalStore } from 'react';\nimport { getStore } from '../store';\nimport type { McpStoreState } from '../types';\n\n/**\n * Create a hook that subscribes to a specific store property\n */\nexport function createMcpStoreHook<K extends keyof McpStoreState>(\n key: K\n): () => McpStoreState[K] {\n return function useMcpStore(): McpStoreState[K] {\n const store = getStore();\n\n return useSyncExternalStore(\n (callback) => store.subscribe(key, callback),\n () => store.getSnapshot(key),\n () => store.getServerSnapshot(key) as McpStoreState[K]\n );\n };\n}\n\n/**\n * Generic hook to access any MCP store property\n */\nexport function useMcpStore<K extends keyof McpStoreState>(key: K): McpStoreState[K] {\n const store = getStore();\n\n return useSyncExternalStore(\n (callback) => store.subscribe(key, callback),\n () => store.getSnapshot(key),\n () => store.getServerSnapshot(key) as McpStoreState[K]\n );\n}\n","import { useMcpStore } from './use-mcp-store';\nimport type { Theme } from '../types';\n\n/**\n * Get the current theme (light or dark)\n *\n * @returns Current theme, defaults to 'light' if not set\n */\nexport function useTheme(): Theme {\n const hostContext = useMcpStore('hostContext');\n return hostContext.theme ?? 'light';\n}\n","import { useMcpStore } from './use-mcp-store';\n\n/**\n * Get the user's locale setting\n *\n * @returns BCP 47 language tag (e.g., 'en-US')\n */\nexport function useLocale(): string {\n const hostContext = useMcpStore('hostContext');\n return hostContext.locale ?? 'en-US';\n}\n","import { useMcpStore } from './use-mcp-store';\n\n/**\n * Get the user's timezone\n *\n * @returns IANA timezone string (e.g., 'America/New_York')\n */\nexport function useTimezone(): string | undefined {\n const hostContext = useMcpStore('hostContext');\n return hostContext.timeZone;\n}\n","import { useMcpStore } from './use-mcp-store';\nimport type { DisplayMode } from '../types';\n\n/**\n * Get the current display mode\n *\n * @returns Current display mode: 'inline', 'fullscreen', or 'pip'\n */\nexport function useDisplayMode(): DisplayMode {\n const hostContext = useMcpStore('hostContext');\n return hostContext.displayMode ?? 'inline';\n}\n","import { useMcpStore } from './use-mcp-store';\nimport type { DisplayMode } from '../types';\n\n/**\n * Get the list of available display modes\n *\n * @returns Array of available display modes\n */\nexport function useAvailableDisplayModes(): DisplayMode[] {\n const hostContext = useMcpStore('hostContext');\n return hostContext.availableDisplayModes ?? ['inline'];\n}\n","import { useMcpStore } from './use-mcp-store';\nimport type { ContainerDimensions } from '../types';\n\n/**\n * Get the container dimension constraints\n *\n * @returns Container dimensions or undefined\n */\nexport function useContainerDimensions(): ContainerDimensions | undefined {\n const hostContext = useMcpStore('hostContext');\n return hostContext.containerDimensions;\n}\n","import { useMcpStore } from './use-mcp-store';\nimport type { SafeAreaInsets } from '../types';\n\nconst DEFAULT_SAFE_AREA: SafeAreaInsets = {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0,\n};\n\n/**\n * Get safe area insets for devices with notches/rounded corners\n *\n * @returns Safe area insets object\n */\nexport function useSafeArea(): SafeAreaInsets {\n const hostContext = useMcpStore('hostContext');\n return hostContext.safeAreaInsets ?? DEFAULT_SAFE_AREA;\n}\n","import { useMcpStore } from './use-mcp-store';\nimport type { Platform } from '../types';\n\n/**\n * Get the host platform\n *\n * @returns Platform: 'web', 'desktop', or 'mobile'\n */\nexport function usePlatform(): Platform | undefined {\n const hostContext = useMcpStore('hostContext');\n return hostContext.platform;\n}\n","import { useMcpStore } from './use-mcp-store';\nimport type { DeviceCapabilities } from '../types';\n\nconst DEFAULT_CAPABILITIES: DeviceCapabilities = {\n touch: false,\n hover: true,\n};\n\n/**\n * Get device capabilities (touch, hover support)\n *\n * @returns Device capabilities object\n */\nexport function useDeviceCapabilities(): DeviceCapabilities {\n const hostContext = useMcpStore('hostContext');\n return hostContext.deviceCapabilities ?? DEFAULT_CAPABILITIES;\n}\n","import { useMcpStore } from './use-mcp-store';\nimport type { Styles } from '../types';\n\n/**\n * Get CSS styling information from the host\n *\n * Includes CSS variables and font CSS to inject.\n *\n * @returns Styles object or undefined\n */\nexport function useStyles(): Styles | undefined {\n const hostContext = useMcpStore('hostContext');\n return hostContext.styles;\n}\n","import { useMcpStore } from './use-mcp-store';\nimport type { ToolInfo } from '../types';\n\n/**\n * Get information about the tool that triggered this UI\n *\n * @returns Tool info or undefined\n */\nexport function useToolInfo(): ToolInfo | undefined {\n const hostContext = useMcpStore('hostContext');\n return hostContext.toolInfo;\n}\n","import { useMcpStore } from './use-mcp-store';\n\n/**\n * Get the complete tool input arguments\n *\n * Sent via ui/notifications/tool-input after initialization.\n *\n * @returns Tool input arguments or undefined\n */\nexport function useToolInput<T = Record<string, unknown>>(): T | undefined {\n return useMcpStore('toolInput') as T | undefined;\n}\n","import { useMcpStore } from './use-mcp-store';\nimport type { CallToolResult } from '../types';\n\n/**\n * Get the tool execution result\n *\n * Sent via ui/notifications/tool-result.\n *\n * @returns Tool result or undefined\n */\nexport function useToolResult<T = unknown>(): CallToolResult<T> | undefined {\n return useMcpStore('toolResult') as CallToolResult<T> | undefined;\n}\n","import { useMcpStore } from './use-mcp-store';\nimport type { HostContext } from '../types';\n\n/**\n * Get the full host context object\n *\n * Use this for accessing multiple context properties at once.\n *\n * @returns Host context object\n */\nexport function useHostContext(): HostContext {\n return useMcpStore('hostContext');\n}\n","import { useMcpStore } from './use-mcp-store';\nimport type { HostCapabilities } from '../types';\n\n/**\n * Get the host's capabilities\n *\n * @returns Host capabilities or undefined if not initialized\n */\nexport function useHostCapabilities(): HostCapabilities | undefined {\n return useMcpStore('hostCapabilities');\n}\n","import { useMcpStore } from './use-mcp-store';\n\n/**\n * Check if the MCP connection has been initialized\n *\n * @returns true if initialized, false otherwise\n */\nexport function useIsInitialized(): boolean {\n return useMcpStore('isInitialized');\n}\n","import { getBridge } from '../bridge';\nimport { getStore } from '../store';\nimport type { InitializeOptions, McpUiInitializeResult } from '../types';\n\n/**\n * Initialize the MCP connection with the host\n *\n * This must be called before using other actions. If called multiple times,\n * subsequent calls return the cached result.\n *\n * @param options - Optional initialization options\n * @returns Promise resolving to initialization result\n *\n * @example\n * ```tsx\n * useEffect(() => {\n * initialize({\n * clientInfo: { name: 'my-app', version: '1.0.0' }\n * }).then((result) => {\n * console.log('Initialized with:', result.hostContext);\n * });\n * }, []);\n * ```\n */\nexport async function initialize(options?: InitializeOptions): Promise<McpUiInitializeResult> {\n const bridge = getBridge();\n const result = await bridge.initialize(options);\n\n // Update store with initialization data\n const store = getStore();\n store.setInitialized(result.hostContext, result.hostCapabilities, result.hostInfo);\n\n return result;\n}\n","import { getBridge } from '../bridge';\nimport type { CallToolResult } from '../types';\n\n/**\n * Call an MCP server tool\n *\n * @param name - Tool name to call\n * @param args - Optional arguments for the tool\n * @returns Promise resolving to tool result\n *\n * @example\n * ```tsx\n * const result = await callTool('search', { query: 'pancakes' });\n * console.log(result.structuredContent);\n * ```\n */\nexport async function callTool<TInput = Record<string, unknown>, TOutput = unknown>(\n name: string,\n args?: TInput\n): Promise<CallToolResult<TOutput>> {\n const bridge = getBridge();\n return bridge.callTool<TInput, TOutput>(name, args);\n}\n","import { getBridge } from '../bridge';\nimport type { ResourceReadResult } from '../types';\n\n/**\n * Read content from an MCP resource\n *\n * @param uri - Resource URI to read\n * @returns Promise resolving to resource contents\n *\n * @example\n * ```tsx\n * const result = await readResource('ui://my-resource');\n * console.log(result.contents[0]?.text);\n * ```\n */\nexport async function readResource(uri: string): Promise<ResourceReadResult> {\n const bridge = getBridge();\n return bridge.readResource(uri);\n}\n","import { getBridge } from '../bridge';\n\n/**\n * Send a message to the host's chat interface\n *\n * @param text - Message text to send\n *\n * @example\n * ```tsx\n * await sendMessage('Show me more options');\n * ```\n */\nexport async function sendMessage(text: string): Promise<void> {\n const bridge = getBridge();\n return bridge.sendMessage(text);\n}\n","import { getBridge } from '../bridge';\n\n/**\n * Request the host to open a URL in the user's browser\n *\n * @param url - URL to open\n *\n * @example\n * ```tsx\n * await openLink('https://example.com');\n * ```\n */\nexport async function openLink(url: string): Promise<void> {\n const bridge = getBridge();\n return bridge.openLink(url);\n}\n","import { getBridge } from '../bridge';\nimport type { DisplayMode } from '../types';\n\n/**\n * Request a change in display mode\n *\n * Note: The host may return a different mode than requested.\n *\n * @param mode - Desired display mode\n * @returns Promise resolving to the actual mode set\n *\n * @example\n * ```tsx\n * const actualMode = await requestDisplayMode('fullscreen');\n * if (actualMode !== 'fullscreen') {\n * console.log('Fullscreen not available');\n * }\n * ```\n */\nexport async function requestDisplayMode(mode: DisplayMode): Promise<DisplayMode> {\n const bridge = getBridge();\n return bridge.requestDisplayMode(mode);\n}\n","import { getBridge } from '../bridge';\nimport type { UpdateModelContextParams } from '../types';\n\n/**\n * Update the host's model context for future conversation turns\n *\n * Each update overwrites previous updates from the same UI instance.\n *\n * @param params - Context update parameters\n *\n * @example\n * ```tsx\n * await updateModelContext({\n * structuredContent: { selectedItems: ['a', 'b', 'c'] }\n * });\n * ```\n */\nexport async function updateModelContext(params: UpdateModelContextParams): Promise<void> {\n const bridge = getBridge();\n return bridge.updateModelContext(params);\n}\n","import { getBridge } from '../bridge';\n\n/**\n * Notify the host of size changes\n *\n * Use this when in flexible sizing mode (maxHeight set, not height).\n *\n * @param width - Current width in pixels\n * @param height - Current height in pixels\n *\n * @example\n * ```tsx\n * // In a ResizeObserver callback\n * notifySizeChanged(entry.contentRect.width, entry.contentRect.height);\n * ```\n */\nexport function notifySizeChanged(width: number, height: number): void {\n const bridge = getBridge();\n bridge.notifySizeChanged(width, height);\n}\n\n/**\n * Setup automatic size reporting via ResizeObserver\n *\n * @param element - Element to observe (defaults to document.documentElement)\n * @returns Cleanup function to stop observing\n *\n * @example\n * ```tsx\n * useEffect(() => {\n * return setupAutoSizeReporting();\n * }, []);\n * ```\n */\nexport function setupAutoSizeReporting(element: HTMLElement = document.documentElement): () => void {\n const bridge = getBridge();\n return bridge.setupAutoSizeReporting(element);\n}\n","import { getBridge } from '../bridge';\nimport type { LogLevel } from '../types';\n\n/**\n * Send a log message to the host\n *\n * @param level - Log level: 'debug', 'info', 'warning', or 'error'\n * @param data - Data to log\n * @param logger - Optional logger name\n *\n * @example\n * ```tsx\n * log('info', { action: 'button_click', target: 'submit' });\n * log('error', error.message, 'ErrorHandler');\n * ```\n */\nexport function log(level: LogLevel, data: unknown, logger?: string): void {\n const bridge = getBridge();\n bridge.log(level, data, logger);\n}\n\n// Convenience functions\nexport const logDebug = (data: unknown, logger?: string): void => log('debug', data, logger);\nexport const logInfo = (data: unknown, logger?: string): void => log('info', data, logger);\nexport const logWarning = (data: unknown, logger?: string): void => log('warning', data, logger);\nexport const logError = (data: unknown, logger?: string): void => log('error', data, logger);\n","import { getBridge } from '../bridge';\nimport type { ResourceTeardownParams } from '../types';\n\ntype TeardownHandler = (params: ResourceTeardownParams) => Promise<void> | void;\n\n/**\n * Register a handler for resource teardown\n *\n * Called when the host is about to unmount the UI. Use this to\n * save state or perform cleanup before the iframe is destroyed.\n *\n * @param handler - Async or sync function called on teardown\n * @returns Unsubscribe function\n *\n * @example\n * ```tsx\n * useEffect(() => {\n * return onTeardown(async ({ reason }) => {\n * await saveProgress();\n * console.log('Teardown reason:', reason);\n * });\n * }, []);\n * ```\n */\nexport function onTeardown(handler: TeardownHandler): () => void {\n const bridge = getBridge();\n return bridge.onTeardown(handler);\n}\n","/**\n * createMcpView\n *\n * High-level API for creating MCP views with minimal boilerplate.\n * Handles initialization, style injection, size reporting, and teardown.\n */\n\nimport { initialize } from './actions/initialize';\nimport { notifySizeChanged } from './actions/notify-size-changed';\nimport { onTeardown } from './actions/on-teardown';\nimport { getStore } from './store';\nimport type { ClientInfo, HostContext, Styles } from './types';\n\n// ============================================\n// Types\n// ============================================\n\nexport interface AutoResizeOptions {\n /** Debounce interval in milliseconds (default: 100) */\n debounceMs?: number;\n /** Pixel threshold to avoid noise (default: 2) */\n threshold?: number;\n /** Watch DOM changes with MutationObserver (default: true) */\n useMutationObserver?: boolean;\n /** Element to observe (default: document.body) */\n element?: HTMLElement;\n}\n\nexport interface CreateMcpViewOptions {\n /** Client identification */\n clientInfo?: ClientInfo;\n /** Enable automatic size reporting (default: true) */\n autoResize?: boolean | AutoResizeOptions;\n /** Inject host CSS variables and fonts into DOM (default: false) */\n autoInjectStyles?: boolean;\n /** Called after initialization, context is ready */\n onReady?: (context: HostContext) => void;\n /** Called when host context changes (after styles are re-applied if autoInjectStyles) */\n onContextChange?: (context: HostContext, changes: Partial<HostContext>) => void;\n /** Called when host requests teardown */\n onTeardown?: (reason: string) => void;\n}\n\nexport interface McpView {\n /** Get current host context */\n getContext(): HostContext;\n /** Manually notify size change */\n notifySize(width: number, height: number): void;\n /** Cleanup all subscriptions and observers */\n destroy(): void;\n}\n\n// ============================================\n// Style Injection Helper\n// ============================================\n\nconst MCP_FONTS_STYLE_ID = 'mcp-app-fonts';\n\nfunction injectStyles(styles: Styles | undefined): void {\n if (!styles) return;\n\n if (styles.variables) {\n for (const [key, value] of Object.entries(styles.variables)) {\n document.documentElement.style.setProperty(key, value as string);\n }\n }\n\n if (styles.css?.fonts) {\n let fontEl = document.getElementById(MCP_FONTS_STYLE_ID);\n if (!fontEl) {\n fontEl = document.createElement('style');\n fontEl.id = MCP_FONTS_STYLE_ID;\n document.head.appendChild(fontEl);\n }\n fontEl.textContent = styles.css.fonts;\n }\n}\n\n// ============================================\n// Enhanced Size Reporting\n// ============================================\n\nfunction setupEnhancedSizeReporting(options: AutoResizeOptions = {}): () => void {\n const {\n debounceMs = 100,\n threshold = 2,\n useMutationObserver = true,\n element = document.body,\n } = options;\n\n let lastSentHeight = 0;\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\n\n const reportSize = () => {\n const height = document.body.scrollHeight;\n const width = document.documentElement.clientWidth;\n if (Math.abs(height - lastSentHeight) > threshold) {\n notifySizeChanged(width, height);\n lastSentHeight = height;\n }\n };\n\n const debouncedReport = () => {\n if (timeoutId) clearTimeout(timeoutId);\n timeoutId = setTimeout(reportSize, debounceMs);\n };\n\n const resizeObserver = new ResizeObserver(debouncedReport);\n resizeObserver.observe(element);\n\n let mutationObserver: MutationObserver | null = null;\n if (useMutationObserver) {\n mutationObserver = new MutationObserver(debouncedReport);\n mutationObserver.observe(document.body, {\n childList: true,\n subtree: true,\n attributes: true,\n });\n }\n\n // Report initial size\n reportSize();\n\n return () => {\n if (timeoutId) clearTimeout(timeoutId);\n resizeObserver.disconnect();\n mutationObserver?.disconnect();\n };\n}\n\n// ============================================\n// Change Detection Helper\n// ============================================\n\nfunction computeChanges(prev: HostContext, next: HostContext): Partial<HostContext> {\n const changes: Partial<HostContext> = {};\n for (const key of Object.keys(next) as (keyof HostContext)[]) {\n if (prev[key] !== next[key]) {\n (changes as Record<string, unknown>)[key] = next[key];\n }\n }\n return changes;\n}\n\n// ============================================\n// Main Function\n// ============================================\n\n/**\n * Create an MCP view with automatic lifecycle management\n *\n * Handles:\n * - Initialization handshake with host\n * - Style injection (CSS variables + fonts)\n * - Automatic size reporting with debouncing\n * - Host context change subscriptions\n * - Teardown handling\n *\n * @example\n * ```ts\n * const view = await createMcpView({\n * clientInfo: { name: 'my-view', version: '1.0.0' },\n * autoResize: true,\n * autoInjectStyles: true,\n *\n * onReady: (context) => {\n * console.log('View ready with theme:', context.theme);\n * renderContent();\n * },\n *\n * onContextChange: (context) => {\n * updateTheme(context.theme);\n * },\n *\n * onTeardown: (reason) => {\n * saveState();\n * },\n * });\n *\n * // Later: manual cleanup\n * view.destroy();\n * ```\n */\nexport async function createMcpView(options: CreateMcpViewOptions = {}): Promise<McpView> {\n const {\n clientInfo,\n autoResize = true,\n autoInjectStyles = false,\n onReady,\n onContextChange,\n onTeardown: onTeardownCallback,\n } = options;\n\n const cleanupFns: (() => void)[] = [];\n\n // 1. Initialize connection with host\n const initResult = await initialize(clientInfo ? { clientInfo } : undefined);\n const store = getStore();\n\n // 2. Apply initial styles if enabled\n if (autoInjectStyles) {\n injectStyles(initResult.hostContext.styles);\n }\n\n // 3. Setup size reporting if enabled\n if (autoResize) {\n const resizeOptions = typeof autoResize === 'object' ? autoResize : {};\n const cleanup = setupEnhancedSizeReporting(resizeOptions);\n cleanupFns.push(cleanup);\n }\n\n // 4. Subscribe to context changes\n let previousContext = initResult.hostContext;\n const unsubscribe = store.subscribe('hostContext', () => {\n const newContext = store.getSnapshot('hostContext');\n const changes = computeChanges(previousContext, newContext);\n\n if (autoInjectStyles && changes.styles) {\n injectStyles(newContext.styles);\n }\n\n onContextChange?.(newContext, changes);\n previousContext = newContext;\n });\n cleanupFns.push(unsubscribe);\n\n // 5. Register teardown handler\n if (onTeardownCallback) {\n const unregisterTeardown = onTeardown((params) => {\n onTeardownCallback(params.reason);\n });\n cleanupFns.push(unregisterTeardown);\n }\n\n // 6. Call onReady callback\n onReady?.(initResult.hostContext);\n\n // Return app interface\n return {\n getContext: () => store.getSnapshot('hostContext'),\n notifySize: notifySizeChanged,\n destroy: () => {\n cleanupFns.forEach((fn) => fn());\n },\n };\n}\n"]}