llmxray 0.5.1 → 0.6.0

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.
Files changed (53) hide show
  1. package/README.ar.md +10 -7
  2. package/README.fr.md +10 -7
  3. package/README.md +10 -7
  4. package/README.sr.md +10 -7
  5. package/README.zh-CN.md +10 -7
  6. package/dist/assets/{AITrainingPage-Cb771S8Z.js → AITrainingPage-E06gN8gf.js} +1 -1
  7. package/dist/assets/{AnalyticsPage-D4bgNoXM.js → AnalyticsPage-DE1P_0ls.js} +1 -1
  8. package/dist/assets/{BenchmarkPage-BTfBJXIj.js → BenchmarkPage-aPSp8X68.js} +1 -1
  9. package/dist/assets/CacheLabPage-DK6ysPiC.js +3 -0
  10. package/dist/assets/{ComparisonPage-DMcD9JL0.js → ComparisonPage-B-TTYJzF.js} +1 -1
  11. package/dist/assets/{CostDashboardPage-BjUiVjlg.js → CostDashboardPage-uaU9LjEe.js} +1 -1
  12. package/dist/assets/{DashboardPage-xgeJtl-Q.js → DashboardPage-i7XFboZS.js} +1 -1
  13. package/dist/assets/{EmbeddingsPage-DY1JKxCN.js → EmbeddingsPage-BIj9zAA3.js} +1 -1
  14. package/dist/assets/{FimPlaygroundPage-BWSlc3k7.js → FimPlaygroundPage-BQLvqvU_.js} +1 -1
  15. package/dist/assets/{GoogleCallbackPage-C9xQpfMW.js → GoogleCallbackPage-eAe26FFg.js} +1 -1
  16. package/dist/assets/{JsonTreeNode-D9YzXU8h.js → JsonTreeNode-CWxvNXOX.js} +1 -1
  17. package/dist/assets/{ModelCapabilityIcons.vue_vue_type_script_setup_true_lang-CPvepOP2.js → ModelCapabilityIcons.vue_vue_type_script_setup_true_lang-B5ZTvJWj.js} +1 -1
  18. package/dist/assets/{ProtocolObservatoryPage-D7szMZuY.js → ProtocolObservatoryPage--sesoYfn.js} +1 -1
  19. package/dist/assets/{RAGPage-C7awGOKp.js → RAGPage-CEwQVaIo.js} +1 -1
  20. package/dist/assets/{SessionPage-8CBF4JLG.js → SessionPage-BZ6kBsHI.js} +1 -1
  21. package/dist/assets/SettingsPage-CnF1KHWK.js +1 -0
  22. package/dist/assets/{StatusBadge.vue_vue_type_script_setup_true_lang-BPTPrdQf.js → StatusBadge.vue_vue_type_script_setup_true_lang-BGo19Xph.js} +1 -1
  23. package/dist/assets/{StorageGauge.vue_vue_type_style_index_0_lang-a4pXCCmZ.js → StorageGauge.vue_vue_type_style_index_0_lang-CUFDMHxV.js} +1 -1
  24. package/dist/assets/{SystemPage-mElnkuG4.js → SystemPage-B6rcHN5S.js} +2 -2
  25. package/dist/assets/{TabBar.vue_vue_type_script_setup_true_lang-g3X_zm3P.js → TabBar.vue_vue_type_script_setup_true_lang-C0hGnp0C.js} +1 -1
  26. package/dist/assets/{TokenStreamDisplay.vue_vue_type_script_setup_true_lang-DQBSq5z2.js → TokenStreamDisplay.vue_vue_type_script_setup_true_lang-CW2jbXwZ.js} +1 -1
  27. package/dist/assets/{ToolWorkshopPage-3Za0iXSV.js → ToolWorkshopPage-DmrV0xap.js} +1 -1
  28. package/dist/assets/{agent-store-Cboc3nde.js → agent-store--SqycFe6.js} +1 -1
  29. package/dist/assets/{canvas-ai-db-Dy65jrST.js → canvas-ai-db-Da1vIVOq.js} +1 -1
  30. package/dist/assets/{download-Cipln2ej.js → download-CUsL7GrM.js} +1 -1
  31. package/dist/assets/{generate-service-C8to1Kz5.js → generate-service-BZdEHgFU.js} +1 -1
  32. package/dist/assets/{google-auth-store-8ShUecGK.js → google-auth-store-DXrzgrLv.js} +1 -1
  33. package/dist/assets/{index-NGfHHJ7k.js → index-BPkqt5Qe.js} +1 -1
  34. package/dist/assets/{index-UYM0582r.css → index-C78FkuPP.css} +1 -1
  35. package/dist/assets/{index-DlTtfQCm.js → index-C8P_C63i.js} +1 -1
  36. package/dist/assets/{index-DAqgYcEq.js → index-YRiA3BUj.js} +11 -11
  37. package/dist/assets/{info-BzNBY8Xz.js → info-DH8FG2G3.js} +1 -1
  38. package/dist/assets/{metrics-store-DLxxEHpn.js → metrics-store-BCparPrV.js} +1 -1
  39. package/dist/assets/{papaparse.min-BMNThItx.js → papaparse.min-Dopi_5A-.js} +1 -1
  40. package/dist/assets/{pencil-c-VIQAV1.js → pencil-gkZEyblB.js} +1 -1
  41. package/dist/assets/{play-CyV4NPEG.js → play-HRQny-4Y.js} +1 -1
  42. package/dist/assets/{rag-store-7BNJiZff.js → rag-store-D0yMVMjG.js} +3 -3
  43. package/dist/assets/{session-store-DJJV_fRl.js → session-store-2bGNgO7a.js} +1 -1
  44. package/dist/assets/{share-2-DTMUvOzC.js → share-2-c3XzX2pt.js} +1 -1
  45. package/dist/assets/{square-CVjmHbTf.js → square-CqZgk1mI.js} +1 -1
  46. package/dist/assets/{storage-store-CAp_Ass2.js → storage-store-BLDOaasz.js} +1 -1
  47. package/dist/assets/{stream-handler-DVtwM8Et.js → stream-handler-BGYCTeOR.js} +1 -1
  48. package/dist/assets/{tool-workshop-store-C_snrdcI.js → tool-workshop-store-DBnJxusu.js} +1 -1
  49. package/dist/assets/{toolcall-store-DVrrMX0Y.js → toolcall-store-CJSLkRLe.js} +1 -1
  50. package/dist/assets/{trash-2-DfEdg6Up.js → trash-2-DU091nIw.js} +1 -1
  51. package/dist/index.html +2 -2
  52. package/package.json +9 -1
  53. package/dist/assets/SettingsPage-MEHyheCY.js +0 -1
