@standardagents/builder 0.18.2 → 0.19.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- import{d as z,c as h,b as x,e as r,m as p,z as w,B as T,w as j,a3 as E,H as $,j as o,Z as C,k as u,q as B,f as i,K as N,u as b,J as y,s as _}from"./vue.js";import{B as S,b as D,ai as L,_ as V}from"./index.js";const A=["disabled","aria-label","title"],I="inline-flex items-center justify-center rounded transition-colors disabled:opacity-50 disabled:cursor-not-allowed",K=z({__name:"UiIconButton",props:{icon:{},label:{},size:{default:"sm"},variant:{default:"default"},disabled:{type:Boolean,default:!1},loading:{type:Boolean,default:!1}},emits:["click"],setup(e,{emit:l}){const t=e,c=l,a=h(()=>{switch(t.variant){case"default":return"hover:bg-black/10 dark:hover:bg-white/10";case"ghost":return"hover:bg-black/5 dark:hover:bg-white/5";case"danger":return"text-red-600 hover:bg-red-50 dark:hover:bg-red-900/20";default:return""}}),m=h(()=>{switch(t.size){case"xs":return"p-0.5";case"sm":return"p-1";case"md":return"p-1.5";default:return""}}),v=h(()=>{switch(t.size){case"xs":return"w-3.5 h-3.5";case"sm":return"w-4 h-4";case"md":return"w-5 h-5";default:return""}}),s=n=>{!t.disabled&&!t.loading&&c("click",n)};return(n,d)=>(r(),x("button",{type:"button",disabled:e.disabled||e.loading,"aria-label":e.label,title:e.label,class:p([I,a.value,m.value]),onClick:s},[e.loading?(r(),w(S,{key:0,size:"xs"})):(r(),w(T(e.icon),{key:1,class:p(v.value)},null,8,["class"]))],10,A))}});let f=0,k=null;function M(){return typeof document>"u"?null:document.body}function U(){const e=M();if(!e)return()=>{};f===0&&(k=e.style.overflow,e.style.overflow="hidden"),f+=1;let l=!1;return()=>{l||(l=!0,f=Math.max(0,f-1),f===0&&(e.style.overflow=k??"",k=null))}}const q={key:0,class:"w-full max-w-md"},H={class:"flex items-center justify-between p-4 border-b border-red-200 dark:border-red-900 flex-shrink-0"},J={class:"text-xl font-bold text-red-600"},O={class:"p-6"},X={class:"text-neutral-700 dark:text-neutral-300 mb-6"},Y={class:"flex justify-end gap-3"},G=z({__name:"ConfirmDialog",props:{modelValue:{type:Boolean},title:{default:"Confirm Action"},message:{default:"Are you sure you want to continue? You will lose any unsaved changes."},confirmText:{default:"Continue"},cancelText:{default:"Cancel"}},emits:["update:modelValue","confirm","cancel"],setup(e,{emit:l}){const t=e,c=l;let a=null;const m=()=>{c("update:modelValue",!1)},v=()=>{c("confirm"),m()},s=()=>{c("cancel"),m()},n=d=>{d.key==="Escape"&&t.modelValue&&s()};return j(()=>t.modelValue,d=>{d?(document.addEventListener("keydown",n),a=U()):(document.removeEventListener("keydown",n),a?.(),a=null)}),E(()=>{document.removeEventListener("keydown",n),a?.(),a=null}),(d,g)=>(r(),w($,{to:"body"},[o(C,{"enter-active-class":"transition-opacity duration-200","enter-from-class":"opacity-0","enter-to-class":"opacity-100","leave-active-class":"transition-opacity duration-200","leave-from-class":"opacity-100","leave-to-class":"opacity-0"},{default:u(()=>[e.modelValue?(r(),x("div",{key:0,class:"fixed inset-0 z-[60] flex items-center justify-center p-4 bg-white/80 dark:bg-black/80 backdrop-blur-sm dark:text-white",onClick:s},[o(C,{"enter-active-class":"transition-all duration-200","enter-from-class":"opacity-0 scale-95","enter-to-class":"opacity-100 scale-100","leave-active-class":"transition-all duration-200","leave-from-class":"opacity-100 scale-100","leave-to-class":"opacity-0 scale-95"},{default:u(()=>[e.modelValue?(r(),x("div",q,[o(D,{"offset-x":8,"offset-y":8,intensity:.35},{default:u(()=>[i("div",{class:"bg-white dark:bg-neutral-900 border border-red-400 dark:border-red-500 rounded-lg flex flex-col",onClick:g[0]||(g[0]=N(()=>{},["stop"]))},[i("div",H,[i("h2",J,b(e.title),1),o(y(K),{icon:y(L),label:"Close dialog",variant:"danger",onClick:s},null,8,["icon"])]),i("div",O,[i("p",X,b(e.message),1),i("div",Y,[o(y(V),{variant:"secondary",onClick:s},{default:u(()=>[_(b(e.cancelText),1)]),_:1}),o(y(V),{variant:"danger",onClick:v},{default:u(()=>[_(b(e.confirmText),1)]),_:1})])])])]),_:1})])):B("",!0)]),_:1})])):B("",!0)]),_:1})]))}});export{G as _,K as a,U as l};
1
+ import{d as z,c as h,b as x,e as r,m as p,z as w,B as T,w as j,a3 as E,H as $,j as o,Z as C,k as u,q as B,f as i,K as N,u as b,J as y,s as _}from"./vue.js";import{B as S,c as D,ai as L,_ as V}from"./index.js";const A=["disabled","aria-label","title"],I="inline-flex items-center justify-center rounded transition-colors disabled:opacity-50 disabled:cursor-not-allowed",K=z({__name:"UiIconButton",props:{icon:{},label:{},size:{default:"sm"},variant:{default:"default"},disabled:{type:Boolean,default:!1},loading:{type:Boolean,default:!1}},emits:["click"],setup(e,{emit:l}){const t=e,c=l,a=h(()=>{switch(t.variant){case"default":return"hover:bg-black/10 dark:hover:bg-white/10";case"ghost":return"hover:bg-black/5 dark:hover:bg-white/5";case"danger":return"text-red-600 hover:bg-red-50 dark:hover:bg-red-900/20";default:return""}}),m=h(()=>{switch(t.size){case"xs":return"p-0.5";case"sm":return"p-1";case"md":return"p-1.5";default:return""}}),v=h(()=>{switch(t.size){case"xs":return"w-3.5 h-3.5";case"sm":return"w-4 h-4";case"md":return"w-5 h-5";default:return""}}),s=n=>{!t.disabled&&!t.loading&&c("click",n)};return(n,d)=>(r(),x("button",{type:"button",disabled:e.disabled||e.loading,"aria-label":e.label,title:e.label,class:p([I,a.value,m.value]),onClick:s},[e.loading?(r(),w(S,{key:0,size:"xs"})):(r(),w(T(e.icon),{key:1,class:p(v.value)},null,8,["class"]))],10,A))}});let f=0,k=null;function M(){return typeof document>"u"?null:document.body}function U(){const e=M();if(!e)return()=>{};f===0&&(k=e.style.overflow,e.style.overflow="hidden"),f+=1;let l=!1;return()=>{l||(l=!0,f=Math.max(0,f-1),f===0&&(e.style.overflow=k??"",k=null))}}const q={key:0,class:"w-full max-w-md"},H={class:"flex items-center justify-between p-4 border-b border-red-200 dark:border-red-900 flex-shrink-0"},J={class:"text-xl font-bold text-red-600"},O={class:"p-6"},X={class:"text-neutral-700 dark:text-neutral-300 mb-6"},Y={class:"flex justify-end gap-3"},G=z({__name:"ConfirmDialog",props:{modelValue:{type:Boolean},title:{default:"Confirm Action"},message:{default:"Are you sure you want to continue? You will lose any unsaved changes."},confirmText:{default:"Continue"},cancelText:{default:"Cancel"}},emits:["update:modelValue","confirm","cancel"],setup(e,{emit:l}){const t=e,c=l;let a=null;const m=()=>{c("update:modelValue",!1)},v=()=>{c("confirm"),m()},s=()=>{c("cancel"),m()},n=d=>{d.key==="Escape"&&t.modelValue&&s()};return j(()=>t.modelValue,d=>{d?(document.addEventListener("keydown",n),a=U()):(document.removeEventListener("keydown",n),a?.(),a=null)}),E(()=>{document.removeEventListener("keydown",n),a?.(),a=null}),(d,g)=>(r(),w($,{to:"body"},[o(C,{"enter-active-class":"transition-opacity duration-200","enter-from-class":"opacity-0","enter-to-class":"opacity-100","leave-active-class":"transition-opacity duration-200","leave-from-class":"opacity-100","leave-to-class":"opacity-0"},{default:u(()=>[e.modelValue?(r(),x("div",{key:0,class:"fixed inset-0 z-[60] flex items-center justify-center p-4 bg-white/80 dark:bg-black/80 backdrop-blur-sm dark:text-white",onClick:s},[o(C,{"enter-active-class":"transition-all duration-200","enter-from-class":"opacity-0 scale-95","enter-to-class":"opacity-100 scale-100","leave-active-class":"transition-all duration-200","leave-from-class":"opacity-100 scale-100","leave-to-class":"opacity-0 scale-95"},{default:u(()=>[e.modelValue?(r(),x("div",q,[o(D,{"offset-x":8,"offset-y":8,intensity:.35},{default:u(()=>[i("div",{class:"bg-white dark:bg-neutral-900 border border-red-400 dark:border-red-500 rounded-lg flex flex-col",onClick:g[0]||(g[0]=N(()=>{},["stop"]))},[i("div",H,[i("h2",J,b(e.title),1),o(y(K),{icon:y(L),label:"Close dialog",variant:"danger",onClick:s},null,8,["icon"])]),i("div",O,[i("p",X,b(e.message),1),i("div",Y,[o(y(V),{variant:"secondary",onClick:s},{default:u(()=>[_(b(e.cancelText),1)]),_:1}),o(y(V),{variant:"danger",onClick:v},{default:u(()=>[_(b(e.confirmText),1)]),_:1})])])])]),_:1})])):B("",!0)]),_:1})])):B("",!0)]),_:1})]))}});export{G as _,K as a,U as l};
@@ -1,4 +1,4 @@
1
- import{a as E,m as H}from"./index.js";import{_ as M}from"./CopyButton.vue_vue_type_script_setup_true_lang.js";import{d as z,r as h,c as j,b as m,e as d,q as y,f as _,z as R,j as P,H as F,n as K}from"./vue.js";const U={class:"json-viewer relative bg-white dark:bg-neutral-900"},W={key:0,class:"absolute top-[5px] right-[5px] z-10"},q=["innerHTML"],D=["src","alt"],G="__agentbuilder_json_viewer_interactive_string__",Q=z({__name:"JsonViewer",props:{json:{},threadId:{},showCopyButton:{type:Boolean},actions:{}},emits:["action"],setup(u,{emit:x}){const r=u,k=x,l=h(null),p=h(null),I=t=>!!t&&typeof t=="object"&&t.__agentbuilderJsonViewerKind===G&&typeof t.value=="string",w=t=>[".jpg",".jpeg",".png",".gif",".webp",".svg",".bmp"].some(n=>t.toLowerCase().endsWith(n)),N=t=>r.threadId?E(`/api/threads/${r.threadId}/fs${t}`):null,S=j(()=>{if(!r.json)return"";if(typeof r.json=="string")try{return JSON.stringify(JSON.parse(r.json),null,2)}catch{return r.json}return JSON.stringify(r.json,null,2)}),a=t=>t.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;"),$=t=>{const e=a(t.label),n=a(t.title||t.label);return`<button type="button" class="json-inline-action json-inline-action--${a(t.action)}" data-action="${a(t.action)}" data-index="${t.index??""}" title="${n}">${e}</button>`},v=t=>{if(!t)return"";const e=(r.actions||[]).find(n=>n.token===t);return e?$(e):""},C=t=>{let e="",n=a(t);for(const s of r.actions||[]){const o=a(s.token),i=$(s);s.placement==="before"?(n.includes(o)&&(e+=i),n=n.split(o).join("")):n=n.split(o).join(i)}return{before:e,content:n}},b=(t,e,n={})=>{const{before:s,content:o}=C(t),i=v(n.beforeActionToken),c=n.afterLabel?` <span class="json-fold-marker">${a(n.afterLabel)}</span>`:"";return r.threadId&&w(t)&&t.startsWith("/attachments/")?`${i}${s}${e('"')}<span class="json-image-path" data-path="${a(t)}">${o}</span>${e('"')}${c}`:`${i}${s}${e('"')}<span class="json-string">${o}</span>${e('"')}${c}`},f=(t,e=0)=>{const n=" ".repeat(e),s=o=>`<span class="json-punct">${o}</span>`;if(t===null)return'<span class="json-null">null</span>';if(typeof t=="boolean")return`<span class="json-boolean">${t}</span>`;if(typeof t=="number")return`<span class="json-number">${t}</span>`;if(typeof t=="string")return b(t,s);if(I(t))return b(t.value,s,{beforeActionToken:t.beforeActionToken,afterLabel:t.afterLabel});if(Array.isArray(t)){if(t.length===0)return`${s("[")}${s("]")}`;const o=t.map((i,c)=>{const g=c<t.length-1?s(","):"";return`${n} ${f(i,e+1)}${g}`});return`${s("[")}
1
+ import{b as E,m as H}from"./index.js";import{_ as M}from"./CopyButton.vue_vue_type_script_setup_true_lang.js";import{d as z,r as h,c as j,b as m,e as d,q as y,f as _,z as R,j as P,H as F,n as K}from"./vue.js";const U={class:"json-viewer relative bg-white dark:bg-neutral-900"},W={key:0,class:"absolute top-[5px] right-[5px] z-10"},q=["innerHTML"],D=["src","alt"],G="__agentbuilder_json_viewer_interactive_string__",Q=z({__name:"JsonViewer",props:{json:{},threadId:{},showCopyButton:{type:Boolean},actions:{}},emits:["action"],setup(u,{emit:x}){const r=u,k=x,l=h(null),p=h(null),I=t=>!!t&&typeof t=="object"&&t.__agentbuilderJsonViewerKind===G&&typeof t.value=="string",w=t=>[".jpg",".jpeg",".png",".gif",".webp",".svg",".bmp"].some(n=>t.toLowerCase().endsWith(n)),N=t=>r.threadId?E(`/api/threads/${r.threadId}/fs${t}`):null,S=j(()=>{if(!r.json)return"";if(typeof r.json=="string")try{return JSON.stringify(JSON.parse(r.json),null,2)}catch{return r.json}return JSON.stringify(r.json,null,2)}),a=t=>t.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;"),$=t=>{const e=a(t.label),n=a(t.title||t.label);return`<button type="button" class="json-inline-action json-inline-action--${a(t.action)}" data-action="${a(t.action)}" data-index="${t.index??""}" title="${n}">${e}</button>`},v=t=>{if(!t)return"";const e=(r.actions||[]).find(n=>n.token===t);return e?$(e):""},C=t=>{let e="",n=a(t);for(const s of r.actions||[]){const o=a(s.token),i=$(s);s.placement==="before"?(n.includes(o)&&(e+=i),n=n.split(o).join("")):n=n.split(o).join(i)}return{before:e,content:n}},b=(t,e,n={})=>{const{before:s,content:o}=C(t),i=v(n.beforeActionToken),c=n.afterLabel?` <span class="json-fold-marker">${a(n.afterLabel)}</span>`:"";return r.threadId&&w(t)&&t.startsWith("/attachments/")?`${i}${s}${e('"')}<span class="json-image-path" data-path="${a(t)}">${o}</span>${e('"')}${c}`:`${i}${s}${e('"')}<span class="json-string">${o}</span>${e('"')}${c}`},f=(t,e=0)=>{const n=" ".repeat(e),s=o=>`<span class="json-punct">${o}</span>`;if(t===null)return'<span class="json-null">null</span>';if(typeof t=="boolean")return`<span class="json-boolean">${t}</span>`;if(typeof t=="number")return`<span class="json-number">${t}</span>`;if(typeof t=="string")return b(t,s);if(I(t))return b(t.value,s,{beforeActionToken:t.beforeActionToken,afterLabel:t.afterLabel});if(Array.isArray(t)){if(t.length===0)return`${s("[")}${s("]")}`;const o=t.map((i,c)=>{const g=c<t.length-1?s(","):"";return`${n} ${f(i,e+1)}${g}`});return`${s("[")}
2
2
  ${o.join(`
3
3
  `)}
4
4
  ${n}${s("]")}`}if(typeof t=="object"){const o=Object.entries(t);if(o.length===0)return`${s("{")}${s("}")}`;const i=o.map(([c,g],V)=>{const B=V<o.length-1?s(","):"",O=`${s('"')}<span class="json-key">${a(c)}</span>${s('"')}`;return`${n} ${O}${s(":")} ${f(g,e+1)}${B}`});return`${s("{")}
@@ -1 +1 @@
1
- import{d as Y,X as J,Y as X,r as s,c as O,o as $,O as z,b as l,e as o,f as t,j as d,k as h,q as c,u as I,F as Q,z as Z,J as S,s as L,m as ee}from"./vue.js";import{r as te,s as P,a as p,_ as j,b as ae,l as re,c as se,d as q,e as F,f as G}from"./index.js";import"./formkit.js";import"./vendor.js";import"./syntax.js";import"./monaco.js";const ne={class:"login-container flex-1 flex items-center justify-center px-4"},oe={class:"max-w-md w-full space-y-8"},le={class:"flex justify-center"},ie=["src"],ue={class:"bg-white dark:bg-neutral-900 border border-neutral-300 dark:border-neutral-700 py-8 px-6 rounded-lg"},de={key:0,class:"bg-red-50 dark:bg-red-950 border border-red-500 text-red-700 dark:text-red-400 px-4 py-3 mb-6 rounded"},ce={key:1,class:"py-6 text-center text-sm text-neutral-600 dark:text-neutral-300"},fe={key:0,class:"space-y-3"},ve={key:1,class:"space-y-3"},ge={key:2,class:"relative my-6"},pe={class:"mt-6"},me={key:3,class:"mt-6"},Ce=Y({__name:"LoginView",setup(he){function B(a){return a.startsWith("/src/")||a.startsWith("data:")?a:a.replace("/agents/","/")}const V=B(re),T=B(se),w=J(),k=X(),r=s(""),y=s(!1),x=s(!1),_=s(!0),m=s(!1),C=s(!1),b=s(!1),A=s(!1),f=s(!1),v=s(!1),E=s(te()==="dark"),g=s(null),H=O(()=>E.value?T:V),M=O(()=>!b.value&&(!m.value||C.value));async function N(a=!1){try{const e=await fetch(p("/api/auth/bootstrap"),{method:"POST",headers:{Accept:"application/json"}});if(e.status===204)return a&&(r.value="Standard Agents sign-in is not available for this instance."),!1;if(!e.ok){if(a){const i=await e.json().catch(()=>({}));r.value=i.error||"Standard Agents sign-in failed."}return!1}const n=await e.json();return n.token?(P(n.token),q(),await w.push("/"),!0):(a&&(r.value="Standard Agents sign-in is not available for this instance."),!1)}catch(e){return a&&(r.value=e instanceof Error?e.message:"Standard Agents sign-in failed."),!1}}async function K(){r.value="",F(g),x.value=!0;try{await N(!0)}finally{x.value=!1}}function R(){window.location.href=p("/api/auth/sa/start")}$(async()=>{const a=k.query.token,e=k.query.error,n=k.query.sa_error;if(a){P(a),q(),w.push("/");return}e==="oauth_failed"?r.value="OAuth authentication failed. Please try again.":e==="oauth_not_configured"&&(r.value="OAuth provider is not configured."),n&&(r.value=n==="forbidden"?"Your Standard Agents account doesn't have access to this instance.":"Standard Agents sign-in didn't complete. Please try again.");try{const i=await fetch(p("/api/auth/config"));if(i.ok){const u=await i.json();f.value=u.github||!1,v.value=u.google||!1,m.value=u.platformConnected||!1,C.value=u.localPassword||!1,b.value=u.hosted||!1,A.value=u.standardAgentsLogin||!1,b.value&&(f.value=!1,v.value=!1)}}catch{f.value=!1,v.value=!1,m.value=!1,C.value=!1}!b.value&&await N()||(_.value=!1)});async function D(a){r.value="",F(g),y.value=!0;try{const e=await fetch(p("/api/auth/login"),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({username:a.username,password:a.password})}),n=await e.json();e.ok?(P(n.token),q(),w.push("/")):G(n,g)||(r.value=n.error||"Login failed")}catch{G({error:"Network error. Please try again."},g)}finally{y.value=!1}}function U(){window.location.href=p("/api/auth/oauth/github")}function W(){window.location.href=p("/api/auth/oauth/google")}return(a,e)=>{const n=z("FormKitMessages"),i=z("FormKit");return o(),l("div",ne,[t("div",oe,[t("div",le,[t("img",{src:H.value,alt:"AgentBuilder",class:"h-16 pointer-events-none select-none"},null,8,ie)]),d(ae,{offsetX:8,offsetY:8,intensity:.2,pattern:"crosshatch"},{default:h(()=>[t("div",ue,[r.value?(o(),l("div",de,I(r.value),1)):c("",!0),_.value?(o(),l("div",ce," Connecting to your Standard Agents account... ")):(o(),l(Q,{key:2},[A.value?(o(),l("div",fe,[d(S(j),{type:"button",variant:"primary","full-width":"",onClick:R},{default:h(()=>[...e[1]||(e[1]=[L(" Login with Standard Agents ",-1)])]),_:1})])):m.value?(o(),l("div",ve,[d(S(j),{type:"button",variant:"primary","full-width":"",loading:x.value,onClick:K},{default:h(()=>[...e[2]||(e[2]=[L(" Continue with Standard Agents ",-1)])]),_:1},8,["loading"])])):c("",!0),(A.value||m.value)&&M.value?(o(),l("div",ge,[...e[3]||(e[3]=[t("div",{class:"absolute inset-0 flex items-center"},[t("div",{class:"w-full border-t border-neutral-300 dark:border-neutral-600"})],-1),t("div",{class:"relative flex justify-center text-sm"},[t("span",{class:"px-2 bg-white dark:bg-neutral-900 text-neutral-500 dark:text-neutral-400"},"Or sign in locally")],-1)])])):c("",!0),M.value?(o(),Z(i,{key:3,type:"form",actions:!1,onSubmit:D,onNode:e[0]||(e[0]=u=>g.value=u),disabled:y.value},{default:h(()=>[d(n,{node:g.value||void 0},null,8,["node"]),d(i,{type:"text",name:"username",label:"Username",placeholder:"Enter your username",validation:"required","validation-messages":{required:"Username is required"}}),d(i,{type:"password",name:"password",label:"Password",placeholder:"Enter your password",validation:"required","validation-messages":{required:"Password is required"}}),t("div",pe,[d(S(j),{type:"submit",variant:"primary","full-width":"",loading:y.value},{default:h(()=>[...e[4]||(e[4]=[L(" Sign in ",-1)])]),_:1},8,["loading"])])]),_:1},8,["disabled"])):c("",!0)],64)),!_.value&&(f.value||v.value)?(o(),l("div",me,[e[7]||(e[7]=t("div",{class:"relative"},[t("div",{class:"absolute inset-0 flex items-center"},[t("div",{class:"w-full border-t border-neutral-300 dark:border-neutral-600"})]),t("div",{class:"relative flex justify-center text-sm"},[t("span",{class:"px-2 bg-white dark:bg-neutral-900 text-neutral-500 dark:text-neutral-400"},"Or continue with")])],-1)),t("div",{class:ee(["mt-6 grid gap-3",f.value&&v.value?"grid-cols-2":"grid-cols-1"])},[f.value?(o(),l("button",{key:0,onClick:U,type:"button",class:"w-full inline-flex justify-center items-center px-4 py-2.5 border border-neutral-300 dark:border-neutral-600 bg-white dark:bg-neutral-800 text-neutral-700 dark:text-neutral-200 rounded-md font-medium hover:bg-neutral-50 dark:hover:bg-neutral-700 transition-colors"},[...e[5]||(e[5]=[t("svg",{class:"h-5 w-5",fill:"currentColor",viewBox:"0 0 20 20"},[t("path",{"fill-rule":"evenodd",d:"M10 0C4.477 0 0 4.484 0 10.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0110 4.844c.85.004 1.705.115 2.504.337 1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.203 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.942.359.31.678.921.678 1.856 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.019 10.019 0 0020 10.017C20 4.484 15.522 0 10 0z","clip-rule":"evenodd"})],-1),t("span",{class:"ml-2"},"GitHub",-1)])])):c("",!0),v.value?(o(),l("button",{key:1,onClick:W,type:"button",class:"w-full inline-flex justify-center items-center px-4 py-2.5 border border-neutral-300 dark:border-neutral-600 bg-white dark:bg-neutral-800 text-neutral-700 dark:text-neutral-200 rounded-md font-medium hover:bg-neutral-50 dark:hover:bg-neutral-700 transition-colors"},[...e[6]||(e[6]=[t("svg",{class:"h-5 w-5",viewBox:"0 0 24 24"},[t("path",{fill:"currentColor",d:"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z"}),t("path",{fill:"currentColor",d:"M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z"}),t("path",{fill:"currentColor",d:"M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z"}),t("path",{fill:"currentColor",d:"M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z"})],-1),t("span",{class:"ml-2"},"Google",-1)])])):c("",!0)],2)])):c("",!0)])]),_:1})])])}}});export{Ce as default};
1
+ import{d as Y,X as J,Y as X,r as s,c as O,o as $,O as z,b as l,e as o,f as t,j as d,k as h,q as c,u as I,F as Q,z as Z,J as S,s as L,m as ee}from"./vue.js";import{r as te,s as P,a as j,b as p,_ as q,c as ae,l as re,d as se,e as F,f as G}from"./index.js";import"./formkit.js";import"./vendor.js";import"./syntax.js";import"./monaco.js";const ne={class:"login-container flex-1 flex items-center justify-center px-4"},oe={class:"max-w-md w-full space-y-8"},le={class:"flex justify-center"},ie=["src"],ue={class:"bg-white dark:bg-neutral-900 border border-neutral-300 dark:border-neutral-700 py-8 px-6 rounded-lg"},de={key:0,class:"bg-red-50 dark:bg-red-950 border border-red-500 text-red-700 dark:text-red-400 px-4 py-3 mb-6 rounded"},ce={key:1,class:"py-6 text-center text-sm text-neutral-600 dark:text-neutral-300"},fe={key:0,class:"space-y-3"},ve={key:1,class:"space-y-3"},ge={key:2,class:"relative my-6"},pe={class:"mt-6"},me={key:3,class:"mt-6"},Ce=Y({__name:"LoginView",setup(he){function B(a){return a.startsWith("/src/")||a.startsWith("data:")?a:a.replace("/agents/","/")}const V=B(re),T=B(se),w=J(),k=X(),r=s(""),y=s(!1),x=s(!1),_=s(!0),m=s(!1),C=s(!1),b=s(!1),A=s(!1),f=s(!1),v=s(!1),E=s(te()==="dark"),g=s(null),H=O(()=>E.value?T:V),M=O(()=>!b.value&&(!m.value||C.value));async function N(a=!1){try{const e=await fetch(p("/api/auth/bootstrap"),{method:"POST",headers:{Accept:"application/json"}});if(e.status===204)return a&&(r.value="Standard Agents sign-in is not available for this instance."),!1;if(!e.ok){if(a){const i=await e.json().catch(()=>({}));r.value=i.error||"Standard Agents sign-in failed."}return!1}const n=await e.json();return n.token?(P(n.token),j(),await w.push("/"),!0):(a&&(r.value="Standard Agents sign-in is not available for this instance."),!1)}catch(e){return a&&(r.value=e instanceof Error?e.message:"Standard Agents sign-in failed."),!1}}async function K(){r.value="",F(g),x.value=!0;try{await N(!0)}finally{x.value=!1}}function R(){window.location.href=p("/api/auth/sa/start")}$(async()=>{const a=k.query.token,e=k.query.error,n=k.query.sa_error;if(a){P(a),j(),w.push("/");return}e==="oauth_failed"?r.value="OAuth authentication failed. Please try again.":e==="oauth_not_configured"&&(r.value="OAuth provider is not configured."),n&&(r.value=n==="forbidden"?"Your Standard Agents account doesn't have access to this instance.":"Standard Agents sign-in didn't complete. Please try again.");try{const i=await fetch(p("/api/auth/config"));if(i.ok){const u=await i.json();f.value=u.github||!1,v.value=u.google||!1,m.value=u.platformConnected||!1,C.value=u.localPassword||!1,b.value=u.hosted||!1,A.value=u.standardAgentsLogin||!1,b.value&&(f.value=!1,v.value=!1)}}catch{f.value=!1,v.value=!1,m.value=!1,C.value=!1}!b.value&&await N()||(_.value=!1)});async function D(a){r.value="",F(g),y.value=!0;try{const e=await fetch(p("/api/auth/login"),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({username:a.username,password:a.password})}),n=await e.json();e.ok?(P(n.token),j(),w.push("/")):G(n,g)||(r.value=n.error||"Login failed")}catch{G({error:"Network error. Please try again."},g)}finally{y.value=!1}}function U(){window.location.href=p("/api/auth/oauth/github")}function W(){window.location.href=p("/api/auth/oauth/google")}return(a,e)=>{const n=z("FormKitMessages"),i=z("FormKit");return o(),l("div",ne,[t("div",oe,[t("div",le,[t("img",{src:H.value,alt:"AgentBuilder",class:"h-16 pointer-events-none select-none"},null,8,ie)]),d(ae,{offsetX:8,offsetY:8,intensity:.2,pattern:"crosshatch"},{default:h(()=>[t("div",ue,[r.value?(o(),l("div",de,I(r.value),1)):c("",!0),_.value?(o(),l("div",ce," Connecting to your Standard Agents account... ")):(o(),l(Q,{key:2},[A.value?(o(),l("div",fe,[d(S(q),{type:"button",variant:"primary","full-width":"",onClick:R},{default:h(()=>[...e[1]||(e[1]=[L(" Login with Standard Agents ",-1)])]),_:1})])):m.value?(o(),l("div",ve,[d(S(q),{type:"button",variant:"primary","full-width":"",loading:x.value,onClick:K},{default:h(()=>[...e[2]||(e[2]=[L(" Continue with Standard Agents ",-1)])]),_:1},8,["loading"])])):c("",!0),(A.value||m.value)&&M.value?(o(),l("div",ge,[...e[3]||(e[3]=[t("div",{class:"absolute inset-0 flex items-center"},[t("div",{class:"w-full border-t border-neutral-300 dark:border-neutral-600"})],-1),t("div",{class:"relative flex justify-center text-sm"},[t("span",{class:"px-2 bg-white dark:bg-neutral-900 text-neutral-500 dark:text-neutral-400"},"Or sign in locally")],-1)])])):c("",!0),M.value?(o(),Z(i,{key:3,type:"form",actions:!1,onSubmit:D,onNode:e[0]||(e[0]=u=>g.value=u),disabled:y.value},{default:h(()=>[d(n,{node:g.value||void 0},null,8,["node"]),d(i,{type:"text",name:"username",label:"Username",placeholder:"Enter your username",validation:"required","validation-messages":{required:"Username is required"}}),d(i,{type:"password",name:"password",label:"Password",placeholder:"Enter your password",validation:"required","validation-messages":{required:"Password is required"}}),t("div",pe,[d(S(q),{type:"submit",variant:"primary","full-width":"",loading:y.value},{default:h(()=>[...e[4]||(e[4]=[L(" Sign in ",-1)])]),_:1},8,["loading"])])]),_:1},8,["disabled"])):c("",!0)],64)),!_.value&&(f.value||v.value)?(o(),l("div",me,[e[7]||(e[7]=t("div",{class:"relative"},[t("div",{class:"absolute inset-0 flex items-center"},[t("div",{class:"w-full border-t border-neutral-300 dark:border-neutral-600"})]),t("div",{class:"relative flex justify-center text-sm"},[t("span",{class:"px-2 bg-white dark:bg-neutral-900 text-neutral-500 dark:text-neutral-400"},"Or continue with")])],-1)),t("div",{class:ee(["mt-6 grid gap-3",f.value&&v.value?"grid-cols-2":"grid-cols-1"])},[f.value?(o(),l("button",{key:0,onClick:U,type:"button",class:"w-full inline-flex justify-center items-center px-4 py-2.5 border border-neutral-300 dark:border-neutral-600 bg-white dark:bg-neutral-800 text-neutral-700 dark:text-neutral-200 rounded-md font-medium hover:bg-neutral-50 dark:hover:bg-neutral-700 transition-colors"},[...e[5]||(e[5]=[t("svg",{class:"h-5 w-5",fill:"currentColor",viewBox:"0 0 20 20"},[t("path",{"fill-rule":"evenodd",d:"M10 0C4.477 0 0 4.484 0 10.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0110 4.844c.85.004 1.705.115 2.504.337 1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.203 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.942.359.31.678.921.678 1.856 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.019 10.019 0 0020 10.017C20 4.484 15.522 0 10 0z","clip-rule":"evenodd"})],-1),t("span",{class:"ml-2"},"GitHub",-1)])])):c("",!0),v.value?(o(),l("button",{key:1,onClick:W,type:"button",class:"w-full inline-flex justify-center items-center px-4 py-2.5 border border-neutral-300 dark:border-neutral-600 bg-white dark:bg-neutral-800 text-neutral-700 dark:text-neutral-200 rounded-md font-medium hover:bg-neutral-50 dark:hover:bg-neutral-700 transition-colors"},[...e[6]||(e[6]=[t("svg",{class:"h-5 w-5",viewBox:"0 0 24 24"},[t("path",{fill:"currentColor",d:"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z"}),t("path",{fill:"currentColor",d:"M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z"}),t("path",{fill:"currentColor",d:"M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z"}),t("path",{fill:"currentColor",d:"M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z"})],-1),t("span",{class:"ml-2"},"Google",-1)])])):c("",!0)],2)])):c("",!0)])]),_:1})])])}}});export{Ce as default};
@@ -1 +1 @@
1
- import{d as j,r as d,w as z,a3 as H,z as O,e as f,H as R,j as r,k as C,b as w,q as b,Z as S,m as x,f as m,u as F,J as E,g as _,h as K}from"./vue.js";import{b as P,ai as J}from"./index.js";import{a as X,_ as Y,l as Z}from"./ConfirmDialog.vue_vue_type_script_setup_true_lang.js";const G={class:"flex items-center justify-between p-4 border-b border-neutral-200 dark:border-neutral-700 flex-shrink-0"},Q={class:"text-xl font-bold"},W={key:0,class:"p-6 border-t border-neutral-200 dark:border-neutral-700 flex-shrink-0"},le=j({__name:"Modal",props:{modelValue:{type:Boolean},title:{},width:{default:"max-w-lg"},minHeight:{default:"min-h-[24rem]"},hasChanges:{type:Boolean,default:void 0},contentPadding:{type:Boolean,default:!0}},emits:["update:modelValue","close"],setup(l,{emit:T}){const c=l,V=T,a=d(),n=d(!1),v=d(new Map);let s=null,i=null;const h=()=>{i&&(clearTimeout(i),i=null)},y=()=>a.value&&(a.value.querySelector("input")||a.value.querySelector("textarea")||a.value.querySelector("select")||a.value.querySelector("[contenteditable]")||a.value.querySelector(".monaco-editor")),q=()=>{if(!a.value)return;a.value.querySelectorAll(".monaco-editor-container").forEach(t=>{const o=t.__monacoEditor;if(o&&typeof o.getValue=="function"){const k=o.getValue();v.value.set(t,k)}})},M=()=>{if(!a.value)return!1;const e=a.value.querySelectorAll(".monaco-editor-container");for(const t of e){const o=t.__monacoEditor;if(o&&typeof o.getValue=="function"){const k=o.getValue(),B=v.value.get(t);if(B===void 0||(o.getRawOptions?.()||{}).readOnly===!0)continue;if(k!==B)return!0}}return!1},I=e=>{const t=e;return t.type==="checkbox"||t.type==="radio"?t.checked!==t.defaultChecked:(t.tagName==="SELECT",t.value!==t.defaultValue)},$=()=>{if(c.hasChanges!==void 0)return c.hasChanges;if(!a.value)return!1;if(M())return!0;const e=a.value.querySelectorAll("input, textarea, select");for(const t of e)if(I(t))return!0;return!1},A=()=>{y()&&$()?n.value=!0:u()},u=()=>{V("update:modelValue",!1),V("close")},D=()=>{n.value=!1,u()},L=()=>{n.value=!1},p=e=>{e.key==="Escape"&&c.modelValue&&(y()||u())};z(()=>c.modelValue,async e=>{e?(document.addEventListener("keydown",p),s=Z(),await K(),h(),i=setTimeout(()=>{q()},100)):(document.removeEventListener("keydown",p),s?.(),s=null,h(),v.value.clear())}),H(()=>{document.removeEventListener("keydown",p),s?.(),s=null,h()});const g=d(!1),N=e=>{g.value=e.target===e.currentTarget},U=e=>{e.target===e.currentTarget&&g.value&&(y()||u()),g.value=!1};return(e,t)=>(f(),O(R,{to:"body"},[r(S,{"enter-active-class":"transition-opacity duration-200","enter-from-class":"opacity-0","enter-to-class":"opacity-100","leave-active-class":"transition-opacity duration-200","leave-from-class":"opacity-100","leave-to-class":"opacity-0"},{default:C(()=>[l.modelValue?(f(),w("div",{key:0,class:"fixed inset-0 z-50 flex items-center justify-center p-4 bg-white/80 dark:bg-black/80 backdrop-blur-sm dark:text-white",onMousedown:N,onClick:U},[r(S,{"enter-active-class":"transition-all duration-200","enter-from-class":"opacity-0 scale-95","enter-to-class":"opacity-100 scale-100","leave-active-class":"transition-all duration-200","leave-from-class":"opacity-100 scale-100","leave-to-class":"opacity-0 scale-95"},{default:C(()=>[l.modelValue?(f(),w("div",{key:0,class:x(["w-full",l.width,"max-h-[85vh] flex flex-col"])},[r(P,{"offset-x":8,"offset-y":8,intensity:.35},{default:C(()=>[m("div",{ref_key:"modalRef",ref:a,class:x(["bg-white dark:bg-neutral-900 border border-neutral-300 dark:border-neutral-600 rounded-lg flex flex-col max-h-[85vh]",l.minHeight])},[m("div",G,[m("h2",Q,F(l.title),1),r(E(X),{icon:E(J),label:"Close modal",variant:"ghost",onClick:A},null,8,["icon"])]),m("div",{class:x(["flex-1 min-h-0",l.contentPadding?"overflow-y-auto p-6":"overflow-hidden flex flex-col"])},[_(e.$slots,"default")],2),e.$slots.footer?(f(),w("div",W,[_(e.$slots,"footer")])):b("",!0)],2)]),_:3})],2)):b("",!0)]),_:3})],32)):b("",!0)]),_:3}),r(Y,{modelValue:n.value,"onUpdate:modelValue":t[0]||(t[0]=o=>n.value=o),title:"Unsaved Changes",message:"You have unsaved changes that will be lost. Are you sure you want to close?","confirm-text":"Close Anyway","cancel-text":"Keep Editing",onConfirm:D,onCancel:L},null,8,["modelValue"])]))}});export{le as _};
1
+ import{d as j,r as d,w as z,a3 as H,z as O,e as f,H as R,j as r,k as C,b as w,q as b,Z as S,m as x,f as m,u as F,J as E,g as _,h as K}from"./vue.js";import{c as P,ai as J}from"./index.js";import{a as X,_ as Y,l as Z}from"./ConfirmDialog.vue_vue_type_script_setup_true_lang.js";const G={class:"flex items-center justify-between p-4 border-b border-neutral-200 dark:border-neutral-700 flex-shrink-0"},Q={class:"text-xl font-bold"},W={key:0,class:"p-6 border-t border-neutral-200 dark:border-neutral-700 flex-shrink-0"},le=j({__name:"Modal",props:{modelValue:{type:Boolean},title:{},width:{default:"max-w-lg"},minHeight:{default:"min-h-[24rem]"},hasChanges:{type:Boolean,default:void 0},contentPadding:{type:Boolean,default:!0}},emits:["update:modelValue","close"],setup(l,{emit:T}){const c=l,V=T,a=d(),n=d(!1),v=d(new Map);let s=null,i=null;const h=()=>{i&&(clearTimeout(i),i=null)},y=()=>a.value&&(a.value.querySelector("input")||a.value.querySelector("textarea")||a.value.querySelector("select")||a.value.querySelector("[contenteditable]")||a.value.querySelector(".monaco-editor")),q=()=>{if(!a.value)return;a.value.querySelectorAll(".monaco-editor-container").forEach(t=>{const o=t.__monacoEditor;if(o&&typeof o.getValue=="function"){const k=o.getValue();v.value.set(t,k)}})},M=()=>{if(!a.value)return!1;const e=a.value.querySelectorAll(".monaco-editor-container");for(const t of e){const o=t.__monacoEditor;if(o&&typeof o.getValue=="function"){const k=o.getValue(),B=v.value.get(t);if(B===void 0||(o.getRawOptions?.()||{}).readOnly===!0)continue;if(k!==B)return!0}}return!1},I=e=>{const t=e;return t.type==="checkbox"||t.type==="radio"?t.checked!==t.defaultChecked:(t.tagName==="SELECT",t.value!==t.defaultValue)},$=()=>{if(c.hasChanges!==void 0)return c.hasChanges;if(!a.value)return!1;if(M())return!0;const e=a.value.querySelectorAll("input, textarea, select");for(const t of e)if(I(t))return!0;return!1},A=()=>{y()&&$()?n.value=!0:u()},u=()=>{V("update:modelValue",!1),V("close")},D=()=>{n.value=!1,u()},L=()=>{n.value=!1},p=e=>{e.key==="Escape"&&c.modelValue&&(y()||u())};z(()=>c.modelValue,async e=>{e?(document.addEventListener("keydown",p),s=Z(),await K(),h(),i=setTimeout(()=>{q()},100)):(document.removeEventListener("keydown",p),s?.(),s=null,h(),v.value.clear())}),H(()=>{document.removeEventListener("keydown",p),s?.(),s=null,h()});const g=d(!1),N=e=>{g.value=e.target===e.currentTarget},U=e=>{e.target===e.currentTarget&&g.value&&(y()||u()),g.value=!1};return(e,t)=>(f(),O(R,{to:"body"},[r(S,{"enter-active-class":"transition-opacity duration-200","enter-from-class":"opacity-0","enter-to-class":"opacity-100","leave-active-class":"transition-opacity duration-200","leave-from-class":"opacity-100","leave-to-class":"opacity-0"},{default:C(()=>[l.modelValue?(f(),w("div",{key:0,class:"fixed inset-0 z-50 flex items-center justify-center p-4 bg-white/80 dark:bg-black/80 backdrop-blur-sm dark:text-white",onMousedown:N,onClick:U},[r(S,{"enter-active-class":"transition-all duration-200","enter-from-class":"opacity-0 scale-95","enter-to-class":"opacity-100 scale-100","leave-active-class":"transition-all duration-200","leave-from-class":"opacity-100 scale-100","leave-to-class":"opacity-0 scale-95"},{default:C(()=>[l.modelValue?(f(),w("div",{key:0,class:x(["w-full",l.width,"max-h-[85vh] flex flex-col"])},[r(P,{"offset-x":8,"offset-y":8,intensity:.35},{default:C(()=>[m("div",{ref_key:"modalRef",ref:a,class:x(["bg-white dark:bg-neutral-900 border border-neutral-300 dark:border-neutral-600 rounded-lg flex flex-col max-h-[85vh]",l.minHeight])},[m("div",G,[m("h2",Q,F(l.title),1),r(E(X),{icon:E(J),label:"Close modal",variant:"ghost",onClick:A},null,8,["icon"])]),m("div",{class:x(["flex-1 min-h-0",l.contentPadding?"overflow-y-auto p-6":"overflow-hidden flex flex-col"])},[_(e.$slots,"default")],2),e.$slots.footer?(f(),w("div",W,[_(e.$slots,"footer")])):b("",!0)],2)]),_:3})],2)):b("",!0)]),_:3})],32)):b("",!0)]),_:3}),r(Y,{modelValue:n.value,"onUpdate:modelValue":t[0]||(t[0]=o=>n.value=o),title:"Unsaved Changes",message:"You have unsaved changes that will be lost. Are you sure you want to close?","confirm-text":"Close Anyway","cancel-text":"Keep Editing",onConfirm:D,onCancel:L},null,8,["modelValue"])]))}});export{le as _};
@@ -1 +1 @@
1
- import{d as K,c as C,O as q,b,e as d,f as v,q as M,j as x,J as $,aj as R,z as T,k as F,s as G,u as I,r as u,w as te,B as Be,a5 as Ue,ao as Ee,L as Ae,m as Fe,_ as Je}from"./vue.js";import{_ as Re}from"./Modal.vue_vue_type_script_setup_true_lang.js";import{a7 as xe,a8 as Ke,_ as fe,a9 as be,B as ze,aa as Ie,ab as qe,ac as _e,ad as W,U as Le,a as E,ae as oe,af as De,ag as ye,ah as He}from"./index.js";const We={class:"space-y-3"},Ge={class:"flex items-center justify-between"},Qe={key:0,class:"text-sm text-neutral-500 dark:text-neutral-400"},Xe={key:1,class:"space-y-3"},Ye={class:"grid grid-cols-2 gap-x-4 gap-y-2"},Ze={class:"grid grid-cols-2 gap-4"},el=K({__name:"ModelCapabilitiesSection",props:{capabilities:{},detectedCapabilities:{},loadingCapabilities:{type:Boolean}},emits:["update:capabilities","reset"],setup(t,{emit:w}){const g=t,s=w,c=p=>C({get:()=>g.capabilities[p],set:i=>{const V=typeof g.capabilities[p]=="boolean"?!!i:Number(i||0);s("update:capabilities",{...g.capabilities,[p]:V})}}),f=c("supportsImages"),e=c("supportsToolCalls"),a=c("supportsStreaming"),y=c("supportsJsonMode"),h=c("maxContextTokens"),O=c("maxOutputTokens");return(p,i)=>{const V=q("FormKit");return d(),b("div",We,[v("div",Ge,[i[7]||(i[7]=v("label",{class:"block text-sm font-medium"},"Model Capabilities",-1)),t.detectedCapabilities?(d(),b("button",{key:0,onClick:i[0]||(i[0]=m=>s("reset")),type:"button",class:"text-xs text-accent-600 dark:text-accent-400 hover:underline"}," Reset to detected ")):M("",!0)]),i[8]||(i[8]=v("p",{class:"text-xs text-neutral-500 dark:text-neutral-400 -mt-1"}," Auto-detected from the provider. Override if needed. ",-1)),t.loadingCapabilities?(d(),b("div",Qe," Detecting capabilities... ")):(d(),b("div",Xe,[v("div",Ye,[x(V,{type:"checkbox",name:"supports_images",modelValue:$(f),"onUpdate:modelValue":i[1]||(i[1]=m=>R(f)?f.value=m:null),label:"Vision/Images"},null,8,["modelValue"]),x(V,{type:"checkbox",name:"supports_tool_calls",modelValue:$(e),"onUpdate:modelValue":i[2]||(i[2]=m=>R(e)?e.value=m:null),label:"Tool Calls"},null,8,["modelValue"]),x(V,{type:"checkbox",name:"supports_streaming",modelValue:$(a),"onUpdate:modelValue":i[3]||(i[3]=m=>R(a)?a.value=m:null),label:"Streaming"},null,8,["modelValue"]),x(V,{type:"checkbox",name:"supports_json_mode",modelValue:$(y),"onUpdate:modelValue":i[4]||(i[4]=m=>R(y)?y.value=m:null),label:"JSON Mode"},null,8,["modelValue"])]),v("div",Ze,[x(V,{type:"unit",name:"max_context_tokens",modelValue:$(h),"onUpdate:modelValue":i[5]||(i[5]=m=>R(h)?h.value=m:null),label:"Max Context Tokens",placeholder:"e.g., 128,000",unit:"",decimals:"0",step:"1000",min:"0"},null,8,["modelValue"]),x(V,{type:"unit",name:"max_output_tokens",modelValue:$(O),"onUpdate:modelValue":i[6]||(i[6]=m=>R(O)?O.value=m:null),label:"Max Output Tokens",placeholder:"e.g., 16,384",unit:"",decimals:"0",step:"1000",min:"0"},null,8,["modelValue"])])]))])}}}),ll={class:"space-y-3"},al=K({__name:"ModelFallbacksSection",props:{fallbackModels:{},configuredModelOptions:{},loadingConfiguredModels:{type:Boolean}},emits:["update:fallbackModels"],setup(t,{emit:w}){const g=t,s=w,c=C({get:()=>g.fallbackModels,set:f=>s("update:fallbackModels",f)});return(f,e)=>{const a=q("FormKit");return d(),b("div",ll,[e[1]||(e[1]=v("label",{class:"block text-sm font-medium"},"Fallback Models",-1)),e[2]||(e[2]=v("p",{class:"text-xs text-neutral-500 dark:text-neutral-400 -mt-1"}," Used in order if the primary model fails. ",-1)),x(a,{type:"sortableMultiSelect",name:"fallbacks",modelValue:c.value,"onUpdate:modelValue":e[0]||(e[0]=y=>c.value=y),options:t.configuredModelOptions,loading:t.loadingConfiguredModels,placeholder:"Add fallback model...","search-placeholder":"Search models...","add-label":"Add another model","rich-row-component":xe},null,8,["modelValue","options","loading"])])}}}),tl={class:"flex items-center justify-between gap-4"},ol={key:1},sl={class:"flex gap-2"},ge=K({__name:"ModelModalFooter",props:{readonly:{type:Boolean},formSubmitted:{type:Boolean},formValid:{type:Boolean},saving:{type:Boolean},isEditMode:{type:Boolean}},emits:["cancel"],setup(t,{emit:w}){const g=w;return(s,c)=>(d(),b("div",tl,[!t.readonly&&t.formSubmitted&&!t.formValid?(d(),T($(Ke),{key:0},{default:F(()=>[...c[1]||(c[1]=[G(" Please fix the errors above before submitting. ",-1)])]),_:1})):(d(),b("div",ol)),v("div",sl,[x($(fe),{variant:"ghost",size:"sm",disabled:t.saving,onClick:c[0]||(c[0]=f=>g("cancel"))},{default:F(()=>[G(I(t.readonly?"Close":"Cancel"),1)]),_:1},8,["disabled"]),t.readonly?M("",!0):(d(),T($(fe),{key:0,variant:"primary",size:"sm",disabled:t.saving,loading:t.saving,type:"submit",form:"model-form"},{default:F(()=>[G(I(t.isEditMode?"Update Model":"Add Model"),1)]),_:1},8,["disabled","loading"]))])]))}}),il={class:"space-y-3"},nl={class:"flex items-center justify-between"},dl={key:0,class:"flex gap-2"},ul={key:0,class:"flex items-center gap-2 py-4"},rl={key:1,class:"py-4 text-sm text-neutral-500 dark:text-neutral-400"},vl=K({__name:"ModelOpenRouterEndpointsSection",props:{endpoints:{},selectedEndpoints:{},loading:{type:Boolean}},emits:["selectAll","clear","update:selectedEndpoints"],setup(t,{emit:w}){const g=t,s=w,c=C({get:()=>g.selectedEndpoints,set:e=>s("update:selectedEndpoints",e)}),f=C(()=>g.endpoints.map(e=>({value:e.id,label:e.name,badge:e.quantization&&e.quantization!=="unknown"?e.quantization:void 0,meta:[`Input: ${be(e.pricing.prompt)}`,`Output: ${be(e.pricing.completion)}`,e.maxPromptTokens?`Max prompt: ${e.maxPromptTokens.toLocaleString()}`:"",e.maxCompletionTokens?`Max output: ${e.maxCompletionTokens.toLocaleString()}`:""].filter(Boolean)})));return(e,a)=>{const y=q("FormKit");return d(),b("div",il,[v("div",nl,[a[4]||(a[4]=v("label",{class:"block text-sm font-medium"},"Available Providers",-1)),t.endpoints.length>0?(d(),b("div",dl,[v("button",{type:"button",onClick:a[0]||(a[0]=h=>s("selectAll")),class:"text-xs text-accent-600 dark:text-accent-400 hover:underline"}," Select all "),a[3]||(a[3]=v("span",{class:"text-xs text-neutral-300 dark:text-neutral-600"},"|",-1)),v("button",{type:"button",onClick:a[1]||(a[1]=h=>s("clear")),class:"text-xs text-accent-600 dark:text-accent-400 hover:underline"}," Clear ")])):M("",!0)]),a[6]||(a[6]=v("p",{class:"text-xs text-neutral-500 dark:text-neutral-400 -mt-1"}," OpenRouter routes to the cheapest available provider. ",-1)),t.loading?(d(),b("div",ul,[x(ze,{class:"w-4 h-4"}),a[5]||(a[5]=v("span",{class:"text-sm text-neutral-500 dark:text-neutral-400"},"Loading providers...",-1))])):t.endpoints.length===0?(d(),b("div",rl," No providers available for this model ")):(d(),T(y,{key:2,type:"selectableCardList",name:"included_providers",modelValue:c.value,"onUpdate:modelValue":a[2]||(a[2]=h=>c.value=h),options:f.value,"empty-message":"No providers available for this model.","outer-class":"$reset"},null,8,["modelValue","options"]))])}}}),cl={key:0,class:"space-y-3"},ml={key:0,class:"text-sm text-neutral-500 dark:text-neutral-400"},pl=K({__name:"ModelProviderToolsSection",props:{tools:{},selectedTools:{},loading:{type:Boolean}},emits:["update:selectedTools"],setup(t,{emit:w}){const g=t,s=w,c=C({get:()=>g.selectedTools,set:e=>s("update:selectedTools",e)}),f=C(()=>g.tools.map(e=>({value:e.name,label:e.name,description:e.description,warning:e.tenvs&&e.tenvs.length>0?`Requires: ${e.tenvs.filter(a=>a.required).map(a=>a.name).join(", ")||"none (optional config available)"}`:void 0})));return(e,a)=>{const y=q("FormKit");return t.tools.length>0?(d(),b("div",cl,[a[1]||(a[1]=v("label",{class:"block text-sm font-medium"},"Provider Tools",-1)),a[2]||(a[2]=v("p",{class:"text-xs text-neutral-500 dark:text-neutral-400 -mt-1"}," Built-in tools available for this model. ",-1)),t.loading?(d(),b("div",ml," Loading provider tools... ")):(d(),T(y,{key:1,type:"selectableCardList",name:"provider_tools",modelValue:c.value,"onUpdate:modelValue":a[0]||(a[0]=h=>c.value=h),options:f.value,"outer-class":"$reset"},null,8,["modelValue","options"]))])):M("",!0)}}}),fl={key:0,class:"flex items-start justify-between gap-3 border-b border-neutral-200 px-5 py-3 dark:border-neutral-700"},bl={class:"min-w-0"},yl={class:"text-[10px] font-bold uppercase tracking-[0.18em] text-neutral-400 dark:text-neutral-500"},gl={class:"text-sm font-semibold text-neutral-900 dark:text-neutral-100"},xl=["disabled"],kl={class:"space-y-4"},Ml={key:0},hl={key:1},Cl={class:"px-1 py-0.5 bg-neutral-100 dark:bg-neutral-800 rounded"},Vl={key:1,class:"flex items-center justify-between gap-4 border-t border-neutral-200 px-5 py-3 dark:border-neutral-700"},$l=K({__name:"ModelModal",props:{modelValue:{type:Boolean},editModel:{},mode:{default:"add"},readonly:{type:Boolean,default:!1},saving:{type:Boolean,default:!1},inline:{type:Boolean,default:!1}},emits:["update:modelValue","save"],setup(t,{expose:w,emit:g}){const s=t,c=g,f=u([]),e=u(""),a=u(""),y=u({}),h=u(!1),O=u(!1),p=u([]),i=u([]),V=u(!1),m=u(ye()),J=u(null),Q=u(!1),j=u([]),k=u([]),X=u(!1),Y=u([]),Z=u(!1),ke=C(()=>Y.value.map(Ie)),Me=async()=>{Z.value=!0;try{const l=await fetch(E("/api/models"));if(l.ok){const o=await l.json();Y.value=o.models||[]}}catch{Y.value=[]}finally{Z.value=!1}},B=u([]),S=C(()=>s.mode==="edit"),_=u(null),L=u(!0),D=u(!1),he=l=>{_.value=l,l.on("commit",()=>{L.value=l.context?.state.valid??!0,D.value=l.context?.state.submitted??!1})},ee=u(""),N=u(""),se=C({get:()=>N.value,set:l=>{N.value=qe(l)}}),A=u(!1),P=u(null),Ce=C(()=>f.value.filter(l=>l.hasApiKey).map(_e)),ie=l=>{if(!l.length)return;const o={...y.value};for(const r of l)o[r.value]=r;y.value=o},ne=l=>y.value[l],Ve=C(()=>Object.values(y.value).map(l=>W(l,e.value))),we=C(()=>!S.value||!P.value||A.value?!1:N.value!==P.value.name||e.value!==P.value.provider||a.value!==P.value.model||JSON.stringify(i.value.sort())!==JSON.stringify(P.value.endpoints.sort())||JSON.stringify(B.value)!==JSON.stringify(P.value.fallbacks)||JSON.stringify(m.value)!==JSON.stringify(P.value.capabilities)||JSON.stringify(k.value.sort())!==JSON.stringify(P.value.providerTools.sort())),de=C(()=>f.value.find(o=>o.name===e.value)?.sdk==="openrouter"),ue=async()=>{h.value=!0;try{const l=await fetch(E("/api/providers"));if(l.ok){const o=await l.json();f.value=o.providers||[]}}catch{f.value=[]}finally{h.value=!1}},Se=async l=>{if(!e.value)return[];O.value=!0;try{const o=await fetch(E("/api/models/available"),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({provider:e.value,search:l?.search||void 0,page:l?.page||1,perPage:25})});if(!o.ok)return[];const r=await o.json(),n=r.models||[];return ie(n),r.hasNextPage&&typeof l?.hasNextPage=="function"&&l.hasNextPage(),n.map(U=>W(U,e.value))}catch{return[]}finally{O.value=!1}},re=async l=>{const o=ne(l);if(o)return W(o,e.value);if(!e.value||!l)return null;O.value=!0;try{const r=await fetch(E("/api/models/available"),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({provider:e.value,search:l,page:1,perPage:25})});if(!r.ok)return null;const U=(await r.json()).models||[];ie(U);const H=U.find(z=>z.value===l)||U.find(z=>z.slug===l)||U.find(z=>z.label===l);return H?W(H,e.value):null}catch{return null}finally{O.value=!1}},ve=async()=>{if(!(!e.value||!a.value)){Q.value=!0;try{const l=await fetch(E("/api/models/capabilities"),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({provider:e.value,modelId:a.value})});if(l.ok){const o=await l.json();o.capabilities&&(J.value=o.capabilities,m.value=oe(o.capabilities))}}catch{J.value=null}finally{Q.value=!1}}},ce=async()=>{if(!e.value||!a.value){j.value=[],k.value=[];return}X.value=!0;try{const l=await fetch(E(`/api/providers/${e.value}/tools?model=${encodeURIComponent(a.value)}`));if(l.ok){const o=await l.json();if(j.value=o.tools||[],!S.value)k.value=j.value.map(r=>r.name);else{const r=new Set(j.value.map(n=>n.name));k.value=k.value.filter(n=>r.has(n))}}else j.value=[],k.value=[]}catch{j.value=[],k.value=[]}finally{X.value=!1}},me=()=>{m.value=ye(),J.value=null},Te=()=>{i.value=p.value.map(l=>l.id)},$e=()=>{i.value=[]},Oe=()=>{J.value&&(m.value=oe(J.value))},le=()=>{N.value="",ee.value="",e.value="",a.value="",y.value={},B.value=[],p.value=[],i.value=[],j.value=[],k.value=[],me(),P.value=null,A.value=!1,L.value=!0,D.value=!1,_.value?.reset()},Ne=async()=>{if(s.editModel){A.value=!0;try{await ue(),N.value=s.editModel.name||"",ee.value=s.editModel.name||"",e.value=s.editModel.provider_id||s.editModel.provider,a.value=s.editModel.model,await pe(),s.editModel.included_providers&&s.editModel.included_providers.length>0&&(i.value=s.editModel.included_providers),await Pe(),s.editModel.capabilities?m.value=oe(s.editModel.capabilities):await ve(),await ce(),s.editModel.providerTools&&Array.isArray(s.editModel.providerTools)&&(k.value=s.editModel.providerTools),P.value={name:N.value,provider:e.value,model:a.value,endpoints:[...i.value],fallbacks:[...B.value],capabilities:{...m.value},providerTools:[...k.value]}}finally{A.value=!1}}};te(()=>s.modelValue,async l=>{l?(Me(),S.value&&s.editModel?await Ne():(await ue(),le())):le()});const Pe=async()=>{if(s.editModel?.id){if(s.editModel.fallbacks&&Array.isArray(s.editModel.fallbacks)){B.value=He(s.editModel.fallbacks);return}try{const l=await fetch(E(`/api/models/${encodeURIComponent(s.editModel.id)}/fallbacks`));if(l.ok){const o=await l.json();B.value=(o.fallbacks||[]).map(r=>r.fallback_model_id)}}catch{B.value=[]}}};te(e,async(l,o)=>{A.value||S.value&&!o&&l===(s.editModel?.provider_id||s.editModel?.provider)||(a.value="",y.value={},p.value=[],i.value=[],e.value&&(O.value=!1))});const pe=async()=>{if(!a.value||!e.value){p.value=[];return}const l=f.value.find(n=>n.name===e.value);if(!l||l.sdk!=="openrouter"){p.value=[];return}const r=(ne(a.value)||await re(a.value))?.slug||(a.value.includes("/")?a.value:void 0);if(!r){p.value=[];return}V.value=!0;try{const n=await fetch(E("/api/models/endpoints"),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({provider:e.value,modelSlug:r})});if(n.ok){const U=await n.json();p.value=U.endpoints||[],S.value||(i.value=p.value.map(H=>H.id))}else p.value=[]}catch{p.value=[]}finally{V.value=!1}};te(a,async(l,o)=>{A.value||S.value&&!o&&l===s.editModel?.model||(a.value?(await pe(),await ve(),await ce(),o&&l!==o&&(i.value=p.value.map(r=>r.id))):(p.value=[],i.value=[],j.value=[],k.value=[],me()))});const je=()=>{c("save",De({isEditMode:S.value,editModel:s.editModel,originalName:ee.value,modelName:N.value,selectedModel:a.value,selectedProvider:e.value,isOpenRouter:de.value,selectedEndpoints:i.value,fallbackModels:B.value,capabilities:m.value,selectedProviderTools:k.value}))};w({formNode:_});const ae=()=>{le(),c("update:modelValue",!1)};return(l,o)=>{const r=q("FormKit");return d(),T(Be(t.inline?"div":Re),Ue(t.inline?{class:"flex max-h-[80vh] w-[576px] flex-col overflow-hidden rounded-xl border border-neutral-200 bg-white shadow-lg dark:border-neutral-700 dark:bg-neutral-950"}:{modelValue:t.modelValue,title:S.value?"Edit Model":"Add Model",width:"max-w-2xl",minHeight:"min-h-[36rem]",hasChanges:we.value},Ee(t.inline?{}:{"update:modelValue":n=>l.$emit("update:modelValue",n)})),Ae({default:F(()=>[t.inline?(d(),b("div",fl,[v("div",bl,[v("div",yl,I(t.editModel?.name||t.editModel?.id||"Model"),1),v("h2",gl,I(S.value?"Edit Model":"Add Model"),1)]),v("button",{type:"button",class:"shrink-0 rounded-md border border-neutral-200 px-2.5 py-1 text-xs font-medium text-neutral-500 transition-colors hover:border-neutral-300 hover:text-neutral-800 dark:border-neutral-700 dark:text-neutral-400 dark:hover:border-neutral-500 dark:hover:text-neutral-100",disabled:t.saving,onClick:ae}," Cancel ",8,xl)])):M("",!0),v("div",{class:Fe(t.inline?"min-h-0 flex-1 overflow-y-auto p-5":"")},[x(r,{type:"form",id:"model-form",actions:!1,disabled:t.readonly||t.saving||A.value,onSubmit:je,onNode:he},{default:F(()=>[v("div",kl,[x(r,{type:"autocomplete",name:"provider",modelValue:e.value,"onUpdate:modelValue":o[0]||(o[0]=n=>e.value=n),options:Ce.value,label:"Provider",placeholder:"Search providers...",disabled:h.value,validation:"required","validation-visibility":"submit","selection-removable":""},null,8,["modelValue","options","disabled"]),e.value?(d(),b("div",Ml,[x(r,{type:"selectSearch",name:"model",modelValue:a.value,"onUpdate:modelValue":o[1]||(o[1]=n=>a.value=n),options:Ve.value,"options-loader":Se,"option-loader":re,"load-on-scroll":"","search-debounce":150,label:"Model",placeholder:"Select a model","search-placeholder":"Search models...",loading:O.value,"rich-row-component":xe,validation:"required","validation-visibility":"submit"},null,8,["modelValue","options","loading"])])):M("",!0),a.value?(d(),b("div",hl,[x(r,{type:"text",name:"name",modelValue:se.value,"onUpdate:modelValue":o[2]||(o[2]=n=>se.value=n),label:"Name",placeholder:"e.g., coding_model, planning_model, fast_response",validation:"required|snakeCase","validation-visibility":"blur",help:N.value?void 0:"A descriptive name for this model. This becomes the filename and reference ID."},null,8,["modelValue","help"]),N.value?(d(),T($(Le),{key:0,class:"mt-1"},{default:F(()=>[o[7]||(o[7]=G(" Will be saved as: ",-1)),v("code",Cl,I(N.value),1)]),_:1})):M("",!0)])):M("",!0),a.value?(d(),T(el,{key:2,capabilities:m.value,"onUpdate:capabilities":o[3]||(o[3]=n=>m.value=n),"detected-capabilities":J.value,"loading-capabilities":Q.value,onReset:Oe},null,8,["capabilities","detected-capabilities","loading-capabilities"])):M("",!0),a.value?(d(),T(pl,{key:3,"selected-tools":k.value,"onUpdate:selectedTools":o[4]||(o[4]=n=>k.value=n),tools:j.value,loading:X.value},null,8,["selected-tools","tools","loading"])):M("",!0),a.value&&de.value?(d(),T(vl,{key:4,endpoints:p.value,"selected-endpoints":i.value,"onUpdate:selectedEndpoints":o[5]||(o[5]=n=>i.value=n),loading:V.value,onSelectAll:Te,onClear:$e},null,8,["endpoints","selected-endpoints","loading"])):M("",!0),a.value?(d(),T(al,{key:5,"fallback-models":B.value,"onUpdate:fallbackModels":o[6]||(o[6]=n=>B.value=n),"configured-model-options":ke.value,"loading-configured-models":Z.value},null,8,["fallback-models","configured-model-options","loading-configured-models"])):M("",!0),t.readonly?M("",!0):(d(),T($(Je),{key:6,node:_.value||void 0},null,8,["node"]))])]),_:1},8,["disabled"])],2),t.inline?(d(),b("div",Vl,[x(ge,{readonly:t.readonly,"form-submitted":D.value,"form-valid":L.value,saving:t.saving,"is-edit-mode":S.value,onCancel:ae},null,8,["readonly","form-submitted","form-valid","saving","is-edit-mode"])])):M("",!0)]),_:2},[t.inline?void 0:{name:"footer",fn:F(()=>[x(ge,{readonly:t.readonly,"form-submitted":D.value,"form-valid":L.value,saving:t.saving,"is-edit-mode":S.value,onCancel:ae},null,8,["readonly","form-submitted","form-valid","saving","is-edit-mode"])]),key:"0"}]),1040)}}});export{$l as _};
1
+ import{d as K,c as C,O as q,b,e as d,f as v,q as M,j as x,J as $,aj as R,z as T,k as F,s as G,u as I,r as u,w as te,B as Be,a5 as Ue,ao as Ee,L as Ae,m as Fe,_ as Je}from"./vue.js";import{_ as Re}from"./Modal.vue_vue_type_script_setup_true_lang.js";import{a7 as xe,a8 as Ke,_ as fe,a9 as be,B as ze,aa as Ie,ab as qe,ac as _e,ad as W,U as Le,b as E,ae as oe,af as De,ag as ye,ah as He}from"./index.js";const We={class:"space-y-3"},Ge={class:"flex items-center justify-between"},Qe={key:0,class:"text-sm text-neutral-500 dark:text-neutral-400"},Xe={key:1,class:"space-y-3"},Ye={class:"grid grid-cols-2 gap-x-4 gap-y-2"},Ze={class:"grid grid-cols-2 gap-4"},el=K({__name:"ModelCapabilitiesSection",props:{capabilities:{},detectedCapabilities:{},loadingCapabilities:{type:Boolean}},emits:["update:capabilities","reset"],setup(t,{emit:w}){const g=t,s=w,c=p=>C({get:()=>g.capabilities[p],set:i=>{const V=typeof g.capabilities[p]=="boolean"?!!i:Number(i||0);s("update:capabilities",{...g.capabilities,[p]:V})}}),f=c("supportsImages"),e=c("supportsToolCalls"),a=c("supportsStreaming"),y=c("supportsJsonMode"),h=c("maxContextTokens"),O=c("maxOutputTokens");return(p,i)=>{const V=q("FormKit");return d(),b("div",We,[v("div",Ge,[i[7]||(i[7]=v("label",{class:"block text-sm font-medium"},"Model Capabilities",-1)),t.detectedCapabilities?(d(),b("button",{key:0,onClick:i[0]||(i[0]=m=>s("reset")),type:"button",class:"text-xs text-accent-600 dark:text-accent-400 hover:underline"}," Reset to detected ")):M("",!0)]),i[8]||(i[8]=v("p",{class:"text-xs text-neutral-500 dark:text-neutral-400 -mt-1"}," Auto-detected from the provider. Override if needed. ",-1)),t.loadingCapabilities?(d(),b("div",Qe," Detecting capabilities... ")):(d(),b("div",Xe,[v("div",Ye,[x(V,{type:"checkbox",name:"supports_images",modelValue:$(f),"onUpdate:modelValue":i[1]||(i[1]=m=>R(f)?f.value=m:null),label:"Vision/Images"},null,8,["modelValue"]),x(V,{type:"checkbox",name:"supports_tool_calls",modelValue:$(e),"onUpdate:modelValue":i[2]||(i[2]=m=>R(e)?e.value=m:null),label:"Tool Calls"},null,8,["modelValue"]),x(V,{type:"checkbox",name:"supports_streaming",modelValue:$(a),"onUpdate:modelValue":i[3]||(i[3]=m=>R(a)?a.value=m:null),label:"Streaming"},null,8,["modelValue"]),x(V,{type:"checkbox",name:"supports_json_mode",modelValue:$(y),"onUpdate:modelValue":i[4]||(i[4]=m=>R(y)?y.value=m:null),label:"JSON Mode"},null,8,["modelValue"])]),v("div",Ze,[x(V,{type:"unit",name:"max_context_tokens",modelValue:$(h),"onUpdate:modelValue":i[5]||(i[5]=m=>R(h)?h.value=m:null),label:"Max Context Tokens",placeholder:"e.g., 128,000",unit:"",decimals:"0",step:"1000",min:"0"},null,8,["modelValue"]),x(V,{type:"unit",name:"max_output_tokens",modelValue:$(O),"onUpdate:modelValue":i[6]||(i[6]=m=>R(O)?O.value=m:null),label:"Max Output Tokens",placeholder:"e.g., 16,384",unit:"",decimals:"0",step:"1000",min:"0"},null,8,["modelValue"])])]))])}}}),ll={class:"space-y-3"},al=K({__name:"ModelFallbacksSection",props:{fallbackModels:{},configuredModelOptions:{},loadingConfiguredModels:{type:Boolean}},emits:["update:fallbackModels"],setup(t,{emit:w}){const g=t,s=w,c=C({get:()=>g.fallbackModels,set:f=>s("update:fallbackModels",f)});return(f,e)=>{const a=q("FormKit");return d(),b("div",ll,[e[1]||(e[1]=v("label",{class:"block text-sm font-medium"},"Fallback Models",-1)),e[2]||(e[2]=v("p",{class:"text-xs text-neutral-500 dark:text-neutral-400 -mt-1"}," Used in order if the primary model fails. ",-1)),x(a,{type:"sortableMultiSelect",name:"fallbacks",modelValue:c.value,"onUpdate:modelValue":e[0]||(e[0]=y=>c.value=y),options:t.configuredModelOptions,loading:t.loadingConfiguredModels,placeholder:"Add fallback model...","search-placeholder":"Search models...","add-label":"Add another model","rich-row-component":xe},null,8,["modelValue","options","loading"])])}}}),tl={class:"flex items-center justify-between gap-4"},ol={key:1},sl={class:"flex gap-2"},ge=K({__name:"ModelModalFooter",props:{readonly:{type:Boolean},formSubmitted:{type:Boolean},formValid:{type:Boolean},saving:{type:Boolean},isEditMode:{type:Boolean}},emits:["cancel"],setup(t,{emit:w}){const g=w;return(s,c)=>(d(),b("div",tl,[!t.readonly&&t.formSubmitted&&!t.formValid?(d(),T($(Ke),{key:0},{default:F(()=>[...c[1]||(c[1]=[G(" Please fix the errors above before submitting. ",-1)])]),_:1})):(d(),b("div",ol)),v("div",sl,[x($(fe),{variant:"ghost",size:"sm",disabled:t.saving,onClick:c[0]||(c[0]=f=>g("cancel"))},{default:F(()=>[G(I(t.readonly?"Close":"Cancel"),1)]),_:1},8,["disabled"]),t.readonly?M("",!0):(d(),T($(fe),{key:0,variant:"primary",size:"sm",disabled:t.saving,loading:t.saving,type:"submit",form:"model-form"},{default:F(()=>[G(I(t.isEditMode?"Update Model":"Add Model"),1)]),_:1},8,["disabled","loading"]))])]))}}),il={class:"space-y-3"},nl={class:"flex items-center justify-between"},dl={key:0,class:"flex gap-2"},ul={key:0,class:"flex items-center gap-2 py-4"},rl={key:1,class:"py-4 text-sm text-neutral-500 dark:text-neutral-400"},vl=K({__name:"ModelOpenRouterEndpointsSection",props:{endpoints:{},selectedEndpoints:{},loading:{type:Boolean}},emits:["selectAll","clear","update:selectedEndpoints"],setup(t,{emit:w}){const g=t,s=w,c=C({get:()=>g.selectedEndpoints,set:e=>s("update:selectedEndpoints",e)}),f=C(()=>g.endpoints.map(e=>({value:e.id,label:e.name,badge:e.quantization&&e.quantization!=="unknown"?e.quantization:void 0,meta:[`Input: ${be(e.pricing.prompt)}`,`Output: ${be(e.pricing.completion)}`,e.maxPromptTokens?`Max prompt: ${e.maxPromptTokens.toLocaleString()}`:"",e.maxCompletionTokens?`Max output: ${e.maxCompletionTokens.toLocaleString()}`:""].filter(Boolean)})));return(e,a)=>{const y=q("FormKit");return d(),b("div",il,[v("div",nl,[a[4]||(a[4]=v("label",{class:"block text-sm font-medium"},"Available Providers",-1)),t.endpoints.length>0?(d(),b("div",dl,[v("button",{type:"button",onClick:a[0]||(a[0]=h=>s("selectAll")),class:"text-xs text-accent-600 dark:text-accent-400 hover:underline"}," Select all "),a[3]||(a[3]=v("span",{class:"text-xs text-neutral-300 dark:text-neutral-600"},"|",-1)),v("button",{type:"button",onClick:a[1]||(a[1]=h=>s("clear")),class:"text-xs text-accent-600 dark:text-accent-400 hover:underline"}," Clear ")])):M("",!0)]),a[6]||(a[6]=v("p",{class:"text-xs text-neutral-500 dark:text-neutral-400 -mt-1"}," OpenRouter routes to the cheapest available provider. ",-1)),t.loading?(d(),b("div",ul,[x(ze,{class:"w-4 h-4"}),a[5]||(a[5]=v("span",{class:"text-sm text-neutral-500 dark:text-neutral-400"},"Loading providers...",-1))])):t.endpoints.length===0?(d(),b("div",rl," No providers available for this model ")):(d(),T(y,{key:2,type:"selectableCardList",name:"included_providers",modelValue:c.value,"onUpdate:modelValue":a[2]||(a[2]=h=>c.value=h),options:f.value,"empty-message":"No providers available for this model.","outer-class":"$reset"},null,8,["modelValue","options"]))])}}}),cl={key:0,class:"space-y-3"},ml={key:0,class:"text-sm text-neutral-500 dark:text-neutral-400"},pl=K({__name:"ModelProviderToolsSection",props:{tools:{},selectedTools:{},loading:{type:Boolean}},emits:["update:selectedTools"],setup(t,{emit:w}){const g=t,s=w,c=C({get:()=>g.selectedTools,set:e=>s("update:selectedTools",e)}),f=C(()=>g.tools.map(e=>({value:e.name,label:e.name,description:e.description,warning:e.tenvs&&e.tenvs.length>0?`Requires: ${e.tenvs.filter(a=>a.required).map(a=>a.name).join(", ")||"none (optional config available)"}`:void 0})));return(e,a)=>{const y=q("FormKit");return t.tools.length>0?(d(),b("div",cl,[a[1]||(a[1]=v("label",{class:"block text-sm font-medium"},"Provider Tools",-1)),a[2]||(a[2]=v("p",{class:"text-xs text-neutral-500 dark:text-neutral-400 -mt-1"}," Built-in tools available for this model. ",-1)),t.loading?(d(),b("div",ml," Loading provider tools... ")):(d(),T(y,{key:1,type:"selectableCardList",name:"provider_tools",modelValue:c.value,"onUpdate:modelValue":a[0]||(a[0]=h=>c.value=h),options:f.value,"outer-class":"$reset"},null,8,["modelValue","options"]))])):M("",!0)}}}),fl={key:0,class:"flex items-start justify-between gap-3 border-b border-neutral-200 px-5 py-3 dark:border-neutral-700"},bl={class:"min-w-0"},yl={class:"text-[10px] font-bold uppercase tracking-[0.18em] text-neutral-400 dark:text-neutral-500"},gl={class:"text-sm font-semibold text-neutral-900 dark:text-neutral-100"},xl=["disabled"],kl={class:"space-y-4"},Ml={key:0},hl={key:1},Cl={class:"px-1 py-0.5 bg-neutral-100 dark:bg-neutral-800 rounded"},Vl={key:1,class:"flex items-center justify-between gap-4 border-t border-neutral-200 px-5 py-3 dark:border-neutral-700"},$l=K({__name:"ModelModal",props:{modelValue:{type:Boolean},editModel:{},mode:{default:"add"},readonly:{type:Boolean,default:!1},saving:{type:Boolean,default:!1},inline:{type:Boolean,default:!1}},emits:["update:modelValue","save"],setup(t,{expose:w,emit:g}){const s=t,c=g,f=u([]),e=u(""),a=u(""),y=u({}),h=u(!1),O=u(!1),p=u([]),i=u([]),V=u(!1),m=u(ye()),J=u(null),Q=u(!1),j=u([]),k=u([]),X=u(!1),Y=u([]),Z=u(!1),ke=C(()=>Y.value.map(Ie)),Me=async()=>{Z.value=!0;try{const l=await fetch(E("/api/models"));if(l.ok){const o=await l.json();Y.value=o.models||[]}}catch{Y.value=[]}finally{Z.value=!1}},B=u([]),S=C(()=>s.mode==="edit"),_=u(null),L=u(!0),D=u(!1),he=l=>{_.value=l,l.on("commit",()=>{L.value=l.context?.state.valid??!0,D.value=l.context?.state.submitted??!1})},ee=u(""),N=u(""),se=C({get:()=>N.value,set:l=>{N.value=qe(l)}}),A=u(!1),P=u(null),Ce=C(()=>f.value.filter(l=>l.hasApiKey).map(_e)),ie=l=>{if(!l.length)return;const o={...y.value};for(const r of l)o[r.value]=r;y.value=o},ne=l=>y.value[l],Ve=C(()=>Object.values(y.value).map(l=>W(l,e.value))),we=C(()=>!S.value||!P.value||A.value?!1:N.value!==P.value.name||e.value!==P.value.provider||a.value!==P.value.model||JSON.stringify(i.value.sort())!==JSON.stringify(P.value.endpoints.sort())||JSON.stringify(B.value)!==JSON.stringify(P.value.fallbacks)||JSON.stringify(m.value)!==JSON.stringify(P.value.capabilities)||JSON.stringify(k.value.sort())!==JSON.stringify(P.value.providerTools.sort())),de=C(()=>f.value.find(o=>o.name===e.value)?.sdk==="openrouter"),ue=async()=>{h.value=!0;try{const l=await fetch(E("/api/providers"));if(l.ok){const o=await l.json();f.value=o.providers||[]}}catch{f.value=[]}finally{h.value=!1}},Se=async l=>{if(!e.value)return[];O.value=!0;try{const o=await fetch(E("/api/models/available"),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({provider:e.value,search:l?.search||void 0,page:l?.page||1,perPage:25})});if(!o.ok)return[];const r=await o.json(),n=r.models||[];return ie(n),r.hasNextPage&&typeof l?.hasNextPage=="function"&&l.hasNextPage(),n.map(U=>W(U,e.value))}catch{return[]}finally{O.value=!1}},re=async l=>{const o=ne(l);if(o)return W(o,e.value);if(!e.value||!l)return null;O.value=!0;try{const r=await fetch(E("/api/models/available"),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({provider:e.value,search:l,page:1,perPage:25})});if(!r.ok)return null;const U=(await r.json()).models||[];ie(U);const H=U.find(z=>z.value===l)||U.find(z=>z.slug===l)||U.find(z=>z.label===l);return H?W(H,e.value):null}catch{return null}finally{O.value=!1}},ve=async()=>{if(!(!e.value||!a.value)){Q.value=!0;try{const l=await fetch(E("/api/models/capabilities"),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({provider:e.value,modelId:a.value})});if(l.ok){const o=await l.json();o.capabilities&&(J.value=o.capabilities,m.value=oe(o.capabilities))}}catch{J.value=null}finally{Q.value=!1}}},ce=async()=>{if(!e.value||!a.value){j.value=[],k.value=[];return}X.value=!0;try{const l=await fetch(E(`/api/providers/${e.value}/tools?model=${encodeURIComponent(a.value)}`));if(l.ok){const o=await l.json();if(j.value=o.tools||[],!S.value)k.value=j.value.map(r=>r.name);else{const r=new Set(j.value.map(n=>n.name));k.value=k.value.filter(n=>r.has(n))}}else j.value=[],k.value=[]}catch{j.value=[],k.value=[]}finally{X.value=!1}},me=()=>{m.value=ye(),J.value=null},Te=()=>{i.value=p.value.map(l=>l.id)},$e=()=>{i.value=[]},Oe=()=>{J.value&&(m.value=oe(J.value))},le=()=>{N.value="",ee.value="",e.value="",a.value="",y.value={},B.value=[],p.value=[],i.value=[],j.value=[],k.value=[],me(),P.value=null,A.value=!1,L.value=!0,D.value=!1,_.value?.reset()},Ne=async()=>{if(s.editModel){A.value=!0;try{await ue(),N.value=s.editModel.name||"",ee.value=s.editModel.name||"",e.value=s.editModel.provider_id||s.editModel.provider,a.value=s.editModel.model,await pe(),s.editModel.included_providers&&s.editModel.included_providers.length>0&&(i.value=s.editModel.included_providers),await Pe(),s.editModel.capabilities?m.value=oe(s.editModel.capabilities):await ve(),await ce(),s.editModel.providerTools&&Array.isArray(s.editModel.providerTools)&&(k.value=s.editModel.providerTools),P.value={name:N.value,provider:e.value,model:a.value,endpoints:[...i.value],fallbacks:[...B.value],capabilities:{...m.value},providerTools:[...k.value]}}finally{A.value=!1}}};te(()=>s.modelValue,async l=>{l?(Me(),S.value&&s.editModel?await Ne():(await ue(),le())):le()});const Pe=async()=>{if(s.editModel?.id){if(s.editModel.fallbacks&&Array.isArray(s.editModel.fallbacks)){B.value=He(s.editModel.fallbacks);return}try{const l=await fetch(E(`/api/models/${encodeURIComponent(s.editModel.id)}/fallbacks`));if(l.ok){const o=await l.json();B.value=(o.fallbacks||[]).map(r=>r.fallback_model_id)}}catch{B.value=[]}}};te(e,async(l,o)=>{A.value||S.value&&!o&&l===(s.editModel?.provider_id||s.editModel?.provider)||(a.value="",y.value={},p.value=[],i.value=[],e.value&&(O.value=!1))});const pe=async()=>{if(!a.value||!e.value){p.value=[];return}const l=f.value.find(n=>n.name===e.value);if(!l||l.sdk!=="openrouter"){p.value=[];return}const r=(ne(a.value)||await re(a.value))?.slug||(a.value.includes("/")?a.value:void 0);if(!r){p.value=[];return}V.value=!0;try{const n=await fetch(E("/api/models/endpoints"),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({provider:e.value,modelSlug:r})});if(n.ok){const U=await n.json();p.value=U.endpoints||[],S.value||(i.value=p.value.map(H=>H.id))}else p.value=[]}catch{p.value=[]}finally{V.value=!1}};te(a,async(l,o)=>{A.value||S.value&&!o&&l===s.editModel?.model||(a.value?(await pe(),await ve(),await ce(),o&&l!==o&&(i.value=p.value.map(r=>r.id))):(p.value=[],i.value=[],j.value=[],k.value=[],me()))});const je=()=>{c("save",De({isEditMode:S.value,editModel:s.editModel,originalName:ee.value,modelName:N.value,selectedModel:a.value,selectedProvider:e.value,isOpenRouter:de.value,selectedEndpoints:i.value,fallbackModels:B.value,capabilities:m.value,selectedProviderTools:k.value}))};w({formNode:_});const ae=()=>{le(),c("update:modelValue",!1)};return(l,o)=>{const r=q("FormKit");return d(),T(Be(t.inline?"div":Re),Ue(t.inline?{class:"flex max-h-[80vh] w-[576px] flex-col overflow-hidden rounded-xl border border-neutral-200 bg-white shadow-lg dark:border-neutral-700 dark:bg-neutral-950"}:{modelValue:t.modelValue,title:S.value?"Edit Model":"Add Model",width:"max-w-2xl",minHeight:"min-h-[36rem]",hasChanges:we.value},Ee(t.inline?{}:{"update:modelValue":n=>l.$emit("update:modelValue",n)})),Ae({default:F(()=>[t.inline?(d(),b("div",fl,[v("div",bl,[v("div",yl,I(t.editModel?.name||t.editModel?.id||"Model"),1),v("h2",gl,I(S.value?"Edit Model":"Add Model"),1)]),v("button",{type:"button",class:"shrink-0 rounded-md border border-neutral-200 px-2.5 py-1 text-xs font-medium text-neutral-500 transition-colors hover:border-neutral-300 hover:text-neutral-800 dark:border-neutral-700 dark:text-neutral-400 dark:hover:border-neutral-500 dark:hover:text-neutral-100",disabled:t.saving,onClick:ae}," Cancel ",8,xl)])):M("",!0),v("div",{class:Fe(t.inline?"min-h-0 flex-1 overflow-y-auto p-5":"")},[x(r,{type:"form",id:"model-form",actions:!1,disabled:t.readonly||t.saving||A.value,onSubmit:je,onNode:he},{default:F(()=>[v("div",kl,[x(r,{type:"autocomplete",name:"provider",modelValue:e.value,"onUpdate:modelValue":o[0]||(o[0]=n=>e.value=n),options:Ce.value,label:"Provider",placeholder:"Search providers...",disabled:h.value,validation:"required","validation-visibility":"submit","selection-removable":""},null,8,["modelValue","options","disabled"]),e.value?(d(),b("div",Ml,[x(r,{type:"selectSearch",name:"model",modelValue:a.value,"onUpdate:modelValue":o[1]||(o[1]=n=>a.value=n),options:Ve.value,"options-loader":Se,"option-loader":re,"load-on-scroll":"","search-debounce":150,label:"Model",placeholder:"Select a model","search-placeholder":"Search models...",loading:O.value,"rich-row-component":xe,validation:"required","validation-visibility":"submit"},null,8,["modelValue","options","loading"])])):M("",!0),a.value?(d(),b("div",hl,[x(r,{type:"text",name:"name",modelValue:se.value,"onUpdate:modelValue":o[2]||(o[2]=n=>se.value=n),label:"Name",placeholder:"e.g., coding_model, planning_model, fast_response",validation:"required|snakeCase","validation-visibility":"blur",help:N.value?void 0:"A descriptive name for this model. This becomes the filename and reference ID."},null,8,["modelValue","help"]),N.value?(d(),T($(Le),{key:0,class:"mt-1"},{default:F(()=>[o[7]||(o[7]=G(" Will be saved as: ",-1)),v("code",Cl,I(N.value),1)]),_:1})):M("",!0)])):M("",!0),a.value?(d(),T(el,{key:2,capabilities:m.value,"onUpdate:capabilities":o[3]||(o[3]=n=>m.value=n),"detected-capabilities":J.value,"loading-capabilities":Q.value,onReset:Oe},null,8,["capabilities","detected-capabilities","loading-capabilities"])):M("",!0),a.value?(d(),T(pl,{key:3,"selected-tools":k.value,"onUpdate:selectedTools":o[4]||(o[4]=n=>k.value=n),tools:j.value,loading:X.value},null,8,["selected-tools","tools","loading"])):M("",!0),a.value&&de.value?(d(),T(vl,{key:4,endpoints:p.value,"selected-endpoints":i.value,"onUpdate:selectedEndpoints":o[5]||(o[5]=n=>i.value=n),loading:V.value,onSelectAll:Te,onClear:$e},null,8,["endpoints","selected-endpoints","loading"])):M("",!0),a.value?(d(),T(al,{key:5,"fallback-models":B.value,"onUpdate:fallbackModels":o[6]||(o[6]=n=>B.value=n),"configured-model-options":ke.value,"loading-configured-models":Z.value},null,8,["fallback-models","configured-model-options","loading-configured-models"])):M("",!0),t.readonly?M("",!0):(d(),T($(Je),{key:6,node:_.value||void 0},null,8,["node"]))])]),_:1},8,["disabled"])],2),t.inline?(d(),b("div",Vl,[x(ge,{readonly:t.readonly,"form-submitted":D.value,"form-valid":L.value,saving:t.saving,"is-edit-mode":S.value,onCancel:ae},null,8,["readonly","form-submitted","form-valid","saving","is-edit-mode"])])):M("",!0)]),_:2},[t.inline?void 0:{name:"footer",fn:F(()=>[x(ge,{readonly:t.readonly,"form-submitted":D.value,"form-valid":L.value,saving:t.saving,"is-edit-mode":S.value,onCancel:ae},null,8,["readonly","form-submitted","form-valid","saving","is-edit-mode"])]),key:"0"}]),1040)}}});export{$l as _};
@@ -1 +1 @@
1
- import{y as D,D as T,C as j,a as q,a6 as C}from"./index.js";import{_ as P}from"./ModelModal.vue_vue_type_script_setup_true_lang.js";import{_ as z}from"./DataTable.vue_vue_type_script_setup_true_lang.js";import{C as J}from"./CenteredContentView.js";import{I as L}from"./plus.js";import{u as G}from"./useActionFeedback.js";import{d as H,r as c,c as K,o as O,z as $,e as r,k as m,q as v,b as s,j as A,J as l,s as Q,u,F as W,l as X,f as n}from"./vue.js";import"./formkit.js";import"./monaco.js";import"./vendor.js";import"./syntax.js";import"./Modal.vue_vue_type_script_setup_true_lang.js";import"./ConfirmDialog.vue_vue_type_script_setup_true_lang.js";import"./chevron-right.js";const Y={key:1,class:"mb-5 rounded-lg border border-amber-200 dark:border-amber-800 bg-amber-50 dark:bg-amber-950/30 px-4 py-3 text-sm text-amber-800 dark:text-amber-200"},Z={class:"flex items-center gap-2"},ee=["src","alt"],oe={class:"text-sm text-neutral-600 dark:text-neutral-400 font-mono"},te={class:"flex items-center gap-2"},ae=["src","alt"],re={key:0,class:"space-y-0.5"},le=["title"],se={class:"shrink-0 font-mono pr-2"},de=["src","alt"],ne={class:"truncate"},ie={key:1,class:"text-neutral-400 dark:text-neutral-600 text-sm"},Ce=H({__name:"ModelsView",setup(ce){const i=c(!1),_=c([]),g=c(!1),d=c(null),p=c("add"),M=c(null),{saving:I,saveModel:F,deleteModel:N}=D(),f=T(),{feedback:y,setFeedback:h,clearFeedback:k}=G(),V=[{key:"name",label:"Name",width:"w-1/4",sortable:!0},{key:"model",label:"Model",width:"w-1/4",sortable:!0,filterable:!0,filterIcon:(a,o)=>`/api/providers/${o.provider}/icon?model=${encodeURIComponent(o.model||"")}`},{key:"provider",label:"Provider",width:"w-1/4",sortable:!0,filterable:!0,filterIcon:(a,o)=>`/api/providers/${o.provider}/icon`},{key:"fallbacks",label:"Fallbacks",width:"w-1/4"}],w=a=>{d.value=a,p.value="edit",i.value=!0},x=[{icon:"edit",label:"Edit",handler:a=>w(a)},{icon:"delete",label:"Delete",confirm:!0,confirmMessage:"Are you sure you want to delete this model? This action cannot be undone.",variant:"danger",handler:async a=>{await S(a.id)}}],R=K(()=>f?x:x.filter(a=>a.variant!=="danger")),b=async()=>{g.value=!0,k();try{const a=await fetch(q("/api/models"));if(!a.ok)throw new Error("Failed to fetch models");const o=await a.json();_.value=o.models||[]}catch{h("error","Models could not be loaded."),_.value=[]}finally{g.value=!1}},E=async a=>{k();const o=!!d.value,e=await F({mode:o?"edit":"add",data:a,editingId:o?d.value.id:null,formNode:M.value?.formNode});if(!e.ok){if(!e.formErrorsApplied){const t=C(e.error,`Failed to ${o?"update":"add"} model`);h("error",t)}return}await b(),i.value=!1,d.value=null,p.value="add"},S=async a=>{k();const o=await N({id:String(a)});if(!o.ok){const e=C(o.error,"Failed to delete model");h("error",e);return}await b(),h("success","Model deleted.")},U=()=>{p.value="add",d.value=null,i.value=!0};return O(()=>{b()}),(a,o)=>(r(),$(J,null,{default:m(()=>[l(y)?(r(),$(l(j),{key:0,variant:l(y).variant,class:"mb-4"},{default:m(()=>[Q(u(l(y).message),1)]),_:1},8,["variant"])):v("",!0),l(f)?v("",!0):(r(),s("div",Y," Configuration is read-only in production. To make changes, edit your configuration files locally and deploy. ")),A(z,{title:"Models",description:"Configure AI models from your connected providers. Models define which AI capabilities are available to your agents.","primary-action":l(f)?{label:"Add Model",icon:l(L),handler:U}:void 0,columns:V,data:_.value,actions:R.value,loading:g.value,sortable:"",searchable:"","search-placeholder":"Search models...","empty-message":"No models configured yet. Add your first model to get started.",onRowClick:w},{"cell-name":m(({value:e,row:t})=>[n("div",Z,[t.provider?(r(),s("img",{key:0,src:`/api/providers/${t.provider}/icon?model=${encodeURIComponent(t.model||"")}`,class:"w-5 h-5 shrink-0",alt:t.provider},null,8,ee)):v("",!0),n("span",null,u(e),1)])]),"cell-model":m(({value:e})=>[n("span",oe,u(e||"—"),1)]),"cell-provider":m(({value:e,row:t})=>[n("div",te,[t.provider?(r(),s("img",{key:0,src:`/api/providers/${t.provider}/icon`,class:"w-5 h-5 shrink-0",alt:t.provider},null,8,ae)):v("",!0),n("span",null,u(e||"—"),1)])]),"cell-fallbacks":m(({value:e})=>[e&&e.length>0?(r(),s("div",re,[(r(!0),s(W,null,X(e,(t,B)=>(r(),s("div",{key:t.id,class:"text-sm text-neutral-600 dark:text-neutral-400 flex items-center",title:t.name},[n("span",se,u(B===e.length-1?"└─":"├─"),1),t.provider?(r(),s("img",{key:0,src:`/api/providers/${t.provider}/icon?model=${encodeURIComponent(t.model||"")}`,class:"w-4 h-4 shrink-0 mr-1.5",alt:t.provider},null,8,de)):v("",!0),n("span",ne,u(t.name),1)],8,le))),128))])):(r(),s("span",ie," None "))]),_:1},8,["primary-action","data","actions","loading"]),A(P,{ref_key:"modelModalRef",ref:M,modelValue:i.value,"onUpdate:modelValue":[o[0]||(o[0]=e=>i.value=e),o[1]||(o[1]=e=>{i.value=e,e||(d.value=null,p.value="add")})],"edit-model":d.value,mode:p.value,readonly:!l(f),saving:l(I),onSave:E},null,8,["modelValue","edit-model","mode","readonly","saving"])]),_:1}))}});export{Ce as default};
1
+ import{y as D,D as T,C as j,b as q,a6 as C}from"./index.js";import{_ as P}from"./ModelModal.vue_vue_type_script_setup_true_lang.js";import{_ as z}from"./DataTable.vue_vue_type_script_setup_true_lang.js";import{C as J}from"./CenteredContentView.js";import{I as L}from"./plus.js";import{u as G}from"./useActionFeedback.js";import{d as H,r as c,c as K,o as O,z as $,e as r,k as m,q as v,b as s,j as A,J as l,s as Q,u,F as W,l as X,f as n}from"./vue.js";import"./formkit.js";import"./monaco.js";import"./vendor.js";import"./syntax.js";import"./Modal.vue_vue_type_script_setup_true_lang.js";import"./ConfirmDialog.vue_vue_type_script_setup_true_lang.js";import"./chevron-right.js";const Y={key:1,class:"mb-5 rounded-lg border border-amber-200 dark:border-amber-800 bg-amber-50 dark:bg-amber-950/30 px-4 py-3 text-sm text-amber-800 dark:text-amber-200"},Z={class:"flex items-center gap-2"},ee=["src","alt"],oe={class:"text-sm text-neutral-600 dark:text-neutral-400 font-mono"},te={class:"flex items-center gap-2"},ae=["src","alt"],re={key:0,class:"space-y-0.5"},le=["title"],se={class:"shrink-0 font-mono pr-2"},de=["src","alt"],ne={class:"truncate"},ie={key:1,class:"text-neutral-400 dark:text-neutral-600 text-sm"},Ce=H({__name:"ModelsView",setup(ce){const i=c(!1),_=c([]),g=c(!1),d=c(null),p=c("add"),M=c(null),{saving:I,saveModel:F,deleteModel:N}=D(),f=T(),{feedback:y,setFeedback:h,clearFeedback:b}=G(),V=[{key:"name",label:"Name",width:"w-1/4",sortable:!0},{key:"model",label:"Model",width:"w-1/4",sortable:!0,filterable:!0,filterIcon:(a,o)=>`/api/providers/${o.provider}/icon?model=${encodeURIComponent(o.model||"")}`},{key:"provider",label:"Provider",width:"w-1/4",sortable:!0,filterable:!0,filterIcon:(a,o)=>`/api/providers/${o.provider}/icon`},{key:"fallbacks",label:"Fallbacks",width:"w-1/4"}],w=a=>{d.value=a,p.value="edit",i.value=!0},x=[{icon:"edit",label:"Edit",handler:a=>w(a)},{icon:"delete",label:"Delete",confirm:!0,confirmMessage:"Are you sure you want to delete this model? This action cannot be undone.",variant:"danger",handler:async a=>{await S(a.id)}}],R=K(()=>f?x:x.filter(a=>a.variant!=="danger")),k=async()=>{g.value=!0,b();try{const a=await fetch(q("/api/models"));if(!a.ok)throw new Error("Failed to fetch models");const o=await a.json();_.value=o.models||[]}catch{h("error","Models could not be loaded."),_.value=[]}finally{g.value=!1}},E=async a=>{b();const o=!!d.value,e=await F({mode:o?"edit":"add",data:a,editingId:o?d.value.id:null,formNode:M.value?.formNode});if(!e.ok){if(!e.formErrorsApplied){const t=C(e.error,`Failed to ${o?"update":"add"} model`);h("error",t)}return}await k(),i.value=!1,d.value=null,p.value="add"},S=async a=>{b();const o=await N({id:String(a)});if(!o.ok){const e=C(o.error,"Failed to delete model");h("error",e);return}await k(),h("success","Model deleted.")},U=()=>{p.value="add",d.value=null,i.value=!0};return O(()=>{k()}),(a,o)=>(r(),$(J,null,{default:m(()=>[l(y)?(r(),$(l(j),{key:0,variant:l(y).variant,class:"mb-4"},{default:m(()=>[Q(u(l(y).message),1)]),_:1},8,["variant"])):v("",!0),l(f)?v("",!0):(r(),s("div",Y," Configuration is read-only in production. To make changes, edit your configuration files locally and deploy. ")),A(z,{title:"Models",description:"Configure AI models from your connected providers. Models define which AI capabilities are available to your agents.","primary-action":l(f)?{label:"Add Model",icon:l(L),handler:U}:void 0,columns:V,data:_.value,actions:R.value,loading:g.value,sortable:"",searchable:"","search-placeholder":"Search models...","empty-message":"No models configured yet. Add your first model to get started.",onRowClick:w},{"cell-name":m(({value:e,row:t})=>[n("div",Z,[t.provider?(r(),s("img",{key:0,src:`/api/providers/${t.provider}/icon?model=${encodeURIComponent(t.model||"")}`,class:"w-5 h-5 shrink-0",alt:t.provider},null,8,ee)):v("",!0),n("span",null,u(e),1)])]),"cell-model":m(({value:e})=>[n("span",oe,u(e||"—"),1)]),"cell-provider":m(({value:e,row:t})=>[n("div",te,[t.provider?(r(),s("img",{key:0,src:`/api/providers/${t.provider}/icon`,class:"w-5 h-5 shrink-0",alt:t.provider},null,8,ae)):v("",!0),n("span",null,u(e||"—"),1)])]),"cell-fallbacks":m(({value:e})=>[e&&e.length>0?(r(),s("div",re,[(r(!0),s(W,null,X(e,(t,B)=>(r(),s("div",{key:t.id,class:"text-sm text-neutral-600 dark:text-neutral-400 flex items-center",title:t.name},[n("span",se,u(B===e.length-1?"└─":"├─"),1),t.provider?(r(),s("img",{key:0,src:`/api/providers/${t.provider}/icon?model=${encodeURIComponent(t.model||"")}`,class:"w-4 h-4 shrink-0 mr-1.5",alt:t.provider},null,8,de)):v("",!0),n("span",ne,u(t.name),1)],8,le))),128))])):(r(),s("span",ie," None "))]),_:1},8,["primary-action","data","actions","loading"]),A(P,{ref_key:"modelModalRef",ref:M,modelValue:i.value,"onUpdate:modelValue":[o[0]||(o[0]=e=>i.value=e),o[1]||(o[1]=e=>{i.value=e,e||(d.value=null,p.value="add")})],"edit-model":d.value,mode:p.value,readonly:!l(f),saving:l(I),onSave:E},null,8,["modelValue","edit-model","mode","readonly","saving"])]),_:1}))}});export{Ce as default};
@@ -1 +1 @@
1
- import{d as D,r as u,c as V,o as N,b as M,e as f,z as _,q as w,j as C,J as a,k as P,s as R,u as A,X as $,Y as T,w as I}from"./vue.js";import{C as E,a as x,D as S,x as q}from"./index.js";import{_ as B}from"./DataTable.vue_vue_type_script_setup_true_lang.js";import{u as F}from"./useActionFeedback.js";import{P as U}from"./PromptModal.js";import{C as j}from"./CenteredContentView.js";import{I as L}from"./plus.js";import"./formkit.js";import"./vendor.js";import"./syntax.js";import"./monaco.js";import"./chevron-right.js";import"./ConfirmDialog.vue_vue_type_script_setup_true_lang.js";import"./Modal.vue_vue_type_script_setup_true_lang.js";import"./check.js";const z=D({__name:"PromptsDataTable",props:{title:{},description:{},primaryAction:{},readonly:{type:Boolean,default:!1}},emits:["add","edit","delete"],setup(i,{expose:b,emit:y}){const r=i,s=y,d=u([]),o=u(!1),{feedback:m,setFeedback:n,clearFeedback:l}=F(),k=[{key:"name",label:"Name",width:"w-1/4",sortable:!0},{key:"tool_description",label:"Description",width:"w-2/5"},{key:"model_name",label:"Model",width:"w-1/5",sortable:!0,filterable:!0,formatter:(e,t)=>e||t.model_id||"-",filterIcon:(e,t)=>t.model_provider?`/api/providers/${t.model_provider}/icon?model=${encodeURIComponent(t.model_id||"")}`:void 0},{key:"created_at",label:"Created",width:"w-1/6",sortable:!0,searchable:!1,formatter:e=>e?new Date(e*1e3).toLocaleDateString():"-"}],v=[{icon:"edit",label:"Edit",handler:e=>s("edit",e)},{icon:"delete",label:"Delete",handler:async e=>{await g(e)},confirm:!0,confirmMessage:"Are you sure you want to delete this prompt?",variant:"danger"}],h=V(()=>r.readonly?v.filter(e=>e.variant!=="danger"):v),c=async()=>{o.value=!0,l();try{const e=await fetch(x("/api/prompts"));if(e.ok){const t=await e.json();d.value=t.prompts||[]}}catch{n("error","Prompts could not be loaded.")}finally{o.value=!1}},g=async e=>{l();try{const t=await fetch(x(`/api/prompts/${encodeURIComponent(e.id)}`),{method:"DELETE"});if(t.ok)await c(),n("success","Prompt deleted.");else{const p=await t.json();n("error",p.error||"Failed to delete prompt")}}catch{n("error","Failed to delete prompt")}};return N(()=>{c()}),b({refresh:c}),(e,t)=>(f(),M("div",null,[a(m)?(f(),_(a(E),{key:0,variant:a(m).variant,class:"mb-4"},{default:P(()=>[R(A(a(m).message),1)]),_:1},8,["variant"])):w("",!0),C(B,{title:i.title,description:i.description,"primary-action":i.primaryAction,columns:k,data:d.value,actions:h.value,loading:o.value,sortable:"",searchable:"","search-placeholder":"Search prompts...","empty-message":"No prompts available. Create your first prompt to get started.",onRowClick:t[0]||(t[0]=p=>s("edit",p))},null,8,["title","description","primary-action","data","actions","loading"])]))}}),J={key:1,class:"mb-5 rounded-lg border border-amber-200 dark:border-amber-800 bg-amber-50 dark:bg-amber-950/30 px-4 py-3 text-sm text-amber-800 dark:text-amber-200"},ne=D({__name:"PromptsView",setup(i){const b=$(),y=T(),r=u(!1),s=u(null),d=u(null),o=S(),{saving:m,savePrompt:n}=q(),{feedback:l,setFeedback:k,clearFeedback:v}=F();I(()=>y.query.refresh,()=>{y.query.refresh&&(s.value?.refresh(),b.replace({path:"/prompts",query:{}}))});const h=()=>{r.value=!0},c=e=>{b.push(`/prompts/${e.id}`)},g=async e=>{v();const t=await n({mode:"add",data:e,formNode:d.value?.formNode});t.ok?(r.value=!1,await s.value?.refresh()):t.formErrorsApplied||k("error","Failed to create prompt")};return(e,t)=>(f(),_(j,null,{default:P(()=>[a(l)?(f(),_(a(E),{key:0,variant:a(l).variant,class:"mb-4"},{default:P(()=>[R(A(a(l).message),1)]),_:1},8,["variant"])):w("",!0),a(o)?w("",!0):(f(),M("div",J," Configuration is read-only in production. To make changes, edit your configuration files locally and deploy. ")),C(z,{ref_key:"dataTableRef",ref:s,title:"Prompts",description:"Define and manage prompt templates for your agents.","primary-action":a(o)?{label:"Create Prompt",icon:a(L),handler:h}:void 0,readonly:!a(o),onAdd:h,onEdit:c},null,8,["primary-action","readonly"]),C(U,{ref_key:"promptModalRef",ref:d,modelValue:r.value,"onUpdate:modelValue":t[0]||(t[0]=p=>r.value=p),mode:"add",saving:a(m),onSave:g},null,8,["modelValue","saving"])]),_:1}))}});export{ne as default};
1
+ import{d as D,r as u,c as V,o as N,b as M,e as f,z as _,q as w,j as C,J as a,k as P,s as R,u as A,X as $,Y as T,w as I}from"./vue.js";import{C as E,b as x,D as S,x as q}from"./index.js";import{_ as B}from"./DataTable.vue_vue_type_script_setup_true_lang.js";import{u as F}from"./useActionFeedback.js";import{P as U}from"./PromptModal.js";import{C as j}from"./CenteredContentView.js";import{I as L}from"./plus.js";import"./formkit.js";import"./vendor.js";import"./syntax.js";import"./monaco.js";import"./chevron-right.js";import"./ConfirmDialog.vue_vue_type_script_setup_true_lang.js";import"./Modal.vue_vue_type_script_setup_true_lang.js";import"./check.js";const z=D({__name:"PromptsDataTable",props:{title:{},description:{},primaryAction:{},readonly:{type:Boolean,default:!1}},emits:["add","edit","delete"],setup(i,{expose:b,emit:y}){const r=i,s=y,d=u([]),o=u(!1),{feedback:m,setFeedback:n,clearFeedback:l}=F(),k=[{key:"name",label:"Name",width:"w-1/4",sortable:!0},{key:"tool_description",label:"Description",width:"w-2/5"},{key:"model_name",label:"Model",width:"w-1/5",sortable:!0,filterable:!0,formatter:(e,t)=>e||t.model_id||"-",filterIcon:(e,t)=>t.model_provider?`/api/providers/${t.model_provider}/icon?model=${encodeURIComponent(t.model_id||"")}`:void 0},{key:"created_at",label:"Created",width:"w-1/6",sortable:!0,searchable:!1,formatter:e=>e?new Date(e*1e3).toLocaleDateString():"-"}],v=[{icon:"edit",label:"Edit",handler:e=>s("edit",e)},{icon:"delete",label:"Delete",handler:async e=>{await g(e)},confirm:!0,confirmMessage:"Are you sure you want to delete this prompt?",variant:"danger"}],h=V(()=>r.readonly?v.filter(e=>e.variant!=="danger"):v),c=async()=>{o.value=!0,l();try{const e=await fetch(x("/api/prompts"));if(e.ok){const t=await e.json();d.value=t.prompts||[]}}catch{n("error","Prompts could not be loaded.")}finally{o.value=!1}},g=async e=>{l();try{const t=await fetch(x(`/api/prompts/${encodeURIComponent(e.id)}`),{method:"DELETE"});if(t.ok)await c(),n("success","Prompt deleted.");else{const p=await t.json();n("error",p.error||"Failed to delete prompt")}}catch{n("error","Failed to delete prompt")}};return N(()=>{c()}),b({refresh:c}),(e,t)=>(f(),M("div",null,[a(m)?(f(),_(a(E),{key:0,variant:a(m).variant,class:"mb-4"},{default:P(()=>[R(A(a(m).message),1)]),_:1},8,["variant"])):w("",!0),C(B,{title:i.title,description:i.description,"primary-action":i.primaryAction,columns:k,data:d.value,actions:h.value,loading:o.value,sortable:"",searchable:"","search-placeholder":"Search prompts...","empty-message":"No prompts available. Create your first prompt to get started.",onRowClick:t[0]||(t[0]=p=>s("edit",p))},null,8,["title","description","primary-action","data","actions","loading"])]))}}),J={key:1,class:"mb-5 rounded-lg border border-amber-200 dark:border-amber-800 bg-amber-50 dark:bg-amber-950/30 px-4 py-3 text-sm text-amber-800 dark:text-amber-200"},ne=D({__name:"PromptsView",setup(i){const b=$(),y=T(),r=u(!1),s=u(null),d=u(null),o=S(),{saving:m,savePrompt:n}=q(),{feedback:l,setFeedback:k,clearFeedback:v}=F();I(()=>y.query.refresh,()=>{y.query.refresh&&(s.value?.refresh(),b.replace({path:"/prompts",query:{}}))});const h=()=>{r.value=!0},c=e=>{b.push(`/prompts/${e.id}`)},g=async e=>{v();const t=await n({mode:"add",data:e,formNode:d.value?.formNode});t.ok?(r.value=!1,await s.value?.refresh()):t.formErrorsApplied||k("error","Failed to create prompt")};return(e,t)=>(f(),_(j,null,{default:P(()=>[a(l)?(f(),_(a(E),{key:0,variant:a(l).variant,class:"mb-4"},{default:P(()=>[R(A(a(l).message),1)]),_:1},8,["variant"])):w("",!0),a(o)?w("",!0):(f(),M("div",J," Configuration is read-only in production. To make changes, edit your configuration files locally and deploy. ")),C(z,{ref_key:"dataTableRef",ref:s,title:"Prompts",description:"Define and manage prompt templates for your agents.","primary-action":a(o)?{label:"Create Prompt",icon:a(L),handler:h}:void 0,readonly:!a(o),onAdd:h,onEdit:c},null,8,["primary-action","readonly"]),C(U,{ref_key:"promptModalRef",ref:d,modelValue:r.value,"onUpdate:modelValue":t[0]||(t[0]=p=>r.value=p),mode:"add",saving:a(m),onSave:g},null,8,["modelValue","saving"])]),_:1}))}});export{ne as default};
@@ -1,3 +1,3 @@
1
- import{C as P,ai as V,a as g}from"./index.js";import{_ as K}from"./DataTable.vue_vue_type_script_setup_true_lang.js";import{C as N}from"./CenteredContentView.js";import{I as k}from"./check.js";import{u as $}from"./useActionFeedback.js";import{d as F,r as y,o as B,z as x,e as n,k as i,q as D,j as l,J as a,s as d,u as w,b as f,f as v}from"./vue.js";import"./formkit.js";import"./monaco.js";import"./vendor.js";import"./syntax.js";import"./chevron-right.js";import"./ConfirmDialog.vue_vue_type_script_setup_true_lang.js";const E={class:"flex items-center gap-2"},S=["src","alt"],T={key:0,class:"inline-flex items-center gap-1.5 px-2.5 py-1 text-xs font-medium rounded-full bg-blue-100 text-blue-700 dark:bg-blue-900/30 dark:text-blue-400"},j={key:1,class:"inline-flex items-center gap-1.5 px-2.5 py-1 text-xs font-medium rounded-full bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-400"},L=["title"],Z=F({__name:"ProvidersView",setup(O){const c=y([]),p=y(!1),{feedback:u,setFeedback:o,clearFeedback:b}=$(),_={cloudflare:"Cloudflare Workers AI",cerebras:"Cerebras","openai-sdk":"OpenAI SDK",openrouter:"OpenRouter",openai:"OpenAI"},m=e=>_[e]||e,C=[{key:"name",label:"Name",width:"w-1/3",sortable:!0},{key:"sdk",label:"SDK Type",width:"w-1/3",sortable:!0,formatter:e=>m(e)},{key:"hasApiKey",label:"API Key",width:"w-1/3"}],A=[{icon:"delete",label:"Delete",confirm:!0,confirmMessage:"Are you sure you want to delete this provider? This action cannot be undone.",variant:"danger",handler:async e=>{await I(e.name)}}],h=async()=>{p.value=!0,b();try{const e=await fetch(g("/api/providers"));if(!e.ok)throw new Error("Failed to fetch providers");const t=await e.json();c.value=t.providers||[]}catch{o("error","Providers could not be loaded."),c.value=[]}finally{p.value=!1}},I=async e=>{b();try{const t=await fetch(g(`/api/providers/${encodeURIComponent(e)}`),{method:"DELETE"});if(!t.ok){const r=await t.json();r.modelCount?o("error",`${r.error}
1
+ import{C as P,ai as V,b as g}from"./index.js";import{_ as K}from"./DataTable.vue_vue_type_script_setup_true_lang.js";import{C as N}from"./CenteredContentView.js";import{I as k}from"./check.js";import{u as $}from"./useActionFeedback.js";import{d as F,r as y,o as B,z as x,e as n,k as i,q as D,j as l,J as a,s as d,u as w,b as f,f as v}from"./vue.js";import"./formkit.js";import"./monaco.js";import"./vendor.js";import"./syntax.js";import"./chevron-right.js";import"./ConfirmDialog.vue_vue_type_script_setup_true_lang.js";const E={class:"flex items-center gap-2"},S=["src","alt"],T={key:0,class:"inline-flex items-center gap-1.5 px-2.5 py-1 text-xs font-medium rounded-full bg-blue-100 text-blue-700 dark:bg-blue-900/30 dark:text-blue-400"},j={key:1,class:"inline-flex items-center gap-1.5 px-2.5 py-1 text-xs font-medium rounded-full bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-400"},L=["title"],Z=F({__name:"ProvidersView",setup(O){const c=y([]),p=y(!1),{feedback:u,setFeedback:o,clearFeedback:b}=$(),_={cloudflare:"Cloudflare Workers AI",cerebras:"Cerebras","openai-sdk":"OpenAI SDK",openrouter:"OpenRouter",openai:"OpenAI"},m=e=>_[e]||e,C=[{key:"name",label:"Name",width:"w-1/3",sortable:!0},{key:"sdk",label:"SDK Type",width:"w-1/3",sortable:!0,formatter:e=>m(e)},{key:"hasApiKey",label:"API Key",width:"w-1/3"}],A=[{icon:"delete",label:"Delete",confirm:!0,confirmMessage:"Are you sure you want to delete this provider? This action cannot be undone.",variant:"danger",handler:async e=>{await I(e.name)}}],h=async()=>{p.value=!0,b();try{const e=await fetch(g("/api/providers"));if(!e.ok)throw new Error("Failed to fetch providers");const t=await e.json();c.value=t.providers||[]}catch{o("error","Providers could not be loaded."),c.value=[]}finally{p.value=!1}},I=async e=>{b();try{const t=await fetch(g(`/api/providers/${encodeURIComponent(e)}`),{method:"DELETE"});if(!t.ok){const r=await t.json();r.modelCount?o("error",`${r.error}
2
2
 
3
3
  This provider has ${r.modelCount} associated model(s).`):o("error",r.error||"Failed to delete provider");return}await h(),o("success","Provider deleted.")}catch{o("error","Failed to delete provider")}};return B(()=>{h()}),(e,t)=>(n(),x(N,null,{default:i(()=>[a(u)?(n(),x(a(P),{key:0,variant:a(u).variant,class:"mb-4 whitespace-pre-line"},{default:i(()=>[d(w(a(u).message),1)]),_:1},8,["variant"])):D("",!0),l(K,{title:"Providers",description:"Installed providers and API key status. Provider availability is defined in code and environment configuration.",columns:C,data:c.value,actions:A,loading:p.value,sortable:"",searchable:"","search-placeholder":"Search providers...","empty-message":"No providers are installed in this AgentBuilder instance."},{"cell-sdk":i(({value:r,row:s})=>[v("div",E,[v("img",{src:`/api/providers/${s.name}/icon`,alt:m(r),class:"w-5 h-5"},null,8,S),v("span",null,w(m(r)),1)])]),"cell-hasApiKey":i(({value:r,row:s})=>[r&&s.configuredViaPlatform?(n(),f("span",T,[l(a(k),{class:"w-3.5 h-3.5"}),t[0]||(t[0]=d(" Via platform ",-1))])):r?(n(),f("span",j,[l(a(k),{class:"w-3.5 h-3.5"}),t[1]||(t[1]=d(" Configured ",-1))])):(n(),f("span",{key:2,class:"inline-flex items-center gap-1.5 px-2.5 py-1 text-xs font-medium rounded-full bg-neutral-100 text-neutral-500 dark:bg-neutral-800 dark:text-neutral-400",title:s.envKeys?.length?`Required: ${s.envKeys.join(", ")}`:void 0},[l(a(V),{class:"w-3.5 h-3.5"}),t[2]||(t[2]=d(" Not configured ",-1))],8,L))]),_:1},8,["data","loading"])]),_:1}))}});export{Z as default};