You're Invited:Meet the Socket Team at RSAC and BSidesSF 2026, March 23–26.RSVP
Socket
Book a DemoSign in
Socket

@mcp-apps-kit/ui

Package Overview
Dependencies
Maintainers
1
Versions
15
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@mcp-apps-kit/ui - npm Package Compare versions

Comparing version
0.2.8
to
0.3.0
+1
-1
dist/index.cjs

@@ -1,2 +0,2 @@

'use strict';var extApps=require('@modelcontextprotocol/ext-apps');var L="2025-11-05",D="text/html;profile=mcp-app",F="ui/resourceUri";function x(n){if(typeof document>"u")return;let e=n==="os"?typeof window<"u"&&window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light":n;document.documentElement.classList.remove("light","dark"),document.documentElement.classList.add(e),document.documentElement.setAttribute("data-theme",e);}function H(){if(typeof document>"u")return "light";let n=document.documentElement.getAttribute("data-theme");return n==="dark"||n==="light"?n:document.documentElement.classList.contains("dark")?"dark":"light"}var w="mcp-apps-host-fonts";function b(n){if(typeof document>"u")return;let e=document.documentElement;for(let[t,s]of Object.entries(n)){let o=t.startsWith("--")?t:`--${t}`;e.style.setProperty(o,s);}}function k(n){if(typeof document>"u")return;let e=document.getElementById(w);e||(e=document.createElement("style"),e.id=w,document.head.appendChild(e)),e.textContent=n;}function I(){if(typeof document>"u")return;let n=document.getElementById(w);n&&n.remove();}function A(n){if(typeof document>"u")return;let e=document.documentElement;for(let t of Object.keys(n)){let s=t.startsWith("--")?t:`--${t}`;e.style.removeProperty(s);}}var u={CONNECTION_FAILED:"CONNECTION_FAILED",CONNECTION_TIMEOUT:"CONNECTION_TIMEOUT",NOT_CONNECTED:"NOT_CONNECTED",PROTOCOL_ERROR:"PROTOCOL_ERROR",UNSUPPORTED_OPERATION:"UNSUPPORTED_OPERATION",TOOL_CALL_FAILED:"TOOL_CALL_FAILED",TOOL_NOT_FOUND:"TOOL_NOT_FOUND",STATE_ERROR:"STATE_ERROR",UNKNOWN_ERROR:"UNKNOWN_ERROR"},d=class extends Error{constructor(t,s,o,r){super(s);this.code=t;this.details=o;this.cause=r;this.name="UIError";}formatMessage(){let t=`[${this.code}] ${this.message}`;return this.details&&(t+=` ${JSON.stringify(this.details)}`),t}};var O={debug:0,info:1,warn:2,error:3};function S(n,e){return O[n]>=O[e]}function R(){let n=new WeakSet;return (e,t)=>{if(typeof t=="object"&&t!==null){if(n.has(t))return "[Circular]";n.add(t);}return t}}function M(n){if(n==null||typeof n=="string"||typeof n=="number"||typeof n=="boolean")return n;if(n instanceof Error)return {name:n.name,message:n.message,stack:n.stack};try{return JSON.stringify(n),n}catch{try{let e=JSON.stringify(n,R());return JSON.parse(e)}catch{return "[Unserializable]"}}}function P(n){if(n===void 0)return "undefined";if(n===null)return "null";if(typeof n=="string")return n;if(n instanceof Error)return `${n.name}: ${n.message}`;try{return JSON.stringify(n,R())}catch{return "[Unstringifiable]"}}var m=class{constructor(e={}){this.adapter=null;this.buffer=[];this.flushTimer=null;this.isFlushing=false;this.mcpTransportFailed=false;this.config={enabled:e.enabled??false,level:e.level??"info",batchSize:e.batchSize??10,maxBufferSize:e.maxBufferSize??100,flushIntervalMs:e.flushIntervalMs??5e3,source:e.source??"mcp-apps-ui"};}setAdapter(e){this.adapter=e,this.mcpTransportFailed=false;}configure(e){e.enabled!==void 0&&(this.config.enabled=e.enabled),e.level!==void 0&&(this.config.level=e.level),e.batchSize!==void 0&&(this.config.batchSize=e.batchSize),e.maxBufferSize!==void 0&&(this.config.maxBufferSize=e.maxBufferSize),e.flushIntervalMs!==void 0&&(this.config.flushIntervalMs=e.flushIntervalMs,this.flushTimer&&(clearTimeout(this.flushTimer),this.flushTimer=null),this.scheduleFlush()),e.source!==void 0&&(this.config.source=e.source);}canUseMcpTransport(){return this.config.enabled&&!this.mcpTransportFailed&&this.adapter?.isConnected()===true}createEntry(e,t,s){return {level:e,message:t,data:s!==void 0?M(s):void 0,timestamp:new Date().toISOString(),source:this.config.source}}scheduleFlush(){this.flushTimer||this.buffer.length===0||(this.flushTimer=setTimeout(()=>{this.flushTimer=null,this.flush();},this.config.flushIntervalMs));}async flush(){if(this.isFlushing||this.buffer.length===0)return;if(this.flushTimer&&(clearTimeout(this.flushTimer),this.flushTimer=null),!this.canUseMcpTransport()){for(let t of this.buffer)this.outputToConsole(t);this.buffer=[];return}this.isFlushing=true;let e=[...this.buffer];this.buffer=[];try{this.adapter&&await this.adapter.callTool("log_debug",{entries:e});}catch{this.mcpTransportFailed||(this.mcpTransportFailed=true,console.info("[ClientDebugLogger] MCP log transport unavailable, using console fallback"));for(let t of e)this.outputToConsole(t);}finally{this.isFlushing=false,this.buffer.length>0&&this.scheduleFlush();}}outputToConsole(e){let t=`[${e.timestamp}] [${e.level.toUpperCase()}]`,s=e.data!==void 0?`${e.message} ${P(e.data)}`:e.message,o=`${t} ${s}`;try{switch(e.level){case "debug":console.debug(o);break;case "info":console.info(o);break;case "warn":console.warn(o);break;case "error":console.error(o);break}}catch{}}addToBuffer(e){if(this.buffer.length>=this.config.maxBufferSize){let t=this.buffer.shift();t&&this.outputToConsole(t);}if(this.buffer.push(e),e.level==="error"){this.flush();return}if(this.buffer.length>=this.config.batchSize){this.flush();return}this.scheduleFlush();}log(e,t,s){if(!S(e,this.config.level))return;let o=this.createEntry(e,t,s);if(!this.canUseMcpTransport()){this.outputToConsole(o);return}this.addToBuffer(o);}debug(e,t){this.log("debug",e,t);}info(e,t){this.log("info",e,t);}warn(e,t){this.log("warn",e,t);}error(e,t){this.log("error",e,t);}destroy(){if(this.buffer.length>0){for(let e of this.buffer)this.outputToConsole(e);this.buffer=[];}this.flushTimer&&(clearTimeout(this.flushTimer),this.flushTimer=null),this.adapter=null;}},y=new m;var g=class{constructor(){this.connected=false;this.state=null;this.toolResultHandlers=new Set;this.toolInputHandlers=new Set;this.toolInputPartialHandlers=new Set;this.toolCancelledHandlers=new Set;this.hostContextHandlers=new Set;this.teardownHandlers=new Set;this.mockHostCapabilities={logging:{},openLinks:{},theming:{themes:["light","dark","os"]},displayModes:{modes:["inline","fullscreen","pip","panel"]},statePersistence:{persistent:true},serverTools:{listChanged:false},serverResources:{listChanged:false},sizeNotifications:{},partialToolInput:{},appTools:{listChanged:false},fileUpload:{},safeAreaInsets:{},views:{}};this.mockHostVersion={name:"MockHost",version:"1.0.0"};this.context=this.createDefaultContext();}createDefaultContext(){let e=typeof window<"u";return {theme:"light",displayMode:"inline",availableDisplayModes:["inline","fullscreen","pip"],viewport:{width:e?window.innerWidth:800,height:e?window.innerHeight:600},locale:e?navigator.language:"en-US",timeZone:Intl.DateTimeFormat().resolvedOptions().timeZone,platform:"web",deviceCapabilities:{touch:e?"ontouchstart"in window:false,hover:true}}}async connect(){this.connected=true,console.log("[MockAdapter] Connected");}isConnected(){return this.connected}async callTool(e,t){console.log(`[MockAdapter] callTool("${e}",`,t,")");let s={_mock:true,tool:e,args:t,timestamp:Date.now()};return this.currentToolOutput=s,s}async sendMessage(e){console.log("[MockAdapter] sendMessage:",e);}async openLink(e){console.log(`[MockAdapter] openLink("${e}")`);}async requestDisplayMode(e){return console.log(`[MockAdapter] requestDisplayMode("${e}")`),this.context={...this.context,displayMode:e},this.notifyHostContextChange(),{mode:e}}requestClose(){console.log("[MockAdapter] requestClose()");}getState(){return this.state}setState(e){this.state=e,console.log("[MockAdapter] setState:",e);}async readResource(e){return console.log(`[MockAdapter] readResource("${e}")`),{contents:[]}}log(e,t){({debug:console.debug,info:console.info,warning:console.warn,error:console.error}[e]??console.log)("[MockAdapter]",t);}onToolResult(e){return this.toolResultHandlers.add(e),()=>this.toolResultHandlers.delete(e)}onToolInput(e){return this.toolInputHandlers.add(e),()=>this.toolInputHandlers.delete(e)}onToolCancelled(e){return this.toolCancelledHandlers.add(e),()=>this.toolCancelledHandlers.delete(e)}onHostContextChange(e){return this.hostContextHandlers.add(e),()=>this.hostContextHandlers.delete(e)}onTeardown(e){return this.teardownHandlers.add(e),()=>this.teardownHandlers.delete(e)}getHostContext(){return this.context}getToolInput(){return this.currentToolInput}getToolOutput(){return this.currentToolOutput}getToolMeta(){return this.currentToolMeta}emitToolResult(e){this.currentToolOutput=e;for(let t of this.toolResultHandlers)t(e);}emitToolInput(e){this.currentToolInput=e;for(let t of this.toolInputHandlers)t(e);}setHostContext(e){this.context={...this.context,...e},this.notifyHostContextChange();}emitContextChange(e){this.context=e,this.notifyHostContextChange();}setToolInput(e){this.currentToolInput=e;}emitToolCancelled(e){for(let t of this.toolCancelledHandlers)t(e);}emitTeardown(e){for(let t of this.teardownHandlers)t(e);}notifyHostContextChange(){for(let e of this.hostContextHandlers)e(this.context);}getHostCapabilities(){return this.mockHostCapabilities}getHostVersion(){return this.mockHostVersion}async sendLog(e,t){console.log(`[MockAdapter] sendLog(${e}):`,t);}async sendSizeChanged(e){console.log("[MockAdapter] sendSizeChanged:",e);}onToolInputPartial(e){return this.toolInputPartialHandlers.add(e),()=>this.toolInputPartialHandlers.delete(e)}setCallToolHandler(e){this.callToolHandler=e,console.log("[MockAdapter] setCallToolHandler: handler registered");}setListToolsHandler(e){this.listToolsHandler=e,console.log("[MockAdapter] setListToolsHandler: handler registered");}emitToolInputPartial(e){for(let t of this.toolInputPartialHandlers)t(e);}setMockHostCapabilities(e){this.mockHostCapabilities={...this.mockHostCapabilities,...e};}setMockHostVersion(e){this.mockHostVersion=e;}async simulateHostToolCall(e,t){if(!this.callToolHandler)throw new d(u.TOOL_NOT_FOUND,"No call tool handler registered");return this.callToolHandler(e,t)}async simulateHostListTools(){return this.listToolsHandler?this.listToolsHandler():{tools:[]}}};var _={parse:n=>n},f=class{constructor(){this.connected=false;this.toolResultHandlers=new Set;this.toolInputHandlers=new Set;this.toolInputPartialHandlers=new Set;this.toolCancelledHandlers=new Set;this.hostContextHandlers=new Set;this.teardownHandlers=new Set;this.context=this.createDefaultContext();}createDefaultContext(){let e=typeof window<"u";return {theme:"light",displayMode:"inline",availableDisplayModes:["inline","fullscreen"],viewport:{width:e?window.innerWidth:800,height:e?window.innerHeight:600},locale:e?navigator.language:"en-US",timeZone:Intl.DateTimeFormat().resolvedOptions().timeZone,platform:"desktop"}}async connect(){if(this.connected)return;if(typeof window>"u"){this.connected=true;return}this.app=new extApps.App({name:"@mcp-apps-kit/ui",version:"0.0.0"},{tools:{}}),this.app.onerror=t=>{this.log("error",t);},this.app.onhostcontextchanged=t=>{let s=t.hostContext??t;this.context=this.mapHostContext(s),this.currentToolMeta=this.extractToolMeta(s);for(let o of this.hostContextHandlers)o(this.context);},this.app.ontoolinput=t=>{let s=t.arguments;if(s){this.currentToolInput=s;for(let o of this.toolInputHandlers)o(s);}},this.app.ontoolinputpartial=t=>{let s=t.arguments;if(s)for(let o of this.toolInputPartialHandlers)o(s);},this.app.oncalltool=async t=>{let{name:s,arguments:o}=t;try{if(this.callToolHandler){let r=await this.callToolHandler(s,o??{});return {content:[{type:"text",text:JSON.stringify(r)}]}}return {content:[{type:"text",text:`No handler registered for tool: ${s}`}],isError:!0}}catch(r){return {content:[{type:"text",text:r instanceof Error?r.message:String(r)}],isError:true}}},this.app.onlisttools=async()=>this.listToolsHandler?{tools:(await this.listToolsHandler()).map(s=>s.name)}:{tools:[]},this.app.ontoolresult=t=>{let s=this.extractToolOutput(t);this.currentToolOutput=s;let o=this.getToolNameFromContext(),r=o?{[o]:s}:s;for(let i of this.toolResultHandlers)i(r);},this.app.ontoolcancelled=t=>{let s=t.reason;for(let o of this.toolCancelledHandlers)o(s);},this.app.onteardown=async t=>{let s=t.reason;for(let o of this.teardownHandlers)o(s);return {}},await this.app.connect();let e=this.app.getHostContext();e&&(this.context=this.mapHostContext(e),this.currentToolMeta=this.extractToolMeta(e)),this.connected=true;}isConnected(){return this.connected}mapHostContext(e){let t=e??{},s=this.createDefaultContext(),o=t.theme==="dark"?"dark":t.theme==="light"?"light":s.theme,r=t.displayMode==="fullscreen"||t.displayMode==="pip"||t.displayMode==="inline"?t.displayMode:s.displayMode,i=Array.isArray(t.availableDisplayModes)?t.availableDisplayModes.filter(c=>typeof c=="string"):s.availableDisplayModes,p=(c=>c!==null&&typeof c=="object"&&!Array.isArray(c))(t.viewport)?{...s.viewport,...t.viewport}:s.viewport,a=typeof t.locale=="string"?t.locale:s.locale,C=typeof t.timeZone=="string"?t.timeZone:s.timeZone,E=s.platform;return {...s,theme:o,displayMode:r,availableDisplayModes:i,viewport:p,locale:a,timeZone:C,platform:E,userAgent:typeof t.userAgent=="string"?t.userAgent:s.userAgent,deviceCapabilities:t.deviceCapabilities,safeAreaInsets:t.safeAreaInsets,styles:t.styles,view:typeof t.view=="string"?t.view:s.view}}extractToolMeta(e){if(e===null||typeof e!="object")return;let t=e;if(!(!t.toolInfo||typeof t.toolInfo!="object"))return {toolInfo:t.toolInfo}}getToolNameFromContext(){if(!this.app)return;let e=this.app.getHostContext();return e?e.toolInfo?.tool?.name:void 0}extractToolOutput(e){let t=e.structuredContent,s=e._meta,o=t&&typeof t=="object"&&!Array.isArray(t)?t:{};if(s&&typeof s=="object"&&!Array.isArray(s))return {...o,_meta:s};if(Object.keys(o).length===0){let r=e.content;if(Array.isArray(r)&&r.length>0){let i=r[0];if(i?.type==="text"&&typeof i.text=="string")try{let l=JSON.parse(i.text);if(l!==null&&typeof l=="object"&&!Array.isArray(l))return l}catch{}}}return o}async callTool(e,t){if(!this.app)throw new Error("MCP Apps adapter not connected");let s=await this.app.callServerTool({name:e,arguments:t});return this.extractToolOutput(s)}async sendMessage(e){if(!this.app)throw new Error("MCP Apps adapter not connected");if(e.type!=="text")throw new Error(`Unsupported message content type: ${e.type}`);await this.app.sendMessage({role:"user",content:[{type:"text",text:e.text}]});}async openLink(e){if(!this.app)throw new Error("MCP Apps adapter not connected");await this.app.openLink({url:e});}async requestDisplayMode(e){if(!this.app)throw new Error("MCP Apps adapter not connected");return await this.app.requestDisplayMode({mode:e})}requestClose(){}getState(){return null}setState(e){}async readResource(e){if(!this.app)throw new Error("MCP Apps adapter not connected");let s=await this.app.request.bind(this.app)({method:"resources/read",params:{uri:e}},_);return {contents:(Array.isArray(s.contents)?s.contents:[]).map(o=>{let r={uri:o.uri,mimeType:o.mimeType??"application/octet-stream"};if("text"in o&&typeof o.text=="string")return {...r,text:o.text};if("blob"in o&&typeof o.blob=="string"){let i=Uint8Array.from(atob(o.blob),l=>l.charCodeAt(0));return {...r,blob:i}}return r})}}log(e,t){if(this.app){let i={level:["debug","info","notice","warning","error","critical","alert","emergency"].includes(e)?e:"info",data:t,logger:"@mcp-apps-kit/ui"};try{this.app.sendLog(i);return}catch{}}({debug:console.debug,info:console.info,warning:console.warn,error:console.error}[e]??console.log)("[MCP Apps]",t);}onToolResult(e){return this.toolResultHandlers.add(e),()=>this.toolResultHandlers.delete(e)}onToolInput(e){return this.toolInputHandlers.add(e),()=>this.toolInputHandlers.delete(e)}onToolCancelled(e){return this.toolCancelledHandlers.add(e),()=>this.toolCancelledHandlers.delete(e)}onHostContextChange(e){return this.hostContextHandlers.add(e),()=>this.hostContextHandlers.delete(e)}onTeardown(e){return this.teardownHandlers.add(e),()=>this.teardownHandlers.delete(e)}getHostContext(){return this.context}getToolInput(){return this.currentToolInput}getToolOutput(){return this.currentToolOutput}getToolMeta(){return this.currentToolMeta}getHostCapabilities(){if(!this.app)return;let e=this.app.getHostCapabilities();if(!e)return;let t=e,o=this.app.getHostContext()?.availableDisplayModes;return {logging:t.logging,openLinks:t.openLinks,serverResources:t.serverResources,serverTools:t.serverTools,experimental:t.experimental,theming:{themes:["light","dark"]},displayModes:o?{modes:o}:void 0,statePersistence:{persistent:false},sizeNotifications:{},partialToolInput:{},appTools:{listChanged:false}}}getHostVersion(){if(!this.app)return;let e=this.app.getHostVersion();if(e)return {name:e.name,version:e.version}}async sendLog(e,t){if(!this.app)throw new d(u.NOT_CONNECTED,"MCP Apps adapter not connected");await this.app.sendLog({level:e,data:t,logger:"@mcp-apps-kit/ui"});}async sendSizeChanged(e){if(!this.app)throw new d(u.NOT_CONNECTED,"MCP Apps adapter not connected");await this.app.sendSizeChanged({width:e.width,height:e.height});}onToolInputPartial(e){return this.toolInputPartialHandlers.add(e),()=>this.toolInputPartialHandlers.delete(e)}setCallToolHandler(e){this.callToolHandler=e;}setListToolsHandler(e){this.listToolsHandler=e;}};var h=class{constructor(){this.connected=false;this.state=null;this.toolResultHandlers=new Set;this.toolInputHandlers=new Set;this.toolCancelledHandlers=new Set;this.hostContextHandlers=new Set;this.teardownHandlers=new Set;this.context=this.createDefaultContext();}createDefaultContext(){let e=typeof window<"u";return {theme:"light",displayMode:"inline",availableDisplayModes:["inline","fullscreen","pip"],viewport:{width:e?window.innerWidth:800,height:e?window.innerHeight:600},locale:e?navigator.language:"en-US",timeZone:Intl.DateTimeFormat().resolvedOptions().timeZone,platform:"web",deviceCapabilities:{touch:e?"ontouchstart"in window:false,hover:true}}}readContextFromSDK(){let e=this.getOpenAI();if(!e)return;let t=typeof window<"u";if(typeof e.theme=="string"&&(this.context.theme=e.theme),typeof e.displayMode=="string"&&(this.context.displayMode=e.displayMode),typeof e.locale=="string"&&(this.context.locale=e.locale),typeof e.userAgent=="string"&&Object.assign(this.context,{userAgent:e.userAgent}),typeof e.view=="string"&&(this.context.view=e.view),e.safeArea&&typeof e.safeArea=="object"){let s=e.safeArea;this.context.safeAreaInsets={top:typeof s.top=="number"?s.top:0,right:typeof s.right=="number"?s.right:0,bottom:typeof s.bottom=="number"?s.bottom:0,left:typeof s.left=="number"?s.left:0};}typeof e.maxHeight=="number"&&(this.context.viewport={width:t?window.innerWidth:800,height:e.maxHeight}),console.log("[OpenAI Adapter] Read context from SDK:",this.context);}notifyContextChange(){console.log(`[OpenAI Adapter] Notifying ${String(this.hostContextHandlers.size)} context change handlers`);let e={...this.context};for(let t of this.hostContextHandlers)t(e);}getOpenAI(){return typeof window<"u"&&"openai"in window?window.openai:null}getToolNameFromSDK(){let e=this.getOpenAI();if(e){if(e.toolResponseMetadata&&typeof e.toolResponseMetadata=="object"){let t=e.toolResponseMetadata;if(typeof t.toolName=="string")return t.toolName}if(typeof e.toolName=="string")return e.toolName}}async connect(){await this.waitForOpenAI();let e=this.getOpenAI();if(e){console.log("[OpenAI Adapter] Available SDK methods:",Object.keys(e)),this.readContextFromSDK();let t=this.getToolNameFromSDK();if(typeof e.getToolOutput=="function"?(this.currentToolOutput=e.getToolOutput(),console.log("[OpenAI Adapter] Got tool output from SDK")):e.toolOutput?(this.currentToolOutput=e.toolOutput,console.log("[OpenAI Adapter] Got tool output from SDK property")):e.result&&(this.currentToolOutput=e.result,console.log("[OpenAI Adapter] Got result from SDK")),this.currentToolOutput&&Object.keys(this.currentToolOutput).length>0){let s=t?{[t]:this.currentToolOutput}:this.currentToolOutput;for(let o of this.toolResultHandlers)o(s);}typeof e.getToolInput=="function"?this.currentToolInput=e.getToolInput():e.toolInput?this.currentToolInput=e.toolInput:e.input&&(this.currentToolInput=e.input),typeof e.init=="function"&&await e.init();}this.setupGlobalsListener(),this.connected=true;}setupGlobalsListener(){typeof window>"u"||(this.globalsHandler=e=>{let t=e.data;(t==="openai:set_globals"||typeof t=="object"&&t!==null&&"type"in t&&t.type==="openai:set_globals"||typeof t=="object"&&t!==null&&"message"in t&&t.message==="openai:set_globals")&&(console.log("[OpenAI Adapter] Received set_globals event, refreshing context"),setTimeout(()=>{let o=this.context.theme,r=this.context.locale,i=this.context.displayMode;this.readContextFromSDK(),(this.context.theme!==o||this.context.locale!==r||this.context.displayMode!==i)&&(console.log("[OpenAI Adapter] Context changed, notifying handlers"),this.notifyContextChange());},10));},window.addEventListener("message",this.globalsHandler));}async waitForOpenAI(e=5e3){if(this.getOpenAI()){console.log("[OpenAI Adapter] window.openai already available");return}return console.log("[OpenAI Adapter] Waiting for window.openai..."),new Promise(t=>{let s=Date.now(),o=false,r=()=>{o||(o=true,window.removeEventListener("message",l),t());},i=()=>{if(!o){if(this.getOpenAI()){console.log("[OpenAI Adapter] window.openai found via polling"),r();return}if(Date.now()-s>e){console.warn("[OpenAI Adapter] window.openai not found after timeout, proceeding anyway"),r();return}setTimeout(i,50);}},l=p=>{let a=p.data;(a==="openai:set_globals"||typeof a=="object"&&a!==null&&"type"in a&&a.type==="openai:set_globals"||typeof a=="object"&&a!==null&&"message"in a&&a.message==="openai:set_globals")&&(console.log("[OpenAI Adapter] Received set_globals message"),setTimeout(()=>{this.getOpenAI()?(console.log("[OpenAI Adapter] window.openai available after set_globals"),r()):console.log("[OpenAI Adapter] window.openai still not available after set_globals, continuing poll");},50));};window.addEventListener("message",l),i();})}isConnected(){return this.connected}async callTool(e,t){let s=this.getOpenAI();if(s&&typeof s.callTool=="function")return s.callTool(e,t);throw new Error("OpenAI SDK not available")}async sendMessage(e){let t=this.getOpenAI();t&&typeof t.sendMessage=="function"&&await t.sendMessage(e);}async openLink(e){let t=this.getOpenAI();t&&typeof t.openLink=="function"?await t.openLink(e):window.open(e,"_blank");}async requestDisplayMode(e){let t=this.getOpenAI();if(t&&typeof t.requestDisplayMode=="function"){let s=await t.requestDisplayMode({mode:e});return this.context={...this.context,displayMode:s.mode},this.notifyContextChange(),s}return this.context={...this.context,displayMode:e},this.notifyContextChange(),{mode:e}}requestClose(){let e=this.getOpenAI();e&&typeof e.close=="function"&&e.close();}getState(){return this.state}setState(e){this.state=e;let t=this.getOpenAI();t&&typeof t.setState=="function"&&t.setState(e);}async uploadFile(e){let t=this.getOpenAI();if(t&&typeof t.uploadFile=="function")return t.uploadFile(e);throw new Error("File upload not supported")}async getFileDownloadUrl(e){let t=this.getOpenAI();if(t&&typeof t.getFileDownloadUrl=="function")return t.getFileDownloadUrl(e);throw new Error("File download not supported")}async readResource(e){let t=this.getOpenAI();return t&&typeof t.readResource=="function"?t.readResource(e):{contents:[]}}log(e,t){({debug:console.debug,info:console.info,warning:console.warn,error:console.error}[e]??console.log)("[ChatGPT Apps]",t);}onToolResult(e){return this.toolResultHandlers.add(e),()=>this.toolResultHandlers.delete(e)}onToolInput(e){return this.toolInputHandlers.add(e),()=>this.toolInputHandlers.delete(e)}onToolCancelled(e){return this.toolCancelledHandlers.add(e),()=>this.toolCancelledHandlers.delete(e)}onHostContextChange(e){return this.hostContextHandlers.add(e),console.log(`[OpenAI Adapter] Host context handler added, total: ${String(this.hostContextHandlers.size)}`),()=>{this.hostContextHandlers.delete(e),console.log(`[OpenAI Adapter] Host context handler removed, total: ${String(this.hostContextHandlers.size)}`);}}onTeardown(e){return this.teardownHandlers.add(e),()=>this.teardownHandlers.delete(e)}getHostContext(){return this.context}getToolInput(){return this.currentToolInput}getToolOutput(){if(!this.currentToolOutput)return;let e=this.getToolNameFromSDK();return e?{[e]:this.currentToolOutput}:this.currentToolOutput}getToolMeta(){return this.currentToolMeta}getHostCapabilities(){let e=this.getOpenAI(),t=e&&typeof e.uploadFile=="function",s=this.context.safeAreaInsets!==void 0,o=this.context.view!==void 0;return {openLinks:{},logging:{},theming:{themes:["light","dark"]},displayModes:{modes:["inline","fullscreen","pip"]},statePersistence:{persistent:false},fileUpload:t?{}:void 0,safeAreaInsets:s?{}:void 0,views:o?{}:void 0}}getHostVersion(){}async sendLog(e,t){let s={debug:"debug",info:"info",notice:"info",warning:"warning",error:"error",critical:"error",alert:"error",emergency:"error"};this.log(s[e],t);}async sendSizeChanged(e){let t=this.getOpenAI();t&&typeof t.notifyIntrinsicHeight=="function"&&t.notifyIntrinsicHeight(e.height);}onToolInputPartial(e){return this.log("debug","onToolInputPartial is not supported on ChatGPT"),()=>{}}setCallToolHandler(e){this.log("debug","setCallToolHandler is not supported on ChatGPT");}setListToolsHandler(e){this.log("debug","setListToolsHandler is not supported on ChatGPT");}};function U(){let n=window.location.href;if(n.includes("/api/apps/chatgpt/")||n.includes("chatgpt")||n.includes("sandbox-proxy")||n.includes("widget-content"))return true;let e=document.referrer;return !!(e.includes("chatgpt")||e.includes("openai.com"))}function v(){return typeof window>"u"?"mock":"openai"in window||U()?"openai":window.parent!==window?"mcp":"mock"}function z(n){return new Proxy({},{get(e,t){if(typeof t!="string"||!t.startsWith("call"))return;let s=t.slice(4);if(s.length===0)return;let o=s.charAt(0).toLowerCase()+s.slice(1);return r=>n(o,r)},has(e,t){return typeof t=="string"&&t.startsWith("call")&&t.length>4},ownKeys(){return []},getOwnPropertyDescriptor(e,t){if(typeof t=="string"&&t.startsWith("call")&&t.length>4)return {configurable:true,enumerable:true,writable:false}}})}function T(n){async function e(o,r){return await n.callTool(o,r)}let t=z(e);return {callTool:e,tools:t,async sendMessage(o){await n.sendMessage(o);},async sendFollowUpMessage(o){await n.sendMessage({type:"text",text:o});},async openLink(o){await n.openLink(o);},async requestDisplayMode(o){return n.requestDisplayMode(o)},requestClose(){n.requestClose();},getState(){return n.getState()},setState(o){n.setState(o);},...n.uploadFile&&{uploadFile:o=>{if(n.uploadFile)return n.uploadFile(o);throw new Error("uploadFile not supported")}},...n.getFileDownloadUrl&&{getFileDownloadUrl:o=>{if(n.getFileDownloadUrl)return n.getFileDownloadUrl(o);throw new Error("getFileDownloadUrl not supported")}},async readResource(o){return n.readResource(o)},log(o,r){n.log(o,r);},onToolResult(o){return n.onToolResult(o)},onToolInput(o){return n.onToolInput(o)},onToolCancelled(o){return n.onToolCancelled(o)},onHostContextChange(o){return n.onHostContextChange(o)},onTeardown(o){return n.onTeardown(o)},onToolInputPartial(o){return n.onToolInputPartial(o)},getHostCapabilities(){return n.getHostCapabilities()},getHostVersion(){return n.getHostVersion()},async sendLog(o,r){return n.sendLog(o,r)},async sendSizeChanged(o){return n.sendSizeChanged(o)},setupSizeChangedNotifications(){if(typeof window>"u"||typeof ResizeObserver>"u")return ()=>{};let o=new ResizeObserver(r=>{for(let i of r){let{width:l,height:p}=i.contentRect;n.sendSizeChanged({width:Math.round(l),height:Math.round(p)});}});return o.observe(document.body),()=>{o.disconnect();}},setCallToolHandler(o){n.setCallToolHandler(o);},setListToolsHandler(o){n.setListToolsHandler(o);},get hostContext(){return n.getHostContext()},get toolInput(){return n.getToolInput()},get toolOutput(){return n.getToolOutput()},get toolMeta(){return n.getToolMeta()}}}function V(n){switch(n){case "mcp":return new f;case "openai":return new h;case "mock":return new g;default:throw new Error(`Unknown adapter type: ${n}`)}}async function ue(n){let e=n?.forceAdapter??v();if(!["mcp","openai","mock"].includes(e))throw new Error(`Unknown adapter type: ${e}`);let t=V(e);return await t.connect(),y.setAdapter(t),T(t)}exports.ClientDebugLogger=m;exports.LATEST_PROTOCOL_VERSION=L;exports.McpAdapter=f;exports.MockAdapter=g;exports.OpenAIAdapter=h;exports.RESOURCE_MIME_TYPE=D;exports.RESOURCE_URI_META_KEY=F;exports.UIError=d;exports.UIErrorCode=u;exports.applyDocumentTheme=x;exports.applyHostFonts=k;exports.applyHostStyleVariables=b;exports.clearHostStyleVariables=A;exports.clientDebugLogger=y;exports.createAppsClient=T;exports.createClient=ue;exports.detectProtocol=v;exports.getDocumentTheme=H;exports.removeHostFonts=I;exports.safeSerialize=M;exports.safeStringify=P;exports.shouldLog=S;//# sourceMappingURL=index.cjs.map
'use strict';var extApps=require('@modelcontextprotocol/ext-apps');var D="2025-11-05",_="text/html;profile=mcp-app",F="ui/resourceUri";function x(r){if(typeof document>"u")return;let e=r==="os"?typeof window<"u"&&window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light":r;document.documentElement.classList.remove("light","dark"),document.documentElement.classList.add(e),document.documentElement.setAttribute("data-theme",e);}function k(){if(typeof document>"u")return "light";let r=document.documentElement.getAttribute("data-theme");return r==="dark"||r==="light"?r:document.documentElement.classList.contains("dark")?"dark":"light"}var T="mcp-apps-host-fonts";function H(r){if(typeof document>"u")return;let e=document.documentElement;for(let[t,n]of Object.entries(r)){let o=t.startsWith("--")?t:`--${t}`;e.style.setProperty(o,n);}}function A(r){if(typeof document>"u")return;let e=document.getElementById(T);e||(e=document.createElement("style"),e.id=T,document.head.appendChild(e)),e.textContent=r;}function O(){if(typeof document>"u")return;let r=document.getElementById(T);r&&r.remove();}function I(r){if(typeof document>"u")return;let e=document.documentElement;for(let t of Object.keys(r)){let n=t.startsWith("--")?t:`--${t}`;e.style.removeProperty(n);}}var g={CONNECTION_FAILED:"CONNECTION_FAILED",CONNECTION_TIMEOUT:"CONNECTION_TIMEOUT",NOT_CONNECTED:"NOT_CONNECTED",PROTOCOL_ERROR:"PROTOCOL_ERROR",UNSUPPORTED_OPERATION:"UNSUPPORTED_OPERATION",TOOL_CALL_FAILED:"TOOL_CALL_FAILED",TOOL_NOT_FOUND:"TOOL_NOT_FOUND",STATE_ERROR:"STATE_ERROR",UNKNOWN_ERROR:"UNKNOWN_ERROR"},d=class extends Error{constructor(t,n,o,s){super(n);this.code=t;this.details=o;this.cause=s;this.name="UIError";}formatMessage(){let t=`[${this.code}] ${this.message}`;return this.details&&(t+=` ${JSON.stringify(this.details)}`),t}};var R={debug:0,info:1,warn:2,error:3};function S(r,e){return R[r]>=R[e]}function M(){let r=new WeakSet;return (e,t)=>{if(typeof t=="object"&&t!==null){if(r.has(t))return "[Circular]";r.add(t);}return t}}function E(r){if(r==null||typeof r=="string"||typeof r=="number"||typeof r=="boolean")return r;if(r instanceof Error)return {name:r.name,message:r.message,stack:r.stack};try{return JSON.stringify(r),r}catch{try{let e=JSON.stringify(r,M());return JSON.parse(e)}catch{return "[Unserializable]"}}}function P(r){if(r===void 0)return "undefined";if(r===null)return "null";if(typeof r=="string")return r;if(r instanceof Error)return `${r.name}: ${r.message}`;try{return JSON.stringify(r,M())}catch{return "[Unstringifiable]"}}var y=class{constructor(e={}){this.adapter=null;this.buffer=[];this.flushTimer=null;this.isFlushing=false;this.mcpTransportFailed=false;this.apiTransportFailed=false;this.config={enabled:e.enabled??false,level:e.level??"info",batchSize:e.batchSize??10,maxBufferSize:e.maxBufferSize??100,flushIntervalMs:e.flushIntervalMs??5e3,source:e.source??"mcp-apps-ui",transport:e.transport??"tool",apiEndpoint:e.apiEndpoint};}setAdapter(e){this.adapter=e,this.mcpTransportFailed=false,this.apiTransportFailed=false;}configure(e){e.enabled!==void 0&&(this.config.enabled=e.enabled),e.level!==void 0&&(this.config.level=e.level),e.batchSize!==void 0&&(this.config.batchSize=e.batchSize),e.maxBufferSize!==void 0&&(this.config.maxBufferSize=e.maxBufferSize),e.flushIntervalMs!==void 0&&(this.config.flushIntervalMs=e.flushIntervalMs,this.flushTimer&&(clearTimeout(this.flushTimer),this.flushTimer=null),this.scheduleFlush()),e.source!==void 0&&(this.config.source=e.source),e.transport!==void 0&&(this.config.transport=e.transport,this.mcpTransportFailed=false,this.apiTransportFailed=false),e.apiEndpoint!==void 0&&(this.config.apiEndpoint=e.apiEndpoint,this.apiTransportFailed=false);}canUseToolTransport(){return this.config.enabled&&this.config.transport==="tool"&&!this.mcpTransportFailed&&this.adapter?.isConnected()===true}canUseApiTransport(){return this.config.enabled&&this.config.transport==="api"&&!this.apiTransportFailed&&!!this.config.apiEndpoint}canUseRemoteTransport(){return this.canUseToolTransport()||this.canUseApiTransport()}createEntry(e,t,n){return {level:e,message:t,data:n!==void 0?E(n):void 0,timestamp:new Date().toISOString(),source:this.config.source}}scheduleFlush(){this.flushTimer||this.buffer.length===0||(this.flushTimer=setTimeout(()=>{this.flushTimer=null,this.flush();},this.config.flushIntervalMs));}async flushToApi(e){if(!this.config.apiEndpoint)throw new Error("API endpoint not configured");let t=await fetch(this.config.apiEndpoint,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({entries:e})});if(!t.ok)throw new Error(`API request failed with status ${String(t.status)}`)}async flushToTool(e){if(!this.adapter)throw new Error("Adapter not connected");await this.adapter.callTool("log_debug",{entries:e});}async flush(){if(this.isFlushing||this.buffer.length===0)return;if(this.flushTimer&&(clearTimeout(this.flushTimer),this.flushTimer=null),!this.canUseRemoteTransport()){this.buffer=[];return}this.isFlushing=true;let e=[...this.buffer];try{this.canUseApiTransport()?await this.flushToApi(e):this.canUseToolTransport()&&await this.flushToTool(e),this.buffer=this.buffer.slice(e.length);}catch(t){this.buffer=this.buffer.slice(e.length);let n=t instanceof Error?t.message:String(t);this.config.transport==="api"&&!this.apiTransportFailed?(this.apiTransportFailed=true,console.warn(`[ClientDebugLogger] API log transport failed: ${n}. Will only use console`)):this.config.transport==="tool"&&!this.mcpTransportFailed&&(this.mcpTransportFailed=true,console.warn(`[ClientDebugLogger] MCP log transport failed: ${n}. Will only use console`));}finally{this.isFlushing=false,this.buffer.length>0&&this.scheduleFlush();}}outputToConsole(e){let t=`[${e.timestamp}] [${e.level.toUpperCase()}]`,n=e.data!==void 0?`${e.message} ${P(e.data)}`:e.message,o=`${t} ${n}`;try{switch(e.level){case "debug":console.debug(o);break;case "info":console.info(o);break;case "warn":console.warn(o);break;case "error":console.error(o);break}}catch{}}addToBuffer(e){for(;this.buffer.length>=this.config.maxBufferSize;)this.buffer.shift();if(this.buffer.push(e),e.level==="error"){this.flush();return}if(this.buffer.length>=this.config.batchSize){this.flush();return}this.scheduleFlush();}log(e,t,n){if(!S(e,this.config.level))return;let o=this.createEntry(e,t,n);this.outputToConsole(o),this.canUseRemoteTransport()&&this.addToBuffer(o);}debug(e,t){this.log("debug",e,t);}info(e,t){this.log("info",e,t);}warn(e,t){this.log("warn",e,t);}error(e,t){this.log("error",e,t);}destroy(){this.buffer=[],this.flushTimer&&(clearTimeout(this.flushTimer),this.flushTimer=null),this.adapter=null;}},i=new y;function L(){return typeof window<"u"&&window.__MCP_SERVER_CONFIG__?window.__MCP_SERVER_CONFIG__:typeof __MCP_SERVER_CONFIG__<"u"&&__MCP_SERVER_CONFIG__?__MCP_SERVER_CONFIG__:{}}function N(r=""){let e=L();return e.baseUrl?e.baseUrl:typeof window<"u"&&(window.location.protocol==="http:"||window.location.protocol==="https:")?window.location.origin:r}var h=class{constructor(){this.connected=false;this.state=null;this.toolResultHandlers=new Set;this.toolInputHandlers=new Set;this.toolInputPartialHandlers=new Set;this.toolCancelledHandlers=new Set;this.hostContextHandlers=new Set;this.teardownHandlers=new Set;this.mockHostCapabilities={logging:{},openLinks:{},theming:{themes:["light","dark","os"]},displayModes:{modes:["inline","fullscreen","pip","panel"]},statePersistence:{persistent:true},serverTools:{listChanged:false},serverResources:{listChanged:false},sizeNotifications:{},partialToolInput:{},appTools:{listChanged:false},fileUpload:{},safeAreaInsets:{},views:{}};this.mockHostVersion={name:"MockHost",version:"1.0.0"};this.context=this.createDefaultContext();}createDefaultContext(){let e=typeof window<"u";return {theme:"light",displayMode:"inline",availableDisplayModes:["inline","fullscreen","pip"],viewport:{width:e?window.innerWidth:800,height:e?window.innerHeight:600},locale:e?navigator.language:"en-US",timeZone:Intl.DateTimeFormat().resolvedOptions().timeZone,platform:"web",deviceCapabilities:{touch:e?"ontouchstart"in window:false,hover:true}}}async connect(){this.connected=true,console.log("[MockAdapter] Connected");}isConnected(){return this.connected}async callTool(e,t){console.log(`[MockAdapter] callTool("${e}",`,t,")");let n={_mock:true,tool:e,args:t,timestamp:Date.now()};return this.currentToolOutput=n,n}async sendMessage(e){console.log("[MockAdapter] sendMessage:",e);}async openLink(e){console.log(`[MockAdapter] openLink("${e}")`);}async requestDisplayMode(e){return console.log(`[MockAdapter] requestDisplayMode("${e}")`),this.context={...this.context,displayMode:e},this.notifyHostContextChange(),{mode:e}}requestClose(){console.log("[MockAdapter] requestClose()");}getState(){return this.state}setState(e){this.state=e,console.log("[MockAdapter] setState:",e);}async readResource(e){return console.log(`[MockAdapter] readResource("${e}")`),{contents:[]}}log(e,t){({debug:console.debug,info:console.info,warning:console.warn,error:console.error}[e]??console.log)("[MockAdapter]",t);}onToolResult(e){return this.toolResultHandlers.add(e),()=>this.toolResultHandlers.delete(e)}onToolInput(e){return this.toolInputHandlers.add(e),()=>this.toolInputHandlers.delete(e)}onToolCancelled(e){return this.toolCancelledHandlers.add(e),()=>this.toolCancelledHandlers.delete(e)}onHostContextChange(e){return this.hostContextHandlers.add(e),()=>this.hostContextHandlers.delete(e)}onTeardown(e){return this.teardownHandlers.add(e),()=>this.teardownHandlers.delete(e)}getHostContext(){return this.context}getToolInput(){return this.currentToolInput}getToolOutput(){return this.currentToolOutput}getToolMeta(){return this.currentToolMeta}emitToolResult(e){this.currentToolOutput=e;for(let t of this.toolResultHandlers)t(e);}emitToolInput(e){this.currentToolInput=e;for(let t of this.toolInputHandlers)t(e);}setHostContext(e){this.context={...this.context,...e},this.notifyHostContextChange();}emitContextChange(e){this.context=e,this.notifyHostContextChange();}setToolInput(e){this.currentToolInput=e;}emitToolCancelled(e){for(let t of this.toolCancelledHandlers)t(e);}emitTeardown(e){for(let t of this.teardownHandlers)t(e);}notifyHostContextChange(){for(let e of this.hostContextHandlers)e(this.context);}getHostCapabilities(){return this.mockHostCapabilities}getHostVersion(){return this.mockHostVersion}async sendLog(e,t){console.log(`[MockAdapter] sendLog(${e}):`,t);}async sendLogs(e){for(let t of e)console.log(`[MockAdapter] sendLogs(${t.level}):`,t.message,t.data);return {processed:e.length}}async sendSizeChanged(e){console.log("[MockAdapter] sendSizeChanged:",e);}onToolInputPartial(e){return this.toolInputPartialHandlers.add(e),()=>this.toolInputPartialHandlers.delete(e)}setCallToolHandler(e){this.callToolHandler=e,console.log("[MockAdapter] setCallToolHandler: handler registered");}setListToolsHandler(e){this.listToolsHandler=e,console.log("[MockAdapter] setListToolsHandler: handler registered");}emitToolInputPartial(e){for(let t of this.toolInputPartialHandlers)t(e);}setMockHostCapabilities(e){this.mockHostCapabilities={...this.mockHostCapabilities,...e};}setMockHostVersion(e){this.mockHostVersion=e;}async simulateHostToolCall(e,t){if(!this.callToolHandler)throw new d(g.TOOL_NOT_FOUND,"No call tool handler registered");return this.callToolHandler(e,t)}async simulateHostListTools(){return this.listToolsHandler?this.listToolsHandler():{tools:[]}}};var z={parse:r=>r},m=class{constructor(){this.connected=false;this.toolResultHandlers=new Set;this.toolInputHandlers=new Set;this.toolInputPartialHandlers=new Set;this.toolCancelledHandlers=new Set;this.hostContextHandlers=new Set;this.teardownHandlers=new Set;this.context=this.createDefaultContext();}createDefaultContext(){let e=typeof window<"u";return {theme:"light",displayMode:"inline",availableDisplayModes:["inline","fullscreen"],viewport:{width:e?window.innerWidth:800,height:e?window.innerHeight:600},locale:e?navigator.language:"en-US",timeZone:Intl.DateTimeFormat().resolvedOptions().timeZone,platform:"desktop"}}async connect(){if(this.connected)return;if(typeof window>"u"){this.connected=true;return}this.app=new extApps.App({name:"@mcp-apps-kit/ui",version:"0.0.0"},{tools:{}}),this.app.onerror=t=>{this.log("error",t);},this.app.onhostcontextchanged=t=>{let n=t.hostContext??t;this.context=this.mapHostContext(n),this.currentToolMeta=this.extractToolMeta(n);for(let o of this.hostContextHandlers)o(this.context);},this.app.ontoolinput=t=>{let n=t.arguments;if(n){this.currentToolInput=n;for(let o of this.toolInputHandlers)o(n);}},this.app.ontoolinputpartial=t=>{let n=t.arguments;if(n)for(let o of this.toolInputPartialHandlers)o(n);},this.app.oncalltool=async t=>{let{name:n,arguments:o}=t;try{if(this.callToolHandler){let s=await this.callToolHandler(n,o??{});return {content:[{type:"text",text:JSON.stringify(s)}]}}return {content:[{type:"text",text:`No handler registered for tool: ${n}`}],isError:!0}}catch(s){return {content:[{type:"text",text:s instanceof Error?s.message:String(s)}],isError:true}}},this.app.onlisttools=async()=>this.listToolsHandler?{tools:(await this.listToolsHandler()).map(n=>n.name)}:{tools:[]},this.app.ontoolresult=t=>{let n=this.extractToolOutput(t);this.currentToolOutput=n;let o=this.getToolNameFromContext(),s=o?{[o]:n}:n;for(let a of this.toolResultHandlers)a(s);},this.app.ontoolcancelled=t=>{let n=t.reason;for(let o of this.toolCancelledHandlers)o(n);},this.app.onteardown=async t=>{let n=t.reason;for(let o of this.teardownHandlers)o(n);return {}},await this.app.connect();let e=this.app.getHostContext();e&&(this.context=this.mapHostContext(e),this.currentToolMeta=this.extractToolMeta(e)),this.connected=true;}isConnected(){return this.connected}mapHostContext(e){let t=e??{},n=this.createDefaultContext(),o=t.theme==="dark"?"dark":t.theme==="light"?"light":n.theme,s=t.displayMode==="fullscreen"||t.displayMode==="pip"||t.displayMode==="inline"?t.displayMode:n.displayMode,a=Array.isArray(t.availableDisplayModes)?t.availableDisplayModes.filter(c=>typeof c=="string"):n.availableDisplayModes,p=(c=>c!==null&&typeof c=="object"&&!Array.isArray(c))(t.viewport)?{...n.viewport,...t.viewport}:n.viewport,u=typeof t.locale=="string"?t.locale:n.locale,f=typeof t.timeZone=="string"?t.timeZone:n.timeZone,v=n.platform;return {...n,theme:o,displayMode:s,availableDisplayModes:a,viewport:p,locale:u,timeZone:f,platform:v,userAgent:typeof t.userAgent=="string"?t.userAgent:n.userAgent,deviceCapabilities:t.deviceCapabilities,safeAreaInsets:t.safeAreaInsets,styles:t.styles,view:typeof t.view=="string"?t.view:n.view}}extractToolMeta(e){if(e===null||typeof e!="object")return;let t=e;if(!(!t.toolInfo||typeof t.toolInfo!="object"))return {toolInfo:t.toolInfo}}getToolNameFromContext(){if(!this.app)return;let e=this.app.getHostContext();return e?e.toolInfo?.tool?.name:void 0}extractToolOutput(e){let t=e.structuredContent,n=e._meta,o=t&&typeof t=="object"&&!Array.isArray(t)?t:{};if(n&&typeof n=="object"&&!Array.isArray(n))return {...o,_meta:n};if(Object.keys(o).length===0){let s=e.content;if(Array.isArray(s)&&s.length>0){let a=s[0];if(a?.type==="text"&&typeof a.text=="string")try{let l=JSON.parse(a.text);if(l!==null&&typeof l=="object"&&!Array.isArray(l))return l}catch{}}}return o}async callTool(e,t){if(!this.app)throw new Error("MCP Apps adapter not connected");let n=await this.app.callServerTool({name:e,arguments:t});return this.extractToolOutput(n)}async sendMessage(e){if(!this.app)throw new Error("MCP Apps adapter not connected");if(e.type!=="text")throw new Error(`Unsupported message content type: ${e.type}`);await this.app.sendMessage({role:"user",content:[{type:"text",text:e.text}]});}async openLink(e){if(!this.app)throw new Error("MCP Apps adapter not connected");await this.app.openLink({url:e});}async requestDisplayMode(e){if(!this.app)throw new Error("MCP Apps adapter not connected");return await this.app.requestDisplayMode({mode:e})}requestClose(){}getState(){return null}setState(e){}async readResource(e){if(!this.app)throw new Error("MCP Apps adapter not connected");let n=await this.app.request.bind(this.app)({method:"resources/read",params:{uri:e}},z);return {contents:(Array.isArray(n.contents)?n.contents:[]).map(o=>{let s={uri:o.uri,mimeType:o.mimeType??"application/octet-stream"};if("text"in o&&typeof o.text=="string")return {...s,text:o.text};if("blob"in o&&typeof o.blob=="string"){let a=Uint8Array.from(atob(o.blob),l=>l.charCodeAt(0));return {...s,blob:a}}return s})}}log(e,t){if(this.app){let a={level:["debug","info","notice","warning","error","critical","alert","emergency"].includes(e)?e:"info",data:t,logger:"@mcp-apps-kit/ui"};try{this.app.sendLog(a);return}catch{}}({debug:console.debug,info:console.info,warning:console.warn,error:console.error}[e]??console.log)("[MCP Apps]",t);}onToolResult(e){return this.toolResultHandlers.add(e),()=>this.toolResultHandlers.delete(e)}onToolInput(e){return this.toolInputHandlers.add(e),()=>this.toolInputHandlers.delete(e)}onToolCancelled(e){return this.toolCancelledHandlers.add(e),()=>this.toolCancelledHandlers.delete(e)}onHostContextChange(e){return this.hostContextHandlers.add(e),()=>this.hostContextHandlers.delete(e)}onTeardown(e){return this.teardownHandlers.add(e),()=>this.teardownHandlers.delete(e)}getHostContext(){return this.context}getToolInput(){return this.currentToolInput}getToolOutput(){return this.currentToolOutput}getToolMeta(){return this.currentToolMeta}getHostCapabilities(){if(!this.app)return;let e=this.app.getHostCapabilities();if(!e)return;let t=e,o=this.app.getHostContext()?.availableDisplayModes;return {logging:t.logging,openLinks:t.openLinks,serverResources:t.serverResources,serverTools:t.serverTools,experimental:t.experimental,theming:{themes:["light","dark"]},displayModes:o?{modes:o}:void 0,statePersistence:{persistent:false},sizeNotifications:{},partialToolInput:{},appTools:{listChanged:false}}}getHostVersion(){if(!this.app)return;let e=this.app.getHostVersion();if(e)return {name:e.name,version:e.version}}async sendLog(e,t){if(!this.app)throw new d(g.NOT_CONNECTED,"MCP Apps adapter not connected");await this.app.sendLog({level:e,data:t,logger:"@mcp-apps-kit/ui"});}async sendLogs(e){if(!this.app)throw new d(g.NOT_CONNECTED,"MCP Apps adapter not connected");let t={debug:"debug",info:"info",warn:"warning",error:"error"},n=0;for(let o of e)try{await this.app.sendLog({level:t[o.level]??"info",data:o.data??o.message,logger:o.source??"@mcp-apps-kit/ui"}),n++;}catch{}return {processed:n}}async sendSizeChanged(e){if(!this.app)throw new d(g.NOT_CONNECTED,"MCP Apps adapter not connected");await this.app.sendSizeChanged({width:e.width,height:e.height});}onToolInputPartial(e){return this.toolInputPartialHandlers.add(e),()=>this.toolInputPartialHandlers.delete(e)}setCallToolHandler(e){this.callToolHandler=e;}setListToolsHandler(e){this.listToolsHandler=e;}};var w=class{constructor(){this.connected=false;this.state=null;this.toolResultHandlers=new Set;this.toolInputHandlers=new Set;this.toolCancelledHandlers=new Set;this.hostContextHandlers=new Set;this.teardownHandlers=new Set;this.logTransport="api";this.apiTransportFailed=false;this.toolTransportFailed=false;this.context=this.createDefaultContext();}configureLogging(e){e.transport!==void 0&&(this.logTransport=e.transport,this.apiTransportFailed=false,this.toolTransportFailed=false),e.apiEndpoint!==void 0&&(this.logApiEndpoint=e.apiEndpoint,this.apiTransportFailed=false);}createDefaultContext(){let e=typeof window<"u";return {theme:"light",displayMode:"inline",availableDisplayModes:["inline","fullscreen","pip"],viewport:{width:e?window.innerWidth:800,height:e?window.innerHeight:600},locale:e?navigator.language:"en-US",timeZone:Intl.DateTimeFormat().resolvedOptions().timeZone,platform:"web",deviceCapabilities:{touch:e?"ontouchstart"in window:false,hover:true}}}isSetGlobalsMessage(e){return e==="openai:set_globals"||typeof e=="object"&&e!==null&&"type"in e&&e.type==="openai:set_globals"||typeof e=="object"&&e!==null&&"message"in e&&e.message==="openai:set_globals"}readContextFromSDK(){let e=this.getOpenAI();if(!e)return;let t=typeof window<"u";if(typeof e.theme=="string"&&(this.context.theme=e.theme),typeof e.displayMode=="string"&&(this.context.displayMode=e.displayMode),typeof e.locale=="string"&&(this.context.locale=e.locale),typeof e.userAgent=="string"&&Object.assign(this.context,{userAgent:e.userAgent}),typeof e.view=="string"&&(this.context.view=e.view),e.safeArea&&typeof e.safeArea=="object"){let n=e.safeArea;this.context.safeAreaInsets={top:typeof n.top=="number"?n.top:0,right:typeof n.right=="number"?n.right:0,bottom:typeof n.bottom=="number"?n.bottom:0,left:typeof n.left=="number"?n.left:0};}typeof e.maxHeight=="number"&&(this.context.viewport={width:t?window.innerWidth:800,height:e.maxHeight}),i.debug("[OpenAI Adapter] Read context from SDK",this.context);}notifyContextChange(){i.debug(`[OpenAI Adapter] Notifying ${String(this.hostContextHandlers.size)} context change handlers`);let e={...this.context};for(let t of this.hostContextHandlers)t(e);}getOpenAI(){return typeof window<"u"&&"openai"in window?window.openai:null}getToolNameFromSDK(){let e=this.getOpenAI();if(e){if(e.toolResponseMetadata&&typeof e.toolResponseMetadata=="object"){let t=e.toolResponseMetadata;if(typeof t.toolName=="string")return t.toolName}if(typeof e.toolName=="string")return e.toolName}}async connect(){await this.waitForOpenAI();let e=this.getOpenAI();if(e){i.debug("[OpenAI Adapter] Available SDK methods",Object.keys(e)),this.readContextFromSDK();let t=this.getToolNameFromSDK();if(typeof e.getToolOutput=="function"?(this.currentToolOutput=e.getToolOutput(),i.debug("[OpenAI Adapter] Got tool output from SDK")):e.toolOutput?(this.currentToolOutput=e.toolOutput,i.debug("[OpenAI Adapter] Got tool output from SDK property")):e.result&&(this.currentToolOutput=e.result,i.debug("[OpenAI Adapter] Got result from SDK")),this.currentToolOutput&&Object.keys(this.currentToolOutput).length>0){let n=t?{[t]:this.currentToolOutput}:this.currentToolOutput;for(let o of this.toolResultHandlers)o(n);}typeof e.getToolInput=="function"?this.currentToolInput=e.getToolInput():e.toolInput?this.currentToolInput=e.toolInput:e.input&&(this.currentToolInput=e.input),typeof e.init=="function"&&await e.init();}this.setupGlobalsListener(),this.connected=true;}setupGlobalsListener(){typeof window>"u"||(this.setGlobalsHandler=e=>{let n=e.detail;if(!n){this.readContextFromSDK(),this.checkForToolOutputUpdate();return}let o=n.globals??n,s=this.context.theme,a=this.context.locale,l=this.context.displayMode,p=this.currentToolOutput;if(o.theme!==void 0&&(this.context.theme=o.theme),o.locale!==void 0&&(this.context.locale=o.locale),o.displayMode!==void 0&&(this.context.displayMode=o.displayMode),(this.context.theme!==s||this.context.locale!==a||this.context.displayMode!==l)&&(i.debug("[OpenAI Adapter] Context changed, notifying handlers"),this.notifyContextChange()),o.toolOutput!==void 0&&o.toolOutput!==null){let u=o.toolOutput;if(Object.keys(u).length>0&&u!==p){i.debug("[OpenAI Adapter] Got toolOutput from set_globals event",u),this.currentToolOutput=u;let f;o.toolResponseMetadata&&typeof o.toolResponseMetadata=="object"&&o.toolResponseMetadata.toolName?f=o.toolResponseMetadata.toolName:f=this.getToolNameFromSDK();let v=f?{[f]:u}:u;for(let c of this.toolResultHandlers)c(v);}}o.toolInput!==void 0&&(this.currentToolInput=o.toolInput);},window.addEventListener("openai:set_globals",this.setGlobalsHandler),this.globalsHandler=e=>{this.isSetGlobalsMessage(e.data)&&(i.debug("[OpenAI Adapter] Received set_globals via postMessage (legacy)"),this.readContextFromSDK(),this.checkForToolOutputUpdate());},window.addEventListener("message",this.globalsHandler));}checkForToolOutputUpdate(){let e=this.getOpenAI();if(!e)return;let t;if(e.toolOutput&&(t=e.toolOutput),t&&Object.keys(t).length>0&&t!==this.currentToolOutput){i.debug("[OpenAI Adapter] toolOutput updated",t),this.currentToolOutput=t;let n=this.getToolNameFromSDK(),o=n?{[n]:t}:t;for(let s of this.toolResultHandlers)s(o);}}async waitForOpenAI(e=5e3){if(this.getOpenAI()){i.debug("[OpenAI Adapter] window.openai already available");return}return i.debug("[OpenAI Adapter] Waiting for window.openai..."),new Promise(t=>{let n=Date.now(),o=false,s=()=>{o||(o=true,window.removeEventListener("message",l),t());},a=()=>{if(!o){if(this.getOpenAI()){i.debug("[OpenAI Adapter] window.openai found via polling"),s();return}if(Date.now()-n>e){i.warn("[OpenAI Adapter] window.openai not found after timeout, proceeding anyway"),s();return}setTimeout(a,50);}},l=p=>{this.isSetGlobalsMessage(p.data)&&(i.debug("[OpenAI Adapter] Received set_globals message"),setTimeout(()=>{this.getOpenAI()?(i.debug("[OpenAI Adapter] window.openai available after set_globals"),s()):i.debug("[OpenAI Adapter] window.openai still not available after set_globals, continuing poll");},50));};window.addEventListener("message",l),a();})}isConnected(){return this.connected}async callTool(e,t){let n=this.getOpenAI();if(n&&typeof n.callTool=="function")return n.callTool(e,t);throw new Error("OpenAI SDK not available")}async sendMessage(e){let t=this.getOpenAI();t&&typeof t.sendMessage=="function"&&await t.sendMessage(e);}async openLink(e){let t=this.getOpenAI();t&&typeof t.openLink=="function"?await t.openLink(e):window.open(e,"_blank");}async requestDisplayMode(e){let t=this.getOpenAI();if(t&&typeof t.requestDisplayMode=="function"){let n=await t.requestDisplayMode({mode:e});return this.context={...this.context,displayMode:n.mode},this.notifyContextChange(),n}return this.context={...this.context,displayMode:e},this.notifyContextChange(),{mode:e}}requestClose(){let e=this.getOpenAI();e&&typeof e.close=="function"&&e.close();}getState(){return this.state}setState(e){this.state=e;let t=this.getOpenAI();t&&typeof t.setState=="function"&&t.setState(e);}async uploadFile(e){let t=this.getOpenAI();if(t&&typeof t.uploadFile=="function")return t.uploadFile(e);throw new Error("File upload not supported")}async getFileDownloadUrl(e){let t=this.getOpenAI();if(t&&typeof t.getFileDownloadUrl=="function")return t.getFileDownloadUrl(e);throw new Error("File download not supported")}async readResource(e){let t=this.getOpenAI();return t&&typeof t.readResource=="function"?t.readResource(e):{contents:[]}}log(e,t){({debug:console.debug,info:console.info,warning:console.warn,error:console.error}[e]??console.log)("[ChatGPT Apps]",t);}onToolResult(e){return this.toolResultHandlers.add(e),()=>this.toolResultHandlers.delete(e)}onToolInput(e){return this.toolInputHandlers.add(e),()=>this.toolInputHandlers.delete(e)}onToolCancelled(e){return this.toolCancelledHandlers.add(e),()=>this.toolCancelledHandlers.delete(e)}onHostContextChange(e){return this.hostContextHandlers.add(e),i.debug(`[OpenAI Adapter] Host context handler added, total: ${String(this.hostContextHandlers.size)}`),()=>{this.hostContextHandlers.delete(e),i.debug(`[OpenAI Adapter] Host context handler removed, total: ${String(this.hostContextHandlers.size)}`);}}onTeardown(e){return this.teardownHandlers.add(e),()=>this.teardownHandlers.delete(e)}getHostContext(){return this.context}getToolInput(){return this.currentToolInput}getToolOutput(){if(!this.currentToolOutput)return;let e=this.getToolNameFromSDK();return e?{[e]:this.currentToolOutput}:this.currentToolOutput}getToolMeta(){return this.currentToolMeta}getHostCapabilities(){let e=this.getOpenAI(),t=e&&typeof e.uploadFile=="function",n=this.context.safeAreaInsets!==void 0,o=this.context.view!==void 0;return {openLinks:{},logging:{},theming:{themes:["light","dark"]},displayModes:{modes:["inline","fullscreen","pip"]},statePersistence:{persistent:false},fileUpload:t?{}:void 0,safeAreaInsets:n?{}:void 0,views:o?{}:void 0}}getHostVersion(){}async sendLog(e,t){let o={level:{debug:"debug",info:"info",notice:"info",warning:"warn",error:"error",critical:"error",alert:"error",emergency:"error"}[e],message:typeof t=="string"?t:JSON.stringify(t),data:typeof t=="string"?void 0:t,timestamp:new Date().toISOString(),source:"openai-adapter"};await this.sendLogs([o]);}async sendLogs(e){if(this.logTransport==="api"&&this.logApiEndpoint&&!this.apiTransportFailed)try{let t=await fetch(this.logApiEndpoint,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({entries:e})});if(!t.ok)throw new Error(`API request failed with status ${String(t.status)}`);return await t.json()}catch(t){this.apiTransportFailed=true,i.info("[OpenAI Adapter] API log transport failed, trying fallback",{error:t instanceof Error?t.message:t});}if((this.logTransport==="tool"||this.apiTransportFailed)&&!this.toolTransportFailed&&this.connected)try{return await this.callTool("log_debug",{entries:e})}catch(t){this.toolTransportFailed=true,i.info("[OpenAI Adapter] Tool log transport failed, falling back to console",{error:t instanceof Error?t.message:t});}for(let t of e)this.log(t.level==="warn"?"warning":t.level,t.data??t.message);return {processed:e.length}}async sendSizeChanged(e){let t=this.getOpenAI();t&&typeof t.notifyIntrinsicHeight=="function"&&t.notifyIntrinsicHeight(e.height);}onToolInputPartial(e){return this.log("debug","onToolInputPartial is not supported on ChatGPT"),()=>{}}setCallToolHandler(e){this.log("debug","setCallToolHandler is not supported on ChatGPT");}setListToolsHandler(e){this.log("debug","setListToolsHandler is not supported on ChatGPT");}};function V(){let r=window.location.href;if(r.includes("/api/apps/chatgpt/")||r.includes("chatgpt")||r.includes("sandbox-proxy")||r.includes("widget-content"))return true;let e=document.referrer;return !!(e.includes("chatgpt")||e.includes("openai.com"))}function C(){return typeof window>"u"?"mock":"openai"in window||V()?"openai":window.parent!==window?"mcp":"mock"}function $(r){return new Proxy({},{get(e,t){if(typeof t!="string"||!t.startsWith("call"))return;let n=t.slice(4);if(n.length===0)return;let o=n.charAt(0).toLowerCase()+n.slice(1);return s=>r(o,s)},has(e,t){return typeof t=="string"&&t.startsWith("call")&&t.length>4},ownKeys(){return []},getOwnPropertyDescriptor(e,t){if(typeof t=="string"&&t.startsWith("call")&&t.length>4)return {configurable:true,enumerable:true,writable:false}}})}function b(r){async function e(o,s){return await r.callTool(o,s)}let t=$(e);return {callTool:e,tools:t,async sendMessage(o){await r.sendMessage(o);},async sendFollowUpMessage(o){await r.sendMessage({type:"text",text:o});},async openLink(o){await r.openLink(o);},async requestDisplayMode(o){return r.requestDisplayMode(o)},requestClose(){r.requestClose();},getState(){return r.getState()},setState(o){r.setState(o);},...r.uploadFile&&{uploadFile:o=>{if(r.uploadFile)return r.uploadFile(o);throw new Error("uploadFile not supported")}},...r.getFileDownloadUrl&&{getFileDownloadUrl:o=>{if(r.getFileDownloadUrl)return r.getFileDownloadUrl(o);throw new Error("getFileDownloadUrl not supported")}},async readResource(o){return r.readResource(o)},log(o,s){r.log(o,s);},onToolResult(o){return r.onToolResult(o)},onToolInput(o){return r.onToolInput(o)},onToolCancelled(o){return r.onToolCancelled(o)},onHostContextChange(o){return r.onHostContextChange(o)},onTeardown(o){return r.onTeardown(o)},onToolInputPartial(o){return r.onToolInputPartial(o)},getHostCapabilities(){return r.getHostCapabilities()},getHostVersion(){return r.getHostVersion()},async sendLog(o,s){return r.sendLog(o,s)},async sendSizeChanged(o){return r.sendSizeChanged(o)},setupSizeChangedNotifications(){if(typeof window>"u"||typeof ResizeObserver>"u")return ()=>{};let o=new ResizeObserver(s=>{for(let a of s){let{width:l,height:p}=a.contentRect;r.sendSizeChanged({width:Math.round(l),height:Math.round(p)});}});return o.observe(document.body),()=>{o.disconnect();}},setCallToolHandler(o){r.setCallToolHandler(o);},setListToolsHandler(o){r.setListToolsHandler(o);},get hostContext(){return r.getHostContext()},get toolInput(){return r.getToolInput()},get toolOutput(){return r.getToolOutput()},get toolMeta(){return r.getToolMeta()}}}function K(r){switch(r){case "mcp":return new m;case "openai":return new w;case "mock":return new h;default:throw new Error(`Unknown adapter type: ${r}`)}}async function fe(r){let e=r?.forceAdapter??C();if(!["mcp","openai","mock"].includes(e))throw new Error(`Unknown adapter type: ${e}`);let t=K(e);return await t.connect(),i.setAdapter(t),b(t)}exports.ClientDebugLogger=y;exports.LATEST_PROTOCOL_VERSION=D;exports.McpAdapter=m;exports.MockAdapter=h;exports.OpenAIAdapter=w;exports.RESOURCE_MIME_TYPE=_;exports.RESOURCE_URI_META_KEY=F;exports.UIError=d;exports.UIErrorCode=g;exports.applyDocumentTheme=x;exports.applyHostFonts=A;exports.applyHostStyleVariables=H;exports.clearHostStyleVariables=I;exports.clientDebugLogger=i;exports.createAppsClient=b;exports.createClient=fe;exports.detectProtocol=C;exports.getDocumentTheme=k;exports.getMcpServerBaseUrl=N;exports.getMcpServerConfig=L;exports.removeHostFonts=O;exports.safeSerialize=E;exports.safeStringify=P;exports.shouldLog=S;//# sourceMappingURL=index.cjs.map
//# sourceMappingURL=index.cjs.map

