llmxray 0.2.1 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/assets/AITrainingPage-6EIRz3kX.js +1 -0
- package/dist/assets/{BenchmarkPage-yZ1Kt8KK.js → BenchmarkPage-B7ahJqyh.js} +2 -2
- package/dist/assets/ComparisonPage-Cg4Ut59Z.js +1 -0
- package/dist/assets/DashboardPage-BrCHJN4q.js +101 -0
- package/dist/assets/EmbeddingsPage-CpsFUo1d.js +1 -0
- package/dist/assets/{GoogleCallbackPage-DqfqxXhg.js → GoogleCallbackPage-CN8CaZK-.js} +1 -1
- package/dist/assets/{JsonTreeNode-BE6Ps90W.js → JsonTreeNode-BvAGKM9G.js} +2 -2
- package/dist/assets/ModelCapabilityIcons.vue_vue_type_script_setup_true_lang-Cu2p2PDw.js +1 -0
- package/dist/assets/RAGPage-BKtz_PYd.js +1 -0
- package/dist/assets/SessionPage-BR4SPR1L.js +14 -0
- package/dist/assets/SettingsPage-BMhdIE_y.js +1 -0
- package/dist/assets/StatusBadge.vue_vue_type_script_setup_true_lang-Do1APUFY.js +1 -0
- package/dist/assets/StorageGauge.vue_vue_type_style_index_0_lang-DJFKaJRi.js +1 -0
- package/dist/assets/SystemPage-BoP1hvPb.js +2 -0
- package/dist/assets/{TabBar.vue_vue_type_script_setup_true_lang-CnQ8vq8x.js → TabBar.vue_vue_type_script_setup_true_lang-DEYUQ8oI.js} +1 -1
- package/dist/assets/{TokenStreamDisplay.vue_vue_type_script_setup_true_lang-CJW7ndOY.js → TokenStreamDisplay.vue_vue_type_script_setup_true_lang-DTGfuxgU.js} +1 -1
- package/dist/assets/{ToolWorkshopPage-gO5DvECk.css → ToolWorkshopPage-7TRbWVVL.css} +1 -1
- package/dist/assets/{ToolWorkshopPage-DoVwZp_3.js → ToolWorkshopPage-WPcjRasF.js} +88 -88
- package/dist/assets/{agent-store-_RIMRfEn.js → agent-store-DHWdued4.js} +1 -1
- package/dist/assets/{generate-service-mPYQA7Xh.js → generate-service-Cek8un6v.js} +1 -1
- package/dist/assets/{google-auth-store-BnEs-xLw.js → google-auth-store-DZ-3XsJA.js} +1 -1
- package/dist/assets/{index-D87kMEMb.js → index-B19rmHaK.js} +1 -1
- package/dist/assets/index-CgqXFXWk.js +6 -0
- package/dist/assets/index-DL68effo.css +1 -0
- package/dist/assets/{metrics-store-HzdMIV8O.js → metrics-store-eda0zEsH.js} +1 -1
- package/dist/assets/{rag-store-VWnttX_x.js → rag-store-lxO_mW3a.js} +1 -1
- package/dist/assets/{storage-store-B1XevdC4.js → storage-store-B9VvK961.js} +1 -1
- package/dist/assets/{stream-handler-29OjEvbo.js → stream-handler-D3rNjxe3.js} +2 -2
- package/dist/assets/{tool-workshop-store-Btx8DDqg.js → tool-workshop-store-XDULj1FM.js} +1 -1
- package/dist/assets/{toolcall-store-BumXt8DE.js → toolcall-store-CFB1O-_8.js} +1 -1
- package/dist/assets/trash-2-BLyRKRSt.js +1 -0
- package/dist/index.html +2 -2
- package/dist/social-card.svg +150 -0
- package/package.json +5 -2
- package/dist/assets/AITrainingPage-BbRryhHe.js +0 -1
- package/dist/assets/ComparisonPage-BnBp-VsC.js +0 -1
- package/dist/assets/DashboardPage-DTXPIpEx.js +0 -101
- package/dist/assets/EmbeddingsPage-CghkdGEr.js +0 -1
- package/dist/assets/ModelCapabilityIcons.vue_vue_type_script_setup_true_lang-CsL7aDHj.js +0 -1
- package/dist/assets/RAGPage-B_c1Nogo.js +0 -1
- package/dist/assets/SessionPage-lWGESxx3.js +0 -14
- package/dist/assets/SettingsPage-k9HWgy9B.js +0 -1
- package/dist/assets/StatusBadge.vue_vue_type_script_setup_true_lang-f9O-U2FX.js +0 -1
- package/dist/assets/StorageGauge.vue_vue_type_style_index_0_lang-hO4dId5t.js +0 -1
- package/dist/assets/SystemPage-BgwBHFJB.js +0 -2
- package/dist/assets/index-BqB3FY2M.js +0 -4
- package/dist/assets/index-C0qd34Zo.css +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{b as S,r as L,e as g,l as O,u as w,v as E,g as v,f as d,t as m,i as j,F as k,k as R,q as C,ah as x,j as h}from"./index-CgqXFXWk.js";import{_ as J}from"./_plugin-vue_export-helper-DlAUqK2U.js";function H(e,c="json"){if(e.length===0)return`return ${c}`;const t=e.map(a=>K(a)),s=new Map;for(const a of t)s.set(a,(s.get(a)??0)+1);const r=e.map((a,y)=>{let f=t[y];return(s.get(f)??0)>1&&(f=N(a)),` ${f}: ${c}.${a}`});return r.length===1?`return {${r[0].trim().replace(/^/," ").replace(/$/," ")}}`:`return {
|
|
2
2
|
${r.join(`,
|
|
3
3
|
`)}
|
|
4
4
|
}`}function K(e){const t=e.replace(/\[\d+\]/g,"").split(".");return t[t.length-1]??e}function N(e){const t=e.replace(/\[\d+\]/g,"").split(".");return t.length>=2?`${t[t.length-2]}_${t[t.length-1]}`:t[t.length-1]??e}function ne(e){if(e.length===0)return[];const c=e.map(s=>K(s)),t=new Map;for(const s of c)t.set(s,(t.get(s)??0)+1);return e.map((s,r)=>{let a=c[r];return(t.get(a)??0)>1&&(a=N(s)),{jsonPath:s,returnKey:a}})}function se(e,c){const t={},s=[];for(const r of e){const a=V(c,r.jsonPath);t[r.returnKey]={type:I(a)},s.push(r.returnKey)}return{type:"object",properties:t,required:s}}function V(e,c){const t=c.replace(/\[(\d+)\]/g,".$1").split(".");let s=e;for(const r of t){if(s==null||typeof s!="object")return;s=s[r]}return s}function I(e){return e==null||typeof e=="string"?"string":typeof e=="number"?Number.isInteger(e)?"integer":"number":typeof e=="boolean"?"boolean":Array.isArray(e)?"array":typeof e=="object"?"object":"string"}function re(e,c,t){const s=H(c),r=[],a=t?.method??"GET",y=t?.headers??{},f=t?.body,T=new Set(t?.secretHeaders??[]),u={};for(const[o,i]of Object.entries(y)){if(T.has(o)){const p=o.replace(/-/g,"_").toUpperCase();u[o]=`__ENV_${p}__`;continue}const l=o.toLowerCase();l==="authorization"?i.toLowerCase().startsWith("bearer ")?(r.push({name:"apiKey",type:"string"}),u[o]="__BEARER_PARAM__"):(r.push({name:"apiKey",type:"string"}),u[o]="__AUTH_PARAM__"):l.startsWith("x-api")||l.includes("api-key")||l.includes("apikey")?(r.push({name:"apiKey",type:"string"}),u[o]="__APIKEY_PARAM__"):u[o]=i}const $=Object.keys(u).length>0,b=f&&(a==="POST"||a==="PUT"),P=a!=="GET"||$||b;let _;if(!P)_=`const res = await fetch("${e}")`;else{const o=[];if(a!=="GET"&&o.push(` method: "${a}"`),$){const i=Object.entries(u).map(([l,p])=>{if(p==="__BEARER_PARAM__")return` "${l}": "Bearer " + apiKey`;if(p==="__AUTH_PARAM__")return` "${l}": apiKey`;if(p==="__APIKEY_PARAM__")return` "${l}": apiKey`;if(p.startsWith("__ENV_")&&p.endsWith("__")){const M=p.slice(6,-2);return` "${l}": process.env.${M}`}return` "${l}": "${p}"`});o.push(` headers: {
|
|
@@ -10,4 +10,4 @@ ${o.join(`,
|
|
|
10
10
|
})`}const A=_.replace(/\n/g,`
|
|
11
11
|
`),n=s.replace(/\n/g,`
|
|
12
12
|
`);return{body:["{"," try {",` ${A}`," const json = await res.json()",` ${n}`," } catch (e) {"," return { error: true, message: e instanceof Error ? e.message : String(e) }"," }","}"].join(`
|
|
13
|
-
`),addedParams:r}}const U={class:"tree-key"},W={class:"tree-type"},
|
|
13
|
+
`),addedParams:r}}const U={class:"tree-key"},W={class:"tree-type"},q={class:"tree-val"},z={key:0,class:"tree-check"},F={class:"tree-key"},G={class:"tree-type"},Y={key:0,class:"tree-children"},D={class:"tree-key"},Q={class:"tree-type"},X={key:0,class:"tree-children"},Z=S({__name:"JsonTreeNode",props:{label:{},value:{},path:{},selectedPaths:{},depth:{}},emits:["toggle-path"],setup(e,{emit:c}){const t=e,s=c,r=L(t.depth===void 0||(t.depth??0)<2),a=t.depth??0;function y(n){return n!==null&&typeof n=="object"&&!Array.isArray(n)}function f(n){return Array.isArray(n)}function T(n){return!y(n)&&!f(n)}function u(n){return n===null?"null":f(n)?`[${n.length}]`:y(n)?`{${Object.keys(n).length}}`:typeof n}function $(n){return n===null?"null":typeof n=="string"?n.length>40?`"${n.slice(0,40)}..."`:`"${n}"`:String(n)}function b(n){return typeof n=="number"?t.path?`${t.path}[${n}]`:`[${n}]`:t.path?`${t.path}.${n}`:n}function P(){r.value=!r.value}function _(){s("toggle-path",t.path)}function A(n){s("toggle-path",n)}return(n,B)=>{const o=x("JsonTreeNode",!0);return h(),g("div",{class:"tree-node",style:O({paddingLeft:w(a)>0?"14px":"0"})},[T(e.value)?(h(),g("div",{key:0,class:v(["tree-row leaf",{selected:e.selectedPaths.has(e.path)}]),onClick:E(_,["stop"])},[d("span",U,m(e.label),1),d("span",W,m(u(e.value)),1),d("span",q,m($(e.value)),1),e.selectedPaths.has(e.path)?(h(),g("span",z,"✓")):j("",!0)],2)):y(e.value)?(h(),g(k,{key:1},[d("div",{class:"tree-row branch",onClick:E(P,["stop"])},[d("span",{class:v(["tree-arrow",{open:r.value}])},"▶",2),d("span",F,m(e.label),1),d("span",G,m(u(e.value)),1)]),r.value?(h(),g("div",Y,[(h(!0),g(k,null,R(Object.keys(e.value),i=>(h(),C(o,{key:i,label:i,value:e.value[i],path:b(i),"selected-paths":e.selectedPaths,depth:w(a)+1,onTogglePath:A},null,8,["label","value","path","selected-paths","depth"]))),128))])):j("",!0)],64)):f(e.value)?(h(),g(k,{key:2},[d("div",{class:"tree-row branch",onClick:E(P,["stop"])},[d("span",{class:v(["tree-arrow",{open:r.value}])},"▶",2),d("span",D,m(e.label),1),d("span",Q,m(u(e.value)),1)]),r.value?(h(),g("div",X,[(h(!0),g(k,null,R(e.value,(i,l)=>(h(),C(o,{key:l,label:`[${l}]`,value:i,path:b(l),"selected-paths":e.selectedPaths,depth:w(a)+1,onTogglePath:A},null,8,["label","value","path","selected-paths","depth"]))),128))])):j("",!0)],64)):j("",!0)],4)}}}),ae=J(Z,[["__scopeId","data-v-cf750b49"]]);export{ae as J,re as a,se as b,ne as g,H as s};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{b as r,A as c,e as t,F as i,k as m,i as p,a as u,q as d,g as _,K as k,j as s,M as C}from"./index-CgqXFXWk.js";const b={key:0,class:"inline-flex items-center gap-0.5"},f=r({__name:"ModelCapabilityIcons",props:{modelName:{}},setup(o){const l=o,n=c(),a=u(()=>C(n.getCapabilities(l.modelName)));return(g,h)=>a.value.length>0?(s(),t("span",b,[(s(!0),t(i,null,m(a.value,e=>(s(),d(k(e.icon),{key:e.key,class:_(["h-3 w-3 shrink-0",e.color]),title:e.label},null,8,["class","title"]))),128))])):p("",!0)}});export{f as _};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{b as $,e as a,v as D,g as _,f as e,t as s,r as y,j as l,F as k,k as S,i as v,h as w,C as B,D as M,Q as F,l as N,A,B as E,w as T,G as j,u as m,p as b,a as C}from"./index-CgqXFXWk.js";import{d as I,u as L}from"./rag-store-lxO_mW3a.js";import{u as P}from"./storage-store-B9VvK961.js";import{_ as R}from"./StorageGauge.vue_vue_type_style_index_0_lang-DJFKaJRi.js";import{b as U}from"./format-BqVZ9rwM.js";import"./vector-db-ChAzHl5A.js";const V={class:"space-y-2"},z={class:"text-sm font-medium text-text-primary"},G={class:"text-xs text-text-muted"},q=".pdf,.docx,.txt,.md,.csv",K=$({__name:"DocumentUploadZone",emits:["upload"],setup(u,{emit:n}){const h=n,i=y(!1),c=y(null);function p(d){i.value=!1;const o=Array.from(d.dataTransfer?.files??[]).filter(g=>I(g.name)!==null);o.length>0&&h("upload",o)}function f(d){const t=d.target,g=Array.from(t.files??[]).filter(x=>I(x.name)!==null);g.length>0&&h("upload",g),t.value=""}function r(){c.value?.click()}return(d,t)=>(l(),a("div",{class:_(["relative rounded-xl border-2 border-dashed p-8 text-center transition-colors cursor-pointer",i.value?"border-accent bg-accent/5":"border-border-default hover:border-accent/50"]),onDragover:t[0]||(t[0]=D(o=>i.value=!0,["prevent"])),onDragleave:t[1]||(t[1]=D(o=>i.value=!1,["prevent"])),onDrop:D(p,["prevent"]),onClick:r},[e("input",{ref_key:"fileInput",ref:c,type:"file",accept:q,multiple:"",class:"hidden",onChange:f},null,544),e("div",V,[t[2]||(t[2]=e("div",{class:"text-3xl"},"📄",-1)),e("p",z,s(d.$t("rag.upload.dropText")),1),e("p",G,s(d.$t("rag.upload.supportedFormats")),1)])],34))}}),Q={key:0,class:"rounded-lg bg-surface-overlay p-6 text-center"},Z={class:"text-sm text-text-muted"},H={key:1,class:"space-y-2"},J=["title","onClick"],O={key:0,class:"text-xs"},W={key:1,class:"h-5 w-5"},X={class:"text-lg"},Y={class:"flex-1 min-w-0"},ee={class:"text-sm font-medium text-text-primary truncate"},te={class:"text-xs text-text-muted"},se={key:0,class:"ml-1"},oe={class:"text-xs text-text-muted shrink-0"},re=["title","onClick"],ne=768,ae=$({__name:"DocumentList",props:{documents:{},enabledIds:{}},emits:["toggle","remove"],setup(u,{emit:n}){const h=n;function i(r){return r<1024?`${r} B`:r<1024*1024?`${(r/1024).toFixed(1)} KB`:`${(r/(1024*1024)).toFixed(1)} MB`}function c(r){return new Date(r).toLocaleDateString(void 0,{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"})}function p(r){return r.sizeBytes+r.chunkCount*ne*8}const f={pdf:"📕",docx:"📘",txt:"📝",md:"📋",csv:"📊"};return(r,d)=>u.documents.length===0?(l(),a("div",Q,[e("p",Z,s(r.$t("rag.documents.noDocuments")),1)])):(l(),a("div",H,[(l(!0),a(k,null,S(u.documents,t=>(l(),a("div",{key:t.id,class:"flex items-center gap-3 rounded-lg border border-border-default bg-surface-raised px-4 py-3 transition-colors"},[t.status==="ready"?(l(),a("button",{key:0,class:_(["flex h-5 w-5 shrink-0 items-center justify-center rounded border transition-colors",u.enabledIds.has(t.id)?"border-accent bg-accent text-white":"border-border-default hover:border-accent"]),title:r.$t("rag.documents.toggleContext"),onClick:o=>h("toggle",t.id)},[u.enabledIds.has(t.id)?(l(),a("span",O,"✓")):v("",!0)],10,J)):(l(),a("span",W)),e("span",X,s(f[t.format]??"📄"),1),e("div",Y,[e("p",ee,s(t.name),1),e("p",te,[w(s(i(t.sizeBytes))+" · "+s(t.chunkCount)+" chunks · ~"+s(i(p(t)))+" stored · "+s(t.embeddingModel)+" ",1),t.status!=="ready"?(l(),a("span",se,[d[0]||(d[0]=w(" · ",-1)),e("span",{class:_(t.status==="error"?"text-error":"text-accent")},s(t.status),3)])):v("",!0)])]),e("span",oe,s(c(t.addedAt)),1),e("button",{class:"shrink-0 rounded p-1 text-text-muted hover:text-error transition-colors",title:r.$t("rag.documents.removeDocument"),onClick:o=>h("remove",t.id)}," ✕ ",8,re)]))),128))]))}}),le={class:"space-y-4"},ie={class:"flex gap-2"},de=["placeholder"],ce=["disabled"],ue={key:0,class:"space-y-3"},me={class:"text-xs text-text-muted"},ge={class:"mb-2 flex items-center justify-between"},he={class:"text-xs font-medium text-text-secondary"},pe=["onClick"],fe=["onClick"],xe=$({__name:"RAGSearchPanel",props:{results:{},isSearching:{type:Boolean}},emits:["search"],setup(u,{emit:n}){const h=n,i=y(""),c=y(new Set);function p(){const r=i.value.trim();r&&(c.value=new Set,h("search",r))}function f(r){const d=new Set(c.value);d.has(r)?d.delete(r):d.add(r),c.value=d}return(r,d)=>(l(),a("div",le,[e("div",ie,[B(e("input",{"onUpdate:modelValue":d[0]||(d[0]=t=>i.value=t),type:"text",placeholder:r.$t("rag.search.placeholder"),class:"flex-1 rounded-lg border border-border-default bg-surface px-4 py-2 text-sm text-text-primary placeholder-text-muted outline-none focus:border-accent",onKeydown:F(p,["enter"])},null,40,de),[[M,i.value]]),e("button",{disabled:!i.value.trim()||u.isSearching,class:"rounded-lg bg-accent px-4 py-2 text-sm text-white transition-colors hover:bg-accent-hover disabled:opacity-40",onClick:p},s(u.isSearching?r.$t("rag.search.searching"):r.$t("rag.search.button")),9,ce)]),u.results.length>0?(l(),a("div",ue,[e("p",me,s(u.results.length)+" "+s(r.$t("rag.search.results")),1),(l(!0),a(k,null,S(u.results,(t,o)=>(l(),a("div",{key:o,class:"rounded-lg border border-border-default bg-surface-raised p-4"},[e("div",ge,[e("span",he,s(t.documentName),1),e("span",{class:_(["rounded-full px-2 py-0.5 text-[10px] font-medium",t.score>.8?"bg-success/10 text-success":t.score>.5?"bg-warning/10 text-warning":"bg-surface-overlay text-text-muted"])},s((t.score*100).toFixed(1))+"% ",3)]),e("p",{class:_(["text-sm text-text-primary leading-relaxed whitespace-pre-wrap cursor-pointer",c.value.has(o)?"":"line-clamp-4"]),onClick:g=>f(o)},s(t.chunk.content),11,pe),e("button",{class:"mt-1.5 text-[10px] text-accent hover:underline",onClick:g=>f(o)},s(c.value.has(o)?r.$t("rag.search.showLess"):r.$t("rag.search.showFullChunk")),9,fe)]))),128))])):v("",!0)]))}}),ve={key:0,class:"rounded-lg border border-accent/30 bg-accent/5 p-4"},be={class:"flex items-center justify-between mb-2"},_e={class:"text-sm font-medium text-text-primary"},ye={class:"text-xs text-text-muted"},$e={class:"h-1.5 rounded-full bg-surface-overlay overflow-hidden"},ke=$({__name:"IngestProgress",props:{progress:{}},setup(u){return(n,h)=>u.progress?(l(),a("div",ve,[e("div",be,[e("span",_e,s(u.progress.message),1),e("span",ye,s((u.progress.progress*100).toFixed(0))+"%",1)]),e("div",$e,[e("div",{class:"h-full rounded-full bg-accent transition-all duration-300",style:N({width:`${u.progress.progress*100}%`})},null,4)])])):v("",!0)}}),we={class:"space-y-6"},De={class:"flex items-center justify-between"},Se={class:"text-lg font-semibold text-text-primary"},Ce={class:"text-sm text-text-muted"},Ie={key:0,value:"",disabled:""},Be=["value"],Me={key:0,class:"rounded-lg border border-border-default bg-surface-raised p-3 space-y-2"},Fe={class:"flex items-center justify-between text-xs"},Ne={class:"text-text-secondary font-medium"},Ae={class:"text-text-muted"},Ee={key:1,class:"rounded-lg border border-error/30 bg-error/5 px-4 py-3 text-sm text-error"},Te={class:"mb-3 text-sm font-medium text-text-secondary"},je={class:"mb-3 text-sm font-medium text-text-secondary"},Ge=$({__name:"RAGPage",setup(u){const n=L(),h=A(),i=P(),c=y(""),p=C(()=>i.getDatabaseById("rag")),f=C(()=>n.readyDocuments.reduce((o,g)=>o+g.chunkCount,0));E(async()=>{await h.fetchModels(),c.value=h.embeddingModelNames[0]??"",await n.loadDocuments(),await i.refreshIfStale()}),T(()=>n.isIngesting,(o,g)=>{!o&&g&&i.refresh()});async function r(o){if(c.value)for(const g of o)try{await n.addDocument(g,c.value)}catch{}}async function d(o){await n.removeDocument(o),await i.refresh()}async function t(o){c.value&&await n.search(o,c.value)}return(o,g)=>(l(),a("div",we,[e("div",De,[e("div",null,[e("h2",Se,s(o.$t("rag.title")),1),e("p",Ce,s(o.$t("rag.subtitle")),1)]),B(e("select",{"onUpdate:modelValue":g[0]||(g[0]=x=>c.value=x),class:"rounded-lg border border-border-default bg-surface px-3 py-1.5 text-sm text-text-primary outline-none focus:border-accent"},[m(h).embeddingModelNames.length===0?(l(),a("option",Ie,s(o.$t("rag.modelSelector.noEmbeddingModels")),1)):v("",!0),(l(!0),a(k,null,S(m(h).embeddingModelNames,x=>(l(),a("option",{key:x,value:x},s(x)+" "+s(m(h).capabilityIcons(x)),9,Be))),128))],512),[[j,c.value]])]),m(i).origin?(l(),a("div",Me,[e("div",Fe,[e("span",Ne,s(o.$t("rag.storage.title")),1),e("span",Ae,[w(s(m(n).readyDocuments.length)+" "+s(o.$t("rag.storage.documents"))+" · "+s(f.value.toLocaleString())+" "+s(o.$t("rag.storage.chunks"))+" ",1),p.value?(l(),a(k,{key:0},[w("· "+s(m(U)(p.value.totalBytes))+" "+s(o.$t("rag.storage.stored")),1)],64)):v("",!0)])]),b(R,{used:p.value?.totalBytes??0,total:m(i).origin.quota,label:o.$t("rag.storage.ragStorage"),animating:m(n).isIngesting,compact:""},null,8,["used","total","label","animating"])])):v("",!0),b(K,{onUpload:r}),b(ke,{progress:m(n).ingestProgress},null,8,["progress"]),m(n).error?(l(),a("div",Ee,s(m(n).error),1)):v("",!0),e("div",null,[e("h3",Te,s(o.$t("rag.documents.title"))+" ("+s(m(n).readyDocuments.length)+") ",1),b(ae,{documents:m(n).documents,"enabled-ids":m(n).enabledDocumentIds,onToggle:m(n).toggleDocument,onRemove:d},null,8,["documents","enabled-ids","onToggle"])]),e("div",null,[e("h3",je,s(o.$t("rag.search.title")),1),b(xe,{results:m(n).searchResults,"is-searching":m(n).isSearching,onSearch:t},null,8,["results","is-searching"])])]))}});export{Ge as default};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import{a as xe,u as pe}from"./toolcall-store-CFB1O-_8.js";import{u as fe}from"./metrics-store-eda0zEsH.js";import{_ as be}from"./TabBar.vue_vue_type_script_setup_true_lang-DEYUQ8oI.js";import{b as ve,_ as ee,n as ge,s as F,u as ye}from"./StatusBadge.vue_vue_type_script_setup_true_lang-Do1APUFY.js";import{_ as he}from"./TokenStreamDisplay.vue_vue_type_script_setup_true_lang-DTGfuxgU.js";import{c as R,a as ke,f as X,e as _e}from"./format-BqVZ9rwM.js";import{C as K,a as G,L as U,P as $e,b as we,p as te,c as J,d as se,i as Ce,e as Me,B as oe,f as ne}from"./index-B19rmHaK.js";import{c as Te,b as z,e as a,f as e,t as x,p as $,u as w,a as k,j as s,F as N,k as A,q as L,g as D,h as C,d as Se,r as S,A as re,i as g,K as ze,l as q,L as Ne,M as Ae,B as Q,w as E,C as V,G as Ie,v as ae,T as Le,X as Pe,D as Y,H as je,z as De}from"./index-CgqXFXWk.js";import{b as Oe,a as Fe,u as Re}from"./agent-store-DHWdued4.js";import{u as Be}from"./tool-workshop-store-XDULj1FM.js";import{s as qe,J as He,g as Ee}from"./JsonTreeNode-BvAGKM9G.js";import"./_plugin-vue_export-helper-DlAUqK2U.js";const P=Te("info",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M12 16v-4",key:"1dtifu"}],["path",{d:"M12 8h.01",key:"e9boi3"}]]),Ve={class:"rounded-lg border border-border-default bg-surface-raised p-4"},We={class:"mb-3 text-sm font-medium text-text-secondary"},Ke={class:"h-40"},Ge=z({__name:"LatencyChart",props:{tokenLatencies:{},title:{}},setup(t){K.register(G,U,$e,we,te,J,se,Ce);const r=t,n=k(()=>({labels:r.tokenLatencies.map((u,d)=>`${d}`),datasets:[{label:"Token Latency (ms)",data:r.tokenLatencies,borderColor:"#a855f7",backgroundColor:"rgba(168, 85, 247, 0.1)",borderWidth:1.5,pointRadius:0,fill:!0,tension:.3}]})),o={responsive:!0,maintainAspectRatio:!1,plugins:{legend:{display:!1},title:{display:!1}},scales:{x:{display:!1},y:{ticks:{color:"#94a3b8",font:{size:10}},grid:{color:"rgba(71, 85, 105, 0.3)"}}}};return(u,d)=>(s(),a("div",Ve,[e("h3",We,x(t.title??"Token Latency"),1),e("div",Ke,[$(w(Me),{data:n.value,options:o},null,8,["data"])])]))}}),Ue={class:"rounded-lg border border-border-default bg-surface-raised p-4"},Je={class:"h-20"},Qe={class:"mt-2 flex gap-4 text-xs text-text-muted"},Xe=z({__name:"TokenCountBar",props:{promptTokens:{},completionTokens:{}},setup(t){K.register(G,U,oe,te,J,se);const r=t,n=k(()=>({labels:["Tokens"],datasets:[{label:"Prompt",data:[r.promptTokens],backgroundColor:"#818cf8"},{label:"Completion",data:[r.completionTokens],backgroundColor:"#a855f7"}]})),o={indexAxis:"y",responsive:!0,maintainAspectRatio:!1,plugins:{legend:{position:"bottom",labels:{color:"#94a3b8",font:{size:11}}}},scales:{x:{stacked:!0,ticks:{color:"#94a3b8",font:{size:10}},grid:{color:"rgba(71, 85, 105, 0.3)"}},y:{stacked:!0,display:!1}}};return(u,d)=>(s(),a("div",Ue,[d[0]||(d[0]=e("h3",{class:"mb-3 text-sm font-medium text-text-secondary"},"Token Distribution",-1)),e("div",Je,[$(w(ne),{data:n.value,options:o},null,8,["data"])]),e("div",Qe,[e("span",null,"Total: "+x(t.promptTokens+t.completionTokens),1)])]))}}),Ye={key:0,class:"space-y-4"},Ze={class:"grid grid-cols-2 gap-3 lg:grid-cols-3 xl:grid-cols-6"},et={class:"grid grid-cols-1 gap-3 lg:grid-cols-2"},tt={key:1,class:"rounded-lg border border-border-default bg-surface-raised p-8 text-center text-sm text-text-muted"},st=z({__name:"MetricsDashboard",props:{metrics:{}},setup(t){const r=t,n=k(()=>{const o=r.metrics;return o?[{label:"Time to First Token",value:R(o.ttftMs),unit:""},{label:"Tokens/Second",value:ke(o.tokensPerSecond),unit:""},{label:"Total Duration",value:R(o.totalDurationMs),unit:""},{label:"Prompt Tokens",value:X(o.promptTokenCount),unit:"tok"},{label:"Completion Tokens",value:X(o.completionTokenCount),unit:"tok"},{label:"Model Load",value:R(o.loadDurationMs),unit:""}]:[]});return(o,u)=>t.metrics?(s(),a("div",Ye,[e("div",Ze,[(s(!0),a(N,null,A(n.value,d=>(s(),L(ve,{key:d.label,label:d.label,value:d.value,unit:d.unit},null,8,["label","value","unit"]))),128))]),e("div",et,[$(Ge,{"token-latencies":t.metrics.tokenLatencies},null,8,["token-latencies"]),$(Xe,{"prompt-tokens":t.metrics.promptTokenCount,"completion-tokens":t.metrics.completionTokenCount},null,8,["prompt-tokens","completion-tokens"])])])):(s(),a("div",tt," Metrics will appear after generation completes. "))}}),ot={class:"flex gap-3"},nt={class:"flex flex-col items-center"},rt={class:"flex h-8 w-8 items-center justify-center rounded-full bg-surface-overlay text-sm"},at={class:"flex-1 pb-4"},lt={class:"flex items-center gap-2 mb-1"},it={class:"text-xs text-text-muted"},dt={class:"rounded-lg border border-border-default bg-surface p-3 text-sm text-text-primary leading-relaxed"},ut=z({__name:"ReasoningStep",props:{step:{}},setup(t){const r={thought:{color:"text-accent",icon:"💭"},observation:{color:"text-success",icon:"👁"},action:{color:"text-warning",icon:"⚡"},conclusion:{color:"text-[#a78bfa]",icon:"✓"},reflection:{color:"text-[#f472b6]",icon:"↻"}};return(n,o)=>(s(),a("div",ot,[e("div",nt,[e("div",rt,x(r[t.step.type]?.icon??"•"),1),o[0]||(o[0]=e("div",{class:"flex-1 w-px bg-border-default"},null,-1))]),e("div",at,[e("div",lt,[e("span",{class:D(["text-xs font-semibold uppercase tracking-wide",r[t.step.type]?.color??"text-text-secondary"])},x(t.step.type),3),e("span",it," Step "+x(t.step.index+1)+" · "+x(w(R)(t.step.durationMs)),1)]),e("div",dt,x(t.step.content),1)])]))}}),ct={class:"space-y-4"},mt={class:"flex items-center gap-4 rounded-lg border border-border-default bg-surface-raised p-4"},xt={class:"text-sm text-text-secondary"},pt={class:"font-semibold text-text-primary"},ft={class:"flex gap-2"},bt={key:0,class:"space-y-0"},vt={key:1,class:"rounded-lg border border-border-default bg-surface-raised p-8 text-center text-sm text-text-muted"},gt=z({__name:"ReasoningViewer",props:{sessionId:{}},setup(t){const r=t,n=Oe(),o=k(()=>n.getSteps(r.sessionId)),u=k(()=>{const d={};for(const p of o.value)d[p.type]=(d[p.type]??0)+1;return d});return(d,p)=>(s(),a("div",ct,[e("div",mt,[e("div",xt,[e("span",pt,x(o.value.length),1),p[0]||(p[0]=C(" reasoning steps detected ",-1))]),e("div",ft,[(s(!0),a(N,null,A(u.value,(l,c)=>(s(),a("span",{key:c,class:"rounded-full bg-surface-overlay px-2.5 py-0.5 text-xs text-text-secondary"},x(c)+": "+x(l),1))),128))])]),o.value.length>0?(s(),a("div",bt,[(s(!0),a(N,null,A(o.value,l=>(s(),L(ut,{key:l.id,step:l},null,8,["step"]))),128))])):(s(),a("div",vt,[...p[1]||(p[1]=[e("p",null,"No reasoning steps detected.",-1),e("p",{class:"mt-1"},"Use a model with chain-of-thought support (e.g., DeepSeek-R1) or structured reasoning patterns.",-1)])]))]))}}),le=Se("introspection",()=>{const t=S(new Map),r=S(new Map),n=S(new Map);function o(m){return t.value.get(m)??null}function u(m,f){t.value.set(m,f)}function d(m){return r.value.get(m)??[]}function p(m,f){r.value.set(m,f)}function l(m){return n.value.get(m)??[]}function c(m,f){n.value.set(m,f)}return{architectureByModel:t,attentionPatterns:r,layerActivations:n,getArchitecture:o,setArchitecture:u,getAttentionPatterns:d,setAttentionPatterns:p,getLayerActivations:l,setLayerActivations:c}});function yt(t,r){const n=r.model_info,o=r.details.family||"unknown",u=O(n,"block_count")??32,d=O(n,"embedding_length")??4096,p=O(n,"attention.head_count")??32,l=O(n,"attention.head_count_kv")??p,c=O(n,"context_length")??4096,m=O(n,"feed_forward_length")??d*4,f=r.details.parameter_size||"0",b=_t(f),v=$t(u);return{family:o,blockCount:u,embeddingLength:d,attentionHeadCount:p,kvHeadCount:l,contextLength:c,feedForwardLength:m,layers:v,totalParameters:b,quantization:r.details.quantization_level||"unknown"}}function ht(t,r,n){const o=[],u=t.length,d=Math.min(r,2),p=Math.min(n,2);for(let l=0;l<p;l++)for(let c=0;c<d;c++){const m=[];for(let f=0;f<u;f++){const b=[];for(let _=0;_<u;_++)if(_>f)b.push(0);else{const M=f-_,i=Math.exp(-M*(.1+l*.05)),y=Math.random()*.15,j=_===f?.3:0;b.push(Math.min(1,i+y+j))}const v=b.reduce((_,M)=>_+M,0);m.push(v>0?b.map(_=>_/v):b)}o.push({tokenLabels:t,matrix:m,headIndex:c,layerIndex:l})}return o}function kt(t){const r=[];for(const n of t.layers){const o=Math.sqrt(t.embeddingLength)*(1+Math.random()*.5),u=n.type==="attention"?1:n.type==="feed_forward"?1.3:.8;r.push({layerIndex:n.index,layerName:n.name,meanActivation:(.5+Math.random()*.5)*u,maxActivation:(2+Math.random()*3)*u,norm:o*u*(.8+Math.random()*.4)})}return r}function O(t,r){for(const[n,o]of Object.entries(t))if(n.endsWith(r)&&typeof o=="number")return o}function _t(t){const r=t.match(/([\d.]+)\s*([BMK])?/i);if(!r)return 0;const n=parseFloat(r[1]),o=(r[2]??"").toUpperCase();return o==="B"?n*1e9:o==="M"?n*1e6:o==="K"?n*1e3:n}function $t(t){const r=[];let n=0;r.push({index:n++,name:"token_embedding",type:"embedding",parameterCount:0});for(let o=0;o<t;o++)r.push({index:n++,name:`block_${o}_attention`,type:"attention",parameterCount:0}),r.push({index:n++,name:`block_${o}_ffn`,type:"feed_forward",parameterCount:0}),r.push({index:n++,name:`block_${o}_norm`,type:"norm",parameterCount:0});return r.push({index:n++,name:"output",type:"output",parameterCount:0}),r}async function wt(t){const r=re(),n=le();await r.fetchModelInfo(t);const o=r.getModelDetails(t);if(o){const u=yt(t,o);n.setArchitecture(t,u)}}const Ct={class:"space-y-4"},Mt={key:0,class:"rounded-lg bg-surface p-4"},Tt={class:"flex items-center gap-2 flex-wrap"},St=["onMouseenter"],zt={key:1,class:"absolute top-full left-1/2 -translate-x-1/2 mt-2 w-56 rounded-lg border border-border-default bg-surface-overlay px-3 py-2 text-xs text-text-secondary shadow-lg z-10"},Nt={class:"grid grid-cols-2 gap-3 lg:grid-cols-4"},At={class:"flex items-center gap-1 text-xs text-text-muted"},It={class:"text-sm font-medium text-text-primary"},Lt={key:0,class:"absolute top-full left-1/2 -translate-x-1/2 mt-2 w-56 rounded-lg border border-border-default bg-surface-overlay px-3 py-2 text-xs text-text-secondary shadow-lg z-10"},Pt={class:"flex items-center gap-1 text-xs text-text-muted"},jt={class:"text-sm font-medium text-text-primary"},Dt={key:0,class:"absolute top-full left-1/2 -translate-x-1/2 mt-2 w-56 rounded-lg border border-border-default bg-surface-overlay px-3 py-2 text-xs text-text-secondary shadow-lg z-10"},Ot={class:"flex items-center gap-1 text-xs text-text-muted"},Ft={class:"text-sm font-medium text-text-primary"},Rt={key:0,class:"absolute top-full left-1/2 -translate-x-1/2 mt-2 w-64 rounded-lg border border-border-default bg-surface-overlay px-3 py-2 text-xs text-text-secondary shadow-lg z-10"},Bt={class:"flex items-center gap-1 text-xs text-text-muted"},qt={class:"text-sm font-medium text-text-primary"},Ht={key:0,class:"absolute top-full left-1/2 -translate-x-1/2 mt-2 w-64 rounded-lg border border-border-default bg-surface-overlay px-3 py-2 text-xs text-text-secondary shadow-lg z-10"},Et={class:"rounded-lg bg-surface p-4"},Vt={class:"flex items-center gap-1 mb-3"},Wt={class:"text-xs font-medium text-text-muted uppercase tracking-wide"},Kt={key:0,class:"absolute top-full left-1/2 -translate-x-1/2 mt-2 w-64 rounded-lg border border-border-default bg-surface-overlay px-3 py-2 text-xs text-text-secondary shadow-lg z-10"},Gt={class:"flex items-center gap-2 flex-wrap"},Ut=["onMouseenter"],Jt={class:"text-xs text-text-primary"},Qt={class:"text-xs text-text-muted"},Xt={key:0,class:"absolute top-full left-1/2 -translate-x-1/2 mt-2 w-60 rounded-lg border border-border-default bg-surface-overlay px-3 py-2 text-xs text-text-secondary shadow-lg z-10"},Yt={class:"grid grid-cols-2 gap-3 text-xs"},Zt={class:"ml-1 text-text-primary"},es={key:0,class:"absolute top-full left-1/2 -translate-x-1/2 mt-2 w-60 rounded-lg border border-border-default bg-surface-overlay px-3 py-2 text-xs text-text-secondary shadow-lg z-10"},ts={class:"ml-1 text-text-primary"},ss={key:0,class:"absolute top-full left-1/2 -translate-x-1/2 mt-2 w-64 rounded-lg border border-border-default bg-surface-overlay px-3 py-2 text-xs text-text-secondary shadow-lg z-10"},os={class:"ml-1 text-text-primary"},ns={key:0,class:"absolute top-full left-1/2 -translate-x-1/2 mt-2 w-60 rounded-lg border border-border-default bg-surface-overlay px-3 py-2 text-xs text-text-secondary shadow-lg z-10"},rs={class:"ml-1 text-text-primary"},as={key:0,class:"absolute top-full left-1/2 -translate-x-1/2 mt-2 w-64 rounded-lg border border-border-default bg-surface-overlay px-3 py-2 text-xs text-text-secondary shadow-lg z-10"},ls={key:1,class:"rounded-lg bg-surface"},is={key:0,class:"border-t border-border-default px-4 pb-4 pt-2"},ds={class:"w-full text-xs"},us={class:"py-1.5 pr-4 text-text-muted font-mono"},cs={class:"py-1.5 text-text-primary font-mono"},ms={key:2,class:"rounded-lg bg-surface"},xs={key:0,class:"border-t border-border-default px-4 pb-4 pt-2"},ps={class:"overflow-auto rounded-lg bg-surface-raised p-3 text-xs text-text-secondary font-mono leading-relaxed"},fs=z({__name:"ModelArchitectureDiagram",props:{architecture:{},modelName:{}},setup(t){const r=t,n=re(),o=k(()=>r.modelName?n.getModelDetails(r.modelName)??null:null),u=k(()=>{if(!o.value?.parameters)return null;const M=Ne(o.value.parameters);return Object.keys(M).length>0?M:null}),d=k(()=>o.value?.template??null),p=S(!1),l=S(!1),c=k(()=>r.modelName?Ae(n.getCapabilities(r.modelName)):[]),m={embedding:"#818cf8",attention:"#a855f7",feed_forward:"#fb923c",norm:"#94a3b8",output:"#4ade80"},f=k(()=>{const M=r.architecture;return[{label:"Embedding",color:m.embedding,count:1,desc:"Converts input tokens into dense numerical vectors the model can process"},{label:"Attention",color:m.attention,count:M.blockCount,desc:"Lets each token attend to every other token to capture relationships and context"},{label:"FFN",color:m.feed_forward,count:M.blockCount,desc:"Feed-Forward Network — applies non-linear transformations to refine representations"},{label:"LayerNorm",color:m.norm,count:M.blockCount,desc:"Normalizes activations between layers to stabilize and speed up training"},{label:"Output",color:m.output,count:1,desc:"Projects the final hidden state back to vocabulary size to predict the next token"}]}),b=S(null);function v(M){b.value=M}function _(){b.value=null}return(M,i)=>(s(),a("div",Ct,[c.value.length>0?(s(),a("div",Mt,[i[12]||(i[12]=e("h4",{class:"text-xs font-medium text-text-muted uppercase tracking-wide mb-3"},"Capabilities",-1)),e("div",Tt,[(s(!0),a(N,null,A(c.value,y=>(s(),a("div",{key:y.key,class:"relative flex items-center gap-1.5 rounded-lg border border-border-default px-3 py-1.5",onMouseenter:j=>v("cap-"+y.key),onMouseleave:_},[y.icon?(s(),L(ze(y.icon),{key:0,class:D(["h-3.5 w-3.5 shrink-0",y.color])},null,8,["class"])):g("",!0),e("span",{class:D(["text-xs font-medium",y.color])},x(y.label),3),b.value==="cap-"+y.key?(s(),a("div",zt,[C(x(y.desc)+" ",1),i[11]||(i[11]=e("div",{class:"absolute bottom-full left-1/2 -translate-x-1/2 -mb-px border-4 border-transparent border-b-surface-overlay"},null,-1))])):g("",!0)],40,St))),128))])])):g("",!0),e("div",Nt,[e("div",{class:"relative rounded-lg bg-surface p-3",onMouseenter:i[0]||(i[0]=y=>v("family")),onMouseleave:_},[e("div",At,[i[13]||(i[13]=C(" Family ",-1)),$(w(P),{class:"h-3 w-3"})]),e("div",It,x(t.architecture.family),1),b.value==="family"?(s(),a("div",Lt,[...i[14]||(i[14]=[C(" The base model architecture family (e.g. llama, qwen). Models in the same family share the same neural network design. ",-1),e("div",{class:"absolute bottom-full left-1/2 -translate-x-1/2 -mb-px border-4 border-transparent border-b-surface-overlay"},null,-1)])])):g("",!0)],32),e("div",{class:"relative rounded-lg bg-surface p-3",onMouseenter:i[1]||(i[1]=y=>v("params")),onMouseleave:_},[e("div",Pt,[i[15]||(i[15]=C(" Parameters ",-1)),$(w(P),{class:"h-3 w-3"})]),e("div",jt,x(w(_e)(t.architecture.totalParameters)),1),b.value==="params"?(s(),a("div",Dt,[...i[16]||(i[16]=[C(" Total number of trainable weights in the model. More parameters generally means greater capability but requires more memory and compute. ",-1),e("div",{class:"absolute bottom-full left-1/2 -translate-x-1/2 -mb-px border-4 border-transparent border-b-surface-overlay"},null,-1)])])):g("",!0)],32),e("div",{class:"relative rounded-lg bg-surface p-3",onMouseenter:i[2]||(i[2]=y=>v("ctx")),onMouseleave:_},[e("div",Ot,[i[17]||(i[17]=C(" Context Length ",-1)),$(w(P),{class:"h-3 w-3"})]),e("div",Ft,x(t.architecture.contextLength.toLocaleString()),1),b.value==="ctx"?(s(),a("div",Rt,[...i[18]||(i[18]=[C(" Maximum number of tokens (prompt + response) the model can process in a single conversation. Longer context allows more detailed instructions and longer conversations. ",-1),e("div",{class:"absolute bottom-full left-1/2 -translate-x-1/2 -mb-px border-4 border-transparent border-b-surface-overlay"},null,-1)])])):g("",!0)],32),e("div",{class:"relative rounded-lg bg-surface p-3",onMouseenter:i[3]||(i[3]=y=>v("quant")),onMouseleave:_},[e("div",Bt,[i[19]||(i[19]=C(" Quantization ",-1)),$(w(P),{class:"h-3 w-3"})]),e("div",qt,x(t.architecture.quantization),1),b.value==="quant"?(s(),a("div",Ht,[...i[20]||(i[20]=[C(" How model weights are compressed. Q4_K_M means 4-bit quantization with K-quant medium quality — smaller file size and faster inference with a small quality trade-off vs full precision (F16/F32). ",-1),e("div",{class:"absolute bottom-full left-1/2 -translate-x-1/2 -mb-px border-4 border-transparent border-b-surface-overlay"},null,-1)])])):g("",!0)],32)]),e("div",Et,[e("div",Vt,[e("h4",Wt,"Layer Structure ("+x(t.architecture.blockCount)+" blocks)",1),e("div",{class:"relative",onMouseenter:i[4]||(i[4]=y=>v("layers")),onMouseleave:_},[$(w(P),{class:"h-3 w-3 text-text-muted"}),b.value==="layers"?(s(),a("div",Kt,[...i[21]||(i[21]=[C(" Transformer models are built from repeated blocks. Each block contains attention, feed-forward, and normalization layers. More blocks = deeper model. ",-1),e("div",{class:"absolute bottom-full left-1/2 -translate-x-1/2 -mb-px border-4 border-transparent border-b-surface-overlay"},null,-1)])])):g("",!0)],32)]),e("div",Gt,[(s(!0),a(N,null,A(f.value,y=>(s(),a("div",{key:y.label,class:"relative flex items-center gap-2 rounded-lg border border-border-default px-3 py-2",onMouseenter:j=>v("block-"+y.label),onMouseleave:_},[e("div",{class:"h-3 w-3 rounded-sm",style:q({backgroundColor:y.color})},null,4),e("span",Jt,x(y.label),1),e("span",Qt,"×"+x(y.count),1),b.value==="block-"+y.label?(s(),a("div",Xt,[C(x(y.desc)+" ",1),i[22]||(i[22]=e("div",{class:"absolute bottom-full left-1/2 -translate-x-1/2 -mb-px border-4 border-transparent border-b-surface-overlay"},null,-1))])):g("",!0)],40,Ut))),128))])]),e("div",Yt,[e("div",{class:"relative rounded-lg bg-surface p-3",onMouseenter:i[5]||(i[5]=y=>v("aheads")),onMouseleave:_},[i[24]||(i[24]=e("span",{class:"text-text-muted"},"Attention Heads",-1)),$(w(P),{class:"inline ml-1 h-3 w-3 text-text-muted align-text-top"}),e("span",Zt,x(t.architecture.attentionHeadCount),1),b.value==="aheads"?(s(),a("div",es,[...i[23]||(i[23]=[C(" Number of parallel attention computations per layer. Each head learns to focus on different patterns (syntax, semantics, position, etc.). ",-1),e("div",{class:"absolute bottom-full left-1/2 -translate-x-1/2 -mb-px border-4 border-transparent border-b-surface-overlay"},null,-1)])])):g("",!0)],32),e("div",{class:"relative rounded-lg bg-surface p-3",onMouseenter:i[6]||(i[6]=y=>v("kvheads")),onMouseleave:_},[i[26]||(i[26]=e("span",{class:"text-text-muted"},"KV Heads",-1)),$(w(P),{class:"inline ml-1 h-3 w-3 text-text-muted align-text-top"}),e("span",ts,x(t.architecture.kvHeadCount),1),b.value==="kvheads"?(s(),a("div",ss,[...i[25]||(i[25]=[C(" Key-Value heads used in Grouped Query Attention (GQA). Fewer KV heads than attention heads means memory savings — multiple query heads share the same key/value projections. ",-1),e("div",{class:"absolute bottom-full left-1/2 -translate-x-1/2 -mb-px border-4 border-transparent border-b-surface-overlay"},null,-1)])])):g("",!0)],32),e("div",{class:"relative rounded-lg bg-surface p-3",onMouseenter:i[7]||(i[7]=y=>v("embdim")),onMouseleave:_},[i[28]||(i[28]=e("span",{class:"text-text-muted"},"Embedding Dim",-1)),$(w(P),{class:"inline ml-1 h-3 w-3 text-text-muted align-text-top"}),e("span",os,x(t.architecture.embeddingLength),1),b.value==="embdim"?(s(),a("div",ns,[...i[27]||(i[27]=[C(" Size of the vector representing each token inside the model. Larger dimensions can capture richer semantic information but increase memory and compute. ",-1),e("div",{class:"absolute bottom-full left-1/2 -translate-x-1/2 -mb-px border-4 border-transparent border-b-surface-overlay"},null,-1)])])):g("",!0)],32),e("div",{class:"relative rounded-lg bg-surface p-3",onMouseenter:i[8]||(i[8]=y=>v("ffndim")),onMouseleave:_},[i[30]||(i[30]=e("span",{class:"text-text-muted"},"FFN Dim",-1)),$(w(P),{class:"inline ml-1 h-3 w-3 text-text-muted align-text-top"}),e("span",rs,x(t.architecture.feedForwardLength),1),b.value==="ffndim"?(s(),a("div",as,[...i[29]||(i[29]=[C(` Width of the feed-forward network's hidden layer. Typically 2-4x the embedding dimension. This is where much of the model's "knowledge" is stored as learned patterns. `,-1),e("div",{class:"absolute bottom-full left-1/2 -translate-x-1/2 -mb-px border-4 border-transparent border-b-surface-overlay"},null,-1)])])):g("",!0)],32)]),u.value?(s(),a("div",ls,[e("button",{class:"flex w-full items-center justify-between p-4 text-left",onClick:i[9]||(i[9]=y=>p.value=!p.value)},[i[32]||(i[32]=e("h4",{class:"text-xs font-medium text-text-muted uppercase tracking-wide"},"Model Defaults",-1)),(s(),a("svg",{class:D(["h-4 w-4 text-text-muted transition-transform",p.value?"rotate-180":""]),viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},[...i[31]||(i[31]=[e("path",{d:"M6 9l6 6 6-6"},null,-1)])],2))]),p.value?(s(),a("div",is,[e("table",ds,[(s(!0),a(N,null,A(u.value,(y,j)=>(s(),a("tr",{key:j,class:"border-b border-border-default/50 last:border-0"},[e("td",us,x(j),1),e("td",cs,x(y),1)]))),128))])])):g("",!0)])):g("",!0),d.value?(s(),a("div",ms,[e("button",{class:"flex w-full items-center justify-between p-4 text-left",onClick:i[10]||(i[10]=y=>l.value=!l.value)},[i[34]||(i[34]=e("h4",{class:"text-xs font-medium text-text-muted uppercase tracking-wide"},"Chat Template",-1)),(s(),a("svg",{class:D(["h-4 w-4 text-text-muted transition-transform",l.value?"rotate-180":""]),viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},[...i[33]||(i[33]=[e("path",{d:"M6 9l6 6 6-6"},null,-1)])],2))]),l.value?(s(),a("div",xs,[e("pre",ps,x(d.value),1)])):g("",!0)])):g("",!0)]))}}),bs={class:"space-y-3"},vs={class:"flex items-center justify-between"},gs=["value"],ys={key:0,class:"overflow-auto rounded-lg border border-border-default bg-surface p-2"},hs=z({__name:"AttentionHeatmap",props:{patterns:{}},setup(t){const r=t,n=S(0),o=S(null),u=k(()=>r.patterns[n.value]??null);function d(){const p=o.value,l=u.value;if(!p||!l)return;const c=p.getContext("2d");if(!c)return;const m=l.matrix.length,f=Math.min(Math.floor(400/m),20),b=m*f;p.width=b,p.height=b;for(let v=0;v<m;v++)for(let _=0;_<m;_++){const M=l.matrix[v]?.[_]??0,i=Math.floor(M*255);c.fillStyle=`rgb(${Math.floor(56+M*100)}, ${Math.floor(100+i*.5)}, ${i})`,c.fillRect(_*f,v*f,f,f)}}return Q(d),E([u],d),(p,l)=>(s(),a("div",bs,[e("div",vs,[l[1]||(l[1]=e("div",{class:"flex items-center gap-2"},[e("h4",{class:"text-sm font-medium text-text-secondary"},"Attention Pattern"),e("span",{class:"rounded-full bg-warning/20 px-2 py-0.5 text-xs text-warning"},"Illustrative")],-1)),t.patterns.length>1?V((s(),a("select",{key:0,"onUpdate:modelValue":l[0]||(l[0]=c=>n.value=c),class:"rounded border border-border-default bg-surface px-2 py-1 text-xs text-text-primary"},[(s(!0),a(N,null,A(t.patterns,(c,m)=>(s(),a("option",{key:m,value:m}," Layer "+x(c.layerIndex)+" / Head "+x(c.headIndex),9,gs))),128))],512)),[[Ie,n.value,void 0,{number:!0}]]):g("",!0)]),u.value?(s(),a("div",ys,[e("canvas",{ref_key:"canvasRef",ref:o,class:"max-w-full"},null,512)])):g("",!0),l[2]||(l[2]=e("p",{class:"text-xs text-text-muted leading-relaxed"},[C(" This is a "),e("strong",{class:"text-warning"},"synthetic illustration"),C(" of how attention patterns work in transformer models — it shows causal masking (tokens can only attend to previous tokens) and positional decay (nearby tokens get more attention). Real attention weights are not available through the Ollama API, so this visualization demonstrates the concept rather than reflecting actual model behavior. ")],-1))]))}}),ks={class:"space-y-3"},_s={class:"h-48 rounded-lg border border-border-default bg-surface-raised p-4"},$s=z({__name:"LayerActivationChart",props:{activations:{}},setup(t){K.register(G,U,oe,J);const r=t,n=k(()=>({labels:r.activations.map(u=>u.layerName.replace(/^block_\d+_/,"")),datasets:[{label:"Norm",data:r.activations.map(u=>u.norm),backgroundColor:"#a855f7"}]})),o={responsive:!0,maintainAspectRatio:!1,plugins:{legend:{display:!1}},scales:{x:{display:!1},y:{ticks:{color:"#94a3b8",font:{size:10}},grid:{color:"rgba(71, 85, 105, 0.3)"}}}};return(u,d)=>(s(),a("div",ks,[d[0]||(d[0]=e("div",{class:"flex items-center gap-2"},[e("h4",{class:"text-sm font-medium text-text-secondary"},"Layer Activation Norms"),e("span",{class:"rounded-full bg-warning/20 px-2 py-0.5 text-xs text-warning"},"Simulated")],-1)),e("div",_s,[$(w(ne),{data:n.value,options:o},null,8,["data"])]),d[1]||(d[1]=e("p",{class:"text-xs text-text-muted leading-relaxed"},[C(" This is a "),e("strong",{class:"text-warning"},"simulated visualization"),C(" of activation norms across the model's layers. In a real model, these norms reveal how much each layer contributes to the output — unusually high norms can indicate exploding gradients or bottleneck layers, while low norms may suggest underutilized capacity. Actual activation data requires hooking into the inference engine, which the Ollama API does not expose. ")],-1))]))}}),ws={class:"space-y-6"},Cs={key:0},Ms={key:1},Ts={key:2},Ss={key:3,class:"rounded-lg border border-border-default bg-surface-raised p-8 text-center text-sm text-text-muted"},zs=z({__name:"IntrospectionPanel",props:{sessionId:{},modelName:{}},setup(t){const r=t,n=le(),o=Fe(),u=k(()=>n.getArchitecture(r.modelName)),d=k(()=>n.getAttentionPatterns(r.sessionId)),p=k(()=>n.getLayerActivations(r.sessionId));return Q(async()=>{u.value||await wt(r.modelName);const l=u.value;if(l){if(d.value.length===0){const m=o.getTokens(r.sessionId).slice(0,30).map(f=>f.text);if(m.length>0){const f=ht(m,l.attentionHeadCount,l.blockCount);n.setAttentionPatterns(r.sessionId,f)}}if(p.value.length===0){const c=kt(l);n.setLayerActivations(r.sessionId,c)}}}),(l,c)=>(s(),a("div",ws,[u.value?(s(),a("div",Cs,[c[0]||(c[0]=e("h3",{class:"mb-3 text-sm font-medium text-text-secondary"},"Model Architecture",-1)),$(fs,{architecture:u.value,"model-name":t.modelName},null,8,["architecture","model-name"])])):g("",!0),d.value.length>0?(s(),a("div",Ms,[$(hs,{patterns:d.value},null,8,["patterns"])])):g("",!0),p.value.length>0?(s(),a("div",Ts,[$($s,{activations:p.value},null,8,["activations"])])):g("",!0),u.value?g("",!0):(s(),a("div",Ss," Loading model introspection data... "))]))}}),Ns={class:"overflow-auto rounded-lg bg-surface p-3 text-xs text-text-secondary font-mono max-h-80"},W=z({__name:"JsonViewer",props:{data:{},maxDepth:{}},setup(t){const r=t,n=k(()=>{try{return JSON.stringify(r.data,null,2)}catch{return String(r.data)}});return(o,u)=>(s(),a("pre",Ns,x(n.value),1))}}),As={class:"rounded-lg border border-border-default bg-surface-raised"},Is={class:"flex items-center gap-3"},Ls={class:"text-sm font-medium text-text-primary"},Ps={class:"ml-2 text-xs text-text-muted"},js={class:"flex items-center gap-2"},Ds={key:0,class:"border-t border-border-default p-4 space-y-3"},Os={key:0},Fs={key:1},Rs={class:"rounded-lg bg-error/10 p-3 text-xs text-error"},Bs=z({__name:"ToolCallCard",props:{entry:{}},emits:["optimize"],setup(t,{emit:r}){const n=t,o=r,u=k(()=>n.entry.status==="completed"&&n.entry.result!=null&&typeof n.entry.result=="object"),d=S(!1);return(p,l)=>(s(),a("div",As,[e("button",{class:"flex w-full items-center justify-between px-4 py-3 text-left hover:bg-surface-overlay transition-colors",onClick:l[0]||(l[0]=c=>d.value=!d.value)},[e("div",Is,[l[2]||(l[2]=e("span",{class:"text-base"},"⚡",-1)),e("div",null,[e("span",Ls,x(t.entry.functionName),1),e("span",Ps,x(t.entry.durationMs!=null?w(R)(t.entry.durationMs):"pending"),1)])]),e("div",js,[$(ee,{status:t.entry.status},null,8,["status"]),e("span",{class:D(["text-text-muted transition-transform text-xs",{"rotate-180":d.value}])},"▾",2)])]),d.value?(s(),a("div",Ds,[e("div",null,[l[3]||(l[3]=e("div",{class:"text-xs font-medium text-text-muted uppercase tracking-wide mb-1"},"Arguments",-1)),$(W,{data:t.entry.arguments},null,8,["data"])]),t.entry.result!==void 0?(s(),a("div",Os,[l[4]||(l[4]=e("div",{class:"text-xs font-medium text-text-muted uppercase tracking-wide mb-1"},"Result",-1)),$(W,{data:t.entry.result},null,8,["data"])])):g("",!0),t.entry.error?(s(),a("div",Fs,[l[5]||(l[5]=e("div",{class:"text-xs font-medium text-error uppercase tracking-wide mb-1"},"Error",-1)),e("pre",Rs,x(t.entry.error),1)])):g("",!0),u.value?(s(),a("button",{key:2,class:"mt-1 rounded-md border border-border-default px-3 py-1.5 text-xs font-medium text-accent hover:bg-surface-overlay transition-colors",onClick:l[1]||(l[1]=ae(c=>o("optimize",t.entry),["stop"]))}," Optimize this Tool ")):g("",!0)])):g("",!0)]))}}),qs={class:"space-y-4"},Hs={class:"flex items-center gap-4 rounded-lg border border-border-default bg-surface-raised p-4"},Es={class:"text-sm text-text-secondary"},Vs={class:"font-semibold text-text-primary"},Ws={key:0,class:"text-sm text-text-secondary"},Ks={class:"text-text-primary"},Gs={key:0,class:"space-y-3"},Us={key:1,class:"rounded-lg border border-border-default bg-surface-raised p-8 text-center text-sm text-text-muted"},Js=z({__name:"ToolCallTimeline",props:{sessionId:{}},emits:["optimize"],setup(t,{emit:r}){const n=t,o=r,u=xe(),d=k(()=>u.getToolCalls(n.sessionId)),p=k(()=>d.value.reduce((l,c)=>l+(c.durationMs??0),0));return(l,c)=>(s(),a("div",qs,[e("div",Hs,[e("div",Es,[e("span",Vs,x(d.value.length),1),c[1]||(c[1]=C(" tool calls ",-1))]),p.value>0?(s(),a("div",Ws,[c[2]||(c[2]=C(" Total: ",-1)),e("span",Ks,x(w(R)(p.value)),1)])):g("",!0)]),d.value.length>0?(s(),a("div",Gs,[(s(!0),a(N,null,A(d.value,m=>(s(),L(Bs,{key:m.id,entry:m,onOptimize:c[0]||(c[0]=f=>o("optimize",f))},null,8,["entry"]))),128))])):(s(),a("div",Us,[...c[3]||(c[3]=[e("p",null,"No tool calls in this session.",-1),e("p",{class:"mt-1"},"Use chat mode with tool definitions to see tool call activity.",-1)])]))]))}});function Qs(t){const r=Re(),n=k(()=>r.getGraph(t.value)),o=S(800),u=S(400),d=k(()=>{const l=n.value?.nodes??[];if(l.length===0)return[];const c=180,m=60,f=60,b=u.value/2,v=l.length*(c+f);return o.value=Math.max(800,v+100),l.map((_,M)=>({..._,x:50+M*(c+f),y:b-m/2}))}),p=k(()=>{const l=n.value?.edges??[],c=new Map(d.value.map(m=>[m.id,m]));return l.map(m=>{const f=c.get(m.source),b=c.get(m.target);return!f||!b?null:{...m,x1:f.x+180,y1:f.y+30,x2:b.x,y2:b.y+30}}).filter(m=>m!==null)});return{graph:n,layoutNodes:d,layoutEdges:p,svgWidth:o,svgHeight:u}}const Xs=["transform"],Ys=["stroke"],Zs={x:"12",y:"24",class:"fill-text-primary text-xs font-medium","font-size":"12"},eo={x:"12",y:"44",class:"fill-text-secondary text-xs","font-size":"11"},to=z({__name:"AgentNode",props:{node:{},selected:{type:Boolean}},emits:["select"],setup(t){const r=t,n=k(()=>ge[r.node.type]??"#94a3b8"),o={start:"▶",llm_call:"◈",tool_call:"⚡",decision:"◇",output:"■",error:"✕"};return(u,d)=>(s(),a("g",{transform:`translate(${t.node.x}, ${t.node.y})`,class:"cursor-pointer",onClick:d[0]||(d[0]=p=>u.$emit("select",t.node.id))},[e("rect",{width:"180",height:"60",rx:"8",class:D(["fill-surface-raised stroke-2",{"stroke-[3]":t.selected}]),stroke:n.value},null,10,Ys),e("text",Zs,x(o[t.node.type]??"•")+" "+x(t.node.type),1),e("text",eo,x(t.node.label.slice(0,22))+x(t.node.label.length>22?"...":""),1)],8,Xs))}}),so={key:0,class:"rounded-lg border border-border-default bg-surface-raised p-4 space-y-3"},oo={class:"text-sm font-medium text-text-primary"},no={class:"grid grid-cols-2 gap-2 text-xs text-text-secondary"},ro={class:"text-text-primary"},ao={class:"text-text-primary"},lo={key:0},io=z({__name:"AgentStateDiff",props:{node:{}},setup(t){return(r,n)=>t.node?(s(),a("div",so,[e("h4",oo,x(t.node.label),1),e("div",no,[e("div",null,[n[0]||(n[0]=C("Type: ",-1)),e("span",ro,x(t.node.type),1)]),e("div",null,[n[1]||(n[1]=C("Step: ",-1)),e("span",ao,x(t.node.stepIndex),1)])]),Object.keys(t.node.state).length>0?(s(),a("div",lo,[n[2]||(n[2]=e("div",{class:"text-xs font-medium text-text-muted uppercase tracking-wide mb-1"},"State",-1)),$(W,{data:t.node.state},null,8,["data"])])):g("",!0)])):g("",!0)}}),uo={class:"space-y-4"},co={key:0,class:"flex gap-4"},mo={class:"flex-1 overflow-auto rounded-lg border border-border-default bg-surface"},xo=["width","height"],po=["x1","y1","x2","y2"],fo={class:"w-72 shrink-0"},bo={key:0,class:"rounded-lg border border-border-default bg-surface-raised p-4 text-center text-sm text-text-muted"},vo={key:1,class:"rounded-lg border border-border-default bg-surface-raised p-8 text-center text-sm text-text-muted"},go=z({__name:"AgentGraphView",props:{sessionId:{}},setup(t){const r=t,n=k(()=>r.sessionId),{layoutNodes:o,layoutEdges:u,svgWidth:d,svgHeight:p}=Qs(n),l=S(null),c=k(()=>l.value?o.value.find(m=>m.id===l.value)??null:null);return(m,f)=>(s(),a("div",uo,[w(o).length>0?(s(),a("div",co,[e("div",mo,[(s(),a("svg",{width:w(d),height:w(p),class:"min-w-full"},[(s(!0),a(N,null,A(w(u),b=>(s(),a("line",{key:b.id,x1:b.x1,y1:b.y1,x2:b.x2,y2:b.y2,class:"stroke-border-default","stroke-width":"2","marker-end":"url(#arrowhead)"},null,8,po))),128)),f[1]||(f[1]=e("defs",null,[e("marker",{id:"arrowhead",markerWidth:"10",markerHeight:"7",refX:"10",refY:"3.5",orient:"auto"},[e("polygon",{points:"0 0, 10 3.5, 0 7",class:"fill-border-default"})])],-1)),(s(!0),a(N,null,A(w(o),b=>(s(),L(to,{key:b.id,node:b,selected:l.value===b.id,onSelect:f[0]||(f[0]=v=>l.value=v)},null,8,["node","selected"]))),128))],8,xo))]),e("div",fo,[$(io,{node:c.value},null,8,["node"]),c.value?g("",!0):(s(),a("div",bo," Click a node to inspect its state. "))])])):(s(),a("div",vo,[...f[2]||(f[2]=[e("p",null,"No agent graph data for this session.",-1),e("p",{class:"mt-1"},"Agent graph nodes are created during generation.",-1)])]))]))}}),yo={class:"rounded-lg border border-border-default bg-surface-raised overflow-hidden"},ho={class:"flex items-center justify-between px-4 py-2 border-b border-border-default"},ko={class:"flex items-center gap-2"},_o={class:"text-sm font-medium text-text-primary"},$o={class:"rounded-full bg-surface-overlay px-2 py-0.5 text-xs text-text-muted"},wo={class:"flex items-center gap-3 text-xs text-text-secondary"},Co={class:"text-text-muted"},Mo={class:"h-1 bg-surface"},To={class:"px-4 py-3 text-xs text-text-secondary font-mono whitespace-pre-wrap max-h-40 overflow-auto"},So=z({__name:"PromptSection",props:{section:{},totalTokens:{}},setup(t){const n=F[t.section.type]??F.unknown;return(o,u)=>(s(),a("div",yo,[e("div",ho,[e("div",ko,[e("div",{class:"h-3 w-3 rounded-sm",style:q({backgroundColor:w(n)})},null,4),e("span",_o,x(t.section.label),1),e("span",$o,x(t.section.type),1)]),e("div",wo,[e("span",null,"~"+x(t.section.tokenCount)+" tokens",1),e("span",Co,x(t.section.percentage.toFixed(1))+"%",1)])]),e("div",Mo,[e("div",{class:"h-full transition-all",style:q({width:`${t.section.percentage}%`,backgroundColor:w(n)})},null,4)]),e("pre",To,x(t.section.content),1)]))}}),zo={class:"rounded-lg border border-border-default bg-surface-raised p-4"},No={class:"text-xs font-medium text-text-muted uppercase tracking-wide mb-3"},Ao={class:"flex h-6 overflow-hidden rounded-lg"},Io=["title"],Lo={class:"mt-3 flex flex-wrap gap-3 text-xs"},Po={class:"text-text-secondary"},jo={class:"text-text-muted"},Do=z({__name:"PromptTokenCount",props:{sections:{},totalTokens:{}},setup(t){return(r,n)=>(s(),a("div",zo,[e("h4",No," Token Distribution (~"+x(t.totalTokens)+" total) ",1),e("div",Ao,[(s(!0),a(N,null,A(t.sections,o=>(s(),a("div",{key:o.id,class:"transition-all",style:q({width:`${o.percentage}%`,backgroundColor:w(F)[o.type]??w(F).unknown,minWidth:o.percentage>0?"2px":"0"}),title:`${o.label}: ~${o.tokenCount} tokens (${o.percentage.toFixed(1)}%)`},null,12,Io))),128))]),e("div",Lo,[(s(!0),a(N,null,A(t.sections,o=>(s(),a("div",{key:o.id,class:"flex items-center gap-1.5"},[e("div",{class:"h-2.5 w-2.5 rounded-sm",style:q({backgroundColor:w(F)[o.type]??w(F).unknown})},null,4),e("span",Po,x(o.label),1),e("span",jo,"("+x(o.percentage.toFixed(0))+"%)",1)]))),128))])]))}}),Oo={key:0,class:"space-y-4"},Fo={class:"space-y-3"},Ro={key:0,class:"rounded-lg border border-border-default bg-surface-raised p-4"},Bo={class:"space-y-2"},qo={class:"flex items-center gap-2"},Ho={class:"rounded-full bg-surface-overlay px-2 py-0.5 text-xs text-text-muted"},Eo={class:"text-text-secondary truncate max-w-md"},Vo={class:"text-xs text-text-muted"},Wo={key:1,class:"rounded-lg border border-border-default bg-surface-raised p-8 text-center text-sm text-text-muted"},Ko=z({__name:"PromptInspector",props:{sessionId:{}},setup(t){const r=t,n=ye(),o=k(()=>n.getAnatomy(r.sessionId)),u=k(()=>n.getSections(r.sessionId));return(d,p)=>o.value?(s(),a("div",Oo,[$(Do,{sections:u.value,"total-tokens":o.value.totalTokenCount},null,8,["sections","total-tokens"]),e("div",Fo,[(s(!0),a(N,null,A(u.value,l=>(s(),L(So,{key:l.id,section:l,"total-tokens":o.value.totalTokenCount},null,8,["section","total-tokens"]))),128))]),o.value.messages&&o.value.messages.length>0?(s(),a("div",Ro,[p[0]||(p[0]=e("h4",{class:"text-xs font-medium text-text-muted uppercase tracking-wide mb-3"},"Message Breakdown",-1)),e("div",Bo,[(s(!0),a(N,null,A(o.value.messages,(l,c)=>(s(),a("div",{key:c,class:"flex items-center justify-between rounded-lg bg-surface px-3 py-2 text-sm"},[e("div",qo,[e("span",Ho,x(l.role),1),e("span",Eo,x(l.content.slice(0,80))+x(l.content.length>80?"...":""),1)]),e("span",Vo,"~"+x(l.tokenCount)+" tok",1)]))),128))])])):g("",!0)])):(s(),a("div",Wo," No prompt anatomy data available. "))}});function Go(t,r){if(r.length===0)return t;const n=qe(r,"__raw"),o=t.split(`
|
|
2
|
+
`);let u=-1;for(let v=o.length-1;v>=0;v--)if(/^\s*return\s+/.test(o[v]??"")){u=v;break}if(u===-1)return`${t}
|
|
3
|
+
|
|
4
|
+
// Optimized: return selected fields only
|
|
5
|
+
const __raw = args
|
|
6
|
+
${n}`;const d=o[u],l=d.match(/^(\s*)return\s+/)?.[1]??" ";let c=d.replace(/^\s*return\s+/,"").trim(),m=u;if(c.includes("{")&&!Z(c))for(let v=u+1;v<o.length&&(c+=`
|
|
7
|
+
`+o[v],m=v,!Z(c));v++);const f=[`${l}const __raw = ${c.trim()}`,`${l}${n}`].join(`
|
|
8
|
+
`);return[...o.slice(0,u),"",`${l}// Optimized: return selected fields only`,f,...o.slice(m+1)].join(`
|
|
9
|
+
`)}function Z(t){let r=0;for(const n of t)if(n==="{"&&r++,n==="}"&&r--,r<0)return!1;return r===0}const Uo={class:"relative flex h-full w-full max-w-2xl flex-col border-l border-border-default bg-bg-base shadow-xl"},Jo={class:"flex items-center justify-between border-b border-border-default px-5 py-4"},Qo={class:"text-base font-semibold text-text-primary"},Xo={key:0,class:"flex flex-1 flex-col items-center justify-center gap-4 p-8"},Yo={class:"text-sm text-text-secondary"},Zo={class:"font-mono text-accent"},en={class:"flex-1 overflow-y-auto"},tn={class:"grid grid-cols-3 gap-0 border-b border-border-default"},sn={class:"col-span-2 border-r border-border-default p-4"},on={class:"max-h-64 overflow-auto rounded-lg border border-border-default bg-surface-raised p-3"},nn={class:"p-4"},rn={class:"mb-2 text-xs font-medium uppercase tracking-wide text-text-muted"},an={key:0,class:"text-xs text-text-muted italic"},ln={key:1,class:"space-y-1"},dn=["title"],un=["onClick"],cn={class:"border-b border-border-default p-4"},mn={class:"mb-2 flex items-center justify-between"},xn=["value"],pn={class:"space-y-3 p-4"},fn={key:0,class:"rounded-lg bg-warning/10 p-3 text-xs text-warning"},bn={class:"flex items-center justify-end gap-3 border-t border-border-default px-5 py-4"},vn=["disabled"],gn=z({__name:"ResponseOptimizerDrawer",props:{entry:{}},emits:["close"],setup(t,{emit:r}){const n=t,o=r,u=je(),d=Be(),p=S(new Set),l=S(`${n.entry.functionName}_optimized`),c=S(""),m=S(""),f=S(!1),b=S(!1),v=S(null),_=k(()=>d.findByFunctionName(n.entry.functionName)),M=k(()=>_.value?.implementation.code??""),i=k(()=>Array.from(p.value));E(i,T=>{if(T.length>0){const h=T.map(I=>I.split(".").pop()??I).join(", ");c.value=`Optimized ${n.entry.functionName} returning only: ${h}`}else c.value=""}),E(i,T=>{f.value||(m.value=y(T))});function y(T){return T.length===0?M.value:M.value?Go(M.value,T):` // No original code found — filtering raw result
|
|
10
|
+
const fullResult = await args
|
|
11
|
+
return {
|
|
12
|
+
${Ee(T).map(H=>` ${H.returnKey}: args.${H.jsonPath}`).join(`,
|
|
13
|
+
`)}
|
|
14
|
+
}`}function j(T){const h=new Set(p.value);h.has(T)?h.delete(T):h.add(T),p.value=h}function ie(T){const h=new Set(p.value);h.delete(T),p.value=h}function de(T){m.value=T.target.value,f.value=!0}function ue(){m.value=y(i.value),f.value=!1}function ce(){const T=_.value,h=T?JSON.parse(JSON.stringify(T.definition)):{type:"function",function:{name:l.value,description:c.value,parameters:{type:"object",properties:{},required:[]}}};h.function.name=l.value,h.function.description=c.value;const I=d.addTool({definition:h,implementation:{mode:"code",blocks:[],code:m.value},category:T?.category??"custom",optimizedFrom:{originalToolName:n.entry.functionName,selectedPaths:i.value,sampleResponse:n.entry.result}});v.value=I,b.value=!0}function me(){v.value&&d.selectTool(v.value),u.push("/tools"),o("close")}function B(){o("close")}return(T,h)=>(s(),L(Le,{to:"body"},[e("div",{class:"fixed inset-0 z-50 flex justify-end",onClick:ae(B,["self"])},[e("div",{class:"absolute inset-0 bg-black/50",onClick:B}),e("div",Uo,[e("div",Jo,[e("h3",Qo," Optimize: "+x(t.entry.functionName),1),e("button",{class:"rounded p-1 text-text-muted hover:bg-surface-overlay hover:text-text-primary transition-colors",onClick:B},[$(w(Pe),{class:"h-5 w-5"})])]),b.value?(s(),a("div",Xo,[h[3]||(h[3]=e("div",{class:"text-4xl"},"✓",-1)),h[4]||(h[4]=e("p",{class:"text-lg font-medium text-text-primary"},"Tool created successfully",-1)),e("p",Yo,[e("span",Zo,x(l.value),1),h[2]||(h[2]=C(" has been added to your workshop. ",-1))]),e("div",{class:"mt-4 flex gap-3"},[e("button",{class:"rounded-lg border border-border-default px-4 py-2 text-sm text-text-secondary hover:bg-surface-overlay transition-colors",onClick:B}," Stay Here "),e("button",{class:"rounded-lg bg-accent px-4 py-2 text-sm font-medium text-white hover:bg-accent-hover transition-colors",onClick:me}," Go to Workshop ")])])):(s(),a(N,{key:1},[e("div",en,[e("div",tn,[e("div",sn,[h[5]||(h[5]=e("div",{class:"mb-2 text-xs font-medium uppercase tracking-wide text-text-muted"}," Response (click fields to select) ",-1)),e("div",on,[$(He,{label:"result",value:t.entry.result,path:"","selected-paths":p.value,onTogglePath:j},null,8,["value","selected-paths"])])]),e("div",nn,[e("div",rn," Selected ("+x(p.value.size)+") ",1),p.value.size===0?(s(),a("div",an," Click fields in the tree to select them ")):(s(),a("div",ln,[(s(!0),a(N,null,A(i.value,I=>(s(),a("div",{key:I,class:"flex items-center justify-between rounded px-2 py-1 text-xs font-mono bg-surface-raised"},[e("span",{class:"truncate text-text-secondary",title:I},x(I),9,dn),e("button",{class:"ml-2 flex-shrink-0 text-text-muted hover:text-error transition-colors",onClick:H=>ie(I)}," × ",8,un)]))),128))]))])]),e("div",cn,[e("div",mn,[h[6]||(h[6]=e("span",{class:"text-xs font-medium uppercase tracking-wide text-text-muted"}," Code (editable) ",-1)),f.value?(s(),a("button",{key:0,class:"rounded px-2 py-0.5 text-xs text-accent hover:bg-surface-overlay transition-colors",onClick:ue}," Regenerate ")):g("",!0)]),e("textarea",{value:m.value,onInput:de,class:"w-full rounded-lg border border-border-default bg-surface-raised p-3 font-mono text-xs text-text-primary placeholder-text-muted focus:border-accent focus:outline-none resize-y",rows:"10",spellcheck:"false",placeholder:"Select fields above to generate code..."},null,40,xn)]),e("div",pn,[e("div",null,[h[7]||(h[7]=e("label",{class:"mb-1 block text-xs font-medium text-text-muted"},"Tool Name",-1)),V(e("input",{"onUpdate:modelValue":h[0]||(h[0]=I=>l.value=I),class:"w-full rounded-lg border border-border-default bg-surface-raised px-3 py-2 text-sm text-text-primary placeholder-text-muted focus:border-accent focus:outline-none"},null,512),[[Y,l.value]])]),e("div",null,[h[8]||(h[8]=e("label",{class:"mb-1 block text-xs font-medium text-text-muted"},"Description",-1)),V(e("input",{"onUpdate:modelValue":h[1]||(h[1]=I=>c.value=I),class:"w-full rounded-lg border border-border-default bg-surface-raised px-3 py-2 text-sm text-text-primary placeholder-text-muted focus:border-accent focus:outline-none",placeholder:"What does this optimized tool return?"},null,512),[[Y,c.value]])]),_.value?g("",!0):(s(),a("div",fn,' Original tool "'+x(t.entry.functionName)+'" not found in workshop. The optimized tool will be created with a blank parameter schema. ',1))])]),e("div",bn,[e("button",{class:"rounded-lg border border-border-default px-4 py-2 text-sm text-text-secondary hover:bg-surface-overlay transition-colors",onClick:B}," Cancel "),e("button",{class:"rounded-lg bg-accent px-4 py-2 text-sm font-medium text-white hover:bg-accent-hover transition-colors disabled:opacity-50 disabled:cursor-not-allowed",disabled:p.value.size===0||!l.value.trim(),onClick:ce}," Create Optimized Tool ",8,vn)])],64))])])]))}}),yn={key:0,class:"space-y-4"},hn={class:"flex items-center justify-between"},kn={class:"flex items-center gap-3"},_n={class:"text-lg font-semibold"},$n={class:"text-xs text-text-muted"},wn={class:"mt-4"},Cn={key:0,class:"space-y-4"},Mn={key:1,class:"flex items-center justify-center py-20 text-text-muted"},Rn=z({__name:"SessionPage",props:{id:{}},setup(t){const r=t,n=pe(),o=fe(),{t:u}=De(),d=S("stream"),p=k(()=>[{key:"stream",label:u("session.tabs.stream")},{key:"reasoning",label:u("session.tabs.reasoning")},{key:"introspection",label:u("session.tabs.introspection")},{key:"tools",label:u("session.tabs.tools")},{key:"agent",label:u("session.tabs.agent")},{key:"prompt",label:u("session.tabs.prompt")}]),l=k(()=>n.sessionById(r.id)??null),c=k(()=>o.getMetrics(r.id)),m=S(null);return Q(()=>{n.setActiveSession(r.id)}),(f,b)=>(s(),a(N,null,[l.value?(s(),a("div",yn,[e("div",hn,[e("div",kn,[e("h2",_n,x(l.value.model),1),$(ee,{status:l.value.status},null,8,["status"])]),e("div",$n,x(f.$t("session.sessionId",{id:l.value.id.slice(0,8)})),1)]),$(be,{tabs:p.value,"active-tab":d.value,"onUpdate:activeTab":b[0]||(b[0]=v=>d.value=v)},null,8,["tabs","active-tab"]),e("div",wn,[d.value==="stream"?(s(),a("div",Cn,[$(he,{"session-id":t.id},null,8,["session-id"]),$(st,{metrics:c.value},null,8,["metrics"])])):d.value==="reasoning"?(s(),L(gt,{key:1,"session-id":t.id},null,8,["session-id"])):d.value==="introspection"?(s(),L(zs,{key:2,"session-id":t.id,"model-name":l.value.model},null,8,["session-id","model-name"])):d.value==="tools"?(s(),L(Js,{key:3,"session-id":t.id,onOptimize:b[1]||(b[1]=v=>m.value=v)},null,8,["session-id"])):d.value==="agent"?(s(),L(go,{key:4,"session-id":t.id},null,8,["session-id"])):d.value==="prompt"?(s(),L(Ko,{key:5,"session-id":t.id},null,8,["session-id"])):g("",!0)])])):(s(),a("div",Mn,x(f.$t("session.notFound")),1)),m.value?(s(),L(gn,{key:2,entry:m.value,onClose:b[2]||(b[2]=v=>m.value=null)},null,8,["entry"])):g("",!0)],64))}});export{Rn as default};
|
|
@@ -0,0 +1 @@
|
|
|
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-CgqXFXWk.js";import{_ as oe}from"./TabBar.vue_vue_type_script_setup_true_lang-DEYUQ8oI.js";import{b as ne}from"./format-BqVZ9rwM.js";import{_ as le}from"./ModelCapabilityIcons.vue_vue_type_script_setup_true_lang-Cu2p2PDw.js";import{T as re}from"./trash-2-BLyRKRSt.js";import{u as ie}from"./google-auth-store-DZ-3XsJA.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 ml-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:"ml-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-r border-border-default/30"},Ae={class:"flex-[20] text-center text-[9px] text-text-muted border-r border-border-default/30"},Te={class:"flex-[25] text-center text-[9px] text-text-muted border-r 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 ml-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 left-0 text-[10px] text-text-muted">0</span><span class="absolute text-[10px] text-text-muted" style="left:15%;">0.3</span><span class="absolute text-[10px] text-accent font-medium" style="left:35%;">0.7</span><span class="absolute text-[10px] text-text-muted" style="left:50%;">1.0</span><span class="absolute text-[10px] text-text-muted" style="left:75%;">1.5</span><span class="absolute right-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:"ml-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 ml-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};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{d as v,r as y,a as f,b,e as l,f as u,t as c,i as g,g as h,j as d,h as M}from"./index-CgqXFXWk.js";import{a as k}from"./agent-store-DHWdued4.js";const V=v("prompt",()=>{const e=y(new Map);function n(a){return e.value.get(a)??null}function t(a){return e.value.get(a)?.sections??[]}function s(a,o){e.value.set(a,o)}return{anatomyBySession:e,getAnatomy:n,getSections:t,setAnatomy:s}});function x(e){const n=Math.max(0,Math.min(1,e));if(n>=.7){const t=(n-.7)/.3;return`rgb(${Math.round(74*(1-t))}, 222, 128)`}else if(n>=.4){const t=(n-.4)/.3,s=Math.round(163+59*t);return`rgb(${Math.round(251-177*t)}, ${s}, ${Math.round(36+92*t)})`}else{const t=n/.4;return`rgb(248, ${Math.round(113*t)}, ${Math.round(113*t)})`}}function j(e,n){if(n<=0)return x(.5);const t=e/n,s=Math.max(0,Math.min(1,1-(t-.5)/2));return x(s)}const z={system:"#818cf8",user:"#a855f7",context:"#a78bfa",tools:"#fb923c",memory:"#4ade80",examples:"#fbbf24",instructions:"#f472b6",unknown:"#94a3b8"},D={start:"#4ade80",llm_call:"#a855f7",tool_call:"#fb923c",decision:"#a78bfa",output:"#4ade80",error:"#f87171"};function E(e){const n=k(),t=f(()=>n.getTokens(e.value)),s=f(()=>{const r=t.value;if(r.length===0)return{min:0,max:1,median:.5};const i=r.map(m=>m.confidence).sort((m,p)=>m-p);return{min:i[0],max:i[i.length-1],median:i[Math.floor(i.length/2)]}});function a(r){return x(r)}function o(r){return r>=.7?"high":r>=.4?"medium":"low"}return{tokens:t,confidenceRange:s,getColor:a,getConfidenceLabel:o}}const C={class:"rounded-lg border border-border-default bg-surface-raised p-4"},w={class:"text-xs font-medium text-text-muted uppercase tracking-wide"},_={class:"mt-1 flex items-baseline gap-1"},$={class:"text-2xl font-bold text-text-primary"},S={key:0,class:"text-sm text-text-secondary"},F=b({__name:"MetricCard",props:{label:{},value:{},unit:{},trend:{}},setup(e){return(n,t)=>(d(),l("div",C,[u("div",w,c(e.label),1),u("div",_,[u("span",$,c(e.value),1),e.unit?(d(),l("span",S,c(e.unit),1)):g("",!0)]),e.trend!==void 0?(d(),l("div",{key:0,class:h(["mt-1 text-xs",e.trend>=0?"text-success":"text-error"])},c(e.trend>=0?"↑":"↓")+" "+c(Math.abs(e.trend).toFixed(1))+"% ",3)):g("",!0)]))}}),T=["title"],B={key:0,class:"relative mr-1.5 flex h-2 w-2"},L=b({__name:"StatusBadge",props:{status:{},detail:{}},setup(e){const n=e,t=f(()=>["streaming","executing","running"].includes(n.status)),s=f(()=>({idle:"bg-surface-overlay text-text-muted",streaming:"bg-accent/20 text-accent",completed:"bg-success/20 text-success",error:"bg-error/20 text-error",cancelled:"bg-warning/20 text-warning",pending:"bg-surface-overlay text-text-muted",executing:"bg-accent/20 text-accent",failed:"bg-error/20 text-error",running:"bg-accent/20 text-accent",partial:"bg-warning/20 text-warning"})[n.status]??"bg-surface-overlay text-text-muted");return(a,o)=>(d(),l("span",{class:h(["relative inline-flex items-center rounded-full px-2.5 py-0.5 text-xs font-medium",s.value]),title:e.detail},[t.value?(d(),l("span",B,[...o[0]||(o[0]=[u("span",{class:"absolute inline-flex h-full w-full rounded-full bg-current opacity-75",style:{animation:"ripple 1.5s ease-out infinite"}},null,-1),u("span",{class:"relative inline-flex h-2 w-2 rounded-full bg-current"},null,-1)])])):g("",!0),M(" "+c(e.status),1)],10,T))}});export{L as _,E as a,F as b,x as c,j as l,D as n,z as s,V as u};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{b as u}from"./format-BqVZ9rwM.js";import{b as x,e as s,f as n,t,h as v,u as i,i as m,F as b,k,l as f,g as h,a as d,j as l}from"./index-CgqXFXWk.js";const w={class:"space-y-1.5"},B={key:0,class:"flex items-center justify-between text-xs"},p={class:"text-text-secondary"},C={class:"text-text-muted"},S={class:"ml-1"},$={key:0,class:"flex h-full"},j=["title"],M={key:1,class:"flex items-center justify-between text-[10px] text-text-muted"},F=x({__name:"StorageGauge",props:{used:{},total:{},label:{},animating:{type:Boolean,default:!1},segments:{},compact:{type:Boolean,default:!1}},setup(e){const a=e,o=d(()=>a.total<=0?0:Math.min(Math.round(a.used/a.total*100),100)),y=d(()=>o.value>85?"bg-error":o.value>60?"bg-warning":"bg-success"),g=d(()=>!a.segments||a.total<=0?[]:a.segments.map(c=>({...c,width:Math.max(c.bytes/a.total*100,.5)})));return(c,N)=>(l(),s("div",w,[e.compact?m("",!0):(l(),s("div",B,[n("span",p,t(e.label??"Storage"),1),n("span",C,[v(t(i(u)(e.used))+" / "+t(i(u)(e.total))+" ",1),n("span",S,"("+t(o.value)+"%)",1)])])),n("div",{class:h(["h-2 rounded-full bg-surface-overlay overflow-hidden",{"animate-storage-pulse":e.animating}])},[e.segments&&e.segments.length>0?(l(),s("div",$,[(l(!0),s(b,null,k(g.value,r=>(l(),s("div",{key:r.name,class:"h-full transition-all duration-500 first:rounded-l-full last:rounded-r-full",style:f({width:`${r.width}%`,backgroundColor:r.color}),title:`${r.name}: ${i(u)(r.bytes)}`},null,12,j))),128))])):(l(),s("div",{key:1,class:h(["h-full rounded-full transition-all duration-500",y.value]),style:f({width:`${o.value}%`})},null,6))],2),e.compact?(l(),s("div",M,[n("span",null,t(e.label),1),n("span",null,t(i(u)(e.used))+" / "+t(i(u)(e.total))+" ("+t(o.value)+"%)",1)])):m("",!0)]))}});export{F as _};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/index-CgqXFXWk.js","assets/index-DL68effo.css"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{c as U,b as A,e as r,f as t,t as e,u as n,i as u,F as _,k as v,l as D,a as $,j as o,A as N,B as G,P as H,p as Q,h as p,g as k,q as V,r as B,o as P,_ as M}from"./index-CgqXFXWk.js";import{u as J}from"./metrics-store-eda0zEsH.js";import{b as m}from"./format-BqVZ9rwM.js";import{u as K}from"./storage-store-B9VvK961.js";import{_ as W}from"./StorageGauge.vue_vue_type_style_index_0_lang-DJFKaJRi.js";const X=U("loader-circle",[["path",{d:"M21 12a9 9 0 1 1-6.219-8.56",key:"13zald"}]]);async function Y(){try{const x=await fetch("/__system-info");return x.ok?await x.json():null}catch{return null}}const Z={class:"rounded-lg border border-border-default bg-surface p-3 space-y-2.5"},tt={class:"flex items-center justify-between"},et={class:"flex items-center gap-2"},st={class:"text-sm"},at={class:"text-xs font-medium text-text-primary"},ot={class:"flex items-center gap-2"},rt={class:"text-[10px] font-medium text-text-secondary"},lt=["title"],nt={key:0,class:"h-1.5 rounded-full bg-surface-overlay overflow-hidden"},dt={class:"flex h-full"},it=["title"],ct={key:1,class:"h-1.5 rounded-full bg-surface-overlay"},ut={class:"flex items-center justify-between text-[10px] text-text-muted"},mt={key:2,class:"space-y-1"},xt={class:"flex-1 text-text-muted"},pt={class:"text-text-muted"},yt={class:"text-text-secondary w-14 text-right"},_t={key:3,class:"text-[10px] text-text-muted italic"},ht=A({__name:"StorageBreakdownCard",props:{database:{}},emits:["clear"],setup(x,{emit:S}){const g=x,c=S,h=["#8b5cf6","#06b6d4","#f59e0b","#10b981","#f43f5e"],E=$(()=>g.database.stores.filter(y=>y.bytes>0).map((y,f)=>({name:y.name,bytes:y.bytes,color:h[f%h.length]})));return(y,f)=>(o(),r("div",Z,[t("div",tt,[t("div",et,[t("span",st,e(x.database.icon),1),t("span",at,e(x.database.label),1)]),t("div",ot,[t("span",rt,e(n(m)(x.database.totalBytes)),1),x.database.totalBytes>0?(o(),r("button",{key:0,class:"rounded px-1.5 py-0.5 text-[9px] text-text-muted hover:text-error hover:bg-error/10 transition-colors",title:y.$t("system.browserStorage.clearAll"),onClick:f[0]||(f[0]=i=>c("clear",x.database.id))},e(y.$t("common.actions.clear")),9,lt)):u("",!0)])]),x.database.totalBytes>0?(o(),r("div",nt,[t("div",dt,[(o(!0),r(_,null,v(E.value,i=>(o(),r("div",{key:i.name,class:"h-full transition-all duration-500 first:rounded-l-full last:rounded-r-full",style:D({width:`${i.bytes/x.database.totalBytes*100}%`,backgroundColor:i.color}),title:`${i.name}: ${n(m)(i.bytes)}`},null,12,it))),128))])])):(o(),r("div",ct)),t("div",ut,[t("span",null,e(x.database.recordCount.toLocaleString())+" records",1),t("span",null,e(x.database.type==="indexeddb"?"IndexedDB":"External"),1)]),x.database.stores.some(i=>i.count>0)?(o(),r("div",mt,[(o(!0),r(_,null,v(x.database.stores.filter(i=>i.count>0),(i,d)=>(o(),r("div",{key:i.name,class:"flex items-center gap-2 text-[10px]"},[t("span",{class:"h-2 w-2 shrink-0 rounded-full",style:D({backgroundColor:h[d%h.length]})},null,4),t("span",xt,e(i.name),1),t("span",pt,e(i.count),1),t("span",yt,e(n(m)(i.bytes)),1)]))),128))])):(o(),r("p",_t,e(y.$t("system.browserStorage.empty")),1))]))}}),ft={class:"max-w-4xl space-y-6"},gt={class:"flex items-center justify-between"},vt={class:"text-lg font-semibold text-text-primary"},bt={class:"text-xs text-text-muted mt-0.5"},$t={key:0,class:"flex flex-col items-center justify-center py-16 gap-4"},wt={class:"text-sm text-text-secondary"},Bt={class:"text-[10px] text-text-muted"},kt={key:1,class:"rounded-lg border border-border-default bg-surface-raised p-4 text-xs text-text-muted"},Mt={class:"grid grid-cols-1 md:grid-cols-2 gap-4"},St={class:"rounded-lg border border-border-default bg-surface-raised p-4 space-y-3"},zt={class:"text-sm font-medium text-text-primary flex items-center gap-2"},Ct={class:"grid grid-cols-[auto_1fr] gap-y-2 gap-x-4 text-xs"},Dt={class:"text-text-muted"},Et={class:"text-text-primary"},It={class:"text-text-muted"},Lt={class:"text-text-primary"},Rt={class:"text-text-muted"},Tt={class:"text-text-primary"},Vt={class:"text-text-muted"},Pt={class:"text-text-primary"},At={class:"rounded-lg border border-border-default bg-surface-raised p-4 space-y-3"},Ot={class:"text-sm font-medium text-text-primary flex items-center gap-2"},jt={class:"grid grid-cols-[auto_1fr] gap-y-2 gap-x-4 text-xs"},Ft={class:"text-text-muted"},qt={class:"text-text-primary"},Ut={class:"text-text-muted"},Nt={class:"text-text-primary"},Gt={class:"text-text-muted"},Ht={class:"text-text-primary"},Qt={class:"text-text-muted"},Jt={class:"text-text-primary"},Kt={class:"grid grid-cols-1 md:grid-cols-2 gap-4"},Wt={class:"rounded-lg border border-border-default bg-surface-raised p-4 space-y-3"},Xt={class:"text-sm font-medium text-text-primary flex items-center gap-2"},Yt={class:"grid grid-cols-[auto_1fr] gap-y-2 gap-x-4 text-xs"},Zt={class:"text-text-muted"},te={class:"text-text-primary"},ee={class:"text-text-muted"},se={class:"text-text-primary"},ae={class:"text-text-muted"},oe={class:"text-text-primary"},re={class:"text-text-muted"},le={class:"text-text-primary"},ne={class:"rounded-lg border border-border-default bg-surface-raised p-4 space-y-3"},de={class:"text-sm font-medium text-text-primary flex items-center gap-2"},ie={class:"grid grid-cols-[auto_1fr] gap-y-2 gap-x-4 text-xs"},ce={class:"text-text-muted"},ue={class:"text-text-primary"},me={class:"text-text-muted"},xe={class:"text-text-primary"},pe={class:"text-text-muted"},ye={class:"text-text-primary"},_e={class:"h-2 rounded-full bg-surface-overlay overflow-hidden"},he={class:"rounded-lg border border-border-default bg-surface-raised p-4 space-y-3"},fe={class:"text-sm font-medium text-text-primary flex items-center gap-2"},ge={class:"text-text-muted"},ve={class:"text-text-primary"},be={class:"text-text-muted"},$e={class:"text-text-primary"},we={class:"text-text-muted"},Be={class:"text-text-primary"},ke={key:1,class:"col-span-2 border-b border-border-default/50 my-1"},Me={class:"rounded-lg border border-border-default bg-surface-raised p-4 space-y-3"},Se={class:"text-sm font-medium text-text-primary flex items-center gap-2"},ze={class:"grid grid-cols-[auto_1fr] gap-y-2 gap-x-4 text-xs"},Ce={class:"text-text-muted"},De={class:"text-text-primary"},Ee={class:"text-text-muted"},Ie={class:"text-text-primary"},Le={class:"text-text-muted"},Re={class:"text-text-primary"},Te={class:"text-text-muted"},Ve={class:"text-text-primary"},Pe={class:"h-2 rounded-full bg-surface-overlay overflow-hidden"},Ae={key:0,class:"border-b border-border-default/50"},Oe={class:"rounded-lg border border-border-default bg-surface-raised p-4 space-y-4"},je={class:"flex items-center justify-between"},Fe={class:"text-sm font-medium text-text-primary flex items-center gap-2"},qe={class:"flex items-center gap-2"},Ue={key:2,class:"text-[10px] text-text-muted"},Ne={key:1,class:"grid grid-cols-1 md:grid-cols-2 gap-3"},Ge={key:2,class:"text-[9px] text-text-muted"},He={class:"grid grid-cols-1 md:grid-cols-2 gap-4"},Qe={class:"rounded-lg border border-border-default bg-surface-raised p-4 space-y-3"},Je={class:"text-sm font-medium text-text-primary flex items-center gap-2"},Ke={class:"grid grid-cols-[auto_1fr] gap-y-2 gap-x-4 text-xs"},We={class:"text-text-muted"},Xe={class:"flex items-center gap-1.5"},Ye={class:"text-text-muted"},Ze={class:"text-text-primary"},ts={class:"text-text-muted"},es={class:"text-text-primary"},ss={class:"text-text-muted"},as={class:"text-text-primary"},os={class:"text-text-muted"},rs={class:"text-text-primary"},ls={class:"rounded-lg border border-border-default bg-surface-raised p-4 space-y-3"},ns={class:"text-sm font-medium text-text-primary flex items-center gap-2"},ds={class:"text-[10px] text-text-muted font-normal"},is={key:0,class:"text-xs text-text-muted py-2"},cs={key:1,class:"grid grid-cols-[auto_1fr] gap-y-2 gap-x-4 text-xs"},us={class:"text-text-muted"},ms={class:"text-text-primary font-medium"},xs={class:"text-text-muted"},ps={class:"text-accent font-medium"},ys={class:"text-text-muted"},_s={class:"text-text-primary font-medium"},hs={class:"text-text-muted"},fs={class:"text-text-primary font-medium"},gs={key:2,class:"flex flex-wrap gap-1.5 pt-1"},vs={class:"text-[10px] text-text-muted mr-1"},bs={class:"rounded-lg border border-border-default bg-surface-raised p-4 space-y-3"},$s={class:"text-sm font-medium text-text-primary flex items-center gap-2"},ws={key:0,class:"text-xs text-text-muted py-2"},Bs={key:1,class:"space-y-2"},ks={class:"flex gap-4 text-xs text-text-secondary"},Ms={key:0},Ss={class:"text-accent font-medium"},zs={key:1},Cs={class:"text-text-primary font-medium"},Ds={class:"text-text-primary font-medium"},Es={class:"flex-1 min-w-0"},Is={class:"text-sm font-medium text-text-primary truncate"},Ls={class:"text-xs text-text-muted"},Rs={class:"text-right text-xs space-y-0.5 shrink-0"},Ts={key:0},Vs={class:"text-text-muted"},Ps={class:"ml-1.5 text-accent font-medium"},As={key:1},Os={class:"text-text-muted"},js={class:"ml-1.5 text-text-primary font-medium"},Fs={class:"text-text-muted"},qs={class:"ml-1.5 text-text-secondary"},Us=["title"],Ns={class:"rounded-lg border border-border-default bg-surface-raised p-4 space-y-3"},Gs={class:"text-sm font-medium text-text-primary flex items-center gap-2"},Hs={key:0,class:"text-xs text-text-muted py-2"},Qs={key:1,class:"overflow-x-auto"},Js={class:"w-full text-xs"},Ks={class:"border-b border-border-default text-text-muted"},Ws={class:"text-left py-1.5 pr-4 font-medium"},Xs={class:"text-left py-1.5 pr-4 font-medium"},Ys={class:"text-left py-1.5 pr-4 font-medium"},Zs={class:"text-left py-1.5 pr-4 font-medium"},ta={class:"text-right py-1.5 font-medium"},ea={class:"py-1.5 pr-4 text-text-primary font-medium"},sa={class:"py-1.5 pr-4 text-text-secondary"},aa={class:"py-1.5 pr-4 text-text-secondary"},oa={class:"py-1.5 pr-4 text-text-secondary"},ra={class:"py-1.5 text-right text-text-secondary"},ua=A({__name:"SystemPage",setup(x){const S=J(),g=N(),c=K(),h=B(null);async function E(s){if(h.value===s){const l={rag:()=>M(()=>import("./vector-db-ChAzHl5A.js"),[]).then(a=>a.vectorDB.clear()),conversations:()=>M(()=>import("./index-CgqXFXWk.js").then(a=>a.aq),__vite__mapDeps([0,1])).then(a=>a.conversationDB.clear()),benchmarks:()=>M(()=>import("./benchmark-db-D8D5Wf9h.js"),[]).then(a=>a.benchmarkDB.clear()),"message-memory":()=>M(()=>import("./message-memory-db-C3Ifhs2B.js"),[]).then(a=>a.messageMemoryDB.clear()),"canvas-ai":()=>M(()=>import("./canvas-ai-db-BolM-_G7.js"),[]).then(a=>a.canvasAiDB.clear())};try{await l[s]?.(),await c.refresh()}catch(a){console.error(`Failed to clear database ${s}:`,a)}h.value=null}else h.value=s,setTimeout(()=>{h.value===s&&(h.value=null)},3e3)}const y=B(null),f=B(!1),i=B([]),d=B(null),z=B(!0),O=$(()=>g.models.reduce((s,l)=>s+l.size,0)),I=$(()=>i.value.reduce((s,l)=>s+l.size_vram,0)),L=$(()=>i.value.reduce((s,l)=>s+(l.size-l.size_vram),0)),b=$(()=>S.aggregate),j=$(()=>{if(!d.value)return"";const s=d.value.cpu.maxClockMhz;return s>=1e3?`${(s/1e3).toFixed(2)} GHz`:`${s} MHz`}),C=$(()=>{if(!d.value)return 0;const{totalBytes:s,freeBytes:l}=d.value.memory;return s>0?Math.round((s-l)/s*100):0});let R=null;async function F(){try{y.value=await P.version(),f.value=!0}catch{f.value=!1,y.value=null}try{i.value=await P.ps()}catch{i.value=[]}}async function T(){await Promise.all([F(),Y().then(s=>{s&&(d.value=s)}),c.refreshIfStale(3e4)])}function q(s){const l=new Date(s).getTime()-Date.now();if(l<=0)return"expiring...";const a=Math.floor(l/6e4);return a<1?"< 1 min":a<60?`${a} min`:`${Math.floor(a/60)}h ${a%60}m`}return G(async()=>{z.value=!0,await T(),z.value=!1,g.models.length===0&&await g.fetchModels(),S.recalculateAggregate(),R=setInterval(T,5e3)}),H(()=>{R&&clearInterval(R)}),(s,l)=>(o(),r("div",ft,[t("div",gt,[t("div",null,[t("h2",vt,e(s.$t("system.title")),1),t("p",bt,e(s.$t("system.subtitle")),1)]),t("button",{class:"rounded-lg bg-surface-overlay px-3 py-1.5 text-xs text-text-secondary hover:bg-border-default transition-colors",onClick:T},e(s.$t("system.refresh")),1)]),z.value&&!d.value?(o(),r("div",$t,[Q(n(X),{class:"h-10 w-10 animate-spin text-accent"}),t("p",wt,e(s.$t("system.detecting")),1),t("p",Bt,e(s.$t("system.detectingDetail")),1)])):u("",!0),!z.value&&!d.value?(o(),r("div",kt,e(s.$t("system.unavailable")),1)):u("",!0),d.value?(o(),r(_,{key:2},[t("div",Mt,[t("div",St,[t("h3",zt,[l[1]||(l[1]=t("span",{class:"text-base"},"🖥",-1)),p(" "+e(s.$t("system.os.title")),1)]),t("div",Ct,[t("span",Dt,e(s.$t("system.os.os")),1),t("span",Et,e(d.value.os.name),1),t("span",It,e(s.$t("system.os.version")),1),t("span",Lt,e(d.value.os.version),1),t("span",Rt,e(s.$t("system.os.build")),1),t("span",Tt,e(d.value.os.build||"—"),1),t("span",Vt,e(s.$t("system.os.architecture")),1),t("span",Pt,e(d.value.os.arch),1)])]),t("div",At,[t("h3",Ot,[l[2]||(l[2]=t("span",{class:"text-base"},"💻",-1)),p(" "+e(s.$t("system.device.title")),1)]),t("div",jt,[t("span",Ft,e(s.$t("system.device.name")),1),t("span",qt,e(d.value.device.name),1),t("span",Ut,e(s.$t("system.device.manufacturer")),1),t("span",Nt,e(d.value.device.manufacturer||"—"),1),t("span",Gt,e(s.$t("system.device.model")),1),t("span",Ht,e(d.value.device.model||"—"),1),d.value.device.family?(o(),r(_,{key:0},[t("span",Qt,e(s.$t("system.device.family")),1),t("span",Jt,e(d.value.device.family),1)],64)):u("",!0)])])]),t("div",Kt,[t("div",Wt,[t("h3",Xt,[l[3]||(l[3]=t("span",{class:"text-base"},"⚙",-1)),p(" "+e(s.$t("system.cpu.title")),1)]),t("div",Yt,[t("span",Zt,e(s.$t("system.cpu.cpu")),1),t("span",te,e(d.value.cpu.name),1),t("span",ee,e(s.$t("system.cpu.physicalCores")),1),t("span",se,e(d.value.cpu.cores),1),t("span",ae,e(s.$t("system.cpu.logicalProcessors")),1),t("span",oe,e(d.value.cpu.logicalProcessors),1),t("span",re,e(s.$t("system.cpu.maxClock")),1),t("span",le,e(j.value),1)])]),t("div",ne,[t("h3",de,[l[4]||(l[4]=t("span",{class:"text-base"},"🧠",-1)),p(" "+e(s.$t("system.memory.title")),1)]),t("div",ie,[t("span",ce,e(s.$t("system.memory.totalRam")),1),t("span",ue,e(n(m)(d.value.memory.totalBytes)),1),t("span",me,e(s.$t("system.memory.available")),1),t("span",xe,e(n(m)(d.value.memory.freeBytes)),1),t("span",pe,e(s.$t("system.memory.inUse")),1),t("span",ye,e(n(m)(d.value.memory.totalBytes-d.value.memory.freeBytes))+" ("+e(C.value)+"%)",1)]),t("div",_e,[t("div",{class:k(["h-full rounded-full transition-all duration-500",C.value>85?"bg-error":C.value>60?"bg-warning":"bg-success"]),style:D({width:`${C.value}%`})},null,6)])])]),t("div",he,[t("h3",fe,[l[5]||(l[5]=t("span",{class:"text-base"},"🎮",-1)),p(" "+e(s.$t("system.gpu.title")),1)]),(o(!0),r(_,null,v(d.value.gpu,(a,w)=>(o(),r("div",{key:w,class:"grid grid-cols-[auto_1fr] gap-y-2 gap-x-4 text-xs"},[t("span",ge,e(s.$t("system.gpu.gpu"))+" "+e(d.value.gpu.length>1?w+1:""),1),t("span",ve,e(a.name),1),t("span",be,e(s.$t("system.gpu.adapterRam")),1),t("span",$e,e(a.adapterRamBytes>0?n(m)(a.adapterRamBytes):s.$t("system.gpu.sharedNotReported")),1),a.driverVersion?(o(),r(_,{key:0},[t("span",we,e(s.$t("system.gpu.driver")),1),t("span",Be,e(a.driverVersion),1)],64)):u("",!0),w<d.value.gpu.length-1?(o(),r("div",ke)):u("",!0)]))),128))]),t("div",Me,[t("h3",Se,[l[6]||(l[6]=t("span",{class:"text-base"},"💾",-1)),p(" "+e(s.$t("system.storage.title")),1)]),(o(!0),r(_,null,v(d.value.storage,(a,w)=>(o(),r("div",{key:w,class:"space-y-2"},[t("div",ze,[t("span",Ce,e(s.$t("system.storage.drive")),1),t("span",De,e(a.drive),1),t("span",Ee,e(s.$t("system.storage.total")),1),t("span",Ie,e(n(m)(a.totalBytes)),1),t("span",Le,e(s.$t("system.storage.free")),1),t("span",Re,e(n(m)(a.freeBytes)),1),t("span",Te,e(s.$t("system.storage.used")),1),t("span",Ve,e(n(m)(a.totalBytes-a.freeBytes))+" ("+e(a.totalBytes>0?Math.round((a.totalBytes-a.freeBytes)/a.totalBytes*100):0)+"%) ",1)]),t("div",Pe,[t("div",{class:k(["h-full rounded-full transition-all duration-500",a.totalBytes>0&&(a.totalBytes-a.freeBytes)/a.totalBytes>.85?"bg-error":(a.totalBytes-a.freeBytes)/a.totalBytes>.6?"bg-warning":"bg-success"]),style:D({width:`${a.totalBytes>0?(a.totalBytes-a.freeBytes)/a.totalBytes*100:0}%`})},null,6)]),w<d.value.storage.length-1?(o(),r("div",Ae)):u("",!0)]))),128))])],64)):u("",!0),t("div",Oe,[t("div",je,[t("h3",Fe,[l[7]||(l[7]=t("span",{class:"text-base"},"📀",-1)),p(" "+e(s.$t("system.browserStorage.title")),1)]),t("div",qe,[n(c).origin?(o(),r("span",{key:0,class:k(["rounded-full px-2 py-0.5 text-[9px]",n(c).origin.persisted?"bg-success/10 text-success":"bg-warning/10 text-warning"])},e(n(c).origin.persisted?s.$t("system.browserStorage.persistent"):s.$t("system.browserStorage.bestEffort")),3)):u("",!0),n(c).loading?(o(),r("span",Ue,e(s.$t("system.browserStorage.scanning")),1)):(o(),r("button",{key:1,class:"text-[10px] text-text-muted hover:text-text-primary transition-colors",onClick:l[0]||(l[0]=a=>n(c).refresh())},e(s.$t("system.refresh")),1))])]),n(c).origin?(o(),V(W,{key:0,used:n(c).origin.usage,total:n(c).origin.quota,label:s.$t("system.browserStorage.indexedDbQuota")},null,8,["used","total","label"])):u("",!0),n(c).databases.length>0?(o(),r("div",Ne,[(o(!0),r(_,null,v(n(c).databases,a=>(o(),V(ht,{key:a.id,database:a,onClear:E},null,8,["database"]))),128))])):u("",!0),n(c).databases.length>0?(o(),r("p",Ge,e(s.$t("system.browserStorage.totalRecords",{count:n(c).totalRecordCount.toLocaleString(),databases:n(c).databases.length})),1)):u("",!0)]),t("div",He,[t("div",Qe,[t("h3",Je,[l[8]||(l[8]=t("span",{class:"text-base"},"⚡",-1)),p(" "+e(s.$t("system.ollama.title")),1)]),t("div",Ke,[t("span",We,e(s.$t("system.ollama.status")),1),t("span",Xe,[t("span",{class:k(["inline-block h-2 w-2 rounded-full",f.value?"bg-success":"bg-error"])},null,2),t("span",{class:k(f.value?"text-success":"text-error")},e(f.value?s.$t("common.status.connected"):s.$t("common.status.disconnected")),3)]),t("span",Ye,e(s.$t("system.ollama.version")),1),t("span",Ze,e(y.value??"—"),1),t("span",ts,e(s.$t("system.ollama.installedModels")),1),t("span",es,e(n(g).models.length),1),t("span",ss,e(s.$t("system.ollama.totalModelStorage")),1),t("span",as,e(n(m)(O.value)),1),t("span",os,e(s.$t("system.ollama.modelsLoaded")),1),t("span",rs,e(i.value.length),1)])]),t("div",ls,[t("h3",ns,[l[9]||(l[9]=t("span",{class:"text-base"},"📊",-1)),p(" "+e(s.$t("system.inference.title"))+" ",1),t("span",ds,"("+e(s.$t("system.inference.thisSession"))+")",1)]),b.value.totalSessions===0?(o(),r("div",is,e(s.$t("system.inference.noSessions")),1)):(o(),r("div",cs,[t("span",us,e(s.$t("system.inference.sessions")),1),t("span",ms,e(b.value.totalSessions),1),t("span",xs,e(s.$t("system.inference.avgSpeed")),1),t("span",ps,e(b.value.avgTps.toFixed(1))+" tok/s",1),t("span",ys,e(s.$t("system.inference.tokensGenerated")),1),t("span",_s,e(b.value.totalTokensGenerated.toLocaleString()),1),t("span",hs,e(s.$t("system.inference.avgTtft")),1),t("span",fs,e(b.value.avgTtftMs.toFixed(0))+" ms",1)])),b.value.modelsUsed.length>0?(o(),r("div",gs,[t("span",vs,e(s.$t("system.inference.modelsUsed"))+":",1),(o(!0),r(_,null,v(b.value.modelsUsed,a=>(o(),r("span",{key:a,class:"rounded-full bg-surface-overlay px-2 py-0.5 text-[10px] text-text-secondary"},e(a),1))),128))])):u("",!0)])]),t("div",bs,[t("h3",$s,[l[10]||(l[10]=t("span",{class:"text-base"},"⚡",-1)),p(" "+e(s.$t("system.activeModels.title")),1)]),i.value.length===0?(o(),r("div",ws,e(s.$t("system.activeModels.noModels")),1)):(o(),r("div",Bs,[t("div",ks,[I.value>0?(o(),r("span",Ms,[p(e(s.$t("system.activeModels.vram"))+": ",1),t("span",Ss,e(n(m)(I.value)),1)])):u("",!0),L.value>0?(o(),r("span",zs,[p(e(s.$t("system.activeModels.ram"))+": ",1),t("span",Cs,e(n(m)(L.value)),1)])):u("",!0),t("span",null,[p(e(s.$t("system.activeModels.total"))+": ",1),t("span",Ds,e(n(m)(I.value+L.value)),1)])]),(o(!0),r(_,null,v(i.value,a=>(o(),r("div",{key:a.digest,class:"flex items-center gap-4 rounded-lg bg-surface px-4 py-3 border border-border-default"},[t("div",Es,[t("p",Is,e(a.name),1),t("p",Ls,e(a.details.parameter_size)+" · "+e(a.details.quantization_level)+" · "+e(a.details.family),1)]),t("div",Rs,[a.size_vram>0?(o(),r("p",Ts,[t("span",Vs,e(s.$t("system.activeModels.vram")),1),t("span",Ps,e(n(m)(a.size_vram)),1)])):u("",!0),a.size-a.size_vram>0?(o(),r("p",As,[t("span",Os,e(s.$t("system.activeModels.ram")),1),t("span",js,e(n(m)(a.size-a.size_vram)),1)])):u("",!0),t("p",null,[t("span",Fs,e(s.$t("system.activeModels.ctx")),1),t("span",qs,e(a.context_length.toLocaleString()),1)])]),t("div",{class:"text-xs text-text-muted shrink-0 w-16 text-right",title:a.expires_at},e(q(a.expires_at)),9,Us)]))),128))]))]),t("div",Ns,[t("h3",Gs,[l[11]||(l[11]=t("span",{class:"text-base"},"📦",-1)),p(" "+e(s.$t("system.installedModels.title")),1)]),n(g).models.length===0?(o(),r("div",Hs,e(s.$t("system.installedModels.noModels")),1)):(o(),r("div",Qs,[t("table",Js,[t("thead",null,[t("tr",Ks,[t("th",Ws,e(s.$t("system.installedModels.model")),1),t("th",Xs,e(s.$t("system.installedModels.family")),1),t("th",Ys,e(s.$t("system.installedModels.parameters")),1),t("th",Zs,e(s.$t("system.installedModels.quantization")),1),t("th",ta,e(s.$t("system.installedModels.size")),1)])]),t("tbody",null,[(o(!0),r(_,null,v(n(g).models,a=>(o(),r("tr",{key:a.name,class:"border-b border-border-default/50"},[t("td",ea,e(a.name),1),t("td",sa,e(a.details.family),1),t("td",aa,e(a.details.parameter_size),1),t("td",oa,e(a.details.quantization_level),1),t("td",ra,e(n(m)(a.size)),1)]))),128))])])]))])]))}});export{ua as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{b as n,e as t,F as c,k as i,g as d,t as l,j as r}from"./index-CgqXFXWk.js";const b={class:"flex gap-1 border-b border-border-default"},m=["onClick"],_=n({__name:"TabBar",props:{tabs:{},activeTab:{}},emits:["update:activeTab"],setup(a,{emit:o}){const s=o;return(p,u)=>(r(),t("div",b,[(r(!0),t(c,null,i(a.tabs,e=>(r(),t("button",{key:e.key,class:d(["px-4 py-2 text-sm font-medium transition-colors border-b-2",a.activeTab===e.key?"border-accent text-accent":"border-transparent text-text-secondary hover:text-text-primary hover:border-border-default"]),onClick:x=>s("update:activeTab",e.key)},l(e.label),11,m))),128))]))}});export{_};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{c as x,a as B,l as M}from"./StatusBadge.vue_vue_type_script_setup_true_lang-
|
|
1
|
+
import{c as x,a as B,l as M}from"./StatusBadge.vue_vue_type_script_setup_true_lang-Do1APUFY.js";import{b as y,e as r,l as _,t as u,a as k,j as a,f as t,F as b,k as C,u as f,w as R,p as F,i as g,h as v,r as T,q as H,y as N}from"./index-CgqXFXWk.js";const S=["title"],V=y({__name:"TokenChip",props:{token:{},color:{},isLatest:{type:Boolean},heatmapMode:{}},emits:["hover","click"],setup(o){const l=o,m=k(()=>({borderBottomColor:l.color,borderBottomWidth:"3px",borderBottomStyle:"solid"}));return(e,s)=>(a(),r("span",{class:"inline cursor-pointer rounded-sm px-px text-text-primary transition-all hover:bg-surface-overlay",style:_([m.value,o.isLatest?{animation:"glow-in 1.5s ease-in-out infinite",borderRadius:"2px"}:{}]),title:`Token #${o.token.index} | Confidence: ${(o.token.confidence*100).toFixed(0)}% | Latency: ${o.token.interTokenLatencyMs}ms`,onMouseenter:s[0]||(s[0]=i=>e.$emit("hover",o.token)),onClick:s[1]||(s[1]=i=>e.$emit("click",o.token))},u(o.token.text),45,S))}}),I={class:"flex items-center gap-2 text-xs text-text-secondary"},D={class:"flex h-3 overflow-hidden rounded-sm"},W=y({__name:"ConfidenceHeatmap",setup(o){const l=[0,.1,.2,.3,.4,.5,.6,.7,.8,.9,1];return(m,e)=>(a(),r("div",I,[e[0]||(e[0]=t("span",null,"Low",-1)),t("div",D,[(a(),r(b,null,C(l,s=>t("div",{key:s,class:"w-4 h-full",style:_({backgroundColor:f(x)(s)})},null,4)),64))]),e[1]||(e[1]=t("span",null,"High",-1)),e[2]||(e[2]=t("span",{class:"ml-2 text-text-muted"},"(confidence from token latency)",-1))]))}}),j={class:"flex flex-col gap-3"},q={key:0,class:"text-text-muted italic"},z={key:0,class:"rounded-lg border border-border-default bg-surface-raised p-3 text-xs space-y-1"},E={class:"flex gap-4"},A={class:"text-text-muted"},G={class:"text-text-muted"},J={class:"text-text-primary"},K={class:"text-text-muted"},O={class:"text-text-primary"},P={class:"text-text-muted"},Q={class:"text-text-primary font-mono"},Y=y({__name:"TokenStreamDisplay",props:{sessionId:{},heatmapMode:{}},setup(o){const l=o,m=k(()=>l.sessionId),{tokens:e,confidenceRange:s}=B(m),i=T(null),d=T(null),h=k(()=>l.heatmapMode??"confidence");function $(c){switch(h.value){case"confidence":return x(c.confidence);case"latency":{const n=s.value.median;return M(c.interTokenLatencyMs,n>0?n*100:50)}case"position":{const n=e.value.length>1?c.index/(e.value.length-1):.5;return x(1-n)}default:return x(c.confidence)}}return R(()=>e.value.length,async()=>{await N(),i.value&&(i.value.scrollTop=i.value.scrollHeight)}),(c,n)=>(a(),r("div",j,[F(W),t("div",{ref_key:"containerRef",ref:i,class:"min-h-[200px] max-h-[500px] overflow-auto rounded-lg border border-border-default bg-surface p-4 font-mono text-sm leading-relaxed"},[f(e).length===0?(a(),r("span",q," Waiting for tokens... ")):g("",!0),(a(!0),r(b,null,C(f(e),(p,w)=>(a(),H(V,{key:p.id,token:p,color:$(p),"is-latest":w===f(e).length-1,"heatmap-mode":h.value,onHover:n[0]||(n[0]=L=>d.value=L)},null,8,["token","color","is-latest","heatmap-mode"]))),128))],512),d.value?(a(),r("div",z,[t("div",E,[t("span",A,"Token #"+u(d.value.index),1),t("span",G,[n[1]||(n[1]=v(" Confidence: ",-1)),t("span",J,u((d.value.confidence*100).toFixed(0))+"%",1)]),t("span",K,[n[2]||(n[2]=v(" Latency: ",-1)),t("span",O,u(d.value.interTokenLatencyMs)+"ms",1)]),t("span",P,[n[3]||(n[3]=v(" Text: ",-1)),t("span",Q,'"'+u(d.value.text)+'"',1)])])])):g("",!0)]))}});export{Y as _};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
.vue-flow{position:relative;width:100%;height:100%;overflow:hidden;z-index:0;direction:ltr}.vue-flow__container{position:absolute;height:100%;width:100%;left:0;top:0}.vue-flow__pane{z-index:1}.vue-flow__pane.draggable{cursor:grab}.vue-flow__pane.selection{cursor:pointer}.vue-flow__pane.dragging{cursor:grabbing}.vue-flow__transformationpane{transform-origin:0 0;z-index:2;pointer-events:none}.vue-flow__viewport{z-index:4;overflow:clip}.vue-flow__selection{z-index:6}.vue-flow__edge-labels{position:absolute;width:100%;height:100%;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.vue-flow__nodesselection-rect:focus,.vue-flow__nodesselection-rect:focus-visible{outline:none}.vue-flow .vue-flow__edges{pointer-events:none;overflow:visible}.vue-flow__edge-path,.vue-flow__connection-path{stroke:#b1b1b7;stroke-width:1;fill:none}.vue-flow__edge{pointer-events:visibleStroke;cursor:pointer}.vue-flow__edge.animated path{stroke-dasharray:5;animation:dashdraw .5s linear infinite}.vue-flow__edge.animated path.vue-flow__edge-interaction{stroke-dasharray:none;animation:none}.vue-flow__edge.inactive{pointer-events:none}.vue-flow__edge.selected,.vue-flow__edge:focus,.vue-flow__edge:focus-visible{outline:none}.vue-flow__edge.selected .vue-flow__edge-path,.vue-flow__edge:focus .vue-flow__edge-path,.vue-flow__edge:focus-visible .vue-flow__edge-path{stroke:#555}.vue-flow__edge-textwrapper{pointer-events:all}.vue-flow__edge-text{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.vue-flow__connection{pointer-events:none}.vue-flow__connection .animated{stroke-dasharray:5;animation:dashdraw .5s linear infinite}.vue-flow__connectionline{z-index:1001}.vue-flow__nodes{pointer-events:none;transform-origin:0 0}.vue-flow__node{position:absolute;-webkit-user-select:none;-moz-user-select:none;user-select:none;pointer-events:all;transform-origin:0 0;box-sizing:border-box;cursor:default}.vue-flow__node.draggable{cursor:grab;pointer-events:all}.vue-flow__node.draggable.dragging{cursor:grabbing}.vue-flow__nodesselection{z-index:3;transform-origin:left top;pointer-events:none}.vue-flow__nodesselection-rect{position:absolute;pointer-events:all;cursor:grab}.vue-flow__nodesselection-rect.dragging{cursor:grabbing}.vue-flow__handle{position:absolute;pointer-events:none;min-width:5px;min-height:5px}.vue-flow__handle.connectable{pointer-events:all;cursor:crosshair}.vue-flow__handle-bottom{left:50%;bottom:0;transform:translate(-50%,50%)}.vue-flow__handle-top{left:50%;top:0;transform:translate(-50%,-50%)}.vue-flow__handle-left{top:50%;left:0;transform:translate(-50%,-50%)}.vue-flow__handle-right{top:50%;right:0;transform:translate(50%,-50%)}.vue-flow__edgeupdater{cursor:move;pointer-events:all}.vue-flow__panel{position:absolute;z-index:5;margin:15px}.vue-flow__panel.top{top:0}.vue-flow__panel.bottom{bottom:0}.vue-flow__panel.left{left:0}.vue-flow__panel.right{right:0}.vue-flow__panel.center{left:50%;transform:translate(-50%)}@keyframes dashdraw{0%{stroke-dashoffset:10}}:root{--vf-node-bg: #fff;--vf-node-text: #222;--vf-connection-path: #b1b1b7;--vf-handle: #555}.vue-flow__edge.updating .vue-flow__edge-path{stroke:#777}.vue-flow__edge-text{font-size:10px}.vue-flow__edge-textbg{fill:#fff}.vue-flow__connection-path{stroke:var(--vf-connection-path)}.vue-flow__node{cursor:grab}.vue-flow__node.selectable:focus,.vue-flow__node.selectable:focus-visible{outline:none}.vue-flow__node-default,.vue-flow__node-input,.vue-flow__node-output{padding:10px;border-radius:3px;width:150px;font-size:12px;text-align:center;border-width:1px;border-style:solid;color:var(--vf-node-text);background-color:var(--vf-node-bg);border-color:var(--vf-node-color)}.vue-flow__node-default.selected,.vue-flow__node-default.selected:hover,.vue-flow__node-input.selected,.vue-flow__node-input.selected:hover,.vue-flow__node-output.selected,.vue-flow__node-output.selected:hover{box-shadow:0 0 0 .5px var(--vf-box-shadow)}.vue-flow__node-default.selected,.vue-flow__node-default:focus,.vue-flow__node-default:focus-visible,.vue-flow__node-input.selected,.vue-flow__node-input:focus,.vue-flow__node-input:focus-visible,.vue-flow__node-output.selected,.vue-flow__node-output:focus,.vue-flow__node-output:focus-visible{outline:none;border:1px solid #555}.vue-flow__node-default .vue-flow__handle,.vue-flow__node-input .vue-flow__handle,.vue-flow__node-output .vue-flow__handle{background:var(--vf-handle)}.vue-flow__node-default.selectable:hover,.vue-flow__node-input.selectable:hover,.vue-flow__node-output.selectable:hover{box-shadow:0 1px 4px 1px #00000014}.vue-flow__node-input{--vf-node-color: var(--vf-node-color, #0041d0);--vf-handle: var(--vf-node-color, #0041d0);--vf-box-shadow: var(--vf-node-color, #0041d0);background:var(--vf-node-bg);border-color:var(--vf-node-color, #0041d0)}.vue-flow__node-input.selected,.vue-flow__node-input:focus,.vue-flow__node-input:focus-visible{outline:none;border:1px solid var(--vf-node-color, #0041d0)}.vue-flow__node-default{--vf-handle: var(--vf-node-color, #1a192b);--vf-box-shadow: var(--vf-node-color, #1a192b);background:var(--vf-node-bg);border-color:var(--vf-node-color, #1a192b)}.vue-flow__node-default.selected,.vue-flow__node-default:focus,.vue-flow__node-default:focus-visible{outline:none;border:1px solid var(--vf-node-color, #1a192b)}.vue-flow__node-output{--vf-handle: var(--vf-node-color, #ff0072);--vf-box-shadow: var(--vf-node-color, #ff0072);background:var(--vf-node-bg);border-color:var(--vf-node-color, #ff0072)}.vue-flow__node-output.selected,.vue-flow__node-output:focus,.vue-flow__node-output:focus-visible{outline:none;border:1px solid var(--vf-node-color, #ff0072)}.vue-flow__nodesselection-rect,.vue-flow__selection{background:#0059dc14;border:1px dotted rgba(0,89,220,.8)}.vue-flow__nodesselection-rect:focus,.vue-flow__nodesselection-rect:focus-visible,.vue-flow__selection:focus,.vue-flow__selection:focus-visible{outline:none}.vue-flow__handle{width:6px;height:6px;background:var(--vf-handle);border:1px solid #fff;border-radius:100%}.vue-flow__controls{box-shadow:0 0 2px 1px #00000014}.vue-flow__controls-button{background:#fefefe;border:none;border-bottom:1px solid #eee;box-sizing:content-box;display:flex;justify-content:center;align-items:center;width:16px;height:16px;cursor:pointer;-webkit-user-select:none;user-select:none;padding:5px}.vue-flow__controls-button svg{width:100%;max-width:12px;max-height:12px}.vue-flow__controls-button:hover{background:#f4f4f4}.vue-flow__controls-button:disabled{pointer-events:none}.vue-flow__controls-button:disabled svg{fill-opacity:.4}.vue-flow__minimap{background-color:#fff}.vue-flow__minimap.pannable{cursor:grab}.vue-flow__minimap.dragging{cursor:grabbing}.vue-flow__minimap-mask.pannable{cursor:grab}.ai-diff[data-v-ac2338a4]{display:flex;flex-direction:column;gap:6px}.diff-explanation[data-v-ac2338a4]{font-size:11px;color:var(--color-text-secondary);background:color-mix(in srgb,var(--color-accent) 8%,transparent);padding:6px 8px;border-radius:4px;line-height:1.4}.diff-code[data-v-ac2338a4]{background:var(--color-surface-base, #0f172a);border:1px solid var(--color-border-default);border-radius:4px;padding:6px 8px;max-height:200px;overflow:auto;font-family:ui-monospace,Consolas,monospace;font-size:11px;line-height:1.5;white-space:pre-wrap;word-break:break-all}.diff-line[data-v-ac2338a4]{color:var(--color-text-primary)}.diff-line.added[data-v-ac2338a4]{background:color-mix(in srgb,var(--color-success) 15%,transparent);color:var(--color-success)}.diff-line.removed[data-v-ac2338a4]{background:color-mix(in srgb,var(--color-error) 15%,transparent);color:var(--color-error);text-decoration:line-through}.diff-actions[data-v-ac2338a4]{display:flex;gap:6px;justify-content:flex-end}.diff-accept[data-v-ac2338a4]{background:var(--color-success);color:var(--color-surface-base, #0f172a);border:none;border-radius:4px;padding:3px 12px;font-size:11px;font-weight:700;cursor:pointer}.diff-accept[data-v-ac2338a4]:hover{opacity:.9}.diff-dismiss[data-v-ac2338a4]{background:none;border:1px solid var(--color-border-default);color:var(--color-text-muted);border-radius:4px;padding:3px 12px;font-size:11px;cursor:pointer}.diff-dismiss[data-v-ac2338a4]:hover{background:var(--color-surface-overlay)}.tool-block[data-v-5b3ce410]{background:var(--color-surface-raised, #1e293b);border:1px solid var(--color-accent);border-radius:10px;padding:0;color:var(--color-text-primary);width:420px;font-size:13px;overflow:visible;transition:border-color .3s,box-shadow .3s}.tool-block.executing[data-v-5b3ce410]{animation:pulse-glow-5b3ce410 1s ease-in-out infinite;border-color:var(--color-accent);box-shadow:0 0 20px color-mix(in srgb,var(--color-accent) 30%,transparent)}.tool-block.completed[data-v-5b3ce410]{border-color:var(--color-success)}.tool-block.failed[data-v-5b3ce410]{border-color:var(--color-error)}@keyframes pulse-glow-5b3ce410{0%,to{box-shadow:0 0 5px color-mix(in srgb,var(--color-accent) 20%,transparent)}50%{box-shadow:0 0 25px color-mix(in srgb,var(--color-accent) 50%,transparent)}}.block-header[data-v-5b3ce410]{background:var(--color-surface-overlay, #334155);padding:10px 12px;display:flex;align-items:center;gap:8px;border-bottom:1px solid var(--color-border-default);border-radius:10px 10px 0 0}.block-badge[data-v-5b3ce410]{font-size:9px;text-transform:uppercase;letter-spacing:.8px;background:var(--color-accent);color:var(--color-surface-base, #0f172a);padding:2px 6px;border-radius:4px;font-weight:700;white-space:nowrap}.block-name-input[data-v-5b3ce410]{flex:1;background:transparent;border:none;color:var(--color-accent);font-size:15px;font-weight:700;font-family:ui-monospace,Consolas,monospace;outline:none;padding:0}.block-name-input[data-v-5b3ce410]:focus{border-bottom:1px solid var(--color-accent)}.exec-badge-row[data-v-5b3ce410]{padding:4px 12px;border-bottom:1px solid var(--color-border-default)}.exec-badge[data-v-5b3ce410]{font-size:10px;font-weight:700;padding:2px 8px;border-radius:4px;cursor:default}.exec-executing[data-v-5b3ce410]{background:color-mix(in srgb,var(--color-accent) 15%,transparent);color:var(--color-accent)}.exec-completed[data-v-5b3ce410]{background:color-mix(in srgb,var(--color-success) 15%,transparent);color:var(--color-success);border:none;cursor:pointer}.exec-completed[data-v-5b3ce410]:hover{background:color-mix(in srgb,var(--color-success) 25%,transparent)}.exec-failed[data-v-5b3ce410]{background:color-mix(in srgb,var(--color-error) 15%,transparent);color:var(--color-error)}.exec-result-panel[data-v-5b3ce410]{padding:6px 12px;border-bottom:1px solid var(--color-border-default);background:var(--color-surface-base, #0f172a);max-height:200px;overflow:auto}.block-section[data-v-5b3ce410]{padding:8px 12px;border-bottom:1px solid var(--color-border-default)}.block-section[data-v-5b3ce410]:last-child{border-bottom:none}.block-section>label[data-v-5b3ce410]{font-size:10px;text-transform:uppercase;letter-spacing:.5px;color:var(--color-text-muted);display:block;margin-bottom:4px}.block-input[data-v-5b3ce410]{width:100%;background:var(--color-surface-base, #0f172a);border:1px solid var(--color-border-default);color:var(--color-text-primary);padding:4px 8px;border-radius:4px;font-size:12px;outline:none;box-sizing:border-box}.block-input[data-v-5b3ce410]:focus{border-color:var(--color-accent)}.param-header[data-v-5b3ce410]{display:flex;align-items:center;justify-content:space-between;margin-bottom:4px}.param-header label[data-v-5b3ce410]{font-size:10px;text-transform:uppercase;letter-spacing:.5px;color:var(--color-text-muted);margin-bottom:0}.param-add-btn[data-v-5b3ce410]{background:none;border:1px solid var(--color-border-default);color:var(--color-success);font-size:10px;padding:1px 6px;border-radius:3px;cursor:pointer}.param-add-btn[data-v-5b3ce410]:hover{background:var(--color-surface-overlay)}.param-row[data-v-5b3ce410]{display:flex;gap:4px;margin-bottom:3px}.param-name[data-v-5b3ce410],.param-type[data-v-5b3ce410]{flex:1;background:var(--color-surface-base, #0f172a);border:1px solid var(--color-border-default);color:var(--color-text-primary);padding:3px 6px;border-radius:4px;font-size:11px;font-family:ui-monospace,Consolas,monospace;outline:none;box-sizing:border-box}.param-name[data-v-5b3ce410]:focus,.param-type[data-v-5b3ce410]:focus{border-color:var(--color-accent)}.param-type[data-v-5b3ce410]{color:var(--color-accent)}.param-remove-btn[data-v-5b3ce410]{background:none;border:none;color:var(--color-error);font-size:14px;cursor:pointer;padding:0 4px;line-height:1}.secret-toggle-btn[data-v-5b3ce410]{background:none;border:none;font-size:11px;cursor:pointer;padding:0 3px;opacity:.35;transition:opacity .15s}.secret-toggle-btn[data-v-5b3ce410]:hover{opacity:.7}.secret-toggle-btn.active[data-v-5b3ce410]{opacity:1;filter:drop-shadow(0 0 3px var(--color-warning, #f9e2af))}.secret-masked[data-v-5b3ce410]{-webkit-text-security:disc}.param-empty[data-v-5b3ce410]{font-size:11px;color:var(--color-text-muted);font-style:italic}.probe-section[data-v-5b3ce410]{padding:0}.probe-toggle[data-v-5b3ce410]{display:flex;align-items:center;gap:6px;padding:8px 12px;cursor:pointer;-webkit-user-select:none;user-select:none}.probe-toggle label[data-v-5b3ce410]{font-size:10px;text-transform:uppercase;letter-spacing:.5px;color:var(--color-text-muted);cursor:pointer;margin:0}.probe-badge[data-v-5b3ce410]{font-size:8px;text-transform:uppercase;letter-spacing:.5px;background:var(--color-accent);color:var(--color-surface-base, #0f172a);padding:1px 5px;border-radius:3px;font-weight:700;margin-left:auto}.toggle-arrow[data-v-5b3ce410]{font-size:8px;color:var(--color-text-muted);transition:transform .15s;display:inline-block;width:10px;text-align:center}.toggle-arrow.open[data-v-5b3ce410]{transform:rotate(90deg)}.probe-panel[data-v-5b3ce410]{padding:0 12px 10px;display:flex;flex-direction:column;gap:6px}.probe-url-row[data-v-5b3ce410]{display:flex;gap:4px}.probe-url[data-v-5b3ce410]{flex:1}.method-select[data-v-5b3ce410]{background:var(--color-surface-base, #0f172a);border:1px solid var(--color-border-default);color:var(--color-accent);padding:3px 4px;border-radius:4px;font-size:10px;font-weight:700;font-family:ui-monospace,Consolas,monospace;outline:none;cursor:pointer;width:62px}.probe-btn[data-v-5b3ce410]{background:var(--color-accent);color:var(--color-surface-base, #0f172a);border:none;border-radius:4px;padding:4px 10px;font-size:11px;font-weight:700;cursor:pointer;white-space:nowrap}.probe-btn[data-v-5b3ce410]:hover{opacity:.9}.probe-btn[data-v-5b3ce410]:disabled{opacity:.4;cursor:default}.diag-row[data-v-5b3ce410]{display:flex;align-items:center;gap:4px;flex-wrap:wrap}.diag-status[data-v-5b3ce410]{font-size:10px;font-weight:700;color:var(--color-surface-base, #0f172a);padding:1px 6px;border-radius:3px;font-family:ui-monospace,Consolas,monospace}.diag-tag[data-v-5b3ce410]{font-size:9px;color:var(--color-text-secondary);background:var(--color-surface-overlay);padding:1px 5px;border-radius:3px}.diag-openapi[data-v-5b3ce410]{background:color-mix(in srgb,var(--color-accent) 15%,transparent);color:var(--color-accent);font-weight:600}.diag-auth[data-v-5b3ce410]{display:flex;align-items:center;gap:4px;font-size:11px;color:var(--color-warning, #f9e2af);background:color-mix(in srgb,var(--color-warning, #f9e2af) 8%,transparent);padding:4px 8px;border-radius:4px}.diag-auth-icon[data-v-5b3ce410]{font-size:12px}.config-section[data-v-5b3ce410]{display:flex;flex-direction:column;gap:3px}.config-header[data-v-5b3ce410]{display:flex;align-items:center;justify-content:space-between}.config-label[data-v-5b3ce410]{font-size:10px;text-transform:uppercase;letter-spacing:.5px;color:var(--color-text-muted)}.req-body[data-v-5b3ce410]{min-height:50px}.ep-section[data-v-5b3ce410]{display:flex;flex-direction:column;gap:4px}.ep-search[data-v-5b3ce410]{font-size:11px}.ep-list[data-v-5b3ce410]{max-height:180px;overflow-y:auto;background:var(--color-surface-base, #0f172a);border:1px solid var(--color-border-default);border-radius:4px}.ep-row[data-v-5b3ce410]{display:flex;align-items:center;gap:6px;padding:4px 8px;cursor:pointer;border-bottom:1px solid var(--color-surface-raised, #1e293b)}.ep-row[data-v-5b3ce410]:last-child{border-bottom:none}.ep-row[data-v-5b3ce410]:hover{background:color-mix(in srgb,var(--color-accent) 8%,transparent)}.ep-row.selected[data-v-5b3ce410]{background:color-mix(in srgb,var(--color-accent) 15%,transparent)}.ep-method[data-v-5b3ce410]{font-size:8px;font-weight:700;color:var(--color-surface-base, #0f172a);padding:1px 4px;border-radius:2px;font-family:ui-monospace,Consolas,monospace;flex-shrink:0}.ep-path[data-v-5b3ce410]{font-size:11px;font-family:ui-monospace,Consolas,monospace;color:var(--color-text-primary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ep-summary[data-v-5b3ce410]{font-size:10px;color:var(--color-text-muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin-left:auto}.probe-tree[data-v-5b3ce410]{background:var(--color-surface-base, #0f172a);border:1px solid var(--color-border-default);border-radius:4px;padding:6px;max-height:220px;overflow:auto}.probe-footer[data-v-5b3ce410]{display:flex;align-items:center;justify-content:space-between}.probe-count[data-v-5b3ce410]{font-size:10px;color:var(--color-success);font-weight:600}.probe-apply-btn[data-v-5b3ce410]{background:var(--color-success);color:var(--color-surface-base, #0f172a);border:none;border-radius:4px;padding:3px 12px;font-size:11px;font-weight:700;cursor:pointer}.probe-apply-btn[data-v-5b3ce410]:hover{opacity:.9}.probe-error[data-v-5b3ce410]{font-size:11px;color:var(--color-error)}.probe-raw[data-v-5b3ce410]{font-size:10px;color:var(--color-text-secondary);background:var(--color-surface-base, #0f172a);padding:6px;border-radius:4px;max-height:80px;overflow:auto;margin:0;white-space:pre-wrap;word-break:break-all}.mappings-section[data-v-5b3ce410]{padding-bottom:6px}.mappings-header[data-v-5b3ce410]{display:flex;align-items:center;justify-content:space-between;margin-bottom:4px}.mappings-header label[data-v-5b3ce410]{font-size:10px;text-transform:uppercase;letter-spacing:.5px;color:var(--color-text-muted);margin:0}.stale-badge[data-v-5b3ce410]{font-size:9px;font-weight:700;color:var(--color-error);background:color-mix(in srgb,var(--color-error) 12%,transparent);padding:1px 6px;border-radius:3px}.mappings-list[data-v-5b3ce410]{display:flex;flex-wrap:wrap;gap:3px}.mapping-tag[data-v-5b3ce410]{font-size:10px;font-family:ui-monospace,Consolas,monospace;background:color-mix(in srgb,var(--color-success) 12%,transparent);color:var(--color-success);padding:1px 6px;border-radius:3px}.mapping-tag.stale[data-v-5b3ce410]{background:color-mix(in srgb,var(--color-error) 12%,transparent);color:var(--color-error);text-decoration:line-through}.block-body[data-v-5b3ce410]{width:100%;min-height:100px;background:var(--color-surface-base, #0f172a);border:1px solid var(--color-border-default);color:var(--color-text-primary);padding:8px;border-radius:4px;font-family:ui-monospace,Consolas,monospace;font-size:11px;line-height:1.5;resize:vertical;outline:none;box-sizing:border-box}.block-body[data-v-5b3ce410]:focus{border-color:var(--color-accent)}.ai-header-btn[data-v-5b3ce410]{background:none;border:1px solid var(--color-border-default);color:var(--color-text-muted);font-size:12px;padding:2px 6px;border-radius:4px;cursor:pointer;transition:all .15s;flex-shrink:0}.ai-header-btn[data-v-5b3ce410]:hover{background:var(--color-surface-overlay);color:var(--color-text-primary)}.ai-header-btn.active[data-v-5b3ce410]{border-color:var(--color-accent);color:var(--color-accent)}.ai-header-btn[data-v-5b3ce410]:disabled{opacity:.4;cursor:default}.ai-header-btn.ai-analyze[data-v-5b3ce410]{font-size:11px}.ai-fix-btn[data-v-5b3ce410]{background:color-mix(in srgb,var(--color-accent) 15%,transparent);color:var(--color-accent);border:1px solid var(--color-accent);border-radius:4px;padding:2px 8px;font-size:10px;font-weight:700;cursor:pointer;margin-left:auto}.ai-fix-btn[data-v-5b3ce410]:hover{background:color-mix(in srgb,var(--color-accent) 25%,transparent)}.ai-fix-btn[data-v-5b3ce410]:disabled{opacity:.4;cursor:default}.insights-row[data-v-5b3ce410]{padding:4px 12px;border-bottom:1px solid var(--color-border-default);display:flex;flex-wrap:wrap;gap:4px}.insight-badge[data-v-5b3ce410]{font-size:10px;font-weight:600;padding:2px 8px;border-radius:4px;cursor:pointer;transition:opacity .15s}.insight-badge[data-v-5b3ce410]:hover{opacity:.8}.insight-badge.info[data-v-5b3ce410]{background:color-mix(in srgb,var(--color-accent) 15%,transparent);color:var(--color-accent)}.insight-badge.warning[data-v-5b3ce410]{background:color-mix(in srgb,var(--color-warning, #f9e2af) 15%,transparent);color:var(--color-warning, #f9e2af)}.insight-badge.error[data-v-5b3ce410]{background:color-mix(in srgb,var(--color-error) 15%,transparent);color:var(--color-error)}.insight-detail[data-v-5b3ce410]{padding:8px 12px;border-bottom:1px solid var(--color-border-default);background:var(--color-surface-base, #0f172a)}.insight-desc[data-v-5b3ce410]{font-size:11px;color:var(--color-text-secondary);line-height:1.4;margin:0 0 6px}.thinking-bar[data-v-5b3ce410]{display:flex;align-items:center;gap:8px;padding:6px 12px;border-bottom:1px solid var(--color-border-default);background:linear-gradient(90deg,#8b5cf60d,#8b5cf61a,#8b5cf60d);background-size:200% 100%;animation:thinking-shimmer-5b3ce410 2s ease-in-out infinite}@keyframes thinking-shimmer-5b3ce410{0%{background-position:200% 0}to{background-position:-200% 0}}.thinking-dot[data-v-5b3ce410]{width:6px;height:6px;border-radius:50%;background:var(--color-accent);animation:thinking-pulse-5b3ce410 1s ease-in-out infinite}@keyframes thinking-pulse-5b3ce410{0%,to{opacity:.4;transform:scale(.8)}50%{opacity:1;transform:scale(1.2)}}.thinking-text[data-v-5b3ce410]{font-size:10px;color:var(--color-accent);font-style:italic;transition:opacity .3s}.insight-suggestion-label[data-v-5b3ce410]{font-size:9px;color:var(--color-text-muted);margin:4px 0 2px;font-style:italic}.insight-actions[data-v-5b3ce410]{display:flex;align-items:center;gap:8px;margin-top:6px}.insight-apply[data-v-5b3ce410]{background:var(--color-accent);border:none;color:#fff;font-size:10px;cursor:pointer;padding:3px 10px;border-radius:6px;font-weight:500}.insight-apply[data-v-5b3ce410]:hover{opacity:.85}.insight-close[data-v-5b3ce410]{background:none;border:none;color:var(--color-text-muted);font-size:10px;cursor:pointer;padding:2px 0}.insight-close[data-v-5b3ce410]:hover{color:var(--color-text-primary)}.intent-textarea[data-v-5b3ce410]{width:100%;background:var(--color-surface-base, #0f172a);border:1px solid var(--color-border-default);color:var(--color-text-primary);padding:6px 8px;border-radius:4px;font-size:12px;font-family:inherit;resize:vertical;outline:none;box-sizing:border-box}.intent-textarea[data-v-5b3ce410]:focus{border-color:var(--color-accent)}.intent-actions[data-v-5b3ce410]{display:flex;justify-content:flex-end;margin-top:4px}.intent-generate-btn[data-v-5b3ce410]{background:var(--color-accent);color:var(--color-surface-base, #0f172a);border:none;border-radius:4px;padding:3px 12px;font-size:11px;font-weight:700;cursor:pointer}.intent-generate-btn[data-v-5b3ce410]:hover{opacity:.9}.intent-generate-btn[data-v-5b3ce410]:disabled{opacity:.4;cursor:default}.intent-error[data-v-5b3ce410]{font-size:11px;color:var(--color-error);margin-top:4px}.probe-ai-row[data-v-5b3ce410]{display:flex;justify-content:flex-end}.ai-suggest-btn[data-v-5b3ce410]{background:color-mix(in srgb,var(--color-accent) 15%,transparent);color:var(--color-accent);border:1px solid color-mix(in srgb,var(--color-accent) 30%,transparent);border-radius:4px;padding:2px 10px;font-size:10px;font-weight:700;cursor:pointer}.ai-suggest-btn[data-v-5b3ce410]:hover{background:color-mix(in srgb,var(--color-accent) 25%,transparent)}.ai-suggest-btn[data-v-5b3ce410]:disabled{opacity:.4;cursor:default}.auto-map-reasoning[data-v-5b3ce410]{font-size:10px;color:var(--color-text-secondary);background:color-mix(in srgb,var(--color-accent) 8%,transparent);padding:4px 8px;border-radius:4px;line-height:1.3}.sync-dot{width:8px;height:8px;border-radius:50%;display:inline-block}.sync-dot.synced{background:var(--color-success)}.sync-dot.dirty{background:var(--color-warning, #f9e2af)}.canvas-flow{background:var(--color-surface-base, #0f172a)!important}.canvas-flow .vue-flow__node{border:none!important;background:none!important;padding:0!important;border-radius:0!important}.canvas-flow .vue-flow__handle{width:10px;height:10px;background:var(--color-accent)!important;border:2px solid var(--color-surface-base, #0f172a)!important}.canvas-flow .vue-flow__edge-path{stroke-width:2}.canvas-flow .vue-flow__minimap{background:var(--color-surface-raised, #1e293b)!important}.canvas-flow .vue-flow__controls{background:var(--color-surface-raised, #1e293b)!important;border-color:var(--color-border-default)!important}.canvas-flow .vue-flow__controls-button{background:var(--color-surface-raised, #1e293b)!important;border-color:var(--color-border-default)!important;color:var(--color-text-primary)!important;fill:var(--color-text-primary)!important}.canvas-flow .vue-flow__controls-button:hover{background:var(--color-surface-overlay)!important}.canvas-ai-model-select{outline:none;font-family:ui-monospace,Consolas,monospace;max-width:180px}.canvas-ai-model-select option{background:var(--color-surface-raised, #1e293b);color:var(--color-text-primary)}
|
|
1
|
+
.vue-flow{position:relative;width:100%;height:100%;overflow:hidden;z-index:0;direction:ltr}.vue-flow__container{position:absolute;height:100%;width:100%;left:0;top:0}.vue-flow__pane{z-index:1}.vue-flow__pane.draggable{cursor:grab}.vue-flow__pane.selection{cursor:pointer}.vue-flow__pane.dragging{cursor:grabbing}.vue-flow__transformationpane{transform-origin:0 0;z-index:2;pointer-events:none}.vue-flow__viewport{z-index:4;overflow:clip}.vue-flow__selection{z-index:6}.vue-flow__edge-labels{position:absolute;width:100%;height:100%;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.vue-flow__nodesselection-rect:focus,.vue-flow__nodesselection-rect:focus-visible{outline:none}.vue-flow .vue-flow__edges{pointer-events:none;overflow:visible}.vue-flow__edge-path,.vue-flow__connection-path{stroke:#b1b1b7;stroke-width:1;fill:none}.vue-flow__edge{pointer-events:visibleStroke;cursor:pointer}.vue-flow__edge.animated path{stroke-dasharray:5;animation:dashdraw .5s linear infinite}.vue-flow__edge.animated path.vue-flow__edge-interaction{stroke-dasharray:none;animation:none}.vue-flow__edge.inactive{pointer-events:none}.vue-flow__edge.selected,.vue-flow__edge:focus,.vue-flow__edge:focus-visible{outline:none}.vue-flow__edge.selected .vue-flow__edge-path,.vue-flow__edge:focus .vue-flow__edge-path,.vue-flow__edge:focus-visible .vue-flow__edge-path{stroke:#555}.vue-flow__edge-textwrapper{pointer-events:all}.vue-flow__edge-text{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.vue-flow__connection{pointer-events:none}.vue-flow__connection .animated{stroke-dasharray:5;animation:dashdraw .5s linear infinite}.vue-flow__connectionline{z-index:1001}.vue-flow__nodes{pointer-events:none;transform-origin:0 0}.vue-flow__node{position:absolute;-webkit-user-select:none;-moz-user-select:none;user-select:none;pointer-events:all;transform-origin:0 0;box-sizing:border-box;cursor:default}.vue-flow__node.draggable{cursor:grab;pointer-events:all}.vue-flow__node.draggable.dragging{cursor:grabbing}.vue-flow__nodesselection{z-index:3;transform-origin:left top;pointer-events:none}.vue-flow__nodesselection-rect{position:absolute;pointer-events:all;cursor:grab}.vue-flow__nodesselection-rect.dragging{cursor:grabbing}.vue-flow__handle{position:absolute;pointer-events:none;min-width:5px;min-height:5px}.vue-flow__handle.connectable{pointer-events:all;cursor:crosshair}.vue-flow__handle-bottom{left:50%;bottom:0;transform:translate(-50%,50%)}.vue-flow__handle-top{left:50%;top:0;transform:translate(-50%,-50%)}.vue-flow__handle-left{top:50%;left:0;transform:translate(-50%,-50%)}.vue-flow__handle-right{top:50%;right:0;transform:translate(50%,-50%)}.vue-flow__edgeupdater{cursor:move;pointer-events:all}.vue-flow__panel{position:absolute;z-index:5;margin:15px}.vue-flow__panel.top{top:0}.vue-flow__panel.bottom{bottom:0}.vue-flow__panel.left{left:0}.vue-flow__panel.right{right:0}.vue-flow__panel.center{left:50%;transform:translate(-50%)}@keyframes dashdraw{0%{stroke-dashoffset:10}}:root{--vf-node-bg: #fff;--vf-node-text: #222;--vf-connection-path: #b1b1b7;--vf-handle: #555}.vue-flow__edge.updating .vue-flow__edge-path{stroke:#777}.vue-flow__edge-text{font-size:10px}.vue-flow__edge-textbg{fill:#fff}.vue-flow__connection-path{stroke:var(--vf-connection-path)}.vue-flow__node{cursor:grab}.vue-flow__node.selectable:focus,.vue-flow__node.selectable:focus-visible{outline:none}.vue-flow__node-default,.vue-flow__node-input,.vue-flow__node-output{padding:10px;border-radius:3px;width:150px;font-size:12px;text-align:center;border-width:1px;border-style:solid;color:var(--vf-node-text);background-color:var(--vf-node-bg);border-color:var(--vf-node-color)}.vue-flow__node-default.selected,.vue-flow__node-default.selected:hover,.vue-flow__node-input.selected,.vue-flow__node-input.selected:hover,.vue-flow__node-output.selected,.vue-flow__node-output.selected:hover{box-shadow:0 0 0 .5px var(--vf-box-shadow)}.vue-flow__node-default.selected,.vue-flow__node-default:focus,.vue-flow__node-default:focus-visible,.vue-flow__node-input.selected,.vue-flow__node-input:focus,.vue-flow__node-input:focus-visible,.vue-flow__node-output.selected,.vue-flow__node-output:focus,.vue-flow__node-output:focus-visible{outline:none;border:1px solid #555}.vue-flow__node-default .vue-flow__handle,.vue-flow__node-input .vue-flow__handle,.vue-flow__node-output .vue-flow__handle{background:var(--vf-handle)}.vue-flow__node-default.selectable:hover,.vue-flow__node-input.selectable:hover,.vue-flow__node-output.selectable:hover{box-shadow:0 1px 4px 1px #00000014}.vue-flow__node-input{--vf-node-color: var(--vf-node-color, #0041d0);--vf-handle: var(--vf-node-color, #0041d0);--vf-box-shadow: var(--vf-node-color, #0041d0);background:var(--vf-node-bg);border-color:var(--vf-node-color, #0041d0)}.vue-flow__node-input.selected,.vue-flow__node-input:focus,.vue-flow__node-input:focus-visible{outline:none;border:1px solid var(--vf-node-color, #0041d0)}.vue-flow__node-default{--vf-handle: var(--vf-node-color, #1a192b);--vf-box-shadow: var(--vf-node-color, #1a192b);background:var(--vf-node-bg);border-color:var(--vf-node-color, #1a192b)}.vue-flow__node-default.selected,.vue-flow__node-default:focus,.vue-flow__node-default:focus-visible{outline:none;border:1px solid var(--vf-node-color, #1a192b)}.vue-flow__node-output{--vf-handle: var(--vf-node-color, #ff0072);--vf-box-shadow: var(--vf-node-color, #ff0072);background:var(--vf-node-bg);border-color:var(--vf-node-color, #ff0072)}.vue-flow__node-output.selected,.vue-flow__node-output:focus,.vue-flow__node-output:focus-visible{outline:none;border:1px solid var(--vf-node-color, #ff0072)}.vue-flow__nodesselection-rect,.vue-flow__selection{background:#0059dc14;border:1px dotted rgba(0,89,220,.8)}.vue-flow__nodesselection-rect:focus,.vue-flow__nodesselection-rect:focus-visible,.vue-flow__selection:focus,.vue-flow__selection:focus-visible{outline:none}.vue-flow__handle{width:6px;height:6px;background:var(--vf-handle);border:1px solid #fff;border-radius:100%}.vue-flow__controls{box-shadow:0 0 2px 1px #00000014}.vue-flow__controls-button{background:#fefefe;border:none;border-bottom:1px solid #eee;box-sizing:content-box;display:flex;justify-content:center;align-items:center;width:16px;height:16px;cursor:pointer;-webkit-user-select:none;user-select:none;padding:5px}.vue-flow__controls-button svg{width:100%;max-width:12px;max-height:12px}.vue-flow__controls-button:hover{background:#f4f4f4}.vue-flow__controls-button:disabled{pointer-events:none}.vue-flow__controls-button:disabled svg{fill-opacity:.4}.vue-flow__minimap{background-color:#fff}.vue-flow__minimap.pannable{cursor:grab}.vue-flow__minimap.dragging{cursor:grabbing}.vue-flow__minimap-mask.pannable{cursor:grab}.ai-diff[data-v-01c9471b]{display:flex;flex-direction:column;gap:6px}.diff-explanation[data-v-01c9471b]{font-size:11px;color:var(--color-text-secondary);background:color-mix(in srgb,var(--color-accent) 8%,transparent);padding:6px 8px;border-radius:4px;line-height:1.4}.diff-code[data-v-01c9471b]{background:var(--color-surface-base, #0f172a);border:1px solid var(--color-border-default);border-radius:4px;padding:6px 8px;max-height:200px;overflow:auto;font-family:ui-monospace,Consolas,monospace;font-size:11px;line-height:1.5;white-space:pre-wrap;word-break:break-all}.diff-line[data-v-01c9471b]{color:var(--color-text-primary)}.diff-line.added[data-v-01c9471b]{background:color-mix(in srgb,var(--color-success) 15%,transparent);color:var(--color-success)}.diff-line.removed[data-v-01c9471b]{background:color-mix(in srgb,var(--color-error) 15%,transparent);color:var(--color-error);text-decoration:line-through}.diff-actions[data-v-01c9471b]{display:flex;gap:6px;justify-content:flex-end}.diff-accept[data-v-01c9471b]{background:var(--color-success);color:var(--color-surface-base, #0f172a);border:none;border-radius:4px;padding:3px 12px;font-size:11px;font-weight:700;cursor:pointer}.diff-accept[data-v-01c9471b]:hover{opacity:.9}.diff-dismiss[data-v-01c9471b]{background:none;border:1px solid var(--color-border-default);color:var(--color-text-muted);border-radius:4px;padding:3px 12px;font-size:11px;cursor:pointer}.diff-dismiss[data-v-01c9471b]:hover{background:var(--color-surface-overlay)}.tool-block[data-v-655b6640]{background:var(--color-surface-raised, #1e293b);border:1px solid var(--color-accent);border-radius:10px;padding:0;color:var(--color-text-primary);width:420px;font-size:13px;overflow:visible;transition:border-color .3s,box-shadow .3s}.tool-block.executing[data-v-655b6640]{animation:pulse-glow-655b6640 1s ease-in-out infinite;border-color:var(--color-accent);box-shadow:0 0 20px color-mix(in srgb,var(--color-accent) 30%,transparent)}.tool-block.completed[data-v-655b6640]{border-color:var(--color-success)}.tool-block.failed[data-v-655b6640]{border-color:var(--color-error)}@keyframes pulse-glow-655b6640{0%,to{box-shadow:0 0 5px color-mix(in srgb,var(--color-accent) 20%,transparent)}50%{box-shadow:0 0 25px color-mix(in srgb,var(--color-accent) 50%,transparent)}}.block-header[data-v-655b6640]{background:var(--color-surface-overlay, #334155);padding:10px 12px;display:flex;align-items:center;gap:8px;border-bottom:1px solid var(--color-border-default);border-radius:10px 10px 0 0}.block-badge[data-v-655b6640]{font-size:9px;text-transform:uppercase;letter-spacing:.8px;background:var(--color-accent);color:var(--color-surface-base, #0f172a);padding:2px 6px;border-radius:4px;font-weight:700;white-space:nowrap}.block-name-input[data-v-655b6640]{flex:1;background:transparent;border:none;color:var(--color-accent);font-size:15px;font-weight:700;font-family:ui-monospace,Consolas,monospace;outline:none;padding:0}.block-name-input[data-v-655b6640]:focus{border-bottom:1px solid var(--color-accent)}.exec-badge-row[data-v-655b6640]{padding:4px 12px;border-bottom:1px solid var(--color-border-default)}.exec-badge[data-v-655b6640]{font-size:10px;font-weight:700;padding:2px 8px;border-radius:4px;cursor:default}.exec-executing[data-v-655b6640]{background:color-mix(in srgb,var(--color-accent) 15%,transparent);color:var(--color-accent)}.exec-completed[data-v-655b6640]{background:color-mix(in srgb,var(--color-success) 15%,transparent);color:var(--color-success);border:none;cursor:pointer}.exec-completed[data-v-655b6640]:hover{background:color-mix(in srgb,var(--color-success) 25%,transparent)}.exec-failed[data-v-655b6640]{background:color-mix(in srgb,var(--color-error) 15%,transparent);color:var(--color-error)}.exec-result-panel[data-v-655b6640]{padding:6px 12px;border-bottom:1px solid var(--color-border-default);background:var(--color-surface-base, #0f172a);max-height:200px;overflow:auto}.block-section[data-v-655b6640]{padding:8px 12px;border-bottom:1px solid var(--color-border-default)}.block-section[data-v-655b6640]:last-child{border-bottom:none}.block-section>label[data-v-655b6640]{font-size:10px;text-transform:uppercase;letter-spacing:.5px;color:var(--color-text-muted);display:block;margin-bottom:4px}.block-input[data-v-655b6640]{width:100%;background:var(--color-surface-base, #0f172a);border:1px solid var(--color-border-default);color:var(--color-text-primary);padding:4px 8px;border-radius:4px;font-size:12px;outline:none;box-sizing:border-box}.block-input[data-v-655b6640]:focus{border-color:var(--color-accent)}.param-header[data-v-655b6640]{display:flex;align-items:center;justify-content:space-between;margin-bottom:4px}.param-header label[data-v-655b6640]{font-size:10px;text-transform:uppercase;letter-spacing:.5px;color:var(--color-text-muted);margin-bottom:0}.param-add-btn[data-v-655b6640]{background:none;border:1px solid var(--color-border-default);color:var(--color-success);font-size:10px;padding:1px 6px;border-radius:3px;cursor:pointer}.param-add-btn[data-v-655b6640]:hover{background:var(--color-surface-overlay)}.param-row[data-v-655b6640]{display:flex;gap:4px;margin-bottom:3px}.param-name[data-v-655b6640],.param-type[data-v-655b6640]{flex:1;background:var(--color-surface-base, #0f172a);border:1px solid var(--color-border-default);color:var(--color-text-primary);padding:3px 6px;border-radius:4px;font-size:11px;font-family:ui-monospace,Consolas,monospace;outline:none;box-sizing:border-box}.param-name[data-v-655b6640]:focus,.param-type[data-v-655b6640]:focus{border-color:var(--color-accent)}.param-type[data-v-655b6640]{color:var(--color-accent)}.param-remove-btn[data-v-655b6640]{background:none;border:none;color:var(--color-error);font-size:14px;cursor:pointer;padding:0 4px;line-height:1}.secret-toggle-btn[data-v-655b6640]{background:none;border:none;font-size:11px;cursor:pointer;padding:0 3px;opacity:.35;transition:opacity .15s}.secret-toggle-btn[data-v-655b6640]:hover{opacity:.7}.secret-toggle-btn.active[data-v-655b6640]{opacity:1;filter:drop-shadow(0 0 3px var(--color-warning, #f9e2af))}.secret-masked[data-v-655b6640]{-webkit-text-security:disc}.param-empty[data-v-655b6640]{font-size:11px;color:var(--color-text-muted);font-style:italic}.probe-section[data-v-655b6640]{padding:0}.probe-toggle[data-v-655b6640]{display:flex;align-items:center;gap:6px;padding:8px 12px;cursor:pointer;-webkit-user-select:none;user-select:none}.probe-toggle label[data-v-655b6640]{font-size:10px;text-transform:uppercase;letter-spacing:.5px;color:var(--color-text-muted);cursor:pointer;margin:0}.probe-badge[data-v-655b6640]{font-size:8px;text-transform:uppercase;letter-spacing:.5px;background:var(--color-accent);color:var(--color-surface-base, #0f172a);padding:1px 5px;border-radius:3px;font-weight:700;margin-left:auto}.toggle-arrow[data-v-655b6640]{font-size:8px;color:var(--color-text-muted);transition:transform .15s;display:inline-block;width:10px;text-align:center}.toggle-arrow.open[data-v-655b6640]{transform:rotate(90deg)}.probe-panel[data-v-655b6640]{padding:0 12px 10px;display:flex;flex-direction:column;gap:6px}.probe-url-row[data-v-655b6640]{display:flex;gap:4px}.probe-url[data-v-655b6640]{flex:1}.method-select[data-v-655b6640]{background:var(--color-surface-base, #0f172a);border:1px solid var(--color-border-default);color:var(--color-accent);padding:3px 4px;border-radius:4px;font-size:10px;font-weight:700;font-family:ui-monospace,Consolas,monospace;outline:none;cursor:pointer;width:62px}.probe-btn[data-v-655b6640]{background:var(--color-accent);color:var(--color-surface-base, #0f172a);border:none;border-radius:4px;padding:4px 10px;font-size:11px;font-weight:700;cursor:pointer;white-space:nowrap}.probe-btn[data-v-655b6640]:hover{opacity:.9}.probe-btn[data-v-655b6640]:disabled{opacity:.4;cursor:default}.diag-row[data-v-655b6640]{display:flex;align-items:center;gap:4px;flex-wrap:wrap}.diag-status[data-v-655b6640]{font-size:10px;font-weight:700;color:var(--color-surface-base, #0f172a);padding:1px 6px;border-radius:3px;font-family:ui-monospace,Consolas,monospace}.diag-tag[data-v-655b6640]{font-size:9px;color:var(--color-text-secondary);background:var(--color-surface-overlay);padding:1px 5px;border-radius:3px}.diag-openapi[data-v-655b6640]{background:color-mix(in srgb,var(--color-accent) 15%,transparent);color:var(--color-accent);font-weight:600}.diag-auth[data-v-655b6640]{display:flex;align-items:center;gap:4px;font-size:11px;color:var(--color-warning, #f9e2af);background:color-mix(in srgb,var(--color-warning, #f9e2af) 8%,transparent);padding:4px 8px;border-radius:4px}.diag-auth-icon[data-v-655b6640]{font-size:12px}.config-section[data-v-655b6640]{display:flex;flex-direction:column;gap:3px}.config-header[data-v-655b6640]{display:flex;align-items:center;justify-content:space-between}.config-label[data-v-655b6640]{font-size:10px;text-transform:uppercase;letter-spacing:.5px;color:var(--color-text-muted)}.req-body[data-v-655b6640]{min-height:50px}.ep-section[data-v-655b6640]{display:flex;flex-direction:column;gap:4px}.ep-search[data-v-655b6640]{font-size:11px}.ep-list[data-v-655b6640]{max-height:180px;overflow-y:auto;background:var(--color-surface-base, #0f172a);border:1px solid var(--color-border-default);border-radius:4px}.ep-row[data-v-655b6640]{display:flex;align-items:center;gap:6px;padding:4px 8px;cursor:pointer;border-bottom:1px solid var(--color-surface-raised, #1e293b)}.ep-row[data-v-655b6640]:last-child{border-bottom:none}.ep-row[data-v-655b6640]:hover{background:color-mix(in srgb,var(--color-accent) 8%,transparent)}.ep-row.selected[data-v-655b6640]{background:color-mix(in srgb,var(--color-accent) 15%,transparent)}.ep-method[data-v-655b6640]{font-size:8px;font-weight:700;color:var(--color-surface-base, #0f172a);padding:1px 4px;border-radius:2px;font-family:ui-monospace,Consolas,monospace;flex-shrink:0}.ep-path[data-v-655b6640]{font-size:11px;font-family:ui-monospace,Consolas,monospace;color:var(--color-text-primary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ep-summary[data-v-655b6640]{font-size:10px;color:var(--color-text-muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin-left:auto}.probe-tree[data-v-655b6640]{background:var(--color-surface-base, #0f172a);border:1px solid var(--color-border-default);border-radius:4px;padding:6px;max-height:220px;overflow:auto}.probe-footer[data-v-655b6640]{display:flex;align-items:center;justify-content:space-between}.probe-count[data-v-655b6640]{font-size:10px;color:var(--color-success);font-weight:600}.probe-apply-btn[data-v-655b6640]{background:var(--color-success);color:var(--color-surface-base, #0f172a);border:none;border-radius:4px;padding:3px 12px;font-size:11px;font-weight:700;cursor:pointer}.probe-apply-btn[data-v-655b6640]:hover{opacity:.9}.probe-error[data-v-655b6640]{font-size:11px;color:var(--color-error)}.probe-raw[data-v-655b6640]{font-size:10px;color:var(--color-text-secondary);background:var(--color-surface-base, #0f172a);padding:6px;border-radius:4px;max-height:80px;overflow:auto;margin:0;white-space:pre-wrap;word-break:break-all}.mappings-section[data-v-655b6640]{padding-bottom:6px}.mappings-header[data-v-655b6640]{display:flex;align-items:center;justify-content:space-between;margin-bottom:4px}.mappings-header label[data-v-655b6640]{font-size:10px;text-transform:uppercase;letter-spacing:.5px;color:var(--color-text-muted);margin:0}.stale-badge[data-v-655b6640]{font-size:9px;font-weight:700;color:var(--color-error);background:color-mix(in srgb,var(--color-error) 12%,transparent);padding:1px 6px;border-radius:3px}.mappings-list[data-v-655b6640]{display:flex;flex-wrap:wrap;gap:3px}.mapping-tag[data-v-655b6640]{font-size:10px;font-family:ui-monospace,Consolas,monospace;background:color-mix(in srgb,var(--color-success) 12%,transparent);color:var(--color-success);padding:1px 6px;border-radius:3px}.mapping-tag.stale[data-v-655b6640]{background:color-mix(in srgb,var(--color-error) 12%,transparent);color:var(--color-error);text-decoration:line-through}.block-body[data-v-655b6640]{width:100%;min-height:100px;background:var(--color-surface-base, #0f172a);border:1px solid var(--color-border-default);color:var(--color-text-primary);padding:8px;border-radius:4px;font-family:ui-monospace,Consolas,monospace;font-size:11px;line-height:1.5;resize:vertical;outline:none;box-sizing:border-box}.block-body[data-v-655b6640]:focus{border-color:var(--color-accent)}.ai-header-btn[data-v-655b6640]{background:none;border:1px solid var(--color-border-default);color:var(--color-text-muted);font-size:12px;padding:2px 6px;border-radius:4px;cursor:pointer;transition:all .15s;flex-shrink:0}.ai-header-btn[data-v-655b6640]:hover{background:var(--color-surface-overlay);color:var(--color-text-primary)}.ai-header-btn.active[data-v-655b6640]{border-color:var(--color-accent);color:var(--color-accent)}.ai-header-btn[data-v-655b6640]:disabled{opacity:.4;cursor:default}.ai-header-btn.ai-analyze[data-v-655b6640]{font-size:11px}.ai-fix-btn[data-v-655b6640]{background:color-mix(in srgb,var(--color-accent) 15%,transparent);color:var(--color-accent);border:1px solid var(--color-accent);border-radius:4px;padding:2px 8px;font-size:10px;font-weight:700;cursor:pointer;margin-left:auto}.ai-fix-btn[data-v-655b6640]:hover{background:color-mix(in srgb,var(--color-accent) 25%,transparent)}.ai-fix-btn[data-v-655b6640]:disabled{opacity:.4;cursor:default}.insights-row[data-v-655b6640]{padding:4px 12px;border-bottom:1px solid var(--color-border-default);display:flex;flex-wrap:wrap;gap:4px}.insight-badge[data-v-655b6640]{font-size:10px;font-weight:600;padding:2px 8px;border-radius:4px;cursor:pointer;transition:opacity .15s}.insight-badge[data-v-655b6640]:hover{opacity:.8}.insight-badge.info[data-v-655b6640]{background:color-mix(in srgb,var(--color-accent) 15%,transparent);color:var(--color-accent)}.insight-badge.warning[data-v-655b6640]{background:color-mix(in srgb,var(--color-warning, #f9e2af) 15%,transparent);color:var(--color-warning, #f9e2af)}.insight-badge.error[data-v-655b6640]{background:color-mix(in srgb,var(--color-error) 15%,transparent);color:var(--color-error)}.insight-detail[data-v-655b6640]{padding:8px 12px;border-bottom:1px solid var(--color-border-default);background:var(--color-surface-base, #0f172a)}.insight-desc[data-v-655b6640]{font-size:11px;color:var(--color-text-secondary);line-height:1.4;margin:0 0 6px}.thinking-bar[data-v-655b6640]{display:flex;align-items:center;gap:8px;padding:6px 12px;border-bottom:1px solid var(--color-border-default);background:linear-gradient(90deg,#8b5cf60d,#8b5cf61a,#8b5cf60d);background-size:200% 100%;animation:thinking-shimmer-655b6640 2s ease-in-out infinite}@keyframes thinking-shimmer-655b6640{0%{background-position:200% 0}to{background-position:-200% 0}}.thinking-dot[data-v-655b6640]{width:6px;height:6px;border-radius:50%;background:var(--color-accent);animation:thinking-pulse-655b6640 1s ease-in-out infinite}@keyframes thinking-pulse-655b6640{0%,to{opacity:.4;transform:scale(.8)}50%{opacity:1;transform:scale(1.2)}}.thinking-text[data-v-655b6640]{font-size:10px;color:var(--color-accent);font-style:italic;transition:opacity .3s}.insight-suggestion-label[data-v-655b6640]{font-size:9px;color:var(--color-text-muted);margin:4px 0 2px;font-style:italic}.insight-actions[data-v-655b6640]{display:flex;align-items:center;gap:8px;margin-top:6px}.insight-apply[data-v-655b6640]{background:var(--color-accent);border:none;color:#fff;font-size:10px;cursor:pointer;padding:3px 10px;border-radius:6px;font-weight:500}.insight-apply[data-v-655b6640]:hover{opacity:.85}.insight-close[data-v-655b6640]{background:none;border:none;color:var(--color-text-muted);font-size:10px;cursor:pointer;padding:2px 0}.insight-close[data-v-655b6640]:hover{color:var(--color-text-primary)}.intent-textarea[data-v-655b6640]{width:100%;background:var(--color-surface-base, #0f172a);border:1px solid var(--color-border-default);color:var(--color-text-primary);padding:6px 8px;border-radius:4px;font-size:12px;font-family:inherit;resize:vertical;outline:none;box-sizing:border-box}.intent-textarea[data-v-655b6640]:focus{border-color:var(--color-accent)}.intent-actions[data-v-655b6640]{display:flex;justify-content:flex-end;margin-top:4px}.intent-generate-btn[data-v-655b6640]{background:var(--color-accent);color:var(--color-surface-base, #0f172a);border:none;border-radius:4px;padding:3px 12px;font-size:11px;font-weight:700;cursor:pointer}.intent-generate-btn[data-v-655b6640]:hover{opacity:.9}.intent-generate-btn[data-v-655b6640]:disabled{opacity:.4;cursor:default}.intent-error[data-v-655b6640]{font-size:11px;color:var(--color-error);margin-top:4px}.probe-ai-row[data-v-655b6640]{display:flex;justify-content:flex-end}.ai-suggest-btn[data-v-655b6640]{background:color-mix(in srgb,var(--color-accent) 15%,transparent);color:var(--color-accent);border:1px solid color-mix(in srgb,var(--color-accent) 30%,transparent);border-radius:4px;padding:2px 10px;font-size:10px;font-weight:700;cursor:pointer}.ai-suggest-btn[data-v-655b6640]:hover{background:color-mix(in srgb,var(--color-accent) 25%,transparent)}.ai-suggest-btn[data-v-655b6640]:disabled{opacity:.4;cursor:default}.auto-map-reasoning[data-v-655b6640]{font-size:10px;color:var(--color-text-secondary);background:color-mix(in srgb,var(--color-accent) 8%,transparent);padding:4px 8px;border-radius:4px;line-height:1.3}.sync-dot{width:8px;height:8px;border-radius:50%;display:inline-block}.sync-dot.synced{background:var(--color-success)}.sync-dot.dirty{background:var(--color-warning, #f9e2af)}.canvas-flow{background:var(--color-surface-base, #0f172a)!important}.canvas-flow .vue-flow__node{border:none!important;background:none!important;padding:0!important;border-radius:0!important}.canvas-flow .vue-flow__handle{width:10px;height:10px;background:var(--color-accent)!important;border:2px solid var(--color-surface-base, #0f172a)!important}.canvas-flow .vue-flow__edge-path{stroke-width:2}.canvas-flow .vue-flow__minimap{background:var(--color-surface-raised, #1e293b)!important}.canvas-flow .vue-flow__controls{background:var(--color-surface-raised, #1e293b)!important;border-color:var(--color-border-default)!important}.canvas-flow .vue-flow__controls-button{background:var(--color-surface-raised, #1e293b)!important;border-color:var(--color-border-default)!important;color:var(--color-text-primary)!important;fill:var(--color-text-primary)!important}.canvas-flow .vue-flow__controls-button:hover{background:var(--color-surface-overlay)!important}.canvas-ai-model-select{outline:none;font-family:ui-monospace,Consolas,monospace;max-width:180px}.canvas-ai-model-select option{background:var(--color-surface-raised, #1e293b);color:var(--color-text-primary)}
|