@bangdb/web-sdk 1.0.7 → 1.0.8

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/index.mjs CHANGED
@@ -1,4 +1,4 @@
1
- var B=`
1
+ var Y=`
2
2
  :root {
3
3
  --thread-content-max-width: 32rem;
4
4
  }
@@ -583,7 +583,7 @@ code.hljs {
583
583
  .hljs-strong {
584
584
  font-weight: bold
585
585
  }
586
- }`;var P=`
586
+ }`;var W=`
587
587
  :root {
588
588
  --border-xheavy: var(--border);
589
589
  }
@@ -1046,10 +1046,10 @@ code.hljs {
1046
1046
  .prose > :last-child:not(.not-prose *) {
1047
1047
  margin-bottom: 0;
1048
1048
  }
1049
- `;import{configureStore as Se}from"@reduxjs/toolkit";import{createSlice as xe}from"@reduxjs/toolkit";var ke={activeIndex:"",activeSession:"",sessions:[],useGenAi:!1,mode:0,tools:[]},_=xe({name:"chat",initialState:ke,reducers:{changeMode:(n,e)=>{n.mode=e.payload},setActiveIndex:(n,e)=>{n.activeIndex=e.payload},setActiveSession:(n,e)=>{n.activeSession=e.payload},setSessions:(n,e)=>{n.sessions=e.payload},setUseGenAi:(n,e)=>{n.useGenAi=e.payload},addTool:(n,e)=>{n.tools.some(t=>t.id===e.payload.id)||n.tools.push(e.payload)},removeTool:(n,e)=>{n.tools=n.tools.filter(t=>t.id!==e.payload)}}}),{setActiveIndex:F,setActiveSession:U,setSessions:gt,setUseGenAi:ut,changeMode:j,addTool:K,removeTool:$}=_.actions,G=_.reducer;import{createAsyncThunk as Y,createSlice as Ce}from"@reduxjs/toolkit";var C=class{constructor(e){this.rawResponse=e}detectModelVersion(){let e=this.extractOutput();return!e||e.length===0||!Array.isArray(e)?"unknown":e?.[0]?.content||e?.[1]?.content?"gpt5":e[0]?.message?"gpt4":e?.some(t=>t?.text)?"file-chat":"unknown"}extractOutput(){let e=this.rawResponse;return e?.choices||e?.a?.choices||e?.output||e?.a?.output||e?.content||e?.a?.content||[]}normalizeGPT4Choice(e){return{output:e?.message?.content||""}}normalizeFileChatResponse(e){return{output:e?.text?.value}}normalizeGPT5Output(e){return{output:e.content.map(t=>t.text).join(`
1049
+ `;import{configureStore as Ie}from"@reduxjs/toolkit";import{createSlice as Le}from"@reduxjs/toolkit";var je={activeIndex:"",activeSession:"",sessions:[],useGenAi:!1,mode:0,tools:[]},J=Le({name:"chat",initialState:je,reducers:{changeMode:(n,e)=>{n.mode=e.payload},setActiveIndex:(n,e)=>{n.activeIndex=e.payload},setActiveSession:(n,e)=>{n.activeSession=e.payload},setSessions:(n,e)=>{n.sessions=e.payload},setUseGenAi:(n,e)=>{n.useGenAi=e.payload},addTool:(n,e)=>{n.tools.some(t=>t.id===e.payload.id)||n.tools.push(e.payload)},removeTool:(n,e)=>{n.tools=n.tools.filter(t=>t.id!==e.payload)}}}),{setActiveIndex:V,setActiveSession:X,setSessions:St,setUseGenAi:Lt,changeMode:z,addTool:Q,removeTool:P}=J.actions,Z=J.reducer;import{createAsyncThunk as re,createSlice as Me}from"@reduxjs/toolkit";var S=class{constructor(e){this.rawResponse=e}detectModelVersion(){let e=this.extractOutput();return!e||e.length===0||!Array.isArray(e)?"unknown":e?.[0]?.content||e?.[1]?.content?"gpt5":e[0]?.message?"gpt4":e?.some(t=>t?.text)?"file-chat":"unknown"}extractOutput(){let e=this.rawResponse;return e?.choices||e?.a?.choices||e?.output||e?.a?.output||e?.content||e?.a?.content||[]}normalizeGPT4Choice(e){return{output:e?.message?.content||""}}normalizeFileChatResponse(e){return{output:e?.text?.value}}normalizeGPT5Output(e){return{output:e.content.map(t=>t.text).join(`
1050
1050
 
1051
- `)}}parse(){let e=this.extractOutput(),t=this.detectModelVersion(),o=[];return t==="gpt4"?o=e?.filter(({message:r})=>r?.content).map(r=>this.normalizeGPT4Choice(r)):t==="gpt5"?o=e?.filter(r=>r?.content?.length>0).map(r=>this.normalizeGPT5Output(r)):t==="file-chat"&&(o=e?.filter(({text:r})=>r)?.map(r=>this.normalizeFileChatResponse(r))),{messages:o,model:t,raw:this.rawResponse}}};var V=async({baseURL:n,payload:e,apikey:t})=>{try{return await(await fetch("https://"+n+"/ai/vector/chat",{method:"POST",body:JSON.stringify(e),headers:{"x-bang-api-key":t,"x-bang-api-src":"chat-applet"}})).json()}catch{return{error:"Failed to get the response"}}},R=async({baseURL:n,payload:e,apikey:t})=>{try{return await(await fetch("https://"+n+"/ai/vector/metadata",{method:"POST",body:JSON.stringify(e),headers:{"x-bang-api-key":t,"x-bang-api-src":"chat-applet"}})).json()}catch(o){console.error(o)}};var Te={},A={query:"",chatData:[],streamingMessage:null,isLoading:!1},Q=Ce({name:"chatSession",initialState:Te,reducers:{initSession:(n,e)=>{let t=e.payload;n[t]||(n[t]=A)},setLoading:(n,e)=>{let{sessionId:t,loading:o}=e.payload;n[t]||(n[t]=A),n[t].isLoading=o},setQuery:(n,e)=>{let{sessionId:t,query:o}=e.payload;n[t]||(n[t]=A),n[t].query=o},appendChatData:(n,e)=>{let{sessionId:t,chatData:o}=e.payload;n[t]||(n[t]=A),n[t].chatData=[...n[t].chatData||[],...o]},setChatData:(n,e)=>{let{sessionId:t,chatData:o}=e.payload;n[t]||(n[t]=A),n[t].chatData=o},setStreamingMessage:(n,e)=>{let{sessionId:t,message:o}=e.payload;n[t]&&(n[t].streamingMessage=o)}}}),{initSession:Ee,setQuery:H,setChatData:Lt,appendChatData:W,setStreamingMessage:D,setLoading:J}=Q.actions,X=Y("chatSession/streamResponse",async({sessionId:n,query:e,indexName:t,config:{backendURL:o,apikey:r,userid:a}},{getState:s,dispatch:i})=>{let c=s(),{chatData:d,isLoading:l}=c.chatSessions[n];if(!e?.trim()||l)return;i(J({sessionId:n,loading:!0}));let p={query:e,a:{choices:[]}};i(D({sessionId:n,message:p})),i(H({sessionId:n,query:""}));let m=d?.filter(g=>g&&g?.op!=="ADD_FILES"&&!g?.source_file&&!g?.source)?.length,h=Array.isArray(d)?d?.map(g=>{let{messages:S}=new C(g).parse(),k=S?.map(L=>L?.output)?.filter(Boolean)?.join(`
1052
- `);return!g?.query||!k||k.startsWith("Error: ")?null:{q:g?.query,a:k}})?.filter(g=>g!==null):[],{tools:b}=c.chat,u=b?.[0],f=u?.id==="feeling-lucky"?"GenAI":void 0,v=u?.id==="kpi",w=await V({baseURL:o,apikey:r,payload:{name:t,qnum:m?m+1:1,fall_back:f,type:v?"kpi":void 0,sessionid:n,userid:a,prev_qa:v?void 0:h,query:p?.query}}),E=new C(w),{raw:x,messages:T}=E.parse();if(i(J({sessionId:n,loading:!1})),T?.length>0){for(let g=0;g<T.length;g++){let k=(T[g]?.output||"")?.split(" "),L="";for(let M=0;M<k.length;M++)await new Promise(we=>setTimeout(we,20)),L=L+(L?" ":"")+k[M],i(D({sessionId:n,message:{...p,a:{choices:[{message:{content:L}}]}}}))}i(W({sessionId:n,chatData:[{...x,query:p?.query}]})),i(D({sessionId:n,message:null}))}else i(W({sessionId:n,chatData:[{query:p?.query,a:{choices:[{message:{content:x?.a?.choices?.[0]?.message?.content||x?.error||"There is no context in the vector index and fall back option is null"}}]}}]}))}),Z=Y("chatSession/initializeState",async({indexName:n},{dispatch:e})=>{let t="GUEST_SESSION";e(F(n)),e(U(t)),e(Ee(t))});var ee=Q.reducer;var te=Se({reducer:{chat:G,chatSessions:ee}});import ne from"highlight.js";import ze from"markdown-it";import qe from"@vscode/markdown-it-katex";var Le=function(n,e,t){let o=t,r=0,a=n.length;for(;o<e.length;){let s=e[o];if(r<=0&&e.slice(o,o+a)===n)return o;s==="\\"?o++:s==="{"?r++:s==="}"&&r--,o++}return-1},je=function(n){return n.replace(/[-/\\^$*+?.()|[\]{}]/g,"\\$&")},Me=/^\\begin{/,Ae=function(n,e){let t,o=[],r=new RegExp("("+e.map(a=>je(a.left)).join("|")+")");for(;t=n.search(r),t!==-1;){t>0&&(o.push({type:"text",data:n.slice(0,t)}),n=n.slice(t));let a=e.findIndex(c=>n.startsWith(c.left));if(t=Le(e[a].right,n,e[a].left.length),t===-1)break;let s=n.slice(0,t+e[a].right.length),i=Me.test(s)?s:n.slice(e[a].left.length,t);o.push({type:"math",data:i,rawData:s,display:e[a].display}),n=n.slice(t+e[a].right.length)}return n!==""&&o.push({type:"text",data:n}),o},oe=Ae;import"katex/dist/contrib/mhchem.min.js";function re(n){return new Promise(e=>{setTimeout(e,n)})}import{debounce as He}from"lodash";var ae=new ze({html:!0,breaks:!0,linkify:!0,highlight:function(n,e){let t=e??"auto";if(e&&ne.getLanguage(e))try{return`<pre class="language-${e}"><div class="ai-chat-code-title">${e}<a class="ai-chat-code-copy cursor-pointer">Copy</a></div><code class="hljs">`+ne.highlight(n,{language:t,ignoreIllegals:!0}).value+"</code></pre>"}catch{}return'<pre><code class="hljs">'+n+"</code></pre>"}}).enable(["table","code","fence","blockquote","heading","lheading","paragraph"]).enable(["autolink","linkify","backticks","image","link","newline"]).enable(["emphasis","html_inline"]).use(qe);typeof window<"u"&&window.document.addEventListener("click",n=>{if(n.target?.classList?.contains("ai-chat-code-copy")){let e=n.target.parentNode?.nextSibling?.innerText;navigator.clipboard.writeText(e).then(async()=>{n.target.innerHTML='<span style="margin-right:3px">Copied</span>\u2705',await re(3e3),n.target.innerText="Copy"}).catch(t=>{alert(`Error copying code: ${t.message}`)})}});var Ie={fn:n=>{n()}},Gt=He((n=()=>{})=>{Ie.fn(n)},10);var Oe=n=>n.replace(/(```mermaid)(?![^]*?```)/g,"```"),$e=n=>oe(n,[{left:"\\[",right:"\\]",display:!0},{left:"\\(",right:"\\)",display:!1}]).reduce((t,o)=>{if(o.type==="text")return t+o.data;let r=o.display?`$$${o.data}$$`:`$${o.data}$`;return t+r},""),Re=n=>{let e="",t="",o=!1,r="think-wrapper",a=s=>{let i=s.replace(/<script([^>]*)>/gi,"&lt;script$1&gt;");return i=i.replace(/<\/script>/gi,"&lt;/script&gt;"),i=i.replace(/<script([^>]*)\s*\/>/gi,"&lt;script$1 /&gt;"),i};for(let s=0;s<n.length;s++){let i=n[s],c=n.slice(s,s+7),d=n.slice(s,s+8);if(!o&&c==="<think>"){o=!0,e+=`<div class="${r}">`,s+=6;continue}if(o&&d==="</think>"){o=!1,e+="</div>",s+=7;continue}o?t+=i:e+=i}if(t){let s=a(t),i=ae.render(s);e=e.replace(`<div class="${r}">`,`<div class="${r}">${i}`)}return e},De=n=>n.replace(/\[source_id:\s*([^\]|]+)(?:\s*\|\s*category:\s*([^\]]+))?\]\.?/g,(e,t,o)=>o?`<source-tag data-source-id="${t.trim()}" data-category="${o.trim()}"></source-tag>`:`<source-tag data-source-id="${t.trim()}"></source-tag>`),z=n=>{let e=Re(n),t=$e(e),o=Oe(t),r=De(o);return ae.render(r)};import*as le from"echarts";import"echarts/theme/dark-bold.js";import{createGrid as Pe,ModuleRegistry as _e,AllCommunityModule as Fe,themeQuartz as Ue,colorSchemeVariable as Ke}from"ag-grid-community";function ie(n,e="",t={}){if(typeof n!="object"||n===null||Array.isArray(n))return t;for(let[o,r]of Object.entries(n)){let a=e?`${e}.${o}`:o;typeof r=="object"&&r!==null&&!Array.isArray(r)?ie(r,a,t):t[a]=r}return t}var Ne=["#5470c6","#c5e542","#9d9ec1","#ee6666","#73c0de","#3ba272","#fc8452","#9a60b4","#ea7ccc"],Be={color:Ne,backgroundColor:"transparent",tooltip:{trigger:"axis",axisPointer:{type:"shadow"}},legend:{show:!0,type:"scroll",bottom:0,top:null},toolbox:{show:!0,feature:{saveAsImage:{}}}},I=class{constructor(e){this.data=e}parse(){let e=[];if(!this.data)return{charts:[],errors:["Invalid input: null or undefined"]};if(typeof this.data!="object")return{charts:[],errors:[`Invalid input type: expected object, got ${typeof this.data}`]};let t=this.extractArrays(this.data,[]),o=Object.entries(this.data).filter(([,a])=>typeof a=="number"&&!Number.isNaN(a)).map(([a,s])=>({title:a,type:"card",options:{title:a,value:s}}));if(t.length===0&&o.length===0)return{charts:[],errors:["No valid categorical data found"]};let r=[...o];for(let{title:a,items:s}of t){if(s.length===0){e.push(`"${a}": Array is empty \u2014 skipped`);continue}let i=s.map(d=>ie(d)).filter(d=>typeof d=="object"&&d!==null&&!Array.isArray(d)),c=this.detectChartStructure(i);if(c){let d=this.convertToChartData(i,c);if(d.length===0){e.push(`"${a}": No valid rows after conversion \u2014 skipped`);continue}let l=this.isSimpleCategoricalPie(d)?"pie":"bar";r.push({title:a,type:l,options:{...Be,...this.toChartSeries(d,l)}})}else r.push({title:a,type:"table",options:{columns:Array.from(new Set(i.flatMap(d=>Object.keys(d)))),rows:i}})}return e.length>0?{charts:r,errors:e}:{charts:r}}extractArrays(e,t){if(Array.isArray(e)){let o=e.flatMap((a,s)=>Array.isArray(a)?[]:[a]),r=e.flatMap((a,s)=>Array.isArray(a)?this.extractArrays(a,[...t,`[${s}]`]):[]);return[...o.length?[{title:t.length?t.join("."):"Root Data",items:o}]:[],...r]}return e&&typeof e=="object"?Object.entries(e).flatMap(([o,r])=>this.extractArrays(r,[...t,o])):[]}detectChartStructure(e){if(e.length===0)return null;let t=new Set;for(let s of e)for(let i of Object.keys(s))t.add(i);let o=Array.from(t),r=o.filter(s=>typeof e[0]?.[s]=="string"),a=o.filter(s=>typeof e[0]?.[s]=="number");return a.length===0||r.length>1?null:{labelKey:r[0]??"__auto__",valueKeys:a}}isSimpleCategoricalPie(e){return e.length?e.every(t=>t.values.length===1):!1}convertToChartData(e,t){return e.map((o,r)=>{let a=t.labelKey==="__auto__"?null:o[t.labelKey];return{labelValue:a!=null?String(a):`Item ${r+1}`,labelKey:t.labelKey,values:t.valueKeys.map(i=>({[i]:Number(o[i])||0}))}})}toChartSeries(e,t){if(t==="bar"){let r={};return e.forEach((a,s)=>{a.values.forEach(i=>{let[c,d]=Object.entries(i)[0];r[c]||(r[c]=new Array(e.length).fill(0)),r[c][s]=d})}),{xAxis:{type:"category",data:e.map(a=>a.labelValue).filter(Boolean)},yAxis:{type:"value"},series:Object.entries(r).map(([a,s])=>({name:a,type:"bar",stack:"total",data:s}))}}let o=Object.keys(e[0]?.values?.[0]??{})[0]??"value";return{tooltip:{trigger:"item"},series:[{name:"Data",type:"pie",radius:["40%","70%"],label:{show:!1},labelLine:{show:!1},avoidLabelOverlap:!1,data:e.map(r=>({name:r.labelValue,value:r.values[0]?.[o]??0}))}]}}};var se=!1;function Ge(){se||(_e.registerModules([Fe]),se=!0)}var Ve=Ue.withPart(Ke).withParams({fontFamily:"var(--font-body)",headerFontFamily:"var(--font-body)",borderColor:"var(--border)",backgroundColor:"var(--background)",foregroundColor:"var(--foreground)",headerTextColor:"var(--foreground)",headerBackgroundColor:"var(--card)",rowVerticalPaddingScale:1.4,headerColumnResizeHandleColor:"var(--secondary)",wrapperBorderRadius:2});function We(n){if(typeof n!="string")return!1;try{return JSON.parse(n),!0}catch{return!1}}function Je(n,e){return n<=1||e==="table"?1:e==="card"?Math.min(n,4):2}function Ye(n,e){return e===1||n==="table"?"1 / -1":"span 1"}function Qe(n){let e=document.createElement("div");e.style.cssText=`
1051
+ `)}}parse(){let e=this.extractOutput(),t=this.detectModelVersion(),o=[];return t==="gpt4"?o=e?.filter(({message:r})=>r?.content).map(r=>this.normalizeGPT4Choice(r)):t==="gpt5"?o=e?.filter(r=>r?.content?.length>0).map(r=>this.normalizeGPT5Output(r)):t==="file-chat"&&(o=e?.filter(({text:r})=>r)?.map(r=>this.normalizeFileChatResponse(r))),{messages:o,model:t,raw:this.rawResponse}}};var ee=async({baseURL:n,payload:e,apikey:t})=>{try{return await(await fetch("https://"+n+"/ai/vector/chat",{method:"POST",body:JSON.stringify(e),headers:{"x-bang-api-key":t,"x-bang-api-src":"chat-applet"}})).json()}catch{return{error:"Failed to get the response"}}},_=async({baseURL:n,payload:e,apikey:t})=>{try{return await(await fetch("https://"+n+"/ai/vector/metadata",{method:"POST",body:JSON.stringify(e),headers:{"x-bang-api-key":t,"x-bang-api-src":"chat-applet"}})).json()}catch(o){console.error(o)}};var ze={},q={query:"",chatData:[],streamingMessage:null,isLoading:!1},ne=Me({name:"chatSession",initialState:ze,reducers:{initSession:(n,e)=>{let t=e.payload;n[t]||(n[t]=q)},setLoading:(n,e)=>{let{sessionId:t,loading:o}=e.payload;n[t]||(n[t]=q),n[t].isLoading=o},setQuery:(n,e)=>{let{sessionId:t,query:o}=e.payload;n[t]||(n[t]=q),n[t].query=o},appendChatData:(n,e)=>{let{sessionId:t,chatData:o}=e.payload;n[t]||(n[t]=q),n[t].chatData=[...n[t].chatData||[],...o]},setChatData:(n,e)=>{let{sessionId:t,chatData:o}=e.payload;n[t]||(n[t]=q),n[t].chatData=o},setStreamingMessage:(n,e)=>{let{sessionId:t,message:o}=e.payload;n[t]&&(n[t].streamingMessage=o)}}}),{initSession:Ae,setQuery:N,setChatData:Nt,appendChatData:te,setStreamingMessage:F,setLoading:oe}=ne.actions,ae=re("chatSession/streamResponse",async({sessionId:n,query:e,indexName:t,config:{backendURL:o,apikey:r,userid:a}},{getState:s,dispatch:i})=>{let c=s(),{chatData:p,isLoading:d}=c.chatSessions[n];if(!e?.trim()||d)return;i(oe({sessionId:n,loading:!0}));let l={query:e,a:{choices:[]}};i(F({sessionId:n,message:l})),i(N({sessionId:n,query:""}));let g=p?.filter(x=>x&&x?.op!=="ADD_FILES"&&!x?.source_file&&!x?.source)?.length,h=Array.isArray(p)?p?.map(x=>{let{messages:E}=new S(x).parse(),L=E?.map(j=>j?.output)?.filter(Boolean)?.join(`
1052
+ `);return!x?.query||!L||L.startsWith("Error: ")?null:{q:x?.query,a:L}})?.filter(x=>x!==null):[],{tools:b}=c.chat,m=b?.[0],u=m?.id==="feeling-lucky"?"GenAI":void 0,y=m?.id==="kpi",w=Date.now(),k=await ee({baseURL:o,apikey:r,payload:{name:t,qnum:g?g+1:1,fall_back:u,type:y?"kpi":void 0,sessionid:n,userid:a,prev_qa:y?void 0:h,query:l?.query}}),v=new S(k),{raw:C,messages:f}=v.parse();if(i(oe({sessionId:n,loading:!1})),f?.length>0){for(let x=0;x<f.length;x++){let L=(f[x]?.output||"")?.split(" "),j="";for(let M=0;M<L.length;M++)await new Promise(I=>setTimeout(I,20)),j=j+(j?" ":"")+L[M],i(F({sessionId:n,message:{...l,a:{choices:[{message:{content:j}}]}}}))}i(te({sessionId:n,chatData:[{...C,query:l?.query,queryTime:Date.now()-w}]})),i(F({sessionId:n,message:null}))}else i(te({sessionId:n,chatData:[{query:l?.query,queryTime:Date.now()-w,a:{choices:[{message:{content:C?.a?.choices?.[0]?.message?.content||C?.error||"There is no context in the vector index and fall back option is null"}}]}}]}))}),ie=re("chatSession/initializeState",async({indexName:n},{dispatch:e})=>{let t="GUEST_SESSION";e(V(n)),e(X(t)),e(Ae(t))});var se=ne.reducer;var le=Ie({reducer:{chat:Z,chatSessions:se}});import pe from"highlight.js";import $e from"markdown-it";import Ne from"@vscode/markdown-it-katex";var qe=function(n,e,t){let o=t,r=0,a=n.length;for(;o<e.length;){let s=e[o];if(r<=0&&e.slice(o,o+a)===n)return o;s==="\\"?o++:s==="{"?r++:s==="}"&&r--,o++}return-1},He=function(n){return n.replace(/[-/\\^$*+?.()|[\]{}]/g,"\\$&")},Oe=/^\\begin{/,De=function(n,e){let t,o=[],r=new RegExp("("+e.map(a=>He(a.left)).join("|")+")");for(;t=n.search(r),t!==-1;){t>0&&(o.push({type:"text",data:n.slice(0,t)}),n=n.slice(t));let a=e.findIndex(c=>n.startsWith(c.left));if(t=qe(e[a].right,n,e[a].left.length),t===-1)break;let s=n.slice(0,t+e[a].right.length),i=Oe.test(s)?s:n.slice(e[a].left.length,t);o.push({type:"math",data:i,rawData:s,display:e[a].display}),n=n.slice(t+e[a].right.length)}return n!==""&&o.push({type:"text",data:n}),o},de=De;import"katex/dist/contrib/mhchem.min.js";function ce(n){return new Promise(e=>{setTimeout(e,n)})}import{debounce as Re}from"lodash";var he=new $e({html:!0,breaks:!0,linkify:!0,highlight:function(n,e){let t=e??"auto";if(e&&pe.getLanguage(e))try{return`<pre class="language-${e}"><div class="ai-chat-code-title">${e}<a class="ai-chat-code-copy cursor-pointer">Copy</a></div><code class="hljs">`+pe.highlight(n,{language:t,ignoreIllegals:!0}).value+"</code></pre>"}catch{}return'<pre><code class="hljs">'+n+"</code></pre>"}}).enable(["table","code","fence","blockquote","heading","lheading","paragraph"]).enable(["autolink","linkify","backticks","image","link","newline"]).enable(["emphasis","html_inline"]).use(Ne);typeof window<"u"&&window.document.addEventListener("click",n=>{if(n.target?.classList?.contains("ai-chat-code-copy")){let e=n.target.parentNode?.nextSibling?.innerText;navigator.clipboard.writeText(e).then(async()=>{n.target.innerHTML='<span style="margin-right:3px">Copied</span>\u2705',await ce(3e3),n.target.innerText="Copy"}).catch(t=>{alert(`Error copying code: ${t.message}`)})}});var Be={fn:n=>{n()}},ro=Re((n=()=>{})=>{Be.fn(n)},10);var Pe=n=>n.replace(/(```mermaid)(?![^]*?```)/g,"```"),_e=n=>de(n,[{left:"\\[",right:"\\]",display:!0},{left:"\\(",right:"\\)",display:!1}]).reduce((t,o)=>{if(o.type==="text")return t+o.data;let r=o.display?`$$${o.data}$$`:`$${o.data}$`;return t+r},""),Fe=n=>{let e="",t="",o=!1,r="think-wrapper",a=s=>{let i=s.replace(/<script([^>]*)>/gi,"&lt;script$1&gt;");return i=i.replace(/<\/script>/gi,"&lt;/script&gt;"),i=i.replace(/<script([^>]*)\s*\/>/gi,"&lt;script$1 /&gt;"),i};for(let s=0;s<n.length;s++){let i=n[s],c=n.slice(s,s+7),p=n.slice(s,s+8);if(!o&&c==="<think>"){o=!0,e+=`<div class="${r}">`,s+=6;continue}if(o&&p==="</think>"){o=!1,e+="</div>",s+=7;continue}o?t+=i:e+=i}if(t){let s=a(t),i=he.render(s);e=e.replace(`<div class="${r}">`,`<div class="${r}">${i}`)}return e},Ue=n=>n.replace(/\[source_id:\s*([^\]|]+)(?:\s*\|\s*category:\s*([^\]]+))?\]\.?/g,(e,t,o)=>o?`<source-tag data-source-id="${t.trim()}" data-category="${o.trim()}"></source-tag>`:`<source-tag data-source-id="${t.trim()}"></source-tag>`),H=n=>{let e=Fe(n),t=_e(e),o=Pe(t),r=Ue(o);return he.render(r)};import*as me from"echarts";import"echarts/theme/dark-bold.js";import{createGrid as Ye,ModuleRegistry as We,AllCommunityModule as Je,themeQuartz as Ve,colorSchemeVariable as Xe}from"ag-grid-community";function be(n,e="",t={}){if(typeof n!="object"||n===null||Array.isArray(n))return t;for(let[o,r]of Object.entries(n)){let a=e?`${e}.${o}`:o;typeof r=="object"&&r!==null&&!Array.isArray(r)?be(r,a,t):t[a]=r}return t}var Ke=["#5470c6","#c5e542","#9d9ec1","#ee6666","#73c0de","#3ba272","#fc8452","#9a60b4","#ea7ccc"],Ge={color:Ke,backgroundColor:"transparent",tooltip:{trigger:"axis",axisPointer:{type:"shadow"}},legend:{show:!0,type:"scroll",bottom:0,top:null},toolbox:{show:!0,feature:{saveAsImage:{}}}},A=class{constructor(e){this.data=e}parse(){let e=[];if(!this.data)return{charts:[],errors:["Invalid input: null or undefined"]};if(typeof this.data!="object")return{charts:[],errors:[`Invalid input type: expected object, got ${typeof this.data}`]};let t=this.extractArrays(this.data,[]),o=Object.entries(this.data).filter(([,a])=>typeof a=="number"&&!Number.isNaN(a)).map(([a,s])=>({title:a,type:"card",options:{title:a,value:s}}));if(t.length===0&&o.length===0)return{charts:[],errors:["No valid categorical data found"]};let r=[...o];for(let{title:a,items:s}of t){if(s.length===0){e.push(`"${a}": Array is empty \u2014 skipped`);continue}let i=s.map(p=>be(p)).filter(p=>typeof p=="object"&&p!==null&&!Array.isArray(p)),c=this.detectChartStructure(i);if(c){let p=this.convertToChartData(i,c);if(p.length===0){e.push(`"${a}": No valid rows after conversion \u2014 skipped`);continue}let d=this.isSimpleCategoricalPie(p)?"pie":"bar";r.push({title:a,type:d,options:{...Ge,...this.toChartSeries(p,d)}})}else r.push({title:a,type:"table",options:{columns:Array.from(new Set(i.flatMap(p=>Object.keys(p)))),rows:i}})}return e.length>0?{charts:r,errors:e}:{charts:r}}extractArrays(e,t){if(Array.isArray(e)){let o=e.flatMap((a,s)=>Array.isArray(a)?[]:[a]),r=e.flatMap((a,s)=>Array.isArray(a)?this.extractArrays(a,[...t,`[${s}]`]):[]);return[...o.length?[{title:t.length?t.join("."):"Root Data",items:o}]:[],...r]}return e&&typeof e=="object"?Object.entries(e).flatMap(([o,r])=>this.extractArrays(r,[...t,o])):[]}detectChartStructure(e){if(e.length===0)return null;let t=new Set;for(let s of e)for(let i of Object.keys(s))t.add(i);let o=Array.from(t),r=o.filter(s=>typeof e[0]?.[s]=="string"),a=o.filter(s=>typeof e[0]?.[s]=="number");return a.length===0||r.length>1?null:{labelKey:r[0]??"__auto__",valueKeys:a}}isSimpleCategoricalPie(e){return e.length?e.every(t=>t.values.length===1):!1}convertToChartData(e,t){return e.map((o,r)=>{let a=t.labelKey==="__auto__"?null:o[t.labelKey];return{labelValue:a!=null?String(a):`Item ${r+1}`,labelKey:t.labelKey,values:t.valueKeys.map(i=>({[i]:Number(o[i])||0}))}})}toChartSeries(e,t){if(t==="bar"){let r={};return e.forEach((a,s)=>{a.values.forEach(i=>{let[c,p]=Object.entries(i)[0];r[c]||(r[c]=new Array(e.length).fill(0)),r[c][s]=p})}),{xAxis:{type:"category",data:e.map(a=>a.labelValue).filter(Boolean)},yAxis:{type:"value"},series:Object.entries(r).map(([a,s])=>({name:a,type:"bar",stack:"total",data:s}))}}let o=Object.keys(e[0]?.values?.[0]??{})[0]??"value";return{tooltip:{trigger:"item"},series:[{name:"Data",type:"pie",radius:["40%","70%"],label:{show:!1},labelLine:{show:!1},avoidLabelOverlap:!1,data:e.map(r=>({name:r.labelValue,value:r.values[0]?.[o]??0}))}]}}};var ge=!1;function Qe(){ge||(We.registerModules([Je]),ge=!0)}var Ze=Ve.withPart(Xe).withParams({fontFamily:"var(--font-body)",headerFontFamily:"var(--font-body)",borderColor:"var(--border)",backgroundColor:"var(--background)",foregroundColor:"var(--foreground)",headerTextColor:"var(--foreground)",headerBackgroundColor:"var(--card)",rowVerticalPaddingScale:1.4,headerColumnResizeHandleColor:"var(--secondary)",wrapperBorderRadius:2});function et(n){if(typeof n!="string")return!1;try{return JSON.parse(n),!0}catch{return!1}}function tt(n,e){return n<=1||e==="table"?1:e==="card"?Math.min(n,4):2}function ot(n,e){return e===1||n==="table"?"1 / -1":"span 1"}function rt(n){let e=document.createElement("div");e.style.cssText=`
1053
1053
  background: var(--card);
1054
1054
  border-radius: var(--radius-md);
1055
1055
  padding: 1rem 1.25rem;
@@ -1058,39 +1058,39 @@ code.hljs {
1058
1058
  gap: 0.5rem;
1059
1059
  height: 6rem;
1060
1060
  justify-content: center;
1061
- `;let t=document.createElement("span");t.style.cssText="font-size: 0.875rem; font-weight: 500; color: var(--foreground); text-transform: capitalize;",t.textContent=String(n.title??"").replace(/_/g," ").replace(/\./g," ");let o=document.createElement("span");o.style.cssText="font-size: 1.25rem; font-weight: 700; color: var(--foreground); line-height: 1.2;";let r=n.value;return typeof r=="number"&&Number.isFinite(r)&&!Number.isInteger(r)?o.textContent=String(Number.parseFloat(r.toFixed(4))):o.textContent=String(r??"\u2014"),e.appendChild(t),e.appendChild(o),e}function Xe(n){Ge();let e=document.createElement("div");e.style.cssText="width: 100%; height: 400px;";let t={theme:Ve,rowData:n.rows,columnDefs:(n.columns??[]).map(r=>({headerName:r,field:r})),pagination:!0,paginationPageSize:50,animateRows:!0},o=()=>{e.__bdbGridInitialized||(e.__bdbGridInitialized=!0,Pe(e,t))};return requestAnimationFrame(()=>{if(e.isConnected)o();else{let r=new MutationObserver(()=>{e.isConnected&&(r.disconnect(),o())});r.observe(document.body,{childList:!0,subtree:!0})}}),e}function Ze(n,e){let t=document.createElement("div");t.style.cssText=`
1061
+ `;let t=document.createElement("span");t.style.cssText="font-size: 0.875rem; font-weight: 500; color: var(--foreground); text-transform: capitalize;",t.textContent=String(n.title??"").replace(/_/g," ").replace(/\./g," ");let o=document.createElement("span");o.style.cssText="font-size: 1.25rem; font-weight: 700; color: var(--foreground); line-height: 1.2;";let r=n.value;return typeof r=="number"&&Number.isFinite(r)&&!Number.isInteger(r)?o.textContent=String(Number.parseFloat(r.toFixed(4))):o.textContent=String(r??"\u2014"),e.appendChild(t),e.appendChild(o),e}function nt(n){Qe();let e=document.createElement("div");e.style.cssText="width: 100%; height: 400px;";let t={theme:Ze,rowData:n.rows,columnDefs:(n.columns??[]).map(r=>({headerName:r,field:r})),pagination:!0,paginationPageSize:50,animateRows:!0},o=()=>{e.__bdbGridInitialized||(e.__bdbGridInitialized=!0,Ye(e,t))};return requestAnimationFrame(()=>{if(e.isConnected)o();else{let r=new MutationObserver(()=>{e.isConnected&&(r.disconnect(),o())});r.observe(document.body,{childList:!0,subtree:!0})}}),e}function at(n,e){let t=document.createElement("div");t.style.cssText=`
1062
1062
  width: 100%;
1063
1063
  height: 360px;
1064
- `;let o=null,r=()=>{if(o)return;o=le.init(t,"dark-bold",{renderer:"canvas"}),o.setOption(n,!0),new ResizeObserver(()=>o?.resize()).observe(t)};return requestAnimationFrame(()=>{if(document.contains(t)||t.isConnected)r();else{let a=new MutationObserver(()=>{t.isConnected&&(a.disconnect(),r())});a.observe(document.body,{childList:!0,subtree:!0})}}),t}function de(n){let e=document.createElement("div");e.style.cssText="margin-top: 1rem; display: flex; flex-direction: column; gap: 1.25rem;";let t=n;if(We(n))try{t=JSON.parse(n)}catch{return e}let o=t?.tool_results??[];if(!o.length)return e;let r=o.length;for(let a=0;a<o.length;a++){let s=o[a],i=s?.data;if(!i)continue;let{charts:c}=new I(i).parse();if(!c.length)continue;let d=document.createElement("div");if(d.style.cssText="width: 100%;",s?.tool){let h=document.createElement("h4");h.style.cssText=`
1064
+ `;let o=null,r=()=>{if(o)return;o=me.init(t,"dark-bold",{renderer:"canvas"}),o.setOption(n,!0),new ResizeObserver(()=>o?.resize()).observe(t)};return requestAnimationFrame(()=>{if(document.contains(t)||t.isConnected)r();else{let a=new MutationObserver(()=>{t.isConnected&&(a.disconnect(),r())});a.observe(document.body,{childList:!0,subtree:!0})}}),t}function ue(n){let e=document.createElement("div");e.style.cssText="margin-top: 1rem; display: flex; flex-direction: column; gap: 1.25rem;";let t=n;if(et(n))try{t=JSON.parse(n)}catch{return e}let o=t?.tool_results??[];if(!o.length)return e;let r=o.length;for(let a=0;a<o.length;a++){let s=o[a],i=s?.data;if(!i)continue;let{charts:c}=new A(i).parse();if(!c.length)continue;let p=document.createElement("div");if(p.style.cssText="width: 100%;",s?.tool){let h=document.createElement("h4");h.style.cssText=`
1065
1065
  font-size: 13px;
1066
1066
  font-weight: 600;
1067
1067
  color: var(--foreground);
1068
1068
  margin: 0 0 0.25rem 0;
1069
1069
  font-family: var(--font-body);
1070
1070
  text-transform: capitalize;
1071
- `,h.textContent=String(s.tool).replace(/_/g," "),d.appendChild(h)}if(s?.description){let h=document.createElement("p");h.style.cssText=`
1071
+ `,h.textContent=String(s.tool).replace(/_/g," "),p.appendChild(h)}if(s?.description){let h=document.createElement("p");h.style.cssText=`
1072
1072
  font-size: 12px;
1073
1073
  color: var(--muted-foreground);
1074
1074
  margin: 0 0 0.75rem 0;
1075
1075
  font-family: var(--font-body);
1076
1076
  line-height: 1.5;
1077
- `,h.textContent=s.description,d.appendChild(h)}let l=document.createElement("hr");l.style.cssText="border: none; border-top: 1px solid var(--border); margin-bottom: 0.75rem;",d.appendChild(l);let p=Je(r,c[0]?.type),m=document.createElement("div");m.style.cssText=`
1077
+ `,h.textContent=s.description,p.appendChild(h)}let d=document.createElement("hr");d.style.cssText="border: none; border-top: 1px solid var(--border); margin-bottom: 0.75rem;",p.appendChild(d);let l=tt(r,c[0]?.type),g=document.createElement("div");g.style.cssText=`
1078
1078
  display: grid;
1079
- grid-template-columns: repeat(${p}, minmax(0, 1fr));
1079
+ grid-template-columns: repeat(${l}, minmax(0, 1fr));
1080
1080
  gap: 0.5rem;
1081
1081
  width: 100%;
1082
1082
  padding: 1rem 0;
1083
- `;for(let h=0;h<c.length;h++){let b=c[h],u=document.createElement("div");u.style.gridColumn=Ye(b.type,r);let f;switch(b.type){case"card":f=Qe(b.options);break;case"table":f=Xe(b.options);break;case"bar":case"pie":f=Ze(b.options,b.type);break;default:f=document.createElement("div")}u.appendChild(f),m.appendChild(u)}d.appendChild(m),e.appendChild(d)}return e}function pe(n,e="",t={}){for(let o in n){let r=n[o],a=e?`${e}.${o}`:o;typeof r=="object"&&r!==null&&!Array.isArray(r)?pe(r,a,t):(typeof r=="number"||typeof r=="string")&&(t[a]=r)}return t}var ce=`<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
1083
+ `;for(let h=0;h<c.length;h++){let b=c[h],m=document.createElement("div");m.style.gridColumn=ot(b.type,r);let u;switch(b.type){case"card":u=rt(b.options);break;case"table":u=nt(b.options);break;case"bar":case"pie":u=at(b.options,b.type);break;default:u=document.createElement("div")}m.appendChild(u),g.appendChild(m)}p.appendChild(g),e.appendChild(p)}return e}function fe(n,e="",t={}){for(let o in n){let r=n[o],a=e?`${e}.${o}`:o;typeof r=="object"&&r!==null&&!Array.isArray(r)?fe(r,a,t):(typeof r=="number"||typeof r=="string")&&(t[a]=r)}return t}var D=`<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
1084
1084
  <rect width="14" height="14" x="8" y="8" rx="2" ry="2"/>
1085
1085
  <path d="M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2"/>
1086
- </svg>`,et=`<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
1086
+ </svg>`,it=`<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
1087
1087
  <circle cx="12" cy="12" r="10"/>
1088
1088
  <path d="M12 16v-4M12 8h.01"/>
1089
- </svg>`,tt=`<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
1089
+ </svg>`,st=`<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
1090
1090
  <circle cx="12" cy="12" r="1"/><circle cx="19" cy="12" r="1"/><circle cx="5" cy="12" r="1"/>
1091
- </svg>`,ot=`<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
1091
+ </svg>`,lt=`<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
1092
1092
  <path d="M20 6 9 17l-5-5"/>
1093
- </svg>`,rt=`
1093
+ </svg>`,dt=`
1094
1094
  display: inline-flex;
1095
1095
  align-items: center;
1096
1096
  justify-content: center;
@@ -1103,7 +1103,7 @@ code.hljs {
1103
1103
  cursor: pointer;
1104
1104
  transition: background 0.15s, color 0.15s, border-color 0.15s;
1105
1105
  flex-shrink: 0;
1106
- `;function N(n,e){let t=document.createElement("button");return t.setAttribute("aria-label",e),t.style.cssText=rt,t.innerHTML=n,t.addEventListener("mouseenter",()=>{t.style.background="color-mix(in oklab, var(--foreground) 7%, transparent)",t.style.color="var(--foreground)",t.style.borderColor="var(--ring)"}),t.addEventListener("mouseleave",()=>{t.style.background="var(--card)",t.style.color="var(--muted-foreground)",t.style.borderColor="var(--border)"}),t}function nt(n,e){let t=document.querySelector(".bdb-usage-dropdown");if(t){t.remove();return}let o=document.createElement("div");o.className="bdb-usage-dropdown",o.style.cssText=`
1106
+ `;function O(n,e){let t=document.createElement("button");return t.setAttribute("aria-label",e),t.style.cssText=dt,t.innerHTML=n,t.addEventListener("mouseenter",()=>{t.style.background="color-mix(in oklab, var(--foreground) 7%, transparent)",t.style.color="var(--foreground)",t.style.borderColor="var(--ring)"}),t.addEventListener("mouseleave",()=>{t.style.background="var(--card)",t.style.color="var(--muted-foreground)",t.style.borderColor="var(--border)"}),t}function ct(n,e){let t=document.querySelector(".bdb-usage-dropdown");if(t){t.remove();return}let o=document.createElement("div");o.className="bdb-usage-dropdown",o.style.cssText=`
1107
1107
  position: absolute;
1108
1108
  bottom: calc(100% + 6px);
1109
1109
  right: 0;
@@ -1123,7 +1123,7 @@ code.hljs {
1123
1123
  letter-spacing: 0.05em;
1124
1124
  text-transform: uppercase;
1125
1125
  border-bottom: 1px solid var(--border);
1126
- `,r.textContent="Usage Stats",o.appendChild(r);let a=document.createElement("div");a.style.cssText="padding: 0.25rem 0;";for(let[c,d]of Object.entries(e)){let l=document.createElement("div");l.style.cssText=`
1126
+ `,r.textContent="Usage Stats",o.appendChild(r);let a=document.createElement("div");a.style.cssText="padding: 0.25rem 0;";for(let[c,p]of Object.entries(e)){let d=document.createElement("div");d.style.cssText=`
1127
1127
  display: flex;
1128
1128
  align-items: center;
1129
1129
  justify-content: space-between;
@@ -1131,14 +1131,17 @@ code.hljs {
1131
1131
  padding: 0.3rem 0.75rem;
1132
1132
  font-size: 12px;
1133
1133
  color: var(--foreground);
1134
- `,l.addEventListener("mouseenter",()=>{l.style.background="color-mix(in oklab, var(--foreground) 5%, transparent)"}),l.addEventListener("mouseleave",()=>{l.style.background="transparent"});let p=document.createElement("span");p.style.cssText="color: var(--muted-foreground); text-transform: capitalize;",p.textContent=c.split(".").pop()?.replace(/_/g," ")??c;let m=document.createElement("span");m.style.cssText="font-weight: 500; font-variant-numeric: tabular-nums;",m.textContent=String(d),l.appendChild(p),l.appendChild(m),a.appendChild(l)}o.appendChild(a);let s=n.parentElement;s.style.position="relative",s.appendChild(o);let i=c=>{!o.contains(c.target)&&c.target!==n&&(o.remove(),document.removeEventListener("click",i,!0))};setTimeout(()=>document.addEventListener("click",i,!0),0)}function he(n){let{textToCopy:e,usageData:t,onInfo:o}=n,r=document.createElement("div");r.style.cssText=`
1134
+ `,d.addEventListener("mouseenter",()=>{d.style.background="color-mix(in oklab, var(--foreground) 5%, transparent)"}),d.addEventListener("mouseleave",()=>{d.style.background="transparent"});let l=document.createElement("span");l.style.cssText="color: var(--muted-foreground); text-transform: capitalize;",l.textContent=c.split(".").pop()?.replace(/_/g," ")??c;let g=document.createElement("span");g.style.cssText="font-weight: 500; font-variant-numeric: tabular-nums;",g.textContent=String(p),d.appendChild(l),d.appendChild(g),a.appendChild(d)}o.appendChild(a);let s=n.parentElement;s.style.position="relative",s.appendChild(o);let i=c=>{!o.contains(c.target)&&c.target!==n&&(o.remove(),document.removeEventListener("click",i,!0))};setTimeout(()=>document.addEventListener("click",i,!0),0)}function pt(n){return n<1e3?`${n}ms`:`${(n/1e3).toFixed(1)}s`}var ht=`<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
1135
+ <circle cx="12" cy="12" r="10"/>
1136
+ <path d="M12 6v6l4 2"/>
1137
+ </svg>`;function ye(n){let{textToCopy:e,queryTimeMs:t,usageData:o,onInfo:r}=n,a=document.createElement("div");a.style.cssText=`
1135
1138
  display: flex;
1136
1139
  align-items: center;
1137
1140
  justify-content: space-between;
1138
1141
  gap: 0.5rem;
1139
1142
  padding: 0.375rem 0;
1140
1143
  min-height: 38px;
1141
- `;let a=document.createElement("div");a.style.cssText="display: flex; align-items: center; gap: 6px;";let s=N(ce,"Copy to clipboard");if(s.addEventListener("click",async()=>{try{await navigator.clipboard.writeText(e),s.innerHTML=ot,s.style.color="var(--primary)",s.style.borderColor="var(--primary)",setTimeout(()=>{s.innerHTML=ce,s.style.color="",s.style.borderColor=""},2e3)}catch{}}),a.appendChild(s),o){let i=N(et,"View response context");i.addEventListener("click",()=>o()),a.appendChild(i)}if(r.appendChild(a),t&&typeof t=="object"){let i=pe(t);if(Object.keys(i).length>0){let c=document.createElement("div");c.style.cssText="display: flex; align-items: center; position: relative;";let d=N(tt,"Show usage stats");d.addEventListener("click",l=>{l.stopPropagation(),nt(d,i)}),c.appendChild(d),r.appendChild(c)}}return r}var me=!1;function at(n){if(me)return;me=!0;let e=document.createElement("style");e.textContent=`
1144
+ `;let s=document.createElement("div");s.style.cssText="display: flex; align-items: center; gap: 6px;";let i=O(D,"Copy to clipboard");if(i.addEventListener("click",async()=>{try{await navigator.clipboard.writeText(e),i.innerHTML=lt,i.style.color="var(--primary)",i.style.borderColor="var(--primary)",setTimeout(()=>{i.innerHTML=D,i.style.color="",i.style.borderColor=""},2e3)}catch{}}),s.appendChild(i),r){let c=O(it,"View response context");c.addEventListener("click",()=>r()),s.appendChild(c)}if(typeof t=="number"&&Number.isFinite(t)){let c=document.createElement("span");c.style.cssText="display: inline-flex; align-items: center; gap: 4px; padding-inline: 4px; font-size: 11px; color: var(--muted-foreground); user-select: none;";let p=document.createElement("span");p.innerHTML=ht,p.style.display="inline-flex";let d=document.createElement("span");d.textContent=`Thought for ${pt(t)}`,c.appendChild(p),c.appendChild(d),s.appendChild(c)}if(a.appendChild(s),o&&typeof o=="object"){let c=fe(o);if(Object.keys(c).length>0){let p=document.createElement("div");p.style.cssText="display: flex; align-items: center; position: relative;";let d=O(st,"Show usage stats");d.addEventListener("click",l=>{l.stopPropagation(),ct(d,c)}),p.appendChild(d),a.appendChild(p)}}return a}var ve=!1;function bt(n){if(ve)return;ve=!0;let e=document.createElement("style");e.textContent=`
1142
1145
  @keyframes bdb-drawer-in {
1143
1146
  from { transform: translateX(100%); opacity: 0; }
1144
1147
  to { transform: translateX(0); opacity: 1; }
@@ -1284,13 +1287,13 @@ code.hljs {
1284
1287
  .bdb-json-pre .json-num { color: #f08d49; }
1285
1288
  .bdb-json-pre .json-bool { color: #c59bc1; }
1286
1289
  .bdb-json-pre .json-null { color: #de7176; }
1287
- `,n.appendChild?n.appendChild(e):document.head.appendChild(e)}function it(n){return JSON.stringify(n,null,2).replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/("(\\u[a-zA-Z0-9]{4}|\\[^u]|[^\\"])*"(\s*:)?|\b(true|false|null)\b|-?\d+(?:\.\d*)?(?:[eE][+-]?\d+)?)/g,t=>{let o="json-num";return/^"/.test(t)?o=/:$/.test(t)?"json-key":"json-str":/true|false/.test(t)?o="json-bool":/null/.test(t)&&(o="json-null"),`<span class="${o}">${t}</span>`})}function st(n,e,t){n.forEach(o=>o.classList.toggle("active",o.dataset.tab===t)),e.forEach(o=>o.classList.toggle("active",o.dataset.content===t))}function be(n){let{item:e,indexName:t,shadowRoot:o,onClose:r}=n;at(o);let a=document.createElement("div");a.style.cssText="position: fixed; inset: 0; z-index: 1000000;";let s=document.createElement("div");s.className="bdb-drawer-overlay",s.addEventListener("click",x),a.appendChild(s);let i=document.createElement("div");i.className="bdb-drawer-panel",a.appendChild(i);let c=document.createElement("div");c.className="bdb-drawer-header";let d=document.createElement("h3");d.className="bdb-drawer-title",d.textContent="Response Details";let l=document.createElement("button");l.className="bdb-drawer-close",l.setAttribute("aria-label","Close drawer"),l.innerHTML=`<svg width="14" height="14" viewBox="0 0 14 14" fill="none">
1290
+ `,n.appendChild?n.appendChild(e):document.head.appendChild(e)}function gt(n){return JSON.stringify(n,null,2).replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/("(\\u[a-zA-Z0-9]{4}|\\[^u]|[^\\"])*"(\s*:)?|\b(true|false|null)\b|-?\d+(?:\.\d*)?(?:[eE][+-]?\d+)?)/g,t=>{let o="json-num";return/^"/.test(t)?o=/:$/.test(t)?"json-key":"json-str":/true|false/.test(t)?o="json-bool":/null/.test(t)&&(o="json-null"),`<span class="${o}">${t}</span>`})}function mt(n,e,t){n.forEach(o=>o.classList.toggle("active",o.dataset.tab===t)),e.forEach(o=>o.classList.toggle("active",o.dataset.content===t))}function xe(n){let{item:e,indexName:t,shadowRoot:o,onClose:r}=n;bt(o);let a=document.createElement("div");a.style.cssText="position: fixed; inset: 0; z-index: 1000000;";let s=document.createElement("div");s.className="bdb-drawer-overlay",s.addEventListener("click",v),a.appendChild(s);let i=document.createElement("div");i.className="bdb-drawer-panel",a.appendChild(i);let c=document.createElement("div");c.className="bdb-drawer-header";let p=document.createElement("h3");p.className="bdb-drawer-title",p.textContent="Response Details";let d=document.createElement("button");d.className="bdb-drawer-close",d.setAttribute("aria-label","Close drawer"),d.innerHTML=`<svg width="14" height="14" viewBox="0 0 14 14" fill="none">
1288
1291
  <path d="M1 1l12 12M13 1L1 13" stroke="currentColor" stroke-width="1.75" stroke-linecap="round"/>
1289
- </svg>`,l.addEventListener("click",x),c.appendChild(d),c.appendChild(l),i.appendChild(c);let p=document.createElement("div");p.className="bdb-drawer-tabs",[{id:"response",label:"Response"},{id:"json",label:"Response JSON"}].forEach(({id:g,label:S})=>{let k=document.createElement("button");k.className="bdb-drawer-tab"+(g==="response"?" active":""),k.dataset.tab=g,k.textContent=S,k.addEventListener("click",()=>{let L=i.querySelectorAll(".bdb-drawer-tab"),M=i.querySelectorAll(".bdb-drawer-tab-content");st(L,M,g)}),p.appendChild(k)}),i.appendChild(p);let h=document.createElement("div");h.className="bdb-drawer-body",i.appendChild(h);let b=document.createElement("div");if(b.className="bdb-drawer-tab-content active",b.dataset.content="response",e?.query){let g=document.createElement("div");g.style.cssText=`
1292
+ </svg>`,d.addEventListener("click",v),c.appendChild(p),c.appendChild(d),i.appendChild(c);let l=document.createElement("div");l.className="bdb-drawer-tabs",[{id:"response",label:"Response"},{id:"json",label:"Response JSON"}].forEach(({id:f,label:x})=>{let E=document.createElement("button");E.className="bdb-drawer-tab"+(f==="response"?" active":""),E.dataset.tab=f,E.textContent=x,E.addEventListener("click",()=>{let L=i.querySelectorAll(".bdb-drawer-tab"),j=i.querySelectorAll(".bdb-drawer-tab-content");mt(L,j,f)}),l.appendChild(E)}),i.appendChild(l);let h=document.createElement("div");h.className="bdb-drawer-body",i.appendChild(h);let b=document.createElement("div");if(b.className="bdb-drawer-tab-content active",b.dataset.content="response",e?.query){let f=document.createElement("div");f.style.cssText=`
1290
1293
  display: flex;
1291
1294
  justify-content: flex-end;
1292
1295
  margin-bottom: 1rem;
1293
- `;let S=document.createElement("div");S.style.cssText=`
1296
+ `;let x=document.createElement("div");x.style.cssText=`
1294
1297
  max-width: 80%;
1295
1298
  background: var(--secondary);
1296
1299
  color: var(--secondary-foreground);
@@ -1299,11 +1302,11 @@ code.hljs {
1299
1302
  font-size: 13px;
1300
1303
  line-height: 1.55;
1301
1304
  word-break: break-word;
1302
- `,S.textContent=e.query,g.appendChild(S),b.appendChild(g)}let u=new C(e),{messages:f}=u.parse(),v=f.map(g=>g.output??"").join(`
1305
+ `,x.textContent=e.query,f.appendChild(x),b.appendChild(f)}let m=new S(e),{messages:u}=m.parse(),y=u.map(f=>f.output??"").join(`
1303
1306
 
1304
- `);if(v){let g=document.createElement("div");g.className="bdb-ai-bubble ai-md prose",g.style.cssText="font-size: 13px; line-height: 1.65; color: var(--foreground);",g.innerHTML=z(v),b.appendChild(g)}h.appendChild(b);let w=document.createElement("div");w.className="bdb-drawer-tab-content",w.dataset.content="json";let E=document.createElement("pre");E.className="bdb-json-pre",E.innerHTML=it(e),w.appendChild(E),h.appendChild(w);function x(){i.style.animation="bdb-drawer-out 0.18s ease-in both",s.style.opacity="0",s.style.transition="opacity 0.18s",setTimeout(()=>{a.remove(),r()},180)}let T=g=>{g.key==="Escape"&&(x(),document.removeEventListener("keydown",T))};return document.addEventListener("keydown",T),a}import{jsPDF as lt}from"jspdf";function ge(n,e){let t=URL.createObjectURL(n),o=document.createElement("a");o.href=t,o.download=e,document.body.appendChild(o),o.click(),setTimeout(()=>{document.body.removeChild(o),URL.revokeObjectURL(t)},100)}function ue(n){let{messages:e}=new C(n).parse();return e.map(t=>t.output).filter(Boolean).join(`
1307
+ `);if(y){let f=document.createElement("div");f.className="bdb-ai-bubble ai-md prose",f.style.cssText="font-size: 13px; line-height: 1.65; color: var(--foreground);",f.innerHTML=H(y),b.appendChild(f)}h.appendChild(b);let w=document.createElement("div");w.className="bdb-drawer-tab-content",w.dataset.content="json";let k=document.createElement("pre");k.className="bdb-json-pre",k.innerHTML=gt(e),w.appendChild(k),h.appendChild(w);function v(){i.style.animation="bdb-drawer-out 0.18s ease-in both",s.style.opacity="0",s.style.transition="opacity 0.18s",setTimeout(()=>{a.remove(),r()},180)}let C=f=>{f.key==="Escape"&&(v(),document.removeEventListener("keydown",C))};return document.addEventListener("keydown",C),a}import{jsPDF as ut}from"jspdf";import ft from"jspdf-autotable";import*as we from"echarts";function U(n,e){let t=URL.createObjectURL(n),o=document.createElement("a");o.href=t,o.download=e,document.body.appendChild(o),o.click(),setTimeout(()=>{document.body.removeChild(o),URL.revokeObjectURL(t)},100)}function ke(n){let{messages:e}=new S(n).parse();return e.map(t=>t.output).filter(Boolean).join(`
1305
1308
 
1306
- `)}function fe(n,e){let t=`# ${e}
1309
+ `)}function Ce(n,e){let t=`# ${e}
1307
1310
 
1308
1311
  `;t+=`*Exported on ${new Date().toLocaleString()}*
1309
1312
 
@@ -1312,12 +1315,12 @@ code.hljs {
1312
1315
  `;for(let r of n){r.query&&(t+=`**User:**
1313
1316
  ${r.query}
1314
1317
 
1315
- `);let a=ue(r);a&&(t+=`**AI:**
1318
+ `);let a=ke(r);a&&(t+=`**AI:**
1316
1319
  ${a}
1317
1320
 
1318
- `)}let o=new Blob([t],{type:"text/markdown"});ge(o,`chat-${new Date().toISOString().split("T")[0]}.md`)}function ye(n,e){try{let t=new lt,o=t.internal.pageSize.height,r=t.internal.pageSize.width,a=14,s=r-a*2,i=20,c=(l=10)=>{i>o-a-l&&(t.addPage(),i=a+10)};t.setFontSize(18),t.setFont("helvetica","bold"),t.setTextColor(0,0,0),t.text(e,a,i),i+=8,t.setFontSize(10),t.setFont("helvetica","normal"),t.setTextColor(100,100,100),t.text(`Exported on ${new Date().toLocaleString()}`,a,i),i+=8,t.setDrawColor(180,180,180),t.setLineWidth(.4),t.line(a,i,a+s,i),i+=8;for(let l of n){if(l.query){c(20),t.setFontSize(11),t.setFont("helvetica","bold"),t.setTextColor(60,130,100),t.text("You:",a,i),i+=6,t.setFont("helvetica","normal"),t.setTextColor(30,30,30);let m=t.splitTextToSize(l.query,s-4);for(let h of m)c(),t.text(h,a+4,i),i+=5.5;i+=4}let p=ue(l);if(p){c(20),t.setFontSize(11),t.setFont("helvetica","bold"),t.setTextColor(80,80,200),t.text("AI:",a,i),i+=6,t.setFont("helvetica","normal"),t.setTextColor(30,30,30);let m=p.replace(/\*\*(.*?)\*\*/g,"$1").replace(/\*(.*?)\*/g,"$1").replace(/`([^`]+)`/g,"$1").replace(/#{1,6}\s/g,"").replace(/\[([^\]]+)\]\([^)]+\)/g,"$1").replace(/\n{3,}/g,`
1321
+ `)}let o=new Blob([t],{type:"text/markdown"});U(o,`chat-${new Date().toISOString().split("T")[0]}.md`)}function Te(n){let e=new Blob([JSON.stringify(n,null,2)],{type:"application/json"});U(e,`chat-${new Date().toISOString().split("T")[0]}.json`)}function yt(n){let e=n?._data??n?.a?._data;if(!e)return[];let t=e;if(typeof e=="string")try{t=JSON.parse(e)}catch{return[]}let o=t?.tool_results??[];if(!o.length)return[];let r=[];for(let a of o){if(!a?.data)continue;let{charts:s}=new A(a.data).parse();for(let i of s)r.push({...i,title:a.tool?String(a.tool).replace(/_/g," "):i.title})}return r}function vt(n,e=800,t=480){let o=document.createElement("div");o.style.cssText=`position: fixed; left: -10000px; top: 0; width: ${e}px; height: ${t}px;`,document.body.appendChild(o);try{let r=we.init(o,null,{renderer:"canvas",width:e,height:t}),a={...n,backgroundColor:"#ffffff",animation:!1,toolbox:{show:!1}};r.setOption(a,!0);let s=r.getDataURL({type:"png",pixelRatio:2,backgroundColor:"#ffffff"});return r.dispose(),s}catch(r){return console.error("[BangDB] chart render failed:",r),null}finally{document.body.removeChild(o)}}function Ee(n,e){try{let t=new ut,o=t.internal.pageSize.height,r=t.internal.pageSize.width,a=14,s=r-a*2,i=20,c=(d=10)=>{i>o-a-d&&(t.addPage(),i=a+10)};t.setFontSize(18),t.setFont("helvetica","bold"),t.setTextColor(0,0,0),t.text(e,a,i),i+=8,t.setFontSize(10),t.setFont("helvetica","normal"),t.setTextColor(100,100,100),t.text(`Exported on ${new Date().toLocaleString()}`,a,i),i+=8,t.setDrawColor(180,180,180),t.setLineWidth(.4),t.line(a,i,a+s,i),i+=8;for(let d of n){if(d.query){c(20),t.setFontSize(11),t.setFont("helvetica","bold"),t.setTextColor(60,130,100),t.text("You:",a,i),i+=6,t.setFont("helvetica","normal"),t.setTextColor(30,30,30);let h=t.splitTextToSize(d.query,s-4);for(let b of h)c(),t.text(b,a+4,i),i+=5.5;i+=4}let l=ke(d);if(l){c(20),t.setFontSize(11),t.setFont("helvetica","bold"),t.setTextColor(80,80,200),t.text("AI:",a,i),i+=6,t.setFont("helvetica","normal"),t.setTextColor(30,30,30);let h=l.replace(/\*\*(.*?)\*\*/g,"$1").replace(/\*(.*?)\*/g,"$1").replace(/`([^`]+)`/g,"$1").replace(/#{1,6}\s/g,"").replace(/\[([^\]]+)\]\([^)]+\)/g,"$1").replace(/\n{3,}/g,`
1319
1322
 
1320
- `),h=t.splitTextToSize(m,s-4);for(let b of h)c(),t.text(b,a+4,i),i+=5.5;i+=8,c(5),t.setDrawColor(220,220,220),t.setLineWidth(.2),t.line(a,i-4,a+s,i-4),i+=2}}let d=t.output("blob");ge(d,`chat-${new Date().toISOString().split("T")[0]}.pdf`)}catch(t){console.error("[BangDB] PDF export failed:",t)}}var q=class q{constructor(e){this.font={body:'"Inter", sans-serif',mono:'"JetBrains Mono", monospace'};this.tools=[];this.TOKENS={background:"oklch(0.2223 0.0060 271.1393)",foreground:"oklch(0.9551 0 0)",card:"oklch(0.2568 0.0076 274.6528)",cardForeground:"oklch(0.9551 0 0)",primary:"oklch(0.611 0.1217 157.75)",primaryForeground:"oklch(0.9491 0 0)",secondary:"oklch(0.2940 0.0130 272.9312)",secondaryForeground:"oklch(0.9551 0 0)",muted:"oklch(0.2940 0.0130 272.9312)",mutedForeground:"oklch(0.7058 0 0)",accent:"oklch(0.2795 0.0368 260.0310)",accentForeground:"oklch(0.7857 0.1153 246.6596)",border:"oklch(0.3289 0.0092 268.3843)",input:"oklch(0.3289 0.0092 268.3843)",ring:"oklch(0.611 0.1217 157.75)",radius:"0.5rem",shadowPanel:"0 32px 80px rgba(0,0,0,0.6), 0 0 0 1px rgba(255,255,255,0.06)",shadowBubble:"0 8px 32px color-mix(in oklab, oklch(0.611 0.1217 157.75) 40%, transparent)",shadowInput:"0 0 0 2px color-mix(in oklab, oklch(0.611 0.1217 157.75) 50%, transparent)"};this.store=te;this.apiConfig=null;this.bubbleEl=null;this.chatUIEl=null;this.chatAreaEl=null;this.renderedMessageIds=new Set;this.chatTitle="Chat with AI";this.logoUrl="";e.colorTokens&&(this.TOKENS={...this.TOKENS,...e.colorTokens}),e.title&&(this.chatTitle=e.title),e.logo&&(this.logoUrl=e.logo);let t=e.tools||q.DEFAULT_TOOLS,o=new Set(q.DEFAULT_TOOLS.map(r=>r.id));this.tools=t.filter(r=>o.has(r.id)).map(r=>({id:r.id,name:r.name})),this.apiConfig=e.config,this.container=document.createElement("div"),this.container.id="ai-chat-widget-root",document.body.appendChild(this.container),this.root=this.container.attachShadow({mode:"open"}),this.injectGlobalFonts(),this.injectThemeVars(),this.root,this.init().then(()=>{this.mount(),this.store.subscribe(()=>{let r=this.store.getState(),a=r?.chat?.mode,{chatData:s,streamingMessage:i,isLoading:c}=r?.chatSessions?.[r?.chat?.activeSession]??{};this.handleModeChange(a),this.handleChatDataChange({streamingMessage:i,chatData:s,isLoading:c})})})}injectThemeVars(){let e=this.TOKENS,t=document.createElement("style");t.textContent=`
1323
+ `),b=t.splitTextToSize(h,s-4);for(let m of b)c(),t.text(m,a+4,i),i+=5.5;i+=4}let g=yt(d);if(g.length>0){i+=2;for(let h of g)if(c(30),h.title&&(t.setFontSize(10),t.setFont("helvetica","bold"),t.setTextColor(60,60,60),t.text(String(h.title).replace(/_/g," ").replace(/\./g," "),a+4,i),i+=5),h.type==="card"){let b=h.options;t.setFontSize(10),t.setFont("helvetica","normal"),t.setTextColor(80,80,80);let m=String(b.title??"").replace(/_/g," "),u,y=b.value;typeof y=="number"&&Number.isFinite(y)&&!Number.isInteger(y)?u=String(Number.parseFloat(y.toFixed(4))):u=String(y??"\u2014"),t.text(`${m}: `,a+4,i),t.setFont("helvetica","bold"),t.setTextColor(30,30,30);let w=t.getTextWidth(`${m}: `);t.text(u,a+4+w,i),i+=7}else if(h.type==="table"){let b=h.options,m=b.columns??[],u=(b.rows??[]).map(w=>m.map(k=>{let v=w[k];return v==null?"":typeof v=="object"?JSON.stringify(v):String(v)}));ft(t,{startY:i,head:[m],body:u,margin:{left:a+4,right:a},styles:{fontSize:8,cellPadding:2},headStyles:{fillColor:[240,240,240],textColor:[40,40,40],fontStyle:"bold"},theme:"grid"}),i=(t.lastAutoTable?.finalY??i)+6}else if(h.type==="bar"||h.type==="pie"){let b=s-4,m=b*.6;c(m+10);let u=vt(h.options,800,480);if(u)try{t.addImage(u,"PNG",a+4,i,b,m),i+=m+6}catch(y){console.error("[BangDB] addImage failed:",y)}}}c(5),t.setDrawColor(220,220,220),t.setLineWidth(.2),t.line(a,i,a+s,i),i+=6}let p=t.output("blob");U(p,`chat-${new Date().toISOString().split("T")[0]}.pdf`)}catch(t){console.error("[BangDB] PDF export failed:",t)}}var $=class ${constructor(e){this.font={body:'"Inter", sans-serif',mono:'"JetBrains Mono", monospace'};this.tools=[];this.TOKENS={background:"oklch(0.2223 0.0060 271.1393)",foreground:"oklch(0.9551 0 0)",card:"oklch(0.2568 0.0076 274.6528)",cardForeground:"oklch(0.9551 0 0)",primary:"oklch(0.611 0.1217 157.75)",primaryForeground:"oklch(0.9491 0 0)",secondary:"oklch(0.2940 0.0130 272.9312)",secondaryForeground:"oklch(0.9551 0 0)",muted:"oklch(0.2940 0.0130 272.9312)",mutedForeground:"oklch(0.7058 0 0)",accent:"oklch(0.2795 0.0368 260.0310)",accentForeground:"oklch(0.7857 0.1153 246.6596)",border:"oklch(0.3289 0.0092 268.3843)",input:"oklch(0.3289 0.0092 268.3843)",ring:"oklch(0.611 0.1217 157.75)",radius:"0.5rem",shadowPanel:"0 32px 80px rgba(0,0,0,0.6), 0 0 0 1px rgba(255,255,255,0.06)",shadowBubble:"0 8px 32px color-mix(in oklab, oklch(0.611 0.1217 157.75) 40%, transparent)",shadowInput:"0 0 0 2px color-mix(in oklab, oklch(0.611 0.1217 157.75) 50%, transparent)"};this.store=le;this.apiConfig=null;this.bubbleEl=null;this.chatUIEl=null;this.chatAreaEl=null;this.renderedMessageIds=new Set;this.chatTitle="Chat with AI";this.logoUrl="";e.colorTokens&&(this.TOKENS={...this.TOKENS,...e.colorTokens}),e.title&&(this.chatTitle=e.title),e.logo&&(this.logoUrl=e.logo);let t=e.tools||$.DEFAULT_TOOLS,o=new Set($.DEFAULT_TOOLS.map(r=>r.id));this.tools=t.filter(r=>o.has(r.id)).map(r=>({id:r.id,name:r.name})),this.apiConfig=e.config,this.container=document.createElement("div"),this.container.id="ai-chat-widget-root",document.body.appendChild(this.container),this.root=this.container.attachShadow({mode:"open"}),this.injectGlobalFonts(),this.injectThemeVars(),this.root,this.init().then(()=>{this.mount(),this.store.subscribe(()=>{let r=this.store.getState(),a=r?.chat?.mode,{chatData:s,streamingMessage:i,isLoading:c}=r?.chatSessions?.[r?.chat?.activeSession]??{};this.handleModeChange(a),this.handleChatDataChange({streamingMessage:i,chatData:s,isLoading:c})})})}injectThemeVars(){let e=this.TOKENS,t=document.createElement("style");t.textContent=`
1321
1324
  :host {
1322
1325
  --background: ${e.background};
1323
1326
  --foreground: ${e.foreground};
@@ -1346,7 +1349,7 @@ ${a}
1346
1349
  --font-body: ${this.font.body};
1347
1350
  --font-mono: ${this.font.mono};
1348
1351
  }
1349
- `,this.root.appendChild(t)}injectGlobalFonts(){let e="https://fonts.googleapis.com/css2?family=Inter:ital,opsz,wght@0,14..32,100..900;1,14..32,100..900&family=JetBrains+Mono:ital,wght@0,100..800;1,100..800",t=document.createElement("link");t.rel="preconnect",t.href="https://fonts.googleapis.com";let o=document.createElement("link");o.rel="preconnect",o.href="https://fonts.gstatic.com",o.crossOrigin="";let r=document.createElement("link");r.type="text/css",r.rel="stylesheet",r.href=e,this.root.appendChild(t),this.root.appendChild(o),this.root.appendChild(r),document.head.appendChild(t),document.head.appendChild(o),document.head.appendChild(r)}mount(){let e=this.createChatBubble();this.root.appendChild(e),this.bubbleEl=e}async init(){await this.store.dispatch(Z({indexName:this.apiConfig?.indexName}))}handleChatDataChange({chatData:e,streamingMessage:t,isLoading:o}){if(!this.chatAreaEl)return;e||(e=[]);let r=this.chatAreaEl.querySelector(".chat-data-container"),a=this.chatAreaEl.querySelector("#bangdb-chat-area"),s=this.chatAreaEl.querySelector("#bdb-empty-state"),i=()=>{requestAnimationFrame(()=>{a.scrollTo({top:a.scrollHeight,behavior:"smooth"})})},c=e.length>0||!!t?.query;s.style.display=c?"none":"flex";for(let b=0;b<e.length;b++){let u=e[b],f=`msg-${b}`;if(u?.query&&!this.renderedMessageIds.has(f)){this.renderedMessageIds.add(f),r.insertBefore(this.userRequestMessage(u.query),r.querySelector("#chat-window-anchor"));let v=new C(u),{messages:w}=v.parse();w?.length>0&&r.insertBefore(this.aiResponseMessage(u),r.querySelector("#chat-window-anchor")),i()}}let d="bdb-streaming-msg",l=this.root.querySelector(`#${d}`);if(t?.query){l||(l=document.createElement("div"),l.id=d,r.insertBefore(l,r.querySelector("#chat-window-anchor")),l.appendChild(this.userRequestMessage(t.query)),l.style.minHeight=`${a.clientHeight*.8}px`);let b=l.querySelector(".bdb-streaming-ai-area"),u=t.output?.output??"";if(o&&!u&&!b)b=document.createElement("div"),b.className="bdb-streaming-ai-area",b.appendChild(this.loadingIndicator()),l.appendChild(b);else if(u){b||(b=document.createElement("div"),b.className="bdb-streaming-ai-area",l.appendChild(b));let f=b.querySelector(".ai-md");f?f.innerHTML=z(u):(b.innerHTML="",b.appendChild(this.aiResponseMessage(t)))}s.style.display="none",i()}else l&&(l.style.minHeight="0",l.remove());let p=this.chatAreaEl.querySelector(".bdb-textarea"),m=this.chatAreaEl.querySelector(".bdb-send-btn"),h=this.chatAreaEl.querySelector(".bdb-tools-trigger");p&&(p.style.opacity="1"),m&&(m.disabled=!!o||!p?.value.trim()),h&&(h.disabled=!!o,h.style.opacity=o?"0.5":"1",h.style.pointerEvents=o?"none":"auto")}handleModeChange(e){let t=this.bubbleEl?.querySelector(".chat-bubble");if(t)switch(e){case 0:if(t.classList.remove("is-open"),t.setAttribute("aria-label","Open chat"),this.chatUIEl){let r=this.chatUIEl.querySelector(".bdb-chat-panel");r&&(r.style.animation="bdb-panel-out 0.18s ease-in both",r&&(r.style.animation="bdb-panel-out 0.18s ease-in both"),setTimeout(()=>{this.chatUIEl&&(this.chatUIEl.style.display="none")},180))}break;case 1:if(t.setAttribute("aria-label","Close chat"),!this.chatUIEl)this.chatUIEl=this.createChatUI(),this.bubbleEl?.appendChild(this.chatUIEl);else{this.chatUIEl.style.display="";let r=this.chatUIEl.querySelector(".bdb-chat-panel");r&&(r.style.animation="bdb-panel-in 0.25s cubic-bezier(0.34, 1.56, 0.64, 1) both")}t.classList.add("is-open"),this.chatUIEl?.querySelector(".bdb-chat-panel")?.classList.remove("is-fullscreen"),requestAnimationFrame(()=>this.updatePanelPosition());break;case 2:if(t.setAttribute("aria-label","Close chat"),!this.chatUIEl)this.chatUIEl=this.createChatUI(),this.bubbleEl?.appendChild(this.chatUIEl);else{this.chatUIEl.style.display="";let r=this.chatUIEl.querySelector(".bdb-chat-panel");r&&(r.style.animation="bdb-panel-in 0.25s cubic-bezier(0.34, 1.56, 0.64, 1) both")}t.classList.add("is-open");let o=this.chatUIEl?.querySelector(".bdb-chat-panel");o&&(o.classList.add("is-fullscreen"),o.style.top="",o.style.bottom="",o.style.left="",o.style.right="");break}}updatePanelPosition(){if(!this.chatUIEl||!this.bubbleEl)return;let e=this.chatUIEl.querySelector(".bdb-chat-panel");if(!e||e.classList.contains("is-fullscreen"))return;let t=parseInt(this.bubbleEl.style.left)||0,o=parseInt(this.bubbleEl.style.top)||0,r=52,a=52,s=750,i=window.innerWidth,c=window.innerHeight,d=12,l=o+a/2;if(l<c/3)e.style.top=a+d+"px",e.style.bottom="auto";else if(l>2*c/3)e.style.bottom=a+d+"px",e.style.top="auto";else{let p=l-s/2,m=Math.max(8,Math.min(p,c-s-8));e.style.top=m-o+"px",e.style.bottom="auto"}t+r/2<i/2?(e.style.left="0",e.style.right="auto"):(e.style.right="0",e.style.left="auto")}createChatBubble(){let e=document.createElement("div");e.classList.add("bdb-bubble-container"),e.innerHTML=`
1352
+ `,this.root.appendChild(t)}injectGlobalFonts(){let e="https://fonts.googleapis.com/css2?family=Inter:ital,opsz,wght@0,14..32,100..900;1,14..32,100..900&family=JetBrains+Mono:ital,wght@0,100..800;1,100..800",t=document.createElement("link");t.rel="preconnect",t.href="https://fonts.googleapis.com";let o=document.createElement("link");o.rel="preconnect",o.href="https://fonts.gstatic.com",o.crossOrigin="";let r=document.createElement("link");r.type="text/css",r.rel="stylesheet",r.href=e,this.root.appendChild(t),this.root.appendChild(o),this.root.appendChild(r),document.head.appendChild(t),document.head.appendChild(o),document.head.appendChild(r)}mount(){let e=this.createChatBubble();this.root.appendChild(e),this.bubbleEl=e}async init(){await this.store.dispatch(ie({indexName:this.apiConfig?.indexName}))}handleChatDataChange({chatData:e,streamingMessage:t,isLoading:o}){if(!this.chatAreaEl)return;e||(e=[]);let r=this.chatAreaEl.querySelector(".chat-data-container"),a=this.chatAreaEl.querySelector("#bangdb-chat-area"),s=this.chatAreaEl.querySelector("#bdb-empty-state"),i=()=>{requestAnimationFrame(()=>{a.scrollTo({top:a.scrollHeight,behavior:"smooth"})})},c=e.length>0||!!t?.query;s.style.display=c?"none":"flex";for(let b=0;b<e.length;b++){let m=e[b],u=`msg-${b}`;if(m?.query&&!this.renderedMessageIds.has(u)){this.renderedMessageIds.add(u),r.insertBefore(this.userRequestMessage(m.query),r.querySelector("#chat-window-anchor"));let y=new S(m),{messages:w}=y.parse();w?.length>0&&r.insertBefore(this.aiResponseMessage(m),r.querySelector("#chat-window-anchor")),i()}}let p="bdb-streaming-msg",d=this.root.querySelector(`#${p}`);if(t?.query){d||(d=document.createElement("div"),d.id=p,r.insertBefore(d,r.querySelector("#chat-window-anchor")),d.appendChild(this.userRequestMessage(t.query)),d.style.minHeight=`${a.clientHeight*.8}px`);let b=d.querySelector(".bdb-streaming-ai-area"),m=t.output?.output??"";if(o&&!m&&!b)b=document.createElement("div"),b.className="bdb-streaming-ai-area",b.appendChild(this.loadingIndicator()),d.appendChild(b);else if(m){b||(b=document.createElement("div"),b.className="bdb-streaming-ai-area",d.appendChild(b));let u=b.querySelector(".ai-md");u?u.innerHTML=H(m):(b.innerHTML="",b.appendChild(this.aiResponseMessage(t)))}s.style.display="none",i()}else d&&(d.style.minHeight="0",d.remove());let l=this.chatAreaEl.querySelector(".bdb-textarea"),g=this.chatAreaEl.querySelector(".bdb-send-btn"),h=this.chatAreaEl.querySelector(".bdb-tools-trigger");l&&(l.style.opacity="1"),g&&(g.disabled=!!o||!l?.value.trim()),h&&(h.disabled=!!o,h.style.opacity=o?"0.5":"1",h.style.pointerEvents=o?"none":"auto")}handleModeChange(e){let t=this.bubbleEl?.querySelector(".chat-bubble");if(t)switch(e){case 0:if(t.classList.remove("is-open"),t.setAttribute("aria-label","Open chat"),this.chatUIEl){let r=this.chatUIEl.querySelector(".bdb-chat-panel");r&&(r.style.animation="bdb-panel-out 0.18s ease-in both",r&&(r.style.animation="bdb-panel-out 0.18s ease-in both"),setTimeout(()=>{this.chatUIEl&&(this.chatUIEl.style.display="none")},180))}break;case 1:if(t.setAttribute("aria-label","Close chat"),!this.chatUIEl)this.chatUIEl=this.createChatUI(),this.bubbleEl?.appendChild(this.chatUIEl);else{this.chatUIEl.style.display="";let r=this.chatUIEl.querySelector(".bdb-chat-panel");r&&(r.style.animation="bdb-panel-in 0.25s cubic-bezier(0.34, 1.56, 0.64, 1) both")}t.classList.add("is-open"),this.chatUIEl?.querySelector(".bdb-chat-panel")?.classList.remove("is-fullscreen"),requestAnimationFrame(()=>this.updatePanelPosition());break;case 2:if(t.setAttribute("aria-label","Close chat"),!this.chatUIEl)this.chatUIEl=this.createChatUI(),this.bubbleEl?.appendChild(this.chatUIEl);else{this.chatUIEl.style.display="";let r=this.chatUIEl.querySelector(".bdb-chat-panel");r&&(r.style.animation="bdb-panel-in 0.25s cubic-bezier(0.34, 1.56, 0.64, 1) both")}t.classList.add("is-open");let o=this.chatUIEl?.querySelector(".bdb-chat-panel");o&&(o.classList.add("is-fullscreen"),o.style.top="",o.style.bottom="",o.style.left="",o.style.right="");break}}updatePanelPosition(){if(!this.chatUIEl||!this.bubbleEl)return;let e=this.chatUIEl.querySelector(".bdb-chat-panel");if(!e||e.classList.contains("is-fullscreen"))return;let t=parseInt(this.bubbleEl.style.left)||0,o=parseInt(this.bubbleEl.style.top)||0,r=52,a=52,s=750,i=window.innerWidth,c=window.innerHeight,p=12,d=o+a/2;if(d<c/3)e.style.top=a+p+"px",e.style.bottom="auto";else if(d>2*c/3)e.style.bottom=a+p+"px",e.style.top="auto";else{let l=d-s/2,g=Math.max(8,Math.min(l,c-s-8));e.style.top=g-o+"px",e.style.bottom="auto"}t+r/2<i/2?(e.style.left="0",e.style.right="auto"):(e.style.right="0",e.style.left="auto")}createChatBubble(){let e=document.createElement("div");e.classList.add("bdb-bubble-container"),e.innerHTML=`
1350
1353
  <style>
1351
1354
  .bdb-bubble-container {
1352
1355
  position: fixed;
@@ -1393,24 +1396,15 @@ ${a}
1393
1396
  box-shadow: 0 12px 40px color-mix(in oklab, var(--primary) 50%, transparent);
1394
1397
  }
1395
1398
 
1396
- .chat-bubble .icon-chat,
1397
- .chat-bubble .icon-close {
1399
+ .chat-bubble .icon-chat {
1398
1400
  position: absolute;
1399
1401
  transition: transform 0.2s ease, opacity 0.15s ease;
1400
1402
  color: var(--primary-foreground);
1401
1403
  }
1402
- .chat-bubble .icon-close {
1403
- opacity: 0;
1404
- transform: rotate(-90deg) scale(0.6);
1405
- }
1406
1404
  .chat-bubble.is-open .icon-chat {
1407
1405
  opacity: 0;
1408
1406
  transform: rotate(90deg) scale(0.6);
1409
1407
  }
1410
- .chat-bubble.is-open .icon-close {
1411
- opacity: 1;
1412
- transform: rotate(0deg) scale(1);
1413
- }
1414
1408
  </style>
1415
1409
 
1416
1410
 
@@ -1420,14 +1414,10 @@ ${a}
1420
1414
  <path d="M28,32 C28,32 23.2863266,30.1450667 19.4727818,28.6592 L3.43749107,28.6592 C1.53921989,28.6592 0,27.0272 0,25.0144 L0,3.6448 C0,1.632 1.53921989,0 3.43749107,0 L24.5615088,0 C26.45978,0 27.9989999,1.632 27.9989999,3.6448 L27.9989999,22.0490667 L28,22.0490667 L28,32 Z M23.8614088,20.0181333 C23.5309223,19.6105242 22.9540812,19.5633836 22.5692242,19.9125333 C22.5392199,19.9392 19.5537934,22.5941333 13.9989999,22.5941333 C8.51321617,22.5941333 5.48178311,19.9584 5.4277754,19.9104 C5.04295119,19.5629428 4.46760991,19.6105095 4.13759108,20.0170667 C3.97913051,20.2124916 3.9004494,20.4673395 3.91904357,20.7249415 C3.93763774,20.9825435 4.05196575,21.2215447 4.23660523,21.3888 C4.37862552,21.5168 7.77411059,24.5386667 13.9989999,24.5386667 C20.2248893,24.5386667 23.6203743,21.5168 23.7623946,21.3888 C23.9467342,21.2215726 24.0608642,20.9827905 24.0794539,20.7254507 C24.0980436,20.4681109 24.0195551,20.2135019 23.8614088,20.0181333 Z"/>
1421
1415
  </svg>
1422
1416
  </span>
1423
- <span class="icon-close">
1424
- <svg width="18" height="18" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
1425
- <path d="M1 1l12 12M13 1L1 13" stroke="white" stroke-width="2" stroke-linecap="round"/>
1426
- </svg>
1427
- </span>
1417
+
1428
1418
  </button>
1429
- `,e.addEventListener("click",()=>{if(e._didDrag)return;let{chat:t}=this.store.getState();t?.mode===0?this.store.dispatch(j(1)):this.store.dispatch(j(0))});{let t=!1,o=0,r=0,a=0,s=0,i=window.innerWidth-24-52,c=window.innerHeight-24-52;try{let d=localStorage.getItem("bdb-bubble-position");if(d){let{left:l,top:p}=JSON.parse(d);i=l,c=p}}catch{}e.style.bottom="auto",e.style.right="auto",e.style.left=i+"px",e.style.top=c+"px",e.addEventListener("pointerdown",d=>{t=!0,e._didDrag=!1,o=d.clientX,r=d.clientY,a=i,s=c,e.style.transition="none",e.setPointerCapture(d.pointerId)}),e.addEventListener("pointermove",d=>{if(!t)return;let l=d.clientX-o,p=d.clientY-r;Math.hypot(l,p)>4&&(e._didDrag=!0),i=a+l,c=s+p,e.style.left=i+"px",e.style.top=c+"px"}),e.addEventListener("pointerup",d=>{if(!t||(t=!1,e.releasePointerCapture(d.pointerId),!e._didDrag))return;let l=52,p=52,m=24,h=window.innerWidth,b=window.innerHeight,u=i+l/2,f=c+p/2,v=[{left:m,top:m},{left:(h-l)/2,top:m},{left:h-m-l,top:m},{left:m,top:(b-p)/2},{left:h-m-l,top:(b-p)/2},{left:m,top:b-m-p},{left:(h-l)/2,top:b-m-p},{left:h-m-l,top:b-m-p}],w=v[0],E=1/0;for(let x of v){let T=Math.hypot(x.left+l/2-u,x.top+p/2-f);T<E&&(E=T,w=x)}i=w.left,c=w.top,e.style.transition="left 0.4s cubic-bezier(0.2,0.8,0.2,1), top 0.4s cubic-bezier(0.2,0.8,0.2,1)",e.style.left=i+"px",e.style.top=c+"px";try{localStorage.setItem("bdb-bubble-position",JSON.stringify({left:i,top:c}))}catch{}this.updatePanelPosition()})}return e}createChatUI(){let e=document.createElement("div");e.addEventListener("click",d=>d.stopPropagation()),e.addEventListener("pointerdown",d=>d.stopPropagation()),e.innerHTML=`
1430
- <style>
1419
+ `,e.addEventListener("click",()=>{if(e._didDrag)return;let{chat:t}=this.store.getState();t?.mode===0&&this.store.dispatch(z(1))});{let t=!1,o=0,r=0,a=0,s=0,i=window.innerWidth-24-52,c=window.innerHeight-24-52;try{let p=localStorage.getItem("bdb-bubble-position");if(p){let{left:d,top:l}=JSON.parse(p);i=d,c=l}}catch{}e.style.bottom="auto",e.style.right="auto",e.style.left=i+"px",e.style.top=c+"px",e.addEventListener("pointerdown",p=>{t=!0,e._didDrag=!1,o=p.clientX,r=p.clientY,a=i,s=c,e.style.transition="none",e.setPointerCapture(p.pointerId)}),e.addEventListener("pointermove",p=>{if(!t)return;let d=p.clientX-o,l=p.clientY-r;Math.hypot(d,l)>4&&(e._didDrag=!0),i=a+d,c=s+l,e.style.left=i+"px",e.style.top=c+"px"}),e.addEventListener("pointerup",p=>{if(!t||(t=!1,e.releasePointerCapture(p.pointerId),!e._didDrag))return;let d=52,l=52,g=24,h=window.innerWidth,b=window.innerHeight,m=i+d/2,u=c+l/2,y=[{left:g,top:g},{left:(h-d)/2,top:g},{left:h-g-d,top:g},{left:g,top:(b-l)/2},{left:h-g-d,top:(b-l)/2},{left:g,top:b-g-l},{left:(h-d)/2,top:b-g-l},{left:h-g-d,top:b-g-l}],w=y[0],k=1/0;for(let v of y){let C=Math.hypot(v.left+d/2-m,v.top+l/2-u);C<k&&(k=C,w=v)}i=w.left,c=w.top,e.style.transition="left 0.4s cubic-bezier(0.2,0.8,0.2,1), top 0.4s cubic-bezier(0.2,0.8,0.2,1)",e.style.left=i+"px",e.style.top=c+"px";try{localStorage.setItem("bdb-bubble-position",JSON.stringify({left:i,top:c}))}catch{}this.updatePanelPosition()})}return e}createChatUI(){let e=document.createElement("div");e.addEventListener("click",l=>l.stopPropagation()),e.addEventListener("pointerdown",l=>l.stopPropagation()),e.innerHTML=`
1420
+ <style>
1431
1421
  .bdb-chat-widget {
1432
1422
  display: flex;
1433
1423
  flex-direction: column;
@@ -1444,27 +1434,55 @@ ${a}
1444
1434
  display: flex;
1445
1435
  align-items: center;
1446
1436
  justify-content: space-between;
1437
+ position: relative;
1438
+ z-index: 20;
1447
1439
  padding: 0 1.25rem;
1448
1440
  height: 3.25rem;
1449
1441
  flex-shrink: 0;
1450
1442
  background: var(--card);
1451
1443
  border-bottom: 1px solid var(--border);
1444
+ cursor: grab;
1445
+ user-select: none;
1446
+ -webkit-user-select: none;
1447
+ overflow: visible;
1448
+ min-width: 0;
1449
+ box-sizing: border-box;
1452
1450
  }
1453
-
1454
- .bdb-chat-panel.is-fullscreen .bdb-chat-header {
1455
- max-width: 56rem;
1456
- margin: 0 auto;
1457
- width: 100%;
1458
- background: transparent;
1459
- border-bottom: 1px solid var(--border);
1451
+
1452
+ .bdb-chat-header:active {
1453
+ cursor: grabbing;
1454
+ }
1455
+
1456
+ /* Don't show grab cursor over interactive controls */
1457
+ .bdb-chat-header button,
1458
+ .bdb-chat-header a,
1459
+ .bdb-chat-header input,
1460
+ .bdb-chat-header select,
1461
+ .bdb-chat-header textarea {
1462
+ cursor: pointer;
1460
1463
  }
1461
1464
 
1465
+ .bdb-chat-panel.is-fullscreen .bdb-chat-header {
1466
+ width: 100%;
1467
+ max-width: 100%;
1468
+ margin: 0;
1469
+ background: transparent;
1470
+ border-bottom: 1px solid var(--border);
1471
+ flex-shrink: 0;
1472
+ box-sizing: border-box;
1473
+ padding: 0 1.25rem;
1474
+ }
1475
+
1462
1476
  .bdb-chat-title-container {
1463
1477
  display: flex;
1464
1478
  align-items: center;
1465
1479
  gap: 0.25rem;
1480
+ overflow: hidden;
1481
+ min-width: 0;
1482
+ flex: 1;
1483
+ max-width: calc(100% - 150px);
1466
1484
  }
1467
-
1485
+
1468
1486
  .bdb-chat-title {
1469
1487
  font-size: 15px;
1470
1488
  font-weight: 600;
@@ -1472,6 +1490,120 @@ ${a}
1472
1490
  letter-spacing: -0.01em;
1473
1491
  color: var(--foreground);
1474
1492
  margin: 0;
1493
+ overflow: hidden;
1494
+ text-overflow: ellipsis;
1495
+ white-space: nowrap;
1496
+ }
1497
+
1498
+ .bdb-info-tooltip {
1499
+ position: relative;
1500
+ display: inline-flex;
1501
+ align-items: center;
1502
+ flex-shrink: 0;
1503
+ }
1504
+
1505
+ .bdb-info-trigger {
1506
+ display: inline-flex;
1507
+ align-items: center;
1508
+ justify-content: center;
1509
+ width: 20px;
1510
+ height: 20px;
1511
+ border-radius: 9999px;
1512
+ color: var(--muted-foreground);
1513
+ border: none;
1514
+ background: transparent;
1515
+ cursor: pointer;
1516
+ padding: 0;
1517
+ transition: background 0.15s, color 0.15s;
1518
+ }
1519
+
1520
+ .bdb-info-trigger:hover {
1521
+ background: color-mix(in oklab, var(--foreground) 7%, transparent);
1522
+ color: var(--foreground);
1523
+ }
1524
+
1525
+ .bdb-info-trigger:focus-visible {
1526
+ outline: 2px solid color-mix(in oklab, var(--foreground) 30%, transparent);
1527
+ outline-offset: 2px;
1528
+ }
1529
+
1530
+ .bdb-info-popover {
1531
+ position: absolute;
1532
+ top: 100%;
1533
+ left: 50%;
1534
+ transform: translateX(-50%);
1535
+ margin-top: 8px;
1536
+ min-width: 220px;
1537
+ max-width: 280px;
1538
+ padding: 10px 12px;
1539
+ border-radius: 12px;
1540
+ background: color-mix(in oklab, var(--card) 92%, black);
1541
+ color: var(--foreground);
1542
+ border: 1px solid color-mix(in oklab, var(--border) 85%, transparent);
1543
+ box-shadow: 0 10px 26px rgba(0,0,0,0.32);
1544
+ z-index: 1001;
1545
+
1546
+ opacity: 0;
1547
+ visibility: hidden;
1548
+ pointer-events: none;
1549
+ transition: opacity 0.14s ease, transform 0.14s ease, visibility 0.14s;
1550
+ }
1551
+
1552
+ .bdb-info-popover::before {
1553
+ content: "";
1554
+ position: absolute;
1555
+ top: -6px;
1556
+ left: 50%;
1557
+ transform: translateX(-50%) rotate(45deg);
1558
+ width: 12px;
1559
+ height: 12px;
1560
+ background: inherit;
1561
+ border-left: 1px solid color-mix(in oklab, var(--border) 85%, transparent);
1562
+ border-top: 1px solid color-mix(in oklab, var(--border) 85%, transparent);
1563
+ }
1564
+
1565
+ /* Hover bridge so you can move cursor from icon to popover without it closing */
1566
+ .bdb-info-popover::after {
1567
+ content: "";
1568
+ position: absolute;
1569
+ left: 0;
1570
+ right: 0;
1571
+ top: -12px;
1572
+ height: 12px;
1573
+ background: transparent;
1574
+ }
1575
+
1576
+ .bdb-info-tooltip:hover .bdb-info-popover,
1577
+ .bdb-info-tooltip:focus-within .bdb-info-popover {
1578
+ opacity: 1;
1579
+ visibility: visible;
1580
+ pointer-events: auto;
1581
+ transform: translateX(-50%) translateY(2px);
1582
+ }
1583
+
1584
+ .bdb-info-popover-title {
1585
+ font-size: 13px;
1586
+ font-weight: 600;
1587
+ margin: 0 0 6px 0;
1588
+ letter-spacing: -0.01em;
1589
+ }
1590
+
1591
+ .bdb-info-popover a {
1592
+ color: var(--primary);
1593
+ text-decoration: none;
1594
+ font-size: 13px;
1595
+ line-height: 1.2;
1596
+ word-break: break-word;
1597
+ }
1598
+
1599
+ .bdb-info-popover a:hover {
1600
+ text-decoration: underline;
1601
+ }
1602
+
1603
+ .bdb-info-popover-desc {
1604
+ margin: 0;
1605
+ font-size: 12px;
1606
+ color: var(--muted-foreground);
1475
1607
  }
1476
1608
 
1477
1609
  .bdb-header-status {
@@ -1499,6 +1631,8 @@ ${a}
1499
1631
  display: flex;
1500
1632
  align-items: center;
1501
1633
  gap: 4px;
1634
+ flex-shrink: 0;
1635
+ flex-wrap: nowrap;
1502
1636
  }
1503
1637
 
1504
1638
  .bdb-icon-btn {
@@ -1589,24 +1723,29 @@ ${a}
1589
1723
  left: 0 !important;
1590
1724
  right: 0 !important;
1591
1725
  bottom: 0 !important;
1592
- width: 100vw !important;
1593
- height: 100vh !important;
1726
+ width: 100% !important;
1727
+ height: 100% !important;
1594
1728
  border-radius: 0 !important;
1595
- display: flex;
1596
- align-items: center;
1597
- justify-content: center;
1729
+ display: flex !important;
1730
+ align-items: center !important;
1731
+ justify-content: center !important;
1598
1732
  background: color-mix(in oklab, var(--card) 55%, transparent) !important;
1599
1733
  backdrop-filter: blur(2px) !important;
1600
1734
  transform: none !important;
1601
1735
  margin: 0 !important;
1736
+ overflow: hidden !important;
1737
+ z-index: 999998 !important;
1602
1738
  }
1603
-
1739
+
1604
1740
  .bdb-chat-panel.is-fullscreen .bdb-chat-widget {
1605
- width: 90vw;
1606
- height: 90vh;
1741
+ width: 90%;
1742
+ height: 90%;
1607
1743
  border-radius: var(--radius-lg);
1608
1744
  box-shadow: var(--shadow-panel);
1609
1745
  border: 1px solid var(--border);
1746
+ display: flex !important;
1747
+ flex-direction: column !important;
1748
+ overflow: hidden !important;
1610
1749
  }
1611
1750
  </style>
1612
1751
 
@@ -1620,7 +1759,33 @@ ${a}
1620
1759
 
1621
1760
  <div class="bdb-chat-title-container">
1622
1761
  <h3 class="bdb-chat-title">${this.chatTitle}</h3>
1623
- </div>
1762
+ <span class="bdb-info-tooltip">
1763
+ <button
1764
+ type="button"
1765
+ class="bdb-info-trigger"
1766
+ aria-label="Integration settings"
1767
+ aria-haspopup="dialog"
1768
+ >
1769
+ <svg width="14" height="14" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false">
1770
+ <path d="M12 22c5.523 0 10-4.477 10-10S17.523 2 12 2 2 6.477 2 12s4.477 10 10 10Z" stroke="currentColor" stroke-width="1.8"/>
1771
+ <path d="M12 10.5v6" stroke="currentColor" stroke-width="1.8" stroke-linecap="round"/>
1772
+ <path d="M12 7.5h.01" stroke="currentColor" stroke-width="2.6" stroke-linecap="round"/>
1773
+ </svg>
1774
+ </button>
1775
+
1776
+ <span class="bdb-info-popover" role="tooltip">
1777
+ <div class="bdb-info-popover-title">Chat documentation</div>
1778
+ <p class="bdb-info-popover-desc" style="margin: 0 0 8px 0;">Learn how to integrate and configure chat.</p>
1779
+ <a
1780
+ href="https://bvector.bangdb.com/settings/integration"
1781
+ target="_blank"
1782
+ rel="noopener noreferrer"
1783
+ >
1784
+ Open chat docs
1785
+ </a>
1786
+ </span>
1787
+ </span>
1788
+ </div>
1624
1789
 
1625
1790
  <div class="bdb-header-actions" style="position: relative;">
1626
1791
  <button class="bdb-icon-btn js-fullscreen-btn" aria-label="Toggle fullscreen" title="Fullscreen">
@@ -1634,7 +1799,7 @@ ${a}
1634
1799
  <path d="M7.5 10.5l-4-4h2.5v-5h3v5h2.5l-4 4zm-5 2h10v1.5h-10v-1.5z" fill="currentColor"/>
1635
1800
  </svg>
1636
1801
  </button>
1637
-
1802
+
1638
1803
  <div class="bdb-download-dropdown" id="bdb-download-dropdown">
1639
1804
  <button class="bdb-dropdown-item" id="js-download-md">
1640
1805
  <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"></path><polyline points="14 2 14 8 20 8"></polyline><line x1="16" y1="13" x2="8" y2="13"></line><line x1="16" y1="17" x2="8" y2="17"></line><polyline points="10 9 9 9 8 9"></polyline></svg>
@@ -1644,6 +1809,10 @@ ${a}
1644
1809
  <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"></path><polyline points="14 2 14 8 20 8"></polyline><path d="M9 15v-6h2a2 2 0 0 1 2 2v2a2 2 0 0 1-2 2h-2"></path></svg>
1645
1810
  PDF (.pdf)
1646
1811
  </button>
1812
+ <button class="bdb-dropdown-item" id="js-download-json">
1813
+ <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"></path><polyline points="14 2 14 8 20 8"></polyline><path d="M8 13h2m0 0v4m0-4v-2a2 2 0 0 1 4 0v2m0 0h2"></path></svg>
1814
+ JSON (.json)
1815
+ </button>
1647
1816
  </div>
1648
1817
 
1649
1818
  <button class="bdb-icon-btn js-close-btn" aria-label="Close chat" title="Close">
@@ -1657,14 +1826,14 @@ ${a}
1657
1826
  <div class="bdb-chat-body" style="display: flex; flex-direction: column; flex: 1; overflow: hidden;"></div>
1658
1827
  </div>
1659
1828
  </div>
1660
- `;let t=e.querySelector(".bdb-chat-panel"),o=e.querySelector(".bdb-chat-body"),r=e.querySelector(".bdb-chat-title-container");if(t.querySelector(".js-fullscreen-btn")?.addEventListener("click",()=>{this.store.getState().chat.mode===2?this.store.dispatch(j(1)):this.store.dispatch(j(2))}),t.querySelector(".js-close-btn")?.addEventListener("click",()=>{let d=this.store.getState().chat.mode;d===2?this.store.dispatch(j(1)):d===1&&this.store.dispatch(j(0))}),this.logoUrl){let d=document.createElement("div"),l=document.createElement("img");l.src=this.logoUrl,l.style.cssText="width: 24px; height: 24px; margin-right: 0.5rem;",d.appendChild(l),r.prepend(d)}let a=t.querySelector(".js-download-btn"),s=t.querySelector("#bdb-download-dropdown"),i=t.querySelector("#js-download-md"),c=t.querySelector("#js-download-pdf");if(a&&s){a.addEventListener("click",l=>{l.stopPropagation(),s.classList.toggle("show")}),document.addEventListener("click",l=>{!s.contains(l.target)&&l.target!==a&&s.classList.remove("show")});let d=()=>{let l=this.store.getState(),p=l.chat.activeSession;return l.chatSessions[p]?.chatData||[]};i?.addEventListener("click",()=>{fe(d(),this.chatTitle),s.classList.remove("show")}),c?.addEventListener("click",()=>{ye(d(),this.chatTitle),s.classList.remove("show")})}return o.appendChild(this.chatArea()),e}chatArea(){let e=document.createElement("div");e.style.cssText="display: flex; flex-direction: column; flex: 1; overflow: hidden; position: relative;",e.innerHTML=`
1829
+ `;let t=e.querySelector(".bdb-chat-panel"),o=e.querySelector(".bdb-chat-body"),r=e.querySelector(".bdb-chat-title-container"),a=e.querySelector(".bdb-chat-header");if(a&&this.bubbleEl){let l=!1,g=0,h=0,b=0,m=0,u=parseInt(this.bubbleEl.style.left)||0,y=parseInt(this.bubbleEl.style.top)||0;a.addEventListener("pointerdown",k=>{k.target?.closest("button, a, input, textarea, select, [role='button']")||(l=!0,this.bubbleEl._didDrag=!1,g=k.clientX,h=k.clientY,u=parseInt(this.bubbleEl.style.left)||0,y=parseInt(this.bubbleEl.style.top)||0,b=u,m=y,this.bubbleEl.style.transition="none",a.setPointerCapture(k.pointerId))}),a.addEventListener("pointermove",k=>{if(!l)return;let v=k.clientX-g,C=k.clientY-h;Math.hypot(v,C)>4&&(this.bubbleEl._didDrag=!0),u=b+v,y=m+C,this.bubbleEl.style.left=u+"px",this.bubbleEl.style.top=y+"px",this.updatePanelPosition()});let w=k=>{if(!l)return;l=!1;try{a.releasePointerCapture(k.pointerId)}catch{}if(!this.bubbleEl._didDrag)return;let v=52,C=52,f=24,x=window.innerWidth,E=window.innerHeight,L=u+v/2,j=y+C/2,M=[{left:f,top:f},{left:(x-v)/2,top:f},{left:x-f-v,top:f},{left:f,top:(E-C)/2},{left:x-f-v,top:(E-C)/2},{left:f,top:E-f-C},{left:(x-v)/2,top:E-f-C},{left:x-f-v,top:E-f-C}],I=M[0],K=1/0;for(let B of M){let G=Math.hypot(B.left+v/2-L,B.top+C/2-j);G<K&&(K=G,I=B)}u=I.left,y=I.top,this.bubbleEl.style.transition="left 0.4s cubic-bezier(0.2,0.8,0.2,1), top 0.4s cubic-bezier(0.2,0.8,0.2,1)",this.bubbleEl.style.left=u+"px",this.bubbleEl.style.top=y+"px";try{localStorage.setItem("bdb-bubble-position",JSON.stringify({left:u,top:y}))}catch{}this.updatePanelPosition()};a.addEventListener("pointerup",w),a.addEventListener("pointercancel",w)}if(t.querySelector(".js-fullscreen-btn")?.addEventListener("click",()=>{this.store.getState().chat.mode===2?this.store.dispatch(z(1)):this.store.dispatch(z(2))}),t.querySelector(".js-close-btn")?.addEventListener("click",()=>{let l=this.store.getState().chat.mode;l===2?this.store.dispatch(z(1)):l===1&&this.store.dispatch(z(0))}),this.logoUrl){let l=document.createElement("div"),g=document.createElement("img");g.src=this.logoUrl,g.style.cssText="width: 24px; height: 24px; margin-right: 0.5rem;",l.appendChild(g),r.prepend(l)}let s=t.querySelector(".js-download-btn"),i=t.querySelector("#bdb-download-dropdown"),c=t.querySelector("#js-download-md"),p=t.querySelector("#js-download-pdf"),d=t.querySelector("#js-download-json");if(s&&i){s.addEventListener("click",h=>{h.stopPropagation(),i.classList.toggle("show")});let l=h=>{let b=h.composedPath();!b.includes(i)&&!b.includes(s)&&i.classList.remove("show")};this.root.addEventListener("click",l,!0),document.addEventListener("click",l,!0);let g=()=>{let h=this.store.getState(),b=h.chat.activeSession;return h.chatSessions[b]?.chatData||[]};c?.addEventListener("click",()=>{Ce(g(),this.chatTitle),i.classList.remove("show")}),p?.addEventListener("click",()=>{Ee(g(),this.chatTitle),i.classList.remove("show")}),d?.addEventListener("click",()=>{Te(g()),i.classList.remove("show")})}return o.appendChild(this.chatArea()),e}chatArea(){let e=document.createElement("div");e.style.cssText="display: flex; flex-direction: column; flex: 1; overflow: hidden; position: relative;",e.innerHTML=`
1661
1830
  <style>
1662
1831
  .bdb-scroll {
1663
1832
  scrollbar-width: thin;
1664
1833
  scrollbar-color: color-mix(in oklab, var(--foreground) 10%, transparent) transparent;
1665
1834
  scroll-behavior: smooth;
1666
1835
  }
1667
-
1836
+
1668
1837
  .bdb-scroll:hover {
1669
1838
  scrollbar-color: color-mix(in oklab, var(--foreground) 18%, transparent) transparent;
1670
1839
  }
@@ -1680,7 +1849,7 @@ ${a}
1680
1849
  text-align: center;
1681
1850
  padding: 2rem;
1682
1851
  }
1683
-
1852
+
1684
1853
  .bdb-empty-icon {
1685
1854
  width: 48px;
1686
1855
  height: 48px;
@@ -1692,7 +1861,7 @@ ${a}
1692
1861
  color: var(--primary-foreground);
1693
1862
  margin-bottom: 0.25rem;
1694
1863
  }
1695
-
1864
+
1696
1865
  .bdb-empty-title {
1697
1866
  font-size: 15px;
1698
1867
  font-weight: 600;
@@ -1754,19 +1923,36 @@ ${a}
1754
1923
  opacity: 1;
1755
1924
  pointer-events: auto;
1756
1925
  }
1757
-
1926
+
1758
1927
  .bdb-chat-panel.is-fullscreen #chat-query-container {
1759
- max-width: 56rem;
1760
- margin: 0 auto;
1761
- width: 100%;
1928
+ width: 100%;
1929
+ flex-shrink: 0;
1930
+ box-sizing: border-box;
1931
+ }
1932
+
1933
+ .bdb-chat-panel.is-fullscreen #chat-query-container > * {
1934
+ max-width: 56rem;
1935
+ margin: 0 auto;
1936
+ width: 100%;
1937
+ box-sizing: border-box;
1938
+ }
1939
+
1940
+ /* Prevent message content from overflowing in fullscreen */
1941
+ #bangdb-chat-area pre,
1942
+ #bangdb-chat-area code,
1943
+ #bangdb-chat-area table,
1944
+ #bangdb-chat-area img {
1945
+ max-width: 100%;
1946
+ overflow-x: auto;
1947
+ box-sizing: border-box;
1762
1948
  }
1763
1949
  </style>
1764
1950
 
1765
- <div style="position: relative; flex: 1; overflow: hidden;">
1951
+ <div style="position: relative; flex: 1; overflow: hidden; width: 100%;">
1766
1952
  <div class="bdb-scroll" id="bangdb-chat-area"
1767
- style="height: 100%; overflow-y: auto; padding: 1rem 1.25rem; display: flex; flex-direction: column;">
1953
+ style="height: 100%; overflow-x: hidden; overflow-y: auto; padding: 1rem 1.25rem; display: flex; flex-direction: column; width: 100%; box-sizing: border-box;">
1768
1954
 
1769
- <div style="max-width: 56rem; margin: 0 auto; width: 100%; display: flex; flex-direction: column; gap: 0.25rem; flex: 1;">
1955
+ <div style="width: 100%; display: flex; flex-direction: column; gap: 0.25rem; flex: 1; box-sizing: border-box;">
1770
1956
  <div class="bdb-empty-state" id="bdb-empty-state">
1771
1957
  <div class="bdb-empty-icon">
1772
1958
  <svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8">
@@ -1791,7 +1977,7 @@ ${a}
1791
1977
  </div>
1792
1978
 
1793
1979
  <div id="chat-query-container"
1794
- style="flex-shrink: 0; background: var(--background); padding: 0.75rem 1rem 1rem;">
1980
+ style="flex-shrink: 0; background: var(--background); padding: 0.75rem 1rem 1rem; width: 100%; box-sizing: border-box;">
1795
1981
  </div>
1796
1982
  `;let t=e.querySelector("#bangdb-chat-area"),o=e.querySelector("#chat-query-container"),r=e.querySelector("#bdb-scroll-fab");return o.appendChild(this.chatQueryForm()),t.addEventListener("scroll",()=>{let a=t.scrollHeight-t.scrollTop-t.clientHeight;r.classList.toggle("visible",a>100)}),r.addEventListener("click",()=>{t.scrollTo({top:t.scrollHeight,behavior:"smooth"})}),this.chatAreaEl=e,e}loadingIndicator(){let e=document.createElement("div");return e.innerHTML=`
1797
1983
  <style>
@@ -1821,18 +2007,27 @@ ${a}
1821
2007
  40% { transform: translateY(-6px); opacity: 1; }
1822
2008
  }
1823
2009
  </style>
1824
-
2010
+
1825
2011
  <div class="bdb-loading">
1826
2012
  <div class="bdb-typing-dots">
1827
2013
  <span></span><span></span><span></span>
1828
2014
  </div>
1829
2015
  <span>Thinking\u2026</span>
1830
2016
  </div>
1831
- `,e}userRequestMessage(e){let t=document.createElement("div");return t.style.cssText="display: flex; justify-content: flex-end; margin-block: 0.375rem;",t.innerHTML=`
2017
+ `,e}userRequestMessage(e){let t=document.createElement("div");t.style.cssText="display: flex; justify-content: flex-end; margin-block: 0.375rem;",t.innerHTML=`
1832
2018
  <style>
2019
+ .bdb-user-stack {
2020
+ display: inline-flex;
2021
+ flex-direction: column;
2022
+ align-items: flex-end;
2023
+ gap: 6px;
2024
+ max-width: 75%;
2025
+ }
2026
+
1833
2027
  .bdb-user-bubble {
1834
- max-width: 75%;
1835
- background: var(--secondary);
2028
+ width: fit-content;
2029
+ max-width: 100%;
2030
+ background: var(--secondary);
1836
2031
  color: var(--secondary-foreground);
1837
2032
  border-radius: 18px 18px 4px 18px;
1838
2033
  padding: 0.6rem 1rem;
@@ -1841,11 +2036,29 @@ ${a}
1841
2036
  word-break: break-word;
1842
2037
  box-shadow: inset 0 1px 0 rgba(255,255,255,0.08);
1843
2038
  }
2039
+
2040
+ .bdb-user-actionbar {
2041
+ width: fit-content;
2042
+ max-width: 100%;
2043
+ display: flex;
2044
+ justify-content: flex-end;
2045
+ padding: 0.125rem 0;
2046
+ min-height: 32px;
2047
+ }
2048
+
2049
+ .bdb-user-actionbar button {
2050
+ /* mimic action bar button baseline spacing */
2051
+ transform: translateY(-2px);
2052
+ }
1844
2053
  </style>
1845
- <div class="bdb-user-bubble"></div>
1846
- `,t.querySelector(".bdb-user-bubble").textContent=e,t}aiResponseMessage(e){let t=document.createElement("div");t.style.cssText="display: flex; gap: 0.625rem; align-items: flex-start; margin-block: 0.375rem;";let o=document.createElement("style");o.textContent=`
1847
- ${P}
1848
- ${B}
2054
+
2055
+ <div class="bdb-user-stack">
2056
+ <div class="bdb-user-bubble"></div>
2057
+ <div class="bdb-user-actionbar"></div>
2058
+ </div>
2059
+ `,t.querySelector(".bdb-user-bubble").textContent=e;let o=t.querySelector(".bdb-user-actionbar"),r=O(D,"Copy to clipboard");return r.addEventListener("click",async()=>{try{await navigator.clipboard.writeText(e),r.innerHTML='<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M20 6 9 17l-5-5"/></svg>',r.style.color="var(--primary)",r.style.borderColor="var(--primary)",setTimeout(()=>{r.innerHTML=D,r.style.color="",r.style.borderColor=""},2e3)}catch{}}),o.appendChild(r),t}aiResponseMessage(e){let t=document.createElement("div");t.style.cssText="display: flex; gap: 0.625rem; align-items: flex-start; margin-block: 0.375rem;";let o=document.createElement("style");o.textContent=`
2060
+ ${W}
2061
+ ${Y}
1849
2062
 
1850
2063
  .ai-md pre {
1851
2064
  padding: 1rem;
@@ -1870,20 +2083,20 @@ ${a}
1870
2083
  from { opacity: 0; transform: translateY(4px); }
1871
2084
  to { opacity: 1; transform: translateY(0); }
1872
2085
  }
1873
- `,t.appendChild(o);let r=document.createElement("div");r.className="bdb-ai-bubble",t.appendChild(r);let a=document.createElement("div");a.className="ai-md prose",r.appendChild(a);let s=new C(e),{messages:i}=s.parse(),c=i.map(u=>u?.output??"").join("");a.innerHTML=z(c),this.renderSourceTags(a,e);let d=e?._data??e?.a?._data;if(d){let u=de(String(d));u.children.length>0&&r.appendChild(u)}let l=i.map(u=>u?.output??"").join(`
2086
+ `,t.appendChild(o);let r=document.createElement("div");r.className="bdb-ai-bubble",t.appendChild(r);let a=document.createElement("div");a.className="ai-md prose",r.appendChild(a);let s=new S(e),{messages:i}=s.parse(),c=i.map(m=>m?.output??"").join("");a.innerHTML=H(c),this.renderSourceTags(a,e);let p=e?._data??e?.a?._data;if(p){let m=ue(String(p));m.children.length>0&&r.appendChild(m)}let d=i.map(m=>m?.output??"").join(`
1874
2087
 
1875
- `),p=e?.a?.usage??null,m=this.apiConfig?.indexName??"",h=this.root,b=he({textToCopy:l,usageData:p,onInfo:()=>{let u=h.querySelector(".bdb-context-drawer-host");if(u){u.remove();return}let f=document.createElement("div");f.className="bdb-context-drawer-host";let v=be({item:e,indexName:m,shadowRoot:h,onClose:()=>f.remove()});f.appendChild(v),h.appendChild(f)}});return r.appendChild(b),t}async renderSourceTags(e,t){let o=e.querySelectorAll("source-tag");if(!o.length)return;let r=t?.a?.metadata||t?.metadata||[];for(let a of o){let s=a.getAttribute("data-source-id"),i=a.getAttribute("data-category");if(!s||s.toLowerCase()==="na"){a.remove();continue}let c=document.createElement("span");c.style.cssText="display: block; padding: 0.75rem 0;";let d=s.split("##"),l=d[1]??s,p=d[2],m=document.createElement("span");if(m.style.cssText="display: block; font-size: 12px; color: var(--accent-foreground); padding-bottom: 0.5rem;",m.innerHTML=`
2088
+ `),l=e?.a?.usage??null,g=this.apiConfig?.indexName??"",h=this.root,b=ye({textToCopy:d,queryTimeMs:e?.queryTime,usageData:l,onInfo:()=>{let m=h.querySelector(".bdb-context-drawer-host");if(m){m.remove();return}let u=document.createElement("div");u.className="bdb-context-drawer-host";let y=xe({item:e,indexName:g,shadowRoot:h,onClose:()=>u.remove()});u.appendChild(y),h.appendChild(u)}});return r.appendChild(b),t}async renderSourceTags(e,t){let o=e.querySelectorAll("source-tag");if(!o.length)return;let r=t?.a?.metadata||t?.metadata||[];for(let a of o){let s=a.getAttribute("data-source-id"),i=a.getAttribute("data-category");if(!s||s.toLowerCase()==="na"){a.remove();continue}let c=document.createElement("span");c.style.cssText="display: block; padding: 0.75rem 0;";let p=s.split("##"),d=p[1]??s,l=p[2],g=document.createElement("span");if(g.style.cssText="display: block; font-size: 12px; color: var(--accent-foreground); padding-bottom: 0.5rem;",g.innerHTML=`
1876
2089
  <span style="text-decoration: underline; color: var(--accent-foreground);">
1877
- Source: ${decodeURIComponent(l)}
1878
- ${p?`<span style="padding: 0 0.5rem;">|</span>Page: ${p}`:""}
2090
+ Source: ${decodeURIComponent(d)}
2091
+ ${l?`<span style="padding: 0 0.5rem;">|</span>Page: ${l}`:""}
1879
2092
  </span>
1880
2093
  ${i?`<span style="padding: 0 0.5rem;">|</span>Category: ${i}`:""}
1881
- `,c.appendChild(m),r.length>0){let h=r.find(b=>b?.source_id===s);h?.table_ids?.length&&await this.renderTables(c,h.table_ids),h?.image_ids?.length&&await this.renderImages(c,h.image_ids)}a.replaceWith(c)}}async renderTables(e,t){for(let o of t){let r=document.createElement("div");r.innerHTML=`<div style="display:grid;grid-template-columns:repeat(9,1fr);gap:2px;">
2094
+ `,c.appendChild(g),r.length>0){let h=r.find(b=>b?.source_id===s);h?.table_ids?.length&&await this.renderTables(c,h.table_ids),h?.image_ids?.length&&await this.renderImages(c,h.image_ids)}a.replaceWith(c)}}async renderTables(e,t){for(let o of t){let r=document.createElement("div");r.innerHTML=`<div style="display:grid;grid-template-columns:repeat(9,1fr);gap:2px;">
1882
2095
  ${Array.from({length:36}).map(()=>'<div style="height:2rem;background:rgba(255,255,255,0.05);border-radius:2px;"></div>').join("")}
1883
- </div>`,e.appendChild(r);try{let a=await R({baseURL:this.apiConfig.backendURL,apikey:this.apiConfig.apikey,payload:{name:this.apiConfig.indexName,type:"table",id:o}});a?.metadata?.text_as_html&&(r.innerHTML=`<div style="overflow-x:auto;margin-bottom:1rem;">${a.metadata.text_as_html}</div>`)}catch{r.innerHTML='<div style="color:#f87171;font-size:12px;margin-bottom:0.5rem;">Failed to load table</div>'}}}async renderImages(e,t){let o=document.createElement("div");o.style.cssText="display: grid; grid-template-columns: repeat(auto-fill, minmax(140px, 1fr)); gap: 0.75rem; margin-top: 0.5rem;",e.appendChild(o);let{backendURL:r,resourceURL:a,apikey:s,indexName:i}=this.apiConfig,c=`${i}_img_bucket`;for(let d of t){let l=document.createElement("div");l.style.cssText="border-radius: 8px; overflow: hidden; border: 1px solid rgba(255,255,255,0.08); background: rgba(255,255,255,0.03);",l.innerHTML='<div style="height: 8rem; background: rgba(255,255,255,0.05); display:flex; align-items:center; justify-content:center; color: #71717a; font-size:12px;">Loading\u2026</div>',o.appendChild(l);try{let p=await R({baseURL:r,apikey:s,payload:{name:i,type:"image",id:d}});if(!p?.file_name){l.remove();continue}let m=`https://${a}/brs/get/${s}/${c}/${d}_${p.file_name}`;l.innerHTML=`
1884
- <div style="height:8rem; background-image:url('${m}'); background-size:cover; background-position:center; cursor:pointer;"></div>
1885
- <div style="padding:0.375rem 0.5rem; font-size:11px; color:#a1a1aa; overflow:hidden; text-overflow:ellipsis; white-space:nowrap;">${p.file_name}</div>
1886
- `,l.querySelector("div")?.addEventListener("click",()=>{let h=document.createElement("div");h.style.cssText="position:fixed;inset:0;background:rgba(0,0,0,0.9);z-index:9999999;display:flex;align-items:center;justify-content:center;cursor:zoom-out;",h.innerHTML=`<img src="${m}" alt="image" style="max-width:90vw;max-height:90vh;border-radius:8px;object-fit:contain;" />`,h.addEventListener("click",()=>h.remove()),document.body.appendChild(h)})}catch{l.remove()}}}chatQueryForm(){let e=document.createElement("div");e.innerHTML=`
2096
+ </div>`,e.appendChild(r);try{let a=await _({baseURL:this.apiConfig.backendURL,apikey:this.apiConfig.apikey,payload:{name:this.apiConfig.indexName,type:"table",id:o}});a?.metadata?.text_as_html&&(r.innerHTML=`<div style="overflow-x:auto;margin-bottom:1rem;">${a.metadata.text_as_html}</div>`)}catch{r.innerHTML='<div style="color:#f87171;font-size:12px;margin-bottom:0.5rem;">Failed to load table</div>'}}}async renderImages(e,t){let o=document.createElement("div");o.style.cssText="display: grid; grid-template-columns: repeat(auto-fill, minmax(140px, 1fr)); gap: 0.75rem; margin-top: 0.5rem;",e.appendChild(o);let{backendURL:r,resourceURL:a,apikey:s,indexName:i}=this.apiConfig,c=`${i}_img_bucket`;for(let p of t){let d=document.createElement("div");d.style.cssText="border-radius: 8px; overflow: hidden; border: 1px solid rgba(255,255,255,0.08); background: rgba(255,255,255,0.03);",d.innerHTML='<div style="height: 8rem; background: rgba(255,255,255,0.05); display:flex; align-items:center; justify-content:center; color: #71717a; font-size:12px;">Loading\u2026</div>',o.appendChild(d);try{let l=await _({baseURL:r,apikey:s,payload:{name:i,type:"image",id:p}});if(!l?.file_name){d.remove();continue}let g=`https://${a}/brs/get/${s}/${c}/${p}_${l.file_name}`;d.innerHTML=`
2097
+ <div style="height:8rem; background-image:url('${g}'); background-size:cover; background-position:center; cursor:pointer;"></div>
2098
+ <div style="padding:0.375rem 0.5rem; font-size:11px; color:#a1a1aa; overflow:hidden; text-overflow:ellipsis; white-space:nowrap;">${l.file_name}</div>
2099
+ `,d.querySelector("div")?.addEventListener("click",()=>{let h=document.createElement("div");h.style.cssText="position:fixed;inset:0;background:rgba(0,0,0,0.9);z-index:9999999;display:flex;align-items:center;justify-content:center;cursor:zoom-out;",h.innerHTML=`<img src="${g}" alt="image" style="max-width:90vw;max-height:90vh;border-radius:8px;object-fit:contain;" />`,h.addEventListener("click",()=>h.remove()),document.body.appendChild(h)})}catch{d.remove()}}}chatQueryForm(){let e=document.createElement("div");e.innerHTML=`
1887
2100
  <style>
1888
2101
  .bdb-form-wrap {
1889
2102
  border-radius: var(--radius-lg);
@@ -2081,4 +2294,4 @@ ${a}
2081
2294
  </button>
2082
2295
  </div>
2083
2296
  </div>
2084
- `;let t=e.querySelector(".bdb-textarea"),o=e.querySelector(".bdb-send-btn"),r=e.querySelector("#bdb-tools-trigger"),a=e.querySelector("#bdb-tools-dropdown"),s=e.querySelector("#bdb-active-tool-badge"),i=e.querySelector("#bdb-active-tool-name"),c=e.querySelector(".bdb-tool-clear"),d=this.tools;d.length===0?r.style.display="none":(d.forEach(p=>{let m=document.createElement("button");m.className="bdb-tool-item",m.textContent=p.name,m.addEventListener("click",()=>{let h=this.store.getState().chat.tools;for(let b of h)b.id!==p.id&&this.store.dispatch($(b.id));this.store.dispatch(K({id:p.id,name:p.name})),i.textContent=p.name,s.style.display="inline-flex",a.classList.remove("show")}),a.appendChild(m)}),r.addEventListener("click",p=>{p.stopPropagation(),a.classList.toggle("show")}),document.addEventListener("click",p=>{!a.contains(p.target)&&p.target!==r&&a.classList.remove("show")})),c.addEventListener("click",()=>{let p=this.store.getState().chat.tools;for(let m of p)this.store.dispatch($(m.id));s.style.display="none"});let l=()=>{t.style.height="auto",t.style.height=Math.min(t.scrollHeight,180)+"px"};return this.store.subscribe(()=>{let{chatSessions:p,chat:m}=this.store.getState(),h=p[m.activeSession]?.query||"";t.value!==h&&(t.value=h,l(),o.disabled=!h.trim())}),t.addEventListener("input",()=>{l();let p=t.value;o.disabled=!p.trim();let{activeSession:m}=this.store.getState().chat;this.store.dispatch(H({sessionId:m,query:p}))}),t.addEventListener("keydown",async p=>{p.key==="Enter"&&!p.shiftKey&&(p.preventDefault(),o.disabled||await this.sendQuery())}),o.addEventListener("click",()=>this.sendQuery()),e}async sendQuery(){let{chatSessions:e,chat:t}=this.store.getState(),{activeSession:o,activeIndex:r}=t,{query:a,isLoading:s}=e[o];if(s||!a?.trim())return;let i={query:a,output:[]};this.store.dispatch(H({sessionId:o,query:""})),await this.store.dispatch(X({query:i?.query,sessionId:o,indexName:r,config:this.apiConfig}))}downloadChat(){}};q.DEFAULT_TOOLS=[{id:"kpi",name:"KPI (MCP)"}];var O=q;var ve=null;function dt(n){return ve=new O(n),ve}typeof window<"u"&&(window.BangdbChatWidget={init:dt});export{O as ChatWidget,dt as init};
2297
+ `;let t=e.querySelector(".bdb-textarea"),o=e.querySelector(".bdb-send-btn"),r=e.querySelector("#bdb-tools-trigger"),a=e.querySelector("#bdb-tools-dropdown"),s=e.querySelector("#bdb-active-tool-badge"),i=e.querySelector("#bdb-active-tool-name"),c=e.querySelector(".bdb-tool-clear"),p=this.tools;p.length===0?r.style.display="none":(p.forEach(l=>{let g=document.createElement("button");g.className="bdb-tool-item",g.textContent=l.name,g.addEventListener("click",()=>{let h=this.store.getState().chat.tools;for(let b of h)b.id!==l.id&&this.store.dispatch(P(b.id));this.store.dispatch(Q({id:l.id,name:l.name})),i.textContent=l.name,s.style.display="inline-flex",a.classList.remove("show")}),a.appendChild(g)}),r.addEventListener("click",l=>{l.stopPropagation(),a.classList.toggle("show")}),document.addEventListener("click",l=>{!a.contains(l.target)&&l.target!==r&&a.classList.remove("show")})),c.addEventListener("click",()=>{let l=this.store.getState().chat.tools;for(let g of l)this.store.dispatch(P(g.id));s.style.display="none"});let d=()=>{t.style.height="auto",t.style.height=Math.min(t.scrollHeight,180)+"px"};return this.store.subscribe(()=>{let{chatSessions:l,chat:g}=this.store.getState(),h=l[g.activeSession]?.query||"";t.value!==h&&(t.value=h,d(),o.disabled=!h.trim())}),t.addEventListener("input",()=>{d();let l=t.value;o.disabled=!l.trim();let{activeSession:g}=this.store.getState().chat;this.store.dispatch(N({sessionId:g,query:l}))}),t.addEventListener("keydown",async l=>{l.key==="Enter"&&!l.shiftKey&&(l.preventDefault(),o.disabled||await this.sendQuery())}),o.addEventListener("click",()=>this.sendQuery()),e}async sendQuery(){let{chatSessions:e,chat:t}=this.store.getState(),{activeSession:o,activeIndex:r}=t,{query:a,isLoading:s}=e[o];if(s||!a?.trim())return;let i={query:a,output:[]};this.store.dispatch(N({sessionId:o,query:""})),await this.store.dispatch(ae({query:i?.query,sessionId:o,indexName:r,config:this.apiConfig}))}downloadChat(){}};$.DEFAULT_TOOLS=[{id:"kpi",name:"KPI (MCP)"}];var R=$;var Se=null;function xt(n){return Se=new R(n),Se}typeof window<"u"&&(window.BangdbChatWidget={init:xt});export{R as ChatWidget,xt as init};