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.3.0
to
0.4.0
+1
-1
dist/index.cjs

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

'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
'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 H(){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 k(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 O(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 A(){if(typeof document>"u")return;let r=document.getElementById(T);r&&r.remove();}function R(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 I={debug:0,info:1,warn:2,error:3};function S(r,e){return I[r]>=I[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(e){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(),this.autoResize=e?.autoResize??true;}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:{}},{autoResize:this.autoResize}),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=n.theme;(t.theme==="dark"||t.theme==="light")&&(o=t.theme);let 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 s={level:["debug","info","notice","warning","error","critical","alert","emergency"].includes(e)?e:"info",data:t,logger:"@mcp-apps-kit/ui"};try{this.app.sendLog(s);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){if(e.type!=="text")throw new Error(`Unsupported message content type: ${e.type}`);let t=this.getOpenAI();t&&typeof t.sendFollowUpMessage=="function"&&await t.sendFollowUpMessage({prompt:e.text});}async openLink(e){let t=this.getOpenAI();t&&typeof t.openExternal=="function"?await t.openExternal({href: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.setWidgetState=="function"&&t.setWidgetState(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 C(){if(typeof window>"u")return "mock";if("openai"in window)return "openai";let r=window.location.href,e=document.referrer;return r.includes("/api/apps/chatgpt/")||r.includes("chatgpt")||r.includes("sandbox-proxy")||r.includes("widget-content")||e.includes("chatgpt")||e.includes("openai.com")?"openai":window.parent!==window?"mcp":"mock"}function V(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=V(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:r.uploadFile.bind(r)},...r.getFileDownloadUrl&&{getFileDownloadUrl:r.getFileDownloadUrl.bind(r)},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 $(r,e){switch(r){case "mcp":return new m(e?.mcp);case "openai":return new w;case "mock":return new h;default:throw new Error(`Unknown adapter type: ${r}`)}}async function ge(r){let e=r?.forceAdapter??C();if(!["mcp","openai","mock"].includes(e))throw new Error(`Unknown adapter type: ${e}`);let t=r?.autoResize!==void 0?{mcp:{autoResize:r.autoResize}}:void 0,n=$(e,t);return await n.connect(),i.setAdapter(n),b(n)}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=O;exports.applyHostStyleVariables=k;exports.clearHostStyleVariables=R;exports.clientDebugLogger=i;exports.createAppsClient=b;exports.createClient=ge;exports.detectProtocol=C;exports.getDocumentTheme=H;exports.getMcpServerBaseUrl=N;exports.getMcpServerConfig=L;exports.removeHostFonts=A;exports.safeSerialize=E;exports.safeStringify=P;exports.shouldLog=S;//# sourceMappingURL=index.cjs.map
//# sourceMappingURL=index.cjs.map

@@ -74,3 +74,3 @@ /**

interface HostVersion {
/** Host application name (e.g., "Claude Desktop") */
/** Host application name (e.g., "MCP Host") */
name: string;

@@ -581,2 +581,12 @@ /** Host application version */

forceAdapter?: "mcp" | "openai" | "mock";
/**
* Enable automatic size change notifications (MCP adapter only)
*
* When enabled, the UI automatically reports its size changes to the host
* using a ResizeObserver on document.body and document.documentElement.
* The host can then resize the UI container accordingly.
*
* @default true
*/
autoResize?: boolean;
}

