Setup

Understand how to set up Web Push as a channel for your marketing campaigns.

Check that Web Push is set up before creating campaigns.

Browser & OS

From the CleverTap dashboard, navigate to Settings > Channels > Web push. You can toggle the Web push for every browser that is integrated correctly. All the details are displayed on this page.

  1. Chrome Browser
CT Dashboard settings for Chrome

CT Dashboard settings for Chrome

📘

FCM Update: Migrate to HTTP v1 API

We only support VAPID based Web Push notifications. Customers that have FCM based tokens in their account, please note the following:

  • Firebase will deprecate its legacy APIs starting June 20, 2023, and discontinue them from June 2024.
  • To avoid disruptions in web push notifications, you must migrate to the new HTTP v1 API by June 20, 2024. For more information, refer to Integrate FCM and CleverTap.
  1. Firefox Browser
CT Dashboard settings for Firefox

CT Dashboard settings for Firefox

  1. Safari Browser
1080

CT Dashboard Settings for Safari

CT Dashboard Settings for Safari

CT Dashboard Settings for Safari

  1. Kai OS
CT Dashboard Settings for KaiOS

CT Dashboard Settings for KaiOS

Soft Prompt

The Soft Prompt feature improves the Web Push opt-in process by displaying a timely and contextual prompt before triggering the browser’s native opt-in prompt.

Instead of immediately giving control to the browser, which offers users an option to allow or deny requests, a soft prompt acts as the initial step to guide users. It allows marketers to prepare users by explaining the benefits of subscribing, thereby increasing the chances of a positive response. This strategic approach helps to prevent permanent opt-out decisions and improves overall opt-in rates.

This update allows you to fully customize the content, style, and placement of the Web Push Soft Prompt enhancing user experience and increasing opt-in rates. There are two types of Soft Prompt opt-ins:

  • Card Popup: A visually engaging prompt that appears on the website, encouraging users to subscribe immediately.
  • Bell Icon: A persistent opt-in option that ensures continuous visibility for the opt-in without disrupting the user experience. It allows users to subscribe to notifications at their convenience.

By using both the Card Popup and the Bell Icon, marketers can provide greater flexibility in how users opt-in. The Card Popup offers an immediate and engaging prompt, while the Bell Icon ensures that users who dismiss the initial prompt still have an option to subscribe later.

Card Popup

To use this feature, enable the Card Popup toggle from the CleverTap dashboard, in the Soft Prompt section of Web Push.

Soft Prompt

Soft Prompt

📘

Note

You will see two options: New and Old designs. By default, the old designs are selected. We recommend selecting the new design as it allows complete customization of the Soft Prompt as per your branding guidelines.

To enable New Design Soft Prompt from your dashboard:

  1. From the CleverTap dashboard, go to Settings > Channels > Web push. Click Soft Prompt.
  2. Toggle the Card Popup feature.
  3. Select New Design and click Edit to modify the design details.
Edit the New Design

Edit the New Design

  1. Edit the content and style of the popup. This includes the title, body, background color, icons, buttons, and so on.
  2. Once done, click Preview to view the appearance of the customized Card Popup and finalize the design before deploying it. Click Save to save the changes.
Edit options for Card Popup

Edit options for Card Popup

Bell Icon

To enable the Bell Icon feature from the CleverTap dashboard:

  1. Enable the Bell Icon toggle in the Soft Prompt section of the Web Push page.
Bell Icon

Bell Icon - show ON

  1. Click Edit to modify the design details.
  2. Edit the content and style of the Bell Icon. This includes the icon image, position, background color, hover text, and so on.
  3. Once done, click Preview to view the appearance of the customized Bell Icon.
  4. Click Save to save the changes.
Edit options for Bell Icon

Edit options for Bell Icon

FAQ

Can users enable both the Card Popup and the Bell Icon at the same time?

Yes. Users can enable both features simultaneously.

What happens to the bell icon if the user accepts notifications via Card Popup?

If the user accepts notifications, the bell icon will no longer appear, as notifications have already been allowed.

What happens if the user blocks the native prompt?

If the user blocks the native prompt (the browser’s built-in opt-in request), the card popup will not be shown again. The bell icon will remain visible and when the user clicks on the bell icon, a GIF will be displayed to nudge users to opt-in notifications.

Native Prompt Blocked

Native Prompt Blocked


