1import{c as n,o,a as e,y as _,d as q,r as p,e as z,k as O,w as j,h as M,i as v,j as L,u as m,F as R,g as G,n as C,t as i,D as H,G as $,z as d,A as c,N as Y,_ as J}from"./index-EaLmg-Ni.js";import{_ as Q,a as W}from"./DashboardLayout.vue_vue_type_script_setup_true_lang-B5Fp9Obf.js";import{r as X}from"./PlusIcon-DUJh80o5.js";import{r as Z}from"./PencilIcon-Jfbzy_0x.js";import{r as ee}from"./TrashIcon-DIgXarFM.js";import"./useI18n-DJ3Xy1Go.js";import"./ShieldCheckIcon-BF8Bt-c4.js";import"./BookOpenIcon-DIE_f_q9.js";import"./CpuChipIcon-IlHlDgIv.js";import"./LanguageSwitcher.vue_vue_type_script_setup_true_lang-Bitf4i4g.js";function D(r,u){return o(),n("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24","stroke-width":"1.5",stroke:"currentColor","aria-hidden":"true","data-slot":"icon"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"M16.023 9.348h4.992v-.001M2.985 19.644v-4.992m0 0h4.992m-4.993 0 3.181 3.183a8.25 8.25 0 0 0 13.803-3.7M4.031 9.865a8.25 8.25 0 0 1 13.803-3.7l3.181 3.182m0-4.991v4.99"})])}const y={async list(){return(await _.get("/trollllm-keys/")).data},async get(r){return(await _.get(`/trollllm-keys/${r}`)).data},async create(r){return(await _.post("/trollllm-keys/",r)).data},async update(r,u){return(await _.put(`/trollllm-keys/${r}`,u)).data},async delete(r){await _.delete(`/trollllm-keys/${r}`)},async resetUsage(r){return(await _.post(`/trollllm-keys/${r}/reset-usage`)).data}},te={class:"trollllm-keys-page"},ae={class:"page-header"},se={key:0,class:"loading"},le={key:1,class:"keys-table-container"},oe={class:"keys-table"},ne={class:"key-preview"},re={key:0,class:"package-badge"},ie={key:1,class:"text-muted"},de={key:0},ue={key:1,class:"text-muted"},ce={class:"usage-bar-container"},pe={class:"usage-bar"},_e={class:"usage-text"},ve={key:0},me={key:0},ye={key:1,class:"text-muted"},ge={class:"priority-badge"},fe={key:1,class:"text-muted"},he={class:"actions-cell"},be=["onClick"],we=["onClick"],xe=["onClick"],ke={key:2,class:"empty-state"},Ce={class:"modal-content"},Me={class:"modal-header"},Le={class:"form-group"},Ue={class:"form-group"},Ke={class:"form-row"},Pe={class:"form-group"},Se={class:"form-group"},Ve={class:"form-row"},$e={class:"form-group"},De={class:"form-group"},Fe={class:"form-row"},Ne={class:"form-group"},Te={class:"form-group"},Ae={class:"form-group"},Ee={class:"form-group"},Ie={class:"checkbox-label"},Be={class:"modal-actions"},qe=["disabled"],ze=q({__name:"TrollLLMKeysPage",setup(r){const u=p([]),g=p(!0),f=p(!1),h=p(!1),b=p(null),w=p(!1),l=p({name:"",api_key:"",package_name:"",credit_per_day:void 0,max_threads:void 0,start_date:void 0,end_date:void 0,is_active:!0,priority:0,notes:""});z(async()=>{await x()});async function x(){try{g.value=!0;const s=await y.list();u.value=s.keys}catch(s){console.error("Failed to load TrollLLM keys:",s),alert("Failed to load keys. Please try again.")}finally{g.value=!1}}function U(){h.value=!1,b.value=null,K(),f.value=!0}function F(s){h.value=!0,b.value=s.id,l.value={name:s.name,api_key:s.api_key,package_name:s.package_name||"",credit_per_day:s.credit_per_day||void 0,max_threads:s.max_threads||void 0,start_date:s.start_date?P(s.start_date):void 0,end_date:s.end_date?P(s.end_date):void 0,is_active:s.is_active,priority:s.priority,notes:s.notes||""},f.value=!0}function k(){f.value=!1,K()}function K(){l.value={name:"",api_key:"",package_name:"",credit_per_day:void 0,max_threads:void 0,start_date:void 0,end_date:void 0,is_active:!0,priority:0,notes:""}}async function N(){var s,t;try{w.value=!0;const a={name:l.value.name,api_key:l.value.api_key,package_name:l.value.package_name||void 0,credit_per_day:l.value.credit_per_day||void 0,max_threads:l.value.max_threads||void 0,start_date:l.value.start_date||void 0,end_date:l.value.end_date||void 0,is_active:l.value.is_active,priority:l.value.priority||0,notes:l.value.notes||void 0};h.value&&b.value?await y.update(b.value,a):await y.create(a),await x(),k()}catch(a){console.error("Failed to save key:",a),alert(((t=(s=a.response)==null?void 0:s.data)==null?void 0:t.detail)||"Failed to save key. Please try again.")}finally{w.value=!1}}async function T(s){if(confirm(`Are you sure you want to delete "${s.name}"?`))try{await y.delete(s.id),await x()}catch(t){console.error("Failed to delete key:",t),alert("Failed to delete key. Please try again.")}}async function A(s){if(confirm(`Reset usage counter for "${s.name}"?`))try{await y.resetUsage(s.id),await x()}catch(t){console.error("Failed to reset usage:",t),alert("Failed to reset usage. Please try again.")}}function E(s){return s.length<=20?s:s.substring(0,15)+"..."+s.substring(s.length-10)}function I(s){return new Date(s).toLocaleDateString("en-US",{year:"numeric",month:"short",day:"numeric"})}function P(s){return new Date(s).toISOString().slice(0,16)}function S(s){return s.credit_per_day?Math.min(s.current_usage_today/s.credit_per_day*100,100):0}function B(s){return s.is_active?s.is_expired?"Expired":s.is_over_limit?"Over Limit":"Active":"Inactive"}return(s,t)=>(o(),O(Q,null,{default:j(()=>
1[e("div",te,[e("div",ae,[t[11]||(t[11]=e("h1",null,"TrollLLM API Keys Management",-1)),e("button",{class:"btn-primary",onClick:U},[v(m(X),{class:"w-5 h-5"}),t[10]||(t[10]=L(" Add New Key ",-1))])]),g.value?(o(),n("div",se,[v(m(D),{class:"w-5 h-5 animate-spin"}),t[12]||(t[12]=L(" Loading keys... ",-1))])):u.value.length>0?(o(),n("div",le,[e("table",oe,[t[13]||(t[13]=e("thead",null,[e("tr",null,[e("th",null,"Name"),e("th",null,"Package"),e("th",null,"Credit/Day"),e("th",null,"Usage Today"),e("th",null,"Max Threads"),e("th",null,"Priority"),e("th",null,"Expires"),e("th",null,"Status"),e("th",null,"Actions")])],-1)),e("tbody",null,[(o(!0),n(R,null,G(u.value,a=>(o(),n("tr",{key:a.id,class:C({inactive:!a.is_active})},[e("td",null,[e("strong",null,i(a.name),1),e("div",ne,i(E(a.api_key)),1)]),e("td",null,[a.package_name?(o(),n("span",re,i(a.package_name),1)):(o(),n("span",ie,"-"))]),e("td",null,[a.credit_per_day?(o(),n("span",de,i(a.credit_per_day.toLocaleString()),1)):(o(),n("span",ue,"Unlimited"))]),e("td",null,[e("div",ce,[e("div",pe,[e("div",{class:C(["usage-bar-fill",{warning:S(a)>80}]),style:H({width:S(a)+"%"})},null,6)]),e("span",_e,[L(i(a.current_usage_today.toLocaleString())+" ",1),a.credit_per_day?(o(),n("span",ve,"/ "+i(a.credit_per_day.toLocaleString()),1)):M("",!0)])])]),e("td",null,[a.max_threads?(o(),n("span",me,i(a.max_threads),1)):(o(),n("span",ye,"-"))]),e("td",null,[e("span",ge,i(a.priority),1)]),e("td",null,[a.end_date?(o(),n("span",{key:0,class:C({"text-danger":a.is_expired})},i(I(a.end_date)),3)):(o(),n("span",fe,"Never"))]),e("td",null,[e("span",{class:C(["status-badge",{"status-active":a.can_use,"status-inactive":!a.is_active,"status-expired":a.is_expired,"status-over-limit":a.is_over_limit}])},i(B(a)),3)]),e("td",he,[e("button",{class:"btn-icon",onClick:V=>F(a),title:"Edit"},[v(m(Z),{class:"w-4 h-4"})],8,be),a.credit_per_day?(o(),n("button",{key:0,class:"btn-icon",onClick:V=>A(a),title:"Reset Usage"},[v(m(D),{class:"w-4 h-4"})],8,we)):M("",!0),e("button",{class:"btn-icon btn-danger",onClick:V=>T(a),title:"Delete"},[v(m(ee),{class:"w-4 h-4"})],8,xe)])],2))),128))])])])):(o(),n("div",ke,[v(m(W),{class:"w-16 h-16 mx-auto"}),t[14]||(t[14]=e("p",null,"No TrollLLM keys configured yet",-1)),e("button",{class:"btn-primary",onClick:U}," Add Your First Key ")])),f.value?(o(),n("div",{key:3,class:"modal-overlay",onClick:$(k,["self"])},[e("div",Ce,[e("div",Me,[e("h2",null,i(h.value?"Edit":"Add New")+" TrollLLM Key",1),e("button",{class:"btn-close",onClick:k},"Ã")]),e("form",{onSubmit:$(N,["prevent"]),class:"modal-form"},[e("div",Le,[t[15]||(t[15]=e("label",null,"Key Name *",-1)),d(e("input",{"onUpdate:modelValue":t[0]||(t[0]=a=>l.value.name=a),type:"text",placeholder:"e.g., Production Key",required:""},null,512),[[c,l.value.name]])]),e("div",Ue,[t[16]||(t[16]=e("label",null,"API Key *",-1)),d(e("input",{"onUpdate:modelValue":t[1]||(t[1]=a=>l.value.api_key=a),type:"text",placeholder:"sk-trollllm-...",required:""},null,512),[[c,l.value.api_key]])]),e("div",Ke,[e("div",Pe,[t[17]||(t[17]=e("label",null,"Package Name",-1)),d(e("input",{"onUpdate:modelValue":t[2]||(t[2]=a=>l.value.package_name=a),type:"text",placeholder:"e.g., Pro, Enterprise"},null,512),[[c,l.value.package_name]])]),e("div",Se,[t[18]||(t[18]=e("label",null,"Priority",-1)),d(e("input",{"onUpdate:modelValue":t[3]||(t[3]=a=>l.value.priority=a),type:"number",placeholder:"0"},null,512),[[c,l.value.priority,void 0,{number:!0}]]),t[19]||(t[19]=e("small",null,"Higher priority keys are used first",-1))])]),e("div",Ve,[e("div",$e,[t[20]||(t[20]=e("label",null,"Credit Per Day",-1)),d(e("input",{"onUpdate:modelValue":t[4]||(t[4]=a=>l.value.credit_per_day=a),type:"number",placeholder:"Leave empty for unlimited"},null,512),[[c,l.value.credit_per_day,void 0,{number:!0}]])]),e("div",De,[t[21]||(t[21]=e("label",null,"Max Threads",-1)),d(e("input",{"onUpdate:modelValue":t[5]||(t[5]=a=>l.value.max_threads=a),type:"number",placeholder:"Concurrent requests limit"},null,512),[[c,l.value.max_threads,void 0,{number:!0}]])])]),e("div",Fe,[e("div",Ne,[t[22]||(t[22]=e("label",null,"Start Date",-1)),d(e("input",{"onUpdate:modelValue":t[6]||(t[6]=a=>l.value.start_date=a),type:"datetime-local"},null,512),[[c,l.value.start_date]])]),e("div",Te,[t[23]||(t[23]=e("label",null,"End Date",-1)),d(e("input",{"onUpdate:modelValue":t[7]||(t[7]=a=>l.value.end_date=a),type:"datetime-local"},null,512),[[c,l.value.end_date]])])]),e("div",Ae,[t[24]||(t[24]=e("label",null,"Notes",-1)),d(e("textarea",{"onUpdate:modelValue":t[8]||(t[8]=a=>l.value.notes=a),rows:"3",placeholder:"Optional notes about this key"},null,512),[[c,l.value.notes]])]),e("div",Ee,[e("label",Ie,[d(e("input",{"onUpdate:modelValue":t[9]||(t[9]=a=>l.value.is_active=a),type:"checkbox"},null,512),[[Y,l.value.is_active]]),t[25]||(t[25]=e("span",null,"Key is active",-1))])]),e("div",Be,[e("button",{type:"button",class:"btn-secondary",onClick:k}," Cancel "),e("button",{type:"submit",class:"btn-primary",disabled:w.value},i(w.value?"Saving...":"Save"),9,qe)])],32)])])):M("",!0)])]),_:1}))}}),Ze=J(ze,[["__scopeId","data-v-cccc6427"]]);export{Ze as default};
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.