@@ -987,3 +997,3 @@ /**

* Implemented by:
* - McpAppsAdapter: For Claude Desktop (MCP Apps)
* - McpAppsAdapter: For MCP Apps hosts
* - ChatGptAppsAdapter: For ChatGPT (OpenAI Apps SDK)

@@ -1429,5 +1439,5 @@ * - MockAdapter: For development/testing

/**
* MCP Apps adapter for Claude Desktop
* MCP Apps adapter
*
* Implements the ProtocolAdapter interface for MCP Apps running in Claude Desktop.
* Implements the ProtocolAdapter interface for MCP Apps hosts.
* Uses @modelcontextprotocol/ext-apps (JSON-RPC over postMessage + ui/initialize).

@@ -1439,3 +1449,18 @@ *

/**
* Adapter for MCP Apps (Claude Desktop)
* Options for configuring the MCP adapter
*/
type McpAdapterOptions = {
/**
* Enable automatic size change notifications
*
* When enabled, the UI automatically reports its size changes to the host
* using a ResizeObserver on document.body and document.documentElement.
* The host can then resize the UI container accordingly.
*
* @default true
*/
autoResize?: boolean;
};
/**
* Adapter for MCP Apps hosts
*

@@ -1462,3 +1487,4 @@ * @internal

private listToolsHandler?;
constructor();
private readonly autoResize;
constructor(options?: McpAdapterOptions);
private createDefaultContext;

@@ -1713,3 +1739,3 @@ connect(): Promise<void>;

*
* // Auto-detects platform (Claude Desktop vs ChatGPT)
* // Auto-detects platform (MCP Apps vs ChatGPT)
* const client = await createClient();

@@ -1730,3 +1756,3 @@ *

*
* Automatically detects the host platform (Claude Desktop vs ChatGPT)
* Automatically detects the host platform (MCP Apps vs ChatGPT)
* and returns a client with the appropriate adapter.

@@ -1745,2 +1771,5 @@ *

*
* // Disable auto-resize for MCP adapter
* const client = await createClient({ autoResize: false });
*
* // With typed tools

@@ -1753,2 +1782,2 @@ * import type { app } from "./server";

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 };
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 McpAdapterOptions, 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 };

@@ -74,3 +74,3 @@ /**

interface HostVersion {
/** Host application name (e.g., "Claude Desktop") */
/** Host application name (e.g., "MCP Host") */
name: string;

@@ -581,2 +581,12 @@ /** Host application version */

forceAdapter?: "mcp" | "openai" | "mock";
/**
* Enable automatic size change notifications (MCP adapter only)
*
* When enabled, the UI automatically reports its size changes to the host
* using a ResizeObserver on document.body and document.documentElement.
* The host can then resize the UI container accordingly.
*
* @default true
*/
autoResize?: boolean;
}