@@ -751,2 +751,224 @@ /**

/**
* Client-side Debug Logger
*
* Provides debug logging for MCP Apps client UIs that batches logs
* and transports them through the MCP protocol to bypass sandbox restrictions.
*
* @module debug/logger
*/
/**
* Log level for debug logging
*
* @internal
*/
type DebugLogLevel = "debug" | "info" | "warn" | "error";
/**
* Debug log transport mechanism
*
* - `"builtin"`: Use MCP protocol-level logging (default for MCP adapter)
* - `"tool"`: Use the log_debug MCP tool
* - `"api"`: Use HTTP endpoint (default for OpenAI adapter)
*
* @internal
*/
type DebugTransport = "builtin" | "tool" | "api";
/**
* A single log entry
*
* @internal
*/
interface LogEntry {
/** Log level */
level: DebugLogLevel;
/** Log message */
message: string;
/** Optional structured data */
data?: unknown;
/** ISO 8601 timestamp */
timestamp: string;
/** Optional source identifier */
source?: string;
}
/**
* Debug configuration for the client logger
*
* @internal
*/
interface ClientDebugConfig {
/**
* Enable debug logging via MCP transport
* @default false
*/
enabled?: boolean;
/**
* Minimum log level to output
* @default "info"
*/
level?: DebugLogLevel;
/**
* Number of logs to batch before flushing
* @default 10
*/
batchSize?: number;
/**
* Maximum buffer size to prevent memory overflow.
* When exceeded, oldest entries are dropped.
* @default 100
*/
maxBufferSize?: number;
/**
* Maximum time in milliseconds between flushes
* @default 5000
*/
flushIntervalMs?: number;
/**
* Source identifier for log entries
* @default "mcp-apps-ui"
*/
source?: string;
/**
* Log transport mechanism.
*
* - `"builtin"`: Use MCP protocol-level logging (default for MCP adapter)
* - `"tool"`: Use the log_debug MCP tool
* - `"api"`: Use HTTP endpoint (default for OpenAI adapter)
*
* @default "tool"
*/
transport?: DebugTransport;
/**
* API endpoint URL for 'api' transport.
*
* This is the full URL where logs will be sent via HTTP POST.
* Only used when `transport` is set to `"api"`.
*
* @example "https://myapp.example.com/api/logs"
*/
apiEndpoint?: string;
}
/**
* Check if a log level should be output given the minimum level
*
* @internal
*/
declare function shouldLog(level: DebugLogLevel, minLevel: DebugLogLevel): boolean;
/**
* Safely serialize data for transport, handling circular references
*
* @internal
*/
declare function safeSerialize(data: unknown): unknown;
/**
* Safely stringify data for console output
*
* @internal
*/
declare function safeStringify(data: unknown): string;
declare class ClientDebugLogger {
private adapter;
private config;
private buffer;
private flushTimer;
private isFlushing;
private mcpTransportFailed;
private apiTransportFailed;
/**
* Create a client debug logger
*
* @param config - Debug configuration
*/
constructor(config?: ClientDebugConfig);
/**
* Set the protocol adapter for MCP transport
*
* Must be called after the adapter is connected for
* logs to be transported through MCP.
*
* Note: Setting a new adapter resets the transport failure state,
* allowing MCP transport to be retried with the new adapter.
*/
setAdapter(adapter: ProtocolAdapter): void;
/**
* Configure the logger
*/
configure(config: Partial<ClientDebugConfig>): void;
/**
* Check if MCP tool transport is enabled and available
*/
private canUseToolTransport;
/**
* Check if API transport is enabled and available
*/
private canUseApiTransport;
/**
* Check if any remote transport is available
*/
private canUseRemoteTransport;
/**
* Create a log entry
*/
private createEntry;
/**
* Schedule a flush if not already scheduled
*/
private scheduleFlush;
/**
* Flush logs to the API endpoint
*/
private flushToApi;
/**
* Flush logs to the MCP tool
*/
private flushToTool;
/**
* Flush all buffered logs to the server
*/
flush(): Promise<void>;
/**
* Output a log entry to the console
*/
private outputToConsole;
/**
* Add a log entry to the buffer
*/
private addToBuffer;
/**
* Log a message
*/
private log;
/**
* Log a debug message
*/
debug(message: string, data?: unknown): void;
/**
* Log an info message
*/
info(message: string, data?: unknown): void;
/**
* Log a warning message
*/
warn(message: string, data?: unknown): void;
/**
* Log an error message
*/
error(message: string, data?: unknown): void;
/**
* Cleanup resources
*
* Call this when the client is being destroyed.
*/
destroy(): void;
}
/**
* Global client debug logger instance
*
* Use this for logging in UI components. Configure it after
* connecting to the MCP server.
*
* @internal
*/
declare const clientDebugLogger: ClientDebugLogger;
/**
* Protocol adapter type definitions for @mcp-apps-kit/ui

@@ -940,2 +1162,14 @@ *

/**
* Send batched log entries to the server
*
* Optional method for adapters that support batch logging.
* When not implemented, falls back to multiple sendLog calls.
*
* @param entries - Array of log entries to send
* @returns Number of entries processed
*/
sendLogs?(entries: LogEntry[]): Promise<{
processed: number;
}>;
/**
* Send size changed notification to host

@@ -980,191 +1214,86 @@ *

/**
* Client-side Debug Logger
* Server configuration access for MCP UIs
*
* Provides debug logging for MCP Apps client UIs that batches logs
* and transports them through the MCP protocol to bypass sandbox restrictions.
* Provides access to server configuration that was injected at build time
* by the @mcp-apps-kit/ui-react-builder vite plugin.
*
* @module debug/logger
*/
/**
* Log level for debug logging
* @example
* ```typescript
* import { getMcpServerConfig, getMcpServerBaseUrl } from "@mcp-apps-kit/ui";
*
* @internal
*/
type DebugLogLevel = "debug" | "info" | "warn" | "error";
/**
* A single log entry
* // Get the full config object
* const config = getMcpServerConfig();
* console.log(config.baseUrl);
*
* @internal
* // Or just get the base URL (with fallback)
* const baseUrl = getMcpServerBaseUrl("http://localhost:3000");
* ```
*/
interface LogEntry {
/** Log level */
level: DebugLogLevel;
/** Log message */
message: string;
/** Optional structured data */
data?: unknown;
/** ISO 8601 timestamp */
timestamp: string;
/** Optional source identifier */
source?: string;
}
/**
* Debug configuration for the client logger
*
* @internal
* Server configuration type matching McpServerConfig from the vite plugin.
*/
interface ClientDebugConfig {
type McpServerConfig = {
/**
* Enable debug logging via MCP transport
* @default false
* Base URL of the MCP server.
* @example "http://localhost:3000"
*/
enabled?: boolean;
baseUrl?: string;
/**
* Minimum log level to output
* @default "info"
* Additional custom configuration values.
*/
level?: DebugLogLevel;
/**
* Number of logs to batch before flushing
* @default 10
*/
batchSize?: number;
/**
* Maximum buffer size to prevent memory overflow.
* When exceeded, oldest entries are dropped.
* @default 100
*/
maxBufferSize?: number;
/**
* Maximum time in milliseconds between flushes
* @default 5000
*/
flushIntervalMs?: number;
/**
* Source identifier for log entries
* @default "mcp-apps-ui"
*/
source?: string;
}
[key: string]: unknown;
};
/**
* Check if a log level should be output given the minimum level
*
* @internal
* Declare the global variable that can be injected either:
* - At build time by the vite plugin (esbuild define)
* - At runtime by the server (window.__MCP_SERVER_CONFIG__)
*/
declare function shouldLog(level: DebugLogLevel, minLevel: DebugLogLevel): boolean;
declare global {
const __MCP_SERVER_CONFIG__: McpServerConfig | undefined;
interface Window {
__MCP_SERVER_CONFIG__?: McpServerConfig;
}
}
/**
* Safely serialize data for transport, handling circular references
* Get the server configuration.
*
* @internal
*/
declare function safeSerialize(data: unknown): unknown;
/**
* Safely stringify data for console output
* Checks for configuration in this order:
* 1. Runtime injection via `window.__MCP_SERVER_CONFIG__` (server-side injection)
* 2. Build-time injection via global `__MCP_SERVER_CONFIG__` (vite plugin)
*
* @internal
* Returns an empty object if no config was injected.
*
* @returns The server configuration object
*
* @example
* ```typescript
* const config = getMcpServerConfig();
* if (config.baseUrl) {
* fetch(`${config.baseUrl}/api/logs`, { ... });
* }
* ```
*/
declare function safeStringify(data: unknown): string;
declare function getMcpServerConfig(): McpServerConfig;
/**
* Client-side Debug Logger
* Get the server base URL from injected config.
*
* Batches log entries and transports them through the MCP protocol
* to the server, bypassing sandbox restrictions.
* Convenience function that extracts just the base URL from the config.
* Falls back to `window.location.origin` if available, or the provided default.
*
* Features:
* - Intelligent batching with configurable batch size and flush interval
* - Immediate flushing for error-level logs
* - Circular reference handling
* - Fallback to console when not connected
* - Graceful degradation in restricted environments
* @param defaultUrl - Fallback URL if not configured and window.location unavailable
* @returns The server base URL
*
* @internal
*/
declare class ClientDebugLogger {
private adapter;
private config;
private buffer;
private flushTimer;
private isFlushing;
private mcpTransportFailed;
/**
* Create a client debug logger
*
* @param config - Debug configuration
*/
constructor(config?: ClientDebugConfig);
/**
* Set the protocol adapter for MCP transport
*
* Must be called after the adapter is connected for
* logs to be transported through MCP.
*
* Note: Setting a new adapter resets the transport failure state,
* allowing MCP transport to be retried with the new adapter.
*/
setAdapter(adapter: ProtocolAdapter): void;
/**
* Configure the logger
*/
configure(config: Partial<ClientDebugConfig>): void;
/**
* Check if MCP transport is enabled and available
*/
private canUseMcpTransport;
/**
* Create a log entry
*/
private createEntry;
/**
* Schedule a flush if not already scheduled
*/
private scheduleFlush;
/**
* Flush all buffered logs to the server
*/
flush(): Promise<void>;
/**
* Output a log entry to the console
*/
private outputToConsole;
/**
* Add a log entry to the buffer
*/
private addToBuffer;
/**
* Log a message
*/
private log;
/**
* Log a debug message
*/
debug(message: string, data?: unknown): void;
/**
* Log an info message
*/
info(message: string, data?: unknown): void;
/**
* Log a warning message
*/
warn(message: string, data?: unknown): void;
/**
* Log an error message
*/
error(message: string, data?: unknown): void;
/**
* Cleanup resources
*
* Call this when the client is being destroyed.
*/
destroy(): void;
}
/**
* Global client debug logger instance
* @example
* ```typescript
* // Uses injected config, then window.location.origin, then the fallback
* const baseUrl = getMcpServerBaseUrl("http://localhost:3000");
*
* Use this for logging in UI components. Configure it after
* connecting to the MCP server.
*
* @internal
* // Configure debug logger with dynamic base URL
* clientDebugLogger.configure({
* transport: "api",
* apiEndpoint: `${getMcpServerBaseUrl()}/api/logs`,
* });
* ```
*/
declare const clientDebugLogger: ClientDebugLogger;
declare function getMcpServerBaseUrl(defaultUrl?: string): string;

