dexto 1.2.0 → 1.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (73) hide show
  1. package/README.md +5 -3
  2. package/dist/analytics/index.d.ts.map +1 -1
  3. package/dist/analytics/index.js +1 -2
  4. package/dist/webui/.next/{static/chunks/656-5a9f6405badf66a8.js → standalone/.next/static/chunks/369-7a58b346e80ec351.js} +2 -2
  5. package/dist/webui/.next/standalone/.next/static/chunks/419-6d7f485f58886e5b.js +1 -0
  6. package/dist/webui/.next/standalone/.next/static/chunks/560-551d60414365cdc4.js +1 -0
  7. package/dist/webui/.next/standalone/.next/static/chunks/854-7ae94d6609222f8e.js +1 -0
  8. package/dist/webui/.next/standalone/.next/static/chunks/app/chat/[sessionId]/page-df2b9ed4c466c348.js +1 -0
  9. package/dist/webui/.next/standalone/.next/static/chunks/app/layout-f4d136d139162fab.js +1 -0
  10. package/dist/webui/.next/standalone/.next/static/chunks/app/page-d0ab5e22f0d14271.js +1 -0
  11. package/dist/webui/.next/standalone/package.json +3 -2
  12. package/dist/webui/.next/standalone/packages/webui/.next/BUILD_ID +1 -1
  13. package/dist/webui/.next/standalone/packages/webui/.next/app-build-manifest.json +13 -10
  14. package/dist/webui/.next/standalone/packages/webui/.next/build-manifest.json +2 -2
  15. package/dist/webui/.next/standalone/packages/webui/.next/prerender-manifest.json +3 -3
  16. package/dist/webui/.next/standalone/packages/webui/.next/required-server-files.json +1 -1
  17. package/dist/webui/.next/standalone/packages/webui/.next/server/app/_not-found/page.js +2 -2
  18. package/dist/webui/.next/standalone/packages/webui/.next/server/app/_not-found/page.js.nft.json +1 -1
  19. package/dist/webui/.next/standalone/packages/webui/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  20. package/dist/webui/.next/standalone/packages/webui/.next/server/app/chat/[sessionId]/page.js +2 -2
  21. package/dist/webui/.next/standalone/packages/webui/.next/server/app/chat/[sessionId]/page.js.nft.json +1 -1
  22. package/dist/webui/.next/standalone/packages/webui/.next/server/app/chat/[sessionId]/page_client-reference-manifest.js +1 -1
  23. package/dist/webui/.next/standalone/packages/webui/.next/server/app/page.js +2 -2
  24. package/dist/webui/.next/standalone/packages/webui/.next/server/app/page.js.nft.json +1 -1
  25. package/dist/webui/.next/standalone/packages/webui/.next/server/app/page_client-reference-manifest.js +1 -1
  26. package/dist/webui/.next/standalone/packages/webui/.next/server/app/playground/page.js +3 -3
  27. package/dist/webui/.next/standalone/packages/webui/.next/server/app/playground/page.js.nft.json +1 -1
  28. package/dist/webui/.next/standalone/packages/webui/.next/server/app/playground/page_client-reference-manifest.js +1 -1
  29. package/dist/webui/.next/standalone/packages/webui/.next/server/chunks/1.js +4 -4
  30. package/dist/webui/.next/standalone/packages/webui/.next/server/chunks/695.js +1 -0
  31. package/dist/webui/.next/standalone/packages/webui/.next/server/chunks/{426.js → 710.js} +2 -2
  32. package/dist/webui/.next/standalone/packages/webui/.next/server/pages/500.html +1 -1
  33. package/dist/webui/.next/standalone/packages/webui/.next/server/server-reference-manifest.json +1 -1
  34. package/dist/webui/.next/standalone/{.next/static/chunks/656-5a9f6405badf66a8.js → packages/webui/.next/static/chunks/369-7a58b346e80ec351.js} +2 -2
  35. package/dist/webui/.next/standalone/packages/webui/.next/static/chunks/419-6d7f485f58886e5b.js +1 -0
  36. package/dist/webui/.next/standalone/packages/webui/.next/static/chunks/560-551d60414365cdc4.js +1 -0
  37. package/dist/webui/.next/standalone/packages/webui/.next/static/chunks/854-7ae94d6609222f8e.js +1 -0
  38. package/dist/webui/.next/standalone/packages/webui/.next/static/chunks/app/chat/[sessionId]/page-df2b9ed4c466c348.js +1 -0
  39. package/dist/webui/.next/standalone/packages/webui/.next/static/chunks/app/layout-f4d136d139162fab.js +1 -0
  40. package/dist/webui/.next/standalone/packages/webui/.next/static/chunks/app/page-d0ab5e22f0d14271.js +1 -0
  41. package/dist/webui/.next/standalone/packages/webui/package.json +3 -1
  42. package/dist/webui/.next/standalone/packages/webui/server.js +1 -1
  43. package/dist/webui/.next/{standalone/packages/webui/.next/static/chunks/656-5a9f6405badf66a8.js → static/chunks/369-7a58b346e80ec351.js} +2 -2
  44. package/dist/webui/.next/static/chunks/419-6d7f485f58886e5b.js +1 -0
  45. package/dist/webui/.next/static/chunks/560-551d60414365cdc4.js +1 -0
  46. package/dist/webui/.next/static/chunks/854-7ae94d6609222f8e.js +1 -0
  47. package/dist/webui/.next/static/chunks/app/chat/[sessionId]/page-df2b9ed4c466c348.js +1 -0
  48. package/dist/webui/.next/static/chunks/app/layout-f4d136d139162fab.js +1 -0
  49. package/dist/webui/.next/static/chunks/app/page-d0ab5e22f0d14271.js +1 -0
  50. package/dist/webui/package.json +3 -1
  51. package/package.json +3 -3
  52. package/dist/webui/.next/standalone/.next/static/chunks/419-6d449dcb2b056299.js +0 -1
  53. package/dist/webui/.next/standalone/.next/static/chunks/854-232126f3c77e6c0b.js +0 -1
  54. package/dist/webui/.next/standalone/.next/static/chunks/app/chat/[sessionId]/page-a695b09e6bac5274.js +0 -1
  55. package/dist/webui/.next/standalone/.next/static/chunks/app/layout-f4a6ee5a028899d1.js +0 -1
  56. package/dist/webui/.next/standalone/.next/static/chunks/app/page-d1f127a0cac96246.js +0 -1
  57. package/dist/webui/.next/standalone/packages/webui/.next/server/chunks/43.js +0 -1
  58. package/dist/webui/.next/standalone/packages/webui/.next/static/chunks/419-6d449dcb2b056299.js +0 -1
  59. package/dist/webui/.next/standalone/packages/webui/.next/static/chunks/854-232126f3c77e6c0b.js +0 -1
  60. package/dist/webui/.next/standalone/packages/webui/.next/static/chunks/app/chat/[sessionId]/page-a695b09e6bac5274.js +0 -1
  61. package/dist/webui/.next/standalone/packages/webui/.next/static/chunks/app/layout-f4a6ee5a028899d1.js +0 -1
  62. package/dist/webui/.next/standalone/packages/webui/.next/static/chunks/app/page-d1f127a0cac96246.js +0 -1
  63. package/dist/webui/.next/static/chunks/419-6d449dcb2b056299.js +0 -1
  64. package/dist/webui/.next/static/chunks/854-232126f3c77e6c0b.js +0 -1
  65. package/dist/webui/.next/static/chunks/app/chat/[sessionId]/page-a695b09e6bac5274.js +0 -1
  66. package/dist/webui/.next/static/chunks/app/layout-f4a6ee5a028899d1.js +0 -1
  67. package/dist/webui/.next/static/chunks/app/page-d1f127a0cac96246.js +0 -1
  68. /package/dist/webui/.next/standalone/.next/static/{uqfH8SY_uhwdc0ZkpMwCO → IXh4cVyOAx6rg0D8ivJp6}/_buildManifest.js +0 -0
  69. /package/dist/webui/.next/standalone/.next/static/{uqfH8SY_uhwdc0ZkpMwCO → IXh4cVyOAx6rg0D8ivJp6}/_ssgManifest.js +0 -0
  70. /package/dist/webui/.next/standalone/packages/webui/.next/static/{uqfH8SY_uhwdc0ZkpMwCO → IXh4cVyOAx6rg0D8ivJp6}/_buildManifest.js +0 -0
  71. /package/dist/webui/.next/standalone/packages/webui/.next/static/{uqfH8SY_uhwdc0ZkpMwCO → IXh4cVyOAx6rg0D8ivJp6}/_ssgManifest.js +0 -0
  72. /package/dist/webui/.next/static/{uqfH8SY_uhwdc0ZkpMwCO → IXh4cVyOAx6rg0D8ivJp6}/_buildManifest.js +0 -0
  73. /package/dist/webui/.next/static/{uqfH8SY_uhwdc0ZkpMwCO → IXh4cVyOAx6rg0D8ivJp6}/_ssgManifest.js +0 -0