@@ -987,3 +997,3 @@ /**

* Implemented by:
* - McpAppsAdapter: For Claude Desktop (MCP Apps)
* - McpAppsAdapter: For MCP Apps hosts
* - ChatGptAppsAdapter: For ChatGPT (OpenAI Apps SDK)

@@ -1429,5 +1439,5 @@ * - MockAdapter: For development/testing

/**
* MCP Apps adapter for Claude Desktop
* MCP Apps adapter
*
* Implements the ProtocolAdapter interface for MCP Apps running in Claude Desktop.
* Implements the ProtocolAdapter interface for MCP Apps hosts.
* Uses @modelcontextprotocol/ext-apps (JSON-RPC over postMessage + ui/initialize).

@@ -1439,3 +1449,18 @@ *

/**
* Adapter for MCP Apps (Claude Desktop)
* Options for configuring the MCP adapter
*/
type McpAdapterOptions = {
/**
* Enable automatic size change notifications
*
* When enabled, the UI automatically reports its size changes to the host
* using a ResizeObserver on document.body and document.documentElement.
* The host can then resize the UI container accordingly.
*
* @default true
*/
autoResize?: boolean;
};
/**
* Adapter for MCP Apps hosts
*

@@ -1462,3 +1487,4 @@ * @internal

private listToolsHandler?;
constructor();
private readonly autoResize;
constructor(options?: McpAdapterOptions);
private createDefaultContext;

@@ -1713,3 +1739,3 @@ connect(): Promise<void>;

*
* // Auto-detects platform (Claude Desktop vs ChatGPT)
* // Auto-detects platform (MCP Apps vs ChatGPT)
* const client = await createClient();

@@ -1730,3 +1756,3 @@ *

*
* Automatically detects the host platform (Claude Desktop vs ChatGPT)
* Automatically detects the host platform (MCP Apps vs ChatGPT)
* and returns a client with the appropriate adapter.

@@ -1745,2 +1771,5 @@ *

*
* // Disable auto-resize for MCP adapter
* const client = await createClient({ autoResize: false });
*
* // With typed tools

@@ -1753,2 +1782,2 @@ * import type { app } from "./server";

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 };
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 McpAdapterOptions, 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 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
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 H(){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 k(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 O(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 A(){if(typeof document>"u")return;let r=document.getElementById(T);r&&r.remove();}function R(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 I={debug:0,info:1,warn:2,error:3};function S(r,e){return I[r]>=I[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(e){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(),this.autoResize=e?.autoResize??true;}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:{}},{autoResize:this.autoResize}),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=n.theme;(t.theme==="dark"||t.theme==="light")&&(o=t.theme);let 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 s={level:["debug","info","notice","warning","error","critical","alert","emergency"].includes(e)?e:"info",data:t,logger:"@mcp-apps-kit/ui"};try{this.app.sendLog(s);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){if(e.type!=="text")throw new Error(`Unsupported message content type: ${e.type}`);let t=this.getOpenAI();t&&typeof t.sendFollowUpMessage=="function"&&await t.sendFollowUpMessage({prompt:e.text});}async openLink(e){let t=this.getOpenAI();t&&typeof t.openExternal=="function"?await t.openExternal({href: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.setWidgetState=="function"&&t.setWidgetState(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 C(){if(typeof window>"u")return "mock";if("openai"in window)return "openai";let r=window.location.href,e=document.referrer;return r.includes("/api/apps/chatgpt/")||r.includes("chatgpt")||r.includes("sandbox-proxy")||r.includes("widget-content")||e.includes("chatgpt")||e.includes("openai.com")?"openai":window.parent!==window?"mcp":"mock"}function V(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=V(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:r.uploadFile.bind(r)},...r.getFileDownloadUrl&&{getFileDownloadUrl:r.getFileDownloadUrl.bind(r)},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 $(r,e){switch(r){case "mcp":return new m(e?.mcp);case "openai":return new w;case "mock":return new h;default:throw new Error(`Unknown adapter type: ${r}`)}}async function ge(r){let e=r?.forceAdapter??C();if(!["mcp","openai","mock"].includes(e))throw new Error(`Unknown adapter type: ${e}`);let t=r?.autoResize!==void 0?{mcp:{autoResize:r.autoResize}}:void 0,n=$(e,t);return await n.connect(),i.setAdapter(n),b(n)}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,O as applyHostFonts,k as applyHostStyleVariables,R as clearHostStyleVariables,i as clientDebugLogger,b as createAppsClient,ge as createClient,C as detectProtocol,H as getDocumentTheme,N as getMcpServerBaseUrl,L as getMcpServerConfig,A 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.3.0",
"version": "0.4.0",
"description": "Client-side SDK for MCP applications (vanilla JavaScript)",

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

@@ -91,2 +91,28 @@ # @mcp-apps-kit/ui

### Automatic size notifications
By default, the MCP adapter automatically reports UI size changes to the host using a `ResizeObserver`. This allows the host to resize the UI container accordingly.
To disable automatic size change notifications:
```ts
import { createClient } from "@mcp-apps-kit/ui";
const client = await createClient({ autoResize: false });
```
When disabled, you can manually send size notifications:
```ts
await client.sendSizeChanged({ width: 800, height: 600 });
```
**When to disable `autoResize`:**
- When you want manual control over size notifications
- When your UI has a fixed size that never changes
- When implementing custom resize behavior
**Default:** `true` (auto-resize enabled)
## Debug Logging

@@ -131,2 +157,4 @@

- `createClient(options?)` - Create a connected client with auto-detection
- `options.forceAdapter` - Force a specific adapter ("mcp" | "openai" | "mock")
- `options.autoResize` - Enable/disable automatic size change notifications (default: `true`, MCP only)
- `detectProtocol()` - Detect the host platform ("mcp" | "openai" | "mock")

@@ -180,3 +208,3 @@

const version = client.getHostVersion();
// { name: "Claude Desktop", version: "1.0.0" } (MCP Apps only)
// { name: "MCP Host", version: "1.0.0" } (MCP Apps only)
```

@@ -183,0 +211,0 @@

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

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