@bangdb/web-sdk 1.0.5 → 1.0.7

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.js CHANGED
@@ -1,4 +1,4 @@
1
- "use strict";var de=Object.create;var j=Object.defineProperty;var ce=Object.getOwnPropertyDescriptor;var pe=Object.getOwnPropertyNames;var he=Object.getPrototypeOf,ge=Object.prototype.hasOwnProperty;var me=(o,e)=>{for(var t in e)j(o,t,{get:e[t],enumerable:!0})},I=(o,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let a of pe(e))!ge.call(o,a)&&a!==t&&j(o,a,{get:()=>e[a],enumerable:!(r=ce(e,a))||r.enumerable});return o};var q=(o,e,t)=>(t=o!=null?de(he(o)):{},I(e||!o||!o.__esModule?j(t,"default",{value:o,enumerable:!0}):t,o)),be=o=>I(j({},"__esModule",{value:!0}),o);var Me={};me(Me,{ChatWidget:()=>C,init:()=>ne});module.exports=be(Me);var R=`
1
+ "use strict";var qe=Object.create;var $=Object.defineProperty;var He=Object.getOwnPropertyDescriptor;var Ie=Object.getOwnPropertyNames;var Oe=Object.getPrototypeOf,$e=Object.prototype.hasOwnProperty;var Re=(r,e)=>{for(var t in e)$(r,t,{get:e[t],enumerable:!0})},K=(r,e,t,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of Ie(e))!$e.call(r,n)&&n!==t&&$(r,n,{get:()=>e[n],enumerable:!(o=He(e,n))||o.enumerable});return r};var R=(r,e,t)=>(t=r!=null?qe(Oe(r)):{},K(e||!r||!r.__esModule?$(t,"default",{value:r,enumerable:!0}):t,r)),De=r=>K($({},"__esModule",{value:!0}),r);var gt={};Re(gt,{ChatWidget:()=>O,init:()=>Ae});module.exports=De(gt);var G=`
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 U=`
586
+ }`;var V=`
587
587
  :root {
588
588
  --border-xheavy: var(--border);
589
589
  }
@@ -1046,10 +1046,278 @@ code.hljs {
1046
1046
  .prose > :last-child:not(.not-prose *) {
1047
1047
  margin-bottom: 0;
1048
1048
  }
1049
- `;var K=require("@reduxjs/toolkit");var P=require("@reduxjs/toolkit"),ue={activeIndex:"",activeSession:"",sessions:[],useGenAi:!1,mode:0},F=(0,P.createSlice)({name:"chat",initialState:ue,reducers:{changeMode:(o,e)=>{o.mode=e.payload},setActiveIndex:(o,e)=>{o.activeIndex=e.payload},setActiveSession:(o,e)=>{o.activeSession=e.payload},setSessions:(o,e)=>{o.sessions=e.payload},setUseGenAi:(o,e)=>{o.useGenAi=e.payload}}}),{setActiveIndex:_,setActiveSession:D,setSessions:$e,setUseGenAi:Ie,changeMode:v}=F.actions,O=F.reducer;var k=require("@reduxjs/toolkit");var u=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
+ `;var se=require("@reduxjs/toolkit");var W=require("@reduxjs/toolkit"),Ne={activeIndex:"",activeSession:"",sessions:[],useGenAi:!1,mode:0,tools:[]},J=(0,W.createSlice)({name:"chat",initialState:Ne,reducers:{changeMode:(r,e)=>{r.mode=e.payload},setActiveIndex:(r,e)=>{r.activeIndex=e.payload},setActiveSession:(r,e)=>{r.activeSession=e.payload},setSessions:(r,e)=>{r.sessions=e.payload},setUseGenAi:(r,e)=>{r.useGenAi=e.payload},addTool:(r,e)=>{r.tools.some(t=>t.id===e.payload.id)||r.tools.push(e.payload)},removeTool:(r,e)=>{r.tools=r.tools.filter(t=>t.id!==e.payload)}}}),{setActiveIndex:Y,setActiveSession:Q,setSessions:xt,setUseGenAi:kt,changeMode:M,addTool:X,removeTool:B}=J.actions,Z=J.reducer;var q=require("@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(`
1050
1050
 
