apteva 0.4.51 → 0.4.52

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.
@@ -0,0 +1,4 @@
1
+ import{F as o,k as p,l as t}from"./App.9sryp183.js";import{N as Xq,O as n}from"./App.vkg121c6.js";import{U as E}from"./App.p7jjw1zf.js";import{$ as Zq,X as r,aa as zq,ja as V,ma as i,oa as Qq}from"./App.94x6mh7f.js";var H=r(Zq(),1);var q=r(zq(),1);function bq(){let{projectsEnabled:z,metaAgentEnabled:Z}=i(),[J,L]=H.useState("general"),T=[{key:"general",label:"General"},{key:"providers",label:"Providers"},...z?[{key:"projects",label:"Projects"}]:[],...Z?[{key:"assistant",label:"Assistant"}]:[],{key:"channels",label:"Channels"},{key:"api-keys",label:"API Keys"},{key:"account",label:"Account"},{key:"updates",label:"Updates"},{key:"data",label:"Data"}];return q.jsxDEV("div",{className:"flex-1 flex flex-col md:flex-row overflow-hidden",children:[q.jsxDEV("div",{className:"md:hidden border-b border-[var(--color-border)] bg-[var(--color-bg)]",children:q.jsxDEV("div",{className:"flex overflow-x-auto",style:{scrollbarWidth:"none",msOverflowStyle:"none"},children:T.map((Q)=>q.jsxDEV("button",{onClick:()=>L(Q.key),className:`flex-shrink-0 px-4 py-3 text-sm font-medium border-b-2 transition ${J===Q.key?"border-[var(--color-accent)] text-[var(--color-accent)]":"border-transparent text-[var(--color-text-muted)] hover:text-[var(--color-text-secondary)]"}`,children:Q.label},Q.key,!1,void 0,this))},void 0,!1,void 0,this)},void 0,!1,void 0,this),q.jsxDEV("div",{className:"hidden md:block w-48 border-r border-[var(--color-border)] p-4 flex-shrink-0",children:[q.jsxDEV("h2",{className:"text-sm font-medium text-[var(--color-text-muted)] uppercase tracking-wider mb-3",children:"Settings"},void 0,!1,void 0,this),q.jsxDEV("nav",{className:"space-y-1",children:T.map((Q)=>q.jsxDEV($q,{label:Q.label,active:J===Q.key,onClick:()=>L(Q.key)},Q.key,!1,void 0,this))},void 0,!1,void 0,this)]},void 0,!0,void 0,this),q.jsxDEV("div",{className:"flex-1 overflow-auto p-4 md:p-6",children:[J==="general"&&q.jsxDEV(Gq,{},void 0,!1,void 0,this),J==="providers"&&q.jsxDEV(Jq,{},void 0,!1,void 0,this),J==="projects"&&z&&q.jsxDEV(Wq,{},void 0,!1,void 0,this),J==="channels"&&q.jsxDEV(Oq,{},void 0,!1,void 0,this),J==="api-keys"&&q.jsxDEV(Nq,{},void 0,!1,void 0,this),J==="account"&&q.jsxDEV(Uq,{},void 0,!1,void 0,this),J==="updates"&&q.jsxDEV(Bq,{},void 0,!1,void 0,this),J==="data"&&q.jsxDEV(Rq,{},void 0,!1,void 0,this),J==="assistant"&&Z&&q.jsxDEV(Tq,{},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)}function $q({label:z,active:Z,onClick:J}){return q.jsxDEV("button",{onClick:J,className:`w-full text-left px-3 py-2 rounded text-sm transition ${Z?"bg-[var(--color-surface-raised)] text-[var(--color-text)]":"text-[var(--color-text-muted)] hover:bg-[var(--color-surface)] hover:text-[var(--color-text-secondary)]"}`,children:z},void 0,!1,void 0,this)}function Gq(){let{authFetch:z}=V(),{mode:Z,style:J,setMode:L,setStyle:T}=Qq(),[Q,N]=H.useState(""),[U,O]=H.useState(!0),[W,F]=H.useState(!1),[I,R]=H.useState(null);H.useEffect(()=>{(async()=>{try{let w=await(await z("/api/settings/instance-url")).json();N(w.instance_url||"")}catch{}O(!1)})()},[]);let B=async()=>{F(!0),R(null);try{let Y=await z("/api/settings/instance-url",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({instance_url:Q})}),A=await Y.json();if(Y.ok)N(A.instance_url||""),R({type:"success",text:"Instance URL saved"});else R({type:"error",text:A.error||"Failed to save"})}catch{R({type:"error",text:"Failed to save"})}F(!1)},G=[{value:"auto",label:"Auto",description:"Follow system preference"},{value:"dark",label:"Dark",description:"Dark background"},{value:"light",label:"Light",description:"Light background"}],M=[{value:"classic",label:"Classic",description:"Terminal-inspired, sharp"},{value:"professional",label:"Professional",description:"Polished, enterprise"}];return q.jsxDEV("div",{className:"max-w-4xl w-full",children:[q.jsxDEV("div",{className:"mb-6",children:[q.jsxDEV("h1",{className:"text-2xl font-semibold mb-1",children:"General"},void 0,!1,void 0,this),q.jsxDEV("p",{className:"text-[var(--color-text-muted)]",children:"Instance configuration and appearance."},void 0,!1,void 0,this)]},void 0,!0,void 0,this),q.jsxDEV("div",{className:"bg-[var(--color-surface)] card p-4 mb-4",children:[q.jsxDEV("h3",{className:"font-medium mb-4",children:"Appearance"},void 0,!1,void 0,this),q.jsxDEV("p",{className:"text-sm text-[var(--color-text-secondary)] mb-2",children:"Color scheme"},void 0,!1,void 0,this),q.jsxDEV("div",{className:"flex gap-3 mb-5",children:G.map((Y)=>q.jsxDEV("button",{onClick:()=>L(Y.value),className:`flex-1 max-w-[160px] px-4 py-3 border text-left transition ${Z===Y.value?"border-[var(--color-accent)] bg-[var(--color-accent-10)]":"border-[var(--color-border-light)] bg-[var(--color-bg)] hover:border-[var(--color-scrollbar)]"}`,style:{borderRadius:"var(--radius-card)"},children:[q.jsxDEV("div",{className:"flex items-center gap-2 mb-1",children:[q.jsxDEV("div",{className:`w-4 h-4 rounded-full border-2 flex items-center justify-center ${Z===Y.value?"border-[var(--color-accent)]":"border-[var(--color-scrollbar)]"}`,children:Z===Y.value&&q.jsxDEV("div",{className:"w-2 h-2 rounded-full bg-[var(--color-accent)]"},void 0,!1,void 0,this)},void 0,!1,void 0,this),q.jsxDEV("span",{className:"text-sm font-medium",children:Y.label},void 0,!1,void 0,this)]},void 0,!0,void 0,this),q.jsxDEV("p",{className:"text-xs text-[var(--color-text-muted)] ml-6",children:Y.description},void 0,!1,void 0,this)]},Y.value,!0,void 0,this))},void 0,!1,void 0,this),q.jsxDEV("p",{className:"text-sm text-[var(--color-text-secondary)] mb-2",children:"Style"},void 0,!1,void 0,this),q.jsxDEV("div",{className:"flex gap-3",children:M.map((Y)=>q.jsxDEV("button",{onClick:()=>T(Y.value),className:`flex-1 max-w-[200px] px-4 py-3 border text-left transition ${J===Y.value?"border-[var(--color-accent)] bg-[var(--color-accent-10)]":"border-[var(--color-border-light)] bg-[var(--color-bg)] hover:border-[var(--color-scrollbar)]"}`,style:{borderRadius:"var(--radius-card)"},children:[q.jsxDEV("div",{className:"flex items-center gap-2 mb-1",children:[q.jsxDEV("div",{className:`w-4 h-4 rounded-full border-2 flex items-center justify-center ${J===Y.value?"border-[var(--color-accent)]":"border-[var(--color-scrollbar)]"}`,children:J===Y.value&&q.jsxDEV("div",{className:"w-2 h-2 rounded-full bg-[var(--color-accent)]"},void 0,!1,void 0,this)},void 0,!1,void 0,this),q.jsxDEV("span",{className:"text-sm font-medium",children:Y.label},void 0,!1,void 0,this)]},void 0,!0,void 0,this),q.jsxDEV("p",{className:"text-xs text-[var(--color-text-muted)] ml-6",children:Y.description},void 0,!1,void 0,this)]},Y.value,!0,void 0,this))},void 0,!1,void 0,this)]},void 0,!0,void 0,this),q.jsxDEV("div",{className:"bg-[var(--color-surface)] card p-4",children:[q.jsxDEV("h3",{className:"font-medium mb-2",children:"Instance URL"},void 0,!1,void 0,this),q.jsxDEV("p",{className:"text-sm text-[var(--color-text-muted)] mb-4",children:"The public HTTPS URL for this instance. Used for webhook callbacks from external services like Composio."},void 0,!1,void 0,this),U?q.jsxDEV("div",{className:"text-[var(--color-text-muted)] text-sm",children:"Loading..."},void 0,!1,void 0,this):q.jsxDEV("div",{className:"space-y-3 max-w-lg",children:[q.jsxDEV("input",{type:"text",value:Q,onChange:(Y)=>N(Y.target.value),placeholder:"https://your-domain.com",className:"w-full bg-[var(--color-bg)] border border-[var(--color-border-light)] rounded px-3 py-2 focus:outline-none focus:border-[var(--color-accent)] font-mono text-sm"},void 0,!1,void 0,this),I&&q.jsxDEV("div",{className:`p-3 rounded text-sm ${I.type==="success"?"bg-green-500/10 text-green-400 border border-green-500/30":"bg-red-500/10 text-red-400 border border-red-500/30"}`,children:I.text},void 0,!1,void 0,this),q.jsxDEV("button",{onClick:B,disabled:W,className:"px-4 py-2 bg-[var(--color-accent)] hover:bg-[var(--color-accent-hover)] disabled:opacity-50 text-black rounded text-sm font-medium transition",children:W?"Saving...":"Save"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)}function Jq(){let{authFetch:z}=V(),{projects:Z,projectsEnabled:J}=i(),[L,T]=H.useState([]),[Q,N]=H.useState(null),[U,O]=H.useState(""),[W,F]=H.useState(""),[I,R]=H.useState(!1),[B,G]=H.useState(!1),[M,Y]=H.useState(null),[A,w]=H.useState(null),{confirm:C,ConfirmDialog:k}=n(),y=async()=>{let f=await(await z("/api/providers")).json();T(f.providers||[])};H.useEffect(()=>{y()},[]);let S=async()=>{if(!Q||!U)return;R(!0),Y(null),w(null);let _=U;if(Q==="browserbase"&&W)_=JSON.stringify({api_key:U,project_id:W});try{G(!0);let u=await(await z(`/api/keys/${Q}/test`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({key:_})})).json();if(G(!1),!u.valid){Y(u.error||"API key is invalid"),R(!1);return}let c=await z(`/api/keys/${Q}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({key:_})}),h=await c.json();if(!c.ok)Y(h.error||"Failed to save key");else{let x="API key saved!";if(h.restartedAgents&&h.restartedAgents.length>0){let m=h.restartedAgents.filter((D)=>D.success).length;if(h.restartedAgents.length-m===0)x+=` Restarted ${m} agent${m>1?"s":""} with new key.`;else x+=` Restarted ${m}/${h.restartedAgents.length} agents.`}w(x),O(""),F(""),N(null),y()}}catch(f){Y("Failed to save key")}R(!1)},P=async(_)=>{if(!await C("Are you sure you want to remove this API key?",{confirmText:"Remove",title:"Remove API Key"}))return;await z(`/api/keys/${_}`,{method:"DELETE"}),y()},$=L.filter((_)=>_.type==="llm"),X=L.filter((_)=>_.type==="integration"),K=L.filter((_)=>_.type==="browser"),l=$.filter((_)=>_.hasKey).length,g=X.filter((_)=>_.hasKey).length,d=K.filter((_)=>_.hasKey).length;return H.useEffect(()=>{if(A&&!Q){let _=setTimeout(()=>w(null),5000);return()=>clearTimeout(_)}},[A,Q]),q.jsxDEV(q.Fragment,{children:[k,q.jsxDEV("div",{className:"space-y-10",children:[A&&!Q&&q.jsxDEV("div",{className:"bg-green-500/10 border border-green-500/30 rounded-lg p-4 flex items-center justify-between",children:[q.jsxDEV("div",{className:"flex items-center gap-2 text-green-400",children:[q.jsxDEV(p,{className:"w-5 h-5"},void 0,!1,void 0,this),q.jsxDEV("span",{children:A},void 0,!1,void 0,this)]},void 0,!0,void 0,this),q.jsxDEV("button",{onClick:()=>w(null),className:"text-green-400 hover:text-green-300",children:q.jsxDEV(t,{className:"w-4 h-4"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),q.jsxDEV("div",{children:[q.jsxDEV("div",{className:"mb-6",children:[q.jsxDEV("h1",{className:"text-2xl font-semibold mb-1",children:"AI Providers"},void 0,!1,void 0,this),q.jsxDEV("p",{className:"text-[var(--color-text-muted)]",children:["Manage your API keys for AI providers. ",l," of ",$.length," configured."]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),q.jsxDEV("div",{className:"grid gap-4 md:grid-cols-2 lg:grid-cols-3",children:$.map((_)=>q.jsxDEV(Lq,{provider:_,isEditing:Q===_.id,apiKey:U,saving:I,testing:B,error:Q===_.id?M:null,success:Q===_.id?A:null,onStartEdit:()=>{N(_.id),Y(null),w(null)},onCancelEdit:()=>{N(null),O(""),Y(null)},onApiKeyChange:O,onSave:S,onDelete:()=>P(_.id)},_.id,!1,void 0,this))},void 0,!1,void 0,this)]},void 0,!0,void 0,this),q.jsxDEV("div",{children:[q.jsxDEV("div",{className:"mb-6",children:[q.jsxDEV("h2",{className:"text-xl font-semibold mb-1",children:"MCP Integrations"},void 0,!1,void 0,this),q.jsxDEV("p",{className:"text-[var(--color-text-muted)]",children:["Connect to MCP gateways for tool integrations. ",g," of ",X.length," configured."]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),q.jsxDEV("div",{className:"grid gap-4 md:grid-cols-2 lg:grid-cols-3",children:X.map((_)=>q.jsxDEV(Hq,{provider:_,isEditing:Q===_.id,apiKey:U,saving:I,testing:B,error:Q===_.id?M:null,success:Q===_.id?A:null,onStartEdit:()=>{N(_.id),Y(null),w(null)},onCancelEdit:()=>{N(null),O(""),Y(null)},onApiKeyChange:O,onSave:S,onDelete:()=>P(_.id),projectsEnabled:J,projects:Z,onRefresh:y},_.id,!1,void 0,this))},void 0,!1,void 0,this)]},void 0,!0,void 0,this),q.jsxDEV("div",{children:[q.jsxDEV("div",{className:"mb-6",children:[q.jsxDEV("h2",{className:"text-xl font-semibold mb-1",children:"Browser Providers"},void 0,!1,void 0,this),q.jsxDEV("p",{className:"text-[var(--color-text-muted)]",children:["Configure browser environments for operator mode (computer use). ",d," of ",K.length," configured."]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),q.jsxDEV("div",{className:"grid gap-4 md:grid-cols-2 lg:grid-cols-3",children:K.map((_)=>q.jsxDEV(Hq,{provider:_,isEditing:Q===_.id,apiKey:U,saving:I,testing:B,error:Q===_.id?M:null,success:Q===_.id?A:null,onStartEdit:()=>{N(_.id),Y(null),w(null)},onCancelEdit:()=>{N(null),O(""),Y(null)},onApiKeyChange:O,onSave:S,onDelete:()=>P(_.id),projectsEnabled:J,projects:Z,onRefresh:y},_.id,!1,void 0,this))},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)}var a=["#f97316","#6366f1","#22c55e","#ef4444","#3b82f6","#a855f7","#14b8a6","#f59e0b"];function Wq(){let{projects:z,createProject:Z,updateProject:J,deleteProject:L}=i(),[T,Q]=H.useState(!1),[N,U]=H.useState(null),{confirm:O,ConfirmDialog:W}=n(),F=async(G)=>{if(!await O("Are you sure you want to delete this project? Agents in this project will become unassigned.",{confirmText:"Delete",title:"Delete Project"}))return;await L(G)},I=()=>{U(null),Q(!0)},R=(G)=>{U(G),Q(!0)},B=()=>{Q(!1),U(null)};return q.jsxDEV(q.Fragment,{children:[W,q.jsxDEV("div",{className:"max-w-4xl w-full",children:[q.jsxDEV("div",{className:"mb-6 flex items-center justify-between gap-4",children:[q.jsxDEV("div",{children:[q.jsxDEV("h1",{className:"text-2xl font-semibold mb-1",children:"Projects"},void 0,!1,void 0,this),q.jsxDEV("p",{className:"text-[var(--color-text-muted)]",children:"Organize agents into projects for better management."},void 0,!1,void 0,this)]},void 0,!0,void 0,this),q.jsxDEV("button",{onClick:I,className:"flex items-center gap-2 bg-[var(--color-accent)] hover:bg-[var(--color-accent-hover)] text-black px-4 py-2 rounded font-medium transition flex-shrink-0",children:[q.jsxDEV(o,{className:"w-4 h-4"},void 0,!1,void 0,this),"New Project"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),z.length===0?q.jsxDEV("div",{className:"text-center py-12 text-[var(--color-text-muted)]",children:[q.jsxDEV("p",{className:"text-lg mb-2",children:"No projects yet"},void 0,!1,void 0,this),q.jsxDEV("p",{className:"text-sm",children:"Create a project to organize your agents."},void 0,!1,void 0,this)]},void 0,!0,void 0,this):q.jsxDEV("div",{className:"space-y-3",children:z.map((G)=>q.jsxDEV("div",{className:"bg-[var(--color-surface)] card p-4 flex items-center gap-4",children:[q.jsxDEV("div",{className:"w-4 h-4 rounded-full flex-shrink-0",style:{backgroundColor:G.color}},void 0,!1,void 0,this),q.jsxDEV("div",{className:"flex-1 min-w-0",children:[q.jsxDEV("h3",{className:"font-medium",children:G.name},void 0,!1,void 0,this),G.description&&q.jsxDEV("p",{className:"text-sm text-[var(--color-text-muted)] truncate",children:G.description},void 0,!1,void 0,this),q.jsxDEV("p",{className:"text-xs text-[var(--color-text-muted)] mt-1",children:[G.agentCount," agent",G.agentCount!==1?"s":""]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),q.jsxDEV("div",{className:"flex items-center gap-2",children:[q.jsxDEV("button",{onClick:()=>R(G),className:"text-sm text-[var(--color-text-secondary)] hover:text-[var(--color-text)] px-2 py-1",children:"Edit"},void 0,!1,void 0,this),q.jsxDEV("button",{onClick:()=>F(G.id),className:"text-sm text-red-400 hover:text-red-300 px-2 py-1",children:"Delete"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},G.id,!0,void 0,this))},void 0,!1,void 0,this),T&&q.jsxDEV(_q,{project:N,onSave:async(G)=>{if(N){let M=await J(N.id,G);if(M)B();return!!M}else{let M=await Z(G);if(M)B();return!!M}},onClose:B},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)}function _q({project:z,onSave:Z,onClose:J}){let[L,T]=H.useState(z?.name||""),[Q,N]=H.useState(z?.description||""),[U,O]=H.useState(z?.color||a[Math.floor(Math.random()*a.length)]),[W,F]=H.useState(!1),[I,R]=H.useState(null),B=async()=>{if(!L.trim()){R("Name is required");return}F(!0),R(null);let G=await Z({name:L,description:Q||void 0,color:U});if(F(!1),!G)R(z?"Failed to update project":"Failed to create project")};return q.jsxDEV(Xq,{onClose:J,children:[q.jsxDEV("h2",{className:"text-xl font-semibold mb-6",children:z?"Edit Project":"Create New Project"},void 0,!1,void 0,this),q.jsxDEV("div",{className:"space-y-4",children:[q.jsxDEV("div",{children:[q.jsxDEV("label",{className:"block text-sm text-[var(--color-text-muted)] mb-1",children:"Name"},void 0,!1,void 0,this),q.jsxDEV("input",{type:"text",value:L,onChange:(G)=>T(G.target.value),className:"w-full bg-[var(--color-bg)] border border-[var(--color-border-light)] rounded px-3 py-2 focus:outline-none focus:border-[var(--color-accent)]",placeholder:"My Project",autoFocus:!0},void 0,!1,void 0,this)]},void 0,!0,void 0,this),q.jsxDEV("div",{children:[q.jsxDEV("label",{className:"block text-sm text-[var(--color-text-muted)] mb-1",children:"Description (optional)"},void 0,!1,void 0,this),q.jsxDEV("input",{type:"text",value:Q,onChange:(G)=>N(G.target.value),className:"w-full bg-[var(--color-bg)] border border-[var(--color-border-light)] rounded px-3 py-2 focus:outline-none focus:border-[var(--color-accent)]",placeholder:"A short description"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),q.jsxDEV("div",{children:[q.jsxDEV("label",{className:"block text-sm text-[var(--color-text-muted)] mb-1",children:"Color"},void 0,!1,void 0,this),q.jsxDEV("div",{className:"flex gap-3 flex-wrap",children:a.map((G)=>q.jsxDEV("button",{type:"button",onClick:()=>O(G),className:`w-10 h-10 rounded-full transition ${U===G?"ring-2 ring-white ring-offset-2 ring-offset-[#111]":"hover:scale-110"}`,style:{backgroundColor:G}},G,!1,void 0,this))},void 0,!1,void 0,this)]},void 0,!0,void 0,this),I&&q.jsxDEV("p",{className:"text-red-400 text-sm",children:I},void 0,!1,void 0,this)]},void 0,!0,void 0,this),q.jsxDEV("div",{className:"flex gap-3 mt-6",children:[q.jsxDEV("button",{onClick:J,className:"flex-1 border border-[var(--color-border-light)] hover:border-[var(--color-accent)] hover:text-[var(--color-accent)] px-4 py-2 rounded font-medium transition",children:"Cancel"},void 0,!1,void 0,this),q.jsxDEV("button",{onClick:B,disabled:W||!L.trim(),className:"flex-1 bg-[var(--color-accent)] hover:bg-[var(--color-accent-hover)] disabled:opacity-50 text-black px-4 py-2 rounded font-medium transition",children:W?"Saving...":z?"Update":"Create"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)}function Bq(){let{authFetch:z}=V(),[Z,J]=H.useState(null),[L,T]=H.useState(!1),[Q,N]=H.useState(!1),[U,O]=H.useState(null),[W,F]=H.useState(null),[I,R]=H.useState(null),B=async()=>{T(!0),O(null);try{let A=await z("/api/version");if(!A.ok)throw Error("Failed to check for updates");let w=await A.json();J(w)}catch(A){O("Failed to check for updates")}T(!1)},G=async()=>{N(!0),O(null),F(null);try{let w=await(await z("/api/version/update",{method:"POST"})).json();if(!w.success)O(w.error||"Update failed");else{let C=w.restarted?.length||0,k=C>0?` ${C} running agent${C>1?"s":""} restarted.`:"";F(`Agent binary updated to v${w.version}.${k}`),await B()}}catch(A){O("Failed to update agent")}N(!1)};H.useEffect(()=>{B()},[]);let M=(A,w)=>{navigator.clipboard.writeText(A),R(w),setTimeout(()=>R(null),2000)},Y=Z?.apteva.updateAvailable||Z?.agent.updateAvailable;return q.jsxDEV("div",{className:"max-w-4xl w-full",children:[q.jsxDEV("div",{className:"mb-6",children:[q.jsxDEV("h1",{className:"text-2xl font-semibold mb-1",children:"Updates"},void 0,!1,void 0,this),q.jsxDEV("p",{className:"text-[var(--color-text-muted)]",children:"Check for new versions of apteva and the agent binary."},void 0,!1,void 0,this)]},void 0,!0,void 0,this),L&&!Z?q.jsxDEV("div",{className:"text-[var(--color-text-muted)]",children:"Checking version info..."},void 0,!1,void 0,this):U&&!Z?q.jsxDEV("div",{className:"text-red-400",children:U},void 0,!1,void 0,this):Z?.isDocker?q.jsxDEV("div",{className:"space-y-6",children:[q.jsxDEV("div",{className:"bg-blue-500/10 border border-blue-500/30 rounded-lg p-4",children:[q.jsxDEV("div",{className:"flex items-center gap-2 text-blue-400 mb-2",children:[q.jsxDEV("svg",{className:"w-5 h-5",fill:"currentColor",viewBox:"0 0 24 24",children:q.jsxDEV("path",{d:"M13.983 11.078h2.119a.186.186 0 00.186-.185V9.006a.186.186 0 00-.186-.186h-2.119a.185.185 0 00-.185.185v1.888c0 .102.083.185.185.185m-2.954-5.43h2.118a.186.186 0 00.186-.186V3.574a.186.186 0 00-.186-.185h-2.118a.185.185 0 00-.185.185v1.888c0 .102.082.185.185.185m0 2.716h2.118a.187.187 0 00.186-.186V6.29a.186.186 0 00-.186-.185h-2.118a.185.185 0 00-.185.185v1.887c0 .102.082.186.185.186m-2.93 0h2.12a.186.186 0 00.184-.186V6.29a.185.185 0 00-.185-.185H8.1a.185.185 0 00-.185.185v1.887c0 .102.083.186.185.186m-2.964 0h2.119a.186.186 0 00.185-.186V6.29a.186.186 0 00-.185-.185H5.136a.186.186 0 00-.186.185v1.887c0 .102.084.186.186.186m5.893 2.715h2.118a.186.186 0 00.186-.185V9.006a.186.186 0 00-.186-.186h-2.118a.185.185 0 00-.185.185v1.888c0 .102.082.185.185.185m-2.93 0h2.12a.185.185 0 00.184-.185V9.006a.185.185 0 00-.184-.186h-2.12a.185.185 0 00-.184.185v1.888c0 .102.083.185.185.185m-2.964 0h2.119a.185.185 0 00.185-.185V9.006a.185.185 0 00-.185-.186H5.136a.186.186 0 00-.186.186v1.887c0 .102.084.185.186.185m-2.92 0h2.12a.185.185 0 00.184-.185V9.006a.185.185 0 00-.184-.186h-2.12a.186.186 0 00-.186.186v1.887c0 .102.084.185.186.185M23.763 9.89c-.065-.051-.672-.51-1.954-.51-.338.001-.676.03-1.01.087-.248-1.7-1.653-2.53-1.716-2.566l-.344-.199-.226.327c-.284.438-.49.922-.612 1.43-.23.97-.09 1.882.403 2.661-.595.332-1.55.413-1.744.42H.751a.751.751 0 00-.75.748 11.376 11.376 0 00.692 4.062c.545 1.428 1.355 2.48 2.41 3.124 1.18.723 3.1 1.137 5.275 1.137.983.003 1.963-.086 2.93-.266a12.248 12.248 0 003.823-1.389c.98-.567 1.86-1.288 2.61-2.136 1.252-1.418 1.998-2.997 2.553-4.4h.221c1.372 0 2.215-.549 2.68-1.009.309-.293.55-.65.707-1.046l.098-.288Z"},void 0,!1,void 0,this)},void 0,!1,void 0,this),q.jsxDEV("span",{className:"font-medium",children:"Docker Environment"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),q.jsxDEV("p",{className:"text-sm text-[var(--color-text-secondary)]",children:"Updates are automatic when you pull a new image version."},void 0,!1,void 0,this)]},void 0,!0,void 0,this),q.jsxDEV("div",{className:"bg-[var(--color-surface)] card p-5",children:[q.jsxDEV("div",{className:"flex items-center justify-between mb-4",children:[q.jsxDEV("div",{children:[q.jsxDEV("h3",{className:"font-medium text-lg",children:"Current Version"},void 0,!1,void 0,this),q.jsxDEV("p",{className:"text-sm text-[var(--color-text-muted)]",children:"apteva + agent binary"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),q.jsxDEV("div",{className:"text-right",children:q.jsxDEV("div",{className:"text-xl font-mono",children:["v",Z.apteva.installed||"?"]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),Y?q.jsxDEV("div",{className:"bg-[var(--color-accent-10)] border border-[var(--color-accent-30)] rounded-lg p-4",children:[q.jsxDEV("p",{className:"text-sm text-[var(--color-text-secondary)] mb-3",children:["A newer version (v",Z.apteva.latest,") is available. To update:"]},void 0,!0,void 0,this),q.jsxDEV("div",{className:"space-y-2",children:[q.jsxDEV("code",{className:"block bg-[var(--color-bg)] px-3 py-2 rounded font-mono text-sm text-[var(--color-text-secondary)]",children:"docker pull apteva/apteva:latest"},void 0,!1,void 0,this),q.jsxDEV("code",{className:"block bg-[var(--color-bg)] px-3 py-2 rounded font-mono text-sm text-[var(--color-text-secondary)]",children:"docker compose up -d"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),q.jsxDEV("button",{onClick:()=>{navigator.clipboard.writeText("docker pull apteva/apteva:latest && docker compose up -d"),R("docker"),setTimeout(()=>R(null),2000)},className:"mt-3 px-3 py-1.5 bg-[var(--color-surface-raised)] hover:bg-[var(--color-surface-raised)] rounded text-sm",children:I==="docker"?"Copied!":"Copy commands"},void 0,!1,void 0,this)]},void 0,!0,void 0,this):q.jsxDEV("div",{className:"flex items-center gap-2 text-green-400 text-sm",children:[q.jsxDEV(p,{className:"w-4 h-4"},void 0,!1,void 0,this),"Up to date"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),q.jsxDEV("p",{className:"text-xs text-[var(--color-text-faint)]",children:"Your data is stored in a Docker volume and persists across updates."},void 0,!1,void 0,this)]},void 0,!0,void 0,this):Z?q.jsxDEV("div",{className:"space-y-6",children:[W&&q.jsxDEV("div",{className:"bg-green-500/10 border border-green-500/30 rounded-lg p-4 text-green-400",children:W},void 0,!1,void 0,this),U&&q.jsxDEV("div",{className:"bg-red-500/10 border border-red-500/30 rounded-lg p-4 text-red-400",children:U},void 0,!1,void 0,this),q.jsxDEV("div",{className:"bg-[var(--color-surface)] card p-5",children:[q.jsxDEV("div",{className:"flex items-center justify-between mb-4",children:[q.jsxDEV("div",{children:[q.jsxDEV("h3",{className:"font-medium text-lg",children:"apteva"},void 0,!1,void 0,this),q.jsxDEV("p",{className:"text-sm text-[var(--color-text-muted)]",children:"The app you're running"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),q.jsxDEV("div",{className:"text-right",children:[q.jsxDEV("div",{className:"text-xl font-mono",children:["v",Z.apteva.installed||"?"]},void 0,!0,void 0,this),Z.apteva.updateAvailable&&q.jsxDEV("div",{className:"text-sm text-[var(--color-accent)]",children:["→ v",Z.apteva.latest]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),Z.apteva.updateAvailable?q.jsxDEV("div",{className:"bg-[var(--color-accent-10)] border border-[var(--color-accent-30)] rounded-lg p-4",children:[q.jsxDEV("p",{className:"text-sm text-[var(--color-text-secondary)] mb-3",children:"Update by running:"},void 0,!1,void 0,this),q.jsxDEV("div",{className:"flex items-center gap-2",children:[q.jsxDEV("code",{className:"flex-1 bg-[var(--color-bg)] px-3 py-2 rounded font-mono text-sm text-[var(--color-text-secondary)]",children:"npx apteva@latest"},void 0,!1,void 0,this),q.jsxDEV("button",{onClick:()=>M("npx apteva@latest","apteva"),className:"px-3 py-2 bg-[var(--color-surface-raised)] hover:bg-[var(--color-surface-raised)] rounded text-sm",children:I==="apteva"?"Copied!":"Copy"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this):q.jsxDEV("div",{className:"flex items-center gap-2 text-green-400 text-sm",children:[q.jsxDEV(p,{className:"w-4 h-4"},void 0,!1,void 0,this),"Up to date"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),q.jsxDEV("div",{className:"bg-[var(--color-surface)] card p-5",children:[q.jsxDEV("div",{className:"flex items-center justify-between mb-4",children:[q.jsxDEV("div",{children:[q.jsxDEV("h3",{className:"font-medium text-lg",children:"Agent Binary"},void 0,!1,void 0,this),q.jsxDEV("p",{className:"text-sm text-[var(--color-text-muted)]",children:"The Go binary that runs agents"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),q.jsxDEV("div",{className:"text-right",children:[q.jsxDEV("div",{className:"text-xl font-mono",children:["v",Z.agent.installed||"?"]},void 0,!0,void 0,this),Z.agent.updateAvailable&&q.jsxDEV("div",{className:"text-sm text-[var(--color-accent)]",children:["→ v",Z.agent.latest]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),Z.agent.updateAvailable?q.jsxDEV("div",{className:"bg-[var(--color-accent-10)] border border-[var(--color-accent-30)] rounded-lg p-4",children:[q.jsxDEV("p",{className:"text-sm text-[var(--color-text-secondary)] mb-3",children:"A new version is available. Stop all agents before updating."},void 0,!1,void 0,this),q.jsxDEV("div",{className:"flex items-center gap-2",children:q.jsxDEV("button",{onClick:G,disabled:Q,className:"px-4 py-2 bg-[var(--color-accent)] text-black rounded font-medium text-sm disabled:opacity-50",children:Q?"Updating...":"Update Agent"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this):q.jsxDEV("div",{className:"flex items-center gap-2 text-green-400 text-sm",children:[q.jsxDEV(p,{className:"w-4 h-4"},void 0,!1,void 0,this),"Up to date"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),!Y&&!W&&q.jsxDEV("div",{className:"bg-green-500/10 border border-green-500/30 rounded-lg p-4 flex items-center gap-2 text-green-400",children:[q.jsxDEV(p,{className:"w-5 h-5"},void 0,!1,void 0,this),"Everything is up to date!"]},void 0,!0,void 0,this),q.jsxDEV("button",{onClick:B,disabled:L,className:"text-sm text-[var(--color-text-muted)] hover:text-[var(--color-text-secondary)] disabled:opacity-50",children:L?"Checking...":"Check for updates"},void 0,!1,void 0,this)]},void 0,!0,void 0,this):null]},void 0,!0,void 0,this)}function Lq({provider:z,isEditing:Z,apiKey:J,saving:L,testing:T,error:Q,success:N,onStartEdit:U,onCancelEdit:O,onApiKeyChange:W,onSave:F,onDelete:I,extraField:R,onExtraFieldChange:B}){let{authFetch:G}=V(),M=z.id==="ollama",Y=z.id==="cdp",A=M||Y,w=z.type==="browser",C=z.id==="browserbase",[k,y]=H.default.useState(null),[S,P]=H.default.useState(!1),[$,X]=H.default.useState(null),K=H.default.useCallback(()=>{G("/api/providers/ollama/status").then((g)=>g.json()).then((g)=>y({connected:g.connected,modelCount:g.modelCount,isDocker:g.isDocker})).catch(()=>y({connected:!1}))},[G]);H.default.useEffect(()=>{if(M)K()},[M,z.hasKey,K]);let l=async()=>{P(!0),X(null);try{let d=await(await G("/api/providers/ollama/install",{method:"POST"})).json();if(d.success)X({success:!0,message:d.message}),K();else X({success:!1,message:d.error||"Installation failed"})}catch{X({success:!1,message:"Failed to connect to server"})}finally{P(!1)}};return q.jsxDEV("div",{className:`bg-[var(--color-surface)] border rounded-lg p-4 ${z.hasKey?"border-green-500/20":"border-[var(--color-border)]"}`,children:[q.jsxDEV("div",{className:"flex items-start justify-between gap-2 mb-2",children:[q.jsxDEV("div",{className:"min-w-0",children:[q.jsxDEV("h3",{className:"font-medium",children:z.name},void 0,!1,void 0,this),q.jsxDEV("p",{className:"text-sm text-[var(--color-text-muted)] truncate",children:w?z.description||"Browser automation":z.type==="integration"?z.description||"MCP integration":M?"Run models locally":`${z.models.length} models`},void 0,!1,void 0,this)]},void 0,!0,void 0,this),z.hasKey?q.jsxDEV("span",{className:`text-xs flex items-center gap-1 px-2 py-1 rounded whitespace-nowrap flex-shrink-0 ${M&&k?k.connected?"text-green-400 bg-green-500/10":"text-yellow-400 bg-yellow-500/10":"text-green-400 bg-green-500/10"}`,children:M&&k?k.connected?q.jsxDEV(q.Fragment,{children:[q.jsxDEV(p,{className:"w-3 h-3"},void 0,!1,void 0,this),k.modelCount," models"]},void 0,!0,void 0,this):q.jsxDEV(q.Fragment,{children:"Not running"},void 0,!1,void 0,this):A?q.jsxDEV(q.Fragment,{children:[q.jsxDEV(p,{className:"w-3 h-3"},void 0,!1,void 0,this),"Configured"]},void 0,!0,void 0,this):q.jsxDEV(q.Fragment,{children:[q.jsxDEV(p,{className:"w-3 h-3"},void 0,!1,void 0,this),z.keyHint]},void 0,!0,void 0,this)},void 0,!1,void 0,this):q.jsxDEV("span",{className:"text-[var(--color-text-muted)] text-xs bg-[var(--color-surface-raised)] px-2 py-1 rounded whitespace-nowrap flex-shrink-0",children:"Not configured"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),q.jsxDEV("div",{className:"mt-3 pt-3 border-t border-[var(--color-border)]",children:Z?q.jsxDEV("div",{className:"space-y-3",children:[C?q.jsxDEV(q.Fragment,{children:[q.jsxDEV("div",{children:[q.jsxDEV("label",{className:"block text-xs text-[var(--color-text-secondary)] mb-1",children:"API Key"},void 0,!1,void 0,this),q.jsxDEV("input",{type:"password",value:J,onChange:(g)=>W(g.target.value),placeholder:z.hasKey?"Enter new API key...":"Enter API key...",autoFocus:!0,className:"w-full bg-[var(--color-bg)] border border-[var(--color-border-light)] rounded px-3 py-2 focus:outline-none focus:border-[var(--color-accent)]"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),q.jsxDEV("div",{children:[q.jsxDEV("label",{className:"block text-xs text-[var(--color-text-secondary)] mb-1",children:"Project ID"},void 0,!1,void 0,this),q.jsxDEV("input",{type:"text",value:R||"",onChange:(g)=>B?.(g.target.value),placeholder:"Enter your Browserbase project ID...",className:"w-full bg-[var(--color-bg)] border border-[var(--color-border-light)] rounded px-3 py-2 focus:outline-none focus:border-[var(--color-accent)]"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this):q.jsxDEV("input",{type:A?"text":"password",value:J,onChange:(g)=>W(g.target.value),placeholder:M?"http://localhost:11434":Y?"ws://localhost:9222":z.hasKey?"Enter new API key...":"Enter API key...",autoFocus:!0,className:"w-full bg-[var(--color-bg)] border border-[var(--color-border-light)] rounded px-3 py-2 focus:outline-none focus:border-[var(--color-accent)]"},void 0,!1,void 0,this),A&&q.jsxDEV("p",{className:"text-xs text-[var(--color-text-muted)]",children:Y?"Enter the CDP URL of your browser (e.g., ws://localhost:9222)":"Enter your Ollama server URL. Default is http://localhost:11434"},void 0,!1,void 0,this),Q&&q.jsxDEV("p",{className:"text-red-400 text-sm",children:Q},void 0,!1,void 0,this),N&&q.jsxDEV("p",{className:"text-green-400 text-sm",children:N},void 0,!1,void 0,this),q.jsxDEV("div",{className:"flex gap-2",children:[q.jsxDEV("button",{onClick:O,className:"flex-1 px-3 py-1.5 border border-[var(--color-border-light)] rounded text-sm hover:border-[var(--color-text-muted)]",children:"Cancel"},void 0,!1,void 0,this),q.jsxDEV("button",{onClick:F,disabled:!J||L,className:"flex-1 px-3 py-1.5 bg-[var(--color-accent)] text-black rounded text-sm font-medium disabled:opacity-50",children:T?"Validating...":L?"Saving...":A?"Connect":"Save"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this):z.hasKey?q.jsxDEV("div",{children:[M&&k&&!k.connected&&!k.isDocker&&q.jsxDEV("div",{className:"mb-3",children:[q.jsxDEV("button",{onClick:l,disabled:S,className:"w-full px-3 py-1.5 bg-yellow-500/20 text-yellow-400 hover:bg-yellow-500/30 rounded text-sm font-medium transition disabled:opacity-50 disabled:cursor-wait",children:S?"Starting Ollama...":"Start Ollama"},void 0,!1,void 0,this),$&&q.jsxDEV("p",{className:`text-xs mt-1.5 ${$.success?"text-green-400":"text-red-400"}`,children:$.message},void 0,!1,void 0,this)]},void 0,!0,void 0,this),q.jsxDEV("div",{className:"flex items-center justify-between",children:[z.docsUrl?q.jsxDEV("a",{href:z.docsUrl,target:"_blank",rel:"noopener noreferrer",className:"text-sm text-[#3b82f6] hover:underline",children:M?"Ollama docs":"View docs"},void 0,!1,void 0,this):q.jsxDEV("span",{},void 0,!1,void 0,this),q.jsxDEV("div",{className:"flex items-center gap-3",children:[q.jsxDEV("button",{onClick:U,className:"text-sm text-[var(--color-text-secondary)] hover:text-[var(--color-text)]",children:A?"Change URL":"Update key"},void 0,!1,void 0,this),q.jsxDEV("button",{onClick:I,className:"text-red-400 hover:text-red-300 text-sm",children:"Remove"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this):q.jsxDEV("div",{children:[M&&!k?.isDocker&&q.jsxDEV("div",{className:"mb-3",children:[q.jsxDEV("button",{onClick:l,disabled:S,className:"w-full px-3 py-2 bg-[#3b82f6]/20 text-[#3b82f6] hover:bg-[#3b82f6]/30 rounded text-sm font-medium transition disabled:opacity-50 disabled:cursor-wait",children:S?"Installing Ollama...":k?.connected?"Ollama Running":"Install Ollama"},void 0,!1,void 0,this),$&&q.jsxDEV("p",{className:`text-xs mt-1.5 ${$.success?"text-green-400":"text-red-400"}`,children:$.message},void 0,!1,void 0,this)]},void 0,!0,void 0,this),q.jsxDEV("div",{className:"flex items-center justify-between",children:[z.docsUrl?q.jsxDEV("a",{href:z.docsUrl,target:"_blank",rel:"noopener noreferrer",className:"text-sm text-[#3b82f6] hover:underline",children:M?"Manual install":w?"View docs":"Get API key"},void 0,!1,void 0,this):q.jsxDEV("span",{},void 0,!1,void 0,this),q.jsxDEV("button",{onClick:U,className:"text-sm text-[var(--color-accent)] hover:text-[var(--color-accent-hover)]",children:A?"Configure":"+ Add key"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}function Hq({provider:z,isEditing:Z,apiKey:J,saving:L,testing:T,error:Q,success:N,onStartEdit:U,onCancelEdit:O,onApiKeyChange:W,onSave:F,onDelete:I,projectsEnabled:R,projects:B,onRefresh:G}){let{authFetch:M}=V(),[Y,A]=H.useState([]),[w,C]=H.useState(""),[k,y]=H.useState(!1),[S,P]=H.useState(null),[$,X]=H.useState(!1),[K,l]=H.useState(""),{confirm:g,ConfirmDialog:d}=n(),_=z.id==="browserbase",f=async()=>{try{let v=await(await M(`/api/keys/${z.id}`)).json();A(v.keys||[])}catch(b){console.error("Failed to fetch keys:",b)}};H.useEffect(()=>{if(R)f()},[z.id,R]),H.useEffect(()=>{if(Z)P(null)},[Z]);let u=async()=>{if(!J)return;X(!0),P(null);let b=J;if(_&&K)b=JSON.stringify({api_key:J,project_id:K});try{let v=await M(`/api/keys/${z.id}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({key:b,project_id:w||null})}),qq=await v.json();if(v.ok)W(""),l(""),C(""),O(),f(),G();else P(qq.error||"Failed to save key")}catch(v){console.error("Failed to save key:",v),P("Failed to save key")}X(!1)},c=async(b,v)=>{if(!await g(`Are you sure you want to remove this API key${v?` (${v})`:""}?`,{confirmText:"Remove",title:"Remove API Key"}))return;try{await M(`/api/keys/by-id/${b}`,{method:"DELETE"}),f(),G()}catch(Yq){console.error("Failed to delete key:",Yq)}},h=Y.find((b)=>!b.project_id),x=Y.filter((b)=>b.project_id),m=(b)=>B.find((v)=>v.id===b)?.name||"Unknown",j=(b)=>B.find((v)=>v.id===b)?.color||"#666";if(!R)return q.jsxDEV("div",{className:`bg-[var(--color-surface)] border rounded-lg p-4 ${z.hasKey?"border-[var(--color-accent-20)]":"border-[var(--color-border)]"}`,children:[q.jsxDEV("div",{className:"flex items-center justify-between mb-2",children:[q.jsxDEV("div",{children:[q.jsxDEV("h3",{className:"font-medium",children:z.name},void 0,!1,void 0,this),q.jsxDEV("p",{className:"text-sm text-[var(--color-text-muted)]",children:z.description||"MCP integration"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),z.hasKey?q.jsxDEV("span",{className:"text-[var(--color-accent)] text-xs flex items-center gap-1 bg-[var(--color-accent-10)] px-2 py-1 rounded",children:[q.jsxDEV(p,{className:"w-3 h-3"},void 0,!1,void 0,this),z.keyHint]},void 0,!0,void 0,this):q.jsxDEV("span",{className:"text-[var(--color-text-muted)] text-xs bg-[var(--color-surface-raised)] px-2 py-1 rounded",children:"Not configured"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),q.jsxDEV("div",{className:"mt-3 pt-3 border-t border-[var(--color-border)]",children:Z?q.jsxDEV("div",{className:"space-y-3",children:[q.jsxDEV("input",{type:s,value:J,onChange:(b)=>W(b.target.value),placeholder:z.hasKey?`Enter new ${D?"URL":"API key"}...`:e,autoFocus:!0,className:"w-full bg-[var(--color-bg)] border border-[var(--color-border-light)] rounded px-3 py-2 focus:outline-none focus:border-[var(--color-accent)]"},void 0,!1,void 0,this),Q&&q.jsxDEV("p",{className:"text-red-400 text-sm",children:Q},void 0,!1,void 0,this),N&&q.jsxDEV("p",{className:"text-green-400 text-sm",children:N},void 0,!1,void 0,this),q.jsxDEV("div",{className:"flex gap-2",children:[q.jsxDEV("button",{onClick:O,className:"flex-1 px-3 py-1.5 border border-[var(--color-border-light)] rounded text-sm hover:border-[var(--color-text-muted)]",children:"Cancel"},void 0,!1,void 0,this),q.jsxDEV("button",{onClick:F,disabled:!J||L,className:"flex-1 px-3 py-1.5 bg-[var(--color-accent)] text-black rounded text-sm font-medium disabled:opacity-50",children:T?"Validating...":L?"Saving...":"Save"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this):z.hasKey?q.jsxDEV("div",{className:"flex items-center justify-between",children:[q.jsxDEV("a",{href:z.docsUrl,target:"_blank",rel:"noopener noreferrer",className:"text-sm text-[#3b82f6] hover:underline",children:"View docs"},void 0,!1,void 0,this),q.jsxDEV("div",{className:"flex items-center gap-3",children:[q.jsxDEV("button",{onClick:U,className:"text-sm text-[var(--color-text-secondary)] hover:text-[var(--color-text)]",children:"Update key"},void 0,!1,void 0,this),q.jsxDEV("button",{onClick:I,className:"text-red-400 hover:text-red-300 text-sm",children:"Remove"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this):q.jsxDEV("div",{className:"flex items-center justify-between",children:[q.jsxDEV("a",{href:z.docsUrl,target:"_blank",rel:"noopener noreferrer",className:"text-sm text-[#3b82f6] hover:underline",children:"Get API key"},void 0,!1,void 0,this),q.jsxDEV("button",{onClick:U,className:"text-sm text-[var(--color-accent)] hover:text-[var(--color-accent-hover)]",children:"+ Add key"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this);let D=z.isLocal,s=D?"text":"password",e=D?z.id==="cdp"?"ws://localhost:9222":"http://localhost:11434":"Enter API key...";return q.jsxDEV(q.Fragment,{children:[d,q.jsxDEV("div",{className:`bg-[var(--color-surface)] border rounded-lg p-4 ${Y.length>0?"border-[var(--color-accent-20)]":"border-[var(--color-border)]"}`,children:[q.jsxDEV("div",{className:"flex items-center justify-between mb-2",children:[q.jsxDEV("div",{children:[q.jsxDEV("h3",{className:"font-medium",children:z.name},void 0,!1,void 0,this),q.jsxDEV("p",{className:"text-sm text-[var(--color-text-muted)]",children:z.description||"MCP integration"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),Y.length>0?q.jsxDEV("span",{className:"text-[var(--color-accent)] text-xs flex items-center gap-1 bg-[var(--color-accent-10)] px-2 py-1 rounded",children:[q.jsxDEV(p,{className:"w-3 h-3"},void 0,!1,void 0,this),Y.length," key",Y.length!==1?"s":""]},void 0,!0,void 0,this):q.jsxDEV("span",{className:"text-[var(--color-text-muted)] text-xs bg-[var(--color-surface-raised)] px-2 py-1 rounded",children:"Not configured"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),Y.length>0&&q.jsxDEV("div",{className:"mt-3 space-y-2",children:[h&&q.jsxDEV("div",{className:"flex items-center justify-between text-sm bg-[var(--color-bg)] rounded px-3 py-2",children:[q.jsxDEV("div",{className:"flex items-center gap-2",children:[q.jsxDEV("span",{className:"text-[var(--color-text-secondary)]",children:"Global"},void 0,!1,void 0,this),q.jsxDEV("span",{className:"text-[var(--color-text-faint)]",children:"·"},void 0,!1,void 0,this),q.jsxDEV("span",{className:"text-[var(--color-text-muted)] font-mono text-xs",children:h.key_hint},void 0,!1,void 0,this)]},void 0,!0,void 0,this),q.jsxDEV("button",{onClick:()=>c(h.id,"Global"),className:"text-red-400 hover:text-red-300 text-xs",children:"Remove"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),x.slice(0,k?void 0:2).map((b)=>q.jsxDEV("div",{className:"flex items-center justify-between text-sm bg-[var(--color-bg)] rounded px-3 py-2",children:[q.jsxDEV("div",{className:"flex items-center gap-2 min-w-0",children:[q.jsxDEV("span",{className:"w-2 h-2 rounded-full flex-shrink-0",style:{backgroundColor:j(b.project_id)}},void 0,!1,void 0,this),q.jsxDEV("span",{className:"text-[var(--color-text-secondary)] truncate",children:b.name||m(b.project_id)},void 0,!1,void 0,this),q.jsxDEV("span",{className:"text-[var(--color-text-faint)]",children:"·"},void 0,!1,void 0,this),q.jsxDEV("span",{className:"text-[var(--color-text-muted)] font-mono text-xs",children:b.key_hint},void 0,!1,void 0,this)]},void 0,!0,void 0,this),q.jsxDEV("button",{onClick:()=>c(b.id,b.name||m(b.project_id)),className:"text-red-400 hover:text-red-300 text-xs flex-shrink-0 ml-2",children:"Remove"},void 0,!1,void 0,this)]},b.id,!0,void 0,this)),x.length>2&&!k&&q.jsxDEV("button",{onClick:()=>y(!0),className:"text-xs text-[var(--color-text-muted)] hover:text-[var(--color-text-secondary)] w-full text-center py-1",children:["Show ",x.length-2," more..."]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),q.jsxDEV("div",{className:"mt-3 pt-3 border-t border-[var(--color-border)]",children:Z?q.jsxDEV("div",{className:"space-y-3",children:[q.jsxDEV("input",{type:s,value:J,onChange:(b)=>W(b.target.value),placeholder:e,autoFocus:!0,className:"w-full bg-[var(--color-bg)] border border-[var(--color-border-light)] rounded px-3 py-2 focus:outline-none focus:border-[var(--color-accent)]"},void 0,!1,void 0,this),_&&q.jsxDEV("input",{type:"text",value:K,onChange:(b)=>l(b.target.value),placeholder:"Browserbase Project ID (optional)",className:"w-full bg-[var(--color-bg)] border border-[var(--color-border-light)] rounded px-3 py-2 focus:outline-none focus:border-[var(--color-accent)] text-sm"},void 0,!1,void 0,this),q.jsxDEV(E,{value:w,onChange:C,placeholder:"Global (all projects)",options:[{value:"",label:"Global (all projects)"},...B.map((b)=>({value:b.id,label:b.name}))]},void 0,!1,void 0,this),S&&q.jsxDEV("p",{className:"text-red-400 text-sm",children:S},void 0,!1,void 0,this),q.jsxDEV("div",{className:"flex gap-2",children:[q.jsxDEV("button",{onClick:()=>{O(),C(""),P(null)},className:"flex-1 px-3 py-1.5 border border-[var(--color-border-light)] rounded text-sm hover:border-[var(--color-text-muted)]",children:"Cancel"},void 0,!1,void 0,this),q.jsxDEV("button",{onClick:u,disabled:!J||$,className:"flex-1 px-3 py-1.5 bg-[var(--color-accent)] text-black rounded text-sm font-medium disabled:opacity-50",children:$?"Saving...":"Save"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this):q.jsxDEV("div",{className:"flex items-center justify-between",children:[q.jsxDEV("a",{href:z.docsUrl,target:"_blank",rel:"noopener noreferrer",className:"text-sm text-[#3b82f6] hover:underline",children:Y.length>0?"View docs":"Get API key"},void 0,!1,void 0,this),q.jsxDEV("button",{onClick:U,className:"text-sm text-[var(--color-accent)] hover:text-[var(--color-accent-hover)]",children:"+ Add key"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)}function Nq(){let{authFetch:z}=V(),[Z,J]=H.useState([]),[L,T]=H.useState(!1),[Q,N]=H.useState(""),[U,O]=H.useState("90"),[W,F]=H.useState(!1),[I,R]=H.useState(null),[B,G]=H.useState(null),[M,Y]=H.useState(!1),{confirm:A,ConfirmDialog:w}=n(),C=async()=>{try{let K=await(await z("/api/keys/personal")).json();J(K.keys||[])}catch{}};H.useEffect(()=>{C()},[]);let k=async()=>{if(!Q.trim()){R("Name is required");return}F(!0),R(null);try{let X=await z("/api/keys/personal",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:Q.trim(),expires_in_days:U?parseInt(U):null})}),K=await X.json();if(!X.ok)R(K.error||"Failed to create key");else G(K.key),N(""),O("90"),C()}catch{R("Failed to create key")}F(!1)},y=async(X,K)=>{if(!await A(`Delete API key "${K}"? This cannot be undone.`,{confirmText:"Delete",title:"Delete API Key"}))return;try{await z(`/api/keys/personal/${X}`,{method:"DELETE"}),C()}catch{}},S=()=>{if(B)navigator.clipboard.writeText(B),Y(!0),setTimeout(()=>Y(!1),2000)},P=(X)=>{if(!X)return"Never";return new Date(X).toLocaleDateString(void 0,{year:"numeric",month:"short",day:"numeric"})},$=(X)=>{if(!X)return!1;return new Date(X)<new Date};return q.jsxDEV(q.Fragment,{children:[w,q.jsxDEV("div",{className:"max-w-4xl w-full",children:[q.jsxDEV("div",{className:"mb-6 flex items-center justify-between gap-4",children:[q.jsxDEV("div",{children:[q.jsxDEV("h1",{className:"text-2xl font-semibold mb-1",children:"API Keys"},void 0,!1,void 0,this),q.jsxDEV("p",{className:"text-[var(--color-text-muted)]",children:["Create personal API keys for programmatic access. Use them with the ",q.jsxDEV("code",{className:"text-[var(--color-text-secondary)] bg-[var(--color-surface-raised)] px-1 rounded text-xs",children:"X-API-Key"},void 0,!1,void 0,this)," header."]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),!L&&!B&&q.jsxDEV("button",{onClick:()=>{T(!0),R(null)},className:"flex items-center gap-2 bg-[var(--color-accent)] hover:bg-[var(--color-accent-hover)] text-black px-4 py-2 rounded font-medium transition flex-shrink-0",children:[q.jsxDEV(o,{className:"w-4 h-4"},void 0,!1,void 0,this),"New Key"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),B&&q.jsxDEV("div",{className:"bg-green-500/10 border border-green-500/30 rounded-lg p-4 mb-6",children:[q.jsxDEV("div",{className:"flex items-center gap-2 text-green-400 mb-2",children:[q.jsxDEV(p,{className:"w-5 h-5"},void 0,!1,void 0,this),q.jsxDEV("span",{className:"font-medium",children:"API key created"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),q.jsxDEV("p",{className:"text-sm text-[var(--color-text-secondary)] mb-3",children:"Copy this key now. You won't be able to see it again."},void 0,!1,void 0,this),q.jsxDEV("div",{className:"flex items-center gap-2",children:[q.jsxDEV("code",{className:"flex-1 bg-[var(--color-bg)] px-3 py-2 rounded font-mono text-sm text-[var(--color-text)] break-all select-all",children:B},void 0,!1,void 0,this),q.jsxDEV("button",{onClick:S,className:"px-3 py-2 bg-[var(--color-surface-raised)] hover:bg-[var(--color-surface-raised)] rounded text-sm flex-shrink-0",children:M?"Copied!":"Copy"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),q.jsxDEV("button",{onClick:()=>{G(null),T(!1)},className:"mt-3 text-sm text-[var(--color-text-muted)] hover:text-[var(--color-text-secondary)]",children:"Done"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),L&&!B&&q.jsxDEV("div",{className:"bg-[var(--color-surface)] card p-4 mb-6",children:[q.jsxDEV("h3",{className:"font-medium mb-4",children:"Create new API key"},void 0,!1,void 0,this),q.jsxDEV("div",{className:"space-y-4 max-w-md",children:[q.jsxDEV("div",{children:[q.jsxDEV("label",{className:"block text-sm text-[var(--color-text-muted)] mb-1",children:"Name"},void 0,!1,void 0,this),q.jsxDEV("input",{type:"text",value:Q,onChange:(X)=>N(X.target.value),placeholder:"e.g. CI Pipeline, My Script",autoFocus:!0,className:"w-full bg-[var(--color-bg)] border border-[var(--color-border-light)] rounded px-3 py-2 focus:outline-none focus:border-[var(--color-accent)]"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),q.jsxDEV("div",{children:[q.jsxDEV("label",{className:"block text-sm text-[var(--color-text-muted)] mb-1",children:"Expiration"},void 0,!1,void 0,this),q.jsxDEV("select",{value:U,onChange:(X)=>O(X.target.value),className:"w-full bg-[var(--color-bg)] border border-[var(--color-border-light)] rounded px-3 py-2 focus:outline-none focus:border-[var(--color-accent)]",children:[q.jsxDEV("option",{value:"30",children:"30 days"},void 0,!1,void 0,this),q.jsxDEV("option",{value:"90",children:"90 days"},void 0,!1,void 0,this),q.jsxDEV("option",{value:"180",children:"180 days"},void 0,!1,void 0,this),q.jsxDEV("option",{value:"365",children:"1 year"},void 0,!1,void 0,this),q.jsxDEV("option",{value:"",children:"No expiration"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),I&&q.jsxDEV("p",{className:"text-red-400 text-sm",children:I},void 0,!1,void 0,this),q.jsxDEV("div",{className:"flex gap-2",children:[q.jsxDEV("button",{onClick:()=>{T(!1),R(null),N("")},className:"flex-1 px-3 py-2 border border-[var(--color-border-light)] rounded text-sm hover:border-[var(--color-text-muted)]",children:"Cancel"},void 0,!1,void 0,this),q.jsxDEV("button",{onClick:k,disabled:W||!Q.trim(),className:"flex-1 px-3 py-2 bg-[var(--color-accent)] text-black rounded text-sm font-medium disabled:opacity-50",children:W?"Creating...":"Create Key"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),Z.length===0?q.jsxDEV("div",{className:"text-center py-12 text-[var(--color-text-muted)]",children:[q.jsxDEV("p",{className:"text-lg mb-2",children:"No API keys yet"},void 0,!1,void 0,this),q.jsxDEV("p",{className:"text-sm",children:"Create an API key to access apteva programmatically."},void 0,!1,void 0,this)]},void 0,!0,void 0,this):q.jsxDEV("div",{className:"space-y-3",children:Z.map((X)=>q.jsxDEV("div",{className:`bg-[var(--color-surface)] border rounded-lg p-4 flex items-center gap-4 ${!X.is_active||$(X.expires_at)?"border-[var(--color-border)] opacity-60":"border-[var(--color-border)]"}`,children:[q.jsxDEV("div",{className:"flex-1 min-w-0",children:[q.jsxDEV("div",{className:"flex items-center gap-2 mb-1",children:[q.jsxDEV("h3",{className:"font-medium",children:X.name},void 0,!1,void 0,this),!X.is_active&&q.jsxDEV("span",{className:"text-xs text-red-400 bg-red-500/10 px-2 py-0.5 rounded",children:"Revoked"},void 0,!1,void 0,this),X.is_active&&$(X.expires_at)&&q.jsxDEV("span",{className:"text-xs text-yellow-400 bg-yellow-500/10 px-2 py-0.5 rounded",children:"Expired"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),q.jsxDEV("div",{className:"flex items-center gap-3 text-sm text-[var(--color-text-muted)]",children:[q.jsxDEV("code",{className:"font-mono text-xs bg-[var(--color-bg)] px-2 py-0.5 rounded",children:[X.prefix,"..."]},void 0,!0,void 0,this),q.jsxDEV("span",{children:["Created ",P(X.created_at)]},void 0,!0,void 0,this),X.expires_at&&q.jsxDEV("span",{children:["Expires ",P(X.expires_at)]},void 0,!0,void 0,this),X.last_used_at&&q.jsxDEV("span",{children:["Last used ",P(X.last_used_at)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),X.is_active&&q.jsxDEV("button",{onClick:()=>y(X.id,X.name),className:"text-sm text-red-400 hover:text-red-300 px-2 py-1 flex-shrink-0",children:"Delete"},void 0,!1,void 0,this)]},X.id,!0,void 0,this))},void 0,!1,void 0,this),Z.length>0&&q.jsxDEV("div",{className:"mt-6 bg-[var(--color-surface)] card p-4",children:[q.jsxDEV("h3",{className:"font-medium mb-2 text-sm",children:"Usage"},void 0,!1,void 0,this),q.jsxDEV("code",{className:"block bg-[var(--color-bg)] px-3 py-2 rounded font-mono text-xs text-[var(--color-text-secondary)]",children:'curl -H "X-API-Key: apt_..." http://localhost:4280/api/agents'},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)}function Uq(){let{authFetch:z,user:Z}=V(),[J,L]=H.useState(""),[T,Q]=H.useState(""),[N,U]=H.useState(""),[O,W]=H.useState(!1),[F,I]=H.useState(null),R=async()=>{if(!J||!T||!N){I({type:"error",text:"All fields are required"});return}if(T!==N){I({type:"error",text:"New passwords do not match"});return}if(T.length<8){I({type:"error",text:"Password must be at least 8 characters"});return}W(!0),I(null);try{let B=await z("/api/auth/password",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({currentPassword:J,newPassword:T})}),G=await B.json();if(B.ok)I({type:"success",text:"Password updated successfully"}),L(""),Q(""),U("");else I({type:"error",text:G.error||"Failed to update password"})}catch{I({type:"error",text:"Failed to update password"})}W(!1)};return q.jsxDEV("div",{className:"max-w-4xl w-full",children:[q.jsxDEV("div",{className:"mb-6",children:[q.jsxDEV("h1",{className:"text-2xl font-semibold mb-1",children:"Account Settings"},void 0,!1,void 0,this),q.jsxDEV("p",{className:"text-[var(--color-text-muted)]",children:"Manage your account and security."},void 0,!1,void 0,this)]},void 0,!0,void 0,this),Z&&q.jsxDEV("div",{className:"bg-[var(--color-surface)] card p-4 mb-6",children:[q.jsxDEV("h3",{className:"font-medium mb-3",children:"Profile"},void 0,!1,void 0,this),q.jsxDEV("div",{className:"space-y-2 text-sm",children:[q.jsxDEV("div",{className:"flex justify-between",children:[q.jsxDEV("span",{className:"text-[var(--color-text-muted)]",children:"Username"},void 0,!1,void 0,this),q.jsxDEV("span",{children:Z.username},void 0,!1,void 0,this)]},void 0,!0,void 0,this),Z.email&&q.jsxDEV("div",{className:"flex justify-between",children:[q.jsxDEV("span",{className:"text-[var(--color-text-muted)]",children:"Email"},void 0,!1,void 0,this),q.jsxDEV("span",{children:Z.email},void 0,!1,void 0,this)]},void 0,!0,void 0,this),q.jsxDEV("div",{className:"flex justify-between",children:[q.jsxDEV("span",{className:"text-[var(--color-text-muted)]",children:"Role"},void 0,!1,void 0,this),q.jsxDEV("span",{className:"capitalize",children:Z.role},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),q.jsxDEV("div",{className:"bg-[var(--color-surface)] card p-4",children:[q.jsxDEV("h3",{className:"font-medium mb-4",children:"Change Password"},void 0,!1,void 0,this),q.jsxDEV("div",{className:"space-y-4 max-w-md",children:[q.jsxDEV("div",{children:[q.jsxDEV("label",{className:"block text-sm text-[var(--color-text-muted)] mb-1",children:"Current Password"},void 0,!1,void 0,this),q.jsxDEV("input",{type:"password",value:J,onChange:(B)=>L(B.target.value),className:"w-full bg-[var(--color-bg)] border border-[var(--color-border-light)] rounded px-3 py-2 focus:outline-none focus:border-[var(--color-accent)]"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),q.jsxDEV("div",{children:[q.jsxDEV("label",{className:"block text-sm text-[var(--color-text-muted)] mb-1",children:"New Password"},void 0,!1,void 0,this),q.jsxDEV("input",{type:"password",value:T,onChange:(B)=>Q(B.target.value),className:"w-full bg-[var(--color-bg)] border border-[var(--color-border-light)] rounded px-3 py-2 focus:outline-none focus:border-[var(--color-accent)]"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),q.jsxDEV("div",{children:[q.jsxDEV("label",{className:"block text-sm text-[var(--color-text-muted)] mb-1",children:"Confirm New Password"},void 0,!1,void 0,this),q.jsxDEV("input",{type:"password",value:N,onChange:(B)=>U(B.target.value),className:"w-full bg-[var(--color-bg)] border border-[var(--color-border-light)] rounded px-3 py-2 focus:outline-none focus:border-[var(--color-accent)]"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),F&&q.jsxDEV("div",{className:`p-3 rounded text-sm ${F.type==="success"?"bg-green-500/10 text-green-400 border border-green-500/30":"bg-red-500/10 text-red-400 border border-red-500/30"}`,children:F.text},void 0,!1,void 0,this),q.jsxDEV("button",{onClick:R,disabled:O||!J||!T||!N,className:"px-4 py-2 bg-[var(--color-accent)] hover:bg-[var(--color-accent-hover)] disabled:opacity-50 disabled:cursor-not-allowed text-black rounded text-sm font-medium transition",children:O?"Updating...":"Update Password"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)}function Rq(){let{authFetch:z}=V(),[Z,J]=H.useState(!1),[L,T]=H.useState(null),[Q,N]=H.useState(null),{confirm:U,ConfirmDialog:O}=n(),W=async()=>{try{let R=await(await z("/api/telemetry/stats")).json();N(R.stats?.total_events||0)}catch{N(null)}};H.useEffect(()=>{W()},[]);let F=async()=>{if(!await U("Are you sure you want to delete all analytics data? This cannot be undone.",{confirmText:"Clear All",title:"Clear Analytics Data"}))return;J(!0),T(null);try{let R=await z("/api/telemetry/clear",{method:"POST"}),B=await R.json();if(R.ok)T({type:"success",text:`Cleared ${B.deleted||0} telemetry events.`}),N(0);else T({type:"error",text:B.error||"Failed to clear telemetry"})}catch{T({type:"error",text:"Failed to clear telemetry"})}J(!1)};return q.jsxDEV(q.Fragment,{children:[O,q.jsxDEV("div",{className:"max-w-4xl w-full",children:[q.jsxDEV("div",{className:"mb-6",children:[q.jsxDEV("h1",{className:"text-2xl font-semibold mb-1",children:"Data Management"},void 0,!1,void 0,this),q.jsxDEV("p",{className:"text-[var(--color-text-muted)]",children:"Manage stored data and analytics."},void 0,!1,void 0,this)]},void 0,!0,void 0,this),q.jsxDEV("div",{className:"bg-[var(--color-surface)] card p-4",children:[q.jsxDEV("h3",{className:"font-medium mb-2",children:"Analytics Data"},void 0,!1,void 0,this),q.jsxDEV("p",{className:"text-sm text-[var(--color-text-muted)] mb-4",children:Q!==null?`${Q.toLocaleString()} events stored`:"Loading..."},void 0,!1,void 0,this),L&&q.jsxDEV("div",{className:`mb-4 p-3 rounded text-sm ${L.type==="success"?"bg-green-500/10 text-green-400 border border-green-500/30":"bg-red-500/10 text-red-400 border border-red-500/30"}`,children:L.text},void 0,!1,void 0,this),q.jsxDEV("button",{onClick:F,disabled:Z||Q===0,className:"px-4 py-2 bg-red-500/20 text-red-400 hover:bg-red-500/30 disabled:opacity-50 disabled:cursor-not-allowed rounded text-sm font-medium transition",children:Z?"Clearing...":"Clear All Analytics"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)}function Oq(){let{authFetch:z}=V(),[Z,J]=H.useState([]),[L,T]=H.useState([]),[Q,N]=H.useState(!0),[U,O]=H.useState(!1),[W,F]=H.useState({name:"",agent_id:"",botToken:""}),[I,R]=H.useState(!1),[B,G]=H.useState(null),{confirm:M,ConfirmDialog:Y}=n(),A=async()=>{try{let X=await(await z("/api/channels")).json();J(X.channels||[])}catch{}finally{N(!1)}},w=async()=>{try{let X=await(await z("/api/agents")).json();T((X.agents||[]).map((K)=>({id:K.id,name:K.name,status:K.status})))}catch{}};H.useEffect(()=>{A(),w()},[]);let C=async()=>{if(!W.name||!W.agent_id||!W.botToken)return;R(!0),G(null);try{let $=await z("/api/channels",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({type:"telegram",name:W.name,agent_id:W.agent_id,config:{botToken:W.botToken}})});if(!$.ok){let X=await $.json();G(X.error||"Failed to create channel")}else F({name:"",agent_id:"",botToken:""}),O(!1),await A()}catch($){G($.message)}finally{R(!1)}},k=async($)=>{let X=$.status==="running"?"stop":"start";try{let K=await z(`/api/channels/${$.id}/${X}`,{method:"POST"});if(!K.ok){let l=await K.json();G(l.error||`Failed to ${X} channel`)}await A()}catch{G(`Failed to ${X} channel`)}},y=async($)=>{if(!await M(`Delete channel "${$.name}"?`,{confirmText:"Delete",title:"Delete Channel"}))return;try{await z(`/api/channels/${$.id}`,{method:"DELETE"}),await A()}catch{}},S={running:"bg-green-500/20 text-green-400",stopped:"bg-[var(--color-surface-raised)] text-[var(--color-text-muted)]",error:"bg-red-500/20 text-red-400"},P=($)=>{return L.find((X)=>X.id===$)?.name||$};return q.jsxDEV(q.Fragment,{children:[Y,q.jsxDEV("div",{className:"max-w-2xl",children:[q.jsxDEV("div",{className:"flex items-center justify-between mb-6",children:[q.jsxDEV("div",{children:[q.jsxDEV("h2",{className:"text-xl font-semibold mb-1",children:"Channels"},void 0,!1,void 0,this),q.jsxDEV("p",{className:"text-sm text-[var(--color-text-muted)]",children:"Connect agents to external messaging platforms"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),q.jsxDEV("button",{onClick:()=>O(!U),className:"flex items-center gap-2 bg-[var(--color-accent)] hover:bg-[var(--color-accent-hover)] text-black px-3 py-1.5 rounded text-sm font-medium transition",children:[q.jsxDEV(o,{},void 0,!1,void 0,this)," Add Channel"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),B&&q.jsxDEV("div",{className:"mb-4 bg-red-500/10 text-red-400 border border-red-500/30 px-3 py-2 rounded text-sm flex items-center justify-between",children:[q.jsxDEV("span",{children:B},void 0,!1,void 0,this),q.jsxDEV("button",{onClick:()=>G(null),className:"text-red-400 hover:text-red-300 ml-2",children:q.jsxDEV(t,{},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this),U&&q.jsxDEV("div",{className:"mb-6 bg-[var(--color-surface)] card p-4 space-y-3",children:[q.jsxDEV("h3",{className:"text-sm font-medium text-[var(--color-text-secondary)] mb-2",children:"New Telegram Channel"},void 0,!1,void 0,this),q.jsxDEV("div",{children:[q.jsxDEV("label",{className:"block text-xs text-[var(--color-text-muted)] mb-1",children:"Channel Name"},void 0,!1,void 0,this),q.jsxDEV("input",{type:"text",value:W.name,onChange:($)=>F((X)=>({...X,name:$.target.value})),placeholder:"e.g. My Telegram Bot",className:"w-full bg-[var(--color-bg)] border border-[var(--color-border-light)] rounded px-3 py-2 text-sm focus:outline-none focus:border-[var(--color-accent)]"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),q.jsxDEV("div",{children:[q.jsxDEV("label",{className:"block text-xs text-[var(--color-text-muted)] mb-1",children:"Agent"},void 0,!1,void 0,this),q.jsxDEV(E,{value:W.agent_id,options:L.map(($)=>({value:$.id,label:$.name})),onChange:($)=>F((X)=>({...X,agent_id:$})),placeholder:"Select an agent..."},void 0,!1,void 0,this)]},void 0,!0,void 0,this),q.jsxDEV("div",{children:[q.jsxDEV("label",{className:"block text-xs text-[var(--color-text-muted)] mb-1",children:"Bot Token"},void 0,!1,void 0,this),q.jsxDEV("input",{type:"password",value:W.botToken,onChange:($)=>F((X)=>({...X,botToken:$.target.value})),placeholder:"From @BotFather on Telegram",className:"w-full bg-[var(--color-bg)] border border-[var(--color-border-light)] rounded px-3 py-2 text-sm focus:outline-none focus:border-[var(--color-accent)]"},void 0,!1,void 0,this),q.jsxDEV("p",{className:"text-xs text-[var(--color-text-faint)] mt-1",children:["Create a bot via ",q.jsxDEV("a",{href:"https://t.me/BotFather",target:"_blank",className:"text-[var(--color-accent)] hover:underline",children:"@BotFather"},void 0,!1,void 0,this)," on Telegram to get a token."]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),q.jsxDEV("div",{className:"flex gap-2 pt-1",children:[q.jsxDEV("button",{onClick:C,disabled:I||!W.name||!W.agent_id||!W.botToken,className:"bg-[var(--color-accent)] hover:bg-[var(--color-accent-hover)] disabled:opacity-50 text-black px-4 py-1.5 rounded text-sm font-medium transition",children:I?"Creating...":"Create"},void 0,!1,void 0,this),q.jsxDEV("button",{onClick:()=>{O(!1),F({name:"",agent_id:"",botToken:""})},className:"border border-[var(--color-border-light)] hover:border-[var(--color-scrollbar)] px-4 py-1.5 rounded text-sm transition",children:"Cancel"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),Q?q.jsxDEV("p",{className:"text-[var(--color-text-muted)] text-sm",children:"Loading channels..."},void 0,!1,void 0,this):Z.length===0?q.jsxDEV("div",{className:"text-center py-12 text-[var(--color-text-muted)]",children:[q.jsxDEV("p",{className:"text-lg mb-2",children:"No channels configured"},void 0,!1,void 0,this),q.jsxDEV("p",{className:"text-sm",children:"Add a Telegram channel to let users message your agents directly."},void 0,!1,void 0,this)]},void 0,!0,void 0,this):q.jsxDEV("div",{className:"space-y-3",children:Z.map(($)=>q.jsxDEV("div",{className:"bg-[var(--color-surface)] card p-4",children:q.jsxDEV("div",{className:"flex items-start justify-between",children:[q.jsxDEV("div",{className:"flex-1 min-w-0",children:[q.jsxDEV("div",{className:"flex items-center gap-2 mb-1",children:[q.jsxDEV("h3",{className:"font-medium",children:$.name},void 0,!1,void 0,this),q.jsxDEV("span",{className:`px-2 py-0.5 rounded text-xs font-medium ${S[$.status]||S.stopped}`,children:$.status},void 0,!1,void 0,this)]},void 0,!0,void 0,this),q.jsxDEV("p",{className:"text-sm text-[var(--color-text-muted)]",children:[$.type==="telegram"?"Telegram":$.type," → ",P($.agent_id)]},void 0,!0,void 0,this),$.status==="error"&&$.error&&q.jsxDEV("p",{className:"text-xs text-red-400 mt-1",children:$.error},void 0,!1,void 0,this)]},void 0,!0,void 0,this),q.jsxDEV("div",{className:"flex items-center gap-2 ml-4",children:[q.jsxDEV("button",{onClick:()=>k($),className:`px-3 py-1 rounded text-xs font-medium transition ${$.status==="running"?"bg-[var(--color-accent-20)] text-[var(--color-accent)] hover:bg-[var(--color-accent-30)]":"bg-[#3b82f6]/20 text-[#3b82f6] hover:bg-[#3b82f6]/30"}`,children:$.status==="running"?"Stop":"Start"},void 0,!1,void 0,this),q.jsxDEV("button",{onClick:()=>y($),className:"text-[var(--color-text-muted)] hover:text-red-400 transition text-sm",children:"×"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},$.id,!1,void 0,this))},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)}function Tq(){let{authFetch:z}=V(),[Z,J]=H.useState([]),[L,T]=H.useState(""),[Q,N]=H.useState(""),[U,O]=H.useState(""),[W,F]=H.useState("unknown"),[I,R]=H.useState(!0),[B,G]=H.useState(!1),[M,Y]=H.useState(null),[A,w]=H.useState(!1),[C,k]=H.useState(!1),[y,S]=H.useState(!1),[P,$]=H.useState({provider:"",model:"",systemPrompt:"",webSearch:!1,webFetch:!1});H.useEffect(()=>{(async()=>{try{let[u,c]=await Promise.all([z("/api/meta-agent/status"),z("/api/providers")]),h=await u.json(),x=await c.json();if(J((x.providers||[]).filter((m)=>m.type==="llm"&&m.hasKey)),h.agent){let m=h.agent;T(m.provider||""),N(m.model||""),O(m.systemPrompt||""),F(m.status||"stopped");let j=m.features?.builtinTools?.webSearch||!1,D=m.features?.builtinTools?.webFetch||!1;k(j),S(D),$({provider:m.provider||"",model:m.model||"",systemPrompt:m.systemPrompt||"",webSearch:j,webFetch:D})}}catch{Y({type:"error",text:"Failed to load assistant config"})}finally{R(!1)}})()},[z]);let K=Z.find((f)=>f.id===L)?.models||[],l=(f)=>{T(f);let u=Z.find((h)=>h.id===f),c=u?.models.find((h)=>h.recommended)?.value||u?.models[0]?.value||"";N(c)},g=L!==P.provider||Q!==P.model||U!==P.systemPrompt||C!==P.webSearch||y!==P.webFetch,d=async()=>{G(!0),Y(null);try{let f=await z("/api/agents/apteva-assistant",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({provider:L,model:Q,systemPrompt:U,features:{builtinTools:{webSearch:C,webFetch:y}}})});if(f.ok)$({provider:L,model:Q,systemPrompt:U,webSearch:C,webFetch:y}),Y({type:"success",text:"Assistant settings saved"}),setTimeout(()=>Y(null),3000);else{let u=await f.json().catch(()=>({}));Y({type:"error",text:u.error||"Failed to save"})}}catch{Y({type:"error",text:"Failed to save settings"})}finally{G(!1)}},_=async()=>{w(!0),Y(null);try{let u=await z(W==="running"?"/api/meta-agent/stop":"/api/meta-agent/start",{method:"POST"});if(u.ok)F(W==="running"?"stopped":"running");else{let c=await u.json().catch(()=>({}));Y({type:"error",text:c.error||"Failed to toggle assistant"})}}catch{Y({type:"error",text:"Failed to toggle assistant"})}finally{w(!1)}};if(I)return q.jsxDEV("div",{className:"text-[var(--color-text-muted)]",children:"Loading assistant settings..."},void 0,!1,void 0,this);return q.jsxDEV("div",{className:"max-w-2xl",children:[q.jsxDEV("h2",{className:"text-lg font-medium mb-1",children:"Apteva Assistant"},void 0,!1,void 0,this),q.jsxDEV("p",{className:"text-sm text-[var(--color-text-muted)] mb-6",children:"Configure the built-in AI assistant that manages your agents and platform."},void 0,!1,void 0,this),M&&q.jsxDEV("div",{className:`mb-4 px-3 py-2 rounded text-sm ${M.type==="success"?"bg-green-500/10 text-green-400":"bg-red-500/10 text-red-400"}`,children:M.text},void 0,!1,void 0,this),q.jsxDEV("div",{className:"mb-6 flex items-center gap-3",children:[q.jsxDEV("span",{className:"text-sm text-[var(--color-text-muted)]",children:"Status:"},void 0,!1,void 0,this),q.jsxDEV("span",{className:`px-2 py-1 rounded text-xs font-medium ${W==="running"?"bg-[#3b82f6]/20 text-[#3b82f6]":"bg-[var(--color-surface-raised)] text-[var(--color-text-muted)]"}`,children:W},void 0,!1,void 0,this),q.jsxDEV("button",{onClick:_,disabled:A,className:`px-3 py-1.5 rounded text-sm font-medium transition ${W==="running"?"bg-[var(--color-accent-20)] text-[var(--color-accent)] hover:bg-[var(--color-accent-30)]":"bg-[#3b82f6]/20 text-[#3b82f6] hover:bg-[#3b82f6]/30"} disabled:opacity-50`,children:A?"...":W==="running"?"Stop":"Start"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),q.jsxDEV("div",{className:"mb-4",children:[q.jsxDEV("label",{className:"block text-sm text-[var(--color-text-muted)] mb-1",children:"Provider"},void 0,!1,void 0,this),q.jsxDEV(E,{value:L,onChange:l,options:Z.map((f)=>({value:f.id,label:f.name})),placeholder:"Select provider..."},void 0,!1,void 0,this)]},void 0,!0,void 0,this),q.jsxDEV("div",{className:"mb-4",children:[q.jsxDEV("label",{className:"block text-sm text-[var(--color-text-muted)] mb-1",children:"Model"},void 0,!1,void 0,this),q.jsxDEV(E,{value:Q,onChange:N,options:K.map((f)=>({value:f.value,label:f.label,recommended:f.recommended})),placeholder:"Select model..."},void 0,!1,void 0,this)]},void 0,!0,void 0,this),L==="anthropic"&&q.jsxDEV("div",{className:"mb-4",children:[q.jsxDEV("label",{className:"block text-sm text-[var(--color-text-muted)] mb-1",children:"Built-in Tools"},void 0,!1,void 0,this),q.jsxDEV("div",{className:"flex flex-wrap gap-2",children:[q.jsxDEV("button",{type:"button",onClick:()=>k(!C),className:`flex items-center gap-2 px-3 py-2 rounded border transition ${C?"border-[var(--color-accent)] bg-[var(--color-accent-10)] text-[var(--color-accent)]":"border-[var(--color-border-light)] hover:border-[var(--color-border-light)] text-[var(--color-text-secondary)]"}`,children:[q.jsxDEV("svg",{className:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:q.jsxDEV("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z"},void 0,!1,void 0,this)},void 0,!1,void 0,this),q.jsxDEV("span",{className:"text-sm",children:"Web Search"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),q.jsxDEV("button",{type:"button",onClick:()=>S(!y),className:`flex items-center gap-2 px-3 py-2 rounded border transition ${y?"border-[var(--color-accent)] bg-[var(--color-accent-10)] text-[var(--color-accent)]":"border-[var(--color-border-light)] hover:border-[var(--color-border-light)] text-[var(--color-text-secondary)]"}`,children:[q.jsxDEV("svg",{className:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:q.jsxDEV("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M21 12a9 9 0 01-9 9m9-9a9 9 0 00-9-9m9 9H3m9 9a9 9 0 01-9-9m9 9c1.657 0 3-4.03 3-9s-1.343-9-3-9m0 18c-1.657 0-3-4.03-3-9s1.343-9 3-9m-9 9a9 9 0 019-9"},void 0,!1,void 0,this)},void 0,!1,void 0,this),q.jsxDEV("span",{className:"text-sm",children:"Web Fetch"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),q.jsxDEV("p",{className:"text-xs text-[var(--color-text-faint)] mt-2",children:"Provider-native tools for real-time web access"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),q.jsxDEV("div",{className:"mb-6",children:[q.jsxDEV("label",{className:"block text-sm text-[var(--color-text-muted)] mb-1",children:"System Prompt"},void 0,!1,void 0,this),q.jsxDEV("textarea",{value:U,onChange:(f)=>O(f.target.value),rows:12,className:"w-full bg-[var(--color-surface)] border border-[var(--color-border)] rounded px-3 py-2 text-sm font-mono focus:outline-none focus:border-[var(--color-accent)] resize-y"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),q.jsxDEV("button",{onClick:d,disabled:!g||B,className:"bg-[var(--color-accent)] hover:bg-[var(--color-accent-hover)] disabled:opacity-50 disabled:cursor-not-allowed text-black px-4 py-2 rounded font-medium transition",children:B?"Saving...":"Save Changes"},void 0,!1,void 0,this),W==="running"&&g&&q.jsxDEV("p",{className:"text-xs text-[var(--color-text-muted)] mt-2",children:"Changes will be applied to the running assistant"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}
2
+ export{bq as c};
3
+
4
+ //# debugId=F785FFF4A7B8F0C264756E2164756E21