@@ -1 +1 @@
1
- import{c}from"./index-DAqgYcEq.js";const o=c("info",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M12 16v-4",key:"1dtifu"}],["path",{d:"M12 8h.01",key:"e9boi3"}]]);export{o as I};
1
+ import{c}from"./index-YRiA3BUj.js";const o=c("info",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M12 16v-4",key:"1dtifu"}],["path",{d:"M12 8h.01",key:"e9boi3"}]]);export{o as I};
@@ -1 +1 @@
1
- import{d as T,r as i,a as f}from"./index-DAqgYcEq.js";const M=T("metrics",()=>{const s=i(new Map),a=i({totalSessions:0,avgTtftMs:0,avgTps:0,avgTotalDurationMs:0,totalTokensGenerated:0,totalPromptsEvaluated:0,modelsUsed:[]}),d=f(()=>[...s.value.values()].sort((t,e)=>t.startedAt-e.startedAt));function g(t){return s.value.get(t)??null}function m(t,e){s.value.set(t,e)}function v(){const t=[...s.value.values()];if(t.length===0)return;const e=new Set;let n=0,l=0,r=0,u=0,c=0;for(const o of t)e.add(o.model),n+=o.ttftMs,l+=o.tokensPerSecond,r+=o.totalDurationMs,u+=o.completionTokenCount,c+=o.promptTokenCount;a.value={totalSessions:t.length,avgTtftMs:n/t.length,avgTps:l/t.length,avgTotalDurationMs:r/t.length,totalTokensGenerated:u,totalPromptsEvaluated:c,modelsUsed:[...e]}}return{metricsBySession:s,aggregate:a,metricsHistory:d,getMetrics:g,recordMetrics:m,recalculateAggregate:v}});export{M as u};
1
+ import{d as T,r as i,a as f}from"./index-YRiA3BUj.js";const M=T("metrics",()=>{const s=i(new Map),a=i({totalSessions:0,avgTtftMs:0,avgTps:0,avgTotalDurationMs:0,totalTokensGenerated:0,totalPromptsEvaluated:0,modelsUsed:[]}),d=f(()=>[...s.value.values()].sort((t,e)=>t.startedAt-e.startedAt));function g(t){return s.value.get(t)??null}function m(t,e){s.value.set(t,e)}function v(){const t=[...s.value.values()];if(t.length===0)return;const e=new Set;let n=0,l=0,r=0,u=0,c=0;for(const o of t)e.add(o.model),n+=o.ttftMs,l+=o.tokensPerSecond,r+=o.totalDurationMs,u+=o.completionTokenCount,c+=o.promptTokenCount;a.value={totalSessions:t.length,avgTtftMs:n/t.length,avgTps:l/t.length,avgTotalDurationMs:r/t.length,totalTokensGenerated:u,totalPromptsEvaluated:c,modelsUsed:[...e]}}return{metricsBySession:s,aggregate:a,metricsHistory:d,getMetrics:g,recordMetrics:m,recalculateAggregate:v}});export{M as u};
@@ -1,4 +1,4 @@
1
- import{az as ve}from"./index-DAqgYcEq.js";function be(G,ae){for(var Q=0;Q<ae.length;Q++){const m=ae[Q];if(typeof m!="string"&&!Array.isArray(m)){for(const M in m)if(M!=="default"&&!(M in G)){const B=Object.getOwnPropertyDescriptor(m,M);B&&Object.defineProperty(G,M,B.get?B:{enumerable:!0,get:()=>m[M]})}}}return Object.freeze(Object.defineProperty(G,Symbol.toStringTag,{value:"Module"}))}var se={exports:{}};var Ee=se.exports,ge;function we(){return ge||(ge=1,(function(G,ae){((Q,m)=>{G.exports=m()})(Ee,function Q(){var m=typeof self<"u"?self:typeof window<"u"?window:m!==void 0?m:{},M,B=!m.document&&!!m.postMessage,oe=m.IS_PAPA_WORKER||!1,te={},ye=0,u={};function K(e){this._handle=null,this._finished=!1,this._completed=!1,this._halted=!1,this._input=null,this._baseIndex=0,this._partialLine="",this._rowCount=0,this._start=0,this._nextChunk=null,this.isFirstChunk=!0,this._completeResults={data:[],errors:[],meta:{}},(function(t){var r=he(t);r.chunkSize=parseInt(r.chunkSize),t.step||t.chunk||(r.chunkSize=null),this._handle=new le(r),(this._handle.streamer=this)._config=r}).call(this,e),this.parseChunk=function(t,r){var n=parseInt(this._config.skipFirstNLines)||0;if(this.isFirstChunk&&0<n){let l=this._config.newline;l||(i=this._config.quoteChar||'"',l=this._handle.guessLineEndings(t,i)),t=[...t.split(l).slice(n)].join(l)}this.isFirstChunk&&k(this._config.beforeFirstChunk)&&(i=this._config.beforeFirstChunk(t))!==void 0&&(t=i),this.isFirstChunk=!1,this._halted=!1;var n=this._partialLine+t,i=(this._partialLine="",this._handle.parse(n,this._baseIndex,!this._finished));if(!this._handle.paused()&&!this._handle.aborted()){if(t=i.meta.cursor,n=(this._finished||(this._partialLine=n.substring(t-this._baseIndex),this._baseIndex=t),i&&i.data&&(this._rowCount+=i.data.length),this._finished||this._config.preview&&this._rowCount>=this._config.preview),oe)m.postMessage({results:i,workerId:u.WORKER_ID,finished:n});else if(k(this._config.chunk)&&!r){if(this._config.chunk(i,this._handle),this._handle.paused()||this._handle.aborted())return void(this._halted=!0);this._completeResults=i=void 0}return this._config.step||this._config.chunk||(this._completeResults.data=this._completeResults.data.concat(i.data),this._completeResults.errors=this._completeResults.errors.concat(i.errors),this._completeResults.meta=i.meta),this._completed||!n||!k(this._config.complete)||i&&i.meta.aborted||(this._config.complete(this._completeResults,this._input),this._completed=!0),n||i&&i.meta.paused||this._nextChunk(),i}this._halted=!0},this._sendError=function(t){k(this._config.error)?this._config.error(t):oe&&this._config.error&&m.postMessage({workerId:u.WORKER_ID,error:t,finished:!1})}}function re(e){var t;(e=e||{}).chunkSize||(e.chunkSize=u.RemoteChunkSize),K.call(this,e),this._nextChunk=B?function(){this._readChunk(),this._chunkLoaded()}:function(){this._readChunk()},this.stream=function(r){this._input=r,this._nextChunk()},this._readChunk=function(){if(this._finished)this._chunkLoaded();else{if(t=new XMLHttpRequest,this._config.withCredentials&&(t.withCredentials=this._config.withCredentials),B||(t.onload=H(this._chunkLoaded,this),t.onerror=H(this._chunkError,this)),t.open(this._config.downloadRequestBody?"POST":"GET",this._input,!B),this._config.downloadRequestHeaders){var r,n=this._config.downloadRequestHeaders;for(r in n)t.setRequestHeader(r,n[r])}var i;this._config.chunkSize&&(i=this._start+this._config.chunkSize-1,t.setRequestHeader("Range","bytes="+this._start+"-"+i));try{t.send(this._config.downloadRequestBody)}catch(l){this._chunkError(l.message)}B&&t.status===0&&this._chunkError()}},this._chunkLoaded=function(){t.readyState===4&&(t.status<200||400<=t.status?this._chunkError():(this._start+=this._config.chunkSize||t.responseText.length,this._finished=!this._config.chunkSize||this._start>=(r=>(r=r.getResponseHeader("Content-Range"))!==null?parseInt(r.substring(r.lastIndexOf("/")+1)):-1)(t),this.parseChunk(t.responseText)))},this._chunkError=function(r){r=t.statusText||r,this._sendError(new Error(r))}}function ie(e){(e=e||{}).chunkSize||(e.chunkSize=u.LocalChunkSize),K.call(this,e);var t,r,n=typeof FileReader<"u";this.stream=function(i){this._input=i,r=i.slice||i.webkitSlice||i.mozSlice,n?((t=new FileReader).onload=H(this._chunkLoaded,this),t.onerror=H(this._chunkError,this)):t=new FileReaderSync,this._nextChunk()},this._nextChunk=function(){this._finished||this._config.preview&&!(this._rowCount<this._config.preview)||this._readChunk()},this._readChunk=function(){var i=this._input,l=(this._config.chunkSize&&(l=Math.min(this._start+this._config.chunkSize,this._input.size),i=r.call(i,this._start,l)),t.readAsText(i,this._config.encoding));n||this._chunkLoaded({target:{result:l}})},this._chunkLoaded=function(i){this._start+=this._config.chunkSize,this._finished=!this._config.chunkSize||this._start>=this._input.size,this.parseChunk(i.target.result)},this._chunkError=function(){this._sendError(t.error)}}function Y(e){var t;K.call(this,e=e||{}),this.stream=function(r){return t=r,this._nextChunk()},this._nextChunk=function(){var r,n;if(!this._finished)return r=this._config.chunkSize,t=r?(n=t.substring(0,r),t.substring(r)):(n=t,""),this._finished=!t,this.parseChunk(n)}}function ne(e){K.call(this,e=e||{});var t=[],r=!0,n=!1;this.pause=function(){K.prototype.pause.apply(this,arguments),this._input.pause()},this.resume=function(){K.prototype.resume.apply(this,arguments),this._input.resume()},this.stream=function(i){this._input=i,this._input.on("data",this._streamData),this._input.on("end",this._streamEnd),this._input.on("error",this._streamError)},this._checkIsFinished=function(){n&&t.length===1&&(this._finished=!0)},this._nextChunk=function(){this._checkIsFinished(),t.length?this.parseChunk(t.shift()):r=!0},this._streamData=H(function(i){try{t.push(typeof i=="string"?i:i.toString(this._config.encoding)),r&&(r=!1,this._checkIsFinished(),this.parseChunk(t.shift()))}catch(l){this._streamError(l)}},this),this._streamError=H(function(i){this._streamCleanUp(),this._sendError(i)},this),this._streamEnd=H(function(){this._streamCleanUp(),n=!0,this._streamData("")},this),this._streamCleanUp=H(function(){this._input.removeListener("data",this._streamData),this._input.removeListener("end",this._streamEnd),this._input.removeListener("error",this._streamError)},this)}function le(e){var t,r,n,i,l=Math.pow(2,53),S=-l,F=/^\s*-?(\d+\.?|\.\d+|\d+\.\d+)([eE][-+]?\d+)?\s*$/,j=/^((\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+([+-][0-2]\d:[0-5]\d|Z))|(\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d([+-][0-2]\d:[0-5]\d|Z))|(\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d([+-][0-2]\d:[0-5]\d|Z)))$/,d=this,E=0,a=0,T=!1,h=!1,c=[],s={data:[],errors:[],meta:{}};function x(p){return e.skipEmptyLines==="greedy"?p.join("").trim()==="":p.length===1&&p[0].length===0}function O(){if(s&&n&&(z("Delimiter","UndetectableDelimiter","Unable to auto-detect delimiting character; defaulted to '"+u.DefaultDelimiter+"'"),n=!1),e.skipEmptyLines&&(s.data=s.data.filter(function(o){return!x(o)})),I()){let o=function(R,C){k(e.transformHeader)&&(R=e.transformHeader(R,C)),c.push(R)};if(s)if(Array.isArray(s.data[0])){for(var p=0;I()&&p<s.data.length;p++)s.data[p].forEach(o);s.data.splice(0,1)}else s.data.forEach(o)}function g(o,R){for(var C=e.header?{}:[],y=0;y<o.length;y++){var v=y,_=o[y],_=((P,f)=>(b=>(e.dynamicTypingFunction&&e.dynamicTyping[b]===void 0&&(e.dynamicTyping[b]=e.dynamicTypingFunction(b)),(e.dynamicTyping[b]||e.dynamicTyping)===!0))(P)?f==="true"||f==="TRUE"||f!=="false"&&f!=="FALSE"&&((b=>{if(F.test(b)&&(b=parseFloat(b),S<b&&b<l))return 1})(f)?parseFloat(f):j.test(f)?new Date(f):f===""?null:f):f)(v=e.header?y>=c.length?"__parsed_extra":c[y]:v,_=e.transform?e.transform(_,v):_);v==="__parsed_extra"?(C[v]=C[v]||[],C[v].push(_)):C[v]=_}return e.header&&(y>c.length?z("FieldMismatch","TooManyFields","Too many fields: expected "+c.length+" fields but parsed "+y,a+R):y<c.length&&z("FieldMismatch","TooFewFields","Too few fields: expected "+c.length+" fields but parsed "+y,a+R)),C}var w;s&&(e.header||e.dynamicTyping||e.transform)&&(w=1,!s.data.length||Array.isArray(s.data[0])?(s.data=s.data.map(g),w=s.data.length):s.data=g(s.data,0),e.header&&s.meta&&(s.meta.fields=c),a+=w)}function I(){return e.header&&c.length===0}function z(p,g,w,o){p={type:p,code:g,message:w},o!==void 0&&(p.row=o),s.errors.push(p)}k(e.step)&&(i=e.step,e.step=function(p){s=p,I()?O():(O(),s.data.length!==0&&(E+=p.data.length,e.preview&&E>e.preview?r.abort():(s.data=s.data[0],i(s,d))))}),this.parse=function(p,g,w){var o=e.quoteChar||'"',o=(e.newline||(e.newline=this.guessLineEndings(p,o)),n=!1,e.delimiter?k(e.delimiter)&&(e.delimiter=e.delimiter(p),s.meta.delimiter=e.delimiter):((o=((R,C,y,v,_)=>{var P,f,b,$;_=_||[","," ","|",";",u.RECORD_SEP,u.UNIT_SEP];for(var J=0;J<_.length;J++){for(var U,V=_[J],D=0,q=0,A=0,L=(b=void 0,new ue({comments:v,delimiter:V,newline:C,preview:10}).parse(R)),W=0;W<L.data.length;W++)y&&x(L.data[W])?A++:(U=L.data[W].length,q+=U,b===void 0?b=U:0<U&&(D+=Math.abs(U-b),b=U));0<L.data.length&&(q/=L.data.length-A),(f===void 0||D<=f)&&($===void 0||$<q)&&1.99<q&&(f=D,P=V,$=q)}return{successful:!!(e.delimiter=P),bestDelimiter:P}})(p,e.newline,e.skipEmptyLines,e.comments,e.delimitersToGuess)).successful?e.delimiter=o.bestDelimiter:(n=!0,e.delimiter=u.DefaultDelimiter),s.meta.delimiter=e.delimiter),he(e));return e.preview&&e.header&&o.preview++,t=p,r=new ue(o),s=r.parse(t,g,w),O(),T?{meta:{paused:!0}}:s||{meta:{paused:!1}}},this.paused=function(){return T},this.pause=function(){T=!0,r.abort(),t=k(e.chunk)?"":t.substring(r.getCharIndex())},this.resume=function(){d.streamer._halted?(T=!1,d.streamer.parseChunk(t,!0)):setTimeout(d.resume,3)},this.aborted=function(){return h},this.abort=function(){h=!0,r.abort(),s.meta.aborted=!0,k(e.complete)&&e.complete(s),t=""},this.guessLineEndings=function(R,o){R=R.substring(0,1048576);var o=new RegExp(X(o)+"([^]*?)"+X(o),"gm"),w=(R=R.replace(o,"")).split("\r"),o=R.split(`
1
+ import{aA as ve}from"./index-YRiA3BUj.js";function be(G,ae){for(var Q=0;Q<ae.length;Q++){const m=ae[Q];if(typeof m!="string"&&!Array.isArray(m)){for(const M in m)if(M!=="default"&&!(M in G)){const B=Object.getOwnPropertyDescriptor(m,M);B&&Object.defineProperty(G,M,B.get?B:{enumerable:!0,get:()=>m[M]})}}}return Object.freeze(Object.defineProperty(G,Symbol.toStringTag,{value:"Module"}))}var se={exports:{}};var Ee=se.exports,ge;function we(){return ge||(ge=1,(function(G,ae){((Q,m)=>{G.exports=m()})(Ee,function Q(){var m=typeof self<"u"?self:typeof window<"u"?window:m!==void 0?m:{},M,B=!m.document&&!!m.postMessage,oe=m.IS_PAPA_WORKER||!1,te={},ye=0,u={};function K(e){this._handle=null,this._finished=!1,this._completed=!1,this._halted=!1,this._input=null,this._baseIndex=0,this._partialLine="",this._rowCount=0,this._start=0,this._nextChunk=null,this.isFirstChunk=!0,this._completeResults={data:[],errors:[],meta:{}},(function(t){var r=he(t);r.chunkSize=parseInt(r.chunkSize),t.step||t.chunk||(r.chunkSize=null),this._handle=new le(r),(this._handle.streamer=this)._config=r}).call(this,e),this.parseChunk=function(t,r){var n=parseInt(this._config.skipFirstNLines)||0;if(this.isFirstChunk&&0<n){let l=this._config.newline;l||(i=this._config.quoteChar||'"',l=this._handle.guessLineEndings(t,i)),t=[...t.split(l).slice(n)].join(l)}this.isFirstChunk&&k(this._config.beforeFirstChunk)&&(i=this._config.beforeFirstChunk(t))!==void 0&&(t=i),this.isFirstChunk=!1,this._halted=!1;var n=this._partialLine+t,i=(this._partialLine="",this._handle.parse(n,this._baseIndex,!this._finished));if(!this._handle.paused()&&!this._handle.aborted()){if(t=i.meta.cursor,n=(this._finished||(this._partialLine=n.substring(t-this._baseIndex),this._baseIndex=t),i&&i.data&&(this._rowCount+=i.data.length),this._finished||this._config.preview&&this._rowCount>=this._config.preview),oe)m.postMessage({results:i,workerId:u.WORKER_ID,finished:n});else if(k(this._config.chunk)&&!r){if(this._config.chunk(i,this._handle),this._handle.paused()||this._handle.aborted())return void(this._halted=!0);this._completeResults=i=void 0}return this._config.step||this._config.chunk||(this._completeResults.data=this._completeResults.data.concat(i.data),this._completeResults.errors=this._completeResults.errors.concat(i.errors),this._completeResults.meta=i.meta),this._completed||!n||!k(this._config.complete)||i&&i.meta.aborted||(this._config.complete(this._completeResults,this._input),this._completed=!0),n||i&&i.meta.paused||this._nextChunk(),i}this._halted=!0},this._sendError=function(t){k(this._config.error)?this._config.error(t):oe&&this._config.error&&m.postMessage({workerId:u.WORKER_ID,error:t,finished:!1})}}function re(e){var t;(e=e||{}).chunkSize||(e.chunkSize=u.RemoteChunkSize),K.call(this,e),this._nextChunk=B?function(){this._readChunk(),this._chunkLoaded()}:function(){this._readChunk()},this.stream=function(r){this._input=r,this._nextChunk()},this._readChunk=function(){if(this._finished)this._chunkLoaded();else{if(t=new XMLHttpRequest,this._config.withCredentials&&(t.withCredentials=this._config.withCredentials),B||(t.onload=H(this._chunkLoaded,this),t.onerror=H(this._chunkError,this)),t.open(this._config.downloadRequestBody?"POST":"GET",this._input,!B),this._config.downloadRequestHeaders){var r,n=this._config.downloadRequestHeaders;for(r in n)t.setRequestHeader(r,n[r])}var i;this._config.chunkSize&&(i=this._start+this._config.chunkSize-1,t.setRequestHeader("Range","bytes="+this._start+"-"+i));try{t.send(this._config.downloadRequestBody)}catch(l){this._chunkError(l.message)}B&&t.status===0&&this._chunkError()}},this._chunkLoaded=function(){t.readyState===4&&(t.status<200||400<=t.status?this._chunkError():(this._start+=this._config.chunkSize||t.responseText.length,this._finished=!this._config.chunkSize||this._start>=(r=>(r=r.getResponseHeader("Content-Range"))!==null?parseInt(r.substring(r.lastIndexOf("/")+1)):-1)(t),this.parseChunk(t.responseText)))},this._chunkError=function(r){r=t.statusText||r,this._sendError(new Error(r))}}function ie(e){(e=e||{}).chunkSize||(e.chunkSize=u.LocalChunkSize),K.call(this,e);var t,r,n=typeof FileReader<"u";this.stream=function(i){this._input=i,r=i.slice||i.webkitSlice||i.mozSlice,n?((t=new FileReader).onload=H(this._chunkLoaded,this),t.onerror=H(this._chunkError,this)):t=new FileReaderSync,this._nextChunk()},this._nextChunk=function(){this._finished||this._config.preview&&!(this._rowCount<this._config.preview)||this._readChunk()},this._readChunk=function(){var i=this._input,l=(this._config.chunkSize&&(l=Math.min(this._start+this._config.chunkSize,this._input.size),i=r.call(i,this._start,l)),t.readAsText(i,this._config.encoding));n||this._chunkLoaded({target:{result:l}})},this._chunkLoaded=function(i){this._start+=this._config.chunkSize,this._finished=!this._config.chunkSize||this._start>=this._input.size,this.parseChunk(i.target.result)},this._chunkError=function(){this._sendError(t.error)}}function Y(e){var t;K.call(this,e=e||{}),this.stream=function(r){return t=r,this._nextChunk()},this._nextChunk=function(){var r,n;if(!this._finished)return r=this._config.chunkSize,t=r?(n=t.substring(0,r),t.substring(r)):(n=t,""),this._finished=!t,this.parseChunk(n)}}function ne(e){K.call(this,e=e||{});var t=[],r=!0,n=!1;this.pause=function(){K.prototype.pause.apply(this,arguments),this._input.pause()},this.resume=function(){K.prototype.resume.apply(this,arguments),this._input.resume()},this.stream=function(i){this._input=i,this._input.on("data",this._streamData),this._input.on("end",this._streamEnd),this._input.on("error",this._streamError)},this._checkIsFinished=function(){n&&t.length===1&&(this._finished=!0)},this._nextChunk=function(){this._checkIsFinished(),t.length?this.parseChunk(t.shift()):r=!0},this._streamData=H(function(i){try{t.push(typeof i=="string"?i:i.toString(this._config.encoding)),r&&(r=!1,this._checkIsFinished(),this.parseChunk(t.shift()))}catch(l){this._streamError(l)}},this),this._streamError=H(function(i){this._streamCleanUp(),this._sendError(i)},this),this._streamEnd=H(function(){this._streamCleanUp(),n=!0,this._streamData("")},this),this._streamCleanUp=H(function(){this._input.removeListener("data",this._streamData),this._input.removeListener("end",this._streamEnd),this._input.removeListener("error",this._streamError)},this)}function le(e){var t,r,n,i,l=Math.pow(2,53),S=-l,F=/^\s*-?(\d+\.?|\.\d+|\d+\.\d+)([eE][-+]?\d+)?\s*$/,j=/^((\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+([+-][0-2]\d:[0-5]\d|Z))|(\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d([+-][0-2]\d:[0-5]\d|Z))|(\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d([+-][0-2]\d:[0-5]\d|Z)))$/,d=this,E=0,a=0,T=!1,h=!1,c=[],s={data:[],errors:[],meta:{}};function x(p){return e.skipEmptyLines==="greedy"?p.join("").trim()==="":p.length===1&&p[0].length===0}function O(){if(s&&n&&(z("Delimiter","UndetectableDelimiter","Unable to auto-detect delimiting character; defaulted to '"+u.DefaultDelimiter+"'"),n=!1),e.skipEmptyLines&&(s.data=s.data.filter(function(o){return!x(o)})),I()){let o=function(R,C){k(e.transformHeader)&&(R=e.transformHeader(R,C)),c.push(R)};if(s)if(Array.isArray(s.data[0])){for(var p=0;I()&&p<s.data.length;p++)s.data[p].forEach(o);s.data.splice(0,1)}else s.data.forEach(o)}function g(o,R){for(var C=e.header?{}:[],y=0;y<o.length;y++){var v=y,_=o[y],_=((P,f)=>(b=>(e.dynamicTypingFunction&&e.dynamicTyping[b]===void 0&&(e.dynamicTyping[b]=e.dynamicTypingFunction(b)),(e.dynamicTyping[b]||e.dynamicTyping)===!0))(P)?f==="true"||f==="TRUE"||f!=="false"&&f!=="FALSE"&&((b=>{if(F.test(b)&&(b=parseFloat(b),S<b&&b<l))return 1})(f)?parseFloat(f):j.test(f)?new Date(f):f===""?null:f):f)(v=e.header?y>=c.length?"__parsed_extra":c[y]:v,_=e.transform?e.transform(_,v):_);v==="__parsed_extra"?(C[v]=C[v]||[],C[v].push(_)):C[v]=_}return e.header&&(y>c.length?z("FieldMismatch","TooManyFields","Too many fields: expected "+c.length+" fields but parsed "+y,a+R):y<c.length&&z("FieldMismatch","TooFewFields","Too few fields: expected "+c.length+" fields but parsed "+y,a+R)),C}var w;s&&(e.header||e.dynamicTyping||e.transform)&&(w=1,!s.data.length||Array.isArray(s.data[0])?(s.data=s.data.map(g),w=s.data.length):s.data=g(s.data,0),e.header&&s.meta&&(s.meta.fields=c),a+=w)}function I(){return e.header&&c.length===0}function z(p,g,w,o){p={type:p,code:g,message:w},o!==void 0&&(p.row=o),s.errors.push(p)}k(e.step)&&(i=e.step,e.step=function(p){s=p,I()?O():(O(),s.data.length!==0&&(E+=p.data.length,e.preview&&E>e.preview?r.abort():(s.data=s.data[0],i(s,d))))}),this.parse=function(p,g,w){var o=e.quoteChar||'"',o=(e.newline||(e.newline=this.guessLineEndings(p,o)),n=!1,e.delimiter?k(e.delimiter)&&(e.delimiter=e.delimiter(p),s.meta.delimiter=e.delimiter):((o=((R,C,y,v,_)=>{var P,f,b,$;_=_||[","," ","|",";",u.RECORD_SEP,u.UNIT_SEP];for(var J=0;J<_.length;J++){for(var U,V=_[J],D=0,q=0,A=0,L=(b=void 0,new ue({comments:v,delimiter:V,newline:C,preview:10}).parse(R)),W=0;W<L.data.length;W++)y&&x(L.data[W])?A++:(U=L.data[W].length,q+=U,b===void 0?b=U:0<U&&(D+=Math.abs(U-b),b=U));0<L.data.length&&(q/=L.data.length-A),(f===void 0||D<=f)&&($===void 0||$<q)&&1.99<q&&(f=D,P=V,$=q)}return{successful:!!(e.delimiter=P),bestDelimiter:P}})(p,e.newline,e.skipEmptyLines,e.comments,e.delimitersToGuess)).successful?e.delimiter=o.bestDelimiter:(n=!0,e.delimiter=u.DefaultDelimiter),s.meta.delimiter=e.delimiter),he(e));return e.preview&&e.header&&o.preview++,t=p,r=new ue(o),s=r.parse(t,g,w),O(),T?{meta:{paused:!0}}:s||{meta:{paused:!1}}},this.paused=function(){return T},this.pause=function(){T=!0,r.abort(),t=k(e.chunk)?"":t.substring(r.getCharIndex())},this.resume=function(){d.streamer._halted?(T=!1,d.streamer.parseChunk(t,!0)):setTimeout(d.resume,3)},this.aborted=function(){return h},this.abort=function(){h=!0,r.abort(),s.meta.aborted=!0,k(e.complete)&&e.complete(s),t=""},this.guessLineEndings=function(R,o){R=R.substring(0,1048576);var o=new RegExp(X(o)+"([^]*?)"+X(o),"gm"),w=(R=R.replace(o,"")).split("\r"),o=R.split(`
2
2
  `),R=1<o.length&&o[0].length<w[0].length;if(w.length===1||R)return`
3
3
  `;for(var C=0,y=0;y<w.length;y++)w[y][0]===`
4
4
  `&&C++;return C>=w.length/2?`\r
@@ -1 +1 @@
1
- import{c as a}from"./index-DAqgYcEq.js";const c=a("pencil",[["path",{d:"M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z",key:"1a8usu"}],["path",{d:"m15 5 4 4",key:"1mk7zo"}]]);export{c as P};
1
+ import{c as a}from"./index-YRiA3BUj.js";const c=a("pencil",[["path",{d:"M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z",key:"1a8usu"}],["path",{d:"m15 5 4 4",key:"1mk7zo"}]]);export{c as P};
@@ -1 +1 @@
1
- import{c as a}from"./index-DAqgYcEq.js";const e=a("play",[["path",{d:"M5 5a2 2 0 0 1 3.008-1.728l11.997 6.998a2 2 0 0 1 .003 3.458l-12 7A2 2 0 0 1 5 19z",key:"10ikf1"}]]);export{e as P};
1
+ import{c as a}from"./index-YRiA3BUj.js";const e=a("play",[["path",{d:"M5 5a2 2 0 0 1 3.008-1.728l11.997 6.998a2 2 0 0 1 .003 3.458l-12 7A2 2 0 0 1 5 19z",key:"10ikf1"}]]);export{e as P};
@@ -1,7 +1,7 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/index-NGfHHJ7k.js","assets/index-DAqgYcEq.js","assets/index-UYM0582r.css","assets/papaparse.min-BMNThItx.js"])))=>i.map(i=>d[i]);
2
- import{_ as y,n as x,o as _,d as $,r as f,a as b}from"./index-DAqgYcEq.js";import{vectorDB as w}from"./vector-db-ChAzHl5A.js";async function I(e,o){switch(o){case"pdf":return O(e);case"docx":return j(e);case"csv":return R(e);case"txt":case"md":return e.text();default:throw new Error(`Unsupported format: ${o}`)}}async function O(e){const o=await y(()=>import("./pdf-vkbVaD7t.js"),[]);o.GlobalWorkerOptions.workerSrc=new URL("/assets/pdf.worker-CliDBb4N.mjs",import.meta.url).toString();const c=await e.arrayBuffer(),n=await o.getDocument({data:c}).promise,r=[];for(let a=1;a<=n.numPages;a++){const l=(await(await n.getPage(a)).getTextContent()).items.map(s=>"str"in s?s.str:"").join(" ");r.push(l)}return r.join(`
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/index-BPkqt5Qe.js","assets/index-YRiA3BUj.js","assets/index-C78FkuPP.css","assets/papaparse.min-Dopi_5A-.js"])))=>i.map(i=>d[i]);
2
+ import{_ as y,n as x,o as _,d as $,r as f,a as b}from"./index-YRiA3BUj.js";import{vectorDB as w}from"./vector-db-ChAzHl5A.js";async function I(e,o){switch(o){case"pdf":return O(e);case"docx":return j(e);case"csv":return R(e);case"txt":case"md":return e.text();default:throw new Error(`Unsupported format: ${o}`)}}async function O(e){const o=await y(()=>import("./pdf-vkbVaD7t.js"),[]);o.GlobalWorkerOptions.workerSrc=new URL("/assets/pdf.worker-CliDBb4N.mjs",import.meta.url).toString();const c=await e.arrayBuffer(),n=await o.getDocument({data:c}).promise,r=[];for(let a=1;a<=n.numPages;a++){const l=(await(await n.getPage(a)).getTextContent()).items.map(s=>"str"in s?s.str:"").join(" ");r.push(l)}return r.join(`
3
3
 
4
- `)}async function j(e){const o=await y(()=>import("./index-NGfHHJ7k.js").then(r=>r.i),__vite__mapDeps([0,1,2])),c=await e.arrayBuffer();return(await o.extractRawText({arrayBuffer:c})).value}async function R(e){const o=await y(()=>import("./papaparse.min-BMNThItx.js").then(n=>n.p),__vite__mapDeps([3,1,2])),c=await e.text();return new Promise((n,r)=>{o.default.parse(c,{header:!0,complete(a){const t=a.data.filter(u=>Object.values(u).some(l=>l!==""&&l!=null)).map((u,l)=>{const s=Object.entries(u).map(([d,m])=>`${d}: ${m}`).join(", ");return`Row ${l+1}: ${s}`});n(t.join(`
4
+ `)}async function j(e){const o=await y(()=>import("./index-BPkqt5Qe.js").then(r=>r.i),__vite__mapDeps([0,1,2])),c=await e.arrayBuffer();return(await o.extractRawText({arrayBuffer:c})).value}async function R(e){const o=await y(()=>import("./papaparse.min-Dopi_5A-.js").then(n=>n.p),__vite__mapDeps([3,1,2])),c=await e.text();return new Promise((n,r)=>{o.default.parse(c,{header:!0,complete(a){const t=a.data.filter(u=>Object.values(u).some(l=>l!==""&&l!=null)).map((u,l)=>{const s=Object.entries(u).map(([d,m])=>`${d}: ${m}`).join(", ");return`Row ${l+1}: ${s}`});n(t.join(`
5
5
  `))},error(a){r(a)}})})}function T(e){switch(e.split(".").pop()?.toLowerCase()){case"pdf":return"pdf";case"docx":return"docx";case"txt":return"txt";case"md":return"md";case"csv":return"csv";default:return null}}const z={chunkSize:1e3,chunkOverlap:200,separator:`
6
6
 
7
7
  `};function A(e,o,c){const n={...z,...c},r=[],a=o.split(n.separator).filter(s=>s.trim());let t="",u=0,l=0;for(const s of a){const d=t?t+n.separator+s:s;if(d.length>n.chunkSize&&t){r.push(k(e,r.length,t,u));const m=t.slice(-n.chunkOverlap);u=l-m.length,t=m+n.separator+s}else t=d;l+=s.length+n.separator.length}return t.trim()&&r.push(k(e,r.length,t,u)),r}function k(e,o,c,n){const r=c.trim(),a={startChar:n,endChar:n+r.length};return{id:x(),documentId:e,index:o,content:r,tokenEstimate:Math.ceil(r.split(/\s+/).length*1.3),metadata:a}}async function B(e,o,c,n){const r=T(e.name);if(!r)throw new Error(`Unsupported file format: ${e.name}`);const a=x(),t={id:a,name:e.name,format:r,sizeBytes:e.size,addedAt:Date.now(),chunkCount:0,embeddingModel:o,status:"pending"};try{t.status="parsing",n?.({stage:"parsing",message:`Parsing ${e.name}...`,progress:.1});const u=await I(e,r);if(!u.trim())throw new Error("Document produced no extractable text");t.status="chunking",n?.({stage:"chunking",message:"Splitting into chunks...",progress:.3});const l=A(a,u,c);t.chunkCount=l.length,t.status="embedding",n?.({stage:"embedding",message:`Embedding ${l.length} chunks...`,progress:.4});const s=await L(l,o,(d,m)=>{const v=.4+d/m*.5;n?.({stage:"embedding",message:`Embedding chunk ${d}/${m}...`,progress:v})});return n?.({stage:"ready",message:"Storing vectors...",progress:.95}),await w.storeChunks(s),t.status="ready",await w.storeDocument(t),n?.({stage:"ready",message:"Done!",progress:1}),t}catch(u){throw t.status="error",t.error=u instanceof Error?u.message:"Ingestion failed",await w.storeDocument(t),u}}async function L(e,o,c){const n=[];for(let a=0;a<e.length;a+=10){const t=e.slice(a,a+10),u=t.map(s=>s.content),l=await _.embed({model:o,input:u});for(let s=0;s<t.length;s++){const d=t[s],m=l.embeddings[s];m&&n.push({id:x(),documentId:d.documentId,chunkId:d.id,content:d.content,embedding:m,metadata:d.metadata})}c(Math.min(a+10,e.length),e.length)}return n}async function D(e,o,c=5,n){const a=(await _.embed({model:o,input:[e]})).embeddings[0];if(!a)throw new Error("Failed to embed query");const t=await w.search(a,c,n),u=await w.getAllDocuments(),l=new Map(u.map(s=>[s.id,s.name]));return t.map(s=>({...s,documentName:l.get(s.chunk.documentId)??"Unknown"}))}function P(e){return e.length===0?"":`Use the following context to help answer the user's question. If the context doesn't contain relevant information, say so.
@@ -1 +1 @@
1
- import{d as D,r as u,a as c,n as I,K as M}from"./index-DAqgYcEq.js";const B=D("sessions",()=>{const t=u(new Map),o=u(null),i=u(new Map),r=c(()=>o.value?t.value.get(o.value)??null:null),l=c(()=>[...t.value.values()].sort((e,s)=>s.createdAt-e.createdAt));function v(e){return t.value.get(e)}function f(e){const s=I(),n={id:s,mode:e.mode,model:e.model,status:"idle",createdAt:Date.now(),prompt:e.prompt,messages:e.messages??[],options:e.options??{},outputText:"",metrics:null};return t.value.set(s,n),s}function d(e,s){i.value.set(e,s)}function p(e,s){const n=t.value.get(e);n&&(n.status=s)}function S(e,s){const n=t.value.get(e);n&&(n.outputText+=s)}function g(e,s){const n=t.value.get(e);if(n){n.status="completed",n.metrics=s;const a=i.value.get(e);a&&M.saveSession(n,a).catch(console.error)}}function m(e,s){const n=t.value.get(e);n&&(n.status="error",n.error=s)}function A(e){const s=t.value.get(e);s&&(s.status="cancelled")}function w(e,s){const n=t.value.get(e);n&&(n.doneReason=s)}function x(e){o.value=e}return{sessions:t,activeSessionId:o,activeSession:r,recentSessions:l,sessionConversationMap:i,sessionById:v,createSession:f,linkSessionToConversation:d,updateSessionStatus:p,appendOutput:S,finalizeSession:g,setSessionError:m,cancelSession:A,setDoneReason:w,setActiveSession:x}});export{B as u};
1
+ import{d as D,r as u,a as c,n as I,K as M}from"./index-YRiA3BUj.js";const B=D("sessions",()=>{const t=u(new Map),o=u(null),i=u(new Map),r=c(()=>o.value?t.value.get(o.value)??null:null),l=c(()=>[...t.value.values()].sort((e,s)=>s.createdAt-e.createdAt));function v(e){return t.value.get(e)}function f(e){const s=I(),n={id:s,mode:e.mode,model:e.model,status:"idle",createdAt:Date.now(),prompt:e.prompt,messages:e.messages??[],options:e.options??{},outputText:"",metrics:null};return t.value.set(s,n),s}function d(e,s){i.value.set(e,s)}function p(e,s){const n=t.value.get(e);n&&(n.status=s)}function S(e,s){const n=t.value.get(e);n&&(n.outputText+=s)}function g(e,s){const n=t.value.get(e);if(n){n.status="completed",n.metrics=s;const a=i.value.get(e);a&&M.saveSession(n,a).catch(console.error)}}function m(e,s){const n=t.value.get(e);n&&(n.status="error",n.error=s)}function A(e){const s=t.value.get(e);s&&(s.status="cancelled")}function w(e,s){const n=t.value.get(e);n&&(n.doneReason=s)}function x(e){o.value=e}return{sessions:t,activeSessionId:o,activeSession:r,recentSessions:l,sessionConversationMap:i,sessionById:v,createSession:f,linkSessionToConversation:d,updateSessionStatus:p,appendOutput:S,finalizeSession:g,setSessionError:m,cancelSession:A,setDoneReason:w,setActiveSession:x}});export{B as u};
@@ -1 +1 @@
1
- import{c}from"./index-DAqgYcEq.js";const y=c("share-2",[["circle",{cx:"18",cy:"5",r:"3",key:"gq8acd"}],["circle",{cx:"6",cy:"12",r:"3",key:"w7nqdw"}],["circle",{cx:"18",cy:"19",r:"3",key:"1xt0gg"}],["line",{x1:"8.59",x2:"15.42",y1:"13.51",y2:"17.49",key:"47mynk"}],["line",{x1:"15.41",x2:"8.59",y1:"6.51",y2:"10.49",key:"1n3mei"}]]);export{y as S};
1
+ import{c}from"./index-YRiA3BUj.js";const y=c("share-2",[["circle",{cx:"18",cy:"5",r:"3",key:"gq8acd"}],["circle",{cx:"6",cy:"12",r:"3",key:"w7nqdw"}],["circle",{cx:"18",cy:"19",r:"3",key:"1xt0gg"}],["line",{x1:"8.59",x2:"15.42",y1:"13.51",y2:"17.49",key:"47mynk"}],["line",{x1:"15.41",x2:"8.59",y1:"6.51",y2:"10.49",key:"1n3mei"}]]);export{y as S};
@@ -1 +1 @@
1
- import{c as e}from"./index-DAqgYcEq.js";const t=e("square",[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",key:"afitv7"}]]);export{t as S};
1
+ import{c as e}from"./index-YRiA3BUj.js";const t=e("square",[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",key:"afitv7"}]]);export{t as S};
@@ -1 +1 @@
1
- import{d as b,r as d,a as f}from"./index-DAqgYcEq.js";const g=[{id:"rag",dbName:"llmxray-rag",label:"Knowledge Base",icon:"📚",stores:["chunks","documents"]},{id:"conversations",dbName:"llmxray-conversations",label:"Conversations",icon:"💬",stores:["conversations","messages","sessions","tokens"]},{id:"benchmarks",dbName:"llmxray-benchmarks",label:"Benchmarks",icon:"⏱",stores:["results","custom-suites"]},{id:"message-memory",dbName:"llmxray-message-memory",label:"Message Memory",icon:"🧠",stores:["messages"]},{id:"canvas-ai",dbName:"llmxray-canvas-ai",label:"AI Training",icon:"🎨",stores:["training-pairs"]},{id:"comparisons",dbName:"llmxray-comparisons",label:"Comparisons",icon:"⚖",stores:["runs"]},{id:"history",dbName:"llmxray-history",label:"History",icon:"📅",stores:["entries"]}];async function p(){if(!navigator.storage?.estimate)return{usage:0,quota:0,persisted:!1};const s=await navigator.storage.estimate(),e=await navigator.storage.persisted?.()??!1;return{usage:s.usage??0,quota:s.quota??0,persisted:e}}function m(s){if(s==null)return 0;if(typeof s!="object")return String(s).length*2;const e=s;let t=0;for(const o of Object.keys(e)){t+=o.length*2;const n=e[o];Array.isArray(n)&&n.length>0&&typeof n[0]=="number"?t+=n.length*8:typeof n=="string"?t+=n.length*2:typeof n=="number"?t+=8:typeof n=="boolean"?t+=4:n!=null&&typeof n=="object"&&(t+=m(n))}return t}function v(s){return new Promise(e=>{const t=indexedDB.open(s);t.onupgradeneeded=()=>{t.transaction?.abort(),e(null)},t.onsuccess=()=>e(t.result),t.onerror=()=>e(null)})}function h(s,e){return new Promise(t=>{if(!s.objectStoreNames.contains(e)){t({name:e,bytes:0,count:0});return}const n=s.transaction(e,"readonly").objectStore(e);let c=0,r=0;const i=n.openCursor();i.onsuccess=()=>{const u=i.result;u?(c+=m(u.value),r++,u.continue()):t({name:e,bytes:c,count:r})},i.onerror=()=>t({name:e,bytes:0,count:0})})}async function x(s,e){const t=await v(s);if(!t)return{totalBytes:0,recordCount:0,stores:e.map(o=>({name:o,bytes:0,count:0}))};try{const o=[];for(const r of e)o.push(await h(t,r));const n=o.reduce((r,i)=>r+i.bytes,0),c=o.reduce((r,i)=>r+i.count,0);return{totalBytes:n,recordCount:c,stores:o}}finally{t.close()}}async function w(){const s=[];for(const e of g){const{totalBytes:t,recordCount:o,stores:n}=await x(e.dbName,e.stores);s.push({id:e.id,label:e.label,icon:e.icon,type:"indexeddb",totalBytes:t,recordCount:o,stores:n})}return s}const B=b("storage",()=>{const s=d(null),e=d([]),t=d(!1),o=d(null),n=f(()=>e.value.reduce((a,l)=>a+l.totalBytes,0)),c=f(()=>!s.value||s.value.quota===0?0:Math.round(s.value.usage/s.value.quota*100)),r=f(()=>e.value.reduce((a,l)=>a+l.recordCount,0));function i(a){return e.value.find(l=>l.id===a)}async function u(){t.value=!0;try{const[a,l]=await Promise.all([p(),w()]);s.value=a,e.value=l,o.value=Date.now()}catch(a){console.error("Failed to estimate storage:",a)}finally{t.value=!1}}async function y(a=3e4){(!o.value||Date.now()-o.value>a)&&await u()}return{origin:s,databases:e,loading:t,lastUpdated:o,totalUsedBytes:n,usedPercent:c,totalRecordCount:r,getDatabaseById:i,refresh:u,refreshIfStale:y}});export{B as u};
1
+ import{d as b,r as d,a as f}from"./index-YRiA3BUj.js";const g=[{id:"rag",dbName:"llmxray-rag",label:"Knowledge Base",icon:"📚",stores:["chunks","documents"]},{id:"conversations",dbName:"llmxray-conversations",label:"Conversations",icon:"💬",stores:["conversations","messages","sessions","tokens"]},{id:"benchmarks",dbName:"llmxray-benchmarks",label:"Benchmarks",icon:"⏱",stores:["results","custom-suites"]},{id:"message-memory",dbName:"llmxray-message-memory",label:"Message Memory",icon:"🧠",stores:["messages"]},{id:"canvas-ai",dbName:"llmxray-canvas-ai",label:"AI Training",icon:"🎨",stores:["training-pairs"]},{id:"comparisons",dbName:"llmxray-comparisons",label:"Comparisons",icon:"⚖",stores:["runs"]},{id:"history",dbName:"llmxray-history",label:"History",icon:"📅",stores:["entries"]}];async function p(){if(!navigator.storage?.estimate)return{usage:0,quota:0,persisted:!1};const s=await navigator.storage.estimate(),e=await navigator.storage.persisted?.()??!1;return{usage:s.usage??0,quota:s.quota??0,persisted:e}}function m(s){if(s==null)return 0;if(typeof s!="object")return String(s).length*2;const e=s;let t=0;for(const o of Object.keys(e)){t+=o.length*2;const n=e[o];Array.isArray(n)&&n.length>0&&typeof n[0]=="number"?t+=n.length*8:typeof n=="string"?t+=n.length*2:typeof n=="number"?t+=8:typeof n=="boolean"?t+=4:n!=null&&typeof n=="object"&&(t+=m(n))}return t}function v(s){return new Promise(e=>{const t=indexedDB.open(s);t.onupgradeneeded=()=>{t.transaction?.abort(),e(null)},t.onsuccess=()=>e(t.result),t.onerror=()=>e(null)})}function h(s,e){return new Promise(t=>{if(!s.objectStoreNames.contains(e)){t({name:e,bytes:0,count:0});return}const n=s.transaction(e,"readonly").objectStore(e);let c=0,r=0;const i=n.openCursor();i.onsuccess=()=>{const u=i.result;u?(c+=m(u.value),r++,u.continue()):t({name:e,bytes:c,count:r})},i.onerror=()=>t({name:e,bytes:0,count:0})})}async function x(s,e){const t=await v(s);if(!t)return{totalBytes:0,recordCount:0,stores:e.map(o=>({name:o,bytes:0,count:0}))};try{const o=[];for(const r of e)o.push(await h(t,r));const n=o.reduce((r,i)=>r+i.bytes,0),c=o.reduce((r,i)=>r+i.count,0);return{totalBytes:n,recordCount:c,stores:o}}finally{t.close()}}async function w(){const s=[];for(const e of g){const{totalBytes:t,recordCount:o,stores:n}=await x(e.dbName,e.stores);s.push({id:e.id,label:e.label,icon:e.icon,type:"indexeddb",totalBytes:t,recordCount:o,stores:n})}return s}const B=b("storage",()=>{const s=d(null),e=d([]),t=d(!1),o=d(null),n=f(()=>e.value.reduce((a,l)=>a+l.totalBytes,0)),c=f(()=>!s.value||s.value.quota===0?0:Math.round(s.value.usage/s.value.quota*100)),r=f(()=>e.value.reduce((a,l)=>a+l.recordCount,0));function i(a){return e.value.find(l=>l.id===a)}async function u(){t.value=!0;try{const[a,l]=await Promise.all([p(),w()]);s.value=a,e.value=l,o.value=Date.now()}catch(a){console.error("Failed to estimate storage:",a)}finally{t.value=!1}}async function y(a=3e4){(!o.value||Date.now()-o.value>a)&&await u()}return{origin:s,databases:e,loading:t,lastUpdated:o,totalUsedBytes:n,usedPercent:c,totalRecordCount:r,getDatabaseById:i,refresh:u,refreshIfStale:y}});export{B as u};
@@ -1,4 +1,4 @@
1
- import{n as S,A as z}from"./index-DAqgYcEq.js";import{u as R}from"./session-store-DJJV_fRl.js";import{a as G,b as E,u as J}from"./agent-store-Cboc3nde.js";import{u as $}from"./metrics-store-DLxxEHpn.js";import{u as j}from"./toolcall-store-DVrrMX0Y.js";const C=1e6;function F(t,n,a,e,c){const s=(e.total_duration??0)/C,o=(e.load_duration??0)/C,i=(e.prompt_eval_duration??0)/C,l=(e.eval_duration??0)/C,p=e.prompt_eval_count??0,r=e.eval_count??0,m=e.prompt_eval_cached_count,u=m===void 0?void 0:Math.min(m,p),d=p-(u??0),y=l>0?r/l*1e3:0,v=i>0&&d>0?d/i*1e3:0,g=c.length>0?c[0]:0;return{sessionId:t,model:n,startedAt:a,completedAt:Date.now(),ttftMs:g,totalDurationMs:s,loadDurationMs:o,promptEvalDurationMs:i,evalDurationMs:l,tokensPerSecond:y,promptTokensPerSecond:v,promptTokenCount:p,cachedPromptTokenCount:u,promptCacheHitRate:u!==void 0&&p>0?u/p:void 0,completionTokenCount:r,totalTokenCount:p+r,tokenLatencies:c}}class H{constructor(n){this.stepIndex=0,this.activeStep=null,this.inThinkBlock=!1,this.completedSteps=[],this.lastProcessedLineIndex=-1,this.thinkBlockProcessed=!1,this.enablePatternDetection=n?.patternDetection??!0}get isThinking(){return this.inThinkBlock}get thinkingContent(){return this.inThinkBlock&&this.activeStep?this.activeStep.content:""}processToken(n,a){if(!this.inThinkBlock&&!this.thinkBlockProcessed&&a.includes("<think>")){this.inThinkBlock=!0;const i=a.split("<think>").pop()??"";return this.activeStep={type:"thought",content:i,startTokenIndex:n.index,startTimestamp:n.timestamp},null}if(this.inThinkBlock&&a.includes("</think>")){if(this.inThinkBlock=!1,this.thinkBlockProcessed=!0,this.activeStep){const i=a.match(/<think>([\s\S]*?)<\/think>/);if(i?this.activeStep.content=i[1]?.trim()??this.activeStep.content.trim():this.activeStep.content=this.activeStep.content.replace(/<\/think>[\s\S]*$/,"").trim(),this.activeStep.content)return this.finalizeStep(n);this.activeStep=null}return null}if(this.inThinkBlock&&this.activeStep)return this.activeStep.content+=n.text,null;if(!this.enablePatternDetection)return null;const e=a.split(`
1
+ import{n as S,A as z}from"./index-YRiA3BUj.js";import{u as R}from"./session-store-2bGNgO7a.js";import{a as G,b as E,u as J}from"./agent-store--SqycFe6.js";import{u as $}from"./metrics-store-BCparPrV.js";import{u as j}from"./toolcall-store-CJSLkRLe.js";const C=1e6;function F(t,n,a,e,c){const s=(e.total_duration??0)/C,o=(e.load_duration??0)/C,i=(e.prompt_eval_duration??0)/C,l=(e.eval_duration??0)/C,p=e.prompt_eval_count??0,r=e.eval_count??0,m=e.prompt_eval_cached_count,u=m===void 0?void 0:Math.min(m,p),d=p-(u??0),y=l>0?r/l*1e3:0,v=i>0&&d>0?d/i*1e3:0,g=c.length>0?c[0]:0;return{sessionId:t,model:n,startedAt:a,completedAt:Date.now(),ttftMs:g,totalDurationMs:s,loadDurationMs:o,promptEvalDurationMs:i,evalDurationMs:l,tokensPerSecond:y,promptTokensPerSecond:v,promptTokenCount:p,cachedPromptTokenCount:u,promptCacheHitRate:u!==void 0&&p>0?u/p:void 0,completionTokenCount:r,totalTokenCount:p+r,tokenLatencies:c}}class H{constructor(n){this.stepIndex=0,this.activeStep=null,this.inThinkBlock=!1,this.completedSteps=[],this.lastProcessedLineIndex=-1,this.thinkBlockProcessed=!1,this.enablePatternDetection=n?.patternDetection??!0}get isThinking(){return this.inThinkBlock}get thinkingContent(){return this.inThinkBlock&&this.activeStep?this.activeStep.content:""}processToken(n,a){if(!this.inThinkBlock&&!this.thinkBlockProcessed&&a.includes("<think>")){this.inThinkBlock=!0;const i=a.split("<think>").pop()??"";return this.activeStep={type:"thought",content:i,startTokenIndex:n.index,startTimestamp:n.timestamp},null}if(this.inThinkBlock&&a.includes("</think>")){if(this.inThinkBlock=!1,this.thinkBlockProcessed=!0,this.activeStep){const i=a.match(/<think>([\s\S]*?)<\/think>/);if(i?this.activeStep.content=i[1]?.trim()??this.activeStep.content.trim():this.activeStep.content=this.activeStep.content.replace(/<\/think>[\s\S]*$/,"").trim(),this.activeStep.content)return this.finalizeStep(n);this.activeStep=null}return null}if(this.inThinkBlock&&this.activeStep)return this.activeStep.content+=n.text,null;if(!this.enablePatternDetection)return null;const e=a.split(`
2
2
  `);if(e.length<2)return null;const c=e.length-2;if(c<=this.lastProcessedLineIndex)return null;this.lastProcessedLineIndex=c;const s=e[c]?.trim()??"";if(!s)return null;const o=K(s);if(o){let i=null;return this.activeStep&&(i=this.finalizeStep(n)),this.activeStep={type:o.type,content:o.content,startTokenIndex:n.index,startTimestamp:n.timestamp},i}return this.activeStep&&(this.activeStep.content+=n.text),null}finalize(){if(this.activeStep){const n={id:S(),index:this.stepIndex++,type:this.activeStep.type,content:this.activeStep.content.trim(),startTokenIndex:this.activeStep.startTokenIndex,endTokenIndex:this.activeStep.startTokenIndex,timestamp:this.activeStep.startTimestamp,durationMs:Date.now()-this.activeStep.startTimestamp};if(this.activeStep=null,n.content)return this.completedSteps.push(n),n}return null}finalizeStep(n){const a={id:S(),index:this.stepIndex++,type:this.activeStep.type,content:this.activeStep.content.trim(),startTokenIndex:this.activeStep.startTokenIndex,endTokenIndex:n.index,timestamp:this.activeStep.startTimestamp,durationMs:n.timestamp-this.activeStep.startTimestamp};return this.completedSteps.push(a),this.activeStep=null,a}}const q=[{regex:/^(?:Step\s+\d+[:.]\s*)(.+)/i,type:"thought"},{regex:/^(?:Thought[:.]\s*)(.+)/i,type:"thought"},{regex:/^(?:Observation[:.]\s*)(.+)/i,type:"observation"},{regex:/^(?:Action[:.]\s*)(.+)/i,type:"action"},{regex:/^(?:Conclusion[:.]\s*)(.+)/i,type:"conclusion"},{regex:/^(?:Therefore[,:.]\s*)(.+)/i,type:"conclusion"}];function K(t){const n=t.trim();for(const{regex:a,type:e}of q){const c=n.match(a);if(c)return{type:e,content:c[1]??n}}return null}async function I(t,n,a){const e=t.getReader(),c=new TextDecoder;let s="";try{for(;!a?.aborted;){const{done:o,value:i}=await e.read();if(o)break;s+=c.decode(i,{stream:!0});const l=s.split(`
3
3
  `);s=l.pop()??"";for(const p of l){const r=p.trim();if(!r||!r.startsWith("data: "))continue;const m=r.slice(6);if(m==="[DONE]")return;try{const u=JSON.parse(m);n(u)}catch{}}}}finally{e.releaseLock()}}async function V(t,n,a){const e=t.getReader(),c=new TextDecoder;let s="";try{for(;!a?.aborted;){const{done:o,value:i}=await e.read();if(o)break;s+=c.decode(i,{stream:!0});const l=s.split(`
4
4
  `);s=l.pop()??"";for(const p of l){const r=p.trim();if(r)try{const m=JSON.parse(r);n(m)}catch{}}}if(s.trim())try{const o=JSON.parse(s.trim());n(o)}catch{}}finally{e.releaseLock()}}async function tt(t,n,a){const e=R(),c=G(),s=$(),o=E(),i=J(),l=Date.now();let p=0,r=l,m="";const u=[],d=z(),y=e.sessionById(t),v=y?d.isThinkingModel(y.model):!1,g=new H({patternDetection:v});i.initGraph(t),i.addNode(t,{id:S(),type:"start",label:"Generation Start",sessionId:t,stepIndex:0,state:{},timestamp:l}),e.updateSessionStatus(t,"streaming"),await V(n,T=>{const D=Date.now(),M=D-r;m+=T.response;const P=W(M,u),b={id:S(),index:p++,text:T.response,timestamp:D,confidence:P,cumulativeText:m,interTokenLatencyMs:M};c.pushToken(t,b),e.appendOutput(t,T.response),u.push(M),r=D;const x=g.processToken(b,m);if(o.setThinking(t,g.isThinking,g.thinkingContent),x&&(o.addStep(t,x),i.addNode(t,{id:S(),type:"decision",label:`${x.type}: ${x.content.slice(0,40)}...`,sessionId:t,stepIndex:x.index,state:{reasoning:x.type},timestamp:x.timestamp})),T.done){g.finalize(),o.setThinking(t,!1,""),T.done_reason&&e.setDoneReason(t,T.done_reason);const h=e.sessionById(t);if(h){const k=F(t,h.model,l,T,u);s.recordMetrics(t,k),e.finalizeSession(t,k),s.recalculateAggregate()}i.addNode(t,{id:S(),type:"output",label:"Generation Complete",sessionId:t,stepIndex:p,state:{tokenCount:p},timestamp:Date.now()})}},a)}async function et(t,n,a){const e=R(),c=G(),s=$(),o=E(),i=j(),l=J(),p=Date.now();let r=0,m=p,u="",d="",y="",v=!1;const g=[],T=[],D=z(),M=e.sessionById(t),P=M?D.isThinkingModel(M.model):!1,b=new H({patternDetection:P});l.initGraph(t);const x=l.getGraph(t);return(!x||x.nodes.length===0)&&l.addNode(t,{id:S(),type:"start",label:"Chat Start",sessionId:t,stepIndex:0,state:{},timestamp:p}),e.updateSessionStatus(t,"streaming"),await V(n,h=>{const k=Date.now(),w=k-m,A=h.message.thinking;if(A){v=!0,d+=A,o.setThinking(t,!0,d),g.push(w),m=k;return}v&&d&&!h.done&&(o.setThinking(t,!1,d),d.trim()&&o.addStep(t,{id:S(),index:0,type:"thought",content:d.trim(),startTokenIndex:0,endTokenIndex:r,timestamp:k,durationMs:k-p}),y=d,d="");const B=h.message.content;u+=B;let N,L;h.logprobs&&h.logprobs.length>0?(L=h.logprobs[0].logprob,N=Math.exp(L)):N=W(w,g);const O={id:S(),index:r++,text:B,timestamp:k,confidence:N,logprob:L,cumulativeText:u,interTokenLatencyMs:w};if(c.pushToken(t,O),e.appendOutput(t,B),g.push(w),m=k,!v){const f=b.processToken(O,u);o.setThinking(t,b.isThinking,b.thinkingContent),f&&o.addStep(t,f)}if(h.message.tool_calls)for(const f of h.message.tool_calls){T.push(f);const _={id:S(),sessionId:t,index:i.getToolCalls(t).length,functionName:f.function.name,arguments:f.function.arguments,status:"pending",startedAt:k,tokenIndexStart:r};i.addToolCall(t,_),l.addNode(t,{id:S(),type:"tool_call",label:`Tool: ${f.function.name}`,sessionId:t,stepIndex:r,state:{tool:f.function.name,args:f.function.arguments},timestamp:k})}if(h.done&&(v&&d.trim()&&(y=d,o.addStep(t,{id:S(),index:0,type:"thought",content:d.trim(),startTokenIndex:0,endTokenIndex:r,timestamp:Date.now(),durationMs:Date.now()-p})),b.finalize(),o.setThinking(t,!1,v?y:""),h.done_reason&&e.setDoneReason(t,h.done_reason),T.length===0)){const f=e.sessionById(t);if(f){const _=F(t,f.model,p,h,g);s.recordMetrics(t,_),e.finalizeSession(t,_),s.recalculateAggregate()}l.addNode(t,{id:S(),type:"output",label:"Chat Complete",sessionId:t,stepIndex:r,state:{tokenCount:r},timestamp:Date.now()})}},a),{toolCalls:T}}function W(t,n){if(n.length<2)return .5;const a=[...n].sort((o,i)=>o-i),e=a[Math.floor(a.length/2)];if(e<=0)return .5;const c=t/e,s=Math.max(0,Math.min(1,1-(c-.5)/2));return Math.round(s*100)/100}export{tt as a,V as b,et as e,I as r};
@@ -1 +1 @@
1
- import{d as k,r as f,a as u,n as x}from"./index-DAqgYcEq.js";function m(){return{mode:"code",blocks:[],code:""}}const v="llmxray-workshop-tools",D="llmxray-tool-definitions",_=k("tool-workshop",()=>{const n=f({}),a=f(null);function p(){try{const e=localStorage.getItem(v);if(e){const t=JSON.parse(e),o={};for(const l of t)o[l.id]=l;n.value=o;return}g()}catch{}}function g(){try{const e=localStorage.getItem(D);if(!e)return;const t=JSON.parse(e),o={};for(const l of t){const d={id:l.id,definition:l.definition,implementation:m(),enabled:l.enabled,category:"custom",createdAt:l.createdAt,updatedAt:l.updatedAt,lastTestedAt:null,testResult:null};o[d.id]=d}n.value=o,i()}catch{}}function i(){const e=Object.values(n.value);localStorage.setItem(v,JSON.stringify(e))}p();const c=u(()=>Object.values(n.value)),r=u(()=>c.value.filter(e=>e.enabled)),y=u(()=>r.value.map(e=>e.definition)),b=u(()=>{const e={};for(const t of c.value){const o=t.category||"custom";e[o]||(e[o]=[]),e[o].push(t)}return e}),S=u(()=>a.value?n.value[a.value]??null:null);function s(e){const t=x(),o=Date.now(),l={id:t,definition:e.definition,implementation:e.implementation??m(),enabled:e.enabled??!1,category:e.category??"custom",createdAt:o,updatedAt:o,lastTestedAt:null,testResult:null};return n.value[t]=l,i(),t}function O(e,t){const o=n.value[e];o&&(n.value[e]={...o,...t,updatedAt:Date.now()},i())}function T(e){delete n.value[e],a.value===e&&(a.value=null),i()}function A(){n.value={},a.value=null,i()}function w(e){const t=n.value[e];if(!t)return null;const o=JSON.parse(JSON.stringify(t.definition));return o.function.name=`${o.function.name}_copy`,s({definition:o,implementation:JSON.parse(JSON.stringify(t.implementation)),category:t.category})}function N(e){const t=n.value[e];t&&(n.value[e]={...t,enabled:!t.enabled},i())}function J(){for(const e of Object.keys(n.value))n.value[e]={...n.value[e],enabled:!1};i()}function h(e){a.value=e}function E(e){return n.value[e]}function I(e){return c.value.find(t=>t.definition.function.name===e)}return{tools:n,selectedToolId:a,allTools:c,enabledTools:r,enabledDefinitions:y,toolsByCategory:b,selectedTool:S,addTool:s,updateTool:O,removeTool:T,clearAll:A,duplicateTool:w,toggleEnabled:N,disableAll:J,selectTool:h,getById:E,findByFunctionName:I}});export{_ as u};
1
+ import{d as k,r as f,a as u,n as x}from"./index-YRiA3BUj.js";function m(){return{mode:"code",blocks:[],code:""}}const v="llmxray-workshop-tools",D="llmxray-tool-definitions",_=k("tool-workshop",()=>{const n=f({}),a=f(null);function p(){try{const e=localStorage.getItem(v);if(e){const t=JSON.parse(e),o={};for(const l of t)o[l.id]=l;n.value=o;return}g()}catch{}}function g(){try{const e=localStorage.getItem(D);if(!e)return;const t=JSON.parse(e),o={};for(const l of t){const d={id:l.id,definition:l.definition,implementation:m(),enabled:l.enabled,category:"custom",createdAt:l.createdAt,updatedAt:l.updatedAt,lastTestedAt:null,testResult:null};o[d.id]=d}n.value=o,i()}catch{}}function i(){const e=Object.values(n.value);localStorage.setItem(v,JSON.stringify(e))}p();const c=u(()=>Object.values(n.value)),r=u(()=>c.value.filter(e=>e.enabled)),y=u(()=>r.value.map(e=>e.definition)),b=u(()=>{const e={};for(const t of c.value){const o=t.category||"custom";e[o]||(e[o]=[]),e[o].push(t)}return e}),S=u(()=>a.value?n.value[a.value]??null:null);function s(e){const t=x(),o=Date.now(),l={id:t,definition:e.definition,implementation:e.implementation??m(),enabled:e.enabled??!1,category:e.category??"custom",createdAt:o,updatedAt:o,lastTestedAt:null,testResult:null};return n.value[t]=l,i(),t}function O(e,t){const o=n.value[e];o&&(n.value[e]={...o,...t,updatedAt:Date.now()},i())}function T(e){delete n.value[e],a.value===e&&(a.value=null),i()}function A(){n.value={},a.value=null,i()}function w(e){const t=n.value[e];if(!t)return null;const o=JSON.parse(JSON.stringify(t.definition));return o.function.name=`${o.function.name}_copy`,s({definition:o,implementation:JSON.parse(JSON.stringify(t.implementation)),category:t.category})}function N(e){const t=n.value[e];t&&(n.value[e]={...t,enabled:!t.enabled},i())}function J(){for(const e of Object.keys(n.value))n.value[e]={...n.value[e],enabled:!1};i()}function h(e){a.value=e}function E(e){return n.value[e]}function I(e){return c.value.find(t=>t.definition.function.name===e)}return{tools:n,selectedToolId:a,allTools:c,enabledTools:r,enabledDefinitions:y,toolsByCategory:b,selectedTool:S,addTool:s,updateTool:O,removeTool:T,clearAll:A,duplicateTool:w,toggleEnabled:N,disableAll:J,selectTool:h,getById:E,findByFunctionName:I}});export{_ as u};
@@ -1 +1 @@
1
- import{d as f,r as d}from"./index-DAqgYcEq.js";const p=f("toolcalls",()=>{const l=d(new Map);function o(t){return l.value.get(t)??[]}function r(t){return o(t).filter(n=>n.status==="pending")}function u(t,n){let e=l.value.get(t);e||(e=[],l.value.set(t,e)),e.push(n)}function i(t,n,e){const a=l.value.get(t);if(!a)return;const s=a.find(c=>c.id===n);s&&Object.assign(s,e)}return{callsBySession:l,getToolCalls:o,getPendingCalls:r,addToolCall:u,updateToolCall:i}});export{p as u};
1
+ import{d as f,r as d}from"./index-YRiA3BUj.js";const p=f("toolcalls",()=>{const l=d(new Map);function o(t){return l.value.get(t)??[]}function r(t){return o(t).filter(n=>n.status==="pending")}function u(t,n){let e=l.value.get(t);e||(e=[],l.value.set(t,e)),e.push(n)}function i(t,n,e){const a=l.value.get(t);if(!a)return;const s=a.find(c=>c.id===n);s&&Object.assign(s,e)}return{callsBySession:l,getToolCalls:o,getPendingCalls:r,addToolCall:u,updateToolCall:i}});export{p as u};
@@ -1 +1 @@
1
- import{c as a}from"./index-DAqgYcEq.js";const e=a("trash-2",[["path",{d:"M10 11v6",key:"nco0om"}],["path",{d:"M14 11v6",key:"outv1u"}],["path",{d:"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6",key:"miytrc"}],["path",{d:"M3 6h18",key:"d0wm0j"}],["path",{d:"M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2",key:"e791ji"}]]);export{e as T};
1
+ import{c as a}from"./index-YRiA3BUj.js";const e=a("trash-2",[["path",{d:"M10 11v6",key:"nco0om"}],["path",{d:"M14 11v6",key:"outv1u"}],["path",{d:"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6",key:"miytrc"}],["path",{d:"M3 6h18",key:"d0wm0j"}],["path",{d:"M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2",key:"e791ji"}]]);export{e as T};
package/dist/index.html CHANGED
@@ -6,8 +6,8 @@
6
6
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
7
7
  <meta name="description" content="LLMxRay is a local LLM observatory that captures, visualizes and analyzes traffic from AI models like ChatGPT, Claude, Ollama and more — entirely on your machine." />
8
8
  <title>LLMxRay — Local LLM Observatory</title>
9
- <script type="module" crossorigin src="/assets/index-DAqgYcEq.js"></script>
10
- <link rel="stylesheet" crossorigin href="/assets/index-UYM0582r.css">
9
+ <script type="module" crossorigin src="/assets/index-YRiA3BUj.js"></script>
10
+ <link rel="stylesheet" crossorigin href="/assets/index-C78FkuPP.css">
11
11
  </head>
12
12
  <body>
13
13
  <script>
package/package.json CHANGED
@@ -1,6 +1,14 @@
1
1
  {
2
2
  "name": "llmxray",
3
- "version": "0.5.1",
3
+ "version": "0.6.0",
4
+ "repository": {
5
+ "type": "git",
6
+ "url": "git+https://github.com/LogneBudo/llmxray.git"
7
+ },
8
+ "homepage": "https://lognebudo.github.io/llmxray/",
9
+ "bugs": {
10
+ "url": "https://github.com/LogneBudo/llmxray/issues"
11
+ },
4
12
  "description": "Local LLM Observatory — See what your AI is actually doing, token by token.",
5
13
  "license": "Apache-2.0",
6
14
  "type": "module",
@@ -1 +0,0 @@
1
- import{c as it,b as W,z as tt,at as dt,B as et,e as r,f as t,t as e,C as L,D as q,g as E,h as D,W as st,l as X,G as F,F as C,k as T,u as b,U as ct,r as h,o as Y,a as z,j as o,A as ut,p as j,i as $,Z as pt,au as rt,q as O,av as gt}from"./index-DAqgYcEq.js";import{_ as mt}from"./TabBar.vue_vue_type_script_setup_true_lang-g3X_zm3P.js";import{b as xt}from"./format-CKxSMkvr.js";import{_ as vt}from"./ModelCapabilityIcons.vue_vue_type_script_setup_true_lang-CPvepOP2.js";import{T as bt}from"./trash-2-DfEdg6Up.js";import{u as ft}from"./google-auth-store-8ShUecGK.js";import{_ as ht}from"./_plugin-vue_export-helper-DlAUqK2U.js";import{C as yt,a as _t,L as $t,B as kt,A as wt,p as Bt,c as Ct,d as Mt,f as zt,D as Gt}from"./index-DlTtfQCm.js";import{d as St,b as Lt}from"./download-WPaeALA4.js";import"./google-auth-CfEcVMA7.js";const At=it("refresh-cw",[["path",{d:"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8",key:"v9h5vc"}],["path",{d:"M21 3v5h-5",key:"1q7to0"}],["path",{d:"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16",key:"3uifl3"}],["path",{d:"M8 16H3v5",key:"1cv678"}]]),Tt={class:"space-y-6"},Dt={class:"rounded-lg border border-border-default bg-surface-raised p-4 space-y-4"},It={class:"text-sm font-medium text-text-primary"},Vt={class:"flex gap-3"},Ut={class:"flex items-center gap-2 text-sm"},Et={class:"text-text-secondary"},Rt={class:"rounded-lg border border-border-default bg-surface-raised p-4 space-y-4"},jt={class:"text-sm font-medium text-text-primary"},qt={class:"space-y-6"},Nt={class:"flex items-center gap-1.5 mb-3"},Pt={class:"text-xs text-text-muted"},Ot={class:"group relative"},Ft={class:"pointer-events-none absolute left-full top-1/2 z-10 ms-2 w-72 -translate-y-1/2 rounded-lg border border-border-default bg-surface-raised p-3 text-xs text-text-secondary opacity-0 shadow-lg transition-opacity group-hover:pointer-events-auto group-hover:opacity-100"},Wt={class:"font-medium text-text-primary mb-1"},Ht={class:"mb-2"},Jt={class:"space-y-1 text-[11px]"},Qt={class:"ms-auto text-xs text-text-primary font-medium"},Kt={class:"rounded-full bg-surface-overlay px-2 py-0.5 text-[10px] text-text-secondary"},Zt={class:"relative mt-0.5 h-3"},Xt={class:"absolute inset-0 flex"},Yt={class:"flex-[15] text-center text-[9px] text-text-muted border-e border-border-default/30"},te={class:"flex-[20] text-center text-[9px] text-text-muted border-e border-border-default/30"},ee={class:"flex-[25] text-center text-[9px] text-text-muted border-e border-border-default/30"},se={class:"flex-[40] text-center text-[9px] text-text-muted"},ae={class:"relative h-1.5 mt-1"},oe={class:"flex items-center gap-1.5 mb-2"},ne={class:"text-xs text-text-muted"},re={class:"group relative"},le={class:"pointer-events-none absolute left-full top-1/2 z-10 ms-2 w-72 -translate-y-1/2 rounded-lg border border-border-default bg-surface-raised p-3 text-xs text-text-secondary opacity-0 shadow-lg transition-opacity group-hover:pointer-events-auto group-hover:opacity-100"},ie={class:"font-medium text-text-primary mb-1"},de={class:"mb-2"},ce={class:"mt-2 text-[10px] text-text-muted"},ue={class:"flex items-center gap-3"},pe={class:"text-[10px] text-text-muted"},ge={class:"rounded-lg border border-border-default bg-surface-raised p-4 space-y-4"},me={class:"text-sm font-medium text-text-primary"},xe={class:"grid grid-cols-2 gap-2 sm:grid-cols-3"},ve=["onClick"],be={class:"truncate"},fe=W({__name:"SettingsGeneralTab",setup(A){const{t:l}=tt(),f=dt(),x=h("http://localhost:11434"),_=h(.7),g=h(4096),p=h("disconnected");function w(){const i=localStorage.getItem("llmxray-settings");if(i)try{const u=JSON.parse(i);typeof u.ollamaUrl=="string"&&(x.value=u.ollamaUrl,Y.setBaseUrl(u.ollamaUrl+"/api")),typeof u.defaultTemperature=="number"&&(_.value=u.defaultTemperature),typeof u.defaultContextLength=="number"&&(g.value=u.defaultContextLength)}catch{}}function M(){localStorage.setItem("llmxray-settings",JSON.stringify({ollamaUrl:x.value,defaultTemperature:_.value,defaultContextLength:g.value}))}async function G(){p.value="testing";try{const i=await fetch(`${x.value}/api/tags`);p.value=i.ok?"connected":"disconnected"}catch{p.value="disconnected"}}function B(){M(),Y.setBaseUrl(x.value+"/api")}const R=z(()=>{const i=_.value;return i===0?l("settings.general.temperatureDeterministic"):i<=.3?l("settings.general.temperatureFocused"):i<=.7?l("settings.general.temperatureBalanced"):i<=1.2?l("settings.general.temperatureCreative"):l("settings.general.temperatureVeryRandom")}),N=z(()=>_.value/2*100);return et(()=>{w(),G()}),(i,u)=>(o(),r("div",Tt,[t("div",Dt,[t("h3",It,e(i.$t("settings.general.ollamaConnection")),1),t("div",Vt,[L(t("input",{"onUpdate:modelValue":u[0]||(u[0]=y=>x.value=y),class:"flex-1 rounded-lg border border-border-default bg-surface px-3 py-2 text-sm text-text-primary focus:border-accent focus:outline-none",placeholder:"http://localhost:11434"},null,512),[[q,x.value]]),t("button",{class:"rounded-lg bg-surface-overlay px-4 py-2 text-sm text-text-primary hover:bg-border-default transition-colors",onClick:G},e(i.$t("settings.general.testConnection")),1),t("button",{class:"rounded-lg bg-accent px-4 py-2 text-sm text-surface hover:bg-accent-hover transition-colors",onClick:B},e(i.$t("settings.general.save")),1)]),t("div",Ut,[t("span",{class:E(["inline-block h-2 w-2 rounded-full",{"bg-success":p.value==="connected","bg-error":p.value==="disconnected","bg-warning animate-pulse":p.value==="testing"}])},null,2),t("span",Et,e(p.value==="connected"?i.$t("settings.general.connectionConnected"):p.value==="testing"?i.$t("settings.general.connectionTesting"):i.$t("settings.general.connectionDisconnected")),1)])]),t("div",Rt,[t("h3",jt,e(i.$t("settings.general.defaultParameters")),1),t("div",qt,[t("div",null,[t("div",Nt,[t("label",Pt,e(i.$t("settings.general.temperature")),1),t("div",Ot,[u[6]||(u[6]=t("span",{class:"inline-flex h-4 w-4 items-center justify-center rounded-full border border-border-default text-[10px] text-text-muted cursor-help"},"?",-1)),t("div",Ft,[t("p",Wt,e(i.$t("settings.general.temperatureTooltipTitle")),1),t("p",Ht,e(i.$t("settings.general.temperatureTooltipDesc")),1),t("ul",Jt,[t("li",null,[u[3]||(u[3]=t("strong",null,"0",-1)),D(" — "+e(i.$t("settings.general.temperatureTooltipZero")),1)]),t("li",null,[u[4]||(u[4]=t("strong",null,"0.7",-1)),D(" — "+e(i.$t("settings.general.temperatureTooltipDefault")),1)]),t("li",null,[u[5]||(u[5]=t("strong",null,"1.0+",-1)),D(" — "+e(i.$t("settings.general.temperatureTooltipHigh")),1)])])])]),t("span",Qt,e(_.value),1),t("span",Kt,e(R.value),1)]),L(t("input",{"onUpdate:modelValue":u[1]||(u[1]=y=>_.value=y),type:"range",min:"0",max:"2",step:"0.1",class:"w-full",onChange:M},null,544),[[q,_.value,void 0,{number:!0}]]),u[8]||(u[8]=st('<div class="relative mt-1 h-4"><span class="absolute start-0 text-[10px] text-text-muted">0</span><span class="absolute text-[10px] text-text-muted" style="inset-inline-start:15%;">0.3</span><span class="absolute text-[10px] text-accent font-medium" style="inset-inline-start:35%;">0.7</span><span class="absolute text-[10px] text-text-muted" style="inset-inline-start:50%;">1.0</span><span class="absolute text-[10px] text-text-muted" style="inset-inline-start:75%;">1.5</span><span class="absolute end-0 text-[10px] text-text-muted">2.0</span></div>',1)),t("div",Zt,[t("div",Xt,[t("div",Yt,e(i.$t("settings.general.temperatureFocused")),1),t("div",te,e(i.$t("settings.general.temperatureBalanced")),1),t("div",ee,e(i.$t("settings.general.temperatureCreative")),1),t("div",se,e(i.$t("settings.general.temperatureWild")),1)])]),t("div",ae,[u[7]||(u[7]=t("div",{class:"absolute h-1.5 rounded-full bg-border-default/30 w-full"},null,-1)),t("div",{class:"absolute h-1.5 rounded-full bg-accent/60 transition-all duration-150",style:X({width:`${N.value}%`})},null,4)])]),t("div",null,[t("div",oe,[t("label",ne,e(i.$t("settings.general.contextLength")),1),t("div",re,[u[9]||(u[9]=t("span",{class:"inline-flex h-4 w-4 items-center justify-center rounded-full border border-border-default text-[10px] text-text-muted cursor-help"},"?",-1)),t("div",le,[t("p",ie,e(i.$t("settings.general.contextLengthTooltipTitle")),1),t("p",de,e(i.$t("settings.general.contextLengthTooltipDesc")),1),t("div",ce,e(i.$t("settings.general.contextLengthTooltipNote")),1)])])]),t("div",ue,[L(t("select",{"onUpdate:modelValue":u[2]||(u[2]=y=>g.value=y),class:"rounded-lg border border-border-default bg-surface px-3 py-2 text-sm text-text-primary focus:border-accent focus:outline-none",onChange:M},[...u[10]||(u[10]=[t("option",{value:2048},"2,048",-1),t("option",{value:4096},"4,096",-1),t("option",{value:8192},"8,192",-1),t("option",{value:16384},"16,384",-1),t("option",{value:32768},"32,768",-1),t("option",{value:65536},"65,536",-1),t("option",{value:131072},"131,072",-1)])],544),[[F,g.value,void 0,{number:!0}]]),t("span",pe,e(i.$t("settings.general.approximateWords",{count:Math.round(g.value*.75).toLocaleString()})),1)])])])]),t("div",ge,[t("h3",me,e(i.$t("settings.general.language")),1),t("div",xe,[(o(!0),r(C,null,T(b(ct),y=>(o(),r("button",{key:y.code,type:"button",class:E(["flex items-center gap-2 rounded-lg border px-3 py-2 text-sm transition-colors",y.code===b(f).locale?"border-accent bg-accent/10 text-text-primary":"border-border-default bg-surface text-text-secondary hover:bg-surface-overlay hover:text-text-primary"]),onClick:I=>b(f).setLocale(y.code)},[t("span",{class:E([`fi fi-${y.flag}`,"!h-3.5 !w-5 rounded-sm shrink-0"])},null,2),t("span",be,e(y.label),1)],10,ve))),128))])])]))}}),lt=[{key:"chat",label:"Chat",entries:[{name:"llama3.2",description:"Meta Llama 3.2 -- fast general-purpose chat",variants:[{tag:"1b",params:"1B",size:"1.3 GB"},{tag:"3b",params:"3B",size:"2.0 GB"}]},{name:"llama3.1",description:"Meta Llama 3.1 -- strong reasoning and instruction following",variants:[{tag:"8b",params:"8B",size:"4.7 GB"}]},{name:"gemma3",description:"Google Gemma 3 -- efficient and multilingual",variants:[{tag:"1b",params:"1B",size:"815 MB"},{tag:"4b",params:"4B",size:"3.0 GB"},{tag:"12b",params:"12B",size:"8.1 GB"}]},{name:"gemma2",description:"Google Gemma 2 -- balanced performance",variants:[{tag:"2b",params:"2B",size:"1.6 GB"},{tag:"9b",params:"9B",size:"5.5 GB"}]},{name:"mistral",description:"Mistral 7B -- strong European model",variants:[{tag:"7b",params:"7B",size:"4.1 GB"}]},{name:"phi4",description:"Microsoft Phi-4 -- small but capable",variants:[{tag:"14b",params:"14B",size:"9.1 GB"}]},{name:"qwen2.5",description:"Alibaba Qwen 2.5 -- multilingual powerhouse",variants:[{tag:"0.5b",params:"0.5B",size:"397 MB"},{tag:"1.5b",params:"1.5B",size:"986 MB"},{tag:"3b",params:"3B",size:"1.9 GB"},{tag:"7b",params:"7B",size:"4.7 GB"}]},{name:"tinyllama",description:"TinyLlama -- ultra-lightweight for constrained systems",variants:[{tag:"1.1b",params:"1.1B",size:"637 MB"}]}]},{key:"code",label:"Code",entries:[{name:"qwen2.5-coder",description:"Qwen 2.5 Coder -- strong code generation and completion",variants:[{tag:"1.5b",params:"1.5B",size:"986 MB"},{tag:"3b",params:"3B",size:"1.9 GB"},{tag:"7b",params:"7B",size:"4.7 GB"}]},{name:"codellama",description:"Meta Code Llama -- code-specialized Llama",variants:[{tag:"7b",params:"7B",size:"3.8 GB"},{tag:"13b",params:"13B",size:"7.4 GB"}]},{name:"deepseek-coder-v2",description:"DeepSeek Coder V2 -- strong coding with MoE architecture",variants:[{tag:"16b",params:"16B",size:"8.9 GB"}]},{name:"starcoder2",description:"BigCode StarCoder 2 -- trained on The Stack v2",variants:[{tag:"3b",params:"3B",size:"1.7 GB"},{tag:"7b",params:"7B",size:"4.0 GB"}]},{name:"codegemma",description:"Google CodeGemma -- code completion and generation",variants:[{tag:"2b",params:"2B",size:"1.6 GB"},{tag:"7b",params:"7B",size:"5.0 GB"}]}]},{key:"embedding",label:"Embedding",entries:[{name:"nomic-embed-text",description:"Nomic -- 137M params, fast and good quality",variants:[{tag:"latest",params:"137M",size:"274 MB"}]},{name:"mxbai-embed-large",description:"mixedbread.ai -- 335M params, high quality",variants:[{tag:"latest",params:"335M",size:"670 MB"}]},{name:"all-minilm",description:"MiniLM -- 23M params, very lightweight",variants:[{tag:"latest",params:"23M",size:"46 MB"}]},{name:"snowflake-arctic-embed",description:"Snowflake -- 110M params, balanced",variants:[{tag:"latest",params:"110M",size:"229 MB"}]},{name:"bge-m3",description:"BAAI BGE-M3 -- multilingual, multi-granularity",variants:[{tag:"latest",params:"567M",size:"1.2 GB"}]}]},{key:"vision",label:"Vision",entries:[{name:"llava",description:"LLaVA -- multimodal vision-language model",variants:[{tag:"7b",params:"7B",size:"4.7 GB"},{tag:"13b",params:"13B",size:"8.0 GB"}]},{name:"llama3.2-vision",description:"Meta Llama 3.2 Vision -- image understanding",variants:[{tag:"11b",params:"11B",size:"7.9 GB"}]},{name:"minicpm-v",description:"MiniCPM-V -- lightweight vision model",variants:[{tag:"latest",params:"8B",size:"5.5 GB"}]},{name:"moondream",description:"Moondream -- tiny vision model, runs anywhere",variants:[{tag:"latest",params:"1.9B",size:"1.7 GB"}]}]},{key:"thinking",label:"Thinking",entries:[{name:"deepseek-r1",description:"DeepSeek R1 -- chain-of-thought reasoning",variants:[{tag:"1.5b",params:"1.5B",size:"1.1 GB"},{tag:"7b",params:"7B",size:"4.7 GB"},{tag:"8b",params:"8B",size:"4.9 GB"},{tag:"14b",params:"14B",size:"9.0 GB"}]},{name:"qwq",description:"Alibaba QwQ -- strong reasoning with thinking traces",variants:[{tag:"32b",params:"32B",size:"20 GB"}]},{name:"phi4-reasoning",description:"Microsoft Phi-4 Reasoning -- compact thinking model",variants:[{tag:"14b",params:"14B",size:"9.1 GB"}]},{name:"command-r",description:"Cohere Command R -- reasoning with RAG strengths",variants:[{tag:"35b",params:"35B",size:"20 GB"}]}]}],he={class:"space-y-6"},ye={class:"rounded-lg border border-border-default bg-surface-raised p-4 space-y-4"},_e={class:"flex items-center justify-between"},$e={class:"text-sm font-medium text-text-primary"},ke={class:"ms-1 text-text-muted"},we={key:0,class:"text-xs text-error"},Be={key:1,class:"py-4 text-center text-sm text-text-muted"},Ce={key:2,class:"space-y-1"},Me={class:"flex-1 min-w-0"},ze={class:"flex items-center gap-2"},Ge={class:"font-medium text-text-primary truncate"},Se={class:"flex gap-3 text-[10px] text-text-muted mt-0.5"},Le={key:0},Ae={key:1},Te={key:2},De={class:"shrink-0 text-[10px] text-text-muted"},Ie=["onClick"],Ve=["title","onClick"],Ue={class:"rounded-lg border border-border-default bg-surface-raised p-4 space-y-4"},Ee={class:"text-sm font-medium text-text-primary"},Re={class:"flex flex-wrap gap-1.5"},je=["onClick"],qe=["placeholder"],Ne={key:0,class:"text-xs text-error"},Pe={key:1,class:"py-4 text-center text-sm text-text-muted"},Oe={key:2,class:"space-y-2"},Fe={class:"flex items-start gap-3"},We={class:"flex-1 min-w-0"},He={class:"flex items-center gap-2"},Je={class:"text-xs font-medium text-text-primary"},Qe={key:0,class:"rounded-full bg-success/10 px-1.5 py-0.5 text-[9px] text-success"},Ke={class:"text-[10px] text-text-muted mt-0.5"},Ze={class:"flex items-center gap-2 shrink-0"},Xe=["value","onChange"],Ye=["value"],ts={key:1,class:"text-[10px] text-text-muted"},es=["disabled","onClick"],ss={key:0,class:"mt-2 space-y-1"},as={class:"h-1.5 rounded-full bg-surface-overlay overflow-hidden"},os={class:"text-[9px] text-text-muted"},ns={class:"border-t border-border-default pt-4"},rs={class:"mb-2 text-xs text-text-muted"},ls={class:"flex gap-2"},is=["disabled"],ds={key:0,class:"mt-2 space-y-1"},cs={class:"flex items-center justify-between text-[10px] text-text-muted"},us={class:"font-mono"},ps={class:"h-1.5 rounded-full bg-surface-overlay overflow-hidden"},gs={class:"text-[9px] text-text-muted"},ms=W({__name:"SettingsModelsTab",setup(A){const l=ut(),f=h(null),x=h(null);async function _(d){if(f.value===d){try{x.value=null,await l.deleteModel(d)}catch(m){x.value=m instanceof Error?m.message:"Delete failed"}f.value=null}else f.value=d,setTimeout(()=>{f.value===d&&(f.value=null)},3e3)}const g=h("all"),p=h(""),w=z(()=>[{key:"all",label:"All"},...lt.map(d=>({key:d.key,label:d.label}))]),M=z(()=>{let d=[];for(const s of lt)if(!(g.value!=="all"&&s.key!==g.value))for(const v of s.entries)d.push({...v,category:s.key});const m=p.value.toLowerCase().trim();return m&&(d=d.filter(s=>s.name.toLowerCase().includes(m)||s.description.toLowerCase().includes(m))),d}),G=h(new Map);function B(d){const m=G.value.get(d.name);return d.variants.find(s=>s.tag===m)??d.variants[0]}function R(d,m){const s=new Map(G.value);s.set(d,m),G.value=s}function N(d,m){const s=m==="latest"?d:`${d}:${m}`;return l.modelNames.some(v=>v===s||v===`${s}:latest`||v===d)}const i=h(new Map),u=h(null),y=h("");async function I(d){const m=new Map(i.value);m.set(d,{status:"Starting...",percent:0}),i.value=m,u.value=null;try{await Y.pullModel(d,(v,V,J)=>{const Q=new Map(i.value),Z=V&&J?Math.round(V/J*100):0;Q.set(d,{status:v,percent:Z}),i.value=Q}),await l.fetchModels();const s=new Map(i.value);s.delete(d),i.value=s}catch(s){u.value=`Failed to pull ${d}: ${s instanceof Error?s.message:"Unknown error"}`;const v=new Map(i.value);v.delete(d),i.value=v}}function K(d){const m=B(d),s=m.tag==="latest"?d.name:`${d.name}:${m.tag}`;I(s)}function H(){const d=y.value.trim();d&&(I(d),y.value="")}function P(d){return i.value.has(d)}return et(()=>{l.models.length===0&&l.fetchModels()}),(d,m)=>(o(),r("div",he,[t("div",ye,[t("div",_e,[t("h3",$e,[D(e(d.$t("settings.models.installedModels"))+" ",1),t("span",ke,"("+e(b(l).models.length)+")",1)]),t("button",{class:"rounded-lg px-3 py-1.5 text-xs text-text-secondary hover:bg-surface-overlay hover:text-text-primary transition-colors",onClick:m[0]||(m[0]=s=>b(l).fetchModels())},[j(b(At),{class:"h-3.5 w-3.5"}),D(" "+e(d.$t("settings.models.refresh")),1)])]),x.value?(o(),r("p",we,e(x.value),1)):$("",!0),b(l).models.length===0?(o(),r("div",Be,e(d.$t("settings.models.noModelsInstalled")),1)):(o(),r("div",Ce,[(o(!0),r(C,null,T(b(l).models,s=>(o(),r("div",{key:s.name,class:"flex items-center gap-3 rounded-lg bg-surface px-3 py-2.5 text-xs"},[t("div",Me,[t("div",ze,[t("span",Ge,e(s.name),1),j(vt,{"model-name":s.name},null,8,["model-name"])]),t("div",Se,[s.details?.family?(o(),r("span",Le,e(s.details.family),1)):$("",!0),s.details?.parameter_size?(o(),r("span",Ae,e(s.details.parameter_size),1)):$("",!0),s.details?.quantization_level?(o(),r("span",Te,e(s.details.quantization_level),1)):$("",!0)])]),t("span",De,e(b(xt)(s.size)),1),f.value===s.name?(o(),r("button",{key:0,class:"shrink-0 rounded-lg border border-error/30 px-2.5 py-1 text-[10px] text-error hover:bg-error/10 transition-colors",onClick:v=>_(s.name)},e(d.$t("settings.models.confirmDeletePrompt")),9,Ie)):(o(),r("button",{key:1,class:"shrink-0 rounded p-1 text-text-muted hover:text-error transition-colors",title:d.$t("settings.models.delete"),onClick:v=>_(s.name)},[j(b(bt),{class:"h-3.5 w-3.5"})],8,Ve))]))),128))]))]),t("div",Ue,[t("h3",Ee,e(d.$t("settings.models.downloadModels")),1),t("div",Re,[(o(!0),r(C,null,T(w.value,s=>(o(),r("button",{key:s.key,class:E(["rounded-lg px-3 py-1.5 text-xs transition-colors",g.value===s.key?"bg-accent/10 text-accent":"bg-surface text-text-secondary hover:bg-surface-overlay hover:text-text-primary"]),onClick:v=>g.value=s.key},e(s.label),11,je))),128))]),L(t("input",{"onUpdate:modelValue":m[1]||(m[1]=s=>p.value=s),type:"text",placeholder:d.$t("settings.models.searchModels"),class:"w-full rounded-lg border border-border-default bg-surface px-3 py-2 text-sm text-text-primary placeholder-text-muted outline-none focus:border-accent"},null,8,qe),[[q,p.value]]),u.value?(o(),r("p",Ne,e(u.value),1)):$("",!0),M.value.length===0?(o(),r("div",Pe,e(d.$t("settings.models.noModelsMatch")),1)):(o(),r("div",Oe,[(o(!0),r(C,null,T(M.value,s=>(o(),r("div",{key:s.name,class:"rounded-lg border border-border-default bg-surface p-3"},[t("div",Fe,[t("div",We,[t("div",He,[t("span",Je,e(s.name),1),N(s.name,B(s).tag)?(o(),r("span",Qe,e(d.$t("settings.models.installed")),1)):$("",!0)]),t("p",Ke,e(s.description),1)]),t("div",Ze,[s.variants.length>1?(o(),r("select",{key:0,value:B(s).tag,class:"rounded border border-border-default bg-surface px-2 py-1 text-[10px] text-text-primary outline-none focus:border-accent",onChange:v=>R(s.name,v.target.value)},[(o(!0),r(C,null,T(s.variants,v=>(o(),r("option",{key:v.tag,value:v.tag},e(v.params)+" ("+e(v.size)+") ",9,Ye))),128))],40,Xe)):(o(),r("span",ts,e(s.variants[0].params)+" ("+e(s.variants[0].size)+") ",1)),t("button",{disabled:P(`${s.name}:${B(s).tag}`)||P(s.name),class:"rounded-lg bg-accent px-3 py-1 text-[10px] text-white hover:bg-accent-hover disabled:opacity-40 transition-colors",onClick:v=>K(s)},e(d.$t("settings.models.pull")),9,es)])]),i.value.has(`${s.name}:${B(s).tag}`)||i.value.has(s.name)?(o(),r("div",ss,[t("div",as,[t("div",{class:"h-full rounded-full bg-accent transition-all duration-300",style:X({width:`${(i.value.get(`${s.name}:${B(s).tag}`)??i.value.get(s.name))?.percent??0}%`})},null,4)]),t("p",os,e((i.value.get(`${s.name}:${B(s).tag}`)??i.value.get(s.name))?.status),1)])):$("",!0)]))),128))])),t("div",ns,[t("p",rs,e(d.$t("settings.models.pullByName")),1),t("div",ls,[L(t("input",{"onUpdate:modelValue":m[2]||(m[2]=s=>y.value=s),type:"text",placeholder:"e.g. llama3.2:3b",class:"flex-1 rounded-lg border border-border-default bg-surface px-3 py-2 text-sm text-text-primary placeholder-text-muted outline-none focus:border-accent font-mono",onKeydown:pt(H,["enter"])},null,544),[[q,y.value]]),t("button",{disabled:!y.value.trim()||P(y.value.trim()),class:"rounded-lg bg-accent px-4 py-2 text-sm text-white hover:bg-accent-hover disabled:opacity-40 transition-colors",onClick:H},e(d.$t("settings.models.pull")),9,is)]),(o(!0),r(C,null,T(i.value,([s,v])=>(o(),r(C,{key:s},[M.value.some(V=>`${V.name}:${B(V).tag}`===s||V.name===s)?$("",!0):(o(),r("div",ds,[t("div",cs,[t("span",us,e(s),1),t("span",null,e(v.percent)+"%",1)]),t("div",ps,[t("div",{class:"h-full rounded-full bg-accent transition-all duration-300",style:X({width:`${v.percent}%`})},null,4)]),t("p",gs,e(v.status),1)]))],64))),128))])])]))}}),xs={class:"space-y-6"},vs={class:"rounded-lg border border-border-default bg-surface-raised p-4 space-y-4"},bs={class:"text-sm font-medium text-text-primary"},fs={class:"text-[10px] text-text-muted"},hs={class:"block text-xs text-text-secondary mb-1"},ys={class:"flex gap-3"},_s={class:"flex items-center gap-2 text-sm"},$s={class:"text-text-secondary"},ks={class:"text-text-primary font-medium"},ws={key:0,class:"text-xs text-error"},Bs={class:"flex gap-3"},Cs=["disabled"],Ms={class:"border-t border-border-default pt-3"},zs={key:0,class:"mt-3 space-y-2 text-xs text-text-secondary"},Gs=W({__name:"SettingsIntegrationsTab",setup(A){const l=ft(),f=h(l.clientId),x=h(!1);function _(){l.updateClientId(f.value)}return(g,p)=>(o(),r("div",xs,[t("div",vs,[t("h3",bs,e(g.$t("settings.integrations.googleIntegration")),1),t("p",fs,e(g.$t("settings.integrations.googleIntegrationDesc")),1),t("div",null,[t("label",hs,e(g.$t("settings.integrations.oauthClientId")),1),t("div",ys,[L(t("input",{"onUpdate:modelValue":p[0]||(p[0]=w=>f.value=w),class:"flex-1 rounded-lg border border-border-default bg-surface px-3 py-2 text-sm text-text-primary placeholder:text-text-muted focus:border-accent focus:outline-none font-mono",placeholder:"123456789-abcdef.apps.googleusercontent.com"},null,512),[[q,f.value]]),t("button",{class:"rounded-lg bg-surface-overlay px-4 py-2 text-sm text-text-primary hover:bg-border-default transition-colors",onClick:_},e(g.$t("common.actions.save")),1)])]),t("div",_s,[t("span",{class:E(["inline-block h-2 w-2 rounded-full",{"bg-success":b(l).connected,"bg-error":!b(l).connected&&!b(l).isAuthenticating,"bg-warning animate-pulse":b(l).isAuthenticating}])},null,2),t("span",$s,[b(l).isAuthenticating?(o(),r(C,{key:0},[D(e(g.$t("settings.integrations.authenticating")),1)],64)):b(l).connected?(o(),r(C,{key:1},[D(e(g.$t("settings.integrations.connectedAs"))+" ",1),t("span",ks,e(b(l).userEmail??"unknown"),1)],64)):(o(),r(C,{key:2},[D(e(g.$t("settings.integrations.notConnected")),1)],64))])]),b(l).error?(o(),r("p",ws,e(b(l).error),1)):$("",!0),t("div",Bs,[b(l).connected?$("",!0):(o(),r("button",{key:0,class:"rounded-lg bg-accent px-4 py-2 text-sm text-surface hover:bg-accent-hover transition-colors disabled:opacity-50 disabled:cursor-not-allowed",disabled:!b(l).clientId||b(l).isAuthenticating,onClick:p[1]||(p[1]=w=>b(l).connect())},e(g.$t("settings.integrations.connectGoogleAccount")),9,Cs)),b(l).connected?(o(),r("button",{key:1,class:"rounded-lg border border-error/30 px-4 py-2 text-sm text-error hover:bg-error/10 transition-colors",onClick:p[2]||(p[2]=w=>b(l).disconnect())},e(g.$t("settings.integrations.disconnect")),1)):$("",!0)]),t("div",Ms,[t("button",{class:"text-xs text-accent hover:text-accent-hover transition-colors",onClick:p[3]||(p[3]=w=>x.value=!x.value)},e(x.value?g.$t("settings.integrations.hideSetup"):g.$t("settings.integrations.showSetup")),1),x.value?(o(),r("div",zs,[...p[4]||(p[4]=[st('<p class="font-medium text-text-primary">One-time setup (5 minutes):</p><ol class="list-decimal list-inside space-y-2 ms-1"><li>Go to <a href="https://console.cloud.google.com/" target="_blank" rel="noopener" class="text-accent hover:underline">Google Cloud Console</a> and create a new project</li><li>Enable the <a href="https://console.cloud.google.com/apis/library/calendar-json.googleapis.com" target="_blank" rel="noopener" class="text-accent hover:underline">Google Calendar API</a></li><li>Enable the <a href="https://console.cloud.google.com/apis/library/gmail.googleapis.com" target="_blank" rel="noopener" class="text-accent hover:underline">Gmail API</a></li><li>Go to <a href="https://console.cloud.google.com/apis/credentials/consent" target="_blank" rel="noopener" class="text-accent hover:underline">OAuth consent screen</a>, set up as <strong>External</strong>, add your email as a <strong>test user</strong></li><li>Go to <a href="https://console.cloud.google.com/apis/credentials" target="_blank" rel="noopener" class="text-accent hover:underline">Credentials</a>, click <strong>+ Create Credentials</strong> → <strong>OAuth 2.0 Client ID</strong></li><li>Set application type to <strong>Web application</strong></li><li>Add <strong>Authorized JavaScript origins</strong>: <code class="bg-surface rounded px-1.5 py-0.5 text-[11px] font-mono text-text-primary">http://localhost:5173</code></li><li>Add <strong>Authorized redirect URIs</strong>: <code class="bg-surface rounded px-1.5 py-0.5 text-[11px] font-mono text-text-primary">http://localhost:5173/auth/google/callback</code></li><li>Copy the <strong>Client ID</strong> and paste it above, then click Save</li><li>Click <strong>Connect Google Account</strong> above</li></ol><div class="mt-3 rounded-lg bg-surface-overlay p-3 text-[11px]"><p class="font-medium text-text-primary mb-1">Note: &quot;App not verified&quot; warning</p><p>Google will show a warning because your app is in testing mode. Click <strong>Advanced</strong> → <strong>Go to [your project name] (unsafe)</strong> to proceed.</p></div>',3)])])):$("",!0)])])]))}}),Ss={},Ls={class:"space-y-6"},As={class:"rounded-lg border border-border-default bg-surface-raised p-5 space-y-4"},Ts={class:"flex items-center gap-3"},Ds={class:"text-xs text-text-muted"},Is={class:"grid grid-cols-[auto_1fr] gap-y-2 gap-x-4 text-xs"},Vs={class:"text-text-muted"},Us={class:"text-text-muted"},Es={class:"text-text-muted"},Rs={class:"rounded-lg border border-border-default bg-surface-raised p-5 space-y-3"},js={class:"text-sm font-medium text-text-primary"};function qs(A,l){return o(),r("div",Ls,[t("div",As,[t("div",Ts,[l[1]||(l[1]=t("span",{class:"text-2xl font-bold text-accent"},"xR",-1)),t("div",null,[l[0]||(l[0]=t("h3",{class:"text-sm font-semibold text-text-primary"},"LLMxRay",-1)),t("p",Ds,e(A.$t("settings.about.localLlmObservatory")),1)])]),t("div",Is,[t("span",Vs,e(A.$t("settings.about.version")),1),l[2]||(l[2]=t("span",{class:"text-text-primary"},"1.0.0",-1)),t("span",Us,e(A.$t("settings.about.license")),1),l[3]||(l[3]=t("span",{class:"text-text-primary"},"Apache 2.0",-1)),t("span",Es,e(A.$t("settings.about.repository")),1),l[4]||(l[4]=t("a",{href:"https://github.com/LogneBudo/llmxray",target:"_blank",rel:"noopener",class:"text-accent hover:underline"}," github.com/LogneBudo/llmxray ",-1))])]),t("div",Rs,[t("h3",js,e(A.$t("settings.about.techStack")),1),l[5]||(l[5]=st('<div class="grid grid-cols-2 gap-2 text-xs"><div class="rounded-lg bg-surface p-2.5"><p class="font-medium text-text-primary">Vue 3.5</p><p class="text-[10px] text-text-muted">Composition API + TypeScript</p></div><div class="rounded-lg bg-surface p-2.5"><p class="font-medium text-text-primary">Vite 7</p><p class="text-[10px] text-text-muted">Build tooling + dev server</p></div><div class="rounded-lg bg-surface p-2.5"><p class="font-medium text-text-primary">Tailwind CSS 4</p><p class="text-[10px] text-text-muted">Utility-first styling</p></div><div class="rounded-lg bg-surface p-2.5"><p class="font-medium text-text-primary">Pinia 3</p><p class="text-[10px] text-text-muted">State management</p></div><div class="rounded-lg bg-surface p-2.5"><p class="font-medium text-text-primary">Ollama</p><p class="text-[10px] text-text-muted">Local LLM runtime</p></div><div class="rounded-lg bg-surface p-2.5"><p class="font-medium text-text-primary">IndexedDB</p><p class="text-[10px] text-text-muted">Browser-native persistence</p></div><div class="rounded-lg bg-surface p-2.5"><p class="font-medium text-text-primary">D3.js + Chart.js</p><p class="text-[10px] text-text-muted">Data visualization</p></div><div class="rounded-lg bg-surface p-2.5"><p class="font-medium text-text-primary">pdfjs + mammoth</p><p class="text-[10px] text-text-muted">Document parsing</p></div></div>',1))])])}const Ns=ht(Ss,[["render",qs]]),Ps={class:"space-y-6"},Os={class:"text-lg font-semibold text-text-primary"},Fs={class:"text-sm text-text-secondary mt-1"},Ws={class:"rounded-lg border border-accent/20 bg-accent/5 px-4 py-3 text-xs text-text-secondary space-y-1.5"},Hs={class:"font-medium text-text-primary"},Js={class:"space-y-1 ps-4 list-disc text-text-muted"},Qs={key:0,class:"flex items-center justify-center py-12"},Ks={class:"rounded-lg border border-border-default bg-surface-raised p-4"},Zs={class:"flex flex-wrap gap-3"},Xs={class:"space-y-1"},Ys={class:"text-xs text-text-muted"},ta={value:"all"},ea={value:"benchmark"},sa={value:"comparison"},aa={value:"chat"},oa={value:"training"},na={value:"session"},ra={class:"space-y-1"},la={class:"text-xs text-text-muted"},ia={value:""},da=["value"],ca={key:0,class:"space-y-1"},ua={class:"text-xs text-text-muted"},pa={value:""},ga=["value"],ma={class:"space-y-1"},xa={class:"text-xs text-text-muted"},va={value:"all"},ba={value:"7d"},fa={value:"30d"},ha={value:"90d"},ya={class:"space-y-1"},_a={class:"text-xs text-text-muted"},$a=["placeholder"],ka={class:"rounded-lg border border-border-default bg-surface-raised p-4 space-y-3"},wa={class:"text-xs text-text-muted"},Ba={key:0,class:"py-8 text-center text-sm text-text-secondary"},Ca={key:1,class:"max-h-96 overflow-y-auto space-y-1"},Ma={class:"text-base flex-shrink-0"},za={class:"flex-1 text-sm text-text-primary truncate"},Ga={class:"flex-shrink-0 rounded-full bg-surface-overlay px-2 py-0.5 text-[10px] text-text-secondary"},Sa={key:0,class:"flex-shrink-0 rounded-full bg-accent/10 px-2 py-0.5 text-[10px] text-accent"},La={key:1,class:"flex-shrink-0 rounded-full bg-warning/10 px-2 py-0.5 text-[10px] text-warning"},Aa={class:"flex-shrink-0 text-[10px] text-text-muted w-14 text-right"},Ta={class:"rounded-lg border border-border-default bg-surface-raised"},Da={key:0,class:"px-4 pb-4 space-y-4"},Ia={class:"grid grid-cols-1 md:grid-cols-2 gap-4"},Va={class:"text-xs text-text-muted mb-2"},Ua={class:"h-40"},Ea={class:"text-xs text-text-muted mb-2"},Ra={class:"h-40"},ja={class:"rounded-lg border border-border-default bg-surface-raised p-4 space-y-4"},qa={class:"text-sm font-medium text-text-primary"},Na={class:"flex gap-6 text-sm"},Pa={class:"text-text-muted"},Oa={class:"ml-1 text-text-primary font-medium"},Fa={class:"text-text-muted"},Wa={class:"ml-1 text-text-primary font-medium"},Ha={class:"flex flex-wrap gap-3"},Ja={class:"flex items-center gap-3"},Qa={class:"text-sm text-text-muted"},Ka=["value"],Za={value:"forever"},Xa={value:"30d"},Ya={value:"90d"},to={value:"1y"},eo={key:1,class:"rounded-lg border border-error/30 bg-error/5 p-3 space-y-3"},so={class:"text-sm text-text-secondary"},ao={class:"flex gap-2"},oo=W({__name:"SettingsHistoryTab",setup(A){yt.register(_t,$t,kt,wt,Bt,Ct,Mt);const{t:l}=tt(),f=h([]),x=h(!0),_=h("all"),g=h(""),p=h(""),w=h("all"),M=h(""),G=h(!0),B=h(!1),R=h(localStorage.getItem("llmxray-history-retention")??"forever"),N=z(()=>[...new Set(f.value.map(c=>c.model))].sort()),i=z(()=>[...new Set(f.value.map(c=>c.language).filter(Boolean))].sort()),u=z(()=>i.value.length>0);function y(a){const c=Date.now();switch(a){case"7d":return c-10080*60*1e3;case"30d":return c-720*60*60*1e3;case"90d":return c-2160*60*60*1e3;default:return 0}}const I=z(()=>f.value.filter(a=>{if(_.value!=="all"&&a.type!==_.value||g.value&&a.model!==g.value||p.value&&a.language!==p.value)return!1;if(w.value!=="all"){const c=y(w.value);if(a.timestamp<c)return!1}return!(M.value&&!a.tags?.some(c=>c.toLowerCase().includes(M.value.toLowerCase())))})),K={benchmark:"🎯",comparison:"🔄",chat:"💬",training:"📊",session:"⚡"};function H(a){const c=Date.now()-a,n=Math.floor(c/1e3);if(n<60)return`${n}s ago`;const k=Math.floor(n/60);if(k<60)return`${k}m ago`;const S=Math.floor(k/60);if(S<24)return`${S}h ago`;const U=Math.floor(S/24);return U<30?`${U}d ago`:`${Math.floor(U/30)}mo ago`}const P=z(()=>{const a=f.value.length*500;return a<1024?`${a} B`:a<1024*1024?`${(a/1024).toFixed(1)} KB`:`${(a/(1024*1024)).toFixed(1)} MB`}),d=z(()=>{const a=Date.now(),c=1440*60*1e3,n=[],k=[];for(let S=29;S>=0;S--){const U=a-S*c,at=U+c,ot=new Date(U);n.push(`${ot.getMonth()+1}/${ot.getDate()}`),k.push(f.value.filter(nt=>nt.timestamp>=U&&nt.timestamp<at).length)}return{labels:n,datasets:[{label:l("settings.history.trends.activity"),data:k,backgroundColor:"rgba(168, 85, 247, 0.6)",borderColor:"#a855f7",borderWidth:1}]}}),m=z(()=>{const a=new Map;for(const k of f.value)a.set(k.model,(a.get(k.model)??0)+1);const c=[...a.entries()].sort((k,S)=>S[1]-k[1]),n=["#a855f7","#3b82f6","#10b981","#f59e0b","#ef4444","#8b5cf6","#06b6d4","#84cc16","#f97316","#ec4899"];return{labels:c.map(([k])=>k),datasets:[{data:c.map(([,k])=>k),backgroundColor:c.map((k,S)=>n[S%n.length]),borderWidth:0}]}}),s={responsive:!0,maintainAspectRatio:!1,plugins:{legend:{display:!1}},scales:{x:{ticks:{color:"#94a3b8",font:{size:9},maxRotation:0},grid:{display:!1}},y:{ticks:{color:"#94a3b8",font:{size:10},stepSize:1},grid:{color:"rgba(71, 85, 105, 0.3)"}}}},v={responsive:!0,maintainAspectRatio:!1,plugins:{legend:{position:"right",labels:{color:"#94a3b8",font:{size:11},boxWidth:12}}}};function V(){St(f.value,"llmxray-history.json")}function J(){const a=["type","timestamp","model","language","summary","accuracy","tokenTaxRatio","tags"],c=I.value.map(n=>[n.type,new Date(n.timestamp).toISOString(),n.model,n.language??"",n.summary,n.accuracy!=null?String(n.accuracy):"",n.tokenTaxRatio!=null?String(n.tokenTaxRatio):"",(n.tags??[]).join(";")]);Lt(a,c,"llmxray-history-filtered.csv")}function Q(a){R.value=a,localStorage.setItem("llmxray-history-retention",a)}async function Z(){await rt.entries.clear(),f.value=[],B.value=!1}return et(async()=>{f.value=await rt.entries.reverse().sortBy("timestamp"),x.value=!1}),(a,c)=>(o(),r("div",Ps,[t("div",null,[t("h2",Os,e(a.$t("settings.history.title")),1),t("p",Fs,e(a.$t("settings.history.subtitle")),1)]),t("div",Ws,[t("p",Hs,e(a.$t("settings.history.storage.title")),1),t("p",null,e(a.$t("settings.history.storage.description")),1),t("ul",Js,[t("li",null,e(a.$t("settings.history.storage.indexedDb")),1),t("li",null,e(a.$t("settings.history.storage.historyDb")),1),t("li",null,e(a.$t("settings.history.storage.privacy")),1)])]),x.value?(o(),r("div",Qs,[...c[9]||(c[9]=[t("div",{class:"h-6 w-6 animate-spin rounded-full border-2 border-accent border-t-transparent"},null,-1)])])):(o(),r(C,{key:1},[t("div",Ks,[t("div",Zs,[t("div",Xs,[t("label",Ys,e(a.$t("settings.history.filters.type")),1),L(t("select",{"onUpdate:modelValue":c[0]||(c[0]=n=>_.value=n),class:"rounded-lg border border-border-default bg-surface px-3 py-1.5 text-sm text-text-primary focus:border-accent focus:outline-none"},[t("option",ta,e(a.$t("settings.history.filters.all")),1),t("option",ea,e(a.$t("settings.history.types.benchmark")),1),t("option",sa,e(a.$t("settings.history.types.comparison")),1),t("option",aa,e(a.$t("settings.history.types.chat")),1),t("option",oa,e(a.$t("settings.history.types.training")),1),t("option",na,e(a.$t("settings.history.types.session")),1)],512),[[F,_.value]])]),t("div",ra,[t("label",la,e(a.$t("settings.history.filters.model")),1),L(t("select",{"onUpdate:modelValue":c[1]||(c[1]=n=>g.value=n),class:"rounded-lg border border-border-default bg-surface px-3 py-1.5 text-sm text-text-primary focus:border-accent focus:outline-none"},[t("option",ia,e(a.$t("settings.history.filters.all")),1),(o(!0),r(C,null,T(N.value,n=>(o(),r("option",{key:n,value:n},e(n),9,da))),128))],512),[[F,g.value]])]),u.value?(o(),r("div",ca,[t("label",ua,e(a.$t("settings.history.filters.language")),1),L(t("select",{"onUpdate:modelValue":c[2]||(c[2]=n=>p.value=n),class:"rounded-lg border border-border-default bg-surface px-3 py-1.5 text-sm text-text-primary focus:border-accent focus:outline-none"},[t("option",pa,e(a.$t("settings.history.filters.all")),1),(o(!0),r(C,null,T(i.value,n=>(o(),r("option",{key:n,value:n},e(n),9,ga))),128))],512),[[F,p.value]])])):$("",!0),t("div",ma,[t("label",xa,e(a.$t("settings.history.filters.dateRange")),1),L(t("select",{"onUpdate:modelValue":c[3]||(c[3]=n=>w.value=n),class:"rounded-lg border border-border-default bg-surface px-3 py-1.5 text-sm text-text-primary focus:border-accent focus:outline-none"},[t("option",va,e(a.$t("settings.history.filters.allTime")),1),t("option",ba,e(a.$t("settings.history.filters.last7days")),1),t("option",fa,e(a.$t("settings.history.filters.last30days")),1),t("option",ha,e(a.$t("settings.history.filters.last90days")),1)],512),[[F,w.value]])]),t("div",ya,[t("label",_a,e(a.$t("settings.history.filters.tags")),1),L(t("input",{"onUpdate:modelValue":c[4]||(c[4]=n=>M.value=n),class:"rounded-lg border border-border-default bg-surface px-3 py-1.5 text-sm text-text-primary focus:border-accent focus:outline-none w-36",placeholder:a.$t("settings.history.filters.tags")},null,8,$a),[[q,M.value]])])])]),t("div",ka,[t("div",wa,e(a.$t("settings.history.results.entries",{count:I.value.length})),1),I.value.length===0?(o(),r("div",Ba,e(a.$t("settings.history.results.noEntries")),1)):(o(),r("div",Ca,[(o(!0),r(C,null,T(I.value,n=>(o(),r("div",{key:n.id,class:"flex items-center gap-3 rounded-lg px-3 py-2 hover:bg-surface-overlay transition-colors"},[t("span",Ma,e(K[n.type]??""),1),t("span",za,e(n.summary),1),t("span",Ga,e(n.model),1),n.language?(o(),r("span",Sa,e(n.language),1)):$("",!0),n.type==="comparison"&&n.tokenTaxRatio!=null?(o(),r("span",La,e(n.tokenTaxRatio.toFixed(2))+"x ",1)):$("",!0),n.type==="benchmark"&&n.accuracy!=null?(o(),r("span",{key:2,class:E(["flex-shrink-0 rounded-full px-2 py-0.5 text-[10px]",n.accuracy>=.8?"bg-success/10 text-success":n.accuracy>=.5?"bg-warning/10 text-warning":"bg-error/10 text-error"])},e((n.accuracy*100).toFixed(0))+"% ",3)):$("",!0),t("span",Aa,e(H(n.timestamp)),1)]))),128))]))]),t("div",Ta,[t("button",{class:"flex w-full items-center justify-between p-4 text-sm font-medium text-text-primary hover:bg-surface-overlay transition-colors rounded-lg",onClick:c[5]||(c[5]=n=>G.value=!G.value)},[D(e(a.$t("settings.history.trends.title"))+" ",1),t("span",{class:E(["text-text-muted transition-transform",{"rotate-180":G.value}])},[...c[10]||(c[10]=[t("svg",{class:"h-4 w-4",viewBox:"0 0 20 20",fill:"currentColor"},[t("path",{"fill-rule":"evenodd",d:"M5.293 7.293a1 1 0 011.414 0L10 10.586l3.293-3.293a1 1 0 111.414 1.414l-4 4a1 1 0 01-1.414 0l-4-4a1 1 0 010-1.414z","clip-rule":"evenodd"})],-1)])],2)]),G.value?(o(),r("div",Da,[t("div",Ia,[t("div",null,[t("h4",Va,e(a.$t("settings.history.trends.activity")),1),t("div",Ua,[j(b(zt),{data:d.value,options:s},null,8,["data"])])]),t("div",null,[t("h4",Ea,e(a.$t("settings.history.trends.modelsUsed")),1),t("div",Ra,[j(b(Gt),{data:m.value,options:v},null,8,["data"])])])])])):$("",!0)]),t("div",ja,[t("h3",qa,e(a.$t("settings.history.management.title")),1),t("div",Na,[t("div",null,[t("span",Pa,e(a.$t("settings.history.management.totalEntries"))+":",1),t("span",Oa,e(f.value.length),1)]),t("div",null,[t("span",Fa,e(a.$t("settings.history.management.estimatedSize"))+":",1),t("span",Wa,e(P.value),1)])]),t("div",Ha,[t("button",{class:"rounded-lg bg-surface-overlay px-4 py-2 text-sm text-text-primary hover:bg-border-default transition-colors",onClick:V},e(a.$t("settings.history.management.exportAll")),1),t("button",{class:"rounded-lg bg-surface-overlay px-4 py-2 text-sm text-text-primary hover:bg-border-default transition-colors",onClick:J},e(a.$t("settings.history.management.exportFiltered")),1)]),t("div",Ja,[t("label",Qa,e(a.$t("settings.history.management.retention"))+":",1),t("select",{value:R.value,class:"rounded-lg border border-border-default bg-surface px-3 py-1.5 text-sm text-text-primary focus:border-accent focus:outline-none",onChange:c[6]||(c[6]=n=>Q(n.target.value))},[t("option",Za,e(a.$t("settings.history.management.keepForever")),1),t("option",Xa,e(a.$t("settings.history.management.days30")),1),t("option",Ya,e(a.$t("settings.history.management.days90")),1),t("option",to,e(a.$t("settings.history.management.year1")),1)],40,Ka)]),t("div",null,[B.value?(o(),r("div",eo,[t("p",so,e(a.$t("settings.history.management.confirmClear")),1),t("div",ao,[t("button",{class:"rounded-lg bg-error px-4 py-2 text-sm text-white hover:bg-error/80 transition-colors",onClick:Z},e(a.$t("settings.history.management.clearHistory")),1),t("button",{class:"rounded-lg bg-surface-overlay px-4 py-2 text-sm text-text-primary hover:bg-border-default transition-colors",onClick:c[8]||(c[8]=n=>B.value=!1)},e(a.$t("common.cancel")),1)])])):(o(),r("button",{key:0,class:"rounded-lg bg-error/10 px-4 py-2 text-sm text-error hover:bg-error/20 transition-colors",onClick:c[7]||(c[7]=n=>B.value=!0)},e(a.$t("settings.history.management.clearHistory")),1))])])],64))]))}}),no={class:"max-w-4xl space-y-6"},bo=W({__name:"SettingsPage",setup(A){const{t:l}=tt(),f=gt(),x=h(f.query.tab??"general"),_=z(()=>[{key:"general",label:l("settings.tabs.general")},{key:"models",label:l("settings.tabs.models")},{key:"integrations",label:l("settings.tabs.integrations")},{key:"about",label:l("settings.tabs.about")},{key:"history",label:l("settings.tabs.history")}]);return(g,p)=>(o(),r("div",no,[j(mt,{tabs:_.value,"active-tab":x.value,"onUpdate:activeTab":p[0]||(p[0]=w=>x.value=w)},null,8,["tabs","active-tab"]),x.value==="general"?(o(),O(fe,{key:0})):x.value==="models"?(o(),O(ms,{key:1})):x.value==="integrations"?(o(),O(Gs,{key:2})):x.value==="about"?(o(),O(Ns,{key:3})):x.value==="history"?(o(),O(oo,{key:4})):$("",!0)]))}});export{bo as default};