1051
- `)}}parse(){let e=this.extractOutput(),t=this.detectModelVersion(),r=[];return t==="gpt4"?r=e?.filter(({message:a})=>a?.content).map(a=>this.normalizeGPT4Choice(a)):t==="gpt5"?r=e?.filter(a=>a?.content?.length>0).map(a=>this.normalizeGPT5Output(a)):t==="file-chat"&&(r=e?.filter(({text:a})=>a)?.map(a=>this.normalizeFileChatResponse(a))),{messages:r,model:t,raw:this.rawResponse}}};var B=async({baseURL:o,payload:e,apikey:t})=>{try{return await(await fetch("https://"+o+"/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"}}},A=async({baseURL:o,payload:e,apikey:t})=>{try{return await(await fetch("https://"+o+"/ai/vector/metadata",{method:"POST",body:JSON.stringify(e),headers:{"x-bang-api-key":t,"x-bang-api-src":"chat-applet"}})).json()}catch(r){console.error(r)}};var G=(0,k.createAsyncThunk)("chatSession/streamResponse",async({sessionId:o,query:e,indexName:t,fall_back:r,config:{backendURL:a,apikey:n,userid:i}},{getState:s,dispatch:c})=>{let m=s(),{chatData:l,isLoading:d}=m.chatSessions[o];if(!e?.trim()||d)return;c(W({sessionId:o,loading:!0}));let p={query:e,a:{choices:[]}};c(E({sessionId:o,message:p})),c(M({sessionId:o,query:""}));let h=l?.filter(g=>g&&g?.op!=="ADD_FILES"&&!g?.source_file&&!g?.source)?.length,w=Array.isArray(l)?l?.map(g=>{let{messages:$}=new u(g).parse(),f=$?.map(y=>y?.output)?.filter(Boolean)?.join(`
1052
- `);return!g?.query||!f||f.startsWith("Error: ")?null:{q:g?.query,a:f}})?.filter(g=>g!==null):[],S=await B({baseURL:a,apikey:n,payload:{name:t,qnum:h?h+1:1,fall_back:r,sessionid:o,userid:i,prev_qa:w,query:p?.query}}),ie=new u(S),{raw:se,messages:L}=ie.parse();if(c(W({sessionId:o,loading:!1})),L?.length>0)for(let g=0;g<L.length;g++){let f=(L[g]?.output||"")?.split(" "),y="";for(let T=0;T<f.length;T++)await new Promise(le=>setTimeout(le,20)),y=y+(y?" ":"")+f[T],c(E({sessionId:o,message:{query:p?.query,output:{output:y}}})),T===f.length-1&&(c(N({sessionId:o,chatData:[{query:p?.query,a:se}]})),c(E({sessionId:o,message:null})))}else c(E({sessionId:o,message:null})),c(N({sessionId:o,chatData:[{query:p?.query,a:{choices:[{index:0,message:{content:"Error: "+(S?.error?.[0]||"There is no context in the vector index and fall back option is null")}}]}}]}))}),Q=(0,k.createAsyncThunk)("chatSession/initializeState",async({indexName:o},{dispatch:e})=>{let t="GUEST_SESSION";e(_(o)),e(D(t)),e(ve(t))}),fe={},x={query:"",chatData:[],streamingMessage:null,isLoading:!1},V=(0,k.createSlice)({name:"chatSession",initialState:fe,reducers:{initSession:(o,e)=>{let t=e.payload;o[t]||(o[t]=x)},setLoading:(o,e)=>{let{sessionId:t,loading:r}=e.payload;o[t]||(o[t]=x),o[t].isLoading=r},setQuery:(o,e)=>{let{sessionId:t,query:r}=e.payload;o[t]||(o[t]=x),o[t].query=r},appendChatData:(o,e)=>{let{sessionId:t,chatData:r}=e.payload;o[t]||(o[t]=x),o[t].chatData=[...o[t].chatData||[],...r]},setChatData:(o,e)=>{let{sessionId:t,chatData:r}=e.payload;o[t]||(o[t]=x),o[t].chatData=r},setStreamingMessage:(o,e)=>{let{sessionId:t,message:r}=e.payload;o[t]&&(o[t].streamingMessage=r)}}}),{initSession:ve,setQuery:M,setChatData:We,appendChatData:N,setStreamingMessage:E,setLoading:W}=V.actions;var J=V.reducer;var Y=(0,K.configureStore)({reducer:{chat:O,chatSessions:J}});var z=q(require("highlight.js")),ee=q(require("markdown-it")),te=q(require("@vscode/markdown-it-katex"));var ye=function(o,e,t){let r=t,a=0,n=o.length;for(;r<e.length;){let i=e[r];if(a<=0&&e.slice(r,r+n)===o)return r;i==="\\"?r++:i==="{"?a++:i==="}"&&a--,r++}return-1},we=function(o){return o.replace(/[-/\\^$*+?.()|[\]{}]/g,"\\$&")},xe=/^\\begin{/,ke=function(o,e){let t,r=[],a=new RegExp("("+e.map(n=>we(n.left)).join("|")+")");for(;t=o.search(a),t!==-1;){t>0&&(r.push({type:"text",data:o.slice(0,t)}),o=o.slice(t));let n=e.findIndex(c=>o.startsWith(c.left));if(t=ye(e[n].right,o,e[n].left.length),t===-1)break;let i=o.slice(0,t+e[n].right.length),s=xe.test(i)?i:o.slice(e[n].left.length,t);r.push({type:"math",data:s,rawData:i,display:e[n].display}),o=o.slice(t+e[n].right.length)}return o!==""&&r.push({type:"text",data:o}),r},Z=ke;var rt=require("katex/dist/contrib/mhchem.min.js");function X(o){return new Promise(e=>{setTimeout(e,o)})}var oe=require("lodash"),re=new ee.default({html:!0,breaks:!0,linkify:!0,highlight:function(o,e){let t=e??"auto";if(e&&z.default.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">`+z.default.highlight(o,{language:t,ignoreIllegals:!0}).value+"</code></pre>"}catch{}return'<pre><code class="hljs">'+o+"</code></pre>"}}).enable(["table","code","fence","blockquote","heading","lheading","paragraph"]).enable(["autolink","linkify","backticks","image","link","newline"]).enable(["emphasis","html_inline"]).use(te.default);typeof window<"u"&&window.document.addEventListener("click",o=>{if(o.target?.classList?.contains("ai-chat-code-copy")){let e=o.target.parentNode?.nextSibling?.innerText;navigator.clipboard.writeText(e).then(async()=>{o.target.innerHTML='<span style="margin-right:3px">Copied</span>\u2705',await X(3e3),o.target.innerText="Copy"}).catch(t=>{alert(`Error copying code: ${t.message}`)})}});var Ce={fn:o=>{o()}},nt=(0,oe.debounce)((o=()=>{})=>{Ce.fn(o)},10);var Se=o=>o.replace(/(```mermaid)(?![^]*?```)/g,"```"),Te=o=>Z(o,[{left:"\\[",right:"\\]",display:!0},{left:"\\(",right:"\\)",display:!1}]).reduce((t,r)=>{if(r.type==="text")return t+r.data;let a=r.display?`$$${r.data}$$`:`$${r.data}$`;return t+a},""),je=o=>{let e="",t="",r=!1,a="think-wrapper",n=i=>{let s=i.replace(/<script([^>]*)>/gi,"&lt;script$1&gt;");return s=s.replace(/<\/script>/gi,"&lt;/script&gt;"),s=s.replace(/<script([^>]*)\s*\/>/gi,"&lt;script$1 /&gt;"),s};for(let i=0;i<o.length;i++){let s=o[i],c=o.slice(i,i+7),m=o.slice(i,i+8);if(!r&&c==="<think>"){r=!0,e+=`<div class="${a}">`,i+=6;continue}if(r&&m==="</think>"){r=!1,e+="</div>",i+=7;continue}r?t+=s:e+=s}if(t){let i=n(t),s=re.render(i);e=e.replace(`<div class="${a}">`,`<div class="${a}">${s}`)}return e},Ee=o=>o.replace(/\[source_id:\s*([^\]|]+)(?:\s*\|\s*category:\s*([^\]]+))?\]\.?/g,(e,t,r)=>r?`<source-tag data-source-id="${t.trim()}" data-category="${r.trim()}"></source-tag>`:`<source-tag data-source-id="${t.trim()}"></source-tag>`),H=o=>{let e=je(o),t=Te(e),r=Se(t),a=Ee(r);return re.render(a)};var C=class{constructor(e){this.font={body:'"Inter", sans-serif',mono:'"JetBrains Mono", monospace'};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=Y;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),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.init().then(()=>{this.mount(),this.store.subscribe(()=>{let t=this.store.getState(),r=t?.chat?.mode,{chatData:a,streamingMessage:n,isLoading:i}=t?.chatSessions?.[t?.chat?.activeSession]??{};this.handleModeChange(r),this.handleChatDataChange({streamingMessage:n,chatData:a,isLoading:i})})})}injectThemeVars(){let e=this.TOKENS,t=document.createElement("style");t.textContent=`
1051
+ `)}}parse(){let e=this.extractOutput(),t=this.detectModelVersion(),o=[];return t==="gpt4"?o=e?.filter(({message:n})=>n?.content).map(n=>this.normalizeGPT4Choice(n)):t==="gpt5"?o=e?.filter(n=>n?.content?.length>0).map(n=>this.normalizeGPT5Output(n)):t==="file-chat"&&(o=e?.filter(({text:n})=>n)?.map(n=>this.normalizeFileChatResponse(n))),{messages:o,model:t,raw:this.rawResponse}}};var ee=async({baseURL:r,payload:e,apikey:t})=>{try{return await(await fetch("https://"+r+"/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"}}},P=async({baseURL:r,payload:e,apikey:t})=>{try{return await(await fetch("https://"+r+"/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 Be={},z={query:"",chatData:[],streamingMessage:null,isLoading:!1},re=(0,q.createSlice)({name:"chatSession",initialState:Be,reducers:{initSession:(r,e)=>{let t=e.payload;r[t]||(r[t]=z)},setLoading:(r,e)=>{let{sessionId:t,loading:o}=e.payload;r[t]||(r[t]=z),r[t].isLoading=o},setQuery:(r,e)=>{let{sessionId:t,query:o}=e.payload;r[t]||(r[t]=z),r[t].query=o},appendChatData:(r,e)=>{let{sessionId:t,chatData:o}=e.payload;r[t]||(r[t]=z),r[t].chatData=[...r[t].chatData||[],...o]},setChatData:(r,e)=>{let{sessionId:t,chatData:o}=e.payload;r[t]||(r[t]=z),r[t].chatData=o},setStreamingMessage:(r,e)=>{let{sessionId:t,message:o}=e.payload;r[t]&&(r[t].streamingMessage=o)}}}),{initSession:Pe,setQuery:D,setChatData:qt,appendChatData:te,setStreamingMessage:_,setLoading:oe}=re.actions,ne=(0,q.createAsyncThunk)("chatSession/streamResponse",async({sessionId:r,query:e,indexName:t,config:{backendURL:o,apikey:n,userid:a}},{getState:s,dispatch:i})=>{let c=s(),{chatData:d,isLoading:l}=c.chatSessions[r];if(!e?.trim()||l)return;i(oe({sessionId:r,loading:!0}));let p={query:e,a:{choices:[]}};i(_({sessionId:r,message:p})),i(D({sessionId:r,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:L}=new C(g).parse(),k=L?.map(j=>j?.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 ee({baseURL:o,apikey:n,payload:{name:t,qnum:m?m+1:1,fall_back:f,type:v?"kpi":void 0,sessionid:r,userid:a,prev_qa:v?void 0:h,query:p?.query}}),S=new C(w),{raw:x,messages:E}=S.parse();if(i(oe({sessionId:r,loading:!1})),E?.length>0){for(let g=0;g<E.length;g++){let k=(E[g]?.output||"")?.split(" "),j="";for(let A=0;A<k.length;A++)await new Promise(ze=>setTimeout(ze,20)),j=j+(j?" ":"")+k[A],i(_({sessionId:r,message:{...p,a:{choices:[{message:{content:j}}]}}}))}i(te({sessionId:r,chatData:[{...x,query:p?.query}]})),i(_({sessionId:r,message:null}))}else i(te({sessionId:r,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"}}]}}]}))}),ae=(0,q.createAsyncThunk)("chatSession/initializeState",async({indexName:r},{dispatch:e})=>{let t="GUEST_SESSION";e(Y(r)),e(Q(t)),e(Pe(t))});var ie=re.reducer;var le=(0,se.configureStore)({reducer:{chat:Z,chatSessions:ie}});var F=R(require("highlight.js")),pe=R(require("markdown-it")),he=R(require("@vscode/markdown-it-katex"));var _e=function(r,e,t){let o=t,n=0,a=r.length;for(;o<e.length;){let s=e[o];if(n<=0&&e.slice(o,o+a)===r)return o;s==="\\"?o++:s==="{"?n++:s==="}"&&n--,o++}return-1},Fe=function(r){return r.replace(/[-/\\^$*+?.()|[\]{}]/g,"\\$&")},Ue=/^\\begin{/,Ke=function(r,e){let t,o=[],n=new RegExp("("+e.map(a=>Fe(a.left)).join("|")+")");for(;t=r.search(n),t!==-1;){t>0&&(o.push({type:"text",data:r.slice(0,t)}),r=r.slice(t));let a=e.findIndex(c=>r.startsWith(c.left));if(t=_e(e[a].right,r,e[a].left.length),t===-1)break;let s=r.slice(0,t+e[a].right.length),i=Ue.test(s)?s:r.slice(e[a].left.length,t);o.push({type:"math",data:i,rawData:s,display:e[a].display}),r=r.slice(t+e[a].right.length)}return r!==""&&o.push({type:"text",data:r}),o},de=Ke;var Ut=require("katex/dist/contrib/mhchem.min.js");function ce(r){return new Promise(e=>{setTimeout(e,r)})}var me=require("lodash"),be=new pe.default({html:!0,breaks:!0,linkify:!0,highlight:function(r,e){let t=e??"auto";if(e&&F.default.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">`+F.default.highlight(r,{language:t,ignoreIllegals:!0}).value+"</code></pre>"}catch{}return'<pre><code class="hljs">'+r+"</code></pre>"}}).enable(["table","code","fence","blockquote","heading","lheading","paragraph"]).enable(["autolink","linkify","backticks","image","link","newline"]).enable(["emphasis","html_inline"]).use(he.default);typeof window<"u"&&window.document.addEventListener("click",r=>{if(r.target?.classList?.contains("ai-chat-code-copy")){let e=r.target.parentNode?.nextSibling?.innerText;navigator.clipboard.writeText(e).then(async()=>{r.target.innerHTML='<span style="margin-right:3px">Copied</span>\u2705',await ce(3e3),r.target.innerText="Copy"}).catch(t=>{alert(`Error copying code: ${t.message}`)})}});var Ge={fn:r=>{r()}},Gt=(0,me.debounce)((r=()=>{})=>{Ge.fn(r)},10);var Ve=r=>r.replace(/(```mermaid)(?![^]*?```)/g,"```"),We=r=>de(r,[{left:"\\[",right:"\\]",display:!0},{left:"\\(",right:"\\)",display:!1}]).reduce((t,o)=>{if(o.type==="text")return t+o.data;let n=o.display?`$$${o.data}$$`:`$${o.data}$`;return t+n},""),Je=r=>{let e="",t="",o=!1,n="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<r.length;s++){let i=r[s],c=r.slice(s,s+7),d=r.slice(s,s+8);if(!o&&c==="<think>"){o=!0,e+=`<div class="${n}">`,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=be.render(s);e=e.replace(`<div class="${n}">`,`<div class="${n}">${i}`)}return e},Ye=r=>r.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=r=>{let e=Je(r),t=We(e),o=Ve(t),n=Ye(o);return be.render(n)};var fe=R(require("echarts")),Qt=require("echarts/theme/dark-bold.js"),T=require("ag-grid-community");function ge(r,e="",t={}){if(typeof r!="object"||r===null||Array.isArray(r))return t;for(let[o,n]of Object.entries(r)){let a=e?`${e}.${o}`:o;typeof n=="object"&&n!==null&&!Array.isArray(n)?ge(n,a,t):t[a]=n}return t}var Qe=["#5470c6","#c5e542","#9d9ec1","#ee6666","#73c0de","#3ba272","#fc8452","#9a60b4","#ea7ccc"],Xe={color:Qe,backgroundColor:"transparent",tooltip:{trigger:"axis",axisPointer:{type:"shadow"}},legend:{show:!0,type:"scroll",bottom:0,top:null},toolbox:{show:!0,feature:{saveAsImage:{}}}},N=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 n=[...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=>ge(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";n.push({title:a,type:l,options:{...Xe,...this.toChartSeries(d,l)}})}else n.push({title:a,type:"table",options:{columns:Array.from(new Set(i.flatMap(d=>Object.keys(d)))),rows:i}})}return e.length>0?{charts:n,errors:e}:{charts:n}}extractArrays(e,t){if(Array.isArray(e)){let o=e.flatMap((a,s)=>Array.isArray(a)?[]:[a]),n=e.flatMap((a,s)=>Array.isArray(a)?this.extractArrays(a,[...t,`[${s}]`]):[]);return[...o.length?[{title:t.length?t.join("."):"Root Data",items:o}]:[],...n]}return e&&typeof e=="object"?Object.entries(e).flatMap(([o,n])=>this.extractArrays(n,[...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),n=o.filter(s=>typeof e[0]?.[s]=="string"),a=o.filter(s=>typeof e[0]?.[s]=="number");return a.length===0||n.length>1?null:{labelKey:n[0]??"__auto__",valueKeys:a}}isSimpleCategoricalPie(e){return e.length?e.every(t=>t.values.length===1):!1}convertToChartData(e,t){return e.map((o,n)=>{let a=t.labelKey==="__auto__"?null:o[t.labelKey];return{labelValue:a!=null?String(a):`Item ${n+1}`,labelKey:t.labelKey,values:t.valueKeys.map(i=>({[i]:Number(o[i])||0}))}})}toChartSeries(e,t){if(t==="bar"){let n={};return e.forEach((a,s)=>{a.values.forEach(i=>{let[c,d]=Object.entries(i)[0];n[c]||(n[c]=new Array(e.length).fill(0)),n[c][s]=d})}),{xAxis:{type:"category",data:e.map(a=>a.labelValue).filter(Boolean)},yAxis:{type:"value"},series:Object.entries(n).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(n=>({name:n.labelValue,value:n.values[0]?.[o]??0}))}]}}};var ue=!1;function Ze(){ue||(T.ModuleRegistry.registerModules([T.AllCommunityModule]),ue=!0)}var et=T.themeQuartz.withPart(T.colorSchemeVariable).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 tt(r){if(typeof r!="string")return!1;try{return JSON.parse(r),!0}catch{return!1}}function ot(r,e){return r<=1||e==="table"?1:e==="card"?Math.min(r,4):2}function rt(r,e){return e===1||r==="table"?"1 / -1":"span 1"}function nt(r){let e=document.createElement("div");e.style.cssText=`
1053
+ background: var(--card);
1054
+ border-radius: var(--radius-md);
1055
+ padding: 1rem 1.25rem;
1056
+ display: flex;
1057
+ flex-direction: column;
1058
+ gap: 0.5rem;
1059
+ height: 6rem;
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(r.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 n=r.value;return typeof n=="number"&&Number.isFinite(n)&&!Number.isInteger(n)?o.textContent=String(Number.parseFloat(n.toFixed(4))):o.textContent=String(n??"\u2014"),e.appendChild(t),e.appendChild(o),e}function at(r){Ze();let e=document.createElement("div");e.style.cssText="width: 100%; height: 400px;";let t={theme:et,rowData:r.rows,columnDefs:(r.columns??[]).map(n=>({headerName:n,field:n})),pagination:!0,paginationPageSize:50,animateRows:!0},o=()=>{e.__bdbGridInitialized||(e.__bdbGridInitialized=!0,(0,T.createGrid)(e,t))};return requestAnimationFrame(()=>{if(e.isConnected)o();else{let n=new MutationObserver(()=>{e.isConnected&&(n.disconnect(),o())});n.observe(document.body,{childList:!0,subtree:!0})}}),e}function it(r,e){let t=document.createElement("div");t.style.cssText=`
1062
+ width: 100%;
1063
+ height: 360px;
1064
+ `;let o=null,n=()=>{if(o)return;o=fe.init(t,"dark-bold",{renderer:"canvas"}),o.setOption(r,!0),new ResizeObserver(()=>o?.resize()).observe(t)};return requestAnimationFrame(()=>{if(document.contains(t)||t.isConnected)n();else{let a=new MutationObserver(()=>{t.isConnected&&(a.disconnect(),n())});a.observe(document.body,{childList:!0,subtree:!0})}}),t}function ye(r){let e=document.createElement("div");e.style.cssText="margin-top: 1rem; display: flex; flex-direction: column; gap: 1.25rem;";let t=r;if(tt(r))try{t=JSON.parse(r)}catch{return e}let o=t?.tool_results??[];if(!o.length)return e;let n=o.length;for(let a=0;a<o.length;a++){let s=o[a],i=s?.data;if(!i)continue;let{charts:c}=new N(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=`
1065
+ font-size: 13px;
1066
+ font-weight: 600;
1067
+ color: var(--foreground);
1068
+ margin: 0 0 0.25rem 0;
1069
+ font-family: var(--font-body);
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=`
1072
+ font-size: 12px;
1073
+ color: var(--muted-foreground);
1074
+ margin: 0 0 0.75rem 0;
1075
+ font-family: var(--font-body);
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=ot(n,c[0]?.type),m=document.createElement("div");m.style.cssText=`
1078
+ display: grid;
1079
+ grid-template-columns: repeat(${p}, minmax(0, 1fr));
1080
+ gap: 0.5rem;
1081
+ width: 100%;
1082
+ padding: 1rem 0;
1083
+ `;for(let h=0;h<c.length;h++){let b=c[h],u=document.createElement("div");u.style.gridColumn=rt(b.type,n);let f;switch(b.type){case"card":f=nt(b.options);break;case"table":f=at(b.options);break;case"bar":case"pie":f=it(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 we(r,e="",t={}){for(let o in r){let n=r[o],a=e?`${e}.${o}`:o;typeof n=="object"&&n!==null&&!Array.isArray(n)?we(n,a,t):(typeof n=="number"||typeof n=="string")&&(t[a]=n)}return t}var ve=`<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
1084
+ <rect width="14" height="14" x="8" y="8" rx="2" ry="2"/>
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>`,st=`<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
1087
+ <circle cx="12" cy="12" r="10"/>
1088
+ <path d="M12 16v-4M12 8h.01"/>
1089
+ </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">
1090
+ <circle cx="12" cy="12" r="1"/><circle cx="19" cy="12" r="1"/><circle cx="5" cy="12" r="1"/>
1091
+ </svg>`,dt=`<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
1092
+ <path d="M20 6 9 17l-5-5"/>
1093
+ </svg>`,ct=`
1094
+ display: inline-flex;
1095
+ align-items: center;
1096
+ justify-content: center;
1097
+ width: 30px;
1098
+ height: 30px;
1099
+ border-radius: var(--radius-md);
1100
+ border: 1px solid var(--border);
1101
+ background: var(--card);
1102
+ color: var(--muted-foreground);
1103
+ cursor: pointer;
1104
+ transition: background 0.15s, color 0.15s, border-color 0.15s;
1105
+ flex-shrink: 0;
1106
+ `;function U(r,e){let t=document.createElement("button");return t.setAttribute("aria-label",e),t.style.cssText=ct,t.innerHTML=r,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 pt(r,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
+ position: absolute;
1108
+ bottom: calc(100% + 6px);
1109
+ right: 0;
1110
+ min-width: 220px;
1111
+ background: var(--card);
1112
+ border: 1px solid var(--border);
1113
+ border-radius: var(--radius-md);
1114
+ box-shadow: 0 8px 24px rgba(0,0,0,0.35);
1115
+ z-index: 100;
1116
+ overflow: hidden;
1117
+ animation: bdb-fade-in 0.12s ease;
1118
+ `;let n=document.createElement("div");n.style.cssText=`
1119
+ font-size: 11px;
1120
+ font-weight: 600;
1121
+ color: var(--muted-foreground);
1122
+ padding: 0.5rem 0.75rem 0.375rem;
1123
+ letter-spacing: 0.05em;
1124
+ text-transform: uppercase;
1125
+ border-bottom: 1px solid var(--border);
1126
+ `,n.textContent="Usage Stats",o.appendChild(n);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=`
1127
+ display: flex;
1128
+ align-items: center;
1129
+ justify-content: space-between;
1130
+ gap: 0.5rem;
1131
+ padding: 0.3rem 0.75rem;
1132
+ font-size: 12px;
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=r.parentElement;s.style.position="relative",s.appendChild(o);let i=c=>{!o.contains(c.target)&&c.target!==r&&(o.remove(),document.removeEventListener("click",i,!0))};setTimeout(()=>document.addEventListener("click",i,!0),0)}function xe(r){let{textToCopy:e,usageData:t,onInfo:o}=r,n=document.createElement("div");n.style.cssText=`
1135
+ display: flex;
1136
+ align-items: center;
1137
+ justify-content: space-between;
1138
+ gap: 0.5rem;
1139
+ padding: 0.375rem 0;
1140
+ min-height: 38px;
1141
+ `;let a=document.createElement("div");a.style.cssText="display: flex; align-items: center; gap: 6px;";let s=U(ve,"Copy to clipboard");if(s.addEventListener("click",async()=>{try{await navigator.clipboard.writeText(e),s.innerHTML=dt,s.style.color="var(--primary)",s.style.borderColor="var(--primary)",setTimeout(()=>{s.innerHTML=ve,s.style.color="",s.style.borderColor=""},2e3)}catch{}}),a.appendChild(s),o){let i=U(st,"View response context");i.addEventListener("click",()=>o()),a.appendChild(i)}if(n.appendChild(a),t&&typeof t=="object"){let i=we(t);if(Object.keys(i).length>0){let c=document.createElement("div");c.style.cssText="display: flex; align-items: center; position: relative;";let d=U(lt,"Show usage stats");d.addEventListener("click",l=>{l.stopPropagation(),pt(d,i)}),c.appendChild(d),n.appendChild(c)}}return n}var ke=!1;function ht(r){if(ke)return;ke=!0;let e=document.createElement("style");e.textContent=`
1142
+ @keyframes bdb-drawer-in {
1143
+ from { transform: translateX(100%); opacity: 0; }
1144
+ to { transform: translateX(0); opacity: 1; }
1145
+ }
1146
+ @keyframes bdb-drawer-out {
1147
+ from { transform: translateX(0); opacity: 1; }
1148
+ to { transform: translateX(100%); opacity: 0; }
1149
+ }
1150
+ @keyframes bdb-fade-in {
1151
+ from { opacity: 0; transform: translateY(4px); }
1152
+ to { opacity: 1; transform: translateY(0); }
1153
+ }
1154
+
1155
+ .bdb-drawer-overlay {
1156
+ position: fixed;
1157
+ inset: 0;
1158
+ background: rgba(0,0,0,0.45);
1159
+ z-index: 1000000;
1160
+ backdrop-filter: blur(2px);
1161
+ animation: bdb-fade-in 0.18s ease;
1162
+ }
1163
+
1164
+ .bdb-drawer-panel {
1165
+ position: fixed;
1166
+ top: 0;
1167
+ right: 0;
1168
+ bottom: 0;
1169
+ width: min(520px, 100vw);
1170
+ background: var(--background);
1171
+ border-left: 1px solid var(--border);
1172
+ z-index: 1000001;
1173
+ display: flex;
1174
+ flex-direction: column;
1175
+ overflow: hidden;
1176
+ animation: bdb-drawer-in 0.22s cubic-bezier(0.32, 0.72, 0, 1) both;
1177
+ font-family: var(--font-body);
1178
+ }
1179
+
1180
+ .bdb-drawer-header {
1181
+ display: flex;
1182
+ align-items: center;
1183
+ justify-content: space-between;
1184
+ padding: 0 1.25rem;
1185
+ height: 3.25rem;
1186
+ flex-shrink: 0;
1187
+ border-bottom: 1px solid var(--border);
1188
+ background: var(--card);
1189
+ }
1190
+
1191
+ .bdb-drawer-title {
1192
+ font-size: 14px;
1193
+ font-weight: 600;
1194
+ color: var(--foreground);
1195
+ margin: 0;
1196
+ }
1197
+
1198
+ .bdb-drawer-close {
1199
+ display: flex;
1200
+ align-items: center;
1201
+ justify-content: center;
1202
+ width: 28px;
1203
+ height: 28px;
1204
+ border-radius: var(--radius-md);
1205
+ border: none;
1206
+ background: transparent;
1207
+ color: var(--muted-foreground);
1208
+ cursor: pointer;
1209
+ transition: background 0.15s, color 0.15s;
1210
+ }
1211
+
1212
+ .bdb-drawer-close:hover {
1213
+ background: color-mix(in oklab, var(--foreground) 8%, transparent);
1214
+ color: var(--foreground);
1215
+ }
1216
+
1217
+ .bdb-drawer-tabs {
1218
+ display: flex;
1219
+ border-bottom: 1px solid var(--border);
1220
+ flex-shrink: 0;
1221
+ background: var(--card);
1222
+ }
1223
+
1224
+ .bdb-drawer-tab {
1225
+ flex: 1;
1226
+ padding: 0.65rem 0.75rem;
1227
+ font-size: 12px;
1228
+ font-weight: 500;
1229
+ text-align: center;
1230
+ cursor: pointer;
1231
+ border: none;
1232
+ background: transparent;
1233
+ color: var(--muted-foreground);
1234
+ border-bottom: 2px solid transparent;
1235
+ transition: color 0.15s, border-color 0.15s;
1236
+ font-family: var(--font-body);
1237
+ }
1238
+
1239
+ .bdb-drawer-tab:hover {
1240
+ color: var(--foreground);
1241
+ }
1242
+
1243
+ .bdb-drawer-tab.active {
1244
+ color: var(--foreground);
1245
+ border-bottom-color: var(--primary);
1246
+ }
1247
+
1248
+ .bdb-drawer-body {
1249
+ flex: 1;
1250
+ overflow-y: auto;
1251
+ scrollbar-width: thin;
1252
+ scrollbar-color: color-mix(in oklab, var(--foreground) 12%, transparent) transparent;
1253
+ }
1254
+
1255
+ .bdb-drawer-tab-content {
1256
+ display: none;
1257
+ padding: 1.25rem;
1258
+ height: 100%;
1259
+ box-sizing: border-box;
1260
+ }
1261
+
1262
+ .bdb-drawer-tab-content.active {
1263
+ display: block;
1264
+ }
1265
+
1266
+ .bdb-json-pre {
1267
+ background: var(--card);
1268
+ border: 1px solid var(--border);
1269
+ border-radius: var(--radius-md);
1270
+ padding: 1rem;
1271
+ font-family: var(--font-mono, "JetBrains Mono", monospace);
1272
+ font-size: 11.5px;
1273
+ line-height: 1.65;
1274
+ color: var(--foreground);
1275
+ white-space: pre-wrap;
1276
+ word-break: break-all;
1277
+ overflow-x: auto;
1278
+ margin: 0;
1279
+ }
1280
+
1281
+ /* Simple JSON syntax coloring */
1282
+ .bdb-json-pre .json-key { color: #88aece; }
1283
+ .bdb-json-pre .json-str { color: #b5bd68; }
1284
+ .bdb-json-pre .json-num { color: #f08d49; }
1285
+ .bdb-json-pre .json-bool { color: #c59bc1; }
1286
+ .bdb-json-pre .json-null { color: #de7176; }
1287
+ `,r.appendChild?r.appendChild(e):document.head.appendChild(e)}function mt(r){return JSON.stringify(r,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 bt(r,e,t){r.forEach(o=>o.classList.toggle("active",o.dataset.tab===t)),e.forEach(o=>o.classList.toggle("active",o.dataset.content===t))}function Ce(r){let{item:e,indexName:t,shadowRoot:o,onClose:n}=r;ht(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">
1288
+ <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:L})=>{let k=document.createElement("button");k.className="bdb-drawer-tab"+(g==="response"?" active":""),k.dataset.tab=g,k.textContent=L,k.addEventListener("click",()=>{let j=i.querySelectorAll(".bdb-drawer-tab"),A=i.querySelectorAll(".bdb-drawer-tab-content");bt(j,A,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=`
1290
+ display: flex;
1291
+ justify-content: flex-end;
1292
+ margin-bottom: 1rem;
1293
+ `;let L=document.createElement("div");L.style.cssText=`
1294
+ max-width: 80%;
1295
+ background: var(--secondary);
1296
+ color: var(--secondary-foreground);
1297
+ border-radius: 18px 18px 4px 18px;
1298
+ padding: 0.6rem 1rem;
1299
+ font-size: 13px;
1300
+ line-height: 1.55;
1301
+ word-break: break-word;
1302
+ `,L.textContent=e.query,g.appendChild(L),b.appendChild(g)}let u=new C(e),{messages:f}=u.parse(),v=f.map(g=>g.output??"").join(`
1303
+
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=H(v),b.appendChild(g)}h.appendChild(b);let w=document.createElement("div");w.className="bdb-drawer-tab-content",w.dataset.content="json";let S=document.createElement("pre");S.className="bdb-json-pre",S.innerHTML=mt(e),w.appendChild(S),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(),n()},180)}let E=g=>{g.key==="Escape"&&(x(),document.removeEventListener("keydown",E))};return document.addEventListener("keydown",E),a}var Te=require("jspdf");function Ee(r,e){let t=URL.createObjectURL(r),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 Se(r){let{messages:e}=new C(r).parse();return e.map(t=>t.output).filter(Boolean).join(`
1305
+
1306
+ `)}function Le(r,e){let t=`# ${e}
1307
+
1308
+ `;t+=`*Exported on ${new Date().toLocaleString()}*
1309
+
1310
+ `,t+=`---
1311
+
1312
+ `;for(let n of r){n.query&&(t+=`**User:**
1313
+ ${n.query}
1314
+
1315
+ `);let a=Se(n);a&&(t+=`**AI:**
1316
+ ${a}
1317
+
1318
+ `)}let o=new Blob([t],{type:"text/markdown"});Ee(o,`chat-${new Date().toISOString().split("T")[0]}.md`)}function je(r,e){try{let t=new Te.jsPDF,o=t.internal.pageSize.height,n=t.internal.pageSize.width,a=14,s=n-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 r){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=Se(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,`
1319
+
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");Ee(d,`chat-${new Date().toISOString().split("T")[0]}.pdf`)}catch(t){console.error("[BangDB] PDF export failed:",t)}}var I=class I{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||I.DEFAULT_TOOLS,o=new Set(I.DEFAULT_TOOLS.map(n=>n.id));this.tools=t.filter(n=>o.has(n.id)).map(n=>({id:n.id,name:n.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 n=this.store.getState(),a=n?.chat?.mode,{chatData:s,streamingMessage:i,isLoading:c}=n?.chatSessions?.[n?.chat?.activeSession]??{};this.handleModeChange(a),this.handleChatDataChange({streamingMessage:i,chatData:s,isLoading:c})})})}injectThemeVars(){let e=this.TOKENS,t=document.createElement("style");t.textContent=`
1053
1321
  :host {
1054
1322
  --background: ${e.background};
1055
1323
  --foreground: ${e.foreground};
@@ -1078,13 +1346,16 @@ code.hljs {
1078
1346
  --font-body: ${this.font.body};
1079
1347
  --font-mono: ${this.font.mono};
1080
1348
  }
1081
- `,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 r=document.createElement("link");r.rel="preconnect",r.href="https://fonts.gstatic.com",r.crossOrigin="";let a=document.createElement("link");a.type="text/css",a.rel="stylesheet",a.href=e,this.root.appendChild(t),this.root.appendChild(r),this.root.appendChild(a),document.head.appendChild(t),document.head.appendChild(r),document.head.appendChild(a)}mount(){let e=this.createChatBubble();this.root.appendChild(e),this.bubbleEl=e}async init(){await this.store.dispatch(Q({indexName:this.apiConfig?.indexName}))}handleChatDataChange({chatData:e,streamingMessage:t,isLoading:r}){if(!this.chatAreaEl)return;e||(e=[]);let a=this.chatAreaEl.querySelector(".chat-data-container"),n=this.chatAreaEl.querySelector("#bangdb-chat-area"),i=this.chatAreaEl.querySelector("#bdb-empty-state"),s=()=>{requestAnimationFrame(()=>{n.scrollTo({top:n.scrollHeight,behavior:"smooth"})})},c=e.length>0||!!t?.query;i.style.display=c?"none":"flex";for(let d=0;d<e.length;d++){let p=e[d],h=`msg-${d}`;if(p?.query&&!this.renderedMessageIds.has(h)){this.renderedMessageIds.add(h),a.insertBefore(this.userRequestMessage(p.query),a.querySelector("#chat-window-anchor"));let w=new u(p),{messages:S}=w.parse();S?.length>0&&a.insertBefore(this.aiResponseMessage(p),a.querySelector("#chat-window-anchor")),s()}}let m="bdb-streaming-msg",l=this.root.querySelector(`#${m}`);if(t?.query){l||(l=document.createElement("div"),l.id=m,a.insertBefore(l,a.querySelector("#chat-window-anchor")),l.appendChild(this.userRequestMessage(t.query)),l.style.minHeight=`${n.clientHeight*.8}px`);let d=l.querySelector(".bdb-streaming-ai-area"),p=t.output?.output??"";if(r&&!p&&!d)d=document.createElement("div"),d.className="bdb-streaming-ai-area",d.appendChild(this.loadingIndicator()),l.appendChild(d);else if(p){d||(d=document.createElement("div"),d.className="bdb-streaming-ai-area",l.appendChild(d));let h=d.querySelector(".ai-md");h?h.innerHTML=H(p):(d.innerHTML="",d.appendChild(this.aiResponseMessage(t)))}i.style.display="none",s()}else l&&(l.style.minHeight="",l.remove())}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 n=this.chatUIEl.querySelector(".bdb-chat-panel");n&&(n.style.animation="bdb-panel-out 0.18s ease-in both",n&&(n.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 n=this.chatUIEl.querySelector(".bdb-chat-panel");n&&(n.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");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 n=this.chatUIEl.querySelector(".bdb-chat-panel");n&&(n.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.add("is-fullscreen");break}}createChatBubble(){let e=document.createElement("div");return e.classList.add("bdb-bubble-container"),e.innerHTML=`
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 n=document.createElement("link");n.type="text/css",n.rel="stylesheet",n.href=e,this.root.appendChild(t),this.root.appendChild(o),this.root.appendChild(n),document.head.appendChild(t),document.head.appendChild(o),document.head.appendChild(n)}mount(){let e=this.createChatBubble();this.root.appendChild(e),this.bubbleEl=e}async init(){await this.store.dispatch(ae({indexName:this.apiConfig?.indexName}))}handleChatDataChange({chatData:e,streamingMessage:t,isLoading:o}){if(!this.chatAreaEl)return;e||(e=[]);let n=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),n.insertBefore(this.userRequestMessage(u.query),n.querySelector("#chat-window-anchor"));let v=new C(u),{messages:w}=v.parse();w?.length>0&&n.insertBefore(this.aiResponseMessage(u),n.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,n.insertBefore(l,n.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=H(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 n=this.chatUIEl.querySelector(".bdb-chat-panel");n&&(n.style.animation="bdb-panel-out 0.18s ease-in both",n&&(n.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 n=this.chatUIEl.querySelector(".bdb-chat-panel");n&&(n.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 n=this.chatUIEl.querySelector(".bdb-chat-panel");n&&(n.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,n=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+n/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=`
1082
1350
  <style>
1083
1351
  .bdb-bubble-container {
1084
1352
  position: fixed;
1085
1353
  bottom: 1.5rem;
1086
1354
  right: 1.5rem;
1087
1355
  z-index: 999999;
1356
+ width: 52px;
1357
+ height: 52px;
1358
+ overflow: visible;
1088
1359
  }
1089
1360
 
1090
1361
  .chat-bubble::before {
@@ -1155,7 +1426,7 @@ code.hljs {
1155
1426
  </svg>
1156
1427
  </span>
1157
1428
  </button>
1158
- `,e.querySelector(".chat-bubble").addEventListener("click",()=>{let{chat:r}=this.store.getState();r?.mode===0?this.store.dispatch(v(1)):this.store.dispatch(v(0))}),e}createChatUI(){let e=document.createElement("div");e.innerHTML=`
1429
+ `,e.addEventListener("click",()=>{if(e._didDrag)return;let{chat:t}=this.store.getState();t?.mode===0?this.store.dispatch(M(1)):this.store.dispatch(M(0))});{let t=!1,o=0,n=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,n=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-n;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],S=1/0;for(let x of v){let E=Math.hypot(x.left+l/2-u,x.top+p/2-f);E<S&&(S=E,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=`
1159
1430
  <style>
1160
1431
  .bdb-chat-widget {
1161
1432
  display: flex;
@@ -1249,12 +1520,51 @@ code.hljs {
1249
1520
  color: var(--foreground);
1250
1521
  }
1251
1522
 
1523
+ .bdb-download-dropdown {
1524
+ position: absolute;
1525
+ top: 100%;
1526
+ right: 0;
1527
+ margin-top: 4px;
1528
+ background: var(--card);
1529
+ border: 1px solid var(--border);
1530
+ border-radius: var(--radius-md);
1531
+ box-shadow: 0 4px 12px rgba(0,0,0,0.2);
1532
+ display: none;
1533
+ flex-direction: column;
1534
+ min-width: 140px;
1535
+ z-index: 1000;
1536
+ padding: 4px;
1537
+ }
1538
+
1539
+ .bdb-download-dropdown.show {
1540
+ display: flex;
1541
+ }
1542
+
1543
+ .bdb-dropdown-item {
1544
+ display: flex;
1545
+ align-items: center;
1546
+ gap: 8px;
1547
+ padding: 8px 12px;
1548
+ border: none;
1549
+ background: transparent;
1550
+ color: var(--foreground);
1551
+ font-size: 13px;
1552
+ cursor: pointer;
1553
+ border-radius: var(--radius-sm);
1554
+ text-align: left;
1555
+ font-family: inherit;
1556
+ }
1557
+
1558
+ .bdb-dropdown-item:hover {
1559
+ background: var(--secondary);
1560
+ }
1561
+
1252
1562
  .bdb-chat-panel {
1253
1563
  display: flex;
1254
1564
  flex-direction: column;
1255
- position: fixed;
1256
- bottom: 5.5rem;
1257
- right: 1.5rem;
1565
+ position: absolute;
1566
+ bottom: 68px;
1567
+ right: 0;
1258
1568
  width: 500px;
1259
1569
  height: 750px;
1260
1570
  background: var(--background);
@@ -1273,18 +1583,22 @@ code.hljs {
1273
1583
  }
1274
1584
 
1275
1585
  .bdb-chat-panel.is-fullscreen {
1276
- bottom: 0;
1277
- right: 0;
1278
- left: 0;
1279
- top: 0;
1280
- width: 100vw;
1281
- height: 100vh;
1282
- border-radius: 0;
1586
+ position: fixed !important;
1587
+ inset: 0 !important;
1588
+ top: 0 !important;
1589
+ left: 0 !important;
1590
+ right: 0 !important;
1591
+ bottom: 0 !important;
1592
+ width: 100vw !important;
1593
+ height: 100vh !important;
1594
+ border-radius: 0 !important;
1283
1595
  display: flex;
1284
1596
  align-items: center;
1285
1597
  justify-content: center;
1286
- background: color-mix(in oklab, var(--card) 55%, transparent);
1287
- backdrop-filter: blur(2px);
1598
+ background: color-mix(in oklab, var(--card) 55%, transparent) !important;
1599
+ backdrop-filter: blur(2px) !important;
1600
+ transform: none !important;
1601
+ margin: 0 !important;
1288
1602
  }
1289
1603
 
1290
1604
  .bdb-chat-panel.is-fullscreen .bdb-chat-widget {
@@ -1308,18 +1622,29 @@ code.hljs {
1308
1622
  <h3 class="bdb-chat-title">${this.chatTitle}</h3>
1309
1623
  </div>
1310
1624
 
1311
- <div class="bdb-header-actions">
1625
+ <div class="bdb-header-actions" style="position: relative;">
1312
1626
  <button class="bdb-icon-btn js-fullscreen-btn" aria-label="Toggle fullscreen" title="Fullscreen">
1313
1627
  <svg width="15" height="15" viewBox="0 0 15 15" fill="none" xmlns="http://www.w3.org/2000/svg">
1314
1628
  <path d="M1.5 1h4v1.5h-2.5v2.5h-1.5v-4zm8 0h4v4h-1.5v-2.5h-2.5v-1.5zm-8 8h1.5v2.5h2.5v1.5h-4v-4zm10.5 2.5v-2.5h1.5v4h-4v-1.5h2.5z" fill="currentColor"/>
1315
1629
  </svg>
1316
1630
  </button>
1317
1631
 
1318
- <!-- <button class="bdb-icon-btn js-download-btn" aria-label="Download chat" title="Download">-->
1319
- <!-- <svg width="15" height="15" viewBox="0 0 15 15" fill="none" xmlns="http://www.w3.org/2000/svg">-->
1320
- <!-- <path d="M7.5 10.5l-4-4h2.5v-5h3v5h2.5l-4 4zm-5 2h10v1.5h-10v-1.5z" fill="currentColor"/>-->
1321
- <!-- </svg>-->
1322
- <!-- </button>-->
1632
+ <button class="bdb-icon-btn js-download-btn" aria-label="Download chat" title="Download">
1633
+ <svg width="15" height="15" viewBox="0 0 15 15" fill="none" xmlns="http://www.w3.org/2000/svg">
1634
+ <path d="M7.5 10.5l-4-4h2.5v-5h3v5h2.5l-4 4zm-5 2h10v1.5h-10v-1.5z" fill="currentColor"/>
1635
+ </svg>
1636
+ </button>
1637
+
1638
+ <div class="bdb-download-dropdown" id="bdb-download-dropdown">
1639
+ <button class="bdb-dropdown-item" id="js-download-md">
1640
+ <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>
1641
+ Markdown (.md)
1642
+ </button>
1643
+ <button class="bdb-dropdown-item" id="js-download-pdf">
1644
+ <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
+ PDF (.pdf)
1646
+ </button>
1647
+ </div>
1323
1648
 
1324
1649
  <button class="bdb-icon-btn js-close-btn" aria-label="Close chat" title="Close">
1325
1650
  <svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
@@ -1332,7 +1657,7 @@ code.hljs {
1332
1657
  <div class="bdb-chat-body" style="display: flex; flex-direction: column; flex: 1; overflow: hidden;"></div>
1333
1658
  </div>
1334
1659
  </div>
1335
- `;let t=e.querySelector(".bdb-chat-panel"),r=e.querySelector(".bdb-chat-body"),a=e.querySelector(".bdb-chat-title-container");if(t.querySelector(".js-fullscreen-btn")?.addEventListener("click",()=>{this.store.getState().chat.mode===2?this.store.dispatch(v(1)):this.store.dispatch(v(2))}),t.querySelector(".js-close-btn")?.addEventListener("click",()=>{let n=this.store.getState().chat.mode;n===2?this.store.dispatch(v(1)):n===1&&this.store.dispatch(v(0))}),this.logoUrl){let n=document.createElement("div"),i=document.createElement("img");i.src=this.logoUrl,i.style.cssText="width: 24px; height: 24px; margin-right: 0.5rem;",n.appendChild(i),a.prepend(n)}return r.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=`
1660
+ `;let t=e.querySelector(".bdb-chat-panel"),o=e.querySelector(".bdb-chat-body"),n=e.querySelector(".bdb-chat-title-container");if(t.querySelector(".js-fullscreen-btn")?.addEventListener("click",()=>{this.store.getState().chat.mode===2?this.store.dispatch(M(1)):this.store.dispatch(M(2))}),t.querySelector(".js-close-btn")?.addEventListener("click",()=>{let d=this.store.getState().chat.mode;d===2?this.store.dispatch(M(1)):d===1&&this.store.dispatch(M(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),n.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",()=>{Le(d(),this.chatTitle),s.classList.remove("show")}),c?.addEventListener("click",()=>{je(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=`
1336
1661
  <style>
1337
1662
  .bdb-scroll {
1338
1663
  scrollbar-width: thin;
@@ -1387,22 +1712,44 @@ code.hljs {
1387
1712
  bottom: 0.5rem;
1388
1713
  left: 50%;
1389
1714
  transform: translateX(-50%);
1390
- background: var(--card);
1391
- border: 1px solid var(--border);
1392
- border-radius: var(--radius-full);
1715
+ background: var(--primary);
1716
+ color: var(--primary-foreground);
1393
1717
  width: 32px;
1394
1718
  height: 32px;
1719
+ border-radius: 50%;
1395
1720
  display: flex;
1396
1721
  align-items: center;
1397
1722
  justify-content: center;
1398
1723
  cursor: pointer;
1399
- color: var(--foreground);
1400
- box-shadow: 0 4px 12px rgba(0,0,0,0.4);
1401
- transition: opacity 0.2s, transform 0.2s;
1402
1724
  opacity: 0;
1403
1725
  pointer-events: none;
1726
+ transition: opacity 0.2s, transform 0.2s;
1727
+ box-shadow: 0 2px 8px rgba(0,0,0,0.15);
1728
+ border: none;
1404
1729
  z-index: 10;
1405
1730
  }
1731
+
1732
+ .bdb-chat-widget table {
1733
+ width: 100%;
1734
+ border-collapse: collapse;
1735
+ margin-top: 0.5rem;
1736
+ font-size: 14px;
1737
+ }
1738
+ .bdb-chat-widget th {
1739
+ text-align: left;
1740
+ font-weight: 600;
1741
+ padding: 8px 12px;
1742
+ border-bottom: 1px solid var(--border);
1743
+ color: var(--muted-foreground);
1744
+ }
1745
+ .bdb-chat-widget td {
1746
+ padding: 8px 12px;
1747
+ border-bottom: 1px solid var(--border);
1748
+ color: var(--foreground);
1749
+ }
1750
+ .bdb-chat-widget tr:last-child td {
1751
+ border-bottom: none;
1752
+ }
1406
1753
  .bdb-scroll-fab.visible {
1407
1754
  opacity: 1;
1408
1755
  pointer-events: auto;
@@ -1446,7 +1793,7 @@ code.hljs {
1446
1793
  <div id="chat-query-container"
1447
1794
  style="flex-shrink: 0; background: var(--background); padding: 0.75rem 1rem 1rem;">
1448
1795
  </div>
1449
- `;let t=e.querySelector("#bangdb-chat-area"),r=e.querySelector("#chat-query-container"),a=e.querySelector("#bdb-scroll-fab");return r.appendChild(this.chatQueryForm()),t.addEventListener("scroll",()=>{let n=t.scrollHeight-t.scrollTop-t.clientHeight;a.classList.toggle("visible",n>100)}),a.addEventListener("click",()=>{t.scrollTo({top:t.scrollHeight,behavior:"smooth"})}),this.chatAreaEl=e,e}loadingIndicator(){let e=document.createElement("div");return e.innerHTML=`
1796
+ `;let t=e.querySelector("#bangdb-chat-area"),o=e.querySelector("#chat-query-container"),n=e.querySelector("#bdb-scroll-fab");return o.appendChild(this.chatQueryForm()),t.addEventListener("scroll",()=>{let a=t.scrollHeight-t.scrollTop-t.clientHeight;n.classList.toggle("visible",a>100)}),n.addEventListener("click",()=>{t.scrollTo({top:t.scrollHeight,behavior:"smooth"})}),this.chatAreaEl=e,e}loadingIndicator(){let e=document.createElement("div");return e.innerHTML=`
1450
1797
  <style>
1451
1798
  .bdb-loading {
1452
1799
  display: flex;
@@ -1496,17 +1843,17 @@ code.hljs {
1496
1843
  }
1497
1844
  </style>
1498
1845
  <div class="bdb-user-bubble"></div>
1499
- `,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;",t.innerHTML=`
1500
- <style>
1501
- ${U}
1502
- ${R}
1503
-
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
+ ${V}
1848
+ ${G}
1849
+
1504
1850
  .ai-md pre {
1505
1851
  padding: 1rem;
1506
1852
  background: var(--card);
1507
1853
  border-radius: var(--radius-md);
1508
1854
  }
1509
-
1855
+
1856
+ /* Bubble wrapper \u2014 flex column so charts + action bar stack below text */
1510
1857
  .bdb-ai-bubble {
1511
1858
  flex: 1;
1512
1859
  min-width: 0;
@@ -1514,29 +1861,35 @@ code.hljs {
1514
1861
  font-size: 14px;
1515
1862
  line-height: 1.65;
1516
1863
  color: var(--foreground);
1864
+ display: flex;
1865
+ flex-direction: column;
1866
+ gap: 0;
1517
1867
  }
1518
- </style>
1519
-
1520
- <div class="bdb-ai-bubble ai-md prose"></div>
1521
- `;let r=t.querySelector(".ai-md");if(r){let a=new u(e),{messages:n}=a.parse(),i=n.map(s=>s?.output??"").join("");r.innerHTML=H(i),this.renderSourceTags(r,e)}return t}async renderSourceTags(e,t){let r=e.querySelectorAll("source-tag");if(!r.length)return;let a=t?.a?.metadata||t?.metadata||[];for(let n of r){let i=n.getAttribute("data-source-id"),s=n.getAttribute("data-category");if(!i||i.toLowerCase()==="na"){n.remove();continue}let c=document.createElement("span");c.style.cssText="display: block; padding: 0.75rem 0;";let m=i.split("##"),l=m[1]??i,d=m[2],p=document.createElement("span");if(p.style.cssText="display: block; font-size: 12px; color: var(--accent-foreground); padding-bottom: 0.5rem;",p.innerHTML=`
1868
+
1869
+ @keyframes bdb-fade-in {
1870
+ from { opacity: 0; transform: translateY(4px); }
1871
+ to { opacity: 1; transform: translateY(0); }
1872
+ }
1873
+ `,t.appendChild(o);let n=document.createElement("div");n.className="bdb-ai-bubble",t.appendChild(n);let a=document.createElement("div");a.className="ai-md prose",n.appendChild(a);let s=new C(e),{messages:i}=s.parse(),c=i.map(u=>u?.output??"").join("");a.innerHTML=H(c),this.renderSourceTags(a,e);let d=e?._data??e?.a?._data;if(d){let u=ye(String(d));u.children.length>0&&n.appendChild(u)}let l=i.map(u=>u?.output??"").join(`
1874
+
1875
+ `),p=e?.a?.usage??null,m=this.apiConfig?.indexName??"",h=this.root,b=xe({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=Ce({item:e,indexName:m,shadowRoot:h,onClose:()=>f.remove()});f.appendChild(v),h.appendChild(f)}});return n.appendChild(b),t}async renderSourceTags(e,t){let o=e.querySelectorAll("source-tag");if(!o.length)return;let n=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=`
1522
1876
  <span style="text-decoration: underline; color: var(--accent-foreground);">
1523
1877
  Source: ${decodeURIComponent(l)}
1524
- ${d?`<span style="padding: 0 0.5rem;">|</span>Page: ${d}`:""}
1878
+ ${p?`<span style="padding: 0 0.5rem;">|</span>Page: ${p}`:""}
1525
1879
  </span>
1526
- ${s?`<span style="padding: 0 0.5rem;">|</span>Category: ${s}`:""}
1527
- `,c.appendChild(p),a.length>0){let h=a.find(w=>w?.source_id===i);h?.table_ids?.length&&await this.renderTables(c,h.table_ids),h?.image_ids?.length&&await this.renderImages(c,h.image_ids)}n.replaceWith(c)}}async renderTables(e,t){for(let r of t){let a=document.createElement("div");a.innerHTML=`<div style="display:grid;grid-template-columns:repeat(9,1fr);gap:2px;">
1880
+ ${i?`<span style="padding: 0 0.5rem;">|</span>Category: ${i}`:""}
1881
+ `,c.appendChild(m),n.length>0){let h=n.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 n=document.createElement("div");n.innerHTML=`<div style="display:grid;grid-template-columns:repeat(9,1fr);gap:2px;">
1528
1882
  ${Array.from({length:36}).map(()=>'<div style="height:2rem;background:rgba(255,255,255,0.05);border-radius:2px;"></div>').join("")}
1529
- </div>`,e.appendChild(a);try{let n=await A({baseURL:this.apiConfig.backendURL,apikey:this.apiConfig.apikey,payload:{name:this.apiConfig.indexName,type:"table",id:r}});n?.metadata?.text_as_html&&(a.innerHTML=`<div style="overflow-x:auto;margin-bottom:1rem;">${n.metadata.text_as_html}</div>`)}catch{a.innerHTML='<div style="color:#f87171;font-size:12px;margin-bottom:0.5rem;">Failed to load table</div>'}}}async renderImages(e,t){let r=document.createElement("div");r.style.cssText="display: grid; grid-template-columns: repeat(auto-fill, minmax(140px, 1fr)); gap: 0.75rem; margin-top: 0.5rem;",e.appendChild(r);let{backendURL:a,resourceURL:n,apikey:i,indexName:s}=this.apiConfig,c=`${s}_img_bucket`;for(let m 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>',r.appendChild(l);try{let d=await A({baseURL:a,apikey:i,payload:{name:s,type:"image",id:m}});if(!d?.file_name){l.remove();continue}let p=`https://${n}/brs/get/${i}/${c}/${m}_${d.file_name}`;l.innerHTML=`
1530
- <div style="height:8rem; background-image:url('${p}'); background-size:cover; background-position:center; cursor:pointer;"></div>
1531
- <div style="padding:0.375rem 0.5rem; font-size:11px; color:#a1a1aa; overflow:hidden; text-overflow:ellipsis; white-space:nowrap;">${d.file_name}</div>
1532
- `,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="${p}" 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=`
1883
+ </div>`,e.appendChild(n);try{let a=await P({baseURL:this.apiConfig.backendURL,apikey:this.apiConfig.apikey,payload:{name:this.apiConfig.indexName,type:"table",id:o}});a?.metadata?.text_as_html&&(n.innerHTML=`<div style="overflow-x:auto;margin-bottom:1rem;">${a.metadata.text_as_html}</div>`)}catch{n.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:n,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 P({baseURL:n,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=`
1533
1887
  <style>
1534
1888
  .bdb-form-wrap {
1535
1889
  border-radius: var(--radius-lg);
1536
1890
  border: 1px solid var(--input);
1537
1891
  background: var(--card);
1538
1892
  transition: border-color 0.18s, box-shadow 0.18s;
1539
- overflow: hidden;
1540
1893
  }
1541
1894
 
1542
1895
  .bdb-form-wrap:focus-within {
@@ -1571,11 +1924,106 @@ code.hljs {
1571
1924
  .bdb-form-footer {
1572
1925
  display: flex;
1573
1926
  align-items: center;
1574
- justify-content: flex-end;
1927
+ justify-content: space-between;
1575
1928
  padding: 0.4rem 0.625rem 0.625rem;
1576
1929
  gap: 0.5rem;
1577
1930
  }
1578
1931
 
1932
+ .bdb-form-tools-left {
1933
+ display: flex;
1934
+ align-items: center;
1935
+ gap: 0.5rem;
1936
+ }
1937
+
1938
+ .bdb-tools-btn {
1939
+ display: flex;
1940
+ align-items: center;
1941
+ gap: 0.375rem;
1942
+ padding: 0.375rem 0.625rem;
1943
+ border-radius: var(--radius-md);
1944
+ border: none;
1945
+ background: transparent;
1946
+ color: var(--muted-foreground);
1947
+ font-size: 13px;
1948
+ font-family: var(--font-body);
1949
+ font-weight: 500;
1950
+ cursor: pointer;
1951
+ transition: color 0.15s, background 0.15s;
1952
+ }
1953
+
1954
+ .bdb-tools-btn:hover {
1955
+ background: color-mix(in oklab, var(--foreground) 6%, transparent);
1956
+ color: var(--foreground);
1957
+ }
1958
+
1959
+ .bdb-tools-dropdown {
1960
+ position: absolute;
1961
+ bottom: calc(100% + 8px);
1962
+ left: 0;
1963
+ min-width: 200px;
1964
+ background: var(--card);
1965
+ border: 1px solid var(--border);
1966
+ border-radius: var(--radius-md);
1967
+ box-shadow: 0 8px 24px rgba(0,0,0,0.35);
1968
+ z-index: 100;
1969
+ padding: 0.375rem;
1970
+ display: none;
1971
+ flex-direction: column;
1972
+ animation: bdb-fade-in 0.12s ease;
1973
+ }
1974
+
1975
+ .bdb-tools-dropdown.show {
1976
+ display: flex;
1977
+ }
1978
+
1979
+ .bdb-tool-item {
1980
+ padding: 0.4rem 0.75rem;
1981
+ font-size: 13px;
1982
+ color: var(--foreground);
1983
+ cursor: pointer;
1984
+ border-radius: calc(var(--radius-md) - 2px);
1985
+ transition: background 0.15s;
1986
+ text-align: left;
1987
+ border: none;
1988
+ background: transparent;
1989
+ font-family: var(--font-body);
1990
+ }
1991
+
1992
+ .bdb-tool-item:hover {
1993
+ background: color-mix(in oklab, var(--foreground) 6%, transparent);
1994
+ }
1995
+
1996
+ .bdb-tool-badge {
1997
+ display: inline-flex;
1998
+ align-items: center;
1999
+ gap: 0.25rem;
2000
+ padding: 0.125rem 0.375rem 0.125rem 0.5rem;
2001
+ background: color-mix(in oklab, var(--primary) 15%, transparent);
2002
+ color: var(--primary);
2003
+ border-radius: var(--radius-sm);
2004
+ font-size: 12px;
2005
+ font-weight: 500;
2006
+ }
2007
+
2008
+ .bdb-tool-clear {
2009
+ display: inline-flex;
2010
+ align-items: center;
2011
+ justify-content: center;
2012
+ width: 16px;
2013
+ height: 16px;
2014
+ border-radius: 50%;
2015
+ border: none;
2016
+ background: transparent;
2017
+ color: inherit;
2018
+ cursor: pointer;
2019
+ opacity: 0.7;
2020
+ }
2021
+ .bdb-tool-clear:hover {
2022
+ opacity: 1;
2023
+ background: color-mix(in oklab, var(--primary) 20%, transparent);
2024
+ }
2025
+
2026
+
1579
2027
  .bdb-send-btn {
1580
2028
  display: flex;
1581
2029
  align-items: center;
@@ -1611,9 +2059,26 @@ code.hljs {
1611
2059
  aria-label="Chat message"
1612
2060
  ></textarea>
1613
2061
  <div class="bdb-form-footer">
2062
+ <div class="bdb-form-tools-left">
2063
+ <div id="bdb-active-tool-badge" class="bdb-tool-badge" style="display: none;">
2064
+ <span id="bdb-active-tool-name"></span>
2065
+ <button class="bdb-tool-clear" aria-label="Clear tool">
2066
+ <svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><line x1="18" y1="6" x2="6" y2="18"></line><line x1="6" y1="6" x2="18" y2="18"></line></svg>
2067
+ </button>
2068
+ </div>
2069
+ <div style="position: relative;">
2070
+ <button class="bdb-tools-btn" id="bdb-tools-trigger" aria-haspopup="true" aria-expanded="false">
2071
+ <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="3"></circle><path d="M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1 0 2.83 2 2 0 0 1-2.83 0l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-2 2 2 2 0 0 1-2-2v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83 0 2 2 0 0 1 0-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1-2-2 2 2 0 0 1 2-2h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 0-2.83 2 2 0 0 1 2.83 0l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 2-2 2 2 0 0 1 2 2v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 0 2 2 0 0 1 0 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 2 2 2 2 0 0 1-2 2h-.09a1.65 1.65 0 0 0-1.51 1z"></path></svg>
2072
+ Tools
2073
+ </button>
2074
+ <div class="bdb-tools-dropdown" id="bdb-tools-dropdown">
2075
+ <!-- Dynamically populated -->
2076
+ </div>
2077
+ </div>
2078
+ </div>
1614
2079
  <button class="bdb-send-btn" disabled aria-label="Send message">
1615
2080
  <svg xmlns="http://www.w3.org/2000/svg" width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-send" aria-hidden="true"><path d="M14.536 21.686a.5.5 0 0 0 .937-.024l6.5-19a.496.496 0 0 0-.635-.635l-19 6.5a.5.5 0 0 0-.024.937l7.93 3.18a2 2 0 0 1 1.112 1.11z"></path><path d="m21.854 2.147-10.94 10.939"></path></svg>
1616
2081
  </button>
1617
2082
  </div>
1618
2083
  </div>
1619
- `;let t=e.querySelector(".bdb-textarea"),r=e.querySelector(".bdb-send-btn"),a=()=>{t.style.height="auto",t.style.height=Math.min(t.scrollHeight,180)+"px"};return this.store.subscribe(()=>{let{chatSessions:n,chat:i}=this.store.getState(),s=n[i.activeSession]?.query||"";t.value!==s&&(t.value=s,a(),r.disabled=!s.trim())}),t.addEventListener("input",()=>{a();let n=t.value;r.disabled=!n.trim();let{activeSession:i}=this.store.getState().chat;this.store.dispatch(M({sessionId:i,query:n}))}),t.addEventListener("keydown",async n=>{n.key==="Enter"&&!n.shiftKey&&(n.preventDefault(),r.disabled||await this.sendQuery())}),r.addEventListener("click",()=>this.sendQuery()),e}async sendQuery(){let{chatSessions:e,chat:t}=this.store.getState(),{activeSession:r,activeIndex:a}=t,{query:n}=e[r],i={query:n,output:[]};this.store.dispatch(M({sessionId:r,query:""})),await this.store.dispatch(G({query:i?.query,sessionId:r,indexName:a,config:this.apiConfig}))}downloadChat(){}};var ae=null;function ne(o){return ae=new C(o),ae}typeof window<"u"&&(window.BangdbChatWidget={init:ne});0&&(module.exports={ChatWidget,init});
2084
+ `;let t=e.querySelector(".bdb-textarea"),o=e.querySelector(".bdb-send-btn"),n=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?n.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(b.id));this.store.dispatch(X({id:p.id,name:p.name})),i.textContent=p.name,s.style.display="inline-flex",a.classList.remove("show")}),a.appendChild(m)}),n.addEventListener("click",p=>{p.stopPropagation(),a.classList.toggle("show")}),document.addEventListener("click",p=>{!a.contains(p.target)&&p.target!==n&&a.classList.remove("show")})),c.addEventListener("click",()=>{let p=this.store.getState().chat.tools;for(let m of p)this.store.dispatch(B(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(D({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:n}=t,{query:a,isLoading:s}=e[o];if(s||!a?.trim())return;let i={query:a,output:[]};this.store.dispatch(D({sessionId:o,query:""})),await this.store.dispatch(ne({query:i?.query,sessionId:o,indexName:n,config:this.apiConfig}))}downloadChat(){}};I.DEFAULT_TOOLS=[{id:"kpi",name:"KPI (MCP)"}];var O=I;var Me=null;function Ae(r){return Me=new O(r),Me}typeof window<"u"&&(window.BangdbChatWidget={init:Ae});0&&(module.exports={ChatWidget,init});