CleverTap Ask AI Widget (CSP-Safe)
`},codespan(n){const r=U1.decodeHtmlEntities(n);return`${U1.escapeHtml(r)}`}};s1.use({renderer:e}),this.markedConfigured=!0}catch(e){this.logError("Failed to configure marked",e)}}static encodeBase64Unicode(e){try{if(typeof TextEncoder<"u"){const r=new TextEncoder().encode(e),i=Array.from(r,o=>String.fromCharCode(o)).join("");return btoa(i)}return btoa(unescape(encodeURIComponent(e)))}catch(n){return this.logError("Failed to encode Base64 Unicode",n),""}}static decodeBase64Unicode(e){try{if(typeof TextDecoder<"u"){const n=atob(e),r=Uint8Array.from(n,o=>o.charCodeAt(0));return new TextDecoder().decode(r)}return decodeURIComponent(escape(atob(e)))}catch(n){return this.logError("Failed to decode Base64 Unicode",n),""}}static logError(e,n){console.error(`[MarkdownRenderer] ${e}:`,n)}static normalizeBasics(e){return e=String(e).replace(/\r\n?/g,` `),e=e.replace(/"/g,'"').replace(/\\"/g,'"').replace(/[""]/g,'"').replace(/['']/g,"'").replace(/"{2,}/g,'"'),e=e.replace(/(^|[^a-zA-Z0-9*])\*\*([^*\n]+?) +\*\*/gm,"$1**$2**"),e}static extractTables(e){const n=[],r=/(\|[^\n]+\|\n)+(\|[-:| ]+\|\n)(\|[^\n]+\|\n?)*/g;return e=e.replace(r,i=>(n.push(i),`__TABLE_PLACEHOLDER_${n.length-1}__`)),[e,n]}static restoreTables(e,n){return n.forEach((r,i)=>{e=e.replace(`__TABLE_PLACEHOLDER_${i}__`,` ${r} `)}),e}static extractCodeBlocks(e){const n=[];return[e.replace(/^```\w*\n[\s\S]*?^```\s*$/gm,i=>(n.push(i),`__CODE_BLOCK_PLACEHOLDER_${n.length-1}__`)),n]}static restoreCodeBlocks(e,n){return n.forEach((r,i)=>{e=e.replace(`__CODE_BLOCK_PLACEHOLDER_${i}__`,r)}),e}static normalizeCodeBlocks(e){return e=e.replace(/^([ \t]+)(```\w*)\n([\s\S]*?)\n\1```/gm,(n,r,i,o)=>{const s=o.split(` `).map(a=>a.startsWith(r)?a.slice(r.length):a).join(` `);return`${i} ${s} \`\`\``}),e=e.replace(/^[ \t]+(```\w*)\n/gm,`$1 `).replace(/\n[ \t]+(```)[ \t]*$/gm,` $1`).replace(/\n[ \t]+(```)[ \t]*\n/g,` $1 `),e=e.replace(/\n`\s*$/g,"\n```\n").replace(/\n`\s*\n/g,"\n```\n"),e=e.replace(/([^\n])(```\w)/g,`$1 $2`),e=e.replace(/(```)(\d)/g,`$1 $2`).replace(/(```)((?!`)[^\s\n])/g,`$1 $2`).replace(/(```)\s+([^\n`])/g,`$1 $2`),e=e.replace(/(```)\n(\d+\.)/g,`$1 $2`).replace(/(```)\n([-*+]\s)/g,`$1 $2`).replace(/(```)\n([A-Za-z#[(])/g,`$1 $2`),e}static normalizeHeadings(e){return e=e.replace(/\*\*([^*\n:]{5,60})\*\*\s*-\s+\*\*/g,`## $1 - **`).replace(/\*\*([^*\n:]{5,60})\*\*\s*\n([-*+]\s+)/g,`## $1 $2`),e=e.replace(/([^\n])(#{1,6}\s)/g,`$1 $2`).replace(/([^\n])\n(#{1,6}\s)/g,`$1 $2`).replace(/^(#{1,6})([^\s#])/gm,"$1 $2"),e=e.replace(/^(#{1,6}\s+[^\n]*(?:tion|ment|ance|ence|ity|ies|les|ion|ure|ness))([A-Z][a-z])/gm,`$1 $2`),e=e.replace(/^(#{1,6}\s+[^\n]*(?:SDK|API|XML))((?:You|The|In|A|An|To|Run|Add|If|On|For|Is|It|Use|Get|See|Now|This|Then|Also|Next|Here)[a-z]*)/gm,`$1 $2`),e=e.replace(/^(#{1,6}\s+[^\n]*\.(?:xml|json|yaml|yml|gradle|kt|java|swift|plist))((?:Add|You|The|In|A|An|To|Run|If|On|For|Is|It|Use|Get|See|Now|This|Then|Also|Next|Here)[a-z]*)/gmi,`$1 $2`),e=e.replace(/^(#{1,6}\s+[^\n]*[\)\]])([A-Z][a-z]{2,})/gm,`$1 $2`),e=e.replace(/^(#{1,6}\s+[^\n]+[?!])\n([A-Z]\w)/gm,`$1 $2`).replace(/^(#{1,6}\s+[^\n]+[?!])([A-Z]\w)/gm,`$1 $2`).replace(/^(#{1,6}\s+[^\n]+\.)\n([A-Z]\w)/gm,`$1 $2`).replace(/^(#{1,6}\s+[^\n]+\.)([A-Z]\w)/gm,`$1 $2`),e=e.replace(/^(#{1,6}\s+[^\n]*:)(```)/gm,`$1 $2`),e=e.replace(/^(#{1,6}\s+[^\n]*:)([A-Z][a-z])/gm,`$1 $2`),e=e.replace(/^(#{1,6}\s+[^\n]*[?!.:])([-*+]\s+\*?\*?[A-Z])/gm,`$1 $2`).replace(/^(#{1,6}\s+[^\n]*[a-zA-Z0-9"'\)\]])([-*+]\s+)/gm,`$1 $2`).replace(/^(#{1,6}\s+[^\n]*[a-zA-Z0-9"'\)\]])(\d+\.\s+)/gm,`$1 $2`),e=e.replace(/^(#{1,6}\s[^\n]+)\n([^\n#\s])/gm,`$1 $2`).replace(/^(#{1,6}\s[^\n]+)\n{3,}([^\n#\s])/gm,`$1 $2`),e}static normalizeLists(e){return e=e.replace(/([^\n])\n((?![ \t])\d+\.\s+[*A-Z])/g,`$1 $2`).replace(/([.:!?)])(\s*)(?=\n(?![ \t])\d+\.\s+[*A-Z])/g,`$1 `).replace(/([a-zA-Z])(?=\n(?![ \t])\d+\.\s+[*A-Z])/g,`$1 `),e=e.replace(/([^\n])\n((?![ \t])[-*+]\s+[A-Za-z*])/g,`$1 $2`),e=e.replace(/([?!.:])(\s*)\n((?![ \t])[-*+]\s+\*?\*?[A-Z])/g,`$1 $3`),e=e.replace(/([?!.:\)\]])\s*((?![ \t])[-*+]\s+\*?\*?[A-Z])/g,`$1 $2`),e}static normalizeSpacing(e){return e=e.replace(/^\*{3}([^*\n]+)\*{3}\s*$/gm,"**$1**"),e=e.replace(/([^\s*:]\*\*)([A-Z][a-z])/g,`$1 $2`),e=e.replace(/([^\s*:]\*\*)(\d+\.\s)/g,`$1 $2`),e=e.replace(/([^\s*:]\*\*)([-*+]\s)/g,`$1 $2`),e=e.replace(/([a-zA-Z]\))(\d+\.\s)/g,`$1 $2`),e=e.replace(/([a-zA-Z]\])(\d+\.\s)/g,`$1 $2`),e=e.replace(/([^\n])\n(\*\*[A-Z0-9])/g,`$1 $2`),e=e.replace(/:[ \t]*\n?(\*\*[A-Za-z0-9])/g,`: $1`),e=e.replace(/(\*{1,2})\.([A-Z][a-z])/g,`$1. $2`).replace(/([a-z)])\.(\*\*[A-Z])/g,`$1. $2`).replace(/([a-z])\.([A-Z][a-z])/g,`$1. $2`).replace(/:(\d+\.\s)/g,`: $1`),e=e.replace(/(\)\.)([A-Z][a-z])/g,"$1 $2"),e=e.replace(/(\]\([^)]+\)\.)([A-Z])/g,"$1 $2"),e}static preProcess(e){if(!e)return"";e=this.normalizeBasics(e);const[n,r]=this.extractTables(e);e=n,e=this.normalizeCodeBlocks(e);const[i,o]=this.extractCodeBlocks(e);return e=i,e=this.normalizeHeadings(e),e=this.normalizeLists(e),e=this.normalizeSpacing(e),e=this.restoreTables(e,r),e=this.restoreCodeBlocks(e,o),e}static postProcess(e){return e?(e=e.replace(/

]*>\s*<\/p>/g,""),e=e.replace(/]*>\s*<\/h\1>/gi,""),e=e.replace(/ {2,}/g," "),e=e.replace(/(
){3,}/gi,"

"),e=e.replace(/(<\/h[1-6]>)(

)/gi,`$1 $2`).replace(/(<\/h[1-6]>)(

)(
    )(
    )(
    )(
    )()(
    )(
      )(
      )()()(

      )/gi,`$1 $2`).replace(/(<\/ol>)(

      )/gi,`$1 $2`),e):""}static render(e){if(!e)return"";const n=e;if(this.renderCache.has(n))return this.renderCache.get(n);this.configureMarked();const r=this.preProcess(e);try{const i=s1.parse(r),o=this.postProcess(i);if(this.renderCache.size>=this.CACHE_SIZE_LIMIT){const s=this.renderCache.keys().next().value;s&&this.renderCache.delete(s)}return this.renderCache.set(n,o),o}catch(i){return this.logError("Failed to render markdown",i),this.postProcess(U1.escapeHtml(e))}}static clearCache(){this.renderCache.clear()}static renderStreaming(e,n,r){if(!n)return"";this.cleanupStreamingCache();const i=this.streamingCache.get(e);if(i&&i.content===n)return i.html;if(i&&n.startsWith(i.content)&&n.length>i.content.length){const s=this.render(n);return r?this.streamingCache.set(e,{content:n,html:s,timestamp:Date.now()}):this.streamingCache.delete(e),s}const o=this.render(n);return r?this.streamingCache.set(e,{content:n,html:o,timestamp:Date.now()}):this.streamingCache.delete(e),o}static clearStreamingCache(e){e?this.streamingCache.delete(e):this.streamingCache.clear()}static cleanupStreamingCache(){const e=Date.now(),n=[];this.streamingCache.forEach((r,i)=>{e-r.timestamp>this.STREAMING_CACHE_TTL&&n.push(i)}),n.forEach(r=>this.streamingCache.delete(r))}};f1(St,"markedConfigured",!1),f1(St,"renderCache",new Map),f1(St,"CACHE_SIZE_LIMIT",100),f1(St,"streamingCache",new Map),f1(St,"STREAMING_CACHE_TTL",3e5);let J5=St;class He{static getFullPayload(){return{pageURL:window.location.href,sourceName:new URLSearchParams(window.location.search).get("utm_source")||void 0,sourceURL:document.referrer||void 0,timestamp:new Date().toISOString()}}static getMinimalPayload(){return{timestamp:new Date().toISOString()}}static initSession(){const e=Date.now();this.widgetOpened(),localStorage.setItem(this.lastActiveKey,String(e))}static truncateToWords(e,n=50){if(!e)return"";const r=e.trim().split(/\s+/);return r.length<=n?e:`${r.slice(0,n).join(" ")}...`}static track(e,n={},r=!1){const o={...r?this.getFullPayload():this.getMinimalPayload(),...n},s={timestamp:o.timestamp};for(const[a,l]of Object.entries(o))l!=null&&(s[a]=l);typeof clevertap<"u"&&clevertap?.event&&clevertap.event.push(e,s)}static widgetOpened(){this.track("widget_opened",{},!0)}static widgetClosed(){this.track("widget_closed",{},!0)}static questionAsked(e){this.track("question_asked",{question:e})}static responseGenerated(e){this.track("response_generated",{response:this.truncateToWords(e,50),responseLength:e?.length||0})}static noAnswerGiven(e,n="error"){this.track("no_answer_given",{question:e,reason:n})}static linkClicked(e,n){this.track("link_clicked",{url:e,linkText:n})}static conversationCleared(){this.track("conversation_cleared")}static findQuestionForResponse(e,n,r){if(!e||!n||n.length===0)return r||"";const i=n.findIndex(o=>o.id===e);if(i>0){for(let o=i-1;o>=0;o--)if(n[o].role==="user")return n[o].content}return r||""}static feedbackGiven(e){const n=this.findQuestionForResponse(e.messageId,e.messages,e.fallbackQuestion);this.track("feedback_given",{feedbackType:e.type,question:n,response:this.truncateToWords(e.response,50)})}static dailyLimitReached(e,n){this.track("daily_limit_reached",{currentUsage:e,limit:n})}}f1(He,"lastActiveKey","ct_chat_last_active"),f1(He,"sessionTimeout",27e5);const Xn="ct_chat_usage_count",z9="ct_chat_usage_date",G9=100;class m_{constructor(e){f1(this,"config");f1(this,"apiClient");f1(this,"voiceManager",null);f1(this,"initialized",!1);f1(this,"currentQuestion","");f1(this,"customProperties",new Map);f1(this,"_state");f1(this,"onStateChangeCallback",null);f1(this,"onVoiceStateCallback",null);f1(this,"onStreamingCallback",null);f1(this,"onErrorCallback",null);f1(this,"abortController",null);this.config=e,this.apiClient=new ML(e),this._state=l1.observable({threads:new Map,messages:new Map,currentThreadId:"",currentThread:null,currentMessages:[],isCurrentThreadStreaming:!1,randomQuestions:[],voiceState:{isListening:!1,isSpeaking:!1}})}updateThreadsMap(e,n){n===null?this._state.threads.delete(e):this._state.threads.set(e,n),this._state.threads=new Map(this._state.threads)}updateMessagesMap(e,n){n===null?this._state.messages.delete(e):this._state.messages.set(e,n),this._state.messages=new Map(this._state.messages),this._state.currentMessages=this._state.messages.get(this._state.currentThreadId)||[]}setCurrentThread(e,n){this._state.currentThreadId=e,this._state.currentThread=n,this._state.currentMessages=this._state.messages.get(e)||[]}async initialize(){if(this.initialized)return!0;try{return this.config.enableVoice&&(this.voiceManager=new SL,this.setupVoiceCallbacks()),this._state.randomQuestions=U1.getRandomItems(this.config.examples,this.config.examplesCount),this.createThread("New conversation"),He.initSession(),this.initialized=!0,this.emitStateChange("ready"),!0}catch(e){return this.emitError(`Failed to initialize: ${e.message}`),!1}}setupVoiceCallbacks(){this.voiceManager&&(this.voiceManager.onResultCallback=e=>{this.sendMessage(this._state.currentThreadId,e)},this.voiceManager.onErrorCallback=e=>{(e==="not-allowed"||e==="no-speech")&&this.emitError("Microphone access denied or no speech detected")},this.voiceManager.onStateChangeCallback=(e,n)=>{e==="listening"?(this._state.voiceState.isListening=n,this.onVoiceStateCallback?.("listening",n)):e==="speaking"&&(this._state.voiceState.isSpeaking=n,this.onVoiceStateCallback?.("speaking",n))})}get isInitialized(){return this.initialized}get isStreaming(){return this._state.isCurrentThreadStreaming}get isCurrentThreadStreaming(){return this._state.isCurrentThreadStreaming}get threads(){return Array.from(this._state.threads.values())}get currentThreadId(){return this._state.currentThreadId}get currentThread(){return this._state.currentThread}get currentMessages(){return this._state.currentMessages}get threadUpdatedAt(){return this._state.currentThread?.updatedAt??null}get threadCreatedAt(){return this._state.currentThread?.createdAt??null}get randomQuestions(){return this._state.randomQuestions}setCustomProperty(e,n){this.customProperties.set(e,n)}getCustomProperty(e){return this.customProperties.get(e)}getThread(e){return this._state.threads.get(e)||null}getThreads(){return this.threads}createThread(e="New conversation",n){this.cancelStreaming();const r=n??U1.generateId(),i={id:r,title:e,messages:[],createdAt:Date.now(),updatedAt:Date.now()};return this.updateThreadsMap(r,i),this.updateMessagesMap(r,[]),this.setCurrentThread(r,i),this._state.randomQuestions=U1.getRandomItems(this.config.examples,this.config.examplesCount),r}selectThread(e){this.cancelStreaming();const n=this._state.threads.get(e);this.updateMessagesMap(e,n?.messages||[]),this.setCurrentThread(e,n??null)}async updateThread(e,n){const r=this._state.threads.get(e);r&&(n&&(r.title=n),r.updatedAt=Date.now(),this.updateThreadsMap(e,r))}async deleteThread(e){if(this.updateThreadsMap(e,null),this.updateMessagesMap(e,null),this._state.currentThreadId===e){const n=this.threads;n.length>0?this.selectThread(n[0].id):this.createThread()}}async getThreadMessages(e){return this._state.messages.get(e)||[]}getLastMessage(e){const n=this._state.messages.get(e)||[];return n[n.length-1]||null}async sendMessage(e,n){if(this._state.isCurrentThreadStreaming||!n.trim())return;if(this.checkDailyReset(),this.hasReachedLimit()){const c=this.createMessage(e,"assistant","🚫 You've reached your daily question limit. Your limit will reset tomorrow. Thank you for using CleverTap Ask AI!");this.appendMessage(e,c),He.dailyLimitReached(this.getUsage(),G9);return}this.incrementUsage(),this.currentQuestion=n,He.questionAsked(n);const r=this.createMessage(e,"user",n);this.appendMessage(e,r);const i=this.getThread(e);if(i&&(!i.title||i.title==="New conversation")){const c=n.length>30?`${n.substring(0,30)}...`:n;await this.updateThread(e,c||"New conversation")}this._state.isCurrentThreadStreaming=!0;const o=this.createMessage(e,"assistant","",!0);this.appendMessage(e,o),this.emitStateChange("streaming_started");let s="",a=0;const l=30;this.abortController=new AbortController;try{const c=this.getFormattedHistory(e),u=await this.apiClient.sendPrompt(n,c,this.abortController.signal);for await(const d of this.apiClient.streamResponse(u))if(d.type==="chunk"&&d.content){s+=d.content;const g=Date.now(),C=g-a;(a===0||C>=l||/[.!?\n]$/.test(s.trim()))&&(this.updateMessage(e,o.id,s,!0),this.onStreamingCallback?.({type:"chunk",content:s}),a=g)}else d.type==="final"&&d.content&&d.content.length>s.length&&(s=d.content);s.trim()?(this.updateMessage(e,o.id,s.trim(),!1),He.responseGenerated(s.trim()),this.onStreamingCallback?.({type:"final",content:s.trim()})):(this.updateMessage(e,o.id,"⚠️ I couldn't process your request at this time. Please rephrase your question or try again shortly.",!1),He.noAnswerGiven(n,"empty_response"),this.onStreamingCallback?.({type:"error",error:"empty_response"}))}catch(c){if(c.name==="AbortError"){this._state.isCurrentThreadStreaming=!1;return}this.updateMessage(e,o.id,"⚠️ An error occurred. Please try again."),He.noAnswerGiven(n,c.message||"error"),this.onStreamingCallback?.({type:"error",error:c.message})}finally{this._state.isCurrentThreadStreaming=!1,this.abortController=null,this.emitStateChange("streaming_stopped")}}async clearThreadMessages(e){if(!this._state.isCurrentThreadStreaming){this.updateMessagesMap(e,[]);const n=this.getThread(e);n&&(n.messages=[],this.updateThreadsMap(e,n)),this.emitStateChange("messages_cleared"),He.conversationCleared()}}cancelStreaming(){this.abortController&&(this.abortController.abort(),this.abortController=null),this._state.isCurrentThreadStreaming=!1}startListening(){this.voiceManager?.startListening()}stopListening(){this.voiceManager?.stopListening()}speak(e){this.voiceManager?.isSpeaking?this.voiceManager.stopSpeaking():this.voiceManager?.speak(e)}stopSpeaking(){this.voiceManager?.stopSpeaking()}handleFeedback(e,n,r){const i=this._state.currentMessages;let o=this.currentQuestion;if(r){const s=i.findIndex(a=>a.id===r);if(s>0){for(let a=s-1;a>=0;a--)if(i[a].role==="user"){o=i[a].content;break}}}He.feedbackGiven({type:e,response:n,messageId:r,messages:i,fallbackQuestion:this.currentQuestion}),this.apiClient.sendFeedback({feedbackType:e,question:o,response:n,messageId:r})}handleLinkClick(e,n){He.linkClicked(e,n)}destroy(){this.voiceManager?.stopListening(),this.voiceManager?.stopSpeaking(),He.widgetClosed()}setOnStateChange(e){this.onStateChangeCallback=e}setOnVoiceState(e){this.onVoiceStateCallback=e}setOnStreaming(e){this.onStreamingCallback=e}setOnError(e){this.onErrorCallback=e}createMessage(e,n,r,i=!1){return{id:U1.generateId(),threadId:e,role:n,content:r,timestamp:Date.now(),isStreaming:i}}appendMessage(e,n){const r=[...this._state.messages.get(e)||[],n];this.updateMessagesMap(e,r);const i=this.getThread(e);i&&(i.messages=r,i.updatedAt=Date.now(),this.updateThreadsMap(e,i)),this.emitStateChange("messages_updated")}updateMessage(e,n,r,i=!1){const o=this._state.messages.get(e)||[],s=o.find(a=>a.id===n);if(s){s.content=r,s.isStreaming=i,this.updateMessagesMap(e,[...o]);const a=this.getThread(e);a&&(a.messages=o,this.updateThreadsMap(e,a)),this.emitStateChange("messages_updated")}}getFormattedHistory(e){return(this._state.messages.get(e)||[]).filter(r=>!r.isStreaming&&r.content.trim()).slice(-20).map(r=>[r.role,r.content])}emitStateChange(e){this.onStateChangeCallback?.(e)}emitError(e){this.onErrorCallback?.(e)}checkDailyReset(){const e=new Date().toDateString();U1.getCookie(z9)!==e&&(U1.setDailyCookie(z9,e),U1.setDailyCookie(Xn,"0"))}getUsage(){return Number(U1.getCookie(Xn)||0)}incrementUsage(){const e=this.getUsage()+1;return U1.setDailyCookie(Xn,String(e)),e}hasReachedLimit(){return this.getUsage()>=G9}}/*! @license DOMPurify 3.2.6 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/3.2.6/LICENSE */const{entries:W9,setPrototypeOf:j9,isFrozen:L_,getPrototypeOf:w_,getOwnPropertyDescriptor:b_}=Object;let{freeze:oe,seal:Ze,create:K9}=Object,{apply:Qn,construct:Jn}=typeof Reflect<"u"&&Reflect;oe||(oe=function(e){return e}),Ze||(Ze=function(e){return e}),Qn||(Qn=function(e,n,r){return e.apply(n,r)}),Jn||(Jn=function(e,n){return new e(...n)});const u3=ae(Array.prototype.forEach),__=ae(Array.prototype.lastIndexOf),q9=ae(Array.prototype.pop),e2=ae(Array.prototype.push),E_=ae(Array.prototype.splice),d3=ae(String.prototype.toLowerCase),e7=ae(String.prototype.toString),Y9=ae(String.prototype.match),t2=ae(String.prototype.replace),y_=ae(String.prototype.indexOf),x_=ae(String.prototype.trim),Fe=ae(Object.prototype.hasOwnProperty),se=ae(RegExp.prototype.test),n2=M_(TypeError);function ae(t){return function(e){e instanceof RegExp&&(e.lastIndex=0);for(var n=arguments.length,r=new Array(n>1?n-1:0),i=1;i2&&arguments[2]!==void 0?arguments[2]:d3;j9&&j9(t,null);let r=e.length;for(;r--;){let i=e[r];if(typeof i=="string"){const o=n(i);o!==i&&(L_(e)||(e[r]=o),i=o)}t[i]=!0}return t}function S_(t){for(let e=0;e/gm),N_=Ze(/\$\{[\w\W]*/gm),R_=Ze(/^data-[\-\w.\u00B7-\uFFFF]+$/),I_=Ze(/^aria-[\-\w]+$/),t8=Ze(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp|matrix):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i),H_=Ze(/^(?:\w+script|data):/i),Z_=Ze(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g),n8=Ze(/^html$/i),D_=Ze(/^[a-z][.\w]*(-[.\w]+)+$/i);var r8=Object.freeze({__proto__:null,ARIA_ATTR:I_,ATTR_WHITESPACE:Z_,CUSTOM_ELEMENT:D_,DATA_ATTR:R_,DOCTYPE_NAME:n8,ERB_EXPR:k_,IS_ALLOWED_URI:t8,IS_SCRIPT_OR_DATA:H_,MUSTACHE_EXPR:O_,TMPLIT_EXPR:N_});const i2={element:1,attribute:2,text:3,cdataSection:4,entityReference:5,entityNode:6,progressingInstruction:7,comment:8,document:9,documentType:10,documentFragment:11,notation:12},V_=function(){return typeof window>"u"?null:window},B_=function(e,n){if(typeof e!="object"||typeof e.createPolicy!="function")return null;let r=null;const i="data-tt-policy-suffix";n&&n.hasAttribute(i)&&(r=n.getAttribute(i));const o="dompurify"+(r?"#"+r:"");try{return e.createPolicy(o,{createHTML(s){return s},createScriptURL(s){return s}})}catch{return console.warn("TrustedTypes policy "+o+" could not be created."),null}},i8=function(){return{afterSanitizeAttributes:[],afterSanitizeElements:[],afterSanitizeShadowDOM:[],beforeSanitizeAttributes:[],beforeSanitizeElements:[],beforeSanitizeShadowDOM:[],uponSanitizeAttribute:[],uponSanitizeElement:[],uponSanitizeShadowNode:[]}};function o8(){let t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:V_();const e=i1=>o8(i1);if(e.version="3.2.6",e.removed=[],!t||!t.document||t.document.nodeType!==i2.document||!t.Element)return e.isSupported=!1,e;let{document:n}=t;const r=n,i=r.currentScript,{DocumentFragment:o,HTMLTemplateElement:s,Node:a,Element:l,NodeFilter:c,NamedNodeMap:u=t.NamedNodeMap||t.MozNamedAttrMap,HTMLFormElement:d,DOMParser:g,trustedTypes:C}=t,S=l.prototype,A=r2(S,"cloneNode"),k=r2(S,"remove"),Z=r2(S,"nextSibling"),$=r2(S,"childNodes"),P=r2(S,"parentNode");if(typeof s=="function"){const i1=n.createElement("template");i1.content&&i1.content.ownerDocument&&(n=i1.content.ownerDocument)}let O,U="";const{implementation:I,createNodeIterator:F,createDocumentFragment:Q,getElementsByTagName:r1}=n,{importNode:v1}=r;let a1=i8();e.isSupported=typeof W9=="function"&&typeof P=="function"&&I&&I.createHTMLDocument!==void 0;const{MUSTACHE_EXPR:m,ERB_EXPR:h,TMPLIT_EXPR:E,DATA_ATTR:D,ARIA_ATTR:z,IS_SCRIPT_OR_DATA:b,ATTR_WHITESPACE:x,CUSTOM_ELEMENT:H}=r8;let{IS_ALLOWED_URI:B}=r8,N=null;const G=w1({},[...X9,...t7,...n7,...r7,...Q9]);let X=null;const p1=w1({},[...J9,...i7,...e8,...C3]);let t1=Object.seal(K9(null,{tagNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},allowCustomizedBuiltInElements:{writable:!0,configurable:!1,enumerable:!0,value:!1}})),b1=null,D1=null,O1=!0,A1=!0,ze=!1,ce=!0,ue=!1,L1=!0,V1=!1,ee=!1,P1=!1,Ae=!1,Ve=!1,o1=!1,de=!0,M1=!1;const E1="user-content-";let Ce=!0,L=!1,M={},R=null;const w=w1({},["annotation-xml","audio","colgroup","desc","foreignobject","head","iframe","math","mi","mn","mo","ms","mtext","noembed","noframes","noscript","plaintext","script","style","svg","template","thead","title","video","xmp"]);let T=null;const n1=w1({},["audio","video","img","source","image","track"]);let W=null;const e1=w1({},["alt","class","for","id","label","name","pattern","placeholder","role","summary","title","value","style","xmlns"]),Y="http://www.w3.org/1998/Math/MathML",m1="http://www.w3.org/2000/svg",h1="http://www.w3.org/1999/xhtml";let pe=h1,w5=!1,a7=null;const P_=w1({},[Y,m1,h1],e7);let h3=w1({},["mi","mo","mn","ms","mtext"]),g3=w1({},["annotation-xml"]);const U_=w1({},["title","style","font","a","script"]);let a2=null;const F_=["application/xhtml+xml","text/html"],z_="text/html";let K1=null,b5=null;const G_=n.createElement("form"),g8=function(p){return p instanceof RegExp||p instanceof Function},l7=function(){let p=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};if(!(b5&&b5===p)){if((!p||typeof p!="object")&&(p={}),p=it(p),a2=F_.indexOf(p.PARSER_MEDIA_TYPE)===-1?z_:p.PARSER_MEDIA_TYPE,K1=a2==="application/xhtml+xml"?e7:d3,N=Fe(p,"ALLOWED_TAGS")?w1({},p.ALLOWED_TAGS,K1):G,X=Fe(p,"ALLOWED_ATTR")?w1({},p.ALLOWED_ATTR,K1):p1,a7=Fe(p,"ALLOWED_NAMESPACES")?w1({},p.ALLOWED_NAMESPACES,e7):P_,W=Fe(p,"ADD_URI_SAFE_ATTR")?w1(it(e1),p.ADD_URI_SAFE_ATTR,K1):e1,T=Fe(p,"ADD_DATA_URI_TAGS")?w1(it(n1),p.ADD_DATA_URI_TAGS,K1):n1,R=Fe(p,"FORBID_CONTENTS")?w1({},p.FORBID_CONTENTS,K1):w,b1=Fe(p,"FORBID_TAGS")?w1({},p.FORBID_TAGS,K1):it({}),D1=Fe(p,"FORBID_ATTR")?w1({},p.FORBID_ATTR,K1):it({}),M=Fe(p,"USE_PROFILES")?p.USE_PROFILES:!1,O1=p.ALLOW_ARIA_ATTR!==!1,A1=p.ALLOW_DATA_ATTR!==!1,ze=p.ALLOW_UNKNOWN_PROTOCOLS||!1,ce=p.ALLOW_SELF_CLOSE_IN_ATTR!==!1,ue=p.SAFE_FOR_TEMPLATES||!1,L1=p.SAFE_FOR_XML!==!1,V1=p.WHOLE_DOCUMENT||!1,Ae=p.RETURN_DOM||!1,Ve=p.RETURN_DOM_FRAGMENT||!1,o1=p.RETURN_TRUSTED_TYPE||!1,P1=p.FORCE_BODY||!1,de=p.SANITIZE_DOM!==!1,M1=p.SANITIZE_NAMED_PROPS||!1,Ce=p.KEEP_CONTENT!==!1,L=p.IN_PLACE||!1,B=p.ALLOWED_URI_REGEXP||t8,pe=p.NAMESPACE||h1,h3=p.MATHML_TEXT_INTEGRATION_POINTS||h3,g3=p.HTML_INTEGRATION_POINTS||g3,t1=p.CUSTOM_ELEMENT_HANDLING||{},p.CUSTOM_ELEMENT_HANDLING&&g8(p.CUSTOM_ELEMENT_HANDLING.tagNameCheck)&&(t1.tagNameCheck=p.CUSTOM_ELEMENT_HANDLING.tagNameCheck),p.CUSTOM_ELEMENT_HANDLING&&g8(p.CUSTOM_ELEMENT_HANDLING.attributeNameCheck)&&(t1.attributeNameCheck=p.CUSTOM_ELEMENT_HANDLING.attributeNameCheck),p.CUSTOM_ELEMENT_HANDLING&&typeof p.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements=="boolean"&&(t1.allowCustomizedBuiltInElements=p.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements),ue&&(A1=!1),Ve&&(Ae=!0),M&&(N=w1({},Q9),X=[],M.html===!0&&(w1(N,X9),w1(X,J9)),M.svg===!0&&(w1(N,t7),w1(X,i7),w1(X,C3)),M.svgFilters===!0&&(w1(N,n7),w1(X,i7),w1(X,C3)),M.mathMl===!0&&(w1(N,r7),w1(X,e8),w1(X,C3))),p.ADD_TAGS&&(N===G&&(N=it(N)),w1(N,p.ADD_TAGS,K1)),p.ADD_ATTR&&(X===p1&&(X=it(X)),w1(X,p.ADD_ATTR,K1)),p.ADD_URI_SAFE_ATTR&&w1(W,p.ADD_URI_SAFE_ATTR,K1),p.FORBID_CONTENTS&&(R===w&&(R=it(R)),w1(R,p.FORBID_CONTENTS,K1)),Ce&&(N["#text"]=!0),V1&&w1(N,["html","head","body"]),N.table&&(w1(N,["tbody"]),delete b1.tbody),p.TRUSTED_TYPES_POLICY){if(typeof p.TRUSTED_TYPES_POLICY.createHTML!="function")throw n2('TRUSTED_TYPES_POLICY configuration option must provide a "createHTML" hook.');if(typeof p.TRUSTED_TYPES_POLICY.createScriptURL!="function")throw n2('TRUSTED_TYPES_POLICY configuration option must provide a "createScriptURL" hook.');O=p.TRUSTED_TYPES_POLICY,U=O.createHTML("")}else O===void 0&&(O=B_(C,i)),O!==null&&typeof U=="string"&&(U=O.createHTML(""));oe&&oe(p),b5=p}},v8=w1({},[...t7,...n7,...A_]),m8=w1({},[...r7,...T_]),W_=function(p){let V=P(p);(!V||!V.tagName)&&(V={namespaceURI:pe,tagName:"template"});const J=d3(p.tagName),I1=d3(V.tagName);return a7[p.namespaceURI]?p.namespaceURI===m1?V.namespaceURI===h1?J==="svg":V.namespaceURI===Y?J==="svg"&&(I1==="annotation-xml"||h3[I1]):!!v8[J]:p.namespaceURI===Y?V.namespaceURI===h1?J==="math":V.namespaceURI===m1?J==="math"&&g3[I1]:!!m8[J]:p.namespaceURI===h1?V.namespaceURI===m1&&!g3[I1]||V.namespaceURI===Y&&!h3[I1]?!1:!m8[J]&&(U_[J]||!v8[J]):!!(a2==="application/xhtml+xml"&&a7[p.namespaceURI]):!1},Ye=function(p){e2(e.removed,{element:p});try{P(p).removeChild(p)}catch{k(p)}},_5=function(p,V){try{e2(e.removed,{attribute:V.getAttributeNode(p),from:V})}catch{e2(e.removed,{attribute:null,from:V})}if(V.removeAttribute(p),p==="is")if(Ae||Ve)try{Ye(V)}catch{}else try{V.setAttribute(p,"")}catch{}},L8=function(p){let V=null,J=null;if(P1)p=""+p;else{const G1=Y9(p,/^[\r\n\t ]+/);J=G1&&G1[0]}a2==="application/xhtml+xml"&&pe===h1&&(p=''+p+"");const I1=O?O.createHTML(p):p;if(pe===h1)try{V=new g().parseFromString(I1,a2)}catch{}if(!V||!V.documentElement){V=I.createDocument(pe,"template",null);try{V.documentElement.innerHTML=w5?U:I1}catch{}}const te=V.body||V.documentElement;return p&&J&&te.insertBefore(n.createTextNode(J),te.childNodes[0]||null),pe===h1?r1.call(V,V1?"html":"body")[0]:V1?V.documentElement:te},w8=function(p){return F.call(p.ownerDocument||p,p,c.SHOW_ELEMENT|c.SHOW_COMMENT|c.SHOW_TEXT|c.SHOW_PROCESSING_INSTRUCTION|c.SHOW_CDATA_SECTION,null)},c7=function(p){return p instanceof d&&(typeof p.nodeName!="string"||typeof p.textContent!="string"||typeof p.removeChild!="function"||!(p.attributes instanceof u)||typeof p.removeAttribute!="function"||typeof p.setAttribute!="function"||typeof p.namespaceURI!="string"||typeof p.insertBefore!="function"||typeof p.hasChildNodes!="function")},b8=function(p){return typeof a=="function"&&p instanceof a};function at(i1,p,V){u3(i1,J=>{J.call(e,p,V,b5)})}const _8=function(p){let V=null;if(at(a1.beforeSanitizeElements,p,null),c7(p))return Ye(p),!0;const J=K1(p.nodeName);if(at(a1.uponSanitizeElement,p,{tagName:J,allowedTags:N}),L1&&p.hasChildNodes()&&!b8(p.firstElementChild)&&se(/<[/\w!]/g,p.innerHTML)&&se(/<[/\w!]/g,p.textContent)||p.nodeType===i2.progressingInstruction||L1&&p.nodeType===i2.comment&&se(/<[/\w]/g,p.data))return Ye(p),!0;if(!N[J]||b1[J]){if(!b1[J]&&y8(J)&&(t1.tagNameCheck instanceof RegExp&&se(t1.tagNameCheck,J)||t1.tagNameCheck instanceof Function&&t1.tagNameCheck(J)))return!1;if(Ce&&!R[J]){const I1=P(p)||p.parentNode,te=$(p)||p.childNodes;if(te&&I1){const G1=te.length;for(let be=G1-1;be>=0;--be){const lt=A(te[be],!0);lt.__removalCount=(p.__removalCount||0)+1,I1.insertBefore(lt,Z(p))}}}return Ye(p),!0}return p instanceof l&&!W_(p)||(J==="noscript"||J==="noembed"||J==="noframes")&&se(/<\/no(script|embed|frames)/i,p.innerHTML)?(Ye(p),!0):(ue&&p.nodeType===i2.text&&(V=p.textContent,u3([m,h,E],I1=>{V=t2(V,I1," ")}),p.textContent!==V&&(e2(e.removed,{element:p.cloneNode()}),p.textContent=V)),at(a1.afterSanitizeElements,p,null),!1)},E8=function(p,V,J){if(de&&(V==="id"||V==="name")&&(J in n||J in G_))return!1;if(!(A1&&!D1[V]&&se(D,V))){if(!(O1&&se(z,V))){if(!X[V]||D1[V]){if(!(y8(p)&&(t1.tagNameCheck instanceof RegExp&&se(t1.tagNameCheck,p)||t1.tagNameCheck instanceof Function&&t1.tagNameCheck(p))&&(t1.attributeNameCheck instanceof RegExp&&se(t1.attributeNameCheck,V)||t1.attributeNameCheck instanceof Function&&t1.attributeNameCheck(V))||V==="is"&&t1.allowCustomizedBuiltInElements&&(t1.tagNameCheck instanceof RegExp&&se(t1.tagNameCheck,J)||t1.tagNameCheck instanceof Function&&t1.tagNameCheck(J))))return!1}else if(!W[V]){if(!se(B,t2(J,x,""))){if(!((V==="src"||V==="xlink:href"||V==="href")&&p!=="script"&&y_(J,"data:")===0&&T[p])){if(!(ze&&!se(b,t2(J,x,"")))){if(J)return!1}}}}}}return!0},y8=function(p){return p!=="annotation-xml"&&Y9(p,H)},x8=function(p){at(a1.beforeSanitizeAttributes,p,null);const{attributes:V}=p;if(!V||c7(p))return;const J={attrName:"",attrValue:"",keepAttr:!0,allowedAttributes:X,forceKeepAttr:void 0};let I1=V.length;for(;I1--;){const te=V[I1],{name:G1,namespaceURI:be,value:lt}=te,l2=K1(G1),u7=lt;let ne=G1==="value"?u7:x_(u7);if(J.attrName=l2,J.attrValue=ne,J.keepAttr=!0,J.forceKeepAttr=void 0,at(a1.uponSanitizeAttribute,p,J),ne=J.attrValue,M1&&(l2==="id"||l2==="name")&&(_5(G1,p),ne=E1+ne),L1&&se(/((--!?|])>)|<\/(style|title)/i,ne)){_5(G1,p);continue}if(J.forceKeepAttr)continue;if(!J.keepAttr){_5(G1,p);continue}if(!ce&&se(/\/>/i,ne)){_5(G1,p);continue}ue&&u3([m,h,E],S8=>{ne=t2(ne,S8," ")});const M8=K1(p.nodeName);if(!E8(M8,l2,ne)){_5(G1,p);continue}if(O&&typeof C=="object"&&typeof C.getAttributeType=="function"&&!be)switch(C.getAttributeType(M8,l2)){case"TrustedHTML":{ne=O.createHTML(ne);break}case"TrustedScriptURL":{ne=O.createScriptURL(ne);break}}if(ne!==u7)try{be?p.setAttributeNS(be,G1,ne):p.setAttribute(G1,ne),c7(p)?Ye(p):q9(e.removed)}catch{_5(G1,p)}}at(a1.afterSanitizeAttributes,p,null)},j_=function i1(p){let V=null;const J=w8(p);for(at(a1.beforeSanitizeShadowDOM,p,null);V=J.nextNode();)at(a1.uponSanitizeShadowNode,V,null),_8(V),x8(V),V.content instanceof o&&i1(V.content);at(a1.afterSanitizeShadowDOM,p,null)};return e.sanitize=function(i1){let p=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},V=null,J=null,I1=null,te=null;if(w5=!i1,w5&&(i1="<\x21--\x3e"),typeof i1!="string"&&!b8(i1))if(typeof i1.toString=="function"){if(i1=i1.toString(),typeof i1!="string")throw n2("dirty is not a string, aborting")}else throw n2("toString is not a function");if(!e.isSupported)return i1;if(ee||l7(p),e.removed=[],typeof i1=="string"&&(L=!1),L){if(i1.nodeName){const lt=K1(i1.nodeName);if(!N[lt]||b1[lt])throw n2("root node is forbidden and cannot be sanitized in-place")}}else if(i1 instanceof a)V=L8("<\x21----\x3e"),J=V.ownerDocument.importNode(i1,!0),J.nodeType===i2.element&&J.nodeName==="BODY"||J.nodeName==="HTML"?V=J:V.appendChild(J);else{if(!Ae&&!ue&&!V1&&i1.indexOf("<")===-1)return O&&o1?O.createHTML(i1):i1;if(V=L8(i1),!V)return Ae?null:o1?U:""}V&&P1&&Ye(V.firstChild);const G1=w8(L?i1:V);for(;I1=G1.nextNode();)_8(I1),x8(I1),I1.content instanceof o&&j_(I1.content);if(L)return i1;if(Ae){if(Ve)for(te=Q.call(V.ownerDocument);V.firstChild;)te.appendChild(V.firstChild);else te=V;return(X.shadowroot||X.shadowrootmode)&&(te=v1.call(r,te,!0)),te}let be=V1?V.outerHTML:V.innerHTML;return V1&&N["!doctype"]&&V.ownerDocument&&V.ownerDocument.doctype&&V.ownerDocument.doctype.name&&se(n8,V.ownerDocument.doctype.name)&&(be=" `+be),ue&&u3([m,h,E],lt=>{be=t2(be,lt," ")}),O&&o1?O.createHTML(be):be},e.setConfig=function(){let i1=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};l7(i1),ee=!0},e.clearConfig=function(){b5=null,ee=!1},e.isValidAttribute=function(i1,p,V){b5||l7({});const J=K1(i1),I1=K1(p);return E8(J,I1,V)},e.addHook=function(i1,p){typeof p=="function"&&e2(a1[i1],p)},e.removeHook=function(i1,p){if(p!==void 0){const V=__(a1[i1],p);return V===-1?void 0:E_(a1[i1],V,1)[0]}return q9(a1[i1])},e.removeHooks=function(i1){a1[i1]=[]},e.removeAllHooks=function(){a1=i8()},e}var s8=o8();const a8={USE_PROFILES:{html:!0},ALLOWED_TAGS:["p","div","span","br","strong","em","u","a","ul","ol","li","code","pre","h1","h2","h3","h4","h5","h6","blockquote","hr","table","thead","tbody","tr","th","td","img","button","svg","rect","path"],ALLOWED_ATTR:["href","target","class","id","src","alt","width","height","rel","title","data-code","data-language","loading","viewBox","fill","stroke","stroke-width","d","x","y","rx","ry","xmlns","fill-rule","clip-rule"]},l8=(t,e)=>{t.innerHTML=s8.sanitize(e.value||"",a8)},$_={bind:l8,update:l8},c8=t=>s8.sanitize(t,a8);var xt;let Se=xt=class extends l1{constructor(){super(...arguments),Object.defineProperty(this,"message",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"enableVoice",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"isSpeaking",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"feedbackGiven",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"codeBlockInstances",{enumerable:!0,configurable:!0,writable:!0,value:[]})}get isUser(){return this.message.role==="user"}get isAssistant(){return this.message.role==="assistant"}get showLoadingIndicator(){return this.message.isStreaming===!0&&this.message.content.trim()===""}get isStreamingWithContent(){return this.message.isStreaming===!0&&this.message.content.trim().length>0}get sanitizedUserContent(){return c8(U1.escapeHtml(this.message.content))}get renderedAssistantContent(){const e=J5.renderStreaming(this.message.id,this.message.content,this.message.isStreaming??!1);return c8(e)}mounted(){this.$nextTick(()=>this.mountCodeBlocks())}updated(){this.$nextTick(()=>this.mountCodeBlocks())}beforeDestroy(){this.destroyCodeBlocks(),J5.clearStreamingCache(this.message.id)}render(){return this.isUser?this.renderUserMessage():this.renderAssistantMessage()}renderUserMessage(){const e=this.$createElement;return e("div",{class:"ct-user-message"},[e("div",{class:"ct-user-query",directives:[{name:"safe-html",value:this.sanitizedUserContent}],on:{click:this.handleLinkClick}})])}renderAssistantMessage(){const e=this.$createElement,n=this.message.content.trim().length>0;return e("div",{class:"ct-ai-message-container"},[e("div",{class:"ct-ai-message-content"},[(n||this.showLoadingIndicator)&&e("div",{class:"ct-ai-message-final"},[e("div",{class:"ct-ai-message-icon-container"},[e(j,{attrs:{type:j.Type.ASK_AI,size:xt.AVATAR_ICON_SIZE},class:"ct-ask-logo"})]),e("div",{class:"ct-ai-message-body"},[this.showLoadingIndicator&&e("i",{class:"ct-status-line"},["Thinking..."]),n&&e("div",{class:["ct-ai-message",{"ct-streaming":this.isStreamingWithContent}],directives:[{name:"safe-html",value:this.renderedAssistantContent}],on:{click:this.handleLinkClick}}),this.isStreamingWithContent&&e("span",{class:"ct-streaming-cursor"})])]),!this.message.isStreaming&&n&&this.renderMessageActions()])])}renderMessageActions(){const e=this.$createElement;return e("div",{class:"ct-message-actions"},[e("div",{class:"ct-actions-primary"},[e(Ft,{class:"ct-action-btn",attrs:{text:this.message.content,tooltipText:"Copy",tooltipTextCopied:"Copied!"}})]),e("div",{class:"ct-actions-feedback"},[e(q1,{class:["ct-fb-btn",{"ct-active-good":this.feedbackGiven==="good"}],attrs:{tooltip:"Good Answer",stopPropagation:!0,iconSize:xt.ACTION_ICON_SIZE,icon:j.Type.THUMBS_UP,color:this.feedbackGiven==="good"?K.Color.SUCCESS:K.Color.LIGHT,disabled:!!this.feedbackGiven},on:{click:()=>this.handleFeedback("good")}}),e(q1,{class:["ct-fb-btn",{"ct-active-bad":this.feedbackGiven==="bad"}],attrs:{tooltip:"Bad Answer",stopPropagation:!0,iconSize:xt.ACTION_ICON_SIZE,icon:j.Type.THUMBS_DOWN,color:this.feedbackGiven==="bad"?K.Color.DANGER:K.Color.LIGHT,disabled:!!this.feedbackGiven},on:{click:()=>this.handleFeedback("bad")}})])])}onContentChange(){this.message.isStreaming||this.$nextTick(()=>this.mountCodeBlocks())}onStreamingChange(e){e||this.$nextTick(()=>this.mountCodeBlocks())}handleSpeak(){this.$emit(xt.Event.SPEAK,this.message.content)}handleFeedback(e){this.feedbackGiven=e,this.$emit(xt.Event.FEEDBACK,e,this.message.content,this.message.id)}handleLinkClick(e){const r=e.target.closest("a");r?.href&&!r.closest(".ct-message-actions")&&(e.preventDefault(),window.open(r.href,"_blank","noopener,noreferrer"),this.$emit(xt.Event.LINK_CLICK,r.href,r.textContent?.trim()||r.href))}mountCodeBlocks(){if(!this.$el||this.isUser||this.message.isStreaming)return;const e=this.$el.querySelector(".ct-ai-message");if(!e)return;const n=e.querySelectorAll(".ct-code-placeholder");if(n.length===0)return;this.destroyCodeBlocks();const r=Array.from(n).map(i=>i.getAttribute("data-language")||"text").filter((i,o,s)=>s.indexOf(i)===o);v_(r),n.forEach(i=>{const o=i.getAttribute("data-code"),s=i.getAttribute("data-language")||"text";if(o)try{const a=J5.decodeBase64Unicode(o);if(!a)return;const l=document.createElement("div");l.className="ct-code-block-wrapper",i.parentNode?.replaceChild(l,i);const c=l1.extend(Ie),u=new c({propsData:{text:a,language:s,showCopyButton:!0,tooltipText:"Copy",tooltipTextCopied:"Copied!"}});u.$mount(),l.appendChild(u.$el),this.codeBlockInstances.push(u)}catch(a){console.error("[ChatMessage] Failed to mount code block:",a)}})}destroyCodeBlocks(){this.codeBlockInstances.forEach(e=>{e.$destroy()}),this.codeBlockInstances=[]}};Object.defineProperty(Se,"AVATAR_ICON_SIZE",{enumerable:!0,configurable:!0,writable:!0,value:20}),Object.defineProperty(Se,"ACTION_ICON_SIZE",{enumerable:!0,configurable:!0,writable:!0,value:16}),v([y({type:Object,required:!0,validator:t=>!!t&&["user","assistant"].includes(t.role)}),f("design:type",Object)],Se.prototype,"message",void 0),v([y({type:Boolean,default:!1}),f("design:type",Boolean)],Se.prototype,"enableVoice",void 0),v([y({type:Boolean,default:!1}),f("design:type",Boolean)],Se.prototype,"isSpeaking",void 0),v([ge("message.content"),f("design:type",Function),f("design:paramtypes",[]),f("design:returntype",void 0)],Se.prototype,"onContentChange",null),v([ge("message.isStreaming"),f("design:type",Function),f("design:paramtypes",[Boolean]),f("design:returntype",void 0)],Se.prototype,"onStreamingChange",null),Se=xt=v([Z1({name:"ChatMessage",directives:{"safe-html":$_}})],Se),function(t){(function(e){e.COPY="copy",e.SPEAK="speak",e.FEEDBACK="feedback",e.LINK_CLICK="link-click"})(t.Event||(t.Event={}))}(Se||(Se={}));var ot,u8;let $1=ot=class extends l1{constructor(){super(...arguments),Object.defineProperty(this,"projectName",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"sendMessage",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"stopRun",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"isStreaming",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"disabled",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"enableVoice",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"isListening",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"hasMessages",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"startingText",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"textareaRef",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"text",{enumerable:!0,configurable:!0,writable:!0,value:""})}get placeholder(){return this.isListening?"Listening...":this.isStreaming?"AI is thinking...":"Search or ask a question..."}get textValue(){return this.text||this.startingText}onTextChange(){this.$nextTick(()=>this.adjustTextareaHeight())}onStartingTextChange(e){this.$nextTick(()=>{e&&(this.focus(),this.adjustTextareaHeight())})}mounted(){this.adjustTextareaHeight()}focus(){this.textareaRef?.focus()}render(){const e=arguments[0];return e("div",{class:"ct-composer-footer drag-cancel"},[e("div",{class:"ct-composer-container"},[e(K,{class:"ct-action-btn ct-clear-btn",attrs:{tooltip:"Clear conversation",size:ot.DELETE_BUTTON_SIZE,iconSize:ot.DELETE_ICON_SIZE,icon:j.Type.DELETE,color:K.Color.LIGHT,disabled:this.isStreaming||!this.hasMessages},on:{click:this.handleClear}}),e("div",{class:"ct-input-wrapper"},[e("textarea",{ref:"textarea",class:"ct-input",attrs:{autocomplete:"none",placeholder:this.placeholder,disabled:this.disabled||this.isStreaming,rows:1},domProps:{value:this.textValue},on:{input:n=>{this.text=n.target.value},keydown:this.handleKeyDown}}),e("div",{class:"ct-input-actions"},[this.enableVoice&&e(q1,{class:["ct-action-btn ct-voice-btn",{"ct-listening":this.isListening}],attrs:{tooltip:"Voice input",iconSize:ot.DEFAULT_ICON_SIZE,icon:j.Type.MIC,color:this.isListening?K.Color.DANGER:K.Color.PRIMARY,appearance:this.isListening?K.Appearance.OUTLINE:K.Appearance.LIGHTEN},on:{click:this.handleVoice}}),this.isStreaming?e("button",{class:"ct-submit-btn",on:{click:this.handleStop}},[e(j,{attrs:{type:j.Type.ASK_AI_LOADING,size:24},class:"ct-ask-ai-icon"})]):e("button",{class:"ct-submit-btn",attrs:{disabled:this.disabled||!this.text.trim()},on:{click:this.handleSend}},[this.disabled?e(j,{attrs:{type:j.Type.ASK_AI_LOADING,size:24},class:"ct-ask-ai-icon"}):e(j,{attrs:{type:j.Type.ASK_AI,size:24},class:"ct-ask-ai-icon"})])])])]),e("div",{class:"ct-disclaimer"},["Powered by CleverAI. Responses may have inaccuracies. Please verify important info."])])}adjustTextareaHeight(){const e=this.textareaRef;e&&(e.style.height="auto",e.style.height=`${Math.min(e.scrollHeight,200)}px`)}handleKeyDown(e){e.key==="Enter"&&!e.shiftKey&&(e.preventDefault(),this.handleSend())}handleSend(){const e=this.text.trim();e&&!this.disabled&&!this.isStreaming&&(this.sendMessage&&this.sendMessage(e),this.$emit(ot.Event.SEND,e),this.text="",this.$nextTick(()=>{this.adjustTextareaHeight()}))}handleStop(){this.stopRun&&this.stopRun(),this.$emit(ot.Event.STOP)}handleClear(){this.isStreaming||this.$emit(ot.Event.CLEAR)}handleVoice(){this.$emit(ot.Event.VOICE)}};Object.defineProperty($1,"DEFAULT_ICON_SIZE",{enumerable:!0,configurable:!0,writable:!0,value:16}),Object.defineProperty($1,"DELETE_BUTTON_SIZE",{enumerable:!0,configurable:!0,writable:!0,value:"48px"}),Object.defineProperty($1,"DELETE_ICON_SIZE",{enumerable:!0,configurable:!0,writable:!0,value:20}),v([y({type:String,required:!0}),f("design:type",String)],$1.prototype,"projectName",void 0),v([y({type:Function,required:!1}),f("design:type",Function)],$1.prototype,"sendMessage",void 0),v([y({type:Function,required:!1}),f("design:type",Function)],$1.prototype,"stopRun",void 0),v([y({type:Boolean,default:!1}),f("design:type",Boolean)],$1.prototype,"isStreaming",void 0),v([y({type:Boolean,default:!1}),f("design:type",Boolean)],$1.prototype,"disabled",void 0),v([y({type:Boolean,default:!1}),f("design:type",Boolean)],$1.prototype,"enableVoice",void 0),v([y({type:Boolean,default:!1}),f("design:type",Boolean)],$1.prototype,"isListening",void 0),v([y({type:Boolean,default:!1}),f("design:type",Boolean)],$1.prototype,"hasMessages",void 0),v([y({default:""}),f("design:type",String)],$1.prototype,"startingText",void 0),v([hn("textarea"),f("design:type",typeof(u8=typeof HTMLTextAreaElement<"u"&&HTMLTextAreaElement)=="function"?u8:Object)],$1.prototype,"textareaRef",void 0),v([ge("text"),f("design:type",Function),f("design:paramtypes",[]),f("design:returntype",void 0)],$1.prototype,"onTextChange",null),v([ge("startingText",{immediate:!0}),f("design:type",Function),f("design:paramtypes",[String]),f("design:returntype",void 0)],$1.prototype,"onStartingTextChange",null),$1=ot=v([Z1({name:"ChatComposer"})],$1),function(t){(function(e){e.SEND="send",e.STOP="stop",e.CLEAR="clear",e.VOICE="voice"})(t.Event||(t.Event={}))}($1||($1={}));var o7;let Kt=o7=class extends l1{constructor(){super(...arguments),Object.defineProperty(this,"question",{enumerable:!0,configurable:!0,writable:!0,value:void 0})}render(){const e=arguments[0];return e("button",{class:"ct-query-pill",on:{click:this.handleClick}},[this.question])}handleClick(){this.$emit(o7.Event.SELECT,this.question)}};v([y({type:String,required:!0}),f("design:type",String)],Kt.prototype,"question",void 0),Kt=o7=v([Z1({name:"QueryPill"})],Kt),function(t){(function(e){e.SELECT="select"})(t.Event||(t.Event={}))}(Kt||(Kt={}));var o2,d8,C8,p8;let Y1=o2=class extends l1{constructor(){super(...arguments),Object.defineProperty(this,"messageContainerRef",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"widgetRuntime",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"projectName",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"enableVoice",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"isAtBottom",{enumerable:!0,configurable:!0,writable:!0,value:!0}),Object.defineProperty(this,"isAtTop",{enumerable:!0,configurable:!0,writable:!0,value:!0}),Object.defineProperty(this,"messages",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(this,"isStreaming",{enumerable:!0,configurable:!0,writable:!0,value:!1}),Object.defineProperty(this,"isListening",{enumerable:!0,configurable:!0,writable:!0,value:!1}),Object.defineProperty(this,"isSpeaking",{enumerable:!0,configurable:!0,writable:!0,value:!1}),Object.defineProperty(this,"randomQuestions",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(this,"currentQuestionIndex",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"hasScrollableContent",{enumerable:!0,configurable:!0,writable:!0,value:!1})}get isEmpty(){return this.messages.length===0}checkScrollableContent(){const e=this.messageContainerRef;e?this.hasScrollableContent=e.scrollHeight>e.clientHeight:this.hasScrollableContent=!1}get questionIndices(){return this.messages.map((e,n)=>({message:e,index:n})).filter(({message:e})=>e.role==="user").map(({index:e})=>e)}onIsStreamingChange(e){this.isStreaming=e}onMessagesChange(e){e&&(this.messages=e),this.$nextTick(()=>{this.checkScrollableContent(),(this.isAtBottom||this.isStreaming)&&this.scrollToBottom()})}onThreadChange(){this.isAtBottom=!0,this.currentQuestionIndex=null,this.$nextTick(()=>{this.scrollToBottom()})}onRandomQuestionsChange(e){e&&(this.randomQuestions=e)}mounted(){this.randomQuestions=this.widgetRuntime.randomQuestions||[],this.$nextTick(()=>{this.checkScrollableContent(),this.scrollToBottom()})}render(){const e=arguments[0];return e("div",{class:"ct-thread"},[e("div",{class:"ct-message-area"},[e("div",{class:"ct-message-container",ref:"messageContainer",on:{scroll:this.handleScroll}},[this.isEmpty?this.renderEmptyState():this.renderMessages()]),!this.isEmpty&&this.renderScrollButton()]),e($1,{attrs:{projectName:this.projectName,isStreaming:this.isStreaming,hasMessages:!this.isEmpty,enableVoice:this.enableVoice,isListening:this.isListening},on:{send:this.handleSendMessage,stop:this.handleStopRun,clear:this.handleClear,voice:this.handleVoice}})])}renderEmptyState(){const e=this.$createElement;return e("div",{class:"ct-empty-state"},[e("div",{class:"ct-intro-header"},[e("div",{class:"ct-intro-icon-wrapper"},[e(j,{class:"ct-intro-icon",attrs:{type:j.Type.ASK_AI_BLUE,size:52}})]),e("div",{class:"ct-intro-heading"},["What do you want to ask?"])]),this.$slots.suggestions||e("div",{class:"ct-intro-queries"},[e("span",{class:"ct-intro-queries-label"},["Example queries"]),e("div",{class:"ct-intro-queries-list"},[this.randomQuestions.map(n=>e(Kt,{key:n,attrs:{question:n},on:{select:this.handleQueryPillSelect}}))])])])}renderMessages(){const e=this.$createElement;return e("div",{class:"ct-message-list"},[this.messages.map((n,r)=>e("div",{key:`${n.id}-${r}`,class:"ct-message-wrapper",ref:`message-${r}`,attrs:{"data-message-index":r,"data-is-question":n.role==="user"}},[e(Se,{attrs:{message:n,enableVoice:this.enableVoice,isSpeaking:this.isSpeaking},on:{copy:this.handleCopy,speak:this.handleSpeak,feedback:this.handleFeedback,linkClick:this.handleLinkClick}})]))])}renderScrollButton(){const e=this.$createElement;if(!this.hasScrollableContent)return null;const n=this.questionIndices,r=this.isAtTop&&n.length>0&&n[0]===0,i=this.currentQuestionIndex!==null&&n.length>0&&this.currentQuestionIndex===n[0];return this.isAtBottom?e("button",{class:"ct-scroll-button",on:{click:this.scrollToMostRecentQuestion},attrs:{"aria-label":"Scroll to most recent question"}},[e(j,{attrs:{type:j.Type.ARROW_UP,size:16}})]):r||i?e("button",{class:"ct-scroll-button",on:{click:this.scrollToBottom},attrs:{"aria-label":"Scroll to bottom"}},[e(j,{attrs:{type:j.Type.ARROW_DOWN,size:16}})]):this.currentQuestionIndex!==null?e("button",{class:"ct-scroll-button",on:{click:this.scrollToMostRecentQuestion},attrs:{"aria-label":"Scroll to previous question"}},[e(j,{attrs:{type:j.Type.ARROW_UP,size:16}})]):e("button",{class:"ct-scroll-button",on:{click:this.scrollToBottom},attrs:{"aria-label":"Scroll to bottom"}},[e(j,{attrs:{type:j.Type.ARROW_DOWN,size:16}})])}handleScroll(){const e=this.messageContainerRef;if(e){const{scrollTop:n,scrollHeight:r,clientHeight:i}=e;this.isAtTop=n0)r=n[i-1];else{this.scrollToTop(),this.currentQuestionIndex=null;return}}r!==null&&this.$nextTick(()=>{const i=e.querySelectorAll("[data-message-index]"),o=Array.from(i).find(s=>Number(s.dataset.messageIndex)===r);if(o){const s=o.offsetTop,a=parseInt(getComputedStyle(e).paddingTop,10)||0;e.scrollTo({top:s-a,behavior:"smooth"}),this.currentQuestionIndex=r,this.$nextTick(()=>{this.checkScrollableContent(),this.handleScroll()})}else this.scrollToTop(),this.currentQuestionIndex=null})}scrollToTop(){const e=this.messageContainerRef;e&&(e.scrollTo({top:0,behavior:"smooth"}),this.isAtTop=!0,this.currentQuestionIndex=null,this.$nextTick(()=>{this.checkScrollableContent(),this.isAtBottom=!this.hasScrollableContent}))}scrollToBottom(){const e=this.messageContainerRef;e&&(e.scrollTo({top:e.scrollHeight,behavior:"smooth"}),this.isAtBottom=!0,this.currentQuestionIndex=null,this.$nextTick(()=>{this.checkScrollableContent(),this.isAtTop=!this.hasScrollableContent}))}async handleSendMessage(e){await this.widgetRuntime.sendMessage(this.widgetRuntime.currentThreadId,e)}handleStopRun(){this.widgetRuntime.cancelStreaming?.()}handleClear(){this.widgetRuntime.clearThreadMessages?.(this.widgetRuntime.currentThreadId)}handleVoice(){this.widgetRuntime.startListening?.()}handleCopy(){this.$emit(o2.Event.COPY)}handleSpeak(e){this.widgetRuntime.speak?.(e)}handleFeedback(e,n,r){this.widgetRuntime.handleFeedback?.(e,n,r)}handleLinkClick(e,n){this.widgetRuntime.handleLinkClick?.(e,n)}handleQueryPillSelect(e){this.handleSendMessage(e)}setVoiceState(e,n){e==="listening"?this.isListening=n:e==="speaking"&&(this.isSpeaking=n)}};Object.defineProperty(Y1,"SCROLL_THRESHOLD",{enumerable:!0,configurable:!0,writable:!0,value:100}),v([hn("messageContainer"),f("design:type",typeof(d8=typeof HTMLDivElement<"u"&&HTMLDivElement)=="function"?d8:Object)],Y1.prototype,"messageContainerRef",void 0),v([r6("widgetRuntime"),f("design:type",Object)],Y1.prototype,"widgetRuntime",void 0),v([y({type:String,required:!0}),f("design:type",String)],Y1.prototype,"projectName",void 0),v([y({type:Boolean,default:!1}),f("design:type",Boolean)],Y1.prototype,"enableVoice",void 0),v([ge("widgetRuntime.isCurrentThreadStreaming",{immediate:!0,deep:!0}),f("design:type",Function),f("design:paramtypes",[Boolean]),f("design:returntype",void 0)],Y1.prototype,"onIsStreamingChange",null),v([ge("widgetRuntime.currentMessages",{immediate:!0,deep:!0}),f("design:type",Function),f("design:paramtypes",[typeof(C8=typeof Array<"u"&&Array)=="function"?C8:Object]),f("design:returntype",void 0)],Y1.prototype,"onMessagesChange",null),v([ge("widgetRuntime.currentThreadId",{immediate:!0,deep:!0}),f("design:type",Function),f("design:paramtypes",[]),f("design:returntype",void 0)],Y1.prototype,"onThreadChange",null),v([ge("widgetRuntime.randomQuestions",{immediate:!0}),f("design:type",Function),f("design:paramtypes",[typeof(p8=typeof Array<"u"&&Array)=="function"?p8:Object]),f("design:returntype",void 0)],Y1.prototype,"onRandomQuestionsChange",null),Y1=o2=v([Z1({name:"ChatThread",components:{ChatMessage:Se,ChatComposer:$1,QueryPill:Kt}})],Y1),function(t){(function(e){e.COPY="copy",e.MESSAGE_CLICK="message-click"})(t.Event||(t.Event={}))}(Y1||(Y1={}));let Mt=class extends l1{constructor(){super(...arguments),Object.defineProperty(this,"height",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"width",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"runtime",{enumerable:!0,configurable:!0,writable:!0,value:void 0})}get widgetRuntime(){return this.runtime}render(){const e=arguments[0];return e("div",{class:"ct-runtime-container",style:{height:this.height,width:this.width}},[this.$slots.header,e("div",{class:"ct-runtime-body"},[this.$slots.default])])}};v([y({default:"100%"}),f("design:type",String)],Mt.prototype,"height",void 0),v([y({default:"100%"}),f("design:type",String)],Mt.prototype,"width",void 0),v([y({required:!0}),f("design:type",Object)],Mt.prototype,"runtime",void 0),v([us("widgetRuntime"),f("design:type",Object),f("design:paramtypes",[])],Mt.prototype,"widgetRuntime",null),Mt=v([Z1({name:"ChatRuntimeProvider"})],Mt);var qt,st;(function(t){t.SUCCESS="success",t.WARNING="warning",t.DANGER="danger",t.INFO="info"})(st||(st={}));let le=qt=class extends l1{render(){const e=arguments[0],{className:n,iconType:r}=qt.TYPE_METADATA[this.type];return e("div",{class:j1(`lp-info-panel ${n}`,{inline:this.inline,emphasize:this.emphasize})},[this.title&&e("div",{class:"flex-row"},[e(j,{class:"lp-info-panel-icon",attrs:{size:qt.ICON_SIZE,type:r}}),e("div",{class:"flex-column"},[e("p",{class:"lp-info-panel__title"},[this.title]),this.renderMessage(),this.$slots.default])]),!this.title&&e("div",{class:j1(`flex-row ${this.contentPosition||""}`)},[e(j,{class:"lp-info-panel-icon",attrs:{size:qt.ICON_SIZE,type:r}}),this.renderMessage(),this.$slots.default,this.renderCloseIcon()])])}renderMessage(){const e=this.$createElement;return e("div",[this.text&&e("p",{class:j1("lp-info-panel-text")},[this.text])])}renderCloseIcon(){const e=this.$createElement;return this.showClose?e("span",{class:"flex-row-left"},[e(j,{class:"lp-info-panel-close-icon",attrs:{type:j.Type.CLOSE,size:this.isToast?qt.ICON_SIZE:20},on:{click:this.onClose}})]):null}onClose(){this.$emit(qt.EVENT_CLOSE)}};le.ICON_SIZE=16,le.TYPE_METADATA={[st.SUCCESS]:{className:"lp-success",iconType:j.Type.CHECK_MEDIUM},[st.WARNING]:{className:"lp-warning",iconType:j.Type.EXCLAMATION_MEDIUM},[st.DANGER]:{className:"lp-danger",iconType:j.Type.EXCLAMATION_MEDIUM},[st.INFO]:{className:"lp-info",iconType:j.Type.EXCLAMATION_MEDIUM}},v([y({type:String,required:!1,default:null}),f("design:type",Object)],le.prototype,"title",void 0),v([y({type:String,default:"",required:!1}),f("design:type",String)],le.prototype,"text",void 0),v([y({type:Boolean,default:!1,required:!1}),f("design:type",Boolean)],le.prototype,"inline",void 0),v([y({type:Boolean,default:!0,required:!1}),f("design:type",Boolean)],le.prototype,"emphasize",void 0),v([y({type:Boolean,default:!1,required:!1}),f("design:type",Boolean)],le.prototype,"showClose",void 0),v([y({type:Boolean,default:!1,required:!1}),f("design:type",Boolean)],le.prototype,"isToast",void 0),v([y({type:String,default:"",required:!1}),f("design:type",String)],le.prototype,"contentPosition",void 0),v([y({type:String,default:st.SUCCESS,validator:t=>ye(st).indexOf(t)!==-1}),f("design:type",String)],le.prototype,"type",void 0),le=qt=v([Z1({name:"InfoPanel"})],le),function(t){t.EVENT_CLOSE="close",t.Type=st,function(e){e.RIGHT="right",e.BOTTOM="bottom"}(t.ContentPosition||(t.ContentPosition={}))}(le||(le={}));var L5;let N1=L5=class extends l1{constructor(){super(...arguments),this.hasScrolled=!1,this.hasScrolledToEnd=!0}static get hasOpenedModals(){return nt.openedInstances.filter(e=>e.$parent instanceof L5).length>0}mounted(){document.documentElement&&document.documentElement.classList.add("modal-open")}beforeDestroy(){document.documentElement&&document.documentElement.classList.remove("modal-open")}render(){const e=arguments[0];return e(nt,{on:{bodyKeyDown:this.onBodyKeyDown}},[e("transition",{attrs:{appear:!0},on:{appear:this.computeScrollState}},[e("div",{attrs:{"data-testid":this.dataTestId},class:j1("lp-modal",this.className,{"full-screen":this.fullScreen,"transparent-bg":this.noFade,"not-like-modal":this.allowBackgroundInteraction},this.position),on:{click:this.onOverlayClick}},[e("div",{class:j1("wrapper",{"not-like-modal":this.allowBackgroundInteraction})},[this.simple?this.$slots.default:this.renderContent()])])])])}renderContent(){const e=this.$createElement;return e("div",{attrs:{"data-testid":`${this.dataTestId}-content`},class:j1("content",this.spinnerClass),style:this.sizingStyles,on:{click:Wu,scroll:this.computeScrollState},ref:"content"},[this.hasHeader&&e("div",{class:j1("header",{scrolled:this.hasScrolled})},[e("div",{class:"header-container"},[e("div",{class:j1("title",{big:this.bigTitle})},[this.title]),e("div",{class:"header-slot-container"},[this.$slots.header])]),this.closeButton&&e(j,{class:"cross",attrs:{size:32,type:j.Type.CLEAR},on:{click:this.onClickCross}})]),e("div",{class:"body"},[this.$slots.default]),this.hasSpinner&&e("div",{class:"spinner-container",attrs:{"data-testid":"modal-spinner"}},[e("div",{class:"spinner"})]),this.hasFooter()?e("div",{class:j1("footer",{scrolled:!this.hasScrolledToEnd})},[this.$slots.footer]):e("div",{class:"footer-accommodation"})])}get hasHeader(){return this.closeButton||!!this.title}hasFooter(){return!u5(this.$slots.footer)}get sizingStyles(){const e={minWidth:this.width,width:this.width};return this.minHeight!==null&&(e.minHeight=this.minHeight),e}get hasSpinner(){return this.hasOverlaySpinner||this.hasContentReplacingSpinner}get spinnerClass(){return j1({"overlay-spinner":this.hasOverlaySpinner,"content-replacing-spinner":this.hasContentReplacingSpinner})}get hasOverlaySpinner(){return this.spinner===L5.Spinner.OVERLAY}get hasContentReplacingSpinner(){return this.spinner===L5.Spinner.REPLACE_CONTENT}onOverlayClick(){this.fadeClose&&this.emitClose()}onClickCross(){this.closeButton&&this.emitClose()}onBodyKeyDown(e){this.escClose&&e.key===U5.ESC_KEY&&(e.stopImmediatePropagation(),this.emitClose())}emitClose(){this.hasSpinner||this.$emit(L5.EVENT_CLOSE)}computeScrollState(){const e=this.$refs.content;e&&(this.hasScrolled=e.scrollTop>0,this.hasScrolledToEnd=e.scrollTop+e.clientHeight===e.scrollHeight)}};N1.SLOT_HEADER="header",N1.SLOT_FOOTER="footer",v([y({type:Boolean,required:!1,default:!1}),f("design:type",Boolean)],N1.prototype,"simple",void 0),v([y({type:String,required:!1,default:null}),f("design:type",Object)],N1.prototype,"title",void 0),v([y({type:String,required:!1,default:"480px"}),f("design:type",String)],N1.prototype,"width",void 0),v([y({type:String,required:!1,default:""}),f("design:type",String)],N1.prototype,"className",void 0),v([y({type:String,required:!1,default:"120px"}),f("design:type",String)],N1.prototype,"minHeight",void 0),v([y({type:Boolean,required:!1,default:!0}),f("design:type",Boolean)],N1.prototype,"fadeClose",void 0),v([y({type:Boolean,required:!1,default:!1}),f("design:type",Boolean)],N1.prototype,"escClose",void 0),v([y({type:Boolean,required:!1,default:!1}),f("design:type",Boolean)],N1.prototype,"closeButton",void 0),v([y({type:String,required:!1,default:"hidden"}),f("design:type",String)],N1.prototype,"spinner",void 0),v([y({type:Boolean,required:!1,default:!1}),f("design:type",Boolean)],N1.prototype,"fullScreen",void 0),v([y({type:Boolean,required:!1,default:!1}),f("design:type",Boolean)],N1.prototype,"bigTitle",void 0),v([y({type:Boolean,required:!1,default:!1}),f("design:type",Boolean)],N1.prototype,"noFade",void 0),v([y({type:String,required:!1,default:()=>N1.Position.AUTO}),f("design:type",String)],N1.prototype,"position",void 0),v([y({type:Boolean,default:!1}),f("design:type",Boolean)],N1.prototype,"allowBackgroundInteraction",void 0),v([y({type:String,default:"modal"}),f("design:type",String)],N1.prototype,"dataTestId",void 0),v([zu(100),f("design:type",Function),f("design:paramtypes",[]),f("design:returntype",void 0)],N1.prototype,"computeScrollState",null),N1=L5=v([Z1({name:"Modal"})],N1),function(t){t.EVENT_CLOSE="close",function(e){e.HIDDEN="hidden",e.OVERLAY="overlay",e.REPLACE_CONTENT="replace-content"}(t.Spinner||(t.Spinner={})),function(e){e.AUTO="auto",e.TOP="top",e.BOTTOM="bottom"}(t.Position||(t.Position={}))}(N1||(N1={}));var s7,s2;(function(t){t.SUCCESS="success",t.WARNING="warning",t.DANGER="danger",t.INFO="info"})(s2||(s2={}));let X1=s7=class extends l1{created(){(!this.showClose||this.hasTimeoutAndClose)&&(this.timeoutInternal=window.setTimeout(this.close,this.timeout))}beforeDestroy(){clearTimeout(this.timeoutInternal)}render(){const e=arguments[0];return e(N1,{attrs:{simple:!0,alignTop:!0,escClose:!0,noFade:!0,fadeClose:this.fadeClose,position:this.position,className:this.className},on:{close:this.close}},[e(le,{class:"lp-toast",attrs:{type:this.type,text:this.text,showClose:this.showClose,isToast:!0},on:{close:this.handleInfoClose}},[this.$slots.default])])}close(){this.$emit(s7.EVENT_CLOSE)}handleInfoClose(){this.close()}};v([y({type:String,required:!1,default:""}),f("design:type",String)],X1.prototype,"text",void 0),v([y({type:String,required:!1,default:s2.SUCCESS,validator:t=>ye(s2).indexOf(t)!==-1}),f("design:type",String)],X1.prototype,"type",void 0),v([y({type:Boolean,required:!1,default:!1}),f("design:type",Boolean)],X1.prototype,"showClose",void 0),v([y({type:String,required:!1,default:()=>X1.Position.TOP}),f("design:type",String)],X1.prototype,"position",void 0),v([y({type:String,default:""}),f("design:type",String)],X1.prototype,"className",void 0),v([y({type:Number,default:()=>X1.ToastOpenedTimeout}),f("design:type",Number)],X1.prototype,"timeout",void 0),v([y({type:Boolean,default:!0}),f("design:type",Boolean)],X1.prototype,"fadeClose",void 0),v([y({type:Boolean,default:!1}),f("design:type",Boolean)],X1.prototype,"hasTimeoutAndClose",void 0),X1=s7=v([Z1({name:"Toast"})],X1),function(t){t.EVENT_CLOSE="close",t.Type=s2,t.ToastOpenedTimeout=5e3,function(e){e.AUTO="auto",e.TOP="top",e.BOTTOM="bottom"}(t.Position||(t.Position={}))}(X1||(X1={}));let p3=class extends l1{render(){const e=arguments[0];return e(C0,{class:"lp-portal-target",attrs:{name:this.name||W2.TARGET_A,multiple:!0}})}};v([y({type:String,required:!1,default:""}),f("design:type",String)],p3.prototype,"name",void 0),p3=v([Z1({name:"StargateTarget"})],p3);var Yt;let De=Yt=class extends l1{constructor(){super(...arguments),Object.defineProperty(this,"title",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"windowState",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"allowMinimize",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"allowMaximize",{enumerable:!0,configurable:!0,writable:!0,value:void 0})}render(){const e=arguments[0];return e("div",{class:"ct-widget-header",on:{click:this.handleHeaderClick}},[e("div",{class:"ct-header-logo"},[e(q1,{class:"ct-logo-button",attrs:{iconSize:20,icon:j.Type.ASK_AI,appearance:K.Appearance.LIGHTEN,color:K.Color.PRIMARY}})]),e("div",{class:"ct-header-title"},[this.title]),e("div",{class:"ct-window-controls"},[this.allowMaximize&&this.renderMaximizeButton(),this.renderCloseButton()])])}renderMaximizeButton(){const e=this.$createElement;return e(j,{class:"ct-win-btn ct-maximize-btn",attrs:{type:this.windowState==="maximized"?j.Type.MINIMIZE:j.Type.MAXIMIZE,size:Yt.MAXIMIZE_ICON_SIZE,clickable:!0,stopPropagation:!0},on:{click:this.handleMaximize}})}renderCloseButton(){const e=this.$createElement;return e(j,{class:"ct-win-btn ct-close-btn",attrs:{clickable:!0,stopPropagation:!0,type:j.Type.CLOSE,size:Yt.CLOSE_ICON_SIZE},on:{click:this.handleClose}})}handleHeaderClick(){this.$emit(Yt.Event.HEADER_CLICK)}handleMaximize(){this.$emit(Yt.Event.MAXIMIZE)}handleClose(){this.$emit(Yt.Event.CLOSE)}};Object.defineProperty(De,"CLOSE_ICON_SIZE",{enumerable:!0,configurable:!0,writable:!0,value:20}),Object.defineProperty(De,"MAXIMIZE_ICON_SIZE",{enumerable:!0,configurable:!0,writable:!0,value:14}),v([y({type:String,required:!0}),f("design:type",String)],De.prototype,"title",void 0),v([y({type:String,default:"normal"}),f("design:type",Object)],De.prototype,"windowState",void 0),v([y({type:Boolean,default:!0}),f("design:type",Boolean)],De.prototype,"allowMinimize",void 0),v([y({type:Boolean,default:!0}),f("design:type",Boolean)],De.prototype,"allowMaximize",void 0),De=Yt=v([Z1({name:"WidgetHeader"})],De),function(t){(function(e){e.MINIMIZE="minimize",e.MAXIMIZE="maximize",e.CLOSE="close",e.HEADER_CLICK="headerClick"})(t.Event||(t.Event={}))}(De||(De={}));var f8;F1.Widget=class extends l1{constructor(){super(...arguments),Object.defineProperty(this,"config",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"debug",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"chatThreadRef",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"widgetRuntime",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"isOpen",{enumerable:!0,configurable:!0,writable:!0,value:!1}),Object.defineProperty(this,"windowState",{enumerable:!0,configurable:!0,writable:!0,value:"normal"}),Object.defineProperty(this,"isInitializing",{enumerable:!0,configurable:!0,writable:!0,value:!0}),Object.defineProperty(this,"initializationError",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"toastMessage",{enumerable:!0,configurable:!0,writable:!0,value:""}),Object.defineProperty(this,"showToast",{enumerable:!0,configurable:!0,writable:!0,value:!1}),Object.defineProperty(this,"scrollPosition",{enumerable:!0,configurable:!0,writable:!0,value:0})}get runtime(){return this.widgetRuntime}get positionClass(){return`ct-pos-${this.config.position}`}logDebug(e,n,r="log"){(this.debug||r==="error"||r==="warn")&&console[r](`[Widget] ${e}`,n!==void 0?n:"")}async created(){try{if(this.logDebug("Initializing Widget"),this.widgetRuntime=new m_(this.config),this.setupRuntimeCallbacks(),!await this.widgetRuntime.initialize())throw new Error("Failed to initialize widget runtime");this.isInitializing=!1,this.logDebug("Widget initialized successfully")}catch(e){this.isInitializing=!1,this.initializationError=`Error initializing widget: ${e.message||"Unknown error"}`,this.logDebug("Failed to initialize Widget:",e,"error")}}mounted(){document.documentElement.style.setProperty("--ct-primary",this.config.color),document.documentElement.style.setProperty("--ct-primary-hover",this.config.colorHover),document.addEventListener("keydown",this.handleKeyDown)}beforeDestroy(){document.removeEventListener("keydown",this.handleKeyDown),this.isOpen&&this.unlockBodyScroll(),this.widgetRuntime?.destroy?.()}render(){const e=arguments[0];return e("div",{class:"ct-widget-container"},[this.renderLauncher(),this.renderModal(),this.renderToast(),e(p3)])}renderLauncher(){const e=this.$createElement;return e(K,{attrs:{id:"ct-launcher",text:"Ask",iconSize:20,prefixIcon:j.Type.ASK_AI,appearance:K.Appearance.LIGHTEN,color:K.Color.PRIMARY},class:"ct-widget-launcher",on:{click:this.open}})}renderModal(){const e=this.$createElement,n=["ct-widget-root",this.positionClass,{"ct-visible":this.isOpen,"ct-maximized":this.windowState==="maximized","ct-minimized":this.windowState==="minimized"}];return e("div",{class:n,attrs:{"aria-hidden":this.isOpen?"false":"true"}},[e("div",{class:"ct-widget-overlay",on:{click:this.handleOverlayClick}}),e("div",{class:"ct-widget-modal"},[this.renderModalContent()])])}renderModalContent(){return this.isInitializing?this.renderLoadingState():this.initializationError?this.renderErrorState():this.renderChatInterface()}renderLoadingState(){const e=this.$createElement;return e("div",{class:"ct-widget-loading"},[e(j,{attrs:{type:j.Type.ASK_AI,size:40}}),e("span",{class:"ct-loading-text"},["Initializing..."])])}renderErrorState(){const e=this.$createElement;return e("div",{class:"ct-widget-error"},[e(j,{attrs:{type:j.Type.ALERT,size:40}}),e("span",{class:"ct-error-text"},[this.initializationError]),e(K,{attrs:{text:"Retry",appearance:K.Appearance.OUTLINE,color:K.Color.PRIMARY},on:{click:this.retryInitialization}})])}renderChatInterface(){const e=this.$createElement;return this.widgetRuntime?e(Mt,{attrs:{runtime:this.widgetRuntime,height:"100%",width:"100%"}},[e("template",{slot:"header"},[e(De,{attrs:{title:this.config.name,windowState:this.windowState,allowMinimize:this.config.allowMinimize,allowMaximize:this.config.allowMaximize},on:{minimize:this.minimize,maximize:this.maximize,close:this.close,headerClick:this.handleHeaderClick}})]),e("div",{class:"ct-chat-interface"},[e(Y1,{ref:"chatThread",attrs:{projectName:this.config.name,enableVoice:this.config.enableVoice},on:{copy:this.handleCopy}})])]):this.renderLoadingState()}renderToast(){const e=this.$createElement;return this.showToast?e(X1,{attrs:{text:this.toastMessage,type:X1.Type.DANGER,position:X1.Position.TOP,showClose:!0},on:{close:this.handleToastClose}}):null}onRuntimeChange(){this.widgetRuntime&&this.setupRuntimeCallbacks()}handleKeyDown(e){e.key==="Escape"&&this.isOpen&&this.close()}open(){this.isOpen=!0,this.lockBodyScroll()}close(){this.isOpen=!1,this.windowState="normal",this.unlockBodyScroll(),this.widgetRuntime?.stopListening?.(),this.widgetRuntime?.stopSpeaking?.()}lockBodyScroll(){this.scrollPosition=window.pageYOffset||document.documentElement.scrollTop,document.body.classList.add("ct-widget-open"),document.body.style.top=`-${this.scrollPosition}px`}unlockBodyScroll(){document.body.classList.remove("ct-widget-open"),document.body.style.top="",window.scrollTo(0,this.scrollPosition)}minimize(){this.windowState=this.windowState==="minimized"?"normal":"minimized"}maximize(){this.windowState=this.windowState==="maximized"?"normal":"maximized"}restore(){this.windowState="normal"}async retryInitialization(){this.isInitializing=!0,this.initializationError=null;try{if(this.widgetRuntime&&!await this.widgetRuntime.initialize())throw new Error("Failed to initialize widget runtime");this.isInitializing=!1}catch(e){this.isInitializing=!1,this.initializationError=`Error initializing widget: ${e.message||"Unknown error"}`}}handleCopy(){this.logDebug("Copy action triggered")}handleOverlayClick(){this.close()}handleHeaderClick(){this.windowState==="minimized"&&this.restore()}displayToast(e){this.toastMessage=e,this.showToast=!0}handleToastClose(){this.showToast=!1,this.toastMessage=""}setupRuntimeCallbacks(){this.widgetRuntime&&(this.widgetRuntime.setOnStateChange(e=>{this.logDebug("Runtime state changed:",e),this.$forceUpdate()}),this.widgetRuntime.setOnVoiceState((e,n)=>{this.chatThreadRef?.setVoiceState(e,n)}),this.widgetRuntime.setOnError(e=>{this.logDebug("Runtime error:",e,"error"),this.displayToast(e)}),this.widgetRuntime.setOnStreaming(e=>{this.logDebug("Streaming event:",e)}))}},v([y({type:Object,required:!0}),f("design:type",Object)],F1.Widget.prototype,"config",void 0),v([y({type:Boolean,default:!1}),f("design:type",Boolean)],F1.Widget.prototype,"debug",void 0),v([hn("chatThread"),f("design:type",typeof(f8=typeof Y1<"u"&&Y1)=="function"?f8:Object)],F1.Widget.prototype,"chatThreadRef",void 0),v([ds("widgetRuntime"),f("design:type",Object),f("design:paramtypes",[])],F1.Widget.prototype,"runtime",null),v([ge("widgetRuntime",{immediate:!0}),f("design:type",Function),f("design:paramtypes",[]),f("design:returntype",void 0)],F1.Widget.prototype,"onRuntimeChange",null),F1.Widget=v([Z1({name:"Widget",components:{ChatThread:Y1,ChatRuntimeProvider:Mt,WidgetHeader:De}})],F1.Widget);function h8(){try{const t=new Fn,e=document.createElement("div");e.id="ask-ai-root",document.body.appendChild(e),new l1({render:n=>n(F1.Widget,{props:{config:t}})}).$mount("#ask-ai-root")}catch{}}return document.readyState==="loading"?document.addEventListener("DOMContentLoaded",h8):h8(),window.AskAIWidget={Widget:F1.Widget,WidgetConfig:Fn},F1.WidgetConfig=Fn,Object.defineProperty(F1,Symbol.toStringTag,{value:"Module"}),F1}({});