@@ -1264,2 +1393,11 @@ /**

sendLog(level: "debug" | "info" | "notice" | "warning" | "error" | "critical" | "alert" | "emergency", data: unknown): Promise<void>;
sendLogs(entries: Array<{
level: "debug" | "info" | "warn" | "error";
message: string;
data?: unknown;
timestamp: string;
source?: string;
}>): Promise<{
processed: number;
}>;
sendSizeChanged(params: SizeChangedParams): Promise<void>;

@@ -1363,2 +1501,17 @@ onToolInputPartial(handler: (input: unknown) => void): () => void;

sendLog(level: "debug" | "info" | "notice" | "warning" | "error" | "critical" | "alert" | "emergency", data: unknown): Promise<void>;
/**
* Send batched log entries via protocol-level logging
*
* MCP adapter uses the builtin sendLog for each entry since
* the MCP protocol supports individual log messages.
*/
sendLogs(entries: Array<{
level: "debug" | "info" | "warn" | "error";
message: string;
data?: unknown;
timestamp: string;
source?: string;
}>): Promise<{
processed: number;
}>;
sendSizeChanged(params: SizeChangedParams): Promise<void>;

@@ -1380,9 +1533,19 @@ onToolInputPartial(handler: (input: unknown) => void): () => void;

/**
* Adapter for ChatGPT Apps (OpenAI)
*
* Supports session-scoped state persistence.
* Integrates with the OpenAI Apps SDK.
*
* @internal
* Configuration options for OpenAI adapter logging
*/
interface OpenAIAdapterLogConfig {
/**
* Log transport mechanism.
* - 'api': Use HTTP endpoint (default)
* - 'tool': Use the log_debug MCP tool
* - 'builtin': Not supported for OpenAI, falls back to console
* @default 'api'
*/
transport?: DebugTransport;
/**
* API endpoint URL for 'api' transport.
* Required when transport is 'api'.
*/
apiEndpoint?: string;
}
declare class OpenAIAdapter implements ProtocolAdapter {

@@ -1401,5 +1564,23 @@ private connected;

private globalsHandler?;
private logTransport;
private logApiEndpoint?;
private apiTransportFailed;
private toolTransportFailed;
constructor();
/**
* Configure logging transport settings
*
* @param config - Logging configuration
*/
configureLogging(config: OpenAIAdapterLogConfig): void;
private createDefaultContext;
/**
* Check if a message event data represents an openai:set_globals message.
* Handles multiple formats for backward compatibility:
* - String format: "openai:set_globals"
* - Object with type: { type: "openai:set_globals" }
* - Object with message: { message: "openai:set_globals" } (older SDK versions)
*/
private isSetGlobalsMessage;
/**
* Read current context from the OpenAI SDK globals

@@ -1421,6 +1602,18 @@ * Properties available: theme, displayMode, maxHeight, safeArea, view, userAgent, locale

/**
* Set up listener for openai:set_globals messages
* The host fires these events when context values change (theme, locale, etc.)
* Custom event handler for openai:set_globals
*/
private setGlobalsHandler?;
/**
* Set up listener for openai:set_globals custom DOM event
* The host fires these events when global values change (theme, locale, toolOutput, etc.)
*
* Handles two formats:
* - ChatGPT: event.detail.globals.toolOutput (nested under globals)
* - MCP Inspector: event.detail.toolOutput (flat, no globals wrapper)
*/
private setupGlobalsListener;
/**
* Check if toolOutput has been updated and notify handlers
*/
private checkForToolOutputUpdate;
private waitForOpenAI;

@@ -1462,2 +1655,11 @@ isConnected(): boolean;

sendLog(level: "debug" | "info" | "notice" | "warning" | "error" | "critical" | "alert" | "emergency", data: unknown): Promise<void>;
/**
* Send batched log entries to the server
*
* @param entries - Array of log entries to send
* @returns Number of entries processed
*/
sendLogs(entries: LogEntry[]): Promise<{
processed: number;
}>;
sendSizeChanged(params: SizeChangedParams): Promise<void>;

@@ -1551,2 +1753,2 @@ onToolInputPartial(_handler: (input: unknown) => void): () => void;

export { type AdapterFactory, type AdapterType, type AppCapabilities, type AppToolDefinition, type AppsClient, type CallToolHandler, type ClientDebugConfig, ClientDebugLogger, type CreateClientOptions, type DebugLogLevel, type DetectedProtocol, type DeviceCapabilities, type HostCapabilities, type HostContext, type HostStyles, type HostVersion, type InferToolInputs, type InferToolOutputs, LATEST_PROTOCOL_VERSION, type ListToolsHandler, type LogEntry, McpAdapter, MockAdapter, type ModalButton, type ModalInput, type ModalOptions, type ModalResult, OpenAIAdapter, type ProtocolAdapter, RESOURCE_MIME_TYPE, RESOURCE_URI_META_KEY, type ResourceContent, type SafeAreaInsets, type SizeChangedParams, type Theme, type ToolDefs, type ToolMethods, type ToolResult, UIError, UIErrorCode, type UIErrorCodeType, type Viewport, applyDocumentTheme, applyHostFonts, applyHostStyleVariables, clearHostStyleVariables, clientDebugLogger, createAppsClient, createClient, detectProtocol, getDocumentTheme, removeHostFonts, safeSerialize, safeStringify, shouldLog };
export { type AdapterFactory, type AdapterType, type AppCapabilities, type AppToolDefinition, type AppsClient, type CallToolHandler, type ClientDebugConfig, ClientDebugLogger, type CreateClientOptions, type DebugLogLevel, type DebugTransport, type DetectedProtocol, type DeviceCapabilities, type HostCapabilities, type HostContext, type HostStyles, type HostVersion, type InferToolInputs, type InferToolOutputs, LATEST_PROTOCOL_VERSION, type ListToolsHandler, type LogEntry, McpAdapter, type McpServerConfig, MockAdapter, type ModalButton, type ModalInput, type ModalOptions, type ModalResult, OpenAIAdapter, type ProtocolAdapter, RESOURCE_MIME_TYPE, RESOURCE_URI_META_KEY, type ResourceContent, type SafeAreaInsets, type SizeChangedParams, type Theme, type ToolDefs, type ToolMethods, type ToolResult, UIError, UIErrorCode, type UIErrorCodeType, type Viewport, applyDocumentTheme, applyHostFonts, applyHostStyleVariables, clearHostStyleVariables, clientDebugLogger, createAppsClient, createClient, detectProtocol, getDocumentTheme, getMcpServerBaseUrl, getMcpServerConfig, removeHostFonts, safeSerialize, safeStringify, shouldLog };

@@ -751,2 +751,224 @@ /**

/**
* Client-side Debug Logger
*
* Provides debug logging for MCP Apps client UIs that batches logs
* and transports them through the MCP protocol to bypass sandbox restrictions.
*
* @module debug/logger
*/
/**
* Log level for debug logging
*
* @internal
*/
type DebugLogLevel = "debug" | "info" | "warn" | "error";
/**
* Debug log transport mechanism
*
* - `"builtin"`: Use MCP protocol-level logging (default for MCP adapter)
* - `"tool"`: Use the log_debug MCP tool
* - `"api"`: Use HTTP endpoint (default for OpenAI adapter)
*
* @internal
*/
type DebugTransport = "builtin" | "tool" | "api";
/**
* A single log entry
*
* @internal
*/
interface LogEntry {
/** Log level */
level: DebugLogLevel;
/** Log message */
message: string;
/** Optional structured data */
data?: unknown;
/** ISO 8601 timestamp */
timestamp: string;
/** Optional source identifier */
source?: string;
}
/**
* Debug configuration for the client logger
*
* @internal
*/
interface ClientDebugConfig {
/**
* Enable debug logging via MCP transport
* @default false
*/
enabled?: boolean;
/**
* Minimum log level to output
* @default "info"
*/
level?: DebugLogLevel;
/**
* Number of logs to batch before flushing
* @default 10
*/
batchSize?: number;
/**
* Maximum buffer size to prevent memory overflow.
* When exceeded, oldest entries are dropped.
* @default 100
*/
maxBufferSize?: number;
/**
* Maximum time in milliseconds between flushes
* @default 5000
*/
flushIntervalMs?: number;
/**
* Source identifier for log entries
* @default "mcp-apps-ui"
*/
source?: string;
/**
* Log transport mechanism.
*
* - `"builtin"`: Use MCP protocol-level logging (default for MCP adapter)
* - `"tool"`: Use the log_debug MCP tool
* - `"api"`: Use HTTP endpoint (default for OpenAI adapter)
*
* @default "tool"
*/
transport?: DebugTransport;
/**
* API endpoint URL for 'api' transport.
*
* This is the full URL where logs will be sent via HTTP POST.
* Only used when `transport` is set to `"api"`.
*
* @example "https://myapp.example.com/api/logs"
*/
apiEndpoint?: string;
}
/**
* Check if a log level should be output given the minimum level
*
* @internal
*/
declare function shouldLog(level: DebugLogLevel, minLevel: DebugLogLevel): boolean;
/**
* Safely serialize data for transport, handling circular references
*
* @internal
*/
declare function safeSerialize(data: unknown): unknown;
/**
* Safely stringify data for console output
*
* @internal
*/
declare function safeStringify(data: unknown): string;
declare class ClientDebugLogger {
private adapter;
private config;
private buffer;
private flushTimer;
private isFlushing;
private mcpTransportFailed;
private apiTransportFailed;
/**
* Create a client debug logger
*
* @param config - Debug configuration
*/
constructor(config?: ClientDebugConfig);
/**
* Set the protocol adapter for MCP transport
*
* Must be called after the adapter is connected for
* logs to be transported through MCP.
*
* Note: Setting a new adapter resets the transport failure state,
* allowing MCP transport to be retried with the new adapter.
*/
setAdapter(adapter: ProtocolAdapter): void;
/**
* Configure the logger
*/
configure(config: Partial<ClientDebugConfig>): void;
/**
* Check if MCP tool transport is enabled and available
*/
private canUseToolTransport;
/**
* Check if API transport is enabled and available
*/
private canUseApiTransport;
/**
* Check if any remote transport is available
*/
private canUseRemoteTransport;
/**
* Create a log entry
*/
private createEntry;
/**
* Schedule a flush if not already scheduled
*/
private scheduleFlush;
/**
* Flush logs to the API endpoint
*/
private flushToApi;
/**
* Flush logs to the MCP tool
*/
private flushToTool;
/**
* Flush all buffered logs to the server
*/
flush(): Promise<void>;
/**
* Output a log entry to the console
*/
private outputToConsole;
/**
* Add a log entry to the buffer
*/
private addToBuffer;
/**
* Log a message
*/
private log;
/**
* Log a debug message
*/
debug(message: string, data?: unknown): void;
/**
* Log an info message
*/
info(message: string, data?: unknown): void;
/**
* Log a warning message
*/
warn(message: string, data?: unknown): void;
/**
* Log an error message
*/
error(message: string, data?: unknown): void;
/**
* Cleanup resources
*
* Call this when the client is being destroyed.
*/
destroy(): void;
}
/**
* Global client debug logger instance
*
* Use this for logging in UI components. Configure it after
* connecting to the MCP server.
*
* @internal
*/
declare const clientDebugLogger: ClientDebugLogger;
/**
* Protocol adapter type definitions for @mcp-apps-kit/ui

@@ -940,2 +1162,14 @@ *

/**
* Send batched log entries to the server
*
* Optional method for adapters that support batch logging.
* When not implemented, falls back to multiple sendLog calls.
*
* @param entries - Array of log entries to send
* @returns Number of entries processed
*/
sendLogs?(entries: LogEntry[]): Promise<{
processed: number;
}>;
/**
* Send size changed notification to host

@@ -980,191 +1214,86 @@ *

/**
* Client-side Debug Logger
* Server configuration access for MCP UIs
*
* Provides debug logging for MCP Apps client UIs that batches logs
* and transports them through the MCP protocol to bypass sandbox restrictions.
* Provides access to server configuration that was injected at build time
* by the @mcp-apps-kit/ui-react-builder vite plugin.
*
* @module debug/logger
*/
/**
* Log level for debug logging
* @example
* ```typescript
* import { getMcpServerConfig, getMcpServerBaseUrl } from "@mcp-apps-kit/ui";
*
* @internal
*/
type DebugLogLevel = "debug" | "info" | "warn" | "error";
/**
* A single log entry
* // Get the full config object
* const config = getMcpServerConfig();
* console.log(config.baseUrl);
*
* @internal
* // Or just get the base URL (with fallback)
* const baseUrl = getMcpServerBaseUrl("http://localhost:3000");
* ```
*/
interface LogEntry {
/** Log level */
level: DebugLogLevel;
/** Log message */
message: string;
/** Optional structured data */
data?: unknown;
/** ISO 8601 timestamp */
timestamp: string;
/** Optional source identifier */
source?: string;
}
/**
* Debug configuration for the client logger
*
* @internal
* Server configuration type matching McpServerConfig from the vite plugin.
*/
interface ClientDebugConfig {
type McpServerConfig = {
/**
* Enable debug logging via MCP transport
* @default false
* Base URL of the MCP server.
* @example "http://localhost:3000"
*/
enabled?: boolean;
baseUrl?: string;
/**
* Minimum log level to output
* @default "info"
* Additional custom configuration values.
*/
level?: DebugLogLevel;
/**
* Number of logs to batch before flushing
* @default 10
*/
batchSize?: number;
/**
* Maximum buffer size to prevent memory overflow.
* When exceeded, oldest entries are dropped.
* @default 100
*/
maxBufferSize?: number;
/**
* Maximum time in milliseconds between flushes
* @default 5000
*/
flushIntervalMs?: number;
/**
* Source identifier for log entries
* @default "mcp-apps-ui"
*/
source?: string;
}
[key: string]: unknown;
};
/**
* Check if a log level should be output given the minimum level
*
* @internal
* Declare the global variable that can be injected either:
* - At build time by the vite plugin (esbuild define)
* - At runtime by the server (window.__MCP_SERVER_CONFIG__)
*/
declare function shouldLog(level: DebugLogLevel, minLevel: DebugLogLevel): boolean;
declare global {
const __MCP_SERVER_CONFIG__: McpServerConfig | undefined;
interface Window {
__MCP_SERVER_CONFIG__?: McpServerConfig;
}
}
/**
* Safely serialize data for transport, handling circular references
* Get the server configuration.
*
* @internal
*/
declare function safeSerialize(data: unknown): unknown;
/**
* Safely stringify data for console output
* Checks for configuration in this order:
* 1. Runtime injection via `window.__MCP_SERVER_CONFIG__` (server-side injection)
* 2. Build-time injection via global `__MCP_SERVER_CONFIG__` (vite plugin)
*
* @internal
* Returns an empty object if no config was injected.
*
* @returns The server configuration object
*
* @example
* ```typescript
* const config = getMcpServerConfig();
* if (config.baseUrl) {
* fetch(`${config.baseUrl}/api/logs`, { ... });
* }
* ```
*/
declare function safeStringify(data: unknown): string;
declare function getMcpServerConfig(): McpServerConfig;
/**
* Client-side Debug Logger
* Get the server base URL from injected config.
*
* Batches log entries and transports them through the MCP protocol
* to the server, bypassing sandbox restrictions.
* Convenience function that extracts just the base URL from the config.
* Falls back to `window.location.origin` if available, or the provided default.
*
* Features:
* - Intelligent batching with configurable batch size and flush interval
* - Immediate flushing for error-level logs
* - Circular reference handling
* - Fallback to console when not connected
* - Graceful degradation in restricted environments
* @param defaultUrl - Fallback URL if not configured and window.location unavailable
* @returns The server base URL
*
* @internal
*/
declare class ClientDebugLogger {
private adapter;
private config;
private buffer;
private flushTimer;
private isFlushing;
private mcpTransportFailed;
/**
* Create a client debug logger
*
* @param config - Debug configuration
*/
constructor(config?: ClientDebugConfig);
/**
* Set the protocol adapter for MCP transport
*
* Must be called after the adapter is connected for
* logs to be transported through MCP.
*
* Note: Setting a new adapter resets the transport failure state,
* allowing MCP transport to be retried with the new adapter.
*/
setAdapter(adapter: ProtocolAdapter): void;
/**
* Configure the logger
*/
configure(config: Partial<ClientDebugConfig>): void;
/**
* Check if MCP transport is enabled and available
*/
private canUseMcpTransport;
/**
* Create a log entry
*/
private createEntry;
/**
* Schedule a flush if not already scheduled
*/
private scheduleFlush;
/**
* Flush all buffered logs to the server
*/
flush(): Promise<void>;
/**
* Output a log entry to the console
*/
private outputToConsole;
/**
* Add a log entry to the buffer
*/
private addToBuffer;
/**
* Log a message
*/
private log;
/**
* Log a debug message
*/
debug(message: string, data?: unknown): void;
/**
* Log an info message
*/
info(message: string, data?: unknown): void;
/**
* Log a warning message
*/
warn(message: string, data?: unknown): void;
/**
* Log an error message
*/
error(message: string, data?: unknown): void;
/**
* Cleanup resources
*
* Call this when the client is being destroyed.
*/
destroy(): void;
}
/**
* Global client debug logger instance
* @example
* ```typescript
* // Uses injected config, then window.location.origin, then the fallback
* const baseUrl = getMcpServerBaseUrl("http://localhost:3000");
*
* Use this for logging in UI components. Configure it after
* connecting to the MCP server.
*
* @internal
* // Configure debug logger with dynamic base URL
* clientDebugLogger.configure({
* transport: "api",
* apiEndpoint: `${getMcpServerBaseUrl()}/api/logs`,
* });
* ```
*/
declare const clientDebugLogger: ClientDebugLogger;
declare function getMcpServerBaseUrl(defaultUrl?: string): string;

@@ -1264,2 +1393,11 @@ /**

sendLog(level: "debug" | "info" | "notice" | "warning" | "error" | "critical" | "alert" | "emergency", data: unknown): Promise<void>;
sendLogs(entries: Array<{
level: "debug" | "info" | "warn" | "error";
message: string;
data?: unknown;
timestamp: string;
source?: string;
}>): Promise<{
processed: number;
}>;
sendSizeChanged(params: SizeChangedParams): Promise<void>;

@@ -1363,2 +1501,17 @@ onToolInputPartial(handler: (input: unknown) => void): () => void;

sendLog(level: "debug" | "info" | "notice" | "warning" | "error" | "critical" | "alert" | "emergency", data: unknown): Promise<void>;
/**
* Send batched log entries via protocol-level logging
*
* MCP adapter uses the builtin sendLog for each entry since
* the MCP protocol supports individual log messages.
*/
sendLogs(entries: Array<{
level: "debug" | "info" | "warn" | "error";
message: string;
data?: unknown;
timestamp: string;
source?: string;
}>): Promise<{
processed: number;
}>;
sendSizeChanged(params: SizeChangedParams): Promise<void>;

@@ -1380,9 +1533,19 @@ onToolInputPartial(handler: (input: unknown) => void): () => void;

/**
* Adapter for ChatGPT Apps (OpenAI)
*
* Supports session-scoped state persistence.
* Integrates with the OpenAI Apps SDK.
*
* @internal
* Configuration options for OpenAI adapter logging
*/
interface OpenAIAdapterLogConfig {
/**
* Log transport mechanism.
* - 'api': Use HTTP endpoint (default)
* - 'tool': Use the log_debug MCP tool
* - 'builtin': Not supported for OpenAI, falls back to console
* @default 'api'
*/
transport?: DebugTransport;
/**
* API endpoint URL for 'api' transport.
* Required when transport is 'api'.
*/
apiEndpoint?: string;
}
declare class OpenAIAdapter implements ProtocolAdapter {

@@ -1401,5 +1564,23 @@ private connected;

private globalsHandler?;
private logTransport;
private logApiEndpoint?;
private apiTransportFailed;
private toolTransportFailed;
constructor();
/**
* Configure logging transport settings
*
* @param config - Logging configuration
*/
configureLogging(config: OpenAIAdapterLogConfig): void;
private createDefaultContext;
/**
* Check if a message event data represents an openai:set_globals message.
* Handles multiple formats for backward compatibility:
* - String format: "openai:set_globals"
* - Object with type: { type: "openai:set_globals" }
* - Object with message: { message: "openai:set_globals" } (older SDK versions)
*/
private isSetGlobalsMessage;
/**
* Read current context from the OpenAI SDK globals

@@ -1421,6 +1602,18 @@ * Properties available: theme, displayMode, maxHeight, safeArea, view, userAgent, locale

/**
* Set up listener for openai:set_globals messages
* The host fires these events when context values change (theme, locale, etc.)
* Custom event handler for openai:set_globals
*/
private setGlobalsHandler?;
/**
* Set up listener for openai:set_globals custom DOM event
* The host fires these events when global values change (theme, locale, toolOutput, etc.)
*
* Handles two formats:
* - ChatGPT: event.detail.globals.toolOutput (nested under globals)
* - MCP Inspector: event.detail.toolOutput (flat, no globals wrapper)
*/
private setupGlobalsListener;
/**
* Check if toolOutput has been updated and notify handlers
*/
private checkForToolOutputUpdate;
private waitForOpenAI;

@@ -1462,2 +1655,11 @@ isConnected(): boolean;

sendLog(level: "debug" | "info" | "notice" | "warning" | "error" | "critical" | "alert" | "emergency", data: unknown): Promise<void>;
/**
* Send batched log entries to the server
*
* @param entries - Array of log entries to send
* @returns Number of entries processed
*/
sendLogs(entries: LogEntry[]): Promise<{
processed: number;
}>;
sendSizeChanged(params: SizeChangedParams): Promise<void>;

@@ -1551,2 +1753,2 @@ onToolInputPartial(_handler: (input: unknown) => void): () => void;

export { type AdapterFactory, type AdapterType, type AppCapabilities, type AppToolDefinition, type AppsClient, type CallToolHandler, type ClientDebugConfig, ClientDebugLogger, type CreateClientOptions, type DebugLogLevel, type DetectedProtocol, type DeviceCapabilities, type HostCapabilities, type HostContext, type HostStyles, type HostVersion, type InferToolInputs, type InferToolOutputs, LATEST_PROTOCOL_VERSION, type ListToolsHandler, type LogEntry, McpAdapter, MockAdapter, type ModalButton, type ModalInput, type ModalOptions, type ModalResult, OpenAIAdapter, type ProtocolAdapter, RESOURCE_MIME_TYPE, RESOURCE_URI_META_KEY, type ResourceContent, type SafeAreaInsets, type SizeChangedParams, type Theme, type ToolDefs, type ToolMethods, type ToolResult, UIError, UIErrorCode, type UIErrorCodeType, type Viewport, applyDocumentTheme, applyHostFonts, applyHostStyleVariables, clearHostStyleVariables, clientDebugLogger, createAppsClient, createClient, detectProtocol, getDocumentTheme, removeHostFonts, safeSerialize, safeStringify, shouldLog };
export { type AdapterFactory, type AdapterType, type AppCapabilities, type AppToolDefinition, type AppsClient, type CallToolHandler, type ClientDebugConfig, ClientDebugLogger, type CreateClientOptions, type DebugLogLevel, type DebugTransport, type DetectedProtocol, type DeviceCapabilities, type HostCapabilities, type HostContext, type HostStyles, type HostVersion, type InferToolInputs, type InferToolOutputs, LATEST_PROTOCOL_VERSION, type ListToolsHandler, type LogEntry, McpAdapter, type McpServerConfig, MockAdapter, type ModalButton, type ModalInput, type ModalOptions, type ModalResult, OpenAIAdapter, type ProtocolAdapter, RESOURCE_MIME_TYPE, RESOURCE_URI_META_KEY, type ResourceContent, type SafeAreaInsets, type SizeChangedParams, type Theme, type ToolDefs, type ToolMethods, type ToolResult, UIError, UIErrorCode, type UIErrorCodeType, type Viewport, applyDocumentTheme, applyHostFonts, applyHostStyleVariables, clearHostStyleVariables, clientDebugLogger, createAppsClient, createClient, detectProtocol, getDocumentTheme, getMcpServerBaseUrl, getMcpServerConfig, removeHostFonts, safeSerialize, safeStringify, shouldLog };

@@ -1,2 +0,2 @@

import {App}from'@modelcontextprotocol/ext-apps';var L="2025-11-05",D="text/html;profile=mcp-app",F="ui/resourceUri";function x(n){if(typeof document>"u")return;let e=n==="os"?typeof window<"u"&&window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light":n;document.documentElement.classList.remove("light","dark"),document.documentElement.classList.add(e),document.documentElement.setAttribute("data-theme",e);}function H(){if(typeof document>"u")return "light";let n=document.documentElement.getAttribute("data-theme");return n==="dark"||n==="light"?n:document.documentElement.classList.contains("dark")?"dark":"light"}var w="mcp-apps-host-fonts";function b(n){if(typeof document>"u")return;let e=document.documentElement;for(let[t,s]of Object.entries(n)){let o=t.startsWith("--")?t:`--${t}`;e.style.setProperty(o,s);}}function k(n){if(typeof document>"u")return;let e=document.getElementById(w);e||(e=document.createElement("style"),e.id=w,document.head.appendChild(e)),e.textContent=n;}function I(){if(typeof document>"u")return;let n=document.getElementById(w);n&&n.remove();}function A(n){if(typeof document>"u")return;let e=document.documentElement;for(let t of Object.keys(n)){let s=t.startsWith("--")?t:`--${t}`;e.style.removeProperty(s);}}var u={CONNECTION_FAILED:"CONNECTION_FAILED",CONNECTION_TIMEOUT:"CONNECTION_TIMEOUT",NOT_CONNECTED:"NOT_CONNECTED",PROTOCOL_ERROR:"PROTOCOL_ERROR",UNSUPPORTED_OPERATION:"UNSUPPORTED_OPERATION",TOOL_CALL_FAILED:"TOOL_CALL_FAILED",TOOL_NOT_FOUND:"TOOL_NOT_FOUND",STATE_ERROR:"STATE_ERROR",UNKNOWN_ERROR:"UNKNOWN_ERROR"},d=class extends Error{constructor(t,s,o,r){super(s);this.code=t;this.details=o;this.cause=r;this.name="UIError";}formatMessage(){let t=`[${this.code}] ${this.message}`;return this.details&&(t+=` ${JSON.stringify(this.details)}`),t}};var O={debug:0,info:1,warn:2,error:3};function S(n,e){return O[n]>=O[e]}function R(){let n=new WeakSet;return (e,t)=>{if(typeof t=="object"&&t!==null){if(n.has(t))return "[Circular]";n.add(t);}return t}}function M(n){if(n==null||typeof n=="string"||typeof n=="number"||typeof n=="boolean")return n;if(n instanceof Error)return {name:n.name,message:n.message,stack:n.stack};try{return JSON.stringify(n),n}catch{try{let e=JSON.stringify(n,R());return JSON.parse(e)}catch{return "[Unserializable]"}}}function P(n){if(n===void 0)return "undefined";if(n===null)return "null";if(typeof n=="string")return n;if(n instanceof Error)return `${n.name}: ${n.message}`;try{return JSON.stringify(n,R())}catch{return "[Unstringifiable]"}}var m=class{constructor(e={}){this.adapter=null;this.buffer=[];this.flushTimer=null;this.isFlushing=false;this.mcpTransportFailed=false;this.config={enabled:e.enabled??false,level:e.level??"info",batchSize:e.batchSize??10,maxBufferSize:e.maxBufferSize??100,flushIntervalMs:e.flushIntervalMs??5e3,source:e.source??"mcp-apps-ui"};}setAdapter(e){this.adapter=e,this.mcpTransportFailed=false;}configure(e){e.enabled!==void 0&&(this.config.enabled=e.enabled),e.level!==void 0&&(this.config.level=e.level),e.batchSize!==void 0&&(this.config.batchSize=e.batchSize),e.maxBufferSize!==void 0&&(this.config.maxBufferSize=e.maxBufferSize),e.flushIntervalMs!==void 0&&(this.config.flushIntervalMs=e.flushIntervalMs,this.flushTimer&&(clearTimeout(this.flushTimer),this.flushTimer=null),this.scheduleFlush()),e.source!==void 0&&(this.config.source=e.source);}canUseMcpTransport(){return this.config.enabled&&!this.mcpTransportFailed&&this.adapter?.isConnected()===true}createEntry(e,t,s){return {level:e,message:t,data:s!==void 0?M(s):void 0,timestamp:new Date().toISOString(),source:this.config.source}}scheduleFlush(){this.flushTimer||this.buffer.length===0||(this.flushTimer=setTimeout(()=>{this.flushTimer=null,this.flush();},this.config.flushIntervalMs));}async flush(){if(this.isFlushing||this.buffer.length===0)return;if(this.flushTimer&&(clearTimeout(this.flushTimer),this.flushTimer=null),!this.canUseMcpTransport()){for(let t of this.buffer)this.outputToConsole(t);this.buffer=[];return}this.isFlushing=true;let e=[...this.buffer];this.buffer=[];try{this.adapter&&await this.adapter.callTool("log_debug",{entries:e});}catch{this.mcpTransportFailed||(this.mcpTransportFailed=true,console.info("[ClientDebugLogger] MCP log transport unavailable, using console fallback"));for(let t of e)this.outputToConsole(t);}finally{this.isFlushing=false,this.buffer.length>0&&this.scheduleFlush();}}outputToConsole(e){let t=`[${e.timestamp}] [${e.level.toUpperCase()}]`,s=e.data!==void 0?`${e.message} ${P(e.data)}`:e.message,o=`${t} ${s}`;try{switch(e.level){case "debug":console.debug(o);break;case "info":console.info(o);break;case "warn":console.warn(o);break;case "error":console.error(o);break}}catch{}}addToBuffer(e){if(this.buffer.length>=this.config.maxBufferSize){let t=this.buffer.shift();t&&this.outputToConsole(t);}if(this.buffer.push(e),e.level==="error"){this.flush();return}if(this.buffer.length>=this.config.batchSize){this.flush();return}this.scheduleFlush();}log(e,t,s){if(!S(e,this.config.level))return;let o=this.createEntry(e,t,s);if(!this.canUseMcpTransport()){this.outputToConsole(o);return}this.addToBuffer(o);}debug(e,t){this.log("debug",e,t);}info(e,t){this.log("info",e,t);}warn(e,t){this.log("warn",e,t);}error(e,t){this.log("error",e,t);}destroy(){if(this.buffer.length>0){for(let e of this.buffer)this.outputToConsole(e);this.buffer=[];}this.flushTimer&&(clearTimeout(this.flushTimer),this.flushTimer=null),this.adapter=null;}},y=new m;var g=class{constructor(){this.connected=false;this.state=null;this.toolResultHandlers=new Set;this.toolInputHandlers=new Set;this.toolInputPartialHandlers=new Set;this.toolCancelledHandlers=new Set;this.hostContextHandlers=new Set;this.teardownHandlers=new Set;this.mockHostCapabilities={logging:{},openLinks:{},theming:{themes:["light","dark","os"]},displayModes:{modes:["inline","fullscreen","pip","panel"]},statePersistence:{persistent:true},serverTools:{listChanged:false},serverResources:{listChanged:false},sizeNotifications:{},partialToolInput:{},appTools:{listChanged:false},fileUpload:{},safeAreaInsets:{},views:{}};this.mockHostVersion={name:"MockHost",version:"1.0.0"};this.context=this.createDefaultContext();}createDefaultContext(){let e=typeof window<"u";return {theme:"light",displayMode:"inline",availableDisplayModes:["inline","fullscreen","pip"],viewport:{width:e?window.innerWidth:800,height:e?window.innerHeight:600},locale:e?navigator.language:"en-US",timeZone:Intl.DateTimeFormat().resolvedOptions().timeZone,platform:"web",deviceCapabilities:{touch:e?"ontouchstart"in window:false,hover:true}}}async connect(){this.connected=true,console.log("[MockAdapter] Connected");}isConnected(){return this.connected}async callTool(e,t){console.log(`[MockAdapter] callTool("${e}",`,t,")");let s={_mock:true,tool:e,args:t,timestamp:Date.now()};return this.currentToolOutput=s,s}async sendMessage(e){console.log("[MockAdapter] sendMessage:",e);}async openLink(e){console.log(`[MockAdapter] openLink("${e}")`);}async requestDisplayMode(e){return console.log(`[MockAdapter] requestDisplayMode("${e}")`),this.context={...this.context,displayMode:e},this.notifyHostContextChange(),{mode:e}}requestClose(){console.log("[MockAdapter] requestClose()");}getState(){return this.state}setState(e){this.state=e,console.log("[MockAdapter] setState:",e);}async readResource(e){return console.log(`[MockAdapter] readResource("${e}")`),{contents:[]}}log(e,t){({debug:console.debug,info:console.info,warning:console.warn,error:console.error}[e]??console.log)("[MockAdapter]",t);}onToolResult(e){return this.toolResultHandlers.add(e),()=>this.toolResultHandlers.delete(e)}onToolInput(e){return this.toolInputHandlers.add(e),()=>this.toolInputHandlers.delete(e)}onToolCancelled(e){return this.toolCancelledHandlers.add(e),()=>this.toolCancelledHandlers.delete(e)}onHostContextChange(e){return this.hostContextHandlers.add(e),()=>this.hostContextHandlers.delete(e)}onTeardown(e){return this.teardownHandlers.add(e),()=>this.teardownHandlers.delete(e)}getHostContext(){return this.context}getToolInput(){return this.currentToolInput}getToolOutput(){return this.currentToolOutput}getToolMeta(){return this.currentToolMeta}emitToolResult(e){this.currentToolOutput=e;for(let t of this.toolResultHandlers)t(e);}emitToolInput(e){this.currentToolInput=e;for(let t of this.toolInputHandlers)t(e);}setHostContext(e){this.context={...this.context,...e},this.notifyHostContextChange();}emitContextChange(e){this.context=e,this.notifyHostContextChange();}setToolInput(e){this.currentToolInput=e;}emitToolCancelled(e){for(let t of this.toolCancelledHandlers)t(e);}emitTeardown(e){for(let t of this.teardownHandlers)t(e);}notifyHostContextChange(){for(let e of this.hostContextHandlers)e(this.context);}getHostCapabilities(){return this.mockHostCapabilities}getHostVersion(){return this.mockHostVersion}async sendLog(e,t){console.log(`[MockAdapter] sendLog(${e}):`,t);}async sendSizeChanged(e){console.log("[MockAdapter] sendSizeChanged:",e);}onToolInputPartial(e){return this.toolInputPartialHandlers.add(e),()=>this.toolInputPartialHandlers.delete(e)}setCallToolHandler(e){this.callToolHandler=e,console.log("[MockAdapter] setCallToolHandler: handler registered");}setListToolsHandler(e){this.listToolsHandler=e,console.log("[MockAdapter] setListToolsHandler: handler registered");}emitToolInputPartial(e){for(let t of this.toolInputPartialHandlers)t(e);}setMockHostCapabilities(e){this.mockHostCapabilities={...this.mockHostCapabilities,...e};}setMockHostVersion(e){this.mockHostVersion=e;}async simulateHostToolCall(e,t){if(!this.callToolHandler)throw new d(u.TOOL_NOT_FOUND,"No call tool handler registered");return this.callToolHandler(e,t)}async simulateHostListTools(){return this.listToolsHandler?this.listToolsHandler():{tools:[]}}};var _={parse:n=>n},f=class{constructor(){this.connected=false;this.toolResultHandlers=new Set;this.toolInputHandlers=new Set;this.toolInputPartialHandlers=new Set;this.toolCancelledHandlers=new Set;this.hostContextHandlers=new Set;this.teardownHandlers=new Set;this.context=this.createDefaultContext();}createDefaultContext(){let e=typeof window<"u";return {theme:"light",displayMode:"inline",availableDisplayModes:["inline","fullscreen"],viewport:{width:e?window.innerWidth:800,height:e?window.innerHeight:600},locale:e?navigator.language:"en-US",timeZone:Intl.DateTimeFormat().resolvedOptions().timeZone,platform:"desktop"}}async connect(){if(this.connected)return;if(typeof window>"u"){this.connected=true;return}this.app=new App({name:"@mcp-apps-kit/ui",version:"0.0.0"},{tools:{}}),this.app.onerror=t=>{this.log("error",t);},this.app.onhostcontextchanged=t=>{let s=t.hostContext??t;this.context=this.mapHostContext(s),this.currentToolMeta=this.extractToolMeta(s);for(let o of this.hostContextHandlers)o(this.context);},this.app.ontoolinput=t=>{let s=t.arguments;if(s){this.currentToolInput=s;for(let o of this.toolInputHandlers)o(s);}},this.app.ontoolinputpartial=t=>{let s=t.arguments;if(s)for(let o of this.toolInputPartialHandlers)o(s);},this.app.oncalltool=async t=>{let{name:s,arguments:o}=t;try{if(this.callToolHandler){let r=await this.callToolHandler(s,o??{});return {content:[{type:"text",text:JSON.stringify(r)}]}}return {content:[{type:"text",text:`No handler registered for tool: ${s}`}],isError:!0}}catch(r){return {content:[{type:"text",text:r instanceof Error?r.message:String(r)}],isError:true}}},this.app.onlisttools=async()=>this.listToolsHandler?{tools:(await this.listToolsHandler()).map(s=>s.name)}:{tools:[]},this.app.ontoolresult=t=>{let s=this.extractToolOutput(t);this.currentToolOutput=s;let o=this.getToolNameFromContext(),r=o?{[o]:s}:s;for(let i of this.toolResultHandlers)i(r);},this.app.ontoolcancelled=t=>{let s=t.reason;for(let o of this.toolCancelledHandlers)o(s);},this.app.onteardown=async t=>{let s=t.reason;for(let o of this.teardownHandlers)o(s);return {}},await this.app.connect();let e=this.app.getHostContext();e&&(this.context=this.mapHostContext(e),this.currentToolMeta=this.extractToolMeta(e)),this.connected=true;}isConnected(){return this.connected}mapHostContext(e){let t=e??{},s=this.createDefaultContext(),o=t.theme==="dark"?"dark":t.theme==="light"?"light":s.theme,r=t.displayMode==="fullscreen"||t.displayMode==="pip"||t.displayMode==="inline"?t.displayMode:s.displayMode,i=Array.isArray(t.availableDisplayModes)?t.availableDisplayModes.filter(c=>typeof c=="string"):s.availableDisplayModes,p=(c=>c!==null&&typeof c=="object"&&!Array.isArray(c))(t.viewport)?{...s.viewport,...t.viewport}:s.viewport,a=typeof t.locale=="string"?t.locale:s.locale,C=typeof t.timeZone=="string"?t.timeZone:s.timeZone,E=s.platform;return {...s,theme:o,displayMode:r,availableDisplayModes:i,viewport:p,locale:a,timeZone:C,platform:E,userAgent:typeof t.userAgent=="string"?t.userAgent:s.userAgent,deviceCapabilities:t.deviceCapabilities,safeAreaInsets:t.safeAreaInsets,styles:t.styles,view:typeof t.view=="string"?t.view:s.view}}extractToolMeta(e){if(e===null||typeof e!="object")return;let t=e;if(!(!t.toolInfo||typeof t.toolInfo!="object"))return {toolInfo:t.toolInfo}}getToolNameFromContext(){if(!this.app)return;let e=this.app.getHostContext();return e?e.toolInfo?.tool?.name:void 0}extractToolOutput(e){let t=e.structuredContent,s=e._meta,o=t&&typeof t=="object"&&!Array.isArray(t)?t:{};if(s&&typeof s=="object"&&!Array.isArray(s))return {...o,_meta:s};if(Object.keys(o).length===0){let r=e.content;if(Array.isArray(r)&&r.length>0){let i=r[0];if(i?.type==="text"&&typeof i.text=="string")try{let l=JSON.parse(i.text);if(l!==null&&typeof l=="object"&&!Array.isArray(l))return l}catch{}}}return o}async callTool(e,t){if(!this.app)throw new Error("MCP Apps adapter not connected");let s=await this.app.callServerTool({name:e,arguments:t});return this.extractToolOutput(s)}async sendMessage(e){if(!this.app)throw new Error("MCP Apps adapter not connected");if(e.type!=="text")throw new Error(`Unsupported message content type: ${e.type}`);await this.app.sendMessage({role:"user",content:[{type:"text",text:e.text}]});}async openLink(e){if(!this.app)throw new Error("MCP Apps adapter not connected");await this.app.openLink({url:e});}async requestDisplayMode(e){if(!this.app)throw new Error("MCP Apps adapter not connected");return await this.app.requestDisplayMode({mode:e})}requestClose(){}getState(){return null}setState(e){}async readResource(e){if(!this.app)throw new Error("MCP Apps adapter not connected");let s=await this.app.request.bind(this.app)({method:"resources/read",params:{uri:e}},_);return {contents:(Array.isArray(s.contents)?s.contents:[]).map(o=>{let r={uri:o.uri,mimeType:o.mimeType??"application/octet-stream"};if("text"in o&&typeof o.text=="string")return {...r,text:o.text};if("blob"in o&&typeof o.blob=="string"){let i=Uint8Array.from(atob(o.blob),l=>l.charCodeAt(0));return {...r,blob:i}}return r})}}log(e,t){if(this.app){let i={level:["debug","info","notice","warning","error","critical","alert","emergency"].includes(e)?e:"info",data:t,logger:"@mcp-apps-kit/ui"};try{this.app.sendLog(i);return}catch{}}({debug:console.debug,info:console.info,warning:console.warn,error:console.error}[e]??console.log)("[MCP Apps]",t);}onToolResult(e){return this.toolResultHandlers.add(e),()=>this.toolResultHandlers.delete(e)}onToolInput(e){return this.toolInputHandlers.add(e),()=>this.toolInputHandlers.delete(e)}onToolCancelled(e){return this.toolCancelledHandlers.add(e),()=>this.toolCancelledHandlers.delete(e)}onHostContextChange(e){return this.hostContextHandlers.add(e),()=>this.hostContextHandlers.delete(e)}onTeardown(e){return this.teardownHandlers.add(e),()=>this.teardownHandlers.delete(e)}getHostContext(){return this.context}getToolInput(){return this.currentToolInput}getToolOutput(){return this.currentToolOutput}getToolMeta(){return this.currentToolMeta}getHostCapabilities(){if(!this.app)return;let e=this.app.getHostCapabilities();if(!e)return;let t=e,o=this.app.getHostContext()?.availableDisplayModes;return {logging:t.logging,openLinks:t.openLinks,serverResources:t.serverResources,serverTools:t.serverTools,experimental:t.experimental,theming:{themes:["light","dark"]},displayModes:o?{modes:o}:void 0,statePersistence:{persistent:false},sizeNotifications:{},partialToolInput:{},appTools:{listChanged:false}}}getHostVersion(){if(!this.app)return;let e=this.app.getHostVersion();if(e)return {name:e.name,version:e.version}}async sendLog(e,t){if(!this.app)throw new d(u.NOT_CONNECTED,"MCP Apps adapter not connected");await this.app.sendLog({level:e,data:t,logger:"@mcp-apps-kit/ui"});}async sendSizeChanged(e){if(!this.app)throw new d(u.NOT_CONNECTED,"MCP Apps adapter not connected");await this.app.sendSizeChanged({width:e.width,height:e.height});}onToolInputPartial(e){return this.toolInputPartialHandlers.add(e),()=>this.toolInputPartialHandlers.delete(e)}setCallToolHandler(e){this.callToolHandler=e;}setListToolsHandler(e){this.listToolsHandler=e;}};var h=class{constructor(){this.connected=false;this.state=null;this.toolResultHandlers=new Set;this.toolInputHandlers=new Set;this.toolCancelledHandlers=new Set;this.hostContextHandlers=new Set;this.teardownHandlers=new Set;this.context=this.createDefaultContext();}createDefaultContext(){let e=typeof window<"u";return {theme:"light",displayMode:"inline",availableDisplayModes:["inline","fullscreen","pip"],viewport:{width:e?window.innerWidth:800,height:e?window.innerHeight:600},locale:e?navigator.language:"en-US",timeZone:Intl.DateTimeFormat().resolvedOptions().timeZone,platform:"web",deviceCapabilities:{touch:e?"ontouchstart"in window:false,hover:true}}}readContextFromSDK(){let e=this.getOpenAI();if(!e)return;let t=typeof window<"u";if(typeof e.theme=="string"&&(this.context.theme=e.theme),typeof e.displayMode=="string"&&(this.context.displayMode=e.displayMode),typeof e.locale=="string"&&(this.context.locale=e.locale),typeof e.userAgent=="string"&&Object.assign(this.context,{userAgent:e.userAgent}),typeof e.view=="string"&&(this.context.view=e.view),e.safeArea&&typeof e.safeArea=="object"){let s=e.safeArea;this.context.safeAreaInsets={top:typeof s.top=="number"?s.top:0,right:typeof s.right=="number"?s.right:0,bottom:typeof s.bottom=="number"?s.bottom:0,left:typeof s.left=="number"?s.left:0};}typeof e.maxHeight=="number"&&(this.context.viewport={width:t?window.innerWidth:800,height:e.maxHeight}),console.log("[OpenAI Adapter] Read context from SDK:",this.context);}notifyContextChange(){console.log(`[OpenAI Adapter] Notifying ${String(this.hostContextHandlers.size)} context change handlers`);let e={...this.context};for(let t of this.hostContextHandlers)t(e);}getOpenAI(){return typeof window<"u"&&"openai"in window?window.openai:null}getToolNameFromSDK(){let e=this.getOpenAI();if(e){if(e.toolResponseMetadata&&typeof e.toolResponseMetadata=="object"){let t=e.toolResponseMetadata;if(typeof t.toolName=="string")return t.toolName}if(typeof e.toolName=="string")return e.toolName}}async connect(){await this.waitForOpenAI();let e=this.getOpenAI();if(e){console.log("[OpenAI Adapter] Available SDK methods:",Object.keys(e)),this.readContextFromSDK();let t=this.getToolNameFromSDK();if(typeof e.getToolOutput=="function"?(this.currentToolOutput=e.getToolOutput(),console.log("[OpenAI Adapter] Got tool output from SDK")):e.toolOutput?(this.currentToolOutput=e.toolOutput,console.log("[OpenAI Adapter] Got tool output from SDK property")):e.result&&(this.currentToolOutput=e.result,console.log("[OpenAI Adapter] Got result from SDK")),this.currentToolOutput&&Object.keys(this.currentToolOutput).length>0){let s=t?{[t]:this.currentToolOutput}:this.currentToolOutput;for(let o of this.toolResultHandlers)o(s);}typeof e.getToolInput=="function"?this.currentToolInput=e.getToolInput():e.toolInput?this.currentToolInput=e.toolInput:e.input&&(this.currentToolInput=e.input),typeof e.init=="function"&&await e.init();}this.setupGlobalsListener(),this.connected=true;}setupGlobalsListener(){typeof window>"u"||(this.globalsHandler=e=>{let t=e.data;(t==="openai:set_globals"||typeof t=="object"&&t!==null&&"type"in t&&t.type==="openai:set_globals"||typeof t=="object"&&t!==null&&"message"in t&&t.message==="openai:set_globals")&&(console.log("[OpenAI Adapter] Received set_globals event, refreshing context"),setTimeout(()=>{let o=this.context.theme,r=this.context.locale,i=this.context.displayMode;this.readContextFromSDK(),(this.context.theme!==o||this.context.locale!==r||this.context.displayMode!==i)&&(console.log("[OpenAI Adapter] Context changed, notifying handlers"),this.notifyContextChange());},10));},window.addEventListener("message",this.globalsHandler));}async waitForOpenAI(e=5e3){if(this.getOpenAI()){console.log("[OpenAI Adapter] window.openai already available");return}return console.log("[OpenAI Adapter] Waiting for window.openai..."),new Promise(t=>{let s=Date.now(),o=false,r=()=>{o||(o=true,window.removeEventListener("message",l),t());},i=()=>{if(!o){if(this.getOpenAI()){console.log("[OpenAI Adapter] window.openai found via polling"),r();return}if(Date.now()-s>e){console.warn("[OpenAI Adapter] window.openai not found after timeout, proceeding anyway"),r();return}setTimeout(i,50);}},l=p=>{let a=p.data;(a==="openai:set_globals"||typeof a=="object"&&a!==null&&"type"in a&&a.type==="openai:set_globals"||typeof a=="object"&&a!==null&&"message"in a&&a.message==="openai:set_globals")&&(console.log("[OpenAI Adapter] Received set_globals message"),setTimeout(()=>{this.getOpenAI()?(console.log("[OpenAI Adapter] window.openai available after set_globals"),r()):console.log("[OpenAI Adapter] window.openai still not available after set_globals, continuing poll");},50));};window.addEventListener("message",l),i();})}isConnected(){return this.connected}async callTool(e,t){let s=this.getOpenAI();if(s&&typeof s.callTool=="function")return s.callTool(e,t);throw new Error("OpenAI SDK not available")}async sendMessage(e){let t=this.getOpenAI();t&&typeof t.sendMessage=="function"&&await t.sendMessage(e);}async openLink(e){let t=this.getOpenAI();t&&typeof t.openLink=="function"?await t.openLink(e):window.open(e,"_blank");}async requestDisplayMode(e){let t=this.getOpenAI();if(t&&typeof t.requestDisplayMode=="function"){let s=await t.requestDisplayMode({mode:e});return this.context={...this.context,displayMode:s.mode},this.notifyContextChange(),s}return this.context={...this.context,displayMode:e},this.notifyContextChange(),{mode:e}}requestClose(){let e=this.getOpenAI();e&&typeof e.close=="function"&&e.close();}getState(){return this.state}setState(e){this.state=e;let t=this.getOpenAI();t&&typeof t.setState=="function"&&t.setState(e);}async uploadFile(e){let t=this.getOpenAI();if(t&&typeof t.uploadFile=="function")return t.uploadFile(e);throw new Error("File upload not supported")}async getFileDownloadUrl(e){let t=this.getOpenAI();if(t&&typeof t.getFileDownloadUrl=="function")return t.getFileDownloadUrl(e);throw new Error("File download not supported")}async readResource(e){let t=this.getOpenAI();return t&&typeof t.readResource=="function"?t.readResource(e):{contents:[]}}log(e,t){({debug:console.debug,info:console.info,warning:console.warn,error:console.error}[e]??console.log)("[ChatGPT Apps]",t);}onToolResult(e){return this.toolResultHandlers.add(e),()=>this.toolResultHandlers.delete(e)}onToolInput(e){return this.toolInputHandlers.add(e),()=>this.toolInputHandlers.delete(e)}onToolCancelled(e){return this.toolCancelledHandlers.add(e),()=>this.toolCancelledHandlers.delete(e)}onHostContextChange(e){return this.hostContextHandlers.add(e),console.log(`[OpenAI Adapter] Host context handler added, total: ${String(this.hostContextHandlers.size)}`),()=>{this.hostContextHandlers.delete(e),console.log(`[OpenAI Adapter] Host context handler removed, total: ${String(this.hostContextHandlers.size)}`);}}onTeardown(e){return this.teardownHandlers.add(e),()=>this.teardownHandlers.delete(e)}getHostContext(){return this.context}getToolInput(){return this.currentToolInput}getToolOutput(){if(!this.currentToolOutput)return;let e=this.getToolNameFromSDK();return e?{[e]:this.currentToolOutput}:this.currentToolOutput}getToolMeta(){return this.currentToolMeta}getHostCapabilities(){let e=this.getOpenAI(),t=e&&typeof e.uploadFile=="function",s=this.context.safeAreaInsets!==void 0,o=this.context.view!==void 0;return {openLinks:{},logging:{},theming:{themes:["light","dark"]},displayModes:{modes:["inline","fullscreen","pip"]},statePersistence:{persistent:false},fileUpload:t?{}:void 0,safeAreaInsets:s?{}:void 0,views:o?{}:void 0}}getHostVersion(){}async sendLog(e,t){let s={debug:"debug",info:"info",notice:"info",warning:"warning",error:"error",critical:"error",alert:"error",emergency:"error"};this.log(s[e],t);}async sendSizeChanged(e){let t=this.getOpenAI();t&&typeof t.notifyIntrinsicHeight=="function"&&t.notifyIntrinsicHeight(e.height);}onToolInputPartial(e){return this.log("debug","onToolInputPartial is not supported on ChatGPT"),()=>{}}setCallToolHandler(e){this.log("debug","setCallToolHandler is not supported on ChatGPT");}setListToolsHandler(e){this.log("debug","setListToolsHandler is not supported on ChatGPT");}};function U(){let n=window.location.href;if(n.includes("/api/apps/chatgpt/")||n.includes("chatgpt")||n.includes("sandbox-proxy")||n.includes("widget-content"))return true;let e=document.referrer;return !!(e.includes("chatgpt")||e.includes("openai.com"))}function v(){return typeof window>"u"?"mock":"openai"in window||U()?"openai":window.parent!==window?"mcp":"mock"}function z(n){return new Proxy({},{get(e,t){if(typeof t!="string"||!t.startsWith("call"))return;let s=t.slice(4);if(s.length===0)return;let o=s.charAt(0).toLowerCase()+s.slice(1);return r=>n(o,r)},has(e,t){return typeof t=="string"&&t.startsWith("call")&&t.length>4},ownKeys(){return []},getOwnPropertyDescriptor(e,t){if(typeof t=="string"&&t.startsWith("call")&&t.length>4)return {configurable:true,enumerable:true,writable:false}}})}function T(n){async function e(o,r){return await n.callTool(o,r)}let t=z(e);return {callTool:e,tools:t,async sendMessage(o){await n.sendMessage(o);},async sendFollowUpMessage(o){await n.sendMessage({type:"text",text:o});},async openLink(o){await n.openLink(o);},async requestDisplayMode(o){return n.requestDisplayMode(o)},requestClose(){n.requestClose();},getState(){return n.getState()},setState(o){n.setState(o);},...n.uploadFile&&{uploadFile:o=>{if(n.uploadFile)return n.uploadFile(o);throw new Error("uploadFile not supported")}},...n.getFileDownloadUrl&&{getFileDownloadUrl:o=>{if(n.getFileDownloadUrl)return n.getFileDownloadUrl(o);throw new Error("getFileDownloadUrl not supported")}},async readResource(o){return n.readResource(o)},log(o,r){n.log(o,r);},onToolResult(o){return n.onToolResult(o)},onToolInput(o){return n.onToolInput(o)},onToolCancelled(o){return n.onToolCancelled(o)},onHostContextChange(o){return n.onHostContextChange(o)},onTeardown(o){return n.onTeardown(o)},onToolInputPartial(o){return n.onToolInputPartial(o)},getHostCapabilities(){return n.getHostCapabilities()},getHostVersion(){return n.getHostVersion()},async sendLog(o,r){return n.sendLog(o,r)},async sendSizeChanged(o){return n.sendSizeChanged(o)},setupSizeChangedNotifications(){if(typeof window>"u"||typeof ResizeObserver>"u")return ()=>{};let o=new ResizeObserver(r=>{for(let i of r){let{width:l,height:p}=i.contentRect;n.sendSizeChanged({width:Math.round(l),height:Math.round(p)});}});return o.observe(document.body),()=>{o.disconnect();}},setCallToolHandler(o){n.setCallToolHandler(o);},setListToolsHandler(o){n.setListToolsHandler(o);},get hostContext(){return n.getHostContext()},get toolInput(){return n.getToolInput()},get toolOutput(){return n.getToolOutput()},get toolMeta(){return n.getToolMeta()}}}function V(n){switch(n){case "mcp":return new f;case "openai":return new h;case "mock":return new g;default:throw new Error(`Unknown adapter type: ${n}`)}}async function ue(n){let e=n?.forceAdapter??v();if(!["mcp","openai","mock"].includes(e))throw new Error(`Unknown adapter type: ${e}`);let t=V(e);return await t.connect(),y.setAdapter(t),T(t)}export{m as ClientDebugLogger,L as LATEST_PROTOCOL_VERSION,f as McpAdapter,g as MockAdapter,h as OpenAIAdapter,D as RESOURCE_MIME_TYPE,F as RESOURCE_URI_META_KEY,d as UIError,u as UIErrorCode,x as applyDocumentTheme,k as applyHostFonts,b as applyHostStyleVariables,A as clearHostStyleVariables,y as clientDebugLogger,T as createAppsClient,ue as createClient,v as detectProtocol,H as getDocumentTheme,I as removeHostFonts,M as safeSerialize,P as safeStringify,S as shouldLog};//# sourceMappingURL=index.js.map
import {App}from'@modelcontextprotocol/ext-apps';var D="2025-11-05",_="text/html;profile=mcp-app",F="ui/resourceUri";function x(r){if(typeof document>"u")return;let e=r==="os"?typeof window<"u"&&window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light":r;document.documentElement.classList.remove("light","dark"),document.documentElement.classList.add(e),document.documentElement.setAttribute("data-theme",e);}function k(){if(typeof document>"u")return "light";let r=document.documentElement.getAttribute("data-theme");return r==="dark"||r==="light"?r:document.documentElement.classList.contains("dark")?"dark":"light"}var T="mcp-apps-host-fonts";function H(r){if(typeof document>"u")return;let e=document.documentElement;for(let[t,n]of Object.entries(r)){let o=t.startsWith("--")?t:`--${t}`;e.style.setProperty(o,n);}}function A(r){if(typeof document>"u")return;let e=document.getElementById(T);e||(e=document.createElement("style"),e.id=T,document.head.appendChild(e)),e.textContent=r;}function O(){if(typeof document>"u")return;let r=document.getElementById(T);r&&r.remove();}function I(r){if(typeof document>"u")return;let e=document.documentElement;for(let t of Object.keys(r)){let n=t.startsWith("--")?t:`--${t}`;e.style.removeProperty(n);}}var g={CONNECTION_FAILED:"CONNECTION_FAILED",CONNECTION_TIMEOUT:"CONNECTION_TIMEOUT",NOT_CONNECTED:"NOT_CONNECTED",PROTOCOL_ERROR:"PROTOCOL_ERROR",UNSUPPORTED_OPERATION:"UNSUPPORTED_OPERATION",TOOL_CALL_FAILED:"TOOL_CALL_FAILED",TOOL_NOT_FOUND:"TOOL_NOT_FOUND",STATE_ERROR:"STATE_ERROR",UNKNOWN_ERROR:"UNKNOWN_ERROR"},d=class extends Error{constructor(t,n,o,s){super(n);this.code=t;this.details=o;this.cause=s;this.name="UIError";}formatMessage(){let t=`[${this.code}] ${this.message}`;return this.details&&(t+=` ${JSON.stringify(this.details)}`),t}};var R={debug:0,info:1,warn:2,error:3};function S(r,e){return R[r]>=R[e]}function M(){let r=new WeakSet;return (e,t)=>{if(typeof t=="object"&&t!==null){if(r.has(t))return "[Circular]";r.add(t);}return t}}function E(r){if(r==null||typeof r=="string"||typeof r=="number"||typeof r=="boolean")return r;if(r instanceof Error)return {name:r.name,message:r.message,stack:r.stack};try{return JSON.stringify(r),r}catch{try{let e=JSON.stringify(r,M());return JSON.parse(e)}catch{return "[Unserializable]"}}}function P(r){if(r===void 0)return "undefined";if(r===null)return "null";if(typeof r=="string")return r;if(r instanceof Error)return `${r.name}: ${r.message}`;try{return JSON.stringify(r,M())}catch{return "[Unstringifiable]"}}var y=class{constructor(e={}){this.adapter=null;this.buffer=[];this.flushTimer=null;this.isFlushing=false;this.mcpTransportFailed=false;this.apiTransportFailed=false;this.config={enabled:e.enabled??false,level:e.level??"info",batchSize:e.batchSize??10,maxBufferSize:e.maxBufferSize??100,flushIntervalMs:e.flushIntervalMs??5e3,source:e.source??"mcp-apps-ui",transport:e.transport??"tool",apiEndpoint:e.apiEndpoint};}setAdapter(e){this.adapter=e,this.mcpTransportFailed=false,this.apiTransportFailed=false;}configure(e){e.enabled!==void 0&&(this.config.enabled=e.enabled),e.level!==void 0&&(this.config.level=e.level),e.batchSize!==void 0&&(this.config.batchSize=e.batchSize),e.maxBufferSize!==void 0&&(this.config.maxBufferSize=e.maxBufferSize),e.flushIntervalMs!==void 0&&(this.config.flushIntervalMs=e.flushIntervalMs,this.flushTimer&&(clearTimeout(this.flushTimer),this.flushTimer=null),this.scheduleFlush()),e.source!==void 0&&(this.config.source=e.source),e.transport!==void 0&&(this.config.transport=e.transport,this.mcpTransportFailed=false,this.apiTransportFailed=false),e.apiEndpoint!==void 0&&(this.config.apiEndpoint=e.apiEndpoint,this.apiTransportFailed=false);}canUseToolTransport(){return this.config.enabled&&this.config.transport==="tool"&&!this.mcpTransportFailed&&this.adapter?.isConnected()===true}canUseApiTransport(){return this.config.enabled&&this.config.transport==="api"&&!this.apiTransportFailed&&!!this.config.apiEndpoint}canUseRemoteTransport(){return this.canUseToolTransport()||this.canUseApiTransport()}createEntry(e,t,n){return {level:e,message:t,data:n!==void 0?E(n):void 0,timestamp:new Date().toISOString(),source:this.config.source}}scheduleFlush(){this.flushTimer||this.buffer.length===0||(this.flushTimer=setTimeout(()=>{this.flushTimer=null,this.flush();},this.config.flushIntervalMs));}async flushToApi(e){if(!this.config.apiEndpoint)throw new Error("API endpoint not configured");let t=await fetch(this.config.apiEndpoint,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({entries:e})});if(!t.ok)throw new Error(`API request failed with status ${String(t.status)}`)}async flushToTool(e){if(!this.adapter)throw new Error("Adapter not connected");await this.adapter.callTool("log_debug",{entries:e});}async flush(){if(this.isFlushing||this.buffer.length===0)return;if(this.flushTimer&&(clearTimeout(this.flushTimer),this.flushTimer=null),!this.canUseRemoteTransport()){this.buffer=[];return}this.isFlushing=true;let e=[...this.buffer];try{this.canUseApiTransport()?await this.flushToApi(e):this.canUseToolTransport()&&await this.flushToTool(e),this.buffer=this.buffer.slice(e.length);}catch(t){this.buffer=this.buffer.slice(e.length);let n=t instanceof Error?t.message:String(t);this.config.transport==="api"&&!this.apiTransportFailed?(this.apiTransportFailed=true,console.warn(`[ClientDebugLogger] API log transport failed: ${n}. Will only use console`)):this.config.transport==="tool"&&!this.mcpTransportFailed&&(this.mcpTransportFailed=true,console.warn(`[ClientDebugLogger] MCP log transport failed: ${n}. Will only use console`));}finally{this.isFlushing=false,this.buffer.length>0&&this.scheduleFlush();}}outputToConsole(e){let t=`[${e.timestamp}] [${e.level.toUpperCase()}]`,n=e.data!==void 0?`${e.message} ${P(e.data)}`:e.message,o=`${t} ${n}`;try{switch(e.level){case "debug":console.debug(o);break;case "info":console.info(o);break;case "warn":console.warn(o);break;case "error":console.error(o);break}}catch{}}addToBuffer(e){for(;this.buffer.length>=this.config.maxBufferSize;)this.buffer.shift();if(this.buffer.push(e),e.level==="error"){this.flush();return}if(this.buffer.length>=this.config.batchSize){this.flush();return}this.scheduleFlush();}log(e,t,n){if(!S(e,this.config.level))return;let o=this.createEntry(e,t,n);this.outputToConsole(o),this.canUseRemoteTransport()&&this.addToBuffer(o);}debug(e,t){this.log("debug",e,t);}info(e,t){this.log("info",e,t);}warn(e,t){this.log("warn",e,t);}error(e,t){this.log("error",e,t);}destroy(){this.buffer=[],this.flushTimer&&(clearTimeout(this.flushTimer),this.flushTimer=null),this.adapter=null;}},i=new y;function L(){return typeof window<"u"&&window.__MCP_SERVER_CONFIG__?window.__MCP_SERVER_CONFIG__:typeof __MCP_SERVER_CONFIG__<"u"&&__MCP_SERVER_CONFIG__?__MCP_SERVER_CONFIG__:{}}function N(r=""){let e=L();return e.baseUrl?e.baseUrl:typeof window<"u"&&(window.location.protocol==="http:"||window.location.protocol==="https:")?window.location.origin:r}var h=class{constructor(){this.connected=false;this.state=null;this.toolResultHandlers=new Set;this.toolInputHandlers=new Set;this.toolInputPartialHandlers=new Set;this.toolCancelledHandlers=new Set;this.hostContextHandlers=new Set;this.teardownHandlers=new Set;this.mockHostCapabilities={logging:{},openLinks:{},theming:{themes:["light","dark","os"]},displayModes:{modes:["inline","fullscreen","pip","panel"]},statePersistence:{persistent:true},serverTools:{listChanged:false},serverResources:{listChanged:false},sizeNotifications:{},partialToolInput:{},appTools:{listChanged:false},fileUpload:{},safeAreaInsets:{},views:{}};this.mockHostVersion={name:"MockHost",version:"1.0.0"};this.context=this.createDefaultContext();}createDefaultContext(){let e=typeof window<"u";return {theme:"light",displayMode:"inline",availableDisplayModes:["inline","fullscreen","pip"],viewport:{width:e?window.innerWidth:800,height:e?window.innerHeight:600},locale:e?navigator.language:"en-US",timeZone:Intl.DateTimeFormat().resolvedOptions().timeZone,platform:"web",deviceCapabilities:{touch:e?"ontouchstart"in window:false,hover:true}}}async connect(){this.connected=true,console.log("[MockAdapter] Connected");}isConnected(){return this.connected}async callTool(e,t){console.log(`[MockAdapter] callTool("${e}",`,t,")");let n={_mock:true,tool:e,args:t,timestamp:Date.now()};return this.currentToolOutput=n,n}async sendMessage(e){console.log("[MockAdapter] sendMessage:",e);}async openLink(e){console.log(`[MockAdapter] openLink("${e}")`);}async requestDisplayMode(e){return console.log(`[MockAdapter] requestDisplayMode("${e}")`),this.context={...this.context,displayMode:e},this.notifyHostContextChange(),{mode:e}}requestClose(){console.log("[MockAdapter] requestClose()");}getState(){return this.state}setState(e){this.state=e,console.log("[MockAdapter] setState:",e);}async readResource(e){return console.log(`[MockAdapter] readResource("${e}")`),{contents:[]}}log(e,t){({debug:console.debug,info:console.info,warning:console.warn,error:console.error}[e]??console.log)("[MockAdapter]",t);}onToolResult(e){return this.toolResultHandlers.add(e),()=>this.toolResultHandlers.delete(e)}onToolInput(e){return this.toolInputHandlers.add(e),()=>this.toolInputHandlers.delete(e)}onToolCancelled(e){return this.toolCancelledHandlers.add(e),()=>this.toolCancelledHandlers.delete(e)}onHostContextChange(e){return this.hostContextHandlers.add(e),()=>this.hostContextHandlers.delete(e)}onTeardown(e){return this.teardownHandlers.add(e),()=>this.teardownHandlers.delete(e)}getHostContext(){return this.context}getToolInput(){return this.currentToolInput}getToolOutput(){return this.currentToolOutput}getToolMeta(){return this.currentToolMeta}emitToolResult(e){this.currentToolOutput=e;for(let t of this.toolResultHandlers)t(e);}emitToolInput(e){this.currentToolInput=e;for(let t of this.toolInputHandlers)t(e);}setHostContext(e){this.context={...this.context,...e},this.notifyHostContextChange();}emitContextChange(e){this.context=e,this.notifyHostContextChange();}setToolInput(e){this.currentToolInput=e;}emitToolCancelled(e){for(let t of this.toolCancelledHandlers)t(e);}emitTeardown(e){for(let t of this.teardownHandlers)t(e);}notifyHostContextChange(){for(let e of this.hostContextHandlers)e(this.context);}getHostCapabilities(){return this.mockHostCapabilities}getHostVersion(){return this.mockHostVersion}async sendLog(e,t){console.log(`[MockAdapter] sendLog(${e}):`,t);}async sendLogs(e){for(let t of e)console.log(`[MockAdapter] sendLogs(${t.level}):`,t.message,t.data);return {processed:e.length}}async sendSizeChanged(e){console.log("[MockAdapter] sendSizeChanged:",e);}onToolInputPartial(e){return this.toolInputPartialHandlers.add(e),()=>this.toolInputPartialHandlers.delete(e)}setCallToolHandler(e){this.callToolHandler=e,console.log("[MockAdapter] setCallToolHandler: handler registered");}setListToolsHandler(e){this.listToolsHandler=e,console.log("[MockAdapter] setListToolsHandler: handler registered");}emitToolInputPartial(e){for(let t of this.toolInputPartialHandlers)t(e);}setMockHostCapabilities(e){this.mockHostCapabilities={...this.mockHostCapabilities,...e};}setMockHostVersion(e){this.mockHostVersion=e;}async simulateHostToolCall(e,t){if(!this.callToolHandler)throw new d(g.TOOL_NOT_FOUND,"No call tool handler registered");return this.callToolHandler(e,t)}async simulateHostListTools(){return this.listToolsHandler?this.listToolsHandler():{tools:[]}}};var z={parse:r=>r},m=class{constructor(){this.connected=false;this.toolResultHandlers=new Set;this.toolInputHandlers=new Set;this.toolInputPartialHandlers=new Set;this.toolCancelledHandlers=new Set;this.hostContextHandlers=new Set;this.teardownHandlers=new Set;this.context=this.createDefaultContext();}createDefaultContext(){let e=typeof window<"u";return {theme:"light",displayMode:"inline",availableDisplayModes:["inline","fullscreen"],viewport:{width:e?window.innerWidth:800,height:e?window.innerHeight:600},locale:e?navigator.language:"en-US",timeZone:Intl.DateTimeFormat().resolvedOptions().timeZone,platform:"desktop"}}async connect(){if(this.connected)return;if(typeof window>"u"){this.connected=true;return}this.app=new App({name:"@mcp-apps-kit/ui",version:"0.0.0"},{tools:{}}),this.app.onerror=t=>{this.log("error",t);},this.app.onhostcontextchanged=t=>{let n=t.hostContext??t;this.context=this.mapHostContext(n),this.currentToolMeta=this.extractToolMeta(n);for(let o of this.hostContextHandlers)o(this.context);},this.app.ontoolinput=t=>{let n=t.arguments;if(n){this.currentToolInput=n;for(let o of this.toolInputHandlers)o(n);}},this.app.ontoolinputpartial=t=>{let n=t.arguments;if(n)for(let o of this.toolInputPartialHandlers)o(n);},this.app.oncalltool=async t=>{let{name:n,arguments:o}=t;try{if(this.callToolHandler){let s=await this.callToolHandler(n,o??{});return {content:[{type:"text",text:JSON.stringify(s)}]}}return {content:[{type:"text",text:`No handler registered for tool: ${n}`}],isError:!0}}catch(s){return {content:[{type:"text",text:s instanceof Error?s.message:String(s)}],isError:true}}},this.app.onlisttools=async()=>this.listToolsHandler?{tools:(await this.listToolsHandler()).map(n=>n.name)}:{tools:[]},this.app.ontoolresult=t=>{let n=this.extractToolOutput(t);this.currentToolOutput=n;let o=this.getToolNameFromContext(),s=o?{[o]:n}:n;for(let a of this.toolResultHandlers)a(s);},this.app.ontoolcancelled=t=>{let n=t.reason;for(let o of this.toolCancelledHandlers)o(n);},this.app.onteardown=async t=>{let n=t.reason;for(let o of this.teardownHandlers)o(n);return {}},await this.app.connect();let e=this.app.getHostContext();e&&(this.context=this.mapHostContext(e),this.currentToolMeta=this.extractToolMeta(e)),this.connected=true;}isConnected(){return this.connected}mapHostContext(e){let t=e??{},n=this.createDefaultContext(),o=t.theme==="dark"?"dark":t.theme==="light"?"light":n.theme,s=t.displayMode==="fullscreen"||t.displayMode==="pip"||t.displayMode==="inline"?t.displayMode:n.displayMode,a=Array.isArray(t.availableDisplayModes)?t.availableDisplayModes.filter(c=>typeof c=="string"):n.availableDisplayModes,p=(c=>c!==null&&typeof c=="object"&&!Array.isArray(c))(t.viewport)?{...n.viewport,...t.viewport}:n.viewport,u=typeof t.locale=="string"?t.locale:n.locale,f=typeof t.timeZone=="string"?t.timeZone:n.timeZone,v=n.platform;return {...n,theme:o,displayMode:s,availableDisplayModes:a,viewport:p,locale:u,timeZone:f,platform:v,userAgent:typeof t.userAgent=="string"?t.userAgent:n.userAgent,deviceCapabilities:t.deviceCapabilities,safeAreaInsets:t.safeAreaInsets,styles:t.styles,view:typeof t.view=="string"?t.view:n.view}}extractToolMeta(e){if(e===null||typeof e!="object")return;let t=e;if(!(!t.toolInfo||typeof t.toolInfo!="object"))return {toolInfo:t.toolInfo}}getToolNameFromContext(){if(!this.app)return;let e=this.app.getHostContext();return e?e.toolInfo?.tool?.name:void 0}extractToolOutput(e){let t=e.structuredContent,n=e._meta,o=t&&typeof t=="object"&&!Array.isArray(t)?t:{};if(n&&typeof n=="object"&&!Array.isArray(n))return {...o,_meta:n};if(Object.keys(o).length===0){let s=e.content;if(Array.isArray(s)&&s.length>0){let a=s[0];if(a?.type==="text"&&typeof a.text=="string")try{let l=JSON.parse(a.text);if(l!==null&&typeof l=="object"&&!Array.isArray(l))return l}catch{}}}return o}async callTool(e,t){if(!this.app)throw new Error("MCP Apps adapter not connected");let n=await this.app.callServerTool({name:e,arguments:t});return this.extractToolOutput(n)}async sendMessage(e){if(!this.app)throw new Error("MCP Apps adapter not connected");if(e.type!=="text")throw new Error(`Unsupported message content type: ${e.type}`);await this.app.sendMessage({role:"user",content:[{type:"text",text:e.text}]});}async openLink(e){if(!this.app)throw new Error("MCP Apps adapter not connected");await this.app.openLink({url:e});}async requestDisplayMode(e){if(!this.app)throw new Error("MCP Apps adapter not connected");return await this.app.requestDisplayMode({mode:e})}requestClose(){}getState(){return null}setState(e){}async readResource(e){if(!this.app)throw new Error("MCP Apps adapter not connected");let n=await this.app.request.bind(this.app)({method:"resources/read",params:{uri:e}},z);return {contents:(Array.isArray(n.contents)?n.contents:[]).map(o=>{let s={uri:o.uri,mimeType:o.mimeType??"application/octet-stream"};if("text"in o&&typeof o.text=="string")return {...s,text:o.text};if("blob"in o&&typeof o.blob=="string"){let a=Uint8Array.from(atob(o.blob),l=>l.charCodeAt(0));return {...s,blob:a}}return s})}}log(e,t){if(this.app){let a={level:["debug","info","notice","warning","error","critical","alert","emergency"].includes(e)?e:"info",data:t,logger:"@mcp-apps-kit/ui"};try{this.app.sendLog(a);return}catch{}}({debug:console.debug,info:console.info,warning:console.warn,error:console.error}[e]??console.log)("[MCP Apps]",t);}onToolResult(e){return this.toolResultHandlers.add(e),()=>this.toolResultHandlers.delete(e)}onToolInput(e){return this.toolInputHandlers.add(e),()=>this.toolInputHandlers.delete(e)}onToolCancelled(e){return this.toolCancelledHandlers.add(e),()=>this.toolCancelledHandlers.delete(e)}onHostContextChange(e){return this.hostContextHandlers.add(e),()=>this.hostContextHandlers.delete(e)}onTeardown(e){return this.teardownHandlers.add(e),()=>this.teardownHandlers.delete(e)}getHostContext(){return this.context}getToolInput(){return this.currentToolInput}getToolOutput(){return this.currentToolOutput}getToolMeta(){return this.currentToolMeta}getHostCapabilities(){if(!this.app)return;let e=this.app.getHostCapabilities();if(!e)return;let t=e,o=this.app.getHostContext()?.availableDisplayModes;return {logging:t.logging,openLinks:t.openLinks,serverResources:t.serverResources,serverTools:t.serverTools,experimental:t.experimental,theming:{themes:["light","dark"]},displayModes:o?{modes:o}:void 0,statePersistence:{persistent:false},sizeNotifications:{},partialToolInput:{},appTools:{listChanged:false}}}getHostVersion(){if(!this.app)return;let e=this.app.getHostVersion();if(e)return {name:e.name,version:e.version}}async sendLog(e,t){if(!this.app)throw new d(g.NOT_CONNECTED,"MCP Apps adapter not connected");await this.app.sendLog({level:e,data:t,logger:"@mcp-apps-kit/ui"});}async sendLogs(e){if(!this.app)throw new d(g.NOT_CONNECTED,"MCP Apps adapter not connected");let t={debug:"debug",info:"info",warn:"warning",error:"error"},n=0;for(let o of e)try{await this.app.sendLog({level:t[o.level]??"info",data:o.data??o.message,logger:o.source??"@mcp-apps-kit/ui"}),n++;}catch{}return {processed:n}}async sendSizeChanged(e){if(!this.app)throw new d(g.NOT_CONNECTED,"MCP Apps adapter not connected");await this.app.sendSizeChanged({width:e.width,height:e.height});}onToolInputPartial(e){return this.toolInputPartialHandlers.add(e),()=>this.toolInputPartialHandlers.delete(e)}setCallToolHandler(e){this.callToolHandler=e;}setListToolsHandler(e){this.listToolsHandler=e;}};var w=class{constructor(){this.connected=false;this.state=null;this.toolResultHandlers=new Set;this.toolInputHandlers=new Set;this.toolCancelledHandlers=new Set;this.hostContextHandlers=new Set;this.teardownHandlers=new Set;this.logTransport="api";this.apiTransportFailed=false;this.toolTransportFailed=false;this.context=this.createDefaultContext();}configureLogging(e){e.transport!==void 0&&(this.logTransport=e.transport,this.apiTransportFailed=false,this.toolTransportFailed=false),e.apiEndpoint!==void 0&&(this.logApiEndpoint=e.apiEndpoint,this.apiTransportFailed=false);}createDefaultContext(){let e=typeof window<"u";return {theme:"light",displayMode:"inline",availableDisplayModes:["inline","fullscreen","pip"],viewport:{width:e?window.innerWidth:800,height:e?window.innerHeight:600},locale:e?navigator.language:"en-US",timeZone:Intl.DateTimeFormat().resolvedOptions().timeZone,platform:"web",deviceCapabilities:{touch:e?"ontouchstart"in window:false,hover:true}}}isSetGlobalsMessage(e){return e==="openai:set_globals"||typeof e=="object"&&e!==null&&"type"in e&&e.type==="openai:set_globals"||typeof e=="object"&&e!==null&&"message"in e&&e.message==="openai:set_globals"}readContextFromSDK(){let e=this.getOpenAI();if(!e)return;let t=typeof window<"u";if(typeof e.theme=="string"&&(this.context.theme=e.theme),typeof e.displayMode=="string"&&(this.context.displayMode=e.displayMode),typeof e.locale=="string"&&(this.context.locale=e.locale),typeof e.userAgent=="string"&&Object.assign(this.context,{userAgent:e.userAgent}),typeof e.view=="string"&&(this.context.view=e.view),e.safeArea&&typeof e.safeArea=="object"){let n=e.safeArea;this.context.safeAreaInsets={top:typeof n.top=="number"?n.top:0,right:typeof n.right=="number"?n.right:0,bottom:typeof n.bottom=="number"?n.bottom:0,left:typeof n.left=="number"?n.left:0};}typeof e.maxHeight=="number"&&(this.context.viewport={width:t?window.innerWidth:800,height:e.maxHeight}),i.debug("[OpenAI Adapter] Read context from SDK",this.context);}notifyContextChange(){i.debug(`[OpenAI Adapter] Notifying ${String(this.hostContextHandlers.size)} context change handlers`);let e={...this.context};for(let t of this.hostContextHandlers)t(e);}getOpenAI(){return typeof window<"u"&&"openai"in window?window.openai:null}getToolNameFromSDK(){let e=this.getOpenAI();if(e){if(e.toolResponseMetadata&&typeof e.toolResponseMetadata=="object"){let t=e.toolResponseMetadata;if(typeof t.toolName=="string")return t.toolName}if(typeof e.toolName=="string")return e.toolName}}async connect(){await this.waitForOpenAI();let e=this.getOpenAI();if(e){i.debug("[OpenAI Adapter] Available SDK methods",Object.keys(e)),this.readContextFromSDK();let t=this.getToolNameFromSDK();if(typeof e.getToolOutput=="function"?(this.currentToolOutput=e.getToolOutput(),i.debug("[OpenAI Adapter] Got tool output from SDK")):e.toolOutput?(this.currentToolOutput=e.toolOutput,i.debug("[OpenAI Adapter] Got tool output from SDK property")):e.result&&(this.currentToolOutput=e.result,i.debug("[OpenAI Adapter] Got result from SDK")),this.currentToolOutput&&Object.keys(this.currentToolOutput).length>0){let n=t?{[t]:this.currentToolOutput}:this.currentToolOutput;for(let o of this.toolResultHandlers)o(n);}typeof e.getToolInput=="function"?this.currentToolInput=e.getToolInput():e.toolInput?this.currentToolInput=e.toolInput:e.input&&(this.currentToolInput=e.input),typeof e.init=="function"&&await e.init();}this.setupGlobalsListener(),this.connected=true;}setupGlobalsListener(){typeof window>"u"||(this.setGlobalsHandler=e=>{let n=e.detail;if(!n){this.readContextFromSDK(),this.checkForToolOutputUpdate();return}let o=n.globals??n,s=this.context.theme,a=this.context.locale,l=this.context.displayMode,p=this.currentToolOutput;if(o.theme!==void 0&&(this.context.theme=o.theme),o.locale!==void 0&&(this.context.locale=o.locale),o.displayMode!==void 0&&(this.context.displayMode=o.displayMode),(this.context.theme!==s||this.context.locale!==a||this.context.displayMode!==l)&&(i.debug("[OpenAI Adapter] Context changed, notifying handlers"),this.notifyContextChange()),o.toolOutput!==void 0&&o.toolOutput!==null){let u=o.toolOutput;if(Object.keys(u).length>0&&u!==p){i.debug("[OpenAI Adapter] Got toolOutput from set_globals event",u),this.currentToolOutput=u;let f;o.toolResponseMetadata&&typeof o.toolResponseMetadata=="object"&&o.toolResponseMetadata.toolName?f=o.toolResponseMetadata.toolName:f=this.getToolNameFromSDK();let v=f?{[f]:u}:u;for(let c of this.toolResultHandlers)c(v);}}o.toolInput!==void 0&&(this.currentToolInput=o.toolInput);},window.addEventListener("openai:set_globals",this.setGlobalsHandler),this.globalsHandler=e=>{this.isSetGlobalsMessage(e.data)&&(i.debug("[OpenAI Adapter] Received set_globals via postMessage (legacy)"),this.readContextFromSDK(),this.checkForToolOutputUpdate());},window.addEventListener("message",this.globalsHandler));}checkForToolOutputUpdate(){let e=this.getOpenAI();if(!e)return;let t;if(e.toolOutput&&(t=e.toolOutput),t&&Object.keys(t).length>0&&t!==this.currentToolOutput){i.debug("[OpenAI Adapter] toolOutput updated",t),this.currentToolOutput=t;let n=this.getToolNameFromSDK(),o=n?{[n]:t}:t;for(let s of this.toolResultHandlers)s(o);}}async waitForOpenAI(e=5e3){if(this.getOpenAI()){i.debug("[OpenAI Adapter] window.openai already available");return}return i.debug("[OpenAI Adapter] Waiting for window.openai..."),new Promise(t=>{let n=Date.now(),o=false,s=()=>{o||(o=true,window.removeEventListener("message",l),t());},a=()=>{if(!o){if(this.getOpenAI()){i.debug("[OpenAI Adapter] window.openai found via polling"),s();return}if(Date.now()-n>e){i.warn("[OpenAI Adapter] window.openai not found after timeout, proceeding anyway"),s();return}setTimeout(a,50);}},l=p=>{this.isSetGlobalsMessage(p.data)&&(i.debug("[OpenAI Adapter] Received set_globals message"),setTimeout(()=>{this.getOpenAI()?(i.debug("[OpenAI Adapter] window.openai available after set_globals"),s()):i.debug("[OpenAI Adapter] window.openai still not available after set_globals, continuing poll");},50));};window.addEventListener("message",l),a();})}isConnected(){return this.connected}async callTool(e,t){let n=this.getOpenAI();if(n&&typeof n.callTool=="function")return n.callTool(e,t);throw new Error("OpenAI SDK not available")}async sendMessage(e){let t=this.getOpenAI();t&&typeof t.sendMessage=="function"&&await t.sendMessage(e);}async openLink(e){let t=this.getOpenAI();t&&typeof t.openLink=="function"?await t.openLink(e):window.open(e,"_blank");}async requestDisplayMode(e){let t=this.getOpenAI();if(t&&typeof t.requestDisplayMode=="function"){let n=await t.requestDisplayMode({mode:e});return this.context={...this.context,displayMode:n.mode},this.notifyContextChange(),n}return this.context={...this.context,displayMode:e},this.notifyContextChange(),{mode:e}}requestClose(){let e=this.getOpenAI();e&&typeof e.close=="function"&&e.close();}getState(){return this.state}setState(e){this.state=e;let t=this.getOpenAI();t&&typeof t.setState=="function"&&t.setState(e);}async uploadFile(e){let t=this.getOpenAI();if(t&&typeof t.uploadFile=="function")return t.uploadFile(e);throw new Error("File upload not supported")}async getFileDownloadUrl(e){let t=this.getOpenAI();if(t&&typeof t.getFileDownloadUrl=="function")return t.getFileDownloadUrl(e);throw new Error("File download not supported")}async readResource(e){let t=this.getOpenAI();return t&&typeof t.readResource=="function"?t.readResource(e):{contents:[]}}log(e,t){({debug:console.debug,info:console.info,warning:console.warn,error:console.error}[e]??console.log)("[ChatGPT Apps]",t);}onToolResult(e){return this.toolResultHandlers.add(e),()=>this.toolResultHandlers.delete(e)}onToolInput(e){return this.toolInputHandlers.add(e),()=>this.toolInputHandlers.delete(e)}onToolCancelled(e){return this.toolCancelledHandlers.add(e),()=>this.toolCancelledHandlers.delete(e)}onHostContextChange(e){return this.hostContextHandlers.add(e),i.debug(`[OpenAI Adapter] Host context handler added, total: ${String(this.hostContextHandlers.size)}`),()=>{this.hostContextHandlers.delete(e),i.debug(`[OpenAI Adapter] Host context handler removed, total: ${String(this.hostContextHandlers.size)}`);}}onTeardown(e){return this.teardownHandlers.add(e),()=>this.teardownHandlers.delete(e)}getHostContext(){return this.context}getToolInput(){return this.currentToolInput}getToolOutput(){if(!this.currentToolOutput)return;let e=this.getToolNameFromSDK();return e?{[e]:this.currentToolOutput}:this.currentToolOutput}getToolMeta(){return this.currentToolMeta}getHostCapabilities(){let e=this.getOpenAI(),t=e&&typeof e.uploadFile=="function",n=this.context.safeAreaInsets!==void 0,o=this.context.view!==void 0;return {openLinks:{},logging:{},theming:{themes:["light","dark"]},displayModes:{modes:["inline","fullscreen","pip"]},statePersistence:{persistent:false},fileUpload:t?{}:void 0,safeAreaInsets:n?{}:void 0,views:o?{}:void 0}}getHostVersion(){}async sendLog(e,t){let o={level:{debug:"debug",info:"info",notice:"info",warning:"warn",error:"error",critical:"error",alert:"error",emergency:"error"}[e],message:typeof t=="string"?t:JSON.stringify(t),data:typeof t=="string"?void 0:t,timestamp:new Date().toISOString(),source:"openai-adapter"};await this.sendLogs([o]);}async sendLogs(e){if(this.logTransport==="api"&&this.logApiEndpoint&&!this.apiTransportFailed)try{let t=await fetch(this.logApiEndpoint,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({entries:e})});if(!t.ok)throw new Error(`API request failed with status ${String(t.status)}`);return await t.json()}catch(t){this.apiTransportFailed=true,i.info("[OpenAI Adapter] API log transport failed, trying fallback",{error:t instanceof Error?t.message:t});}if((this.logTransport==="tool"||this.apiTransportFailed)&&!this.toolTransportFailed&&this.connected)try{return await this.callTool("log_debug",{entries:e})}catch(t){this.toolTransportFailed=true,i.info("[OpenAI Adapter] Tool log transport failed, falling back to console",{error:t instanceof Error?t.message:t});}for(let t of e)this.log(t.level==="warn"?"warning":t.level,t.data??t.message);return {processed:e.length}}async sendSizeChanged(e){let t=this.getOpenAI();t&&typeof t.notifyIntrinsicHeight=="function"&&t.notifyIntrinsicHeight(e.height);}onToolInputPartial(e){return this.log("debug","onToolInputPartial is not supported on ChatGPT"),()=>{}}setCallToolHandler(e){this.log("debug","setCallToolHandler is not supported on ChatGPT");}setListToolsHandler(e){this.log("debug","setListToolsHandler is not supported on ChatGPT");}};function V(){let r=window.location.href;if(r.includes("/api/apps/chatgpt/")||r.includes("chatgpt")||r.includes("sandbox-proxy")||r.includes("widget-content"))return true;let e=document.referrer;return !!(e.includes("chatgpt")||e.includes("openai.com"))}function C(){return typeof window>"u"?"mock":"openai"in window||V()?"openai":window.parent!==window?"mcp":"mock"}function $(r){return new Proxy({},{get(e,t){if(typeof t!="string"||!t.startsWith("call"))return;let n=t.slice(4);if(n.length===0)return;let o=n.charAt(0).toLowerCase()+n.slice(1);return s=>r(o,s)},has(e,t){return typeof t=="string"&&t.startsWith("call")&&t.length>4},ownKeys(){return []},getOwnPropertyDescriptor(e,t){if(typeof t=="string"&&t.startsWith("call")&&t.length>4)return {configurable:true,enumerable:true,writable:false}}})}function b(r){async function e(o,s){return await r.callTool(o,s)}let t=$(e);return {callTool:e,tools:t,async sendMessage(o){await r.sendMessage(o);},async sendFollowUpMessage(o){await r.sendMessage({type:"text",text:o});},async openLink(o){await r.openLink(o);},async requestDisplayMode(o){return r.requestDisplayMode(o)},requestClose(){r.requestClose();},getState(){return r.getState()},setState(o){r.setState(o);},...r.uploadFile&&{uploadFile:o=>{if(r.uploadFile)return r.uploadFile(o);throw new Error("uploadFile not supported")}},...r.getFileDownloadUrl&&{getFileDownloadUrl:o=>{if(r.getFileDownloadUrl)return r.getFileDownloadUrl(o);throw new Error("getFileDownloadUrl not supported")}},async readResource(o){return r.readResource(o)},log(o,s){r.log(o,s);},onToolResult(o){return r.onToolResult(o)},onToolInput(o){return r.onToolInput(o)},onToolCancelled(o){return r.onToolCancelled(o)},onHostContextChange(o){return r.onHostContextChange(o)},onTeardown(o){return r.onTeardown(o)},onToolInputPartial(o){return r.onToolInputPartial(o)},getHostCapabilities(){return r.getHostCapabilities()},getHostVersion(){return r.getHostVersion()},async sendLog(o,s){return r.sendLog(o,s)},async sendSizeChanged(o){return r.sendSizeChanged(o)},setupSizeChangedNotifications(){if(typeof window>"u"||typeof ResizeObserver>"u")return ()=>{};let o=new ResizeObserver(s=>{for(let a of s){let{width:l,height:p}=a.contentRect;r.sendSizeChanged({width:Math.round(l),height:Math.round(p)});}});return o.observe(document.body),()=>{o.disconnect();}},setCallToolHandler(o){r.setCallToolHandler(o);},setListToolsHandler(o){r.setListToolsHandler(o);},get hostContext(){return r.getHostContext()},get toolInput(){return r.getToolInput()},get toolOutput(){return r.getToolOutput()},get toolMeta(){return r.getToolMeta()}}}function K(r){switch(r){case "mcp":return new m;case "openai":return new w;case "mock":return new h;default:throw new Error(`Unknown adapter type: ${r}`)}}async function fe(r){let e=r?.forceAdapter??C();if(!["mcp","openai","mock"].includes(e))throw new Error(`Unknown adapter type: ${e}`);let t=K(e);return await t.connect(),i.setAdapter(t),b(t)}export{y as ClientDebugLogger,D as LATEST_PROTOCOL_VERSION,m as McpAdapter,h as MockAdapter,w as OpenAIAdapter,_ as RESOURCE_MIME_TYPE,F as RESOURCE_URI_META_KEY,d as UIError,g as UIErrorCode,x as applyDocumentTheme,A as applyHostFonts,H as applyHostStyleVariables,I as clearHostStyleVariables,i as clientDebugLogger,b as createAppsClient,fe as createClient,C as detectProtocol,k as getDocumentTheme,N as getMcpServerBaseUrl,L as getMcpServerConfig,O as removeHostFonts,E as safeSerialize,P as safeStringify,S as shouldLog};//# sourceMappingURL=index.js.map
//# sourceMappingURL=index.js.map
{
"name": "@mcp-apps-kit/ui",
"version": "0.2.8",
"version": "0.3.0",
"description": "Client-side SDK for MCP applications (vanilla JavaScript)",

@@ -5,0 +5,0 @@ "type": "module",

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is too big to display