@pancake-apps/web 0.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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/types.ts","../../src/adapters/mcp.ts","../../src/adapters/openai.ts","../../src/adapters/mock.ts","../../src/detection.ts","../../src/client.ts","../../src/react/context.tsx","../../src/react/provider.tsx","../../src/react/hooks/useViewState.ts","../../src/react/hooks/useHost.ts","../../src/react/hooks/useTheme.ts","../../src/react/hooks/useDisplayMode.ts","../../src/react/hooks/useNavigation.ts","../../src/react/hooks/useActionInput.ts","../../src/react/hooks/useViewParams.ts","../../src/react/hooks/useAction.ts","../../src/react/hooks/useData.ts"],"names":["useState","useEffect","useCallback"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Host context provided by MCP or OpenAI hosts\n */\nexport interface HostContext {\n /** Current theme */\n theme: 'light' | 'dark';\n /** Current display mode */\n displayMode: 'inline' | 'fullscreen' | 'pip';\n /** Available display modes */\n availableDisplayModes: string[];\n /** Viewport dimensions */\n viewport: { width: number; height: number };\n /** User's locale (e.g., 'en-US') */\n locale: string;\n /** User's timezone */\n timeZone: string;\n /** Platform type */\n platform: 'desktop' | 'mobile' | 'web';\n /** Current view identifier (if applicable) */\n view?: string;\n /** Safe area insets for mobile */\n safeAreaInsets?: {\n top: number;\n right: number;\n bottom: number;\n left: number;\n };\n}\n\n/**\n * View parameters passed to the UI\n */\nexport interface ViewParams<TInputs = unknown, TData = unknown> {\n /** Input parameters passed to the view */\n inputs: TInputs;\n /** Data returned by the view handler */\n data: TData;\n}\n\n/**\n * Global Pancake API available on window.pancake\n */\nexport interface PancakeGlobal {\n /** Host context (theme, display mode, etc.) */\n readonly hostContext: HostContext;\n\n /** Current view parameters */\n readonly viewParams: ViewParams;\n\n /** Current view state */\n readonly viewState: unknown;\n\n /**\n * Navigate to a different view.\n * This triggers a tool call on the model side.\n */\n navigateToView(viewName: string, viewParams?: Record<string, unknown>): Promise<void>;\n\n /**\n * Send a message to the model.\n */\n say(message: string): Promise<void>;\n\n /**\n * Set the view state.\n * State is persisted in ChatGPT, volatile in MCP.\n */\n setViewState(state: unknown): void;\n\n /**\n * Dispatch an action (write operation).\n * This calls the action tool on the server.\n */\n dispatch<T = unknown>(actionName: string, actionParams?: Record<string, unknown>): Promise<T>;\n\n /**\n * Get data from a data fetcher (read operation).\n * This calls the data tool on the server.\n */\n getData<T = unknown>(dataName: string, dataParams?: Record<string, unknown>): Promise<T>;\n}\n\n/**\n * Protocol types\n */\nexport type Protocol = 'mcp' | 'openai' | 'mock';\n\n/**\n * Default host context\n */\nexport const DEFAULT_HOST_CONTEXT: HostContext = {\n theme: 'light',\n displayMode: 'inline',\n availableDisplayModes: ['inline'],\n viewport: { width: 0, height: 0 },\n locale: 'en-US',\n timeZone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n platform: 'web',\n};\n","import type { ProtocolAdapter } from './interface.js';\nimport type { HostContext, ViewParams } from '../types.js';\nimport { DEFAULT_HOST_CONTEXT } from '../types.js';\n\n/**\n * MCP protocol adapter.\n * Uses @modelcontextprotocol/ext-apps for communication with MCP hosts.\n */\nexport class McpAdapter implements ProtocolAdapter {\n readonly protocol = 'mcp' as const;\n\n private app: unknown = null;\n private connected = false;\n private context: HostContext = { ...DEFAULT_HOST_CONTEXT };\n private currentToolInput: Record<string, unknown> | undefined;\n private currentToolOutput: Record<string, unknown> | undefined;\n private state: unknown = null;\n\n private hostContextHandlers = new Set<(ctx: HostContext) => void>();\n private toolInputHandlers = new Set<(input: unknown) => void>();\n private toolOutputHandlers = new Set<(output: unknown) => void>();\n private toolCancelledHandlers = new Set<(reason?: string) => void>();\n private teardownHandlers = new Set<(reason?: string) => void>();\n\n constructor(private options?: { autoResize?: boolean }) {}\n\n isConnected(): boolean {\n return this.connected;\n }\n\n async connect(): Promise<void> {\n if (this.connected) return;\n\n // SSR / tests: behave as connected but inert\n if (typeof window === 'undefined') {\n this.connected = true;\n return;\n }\n\n try {\n // Dynamically import ext-apps SDK\n const { App } = await import('@modelcontextprotocol/ext-apps');\n\n // Create App instance\n this.app = new App(\n { name: 'pancake-client', version: '0.1.0' },\n { tools: {} },\n { autoResize: this.options?.autoResize ?? true }\n );\n\n const app = this.app as {\n onerror: (err: Error) => void;\n onhostcontextchanged: (params: unknown) => void;\n ontoolinput: (params: unknown) => void;\n ontoolresult: (result: unknown) => void;\n ontoolcancelled: (params: unknown) => void;\n onteardown: (params: unknown) => Promise<Record<string, unknown>>;\n connect: () => Promise<void>;\n getHostContext: () => unknown;\n };\n\n // Set up event handlers\n app.onerror = (err: Error) => this.log('error', err);\n\n app.onhostcontextchanged = (params: unknown) => {\n const hostContext = (params as { hostContext?: unknown })?.hostContext ?? params;\n this.context = this.mapHostContext(hostContext);\n for (const handler of this.hostContextHandlers) {\n handler(this.context);\n }\n };\n\n app.ontoolinput = (params: unknown) => {\n const args = (params as { arguments?: Record<string, unknown> })?.arguments;\n if (args) {\n this.currentToolInput = args;\n for (const handler of this.toolInputHandlers) {\n handler(args);\n }\n }\n };\n\n app.ontoolresult = (result: unknown) => {\n const output = (result as { structuredContent?: Record<string, unknown> })?.structuredContent ?? {};\n this.currentToolOutput = output;\n for (const handler of this.toolOutputHandlers) {\n handler(output);\n }\n };\n\n app.ontoolcancelled = (params: unknown) => {\n const reason = (params as { reason?: string })?.reason;\n for (const handler of this.toolCancelledHandlers) {\n handler(reason);\n }\n };\n\n app.onteardown = async (params: unknown) => {\n const reason = (params as { reason?: string })?.reason;\n for (const handler of this.teardownHandlers) {\n handler(reason);\n }\n return {};\n };\n\n // Connect\n await app.connect();\n\n // Get initial context\n const initialContext = app.getHostContext();\n if (initialContext) {\n this.context = this.mapHostContext(initialContext);\n }\n\n this.connected = true;\n } catch (error) {\n console.warn('[Pancake] Failed to connect MCP adapter:', error);\n this.connected = true; // Continue in degraded mode\n }\n }\n\n async disconnect(): Promise<void> {\n this.connected = false;\n this.app = null;\n }\n\n private mapHostContext(raw: unknown): HostContext {\n const ctx = raw as Record<string, unknown>;\n const result: HostContext = {\n theme: (ctx['theme'] as 'light' | 'dark') ?? 'light',\n displayMode: (ctx['displayMode'] as 'inline' | 'fullscreen' | 'pip') ?? 'inline',\n availableDisplayModes: (ctx['availableDisplayModes'] as string[]) ?? ['inline'],\n viewport: (ctx['viewport'] as { width: number; height: number }) ?? { width: 0, height: 0 },\n locale: (ctx['locale'] as string) ?? 'en-US',\n timeZone: (ctx['timeZone'] as string) ?? Intl.DateTimeFormat().resolvedOptions().timeZone,\n platform: (ctx['platform'] as 'desktop' | 'mobile' | 'web') ?? 'web',\n };\n if (ctx['view'] !== undefined) {\n result.view = ctx['view'] as string;\n }\n if (ctx['safeAreaInsets'] !== undefined) {\n result.safeAreaInsets = ctx['safeAreaInsets'] as { top: number; right: number; bottom: number; left: number };\n }\n return result;\n }\n\n getHostContext(): HostContext {\n return this.context;\n }\n\n onHostContextChange(handler: (ctx: HostContext) => void): () => void {\n this.hostContextHandlers.add(handler);\n return () => this.hostContextHandlers.delete(handler);\n }\n\n getViewParams(): ViewParams {\n return {\n inputs: this.currentToolInput ?? {},\n data: this.currentToolOutput ?? {},\n };\n }\n\n getToolInput(): Record<string, unknown> | undefined {\n return this.currentToolInput;\n }\n\n getToolOutput(): Record<string, unknown> | undefined {\n return this.currentToolOutput;\n }\n\n onToolInput(handler: (input: unknown) => void): () => void {\n this.toolInputHandlers.add(handler);\n return () => this.toolInputHandlers.delete(handler);\n }\n\n onToolOutput(handler: (output: unknown) => void): () => void {\n this.toolOutputHandlers.add(handler);\n return () => this.toolOutputHandlers.delete(handler);\n }\n\n async callTool(name: string, args: Record<string, unknown>): Promise<unknown> {\n if (!this.app) {\n throw new Error('Not connected');\n }\n\n const app = this.app as {\n callServerTool: (params: { name: string; arguments: Record<string, unknown> }) => Promise<{ structuredContent?: unknown }>;\n };\n\n const result = await app.callServerTool({ name, arguments: args });\n return result.structuredContent ?? {};\n }\n\n async sendMessage(content: { type: string; text: string }): Promise<void> {\n if (!this.app) return;\n\n const app = this.app as {\n sendMessage: (params: { role: string; content: Array<{ type: string; text: string }> }) => Promise<void>;\n };\n\n await app.sendMessage({\n role: 'user',\n content: [{ type: 'text', text: content.text }],\n });\n }\n\n async openLink(url: string): Promise<void> {\n if (!this.app) {\n window.open(url, '_blank');\n return;\n }\n\n const app = this.app as {\n openLink: (params: { url: string }) => Promise<void>;\n };\n\n await app.openLink({ url });\n }\n\n async requestDisplayMode(mode: 'inline' | 'fullscreen' | 'pip'): Promise<{ mode: string }> {\n if (!this.app) {\n return { mode };\n }\n\n const app = this.app as {\n requestDisplayMode: (params: { mode: string }) => Promise<{ mode: string }>;\n };\n\n return app.requestDisplayMode({ mode });\n }\n\n requestClose(): void {\n // MCP doesn't have a close method, this is a no-op\n }\n\n // State is not supported in MCP\n getState<T>(): T | null {\n return this.state as T | null;\n }\n\n setState<T>(state: T): void {\n this.state = state;\n // MCP doesn't persist state - this is local only\n }\n\n onToolCancelled(handler: (reason?: string) => void): () => void {\n this.toolCancelledHandlers.add(handler);\n return () => this.toolCancelledHandlers.delete(handler);\n }\n\n onTeardown(handler: (reason?: string) => void): () => void {\n this.teardownHandlers.add(handler);\n return () => this.teardownHandlers.delete(handler);\n }\n\n log(level: 'debug' | 'info' | 'warn' | 'error', data: unknown): void {\n if (this.app) {\n const app = this.app as {\n sendLog: (params: { level: string; data: unknown; logger: string }) => void;\n };\n try {\n app.sendLog({ level, data, logger: 'pancake' });\n return;\n } catch {\n // Fall through to console\n }\n }\n console[level === 'debug' ? 'log' : level]('[Pancake]', data);\n }\n\n async sendSizeChanged(params: { width: number; height: number }): Promise<void> {\n if (!this.app) return;\n\n const app = this.app as {\n sendSizeChanged: (params: { width: number; height: number }) => Promise<void>;\n };\n\n await app.sendSizeChanged(params);\n }\n}\n","import type { ProtocolAdapter } from './interface.js';\nimport type { HostContext, ViewParams } from '../types.js';\nimport { DEFAULT_HOST_CONTEXT } from '../types.js';\n\n/**\n * OpenAI/ChatGPT protocol adapter.\n * Uses window.openai SDK injected by the ChatGPT sandbox.\n */\nexport class OpenAIAdapter implements ProtocolAdapter {\n readonly protocol = 'openai' as const;\n\n private connected = false;\n private context: HostContext = { ...DEFAULT_HOST_CONTEXT };\n private currentToolInput: Record<string, unknown> | undefined;\n private currentToolOutput: Record<string, unknown> | undefined;\n private state: unknown = null;\n\n private hostContextHandlers = new Set<(ctx: HostContext) => void>();\n private toolInputHandlers = new Set<(input: unknown) => void>();\n private toolOutputHandlers = new Set<(output: unknown) => void>();\n private toolCancelledHandlers = new Set<(reason?: string) => void>();\n private teardownHandlers = new Set<(reason?: string) => void>();\n\n private globalsHandler: ((event: MessageEvent) => void) | null = null;\n private setGlobalsHandler: ((event: Event) => void) | null = null;\n\n isConnected(): boolean {\n return this.connected;\n }\n\n private getOpenAI(): Record<string, unknown> | null {\n if (typeof window !== 'undefined' && 'openai' in window) {\n return (window as unknown as { openai: Record<string, unknown> }).openai;\n }\n return null;\n }\n\n async connect(): Promise<void> {\n if (this.connected) return;\n\n // Wait for window.openai to be injected\n await this.waitForOpenAI();\n\n const openai = this.getOpenAI();\n if (openai) {\n this.readContextFromSDK();\n this.readToolDataFromSDK();\n\n // Initialize SDK if needed\n if (typeof openai['init'] === 'function') {\n await (openai['init'] as () => Promise<void>)();\n }\n }\n\n this.setupGlobalsListener();\n this.connected = true;\n }\n\n async disconnect(): Promise<void> {\n if (this.globalsHandler) {\n window.removeEventListener('message', this.globalsHandler);\n }\n if (this.setGlobalsHandler) {\n window.removeEventListener('openai:set_globals', this.setGlobalsHandler);\n }\n this.connected = false;\n }\n\n private async waitForOpenAI(timeout = 5000): Promise<void> {\n if (this.getOpenAI()) return;\n\n return new Promise((resolve) => {\n const startTime = Date.now();\n\n const check = () => {\n if (this.getOpenAI()) {\n resolve();\n return;\n }\n if (Date.now() - startTime > timeout) {\n resolve(); // Timeout - proceed anyway\n return;\n }\n setTimeout(check, 50);\n };\n\n // Also listen for set_globals message\n const messageHandler = (event: MessageEvent) => {\n if (this.isSetGlobalsMessage(event.data)) {\n setTimeout(() => {\n if (this.getOpenAI()) {\n window.removeEventListener('message', messageHandler);\n resolve();\n }\n }, 50);\n }\n };\n window.addEventListener('message', messageHandler);\n\n check();\n });\n }\n\n private isSetGlobalsMessage(data: unknown): boolean {\n return (\n data === 'openai:set_globals' ||\n (typeof data === 'object' &&\n data !== null &&\n 'type' in data &&\n (data as { type: unknown }).type === 'openai:set_globals') ||\n (typeof data === 'object' &&\n data !== null &&\n 'message' in data &&\n (data as { message: unknown }).message === 'openai:set_globals')\n );\n }\n\n private setupGlobalsListener(): void {\n // DOM custom event (current SDK)\n this.setGlobalsHandler = (event: Event) => {\n const detail = (event as CustomEvent).detail;\n const globals = detail?.globals ?? detail;\n this.updateContextFromGlobals(globals);\n };\n window.addEventListener('openai:set_globals', this.setGlobalsHandler);\n\n // postMessage fallback (older SDK versions)\n this.globalsHandler = (event: MessageEvent) => {\n if (this.isSetGlobalsMessage(event.data)) {\n setTimeout(() => this.readContextFromSDK(), 50);\n }\n };\n window.addEventListener('message', this.globalsHandler);\n }\n\n private updateContextFromGlobals(globals: Record<string, unknown>): void {\n if (globals?.['theme']) this.context.theme = globals['theme'] as 'light' | 'dark';\n if (globals?.['locale']) this.context.locale = globals['locale'] as string;\n if (globals?.['displayMode']) this.context.displayMode = globals['displayMode'] as 'inline' | 'fullscreen' | 'pip';\n\n for (const handler of this.hostContextHandlers) {\n handler({ ...this.context });\n }\n\n // Check for tool output updates\n if (globals?.['toolOutput']) {\n this.currentToolOutput = globals['toolOutput'] as Record<string, unknown>;\n for (const handler of this.toolOutputHandlers) {\n handler(this.currentToolOutput);\n }\n }\n }\n\n private readContextFromSDK(): void {\n const openai = this.getOpenAI();\n if (!openai) return;\n\n if (typeof openai['theme'] === 'string') {\n this.context.theme = openai['theme'] as 'light' | 'dark';\n }\n if (typeof openai['displayMode'] === 'string') {\n this.context.displayMode = openai['displayMode'] as 'inline' | 'fullscreen' | 'pip';\n }\n if (typeof openai['locale'] === 'string') {\n this.context.locale = openai['locale'] as string;\n }\n if (openai['safeArea'] && typeof openai['safeArea'] === 'object') {\n this.context.safeAreaInsets = openai['safeArea'] as { top: number; right: number; bottom: number; left: number };\n }\n if (typeof openai['maxHeight'] === 'number') {\n this.context.viewport = {\n width: window.innerWidth,\n height: openai['maxHeight'] as number,\n };\n }\n }\n\n private readToolDataFromSDK(): void {\n const openai = this.getOpenAI();\n if (!openai) return;\n\n // Tool input\n if (typeof openai['getToolInput'] === 'function') {\n this.currentToolInput = (openai['getToolInput'] as () => Record<string, unknown>)();\n } else if (openai['toolInput']) {\n this.currentToolInput = openai['toolInput'] as Record<string, unknown>;\n } else if (openai['input']) {\n this.currentToolInput = openai['input'] as Record<string, unknown>;\n }\n\n // Tool output\n if (typeof openai['getToolOutput'] === 'function') {\n this.currentToolOutput = (openai['getToolOutput'] as () => Record<string, unknown>)();\n } else if (openai['toolOutput']) {\n this.currentToolOutput = openai['toolOutput'] as Record<string, unknown>;\n } else if (openai['result']) {\n this.currentToolOutput = openai['result'] as Record<string, unknown>;\n }\n }\n\n getHostContext(): HostContext {\n return this.context;\n }\n\n onHostContextChange(handler: (ctx: HostContext) => void): () => void {\n this.hostContextHandlers.add(handler);\n return () => this.hostContextHandlers.delete(handler);\n }\n\n getViewParams(): ViewParams {\n return {\n inputs: this.currentToolInput ?? {},\n data: this.currentToolOutput ?? {},\n };\n }\n\n getToolInput(): Record<string, unknown> | undefined {\n return this.currentToolInput;\n }\n\n getToolOutput(): Record<string, unknown> | undefined {\n return this.currentToolOutput;\n }\n\n onToolInput(handler: (input: unknown) => void): () => void {\n this.toolInputHandlers.add(handler);\n return () => this.toolInputHandlers.delete(handler);\n }\n\n onToolOutput(handler: (output: unknown) => void): () => void {\n this.toolOutputHandlers.add(handler);\n return () => this.toolOutputHandlers.delete(handler);\n }\n\n async callTool(name: string, args: Record<string, unknown>): Promise<unknown> {\n const openai = this.getOpenAI();\n if (openai && typeof openai['callTool'] === 'function') {\n return (openai['callTool'] as (name: string, args: Record<string, unknown>) => Promise<unknown>)(name, args);\n }\n throw new Error('OpenAI SDK not available');\n }\n\n async sendMessage(content: { type: string; text: string }): Promise<void> {\n const openai = this.getOpenAI();\n if (openai && typeof openai['sendFollowUpMessage'] === 'function') {\n await (openai['sendFollowUpMessage'] as (params: { prompt: string }) => Promise<void>)({ prompt: content.text });\n }\n }\n\n async openLink(url: string): Promise<void> {\n const openai = this.getOpenAI();\n if (openai && typeof openai['openExternal'] === 'function') {\n await (openai['openExternal'] as (params: { href: string }) => Promise<void>)({ href: url });\n } else {\n window.open(url, '_blank');\n }\n }\n\n async requestDisplayMode(mode: 'inline' | 'fullscreen' | 'pip'): Promise<{ mode: string }> {\n const openai = this.getOpenAI();\n if (openai && typeof openai['requestDisplayMode'] === 'function') {\n return (openai['requestDisplayMode'] as (params: { mode: string }) => Promise<{ mode: string }>)({ mode });\n }\n return { mode };\n }\n\n requestClose(): void {\n const openai = this.getOpenAI();\n if (openai && typeof openai['close'] === 'function') {\n (openai['close'] as () => void)();\n }\n }\n\n // State IS supported in ChatGPT\n getState<T>(): T | null {\n const openai = this.getOpenAI();\n if (openai && typeof openai['getWidgetState'] === 'function') {\n return (openai['getWidgetState'] as () => T | null)();\n }\n return this.state as T | null;\n }\n\n setState<T>(state: T): void {\n this.state = state;\n const openai = this.getOpenAI();\n if (openai && typeof openai['setWidgetState'] === 'function') {\n (openai['setWidgetState'] as (state: T) => void)(state);\n }\n }\n\n onToolCancelled(handler: (reason?: string) => void): () => void {\n this.toolCancelledHandlers.add(handler);\n return () => this.toolCancelledHandlers.delete(handler);\n }\n\n onTeardown(handler: (reason?: string) => void): () => void {\n this.teardownHandlers.add(handler);\n return () => this.teardownHandlers.delete(handler);\n }\n\n log(level: 'debug' | 'info' | 'warn' | 'error', data: unknown): void {\n console[level === 'debug' ? 'log' : level]('[Pancake]', data);\n }\n\n async sendSizeChanged(params: { width: number; height: number }): Promise<void> {\n const openai = this.getOpenAI();\n if (openai && typeof openai['notifyIntrinsicHeight'] === 'function') {\n (openai['notifyIntrinsicHeight'] as (height: number) => void)(params.height);\n }\n }\n}\n","import type { ProtocolAdapter } from './interface.js';\nimport type { HostContext, ViewParams } from '../types.js';\nimport { DEFAULT_HOST_CONTEXT } from '../types.js';\n\n/**\n * Mock protocol adapter for testing and development.\n */\nexport class MockAdapter implements ProtocolAdapter {\n readonly protocol = 'mock' as const;\n\n private connected = false;\n private context: HostContext;\n private toolInput: Record<string, unknown> | undefined;\n private toolOutput: Record<string, unknown> | undefined;\n private state: unknown = null;\n\n private hostContextHandlers = new Set<(ctx: HostContext) => void>();\n private toolInputHandlers = new Set<(input: unknown) => void>();\n private toolOutputHandlers = new Set<(output: unknown) => void>();\n private toolCancelledHandlers = new Set<(reason?: string) => void>();\n private teardownHandlers = new Set<(reason?: string) => void>();\n\n private toolHandlers = new Map<string, (args: Record<string, unknown>) => Promise<unknown>>();\n\n constructor(options?: {\n hostContext?: Partial<HostContext>;\n toolInput?: Record<string, unknown>;\n toolOutput?: Record<string, unknown>;\n }) {\n this.context = { ...DEFAULT_HOST_CONTEXT, ...options?.hostContext };\n this.toolInput = options?.toolInput;\n this.toolOutput = options?.toolOutput;\n }\n\n isConnected(): boolean {\n return this.connected;\n }\n\n async connect(): Promise<void> {\n this.connected = true;\n }\n\n async disconnect(): Promise<void> {\n this.connected = false;\n }\n\n // ─────────────────────────────────────────────────────────────\n // Mock-specific methods for testing\n // ─────────────────────────────────────────────────────────────\n\n /**\n * Set the host context (for testing)\n */\n setHostContext(ctx: Partial<HostContext>): void {\n this.context = { ...this.context, ...ctx };\n for (const handler of this.hostContextHandlers) {\n handler(this.context);\n }\n }\n\n /**\n * Set the tool input (for testing)\n */\n setToolInput(input: Record<string, unknown>): void {\n this.toolInput = input;\n for (const handler of this.toolInputHandlers) {\n handler(input);\n }\n }\n\n /**\n * Set the tool output (for testing)\n */\n setToolOutput(output: Record<string, unknown>): void {\n this.toolOutput = output;\n for (const handler of this.toolOutputHandlers) {\n handler(output);\n }\n }\n\n /**\n * Register a tool handler (for testing)\n */\n registerToolHandler(\n name: string,\n handler: (args: Record<string, unknown>) => Promise<unknown>\n ): void {\n this.toolHandlers.set(name, handler);\n }\n\n /**\n * Trigger tool cancellation (for testing)\n */\n triggerToolCancelled(reason?: string): void {\n for (const handler of this.toolCancelledHandlers) {\n handler(reason);\n }\n }\n\n /**\n * Trigger teardown (for testing)\n */\n triggerTeardown(reason?: string): void {\n for (const handler of this.teardownHandlers) {\n handler(reason);\n }\n }\n\n // ─────────────────────────────────────────────────────────────\n // ProtocolAdapter implementation\n // ─────────────────────────────────────────────────────────────\n\n getHostContext(): HostContext {\n return this.context;\n }\n\n onHostContextChange(handler: (ctx: HostContext) => void): () => void {\n this.hostContextHandlers.add(handler);\n return () => this.hostContextHandlers.delete(handler);\n }\n\n getViewParams(): ViewParams {\n return {\n inputs: this.toolInput ?? {},\n data: this.toolOutput ?? {},\n };\n }\n\n getToolInput(): Record<string, unknown> | undefined {\n return this.toolInput;\n }\n\n getToolOutput(): Record<string, unknown> | undefined {\n return this.toolOutput;\n }\n\n onToolInput(handler: (input: unknown) => void): () => void {\n this.toolInputHandlers.add(handler);\n return () => this.toolInputHandlers.delete(handler);\n }\n\n onToolOutput(handler: (output: unknown) => void): () => void {\n this.toolOutputHandlers.add(handler);\n return () => this.toolOutputHandlers.delete(handler);\n }\n\n async callTool(name: string, args: Record<string, unknown>): Promise<unknown> {\n const handler = this.toolHandlers.get(name);\n if (handler) {\n return handler(args);\n }\n console.log(`[MockAdapter] callTool: ${name}`, args);\n return {};\n }\n\n async sendMessage(content: { type: string; text: string }): Promise<void> {\n console.log(`[MockAdapter] sendMessage:`, content);\n }\n\n async openLink(url: string): Promise<void> {\n console.log(`[MockAdapter] openLink: ${url}`);\n if (typeof window !== 'undefined') {\n window.open(url, '_blank');\n }\n }\n\n async requestDisplayMode(mode: 'inline' | 'fullscreen' | 'pip'): Promise<{ mode: string }> {\n console.log(`[MockAdapter] requestDisplayMode: ${mode}`);\n this.context.displayMode = mode;\n return { mode };\n }\n\n requestClose(): void {\n console.log(`[MockAdapter] requestClose`);\n }\n\n getState<T>(): T | null {\n return this.state as T | null;\n }\n\n setState<T>(state: T): void {\n this.state = state;\n }\n\n onToolCancelled(handler: (reason?: string) => void): () => void {\n this.toolCancelledHandlers.add(handler);\n return () => this.toolCancelledHandlers.delete(handler);\n }\n\n onTeardown(handler: (reason?: string) => void): () => void {\n this.teardownHandlers.add(handler);\n return () => this.teardownHandlers.delete(handler);\n }\n\n log(level: 'debug' | 'info' | 'warn' | 'error', data: unknown): void {\n console[level === 'debug' ? 'log' : level]('[MockAdapter]', data);\n }\n\n async sendSizeChanged(params: { width: number; height: number }): Promise<void> {\n console.log(`[MockAdapter] sendSizeChanged:`, params);\n }\n}\n","import type { Protocol } from './types.js';\n\n/**\n * Detect which protocol/host environment the UI is running in.\n */\nexport function detectProtocol(): Protocol {\n // Server-side: default to mock\n if (typeof window === 'undefined') {\n return 'mock';\n }\n\n // Check for OpenAI/ChatGPT Apps SDK (injected by sandbox)\n if ('openai' in window) {\n return 'openai';\n }\n\n // Check for ChatGPT sandbox environment (SDK will be injected)\n const url = window.location.href;\n const referrer = document.referrer;\n const isChatGPTSandbox =\n url.includes('chatgpt') ||\n url.includes('sandbox-proxy') ||\n url.includes('widget-content') ||\n referrer.includes('chatgpt') ||\n referrer.includes('openai.com');\n\n if (isChatGPTSandbox) {\n return 'openai';\n }\n\n // Check for iframe (MCP Apps loads UIs in iframes)\n if (window.parent !== window) {\n return 'mcp';\n }\n\n // Default to mock for development\n return 'mock';\n}\n","import type { ProtocolAdapter } from './adapters/interface.js';\nimport type { HostContext, ViewParams, Protocol } from './types.js';\nimport { McpAdapter } from './adapters/mcp.js';\nimport { OpenAIAdapter } from './adapters/openai.js';\nimport { MockAdapter } from './adapters/mock.js';\nimport { detectProtocol } from './detection.js';\n\n/**\n * Options for creating a Pancake client\n */\nexport interface PancakeClientOptions {\n /** Force a specific protocol adapter */\n forceAdapter?: Protocol;\n /** Enable auto-resize (default: true) */\n autoResize?: boolean;\n /** Initial tool input (for mock adapter) */\n toolInput?: Record<string, unknown>;\n /** Initial tool output (for mock adapter) */\n toolOutput?: Record<string, unknown>;\n /** Initial host context (for mock adapter) */\n hostContext?: Partial<HostContext>;\n}\n\n/**\n * Pancake client that wraps a protocol adapter.\n */\nexport class PancakeClient {\n private adapter: ProtocolAdapter;\n\n private constructor(adapter: ProtocolAdapter) {\n this.adapter = adapter;\n }\n\n /**\n * Create and connect a Pancake client.\n */\n static async create(options?: PancakeClientOptions): Promise<PancakeClient> {\n const protocol = options?.forceAdapter ?? detectProtocol();\n\n let adapter: ProtocolAdapter;\n switch (protocol) {\n case 'mcp':\n adapter = new McpAdapter({ autoResize: options?.autoResize ?? true });\n break;\n case 'openai':\n adapter = new OpenAIAdapter();\n break;\n case 'mock':\n default: {\n const mockOptions: {\n toolInput?: Record<string, unknown>;\n toolOutput?: Record<string, unknown>;\n hostContext?: Partial<HostContext>;\n } = {};\n if (options?.toolInput !== undefined) mockOptions.toolInput = options.toolInput;\n if (options?.toolOutput !== undefined) mockOptions.toolOutput = options.toolOutput;\n if (options?.hostContext !== undefined) mockOptions.hostContext = options.hostContext;\n adapter = new MockAdapter(mockOptions);\n break;\n }\n }\n\n await adapter.connect();\n return new PancakeClient(adapter);\n }\n\n /**\n * Create a Pancake client with a pre-configured adapter.\n */\n static fromAdapter(adapter: ProtocolAdapter): PancakeClient {\n return new PancakeClient(adapter);\n }\n\n /**\n * Get the underlying protocol adapter.\n */\n getAdapter(): ProtocolAdapter {\n return this.adapter;\n }\n\n /**\n * Get the current protocol.\n */\n get protocol(): Protocol {\n return this.adapter.protocol;\n }\n\n /**\n * Check if the client is connected.\n */\n isConnected(): boolean {\n return this.adapter.isConnected();\n }\n\n // ─────────────────────────────────────────────────────────────\n // Host Context\n // ─────────────────────────────────────────────────────────────\n\n /**\n * Get the current host context.\n */\n getHostContext(): HostContext {\n return this.adapter.getHostContext();\n }\n\n /**\n * Subscribe to host context changes.\n */\n onHostContextChange(handler: (ctx: HostContext) => void): () => void {\n return this.adapter.onHostContextChange(handler);\n }\n\n // ─────────────────────────────────────────────────────────────\n // View Parameters\n // ─────────────────────────────────────────────────────────────\n\n /**\n * Get the current view parameters.\n */\n getViewParams(): ViewParams {\n return this.adapter.getViewParams();\n }\n\n /**\n * Get the current tool input.\n */\n getToolInput(): Record<string, unknown> | undefined {\n return this.adapter.getToolInput();\n }\n\n /**\n * Get the current tool output.\n */\n getToolOutput(): Record<string, unknown> | undefined {\n return this.adapter.getToolOutput();\n }\n\n /**\n * Subscribe to tool input changes.\n */\n onToolInput(handler: (input: unknown) => void): () => void {\n return this.adapter.onToolInput(handler);\n }\n\n /**\n * Subscribe to tool output changes.\n */\n onToolOutput(handler: (output: unknown) => void): () => void {\n return this.adapter.onToolOutput(handler);\n }\n\n // ─────────────────────────────────────────────────────────────\n // Tool Calls\n // ─────────────────────────────────────────────────────────────\n\n /**\n * Call a tool on the server.\n */\n async callTool<T = unknown>(name: string, args: Record<string, unknown> = {}): Promise<T> {\n return this.adapter.callTool(name, args) as Promise<T>;\n }\n\n /**\n * Navigate to a view (calls view:name tool).\n */\n async navigateToView(viewName: string, params: Record<string, unknown> = {}): Promise<void> {\n await this.adapter.callTool(`view:${viewName}`, params);\n }\n\n /**\n * Dispatch an action (calls action:name tool).\n */\n async dispatch<T = unknown>(actionName: string, params: Record<string, unknown> = {}): Promise<T> {\n return this.adapter.callTool(`action:${actionName}`, params) as Promise<T>;\n }\n\n /**\n * Get data from a data fetcher (calls data:name tool).\n */\n async getData<T = unknown>(dataName: string, params: Record<string, unknown> = {}): Promise<T> {\n return this.adapter.callTool(`data:${dataName}`, params) as Promise<T>;\n }\n\n // ─────────────────────────────────────────────────────────────\n // Communication\n // ─────────────────────────────────────────────────────────────\n\n /**\n * Send a message to the model.\n */\n async say(message: string): Promise<void> {\n await this.adapter.sendMessage({ type: 'text', text: message });\n }\n\n /**\n * Open a link in the host.\n */\n async openLink(url: string): Promise<void> {\n await this.adapter.openLink(url);\n }\n\n /**\n * Request a display mode change.\n */\n async requestDisplayMode(mode: 'inline' | 'fullscreen' | 'pip'): Promise<{ mode: string }> {\n return this.adapter.requestDisplayMode(mode);\n }\n\n /**\n * Request to close the UI.\n */\n requestClose(): void {\n this.adapter.requestClose();\n }\n\n // ─────────────────────────────────────────────────────────────\n // State\n // ─────────────────────────────────────────────────────────────\n\n /**\n * Get the current view state.\n */\n getState<T>(): T | null {\n return this.adapter.getState<T>();\n }\n\n /**\n * Set the view state.\n */\n setState<T>(state: T): void {\n this.adapter.setState(state);\n }\n\n // ─────────────────────────────────────────────────────────────\n // Events\n // ─────────────────────────────────────────────────────────────\n\n /**\n * Subscribe to tool cancellation.\n */\n onToolCancelled(handler: (reason?: string) => void): () => void {\n return this.adapter.onToolCancelled(handler);\n }\n\n /**\n * Subscribe to teardown.\n */\n onTeardown(handler: (reason?: string) => void): () => void {\n return this.adapter.onTeardown(handler);\n }\n\n // ─────────────────────────────────────────────────────────────\n // Logging\n // ─────────────────────────────────────────────────────────────\n\n /**\n * Log a message.\n */\n log(level: 'debug' | 'info' | 'warn' | 'error', data: unknown): void {\n this.adapter.log(level, data);\n }\n\n // ─────────────────────────────────────────────────────────────\n // Size Notifications\n // ─────────────────────────────────────────────────────────────\n\n /**\n * Notify the host of a size change.\n */\n async sendSizeChanged(params: { width: number; height: number }): Promise<void> {\n await this.adapter.sendSizeChanged(params);\n }\n}\n","import { createContext, useContext } from 'react';\nimport type { PancakeClient } from '../client.js';\n\n/**\n * Context value for the Pancake provider\n */\nexport interface PancakeContextValue {\n client: PancakeClient | null;\n isConnecting: boolean;\n error: Error | null;\n}\n\n/**\n * React context for Pancake client\n */\nexport const PancakeContext = createContext<PancakeContextValue | null>(null);\n\n/**\n * Get the Pancake context (internal use)\n */\nexport function usePancakeContext(): PancakeContextValue {\n const ctx = useContext(PancakeContext);\n if (!ctx) {\n throw new Error('usePancakeContext must be used within a PancakeProvider');\n }\n return ctx;\n}\n\n/**\n * Get the Pancake client (throws if not connected)\n */\nexport function usePancakeClient(): PancakeClient {\n const { client, isConnecting, error } = usePancakeContext();\n\n if (error) {\n throw error;\n }\n\n if (isConnecting || !client) {\n throw new Error('Pancake client not ready. Make sure PancakeProvider has finished connecting.');\n }\n\n return client;\n}\n","import React, { useState, useEffect, type ReactNode, type ComponentType } from 'react';\nimport { PancakeClient } from '../client.js';\nimport type { Protocol, HostContext } from '../types.js';\nimport { PancakeContext, type PancakeContextValue } from './context.js';\n\n/**\n * Props for the PancakeProvider\n */\nexport interface PancakeProviderProps {\n children: ReactNode;\n /** Pre-created client (optional) */\n client?: PancakeClient;\n /** Force a specific protocol adapter */\n forceAdapter?: Protocol;\n /** Enable auto-resize (default: true) */\n autoResize?: boolean;\n /** Initial host context (for testing) */\n hostContext?: Partial<HostContext>;\n /** Loading fallback UI */\n fallback?: ReactNode;\n /** Error fallback component */\n errorFallback?: ComponentType<{ error: Error; reset: () => void }>;\n}\n\n/**\n * Provider component that initializes and provides the Pancake client.\n *\n * @example\n * ```tsx\n * import { PancakeProvider } from '@pancake-apps/web/react';\n *\n * function App() {\n * return (\n * <PancakeProvider>\n * <MyView />\n * </PancakeProvider>\n * );\n * }\n * ```\n */\nexport function PancakeProvider({\n children,\n client: providedClient,\n forceAdapter,\n autoResize = true,\n hostContext,\n fallback,\n errorFallback: ErrorFallback,\n}: PancakeProviderProps): React.ReactElement {\n const [client, setClient] = useState<PancakeClient | null>(providedClient ?? null);\n const [isConnecting, setIsConnecting] = useState(!providedClient);\n const [error, setError] = useState<Error | null>(null);\n\n useEffect(() => {\n // Use provided client if available\n if (providedClient) {\n setClient(providedClient);\n setIsConnecting(false);\n return;\n }\n\n // Create a new client\n setIsConnecting(true);\n setError(null);\n\n const options: {\n forceAdapter?: Protocol;\n autoResize?: boolean;\n hostContext?: Partial<HostContext>;\n } = { autoResize };\n if (forceAdapter !== undefined) options.forceAdapter = forceAdapter;\n if (hostContext !== undefined) options.hostContext = hostContext;\n\n PancakeClient.create(options)\n .then((newClient) => {\n setClient(newClient);\n setIsConnecting(false);\n })\n .catch((err) => {\n setError(err instanceof Error ? err : new Error(String(err)));\n setIsConnecting(false);\n });\n }, [providedClient, forceAdapter, autoResize]);\n\n // Handle error state\n if (error) {\n if (ErrorFallback) {\n return <ErrorFallback error={error} reset={() => setError(null)} />;\n }\n throw error; // Let React error boundary handle it\n }\n\n // Handle loading state\n if (isConnecting || !client) {\n if (fallback) {\n return <>{fallback}</>;\n }\n return <></>;\n }\n\n const value: PancakeContextValue = {\n client,\n isConnecting,\n error,\n };\n\n return (\n <PancakeContext.Provider value={value}>\n {children}\n </PancakeContext.Provider>\n );\n}\n","import { useState, useCallback } from 'react';\nimport { usePancakeClient } from '../context.js';\n\n/**\n * Hook for managing view state.\n *\n * State is persisted in ChatGPT, volatile in MCP.\n * Uses React-style updater function pattern.\n *\n * @example\n * ```tsx\n * function Counter() {\n * const [count, setCount] = useViewState(0);\n *\n * return (\n * <div>\n * <p>Count: {count}</p>\n * <button onClick={() => setCount(c => c + 1)}>+</button>\n * </div>\n * );\n * }\n * ```\n */\nexport function useViewState<T>(defaultValue: T): [T, (newState: T | ((prev: T) => T)) => void] {\n const client = usePancakeClient();\n\n const [state, setStateInternal] = useState<T>(() => {\n const stored = client.getState<T>();\n return stored ?? defaultValue;\n });\n\n const setState = useCallback(\n (newState: T | ((prev: T) => T)) => {\n setStateInternal((prev) => {\n const next = typeof newState === 'function'\n ? (newState as (prev: T) => T)(prev)\n : newState;\n\n // Persist to client\n client.setState(next);\n return next;\n });\n },\n [client]\n );\n\n return [state, setState];\n}\n","import { useState, useEffect } from 'react';\nimport { usePancakeContext } from '../context.js';\nimport type { HostContext } from '../../types.js';\nimport { DEFAULT_HOST_CONTEXT } from '../../types.js';\n\n/**\n * Hook for accessing the full host context.\n *\n * @example\n * ```tsx\n * function MyComponent() {\n * const host = useHost();\n *\n * return (\n * <div>\n * <p>Theme: {host.theme}</p>\n * <p>Platform: {host.platform}</p>\n * <p>Locale: {host.locale}</p>\n * </div>\n * );\n * }\n * ```\n */\nexport function useHost(): HostContext {\n const { client } = usePancakeContext();\n const [context, setContext] = useState<HostContext>(\n () => client?.getHostContext() ?? DEFAULT_HOST_CONTEXT\n );\n\n useEffect(() => {\n if (!client) return;\n\n // Get current context\n setContext(client.getHostContext());\n\n // Subscribe to changes\n return client.onHostContextChange(setContext);\n }, [client]);\n\n return context;\n}\n","import { useHost } from './useHost.js';\n\n/**\n * Hook for accessing the current theme.\n *\n * @example\n * ```tsx\n * function MyComponent() {\n * const theme = useTheme();\n *\n * return (\n * <div data-theme={theme}>\n * <p>Current theme: {theme}</p>\n * </div>\n * );\n * }\n * ```\n */\nexport function useTheme(): 'light' | 'dark' {\n const host = useHost();\n return host.theme;\n}\n","import { useCallback } from 'react';\nimport { usePancakeClient } from '../context.js';\nimport { useHost } from './useHost.js';\n\n/**\n * Return type for useDisplayMode hook\n */\nexport interface DisplayModeHook {\n /** Current display mode */\n mode: 'inline' | 'fullscreen' | 'pip';\n /** Available display modes */\n availableModes: string[];\n /** Request a display mode change */\n requestMode: (mode: 'inline' | 'fullscreen' | 'pip') => Promise<void>;\n}\n\n/**\n * Hook for managing display mode.\n *\n * @example\n * ```tsx\n * function MyComponent() {\n * const { mode, availableModes, requestMode } = useDisplayMode();\n *\n * return (\n * <div>\n * <p>Current mode: {mode}</p>\n * {availableModes.includes('fullscreen') && (\n * <button onClick={() => requestMode('fullscreen')}>\n * Go Fullscreen\n * </button>\n * )}\n * </div>\n * );\n * }\n * ```\n */\nexport function useDisplayMode(): DisplayModeHook {\n const client = usePancakeClient();\n const host = useHost();\n\n const requestMode = useCallback(\n async (mode: 'inline' | 'fullscreen' | 'pip') => {\n await client.requestDisplayMode(mode);\n },\n [client]\n );\n\n return {\n mode: host.displayMode,\n availableModes: host.availableDisplayModes,\n requestMode,\n };\n}\n","import { useCallback } from 'react';\nimport { usePancakeClient } from '../context.js';\n\n/**\n * Return type for useNavigation hook\n */\nexport interface NavigationHook {\n /** Navigate to a view (triggers view:name tool call) */\n navigate: (viewName: string, params?: Record<string, unknown>) => Promise<void>;\n /** Send a message to the model */\n say: (message: string) => Promise<void>;\n}\n\n/**\n * Hook for navigation and communication with the model.\n *\n * @example\n * ```tsx\n * function MyComponent() {\n * const { navigate, say } = useNavigation();\n *\n * return (\n * <div>\n * <button onClick={() => navigate('dashboard', { userId: '123' })}>\n * Go to Dashboard\n * </button>\n * <button onClick={() => say('Show me more details')}>\n * Ask for More\n * </button>\n * </div>\n * );\n * }\n * ```\n */\nexport function useNavigation(): NavigationHook {\n const client = usePancakeClient();\n\n const navigate = useCallback(\n async (viewName: string, params?: Record<string, unknown>) => {\n await client.navigateToView(viewName, params ?? {});\n },\n [client]\n );\n\n const say = useCallback(\n async (message: string) => {\n await client.say(message);\n },\n [client]\n );\n\n return { navigate, say };\n}\n","import { useState, useEffect } from 'react';\nimport { usePancakeContext } from '../context.js';\n\n/**\n * Hook for accessing the current action input.\n *\n * This is useful for action UIs that need to display\n * or process the input sent by the model.\n *\n * @example\n * ```tsx\n * function ActionConfirmation() {\n * const input = useActionInput<{ itemId: string; action: string }>();\n *\n * if (!input) return <div>No input</div>;\n *\n * return (\n * <div>\n * <p>Action: {input.action}</p>\n * <p>Item: {input.itemId}</p>\n * </div>\n * );\n * }\n * ```\n */\nexport function useActionInput<T = Record<string, unknown>>(): T | undefined {\n const { client } = usePancakeContext();\n const [input, setInput] = useState<T | undefined>(() => {\n return client?.getToolInput() as T | undefined;\n });\n\n useEffect(() => {\n if (!client) return;\n\n // Get current input\n setInput(client.getToolInput() as T | undefined);\n\n // Subscribe to changes\n return client.onToolInput((newInput) => {\n setInput(newInput as T);\n });\n }, [client]);\n\n return input;\n}\n","import { useState, useEffect } from 'react';\nimport { usePancakeContext } from '../context.js';\nimport type { ViewParams } from '../../types.js';\n\n/**\n * Hook for accessing view parameters (inputs + data).\n *\n * @example\n * ```tsx\n * function MyView() {\n * const { inputs, data } = useViewParams<\n * { userId: string },\n * { user: { name: string; email: string } }\n * >();\n *\n * return (\n * <div>\n * <p>User ID: {inputs.userId}</p>\n * <p>Name: {data.user.name}</p>\n * <p>Email: {data.user.email}</p>\n * </div>\n * );\n * }\n * ```\n */\nexport function useViewParams<TInputs = unknown, TData = unknown>(): ViewParams<TInputs, TData> {\n const { client } = usePancakeContext();\n const [params, setParams] = useState<ViewParams<TInputs, TData>>(() => {\n if (!client) {\n return { inputs: {} as TInputs, data: {} as TData };\n }\n const viewParams = client.getViewParams();\n return {\n inputs: viewParams.inputs as TInputs,\n data: viewParams.data as TData,\n };\n });\n\n useEffect(() => {\n if (!client) return;\n\n // Get current params\n const viewParams = client.getViewParams();\n setParams({\n inputs: viewParams.inputs as TInputs,\n data: viewParams.data as TData,\n });\n\n // Subscribe to input changes\n const unsubInput = client.onToolInput(() => {\n const updated = client.getViewParams();\n setParams({\n inputs: updated.inputs as TInputs,\n data: updated.data as TData,\n });\n });\n\n // Subscribe to output changes\n const unsubOutput = client.onToolOutput(() => {\n const updated = client.getViewParams();\n setParams({\n inputs: updated.inputs as TInputs,\n data: updated.data as TData,\n });\n });\n\n return () => {\n unsubInput();\n unsubOutput();\n };\n }, [client]);\n\n return params;\n}\n","import { useCallback } from 'react';\nimport { usePancakeClient } from '../context.js';\n\n/**\n * Return type for useAction hook\n */\nexport interface ActionHook {\n /** Dispatch an action (calls action:name tool) */\n dispatch: <T = unknown>(actionName: string, params?: Record<string, unknown>) => Promise<T>;\n}\n\n/**\n * Hook for dispatching actions (write operations).\n *\n * @example\n * ```tsx\n * function MyComponent() {\n * const { dispatch } = useAction();\n *\n * const handleSubmit = async () => {\n * const result = await dispatch<{ success: boolean }>('createUser', {\n * name: 'John',\n * email: 'john@example.com',\n * });\n * console.log('Created:', result.success);\n * };\n *\n * return <button onClick={handleSubmit}>Create User</button>;\n * }\n * ```\n */\nexport function useAction(): ActionHook {\n const client = usePancakeClient();\n\n const dispatch = useCallback(\n async <T = unknown>(actionName: string, params?: Record<string, unknown>): Promise<T> => {\n return client.dispatch<T>(actionName, params ?? {});\n },\n [client]\n );\n\n return { dispatch };\n}\n","import { useCallback } from 'react';\nimport { usePancakeClient } from '../context.js';\n\n/**\n * Return type for useData hook\n */\nexport interface DataHook {\n /** Fetch data from a data endpoint (calls data:name tool) */\n getData: <T = unknown>(dataName: string, params?: Record<string, unknown>) => Promise<T>;\n}\n\n/**\n * Hook for fetching data (read operations).\n *\n * @example\n * ```tsx\n * function UserList() {\n * const { getData } = useData();\n * const [users, setUsers] = useState<User[]>([]);\n *\n * const loadUsers = async () => {\n * const data = await getData<User[]>('listUsers', { limit: 10 });\n * setUsers(data);\n * };\n *\n * return (\n * <div>\n * <button onClick={loadUsers}>Load Users</button>\n * <ul>\n * {users.map(u => <li key={u.id}>{u.name}</li>)}\n * </ul>\n * </div>\n * );\n * }\n * ```\n */\nexport function useData(): DataHook {\n const client = usePancakeClient();\n\n const getData = useCallback(\n async <T = unknown>(dataName: string, params?: Record<string, unknown>): Promise<T> => {\n return client.getData<T>(dataName, params ?? {});\n },\n [client]\n );\n\n return { getData };\n}\n"]}
package/package.json ADDED
@@ -0,0 +1,83 @@
1
+ {
2
+ "name": "@pancake-apps/web",
3
+ "version": "0.0.1",
4
+ "description": "Pancake SDK client library for AI tool UIs",
5
+ "type": "module",
6
+ "main": "./dist/index.cjs",
7
+ "module": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "import": "./dist/index.js",
12
+ "require": "./dist/index.cjs",
13
+ "types": "./dist/index.d.ts"
14
+ },
15
+ "./react": {
16
+ "import": "./dist/react/index.js",
17
+ "require": "./dist/react/index.cjs",
18
+ "types": "./dist/react/index.d.ts"
19
+ }
20
+ },
21
+ "files": [
22
+ "dist"
23
+ ],
24
+ "dependencies": {
25
+ "@modelcontextprotocol/ext-apps": "^0.1.0"
26
+ },
27
+ "devDependencies": {
28
+ "@testing-library/react": "^16.0.0",
29
+ "@types/react": "^19.0.0",
30
+ "@types/react-dom": "^19.0.0",
31
+ "jsdom": "^25.0.0",
32
+ "react": "^19.0.0",
33
+ "react-dom": "^19.0.0",
34
+ "tsup": "^8.0.0",
35
+ "typescript": "^5.9.0",
36
+ "vitest": "^4.0.0"
37
+ },
38
+ "peerDependencies": {
39
+ "react": "^18.0.0 || ^19.0.0",
40
+ "react-dom": "^18.0.0 || ^19.0.0"
41
+ },
42
+ "peerDependenciesMeta": {
43
+ "react": {
44
+ "optional": true
45
+ },
46
+ "react-dom": {
47
+ "optional": true
48
+ }
49
+ },
50
+ "engines": {
51
+ "node": ">=18.0.0"
52
+ },
53
+ "keywords": [
54
+ "mcp",
55
+ "ai",
56
+ "tools",
57
+ "openai",
58
+ "chatgpt",
59
+ "claude",
60
+ "react"
61
+ ],
62
+ "license": "MIT",
63
+ "homepage": "https://github.com/pancakeapps/pancake/tree/main/packages/web",
64
+ "repository": {
65
+ "type": "git",
66
+ "url": "git+https://github.com/pancakeapps/pancake.git",
67
+ "directory": "packages/web"
68
+ },
69
+ "bugs": {
70
+ "url": "https://github.com/pancakeapps/pancake/issues"
71
+ },
72
+ "publishConfig": {
73
+ "access": "public"
74
+ },
75
+ "scripts": {
76
+ "build": "tsup",
77
+ "dev": "tsup --watch",
78
+ "test": "vitest run",
79
+ "test:watch": "vitest",
80
+ "typecheck": "tsc --noEmit",
81
+ "clean": "rm -rf dist"
82
+ }
83
+ }