@@ -1 +0,0 @@
1
- "use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[854],{1236:(e,t,o)=>{o.d(t,{kz:()=>m,EQ:()=>g,j0:()=>f,PI:()=>p,P2:()=>d,KU:()=>u,Y_:()=>v});var n=o(5789);let r=["apikey","api_key","token","access_token","refresh_token","password","secret"],s=["base64","filedata","file_data","imagedata","image_data","audiodata","audio_data","data"],a=[/\bsk-[A-Za-z0-9]{20,}\b/g,/\bBearer\s+[A-Za-z0-9\-_.=]+\b/gi,/\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}\b/g,/\beyJ[A-Za-z0-9_-]*\.[A-Za-z0-9_-]*\.[A-Za-z0-9_-]*/g],i="[REDACTED]",l="[REDACTED_CIRCULAR]";function c(e){return e instanceof Error?e:e&&"object"==typeof e?"message"in e&&"string"==typeof e.message?Error(e.message,{cause:e}):"error"in e&&"string"==typeof e.error?Error(e.error,{cause:e}):"details"in e&&"string"==typeof e.details?Error(e.details,{cause:e}):"description"in e&&"string"==typeof e.description?Error(e.description,{cause:e}):Error(function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1e3;try{if("bigint"==typeof e)return e.toString();let o=function e(t){let o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:new WeakSet;if("string"==typeof t){let e=t;for(let t of a)e=e.replace(t,i);return e}if(Array.isArray(t))return o.has(t)?l:(o.add(t),t.map(t=>e(t,o)));if(t&&"object"==typeof t){if(o.has(t))return l;o.add(t);let n={};for(let[a,l]of Object.entries(t))if(r.includes(a.toLowerCase()))n[a]=i;else{let r=function(e,t,o){var n;if("string"!=typeof e)return e;let r=t.toLowerCase();return(s.includes(r)||"data"===r&&o&&("mimeType"in o||"filename"in o||"fileName"in o))&&(n=e).length>1e3&&/^[A-Za-z0-9+/=]{1000,}$/.test(n.substring(0,1e3))?"".concat("[FILE_DATA_TRUNCATED]"," (").concat(e.length," chars)"):e}(l,a,t);n[a]=e(r,o)}return n}return t}(e),n=JSON.stringify(o,(e,t)=>t instanceof Error?{name:t.name,message:t.message,stack:t.stack}:"bigint"==typeof t?t.toString():t),c="…(truncated)",u=Number.isFinite(t)&&t>0?Math.floor(t):1e3;if("string"==typeof n){if(n.length<=u)return n;let e=Math.max(0,u-c.length);return"".concat(n.slice(0,e)).concat(c)}return String(e)}catch(t){try{return String(e)}catch(e){return"[Unserializable value]"}}}(e)):"string"==typeof e?Error(e,{cause:e}):Error(String(e),{cause:e})}function u(e){return"object"==typeof e&&null!==e&&"error"in e}function d(e){return"object"==typeof e&&null!==e&&"content"in e&&Array.isArray(e.content)}function p(e){return"object"==typeof e&&null!==e&&"type"in e&&"text"===e.type}function f(e){return"object"==typeof e&&null!==e&&"type"in e&&"image"===e.type}function m(e){return"object"==typeof e&&null!==e&&"type"in e&&"audio"===e.type}function g(e){return"object"==typeof e&&null!==e&&"type"in e&&"file"===e.type}let y=()=>"msg-".concat(Date.now(),"-").concat(Math.random().toString(36).substring(2,9));function v(e,t){let o=(0,n.useRef)(null),[r,s]=(0,n.useState)([]),a=(0,n.useRef)(null),[i,l]=(0,n.useState)("connecting"),[u,d]=(0,n.useState)(!1),[p,f]=(0,n.useState)(null),m=(0,n.useRef)(!1),g=(0,n.useRef)(new Map),v=(0,n.useRef)(t);(0,n.useEffect)(()=>{v.current=t},[t]);let h=(0,n.useCallback)(e=>{if(!e)return!1;let t=v.current,o=t?t():null;return!!o&&e===o},[]);(0,n.useEffect)(()=>{let t=new globalThis.WebSocket(e);return o.current=t,t.onopen=()=>l("open"),t.onclose=()=>l("closed"),t.onerror=e=>{l("closed"),f({id:y(),message:"Connection error. Please try again.",timestamp:Date.now(),context:"websocket"})},t.onmessage=e=>{let t;try{t=JSON.parse(e.data)}catch(t){let e=c(t);console.error("[useChat] WebSocket message parse error: ".concat(e.message),{error:e});return}let o=t.data||{};switch(t.event){case"chunk":{if(!h(o.sessionId))return;d(!0);let e="string"==typeof o.content?o.content:"";if(!e)break;let t=o.type;s(o=>{if("reasoning"===t){let t=o[o.length-1];if(t&&"assistant"===t.role){let n={...t,reasoning:(t.reasoning||"")+e,createdAt:Date.now()};return[...o.slice(0,-1),n]}return[...o,{id:y(),role:"assistant",content:"",reasoning:e,createdAt:Date.now()}]}{let t=o[o.length-1];if(t&&"assistant"===t.role){let n="string"==typeof t.content?t.content:"",r={...t,content:n+e,createdAt:Date.now()};return[...o.slice(0,-1),r]}return[...o,{id:y(),role:"assistant",content:e,createdAt:Date.now()}]}});break}case"response":{if(!h(o.sessionId))return;d(!1);let e="string"==typeof o.text?o.text:"",t="string"==typeof o.reasoning?o.reasoning:void 0,n=o&&"object"==typeof o.tokenUsage?o.tokenUsage:void 0,r="string"==typeof o.model?o.model:void 0,a="string"==typeof o.provider?o.provider:void 0,i="string"==typeof o.router?o.router:void 0,l="string"==typeof o.sessionId?o.sessionId:void 0;s(o=>{let s=o[o.length-1];if(s&&"assistant"===s.role){let c="string"==typeof e?e:"",u={...s,content:c,tokenUsage:n,reasoning:t,model:r,provider:a,router:i,createdAt:Date.now(),sessionId:null!=l?l:s.sessionId};return[...o.slice(0,-1),u]}return[...o,{id:y(),role:"assistant",content:e,createdAt:Date.now(),tokenUsage:n,reasoning:t,model:r,provider:a,router:i,sessionId:l}]}),window.dispatchEvent(new CustomEvent("dexto:response",{detail:{text:e,sessionId:l,reasoning:t,tokenUsage:n,model:r,timestamp:Date.now()}}));break}case"conversationReset":if(!h(o.sessionId))return;d(!1),s([]),a.current=null,g.current.clear();break;case"toolCall":{if(!h(o.sessionId))return;let e=o.toolName,t=o.args,n=o.callId;s(o=>{let r=o.length,s=[...o,{id:y(),role:"tool",content:null,toolName:e,toolArgs:t,toolCallId:n,createdAt:Date.now()}];return n&&g.current.set(n,r),s});break}case"toolResult":{var n,r,i,l;if(!h(o.sessionId))return;let e=o.toolName,t=o.sanitized,a=null!=(l=null!=(i=null!=(r=null==t||null==(n=t.meta)?void 0:n.toolCallId)?r:"string"==typeof o.toolCallId?o.toolCallId:void 0)?i:"string"==typeof o.callId?o.callId:void 0)?l:"string"==typeof o.id?o.id:void 0,c=o.rawResult,u="boolean"==typeof o.success?o.success:void 0,d=null!=t?t:c,p=d,f=e=>{var t,o,n,r,s,a;if("object"==typeof e&&null!==e&&"image"===e.type){let r=null!=(n=null!=(o=null!=(t=e.data)?t:e.base64)?o:e.image)?n:e.url;if(r)return{type:"image",image:r,...e.mimeType?{mimeType:e.mimeType}:{}}}if("object"==typeof e&&null!==e&&"audio"===e.type){let t=null!=(a=null!=(s=null!=(r=e.data)?r:e.base64)?s:e.audio)?a:e.url;if(t&&e.mimeType)return{type:"file",data:t,mimeType:e.mimeType,...e.filename?{filename:e.filename}:{}}}if("object"==typeof e&&null!==e&&"resource"===e.type){let t=e.resource;if((null==t?void 0:t.text)&&t.mimeType)return t.mimeType.startsWith("image/")?{type:"image",image:t.text,mimeType:t.mimeType}:{type:"file",data:t.text,mimeType:t.mimeType,...t.title?{filename:t.title}:{}}}return"object"==typeof e&&null!==e&&"file"===e.type?{type:"file",data:e.data,mimeType:e.mimeType,...e.filename?{filename:e.filename}:{}}:"object"==typeof e&&null!==e&&"text"===e.type?{type:"text",text:e.text}:"string"==typeof e?{type:"text",text:e}:{type:"text",text:JSON.stringify(e)}};if(t&&Array.isArray(t.content)&&!1!==u){let e=t.content.map(f);p={...t,content:e}}else if(d&&Array.isArray(d.content)){let e=d.content.map(f);p={...d,content:e}}!1===u&&c&&(p=c),s(o=>{let n=-1;if(a&&g.current.has(a)?(n=g.current.get(a),g.current.delete(a)):n=o.findIndex(t=>"tool"===t.role&&void 0===t.toolResult&&t.toolName===e),-1!==n&&n<o.length){let e={...o[n],toolResult:p,toolResultMeta:null==t?void 0:t.meta,toolResultSuccess:u};return[...o.slice(0,n),e,...o.slice(n+1)]}return console.warn("No matching tool call found for result of ".concat(e).concat(a?" (callId: ".concat(a,")"):"")),o});break}case"toolConfirmationResponse":break;case"error":{let e;if(!h(o.sessionId))return;if(d(!1),m.current){m.current=!1;break}if((null==o?void 0:o.context)==="user_cancelled")break;let t=c(o).message;if(o.context){if("string"==typeof o.context)e=o.context;else if("object"==typeof o.context){let t=o.context;e=t.plugin?"plugin:".concat(t.plugin):t.scope?String(t.scope):"error"}}f({id:y(),message:t,timestamp:Date.now(),context:e,recoverable:o.recoverable,sessionId:o.sessionId,anchorMessageId:a.current||void 0,detailedIssues:Array.isArray(o.issues)?o.issues:[]});break}case"resourceCacheInvalidated":console.log("\uD83D\uDCBE Resource cache invalidated via WebSocket:",o),window.dispatchEvent(new CustomEvent("dexto:resourceCacheInvalidated",{detail:{resourceUri:o.resourceUri,serverName:o.serverName,action:o.action,timestamp:Date.now()}}));break;case"mcpPromptsListChanged":console.log("✨ Prompts list changed via WebSocket:",o),window.dispatchEvent(new CustomEvent("dexto:mcpPromptsListChanged",{detail:{serverName:o.serverName,prompts:o.prompts,timestamp:Date.now()}}));break;case"mcpToolsListChanged":console.log("\uD83D\uDD27 Tools list changed via WebSocket:",o),window.dispatchEvent(new CustomEvent("dexto:mcpToolsListChanged",{detail:{serverName:o.serverName,tools:o.tools,timestamp:Date.now()}}));break;case"mcpResourceUpdated":console.log("\uD83D\uDCCB Resource updated via WebSocket:",o),window.dispatchEvent(new CustomEvent("dexto:mcpResourceUpdated",{detail:{serverName:o.serverName,resourceUri:o.resourceUri,timestamp:Date.now()}}));break;case"sessionTitleUpdated":{let e=e=>"object"==typeof e&&null!==e,t=e(o)&&"string"==typeof o.sessionId?o.sessionId:void 0,n=e(o)&&"string"==typeof o.title?o.title:void 0;t&&n&&window.dispatchEvent(new CustomEvent("dexto:sessionTitleUpdated",{detail:{sessionId:t,title:n,timestamp:Date.now()}}))}}},()=>{t.close()}},[e]);let w=(0,n.useCallback)(function(e,t,n,r){var i;let l=arguments.length>4&&void 0!==arguments[4]&&arguments[4];if((null==(i=o.current)?void 0:i.readyState)===globalThis.WebSocket.OPEN){o.current.send(JSON.stringify({type:"message",content:e,imageData:t,fileData:n,sessionId:r,stream:l})),d(!0);let i=y();a.current=i,s(o=>[...o,{id:i,role:"user",content:e,createdAt:Date.now(),sessionId:r,imageData:t,fileData:n}]),window.dispatchEvent(new CustomEvent("dexto:message",{detail:{content:e,sessionId:r,timestamp:Date.now()}}))}else f({id:y(),message:"Cannot send message: connection is not open",timestamp:Date.now(),context:"websocket",recoverable:!0})},[]),b=(0,n.useCallback)(e=>{var t;(null==(t=o.current)?void 0:t.readyState)===globalThis.WebSocket.OPEN&&o.current.send(JSON.stringify({type:"reset",sessionId:e})),s([]),f(null),a.current=null,g.current.clear(),d(!1)},[]),E=(0,n.useCallback)(e=>{var t;(null==(t=o.current)?void 0:t.readyState)===globalThis.WebSocket.OPEN&&o.current.send(JSON.stringify({type:"cancel",sessionId:e})),d(!1),g.current.clear(),m.current=!0},[]),k=(0,n.useCallback)(()=>{f(null)},[]);return{messages:r,status:i,sendMessage:w,reset:b,setMessages:s,websocket:o.current,processing:u,cancel:E,activeError:p,clearError:k}}},9401:(e,t,o)=>{function n(){let e=parseInt(window.location.port||"3000",10),t=window.__DEXTO_API_PORT__?parseInt(window.__DEXTO_API_PORT__,10):e+1,o="https:"===window.location.protocol?"https:":"http:";return"".concat(o,"//").concat(window.location.hostname,":").concat(t)}function r(){let e=parseInt(window.location.port||"3000",10),t=window.__DEXTO_API_PORT__?parseInt(window.__DEXTO_API_PORT__,10):e+1,o="https:"===window.location.protocol?"wss:":"ws:";return"".concat(o,"//").concat(window.location.hostname,":").concat(t)}o.d(t,{e:()=>n,m:()=>r})},9752:(e,t,o)=>{function n(e){return(null==e?void 0:e.startsWith("audio/"))?"audio":(null==e?void 0:e.startsWith("video/"))?"video":"binary"}function r(e){return(null==e?void 0:e.startsWith("image/"))?"image":(null==e?void 0:e.startsWith("audio/"))?"audio":(null==e?void 0:e.startsWith("video/"))?"video":"binary"}o.d(t,{h:()=>r,t:()=>n})},9854:(e,t,o)=>{o.d(t,{ChatProvider:()=>u,v:()=>d});var n=o(5801),r=o(5789),s=o(826),a=o(1236),i=o(9401),l=o(9752);let c=(0,r.createContext)(void 0);function u(e){let{children:t}=e,o=(0,s.useRouter)(),u=(0,i.m)(),[d,p]=(0,r.useState)(null),[f,m]=(0,r.useState)(!0),[g,y]=(0,r.useState)(!0),[v,h]=(0,r.useState)(!1),[w,b]=(0,r.useState)(!1),{messages:E,sendMessage:k,status:C,reset:S,setMessages:x,websocket:I,activeError:T,clearError:A,processing:_,cancel:R}=(0,a.Y_)(u,()=>d),[N,D]=(0,r.useState)(null),j=(0,r.useCallback)(async e=>{try{let t=void 0!==e?e:d,o=t?"".concat((0,i.e)(),"/api/llm/current?sessionId=").concat(t):"".concat((0,i.e)(),"/api/llm/current"),n=await fetch(o);if(n.ok){let e=await n.json(),t=e.config||e;D({provider:t.provider,model:t.model,displayName:t.displayName,router:t.router,baseURL:t.baseURL})}}catch(e){}},[d]);(0,r.useEffect)(()=>{N||j()},[N,j]);let{greeting:O}=function(e){let[t,o]=(0,r.useState)(null),[n,s]=(0,r.useState)(!1),[a,l]=(0,r.useState)(null),[c,u]=(0,r.useState)(0),d=(0,r.useCallback)(async t=>{s(!0),l(null);try{var n;let r=e?"".concat((0,i.e)(),"/api/greeting?sessionId=").concat(encodeURIComponent(e)):"".concat((0,i.e)(),"/api/greeting"),s=await fetch(r,{signal:t});if(!s.ok){let e="Failed to fetch greeting: HTTP ".concat(s.status," ").concat(s.statusText);o(null),l(e);return}let a=await s.json();o(null!=(n=a.greeting)?n:null)}catch(t){if((null==t?void 0:t.name)==="AbortError")return;let e=t instanceof Error?t.message:"Failed to fetch greeting";l(e),console.error("Error fetching greeting: ".concat(e))}finally{s(!1)}},[e]);return(0,r.useEffect)(()=>{let e=new AbortController,{signal:t}=e;return d(t),()=>e.abort()},[d,c]),(0,r.useEffect)(()=>{let e=()=>{u(e=>e+1)};return window.addEventListener("dexto:agentSwitched",e),()=>{window.removeEventListener("dexto:agentSwitched",e)}},[]),{greeting:t,isLoading:n,error:a}}(d),L=(0,r.useCallback)(async()=>{var e;let t,o=await fetch("".concat((0,i.e)(),"/api/sessions"),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({})});if(!o.ok)throw Error("Failed to create session: ".concat(o.status," ").concat(o.statusText));let n=await o.text();if(!n.trim())throw Error("Empty response from session creation");try{t=JSON.parse(n)}catch(e){throw console.error("Failed to parse session creation response:",e),Error("Invalid response from session creation")}if(!(null==(e=t.session)?void 0:e.id))throw Error("Session ID not found in server response");return t.session.id},[]),P=(0,r.useCallback)(async(e,t,n)=>{let r=d;if(!r&&f){if(w)return;try{b(!0),r=await L(),p(r),m(!1),o.replace("/chat/".concat(r)),await j(r)}catch(e){console.error("Failed to create session:",e);return}finally{b(!1)}}r?k(e,t,n,r,g):console.error("No session available for sending message")},[k,d,f,w,L,g,j,o]),U=(0,r.useCallback)(()=>{d&&S(d)},[S,d]),W=(0,r.useCallback)(async e=>{try{let t,o=await fetch("".concat((0,i.e)(),"/api/sessions/").concat(e,"/history"));if(!o.ok){if(404===o.status)return void x([]);throw Error("Failed to load session history")}let n=await o.text();if(!n.trim())return void x(t=>t.some(t=>t.sessionId===e)?t:[]);try{t=JSON.parse(n)}catch(e){console.error("Failed to parse session history response:",e),x([]);return}let r=t.history||[],s=[],a=new Map;for(let t=0;t<r.length;t++){let o=r[t],n={id:"session-".concat(e,"-").concat(t),role:o.role,content:o.content,createdAt:Date.now()-(r.length-t)*1e3,sessionId:e,tokenUsage:o.tokenUsage,reasoning:o.reasoning,model:o.model,router:o.router,provider:o.provider},i=e=>{let t=[];for(let r of e){var o,n;if("image"===r.type&&"string"==typeof r.image&&r.image.startsWith("@blob:")){let e=r.image.substring(1);t.push({uri:e,kind:"image",mimeType:null!=(o=r.mimeType)?o:"image/jpeg"})}if("file"===r.type&&"string"==typeof r.data&&r.data.startsWith("@blob:")){let e=r.data.substring(1),o=null!=(n=r.mimeType)?n:"application/octet-stream",s=(0,l.h)(o);t.push({uri:e,kind:s,mimeType:o,...r.filename?{filename:r.filename}:{}})}}return t.length>0?t:void 0};if("assistant"===o.role){o.content&&s.push(n),o.toolCalls&&o.toolCalls.length>0&&o.toolCalls.forEach((o,n)=>{var i,l;let c={};if(null==o?void 0:o.function)try{c=JSON.parse(o.function.arguments||"{}")}catch(e){console.warn("Failed to parse toolCall arguments for ".concat((null==(l=o.function)?void 0:l.name)||"unknown",": ").concat(e)),c={}}let u=(null==(i=o.function)?void 0:i.name)||"unknown",d={id:"session-".concat(e,"-").concat(t,"-tool-").concat(n),role:"tool",content:null,createdAt:Date.now()-(r.length-t)*1e3+n,sessionId:e,toolName:u,toolArgs:c,toolResult:void 0,toolResultMeta:void 0,toolResultSuccess:void 0};"string"==typeof o.id&&o.id.length>0&&a.set(o.id,s.length),s.push(d)});continue}if("tool"===o.role){let e="string"==typeof o.toolCallId?o.toolCallId:void 0,r="string"==typeof o.name?o.name:"unknown",l=Array.isArray(o.content)?o.content:"string"==typeof o.content?[{type:"text",text:o.content}]:[],c=i(l),u={content:l,...c?{resources:c}:{},meta:{toolName:r,toolCallId:null!=e?e:"tool-".concat(t),..."boolean"==typeof o.success?{success:o.success}:{}}};if(e&&a.has(e)){let t=a.get(e);s[t]={...s[t],toolResult:u,toolResultMeta:u.meta,toolResultSuccess:"boolean"==typeof o.success?o.success:void 0}}else s.push({...n,role:"tool",content:null,toolName:r,toolArgs:"object"==typeof o.args?o.args:void 0,toolResult:u,toolResultMeta:u.meta,toolResultSuccess:"boolean"==typeof o.success?o.success:void 0});continue}s.push(n)}x(t=>t.some(t=>t.sessionId===e)?t:s)}catch(e){console.error("Error loading session history:",e),x([])}},[x,j]),z=(0,r.useCallback)(async e=>{if(e!==d&&!v){h(!0);try{p(e),m(!1),await W(e),await j(e)}catch(e){throw console.error("Error switching session:",e),e}finally{h(!1)}}},[d,v,W,j]),M=(0,r.useCallback)(()=>{p(null),m(!0),x([])},[x]);return(0,r.useEffect)(()=>{let e=e=>{var t;let o=(null==e?void 0:e.detail)||{};if(null==(t=o.config)?void 0:t.llm){let e=o.config.llm;D({provider:e.provider,model:e.model,router:e.router,baseURL:e.baseURL})}},t=e=>{console.log("Servers changed:",e.detail)},o=e=>{let{sessionId:t}=e.detail||{};t===d&&x([])};return window.addEventListener("dexto:configChanged",e),window.addEventListener("dexto:serversChanged",t),window.addEventListener("dexto:conversationReset",o),()=>{window.removeEventListener("dexto:configChanged",e),window.removeEventListener("dexto:serversChanged",t),window.removeEventListener("dexto:conversationReset",o)}},[d,x]),(0,n.jsx)(c.Provider,{value:{messages:E,sendMessage:P,status:C,reset:U,currentSessionId:d,switchSession:z,loadSessionHistory:W,isWelcomeState:f,returnToWelcome:M,isStreaming:g,setStreaming:y,websocket:I,currentLLM:N,refreshCurrentLLM:j,processing:_,cancel:R,activeError:T,clearError:A,greeting:O},children:t})}function d(){let e=(0,r.useContext)(c);if(!e)throw Error("useChatContext must be used within a ChatProvider");return e}}}]);
@@ -1 +0,0 @@
1
- (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[827],{},_=>{_.O(0,[614,656,854,804,419,760,845,358],()=>_(_.s=9419)),_N_E=_.O()}]);
@@ -1 +0,0 @@
1
- (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[177],{94:()=>{},191:(e,t,n)=>{"use strict";n.d(t,{SpeechReset:()=>s});var i=n(5789);function s(){return(0,i.useEffect)(()=>{let e=()=>{try{"speechSynthesis"in window&&window.speechSynthesis.cancel()}catch(e){}};e();let t=()=>{"hidden"===document.visibilityState&&e()};return window.addEventListener("pagehide",e),window.addEventListener("beforeunload",e),document.addEventListener("visibilitychange",t),()=>{window.removeEventListener("pagehide",e),window.removeEventListener("beforeunload",e),document.removeEventListener("visibilitychange",t)}},[]),null}},826:(e,t,n)=>{"use strict";var i=n(5438);n.o(i,"useRouter")&&n.d(t,{useRouter:function(){return i.useRouter}})},3145:e=>{e.exports={style:{fontFamily:"'Geist Mono', 'Geist Mono Fallback'",fontStyle:"normal"},className:"__className_9a8899",variable:"__variable_9a8899"}},4009:(e,t,n)=>{Promise.resolve().then(n.t.bind(n,6819,23)),Promise.resolve().then(n.t.bind(n,3145,23)),Promise.resolve().then(n.t.bind(n,94,23)),Promise.resolve().then(n.bind(n,9854)),Promise.resolve().then(n.bind(n,191))},6819:e=>{e.exports={style:{fontFamily:"'Geist', 'Geist Fallback'",fontStyle:"normal"},className:"__className_188709",variable:"__variable_188709"}}},e=>{e.O(0,[137,33,854,760,845,358],()=>e(e.s=4009)),_N_E=e.O()}]);
@@ -1 +0,0 @@
1
- (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[974],{},_=>{_.O(0,[614,656,854,804,419,760,845,358],()=>_(_.s=9419)),_N_E=_.O()}]);
@@ -1 +0,0 @@
1
- exports.id=43,exports.ids=[43],exports.modules={21842:()=>{},21870:(a,b,c)=>{Promise.resolve().then(c.t.bind(c,97452,23)),Promise.resolve().then(c.t.bind(c,41143,23)),Promise.resolve().then(c.t.bind(c,96731,23)),Promise.resolve().then(c.t.bind(c,61742,23)),Promise.resolve().then(c.t.bind(c,202,23)),Promise.resolve().then(c.t.bind(c,43598,23)),Promise.resolve().then(c.t.bind(c,30670,23)),Promise.resolve().then(c.t.bind(c,68299,23)),Promise.resolve().then(c.t.bind(c,10190,23))},24599:(a,b,c)=>{Promise.resolve().then(c.bind(c,34820)),Promise.resolve().then(c.bind(c,27359))},27359:(a,b,c)=>{"use strict";c.d(b,{SpeechReset:()=>d});let d=(0,c(95364).registerClientReference)(function(){throw Error("Attempted to call SpeechReset() from the server but SpeechReset is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"/home/runner/work/dexto/dexto/packages/webui/components/ui/speech-reset.tsx","SpeechReset")},33671:(a,b,c)=>{"use strict";function d(){return"http://localhost:3001"}function e(){return"ws://localhost:3001"}c.d(b,{e:()=>d,m:()=>e})},34820:(a,b,c)=>{"use strict";c.d(b,{ChatProvider:()=>e});var d=c(95364);let e=(0,d.registerClientReference)(function(){throw Error("Attempted to call ChatProvider() from the server but ChatProvider is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"/home/runner/work/dexto/dexto/packages/webui/components/hooks/ChatContext.tsx","ChatProvider");(0,d.registerClientReference)(function(){throw Error("Attempted to call useChatContext() from the server but useChatContext is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"/home/runner/work/dexto/dexto/packages/webui/components/hooks/ChatContext.tsx","useChatContext")},52623:(a,b,c)=>{Promise.resolve().then(c.bind(c,64516)),Promise.resolve().then(c.bind(c,63501))},61622:(a,b,c)=>{Promise.resolve().then(c.t.bind(c,28710,23)),Promise.resolve().then(c.t.bind(c,11865,23)),Promise.resolve().then(c.t.bind(c,54401,23)),Promise.resolve().then(c.t.bind(c,11096,23)),Promise.resolve().then(c.t.bind(c,55368,23)),Promise.resolve().then(c.t.bind(c,53612,23)),Promise.resolve().then(c.t.bind(c,88572,23)),Promise.resolve().then(c.t.bind(c,47629,23)),Promise.resolve().then(c.bind(c,74476))},63501:(a,b,c)=>{"use strict";function d(){return null}c.d(b,{SpeechReset:()=>d}),c(4039)},64516:(a,b,c)=>{"use strict";c.d(b,{ChatProvider:()=>k,v:()=>l});var d=c(35270),e=c(4039),f=c(76112),g=c(70702),h=c(33671),i=c(77836);let j=(0,e.createContext)(void 0);function k({children:a}){let b=(0,f.useRouter)(),c=(0,h.m)(),[k,l]=(0,e.useState)(null),[m,n]=(0,e.useState)(!0),[o,p]=(0,e.useState)(!0),[q,r]=(0,e.useState)(!1),[s,t]=(0,e.useState)(!1),{messages:u,sendMessage:v,status:w,reset:x,setMessages:y,websocket:z,activeError:A,clearError:B,processing:C,cancel:D}=(0,g.Y_)(c,()=>k),[E,F]=(0,e.useState)(null),G=(0,e.useCallback)(async a=>{try{let b=void 0!==a?a:k,c=b?`${(0,h.e)()}/api/llm/current?sessionId=${b}`:`${(0,h.e)()}/api/llm/current`,d=await fetch(c);if(d.ok){let a=await d.json(),b=a.config||a;F({provider:b.provider,model:b.model,displayName:b.displayName,router:b.router,baseURL:b.baseURL})}}catch{}},[k]),{greeting:H}=function(a){let[b,c]=(0,e.useState)(null),[d,f]=(0,e.useState)(!1),[g,i]=(0,e.useState)(null),[j,k]=(0,e.useState)(0);return(0,e.useCallback)(async b=>{f(!0),i(null);try{let d=a?`${(0,h.e)()}/api/greeting?sessionId=${encodeURIComponent(a)}`:`${(0,h.e)()}/api/greeting`,e=await fetch(d,{signal:b});if(!e.ok){let a=`Failed to fetch greeting: HTTP ${e.status} ${e.statusText}`;c(null),i(a);return}let f=await e.json();c(f.greeting??null)}catch(b){if(b?.name==="AbortError")return;let a=b instanceof Error?b.message:"Failed to fetch greeting";i(a),console.error(`Error fetching greeting: ${a}`)}finally{f(!1)}},[a]),{greeting:b,isLoading:d,error:g}}(k),I=(0,e.useCallback)(async()=>{let a,b=await fetch(`${(0,h.e)()}/api/sessions`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({})});if(!b.ok)throw Error(`Failed to create session: ${b.status} ${b.statusText}`);let c=await b.text();if(!c.trim())throw Error("Empty response from session creation");try{a=JSON.parse(c)}catch(a){throw console.error("Failed to parse session creation response:",a),Error("Invalid response from session creation")}if(!a.session?.id)throw Error("Session ID not found in server response");return a.session.id},[]),J=(0,e.useCallback)(async(a,c,d)=>{let e=k;if(!e&&m){if(s)return;try{t(!0),e=await I(),l(e),n(!1),b.replace(`/chat/${e}`),await G(e)}catch(a){console.error("Failed to create session:",a);return}finally{t(!1)}}e?v(a,c,d,e,o):console.error("No session available for sending message")},[v,k,m,s,I,o,G,b]),K=(0,e.useCallback)(()=>{k&&x(k)},[x,k]),L=(0,e.useCallback)(async a=>{try{let b,c=await fetch(`${(0,h.e)()}/api/sessions/${a}/history`);if(!c.ok){if(404===c.status)return void y([]);throw Error("Failed to load session history")}let d=await c.text();if(!d.trim())return void y(b=>b.some(b=>b.sessionId===a)?b:[]);try{b=JSON.parse(d)}catch(a){console.error("Failed to parse session history response:",a),y([]);return}let e=b.history||[],f=[],g=new Map;for(let b=0;b<e.length;b++){let c=e[b],d={id:`session-${a}-${b}`,role:c.role,content:c.content,createdAt:Date.now()-(e.length-b)*1e3,sessionId:a,tokenUsage:c.tokenUsage,reasoning:c.reasoning,model:c.model,router:c.router,provider:c.provider},h=a=>{let b=[];for(let c of a){if("image"===c.type&&"string"==typeof c.image&&c.image.startsWith("@blob:")){let a=c.image.substring(1);b.push({uri:a,kind:"image",mimeType:c.mimeType??"image/jpeg"})}if("file"===c.type&&"string"==typeof c.data&&c.data.startsWith("@blob:")){let a=c.data.substring(1),d=c.mimeType??"application/octet-stream",e=(0,i.h)(d);b.push({uri:a,kind:e,mimeType:d,...c.filename?{filename:c.filename}:{}})}}return b.length>0?b:void 0};if("assistant"===c.role){c.content&&f.push(d),c.toolCalls&&c.toolCalls.length>0&&c.toolCalls.forEach((c,d)=>{let h={};if(c?.function)try{h=JSON.parse(c.function.arguments||"{}")}catch(a){console.warn(`Failed to parse toolCall arguments for ${c.function?.name||"unknown"}: ${a}`),h={}}let i=c.function?.name||"unknown",j={id:`session-${a}-${b}-tool-${d}`,role:"tool",content:null,createdAt:Date.now()-(e.length-b)*1e3+d,sessionId:a,toolName:i,toolArgs:h,toolResult:void 0,toolResultMeta:void 0,toolResultSuccess:void 0};"string"==typeof c.id&&c.id.length>0&&g.set(c.id,f.length),f.push(j)});continue}if("tool"===c.role){let a="string"==typeof c.toolCallId?c.toolCallId:void 0,e="string"==typeof c.name?c.name:"unknown",i=Array.isArray(c.content)?c.content:"string"==typeof c.content?[{type:"text",text:c.content}]:[],j=h(i),k={content:i,...j?{resources:j}:{},meta:{toolName:e,toolCallId:a??`tool-${b}`,..."boolean"==typeof c.success?{success:c.success}:{}}};if(a&&g.has(a)){let b=g.get(a);f[b]={...f[b],toolResult:k,toolResultMeta:k.meta,toolResultSuccess:"boolean"==typeof c.success?c.success:void 0}}else f.push({...d,role:"tool",content:null,toolName:e,toolArgs:"object"==typeof c.args?c.args:void 0,toolResult:k,toolResultMeta:k.meta,toolResultSuccess:"boolean"==typeof c.success?c.success:void 0});continue}f.push(d)}y(b=>b.some(b=>b.sessionId===a)?b:f)}catch(a){console.error("Error loading session history:",a),y([])}},[y,G]),M=(0,e.useCallback)(async a=>{if(a!==k&&!q){r(!0);try{l(a),n(!1),await L(a),await G(a)}catch(a){throw console.error("Error switching session:",a),a}finally{r(!1)}}},[k,q,L,G]),N=(0,e.useCallback)(()=>{l(null),n(!0),y([])},[y]);return(0,d.jsx)(j.Provider,{value:{messages:u,sendMessage:J,status:w,reset:K,currentSessionId:k,switchSession:M,loadSessionHistory:L,isWelcomeState:m,returnToWelcome:N,isStreaming:o,setStreaming:p,websocket:z,currentLLM:E,refreshCurrentLLM:G,processing:C,cancel:D,activeError:A,clearError:B,greeting:H},children:a})}function l(){let a=(0,e.useContext)(j);if(!a)throw Error("useChatContext must be used within a ChatProvider");return a}},70702:(a,b,c)=>{"use strict";c.d(b,{kz:()=>i,EQ:()=>j,j0:()=>h,PI:()=>g,P2:()=>f,KU:()=>e,Y_:()=>l});var d=c(4039);function e(a){return"object"==typeof a&&null!==a&&"error"in a}function f(a){return"object"==typeof a&&null!==a&&"content"in a&&Array.isArray(a.content)}function g(a){return"object"==typeof a&&null!==a&&"type"in a&&"text"===a.type}function h(a){return"object"==typeof a&&null!==a&&"type"in a&&"image"===a.type}function i(a){return"object"==typeof a&&null!==a&&"type"in a&&"audio"===a.type}function j(a){return"object"==typeof a&&null!==a&&"type"in a&&"file"===a.type}let k=()=>`msg-${Date.now()}-${Math.random().toString(36).substring(2,9)}`;function l(a,b){let c=(0,d.useRef)(null),[e,f]=(0,d.useState)([]),g=(0,d.useRef)(null),[h,i]=(0,d.useState)("connecting"),[j,l]=(0,d.useState)(!1),[m,n]=(0,d.useState)(null),o=(0,d.useRef)(!1),p=(0,d.useRef)(new Map),q=(0,d.useRef)(b);(0,d.useCallback)(a=>{if(!a)return!1;let b=q.current,c=b?b():null;return!!c&&a===c},[]);let r=(0,d.useCallback)((a,b,d,e,h=!1)=>{if(c.current?.readyState===globalThis.WebSocket.OPEN){c.current.send(JSON.stringify({type:"message",content:a,imageData:b,fileData:d,sessionId:e,stream:h})),l(!0);let i=k();g.current=i,f(c=>[...c,{id:i,role:"user",content:a,createdAt:Date.now(),sessionId:e,imageData:b,fileData:d}])}else n({id:k(),message:"Cannot send message: connection is not open",timestamp:Date.now(),context:"websocket",recoverable:!0})},[]),s=(0,d.useCallback)(a=>{c.current?.readyState===globalThis.WebSocket.OPEN&&c.current.send(JSON.stringify({type:"reset",sessionId:a})),f([]),n(null),g.current=null,p.current.clear(),l(!1)},[]),t=(0,d.useCallback)(a=>{c.current?.readyState===globalThis.WebSocket.OPEN&&c.current.send(JSON.stringify({type:"cancel",sessionId:a})),l(!1),p.current.clear(),o.current=!0},[]),u=(0,d.useCallback)(()=>{n(null)},[]);return{messages:e,status:h,sendMessage:r,reset:s,setMessages:f,websocket:c.current,processing:j,cancel:t,activeError:m,clearError:u}}},77836:(a,b,c)=>{"use strict";function d(a){return a?.startsWith("audio/")?"audio":a?.startsWith("video/")?"video":"binary"}function e(a){return a?.startsWith("image/")?"image":a?.startsWith("audio/")?"audio":a?.startsWith("video/")?"video":"binary"}c.d(b,{h:()=>e,t:()=>d})},90981:(a,b,c)=>{"use strict";c.r(b),c.d(b,{default:()=>m,metadata:()=>l});var d=c(21824),e=c(99741),f=c.n(e),g=c(42829),h=c.n(g);c(21842);var i=c(34820),j=c(27359),k=c(85972);let l={title:{default:"Dexto Web UI",template:"%s \xb7 Dexto"},description:"Interactive playground for testing MCP tools and talking to AI agents",icons:{icon:[{url:"/logos/dexto/dexto_logo_icon.svg",type:"image/svg+xml"}],shortcut:[{url:"/logos/dexto/dexto_logo_icon.svg",type:"image/svg+xml"}],apple:[{url:"/logos/dexto/dexto_logo_icon.svg",type:"image/svg+xml"}]},openGraph:{title:"Dexto",description:"Interactive playground for testing MCP tools and talking to AI agents",type:"website"},twitter:{card:"summary",title:"Dexto",description:"Interactive playground for testing MCP tools and talking to AI agents"},other:{"color-scheme":"light dark"}};async function m({children:a}){let b=await (0,k.UL)(),c=b.get("theme")?.value,e=process.env.API_PORT;return(0,d.jsxs)("html",{lang:"en",className:c&&"dark"!==c?"":"dark",children:[(0,d.jsx)("head",{children:e&&(0,d.jsx)("script",{dangerouslySetInnerHTML:{__html:`window.__DEXTO_API_PORT__ = ${JSON.stringify(e)};`}})}),(0,d.jsx)("body",{className:`${f().variable} ${h().variable} antialiased bg-background text-foreground`,children:(0,d.jsxs)(i.ChatProvider,{children:[(0,d.jsx)(j.SpeechReset,{}),(0,d.jsx)("div",{className:"flex h-screen w-screen flex-col supports-[height:100svh]:h-[100svh] supports-[height:100dvh]:h-[100dvh]",children:a})]})})]})}}};