From 0b4c80e69d8bb7a8df7a56bf70756b60b7c7ff99 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 23 Oct 2026 18:45:15 +0000 Subject: [PATCH 1/9] chore(deps): update dependency @modelcontextprotocol/client to v2.4.0 --- pnpm-lock.yaml | 37 +++++++++++++++++++++++++------------ 1 file changed, 25 insertions(+), 12 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8dff9a0b32..1698e5f2b9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -286,10 +286,10 @@ importers: dependencies: '@modelcontextprotocol/client': specifier: ^2.3.1 - version: 2.3.1 + version: 2.4.0 '@modelcontextprotocol/ext-apps': specifier: ^2.0.3 - version: 2.0.3(@modelcontextprotocol/client@2.3.1)(@modelcontextprotocol/core@2.3.1)(@modelcontextprotocol/server@2.3.1)(react-dom@19.3.1(react@19.3.1))(react@19.3.1)(zod@4.6.7) + version: 2.0.3(@modelcontextprotocol/client@2.4.0)(@modelcontextprotocol/core@2.4.0)(@modelcontextprotocol/server@2.3.1)(react-dom@19.3.1(react@19.3.1))(react@19.3.1)(zod@4.6.7) '@modelcontextprotocol/node': specifier: ^2.1.1 version: 2.1.1(@modelcontextprotocol/server@2.3.1) @@ -298,7 +298,7 @@ importers: version: 2.3.1 '@openai/mcp-extensions': specifier: ^0.2.0 - version: 0.2.1(@modelcontextprotocol/ext-apps@2.0.3(@modelcontextprotocol/client@2.3.1)(@modelcontextprotocol/core@2.3.1)(@modelcontextprotocol/server@2.3.1)(react-dom@19.3.1(react@19.3.1))(react@19.3.1)(zod@4.6.7))(@modelcontextprotocol/sdk@1.32.1(@cfworker/json-schema@4.1.1)(zod@4.6.7))(@modelcontextprotocol/server@2.3.1) + version: 0.2.1(@modelcontextprotocol/ext-apps@2.0.3(@modelcontextprotocol/client@2.4.0)(@modelcontextprotocol/core@2.4.0)(@modelcontextprotocol/server@2.3.1)(react-dom@19.3.1(react@19.3.1))(react@19.3.1)(zod@4.6.7))(@modelcontextprotocol/sdk@1.32.1(@cfworker/json-schema@4.1.1)(zod@4.6.7))(@modelcontextprotocol/server@2.3.1) '@tracedecay/sdk': specifier: workspace:* version: link:../../sdks/typescript @@ -824,14 +824,18 @@ packages: '@jridgewell/trace-mapping@0.3.31': resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} - '@modelcontextprotocol/client@2.3.1': - resolution: {integrity: sha512-mIGZXpHsjnZ6lD+gD/WCMpR5k8yVQQ8nNFH1N0Srf7AvnwTUMYD6pvTY8ng2+He5FfV7YMZLmrjL7cLa/cc3dQ==} + '@modelcontextprotocol/client@2.4.0': + resolution: {integrity: sha512-LgrD2OphHuG12vfKFKz6SOnq7bKHQmhGJIAYdD+MZBn2npHEyry6uD8zvktodtl5CQM85MO0anUyD9JwmUmxww==} engines: {node: '>=20'} '@modelcontextprotocol/core@2.3.1': resolution: {integrity: sha512-laVmIhPGpWi7rG9q+0UigblRN0Hws/Yjlb6qLFtVqryXVLkc4h+yN8z731POD2LnAGQlFe7/tXhUm7Bi0YB91g==} engines: {node: '>=20'} + '@modelcontextprotocol/core@2.4.0': + resolution: {integrity: sha512-z8QBKqdfXLPzkLQuG4xp8hrVEMm1PZ1IgxMN2sMbJiFiAKOWXnAzogXn2W4aqIBlP1ea6U5yiqVquvUNM1Cj6Q==} + engines: {node: '>=20'} + '@modelcontextprotocol/ext-apps@2.0.3': resolution: {integrity: sha512-Tn+4+cyhO4f4cQSDxNyLiIfEE+qlTTuIbWBJB8JTinEXOhDYgCT4wDTQplxD9MBYZH5pCYGC59GaxiwIT4bu8w==} engines: {node: '>=20'} @@ -1737,6 +1741,11 @@ packages: ajv-formats@3.0.1: resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true ajv@8.20.0: resolution: {integrity: sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==} @@ -3383,9 +3392,9 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.6.0 - '@modelcontextprotocol/client@2.3.1': + '@modelcontextprotocol/client@2.4.0': dependencies: - '@modelcontextprotocol/core': 2.3.1 + '@modelcontextprotocol/core': 2.4.0 cross-spawn: 7.0.6 eventsource: 3.0.7 eventsource-parser: 3.1.1 @@ -3397,10 +3406,14 @@ snapshots: dependencies: zod: 4.6.7 - '@modelcontextprotocol/ext-apps@2.0.3(@modelcontextprotocol/client@2.3.1)(@modelcontextprotocol/core@2.3.1)(@modelcontextprotocol/server@2.3.1)(react-dom@19.3.1(react@19.3.1))(react@19.3.1)(zod@4.6.7)': + '@modelcontextprotocol/core@2.4.0': dependencies: - '@modelcontextprotocol/client': 2.3.1 - '@modelcontextprotocol/core': 2.3.1 + zod: 4.6.7 + + '@modelcontextprotocol/ext-apps@2.0.3(@modelcontextprotocol/client@2.4.0)(@modelcontextprotocol/core@2.4.0)(@modelcontextprotocol/server@2.3.1)(react-dom@19.3.1(react@19.3.1))(react@19.3.1)(zod@4.6.7)': + dependencies: + '@modelcontextprotocol/client': 2.4.0 + '@modelcontextprotocol/core': 2.4.0 '@standard-schema/spec': 1.1.0 zod: 4.6.7 optionalDependencies: @@ -3466,13 +3479,13 @@ snapshots: '@open-draft/until@3.0.1': {} - '@openai/mcp-extensions@0.2.1(@modelcontextprotocol/ext-apps@2.0.3(@modelcontextprotocol/client@2.3.1)(@modelcontextprotocol/core@2.3.1)(@modelcontextprotocol/server@2.3.1)(react-dom@19.3.1(react@19.3.1))(react@19.3.1)(zod@4.6.7))(@modelcontextprotocol/sdk@1.32.1(@cfworker/json-schema@4.1.1)(zod@4.6.7))(@modelcontextprotocol/server@2.3.1)': + '@openai/mcp-extensions@0.2.1(@modelcontextprotocol/ext-apps@2.0.3(@modelcontextprotocol/client@2.4.0)(@modelcontextprotocol/core@2.4.0)(@modelcontextprotocol/server@2.3.1)(react-dom@19.3.1(react@19.3.1))(react@19.3.1)(zod@4.6.7))(@modelcontextprotocol/sdk@1.32.1(@cfworker/json-schema@4.1.1)(zod@4.6.7))(@modelcontextprotocol/server@2.3.1)': dependencies: '@cfworker/json-schema': 4.1.1 '@modelcontextprotocol/core': 2.3.1 zod: 4.4.3 optionalDependencies: - '@modelcontextprotocol/ext-apps': 2.0.3(@modelcontextprotocol/client@2.3.1)(@modelcontextprotocol/core@2.3.1)(@modelcontextprotocol/server@2.3.1)(react-dom@19.3.1(react@19.3.1))(react@19.3.1)(zod@4.6.7) + '@modelcontextprotocol/ext-apps': 2.0.3(@modelcontextprotocol/client@2.4.0)(@modelcontextprotocol/core@2.4.0)(@modelcontextprotocol/server@2.3.1)(react-dom@19.3.1(react@19.3.1))(react@19.3.1)(zod@4.6.7) '@modelcontextprotocol/sdk': 1.32.1(@cfworker/json-schema@4.1.1)(zod@4.6.7) '@modelcontextprotocol/server': 2.3.1 From 911c359dc28e80ff1004d36aa032235692b1b4bb Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 23 Oct 2026 18:46:49 +0000 Subject: [PATCH 2/9] build(plugin): regenerate embedded host bundles --- plugin/chatgpt-extension/embedded/app.html | 24 +++++++------- plugin/chatgpt-extension/embedded/server.mjs | 34 ++++++++++---------- 2 files changed, 29 insertions(+), 29 deletions(-) diff --git a/plugin/chatgpt-extension/embedded/app.html b/plugin/chatgpt-extension/embedded/app.html index 90d3ee9f25..80f6919e7e 100644 --- a/plugin/chatgpt-extension/embedded/app.html +++ b/plugin/chatgpt-extension/embedded/app.html @@ -7,12 +7,12 @@
- +- "app": Tool callable by the app from this server only`),csp:n0().optional(),permissions:n0().optional()}),n9({mimeTypes:n2(nm()).optional().describe('Array of supported MIME types for UI resources.\nMust include `"text/html;profile=mcp-app"` for MCP Apps support.')}),n9({method:il("ui/download-file"),params:n9({contents:n2(n3([a2,a4])).describe("Resource contents to download — embedded (inline data) or linked (host fetches). Uses standard MCP resource types.")})}),n9({method:il("ui/message"),params:n9({role:il("user").describe('Message role, currently only "user" is supported.'),content:n2(a9).describe("Message content blocks (text, image, etc.).")})}),n9({method:il("ui/notifications/sandbox-resource-ready"),params:n9({html:nm().describe("HTML content to load into the inner iframe."),sandbox:nm().optional().describe("Optional override for the inner iframe's sandbox attribute."),csp:ur.optional().describe("CSP configuration from resource metadata."),permissions:uo.optional().describe("Sandbox permissions from resource metadata.")})}),n9({method:il("ui/notifications/tool-result"),params:so.describe("Standard MCP tool execution result.")})),ug=n9({toolInfo:n9({id:iG.optional().describe("JSON-RPC id of the tools/call request."),tool:se.describe("Tool definition including name, inputSchema, etc.")}).optional().describe("Metadata of the tool call that instantiated this App."),theme:c6.optional().describe("Current color theme preference."),styles:ul.optional().describe("Style configuration for theming the app."),displayMode:c3.optional().describe("How the UI is currently displayed."),availableDisplayModes:n2(c3).optional().describe("Display modes the host supports."),containerDimensions:n3([n9({height:nL().describe("Fixed container height in pixels.")}),n9({maxHeight:n3([nL(),nZ()]).optional().describe("Maximum container height in pixels.")})]).and(n3([n9({width:nL().describe("Fixed container width in pixels.")}),n9({maxWidth:n3([nL(),nZ()]).optional().describe("Maximum container width in pixels.")})])).optional().describe(`Container dimensions. Represents the dimensions of the iframe or other +container holding the app. Specify either width or maxWidth, and either height or maxHeight.`),locale:nm().optional().describe("User's language and region preference in BCP 47 format."),timeZone:nm().optional().describe("User's timezone in IANA format."),userAgent:nm().optional().describe("Host application identifier."),platform:n3([il("web"),il("desktop"),il("mobile")]).optional().describe("Platform type for responsive design decisions."),deviceCapabilities:n9({touch:nD().optional().describe("Whether the device supports touch input."),hover:nD().optional().describe("Whether the device supports hover interactions.")}).optional().describe("Device input capabilities."),safeAreaInsets:n9({top:nL().describe("Top safe area inset in pixels."),right:nL().describe("Right safe area inset in pixels."),bottom:nL().describe("Bottom safe area inset in pixels."),left:nL().describe("Left safe area inset in pixels.")}).optional().describe("Mobile safe area boundaries in pixels.")}).passthrough(),uv=n9({method:il("ui/notifications/host-context-changed"),params:ug.describe("Partial context update containing only changed fields.")}),uS=(n9({method:il("ui/update-model-context"),params:n9({content:n2(a9).optional().describe("Context content blocks (text, image, etc.)."),structuredContent:io(nm(),nY().describe("Structured content for machine-readable context data.")).optional().describe("Structured content for machine-readable context data.")})}),n9({method:il("ui/initialize"),params:n9({appInfo:i7.describe("App identification (name and version)."),appCapabilities:uh.describe("Features and capabilities this app provides."),protocolVersion:nm().describe("Protocol version this app supports.")})}),n9({protocolVersion:nm().describe('Negotiated protocol version string (e.g., "2025-11-21").'),hostInfo:i7.describe("Host application identification and version."),hostCapabilities:up.describe("Features and capabilities provided by the host."),hostContext:ug.describe("Rich context about the host environment.")}).passthrough()),ub={target:"draft-2020-12"};async function u_(e,t){let r=e["~standard"];if(r.jsonSchema)return r.jsonSchema[t](ub);throw Error(`Schema (vendor: ${r.vendor}) does not implement Standard JSON Schema (~standard.jsonSchema). Use a library that does (zod v4, ArkType, Valibot) or wrap your schema accordingly.`)}async function uw(e,t,r=""){let o=await e["~standard"].validate(t);if(o.issues)throw Error(r+o.issues.map(e=>{let t=e.path?.map(e=>"object"==typeof e?e.key:e).join(".");return t?`${t}: ${e.message}`:e.message}).join("; "));return o.value}class uR extends cL{_appInfo;_appCapabilities;options;_hostCapabilities;_hostInfo;_hostContext;_registeredTools={};_initializedSent=!1;_registeredEvents=new Set;_events=new c1;_methods=new c2;setRequestHandler=(...e)=>{let[t,...r]=c9("request",e)??e;this._methods.claim(t,"setRequestHandler"),super.setRequestHandler.call(this,t,...r)};setNotificationHandler=(...e)=>{let[t,...r]=c9("notification",e)??e;this._methods.claim(t,"setNotificationHandler"),super.setNotificationHandler.call(this,t,...r)};removeRequestHandler=e=>{this._methods.release(e),super.removeRequestHandler(e)};removeNotificationHandler=e=>{this._methods.release(e),super.removeNotificationHandler(e)};replaceRequestHandler=(e,...t)=>{this._methods.replace(e),super.setRequestHandler.call(this,e,...t)};_assertInitialized(e){if(this._initializedSent)return;let t=`[ext-apps] App.${e}() called before connect() completed the ui/initialize handshake. Await app.connect() before calling this method, or move data loading to an ontoolresult handler.`;if(this.options?.strict)throw Error(t);console.warn(`${t}. This will throw in a future release.`)}eventSchemas={toolinput:un,toolinputpartial:ui,toolresult:uy,toolcancelled:ua,hostcontextchanged:uv};static ONE_SHOT_EVENTS=new Set(["toolinput","toolinputpartial","toolresult","toolcancelled"]);_everHadListener=new Set;_assertHandlerTiming(e){if(!uR.ONE_SHOT_EVENTS.has(e)||this._everHadListener.has(e)||(this._everHadListener.add(e),!this._initializedSent))return;let t=`[ext-apps] "${String(e)}" handler registered after connect() completed the ui/initialize handshake. The host may have already sent this notification. Register handlers before calling app.connect().`;if(this.options?.strict)throw Error(t);console.warn(t)}setEventHandler(e,t){t&&this._assertHandlerTiming(e),this._ensureEventSlot(e),this._events.setHandler(e,t)}addEventListener(e,t){this._assertHandlerTiming(e),this._ensureEventSlot(e),this._events.addEventListener(e,t)}removeEventListener(e,t){this._events.removeEventListener(e,t)}_ensureEventSlot(e){if(this._registeredEvents.has(e))return;let t=this.eventSchemas[e];if(!t)throw Error(`Unknown event: ${String(e)}`);this.setNotificationHandler(t.shape.method.value,{params:t.shape.params},t=>{"hostcontextchanged"===e&&(this._hostContext={...this._hostContext,...t}),this._events.dispatch(e,t)}),this._registeredEvents.add(e)}getEventHandler(e){return this._events.getHandler(e)}warnIfRequestHandlerReplaced(e,t,r){t&&r&&console.warn(`[MCP Apps] ${e} handler replaced. Previous handler will no longer be called.`)}constructor(e,t={},r={autoResize:!0}){super(r),this._appInfo=e,this._appCapabilities=t,this.options=r,this._methods.replace("notifications/cancelled"),this._methods.replace("notifications/progress"),r.allowUnsafeEval||eE({jitless:!0}),this.replaceRequestHandler("ping",e=>(console.log("Received ping:",e.params),{})),this.setEventHandler("hostcontextchanged",void 0)}buildContext(e){return e}registerAppCapabilities(e){var t;let r;if(this.transport)throw Error("Cannot register capabilities after transport is established");this._appCapabilities=(t=this._appCapabilities,r={...t,...e},void 0!==e.experimental&&(r.experimental={...t.experimental,...e.experimental}),void 0!==e.tools&&(r.tools={...t.tools,...e.tools}),r)}registerTool(e,t,r){if(this._registeredTools[e])throw Error(`Tool ${e} is already registered`);let o=this,n=()=>{o._initializedSent&&o._appCapabilities.tools?.listChanged&&o.sendToolListChanged()},i=void 0!==t.inputSchema,a={title:t.title,description:t.description,inputSchema:t.inputSchema,outputSchema:t.outputSchema,annotations:t.annotations,_meta:t._meta,enabled:!0,enable(){this.enabled=!0,n()},disable(){this.enabled=!1,n()},update(e){Object.assign(this,e),n()},remove(){o._registeredTools[e]===a&&(delete o._registeredTools[e],n())},handler:async(t,o)=>{let n;if(!a.enabled)throw Error(`Tool ${e} is disabled`);if(i){let i=a.inputSchema,s=i?await uw(i,t??{},`Invalid input for tool ${e}: `):t??{};n=await r(s,o)}else n=await r(o);return a.outputSchema&&!n.isError&&(n.structuredContent=await uw(a.outputSchema,n.structuredContent,`Invalid output for tool ${e}: `)),n}};return this._registeredTools[e]=a,this._appCapabilities.tools||this.transport||this.registerAppCapabilities({tools:{listChanged:!0}}),this.ensureToolHandlersInitialized(),n(),a}_toolHandlersInitialized=!1;ensureToolHandlersInitialized(){this._toolHandlersInitialized||(this._toolHandlersInitialized=!0,this.oncalltool=async(e,t)=>{let r=this._registeredTools[e.name];if(!r)throw Error(`Tool ${e.name} not found`);return r.handler(e.arguments,t)},this.onlisttools=async(e,t)=>({tools:await Promise.all(Object.entries(this._registeredTools).filter(([e,t])=>t.enabled).map(async([e,t])=>{let r={name:e,title:t.title,description:t.description,inputSchema:t.inputSchema?await u_(t.inputSchema,"input"):{type:"object",properties:{}}};return t.outputSchema&&(r.outputSchema=await u_(t.outputSchema,"output")),t.annotations&&(r.annotations=t.annotations),t._meta&&(r._meta=t._meta),r}))}))}async sendToolListChanged(e={}){this._assertInitialized("sendToolListChanged"),await this.notification({method:"notifications/tools/list_changed",params:e})}getHostCapabilities(){return this._hostCapabilities}getHostVersion(){return this._hostInfo}getHostContext(){return this._hostContext}get ontoolinput(){return this.getEventHandler("toolinput")}set ontoolinput(e){this.setEventHandler("toolinput",e)}get ontoolinputpartial(){return this.getEventHandler("toolinputpartial")}set ontoolinputpartial(e){this.setEventHandler("toolinputpartial",e)}get ontoolresult(){return this.getEventHandler("toolresult")}set ontoolresult(e){this.setEventHandler("toolresult",e)}get ontoolcancelled(){return this.getEventHandler("toolcancelled")}set ontoolcancelled(e){this.setEventHandler("toolcancelled",e)}get onhostcontextchanged(){return this.getEventHandler("hostcontextchanged")}set onhostcontextchanged(e){this.setEventHandler("hostcontextchanged",e)}_onteardown;get onteardown(){return this._onteardown}set onteardown(e){this.warnIfRequestHandlerReplaced("onteardown",this._onteardown,e),this._onteardown=e,this.replaceRequestHandler("ui/resource-teardown",{params:uc.shape.params,result:uu},(e,t)=>{if(!this._onteardown)throw Error("No onteardown handler set");return this._onteardown(e,t)})}_oncalltool;get oncalltool(){return this._oncalltool}set oncalltool(e){this.warnIfRequestHandlerReplaced("oncalltool",this._oncalltool,e),this._oncalltool=e,this.replaceRequestHandler("tools/call",(e,t)=>{if(!this._oncalltool)throw Error("No oncalltool handler set");return this._oncalltool(e.params,t)})}_onlisttools;get onlisttools(){return this._onlisttools}set onlisttools(e){this.warnIfRequestHandlerReplaced("onlisttools",this._onlisttools,e),this._onlisttools=e,this.replaceRequestHandler("tools/list",(e,t)=>{if(!this._onlisttools)throw Error("No onlisttools handler set");return this._onlisttools(e.params,t)})}assertCapabilityForMethod(e){if("sampling/createMessage"===e&&!this._hostCapabilities?.sampling)throw Error(`Host does not support sampling (required for ${e})`)}assertRequestHandlerCapability(e){switch(e){case"tools/call":case"tools/list":if(!this._appCapabilities.tools)throw Error(`Client does not support tool capability (required for ${e})`);return;default:return}}assertNotificationCapability(e){}async callServerTool(e,t){if(this._assertInitialized("callServerTool"),"string"==typeof e)throw Error(`callServerTool() expects an object as its first argument, but received a string ("${e}"). Did you mean: callServerTool({ name: "${e}", arguments: { ... } })?`);return await this.request({method:"tools/call",params:e},{onprogress:()=>{},resetTimeoutOnProgress:!0,...t})}async readServerResource(e,t){return this._assertInitialized("readServerResource"),await this.request({method:"resources/read",params:e},t)}async listServerResources(e,t){return this._assertInitialized("listServerResources"),await this.request({method:"resources/list",params:e},t)}async createSamplingMessage(e,t){return this._assertInitialized("createSamplingMessage"),await this.request({method:"sampling/createMessage",params:e},t)}sendMessage(e,t){return this._assertInitialized("sendMessage"),this.request({method:"ui/message",params:e},ut,t)}sendLog(e){return this.notification({method:"notifications/message",params:e})}updateModelContext(e,t){return this._assertInitialized("updateModelContext"),this.request({method:"ui/update-model-context",params:e},i4,t)}openLink(e,t){return this._assertInitialized("openLink"),this.request({method:"ui/open-link",params:e},c7,t)}sendOpenLink=this.openLink;downloadFile(e,t){return this._assertInitialized("downloadFile"),this.request({method:"ui/download-file",params:e},ue,t)}requestTeardown(e={}){return this.notification({method:"ui/notifications/request-teardown",params:e})}requestDisplayMode(e,t){return this._assertInitialized("requestDisplayMode"),this.request({method:"ui/request-display-mode",params:e},um,t)}sendSizeChanged(e){return this.notification({method:"ui/notifications/size-changed",params:e})}setupSizeChangedNotifications(){let e=!1,t=0,r=0,o=()=>{e||(e=!0,requestAnimationFrame(()=>{e=!1;let o=document.documentElement,n=o.style.height;o.style.height="max-content";let i=Math.ceil(o.getBoundingClientRect().height);o.style.height=n;let a=Math.ceil(window.innerWidth);(a!==t||i!==r)&&(t=a,r=i,this.sendSizeChanged({width:a,height:i}))}))};o();let n=new ResizeObserver(o);return n.observe(document.documentElement),n.observe(document.body),()=>n.disconnect()}async connect(e=new c5(window.parent,window.parent),t){if(this.transport)throw Error("App is already connected. Call close() before connecting again.");this._initializedSent=!1;try{await super.connect(e);let r=await this.request({method:"ui/initialize",params:{appCapabilities:this._appCapabilities,appInfo:this._appInfo,protocolVersion:"2026-01-26"}},uS,t);if(void 0===r)throw Error(`Server sent invalid initialize result: ${r}`);this._hostCapabilities=r.hostCapabilities,this._hostInfo=r.hostInfo,this._hostContext=r.hostContext,await this.notification({method:"ui/notifications/initialized"}),this._initializedSent=!0,this.options?.autoResize&&this.setupSizeChangedNotifications()}catch(e){throw this.close(),e}}}let uk=new Set(["projects","search","symbol","failure"]);function uE(e){switch(e.kind){case"projects":return"/";case"project":return`/projects/${encodeURIComponent(e.project_id)}`;case"search":return`/projects/${encodeURIComponent(e.project_id)}/search?q=${encodeURIComponent(e.query)}`;case"symbol":return`/projects/${encodeURIComponent(e.project_id)}/symbols/${encodeURIComponent(e.node_id)}`}}let ux=document.getElementById("root");if(null===ux)throw Error("app root element missing");let uT=new uR({name:"tracedecay-code-explorer",version:"0.0.0"},{availableDisplayModes:["inline","fullscreen"]}),uP={phase:"connecting"},uC=[],uA=null;function uO(e){uP=e,u1()}function uI(){return"view"===uP.phase?uP.view:"loading"===uP.phase?uP.previous:null}function u$(e){"projects"===e.page&&"ready"===e.projects.state&&(uC=e.projects.data),uO({phase:"view",view:e}),uj(e)}function uz(e){var t;return"object"==typeof(t=e.structuredContent)&&null!==t&&"page"in t&&"string"==typeof t.page&&uk.has(t.page)?e.structuredContent:null}async function uq(e,t,r){uO({phase:"loading",label:r,previous:uI()});try{let r=await uT.callServerTool({name:e,arguments:t}),o=uz(r);if(null===o)return void uO({phase:"host_error",message:`${e} returned no view payload`});u$(o)}catch(e){uO({phase:"host_error",message:e instanceof Error?e.message:String(e)})}}async function uj(e){let t=function(e){switch(e.page){case"projects":return null;case"search":var t;return{content:[{type:"text",text:`TraceDecay search in ${e.project.label} for "${e.query}": ${function(e,t){switch(e.state){case"ready":return t(e.data);case"empty":return e.message;case"failed":return`${e.failure.kind}: ${e.failure.message}`}}(e.results,e=>`${e.hits.length} hit(s), recall ${e.recall}${e.undisplayable.length>0?`, ${e.undisplayable.length} undisplayable`:""}`)}${null===(t=e.provenance)?"":` [reported project status: branch ${t.branch??"?"} commit ${t.commit??"?"} generation ${t.generation??"?"} freshness ${t.freshness.state}]`}`}],structuredContent:{page:"search",project_id:e.project.project_id,query:e.query,deep_link:uE({kind:"search",project_id:e.project.project_id,query:e.query}),provenance:e.provenance}};case"symbol":if(null===e.evidence)return null;return{content:[{type:"text",text:e.evidence.markdown}],structuredContent:e.evidence.structured};case"failure":return{content:[{type:"text",text:`TraceDecay could not answer (${e.failure.kind}/${e.failure.code}): ${e.failure.message}`}],structuredContent:{page:"failure",failure:e.failure}}}}(e);if(null!==t)try{await uT.updateModelContext(t)}catch{}}function uN(){uq("tracedecay_workspace",{},"Loading registered projects…")}function uM(e){u$({page:"search",project:e,query:"",results:{state:"empty",message:"Type a symbol name or phrase to search this project."},provenance:null})}function uH(e,t){uq("tracedecay_search_code",{project_id:e,query:t},`Searching for "${t}"…`)}function uL(e,t){uq("tracedecay_inspect_symbol",{project_id:e,node_id:t},"Loading symbol…")}function uJ(e){let t,r="string"==typeof(t=Reflect.get(e,"openai/deepLink"))?t:"object"==typeof t&&null!==t&&"url"in t&&"string"==typeof t.url?t.url:null;if(null===r||r===uA)return;uA=r;let o=function(e){let t;try{t=new URL(e,"https://tracedecay.invalid")}catch{return null}let r=t.pathname.split("/").filter(e=>e.length>0).map(decodeURIComponent);if(0===r.length)return{kind:"projects"};if("projects"!==r[0]||void 0===r[1])return null;let o=r[1];return 2===r.length?{kind:"project",project_id:o}:"search"===r[2]&&3===r.length?{kind:"search",project_id:o,query:t.searchParams.get("q")??""}:"symbols"===r[2]&&void 0!==r[3]&&4===r.length?{kind:"symbol",project_id:o,node_id:r[3]}:null}(r);null!==o&&function(e){switch(e.kind){case"projects":uN();return;case"project":{let t=uC.find(t=>t.project_id===e.project_id);void 0!==t?uM(t):uH(e.project_id,"");return}case"search":uH(e.project_id,e.query);return;case"symbol":uL(e.project_id,e.node_id);return}}(o)}function uU(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:[],o=document.createElement(e);for(let[e,r]of Object.entries(t))o.setAttribute(e,r);return o.append(...r),o}function uW(e,t){let r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},o=uU("button",{type:"button",...r},[e]);return o.addEventListener("click",t),o}function uD(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"neutral",r=arguments.length>2?arguments[2]:void 0,o={class:"neutral"===t?"badge":`badge ${t}`};return void 0!==r&&(o["data-testid"]=r),uU("span",o,[e])}function uK(e){return"stale"===e.kind||"unavailable"===e.kind?"warn":"bad"}function uZ(e){switch(e){case"current":case"fresh":return"ok";case"stale":case"possibly_stale":case"warming":case"restoring":return"warn";case"parked":case"unavailable":return"bad"}}function uF(e,t,r){return uU("p",{class:"neutral"===t?"notice":`notice ${t}`,"data-testid":r},[e])}function uB(e,t){let r=uF(`${e.message} (${e.code})`,uK(e),t);return r.prepend(uD(e.kind,uK(e),`${t}-kind`)," "),r}function uV(e,t,r){switch(e.state){case"ready":return r(e.data);case"empty":return uF(e.message,"neutral",`${t}-empty`);case"failed":return uB(e.failure,`${t}-failed`)}}function uG(e,t,r){let o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:[];return uU("section",{class:"panel","data-testid":t},[uU("h2",{},[e,...o]),...r])}function uX(e,t){return uW(t.qualified_name||t.name,()=>uL(e,t.node_id),{class:"mono","data-testid":"symbol-link","data-node-id":t.node_id})}function uY(e){let t=null===e.start_line?"":`:${e.start_line}`;return uU("span",{class:"loc"},[`${e.file}${t}`])}function uQ(e,t){let r=uU("input",{type:"search",name:"q",placeholder:`Search ${e.label}…`,value:t,"data-testid":"search-input","aria-label":"Search query"}),o=()=>{let t=r.value.trim();t.length>0&&uH(e.project_id,t)},n=uU("form",{class:"search","data-testid":"search-form"},[r,uW("Search",o,{class:"primary","data-testid":"search-submit"})]);return r.addEventListener("keydown",e=>{"Enter"===e.key&&(e.preventDefault(),o())}),n.addEventListener("submit",e=>e.preventDefault()),n}function u0(e,t){if(null===e)return uG("Project status","provenance",[uF("Project status is reported once the project answers a request.","neutral","provenance-pending")]);let r=[["project",uU("code",{},[e.project_id])],["worktree",uU("code",{},[e.worktree_id??e.project_root])],["repository",uU("code",{},[e.repository_id??"—"])],["ref",e.reference??e.branch??"—"],["commit",uU("code",{"data-testid":"provenance-commit"},[e.commit??"—"])],["generation",uU("code",{},[e.generation??"—"])],["coverage",uU("span",{},[uD(e.coverage.recall,"full"===e.coverage.recall?"ok":"warn","coverage-badge"),null===e.coverage.detail?"":` ${e.coverage.detail}`])],["daemon",null===e.authority?"unavailable":`${e.authority.daemon_version} \xb7 pid ${e.authority.daemon_pid}`],["deep link",uU("code",{"data-testid":"deep-link"},[uE(t)])]],o=uU("dl",{class:"prov"},r.flatMap(e=>{let[t,r]=e;return[uU("dt",{},[t]),uU("dd",{},[r])]})),n=uD(e.freshness.state,uZ(e.freshness.state),"freshness-badge"),i=[o];return null!==e.freshness.detail&&i.unshift(uF(e.freshness.detail,"ok"===uZ(e.freshness.state)?"neutral":"warn","freshness-detail")),uG("Project status (separate read)","provenance",i,[n])}function u1(){ux.replaceChildren(function(e){let t=uU("nav",{class:"crumbs","aria-label":"Breadcrumb"});t.append(uW("Projects",uN,{"data-testid":"crumb-projects"}));let r=null!==e&&"projects"!==e.page?e.project:null;null!==r&&t.append("/",uW(r.label,()=>uM(r),{"data-testid":"crumb-project"})),e?.page==="search"&&""!==e.query&&t.append("/",uU("span",{},[`"${e.query}"`])),e?.page==="symbol"&&"ready"===e.symbol.state&&t.append("/",uU("span",{class:"mono"},[e.symbol.data.name]));let o=uU("header",{class:"bar"},[uU("h1",{},["TraceDecay"]),t,uU("span",{class:"spacer"})]),n=uT.getHostContext()?.displayMode;if(void 0!==n){let e="fullscreen"===n?"inline":"fullscreen";o.append(uW("fullscreen"===e?"Expand":"Collapse",()=>void uT.requestDisplayMode({mode:e}),{"data-testid":"toggle-display-mode"}))}return o}(uI()),...function(){switch(uP.phase){case"connecting":return[uU("p",{class:"loading","data-testid":"connecting"},["Connecting to ChatGPT…"])];case"loading":return[uU("p",{class:"loading","data-testid":"loading"},[uP.label])];case"host_error":return[uB({kind:"protocol",code:"host_call_failed",message:uP.message},"host-error"),uU("div",{class:"actions"},[uW("Back to projects",uN,{class:"primary","data-testid":"back-to-projects"})])];case"view":var e,t,r,o;switch(uP.view.page){case"projects":return["connected"===(e=uP.view).daemon.state?uU("p",{class:"notice","data-testid":"daemon-state"},[uD("connected","ok","daemon-badge"),` tracedecay ${e.daemon.version} (pid ${e.daemon.pid}) \xb7 profile `,uU("code",{},[e.daemon.profile_root])]):uB(e.daemon.failure,"daemon-state"),uG("Recent registered projects","projects-panel",[uV(e.projects,"projects",e=>uU("ul",{class:"list"},e.map(e=>uU("li",{"data-testid":"project-row"},[uW(e.label,()=>uM(e),{class:"primary","data-testid":"project-open","data-project-id":e.project_id}),uU("span",{class:"loc"},[e.project_root]),null===e.head_branch?"":uD(e.head_branch)])))),uU("p",{class:"notice"},["Showing up to 10 recently used projects. Only projects registered in this TraceDecay profile (via `tracedecay init`) can be explored. Nothing here writes to your code."])])];case"search":let n;return n=uV((t=uP.view).results,"results",e=>{let r=[uU("ul",{class:"list"},e.hits.map(e=>uU("li",{"data-testid":"search-hit"},[uD(e.kind),uX(t.project.project_id,e),uY(e)])))];if("partial"===e.recall&&r.push(uF("Partial recall: the index is still converging, so some matches may be missing.","warn","results-partial")),e.truncated&&r.push(uF("Results were truncated to the first page.","neutral","results-truncated")),e.undisplayable.length>0){let t=[...new Set(e.undisplayable)].join(", ");r.push(uF(`${e.undisplayable.length} candidate(s) could not be displayed (${t}).`,"warn","results-undisplayable"))}return"ready"===t.results.state&&void 0!==t.results.generation&&t.provenance?.generation!==void 0&&t.results.generation!==t.provenance.generation&&r.push(uF(`Results were served from generation ${t.results.generation}, which differs from the reported project generation ${t.provenance.generation}.`,"warn","results-generation")),uU("div",{},r)}),[uQ(t.project,t.query),uG(""===t.query?"Search":`Results for "${t.query}"`,"results-panel",[n]),u0(t.provenance,{kind:"search",project_id:t.project.project_id,query:t.query})];case"symbol":let i,a,s,l,c,u,d;return i=(r=uP.view).project.project_id,a=uV(r.symbol,"symbol",e=>{let t=[uU("p",{},[uD(e.kind)," ",uU("code",{"data-testid":"symbol-qualified-name"},[e.qualified_name])," ",uY(e)])];return null!==e.signature&&t.push(uU("pre",{class:"mono"},[e.signature])),null!==e.complexity&&t.push(uU("p",{class:"notice"},[`Cyclomatic complexity ${e.complexity}`])),e.unavailable_fields.length>0&&t.push(uF(`Not available for this symbol: ${e.unavailable_fields.join(", ")}`,"neutral","symbol-unavailable-fields")),uU("div",{},t)}),s=(e,t)=>uV(e,t,o=>{let n=[uU("ul",{class:"list"},o.map(e=>uU("li",{"data-testid":`${t}-row`},[uD(e.edge_kind),uX(i,e.symbol),uY(e.symbol),e.dispatch_via_trait?uD("via trait"):""])))];return"ready"===e.state&&!0===e.truncated&&n.push(uF("Only the first page of relations is shown.","neutral",`${t}-truncated`)),"ready"===e.state&&void 0!==e.generation&&r.provenance?.generation!==void 0&&e.generation!==r.provenance.generation&&n.push(uF(`Served from generation ${e.generation}, which differs from the reported project generation ${r.provenance.generation}.`,"warn",`${t}-generation`)),uU("div",{},n)}),l=uV(r.impact,"impact",e=>{let t=[uU("ul",{class:"list"},e.nodes.map(e=>uU("li",{"data-testid":"impact-row"},[uD(`depth ${e.depth}`),uW(e.name,()=>uL(i,e.node_id),{class:"mono"}),uU("span",{class:"loc"},[`${e.file}:${e.line}`])])))];return t.push(e.complete?uF(`Complete within depth ${e.max_depth}.`,"neutral","impact-complete"):uF(`Partial: traversal stopped at depth ${e.max_depth}.`,"warn","impact-partial")),uU("div",{},t)}),c=uV(r.graph,"graph",e=>(function(e,t){let r=t.nodes.filter(e=>"caller"===e.role),o=t.nodes.filter(e=>"callee"===e.role),n=t.nodes.find(e=>"focus"===e.role),i=28*Math.max(r.length,o.length,1)+20,a="http://www.w3.org/2000/svg",s=document.createElementNS(a,"svg");s.setAttribute("class","graph"),s.setAttribute("viewBox",`0 0 640 ${i}`),s.setAttribute("role","img"),s.setAttribute("aria-label","Bounded caller/callee graph"),s.dataset.testid="graph";let l={caller:10,focus:220,callee:430},c=new Map,u=(t,r,o)=>{let n=l[o],u="focus"===o?i/2-10:10+28*r;c.set(t.node_id,{x:n,y:u});let d=document.createElementNS(a,"g");d.setAttribute("class",`node ${t.role}`),d.dataset.testid="graph-node",d.dataset.nodeId=t.node_id;let p=document.createElementNS(a,"rect");p.setAttribute("x",String(n)),p.setAttribute("y",String(u)),p.setAttribute("width","200"),p.setAttribute("height","20"),p.setAttribute("rx","4");let h=document.createElementNS(a,"text");h.setAttribute("x",String(n+6)),h.setAttribute("y",String(u+14)),h.textContent=t.name.length>28?`${t.name.slice(0,27)}…`:t.name;let m=document.createElementNS(a,"title");m.textContent=`${t.qualified_name} (${t.file})`,d.append(m,p,h),"focus"!==t.role&&d.addEventListener("click",()=>uL(e,t.node_id)),s.append(d)};for(let e of(r.forEach((e,t)=>u(e,t,"caller")),o.forEach((e,t)=>u(e,t,"callee")),void 0!==n&&u(n,0,"focus"),t.edges)){let t=c.get(e.from),r=c.get(e.to);if(void 0===t||void 0===r)continue;let o=document.createElementNS(a,"path");o.setAttribute("class","edge"),o.setAttribute("d",`M ${t.x+200} ${t.y+10} C ${t.x+240} ${t.y+10}, ${r.x-40} ${r.y+10}, ${r.x} ${r.y+10}`),s.prepend(o)}let d=uU("div",{},[s]);return t.truncated&&d.append(uF(`Graph bounded to depth ${t.max_depth}; more relations exist than shown.`,"neutral","graph-truncated")),d})(i,e)),u=uU("div",{class:"actions"}),null!==(d=r.evidence)&&u.append(uW("Send evidence to chat",()=>void uT.sendMessage({role:"user",content:[{type:"text",text:d.markdown}]}),{class:"primary","data-testid":"send-evidence"}),uW("Re-share with model",()=>void uj(r),{"data-testid":"share-context"})),[uQ(r.project,""),uG("Symbol","symbol-panel",[a,uF("Symbol and impact reads do not report a generation; their snapshot identity is unverified.","neutral","symbol-generation"),u]),uG("Callers","callers-panel",[s(r.callers,"callers")]),uG("Callees","callees-panel",[s(r.callees,"callees")]),uG("Impact","impact-panel",[l]),uG("Graph","graph-panel",[c]),u0(r.provenance,"ready"===r.symbol.state?{kind:"symbol",project_id:i,node_id:r.symbol.data.node_id}:{kind:"project",project_id:i})];case"failure":let p;return p=[uB((o=uP.view).failure,"page-failure")],"denied"===o.failure.kind&&p.push(uF("Only projects registered in this TraceDecay profile can be explored. Run `tracedecay init` in the repository and reopen the workspace.","neutral","denied-help")),"disconnected"===o.failure.kind&&p.push(uF("Start the daemon with `tracedecay daemon run` (or any tracedecay command) and retry.","neutral","disconnected-help")),p.push(uU("div",{class:"actions"},[uW("Back to projects",uN,{class:"primary","data-testid":"back-to-projects"})])),null!==o.project&&p.unshift(uQ(o.project,"")),[uG("Request failed","failure-panel",p)]}}}()),ux.dataset.phase=uP.phase,ux.dataset.page=uI()?.page??""}uT.ontoolinput=e=>{uO({phase:"loading",label:`Loading ${e.arguments?.query!==void 0?`search for "${String(e.arguments.query)}"`:"from TraceDecay"}…`,previous:uI()})},uT.ontoolresult=e=>{let t=uz(e);null===t?uO({phase:"host_error",message:"The tool result carried no TraceDecay view payload."}):u$(t)},uT.onhostcontextchanged=e=>{uJ(e),u1()},u1(),uT.connect().then(()=>{let e=uT.getHostContext();void 0!==e&&uJ(e),"connecting"===uP.phase&&uO({phase:"loading",label:"Waiting for TraceDecay…",previous:null})}).catch(e=>uO({phase:"host_error",message:e instanceof Error?e.message:String(e)}))})()})();