@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/global.ts"],"names":[],"mappings":"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","file":"index.cjs","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 { PancakeClient } from './client.js';\nimport type { PancakeGlobal, HostContext, ViewParams } from './types.js';\n\n/**\n * Singleton client instance\n */\nlet clientInstance: PancakeClient | null = null;\nlet initPromise: Promise<PancakeClient> | null = null;\n\n/**\n * Get or create the global Pancake client.\n */\nexport async function getClient(): Promise<PancakeClient> {\n if (clientInstance) {\n return clientInstance;\n }\n\n if (!initPromise) {\n initPromise = PancakeClient.create().then((client) => {\n clientInstance = client;\n return client;\n });\n }\n\n return initPromise;\n}\n\n/**\n * Initialize the global window.pancake API.\n */\nexport async function initializePancake(): Promise<PancakeGlobal> {\n const client = await getClient();\n const api = createGlobalAPI(client);\n\n // Attach to window\n if (typeof window !== 'undefined') {\n (window as unknown as { pancake: PancakeGlobal }).pancake = api;\n }\n\n return api;\n}\n\n/**\n * Create the global API object.\n */\nfunction createGlobalAPI(client: PancakeClient): PancakeGlobal {\n // Cache for reactive properties\n let cachedContext: HostContext = client.getHostContext();\n let cachedViewParams: ViewParams = client.getViewParams();\n let cachedState: unknown = client.getState();\n\n // Subscribe to updates\n client.onHostContextChange((ctx) => {\n cachedContext = ctx;\n });\n\n client.onToolInput(() => {\n cachedViewParams = client.getViewParams();\n });\n\n client.onToolOutput(() => {\n cachedViewParams = client.getViewParams();\n });\n\n return {\n get hostContext(): HostContext {\n return cachedContext;\n },\n\n get viewParams(): ViewParams {\n return cachedViewParams;\n },\n\n get viewState(): unknown {\n return cachedState;\n },\n\n async navigateToView(viewName: string, viewParams?: Record<string, unknown>): Promise<void> {\n await client.navigateToView(viewName, viewParams ?? {});\n },\n\n async say(message: string): Promise<void> {\n await client.say(message);\n },\n\n setViewState(state: unknown): void {\n cachedState = state;\n client.setState(state);\n },\n\n async dispatch<T>(actionName: string, actionParams?: Record<string, unknown>): Promise<T> {\n return client.dispatch<T>(actionName, actionParams ?? {});\n },\n\n async getData<T>(dataName: string, dataParams?: Record<string, unknown>): Promise<T> {\n return client.getData<T>(dataName, dataParams ?? {});\n },\n };\n}\n\n/**\n * Get the current global API (for synchronous access after initialization).\n */\nexport function getPancake(): PancakeGlobal | undefined {\n if (typeof window !== 'undefined' && 'pancake' in window) {\n return (window as unknown as { pancake: PancakeGlobal }).pancake;\n }\n return undefined;\n}\n\n/**\n * Auto-initialize when the module is imported in a browser context.\n */\nif (typeof window !== 'undefined') {\n // Use microtask to allow for manual initialization first\n queueMicrotask(() => {\n // Only auto-init if not already initialized\n if (!('pancake' in window)) {\n initializePancake().catch((err) => {\n console.warn('[Pancake] Auto-initialization failed:', err);\n });\n }\n });\n}\n"]}
@@ -0,0 +1,479 @@
1
+ /**
2
+ * Host context provided by MCP or OpenAI hosts
3
+ */
4
+ interface HostContext {
5
+ /** Current theme */
6
+ theme: 'light' | 'dark';
7
+ /** Current display mode */
8
+ displayMode: 'inline' | 'fullscreen' | 'pip';
9
+ /** Available display modes */
10
+ availableDisplayModes: string[];
11
+ /** Viewport dimensions */
12
+ viewport: {
13
+ width: number;
14
+ height: number;
15
+ };
16
+ /** User's locale (e.g., 'en-US') */
17
+ locale: string;
18
+ /** User's timezone */
19
+ timeZone: string;
20
+ /** Platform type */
21
+ platform: 'desktop' | 'mobile' | 'web';
22
+ /** Current view identifier (if applicable) */
23
+ view?: string;
24
+ /** Safe area insets for mobile */
25
+ safeAreaInsets?: {
26
+ top: number;
27
+ right: number;
28
+ bottom: number;
29
+ left: number;
30
+ };
31
+ }
32
+ /**
33
+ * View parameters passed to the UI
34
+ */
35
+ interface ViewParams<TInputs = unknown, TData = unknown> {
36
+ /** Input parameters passed to the view */
37
+ inputs: TInputs;
38
+ /** Data returned by the view handler */
39
+ data: TData;
40
+ }
41
+ /**
42
+ * Global Pancake API available on window.pancake
43
+ */
44
+ interface PancakeGlobal {
45
+ /** Host context (theme, display mode, etc.) */
46
+ readonly hostContext: HostContext;
47
+ /** Current view parameters */
48
+ readonly viewParams: ViewParams;
49
+ /** Current view state */
50
+ readonly viewState: unknown;
51
+ /**
52
+ * Navigate to a different view.
53
+ * This triggers a tool call on the model side.
54
+ */
55
+ navigateToView(viewName: string, viewParams?: Record<string, unknown>): Promise<void>;
56
+ /**
57
+ * Send a message to the model.
58
+ */
59
+ say(message: string): Promise<void>;
60
+ /**
61
+ * Set the view state.
62
+ * State is persisted in ChatGPT, volatile in MCP.
63
+ */
64
+ setViewState(state: unknown): void;
65
+ /**
66
+ * Dispatch an action (write operation).
67
+ * This calls the action tool on the server.
68
+ */
69
+ dispatch<T = unknown>(actionName: string, actionParams?: Record<string, unknown>): Promise<T>;
70
+ /**
71
+ * Get data from a data fetcher (read operation).
72
+ * This calls the data tool on the server.
73
+ */
74
+ getData<T = unknown>(dataName: string, dataParams?: Record<string, unknown>): Promise<T>;
75
+ }
76
+ /**
77
+ * Protocol types
78
+ */
79
+ type Protocol = 'mcp' | 'openai' | 'mock';
80
+ /**
81
+ * Default host context
82
+ */
83
+ declare const DEFAULT_HOST_CONTEXT: HostContext;
84
+
85
+ /**
86
+ * Protocol adapter interface.
87
+ * Abstracts communication with the host (MCP or OpenAI).
88
+ */
89
+ interface ProtocolAdapter {
90
+ /** Protocol name */
91
+ readonly protocol: 'mcp' | 'openai' | 'mock';
92
+ /** Whether the adapter is connected */
93
+ isConnected(): boolean;
94
+ /** Connect to the host */
95
+ connect(): Promise<void>;
96
+ /** Disconnect from the host */
97
+ disconnect(): Promise<void>;
98
+ /** Get the current host context */
99
+ getHostContext(): HostContext;
100
+ /** Subscribe to host context changes */
101
+ onHostContextChange(handler: (ctx: HostContext) => void): () => void;
102
+ /** Get the current view parameters (inputs + data) */
103
+ getViewParams(): ViewParams;
104
+ /** Get the current tool input (what the model sent) */
105
+ getToolInput(): Record<string, unknown> | undefined;
106
+ /** Get the current tool output (what the handler returned) */
107
+ getToolOutput(): Record<string, unknown> | undefined;
108
+ /** Subscribe to tool input changes */
109
+ onToolInput(handler: (input: unknown) => void): () => void;
110
+ /** Subscribe to tool output changes */
111
+ onToolOutput(handler: (output: unknown) => void): () => void;
112
+ /** Call a tool on the server */
113
+ callTool(name: string, args: Record<string, unknown>): Promise<unknown>;
114
+ /** Send a message to the model */
115
+ sendMessage(content: {
116
+ type: string;
117
+ text: string;
118
+ }): Promise<void>;
119
+ /** Open a link in the host */
120
+ openLink(url: string): Promise<void>;
121
+ /** Request a display mode change */
122
+ requestDisplayMode(mode: 'inline' | 'fullscreen' | 'pip'): Promise<{
123
+ mode: string;
124
+ }>;
125
+ /** Request to close the UI */
126
+ requestClose(): void;
127
+ /** Get the current view state */
128
+ getState<T>(): T | null;
129
+ /** Set the view state */
130
+ setState<T>(state: T): void;
131
+ /** Subscribe to tool cancellation */
132
+ onToolCancelled(handler: (reason?: string) => void): () => void;
133
+ /** Subscribe to teardown */
134
+ onTeardown(handler: (reason?: string) => void): () => void;
135
+ /** Log a message */
136
+ log(level: 'debug' | 'info' | 'warn' | 'error', data: unknown): void;
137
+ /** Notify the host of a size change */
138
+ sendSizeChanged(params: {
139
+ width: number;
140
+ height: number;
141
+ }): Promise<void>;
142
+ }
143
+
144
+ /**
145
+ * Options for creating a Pancake client
146
+ */
147
+ interface PancakeClientOptions {
148
+ /** Force a specific protocol adapter */
149
+ forceAdapter?: Protocol;
150
+ /** Enable auto-resize (default: true) */
151
+ autoResize?: boolean;
152
+ /** Initial tool input (for mock adapter) */
153
+ toolInput?: Record<string, unknown>;
154
+ /** Initial tool output (for mock adapter) */
155
+ toolOutput?: Record<string, unknown>;
156
+ /** Initial host context (for mock adapter) */
157
+ hostContext?: Partial<HostContext>;
158
+ }
159
+ /**
160
+ * Pancake client that wraps a protocol adapter.
161
+ */
162
+ declare class PancakeClient {
163
+ private adapter;
164
+ private constructor();
165
+ /**
166
+ * Create and connect a Pancake client.
167
+ */
168
+ static create(options?: PancakeClientOptions): Promise<PancakeClient>;
169
+ /**
170
+ * Create a Pancake client with a pre-configured adapter.
171
+ */
172
+ static fromAdapter(adapter: ProtocolAdapter): PancakeClient;
173
+ /**
174
+ * Get the underlying protocol adapter.
175
+ */
176
+ getAdapter(): ProtocolAdapter;
177
+ /**
178
+ * Get the current protocol.
179
+ */
180
+ get protocol(): Protocol;
181
+ /**
182
+ * Check if the client is connected.
183
+ */
184
+ isConnected(): boolean;
185
+ /**
186
+ * Get the current host context.
187
+ */
188
+ getHostContext(): HostContext;
189
+ /**
190
+ * Subscribe to host context changes.
191
+ */
192
+ onHostContextChange(handler: (ctx: HostContext) => void): () => void;
193
+ /**
194
+ * Get the current view parameters.
195
+ */
196
+ getViewParams(): ViewParams;
197
+ /**
198
+ * Get the current tool input.
199
+ */
200
+ getToolInput(): Record<string, unknown> | undefined;
201
+ /**
202
+ * Get the current tool output.
203
+ */
204
+ getToolOutput(): Record<string, unknown> | undefined;
205
+ /**
206
+ * Subscribe to tool input changes.
207
+ */
208
+ onToolInput(handler: (input: unknown) => void): () => void;
209
+ /**
210
+ * Subscribe to tool output changes.
211
+ */
212
+ onToolOutput(handler: (output: unknown) => void): () => void;
213
+ /**
214
+ * Call a tool on the server.
215
+ */
216
+ callTool<T = unknown>(name: string, args?: Record<string, unknown>): Promise<T>;
217
+ /**
218
+ * Navigate to a view (calls view:name tool).
219
+ */
220
+ navigateToView(viewName: string, params?: Record<string, unknown>): Promise<void>;
221
+ /**
222
+ * Dispatch an action (calls action:name tool).
223
+ */
224
+ dispatch<T = unknown>(actionName: string, params?: Record<string, unknown>): Promise<T>;
225
+ /**
226
+ * Get data from a data fetcher (calls data:name tool).
227
+ */
228
+ getData<T = unknown>(dataName: string, params?: Record<string, unknown>): Promise<T>;
229
+ /**
230
+ * Send a message to the model.
231
+ */
232
+ say(message: string): Promise<void>;
233
+ /**
234
+ * Open a link in the host.
235
+ */
236
+ openLink(url: string): Promise<void>;
237
+ /**
238
+ * Request a display mode change.
239
+ */
240
+ requestDisplayMode(mode: 'inline' | 'fullscreen' | 'pip'): Promise<{
241
+ mode: string;
242
+ }>;
243
+ /**
244
+ * Request to close the UI.
245
+ */
246
+ requestClose(): void;
247
+ /**
248
+ * Get the current view state.
249
+ */
250
+ getState<T>(): T | null;
251
+ /**
252
+ * Set the view state.
253
+ */
254
+ setState<T>(state: T): void;
255
+ /**
256
+ * Subscribe to tool cancellation.
257
+ */
258
+ onToolCancelled(handler: (reason?: string) => void): () => void;
259
+ /**
260
+ * Subscribe to teardown.
261
+ */
262
+ onTeardown(handler: (reason?: string) => void): () => void;
263
+ /**
264
+ * Log a message.
265
+ */
266
+ log(level: 'debug' | 'info' | 'warn' | 'error', data: unknown): void;
267
+ /**
268
+ * Notify the host of a size change.
269
+ */
270
+ sendSizeChanged(params: {
271
+ width: number;
272
+ height: number;
273
+ }): Promise<void>;
274
+ }
275
+
276
+ /**
277
+ * Get or create the global Pancake client.
278
+ */
279
+ declare function getClient(): Promise<PancakeClient>;
280
+ /**
281
+ * Initialize the global window.pancake API.
282
+ */
283
+ declare function initializePancake(): Promise<PancakeGlobal>;
284
+ /**
285
+ * Get the current global API (for synchronous access after initialization).
286
+ */
287
+ declare function getPancake(): PancakeGlobal | undefined;
288
+
289
+ /**
290
+ * Detect which protocol/host environment the UI is running in.
291
+ */
292
+ declare function detectProtocol(): Protocol;
293
+
294
+ /**
295
+ * MCP protocol adapter.
296
+ * Uses @modelcontextprotocol/ext-apps for communication with MCP hosts.
297
+ */
298
+ declare class McpAdapter implements ProtocolAdapter {
299
+ private options?;
300
+ readonly protocol: "mcp";
301
+ private app;
302
+ private connected;
303
+ private context;
304
+ private currentToolInput;
305
+ private currentToolOutput;
306
+ private state;
307
+ private hostContextHandlers;
308
+ private toolInputHandlers;
309
+ private toolOutputHandlers;
310
+ private toolCancelledHandlers;
311
+ private teardownHandlers;
312
+ constructor(options?: {
313
+ autoResize?: boolean;
314
+ } | undefined);
315
+ isConnected(): boolean;
316
+ connect(): Promise<void>;
317
+ disconnect(): Promise<void>;
318
+ private mapHostContext;
319
+ getHostContext(): HostContext;
320
+ onHostContextChange(handler: (ctx: HostContext) => void): () => void;
321
+ getViewParams(): ViewParams;
322
+ getToolInput(): Record<string, unknown> | undefined;
323
+ getToolOutput(): Record<string, unknown> | undefined;
324
+ onToolInput(handler: (input: unknown) => void): () => void;
325
+ onToolOutput(handler: (output: unknown) => void): () => void;
326
+ callTool(name: string, args: Record<string, unknown>): Promise<unknown>;
327
+ sendMessage(content: {
328
+ type: string;
329
+ text: string;
330
+ }): Promise<void>;
331
+ openLink(url: string): Promise<void>;
332
+ requestDisplayMode(mode: 'inline' | 'fullscreen' | 'pip'): Promise<{
333
+ mode: string;
334
+ }>;
335
+ requestClose(): void;
336
+ getState<T>(): T | null;
337
+ setState<T>(state: T): void;
338
+ onToolCancelled(handler: (reason?: string) => void): () => void;
339
+ onTeardown(handler: (reason?: string) => void): () => void;
340
+ log(level: 'debug' | 'info' | 'warn' | 'error', data: unknown): void;
341
+ sendSizeChanged(params: {
342
+ width: number;
343
+ height: number;
344
+ }): Promise<void>;
345
+ }
346
+
347
+ /**
348
+ * OpenAI/ChatGPT protocol adapter.
349
+ * Uses window.openai SDK injected by the ChatGPT sandbox.
350
+ */
351
+ declare class OpenAIAdapter implements ProtocolAdapter {
352
+ readonly protocol: "openai";
353
+ private connected;
354
+ private context;
355
+ private currentToolInput;
356
+ private currentToolOutput;
357
+ private state;
358
+ private hostContextHandlers;
359
+ private toolInputHandlers;
360
+ private toolOutputHandlers;
361
+ private toolCancelledHandlers;
362
+ private teardownHandlers;
363
+ private globalsHandler;
364
+ private setGlobalsHandler;
365
+ isConnected(): boolean;
366
+ private getOpenAI;
367
+ connect(): Promise<void>;
368
+ disconnect(): Promise<void>;
369
+ private waitForOpenAI;
370
+ private isSetGlobalsMessage;
371
+ private setupGlobalsListener;
372
+ private updateContextFromGlobals;
373
+ private readContextFromSDK;
374
+ private readToolDataFromSDK;
375
+ getHostContext(): HostContext;
376
+ onHostContextChange(handler: (ctx: HostContext) => void): () => void;
377
+ getViewParams(): ViewParams;
378
+ getToolInput(): Record<string, unknown> | undefined;
379
+ getToolOutput(): Record<string, unknown> | undefined;
380
+ onToolInput(handler: (input: unknown) => void): () => void;
381
+ onToolOutput(handler: (output: unknown) => void): () => void;
382
+ callTool(name: string, args: Record<string, unknown>): Promise<unknown>;
383
+ sendMessage(content: {
384
+ type: string;
385
+ text: string;
386
+ }): Promise<void>;
387
+ openLink(url: string): Promise<void>;
388
+ requestDisplayMode(mode: 'inline' | 'fullscreen' | 'pip'): Promise<{
389
+ mode: string;
390
+ }>;
391
+ requestClose(): void;
392
+ getState<T>(): T | null;
393
+ setState<T>(state: T): void;
394
+ onToolCancelled(handler: (reason?: string) => void): () => void;
395
+ onTeardown(handler: (reason?: string) => void): () => void;
396
+ log(level: 'debug' | 'info' | 'warn' | 'error', data: unknown): void;
397
+ sendSizeChanged(params: {
398
+ width: number;
399
+ height: number;
400
+ }): Promise<void>;
401
+ }
402
+
403
+ /**
404
+ * Mock protocol adapter for testing and development.
405
+ */
406
+ declare class MockAdapter implements ProtocolAdapter {
407
+ readonly protocol: "mock";
408
+ private connected;
409
+ private context;
410
+ private toolInput;
411
+ private toolOutput;
412
+ private state;
413
+ private hostContextHandlers;
414
+ private toolInputHandlers;
415
+ private toolOutputHandlers;
416
+ private toolCancelledHandlers;
417
+ private teardownHandlers;
418
+ private toolHandlers;
419
+ constructor(options?: {
420
+ hostContext?: Partial<HostContext>;
421
+ toolInput?: Record<string, unknown>;
422
+ toolOutput?: Record<string, unknown>;
423
+ });
424
+ isConnected(): boolean;
425
+ connect(): Promise<void>;
426
+ disconnect(): Promise<void>;
427
+ /**
428
+ * Set the host context (for testing)
429
+ */
430
+ setHostContext(ctx: Partial<HostContext>): void;
431
+ /**
432
+ * Set the tool input (for testing)
433
+ */
434
+ setToolInput(input: Record<string, unknown>): void;
435
+ /**
436
+ * Set the tool output (for testing)
437
+ */
438
+ setToolOutput(output: Record<string, unknown>): void;
439
+ /**
440
+ * Register a tool handler (for testing)
441
+ */
442
+ registerToolHandler(name: string, handler: (args: Record<string, unknown>) => Promise<unknown>): void;
443
+ /**
444
+ * Trigger tool cancellation (for testing)
445
+ */
446
+ triggerToolCancelled(reason?: string): void;
447
+ /**
448
+ * Trigger teardown (for testing)
449
+ */
450
+ triggerTeardown(reason?: string): void;
451
+ getHostContext(): HostContext;
452
+ onHostContextChange(handler: (ctx: HostContext) => void): () => void;
453
+ getViewParams(): ViewParams;
454
+ getToolInput(): Record<string, unknown> | undefined;
455
+ getToolOutput(): Record<string, unknown> | undefined;
456
+ onToolInput(handler: (input: unknown) => void): () => void;
457
+ onToolOutput(handler: (output: unknown) => void): () => void;
458
+ callTool(name: string, args: Record<string, unknown>): Promise<unknown>;
459
+ sendMessage(content: {
460
+ type: string;
461
+ text: string;
462
+ }): Promise<void>;
463
+ openLink(url: string): Promise<void>;
464
+ requestDisplayMode(mode: 'inline' | 'fullscreen' | 'pip'): Promise<{
465
+ mode: string;
466
+ }>;
467
+ requestClose(): void;
468
+ getState<T>(): T | null;
469
+ setState<T>(state: T): void;
470
+ onToolCancelled(handler: (reason?: string) => void): () => void;
471
+ onTeardown(handler: (reason?: string) => void): () => void;
472
+ log(level: 'debug' | 'info' | 'warn' | 'error', data: unknown): void;
473
+ sendSizeChanged(params: {
474
+ width: number;
475
+ height: number;
476
+ }): Promise<void>;
477
+ }
478
+
479
+ export { DEFAULT_HOST_CONTEXT, type HostContext, McpAdapter, MockAdapter, OpenAIAdapter, PancakeClient, type PancakeClientOptions, type PancakeGlobal, type Protocol, type ProtocolAdapter, type ViewParams, detectProtocol, getClient, getPancake, initializePancake };