llmxray 0.3.1 → 0.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/assets/{AITrainingPage-BmiTLvwB.js → AITrainingPage-CD-bWVvC.js} +1 -1
- package/dist/assets/{BenchmarkPage-CwCXzzrb.js → BenchmarkPage-bp73Urv7.js} +1 -1
- package/dist/assets/ComparisonPage-BcSW8bNz.js +4 -0
- package/dist/assets/{DashboardPage-CKQaBKDw.js → DashboardPage-BikhI-WR.js} +16 -16
- package/dist/assets/{EmbeddingsPage-DJdyD65Q.js → EmbeddingsPage-DY0ClOT-.js} +1 -1
- package/dist/assets/{GoogleCallbackPage-2hfuqKEi.js → GoogleCallbackPage-CVk5U2In.js} +1 -1
- package/dist/assets/{JsonTreeNode-DckR4Nv8.js → JsonTreeNode-BQTLLZr8.js} +1 -1
- package/dist/assets/{ModelCapabilityIcons.vue_vue_type_script_setup_true_lang-DUHfiPBt.js → ModelCapabilityIcons.vue_vue_type_script_setup_true_lang-CC-8ifev.js} +1 -1
- package/dist/assets/{RAGPage-jMq_Sg9F.js → RAGPage-DrqXiDs6.js} +1 -1
- package/dist/assets/{SessionPage-C6jIbcq2.js → SessionPage-BClm8k5v.js} +1 -1
- package/dist/assets/SettingsPage-RH-JaBkt.js +1 -0
- package/dist/assets/{StatusBadge.vue_vue_type_script_setup_true_lang-D24kGmB6.js → StatusBadge.vue_vue_type_script_setup_true_lang-BoFt8y4m.js} +1 -1
- package/dist/assets/{StorageGauge.vue_vue_type_style_index_0_lang-CLdARZMv.js → StorageGauge.vue_vue_type_style_index_0_lang-Cww3ylyV.js} +1 -1
- package/dist/assets/{SystemPage-BbfTFebq.js → SystemPage-Dl-w53Tz.js} +2 -2
- package/dist/assets/{TabBar.vue_vue_type_script_setup_true_lang-BV7bRKLd.js → TabBar.vue_vue_type_script_setup_true_lang-D1bxlZ11.js} +1 -1
- package/dist/assets/{TokenStreamDisplay.vue_vue_type_script_setup_true_lang-Cilrzwrg.js → TokenStreamDisplay.vue_vue_type_script_setup_true_lang-DbN5kS19.js} +1 -1
- package/dist/assets/{ToolWorkshopPage-BEFjvNVE.js → ToolWorkshopPage-UupUHgP6.js} +1 -1
- package/dist/assets/{agent-store-tglPObkH.js → agent-store-Bmti9EJM.js} +1 -1
- package/dist/assets/generate-service-BdGdFlEd.js +3 -0
- package/dist/assets/{google-auth-store-pjk41Wop.js → google-auth-store-9fvZi3sc.js} +1 -1
- package/dist/assets/index-BQSbu0e6.css +1 -0
- package/dist/assets/{index-Cq76cPsM.js → index-Co0VhPSQ.js} +1 -1
- package/dist/assets/index-DVVzacEJ.js +6 -0
- package/dist/assets/{metrics-store-oAZX_4PZ.js → metrics-store-CcJejDWm.js} +1 -1
- package/dist/assets/{rag-store-D6KNr_hW.js → rag-store-D6-tUXow.js} +1 -1
- package/dist/assets/{storage-store-D4WuNdQB.js → storage-store-C2BSRTMJ.js} +1 -1
- package/dist/assets/{stream-handler-_fccIkW6.js → stream-handler-DcWLXVUd.js} +1 -1
- package/dist/assets/{tool-workshop-store-Dz7QH2FM.js → tool-workshop-store-CvimeN9w.js} +1 -1
- package/dist/assets/{toolcall-store-BFoy2Mdx.js → toolcall-store-DxrTJwPf.js} +1 -1
- package/dist/assets/{trash-2-CbznmmWI.js → trash-2-CKMNSCOl.js} +1 -1
- package/dist/index.html +2 -2
- package/package.json +2 -1
- package/dist/assets/ComparisonPage-nfG681cT.js +0 -1
- package/dist/assets/SettingsPage-CpDVuxxG.js +0 -1
- package/dist/assets/generate-service-UqpNGQas.js +0 -3
- package/dist/assets/index-CCnJ2vPZ.css +0 -1
- package/dist/assets/index-DVvWJgFn.js +0 -6
|
@@ -1 +1 @@
|
|
|
1
|
-
import{d as T,r as i,a as f}from"./index-
|
|
1
|
+
import{d as T,r as i,a as f}from"./index-DVVzacEJ.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,5 +1,5 @@
|
|
|
1
1
|
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/index-DoAHVxX6.js","assets/_commonjsHelpers-DsqdWQfm.js","assets/papaparse.min-3s4OkBbM.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-
|
|
2
|
+
import{_ as y,n as x,o as _,d as $,r as f,a as b}from"./index-DVVzacEJ.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
4
|
`)}async function j(e){const o=await y(()=>import("./index-DoAHVxX6.js").then(r=>r.i),__vite__mapDeps([0,1])),c=await e.arrayBuffer();return(await o.extractRawText({arrayBuffer:c})).value}async function R(e){const o=await y(()=>import("./papaparse.min-3s4OkBbM.js").then(n=>n.p),__vite__mapDeps([2,1])),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:`
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{d as g,r as d,a as f}from"./index-
|
|
1
|
+
import{d as g,r as d,a as f}from"./index-DVVzacEJ.js";const b=[{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"]}];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 y(s){if(s==null)return 0;if(typeof s!="object")return String(s).length*2;const e=s;let t=0;for(const a of Object.keys(e)){t+=a.length*2;const n=e[a];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+=y(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 l=i.result;l?(c+=y(l.value),r++,l.continue()):t({name:e,bytes:c,count:r})},i.onerror=()=>t({name:e,bytes:0,count:0})})}async function w(s,e){const t=await v(s);if(!t)return{totalBytes:0,recordCount:0,stores:e.map(a=>({name:a,bytes:0,count:0}))};try{const a=[];for(const r of e)a.push(await h(t,r));const n=a.reduce((r,i)=>r+i.bytes,0),c=a.reduce((r,i)=>r+i.count,0);return{totalBytes:n,recordCount:c,stores:a}}finally{t.close()}}async function S(){const s=[];for(const e of b){const{totalBytes:t,recordCount:a,stores:n}=await w(e.dbName,e.stores);s.push({id:e.id,label:e.label,icon:e.icon,type:"indexeddb",totalBytes:t,recordCount:a,stores:n})}return s}const B=g("storage",()=>{const s=d(null),e=d([]),t=d(!1),a=d(null),n=f(()=>e.value.reduce((o,u)=>o+u.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((o,u)=>o+u.recordCount,0));function i(o){return e.value.find(u=>u.id===o)}async function l(){t.value=!0;try{const[o,u]=await Promise.all([p(),S()]);s.value=o,e.value=u,a.value=Date.now()}catch(o){console.error("Failed to estimate storage:",o)}finally{t.value=!1}}async function m(o=3e4){(!a.value||Date.now()-a.value>o)&&await l()}return{origin:s,databases:e,loading:t,lastUpdated:a,totalUsedBytes:n,usedPercent:c,totalRecordCount:r,getDatabaseById:i,refresh:l,refreshIfStale:m}});export{B as u};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{n as u,A as z}from"./index-
|
|
1
|
+
import{n as u,A as z}from"./index-DVVzacEJ.js";import{u as G,a as q}from"./toolcall-store-DxrTJwPf.js";import{a as R,b as E,u as J}from"./agent-store-Bmti9EJM.js";import{u as $}from"./metrics-store-CcJejDWm.js";const B=1e6;function F(t,n,a,e,c){const s=(e.total_duration??0)/B,o=(e.load_duration??0)/B,i=(e.prompt_eval_duration??0)/B,l=(e.eval_duration??0)/B,p=e.prompt_eval_count??0,r=e.eval_count??0,h=l>0?r/l*1e3:0,f=i>0?p/i*1e3:0,d=c.length>0?c[0]:0;return{sessionId:t,model:n,startedAt:a,completedAt:Date.now(),ttftMs:d,totalDurationMs:s,loadDurationMs:o,promptEvalDurationMs:i,evalDurationMs:l,tokensPerSecond:h,promptTokensPerSecond:f,promptTokenCount:p,completionTokenCount:r,totalTokenCount:p+r,tokenLatencies:c}}class V{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:u(),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:u(),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 H=[{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 H){const c=n.match(a);if(c)return{type:e,content:c[1]??n}}return null}async function Z(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 h=r.slice(6);if(h==="[DONE]")return;try{const f=JSON.parse(h);n(f)}catch{}}}}finally{e.releaseLock()}}async function W(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 h=JSON.parse(r);n(h)}catch{}}}if(s.trim())try{const o=JSON.parse(s.trim());n(o)}catch{}}finally{e.releaseLock()}}async function I(t,n,a){const e=G(),c=R(),s=$(),o=E(),i=J(),l=Date.now();let p=0,r=l,h="";const f=[],d=z(),b=e.sessionById(t),y=b?d.isThinkingModel(b.model):!1,x=new V({patternDetection:y});i.initGraph(t),i.addNode(t,{id:u(),type:"start",label:"Generation Start",sessionId:t,stepIndex:0,state:{},timestamp:l}),e.updateSessionStatus(t,"streaming"),await W(n,g=>{const M=Date.now(),D=M-r;h+=g.response;const C=j(D,f),v={id:u(),index:p++,text:g.response,timestamp:M,confidence:C,cumulativeText:h,interTokenLatencyMs:D};c.pushToken(t,v),e.appendOutput(t,g.response),f.push(D),r=M;const k=x.processToken(v,h);if(o.setThinking(t,x.isThinking,x.thinkingContent),k&&(o.addStep(t,k),i.addNode(t,{id:u(),type:"decision",label:`${k.type}: ${k.content.slice(0,40)}...`,sessionId:t,stepIndex:k.index,state:{reasoning:k.type},timestamp:k.timestamp})),g.done){x.finalize(),o.setThinking(t,!1,""),g.done_reason&&e.setDoneReason(t,g.done_reason);const m=e.sessionById(t);if(m){const T=F(t,m.model,l,g,f);s.recordMetrics(t,T),e.finalizeSession(t,T),s.recalculateAggregate()}i.addNode(t,{id:u(),type:"output",label:"Generation Complete",sessionId:t,stepIndex:p,state:{tokenCount:p},timestamp:Date.now()})}},a)}async function tt(t,n,a){const e=G(),c=R(),s=$(),o=E(),i=q(),l=J(),p=Date.now();let r=0,h=p,f="",d="",b="",y=!1;const x=[],g=[],M=z(),D=e.sessionById(t),C=D?M.isThinkingModel(D.model):!1,v=new V({patternDetection:C});l.initGraph(t);const k=l.getGraph(t);return(!k||k.nodes.length===0)&&l.addNode(t,{id:u(),type:"start",label:"Chat Start",sessionId:t,stepIndex:0,state:{},timestamp:p}),e.updateSessionStatus(t,"streaming"),await W(n,m=>{const T=Date.now(),w=T-h,A=m.message.thinking;if(A){y=!0,d+=A,o.setThinking(t,!0,d),x.push(w),h=T;return}y&&d&&!m.done&&(o.setThinking(t,!1,d),d.trim()&&o.addStep(t,{id:u(),index:0,type:"thought",content:d.trim(),startTokenIndex:0,endTokenIndex:r,timestamp:T,durationMs:T-p}),b=d,d="");const N=m.message.content;f+=N;let P,L;m.logprobs&&m.logprobs.length>0?(L=m.logprobs[0].logprob,P=Math.exp(L)):P=j(w,x);const O={id:u(),index:r++,text:N,timestamp:T,confidence:P,logprob:L,cumulativeText:f,interTokenLatencyMs:w};if(c.pushToken(t,O),e.appendOutput(t,N),x.push(w),h=T,!y){const S=v.processToken(O,f);o.setThinking(t,v.isThinking,v.thinkingContent),S&&o.addStep(t,S)}if(m.message.tool_calls)for(const S of m.message.tool_calls){g.push(S);const _={id:u(),sessionId:t,index:i.getToolCalls(t).length,functionName:S.function.name,arguments:S.function.arguments,status:"pending",startedAt:T,tokenIndexStart:r};i.addToolCall(t,_),l.addNode(t,{id:u(),type:"tool_call",label:`Tool: ${S.function.name}`,sessionId:t,stepIndex:r,state:{tool:S.function.name,args:S.function.arguments},timestamp:T})}if(m.done&&(y&&d.trim()&&(b=d,o.addStep(t,{id:u(),index:0,type:"thought",content:d.trim(),startTokenIndex:0,endTokenIndex:r,timestamp:Date.now(),durationMs:Date.now()-p})),v.finalize(),o.setThinking(t,!1,y?b:""),m.done_reason&&e.setDoneReason(t,m.done_reason),g.length===0)){const S=e.sessionById(t);if(S){const _=F(t,S.model,p,m,x);s.recordMetrics(t,_),e.finalizeSession(t,_),s.recalculateAggregate()}l.addNode(t,{id:u(),type:"output",label:"Chat Complete",sessionId:t,stepIndex:r,state:{tokenCount:r},timestamp:Date.now()})}},a),{toolCalls:g}}function j(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{I as a,tt as e,Z as r};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{d as k,r as f,a as u,n as x}from"./index-
|
|
1
|
+
import{d as k,r as f,a as u,n as x}from"./index-DVVzacEJ.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 m,r as f,a as S,n as M,J as x}from"./index-
|
|
1
|
+
import{d as m,r as f,a as S,n as M,J as x}from"./index-DVVzacEJ.js";const B=m("sessions",()=>{const n=f(new Map),u=f(null),l=f(new Map),v=S(()=>u.value?n.value.get(u.value)??null:null),d=S(()=>[...n.value.values()].sort((e,s)=>s.createdAt-e.createdAt));function o(e){return n.value.get(e)}function a(e){const s=M(),t={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 n.value.set(s,t),s}function i(e,s){l.value.set(e,s)}function c(e,s){const t=n.value.get(e);t&&(t.status=s)}function r(e,s){const t=n.value.get(e);t&&(t.outputText+=s)}function g(e,s){const t=n.value.get(e);if(t){t.status="completed",t.metrics=s;const p=l.value.get(e);p&&x.saveSession(t,p).catch(console.error)}}function C(e,s){const t=n.value.get(e);t&&(t.status="error",t.error=s)}function T(e){const s=n.value.get(e);s&&(s.status="cancelled")}function w(e,s){const t=n.value.get(e);t&&(t.doneReason=s)}function A(e){u.value=e}return{sessions:n,activeSessionId:u,activeSession:v,recentSessions:d,sessionConversationMap:l,sessionById:o,createSession:a,linkSessionToConversation:i,updateSessionStatus:c,appendOutput:r,finalizeSession:g,setSessionError:C,cancelSession:T,setDoneReason:w,setActiveSession:A}}),D=m("toolcalls",()=>{const n=f(new Map);function u(o){return n.value.get(o)??[]}function l(o){return u(o).filter(a=>a.status==="pending")}function v(o,a){let i=n.value.get(o);i||(i=[],n.value.set(o,i)),i.push(a)}function d(o,a,i){const c=n.value.get(o);if(!c)return;const r=c.find(g=>g.id===a);r&&Object.assign(r,i)}return{callsBySession:n,getToolCalls:u,getPendingCalls:l,addToolCall:v,updateToolCall:d}});export{D as a,B as u};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{c as a}from"./index-
|
|
1
|
+
import{c as a}from"./index-DVVzacEJ.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
|
@@ -5,8 +5,8 @@
|
|
|
5
5
|
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
|
|
6
6
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
7
7
|
<title>LLMxRay — Local LLM Observatory</title>
|
|
8
|
-
<script type="module" crossorigin src="/assets/index-
|
|
9
|
-
<link rel="stylesheet" crossorigin href="/assets/index-
|
|
8
|
+
<script type="module" crossorigin src="/assets/index-DVVzacEJ.js"></script>
|
|
9
|
+
<link rel="stylesheet" crossorigin href="/assets/index-BQSbu0e6.css">
|
|
10
10
|
</head>
|
|
11
11
|
<body>
|
|
12
12
|
<script>
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "llmxray",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.2",
|
|
4
4
|
"description": "Local LLM Observatory — See what your AI is actually doing, token by token.",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"type": "module",
|
|
@@ -37,6 +37,7 @@
|
|
|
37
37
|
},
|
|
38
38
|
"dependencies": {
|
|
39
39
|
"express": "^5.1.0",
|
|
40
|
+
"franc-min": "^6.2.0",
|
|
40
41
|
"http-proxy-middleware": "^3.0.3",
|
|
41
42
|
"lucide-vue-next": "^0.577.0",
|
|
42
43
|
"vue-i18n": "^10.0.8"
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{d as H,r as S,a as $,n as R,b as T,A as Q,N as Y,B as K,e as v,f as t,t as c,i as w,F as k,k as I,u as D,p as P,X as ee,g as M,h as te,j as f,q as E,w as se,C as O,G as A,l as z,D as oe}from"./index-DVvWJgFn.js";import{u as ne}from"./toolcall-store-BFoy2Mdx.js";import{s as re}from"./generate-service-UqpNGQas.js";import{u as X}from"./metrics-store-oAZX_4PZ.js";import{c as le,a as ae}from"./format-BqVZ9rwM.js";import{_ as Z,b as N}from"./StatusBadge.vue_vue_type_script_setup_true_lang-D24kGmB6.js";import{_ as ue}from"./TokenStreamDisplay.vue_vue_type_script_setup_true_lang-Cilrzwrg.js";import{D as ie}from"./base-CrPFMexR.js";import"./stream-handler-_fccIkW6.js";import"./agent-store-tglPObkH.js";const de=H("comparison",()=>{const o=S(new Map),e=S(null),s=$(()=>e.value?o.value.get(e.value)??null:null);function r(p,d){const g=R(),h=d.map(u=>({slotId:u.slotId,model:u.model,label:u.label,sessionId:"",status:"idle",outputText:"",metrics:null}));return o.value.set(g,{id:g,prompt:p,slots:d,createdAt:Date.now(),status:"running",executions:h}),e.value=g,g}function l(p,d,g){const h=o.value.get(p);if(!h)return;const u=h.executions.find(_=>_.slotId===d);u&&Object.assign(u,g)}function i(p){const d=o.value.get(p);if(d){const g=d.executions.every(h=>h.status==="completed"||h.status==="error");d.status=g?"completed":"partial"}}function a(p,d){return o.value.get(p)?.executions.find(g=>g.slotId===d)}return{runs:o,activeRunId:e,activeRun:s,createRun:r,updateExecution:l,finalizeRun:i,getExecution:a}});function ce(o,e){const s=e.filter(p=>p.model===o.model);if(s.length<=1)return o.model;if(new Set(s.map(p=>p.options.temperature??.7)).size===s.length)return`${o.model} @ ${(o.options.temperature??.7).toFixed(2)}`;if(new Set(s.map(p=>p.system)).size===s.length&&o.system){const p=o.system.split(/\s+/)[0]??"",d=p.length>12?p.slice(0,12)+"...":p;return`${o.model} (${d})`}if(new Set(s.map(p=>p.options.seed)).size===s.length&&o.options.seed!=null)return`${o.model} seed:${o.options.seed}`;const a=s.findIndex(p=>p.slotId===o.slotId);return`${o.model} #${a+1}`}const pe={class:"rounded-lg border border-border-default bg-surface-raised p-4 space-y-4"},me={class:"flex items-center justify-between"},fe={class:"text-sm font-medium text-text-primary"},xe={class:"text-[11px] text-text-muted mt-0.5"},ve={class:"flex items-center gap-2"},he={class:"text-[11px] text-text-muted"},ge={class:"group relative"},be={class:"pointer-events-none absolute left-0 top-full z-10 mt-1.5 w-64 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"},_e={class:"font-medium text-text-primary mb-1"},ye={class:"group relative"},$e={class:"pointer-events-none absolute left-0 top-full z-10 mt-1.5 w-64 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"},ke={class:"font-medium text-text-primary mb-1"},we={class:"flex items-center gap-3"},Ie={class:"flex items-center justify-center h-5 w-5 rounded-full bg-surface-overlay text-[10px] font-bold text-text-secondary shrink-0"},Se=["value","onChange"],Ce=["value"],Me=["title","onClick"],Pe={class:"flex items-center gap-2"},Te=["onClick"],We={class:"text-[10px] text-text-muted"},Fe={key:0,class:"space-y-3 pt-1 border-t border-border-default/50"},De={class:"text-[11px] text-text-muted block mb-1"},Ee=["value","placeholder","onInput"],je={class:"flex items-center justify-between mb-1"},Re={class:"text-[11px] text-text-muted"},ze={class:"text-[11px] text-text-primary font-medium"},Ne=["value","onInput"],Oe={class:"flex items-center justify-between mb-1"},Be={class:"text-[11px] text-text-muted"},Le={class:"text-[11px] text-text-primary font-medium"},Ae=["value","onInput"],Ve={class:"text-[11px] text-text-muted block mb-1"},Je=["value","placeholder","onInput"],Ue={class:"text-[11px]"},qe={class:"text-text-muted cursor-pointer hover:text-text-secondary"},Ge={class:"mt-2 space-y-2"},Xe={class:"flex items-center gap-2"},Ze={class:"text-text-muted w-24 shrink-0"},He=["value","onInput"],Qe={class:"flex items-center gap-2"},Ye={class:"text-text-muted w-24 shrink-0"},Ke=["value","onInput"],et={class:"flex items-center gap-2"},tt={class:"text-text-muted w-24 shrink-0"},st=["value","onChange"],ot={value:0},nt={class:"flex items-center gap-2"},rt={class:"text-text-muted w-24 shrink-0"},lt=["value","placeholder","onInput"],at={class:"flex items-center gap-2"},ut={class:"text-text-muted w-24 shrink-0"},it=["value","placeholder","onInput"],dt={key:0,class:"rounded-lg border border-dashed border-border-default py-8 text-center space-y-3"},ct={class:"text-sm text-text-secondary"},pt={class:"text-xs text-text-muted max-w-sm mx-auto"},mt=T({__name:"ComparisonSlotConfigurator",props:{slots:{default:()=>[]},slotsModifiers:{}},emits:["update:slots"],setup(o){const e=Q(),s=Y(o,"slots"),r=S({});function l(){if(s.value.length>=4)return;const n=e.chatModelNames[0]??"",x={slotId:R(),model:n,label:"",system:"",options:{temperature:.7}},m=[...s.value,x];s.value=g(m)}function i(n){delete r.value[n];const x=s.value.filter(m=>m.slotId!==n);s.value=g(x)}function a(){r.value={},s.value=[]}function p(n,x){const m=s.value.map(y=>y.slotId===n?{...y,...x}:y);s.value=g(m)}function d(n,x){const m=s.value.map(y=>y.slotId===n?{...y,options:{...y.options,...x}}:y);s.value=g(m)}function g(n){return n.map(x=>({...x,label:ce(x,n)}))}function h(n){r.value[n]=!r.value[n]}function u(n){const x=e.chatModelNames[0]??"";if(!x)return;let m;if(n==="temp-sweep")m=[.2,.7,1.2].map(y=>({slotId:R(),model:x,label:"",system:"",options:{temperature:y}}));else{const y=Math.floor(Math.random()*1e5);m=[.3,1].map(b=>({slotId:R(),model:x,label:"",system:"",options:{temperature:b,seed:y}}))}s.value=g(m)}function _(n){const x=[],m=n.options.temperature;return m!=null&&x.push(`temp ${m.toFixed(2)}`),n.options.top_p!=null&&x.push(`top_p ${n.options.top_p}`),n.options.seed!=null&&x.push(`seed ${n.options.seed}`),n.system&&x.push("system prompt"),x.join(", ")||"defaults"}return K(async()=>{e.models.length===0&&await e.fetchModels()}),(n,x)=>(f(),v("div",pe,[t("div",me,[t("div",null,[t("h3",fe,c(n.$t("comparison.configurator.title")),1),t("p",xe,c(n.$t("comparison.configurator.description")),1)]),s.value.length>0?(f(),v("button",{key:0,class:"rounded-md border border-border-default px-2.5 py-1 text-[11px] text-text-muted hover:border-error hover:text-error transition-colors shrink-0 self-start",onClick:a},c(n.$t("comparison.configurator.clearAll")),1)):w("",!0)]),t("div",ve,[t("span",he,c(n.$t("comparison.configurator.presets.quickStart")),1),t("div",ge,[t("button",{class:"rounded-md border border-border-default px-2.5 py-1 text-[11px] text-text-secondary hover:border-accent hover:text-text-primary transition-colors",onClick:x[0]||(x[0]=m=>u("temp-sweep"))},c(n.$t("comparison.configurator.presets.tempSweep")),1),t("div",be,[t("p",_e,c(n.$t("comparison.configurator.presets.tempSweep")),1),t("p",null,c(n.$t("comparison.configurator.presets.tempSweepDesc")),1)])]),t("div",ye,[t("button",{class:"rounded-md border border-border-default px-2.5 py-1 text-[11px] text-text-secondary hover:border-accent hover:text-text-primary transition-colors",onClick:x[1]||(x[1]=m=>u("deterministic-pair"))},c(n.$t("comparison.configurator.presets.deterministicPair")),1),t("div",$e,[t("p",ke,c(n.$t("comparison.configurator.presets.deterministicPair")),1),t("p",null,c(n.$t("comparison.configurator.presets.deterministicPairDesc")),1)])])]),(f(!0),v(k,null,I(s.value,(m,y)=>(f(),v("div",{key:m.slotId,class:"rounded-lg border border-border-default bg-surface p-3 space-y-2"},[t("div",we,[t("span",Ie,c(y+1),1),t("select",{value:m.model,class:"flex-1 rounded-lg border border-border-default bg-surface-raised px-3 py-1.5 text-sm text-text-primary focus:border-accent focus:outline-none",onChange:b=>p(m.slotId,{model:b.target.value})},[(f(!0),v(k,null,I(D(e).chatModelNames,b=>(f(),v("option",{key:b,value:b},c(b)+" "+c(D(e).capabilityIcons(b)),9,Ce))),128))],40,Se),t("button",{class:"rounded-md p-1 text-text-muted hover:text-error transition-colors",title:n.$t("comparison.configurator.removeSlot"),onClick:b=>i(m.slotId)},[P(D(ee),{class:"h-4 w-4"})],8,Me)]),t("div",Pe,[t("button",{class:"flex items-center gap-1.5 text-[11px] text-text-secondary hover:text-text-primary transition-colors",onClick:b=>h(m.slotId)},[(f(),v("svg",{class:M(["h-3 w-3 transition-transform",r.value[m.slotId]?"rotate-90":""]),viewBox:"0 0 24 24",fill:"currentColor"},[...x[2]||(x[2]=[t("path",{d:"M8 5l8 7-8 7z"},null,-1)])],2)),te(" "+c(n.$t("comparison.configurator.settings")),1)],8,Te),t("span",We,c(_(m)),1)]),r.value[m.slotId]?(f(),v("div",Fe,[t("div",null,[t("label",De,c(n.$t("comparison.configurator.systemPrompt")),1),t("textarea",{value:m.system,rows:"2",class:"w-full rounded-md border border-border-default bg-surface-raised px-2.5 py-1.5 text-xs text-text-primary placeholder-text-muted focus:border-accent focus:outline-none resize-none",placeholder:n.$t("comparison.configurator.optionalSystemPrompt"),onInput:b=>p(m.slotId,{system:b.target.value})},null,40,Ee)]),t("div",null,[t("div",je,[t("label",Re,c(n.$t("comparison.configurator.temperature")),1),t("span",ze,c((m.options.temperature??.7).toFixed(1)),1)]),t("input",{type:"range",min:"0",max:"2",step:"0.1",value:m.options.temperature??.7,class:"w-full",onInput:b=>d(m.slotId,{temperature:parseFloat(b.target.value)})},null,40,Ne)]),t("div",null,[t("div",Oe,[t("label",Be,c(n.$t("comparison.configurator.topP")),1),t("span",Le,c((m.options.top_p??.9).toFixed(2)),1)]),t("input",{type:"range",min:"0",max:"1",step:"0.05",value:m.options.top_p??.9,class:"w-full",onInput:b=>d(m.slotId,{top_p:parseFloat(b.target.value)})},null,40,Ae)]),t("div",null,[t("label",Ve,c(n.$t("comparison.configurator.seed")),1),t("input",{type:"number",value:m.options.seed??"",class:"w-full rounded-md border border-border-default bg-surface-raised px-2.5 py-1.5 text-xs text-text-primary placeholder-text-muted focus:border-accent focus:outline-none",placeholder:n.$t("comparison.configurator.seedPlaceholder"),onInput:b=>d(m.slotId,{seed:b.target.value?parseInt(b.target.value,10):void 0})},null,40,Je)]),t("details",Ue,[t("summary",qe,c(n.$t("comparison.configurator.advanced")),1),t("div",Ge,[t("div",Xe,[t("label",Ze,c(n.$t("comparison.configurator.topK")),1),t("input",{type:"number",value:m.options.top_k??"",class:"flex-1 rounded-md border border-border-default bg-surface-raised px-2 py-1 text-xs text-text-primary focus:border-accent focus:outline-none",placeholder:"40",onInput:b=>d(m.slotId,{top_k:b.target.value?parseInt(b.target.value,10):void 0})},null,40,He)]),t("div",Qe,[t("label",Ye,c(n.$t("comparison.configurator.repeatPenalty")),1),t("input",{type:"number",step:"0.1",value:m.options.repeat_penalty??"",class:"flex-1 rounded-md border border-border-default bg-surface-raised px-2 py-1 text-xs text-text-primary focus:border-accent focus:outline-none",placeholder:"1.1",onInput:b=>d(m.slotId,{repeat_penalty:b.target.value?parseFloat(b.target.value):void 0})},null,40,Ke)]),t("div",et,[t("label",tt,c(n.$t("comparison.configurator.mirostat")),1),t("select",{value:m.options.mirostat??0,class:"flex-1 rounded-md border border-border-default bg-surface-raised px-2 py-1 text-xs text-text-primary focus:border-accent focus:outline-none",onChange:b=>d(m.slotId,{mirostat:parseInt(b.target.value,10)||void 0})},[t("option",ot,c(n.$t("comparison.configurator.mirostatOff")),1),x[3]||(x[3]=t("option",{value:1},"Mirostat 1",-1)),x[4]||(x[4]=t("option",{value:2},"Mirostat 2",-1))],40,st)]),t("div",nt,[t("label",rt,c(n.$t("comparison.configurator.maxTokens")),1),t("input",{type:"number",value:m.options.num_predict??"",class:"flex-1 rounded-md border border-border-default bg-surface-raised px-2 py-1 text-xs text-text-primary focus:border-accent focus:outline-none",placeholder:n.$t("comparison.configurator.defaultPlaceholder"),onInput:b=>d(m.slotId,{num_predict:b.target.value?parseInt(b.target.value,10):void 0})},null,40,lt)]),t("div",at,[t("label",ut,c(n.$t("comparison.configurator.contextLength")),1),t("input",{type:"number",value:m.options.num_ctx??"",class:"flex-1 rounded-md border border-border-default bg-surface-raised px-2 py-1 text-xs text-text-primary focus:border-accent focus:outline-none",placeholder:n.$t("comparison.configurator.defaultPlaceholder"),onInput:b=>d(m.slotId,{num_ctx:b.target.value?parseInt(b.target.value,10):void 0})},null,40,it)])])])])):w("",!0)]))),128)),s.value.length===0?(f(),v("div",dt,[t("p",ct,c(n.$t("comparison.configurator.emptyTitle")),1),t("p",pt,c(n.$t("comparison.configurator.emptyDescription")),1),t("button",{class:"rounded-lg bg-accent px-4 py-2 text-sm font-medium text-surface hover:bg-accent-hover transition-colors",onClick:l},c(n.$t("comparison.configurator.addFirstSlot")),1)])):s.value.length<4?(f(),v("button",{key:1,class:"w-full rounded-lg border border-dashed border-border-default py-2.5 text-sm text-text-muted hover:border-accent hover:text-text-primary transition-colors",onClick:l},c(n.$t("comparison.configurator.addSlotCount",{current:s.value.length})),1)):w("",!0)]))}}),ft={class:"rounded-lg border border-border-default bg-surface-raised overflow-hidden"},xt={class:"border-b border-border-default px-4 py-3 space-y-1"},vt={class:"flex items-center justify-between"},ht={class:"text-sm font-semibold text-text-primary"},gt={key:0,class:"flex flex-wrap gap-1"},bt={class:"p-4 space-y-3"},_t={key:1,class:"grid grid-cols-3 gap-2"},yt=T({__name:"ComparisonColumn",props:{execution:{},slotConfig:{}},setup(o){const e=o,s=X(),r=$(()=>e.execution.sessionId?s.getMetrics(e.execution.sessionId):null),l=$(()=>e.execution.label||e.execution.model),i=$(()=>{if(!e.slotConfig)return[];const a=[],p=e.slotConfig.options;return p.temperature!=null&&a.push(`temp ${p.temperature.toFixed(1)}`),p.top_p!=null&&a.push(`top_p ${p.top_p}`),p.seed!=null&&a.push(`seed ${p.seed}`),e.slotConfig.system&&a.push("sys prompt"),a});return(a,p)=>(f(),v("div",ft,[t("div",xt,[t("div",vt,[t("span",ht,c(l.value),1),P(Z,{status:o.execution.status},null,8,["status"])]),i.value.length>0?(f(),v("div",gt,[(f(!0),v(k,null,I(i.value,d=>(f(),v("span",{key:d,class:"rounded-full bg-surface-overlay px-2 py-0.5 text-[10px] text-text-muted"},c(d),1))),128))])):w("",!0)]),t("div",bt,[o.execution.sessionId?(f(),E(ue,{key:0,"session-id":o.execution.sessionId},null,8,["session-id"])):w("",!0),r.value?(f(),v("div",_t,[P(N,{label:a.$t("comparison.metrics.ttft"),value:D(le)(r.value.ttftMs)},null,8,["label","value"]),P(N,{label:a.$t("comparison.metrics.speed"),value:D(ae)(r.value.tokensPerSecond)},null,8,["label","value"]),P(N,{label:a.$t("comparison.column.tokens"),value:r.value.completionTokenCount},null,8,["label","value"])])):w("",!0)])]))}}),$t=T({__name:"ComparisonGrid",props:{executions:{},slots:{}},setup(o){const e=o;function s(r){return e.slots.find(l=>l.slotId===r.slotId)}return(r,l)=>(f(),v("div",{class:M(["grid gap-4",{"grid-cols-1":o.executions.length===1,"grid-cols-2":o.executions.length===2,"grid-cols-2 xl:grid-cols-3":o.executions.length===3,"grid-cols-2 xl:grid-cols-4":o.executions.length>=4}])},[(f(!0),v(k,null,I(o.executions,i=>(f(),E(yt,{key:i.slotId,execution:i,"slot-config":s(i)},null,8,["execution","slot-config"]))),128))],2))}});function V(o,e){let s;for(s=0;s<o.length&&s<e.length;s++)if(o[s]!=e[s])return o.slice(0,s);return o.slice(0,s)}function J(o,e){let s;if(!o||!e||o[o.length-1]!=e[e.length-1])return"";for(s=0;s<o.length&&s<e.length;s++)if(o[o.length-(s+1)]!=e[e.length-(s+1)])return o.slice(-s);return o.slice(-s)}function B(o,e,s){if(o.slice(0,e.length)!=e)throw Error(`string ${JSON.stringify(o)} doesn't start with prefix ${JSON.stringify(e)}; this is a bug`);return s+o.slice(e.length)}function L(o,e,s){if(!e)return o+s;if(o.slice(-e.length)!=e)throw Error(`string ${JSON.stringify(o)} doesn't end with suffix ${JSON.stringify(e)}; this is a bug`);return o.slice(0,-e.length)+s}function W(o,e){return B(o,e,"")}function j(o,e){return L(o,e,"")}function U(o,e){return e.slice(0,kt(o,e))}function kt(o,e){let s=0;o.length>e.length&&(s=o.length-e.length);let r=e.length;o.length<e.length&&(r=o.length);const l=Array(r);let i=0;l[0]=0;for(let a=1;a<r;a++){for(e[a]==e[i]?l[a]=l[i]:l[a]=i;i>0&&e[a]!=e[i];)i=l[i];e[a]==e[i]&&i++}i=0;for(let a=s;a<o.length;a++){for(;i>0&&o[a]!=e[i];)i=l[i];o[a]==e[i]&&i++}return i}function F(o){let e;for(e=o.length-1;e>=0&&o[e].match(/\s/);e--);return o.substring(e+1)}function C(o){const e=o.match(/^\s*/);return e?e[0]:""}const q="a-zA-Z0-9_\\u{AD}\\u{C0}-\\u{D6}\\u{D8}-\\u{F6}\\u{F8}-\\u{2C6}\\u{2C8}-\\u{2D7}\\u{2DE}-\\u{2FF}\\u{1E00}-\\u{1EFF}",wt=new RegExp(`[${q}]+|\\s+|[^${q}]`,"ug");class It extends ie{equals(e,s,r){return r.ignoreCase&&(e=e.toLowerCase(),s=s.toLowerCase()),e.trim()===s.trim()}tokenize(e,s={}){let r;if(s.intlSegmenter){const a=s.intlSegmenter;if(a.resolvedOptions().granularity!="word")throw new Error('The segmenter passed must have a granularity of "word"');r=[];for(const p of Array.from(a.segment(e))){const d=p.segment;r.length&&/\s/.test(r[r.length-1])&&/\s/.test(d)?r[r.length-1]+=d:r.push(d)}}else r=e.match(wt)||[];const l=[];let i=null;return r.forEach(a=>{/\s/.test(a)?i==null?l.push(a):l.push(l.pop()+a):i!=null&&/\s/.test(i)?l[l.length-1]==i?l.push(l.pop()+a):l.push(i+a):l.push(a),i=a}),l}join(e){return e.map((s,r)=>r==0?s:s.replace(/^\s+/,"")).join("")}postProcess(e,s){if(!e||s.oneChangePerToken)return e;let r=null,l=null,i=null;return e.forEach(a=>{a.added?l=a:a.removed?i=a:((l||i)&&G(r,i,l,a),r=a,l=null,i=null)}),(l||i)&&G(r,i,l,null),e}}const St=new It;function Ct(o,e,s){return St.diff(o,e,s)}function G(o,e,s,r){if(e&&s){const l=C(e.value),i=F(e.value),a=C(s.value),p=F(s.value);if(o){const d=V(l,a);o.value=L(o.value,a,d),e.value=W(e.value,d),s.value=W(s.value,d)}if(r){const d=J(i,p);r.value=B(r.value,p,d),e.value=j(e.value,d),s.value=j(s.value,d)}}else if(s){if(o){const l=C(s.value);s.value=s.value.substring(l.length)}if(r){const l=C(r.value);r.value=r.value.substring(l.length)}}else if(o&&r){const l=C(r.value),i=C(e.value),a=F(e.value),p=V(l,i);e.value=W(e.value,p);const d=J(W(l,p),a);e.value=j(e.value,d),r.value=B(r.value,l,d),o.value=L(o.value,l,l.slice(0,l.length-d.length))}else if(r){const l=C(r.value),i=F(e.value),a=U(i,l);e.value=j(e.value,a)}else if(o){const l=F(o.value),i=C(e.value),a=U(l,i);e.value=W(e.value,a)}}const Mt={class:"rounded-lg border border-border-default bg-surface-raised p-4 space-y-3"},Pt={key:0,class:"text-sm text-text-muted text-center py-4"},Tt={key:0,class:"flex items-center gap-3 text-sm"},Wt={class:"text-text-muted text-xs"},Ft=["value","disabled"],Dt={class:"text-text-muted text-xs"},Et=["value","disabled"],jt={class:"flex items-center gap-4 text-[11px]"},Rt={class:"flex items-center gap-1.5"},zt={class:"text-text-muted"},Nt={class:"flex items-center gap-1.5"},Ot={class:"text-text-muted"},Bt={class:"rounded-md border border-border-default bg-surface p-3 text-sm leading-relaxed max-h-96 overflow-y-auto"},Lt=T({__name:"ComparisonDiffView",props:{executions:{}},setup(o){const e=o,s=$(()=>e.executions.filter(d=>d.status==="completed"&&d.outputText)),r=S(0),l=S(1);se(s,d=>{d.length>=2&&(r.value=0,l.value=1)},{immediate:!0});const i=$(()=>{const d=s.value[r.value],g=s.value[l.value];if(!d||!g)return[];const h=d.outputText.replace(/<think>[\s\S]*?<\/think>/g,"").trim(),u=g.outputText.replace(/<think>[\s\S]*?<\/think>/g,"").trim();return Ct(h,u)}),a=$(()=>s.value[r.value]?.label||s.value[r.value]?.model||""),p=$(()=>s.value[l.value]?.label||s.value[l.value]?.model||"");return(d,g)=>(f(),v("div",Mt,[s.value.length<2?(f(),v("div",Pt,c(d.$t("comparison.diff.needTwoResults")),1)):(f(),v(k,{key:1},[s.value.length>2?(f(),v("div",Tt,[t("span",Wt,c(d.$t("comparison.diff.compare")),1),O(t("select",{"onUpdate:modelValue":g[0]||(g[0]=h=>r.value=h),class:"rounded-md border border-border-default bg-surface px-2 py-1 text-xs text-text-primary focus:border-accent focus:outline-none"},[(f(!0),v(k,null,I(s.value,(h,u)=>(f(),v("option",{key:h.slotId,value:u,disabled:u===l.value},c(h.label||h.model),9,Ft))),128))],512),[[A,r.value,void 0,{number:!0}]]),t("span",Dt,c(d.$t("comparison.diff.vs")),1),O(t("select",{"onUpdate:modelValue":g[1]||(g[1]=h=>l.value=h),class:"rounded-md border border-border-default bg-surface px-2 py-1 text-xs text-text-primary focus:border-accent focus:outline-none"},[(f(!0),v(k,null,I(s.value,(h,u)=>(f(),v("option",{key:h.slotId,value:u,disabled:u===r.value},c(h.label||h.model),9,Et))),128))],512),[[A,l.value,void 0,{number:!0}]])])):w("",!0),t("div",jt,[t("div",Rt,[g[2]||(g[2]=t("span",{class:"inline-block h-2.5 w-2.5 rounded-sm bg-success/30"},null,-1)),t("span",zt,c(d.$t("comparison.diff.only",{label:a.value})),1)]),t("div",Nt,[g[3]||(g[3]=t("span",{class:"inline-block h-2.5 w-2.5 rounded-sm bg-error/30"},null,-1)),t("span",Ot,c(d.$t("comparison.diff.only",{label:p.value})),1)])]),t("div",Bt,[(f(!0),v(k,null,I(i.value,(h,u)=>(f(),v("span",{key:u,class:M({"bg-success/20 text-success":h.removed,"bg-error/20 text-error":h.added,"text-text-primary":!h.added&&!h.removed})},c(h.value),3))),128))])],64))]))}}),At={key:0,class:"rounded-lg border border-border-default bg-surface-raised p-4 space-y-4"},Vt={class:"text-xs font-medium text-text-secondary"},Jt={class:"space-y-1.5"},Ut={class:"flex items-center justify-between"},qt={class:"text-[11px] text-text-muted"},Gt={class:"text-[10px] text-text-muted"},Xt={class:"text-[10px] text-text-secondary w-28 truncate shrink-0"},Zt={class:"flex-1 h-3 bg-surface rounded-full overflow-hidden"},Ht={class:"text-[10px] text-text-muted w-14 text-right shrink-0"},Qt={class:"space-y-1.5"},Yt={class:"flex items-center justify-between"},Kt={class:"text-[11px] text-text-muted"},es={class:"text-[10px] text-text-muted"},ts={class:"text-[10px] text-text-secondary w-28 truncate shrink-0"},ss={class:"flex-1 h-3 bg-surface rounded-full overflow-hidden"},os={class:"text-[10px] text-text-muted w-14 text-right shrink-0"},ns={class:"space-y-1.5"},rs={class:"flex items-center justify-between"},ls={class:"text-[11px] text-text-muted"},as={class:"text-[10px] text-text-secondary w-28 truncate shrink-0"},us={class:"flex-1 h-3 bg-surface rounded-full overflow-hidden"},is={class:"text-[10px] text-text-muted w-14 text-right shrink-0"},ds=T({__name:"ComparisonMetricsBar",props:{executions:{}},setup(o){const e=o,s=X(),r=$(()=>e.executions.filter(u=>u.status==="completed"&&u.sessionId).map(u=>{const _=s.getMetrics(u.sessionId);return{label:u.label||u.model,slotId:u.slotId,ttftMs:_?.ttftMs??0,tokensPerSecond:_?.tokensPerSecond??0,totalTokens:_?.completionTokenCount??0}})),l=$(()=>Math.max(...r.value.map(u=>u.ttftMs),1)),i=$(()=>Math.max(...r.value.map(u=>u.tokensPerSecond),1)),a=$(()=>Math.max(...r.value.map(u=>u.totalTokens),1)),p=$(()=>r.value.length===0?"":r.value.reduce((u,_)=>u.ttftMs<_.ttftMs&&u.ttftMs>0?u:_).slotId),d=$(()=>r.value.length===0?"":r.value.reduce((u,_)=>u.tokensPerSecond>_.tokensPerSecond?u:_).slotId),g=["bg-accent","bg-success","bg-warning","bg-error"];function h(u){return g[u%g.length]??"bg-accent"}return(u,_)=>r.value.length>=2?(f(),v("div",At,[t("h4",Vt,c(u.$t("comparison.metrics.performanceComparison")),1),t("div",Jt,[t("div",Ut,[t("span",qt,c(u.$t("comparison.metrics.timeToFirstToken")),1),t("span",Gt,c(u.$t("comparison.metrics.lowerBetter")),1)]),(f(!0),v(k,null,I(r.value,(n,x)=>(f(),v("div",{key:n.slotId+"-ttft",class:"flex items-center gap-2"},[t("span",Xt,c(n.label),1),t("div",Zt,[t("div",{class:M(["h-full rounded-full transition-all duration-500",[h(x),n.slotId===p.value?"opacity-100":"opacity-50"]]),style:z({width:`${n.ttftMs/l.value*100}%`})},null,6)]),t("span",Ht,c(n.ttftMs.toFixed(0))+"ms",1)]))),128))]),t("div",Qt,[t("div",Yt,[t("span",Kt,c(u.$t("comparison.metrics.tokensPerSec")),1),t("span",es,c(u.$t("comparison.metrics.higherBetter")),1)]),(f(!0),v(k,null,I(r.value,(n,x)=>(f(),v("div",{key:n.slotId+"-tps",class:"flex items-center gap-2"},[t("span",ts,c(n.label),1),t("div",ss,[t("div",{class:M(["h-full rounded-full transition-all duration-500",[h(x),n.slotId===d.value?"opacity-100":"opacity-50"]]),style:z({width:`${n.tokensPerSecond/i.value*100}%`})},null,6)]),t("span",os,c(n.tokensPerSecond.toFixed(1)),1)]))),128))]),t("div",ns,[t("div",rs,[t("span",ls,c(u.$t("comparison.metrics.totalTokens")),1)]),(f(!0),v(k,null,I(r.value,(n,x)=>(f(),v("div",{key:n.slotId+"-tokens",class:"flex items-center gap-2"},[t("span",as,c(n.label),1),t("div",us,[t("div",{class:M(["h-full rounded-full transition-all duration-500",h(x)]),style:z({width:`${n.totalTokens/a.value*100}%`})},null,6)]),t("span",is,c(n.totalTokens),1)]))),128))])])):w("",!0)}}),cs={class:"space-y-6"},ps={class:"rounded-lg border border-border-default bg-surface-raised p-4 space-y-3"},ms=["disabled","placeholder"],fs={class:"flex items-center justify-between"},xs={class:"text-xs text-text-muted"},vs=["disabled"],hs={key:0,class:"space-y-4"},gs={class:"flex items-center gap-3"},bs={class:"text-sm font-medium text-text-secondary"},_s={key:0,class:"ms-auto flex gap-1 rounded-lg border border-border-default p-0.5"},Ws=T({__name:"ComparisonPage",setup(o){const e=de(),s=ne(),r=S([]),l=S(""),i=S(!1),a=S("grid"),p=$(()=>e.activeRun),d=$(()=>r.value.length>0&&l.value.trim().length>0&&!i.value),g=$(()=>p.value?.executions.some(u=>u.status==="completed")??!1);async function h(){if(!d.value)return;i.value=!0,a.value="grid";const u=e.createRun(l.value.trim(),r.value),_=r.value.map(async n=>{try{const x=await re({model:n.model,prompt:l.value.trim(),system:n.system||void 0,options:n.options});e.updateExecution(u,n.slotId,{sessionId:x.sessionId,status:"streaming"});const m=setInterval(()=>{const y=s.sessionById(x.sessionId);y&&(y.status==="completed"||y.status==="error")&&(e.updateExecution(u,n.slotId,{status:y.status,outputText:y.outputText,metrics:y.metrics}),clearInterval(m),e.finalizeRun(u))},500)}catch{e.updateExecution(u,n.slotId,{status:"error"})}});await Promise.allSettled(_),i.value=!1}return(u,_)=>(f(),v("div",cs,[P(mt,{slots:r.value,"onUpdate:slots":_[0]||(_[0]=n=>r.value=n)},null,8,["slots"]),t("div",ps,[O(t("textarea",{"onUpdate:modelValue":_[1]||(_[1]=n=>l.value=n),class:"w-full rounded-lg border border-border-default bg-surface px-4 py-3 text-sm text-text-primary placeholder-text-muted focus:border-accent focus:outline-none resize-none",disabled:i.value,rows:"3",placeholder:u.$t("comparison.prompt.placeholder")},null,8,ms),[[oe,l.value]]),t("div",fs,[t("span",xs,c(u.$t("comparison.configurator.slotsConfigured",{count:r.value.length})),1),t("button",{class:"rounded-lg bg-accent px-4 py-2 text-sm font-medium text-surface hover:bg-accent-hover transition-colors disabled:opacity-50",disabled:!d.value,onClick:h},c(i.value?u.$t("comparison.prompt.running"):u.$t("comparison.prompt.compare")),9,vs)])]),p.value?(f(),v("div",hs,[t("div",gs,[t("h3",bs,c(u.$t("comparison.results.title")),1),P(Z,{status:p.value.status},null,8,["status"]),g.value?(f(),v("div",_s,[t("button",{class:M(["rounded-md px-2.5 py-1 text-[11px] transition-colors",a.value==="grid"?"bg-surface-overlay text-text-primary":"text-text-muted hover:text-text-secondary"]),onClick:_[2]||(_[2]=n=>a.value="grid")},c(u.$t("comparison.results.grid")),3),t("button",{class:M(["rounded-md px-2.5 py-1 text-[11px] transition-colors",a.value==="diff"?"bg-surface-overlay text-text-primary":"text-text-muted hover:text-text-secondary"]),onClick:_[3]||(_[3]=n=>a.value="diff")},c(u.$t("comparison.results.diff")),3)])):w("",!0)]),a.value==="grid"?(f(),E($t,{key:0,executions:p.value.executions,slots:p.value.slots},null,8,["executions","slots"])):(f(),E(Lt,{key:1,executions:p.value.executions},null,8,["executions"])),g.value?(f(),E(ds,{key:2,executions:p.value.executions},null,8,["executions"])):w("",!0)])):w("",!0)]))}});export{Ws as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{c as Z,b as I,z as J,an as X,B as W,e as r,f as e,t as s,C as G,D as L,g as N,h as B,O as P,l as U,G as Y,u as p,F as $,k as z,ao as ee,r as b,o as q,a as S,j as l,A as te,p as T,i as h,Q as se,q as A,ap as ae}from"./index-DVvWJgFn.js";import{_ as oe}from"./TabBar.vue_vue_type_script_setup_true_lang-BV7bRKLd.js";import{b as ne}from"./format-BqVZ9rwM.js";import{_ as le}from"./ModelCapabilityIcons.vue_vue_type_script_setup_true_lang-DUHfiPBt.js";import{T as re}from"./trash-2-CbznmmWI.js";import{u as ie}from"./google-auth-store-pjk41Wop.js";import{_ as de}from"./_plugin-vue_export-helper-DlAUqK2U.js";import"./google-auth-CfEcVMA7.js";const ce=Z("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"}]]),ue={class:"space-y-6"},pe={class:"rounded-lg border border-border-default bg-surface-raised p-4 space-y-4"},me={class:"text-sm font-medium text-text-primary"},ge={class:"flex gap-3"},xe={class:"flex items-center gap-2 text-sm"},ve={class:"text-text-secondary"},be={class:"rounded-lg border border-border-default bg-surface-raised p-4 space-y-4"},fe={class:"text-sm font-medium text-text-primary"},he={class:"space-y-6"},ye={class:"flex items-center gap-1.5 mb-3"},_e={class:"text-xs text-text-muted"},$e={class:"group relative"},ke={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"},Be={class:"font-medium text-text-primary mb-1"},we={class:"mb-2"},Ce={class:"space-y-1 text-[11px]"},Me={class:"ms-auto text-xs text-text-primary font-medium"},ze={class:"rounded-full bg-surface-overlay px-2 py-0.5 text-[10px] text-text-secondary"},Ge={class:"relative mt-0.5 h-3"},Le={class:"absolute inset-0 flex"},Se={class:"flex-[15] text-center text-[9px] text-text-muted border-e border-border-default/30"},Ae={class:"flex-[20] text-center text-[9px] text-text-muted border-e border-border-default/30"},Te={class:"flex-[25] text-center text-[9px] text-text-muted border-e border-border-default/30"},Ie={class:"flex-[40] text-center text-[9px] text-text-muted"},Ve={class:"relative h-1.5 mt-1"},De={class:"flex items-center gap-1.5 mb-2"},Ee={class:"text-xs text-text-muted"},Ue={class:"group relative"},qe={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"},Ne={class:"font-medium text-text-primary mb-1"},Pe={class:"mb-2"},je={class:"mt-2 text-[10px] text-text-muted"},Oe={class:"flex items-center gap-3"},Re={class:"text-[10px] text-text-muted"},Qe={class:"rounded-lg border border-border-default bg-surface-raised p-4 space-y-4"},Fe={class:"text-sm font-medium text-text-primary"},Je={class:"space-y-2"},We=["value"],He=["value"],Ke=I({__name:"SettingsGeneralTab",setup(k){const{t:a}=J(),v=X(),m=b("http://localhost:11434"),f=b(.7),g=b(4096),d=b("disconnected");function y(){const n=localStorage.getItem("llmxray-settings");if(n)try{const i=JSON.parse(n);typeof i.ollamaUrl=="string"&&(m.value=i.ollamaUrl,q.setBaseUrl(i.ollamaUrl+"/api")),typeof i.defaultTemperature=="number"&&(f.value=i.defaultTemperature),typeof i.defaultContextLength=="number"&&(g.value=i.defaultContextLength)}catch{}}function w(){localStorage.setItem("llmxray-settings",JSON.stringify({ollamaUrl:m.value,defaultTemperature:f.value,defaultContextLength:g.value}))}async function C(){d.value="testing";try{const n=await fetch(`${m.value}/api/tags`);d.value=n.ok?"connected":"disconnected"}catch{d.value="disconnected"}}function _(){w(),q.setBaseUrl(m.value+"/api")}const V=S(()=>{const n=f.value;return n===0?a("settings.general.temperatureDeterministic"):n<=.3?a("settings.general.temperatureFocused"):n<=.7?a("settings.general.temperatureBalanced"):n<=1.2?a("settings.general.temperatureCreative"):a("settings.general.temperatureVeryRandom")}),D=S(()=>f.value/2*100);return W(()=>{y(),C()}),(n,i)=>(l(),r("div",ue,[e("div",pe,[e("h3",me,s(n.$t("settings.general.ollamaConnection")),1),e("div",ge,[G(e("input",{"onUpdate:modelValue":i[0]||(i[0]=x=>m.value=x),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),[[L,m.value]]),e("button",{class:"rounded-lg bg-surface-overlay px-4 py-2 text-sm text-text-primary hover:bg-border-default transition-colors",onClick:C},s(n.$t("settings.general.testConnection")),1),e("button",{class:"rounded-lg bg-accent px-4 py-2 text-sm text-surface hover:bg-accent-hover transition-colors",onClick:_},s(n.$t("settings.general.save")),1)]),e("div",xe,[e("span",{class:N(["inline-block h-2 w-2 rounded-full",{"bg-success":d.value==="connected","bg-error":d.value==="disconnected","bg-warning animate-pulse":d.value==="testing"}])},null,2),e("span",ve,s(d.value==="connected"?n.$t("settings.general.connectionConnected"):d.value==="testing"?n.$t("settings.general.connectionTesting"):n.$t("settings.general.connectionDisconnected")),1)])]),e("div",be,[e("h3",fe,s(n.$t("settings.general.defaultParameters")),1),e("div",he,[e("div",null,[e("div",ye,[e("label",_e,s(n.$t("settings.general.temperature")),1),e("div",$e,[i[7]||(i[7]=e("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)),e("div",ke,[e("p",Be,s(n.$t("settings.general.temperatureTooltipTitle")),1),e("p",we,s(n.$t("settings.general.temperatureTooltipDesc")),1),e("ul",Ce,[e("li",null,[i[4]||(i[4]=e("strong",null,"0",-1)),B(" — "+s(n.$t("settings.general.temperatureTooltipZero")),1)]),e("li",null,[i[5]||(i[5]=e("strong",null,"0.7",-1)),B(" — "+s(n.$t("settings.general.temperatureTooltipDefault")),1)]),e("li",null,[i[6]||(i[6]=e("strong",null,"1.0+",-1)),B(" — "+s(n.$t("settings.general.temperatureTooltipHigh")),1)])])])]),e("span",Me,s(f.value),1),e("span",ze,s(V.value),1)]),G(e("input",{"onUpdate:modelValue":i[1]||(i[1]=x=>f.value=x),type:"range",min:"0",max:"2",step:"0.1",class:"w-full",onChange:w},null,544),[[L,f.value,void 0,{number:!0}]]),i[9]||(i[9]=P('<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)),e("div",Ge,[e("div",Le,[e("div",Se,s(n.$t("settings.general.temperatureFocused")),1),e("div",Ae,s(n.$t("settings.general.temperatureBalanced")),1),e("div",Te,s(n.$t("settings.general.temperatureCreative")),1),e("div",Ie,s(n.$t("settings.general.temperatureWild")),1)])]),e("div",Ve,[i[8]||(i[8]=e("div",{class:"absolute h-1.5 rounded-full bg-border-default/30 w-full"},null,-1)),e("div",{class:"absolute h-1.5 rounded-full bg-accent/60 transition-all duration-150",style:U({width:`${D.value}%`})},null,4)])]),e("div",null,[e("div",De,[e("label",Ee,s(n.$t("settings.general.contextLength")),1),e("div",Ue,[i[10]||(i[10]=e("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)),e("div",qe,[e("p",Ne,s(n.$t("settings.general.contextLengthTooltipTitle")),1),e("p",Pe,s(n.$t("settings.general.contextLengthTooltipDesc")),1),e("div",je,s(n.$t("settings.general.contextLengthTooltipNote")),1)])])]),e("div",Oe,[G(e("select",{"onUpdate:modelValue":i[2]||(i[2]=x=>g.value=x),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:w},[...i[11]||(i[11]=[e("option",{value:2048},"2,048",-1),e("option",{value:4096},"4,096",-1),e("option",{value:8192},"8,192",-1),e("option",{value:16384},"16,384",-1),e("option",{value:32768},"32,768",-1),e("option",{value:65536},"65,536",-1),e("option",{value:131072},"131,072",-1)])],544),[[Y,g.value,void 0,{number:!0}]]),e("span",Re,s(n.$t("settings.general.approximateWords",{count:Math.round(g.value*.75).toLocaleString()})),1)])])])]),e("div",Qe,[e("h3",Fe,s(n.$t("settings.general.language")),1),e("div",Je,[e("select",{value:p(v).locale,class:"w-full rounded-lg border border-border-default bg-surface px-3 py-2 text-sm text-text-primary",onChange:i[3]||(i[3]=x=>p(v).setLocale(x.target.value))},[(l(!0),r($,null,z(p(ee),x=>(l(),r("option",{key:x.code,value:x.code},s(x.flag)+" "+s(x.label),9,He))),128))],40,We)])])]))}}),F=[{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"}]}]}],Ze={class:"space-y-6"},Xe={class:"rounded-lg border border-border-default bg-surface-raised p-4 space-y-4"},Ye={class:"flex items-center justify-between"},et={class:"text-sm font-medium text-text-primary"},tt={class:"ms-1 text-text-muted"},st={key:0,class:"text-xs text-error"},at={key:1,class:"py-4 text-center text-sm text-text-muted"},ot={key:2,class:"space-y-1"},nt={class:"flex-1 min-w-0"},lt={class:"flex items-center gap-2"},rt={class:"font-medium text-text-primary truncate"},it={class:"flex gap-3 text-[10px] text-text-muted mt-0.5"},dt={key:0},ct={key:1},ut={key:2},pt={class:"shrink-0 text-[10px] text-text-muted"},mt=["onClick"],gt=["title","onClick"],xt={class:"rounded-lg border border-border-default bg-surface-raised p-4 space-y-4"},vt={class:"text-sm font-medium text-text-primary"},bt={class:"flex flex-wrap gap-1.5"},ft=["onClick"],ht=["placeholder"],yt={key:0,class:"text-xs text-error"},_t={key:1,class:"py-4 text-center text-sm text-text-muted"},$t={key:2,class:"space-y-2"},kt={class:"flex items-start gap-3"},Bt={class:"flex-1 min-w-0"},wt={class:"flex items-center gap-2"},Ct={class:"text-xs font-medium text-text-primary"},Mt={key:0,class:"rounded-full bg-success/10 px-1.5 py-0.5 text-[9px] text-success"},zt={class:"text-[10px] text-text-muted mt-0.5"},Gt={class:"flex items-center gap-2 shrink-0"},Lt=["value","onChange"],St=["value"],At={key:1,class:"text-[10px] text-text-muted"},Tt=["disabled","onClick"],It={key:0,class:"mt-2 space-y-1"},Vt={class:"h-1.5 rounded-full bg-surface-overlay overflow-hidden"},Dt={class:"text-[9px] text-text-muted"},Et={class:"border-t border-border-default pt-4"},Ut={class:"mb-2 text-xs text-text-muted"},qt={class:"flex gap-2"},Nt=["disabled"],Pt={key:0,class:"mt-2 space-y-1"},jt={class:"flex items-center justify-between text-[10px] text-text-muted"},Ot={class:"font-mono"},Rt={class:"h-1.5 rounded-full bg-surface-overlay overflow-hidden"},Qt={class:"text-[9px] text-text-muted"},Ft=I({__name:"SettingsModelsTab",setup(k){const a=te(),v=b(null),m=b(null);async function f(o){if(v.value===o){try{m.value=null,await a.deleteModel(o)}catch(c){m.value=c instanceof Error?c.message:"Delete failed"}v.value=null}else v.value=o,setTimeout(()=>{v.value===o&&(v.value=null)},3e3)}const g=b("all"),d=b(""),y=S(()=>[{key:"all",label:"All"},...F.map(o=>({key:o.key,label:o.label}))]),w=S(()=>{let o=[];for(const t of F)if(!(g.value!=="all"&&t.key!==g.value))for(const u of t.entries)o.push({...u,category:t.key});const c=d.value.toLowerCase().trim();return c&&(o=o.filter(t=>t.name.toLowerCase().includes(c)||t.description.toLowerCase().includes(c))),o}),C=b(new Map);function _(o){const c=C.value.get(o.name);return o.variants.find(t=>t.tag===c)??o.variants[0]}function V(o,c){const t=new Map(C.value);t.set(o,c),C.value=t}function D(o,c){const t=c==="latest"?o:`${o}:${c}`;return a.modelNames.some(u=>u===t||u===`${t}:latest`||u===o)}const n=b(new Map),i=b(null),x=b("");async function j(o){const c=new Map(n.value);c.set(o,{status:"Starting...",percent:0}),n.value=c,i.value=null;try{await q.pullModel(o,(u,M,R)=>{const Q=new Map(n.value),K=M&&R?Math.round(M/R*100):0;Q.set(o,{status:u,percent:K}),n.value=Q}),await a.fetchModels();const t=new Map(n.value);t.delete(o),n.value=t}catch(t){i.value=`Failed to pull ${o}: ${t instanceof Error?t.message:"Unknown error"}`;const u=new Map(n.value);u.delete(o),n.value=u}}function H(o){const c=_(o),t=c.tag==="latest"?o.name:`${o.name}:${c.tag}`;j(t)}function O(){const o=x.value.trim();o&&(j(o),x.value="")}function E(o){return n.value.has(o)}return W(()=>{a.models.length===0&&a.fetchModels()}),(o,c)=>(l(),r("div",Ze,[e("div",Xe,[e("div",Ye,[e("h3",et,[B(s(o.$t("settings.models.installedModels"))+" ",1),e("span",tt,"("+s(p(a).models.length)+")",1)]),e("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:c[0]||(c[0]=t=>p(a).fetchModels())},[T(p(ce),{class:"h-3.5 w-3.5"}),B(" "+s(o.$t("settings.models.refresh")),1)])]),m.value?(l(),r("p",st,s(m.value),1)):h("",!0),p(a).models.length===0?(l(),r("div",at,s(o.$t("settings.models.noModelsInstalled")),1)):(l(),r("div",ot,[(l(!0),r($,null,z(p(a).models,t=>(l(),r("div",{key:t.name,class:"flex items-center gap-3 rounded-lg bg-surface px-3 py-2.5 text-xs"},[e("div",nt,[e("div",lt,[e("span",rt,s(t.name),1),T(le,{"model-name":t.name},null,8,["model-name"])]),e("div",it,[t.details?.family?(l(),r("span",dt,s(t.details.family),1)):h("",!0),t.details?.parameter_size?(l(),r("span",ct,s(t.details.parameter_size),1)):h("",!0),t.details?.quantization_level?(l(),r("span",ut,s(t.details.quantization_level),1)):h("",!0)])]),e("span",pt,s(p(ne)(t.size)),1),v.value===t.name?(l(),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:u=>f(t.name)},s(o.$t("settings.models.confirmDeletePrompt")),9,mt)):(l(),r("button",{key:1,class:"shrink-0 rounded p-1 text-text-muted hover:text-error transition-colors",title:o.$t("settings.models.delete"),onClick:u=>f(t.name)},[T(p(re),{class:"h-3.5 w-3.5"})],8,gt))]))),128))]))]),e("div",xt,[e("h3",vt,s(o.$t("settings.models.downloadModels")),1),e("div",bt,[(l(!0),r($,null,z(y.value,t=>(l(),r("button",{key:t.key,class:N(["rounded-lg px-3 py-1.5 text-xs transition-colors",g.value===t.key?"bg-accent/10 text-accent":"bg-surface text-text-secondary hover:bg-surface-overlay hover:text-text-primary"]),onClick:u=>g.value=t.key},s(t.label),11,ft))),128))]),G(e("input",{"onUpdate:modelValue":c[1]||(c[1]=t=>d.value=t),type:"text",placeholder:o.$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,ht),[[L,d.value]]),i.value?(l(),r("p",yt,s(i.value),1)):h("",!0),w.value.length===0?(l(),r("div",_t,s(o.$t("settings.models.noModelsMatch")),1)):(l(),r("div",$t,[(l(!0),r($,null,z(w.value,t=>(l(),r("div",{key:t.name,class:"rounded-lg border border-border-default bg-surface p-3"},[e("div",kt,[e("div",Bt,[e("div",wt,[e("span",Ct,s(t.name),1),D(t.name,_(t).tag)?(l(),r("span",Mt,s(o.$t("settings.models.installed")),1)):h("",!0)]),e("p",zt,s(t.description),1)]),e("div",Gt,[t.variants.length>1?(l(),r("select",{key:0,value:_(t).tag,class:"rounded border border-border-default bg-surface px-2 py-1 text-[10px] text-text-primary outline-none focus:border-accent",onChange:u=>V(t.name,u.target.value)},[(l(!0),r($,null,z(t.variants,u=>(l(),r("option",{key:u.tag,value:u.tag},s(u.params)+" ("+s(u.size)+") ",9,St))),128))],40,Lt)):(l(),r("span",At,s(t.variants[0].params)+" ("+s(t.variants[0].size)+") ",1)),e("button",{disabled:E(`${t.name}:${_(t).tag}`)||E(t.name),class:"rounded-lg bg-accent px-3 py-1 text-[10px] text-white hover:bg-accent-hover disabled:opacity-40 transition-colors",onClick:u=>H(t)},s(o.$t("settings.models.pull")),9,Tt)])]),n.value.has(`${t.name}:${_(t).tag}`)||n.value.has(t.name)?(l(),r("div",It,[e("div",Vt,[e("div",{class:"h-full rounded-full bg-accent transition-all duration-300",style:U({width:`${(n.value.get(`${t.name}:${_(t).tag}`)??n.value.get(t.name))?.percent??0}%`})},null,4)]),e("p",Dt,s((n.value.get(`${t.name}:${_(t).tag}`)??n.value.get(t.name))?.status),1)])):h("",!0)]))),128))])),e("div",Et,[e("p",Ut,s(o.$t("settings.models.pullByName")),1),e("div",qt,[G(e("input",{"onUpdate:modelValue":c[2]||(c[2]=t=>x.value=t),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:se(O,["enter"])},null,544),[[L,x.value]]),e("button",{disabled:!x.value.trim()||E(x.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:O},s(o.$t("settings.models.pull")),9,Nt)]),(l(!0),r($,null,z(n.value,([t,u])=>(l(),r($,{key:t},[w.value.some(M=>`${M.name}:${_(M).tag}`===t||M.name===t)?h("",!0):(l(),r("div",Pt,[e("div",jt,[e("span",Ot,s(t),1),e("span",null,s(u.percent)+"%",1)]),e("div",Rt,[e("div",{class:"h-full rounded-full bg-accent transition-all duration-300",style:U({width:`${u.percent}%`})},null,4)]),e("p",Qt,s(u.status),1)]))],64))),128))])])]))}}),Jt={class:"space-y-6"},Wt={class:"rounded-lg border border-border-default bg-surface-raised p-4 space-y-4"},Ht={class:"text-sm font-medium text-text-primary"},Kt={class:"text-[10px] text-text-muted"},Zt={class:"block text-xs text-text-secondary mb-1"},Xt={class:"flex gap-3"},Yt={class:"flex items-center gap-2 text-sm"},es={class:"text-text-secondary"},ts={class:"text-text-primary font-medium"},ss={key:0,class:"text-xs text-error"},as={class:"flex gap-3"},os=["disabled"],ns={class:"border-t border-border-default pt-3"},ls={key:0,class:"mt-3 space-y-2 text-xs text-text-secondary"},rs=I({__name:"SettingsIntegrationsTab",setup(k){const a=ie(),v=b(a.clientId),m=b(!1);function f(){a.updateClientId(v.value)}return(g,d)=>(l(),r("div",Jt,[e("div",Wt,[e("h3",Ht,s(g.$t("settings.integrations.googleIntegration")),1),e("p",Kt,s(g.$t("settings.integrations.googleIntegrationDesc")),1),e("div",null,[e("label",Zt,s(g.$t("settings.integrations.oauthClientId")),1),e("div",Xt,[G(e("input",{"onUpdate:modelValue":d[0]||(d[0]=y=>v.value=y),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),[[L,v.value]]),e("button",{class:"rounded-lg bg-surface-overlay px-4 py-2 text-sm text-text-primary hover:bg-border-default transition-colors",onClick:f},s(g.$t("common.actions.save")),1)])]),e("div",Yt,[e("span",{class:N(["inline-block h-2 w-2 rounded-full",{"bg-success":p(a).connected,"bg-error":!p(a).connected&&!p(a).isAuthenticating,"bg-warning animate-pulse":p(a).isAuthenticating}])},null,2),e("span",es,[p(a).isAuthenticating?(l(),r($,{key:0},[B(s(g.$t("settings.integrations.authenticating")),1)],64)):p(a).connected?(l(),r($,{key:1},[B(s(g.$t("settings.integrations.connectedAs"))+" ",1),e("span",ts,s(p(a).userEmail??"unknown"),1)],64)):(l(),r($,{key:2},[B(s(g.$t("settings.integrations.notConnected")),1)],64))])]),p(a).error?(l(),r("p",ss,s(p(a).error),1)):h("",!0),e("div",as,[p(a).connected?h("",!0):(l(),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:!p(a).clientId||p(a).isAuthenticating,onClick:d[1]||(d[1]=y=>p(a).connect())},s(g.$t("settings.integrations.connectGoogleAccount")),9,os)),p(a).connected?(l(),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:d[2]||(d[2]=y=>p(a).disconnect())},s(g.$t("settings.integrations.disconnect")),1)):h("",!0)]),e("div",ns,[e("button",{class:"text-xs text-accent hover:text-accent-hover transition-colors",onClick:d[3]||(d[3]=y=>m.value=!m.value)},s(m.value?g.$t("settings.integrations.hideSetup"):g.$t("settings.integrations.showSetup")),1),m.value?(l(),r("div",ls,[...d[4]||(d[4]=[P('<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: "App not verified" 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)])])):h("",!0)])])]))}}),is={},ds={class:"space-y-6"},cs={class:"rounded-lg border border-border-default bg-surface-raised p-5 space-y-4"},us={class:"flex items-center gap-3"},ps={class:"text-xs text-text-muted"},ms={class:"grid grid-cols-[auto_1fr] gap-y-2 gap-x-4 text-xs"},gs={class:"text-text-muted"},xs={class:"text-text-muted"},vs={class:"text-text-muted"},bs={class:"rounded-lg border border-border-default bg-surface-raised p-5 space-y-3"},fs={class:"text-sm font-medium text-text-primary"};function hs(k,a){return l(),r("div",ds,[e("div",cs,[e("div",us,[a[1]||(a[1]=e("span",{class:"text-2xl font-bold text-accent"},"xR",-1)),e("div",null,[a[0]||(a[0]=e("h3",{class:"text-sm font-semibold text-text-primary"},"LLMxRay",-1)),e("p",ps,s(k.$t("settings.about.localLlmObservatory")),1)])]),e("div",ms,[e("span",gs,s(k.$t("settings.about.version")),1),a[2]||(a[2]=e("span",{class:"text-text-primary"},"1.0.0",-1)),e("span",xs,s(k.$t("settings.about.license")),1),a[3]||(a[3]=e("span",{class:"text-text-primary"},"Apache 2.0",-1)),e("span",vs,s(k.$t("settings.about.repository")),1),a[4]||(a[4]=e("a",{href:"https://github.com/LogneBudo/llmxray",target:"_blank",rel:"noopener",class:"text-accent hover:underline"}," github.com/LogneBudo/llmxray ",-1))])]),e("div",bs,[e("h3",fs,s(k.$t("settings.about.techStack")),1),a[5]||(a[5]=P('<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 ys=de(is,[["render",hs]]),_s={class:"max-w-4xl space-y-6"},Ls=I({__name:"SettingsPage",setup(k){const{t:a}=J(),v=ae(),m=b(v.query.tab??"general"),f=S(()=>[{key:"general",label:a("settings.tabs.general")},{key:"models",label:a("settings.tabs.models")},{key:"integrations",label:a("settings.tabs.integrations")},{key:"about",label:a("settings.tabs.about")}]);return(g,d)=>(l(),r("div",_s,[T(oe,{tabs:f.value,"active-tab":m.value,"onUpdate:activeTab":d[0]||(d[0]=y=>m.value=y)},null,8,["tabs","active-tab"]),m.value==="general"?(l(),A(Ke,{key:0})):m.value==="models"?(l(),A(Ft,{key:1})):m.value==="integrations"?(l(),A(rs,{key:2})):m.value==="about"?(l(),A(ys,{key:3})):h("",!0)]))}});export{Ls as default};
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
import{u as p}from"./toolcall-store-BFoy2Mdx.js";import{u as m}from"./StatusBadge.vue_vue_type_script_setup_true_lang-D24kGmB6.js";import{n as a,o as d}from"./index-DVvWJgFn.js";import{a as y}from"./stream-handler-_fccIkW6.js";function u(t,o="en"){if(!t)return 0;if(["zh","ja","ko"].includes(o))return t.replace(/\s/g,"").length||1;const i=t.split(/\s+/).filter(Boolean).length;return Math.ceil(i*1.3)}function g(t,o){const i=b(o),n=u(o);for(const r of i)r.tokenCount=u(r.content),r.percentage=n>0?r.tokenCount/n*100:0;return{sessionId:t,rawPrompt:o,totalTokenCount:n,sections:i}}function S(t,o){const i=[];let n=0;for(const e of o){const c={system:"system",user:"user",assistant:"context",tool:"tools"},l={id:a(),type:c[e.role]??"unknown",label:`${e.role} message`,content:e.content,startOffset:n,endOffset:n+e.content.length,tokenCount:u(e.content),percentage:0};i.push(l),n+=e.content.length+1}const r=i.reduce((e,c)=>e+c.tokenCount,0);for(const e of i)e.percentage=r>0?e.tokenCount/r*100:0;const s=o.map(e=>`[${e.role}] ${e.content}`).join(`
|
|
2
|
-
|
|
3
|
-
`);return{sessionId:t,rawPrompt:s,totalTokenCount:r,sections:i,messages:o.map(e=>({role:e.role,content:e.content,tokenCount:u(e.content)}))}}function b(t){const o=[],i=[{regex:/^#{1,3}\s*system\b/im,type:"system",label:"System Instructions"},{regex:/^#{1,3}\s*(?:user|query|question)\b/im,type:"user",label:"User Query"},{regex:/^#{1,3}\s*(?:context|background)\b/im,type:"context",label:"Context"},{regex:/^#{1,3}\s*(?:tools?|functions?)\b/im,type:"tools",label:"Tool Definitions"},{regex:/^#{1,3}\s*(?:memory|history|conversation)\b/im,type:"memory",label:"Memory / History"},{regex:/^#{1,3}\s*(?:examples?|few[- ]shot)\b/im,type:"examples",label:"Examples"},{regex:/^#{1,3}\s*(?:instructions?|rules?|guidelines?)\b/im,type:"instructions",label:"Instructions"}],n=[];for(const{regex:s,type:e,label:c}of i){const l=t.match(s);l?.index!==void 0&&n.push({index:l.index,type:e,label:c})}if(n.length===0)return o.push({id:a(),type:"user",label:"Prompt",content:t,startOffset:0,endOffset:t.length,tokenCount:0,percentage:100}),o;n.sort((s,e)=>s.index-e.index);for(let s=0;s<n.length;s++){const e=n[s],c=n[s+1],l=c?c.index:t.length,f=t.slice(e.index,l).trim();o.push({id:a(),type:e.type,label:e.label,content:f,startOffset:e.index,endOffset:l,tokenCount:0,percentage:0})}const r=n[0];if(r&&r.index>0){const s=t.slice(0,r.index).trim();s&&o.unshift({id:a(),type:"unknown",label:"Preamble",content:s,startOffset:0,endOffset:r.index,tokenCount:0,percentage:0})}return o}async function O(t){const o=p(),i=m(),n=o.createSession({mode:"generate",model:t.model,prompt:t.prompt,options:t.options});o.setActiveSession(n);const r=g(n,t.prompt);i.setAnatomy(n,r);const s=new AbortController;return d.streamGenerate({model:t.model,prompt:t.prompt,system:t.system,options:t.options},s.signal).then(e=>y(n,e,s.signal)).catch(e=>{s.signal.aborted||o.setSessionError(n,e instanceof Error?e.message:"Generation failed")}),{sessionId:n,abort:()=>{s.abort(),o.cancelSession(n)}}}export{S as a,O as s};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:400;src:url(/assets/inter-cyrillic-ext-400-normal-BQZuk6qB.woff2) format("woff2"),url(/assets/inter-cyrillic-ext-400-normal-DQukG94-.woff) format("woff");unicode-range:U+0460-052F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:400;src:url(/assets/inter-cyrillic-400-normal-obahsSVq.woff2) format("woff2"),url(/assets/inter-cyrillic-400-normal-HOLc17fK.woff) format("woff");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:400;src:url(/assets/inter-greek-ext-400-normal-DGGRlc-M.woff2) format("woff2"),url(/assets/inter-greek-ext-400-normal-KugGGMne.woff) format("woff");unicode-range:U+1F00-1FFF}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:400;src:url(/assets/inter-greek-400-normal-B4URO6DV.woff2) format("woff2"),url(/assets/inter-greek-400-normal-q2sYcFCs.woff) format("woff");unicode-range:U+0370-0377,U+037A-037F,U+0384-038A,U+038C,U+038E-03A1,U+03A3-03FF}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:400;src:url(/assets/inter-vietnamese-400-normal-DMkecbls.woff2) format("woff2"),url(/assets/inter-vietnamese-400-normal-Bbgyi5SW.woff) format("woff");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:400;src:url(/assets/inter-latin-ext-400-normal-C1nco2VV.woff2) format("woff2"),url(/assets/inter-latin-ext-400-normal-77YHD8bZ.woff) format("woff");unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:400;src:url(/assets/inter-latin-400-normal-C38fXH4l.woff2) format("woff2"),url(/assets/inter-latin-400-normal-CyCys3Eg.woff) format("woff");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:500;src:url(/assets/inter-cyrillic-ext-500-normal-B0yAr1jD.woff2) format("woff2"),url(/assets/inter-cyrillic-ext-500-normal-BmqWE9Dz.woff) format("woff");unicode-range:U+0460-052F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:500;src:url(/assets/inter-cyrillic-500-normal-BasfLYem.woff2) format("woff2"),url(/assets/inter-cyrillic-500-normal-CxZf_p3X.woff) format("woff");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:500;src:url(/assets/inter-greek-ext-500-normal-C4iEst2y.woff2) format("woff2"),url(/assets/inter-greek-ext-500-normal-2j5mBUwD.woff) format("woff");unicode-range:U+1F00-1FFF}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:500;src:url(/assets/inter-greek-500-normal-BIZE56-Y.woff2) format("woff2"),url(/assets/inter-greek-500-normal-Xzm54t5V.woff) format("woff");unicode-range:U+0370-0377,U+037A-037F,U+0384-038A,U+038C,U+038E-03A1,U+03A3-03FF}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:500;src:url(/assets/inter-vietnamese-500-normal-DOriooB6.woff2) format("woff2"),url(/assets/inter-vietnamese-500-normal-mJboJaSs.woff) format("woff");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:500;src:url(/assets/inter-latin-ext-500-normal-CV4jyFjo.woff2) format("woff2"),url(/assets/inter-latin-ext-500-normal-BxGbmqWO.woff) format("woff");unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:500;src:url(/assets/inter-latin-500-normal-Cerq10X2.woff2) format("woff2"),url(/assets/inter-latin-500-normal-BL9OpVg8.woff) format("woff");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:600;src:url(/assets/inter-cyrillic-ext-600-normal-Dfes3d0z.woff2) format("woff2"),url(/assets/inter-cyrillic-ext-600-normal-Bcila6Z-.woff) format("woff");unicode-range:U+0460-052F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:600;src:url(/assets/inter-cyrillic-600-normal-CWCymEST.woff2) format("woff2"),url(/assets/inter-cyrillic-600-normal-4D_pXhcN.woff) format("woff");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:600;src:url(/assets/inter-greek-ext-600-normal-DRtmH8MT.woff2) format("woff2"),url(/assets/inter-greek-ext-600-normal-B8X0CLgF.woff) format("woff");unicode-range:U+1F00-1FFF}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:600;src:url(/assets/inter-greek-600-normal-plRanbMR.woff2) format("woff2"),url(/assets/inter-greek-600-normal-BZpKdvQh.woff) format("woff");unicode-range:U+0370-0377,U+037A-037F,U+0384-038A,U+038C,U+038E-03A1,U+03A3-03FF}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:600;src:url(/assets/inter-vietnamese-600-normal-Cc8MFFhd.woff2) format("woff2"),url(/assets/inter-vietnamese-600-normal-BuLX-rYi.woff) format("woff");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:600;src:url(/assets/inter-latin-ext-600-normal-D2bJ5OIk.woff2) format("woff2"),url(/assets/inter-latin-ext-600-normal-CIVaiw4L.woff) format("woff");unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:600;src:url(/assets/inter-latin-600-normal-LgqL8muc.woff2) format("woff2"),url(/assets/inter-latin-600-normal-CiBQ2DWP.woff) format("woff");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:700;src:url(/assets/inter-cyrillic-ext-700-normal-BjwYoWNd.woff2) format("woff2"),url(/assets/inter-cyrillic-ext-700-normal-LO58E6JB.woff) format("woff");unicode-range:U+0460-052F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:700;src:url(/assets/inter-cyrillic-700-normal-CjBOestx.woff2) format("woff2"),url(/assets/inter-cyrillic-700-normal-DrXBdSj3.woff) format("woff");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:700;src:url(/assets/inter-greek-ext-700-normal-qfdV9bQt.woff2) format("woff2"),url(/assets/inter-greek-ext-700-normal-BoQ6DsYi.woff) format("woff");unicode-range:U+1F00-1FFF}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:700;src:url(/assets/inter-greek-700-normal-C3JjAnD8.woff2) format("woff2"),url(/assets/inter-greek-700-normal-BUv2fZ6O.woff) format("woff");unicode-range:U+0370-0377,U+037A-037F,U+0384-038A,U+038C,U+038E-03A1,U+03A3-03FF}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:700;src:url(/assets/inter-vietnamese-700-normal-DlLaEgI2.woff2) format("woff2"),url(/assets/inter-vietnamese-700-normal-BZaoP0fm.woff) format("woff");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:700;src:url(/assets/inter-latin-ext-700-normal-Ca8adRJv.woff2) format("woff2"),url(/assets/inter-latin-ext-700-normal-TidjK2hL.woff) format("woff");unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:700;src:url(/assets/inter-latin-700-normal-Yt3aPRUw.woff2) format("woff2"),url(/assets/inter-latin-700-normal-BLAVimhd.woff) format("woff");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Fira Code;font-style:normal;font-display:swap;font-weight:400;src:url(/assets/fira-code-cyrillic-ext-400-normal-txZ9Fk_1.woff2) format("woff2"),url(/assets/fira-code-cyrillic-ext-400-normal-Buh61xzB.woff) format("woff");unicode-range:U+0460-052F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Fira Code;font-style:normal;font-display:swap;font-weight:400;src:url(/assets/fira-code-cyrillic-400-normal-UC0NFL4U.woff2) format("woff2"),url(/assets/fira-code-cyrillic-400-normal-dc1q3VD7.woff) format("woff");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:Fira Code;font-style:normal;font-display:swap;font-weight:400;src:url(/assets/fira-code-greek-ext-400-normal-DR7mBgIM.woff2) format("woff2"),url(/assets/fira-code-greek-ext-400-normal-DSPUheWg.woff) format("woff");unicode-range:U+1F00-1FFF}@font-face{font-family:Fira Code;font-style:normal;font-display:swap;font-weight:400;src:url(/assets/fira-code-greek-400-normal-B2Gh_Y8s.woff2) format("woff2"),url(/assets/fira-code-greek-400-normal-DobhaxvF.woff) format("woff");unicode-range:U+0370-0377,U+037A-037F,U+0384-038A,U+038C,U+038E-03A1,U+03A3-03FF}@font-face{font-family:Fira Code;font-style:normal;font-display:swap;font-weight:400;src:url(data:font/woff2;base64,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) format("woff2"),url(/assets/fira-code-symbols2-400-normal-_QEZCEwe.woff) format("woff");unicode-range:U+2000-2001,U+2004-2008,U+200A,U+23B8-23BD,U+2500-259F}@font-face{font-family:Fira Code;font-style:normal;font-display:swap;font-weight:400;src:url(/assets/fira-code-latin-ext-400-normal-KSMg0QLl.woff2) format("woff2"),url(/assets/fira-code-latin-ext-400-normal-DG73JjOf.woff) format("woff");unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Fira Code;font-style:normal;font-display:swap;font-weight:400;src:url(/assets/fira-code-latin-400-normal-DGosTW8U.woff2) format("woff2"),url(/assets/fira-code-latin-400-normal-C-QZfXAs.woff) format("woff");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Fira Code;font-style:normal;font-display:swap;font-weight:500;src:url(/assets/fira-code-cyrillic-ext-500-normal-CYRspHgm.woff2) format("woff2"),url(/assets/fira-code-cyrillic-ext-500-normal-CwtLmSFD.woff) format("woff");unicode-range:U+0460-052F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Fira Code;font-style:normal;font-display:swap;font-weight:500;src:url(/assets/fira-code-cyrillic-500-normal-CX35h3Mg.woff2) format("woff2"),url(/assets/fira-code-cyrillic-500-normal-Bu7VCL72.woff) format("woff");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:Fira Code;font-style:normal;font-display:swap;font-weight:500;src:url(/assets/fira-code-greek-ext-500-normal-BO3iq16n.woff2) format("woff2"),url(/assets/fira-code-greek-ext-500-normal-CMiNLXER.woff) format("woff");unicode-range:U+1F00-1FFF}@font-face{font-family:Fira Code;font-style:normal;font-display:swap;font-weight:500;src:url(/assets/fira-code-greek-500-normal-CVO0IRNt.woff2) format("woff2"),url(/assets/fira-code-greek-500-normal-DEXIWiey.woff) format("woff");unicode-range:U+0370-0377,U+037A-037F,U+0384-038A,U+038C,U+038E-03A1,U+03A3-03FF}@font-face{font-family:Fira Code;font-style:normal;font-display:swap;font-weight:500;src:url(data:font/woff2;base64,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) format("woff2"),url(/assets/fira-code-symbols2-500-normal-DwsgbIjQ.woff) format("woff");unicode-range:U+2000-2001,U+2004-2008,U+200A,U+23B8-23BD,U+2500-259F}@font-face{font-family:Fira Code;font-style:normal;font-display:swap;font-weight:500;src:url(/assets/fira-code-latin-ext-500-normal-Crd9e_oI.woff2) format("woff2"),url(/assets/fira-code-latin-ext-500-normal-CaANqXjI.woff) format("woff");unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Fira Code;font-style:normal;font-display:swap;font-weight:500;src:url(/assets/fira-code-latin-500-normal-B6gioGu8.woff2) format("woff2"),url(/assets/fira-code-latin-500-normal-aMLC2AMm.woff) format("woff");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-ease:initial;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1}}}@layer theme{:root,:host{--font-sans:ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-amber-400:oklch(82.8% .189 84.429);--color-amber-500:oklch(76.9% .188 70.08);--color-emerald-400:oklch(76.5% .177 163.223);--color-emerald-500:oklch(69.6% .17 162.48);--color-blue-400:oklch(70.7% .165 254.624);--color-blue-500:oklch(62.3% .214 259.815);--color-purple-400:oklch(71.4% .203 305.504);--color-purple-500:oklch(62.7% .265 303.9);--color-rose-400:oklch(71.2% .194 13.428);--color-rose-500:oklch(64.5% .246 16.439);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-xs:20rem;--container-sm:24rem;--container-md:28rem;--container-lg:32rem;--container-2xl:42rem;--container-3xl:48rem;--container-4xl:56rem;--container-6xl:72rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height: 1.5 ;--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--text-3xl:1.875rem;--text-3xl--line-height: 1.2 ;--text-4xl:2.25rem;--text-4xl--line-height:calc(2.5 / 2.25);--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-wide:.025em;--tracking-wider:.05em;--leading-tight:1.25;--leading-relaxed:1.625;--radius-sm:.25rem;--radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--radius-2xl:1rem;--ease-in:cubic-bezier(.4, 0, 1, 1);--ease-out:cubic-bezier(0, 0, .2, 1);--ease-in-out:cubic-bezier(.4, 0, .2, 1);--animate-spin:spin 1s linear infinite;--animate-pulse:pulse 2s cubic-bezier(.4, 0, .6, 1) infinite;--blur-sm:8px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono);--color-surface:#0f172a;--color-surface-raised:#1e293b;--color-surface-overlay:#334155;--color-border-default:#475569;--color-text-primary:#f1f5f9;--color-text-secondary:#94a3b8;--color-text-muted:#64748b;--color-accent:#a855f7;--color-accent-hover:#c084fc;--color-success:#4ade80;--color-warning:#fbbf24;--color-error:#f87171}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.pointer-events-auto{pointer-events:auto}.pointer-events-none{pointer-events:none}.collapse{visibility:collapse}.invisible{visibility:hidden}.visible{visibility:visible}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.inset-0{inset:calc(var(--spacing) * 0)}.start{inset-inline-start:var(--spacing)}.start-0{inset-inline-start:calc(var(--spacing) * 0)}.end{inset-inline-end:var(--spacing)}.end-0{inset-inline-end:calc(var(--spacing) * 0)}.-top-0\.5{top:calc(var(--spacing) * -.5)}.top-1\/2{top:50%}.top-3{top:calc(var(--spacing) * 3)}.top-4{top:calc(var(--spacing) * 4)}.top-16{top:calc(var(--spacing) * 16)}.top-full{top:100%}.-right-0\.5{right:calc(var(--spacing) * -.5)}.right-0{right:calc(var(--spacing) * 0)}.right-3{right:calc(var(--spacing) * 3)}.right-4{right:calc(var(--spacing) * 4)}.bottom-full{bottom:100%}.left-0{left:calc(var(--spacing) * 0)}.left-1\/2{left:50%}.left-full{left:100%}.isolate{isolation:isolate}.z-10{z-index:10}.z-50{z-index:50}.z-\[9999\]{z-index:9999}.col-span-2{grid-column:span 2/span 2}.\!container{width:100%!important}@media(min-width:40rem){.\!container{max-width:40rem!important}}@media(min-width:48rem){.\!container{max-width:48rem!important}}@media(min-width:64rem){.\!container{max-width:64rem!important}}@media(min-width:80rem){.\!container{max-width:80rem!important}}@media(min-width:96rem){.\!container{max-width:96rem!important}}.container{width:100%}@media(min-width:40rem){.container{max-width:40rem}}@media(min-width:48rem){.container{max-width:48rem}}@media(min-width:64rem){.container{max-width:64rem}}@media(min-width:80rem){.container{max-width:80rem}}@media(min-width:96rem){.container{max-width:96rem}}.mx-1{margin-inline:calc(var(--spacing) * 1)}.mx-2{margin-inline:calc(var(--spacing) * 2)}.mx-4{margin-inline:calc(var(--spacing) * 4)}.mx-auto{margin-inline:auto}.my-1{margin-block:calc(var(--spacing) * 1)}.my-2{margin-block:calc(var(--spacing) * 2)}.ms-1{margin-inline-start:calc(var(--spacing) * 1)}.ms-1\.5{margin-inline-start:calc(var(--spacing) * 1.5)}.ms-2{margin-inline-start:calc(var(--spacing) * 2)}.ms-3{margin-inline-start:calc(var(--spacing) * 3)}.ms-7{margin-inline-start:calc(var(--spacing) * 7)}.ms-auto{margin-inline-start:auto}.me-1{margin-inline-end:calc(var(--spacing) * 1)}.me-1\.5{margin-inline-end:calc(var(--spacing) * 1.5)}.-mt-3{margin-top:calc(var(--spacing) * -3)}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:calc(var(--spacing) * 1)}.mt-1\.5{margin-top:calc(var(--spacing) * 1.5)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mt-auto{margin-top:auto}.-mb-px{margin-bottom:-1px}.mb-1{margin-bottom:calc(var(--spacing) * 1)}.mb-1\.5{margin-bottom:calc(var(--spacing) * 1.5)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.line-clamp-2{-webkit-line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.line-clamp-4{-webkit-line-clamp:4;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.table{display:table}.h-1{height:calc(var(--spacing) * 1)}.h-1\.5{height:calc(var(--spacing) * 1.5)}.h-2{height:calc(var(--spacing) * 2)}.h-2\.5{height:calc(var(--spacing) * 2.5)}.h-3{height:calc(var(--spacing) * 3)}.h-3\.5{height:calc(var(--spacing) * 3.5)}.h-4{height:calc(var(--spacing) * 4)}.h-5{height:calc(var(--spacing) * 5)}.h-6{height:calc(var(--spacing) * 6)}.h-8{height:calc(var(--spacing) * 8)}.h-10{height:calc(var(--spacing) * 10)}.h-12{height:calc(var(--spacing) * 12)}.h-14{height:calc(var(--spacing) * 14)}.h-16{height:calc(var(--spacing) * 16)}.h-20{height:calc(var(--spacing) * 20)}.h-24{height:calc(var(--spacing) * 24)}.h-32{height:calc(var(--spacing) * 32)}.h-40{height:calc(var(--spacing) * 40)}.h-48{height:calc(var(--spacing) * 48)}.h-full{height:100%}.h-screen{height:100vh}.max-h-32{max-height:calc(var(--spacing) * 32)}.max-h-40{max-height:calc(var(--spacing) * 40)}.max-h-48{max-height:calc(var(--spacing) * 48)}.max-h-64{max-height:calc(var(--spacing) * 64)}.max-h-80{max-height:calc(var(--spacing) * 80)}.max-h-96{max-height:calc(var(--spacing) * 96)}.max-h-\[50vh\]{max-height:50vh}.max-h-\[70vh\]{max-height:70vh}.max-h-\[90vh\]{max-height:90vh}.max-h-\[150px\]{max-height:150px}.max-h-\[200px\]{max-height:200px}.max-h-\[400px\]{max-height:400px}.max-h-\[500px\]{max-height:500px}.min-h-0{min-height:calc(var(--spacing) * 0)}.min-h-\[200px\]{min-height:200px}.min-h-full{min-height:100%}.w-1{width:calc(var(--spacing) * 1)}.w-1\.5{width:calc(var(--spacing) * 1.5)}.w-2{width:calc(var(--spacing) * 2)}.w-2\.5{width:calc(var(--spacing) * 2.5)}.w-3{width:calc(var(--spacing) * 3)}.w-3\.5{width:calc(var(--spacing) * 3.5)}.w-4{width:calc(var(--spacing) * 4)}.w-5{width:calc(var(--spacing) * 5)}.w-6{width:calc(var(--spacing) * 6)}.w-7{width:calc(var(--spacing) * 7)}.w-8{width:calc(var(--spacing) * 8)}.w-10{width:calc(var(--spacing) * 10)}.w-12{width:calc(var(--spacing) * 12)}.w-14{width:calc(var(--spacing) * 14)}.w-16{width:calc(var(--spacing) * 16)}.w-20{width:calc(var(--spacing) * 20)}.w-24{width:calc(var(--spacing) * 24)}.w-28{width:calc(var(--spacing) * 28)}.w-32{width:calc(var(--spacing) * 32)}.w-48{width:calc(var(--spacing) * 48)}.w-52{width:calc(var(--spacing) * 52)}.w-56{width:calc(var(--spacing) * 56)}.w-60{width:calc(var(--spacing) * 60)}.w-64{width:calc(var(--spacing) * 64)}.w-72{width:calc(var(--spacing) * 72)}.w-\[280px\]{width:280px}.w-\[400px\]{width:400px}.w-\[440px\]{width:440px}.w-\[480px\]{width:480px}.w-full{width:100%}.w-max{width:max-content}.w-px{width:1px}.max-w-2xl{max-width:var(--container-2xl)}.max-w-3xl{max-width:var(--container-3xl)}.max-w-4xl{max-width:var(--container-4xl)}.max-w-6xl{max-width:var(--container-6xl)}.max-w-\[80\%\]{max-width:80%}.max-w-\[90vw\]{max-width:90vw}.max-w-\[100px\]{max-width:100px}.max-w-\[120px\]{max-width:120px}.max-w-\[200px\]{max-width:200px}.max-w-full{max-width:100%}.max-w-lg{max-width:var(--container-lg)}.max-w-md{max-width:var(--container-md)}.max-w-sm{max-width:var(--container-sm)}.max-w-xs{max-width:var(--container-xs)}.min-w-0{min-width:calc(var(--spacing) * 0)}.min-w-\[150px\]{min-width:150px}.min-w-full{min-width:100%}.flex-1{flex:1}.flex-\[15\]{flex:15}.flex-\[20\]{flex:20}.flex-\[25\]{flex:25}.flex-\[40\]{flex:40}.flex-shrink{flex-shrink:1}.flex-shrink-0,.shrink-0{flex-shrink:0}.grow{flex-grow:1}.-translate-x-1\/2{--tw-translate-x: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-0\.5{--tw-translate-x:calc(var(--spacing) * .5);translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-3\.5{--tw-translate-x:calc(var(--spacing) * 3.5);translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-y-1{--tw-translate-y:calc(var(--spacing) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-y-1\/2{--tw-translate-y: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-y-2{--tw-translate-y:calc(var(--spacing) * -2);translate:var(--tw-translate-x) var(--tw-translate-y)}.-rotate-90{rotate:-90deg}.rotate-45{rotate:45deg}.rotate-90{rotate:90deg}.rotate-180{rotate:180deg}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.animate-pulse{animation:var(--animate-pulse)}.animate-spin{animation:var(--animate-spin)}.cursor-crosshair{cursor:crosshair}.cursor-help{cursor:help}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.resize{resize:both}.resize-none{resize:none}.resize-y{resize:vertical}.list-inside{list-style-position:inside}.list-decimal{list-style-type:decimal}.list-disc{list-style-type:disc}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.grid-cols-\[auto_1fr\]{grid-template-columns:auto 1fr}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-baseline{align-items:baseline}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.justify-start{justify-content:flex-start}.gap-0{gap:calc(var(--spacing) * 0)}.gap-0\.5{gap:calc(var(--spacing) * .5)}.gap-1{gap:calc(var(--spacing) * 1)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-6{gap:calc(var(--spacing) * 6)}.gap-px{gap:1px}:where(.space-y-0>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 0) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 0) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-0\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * .5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * .5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1.5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2.5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 6) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 6) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-8>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 8) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 8) * calc(1 - var(--tw-space-y-reverse)))}.gap-x-4{column-gap:calc(var(--spacing) * 4)}.gap-y-2{row-gap:calc(var(--spacing) * 2)}.self-start{align-self:flex-start}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:var(--radius-2xl)}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-sm{border-radius:var(--radius-sm)}.rounded-xl{border-radius:var(--radius-xl)}.rounded-t-lg{border-top-left-radius:var(--radius-lg);border-top-right-radius:var(--radius-lg)}.rounded-br-md{border-bottom-right-radius:var(--radius-md)}.rounded-bl-md{border-bottom-left-radius:var(--radius-md)}.border{border-style:var(--tw-border-style);border-width:1px}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-4{border-style:var(--tw-border-style);border-width:4px}.border-s{border-inline-start-style:var(--tw-border-style);border-inline-start-width:1px}.border-s-2{border-inline-start-style:var(--tw-border-style);border-inline-start-width:2px}.border-e{border-inline-end-style:var(--tw-border-style);border-inline-end-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-b-2{border-bottom-style:var(--tw-border-style);border-bottom-width:2px}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-none{--tw-border-style:none;border-style:none}.border-\[\#a78bfa\]\/30{border-color:#a78bfa4d}.border-accent{border-color:var(--color-accent)}.border-accent\/20{border-color:#a855f733}@supports (color:color-mix(in lab,red,red)){.border-accent\/20{border-color:color-mix(in oklab,var(--color-accent) 20%,transparent)}}.border-accent\/30{border-color:#a855f74d}@supports (color:color-mix(in lab,red,red)){.border-accent\/30{border-color:color-mix(in oklab,var(--color-accent) 30%,transparent)}}.border-accent\/50{border-color:#a855f780}@supports (color:color-mix(in lab,red,red)){.border-accent\/50{border-color:color-mix(in oklab,var(--color-accent) 50%,transparent)}}.border-amber-500\/30{border-color:#f99c004d}@supports (color:color-mix(in lab,red,red)){.border-amber-500\/30{border-color:color-mix(in oklab,var(--color-amber-500) 30%,transparent)}}.border-blue-500\/30{border-color:#3080ff4d}@supports (color:color-mix(in lab,red,red)){.border-blue-500\/30{border-color:color-mix(in oklab,var(--color-blue-500) 30%,transparent)}}.border-border-default{border-color:var(--color-border-default)}.border-border-default\/30{border-color:#4755694d}@supports (color:color-mix(in lab,red,red)){.border-border-default\/30{border-color:color-mix(in oklab,var(--color-border-default) 30%,transparent)}}.border-border-default\/50{border-color:#47556980}@supports (color:color-mix(in lab,red,red)){.border-border-default\/50{border-color:color-mix(in oklab,var(--color-border-default) 50%,transparent)}}.border-current{border-color:currentColor}.border-emerald-500\/30{border-color:#00bb7f4d}@supports (color:color-mix(in lab,red,red)){.border-emerald-500\/30{border-color:color-mix(in oklab,var(--color-emerald-500) 30%,transparent)}}.border-error{border-color:var(--color-error)}.border-error\/30{border-color:#f871714d}@supports (color:color-mix(in lab,red,red)){.border-error\/30{border-color:color-mix(in oklab,var(--color-error) 30%,transparent)}}.border-error\/50{border-color:#f8717180}@supports (color:color-mix(in lab,red,red)){.border-error\/50{border-color:color-mix(in oklab,var(--color-error) 50%,transparent)}}.border-purple-500\/30{border-color:#ac4bff4d}@supports (color:color-mix(in lab,red,red)){.border-purple-500\/30{border-color:color-mix(in oklab,var(--color-purple-500) 30%,transparent)}}.border-rose-500\/30{border-color:#ff23574d}@supports (color:color-mix(in lab,red,red)){.border-rose-500\/30{border-color:color-mix(in oklab,var(--color-rose-500) 30%,transparent)}}.border-success{border-color:var(--color-success)}.border-success\/30{border-color:#4ade804d}@supports (color:color-mix(in lab,red,red)){.border-success\/30{border-color:color-mix(in oklab,var(--color-success) 30%,transparent)}}.border-transparent{border-color:#0000}.border-warning\/20{border-color:#fbbf2433}@supports (color:color-mix(in lab,red,red)){.border-warning\/20{border-color:color-mix(in oklab,var(--color-warning) 20%,transparent)}}.border-warning\/30{border-color:#fbbf244d}@supports (color:color-mix(in lab,red,red)){.border-warning\/30{border-color:color-mix(in oklab,var(--color-warning) 30%,transparent)}}.border-t-\[\#a78bfa\]{border-top-color:#a78bfa}.border-t-transparent{border-top-color:#0000}.border-t-warning{border-top-color:var(--color-warning)}.border-b-surface-overlay{border-bottom-color:var(--color-surface-overlay)}.bg-\[\#a78bfa\]{background-color:#a78bfa}.bg-\[\#a78bfa\]\/10{background-color:#a78bfa1a}.bg-\[rgb\(139\,92\,246\)\]{background-color:#8b5cf6}.bg-\[rgb\(251\,146\,60\)\]{background-color:#fb923c}.bg-accent{background-color:var(--color-accent)}.bg-accent\/5{background-color:#a855f70d}@supports (color:color-mix(in lab,red,red)){.bg-accent\/5{background-color:color-mix(in oklab,var(--color-accent) 5%,transparent)}}.bg-accent\/10{background-color:#a855f71a}@supports (color:color-mix(in lab,red,red)){.bg-accent\/10{background-color:color-mix(in oklab,var(--color-accent) 10%,transparent)}}.bg-accent\/15{background-color:#a855f726}@supports (color:color-mix(in lab,red,red)){.bg-accent\/15{background-color:color-mix(in oklab,var(--color-accent) 15%,transparent)}}.bg-accent\/20{background-color:#a855f733}@supports (color:color-mix(in lab,red,red)){.bg-accent\/20{background-color:color-mix(in oklab,var(--color-accent) 20%,transparent)}}.bg-accent\/60{background-color:#a855f799}@supports (color:color-mix(in lab,red,red)){.bg-accent\/60{background-color:color-mix(in oklab,var(--color-accent) 60%,transparent)}}.bg-accent\/90{background-color:#a855f7e6}@supports (color:color-mix(in lab,red,red)){.bg-accent\/90{background-color:color-mix(in oklab,var(--color-accent) 90%,transparent)}}.bg-amber-500\/15{background-color:#f99c0026}@supports (color:color-mix(in lab,red,red)){.bg-amber-500\/15{background-color:color-mix(in oklab,var(--color-amber-500) 15%,transparent)}}.bg-amber-500\/20{background-color:#f99c0033}@supports (color:color-mix(in lab,red,red)){.bg-amber-500\/20{background-color:color-mix(in oklab,var(--color-amber-500) 20%,transparent)}}.bg-black\/40{background-color:#0006}@supports (color:color-mix(in lab,red,red)){.bg-black\/40{background-color:color-mix(in oklab,var(--color-black) 40%,transparent)}}.bg-black\/50{background-color:#00000080}@supports (color:color-mix(in lab,red,red)){.bg-black\/50{background-color:color-mix(in oklab,var(--color-black) 50%,transparent)}}.bg-black\/80{background-color:#000c}@supports (color:color-mix(in lab,red,red)){.bg-black\/80{background-color:color-mix(in oklab,var(--color-black) 80%,transparent)}}.bg-blue-500\/15{background-color:#3080ff26}@supports (color:color-mix(in lab,red,red)){.bg-blue-500\/15{background-color:color-mix(in oklab,var(--color-blue-500) 15%,transparent)}}.bg-blue-500\/20{background-color:#3080ff33}@supports (color:color-mix(in lab,red,red)){.bg-blue-500\/20{background-color:color-mix(in oklab,var(--color-blue-500) 20%,transparent)}}.bg-border-default{background-color:var(--color-border-default)}.bg-border-default\/30{background-color:#4755694d}@supports (color:color-mix(in lab,red,red)){.bg-border-default\/30{background-color:color-mix(in oklab,var(--color-border-default) 30%,transparent)}}.bg-current{background-color:currentColor}.bg-emerald-500\/15{background-color:#00bb7f26}@supports (color:color-mix(in lab,red,red)){.bg-emerald-500\/15{background-color:color-mix(in oklab,var(--color-emerald-500) 15%,transparent)}}.bg-emerald-500\/20{background-color:#00bb7f33}@supports (color:color-mix(in lab,red,red)){.bg-emerald-500\/20{background-color:color-mix(in oklab,var(--color-emerald-500) 20%,transparent)}}.bg-error{background-color:var(--color-error)}.bg-error\/5{background-color:#f871710d}@supports (color:color-mix(in lab,red,red)){.bg-error\/5{background-color:color-mix(in oklab,var(--color-error) 5%,transparent)}}.bg-error\/10{background-color:#f871711a}@supports (color:color-mix(in lab,red,red)){.bg-error\/10{background-color:color-mix(in oklab,var(--color-error) 10%,transparent)}}.bg-error\/20{background-color:#f8717133}@supports (color:color-mix(in lab,red,red)){.bg-error\/20{background-color:color-mix(in oklab,var(--color-error) 20%,transparent)}}.bg-error\/30{background-color:#f871714d}@supports (color:color-mix(in lab,red,red)){.bg-error\/30{background-color:color-mix(in oklab,var(--color-error) 30%,transparent)}}.bg-purple-500\/15{background-color:#ac4bff26}@supports (color:color-mix(in lab,red,red)){.bg-purple-500\/15{background-color:color-mix(in oklab,var(--color-purple-500) 15%,transparent)}}.bg-rose-500\/15{background-color:#ff235726}@supports (color:color-mix(in lab,red,red)){.bg-rose-500\/15{background-color:color-mix(in oklab,var(--color-rose-500) 15%,transparent)}}.bg-rose-500\/20{background-color:#ff235733}@supports (color:color-mix(in lab,red,red)){.bg-rose-500\/20{background-color:color-mix(in oklab,var(--color-rose-500) 20%,transparent)}}.bg-success{background-color:var(--color-success)}.bg-success\/5{background-color:#4ade800d}@supports (color:color-mix(in lab,red,red)){.bg-success\/5{background-color:color-mix(in oklab,var(--color-success) 5%,transparent)}}.bg-success\/10{background-color:#4ade801a}@supports (color:color-mix(in lab,red,red)){.bg-success\/10{background-color:color-mix(in oklab,var(--color-success) 10%,transparent)}}.bg-success\/20{background-color:#4ade8033}@supports (color:color-mix(in lab,red,red)){.bg-success\/20{background-color:color-mix(in oklab,var(--color-success) 20%,transparent)}}.bg-success\/30{background-color:#4ade804d}@supports (color:color-mix(in lab,red,red)){.bg-success\/30{background-color:color-mix(in oklab,var(--color-success) 30%,transparent)}}.bg-surface{background-color:var(--color-surface)}.bg-surface-overlay{background-color:var(--color-surface-overlay)}.bg-surface-overlay\/90{background-color:#334155e6}@supports (color:color-mix(in lab,red,red)){.bg-surface-overlay\/90{background-color:color-mix(in oklab,var(--color-surface-overlay) 90%,transparent)}}.bg-surface-raised{background-color:var(--color-surface-raised)}.bg-transparent{background-color:#0000}.bg-warning{background-color:var(--color-warning)}.bg-warning\/5{background-color:#fbbf240d}@supports (color:color-mix(in lab,red,red)){.bg-warning\/5{background-color:color-mix(in oklab,var(--color-warning) 5%,transparent)}}.bg-warning\/10{background-color:#fbbf241a}@supports (color:color-mix(in lab,red,red)){.bg-warning\/10{background-color:color-mix(in oklab,var(--color-warning) 10%,transparent)}}.bg-warning\/15{background-color:#fbbf2426}@supports (color:color-mix(in lab,red,red)){.bg-warning\/15{background-color:color-mix(in oklab,var(--color-warning) 15%,transparent)}}.bg-warning\/20{background-color:#fbbf2433}@supports (color:color-mix(in lab,red,red)){.bg-warning\/20{background-color:color-mix(in oklab,var(--color-warning) 20%,transparent)}}.bg-white{background-color:var(--color-white)}.bg-white\/10{background-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.bg-white\/10{background-color:color-mix(in oklab,var(--color-white) 10%,transparent)}}.fill-border-default{fill:var(--color-border-default)}.fill-surface-raised{fill:var(--color-surface-raised)}.fill-text-primary{fill:var(--color-text-primary)}.fill-text-secondary{fill:var(--color-text-secondary)}.stroke-border-default{stroke:var(--color-border-default)}.stroke-surface-overlay{stroke:var(--color-surface-overlay)}.stroke-2{stroke-width:2px}.stroke-\[3\]{stroke-width:3px}.object-contain{object-fit:contain}.object-cover{object-fit:cover}.p-0\.5{padding:calc(var(--spacing) * .5)}.p-1{padding:calc(var(--spacing) * 1)}.p-1\.5{padding:calc(var(--spacing) * 1.5)}.p-2{padding:calc(var(--spacing) * 2)}.p-2\.5{padding:calc(var(--spacing) * 2.5)}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.p-5{padding:calc(var(--spacing) * 5)}.p-6{padding:calc(var(--spacing) * 6)}.p-8{padding:calc(var(--spacing) * 8)}.px-1{padding-inline:calc(var(--spacing) * 1)}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-5{padding-inline:calc(var(--spacing) * 5)}.px-6{padding-inline:calc(var(--spacing) * 6)}.px-px{padding-inline:1px}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:calc(var(--spacing) * 1)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-2\.5{padding-block:calc(var(--spacing) * 2.5)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-6{padding-block:calc(var(--spacing) * 6)}.py-8{padding-block:calc(var(--spacing) * 8)}.py-16{padding-block:calc(var(--spacing) * 16)}.py-20{padding-block:calc(var(--spacing) * 20)}.py-\[16px\]{padding-block:16px}.py-px{padding-block:1px}.ps-1{padding-inline-start:calc(var(--spacing) * 1)}.ps-4{padding-inline-start:calc(var(--spacing) * 4)}.pe-3{padding-inline-end:calc(var(--spacing) * 3)}.pe-4{padding-inline-end:calc(var(--spacing) * 4)}.pt-0{padding-top:calc(var(--spacing) * 0)}.pt-1{padding-top:calc(var(--spacing) * 1)}.pt-2{padding-top:calc(var(--spacing) * 2)}.pt-3{padding-top:calc(var(--spacing) * 3)}.pt-4{padding-top:calc(var(--spacing) * 4)}.pb-1{padding-bottom:calc(var(--spacing) * 1)}.pb-1\.5{padding-bottom:calc(var(--spacing) * 1.5)}.pb-2{padding-bottom:calc(var(--spacing) * 2)}.pb-4{padding-bottom:calc(var(--spacing) * 4)}.pb-12{padding-bottom:calc(var(--spacing) * 12)}.text-center{text-align:center}.text-end{text-align:end}.text-left{text-align:left}.text-right{text-align:right}.text-start{text-align:start}.align-text-bottom{vertical-align:text-bottom}.align-text-top{vertical-align:text-top}.font-mono{font-family:var(--font-mono)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[8px\]{font-size:8px}.text-\[9px\]{font-size:9px}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.leading-tight{--tw-leading:var(--leading-tight);line-height:var(--leading-tight)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.whitespace-pre-wrap{white-space:pre-wrap}.text-\[\#a78bfa\]{color:#a78bfa}.text-\[\#f472b6\]{color:#f472b6}.text-accent{color:var(--color-accent)}.text-accent\/60{color:#a855f799}@supports (color:color-mix(in lab,red,red)){.text-accent\/60{color:color-mix(in oklab,var(--color-accent) 60%,transparent)}}.text-amber-400{color:var(--color-amber-400)}.text-blue-400{color:var(--color-blue-400)}.text-emerald-400{color:var(--color-emerald-400)}.text-error{color:var(--color-error)}.text-error\/80{color:#f87171cc}@supports (color:color-mix(in lab,red,red)){.text-error\/80{color:color-mix(in oklab,var(--color-error) 80%,transparent)}}.text-purple-400{color:var(--color-purple-400)}.text-rose-400{color:var(--color-rose-400)}.text-success{color:var(--color-success)}.text-success\/80{color:#4ade80cc}@supports (color:color-mix(in lab,red,red)){.text-success\/80{color:color-mix(in oklab,var(--color-success) 80%,transparent)}}.text-surface{color:var(--color-surface)}.text-text-muted{color:var(--color-text-muted)}.text-text-muted\/20{color:#64748b33}@supports (color:color-mix(in lab,red,red)){.text-text-muted\/20{color:color-mix(in oklab,var(--color-text-muted) 20%,transparent)}}.text-text-muted\/50{color:#64748b80}@supports (color:color-mix(in lab,red,red)){.text-text-muted\/50{color:color-mix(in oklab,var(--color-text-muted) 50%,transparent)}}.text-text-primary{color:var(--color-text-primary)}.text-text-secondary{color:var(--color-text-secondary)}.text-warning{color:var(--color-warning)}.text-warning\/80{color:#fbbf24cc}@supports (color:color-mix(in lab,red,red)){.text-warning\/80{color:color-mix(in oklab,var(--color-warning) 80%,transparent)}}.text-white{color:var(--color-white)}.lowercase{text-transform:lowercase}.uppercase{text-transform:uppercase}.italic{font-style:italic}.placeholder-text-muted::placeholder{color:var(--color-text-muted)}.accent-accent{accent-color:var(--color-accent)}.opacity-0{opacity:0}.opacity-40{opacity:.4}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.opacity-75{opacity:.75}.opacity-90{opacity:.9}.opacity-100{opacity:1}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-2xl{--tw-shadow:0 25px 50px -12px var(--tw-shadow-color,#00000040);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-xl{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a), 0 8px 10px -6px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.backdrop-blur-sm{--tw-backdrop-blur:blur(var(--blur-sm));-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.backdrop-filter{-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-150{--tw-duration:.15s;transition-duration:.15s}.duration-200{--tw-duration:.2s;transition-duration:.2s}.duration-300{--tw-duration:.3s;transition-duration:.3s}.duration-500{--tw-duration:.5s;transition-duration:.5s}.ease-in{--tw-ease:var(--ease-in);transition-timing-function:var(--ease-in)}.ease-in-out{--tw-ease:var(--ease-in-out);transition-timing-function:var(--ease-in-out)}.ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}.outline-none{--tw-outline-style:none;outline-style:none}@media(hover:hover){.group-hover\:pointer-events-auto:is(:where(.group):hover *){pointer-events:auto}.group-hover\:flex:is(:where(.group):hover *){display:flex}.group-hover\:opacity-100:is(:where(.group):hover *){opacity:1}}.placeholder\:text-text-muted::placeholder{color:var(--color-text-muted)}.first\:rounded-s-full:first-child{border-start-start-radius:3.40282e38px;border-end-start-radius:3.40282e38px}.last\:rounded-e-full:last-child{border-start-end-radius:3.40282e38px;border-end-end-radius:3.40282e38px}.last\:border-0:last-child{border-style:var(--tw-border-style);border-width:0}.focus-within\:border-accent:focus-within{border-color:var(--color-accent)}@media(hover:hover){.hover\:border-accent:hover{border-color:var(--color-accent)}.hover\:border-accent\/30:hover{border-color:#a855f74d}@supports (color:color-mix(in lab,red,red)){.hover\:border-accent\/30:hover{border-color:color-mix(in oklab,var(--color-accent) 30%,transparent)}}.hover\:border-accent\/50:hover{border-color:#a855f780}@supports (color:color-mix(in lab,red,red)){.hover\:border-accent\/50:hover{border-color:color-mix(in oklab,var(--color-accent) 50%,transparent)}}.hover\:border-border-default:hover{border-color:var(--color-border-default)}.hover\:border-error:hover{border-color:var(--color-error)}.hover\:bg-accent:hover{background-color:var(--color-accent)}.hover\:bg-accent-hover:hover{background-color:var(--color-accent-hover)}.hover\:bg-accent\/10:hover{background-color:#a855f71a}@supports (color:color-mix(in lab,red,red)){.hover\:bg-accent\/10:hover{background-color:color-mix(in oklab,var(--color-accent) 10%,transparent)}}.hover\:bg-accent\/20:hover{background-color:#a855f733}@supports (color:color-mix(in lab,red,red)){.hover\:bg-accent\/20:hover{background-color:color-mix(in oklab,var(--color-accent) 20%,transparent)}}.hover\:bg-border-default:hover{background-color:var(--color-border-default)}.hover\:bg-error\/10:hover{background-color:#f871711a}@supports (color:color-mix(in lab,red,red)){.hover\:bg-error\/10:hover{background-color:color-mix(in oklab,var(--color-error) 10%,transparent)}}.hover\:bg-error\/20:hover{background-color:#f8717133}@supports (color:color-mix(in lab,red,red)){.hover\:bg-error\/20:hover{background-color:color-mix(in oklab,var(--color-error) 20%,transparent)}}.hover\:bg-error\/30:hover{background-color:#f871714d}@supports (color:color-mix(in lab,red,red)){.hover\:bg-error\/30:hover{background-color:color-mix(in oklab,var(--color-error) 30%,transparent)}}.hover\:bg-error\/80:hover{background-color:#f87171cc}@supports (color:color-mix(in lab,red,red)){.hover\:bg-error\/80:hover{background-color:color-mix(in oklab,var(--color-error) 80%,transparent)}}.hover\:bg-success\/20:hover{background-color:#4ade8033}@supports (color:color-mix(in lab,red,red)){.hover\:bg-success\/20:hover{background-color:color-mix(in oklab,var(--color-success) 20%,transparent)}}.hover\:bg-surface:hover{background-color:var(--color-surface)}.hover\:bg-surface-overlay:hover{background-color:var(--color-surface-overlay)}.hover\:bg-surface-raised:hover{background-color:var(--color-surface-raised)}.hover\:bg-white\/20:hover{background-color:#fff3}@supports (color:color-mix(in lab,red,red)){.hover\:bg-white\/20:hover{background-color:color-mix(in oklab,var(--color-white) 20%,transparent)}}.hover\:text-accent:hover{color:var(--color-accent)}.hover\:text-accent-hover:hover{color:var(--color-accent-hover)}.hover\:text-error:hover{color:var(--color-error)}.hover\:text-text-primary:hover{color:var(--color-text-primary)}.hover\:text-text-secondary:hover{color:var(--color-text-secondary)}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-90:hover{opacity:.9}}.focus\:border-accent:focus{border-color:var(--color-accent)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-30:disabled{opacity:.3}.disabled\:opacity-40:disabled{opacity:.4}.disabled\:opacity-50:disabled{opacity:.5}@media(min-width:40rem){.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}@media(min-width:48rem){.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}@media(min-width:64rem){.lg\:col-span-1{grid-column:span 1/span 1}.lg\:col-span-2{grid-column:span 2/span 2}.lg\:col-span-3{grid-column:span 3/span 3}.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.lg\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.lg\:grid-cols-8{grid-template-columns:repeat(8,minmax(0,1fr))}.lg\:flex-row{flex-direction:row}.lg\:items-start{align-items:flex-start}.lg\:justify-center{justify-content:center}}@media(min-width:80rem){.xl\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.xl\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.xl\:grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}}.rtl\:-scale-x-100:where(:dir(rtl),[dir=rtl],[dir=rtl] *){--tw-scale-x: -100% ;scale:var(--tw-scale-x) var(--tw-scale-y)}}html{color-scheme:dark}html.light{color-scheme:light;--color-surface:#f8fafc;--color-surface-raised:#fff;--color-surface-overlay:#e2e8f0;--color-border-default:#cbd5e1;--color-text-primary:#0f172a;--color-text-secondary:#475569;--color-text-muted:#94a3b8;--color-accent:#9333ea;--color-accent-hover:#7e22ce;--color-success:#16a34a;--color-warning:#d97706;--color-error:#dc2626;--color-confidence-high:#16a34a;--color-confidence-mid:#d97706;--color-confidence-low:#dc2626}@keyframes typing-bounce{0%,80%,to{opacity:.4;transform:translateY(0)}40%{opacity:1;transform:translateY(-6px)}}@keyframes ripple{0%{opacity:.6;transform:scale(1)}to{opacity:0;transform:scale(2.2)}}@keyframes glow-in{0%{box-shadow:0 0 #a855f766}50%{box-shadow:0 0 8px 2px #a855f733}to{box-shadow:0 0 #a855f700}}@keyframes thinking-orbit{0%{transform:rotate(0)}to{transform:rotate(360deg)}}body{background-color:var(--color-surface);color:var(--color-text-primary);margin:0;font-family:Inter,Noto Sans SC,Noto Sans JP,Noto Sans KR,Noto Sans Arabic,Noto Sans Hebrew,Microsoft YaHei,Hiragino Sans,Meiryo,system-ui,-apple-system,sans-serif}::-webkit-scrollbar{width:6px;height:6px}::-webkit-scrollbar-track{background:0 0}::-webkit-scrollbar-thumb{background:var(--color-surface-overlay);border-radius:3px}::-webkit-scrollbar-thumb:hover{background:var(--color-border-default)}.markdown-prose{color:var(--color-text-primary);font-size:.875rem;line-height:1.625}.markdown-prose p{margin:.5em 0}.markdown-prose p:first-child{margin-top:0}.markdown-prose p:last-child{margin-bottom:0}.markdown-prose h1,.markdown-prose h2,.markdown-prose h3,.markdown-prose h4{color:var(--color-text-primary);margin:1em 0 .5em;font-weight:600}.markdown-prose h1{font-size:1.25em}.markdown-prose h2{font-size:1.125em}.markdown-prose h3{font-size:1em}.markdown-prose h1:first-child,.markdown-prose h2:first-child,.markdown-prose h3:first-child{margin-top:0}.markdown-prose strong{color:var(--color-text-primary);font-weight:600}.markdown-prose em{font-style:italic}.markdown-prose code{background:var(--color-surface-overlay);color:var(--color-accent);border-radius:4px;padding:.15em .35em;font-family:Fira Code,Cascadia Code,JetBrains Mono,monospace;font-size:.85em}.markdown-prose pre{background:var(--color-surface);border:1px solid var(--color-border-default);border-radius:8px;margin:.75em 0;padding:.75em 1em;overflow-x:auto}.markdown-prose pre code{color:var(--color-text-primary);background:0 0;border-radius:0;padding:0;font-size:.8em}.markdown-prose ul,.markdown-prose ol{margin:.5em 0;padding-inline-start:1.5em}.markdown-prose ul{list-style-type:disc}.markdown-prose ol{list-style-type:decimal}.markdown-prose li,.markdown-prose li>ul,.markdown-prose li>ol{margin:.25em 0}.markdown-prose blockquote{border-inline-start:3px solid var(--color-accent);background:var(--color-surface);color:var(--color-text-secondary);border-start-end-radius:6px;border-end-end-radius:6px;margin:.75em 0;padding:.5em 1em}.markdown-prose hr{border:none;border-top:1px solid var(--color-border-default);margin:1em 0}.markdown-prose a{color:var(--color-accent);text-decoration:underline}.markdown-prose table{border-collapse:collapse;width:100%;margin:.75em 0;font-size:.85em}.markdown-prose th,.markdown-prose td{border:1px solid var(--color-border-default);text-align:start;padding:.4em .75em}.markdown-prose th{background:var(--color-surface);font-weight:600}html[lang=zh],html[lang=ja],html[lang=ko]{word-break:break-all;overflow-wrap:anywhere}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@property --tw-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}@keyframes spin{to{transform:rotate(360deg)}}@keyframes pulse{50%{opacity:.5}}
|