@bangdb/web-sdk 1.0.6 → 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.d.mts +8 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.global.js +1043 -136
- package/dist/index.js +518 -53
- package/dist/index.mjs +518 -53
- package/package.json +37 -29
package/dist/index.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
var
|
|
1
|
+
var B=`
|
|
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
|
|
586
|
+
}`;var P=`
|
|
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
|
-
`;import{configureStore as
|
|
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(`
|
|
1050
1050
|
|
|
1051
|
-
`)}}parse(){let e=this.extractOutput(),t=this.detectModelVersion(),
|
|
1052
|
-
`);return!g?.query||!
|
|
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,"<script$1>");return i=i.replace(/<\/script>/gi,"</script>"),i=i.replace(/<script([^>]*)\s*\/>/gi,"<script$1 />"),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=`
|
|
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(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=`
|
|
1062
|
+
width: 100%;
|
|
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=`
|
|
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=Je(r,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=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">
|
|
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>`,et=`<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>`,tt=`<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>`,ot=`<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>`,rt=`
|
|
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 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=`
|
|
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 r=document.createElement("div");r.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
|
+
`,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=`
|
|
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=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=`
|
|
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=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=`
|
|
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
|
+
`,n.appendChild?n.appendChild(e):document.head.appendChild(e)}function it(n){return JSON.stringify(n,null,2).replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").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">
|
|
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: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=`
|
|
1290
|
+
display: flex;
|
|
1291
|
+
justify-content: flex-end;
|
|
1292
|
+
margin-bottom: 1rem;
|
|
1293
|
+
`;let S=document.createElement("div");S.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
|
+
`,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(`
|
|
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=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(`
|
|
1305
|
+
|
|
1306
|
+
`)}function fe(n,e){let t=`# ${e}
|
|
1307
|
+
|
|
1308
|
+
`;t+=`*Exported on ${new Date().toLocaleString()}*
|
|
1309
|
+
|
|
1310
|
+
`,t+=`---
|
|
1311
|
+
|
|
1312
|
+
`;for(let r of n){r.query&&(t+=`**User:**
|
|
1313
|
+
${r.query}
|
|
1314
|
+
|
|
1315
|
+
`);let a=ue(r);a&&(t+=`**AI:**
|
|
1316
|
+
${a}
|
|
1317
|
+
|
|
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,`
|
|
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");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=`
|
|
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
|
|
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=`
|
|
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.
|
|
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=`
|
|
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:
|
|
1256
|
-
bottom:
|
|
1257
|
-
right:
|
|
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
|
-
|
|
1277
|
-
|
|
1278
|
-
|
|
1279
|
-
|
|
1280
|
-
|
|
1281
|
-
|
|
1282
|
-
|
|
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
|
-
|
|
1319
|
-
|
|
1320
|
-
|
|
1321
|
-
|
|
1322
|
-
|
|
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"),
|
|
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=`
|
|
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(--
|
|
1391
|
-
|
|
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"),
|
|
1796
|
+
`;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=`
|
|
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;"
|
|
1500
|
-
|
|
1501
|
-
${
|
|
1502
|
-
|
|
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
|
+
${P}
|
|
1848
|
+
${B}
|
|
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
|
-
|
|
1519
|
-
|
|
1520
|
-
|
|
1521
|
-
|
|
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 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(`
|
|
1874
|
+
|
|
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=`
|
|
1522
1876
|
<span style="text-decoration: underline; color: var(--accent-foreground);">
|
|
1523
1877
|
Source: ${decodeURIComponent(l)}
|
|
1524
|
-
${
|
|
1878
|
+
${p?`<span style="padding: 0 0.5rem;">|</span>Page: ${p}`:""}
|
|
1525
1879
|
</span>
|
|
1526
|
-
${
|
|
1527
|
-
`,c.appendChild(
|
|
1880
|
+
${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;">
|
|
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(
|
|
1530
|
-
<div style="height:8rem; background-image:url('${
|
|
1531
|
-
<div style="padding:0.375rem 0.5rem; font-size:11px; color:#a1a1aa; overflow:hidden; text-overflow:ellipsis; white-space:nowrap;">${
|
|
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="${
|
|
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=`
|
|
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:
|
|
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"),
|
|
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};
|