Files
webmcp/build/webmcp.js

3 lines
29 KiB
JavaScript

(()=>{var I=Object.defineProperty,P=Object.defineProperties;var j=Object.getOwnPropertyDescriptors;var O=Object.getOwnPropertySymbols;var $=Object.prototype.hasOwnProperty,L=Object.prototype.propertyIsEnumerable;var k=(a,e,t)=>e in a?I(a,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):a[e]=t,_=(a,e)=>{for(var t in e||(e={}))$.call(e,t)&&k(a,t,e[t]);if(O)for(var t of O(e))L.call(e,t)&&k(a,t,e[t]);return a},v=(a,e)=>P(a,j(e));var w=(a,e,t)=>new Promise((s,o)=>{var n=l=>{try{i(t.next(l))}catch(d){o(d)}},r=l=>{try{i(t.throw(l))}catch(d){o(d)}},i=l=>l.done?s(l.value):Promise.resolve(l.value).then(n,r);i((t=t.apply(a,e)).next())});var R=class{constructor(e={}){this.options=_({color:"#007bff",position:"bottom-right",size:"30px",padding:"20px",inactivityTimeout:5*60*1e3},e),this.isConnected=!1,this.isExpanded=!1,this.socket=null,this.inactivityTimer=null,this.availableTools=new Map,this.availablePrompts=new Map,this.availableResources=new Map,this.samplingCallbacks=new Map,this.currentToken="",this.currentServer="",this.currentChannel="",this.elementId="webmcp-widget-"+Math.random().toString(36).substr(2,9),this.registeredTools=new Set,this.registeredPrompts=new Set,this.registeredResources=new Set,this.SESSION_STORAGE_KEY="webmcp_token",this.TOOLS_STORAGE_KEY="webmcp_tools",this.PROMPTS_STORAGE_KEY="webmcp_prompts",this.RESOURCES_STORAGE_KEY="webmcp_resources",this.REGISTER_PATH="/register",this._init()}_format(e){return e.replace(/[.:]/g,"_")}_init(){if(document.querySelector("[data-webmcp-widget]")){console.warn("WebMCP widget already initialized on this page");return}this._createWidget(),this._setupEventListeners(),this._resetInactivityTimer(),this._checkStoredToken()}_checkStoredToken(){let e=sessionStorage.getItem(this.SESSION_STORAGE_KEY);if(e)try{let t=JSON.parse(e);if(t.token){if(console.log("Found stored connection info, attempting to connect"),this.currentServer=t.server,this.currentChannel=`/${t.channelHost||this._format(window.location.host)}`,t.token.includes("{")){let s=JSON.parse(t.token);this.currentToken=s.token}else try{let s=atob(t.token),o=JSON.parse(s);this.currentToken=o.token}catch(s){this.currentToken=t.token}this._loadStoredItems(),this.connect(t.token)}}catch(t){console.error("Error parsing stored connection info:",t),sessionStorage.removeItem(this.SESSION_STORAGE_KEY),this._clearStoredItems()}}_saveItemsToStorage(){try{let e={};this.availableTools.forEach((o,n)=>{e[n]={name:o.name,description:o.description,inputSchema:o.inputSchema}}),sessionStorage.setItem(this.TOOLS_STORAGE_KEY,JSON.stringify(e));let t={};this.availablePrompts.forEach((o,n)=>{t[n]={name:o.name,description:o.description,arguments:o.arguments}}),sessionStorage.setItem(this.PROMPTS_STORAGE_KEY,JSON.stringify(t));let s={};this.availableResources.forEach((o,n)=>{s[n]={name:o.name,description:o.description,uri:o.uri,uriTemplate:o.uriTemplate,isTemplate:o.isTemplate,mimeType:o.mimeType}}),sessionStorage.setItem(this.RESOURCES_STORAGE_KEY,JSON.stringify(s)),console.log("Saved items to session storage:",{tools:Object.keys(e).length,prompts:Object.keys(t).length,resources:Object.keys(s).length})}catch(e){console.error("Error saving items to session storage:",e)}}_loadStoredItems(){try{let e=sessionStorage.getItem(this.TOOLS_STORAGE_KEY);if(e){let o=JSON.parse(e);Object.entries(o).forEach(([n,r])=>{this.availableTools.set(n,v(_({},r),{execute:function(i){return console.warn(`Tool ${n} was loaded from storage but has not been re-registered with an execution function`),`Tool ${n} needs to be re-registered`}}))})}let t=sessionStorage.getItem(this.PROMPTS_STORAGE_KEY);if(t){let o=JSON.parse(t);Object.entries(o).forEach(([n,r])=>{this.availablePrompts.set(n,v(_({},r),{execute:function(i){return console.warn(`Prompt ${n} was loaded from storage but has not been re-registered with an execution function`),{messages:[{role:"user",content:{type:"text",text:`Prompt ${n} needs to be re-registered`}}]}}}))})}let s=sessionStorage.getItem(this.RESOURCES_STORAGE_KEY);if(s){let o=JSON.parse(s);Object.entries(o).forEach(([n,r])=>{this.availableResources.set(n,v(_({},r),{provide:function(i){return console.warn(`Resource ${n} was loaded from storage but has not been re-registered with a provider function`),{contents:[{uri:i,text:`Resource ${n} needs to be re-registered`,mimeType:r.mimeType||"text/plain"}]}}}))})}console.log("Loaded items from session storage:",{tools:this.availableTools.size,prompts:this.availablePrompts.size,resources:this.availableResources.size}),this._updateToolsList(),this._updatePromptsList(),this._updateResourcesList()}catch(e){console.error("Error loading items from session storage:",e),this._clearStoredItems()}}_clearStoredItems(){sessionStorage.removeItem(this.TOOLS_STORAGE_KEY),sessionStorage.removeItem(this.PROMPTS_STORAGE_KEY),sessionStorage.removeItem(this.RESOURCES_STORAGE_KEY),console.log("Cleared stored items from session storage")}_createWidget(){let e=document.createElement("div");e.id=this.elementId,e.dataset.webmcpWidget=!0,Object.assign(e.style,{position:"fixed",zIndex:"9999",display:"flex",flexDirection:"column",fontFamily:"Arial, sans-serif",fontSize:"14px",transition:"all 0.3s ease"}),this._setWidgetPosition(e);let t=document.createElement("div");t.className="webmcp-trigger",Object.assign(t.style,{width:this.options.size,height:this.options.size,backgroundColor:this.options.color,borderRadius:"4px",cursor:"pointer",boxShadow:"0 2px 10px rgba(0,0,0,0.2)",display:"flex",justifyContent:"center",alignItems:"center",alignSelf:"flex-end"});let s=document.createElement("div");s.className="webmcp-content",Object.assign(s.style,{backgroundColor:"#ffffff",border:"1px solid #e1e1e1",borderRadius:"5px",padding:"15px",marginBottom:"10px",boxShadow:"0 5px 15px rgba(0,0,0,0.1)",width:"250px",display:"none",overflow:"hidden",position:"absolute",bottom:"40px"});let o=document.createElement("div");Object.assign(o.style,{display:"flex",justifyContent:"space-between",alignItems:"center",marginBottom:"15px"});let n=document.createElement("div");n.textContent="WebMCP",Object.assign(n.style,{fontWeight:"bold",fontSize:"16px"});let r=document.createElement("button");r.innerHTML="×",r.className="webmcp-close",Object.assign(r.style,{background:"none",border:"none",cursor:"pointer",fontSize:"20px",padding:"0",lineHeight:"1",color:"#999"}),o.appendChild(n),o.appendChild(r),s.appendChild(o),this._createConnectionForm(s);let i=document.createElement("div");i.className="webmcp-status",i.textContent="Disconnected",Object.assign(i.style,{padding:"8px",borderRadius:"3px",backgroundColor:"#f8d7da",color:"#721c24",textAlign:"center",marginBottom:"10px",fontSize:"12px"}),s.appendChild(i);let l=document.createElement("div");l.className="webmcp-connection-panel",s.appendChild(l);let d=document.createElement("div");d.className="webmcp-registered-items",Object.assign(d.style,{marginTop:"15px",fontSize:"12px",display:"none",maxHeight:"200px",overflow:"auto",border:"1px solid #eee",borderRadius:"4px"}),s.appendChild(d);let E=document.createElement("div");E.className="webmcp-tools-list",Object.assign(E.style,{padding:"10px",borderBottom:"1px solid #eee"});let u=document.createElement("div");u.textContent="Registered Tools:",Object.assign(u.style,{fontWeight:"bold",marginBottom:"5px"});let p=document.createElement("ul");p.className="webmcp-tools-container",Object.assign(p.style,{listStyle:"none",padding:"0",margin:"0"}),E.appendChild(u),E.appendChild(p),d.appendChild(E);let h=document.createElement("div");h.className="webmcp-prompts-list",Object.assign(h.style,{padding:"10px",borderBottom:"1px solid #eee"});let g=document.createElement("div");g.textContent="Registered Prompts:",Object.assign(g.style,{fontWeight:"bold",marginBottom:"5px"});let y=document.createElement("ul");y.className="webmcp-prompts-container",Object.assign(y.style,{listStyle:"none",padding:"0",margin:"0"}),h.appendChild(g),h.appendChild(y),d.appendChild(h);let m=document.createElement("div");m.className="webmcp-resources-list",Object.assign(m.style,{padding:"10px"});let b=document.createElement("div");b.textContent="Registered Resources:",Object.assign(b.style,{fontWeight:"bold",marginBottom:"5px"});let f=document.createElement("ul");f.className="webmcp-resources-container",Object.assign(f.style,{listStyle:"none",padding:"0",margin:"0"}),m.appendChild(b),m.appendChild(f),d.appendChild(m),e.appendChild(s),e.appendChild(t),document.body.appendChild(e)}_setWidgetPosition(e){let{position:t,padding:s}=this.options;switch(t){case"bottom-right":Object.assign(e.style,{bottom:s,right:s,alignItems:"flex-end"});break;case"bottom-left":Object.assign(e.style,{bottom:s,left:s,alignItems:"flex-start"});break;case"top-right":Object.assign(e.style,{top:s,right:s,alignItems:"flex-end"});break;case"top-left":Object.assign(e.style,{top:s,left:s,alignItems:"flex-start"});break;default:Object.assign(e.style,{bottom:s,right:s,alignItems:"flex-end"})}}_createConnectionForm(e){let t=document.createElement("div");Object.assign(t.style,{marginBottom:"8px"});let s=document.createElement("div");Object.assign(s.style,{display:"flex",marginBottom:"8px"});let o=document.createElement("input");o.type="text",o.className="webmcp-token-input",o.placeholder="Paste connection token",Object.assign(o.style,{flex:"1",padding:"8px",border:"1px solid #ccc",borderRadius:"4px 0 0 4px",fontSize:"12px"});let n=document.createElement("button");n.className="webmcp-connect-btn",n.textContent="Connect",Object.assign(n.style,{padding:"8px 12px",backgroundColor:this.options.color,color:"white",border:"none",borderRadius:"0 4px 4px 0",cursor:"pointer",fontSize:"12px"}),s.appendChild(o),s.appendChild(n);let r=document.createElement("button");r.className="webmcp-disconnect-btn",r.textContent="Disconnect",Object.assign(r.style,{padding:"8px 12px",backgroundColor:"#dc3545",color:"white",border:"none",borderRadius:"4px",cursor:"pointer",fontSize:"12px",width:"100%",display:"none"}),t.appendChild(s),t.appendChild(r),e.appendChild(t)}_setupEventListeners(){let e=document.getElementById(this.elementId);if(!e)return;e.querySelector(".webmcp-trigger").addEventListener("click",()=>{this._toggleExpanded()}),e.querySelector(".webmcp-close").addEventListener("click",()=>{this._toggleExpanded(!1)}),e.querySelector(".webmcp-connect-btn").addEventListener("click",()=>{let r=e.querySelector(".webmcp-token-input");this.connect(r.value)}),e.querySelector(".webmcp-disconnect-btn").addEventListener("click",()=>{this.disconnect()}),document.addEventListener("mousemove",()=>this._resetInactivityTimer()),document.addEventListener("keypress",()=>this._resetInactivityTimer()),document.addEventListener("click",()=>this._resetInactivityTimer()),document.addEventListener("scroll",()=>this._resetInactivityTimer())}_toggleExpanded(e=null){let t=document.getElementById(this.elementId);if(!t)return;let s=t.querySelector(".webmcp-content");this.isExpanded=e!==null?e:!this.isExpanded,this.isExpanded?s.style.display="block":s.style.display="none",this._resetInactivityTimer()}_updateStatus(e,t){let s=document.getElementById(this.elementId);if(!s)return;let o=s.querySelector(".webmcp-status");if(o)switch(o.classList.remove("connected","disconnected","connecting","pending-auth"),o.textContent=t||e,e){case"connected":Object.assign(o.style,{backgroundColor:"#d4edda",color:"#155724"});break;case"disconnected":Object.assign(o.style,{backgroundColor:"#f8d7da",color:"#721c24"});break;case"connecting":Object.assign(o.style,{backgroundColor:"#fff3cd",color:"#856404"});break;case"pending-auth":Object.assign(o.style,{backgroundColor:"#d1ecf1",color:"#0c5460"});break}}_updateConnectionUI(e){let t=document.getElementById(this.elementId);if(!t)return;let s=t.querySelector(".webmcp-token-input"),o=t.querySelector(".webmcp-connect-btn"),n=t.querySelector(".webmcp-disconnect-btn"),r=t.querySelector(".webmcp-registered-items");if(e){s.style.display="none",o.style.display="none",n.style.display="block",r.style.display="block";let i=t.querySelector(".webmcp-trigger");i.innerHTML="\u2713",i.style.color="white",i.style.fontWeight="bold"}else{s.style.display="block",o.style.display="block",n.style.display="none",r.style.display="none";let i=t.querySelector(".webmcp-trigger");i.innerHTML=""}}_updateToolsList(){let e=document.getElementById(this.elementId);if(!e)return;let t=e.querySelector(".webmcp-tools-container");if(t){if(t.innerHTML="",this.availableTools.size===0){let s=document.createElement("li");s.textContent="No tools registered",s.style.fontStyle="italic",s.style.color="#666",t.appendChild(s);return}this.availableTools.forEach((s,o)=>{let n=document.createElement("li");Object.assign(n.style,{padding:"5px 0",borderBottom:"1px solid #eee"});let r=document.createElement("strong");r.textContent=o;let i=document.createElement("div");i.textContent=s.description,i.style.fontSize="10px",i.style.color="#666",n.appendChild(r),n.appendChild(i),t.appendChild(n)})}}_updatePromptsList(){let e=document.getElementById(this.elementId);if(!e)return;let t=e.querySelector(".webmcp-prompts-container");if(t){if(t.innerHTML="",this.availablePrompts.size===0){let s=document.createElement("li");s.textContent="No prompts registered",s.style.fontStyle="italic",s.style.color="#666",t.appendChild(s);return}this.availablePrompts.forEach((s,o)=>{let n=document.createElement("li");Object.assign(n.style,{padding:"5px 0",borderBottom:"1px solid #eee"});let r=document.createElement("strong");r.textContent=o;let i=document.createElement("div");i.textContent=s.description,i.style.fontSize="10px",i.style.color="#666",n.appendChild(r),n.appendChild(i),t.appendChild(n)})}}_updateResourcesList(){let e=document.getElementById(this.elementId);if(!e)return;let t=e.querySelector(".webmcp-resources-container");if(t){if(t.innerHTML="",this.availableResources.size===0){let s=document.createElement("li");s.textContent="No resources registered",s.style.fontStyle="italic",s.style.color="#666",t.appendChild(s);return}this.availableResources.forEach((s,o)=>{let n=document.createElement("li");Object.assign(n.style,{padding:"5px 0",borderBottom:"1px solid #eee"});let r=document.createElement("strong");r.textContent=o;let i=document.createElement("div");i.textContent=s.description+(s.isTemplate?" (Template)":""),i.style.fontSize="10px",i.style.color="#666",n.appendChild(r),n.appendChild(i),t.appendChild(n)})}}_resetInactivityTimer(){this.inactivityTimer&&clearTimeout(this.inactivityTimer),this.inactivityTimer=setTimeout(()=>{this._handleInactivity()},this.options.inactivityTimeout)}_handleInactivity(){console.log("Inactivity timeout reached, disconnecting"),this.isConnected&&this.disconnect(),this._toggleExpanded(!1),sessionStorage.removeItem(this.SESSION_STORAGE_KEY)}connect(e){return w(this,null,function*(){if(!e){this._updateStatus("disconnected","Error: No token provided");return}this._updateStatus("connecting","Connecting...");try{if(!this._processConnectionToken(e))return;let t={token:e,server:this.currentServer,host:this._format(window.location.host)},s=sessionStorage.getItem(this.SESSION_STORAGE_KEY),o=!1;if(s)try{let r=JSON.parse(s);r.server===this.currentServer&&r.host===this._format(window.location.host)&&(o=!0)}catch(r){console.error("Error parsing stored connection info:",r)}if(!o){let r=yield this._registerWithServer(e);if(!r.token){this._updateStatus("disconnected","Registration failed");return}t.token=r.token,this.currentToken=r.token,sessionStorage.setItem(this.SESSION_STORAGE_KEY,JSON.stringify(t))}let n=`${this.currentServer}${this.currentChannel}?token=${this.currentToken}`;this._updateStatus("connecting","Connecting to channel..."),this.socket=new WebSocket(n),this._setupSocketListeners(),this._resetInactivityTimer()}catch(t){console.error("Connection error:",t),this._updateStatus("disconnected",`Error: ${t.message}`)}})}disconnect(){this.socket&&(this.socket.close(),this.socket=null),this.isConnected=!1,this._updateStatus("disconnected","Disconnected"),this._updateConnectionUI(!1),this.currentToken="",this.currentServer="",this.currentChannel="",sessionStorage.removeItem(this.SESSION_STORAGE_KEY),this._clearStoredItems()}_processConnectionToken(e){try{let t=atob(e),s=JSON.parse(t),{server:o,token:n}=s;return!o||!n?(this._updateStatus("disconnected","Invalid token"),!1):(this.currentServer=o,this.currentToken=n,this.currentChannel=`/${this._format(window.location.host)}`,!0)}catch(t){return this._updateStatus("disconnected","Unable to parse token"),!1}}_registerWithServer(e){this._updateStatus("pending-auth","Registering...");let t=new WebSocket(`${this.currentServer}${this.REGISTER_PATH}`);return new Promise((s,o)=>{t.addEventListener("open",n=>{console.log("Registration connection established");let r=atob(e),i=JSON.parse(r);i.host=this._format(window.location.host),t.send(btoa(JSON.stringify(i)))}),t.addEventListener("message",n=>{try{let r=JSON.parse(n.data);r.type==="registerSuccess"&&r.token?(console.log(`Registration successful: ${r.message}`),s({token:r.token})):r.type==="error"&&(console.error(`Registration failed: ${r.message}`),this._updateStatus("disconnected",`Registration failed: ${r.message}`),o(new Error(r.message)))}catch(r){console.error(`Error parsing registration response: ${r.message}`),this._updateStatus("disconnected","Error parsing server response"),o(r)}}),t.addEventListener("error",n=>{console.error("Registration connection error"),this._updateStatus("disconnected","Registration connection error"),sessionStorage.removeItem(this.SESSION_STORAGE_KEY),o(new Error("Connection error"))}),t.addEventListener("close",n=>{console.log(`Registration connection closed: ${n.code} ${n.reason}`),n.code!==1e3&&(this._updateStatus("disconnected","Registration failed"),sessionStorage.removeItem(this.SESSION_STORAGE_KEY),o(new Error("Connection closed")))})})}_setupSocketListeners(){if(!this.socket){console.error("Cannot set up socket listeners: WebSocket not available");return}this.socket.addEventListener("open",()=>{this.isConnected=!0,this._updateStatus("connected",`Connected to ${this.currentChannel}`),this._updateConnectionUI(!0),console.log("WebMCP connection established"),this._registerItemsWithServer()}),this.socket.addEventListener("close",e=>{this.isConnected=!1,this._updateStatus("disconnected","Disconnected"),this._updateConnectionUI(!1),console.log(`Connection closed: ${e.code} ${e.reason}`),(e.code===1001||e.code===401)&&(this._updateStatus("disconnected","Authorization failed"),this.currentToken="",this.currentServer="",this.currentChannel="",sessionStorage.removeItem(this.SESSION_STORAGE_KEY))}),this.socket.addEventListener("error",()=>{console.error("WebSocket error"),this.isConnected?this._updateStatus("disconnected","Connection error occurred"):this._updateStatus("disconnected","Connection failed"),sessionStorage.removeItem(this.SESSION_STORAGE_KEY)}),this.socket.addEventListener("message",e=>{try{let t=JSON.parse(e.data);this._handleServerMessage(t)}catch(t){console.error(`Error parsing message: ${t.message}`)}})}_handleServerMessage(e){switch(e.type){case"welcome":console.log(`Server says: ${e.message}`);break;case"toolRegistered":console.log(`Tool registered with server: ${e.name}`);break;case"promptRegistered":console.log(`Prompt registered with server: ${e.name}`);break;case"resourceRegistered":console.log(`Resource registered with server: ${e.name}`);break;case"callTool":this._handleToolCall(e);break;case"getPrompt":this._handleGetPrompt(e);break;case"readResource":this._handleReadResource(e);break;case"createSamplingMessage":this._handleCreateSamplingMessage(e);break;case"listTools":this._sendToolsList(e.id);break;case"listPrompts":this._sendPromptsList(e.id);break;case"listResources":this._sendResourcesList(e.id);break;case"ping":this._sendMessage({type:"pong",id:e.id,timestamp:Date.now()});break;case"error":console.error(`Server error: ${e.message}`);break;default:console.warn(`Unknown message type: ${e.type}`)}}_handleToolCall(e){let{id:t,tool:s,arguments:o}=e;if(console.log(`Tool call: ${s} with args:`,o),!this.availableTools.has(s)){this._sendMessage({id:t,type:"toolResponse",error:`Tool not found: ${s}`});return}try{let r=this.availableTools.get(s).execute(o);r instanceof Promise?r.then(i=>{this._sendMessage({id:t,type:"toolResponse",result:i})}).catch(i=>{this._sendMessage({id:t,type:"toolResponse",error:i.message||"Tool execution error"})}):this._sendMessage({id:t,type:"toolResponse",result:r}),console.log(`Tool response sent for ${s}`)}catch(n){this._sendMessage({id:t,type:"toolResponse",error:n.message||"Tool execution error"}),console.error("Tool execution error:",n)}}_handleGetPrompt(e){let{id:t,name:s,arguments:o}=e;if(console.log(`Prompt request: ${s} with args:`,o),!this.availablePrompts.has(s)){this._sendMessage({id:t,type:"promptResponse",error:`Prompt not found: ${s}`});return}try{let r=this.availablePrompts.get(s).execute(o);r instanceof Promise?r.then(i=>{this._sendMessage({id:t,type:"promptResponse",result:i})}).catch(i=>{this._sendMessage({id:t,type:"promptResponse",error:i.message||"Prompt execution error"})}):this._sendMessage({id:t,type:"promptResponse",result:r}),console.log(`Prompt response sent for ${s}`)}catch(n){this._sendMessage({id:t,type:"promptResponse",error:n.message||"Prompt execution error"}),console.error("Prompt execution error:",n)}}_handleReadResource(e){let{id:t,uri:s}=e;console.log(`Resource request: ${s}`);let o=null;for(let n of this.availableResources.values())if(!n.isTemplate&&n.uri===s){o=n;break}if(!o){for(let n of this.availableResources.values())if(n.isTemplate){let r=n.uriTemplate.split("{")[0];if(s.startsWith(r)){o=n;break}}}if(!o){this._sendMessage({id:t,type:"resourceResponse",error:`No resource handler found for URI: ${s}`});return}try{let n=o.provide(s);n instanceof Promise?n.then(r=>{this._sendMessage({id:t,type:"resourceResponse",result:r})}).catch(r=>{this._sendMessage({id:t,type:"resourceResponse",error:r.message||"Resource read error"})}):this._sendMessage({id:t,type:"resourceResponse",result:n}),console.log(`Resource response sent for ${s}`)}catch(n){this._sendMessage({id:t,type:"resourceResponse",error:n.message||"Resource read error"}),console.error("Resource read error:",n)}}_sendToolsList(e){let t=Array.from(this.availableTools.values()).map(s=>({name:s.name,description:s.description,inputSchema:s.inputSchema}));this._sendMessage({id:e,type:"listToolsResponse",tools:t}),console.log(`Sent tools list: ${t.length} tools`)}_sendPromptsList(e){let t=Array.from(this.availablePrompts.values()).map(s=>({name:s.name,description:s.description,arguments:s.arguments}));this._sendMessage({id:e,type:"listPromptsResponse",prompts:t}),console.log(`Sent prompts list: ${t.length} prompts`)}_sendResourcesList(e){let t=[],s=[];this.availableResources.forEach(o=>{o.isTemplate?s.push({name:o.name,description:o.description,uriTemplate:o.uriTemplate,mimeType:o.mimeType}):t.push({name:o.name,description:o.description,uri:o.uri,mimeType:o.mimeType})}),this._sendMessage({id:e,type:"listResourcesResponse",resources:t,resourceTemplates:s}),console.log(`Sent resources list: ${t.length} resources, ${s.length} templates`)}_sendMessage(e){if(!this.isConnected||!this.socket){console.error("Cannot send message: not connected");return}try{return this.socket.send(JSON.stringify(e)),Promise.resolve()}catch(t){return console.error(`Error sending message: ${t.message}`),Promise.reject(t)}}_registerItemsWithServer(){this.isConnected&&(this.registeredTools=new Set,this.registeredPrompts=new Set,this.registeredResources=new Set,this.availableTools.forEach((e,t)=>{this._sendMessage({type:"registerTool",name:t,description:e.description,inputSchema:e.inputSchema}),this.registeredTools.add(t),console.log(`Registering tool with server: ${t}`)}),this.availablePrompts.forEach((e,t)=>{this._sendMessage({type:"registerPrompt",name:t,description:e.description,arguments:e.arguments}),this.registeredPrompts.add(t),console.log(`Registering prompt with server: ${t}`)}),this.availableResources.forEach((e,t)=>{this._sendMessage({type:"registerResource",name:t,description:e.description,uri:e.uri,uriTemplate:e.uriTemplate,isTemplate:e.isTemplate,mimeType:e.mimeType}),this.registeredResources.add(t),console.log(`Registering resource with server: ${t}`)}))}registerTool(e,t,s,o){if(!e){console.error("Tool name is required");return}this.availableTools.set(e,{name:e,description:t||`Tool: ${e}`,execute:o||function(n){return`Default implementation of ${e} with args: ${JSON.stringify(n)}`},inputSchema:s||{type:"object",properties:{}}}),this.isConnected&&(this._sendMessage({type:"registerTool",name:e,description:t||`Tool: ${e}`,inputSchema:s||{type:"object",properties:{}}}),this.registeredTools.add(e)),this._saveItemsToStorage(),this._updateToolsList(),console.log(`Tool registered: ${e}`)}registerPrompt(e,t,s,o){if(!e){console.error("Prompt name is required");return}this.availablePrompts.set(e,{name:e,description:t||`Prompt: ${e}`,execute:o||function(n){return{messages:[{role:"user",content:{type:"text",text:`Default implementation of prompt ${e} with args: ${JSON.stringify(n)}`}}]}},arguments:s||[]}),this.isConnected&&(this._sendMessage({type:"registerPrompt",name:e,description:t||`Prompt: ${e}`,arguments:s||[]}),this.registeredPrompts.add(e)),this._saveItemsToStorage(),this._updatePromptsList(),console.log(`Prompt registered: ${e}`)}registerResource(e,t,s,o){if(!e){console.error("Resource name is required");return}if(!s.uri&&!s.uriTemplate){console.error("Either uri or uriTemplate is required for a resource");return}let n=!!s.uriTemplate;this.availableResources.set(e,{name:e,description:t||`Resource: ${e}`,uri:s.uri,uriTemplate:s.uriTemplate,isTemplate:n,mimeType:s.mimeType,provide:o||function(r){return{contents:[{uri:r,text:`Default implementation of resource ${e} for URI: ${r}`,mimeType:s.mimeType||"text/plain"}]}}}),this.isConnected&&(this._sendMessage({type:"registerResource",name:e,description:t||`Resource: ${e}`,uri:s.uri,uriTemplate:s.uriTemplate,isTemplate:n,mimeType:s.mimeType}),this.registeredResources.add(e)),this._saveItemsToStorage(),this._updateResourcesList(),console.log(`Resource registered: ${e}`)}_handleCreateSamplingMessage(e){let{id:t,messages:s,systemPrompt:o,includeContext:n,temperature:r,maxTokens:i,stopSequences:l,metadata:d,modelPreferences:E}=e;console.log(`Sampling request received with ${(s==null?void 0:s.length)||0} messages`);let u=document.createElement("div");Object.assign(u.style,{position:"fixed",top:"0",left:"0",width:"100%",height:"100%",backgroundColor:"rgba(0, 0, 0, 0.5)",display:"flex",justifyContent:"center",alignItems:"center",zIndex:"10000"});let p=document.createElement("div");Object.assign(p.style,{backgroundColor:"white",padding:"20px",borderRadius:"5px",maxWidth:"500px",width:"90%",maxHeight:"80%",overflow:"auto"});let h=document.createElement("h3");h.textContent="Sampling Request",Object.assign(h.style,{margin:"0 0 15px 0",padding:"0 0 10px 0",borderBottom:"1px solid #ddd"});let g=document.createElement("div");if(Object.assign(g.style,{marginBottom:"15px",maxHeight:"300px",overflow:"auto",border:"1px solid #ddd",padding:"10px",backgroundColor:"#f9f9f9"}),s&&s.length>0?s.forEach(c=>{let S=document.createElement("div");Object.assign(S.style,{marginBottom:"10px",padding:"5px",borderRadius:"3px",backgroundColor:c.role==="user"?"#e1f5fe":"#f1f8e9"});let x=document.createElement("strong");x.textContent=c.role==="user"?"User: ":"Assistant: ";let T=document.createElement("span");c.content.type==="text"?T.textContent=c.content.text:c.content.type==="image"&&(T.textContent="[Image data]"),S.appendChild(x),S.appendChild(T),g.appendChild(S)}):g.textContent="No messages provided in sampling request",o){let c=document.createElement("div");Object.assign(c.style,{marginBottom:"10px",padding:"5px",backgroundColor:"#fff8e1"});let S=document.createElement("strong");S.textContent="System Prompt: ";let x=document.createElement("span");x.textContent=o,c.appendChild(S),c.appendChild(x),g.appendChild(c)}let y=document.createElement("label");y.textContent="Assistant Response:",Object.assign(y.style,{display:"block",marginBottom:"5px",fontWeight:"bold"});let m=document.createElement("textarea");Object.assign(m.style,{width:"100%",minHeight:"100px",padding:"10px",marginBottom:"15px",boxSizing:"border-box"});let b=document.createElement("div");Object.assign(b.style,{display:"flex",justifyContent:"space-between"});let f=document.createElement("button");f.textContent="Submit Response",Object.assign(f.style,{padding:"8px 15px",backgroundColor:"#4CAF50",color:"white",border:"none",borderRadius:"4px",cursor:"pointer"});let C=document.createElement("button");C.textContent="Cancel",Object.assign(C.style,{padding:"8px 15px",backgroundColor:"#f44336",color:"white",border:"none",borderRadius:"4px",cursor:"pointer"}),b.appendChild(C),b.appendChild(f),p.appendChild(h),p.appendChild(g),p.appendChild(y),p.appendChild(m),p.appendChild(b),u.appendChild(p),document.body.appendChild(u),m.focus(),f.addEventListener("click",()=>{let c=m.value.trim();c?(this._sendMessage({id:t,type:"samplingResponse",result:{model:"web-user-input",role:"assistant",content:{type:"text",text:c}}}),document.body.removeChild(u)):alert("Please enter a response")}),C.addEventListener("click",()=>{this._sendMessage({id:t,type:"samplingResponse",error:"User cancelled sampling request"}),document.body.removeChild(u)})}};typeof module!="undefined"&&typeof module.exports!="undefined"&&(module.exports=R);})();
//# sourceMappingURL=webmcp.js.map