@v-tilt/browser 1.12.0 → 1.13.1
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.
- package/dist/all-external-dependencies.js.map +1 -1
- package/dist/array.chat.js +2 -0
- package/dist/array.chat.js.map +1 -0
- package/dist/array.chat.no-external.js +2 -0
- package/dist/array.chat.no-external.js.map +1 -0
- package/dist/array.full.chat.js +2 -0
- package/dist/array.full.chat.js.map +1 -0
- package/dist/array.full.chat.no-external.js +2 -0
- package/dist/array.full.chat.no-external.js.map +1 -0
- package/dist/array.full.js +1 -1
- package/dist/array.full.js.map +1 -1
- package/dist/array.full.no-external.js +2 -0
- package/dist/array.full.no-external.js.map +1 -0
- package/dist/array.js +1 -1
- package/dist/array.js.map +1 -1
- package/dist/array.no-external.js +1 -1
- package/dist/array.no-external.js.map +1 -1
- package/dist/chat.js +1 -1
- package/dist/chat.js.map +1 -1
- package/dist/entrypoints/all-external-dependencies.d.ts +10 -3
- package/dist/entrypoints/array.chat.d.ts +10 -0
- package/dist/entrypoints/array.chat.no-external.d.ts +6 -0
- package/dist/entrypoints/array.full.chat.d.ts +13 -0
- package/dist/entrypoints/array.full.chat.no-external.d.ts +7 -0
- package/dist/entrypoints/array.full.d.ts +5 -9
- package/dist/entrypoints/array.full.no-external.d.ts +12 -0
- package/dist/entrypoints/module.chat.es.d.ts +7 -0
- package/dist/entrypoints/module.full.chat.es.d.ts +12 -0
- package/dist/entrypoints/module.full.es.d.ts +12 -0
- package/dist/entrypoints/module.no-external.es.d.ts +1 -0
- package/dist/extensions/chat/bubble-drag.d.ts +20 -5
- package/dist/extensions/chat/chat-wrapper.d.ts +8 -2
- package/dist/extensions/chat/chat.d.ts +21 -221
- package/dist/extensions/chat/controller/__tests__/fakes/ably-realtime-fake.d.ts +84 -0
- package/dist/extensions/chat/controller/ably-client.d.ts +160 -0
- package/dist/extensions/chat/controller/ably-handlers.d.ts +95 -0
- package/dist/extensions/chat/controller/ably-token.d.ts +67 -0
- package/dist/extensions/chat/controller/chat-controller.d.ts +194 -0
- package/dist/extensions/chat/controller/message-delivery-status.d.ts +6 -0
- package/dist/extensions/chat/controller/message-order.d.ts +12 -0
- package/dist/extensions/chat/controller/message-stream.d.ts +49 -0
- package/dist/extensions/chat/lib/bubble-offset.d.ts +18 -0
- package/dist/extensions/chat/lib/merge-chat-config.d.ts +3 -0
- package/dist/extensions/chat/normalize-send-content.d.ts +2 -0
- package/dist/extensions/chat/outbox/message-delivery.d.ts +17 -0
- package/dist/extensions/chat/outbox/message-outbox.d.ts +57 -0
- package/dist/extensions/chat/store/chat-store.d.ts +122 -0
- package/dist/extensions/chat/types.d.ts +1 -19
- package/dist/extensions/chat/ui/ChannelItem.d.ts +12 -0
- package/dist/extensions/chat/ui/ChannelListView.d.ts +14 -0
- package/dist/extensions/chat/ui/ChatBubble.d.ts +14 -0
- package/dist/extensions/chat/ui/ChatHeader.d.ts +13 -0
- package/dist/extensions/chat/ui/ChatPanel.d.ts +14 -0
- package/dist/extensions/chat/ui/ChatRoot.d.ts +31 -0
- package/dist/extensions/chat/ui/ClosedBanner.d.ts +7 -0
- package/dist/extensions/chat/ui/ConnectionBanner.d.ts +32 -0
- package/dist/extensions/chat/ui/ConversationView.d.ts +14 -0
- package/dist/extensions/chat/ui/MessageBubble.d.ts +25 -0
- package/dist/extensions/chat/ui/MessageInput.d.ts +14 -0
- package/dist/extensions/chat/ui/MessageList.d.ts +19 -0
- package/dist/extensions/chat/ui/NewMessagesPill.d.ts +13 -0
- package/dist/extensions/chat/ui/Skeletons.d.ts +14 -0
- package/dist/extensions/chat/ui/TypingBubble.d.ts +23 -0
- package/dist/extensions/chat/ui/TypingIndicator.d.ts +12 -0
- package/dist/extensions/chat/ui/WidgetSlot.d.ts +20 -0
- package/dist/extensions/chat/ui/hooks/use-auto-mark-read.d.ts +18 -0
- package/dist/extensions/chat/ui/hooks/use-scroll-preservation.d.ts +33 -0
- package/dist/extensions/chat/ui/icons.d.ts +18 -0
- package/dist/extensions/chat/ui/message-render.d.ts +18 -0
- package/dist/extensions/chat/ui/shadow-styles.d.ts +13 -0
- package/dist/extensions/chat/ui/utils/mobile-body-scroll-lock.d.ts +14 -0
- package/dist/extensions/chat/widget-registry.d.ts +21 -5
- package/dist/extensions/chat/widgets/collect-email.d.ts +4 -2
- package/dist/extensions/chat/widgets/escalate-to-human.d.ts +2 -1
- package/dist/external-scripts-loader.js +1 -1
- package/dist/external-scripts-loader.js.map +1 -1
- package/dist/feature.d.ts +1 -0
- package/dist/lib/merge-vtilt-config.d.ts +9 -0
- package/dist/main.js +1 -1
- package/dist/main.js.map +1 -1
- package/dist/module.chat.d.ts +1788 -0
- package/dist/module.chat.js +2 -0
- package/dist/module.chat.js.map +1 -0
- package/dist/module.d.ts +48 -3
- package/dist/module.full.chat.d.ts +1792 -0
- package/dist/module.full.chat.js +2 -0
- package/dist/module.full.chat.js.map +1 -0
- package/dist/module.full.d.ts +1793 -0
- package/dist/module.full.js +2 -0
- package/dist/module.full.js.map +1 -0
- package/dist/module.js +1 -1
- package/dist/module.js.map +1 -1
- package/dist/module.no-external.d.ts +48 -3
- package/dist/module.no-external.js +1 -1
- package/dist/module.no-external.js.map +1 -1
- package/dist/recorder.js.map +1 -1
- package/dist/snippet-stub-methods.d.ts +14 -0
- package/dist/utils/globals.d.ts +53 -27
- package/dist/utils/index.d.ts +8 -0
- package/dist/vtilt.d.ts +6 -1
- package/dist/web-vitals.js.map +1 -1
- package/package.json +4 -1
- package/dist/extensions/chat/chat-styles.d.ts +0 -27
- package/dist/extensions/chat/message-content-styles.d.ts +0 -1
- package/dist/extensions/chat/message-html.d.ts +0 -6
- package/dist/extensions/chat/message-markdown.d.ts +0 -8
- package/dist/extensions/ga4-proxy.d.ts +0 -59
- package/dist/utils/type-utils.d.ts +0 -4
- package/dist/web-vitals.d.ts +0 -81
package/dist/chat.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
!function(t){"use strict";var e="undefined"!=typeof window?window:void 0,n="undefined"!=typeof globalThis?globalThis:e,i=null==n?void 0:n.navigator,r=null==n?void 0:n.document;null==n||n.location,null==n||n.fetch,e&&r&&r.createElement,null==n||n.XMLHttpRequest,null==n||n.AbortController,null==i||i.userAgent;var s=null!=e?e:{};function a(t,e,n,i,r,s,a){try{var o=t[s](a),l=o.value}catch(t){return void n(t)}o.done?e(l):Promise.resolve(l).then(i,r)}function o(t){return function(){var e=this,n=arguments;return new Promise(function(i,r){var s=t.apply(e,n);function o(t){a(s,i,r,o,l,"next",t)}function l(t){a(s,i,r,o,l,"throw",t)}o(void 0)})}}function l(){return l=Object.assign?Object.assign.bind():function(t){for(var e=1;e<arguments.length;e++){var n=arguments[e];for(var i in n)({}).hasOwnProperty.call(n,i)&&(t[i]=n[i])}return t},l.apply(null,arguments)}var h=/<(?:p|ul|ol|li|h[1-6]|br|div|pre|blockquote)\b/i;function c(t){var e=t;return e=(e=(e=(e=(e=(e=e.replace(/\*\*(.+?)\*\*/g,"<b>$1</b>")).replace(/__(.+?)__/g,"<b>$1</b>")).replace(/\*(.+?)\*/g,"<i>$1</i>")).replace(/(?<!\w)_(.+?)_(?!\w)/g,"<i>$1</i>")).replace(/`([^`]+)`/g,"<code>$1</code>")).replace(/\[([^\]]+)\]\(([^)]+)\)/g,'<a href="$2">$1</a>')}var d=new Set(["P","B","STRONG","I","EM","U","UL","OL","LI","BR","A","H1","H2","H3","H4","H5","H6","CODE","PRE","BLOCKQUOTE","DIV","SPAN"]);function u(t,e){for(var n=Array.from(t.children),i=0;i<n.length;){var r=n[i];if("LI"!==r.tagName)u(r,e),i++;else{for(var s=[],a=i;a<n.length&&"LI"===n[a].tagName;)s.push(n[a]),a++;var o=e.createElement("ul");for(var l of(t.insertBefore(o,s[0]),s))o.appendChild(l);i=a}}}function v(t,e,n){if(!t)return"";var i=t.trim();if(!i)return"";if(!n)return i;var r=function(t,e){return"html"!==t&&!h.test(e)}(e,i)?function(t){if(!t||h.test(t))return t;for(var e=t.split("\n"),n=[],i=0;i<e.length;){var r=e[i],s=r.match(/^(#{1,6})\s+(.+)$/);if(s){var a=s[1].length;n.push("<h"+a+">"+c(s[2])+"</h"+a+">"),i++}else if(/^[-*]\s+/.test(r)){for(var o=[];i<e.length&&/^[-*]\s+/.test(e[i]);)o.push("<li>"+c(e[i].replace(/^[-*]\s+/,""))+"</li>"),i++;n.push("<ul>"+o.join("")+"</ul>")}else if(/^\d+\.\s+/.test(r)){for(var l=[];i<e.length&&/^\d+\.\s+/.test(e[i]);)l.push("<li>"+c(e[i].replace(/^\d+\.\s+/,""))+"</li>"),i++;n.push("<ol>"+l.join("")+"</ol>")}else if(""!==r.trim()){for(var d=[];i<e.length&&""!==e[i].trim()&&!/^#{1,6}\s/.test(e[i])&&!/^[-*]\s+/.test(e[i])&&!/^\d+\.\s+/.test(e[i]);)d.push(c(e[i])),i++;n.push("<p>"+d.join("<br>")+"</p>")}else i++}return n.join("")}(i):i,s=n.createElement("div");return s.innerHTML=r,function(t,e){var n=t=>{for(var i of Array.from(t.children))if(d.has(i.tagName)){for(var r of Array.from(i.attributes))"A"===i.tagName&&"href"===r.name||i.removeAttribute(r.name);"A"===i.tagName&&(i.setAttribute("target","_blank"),i.setAttribute("rel","noopener noreferrer")),n(i)}else i.replaceWith(e.createTextNode(i.textContent||""))};n(t)}(s,n),u(s,n),s.innerHTML}var f="rich_format",p="markdown";function g(t){return"user"===t.sender_type?function(t){var e;return"html"===t.content_type||(null===(e=t.metadata)||void 0===e?void 0:e[f])===p}(t):"ai"===t.sender_type||"agent"===t.sender_type}var m="x-api-key";function w(t,e,n){void 0===n&&(n={});var{api_host:i,token:r}=t,s=""+(i?i.replace(/\/+$/gm,""):"")+e;if(n.includeTokenQuery&&r){var a=s.includes("?")?"&":"?";s=""+s+a+"token="+r}return s}function y(t){return t.token?{[m]:t.token}:{}}var b="$channel_message",x=Object.defineProperty,k=Object.defineProperties,E=Object.getOwnPropertyDescriptors,T=Object.getOwnPropertySymbols,A=Object.prototype.hasOwnProperty,S=Object.prototype.propertyIsEnumerable,C=(t,e,n)=>e in t?x(t,e,{enumerable:!0,configurable:!0,writable:!0,value:n}):t[e]=n,_=(t,e)=>{for(var n in e||(e={}))A.call(e,n)&&C(t,n,e[n]);if(T)for(var n of T(e))S.call(e,n)&&C(t,n,e[n]);return t},O=(t,e)=>k(t,E(e)),M=function(t,e){this[0]=t,this[1]=e},I=class{},j="undefined"!=typeof global?global:"undefined"!=typeof window?window:self;function P(t,e){return(""+t).padStart(e?3:2,"0")}function R(t){return I.Config.logTimestamps?function(e){var n=new Date;t(P(n.getHours())+":"+P(n.getMinutes())+":"+P(n.getSeconds())+"."+P(n.getMilliseconds(),1)+" "+e)}:function(e){t(e)}}var D=class t{constructor(){this.deprecated=(t,e)=>{this.deprecationWarning(t+" is deprecated and will be removed in a future version. "+e)},this.shouldLog=t=>t<=this.logLevel,this.setLog=(t,e)=>{void 0!==t&&(this.logLevel=t),void 0!==e&&(this.logHandler=this.logErrorHandler=e)},this.logLevel=t.defaultLogLevel,this.logHandler=t.defaultLogHandler,this.logErrorHandler=t.defaultLogErrorHandler}static initLogHandlers(){var e,n,i,[r,s]=("function"==typeof(null==(e=null==j?void 0:j.console)?void 0:e.log)?(n=function(){for(var t=arguments.length,e=new Array(t),n=0;n<t;n++)e[n]=arguments[n];console.log.apply(console,e)},i=console.warn?function(){for(var t=arguments.length,e=new Array(t),n=0;n<t;n++)e[n]=arguments[n];console.warn.apply(console,e)}:n):n=i=function(){},[n,i].map(R));this.defaultLogHandler=r,this.defaultLogErrorHandler=s,this.defaultLogger=new t}static logActionNoStrip(t,e,n,i){t.logAction(e,n,i)}logAction(t,e,n){this.shouldLog(t)&&(1===t?this.logErrorHandler:this.logHandler)("Ably: "+e+": "+n,t)}renamedClientOption(t,e){this.deprecationWarning("The `"+t+"` client option has been renamed to `"+e+"`. Please update your code to use `"+e+"` instead. `"+t+"` will be removed in a future version.")}renamedMethod(t,e,n){this.deprecationWarning("`"+t+"`’s `"+e+"` method has been renamed to `"+n+"`. Please update your code to use `"+n+"` instead. `"+e+"` will be removed in a future version.")}deprecationWarning(t){this.shouldLog(1)&&this.logErrorHandler("Ably: Deprecation warning - "+t,1)}};D.defaultLogLevel=1,D.LOG_NONE=0,D.LOG_ERROR=1,D.LOG_MAJOR=2,D.LOG_MINOR=3,D.LOG_MICRO=4,D.logAction=(t,e,n,i)=>{D.logActionNoStrip(t,e,n,i)};var B=D,N={};function U(t){var e="["+t.constructor.name;return t.message&&(e+=": "+t.message),t.statusCode&&(e+="; statusCode="+t.statusCode),t.code&&(e+="; code="+t.code),t.cause&&(e+="; cause="+vt(t.cause)),!t.href||t.message&&t.message.indexOf("help.ably.io")>-1||(e+="; see "+t.href+" "),e+="]"}((t,e)=>{for(var n in e)x(t,n,{get:e[n],enumerable:!0})})(N,{Format:()=>ot,allSame:()=>at,allToLowerCase:()=>kt,allToUpperCase:()=>Et,arrChooseN:()=>wt,arrDeleteValue:()=>et,arrEquals:()=>It,arrIntersect:()=>Z,arrIntersectOb:()=>tt,arrPopRandomElement:()=>lt,arrWithoutValue:()=>nt,cheapRandStr:()=>gt,containsValue:()=>Y,copy:()=>L,createMissingPluginError:()=>jt,dataSizeBytes:()=>pt,decodeBody:()=>bt,encodeBody:()=>xt,ensureArray:()=>F,forInOwnNonNullProperties:()=>st,getBackoffCoefficient:()=>Tt,getGlobalObject:()=>Ct,getJitterCoefficient:()=>At,getRetryTime:()=>St,inherits:()=>Q,inspectBody:()=>ft,inspectError:()=>vt,intersect:()=>X,isEmpty:()=>W,isErrorInfoOrPartialErrorInfo:()=>ut,isNil:()=>J,isObject:()=>V,keysArray:()=>it,listenerToAsyncIterator:()=>Bt,matchDerivedChannel:()=>Ot,mixin:()=>q,parseQueryString:()=>dt,prototypicalClone:()=>G,randomString:()=>mt,shallowClone:()=>K,shallowEquals:()=>_t,stringifyValues:()=>ct,throwMissingPluginError:()=>Pt,toBase64:()=>Mt,toQueryString:()=>ht,valuesArray:()=>rt,whenPromiseSettles:()=>yt,withTimeoutAsync:()=>Rt});var z=class t extends Error{constructor(e,n,i,r){super(e),void 0!==Object.setPrototypeOf&&Object.setPrototypeOf(this,t.prototype),this.code=n,this.statusCode=i,this.cause=r}toString(){return U(this)}static fromValues(e){var{message:n,code:i,statusCode:r}=e;if("string"!=typeof n||"number"!=typeof i||"number"!=typeof r)throw new Error("ErrorInfo.fromValues(): invalid values: "+I.Config.inspect(e));var s=Object.assign(new t(n,i,r),e);return s.code&&!s.href&&(s.href="https://help.ably.io/error/"+s.code),s}},H=class t extends Error{constructor(e,n,i,r){super(e),void 0!==Object.setPrototypeOf&&Object.setPrototypeOf(this,t.prototype),this.code=n,this.statusCode=i,this.cause=r}toString(){return U(this)}static fromValues(e){var{message:n,code:i,statusCode:r}=e;if("string"!=typeof n||!J(i)&&"number"!=typeof i||!J(r)&&"number"!=typeof r)throw new Error("PartialErrorInfo.fromValues(): invalid values: "+I.Config.inspect(e));var s=Object.assign(new t(n,i,r),e);return s.code&&!s.href&&(s.href="https://help.ably.io/error/"+s.code),s}};function q(t){for(var e=0;e<(arguments.length<=1?0:arguments.length-1);e++){var n=e+1<1||arguments.length<=e+1?void 0:arguments[e+1];if(!n)break;for(var i in n)Object.prototype.hasOwnProperty.call(n,i)&&(t[i]=n[i])}return t}function L(t){return q({},t)}function F(t){return J(t)?[]:Array.isArray(t)?t:[t]}function V(t){return"[object Object]"==Object.prototype.toString.call(t)}function W(t){for(var e in t)return!1;return!0}function J(t){return null==t}function K(t){var e=new Object;for(var n in t)e[n]=t[n];return e}function G(t,e){class n{}n.prototype=t;var i=new n;return e&&q(i,e),i}var Q=function(t,e){I.Config.inherits?I.Config.inherits(t,e):(t.super_=e,t.prototype=G(e.prototype,{constructor:t}))};function Y(t,e){for(var n in t)if(t[n]==e)return!0;return!1}function X(t,e){return Array.isArray(e)?Z(t,e):tt(t,e)}function Z(t,e){for(var n=[],i=0;i<t.length;i++){var r=t[i];-1!=e.indexOf(r)&&n.push(r)}return n}function tt(t,e){for(var n=[],i=0;i<t.length;i++){var r=t[i];r in e&&n.push(r)}return n}function et(t,e){var n=t.indexOf(e),i=-1!=n;return i&&t.splice(n,1),i}function nt(t,e){var n=t.slice();return et(n,e),n}function it(t,e){var n=[];for(var i in t)e&&!Object.prototype.hasOwnProperty.call(t,i)||n.push(i);return n}function rt(t,e){var n=[];for(var i in t)e&&!Object.prototype.hasOwnProperty.call(t,i)||n.push(t[i]);return n}function st(t,e){for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&t[n]&&e(n)}function at(t,e){if(0===t.length)return!0;var n=t[0][e];return t.every(function(t){return t[e]===n})}var ot=(t=>(t.msgpack="msgpack",t.json="json",t))(ot||{});function lt(t){return t.splice((e=t,Math.floor(Math.random()*e.length)),1)[0];var e}function ht(t){var e=[];if(t)for(var n in t)e.push(encodeURIComponent(n)+"="+encodeURIComponent(t[n]));return e.length?"?"+e.join("&"):""}function ct(t){return Object.fromEntries(Object.entries(t).map(t=>{var[e,n]=t;return[e,String(n)]}))}function dt(t){for(var e,n=/([^?&=]+)=?([^&]*)/g,i={};e=n.exec(t);)i[decodeURIComponent(e[1])]=decodeURIComponent(e[2]);return i}function ut(t){return"object"==typeof t&&null!==t&&(t instanceof z||t instanceof H)}function vt(t){var e,n;return t instanceof Error||"ErrorInfo"===(null==(e=null==t?void 0:t.constructor)?void 0:e.name)||"PartialErrorInfo"===(null==(n=null==t?void 0:t.constructor)?void 0:n.name)?t.toString():I.Config.inspect(t)}function ft(t){return I.BufferUtils.isBuffer(t)?t.toString():"string"==typeof t?t:I.Config.inspect(t)}function pt(t){if(I.BufferUtils.isBuffer(t))return I.BufferUtils.byteLength(t);if("string"==typeof t)return I.Config.stringByteSize(t);if("number"==typeof t)return 8;if("boolean"==typeof t)return 1;throw new Error("Expected input of Utils.dataSizeBytes to be a string, a number, a boolean or a buffer, but was: "+typeof t)}function gt(){return String(Math.random()).substr(2)}var mt=function(){var t=o(function*(t){var e=yield I.Config.getRandomArrayBuffer(t);return I.BufferUtils.base64Encode(e)});return function(e){return t.apply(this,arguments)}}();function wt(t,e){for(var n=Math.min(e,t.length),i=t.slice(),r=[],s=0;s<n;s++)r.push(lt(i));return r}function yt(t,e){t.then(t=>{null==e||e(null,t)}).catch(t=>{null==e||e(t)})}function bt(t,e,n){return"msgpack"==n?(e||Pt("MsgPack"),e.decode(t)):JSON.parse(String(t))}function xt(t,e,n){return"msgpack"==n?(e||Pt("MsgPack"),e.encode(t,!0)):JSON.stringify(t)}function kt(t){return t.map(function(t){return t&&t.toLowerCase()})}function Et(t){return t.map(function(t){return t&&t.toUpperCase()})}function Tt(t){return Math.min((t+2)/3,2)}function At(){return 1-.2*Math.random()}function St(t,e){return t*Tt(e)*At()}function Ct(){return"undefined"!=typeof global?global:"undefined"!=typeof window?window:self}function _t(t,e){return Object.keys(t).every(n=>t[n]===e[n])&&Object.keys(e).every(n=>e[n]===t[n])}function Ot(t){var e=t.match(/^(\[([^?]*)(?:(.*))\])?(.+)$/);if(!e||!e.length||e.length<5)throw new z("regex match failed",400,40010);if(e[2])throw new z("cannot use a derived option with a "+e[2]+" channel",400,40010);return{qualifierParam:e[3]||"",channelName:e[4]}}function Mt(t){var e=I.BufferUtils,n=e.utf8Encode(t);return e.base64Encode(n)}function It(t,e){return t.length===e.length&&t.every(function(t,n){return t===e[n]})}function jt(t){return new z(t+" plugin not provided",40019,400)}function Pt(t){throw jt(t)}function Rt(t,e,n){return Dt.apply(this,arguments)}function Dt(){return(Dt=o(function*(t,e,n){void 0===e&&(e=5e3),void 0===n&&(n="Timeout expired");var i=new z(n,5e4,500);return Promise.race([t,new Promise((t,n)=>setTimeout(()=>n(i),e))])})).apply(this,arguments)}function Bt(t){return n=(t,i,r,s)=>{try{var a=e[t](i),o=(i=a.value)instanceof M,l=a.done;Promise.resolve(o?i[0]:i).then(e=>o?n("return"===t?t:"next",i[1]?{done:e.done,value:e.value}:e,r,s):r({value:e,done:l})).catch(t=>n("throw",t,r,s))}catch(t){s(t)}},i=t=>r[t]=e=>new Promise((i,r)=>n(t,e,i,r)),r={},e=(e=function*(){var e=[],n=null,i=t(t=>{if(n){var i=n;n=null,i(t)}else e.push(t)});try{for(;;)if(e.length>0)yield e.shift();else{if(n)throw new z("Concurrent next() calls are not supported",4e4,400);var r=yield new M(new Promise(t=>{n=t}));yield r}}finally{i()}}).apply(this,null),r[Symbol.asyncIterator]=()=>r,i("next"),i("throw"),i("return"),r;var e,n,i,r}var Nt="2.17.0",Ut={ENDPOINT:"main",ENVIRONMENT:"",REST_HOST:"rest.ably.io",REALTIME_HOST:"realtime.ably.io",FALLBACK_HOSTS:["main.a.fallback.ably-realtime.com","main.b.fallback.ably-realtime.com","main.c.fallback.ably-realtime.com","main.d.fallback.ably-realtime.com","main.e.fallback.ably-realtime.com"],PORT:80,TLS_PORT:443,TIMEOUTS:{disconnectedRetryTimeout:15e3,suspendedRetryTimeout:3e4,httpRequestTimeout:1e4,httpMaxRetryDuration:15e3,channelRetryTimeout:15e3,fallbackRetryTimeout:6e5,connectionStateTtl:12e4,realtimeRequestTimeout:1e4,recvTimeout:9e4,webSocketConnectTimeout:1e4,webSocketSlowTimeout:4e3},httpMaxRetryCount:3,maxMessageSize:65536,version:Nt,protocolVersion:5,agent:"ably-js/"+Nt,getPort:function(t,e){return e||t.tls?t.tlsPort:t.port},getHttpScheme:function(t){return t.tls?"https://":"http://"},getPrimaryDomainFromEndpoint:Ht,getEndpointFallbackHosts:qt,getFallbackHosts:Ft,getHosts:function(t){return[t.primaryDomain].concat(Ft(t))},checkHost:Vt,objectifyOptions:function(t,e,n,i,r){if(void 0===t){var s=e?n+" must be initialized with either a client options object, an Ably API key, or an Ably Token":n+" must be initialized with a client options object";throw B.logAction(i,B.LOG_ERROR,n+"()",s),new Error(s)}var a;if("string"==typeof t)if(-1==t.indexOf(":")){if(!e){var o=n+" cannot be initialized with just an Ably Token; you must provide a client options object with a `plugins` property. (Set this Ably Token as the object’s `token` property.)";throw B.logAction(i,B.LOG_ERROR,n+"()",o),new Error(o)}a={token:t}}else{if(!e){var l=n+" cannot be initialized with just an Ably API key; you must provide a client options object with a `plugins` property. (Set this Ably API key as the object’s `key` property.)";throw B.logAction(i,B.LOG_ERROR,n+"()",l),new Error(l)}a={key:t}}else a=t;r&&(a=O(_({},a),{plugins:_(_({},r),a.plugins)}));return a},normaliseOptions:function(t,e,n){var i=null!=n?n:B.defaultLogger;t.environment&&i.deprecated("The `environment` client option","Use the `endpoint` client option instead.");t.restHost&&i.deprecated("The `restHost` client option","Use the `endpoint` client option instead.");t.realtimeHost&&i.deprecated("The `realtimeHost` client option","Use the `endpoint` client option instead.");Jt(t),"function"==typeof t.recover&&!0===t.closeOnUnload&&(B.logAction(i,B.LOG_ERROR,"Defaults.normaliseOptions","closeOnUnload was true and a session recovery function was set - these are mutually exclusive, so unsetting the latter"),t.recover=void 0);"closeOnUnload"in t||(t.closeOnUnload=!t.recover);"queueMessages"in t||(t.queueMessages=!0);var r=t.endpoint||Ut.ENDPOINT;t.fallbackHosts||t.restHost||t.realtimeHost||t.port||t.tlsPort||(t.fallbackHosts=qt(t.environment||r));var s=t.environment&&t.environment+".realtime.ably.net",a=t.restHost||t.realtimeHost||s||Ht(r);(t.fallbackHosts||[]).concat(a).forEach(Vt),t.port=t.port||Ut.PORT,t.tlsPort=t.tlsPort||Ut.TLS_PORT,"tls"in t||(t.tls=!0);var o=function(t){var e={};for(var n in Ut.TIMEOUTS)e[n]=t[n]||Ut.TIMEOUTS[n];return e}(t);t.useBinaryProtocol=!!e&&("useBinaryProtocol"in t?I.Config.supportsBinary&&t.useBinaryProtocol:I.Config.preferBinary);var l={};t.clientId&&(l["X-Ably-ClientId"]=I.BufferUtils.base64Encode(I.BufferUtils.utf8Encode(t.clientId)));"idempotentRestPublishing"in t||(t.idempotentRestPublishing=!0);var h=null,c=t.connectivityCheckUrl;if(t.connectivityCheckUrl){var[d,u]=t.connectivityCheckUrl.split("?");h=u?dt(u):{},-1===d.indexOf("://")&&(d="https://"+d),c=d}var v=t.wsConnectivityCheckUrl;v&&-1===v.indexOf("://")&&(v="wss://"+v);return O(_({},t),{primaryDomain:a,maxMessageSize:t.maxMessageSize||Ut.maxMessageSize,timeouts:o,connectivityCheckParams:h,connectivityCheckUrl:c,wsConnectivityCheckUrl:v,headers:l})},defaultGetHeaders:function(t,e){var{format:n,protocolVersion:i=Gt.protocolVersion}=void 0===e?{}:e;return{accept:Kt[null!=n?n:t.useBinaryProtocol?"msgpack":"json"],"X-Ably-Version":i.toString(),"Ably-Agent":Wt(t)}},defaultPostHeaders:function(t,e){var{format:n,protocolVersion:i=Gt.protocolVersion}=void 0===e?{}:e,r=Kt[null!=n?n:t.useBinaryProtocol?"msgpack":"json"];return{accept:r,"content-type":r,"X-Ably-Version":i.toString(),"Ably-Agent":Wt(t)}}};function zt(t){return t.includes(".")||t.includes("::")||"localhost"===t}function Ht(t){return zt(t)?t:t.startsWith("nonprod:")?t.replace("nonprod:","")+".realtime.ably-nonprod.net":t+".realtime.ably.net"}function qt(t){return zt(t)?[]:t.startsWith("nonprod:")?Lt(t.replace("nonprod:",""),"ably-realtime-nonprod.com"):Lt(t,"ably-realtime.com")}function Lt(t,e){return["a","b","c","d","e"].map(n=>t+"."+n+".fallback."+e)}function Ft(t){var e=t.fallbackHosts,n=void 0!==t.httpMaxRetryCount?t.httpMaxRetryCount:Ut.httpMaxRetryCount;return e?wt(e,n):[]}function Vt(t){if("string"!=typeof t)throw new z("host must be a string; was a "+typeof t,4e4,400);if(!t.length)throw new z("host must not be zero-length",4e4,400)}function Wt(t){var e=Ut.agent;if(t.agents)for(var n in t.agents)e+=" "+n+"/"+t.agents[n];return e}function Jt(t){if(t.endpoint&&(t.environment||t.restHost||t.realtimeHost))throw new z("The `endpoint` option cannot be used in conjunction with the `environment`, `restHost`, or `realtimeHost` options.",40106,400);if(t.environment&&(t.restHost||t.realtimeHost))throw new z("The `environment` option cannot be used in conjunction with the `restHost`, or `realtimeHost` options.",40106,400)}function $t(t,e,n){var i=n||{};if(i.cipher){t||Pt("Crypto");var r=t.getCipher(i.cipher,e);i.cipher=r.cipherParams,i.channelCipher=r.cipher}else"cipher"in i&&(i.cipher=void 0,i.channelCipher=null);return i}var Kt={json:"application/json",xml:"application/xml",html:"text/html",msgpack:"application/x-msgpack",text:"text/plain"},Gt={protocolVersion:Ut.protocolVersion};var Qt=Ut;var Yt=class t{constructor(t,e){this.logger=t,this.members=e||[]}call(t,e){for(var n of this.members)if(n)try{n(t,e)}catch(t){B.logAction(this.logger,B.LOG_ERROR,"Multicaster multiple callback handler","Unexpected exception: "+t+"; stack = "+t.stack)}}push(){this.members.push(...arguments)}createPromise(){return new Promise((t,e)=>{this.push((n,i)=>{n?e(n):t(i)})})}resolveAll(t){this.call(null,t)}rejectAll(t){this.call(t)}static create(e,n){var i=new t(e,n);return Object.assign((t,e)=>i.call(t,e),{push:t=>i.push(t),createPromise:()=>i.createPromise(),resolveAll:t=>i.resolveAll(t),rejectAll:t=>i.rejectAll(t)})}},Xt=(t=>(t.Get="get",t.Delete="delete",t.Post="post",t.Put="put",t.Patch="patch",t))(Xt||{}),Zt=Xt,te=(t=>(t[t.Success=200]="Success",t[t.NoContent=204]="NoContent",t[t.BadRequest=400]="BadRequest",t[t.Unauthorized=401]="Unauthorized",t[t.Forbidden=403]="Forbidden",t[t.RequestTimeout=408]="RequestTimeout",t[t.InternalServerError=500]="InternalServerError",t))(te||{});var ee=te,ne=Math.pow(2,17);function ie(t){return ut(t)?(t.code||(403===t.statusCode?t.code=40300:(t.code=40170,t.statusCode=401)),t):new z(vt(t),t.code||40170,t.statusCode||401)}function re(t){if(!t)return"";"string"==typeof t&&(t=JSON.parse(t));var e=Object.create(null),n=it(t,!0);if(!n)return"";n.sort();for(var i=0;i<n.length;i++)e[n[i]]=t[n[i]].sort();return JSON.stringify(e)}function se(t,e){if(t.authCallback);else if(t.authUrl);else if(t.key);else if(!t.tokenDetails){var n="authOptions must include valid authentication parameters";throw B.logAction(e,B.LOG_ERROR,"Auth()",n),new Error(n)}}var ae=0;var oe=class{constructor(t,e){if(this.authOptions={},this.client=t,this.tokenParams=e.defaultTokenParams||{},this.currentTokenRequestId=null,this.waitingForTokenRequest=null,function(t){return t.useTokenAuth||!function(t){return"useTokenAuth"in t&&!t.useTokenAuth}(t)&&(t.authCallback||t.authUrl||t.token||t.tokenDetails)}(e))(function(t){return!t.key&&!t.authCallback&&!t.authUrl})(e)&&B.logAction(this.logger,B.LOG_ERROR,"Auth()","Warning: library initialized with a token literal without any way to renew the token when it expires (no authUrl, authCallback, or key). See https://help.ably.io/error/40171 for help"),this.t(e.defaultTokenParams,e),se(this.authOptions,this.logger);else{if(!e.key){var n="No authentication options provided; need one of: key, authUrl, or authCallback (or for testing only, token or tokenDetails)";throw B.logAction(this.logger,B.LOG_ERROR,"Auth()",n),new z(n,40160,401)}this.i(e)}}get logger(){return this.client.logger}authorize(t,e){var n=this;return o(function*(){if(e&&e.key&&n.authOptions.key!==e.key)throw new z("Unable to update auth options with incompatible key",40102,401);try{var i=yield n.o(null!=t?t:null,null!=e?e:null);return n.client.connection?new Promise((t,e)=>{n.client.connection.connectionManager.onAuthUpdated(i,(n,i)=>n?e(n):t(i))}):i}catch(t){throw n.client.connection&&t.statusCode===ee.Forbidden&&n.client.connection.connectionManager.actOnErrorFromAuthorize(t),t}})()}o(t,e){var n=this;return o(function*(){n.tokenDetails=null,n.t(t,e),se(n.authOptions,n.logger);try{return n.l(!0)}finally{delete n.tokenParams.timestamp,delete n.authOptions.queryTime}})()}requestToken(t,e){var n=this;return o(function*(){var i,r=e||n.authOptions,s=t||L(n.tokenParams),a=n.client;if(r.authCallback)i=r.authCallback;else if(r.authUrl)i=(t,e)=>{var i,s=q({accept:"application/json, text/plain"},r.authHeaders),a=r.authMethod&&"post"===r.authMethod.toLowerCase(),o=r.authUrl.indexOf("?");o>-1&&(i=dt(r.authUrl.slice(o)),r.authUrl=r.authUrl.slice(0,o),a||(r.authParams=q(i,r.authParams)));var l=q({},r.authParams||{},t),h=t=>{var n,i,r=null!=(n=t.body)?n:null,s=null;if(t.error);else{var a=null!=(i=t.headers["content-type"])?i:null;s=Array.isArray(a)?a.join(", "):a}if(t.error)e(t.error,null);else if(t.unpacked)e(null,r);else if(I.BufferUtils.isBuffer(r)&&(r=r.toString()),s){var o=s.indexOf("application/json")>-1,l=s.indexOf("text/plain")>-1||s.indexOf("application/jwt")>-1;if(o||l){if(o){if(r.length>ne)return void e(new z("authUrl response exceeded max permitted length",40170,401),null);try{r=JSON.parse(r)}catch(t){return void e(new z("Unexpected error processing authURL response; err = "+t.message,40170,401),null)}}e(null,r,s)}else e(new z("authUrl responded with unacceptable content-type "+s+", should be either text/plain, application/jwt or application/json",40170,401),null)}else e(new z("authUrl response is missing a content-type header",40170,401),null)};if(a){var c=s||{};c["content-type"]="application/x-www-form-urlencoded";var d=ht(l).slice(1);yt(n.client.http.doUri(Zt.Post,r.authUrl,c,d,i),(t,e)=>h(t||e))}else yt(n.client.http.doUri(Zt.Get,r.authUrl,s||{},null,l),(t,e)=>h(t||e))};else{if(!r.key){throw B.logAction(n.logger,B.LOG_ERROR,"Auth()","library initialized with a token literal without any way to renew the token when it expires (no authUrl, authCallback, or key). See https://help.ably.io/error/40171 for help"),new z("Need a new token, but authOptions does not include any way to request one (no authUrl, authCallback, or key)",40171,403)}i=(t,e)=>{yt(n.createTokenRequest(t,r),(t,n)=>e(t,null!=n?n:null))}}"capability"in s&&(s.capability=re(s.capability));return new Promise((t,e)=>{var o=!1,l=n.client.options.timeouts.realtimeRequestTimeout,h=setTimeout(()=>{o=!0;var t="Token request callback timed out after "+l/1e3+" seconds";B.logAction(n.logger,B.LOG_ERROR,"Auth.requestToken()",t),e(new z(t,40170,401))},l);i(s,(i,s,l)=>{if(!o){if(clearTimeout(h),i)return B.logAction(n.logger,B.LOG_ERROR,"Auth.requestToken()","token request signing call returned error; err = "+vt(i)),void e(ie(i));if("string"!=typeof s){if("object"!=typeof s||null===s){var c="Expected token request callback to call back with a token string or token request/details object, but got a "+typeof s;return B.logAction(n.logger,B.LOG_ERROR,"Auth.requestToken()",c),void e(new z(c,40170,401))}var d=JSON.stringify(s).length;if(d>ne&&!r.suppressMaxLengthCheck)e(new z("Token request/details object exceeded max permitted stringified size (was "+d+" bytes)",40170,401));else if("issued"in s)t(s);else{if(!("keyName"in s)){var u="Expected token request callback to call back with a token string, token request object, or token details object";return B.logAction(n.logger,B.LOG_ERROR,"Auth.requestToken()",u),void e(new z(u,40170,401))}var v,f,p,g;f=(i,r,s)=>{if(i)return B.logAction(n.logger,B.LOG_ERROR,"Auth.requestToken()","token request API call returned error; err = "+vt(i)),void e(ie(i));s||(r=JSON.parse(r)),t(r)},p="/keys/"+(v=s).keyName+"/requestToken",g=Qt.defaultPostHeaders(n.client.options,{format:"json"}),r.requestHeaders&&q(g,r.requestHeaders),yt(n.client.http.do(Zt.Post,function(t){return a.baseUri(t)+p},g,JSON.stringify(v),null),(t,e)=>t?f(t):f(e.error,e.body,e.unpacked))}}else 0===s.length?e(new z("Token string is empty",40170,401)):s.length>ne?e(new z("Token string exceeded max permitted length (was "+s.length+" bytes)",40170,401)):"undefined"===s||"null"===s?e(new z("Token string was literal null/undefined",40170,401)):"{"!==s[0]||l&&l.indexOf("application/jwt")>-1?t({token:s}):e(new z("Token was double-encoded; make sure you're not JSON-encoding an already encoded token request or details",40170,401))}})})})()}createTokenRequest(t,e){var n=this;return o(function*(){e=e||n.authOptions,t=t||L(n.tokenParams);var i=e.key;if(!i)throw new z("No key specified",40101,403);var r=i.split(":"),s=r[0],a=r[1];if(!a)throw new z("Invalid key specified",40101,403);if(""===t.clientId)throw new z("clientId can’t be an empty string",40012,400);"capability"in t&&(t.capability=re(t.capability));var o=q({keyName:s},t),l=t.clientId||"",h=t.ttl||"",c=t.capability||"";o.timestamp||(o.timestamp=yield n.h(e&&e.queryTime));var d=o.nonce||(o.nonce=("000000"+Math.floor(1e16*Math.random())).slice(-16)),u=o.timestamp,v=o.keyName+"\n"+h+"\n"+c+"\n"+l+"\n"+u+"\n"+d+"\n";return o.mac=o.mac||((t,e)=>{var n=I.BufferUtils,i=n.utf8Encode(t),r=n.utf8Encode(e),s=n.hmacSha256(i,r);return n.base64Encode(s)})(v,a),o})()}getAuthParams(){var t=this;return o(function*(){if("basic"==t.method)return{key:t.key};var e=yield t.l(!1);if(!e)throw new Error("Auth.getAuthParams(): _ensureValidAuthCredentials returned no error or tokenDetails");return{access_token:e.token}})()}getAuthHeaders(){var t=this;return o(function*(){if("basic"==t.method)return{authorization:"Basic "+t.basicKey};var e=yield t.l(!1);if(!e)throw new Error("Auth.getAuthParams(): _ensureValidAuthCredentials returned no error or tokenDetails");return{authorization:"Bearer "+Mt(e.token)}})()}i(t){this.method="basic",this.key=t.key,this.basicKey=Mt(t.key),this.authOptions=t||{},"clientId"in t&&this.u(t.clientId)}t(t,e){this.method="token",t&&(this.tokenParams=t),e&&(e.token&&(e.tokenDetails="string"==typeof e.token?{token:e.token}:e.token),e.tokenDetails&&(this.tokenDetails=e.tokenDetails),"clientId"in e&&this.u(e.clientId),this.authOptions=e)}l(t){var e=this;return o(function*(){var n=e.tokenDetails;if(n){if(e.p(n.clientId))throw new z("Mismatch between clientId in token ("+n.clientId+") and current clientId ("+e.clientId+")",40102,403);if(!e.client.isTimeOffsetSet()||!n.expires||n.expires>=e.client.getTimestampUsingOffset())return n;e.tokenDetails=null}var i=(e.waitingForTokenRequest||(e.waitingForTokenRequest=Yt.create(e.logger))).createPromise();if(null!==e.currentTokenRequestId&&!t)return i;var r,s=e.currentTokenRequestId=ae++,a=null;try{r=yield e.requestToken(e.tokenParams,e.authOptions)}catch(t){a=t}if(e.currentTokenRequestId>s)return i;e.currentTokenRequestId=null;var o=e.waitingForTokenRequest;return e.waitingForTokenRequest=null,a?(null==o||o.rejectAll(a),i):(null==o||o.resolveAll(e.tokenDetails=r),i)})()}u(t){if("string"!=typeof t&&null!==t)throw new z("clientId must be either a string or null",40012,400);if("*"===t)throw new z('Can’t use "*" as a clientId as that string is reserved. (To change the default token request behaviour to use a wildcard clientId, instantiate the library with {defaultTokenParams: {clientId: "*"}}), or if calling authorize(), pass it in as a tokenParam: authorize({clientId: "*"}, authOptions)',40012,400);var e=this.m(t);if(e)throw e}m(t){if(this.p(t)){var e="Unexpected clientId mismatch: client has "+this.clientId+", requested "+t,n=new z(e,40102,401);return B.logAction(this.logger,B.LOG_ERROR,"Auth._uncheckedSetClientId()",e),n}return this.clientId=this.tokenParams.clientId=t,null}p(t){return!(!this.clientId||"*"===this.clientId||!t||"*"===t||this.clientId===t)}static isTokenErr(t){return t.code&&t.code>=40140&&t.code<40150}revokeTokens(t,e){return this.client.rest.revokeTokens(t,e)}h(t){var e=this;return o(function*(){return e.client.getTimestamp(t||!!e.authOptions.queryTime)})()}};function le(t){var e=[];if(t)for(var n in t)e.push(n+"="+t[n]);return e.join("&")}function he(t,e){return t+(e?"?":"")+le(e)}var ce=class{constructor(t){this.client=t,this.platformHttp=new I.Http(t),this.checkConnectivity=this.platformHttp.checkConnectivity?()=>this.platformHttp.checkConnectivity():void 0}get logger(){var t,e;return null!=(e=null==(t=this.client)?void 0:t.logger)?e:B.defaultLogger}get supportsAuthHeaders(){return this.platformHttp.supportsAuthHeaders}get supportsLinkHeaders(){return this.platformHttp.supportsLinkHeaders}k(t){var e=t.connection,n=e&&e.connectionManager.host;return n?[n].concat(Qt.getFallbackHosts(t.options)):Qt.getHosts(t.options)}do(t,e,n,i,r){var s=this;return o(function*(){try{var a=s.client;if(!a)return{error:new z("http.do called without client",5e4,500)};var l="function"==typeof e?e:function(t){return a.baseUri(t)+e},h=a.T;if(h){if(h.validUntil>Date.now()){var c=yield s.doUri(t,l(h.host),n,i,r);return c.error&&s.platformHttp.shouldFallback(c.error)?(a.T=null,s.do(t,e,n,i,r)):c}a.T=null}var d=s.k(a);if(1===d.length)return s.doUri(t,l(d[0]),n,i,r);var u=null,v=function(){var e=o(function*(e,o){var h=e.shift();u=null!=u?u:new Date;var c=yield s.doUri(t,l(h),n,i,r);return c.error&&s.platformHttp.shouldFallback(c.error)&&e.length?Date.now()-u.getTime()>a.options.timeouts.httpMaxRetryDuration?{error:new z("Timeout for trying fallback hosts retries. Total elapsed time exceeded the "+a.options.timeouts.httpMaxRetryDuration+"ms limit",50003,500)}:v(e,!0):(o&&(a.T={host:h,validUntil:Date.now()+a.options.timeouts.fallbackRetryTimeout}),c)});return function(t,n){return e.apply(this,arguments)}}();return v(d)}catch(t){return{error:new z("Unexpected error in Http.do: "+vt(t),500,5e4)}}})()}doUri(t,e,n,i,r){var s=this;return o(function*(){try{!function(t,e,n,i,r){r.shouldLog(B.LOG_MICRO)&&B.logActionNoStrip(r,B.LOG_MICRO,"Http."+t+"()","Sending; "+he(e,i)+"; Body"+(I.BufferUtils.isBuffer(n)?" (Base64): "+I.BufferUtils.base64Encode(n):": "+n))}(t,e,i,r,s.logger);var a=yield s.platformHttp.doUri(t,e,n,i,r);return s.logger.shouldLog(B.LOG_MICRO)&&function(t,e,n,i,r){t.error?B.logActionNoStrip(r,B.LOG_MICRO,"Http."+e+"()","Received Error; "+he(n,i)+"; Error: "+vt(t.error)):B.logActionNoStrip(r,B.LOG_MICRO,"Http."+e+"()","Received; "+he(n,i)+"; Headers: "+le(t.headers)+"; StatusCode: "+t.statusCode+"; Body"+(I.BufferUtils.isBuffer(t.body)?" (Base64): "+I.BufferUtils.base64Encode(t.body):": "+t.body))}(a,t,e,r,s.logger),a}catch(t){return{error:new z("Unexpected error in Http.doUri: "+vt(t),500,5e4)}}})()}};function de(t,e,n){for(var i,r,s,a=0;a<t.length;a++)if(i=t[a],n&&(i=i[n]),Array.isArray(i)){for(;-1!==(r=i.indexOf(e));)i.splice(r,1);n&&0===i.length&&delete t[a][n]}else if(V(i))for(s in i)Object.prototype.hasOwnProperty.call(i,s)&&Array.isArray(i[s])&&de([i],e,s)}var ue=class{constructor(t){this.logger=t,this.any=[],this.events=Object.create(null),this.anyOnce=[],this.eventsOnce=Object.create(null)}on(){for(var t=arguments.length,e=new Array(t),n=0;n<t;n++)e[n]=arguments[n];if(1===e.length){var i=e[0];if("function"!=typeof i)throw new Error("EventListener.on(): Invalid arguments: "+I.Config.inspect(e));this.any.push(i)}if(2===e.length){var[r,s]=e;if("function"!=typeof s)throw new Error("EventListener.on(): Invalid arguments: "+I.Config.inspect(e));if(J(r))this.any.push(s);else if(Array.isArray(r))r.forEach(t=>{this.on(t,s)});else{if("string"!=typeof r)throw new Error("EventListener.on(): Invalid arguments: "+I.Config.inspect(e));(this.events[r]||(this.events[r]=[])).push(s)}}}off(){for(var t=arguments.length,e=new Array(t),n=0;n<t;n++)e[n]=arguments[n];if(0==e.length||J(e[0])&&J(e[1]))return this.any=[],this.events=Object.create(null),this.anyOnce=[],void(this.eventsOnce=Object.create(null));var[i,r]=e,s=null,a=null;if(1!==e.length&&r){if("function"!=typeof r)throw new Error("EventEmitter.off(): invalid arguments:"+I.Config.inspect(e));[a,s]=[i,r]}else"function"==typeof i?s=i:a=i;if(s&&J(a))de([this.any,this.events,this.anyOnce,this.eventsOnce],s);else if(Array.isArray(a))a.forEach(t=>{this.off(t,s)});else{if("string"!=typeof a)throw new Error("EventEmitter.off(): invalid arguments:"+I.Config.inspect(e));s?de([this.events,this.eventsOnce],s,a):(delete this.events[a],delete this.eventsOnce[a])}}listeners(t){if(t){var e=this.events[t]||[];return this.eventsOnce[t]&&Array.prototype.push.apply(e,this.eventsOnce[t]),e.length?e:null}return this.any.length?this.any:null}emit(t){for(var e=arguments.length,n=new Array(e>1?e-1:0),i=1;i<e;i++)n[i-1]=arguments[i];var r={event:t},s=[];this.anyOnce.length&&(Array.prototype.push.apply(s,this.anyOnce),this.anyOnce=[]),this.any.length&&Array.prototype.push.apply(s,this.any);var a=this.eventsOnce[t];a&&(Array.prototype.push.apply(s,a),delete this.eventsOnce[t]);var o=this.events[t];o&&Array.prototype.push.apply(s,o),s.forEach(t=>{!function(t,e,n,i){try{n.apply(e,i)}catch(e){B.logAction(t,B.LOG_ERROR,"EventEmitter.emit()","Unexpected listener exception: "+e+"; stack = "+(e&&e.stack))}}(this.logger,r,t,n)})}once(){for(var t=arguments.length,e=new Array(t),n=0;n<t;n++)e[n]=arguments[n];var i=e.length;if(0===i||1===i&&"function"!=typeof e[0]){var r=e[0];return new Promise(t=>{this.once(r,t)})}var[s,a]=e;if(1===e.length&&"function"==typeof s)this.anyOnce.push(s);else if(J(s)){if("function"!=typeof a)throw new Error("EventEmitter.once(): Invalid arguments:"+I.Config.inspect(e));this.anyOnce.push(a)}else if(Array.isArray(s)){var o=this,l=function(){var t=Array.prototype.slice.call(arguments);if(s.forEach(function(t){o.off(t,l)}),"function"!=typeof a)throw new Error("EventEmitter.once(): Invalid arguments:"+I.Config.inspect(e));a.apply(this,t)};s.forEach(function(t){o.on(t,l)})}else{if("string"!=typeof s)throw new Error("EventEmitter.once(): Invalid arguments:"+I.Config.inspect(e));var h=this.eventsOnce[s]||(this.eventsOnce[s]=[]);if(a){if("function"!=typeof a)throw new Error("EventEmitter.once(): Invalid arguments:"+I.Config.inspect(e));h.push(a)}}}whenState(t,e){var n=this;return o(function*(){if("string"!=typeof t||"string"!=typeof e)throw new Error("whenState requires a valid state String argument");return t===e?null:n.once(t)})()}},ve={HEARTBEAT:0,ACK:1,NACK:2,CONNECT:3,CONNECTED:4,DISCONNECT:5,DISCONNECTED:6,CLOSE:7,CLOSED:8,ERROR:9,ATTACH:10,ATTACHED:11,DETACH:12,DETACHED:13,PRESENCE:14,MESSAGE:15,SYNC:16,AUTH:17,ACTIVATE:18,OBJECT:19,OBJECT_SYNC:20,ANNOTATION:21},fe=[];Object.keys(ve).forEach(function(t){fe[ve[t]]=t});var pe={HAS_PRESENCE:1,HAS_BACKLOG:2,RESUMED:4,TRANSIENT:16,ATTACH_RESUME:32,HAS_OBJECTS:128,PRESENCE:65536,PUBLISH:1<<17,SUBSCRIBE:1<<18,PRESENCE_SUBSCRIBE:1<<19,ANNOTATION_PUBLISH:1<<21,ANNOTATION_SUBSCRIBE:1<<22,OBJECT_SUBSCRIBE:1<<24,OBJECT_PUBLISH:1<<25},ge=Object.keys(pe);pe.MODE_ALL=pe.PRESENCE|pe.PUBLISH|pe.SUBSCRIBE|pe.PRESENCE_SUBSCRIBE|pe.ANNOTATION_PUBLISH|pe.ANNOTATION_SUBSCRIBE|pe.OBJECT_SUBSCRIBE|pe.OBJECT_PUBLISH;var me=["PRESENCE","PUBLISH","SUBSCRIBE","PRESENCE_SUBSCRIBE","ANNOTATION_PUBLISH","ANNOTATION_SUBSCRIBE","OBJECT_SUBSCRIBE","OBJECT_PUBLISH"];function we(){return(we=o(function*(t,e){var{data:n,encoding:i}=yield ye(t.data,t.encoding,e);return t.data=n,t.encoding=i,t})).apply(this,arguments)}function ye(t,e,n){return be.apply(this,arguments)}function be(){return(be=o(function*(t,e,n){var i=n.channelCipher,r=t,s=e?e+"/":"";return I.BufferUtils.isBuffer(r)||(r=I.BufferUtils.utf8Encode(String(r)),s+="utf-8/"),{data:yield i.encrypt(r),encoding:s=s+"cipher+"+i.algorithm}})).apply(this,arguments)}function xe(){return xe=o(function*(t,e){var{data:n,encoding:i}=ke(t.data,t.encoding);return t.data=n,t.encoding=i,null!=e&&e.cipher?function(t,e){return we.apply(this,arguments)}(t,e):t}),xe.apply(this,arguments)}function ke(t,e){if("string"==typeof t||I.BufferUtils.isBuffer(t)||null==t)return{data:t,encoding:e};if(V(t)||Array.isArray(t))return{data:JSON.stringify(t),encoding:e?e+"/json":"json"};throw new z("Data type is unsupported",40013,400)}function Ee(){return(Ee=o(function*(t,e){var{data:n,encoding:i,error:r}=yield Te(t.data,t.encoding,e);if(t.data=n,t.encoding=i,r)throw r})).apply(this,arguments)}function Te(t,e,n){return Ae.apply(this,arguments)}function Ae(){return(Ae=o(function*(t,e,n){var i,r=function(t){return t&&t.channelOptions?t:{channelOptions:t,plugins:{},baseEncodedPreviousPayload:void 0}}(n),s=t,a=t,o=e;if(e){var l,h=e.split("/"),c=h.length,d="";try{for(;(l=c)>0;){var u=h[--c].match(/([-\w]+)(\+([\w-]+))?/);if(!u)break;switch(d=u[1]){case"base64":a=I.BufferUtils.base64Decode(String(a)),l==h.length&&(s=a);continue;case"utf-8":a=I.BufferUtils.utf8Decode(a);continue;case"json":a=JSON.parse(a);continue;case"cipher":if(null!=r.channelOptions&&r.channelOptions.cipher&&r.channelOptions.channelCipher){var v=u[3],f=r.channelOptions.channelCipher;if(v!=f.algorithm)throw new Error("Unable to decrypt message with given cipher; incompatible cipher params");a=yield f.decrypt(a);continue}throw new Error("Unable to decrypt message; not an encrypted channel");case"vcdiff":if(!r.plugins||!r.plugins.vcdiff)throw new z("Missing Vcdiff decoder (https://github.com/ably-forks/vcdiff-decoder)",40019,400);if("undefined"==typeof Uint8Array)throw new z("Delta decoding not supported on this browser (need ArrayBuffer & Uint8Array)",40020,400);try{var p=r.baseEncodedPreviousPayload;"string"==typeof p&&(p=I.BufferUtils.utf8Encode(p));var g=I.BufferUtils.toBuffer(p);a=I.BufferUtils.toBuffer(a),s=a=I.BufferUtils.arrayBufferViewToBuffer(r.plugins.vcdiff.decode(a,g))}catch(t){throw new z("Vcdiff delta decode failed with "+t,40018,400)}continue;default:throw new Error("Unknown encoding")}}}catch(t){var m=t;i=new z("Error processing the "+d+" encoding, decoder returned ‘"+m.message+"’",m.code||40013,400)}finally{o=l<=0?null:h.slice(0,l).join("/")}}return i?{error:i,data:a,encoding:o}:(r.baseEncodedPreviousPayload=s,{data:a,encoding:o})})).apply(this,arguments)}function Se(){var t=arguments.length>0?"json":"msgpack",{data:e,encoding:n}=Ce(this.data,this.encoding,t);return Object.assign({},this,{encoding:n,data:e})}function Ce(t,e,n){return t&&I.BufferUtils.isBuffer(t)?"msgpack"===n?{data:I.BufferUtils.toBuffer(t),encoding:e}:{data:I.BufferUtils.base64Encode(t),encoding:e?e+"/base64":"base64"}:{data:t,encoding:e}}var _e={encryptData:ye,encodeData:ke,encodeDataForWire:Ce,decodeData:Te};function Oe(t){var e,{id:n,connectionId:i,timestamp:r}=t;switch(t.action){case ve.MESSAGE:e=t.messages;break;case ve.PRESENCE:case ve.SYNC:e=t.presence;break;case ve.ANNOTATION:e=t.annotations;break;case ve.OBJECT:case ve.OBJECT_SYNC:e=t.state;break;default:throw new z("Unexpected action "+t.action,4e4,400)}for(var s=0;s<e.length;s++){var a=e[s];a.connectionId||(a.connectionId=i),a.timestamp||(a.timestamp=r),n&&!a.id&&(a.id=n+":"+s)}}function Me(t,e){var n="["+e;for(var i in t)"data"===i?"string"==typeof t.data?n+="; data="+t.data:I.BufferUtils.isBuffer(t.data)?n+="; data (buffer)="+I.BufferUtils.base64Encode(t.data):void 0!==t.data&&(n+="; data (json)="+JSON.stringify(t.data)):!i||"extras"!==i&&"operation"!==i?"version"===i?n+="; version="+JSON.stringify(t[i]):"annotations"===i?n+="; annotations="+JSON.stringify(t[i]):void 0!==t[i]&&(n+="; "+i+"="+t[i]):n+="; "+i+"="+JSON.stringify(t[i]);return n+="]"}var Ie=class{},je=class{constructor(t){var e,n,i,r,s,a,o,l,h,c;this.Platform=I,this.ErrorInfo=z,this.Logger=B,this.Defaults=Qt,this.Utils=N,this.EventEmitter=ue,this.MessageEncoding=_e,this.A=null!=(e=t.plugins)?e:null,this.logger=new B,this.logger.setLog(t.logLevel,t.logHandler),this.S=null!=(i=null==(n=t.plugins)?void 0:n.MsgPack)?i:null;var d=this.options=Qt.normaliseOptions(t,this.S,this.logger);if(d.key){var u=d.key.match(/^([^:\s]+):([^:.\s]+)$/);if(!u){var v="invalid key parameter";throw B.logAction(this.logger,B.LOG_ERROR,"BaseClient()",v),new z(v,40400,404)}d.keyName=u[1],d.keySecret=u[2]}if("clientId"in d){if("string"!=typeof d.clientId&&null!==d.clientId)throw new z("clientId must be either a string or null",40012,400);if("*"===d.clientId)throw new z('Can’t use "*" as a clientId as that string is reserved. (To change the default token request behaviour to use a wildcard clientId, use {defaultTokenParams: {clientId: "*"}})',40012,400)}this.T=null,this.serverTimeOffset=null,this.http=new ce(this),this.auth=new oe(this,d),this.C=(null==(r=t.plugins)?void 0:r.Rest)?new t.plugins.Rest(this):null,this.O=null!=(a=null==(s=t.plugins)?void 0:s.Crypto)?a:null,this.__FilteredSubscriptions=null!=(l=null==(o=t.plugins)?void 0:o.MessageInteractions)?l:null,this.M=null!=(c=null==(h=t.plugins)?void 0:h.Annotations)?c:null}get rest(){return this.C||Pt("Rest"),this.C}get I(){return this.__FilteredSubscriptions||Pt("MessageInteractions"),this.__FilteredSubscriptions}get channels(){return this.rest.channels}get push(){return this.rest.push}device(){var t;return(null==(t=this.options.plugins)?void 0:t.Push)&&this.push.LocalDevice||Pt("Push"),this.j||(this.j=this.push.LocalDevice.load(this)),this.j}baseUri(t){return Qt.getHttpScheme(this.options)+t+":"+Qt.getPort(this.options,!1)}stats(t){var e=this;return o(function*(){return e.rest.stats(t)})()}time(t){var e=this;return o(function*(){return e.rest.time(t)})()}request(t,e,n,i,r,s){var a=this;return o(function*(){return a.rest.request(t,e,n,i,r,s)})()}batchPublish(t){return this.rest.batchPublish(t)}batchPresence(t){return this.rest.batchPresence(t)}setLog(t){this.logger.setLog(t.level,t.handler)}getTimestamp(t){var e=this;return o(function*(){return!e.isTimeOffsetSet()&&t?e.time():e.getTimestampUsingOffset()})()}getTimestampUsingOffset(){return Date.now()+(this.serverTimeOffset||0)}isTimeOffsetSet(){return null!==this.serverTimeOffset}};je.Platform=I;var Pe=je,Re=["message.create","message.update","message.delete","meta","message.summary","message.append"];function De(t){var e=0;return t.name&&(e+=t.name.length),t.clientId&&(e+=t.clientId.length),t.extras&&(e+=JSON.stringify(t.extras).length),t.data&&(e+=pt(t.data)),e}function Be(){return(Be=o(function*(t,e){return Promise.all(t.map(t=>t.encode(e)))})).apply(this,arguments)}var Ne=class t extends Ie{expandFields(){if(this.version||(this.version={}),!this.version.serial&&this.serial&&(this.version.serial=this.serial),!this.version.timestamp&&this.timestamp&&(this.version.timestamp=this.timestamp),this.annotations?this.annotations.summary||(this.annotations.summary={}):this.annotations={summary:{}},this.annotations&&this.annotations.summary)for(var[t,e]of Object.entries(this.annotations.summary))if(t.endsWith(":distinct.v1")||t.endsWith(":unique.v1")||t.endsWith(":multiple.v1"))for(var[,n]of Object.entries(e))n.clipped||(n.clipped=!1);else t.endsWith(":flag.v1")&&(e.clipped||(e.clipped=!1))}encode(t){var e=this;return o(function*(){return function(t,e){return xe.apply(this,arguments)}(Object.assign(new Ue,e,{action:Re.indexOf(e.action||"message.create")}),t)})()}static fromValues(e){return Object.assign(new t,e)}static fromValuesArray(e){return e.map(e=>t.fromValues(e))}toString(){return Me(this,"Message")}},Ue=class t extends Ie{toJSON(){for(var t=arguments.length,e=new Array(t),n=0;n<t;n++)e[n]=arguments[n];return Se.call(this,...e)}static fromValues(e){return Object.assign(new t,e)}static fromValuesArray(e){return e.map(e=>t.fromValues(e))}decodeWithErr(t,e){var n=this;return o(function*(){var i,r,s=Object.assign(new Ne,O(_({},n),{action:(i=n.action,Re[i||0]||"unknown")}));try{yield function(t,e){return Ee.apply(this,arguments)}(s,t)}catch(t){B.logAction(e,B.LOG_ERROR,"WireMessage.decode()",vt(t)),r=t}return s.expandFields(),{decoded:s,err:r}})()}decode(t,e){var n=this;return o(function*(){var{decoded:i}=yield n.decodeWithErr(t,e);return i})()}toString(){return Me(this,"WireMessage")}},ze=Ne,He=class{constructor(t,e,n,i,r){this.previous=t,this.current=e,"attached"===e&&(this.resumed=n,this.hasBacklog=i),r&&(this.reason=r)}},qe=function(){};function Le(t){var e=t||{},{agent:n}=e;return((t,e)=>{var n={};for(var i in t)A.call(t,i)&&e.indexOf(i)<0&&(n[i]=t[i]);if(null!=t&&T)for(var i of T(t))e.indexOf(i)<0&&S.call(t,i)&&(n[i]=t[i]);return n})(e,["agent"])}var Fe=class t extends ue{constructor(t,e,n){var i,r,s;super(t.logger),this.P=null,this.R=0,this.retryCount=0,this.history=function(){var t=o(function*(t){var e=this.client.rest.channelMixin;if(t&&t.untilAttach){if("attached"!==this.state)throw new z("option untilAttach requires the channel to be attached",4e4,400);if(!this.properties.attachSerial)throw new z("untilAttach was specified and channel is attached, but attachSerial is not defined",4e4,400);delete t.untilAttach,t.from_serial=this.properties.attachSerial}return e.history(this,t)});return function(e){return t.apply(this,arguments)}}(),this.whenState=t=>ue.prototype.whenState.call(this,t,this.state),this.name=e,this.channelOptions=$t(null!=(i=t.O)?i:null,this.logger,n),this.client=t,this.D=t.B?new t.B.RealtimePresence(this):null,t.M&&(this.P=new t.M.RealtimeAnnotations(this)),this.connectionManager=t.connection.connectionManager,this.state="initialized",this.subscriptions=new ue(this.logger),this.syncChannelSerial=void 0,this.properties={attachSerial:void 0,channelSerial:void 0},this.setOptions(n),this.errorReason=null,this.N=!1,this.U={channelOptions:this.channelOptions,plugins:t.options.plugins||{},baseEncodedPreviousPayload:void 0},this.H={messageId:null,protocolMessageChannelSerial:null,decodeFailureRecoveryInProgress:null},this.q=new ue(this.logger),(null==(r=t.options.plugins)?void 0:r.Push)&&(this.L=new t.options.plugins.Push.PushChannel(this)),(null==(s=t.options.plugins)?void 0:s.LiveObjects)&&(this.F=new t.options.plugins.LiveObjects.RealtimeObject(this))}get presence(){return this.D||Pt("RealtimePresence"),this.D}get annotations(){return this.P||Pt("Annotations"),this.P}get push(){return this.L||Pt("Push"),this.L}get object(){return this.F||Pt("LiveObjects"),this.F}invalidStateError(){return new z("Channel operation failed as channel state is "+this.state,90001,400,this.errorReason||void 0)}static processListenerArgs(t){return"function"==typeof(t=Array.prototype.slice.call(t))[0]&&t.unshift(null),t}setOptions(t){var e=this;return o(function*(){var n,i=e.channelOptions,r=function(t){if(t&&"params"in t&&!V(t.params))return new z("options.params must be an object",4e4,400);if(t&&"modes"in t){if(!Array.isArray(t.modes))return new z("options.modes must be an array",4e4,400);for(var e=0;e<t.modes.length;e++){var n=t.modes[e];if(!n||"string"!=typeof n||!me.includes(String.prototype.toUpperCase.call(n)))return new z("Invalid channel mode: "+n,4e4,400)}}}(t);if(r)throw r;if(e.channelOptions=$t(null!=(n=e.client.O)?n:null,e.logger,t),e.U&&(e.U.channelOptions=e.channelOptions),e.V(t,i))return e.attachImpl(),new Promise((t,n)=>{e.q.once(["attached","update","detached","failed"],function(e){switch(this.event){case"update":case"attached":t();break;default:n(e.reason)}})})})()}V(t,e){if("attached"!==this.state&&"attaching"!==this.state)return!1;if(null==t?void 0:t.params){var n=Le(t.params),i=Le(e.params);if(Object.keys(n).length!==Object.keys(i).length)return!0;if(!_t(i,n))return!0}return!(!(null==t?void 0:t.modes)||e.modes&&It(t.modes,e.modes))}publish(){var t=arguments,e=this;return o(function*(){var n,i,r=t.length<=0?void 0:t[0],s=t.length<=1?void 0:t[1];if("string"==typeof r||null==r)n=[ze.fromValues({name:r,data:s})],i=t.length<=2?void 0:t[2];else if(V(r))n=[ze.fromValues(r)],i=t.length<=1?void 0:t[1];else{if(!Array.isArray(r))throw new z("The single-argument form of publish() expects a message object or an array of message objects",40013,400);n=ze.fromValuesArray(r),i=t.length<=1?void 0:t[1]}var a=e.client.options.maxMessageSize,o=yield function(t,e){return Be.apply(this,arguments)}(n,e.channelOptions),l=function(t){for(var e,n=0,i=0;i<t.length;i++)n+=(e=t[i]).size||(e.size=De(e));return n}(o);if(l>a)throw new z("Maximum size of messages that can be published at once exceeded (was "+l+" bytes; limit is "+a+" bytes)",40009,400);e.throwIfUnpublishableState();var h=$e({action:ve.MESSAGE,channel:e.name,messages:o,params:i?ct(i):void 0});return(yield e.sendMessage(h))||{serials:[]}})()}throwIfUnpublishableState(){if(!this.connectionManager.activeState())throw this.connectionManager.getError();if("failed"===this.state||"suspended"===this.state)throw this.invalidStateError()}onEvent(t){for(var e=this.subscriptions,n=0;n<t.length;n++){var i=t[n];e.emit(i.name,i)}}attach(){var t=this;return o(function*(){return"attached"===t.state?null:new Promise((e,n)=>{t.W(!1,null,(t,i)=>t?n(t):e(i))})})()}W(t,e,n){n||(n=t=>{t&&B.logAction(this.logger,B.LOG_ERROR,"RealtimeChannel._attach()","Channel attach failed: "+t.toString())});var i=this.connectionManager;i.activeState()?(("attaching"!==this.state||t)&&this.requestState("attaching",e),this.once(function(t){switch(this.event){case"attached":null==n||n(null,t);break;case"detached":case"suspended":case"failed":null==n||n(t.reason||i.getError()||new z("Unable to attach; reason unknown; state = "+this.event,9e4,500));break;case"detaching":null==n||n(new z("Attach request superseded by a subsequent detach request",9e4,409))}})):n(i.getError())}attachImpl(){var t=$e({action:ve.ATTACH,channel:this.name,params:this.channelOptions.params,channelSerial:this.properties.channelSerial});this.channelOptions.modes&&t.encodeModesToFlags(Et(this.channelOptions.modes)),this.N&&t.setFlag("ATTACH_RESUME"),this.H.decodeFailureRecoveryInProgress&&(t.channelSerial=this.H.protocolMessageChannelSerial),this.sendMessage(t).catch(qe)}detach(){var t=this;return o(function*(){var e=t.connectionManager;switch(t.state){case"suspended":return void t.notifyState("detached");case"detached":return;case"failed":throw new z("Unable to detach; channel state = failed",90001,400);default:if("connected"!==e.state.state)return void t.notifyState("detached");t.requestState("detaching");case"detaching":return new Promise((n,i)=>{t.once(function(t){switch(this.event){case"detached":n();break;case"attached":case"suspended":case"failed":i(t.reason||e.getError()||new z("Unable to detach; reason unknown; state = "+this.event,9e4,500));break;case"attaching":i(new z("Detach request superseded by a subsequent attach request",9e4,409))}})})}})()}detachImpl(){var t=$e({action:ve.DETACH,channel:this.name});this.sendMessage(t).catch(qe)}subscribe(){var e=arguments,n=this;return o(function*(){for(var i=e.length,r=new Array(i),s=0;s<i;s++)r[s]=e[s];var[a,o]=t.processListenerArgs(r);if("failed"===n.state)throw z.fromValues(n.invalidStateError());return a&&"object"==typeof a&&!Array.isArray(a)?n.client.I.subscribeFilter(n,a,o):n.subscriptions.on(a,o),!1!==n.channelOptions.attachOnSubscribe?n.attach():null})()}unsubscribe(){for(var e,n=arguments.length,i=new Array(n),r=0;r<n;r++)i[r]=arguments[r];var[s,a]=t.processListenerArgs(i);"object"==typeof s&&!a||(null==(e=this.filteredSubscriptions)?void 0:e.has(a))?this.client.I.getAndDeleteFilteredSubscriptions(this,s,a).forEach(t=>this.subscriptions.off(t)):this.subscriptions.off(s,a)}sync(){switch(this.state){case"initialized":case"detaching":case"detached":throw new H("Unable to sync to channel; not attached",4e4)}var t=this.connectionManager;if(!t.activeState())throw t.getError();var e=$e({action:ve.SYNC,channel:this.name});this.syncChannelSerial&&(e.channelSerial=this.syncChannelSerial),t.send(e)}sendMessage(t){var e=this;return o(function*(){return new Promise((n,i)=>{e.connectionManager.send(t,e.client.options.queueMessages,(t,e)=>{t?i(t):n(e)})})})()}sendPresence(t){var e=this;return o(function*(){var n=$e({action:ve.PRESENCE,channel:e.name,presence:t});yield e.sendMessage(n)})()}sendState(t){var e=this;return o(function*(){var n=$e({action:ve.OBJECT,channel:e.name,state:t});yield e.sendMessage(n)})()}processMessage(t){var e=this;return o(function*(){t.action!==ve.ATTACHED&&t.action!==ve.MESSAGE&&t.action!==ve.PRESENCE&&t.action!==ve.OBJECT&&t.action!==ve.ANNOTATION||e.setChannelSerial(t.channelSerial);var n,i=!1;switch(t.action){case ve.ATTACHED:e.properties.attachSerial=t.channelSerial,e.R=t.getMode(),e.params=t.params||{};var r=t.decodeModesFromFlags();e.modes=r&&kt(r)||void 0;var s=t.hasFlag("RESUMED"),a=t.hasFlag("HAS_PRESENCE"),o=t.hasFlag("HAS_BACKLOG"),l=t.hasFlag("HAS_OBJECTS");if("attached"===e.state){s||(e.D&&e.D.onAttached(a),e.F&&e.F.onAttached(l));var h=new He(e.state,e.state,s,o,t.error);e.q.emit("update",h),s&&!e.channelOptions.updateOnAttached||e.emit("update",h)}else"detaching"===e.state?e.checkPendingState():e.notifyState("attached",t.error,s,a,o,l);break;case ve.DETACHED:var c=t.error?z.fromValues(t.error):new z("Channel detached",90001,404);"detaching"===e.state?e.notifyState("detached",c):"attaching"===e.state?e.notifyState("suspended",c):"attached"!==e.state&&"suspended"!==e.state||e.requestState("attaching",c);break;case ve.SYNC:if(i=!0,n=e.syncChannelSerial=t.channelSerial,!t.presence)break;case ve.PRESENCE:if(!t.presence)break;Oe(t);var d=e.channelOptions;if(e.D){var u=yield Promise.all(t.presence.map(t=>t.decode(d,e.logger)));e.D.setPresence(u,i,n)}break;case ve.OBJECT:case ve.OBJECT_SYNC:if(!e.F||!t.state)return;Oe(t);var v=e.client.connection.connectionManager.getActiveTransportFormat(),f=t.state.map(t=>t.decode(e.client,v));t.action===ve.OBJECT?e.F.handleObjectMessages(f):e.F.handleObjectSyncMessages(f,t.channelSerial);break;case ve.MESSAGE:if("attached"!==e.state)return;Oe(t);var p=t.messages,g=p[0],m=p[p.length-1];if(g.extras&&g.extras.delta&&g.extras.delta.from!==e.H.messageId){var w='Delta message decode failure - previous message not available for message "'+t.id+'" on this channel "'+e.name+'".';B.logAction(e.logger,B.LOG_ERROR,"RealtimeChannel.processMessage()",w),e.J(new z(w,40018,400));break}for(var y=[],b=0;b<p.length;b++){var{decoded:x,err:k}=yield p[b].decodeWithErr(e.U,e.logger);if(y[b]=x,k)switch(k.code){case 40018:return void e.J(k);case 40019:case 40021:return void e.notifyState("failed",k)}}e.H.messageId=m.id,e.H.protocolMessageChannelSerial=t.channelSerial,e.onEvent(y);break;case ve.ANNOTATION:Oe(t);var E=e.channelOptions;if(e.P){var T=yield Promise.all((t.annotations||[]).map(t=>t.decode(E,e.logger)));e.P.$(T)}break;case ve.ERROR:var A=t.error;A&&80016==A.code?e.checkPendingState():e.notifyState("failed",z.fromValues(A))}})()}J(t){this.H.decodeFailureRecoveryInProgress||(this.H.decodeFailureRecoveryInProgress=!0,this.W(!0,t,()=>{this.H.decodeFailureRecoveryInProgress=!1}))}onAttached(){}notifyState(t,e,n,i,r,s){if(this.clearStateTimer(),["detached","suspended","failed"].includes(t)&&(this.properties.channelSerial=null),t!==this.state){this.D&&this.D.actOnChannelState(t,i,e),this.F&&this.F.actOnChannelState(t,s),"suspended"===t&&this.connectionManager.state.sendEvents?this.startRetryTimer():this.cancelRetryTimer(),e&&(this.errorReason=e);var a=new He(this.state,t,n,r,e),o='Channel state for channel "'+this.name+'"',l=t+(e?"; reason: "+e:"");"failed"===t&&B.logAction(this.logger,B.LOG_ERROR,o,l),"attaching"!==t&&"suspended"!==t&&(this.retryCount=0),"attached"===t&&this.onAttached(),"attached"===t?this.N=!0:"detaching"!==t&&"failed"!==t||(this.N=!1),this.state=t,this.q.emit(t,a),this.emit(t,a)}}requestState(t,e){this.notifyState(t,e),this.checkPendingState()}checkPendingState(){if(this.connectionManager.state.sendEvents)switch(this.state){case"attaching":this.startStateTimerIfNotRunning(),this.attachImpl();break;case"detaching":this.startStateTimerIfNotRunning(),this.detachImpl();break;case"attached":this.sync()}}timeoutPendingState(){switch(this.state){case"attaching":var t=new z("Channel attach timed out",90007,408);this.notifyState("suspended",t);break;case"detaching":var e=new z("Channel detach timed out",90007,408);this.notifyState("attached",e);break;default:this.checkPendingState()}}startStateTimerIfNotRunning(){this.stateTimer||(this.stateTimer=setTimeout(()=>{this.stateTimer=null,this.timeoutPendingState()},this.client.options.timeouts.realtimeRequestTimeout))}clearStateTimer(){var t=this.stateTimer;t&&(clearTimeout(t),this.stateTimer=null)}startRetryTimer(){if(!this.retryTimer){this.retryCount++;var t=St(this.client.options.timeouts.channelRetryTimeout,this.retryCount);this.retryTimer=setTimeout(()=>{"suspended"===this.state&&this.connectionManager.state.sendEvents&&(this.retryTimer=null,this.requestState("attaching"))},t)}}cancelRetryTimer(){this.retryTimer&&(clearTimeout(this.retryTimer),this.retryTimer=null)}getReleaseErr(){var t=this.state;return"initialized"===t||"detached"===t||"failed"===t?null:new z("Can only release a channel in a state where there is no possibility of further updates from the server being received (initialized, detached, or failed); was "+t,90001,400)}setChannelSerial(t){t&&(this.properties.channelSerial=t)}status(){var t=this;return o(function*(){return t.client.rest.channelMixin.status(t)})()}getMessage(t){var e=this;return o(function*(){return e.client.rest.channelMixin.getMessage(e,t)})()}updateMessage(t,e,n){var i=this;return o(function*(){return i.sendUpdate(t,"message.update",e,n)})()}deleteMessage(t,e,n){var i=this;return o(function*(){return i.sendUpdate(t,"message.delete",e,n)})()}appendMessage(t,e,n){var i=this;return o(function*(){return i.sendUpdate(t,"message.append",e,n)})()}sendUpdate(t,e,n,i){var r=this;return o(function*(){var s,a;if(!t.serial)throw new z('This message lacks a serial and cannot be updated. Make sure you have enabled "Message annotations, updates, and deletes" in channel settings on your dashboard.',40003,400);r.throwIfUnpublishableState();var o=ze.fromValues(O(_({},t),{action:e,version:n})),l=yield o.encode(r.channelOptions),h=$e({action:ve.MESSAGE,channel:r.name,messages:[l],params:i?ct(i):void 0}),c=yield r.sendMessage(h);return{versionSerial:null!=(a=null==(s=null==c?void 0:c.serials)?void 0:s[0])?a:null}})()}getMessageVersions(t,e){var n=this;return o(function*(){return n.client.rest.channelMixin.getMessageVersions(n,t,e)})()}ensureAttached(){var t=this;return o(function*(){switch(t.state){case"attached":case"suspended":break;case"initialized":case"detached":case"detaching":case"attaching":yield t.attach();break;default:throw z.fromValues(t.invalidStateError())}})()}},Ve=xt;function We(t){var e=[];if(t)for(var n=0;n<t.length;n++)e.push(t[n].toString());return"[ "+e.join(", ")+" ]"}function Je(t,e,n,i,r,s){return function(t,e,n,i){var r,s,a,o,l;t.error&&(r=z.fromValues(t.error));t.messages&&(s=Ue.fromValuesArray(t.messages));e&&t.presence&&(a=e.WirePresenceMessage.fromValuesArray(t.presence));n&&t.annotations&&(o=n.WireAnnotation.fromValuesArray(t.annotations));i&&t.state&&(l=i.WireObjectMessage.fromValuesArray(t.state,N,_e));return Object.assign(new Ge,O(_({},t),{presence:a,messages:s,annotations:o,state:l,error:r}))}(bt(t,e,s),n,i,r)}function $e(t){return Object.assign(new Ge,t)}function Ke(t,e,n,i){var r="[ProtocolMessage";void 0!==t.action&&(r+="; action="+fe[t.action]||t.action);for(var s,a=["id","channel","channelSerial","connectionId","count","msgSerial","timestamp"],o=0;o<a.length;o++)void 0!==t[s=a[o]]&&(r+="; "+s+"="+t[s]);if(t.messages&&(r+="; messages="+We(Ue.fromValuesArray(t.messages))),t.presence&&e&&(r+="; presence="+We(e.WirePresenceMessage.fromValuesArray(t.presence))),t.annotations&&n&&(r+="; annotations="+We(n.WireAnnotation.fromValuesArray(t.annotations))),t.state&&i&&(r+="; state="+We(i.WireObjectMessage.fromValuesArray(t.state,N,_e))),t.error&&(r+="; error="+z.fromValues(t.error).toString()),t.auth&&t.auth.accessToken&&(r+="; token="+t.auth.accessToken),t.flags&&(r+="; flags="+ge.filter(t.hasFlag).join(",")),t.params){var l="";st(t.params,function(e){l.length>0&&(l+="; "),l+=e+"="+t.params[e]}),l.length>0&&(r+="; params=["+l+"]")}return r+="]"}var Ge=class{constructor(){this.hasFlag=t=>(this.flags&pe[t])>0}setFlag(t){return this.flags=this.flags|pe[t]}getMode(){return(this.flags||0)&pe.MODE_ALL}encodeModesToFlags(t){t.forEach(t=>this.setFlag(t))}decodeModesFromFlags(){var t=[];return me.forEach(e=>{this.hasFlag(e)&&t.push(e)}),t.length>0?t:void 0}},Qe=class extends ue{constructor(t){super(t),this.messages=[]}count(){return this.messages.length}push(t){this.messages.push(t)}shift(){return this.messages.shift()}last(){return this.messages[this.messages.length-1]}copyAll(){return this.messages.slice()}append(t){this.messages.push.apply(this.messages,t)}prepend(t){this.messages.unshift.apply(this.messages,t)}completeMessages(t,e,n){e=e||null;var i=this.messages;if(0===i.length)throw new Error("MessageQueue.completeMessages(): completeMessages called on any empty MessageQueue");var r=[];if("all"===t)r=i.splice(0);else{var s=i[0];if(s){var a=s.message.msgSerial,o=t.serial+t.count;o>a&&(r=i.splice(0,o-a))}}for(var l=0;l<r.length;l++){var h=r[l],c=null==n?void 0:n[l];h.callback(e,c)}0==i.length&&this.emit("idle")}completeAllMessages(t){this.completeMessages("all",t)}resetSendAttempted(){for(var t of this.messages)t.sendAttempted=!1}clear(){this.messages=[],this.emit("idle")}},Ye=class{constructor(t,e){this.message=t,this.callback=e,this.merged=!1;var n=t.action;this.sendAttempted=!1,this.ackRequired="number"==typeof n&&[ve.MESSAGE,ve.PRESENCE,ve.ANNOTATION,ve.OBJECT].includes(n)}},Xe=class extends ue{constructor(t){super(t.logger),this.transport=t,this.messageQueue=new Qe(this.logger),t.on("ack",(t,e,n)=>{this.onAck(t,e,n)}),t.on("nack",(t,e,n)=>{this.onNack(t,e,n)})}onAck(t,e,n){this.messageQueue.completeMessages({serial:t,count:e},null,n)}onNack(t,e,n){B.logAction(this.logger,B.LOG_ERROR,"Protocol.onNack()","serial = "+t+"; count = "+e+"; err = "+vt(n)),n||(n=new z("Unable to send message; channel not responding",50001,500)),this.messageQueue.completeMessages({serial:t,count:e},n)}onceIdle(t){var e=this.messageQueue;0!==e.count()?e.once("idle",t):t()}send(t){t.ackRequired&&this.messageQueue.push(t),this.logger.shouldLog(B.LOG_MICRO)&&B.logActionNoStrip(this.logger,B.LOG_MICRO,"Protocol.send()","sending msg; "+Ke(t.message,this.transport.connectionManager.realtime.B,this.transport.connectionManager.realtime.M,this.transport.connectionManager.realtime.K)),t.sendAttempted=!0,this.transport.send(t.message)}getTransport(){return this.transport}getPendingMessages(){return this.messageQueue.copyAll()}clearPendingMessages(){return this.messageQueue.clear()}finish(){var t=this.transport;this.onceIdle(function(){t.disconnect()})}},Ze=class{constructor(t,e,n,i){this.previous=t,this.current=e,n&&(this.retryIn=n),i&&(this.reason=i)}},tn={DISCONNECTED:80003,SUSPENDED:80002,FAILED:8e4,CLOSING:80017,CLOSED:80017,UNKNOWN_CONNECTION_ERR:50002,UNKNOWN_CHANNEL_ERR:50001};var en,nn,rn={disconnected:()=>z.fromValues({statusCode:400,code:tn.DISCONNECTED,message:"Connection to server temporarily unavailable"}),suspended:()=>z.fromValues({statusCode:400,code:tn.SUSPENDED,message:"Connection to server unavailable"}),failed:()=>z.fromValues({statusCode:400,code:tn.FAILED,message:"Connection failed or disconnected by server"}),closing:()=>z.fromValues({statusCode:400,code:tn.CLOSING,message:"Connection closing"}),closed:()=>z.fromValues({statusCode:400,code:tn.CLOSED,message:"Connection closed"}),unknownConnectionErr:()=>z.fromValues({statusCode:500,code:tn.UNKNOWN_CONNECTION_ERR,message:"Internal connection error"}),unknownChannelErr:()=>z.fromValues({statusCode:500,code:tn.UNKNOWN_CONNECTION_ERR,message:"Internal channel error"})},sn=$e({action:ve.CLOSE}),an=$e({action:ve.DISCONNECT}),on=class extends ue{constructor(t,e,n,i){super(t.logger),i&&(n.format=void 0,n.heartbeats=!0),this.connectionManager=t,this.auth=e,this.params=n,this.timeouts=n.options.timeouts,this.format=n.format,this.isConnected=!1,this.isFinished=!1,this.isDisposed=!1,this.maxIdleInterval=null,this.idleTimer=null,this.lastActivity=null}connect(){}close(){this.isConnected&&this.requestClose(),this.finish("closed",rn.closed())}disconnect(t){this.isConnected&&this.requestDisconnect(),this.finish("disconnected",t||rn.disconnected())}fail(t){this.isConnected&&this.requestDisconnect(),this.finish("failed",t||rn.failed())}finish(t,e){var n;this.isFinished||(this.isFinished=!0,this.isConnected=!1,this.maxIdleInterval=null,clearTimeout(null!=(n=this.idleTimer)?n:void 0),this.idleTimer=null,this.emit(t,e),this.dispose())}onProtocolMessage(t){switch(this.logger.shouldLog(B.LOG_MICRO)&&B.logActionNoStrip(this.logger,B.LOG_MICRO,"Transport.onProtocolMessage()","received on "+this.shortName+": "+Ke(t,this.connectionManager.realtime.B,this.connectionManager.realtime.M,this.connectionManager.realtime.K)+"; connectionId = "+this.connectionManager.connectionId),this.onActivity(),t.action){case ve.HEARTBEAT:B.logActionNoStrip(this.logger,B.LOG_MICRO,"Transport.onProtocolMessage()",this.shortName+" heartbeat; connectionId = "+this.connectionManager.connectionId),this.emit("heartbeat",t.id);break;case ve.CONNECTED:this.onConnect(t),this.emit("connected",t.error,t.connectionId,t.connectionDetails,t);break;case ve.CLOSED:this.onClose(t);break;case ve.DISCONNECTED:this.onDisconnect(t);break;case ve.ACK:this.emit("ack",t.msgSerial,t.count,t.res);break;case ve.NACK:this.emit("nack",t.msgSerial,t.count,t.error);break;case ve.SYNC:this.connectionManager.onChannelMessage(t,this);break;case ve.ACTIVATE:break;case ve.AUTH:yt(this.auth.authorize(),t=>{t&&B.logAction(this.logger,B.LOG_ERROR,"Transport.onProtocolMessage()","Ably requested re-authentication, but unable to obtain a new token: "+vt(t))});break;case ve.ERROR:if(void 0===t.channel){this.onFatalError(t);break}this.connectionManager.onChannelMessage(t,this);break;default:this.connectionManager.onChannelMessage(t,this)}}onConnect(t){if(this.isConnected=!0,!t.connectionDetails)throw new Error("Transport.onConnect(): Connect message recieved without connectionDetails");var e=t.connectionDetails.maxIdleInterval;e&&(this.maxIdleInterval=e+this.timeouts.realtimeRequestTimeout,this.onActivity())}onDisconnect(t){var e=t&&t.error;this.finish("disconnected",e)}onFatalError(t){var e=t&&t.error;this.finish("failed",e)}onClose(t){var e=t&&t.error;this.finish("closed",e)}requestClose(){this.send(sn)}requestDisconnect(){this.send(an)}ping(t){var e={action:ve.HEARTBEAT};t&&(e.id=t),this.send($e(e))}dispose(){this.isDisposed=!0,this.off()}onActivity(){this.maxIdleInterval&&(this.lastActivity=this.connectionManager.lastActivity=Date.now(),this.setIdleTimer(this.maxIdleInterval+100))}setIdleTimer(t){this.idleTimer||(this.idleTimer=setTimeout(()=>{this.onIdleTimerExpire()},t))}onIdleTimerExpire(){if(!this.lastActivity||!this.maxIdleInterval)throw new Error("Transport.onIdleTimerExpire(): lastActivity/maxIdleInterval not set");this.idleTimer=null;var t=Date.now()-this.lastActivity,e=this.maxIdleInterval-t;if(e<=0){var n="No activity seen from realtime in "+t+"ms; assuming connection has dropped";B.logAction(this.logger,B.LOG_ERROR,"Transport.onIdleTimerExpire()",n),this.disconnect(new z(n,80003,408))}else this.setIdleTimer(e+100)}static tryConnect(t,e,n,i,r){var s,a=new t(e,n,i),o=function(t){clearTimeout(s),r({event:this.event,error:t})},l=e.options.timeouts.realtimeRequestTimeout;return s=setTimeout(()=>{a.off(["preconnect","disconnected","failed"]),a.dispose(),o.call({event:"disconnected"},new z("Timeout waiting for transport to indicate itself viable",5e4,500))},l),a.on(["failed","disconnected"],o),a.on("preconnect",function(){clearTimeout(s),a.off(["failed","disconnected"],o),r(null,a)}),a.connect(),a}static isAvailable(){throw new z("isAvailable not implemented for transport",5e4,500)}};(nn=en||(en={})).WebSocket="web_socket",nn.Comet="comet",nn.XhrPolling="xhr_polling";var ln="undefined"!=typeof global?global:"undefined"!=typeof window?window:self,hn=()=>{var t;return void 0!==I.WebStorage&&(null==(t=I.WebStorage)?void 0:t.localSupported)},cn=()=>{var t;return void 0!==I.WebStorage&&(null==(t=I.WebStorage)?void 0:t.sessionSupported)},dn=function(){},un="ably-transport-preference";function vn(t){try{return JSON.parse(t)}catch(t){return null}}var fn=class{constructor(t,e,n,i){this.options=t,this.host=e,this.mode=n,this.connectionKey=i,this.format=t.useBinaryProtocol?"msgpack":"json"}getConnectParams(t){var e=t?L(t):{},n=this.options;switch(this.mode){case"resume":e.resume=this.connectionKey;break;case"recover":var i=vn(n.recover);i&&(e.recover=i.connectionKey)}return void 0!==n.clientId&&(e.clientId=n.clientId),!1===n.echoMessages&&(e.echo="false"),void 0!==this.format&&(e.format=this.format),void 0!==this.stream&&(e.stream=this.stream),void 0!==this.heartbeats&&(e.heartbeats=this.heartbeats),e.v=Qt.protocolVersion,e.agent=Wt(this.options),void 0!==n.transportParams&&q(e,n.transportParams),e}toString(){var t="[mode="+this.mode;return this.host&&(t+=",host="+this.host),this.connectionKey&&(t+=",connectionKey="+this.connectionKey),this.format&&(t+=",format="+this.format),t+="]"}},pn=class t extends ue{constructor(t,e){super(t.logger),this.supportedTransports={},this.disconnectedRetryCount=0,this.pendingChannelMessagesState={isProcessing:!1,queue:[]},this.realtime=t,this.initTransports(),this.options=e;var n=e.timeouts,i=n.webSocketConnectTimeout+n.realtimeRequestTimeout;if(this.states={initialized:{state:"initialized",terminal:!1,queueEvents:!0,sendEvents:!1,failState:"disconnected"},connecting:{state:"connecting",terminal:!1,queueEvents:!0,sendEvents:!1,retryDelay:i,failState:"disconnected"},connected:{state:"connected",terminal:!1,queueEvents:!1,sendEvents:!0,failState:"disconnected"},disconnected:{state:"disconnected",terminal:!1,queueEvents:!0,sendEvents:!1,retryDelay:n.disconnectedRetryTimeout,failState:"disconnected"},suspended:{state:"suspended",terminal:!1,queueEvents:!1,sendEvents:!1,retryDelay:n.suspendedRetryTimeout,failState:"suspended"},closing:{state:"closing",terminal:!1,queueEvents:!1,sendEvents:!1,retryDelay:n.realtimeRequestTimeout,failState:"closed"},closed:{state:"closed",terminal:!0,queueEvents:!1,sendEvents:!1,failState:"closed"},failed:{state:"failed",terminal:!0,queueEvents:!1,sendEvents:!1,failState:"failed"}},this.state=this.states.initialized,this.errorReason=null,this.queuedMessages=new Qe(this.logger),this.msgSerial=0,this.connectionDetails=void 0,this.connectionId=void 0,this.connectionKey=void 0,this.connectionStateTtl=n.connectionStateTtl,this.maxIdleInterval=null,this.transports=X(e.transports||Qt.defaultTransports,this.supportedTransports),this.transportPreference=null,this.transports.includes(en.WebSocket)&&(this.webSocketTransportAvailable=!0),this.transports.includes(en.XhrPolling)?this.baseTransport=en.XhrPolling:this.transports.includes(en.Comet)&&(this.baseTransport=en.Comet),this.domains=Qt.getHosts(e),this.activeProtocol=null,this.host=null,this.lastAutoReconnectAttempt=null,this.lastActivity=null,this.forceFallbackHost=!1,this.connectCounter=0,this.wsCheckResult=null,this.webSocketSlowTimer=null,this.webSocketGiveUpTimer=null,this.abandonedWebSocket=!1,!this.transports.length){var r="no requested transports available";throw B.logAction(this.logger,B.LOG_ERROR,"realtime.ConnectionManager()",r),new Error(r)}var s=I.Config.addEventListener;s&&(cn()&&"function"==typeof e.recover&&s("beforeunload",this.persistConnection.bind(this)),!0===e.closeOnUnload&&s("beforeunload",()=>{this.requestState({state:"closing"})}),s("online",()=>{var t;this.state==this.states.disconnected||this.state==this.states.suspended?this.requestState({state:"connecting"}):this.state==this.states.connecting&&(null==(t=this.pendingTransport)||t.off(),this.disconnectAllTransports(),this.startConnect())}),s("offline",()=>{this.state==this.states.connected&&this.disconnectAllTransports()}))}static supportedTransports(t){var e={supportedTransports:{}};return this.initTransports(t,e),e.supportedTransports}static initTransports(t,e){var n=_(_({},I.Transports.bundledImplementations),t);[en.WebSocket,...I.Transports.order].forEach(t=>{var i=n[t];i&&i.isAvailable()&&(e.supportedTransports[t]=i)})}initTransports(){t.initTransports(this.realtime.G,this)}createTransportParams(t,e){return new fn(this.options,t,e,this.connectionKey)}getTransportParams(t){(t=>{if(this.connectionKey)t("resume");else if("string"!=typeof this.options.recover){var e=this.options.recover,n=this.getSessionRecoverData();this.sessionRecoveryName(),n&&"function"==typeof e?e(n,e=>{e?(this.options.recover=n.recoveryKey,t("recover")):t("clean")}):t("clean")}else t("recover")})(e=>{var n=this.createTransportParams(null,e);if("recover"===e){var i=vn(this.options.recover);i&&(this.msgSerial=i.msgSerial)}t(n)})}tryATransport(t,e,n){this.proposedTransport=on.tryConnect(this.supportedTransports[e],this,this.realtime.auth,t,(i,r)=>{var s,a=this.state;if(a==this.states.closing||a==this.states.closed||a==this.states.failed)return r&&r.close(),void n(!0);i?!oe.isTokenErr(i.error)||this.errorReason&&oe.isTokenErr(this.errorReason)?"failed"===i.event?(this.notifyState({state:"failed",error:i.error}),n(!0)):"disconnected"===i.event&&(!(s=i.error).statusCode||!s.code||s.statusCode>=500||Object.values(tn).includes(s.code)?n(!1):(this.notifyState({state:this.states.connecting.failState,error:i.error}),n(!0))):(this.errorReason=i.error,yt(this.realtime.auth.o(null,null),i=>{i?this.actOnErrorFromAuthorize(i):this.tryATransport(t,e,n)})):(this.setTransportPending(r,t),n(null,r))})}setTransportPending(t,e){var n=e.mode;this.pendingTransport=t,this.cancelWebSocketSlowTimer(),this.cancelWebSocketGiveUpTimer(),t.once("connected",(e,i,r)=>{this.activateTransport(e,t,i,r),"recover"===n&&this.options.recover&&(delete this.options.recover,this.unpersistConnection())});var i=this;t.on(["disconnected","closed","failed"],function(e){i.deactivateTransport(t,this.event,e)}),this.emit("transport.pending",t)}activateTransport(t,e,n,i){t&&B.logAction(this.logger,B.LOG_ERROR,"ConnectionManager.activateTransport()","error = "+t),this.persistTransportPreference(e);var r=this.state,s=this.states.connected.state;if(r.state==this.states.closing.state||r.state==this.states.closed.state||r.state==this.states.failed.state)return e.disconnect(),!1;if(delete this.pendingTransport,!e.isConnected)return!1;var a=this.activeProtocol;this.activeProtocol=new Xe(e),this.host=e.params.host;var o=i.connectionKey;if(o&&this.connectionKey!=o&&this.setConnection(n,i,!!t),this.onConnectionDetailsUpdate(i,e),I.Config.nextTick(()=>{e.on("connected",(t,n,i)=>{this.onConnectionDetailsUpdate(i,e),this.emit("update",new Ze(s,s,null,t))})}),r.state===this.states.connected.state?t&&(this.errorReason=this.realtime.connection.errorReason=t,this.emit("update",new Ze(s,s,null,t))):(this.notifyState({state:"connected",error:t}),this.errorReason=this.realtime.connection.errorReason=t||null),this.emit("transport.active",e),a)if(a.messageQueue.count()>0&&B.logAction(this.logger,B.LOG_ERROR,"ConnectionManager.activateTransport()","Previous active protocol (for transport "+a.transport.shortName+", new one is "+e.shortName+") finishing with "+a.messageQueue.count()+" messages still pending"),a.transport===e){var l="Assumption violated: activating a transport that was also the transport for the previous active protocol; transport = "+e.shortName+"; stack = "+(new Error).stack;B.logAction(this.logger,B.LOG_ERROR,"ConnectionManager.activateTransport()",l)}else a.finish();return!0}deactivateTransport(t,e,n){var i=this.activeProtocol,r=i&&i.getTransport()===t,s=t===this.pendingTransport,a=this.noTransportsScheduledForActivation();if(n&&n.message,r&&(this.queuePendingMessages(i.getPendingMessages()),i.clearPendingMessages(),this.activeProtocol=this.host=null),this.emit("transport.inactive",t),r&&a||r&&"failed"===e||"closed"===e||null===i&&s){if("disconnected"===e&&n&&n.statusCode>500&&this.domains.length>1)return this.unpersistTransportPreference(),this.forceFallbackHost=!0,void this.notifyState({state:e,error:n,retryImmediately:!0});var o="failed"===e&&oe.isTokenErr(n)?"disconnected":e;this.notifyState({state:o,error:n})}else;}noTransportsScheduledForActivation(){return!this.pendingTransport||!this.pendingTransport.isConnected}setConnection(t,e,n){var i=this.connectionId;(i&&i!==t||!i&&n)&&(this.msgSerial=0,this.queuedMessages.resetSendAttempted()),this.connectionId,this.realtime.connection.id=this.connectionId=t,this.realtime.connection.key=this.connectionKey=e.connectionKey}clearConnection(){this.realtime.connection.id=this.connectionId=void 0,this.realtime.connection.key=this.connectionKey=void 0,this.msgSerial=0,this.unpersistConnection()}createRecoveryKey(){return this.connectionKey?JSON.stringify({connectionKey:this.connectionKey,msgSerial:this.msgSerial,channelSerials:this.realtime.channels.channelSerials()}):null}checkConnectionStateFreshness(){this.lastActivity&&this.connectionId&&(Date.now()-this.lastActivity>this.connectionStateTtl+this.maxIdleInterval&&(this.clearConnection(),this.states.connecting.failState="suspended"))}persistConnection(){if(cn()){var t=this.createRecoveryKey();t&&this.setSessionRecoverData({recoveryKey:t,disconnectedAt:Date.now(),location:ln.location,clientId:this.realtime.auth.clientId})}}unpersistConnection(){this.clearSessionRecoverData()}getActiveTransportFormat(){var t;return null==(t=this.activeProtocol)?void 0:t.getTransport().format}getError(){if(this.errorReason){var t=H.fromValues(this.errorReason);return t.cause=this.errorReason,t}return this.getStateError()}getStateError(){var t,e;return null==(e=(t=rn)[this.state.state])?void 0:e.call(t)}activeState(){return this.state.queueEvents||this.state.sendEvents}enactStateChange(t){var e=t.current+(t.reason?"; reason: "+t.reason:"");"failed"===t.current&&B.logAction(this.logger,B.LOG_ERROR,"Connection state",e);var n=this.state=this.states[t.current];t.reason&&(this.errorReason=t.reason,this.realtime.connection.errorReason=t.reason),(n.terminal||"suspended"===n.state)&&this.clearConnection(),this.emit("connectionstate",t)}startTransitionTimer(t){this.transitionTimer&&clearTimeout(this.transitionTimer),this.transitionTimer=setTimeout(()=>{this.transitionTimer&&(this.transitionTimer=null,this.notifyState({state:t.failState}))},t.retryDelay)}cancelTransitionTimer(){this.transitionTimer&&(clearTimeout(this.transitionTimer),this.transitionTimer=null)}startSuspendTimer(){this.suspendTimer||(this.suspendTimer=setTimeout(()=>{this.suspendTimer&&(this.suspendTimer=null,this.states.connecting.failState="suspended",this.notifyState({state:"suspended"}))},this.connectionStateTtl))}checkSuspendTimer(t){"disconnected"!==t&&"suspended"!==t&&"connecting"!==t&&this.cancelSuspendTimer()}cancelSuspendTimer(){this.states.connecting.failState="disconnected",this.suspendTimer&&(clearTimeout(this.suspendTimer),this.suspendTimer=null)}startRetryTimer(t){this.retryTimer=setTimeout(()=>{this.retryTimer=null,this.requestState({state:"connecting"})},t)}cancelRetryTimer(){this.retryTimer&&(clearTimeout(this.retryTimer),this.retryTimer=null)}startWebSocketSlowTimer(){this.webSocketSlowTimer=setTimeout(()=>{this.checkWsConnectivity().then(()=>{this.wsCheckResult=!0}).catch(()=>{this.wsCheckResult=!1}),this.realtime.http.checkConnectivity&&yt(this.realtime.http.checkConnectivity(),(t,e)=>{!t&&e||(this.cancelWebSocketGiveUpTimer(),this.notifyState({state:"disconnected",error:new z("Unable to connect (network unreachable)",80003,404)}))})},this.options.timeouts.webSocketSlowTimeout)}cancelWebSocketSlowTimer(){this.webSocketSlowTimer&&(clearTimeout(this.webSocketSlowTimer),this.webSocketSlowTimer=null)}startWebSocketGiveUpTimer(t){this.webSocketGiveUpTimer=setTimeout(()=>{var e,n;this.wsCheckResult||this.baseTransport&&(this.abandonedWebSocket=!0,null==(e=this.proposedTransport)||e.dispose(),null==(n=this.pendingTransport)||n.dispose(),this.connectBase(t,++this.connectCounter))},this.options.timeouts.webSocketConnectTimeout)}cancelWebSocketGiveUpTimer(){this.webSocketGiveUpTimer&&(clearTimeout(this.webSocketGiveUpTimer),this.webSocketGiveUpTimer=null)}notifyState(t){var e,n,i=t.state,r="disconnected"===i&&(this.state===this.states.connected||t.retryImmediately||this.state===this.states.connecting&&t.error&&oe.isTokenErr(t.error)&&!(this.errorReason&&oe.isTokenErr(this.errorReason)));if(i!=this.state.state&&(this.cancelTransitionTimer(),this.cancelRetryTimer(),this.cancelWebSocketSlowTimer(),this.cancelWebSocketGiveUpTimer(),this.checkSuspendTimer(t.state),"suspended"!==i&&"connected"!==i||(this.disconnectedRetryCount=0),!this.state.terminal)){var s=this.states[t.state],a=s.retryDelay;"disconnected"===s.state&&(this.disconnectedRetryCount++,a=St(s.retryDelay,this.disconnectedRetryCount));var o=new Ze(this.state.state,s.state,a,t.error||(null==(n=(e=rn)[s.state])?void 0:n.call(e)));if(r){var l=()=>{this.state===this.states.disconnected&&(this.lastAutoReconnectAttempt=Date.now(),this.requestState({state:"connecting"}))},h=this.lastAutoReconnectAttempt&&Date.now()-this.lastAutoReconnectAttempt+1;h&&h<1e3?setTimeout(l,1e3-h):I.Config.nextTick(l)}else"disconnected"!==i&&"suspended"!==i||this.startRetryTimer(a);("disconnected"===i&&!r||"suspended"===i||s.terminal)&&I.Config.nextTick(()=>{this.disconnectAllTransports()}),"connected"!=i||this.activeProtocol||B.logAction(this.logger,B.LOG_ERROR,"ConnectionManager.notifyState()","Broken invariant: attempted to go into connected state, but there is no active protocol"),this.enactStateChange(o),this.state.sendEvents?this.sendQueuedMessages():this.state.queueEvents||(this.realtime.channels.propogateConnectionInterruption(i,o.reason),this.failQueuedMessages(o.reason))}}requestState(t){var e,n,i=t.state;if(i!=this.state.state&&(this.cancelWebSocketSlowTimer(),this.cancelWebSocketGiveUpTimer(),this.cancelTransitionTimer(),this.cancelRetryTimer(),this.checkSuspendTimer(i),!("connecting"==i&&"connected"==this.state.state||"closing"==i&&"closed"==this.state.state))){var r=this.states[i],s=new Ze(this.state.state,r.state,null,t.error||(null==(n=(e=rn)[r.state])?void 0:n.call(e)));this.enactStateChange(s),"connecting"==i&&I.Config.nextTick(()=>{this.startConnect()}),"closing"==i&&this.closeImpl()}}startConnect(){if(this.state===this.states.connecting){var t=this.realtime.auth,e=++this.connectCounter,n=()=>{this.checkConnectionStateFreshness(),this.getTransportParams(t=>{if("recover"===t.mode&&t.options.recover){var n=vn(t.options.recover);n&&this.realtime.channels.recoverChannels(n.channelSerials)}e===this.connectCounter&&this.connectImpl(t,e)})};if(this.startSuspendTimer(),this.startTransitionTimer(this.states.connecting),"basic"===t.method)n();else{var i=t=>{e===this.connectCounter&&(t?this.actOnErrorFromAuthorize(t):n())};this.errorReason&&oe.isTokenErr(this.errorReason)?yt(t.o(null,null),i):yt(t.l(!1),i)}}}connectImpl(t,e){if(this.state.state===this.states.connecting.state){var n=this.getTransportPreference();n&&n===this.baseTransport&&this.webSocketTransportAvailable&&this.checkWsConnectivity().then(()=>{this.unpersistTransportPreference(),this.state===this.states.connecting&&(this.disconnectAllTransports(),this.connectWs(t,++this.connectCounter))}).catch(dn),n&&n===this.baseTransport||this.baseTransport&&!this.webSocketTransportAvailable?this.connectBase(t,e):this.connectWs(t,e)}}connectWs(t,e){this.wsCheckResult=null,this.abandonedWebSocket=!1,this.startWebSocketSlowTimer(),this.startWebSocketGiveUpTimer(t),this.tryTransportWithFallbacks("web_socket",t,!0,e,()=>!1!==this.wsCheckResult&&!this.abandonedWebSocket)}connectBase(t,e){this.baseTransport?this.tryTransportWithFallbacks(this.baseTransport,t,!1,e,()=>!0):this.notifyState({state:"disconnected",error:new z("No transports left to try",8e4,404)})}tryTransportWithFallbacks(t,e,n,i,r){var s=t=>{this.notifyState({state:this.states.connecting.failState,error:t})},a=this.domains.slice(),o=(t,e)=>{i===this.connectCounter&&(r()?e||t||h():e&&e.dispose())},l=a.shift();if(l){e.host=l;var h=()=>{a.length?this.realtime.http.checkConnectivity?yt(this.realtime.http.checkConnectivity(),(n,l)=>{i===this.connectCounter&&r()&&(n?s(n):l?(e.host=lt(a),this.tryATransport(e,t,o)):s(new z("Unable to connect (network unreachable)",80003,404)))}):s(new H("Internal error: Http.checkConnectivity not set",null,500)):s(new z("Unable to connect (and no more fallback hosts to try)",80003,404))};if(this.forceFallbackHost&&a.length)return this.forceFallbackHost=!1,void h();this.tryATransport(e,t,o)}else s(new z("Unable to connect (no available host)",80003,404))}closeImpl(){this.cancelSuspendTimer(),this.startTransitionTimer(this.states.closing),this.pendingTransport&&this.pendingTransport.close(),this.activeProtocol&&this.activeProtocol.getTransport().close(),this.notifyState({state:"closed"})}onAuthUpdated(t,e){var n;switch(this.state.state){case"connected":var i=null==(n=this.activeProtocol)?void 0:n.getTransport();i&&i.onAuthUpdated&&i.onAuthUpdated(t);var r=$e({action:ve.AUTH,auth:{accessToken:t.token}});this.send(r);var s=()=>{this.off(a),e(null,t)},a=t=>{"failed"===t.current&&(this.off(s),this.off(a),e(t.reason||this.getStateError()))};this.once("connectiondetails",s),this.on("connectionstate",a);break;case"connecting":this.disconnectAllTransports();default:var o=n=>{switch(n.current){case"connected":this.off(o),e(null,t);break;case"failed":case"closed":case"suspended":this.off(o),e(n.reason||this.getStateError())}};this.on("connectionstate",o),"connecting"===this.state.state?this.startConnect():this.requestState({state:"connecting"})}}disconnectAllTransports(){this.connectCounter++,this.pendingTransport&&this.pendingTransport.disconnect(),delete this.pendingTransport,this.proposedTransport&&this.proposedTransport.disconnect(),delete this.pendingTransport,this.activeProtocol&&this.activeProtocol.getTransport().disconnect()}send(t,e,n){n=n||dn;var i=this.state;if(i.sendEvents)this.sendImpl(new Ye(t,n));else if(e&&i.queueEvents)this.logger.shouldLog(B.LOG_MICRO),this.queue(t,n);else{var r="rejecting event, queueEvent was "+e+", state was "+i.state;n(this.errorReason||new z(r,9e4,400))}}sendImpl(t){var e=t.message;t.ackRequired&&!t.sendAttempted&&(e.msgSerial=this.msgSerial++);try{this.activeProtocol.send(t)}catch(t){B.logAction(this.logger,B.LOG_ERROR,"ConnectionManager.sendImpl()","Unexpected exception in transport.send(): "+t.stack)}}queue(t,e){this.queuedMessages.push(new Ye(t,e))}sendQueuedMessages(){for(var t;t=this.queuedMessages.shift();)this.sendImpl(t)}queuePendingMessages(t){t&&t.length&&this.queuedMessages.prepend(t)}failQueuedMessages(t){var e=this.queuedMessages.count();e>0&&(B.logAction(this.logger,B.LOG_ERROR,"ConnectionManager.failQueuedMessages()","failing "+e+" queued messages, err = "+vt(t)),this.queuedMessages.completeAllMessages(t))}onChannelMessage(t,e){this.pendingChannelMessagesState.queue.push({message:t,transport:e}),this.pendingChannelMessagesState.isProcessing||this.processNextPendingChannelMessage()}processNextPendingChannelMessage(){if(this.pendingChannelMessagesState.queue.length>0){this.pendingChannelMessagesState.isProcessing=!0;var t=this.pendingChannelMessagesState.queue.shift();this.processChannelMessage(t.message).catch(t=>{B.logAction(this.logger,B.LOG_ERROR,"ConnectionManager.processNextPendingChannelMessage() received error ",t)}).finally(()=>{this.pendingChannelMessagesState.isProcessing=!1,this.processNextPendingChannelMessage()})}}processChannelMessage(t){var e=this;return o(function*(){yield e.realtime.channels.processChannelMessage(t)})()}ping(){var t=this;return o(function*(){var e;if("connected"!==t.state.state)throw new z("Unable to ping service; not connected",4e4,400);var n=null==(e=t.activeProtocol)?void 0:e.getTransport();if(!n)throw t.getStateError();var i=Date.now(),r=gt();return Rt(new Promise(t=>{var e=s=>{s===r&&(n.off("heartbeat",e),t(Date.now()-i))};n.on("heartbeat",e),n.ping(r)}),t.options.timeouts.realtimeRequestTimeout,"Timeout waiting for heartbeat response")})()}abort(t){this.activeProtocol.getTransport().fail(t)}getTransportPreference(){var t,e;return this.transportPreference||hn()&&(null==(e=null==(t=I.WebStorage)?void 0:t.get)?void 0:e.call(t,un))}persistTransportPreference(t){var e,n;this.transportPreference=t.shortName,hn()&&(null==(n=null==(e=I.WebStorage)?void 0:e.set)||n.call(e,un,t.shortName))}unpersistTransportPreference(){var t,e;this.transportPreference=null,hn()&&(null==(e=null==(t=I.WebStorage)?void 0:t.remove)||e.call(t,un))}actOnErrorFromAuthorize(t){if(40171===t.code)this.notifyState({state:"failed",error:t});else if(40102===t.code)this.notifyState({state:"failed",error:t});else if(t.statusCode===ee.Forbidden){var e="Client configured authentication provider returned 403; failing the connection";B.logAction(this.logger,B.LOG_ERROR,"ConnectionManager.actOnErrorFromAuthorize()",e),this.notifyState({state:"failed",error:new z(e,80019,403,t)})}else{this.notifyState({state:this.state.failState,error:new z("Client configured authentication provider request failed",80019,401,t)})}}onConnectionDetailsUpdate(t,e){if(t){this.connectionDetails=t,t.maxMessageSize&&(this.options.maxMessageSize=t.maxMessageSize);var n=t.clientId;if(n){var i=this.realtime.auth.m(n);if(i)return B.logAction(this.logger,B.LOG_ERROR,"ConnectionManager.onConnectionDetailsUpdate()",i.message),void e.fail(i)}var r=t.connectionStateTtl;r&&(this.connectionStateTtl=r),this.maxIdleInterval=t.maxIdleInterval,this.emit("connectiondetails",t)}}checkWsConnectivity(){var t=this.options.wsConnectivityCheckUrl||Qt.wsConnectivityCheckUrl,e=new I.Config.WebSocket(t);return new Promise((t,n)=>{var i=!1;e.onopen=()=>{i||(i=!0,t(),e.close())},e.onclose=e.onerror=()=>{i||(i=!0,n())}})}sessionRecoveryName(){return this.options.recoveryKeyStorageName||"ably-connection-recovery"}getSessionRecoverData(){var t,e;return cn()&&(null==(e=null==(t=I.WebStorage)?void 0:t.getSession)?void 0:e.call(t,this.sessionRecoveryName()))}setSessionRecoverData(t){var e,n;return cn()&&(null==(n=null==(e=I.WebStorage)?void 0:e.setSession)?void 0:n.call(e,this.sessionRecoveryName(),t))}clearSessionRecoverData(){var t,e;return cn()&&(null==(e=null==(t=I.WebStorage)?void 0:t.removeSession)?void 0:e.call(t,this.sessionRecoveryName()))}},gn=class extends ue{constructor(t,e){super(t.logger),this.whenState=t=>ue.prototype.whenState.call(this,t,this.state),this.ably=t,this.connectionManager=new pn(t,e),this.state=this.connectionManager.state.state,this.key=void 0,this.id=void 0,this.errorReason=null,this.connectionManager.on("connectionstate",t=>{var e=this.state=t.current;I.Config.nextTick(()=>{this.emit(e,t)})}),this.connectionManager.on("update",t=>{I.Config.nextTick(()=>{this.emit("update",t)})})}connect(){this.connectionManager.requestState({state:"connecting"})}ping(){var t=this;return o(function*(){return t.connectionManager.ping()})()}close(){this.connectionManager.requestState({state:"closing"})}get recoveryKey(){return this.logger.deprecationWarning("The `Connection.recoveryKey` attribute has been replaced by the `Connection.createRecoveryKey()` method. Replace your usage of `recoveryKey` with the return value of `createRecoveryKey()`. `recoveryKey` will be removed in a future version."),this.createRecoveryKey()}createRecoveryKey(){return this.connectionManager.createRecoveryKey()}},mn=class t extends Pe{constructor(e){var n,i,r,s;if(super(Qt.objectifyOptions(e,!1,"BaseRealtime",B.defaultLogger)),"string"==typeof EdgeRuntime)throw new z('Ably.Realtime instance cannot be used in Vercel Edge runtime. If you are running Vercel Edge functions, please replace your "new Ably.Realtime()" with "new Ably.Rest()" and use Ably Rest API instead of the Realtime API. If you are server-rendering your application in the Vercel Edge runtime, please use the condition "if (typeof EdgeRuntime === \'string\')" to prevent instantiating Ably.Realtime instance during SSR in the Vercel Edge runtime.',4e4,400);this.G=t.transportImplementationsFromPlugins(this.options.plugins),this.B=null!=(i=null==(n=this.options.plugins)?void 0:n.RealtimePresence)?i:null,this.K=null!=(s=null==(r=this.options.plugins)?void 0:r.LiveObjects)?s:null,this.connection=new gn(this,this.options),this.Y=new yn(this),!1!==this.options.autoConnect&&this.connect()}static transportImplementationsFromPlugins(t){var e={};return(null==t?void 0:t.WebSocketTransport)&&(e[en.WebSocket]=t.WebSocketTransport),(null==t?void 0:t.XHRPolling)&&(e[en.XhrPolling]=t.XHRPolling),e}get channels(){return this.Y}get clientId(){return this.auth.clientId}connect(){this.connection.connect()}close(){this.connection.close()}};mn.EventEmitter=ue;var wn=mn,yn=class extends ue{constructor(t){super(t.logger),this.realtime=t,this.all=Object.create(null),t.connection.connectionManager.on("transport.active",()=>{this.onTransportActive()})}channelSerials(){var t={};for(var e of it(this.all,!0)){var n=this.all[e];n.properties.channelSerial&&(t[e]=n.properties.channelSerial)}return t}recoverChannels(t){for(var e of it(t,!0)){this.get(e).properties.channelSerial=t[e]}}processChannelMessage(t){var e=this;return o(function*(){var n=t.channel;if(void 0!==n){var i=e.all[n];i?yield i.processMessage(t):B.logAction(e.logger,B.LOG_ERROR,"Channels.processChannelMessage()","received event for non-existent channel: "+n)}else B.logAction(e.logger,B.LOG_ERROR,"Channels.processChannelMessage()","received event unspecified channel, action = "+t.action)})()}onTransportActive(){for(var t in this.all){var e=this.all[t];"attaching"===e.state||"detaching"===e.state?e.checkPendingState():"suspended"===e.state?e.W(!1,null):"attached"===e.state&&e.requestState("attaching")}}propogateConnectionInterruption(t,e){var n=["attaching","attached","detaching","suspended"],i={closing:"detached",closed:"detached",failed:"failed",suspended:"suspended"}[t];for(var r in this.all){var s=this.all[r];n.includes(s.state)&&s.notifyState(i,e)}}get(t,e){t=String(t);var n=this.all[t];if(n){if(e){if(n.V(e,n.channelOptions))throw new z("Channels.get() cannot be used to set channel options that would cause the channel to reattach. Please, use RealtimeChannel.setOptions() instead.",4e4,400);n.setOptions(e)}}else n=this.all[t]=new Fe(this.realtime,t,e);return n}getDerived(t,e,n){if(e.filter){var i=Mt(e.filter),r=Ot(t);t="[filter="+i+r.qualifierParam+"]"+r.channelName}return this.get(t,n)}release(t){t=String(t);var e=this.all[t];if(e){var n=e.getReleaseErr();if(n)throw n;delete this.all[t]}}},bn=wn,xn=Uint8Array,kn=Uint32Array,En=Math.pow,Tn=new kn(8),An=[],Sn=new kn(64);function Cn(t){return(t-(0|t))*En(2,32)|0}for(var _n,On,Mn=2,In=0;In<64;){for(_n=!0,On=2;On<=Mn/2;On++)Mn%On===0&&(_n=!1);_n&&(In<8&&(Tn[In]=Cn(En(Mn,.5))),An[In]=Cn(En(Mn,1/3)),In++),Mn++}var jn=!!new xn(new kn([1]).buffer)[0];function Pn(t){return jn?t>>>24|(t>>>16&255)<<8|(65280&t)<<8|t<<24:t}function Rn(t,e){return t>>>e|t<<32-e}function Dn(t){var e,n=Tn.slice(),i=t.length,r=8*i,s=512-(r+64)%512-1+r+65,a=new xn(s/8),o=new kn(a.buffer);a.set(t,0),a[i]=128,o[o.length-1]=Pn(r);for(var l=0;l<s/32;l+=16){var h=n.slice();for(e=0;e<64;e++){var c;if(e<16)c=Pn(o[l+e]);else{var d=Sn[e-15],u=Sn[e-2];c=Sn[e-7]+Sn[e-16]+(Rn(d,7)^Rn(d,18)^d>>>3)+(Rn(u,17)^Rn(u,19)^u>>>10)}Sn[e]=c|=0;for(var v=(Rn(h[4],6)^Rn(h[4],11)^Rn(h[4],25))+(h[4]&h[5]^~h[4]&h[6])+h[7]+c+An[e],f=(Rn(h[0],2)^Rn(h[0],13)^Rn(h[0],22))+(h[0]&h[1]^h[2]&(h[0]^h[1])),p=7;p>0;p--)h[p]=h[p-1];h[0]=v+f|0,h[4]=h[4]+v|0}for(e=0;e<8;e++)n[e]=n[e]+h[e]|0}return new xn(new kn(n.map(function(t){return Pn(t)})).buffer)}var Bn,Nn=new class{constructor(){this.base64CharSet="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",this.hexCharSet="0123456789abcdef"}uint8ViewToBase64(t){for(var e,n,i,r,s="",a=this.base64CharSet,o=t.byteLength,l=o%3,h=o-l,c=0;c<h;c+=3)e=(258048&(r=t[c]<<16|t[c+1]<<8|t[c+2]))>>12,n=(4032&r)>>6,i=63&r,s+=a[(16515072&r)>>18]+a[e]+a[n]+a[i];return 1==l?(e=(3&(r=t[h]))<<4,s+=a[(252&r)>>2]+a[e]+"=="):2==l&&(e=(1008&(r=t[h]<<8|t[h+1]))>>4,n=(15&r)<<2,s+=a[(64512&r)>>10]+a[e]+a[n]+"="),s}base64ToArrayBuffer(t){for(var e=null==atob?void 0:atob(t),n=e.length,i=new Uint8Array(n),r=0;r<n;r++){var s=e.charCodeAt(r);i[r]=s}return this.toArrayBuffer(i)}isBuffer(t){return t instanceof ArrayBuffer||ArrayBuffer.isView(t)}toBuffer(t){if(!ArrayBuffer)throw new Error("Can't convert to Buffer: browser does not support the necessary types");if(t instanceof ArrayBuffer)return new Uint8Array(t);if(ArrayBuffer.isView(t))return new Uint8Array(this.toArrayBuffer(t));throw new Error("BufferUtils.toBuffer expected an ArrayBuffer or a view onto one")}toArrayBuffer(t){if(!ArrayBuffer)throw new Error("Can't convert to ArrayBuffer: browser does not support the necessary types");if(t instanceof ArrayBuffer)return t;if(ArrayBuffer.isView(t))return t.buffer.slice(t.byteOffset,t.byteOffset+t.byteLength);throw new Error("BufferUtils.toArrayBuffer expected an ArrayBuffer or a view onto one")}base64Encode(t){return this.uint8ViewToBase64(this.toBuffer(t))}base64UrlEncode(t){return this.base64Encode(t).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")}base64Decode(t){if(ArrayBuffer&&I.Config.atob)return this.base64ToArrayBuffer(t);throw new Error("Expected ArrayBuffer to exist and Platform.Config.atob to be configured")}hexEncode(t){return this.toBuffer(t).reduce((t,e)=>t+e.toString(16).padStart(2,"0"),"")}hexDecode(t){if(t.length%2!=0)throw new Error("Can't create a byte array from a hex string of odd length");for(var e=new Uint8Array(t.length/2),n=0;n<e.length;n++)e[n]=parseInt(t.slice(2*n,2*(n+1)),16);return this.toArrayBuffer(e)}utf8Encode(t){if(I.Config.TextEncoder){var e=(new I.Config.TextEncoder).encode(t);return this.toArrayBuffer(e)}throw new Error("Expected TextEncoder to be configured")}utf8Decode(t){if(!this.isBuffer(t))throw new Error("Expected input of utf8decode to be an arraybuffer or typed array");if(TextDecoder)return(new TextDecoder).decode(t);throw new Error("Expected TextDecoder to be configured")}areBuffersEqual(t,e){if(!t||!e)return!1;var n=this.toArrayBuffer(t),i=this.toArrayBuffer(e);if(n.byteLength!=i.byteLength)return!1;for(var r=new Uint8Array(n),s=new Uint8Array(i),a=0;a<r.length;a++)if(r[a]!=s[a])return!1;return!0}byteLength(t){return t instanceof ArrayBuffer||ArrayBuffer.isView(t)?t.byteLength:-1}arrayBufferViewToBuffer(t){return this.toArrayBuffer(t)}concat(t){var e=t.reduce((t,e)=>t+e.byteLength,0),n=new Uint8Array(e),i=0;for(var r of t){var s=this.toBuffer(r);n.set(s,i),i+=s.byteLength}return n.buffer}sha256(t){var e=Dn(this.toBuffer(t));return this.toArrayBuffer(e)}hmacSha256(t,e){var n=function(t,e){if(t.length>64&&(t=Dn(t)),t.length<64){var n=new Uint8Array(64);n.set(t,0),t=n}for(var i=new Uint8Array(64),r=new Uint8Array(64),s=0;s<64;s++)i[s]=54^t[s],r[s]=92^t[s];var a=new Uint8Array(e.length+64);a.set(i,0),a.set(e,64);var o=new Uint8Array(96);return o.set(r,0),o.set(Dn(a),64),Dn(o)}(this.toBuffer(e),this.toBuffer(t));return this.toArrayBuffer(n)}},Un=(t=>(t[t.REQ_SEND=0]="REQ_SEND",t[t.REQ_RECV=1]="REQ_RECV",t[t.REQ_RECV_POLL=2]="REQ_RECV_POLL",t[t.REQ_RECV_STREAM=3]="REQ_RECV_STREAM",t))(Un||{}),zn=Un;function Hn(){return new z("No HTTP request plugin provided. Provide at least one of the FetchRequest or XHRRequest plugins.",400,4e4)}var qn=(Bn=class{constructor(t){var e;this.checksInProgress=null,this.checkConnectivity=void 0,this.supportsAuthHeaders=!1,this.supportsLinkHeaders=!1,this.client=null!=t?t:null;var n=(null==t?void 0:t.options.connectivityCheckUrl)||Qt.connectivityCheckUrl,i=null!=(e=null==t?void 0:t.options.connectivityCheckParams)?e:null,r=!(null==t?void 0:t.options.connectivityCheckUrl),s=_(_({},qn.bundledRequestImplementations),null==t?void 0:t.A),a=s.XHRRequest,l=s.FetchRequest,h=!(!a&&!l);if(!h)throw Hn();I.Config.xhrSupported&&a?(this.supportsAuthHeaders=!0,this.Request=function(){var e=o(function*(e,n,i,r,s){return new Promise(o=>{var l,h=a.createRequest(n,i,r,s,zn.REQ_SEND,null!=(l=t&&t.options.timeouts)?l:null,this.logger,e);h.once("complete",(t,e,n,i,r)=>o({error:t,body:e,headers:n,unpacked:i,statusCode:r})),h.exec()})});return function(t,n,i,r,s){return e.apply(this,arguments)}}(),(null==t?void 0:t.options.disableConnectivityCheck)?this.checkConnectivity=o(function*(){return!0}):this.checkConnectivity=o(function*(){var t,e,s=yield this.doUri(Zt.Get,n,null,null,i);return r?!s.error&&"yes"==(null==(t=s.body)?void 0:t.replace(/\n/,"")):!s.error&&((e=s.statusCode)>=200&&e<400)})):I.Config.fetchSupported&&l?(this.supportsAuthHeaders=!0,this.Request=function(){var e=o(function*(e,n,i,r,s){return l(e,null!=t?t:null,n,i,r,s)});return function(t,n,i,r,s){return e.apply(this,arguments)}}(),(null==t?void 0:t.options.disableConnectivityCheck)?this.checkConnectivity=o(function*(){return!0}):this.checkConnectivity=o(function*(){var t,e=yield this.doUri(Zt.Get,n,null,null,null);return!e.error&&"yes"==(null==(t=e.body)?void 0:t.replace(/\n/,""))})):this.Request=o(function*(){return{error:h?new H("no supported HTTP transports available",null,400):Hn()}})}get logger(){var t,e;return null!=(e=null==(t=this.client)?void 0:t.logger)?e:B.defaultLogger}doUri(t,e,n,i,r){var s=this;return o(function*(){return s.Request?s.Request(t,e,n,r,i):{error:new H("Request invoked before assigned to",null,500)}})()}shouldFallback(t){var e=t.statusCode;return 408===e&&!t.code||400===e&&!t.code||e>=500&&e<=504}},Bn.methods=[Zt.Get,Zt.Delete,Zt.Post,Zt.Put,Zt.Patch],Bn.methodsWithoutBody=[Zt.Get,Zt.Delete],Bn.methodsWithBody=[Zt.Post,Zt.Put,Zt.Patch],Bn),Ln=qn,Fn="ablyjs-storage-test",Vn="undefined"!=typeof global?global:"undefined"!=typeof window?window:self,Wn=new class{constructor(){try{Vn.sessionStorage.setItem(Fn,Fn),Vn.sessionStorage.removeItem(Fn),this.sessionSupported=!0}catch(t){this.sessionSupported=!1}try{Vn.localStorage.setItem(Fn,Fn),Vn.localStorage.removeItem(Fn),this.localSupported=!0}catch(t){this.localSupported=!1}}get(t){return this.X(t,!1)}getSession(t){return this.X(t,!0)}remove(t){return this.Z(t,!1)}removeSession(t){return this.Z(t,!0)}set(t,e,n){return this.tt(t,e,n,!1)}setSession(t,e,n){return this.tt(t,e,n,!0)}tt(t,e,n,i){var r={value:e};return n&&(r.expires=Date.now()+n),this.storageInterface(i).setItem(t,JSON.stringify(r))}X(t,e){if(e&&!this.sessionSupported)throw new Error("Session Storage not supported");if(!e&&!this.localSupported)throw new Error("Local Storage not supported");var n=this.storageInterface(e).getItem(t);if(!n)return null;var i=JSON.parse(n);return i.expires&&i.expires<Date.now()?(this.storageInterface(e).removeItem(t),null):i.value}Z(t,e){return this.storageInterface(e).removeItem(t)}storageInterface(t){return t?Vn.sessionStorage:Vn.localStorage}},Jn=Ct(),$n="string"==typeof EdgeRuntime;"undefined"!=typeof Window||"undefined"!=typeof WorkerGlobalScope||$n||console.log("Warning: this distribution of Ably is intended for browsers. On nodejs, please use the 'ably' package on npm");var Kn,Gn,Qn={agent:"browser",logTimestamps:!0,userAgent:Jn.navigator&&Jn.navigator.userAgent.toString(),currentUrl:Jn.location&&Jn.location.href,binaryType:"arraybuffer",WebSocket:Jn.WebSocket,fetchSupported:!!Jn.fetch,xhrSupported:Jn.XMLHttpRequest&&"withCredentials"in new XMLHttpRequest,allowComet:(Gn=Jn.location,!Jn.WebSocket||!Gn||!Gn.origin||Gn.origin.indexOf("http")>-1),useProtocolHeartbeats:!0,supportsBinary:!!Jn.TextDecoder,preferBinary:!1,ArrayBuffer:Jn.ArrayBuffer,atob:Jn.atob,nextTick:"function"==typeof Jn.queueMicrotask?t=>Jn.queueMicrotask(t):t=>Promise.resolve().then(t),addEventListener:Jn.addEventListener,inspect:JSON.stringify,stringByteSize:function(t){return Jn.TextDecoder&&(new Jn.TextEncoder).encode(t).length||t.length},TextEncoder:Jn.TextEncoder,TextDecoder:Jn.TextDecoder,getRandomArrayBuffer:(Kn=o(function*(t){var e=new Uint8Array(t);return Jn.crypto.getRandomValues(e),e.buffer}),function(t){return Kn.apply(this,arguments)}),isWebworker:"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope,push:{platform:"browser",formFactor:"desktop",storage:Wn}},Yn=Qn;en.XhrPolling;var Xn=en.WebSocket;var Zn=class extends on{constructor(t,e,n){super(t,e,n),this.shortName=Xn,n.heartbeats=I.Config.useProtocolHeartbeats,this.wsHost=n.host}static isAvailable(){return!!I.Config.WebSocket}createWebSocket(t,e){return this.uri=t+ht(e),new I.Config.WebSocket(this.uri)}toString(){return"WebSocketTransport; uri="+this.uri}connect(){on.prototype.connect.call(this);var t=this,e=this.params,n=e.options,i=(n.tls?"wss://":"ws://")+this.wsHost+":"+Qt.getPort(n)+"/";yt(this.auth.getAuthParams(),function(n,r){if(!t.isDisposed){for(var s in r)" "+s+": "+r[s]+";";if(n)t.disconnect(n);else{var a=e.getConnectParams(r);try{var o=t.wsConnection=t.createWebSocket(i,a);o.binaryType=I.Config.binaryType,o.onopen=function(){t.onWsOpen()},o.onclose=function(e){t.onWsClose(e)},o.onmessage=function(e){t.onWsData(e.data)},o.onerror=function(e){t.onWsError(e)},o.on&&o.on("ping",function(){t.onActivity()})}catch(e){B.logAction(t.logger,B.LOG_ERROR,"WebSocketTransport.connect()","Unexpected exception creating websocket: err = "+(e.stack||e.message)),t.disconnect(e)}}}})}send(t){var e=this.wsConnection;if(e)try{e.send(Ve(t,this.connectionManager.realtime.S,this.params.format))}catch(t){var n="Exception from ws connection when trying to send: "+vt(t);B.logAction(this.logger,B.LOG_ERROR,"WebSocketTransport.send()",n),this.finish("disconnected",new z(n,5e4,500))}else B.logAction(this.logger,B.LOG_ERROR,"WebSocketTransport.send()","No socket connection")}onWsData(t){try{this.onProtocolMessage(Je(t,this.connectionManager.realtime.S,this.connectionManager.realtime.B,this.connectionManager.realtime.M,this.connectionManager.realtime.K,this.format))}catch(t){B.logAction(this.logger,B.LOG_ERROR,"WebSocketTransport.onWsData()","Unexpected exception handing channel message: "+t.stack)}}onWsOpen(){this.emit("preconnect")}onWsClose(t){var e,n;if("object"==typeof t?(n=t.code,e=t.wasClean||1e3===n):e=1e3==(n=t),delete this.wsConnection,e){var i=new z("Websocket closed",80003,400);this.finish("disconnected",i)}else{var r=new z("Unclean disconnection of WebSocket ; code = "+n,80003,400);this.finish("disconnected",r)}this.emit("disposed")}onWsError(t){I.Config.nextTick(()=>{this.disconnect(Error(t.message))})}dispose(){this.isDisposed=!0;var t=this.wsConnection;t&&(t.onmessage=function(){},delete this.wsConnection,I.Config.nextTick(()=>{if(!t)throw new Error("WebSocketTransport.dispose(): wsConnection is not defined");t.close()}))}},ti={order:["xhr_polling"],bundledImplementations:{}},ei={connectivityCheckUrl:"https://internet-up.ably-realtime.com/is-the-internet-up.txt",wsConnectivityCheckUrl:"wss://ws-up.ably-realtime.com",defaultTransports:[en.XhrPolling,en.WebSocket]};function ni(t,e,n,i,r,s){return ii.apply(this,arguments)}function ii(){return(ii=o(function*(t,e,n,i,r,s){var a,l=new Headers(i||{}),h=t?t.toUpperCase():J(s)?"GET":"POST",c=new AbortController,d=new Promise(t=>{a=setTimeout(()=>{c.abort(),t({error:new H("Request timed out",null,408)})},e?e.options.timeouts.httpRequestTimeout:Qt.TIMEOUTS.httpRequestTimeout)}),u={method:h,headers:l,body:s,signal:c.signal};I.Config.isWebworker||(u.credentials=l.has("authorization")?"include":"same-origin");var v=o(function*(){try{var t=new URLSearchParams(r||{});t.set("rnd",gt());var e=n+"?"+t,i=yield Ct().fetch(e,u);if(clearTimeout(a),204==i.status)return{error:null,statusCode:i.status};var s,o=i.headers.get("Content-Type");s=o&&o.indexOf("application/x-msgpack")>-1?yield i.arrayBuffer():o&&o.indexOf("application/json")>-1?yield i.json():yield i.text();var l=!!o&&-1===o.indexOf("application/x-msgpack"),h=function(t){var e={};return t.forEach((t,n)=>{e[n]=t}),e}(i.headers);if(i.ok)return{error:null,body:s,headers:h,unpacked:l,statusCode:i.status};var c=function(t,e){if(function(t,e){return!!e.get("x-ably-errorcode")}(0,e))return t.error&&z.fromValues(t.error)}(s,i.headers)||new H("Error response received from server: "+i.status+" body was: "+I.Config.inspect(s),null,i.status);return{error:c,body:s,headers:h,unpacked:l,statusCode:i.status}}catch(c){return clearTimeout(a),{error:c}}})();return Promise.race([d,v])})).apply(this,arguments)}var ri;I.BufferUtils=Nn,I.Http=Ln,I.Config=Yn,I.Transports=ti,I.WebStorage=Wn,Ln.bundledRequestImplementations={},B.initLogHandlers(),I.Defaults=(ri=ei,Object.assign(Ut,ri)),I.Config.agent&&(I.Defaults.agent+=" "+I.Config.agent);class si{constructor(){this.et=new Map}register(t){this.et.has(t.type)||this.et.set(t.type,t)}get(t){return this.et.get(t)}getAll(){return Array.from(this.et.values())}getToolDefinitions(){var t={};for(var e of this.et.values())t[e.type]={description:e.toolDescription,parameters:e.parameters};return t}}function ai(t){return t.replace(/&/g,"&").replace(/"/g,""").replace(/</g,"<").replace(/>/g,">")}var oi={type:"collect_email",toolDescription:"ALWAYS use this tool instead of asking for email in plain text. Renders an interactive form to collect the user's name and email. Use whenever the user wants follow-up, a demo, a meeting, pricing info, or shows buying intent. NEVER ask for name or email via plain text.",parameters:{prompt:{type:"string",description:"Message to show above the input fields"}},render(t,e){var n="string"==typeof t.prompt?t.prompt:"What's your name and email?",i=e.primaryColor,r="w-"+Date.now();return'\n <div class="vtilt-widget" data-vtilt-widget-type="collect_email" data-vtilt-widget-id="'+ai(r)+'" data-vtilt-msg-id="'+ai(e.messageId)+'">\n <p style="margin: 0 0 10px 0; font-size: 14px; color: #333;">'+ai(n)+'</p>\n <div style="display: flex; flex-direction: column; gap: 8px;">\n <input type="text" placeholder="Your name" class="vtilt-widget-input" data-vtilt-widget-field="name"\n style="width: 100%; box-sizing: border-box; padding: 10px 12px; border: 1px solid #E5E5E5; border-radius: 12px; font-size: 14px;"\n />\n <div style="display: flex; gap: 8px; align-items: center;">\n <input type="email" placeholder="your@email.com" class="vtilt-widget-input" data-vtilt-widget-field="email"\n style="flex: 1; min-width: 0; padding: 10px 12px; border: 1px solid #E5E5E5; border-radius: 12px; font-size: 14px;"\n />\n <button type="button" data-vtilt-widget-action="submit" data-vtilt-widget-type="collect_email" data-vtilt-widget-id="'+ai(r)+'"\n style="padding: 10px 16px; background: transparent; color: '+i+"; border: 2px solid "+i+'; border-radius: 12px; font-size: 14px; font-weight: 600; cursor: pointer; white-space: nowrap;"\n >Submit</button>\n </div>\n </div>\n </div>\n '},onAction:(t,e,n)=>o(function*(){if("submit"!==t)return{};var i="string"==typeof e.email?e.email.trim():"";if(!i||!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(i))return{};var r=n.buildEndpointUrl("/api/chat/widget/channels/"+n.channelId+"/actions"),s=n.token?{"x-api-key":n.token}:{};try{var a=yield fetch(r,{method:"POST",headers:l({"Content-Type":"application/json"},s),body:JSON.stringify({widget_type:"collect_email",action:"submit",data:{email:i,name:"string"==typeof e.name?e.name.trim():""},channel_id:n.channelId,distinct_id:n.distinctId,message_id:n.messageId})});return{success:!!(yield a.json()).success}}catch(t){return{}}})()};function li(t){return t.replace(/&/g,"&").replace(/"/g,""").replace(/</g,"<").replace(/>/g,">")}var hi={type:"escalate_to_human",toolDescription:"Offer to connect the user with a human agent. Use when the user explicitly asks to speak with a person, when you cannot adequately help them, or when the conversation requires human judgment (billing, complaints, complex issues).",parameters:{prompt:{type:"string",description:"Message to show above the connect button"}},render(t,e){var n="string"==typeof t.prompt?t.prompt:"Would you like me to connect you with a team member?",i=e.primaryColor,r="w-esc-"+Date.now();return'\n <div class="vtilt-widget" data-vtilt-widget-type="escalate_to_human" data-vtilt-widget-id="'+li(r)+'" data-vtilt-msg-id="'+li(e.messageId)+'">\n <p style="margin: 0 0 10px 0; font-size: 14px; color: #333;">'+li(n)+'</p>\n <button type="button" data-vtilt-widget-action="escalate" data-vtilt-widget-type="escalate_to_human" data-vtilt-widget-id="'+li(r)+'"\n style="padding: 10px 20px; background: transparent; color: '+i+"; border: 2px solid "+i+'; border-radius: 12px; font-size: 14px; font-weight: 600; cursor: pointer; display: flex; align-items: center; gap: 8px;"\n ><svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="'+i+'" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2"/><circle cx="12" cy="7" r="4"/></svg>Connect with a person</button>\n </div>\n '},onAction:(t,e,n)=>o(function*(){if("escalate"!==t)return{};var e=n.buildEndpointUrl("/api/chat/widget/channels/"+n.channelId+"/actions"),i=n.token?{"x-api-key":n.token}:{};try{var r=yield fetch(e,{method:"POST",headers:l({"Content-Type":"application/json"},i),body:JSON.stringify({widget_type:"escalate_to_human",action:"escalate",data:{},channel_id:n.channelId,distinct_id:n.distinctId,message_id:n.messageId})});return{success:!!(yield r.json()).success}}catch(t){return{}}})()},ci="#vtilt-chat-widget",di="\n "+ci+" .vtilt-md {\n max-width: 100%;\n overflow-wrap: anywhere;\n word-break: break-word;\n font-size: inherit;\n line-height: 1.45;\n }\n "+ci+" .vtilt-md * {\n box-sizing: border-box;\n }\n "+ci+" .vtilt-md :is(p, h1, h2, h3, h4, h5, h6, ul, ol, blockquote, pre) {\n margin: 0;\n }\n "+ci+" .vtilt-md p { margin: 0 0 0.5em 0; }\n "+ci+" .vtilt-md p:last-child { margin-bottom: 0; }\n "+ci+" .vtilt-md :is(b, strong) { font-weight: 600; }\n "+ci+" .vtilt-md :is(i, em) { font-style: italic; }\n "+ci+" .vtilt-md u { text-decoration: underline; }\n "+ci+" .vtilt-md :is(h1, h2, h3, h4, h5, h6) {\n font-size: 1em;\n font-weight: 600;\n margin: 0.65em 0 0.35em 0;\n line-height: 1.3;\n }\n "+ci+" .vtilt-md :is(h1, h2, h3):first-child { margin-top: 0.15em; }\n\n /* Lists — flex rows + ::before bullets (beats host list-item / ::marker resets) */\n "+ci+" .vtilt-md :is(ul, ol) {\n list-style: none !important;\n margin: 0.5em 0 !important;\n padding: 0 0 0 0.35em !important;\n }\n "+ci+" .vtilt-md li {\n display: flex !important;\n flex-direction: row !important;\n flex-wrap: wrap !important;\n align-items: flex-start !important;\n gap: 0.35em !important;\n margin: 0.2em 0 !important;\n padding: 0 !important;\n line-height: 1.45;\n list-style: none !important;\n list-style-type: none !important;\n }\n "+ci+' .vtilt-md li::marker {\n content: "" !important;\n font-size: 0 !important;\n color: transparent !important;\n }\n '+ci+" .vtilt-md li::-webkit-list-marker {\n display: none !important;\n }\n "+ci+' .vtilt-md ul > li::before {\n content: "•" !important;\n display: inline-block !important;\n position: static !important;\n flex: 0 0 auto;\n line-height: 1.45;\n }\n '+ci+' .vtilt-md ul ul > li::before {\n content: "◦" !important;\n }\n '+ci+" .vtilt-md ol { counter-reset: vtilt-ol; }\n "+ci+" .vtilt-md ol > li { counter-increment: vtilt-ol; }\n "+ci+' .vtilt-md ol > li::before {\n content: counter(vtilt-ol) "." !important;\n display: inline-block !important;\n position: static !important;\n flex: 0 0 auto;\n min-width: 1.1em;\n line-height: 1.45;\n }\n '+ci+" .vtilt-md ol ol { counter-reset: vtilt-ol; }\n "+ci+" .vtilt-md li > :is(ul, ol) {\n flex: 1 0 100% !important;\n width: 100% !important;\n margin: 0.25em 0 0 0 !important;\n padding-left: 0.75em !important;\n }\n\n "+ci+" .vtilt-md code {\n font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;\n font-size: 0.9em;\n background: rgba(0, 0, 0, 0.06);\n padding: 0.1em 0.35em;\n border-radius: 4px;\n }\n "+ci+" .vtilt-md pre {\n margin: 0.5em 0;\n padding: 0.5em 0.65em;\n border-radius: 6px;\n background: rgba(0, 0, 0, 0.06);\n overflow-x: auto;\n white-space: pre-wrap;\n }\n "+ci+" .vtilt-md pre code { background: none; padding: 0; }\n "+ci+" .vtilt-md blockquote {\n margin: 0.5em 0;\n padding-left: 0.75em;\n border-left: 3px solid rgba(0, 0, 0, 0.15);\n }\n "+ci+" .vtilt-md a { color: inherit; text-decoration: underline; }\n "+ci+" .vtilt-md br { line-height: inherit; }\n\n /* Widget visitor bubble (brand color) */\n "+ci+" .vtilt-user-md code { background: rgba(255, 255, 255, 0.2); }\n "+ci+" .vtilt-user-md pre { background: rgba(255, 255, 255, 0.15); }\n "+ci+" .vtilt-user-md pre code { background: none; }\n "+ci+" .vtilt-user-md blockquote { border-left-color: rgba(255, 255, 255, 0.35); }\n";var ui={none:0,error:1,warn:2,info:3,debug:4},vi="[vTilt]",fi=new Set(["none","error","warn","info","debug"]);function pi(){return"undefined"!=typeof console}function gi(t){var e=t.length>0&&"string"==typeof t[0]?t[0]:"",n=e?t.slice(1):t;return[e?vi+":"+e:vi,...n]}var mi="warn",wi=!1;var yi=null;function bi(){return yi||(yi={setLevel(t,e){void 0===e&&(e=!1),mi=t,e&&(wi=!0)},setLevelFromRemote(t){wi||t&&fi.has(t)&&(mi=t)},getLevel:()=>mi,isLockedByInit:()=>wi,debug(){if(!(ui[mi]<ui.debug)&&pi()){for(var t=arguments.length,e=new Array(t),n=0;n<t;n++)e[n]=arguments[n];console.log(...gi(e))}},info(){if(!(ui[mi]<ui.info)&&pi()){for(var t=arguments.length,e=new Array(t),n=0;n<t;n++)e[n]=arguments[n];console.log(...gi(e))}},warn(){if(!(ui[mi]<ui.warn)&&pi()){for(var t=arguments.length,e=new Array(t),n=0;n<t;n++)e[n]=arguments[n];console.warn(...gi(e))}},error(){if(!(ui[mi]<ui.error)&&pi()){for(var t=arguments.length,e=new Array(t),n=0;n<t;n++)e[n]=arguments[n];console.error(...gi(e))}}}),yi}var xi="/api/chat/widget/channels",ki=t=>"/api/chat/widget/channels/"+t+"/messages",Ei=t=>"/api/chat/widget/channels/"+t+"/read",Ti="/api/chat/token/widget";function Ai(t,e,n){return Si.apply(this,arguments)}function Si(){return(Si=o(function*(t,e,n){void 0===n&&(n={});var i=t.getConfig(),r=w(i,e);try{var s=yield fetch(r,l({},n,{headers:l({"Content-Type":"application/json"},y(i),n.headers)}));if(!s.ok)throw new Error("API error: "+s.status);return yield s.json()}catch(t){return bi().error("chat","API request failed:",t),null}})).apply(this,arguments)}var Ci="vtilt-bubble-pos";function _i(t,e,n){var i=t.getBoundingClientRect(),r=i.left-e,s=i.top-n,a=window.innerWidth-t.offsetWidth-r,o=-r,l=window.innerHeight-t.offsetHeight-s,h=-s;return{x:Math.min(Math.max(e,o),a),y:Math.min(Math.max(n,h),l)}}function Oi(t,e,n){t.style.transform="translate3d("+e+"px, "+n+"px, 0)"}function Mi(t,e){var n,i=null!==(n=null==e?void 0:e.handle)&&void 0!==n?n:t,r=0,s=0,a=0,o=0,l=0,h=0,c=!1,d=!1,u=function(){try{var t=localStorage.getItem(Ci);if(!t)return null;var e=JSON.parse(t);if("number"==typeof e.x&&"number"==typeof e.y)return e}catch(t){}return null}();if(u){r=u.x,s=u.y;var v=t.style.transition;t.style.transition="none",Oi(t,r,s);var f=_i(t,r,s);r=f.x,s=f.y,Oi(t,r,s),t.offsetHeight,t.style.transition=v}i.style.cursor="grab",i.style.touchAction="none";var p=e=>{0===e.button&&(c=!0,d=!1,a=e.clientX,o=e.clientY,l=r,h=s,i.setPointerCapture(e.pointerId),i.style.cursor="grabbing",t.style.transition="none")},g=e=>{if(c){var n=e.clientX-a,i=e.clientY-o;if(!(!d&&Math.abs(n)<5&&Math.abs(i)<5)){d=!0;var u={x:l+n,y:h+i},v=_i(t,u.x,u.y);r=v.x,s=v.y,Oi(t,r,s)}}},m=()=>{c&&(c=!1,i.style.cursor="grab",t.style.transition="",d&&function(t){try{localStorage.setItem(Ci,JSON.stringify(t))}catch(t){}}({x:r,y:s}))},w=t=>{d&&(t.stopPropagation(),t.preventDefault(),d=!1)},y=()=>{var e=_i(t,r,s);r=e.x,s=e.y,Oi(t,r,s)};return i.addEventListener("pointerdown",p),i.addEventListener("pointermove",g),i.addEventListener("pointerup",m),i.addEventListener("pointercancel",m),i.addEventListener("click",w,!0),window.addEventListener("resize",y),{destroy(){i.removeEventListener("pointerdown",p),i.removeEventListener("pointermove",g),i.removeEventListener("pointerup",m),i.removeEventListener("pointercancel",m),i.removeEventListener("click",w,!0),window.removeEventListener("resize",y)}}}var Ii="chat",ji=/<!--vtilt:widget:([\s\S]*?)-->/g,Pi="bottom-right",Ri={primaryColor:"#7B68EE",fontFamily:'-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif',borderRadius:"16px"};class Di{constructor(t,e){var n;void 0===e&&(e={}),this.nt=null,this.it=null,this.rt=null,this.st=null,this.ot=Ri,this.lt=null,this.ht=null,this.ct=null,this.dt=null,this.ut=null,this.vt="disconnected",this.ft=null,this.gt=null,this.wt=null,this.yt=[],this.bt=[],this.xt=[],this.kt=null,this.Et=!1,this.Tt=null,this.At=!1,this.St=new si,this.Ct=!1,this._t="",this.Ot="",this.Mt=!1,this.It=0,this._instance=t,this.jt=l({enabled:!0,position:Pi,aiMode:!0,preload:!1},e,{theme:l({},Ri,e.theme)}),this.Pt={isOpen:!1,isVisible:!1!==(null===(n=this.jt.bubble)||void 0===n?void 0:n.visible),isConnected:!1,isLoading:!1,unreadCount:0,currentView:"list",channels:[],channel:null,messages:[],isTyping:!1,typingSender:null,typingSenderType:null,agentLastReadAt:null},this.St.register(oi),this.St.register(hi),this.Rt(),this.Dt(),this.getChannels(),this.Bt()}get isOpen(){return this.Pt.isOpen}get isConnected(){return this.Pt.isConnected}get isLoading(){return this.Pt.isLoading}get unreadCount(){return this.Pt.unreadCount}get channel(){return this.Pt.channel}get channels(){return this.Pt.channels}get currentView(){return this.Pt.currentView}get Nt(){return this.jt.theme||Ri}get Ut(){return this._instance.getDistinctId()||""}zt(t,e,n){var i,r=this._instance.getRemoteConfig(),s=null==r?void 0:r.chatTracking;if("user"===t.sender_type){if(!1===(null==s?void 0:s.trackUserMessages))return}else if(("ai"===t.sender_type||"agent"===t.sender_type)&&!1===(null==s?void 0:s.trackAgentMessages))return;this._instance.capture(b,{$channel_type:"chat",$conversation_id:e,$message_id:t.id,$direction:"user"===t.sender_type?"inbound":"outbound",$sender_type:t.sender_type,$content_preview:(null!==(i=t.content)&&void 0!==i?i:"").slice(0,100),$ai_mode:n})}open(){var t,e;this.Pt.isOpen||(this.Pt.isVisible=!0,this.Pt.isOpen=!0,this.Ht(!0),this.qt(),this.it&&(this.Lt(),this.it.classList.remove("vtilt-closing"),this.it.classList.add("vtilt-opening")),null===(e=(t=this.jt).onWidgetOpen)||void 0===e||e.call(t),this.Bt(),0===this.Pt.channels.length&&this.getChannels())}close(){var t,e,n;if(this.Pt.isOpen){var i=this.Ft();this.Pt.isOpen=!1,this.Ct||!1!==(null===(t=this.jt.bubble)||void 0===t?void 0:t.visible)||(this.Pt.isVisible=!1),this.Ht(!1),this.it&&(this.it.classList.remove("vtilt-opening"),this.it.classList.remove("vtilt-closing")),this.qt();var r=this.Pt.messages.filter(t=>"user"===t.sender_type).length;null===(n=(e=this.jt).onWidgetClose)||void 0===n||n.call(e,{timeOpenSeconds:i,messagesSent:r}),this.Vt()}}toggle(){this.Pt.isOpen?this.close():this.open()}show(){this.Ct=!0,this.Pt.isVisible=!0,this.qt()}hide(){this.Ct=!1,this.Pt.isVisible=!1,this.qt()}getChannels(){var t=this;return o(function*(){t.Pt.isLoading=!0,t.qt();try{var e=yield Ai(t._instance,xi+"?distinct_id="+encodeURIComponent(t.Ut),{method:"GET"});e&&(t.Pt.channels=e.channels||[],t.Pt.unreadCount=t.Pt.channels.reduce((t,e)=>t+(e.unread_count||0),0))}catch(t){bi().error(Ii,"failed to fetch channels:",t)}finally{t.Pt.isLoading=!1,t.qt()}})()}selectChannel(t){var e=this;return o(function*(){yield e.Vt(),e.wt=t,e.Pt.isLoading=!0,e.qt();try{var n=yield Ai(e._instance,xi+"/"+t+"?distinct_id="+encodeURIComponent(e.Ut),{method:"GET"});n&&(e.Pt.channel=n.channel,e.Pt.messages=n.messages||[],e.Pt.currentView="conversation",e.Pt.agentLastReadAt=n.channel.agent_last_read_at||null,e.Tt=n.channel.user_last_read_at||null,e.Pt.unreadCount=e.Wt(),yield e.Jt(n.channel.id),e.Pt.isOpen&&e.$t())}catch(t){bi().error(Ii,"failed to select channel:",t)}finally{e.wt=null,e.Pt.isLoading=!1,e.qt()}})()}createChannel(){var t=this;return o(function*(){var n,i,s;yield t.Vt(),t.Pt.isLoading=!0,t.qt();try{var a=yield Ai(t._instance,xi,{method:"POST",body:JSON.stringify({distinct_id:t.Ut,page_url:null===(n=null==e?void 0:e.location)||void 0===n?void 0:n.href,page_title:null==r?void 0:r.title})});if(a){t.Pt.channel=a.channel,t.Pt.messages=a.messages||[],t.Pt.currentView="conversation",t.Pt.agentLastReadAt=a.channel.agent_last_read_at||null,t.Tt=a.channel.user_last_read_at||null,t.Pt.unreadCount=t.Wt();var o={id:a.channel.id,status:a.channel.status,ai_mode:a.channel.ai_mode,last_message_at:a.channel.last_message_at,last_message_preview:a.channel.last_message_preview,last_message_sender:a.channel.last_message_sender,unread_count:t.Pt.unreadCount,user_last_read_at:a.channel.user_last_read_at,created_at:a.channel.created_at};t.Pt.channels.some(t=>t.id===a.channel.id)||t.Pt.channels.unshift(o),null===(s=(i=t.jt).onConversationStart)||void 0===s||s.call(i,{channelId:a.channel.id,aiMode:a.channel.ai_mode}),yield t.Jt(a.channel.id)}}catch(t){bi().error(Ii,"failed to create channel:",t)}finally{t.wt=null,t.Pt.isLoading=!1,t.qt()}})()}goToChannelList(){var t=this;return o(function*(){if(yield t.Vt(),t.wt=null,t.gt=null,yield t.Kt(),t.Pt.channel){var e=t.Pt.channels.findIndex(e=>{var n;return e.id===(null===(n=t.Pt.channel)||void 0===n?void 0:n.id)});-1!==e&&(t.Pt.channels[e]=l({},t.Pt.channels[e],{last_message_at:t.Pt.messages.length>0?t.Pt.messages[t.Pt.messages.length-1].created_at:t.Pt.channels[e].last_message_at,last_message_preview:t.Pt.messages.length>0?t.Gt(t.Pt.messages[t.Pt.messages.length-1]):t.Pt.channels[e].last_message_preview,last_message_sender:t.Pt.messages.length>0?t.Pt.messages[t.Pt.messages.length-1].sender_type:t.Pt.channels[e].last_message_sender,unread_count:0}))}t.Pt.channel=null,t.Pt.messages=[],t.Pt.currentView="list",t.Pt.isTyping=!1,t.Pt.typingSender=null,t.Pt.typingSenderType=null,t.qt()})()}sendMessage(t,e){var n=this;return o(function*(){var i,r,s,a,o,h,c=function(t,e){var n,i=function(t){return"string"==typeof t?{raw:t,format:"text"}:"markdown"in t?{raw:t.markdown,format:"markdown"}:"html"in t?{raw:t.html,format:"html"}:"text"in t?{raw:t.text,format:"text"}:null}(t);if(!i)return null;var r="string"==typeof t?null!==(n=null==e?void 0:e.format)&&void 0!==n?n:"text":i.format,s=i.raw.trim();return s?"html"===r?{content:s,content_type:"html",metadata:{}}:"markdown"===r?{content:s,content_type:"text",metadata:{[f]:p}}:{content:s,content_type:"text",metadata:{}}:null}(t,e);if(c){var{content:d,content_type:u,metadata:v}=c;!1!==(null==e?void 0:e.open)&&n.open();var g=null==e?void 0:e.channel;if("new"===g?yield n.createChannel():g&&(yield n.selectChannel(g)),n.Pt.channel&&"conversation"===n.Pt.currentView){var m=null===(i=n.Pt.channel)||void 0===i?void 0:i.id;if(m){var b={id:"temp-"+Date.now(),channel_id:m,sender_type:"user",sender_id:n.Ut||null,sender_name:null,sender_avatar_url:null,content:d,content_type:u,metadata:v,created_at:(new Date).toISOString()};n.Pt.messages.push(b),n.qt();try{var x=n._instance.getConfig(),k=w(x,ki(m)),E=yield fetch(k,{method:"POST",headers:l({"Content-Type":"application/json"},y(x)),body:JSON.stringify({channel_id:m,distinct_id:n.Ut,content:d,content_type:u,metadata:v})});if(!E.ok)throw new Error("API error: "+E.status);if((E.headers.get("content-type")||"").includes("text/plain"))yield n.Qt(E,b,m);else{var T=yield E.json(),A=n.Pt.messages.findIndex(t=>t.id===b.id);-1!==A&&(null==T?void 0:T.message)&&(n.Pt.messages[A]=T.message),(null===(r=null==T?void 0:T.message)||void 0===r?void 0:r.id)&&(null===(a=(s=n.jt).onMessageSent)||void 0===a||a.call(s,{channelId:m,messageId:T.message.id})),(null==T?void 0:T.message)&&n.zt(T.message,m,null!==(h=null===(o=n.Pt.channel)||void 0===o?void 0:o.ai_mode)&&void 0!==h&&h),n.qt()}}catch(t){bi().error(Ii,"failed to send message:",t),n.Pt.messages=n.Pt.messages.filter(t=>t.id!==b.id),n.qt()}}else bi().error(Ii,"no channel to send message to")}else bi().error(Ii,"cannot send message: not in conversation view")}else bi().warn(Ii,"sendMessage: message is empty")})()}markAsRead(){this.$t()}Yt(t){var e=this;return o(function*(){try{var n=e._instance.getConfig(),i=w(n,ki(t)),r=yield fetch(i,{method:"POST",headers:l({"Content-Type":"application/json"},y(n)),body:JSON.stringify({channel_id:t,distinct_id:e.Ut,widget_action_trigger:!0})});if(!r.ok)return;if((r.headers.get("content-type")||"").includes("text/plain")){var s={id:"silent-"+Date.now(),channel_id:t,sender_type:"user",sender_id:e.Ut||null,sender_name:null,sender_avatar_url:null,content:"",content_type:"text",metadata:{},created_at:(new Date).toISOString()};yield e.Qt(r,s,t)}}catch(t){}})()}$t(){var t;if(this.Pt.channel&&!this.At){var e=this.Pt.messages[this.Pt.messages.length-1];if(e){var n=this.Pt.messages.some(t=>("agent"===t.sender_type||"ai"===t.sender_type)&&!this.Xt(t.created_at)),i=this.Pt.channels.find(t=>{var e;return t.id===(null===(e=this.Pt.channel)||void 0===e?void 0:e.id)}),r=(null!==(t=null==i?void 0:i.unread_count)&&void 0!==t?t:0)>0;(n||r)&&(this.Pt.unreadCount=0,this.At=!0,this.qt(),Ai(this._instance,Ei(this.Pt.channel.id),{method:"POST",body:JSON.stringify({channel_id:this.Pt.channel.id,distinct_id:this.Ut,read_at:e.created_at})}).then(t=>{t&&(this.Tt=e.created_at,i&&(i.unread_count=0)),this.Pt.unreadCount=this.Pt.channels.reduce((t,e)=>t+(e.unread_count||0),0),this.At=!1,this.qt()}).catch(()=>{this.At=!1,this.qt()}))}}}Xt(t){return!!this.Tt&&new Date(t)<=new Date(this.Tt)}Wt(){return this.Pt.channel&&this.Tt?this.Pt.messages.filter(t=>("agent"===t.sender_type||"ai"===t.sender_type)&&new Date(t.created_at)>new Date(this.Tt)).length:0}onMessage(t){return this.yt.push(t),()=>{var e=this.yt.indexOf(t);e>-1&&this.yt.splice(e,1)}}onTyping(t){return this.bt.push(t),()=>{var e=this.bt.indexOf(t);e>-1&&this.bt.splice(e,1)}}onConnectionChange(t){return this.xt.push(t),()=>{var e=this.xt.indexOf(t);e>-1&&this.xt.splice(e,1)}}destroy(){var t,e,n;this.Zt(),this.kt&&clearTimeout(this.kt),this.Ht(!1),null===(t=this.st)||void 0===t||t.destroy(),this.st=null,null===(e=this.lt)||void 0===e||e.call(this),this.lt=null,(null===(n=this.nt)||void 0===n?void 0:n.parentNode)&&this.nt.parentNode.removeChild(this.nt),this.yt=[],this.bt=[],this.xt=[]}Bt(){var t=this;return o(function*(){if(!t.ht){t.vt="connecting",t.te(!1);try{var e=yield Ai(t._instance,Ti,{method:"POST",body:JSON.stringify({distinct_id:t.Ut})});if(!(null==e?void 0:e.tokenRequest))return bi().warn(Ii,"failed to get Ably token"),void(t.vt="error");t.ft=e.project_id,t.ht=new bn({plugins:{WebSocketTransport:Zn,FetchRequest:ni},authCallback:(i=o(function*(e,n){var i,r,s;try{var a=null!==(r=null!==(i=t.wt)&&void 0!==i?i:t.gt)&&void 0!==r?r:null===(s=t.Pt.channel)||void 0===s?void 0:s.id,o=yield Ai(t._instance,Ti,{method:"POST",body:JSON.stringify(l({distinct_id:t.Ut},a&&{channel_id:a}))});(null==o?void 0:o.tokenRequest)?n(null,o.tokenRequest):n("Failed to refresh token",null)}catch(t){n(String(t),null)}}),function(t,e){return i.apply(this,arguments)}),authMethod:"POST"}),yield t.ht.auth.authorize(e.tokenRequest),t.ht.connection.on("connected",()=>{t.vt="connected",t.Pt.isConnected=!0,t.te(!0)}),t.ht.connection.on("disconnected",()=>{t.vt="disconnected",t.Pt.isConnected=!1,t.te(!1)}),t.ht.connection.on("failed",()=>{t.vt="error",t.Pt.isConnected=!1,t.te(!1)}),t.ht.connect();var n="chat:"+t.ft+":notifications";t.ct=t.ht.channels.get(n),t.ct.subscribe("notification",e=>{t.ee(e.data)})}catch(e){bi().error(Ii,"failed to connect to Ably:",e),t.vt="error"}var i}})()}Kt(t){var e=this;return o(function*(){if(!e.ht)return!1;try{var n=yield Ai(e._instance,Ti,{method:"POST",body:JSON.stringify(l({distinct_id:e.Ut},t&&{channel_id:t}))});return(null==n?void 0:n.tokenRequest)?(yield e.ht.auth.authorize(n.tokenRequest),e.gt=null!=t?t:null,!0):(bi().warn(Ii,"failed to refresh Ably token",null!=t?t:"(list)"),!1)}catch(t){return bi().error(Ii,"failed to refresh Ably token:",t),!1}})()}Jt(t){var e=this;return o(function*(){if(yield e.Bt(),e.ht&&e.ft)if(yield e.Kt(t)){var n="chat:"+e.ft+":"+t;try{e.dt=e.ht.channels.get(n),yield e.dt.attach(),e.dt.subscribe("message",t=>{e.ne(t.data)}),e.dt.subscribe("read",t=>{e.ie(t.data)}),e.ut=e.ht.channels.get(n+":typing"),yield e.ut.attach(),e.ut.subscribe("typing",t=>{e.re(t.data)})}catch(t){bi().error(Ii,"failed to attach chat/typing channels:",t),yield e.Vt(),e.gt=null}}else bi().warn(Ii,"skipping channel subscribe — no Ably capability for",t)})()}Vt(){var t=this;return o(function*(){var e=t.ht,n=t.dt,i=t.ut;t.dt=null,t.ut=null,t.gt=null;var r=function(){var t=o(function*(t){if(t&&e){var n=t.name;t.unsubscribe();try{yield t.detach()}catch(t){}e.channels.release(n)}});return function(e){return t.apply(this,arguments)}}();yield Promise.all([r(n),r(i)])})()}Zt(){var t=this;return o(function*(){yield t.Vt(),t.ct&&(t.ct.unsubscribe(),t.ct=null),t.ht&&(t.ht.close(),t.ht=null),t.ft=null,t.vt="disconnected",t.Pt.isConnected=!1})()}ee(t){var e,n,i,{type:r,channel_id:s,data:a}=t;if("new_channel"!==r){if("channel_updated"===r&&a){var o=this.Pt.channels.findIndex(t=>t.id===s);if(-1!==o){var h=l({},this.Pt.channels[o]);if(void 0!==a.last_message_at&&(h.last_message_at=a.last_message_at),void 0!==a.last_message_preview&&(h.last_message_preview=a.last_message_preview),void 0!==a.last_message_sender&&(h.last_message_sender=a.last_message_sender),void 0!==a.user_unread_count)this.Pt.isOpen&&(null===(e=this.Pt.channel)||void 0===e?void 0:e.id)===s||(h.unread_count=a.user_unread_count);void 0!==a.status&&(h.status=a.status),void 0!==a.ai_mode&&(h.ai_mode=a.ai_mode),this.Pt.channels[o]=h,this.Pt.channels.sort((t,e)=>{var n=t.last_message_at||t.created_at,i=e.last_message_at||e.created_at;return new Date(i).getTime()-new Date(n).getTime()}),this.Pt.unreadCount=this.Pt.channels.reduce((t,e)=>t+(e.unread_count||0),0)}(null===(n=this.Pt.channel)||void 0===n?void 0:n.id)===s&&"closed"===a.status&&(this.Pt.channel=l({},this.Pt.channel,{status:"closed"})),this.qt()}if("channel_closed"===r){var c=this.Pt.channels.findIndex(t=>t.id===s);-1!==c&&(this.Pt.channels[c]=l({},this.Pt.channels[c],{status:"closed"})),(null===(i=this.Pt.channel)||void 0===i?void 0:i.id)===s&&(this.Pt.channel=l({},this.Pt.channel,{status:"closed"})),this.qt()}}else this.getChannels()}ne(t){var e,n,i,r,s,a;if("ai"===t.sender_type){var o=this.Pt.messages.findIndex(t=>t.id.startsWith("temp-ai-"));if(-1!==o){var l=null!==(e=this.Pt.messages[o].metadata)&&void 0!==e?e:{};this.Pt.messages[o]=t,!(null!==(n=this.Pt.messages[o].metadata)&&void 0!==n?n:{}).widgets&&l.et&&(this.Pt.messages[o].metadata.et=l.et)}else{if(this.Pt.messages.some(e=>e.id===t.id))return;this.Pt.messages.push(t)}}else{if(this.Pt.messages.some(e=>e.id===t.id))return;if("user"===t.sender_type&&t.sender_id===this.Ut){var h=this.Pt.messages.findIndex(e=>e.id.startsWith("temp-")&&e.content===t.content&&e.content_type===t.content_type&&"user"===e.sender_type);return void(-1!==h&&(this.Pt.messages[h]=t,this.qt()))}this.Pt.messages.push(t)}if("ai"===t.sender_type||"agent"===t.sender_type){if(this.Pt.isOpen)setTimeout(()=>this.$t(),100);else{this.Pt.unreadCount++;var c=this.Pt.channels.find(e=>e.id===t.channel_id);c&&(c.unread_count=(c.unread_count||0)+1)}null===(r=(i=this.jt).onMessageReceived)||void 0===r||r.call(i,{channelId:t.channel_id,messageId:t.id,senderType:t.sender_type}),this.zt(t,t.channel_id,null!==(a=null===(s=this.Pt.channel)||void 0===s?void 0:s.ai_mode)&&void 0!==a&&a)}this.Pt.isTyping=!1,this.Pt.typingSender=null,this.Pt.typingSenderType=null,this.yt.forEach(e=>e(t)),this.qt()}re(t){if("user"!==t.sender_type){this.Pt.isTyping=t.is_typing,this.Pt.typingSenderType=t.is_typing?t.sender_type:null;var e="ai"===t.sender_type?null:t.sender_name||("agent"===t.sender_type?"Agent":null);this.Pt.typingSender=t.is_typing?e:null,this.bt.forEach(n=>n(t.is_typing,e||"")),this.qt()}}ie(t){"agent"===t.reader_type&&(this.Pt.agentLastReadAt=t.read_at,this.qt())}te(t){this.xt.forEach(e=>e(t))}Rt(){var t,n,i,s;if(r){var a=this.Nt;this.ot={primaryColor:null!==(t=a.primaryColor)&&void 0!==t?t:Ri.primaryColor,fontFamily:null!==(n=a.fontFamily)&&void 0!==n?n:Ri.fontFamily,borderRadius:null!==(i=a.borderRadius)&&void 0!==i?i:Ri.borderRadius};var o,l,h=this.jt.position||Pi;this.nt=r.createElement("div"),this.nt.id="vtilt-chat-container",this.nt.setAttribute("style",function(t,e){return void 0===e&&(e="bottom-right"),"\n position: fixed;\n bottom: 20px;\n "+("bottom-right"===e?"right: 20px;":"left: 20px;")+"\n z-index: 999999;\n font-family: "+t.fontFamily+";\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n "}(this.ot,h)),this._t=this.nt.getAttribute("style")||"",this.rt=r.createElement("div"),this.rt.id="vtilt-chat-bubble",this.rt.innerHTML='\n <svg width="28" height="28" viewBox="0 0 28 28" fill="white">\n <path d="M14 3C7.925 3 3 7.262 3 12.5c0 2.56 1.166 4.884 3.063 6.606L4.5 24l5.25-2.625C11.1 21.79 12.52 22 14 22c6.075 0 11-4.262 11-9.5S20.075 3 14 3z"/>\n </svg>\n <div class="vtilt-chat-badge" style="\n display: none;\n position: absolute;\n top: -4px;\n right: -4px;\n background: #E53935;\n color: white;\n font-size: 11px;\n font-weight: 700;\n min-width: 20px;\n height: 20px;\n border-radius: 10px;\n align-items: center;\n justify-content: center;\n padding: 0 6px;\n box-sizing: border-box;\n border: 2px solid white;\n ">0</div>\n ',this.rt.setAttribute("style",(o=this.ot,"\n width: 60px;\n height: 60px;\n border-radius: 50%;\n background: "+(l=o.primaryColor)+";\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n box-shadow: 0 4px 16px "+l+"66;\n transition: transform 0.2s ease, box-shadow 0.2s ease;\n position: relative;\n -webkit-tap-highlight-color: transparent;\n touch-action: manipulation;\n ")),this.nt.appendChild(this.rt),this.it=r.createElement("div"),this.it.id="vtilt-chat-widget",this.it.innerHTML=function(t){var e=t.primaryColor;return'\n <div class="vtilt-chat-header" style="\n background: #ffffff;\n border-bottom: 1px solid #E5E5E5;\n padding: 18px 16px;\n padding-top: max(18px, env(safe-area-inset-top, 18px));\n display: flex;\n align-items: center;\n justify-content: space-between;\n min-height: 60px;\n box-sizing: border-box;\n flex-shrink: 0;\n ">\n <div style="font-weight: 600; font-size: 17px; color: #000000;">Messages</div>\n <button class="vtilt-chat-close" style="\n background: transparent;\n border: none;\n color: #666666;\n cursor: pointer;\n padding: 6px;\n margin: -6px;\n border-radius: 4px;\n display: flex;\n align-items: center;\n justify-content: center;\n -webkit-tap-highlight-color: transparent;\n touch-action: manipulation;\n ">\n <svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">\n <path d="M18 6L6 18M6 6l12 12"></path>\n </svg>\n </button>\n </div>\n \n <div class="vtilt-chat-content" style="\n flex: 1;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n min-height: 0;\n background: #ffffff;\n ">\n </div>\n \n <div class="vtilt-chat-loader" style="\n display: none;\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(255, 255, 255, 0.95);\n align-items: center;\n justify-content: center;\n z-index: 10;\n ">\n <div style="\n width: 32px;\n height: 32px;\n border: 3px solid #E5E5E5;\n border-top-color: '+e+';\n border-radius: 50%;\n animation: vtilt-spin 0.8s linear infinite;\n "></div>\n </div>\n \n <style>\n @keyframes vtilt-spin { to { transform: rotate(360deg); } }\n @keyframes vtilt-open {\n from { opacity: 0; transform: scale(0.4); }\n to { opacity: 1; transform: scale(1); }\n }\n \n #vtilt-chat-bubble { transition: transform 0.15s ease, box-shadow 0.15s ease; }\n #vtilt-chat-bubble:hover { transform: scale(1.05); box-shadow: 0 6px 20px '+e+"73; }\n #vtilt-chat-bubble:active { transform: scale(0.95); }\n .vtilt-draggable #vtilt-chat-bubble:hover,\n .vtilt-draggable #vtilt-chat-bubble:active { transform: none; }\n \n /* transform-origin is set in JS by _constrainWidgetToViewport() to match widget position */\n #vtilt-chat-widget.vtilt-opening { animation: vtilt-open 0.5s cubic-bezier(0.16, 1, 0.3, 1) forwards; }\n \n .vtilt-chat-content { transition: opacity 0.15s ease; }\n \n .vtilt-chat-close:hover { color: #000 !important; background: #F0F0F0 !important; }\n .vtilt-chat-back:hover { color: #000 !important; background: #F0F0F0 !important; }\n \n .vtilt-chat-input-container > div:first-child:focus-within { \n border-color: "+e+" !important; \n box-shadow: 0 0 0 2px "+e+"20 !important; \n }\n .vtilt-chat-input { \n -webkit-text-size-adjust: 100%; \n }\n .vtilt-chat-input:focus { \n outline: none !important; \n }\n .vtilt-chat-input::placeholder { \n color: #999999; \n }\n .vtilt-chat-input::-webkit-scrollbar { \n width: 4px; \n }\n .vtilt-chat-input::-webkit-scrollbar-track { \n background: transparent; \n }\n .vtilt-chat-input::-webkit-scrollbar-thumb { \n background: rgba(0, 0, 0, 0.2); \n border-radius: 2px; \n }\n .vtilt-chat-input::-webkit-scrollbar-thumb:hover { \n background: rgba(0, 0, 0, 0.3); \n }\n /* Firefox scrollbar */\n .vtilt-chat-input { \n scrollbar-width: thin; \n scrollbar-color: rgba(0, 0, 0, 0.2) transparent; \n }\n .vtilt-chat-attach:hover,\n .vtilt-chat-emoji:hover,\n .vtilt-chat-gif:hover,\n .vtilt-chat-mic:hover {\n color: #333333 !important;\n }\n .vtilt-chat-attach:active,\n .vtilt-chat-emoji:active,\n .vtilt-chat-gif:active,\n .vtilt-chat-mic:active {\n color: #000000 !important;\n }\n .vtilt-chat-send:not(:disabled):hover {\n opacity: 0.9 !important;\n transform: scale(1.05);\n }\n .vtilt-chat-send:not(:disabled):active {\n opacity: 0.8 !important;\n transform: scale(0.95);\n }\n .vtilt-chat-send:disabled {\n cursor: not-allowed !important;\n }\n \n .vtilt-chat-send { transition: opacity 0.1s ease; }\n\n "+di+"\n \n /* Widget styles */\n .vtilt-widget { margin-top: 10px; }\n .vtilt-widget-input { font-family: inherit; }\n .vtilt-widget-input:focus { outline: none; border-color: #999; }\n \n .vtilt-chat-new-channel { transition: opacity 0.1s ease; }\n .vtilt-chat-new-channel:hover { opacity: 0.9; }\n .vtilt-chat-new-channel:active { opacity: 0.8; }\n \n .vtilt-channel-item { transition: background 0.1s ease; cursor: pointer; }\n .vtilt-channel-item:hover { background: #F5F5F5 !important; }\n .vtilt-channel-item:active { background: #EBEBEB !important; }\n \n @keyframes vtilt-slide-up {\n from { opacity: 0; transform: translateY(100%); }\n to { opacity: 1; transform: translateY(0); }\n }\n\n @media (max-width: 480px) {\n #vtilt-chat-bubble { width: 56px !important; height: 56px !important; }\n #vtilt-chat-bubble svg { width: 24px !important; height: 24px !important; }\n #vtilt-chat-widget.vtilt-opening {\n animation: vtilt-slide-up 0.35s cubic-bezier(0.16, 1, 0.3, 1) forwards !important;\n transform-origin: bottom center !important;\n }\n }\n \n @media (prefers-reduced-motion: reduce) {\n * { animation-duration: 0.01ms !important; transition-duration: 0.01ms !important; }\n }\n </style>\n "}(this.ot),this.it.setAttribute("style","\n display: none;\n flex-direction: column;\n position: absolute;\n bottom: 0;\n right: 0;\n width: 380px;\n max-width: calc(100vw - 40px);\n height: 600px;\n max-height: calc(100vh - 40px);\n max-height: calc(100dvh - 40px);\n background: #ffffff;\n border-radius: 16px;\n box-shadow: 0 5px 40px rgba(0, 0, 0, 0.16);\n overflow: hidden;\n "),this.nt.appendChild(this.it),r.body.appendChild(this.nt),(null===(s=this.jt.bubble)||void 0===s?void 0:s.draggable)&&this.nt&&this.rt&&(this.nt.classList.add("vtilt-draggable"),this.st=Mi(this.nt,{handle:this.rt}));var c=()=>{this.Pt.isOpen&&(this.se()?(this.ae(),this.Ht(!0)):(this.oe(),this.Ht(!1),this.Lt()),this.nt&&this.it&&this.rt&&(this.nt.style.display=this.Pt.isVisible?"block":"none",this.it.style.display=this.Pt.isOpen?"flex":"none",this.rt.style.display=this.Pt.isOpen?"none":"flex"))},d=e;d&&(d.addEventListener("resize",c),this.lt=()=>d.removeEventListener("resize",c))}}Dt(){var t,e,n,i,r;null===(t=this.rt)||void 0===t||t.addEventListener("click",()=>this.toggle()),null===(n=null===(e=this.it)||void 0===e?void 0:e.querySelector(".vtilt-chat-close"))||void 0===n||n.addEventListener("click",()=>this.close()),null===(i=this.it)||void 0===i||i.addEventListener("click",t=>{var e,n,i,r=null===(n=null===(e=t.target)||void 0===e?void 0:e.closest)||void 0===n?void 0:n.call(e,"[data-vtilt-widget-action]");if(r){var s=r.getAttribute("data-vtilt-widget-type"),a=r.getAttribute("data-vtilt-widget-action");if(s&&a){var o=r;if(!o.disabled){t.preventDefault(),t.stopPropagation();var l=this.St.get(s);if(l){var h=r.closest(".vtilt-widget"),c={};h&&h.querySelectorAll("[data-vtilt-widget-field]").forEach(t=>{var e=t.getAttribute("data-vtilt-widget-field");e&&(c[e]=t.value)});var d=this.le(),u=null==h?void 0:h.closest("[data-vtilt-msg-id]");d.messageId=null!==(i=null==u?void 0:u.getAttribute("data-vtilt-msg-id"))&&void 0!==i?i:"",o.disabled=!0,o.style.opacity="0.6",l.onAction(a,c,d).then(t=>{t.success?(this.he(d.messageId,s,c),this.qt(),"escalate_to_human"!==s&&this.Yt(d.channelId)):this.qt()}).catch(()=>{this.qt()})}}}}}),null===(r=this.it)||void 0===r||r.addEventListener("keydown",t=>{var e=t;if("Enter"===e.key){var n=e.target;if("email"===(null==n?void 0:n.type)){t.preventDefault();var i=n.closest(".vtilt-widget"),r=null==i?void 0:i.querySelector("[data-vtilt-widget-action]");null==r||r.click()}}})}he(t,e,n){var i,r,s;if(t){var a=this.Pt.messages.find(e=>e.id===t);if(a){var o=null!==(i=a.metadata)&&void 0!==i?i:{},h=(null!==(s=null!==(r=o.et)&&void 0!==r?r:o.widgets)&&void 0!==s?s:[]).map(t=>{if(t.type!==e)return t;var i=l({},t,{submitted:!0});return n.email&&(i.submittedEmail=String(n.email).trim()),n.name&&(i.submittedName=String(n.name).trim()),i});a.metadata.widgets=h,o.et&&(a.metadata.et=h)}}}ce(){this.ut&&(this.Et||(this.Et=!0,this.de(!0)),this.kt&&clearTimeout(this.kt),this.kt=setTimeout(()=>{this.Et=!1,this.de(!1)},2e3))}de(t){this.ut&&this.ut.publish("typing",{sender_type:"user",sender_id:this.Ut,sender_name:null,is_typing:t}).catch(t=>{bi().warn(Ii,"failed to publish typing indicator:",t)})}ue(){var t,e,n=null===(t=this.it)||void 0===t?void 0:t.querySelector(".vtilt-chat-input");if(n){var i=n.value.trim();if(i){this.Et&&(this.Et=!1,this.de(!1)),this.kt&&(clearTimeout(this.kt),this.kt=null),this.sendMessage(i),n.value="",n.style.height="auto",n.style.height="60px",n.focus();var r=null===(e=this.it)||void 0===e?void 0:e.querySelector(".vtilt-chat-send");r&&(r.disabled=!0,r.style.background="#E5E5E5",r.style.color="#999999",r.style.cursor="not-allowed",r.style.opacity="0.6")}}}qt(){var t;if(this.nt&&this.it&&this.rt){this.Pt.isOpen&&this.se()?this.ae():(this.oe(),this.Pt.isOpen&&(this.nt.style.minWidth="60px",this.nt.style.minHeight="60px",requestAnimationFrame(()=>this.Lt()))),this.nt.style.display=this.Pt.isVisible?"block":"none",this.it.style.display=this.Pt.isOpen?"flex":"none",this.rt.style.display=this.Pt.isOpen?"none":"flex",this.Pt.isOpen||(this.nt.style.minWidth="",this.nt.style.minHeight="");var e=this.rt.querySelector(".vtilt-chat-badge");e&&(e.style.display=this.Pt.unreadCount>0?"flex":"none",e.textContent=String(this.Pt.unreadCount));var n=this.it.querySelector(".vtilt-chat-content");if(n)if("list"===this.Pt.currentView)n.innerHTML=this.ve(),this.fe();else n.querySelector(".vtilt-chat-input")||(n.innerHTML=this.pe(),this.ge()),this.me();this.we();var i=this.it.querySelector(".vtilt-chat-loader");i&&(i.style.display=this.Pt.isLoading?"flex":"none");var s=this.it.querySelector(".vtilt-chat-typing");if(s){s.style.display=this.Pt.isTyping&&"conversation"===this.Pt.currentView?"flex":"none";var a=s.querySelector(".vtilt-chat-typing-text");a&&this.Pt.isTyping&&("ai"===this.Pt.typingSenderType?a.textContent="AI is thinking...":this.Pt.typingSender?a.textContent=this.Pt.typingSender+" is typing...":a.textContent="Agent is typing...")}if("conversation"===this.Pt.currentView){var o="closed"===(null===(t=this.Pt.channel)||void 0===t?void 0:t.status),l=this.it.querySelector(".vtilt-chat-input-container"),h=this.it.querySelector(".vtilt-chat-closed-banner");if(o){if(l&&(l.style.display="none"),!h&&r){var c=r.createElement("div");c.className="vtilt-chat-closed-banner",c.style.cssText="padding: 12px 16px; padding-bottom: max(12px, env(safe-area-inset-bottom, 12px)); border-top: 1px solid #E5E5E5; text-align: center; background: #FAFAFA; flex-shrink: 0;",c.innerHTML='<span style="font-size: 14px; color: #888;">This conversation has been closed.</span>';var d=this.it.querySelector(".vtilt-chat-content");(null==d?void 0:d.parentNode)&&d.parentNode.appendChild(c)}}else l&&(l.style.display=""),h&&h.remove()}}}se(){return!!e&&e.innerWidth<=480}ae(){this.nt&&this.it&&(this.Mt||(this.Ot=this.nt.style.transform),this.nt.setAttribute("style","\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n z-index: 999999;\n font-family: "+this.ot.fontFamily+";\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n transform: none;\n "),this.it.setAttribute("style","\n flex-direction: column;\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n width: 100%;\n max-width: none;\n height: 100%;\n max-height: none;\n background: #ffffff;\n border-radius: 0;\n box-shadow: none;\n overflow: hidden;\n "),this.Mt=!0)}oe(){this.Mt&&this.nt&&this.it&&(this.nt.setAttribute("style",this._t),this.Ot&&(this.nt.style.transform=this.Ot),this.it.setAttribute("style","\n display: none;\n flex-direction: column;\n position: absolute;\n bottom: 0;\n right: 0;\n width: 380px;\n max-width: calc(100vw - 40px);\n height: 600px;\n max-height: calc(100vh - 40px);\n max-height: calc(100dvh - 40px);\n background: #ffffff;\n border-radius: 16px;\n box-shadow: 0 5px 40px rgba(0, 0, 0, 0.16);\n overflow: hidden;\n "),this.Mt=!1)}Ht(t){var n;if(this.se()&&r){var i=r.documentElement;t?(this.It=null!==(n=null==e?void 0:e.scrollY)&&void 0!==n?n:0,i.style.setProperty("overflow","hidden","important"),r.body.style.setProperty("overflow","hidden","important"),r.body.style.setProperty("position","fixed","important"),r.body.style.setProperty("width","100%","important"),r.body.style.top="-"+this.It+"px"):(i.style.removeProperty("overflow"),r.body.style.removeProperty("overflow"),r.body.style.removeProperty("position"),r.body.style.removeProperty("width"),r.body.style.top="",null==e||e.scrollTo(0,this.It))}}Lt(){if(this.nt&&this.it&&this.Pt.isOpen&&e&&!this.se()){var t=this.nt.getBoundingClientRect(),n="0",i="auto",r="0",s="auto",a=t.width-380,o=t.height-600,l=t.right-380,h=t.bottom-600;l<20&&(s=(a=20-t.left)+"px",r="auto"),h<20&&(i=(o=20-t.top)+"px",n="auto"),this.it.style.left=s,this.it.style.right=r,this.it.style.top=i,this.it.style.bottom=n;var c=t.width-a,d=t.height-o;this.it.style.transformOrigin=c+"px "+d+"px",this.it.style.maxWidth="",this.it.style.maxHeight=""}}we(){var t,e,n=null===(t=this.it)||void 0===t?void 0:t.querySelector(".vtilt-chat-header");if(n){var i=this.Nt.primaryColor;if("list"===this.Pt.currentView)n.style.cssText="\n background: #ffffff;\n border-bottom: 1px solid #E5E5E5;\n padding: 18px 16px;\n padding-top: max(18px, env(safe-area-inset-top, 18px));\n display: flex;\n align-items: center;\n justify-content: space-between;\n min-height: 60px;\n box-sizing: border-box;\n flex-shrink: 0;\n ",n.innerHTML='\n <div style="font-weight: 600; font-size: 17px; color: #000000;">Messages</div>\n <button class="vtilt-chat-close" style="\n background: transparent;\n border: none;\n color: #666666;\n cursor: pointer;\n padding: 6px;\n margin: -6px;\n border-radius: 4px;\n display: flex;\n align-items: center;\n justify-content: center;\n -webkit-tap-highlight-color: transparent;\n ">\n <svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">\n <path d="M18 6L6 18M6 6l12 12"></path>\n </svg>\n </button>\n ';else{var r=null===(e=this.Pt.channel)||void 0===e?void 0:e.ai_mode;n.style.cssText="\n background: #ffffff;\n border-bottom: 1px solid #E5E5E5;\n padding: 12px 16px;\n padding-top: max(12px, env(safe-area-inset-top, 12px));\n display: flex;\n align-items: center;\n gap: 12px;\n min-height: 60px;\n box-sizing: border-box;\n flex-shrink: 0;\n ",n.innerHTML='\n <button class="vtilt-chat-back" style="\n background: transparent;\n border: none;\n color: #666666;\n cursor: pointer;\n padding: 6px;\n margin-left: -6px;\n border-radius: 4px;\n display: flex;\n align-items: center;\n justify-content: center;\n -webkit-tap-highlight-color: transparent;\n ">\n <svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">\n <path d="M15 18l-6-6 6-6"></path>\n </svg>\n </button>\n <div style="\n width: 44px;\n height: 44px;\n border-radius: 50%;\n background: '+(r?i:"#DEDEDE")+';\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n ">\n '+(r?'<svg width="22" height="22" viewBox="0 0 24 24" fill="white"><path d="M12 2a2 2 0 0 1 2 2c0 .74-.4 1.39-1 1.73V7h1a7 7 0 0 1 7 7h1a1 1 0 0 1 1 1v3a1 1 0 0 1-1 1h-1v1a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-1H2a1 1 0 0 1-1-1v-3a1 1 0 0 1 1-1h1a7 7 0 0 1 7-7h1V5.73c-.6-.34-1-.99-1-1.73a2 2 0 0 1 2-2M7.5 13A1.5 1.5 0 0 0 6 14.5A1.5 1.5 0 0 0 7.5 16A1.5 1.5 0 0 0 9 14.5A1.5 1.5 0 0 0 7.5 13m9 0a1.5 1.5 0 0 0-1.5 1.5a1.5 1.5 0 0 0 1.5 1.5a1.5 1.5 0 0 0 1.5-1.5a1.5 1.5 0 0 0-1.5-1.5"/></svg>':'<svg width="22" height="22" viewBox="0 0 24 24" fill="#666"><path d="M12 4a4 4 0 0 1 4 4a4 4 0 0 1-4 4a4 4 0 0 1-4-4a4 4 0 0 1 4-4m0 10c4.42 0 8 1.79 8 4v2H4v-2c0-2.21 3.58-4 8-4"/></svg>')+'\n </div>\n <div style="flex: 1; min-width: 0;">\n <div style="font-weight: 600; font-size: 16px; color: #000000;">'+(r?"AI Assistant":"Support")+'</div>\n <div style="font-size: 13px; color: #16A34A; display: flex; align-items: center; gap: 5px; margin-top: 1px;">\n <span style="width: 7px; height: 7px; background: #16A34A; border-radius: 50%;"></span>\n Online\n </div>\n </div>\n <button class="vtilt-chat-close" style="\n background: transparent;\n border: none;\n color: #666666;\n cursor: pointer;\n padding: 6px;\n margin-right: -6px;\n border-radius: 4px;\n display: flex;\n align-items: center;\n justify-content: center;\n -webkit-tap-highlight-color: transparent;\n ">\n <svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">\n <path d="M18 6L6 18M6 6l12 12"></path>\n </svg>\n </button>\n '}var s=n.querySelector(".vtilt-chat-close");null==s||s.addEventListener("click",()=>this.close());var a=n.querySelector(".vtilt-chat-back");null==a||a.addEventListener("click",()=>this.goToChannelList())}}ve(){var t=this.Nt.primaryColor,e=this.jt.greeting||"Hi! How can we help you today?";return 0!==this.Pt.channels.length||this.Pt.isLoading?'\n <div style="flex: 1; overflow-y: auto; -webkit-overflow-scrolling: touch;">\n '+this.Pt.channels.map(t=>this.ye(t)).join("")+'\n </div>\n <div style="\n padding: 16px;\n padding-bottom: max(16px, env(safe-area-inset-bottom, 16px));\n border-top: 1px solid #E5E5E5;\n ">\n <button class="vtilt-chat-new-channel" style="\n width: 100%;\n background: '+t+";\n color: white;\n border: none;\n border-radius: 100px;\n padding: 14px 24px;\n cursor: pointer;\n font-weight: 500;\n font-size: 15px;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 10px;\n -webkit-tap-highlight-color: transparent;\n touch-action: manipulation;\n box-shadow: 0 2px 8px "+t+'4D;\n ">\n Send us a message\n <svg width="18" height="18" viewBox="0 0 24 24" fill="white">\n <path d="M2.01 21L23 12 2.01 3 2 10l15 2-15 2z"/>\n </svg>\n </button>\n </div>\n ':'\n <div style="\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 48px 24px;\n text-align: center;\n ">\n <div style="\n width: 72px;\n height: 72px;\n margin-bottom: 24px;\n background: '+t+';\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n ">\n <svg width="36" height="36" viewBox="0 0 24 24" fill="white">\n <path d="M20 2H4c-1.1 0-2 .9-2 2v18l4-4h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm0 14H6l-2 2V4h16v12z"/>\n </svg>\n </div>\n <div style="font-size: 18px; font-weight: 600; color: #000000; margin-bottom: 12px; line-height: 1.4; max-width: 280px;">'+this.be(e)+'</div>\n <div style="font-size: 14px; color: #666666; margin-bottom: 28px;">Start a conversation with us</div>\n <button class="vtilt-chat-new-channel" style="\n background: '+t+";\n color: white;\n border: none;\n border-radius: 100px;\n padding: 14px 28px;\n cursor: pointer;\n font-weight: 500;\n font-size: 15px;\n -webkit-tap-highlight-color: transparent;\n touch-action: manipulation;\n display: flex;\n align-items: center;\n gap: 10px;\n box-shadow: 0 2px 8px "+t+'4D;\n ">\n Send us a message\n <svg width="18" height="18" viewBox="0 0 24 24" fill="white">\n <path d="M2.01 21L23 12 2.01 3 2 10l15 2-15 2z"/>\n </svg>\n </button>\n </div>\n '}ye(t){var e=t.unread_count>0,n=this.xe(t.last_message_at||t.created_at),i=t.last_message_preview||"No messages yet",r=this.Nt.primaryColor,s="user"===t.last_message_sender?"You: ":"";return'\n <div class="vtilt-channel-item" data-channel-id="'+t.id+'" style="\n padding: 14px 16px;\n cursor: pointer;\n -webkit-tap-highlight-color: transparent;\n touch-action: manipulation;\n display: flex;\n align-items: center;\n gap: 12px;\n background: white;\n border-bottom: 1px solid #EEEEEE;\n ">\n <div style="\n width: 48px;\n height: 48px;\n border-radius: 50%;\n background: '+(t.ai_mode?r:"#DEDEDE")+';\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n ">\n '+(t.ai_mode?'<svg width="24" height="24" viewBox="0 0 24 24" fill="white"><path d="M12 2a2 2 0 0 1 2 2c0 .74-.4 1.39-1 1.73V7h1a7 7 0 0 1 7 7h1a1 1 0 0 1 1 1v3a1 1 0 0 1-1 1h-1v1a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-1H2a1 1 0 0 1-1-1v-3a1 1 0 0 1 1-1h1a7 7 0 0 1 7-7h1V5.73c-.6-.34-1-.99-1-1.73a2 2 0 0 1 2-2M7.5 13A1.5 1.5 0 0 0 6 14.5A1.5 1.5 0 0 0 7.5 16A1.5 1.5 0 0 0 9 14.5A1.5 1.5 0 0 0 7.5 13m9 0a1.5 1.5 0 0 0-1.5 1.5a1.5 1.5 0 0 0 1.5 1.5a1.5 1.5 0 0 0 1.5-1.5a1.5 1.5 0 0 0-1.5-1.5"/></svg>':'<svg width="24" height="24" viewBox="0 0 24 24" fill="#666"><path d="M12 4a4 4 0 0 1 4 4a4 4 0 0 1-4 4a4 4 0 0 1-4-4a4 4 0 0 1 4-4m0 10c4.42 0 8 1.79 8 4v2H4v-2c0-2.21 3.58-4 8-4"/></svg>')+'\n </div>\n <div style="flex: 1; min-width: 0;">\n <div style="display: flex; justify-content: space-between; align-items: center; gap: 8px; margin-bottom: 4px;">\n <div style="font-weight: '+(e?"600":"500")+'; font-size: 15px; color: #000000; line-height: 1.2; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;">\n '+(t.ai_mode?"AI Assistant":"Support")+'\n </div>\n <div style="font-size: 13px; color: #888888; white-space: nowrap; flex-shrink: 0;">'+n+'</div>\n </div>\n <div style="display: flex; justify-content: space-between; align-items: center; gap: 8px;">\n <div style="\n font-size: 14px;\n color: '+(e?"#333333":"#888888")+';\n font-weight: 400;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n flex: 1;\n min-width: 0;\n line-height: 1.4;\n ">'+s+this.be(i)+("closed"===t.status?" · Closed":"")+"</div>\n "+(e?'<div style="\n min-width: 20px;\n height: 20px;\n padding: 0 6px;\n background: '+r+';\n border-radius: 10px;\n flex-shrink: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 12px;\n font-weight: 600;\n color: #FFFFFF;\n line-height: 1;\n ">'+(t.unread_count>99?"99+":t.unread_count)+"</div>":"")+"\n </div>\n </div>\n </div>\n "}pe(){return'\n <div class="vtilt-chat-messages" style="\n flex: 1;\n overflow-y: auto;\n -webkit-overflow-scrolling: touch;\n padding: 20px 16px 24px 16px;\n display: flex;\n flex-direction: column;\n gap: 12px;\n min-height: 0;\n background: #FAFAFA;\n "></div>\n \n <div class="vtilt-chat-typing" style="\n display: none;\n padding: 12px 16px;\n background: #FAFAFA;\n align-items: center;\n ">\n <div style="\n display: flex;\n align-items: center;\n gap: 6px;\n ">\n <span style="width: 7px; height: 7px; background: #999; border-radius: 50%; animation: vtilt-typing 1.2s infinite 0s;"></span>\n <span style="width: 7px; height: 7px; background: #999; border-radius: 50%; animation: vtilt-typing 1.2s infinite 0.2s;"></span>\n <span style="width: 7px; height: 7px; background: #999; border-radius: 50%; animation: vtilt-typing 1.2s infinite 0.4s;"></span>\n <span class="vtilt-chat-typing-text" style="\n font-size: 12px;\n color: #666;\n font-weight: 500;\n white-space: nowrap;\n margin-left: 2px;\n ">Agent is typing...</span>\n </div>\n </div>\n <style>\n @keyframes vtilt-typing { 0%, 60%, 100% { opacity: 0.35; transform: translateY(0); } 30% { opacity: 1; transform: translateY(-2px); } }\n </style>\n \n <div class="vtilt-chat-input-container" style="\n padding: 8px 12px;\n padding-bottom: max(8px, env(safe-area-inset-bottom, 8px));\n border-top: 1px solid #E5E5E5;\n flex-shrink: 0;\n background: #ffffff;\n ">\n <div style="\n position: relative;\n border: 1px solid #DDDDDD;\n border-radius: 12px;\n background: #ffffff;\n overflow: hidden;\n ">\n <textarea\n class="vtilt-chat-input"\n placeholder="Message..."\n autocomplete="off"\n autocorrect="on"\n autocapitalize="sentences"\n rows="1"\n style="\n width: 100%;\n box-sizing: border-box;\n border: none;\n border-radius: 0;\n padding: 12px 12px 36px 12px;\n font-size: 16px;\n line-height: 1.4;\n outline: none;\n background: transparent;\n -webkit-appearance: none;\n appearance: none;\n color: #000000;\n transition: none;\n resize: none;\n overflow-y: auto;\n overflow-x: hidden;\n min-height: 60px;\n max-height: 120px;\n font-family: inherit;\n "\n ></textarea>\n <div style="\n position: absolute;\n left: 0;\n bottom: 0;\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 0 8px 10px;\n pointer-events: none;\n z-index: 1;\n ">\n <button\n class="vtilt-chat-attach"\n style="\n background: none;\n border: none;\n padding: 0;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 20px;\n height: 20px;\n pointer-events: auto;\n color: #666666;\n transition: color 0.15s ease;\n "\n title="Attach file"\n >\n <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">\n <path d="M21.44 11.05l-9.19 9.19a6 6 0 0 1-8.49-8.49l9.19-9.19a4 4 0 0 1 5.66 5.66l-9.2 9.19a2 2 0 0 1-2.83-2.83l8.49-8.48"></path>\n </svg>\n </button>\n <button\n class="vtilt-chat-mic"\n style="\n background: none;\n border: none;\n padding: 0;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 20px;\n height: 20px;\n pointer-events: auto;\n color: #666666;\n transition: color 0.15s ease;\n "\n title="Voice message"\n >\n <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">\n <path d="M12 1a3 3 0 0 0-3 3v8a3 3 0 0 0 6 0V4a3 3 0 0 0-3-3z"></path>\n <path d="M19 10v2a7 7 0 0 1-14 0v-2"></path>\n <line x1="12" y1="19" x2="12" y2="23"></line>\n <line x1="8" y1="23" x2="16" y2="23"></line>\n </svg>\n </button>\n </div>\n <button class="vtilt-chat-send" disabled style="\n position: absolute;\n right: 0;\n bottom: 0;\n background: #E5E5E5;\n color: #999999;\n border: none;\n border-radius: 50%;\n padding: 0;\n width: 32px;\n height: 32px;\n margin: 6px 8px 6px 6px;\n cursor: not-allowed;\n display: flex;\n align-items: center;\n justify-content: center;\n -webkit-tap-highlight-color: transparent;\n touch-action: manipulation;\n z-index: 2;\n transition: background-color 0.15s ease, color 0.15s ease, transform 0.1s ease, cursor 0.15s ease;\n opacity: 0.6;\n ">\n <svg width="16" height="16" viewBox="0 0 24 24" fill="currentColor">\n <path d="M2.01 21L23 12 2.01 3 2 10l15 2-15 2z"/>\n </svg>\n </button>\n </div>\n </div>\n '}fe(){var t,e,n,i;null===(e=null===(t=this.it)||void 0===t?void 0:t.querySelector(".vtilt-chat-new-channel"))||void 0===e||e.addEventListener("click",()=>this.createChannel()),null===(i=null===(n=this.it)||void 0===n?void 0:n.querySelectorAll(".vtilt-channel-item"))||void 0===i||i.forEach(t=>{t.addEventListener("click",()=>{var e=t.getAttribute("data-channel-id");e&&this.selectChannel(e)})})}ge(){var t,e,n,i,r,s,a,o,l,h,c=null===(t=this.it)||void 0===t?void 0:t.querySelector(".vtilt-chat-send");null==c||c.addEventListener("click",()=>{c.disabled||this.ue()});var d=null===(e=this.it)||void 0===e?void 0:e.querySelector(".vtilt-chat-input");null===(i=null===(n=this.it)||void 0===n?void 0:n.querySelector(".vtilt-chat-attach"))||void 0===i||i.addEventListener("click",t=>{t.preventDefault(),alert("File attachments coming soon!")}),null===(s=null===(r=this.it)||void 0===r?void 0:r.querySelector(".vtilt-chat-emoji"))||void 0===s||s.addEventListener("click",t=>{t.preventDefault(),bi().debug(Ii,"emoji clicked (not implemented)")}),null===(o=null===(a=this.it)||void 0===a?void 0:a.querySelector(".vtilt-chat-gif"))||void 0===o||o.addEventListener("click",t=>{t.preventDefault(),bi().debug(Ii,"GIF clicked (not implemented)")}),null===(h=null===(l=this.it)||void 0===l?void 0:l.querySelector(".vtilt-chat-mic"))||void 0===h||h.addEventListener("click",t=>{t.preventDefault(),alert("Voice messages coming soon!")});var u=()=>{if(d){d.style.height="auto";var t=d.scrollHeight;d.style.height=Math.min(Math.max(t,60),120)+"px"}},v=this.Nt.primaryColor,f=()=>{var t,e=null===(t=this.it)||void 0===t?void 0:t.querySelector(".vtilt-chat-send");if(e&&d){var n=d.value.trim().length>0;e.disabled=!n,n?(e.style.background=v||"#E5E5E5",e.style.color="white",e.style.cursor="pointer",e.style.opacity="1"):(e.style.background="#E5E5E5",e.style.color="#999999",e.style.cursor="not-allowed",e.style.opacity="0.6")}};null==d||d.addEventListener("input",()=>{u(),this.ce(),f()}),null==d||d.addEventListener("keydown",t=>{"Enter"!==t.key||t.shiftKey||(t.preventDefault(),this.ue())}),d&&(u(),f())}xe(t){var e=new Date(t),n=(new Date).getTime()-e.getTime(),i=Math.floor(n/6e4),r=Math.floor(n/36e5),s=Math.floor(n/864e5);return i<1?"Just now":i<60?i+"m ago":r<24?r+"h ago":s<7?s+"d ago":e.toLocaleDateString()}me(){var t,e=null===(t=this.it)||void 0===t?void 0:t.querySelector(".vtilt-chat-messages");if(e){var n=this.Nt.primaryColor,i=this.Pt.messages.findIndex(t=>("agent"===t.sender_type||"ai"===t.sender_type)&&!this.Xt(t.created_at)),r=this.Pt.messages.map((t,e)=>(e===i&&i>0?'<div style="display:flex;align-items:center;gap:12px;margin:12px 0"><div style="flex:1;height:1px;background:#DDD"></div><span style="font-size:12px;font-weight:600;color:'+n+'">New</span><div style="flex:1;height:1px;background:#DDD"></div></div>':"")+this.ke(t)).join("");e.innerHTML=r,e.scrollTop=e.scrollHeight}}ke(t){var e="user"===t.sender_type,n="ai"===t.sender_type,i=e&&this.Ee(t.created_at),r=this.Nt.primaryColor;if(e)return'\n <div class="vtilt-msg" style="\n display: flex;\n flex-direction: column;\n align-items: flex-end;\n ">\n <div style="\n max-width: 80%;\n padding: 12px 16px;\n background: '+r+";\n color: white;\n border-radius: 20px 20px 4px 20px;\n font-size: 15px;\n line-height: 1.45;\n word-wrap: break-word;\n overflow-wrap: break-word;\n white-space: "+(g(t)?"normal":"pre-wrap")+';\n ">'+this.Te(t)+'</div>\n <div style="font-size: 12px; color: #888888; margin-top: 6px; display: flex; align-items: center; gap: 4px;">\n '+this.Ae(t.created_at)+"\n "+(i?'<svg width="14" height="14" viewBox="0 0 24 24" fill="'+r+'"><path d="M18 7l-1.41-1.41-6.34 6.34 1.41 1.41L18 7zm4.24-1.41L11.66 16.17 7.48 12l-1.41 1.41L11.66 19l12-12-1.42-1.41zM.41 13.41L6 19l1.41-1.41L1.83 12 .41 13.41z"/></svg>':"")+"\n </div>\n </div>\n ";var s=n?"AI Assistant":t.sender_name||"Support";return'\n <div class="vtilt-msg" style="\n display: flex;\n gap: 10px;\n align-items: flex-end;\n ">\n <div style="\n width: 32px;\n height: 32px;\n border-radius: 50%;\n background: '+(n?r:"#DEDEDE")+';\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n ">\n '+(n?'<svg width="16" height="16" viewBox="0 0 24 24" fill="white"><path d="M12 2a2 2 0 0 1 2 2c0 .74-.4 1.39-1 1.73V7h1a7 7 0 0 1 7 7h1a1 1 0 0 1 1 1v3a1 1 0 0 1-1 1h-1v1a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-1H2a1 1 0 0 1-1-1v-3a1 1 0 0 1 1-1h1a7 7 0 0 1 7-7h1V5.73c-.6-.34-1-.99-1-1.73a2 2 0 0 1 2-2M7.5 13A1.5 1.5 0 0 0 6 14.5A1.5 1.5 0 0 0 7.5 16A1.5 1.5 0 0 0 9 14.5A1.5 1.5 0 0 0 7.5 13m9 0a1.5 1.5 0 0 0-1.5 1.5a1.5 1.5 0 0 0 1.5 1.5a1.5 1.5 0 0 0 1.5-1.5a1.5 1.5 0 0 0-1.5-1.5"/></svg>':'<svg width="16" height="16" viewBox="0 0 24 24" fill="#666"><path d="M12 4a4 4 0 0 1 4 4a4 4 0 0 1-4 4a4 4 0 0 1-4-4a4 4 0 0 1 4-4m0 10c4.42 0 8 1.79 8 4v2H4v-2c0-2.21 3.58-4 8-4"/></svg>')+'\n </div>\n <div style="flex: 1; min-width: 0; display: flex; flex-direction: column; align-items: flex-start;">\n <div style="\n max-width: 85%;\n padding: 12px 16px;\n background: #ffffff;\n color: #000000;\n border-radius: 20px 20px 20px 4px;\n font-size: 15px;\n line-height: 1.45;\n word-wrap: break-word;\n overflow-wrap: break-word;\n ">'+this.Te(t)+this.Se(t)+'</div>\n <div style="font-size: 12px; color: #888888; margin-top: 6px; margin-left: 4px;">\n '+s+" · "+this.Ae(t.created_at)+"\n </div>\n </div>\n </div>\n "}Ee(t){return!!this.Pt.agentLastReadAt&&new Date(t)<=new Date(this.Pt.agentLastReadAt)}Qt(t,e,n){var i=this;return o(function*(){var r,s,a,o,l,h={id:"temp-ai-"+Date.now(),channel_id:n,sender_type:"ai",sender_id:null,sender_name:"AI Assistant",sender_avatar_url:null,content:"",content_type:"text",metadata:{},created_at:(new Date).toISOString()};i.Pt.messages.push(h),i.qt();var c=null===(r=t.body)||void 0===r?void 0:r.getReader();if(!c)return bi().error(Ii,"no response body reader available"),void i.Ce(h.id);var d=new TextDecoder,u="",v=null;try{for(;;){var{done:f,value:p}=yield c.read();if(f)break;var g=d.decode(p,{stream:!0});u+=g,v||(v=setTimeout(()=>{var t=i.Pt.messages.findIndex(t=>t.id===h.id);-1!==t&&(i.Pt.messages[t].content=u.replace(/<[^>]*$/,""),i.qt()),v=null},50))}var m=i.Pt.messages.findIndex(t=>t.id===h.id);if(-1!==m){var w=i._e(u);i.Pt.messages[m].content=u,w.length>0&&(i.Pt.messages[m].metadata.et=w),i.qt()}null===(a=(s=i.jt).onMessageSent)||void 0===a||a.call(s,{channelId:n,messageId:e.id}),i.zt(e,n,null===(l=null===(o=i.Pt.channel)||void 0===o?void 0:o.ai_mode)||void 0===l||l)}catch(t){bi().error(Ii,"failed to handle streaming response:",t),i.Ce(h.id)}finally{c.releaseLock(),v&&clearTimeout(v)}})()}Ce(t){this.Pt.messages=this.Pt.messages.filter(e=>e.id!==t),this.qt()}Ft(){return 0}Te(t){var e,n=null!==(e=t.content)&&void 0!==e?e:"";return g(t)?'<div class="vtilt-md'+("user"===t.sender_type?" vtilt-user-md":"")+'">'+this.Oe(n,t.content_type)+"</div>":this.be(n)}Oe(t,e){return void 0===e&&(e="text"),v(t.replace(ji,"").trim(),e,null!=r?r:null)}Se(t){var e,n=null!==(e=t.metadata)&&void 0!==e?e:{},i=n.et;if(i&&0!==i.length||(i=n.widgets),i&&0!==i.length||!t.content||(i=this._e(t.content)),!i||0===i.length)return"";var r=this.le();return r.messageId=t.id,i.map(t=>{if(t.submitted){if("collect_email"===t.type){var e=t.submittedEmail?String(t.submittedEmail).replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">"):"",n=t.submittedName?String(t.submittedName).replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">"):"";return'<div class="vtilt-widget"><p style="margin:0; font-size:13px; color:#16a34a;">'+(n?"✓ Thanks, "+n+"! We'll follow up at "+e+".":e?"✓ Thanks! We'll follow up at "+e+".":"✓ Thanks!")+"</p></div>"}return"escalate_to_human"===t.type?'<div class="vtilt-widget"><p style="margin:0; font-size:13px; color:#16a34a;">✓ A team member has been notified. They\'ll join shortly.</p></div>':'<div class="vtilt-widget"><p style="margin:0; font-size:13px; color:#16a34a;">✓ Done</p></div>'}var i=this.St.get(t.type);return i?i.render(t.params,r):""}).join("")}le(){var t,e,n=this._instance.getConfig();return{channelId:null!==(e=null===(t=this.Pt.channel)||void 0===t?void 0:t.id)&&void 0!==e?e:"",distinctId:this.Ut,primaryColor:this.Nt.primaryColor||"#7B68EE",apiBase:n.api_host||"",token:n.token||"",messageId:"",buildEndpointUrl:t=>w(this._instance.getConfig(),t)}}_e(t){for(var e,n,i=[],r=new RegExp(ji.source,"g");null!==(n=r.exec(t));)try{var s=JSON.parse(n[1]);s.type&&i.push({type:s.type,params:null!==(e=s.params)&&void 0!==e?e:{}})}catch(t){}return i}registerWidget(t){this.St.register(t)}be(t){if(!r)return t;var e=r.createElement("div");return e.textContent=t,e.innerHTML}Gt(t){var e,n,i,r,s=(i=t.content||"",void 0===r&&(r=100),i.replace(/\n?<!--vtilt:widget:[\s\S]*?-->/g,"").replace(/<[^>]*>/g,"").trim().substring(0,r));if(s)return s;var a=null!==(e=t.metadata)&&void 0!==e?e:{},o=null!==(n=a.et)&&void 0!==n?n:a.widgets;return o&&o.length>0?o.map(t=>"collect_email"===t.type?t.submitted&&t.submittedEmail?"Contact collected: "+(t.submittedName?t.submittedName+" ("+t.submittedEmail+")":t.submittedEmail):"Asked for contact info":"escalate_to_human"===t.type?t.submitted?"Escalated to human agent":"Offered human escalation":t.type.replace(/_/g," ")).join(", "):""}Ae(t){if(null==t||""===t)return"";var e=new Date(t);return Number.isNaN(e.getTime())?"":e.toLocaleTimeString([],{hour:"2-digit",minute:"2-digit"})}}function Bi(t,e){return new Di(t,e)}s.__VTiltExtensions__=s.__VTiltExtensions__||{},s.__VTiltExtensions__.initChat=Bi,t.LazyLoadedChat=Di,t.default=Bi,t.initChat=Bi,Object.defineProperty(t,"__esModule",{value:!0})}({});
|
|
1
|
+
!function(t){"use strict";var e="undefined"!=typeof window?window:void 0,n="undefined"!=typeof globalThis?globalThis:e,i=null==n?void 0:n.navigator,r=null==n?void 0:n.document;null==n||n.location,null==n||n.fetch,e&&r&&r.createElement,null==n||n.XMLHttpRequest,null==n||n.AbortController,null==i||i.userAgent;var o=null!=e?e:{};function a(t,e,n,i,r,o,a){try{var s=t[o](a),l=s.value}catch(t){return void n(t)}s.done?e(l):Promise.resolve(l).then(i,r)}function s(t){return function(){var e=this,n=arguments;return new Promise(function(i,r){var o=t.apply(e,n);function s(t){a(o,i,r,s,l,"next",t)}function l(t){a(o,i,r,s,l,"throw",t)}s(void 0)})}}function l(){return l=Object.assign?Object.assign.bind():function(t){for(var e=1;e<arguments.length;e++){var n=arguments[e];for(var i in n)({}).hasOwnProperty.call(n,i)&&(t[i]=n[i])}return t},l.apply(null,arguments)}var u="x-api-key";function h(t,e,n){void 0===n&&(n={});var{api_host:i,token:r}=t,o=""+(i?i.replace(/\/+$/gm,""):"")+e;if(n.includeTokenQuery&&r){var a=o.includes("?")?"&":"?";o=""+o+a+"token="+r}return o}function c(t){return t.token?{[u]:t.token}:{}}var d={none:0,error:1,warn:2,info:3,debug:4},v="[vTilt]",f=new Set(["none","error","warn","info","debug"]);function p(){return"undefined"!=typeof console}function g(t){var e=t.length>0&&"string"==typeof t[0]?t[0]:"",n=e?t.slice(1):t;return[e?v+":"+e:v,...n]}var m="warn",b=!1;var y=null;function w(){return y||(y={setLevel(t,e){void 0===e&&(e=!1),m=t,e&&(b=!0)},setLevelFromRemote(t){b||t&&f.has(t)&&(m=t)},getLevel:()=>m,isLockedByInit:()=>b,debug(){if(!(d[m]<d.debug)&&p()){for(var t=arguments.length,e=new Array(t),n=0;n<t;n++)e[n]=arguments[n];console.log(...g(e))}},info(){if(!(d[m]<d.info)&&p()){for(var t=arguments.length,e=new Array(t),n=0;n<t;n++)e[n]=arguments[n];console.log(...g(e))}},warn(){if(!(d[m]<d.warn)&&p()){for(var t=arguments.length,e=new Array(t),n=0;n<t;n++)e[n]=arguments[n];console.warn(...g(e))}},error(){if(!(d[m]<d.error)&&p()){for(var t=arguments.length,e=new Array(t),n=0;n<t;n++)e[n]=arguments[n];console.error(...g(e))}}}),y}var x="/api/chat/widget/channels",k=t=>"/api/chat/widget/channels/"+t+"/messages",S=t=>"/api/chat/widget/channels/"+t+"/read",_="/api/chat/token/widget";function T(t,e,n){return C.apply(this,arguments)}function C(){return(C=s(function*(t,e,n){void 0===n&&(n={});var i=t.getConfig(),r=h(i,e);try{var o=yield fetch(r,l({},n,{headers:l({"Content-Type":"application/json"},c(i),n.headers)}));if(!o.ok)throw new Error("API error: "+o.status);return yield o.json()}catch(t){return w().error("chat","API request failed:",t),null}})).apply(this,arguments)}var A="rich_format",E="markdown",O=/^[a-zA-Z0-9_-]{1,64}$/;function I(t){return"user"===t.sender_type?function(t){var e;return"html"===t.content_type||(null===(e=t.metadata)||void 0===e?void 0:e[A])===E}(t):"ai"===t.sender_type||"agent"===t.sender_type}function M(t,e){var n,i=function(t){return"string"==typeof t?{raw:t,format:"text"}:"markdown"in t?{raw:t.markdown,format:"markdown"}:"html"in t?{raw:t.html,format:"html"}:"text"in t?{raw:t.text,format:"text"}:null}(t);if(!i)return null;var r="string"==typeof t?null!==(n=null==e?void 0:e.format)&&void 0!==n?n:"text":i.format,o=i.raw.trim();if(!o)return null;var a={};if(null==e?void 0:e.source){var s=function(t){var e=t.trim();if(O.test(e))return e}(e.source);s&&(a.message_source=s)}return"html"===r?{content:o,content_type:"html",metadata:a}:"markdown"===r?(a[A]=E,{content:o,content_type:"text",metadata:a}):{content:o,content_type:"text",metadata:a}}var P="$channel_message";class D{constructor(){this.k=new Map}register(t){this.k.has(t.type)||this.k.set(t.type,t)}get(t){return this.k.get(t)}getAll(){return Array.from(this.k.values())}getToolDefinitions(){var t={};for(var e of this.k.values())t[e.type]={description:e.toolDescription,parameters:e.parameters};return t}}var R,j,N,U,B,z,q,F,H,L,W,J,V,K,G,Q={},Y=[],X=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i,Z=Array.isArray;function tt(t,e){for(var n in e)t[n]=e[n];return t}function et(t){t&&t.parentNode&&t.parentNode.removeChild(t)}function nt(t,e,n){var i,r,o,a={};for(o in e)"key"==o?i=e[o]:"ref"==o?r=e[o]:a[o]=e[o];if(arguments.length>2&&(a.children=arguments.length>3?R.call(arguments,2):n),"function"==typeof t&&null!=t.defaultProps)for(o in t.defaultProps)void 0===a[o]&&(a[o]=t.defaultProps[o]);return it(t,a,i,r,null)}function it(t,e,n,i,r){var o={type:t,props:e,key:n,ref:i,__k:null,__:null,__b:0,__e:null,__c:null,constructor:void 0,__v:null==r?++N:r,__i:-1,__u:0};return null==r&&null!=j.vnode&&j.vnode(o),o}function rt(t){return t.children}function ot(t,e){this.props=t,this.context=e}function $(t,e){if(null==e)return t.__?$(t.__,t.__i+1):null;for(var n;e<t.__k.length;e++)if(null!=(n=t.__k[e])&&null!=n.__e)return n.__e;return"function"==typeof t.type?$(t):null}function at(t){if(t.__P&&t.__d){var e=t.__v,n=e.__e,i=[],r=[],o=tt({},e);o.__v=e.__v+1,j.vnode&&j.vnode(o),mt(t.__P,o,e,t.__n,t.__P.namespaceURI,32&e.__u?[n]:null,i,null==n?$(e):n,!!(32&e.__u),r),o.__v=e.__v,o.__.__k[o.__i]=o,yt(i,o,r),e.__e=e.__=null,o.__e!=n&&st(o)}}function st(t){if(null!=(t=t.__)&&null!=t.__c)return t.__e=t.__c.base=null,t.__k.some(function(e){if(null!=e&&null!=e.__e)return t.__e=t.__c.base=e.__e}),st(t)}function lt(t){(!t.__d&&(t.__d=!0)&&B.push(t)&&!ut.__r++||z!=j.debounceRendering)&&((z=j.debounceRendering)||q)(ut)}function ut(){try{for(var t,e=1;B.length;)B.length>e&&B.sort(F),t=B.shift(),e=B.length,at(t)}finally{B.length=ut.__r=0}}function ht(t,e,n,i,r,o,a,s,l,u,h){var c,d,v,f,p,g,m,b=i&&i.__k||Y,y=e.length;for(l=function(t,e,n,i,r){var o,a,s,l,u,h=n.length,c=h,d=0;for(t.__k=new Array(r),o=0;o<r;o++)null!=(a=e[o])&&"boolean"!=typeof a&&"function"!=typeof a?("string"==typeof a||"number"==typeof a||"bigint"==typeof a||a.constructor==String?a=t.__k[o]=it(null,a,null,null,null):Z(a)?a=t.__k[o]=it(rt,{children:a},null,null,null):void 0===a.constructor&&a.__b>0?a=t.__k[o]=it(a.type,a.props,a.key,a.ref?a.ref:null,a.__v):t.__k[o]=a,l=o+d,a.__=t,a.__b=t.__b+1,s=null,-1!=(u=a.__i=vt(a,n,l,c))&&(c--,(s=n[u])&&(s.__u|=2)),null==s||null==s.__v?(-1==u&&(r>h?d--:r<h&&d++),"function"!=typeof a.type&&(a.__u|=4)):u!=l&&(u==l-1?d--:u==l+1?d++:(u>l?d--:d++,a.__u|=4))):t.__k[o]=null;if(c)for(o=0;o<h;o++)null!=(s=n[o])&&!(2&s.__u)&&(s.__e==i&&(i=$(s)),St(s,s));return i}(n,e,b,l,y),c=0;c<y;c++)null!=(v=n.__k[c])&&(d=-1!=v.__i&&b[v.__i]||Q,v.__i=c,g=mt(t,v,d,r,o,a,s,l,u,h),f=v.__e,v.ref&&d.ref!=v.ref&&(d.ref&&kt(d.ref,null,v),h.push(v.ref,v.__c||f,v)),null==p&&null!=f&&(p=f),(m=!!(4&v.__u))||d.__k===v.__k?(l=ct(v,l,t,m),m&&d.__e&&(d.__e=null)):"function"==typeof v.type&&void 0!==g?l=g:f&&(l=f.nextSibling),v.__u&=-7);return n.__e=p,l}function ct(t,e,n,i){var r,o;if("function"==typeof t.type){for(r=t.__k,o=0;r&&o<r.length;o++)r[o]&&(r[o].__=t,e=ct(r[o],e,n,i));return e}t.__e!=e&&(i&&(e&&t.type&&!e.parentNode&&(e=$(t)),n.insertBefore(t.__e,e||null)),e=t.__e);do{e=e&&e.nextSibling}while(null!=e&&8==e.nodeType);return e}function dt(t,e){return e=e||[],null==t||"boolean"==typeof t||(Z(t)?t.some(function(t){dt(t,e)}):e.push(t)),e}function vt(t,e,n,i){var r,o,a,s=t.key,l=t.type,u=e[n],h=null!=u&&!(2&u.__u);if(null===u&&null==s||h&&s==u.key&&l==u.type)return n;if(i>(h?1:0))for(r=n-1,o=n+1;r>=0||o<e.length;)if(null!=(u=e[a=r>=0?r--:o++])&&!(2&u.__u)&&s==u.key&&l==u.type)return a;return-1}function ft(t,e,n){"-"==e[0]?t.setProperty(e,null==n?"":n):t[e]=null==n?"":"number"!=typeof n||X.test(e)?n:n+"px"}function pt(t,e,n,i,r){var o,a;t:if("style"==e)if("string"==typeof n)t.style.cssText=n;else{if("string"==typeof i&&(t.style.cssText=i=""),i)for(e in i)n&&e in n||ft(t.style,e,"");if(n)for(e in n)i&&n[e]==i[e]||ft(t.style,e,n[e])}else if("o"==e[0]&&"n"==e[1])o=e!=(e=e.replace(J,"$1")),a=e.toLowerCase(),e=a in t||"onFocusOut"==e||"onFocusIn"==e?a.slice(2):e.slice(2),t.l||(t.l={}),t.l[e+o]=n,n?i?n[W]=i[W]:(n[W]=V,t.addEventListener(e,o?G:K,o)):t.removeEventListener(e,o?G:K,o);else{if("http://www.w3.org/2000/svg"==r)e=e.replace(/xlink(H|:h)/,"h").replace(/sName$/,"s");else if("width"!=e&&"height"!=e&&"href"!=e&&"list"!=e&&"form"!=e&&"tabIndex"!=e&&"download"!=e&&"rowSpan"!=e&&"colSpan"!=e&&"role"!=e&&"popover"!=e&&e in t)try{t[e]=null==n?"":n;break t}catch(t){}"function"==typeof n||(null==n||!1===n&&"-"!=e[4]?t.removeAttribute(e):t.setAttribute(e,"popover"==e&&1==n?"":n))}}function gt(t){return function(e){if(this.l){var n=this.l[e.type+t];if(null==e[L])e[L]=V++;else if(e[L]<n[W])return;return n(j.event?j.event(e):e)}}}function mt(t,e,n,i,r,o,a,s,l,u){var h,c,d,v,f,p,g,m,b,y,$,w,x,k,S,_=e.type;if(void 0!==e.constructor)return null;128&n.__u&&(l=!!(32&n.__u),o=[s=e.__e=n.__e]),(h=j.__b)&&h(e);t:if("function"==typeof _)try{if(m=e.props,b=_.prototype&&_.prototype.render,y=(h=_.contextType)&&i[h.__c],$=h?y?y.props.value:h.__:i,n.__c?g=(c=e.__c=n.__c).__=c.__E:(b?e.__c=c=new _(m,$):(e.__c=c=new ot(m,$),c.constructor=_,c.render=_t),y&&y.sub(c),c.state||(c.state={}),c.__n=i,d=c.__d=!0,c.__h=[],c._sb=[]),b&&null==c.__s&&(c.__s=c.state),b&&null!=_.getDerivedStateFromProps&&(c.__s==c.state&&(c.__s=tt({},c.__s)),tt(c.__s,_.getDerivedStateFromProps(m,c.__s))),v=c.props,f=c.state,c.__v=e,d)b&&null==_.getDerivedStateFromProps&&null!=c.componentWillMount&&c.componentWillMount(),b&&null!=c.componentDidMount&&c.__h.push(c.componentDidMount);else{if(b&&null==_.getDerivedStateFromProps&&m!==v&&null!=c.componentWillReceiveProps&&c.componentWillReceiveProps(m,$),e.__v==n.__v||!c.__e&&null!=c.shouldComponentUpdate&&!1===c.shouldComponentUpdate(m,c.__s,$)){e.__v!=n.__v&&(c.props=m,c.state=c.__s,c.__d=!1),e.__e=n.__e,e.__k=n.__k,e.__k.some(function(t){t&&(t.__=e)}),Y.push.apply(c.__h,c._sb),c._sb=[],c.__h.length&&a.push(c);break t}null!=c.componentWillUpdate&&c.componentWillUpdate(m,c.__s,$),b&&null!=c.componentDidUpdate&&c.__h.push(function(){c.componentDidUpdate(v,f,p)})}if(c.context=$,c.props=m,c.__P=t,c.__e=!1,w=j.__r,x=0,b)c.state=c.__s,c.__d=!1,w&&w(e),h=c.render(c.props,c.state,c.context),Y.push.apply(c.__h,c._sb),c._sb=[];else do{c.__d=!1,w&&w(e),h=c.render(c.props,c.state,c.context),c.state=c.__s}while(c.__d&&++x<25);c.state=c.__s,null!=c.getChildContext&&(i=tt(tt({},i),c.getChildContext())),b&&!d&&null!=c.getSnapshotBeforeUpdate&&(p=c.getSnapshotBeforeUpdate(v,f)),k=null!=h&&h.type===rt&&null==h.key?wt(h.props.children):h,s=ht(t,Z(k)?k:[k],e,n,i,r,o,a,s,l,u),c.base=e.__e,e.__u&=-161,c.__h.length&&a.push(c),g&&(c.__E=c.__=null)}catch(t){if(e.__v=null,l||null!=o)if(t.then){for(e.__u|=l?160:128;s&&8==s.nodeType&&s.nextSibling;)s=s.nextSibling;o[o.indexOf(s)]=null,e.__e=s}else{for(S=o.length;S--;)et(o[S]);bt(e)}else e.__e=n.__e,e.__k=n.__k,t.then||bt(e);j.__e(t,e,n)}else null==o&&e.__v==n.__v?(e.__k=n.__k,e.__e=n.__e):s=e.__e=xt(n.__e,e,n,i,r,o,a,l,u);return(h=j.diffed)&&h(e),128&e.__u?void 0:s}function bt(t){t&&(t.__c&&(t.__c.__e=!0),t.__k&&t.__k.some(bt))}function yt(t,e,n){for(var i=0;i<n.length;i++)kt(n[i],n[++i],n[++i]);j.__c&&j.__c(e,t),t.some(function(e){try{t=e.__h,e.__h=[],t.some(function(t){t.call(e)})}catch(t){j.__e(t,e.__v)}})}function wt(t){return"object"!=typeof t||null==t||t.__b>0?t:Z(t)?t.map(wt):void 0!==t.constructor?null:tt({},t)}function xt(t,e,n,i,r,o,a,s,l){var u,h,c,d,v,f,p,g=n.props||Q,m=e.props,b=e.type;if("svg"==b?r="http://www.w3.org/2000/svg":"math"==b?r="http://www.w3.org/1998/Math/MathML":r||(r="http://www.w3.org/1999/xhtml"),null!=o)for(u=0;u<o.length;u++)if((v=o[u])&&"setAttribute"in v==!!b&&(b?v.localName==b:3==v.nodeType)){t=v,o[u]=null;break}if(null==t){if(null==b)return document.createTextNode(m);t=document.createElementNS(r,b,m.is&&m),s&&(j.__m&&j.__m(e,o),s=!1),o=null}if(null==b)g===m||s&&t.data==m||(t.data=m);else{if(o="textarea"==b&&null!=m.defaultValue?null:o&&R.call(t.childNodes),!s&&null!=o)for(g={},u=0;u<t.attributes.length;u++)g[(v=t.attributes[u]).name]=v.value;for(u in g)v=g[u],"dangerouslySetInnerHTML"==u?c=v:"children"==u||u in m||"value"==u&&"defaultValue"in m||"checked"==u&&"defaultChecked"in m||pt(t,u,null,v,r);for(u in m)v=m[u],"children"==u?d=v:"dangerouslySetInnerHTML"==u?h=v:"value"==u?f=v:"checked"==u?p=v:s&&"function"!=typeof v||g[u]===v||pt(t,u,v,g[u],r);if(h)s||c&&(h.__html==c.__html||h.__html==t.innerHTML)||(t.innerHTML=h.__html),e.__k=[];else if(c&&(t.innerHTML=""),ht("template"==e.type?t.content:t,Z(d)?d:[d],e,n,i,"foreignObject"==b?"http://www.w3.org/1999/xhtml":r,o,a,o?o[0]:n.__k&&$(n,0),s,l),null!=o)for(u=o.length;u--;)et(o[u]);s&&"textarea"!=b||(u="value","progress"==b&&null==f?t.removeAttribute("value"):null!=f&&(f!==t[u]||"progress"==b&&!f||"option"==b&&f!=g[u])&&pt(t,u,f,g[u],r),u="checked",null!=p&&p!=t[u]&&pt(t,u,p,g[u],r))}return t}function kt(t,e,n){try{if("function"==typeof t){var i="function"==typeof t.__u;i&&t.__u(),i&&null==e||(t.__u=t(e))}else t.current=e}catch(t){j.__e(t,n)}}function St(t,e,n){var i,r;if(j.unmount&&j.unmount(t),(i=t.ref)&&(i.current&&i.current!=t.__e||kt(i,null,e)),null!=(i=t.__c)){if(i.componentWillUnmount)try{i.componentWillUnmount()}catch(t){j.__e(t,e)}i.base=i.__P=null}if(i=t.__k)for(r=0;r<i.length;r++)i[r]&&St(i[r],e,n||"function"!=typeof t.type);n||et(t.__e),t.__c=t.__=t.__e=void 0}function _t(t,e,n){return this.constructor(t,n)}function Tt(t,e,n){var i,r,o;e==document&&(e=document.documentElement),j.__&&j.__(t,e),i=!1?null:e.__k,r=[],o=[],mt(e,t=e.__k=nt(rt,null,[t]),i||Q,Q,e.namespaceURI,i?null:e.firstChild?R.call(e.childNodes):null,r,i?i.__e:e.firstChild,false,o),yt(r,t,o)}R=Y.slice,j={__e:function(t,e,n,i){for(var r,o,a;e=e.__;)if((r=e.__c)&&!r.__)try{if((o=r.constructor)&&null!=o.getDerivedStateFromError&&(r.setState(o.getDerivedStateFromError(t)),a=r.__d),null!=r.componentDidCatch&&(r.componentDidCatch(t,i||{}),a=r.__d),a)return r.__E=r}catch(e){t=e}throw t}},N=0,U=function(t){return null!=t&&void 0===t.constructor},ot.prototype.setState=function(t,e){var n;n=null!=this.__s&&this.__s!=this.state?this.__s:this.__s=tt({},this.state),"function"==typeof t&&(t=t(tt({},n),this.props)),t&&tt(n,t),null!=t&&this.__v&&(e&&this._sb.push(e),lt(this))},ot.prototype.forceUpdate=function(t){this.__v&&(this.__e=!0,t&&this.__h.push(t),lt(this))},ot.prototype.render=rt,B=[],q="function"==typeof Promise?Promise.prototype.then.bind(Promise.resolve()):setTimeout,F=function(t,e){return t.__v.__b-e.__v.__b},ut.__r=0,H=Math.random().toString(8),L="__d"+H,W="__a"+H,J=/(PointerCapture)$|Capture$/i,V=0,K=gt(!1),G=gt(!0);var Ct=0;function At(t,e,n,i,r,o){e||(e={});var a,s,l=e;if("ref"in l)for(s in l={},e)"ref"==s?a=e[s]:l[s]=e[s];var u={type:t,props:l,key:n,ref:a,__k:null,__:null,__b:0,__e:null,__c:null,constructor:void 0,__v:--Ct,__i:-1,__u:0,__source:r,__self:o};if("function"==typeof t&&(a=t.defaultProps))for(s in a)void 0===l[s]&&(l[s]=a[s]);return j.vnode&&j.vnode(u),u}var Et,Ot,It,Mt,Pt=0,Dt=[],Rt=j,jt=Rt.__b,Nt=Rt.__r,Ut=Rt.diffed,Bt=Rt.__c,zt=Rt.unmount,qt=Rt.__;function Ft(t,e){Rt.__h&&Rt.__h(Ot,t,Pt||e),Pt=0;var n=Ot.__H||(Ot.__H={__:[],__h:[]});return t>=n.__.length&&n.__.push({}),n.__[t]}function Ht(t){return Pt=1,function(t,e,n){var i=Ft(Et++,2);if(i.t=t,!i.__c&&(i.__=[n?n(e):Zt(void 0,e),function(t){var e=i.__N?i.__N[0]:i.__[0],n=i.t(e,t);e!==n&&(i.__N=[n,i.__[1]],i.__c.setState({}))}],i.__c=Ot,!Ot.__f)){var r=function(t,e,n){if(!i.__c.__H)return!0;var r=i.__c.__H.__.filter(function(t){return t.__c});if(r.every(function(t){return!t.__N}))return!o||o.call(this,t,e,n);var a=i.__c.props!==t;return r.some(function(t){if(t.__N){var e=t.__[0];t.__=t.__N,t.__N=void 0,e!==t.__[0]&&(a=!0)}}),o&&o.call(this,t,e,n)||a};Ot.__f=!0;var o=Ot.shouldComponentUpdate,a=Ot.componentWillUpdate;Ot.componentWillUpdate=function(t,e,n){if(this.__e){var i=o;o=void 0,r(t,e,n),o=i}a&&a.call(this,t,e,n)},Ot.shouldComponentUpdate=r}return i.__N||i.__}(Zt,t)}function Lt(t,e){var n=Ft(Et++,3);!Rt.__s&&Xt(n.__H,e)&&(n.__=t,n.u=e,Ot.__H.__h.push(n))}function Wt(t){return Pt=5,Jt(function(){return{current:t}},[])}function Jt(t,e){var n=Ft(Et++,7);return Xt(n.__H,e)&&(n.__=t(),n.__H=e,n.__h=t),n.__}function Vt(t,e){return Pt=8,Jt(function(){return t},e)}function $t(){for(var t;t=Dt.shift();){var e=t.__H;if(t.__P&&e)try{e.__h.some(Qt),e.__h.some(Yt),e.__h=[]}catch(n){e.__h=[],Rt.__e(n,t.__v)}}}Rt.__b=function(t){Ot=null,jt&&jt(t)},Rt.__=function(t,e){t&&e.__k&&e.__k.__m&&(t.__m=e.__k.__m),qt&&qt(t,e)},Rt.__r=function(t){Nt&&Nt(t),Et=0;var e=(Ot=t.__c).__H;e&&(It===Ot?(e.__h=[],Ot.__h=[],e.__.some(function(t){t.__N&&(t.__=t.__N),t.u=t.__N=void 0})):(e.__h.some(Qt),e.__h.some(Yt),e.__h=[],Et=0)),It=Ot},Rt.diffed=function(t){Ut&&Ut(t);var e=t.__c;e&&e.__H&&(e.__H.__h.length&&(1!==Dt.push(e)&&Mt===Rt.requestAnimationFrame||((Mt=Rt.requestAnimationFrame)||Gt)($t)),e.__H.__.some(function(t){t.u&&(t.__H=t.u),t.u=void 0})),It=Ot=null},Rt.__c=function(t,e){e.some(function(t){try{t.__h.some(Qt),t.__h=t.__h.filter(function(t){return!t.__||Yt(t)})}catch(n){e.some(function(t){t.__h&&(t.__h=[])}),e=[],Rt.__e(n,t.__v)}}),Bt&&Bt(t,e)},Rt.unmount=function(t){zt&&zt(t);var e,n=t.__c;n&&n.__H&&(n.__H.__.some(function(t){try{Qt(t)}catch(t){e=t}}),n.__H=void 0,e&&Rt.__e(e,n.__v))};var Kt="function"==typeof requestAnimationFrame;function Gt(t){var e,n=function(){clearTimeout(i),Kt&&cancelAnimationFrame(e),setTimeout(t)},i=setTimeout(n,35);Kt&&(e=requestAnimationFrame(n))}function Qt(t){var e=Ot,n=t.__c;"function"==typeof n&&(t.__c=void 0,n()),Ot=e}function Yt(t){var e=Ot;t.__c=t.__(),Ot=e}function Xt(t,e){return!t||t.length!==e.length||e.some(function(e,n){return e!==t[n]})}function Zt(t,e){return"function"==typeof e?e(t):e}var te=/^[^\s@]+@[^\s@]+\.[^\s@]+$/;function ee(t){var{prompt:e,ctx:n}=t,[i,r]=Ht(""),[o,a]=Ht(""),[l,u]=Ht(!1),h=te.test(o.trim())&&!l,c=function(){var t=s(function*(){if(h){u(!0);try{yield n.dispatch("submit",{email:o.trim(),name:i.trim()})}finally{u(!1)}}});return function(){return t.apply(this,arguments)}}();return At("div",{class:"vt-widget",children:[At("p",{children:e}),At("div",{style:"display: flex; flex-direction: column; gap: 8px;",children:[At("input",{type:"text",class:"vt-widget-input",placeholder:"Your name",value:i,onInput:t=>r(t.currentTarget.value),disabled:l}),At("div",{style:"display: flex; gap: 8px; align-items: center;",children:[At("input",{type:"email",class:"vt-widget-input",style:"flex: 1; min-width: 0; margin: 0;",placeholder:"your@email.com",value:o,onInput:t=>a(t.currentTarget.value),onKeyDown:t=>{"Enter"===t.key&&(t.preventDefault(),c())},disabled:l}),At("button",{type:"button",class:"vt-widget-btn","data-style":"outline",onClick:()=>{c()},disabled:!h,children:"Submit"})]})]})]})}var ne={type:"collect_email",toolDescription:"ALWAYS use this tool instead of asking for email in plain text. Renders an interactive form to collect the user's name and email. Use whenever the user wants follow-up, a demo, a meeting, pricing info, or shows buying intent. NEVER ask for name or email via plain text.",parameters:{prompt:{type:"string",description:"Message to show above the input fields"}},render:(t,e)=>At(ee,{prompt:"string"==typeof t.prompt?t.prompt:"What's your name and email?",ctx:e}),onAction:(t,e,n)=>s(function*(){if("submit"!==t)return{};var i="string"==typeof e.email?e.email.trim():"";if(!i||!te.test(i))return{};var r=n.buildEndpointUrl("/api/chat/widget/channels/"+n.channelId+"/actions"),o=n.token?{"x-api-key":n.token,"Content-Type":"application/json"}:{"Content-Type":"application/json"};try{var a=yield fetch(r,{method:"POST",headers:o,body:JSON.stringify({widget_type:"collect_email",action:"submit",data:{email:i,name:"string"==typeof e.name?e.name.trim():""},channel_id:n.channelId,distinct_id:n.distinctId,message_id:n.messageId})});return{success:!!(yield a.json()).success}}catch(t){return{}}})()},ie={fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"};function re(t){return At("svg",l({width:24,height:24,viewBox:"0 0 24 24"},ie,t,{children:At("path",{d:"M18 6L6 18M6 6l12 12"})}))}function oe(t){return At("svg",l({width:24,height:24,viewBox:"0 0 24 24"},ie,t,{children:At("path",{d:"M15 18l-6-6 6-6"})}))}function ae(t){return At("svg",l({width:16,height:16,viewBox:"0 0 24 24",fill:"currentColor"},t,{children:At("path",{d:"M2.01 21L23 12 2.01 3 2 10l15 2-15 2z"})}))}function se(t){return At("svg",l({width:28,height:28,viewBox:"0 0 28 28",fill:"white"},t,{children:At("path",{d:"M14 3C7.925 3 3 7.262 3 12.5c0 2.56 1.166 4.884 3.063 6.606L4.5 24l5.25-2.625C11.1 21.79 12.52 22 14 22c6.075 0 11-4.262 11-9.5S20.075 3 14 3z"})}))}function le(t){return At("svg",l({width:22,height:22,viewBox:"0 0 24 24",fill:"currentColor"},t,{children:At("path",{d:"M12 2a2 2 0 0 1 2 2c0 .74-.4 1.39-1 1.73V7h1a7 7 0 0 1 7 7h1a1 1 0 0 1 1 1v3a1 1 0 0 1-1 1h-1v1a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-1H2a1 1 0 0 1-1-1v-3a1 1 0 0 1 1-1h1a7 7 0 0 1 7-7h1V5.73c-.6-.34-1-.99-1-1.73a2 2 0 0 1 2-2M7.5 13A1.5 1.5 0 0 0 6 14.5A1.5 1.5 0 0 0 7.5 16A1.5 1.5 0 0 0 9 14.5A1.5 1.5 0 0 0 7.5 13m9 0a1.5 1.5 0 0 0-1.5 1.5a1.5 1.5 0 0 0 1.5 1.5a1.5 1.5 0 0 0 1.5-1.5a1.5 1.5 0 0 0-1.5-1.5"})}))}function ue(t){return At("svg",l({width:22,height:22,viewBox:"0 0 24 24",fill:"currentColor"},t,{children:At("path",{d:"M12 4a4 4 0 0 1 4 4a4 4 0 0 1-4 4a4 4 0 0 1-4-4a4 4 0 0 1 4-4m0 10c4.42 0 8 1.79 8 4v2H4v-2c0-2.21 3.58-4 8-4"})}))}function he(t){return At("svg",l({width:36,height:36,viewBox:"0 0 24 24",fill:"white"},t,{children:At("path",{d:"M20 2H4c-1.1 0-2 .9-2 2v18l4-4h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm0 14H6l-2 2V4h16v12z"})}))}function ce(t){return At("svg",l({width:16,height:16,viewBox:"0 0 24 24"},ie,t,{children:[At("path",{d:"M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2"}),At("circle",{cx:"12",cy:"7",r:"4"})]}))}function de(t){var{prompt:e,ctx:n}=t,[i,r]=Ht(!1),o=function(){var t=s(function*(){if(!i){r(!0);try{yield n.dispatch("escalate",{})}finally{r(!1)}}});return function(){return t.apply(this,arguments)}}();return At("div",{class:"vt-widget",children:[At("p",{children:e}),At("button",{type:"button",class:"vt-widget-btn","data-style":"outline",onClick:()=>{o()},disabled:i,children:[At(ce,{}),"Connect with a person"]})]})}var ve={type:"escalate_to_human",toolDescription:"Offer to connect the user with a human agent. Use when the user explicitly asks to speak with a person, when you cannot adequately help them, or when the conversation requires human judgment (billing, complaints, complex issues).",parameters:{prompt:{type:"string",description:"Message to show above the connect button"}},render:(t,e)=>At(de,{prompt:"string"==typeof t.prompt?t.prompt:"Would you like me to connect you with a team member?",ctx:e}),onAction:(t,e,n)=>s(function*(){if("escalate"!==t)return{};var e=n.buildEndpointUrl("/api/chat/widget/channels/"+n.channelId+"/actions"),i=n.token?{"x-api-key":n.token,"Content-Type":"application/json"}:{"Content-Type":"application/json"};try{var r=yield fetch(e,{method:"POST",headers:i,body:JSON.stringify({widget_type:"escalate_to_human",action:"escalate",data:{},channel_id:n.channelId,distinct_id:n.distinctId,message_id:n.messageId})});return{success:!!(yield r.json()).success}}catch(t){return{}}})()},fe=Symbol.for("preact-signals");function pe(){if(we>1)we--;else{var t,e=!1;for(!function(){var t=ke;for(ke=void 0;void 0!==t;)t.S.v===t.v&&(t.S.i=t.i),t=t.o}();void 0!==ye;){var n=ye;for(ye=void 0,xe++;void 0!==n;){var i=n.u;if(n.u=void 0,n.f&=-3,!(8&n.f)&&Ae(n))try{n.c()}catch(n){e||(t=n,e=!0)}n=i}}if(xe=0,we--,e)throw t}}var ge=void 0;function me(t){var e=ge;ge=void 0;try{return t()}finally{ge=e}}var be,ye=void 0,we=0,xe=0,ke=void 0,Se=0;function _e(t){if(void 0!==ge){var e=t.n;if(void 0===e||e.t!==ge)return e={i:0,S:t,p:ge.s,n:void 0,t:ge,e:void 0,x:void 0,r:e},void 0!==ge.s&&(ge.s.n=e),ge.s=e,t.n=e,32&ge.f&&t.S(e),e;if(-1===e.i)return e.i=0,void 0!==e.n&&(e.n.p=e.p,void 0!==e.p&&(e.p.n=e.n),e.p=ge.s,e.n=void 0,ge.s.n=e,ge.s=e),e}}function Te(t,e){this.v=t,this.i=0,this.n=void 0,this.t=void 0,this.l=0,this.W=null==e?void 0:e.watched,this.Z=null==e?void 0:e.unwatched,this.name=null==e?void 0:e.name}function Ce(t,e){return new Te(t,e)}function Ae(t){for(var e=t.s;void 0!==e;e=e.n)if(e.S.i!==e.i||!e.S.h()||e.S.i!==e.i)return!0;return!1}function Ee(t){for(var e=t.s;void 0!==e;e=e.n){var n=e.S.n;if(void 0!==n&&(e.r=n),e.S.n=e,e.i=-1,void 0===e.n){t.s=e;break}}}function Oe(t){for(var e=t.s,n=void 0;void 0!==e;){var i=e.p;-1===e.i?(e.S.U(e),void 0!==i&&(i.n=e.n),void 0!==e.n&&(e.n.p=i)):n=e,e.S.n=e.r,void 0!==e.r&&(e.r=void 0),e=i}t.s=n}function Ie(t,e){Te.call(this,void 0),this.x=t,this.s=void 0,this.g=Se-1,this.f=4,this.W=null==e?void 0:e.watched,this.Z=null==e?void 0:e.unwatched,this.name=null==e?void 0:e.name}function Me(t,e){return new Ie(t,e)}function Pe(t){var e=t.m;if(t.m=void 0,"function"==typeof e){we++;var n=ge;ge=void 0;try{e()}catch(e){throw t.f&=-2,t.f|=8,De(t),e}finally{ge=n,pe()}}}function De(t){for(var e=t.s;void 0!==e;e=e.n)e.S.U(e);t.x=void 0,t.s=void 0,Pe(t)}function Re(t){if(ge!==this)throw new Error("Out-of-order effect");Oe(this),ge=t,this.f&=-2,8&this.f&&De(this),pe()}function je(t,e){this.x=t,this.m=void 0,this.s=void 0,this.u=void 0,this.f=32,this.name=null==e?void 0:e.name}function Ne(t,e){var n=new je(t,e);try{n.c()}catch(t){throw n.d(),t}var i=n.d.bind(n);return i[Symbol.dispose]=i,i}function Ue(t,e){j[t]=e.bind(null,j[t]||function(){})}function Be(t){if(be){var e=be;be=void 0,e()}be=t&&t.S()}function ze(t){var e=this,n=t.data,i=function(t){return Jt(function(){return Ce(t)},[])}(n);i.value=n;var r=Jt(function(){for(var t=e.__v;t=t.__;)if(t.__c){t.__c.__$f|=4;break}return e.__$u.c=function(){var t,n=e.__$u.S(),i=r.value;n(),U(i)||3!==(null==(t=e.base)?void 0:t.nodeType)?(e.__$f|=1,e.setState({})):e.base.data=i},Me(function(){var t=i.value.value;return 0===t?0:!0===t?"":t||""})},[]);return r.value}function qe(t,e,n,i){var r=e in t&&void 0===t.ownerSVGElement,o=Ce(n);return{o:function(t,e){o.value=t,i=e},d:Ne(function(){var n=o.value.value;i[e]!==n&&(i[e]=n,r?t[e]=n:n?t.setAttribute(e,n):t.removeAttribute(e))})}}Te.prototype.brand=fe,Te.prototype.h=function(){return!0},Te.prototype.S=function(t){var e=this,n=this.t;n!==t&&void 0===t.e&&(t.x=n,this.t=t,void 0!==n?n.e=t:me(function(){var t;null==(t=e.W)||t.call(e)}))},Te.prototype.U=function(t){var e=this;if(void 0!==this.t){var n=t.e,i=t.x;void 0!==n&&(n.x=i,t.e=void 0),void 0!==i&&(i.e=n,t.x=void 0),t===this.t&&(this.t=i,void 0===i&&me(function(){var t;null==(t=e.Z)||t.call(e)}))}},Te.prototype.subscribe=function(t){var e=this;return Ne(function(){var n=e.value,i=ge;ge=void 0;try{t(n)}finally{ge=i}},{name:"sub"})},Te.prototype.valueOf=function(){return this.value},Te.prototype.toString=function(){return this.value+""},Te.prototype.toJSON=function(){return this.value},Te.prototype.peek=function(){var t=this;return me(function(){return t.value})},Object.defineProperty(Te.prototype,"value",{get:function(){var t=_e(this);return void 0!==t&&(t.i=this.i),this.v},set:function(t){if(t!==this.v){if(xe>100)throw new Error("Cycle detected");!function(t){0!==we&&0===xe&&0!==t.l&&(t.l=0,ke={S:t,v:t.v,i:t.i,o:ke})}(this),this.v=t,this.i++,Se++,we++;try{for(var e=this.t;void 0!==e;e=e.x)e.t.N()}finally{pe()}}}}),Ie.prototype=new Te,Ie.prototype.h=function(){if(this.f&=-3,1&this.f)return!1;if(32==(36&this.f))return!0;if(this.f&=-5,this.g===Se)return!0;if(this.g=Se,this.f|=1,this.i>0&&!Ae(this))return this.f&=-2,!0;var t=ge;try{Ee(this),ge=this;var e=this.x();(16&this.f||this.v!==e||0===this.i)&&(this.v=e,this.f&=-17,this.i++)}catch(t){this.v=t,this.f|=16,this.i++}return ge=t,Oe(this),this.f&=-2,!0},Ie.prototype.S=function(t){if(void 0===this.t){this.f|=36;for(var e=this.s;void 0!==e;e=e.n)e.S.S(e)}Te.prototype.S.call(this,t)},Ie.prototype.U=function(t){if(void 0!==this.t&&(Te.prototype.U.call(this,t),void 0===this.t)){this.f&=-33;for(var e=this.s;void 0!==e;e=e.n)e.S.U(e)}},Ie.prototype.N=function(){if(!(2&this.f)){this.f|=6;for(var t=this.t;void 0!==t;t=t.x)t.t.N()}},Object.defineProperty(Ie.prototype,"value",{get:function(){if(1&this.f)throw new Error("Cycle detected");var t=_e(this);if(this.h(),void 0!==t&&(t.i=this.i),16&this.f)throw this.v;return this.v}}),je.prototype.c=function(){var t=this.S();try{if(8&this.f)return;if(void 0===this.x)return;var e=this.x();"function"==typeof e&&(this.m=e)}finally{t()}},je.prototype.S=function(){if(1&this.f)throw new Error("Cycle detected");this.f|=1,this.f&=-9,Pe(this),Ee(this),we++;var t=ge;return ge=this,Re.bind(this,t)},je.prototype.N=function(){2&this.f||(this.f|=2,this.u=ye,ye=this)},je.prototype.d=function(){this.f|=8,1&this.f||De(this)},je.prototype.dispose=function(){this.d()},ze.displayName="_st",Object.defineProperties(Te.prototype,{constructor:{configurable:!0,value:void 0},type:{configurable:!0,value:ze},props:{configurable:!0,get:function(){return{data:this}}},__b:{configurable:!0,value:1}}),Ue("__b",function(t,e){if("string"==typeof e.type){var n,i=e.props;for(var r in i)if("children"!==r){var o=i[r];o instanceof Te&&(n||(e.__np=n={}),n[r]=o,i[r]=o.peek())}}t(e)}),Ue("__r",function(t,e){t(e),Be();var n,i=e.__c;i&&(i.__$f&=-2,void 0===(n=i.__$u)&&(i.__$u=n=function(){var t;return Ne(function(){t=this}),t.c=function(){i.__$f|=1,i.setState({})},t}())),Be(n)}),Ue("__e",function(t,e,n,i){Be(),t(e,n,i)}),Ue("diffed",function(t,e){var n;if(Be(),"string"==typeof e.type&&(n=e.__e)){var i=e.__np,r=e.props;if(i){var o=n.U;if(o)for(var a in o){var s=o[a];void 0===s||a in i||(s.d(),o[a]=void 0)}else n.U=o={};for(var l in i){var u=o[l],h=i[l];void 0===u?(u=qe(n,l,h,r),o[l]=u):u.o(h,r)}}}t(e)}),Ue("unmount",function(t,e){if("string"==typeof e.type){var n=e.__e;if(n){var i=n.U;if(i)for(var r in n.U=void 0,i){var o=i[r];o&&o.d()}}}else{var a=e.__c;if(a){var s=a.__$u;s&&(a.__$u=void 0,s.d())}}t(e)}),Ue("__h",function(t,e,n,i){(i<3||9===i)&&(e.__$f|=2),t(e,n,i)}),ot.prototype.shouldComponentUpdate=function(t,e){if(this.__R)return!0;var n=this.__$u,i=n&&void 0!==n.s;for(var r in e)return!0;if(this.__f||"boolean"==typeof this.u&&!0===this.u){if(!(i||2&this.__$f||4&this.__$f))return!0;if(1&this.__$f)return!0}else{if(!(i||4&this.__$f))return!0;if(3&this.__$f)return!0}for(var o in t)if("__source"!==o&&t[o]!==this.props[o])return!0;for(var a in this.props)if(!(a in t))return!0;return!1};var Fe={primaryColor:"#7B68EE",fontFamily:"'Inter var', 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif",borderRadius:"12px"};class He{constructor(){this.isOpen=Ce(!1),this.isVisible=Ce(!0),this.isLoading=Ce(!1),this.currentView=Ce("list"),this.channels=Ce([]),this.channel=Ce(null),this.messages=Ce([]),this.isTyping=Ce(!1),this.typingSender=Ce(null),this.typingSenderType=Ce(null),this.agentLastReadAt=Ce(null),this.initialUserReadAt=Ce(null),this.userScrolledUp=Ce(!1),this.unreadNewMessagesCount=Ce(0),this.theme=Ce(l({},Fe)),this.connectionState=Ce("disconnected"),this.ablyProjectId=Ce(null),this.realtimeChannelId=Ce(null),this.realtimeAttached=Ce(!1),this.pendingRealtimeChannelId=Ce(null),this.identityChangeInFlight=Ce(!1),this.lastConnectedDistinctId=Ce(null),this.T=new Map,this.isConnected=Me(()=>"connected"===this.connectionState.value),this.polledUnreadTotal=Ce(null),this.unreadCount=Me(()=>this.isOpen.value||null===this.polledUnreadTotal.value?this.channels.value.reduce((t,e)=>t+(e.unread_count||0),0):this.polledUnreadTotal.value),this.connectionBanner=Me(()=>{var t=this.connectionState.value;return"suspended"===t?"reconnecting":"failed"===t?"failed":"none"}),this.realtimeReady=Me(()=>{var t=this.channel.value;return!!t&&("connected"===this.connectionState.value&&this.realtimeAttached.value&&this.realtimeChannelId.value===t.id)})}setMessages(t){this.messages.value=t}patchChannelSummary(t,e){var n=this.channels.value.findIndex(e=>e.id===t);if(-1!==n){var i=[...this.channels.value];i[n]=l({},i[n],e),i.sort((t,e)=>{var n=t.last_message_at||t.created_at,i=e.last_message_at||e.created_at;return new Date(i).getTime()-new Date(n).getTime()}),this.channels.value=i}}prependChannelSummary(t){this.channels.value.some(e=>e.id===t.id)||(this.channels.value=[t,...this.channels.value])}clearActiveChannel(){this.channel.value=null,this.messages.value=[],this.isTyping.value=!1,this.typingSender.value=null,this.typingSenderType.value=null,this.userScrolledUp.value=!1,this.unreadNewMessagesCount.value=0,this.realtimeChannelId.value=null,this.realtimeAttached.value=!1,this.pendingRealtimeChannelId.value=null,this.agentLastReadAt.value=null,this.initialUserReadAt.value=null}prepareChannelSwitch(){this.messages.value=[],this.isTyping.value=!1,this.typingSender.value=null,this.typingSenderType.value=null,this.userScrolledUp.value=!1,this.unreadNewMessagesCount.value=0,this.agentLastReadAt.value=null,this.initialUserReadAt.value=null}cacheMessages(t,e){if(t){var n=e.filter(t=>!t.id.startsWith("temp-"));for(this.T.delete(t),this.T.set(t,n);this.T.size>He.MESSAGES_CACHE_LIMIT;){var i=this.T.keys().next().value;if(void 0===i)break;this.T.delete(i)}}}getCachedMessages(t){if(!t)return null;var e=this.T.get(t);return e?(this.T.delete(t),this.T.set(t,e),e):null}clearMessagesCache(){this.T.clear()}}He.MESSAGES_CACHE_LIMIT=10;var Le={bottom:20,right:20,left:20};function We(t,e){return void 0!==t&&Number.isFinite(t)?Math.max(0,t):e}var Je="vtilt-bubble-pos";function Ve(t){try{localStorage.setItem(Je,JSON.stringify(t))}catch(t){}}function $e(t,e,n){var i=t.getBoundingClientRect(),r=i.left-e,o=i.top-n,a=window.innerWidth-t.offsetWidth-r,s=-r,l=window.innerHeight-t.offsetHeight-o,u=-o;return{x:Math.min(Math.max(e,s),a),y:Math.min(Math.max(n,u),l)}}function Ke(t,e,n){t.style.transform="translate3d("+e+"px, "+n+"px, 0)"}function Ge(t,e){var n,i=null!==(n=null==e?void 0:e.handle)&&void 0!==n?n:t,r=null==e?void 0:e.onPositionChange,o=0,a=0,s=0,l=0,u=0,h=0,c=!1,d=!1,v=function(){try{var t=localStorage.getItem(Je);if(!t)return null;var e=JSON.parse(t);if("number"==typeof e.x&&"number"==typeof e.y)return e}catch(t){}return null}();if(v){o=v.x,a=v.y;var f=t.style.transition;t.style.transition="none",Ke(t,o,a);var p=$e(t,o,a);o=p.x,a=p.y,Ke(t,o,a),t.offsetHeight,t.style.transition=f}i.style.cursor="grab",i.style.touchAction="none";var g=e=>{0===e.button&&(c=!0,d=!1,s=e.clientX,l=e.clientY,u=o,h=a,i.setPointerCapture(e.pointerId),i.style.cursor="grabbing",t.style.transition="none")},m=e=>{if(c){var n=e.clientX-s,i=e.clientY-l;if(!(!d&&Math.abs(n)<5&&Math.abs(i)<5)){d=!0;var v={x:u+n,y:h+i},f=$e(t,v.x,v.y);o=f.x,a=f.y,Ke(t,o,a),null==r||r()}}},b=()=>{c&&(c=!1,i.style.cursor="grab",t.style.transition="",d&&(Ve({x:o,y:a}),null==r||r()))},y=t=>{d&&(t.stopPropagation(),t.preventDefault(),d=!1)},w=()=>{var e=o,n=a,i=$e(t,o,a);o=i.x,a=i.y,Ke(t,o,a),e===o&&n===a||Ve({x:o,y:a}),null==r||r()};return i.addEventListener("pointerdown",g),i.addEventListener("pointermove",m),i.addEventListener("pointerup",b),i.addEventListener("pointercancel",b),i.addEventListener("click",y,!0),window.addEventListener("resize",w),{destroy(){i.removeEventListener("pointerdown",g),i.removeEventListener("pointermove",m),i.removeEventListener("pointerup",b),i.removeEventListener("pointercancel",b),i.removeEventListener("click",y,!0),window.removeEventListener("resize",w)}}}function Qe(t){var{store:e,controller:n,bubbleRef:i}=t,r=e.unreadCount.value;return At("button",{type:"button",class:"vt-bubble",ref:i,onClick:()=>n.toggle(),"aria-label":"Open chat",children:[At(se,{}),At("span",{class:"vt-bubble-badge","data-visible":r>0?"true":"false",children:r>99?"99+":r})]})}function Ye(t){var{channel:e,onSelect:n}=t,i=e.unread_count>0,r=function(t){var e=new Date(t),n=Date.now()-e.getTime(),i=Math.floor(n/6e4),r=Math.floor(n/36e5),o=Math.floor(n/864e5);if(i<1)return"Just now";if(i<60)return i+"m ago";if(r<24)return r+"h ago";if(o<7)return o+"d ago";return e.toLocaleDateString()}(e.last_message_at||e.created_at),o=e.last_message_preview||"No messages yet",a="user"===e.last_message_sender?"You: ":"",s="closed"===e.status?" · Closed":"";return At("button",{type:"button",class:"vt-channel-item","data-channel-id":e.id,onClick:()=>n(e.id),children:[At("div",{class:"vt-channel-avatar","data-mode":e.ai_mode?"ai":"support",children:e.ai_mode?At(le,{width:24,height:24}):At(ue,{width:24,height:24})}),At("div",{class:"vt-channel-body",children:[At("div",{class:"vt-channel-row",children:[At("div",{class:"vt-channel-name","data-unread":i?"true":"false",children:e.ai_mode?"AI Assistant":"Support"}),At("div",{class:"vt-channel-time",children:r})]}),At("div",{class:"vt-channel-row",children:[At("div",{class:"vt-channel-preview","data-unread":i?"true":"false",children:[a,o,s]}),i&&At("div",{class:"vt-channel-unread",children:e.unread_count>99?"99+":e.unread_count})]})]})]})}function Xe(){return At("div",{style:"flex: 1; overflow: hidden;",children:[At(Ze,{}),At(Ze,{}),At(Ze,{}),At(Ze,{})]})}function Ze(){return At("div",{style:"padding: 14px 16px; display: flex; align-items: center; gap: 12px; border-bottom: 1px solid var(--vtilt-border-light); background: white;",children:[At("div",{class:"vt-skeleton-circle",style:"width: 48px; height: 48px; flex-shrink: 0;"}),At("div",{style:"flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 8px;",children:[At("div",{class:"vt-skeleton",style:"height: 12px; width: 40%;"}),At("div",{class:"vt-skeleton",style:"height: 10px; width: 80%;"})]})]})}function tn(){return At(rt,{children:[At(en,{direction:"in",widthPct:62,metaPx:92,height:40}),At(en,{direction:"out",widthPct:42,metaPx:56,height:40}),At(en,{direction:"in",widthPct:78,metaPx:76,height:60})]})}function en(t){var{direction:e,widthPct:n,metaPx:i,height:r}=t;return At("div","in"===e?{style:"display: flex; gap: 10px; align-items: flex-end;",children:[At("div",{class:"vt-skeleton-circle",style:"width: 32px; height: 32px; flex-shrink: 0;"}),At("div",{style:"display: flex; flex-direction: column; align-items: flex-start; min-width: 0; max-width: 85%;",children:[At("div",{class:"vt-skeleton",style:"width: "+n+"%; min-width: 96px; height: "+r+"px; border-radius: 20px 20px 20px 4px;"}),At("div",{class:"vt-skeleton",style:"height: 10px; width: "+i+"px; margin-top: 8px; margin-left: 6px; border-radius: 4px;"})]})]}:{style:"display: flex; flex-direction: column; align-items: flex-end;",children:[At("div",{class:"vt-skeleton",style:"width: "+n+"%; min-width: 80px; max-width: 80%; height: "+r+"px; border-radius: 20px 20px 4px 20px;"}),At("div",{class:"vt-skeleton",style:"height: 10px; width: "+i+"px; margin-top: 8px; margin-right: 6px; border-radius: 4px;"})]})}function nn(t){var{store:e,controller:n}=t,i=e.channels.value,r=e.isLoading.value;return 0===i.length&&r?At(Xe,{}):0===i.length?At(rn,{controller:n}):At(rt,{children:[At("div",{class:"vt-list-root",children:i.map(t=>At(Ye,{channel:t,onSelect:t=>{n.selectChannel(t)}},t.id))}),At("div",{class:"vt-list-footer",children:At("button",{type:"button",class:"vt-new-channel-btn",onClick:()=>{n.createChannel()},children:["Send us a message",At(ae,{width:18,height:18})]})})]})}function rn(t){var{controller:e}=t,n=e.config.greeting||"Hi! How can we help you today?";return At("div",{class:"vt-list-empty",children:[At("div",{class:"vt-list-empty-icon",children:At(he,{})}),At("div",{class:"vt-list-empty-title",children:n}),At("div",{class:"vt-list-empty-subtitle",children:"Start a conversation with us"}),At("button",{type:"button",class:"vt-new-channel-btn",style:"width: auto; padding: 14px 28px;",onClick:()=>{e.createChannel()},children:["Send us a message",At(ae,{width:18,height:18})]})]})}function on(t){var e,n,i,{store:r,controller:o}=t;if("list"===r.currentView.value)return At("div",{class:"vt-header","data-view":"list",children:[At("div",{class:"vt-header-title",children:"Messages"}),At("button",{type:"button",class:"vt-iconbtn vt-header-close",onClick:()=>o.close(),"aria-label":"Close",children:At(re,{})})]});var a=null===(i=null!==(n=null===(e=r.channel.value)||void 0===e?void 0:e.ai_mode)&&void 0!==n?n:o.config.aiMode)||void 0===i||i;return At("div",{class:"vt-header","data-view":"conversation",children:[At("button",{type:"button",class:"vt-iconbtn vt-header-back",onClick:()=>o.goToChannelList(),"aria-label":"Back",children:At(oe,{})}),At("div",{class:"vt-header-avatar","data-mode":a?"ai":"support",children:At(a?le:ue,{})}),At("div",{class:"vt-header-info",children:[At("div",{class:"vt-header-name",children:a?"AI Assistant":"Support"}),At("div",{class:"vt-header-status",children:"Online"})]}),At("button",{type:"button",class:"vt-iconbtn vt-header-close",onClick:()=>o.close(),"aria-label":"Close",children:At(re,{})})]})}function an(){return At("div",{class:"vt-closed-banner",children:"This conversation has been closed."})}function sn(t){var{store:e}=t,n=e.connectionBanner.value,i=function(t,e){var[n,i]=Ht(!1);return Lt(()=>{if(t){var n=setTimeout(()=>i(!0),e);return()=>clearTimeout(n)}i(!1)},[t,e]),n}("reconnecting"===n,2500),r=Vt(()=>{"undefined"!=typeof window&&window.location.reload()},[]);return"failed"===n?At("div",{class:"vt-conn-banner","data-kind":"failed",role:"alert",children:[At("span",{class:"vt-conn-banner-icon","aria-hidden":"true",children:At("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round",children:[At("path",{d:"M10.29 3.86 1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0Z"}),At("line",{x1:"12",y1:"9",x2:"12",y2:"13"}),At("line",{x1:"12",y1:"17",x2:"12.01",y2:"17"})]})}),At("span",{class:"vt-conn-banner-text",children:"Connection lost"}),At("button",{type:"button",class:"vt-conn-banner-action",onClick:r,children:"Retry"})]}):i?At("div",{class:"vt-conn-banner","data-kind":"reconnecting",role:"status",children:[At("span",{class:"vt-conn-banner-dot","aria-hidden":"true"}),At("span",{class:"vt-conn-banner-text",children:"Reconnecting"})]}):null}function ln(t){var{store:e,controller:n}=t,[i,r]=Ht(""),o=Wt(null),a=null==e.channel.value,s=()=>{var t=i.trim();t&&(n.stopUserTyping(),n.sendMessage(t),r(""),o.current&&(o.current.style.height="",o.current.focus()))};return Lt(()=>{o.current&&function(t){t.style.height="auto";var e=120,n=60;t.style.height=Math.min(Math.max(t.scrollHeight,n),e)+"px"}(o.current)},[i]),At("div",{class:"vt-input-container","data-pending":a?"true":"false",children:At("div",{class:"vt-input-box",children:[At("textarea",{class:"vt-input-textarea",ref:o,rows:1,placeholder:a?"Starting conversation…":"Message...",autocomplete:"off",autocorrect:"on",autocapitalize:"sentences",disabled:a,value:i,onInput:t=>{var e=t.currentTarget.value;r(e),n.notifyUserTyping()},onBlur:()=>{n.stopUserTyping()},onKeyDown:t=>{"Enter"!==t.key||t.shiftKey||(t.preventDefault(),s())}}),At("button",{type:"button",class:"vt-input-send","data-active":i.trim().length>0?"true":"false",disabled:0===i.trim().length||a,onClick:s,"aria-label":"Send message",children:At(ae,{})})]})})}function un(t,e){for(var n in t)if("__source"!==n&&!(n in e))return!0;for(var i in e)if("__source"!==i&&t[i]!==e[i])return!0;return!1}function hn(t,e){this.props=t,this.context=e}function cn(t,e){function n(t){var n=this.props.ref;return n!=t.ref&&n&&("function"==typeof n?n(null):n.current=null),e?!e(this.props,t)||n!=t.ref:un(this.props,t)}function i(e){return this.shouldComponentUpdate=n,nt(t,e)}return i.displayName="Memo("+(t.displayName||t.name)+")",i.__f=i.prototype.isReactComponent=!0,i.type=t,i}(hn.prototype=new ot).isPureReactComponent=!0,hn.prototype.shouldComponentUpdate=function(t,e){return un(this.props,t)||un(this.state,e)};var dn=j.__b;j.__b=function(t){t.type&&t.type.__f&&t.ref&&(t.props.ref=t.ref,t.ref=null),dn&&dn(t)};var vn=j.__e;j.__e=function(t,e,n,i){if(t.then)for(var r,o=e;o=o.__;)if((r=o.__c)&&r.__c)return null==e.__e&&(e.__e=n.__e,e.__k=n.__k),r.__c(t,e);vn(t,e,n,i)};var fn=j.unmount;function pn(t,e,n){return t&&(t.__c&&t.__c.__H&&(t.__c.__H.__.forEach(function(t){"function"==typeof t.__c&&t.__c()}),t.__c.__H=null),null!=(t=function(t,e){for(var n in e)t[n]=e[n];return t}({},t)).__c&&(t.__c.__P===n&&(t.__c.__P=e),t.__c.__e=!0,t.__c=null),t.__k=t.__k&&t.__k.map(function(t){return pn(t,e,n)})),t}function gn(t,e,n){return t&&n&&(t.__v=null,t.__k=t.__k&&t.__k.map(function(t){return gn(t,e,n)}),t.__c&&t.__c.__P===e&&(t.__e&&n.appendChild(t.__e),t.__c.__e=!0,t.__c.__P=n)),t}function mn(){this.__u=0,this.o=null,this.__b=null}function bn(t){var e=t.__&&t.__.__c;return e&&e.__a&&e.__a(t)}function yn(){this.i=null,this.l=null}j.unmount=function(t){var e=t.__c;e&&(e.__z=!0),e&&e.__R&&e.__R(),e&&32&t.__u&&(t.type=null),fn&&fn(t)},(mn.prototype=new ot).__c=function(t,e){var n=e.__c,i=this;null==i.o&&(i.o=[]),i.o.push(n);var r=bn(i.__v),o=!1,a=function(){o||i.__z||(o=!0,n.__R=null,r?r(l):l())};n.__R=a;var s=n.__P;n.__P=null;var l=function(){if(! --i.__u){if(i.state.__a){var t=i.state.__a;i.__v.__k[0]=gn(t,t.__c.__P,t.__c.__O)}var e;for(i.setState({__a:i.__b=null});e=i.o.pop();)e.__P=s,e.forceUpdate()}};i.__u++||32&e.__u||i.setState({__a:i.__b=i.__v.__k[0]}),t.then(a,a)},mn.prototype.componentWillUnmount=function(){this.o=[]},mn.prototype.render=function(t,e){if(this.__b){if(this.__v.__k){var n=document.createElement("div"),i=this.__v.__k[0].__c;this.__v.__k[0]=pn(this.__b,n,i.__O=i.__P)}this.__b=null}var r=e.__a&&nt(rt,null,t.fallback);return r&&(r.__u&=-33),[nt(rt,null,e.__a?null:t.children),r]};var wn=function(t,e,n){if(++n[1]===n[0]&&t.l.delete(e),t.props.revealOrder&&("t"!==t.props.revealOrder[0]||!t.l.size))for(n=t.i;n;){for(;n.length>3;)n.pop()();if(n[1]<n[0])break;t.i=n=n[2]}};(yn.prototype=new ot).__a=function(t){var e=this,n=bn(e.__v),i=e.l.get(t);return i[0]++,function(r){var o=function(){e.props.revealOrder?(i.push(r),wn(e,t,i)):r()};n?n(o):o()}},yn.prototype.render=function(t){this.i=null,this.l=new Map;var e=dt(t.children);t.revealOrder&&"b"===t.revealOrder[0]&&e.reverse();for(var n=e.length;n--;)this.l.set(e[n],this.i=[1,0,this.i]);return t.children},yn.prototype.componentDidUpdate=yn.prototype.componentDidMount=function(){var t=this;this.l.forEach(function(e,n){wn(t,n,e)})};var xn="undefined"!=typeof Symbol&&Symbol.for&&Symbol.for("react.element")||60103,kn=/^(?:accent|alignment|arabic|baseline|cap|clip(?!PathU)|color|dominant|fill|flood|font|glyph(?!R)|horiz|image(!S)|letter|lighting|marker(?!H|W|U)|overline|paint|pointer|shape|stop|strikethrough|stroke|text(?!L)|transform|underline|unicode|units|v|vector|vert|word|writing|x(?!C))[A-Z]/,Sn=/^on(Ani|Tra|Tou|BeforeInp|Compo)/,_n=/[A-Z0-9]/g,Tn="undefined"!=typeof document,Cn=function(t){return("undefined"!=typeof Symbol&&"symbol"==typeof Symbol()?/fil|che|rad/:/fil|che|ra/).test(t)};ot.prototype.isReactComponent=!0,["componentWillMount","componentWillReceiveProps","componentWillUpdate"].forEach(function(t){Object.defineProperty(ot.prototype,t,{configurable:!0,get:function(){return this["UNSAFE_"+t]},set:function(e){Object.defineProperty(this,t,{configurable:!0,writable:!0,value:e})}})});var An=j.event;j.event=function(t){return An&&(t=An(t)),t.persist=function(){},t.isPropagationStopped=function(){return this.cancelBubble},t.isDefaultPrevented=function(){return this.defaultPrevented},t.nativeEvent=t};var En={configurable:!0,get:function(){return this.class}},On=j.vnode;j.vnode=function(t){"string"==typeof t.type&&function(t){var e=t.props,n=t.type,i={},r=-1==n.indexOf("-");for(var o in e){var a=e[o];if(!("value"===o&&"defaultValue"in e&&null==a||Tn&&"children"===o&&"noscript"===n||"class"===o||"className"===o)){var s=o.toLowerCase();"defaultValue"===o&&"value"in e&&null==e.value?o="value":"download"===o&&!0===a?a="":"translate"===s&&"no"===a?a=!1:"o"===s[0]&&"n"===s[1]?"ondoubleclick"===s?o="ondblclick":"onchange"!==s||"input"!==n&&"textarea"!==n||Cn(e.type)?"onfocus"===s?o="onfocusin":"onblur"===s?o="onfocusout":Sn.test(o)&&(o=s):s=o="oninput":r&&kn.test(o)?o=o.replace(_n,"-$&").toLowerCase():null===a&&(a=void 0),"oninput"===s&&i[o=s]&&(o="oninputCapture"),i[o]=a}}"select"==n&&(i.multiple&&Array.isArray(i.value)&&(i.value=dt(e.children).forEach(function(t){t.props.selected=-1!=i.value.indexOf(t.props.value)})),null!=i.defaultValue&&(i.value=dt(e.children).forEach(function(t){t.props.selected=i.multiple?-1!=i.defaultValue.indexOf(t.props.value):i.defaultValue==t.props.value}))),e.class&&!e.className?(i.class=e.class,Object.defineProperty(i,"className",En)):e.className&&(i.class=i.className=e.className),t.props=i}(t),t.$$typeof=xn,On&&On(t)};var In=j.__r;j.__r=function(t){In&&In(t),t.__c};var Mn=j.diffed;function Pn(t,e){var n=Date.parse(t.created_at),i=Date.parse(e.created_at);return n!==i?n-i:t.id.localeCompare(e.id)}function Dn(t,e){return function(t){return t.length<2?t:[...t].sort(Pn)}([...t,e])}j.diffed=function(t){Mn&&Mn(t);var e=t.props,n=t.__e;null!=n&&"textarea"===t.type&&"value"in e&&e.value!==n.value&&(n.value=null==e.value?"":e.value)};var Rn="chat.stream",jn=/<!--vtilt:widget:([\s\S]*?)-->/g;function Nn(t){for(var e,n,i=[],r=new RegExp(jn.source,"g");null!==(n=r.exec(t));)try{var o=JSON.parse(n[1]);o.type&&i.push({type:o.type,params:null!==(e=o.params)&&void 0!==e?e:{}})}catch(t){}return i}function Un(t){return Bn.apply(this,arguments)}function Bn(){return Bn=s(function*(t){var e,n,i,{store:r,response:o,channelId:a,tempId:s,signal:u,isActive:h,onStreamStart:c,onComplete:d}=t,v=()=>{var t;return!(null==u?void 0:u.aborted)&&(null===(t=null==h?void 0:h())||void 0===t||t)},f=o.headers.get("X-Vtilt-Message-Id"),p=o.headers.get("X-Vtilt-Message-Created-At"),g=null!==(e=null!=s?s:f)&&void 0!==e?e:"temp-ai-"+Date.now();if(v()&&(null==c||c(g),v())){var m={id:g,channel_id:a,sender_type:"ai",sender_id:null,sender_name:"AI Assistant",sender_avatar_url:null,content:"",content_type:"text",metadata:{},created_at:null!=p?p:(new Date).toISOString()};r.setMessages(Dn(r.messages.value,m));var b=null===(n=o.body)||void 0===n?void 0:n.getReader();if(!b)return w().error(Rn,"no response body reader available"),void zn(r,g);var y=new TextDecoder,x="",k=null,S=!0,_=()=>{if(v()){var t=r.messages.value.findIndex(t=>t.id===g);if(-1!==t){var e=[...r.messages.value];e[t]=l({},e[t],{content:x.replace(/<[^>]*$/,"")}),r.setMessages(e)}}else zn(r,g)},T=()=>{null===k&&(k=requestAnimationFrame(()=>{_(),k=null}))};try{for(;;){if(!v())return void zn(r,g);var{done:C,value:A}=yield b.read();if(C)break;var E=y.decode(A,{stream:!0});x+=E,S?(S=!1,_()):T()}if(!v())return void zn(r,g);null!==k&&(cancelAnimationFrame(k),k=null),_();var O=r.messages.value.findIndex(t=>t.id===g);if(-1!==O){var I=Nn(x),M=[...r.messages.value],P=l({},null!==(i=M[O].metadata)&&void 0!==i?i:{});I.length>0&&(P.k=I),M[O]=l({},M[O],{content:x,metadata:P}),r.setMessages(M)}null==d||d(g)}catch(t){if(t instanceof DOMException&&"AbortError"===t.name)return void zn(r,g);w().error(Rn,"failed to handle streaming response:",t),zn(r,g)}finally{b.releaseLock(),null!==k&&cancelAnimationFrame(k)}}}),Bn.apply(this,arguments)}function zn(t,e){var n=t.messages.value.filter(t=>t.id!==e);n.length!==t.messages.value.length&&t.setMessages(n)}var qn=/<(?:p|ul|ol|li|h[1-6]|br|div|pre|blockquote)\b/i,Fn=new Set(["P","B","STRONG","I","EM","U","UL","OL","LI","BR","A","H1","H2","H3","H4","H5","H6","CODE","PRE","BLOCKQUOTE","DIV","SPAN"]);function Hn(t){var e=t;return e=(e=(e=(e=(e=(e=e.replace(/\*\*(.+?)\*\*/g,"<b>$1</b>")).replace(/__(.+?)__/g,"<b>$1</b>")).replace(/\*(.+?)\*/g,"<i>$1</i>")).replace(/(?<!\w)_(.+?)_(?!\w)/g,"<i>$1</i>")).replace(/`([^`]+)`/g,"<code>$1</code>")).replace(/\[([^\]]+)\]\(([^)]+)\)/g,'<a href="$2">$1</a>')}function Ln(t,e){for(var n=Array.from(t.children),i=0;i<n.length;){var r=n[i];if("LI"!==r.tagName)Ln(r,e),i++;else{for(var o=[],a=i;a<n.length&&"LI"===n[a].tagName;)o.push(n[a]),a++;var s=e.createElement("ul");for(var l of(t.insertBefore(s,o[0]),o))s.appendChild(l);i=a}}}function Wn(t,e){if(void 0===e&&(e="text"),!t)return"";var n=t.trim();if(!n)return"";if("undefined"==typeof document)return n;var i,r,o=function(t,e){return"html"!==t&&!qn.test(e)}(e,n)?function(t){if(!t||qn.test(t))return t;for(var e=t.split("\n"),n=[],i=0;i<e.length;){var r=e[i],o=r.match(/^(#{1,6})\s+(.+)$/);if(o){var a=o[1].length;n.push("<h"+a+">"+Hn(o[2])+"</h"+a+">"),i++}else if(/^[-*]\s+/.test(r)){for(var s=[];i<e.length&&/^[-*]\s+/.test(e[i]);)s.push("<li>"+Hn(e[i].replace(/^[-*]\s+/,""))+"</li>"),i++;n.push("<ul>"+s.join("")+"</ul>")}else if(/^\d+\.\s+/.test(r)){for(var l=[];i<e.length&&/^\d+\.\s+/.test(e[i]);)l.push("<li>"+Hn(e[i].replace(/^\d+\.\s+/,""))+"</li>"),i++;n.push("<ol>"+l.join("")+"</ol>")}else if(""!==r.trim()){for(var u=[];i<e.length&&""!==e[i].trim()&&!/^#{1,6}\s/.test(e[i])&&!/^[-*]\s+/.test(e[i])&&!/^\d+\.\s+/.test(e[i]);)u.push(Hn(e[i])),i++;n.push("<p>"+u.join("<br>")+"</p>")}else i++}return n.join("")}(n):n,a=document.createElement("div");return a.innerHTML=o,i=document,(r=t=>{for(var e of Array.from(t.children))if(Fn.has(e.tagName)){for(var n of Array.from(e.attributes))"A"===e.tagName&&"href"===n.name||e.removeAttribute(n.name);"A"===e.tagName&&(e.setAttribute("target","_blank"),e.setAttribute("rel","noopener noreferrer")),r(e)}else e.replaceWith(i.createTextNode(e.textContent||""))})(a),Ln(a,document),a.innerHTML}var Jn=cn(function(t){var{message:e,controller:n}=t,i=function(t){var e,n=null!==(e=t.metadata)&&void 0!==e?e:{},i=n.k;i&&0!==i.length||(i=n.widgets);i&&0!==i.length||!t.content||(i=Nn(t.content));return null!=i?i:[]}(e);return 0===i.length?null:At(rt,{children:i.map((t,i)=>{if(t.submitted)return At(Vn,{widget:t},i);var r=n.widgets.get(t.type);if(!r)return null;var o=n.getWidgetContext(e.id,t.type);return At("div",{children:r.render(t.params,o)},i)})})},(t,e)=>t.message===e.message&&t.controller===e.controller);function Vn(t){var e,n,{widget:i}=t;if("collect_email"===i.type){var r=null!==(e=i.submittedEmail)&&void 0!==e?e:"",o=null!==(n=i.submittedName)&&void 0!==n?n:"";return At("div",{class:"vt-widget",children:At("p",{class:"vt-widget-thanks",children:o?"✓ Thanks, "+o+"! We'll follow up at "+r+".":r?"✓ Thanks! We'll follow up at "+r+".":"✓ Thanks!"})})}return"escalate_to_human"===i.type?At("div",{class:"vt-widget",children:At("p",{class:"vt-widget-thanks",children:"✓ A team member has been notified. They'll join shortly."})}):At("div",{class:"vt-widget",children:At("p",{class:"vt-widget-thanks",children:"✓ Done"})})}var $n=cn(function(t){var{message:e,controller:n,isReadByAgent:i}=t,r="user"===e.sender_type?"out":"in",o=Jt(()=>function(t){if("user"===t.sender_type)return"";if("ai"===t.sender_type)return"AI Assistant";return t.sender_name||"Agent"}(e),[e.sender_type,e.sender_name]);return At("div",{class:"vt-message","data-direction":r,children:[At("div",{class:"vt-message-row",children:["in"===r&&At(Gn,{senderType:e.sender_type}),At(Kn,{message:e})]}),At(Jn,{message:e,controller:n}),At("div",{class:"vt-message-meta",children:[o?At("span",{children:o}):null,o?At("span",{children:" · "}):null,At("time",{children:Yn(e.created_at)}),"out"===r?At(Qn,{message:e,controller:n}):null,"out"===r&&i?At("span",{children:" · Read"}):null]})]})},(t,e)=>t.message===e.message&&t.message.delivery_status===e.message.delivery_status&&t.controller===e.controller&&t.isReadByAgent===e.isReadByAgent);function Kn(t){var e,{message:n}=t,i=(null!==(e=n.content)&&void 0!==e?e:"").replace(jn,"").trim();if(!i)return At("div",{class:"vt-message-bubble"});if(!I(n))return At("div",{class:"vt-message-bubble",children:i});var r=Wn(i,n.content_type);return At("div",{class:"vt-message-bubble",children:At("div",{class:"vt-md"+("user"===n.sender_type?" vt-user-md":""),dangerouslySetInnerHTML:{__html:r}})})}function Gn(t){var{senderType:e}=t,n="ai"===e;return At("div",{class:"vt-message-avatar","data-mode":n?"ai":"support",children:At(n?le:ue,{width:16,height:16})})}function Qn(t){var{message:e,controller:n}=t,i=e.delivery_status;return i?At("span","pending"===i||"sending"===i?{children:" · Sending…"}:{children:[" · ",At("button",{type:"button",class:"vt-message-retry",onClick:()=>n.retryFailedMessage(e.id),children:"Failed — tap to retry"})]}):null}function Yn(t){if(!t)return"";var e=new Date(t);return Number.isNaN(e.getTime())?"":e.toLocaleTimeString([],{hour:"2-digit",minute:"2-digit"})}function Xn(t){var{senderType:e,senderName:n}=t,i="ai"===e,r=i?"AI Assistant":n||"Agent";return At("div",{class:"vt-message","data-direction":"in","data-typing":"true",children:[At("div",{class:"vt-message-row",children:[At("div",{class:"vt-message-avatar","data-mode":i?"ai":"support",children:At(i?le:ue,{width:16,height:16})}),At("div",{class:"vt-message-bubble","data-typing":"true","aria-label":r+" is typing",children:[At("span",{class:"vt-typing-dot"}),At("span",{class:"vt-typing-dot"}),At("span",{class:"vt-typing-dot"})]})]}),At("div",{class:"vt-message-meta",children:At("span",{children:r})})]})}function Zn(t){var{count:e,visible:n,onJump:i}=t;return At("button",{type:"button",class:"vt-new-pill","data-visible":n&&e>0?"true":"false","aria-label":"Jump to latest messages",onClick:i,children:At("span",{children:e>1?"↓ "+e+" new messages":"↓ 1 new message"})})}function ti(t){var{store:e,scrollRef:n,messages:i,typingActive:r=!1}=t,o=Wt(null),a=Wt(0);return Lt(()=>{var t=n.current;if(t){var i=()=>{t.scrollHeight-t.scrollTop-t.clientHeight<80?e.userScrolledUp.value&&(e.userScrolledUp.value=!1,e.unreadNewMessagesCount.value=0):e.userScrolledUp.value||(e.userScrolledUp.value=!0)};return t.addEventListener("scroll",i,{passive:!0}),()=>t.removeEventListener("scroll",i)}},[n.current]),Lt(()=>{var t,r,s,l=n.current;if(l){var u=null!==(t=i[i.length-1])&&void 0!==t?t:null;if(u){var h=u.id,c=null!==(s=null===(r=u.content)||void 0===r?void 0:r.length)&&void 0!==s?s:0,d=h!==o.current,v=!d&&"ai"===u.sender_type&&c>a.current;if(d||v)if(o.current=h,a.current=c,d){if("user"===u.sender_type)return l.scrollTop=l.scrollHeight,e.userScrolledUp.value=!1,void(e.unreadNewMessagesCount.value=0);var f=l.scrollHeight-l.scrollTop-l.clientHeight<80;!e.userScrolledUp.value||f?l.scrollTop=l.scrollHeight:"agent"!==u.sender_type&&"ai"!==u.sender_type||(e.unreadNewMessagesCount.value=e.unreadNewMessagesCount.value+1)}else(t=>{var n=t.scrollHeight-t.scrollTop-t.clientHeight<80;e.userScrolledUp.value&&!n||(t.scrollTop=t.scrollHeight)})(l)}}},[i,n.current]),Lt(()=>{if(r){var t=n.current;if(t){var i=t.scrollHeight-t.scrollTop-t.clientHeight<80;e.userScrolledUp.value&&!i||(t.scrollTop=t.scrollHeight)}}},[r,n.current]),{jumpToBottom:()=>{var t=n.current;t&&(t.scrollTop=t.scrollHeight,e.userScrolledUp.value=!1,e.unreadNewMessagesCount.value=0)}}}function ei(t){var{store:e,controller:n}=t,i=Wt(null),r=e.messages.value,o=e.channel.value,a=e.agentLastReadAt.value,s=e.isTyping.value,l=e.typingSenderType.value,u=e.typingSender.value,{jumpToBottom:h}=ti({store:e,scrollRef:i,messages:r,typingActive:s});!function(t){var e,n,i,{store:r,controller:o,messages:a}=t;Lt(()=>{if(r.isOpen.value&&"conversation"===r.currentView.value&&r.channel.value){var t=setTimeout(()=>o.markAsRead(),80);return()=>clearTimeout(t)}},[null!==(n=null===(e=a[a.length-1])||void 0===e?void 0:e.id)&&void 0!==n?n:null,r.isOpen.value,r.currentView.value,null===(i=r.channel.value)||void 0===i?void 0:i.id])}({store:e,controller:n,messages:r});var c=!o&&e.isLoading.value&&0===r.length,d=!!o&&e.isLoading.value&&0===r.length,v=s&&("ai"===l||"agent"===l);return At("div",{class:"vt-messages-wrapper",children:[At("div",{class:"vt-messages",ref:i,children:c?At(Xn,{senderType:!1===n.config.aiMode?"agent":"ai"}):d?At(tn,{}):At(rt,{children:[r.map(t=>{return At($n,{message:t,controller:n,isReadByAgent:(e=t.created_at,!!a&&new Date(e)<=new Date(a))},t.id);var e}),v&&At(Xn,{senderType:l,senderName:u})]})}),At(Zn,{count:e.unreadNewMessagesCount.value,visible:e.userScrolledUp.value,onJump:h})]})}function ni(t){var e,{store:n,controller:i}=t,r="closed"===(null===(e=n.channel.value)||void 0===e?void 0:e.status);return At(rt,{children:[At(ei,{store:n,controller:i}),At(sn,{store:n}),r?At(an,{}):At(ln,{store:n,controller:i})]})}function ii(t){var{store:e,controller:n}=t,i=e.currentView.value;return At("div",{class:"vt-panel vt-opening",children:[At(on,{store:e,controller:n}),At("div",{class:"vt-content",children:At("list"===i?nn:ni,{store:e,controller:n})})]})}var ri="vtilt-chat-font";function oi(t){!function(){if("undefined"!=typeof document&&!document.getElementById(ri)){var t=document.createElement("link");t.rel="preconnect",t.href="https://fonts.gstatic.com",t.crossOrigin="anonymous",document.head.appendChild(t);var e=document.createElement("link");e.id=ri,e.rel="stylesheet",e.href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap",document.head.appendChild(e)}}();var e=document.createElement("div");e.id="vtilt-chat-host",e.style.cssText="all: initial; position: fixed; inset: auto; z-index: 999999; pointer-events: none;",document.body.appendChild(e);var n=e.attachShadow({mode:"open"}),i=document.createElement("style");i.textContent='\n/* Load Inter so the widget looks like vTilt on every host page. The @import\n sits at the very top of the stylesheet (required by the spec) and only\n fetches the variable-axis subset we need. If the host\'s CSP blocks Google\n Fonts the font-family fallback chain below keeps the widget legible. */\n@import url("https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap");\n\n:host {\n --vtilt-primary: #7B68EE;\n --vtilt-primary-shadow: rgba(123, 104, 238, 0.4);\n --vtilt-font: "Inter var", "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;\n --vtilt-radius: 16px;\n --vtilt-text: #000000;\n --vtilt-text-muted: #666666;\n --vtilt-text-subtle: #888888;\n --vtilt-bg: #ffffff;\n --vtilt-bg-list: #FAFAFA;\n --vtilt-border: #E5E5E5;\n --vtilt-border-light: #EEEEEE;\n --vtilt-skeleton: #E8E8EA;\n --vtilt-online: #16A34A;\n\n all: initial;\n font-family: var(--vtilt-font);\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n color: var(--vtilt-text);\n}\n\n*, *::before, *::after {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n}\n\nbutton {\n font-family: inherit;\n cursor: pointer;\n -webkit-tap-highlight-color: transparent;\n touch-action: manipulation;\n}\n\n/* =========================================================================\n * Container + bubble + panel\n * ========================================================================= */\n\n/* The host element gets \'all: initial\' inline (set in ChatRoot.tsx) so the\n host page can\'t position or style it. Inline styles win over \':host\' rules\n in the cascade, so the host\'s effective font-family / color end up at the\n UA default — and shadow children inherit from there. We re-establish the\n widget typography on .vt-container (which lives *inside* the shadow tree)\n so every descendant inherits Inter + the themed text color, regardless of\n what the host page or the host element\'s inline reset look like. */\n.vt-container {\n position: fixed;\n bottom: var(--vt-bubble-offset-bottom, 20px);\n /* Pin the container to the bubble\'s intrinsic size so it keeps the\n * same bounding box even after the bubble itself goes display:none on\n * open. Without this the container collapses to 0x0 and the absolutely\n * positioned panel anchors at that zero-size point — which means the\n * opened panel no longer overlaps the bubble\'s last visible footprint\n * for any non-default anchor (e.g. a bubble dragged to the bottom-left\n * with data-position="bottom-right" would see the panel jump 60px away\n * from where the bubble had been). With a fixed container size, the\n * panel\'s [data-panel-anchor] corner always coincides with the matching\n * corner of the bubble, regardless of drag offset. */\n width: 60px;\n height: 60px;\n z-index: 999999;\n font-family: var(--vtilt-font);\n font-size: 14px;\n line-height: 1.4;\n color: var(--vtilt-text);\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n.vt-container[data-position="bottom-right"] {\n right: var(--vt-bubble-offset-right, 20px);\n}\n.vt-container[data-position="bottom-left"] {\n left: var(--vt-bubble-offset-left, 20px);\n}\n.vt-container[data-hidden="true"] { display: none; }\n\n.vt-bubble {\n width: 60px;\n height: 60px;\n border-radius: 50%;\n background: var(--vtilt-primary);\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n box-shadow: 0 4px 16px var(--vtilt-primary-shadow);\n transition: transform 0.15s ease, box-shadow 0.15s ease;\n position: relative;\n border: none;\n}\n.vt-bubble:hover { transform: scale(1.05); box-shadow: 0 6px 20px var(--vtilt-primary-shadow); }\n.vt-bubble:active { transform: scale(0.95); }\n.vt-container[data-open="true"] .vt-bubble { display: none; }\n.vt-container[data-draggable="true"] .vt-bubble:hover,\n.vt-container[data-draggable="true"] .vt-bubble:active { transform: none; }\n\n.vt-bubble-badge {\n display: none;\n position: absolute;\n top: -4px;\n right: -4px;\n background: #E53935;\n color: white;\n font-size: 11px;\n font-weight: 700;\n min-width: 20px;\n height: 20px;\n border-radius: 10px;\n align-items: center;\n justify-content: center;\n padding: 0 6px;\n border: 2px solid white;\n}\n.vt-bubble-badge[data-visible="true"] { display: flex; }\n\n/* Panel position is driven by [data-panel-anchor] on the container.\n * The chat widget recomputes the anchor from the bubble\'s actual viewport\n * position (see usePanelAnchor in ui/ChatRoot.tsx) so the panel always\n * extends into whichever side has more room — even after the bubble has\n * been dragged across the viewport. The default anchor (no attribute) is\n * "bottom-right" so the very first paint, before JS has computed the\n * anchor, matches the most common default position.\n *\n * Per-anchor max-width / max-height are exposed as the CSS variables\n * --vt-panel-max-w and --vt-panel-max-h. JS sets them to the available\n * room from the chosen anchor (capped by the panel\'s intrinsic 380x600\n * design size), so on small or oddly-shaped viewports the panel never\n * overruns the opposite edge. The min(...) wrapper falls back to the\n * original "viewport minus 40px" formula when the variables aren\'t set. */\n.vt-panel {\n display: none;\n flex-direction: column;\n position: absolute;\n bottom: 0;\n right: 0;\n width: 380px;\n height: 600px;\n /* Effective size = min(intrinsic, room-from-anchor, viewport-minus-margin).\n * The viewport term is a backstop: while the chat is open we deliberately\n * freeze the per-anchor variable, so a viewport resize during open could\n * otherwise leave a stale value that overruns the opposite edge. */\n max-width: min(380px, var(--vt-panel-max-w, calc(100vw - 40px)), calc(100vw - 40px));\n max-height: min(600px, var(--vt-panel-max-h, calc(100vh - 40px)), calc(100vh - 40px));\n max-height: min(600px, var(--vt-panel-max-h, calc(100dvh - 40px)), calc(100dvh - 40px));\n background: var(--vtilt-bg);\n border-radius: var(--vtilt-radius);\n box-shadow: 0 5px 40px rgba(0, 0, 0, 0.16);\n overflow: hidden;\n}\n.vt-container[data-panel-anchor="bottom-left"] .vt-panel { right: auto; left: 0; }\n.vt-container[data-panel-anchor="top-right"] .vt-panel { bottom: auto; top: 0; }\n.vt-container[data-panel-anchor="top-left"] .vt-panel { bottom: auto; top: 0; right: auto; left: 0; }\n.vt-container[data-open="true"] .vt-panel { display: flex; }\n.vt-container[data-open="true"] .vt-panel.vt-opening {\n animation: vt-open 0.5s cubic-bezier(0.16, 1, 0.3, 1) forwards;\n /* The animation scales from 0.4 to 1; transform-origin decides which\n * corner of the panel that scale grows from. JS sets --vt-panel-origin\n * to the same corner usePanelAnchor picked for [data-panel-anchor], so\n * the panel always appears to "pop" out of the bubble. The fallback\n * matches the default bottom-right anchor used before JS computes a\n * direction (or in environments where the variable isn\'t set). */\n transform-origin: var(--vt-panel-origin, bottom right);\n}\n\n@keyframes vt-open {\n from { opacity: 0; transform: scale(0.4); }\n to { opacity: 1; transform: scale(1); }\n}\n\n/* =========================================================================\n * Header\n * ========================================================================= */\n\n.vt-header {\n background: var(--vtilt-bg);\n border-bottom: 1px solid var(--vtilt-border);\n padding: 18px 16px;\n padding-top: max(18px, env(safe-area-inset-top, 18px));\n display: flex;\n align-items: center;\n min-height: 60px;\n flex-shrink: 0;\n gap: 12px;\n}\n.vt-header[data-view="list"] {\n justify-content: space-between;\n}\n.vt-header[data-view="conversation"] {\n padding: 12px 16px;\n padding-top: max(12px, env(safe-area-inset-top, 12px));\n}\n\n.vt-header-title { font-weight: 600; font-size: 17px; color: var(--vtilt-text); }\n.vt-header-info { flex: 1; min-width: 0; }\n.vt-header-name { font-weight: 600; font-size: 16px; color: var(--vtilt-text); }\n.vt-header-status {\n font-size: 13px;\n color: var(--vtilt-online);\n display: flex;\n align-items: center;\n gap: 5px;\n margin-top: 1px;\n}\n.vt-header-status::before {\n content: "";\n width: 7px;\n height: 7px;\n background: var(--vtilt-online);\n border-radius: 50%;\n}\n\n.vt-iconbtn {\n background: transparent;\n border: none;\n color: var(--vtilt-text-muted);\n padding: 6px;\n border-radius: 4px;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n}\n.vt-iconbtn:hover { color: var(--vtilt-text); background: #F0F0F0; }\n.vt-header-back { margin-left: -6px; }\n.vt-header-close { margin-right: -6px; }\n\n.vt-header-avatar {\n width: 44px;\n height: 44px;\n border-radius: 50%;\n background: var(--vtilt-primary);\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n color: white;\n}\n.vt-header-avatar[data-mode="support"] { background: #DEDEDE; color: #666; }\n\n/* =========================================================================\n * Content area (channel list, conversation)\n * ========================================================================= */\n\n.vt-content {\n flex: 1;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n min-height: 0;\n background: var(--vtilt-bg);\n}\n\n/* Channel list ----------------------------------------------------------- */\n\n.vt-list-root {\n flex: 1;\n overflow-y: auto;\n -webkit-overflow-scrolling: touch;\n}\n\n.vt-list-empty {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 48px 24px;\n text-align: center;\n}\n.vt-list-empty-icon {\n width: 72px;\n height: 72px;\n margin-bottom: 24px;\n background: var(--vtilt-primary);\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n.vt-list-empty-title {\n font-size: 18px;\n font-weight: 600;\n color: var(--vtilt-text);\n margin-bottom: 12px;\n line-height: 1.4;\n max-width: 280px;\n}\n.vt-list-empty-subtitle {\n font-size: 14px;\n color: var(--vtilt-text-muted);\n margin-bottom: 28px;\n}\n\n.vt-channel-item {\n padding: 14px 16px;\n cursor: pointer;\n display: flex;\n align-items: center;\n gap: 12px;\n background: var(--vtilt-bg);\n border: none;\n width: 100%;\n text-align: left;\n border-bottom: 1px solid var(--vtilt-border-light);\n transition: background 0.1s ease;\n font: inherit;\n color: inherit;\n}\n.vt-channel-item:hover { background: #F5F5F5; }\n.vt-channel-item:active { background: #EBEBEB; }\n\n.vt-channel-avatar {\n width: 48px;\n height: 48px;\n border-radius: 50%;\n background: var(--vtilt-primary);\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n color: white;\n}\n.vt-channel-avatar[data-mode="support"] { background: #DEDEDE; color: #666; }\n\n.vt-channel-body { flex: 1; min-width: 0; }\n.vt-channel-row {\n display: flex;\n justify-content: space-between;\n align-items: center;\n gap: 8px;\n margin-bottom: 4px;\n}\n.vt-channel-name {\n font-weight: 500;\n font-size: 15px;\n color: var(--vtilt-text);\n line-height: 1.2;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.vt-channel-name[data-unread="true"] { font-weight: 600; }\n.vt-channel-time {\n font-size: 13px;\n color: var(--vtilt-text-subtle);\n white-space: nowrap;\n flex-shrink: 0;\n}\n.vt-channel-preview {\n font-size: 14px;\n color: var(--vtilt-text-subtle);\n font-weight: 400;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n flex: 1;\n min-width: 0;\n line-height: 1.4;\n}\n.vt-channel-preview[data-unread="true"] { color: #333; }\n.vt-channel-unread {\n min-width: 20px;\n height: 20px;\n padding: 0 6px;\n background: var(--vtilt-primary);\n border-radius: 10px;\n flex-shrink: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 12px;\n font-weight: 600;\n color: #FFFFFF;\n line-height: 1;\n}\n\n.vt-list-footer {\n padding: 16px;\n padding-bottom: max(16px, env(safe-area-inset-bottom, 16px));\n border-top: 1px solid var(--vtilt-border);\n}\n\n.vt-new-channel-btn {\n width: 100%;\n background: var(--vtilt-primary);\n color: white;\n border: none;\n border-radius: 100px;\n padding: 14px 24px;\n font-weight: 500;\n font-size: 15px;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 10px;\n box-shadow: 0 2px 8px var(--vtilt-primary-shadow);\n transition: opacity 0.1s ease;\n}\n.vt-new-channel-btn:hover { opacity: 0.9; }\n.vt-new-channel-btn:active { opacity: 0.8; }\n\n/* Conversation ----------------------------------------------------------- */\n\n.vt-messages-wrapper {\n position: relative;\n flex: 1;\n display: flex;\n flex-direction: column;\n min-height: 0;\n}\n\n.vt-messages {\n flex: 1;\n overflow-y: auto;\n -webkit-overflow-scrolling: touch;\n padding: 20px 16px 24px 16px;\n display: flex;\n flex-direction: column;\n gap: 12px;\n min-height: 0;\n background: var(--vtilt-bg-list);\n}\n\n.vt-message {\n display: flex;\n flex-direction: column;\n animation: vt-message-in 0.22s ease-out both;\n}\n.vt-message[data-direction="in"] { align-items: flex-start; }\n.vt-message[data-direction="out"] { align-items: flex-end; }\n\n.vt-message-row {\n display: flex;\n gap: 10px;\n align-items: flex-end;\n max-width: 85%;\n}\n.vt-message[data-direction="out"] .vt-message-row {\n flex-direction: row-reverse;\n}\n\n.vt-message-avatar {\n width: 32px;\n height: 32px;\n border-radius: 50%;\n background: var(--vtilt-primary);\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n color: white;\n}\n.vt-message-avatar[data-mode="support"] { background: #DEDEDE; color: #666; }\n\n.vt-message-bubble {\n padding: 10px 14px;\n background: var(--vtilt-bg);\n border-radius: 20px 20px 20px 4px;\n font-size: 14px;\n line-height: 1.4;\n color: var(--vtilt-text);\n word-wrap: break-word;\n overflow-wrap: anywhere;\n min-width: 0;\n}\n.vt-message[data-direction="out"] .vt-message-bubble {\n background: var(--vtilt-primary);\n color: white;\n border-radius: 20px 20px 4px 20px;\n}\n\n.vt-message-meta {\n font-size: 12px;\n color: var(--vtilt-text-subtle);\n margin-top: 6px;\n}\n.vt-message[data-direction="in"] .vt-message-meta { margin-left: 46px; }\n.vt-message[data-direction="out"] .vt-message-meta { margin-right: 4px; }\n\n.vt-message-retry {\n font: inherit;\n font-size: inherit;\n color: var(--vtilt-error, #dc2626);\n background: none;\n border: none;\n padding: 0;\n cursor: pointer;\n text-decoration: underline;\n}\n\n@keyframes vt-message-in {\n from { opacity: 0; transform: translateY(4px); }\n to { opacity: 1; transform: translateY(0); }\n}\n\n/* Markdown content rules (parity with chat-message-content.css) */\n.vt-md {\n max-width: 100%;\n overflow-wrap: anywhere;\n word-break: break-word;\n font-size: inherit;\n line-height: 1.45;\n}\n.vt-md p { margin: 0 0 0.5em 0; }\n.vt-md p:last-child { margin-bottom: 0; }\n.vt-md :is(b, strong) { font-weight: 600; }\n.vt-md :is(i, em) { font-style: italic; }\n.vt-md u { text-decoration: underline; }\n.vt-md :is(h1, h2, h3, h4, h5, h6) {\n font-size: 1em;\n font-weight: 600;\n margin: 0.65em 0 0.35em 0;\n line-height: 1.3;\n}\n.vt-md :is(h1, h2, h3):first-child { margin-top: 0.15em; }\n.vt-md :is(ul, ol) {\n list-style: none;\n margin: 0.5em 0;\n padding: 0 0 0 0.35em;\n}\n.vt-md li {\n display: flex;\n flex-direction: row;\n flex-wrap: wrap;\n align-items: flex-start;\n gap: 0.35em;\n margin: 0.2em 0;\n padding: 0;\n line-height: 1.45;\n}\n.vt-md ul > li::before {\n content: "•";\n display: inline-block;\n flex: 0 0 auto;\n line-height: 1.45;\n}\n.vt-md ul ul > li::before { content: "◦"; }\n.vt-md ol { counter-reset: vt-ol; }\n.vt-md ol > li { counter-increment: vt-ol; }\n.vt-md ol > li::before {\n content: counter(vt-ol) ".";\n display: inline-block;\n flex: 0 0 auto;\n min-width: 1.1em;\n line-height: 1.45;\n}\n.vt-md ol ol { counter-reset: vt-ol; }\n.vt-md li > :is(ul, ol) {\n flex: 1 0 100%;\n width: 100%;\n margin: 0.25em 0 0 0;\n padding-left: 0.75em;\n}\n.vt-md code {\n font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;\n font-size: 0.9em;\n background: rgba(0, 0, 0, 0.06);\n padding: 0.1em 0.35em;\n border-radius: 4px;\n}\n.vt-md pre {\n margin: 0.5em 0;\n padding: 0.5em 0.65em;\n border-radius: 6px;\n background: rgba(0, 0, 0, 0.06);\n overflow-x: auto;\n white-space: pre-wrap;\n}\n.vt-md pre code { background: none; padding: 0; }\n.vt-md blockquote {\n margin: 0.5em 0;\n padding-left: 0.75em;\n border-left: 3px solid rgba(0, 0, 0, 0.15);\n}\n.vt-md a { color: inherit; text-decoration: underline; }\n\n/* Brand-colored "out" bubble inverts code/pre/quote backdrop. */\n.vt-user-md code { background: rgba(255, 255, 255, 0.2); }\n.vt-user-md pre { background: rgba(255, 255, 255, 0.15); }\n.vt-user-md pre code { background: none; }\n.vt-user-md blockquote { border-left-color: rgba(255, 255, 255, 0.35); }\n\n/* Typing bubble + new-messages pill -------------------------------------\n *\n * The typing indicator is no longer a separate strip above the composer\n * - it is an inline .vt-message rendered as the last child of the\n * message list, reusing the avatar + bubble shape so the dots morph\n * into the real message when it arrives. The only typing-specific\n * style is the [data-typing] modifier that switches the bubble layout\n * to inline-flex so the three dots sit horizontally instead of\n * stacking. The dot animation rules are reused by TypingBubble. */\n\n.vt-message-bubble[data-typing="true"] {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n /* Critical: do NOT override the base .vt-message-bubble padding here.\n * The row uses align-items: flex-end, so a bubble shorter than a\n * single-line text bubble would bottom-align with the avatar and\n * visually sit lower than where the real message will appear. We\n * inherit 10px 14px from the base, then enforce a min content\n * height of one text line (14px font-size * 1.4 line-height) so the\n * total bubble height matches a single-line text bubble exactly.\n * When the dots morph into text the bubble stays put — no jolt. */\n min-height: 1.4em;\n}\n.vt-typing-dot {\n width: 6px;\n height: 6px;\n background: #B5B5B5;\n border-radius: 50%;\n animation: vt-typing-bounce 1.2s infinite;\n}\n.vt-typing-dot:nth-child(2) { animation-delay: 0.2s; }\n.vt-typing-dot:nth-child(3) { animation-delay: 0.4s; }\n@keyframes vt-typing-bounce {\n 0%, 60%, 100% { opacity: 0.35; transform: translateY(0); }\n 30% { opacity: 1; transform: translateY(-2px); }\n}\n\n.vt-new-pill {\n position: absolute;\n left: 50%;\n transform: translateX(-50%);\n bottom: 12px;\n background: var(--vtilt-primary);\n color: white;\n padding: 6px 14px;\n border-radius: 999px;\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n border: none;\n box-shadow: 0 2px 8px rgba(0,0,0,0.15);\n display: none;\n align-items: center;\n gap: 6px;\n z-index: 5;\n transition: opacity 0.15s ease;\n}\n.vt-new-pill[data-visible="true"] { display: flex; }\n.vt-new-pill:hover { opacity: 0.92; }\n\n/* Closed banner + connection banner ------------------------------------- */\n\n.vt-closed-banner {\n padding: 12px 16px;\n padding-bottom: max(12px, env(safe-area-inset-bottom, 12px));\n border-top: 1px solid var(--vtilt-border);\n text-align: center;\n background: var(--vtilt-bg-list);\n flex-shrink: 0;\n font-size: 14px;\n color: var(--vtilt-text-subtle);\n}\n\n/* Connection banner.\n *\n * Two visual modes:\n * - data-kind="reconnecting": slim pill. Pulsing dot + "Reconnecting"\n * label. Slate background — informational, not alarming.\n * - data-kind="failed": actionable card. Warning icon + "Connection\n * lost" + Retry button. Red because the user must act.\n */\n.vt-conn-banner {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 6px 12px;\n border-top: 1px solid var(--vtilt-border);\n font-size: 12px;\n font-weight: 500;\n flex-shrink: 0;\n}\n.vt-conn-banner[data-kind="reconnecting"] {\n background: #F8FAFC;\n color: #475569;\n justify-content: center;\n}\n.vt-conn-banner[data-kind="failed"] {\n background: #FEF2F2;\n color: #991B1B;\n}\n.vt-conn-banner-icon {\n display: inline-flex;\n flex-shrink: 0;\n color: #DC2626;\n}\n.vt-conn-banner-text {\n flex: 1;\n}\n.vt-conn-banner[data-kind="reconnecting"] .vt-conn-banner-text {\n flex: 0 0 auto;\n}\n.vt-conn-banner-dot {\n display: inline-block;\n width: 6px;\n height: 6px;\n border-radius: 50%;\n background: #F59E0B;\n flex-shrink: 0;\n animation: vt-conn-pulse 1.4s ease-in-out infinite;\n}\n@keyframes vt-conn-pulse {\n 0%, 100% { opacity: 1; transform: scale(1); }\n 50% { opacity: 0.4; transform: scale(0.85); }\n}\n.vt-conn-banner-action {\n appearance: none;\n border: 1px solid #DC2626;\n background: transparent;\n color: #DC2626;\n font: inherit;\n font-weight: 600;\n font-size: 11px;\n padding: 3px 10px;\n border-radius: 999px;\n cursor: pointer;\n flex-shrink: 0;\n transition: background 0.12s ease, color 0.12s ease;\n}\n.vt-conn-banner-action:hover,\n.vt-conn-banner-action:focus-visible {\n background: #DC2626;\n color: #FFFFFF;\n outline: none;\n}\n@media (prefers-reduced-motion: reduce) {\n .vt-conn-banner-dot {\n animation: none;\n }\n}\n\n/* Input ----------------------------------------------------------------- */\n\n.vt-input-container {\n padding: 8px 12px;\n padding-bottom: max(8px, env(safe-area-inset-bottom, 8px));\n border-top: 1px solid var(--vtilt-border);\n flex-shrink: 0;\n background: var(--vtilt-bg);\n}\n.vt-input-box {\n position: relative;\n border: 1px solid #DDD;\n border-radius: 12px;\n background: var(--vtilt-bg);\n transition: border-color 0.15s ease, box-shadow 0.15s ease;\n}\n.vt-input-box:focus-within {\n border-color: var(--vtilt-primary);\n box-shadow: 0 0 0 2px rgba(123, 104, 238, 0.12);\n}\n.vt-input-textarea {\n width: 100%;\n box-sizing: border-box;\n border: none;\n border-radius: 0;\n padding: 12px 48px 12px 12px;\n font-size: 16px;\n line-height: 1.4;\n outline: none;\n background: transparent;\n color: var(--vtilt-text);\n resize: none;\n overflow-y: auto;\n overflow-x: hidden;\n min-height: 60px;\n max-height: 120px;\n font-family: inherit;\n}\n.vt-input-textarea::placeholder { color: #999; }\n.vt-input-textarea:disabled { color: #BBB; cursor: not-allowed; }\n\n.vt-input-send {\n position: absolute;\n right: 4px;\n bottom: 4px;\n background: #E5E5E5;\n color: #999;\n border: none;\n border-radius: 50%;\n padding: 0;\n width: 32px;\n height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: background-color 0.15s ease, color 0.15s ease, opacity 0.15s ease;\n opacity: 0.6;\n}\n.vt-input-send[data-active="true"] {\n background: var(--vtilt-primary);\n color: white;\n cursor: pointer;\n opacity: 1;\n}\n.vt-input-send[data-active="true"]:hover { opacity: 0.9; }\n.vt-input-send[data-active="true"]:active { opacity: 0.8; transform: scale(0.95); }\n.vt-input-send:disabled { cursor: not-allowed; }\n\n.vt-input-container[data-pending="true"] .vt-input-box {\n background: var(--vtilt-bg-list);\n border-color: var(--vtilt-border-light);\n}\n\n/* Skeletons ------------------------------------------------------------- */\n\n@keyframes vt-skeleton-pulse {\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0.55; }\n}\n.vt-skeleton {\n background: var(--vtilt-skeleton);\n border-radius: 6px;\n animation: vt-skeleton-pulse 2.2s cubic-bezier(0.4, 0, 0.6, 1) infinite;\n}\n.vt-skeleton-circle {\n background: var(--vtilt-skeleton);\n border-radius: 50%;\n animation: vt-skeleton-pulse 2.2s cubic-bezier(0.4, 0, 0.6, 1) infinite;\n}\n\n/* Built-in widgets ------------------------------------------------------ */\n\n.vt-widget { margin-top: 10px; }\n.vt-widget p { margin: 0 0 10px 0; font-size: 14px; color: #333; }\n.vt-widget-input {\n font-family: inherit;\n font-size: 14px;\n padding: 8px 10px;\n border: 1px solid #DDD;\n border-radius: 8px;\n width: 100%;\n margin-bottom: 8px;\n}\n.vt-widget-input:focus { outline: none; border-color: var(--vtilt-primary); }\n.vt-widget-btn {\n padding: 10px 16px;\n background: var(--vtilt-primary);\n color: white;\n border: none;\n border-radius: 12px;\n font-size: 14px;\n font-weight: 600;\n cursor: pointer;\n}\n.vt-widget-btn[data-style="outline"] {\n background: transparent;\n color: var(--vtilt-primary);\n border: 2px solid var(--vtilt-primary);\n display: inline-flex;\n align-items: center;\n gap: 8px;\n}\n.vt-widget-btn:disabled { opacity: 0.6; cursor: not-allowed; }\n.vt-widget-thanks { font-size: 13px; color: var(--vtilt-online); margin: 0; }\n\n/* Mobile fullscreen ----------------------------------------------------\n *\n * On viewports <=480px the open panel covers the whole device, regardless\n * of where the bubble was dragged. The rules live in a media query (not\n * a JS-driven data attribute) so they remain correct on viewport resize\n * — rotation, browser-window resize, devtools toggling — without needing\n * a re-render to update an attribute.\n *\n * "transform: none !important" is required because bubble-drag.ts sets\n * an inline "transform: translate3d(...)" on the container. Per the CSS\n * cascade, author !important declarations win over inline normal styles,\n * so the open panel snaps back to (0, 0) and fills the viewport even\n * after the user has dragged the bubble away from its anchor corner.\n */\n\n@media (max-width: 480px) {\n .vt-bubble { width: 56px; height: 56px; }\n .vt-container { width: 56px; height: 56px; }\n\n .vt-container[data-open="true"] {\n top: 0; left: 0; right: 0; bottom: 0;\n /* Stretch the container from a 56x56 box back to the viewport so the\n * fullscreen panel inside has room to fill the screen. */\n width: auto; height: auto;\n transform: none !important;\n }\n .vt-container[data-open="true"] .vt-panel {\n position: absolute;\n top: 0; left: 0; right: 0; bottom: 0;\n width: 100%;\n max-width: none;\n height: 100%;\n max-height: none;\n border-radius: 0;\n box-shadow: none;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n * { animation-duration: 0.01ms !important; transition-duration: 0.01ms !important; }\n}\n',n.appendChild(i);var r=document.createElement("div");return r.style.cssText="pointer-events: auto;",n.appendChild(r),function(t,e){var n=()=>{var n=e.theme.value;t.style.setProperty("--vtilt-primary",n.primaryColor),t.style.setProperty("--vtilt-primary-shadow",n.primaryColor+"66"),t.style.setProperty("--vtilt-font",n.fontFamily),t.style.setProperty("--vtilt-radius",n.borderRadius)};n(),e.theme.subscribe(n)}(e,t.store),Tt(At(ai,{store:t.store,controller:t.controller,position:t.position,bubbleDraggable:t.bubbleDraggable}),r),{host:e,destroy(){Tt(null,r),e.remove()}}}function ai(t){var{store:e,controller:n,position:i,bubbleDraggable:r}=t,o=Wt(null),a=Wt(null),s=Wt(null),l=function(t,e){return Vt(()=>{var n=e.current;if(n&&"undefined"!=typeof window&&!t.isOpen.value){var i=n.getBoundingClientRect();if(0!==i.width&&0!==i.height){var r=window.innerWidth,o=window.innerHeight,a=(i.left+i.right)/2>r/2?"right":"left",s=(i.top+i.bottom)/2>o/2?"bottom":"top",l=s+"-"+a;n.setAttribute("data-panel-anchor",l),n.style.setProperty("--vt-panel-origin",s+" "+a);var u="right"===a?i.right:r-i.left,h="bottom"===s?i.bottom:o-i.top;n.style.setProperty("--vt-panel-max-w",Math.max(0,u-20)+"px"),n.style.setProperty("--vt-panel-max-h",Math.max(0,h-20)+"px")}}},[t,e])}(e,o);return function(t,e){var n=Ft(Et++,4);!Rt.__s&&Xt(n.__H,e)&&(n.__=t,n.u=e,Ot.__h.push(n))}(()=>{if(r&&o.current&&a.current)return s.current=Ge(o.current,{handle:a.current,onPositionChange:l}),()=>{var t;null===(t=s.current)||void 0===t||t.destroy(),s.current=null}},[r,l]),Lt(()=>{l();var t=()=>l();window.addEventListener("resize",t);var n=e.isOpen.subscribe(t=>{t||l()});return()=>{window.removeEventListener("resize",t),n()}},[e,l]),function(t){Lt(()=>{var e=t.isOpen.value,n=t.isOpen.subscribe(t=>{var n,i;if("undefined"!=typeof document){var r=function(t,e,n){return n?e&&!t?{nextWasOpen:!0,shouldLock:!0,shouldUnlock:!1}:!e&&t?{nextWasOpen:!1,shouldLock:!1,shouldUnlock:!0}:{nextWasOpen:e,shouldLock:!1,shouldUnlock:!1}:{nextWasOpen:e,shouldLock:!1,shouldUnlock:!1}}(e,t,"undefined"!=typeof window&&window.innerWidth<=480);e=r.nextWasOpen;var o=document.documentElement,a=document.body;if(r.shouldLock){var s=null!==(n=null===window||void 0===window?void 0:window.scrollY)&&void 0!==n?n:0;o.style.setProperty("overflow","hidden","important"),a.style.setProperty("overflow","hidden","important"),a.style.setProperty("position","fixed","important"),a.style.setProperty("width","100%","important"),a.style.top="-"+s+"px",a.dataset.vtScrollY=String(s)}else if(r.shouldUnlock){var l=Number(null!==(i=a.dataset.vtScrollY)&&void 0!==i?i:0);o.style.removeProperty("overflow"),a.style.removeProperty("overflow"),a.style.removeProperty("position"),a.style.removeProperty("width"),a.style.top="",delete a.dataset.vtScrollY,null===window||void 0===window||window.scrollTo(0,l)}}else e=t});return n},[t])}(e),At("div",{ref:o,class:"vt-container","data-position":i,"data-draggable":r?"true":"false","data-hidden":e.isVisible.value?"false":"true","data-open":e.isOpen.value?"true":"false",children:[At(Qe,{store:e,controller:n,bubbleRef:a}),At(ii,{store:e,controller:n})]})}var si=Object.defineProperty,li=Object.defineProperties,ui=Object.getOwnPropertyDescriptors,hi=Object.getOwnPropertySymbols,ci=Object.prototype.hasOwnProperty,di=Object.prototype.propertyIsEnumerable,vi=(t,e,n)=>e in t?si(t,e,{enumerable:!0,configurable:!0,writable:!0,value:n}):t[e]=n,fi=(t,e)=>{for(var n in e||(e={}))ci.call(e,n)&&vi(t,n,e[n]);if(hi)for(var n of hi(e))di.call(e,n)&&vi(t,n,e[n]);return t},pi=(t,e)=>li(t,ui(e)),gi=function(t,e){this[0]=t,this[1]=e},mi=class{},bi="undefined"!=typeof global?global:"undefined"!=typeof window?window:self;function yi(t,e){return(""+t).padStart(e?3:2,"0")}function wi(t){return mi.Config.logTimestamps?function(e){var n=new Date;t(yi(n.getHours())+":"+yi(n.getMinutes())+":"+yi(n.getSeconds())+"."+yi(n.getMilliseconds(),1)+" "+e)}:function(e){t(e)}}var xi=class t{constructor(){this.deprecated=(t,e)=>{this.deprecationWarning(t+" is deprecated and will be removed in a future version. "+e)},this.shouldLog=t=>t<=this.logLevel,this.setLog=(t,e)=>{void 0!==t&&(this.logLevel=t),void 0!==e&&(this.logHandler=this.logErrorHandler=e)},this.logLevel=t.defaultLogLevel,this.logHandler=t.defaultLogHandler,this.logErrorHandler=t.defaultLogErrorHandler}static initLogHandlers(){var e,n,i,[r,o]=("function"==typeof(null==(e=null==bi?void 0:bi.console)?void 0:e.log)?(n=function(){for(var t=arguments.length,e=new Array(t),n=0;n<t;n++)e[n]=arguments[n];console.log.apply(console,e)},i=console.warn?function(){for(var t=arguments.length,e=new Array(t),n=0;n<t;n++)e[n]=arguments[n];console.warn.apply(console,e)}:n):n=i=function(){},[n,i].map(wi));this.defaultLogHandler=r,this.defaultLogErrorHandler=o,this.defaultLogger=new t}static logActionNoStrip(t,e,n,i){t.logAction(e,n,i)}logAction(t,e,n){this.shouldLog(t)&&(1===t?this.logErrorHandler:this.logHandler)("Ably: "+e+": "+n,t)}renamedClientOption(t,e){this.deprecationWarning("The `"+t+"` client option has been renamed to `"+e+"`. Please update your code to use `"+e+"` instead. `"+t+"` will be removed in a future version.")}renamedMethod(t,e,n){this.deprecationWarning("`"+t+"`’s `"+e+"` method has been renamed to `"+n+"`. Please update your code to use `"+n+"` instead. `"+e+"` will be removed in a future version.")}deprecationWarning(t){this.shouldLog(1)&&this.logErrorHandler("Ably: Deprecation warning - "+t,1)}};xi.defaultLogLevel=1,xi.LOG_NONE=0,xi.LOG_ERROR=1,xi.LOG_MAJOR=2,xi.LOG_MINOR=3,xi.LOG_MICRO=4,xi.logAction=(t,e,n,i)=>{xi.logActionNoStrip(t,e,n,i)};var ki=xi,Si={};function _i(t){var e="["+t.constructor.name;return t.message&&(e+=": "+t.message),t.statusCode&&(e+="; statusCode="+t.statusCode),t.code&&(e+="; code="+t.code),t.cause&&(e+="; cause="+Xi(t.cause)),!t.href||t.message&&t.message.indexOf("help.ably.io")>-1||(e+="; see "+t.href+" "),e+="]"}((t,e)=>{for(var n in e)si(t,n,{get:e[n],enumerable:!0})})(Si,{Format:()=>Vi,allSame:()=>Ji,allToLowerCase:()=>sr,allToUpperCase:()=>lr,arrChooseN:()=>ir,arrDeleteValue:()=>qi,arrEquals:()=>gr,arrIntersect:()=>Bi,arrIntersectOb:()=>zi,arrPopRandomElement:()=>$i,arrWithoutValue:()=>Fi,cheapRandStr:()=>er,containsValue:()=>Ni,copy:()=>Ei,createMissingPluginError:()=>mr,dataSizeBytes:()=>tr,decodeBody:()=>or,encodeBody:()=>ar,ensureArray:()=>Oi,forInOwnNonNullProperties:()=>Wi,getBackoffCoefficient:()=>ur,getGlobalObject:()=>dr,getJitterCoefficient:()=>hr,getRetryTime:()=>cr,inherits:()=>ji,inspectBody:()=>Zi,inspectError:()=>Xi,intersect:()=>Ui,isEmpty:()=>Mi,isErrorInfoOrPartialErrorInfo:()=>Yi,isNil:()=>Pi,isObject:()=>Ii,keysArray:()=>Hi,listenerToAsyncIterator:()=>xr,matchDerivedChannel:()=>fr,mixin:()=>Ai,parseQueryString:()=>Qi,prototypicalClone:()=>Ri,randomString:()=>nr,shallowClone:()=>Di,shallowEquals:()=>vr,stringifyValues:()=>Gi,throwMissingPluginError:()=>br,toBase64:()=>pr,toQueryString:()=>Ki,valuesArray:()=>Li,whenPromiseSettles:()=>rr,withTimeoutAsync:()=>yr});var Ti=class t extends Error{constructor(e,n,i,r){super(e),void 0!==Object.setPrototypeOf&&Object.setPrototypeOf(this,t.prototype),this.code=n,this.statusCode=i,this.cause=r}toString(){return _i(this)}static fromValues(e){var{message:n,code:i,statusCode:r}=e;if("string"!=typeof n||"number"!=typeof i||"number"!=typeof r)throw new Error("ErrorInfo.fromValues(): invalid values: "+mi.Config.inspect(e));var o=Object.assign(new t(n,i,r),e);return o.code&&!o.href&&(o.href="https://help.ably.io/error/"+o.code),o}},Ci=class t extends Error{constructor(e,n,i,r){super(e),void 0!==Object.setPrototypeOf&&Object.setPrototypeOf(this,t.prototype),this.code=n,this.statusCode=i,this.cause=r}toString(){return _i(this)}static fromValues(e){var{message:n,code:i,statusCode:r}=e;if("string"!=typeof n||!Pi(i)&&"number"!=typeof i||!Pi(r)&&"number"!=typeof r)throw new Error("PartialErrorInfo.fromValues(): invalid values: "+mi.Config.inspect(e));var o=Object.assign(new t(n,i,r),e);return o.code&&!o.href&&(o.href="https://help.ably.io/error/"+o.code),o}};function Ai(t){for(var e=0;e<(arguments.length<=1?0:arguments.length-1);e++){var n=e+1<1||arguments.length<=e+1?void 0:arguments[e+1];if(!n)break;for(var i in n)Object.prototype.hasOwnProperty.call(n,i)&&(t[i]=n[i])}return t}function Ei(t){return Ai({},t)}function Oi(t){return Pi(t)?[]:Array.isArray(t)?t:[t]}function Ii(t){return"[object Object]"==Object.prototype.toString.call(t)}function Mi(t){for(var e in t)return!1;return!0}function Pi(t){return null==t}function Di(t){var e=new Object;for(var n in t)e[n]=t[n];return e}function Ri(t,e){class n{}n.prototype=t;var i=new n;return e&&Ai(i,e),i}var ji=function(t,e){mi.Config.inherits?mi.Config.inherits(t,e):(t.super_=e,t.prototype=Ri(e.prototype,{constructor:t}))};function Ni(t,e){for(var n in t)if(t[n]==e)return!0;return!1}function Ui(t,e){return Array.isArray(e)?Bi(t,e):zi(t,e)}function Bi(t,e){for(var n=[],i=0;i<t.length;i++){var r=t[i];-1!=e.indexOf(r)&&n.push(r)}return n}function zi(t,e){for(var n=[],i=0;i<t.length;i++){var r=t[i];r in e&&n.push(r)}return n}function qi(t,e){var n=t.indexOf(e),i=-1!=n;return i&&t.splice(n,1),i}function Fi(t,e){var n=t.slice();return qi(n,e),n}function Hi(t,e){var n=[];for(var i in t)e&&!Object.prototype.hasOwnProperty.call(t,i)||n.push(i);return n}function Li(t,e){var n=[];for(var i in t)e&&!Object.prototype.hasOwnProperty.call(t,i)||n.push(t[i]);return n}function Wi(t,e){for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&t[n]&&e(n)}function Ji(t,e){if(0===t.length)return!0;var n=t[0][e];return t.every(function(t){return t[e]===n})}var Vi=(t=>(t.msgpack="msgpack",t.json="json",t))(Vi||{});function $i(t){return t.splice((e=t,Math.floor(Math.random()*e.length)),1)[0];var e}function Ki(t){var e=[];if(t)for(var n in t)e.push(encodeURIComponent(n)+"="+encodeURIComponent(t[n]));return e.length?"?"+e.join("&"):""}function Gi(t){return Object.fromEntries(Object.entries(t).map(t=>{var[e,n]=t;return[e,String(n)]}))}function Qi(t){for(var e,n=/([^?&=]+)=?([^&]*)/g,i={};e=n.exec(t);)i[decodeURIComponent(e[1])]=decodeURIComponent(e[2]);return i}function Yi(t){return"object"==typeof t&&null!==t&&(t instanceof Ti||t instanceof Ci)}function Xi(t){var e,n;return t instanceof Error||"ErrorInfo"===(null==(e=null==t?void 0:t.constructor)?void 0:e.name)||"PartialErrorInfo"===(null==(n=null==t?void 0:t.constructor)?void 0:n.name)?t.toString():mi.Config.inspect(t)}function Zi(t){return mi.BufferUtils.isBuffer(t)?t.toString():"string"==typeof t?t:mi.Config.inspect(t)}function tr(t){if(mi.BufferUtils.isBuffer(t))return mi.BufferUtils.byteLength(t);if("string"==typeof t)return mi.Config.stringByteSize(t);if("number"==typeof t)return 8;if("boolean"==typeof t)return 1;throw new Error("Expected input of Utils.dataSizeBytes to be a string, a number, a boolean or a buffer, but was: "+typeof t)}function er(){return String(Math.random()).substr(2)}var nr=function(){var t=s(function*(t){var e=yield mi.Config.getRandomArrayBuffer(t);return mi.BufferUtils.base64Encode(e)});return function(e){return t.apply(this,arguments)}}();function ir(t,e){for(var n=Math.min(e,t.length),i=t.slice(),r=[],o=0;o<n;o++)r.push($i(i));return r}function rr(t,e){t.then(t=>{null==e||e(null,t)}).catch(t=>{null==e||e(t)})}function or(t,e,n){return"msgpack"==n?(e||br("MsgPack"),e.decode(t)):JSON.parse(String(t))}function ar(t,e,n){return"msgpack"==n?(e||br("MsgPack"),e.encode(t,!0)):JSON.stringify(t)}function sr(t){return t.map(function(t){return t&&t.toLowerCase()})}function lr(t){return t.map(function(t){return t&&t.toUpperCase()})}function ur(t){return Math.min((t+2)/3,2)}function hr(){return 1-.2*Math.random()}function cr(t,e){return t*ur(e)*hr()}function dr(){return"undefined"!=typeof global?global:"undefined"!=typeof window?window:self}function vr(t,e){return Object.keys(t).every(n=>t[n]===e[n])&&Object.keys(e).every(n=>e[n]===t[n])}function fr(t){var e=t.match(/^(\[([^?]*)(?:(.*))\])?(.+)$/);if(!e||!e.length||e.length<5)throw new Ti("regex match failed",400,40010);if(e[2])throw new Ti("cannot use a derived option with a "+e[2]+" channel",400,40010);return{qualifierParam:e[3]||"",channelName:e[4]}}function pr(t){var e=mi.BufferUtils,n=e.utf8Encode(t);return e.base64Encode(n)}function gr(t,e){return t.length===e.length&&t.every(function(t,n){return t===e[n]})}function mr(t){return new Ti(t+" plugin not provided",40019,400)}function br(t){throw mr(t)}function yr(t,e,n){return wr.apply(this,arguments)}function wr(){return wr=s(function*(t,e,n){void 0===e&&(e=5e3),void 0===n&&(n="Timeout expired");var i=new Ti(n,5e4,500);return Promise.race([t,new Promise((t,n)=>setTimeout(()=>n(i),e))])}),wr.apply(this,arguments)}function xr(t){return n=(t,i,r,o)=>{try{var a=e[t](i),s=(i=a.value)instanceof gi,l=a.done;Promise.resolve(s?i[0]:i).then(e=>s?n("return"===t?t:"next",i[1]?{done:e.done,value:e.value}:e,r,o):r({value:e,done:l})).catch(t=>n("throw",t,r,o))}catch(t){o(t)}},i=t=>r[t]=e=>new Promise((i,r)=>n(t,e,i,r)),r={},e=(e=function*(){var e=[],n=null,i=t(t=>{if(n){var i=n;n=null,i(t)}else e.push(t)});try{for(;;)if(e.length>0)yield e.shift();else{if(n)throw new Ti("Concurrent next() calls are not supported",4e4,400);var r=yield new gi(new Promise(t=>{n=t}));yield r}}finally{i()}}).apply(this,null),r[Symbol.asyncIterator]=()=>r,i("next"),i("throw"),i("return"),r;var e,n,i,r}var kr="2.17.0",Sr={ENDPOINT:"main",ENVIRONMENT:"",REST_HOST:"rest.ably.io",REALTIME_HOST:"realtime.ably.io",FALLBACK_HOSTS:["main.a.fallback.ably-realtime.com","main.b.fallback.ably-realtime.com","main.c.fallback.ably-realtime.com","main.d.fallback.ably-realtime.com","main.e.fallback.ably-realtime.com"],PORT:80,TLS_PORT:443,TIMEOUTS:{disconnectedRetryTimeout:15e3,suspendedRetryTimeout:3e4,httpRequestTimeout:1e4,httpMaxRetryDuration:15e3,channelRetryTimeout:15e3,fallbackRetryTimeout:6e5,connectionStateTtl:12e4,realtimeRequestTimeout:1e4,recvTimeout:9e4,webSocketConnectTimeout:1e4,webSocketSlowTimeout:4e3},httpMaxRetryCount:3,maxMessageSize:65536,version:kr,protocolVersion:5,agent:"ably-js/"+kr,getPort:function(t,e){return e||t.tls?t.tlsPort:t.port},getHttpScheme:function(t){return t.tls?"https://":"http://"},getPrimaryDomainFromEndpoint:Tr,getEndpointFallbackHosts:Cr,getFallbackHosts:Er,getHosts:function(t){return[t.primaryDomain].concat(Er(t))},checkHost:Or,objectifyOptions:function(t,e,n,i,r){if(void 0===t){var o=e?n+" must be initialized with either a client options object, an Ably API key, or an Ably Token":n+" must be initialized with a client options object";throw ki.logAction(i,ki.LOG_ERROR,n+"()",o),new Error(o)}var a;if("string"==typeof t)if(-1==t.indexOf(":")){if(!e){var s=n+" cannot be initialized with just an Ably Token; you must provide a client options object with a `plugins` property. (Set this Ably Token as the object’s `token` property.)";throw ki.logAction(i,ki.LOG_ERROR,n+"()",s),new Error(s)}a={token:t}}else{if(!e){var l=n+" cannot be initialized with just an Ably API key; you must provide a client options object with a `plugins` property. (Set this Ably API key as the object’s `key` property.)";throw ki.logAction(i,ki.LOG_ERROR,n+"()",l),new Error(l)}a={key:t}}else a=t;r&&(a=pi(fi({},a),{plugins:fi(fi({},r),a.plugins)}));return a},normaliseOptions:function(t,e,n){var i=null!=n?n:ki.defaultLogger;t.environment&&i.deprecated("The `environment` client option","Use the `endpoint` client option instead.");t.restHost&&i.deprecated("The `restHost` client option","Use the `endpoint` client option instead.");t.realtimeHost&&i.deprecated("The `realtimeHost` client option","Use the `endpoint` client option instead.");Mr(t),"function"==typeof t.recover&&!0===t.closeOnUnload&&(ki.logAction(i,ki.LOG_ERROR,"Defaults.normaliseOptions","closeOnUnload was true and a session recovery function was set - these are mutually exclusive, so unsetting the latter"),t.recover=void 0);"closeOnUnload"in t||(t.closeOnUnload=!t.recover);"queueMessages"in t||(t.queueMessages=!0);var r=t.endpoint||Sr.ENDPOINT;t.fallbackHosts||t.restHost||t.realtimeHost||t.port||t.tlsPort||(t.fallbackHosts=Cr(t.environment||r));var o=t.environment&&t.environment+".realtime.ably.net",a=t.restHost||t.realtimeHost||o||Tr(r);(t.fallbackHosts||[]).concat(a).forEach(Or),t.port=t.port||Sr.PORT,t.tlsPort=t.tlsPort||Sr.TLS_PORT,"tls"in t||(t.tls=!0);var s=function(t){var e={};for(var n in Sr.TIMEOUTS)e[n]=t[n]||Sr.TIMEOUTS[n];return e}(t);t.useBinaryProtocol=!!e&&("useBinaryProtocol"in t?mi.Config.supportsBinary&&t.useBinaryProtocol:mi.Config.preferBinary);var l={};t.clientId&&(l["X-Ably-ClientId"]=mi.BufferUtils.base64Encode(mi.BufferUtils.utf8Encode(t.clientId)));"idempotentRestPublishing"in t||(t.idempotentRestPublishing=!0);var u=null,h=t.connectivityCheckUrl;if(t.connectivityCheckUrl){var[c,d]=t.connectivityCheckUrl.split("?");u=d?Qi(d):{},-1===c.indexOf("://")&&(c="https://"+c),h=c}var v=t.wsConnectivityCheckUrl;v&&-1===v.indexOf("://")&&(v="wss://"+v);return pi(fi({},t),{primaryDomain:a,maxMessageSize:t.maxMessageSize||Sr.maxMessageSize,timeouts:s,connectivityCheckParams:u,connectivityCheckUrl:h,wsConnectivityCheckUrl:v,headers:l})},defaultGetHeaders:function(t,e){var{format:n,protocolVersion:i=Rr.protocolVersion}=void 0===e?{}:e;return{accept:Dr[null!=n?n:t.useBinaryProtocol?"msgpack":"json"],"X-Ably-Version":i.toString(),"Ably-Agent":Ir(t)}},defaultPostHeaders:function(t,e){var{format:n,protocolVersion:i=Rr.protocolVersion}=void 0===e?{}:e,r=Dr[null!=n?n:t.useBinaryProtocol?"msgpack":"json"];return{accept:r,"content-type":r,"X-Ably-Version":i.toString(),"Ably-Agent":Ir(t)}}};function _r(t){return t.includes(".")||t.includes("::")||"localhost"===t}function Tr(t){return _r(t)?t:t.startsWith("nonprod:")?t.replace("nonprod:","")+".realtime.ably-nonprod.net":t+".realtime.ably.net"}function Cr(t){return _r(t)?[]:t.startsWith("nonprod:")?Ar(t.replace("nonprod:",""),"ably-realtime-nonprod.com"):Ar(t,"ably-realtime.com")}function Ar(t,e){return["a","b","c","d","e"].map(n=>t+"."+n+".fallback."+e)}function Er(t){var e=t.fallbackHosts,n=void 0!==t.httpMaxRetryCount?t.httpMaxRetryCount:Sr.httpMaxRetryCount;return e?ir(e,n):[]}function Or(t){if("string"!=typeof t)throw new Ti("host must be a string; was a "+typeof t,4e4,400);if(!t.length)throw new Ti("host must not be zero-length",4e4,400)}function Ir(t){var e=Sr.agent;if(t.agents)for(var n in t.agents)e+=" "+n+"/"+t.agents[n];return e}function Mr(t){if(t.endpoint&&(t.environment||t.restHost||t.realtimeHost))throw new Ti("The `endpoint` option cannot be used in conjunction with the `environment`, `restHost`, or `realtimeHost` options.",40106,400);if(t.environment&&(t.restHost||t.realtimeHost))throw new Ti("The `environment` option cannot be used in conjunction with the `restHost`, or `realtimeHost` options.",40106,400)}function Pr(t,e,n){var i=n||{};if(i.cipher){t||br("Crypto");var r=t.getCipher(i.cipher,e);i.cipher=r.cipherParams,i.channelCipher=r.cipher}else"cipher"in i&&(i.cipher=void 0,i.channelCipher=null);return i}var Dr={json:"application/json",xml:"application/xml",html:"text/html",msgpack:"application/x-msgpack",text:"text/plain"},Rr={protocolVersion:Sr.protocolVersion};var jr=Sr;var Nr=class t{constructor(t,e){this.logger=t,this.members=e||[]}call(t,e){for(var n of this.members)if(n)try{n(t,e)}catch(t){ki.logAction(this.logger,ki.LOG_ERROR,"Multicaster multiple callback handler","Unexpected exception: "+t+"; stack = "+t.stack)}}push(){this.members.push(...arguments)}createPromise(){return new Promise((t,e)=>{this.push((n,i)=>{n?e(n):t(i)})})}resolveAll(t){this.call(null,t)}rejectAll(t){this.call(t)}static create(e,n){var i=new t(e,n);return Object.assign((t,e)=>i.call(t,e),{push:t=>i.push(t),createPromise:()=>i.createPromise(),resolveAll:t=>i.resolveAll(t),rejectAll:t=>i.rejectAll(t)})}},Ur=(t=>(t.Get="get",t.Delete="delete",t.Post="post",t.Put="put",t.Patch="patch",t))(Ur||{}),Br=Ur,zr=(t=>(t[t.Success=200]="Success",t[t.NoContent=204]="NoContent",t[t.BadRequest=400]="BadRequest",t[t.Unauthorized=401]="Unauthorized",t[t.Forbidden=403]="Forbidden",t[t.RequestTimeout=408]="RequestTimeout",t[t.InternalServerError=500]="InternalServerError",t))(zr||{});var qr=zr,Fr=Math.pow(2,17);function Hr(t){return Yi(t)?(t.code||(403===t.statusCode?t.code=40300:(t.code=40170,t.statusCode=401)),t):new Ti(Xi(t),t.code||40170,t.statusCode||401)}function Lr(t){if(!t)return"";"string"==typeof t&&(t=JSON.parse(t));var e=Object.create(null),n=Hi(t,!0);if(!n)return"";n.sort();for(var i=0;i<n.length;i++)e[n[i]]=t[n[i]].sort();return JSON.stringify(e)}function Wr(t,e){if(t.authCallback);else if(t.authUrl);else if(t.key);else if(!t.tokenDetails){var n="authOptions must include valid authentication parameters";throw ki.logAction(e,ki.LOG_ERROR,"Auth()",n),new Error(n)}}var Jr=0;var Vr=class{constructor(t,e){if(this.authOptions={},this.client=t,this.tokenParams=e.defaultTokenParams||{},this.currentTokenRequestId=null,this.waitingForTokenRequest=null,function(t){return t.useTokenAuth||!function(t){return"useTokenAuth"in t&&!t.useTokenAuth}(t)&&(t.authCallback||t.authUrl||t.token||t.tokenDetails)}(e))(function(t){return!t.key&&!t.authCallback&&!t.authUrl})(e)&&ki.logAction(this.logger,ki.LOG_ERROR,"Auth()","Warning: library initialized with a token literal without any way to renew the token when it expires (no authUrl, authCallback, or key). See https://help.ably.io/error/40171 for help"),this.C(e.defaultTokenParams,e),Wr(this.authOptions,this.logger);else{if(!e.key){var n="No authentication options provided; need one of: key, authUrl, or authCallback (or for testing only, token or tokenDetails)";throw ki.logAction(this.logger,ki.LOG_ERROR,"Auth()",n),new Ti(n,40160,401)}this.A(e)}}get logger(){return this.client.logger}authorize(t,e){var n=this;return s(function*(){if(e&&e.key&&n.authOptions.key!==e.key)throw new Ti("Unable to update auth options with incompatible key",40102,401);try{var i=yield n.O(null!=t?t:null,null!=e?e:null);return n.client.connection?new Promise((t,e)=>{n.client.connection.connectionManager.onAuthUpdated(i,(n,i)=>n?e(n):t(i))}):i}catch(t){throw n.client.connection&&t.statusCode===qr.Forbidden&&n.client.connection.connectionManager.actOnErrorFromAuthorize(t),t}})()}O(t,e){var n=this;return s(function*(){n.tokenDetails=null,n.C(t,e),Wr(n.authOptions,n.logger);try{return n.I(!0)}finally{delete n.tokenParams.timestamp,delete n.authOptions.queryTime}})()}requestToken(t,e){var n=this;return s(function*(){var i,r=e||n.authOptions,o=t||Ei(n.tokenParams),a=n.client;if(r.authCallback)i=r.authCallback;else if(r.authUrl)i=(t,e)=>{var i,o=Ai({accept:"application/json, text/plain"},r.authHeaders),a=r.authMethod&&"post"===r.authMethod.toLowerCase(),s=r.authUrl.indexOf("?");s>-1&&(i=Qi(r.authUrl.slice(s)),r.authUrl=r.authUrl.slice(0,s),a||(r.authParams=Ai(i,r.authParams)));var l=Ai({},r.authParams||{},t),u=t=>{var n,i,r=null!=(n=t.body)?n:null,o=null;if(t.error);else{var a=null!=(i=t.headers["content-type"])?i:null;o=Array.isArray(a)?a.join(", "):a}if(t.error)e(t.error,null);else if(t.unpacked)e(null,r);else if(mi.BufferUtils.isBuffer(r)&&(r=r.toString()),o){var s=o.indexOf("application/json")>-1,l=o.indexOf("text/plain")>-1||o.indexOf("application/jwt")>-1;if(s||l){if(s){if(r.length>Fr)return void e(new Ti("authUrl response exceeded max permitted length",40170,401),null);try{r=JSON.parse(r)}catch(t){return void e(new Ti("Unexpected error processing authURL response; err = "+t.message,40170,401),null)}}e(null,r,o)}else e(new Ti("authUrl responded with unacceptable content-type "+o+", should be either text/plain, application/jwt or application/json",40170,401),null)}else e(new Ti("authUrl response is missing a content-type header",40170,401),null)};if(a){var h=o||{};h["content-type"]="application/x-www-form-urlencoded";var c=Ki(l).slice(1);rr(n.client.http.doUri(Br.Post,r.authUrl,h,c,i),(t,e)=>u(t||e))}else rr(n.client.http.doUri(Br.Get,r.authUrl,o||{},null,l),(t,e)=>u(t||e))};else{if(!r.key){throw ki.logAction(n.logger,ki.LOG_ERROR,"Auth()","library initialized with a token literal without any way to renew the token when it expires (no authUrl, authCallback, or key). See https://help.ably.io/error/40171 for help"),new Ti("Need a new token, but authOptions does not include any way to request one (no authUrl, authCallback, or key)",40171,403)}i=(t,e)=>{rr(n.createTokenRequest(t,r),(t,n)=>e(t,null!=n?n:null))}}"capability"in o&&(o.capability=Lr(o.capability));return new Promise((t,e)=>{var s=!1,l=n.client.options.timeouts.realtimeRequestTimeout,u=setTimeout(()=>{s=!0;var t="Token request callback timed out after "+l/1e3+" seconds";ki.logAction(n.logger,ki.LOG_ERROR,"Auth.requestToken()",t),e(new Ti(t,40170,401))},l);i(o,(i,o,l)=>{if(!s){if(clearTimeout(u),i)return ki.logAction(n.logger,ki.LOG_ERROR,"Auth.requestToken()","token request signing call returned error; err = "+Xi(i)),void e(Hr(i));if("string"!=typeof o){if("object"!=typeof o||null===o){var h="Expected token request callback to call back with a token string or token request/details object, but got a "+typeof o;return ki.logAction(n.logger,ki.LOG_ERROR,"Auth.requestToken()",h),void e(new Ti(h,40170,401))}var c=JSON.stringify(o).length;if(c>Fr&&!r.suppressMaxLengthCheck)e(new Ti("Token request/details object exceeded max permitted stringified size (was "+c+" bytes)",40170,401));else if("issued"in o)t(o);else{if(!("keyName"in o)){var d="Expected token request callback to call back with a token string, token request object, or token details object";return ki.logAction(n.logger,ki.LOG_ERROR,"Auth.requestToken()",d),void e(new Ti(d,40170,401))}var v,f,p,g;f=(i,r,o)=>{if(i)return ki.logAction(n.logger,ki.LOG_ERROR,"Auth.requestToken()","token request API call returned error; err = "+Xi(i)),void e(Hr(i));o||(r=JSON.parse(r)),t(r)},p="/keys/"+(v=o).keyName+"/requestToken",g=jr.defaultPostHeaders(n.client.options,{format:"json"}),r.requestHeaders&&Ai(g,r.requestHeaders),rr(n.client.http.do(Br.Post,function(t){return a.baseUri(t)+p},g,JSON.stringify(v),null),(t,e)=>t?f(t):f(e.error,e.body,e.unpacked))}}else 0===o.length?e(new Ti("Token string is empty",40170,401)):o.length>Fr?e(new Ti("Token string exceeded max permitted length (was "+o.length+" bytes)",40170,401)):"undefined"===o||"null"===o?e(new Ti("Token string was literal null/undefined",40170,401)):"{"!==o[0]||l&&l.indexOf("application/jwt")>-1?t({token:o}):e(new Ti("Token was double-encoded; make sure you're not JSON-encoding an already encoded token request or details",40170,401))}})})})()}createTokenRequest(t,e){var n=this;return s(function*(){e=e||n.authOptions,t=t||Ei(n.tokenParams);var i=e.key;if(!i)throw new Ti("No key specified",40101,403);var r=i.split(":"),o=r[0],a=r[1];if(!a)throw new Ti("Invalid key specified",40101,403);if(""===t.clientId)throw new Ti("clientId can’t be an empty string",40012,400);"capability"in t&&(t.capability=Lr(t.capability));var s=Ai({keyName:o},t),l=t.clientId||"",u=t.ttl||"",h=t.capability||"";s.timestamp||(s.timestamp=yield n.M(e&&e.queryTime));var c=s.nonce||(s.nonce=("000000"+Math.floor(1e16*Math.random())).slice(-16)),d=s.timestamp,v=s.keyName+"\n"+u+"\n"+h+"\n"+l+"\n"+d+"\n"+c+"\n";return s.mac=s.mac||((t,e)=>{var n=mi.BufferUtils,i=n.utf8Encode(t),r=n.utf8Encode(e),o=n.hmacSha256(i,r);return n.base64Encode(o)})(v,a),s})()}getAuthParams(){var t=this;return s(function*(){if("basic"==t.method)return{key:t.key};var e=yield t.I(!1);if(!e)throw new Error("Auth.getAuthParams(): _ensureValidAuthCredentials returned no error or tokenDetails");return{access_token:e.token}})()}getAuthHeaders(){var t=this;return s(function*(){if("basic"==t.method)return{authorization:"Basic "+t.basicKey};var e=yield t.I(!1);if(!e)throw new Error("Auth.getAuthParams(): _ensureValidAuthCredentials returned no error or tokenDetails");return{authorization:"Bearer "+pr(e.token)}})()}A(t){this.method="basic",this.key=t.key,this.basicKey=pr(t.key),this.authOptions=t||{},"clientId"in t&&this.P(t.clientId)}C(t,e){this.method="token",t&&(this.tokenParams=t),e&&(e.token&&(e.tokenDetails="string"==typeof e.token?{token:e.token}:e.token),e.tokenDetails&&(this.tokenDetails=e.tokenDetails),"clientId"in e&&this.P(e.clientId),this.authOptions=e)}I(t){var e=this;return s(function*(){var n=e.tokenDetails;if(n){if(e.D(n.clientId))throw new Ti("Mismatch between clientId in token ("+n.clientId+") and current clientId ("+e.clientId+")",40102,403);if(!e.client.isTimeOffsetSet()||!n.expires||n.expires>=e.client.getTimestampUsingOffset())return n;e.tokenDetails=null}var i=(e.waitingForTokenRequest||(e.waitingForTokenRequest=Nr.create(e.logger))).createPromise();if(null!==e.currentTokenRequestId&&!t)return i;var r,o=e.currentTokenRequestId=Jr++,a=null;try{r=yield e.requestToken(e.tokenParams,e.authOptions)}catch(t){a=t}if(e.currentTokenRequestId>o)return i;e.currentTokenRequestId=null;var s=e.waitingForTokenRequest;return e.waitingForTokenRequest=null,a?(null==s||s.rejectAll(a),i):(null==s||s.resolveAll(e.tokenDetails=r),i)})()}P(t){if("string"!=typeof t&&null!==t)throw new Ti("clientId must be either a string or null",40012,400);if("*"===t)throw new Ti('Can’t use "*" as a clientId as that string is reserved. (To change the default token request behaviour to use a wildcard clientId, instantiate the library with {defaultTokenParams: {clientId: "*"}}), or if calling authorize(), pass it in as a tokenParam: authorize({clientId: "*"}, authOptions)',40012,400);var e=this.R(t);if(e)throw e}R(t){if(this.D(t)){var e="Unexpected clientId mismatch: client has "+this.clientId+", requested "+t,n=new Ti(e,40102,401);return ki.logAction(this.logger,ki.LOG_ERROR,"Auth._uncheckedSetClientId()",e),n}return this.clientId=this.tokenParams.clientId=t,null}D(t){return!(!this.clientId||"*"===this.clientId||!t||"*"===t||this.clientId===t)}static isTokenErr(t){return t.code&&t.code>=40140&&t.code<40150}revokeTokens(t,e){return this.client.rest.revokeTokens(t,e)}M(t){var e=this;return s(function*(){return e.client.getTimestamp(t||!!e.authOptions.queryTime)})()}};function $r(t){var e=[];if(t)for(var n in t)e.push(n+"="+t[n]);return e.join("&")}function Kr(t,e){return t+(e?"?":"")+$r(e)}var Gr=class{constructor(t){this.client=t,this.platformHttp=new mi.Http(t),this.checkConnectivity=this.platformHttp.checkConnectivity?()=>this.platformHttp.checkConnectivity():void 0}get logger(){var t,e;return null!=(e=null==(t=this.client)?void 0:t.logger)?e:ki.defaultLogger}get supportsAuthHeaders(){return this.platformHttp.supportsAuthHeaders}get supportsLinkHeaders(){return this.platformHttp.supportsLinkHeaders}j(t){var e=t.connection,n=e&&e.connectionManager.host;return n?[n].concat(jr.getFallbackHosts(t.options)):jr.getHosts(t.options)}do(t,e,n,i,r){var o=this;return s(function*(){try{var a=o.client;if(!a)return{error:new Ti("http.do called without client",5e4,500)};var l="function"==typeof e?e:function(t){return a.baseUri(t)+e},u=a.B;if(u){if(u.validUntil>Date.now()){var h=yield o.doUri(t,l(u.host),n,i,r);return h.error&&o.platformHttp.shouldFallback(h.error)?(a.B=null,o.do(t,e,n,i,r)):h}a.B=null}var c=o.j(a);if(1===c.length)return o.doUri(t,l(c[0]),n,i,r);var d=null,v=function(){var e=s(function*(e,s){var u=e.shift();d=null!=d?d:new Date;var h=yield o.doUri(t,l(u),n,i,r);return h.error&&o.platformHttp.shouldFallback(h.error)&&e.length?Date.now()-d.getTime()>a.options.timeouts.httpMaxRetryDuration?{error:new Ti("Timeout for trying fallback hosts retries. Total elapsed time exceeded the "+a.options.timeouts.httpMaxRetryDuration+"ms limit",50003,500)}:v(e,!0):(s&&(a.B={host:u,validUntil:Date.now()+a.options.timeouts.fallbackRetryTimeout}),h)});return function(t,n){return e.apply(this,arguments)}}();return v(c)}catch(t){return{error:new Ti("Unexpected error in Http.do: "+Xi(t),500,5e4)}}})()}doUri(t,e,n,i,r){var o=this;return s(function*(){try{!function(t,e,n,i,r){r.shouldLog(ki.LOG_MICRO)&&ki.logActionNoStrip(r,ki.LOG_MICRO,"Http."+t+"()","Sending; "+Kr(e,i)+"; Body"+(mi.BufferUtils.isBuffer(n)?" (Base64): "+mi.BufferUtils.base64Encode(n):": "+n))}(t,e,i,r,o.logger);var a=yield o.platformHttp.doUri(t,e,n,i,r);return o.logger.shouldLog(ki.LOG_MICRO)&&function(t,e,n,i,r){t.error?ki.logActionNoStrip(r,ki.LOG_MICRO,"Http."+e+"()","Received Error; "+Kr(n,i)+"; Error: "+Xi(t.error)):ki.logActionNoStrip(r,ki.LOG_MICRO,"Http."+e+"()","Received; "+Kr(n,i)+"; Headers: "+$r(t.headers)+"; StatusCode: "+t.statusCode+"; Body"+(mi.BufferUtils.isBuffer(t.body)?" (Base64): "+mi.BufferUtils.base64Encode(t.body):": "+t.body))}(a,t,e,r,o.logger),a}catch(t){return{error:new Ti("Unexpected error in Http.doUri: "+Xi(t),500,5e4)}}})()}};function Qr(t,e,n){for(var i,r,o,a=0;a<t.length;a++)if(i=t[a],n&&(i=i[n]),Array.isArray(i)){for(;-1!==(r=i.indexOf(e));)i.splice(r,1);n&&0===i.length&&delete t[a][n]}else if(Ii(i))for(o in i)Object.prototype.hasOwnProperty.call(i,o)&&Array.isArray(i[o])&&Qr([i],e,o)}var Yr=class{constructor(t){this.logger=t,this.any=[],this.events=Object.create(null),this.anyOnce=[],this.eventsOnce=Object.create(null)}on(){for(var t=arguments.length,e=new Array(t),n=0;n<t;n++)e[n]=arguments[n];if(1===e.length){var i=e[0];if("function"!=typeof i)throw new Error("EventListener.on(): Invalid arguments: "+mi.Config.inspect(e));this.any.push(i)}if(2===e.length){var[r,o]=e;if("function"!=typeof o)throw new Error("EventListener.on(): Invalid arguments: "+mi.Config.inspect(e));if(Pi(r))this.any.push(o);else if(Array.isArray(r))r.forEach(t=>{this.on(t,o)});else{if("string"!=typeof r)throw new Error("EventListener.on(): Invalid arguments: "+mi.Config.inspect(e));(this.events[r]||(this.events[r]=[])).push(o)}}}off(){for(var t=arguments.length,e=new Array(t),n=0;n<t;n++)e[n]=arguments[n];if(0==e.length||Pi(e[0])&&Pi(e[1]))return this.any=[],this.events=Object.create(null),this.anyOnce=[],void(this.eventsOnce=Object.create(null));var[i,r]=e,o=null,a=null;if(1!==e.length&&r){if("function"!=typeof r)throw new Error("EventEmitter.off(): invalid arguments:"+mi.Config.inspect(e));[a,o]=[i,r]}else"function"==typeof i?o=i:a=i;if(o&&Pi(a))Qr([this.any,this.events,this.anyOnce,this.eventsOnce],o);else if(Array.isArray(a))a.forEach(t=>{this.off(t,o)});else{if("string"!=typeof a)throw new Error("EventEmitter.off(): invalid arguments:"+mi.Config.inspect(e));o?Qr([this.events,this.eventsOnce],o,a):(delete this.events[a],delete this.eventsOnce[a])}}listeners(t){if(t){var e=this.events[t]||[];return this.eventsOnce[t]&&Array.prototype.push.apply(e,this.eventsOnce[t]),e.length?e:null}return this.any.length?this.any:null}emit(t){for(var e=arguments.length,n=new Array(e>1?e-1:0),i=1;i<e;i++)n[i-1]=arguments[i];var r={event:t},o=[];this.anyOnce.length&&(Array.prototype.push.apply(o,this.anyOnce),this.anyOnce=[]),this.any.length&&Array.prototype.push.apply(o,this.any);var a=this.eventsOnce[t];a&&(Array.prototype.push.apply(o,a),delete this.eventsOnce[t]);var s=this.events[t];s&&Array.prototype.push.apply(o,s),o.forEach(t=>{!function(t,e,n,i){try{n.apply(e,i)}catch(e){ki.logAction(t,ki.LOG_ERROR,"EventEmitter.emit()","Unexpected listener exception: "+e+"; stack = "+(e&&e.stack))}}(this.logger,r,t,n)})}once(){for(var t=arguments.length,e=new Array(t),n=0;n<t;n++)e[n]=arguments[n];var i=e.length;if(0===i||1===i&&"function"!=typeof e[0]){var r=e[0];return new Promise(t=>{this.once(r,t)})}var[o,a]=e;if(1===e.length&&"function"==typeof o)this.anyOnce.push(o);else if(Pi(o)){if("function"!=typeof a)throw new Error("EventEmitter.once(): Invalid arguments:"+mi.Config.inspect(e));this.anyOnce.push(a)}else if(Array.isArray(o)){var s=this,l=function(){var t=Array.prototype.slice.call(arguments);if(o.forEach(function(t){s.off(t,l)}),"function"!=typeof a)throw new Error("EventEmitter.once(): Invalid arguments:"+mi.Config.inspect(e));a.apply(this,t)};o.forEach(function(t){s.on(t,l)})}else{if("string"!=typeof o)throw new Error("EventEmitter.once(): Invalid arguments:"+mi.Config.inspect(e));var u=this.eventsOnce[o]||(this.eventsOnce[o]=[]);if(a){if("function"!=typeof a)throw new Error("EventEmitter.once(): Invalid arguments:"+mi.Config.inspect(e));u.push(a)}}}whenState(t,e){var n=this;return s(function*(){if("string"!=typeof t||"string"!=typeof e)throw new Error("whenState requires a valid state String argument");return t===e?null:n.once(t)})()}},Xr={HEARTBEAT:0,ACK:1,NACK:2,CONNECT:3,CONNECTED:4,DISCONNECT:5,DISCONNECTED:6,CLOSE:7,CLOSED:8,ERROR:9,ATTACH:10,ATTACHED:11,DETACH:12,DETACHED:13,PRESENCE:14,MESSAGE:15,SYNC:16,AUTH:17,ACTIVATE:18,OBJECT:19,OBJECT_SYNC:20,ANNOTATION:21},Zr=[];Object.keys(Xr).forEach(function(t){Zr[Xr[t]]=t});var to={HAS_PRESENCE:1,HAS_BACKLOG:2,RESUMED:4,TRANSIENT:16,ATTACH_RESUME:32,HAS_OBJECTS:128,PRESENCE:65536,PUBLISH:1<<17,SUBSCRIBE:1<<18,PRESENCE_SUBSCRIBE:1<<19,ANNOTATION_PUBLISH:1<<21,ANNOTATION_SUBSCRIBE:1<<22,OBJECT_SUBSCRIBE:1<<24,OBJECT_PUBLISH:1<<25},eo=Object.keys(to);to.MODE_ALL=to.PRESENCE|to.PUBLISH|to.SUBSCRIBE|to.PRESENCE_SUBSCRIBE|to.ANNOTATION_PUBLISH|to.ANNOTATION_SUBSCRIBE|to.OBJECT_SUBSCRIBE|to.OBJECT_PUBLISH;var no=["PRESENCE","PUBLISH","SUBSCRIBE","PRESENCE_SUBSCRIBE","ANNOTATION_PUBLISH","ANNOTATION_SUBSCRIBE","OBJECT_SUBSCRIBE","OBJECT_PUBLISH"];function io(){return(io=s(function*(t,e){var{data:n,encoding:i}=yield ro(t.data,t.encoding,e);return t.data=n,t.encoding=i,t})).apply(this,arguments)}function ro(t,e,n){return oo.apply(this,arguments)}function oo(){return(oo=s(function*(t,e,n){var i=n.channelCipher,r=t,o=e?e+"/":"";return mi.BufferUtils.isBuffer(r)||(r=mi.BufferUtils.utf8Encode(String(r)),o+="utf-8/"),{data:yield i.encrypt(r),encoding:o=o+"cipher+"+i.algorithm}})).apply(this,arguments)}function ao(){return ao=s(function*(t,e){var{data:n,encoding:i}=so(t.data,t.encoding);return t.data=n,t.encoding=i,null!=e&&e.cipher?function(t,e){return io.apply(this,arguments)}(t,e):t}),ao.apply(this,arguments)}function so(t,e){if("string"==typeof t||mi.BufferUtils.isBuffer(t)||null==t)return{data:t,encoding:e};if(Ii(t)||Array.isArray(t))return{data:JSON.stringify(t),encoding:e?e+"/json":"json"};throw new Ti("Data type is unsupported",40013,400)}function lo(){return(lo=s(function*(t,e){var{data:n,encoding:i,error:r}=yield uo(t.data,t.encoding,e);if(t.data=n,t.encoding=i,r)throw r})).apply(this,arguments)}function uo(t,e,n){return ho.apply(this,arguments)}function ho(){return ho=s(function*(t,e,n){var i,r=function(t){return t&&t.channelOptions?t:{channelOptions:t,plugins:{},baseEncodedPreviousPayload:void 0}}(n),o=t,a=t,s=e;if(e){var l,u=e.split("/"),h=u.length,c="";try{for(;(l=h)>0;){var d=u[--h].match(/([-\w]+)(\+([\w-]+))?/);if(!d)break;switch(c=d[1]){case"base64":a=mi.BufferUtils.base64Decode(String(a)),l==u.length&&(o=a);continue;case"utf-8":a=mi.BufferUtils.utf8Decode(a);continue;case"json":a=JSON.parse(a);continue;case"cipher":if(null!=r.channelOptions&&r.channelOptions.cipher&&r.channelOptions.channelCipher){var v=d[3],f=r.channelOptions.channelCipher;if(v!=f.algorithm)throw new Error("Unable to decrypt message with given cipher; incompatible cipher params");a=yield f.decrypt(a);continue}throw new Error("Unable to decrypt message; not an encrypted channel");case"vcdiff":if(!r.plugins||!r.plugins.vcdiff)throw new Ti("Missing Vcdiff decoder (https://github.com/ably-forks/vcdiff-decoder)",40019,400);if("undefined"==typeof Uint8Array)throw new Ti("Delta decoding not supported on this browser (need ArrayBuffer & Uint8Array)",40020,400);try{var p=r.baseEncodedPreviousPayload;"string"==typeof p&&(p=mi.BufferUtils.utf8Encode(p));var g=mi.BufferUtils.toBuffer(p);a=mi.BufferUtils.toBuffer(a),o=a=mi.BufferUtils.arrayBufferViewToBuffer(r.plugins.vcdiff.decode(a,g))}catch(t){throw new Ti("Vcdiff delta decode failed with "+t,40018,400)}continue;default:throw new Error("Unknown encoding")}}}catch(t){var m=t;i=new Ti("Error processing the "+c+" encoding, decoder returned ‘"+m.message+"’",m.code||40013,400)}finally{s=l<=0?null:u.slice(0,l).join("/")}}return i?{error:i,data:a,encoding:s}:(r.baseEncodedPreviousPayload=o,{data:a,encoding:s})}),ho.apply(this,arguments)}function co(){var t=arguments.length>0?"json":"msgpack",{data:e,encoding:n}=vo(this.data,this.encoding,t);return Object.assign({},this,{encoding:n,data:e})}function vo(t,e,n){return t&&mi.BufferUtils.isBuffer(t)?"msgpack"===n?{data:mi.BufferUtils.toBuffer(t),encoding:e}:{data:mi.BufferUtils.base64Encode(t),encoding:e?e+"/base64":"base64"}:{data:t,encoding:e}}var fo={encryptData:ro,encodeData:so,encodeDataForWire:vo,decodeData:uo};function po(t){var e,{id:n,connectionId:i,timestamp:r}=t;switch(t.action){case Xr.MESSAGE:e=t.messages;break;case Xr.PRESENCE:case Xr.SYNC:e=t.presence;break;case Xr.ANNOTATION:e=t.annotations;break;case Xr.OBJECT:case Xr.OBJECT_SYNC:e=t.state;break;default:throw new Ti("Unexpected action "+t.action,4e4,400)}for(var o=0;o<e.length;o++){var a=e[o];a.connectionId||(a.connectionId=i),a.timestamp||(a.timestamp=r),n&&!a.id&&(a.id=n+":"+o)}}function go(t,e){var n="["+e;for(var i in t)"data"===i?"string"==typeof t.data?n+="; data="+t.data:mi.BufferUtils.isBuffer(t.data)?n+="; data (buffer)="+mi.BufferUtils.base64Encode(t.data):void 0!==t.data&&(n+="; data (json)="+JSON.stringify(t.data)):!i||"extras"!==i&&"operation"!==i?"version"===i?n+="; version="+JSON.stringify(t[i]):"annotations"===i?n+="; annotations="+JSON.stringify(t[i]):void 0!==t[i]&&(n+="; "+i+"="+t[i]):n+="; "+i+"="+JSON.stringify(t[i]);return n+="]"}var mo=class{},bo=class{constructor(t){var e,n,i,r,o,a,s,l,u,h;this.Platform=mi,this.ErrorInfo=Ti,this.Logger=ki,this.Defaults=jr,this.Utils=Si,this.EventEmitter=Yr,this.MessageEncoding=fo,this.q=null!=(e=t.plugins)?e:null,this.logger=new ki,this.logger.setLog(t.logLevel,t.logHandler),this.F=null!=(i=null==(n=t.plugins)?void 0:n.MsgPack)?i:null;var c=this.options=jr.normaliseOptions(t,this.F,this.logger);if(c.key){var d=c.key.match(/^([^:\s]+):([^:.\s]+)$/);if(!d){var v="invalid key parameter";throw ki.logAction(this.logger,ki.LOG_ERROR,"BaseClient()",v),new Ti(v,40400,404)}c.keyName=d[1],c.keySecret=d[2]}if("clientId"in c){if("string"!=typeof c.clientId&&null!==c.clientId)throw new Ti("clientId must be either a string or null",40012,400);if("*"===c.clientId)throw new Ti('Can’t use "*" as a clientId as that string is reserved. (To change the default token request behaviour to use a wildcard clientId, use {defaultTokenParams: {clientId: "*"}})',40012,400)}this.B=null,this.serverTimeOffset=null,this.http=new Gr(this),this.auth=new Vr(this,c),this.H=(null==(r=t.plugins)?void 0:r.Rest)?new t.plugins.Rest(this):null,this.L=null!=(a=null==(o=t.plugins)?void 0:o.Crypto)?a:null,this.__FilteredSubscriptions=null!=(l=null==(s=t.plugins)?void 0:s.MessageInteractions)?l:null,this.J=null!=(h=null==(u=t.plugins)?void 0:u.Annotations)?h:null}get rest(){return this.H||br("Rest"),this.H}get V(){return this.__FilteredSubscriptions||br("MessageInteractions"),this.__FilteredSubscriptions}get channels(){return this.rest.channels}get push(){return this.rest.push}device(){var t;return(null==(t=this.options.plugins)?void 0:t.Push)&&this.push.LocalDevice||br("Push"),this.$||(this.$=this.push.LocalDevice.load(this)),this.$}baseUri(t){return jr.getHttpScheme(this.options)+t+":"+jr.getPort(this.options,!1)}stats(t){var e=this;return s(function*(){return e.rest.stats(t)})()}time(t){var e=this;return s(function*(){return e.rest.time(t)})()}request(t,e,n,i,r,o){var a=this;return s(function*(){return a.rest.request(t,e,n,i,r,o)})()}batchPublish(t){return this.rest.batchPublish(t)}batchPresence(t){return this.rest.batchPresence(t)}setLog(t){this.logger.setLog(t.level,t.handler)}getTimestamp(t){var e=this;return s(function*(){return!e.isTimeOffsetSet()&&t?e.time():e.getTimestampUsingOffset()})()}getTimestampUsingOffset(){return Date.now()+(this.serverTimeOffset||0)}isTimeOffsetSet(){return null!==this.serverTimeOffset}};bo.Platform=mi;var yo=bo,wo=["message.create","message.update","message.delete","meta","message.summary","message.append"];function xo(t){var e=0;return t.name&&(e+=t.name.length),t.clientId&&(e+=t.clientId.length),t.extras&&(e+=JSON.stringify(t.extras).length),t.data&&(e+=tr(t.data)),e}function ko(){return(ko=s(function*(t,e){return Promise.all(t.map(t=>t.encode(e)))})).apply(this,arguments)}var So=class t extends mo{expandFields(){if(this.version||(this.version={}),!this.version.serial&&this.serial&&(this.version.serial=this.serial),!this.version.timestamp&&this.timestamp&&(this.version.timestamp=this.timestamp),this.annotations?this.annotations.summary||(this.annotations.summary={}):this.annotations={summary:{}},this.annotations&&this.annotations.summary)for(var[t,e]of Object.entries(this.annotations.summary))if(t.endsWith(":distinct.v1")||t.endsWith(":unique.v1")||t.endsWith(":multiple.v1"))for(var[,n]of Object.entries(e))n.clipped||(n.clipped=!1);else t.endsWith(":flag.v1")&&(e.clipped||(e.clipped=!1))}encode(t){var e=this;return s(function*(){return function(t,e){return ao.apply(this,arguments)}(Object.assign(new _o,e,{action:wo.indexOf(e.action||"message.create")}),t)})()}static fromValues(e){return Object.assign(new t,e)}static fromValuesArray(e){return e.map(e=>t.fromValues(e))}toString(){return go(this,"Message")}},_o=class t extends mo{toJSON(){for(var t=arguments.length,e=new Array(t),n=0;n<t;n++)e[n]=arguments[n];return co.call(this,...e)}static fromValues(e){return Object.assign(new t,e)}static fromValuesArray(e){return e.map(e=>t.fromValues(e))}decodeWithErr(t,e){var n=this;return s(function*(){var i,r,o=Object.assign(new So,pi(fi({},n),{action:(i=n.action,wo[i||0]||"unknown")}));try{yield function(t,e){return lo.apply(this,arguments)}(o,t)}catch(t){ki.logAction(e,ki.LOG_ERROR,"WireMessage.decode()",Xi(t)),r=t}return o.expandFields(),{decoded:o,err:r}})()}decode(t,e){var n=this;return s(function*(){var{decoded:i}=yield n.decodeWithErr(t,e);return i})()}toString(){return go(this,"WireMessage")}},To=So,Co=class{constructor(t,e,n,i,r){this.previous=t,this.current=e,"attached"===e&&(this.resumed=n,this.hasBacklog=i),r&&(this.reason=r)}},Ao=function(){};function Eo(t){var e=t||{},{agent:n}=e;return((t,e)=>{var n={};for(var i in t)ci.call(t,i)&&e.indexOf(i)<0&&(n[i]=t[i]);if(null!=t&&hi)for(var i of hi(t))e.indexOf(i)<0&&di.call(t,i)&&(n[i]=t[i]);return n})(e,["agent"])}var Oo=class t extends Yr{constructor(t,e,n){var i,r,o;super(t.logger),this.K=null,this.G=0,this.retryCount=0,this.history=function(){var t=s(function*(t){var e=this.client.rest.channelMixin;if(t&&t.untilAttach){if("attached"!==this.state)throw new Ti("option untilAttach requires the channel to be attached",4e4,400);if(!this.properties.attachSerial)throw new Ti("untilAttach was specified and channel is attached, but attachSerial is not defined",4e4,400);delete t.untilAttach,t.from_serial=this.properties.attachSerial}return e.history(this,t)});return function(e){return t.apply(this,arguments)}}(),this.whenState=t=>Yr.prototype.whenState.call(this,t,this.state),this.name=e,this.channelOptions=Pr(null!=(i=t.L)?i:null,this.logger,n),this.client=t,this.Y=t.X?new t.X.RealtimePresence(this):null,t.J&&(this.K=new t.J.RealtimeAnnotations(this)),this.connectionManager=t.connection.connectionManager,this.state="initialized",this.subscriptions=new Yr(this.logger),this.syncChannelSerial=void 0,this.properties={attachSerial:void 0,channelSerial:void 0},this.setOptions(n),this.errorReason=null,this.tt=!1,this.et={channelOptions:this.channelOptions,plugins:t.options.plugins||{},baseEncodedPreviousPayload:void 0},this.nt={messageId:null,protocolMessageChannelSerial:null,decodeFailureRecoveryInProgress:null},this.it=new Yr(this.logger),(null==(r=t.options.plugins)?void 0:r.Push)&&(this.rt=new t.options.plugins.Push.PushChannel(this)),(null==(o=t.options.plugins)?void 0:o.LiveObjects)&&(this.ot=new t.options.plugins.LiveObjects.RealtimeObject(this))}get presence(){return this.Y||br("RealtimePresence"),this.Y}get annotations(){return this.K||br("Annotations"),this.K}get push(){return this.rt||br("Push"),this.rt}get object(){return this.ot||br("LiveObjects"),this.ot}invalidStateError(){return new Ti("Channel operation failed as channel state is "+this.state,90001,400,this.errorReason||void 0)}static processListenerArgs(t){return"function"==typeof(t=Array.prototype.slice.call(t))[0]&&t.unshift(null),t}setOptions(t){var e=this;return s(function*(){var n,i=e.channelOptions,r=function(t){if(t&&"params"in t&&!Ii(t.params))return new Ti("options.params must be an object",4e4,400);if(t&&"modes"in t){if(!Array.isArray(t.modes))return new Ti("options.modes must be an array",4e4,400);for(var e=0;e<t.modes.length;e++){var n=t.modes[e];if(!n||"string"!=typeof n||!no.includes(String.prototype.toUpperCase.call(n)))return new Ti("Invalid channel mode: "+n,4e4,400)}}}(t);if(r)throw r;if(e.channelOptions=Pr(null!=(n=e.client.L)?n:null,e.logger,t),e.et&&(e.et.channelOptions=e.channelOptions),e.st(t,i))return e.attachImpl(),new Promise((t,n)=>{e.it.once(["attached","update","detached","failed"],function(e){switch(this.event){case"update":case"attached":t();break;default:n(e.reason)}})})})()}st(t,e){if("attached"!==this.state&&"attaching"!==this.state)return!1;if(null==t?void 0:t.params){var n=Eo(t.params),i=Eo(e.params);if(Object.keys(n).length!==Object.keys(i).length)return!0;if(!vr(i,n))return!0}return!(!(null==t?void 0:t.modes)||e.modes&&gr(t.modes,e.modes))}publish(){var t=arguments,e=this;return s(function*(){var n,i,r=t.length<=0?void 0:t[0],o=t.length<=1?void 0:t[1];if("string"==typeof r||null==r)n=[To.fromValues({name:r,data:o})],i=t.length<=2?void 0:t[2];else if(Ii(r))n=[To.fromValues(r)],i=t.length<=1?void 0:t[1];else{if(!Array.isArray(r))throw new Ti("The single-argument form of publish() expects a message object or an array of message objects",40013,400);n=To.fromValuesArray(r),i=t.length<=1?void 0:t[1]}var a=e.client.options.maxMessageSize,s=yield function(t,e){return ko.apply(this,arguments)}(n,e.channelOptions),l=function(t){for(var e,n=0,i=0;i<t.length;i++)n+=(e=t[i]).size||(e.size=xo(e));return n}(s);if(l>a)throw new Ti("Maximum size of messages that can be published at once exceeded (was "+l+" bytes; limit is "+a+" bytes)",40009,400);e.throwIfUnpublishableState();var u=Do({action:Xr.MESSAGE,channel:e.name,messages:s,params:i?Gi(i):void 0});return(yield e.sendMessage(u))||{serials:[]}})()}throwIfUnpublishableState(){if(!this.connectionManager.activeState())throw this.connectionManager.getError();if("failed"===this.state||"suspended"===this.state)throw this.invalidStateError()}onEvent(t){for(var e=this.subscriptions,n=0;n<t.length;n++){var i=t[n];e.emit(i.name,i)}}attach(){var t=this;return s(function*(){return"attached"===t.state?null:new Promise((e,n)=>{t.lt(!1,null,(t,i)=>t?n(t):e(i))})})()}lt(t,e,n){n||(n=t=>{t&&ki.logAction(this.logger,ki.LOG_ERROR,"RealtimeChannel._attach()","Channel attach failed: "+t.toString())});var i=this.connectionManager;i.activeState()?(("attaching"!==this.state||t)&&this.requestState("attaching",e),this.once(function(t){switch(this.event){case"attached":null==n||n(null,t);break;case"detached":case"suspended":case"failed":null==n||n(t.reason||i.getError()||new Ti("Unable to attach; reason unknown; state = "+this.event,9e4,500));break;case"detaching":null==n||n(new Ti("Attach request superseded by a subsequent detach request",9e4,409))}})):n(i.getError())}attachImpl(){var t=Do({action:Xr.ATTACH,channel:this.name,params:this.channelOptions.params,channelSerial:this.properties.channelSerial});this.channelOptions.modes&&t.encodeModesToFlags(lr(this.channelOptions.modes)),this.tt&&t.setFlag("ATTACH_RESUME"),this.nt.decodeFailureRecoveryInProgress&&(t.channelSerial=this.nt.protocolMessageChannelSerial),this.sendMessage(t).catch(Ao)}detach(){var t=this;return s(function*(){var e=t.connectionManager;switch(t.state){case"suspended":return void t.notifyState("detached");case"detached":return;case"failed":throw new Ti("Unable to detach; channel state = failed",90001,400);default:if("connected"!==e.state.state)return void t.notifyState("detached");t.requestState("detaching");case"detaching":return new Promise((n,i)=>{t.once(function(t){switch(this.event){case"detached":n();break;case"attached":case"suspended":case"failed":i(t.reason||e.getError()||new Ti("Unable to detach; reason unknown; state = "+this.event,9e4,500));break;case"attaching":i(new Ti("Detach request superseded by a subsequent attach request",9e4,409))}})})}})()}detachImpl(){var t=Do({action:Xr.DETACH,channel:this.name});this.sendMessage(t).catch(Ao)}subscribe(){var e=arguments,n=this;return s(function*(){for(var i=e.length,r=new Array(i),o=0;o<i;o++)r[o]=e[o];var[a,s]=t.processListenerArgs(r);if("failed"===n.state)throw Ti.fromValues(n.invalidStateError());return a&&"object"==typeof a&&!Array.isArray(a)?n.client.V.subscribeFilter(n,a,s):n.subscriptions.on(a,s),!1!==n.channelOptions.attachOnSubscribe?n.attach():null})()}unsubscribe(){for(var e,n=arguments.length,i=new Array(n),r=0;r<n;r++)i[r]=arguments[r];var[o,a]=t.processListenerArgs(i);"object"==typeof o&&!a||(null==(e=this.filteredSubscriptions)?void 0:e.has(a))?this.client.V.getAndDeleteFilteredSubscriptions(this,o,a).forEach(t=>this.subscriptions.off(t)):this.subscriptions.off(o,a)}sync(){switch(this.state){case"initialized":case"detaching":case"detached":throw new Ci("Unable to sync to channel; not attached",4e4)}var t=this.connectionManager;if(!t.activeState())throw t.getError();var e=Do({action:Xr.SYNC,channel:this.name});this.syncChannelSerial&&(e.channelSerial=this.syncChannelSerial),t.send(e)}sendMessage(t){var e=this;return s(function*(){return new Promise((n,i)=>{e.connectionManager.send(t,e.client.options.queueMessages,(t,e)=>{t?i(t):n(e)})})})()}sendPresence(t){var e=this;return s(function*(){var n=Do({action:Xr.PRESENCE,channel:e.name,presence:t});yield e.sendMessage(n)})()}sendState(t){var e=this;return s(function*(){var n=Do({action:Xr.OBJECT,channel:e.name,state:t});yield e.sendMessage(n)})()}processMessage(t){var e=this;return s(function*(){t.action!==Xr.ATTACHED&&t.action!==Xr.MESSAGE&&t.action!==Xr.PRESENCE&&t.action!==Xr.OBJECT&&t.action!==Xr.ANNOTATION||e.setChannelSerial(t.channelSerial);var n,i=!1;switch(t.action){case Xr.ATTACHED:e.properties.attachSerial=t.channelSerial,e.G=t.getMode(),e.params=t.params||{};var r=t.decodeModesFromFlags();e.modes=r&&sr(r)||void 0;var o=t.hasFlag("RESUMED"),a=t.hasFlag("HAS_PRESENCE"),s=t.hasFlag("HAS_BACKLOG"),l=t.hasFlag("HAS_OBJECTS");if("attached"===e.state){o||(e.Y&&e.Y.onAttached(a),e.ot&&e.ot.onAttached(l));var u=new Co(e.state,e.state,o,s,t.error);e.it.emit("update",u),o&&!e.channelOptions.updateOnAttached||e.emit("update",u)}else"detaching"===e.state?e.checkPendingState():e.notifyState("attached",t.error,o,a,s,l);break;case Xr.DETACHED:var h=t.error?Ti.fromValues(t.error):new Ti("Channel detached",90001,404);"detaching"===e.state?e.notifyState("detached",h):"attaching"===e.state?e.notifyState("suspended",h):"attached"!==e.state&&"suspended"!==e.state||e.requestState("attaching",h);break;case Xr.SYNC:if(i=!0,n=e.syncChannelSerial=t.channelSerial,!t.presence)break;case Xr.PRESENCE:if(!t.presence)break;po(t);var c=e.channelOptions;if(e.Y){var d=yield Promise.all(t.presence.map(t=>t.decode(c,e.logger)));e.Y.setPresence(d,i,n)}break;case Xr.OBJECT:case Xr.OBJECT_SYNC:if(!e.ot||!t.state)return;po(t);var v=e.client.connection.connectionManager.getActiveTransportFormat(),f=t.state.map(t=>t.decode(e.client,v));t.action===Xr.OBJECT?e.ot.handleObjectMessages(f):e.ot.handleObjectSyncMessages(f,t.channelSerial);break;case Xr.MESSAGE:if("attached"!==e.state)return;po(t);var p=t.messages,g=p[0],m=p[p.length-1];if(g.extras&&g.extras.delta&&g.extras.delta.from!==e.nt.messageId){var b='Delta message decode failure - previous message not available for message "'+t.id+'" on this channel "'+e.name+'".';ki.logAction(e.logger,ki.LOG_ERROR,"RealtimeChannel.processMessage()",b),e.ut(new Ti(b,40018,400));break}for(var y=[],w=0;w<p.length;w++){var{decoded:x,err:k}=yield p[w].decodeWithErr(e.et,e.logger);if(y[w]=x,k)switch(k.code){case 40018:return void e.ut(k);case 40019:case 40021:return void e.notifyState("failed",k)}}e.nt.messageId=m.id,e.nt.protocolMessageChannelSerial=t.channelSerial,e.onEvent(y);break;case Xr.ANNOTATION:po(t);var S=e.channelOptions;if(e.K){var _=yield Promise.all((t.annotations||[]).map(t=>t.decode(S,e.logger)));e.K.ht(_)}break;case Xr.ERROR:var T=t.error;T&&80016==T.code?e.checkPendingState():e.notifyState("failed",Ti.fromValues(T))}})()}ut(t){this.nt.decodeFailureRecoveryInProgress||(this.nt.decodeFailureRecoveryInProgress=!0,this.lt(!0,t,()=>{this.nt.decodeFailureRecoveryInProgress=!1}))}onAttached(){}notifyState(t,e,n,i,r,o){if(this.clearStateTimer(),["detached","suspended","failed"].includes(t)&&(this.properties.channelSerial=null),t!==this.state){this.Y&&this.Y.actOnChannelState(t,i,e),this.ot&&this.ot.actOnChannelState(t,o),"suspended"===t&&this.connectionManager.state.sendEvents?this.startRetryTimer():this.cancelRetryTimer(),e&&(this.errorReason=e);var a=new Co(this.state,t,n,r,e),s='Channel state for channel "'+this.name+'"',l=t+(e?"; reason: "+e:"");"failed"===t&&ki.logAction(this.logger,ki.LOG_ERROR,s,l),"attaching"!==t&&"suspended"!==t&&(this.retryCount=0),"attached"===t&&this.onAttached(),"attached"===t?this.tt=!0:"detaching"!==t&&"failed"!==t||(this.tt=!1),this.state=t,this.it.emit(t,a),this.emit(t,a)}}requestState(t,e){this.notifyState(t,e),this.checkPendingState()}checkPendingState(){if(this.connectionManager.state.sendEvents)switch(this.state){case"attaching":this.startStateTimerIfNotRunning(),this.attachImpl();break;case"detaching":this.startStateTimerIfNotRunning(),this.detachImpl();break;case"attached":this.sync()}}timeoutPendingState(){switch(this.state){case"attaching":var t=new Ti("Channel attach timed out",90007,408);this.notifyState("suspended",t);break;case"detaching":var e=new Ti("Channel detach timed out",90007,408);this.notifyState("attached",e);break;default:this.checkPendingState()}}startStateTimerIfNotRunning(){this.stateTimer||(this.stateTimer=setTimeout(()=>{this.stateTimer=null,this.timeoutPendingState()},this.client.options.timeouts.realtimeRequestTimeout))}clearStateTimer(){var t=this.stateTimer;t&&(clearTimeout(t),this.stateTimer=null)}startRetryTimer(){if(!this.retryTimer){this.retryCount++;var t=cr(this.client.options.timeouts.channelRetryTimeout,this.retryCount);this.retryTimer=setTimeout(()=>{"suspended"===this.state&&this.connectionManager.state.sendEvents&&(this.retryTimer=null,this.requestState("attaching"))},t)}}cancelRetryTimer(){this.retryTimer&&(clearTimeout(this.retryTimer),this.retryTimer=null)}getReleaseErr(){var t=this.state;return"initialized"===t||"detached"===t||"failed"===t?null:new Ti("Can only release a channel in a state where there is no possibility of further updates from the server being received (initialized, detached, or failed); was "+t,90001,400)}setChannelSerial(t){t&&(this.properties.channelSerial=t)}status(){var t=this;return s(function*(){return t.client.rest.channelMixin.status(t)})()}getMessage(t){var e=this;return s(function*(){return e.client.rest.channelMixin.getMessage(e,t)})()}updateMessage(t,e,n){var i=this;return s(function*(){return i.sendUpdate(t,"message.update",e,n)})()}deleteMessage(t,e,n){var i=this;return s(function*(){return i.sendUpdate(t,"message.delete",e,n)})()}appendMessage(t,e,n){var i=this;return s(function*(){return i.sendUpdate(t,"message.append",e,n)})()}sendUpdate(t,e,n,i){var r=this;return s(function*(){var o,a;if(!t.serial)throw new Ti('This message lacks a serial and cannot be updated. Make sure you have enabled "Message annotations, updates, and deletes" in channel settings on your dashboard.',40003,400);r.throwIfUnpublishableState();var s=To.fromValues(pi(fi({},t),{action:e,version:n})),l=yield s.encode(r.channelOptions),u=Do({action:Xr.MESSAGE,channel:r.name,messages:[l],params:i?Gi(i):void 0}),h=yield r.sendMessage(u);return{versionSerial:null!=(a=null==(o=null==h?void 0:h.serials)?void 0:o[0])?a:null}})()}getMessageVersions(t,e){var n=this;return s(function*(){return n.client.rest.channelMixin.getMessageVersions(n,t,e)})()}ensureAttached(){var t=this;return s(function*(){switch(t.state){case"attached":case"suspended":break;case"initialized":case"detached":case"detaching":case"attaching":yield t.attach();break;default:throw Ti.fromValues(t.invalidStateError())}})()}},Io=ar;function Mo(t){var e=[];if(t)for(var n=0;n<t.length;n++)e.push(t[n].toString());return"[ "+e.join(", ")+" ]"}function Po(t,e,n,i,r,o){return function(t,e,n,i){var r,o,a,s,l;t.error&&(r=Ti.fromValues(t.error));t.messages&&(o=_o.fromValuesArray(t.messages));e&&t.presence&&(a=e.WirePresenceMessage.fromValuesArray(t.presence));n&&t.annotations&&(s=n.WireAnnotation.fromValuesArray(t.annotations));i&&t.state&&(l=i.WireObjectMessage.fromValuesArray(t.state,Si,fo));return Object.assign(new jo,pi(fi({},t),{presence:a,messages:o,annotations:s,state:l,error:r}))}(or(t,e,o),n,i,r)}function Do(t){return Object.assign(new jo,t)}function Ro(t,e,n,i){var r="[ProtocolMessage";void 0!==t.action&&(r+="; action="+Zr[t.action]||t.action);for(var o,a=["id","channel","channelSerial","connectionId","count","msgSerial","timestamp"],s=0;s<a.length;s++)void 0!==t[o=a[s]]&&(r+="; "+o+"="+t[o]);if(t.messages&&(r+="; messages="+Mo(_o.fromValuesArray(t.messages))),t.presence&&e&&(r+="; presence="+Mo(e.WirePresenceMessage.fromValuesArray(t.presence))),t.annotations&&n&&(r+="; annotations="+Mo(n.WireAnnotation.fromValuesArray(t.annotations))),t.state&&i&&(r+="; state="+Mo(i.WireObjectMessage.fromValuesArray(t.state,Si,fo))),t.error&&(r+="; error="+Ti.fromValues(t.error).toString()),t.auth&&t.auth.accessToken&&(r+="; token="+t.auth.accessToken),t.flags&&(r+="; flags="+eo.filter(t.hasFlag).join(",")),t.params){var l="";Wi(t.params,function(e){l.length>0&&(l+="; "),l+=e+"="+t.params[e]}),l.length>0&&(r+="; params=["+l+"]")}return r+="]"}var jo=class{constructor(){this.hasFlag=t=>(this.flags&to[t])>0}setFlag(t){return this.flags=this.flags|to[t]}getMode(){return(this.flags||0)&to.MODE_ALL}encodeModesToFlags(t){t.forEach(t=>this.setFlag(t))}decodeModesFromFlags(){var t=[];return no.forEach(e=>{this.hasFlag(e)&&t.push(e)}),t.length>0?t:void 0}},No=class extends Yr{constructor(t){super(t),this.messages=[]}count(){return this.messages.length}push(t){this.messages.push(t)}shift(){return this.messages.shift()}last(){return this.messages[this.messages.length-1]}copyAll(){return this.messages.slice()}append(t){this.messages.push.apply(this.messages,t)}prepend(t){this.messages.unshift.apply(this.messages,t)}completeMessages(t,e,n){e=e||null;var i=this.messages;if(0===i.length)throw new Error("MessageQueue.completeMessages(): completeMessages called on any empty MessageQueue");var r=[];if("all"===t)r=i.splice(0);else{var o=i[0];if(o){var a=o.message.msgSerial,s=t.serial+t.count;s>a&&(r=i.splice(0,s-a))}}for(var l=0;l<r.length;l++){var u=r[l],h=null==n?void 0:n[l];u.callback(e,h)}0==i.length&&this.emit("idle")}completeAllMessages(t){this.completeMessages("all",t)}resetSendAttempted(){for(var t of this.messages)t.sendAttempted=!1}clear(){this.messages=[],this.emit("idle")}},Uo=class{constructor(t,e){this.message=t,this.callback=e,this.merged=!1;var n=t.action;this.sendAttempted=!1,this.ackRequired="number"==typeof n&&[Xr.MESSAGE,Xr.PRESENCE,Xr.ANNOTATION,Xr.OBJECT].includes(n)}},Bo=class extends Yr{constructor(t){super(t.logger),this.transport=t,this.messageQueue=new No(this.logger),t.on("ack",(t,e,n)=>{this.onAck(t,e,n)}),t.on("nack",(t,e,n)=>{this.onNack(t,e,n)})}onAck(t,e,n){this.messageQueue.completeMessages({serial:t,count:e},null,n)}onNack(t,e,n){ki.logAction(this.logger,ki.LOG_ERROR,"Protocol.onNack()","serial = "+t+"; count = "+e+"; err = "+Xi(n)),n||(n=new Ti("Unable to send message; channel not responding",50001,500)),this.messageQueue.completeMessages({serial:t,count:e},n)}onceIdle(t){var e=this.messageQueue;0!==e.count()?e.once("idle",t):t()}send(t){t.ackRequired&&this.messageQueue.push(t),this.logger.shouldLog(ki.LOG_MICRO)&&ki.logActionNoStrip(this.logger,ki.LOG_MICRO,"Protocol.send()","sending msg; "+Ro(t.message,this.transport.connectionManager.realtime.X,this.transport.connectionManager.realtime.J,this.transport.connectionManager.realtime.ct)),t.sendAttempted=!0,this.transport.send(t.message)}getTransport(){return this.transport}getPendingMessages(){return this.messageQueue.copyAll()}clearPendingMessages(){return this.messageQueue.clear()}finish(){var t=this.transport;this.onceIdle(function(){t.disconnect()})}},zo=class{constructor(t,e,n,i){this.previous=t,this.current=e,n&&(this.retryIn=n),i&&(this.reason=i)}},qo={DISCONNECTED:80003,SUSPENDED:80002,FAILED:8e4,CLOSING:80017,CLOSED:80017,UNKNOWN_CONNECTION_ERR:50002,UNKNOWN_CHANNEL_ERR:50001};var Fo,Ho,Lo={disconnected:()=>Ti.fromValues({statusCode:400,code:qo.DISCONNECTED,message:"Connection to server temporarily unavailable"}),suspended:()=>Ti.fromValues({statusCode:400,code:qo.SUSPENDED,message:"Connection to server unavailable"}),failed:()=>Ti.fromValues({statusCode:400,code:qo.FAILED,message:"Connection failed or disconnected by server"}),closing:()=>Ti.fromValues({statusCode:400,code:qo.CLOSING,message:"Connection closing"}),closed:()=>Ti.fromValues({statusCode:400,code:qo.CLOSED,message:"Connection closed"}),unknownConnectionErr:()=>Ti.fromValues({statusCode:500,code:qo.UNKNOWN_CONNECTION_ERR,message:"Internal connection error"}),unknownChannelErr:()=>Ti.fromValues({statusCode:500,code:qo.UNKNOWN_CONNECTION_ERR,message:"Internal channel error"})},Wo=Do({action:Xr.CLOSE}),Jo=Do({action:Xr.DISCONNECT}),Vo=class extends Yr{constructor(t,e,n,i){super(t.logger),i&&(n.format=void 0,n.heartbeats=!0),this.connectionManager=t,this.auth=e,this.params=n,this.timeouts=n.options.timeouts,this.format=n.format,this.isConnected=!1,this.isFinished=!1,this.isDisposed=!1,this.maxIdleInterval=null,this.idleTimer=null,this.lastActivity=null}connect(){}close(){this.isConnected&&this.requestClose(),this.finish("closed",Lo.closed())}disconnect(t){this.isConnected&&this.requestDisconnect(),this.finish("disconnected",t||Lo.disconnected())}fail(t){this.isConnected&&this.requestDisconnect(),this.finish("failed",t||Lo.failed())}finish(t,e){var n;this.isFinished||(this.isFinished=!0,this.isConnected=!1,this.maxIdleInterval=null,clearTimeout(null!=(n=this.idleTimer)?n:void 0),this.idleTimer=null,this.emit(t,e),this.dispose())}onProtocolMessage(t){switch(this.logger.shouldLog(ki.LOG_MICRO)&&ki.logActionNoStrip(this.logger,ki.LOG_MICRO,"Transport.onProtocolMessage()","received on "+this.shortName+": "+Ro(t,this.connectionManager.realtime.X,this.connectionManager.realtime.J,this.connectionManager.realtime.ct)+"; connectionId = "+this.connectionManager.connectionId),this.onActivity(),t.action){case Xr.HEARTBEAT:ki.logActionNoStrip(this.logger,ki.LOG_MICRO,"Transport.onProtocolMessage()",this.shortName+" heartbeat; connectionId = "+this.connectionManager.connectionId),this.emit("heartbeat",t.id);break;case Xr.CONNECTED:this.onConnect(t),this.emit("connected",t.error,t.connectionId,t.connectionDetails,t);break;case Xr.CLOSED:this.onClose(t);break;case Xr.DISCONNECTED:this.onDisconnect(t);break;case Xr.ACK:this.emit("ack",t.msgSerial,t.count,t.res);break;case Xr.NACK:this.emit("nack",t.msgSerial,t.count,t.error);break;case Xr.SYNC:this.connectionManager.onChannelMessage(t,this);break;case Xr.ACTIVATE:break;case Xr.AUTH:rr(this.auth.authorize(),t=>{t&&ki.logAction(this.logger,ki.LOG_ERROR,"Transport.onProtocolMessage()","Ably requested re-authentication, but unable to obtain a new token: "+Xi(t))});break;case Xr.ERROR:if(void 0===t.channel){this.onFatalError(t);break}this.connectionManager.onChannelMessage(t,this);break;default:this.connectionManager.onChannelMessage(t,this)}}onConnect(t){if(this.isConnected=!0,!t.connectionDetails)throw new Error("Transport.onConnect(): Connect message recieved without connectionDetails");var e=t.connectionDetails.maxIdleInterval;e&&(this.maxIdleInterval=e+this.timeouts.realtimeRequestTimeout,this.onActivity())}onDisconnect(t){var e=t&&t.error;this.finish("disconnected",e)}onFatalError(t){var e=t&&t.error;this.finish("failed",e)}onClose(t){var e=t&&t.error;this.finish("closed",e)}requestClose(){this.send(Wo)}requestDisconnect(){this.send(Jo)}ping(t){var e={action:Xr.HEARTBEAT};t&&(e.id=t),this.send(Do(e))}dispose(){this.isDisposed=!0,this.off()}onActivity(){this.maxIdleInterval&&(this.lastActivity=this.connectionManager.lastActivity=Date.now(),this.setIdleTimer(this.maxIdleInterval+100))}setIdleTimer(t){this.idleTimer||(this.idleTimer=setTimeout(()=>{this.onIdleTimerExpire()},t))}onIdleTimerExpire(){if(!this.lastActivity||!this.maxIdleInterval)throw new Error("Transport.onIdleTimerExpire(): lastActivity/maxIdleInterval not set");this.idleTimer=null;var t=Date.now()-this.lastActivity,e=this.maxIdleInterval-t;if(e<=0){var n="No activity seen from realtime in "+t+"ms; assuming connection has dropped";ki.logAction(this.logger,ki.LOG_ERROR,"Transport.onIdleTimerExpire()",n),this.disconnect(new Ti(n,80003,408))}else this.setIdleTimer(e+100)}static tryConnect(t,e,n,i,r){var o,a=new t(e,n,i),s=function(t){clearTimeout(o),r({event:this.event,error:t})},l=e.options.timeouts.realtimeRequestTimeout;return o=setTimeout(()=>{a.off(["preconnect","disconnected","failed"]),a.dispose(),s.call({event:"disconnected"},new Ti("Timeout waiting for transport to indicate itself viable",5e4,500))},l),a.on(["failed","disconnected"],s),a.on("preconnect",function(){clearTimeout(o),a.off(["failed","disconnected"],s),r(null,a)}),a.connect(),a}static isAvailable(){throw new Ti("isAvailable not implemented for transport",5e4,500)}};(Ho=Fo||(Fo={})).WebSocket="web_socket",Ho.Comet="comet",Ho.XhrPolling="xhr_polling";var $o="undefined"!=typeof global?global:"undefined"!=typeof window?window:self,Ko=()=>{var t;return void 0!==mi.WebStorage&&(null==(t=mi.WebStorage)?void 0:t.localSupported)},Go=()=>{var t;return void 0!==mi.WebStorage&&(null==(t=mi.WebStorage)?void 0:t.sessionSupported)},Qo=function(){},Yo="ably-transport-preference";function Xo(t){try{return JSON.parse(t)}catch(t){return null}}var Zo=class{constructor(t,e,n,i){this.options=t,this.host=e,this.mode=n,this.connectionKey=i,this.format=t.useBinaryProtocol?"msgpack":"json"}getConnectParams(t){var e=t?Ei(t):{},n=this.options;switch(this.mode){case"resume":e.resume=this.connectionKey;break;case"recover":var i=Xo(n.recover);i&&(e.recover=i.connectionKey)}return void 0!==n.clientId&&(e.clientId=n.clientId),!1===n.echoMessages&&(e.echo="false"),void 0!==this.format&&(e.format=this.format),void 0!==this.stream&&(e.stream=this.stream),void 0!==this.heartbeats&&(e.heartbeats=this.heartbeats),e.v=jr.protocolVersion,e.agent=Ir(this.options),void 0!==n.transportParams&&Ai(e,n.transportParams),e}toString(){var t="[mode="+this.mode;return this.host&&(t+=",host="+this.host),this.connectionKey&&(t+=",connectionKey="+this.connectionKey),this.format&&(t+=",format="+this.format),t+="]"}},ta=class t extends Yr{constructor(t,e){super(t.logger),this.supportedTransports={},this.disconnectedRetryCount=0,this.pendingChannelMessagesState={isProcessing:!1,queue:[]},this.realtime=t,this.initTransports(),this.options=e;var n=e.timeouts,i=n.webSocketConnectTimeout+n.realtimeRequestTimeout;if(this.states={initialized:{state:"initialized",terminal:!1,queueEvents:!0,sendEvents:!1,failState:"disconnected"},connecting:{state:"connecting",terminal:!1,queueEvents:!0,sendEvents:!1,retryDelay:i,failState:"disconnected"},connected:{state:"connected",terminal:!1,queueEvents:!1,sendEvents:!0,failState:"disconnected"},disconnected:{state:"disconnected",terminal:!1,queueEvents:!0,sendEvents:!1,retryDelay:n.disconnectedRetryTimeout,failState:"disconnected"},suspended:{state:"suspended",terminal:!1,queueEvents:!1,sendEvents:!1,retryDelay:n.suspendedRetryTimeout,failState:"suspended"},closing:{state:"closing",terminal:!1,queueEvents:!1,sendEvents:!1,retryDelay:n.realtimeRequestTimeout,failState:"closed"},closed:{state:"closed",terminal:!0,queueEvents:!1,sendEvents:!1,failState:"closed"},failed:{state:"failed",terminal:!0,queueEvents:!1,sendEvents:!1,failState:"failed"}},this.state=this.states.initialized,this.errorReason=null,this.queuedMessages=new No(this.logger),this.msgSerial=0,this.connectionDetails=void 0,this.connectionId=void 0,this.connectionKey=void 0,this.connectionStateTtl=n.connectionStateTtl,this.maxIdleInterval=null,this.transports=Ui(e.transports||jr.defaultTransports,this.supportedTransports),this.transportPreference=null,this.transports.includes(Fo.WebSocket)&&(this.webSocketTransportAvailable=!0),this.transports.includes(Fo.XhrPolling)?this.baseTransport=Fo.XhrPolling:this.transports.includes(Fo.Comet)&&(this.baseTransport=Fo.Comet),this.domains=jr.getHosts(e),this.activeProtocol=null,this.host=null,this.lastAutoReconnectAttempt=null,this.lastActivity=null,this.forceFallbackHost=!1,this.connectCounter=0,this.wsCheckResult=null,this.webSocketSlowTimer=null,this.webSocketGiveUpTimer=null,this.abandonedWebSocket=!1,!this.transports.length){var r="no requested transports available";throw ki.logAction(this.logger,ki.LOG_ERROR,"realtime.ConnectionManager()",r),new Error(r)}var o=mi.Config.addEventListener;o&&(Go()&&"function"==typeof e.recover&&o("beforeunload",this.persistConnection.bind(this)),!0===e.closeOnUnload&&o("beforeunload",()=>{this.requestState({state:"closing"})}),o("online",()=>{var t;this.state==this.states.disconnected||this.state==this.states.suspended?this.requestState({state:"connecting"}):this.state==this.states.connecting&&(null==(t=this.pendingTransport)||t.off(),this.disconnectAllTransports(),this.startConnect())}),o("offline",()=>{this.state==this.states.connected&&this.disconnectAllTransports()}))}static supportedTransports(t){var e={supportedTransports:{}};return this.initTransports(t,e),e.supportedTransports}static initTransports(t,e){var n=fi(fi({},mi.Transports.bundledImplementations),t);[Fo.WebSocket,...mi.Transports.order].forEach(t=>{var i=n[t];i&&i.isAvailable()&&(e.supportedTransports[t]=i)})}initTransports(){t.initTransports(this.realtime.dt,this)}createTransportParams(t,e){return new Zo(this.options,t,e,this.connectionKey)}getTransportParams(t){(t=>{if(this.connectionKey)t("resume");else if("string"!=typeof this.options.recover){var e=this.options.recover,n=this.getSessionRecoverData();this.sessionRecoveryName(),n&&"function"==typeof e?e(n,e=>{e?(this.options.recover=n.recoveryKey,t("recover")):t("clean")}):t("clean")}else t("recover")})(e=>{var n=this.createTransportParams(null,e);if("recover"===e){var i=Xo(this.options.recover);i&&(this.msgSerial=i.msgSerial)}t(n)})}tryATransport(t,e,n){this.proposedTransport=Vo.tryConnect(this.supportedTransports[e],this,this.realtime.auth,t,(i,r)=>{var o,a=this.state;if(a==this.states.closing||a==this.states.closed||a==this.states.failed)return r&&r.close(),void n(!0);i?!Vr.isTokenErr(i.error)||this.errorReason&&Vr.isTokenErr(this.errorReason)?"failed"===i.event?(this.notifyState({state:"failed",error:i.error}),n(!0)):"disconnected"===i.event&&(!(o=i.error).statusCode||!o.code||o.statusCode>=500||Object.values(qo).includes(o.code)?n(!1):(this.notifyState({state:this.states.connecting.failState,error:i.error}),n(!0))):(this.errorReason=i.error,rr(this.realtime.auth.O(null,null),i=>{i?this.actOnErrorFromAuthorize(i):this.tryATransport(t,e,n)})):(this.setTransportPending(r,t),n(null,r))})}setTransportPending(t,e){var n=e.mode;this.pendingTransport=t,this.cancelWebSocketSlowTimer(),this.cancelWebSocketGiveUpTimer(),t.once("connected",(e,i,r)=>{this.activateTransport(e,t,i,r),"recover"===n&&this.options.recover&&(delete this.options.recover,this.unpersistConnection())});var i=this;t.on(["disconnected","closed","failed"],function(e){i.deactivateTransport(t,this.event,e)}),this.emit("transport.pending",t)}activateTransport(t,e,n,i){t&&ki.logAction(this.logger,ki.LOG_ERROR,"ConnectionManager.activateTransport()","error = "+t),this.persistTransportPreference(e);var r=this.state,o=this.states.connected.state;if(r.state==this.states.closing.state||r.state==this.states.closed.state||r.state==this.states.failed.state)return e.disconnect(),!1;if(delete this.pendingTransport,!e.isConnected)return!1;var a=this.activeProtocol;this.activeProtocol=new Bo(e),this.host=e.params.host;var s=i.connectionKey;if(s&&this.connectionKey!=s&&this.setConnection(n,i,!!t),this.onConnectionDetailsUpdate(i,e),mi.Config.nextTick(()=>{e.on("connected",(t,n,i)=>{this.onConnectionDetailsUpdate(i,e),this.emit("update",new zo(o,o,null,t))})}),r.state===this.states.connected.state?t&&(this.errorReason=this.realtime.connection.errorReason=t,this.emit("update",new zo(o,o,null,t))):(this.notifyState({state:"connected",error:t}),this.errorReason=this.realtime.connection.errorReason=t||null),this.emit("transport.active",e),a)if(a.messageQueue.count()>0&&ki.logAction(this.logger,ki.LOG_ERROR,"ConnectionManager.activateTransport()","Previous active protocol (for transport "+a.transport.shortName+", new one is "+e.shortName+") finishing with "+a.messageQueue.count()+" messages still pending"),a.transport===e){var l="Assumption violated: activating a transport that was also the transport for the previous active protocol; transport = "+e.shortName+"; stack = "+(new Error).stack;ki.logAction(this.logger,ki.LOG_ERROR,"ConnectionManager.activateTransport()",l)}else a.finish();return!0}deactivateTransport(t,e,n){var i=this.activeProtocol,r=i&&i.getTransport()===t,o=t===this.pendingTransport,a=this.noTransportsScheduledForActivation();if(n&&n.message,r&&(this.queuePendingMessages(i.getPendingMessages()),i.clearPendingMessages(),this.activeProtocol=this.host=null),this.emit("transport.inactive",t),r&&a||r&&"failed"===e||"closed"===e||null===i&&o){if("disconnected"===e&&n&&n.statusCode>500&&this.domains.length>1)return this.unpersistTransportPreference(),this.forceFallbackHost=!0,void this.notifyState({state:e,error:n,retryImmediately:!0});var s="failed"===e&&Vr.isTokenErr(n)?"disconnected":e;this.notifyState({state:s,error:n})}else;}noTransportsScheduledForActivation(){return!this.pendingTransport||!this.pendingTransport.isConnected}setConnection(t,e,n){var i=this.connectionId;(i&&i!==t||!i&&n)&&(this.msgSerial=0,this.queuedMessages.resetSendAttempted()),this.connectionId,this.realtime.connection.id=this.connectionId=t,this.realtime.connection.key=this.connectionKey=e.connectionKey}clearConnection(){this.realtime.connection.id=this.connectionId=void 0,this.realtime.connection.key=this.connectionKey=void 0,this.msgSerial=0,this.unpersistConnection()}createRecoveryKey(){return this.connectionKey?JSON.stringify({connectionKey:this.connectionKey,msgSerial:this.msgSerial,channelSerials:this.realtime.channels.channelSerials()}):null}checkConnectionStateFreshness(){this.lastActivity&&this.connectionId&&(Date.now()-this.lastActivity>this.connectionStateTtl+this.maxIdleInterval&&(this.clearConnection(),this.states.connecting.failState="suspended"))}persistConnection(){if(Go()){var t=this.createRecoveryKey();t&&this.setSessionRecoverData({recoveryKey:t,disconnectedAt:Date.now(),location:$o.location,clientId:this.realtime.auth.clientId})}}unpersistConnection(){this.clearSessionRecoverData()}getActiveTransportFormat(){var t;return null==(t=this.activeProtocol)?void 0:t.getTransport().format}getError(){if(this.errorReason){var t=Ci.fromValues(this.errorReason);return t.cause=this.errorReason,t}return this.getStateError()}getStateError(){var t,e;return null==(e=(t=Lo)[this.state.state])?void 0:e.call(t)}activeState(){return this.state.queueEvents||this.state.sendEvents}enactStateChange(t){var e=t.current+(t.reason?"; reason: "+t.reason:"");"failed"===t.current&&ki.logAction(this.logger,ki.LOG_ERROR,"Connection state",e);var n=this.state=this.states[t.current];t.reason&&(this.errorReason=t.reason,this.realtime.connection.errorReason=t.reason),(n.terminal||"suspended"===n.state)&&this.clearConnection(),this.emit("connectionstate",t)}startTransitionTimer(t){this.transitionTimer&&clearTimeout(this.transitionTimer),this.transitionTimer=setTimeout(()=>{this.transitionTimer&&(this.transitionTimer=null,this.notifyState({state:t.failState}))},t.retryDelay)}cancelTransitionTimer(){this.transitionTimer&&(clearTimeout(this.transitionTimer),this.transitionTimer=null)}startSuspendTimer(){this.suspendTimer||(this.suspendTimer=setTimeout(()=>{this.suspendTimer&&(this.suspendTimer=null,this.states.connecting.failState="suspended",this.notifyState({state:"suspended"}))},this.connectionStateTtl))}checkSuspendTimer(t){"disconnected"!==t&&"suspended"!==t&&"connecting"!==t&&this.cancelSuspendTimer()}cancelSuspendTimer(){this.states.connecting.failState="disconnected",this.suspendTimer&&(clearTimeout(this.suspendTimer),this.suspendTimer=null)}startRetryTimer(t){this.retryTimer=setTimeout(()=>{this.retryTimer=null,this.requestState({state:"connecting"})},t)}cancelRetryTimer(){this.retryTimer&&(clearTimeout(this.retryTimer),this.retryTimer=null)}startWebSocketSlowTimer(){this.webSocketSlowTimer=setTimeout(()=>{this.checkWsConnectivity().then(()=>{this.wsCheckResult=!0}).catch(()=>{this.wsCheckResult=!1}),this.realtime.http.checkConnectivity&&rr(this.realtime.http.checkConnectivity(),(t,e)=>{!t&&e||(this.cancelWebSocketGiveUpTimer(),this.notifyState({state:"disconnected",error:new Ti("Unable to connect (network unreachable)",80003,404)}))})},this.options.timeouts.webSocketSlowTimeout)}cancelWebSocketSlowTimer(){this.webSocketSlowTimer&&(clearTimeout(this.webSocketSlowTimer),this.webSocketSlowTimer=null)}startWebSocketGiveUpTimer(t){this.webSocketGiveUpTimer=setTimeout(()=>{var e,n;this.wsCheckResult||this.baseTransport&&(this.abandonedWebSocket=!0,null==(e=this.proposedTransport)||e.dispose(),null==(n=this.pendingTransport)||n.dispose(),this.connectBase(t,++this.connectCounter))},this.options.timeouts.webSocketConnectTimeout)}cancelWebSocketGiveUpTimer(){this.webSocketGiveUpTimer&&(clearTimeout(this.webSocketGiveUpTimer),this.webSocketGiveUpTimer=null)}notifyState(t){var e,n,i=t.state,r="disconnected"===i&&(this.state===this.states.connected||t.retryImmediately||this.state===this.states.connecting&&t.error&&Vr.isTokenErr(t.error)&&!(this.errorReason&&Vr.isTokenErr(this.errorReason)));if(i!=this.state.state&&(this.cancelTransitionTimer(),this.cancelRetryTimer(),this.cancelWebSocketSlowTimer(),this.cancelWebSocketGiveUpTimer(),this.checkSuspendTimer(t.state),"suspended"!==i&&"connected"!==i||(this.disconnectedRetryCount=0),!this.state.terminal)){var o=this.states[t.state],a=o.retryDelay;"disconnected"===o.state&&(this.disconnectedRetryCount++,a=cr(o.retryDelay,this.disconnectedRetryCount));var s=new zo(this.state.state,o.state,a,t.error||(null==(n=(e=Lo)[o.state])?void 0:n.call(e)));if(r){var l=()=>{this.state===this.states.disconnected&&(this.lastAutoReconnectAttempt=Date.now(),this.requestState({state:"connecting"}))},u=this.lastAutoReconnectAttempt&&Date.now()-this.lastAutoReconnectAttempt+1;u&&u<1e3?setTimeout(l,1e3-u):mi.Config.nextTick(l)}else"disconnected"!==i&&"suspended"!==i||this.startRetryTimer(a);("disconnected"===i&&!r||"suspended"===i||o.terminal)&&mi.Config.nextTick(()=>{this.disconnectAllTransports()}),"connected"!=i||this.activeProtocol||ki.logAction(this.logger,ki.LOG_ERROR,"ConnectionManager.notifyState()","Broken invariant: attempted to go into connected state, but there is no active protocol"),this.enactStateChange(s),this.state.sendEvents?this.sendQueuedMessages():this.state.queueEvents||(this.realtime.channels.propogateConnectionInterruption(i,s.reason),this.failQueuedMessages(s.reason))}}requestState(t){var e,n,i=t.state;if(i!=this.state.state&&(this.cancelWebSocketSlowTimer(),this.cancelWebSocketGiveUpTimer(),this.cancelTransitionTimer(),this.cancelRetryTimer(),this.checkSuspendTimer(i),!("connecting"==i&&"connected"==this.state.state||"closing"==i&&"closed"==this.state.state))){var r=this.states[i],o=new zo(this.state.state,r.state,null,t.error||(null==(n=(e=Lo)[r.state])?void 0:n.call(e)));this.enactStateChange(o),"connecting"==i&&mi.Config.nextTick(()=>{this.startConnect()}),"closing"==i&&this.closeImpl()}}startConnect(){if(this.state===this.states.connecting){var t=this.realtime.auth,e=++this.connectCounter,n=()=>{this.checkConnectionStateFreshness(),this.getTransportParams(t=>{if("recover"===t.mode&&t.options.recover){var n=Xo(t.options.recover);n&&this.realtime.channels.recoverChannels(n.channelSerials)}e===this.connectCounter&&this.connectImpl(t,e)})};if(this.startSuspendTimer(),this.startTransitionTimer(this.states.connecting),"basic"===t.method)n();else{var i=t=>{e===this.connectCounter&&(t?this.actOnErrorFromAuthorize(t):n())};this.errorReason&&Vr.isTokenErr(this.errorReason)?rr(t.O(null,null),i):rr(t.I(!1),i)}}}connectImpl(t,e){if(this.state.state===this.states.connecting.state){var n=this.getTransportPreference();n&&n===this.baseTransport&&this.webSocketTransportAvailable&&this.checkWsConnectivity().then(()=>{this.unpersistTransportPreference(),this.state===this.states.connecting&&(this.disconnectAllTransports(),this.connectWs(t,++this.connectCounter))}).catch(Qo),n&&n===this.baseTransport||this.baseTransport&&!this.webSocketTransportAvailable?this.connectBase(t,e):this.connectWs(t,e)}}connectWs(t,e){this.wsCheckResult=null,this.abandonedWebSocket=!1,this.startWebSocketSlowTimer(),this.startWebSocketGiveUpTimer(t),this.tryTransportWithFallbacks("web_socket",t,!0,e,()=>!1!==this.wsCheckResult&&!this.abandonedWebSocket)}connectBase(t,e){this.baseTransport?this.tryTransportWithFallbacks(this.baseTransport,t,!1,e,()=>!0):this.notifyState({state:"disconnected",error:new Ti("No transports left to try",8e4,404)})}tryTransportWithFallbacks(t,e,n,i,r){var o=t=>{this.notifyState({state:this.states.connecting.failState,error:t})},a=this.domains.slice(),s=(t,e)=>{i===this.connectCounter&&(r()?e||t||u():e&&e.dispose())},l=a.shift();if(l){e.host=l;var u=()=>{a.length?this.realtime.http.checkConnectivity?rr(this.realtime.http.checkConnectivity(),(n,l)=>{i===this.connectCounter&&r()&&(n?o(n):l?(e.host=$i(a),this.tryATransport(e,t,s)):o(new Ti("Unable to connect (network unreachable)",80003,404)))}):o(new Ci("Internal error: Http.checkConnectivity not set",null,500)):o(new Ti("Unable to connect (and no more fallback hosts to try)",80003,404))};if(this.forceFallbackHost&&a.length)return this.forceFallbackHost=!1,void u();this.tryATransport(e,t,s)}else o(new Ti("Unable to connect (no available host)",80003,404))}closeImpl(){this.cancelSuspendTimer(),this.startTransitionTimer(this.states.closing),this.pendingTransport&&this.pendingTransport.close(),this.activeProtocol&&this.activeProtocol.getTransport().close(),this.notifyState({state:"closed"})}onAuthUpdated(t,e){var n;switch(this.state.state){case"connected":var i=null==(n=this.activeProtocol)?void 0:n.getTransport();i&&i.onAuthUpdated&&i.onAuthUpdated(t);var r=Do({action:Xr.AUTH,auth:{accessToken:t.token}});this.send(r);var o=()=>{this.off(a),e(null,t)},a=t=>{"failed"===t.current&&(this.off(o),this.off(a),e(t.reason||this.getStateError()))};this.once("connectiondetails",o),this.on("connectionstate",a);break;case"connecting":this.disconnectAllTransports();default:var s=n=>{switch(n.current){case"connected":this.off(s),e(null,t);break;case"failed":case"closed":case"suspended":this.off(s),e(n.reason||this.getStateError())}};this.on("connectionstate",s),"connecting"===this.state.state?this.startConnect():this.requestState({state:"connecting"})}}disconnectAllTransports(){this.connectCounter++,this.pendingTransport&&this.pendingTransport.disconnect(),delete this.pendingTransport,this.proposedTransport&&this.proposedTransport.disconnect(),delete this.pendingTransport,this.activeProtocol&&this.activeProtocol.getTransport().disconnect()}send(t,e,n){n=n||Qo;var i=this.state;if(i.sendEvents)this.sendImpl(new Uo(t,n));else if(e&&i.queueEvents)this.logger.shouldLog(ki.LOG_MICRO),this.queue(t,n);else{var r="rejecting event, queueEvent was "+e+", state was "+i.state;n(this.errorReason||new Ti(r,9e4,400))}}sendImpl(t){var e=t.message;t.ackRequired&&!t.sendAttempted&&(e.msgSerial=this.msgSerial++);try{this.activeProtocol.send(t)}catch(t){ki.logAction(this.logger,ki.LOG_ERROR,"ConnectionManager.sendImpl()","Unexpected exception in transport.send(): "+t.stack)}}queue(t,e){this.queuedMessages.push(new Uo(t,e))}sendQueuedMessages(){for(var t;t=this.queuedMessages.shift();)this.sendImpl(t)}queuePendingMessages(t){t&&t.length&&this.queuedMessages.prepend(t)}failQueuedMessages(t){var e=this.queuedMessages.count();e>0&&(ki.logAction(this.logger,ki.LOG_ERROR,"ConnectionManager.failQueuedMessages()","failing "+e+" queued messages, err = "+Xi(t)),this.queuedMessages.completeAllMessages(t))}onChannelMessage(t,e){this.pendingChannelMessagesState.queue.push({message:t,transport:e}),this.pendingChannelMessagesState.isProcessing||this.processNextPendingChannelMessage()}processNextPendingChannelMessage(){if(this.pendingChannelMessagesState.queue.length>0){this.pendingChannelMessagesState.isProcessing=!0;var t=this.pendingChannelMessagesState.queue.shift();this.processChannelMessage(t.message).catch(t=>{ki.logAction(this.logger,ki.LOG_ERROR,"ConnectionManager.processNextPendingChannelMessage() received error ",t)}).finally(()=>{this.pendingChannelMessagesState.isProcessing=!1,this.processNextPendingChannelMessage()})}}processChannelMessage(t){var e=this;return s(function*(){yield e.realtime.channels.processChannelMessage(t)})()}ping(){var t=this;return s(function*(){var e;if("connected"!==t.state.state)throw new Ti("Unable to ping service; not connected",4e4,400);var n=null==(e=t.activeProtocol)?void 0:e.getTransport();if(!n)throw t.getStateError();var i=Date.now(),r=er();return yr(new Promise(t=>{var e=o=>{o===r&&(n.off("heartbeat",e),t(Date.now()-i))};n.on("heartbeat",e),n.ping(r)}),t.options.timeouts.realtimeRequestTimeout,"Timeout waiting for heartbeat response")})()}abort(t){this.activeProtocol.getTransport().fail(t)}getTransportPreference(){var t,e;return this.transportPreference||Ko()&&(null==(e=null==(t=mi.WebStorage)?void 0:t.get)?void 0:e.call(t,Yo))}persistTransportPreference(t){var e,n;this.transportPreference=t.shortName,Ko()&&(null==(n=null==(e=mi.WebStorage)?void 0:e.set)||n.call(e,Yo,t.shortName))}unpersistTransportPreference(){var t,e;this.transportPreference=null,Ko()&&(null==(e=null==(t=mi.WebStorage)?void 0:t.remove)||e.call(t,Yo))}actOnErrorFromAuthorize(t){if(40171===t.code)this.notifyState({state:"failed",error:t});else if(40102===t.code)this.notifyState({state:"failed",error:t});else if(t.statusCode===qr.Forbidden){var e="Client configured authentication provider returned 403; failing the connection";ki.logAction(this.logger,ki.LOG_ERROR,"ConnectionManager.actOnErrorFromAuthorize()",e),this.notifyState({state:"failed",error:new Ti(e,80019,403,t)})}else{this.notifyState({state:this.state.failState,error:new Ti("Client configured authentication provider request failed",80019,401,t)})}}onConnectionDetailsUpdate(t,e){if(t){this.connectionDetails=t,t.maxMessageSize&&(this.options.maxMessageSize=t.maxMessageSize);var n=t.clientId;if(n){var i=this.realtime.auth.R(n);if(i)return ki.logAction(this.logger,ki.LOG_ERROR,"ConnectionManager.onConnectionDetailsUpdate()",i.message),void e.fail(i)}var r=t.connectionStateTtl;r&&(this.connectionStateTtl=r),this.maxIdleInterval=t.maxIdleInterval,this.emit("connectiondetails",t)}}checkWsConnectivity(){var t=this.options.wsConnectivityCheckUrl||jr.wsConnectivityCheckUrl,e=new mi.Config.WebSocket(t);return new Promise((t,n)=>{var i=!1;e.onopen=()=>{i||(i=!0,t(),e.close())},e.onclose=e.onerror=()=>{i||(i=!0,n())}})}sessionRecoveryName(){return this.options.recoveryKeyStorageName||"ably-connection-recovery"}getSessionRecoverData(){var t,e;return Go()&&(null==(e=null==(t=mi.WebStorage)?void 0:t.getSession)?void 0:e.call(t,this.sessionRecoveryName()))}setSessionRecoverData(t){var e,n;return Go()&&(null==(n=null==(e=mi.WebStorage)?void 0:e.setSession)?void 0:n.call(e,this.sessionRecoveryName(),t))}clearSessionRecoverData(){var t,e;return Go()&&(null==(e=null==(t=mi.WebStorage)?void 0:t.removeSession)?void 0:e.call(t,this.sessionRecoveryName()))}},ea=class extends Yr{constructor(t,e){super(t.logger),this.whenState=t=>Yr.prototype.whenState.call(this,t,this.state),this.ably=t,this.connectionManager=new ta(t,e),this.state=this.connectionManager.state.state,this.key=void 0,this.id=void 0,this.errorReason=null,this.connectionManager.on("connectionstate",t=>{var e=this.state=t.current;mi.Config.nextTick(()=>{this.emit(e,t)})}),this.connectionManager.on("update",t=>{mi.Config.nextTick(()=>{this.emit("update",t)})})}connect(){this.connectionManager.requestState({state:"connecting"})}ping(){var t=this;return s(function*(){return t.connectionManager.ping()})()}close(){this.connectionManager.requestState({state:"closing"})}get recoveryKey(){return this.logger.deprecationWarning("The `Connection.recoveryKey` attribute has been replaced by the `Connection.createRecoveryKey()` method. Replace your usage of `recoveryKey` with the return value of `createRecoveryKey()`. `recoveryKey` will be removed in a future version."),this.createRecoveryKey()}createRecoveryKey(){return this.connectionManager.createRecoveryKey()}},na=class t extends yo{constructor(e){var n,i,r,o;if(super(jr.objectifyOptions(e,!1,"BaseRealtime",ki.defaultLogger)),"string"==typeof EdgeRuntime)throw new Ti('Ably.Realtime instance cannot be used in Vercel Edge runtime. If you are running Vercel Edge functions, please replace your "new Ably.Realtime()" with "new Ably.Rest()" and use Ably Rest API instead of the Realtime API. If you are server-rendering your application in the Vercel Edge runtime, please use the condition "if (typeof EdgeRuntime === \'string\')" to prevent instantiating Ably.Realtime instance during SSR in the Vercel Edge runtime.',4e4,400);this.dt=t.transportImplementationsFromPlugins(this.options.plugins),this.X=null!=(i=null==(n=this.options.plugins)?void 0:n.RealtimePresence)?i:null,this.ct=null!=(o=null==(r=this.options.plugins)?void 0:r.LiveObjects)?o:null,this.connection=new ea(this,this.options),this.vt=new ra(this),!1!==this.options.autoConnect&&this.connect()}static transportImplementationsFromPlugins(t){var e={};return(null==t?void 0:t.WebSocketTransport)&&(e[Fo.WebSocket]=t.WebSocketTransport),(null==t?void 0:t.XHRPolling)&&(e[Fo.XhrPolling]=t.XHRPolling),e}get channels(){return this.vt}get clientId(){return this.auth.clientId}connect(){this.connection.connect()}close(){this.connection.close()}};na.EventEmitter=Yr;var ia=na,ra=class extends Yr{constructor(t){super(t.logger),this.realtime=t,this.all=Object.create(null),t.connection.connectionManager.on("transport.active",()=>{this.onTransportActive()})}channelSerials(){var t={};for(var e of Hi(this.all,!0)){var n=this.all[e];n.properties.channelSerial&&(t[e]=n.properties.channelSerial)}return t}recoverChannels(t){for(var e of Hi(t,!0)){this.get(e).properties.channelSerial=t[e]}}processChannelMessage(t){var e=this;return s(function*(){var n=t.channel;if(void 0!==n){var i=e.all[n];i?yield i.processMessage(t):ki.logAction(e.logger,ki.LOG_ERROR,"Channels.processChannelMessage()","received event for non-existent channel: "+n)}else ki.logAction(e.logger,ki.LOG_ERROR,"Channels.processChannelMessage()","received event unspecified channel, action = "+t.action)})()}onTransportActive(){for(var t in this.all){var e=this.all[t];"attaching"===e.state||"detaching"===e.state?e.checkPendingState():"suspended"===e.state?e.lt(!1,null):"attached"===e.state&&e.requestState("attaching")}}propogateConnectionInterruption(t,e){var n=["attaching","attached","detaching","suspended"],i={closing:"detached",closed:"detached",failed:"failed",suspended:"suspended"}[t];for(var r in this.all){var o=this.all[r];n.includes(o.state)&&o.notifyState(i,e)}}get(t,e){t=String(t);var n=this.all[t];if(n){if(e){if(n.st(e,n.channelOptions))throw new Ti("Channels.get() cannot be used to set channel options that would cause the channel to reattach. Please, use RealtimeChannel.setOptions() instead.",4e4,400);n.setOptions(e)}}else n=this.all[t]=new Oo(this.realtime,t,e);return n}getDerived(t,e,n){if(e.filter){var i=pr(e.filter),r=fr(t);t="[filter="+i+r.qualifierParam+"]"+r.channelName}return this.get(t,n)}release(t){t=String(t);var e=this.all[t];if(e){var n=e.getReleaseErr();if(n)throw n;delete this.all[t]}}},oa=ia,aa=Uint8Array,sa=Uint32Array,la=Math.pow,ua=new sa(8),ha=[],ca=new sa(64);function da(t){return(t-(0|t))*la(2,32)|0}for(var va,fa,pa=2,ga=0;ga<64;){for(va=!0,fa=2;fa<=pa/2;fa++)pa%fa===0&&(va=!1);va&&(ga<8&&(ua[ga]=da(la(pa,.5))),ha[ga]=da(la(pa,1/3)),ga++),pa++}var ma=!!new aa(new sa([1]).buffer)[0];function ba(t){return ma?t>>>24|(t>>>16&255)<<8|(65280&t)<<8|t<<24:t}function ya(t,e){return t>>>e|t<<32-e}function wa(t){var e,n=ua.slice(),i=t.length,r=8*i,o=512-(r+64)%512-1+r+65,a=new aa(o/8),s=new sa(a.buffer);a.set(t,0),a[i]=128,s[s.length-1]=ba(r);for(var l=0;l<o/32;l+=16){var u=n.slice();for(e=0;e<64;e++){var h;if(e<16)h=ba(s[l+e]);else{var c=ca[e-15],d=ca[e-2];h=ca[e-7]+ca[e-16]+(ya(c,7)^ya(c,18)^c>>>3)+(ya(d,17)^ya(d,19)^d>>>10)}ca[e]=h|=0;for(var v=(ya(u[4],6)^ya(u[4],11)^ya(u[4],25))+(u[4]&u[5]^~u[4]&u[6])+u[7]+h+ha[e],f=(ya(u[0],2)^ya(u[0],13)^ya(u[0],22))+(u[0]&u[1]^u[2]&(u[0]^u[1])),p=7;p>0;p--)u[p]=u[p-1];u[0]=v+f|0,u[4]=u[4]+v|0}for(e=0;e<8;e++)n[e]=n[e]+u[e]|0}return new aa(new sa(n.map(function(t){return ba(t)})).buffer)}var xa,ka=new class{constructor(){this.base64CharSet="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",this.hexCharSet="0123456789abcdef"}uint8ViewToBase64(t){for(var e,n,i,r,o="",a=this.base64CharSet,s=t.byteLength,l=s%3,u=s-l,h=0;h<u;h+=3)e=(258048&(r=t[h]<<16|t[h+1]<<8|t[h+2]))>>12,n=(4032&r)>>6,i=63&r,o+=a[(16515072&r)>>18]+a[e]+a[n]+a[i];return 1==l?(e=(3&(r=t[u]))<<4,o+=a[(252&r)>>2]+a[e]+"=="):2==l&&(e=(1008&(r=t[u]<<8|t[u+1]))>>4,n=(15&r)<<2,o+=a[(64512&r)>>10]+a[e]+a[n]+"="),o}base64ToArrayBuffer(t){for(var e=null==atob?void 0:atob(t),n=e.length,i=new Uint8Array(n),r=0;r<n;r++){var o=e.charCodeAt(r);i[r]=o}return this.toArrayBuffer(i)}isBuffer(t){return t instanceof ArrayBuffer||ArrayBuffer.isView(t)}toBuffer(t){if(!ArrayBuffer)throw new Error("Can't convert to Buffer: browser does not support the necessary types");if(t instanceof ArrayBuffer)return new Uint8Array(t);if(ArrayBuffer.isView(t))return new Uint8Array(this.toArrayBuffer(t));throw new Error("BufferUtils.toBuffer expected an ArrayBuffer or a view onto one")}toArrayBuffer(t){if(!ArrayBuffer)throw new Error("Can't convert to ArrayBuffer: browser does not support the necessary types");if(t instanceof ArrayBuffer)return t;if(ArrayBuffer.isView(t))return t.buffer.slice(t.byteOffset,t.byteOffset+t.byteLength);throw new Error("BufferUtils.toArrayBuffer expected an ArrayBuffer or a view onto one")}base64Encode(t){return this.uint8ViewToBase64(this.toBuffer(t))}base64UrlEncode(t){return this.base64Encode(t).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")}base64Decode(t){if(ArrayBuffer&&mi.Config.atob)return this.base64ToArrayBuffer(t);throw new Error("Expected ArrayBuffer to exist and Platform.Config.atob to be configured")}hexEncode(t){return this.toBuffer(t).reduce((t,e)=>t+e.toString(16).padStart(2,"0"),"")}hexDecode(t){if(t.length%2!=0)throw new Error("Can't create a byte array from a hex string of odd length");for(var e=new Uint8Array(t.length/2),n=0;n<e.length;n++)e[n]=parseInt(t.slice(2*n,2*(n+1)),16);return this.toArrayBuffer(e)}utf8Encode(t){if(mi.Config.TextEncoder){var e=(new mi.Config.TextEncoder).encode(t);return this.toArrayBuffer(e)}throw new Error("Expected TextEncoder to be configured")}utf8Decode(t){if(!this.isBuffer(t))throw new Error("Expected input of utf8decode to be an arraybuffer or typed array");if(TextDecoder)return(new TextDecoder).decode(t);throw new Error("Expected TextDecoder to be configured")}areBuffersEqual(t,e){if(!t||!e)return!1;var n=this.toArrayBuffer(t),i=this.toArrayBuffer(e);if(n.byteLength!=i.byteLength)return!1;for(var r=new Uint8Array(n),o=new Uint8Array(i),a=0;a<r.length;a++)if(r[a]!=o[a])return!1;return!0}byteLength(t){return t instanceof ArrayBuffer||ArrayBuffer.isView(t)?t.byteLength:-1}arrayBufferViewToBuffer(t){return this.toArrayBuffer(t)}concat(t){var e=t.reduce((t,e)=>t+e.byteLength,0),n=new Uint8Array(e),i=0;for(var r of t){var o=this.toBuffer(r);n.set(o,i),i+=o.byteLength}return n.buffer}sha256(t){var e=wa(this.toBuffer(t));return this.toArrayBuffer(e)}hmacSha256(t,e){var n=function(t,e){if(t.length>64&&(t=wa(t)),t.length<64){var n=new Uint8Array(64);n.set(t,0),t=n}for(var i=new Uint8Array(64),r=new Uint8Array(64),o=0;o<64;o++)i[o]=54^t[o],r[o]=92^t[o];var a=new Uint8Array(e.length+64);a.set(i,0),a.set(e,64);var s=new Uint8Array(96);return s.set(r,0),s.set(wa(a),64),wa(s)}(this.toBuffer(e),this.toBuffer(t));return this.toArrayBuffer(n)}},Sa=(t=>(t[t.REQ_SEND=0]="REQ_SEND",t[t.REQ_RECV=1]="REQ_RECV",t[t.REQ_RECV_POLL=2]="REQ_RECV_POLL",t[t.REQ_RECV_STREAM=3]="REQ_RECV_STREAM",t))(Sa||{}),_a=Sa;function Ta(){return new Ti("No HTTP request plugin provided. Provide at least one of the FetchRequest or XHRRequest plugins.",400,4e4)}var Ca=(xa=class{constructor(t){var e;this.checksInProgress=null,this.checkConnectivity=void 0,this.supportsAuthHeaders=!1,this.supportsLinkHeaders=!1,this.client=null!=t?t:null;var n=(null==t?void 0:t.options.connectivityCheckUrl)||jr.connectivityCheckUrl,i=null!=(e=null==t?void 0:t.options.connectivityCheckParams)?e:null,r=!(null==t?void 0:t.options.connectivityCheckUrl),o=fi(fi({},Ca.bundledRequestImplementations),null==t?void 0:t.q),a=o.XHRRequest,l=o.FetchRequest,u=!(!a&&!l);if(!u)throw Ta();mi.Config.xhrSupported&&a?(this.supportsAuthHeaders=!0,this.Request=function(){var e=s(function*(e,n,i,r,o){return new Promise(s=>{var l,u=a.createRequest(n,i,r,o,_a.REQ_SEND,null!=(l=t&&t.options.timeouts)?l:null,this.logger,e);u.once("complete",(t,e,n,i,r)=>s({error:t,body:e,headers:n,unpacked:i,statusCode:r})),u.exec()})});return function(t,n,i,r,o){return e.apply(this,arguments)}}(),(null==t?void 0:t.options.disableConnectivityCheck)?this.checkConnectivity=s(function*(){return!0}):this.checkConnectivity=s(function*(){var t,e,o=yield this.doUri(Br.Get,n,null,null,i);return r?!o.error&&"yes"==(null==(t=o.body)?void 0:t.replace(/\n/,"")):!o.error&&((e=o.statusCode)>=200&&e<400)})):mi.Config.fetchSupported&&l?(this.supportsAuthHeaders=!0,this.Request=function(){var e=s(function*(e,n,i,r,o){return l(e,null!=t?t:null,n,i,r,o)});return function(t,n,i,r,o){return e.apply(this,arguments)}}(),(null==t?void 0:t.options.disableConnectivityCheck)?this.checkConnectivity=s(function*(){return!0}):this.checkConnectivity=s(function*(){var t,e=yield this.doUri(Br.Get,n,null,null,null);return!e.error&&"yes"==(null==(t=e.body)?void 0:t.replace(/\n/,""))})):this.Request=s(function*(){return{error:u?new Ci("no supported HTTP transports available",null,400):Ta()}})}get logger(){var t,e;return null!=(e=null==(t=this.client)?void 0:t.logger)?e:ki.defaultLogger}doUri(t,e,n,i,r){var o=this;return s(function*(){return o.Request?o.Request(t,e,n,r,i):{error:new Ci("Request invoked before assigned to",null,500)}})()}shouldFallback(t){var e=t.statusCode;return 408===e&&!t.code||400===e&&!t.code||e>=500&&e<=504}},xa.methods=[Br.Get,Br.Delete,Br.Post,Br.Put,Br.Patch],xa.methodsWithoutBody=[Br.Get,Br.Delete],xa.methodsWithBody=[Br.Post,Br.Put,Br.Patch],xa),Aa=Ca,Ea="ablyjs-storage-test",Oa="undefined"!=typeof global?global:"undefined"!=typeof window?window:self,Ia=new class{constructor(){try{Oa.sessionStorage.setItem(Ea,Ea),Oa.sessionStorage.removeItem(Ea),this.sessionSupported=!0}catch(t){this.sessionSupported=!1}try{Oa.localStorage.setItem(Ea,Ea),Oa.localStorage.removeItem(Ea),this.localSupported=!0}catch(t){this.localSupported=!1}}get(t){return this.ft(t,!1)}getSession(t){return this.ft(t,!0)}remove(t){return this.gt(t,!1)}removeSession(t){return this.gt(t,!0)}set(t,e,n){return this.bt(t,e,n,!1)}setSession(t,e,n){return this.bt(t,e,n,!0)}bt(t,e,n,i){var r={value:e};return n&&(r.expires=Date.now()+n),this.storageInterface(i).setItem(t,JSON.stringify(r))}ft(t,e){if(e&&!this.sessionSupported)throw new Error("Session Storage not supported");if(!e&&!this.localSupported)throw new Error("Local Storage not supported");var n=this.storageInterface(e).getItem(t);if(!n)return null;var i=JSON.parse(n);return i.expires&&i.expires<Date.now()?(this.storageInterface(e).removeItem(t),null):i.value}gt(t,e){return this.storageInterface(e).removeItem(t)}storageInterface(t){return t?Oa.sessionStorage:Oa.localStorage}},Ma=dr(),Pa="string"==typeof EdgeRuntime;"undefined"!=typeof Window||"undefined"!=typeof WorkerGlobalScope||Pa||console.log("Warning: this distribution of Ably is intended for browsers. On nodejs, please use the 'ably' package on npm");var Da,Ra,ja={agent:"browser",logTimestamps:!0,userAgent:Ma.navigator&&Ma.navigator.userAgent.toString(),currentUrl:Ma.location&&Ma.location.href,binaryType:"arraybuffer",WebSocket:Ma.WebSocket,fetchSupported:!!Ma.fetch,xhrSupported:Ma.XMLHttpRequest&&"withCredentials"in new XMLHttpRequest,allowComet:(Ra=Ma.location,!Ma.WebSocket||!Ra||!Ra.origin||Ra.origin.indexOf("http")>-1),useProtocolHeartbeats:!0,supportsBinary:!!Ma.TextDecoder,preferBinary:!1,ArrayBuffer:Ma.ArrayBuffer,atob:Ma.atob,nextTick:"function"==typeof Ma.queueMicrotask?t=>Ma.queueMicrotask(t):t=>Promise.resolve().then(t),addEventListener:Ma.addEventListener,inspect:JSON.stringify,stringByteSize:function(t){return Ma.TextDecoder&&(new Ma.TextEncoder).encode(t).length||t.length},TextEncoder:Ma.TextEncoder,TextDecoder:Ma.TextDecoder,getRandomArrayBuffer:(Da=s(function*(t){var e=new Uint8Array(t);return Ma.crypto.getRandomValues(e),e.buffer}),function(t){return Da.apply(this,arguments)}),isWebworker:"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope,push:{platform:"browser",formFactor:"desktop",storage:Ia}},Na=ja;Fo.XhrPolling;var Ua=Fo.WebSocket;var Ba=class extends Vo{constructor(t,e,n){super(t,e,n),this.shortName=Ua,n.heartbeats=mi.Config.useProtocolHeartbeats,this.wsHost=n.host}static isAvailable(){return!!mi.Config.WebSocket}createWebSocket(t,e){return this.uri=t+Ki(e),new mi.Config.WebSocket(this.uri)}toString(){return"WebSocketTransport; uri="+this.uri}connect(){Vo.prototype.connect.call(this);var t=this,e=this.params,n=e.options,i=(n.tls?"wss://":"ws://")+this.wsHost+":"+jr.getPort(n)+"/";rr(this.auth.getAuthParams(),function(n,r){if(!t.isDisposed){for(var o in r)" "+o+": "+r[o]+";";if(n)t.disconnect(n);else{var a=e.getConnectParams(r);try{var s=t.wsConnection=t.createWebSocket(i,a);s.binaryType=mi.Config.binaryType,s.onopen=function(){t.onWsOpen()},s.onclose=function(e){t.onWsClose(e)},s.onmessage=function(e){t.onWsData(e.data)},s.onerror=function(e){t.onWsError(e)},s.on&&s.on("ping",function(){t.onActivity()})}catch(e){ki.logAction(t.logger,ki.LOG_ERROR,"WebSocketTransport.connect()","Unexpected exception creating websocket: err = "+(e.stack||e.message)),t.disconnect(e)}}}})}send(t){var e=this.wsConnection;if(e)try{e.send(Io(t,this.connectionManager.realtime.F,this.params.format))}catch(t){var n="Exception from ws connection when trying to send: "+Xi(t);ki.logAction(this.logger,ki.LOG_ERROR,"WebSocketTransport.send()",n),this.finish("disconnected",new Ti(n,5e4,500))}else ki.logAction(this.logger,ki.LOG_ERROR,"WebSocketTransport.send()","No socket connection")}onWsData(t){try{this.onProtocolMessage(Po(t,this.connectionManager.realtime.F,this.connectionManager.realtime.X,this.connectionManager.realtime.J,this.connectionManager.realtime.ct,this.format))}catch(t){ki.logAction(this.logger,ki.LOG_ERROR,"WebSocketTransport.onWsData()","Unexpected exception handing channel message: "+t.stack)}}onWsOpen(){this.emit("preconnect")}onWsClose(t){var e,n;if("object"==typeof t?(n=t.code,e=t.wasClean||1e3===n):e=1e3==(n=t),delete this.wsConnection,e){var i=new Ti("Websocket closed",80003,400);this.finish("disconnected",i)}else{var r=new Ti("Unclean disconnection of WebSocket ; code = "+n,80003,400);this.finish("disconnected",r)}this.emit("disposed")}onWsError(t){mi.Config.nextTick(()=>{this.disconnect(Error(t.message))})}dispose(){this.isDisposed=!0;var t=this.wsConnection;t&&(t.onmessage=function(){},delete this.wsConnection,mi.Config.nextTick(()=>{if(!t)throw new Error("WebSocketTransport.dispose(): wsConnection is not defined");t.close()}))}},za={order:["xhr_polling"],bundledImplementations:{}},qa={connectivityCheckUrl:"https://internet-up.ably-realtime.com/is-the-internet-up.txt",wsConnectivityCheckUrl:"wss://ws-up.ably-realtime.com",defaultTransports:[Fo.XhrPolling,Fo.WebSocket]};function Fa(t,e,n,i,r,o){return Ha.apply(this,arguments)}function Ha(){return(Ha=s(function*(t,e,n,i,r,o){var a,l=new Headers(i||{}),u=t?t.toUpperCase():Pi(o)?"GET":"POST",h=new AbortController,c=new Promise(t=>{a=setTimeout(()=>{h.abort(),t({error:new Ci("Request timed out",null,408)})},e?e.options.timeouts.httpRequestTimeout:jr.TIMEOUTS.httpRequestTimeout)}),d={method:u,headers:l,body:o,signal:h.signal};mi.Config.isWebworker||(d.credentials=l.has("authorization")?"include":"same-origin");var v=s(function*(){try{var t=new URLSearchParams(r||{});t.set("rnd",er());var e=n+"?"+t,i=yield dr().fetch(e,d);if(clearTimeout(a),204==i.status)return{error:null,statusCode:i.status};var o,s=i.headers.get("Content-Type");o=s&&s.indexOf("application/x-msgpack")>-1?yield i.arrayBuffer():s&&s.indexOf("application/json")>-1?yield i.json():yield i.text();var l=!!s&&-1===s.indexOf("application/x-msgpack"),u=function(t){var e={};return t.forEach((t,n)=>{e[n]=t}),e}(i.headers);if(i.ok)return{error:null,body:o,headers:u,unpacked:l,statusCode:i.status};var h=function(t,e){if(function(t,e){return!!e.get("x-ably-errorcode")}(0,e))return t.error&&Ti.fromValues(t.error)}(o,i.headers)||new Ci("Error response received from server: "+i.status+" body was: "+mi.Config.inspect(o),null,i.status);return{error:h,body:o,headers:u,unpacked:l,statusCode:i.status}}catch(h){return clearTimeout(a),{error:h}}})();return Promise.race([c,v])})).apply(this,arguments)}var La;function Wa(t,e){var n,i,r=null!==(n=t.metadata)&&void 0!==n?n:{},o=null!==(i=e.metadata)&&void 0!==i?i:{};return!o.widgets&&r.k?l({},e,{metadata:l({},o,{k:r.k})}):e}function Ja(t,e,n,i){var r,o,a,s=(o=t.messages.value,a=e.id,o.some(t=>t.id===a));if(t.setMessages(function(t,e){var n=t.findIndex(t=>t.id===e.id);if(-1!==n){var i=t[n],r=Wa(i,e);if(function(t,e){return t.id===e.id&&t.channel_id===e.channel_id&&t.sender_type===e.sender_type&&t.sender_id===e.sender_id&&t.sender_name===e.sender_name&&t.sender_avatar_url===e.sender_avatar_url&&t.content===e.content&&t.content_type===e.content_type&&t.created_at===e.created_at&&t.metadata===e.metadata}(i,r))return t;var o=[...t];return o[n]=r,o}if("ai"===e.sender_type){var a=t.findIndex(t=>t.id.startsWith("temp-ai-"));if(-1!==a){var s=Wa(t[a],e),l=[...t];return l[a]=s,l}}return Dn(t,e)}(t.messages.value,e)),"user"!==e.sender_type||e.sender_id!==n){if(!s){if("ai"===e.sender_type||"agent"===e.sender_type){var u=t.isOpen.value,h=(null===(r=t.channel.value)||void 0===r?void 0:r.id)===e.channel_id;if(u&&h)i.onAgentMessageWhileOpen();else{var c=t.channels.value.findIndex(t=>t.id===e.channel_id);if(-1!==c){var d=[...t.channels.value];d[c]=l({},d[c],{unread_count:(d[c].unread_count||0)+1}),t.channels.value=d}}i.onTrack(e)}t.isTyping.value=!1,t.typingSender.value=null,t.typingSenderType.value=null,i.onMessageDispatched(e)}}else i.onMessageDispatched(e)}mi.BufferUtils=ka,mi.Http=Aa,mi.Config=Na,mi.Transports=za,mi.WebStorage=Ia,Aa.bundledRequestImplementations={},ki.initLogHandlers(),mi.Defaults=(La=qa,Object.assign(Sr,La)),mi.Config.agent&&(mi.Defaults.agent+=" "+mi.Config.agent);var Va="chat.ably";function $a(t,e,n){return Ka.apply(this,arguments)}function Ka(){return(Ka=s(function*(t,e,n){return T(t,_,{method:"POST",body:JSON.stringify(l({distinct_id:e},n&&{channel_id:n}))})})).apply(this,arguments)}function Ga(){return(Ga=s(function*(t,e){var n=yield $a(t,e);return(null==n?void 0:n.tokenRequest)?n.clientId&&null!=n.project_id?{tokenRequest:n.tokenRequest,clientId:n.clientId,projectId:n.project_id}:(w().warn(Va,"token:request:incomplete — missing clientId or project_id"),null):(w().warn(Va,"token:request:failed (initial)"),null)})).apply(this,arguments)}var Qa="chat.ably";function Ya(t,e){var n=(()=>{if(!e||"object"!=typeof e)return String(e);var t=e,n="string"==typeof t.message?t.message:String(e),i="number"==typeof t.code?t.code:null,r="number"==typeof t.statusCode?t.statusCode:null;return i||r?n+" (code="+(null!=i?i:"-")+", status="+(null!=r?r:"-")+")":n})(),i=n.toLowerCase();return i.includes("timeout for trying fallback hosts")||i.includes("connection failed")||i.includes("network")||i.includes("failed to fetch")?t+" — "+n+" (browser cannot reach Ably hosts (*.ably.io / *.ably-realtime.com) — check ad-blocker, firewall, VPN, or offline state)":t+" — "+n}var Xa=t=>new oa(t);class Za{constructor(t,e,n,i){void 0===i&&(i=Xa),this.instance=t,this.store=e,this.hooks=n,this.yt=null,this.wt=null,this.xt=null,this.kt=null,this.St=null,this._t=i}get clientId(){var t,e;return null!==(e=null===(t=this.yt)||void 0===t?void 0:t.auth.clientId)&&void 0!==e?e:null}get isLive(){return null!=this.yt}get currentChannelId(){return this.store.realtimeChannelId.value}ensureConnected(){var t=this;return s(function*(){if(!t.yt){t.store.connectionState.value="connecting",w().debug(Qa,"connect:start");var e=t.hooks.getDistinctId(),n=yield function(t,e){return Ga.apply(this,arguments)}(t.instance,e);if(n){t.store.ablyProjectId.value=n.projectId;var i,r=n.clientId,o=t._t({plugins:{WebSocketTransport:Ba,FetchRequest:Fa},authCallback:(i={instance:t.instance,getDistinctId:()=>t.hooks.getDistinctId(),getChannelScope:()=>{var e,n,i,r;return null!==(r=null!==(n=null!==(e=t.store.pendingRealtimeChannelId.value)&&void 0!==e?e:t.store.realtimeChannelId.value)&&void 0!==n?n:null===(i=t.store.channel.value)||void 0===i?void 0:i.id)&&void 0!==r?r:null},getLiveClientId:()=>{var e,n;return null!==(n=null===(e=t.yt)||void 0===e?void 0:e.auth.clientId)&&void 0!==n?n:null},onIdentityChange:()=>t.hooks.onIdentityChange()},function(){var t=s(function*(t,e){try{var n=i.getChannelScope(),r=yield $a(i.instance,i.getDistinctId(),null!=n?n:void 0);if(!(null==r?void 0:r.tokenRequest))return void e("Failed to refresh token",null);var o=r.tokenRequest.clientId,a=i.getLiveClientId();if(a&&o&&o!==a)return w().warn(Va,"token:request:clientid-mismatch — recreating connection"),e("clientId changed; recreating connection",null),void i.onIdentityChange();e(null,r.tokenRequest)}catch(t){e(String(t),null)}});return function(e,n){return t.apply(this,arguments)}}()),authMethod:"POST"});t.yt=o,o.connection.on("connected",()=>{t.store.connectionState.value="connected",t.Tt(),w().debug(Qa,"connect:connected")}),o.connection.on("disconnected",()=>{t.store.connectionState.value="disconnected",w().debug(Qa,"connect:disconnected")}),o.connection.on("suspended",()=>{t.store.connectionState.value="suspended",w().debug(Qa,"connect:suspended")}),o.connection.on("failed",()=>{t.store.connectionState.value="failed",w().debug(Qa,"connect:failed")});try{yield o.auth.authorize(n.tokenRequest)}catch(e){return w().error(Qa,Ya("connect:authorize-failed",e)),void(t.store.connectionState.value="failed")}var a=o.connection.state;"connected"===a?(t.store.connectionState.value="connected",t.Tt(),w().debug(Qa,"connect:connected (sync)")):"disconnected"!==a&&"suspended"!==a&&"failed"!==a||(t.store.connectionState.value=a,w().debug(Qa,"connect:"+a+" (sync)"));var u="chat:"+n.projectId+":notifications";t.wt=o.channels.get(u),t.wt.subscribe("notification",e=>{!function(t,e,n){var i,r,o,{type:a,channel_id:s,data:u}=e;if("new_channel"!==a)if("channel_updated"===a&&u){var h=t.channels.value.findIndex(t=>t.id===s);if(-1!==h){var c={};void 0!==u.last_message_at&&(c.last_message_at=u.last_message_at),void 0!==u.last_message_preview&&(c.last_message_preview=u.last_message_preview),void 0!==u.last_message_sender&&(c.last_message_sender=u.last_message_sender),void 0!==u.user_unread_count&&(t.isOpen.value&&(null===(i=t.channel.value)||void 0===i?void 0:i.id)===s||(c.unread_count=u.user_unread_count)),void 0!==u.status&&(c.status=u.status),void 0!==u.ai_mode&&(c.ai_mode=u.ai_mode),t.patchChannelSummary(s,c)}(null===(r=t.channel.value)||void 0===r?void 0:r.id)===s&&"closed"===u.status&&(t.channel.value=l({},t.channel.value,{status:"closed"}))}else"channel_closed"===a&&(t.patchChannelSummary(s,{status:"closed"}),(null===(o=t.channel.value)||void 0===o?void 0:o.id)===s&&(t.channel.value=l({},t.channel.value,{status:"closed"})));else n.onNewChannel()}(t.store,e.data,{onNewChannel:t.hooks.onNewChannelNotification})}),t.store.lastConnectedDistinctId.value=r.split(":").slice(1).join(":")||e}else t.store.connectionState.value="failed"}})()}refreshToken(t){var e=this;return s(function*(){var n=e.yt;if(!n)return!1;if("failed"===n.connection.state)return w().warn(Qa,"token:skip — connection failed"),e.hooks.onIdentityChange(),!1;var i=yield $a(e.instance,e.hooks.getDistinctId(),t);if(!(null==i?void 0:i.tokenRequest))return w().warn(Qa,"token:request:failed",null!=t?t:"(list)"),!1;var r=i.tokenRequest.clientId,o=n.auth.clientId;if(o&&r&&r!==o)return w().warn(Qa,"token:request:clientid-mismatch — recreating connection"),e.hooks.onIdentityChange(),!1;try{return yield n.auth.authorize(i.tokenRequest),!0}catch(t){return w().warn(Qa,Ya("token:authorize-failed",t)),!1}})()}attachConversation(t){var e=this;return s(function*(){var n;if(yield e.ensureConnected(),e.yt&&null!=e.store.ablyProjectId.value){if(e.xt||e.kt||e.St){var i=null!==(n=e.St)&&void 0!==n?n:e.Ct();try{yield i}catch(t){}}if(e.store.pendingRealtimeChannelId.value=t,!(yield e.refreshToken(t)))return w().warn(Qa,"channel:attach:no-capability for",t),void(e.store.pendingRealtimeChannelId.value===t&&(e.store.pendingRealtimeChannelId.value=null));var r="chat:"+e.store.ablyProjectId.value+":"+t,o=r+":typing",a=e.yt.channels.get(r),s=e.yt.channels.get(o);e.xt=a,e.kt=s;var l=()=>e.xt!==a||e.kt!==s;w().debug(Qa,"channel:attach:start",t);try{if(yield a.attach(),l())return void w().debug(Qa,"channel:attach:superseded",t);if(a.subscribe("message",t=>{e.xt===a&&Ja(e.store,t.data,e.hooks.getDistinctId()||null,{onAgentMessageWhileOpen:e.hooks.onAgentMessageWhileOpen,onTrack:e.hooks.onMessageTrack,onMessageDispatched:e.hooks.onMessageDispatched})}),a.subscribe("read",t=>{var n,i;e.xt===a&&(n=e.store,"agent"===(i=t.data).reader_type&&(n.agentLastReadAt.value=i.read_at))}),yield s.attach(),l())return void w().debug(Qa,"channel:attach:superseded",t);if(s.subscribe("typing",t=>{e.kt===s&&function(t,e,n){if("user"!==e.sender_type){t.isTyping.value=e.is_typing,t.typingSenderType.value=e.is_typing?e.sender_type:null;var i="ai"===e.sender_type?null:e.sender_name||("agent"===e.sender_type?"Agent":null);t.typingSender.value=e.is_typing?i:null,n.onTyping(e.is_typing,i||"")}}(e.store,t.data,{onTyping:e.hooks.onTypingDispatched})}),e.store.pendingRealtimeChannelId.value!==t)return void w().debug(Qa,"channel:attach:abandoned (pending cleared)",t);e.store.realtimeChannelId.value=t,e.store.realtimeAttached.value=!0,e.store.pendingRealtimeChannelId.value===t&&(e.store.pendingRealtimeChannelId.value=null),w().debug(Qa,"channel:realtime.attached",{channelId:t})}catch(n){if(l())return void w().debug(Qa,"channel:attach:superseded (after error)",t);w().error(Qa,"channel:attach:failed",n),e.store.realtimeAttached.value=!1,e.store.pendingRealtimeChannelId.value===t&&(e.store.pendingRealtimeChannelId.value=null),yield e.Ct()}}})()}detachConversation(){var t=this.Ct().finally(()=>{this.St===t&&(this.St=null)});return this.St=t,t}Ct(){var t=this.yt,e=this.xt,n=this.kt;return this.xt=null,this.kt=null,Promise.all([this.At(t,e),this.At(t,n)]).then(()=>{})}publishTyping(t){var e=this.kt;e&&e.publish("typing",t).catch(t=>{w().warn(Qa,"failed to publish typing indicator:",t)})}disconnectAll(){var t=this;return s(function*(){if(t.St)try{yield t.St}catch(t){}var e=t.yt,n=t.xt,i=t.kt,r=t.wt;if(t.xt=null,t.kt=null,t.wt=null,t.store.realtimeChannelId.value=null,t.store.realtimeAttached.value=!1,null==n||n.unsubscribe(),null==i||i.unsubscribe(),null==r||r.unsubscribe(),e){try{e.close()}catch(t){w().debug(Qa,"disconnect:close:error",t)}t.yt=null}t.store.ablyProjectId.value=null,t.store.connectionState.value="disconnected",t.store.lastConnectedDistinctId.value=null})()}Tt(){var t,e=null===(t=this.yt)||void 0===t?void 0:t.auth.clientId,n=this.store.lastConnectedDistinctId.value;if(e&&n){var i=e.split(":").slice(1).join(":")||e;i&&i!==n&&(w().warn(Qa,"identity:drift detected on connected — recreating"),this.hooks.onIdentityChange())}}At(t,e){return s(function*(){if(e&&t){e.unsubscribe();try{yield e.detach()}catch(t){}}})()}}var ts=["delivery_status"];function es(t,e,n){var i=t.messages.value,r=i.findIndex(t=>t.id===e);if(-1!==r){var o=i[r];if(o.delivery_status!==n){var a=[...i];if(void 0===n){var s=function(t,e){if(null==t)return{};var n={};for(var i in t)if({}.hasOwnProperty.call(t,i)){if(-1!==e.indexOf(i))continue;n[i]=t[i]}return n}(o,ts);a[r]=s}else a[r]=l({},o,{delivery_status:n});t.setMessages(a)}}}function ns(t,e){return is.apply(this,arguments)}function is(){return is=s(function*(t,e){var n;if(!t.ok)return!1;if(t.headers.get("X-Vtilt-User-Message-Id")===e)return!0;var i=t.headers.get("content-type")||"";if(i.includes("text/plain"))return t.ok;if(i.includes("application/json"))try{var r=yield t.clone().json();return(null===(n=null==r?void 0:r.message)||void 0===n?void 0:n.id)===e}catch(t){return!1}return t.ok}),is.apply(this,arguments)}function rs(t,e){return"vtilt-chat-outbox:"+t+":"+e}function os(t){return t+":last-channel"}class as{constructor(t){this.Et=t,this.Ot=[]}list(){var t=this.It();return t.length>0?(this.Ot=t,t):this.Ot}get(t){return this.list().find(e=>e.messageId===t)}upsert(t){var e=this.list().filter(e=>e.messageId!==t.messageId);e.push(t),this.Mt(e)}patch(t,e){var n=this.list(),i=n.findIndex(e=>e.messageId===t);-1!==i&&(n[i]=l({},n[i],e),this.Mt(n))}remove(t){this.Mt(this.list().filter(e=>e.messageId!==t))}dueEntries(t){return void 0===t&&(t=Date.now()),this.list().filter(e=>"sending"!==e.state&&e.nextRetryAt<=t&&!(e.newChannel&&!e.channelId))}requeueStaleSending(t,e){var n;void 0===t&&(t=3e4),void 0===e&&(e=Date.now());for(var i=this.list(),r=!1,o=0;o<i.length;o++){var a=i[o];if("sending"===a.state){var s=null!==(n=a.sendingSince)&&void 0!==n?n:0;(!s||e-s>=t)&&(i[o]=l({},a,{state:"pending",sendingSince:void 0}),r=!0)}}r&&this.Mt(i)}It(){if("undefined"==typeof sessionStorage)return[];try{var t=sessionStorage.getItem(this.Et);if(!t)return[];var e=JSON.parse(t);return Array.isArray(e)?e:[]}catch(t){return[]}}Mt(t){if(this.Ot=t,"undefined"!=typeof sessionStorage)try{0===t.length?sessionStorage.removeItem(this.Et):sessionStorage.setItem(this.Et,JSON.stringify(t))}catch(t){}}}function ss(t,e){return void 0===e&&(e=Date.now()),e+Math.min(6e4,1e3*Math.pow(2,Math.max(0,t-1)))}var ls="chat";class us{constructor(t,e){var n,i,r,o,a,s,u,h,c;void 0===e&&(e={}),this.Pt=null,this.Dt=new D,this.Rt=[],this.jt=[],this.Nt=[],this.Ut=null,this.Bt=null,this.zt=null,this.qt=!1,this.Ft=null,this.Ht=!1,this.Lt=0,this.Wt=0,this.Jt=!1,this.Vt=null,this.$t=!1,this.Kt=null,this.Gt=null,this.Qt=!1,this.Yt=null,this.Xt=null,this.Zt=!1,this.te=null,this.ee=()=>{this.ne()},this.ie=()=>{"undefined"!=typeof document&&"visible"===document.visibilityState&&this.ne()},this.re=!1,this._instance=t,this.oe=l({enabled:!0,position:"bottom-right",aiMode:!0,preload:!1},e,{theme:l({},Fe,e.theme)}),this.ae=new He,this.ae.isVisible.value=!1!==(null===(n=this.oe.bubble)||void 0===n?void 0:n.visible),this.ae.theme.value={primaryColor:null!==(r=null===(i=this.oe.theme)||void 0===i?void 0:i.primaryColor)&&void 0!==r?r:Fe.primaryColor,fontFamily:null!==(a=null===(o=this.oe.theme)||void 0===o?void 0:o.fontFamily)&&void 0!==a?a:Fe.fontFamily,borderRadius:null!==(u=null===(s=this.oe.theme)||void 0===s?void 0:s.borderRadius)&&void 0!==u?u:Fe.borderRadius},this.Dt.register(ne),this.Dt.register(ve),this.se=new Za(t,this.ae,{getDistinctId:()=>this.le,onIdentityChange:()=>{this.ue()},onNewChannelNotification:()=>{this.getChannels()},onAgentMessageWhileOpen:()=>{setTimeout(()=>this.he(),100)},onMessageTrack:t=>{var e,n,i,r;this.ce(t,t.channel_id,null!==(n=null===(e=this.ae.channel.value)||void 0===e?void 0:e.ai_mode)&&void 0!==n&&n),"ai"!==t.sender_type&&"agent"!==t.sender_type||null===(r=(i=this.oe).onMessageReceived)||void 0===r||r.call(i,{channelId:t.channel_id,messageId:t.id,senderType:t.sender_type})},onMessageDispatched:t=>{this.Rt.forEach(e=>e(t))},onTypingDispatched:(t,e)=>{this.jt.forEach(n=>n(t,e))}}),this.Xt=this.de(),this.Vt=this.ae.realtimeReady.subscribe(t=>{if(t&&this.Jt){var e=Date.now()-this.Wt;this.Jt=!1,e<3e3&&(this.Ht=!0,this.ve(!0),this.Lt=Date.now(),this.fe())}}),this.Pt=oi({store:this.ae,controller:this,position:null!==(h=this.oe.position)&&void 0!==h?h:"bottom-right",bubbleDraggable:!!(null===(c=this.oe.bubble)||void 0===c?void 0:c.draggable)}),this.pe(),this.Bt=this._instance._emitter.on("user:identified",()=>{this.ue()}),this.zt=this._instance._emitter.on("user:reset",()=>{this.ue()}),this.ge=this.le,this.me=new as(this.be()),this.me.requeueStaleSending(),this.ye(),this.ne()}get isOpen(){return this.ae.isOpen.value}get isConnected(){return this.ae.isConnected.value}get isLoading(){return this.ae.isLoading.value}get unreadCount(){return this.ae.unreadCount.value}get channel(){return this.ae.channel.value}get channels(){return this.ae.channels.value}get currentView(){return this.ae.currentView.value}get store(){return this.ae}get widgets(){return this.Dt}get theme(){return this.ae.theme.value}get config(){return this.oe}open(){var t,e;this.ae.isOpen.value||(this.ae.isVisible.value=!0,this.ae.isOpen.value=!0,this.ae.polledUnreadTotal.value=null,this.Yt=Date.now(),null===(e=(t=this.oe).onWidgetOpen)||void 0===e||e.call(t),this.se.ensureConnected(),0===this.ae.channels.value.length&&this.getChannels())}close(){var t,e,n;if(this.ae.isOpen.value){var i=this.Yt?Math.round((Date.now()-this.Yt)/1e3):0;this.Yt=null,this.ae.isOpen.value=!1,this.stopUserTyping(),this.re||!1!==(null===(t=this.oe.bubble)||void 0===t?void 0:t.visible)||(this.ae.isVisible.value=!1);var r=this.ae.messages.value.filter(t=>"user"===t.sender_type).length;null===(n=(e=this.oe).onWidgetClose)||void 0===n||n.call(e,{timeOpenSeconds:i,messagesSent:r}),this.we()}}we(){var t=this;return s(function*(){yield t.se.detachConversation(),yield t.se.disconnectAll()})()}applyPolledUnreadCount(t){this.ae.isOpen.value||(this.ae.polledUnreadTotal.value=t)}toggle(){this.ae.isOpen.value?this.close():this.open()}show(){this.re=!0,this.ae.isVisible.value=!0}hide(){this.re=!1,this.ae.isVisible.value=!1}getChannels(){var t=this;return s(function*(){t.ae.isLoading.value=!0;try{var e=yield T(t._instance,x+"?distinct_id="+encodeURIComponent(t.le),{method:"GET"});e&&(t.ae.channels.value=e.channels||[])}catch(t){w().error(ls,"failed to fetch channels:",t)}finally{t.ae.isLoading.value=!1}})()}selectChannel(t){var e=this;return s(function*(){var n=e.ae.channels.value.find(e=>e.id===t);e.ae.channel.value=n?e.xe(n):null,e.ae.prepareChannelSwitch();var i=e.ae.getCachedMessages(t);i&&(e.ae.messages.value=i),e.ae.currentView.value="conversation",e.ae.isLoading.value=!0,e.ae.pendingRealtimeChannelId.value=t,e.se.detachConversation();var r=!1,o=!1;try{var a=yield T(e._instance,x+"/"+t+"?distinct_id="+encodeURIComponent(e.le),{method:"GET"});if(e.ae.pendingRealtimeChannelId.value!==t)return void(o=!0);if(!a)return void w().error(ls,"selectChannel: server returned no data for channel",t);e.ae.channel.value=a.channel;var s=a.messages||[];e.ae.messages.value=s,e.ae.cacheMessages(a.channel.id,s),e.ae.agentLastReadAt.value=a.channel.agent_last_read_at||null,e.ae.initialUserReadAt.value=a.channel.user_last_read_at||null,e.se.attachConversation(a.channel.id),e.ae.isOpen.value&&e.he(),r=!0}catch(t){w().error(ls,"failed to select channel:",t)}finally{e.ae.pendingRealtimeChannelId.value===t&&(e.ae.pendingRealtimeChannelId.value=null),e.ae.isLoading.value=!1,o||r||null!==e.ae.channel.value||"conversation"!==e.ae.currentView.value||(e.ae.currentView.value="list")}})()}createChannel(t){var n=this;return s(function*(){var i,r,o,a=!0===(null==t?void 0:t.skipGreeting),s=!0===(null==t?void 0:t.preserveMessages),u=s?n.ae.messages.value.slice():[];n.ae.channel.value=null,s||n.ae.prepareChannelSwitch(),n.ae.currentView.value="conversation",n.ae.isLoading.value=!0,n.se.detachConversation();var h=!1;try{var c=yield T(n._instance,x,{method:"POST",body:JSON.stringify(l({distinct_id:n.le,page_url:null===(i=null==e?void 0:e.location)||void 0===i?void 0:i.href,page_title:"undefined"!=typeof document?document.title:""},a&&{skip_greeting:!0}))});if(!c)return void w().error(ls,"createChannel: server returned no data, channel was not created");n.ae.channel.value=c.channel;var d=c.messages||[];if(u.length>0){var v=new Set(d.map(t=>t.id)),f=u.filter(t=>!v.has(t.id)).map(t=>t.channel_id?t:l({},t,{channel_id:c.channel.id}));n.ae.messages.value=[...d,...f]}else n.ae.messages.value=d;n.ae.agentLastReadAt.value=c.channel.agent_last_read_at||null,n.ae.initialUserReadAt.value=c.channel.user_last_read_at||null;var p={id:c.channel.id,status:c.channel.status,ai_mode:c.channel.ai_mode,last_message_at:c.channel.last_message_at,last_message_preview:c.channel.last_message_preview,last_message_sender:c.channel.last_message_sender,unread_count:0,user_last_read_at:c.channel.user_last_read_at,created_at:c.channel.created_at};n.ae.prependChannelSummary(p),null===(o=(r=n.oe).onConversationStart)||void 0===o||o.call(r,{channelId:c.channel.id,aiMode:c.channel.ai_mode}),n.se.attachConversation(c.channel.id),n.ke(c.channel.id),n.Se(c.channel.id),h=!0}catch(t){w().error(ls,"failed to create channel:",t)}finally{if(n.ae.pendingRealtimeChannelId.value=null,n.ae.isLoading.value=!1,!h&&null===n.ae.channel.value)if(u.length>0){var g=new Set(n.me.list().map(t=>t.messageId)),m=u.filter(t=>g.has(t.id));m.length>0?(n.ae.messages.value=m.map(t=>t.delivery_status?t:l({},t,{delivery_status:"failed"})),n.ae.currentView.value="conversation"):(n.ae.messages.value=[],n.ae.currentView.value="list")}else n.ae.currentView.value="list"}})()}goToChannelList(){var t,e,n,i=this.ae.channel.value;if(i){var r=this.ae.messages.value[this.ae.messages.value.length-1];this.ae.patchChannelSummary(i.id,{last_message_at:null!==(t=null==r?void 0:r.created_at)&&void 0!==t?t:void 0,last_message_preview:r?(n=r.content,n.replace(/\n?<!--vtilt:widget:[\s\S]*?-->/g,"").replace(/<[^>]*>/g,"").trim().substring(0,100)):void 0,last_message_sender:null!==(e=null==r?void 0:r.sender_type)&&void 0!==e?e:void 0,unread_count:0}),this.ae.cacheMessages(i.id,this.ae.messages.value)}this.ae.clearActiveChannel(),this.ae.currentView.value="list",this.se.detachConversation().then(()=>{this.se.isLive&&!this.ae.pendingRealtimeChannelId.value&&this.se.refreshToken()})}_e(){this.Kt&&(this.Kt.abort(),this.Kt=null),this.Gt&&(zn(this.ae,this.Gt),this.Gt=null),this.Te(),this.Ce()}Te(){for(var t=this.ae.messages.value,e=-1,n=t.length-1;n>=0;n--)if("user"===t[n].sender_type){e=n;break}if(-1!==e){var i=t.filter((t,n)=>n<=e||"ai"!==t.sender_type);i.length!==t.length&&this.ae.setMessages(i)}}Ae(){this.Qt=!0,this.ae.isTyping.value=!0,this.ae.typingSenderType.value="ai",this.ae.typingSender.value="AI Assistant"}Ce(){this.Qt&&(this.Qt=!1,this.ae.isTyping.value=!1,this.ae.typingSender.value=null,this.ae.typingSenderType.value=null)}sendMessage(t,e){var n=this;return s(function*(){var i,r=M(t,e);if(r){n.ae.identityChangeInFlight.value&&(yield n.Ee());var{content:o,content_type:a,metadata:s}=r,u=!1!==(null==e?void 0:e.open),h="conversation"===n.ae.currentView.value&&null!==n.ae.channel.value,c=null!==(i=null==e?void 0:e.channel)&&void 0!==i?i:h?void 0:"new",d=function(){if("undefined"!=typeof crypto&&"function"==typeof crypto.randomUUID)return crypto.randomUUID();var t=crypto.getRandomValues(new Uint8Array(16));t[6]=15&t[6]|64,t[8]=63&t[8]|128;var e=t=>t.toString(16).padStart(2,"0");return e(t[0])+e(t[1])+e(t[2])+e(t[3])+"-"+e(t[4])+e(t[5])+"-"+e(t[6])+e(t[7])+"-"+e(t[8])+e(t[9])+"-"+e(t[10])+e(t[11])+e(t[12])+e(t[13])+e(t[14])+e(t[15])}(),v=(new Date).toISOString(),f="new"===c;if(n.Oe(l({messageId:d,channelId:"",distinctId:n.le,body:o,content_type:a,metadata:s,created_at:v,state:"pending",attempts:0,nextRetryAt:0},f?{newChannel:{skipGreeting:!0}}:{})),n.Ie(d),f){n.ae.currentView.value="conversation",n.ae.channel.value=null;var p={id:d,channel_id:"",sender_type:"user",sender_id:n.le||null,sender_name:null,sender_avatar_url:null,content:o,content_type:a,metadata:s,created_at:v,delivery_status:"pending"};n.ae.setMessages([p]),n.ae.isLoading.value=!0,u&&n.open(),yield n.createChannel({skipGreeting:!0,preserveMessages:!0})}else u&&n.open(),c&&(yield n.selectChannel(c));if(!n.ae.channel.value)throw w().error(ls,"cannot send message: no active channel (channel creation or selection failed)"),n.me.patch(d,{state:"failed"}),es(n.ae,d,"failed"),new Error("No active channel");if("conversation"!==n.ae.currentView.value)throw w().error(ls,"cannot send message: not in conversation view"),n.me.patch(d,{state:"failed"}),es(n.ae,d,"failed"),new Error("Not in conversation view");var g,m=n.ae.channel.value.id;if(n.me.patch(d,{channelId:m,newChannel:void 0}),f){var b=n.ae.messages.value.find(t=>t.id===d);if(!b)throw w().error(ls,"sendMessage: optimistic temp message was lost during createChannel"),n.me.patch(d,{state:"failed"}),new Error("Optimistic message lost");g=b}else g={id:d,channel_id:m,sender_type:"user",sender_id:n.le||null,sender_name:null,sender_avatar_url:null,content:o,content_type:a,metadata:s,created_at:v,delivery_status:"pending"},n.ae.setMessages([...n.ae.messages.value,g]);try{yield n.Me({messageId:d,channelId:m,body:o,content_type:a,metadata:s,tempMessage:g})}catch(t){if(t instanceof DOMException&&"AbortError"===t.name)throw n.Pe(d),t;throw n.Ce(),w().error(ls,"failed to send message:",t),n.Pe(d),n.ne(),t}}else w().warn(ls,"sendMessage: message is empty")})()}retryFailedMessage(t){var e,n=this.me.get(t);if(n&&"failed"===n.state){this.me.patch(t,{state:"pending",nextRetryAt:0,sendingSince:void 0}),es(this.ae,t,"pending");var i=n.channelId||(null===(e=this.ae.channel.value)||void 0===e?void 0:e.id)||"";if(i){var r=this.ae.messages.value.find(e=>e.id===t);r?(this.Ie(t),this.Me({messageId:t,channelId:i,body:n.body,content_type:n.content_type,metadata:n.metadata,tempMessage:r}).catch(e=>{e instanceof DOMException&&"AbortError"===e.name?this.Pe(t):(w().error(ls,"retry send failed:",e),this.Pe(t),this.ne())})):this.ne()}}}markAsRead(){this.he()}triggerAIAfterWidgetAction(t){var e=this;return s(function*(){try{e._e();var n=new AbortController;e.Kt=n,e.Ae();var i=e._instance.getConfig(),r=h(i,k(t)),o=yield fetch(r,{method:"POST",signal:n.signal,headers:l({"Content-Type":"application/json"},c(i)),body:JSON.stringify({channel_id:t,distinct_id:e.le,widget_action_trigger:!0})});if(!o.ok)return void e.Ce();(o.headers.get("content-type")||"").includes("text/plain")&&(yield Un({store:e.ae,response:o,channelId:t,signal:n.signal,isActive:()=>e.Kt===n,onStreamStart:t=>{e.Ce(),e.Kt===n&&(e.Gt=t)},onComplete:()=>{e.Kt===n&&(e.Kt=null,e.Gt=null)}}))}catch(t){if(t instanceof DOMException&&"AbortError"===t.name)return}})()}onMessage(t){return this.Rt.push(t),()=>{var e=this.Rt.indexOf(t);e>-1&&this.Rt.splice(e,1)}}onTyping(t){return this.jt.push(t),()=>{var e=this.jt.indexOf(t);e>-1&&this.jt.splice(e,1)}}onConnectionChange(t){return this.Nt.push(t),()=>{var e=this.Nt.indexOf(t);e>-1&&this.Nt.splice(e,1)}}updateConfig(t){var e,n,i,r,o,a,s;this.oe=function(t,e){var n,i,r=e.bubble,o=t.bubble;if(r){var a=null===r.offset?void 0:void 0!==r.offset?l({},null===(n=t.bubble)||void 0===n?void 0:n.offset,r.offset):null===(i=t.bubble)||void 0===i?void 0:i.offset;o=l({},t.bubble,r,{offset:a})}return l({},t,e,{theme:e.theme?l({},t.theme,e.theme):t.theme,bubble:o})}(this.oe,t),this.ae.theme.value={primaryColor:null!==(n=null===(e=this.oe.theme)||void 0===e?void 0:e.primaryColor)&&void 0!==n?n:Fe.primaryColor,fontFamily:null!==(r=null===(i=this.oe.theme)||void 0===i?void 0:i.fontFamily)&&void 0!==r?r:Fe.fontFamily,borderRadius:null!==(a=null===(o=this.oe.theme)||void 0===o?void 0:o.borderRadius)&&void 0!==a?a:Fe.borderRadius},(null===(s=this.oe.bubble)||void 0===s?void 0:s.draggable)||this.pe()}pe(){var t,e,n,i,r=null===(t=this.Pt)||void 0===t?void 0:t.host;if(r){var o,a=null!==(e=this.oe.position)&&void 0!==e?e:"bottom-right";!function(t,e){t.style.setProperty("--vt-bubble-offset-bottom",e.bottom+"px"),t.style.setProperty("--vt-bubble-offset-right",e.right+"px"),t.style.setProperty("--vt-bubble-offset-left",e.left+"px")}(r,(o=null===(n=this.oe.bubble)||void 0===n?void 0:n.offset,null===o?l({},Le):{bottom:We(null==o?void 0:o.bottom,Le.bottom),right:We(null==o?void 0:o.right,Le.right),left:We(null==o?void 0:o.left,Le.left)}));var s=null===(i=r.shadowRoot)||void 0===i?void 0:i.querySelector(".vt-container");s instanceof HTMLElement&&s.setAttribute("data-position",a)}}registerWidget(t){this.Dt.register(t)}notifyUserTyping(){this.Wt=Date.now(),this.ae.realtimeReady.value?(this.Ht?Date.now()-this.Lt>4e3&&(this.ve(!0),this.Lt=Date.now()):(this.Ht=!0,this.ve(!0),this.Lt=Date.now()),this.fe()):this.Jt=!0}stopUserTyping(){this.Jt=!1,this.Ft&&(clearTimeout(this.Ft),this.Ft=null),this.Ht&&this.ae.realtimeReady.value&&this.ve(!1),this.Ht=!1}fe(){this.Ft&&clearTimeout(this.Ft),this.Ft=setTimeout(()=>{this.Ft=null,this.Ht&&this.ae.realtimeReady.value&&this.ve(!1),this.Ht=!1},5e3)}destroy(){var t,e,n,i,r;this.De(),this.te&&(clearTimeout(this.te),this.te=null),this.se.disconnectAll(),this.Ft&&(clearTimeout(this.Ft),this.Ft=null),null===(t=this.Bt)||void 0===t||t.call(this),this.Bt=null,null===(e=this.zt)||void 0===e||e.call(this),this.zt=null,null===(n=this.Xt)||void 0===n||n.call(this),this.Xt=null,null===(i=this.Vt)||void 0===i||i.call(this),this.Vt=null,null===(r=this.Pt)||void 0===r||r.destroy(),this.Pt=null,this.Rt=[],this.jt=[],this.Nt=[]}getWidgetContext(t,e){var n,i,r,o=this,a=this._instance.getConfig();return{channelId:null!==(i=null===(n=this.ae.channel.value)||void 0===n?void 0:n.id)&&void 0!==i?i:"",distinctId:this.le,primaryColor:this.ae.theme.value.primaryColor,apiBase:a.api_host||"",token:a.token||"",messageId:t,buildEndpointUrl:t=>h(this._instance.getConfig(),t),dispatch:(r=s(function*(n,i){var r=o.Dt.get(e);if(r){var a=o.getWidgetContext(t,e);try{var s=yield r.onAction(n,i,a);(null==s?void 0:s.success)&&o.markWidgetSubmittedAndFollowUp(t,e,i)}catch(t){w().warn(ls,"widget action failed:",t)}}}),function(t,e){return r.apply(this,arguments)})}}markWidgetSubmittedAndFollowUp(t,e,n){var i,r,o,a,s=this.ae.messages.value.find(e=>e.id===t);if(s){var u=l({},null!==(i=s.metadata)&&void 0!==i?i:{}),h=(null!==(o=null!==(r=u.k)&&void 0!==r?r:u.widgets)&&void 0!==o?o:[]).map(t=>{if(t.type!==e)return t;var i=l({},t,{submitted:!0});return n.email&&(i.submittedEmail=String(n.email).trim()),n.name&&(i.submittedName=String(n.name).trim()),i});u.widgets=h,u.k&&(u.k=h);var c=this.ae.messages.value.map(e=>e.id===t?l({},e,{metadata:u}):e);this.ae.setMessages(c);var d=null===(a=this.ae.channel.value)||void 0===a?void 0:a.id;"escalate_to_human"!==e&&d&&this.triggerAIAfterWidgetAction(d)}}be(){return rs(this._instance.getConfig().token||"unknown",this.le)}Re(){this.me=new as(this.be()),this.me.requeueStaleSending()}Ie(t){this.me.patch(t,{state:"sending",sendingSince:Date.now()})}Pe(t){var e,n,i=(null!==(n=null===(e=this.me.get(t))||void 0===e?void 0:e.attempts)&&void 0!==n?n:0)+1;this.me.patch(t,{state:"failed",attempts:i,nextRetryAt:ss(i),sendingSince:void 0}),es(this.ae,t,"failed")}ke(t){for(var e of this.me.list())e.newChannel&&!e.channelId&&this.me.patch(e.messageId,{channelId:t,newChannel:void 0})}Se(t){!function(t,e){if("undefined"!=typeof sessionStorage)try{sessionStorage.setItem(os(t),JSON.stringify({channelId:e,at:Date.now()}))}catch(t){}}(this.be(),t)}je(t){var e=this.le;if(t&&t!==e){var n=this._instance.getConfig().token||"unknown",i=new as(rs(n,t)),r=i.list();for(var o of r)this.me.upsert(l({},o,{distinctId:e})),i.remove(o.messageId)}}ye(){"undefined"!=typeof window&&(window.addEventListener("online",this.ee),document.addEventListener("visibilitychange",this.ie))}De(){"undefined"!=typeof window&&(window.removeEventListener("online",this.ee),document.removeEventListener("visibilitychange",this.ie))}Oe(t){this.me.upsert(t)}Ne(t,e){var n,i;this.me.remove(t),es(this.ae,t,void 0),null===(i=(n=this.oe).onMessageDelivered)||void 0===i||i.call(n,{channelId:e,messageId:t})}ne(){this.te&&clearTimeout(this.te),this.te=setTimeout(()=>{this.te=null,this.Ue()},0)}Ue(){var t=this;return s(function*(){if(!t.Zt){t.Zt=!0,t.me.requeueStaleSending();try{var e=Date.now(),n=function*(e){var n=t.ae.messages.value.some(t=>t.id===e.messageId&&"sending"===t.delivery_status);if(n)return 1;try{yield t.Be(e)}catch(n){w().warn(ls,"outbox drain failed:",n);var i=e.attempts+1;t.me.patch(e.messageId,{state:"failed",attempts:i,nextRetryAt:ss(i)}),es(t.ae,e.messageId,"failed")}};for(var i of t.me.dueEntries(e))yield*n(i)}finally{t.Zt=!1;var r=t.me.dueEntries(Date.now());if(r.length>0){var o=Math.max(0,r[0].nextRetryAt-Date.now());t.te=setTimeout(()=>{t.te=null,t.Ue()},o)}}}})()}Be(t){var e=this;return s(function*(){var n=t.channelId||void 0;if(!n&&t.newChannel){var i=function(t,e){if(void 0===e&&(e=Date.now()),"undefined"==typeof sessionStorage)return null;try{var n=sessionStorage.getItem(os(t));if(!n)return null;var i=JSON.parse(n);return!(null==i?void 0:i.channelId)||"number"!=typeof i.at||e-i.at>12e4?null:i}catch(t){return null}}(e.be());i&&(n=i.channelId,e.me.patch(t.messageId,{channelId:n,newChannel:void 0}))}if(!n&&t.newChannel){var r=yield e.ze(t.newChannel.skipGreeting);if(!(n=null!=r?r:void 0))throw new Error("Failed to create channel for outbox entry");e.me.patch(t.messageId,{channelId:n,newChannel:void 0}),e.Se(n)}if(!n)throw new Error("Outbox entry missing channelId");var o=e.ae.messages.value.find(e=>e.id===t.messageId);if(o)return e.Ie(t.messageId),void(yield e.Me({messageId:t.messageId,channelId:n,body:t.body,content_type:t.content_type,metadata:t.metadata,tempMessage:o}));yield e.qe({messageId:t.messageId,channelId:n,body:t.body,content_type:t.content_type,metadata:t.metadata}),e.Ne(t.messageId,n)})()}ze(t){var n=this;return s(function*(){var i,r,o,a=yield T(n._instance,x,{method:"POST",body:JSON.stringify(l({distinct_id:n.le,page_url:null===(i=null==e?void 0:e.location)||void 0===i?void 0:i.href,page_title:"undefined"!=typeof document?document.title:""},t&&{skip_greeting:!0}))}),s=null!==(o=null===(r=null==a?void 0:a.channel)||void 0===r?void 0:r.id)&&void 0!==o?o:null;return s&&(n.ke(s),n.Se(s)),s})()}qe(t){var e=this;return s(function*(){var n,i=e._instance.getConfig(),r=h(i,k(t.channelId)),o=yield fetch(r,{method:"POST",keepalive:!0,headers:l({"Content-Type":"application/json"},c(i)),body:JSON.stringify({id:t.messageId,channel_id:t.channelId,distinct_id:e.le,content:t.body,content_type:t.content_type,metadata:t.metadata})});if(!o.ok)throw new Error("API error: "+o.status);if(!(yield ns(o,t.messageId)))throw new Error("User message not acknowledged");(o.headers.get("content-type")||"").includes("text/plain")&&(yield null===(n=o.body)||void 0===n?void 0:n.cancel().catch(()=>{}))})()}Me(t){var e=this;return s(function*(){var n,i,r,o,a,{messageId:s,channelId:u,body:d,content_type:v,metadata:f,tempMessage:p}=t;es(e.ae,s,"sending"),e._e();var g=new AbortController;e.Kt=g,!1!==(null===(n=e.ae.channel.value)||void 0===n?void 0:n.ai_mode)&&e.Ae();var m=e._instance.getConfig(),b=h(m,k(u)),y=yield fetch(b,{method:"POST",keepalive:!0,signal:g.signal,headers:l({"Content-Type":"application/json"},c(m)),body:JSON.stringify({id:s,channel_id:u,distinct_id:e.le,content:d,content_type:v,metadata:f})});if(!y.ok)throw new Error("API error: "+y.status);if(!(yield ns(y,s)))throw new Error("User message not acknowledged");if(e.Ne(s,u),(y.headers.get("content-type")||"").includes("text/plain"))yield Un({store:e.ae,response:y,channelId:u,signal:g.signal,isActive:()=>e.Kt===g,onStreamStart:t=>{e.Ce(),e.Kt===g&&(e.Gt=t)},onComplete:()=>{var t,n,i,r;e.Kt===g&&(e.Kt=null,e.Gt=null),null===(n=(t=e.oe).onMessageSent)||void 0===n||n.call(t,{channelId:u,messageId:p.id}),e.ce(p,u,null===(r=null===(i=e.ae.channel.value)||void 0===i?void 0:i.ai_mode)||void 0===r||r)}});else{e.Ce(),e.Kt===g&&(e.Kt=null);var w=yield y.json();if(null==w?void 0:w.message){var x=e.ae.messages.value.findIndex(t=>t.id===w.message.id);if(-1===x&&(x=e.ae.messages.value.findIndex(t=>t.id===s)),-1!==x){var S=[...e.ae.messages.value];S[x]=w.message,e.ae.setMessages(S)}null===(r=(i=e.oe).onMessageSent)||void 0===r||r.call(i,{channelId:u,messageId:w.message.id}),e.ce(w.message,u,null!==(a=null===(o=e.ae.channel.value)||void 0===o?void 0:o.ai_mode)&&void 0!==a&&a)}}})()}get le(){return this._instance.getDistinctId()||""}xe(t){return{id:t.id,project_id:"",person_id:"",distinct_id:this.le,status:t.status,ai_mode:t.ai_mode,unread_count:t.unread_count,last_message_at:t.last_message_at,last_message_preview:t.last_message_preview,last_message_sender:t.last_message_sender,user_last_read_at:t.user_last_read_at,agent_last_read_at:null,created_at:t.created_at}}ue(){var t=this;return s(function*(){if(!t.qt){var e=t.le;if(e&&e!==t.ae.lastConnectedDistinctId.value){t.qt=!0,t.ae.identityChangeInFlight.value=!0,t.ae.clearActiveChannel(),t.ae.currentView.value="list",t.je(t.ge),t.Re(),t.ge=e;try{yield t.se.disconnectAll(),t.ae.channels.value=[],t.ae.clearMessagesCache(),yield t.getChannels(),t.ae.isOpen.value&&(yield t.se.ensureConnected()),t.ne()}catch(t){w().error(ls,"failed to recreate Ably client after identity change:",t)}finally{t.qt=!1,t.ae.identityChangeInFlight.value=!1}}}})()}Ee(){return new Promise(t=>{if(this.ae.identityChangeInFlight.value)var e=this.ae.identityChangeInFlight.subscribe(n=>{n||(e(),t())});else t()})}ce(t,e,n){var i,r=this._instance.getRemoteConfig(),o=null==r?void 0:r.chatTracking;if("user"===t.sender_type){if(!1===(null==o?void 0:o.trackUserMessages))return}else if(("ai"===t.sender_type||"agent"===t.sender_type)&&!1===(null==o?void 0:o.trackAgentMessages))return;this._instance.capture(P,{$channel_type:"chat",$conversation_id:e,$message_id:t.id,$direction:"user"===t.sender_type?"inbound":"outbound",$sender_type:t.sender_type,$content_preview:(null!==(i=t.content)&&void 0!==i?i:"").slice(0,100),$ai_mode:n})}he(){var t,e=this.ae.channel.value;if(e&&!this.$t){var n=this.ae.messages.value,i=n[n.length-1];if(i){var r=this.ae.initialUserReadAt.value,o=n.some(t=>{return!("agent"!==t.sender_type&&"ai"!==t.sender_type||(e=t.created_at,r&&new Date(e)<=new Date(r)));var e}),a=this.ae.channels.value.find(t=>t.id===e.id),s=(null!==(t=null==a?void 0:a.unread_count)&&void 0!==t?t:0)>0;(o||s)&&(this.$t=!0,T(this._instance,S(e.id),{method:"POST",body:JSON.stringify({channel_id:e.id,distinct_id:this.le,read_at:i.created_at})}).then(t=>{t&&(this.ae.initialUserReadAt.value=i.created_at,this.ae.patchChannelSummary(e.id,{unread_count:0})),this.$t=!1}).catch(()=>{this.$t=!1}))}}}ve(t){this.se.publishTyping({sender_type:"user",sender_name:null,is_typing:t,sender_id:this.le})}de(){return this.ae.isConnected.subscribe(t=>{this.Ut!==t&&(this.Ut=t,this.Nt.forEach(e=>e(t)))})}}function hs(t,e){return new us(t,e)}o.__VTiltExtensions__=o.__VTiltExtensions__||{},o.__VTiltExtensions__.initChat=hs,t.LazyLoadedChat=us,t.default=hs,t.initChat=hs,Object.defineProperty(t,"__esModule",{value:!0})}({});
|
|
2
2
|
//# sourceMappingURL=chat.js.map
|