libre-webui 0.3.0 → 0.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,2 +1,2 @@
1
- import{j as e}from"./markdown-vendor-DRtqGHm3.js";import{r as s,c as _}from"./router-vendor-B-t91v39.js";import{c as t,B as n,o as c}from"../assets/index-BAlYrgVl.js";import{a1 as m,ac as Ye,ad as C,ae as Ze,af as ge,f as T,d as I,e as O,ag as me,X as S,E as Ke,ah as Qe,ai as Xe,C as Je,aj as ea,Z as aa,k as ta,ak as ra,al as sa,b as la,H as K,T as ia,t as da,am as pe,an as be,ao as oa,z as l}from"./ui-vendor-DA07XX1l.js";import"./react-vendor-N--QU9DW.js";import"./utils-vendor-DNzxLBGx.js";const na=()=>{const[x,fe]=s.useState([]),[h,ue]=s.useState([]),[$,ye]=s.useState([]),[G,Q]=s.useState(!1),[H,ke]=s.useState("all"),[z,je]=s.useState(""),[ve,X]=s.useState(!1),[k,E]=s.useState(""),[b,j]=s.useState(!1),[o,f]=s.useState(null),[J,v]=s.useState(null),[i,Ne]=s.useState(null),[we,Me]=s.useState(""),[Ce,V]=s.useState(!1),[Se,ee]=s.useState(!1),[ze,N]=s.useState(!1),[P,q]=s.useState(""),[w,ae]=s.useState(""),[W,te]=s.useState(!1),[Ee,F]=s.useState(!1),[M,re]=s.useState(""),[L,se]=s.useState(""),[U,le]=s.useState(!1),[Pe,Y]=s.useState(!1),[D,Fe]=s.useState(""),[R,Le]=s.useState(""),[A,ie]=s.useState(null),[Z,de]=s.useState(!1),[oe,De]=s.useState(null),[ne,B]=s.useState(null),[g,Re]=s.useState(new Set(["pull","local"])),u=a=>{Re(r=>{const d=new Set(r);return d.has(a)?d.delete(a):d.add(a),d})},y=async()=>{X(!0);try{const[a,r,d,Ue]=await Promise.all([c.getModels(),c.listRunningModels(),c.getVersion(),c.checkHealth()]);a.success&&fe(a.data||[]),r.success&&ue(Array.isArray(r.data)?r.data:[]),d.success&&d.data&&De(d.data.version),B(Ue.success)}catch(a){const r=a instanceof Error?a.message:String(a);l.error("Failed to load models: "+r),B(!1)}finally{X(!1)}},ce=async()=>{Q(!0);try{const a=await c.getLibraryModels();a.success&&a.data&&ye(a.data)}catch(a){console.error("Failed to load library models:",a)}finally{Q(!1)}};s.useEffect(()=>{y(),ce()},[]);const xe=async()=>{if(!k.trim()){l.error("Please enter a model name");return}j(!0),f({status:"starting"});try{const a=c.pullModelStream(k.trim(),r=>{f(r)},()=>{f(null),j(!1),v(null),l.success(`Model ${k} pulled successfully`),E(""),y()},r=>{f(null),j(!1),v(null),l.error("Failed to pull model: "+r)});v(()=>a)}catch(a){const r=a instanceof Error?a.message:String(a);l.error("Failed to pull model: "+r),f(null),j(!1),v(null)}},Ae=()=>{J&&(J(),v(null),j(!1),f(null),l.success("Model pull cancelled"))},Be=async a=>{if(confirm(`Are you sure you want to delete model "${a}"?`))try{await c.deleteModel(a),l.success(`Model ${a} deleted successfully`),await y()}catch(r){const d=r instanceof Error?r.message:String(r);l.error("Failed to delete model: "+d)}},_e=async a=>{ee(!0),Me(a),V(!0);try{const r=await c.showModel(a,!0);r.success&&r.data?Ne(r.data):l.error("Failed to load model details")}catch(r){const d=r instanceof Error?r.message:String(r);l.error("Failed to get model info: "+d)}finally{ee(!1)}},Te=async()=>{if(!P.trim()||!w.trim()){l.error("Please enter both source and destination names");return}te(!0);try{await c.copyModel(P.trim(),w.trim()),l.success(`Model copied to ${w}`),N(!1),q(""),ae(""),await y()}catch(a){const r=a instanceof Error?a.message:String(a);l.error("Failed to copy model: "+r)}finally{te(!1)}},Ie=async()=>{if(!M.trim()||!L.trim()){l.error("Please enter model name and Modelfile content");return}le(!0);try{await c.createModel({model:M.trim(),modelfile:L.trim()}),l.success(`Model ${M} created successfully`),F(!1),re(""),se(""),await y()}catch(a){const r=a instanceof Error?a.message:String(a);l.error("Failed to create model: "+r)}finally{le(!1)}},Oe=async()=>{if(!D.trim()||!R.trim()){l.error("Please select a model and enter text");return}de(!0),ie(null);try{const a=await c.generateEmbeddings({model:D.trim(),input:R.trim()});if(a.success&&a.data){const r=a.data.embeddings?.[0]||[];ie(r),l.success(`Generated ${r.length}-dimensional embedding vector`)}}catch(a){const r=a instanceof Error?a.message:String(a);l.error("Failed to generate embeddings: "+r)}finally{de(!1)}},p=a=>{const r=a/1073741824;return r>=1?`${r.toFixed(2)} GB`:`${(a/(1024*1024)).toFixed(1)} MB`},$e=a=>Array.isArray(h)&&h.some(r=>r.name===a),Ge=()=>x.reduce((a,r)=>a+r.size,0),He=()=>h.reduce((a,r)=>a+(r.size_vram||0),0),Ve=a=>x.some(r=>r.name===a||r.name.startsWith(a+":")),he=$.filter(a=>{const r=H==="all"||a.category===H,d=!z||a.name.toLowerCase().includes(z.toLowerCase())||a.description.toLowerCase().includes(z.toLowerCase());return r&&d}),qe=["all",...new Set($.map(a=>a.category))],We=[{name:"deepseek-r1",category:"reasoning",size:"7B"},{name:"llama3.2",category:"general",size:"3B"},{name:"gemma3",category:"general",size:"4B"},{name:"qwen2.5",category:"general",size:"7B"},{name:"mistral",category:"general",size:"7B"},{name:"codellama",category:"coding",size:"7B"},{name:"nomic-embed-text",category:"embedding",size:"137M"},{name:"llava",category:"vision",size:"7B"},{name:"phi3",category:"general",size:"3.8B"},{name:"gemma2",category:"general",size:"9B"}];return ve?e.jsx("div",{className:"flex items-center justify-center p-8",children:e.jsxs("div",{className:"flex items-center gap-3 text-gray-600 dark:text-dark-600 ophelia:text-[#a3a3a3]",children:[e.jsx(m,{className:"h-5 w-5 animate-spin"}),"Loading models..."]})}):e.jsxs("div",{className:"space-y-4",children:[e.jsx("div",{className:t("rounded-xl p-4 border","bg-white dark:bg-dark-100 ophelia:bg-[#0a0a0a]","border-gray-200 dark:border-dark-300 ophelia:border-[#1a1a1a]"),children:e.jsxs("div",{className:"flex flex-wrap items-center justify-between gap-4",children:[e.jsxs("div",{className:"flex items-center gap-6",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("div",{className:t("w-2.5 h-2.5 rounded-full",ne?"bg-green-500 ophelia:bg-[#4ade80]":"bg-red-500 ophelia:bg-[#f87171]")}),e.jsx("span",{className:"text-sm font-medium text-gray-700 dark:text-gray-300 ophelia:text-[#e5e5e5]",children:ne?"Ollama Online":"Ollama Offline"})]}),oe&&e.jsxs("div",{className:"flex items-center gap-2 text-sm text-gray-600 dark:text-gray-400 ophelia:text-[#a3a3a3]",children:[e.jsx(Ye,{className:"h-4 w-4"}),e.jsxs("span",{children:["v",oe]})]}),e.jsxs("div",{className:"flex items-center gap-2 text-sm text-gray-600 dark:text-gray-400 ophelia:text-[#a3a3a3]",children:[e.jsx(C,{className:"h-4 w-4"}),e.jsxs("span",{children:[x.length," model",x.length!==1?"s":""]})]}),e.jsxs("div",{className:"flex items-center gap-2 text-sm text-gray-600 dark:text-gray-400 ophelia:text-[#a3a3a3]",children:[e.jsx(Ze,{className:"h-4 w-4"}),e.jsx("span",{children:p(Ge())})]}),h.length>0&&e.jsxs("div",{className:"flex items-center gap-2 text-sm text-green-600 dark:text-green-400 ophelia:text-[#4ade80]",children:[e.jsx(ge,{className:"h-4 w-4"}),e.jsxs("span",{children:[h.length," running (",p(He())," ","VRAM)"]})]})]}),e.jsx("div",{className:"flex items-center gap-2",children:e.jsxs(n,{onClick:y,variant:"outline",size:"sm",className:t("gap-1.5","ophelia:border-[#262626] ophelia:text-[#a3a3a3]","ophelia:hover:bg-[#1a1a1a] ophelia:hover:text-[#fafafa]"),children:[e.jsx(m,{className:"h-3.5 w-3.5"}),"Refresh"]})})]})}),e.jsxs("div",{className:t("rounded-xl border overflow-hidden","bg-white dark:bg-dark-100 ophelia:bg-[#0a0a0a]","border-gray-200 dark:border-dark-300 ophelia:border-[#1a1a1a]"),children:[e.jsxs("button",{onClick:()=>u("pull"),className:t("w-full flex items-center justify-between p-4","hover:bg-gray-50 dark:hover:bg-dark-50 ophelia:hover:bg-[#121212]","transition-colors"),children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("div",{className:t("p-2 rounded-lg","bg-primary-100 dark:bg-primary-900/30 ophelia:bg-[#9333ea]/20"),children:e.jsx(T,{className:"h-5 w-5 text-primary-600 dark:text-primary-400 ophelia:text-[#a855f7]"})}),e.jsx("h3",{className:"text-lg font-semibold text-gray-900 dark:text-dark-800 ophelia:text-[#fafafa]",children:"Pull New Model"})]}),g.has("pull")?e.jsx(I,{className:"h-5 w-5 text-gray-500 ophelia:text-[#737373]"}):e.jsx(O,{className:"h-5 w-5 text-gray-500 ophelia:text-[#737373]"})]}),g.has("pull")&&e.jsxs("div",{className:"p-4 pt-0 space-y-4",children:[e.jsxs("div",{className:"flex gap-2",children:[e.jsxs("div",{className:"relative flex-1",children:[e.jsx(me,{className:"absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-gray-400 dark:text-gray-500 ophelia:text-[#525252]"}),e.jsx("input",{type:"text",value:k,onChange:a=>E(a.target.value),placeholder:"Enter model name (e.g., llama3.2:3b, deepseek-r1:14b)",className:t("w-full pl-10 pr-4 py-2.5 rounded-lg border text-sm","bg-gray-50 dark:bg-dark-50 ophelia:bg-[#121212]","border-gray-200 dark:border-dark-300 ophelia:border-[#262626]","text-gray-900 dark:text-dark-700 ophelia:text-[#fafafa]","placeholder-gray-500 dark:placeholder-gray-400 ophelia:placeholder-[#525252]","focus:outline-none focus:ring-2 focus:ring-primary-500/20 ophelia:focus:ring-[#9333ea]/20","focus:border-primary-500 ophelia:focus:border-[#9333ea]"),disabled:b,onKeyDown:a=>a.key==="Enter"&&!b&&xe()})]}),b?e.jsxs(n,{onClick:Ae,variant:"outline",className:t("px-4 py-2.5 gap-2","text-red-600 hover:text-red-700 dark:text-red-400 dark:hover:text-red-300","ophelia:text-[#f87171] ophelia:hover:text-[#fca5a5]","ophelia:border-[#262626] ophelia:hover:bg-[#1a1a1a]"),children:[e.jsx(S,{className:"h-4 w-4"}),"Cancel"]}):e.jsxs(n,{onClick:xe,disabled:!k.trim(),className:t("px-4 py-2.5 gap-2","ophelia:bg-[#9333ea] ophelia:hover:bg-[#7c3aed] ophelia:text-white"),children:[e.jsx(T,{className:"h-4 w-4"}),"Pull"]})]}),b&&o&&e.jsxs("div",{className:t("p-4 rounded-lg border","bg-gray-50 dark:bg-dark-200 ophelia:bg-[#121212]","border-gray-200 dark:border-dark-300 ophelia:border-[#262626]"),children:[e.jsxs("div",{className:"flex items-center justify-between mb-2",children:[e.jsx("span",{className:"text-sm font-medium text-gray-800 dark:text-dark-700 ophelia:text-[#e5e5e5]",children:o.status==="starting"?"Initializing...":o.status==="pulling"?"Downloading model...":o.status==="verifying sha256"?"Verifying integrity...":o.status==="writing manifest"?"Writing manifest...":o.status==="removing any unused layers"?"Cleaning up...":o.status}),o.percent!==void 0&&e.jsxs("span",{className:"text-sm font-mono text-gray-600 dark:text-dark-600 ophelia:text-[#a3a3a3]",children:[o.percent,"%"]})]}),o.percent!==void 0&&e.jsx("div",{className:"w-full bg-gray-200 dark:bg-dark-400 ophelia:bg-[#262626] rounded-full h-2 overflow-hidden",children:e.jsx("div",{className:t("h-2 rounded-full transition-all duration-300","bg-primary-500 dark:bg-primary-400 ophelia:bg-[#9333ea]"),style:{width:`${o.percent}%`}})}),o.total&&o.completed&&e.jsxs("div",{className:"mt-2 text-xs text-gray-600 dark:text-dark-600 ophelia:text-[#737373]",children:[p(o.completed)," /"," ",p(o.total)]})]}),e.jsxs("div",{children:[e.jsx("p",{className:"text-xs font-medium text-gray-500 dark:text-gray-400 ophelia:text-[#737373] mb-2",children:"Popular models:"}),e.jsx("div",{className:"flex flex-wrap gap-2",children:We.map(a=>e.jsxs("button",{onClick:()=>E(a.name),disabled:b,className:t("px-3 py-1.5 rounded-full text-xs font-medium transition-colors","bg-gray-100 dark:bg-dark-200 ophelia:bg-[#1a1a1a]","text-gray-700 dark:text-gray-300 ophelia:text-[#a3a3a3]","hover:bg-gray-200 dark:hover:bg-dark-300 ophelia:hover:bg-[#262626]","border border-gray-200 dark:border-dark-300 ophelia:border-[#262626]","disabled:opacity-50 disabled:cursor-not-allowed"),children:[a.name,e.jsx("span",{className:"ml-1 text-gray-400 dark:text-gray-500 ophelia:text-[#525252]",children:a.size})]},a.name))})]}),e.jsxs("a",{href:"https://ollama.com/library",target:"_blank",rel:"noopener noreferrer",className:t("inline-flex items-center gap-1.5 text-xs","text-primary-600 dark:text-primary-400 ophelia:text-[#a855f7]","hover:underline"),children:[e.jsx(Ke,{className:"h-3 w-3"}),"Browse all models on ollama.com"]})]})]}),e.jsxs("div",{className:t("rounded-xl border overflow-hidden","bg-white dark:bg-dark-100 ophelia:bg-[#0a0a0a]","border-gray-200 dark:border-dark-300 ophelia:border-[#1a1a1a]"),children:[e.jsxs("button",{onClick:()=>u("library"),className:t("w-full flex items-center justify-between p-4","hover:bg-gray-50 dark:hover:bg-dark-50 ophelia:hover:bg-[#121212]","transition-colors"),children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("div",{className:t("p-2 rounded-lg","bg-cyan-100 dark:bg-cyan-900/30 ophelia:bg-[#06b6d4]/20"),children:e.jsx(Qe,{className:"h-5 w-5 text-cyan-600 dark:text-cyan-400 ophelia:text-[#22d3ee]"})}),e.jsx("h3",{className:"text-lg font-semibold text-gray-900 dark:text-dark-800 ophelia:text-[#fafafa]",children:"Browse Library"}),e.jsxs("span",{className:t("px-2 py-0.5 rounded-full text-xs font-medium","bg-gray-100 dark:bg-dark-200 ophelia:bg-[#1a1a1a]","text-gray-600 dark:text-gray-400 ophelia:text-[#a3a3a3]"),children:[$.length," available"]})]}),g.has("library")?e.jsx(I,{className:"h-5 w-5 text-gray-500 ophelia:text-[#737373]"}):e.jsx(O,{className:"h-5 w-5 text-gray-500 ophelia:text-[#737373]"})]}),g.has("library")&&e.jsxs("div",{className:"p-4 pt-0 space-y-4",children:[e.jsxs("div",{className:"flex flex-col sm:flex-row gap-3",children:[e.jsxs("div",{className:"relative flex-1",children:[e.jsx(me,{className:"absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-gray-400 dark:text-gray-500 ophelia:text-[#525252]"}),e.jsx("input",{type:"text",value:z,onChange:a=>je(a.target.value),placeholder:"Search models...",className:t("w-full pl-10 pr-4 py-2 rounded-lg border text-sm","bg-gray-50 dark:bg-dark-50 ophelia:bg-[#121212]","border-gray-200 dark:border-dark-300 ophelia:border-[#262626]","text-gray-900 dark:text-dark-700 ophelia:text-[#fafafa]","placeholder-gray-500 dark:placeholder-gray-400 ophelia:placeholder-[#525252]","focus:outline-none focus:ring-2 focus:ring-primary-500/20 ophelia:focus:ring-[#9333ea]/20","focus:border-primary-500 ophelia:focus:border-[#9333ea]")})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(Xe,{className:"h-4 w-4 text-gray-400 ophelia:text-[#525252]"}),e.jsx("div",{className:"flex flex-wrap gap-1",children:qe.map(a=>e.jsx("button",{onClick:()=>ke(a),className:t("px-2.5 py-1 rounded-full text-xs font-medium transition-colors",H===a?"bg-primary-100 dark:bg-primary-900/30 ophelia:bg-[#9333ea]/20 text-primary-700 dark:text-primary-400 ophelia:text-[#a855f7]":"bg-gray-100 dark:bg-dark-200 ophelia:bg-[#1a1a1a] text-gray-600 dark:text-gray-400 ophelia:text-[#a3a3a3] hover:bg-gray-200 dark:hover:bg-dark-300 ophelia:hover:bg-[#262626]"),children:a.charAt(0).toUpperCase()+a.slice(1)},a))})]})]}),G?e.jsx("div",{className:"flex items-center justify-center py-8",children:e.jsx(m,{className:"h-5 w-5 animate-spin text-gray-400 ophelia:text-[#737373]"})}):he.length===0?e.jsx("div",{className:"text-center py-8 text-gray-500 ophelia:text-[#737373]",children:"No models found matching your criteria"}):e.jsx("div",{className:"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-3",children:he.map(a=>{const r=Ve(a.name);return e.jsxs("div",{className:t("p-4 rounded-lg border transition-all","bg-gray-50 dark:bg-dark-50 ophelia:bg-[#121212]",r?"border-green-200 dark:border-green-800/50 ophelia:border-[#22c55e]/30":"border-gray-200 dark:border-dark-300 ophelia:border-[#1a1a1a]","hover:shadow-md hover:border-gray-300 dark:hover:border-dark-400 ophelia:hover:border-[#262626]"),children:[e.jsxs("div",{className:"flex items-start justify-between gap-2 mb-2",children:[e.jsx("h4",{className:"font-medium text-gray-900 dark:text-dark-800 ophelia:text-[#fafafa]",children:a.name}),r&&e.jsxs("span",{className:t("flex items-center gap-1 px-1.5 py-0.5 rounded text-xs","bg-green-100 dark:bg-green-900/30 ophelia:bg-[#22c55e]/20","text-green-700 dark:text-green-400 ophelia:text-[#4ade80]"),children:[e.jsx(Je,{className:"h-3 w-3"}),"Installed"]})]}),e.jsx("p",{className:"text-xs text-gray-600 dark:text-dark-600 ophelia:text-[#a3a3a3] mb-3 line-clamp-2",children:a.description}),e.jsxs("div",{className:"flex flex-wrap gap-1.5 mb-3",children:[a.sizes.slice(0,4).map(d=>e.jsx("span",{className:t("px-1.5 py-0.5 rounded text-xs","bg-gray-200 dark:bg-dark-300 ophelia:bg-[#262626]","text-gray-600 dark:text-gray-400 ophelia:text-[#a3a3a3]"),children:d},d)),a.sizes.length>4&&e.jsxs("span",{className:"text-xs text-gray-400 ophelia:text-[#737373]",children:["+",a.sizes.length-4," more"]})]}),e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{className:"flex items-center gap-2 text-xs text-gray-500 ophelia:text-[#737373]",children:[a.pulls&&e.jsxs("span",{className:"flex items-center gap-1",children:[e.jsx(T,{className:"h-3 w-3"}),a.pulls]}),e.jsx("span",{className:t("px-1.5 py-0.5 rounded capitalize","bg-gray-100 dark:bg-dark-200 ophelia:bg-[#1a1a1a]"),children:a.category})]}),e.jsxs(n,{onClick:()=>{E(a.name),u("pull"),g.has("pull")||u("pull")},variant:"outline",size:"sm",disabled:b,className:t("gap-1 text-xs","ophelia:border-[#262626] ophelia:text-[#a3a3a3]","ophelia:hover:bg-[#1a1a1a] ophelia:hover:text-[#fafafa]"),children:[e.jsx(T,{className:"h-3 w-3"}),"Pull"]})]})]},a.name)})}),e.jsx("div",{className:"flex justify-center",children:e.jsxs(n,{onClick:ce,variant:"outline",size:"sm",disabled:G,className:t("gap-1.5","ophelia:border-[#262626] ophelia:text-[#a3a3a3]","ophelia:hover:bg-[#1a1a1a] ophelia:hover:text-[#fafafa]"),children:[e.jsx(m,{className:t("h-3.5 w-3.5",G&&"animate-spin")}),"Refresh Library"]})})]})]}),Array.isArray(h)&&h.length>0&&e.jsxs("div",{className:t("rounded-xl p-4 border","bg-white dark:bg-dark-100 ophelia:bg-[#0a0a0a]","border-gray-200 dark:border-dark-300 ophelia:border-[#1a1a1a]"),children:[e.jsxs("div",{className:"flex items-center gap-3 mb-4",children:[e.jsx("div",{className:t("p-2 rounded-lg","bg-green-100 dark:bg-green-900/30 ophelia:bg-[#22c55e]/20"),children:e.jsx(ge,{className:"h-5 w-5 text-green-600 dark:text-green-400 ophelia:text-[#4ade80]"})}),e.jsx("h3",{className:"text-lg font-semibold text-gray-900 dark:text-dark-800 ophelia:text-[#fafafa]",children:"Running Models"}),e.jsxs("span",{className:t("ml-auto px-2 py-0.5 rounded-full text-xs font-medium","bg-green-100 dark:bg-green-900/30 ophelia:bg-[#22c55e]/20","text-green-700 dark:text-green-400 ophelia:text-[#4ade80]"),children:[h.length," active"]})]}),e.jsx("div",{className:"space-y-2",children:h.map(a=>e.jsxs("div",{className:t("flex items-center justify-between p-4 rounded-lg border","bg-green-50 dark:bg-green-900/10 ophelia:bg-[#22c55e]/5","border-green-200 dark:border-green-800/50 ophelia:border-[#22c55e]/20"),children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("div",{className:t("w-2 h-2 rounded-full animate-pulse","bg-green-500 ophelia:bg-[#4ade80]")}),e.jsxs("div",{children:[e.jsx("div",{className:"font-medium text-green-800 dark:text-green-400 ophelia:text-[#4ade80]",children:a.name}),e.jsxs("div",{className:"flex items-center gap-3 text-sm text-green-600 dark:text-green-500 ophelia:text-[#22c55e]/80",children:[e.jsxs("span",{className:"flex items-center gap-1",children:[e.jsx(ea,{className:"h-3 w-3"}),"VRAM: ",p(a.size_vram||0)]}),a.size&&e.jsxs("span",{className:"flex items-center gap-1",children:[e.jsx(C,{className:"h-3 w-3"}),"Size: ",p(a.size)]})]})]})]}),e.jsxs("div",{className:t("flex items-center gap-1.5 px-2 py-1 rounded-full text-xs font-medium","bg-green-100 dark:bg-green-900/30 ophelia:bg-[#22c55e]/10","text-green-700 dark:text-green-400 ophelia:text-[#4ade80]"),children:[e.jsx(aa,{className:"h-3 w-3"}),"Active"]})]},a.name))})]}),e.jsxs("div",{className:t("rounded-xl border overflow-hidden","bg-white dark:bg-dark-100 ophelia:bg-[#0a0a0a]","border-gray-200 dark:border-dark-300 ophelia:border-[#1a1a1a]"),children:[e.jsxs("button",{onClick:()=>u("local"),className:t("w-full flex items-center justify-between p-4","hover:bg-gray-50 dark:hover:bg-dark-50 ophelia:hover:bg-[#121212]","transition-colors"),children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("div",{className:t("p-2 rounded-lg","bg-blue-100 dark:bg-blue-900/30 ophelia:bg-[#a855f7]/20"),children:e.jsx(C,{className:"h-5 w-5 text-blue-600 dark:text-blue-400 ophelia:text-[#a855f7]"})}),e.jsx("h3",{className:"text-lg font-semibold text-gray-900 dark:text-dark-800 ophelia:text-[#fafafa]",children:"Local Models"}),e.jsxs("span",{className:t("px-2 py-0.5 rounded-full text-xs font-medium","bg-gray-100 dark:bg-dark-200 ophelia:bg-[#1a1a1a]","text-gray-600 dark:text-gray-400 ophelia:text-[#a3a3a3]"),children:[x.length," installed"]})]}),g.has("local")?e.jsx(I,{className:"h-5 w-5 text-gray-500 ophelia:text-[#737373]"}):e.jsx(O,{className:"h-5 w-5 text-gray-500 ophelia:text-[#737373]"})]}),g.has("local")&&e.jsx("div",{className:"p-4 pt-0",children:x.length===0?e.jsxs("div",{className:t("text-center py-12 rounded-lg border-2 border-dashed","border-gray-200 dark:border-dark-300 ophelia:border-[#262626]"),children:[e.jsx(C,{className:"h-12 w-12 mx-auto mb-3 text-gray-300 dark:text-gray-600 ophelia:text-[#525252]"}),e.jsx("p",{className:"text-gray-600 dark:text-dark-600 ophelia:text-[#737373] mb-2",children:"No models installed yet"}),e.jsx("p",{className:"text-sm text-gray-500 dark:text-gray-500 ophelia:text-[#525252]",children:"Pull a model above to get started"})]}):e.jsx("div",{className:"space-y-3",children:x.map(a=>e.jsx("div",{className:t("p-4 rounded-lg border transition-colors","bg-gray-50 dark:bg-dark-50 ophelia:bg-[#121212]","border-gray-200 dark:border-dark-300 ophelia:border-[#1a1a1a]","hover:bg-gray-100 dark:hover:bg-dark-200 ophelia:hover:bg-[#1a1a1a]"),children:e.jsxs("div",{className:"flex items-start justify-between gap-4",children:[e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsxs("div",{className:"flex items-center gap-2 flex-wrap",children:[e.jsx("h4",{className:"font-medium text-gray-900 dark:text-dark-800 ophelia:text-[#fafafa]",children:a.name}),$e(a.name)&&e.jsxs("span",{className:t("inline-flex items-center gap-1 px-2 py-0.5 rounded-full text-xs font-medium","bg-green-100 dark:bg-green-900/30 ophelia:bg-[#22c55e]/20","text-green-700 dark:text-green-400 ophelia:text-[#4ade80]"),children:[e.jsx("span",{className:"w-1.5 h-1.5 rounded-full bg-green-500 ophelia:bg-[#4ade80] animate-pulse"}),"Running"]})]}),e.jsxs("div",{className:"flex flex-wrap gap-x-4 gap-y-1 text-sm text-gray-600 dark:text-dark-600 ophelia:text-[#a3a3a3] mt-2",children:[e.jsxs("span",{className:"flex items-center gap-1",children:[e.jsx(C,{className:"h-3.5 w-3.5"}),p(a.size)]}),a.details?.parameter_size&&e.jsxs("span",{className:"flex items-center gap-1",children:[e.jsx(ta,{className:"h-3.5 w-3.5"}),a.details.parameter_size]}),a.details?.quantization_level&&e.jsx("span",{className:t("px-1.5 py-0.5 rounded text-xs","bg-gray-200 dark:bg-dark-300 ophelia:bg-[#262626]","text-gray-600 dark:text-gray-400 ophelia:text-[#a3a3a3]"),children:a.details.quantization_level}),a.details?.family&&e.jsx("span",{className:"text-gray-500 dark:text-gray-500 ophelia:text-[#737373]",children:a.details.family})]}),e.jsxs("div",{className:"flex items-center gap-3 text-xs text-gray-400 dark:text-dark-500 ophelia:text-[#525252] mt-2",children:[e.jsxs("span",{className:"flex items-center gap-1",children:[e.jsx(ra,{className:"h-3 w-3"}),new Date(a.modified_at).toLocaleDateString()]}),e.jsxs("span",{className:"flex items-center gap-1 font-mono truncate max-w-[200px]",title:a.digest,children:[e.jsx(sa,{className:"h-3 w-3"}),a.digest.slice(0,12),"..."]})]})]}),e.jsxs("div",{className:"flex gap-2 flex-shrink-0",children:[e.jsxs(n,{onClick:()=>_e(a.name),variant:"outline",size:"sm",className:t("gap-1.5","ophelia:border-[#262626] ophelia:text-[#a3a3a3]","ophelia:hover:bg-[#1a1a1a] ophelia:hover:text-[#fafafa]"),children:[e.jsx(la,{className:"h-3.5 w-3.5"}),"Info"]}),e.jsxs(n,{onClick:()=>{q(a.name),N(!0)},variant:"outline",size:"sm",className:t("gap-1.5","ophelia:border-[#262626] ophelia:text-[#a3a3a3]","ophelia:hover:bg-[#1a1a1a] ophelia:hover:text-[#fafafa]"),children:[e.jsx(K,{className:"h-3.5 w-3.5"}),"Copy"]}),e.jsxs(n,{onClick:()=>Be(a.name),variant:"outline",size:"sm",className:t("gap-1.5","text-red-600 hover:text-red-700 dark:text-red-400 dark:hover:text-red-300","ophelia:text-[#f87171] ophelia:hover:text-[#fca5a5]","ophelia:border-[#262626] ophelia:hover:bg-[#1a1a1a]"),children:[e.jsx(ia,{className:"h-3.5 w-3.5"}),"Delete"]})]})]})},a.name))})})]}),e.jsxs("div",{className:t("rounded-xl border overflow-hidden","bg-white dark:bg-dark-100 ophelia:bg-[#0a0a0a]","border-gray-200 dark:border-dark-300 ophelia:border-[#1a1a1a]"),children:[e.jsxs("button",{onClick:()=>u("advanced"),className:t("w-full flex items-center justify-between p-4","hover:bg-gray-50 dark:hover:bg-dark-50 ophelia:hover:bg-[#121212]","transition-colors"),children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("div",{className:t("p-2 rounded-lg","bg-amber-100 dark:bg-amber-900/30 ophelia:bg-[#f59e0b]/20"),children:e.jsx(da,{className:"h-5 w-5 text-amber-600 dark:text-amber-400 ophelia:text-[#fbbf24]"})}),e.jsx("h3",{className:"text-lg font-semibold text-gray-900 dark:text-dark-800 ophelia:text-[#fafafa]",children:"Advanced Actions"})]}),g.has("advanced")?e.jsx(I,{className:"h-5 w-5 text-gray-500 ophelia:text-[#737373]"}):e.jsx(O,{className:"h-5 w-5 text-gray-500 ophelia:text-[#737373]"})]}),g.has("advanced")&&e.jsx("div",{className:"p-4 pt-0",children:e.jsxs("div",{className:"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-3",children:[e.jsxs(n,{onClick:()=>F(!0),variant:"outline",className:t("w-full gap-2 justify-start h-auto py-3 px-4","ophelia:border-[#262626] ophelia:text-[#a3a3a3]","ophelia:hover:bg-[#1a1a1a] ophelia:hover:text-[#fafafa]"),children:[e.jsx(pe,{className:"h-5 w-5 text-purple-500 ophelia:text-[#a855f7]"}),e.jsxs("div",{className:"text-left",children:[e.jsx("div",{className:"font-medium",children:"Create Model"}),e.jsx("div",{className:"text-xs opacity-70",children:"From Modelfile"})]})]}),e.jsxs(n,{onClick:()=>N(!0),variant:"outline",className:t("w-full gap-2 justify-start h-auto py-3 px-4","ophelia:border-[#262626] ophelia:text-[#a3a3a3]","ophelia:hover:bg-[#1a1a1a] ophelia:hover:text-[#fafafa]"),children:[e.jsx(K,{className:"h-5 w-5 text-blue-500 ophelia:text-[#60a5fa]"}),e.jsxs("div",{className:"text-left",children:[e.jsx("div",{className:"font-medium",children:"Copy Model"}),e.jsx("div",{className:"text-xs opacity-70",children:"Duplicate existing"})]})]}),e.jsxs(n,{onClick:()=>Y(!0),variant:"outline",className:t("w-full gap-2 justify-start h-auto py-3 px-4","ophelia:border-[#262626] ophelia:text-[#a3a3a3]","ophelia:hover:bg-[#1a1a1a] ophelia:hover:text-[#fafafa]"),children:[e.jsx(be,{className:"h-5 w-5 text-green-500 ophelia:text-[#4ade80]"}),e.jsxs("div",{className:"text-left",children:[e.jsx("div",{className:"font-medium",children:"Test Embeddings"}),e.jsx("div",{className:"text-xs opacity-70",children:"Generate vectors"})]})]}),e.jsxs(n,{onClick:async()=>{try{(await c.checkHealth()).success&&(B(!0),l.success("Ollama is healthy!"))}catch{B(!1),l.error("Ollama health check failed")}},variant:"outline",className:t("w-full gap-2 justify-start h-auto py-3 px-4","ophelia:border-[#262626] ophelia:text-[#a3a3a3]","ophelia:hover:bg-[#1a1a1a] ophelia:hover:text-[#fafafa]"),children:[e.jsx(oa,{className:"h-5 w-5 text-rose-500 ophelia:text-[#fb7185]"}),e.jsxs("div",{className:"text-left",children:[e.jsx("div",{className:"font-medium",children:"Health Check"}),e.jsx("div",{className:"text-xs opacity-70",children:"Test connection"})]})]})]})})]}),Ce&&_.createPortal(e.jsxs("div",{className:"fixed inset-0 z-[999999] flex items-center justify-center p-4",children:[e.jsx("div",{className:"absolute inset-0 bg-black/50 backdrop-blur-sm",onClick:()=>V(!1)}),e.jsxs("div",{className:t("relative w-full max-w-2xl max-h-[85vh] overflow-hidden rounded-xl border shadow-2xl","bg-white dark:bg-dark-100 ophelia:bg-[#0a0a0a]","border-gray-200 dark:border-dark-300 ophelia:border-[#1a1a1a]"),children:[e.jsxs("div",{className:t("flex items-center justify-between p-4 border-b","border-gray-200 dark:border-dark-300 ophelia:border-[#1a1a1a]"),children:[e.jsxs("h3",{className:"text-lg font-semibold text-gray-900 dark:text-gray-100 ophelia:text-[#fafafa]",children:["Model Details: ",we]}),e.jsx("button",{onClick:()=>V(!1),className:"p-1.5 rounded-lg hover:bg-gray-100 dark:hover:bg-dark-200 ophelia:hover:bg-[#1a1a1a]",children:e.jsx(S,{className:"h-5 w-5 text-gray-500 ophelia:text-[#737373]"})})]}),e.jsx("div",{className:"overflow-y-auto max-h-[calc(85vh-60px)] p-4 space-y-4",children:Se?e.jsx("div",{className:"flex items-center justify-center py-8",children:e.jsx(m,{className:"h-6 w-6 animate-spin text-gray-400 ophelia:text-[#737373]"})}):i?e.jsxs(e.Fragment,{children:[i.details&&e.jsxs("div",{children:[e.jsx("h4",{className:"text-sm font-medium text-gray-700 dark:text-gray-300 ophelia:text-[#a3a3a3] mb-2",children:"Model Information"}),e.jsx("div",{className:t("p-3 rounded-lg text-sm","bg-gray-50 dark:bg-dark-50 ophelia:bg-[#121212]"),children:e.jsxs("div",{className:"grid grid-cols-2 gap-2",children:[i.details.family&&e.jsxs("div",{children:[e.jsx("span",{className:"text-gray-500 ophelia:text-[#737373]",children:"Family:"})," ",e.jsx("span",{className:"text-gray-900 dark:text-gray-100 ophelia:text-[#fafafa]",children:i.details.family})]}),i.details.parameter_size&&e.jsxs("div",{children:[e.jsx("span",{className:"text-gray-500 ophelia:text-[#737373]",children:"Parameters:"})," ",e.jsx("span",{className:"text-gray-900 dark:text-gray-100 ophelia:text-[#fafafa]",children:i.details.parameter_size})]}),i.details.quantization_level&&e.jsxs("div",{children:[e.jsx("span",{className:"text-gray-500 ophelia:text-[#737373]",children:"Quantization:"})," ",e.jsx("span",{className:"text-gray-900 dark:text-gray-100 ophelia:text-[#fafafa]",children:i.details.quantization_level})]}),i.details.format&&e.jsxs("div",{children:[e.jsx("span",{className:"text-gray-500 ophelia:text-[#737373]",children:"Format:"})," ",e.jsx("span",{className:"text-gray-900 dark:text-gray-100 ophelia:text-[#fafafa]",children:i.details.format})]})]})})]}),i.system&&e.jsxs("div",{children:[e.jsx("h4",{className:"text-sm font-medium text-gray-700 dark:text-gray-300 ophelia:text-[#a3a3a3] mb-2",children:"System Prompt"}),e.jsx("pre",{className:t("p-3 rounded-lg text-xs overflow-x-auto","bg-gray-50 dark:bg-dark-50 ophelia:bg-[#121212]","text-gray-700 dark:text-gray-300 ophelia:text-[#e5e5e5]"),children:i.system})]}),i.template&&e.jsxs("div",{children:[e.jsx("h4",{className:"text-sm font-medium text-gray-700 dark:text-gray-300 ophelia:text-[#a3a3a3] mb-2",children:"Template"}),e.jsx("pre",{className:t("p-3 rounded-lg text-xs overflow-x-auto max-h-40","bg-gray-50 dark:bg-dark-50 ophelia:bg-[#121212]","text-gray-700 dark:text-gray-300 ophelia:text-[#e5e5e5]"),children:i.template})]}),i.parameters&&e.jsxs("div",{children:[e.jsx("h4",{className:"text-sm font-medium text-gray-700 dark:text-gray-300 ophelia:text-[#a3a3a3] mb-2",children:"Parameters"}),e.jsx("pre",{className:t("p-3 rounded-lg text-xs overflow-x-auto","bg-gray-50 dark:bg-dark-50 ophelia:bg-[#121212]","text-gray-700 dark:text-gray-300 ophelia:text-[#e5e5e5]"),children:i.parameters})]}),i.license&&e.jsxs("div",{children:[e.jsx("h4",{className:"text-sm font-medium text-gray-700 dark:text-gray-300 ophelia:text-[#a3a3a3] mb-2",children:"License"}),e.jsx("pre",{className:t("p-3 rounded-lg text-xs overflow-x-auto max-h-32","bg-gray-50 dark:bg-dark-50 ophelia:bg-[#121212]","text-gray-700 dark:text-gray-300 ophelia:text-[#e5e5e5]"),children:i.license})]}),i.modelfile&&e.jsxs("div",{children:[e.jsx("h4",{className:"text-sm font-medium text-gray-700 dark:text-gray-300 ophelia:text-[#a3a3a3] mb-2",children:"Modelfile"}),e.jsx("pre",{className:t("p-3 rounded-lg text-xs overflow-x-auto max-h-60","bg-gray-50 dark:bg-dark-50 ophelia:bg-[#121212]","text-gray-700 dark:text-gray-300 ophelia:text-[#e5e5e5]"),children:i.modelfile})]})]}):e.jsx("p",{className:"text-center text-gray-500 ophelia:text-[#737373]",children:"No details available"})})]})]}),document.body),ze&&_.createPortal(e.jsxs("div",{className:"fixed inset-0 z-[999999] flex items-center justify-center p-4",children:[e.jsx("div",{className:"absolute inset-0 bg-black/50 backdrop-blur-sm",onClick:()=>N(!1)}),e.jsxs("div",{className:t("relative w-full max-w-md rounded-xl border shadow-2xl","bg-white dark:bg-dark-100 ophelia:bg-[#0a0a0a]","border-gray-200 dark:border-dark-300 ophelia:border-[#1a1a1a]"),children:[e.jsxs("div",{className:t("flex items-center justify-between p-4 border-b","border-gray-200 dark:border-dark-300 ophelia:border-[#1a1a1a]"),children:[e.jsx("h3",{className:"text-lg font-semibold text-gray-900 dark:text-gray-100 ophelia:text-[#fafafa]",children:"Copy Model"}),e.jsx("button",{onClick:()=>N(!1),className:"p-1.5 rounded-lg hover:bg-gray-100 dark:hover:bg-dark-200 ophelia:hover:bg-[#1a1a1a]",children:e.jsx(S,{className:"h-5 w-5 text-gray-500 ophelia:text-[#737373]"})})]}),e.jsxs("div",{className:"p-4 space-y-4",children:[e.jsxs("div",{children:[e.jsx("label",{className:"block text-sm font-medium text-gray-700 dark:text-gray-300 ophelia:text-[#a3a3a3] mb-1",children:"Source Model"}),e.jsxs("select",{value:P,onChange:a=>q(a.target.value),className:t("w-full px-3 py-2 rounded-lg border text-sm","bg-gray-50 dark:bg-dark-50 ophelia:bg-[#121212]","border-gray-200 dark:border-dark-300 ophelia:border-[#262626]","text-gray-900 dark:text-gray-100 ophelia:text-[#fafafa]"),children:[e.jsx("option",{value:"",children:"Select a model..."}),x.map(a=>e.jsx("option",{value:a.name,children:a.name},a.name))]})]}),e.jsxs("div",{children:[e.jsx("label",{className:"block text-sm font-medium text-gray-700 dark:text-gray-300 ophelia:text-[#a3a3a3] mb-1",children:"New Model Name"}),e.jsx("input",{type:"text",value:w,onChange:a=>ae(a.target.value),placeholder:"e.g., my-custom-model",className:t("w-full px-3 py-2 rounded-lg border text-sm","bg-gray-50 dark:bg-dark-50 ophelia:bg-[#121212]","border-gray-200 dark:border-dark-300 ophelia:border-[#262626]","text-gray-900 dark:text-gray-100 ophelia:text-[#fafafa]","placeholder-gray-500 ophelia:placeholder-[#525252]")})]}),e.jsxs(n,{onClick:Te,disabled:!P.trim()||!w.trim()||W,className:t("w-full gap-2","ophelia:bg-[#9333ea] ophelia:hover:bg-[#7c3aed] ophelia:text-white"),children:[W?e.jsx(m,{className:"h-4 w-4 animate-spin"}):e.jsx(K,{className:"h-4 w-4"}),W?"Copying...":"Copy Model"]})]})]})]}),document.body),Ee&&_.createPortal(e.jsxs("div",{className:"fixed inset-0 z-[999999] flex items-center justify-center p-4",children:[e.jsx("div",{className:"absolute inset-0 bg-black/50 backdrop-blur-sm",onClick:()=>F(!1)}),e.jsxs("div",{className:t("relative w-full max-w-lg rounded-xl border shadow-2xl","bg-white dark:bg-dark-100 ophelia:bg-[#0a0a0a]","border-gray-200 dark:border-dark-300 ophelia:border-[#1a1a1a]"),children:[e.jsxs("div",{className:t("flex items-center justify-between p-4 border-b","border-gray-200 dark:border-dark-300 ophelia:border-[#1a1a1a]"),children:[e.jsx("h3",{className:"text-lg font-semibold text-gray-900 dark:text-gray-100 ophelia:text-[#fafafa]",children:"Create Custom Model"}),e.jsx("button",{onClick:()=>F(!1),className:"p-1.5 rounded-lg hover:bg-gray-100 dark:hover:bg-dark-200 ophelia:hover:bg-[#1a1a1a]",children:e.jsx(S,{className:"h-5 w-5 text-gray-500 ophelia:text-[#737373]"})})]}),e.jsxs("div",{className:"p-4 space-y-4",children:[e.jsxs("div",{children:[e.jsx("label",{className:"block text-sm font-medium text-gray-700 dark:text-gray-300 ophelia:text-[#a3a3a3] mb-1",children:"Model Name"}),e.jsx("input",{type:"text",value:M,onChange:a=>re(a.target.value),placeholder:"e.g., my-assistant",className:t("w-full px-3 py-2 rounded-lg border text-sm","bg-gray-50 dark:bg-dark-50 ophelia:bg-[#121212]","border-gray-200 dark:border-dark-300 ophelia:border-[#262626]","text-gray-900 dark:text-gray-100 ophelia:text-[#fafafa]","placeholder-gray-500 ophelia:placeholder-[#525252]")})]}),e.jsxs("div",{children:[e.jsx("label",{className:"block text-sm font-medium text-gray-700 dark:text-gray-300 ophelia:text-[#a3a3a3] mb-1",children:"Modelfile"}),e.jsx("textarea",{value:L,onChange:a=>se(a.target.value),placeholder:`FROM llama3.2
1
+ import{j as e}from"./markdown-vendor-YWiGftdn.js";import{r as s,c as _}from"./router-vendor-CnU0qKrY.js";import{c as t,B as n,o as c}from"../assets/index-BbJ5OmoO.js";import{a1 as m,ac as Ye,ad as C,ae as Ze,af as ge,f as T,d as I,e as O,ag as me,X as S,E as Ke,ah as Qe,ai as Xe,C as Je,aj as ea,Z as aa,k as ta,ak as ra,al as sa,b as la,H as K,T as ia,t as da,am as pe,an as be,ao as oa,z as l}from"./ui-vendor-CdKqcMKK.js";import"./react-vendor-N--QU9DW.js";import"./utils-vendor-DEeF42mN.js";const na=()=>{const[x,fe]=s.useState([]),[h,ue]=s.useState([]),[$,ye]=s.useState([]),[G,Q]=s.useState(!1),[H,ke]=s.useState("all"),[z,je]=s.useState(""),[ve,X]=s.useState(!1),[k,E]=s.useState(""),[b,j]=s.useState(!1),[o,f]=s.useState(null),[J,v]=s.useState(null),[i,Ne]=s.useState(null),[we,Me]=s.useState(""),[Ce,V]=s.useState(!1),[Se,ee]=s.useState(!1),[ze,N]=s.useState(!1),[P,q]=s.useState(""),[w,ae]=s.useState(""),[W,te]=s.useState(!1),[Ee,F]=s.useState(!1),[M,re]=s.useState(""),[L,se]=s.useState(""),[U,le]=s.useState(!1),[Pe,Y]=s.useState(!1),[D,Fe]=s.useState(""),[R,Le]=s.useState(""),[A,ie]=s.useState(null),[Z,de]=s.useState(!1),[oe,De]=s.useState(null),[ne,B]=s.useState(null),[g,Re]=s.useState(new Set(["pull","local"])),u=a=>{Re(r=>{const d=new Set(r);return d.has(a)?d.delete(a):d.add(a),d})},y=async()=>{X(!0);try{const[a,r,d,Ue]=await Promise.all([c.getModels(),c.listRunningModels(),c.getVersion(),c.checkHealth()]);a.success&&fe(a.data||[]),r.success&&ue(Array.isArray(r.data)?r.data:[]),d.success&&d.data&&De(d.data.version),B(Ue.success)}catch(a){const r=a instanceof Error?a.message:String(a);l.error("Failed to load models: "+r),B(!1)}finally{X(!1)}},ce=async()=>{Q(!0);try{const a=await c.getLibraryModels();a.success&&a.data&&ye(a.data)}catch(a){console.error("Failed to load library models:",a)}finally{Q(!1)}};s.useEffect(()=>{y(),ce()},[]);const xe=async()=>{if(!k.trim()){l.error("Please enter a model name");return}j(!0),f({status:"starting"});try{const a=c.pullModelStream(k.trim(),r=>{f(r)},()=>{f(null),j(!1),v(null),l.success(`Model ${k} pulled successfully`),E(""),y()},r=>{f(null),j(!1),v(null),l.error("Failed to pull model: "+r)});v(()=>a)}catch(a){const r=a instanceof Error?a.message:String(a);l.error("Failed to pull model: "+r),f(null),j(!1),v(null)}},Ae=()=>{J&&(J(),v(null),j(!1),f(null),l.success("Model pull cancelled"))},Be=async a=>{if(confirm(`Are you sure you want to delete model "${a}"?`))try{await c.deleteModel(a),l.success(`Model ${a} deleted successfully`),await y()}catch(r){const d=r instanceof Error?r.message:String(r);l.error("Failed to delete model: "+d)}},_e=async a=>{ee(!0),Me(a),V(!0);try{const r=await c.showModel(a,!0);r.success&&r.data?Ne(r.data):l.error("Failed to load model details")}catch(r){const d=r instanceof Error?r.message:String(r);l.error("Failed to get model info: "+d)}finally{ee(!1)}},Te=async()=>{if(!P.trim()||!w.trim()){l.error("Please enter both source and destination names");return}te(!0);try{await c.copyModel(P.trim(),w.trim()),l.success(`Model copied to ${w}`),N(!1),q(""),ae(""),await y()}catch(a){const r=a instanceof Error?a.message:String(a);l.error("Failed to copy model: "+r)}finally{te(!1)}},Ie=async()=>{if(!M.trim()||!L.trim()){l.error("Please enter model name and Modelfile content");return}le(!0);try{await c.createModel({model:M.trim(),modelfile:L.trim()}),l.success(`Model ${M} created successfully`),F(!1),re(""),se(""),await y()}catch(a){const r=a instanceof Error?a.message:String(a);l.error("Failed to create model: "+r)}finally{le(!1)}},Oe=async()=>{if(!D.trim()||!R.trim()){l.error("Please select a model and enter text");return}de(!0),ie(null);try{const a=await c.generateEmbeddings({model:D.trim(),input:R.trim()});if(a.success&&a.data){const r=a.data.embeddings?.[0]||[];ie(r),l.success(`Generated ${r.length}-dimensional embedding vector`)}}catch(a){const r=a instanceof Error?a.message:String(a);l.error("Failed to generate embeddings: "+r)}finally{de(!1)}},p=a=>{const r=a/1073741824;return r>=1?`${r.toFixed(2)} GB`:`${(a/(1024*1024)).toFixed(1)} MB`},$e=a=>Array.isArray(h)&&h.some(r=>r.name===a),Ge=()=>x.reduce((a,r)=>a+r.size,0),He=()=>h.reduce((a,r)=>a+(r.size_vram||0),0),Ve=a=>x.some(r=>r.name===a||r.name.startsWith(a+":")),he=$.filter(a=>{const r=H==="all"||a.category===H,d=!z||a.name.toLowerCase().includes(z.toLowerCase())||a.description.toLowerCase().includes(z.toLowerCase());return r&&d}),qe=["all",...new Set($.map(a=>a.category))],We=[{name:"deepseek-r1",category:"reasoning",size:"7B"},{name:"llama3.2",category:"general",size:"3B"},{name:"gemma3",category:"general",size:"4B"},{name:"qwen2.5",category:"general",size:"7B"},{name:"mistral",category:"general",size:"7B"},{name:"codellama",category:"coding",size:"7B"},{name:"nomic-embed-text",category:"embedding",size:"137M"},{name:"llava",category:"vision",size:"7B"},{name:"phi3",category:"general",size:"3.8B"},{name:"gemma2",category:"general",size:"9B"}];return ve?e.jsx("div",{className:"flex items-center justify-center p-8",children:e.jsxs("div",{className:"flex items-center gap-3 text-gray-600 dark:text-dark-600 ophelia:text-[#a3a3a3]",children:[e.jsx(m,{className:"h-5 w-5 animate-spin"}),"Loading models..."]})}):e.jsxs("div",{className:"space-y-4",children:[e.jsx("div",{className:t("rounded-xl p-4 border","bg-white dark:bg-dark-100 ophelia:bg-[#0a0a0a]","border-gray-200 dark:border-dark-300 ophelia:border-[#1a1a1a]"),children:e.jsxs("div",{className:"flex flex-wrap items-center justify-between gap-4",children:[e.jsxs("div",{className:"flex items-center gap-6",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("div",{className:t("w-2.5 h-2.5 rounded-full",ne?"bg-green-500 ophelia:bg-[#4ade80]":"bg-red-500 ophelia:bg-[#f87171]")}),e.jsx("span",{className:"text-sm font-medium text-gray-700 dark:text-gray-300 ophelia:text-[#e5e5e5]",children:ne?"Ollama Online":"Ollama Offline"})]}),oe&&e.jsxs("div",{className:"flex items-center gap-2 text-sm text-gray-600 dark:text-gray-400 ophelia:text-[#a3a3a3]",children:[e.jsx(Ye,{className:"h-4 w-4"}),e.jsxs("span",{children:["v",oe]})]}),e.jsxs("div",{className:"flex items-center gap-2 text-sm text-gray-600 dark:text-gray-400 ophelia:text-[#a3a3a3]",children:[e.jsx(C,{className:"h-4 w-4"}),e.jsxs("span",{children:[x.length," model",x.length!==1?"s":""]})]}),e.jsxs("div",{className:"flex items-center gap-2 text-sm text-gray-600 dark:text-gray-400 ophelia:text-[#a3a3a3]",children:[e.jsx(Ze,{className:"h-4 w-4"}),e.jsx("span",{children:p(Ge())})]}),h.length>0&&e.jsxs("div",{className:"flex items-center gap-2 text-sm text-green-600 dark:text-green-400 ophelia:text-[#4ade80]",children:[e.jsx(ge,{className:"h-4 w-4"}),e.jsxs("span",{children:[h.length," running (",p(He())," ","VRAM)"]})]})]}),e.jsx("div",{className:"flex items-center gap-2",children:e.jsxs(n,{onClick:y,variant:"outline",size:"sm",className:t("gap-1.5","ophelia:border-[#262626] ophelia:text-[#a3a3a3]","ophelia:hover:bg-[#1a1a1a] ophelia:hover:text-[#fafafa]"),children:[e.jsx(m,{className:"h-3.5 w-3.5"}),"Refresh"]})})]})}),e.jsxs("div",{className:t("rounded-xl border overflow-hidden","bg-white dark:bg-dark-100 ophelia:bg-[#0a0a0a]","border-gray-200 dark:border-dark-300 ophelia:border-[#1a1a1a]"),children:[e.jsxs("button",{onClick:()=>u("pull"),className:t("w-full flex items-center justify-between p-4","hover:bg-gray-50 dark:hover:bg-dark-50 ophelia:hover:bg-[#121212]","transition-colors"),children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("div",{className:t("p-2 rounded-lg","bg-primary-100 dark:bg-primary-900/30 ophelia:bg-[#9333ea]/20"),children:e.jsx(T,{className:"h-5 w-5 text-primary-600 dark:text-primary-400 ophelia:text-[#a855f7]"})}),e.jsx("h3",{className:"text-lg font-semibold text-gray-900 dark:text-dark-800 ophelia:text-[#fafafa]",children:"Pull New Model"})]}),g.has("pull")?e.jsx(I,{className:"h-5 w-5 text-gray-500 ophelia:text-[#737373]"}):e.jsx(O,{className:"h-5 w-5 text-gray-500 ophelia:text-[#737373]"})]}),g.has("pull")&&e.jsxs("div",{className:"p-4 pt-0 space-y-4",children:[e.jsxs("div",{className:"flex gap-2",children:[e.jsxs("div",{className:"relative flex-1",children:[e.jsx(me,{className:"absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-gray-400 dark:text-gray-500 ophelia:text-[#525252]"}),e.jsx("input",{type:"text",value:k,onChange:a=>E(a.target.value),placeholder:"Enter model name (e.g., llama3.2:3b, deepseek-r1:14b)",className:t("w-full pl-10 pr-4 py-2.5 rounded-lg border text-sm","bg-gray-50 dark:bg-dark-50 ophelia:bg-[#121212]","border-gray-200 dark:border-dark-300 ophelia:border-[#262626]","text-gray-900 dark:text-dark-700 ophelia:text-[#fafafa]","placeholder-gray-500 dark:placeholder-gray-400 ophelia:placeholder-[#525252]","focus:outline-none focus:ring-2 focus:ring-primary-500/20 ophelia:focus:ring-[#9333ea]/20","focus:border-primary-500 ophelia:focus:border-[#9333ea]"),disabled:b,onKeyDown:a=>a.key==="Enter"&&!b&&xe()})]}),b?e.jsxs(n,{onClick:Ae,variant:"outline",className:t("px-4 py-2.5 gap-2","text-red-600 hover:text-red-700 dark:text-red-400 dark:hover:text-red-300","ophelia:text-[#f87171] ophelia:hover:text-[#fca5a5]","ophelia:border-[#262626] ophelia:hover:bg-[#1a1a1a]"),children:[e.jsx(S,{className:"h-4 w-4"}),"Cancel"]}):e.jsxs(n,{onClick:xe,disabled:!k.trim(),className:t("px-4 py-2.5 gap-2","ophelia:bg-[#9333ea] ophelia:hover:bg-[#7c3aed] ophelia:text-white"),children:[e.jsx(T,{className:"h-4 w-4"}),"Pull"]})]}),b&&o&&e.jsxs("div",{className:t("p-4 rounded-lg border","bg-gray-50 dark:bg-dark-200 ophelia:bg-[#121212]","border-gray-200 dark:border-dark-300 ophelia:border-[#262626]"),children:[e.jsxs("div",{className:"flex items-center justify-between mb-2",children:[e.jsx("span",{className:"text-sm font-medium text-gray-800 dark:text-dark-700 ophelia:text-[#e5e5e5]",children:o.status==="starting"?"Initializing...":o.status==="pulling"?"Downloading model...":o.status==="verifying sha256"?"Verifying integrity...":o.status==="writing manifest"?"Writing manifest...":o.status==="removing any unused layers"?"Cleaning up...":o.status}),o.percent!==void 0&&e.jsxs("span",{className:"text-sm font-mono text-gray-600 dark:text-dark-600 ophelia:text-[#a3a3a3]",children:[o.percent,"%"]})]}),o.percent!==void 0&&e.jsx("div",{className:"w-full bg-gray-200 dark:bg-dark-400 ophelia:bg-[#262626] rounded-full h-2 overflow-hidden",children:e.jsx("div",{className:t("h-2 rounded-full transition-all duration-300","bg-primary-500 dark:bg-primary-400 ophelia:bg-[#9333ea]"),style:{width:`${o.percent}%`}})}),o.total&&o.completed&&e.jsxs("div",{className:"mt-2 text-xs text-gray-600 dark:text-dark-600 ophelia:text-[#737373]",children:[p(o.completed)," /"," ",p(o.total)]})]}),e.jsxs("div",{children:[e.jsx("p",{className:"text-xs font-medium text-gray-500 dark:text-gray-400 ophelia:text-[#737373] mb-2",children:"Popular models:"}),e.jsx("div",{className:"flex flex-wrap gap-2",children:We.map(a=>e.jsxs("button",{onClick:()=>E(a.name),disabled:b,className:t("px-3 py-1.5 rounded-full text-xs font-medium transition-colors","bg-gray-100 dark:bg-dark-200 ophelia:bg-[#1a1a1a]","text-gray-700 dark:text-gray-300 ophelia:text-[#a3a3a3]","hover:bg-gray-200 dark:hover:bg-dark-300 ophelia:hover:bg-[#262626]","border border-gray-200 dark:border-dark-300 ophelia:border-[#262626]","disabled:opacity-50 disabled:cursor-not-allowed"),children:[a.name,e.jsx("span",{className:"ml-1 text-gray-400 dark:text-gray-500 ophelia:text-[#525252]",children:a.size})]},a.name))})]}),e.jsxs("a",{href:"https://ollama.com/library",target:"_blank",rel:"noopener noreferrer",className:t("inline-flex items-center gap-1.5 text-xs","text-primary-600 dark:text-primary-400 ophelia:text-[#a855f7]","hover:underline"),children:[e.jsx(Ke,{className:"h-3 w-3"}),"Browse all models on ollama.com"]})]})]}),e.jsxs("div",{className:t("rounded-xl border overflow-hidden","bg-white dark:bg-dark-100 ophelia:bg-[#0a0a0a]","border-gray-200 dark:border-dark-300 ophelia:border-[#1a1a1a]"),children:[e.jsxs("button",{onClick:()=>u("library"),className:t("w-full flex items-center justify-between p-4","hover:bg-gray-50 dark:hover:bg-dark-50 ophelia:hover:bg-[#121212]","transition-colors"),children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("div",{className:t("p-2 rounded-lg","bg-cyan-100 dark:bg-cyan-900/30 ophelia:bg-[#06b6d4]/20"),children:e.jsx(Qe,{className:"h-5 w-5 text-cyan-600 dark:text-cyan-400 ophelia:text-[#22d3ee]"})}),e.jsx("h3",{className:"text-lg font-semibold text-gray-900 dark:text-dark-800 ophelia:text-[#fafafa]",children:"Browse Library"}),e.jsxs("span",{className:t("px-2 py-0.5 rounded-full text-xs font-medium","bg-gray-100 dark:bg-dark-200 ophelia:bg-[#1a1a1a]","text-gray-600 dark:text-gray-400 ophelia:text-[#a3a3a3]"),children:[$.length," available"]})]}),g.has("library")?e.jsx(I,{className:"h-5 w-5 text-gray-500 ophelia:text-[#737373]"}):e.jsx(O,{className:"h-5 w-5 text-gray-500 ophelia:text-[#737373]"})]}),g.has("library")&&e.jsxs("div",{className:"p-4 pt-0 space-y-4",children:[e.jsxs("div",{className:"flex flex-col sm:flex-row gap-3",children:[e.jsxs("div",{className:"relative flex-1",children:[e.jsx(me,{className:"absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-gray-400 dark:text-gray-500 ophelia:text-[#525252]"}),e.jsx("input",{type:"text",value:z,onChange:a=>je(a.target.value),placeholder:"Search models...",className:t("w-full pl-10 pr-4 py-2 rounded-lg border text-sm","bg-gray-50 dark:bg-dark-50 ophelia:bg-[#121212]","border-gray-200 dark:border-dark-300 ophelia:border-[#262626]","text-gray-900 dark:text-dark-700 ophelia:text-[#fafafa]","placeholder-gray-500 dark:placeholder-gray-400 ophelia:placeholder-[#525252]","focus:outline-none focus:ring-2 focus:ring-primary-500/20 ophelia:focus:ring-[#9333ea]/20","focus:border-primary-500 ophelia:focus:border-[#9333ea]")})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(Xe,{className:"h-4 w-4 text-gray-400 ophelia:text-[#525252]"}),e.jsx("div",{className:"flex flex-wrap gap-1",children:qe.map(a=>e.jsx("button",{onClick:()=>ke(a),className:t("px-2.5 py-1 rounded-full text-xs font-medium transition-colors",H===a?"bg-primary-100 dark:bg-primary-900/30 ophelia:bg-[#9333ea]/20 text-primary-700 dark:text-primary-400 ophelia:text-[#a855f7]":"bg-gray-100 dark:bg-dark-200 ophelia:bg-[#1a1a1a] text-gray-600 dark:text-gray-400 ophelia:text-[#a3a3a3] hover:bg-gray-200 dark:hover:bg-dark-300 ophelia:hover:bg-[#262626]"),children:a.charAt(0).toUpperCase()+a.slice(1)},a))})]})]}),G?e.jsx("div",{className:"flex items-center justify-center py-8",children:e.jsx(m,{className:"h-5 w-5 animate-spin text-gray-400 ophelia:text-[#737373]"})}):he.length===0?e.jsx("div",{className:"text-center py-8 text-gray-500 ophelia:text-[#737373]",children:"No models found matching your criteria"}):e.jsx("div",{className:"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-3",children:he.map(a=>{const r=Ve(a.name);return e.jsxs("div",{className:t("p-4 rounded-lg border transition-all","bg-gray-50 dark:bg-dark-50 ophelia:bg-[#121212]",r?"border-green-200 dark:border-green-800/50 ophelia:border-[#22c55e]/30":"border-gray-200 dark:border-dark-300 ophelia:border-[#1a1a1a]","hover:shadow-md hover:border-gray-300 dark:hover:border-dark-400 ophelia:hover:border-[#262626]"),children:[e.jsxs("div",{className:"flex items-start justify-between gap-2 mb-2",children:[e.jsx("h4",{className:"font-medium text-gray-900 dark:text-dark-800 ophelia:text-[#fafafa]",children:a.name}),r&&e.jsxs("span",{className:t("flex items-center gap-1 px-1.5 py-0.5 rounded text-xs","bg-green-100 dark:bg-green-900/30 ophelia:bg-[#22c55e]/20","text-green-700 dark:text-green-400 ophelia:text-[#4ade80]"),children:[e.jsx(Je,{className:"h-3 w-3"}),"Installed"]})]}),e.jsx("p",{className:"text-xs text-gray-600 dark:text-dark-600 ophelia:text-[#a3a3a3] mb-3 line-clamp-2",children:a.description}),e.jsxs("div",{className:"flex flex-wrap gap-1.5 mb-3",children:[a.sizes.slice(0,4).map(d=>e.jsx("span",{className:t("px-1.5 py-0.5 rounded text-xs","bg-gray-200 dark:bg-dark-300 ophelia:bg-[#262626]","text-gray-600 dark:text-gray-400 ophelia:text-[#a3a3a3]"),children:d},d)),a.sizes.length>4&&e.jsxs("span",{className:"text-xs text-gray-400 ophelia:text-[#737373]",children:["+",a.sizes.length-4," more"]})]}),e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{className:"flex items-center gap-2 text-xs text-gray-500 ophelia:text-[#737373]",children:[a.pulls&&e.jsxs("span",{className:"flex items-center gap-1",children:[e.jsx(T,{className:"h-3 w-3"}),a.pulls]}),e.jsx("span",{className:t("px-1.5 py-0.5 rounded capitalize","bg-gray-100 dark:bg-dark-200 ophelia:bg-[#1a1a1a]"),children:a.category})]}),e.jsxs(n,{onClick:()=>{E(a.name),u("pull"),g.has("pull")||u("pull")},variant:"outline",size:"sm",disabled:b,className:t("gap-1 text-xs","ophelia:border-[#262626] ophelia:text-[#a3a3a3]","ophelia:hover:bg-[#1a1a1a] ophelia:hover:text-[#fafafa]"),children:[e.jsx(T,{className:"h-3 w-3"}),"Pull"]})]})]},a.name)})}),e.jsx("div",{className:"flex justify-center",children:e.jsxs(n,{onClick:ce,variant:"outline",size:"sm",disabled:G,className:t("gap-1.5","ophelia:border-[#262626] ophelia:text-[#a3a3a3]","ophelia:hover:bg-[#1a1a1a] ophelia:hover:text-[#fafafa]"),children:[e.jsx(m,{className:t("h-3.5 w-3.5",G&&"animate-spin")}),"Refresh Library"]})})]})]}),Array.isArray(h)&&h.length>0&&e.jsxs("div",{className:t("rounded-xl p-4 border","bg-white dark:bg-dark-100 ophelia:bg-[#0a0a0a]","border-gray-200 dark:border-dark-300 ophelia:border-[#1a1a1a]"),children:[e.jsxs("div",{className:"flex items-center gap-3 mb-4",children:[e.jsx("div",{className:t("p-2 rounded-lg","bg-green-100 dark:bg-green-900/30 ophelia:bg-[#22c55e]/20"),children:e.jsx(ge,{className:"h-5 w-5 text-green-600 dark:text-green-400 ophelia:text-[#4ade80]"})}),e.jsx("h3",{className:"text-lg font-semibold text-gray-900 dark:text-dark-800 ophelia:text-[#fafafa]",children:"Running Models"}),e.jsxs("span",{className:t("ml-auto px-2 py-0.5 rounded-full text-xs font-medium","bg-green-100 dark:bg-green-900/30 ophelia:bg-[#22c55e]/20","text-green-700 dark:text-green-400 ophelia:text-[#4ade80]"),children:[h.length," active"]})]}),e.jsx("div",{className:"space-y-2",children:h.map(a=>e.jsxs("div",{className:t("flex items-center justify-between p-4 rounded-lg border","bg-green-50 dark:bg-green-900/10 ophelia:bg-[#22c55e]/5","border-green-200 dark:border-green-800/50 ophelia:border-[#22c55e]/20"),children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("div",{className:t("w-2 h-2 rounded-full animate-pulse","bg-green-500 ophelia:bg-[#4ade80]")}),e.jsxs("div",{children:[e.jsx("div",{className:"font-medium text-green-800 dark:text-green-400 ophelia:text-[#4ade80]",children:a.name}),e.jsxs("div",{className:"flex items-center gap-3 text-sm text-green-600 dark:text-green-500 ophelia:text-[#22c55e]/80",children:[e.jsxs("span",{className:"flex items-center gap-1",children:[e.jsx(ea,{className:"h-3 w-3"}),"VRAM: ",p(a.size_vram||0)]}),a.size&&e.jsxs("span",{className:"flex items-center gap-1",children:[e.jsx(C,{className:"h-3 w-3"}),"Size: ",p(a.size)]})]})]})]}),e.jsxs("div",{className:t("flex items-center gap-1.5 px-2 py-1 rounded-full text-xs font-medium","bg-green-100 dark:bg-green-900/30 ophelia:bg-[#22c55e]/10","text-green-700 dark:text-green-400 ophelia:text-[#4ade80]"),children:[e.jsx(aa,{className:"h-3 w-3"}),"Active"]})]},a.name))})]}),e.jsxs("div",{className:t("rounded-xl border overflow-hidden","bg-white dark:bg-dark-100 ophelia:bg-[#0a0a0a]","border-gray-200 dark:border-dark-300 ophelia:border-[#1a1a1a]"),children:[e.jsxs("button",{onClick:()=>u("local"),className:t("w-full flex items-center justify-between p-4","hover:bg-gray-50 dark:hover:bg-dark-50 ophelia:hover:bg-[#121212]","transition-colors"),children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("div",{className:t("p-2 rounded-lg","bg-blue-100 dark:bg-blue-900/30 ophelia:bg-[#a855f7]/20"),children:e.jsx(C,{className:"h-5 w-5 text-blue-600 dark:text-blue-400 ophelia:text-[#a855f7]"})}),e.jsx("h3",{className:"text-lg font-semibold text-gray-900 dark:text-dark-800 ophelia:text-[#fafafa]",children:"Local Models"}),e.jsxs("span",{className:t("px-2 py-0.5 rounded-full text-xs font-medium","bg-gray-100 dark:bg-dark-200 ophelia:bg-[#1a1a1a]","text-gray-600 dark:text-gray-400 ophelia:text-[#a3a3a3]"),children:[x.length," installed"]})]}),g.has("local")?e.jsx(I,{className:"h-5 w-5 text-gray-500 ophelia:text-[#737373]"}):e.jsx(O,{className:"h-5 w-5 text-gray-500 ophelia:text-[#737373]"})]}),g.has("local")&&e.jsx("div",{className:"p-4 pt-0",children:x.length===0?e.jsxs("div",{className:t("text-center py-12 rounded-lg border-2 border-dashed","border-gray-200 dark:border-dark-300 ophelia:border-[#262626]"),children:[e.jsx(C,{className:"h-12 w-12 mx-auto mb-3 text-gray-300 dark:text-gray-600 ophelia:text-[#525252]"}),e.jsx("p",{className:"text-gray-600 dark:text-dark-600 ophelia:text-[#737373] mb-2",children:"No models installed yet"}),e.jsx("p",{className:"text-sm text-gray-500 dark:text-gray-500 ophelia:text-[#525252]",children:"Pull a model above to get started"})]}):e.jsx("div",{className:"space-y-3",children:x.map(a=>e.jsx("div",{className:t("p-4 rounded-lg border transition-colors","bg-gray-50 dark:bg-dark-50 ophelia:bg-[#121212]","border-gray-200 dark:border-dark-300 ophelia:border-[#1a1a1a]","hover:bg-gray-100 dark:hover:bg-dark-200 ophelia:hover:bg-[#1a1a1a]"),children:e.jsxs("div",{className:"flex items-start justify-between gap-4",children:[e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsxs("div",{className:"flex items-center gap-2 flex-wrap",children:[e.jsx("h4",{className:"font-medium text-gray-900 dark:text-dark-800 ophelia:text-[#fafafa]",children:a.name}),$e(a.name)&&e.jsxs("span",{className:t("inline-flex items-center gap-1 px-2 py-0.5 rounded-full text-xs font-medium","bg-green-100 dark:bg-green-900/30 ophelia:bg-[#22c55e]/20","text-green-700 dark:text-green-400 ophelia:text-[#4ade80]"),children:[e.jsx("span",{className:"w-1.5 h-1.5 rounded-full bg-green-500 ophelia:bg-[#4ade80] animate-pulse"}),"Running"]})]}),e.jsxs("div",{className:"flex flex-wrap gap-x-4 gap-y-1 text-sm text-gray-600 dark:text-dark-600 ophelia:text-[#a3a3a3] mt-2",children:[e.jsxs("span",{className:"flex items-center gap-1",children:[e.jsx(C,{className:"h-3.5 w-3.5"}),p(a.size)]}),a.details?.parameter_size&&e.jsxs("span",{className:"flex items-center gap-1",children:[e.jsx(ta,{className:"h-3.5 w-3.5"}),a.details.parameter_size]}),a.details?.quantization_level&&e.jsx("span",{className:t("px-1.5 py-0.5 rounded text-xs","bg-gray-200 dark:bg-dark-300 ophelia:bg-[#262626]","text-gray-600 dark:text-gray-400 ophelia:text-[#a3a3a3]"),children:a.details.quantization_level}),a.details?.family&&e.jsx("span",{className:"text-gray-500 dark:text-gray-500 ophelia:text-[#737373]",children:a.details.family})]}),e.jsxs("div",{className:"flex items-center gap-3 text-xs text-gray-400 dark:text-dark-500 ophelia:text-[#525252] mt-2",children:[e.jsxs("span",{className:"flex items-center gap-1",children:[e.jsx(ra,{className:"h-3 w-3"}),new Date(a.modified_at).toLocaleDateString()]}),e.jsxs("span",{className:"flex items-center gap-1 font-mono truncate max-w-[200px]",title:a.digest,children:[e.jsx(sa,{className:"h-3 w-3"}),a.digest.slice(0,12),"..."]})]})]}),e.jsxs("div",{className:"flex gap-2 flex-shrink-0",children:[e.jsxs(n,{onClick:()=>_e(a.name),variant:"outline",size:"sm",className:t("gap-1.5","ophelia:border-[#262626] ophelia:text-[#a3a3a3]","ophelia:hover:bg-[#1a1a1a] ophelia:hover:text-[#fafafa]"),children:[e.jsx(la,{className:"h-3.5 w-3.5"}),"Info"]}),e.jsxs(n,{onClick:()=>{q(a.name),N(!0)},variant:"outline",size:"sm",className:t("gap-1.5","ophelia:border-[#262626] ophelia:text-[#a3a3a3]","ophelia:hover:bg-[#1a1a1a] ophelia:hover:text-[#fafafa]"),children:[e.jsx(K,{className:"h-3.5 w-3.5"}),"Copy"]}),e.jsxs(n,{onClick:()=>Be(a.name),variant:"outline",size:"sm",className:t("gap-1.5","text-red-600 hover:text-red-700 dark:text-red-400 dark:hover:text-red-300","ophelia:text-[#f87171] ophelia:hover:text-[#fca5a5]","ophelia:border-[#262626] ophelia:hover:bg-[#1a1a1a]"),children:[e.jsx(ia,{className:"h-3.5 w-3.5"}),"Delete"]})]})]})},a.name))})})]}),e.jsxs("div",{className:t("rounded-xl border overflow-hidden","bg-white dark:bg-dark-100 ophelia:bg-[#0a0a0a]","border-gray-200 dark:border-dark-300 ophelia:border-[#1a1a1a]"),children:[e.jsxs("button",{onClick:()=>u("advanced"),className:t("w-full flex items-center justify-between p-4","hover:bg-gray-50 dark:hover:bg-dark-50 ophelia:hover:bg-[#121212]","transition-colors"),children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("div",{className:t("p-2 rounded-lg","bg-amber-100 dark:bg-amber-900/30 ophelia:bg-[#f59e0b]/20"),children:e.jsx(da,{className:"h-5 w-5 text-amber-600 dark:text-amber-400 ophelia:text-[#fbbf24]"})}),e.jsx("h3",{className:"text-lg font-semibold text-gray-900 dark:text-dark-800 ophelia:text-[#fafafa]",children:"Advanced Actions"})]}),g.has("advanced")?e.jsx(I,{className:"h-5 w-5 text-gray-500 ophelia:text-[#737373]"}):e.jsx(O,{className:"h-5 w-5 text-gray-500 ophelia:text-[#737373]"})]}),g.has("advanced")&&e.jsx("div",{className:"p-4 pt-0",children:e.jsxs("div",{className:"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-3",children:[e.jsxs(n,{onClick:()=>F(!0),variant:"outline",className:t("w-full gap-2 justify-start h-auto py-3 px-4","ophelia:border-[#262626] ophelia:text-[#a3a3a3]","ophelia:hover:bg-[#1a1a1a] ophelia:hover:text-[#fafafa]"),children:[e.jsx(pe,{className:"h-5 w-5 text-purple-500 ophelia:text-[#a855f7]"}),e.jsxs("div",{className:"text-left",children:[e.jsx("div",{className:"font-medium",children:"Create Model"}),e.jsx("div",{className:"text-xs opacity-70",children:"From Modelfile"})]})]}),e.jsxs(n,{onClick:()=>N(!0),variant:"outline",className:t("w-full gap-2 justify-start h-auto py-3 px-4","ophelia:border-[#262626] ophelia:text-[#a3a3a3]","ophelia:hover:bg-[#1a1a1a] ophelia:hover:text-[#fafafa]"),children:[e.jsx(K,{className:"h-5 w-5 text-blue-500 ophelia:text-[#60a5fa]"}),e.jsxs("div",{className:"text-left",children:[e.jsx("div",{className:"font-medium",children:"Copy Model"}),e.jsx("div",{className:"text-xs opacity-70",children:"Duplicate existing"})]})]}),e.jsxs(n,{onClick:()=>Y(!0),variant:"outline",className:t("w-full gap-2 justify-start h-auto py-3 px-4","ophelia:border-[#262626] ophelia:text-[#a3a3a3]","ophelia:hover:bg-[#1a1a1a] ophelia:hover:text-[#fafafa]"),children:[e.jsx(be,{className:"h-5 w-5 text-green-500 ophelia:text-[#4ade80]"}),e.jsxs("div",{className:"text-left",children:[e.jsx("div",{className:"font-medium",children:"Test Embeddings"}),e.jsx("div",{className:"text-xs opacity-70",children:"Generate vectors"})]})]}),e.jsxs(n,{onClick:async()=>{try{(await c.checkHealth()).success&&(B(!0),l.success("Ollama is healthy!"))}catch{B(!1),l.error("Ollama health check failed")}},variant:"outline",className:t("w-full gap-2 justify-start h-auto py-3 px-4","ophelia:border-[#262626] ophelia:text-[#a3a3a3]","ophelia:hover:bg-[#1a1a1a] ophelia:hover:text-[#fafafa]"),children:[e.jsx(oa,{className:"h-5 w-5 text-rose-500 ophelia:text-[#fb7185]"}),e.jsxs("div",{className:"text-left",children:[e.jsx("div",{className:"font-medium",children:"Health Check"}),e.jsx("div",{className:"text-xs opacity-70",children:"Test connection"})]})]})]})})]}),Ce&&_.createPortal(e.jsxs("div",{className:"fixed inset-0 z-[999999] flex items-center justify-center p-4",children:[e.jsx("div",{className:"absolute inset-0 bg-black/50 backdrop-blur-sm",onClick:()=>V(!1)}),e.jsxs("div",{className:t("relative w-full max-w-2xl max-h-[85vh] overflow-hidden rounded-xl border shadow-2xl","bg-white dark:bg-dark-100 ophelia:bg-[#0a0a0a]","border-gray-200 dark:border-dark-300 ophelia:border-[#1a1a1a]"),children:[e.jsxs("div",{className:t("flex items-center justify-between p-4 border-b","border-gray-200 dark:border-dark-300 ophelia:border-[#1a1a1a]"),children:[e.jsxs("h3",{className:"text-lg font-semibold text-gray-900 dark:text-gray-100 ophelia:text-[#fafafa]",children:["Model Details: ",we]}),e.jsx("button",{onClick:()=>V(!1),className:"p-1.5 rounded-lg hover:bg-gray-100 dark:hover:bg-dark-200 ophelia:hover:bg-[#1a1a1a]",children:e.jsx(S,{className:"h-5 w-5 text-gray-500 ophelia:text-[#737373]"})})]}),e.jsx("div",{className:"overflow-y-auto max-h-[calc(85vh-60px)] p-4 space-y-4",children:Se?e.jsx("div",{className:"flex items-center justify-center py-8",children:e.jsx(m,{className:"h-6 w-6 animate-spin text-gray-400 ophelia:text-[#737373]"})}):i?e.jsxs(e.Fragment,{children:[i.details&&e.jsxs("div",{children:[e.jsx("h4",{className:"text-sm font-medium text-gray-700 dark:text-gray-300 ophelia:text-[#a3a3a3] mb-2",children:"Model Information"}),e.jsx("div",{className:t("p-3 rounded-lg text-sm","bg-gray-50 dark:bg-dark-50 ophelia:bg-[#121212]"),children:e.jsxs("div",{className:"grid grid-cols-2 gap-2",children:[i.details.family&&e.jsxs("div",{children:[e.jsx("span",{className:"text-gray-500 ophelia:text-[#737373]",children:"Family:"})," ",e.jsx("span",{className:"text-gray-900 dark:text-gray-100 ophelia:text-[#fafafa]",children:i.details.family})]}),i.details.parameter_size&&e.jsxs("div",{children:[e.jsx("span",{className:"text-gray-500 ophelia:text-[#737373]",children:"Parameters:"})," ",e.jsx("span",{className:"text-gray-900 dark:text-gray-100 ophelia:text-[#fafafa]",children:i.details.parameter_size})]}),i.details.quantization_level&&e.jsxs("div",{children:[e.jsx("span",{className:"text-gray-500 ophelia:text-[#737373]",children:"Quantization:"})," ",e.jsx("span",{className:"text-gray-900 dark:text-gray-100 ophelia:text-[#fafafa]",children:i.details.quantization_level})]}),i.details.format&&e.jsxs("div",{children:[e.jsx("span",{className:"text-gray-500 ophelia:text-[#737373]",children:"Format:"})," ",e.jsx("span",{className:"text-gray-900 dark:text-gray-100 ophelia:text-[#fafafa]",children:i.details.format})]})]})})]}),i.system&&e.jsxs("div",{children:[e.jsx("h4",{className:"text-sm font-medium text-gray-700 dark:text-gray-300 ophelia:text-[#a3a3a3] mb-2",children:"System Prompt"}),e.jsx("pre",{className:t("p-3 rounded-lg text-xs overflow-x-auto","bg-gray-50 dark:bg-dark-50 ophelia:bg-[#121212]","text-gray-700 dark:text-gray-300 ophelia:text-[#e5e5e5]"),children:i.system})]}),i.template&&e.jsxs("div",{children:[e.jsx("h4",{className:"text-sm font-medium text-gray-700 dark:text-gray-300 ophelia:text-[#a3a3a3] mb-2",children:"Template"}),e.jsx("pre",{className:t("p-3 rounded-lg text-xs overflow-x-auto max-h-40","bg-gray-50 dark:bg-dark-50 ophelia:bg-[#121212]","text-gray-700 dark:text-gray-300 ophelia:text-[#e5e5e5]"),children:i.template})]}),i.parameters&&e.jsxs("div",{children:[e.jsx("h4",{className:"text-sm font-medium text-gray-700 dark:text-gray-300 ophelia:text-[#a3a3a3] mb-2",children:"Parameters"}),e.jsx("pre",{className:t("p-3 rounded-lg text-xs overflow-x-auto","bg-gray-50 dark:bg-dark-50 ophelia:bg-[#121212]","text-gray-700 dark:text-gray-300 ophelia:text-[#e5e5e5]"),children:i.parameters})]}),i.license&&e.jsxs("div",{children:[e.jsx("h4",{className:"text-sm font-medium text-gray-700 dark:text-gray-300 ophelia:text-[#a3a3a3] mb-2",children:"License"}),e.jsx("pre",{className:t("p-3 rounded-lg text-xs overflow-x-auto max-h-32","bg-gray-50 dark:bg-dark-50 ophelia:bg-[#121212]","text-gray-700 dark:text-gray-300 ophelia:text-[#e5e5e5]"),children:i.license})]}),i.modelfile&&e.jsxs("div",{children:[e.jsx("h4",{className:"text-sm font-medium text-gray-700 dark:text-gray-300 ophelia:text-[#a3a3a3] mb-2",children:"Modelfile"}),e.jsx("pre",{className:t("p-3 rounded-lg text-xs overflow-x-auto max-h-60","bg-gray-50 dark:bg-dark-50 ophelia:bg-[#121212]","text-gray-700 dark:text-gray-300 ophelia:text-[#e5e5e5]"),children:i.modelfile})]})]}):e.jsx("p",{className:"text-center text-gray-500 ophelia:text-[#737373]",children:"No details available"})})]})]}),document.body),ze&&_.createPortal(e.jsxs("div",{className:"fixed inset-0 z-[999999] flex items-center justify-center p-4",children:[e.jsx("div",{className:"absolute inset-0 bg-black/50 backdrop-blur-sm",onClick:()=>N(!1)}),e.jsxs("div",{className:t("relative w-full max-w-md rounded-xl border shadow-2xl","bg-white dark:bg-dark-100 ophelia:bg-[#0a0a0a]","border-gray-200 dark:border-dark-300 ophelia:border-[#1a1a1a]"),children:[e.jsxs("div",{className:t("flex items-center justify-between p-4 border-b","border-gray-200 dark:border-dark-300 ophelia:border-[#1a1a1a]"),children:[e.jsx("h3",{className:"text-lg font-semibold text-gray-900 dark:text-gray-100 ophelia:text-[#fafafa]",children:"Copy Model"}),e.jsx("button",{onClick:()=>N(!1),className:"p-1.5 rounded-lg hover:bg-gray-100 dark:hover:bg-dark-200 ophelia:hover:bg-[#1a1a1a]",children:e.jsx(S,{className:"h-5 w-5 text-gray-500 ophelia:text-[#737373]"})})]}),e.jsxs("div",{className:"p-4 space-y-4",children:[e.jsxs("div",{children:[e.jsx("label",{className:"block text-sm font-medium text-gray-700 dark:text-gray-300 ophelia:text-[#a3a3a3] mb-1",children:"Source Model"}),e.jsxs("select",{value:P,onChange:a=>q(a.target.value),className:t("w-full px-3 py-2 rounded-lg border text-sm","bg-gray-50 dark:bg-dark-50 ophelia:bg-[#121212]","border-gray-200 dark:border-dark-300 ophelia:border-[#262626]","text-gray-900 dark:text-gray-100 ophelia:text-[#fafafa]"),children:[e.jsx("option",{value:"",children:"Select a model..."}),x.map(a=>e.jsx("option",{value:a.name,children:a.name},a.name))]})]}),e.jsxs("div",{children:[e.jsx("label",{className:"block text-sm font-medium text-gray-700 dark:text-gray-300 ophelia:text-[#a3a3a3] mb-1",children:"New Model Name"}),e.jsx("input",{type:"text",value:w,onChange:a=>ae(a.target.value),placeholder:"e.g., my-custom-model",className:t("w-full px-3 py-2 rounded-lg border text-sm","bg-gray-50 dark:bg-dark-50 ophelia:bg-[#121212]","border-gray-200 dark:border-dark-300 ophelia:border-[#262626]","text-gray-900 dark:text-gray-100 ophelia:text-[#fafafa]","placeholder-gray-500 ophelia:placeholder-[#525252]")})]}),e.jsxs(n,{onClick:Te,disabled:!P.trim()||!w.trim()||W,className:t("w-full gap-2","ophelia:bg-[#9333ea] ophelia:hover:bg-[#7c3aed] ophelia:text-white"),children:[W?e.jsx(m,{className:"h-4 w-4 animate-spin"}):e.jsx(K,{className:"h-4 w-4"}),W?"Copying...":"Copy Model"]})]})]})]}),document.body),Ee&&_.createPortal(e.jsxs("div",{className:"fixed inset-0 z-[999999] flex items-center justify-center p-4",children:[e.jsx("div",{className:"absolute inset-0 bg-black/50 backdrop-blur-sm",onClick:()=>F(!1)}),e.jsxs("div",{className:t("relative w-full max-w-lg rounded-xl border shadow-2xl","bg-white dark:bg-dark-100 ophelia:bg-[#0a0a0a]","border-gray-200 dark:border-dark-300 ophelia:border-[#1a1a1a]"),children:[e.jsxs("div",{className:t("flex items-center justify-between p-4 border-b","border-gray-200 dark:border-dark-300 ophelia:border-[#1a1a1a]"),children:[e.jsx("h3",{className:"text-lg font-semibold text-gray-900 dark:text-gray-100 ophelia:text-[#fafafa]",children:"Create Custom Model"}),e.jsx("button",{onClick:()=>F(!1),className:"p-1.5 rounded-lg hover:bg-gray-100 dark:hover:bg-dark-200 ophelia:hover:bg-[#1a1a1a]",children:e.jsx(S,{className:"h-5 w-5 text-gray-500 ophelia:text-[#737373]"})})]}),e.jsxs("div",{className:"p-4 space-y-4",children:[e.jsxs("div",{children:[e.jsx("label",{className:"block text-sm font-medium text-gray-700 dark:text-gray-300 ophelia:text-[#a3a3a3] mb-1",children:"Model Name"}),e.jsx("input",{type:"text",value:M,onChange:a=>re(a.target.value),placeholder:"e.g., my-assistant",className:t("w-full px-3 py-2 rounded-lg border text-sm","bg-gray-50 dark:bg-dark-50 ophelia:bg-[#121212]","border-gray-200 dark:border-dark-300 ophelia:border-[#262626]","text-gray-900 dark:text-gray-100 ophelia:text-[#fafafa]","placeholder-gray-500 ophelia:placeholder-[#525252]")})]}),e.jsxs("div",{children:[e.jsx("label",{className:"block text-sm font-medium text-gray-700 dark:text-gray-300 ophelia:text-[#a3a3a3] mb-1",children:"Modelfile"}),e.jsx("textarea",{value:L,onChange:a=>se(a.target.value),placeholder:`FROM llama3.2
2
2
  SYSTEM You are a helpful assistant.`,rows:8,className:t("w-full px-3 py-2 rounded-lg border text-sm font-mono","bg-gray-50 dark:bg-dark-50 ophelia:bg-[#121212]","border-gray-200 dark:border-dark-300 ophelia:border-[#262626]","text-gray-900 dark:text-gray-100 ophelia:text-[#fafafa]","placeholder-gray-500 ophelia:placeholder-[#525252]","resize-none")}),e.jsxs("p",{className:"mt-1 text-xs text-gray-500 ophelia:text-[#737373]",children:["See"," ",e.jsx("a",{href:"https://github.com/ollama/ollama/blob/main/docs/modelfile.md",target:"_blank",rel:"noopener noreferrer",className:"text-primary-600 ophelia:text-[#a855f7] hover:underline",children:"Modelfile docs"})," ","for syntax reference"]})]}),e.jsxs(n,{onClick:Ie,disabled:!M.trim()||!L.trim()||U,className:t("w-full gap-2","ophelia:bg-[#9333ea] ophelia:hover:bg-[#7c3aed] ophelia:text-white"),children:[U?e.jsx(m,{className:"h-4 w-4 animate-spin"}):e.jsx(pe,{className:"h-4 w-4"}),U?"Creating...":"Create Model"]})]})]})]}),document.body),Pe&&_.createPortal(e.jsxs("div",{className:"fixed inset-0 z-[999999] flex items-center justify-center p-4",children:[e.jsx("div",{className:"absolute inset-0 bg-black/50 backdrop-blur-sm",onClick:()=>Y(!1)}),e.jsxs("div",{className:t("relative w-full max-w-lg rounded-xl border shadow-2xl","bg-white dark:bg-dark-100 ophelia:bg-[#0a0a0a]","border-gray-200 dark:border-dark-300 ophelia:border-[#1a1a1a]"),children:[e.jsxs("div",{className:t("flex items-center justify-between p-4 border-b","border-gray-200 dark:border-dark-300 ophelia:border-[#1a1a1a]"),children:[e.jsx("h3",{className:"text-lg font-semibold text-gray-900 dark:text-gray-100 ophelia:text-[#fafafa]",children:"Test Embeddings"}),e.jsx("button",{onClick:()=>Y(!1),className:"p-1.5 rounded-lg hover:bg-gray-100 dark:hover:bg-dark-200 ophelia:hover:bg-[#1a1a1a]",children:e.jsx(S,{className:"h-5 w-5 text-gray-500 ophelia:text-[#737373]"})})]}),e.jsxs("div",{className:"p-4 space-y-4",children:[e.jsxs("div",{children:[e.jsx("label",{className:"block text-sm font-medium text-gray-700 dark:text-gray-300 ophelia:text-[#a3a3a3] mb-1",children:"Embedding Model"}),e.jsxs("select",{value:D,onChange:a=>Fe(a.target.value),className:t("w-full px-3 py-2 rounded-lg border text-sm","bg-gray-50 dark:bg-dark-50 ophelia:bg-[#121212]","border-gray-200 dark:border-dark-300 ophelia:border-[#262626]","text-gray-900 dark:text-gray-100 ophelia:text-[#fafafa]"),children:[e.jsx("option",{value:"",children:"Select a model..."}),x.map(a=>e.jsx("option",{value:a.name,children:a.name},a.name))]}),e.jsx("p",{className:"mt-1 text-xs text-gray-500 ophelia:text-[#737373]",children:"Recommended: nomic-embed-text, mxbai-embed-large"})]}),e.jsxs("div",{children:[e.jsx("label",{className:"block text-sm font-medium text-gray-700 dark:text-gray-300 ophelia:text-[#a3a3a3] mb-1",children:"Input Text"}),e.jsx("textarea",{value:R,onChange:a=>Le(a.target.value),placeholder:"Enter text to generate embeddings for...",rows:3,className:t("w-full px-3 py-2 rounded-lg border text-sm","bg-gray-50 dark:bg-dark-50 ophelia:bg-[#121212]","border-gray-200 dark:border-dark-300 ophelia:border-[#262626]","text-gray-900 dark:text-gray-100 ophelia:text-[#fafafa]","placeholder-gray-500 ophelia:placeholder-[#525252]","resize-none")})]}),e.jsxs(n,{onClick:Oe,disabled:!D.trim()||!R.trim()||Z,className:t("w-full gap-2","ophelia:bg-[#9333ea] ophelia:hover:bg-[#7c3aed] ophelia:text-white"),children:[Z?e.jsx(m,{className:"h-4 w-4 animate-spin"}):e.jsx(be,{className:"h-4 w-4"}),Z?"Generating...":"Generate Embeddings"]}),A&&e.jsxs("div",{children:[e.jsxs("label",{className:"block text-sm font-medium text-gray-700 dark:text-gray-300 ophelia:text-[#a3a3a3] mb-1",children:["Result (",A.length," dimensions)"]}),e.jsxs("pre",{className:t("p-3 rounded-lg text-xs overflow-x-auto max-h-32","bg-gray-50 dark:bg-dark-50 ophelia:bg-[#121212]","text-gray-700 dark:text-gray-300 ophelia:text-[#e5e5e5]"),children:["[",A.slice(0,10).join(", "),A.length>10&&", ..."," ]"]})]})]})]})]}),document.body)]})},ba=()=>e.jsx("div",{className:"h-full overflow-auto",children:e.jsxs("div",{className:"max-w-6xl mx-auto p-6",children:[e.jsxs("div",{className:"text-center max-w-md mx-auto mb-8",children:[e.jsx("h2",{className:"libre-brand text-4xl sm:text-5xl font-normal text-gray-900 dark:text-dark-800 ophelia:text-[#fafafa] mb-3",style:{fontWeight:300,letterSpacing:"0.01em"},children:"Models"}),e.jsx("p",{className:"text-gray-600 dark:text-dark-600 ophelia:text-[#a3a3a3] leading-relaxed",children:"Pull, manage, and monitor your Ollama models"})]}),e.jsx(na,{})]})});export{ba as ModelsPage,ba as default};
@@ -1,4 +1,4 @@
1
- import{j as e}from"./markdown-vendor-DRtqGHm3.js";import{r as d}from"./router-vendor-B-t91v39.js";import{e as C,c as L,B as F,A as oe,o as ne}from"../assets/index-BAlYrgVl.js";import{n as O,ap as V,j as X,a3 as G,ab as ce,c as me,Z as te,D as z,aq as xe,f as ge,ar as pe,as as he,at as ue,Q as be,T as se,z as i,X as ye,I as ke,U as fe,o as ve,S as je,a1 as ee,ad as Ne,ak as we,au as ae,b as Ce,C as _e}from"./ui-vendor-DA07XX1l.js";import"./react-vendor-N--QU9DW.js";import"./utils-vendor-DNzxLBGx.js";const Se=({persona:r,onEdit:y,onDelete:_,onDownload:t,onSelect:b,onToggleFavorite:f,isSelected:v=!1,compact:h=!1})=>{const[u,M]=d.useState(null),[j,s]=d.useState(!1),[c,m]=d.useState(!1),l=!!(r.memory_settings?.enabled||r.mutation_settings?.enabled),o=d.useCallback(async()=>{if(l)try{const x=await C.getMemoryStatus(r.id);x.success&&x.data&&M(x.data)}catch(x){console.error("Failed to load memory status:",x)}},[r.id,l]);d.useEffect(()=>{o()},[o]);const N=async()=>{if(confirm("Are you sure you want to wipe all memories for this persona? This action cannot be undone.")){m(!0);try{const x=await C.wipeMemories(r.id);x.success?(i.success(`Wiped ${x.data?.deleted_count||0} memories`),await o()):i.error("Failed to wipe memories")}catch(x){i.error("Failed to wipe memories"),console.error(x)}finally{m(!1),s(!1)}}},n=async()=>{m(!0);try{const x=await C.backupPersona(r.id),R=window.URL.createObjectURL(x),S=document.createElement("a");S.href=R,S.download=`${r.name.toLowerCase().replace(/\s+/g,"-")}-backup.json`,document.body.appendChild(S),S.click(),window.URL.revokeObjectURL(R),document.body.removeChild(S),i.success("Persona backup downloaded successfully")}catch(x){i.error("Failed to backup persona"),console.error(x)}finally{m(!1),s(!1)}},w=async()=>{m(!0);try{const x=await C.exportPersonaDNA(r.id),R=window.URL.createObjectURL(x),S=document.createElement("a");S.href=R,S.download=`${r.name.toLowerCase().replace(/\s+/g,"-")}-dna.json`,document.body.appendChild(S),S.click(),window.URL.revokeObjectURL(R),document.body.removeChild(S),i.success("Persona DNA exported successfully")}catch(x){i.error("Failed to export persona DNA"),console.error(x)}finally{m(!1),s(!1)}},E=()=>r.avatar?r.avatar:`https://ui-avatars.com/api/?name=${encodeURIComponent(r.name)}&background=6366f1&color=fff&size=128`,T=x=>x<1?`${(x*1024).toFixed(0)} KB`:`${x.toFixed(1)} MB`;return h?e.jsxs("div",{className:L("group relative flex items-center gap-3 p-3 rounded-xl cursor-pointer transition-all duration-200","border border-transparent","hover:bg-gray-50 dark:hover:bg-dark-100 ophelia:hover:bg-[#1a1a1a]",v&&["bg-primary-50 dark:bg-primary-900/20 ophelia:bg-[#9333ea]/10","border-primary-200 dark:border-primary-700 ophelia:border-[#7c3aed]"]),onClick:()=>b?.(r),children:[e.jsxs("div",{className:"relative flex-shrink-0",children:[e.jsx("img",{src:E(),alt:r.name,className:"w-10 h-10 rounded-full object-cover ring-2 ring-white dark:ring-dark-100 ophelia:ring-[#0a0a0a]"}),l&&e.jsx("div",{className:"absolute -bottom-0.5 -right-0.5 w-4 h-4 bg-gradient-to-br from-purple-500 to-primary-500 rounded-full flex items-center justify-center",children:e.jsx(O,{className:"h-2.5 w-2.5 text-white"})})]}),e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx("h4",{className:"font-medium text-sm text-gray-900 dark:text-gray-100 ophelia:text-[#fafafa] truncate",children:r.name}),r.is_favorite&&e.jsx(V,{className:"h-3 w-3 text-amber-500 fill-amber-500 flex-shrink-0"})]}),e.jsx("p",{className:"text-xs text-gray-500 dark:text-gray-400 ophelia:text-[#a3a3a3] truncate",children:r.model})]}),v&&e.jsx("div",{className:"flex-shrink-0",children:e.jsx("div",{className:"w-6 h-6 rounded-full bg-primary-500 dark:bg-primary-600 ophelia:bg-[#9333ea] flex items-center justify-center",children:e.jsx(X,{className:"h-3 w-3 text-white ml-0.5"})})})]}):e.jsxs("div",{className:L("group relative rounded-2xl overflow-hidden transition-all duration-300","bg-white dark:bg-dark-100 ophelia:bg-[#0a0a0a]","border border-gray-200/60 dark:border-dark-300/60 ophelia:border-[#262626]","hover:border-gray-300 dark:hover:border-dark-400 ophelia:hover:border-[#3f3f46]","shadow-sm hover:shadow-lg dark:shadow-none",v&&["ring-2 ring-primary-500 dark:ring-primary-400 ophelia:ring-[#9333ea]","border-primary-300 dark:border-primary-600 ophelia:border-[#7c3aed]"]),children:[e.jsxs("div",{className:"relative h-20",children:[r.background?e.jsx("div",{className:"absolute inset-0 bg-cover bg-center",style:{backgroundImage:`url(${r.background})`}}):e.jsx("div",{className:"absolute inset-0 bg-gradient-to-br from-primary-400 via-primary-500 to-purple-600 dark:from-primary-600 dark:via-primary-700 dark:to-purple-800 ophelia:from-[#9333ea] ophelia:via-[#7c3aed] ophelia:to-[#6d28d9]"}),e.jsx("div",{className:"absolute inset-0 bg-black/10 dark:bg-black/20"}),e.jsxs("div",{className:"absolute top-3 left-3 right-3 flex items-start justify-between",children:[e.jsx("button",{onClick:x=>{x.stopPropagation(),f?.(r)},className:L("p-1.5 rounded-full transition-all duration-200","bg-white/20 hover:bg-white/30 backdrop-blur-sm",r.is_favorite&&"bg-amber-500/80 hover:bg-amber-500"),children:e.jsx(V,{className:L("h-4 w-4",r.is_favorite?"text-white fill-white":"text-white/80 hover:text-white")})}),l&&e.jsxs("div",{className:"flex items-center gap-1 px-2 py-1 rounded-full bg-white/20 backdrop-blur-sm text-white text-[10px] font-medium",children:[e.jsx(O,{className:"h-3 w-3"}),"Enhanced"]})]})]}),e.jsx("div",{className:"relative px-4 -mt-8",children:e.jsxs("div",{className:"relative inline-block",children:[e.jsx("img",{src:E(),alt:r.name,className:"w-16 h-16 rounded-xl object-cover ring-4 ring-white dark:ring-dark-100 ophelia:ring-[#0a0a0a] shadow-lg"}),l&&e.jsx("div",{className:"absolute -bottom-1 -right-1 w-6 h-6 bg-gradient-to-br from-purple-500 to-primary-500 rounded-lg flex items-center justify-center shadow-sm",children:e.jsx(G,{className:"h-3.5 w-3.5 text-white"})})]})}),e.jsxs("div",{className:"px-4 pt-3 pb-4",children:[e.jsxs("div",{className:"mb-3",children:[e.jsx("h3",{className:"text-lg font-semibold text-gray-900 dark:text-gray-100 ophelia:text-[#fafafa] leading-tight",children:r.name}),e.jsxs("p",{className:"text-sm text-gray-500 dark:text-gray-400 ophelia:text-[#a3a3a3] flex items-center gap-1.5 mt-0.5",children:[e.jsx(ce,{className:"h-3.5 w-3.5"}),r.model]})]}),r.description&&e.jsx("p",{className:"text-sm text-gray-600 dark:text-gray-400 ophelia:text-[#a3a3a3] line-clamp-2 mb-3",children:r.description}),r.parameters.system_prompt&&e.jsxs("div",{className:"mb-3 p-2.5 rounded-lg bg-gray-50 dark:bg-dark-50 ophelia:bg-[#121212] border border-gray-100 dark:border-dark-200 ophelia:border-[#1a1a1a]",children:[e.jsxs("div",{className:"flex items-center gap-1.5 mb-1",children:[e.jsx(me,{className:"h-3 w-3 text-gray-400 dark:text-gray-500 ophelia:text-[#737373]"}),e.jsx("span",{className:"text-[10px] uppercase tracking-wider font-medium text-gray-400 dark:text-gray-500 ophelia:text-[#737373]",children:"System Prompt"})]}),e.jsxs("p",{className:"text-xs text-gray-600 dark:text-gray-400 ophelia:text-[#a3a3a3] line-clamp-2 italic",children:["“",r.parameters.system_prompt,"”"]})]}),e.jsxs("div",{className:"flex flex-wrap gap-1.5 mb-3",children:[e.jsxs("span",{className:"inline-flex items-center gap-1 px-2 py-1 rounded-md text-[11px] font-medium bg-gray-100 dark:bg-dark-200 ophelia:bg-[#1a1a1a] text-gray-600 dark:text-gray-400 ophelia:text-[#a3a3a3]",children:[e.jsx(te,{className:"h-3 w-3"}),r.parameters.temperature?.toFixed(1)||"0.7"]}),e.jsxs("span",{className:"inline-flex items-center px-2 py-1 rounded-md text-[11px] font-medium bg-gray-100 dark:bg-dark-200 ophelia:bg-[#1a1a1a] text-gray-600 dark:text-gray-400 ophelia:text-[#a3a3a3]",children:["Top-P ",r.parameters.top_p?.toFixed(1)||"0.9"]}),e.jsxs("span",{className:"inline-flex items-center px-2 py-1 rounded-md text-[11px] font-medium bg-gray-100 dark:bg-dark-200 ophelia:bg-[#1a1a1a] text-gray-600 dark:text-gray-400 ophelia:text-[#a3a3a3]",children:[(r.parameters.context_window||4096).toLocaleString()," ctx"]})]}),l&&u&&e.jsx("div",{className:"mb-3 p-2.5 rounded-lg bg-gradient-to-r from-primary-50 to-purple-50 dark:from-primary-900/20 dark:to-purple-900/20 ophelia:from-[#9333ea]/10 ophelia:to-[#6d28d9]/10 border border-primary-100 dark:border-primary-800/30 ophelia:border-[#7c3aed]/20",children:e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(z,{className:"h-4 w-4 text-primary-600 dark:text-primary-400 ophelia:text-[#a855f7]"}),e.jsxs("div",{children:[e.jsxs("span",{className:"text-xs font-medium text-primary-700 dark:text-primary-300 ophelia:text-[#c084fc]",children:[u.memory_count," memories"]}),e.jsx("span",{className:"text-[10px] text-primary-600/70 dark:text-primary-400/70 ophelia:text-[#a855f7]/70 ml-2",children:T(u.size_mb)})]})]}),u.status&&e.jsx("span",{className:L("text-[10px] px-1.5 py-0.5 rounded-full font-medium",u.status==="active"?"bg-green-100 dark:bg-green-900/30 text-green-700 dark:text-green-400":"bg-gray-100 dark:bg-dark-200 text-gray-600 dark:text-gray-400"),children:u.status})]})}),e.jsxs("div",{className:"flex items-center justify-between pt-3 border-t border-gray-100 dark:border-dark-200 ophelia:border-[#1a1a1a]",children:[b&&e.jsxs(F,{onClick:()=>b(r),size:"sm",className:"bg-primary-500 hover:bg-primary-600 dark:bg-primary-600 dark:hover:bg-primary-500 ophelia:bg-[#9333ea] ophelia:hover:bg-[#a855f7] text-white px-4",children:[e.jsx(X,{className:"h-3.5 w-3.5 mr-1.5"}),"Use"]}),e.jsxs("div",{className:"flex items-center gap-1 ml-auto",children:[e.jsx("button",{onClick:()=>y(r),className:"p-2 rounded-lg text-gray-500 hover:text-gray-700 dark:text-gray-400 dark:hover:text-gray-200 ophelia:text-[#737373] ophelia:hover:text-[#e5e5e5] hover:bg-gray-100 dark:hover:bg-dark-200 ophelia:hover:bg-[#1a1a1a] transition-colors",title:"Edit persona",children:e.jsx(xe,{className:"h-4 w-4"})}),e.jsx("button",{onClick:()=>t(r),className:"p-2 rounded-lg text-gray-500 hover:text-gray-700 dark:text-gray-400 dark:hover:text-gray-200 ophelia:text-[#737373] ophelia:hover:text-[#e5e5e5] hover:bg-gray-100 dark:hover:bg-dark-200 ophelia:hover:bg-[#1a1a1a] transition-colors",title:"Download persona",children:e.jsx(ge,{className:"h-4 w-4"})}),e.jsxs("div",{className:"relative",children:[e.jsx("button",{onClick:()=>s(!j),className:"p-2 rounded-lg text-gray-500 hover:text-gray-700 dark:text-gray-400 dark:hover:text-gray-200 ophelia:text-[#737373] ophelia:hover:text-[#e5e5e5] hover:bg-gray-100 dark:hover:bg-dark-200 ophelia:hover:bg-[#1a1a1a] transition-colors",children:e.jsx(pe,{className:"h-4 w-4"})}),j&&e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"fixed inset-0 z-10",onClick:()=>s(!1)}),e.jsxs("div",{className:"absolute right-0 bottom-full mb-1 w-44 py-1 bg-white dark:bg-dark-100 ophelia:bg-[#0a0a0a] rounded-xl shadow-lg border border-gray-200 dark:border-dark-300 ophelia:border-[#262626] z-20",children:[l&&e.jsxs(e.Fragment,{children:[e.jsxs("button",{onClick:n,disabled:c,className:"w-full flex items-center gap-2 px-3 py-2 text-sm text-gray-700 dark:text-gray-300 ophelia:text-[#e5e5e5] hover:bg-gray-50 dark:hover:bg-dark-50 ophelia:hover:bg-[#1a1a1a] disabled:opacity-50",children:[e.jsx(he,{className:"h-4 w-4"}),"Backup"]}),e.jsxs("button",{onClick:w,disabled:c,className:"w-full flex items-center gap-2 px-3 py-2 text-sm text-gray-700 dark:text-gray-300 ophelia:text-[#e5e5e5] hover:bg-gray-50 dark:hover:bg-dark-50 ophelia:hover:bg-[#1a1a1a] disabled:opacity-50",children:[e.jsx(ue,{className:"h-4 w-4"}),"Export DNA"]}),u&&u.memory_count>0&&e.jsxs("button",{onClick:N,disabled:c,className:"w-full flex items-center gap-2 px-3 py-2 text-sm text-red-600 dark:text-red-400 hover:bg-red-50 dark:hover:bg-red-900/20 disabled:opacity-50",children:[e.jsx(be,{className:"h-4 w-4"}),"Wipe Memories"]}),e.jsx("div",{className:"my-1 border-t border-gray-100 dark:border-dark-200 ophelia:border-[#1a1a1a]"})]}),e.jsxs("button",{onClick:()=>{_(r),s(!1)},className:"w-full flex items-center gap-2 px-3 py-2 text-sm text-red-600 dark:text-red-400 hover:bg-red-50 dark:hover:bg-red-900/20",children:[e.jsx(se,{className:"h-4 w-4"}),"Delete"]})]})]})]})]})]})]})]})},Pe=({value:r,onChange:y,className:_=""})=>{const t=d.useRef(null),[b,f]=d.useState(!1),[v,h]=d.useState(!1),u=async l=>{if(!l.type.startsWith("image/")){i.error("Please select a valid image file");return}if(l.size>5*1024*1024){i.error("Background image size must be less than 5MB");return}f(!0);try{const o=new FileReader;o.onload=N=>{const n=N.target?.result;y(n),i.success("Background uploaded successfully")},o.onerror=()=>{i.error("Failed to read image file")},o.readAsDataURL(l)}catch(o){console.error("Failed to upload background:",o),i.error("Failed to upload background image")}finally{f(!1)}},M=l=>{const o=l.target.files?.[0];o&&u(o)},j=l=>{l.preventDefault(),h(!0)},s=l=>{l.preventDefault(),h(!1)},c=l=>{l.preventDefault(),h(!1);const o=l.dataTransfer.files?.[0];o&&u(o)},m=()=>{y(""),i.success("Background removed")};return e.jsx("div",{className:`space-y-4 ${_}`,children:e.jsxs("div",{children:[e.jsx("label",{className:"block text-sm font-medium text-gray-700 dark:text-dark-600 mb-2",children:"Background Image"}),e.jsxs("div",{className:"space-y-3",children:[r?e.jsxs("div",{className:"space-y-3",children:[e.jsx("div",{className:"w-full h-32 rounded-lg bg-cover bg-center border-2 border-gray-300 dark:border-dark-300",style:{backgroundImage:`url(${r})`}}),e.jsxs("div",{className:"flex items-center gap-3 p-3 bg-gray-50 dark:bg-dark-200 rounded-lg",children:[e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsx("p",{className:"text-sm font-medium text-gray-900 dark:text-gray-100 truncate",children:"Custom background image"}),e.jsx("p",{className:"text-xs text-gray-500 dark:text-gray-400",children:"Click to change or remove"})]}),e.jsx(F,{variant:"ghost",size:"sm",onClick:m,className:"text-red-600 hover:text-red-700 hover:bg-red-50 dark:text-red-400 dark:hover:text-red-300 dark:hover:bg-red-900/20",children:e.jsx(ye,{className:"h-4 w-4"})})]})]}):e.jsxs("div",{className:`border-2 border-dashed rounded-lg p-6 text-center cursor-pointer transition-colors ${v?"border-primary-500 bg-primary-50 dark:bg-primary-900/20":"border-gray-300 dark:border-gray-600 hover:border-gray-400 dark:hover:border-gray-500"}`,onDragOver:j,onDragLeave:s,onDrop:c,onClick:()=>t.current?.click(),children:[e.jsx(ke,{className:"h-12 w-12 mx-auto text-gray-400 dark:text-gray-500 mb-4"}),e.jsx("p",{className:"text-sm font-medium text-gray-900 dark:text-gray-100 mb-2",children:"Upload background image"}),e.jsx("p",{className:"text-xs text-gray-500 dark:text-gray-400 mb-4",children:"Drag and drop an image or click to browse"}),e.jsxs(F,{variant:"outline",size:"sm",disabled:b,className:"mx-auto",children:[e.jsx(fe,{className:"h-4 w-4 mr-2"}),b?"Uploading...":"Choose Image"]})]}),e.jsxs("div",{children:[e.jsx("label",{className:"block text-xs font-medium text-gray-600 dark:text-gray-400 mb-1",children:"Or enter image URL"}),e.jsx("input",{type:"url",value:r,onChange:l=>y(l.target.value),className:"w-full px-3 py-2 text-sm border border-gray-300 dark:border-dark-300 rounded-md bg-white dark:bg-dark-50 text-gray-900 dark:text-dark-800",placeholder:"https://example.com/background.jpg"})]})]}),e.jsx("input",{ref:t,type:"file",accept:"image/*",onChange:M,className:"hidden"}),e.jsx("p",{className:"text-xs text-gray-500 dark:text-gray-400 mt-2",children:"Supports: JPG, PNG, GIF, WebP (max 5MB). Wide landscape images work best."})]})})},J=({label:r,value:y,min:_,max:t,step:b,onChange:f,hint:v,format:h=M=>String(M),colorClass:u="text-gray-700 dark:text-dark-600"})=>{const M=(y-_)/(t-_)*100;return e.jsxs("div",{children:[e.jsxs("label",{className:L("block text-sm font-medium mb-2",u),children:[r,": ",h(y)]}),e.jsx("input",{type:"range",min:_,max:t,step:b,value:y,onChange:j=>f(parseFloat(j.target.value)),className:"w-full h-2 bg-gray-200 dark:bg-dark-200 rounded-lg appearance-none cursor-pointer slider",style:{"--progress":`${M}%`}}),v&&e.jsx("p",{className:L("text-xs mt-1",u.replace("700","500").replace("600","400")),children:v})]})},$=({label:r,checked:y,onChange:_,colorClass:t="text-gray-700 dark:text-dark-600"})=>e.jsxs("label",{className:"flex items-center gap-3 cursor-pointer",children:[e.jsx("div",{className:L("relative w-10 h-5 rounded-full transition-colors",y?"bg-primary-500 dark:bg-primary-600":"bg-gray-300 dark:bg-dark-300"),onClick:()=>_(!y),children:e.jsx("div",{className:L("absolute top-0.5 left-0.5 w-4 h-4 rounded-full bg-white shadow transition-transform",y&&"translate-x-5")})}),e.jsx("span",{className:L("text-sm font-medium",t),children:r})]}),q={name:"",description:"",model:"",parameters:{temperature:.7,top_p:.9,top_k:40,context_window:4096,max_tokens:1024,system_prompt:"",repeat_penalty:1.1,presence_penalty:0,frequency_penalty:0},avatar:"",background:"",embedding_model:"",memory_settings:{enabled:!1,max_memories:1e3,auto_cleanup:!0,retention_days:90},mutation_settings:{enabled:!1,sensitivity:"medium",auto_adapt:!0}},re=["embed","e5","bge","gte","minilm","multilingual","sentence","universal","instructor","jina","paraphrase","mpnet","contriever"],Me=({persona:r,onSubmit:y,onCancel:_})=>{const[t,b]=d.useState(q),[f,v]=d.useState([]),[h,u]=d.useState([]),[M,j]=d.useState(!1),[s,c]=d.useState(!1),[m,l]=d.useState(!1),[o,N]=d.useState(null),[n,w]=d.useState("basic"),[E,T]=d.useState(null),[x,R]=d.useState(!1),[S,Y]=d.useState(!1),H=d.useRef(!1),I=d.useCallback((a,p)=>{b(k=>({...k,[a]:p})),N(null)},[]),Q=d.useCallback((a,p)=>{b(k=>({...k,parameters:{...k.parameters,[a]:p}})),N(null)},[]),U=d.useCallback((a,p)=>{b(k=>({...k,[a]:{...k[a],...p}})),N(null)},[]),Z=d.useCallback(a=>{const p=a.filter(g=>re.some(P=>g.name.toLowerCase().includes(P.toLowerCase()))).map(g=>({id:g.name,name:g.name,description:`${g.details?.parameter_size||"Unknown size"} - ${g.details?.family||"Ollama model"}`,provider:"ollama",dimensions:768,isDetectedEmbedding:!0})),k=a.filter(g=>!re.some(P=>g.name.toLowerCase().includes(P.toLowerCase()))).map(g=>({id:g.name,name:g.name,description:`${g.details?.parameter_size||"Unknown size"} - ${g.details?.family||"Other model"}`,provider:"ollama",dimensions:768,isDetectedEmbedding:!1})),D=[...p,...k].reduce((g,P)=>(g.find(W=>W.id===P.id)||g.push(P),g),[]);return D.length>0?D:[{id:"nomic-embed-text",name:"nomic-embed-text",description:"Default embedding model (install if needed)",provider:"ollama",dimensions:768}]},[]),B=d.useCallback(async()=>{if(r?.id){R(!0);try{const a=await C.getMemoryStatus(r.id);a.success&&a.data&&T(a.data)}catch(a){console.error("Failed to load memory status:",a)}finally{R(!1)}}},[r?.id]),de=async()=>{if(r?.id&&confirm("Are you sure you want to wipe all memories? This cannot be undone.")){Y(!0);try{const a=await C.wipeMemories(r.id);a.success?(i.success(`Wiped ${a.data?.deleted_count||0} memories`),await B()):i.error("Failed to wipe memories")}catch{i.error("Failed to wipe memories")}finally{Y(!1)}}};d.useEffect(()=>{if(H.current)return;H.current=!0,(async()=>{j(!0);try{const[p,k]=await Promise.all([ne.getModels(),r?Promise.resolve(null):C.getDefaultParameters()]);if(p.success&&p.data){v(p.data);const A=Z(p.data);if(u(A),r){if(b({name:r.name,description:r.description||"",model:r.model,parameters:r.parameters,avatar:r.avatar||"",background:r.background||"",embedding_model:r.embedding_model||A[0]?.id||"",memory_settings:r.memory_settings||q.memory_settings,mutation_settings:r.mutation_settings||q.mutation_settings}),r.embedding_model&&!A.find(D=>D.id===r.embedding_model)){const D=r.embedding_model.split(":")[0],g=A.find(P=>P.id.startsWith(D+":")||P.id===D);g?b(P=>({...P,embedding_model:g.id})):u(P=>[...P,{id:r.embedding_model,name:r.embedding_model,description:"Previously selected model (not currently installed)",provider:"ollama",dimensions:768}])}}else{const D=k?.success?k.data:{};b(g=>({...g,parameters:{...g.parameters,...D},embedding_model:A[0]?.id||""}))}}}catch(p){console.error("Error loading data:",p)}finally{j(!1)}})()},[r,Z]),d.useEffect(()=>{r?.id&&t.memory_settings?.enabled&&B()},[r?.id,t.memory_settings?.enabled,B]);const K=async a=>{c(!0),l(a);try{const p={name:t.name,description:t.description,model:t.model,parameters:t.parameters,avatar:t.avatar,background:t.background,embedding_model:t.embedding_model,memory_settings:t.memory_settings,mutation_settings:t.mutation_settings},k=r?await C.updatePersona(r.id,p):await C.createPersona(t);k.success?(i.success(r?"Persona updated":"Persona created"),N(new Date),a&&y()):i.error(`Failed to save: ${k.error}`)}catch(p){i.error(`Failed to save: ${p instanceof Error?p.message:String(p)}`)}finally{c(!1),l(!1)}},le=d.useMemo(()=>[{id:"basic",label:"Basic",icon:ve},{id:"parameters",label:"Parameters",icon:je},{id:"memory",label:"Memory & Learning",icon:O},{id:"advanced",label:"Advanced",icon:G}],[]),ie=d.useMemo(()=>[{key:"temperature",label:"Temperature",min:0,max:2,step:.1,hint:"Controls creativity vs consistency",format:a=>a.toFixed(1)},{key:"top_p",label:"Top-P",min:0,max:1,step:.1,hint:"Controls response diversity",format:a=>a.toFixed(1)},{key:"top_k",label:"Top-K",min:1,max:100,step:1,hint:"Limits vocabulary to top-k tokens",format:a=>String(Math.round(a))},{key:"context_window",label:"Context Window",min:128,max:131072,step:128,hint:"Maximum conversation history length",format:a=>String(Math.round(a))},{key:"max_tokens",label:"Max Tokens",min:1,max:8192,step:1,hint:"Maximum response length",format:a=>String(Math.round(a))},{key:"repeat_penalty",label:"Repeat Penalty",min:.5,max:2,step:.1,hint:"Reduces repetitive responses",format:a=>a.toFixed(1)}],[]);return M?e.jsx("div",{className:"flex items-center justify-center p-8",children:e.jsxs("div",{className:"animate-pulse flex items-center gap-3",children:[e.jsx("div",{className:"w-5 h-5 border-2 border-primary-500 border-t-transparent rounded-full animate-spin"}),e.jsx("span",{className:"text-gray-600 dark:text-gray-400",children:"Loading form..."})]})}):e.jsxs("div",{className:"max-w-4xl mx-auto",children:[e.jsxs("div",{className:"mb-6",children:[e.jsx("h1",{className:"text-2xl font-bold text-gray-900 dark:text-dark-800",children:r?"Edit Persona":"Create New Persona"}),e.jsxs("div",{className:"flex items-center gap-4 mt-1",children:[e.jsx("p",{className:"text-gray-600 dark:text-dark-600",children:r?"Customize your AI persona with advanced memory, adaptive learning, and intelligent parameters":"Create a new AI persona with custom personality, memory systems, and adaptive learning capabilities"}),o&&e.jsxs("div",{className:"flex items-center gap-2 text-sm text-green-600 dark:text-green-400",children:[e.jsx("div",{className:"w-2 h-2 bg-green-500 rounded-full"}),"Saved ",o.toLocaleTimeString()]})]})]}),e.jsxs("form",{onSubmit:a=>a.preventDefault(),className:"space-y-6",children:[e.jsxs("div",{className:"bg-white dark:bg-dark-100 rounded-lg shadow-sm border border-gray-200 dark:border-dark-300",children:[e.jsx("div",{className:"flex border-b border-gray-200 dark:border-dark-300",children:le.map(a=>e.jsxs("button",{type:"button",onClick:()=>w(a.id),className:`flex items-center gap-2 px-6 py-4 text-sm font-medium transition-colors ${n===a.id?"border-b-2 border-primary-500 text-primary-600 dark:text-primary-400 bg-primary-50 dark:bg-primary-900/20":"text-gray-500 dark:text-dark-600 hover:text-gray-700 dark:hover:text-dark-800"}`,children:[e.jsx(a.icon,{className:"h-4 w-4"}),a.label]},a.id))}),e.jsxs("div",{className:"p-6",children:[n==="basic"&&e.jsxs("div",{className:"space-y-6",children:[e.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4",children:[e.jsxs("div",{children:[e.jsx("label",{className:"block text-sm font-medium text-gray-700 dark:text-dark-600 mb-2",children:"Name *"}),e.jsx("input",{type:"text",value:t.name,onChange:a=>I("name",a.target.value),className:"w-full px-3 py-2 border border-gray-300 dark:border-dark-300 rounded-lg bg-white dark:bg-dark-50 text-gray-900 dark:text-dark-800 focus:ring-2 focus:ring-primary-500/20 focus:border-primary-500 transition-colors",placeholder:"Enter persona name",required:!0})]}),e.jsxs("div",{children:[e.jsx("label",{className:"block text-sm font-medium text-gray-700 dark:text-dark-600 mb-2",children:"Model *"}),e.jsxs("select",{value:t.model,onChange:a=>I("model",a.target.value),className:"w-full px-3 py-2 border border-gray-300 dark:border-dark-300 rounded-lg bg-white dark:bg-dark-50 text-gray-900 dark:text-dark-800 focus:ring-2 focus:ring-primary-500/20 focus:border-primary-500 transition-colors",required:!0,children:[e.jsx("option",{value:"",children:"Select a model"}),f.map(a=>e.jsx("option",{value:a.name,children:a.name},a.name))]})]})]}),e.jsxs("div",{children:[e.jsx("label",{className:"block text-sm font-medium text-gray-700 dark:text-dark-600 mb-2",children:"Description"}),e.jsx("textarea",{value:t.description,onChange:a=>I("description",a.target.value),className:"w-full px-3 py-2 border border-gray-300 dark:border-dark-300 rounded-lg bg-white dark:bg-dark-50 text-gray-900 dark:text-dark-800 focus:ring-2 focus:ring-primary-500/20 focus:border-primary-500 transition-colors resize-none",rows:3,placeholder:"Describe your persona..."})]}),e.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-6",children:[e.jsx(oe,{value:t.avatar||"",onChange:a=>I("avatar",a)}),e.jsx(Pe,{value:t.background||"",onChange:a=>I("background",a)})]}),e.jsxs("div",{children:[e.jsx("label",{className:"block text-sm font-medium text-gray-700 dark:text-dark-600 mb-2",children:"System Prompt"}),e.jsx("textarea",{value:t.parameters.system_prompt,onChange:a=>Q("system_prompt",a.target.value),className:"w-full px-3 py-2 border border-gray-300 dark:border-dark-300 rounded-lg bg-white dark:bg-dark-50 text-gray-900 dark:text-dark-800 focus:ring-2 focus:ring-primary-500/20 focus:border-primary-500 transition-colors resize-none font-mono text-sm",rows:6,placeholder:"Enter the system prompt that defines your persona behavior..."}),e.jsx("p",{className:"text-xs text-gray-500 dark:text-dark-600 mt-2",children:"The system prompt defines how your persona will behave and respond."})]})]}),n==="parameters"&&e.jsx("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-6",children:ie.map(({key:a,label:p,min:k,max:A,step:D,hint:g,format:P})=>e.jsx(J,{label:p,value:t.parameters[a]||0,min:k,max:A,step:D,hint:g,format:P,onChange:W=>Q(a,W)},a))}),n==="memory"&&e.jsxs("div",{className:"space-y-6",children:[e.jsxs("div",{className:"rounded-xl overflow-hidden border border-emerald-200/50 dark:border-emerald-700/30",children:[e.jsx("div",{className:"px-5 py-4 bg-gradient-to-r from-emerald-500 to-teal-500 dark:from-emerald-600 dark:to-teal-600",children:e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("div",{className:"w-10 h-10 rounded-lg bg-white/20 flex items-center justify-center",children:e.jsx(z,{className:"h-5 w-5 text-white"})}),e.jsxs("div",{children:[e.jsx("h3",{className:"font-semibold text-white",children:"Memory System"}),e.jsx("p",{className:"text-xs text-white/80",children:"Persona remembers conversations over time"})]})]}),e.jsx($,{label:"",checked:t.memory_settings?.enabled||!1,onChange:a=>U("memory_settings",{enabled:a})})]})}),t.memory_settings?.enabled&&r?.id&&e.jsx("div",{className:"px-5 py-4 bg-emerald-50 dark:bg-emerald-900/20 border-b border-emerald-100 dark:border-emerald-800/30",children:x?e.jsxs("div",{className:"flex items-center gap-2 text-sm text-emerald-600 dark:text-emerald-400",children:[e.jsx(ee,{className:"h-4 w-4 animate-spin"}),"Loading memory status..."]}):E?e.jsxs("div",{className:"grid grid-cols-3 gap-4",children:[e.jsxs("div",{className:"text-center",children:[e.jsxs("div",{className:"flex items-center justify-center gap-1 text-2xl font-bold text-emerald-700 dark:text-emerald-300",children:[e.jsx(z,{className:"h-5 w-5"}),E.memory_count.toLocaleString()]}),e.jsx("p",{className:"text-xs text-emerald-600 dark:text-emerald-400",children:"Memories"})]}),e.jsxs("div",{className:"text-center",children:[e.jsxs("div",{className:"flex items-center justify-center gap-1 text-2xl font-bold text-emerald-700 dark:text-emerald-300",children:[e.jsx(Ne,{className:"h-5 w-5"}),E.size_mb.toFixed(1)]}),e.jsx("p",{className:"text-xs text-emerald-600 dark:text-emerald-400",children:"MB Used"})]}),e.jsxs("div",{className:"text-center",children:[e.jsxs("div",{className:"flex items-center justify-center gap-1 text-2xl font-bold text-emerald-700 dark:text-emerald-300",children:[e.jsx(we,{className:"h-5 w-5"}),E.last_backup?new Date(E.last_backup).toLocaleDateString():"Never"]}),e.jsx("p",{className:"text-xs text-emerald-600 dark:text-emerald-400",children:"Last Backup"})]})]}):e.jsx("p",{className:"text-sm text-emerald-600 dark:text-emerald-400",children:"No memory data yet"})}),t.memory_settings?.enabled&&e.jsxs("div",{className:"p-5 bg-white dark:bg-dark-100 space-y-4",children:[e.jsx(J,{label:"Maximum Memories",value:t.memory_settings.max_memories,min:100,max:1e4,step:100,hint:"How many memories this persona can store",format:a=>a.toLocaleString(),colorClass:"text-emerald-700 dark:text-emerald-300",onChange:a=>U("memory_settings",{max_memories:a})}),e.jsx(J,{label:"Memory Retention",value:t.memory_settings.retention_days,min:7,max:365,step:7,hint:"Days to keep memories before cleanup",format:a=>`${Math.round(a)} days`,colorClass:"text-emerald-700 dark:text-emerald-300",onChange:a=>U("memory_settings",{retention_days:a})}),e.jsx($,{label:"Auto-cleanup old memories",checked:t.memory_settings.auto_cleanup,onChange:a=>U("memory_settings",{auto_cleanup:a}),colorClass:"text-emerald-700 dark:text-emerald-300"}),r?.id&&E&&E.memory_count>0&&e.jsx("div",{className:"pt-4 border-t border-gray-200 dark:border-dark-300",children:e.jsxs("div",{className:"flex items-center justify-between p-3 bg-red-50 dark:bg-red-900/20 rounded-lg border border-red-200 dark:border-red-800/30",children:[e.jsxs("div",{children:[e.jsx("p",{className:"text-sm font-medium text-red-700 dark:text-red-300",children:"Wipe All Memories"}),e.jsx("p",{className:"text-xs text-red-600 dark:text-red-400",children:"This cannot be undone"})]}),e.jsxs("button",{type:"button",onClick:de,disabled:S,className:"px-3 py-1.5 bg-red-500 hover:bg-red-600 text-white text-sm font-medium rounded-lg transition-colors disabled:opacity-50 flex items-center gap-1.5",children:[S?e.jsx(ee,{className:"h-3.5 w-3.5 animate-spin"}):e.jsx(se,{className:"h-3.5 w-3.5"}),S?"Wiping...":"Wipe"]})]})})]}),!t.memory_settings?.enabled&&e.jsx("div",{className:"p-5 bg-gray-50 dark:bg-dark-50",children:e.jsx("p",{className:"text-sm text-gray-500 dark:text-gray-400 text-center",children:"Enable the memory system to let your persona remember conversations and build context over time."})})]}),e.jsxs("div",{className:"rounded-xl overflow-hidden border border-violet-200/50 dark:border-violet-700/30",children:[e.jsx("div",{className:"px-5 py-4 bg-gradient-to-r from-violet-500 to-purple-500 dark:from-violet-600 dark:to-purple-600",children:e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("div",{className:"w-10 h-10 rounded-lg bg-white/20 flex items-center justify-center",children:e.jsx(ae,{className:"h-5 w-5 text-white"})}),e.jsxs("div",{children:[e.jsx("h3",{className:"font-semibold text-white",children:"Adaptive Learning"}),e.jsx("p",{className:"text-xs text-white/80",children:"Persona evolves based on interactions"})]})]}),e.jsx($,{label:"",checked:t.mutation_settings?.enabled||!1,onChange:a=>U("mutation_settings",{enabled:a})})]})}),t.mutation_settings?.enabled&&e.jsxs("div",{className:"p-5 bg-white dark:bg-dark-100 space-y-5",children:[e.jsxs("div",{children:[e.jsx("label",{className:"block text-sm font-medium text-violet-700 dark:text-violet-300 mb-3",children:"Learning Speed"}),e.jsx("div",{className:"grid grid-cols-3 gap-3",children:[{level:"low",icon:te,label:"Slow",desc:"Gradual changes"},{level:"medium",icon:ae,label:"Balanced",desc:"Moderate pace"},{level:"high",icon:O,label:"Fast",desc:"Quick adaptation"}].map(({level:a,icon:p,label:k,desc:A})=>e.jsxs("button",{type:"button",onClick:()=>U("mutation_settings",{sensitivity:a}),className:L("p-3 rounded-xl text-center transition-all border",t.mutation_settings?.sensitivity===a?"bg-violet-500 border-violet-500 text-white shadow-lg shadow-violet-500/25":"bg-violet-50 dark:bg-violet-900/20 border-violet-200 dark:border-violet-700/30 text-violet-700 dark:text-violet-300 hover:bg-violet-100 dark:hover:bg-violet-900/30"),children:[e.jsx(p,{className:"h-5 w-5 mx-auto mb-1"}),e.jsx("p",{className:"text-sm font-medium",children:k}),e.jsx("p",{className:"text-[10px] opacity-70",children:A})]},a))})]}),e.jsx($,{label:"Auto-adapt to user preferences",checked:t.mutation_settings.auto_adapt,onChange:a=>U("mutation_settings",{auto_adapt:a}),colorClass:"text-violet-700 dark:text-violet-300"}),e.jsxs("div",{className:"p-4 bg-violet-50 dark:bg-violet-900/20 rounded-xl",children:[e.jsxs("p",{className:"text-xs font-medium text-violet-700 dark:text-violet-300 mb-2 flex items-center gap-1.5",children:[e.jsx(G,{className:"h-3.5 w-3.5"}),"What the persona learns:"]}),e.jsxs("div",{className:"grid grid-cols-2 gap-2 text-xs text-violet-600 dark:text-violet-400",children:[e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx("div",{className:"w-1 h-1 rounded-full bg-violet-400"}),"Conversation tone"]}),e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx("div",{className:"w-1 h-1 rounded-full bg-violet-400"}),"Response style"]}),e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx("div",{className:"w-1 h-1 rounded-full bg-violet-400"}),"User preferences"]}),e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx("div",{className:"w-1 h-1 rounded-full bg-violet-400"}),"Topic interests"]})]})]})]}),!t.mutation_settings?.enabled&&e.jsx("div",{className:"p-5 bg-gray-50 dark:bg-dark-50",children:e.jsx("p",{className:"text-sm text-gray-500 dark:text-gray-400 text-center",children:"Enable adaptive learning to let your persona evolve and personalize responses based on your interactions."})})]})]}),n==="advanced"&&e.jsxs("div",{className:"space-y-6",children:[e.jsxs("div",{className:"rounded-xl p-5 bg-gradient-to-br from-primary-50 to-primary-100/50 dark:from-primary-900/30 dark:to-primary-800/20 border border-primary-200/50 dark:border-primary-700/30",children:[e.jsxs("div",{className:"flex items-center gap-2 mb-4",children:[e.jsx(z,{className:"h-5 w-5 text-primary-600 dark:text-primary-400"}),e.jsx("h3",{className:"font-semibold text-primary-900 dark:text-primary-100",children:"Embedding Model"})]}),e.jsx("p",{className:"text-xs text-primary-600 dark:text-primary-400 mb-3",children:"Select the model used for memory encoding and semantic search. Embedding models are shown first, followed by other available models."}),e.jsx("select",{value:t.embedding_model,onChange:a=>I("embedding_model",a.target.value),className:"w-full px-3 py-2.5 border border-primary-200 dark:border-primary-700 rounded-lg bg-white dark:bg-dark-50 text-gray-900 dark:text-dark-800 focus:ring-2 focus:ring-primary-500/20",children:h.length===0?e.jsx("option",{value:"",disabled:!0,children:"No models found"}):e.jsxs(e.Fragment,{children:[h.filter(a=>a.isDetectedEmbedding).length>0&&e.jsx("optgroup",{label:"Embedding Models",children:h.filter(a=>a.isDetectedEmbedding).map(a=>e.jsxs("option",{value:a.id,children:[a.name," - ",a.description]},a.id))}),h.filter(a=>!a.isDetectedEmbedding).length>0&&e.jsx("optgroup",{label:"Other Models",children:h.filter(a=>!a.isDetectedEmbedding).map(a=>e.jsxs("option",{value:a.id,children:[a.name," - ",a.description]},a.id))})]})}),h.length===0&&e.jsx("div",{className:"mt-3 p-3 bg-amber-50 dark:bg-amber-900/20 border border-amber-200 dark:border-amber-700/50 rounded-lg",children:e.jsxs("p",{className:"text-sm text-amber-800 dark:text-amber-200",children:["Install an embedding model:"," ",e.jsx("code",{className:"px-1.5 py-0.5 bg-amber-100 dark:bg-amber-900/40 rounded text-xs",children:"ollama pull nomic-embed-text"})]})}),e.jsx("p",{className:"text-[10px] text-primary-500 dark:text-primary-500 mt-2",children:"Recommended: nomic-embed-text, mxbai-embed-large, bge-m3, snowflake-arctic-embed"})]}),e.jsx("div",{className:"p-4 bg-gray-50 dark:bg-dark-50 rounded-xl border border-gray-200 dark:border-dark-300",children:e.jsxs("div",{className:"flex items-start gap-3",children:[e.jsx(Ce,{className:"h-5 w-5 text-gray-400 mt-0.5 flex-shrink-0"}),e.jsxs("div",{children:[e.jsx("p",{className:"text-sm font-medium text-gray-700 dark:text-gray-300",children:"About Advanced Settings"}),e.jsx("p",{className:"text-xs text-gray-500 dark:text-gray-400 mt-1",children:"The embedding model is used by the memory system to understand semantic meaning and find relevant memories during conversations. Choose a model that matches your use case and available resources."})]})]})})]})]})]}),e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx(F,{type:"button",variant:"ghost",onClick:_,disabled:s,className:"text-gray-600 dark:text-gray-400",children:"Cancel"}),e.jsxs("div",{className:"flex items-center gap-3",children:[o&&e.jsxs("div",{className:"flex items-center gap-1.5 text-sm text-emerald-600 dark:text-emerald-400",children:[e.jsx(_e,{className:"h-4 w-4"}),e.jsx("span",{children:"Saved"})]}),e.jsx(F,{type:"button",variant:"outline",onClick:()=>K(!1),disabled:s,children:s&&!m?"Saving...":"Save"}),e.jsx(F,{type:"button",onClick:()=>K(!0),disabled:s,children:s&&m?"Saving...":r?"Save & Close":"Create"})]})]})]})]})},Ee=({personas:r,onImport:y,onClose:_})=>{const[t,b]=d.useState(!1),[f,v]=d.useState(""),h=async s=>{try{const c=await C.exportPersona(s.id),m=new Blob([JSON.stringify(c,null,2)],{type:"application/json"}),l=URL.createObjectURL(m),o=document.createElement("a");o.href=l,o.download=`${s.name}.json`,document.body.appendChild(o),o.click(),document.body.removeChild(o),URL.revokeObjectURL(l),i.success(`Persona "${s.name}" exported successfully`)}catch(c){const m=c instanceof Error?c.message:String(c);i.error("Failed to export persona: "+m)}},u=async()=>{try{const s=r.map(n=>C.exportPersona(n.id)),c=await Promise.all(s),m={personas:c,exportedAt:Date.now(),version:"1.0.0",count:c.length},l=new Blob([JSON.stringify(m,null,2)],{type:"application/json"}),o=URL.createObjectURL(l),N=document.createElement("a");N.href=o,N.download=`personas-export-${new Date().toISOString().split("T")[0]}.json`,document.body.appendChild(N),N.click(),document.body.removeChild(N),URL.revokeObjectURL(o),i.success(`All ${r.length} personas exported successfully`)}catch(s){const c=s instanceof Error?s.message:String(s);i.error("Failed to export personas: "+c)}},M=async()=>{if(!f.trim()){i.error("Please paste the persona JSON data");return}b(!0);try{const s=JSON.parse(f);if(s.personas&&Array.isArray(s.personas)){let c=0,m=0;for(const l of s.personas)try{await C.importPersona(l),c++}catch(o){m++,console.error("Failed to import persona:",o)}c>0?(i.success(`Successfully imported ${c} personas`),m>0&&i.error(`Failed to import ${m} personas`)):i.error("Failed to import any personas")}else await C.importPersona(s),i.success("Persona imported successfully");v(""),y()}catch(s){const c=s instanceof Error?s.message:String(s);i.error("Failed to import persona: "+c)}finally{b(!1)}},j=s=>{const c=s.target.files?.[0];if(c){const m=new FileReader;m.onload=l=>{const o=l.target?.result;typeof o=="string"&&v(o)},m.readAsText(c)}};return e.jsxs("div",{className:"max-w-4xl mx-auto",children:[e.jsxs("div",{className:"mb-6",children:[e.jsx("h1",{className:"text-2xl font-bold text-gray-900 dark:text-dark-800",children:"Import & Export Personas"}),e.jsx("p",{className:"text-gray-600 dark:text-dark-600 mt-1",children:"Export your personas to share them or import personas from others"})]}),e.jsxs("div",{className:"grid grid-cols-1 lg:grid-cols-2 gap-6",children:[e.jsxs("div",{className:"bg-white dark:bg-dark-100 rounded-lg p-6 shadow-sm border border-gray-200 dark:border-dark-300",children:[e.jsx("h3",{className:"text-lg font-semibold text-gray-900 dark:text-dark-800 mb-4",children:"Export Personas"}),r.length===0?e.jsx("p",{className:"text-gray-600 dark:text-dark-600 text-center py-8",children:"No personas to export"}):e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"flex justify-between items-center",children:[e.jsxs("span",{className:"text-sm text-gray-600 dark:text-dark-600",children:[r.length," persona",r.length!==1?"s":""," ","available"]}),e.jsx(F,{onClick:u,variant:"outline",size:"sm",className:"px-3 py-1",children:"Export All"})]}),e.jsx("div",{className:"space-y-2 max-h-80 overflow-y-auto",children:r.map(s=>e.jsxs("div",{className:"flex items-center justify-between p-3 bg-gray-50 dark:bg-dark-200 rounded-md",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("img",{src:s.avatar||`https://ui-avatars.com/api/?name=${encodeURIComponent(s.name)}&background=6366f1&color=fff&size=32`,alt:s.name,className:"w-8 h-8 rounded-full"}),e.jsxs("div",{children:[e.jsx("div",{className:"font-medium text-gray-900 dark:text-dark-800",children:s.name}),e.jsx("div",{className:"text-sm text-gray-500 dark:text-dark-500",children:s.model})]})]}),e.jsx(F,{onClick:()=>h(s),variant:"outline",size:"sm",className:"px-3 py-1",children:"Export"})]},s.id))})]})]}),e.jsxs("div",{className:"bg-white dark:bg-dark-100 rounded-lg p-6 shadow-sm border border-gray-200 dark:border-dark-300",children:[e.jsx("h3",{className:"text-lg font-semibold text-gray-900 dark:text-dark-800 mb-4",children:"Import Personas"}),e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{children:[e.jsx("label",{className:"block text-sm font-medium text-gray-700 dark:text-dark-700 mb-2",children:"Upload JSON File"}),e.jsx("input",{type:"file",accept:".json",onChange:j,className:"w-full px-3 py-2 border border-gray-300 dark:border-dark-300 rounded-md bg-white dark:bg-dark-50 text-gray-900 dark:text-dark-700"})]}),e.jsx("div",{className:"text-center text-gray-500 dark:text-dark-500",children:"OR"}),e.jsxs("div",{children:[e.jsx("label",{className:"block text-sm font-medium text-gray-700 dark:text-dark-700 mb-2",children:"Paste JSON Data"}),e.jsx("textarea",{value:f,onChange:s=>v(s.target.value),className:"w-full px-3 py-2 border border-gray-300 dark:border-dark-300 rounded-md bg-white dark:bg-dark-50 text-gray-900 dark:text-dark-700",rows:8,placeholder:"Paste persona JSON data here..."})]}),e.jsx(F,{onClick:M,disabled:!f.trim()||t,className:"w-full",children:t?"Importing...":"Import Persona(s)"})]})]})]}),e.jsxs("div",{className:"mt-6 bg-gray-50 dark:bg-dark-200 rounded-lg p-4",children:[e.jsx("h4",{className:"text-sm font-medium text-gray-900 dark:text-dark-800 mb-2",children:"Expected JSON Format:"}),e.jsx("pre",{className:"text-xs text-gray-600 dark:text-dark-600 overflow-x-auto",children:`{
1
+ import{j as e}from"./markdown-vendor-YWiGftdn.js";import{r as d}from"./router-vendor-CnU0qKrY.js";import{e as C,c as L,B as F,A as oe,o as ne}from"../assets/index-BbJ5OmoO.js";import{n as O,ap as V,j as X,a3 as G,ab as ce,c as me,Z as te,D as z,aq as xe,f as ge,ar as pe,as as he,at as ue,Q as be,T as se,z as i,X as ye,I as ke,U as fe,o as ve,S as je,a1 as ee,ad as Ne,ak as we,au as ae,b as Ce,C as _e}from"./ui-vendor-CdKqcMKK.js";import"./react-vendor-N--QU9DW.js";import"./utils-vendor-DEeF42mN.js";const Se=({persona:r,onEdit:y,onDelete:_,onDownload:t,onSelect:b,onToggleFavorite:f,isSelected:v=!1,compact:h=!1})=>{const[u,M]=d.useState(null),[j,s]=d.useState(!1),[c,m]=d.useState(!1),l=!!(r.memory_settings?.enabled||r.mutation_settings?.enabled),o=d.useCallback(async()=>{if(l)try{const x=await C.getMemoryStatus(r.id);x.success&&x.data&&M(x.data)}catch(x){console.error("Failed to load memory status:",x)}},[r.id,l]);d.useEffect(()=>{o()},[o]);const N=async()=>{if(confirm("Are you sure you want to wipe all memories for this persona? This action cannot be undone.")){m(!0);try{const x=await C.wipeMemories(r.id);x.success?(i.success(`Wiped ${x.data?.deleted_count||0} memories`),await o()):i.error("Failed to wipe memories")}catch(x){i.error("Failed to wipe memories"),console.error(x)}finally{m(!1),s(!1)}}},n=async()=>{m(!0);try{const x=await C.backupPersona(r.id),R=window.URL.createObjectURL(x),S=document.createElement("a");S.href=R,S.download=`${r.name.toLowerCase().replace(/\s+/g,"-")}-backup.json`,document.body.appendChild(S),S.click(),window.URL.revokeObjectURL(R),document.body.removeChild(S),i.success("Persona backup downloaded successfully")}catch(x){i.error("Failed to backup persona"),console.error(x)}finally{m(!1),s(!1)}},w=async()=>{m(!0);try{const x=await C.exportPersonaDNA(r.id),R=window.URL.createObjectURL(x),S=document.createElement("a");S.href=R,S.download=`${r.name.toLowerCase().replace(/\s+/g,"-")}-dna.json`,document.body.appendChild(S),S.click(),window.URL.revokeObjectURL(R),document.body.removeChild(S),i.success("Persona DNA exported successfully")}catch(x){i.error("Failed to export persona DNA"),console.error(x)}finally{m(!1),s(!1)}},E=()=>r.avatar?r.avatar:`https://ui-avatars.com/api/?name=${encodeURIComponent(r.name)}&background=6366f1&color=fff&size=128`,T=x=>x<1?`${(x*1024).toFixed(0)} KB`:`${x.toFixed(1)} MB`;return h?e.jsxs("div",{className:L("group relative flex items-center gap-3 p-3 rounded-xl cursor-pointer transition-all duration-200","border border-transparent","hover:bg-gray-50 dark:hover:bg-dark-100 ophelia:hover:bg-[#1a1a1a]",v&&["bg-primary-50 dark:bg-primary-900/20 ophelia:bg-[#9333ea]/10","border-primary-200 dark:border-primary-700 ophelia:border-[#7c3aed]"]),onClick:()=>b?.(r),children:[e.jsxs("div",{className:"relative flex-shrink-0",children:[e.jsx("img",{src:E(),alt:r.name,className:"w-10 h-10 rounded-full object-cover ring-2 ring-white dark:ring-dark-100 ophelia:ring-[#0a0a0a]"}),l&&e.jsx("div",{className:"absolute -bottom-0.5 -right-0.5 w-4 h-4 bg-gradient-to-br from-purple-500 to-primary-500 rounded-full flex items-center justify-center",children:e.jsx(O,{className:"h-2.5 w-2.5 text-white"})})]}),e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx("h4",{className:"font-medium text-sm text-gray-900 dark:text-gray-100 ophelia:text-[#fafafa] truncate",children:r.name}),r.is_favorite&&e.jsx(V,{className:"h-3 w-3 text-amber-500 fill-amber-500 flex-shrink-0"})]}),e.jsx("p",{className:"text-xs text-gray-500 dark:text-gray-400 ophelia:text-[#a3a3a3] truncate",children:r.model})]}),v&&e.jsx("div",{className:"flex-shrink-0",children:e.jsx("div",{className:"w-6 h-6 rounded-full bg-primary-500 dark:bg-primary-600 ophelia:bg-[#9333ea] flex items-center justify-center",children:e.jsx(X,{className:"h-3 w-3 text-white ml-0.5"})})})]}):e.jsxs("div",{className:L("group relative rounded-2xl overflow-hidden transition-all duration-300","bg-white dark:bg-dark-100 ophelia:bg-[#0a0a0a]","border border-gray-200/60 dark:border-dark-300/60 ophelia:border-[#262626]","hover:border-gray-300 dark:hover:border-dark-400 ophelia:hover:border-[#3f3f46]","shadow-sm hover:shadow-lg dark:shadow-none",v&&["ring-2 ring-primary-500 dark:ring-primary-400 ophelia:ring-[#9333ea]","border-primary-300 dark:border-primary-600 ophelia:border-[#7c3aed]"]),children:[e.jsxs("div",{className:"relative h-20",children:[r.background?e.jsx("div",{className:"absolute inset-0 bg-cover bg-center",style:{backgroundImage:`url(${r.background})`}}):e.jsx("div",{className:"absolute inset-0 bg-gradient-to-br from-primary-400 via-primary-500 to-purple-600 dark:from-primary-600 dark:via-primary-700 dark:to-purple-800 ophelia:from-[#9333ea] ophelia:via-[#7c3aed] ophelia:to-[#6d28d9]"}),e.jsx("div",{className:"absolute inset-0 bg-black/10 dark:bg-black/20"}),e.jsxs("div",{className:"absolute top-3 left-3 right-3 flex items-start justify-between",children:[e.jsx("button",{onClick:x=>{x.stopPropagation(),f?.(r)},className:L("p-1.5 rounded-full transition-all duration-200","bg-white/20 hover:bg-white/30 backdrop-blur-sm",r.is_favorite&&"bg-amber-500/80 hover:bg-amber-500"),children:e.jsx(V,{className:L("h-4 w-4",r.is_favorite?"text-white fill-white":"text-white/80 hover:text-white")})}),l&&e.jsxs("div",{className:"flex items-center gap-1 px-2 py-1 rounded-full bg-white/20 backdrop-blur-sm text-white text-[10px] font-medium",children:[e.jsx(O,{className:"h-3 w-3"}),"Enhanced"]})]})]}),e.jsx("div",{className:"relative px-4 -mt-8",children:e.jsxs("div",{className:"relative inline-block",children:[e.jsx("img",{src:E(),alt:r.name,className:"w-16 h-16 rounded-xl object-cover ring-4 ring-white dark:ring-dark-100 ophelia:ring-[#0a0a0a] shadow-lg"}),l&&e.jsx("div",{className:"absolute -bottom-1 -right-1 w-6 h-6 bg-gradient-to-br from-purple-500 to-primary-500 rounded-lg flex items-center justify-center shadow-sm",children:e.jsx(G,{className:"h-3.5 w-3.5 text-white"})})]})}),e.jsxs("div",{className:"px-4 pt-3 pb-4",children:[e.jsxs("div",{className:"mb-3",children:[e.jsx("h3",{className:"text-lg font-semibold text-gray-900 dark:text-gray-100 ophelia:text-[#fafafa] leading-tight",children:r.name}),e.jsxs("p",{className:"text-sm text-gray-500 dark:text-gray-400 ophelia:text-[#a3a3a3] flex items-center gap-1.5 mt-0.5",children:[e.jsx(ce,{className:"h-3.5 w-3.5"}),r.model]})]}),r.description&&e.jsx("p",{className:"text-sm text-gray-600 dark:text-gray-400 ophelia:text-[#a3a3a3] line-clamp-2 mb-3",children:r.description}),r.parameters.system_prompt&&e.jsxs("div",{className:"mb-3 p-2.5 rounded-lg bg-gray-50 dark:bg-dark-50 ophelia:bg-[#121212] border border-gray-100 dark:border-dark-200 ophelia:border-[#1a1a1a]",children:[e.jsxs("div",{className:"flex items-center gap-1.5 mb-1",children:[e.jsx(me,{className:"h-3 w-3 text-gray-400 dark:text-gray-500 ophelia:text-[#737373]"}),e.jsx("span",{className:"text-[10px] uppercase tracking-wider font-medium text-gray-400 dark:text-gray-500 ophelia:text-[#737373]",children:"System Prompt"})]}),e.jsxs("p",{className:"text-xs text-gray-600 dark:text-gray-400 ophelia:text-[#a3a3a3] line-clamp-2 italic",children:["“",r.parameters.system_prompt,"”"]})]}),e.jsxs("div",{className:"flex flex-wrap gap-1.5 mb-3",children:[e.jsxs("span",{className:"inline-flex items-center gap-1 px-2 py-1 rounded-md text-[11px] font-medium bg-gray-100 dark:bg-dark-200 ophelia:bg-[#1a1a1a] text-gray-600 dark:text-gray-400 ophelia:text-[#a3a3a3]",children:[e.jsx(te,{className:"h-3 w-3"}),r.parameters.temperature?.toFixed(1)||"0.7"]}),e.jsxs("span",{className:"inline-flex items-center px-2 py-1 rounded-md text-[11px] font-medium bg-gray-100 dark:bg-dark-200 ophelia:bg-[#1a1a1a] text-gray-600 dark:text-gray-400 ophelia:text-[#a3a3a3]",children:["Top-P ",r.parameters.top_p?.toFixed(1)||"0.9"]}),e.jsxs("span",{className:"inline-flex items-center px-2 py-1 rounded-md text-[11px] font-medium bg-gray-100 dark:bg-dark-200 ophelia:bg-[#1a1a1a] text-gray-600 dark:text-gray-400 ophelia:text-[#a3a3a3]",children:[(r.parameters.context_window||4096).toLocaleString()," ctx"]})]}),l&&u&&e.jsx("div",{className:"mb-3 p-2.5 rounded-lg bg-gradient-to-r from-primary-50 to-purple-50 dark:from-primary-900/20 dark:to-purple-900/20 ophelia:from-[#9333ea]/10 ophelia:to-[#6d28d9]/10 border border-primary-100 dark:border-primary-800/30 ophelia:border-[#7c3aed]/20",children:e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(z,{className:"h-4 w-4 text-primary-600 dark:text-primary-400 ophelia:text-[#a855f7]"}),e.jsxs("div",{children:[e.jsxs("span",{className:"text-xs font-medium text-primary-700 dark:text-primary-300 ophelia:text-[#c084fc]",children:[u.memory_count," memories"]}),e.jsx("span",{className:"text-[10px] text-primary-600/70 dark:text-primary-400/70 ophelia:text-[#a855f7]/70 ml-2",children:T(u.size_mb)})]})]}),u.status&&e.jsx("span",{className:L("text-[10px] px-1.5 py-0.5 rounded-full font-medium",u.status==="active"?"bg-green-100 dark:bg-green-900/30 text-green-700 dark:text-green-400":"bg-gray-100 dark:bg-dark-200 text-gray-600 dark:text-gray-400"),children:u.status})]})}),e.jsxs("div",{className:"flex items-center justify-between pt-3 border-t border-gray-100 dark:border-dark-200 ophelia:border-[#1a1a1a]",children:[b&&e.jsxs(F,{onClick:()=>b(r),size:"sm",className:"bg-primary-500 hover:bg-primary-600 dark:bg-primary-600 dark:hover:bg-primary-500 ophelia:bg-[#9333ea] ophelia:hover:bg-[#a855f7] text-white px-4",children:[e.jsx(X,{className:"h-3.5 w-3.5 mr-1.5"}),"Use"]}),e.jsxs("div",{className:"flex items-center gap-1 ml-auto",children:[e.jsx("button",{onClick:()=>y(r),className:"p-2 rounded-lg text-gray-500 hover:text-gray-700 dark:text-gray-400 dark:hover:text-gray-200 ophelia:text-[#737373] ophelia:hover:text-[#e5e5e5] hover:bg-gray-100 dark:hover:bg-dark-200 ophelia:hover:bg-[#1a1a1a] transition-colors",title:"Edit persona",children:e.jsx(xe,{className:"h-4 w-4"})}),e.jsx("button",{onClick:()=>t(r),className:"p-2 rounded-lg text-gray-500 hover:text-gray-700 dark:text-gray-400 dark:hover:text-gray-200 ophelia:text-[#737373] ophelia:hover:text-[#e5e5e5] hover:bg-gray-100 dark:hover:bg-dark-200 ophelia:hover:bg-[#1a1a1a] transition-colors",title:"Download persona",children:e.jsx(ge,{className:"h-4 w-4"})}),e.jsxs("div",{className:"relative",children:[e.jsx("button",{onClick:()=>s(!j),className:"p-2 rounded-lg text-gray-500 hover:text-gray-700 dark:text-gray-400 dark:hover:text-gray-200 ophelia:text-[#737373] ophelia:hover:text-[#e5e5e5] hover:bg-gray-100 dark:hover:bg-dark-200 ophelia:hover:bg-[#1a1a1a] transition-colors",children:e.jsx(pe,{className:"h-4 w-4"})}),j&&e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"fixed inset-0 z-10",onClick:()=>s(!1)}),e.jsxs("div",{className:"absolute right-0 bottom-full mb-1 w-44 py-1 bg-white dark:bg-dark-100 ophelia:bg-[#0a0a0a] rounded-xl shadow-lg border border-gray-200 dark:border-dark-300 ophelia:border-[#262626] z-20",children:[l&&e.jsxs(e.Fragment,{children:[e.jsxs("button",{onClick:n,disabled:c,className:"w-full flex items-center gap-2 px-3 py-2 text-sm text-gray-700 dark:text-gray-300 ophelia:text-[#e5e5e5] hover:bg-gray-50 dark:hover:bg-dark-50 ophelia:hover:bg-[#1a1a1a] disabled:opacity-50",children:[e.jsx(he,{className:"h-4 w-4"}),"Backup"]}),e.jsxs("button",{onClick:w,disabled:c,className:"w-full flex items-center gap-2 px-3 py-2 text-sm text-gray-700 dark:text-gray-300 ophelia:text-[#e5e5e5] hover:bg-gray-50 dark:hover:bg-dark-50 ophelia:hover:bg-[#1a1a1a] disabled:opacity-50",children:[e.jsx(ue,{className:"h-4 w-4"}),"Export DNA"]}),u&&u.memory_count>0&&e.jsxs("button",{onClick:N,disabled:c,className:"w-full flex items-center gap-2 px-3 py-2 text-sm text-red-600 dark:text-red-400 hover:bg-red-50 dark:hover:bg-red-900/20 disabled:opacity-50",children:[e.jsx(be,{className:"h-4 w-4"}),"Wipe Memories"]}),e.jsx("div",{className:"my-1 border-t border-gray-100 dark:border-dark-200 ophelia:border-[#1a1a1a]"})]}),e.jsxs("button",{onClick:()=>{_(r),s(!1)},className:"w-full flex items-center gap-2 px-3 py-2 text-sm text-red-600 dark:text-red-400 hover:bg-red-50 dark:hover:bg-red-900/20",children:[e.jsx(se,{className:"h-4 w-4"}),"Delete"]})]})]})]})]})]})]})]})},Pe=({value:r,onChange:y,className:_=""})=>{const t=d.useRef(null),[b,f]=d.useState(!1),[v,h]=d.useState(!1),u=async l=>{if(!l.type.startsWith("image/")){i.error("Please select a valid image file");return}if(l.size>5*1024*1024){i.error("Background image size must be less than 5MB");return}f(!0);try{const o=new FileReader;o.onload=N=>{const n=N.target?.result;y(n),i.success("Background uploaded successfully")},o.onerror=()=>{i.error("Failed to read image file")},o.readAsDataURL(l)}catch(o){console.error("Failed to upload background:",o),i.error("Failed to upload background image")}finally{f(!1)}},M=l=>{const o=l.target.files?.[0];o&&u(o)},j=l=>{l.preventDefault(),h(!0)},s=l=>{l.preventDefault(),h(!1)},c=l=>{l.preventDefault(),h(!1);const o=l.dataTransfer.files?.[0];o&&u(o)},m=()=>{y(""),i.success("Background removed")};return e.jsx("div",{className:`space-y-4 ${_}`,children:e.jsxs("div",{children:[e.jsx("label",{className:"block text-sm font-medium text-gray-700 dark:text-dark-600 mb-2",children:"Background Image"}),e.jsxs("div",{className:"space-y-3",children:[r?e.jsxs("div",{className:"space-y-3",children:[e.jsx("div",{className:"w-full h-32 rounded-lg bg-cover bg-center border-2 border-gray-300 dark:border-dark-300",style:{backgroundImage:`url(${r})`}}),e.jsxs("div",{className:"flex items-center gap-3 p-3 bg-gray-50 dark:bg-dark-200 rounded-lg",children:[e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsx("p",{className:"text-sm font-medium text-gray-900 dark:text-gray-100 truncate",children:"Custom background image"}),e.jsx("p",{className:"text-xs text-gray-500 dark:text-gray-400",children:"Click to change or remove"})]}),e.jsx(F,{variant:"ghost",size:"sm",onClick:m,className:"text-red-600 hover:text-red-700 hover:bg-red-50 dark:text-red-400 dark:hover:text-red-300 dark:hover:bg-red-900/20",children:e.jsx(ye,{className:"h-4 w-4"})})]})]}):e.jsxs("div",{className:`border-2 border-dashed rounded-lg p-6 text-center cursor-pointer transition-colors ${v?"border-primary-500 bg-primary-50 dark:bg-primary-900/20":"border-gray-300 dark:border-gray-600 hover:border-gray-400 dark:hover:border-gray-500"}`,onDragOver:j,onDragLeave:s,onDrop:c,onClick:()=>t.current?.click(),children:[e.jsx(ke,{className:"h-12 w-12 mx-auto text-gray-400 dark:text-gray-500 mb-4"}),e.jsx("p",{className:"text-sm font-medium text-gray-900 dark:text-gray-100 mb-2",children:"Upload background image"}),e.jsx("p",{className:"text-xs text-gray-500 dark:text-gray-400 mb-4",children:"Drag and drop an image or click to browse"}),e.jsxs(F,{variant:"outline",size:"sm",disabled:b,className:"mx-auto",children:[e.jsx(fe,{className:"h-4 w-4 mr-2"}),b?"Uploading...":"Choose Image"]})]}),e.jsxs("div",{children:[e.jsx("label",{className:"block text-xs font-medium text-gray-600 dark:text-gray-400 mb-1",children:"Or enter image URL"}),e.jsx("input",{type:"url",value:r,onChange:l=>y(l.target.value),className:"w-full px-3 py-2 text-sm border border-gray-300 dark:border-dark-300 rounded-md bg-white dark:bg-dark-50 text-gray-900 dark:text-dark-800",placeholder:"https://example.com/background.jpg"})]})]}),e.jsx("input",{ref:t,type:"file",accept:"image/*",onChange:M,className:"hidden"}),e.jsx("p",{className:"text-xs text-gray-500 dark:text-gray-400 mt-2",children:"Supports: JPG, PNG, GIF, WebP (max 5MB). Wide landscape images work best."})]})})},J=({label:r,value:y,min:_,max:t,step:b,onChange:f,hint:v,format:h=M=>String(M),colorClass:u="text-gray-700 dark:text-dark-600"})=>{const M=(y-_)/(t-_)*100;return e.jsxs("div",{children:[e.jsxs("label",{className:L("block text-sm font-medium mb-2",u),children:[r,": ",h(y)]}),e.jsx("input",{type:"range",min:_,max:t,step:b,value:y,onChange:j=>f(parseFloat(j.target.value)),className:"w-full h-2 bg-gray-200 dark:bg-dark-200 rounded-lg appearance-none cursor-pointer slider",style:{"--progress":`${M}%`}}),v&&e.jsx("p",{className:L("text-xs mt-1",u.replace("700","500").replace("600","400")),children:v})]})},$=({label:r,checked:y,onChange:_,colorClass:t="text-gray-700 dark:text-dark-600"})=>e.jsxs("label",{className:"flex items-center gap-3 cursor-pointer",children:[e.jsx("div",{className:L("relative w-10 h-5 rounded-full transition-colors",y?"bg-primary-500 dark:bg-primary-600":"bg-gray-300 dark:bg-dark-300"),onClick:()=>_(!y),children:e.jsx("div",{className:L("absolute top-0.5 left-0.5 w-4 h-4 rounded-full bg-white shadow transition-transform",y&&"translate-x-5")})}),e.jsx("span",{className:L("text-sm font-medium",t),children:r})]}),q={name:"",description:"",model:"",parameters:{temperature:.7,top_p:.9,top_k:40,context_window:4096,max_tokens:1024,system_prompt:"",repeat_penalty:1.1,presence_penalty:0,frequency_penalty:0},avatar:"",background:"",embedding_model:"",memory_settings:{enabled:!1,max_memories:1e3,auto_cleanup:!0,retention_days:90},mutation_settings:{enabled:!1,sensitivity:"medium",auto_adapt:!0}},re=["embed","e5","bge","gte","minilm","multilingual","sentence","universal","instructor","jina","paraphrase","mpnet","contriever"],Me=({persona:r,onSubmit:y,onCancel:_})=>{const[t,b]=d.useState(q),[f,v]=d.useState([]),[h,u]=d.useState([]),[M,j]=d.useState(!1),[s,c]=d.useState(!1),[m,l]=d.useState(!1),[o,N]=d.useState(null),[n,w]=d.useState("basic"),[E,T]=d.useState(null),[x,R]=d.useState(!1),[S,Y]=d.useState(!1),H=d.useRef(!1),I=d.useCallback((a,p)=>{b(k=>({...k,[a]:p})),N(null)},[]),Q=d.useCallback((a,p)=>{b(k=>({...k,parameters:{...k.parameters,[a]:p}})),N(null)},[]),U=d.useCallback((a,p)=>{b(k=>({...k,[a]:{...k[a],...p}})),N(null)},[]),Z=d.useCallback(a=>{const p=a.filter(g=>re.some(P=>g.name.toLowerCase().includes(P.toLowerCase()))).map(g=>({id:g.name,name:g.name,description:`${g.details?.parameter_size||"Unknown size"} - ${g.details?.family||"Ollama model"}`,provider:"ollama",dimensions:768,isDetectedEmbedding:!0})),k=a.filter(g=>!re.some(P=>g.name.toLowerCase().includes(P.toLowerCase()))).map(g=>({id:g.name,name:g.name,description:`${g.details?.parameter_size||"Unknown size"} - ${g.details?.family||"Other model"}`,provider:"ollama",dimensions:768,isDetectedEmbedding:!1})),D=[...p,...k].reduce((g,P)=>(g.find(W=>W.id===P.id)||g.push(P),g),[]);return D.length>0?D:[{id:"nomic-embed-text",name:"nomic-embed-text",description:"Default embedding model (install if needed)",provider:"ollama",dimensions:768}]},[]),B=d.useCallback(async()=>{if(r?.id){R(!0);try{const a=await C.getMemoryStatus(r.id);a.success&&a.data&&T(a.data)}catch(a){console.error("Failed to load memory status:",a)}finally{R(!1)}}},[r?.id]),de=async()=>{if(r?.id&&confirm("Are you sure you want to wipe all memories? This cannot be undone.")){Y(!0);try{const a=await C.wipeMemories(r.id);a.success?(i.success(`Wiped ${a.data?.deleted_count||0} memories`),await B()):i.error("Failed to wipe memories")}catch{i.error("Failed to wipe memories")}finally{Y(!1)}}};d.useEffect(()=>{if(H.current)return;H.current=!0,(async()=>{j(!0);try{const[p,k]=await Promise.all([ne.getModels(),r?Promise.resolve(null):C.getDefaultParameters()]);if(p.success&&p.data){v(p.data);const A=Z(p.data);if(u(A),r){if(b({name:r.name,description:r.description||"",model:r.model,parameters:r.parameters,avatar:r.avatar||"",background:r.background||"",embedding_model:r.embedding_model||A[0]?.id||"",memory_settings:r.memory_settings||q.memory_settings,mutation_settings:r.mutation_settings||q.mutation_settings}),r.embedding_model&&!A.find(D=>D.id===r.embedding_model)){const D=r.embedding_model.split(":")[0],g=A.find(P=>P.id.startsWith(D+":")||P.id===D);g?b(P=>({...P,embedding_model:g.id})):u(P=>[...P,{id:r.embedding_model,name:r.embedding_model,description:"Previously selected model (not currently installed)",provider:"ollama",dimensions:768}])}}else{const D=k?.success?k.data:{};b(g=>({...g,parameters:{...g.parameters,...D},embedding_model:A[0]?.id||""}))}}}catch(p){console.error("Error loading data:",p)}finally{j(!1)}})()},[r,Z]),d.useEffect(()=>{r?.id&&t.memory_settings?.enabled&&B()},[r?.id,t.memory_settings?.enabled,B]);const K=async a=>{c(!0),l(a);try{const p={name:t.name,description:t.description,model:t.model,parameters:t.parameters,avatar:t.avatar,background:t.background,embedding_model:t.embedding_model,memory_settings:t.memory_settings,mutation_settings:t.mutation_settings},k=r?await C.updatePersona(r.id,p):await C.createPersona(t);k.success?(i.success(r?"Persona updated":"Persona created"),N(new Date),a&&y()):i.error(`Failed to save: ${k.error}`)}catch(p){i.error(`Failed to save: ${p instanceof Error?p.message:String(p)}`)}finally{c(!1),l(!1)}},le=d.useMemo(()=>[{id:"basic",label:"Basic",icon:ve},{id:"parameters",label:"Parameters",icon:je},{id:"memory",label:"Memory & Learning",icon:O},{id:"advanced",label:"Advanced",icon:G}],[]),ie=d.useMemo(()=>[{key:"temperature",label:"Temperature",min:0,max:2,step:.1,hint:"Controls creativity vs consistency",format:a=>a.toFixed(1)},{key:"top_p",label:"Top-P",min:0,max:1,step:.1,hint:"Controls response diversity",format:a=>a.toFixed(1)},{key:"top_k",label:"Top-K",min:1,max:100,step:1,hint:"Limits vocabulary to top-k tokens",format:a=>String(Math.round(a))},{key:"context_window",label:"Context Window",min:128,max:131072,step:128,hint:"Maximum conversation history length",format:a=>String(Math.round(a))},{key:"max_tokens",label:"Max Tokens",min:1,max:8192,step:1,hint:"Maximum response length",format:a=>String(Math.round(a))},{key:"repeat_penalty",label:"Repeat Penalty",min:.5,max:2,step:.1,hint:"Reduces repetitive responses",format:a=>a.toFixed(1)}],[]);return M?e.jsx("div",{className:"flex items-center justify-center p-8",children:e.jsxs("div",{className:"animate-pulse flex items-center gap-3",children:[e.jsx("div",{className:"w-5 h-5 border-2 border-primary-500 border-t-transparent rounded-full animate-spin"}),e.jsx("span",{className:"text-gray-600 dark:text-gray-400",children:"Loading form..."})]})}):e.jsxs("div",{className:"max-w-4xl mx-auto",children:[e.jsxs("div",{className:"mb-6",children:[e.jsx("h1",{className:"text-2xl font-bold text-gray-900 dark:text-dark-800",children:r?"Edit Persona":"Create New Persona"}),e.jsxs("div",{className:"flex items-center gap-4 mt-1",children:[e.jsx("p",{className:"text-gray-600 dark:text-dark-600",children:r?"Customize your AI persona with advanced memory, adaptive learning, and intelligent parameters":"Create a new AI persona with custom personality, memory systems, and adaptive learning capabilities"}),o&&e.jsxs("div",{className:"flex items-center gap-2 text-sm text-green-600 dark:text-green-400",children:[e.jsx("div",{className:"w-2 h-2 bg-green-500 rounded-full"}),"Saved ",o.toLocaleTimeString()]})]})]}),e.jsxs("form",{onSubmit:a=>a.preventDefault(),className:"space-y-6",children:[e.jsxs("div",{className:"bg-white dark:bg-dark-100 rounded-lg shadow-sm border border-gray-200 dark:border-dark-300",children:[e.jsx("div",{className:"flex border-b border-gray-200 dark:border-dark-300",children:le.map(a=>e.jsxs("button",{type:"button",onClick:()=>w(a.id),className:`flex items-center gap-2 px-6 py-4 text-sm font-medium transition-colors ${n===a.id?"border-b-2 border-primary-500 text-primary-600 dark:text-primary-400 bg-primary-50 dark:bg-primary-900/20":"text-gray-500 dark:text-dark-600 hover:text-gray-700 dark:hover:text-dark-800"}`,children:[e.jsx(a.icon,{className:"h-4 w-4"}),a.label]},a.id))}),e.jsxs("div",{className:"p-6",children:[n==="basic"&&e.jsxs("div",{className:"space-y-6",children:[e.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4",children:[e.jsxs("div",{children:[e.jsx("label",{className:"block text-sm font-medium text-gray-700 dark:text-dark-600 mb-2",children:"Name *"}),e.jsx("input",{type:"text",value:t.name,onChange:a=>I("name",a.target.value),className:"w-full px-3 py-2 border border-gray-300 dark:border-dark-300 rounded-lg bg-white dark:bg-dark-50 text-gray-900 dark:text-dark-800 focus:ring-2 focus:ring-primary-500/20 focus:border-primary-500 transition-colors",placeholder:"Enter persona name",required:!0})]}),e.jsxs("div",{children:[e.jsx("label",{className:"block text-sm font-medium text-gray-700 dark:text-dark-600 mb-2",children:"Model *"}),e.jsxs("select",{value:t.model,onChange:a=>I("model",a.target.value),className:"w-full px-3 py-2 border border-gray-300 dark:border-dark-300 rounded-lg bg-white dark:bg-dark-50 text-gray-900 dark:text-dark-800 focus:ring-2 focus:ring-primary-500/20 focus:border-primary-500 transition-colors",required:!0,children:[e.jsx("option",{value:"",children:"Select a model"}),f.map(a=>e.jsx("option",{value:a.name,children:a.name},a.name))]})]})]}),e.jsxs("div",{children:[e.jsx("label",{className:"block text-sm font-medium text-gray-700 dark:text-dark-600 mb-2",children:"Description"}),e.jsx("textarea",{value:t.description,onChange:a=>I("description",a.target.value),className:"w-full px-3 py-2 border border-gray-300 dark:border-dark-300 rounded-lg bg-white dark:bg-dark-50 text-gray-900 dark:text-dark-800 focus:ring-2 focus:ring-primary-500/20 focus:border-primary-500 transition-colors resize-none",rows:3,placeholder:"Describe your persona..."})]}),e.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-6",children:[e.jsx(oe,{value:t.avatar||"",onChange:a=>I("avatar",a)}),e.jsx(Pe,{value:t.background||"",onChange:a=>I("background",a)})]}),e.jsxs("div",{children:[e.jsx("label",{className:"block text-sm font-medium text-gray-700 dark:text-dark-600 mb-2",children:"System Prompt"}),e.jsx("textarea",{value:t.parameters.system_prompt,onChange:a=>Q("system_prompt",a.target.value),className:"w-full px-3 py-2 border border-gray-300 dark:border-dark-300 rounded-lg bg-white dark:bg-dark-50 text-gray-900 dark:text-dark-800 focus:ring-2 focus:ring-primary-500/20 focus:border-primary-500 transition-colors resize-none font-mono text-sm",rows:6,placeholder:"Enter the system prompt that defines your persona behavior..."}),e.jsx("p",{className:"text-xs text-gray-500 dark:text-dark-600 mt-2",children:"The system prompt defines how your persona will behave and respond."})]})]}),n==="parameters"&&e.jsx("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-6",children:ie.map(({key:a,label:p,min:k,max:A,step:D,hint:g,format:P})=>e.jsx(J,{label:p,value:t.parameters[a]||0,min:k,max:A,step:D,hint:g,format:P,onChange:W=>Q(a,W)},a))}),n==="memory"&&e.jsxs("div",{className:"space-y-6",children:[e.jsxs("div",{className:"rounded-xl overflow-hidden border border-emerald-200/50 dark:border-emerald-700/30",children:[e.jsx("div",{className:"px-5 py-4 bg-gradient-to-r from-emerald-500 to-teal-500 dark:from-emerald-600 dark:to-teal-600",children:e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("div",{className:"w-10 h-10 rounded-lg bg-white/20 flex items-center justify-center",children:e.jsx(z,{className:"h-5 w-5 text-white"})}),e.jsxs("div",{children:[e.jsx("h3",{className:"font-semibold text-white",children:"Memory System"}),e.jsx("p",{className:"text-xs text-white/80",children:"Persona remembers conversations over time"})]})]}),e.jsx($,{label:"",checked:t.memory_settings?.enabled||!1,onChange:a=>U("memory_settings",{enabled:a})})]})}),t.memory_settings?.enabled&&r?.id&&e.jsx("div",{className:"px-5 py-4 bg-emerald-50 dark:bg-emerald-900/20 border-b border-emerald-100 dark:border-emerald-800/30",children:x?e.jsxs("div",{className:"flex items-center gap-2 text-sm text-emerald-600 dark:text-emerald-400",children:[e.jsx(ee,{className:"h-4 w-4 animate-spin"}),"Loading memory status..."]}):E?e.jsxs("div",{className:"grid grid-cols-3 gap-4",children:[e.jsxs("div",{className:"text-center",children:[e.jsxs("div",{className:"flex items-center justify-center gap-1 text-2xl font-bold text-emerald-700 dark:text-emerald-300",children:[e.jsx(z,{className:"h-5 w-5"}),E.memory_count.toLocaleString()]}),e.jsx("p",{className:"text-xs text-emerald-600 dark:text-emerald-400",children:"Memories"})]}),e.jsxs("div",{className:"text-center",children:[e.jsxs("div",{className:"flex items-center justify-center gap-1 text-2xl font-bold text-emerald-700 dark:text-emerald-300",children:[e.jsx(Ne,{className:"h-5 w-5"}),E.size_mb.toFixed(1)]}),e.jsx("p",{className:"text-xs text-emerald-600 dark:text-emerald-400",children:"MB Used"})]}),e.jsxs("div",{className:"text-center",children:[e.jsxs("div",{className:"flex items-center justify-center gap-1 text-2xl font-bold text-emerald-700 dark:text-emerald-300",children:[e.jsx(we,{className:"h-5 w-5"}),E.last_backup?new Date(E.last_backup).toLocaleDateString():"Never"]}),e.jsx("p",{className:"text-xs text-emerald-600 dark:text-emerald-400",children:"Last Backup"})]})]}):e.jsx("p",{className:"text-sm text-emerald-600 dark:text-emerald-400",children:"No memory data yet"})}),t.memory_settings?.enabled&&e.jsxs("div",{className:"p-5 bg-white dark:bg-dark-100 space-y-4",children:[e.jsx(J,{label:"Maximum Memories",value:t.memory_settings.max_memories,min:100,max:1e4,step:100,hint:"How many memories this persona can store",format:a=>a.toLocaleString(),colorClass:"text-emerald-700 dark:text-emerald-300",onChange:a=>U("memory_settings",{max_memories:a})}),e.jsx(J,{label:"Memory Retention",value:t.memory_settings.retention_days,min:7,max:365,step:7,hint:"Days to keep memories before cleanup",format:a=>`${Math.round(a)} days`,colorClass:"text-emerald-700 dark:text-emerald-300",onChange:a=>U("memory_settings",{retention_days:a})}),e.jsx($,{label:"Auto-cleanup old memories",checked:t.memory_settings.auto_cleanup,onChange:a=>U("memory_settings",{auto_cleanup:a}),colorClass:"text-emerald-700 dark:text-emerald-300"}),r?.id&&E&&E.memory_count>0&&e.jsx("div",{className:"pt-4 border-t border-gray-200 dark:border-dark-300",children:e.jsxs("div",{className:"flex items-center justify-between p-3 bg-red-50 dark:bg-red-900/20 rounded-lg border border-red-200 dark:border-red-800/30",children:[e.jsxs("div",{children:[e.jsx("p",{className:"text-sm font-medium text-red-700 dark:text-red-300",children:"Wipe All Memories"}),e.jsx("p",{className:"text-xs text-red-600 dark:text-red-400",children:"This cannot be undone"})]}),e.jsxs("button",{type:"button",onClick:de,disabled:S,className:"px-3 py-1.5 bg-red-500 hover:bg-red-600 text-white text-sm font-medium rounded-lg transition-colors disabled:opacity-50 flex items-center gap-1.5",children:[S?e.jsx(ee,{className:"h-3.5 w-3.5 animate-spin"}):e.jsx(se,{className:"h-3.5 w-3.5"}),S?"Wiping...":"Wipe"]})]})})]}),!t.memory_settings?.enabled&&e.jsx("div",{className:"p-5 bg-gray-50 dark:bg-dark-50",children:e.jsx("p",{className:"text-sm text-gray-500 dark:text-gray-400 text-center",children:"Enable the memory system to let your persona remember conversations and build context over time."})})]}),e.jsxs("div",{className:"rounded-xl overflow-hidden border border-violet-200/50 dark:border-violet-700/30",children:[e.jsx("div",{className:"px-5 py-4 bg-gradient-to-r from-violet-500 to-purple-500 dark:from-violet-600 dark:to-purple-600",children:e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("div",{className:"w-10 h-10 rounded-lg bg-white/20 flex items-center justify-center",children:e.jsx(ae,{className:"h-5 w-5 text-white"})}),e.jsxs("div",{children:[e.jsx("h3",{className:"font-semibold text-white",children:"Adaptive Learning"}),e.jsx("p",{className:"text-xs text-white/80",children:"Persona evolves based on interactions"})]})]}),e.jsx($,{label:"",checked:t.mutation_settings?.enabled||!1,onChange:a=>U("mutation_settings",{enabled:a})})]})}),t.mutation_settings?.enabled&&e.jsxs("div",{className:"p-5 bg-white dark:bg-dark-100 space-y-5",children:[e.jsxs("div",{children:[e.jsx("label",{className:"block text-sm font-medium text-violet-700 dark:text-violet-300 mb-3",children:"Learning Speed"}),e.jsx("div",{className:"grid grid-cols-3 gap-3",children:[{level:"low",icon:te,label:"Slow",desc:"Gradual changes"},{level:"medium",icon:ae,label:"Balanced",desc:"Moderate pace"},{level:"high",icon:O,label:"Fast",desc:"Quick adaptation"}].map(({level:a,icon:p,label:k,desc:A})=>e.jsxs("button",{type:"button",onClick:()=>U("mutation_settings",{sensitivity:a}),className:L("p-3 rounded-xl text-center transition-all border",t.mutation_settings?.sensitivity===a?"bg-violet-500 border-violet-500 text-white shadow-lg shadow-violet-500/25":"bg-violet-50 dark:bg-violet-900/20 border-violet-200 dark:border-violet-700/30 text-violet-700 dark:text-violet-300 hover:bg-violet-100 dark:hover:bg-violet-900/30"),children:[e.jsx(p,{className:"h-5 w-5 mx-auto mb-1"}),e.jsx("p",{className:"text-sm font-medium",children:k}),e.jsx("p",{className:"text-[10px] opacity-70",children:A})]},a))})]}),e.jsx($,{label:"Auto-adapt to user preferences",checked:t.mutation_settings.auto_adapt,onChange:a=>U("mutation_settings",{auto_adapt:a}),colorClass:"text-violet-700 dark:text-violet-300"}),e.jsxs("div",{className:"p-4 bg-violet-50 dark:bg-violet-900/20 rounded-xl",children:[e.jsxs("p",{className:"text-xs font-medium text-violet-700 dark:text-violet-300 mb-2 flex items-center gap-1.5",children:[e.jsx(G,{className:"h-3.5 w-3.5"}),"What the persona learns:"]}),e.jsxs("div",{className:"grid grid-cols-2 gap-2 text-xs text-violet-600 dark:text-violet-400",children:[e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx("div",{className:"w-1 h-1 rounded-full bg-violet-400"}),"Conversation tone"]}),e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx("div",{className:"w-1 h-1 rounded-full bg-violet-400"}),"Response style"]}),e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx("div",{className:"w-1 h-1 rounded-full bg-violet-400"}),"User preferences"]}),e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx("div",{className:"w-1 h-1 rounded-full bg-violet-400"}),"Topic interests"]})]})]})]}),!t.mutation_settings?.enabled&&e.jsx("div",{className:"p-5 bg-gray-50 dark:bg-dark-50",children:e.jsx("p",{className:"text-sm text-gray-500 dark:text-gray-400 text-center",children:"Enable adaptive learning to let your persona evolve and personalize responses based on your interactions."})})]})]}),n==="advanced"&&e.jsxs("div",{className:"space-y-6",children:[e.jsxs("div",{className:"rounded-xl p-5 bg-gradient-to-br from-primary-50 to-primary-100/50 dark:from-primary-900/30 dark:to-primary-800/20 border border-primary-200/50 dark:border-primary-700/30",children:[e.jsxs("div",{className:"flex items-center gap-2 mb-4",children:[e.jsx(z,{className:"h-5 w-5 text-primary-600 dark:text-primary-400"}),e.jsx("h3",{className:"font-semibold text-primary-900 dark:text-primary-100",children:"Embedding Model"})]}),e.jsx("p",{className:"text-xs text-primary-600 dark:text-primary-400 mb-3",children:"Select the model used for memory encoding and semantic search. Embedding models are shown first, followed by other available models."}),e.jsx("select",{value:t.embedding_model,onChange:a=>I("embedding_model",a.target.value),className:"w-full px-3 py-2.5 border border-primary-200 dark:border-primary-700 rounded-lg bg-white dark:bg-dark-50 text-gray-900 dark:text-dark-800 focus:ring-2 focus:ring-primary-500/20",children:h.length===0?e.jsx("option",{value:"",disabled:!0,children:"No models found"}):e.jsxs(e.Fragment,{children:[h.filter(a=>a.isDetectedEmbedding).length>0&&e.jsx("optgroup",{label:"Embedding Models",children:h.filter(a=>a.isDetectedEmbedding).map(a=>e.jsxs("option",{value:a.id,children:[a.name," - ",a.description]},a.id))}),h.filter(a=>!a.isDetectedEmbedding).length>0&&e.jsx("optgroup",{label:"Other Models",children:h.filter(a=>!a.isDetectedEmbedding).map(a=>e.jsxs("option",{value:a.id,children:[a.name," - ",a.description]},a.id))})]})}),h.length===0&&e.jsx("div",{className:"mt-3 p-3 bg-amber-50 dark:bg-amber-900/20 border border-amber-200 dark:border-amber-700/50 rounded-lg",children:e.jsxs("p",{className:"text-sm text-amber-800 dark:text-amber-200",children:["Install an embedding model:"," ",e.jsx("code",{className:"px-1.5 py-0.5 bg-amber-100 dark:bg-amber-900/40 rounded text-xs",children:"ollama pull nomic-embed-text"})]})}),e.jsx("p",{className:"text-[10px] text-primary-500 dark:text-primary-500 mt-2",children:"Recommended: nomic-embed-text, mxbai-embed-large, bge-m3, snowflake-arctic-embed"})]}),e.jsx("div",{className:"p-4 bg-gray-50 dark:bg-dark-50 rounded-xl border border-gray-200 dark:border-dark-300",children:e.jsxs("div",{className:"flex items-start gap-3",children:[e.jsx(Ce,{className:"h-5 w-5 text-gray-400 mt-0.5 flex-shrink-0"}),e.jsxs("div",{children:[e.jsx("p",{className:"text-sm font-medium text-gray-700 dark:text-gray-300",children:"About Advanced Settings"}),e.jsx("p",{className:"text-xs text-gray-500 dark:text-gray-400 mt-1",children:"The embedding model is used by the memory system to understand semantic meaning and find relevant memories during conversations. Choose a model that matches your use case and available resources."})]})]})})]})]})]}),e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx(F,{type:"button",variant:"ghost",onClick:_,disabled:s,className:"text-gray-600 dark:text-gray-400",children:"Cancel"}),e.jsxs("div",{className:"flex items-center gap-3",children:[o&&e.jsxs("div",{className:"flex items-center gap-1.5 text-sm text-emerald-600 dark:text-emerald-400",children:[e.jsx(_e,{className:"h-4 w-4"}),e.jsx("span",{children:"Saved"})]}),e.jsx(F,{type:"button",variant:"outline",onClick:()=>K(!1),disabled:s,children:s&&!m?"Saving...":"Save"}),e.jsx(F,{type:"button",onClick:()=>K(!0),disabled:s,children:s&&m?"Saving...":r?"Save & Close":"Create"})]})]})]})]})},Ee=({personas:r,onImport:y,onClose:_})=>{const[t,b]=d.useState(!1),[f,v]=d.useState(""),h=async s=>{try{const c=await C.exportPersona(s.id),m=new Blob([JSON.stringify(c,null,2)],{type:"application/json"}),l=URL.createObjectURL(m),o=document.createElement("a");o.href=l,o.download=`${s.name}.json`,document.body.appendChild(o),o.click(),document.body.removeChild(o),URL.revokeObjectURL(l),i.success(`Persona "${s.name}" exported successfully`)}catch(c){const m=c instanceof Error?c.message:String(c);i.error("Failed to export persona: "+m)}},u=async()=>{try{const s=r.map(n=>C.exportPersona(n.id)),c=await Promise.all(s),m={personas:c,exportedAt:Date.now(),version:"1.0.0",count:c.length},l=new Blob([JSON.stringify(m,null,2)],{type:"application/json"}),o=URL.createObjectURL(l),N=document.createElement("a");N.href=o,N.download=`personas-export-${new Date().toISOString().split("T")[0]}.json`,document.body.appendChild(N),N.click(),document.body.removeChild(N),URL.revokeObjectURL(o),i.success(`All ${r.length} personas exported successfully`)}catch(s){const c=s instanceof Error?s.message:String(s);i.error("Failed to export personas: "+c)}},M=async()=>{if(!f.trim()){i.error("Please paste the persona JSON data");return}b(!0);try{const s=JSON.parse(f);if(s.personas&&Array.isArray(s.personas)){let c=0,m=0;for(const l of s.personas)try{await C.importPersona(l),c++}catch(o){m++,console.error("Failed to import persona:",o)}c>0?(i.success(`Successfully imported ${c} personas`),m>0&&i.error(`Failed to import ${m} personas`)):i.error("Failed to import any personas")}else await C.importPersona(s),i.success("Persona imported successfully");v(""),y()}catch(s){const c=s instanceof Error?s.message:String(s);i.error("Failed to import persona: "+c)}finally{b(!1)}},j=s=>{const c=s.target.files?.[0];if(c){const m=new FileReader;m.onload=l=>{const o=l.target?.result;typeof o=="string"&&v(o)},m.readAsText(c)}};return e.jsxs("div",{className:"max-w-4xl mx-auto",children:[e.jsxs("div",{className:"mb-6",children:[e.jsx("h1",{className:"text-2xl font-bold text-gray-900 dark:text-dark-800",children:"Import & Export Personas"}),e.jsx("p",{className:"text-gray-600 dark:text-dark-600 mt-1",children:"Export your personas to share them or import personas from others"})]}),e.jsxs("div",{className:"grid grid-cols-1 lg:grid-cols-2 gap-6",children:[e.jsxs("div",{className:"bg-white dark:bg-dark-100 rounded-lg p-6 shadow-sm border border-gray-200 dark:border-dark-300",children:[e.jsx("h3",{className:"text-lg font-semibold text-gray-900 dark:text-dark-800 mb-4",children:"Export Personas"}),r.length===0?e.jsx("p",{className:"text-gray-600 dark:text-dark-600 text-center py-8",children:"No personas to export"}):e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"flex justify-between items-center",children:[e.jsxs("span",{className:"text-sm text-gray-600 dark:text-dark-600",children:[r.length," persona",r.length!==1?"s":""," ","available"]}),e.jsx(F,{onClick:u,variant:"outline",size:"sm",className:"px-3 py-1",children:"Export All"})]}),e.jsx("div",{className:"space-y-2 max-h-80 overflow-y-auto",children:r.map(s=>e.jsxs("div",{className:"flex items-center justify-between p-3 bg-gray-50 dark:bg-dark-200 rounded-md",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("img",{src:s.avatar||`https://ui-avatars.com/api/?name=${encodeURIComponent(s.name)}&background=6366f1&color=fff&size=32`,alt:s.name,className:"w-8 h-8 rounded-full"}),e.jsxs("div",{children:[e.jsx("div",{className:"font-medium text-gray-900 dark:text-dark-800",children:s.name}),e.jsx("div",{className:"text-sm text-gray-500 dark:text-dark-500",children:s.model})]})]}),e.jsx(F,{onClick:()=>h(s),variant:"outline",size:"sm",className:"px-3 py-1",children:"Export"})]},s.id))})]})]}),e.jsxs("div",{className:"bg-white dark:bg-dark-100 rounded-lg p-6 shadow-sm border border-gray-200 dark:border-dark-300",children:[e.jsx("h3",{className:"text-lg font-semibold text-gray-900 dark:text-dark-800 mb-4",children:"Import Personas"}),e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{children:[e.jsx("label",{className:"block text-sm font-medium text-gray-700 dark:text-dark-700 mb-2",children:"Upload JSON File"}),e.jsx("input",{type:"file",accept:".json",onChange:j,className:"w-full px-3 py-2 border border-gray-300 dark:border-dark-300 rounded-md bg-white dark:bg-dark-50 text-gray-900 dark:text-dark-700"})]}),e.jsx("div",{className:"text-center text-gray-500 dark:text-dark-500",children:"OR"}),e.jsxs("div",{children:[e.jsx("label",{className:"block text-sm font-medium text-gray-700 dark:text-dark-700 mb-2",children:"Paste JSON Data"}),e.jsx("textarea",{value:f,onChange:s=>v(s.target.value),className:"w-full px-3 py-2 border border-gray-300 dark:border-dark-300 rounded-md bg-white dark:bg-dark-50 text-gray-900 dark:text-dark-700",rows:8,placeholder:"Paste persona JSON data here..."})]}),e.jsx(F,{onClick:M,disabled:!f.trim()||t,className:"w-full",children:t?"Importing...":"Import Persona(s)"})]})]})]}),e.jsxs("div",{className:"mt-6 bg-gray-50 dark:bg-dark-200 rounded-lg p-4",children:[e.jsx("h4",{className:"text-sm font-medium text-gray-900 dark:text-dark-800 mb-2",children:"Expected JSON Format:"}),e.jsx("pre",{className:"text-xs text-gray-600 dark:text-dark-600 overflow-x-auto",children:`{
2
2
  "name": "Assistant Name",
3
3
  "description": "Brief description of the assistant's personality",
4
4
  "model": "model-name:version",
@@ -1 +1 @@
1
- import{j as e}from"./markdown-vendor-DRtqGHm3.js";import{r as u}from"./router-vendor-B-t91v39.js";import{x,r as $,v as z,o as L,aq as P,T as R}from"./ui-vendor-DA07XX1l.js";import{a as T,j as p,B as m,I as h}from"../assets/index-BAlYrgVl.js";import"./react-vendor-N--QU9DW.js";import"./utils-vendor-DNzxLBGx.js";const n=({children:t,htmlFor:d,className:y=""})=>e.jsx("label",{htmlFor:d,className:`text-sm font-medium text-gray-700 dark:text-gray-300 ${y}`,children:t}),b=({children:t,className:d=""})=>e.jsx("div",{className:`bg-white dark:bg-dark-25 border border-gray-200 dark:border-dark-200 rounded-xl shadow-card hover:shadow-card-hover transition-shadow duration-200 ${d}`,children:t}),v=({children:t,className:d=""})=>e.jsx("div",{className:`flex flex-col space-y-1.5 p-6 ${d}`,children:t}),f=({children:t,className:d=""})=>e.jsx("h3",{className:`text-lg font-semibold leading-none tracking-tight text-gray-900 dark:text-dark-950 ${d}`,children:t}),N=({children:t,className:d=""})=>e.jsx("p",{className:`text-sm text-gray-500 dark:text-dark-500 ${d}`,children:t}),w=({children:t,className:d=""})=>e.jsx("div",{className:`p-6 pt-0 ${d}`,children:t}),B=()=>{const[t,d]=u.useState([]),[y,U]=u.useState(!0),[C,k]=u.useState(!1),[c,j]=u.useState(null),[a,l]=u.useState({username:"",email:"",password:"",role:"user"}),{user:g}=T();u.useEffect(()=>{E()},[]);const E=async()=>{try{U(!0);const r=await p.getUsers();r.success&&r.data&&d(r.data)}catch(r){console.error("Error loading users:",r),x.error("Failed to load users")}finally{U(!1)}},F=async r=>{r.preventDefault();try{const s=await p.createUser(a);s.success&&s.data&&(d([...t,s.data]),l({username:"",email:"",password:"",role:"user"}),k(!1),x.success("User created successfully"))}catch(s){console.error("Error creating user:",s);let i="Failed to create user";s instanceof Error&&"response"in s&&(i=s.response?.data?.message||"Failed to create user"),x.error(i)}},S=async r=>{if(r.preventDefault(),!!c)try{const s={username:a.username,email:a.email,role:a.role};a.password&&a.password.trim()!==""&&(s.password=a.password);const i=await p.updateUser(c.id,s);i.success&&i.data&&(d(t.map(o=>o.id===c.id?i.data:o)),j(null),l({username:"",email:"",password:"",role:"user"}),x.success("User updated successfully"))}catch(s){console.error("Error updating user:",s);let i="Failed to update user";s instanceof Error&&"response"in s&&(i=s.response?.data?.message||"Failed to update user"),x.error(i)}},A=async(r,s)=>{if(confirm(`Are you sure you want to delete user "${s}"?`))try{(await p.deleteUser(r)).success&&(d(t.filter(o=>o.id!==r)),x.success("User deleted successfully"))}catch(i){console.error("Error deleting user:",i);let o="Failed to delete user";i instanceof Error&&"response"in i&&(o=i.response?.data?.message||"Failed to delete user"),x.error(o)}},D=r=>{j(r),l({username:r.username,email:r.email||"",password:"",role:r.role})},M=()=>{j(null),l({username:"",email:"",password:"",role:"user"})},q=()=>{l({username:"",email:"",password:"",role:"user"}),k(!1)};return y?e.jsx("div",{className:"flex items-center justify-center p-8",children:e.jsx("div",{className:"w-8 h-8 border-4 border-gray-200 dark:border-gray-600 border-t-primary-500 rounded-full animate-spin"})}):e.jsxs("div",{className:"space-y-6",children:[e.jsxs("div",{className:"flex justify-between items-center",children:[e.jsx("div",{}),e.jsxs(m,{onClick:()=>k(!C),className:"flex items-center space-x-2 bg-primary-600 hover:bg-primary-700 dark:bg-primary-500 dark:hover:bg-primary-600",children:[e.jsx($,{size:16}),e.jsx("span",{children:"Add User"})]})]}),C&&e.jsxs(b,{className:"bg-white dark:bg-dark-25 border border-gray-200 dark:border-dark-200 shadow-lg",children:[e.jsxs(v,{children:[e.jsx(f,{className:"text-gray-900 dark:text-gray-100",children:"Create New User"}),e.jsx(N,{className:"text-gray-600 dark:text-gray-400",children:"Add a new user to the system"})]}),e.jsx(w,{children:e.jsxs("form",{onSubmit:F,className:"space-y-4",children:[e.jsxs("div",{className:"grid grid-cols-2 gap-4",children:[e.jsxs("div",{children:[e.jsx(n,{htmlFor:"username",className:"text-gray-700 dark:text-gray-300",children:"Username"}),e.jsx(h,{id:"username",value:a.username,onChange:r=>l({...a,username:r.target.value}),required:!0,className:"bg-white dark:bg-dark-100 border-gray-300 dark:border-dark-300 text-gray-900 dark:text-gray-100"})]}),e.jsxs("div",{children:[e.jsx(n,{htmlFor:"email",className:"text-gray-700 dark:text-gray-300",children:"Email"}),e.jsx(h,{id:"email",type:"email",value:a.email,onChange:r=>l({...a,email:r.target.value}),required:!0,className:"bg-white dark:bg-dark-100 border-gray-300 dark:border-dark-300 text-gray-900 dark:text-gray-100"})]})]}),e.jsxs("div",{className:"grid grid-cols-2 gap-4",children:[e.jsxs("div",{children:[e.jsx(n,{htmlFor:"password",className:"text-gray-700 dark:text-gray-300",children:"Password"}),e.jsx(h,{id:"password",type:"password",value:a.password,onChange:r=>l({...a,password:r.target.value}),required:!0,className:"bg-white dark:bg-dark-100 border-gray-300 dark:border-dark-300 text-gray-900 dark:text-gray-100"})]}),e.jsxs("div",{children:[e.jsx(n,{htmlFor:"role",className:"text-gray-700 dark:text-gray-300",children:"Role"}),e.jsxs("select",{id:"role",value:a.role,onChange:r=>l({...a,role:r.target.value}),className:"w-full px-3 py-2 border border-gray-300 dark:border-dark-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-primary-500 bg-white dark:bg-dark-100 text-gray-900 dark:text-gray-100 transition-colors duration-200",children:[e.jsx("option",{value:"user",children:"User"}),e.jsx("option",{value:"admin",children:"Admin"})]})]})]}),e.jsxs("div",{className:"flex space-x-2",children:[e.jsx(m,{type:"submit",children:"Create User"}),e.jsx(m,{type:"button",variant:"outline",onClick:q,children:"Cancel"})]})]})})]}),c&&e.jsxs(b,{className:"bg-white dark:bg-dark-25 border border-gray-200 dark:border-dark-200 shadow-lg",children:[e.jsxs(v,{children:[e.jsxs(f,{className:"text-gray-900 dark:text-gray-100",children:["Edit User: ",c.username]}),e.jsx(N,{className:"text-gray-600 dark:text-gray-400",children:"Modify user information and permissions"})]}),e.jsx(w,{children:e.jsxs("form",{onSubmit:S,className:"space-y-4",children:[e.jsxs("div",{className:"grid grid-cols-2 gap-4",children:[e.jsxs("div",{children:[e.jsx(n,{htmlFor:"edit-username",className:"text-gray-700 dark:text-gray-300",children:"Username"}),e.jsx(h,{id:"edit-username",value:a.username,onChange:r=>l({...a,username:r.target.value}),required:!0,className:"bg-white dark:bg-dark-100 border-gray-300 dark:border-dark-300 text-gray-900 dark:text-gray-100"})]}),e.jsxs("div",{children:[e.jsx(n,{htmlFor:"edit-email",className:"text-gray-700 dark:text-gray-300",children:"Email"}),e.jsx(h,{id:"edit-email",type:"email",value:a.email,onChange:r=>l({...a,email:r.target.value}),required:!0,className:"bg-white dark:bg-dark-100 border-gray-300 dark:border-dark-300 text-gray-900 dark:text-gray-100"})]})]}),e.jsxs("div",{className:"grid grid-cols-2 gap-4",children:[e.jsxs("div",{children:[e.jsx(n,{htmlFor:"edit-password",className:"text-gray-700 dark:text-gray-300",children:"New Password (optional)"}),e.jsx(h,{id:"edit-password",type:"password",value:a.password,onChange:r=>l({...a,password:r.target.value}),placeholder:"Leave empty to keep current password",className:"bg-white dark:bg-dark-100 border-gray-300 dark:border-dark-300 text-gray-900 dark:text-gray-100"})]}),e.jsxs("div",{children:[e.jsx(n,{htmlFor:"edit-role",className:"text-gray-700 dark:text-gray-300",children:"Role"}),e.jsxs("select",{id:"edit-role",value:a.role,onChange:r=>l({...a,role:r.target.value}),disabled:c?.id===g?.id&&g?.role==="admin",className:"w-full px-3 py-2 border border-gray-300 dark:border-dark-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-primary-500 bg-white dark:bg-dark-100 text-gray-900 dark:text-gray-100 transition-colors duration-200 disabled:opacity-50 disabled:cursor-not-allowed",children:[e.jsx("option",{value:"user",children:"User"}),e.jsx("option",{value:"admin",children:"Admin"})]}),c?.id===g?.id&&g?.role==="admin"&&e.jsx("p",{className:"text-xs text-amber-600 dark:text-amber-400 mt-1",children:"Cannot change your own admin role to prevent lockout"})]})]}),e.jsxs("div",{className:"flex space-x-2",children:[e.jsx(m,{type:"submit",children:"Update User"}),e.jsx(m,{type:"button",variant:"outline",onClick:M,children:"Cancel"})]})]})})]}),e.jsxs(b,{className:"bg-white dark:bg-dark-25 border border-gray-200 dark:border-dark-200 shadow-lg",children:[e.jsxs(v,{children:[e.jsxs(f,{className:"text-gray-900 dark:text-gray-100",children:["All Users (",t.length,")"]}),e.jsx(N,{className:"text-gray-600 dark:text-gray-400",children:"Manage existing user accounts"})]}),e.jsx(w,{children:e.jsx("div",{className:"space-y-3",children:t.map(r=>e.jsxs("div",{className:"flex items-center justify-between p-4 bg-gray-50 dark:bg-dark-100 rounded-lg border border-gray-200 dark:border-dark-300",children:[e.jsxs("div",{className:"flex items-center space-x-3",children:[e.jsx("div",{className:"p-2 bg-primary-100 dark:bg-primary-900/20 rounded-lg",children:r.role==="admin"?e.jsx(z,{className:"h-5 w-5 text-primary-600 dark:text-primary-400"}):e.jsx(L,{className:"h-5 w-5 text-primary-600 dark:text-primary-400"})}),e.jsxs("div",{children:[e.jsxs("h3",{className:"font-medium text-gray-900 dark:text-gray-100",children:[r.username,r.id===g?.id&&e.jsx("span",{className:"ml-2 text-xs text-primary-600 dark:text-primary-400 font-normal",children:"(You)"})]}),e.jsxs("p",{className:"text-sm text-gray-600 dark:text-gray-400",children:[r.email||"No email provided"," • ",r.role]}),e.jsxs("p",{className:"text-xs text-gray-500 dark:text-gray-500",children:["Created: ",new Date(r.createdAt).toLocaleDateString()]})]})]}),e.jsxs("div",{className:"flex space-x-2",children:[e.jsx(m,{variant:"outline",size:"sm",onClick:()=>D(r),className:"text-gray-600 dark:text-gray-400 hover:text-primary-600 dark:hover:text-primary-400",children:e.jsx(P,{size:16})}),e.jsx(m,{variant:"outline",size:"sm",onClick:()=>A(r.id,r.username),disabled:r.id===g?.id,className:"text-red-600 dark:text-red-400 hover:text-red-700 dark:hover:text-red-300 hover:bg-red-50 dark:hover:bg-red-900/20",children:e.jsx(R,{size:16})})]})]},r.id))})})]})]})},O=()=>e.jsx("div",{className:"h-full overflow-auto",children:e.jsxs("div",{className:"max-w-6xl mx-auto p-6",children:[e.jsxs("div",{className:"mb-8",children:[e.jsx("h1",{className:"text-3xl font-bold text-gray-900 dark:text-gray-100 mb-2",children:"User Management"}),e.jsx("p",{className:"text-gray-700 dark:text-gray-300",children:"Manage user accounts, permissions, and access controls for your Libre WebUI instance."})]}),e.jsx(B,{})]})});export{O as UserManagementPage,O as default};
1
+ import{j as e}from"./markdown-vendor-YWiGftdn.js";import{r as u}from"./router-vendor-CnU0qKrY.js";import{x,r as $,v as z,o as L,aq as P,T as R}from"./ui-vendor-CdKqcMKK.js";import{a as T,j as p,B as m,I as h}from"../assets/index-BbJ5OmoO.js";import"./react-vendor-N--QU9DW.js";import"./utils-vendor-DEeF42mN.js";const n=({children:t,htmlFor:d,className:y=""})=>e.jsx("label",{htmlFor:d,className:`text-sm font-medium text-gray-700 dark:text-gray-300 ${y}`,children:t}),b=({children:t,className:d=""})=>e.jsx("div",{className:`bg-white dark:bg-dark-25 border border-gray-200 dark:border-dark-200 rounded-xl shadow-card hover:shadow-card-hover transition-shadow duration-200 ${d}`,children:t}),v=({children:t,className:d=""})=>e.jsx("div",{className:`flex flex-col space-y-1.5 p-6 ${d}`,children:t}),f=({children:t,className:d=""})=>e.jsx("h3",{className:`text-lg font-semibold leading-none tracking-tight text-gray-900 dark:text-dark-950 ${d}`,children:t}),N=({children:t,className:d=""})=>e.jsx("p",{className:`text-sm text-gray-500 dark:text-dark-500 ${d}`,children:t}),w=({children:t,className:d=""})=>e.jsx("div",{className:`p-6 pt-0 ${d}`,children:t}),B=()=>{const[t,d]=u.useState([]),[y,U]=u.useState(!0),[C,k]=u.useState(!1),[c,j]=u.useState(null),[a,l]=u.useState({username:"",email:"",password:"",role:"user"}),{user:g}=T();u.useEffect(()=>{E()},[]);const E=async()=>{try{U(!0);const r=await p.getUsers();r.success&&r.data&&d(r.data)}catch(r){console.error("Error loading users:",r),x.error("Failed to load users")}finally{U(!1)}},F=async r=>{r.preventDefault();try{const s=await p.createUser(a);s.success&&s.data&&(d([...t,s.data]),l({username:"",email:"",password:"",role:"user"}),k(!1),x.success("User created successfully"))}catch(s){console.error("Error creating user:",s);let i="Failed to create user";s instanceof Error&&"response"in s&&(i=s.response?.data?.message||"Failed to create user"),x.error(i)}},S=async r=>{if(r.preventDefault(),!!c)try{const s={username:a.username,email:a.email,role:a.role};a.password&&a.password.trim()!==""&&(s.password=a.password);const i=await p.updateUser(c.id,s);i.success&&i.data&&(d(t.map(o=>o.id===c.id?i.data:o)),j(null),l({username:"",email:"",password:"",role:"user"}),x.success("User updated successfully"))}catch(s){console.error("Error updating user:",s);let i="Failed to update user";s instanceof Error&&"response"in s&&(i=s.response?.data?.message||"Failed to update user"),x.error(i)}},A=async(r,s)=>{if(confirm(`Are you sure you want to delete user "${s}"?`))try{(await p.deleteUser(r)).success&&(d(t.filter(o=>o.id!==r)),x.success("User deleted successfully"))}catch(i){console.error("Error deleting user:",i);let o="Failed to delete user";i instanceof Error&&"response"in i&&(o=i.response?.data?.message||"Failed to delete user"),x.error(o)}},D=r=>{j(r),l({username:r.username,email:r.email||"",password:"",role:r.role})},M=()=>{j(null),l({username:"",email:"",password:"",role:"user"})},q=()=>{l({username:"",email:"",password:"",role:"user"}),k(!1)};return y?e.jsx("div",{className:"flex items-center justify-center p-8",children:e.jsx("div",{className:"w-8 h-8 border-4 border-gray-200 dark:border-gray-600 border-t-primary-500 rounded-full animate-spin"})}):e.jsxs("div",{className:"space-y-6",children:[e.jsxs("div",{className:"flex justify-between items-center",children:[e.jsx("div",{}),e.jsxs(m,{onClick:()=>k(!C),className:"flex items-center space-x-2 bg-primary-600 hover:bg-primary-700 dark:bg-primary-500 dark:hover:bg-primary-600",children:[e.jsx($,{size:16}),e.jsx("span",{children:"Add User"})]})]}),C&&e.jsxs(b,{className:"bg-white dark:bg-dark-25 border border-gray-200 dark:border-dark-200 shadow-lg",children:[e.jsxs(v,{children:[e.jsx(f,{className:"text-gray-900 dark:text-gray-100",children:"Create New User"}),e.jsx(N,{className:"text-gray-600 dark:text-gray-400",children:"Add a new user to the system"})]}),e.jsx(w,{children:e.jsxs("form",{onSubmit:F,className:"space-y-4",children:[e.jsxs("div",{className:"grid grid-cols-2 gap-4",children:[e.jsxs("div",{children:[e.jsx(n,{htmlFor:"username",className:"text-gray-700 dark:text-gray-300",children:"Username"}),e.jsx(h,{id:"username",value:a.username,onChange:r=>l({...a,username:r.target.value}),required:!0,className:"bg-white dark:bg-dark-100 border-gray-300 dark:border-dark-300 text-gray-900 dark:text-gray-100"})]}),e.jsxs("div",{children:[e.jsx(n,{htmlFor:"email",className:"text-gray-700 dark:text-gray-300",children:"Email"}),e.jsx(h,{id:"email",type:"email",value:a.email,onChange:r=>l({...a,email:r.target.value}),required:!0,className:"bg-white dark:bg-dark-100 border-gray-300 dark:border-dark-300 text-gray-900 dark:text-gray-100"})]})]}),e.jsxs("div",{className:"grid grid-cols-2 gap-4",children:[e.jsxs("div",{children:[e.jsx(n,{htmlFor:"password",className:"text-gray-700 dark:text-gray-300",children:"Password"}),e.jsx(h,{id:"password",type:"password",value:a.password,onChange:r=>l({...a,password:r.target.value}),required:!0,className:"bg-white dark:bg-dark-100 border-gray-300 dark:border-dark-300 text-gray-900 dark:text-gray-100"})]}),e.jsxs("div",{children:[e.jsx(n,{htmlFor:"role",className:"text-gray-700 dark:text-gray-300",children:"Role"}),e.jsxs("select",{id:"role",value:a.role,onChange:r=>l({...a,role:r.target.value}),className:"w-full px-3 py-2 border border-gray-300 dark:border-dark-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-primary-500 bg-white dark:bg-dark-100 text-gray-900 dark:text-gray-100 transition-colors duration-200",children:[e.jsx("option",{value:"user",children:"User"}),e.jsx("option",{value:"admin",children:"Admin"})]})]})]}),e.jsxs("div",{className:"flex space-x-2",children:[e.jsx(m,{type:"submit",children:"Create User"}),e.jsx(m,{type:"button",variant:"outline",onClick:q,children:"Cancel"})]})]})})]}),c&&e.jsxs(b,{className:"bg-white dark:bg-dark-25 border border-gray-200 dark:border-dark-200 shadow-lg",children:[e.jsxs(v,{children:[e.jsxs(f,{className:"text-gray-900 dark:text-gray-100",children:["Edit User: ",c.username]}),e.jsx(N,{className:"text-gray-600 dark:text-gray-400",children:"Modify user information and permissions"})]}),e.jsx(w,{children:e.jsxs("form",{onSubmit:S,className:"space-y-4",children:[e.jsxs("div",{className:"grid grid-cols-2 gap-4",children:[e.jsxs("div",{children:[e.jsx(n,{htmlFor:"edit-username",className:"text-gray-700 dark:text-gray-300",children:"Username"}),e.jsx(h,{id:"edit-username",value:a.username,onChange:r=>l({...a,username:r.target.value}),required:!0,className:"bg-white dark:bg-dark-100 border-gray-300 dark:border-dark-300 text-gray-900 dark:text-gray-100"})]}),e.jsxs("div",{children:[e.jsx(n,{htmlFor:"edit-email",className:"text-gray-700 dark:text-gray-300",children:"Email"}),e.jsx(h,{id:"edit-email",type:"email",value:a.email,onChange:r=>l({...a,email:r.target.value}),required:!0,className:"bg-white dark:bg-dark-100 border-gray-300 dark:border-dark-300 text-gray-900 dark:text-gray-100"})]})]}),e.jsxs("div",{className:"grid grid-cols-2 gap-4",children:[e.jsxs("div",{children:[e.jsx(n,{htmlFor:"edit-password",className:"text-gray-700 dark:text-gray-300",children:"New Password (optional)"}),e.jsx(h,{id:"edit-password",type:"password",value:a.password,onChange:r=>l({...a,password:r.target.value}),placeholder:"Leave empty to keep current password",className:"bg-white dark:bg-dark-100 border-gray-300 dark:border-dark-300 text-gray-900 dark:text-gray-100"})]}),e.jsxs("div",{children:[e.jsx(n,{htmlFor:"edit-role",className:"text-gray-700 dark:text-gray-300",children:"Role"}),e.jsxs("select",{id:"edit-role",value:a.role,onChange:r=>l({...a,role:r.target.value}),disabled:c?.id===g?.id&&g?.role==="admin",className:"w-full px-3 py-2 border border-gray-300 dark:border-dark-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-primary-500 bg-white dark:bg-dark-100 text-gray-900 dark:text-gray-100 transition-colors duration-200 disabled:opacity-50 disabled:cursor-not-allowed",children:[e.jsx("option",{value:"user",children:"User"}),e.jsx("option",{value:"admin",children:"Admin"})]}),c?.id===g?.id&&g?.role==="admin"&&e.jsx("p",{className:"text-xs text-amber-600 dark:text-amber-400 mt-1",children:"Cannot change your own admin role to prevent lockout"})]})]}),e.jsxs("div",{className:"flex space-x-2",children:[e.jsx(m,{type:"submit",children:"Update User"}),e.jsx(m,{type:"button",variant:"outline",onClick:M,children:"Cancel"})]})]})})]}),e.jsxs(b,{className:"bg-white dark:bg-dark-25 border border-gray-200 dark:border-dark-200 shadow-lg",children:[e.jsxs(v,{children:[e.jsxs(f,{className:"text-gray-900 dark:text-gray-100",children:["All Users (",t.length,")"]}),e.jsx(N,{className:"text-gray-600 dark:text-gray-400",children:"Manage existing user accounts"})]}),e.jsx(w,{children:e.jsx("div",{className:"space-y-3",children:t.map(r=>e.jsxs("div",{className:"flex items-center justify-between p-4 bg-gray-50 dark:bg-dark-100 rounded-lg border border-gray-200 dark:border-dark-300",children:[e.jsxs("div",{className:"flex items-center space-x-3",children:[e.jsx("div",{className:"p-2 bg-primary-100 dark:bg-primary-900/20 rounded-lg",children:r.role==="admin"?e.jsx(z,{className:"h-5 w-5 text-primary-600 dark:text-primary-400"}):e.jsx(L,{className:"h-5 w-5 text-primary-600 dark:text-primary-400"})}),e.jsxs("div",{children:[e.jsxs("h3",{className:"font-medium text-gray-900 dark:text-gray-100",children:[r.username,r.id===g?.id&&e.jsx("span",{className:"ml-2 text-xs text-primary-600 dark:text-primary-400 font-normal",children:"(You)"})]}),e.jsxs("p",{className:"text-sm text-gray-600 dark:text-gray-400",children:[r.email||"No email provided"," • ",r.role]}),e.jsxs("p",{className:"text-xs text-gray-500 dark:text-gray-500",children:["Created: ",new Date(r.createdAt).toLocaleDateString()]})]})]}),e.jsxs("div",{className:"flex space-x-2",children:[e.jsx(m,{variant:"outline",size:"sm",onClick:()=>D(r),className:"text-gray-600 dark:text-gray-400 hover:text-primary-600 dark:hover:text-primary-400",children:e.jsx(P,{size:16})}),e.jsx(m,{variant:"outline",size:"sm",onClick:()=>A(r.id,r.username),disabled:r.id===g?.id,className:"text-red-600 dark:text-red-400 hover:text-red-700 dark:hover:text-red-300 hover:bg-red-50 dark:hover:bg-red-900/20",children:e.jsx(R,{size:16})})]})]},r.id))})})]})]})},O=()=>e.jsx("div",{className:"h-full overflow-auto",children:e.jsxs("div",{className:"max-w-6xl mx-auto p-6",children:[e.jsxs("div",{className:"mb-8",children:[e.jsx("h1",{className:"text-3xl font-bold text-gray-900 dark:text-gray-100 mb-2",children:"User Management"}),e.jsx("p",{className:"text-gray-700 dark:text-gray-300",children:"Manage user accounts, permissions, and access controls for your Libre WebUI instance."})]}),e.jsx(B,{})]})});export{O as UserManagementPage,O as default};